From 06678463138996256029693da54b31e3f9df7879 Mon Sep 17 00:00:00 2001 From: ant1019 <ant1019@uab.edu> Date: Thu, 6 Apr 2023 18:39:20 -0500 Subject: [PATCH] Database Updates --- CS_499_backend.py | 4 +- CS_499_database.py | 116 +++++++++++---------- __pycache__/CS_499_backend.cpython-311.pyc | Bin 0 -> 18926 bytes 3 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 __pycache__/CS_499_backend.cpython-311.pyc diff --git a/CS_499_backend.py b/CS_499_backend.py index 8bc535c..5fd6da3 100644 --- a/CS_499_backend.py +++ b/CS_499_backend.py @@ -244,7 +244,7 @@ print( "MAR APP1 water used : ",monthly_water_usg_MAR ) # weather api to get temp from history # Used this to help me understand and gather API.data: https://pypi.org/project/requests/ and https://realpython.com/api-integration-in-python/ -class Temprature_data: +class Temperature_data: def __init__(self,temp_power,temp_cost): self.temp_power=temp_power self.temp_cost=temp_cost @@ -285,7 +285,7 @@ for i in range(0,len(daily_arr)): min_op=sum*60+(d_t+w_t) watts_per_day=(min_op)*3500 ct_per_day=((watts_per_day/1000)*0.12)/100 - App3_History[time_stamp4]=Temprature_data(watts_per_day,ct_per_day) + App3_History[time_stamp4]=Temperature_data(watts_per_day,ct_per_day) time_stamp4+=1 #print(ct_per_day) #print(watts_per_day) diff --git a/CS_499_database.py b/CS_499_database.py index 8077389..caec14b 100644 --- a/CS_499_database.py +++ b/CS_499_database.py @@ -1,18 +1,19 @@ import psycopg2 # import CS_499_backend -from CS_499_backend import Door_Window, Appliance_1, Appliance_with_Water, Temperature_data +from CS_499_backend import Door_Window, Appliance_1, Appliance_with_Water, Temperature_data, Door_Window_History, App1_History, App2_History, App3_History, time_stamp, time_stamp2, time_stamp3, time_stamp4 # create a new database conn = psycopg2.connect(database="Team3DB", user="Team3", password="team3", host="138.26.48.83", port="5432") cur = conn.cursor() -cur.execute("CREATE DATABASE Team3 ") +#cur.execute("CREATE DATABASE Team3 ") conn.close() # create a new table for Door_Window_History conn = psycopg2.connect(database="Team3DB", user="Team3", password="team3", host="138.26.48.83", port="5432") cur = conn.cursor() cur.execute(""" + DROP TABLE IF EXISTS Door_Window_History; CREATE TABLE Door_Window_History ( id SERIAL PRIMARY KEY, day VARCHAR(255), @@ -25,75 +26,74 @@ cur.execute(""" conn.commit() -# insert the data into the Door_Window_History table +#insert the data into the Door_Window_History table for i in Door_Window_History: - cur.execute(""" - INSERT INTO Door_Window_History ( - day, door_status, door_time, window_status, window_time) + for time_stamp, data in Door_Window_History.items(): + cur.execute(""" + INSERT INTO Door_Window_History ( + day, door_status, door_time, window_status, window_time) VALUES (%s, %s, %s, %s, %s); """, ( - Door_Window_History[i].day, Door_Window_History[i].Door_status, Door_Window_History[i].Door_time, - Door_Window_History[i].Window_status, Door_Window_History[i].Window_time + data.day, data.Door_status, data.Door_time, + data.Window_status, data.Window_time )) - conn.commit() # create a new table for App1_History conn = psycopg2.connect(database="Team3DB", user="Team3", password="team3", host="138.26.48.83", port="5432") +cur = conn.cursor() cur.execute(""" - CREATE TABLE App1_History ( - id SERIAL PRIMARY KEY, + DROP TABLE IF EXISTS Appliance_1_History; + CREATE TABLE Appliance_1_History ( + id SERIAL PRIMARY KEY, day VARCHAR(255), - micro_pwr FLOAT, + micro_pwr FLOAT, stove_pwr FLOAT, oven_pwr FLOAT, Lrtv_pwr FLOAT, Brtv_pwr FLOAT, fridge_pwr FLOAT, - lights_pwr FLOAT, micro_ct FLOAT, stove_ct FLOAT, oven_ct FLOAT, Lrtv_ct FLOAT, Brtv_ct FLOAT, - fridge_ct FLOAT, + fridge_ct FLOAT, + lights_pwr FLOAT, lights_ct FLOAT ); """) -conn.commit() - -# insert the data into the App1_History table -for i in App1_History: +for time_stamp2, data in App1_History.items(): cur.execute(""" - INSERT INTO App1_History ( - day, micro_pwr, stove_pwr, oven_pwr, Lrtv_pwr, Brtv_pwr, - fridge_pwr, lights_pwr, micro_ct, stove_ct, oven_ct, Lrtv_ct, - Brtv_ct, fridge_ct, lights_ct - ) + INSERT INTO Appliance_1_History ( + day, micro_pwr, stove_pwr, oven_pwr, Lrtv_pwr, Brtv_pwr, fridge_pwr, + micro_ct, stove_ct, oven_ct, Lrtv_ct, Brtv_ct, fridge_ct, lights_pwr, lights_ct) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s); - """, ( - App1_History[i].day, App1_History[i].micro_pwr, App1_History[i].stove_pwr, - App1_History[i].oven_pwr, App1_History[i].Lrtv_pwr, App1_History[i].Brtv_pwr, - App1_History[i].fridge_pwr, App1_History[i].lights_pwr, App1_History[i].micro_ct, - App1_History[i].stove_ct, App1_History[i].oven_ct, App1_History[i].Lrtv_ct, - App1_History[i].Brtv_ct, App1_History[i].fridge_ct, App1_History[i].lights_ct - )) + """, ( + data.day, data.micro_pwr, data.stove_pwr, data.oven_pwr, data.Lrtv_pwr, data.Brtv_pwr, + data.fridge_pwr, data.micro_ct, data.stove_ct, data.oven_ct, data.Lrtv_ct, data.Brtv_ct, + data.fridge_ct, data.lights_pwr, data.lights_ct + )) +conn.commit() + # create a new table for appliance_with_water conn = psycopg2.connect(database="Team3DB", user="Team3", password="team3", host="138.26.48.83", port="5432") +cur = conn.cursor() cur.execute(""" + DROP TABLE IF EXISTS appliance_with_water; CREATE TABLE appliance_with_water ( - id SERIAL PRIMARY KEY, - day TEXT, - water_heat_pwr FLOAT, - dishwasher_pwr FLOAT, - clothes_wash_pwr FLOAT, - clothes_dry_pwr FLOAT, - bath_fans_pwr FLOAT, - water_heat_ug FLOAT, - bath_water_ug FLOAT, + id SERIAL PRIMARY KEY, + day TEXT, + water_heat_pwr FLOAT, + dishwasher_pwr FLOAT, + clothes_wash_pwr FLOAT, + clothes_dry_pwr FLOAT, + bath_fans_pwr FLOAT, + water_heat_ug FLOAT, + bath_water_ug FLOAT, shower_water_ug FLOAT, dishwasher_ug FLOAT, clothes_wash_ug FLOAT, @@ -105,50 +105,58 @@ cur.execute(""" water_ct FLOAT, bath INT, shower INT - ); + ); """) +conn.commit() # insert data into the App2_History table -for timestamp, data in App2_History.items(): - cur.execute(""" +for time_stamp3, data in App2_History.items(): + cur = conn.cursor() + cur.execute(""" INSERT INTO appliance_with_water ( - day, water_heat_pwr, dishwasher_pwr, clothes_wash_pwr, - clothes_dry_pwr, bath_fans_pwr, water_heat_ug, bath_water_ug, - shower_water_ug, dishwasher_ug, clothes_wash_ug, water_heat_ct, - dishwasher_ct, clothes_wash_ct, clothes_dry_ct, bath_fans_ct, - water_ct, bath, shower - ) + day, water_heat_pwr, dishwasher_pwr, clothes_wash_pwr, + clothes_dry_pwr, bath_fans_pwr, water_heat_ug, bath_water_ug, + shower_water_ug, dishwasher_ug, clothes_wash_ug, water_heat_ct, + dishwasher_ct, clothes_wash_ct, clothes_dry_ct, bath_fans_ct, + water_ct, bath, shower + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s); """, ( data.day, data.Water_Heat_pwr, data.DishWasher_pwr, data.Clothes_Wash_pwr, data.Clothes_dry_pwr, data.bath_fans_pwr, data.Water_Heat_ug, data.Bath_water_ug, data.Shower_water_ug, data.DishWasher_ug, data.Clothes_Wash_ug, data.Water_Heat_ct, data.DishWasher_ct, data.Clothes_Wash_ct, data.Clothes_dry_ct, data.bath_fans_ct, - data.Water_ct, data.bath, data.shower - )) + data.Water_ct, data.bath, data.shower + )) + conn.commit() # create a new table for Temperature_data conn = psycopg2.connect(database="Team3DB", user="Team3", password="team3", host="138.26.48.83", port="5432") +cur = conn.cursor() cur.execute(""" + DROP TABLE IF EXISTS Temperature_data; CREATE TABLE Temperature_data ( id SERIAL PRIMARY KEY, temp_power FLOAT, temp_cost FLOAT ); """) +conn.commit() # insert data into the App3_History Table -for i in App3_Histroy: +for time_stamp4, data in App3_History.items(): + cur = conn.cursor() cur.execute(""" INSERT INTO temperature_data ( - temp_power, temp_cost + temp_power, temp_cost ) VALUES (%s, %s); """, ( - App3_History[i].temp_power, App3_History[i].temp_cost + data.temp_power, data.temp_cost )) + conn.commit() # Commit changes -conn.commit() +#conn.commit() cur.close() conn.close() \ No newline at end of file diff --git a/__pycache__/CS_499_backend.cpython-311.pyc b/__pycache__/CS_499_backend.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e24384d334f3233bef3084999ebbd2c80db25cf GIT binary patch literal 18926 zcmeG@TToj^mRAozFP;+bhXux9Y=c2ygY7sr24igA2!kzSD}vjAFi2Puc8rOmWIS0p z!_0_;B+8UOR6DyFQrQoG%!fZxQ~8*!%E#{1y<7J~bw9SewNqQm&V1lXs&;n1_ME<Y zUdhDCOlBrkx%i&$^XSukyHB5Ux|RGQH&@5N^G;t2`=Fa){u7bdQyQ&&@%svf`G8>= zR<Xp`q*7s1P+VzK(o$tp(Nb;8QZg49R{4NoRUauC<`a0O$Cf?Mu<E~8*mBq`n?}hH z?MJ})B*tcJI+n5Nfo@<KqDgJr%UpkG%awR+b{cQZmPhi~oSRgaXFtd>i}^9dtcKO5 zwy+h*By?<!Orp?LCzH{$2APapOE#M;lPDwwY~ETH!?5{ldWNwTkwUg02{%F?*(8VL zmB$9lkOBfy#P|`k`UGC-Av&Ue393ZT>eg~WlYZmg#@j>(^Ky~Si;3idOm0HYVsTR2 zWO~VS=&{viWO~Y;BOmYTqih%{ywam!HZD;MC<F^AlFdg2e6M`fD_Nbb3Rb=vco|nd zsJQ-%=dV3*--p$&W{q@Ss*~(sUbccJwpccv8ks~1Ym!OqlS!1aWikn~Oro5vkV(|a zBr4e|nS|Wds@WQu#D3SDOpBf^mC4AzrkLF)laPOnnXQ#c$iJqJ-7k}ne@#7mKqevo zng+H}Cb6H?NIQZ(h`Yg7PxeLeCW;>*<|uwBX}2_x+9>rfm1-n)QM{7k2f+&HK4Xti zyoty?K{MNuIua^(h}5%3aeuO{h_jV+uO21`GEk3@h78nZ(wKqTLJnr29wki~sIBBs z25K9ud4<eB)RP0Gfi#kXq=_6NhshDrOj^iM(n{Js0-yIu-0zV}Qbm16Rn%ux1r-}1 zct3{SW`VaI-VS(=!FwFuPUy|Vwtb`kE%3(nGpX!lg39Y&TQ13EEjKC0^Eqh;{mFi% zE7n3rKM|v^K}E(pxd-pm9z6Uk`ee{~dJo>q$vo;W+KELrrZX`a8U1XGo}o{OoYIql zcWw_}&mO$qJ$UDndGtFhur}>C)kydJ2I~3obvh>dj_>9=9U~pG@Az)6QwOX~M|7P& zC!Mly`fjdGCpj+rj_>B$91kitR;dp>Cij7qdYrVUMh^u;>7C?QMtT?N%t$|xQTs_^ z$tZn_bY!HzM2@G^A@e>BdDqLS99tiZQ=WHS0FU1f^ylSVZ_%79IgdV*mL*?=_Ipb} zE{Hv(=j@QTS@+D^&$4G^Uojx-EnQ+TEo(o+Hh+bdbcsPWj||YvV2CXygS0lxc9ToA zHo~4G7in!2#-msqi}_+Q#P%RPb#-myGO6K=QdXJN2-}-M*8~|SRvKd_5ZW%2%WN|p z%OshM=04{sK1D7jpETG$O1(lZC7(yw3zT|QM(w9m8yQH^K+iF@Yh)@zo-$3YWT0Lr zS2Iv=5L*VSom|U6eT58>Vfwuz6pqrbb`S@9k>+SKWQLViWftbIPnIc7kt^gXv5{-! zGU_3tWQ0tU>*NNplUK+r86bln86nq!S9-_=(oZv{{%FS3582XXcmuFkSa=D%bMVf? zy8y2f-bHwC!n*_`FtG!vtFK_l1)4qmJeoa$eL#ec5ElAM&YqT|Ljd^{x+_Mf-=E5J z@4>V0!CTpbcPp7kGYggw*_b>r85!Lhqh}baZx5br58i4rkB*0sIa$BAV=^-OoftjC zcwXIucQ=_w`<zS4uKqnKyNZx`S)YHq>o`vqWMlp7uHyo6%Et5UucI?5`-+f7S^s~# zYqv;l%EtQFUAvoPNj9Euf9;kaJNrlKW1p9uk<>^Z&(0Py(!0pbjP&PaXKY64Q)E6P z{Ux%Pkv=Go5A=(M$XrJ0VdBh4A0bQWbjbZiA@>_g<=EDs2j$|um``KJQ%7K1C+mx^ z#kjWnAgx+_J%*F}GHE~Yv)1_4A7guiyunT+;cr5Fd8YXTh>j0{p0)VHxZXF}%d&C4 z1rm@c0{lDjR%)-Ql5pqwYlx<ACC5pKv#GbA@!L#WK*os=*7gv_^)|deO71yXYw9Q< zCxE;1w6SzT7Mn5_xPjDR#EEyr*f!)6NxUDEACryfi7*T6*o*CLN~P1~$s!x%$CUb` zjV|&w`4MV|F(+r<XW7Zrk<lFPC*&uP6++HI0^}jK!q@gw@>5p2XA6>GhOBE7bgz*h z*-X_)en1}3?C3!>J9@D3&oF!M!22$|TkyUI@B8q602)l}RO<Y}8vOv)ZY|{=$xPk_ zy~&wSh<-GV74Ny<CGW`iAExl%0grBp&Rzr5uSD-X%;Y^;yHvgJku4cNRqqznCEcf( z$@_cCzE3`o@l*TyVB;R0kLUTVcT?v%?zi5{Nbe#aWTZdOZ@rUI`V`s9NPmgEpOJo5 zzLxZhY_K{k+7z)M%-Hf8%=A2!>3FWpG|aFhbNsn7*TGT<)zki5nH#X`3smOVb7kzX zS~saoXC@g|VP%?L*+C;4o<$gYVmG2+n1J#D>^}Sj41WDmJYe9rFD0~6iTYl*+hd<{ zx>)y}+4xT)Adf$Sso?!$kTzadtTXWpomp1`7E{lxs{o7tXtu5f3|rD?Jqs{ul!&s7 zmHAjP+>|A%SjXLH=U$(~x9SzObR<6KG7)p7@z|preH2ArQ?{t~lBGFM4yf~J5NHwL zZ-O4U5NEvj5oY@Q@uk_5)0e%(<DKqy`4-%+yVLVd-*k_)yW_+O`>4mgNM?Q0v)*Pv zfoezUjAQmDaj`8ccSVie?sPeQcKezsX_8uER0DR_0>IBi3QYm^h9**8A5aULvPh{J z(7Z_HK}0KJWKL5C|Gt10%<#u*RPS;u6T4m1+3m}2c6ABs2D|;%s$)swc=AB@W5$CQ z<R0)Xj0b0u0{mX@egOXX->y0<>%cCP4y5+jv?)i-9&)>I?sFzqi5Dx{DZ;v>s%Bzg z)kBHdeI6$=HC9*~57x4+tJrP_=XeJve+LhSJ2=7}{DE!<&0(hkK|KPTo}C&5=z({d z0epSq>|R+}ayneI#NIYr02*RX+&CjZ`GEQJ80UI6m?}N(VmIqKfW<e&x)w0}YWl3} z07Ki8Fg;*sgc4=|3|B|Oask6BldwF%aAG7(0~oHVgyjQ<vq>M^C?4#+DW6)ps9ko> zdffJvJ04N%^|@~oTGc?sCDjH!zS~mmT&$*>gGHQ=N=of#eWFHc4z(QG8Y{FhR%lzO zXroP`s#|i-FZjGt*U|c{uc^R;A0lnT!&p0l0GHW=o5FJxK`Vkz1Z@Z`2-*>JAUKBL zID#$!UR+>l<0hbF^*AkSrX*vCZ$j+Pi?<4iO&HyL(W0aVwqkB1wJ56tV!n)6Tm?i! zB(;cYi8he1Kwcn^ZmD4p4%vg=HED}BA&LNJC2fo5XVva9=|F0at(;*n!JQ(g?O@8a zg9fs55CP8K&VK=LUV^>0!y@`C1n35Kx)Gp)9h}jf9sthAAm{ua6#frHi?N2Qv4fu6 zIS3xX`A?wV83qUAT!&4y^FDHc&g`IhJO5k7F!N7pe)zkwC%-zgwz>ZsJ!bR7$VB&` zxqEc9&D?*{Ix#YS)!a8SZtm<fn|r&jTFvHfq<6nrx3dq2YDR!RqOF~<o14vv*F5UJ zLp<hHFJaAdZjYHbW*5xh|9lJPBq?m6TPwNba7jbF<M8>sQlpdRwUWN`=Q7fVy2mro zyAs`_Vsnq%>wB>g6vsy}8*c*xD2@*xl^pLsnf$d~Y|^f}<Mb`qryM@wnMIS1J#k-K z0Os>&^R?(*6TTMxX~Nf{KTY^r^rs15i~dv_8`?Vh(}b@@51R0`=*<(pwg52PO7vMr z&l~r()VE`Zm3W1~i^rPvBESmcJR@MZHR+S^(MHKf=h4Zt_Y;SYdds|Cr*~n>;awme ziWl@OxqS=73zO_!pp^U=h4tK}gxn+*tMg)Rk_JHI;#2|hlf=PQCyN7`Dh`Ca<nB;@ z#sNz{=Wt2h-H<?$c@CL(&>rmAw{-zGQ-Yw8`UXigwiC0xRG`U}6d1-~qC8dv69_IN zxQ<{F0eT_ND+s0#TtRRZfepbm1k(s^AaEd<L4Y>yMGH-Yi9{_aU{ogpM#8k?kt2Xw zeg+^BIjRm}zE&BDl{GDhS4XOkU|AK<=VE!?SJ7j7V)7LYsHZ%xC)Pe1oQg^y0BIwp z3Mlje_}e4MjKaV@2;Rca*iSzrmI>~vjaikuOgfN)47S<<zs~I7&fdX^+`+v!|F8do z&u`Dnx6|i$XPjGL`A!XNMdz2W_nl8*bIt#L4C6ud*?IH7x$QZ>`S8qI@EdyXL|CxM z!@{2y71mD4eDDRw(vsU1_32+L5X7Q~JP;()<Bpi_l~~~T+Mc*zf-J8P59Zs%&N_UK zSzM&p6ZgV(K-t?1C;XC9)cHWEeFb-}sHJs`7ELN?kKP1bo+SWY><Ttf((Wmj4=28J z{(ue8Y+&bnoy5oqO*{zx7ZvQM3gR}aRAOS34kVk!R%^dr@cCA}CyyR=cxD%zw@I^O z#o6LsA+F|S;v?>sS@-hM+ifxKnI(tM>04#V>Gt-PW0nRm066?1-rRM(rK`084woJu zPBb}fX|=RBx3<B*1~~gA)7qQcEDa0pRnOAh(>Q&x^|35B;AwQt?INeUmx;$Y>o{QP z>sf$u-rbNaxe7<f({qjm4{^co2R<=d(kA953t5(ThTs!-Fw*>~`)T6*(CD9cKkeXu z*tGWZZ??_<f~_EnD}o$q)#15oo^bmdOJ+3owW2;UBc~M%p%EoZ8B<$AaPxWBjHyi} zVqtPyN^1I<nC)@E70R-xUdC9c@sL|^y!LrT^`h7960=;Z%W$Khbgj_CyQrBO86TKB ze||vJ4qqO!W6dh6StkTjW71uNz26CkHP2nx#$arC9kRS4W<gK$L{vCM#iE#l-8x-x zN@MXJ2X}*4)Zd}kITRBOl(Fn|t@?;p%!{&Oc-D#sT0i$Pg`Q(X0|e5x_*nFbu~<ZU zPXMFQ4&m|ij^j2Fv#fYL71bkfG!=6PowuE?dArB$UY?i~wdV*Mt!7I{Nl{N{&`yu1 zF@&B_MV-XKLu#y!=hRpokE)_UlEK>w7)2Btqz6_}*8{5`RV>vdy;@4AYNaaGDpjdc zJr#)Rl#u9P3zzZmuyogshSg@j)IBT~#Yoi2N;H`mB=BisNRx>{97z)cng`F3fAZ;? zCJS^WEtyubUChT+6S6y+t$J2nVo}eMZ^26`c1%x^rpBBQu7YT$C+ZRzqG(7?4@G^f zEhLX(VY22sm`{r8S>jw0HMISL8>~0l8tagx#`{HF+wb;CS*Ms6uiDWF#oPpr7b7X3 zfP{F$jh}`2HO)YynQdP@?M-Nb{YR7b*gOCpPok-gSszVFMFSl=RRJ<+!;l(NpF_<P zkUm1-yCeo$OX_M{GT4qpD~{O{ohkdOcb<x-*owuTZc-90L+dn4v)I!uO`>IJjRq*o z$!R7|b8=aFPc!>WNj-*dQ8f<}V(<{}3Z!Dh-aUFzRQt%QaD2dIN6cDsJ6Nx%TXA@R zi@{OUOQF)fvbwY+YSBANRrE*gnXI@&)H^&L$6dP@t_{I*Scen#Dv(6g5;zeRYxjw& zI{-ASb8Zf9cW0wDmduJd;G^v>7>^1nqRI;(8{8y#Q85?R0&l=zS@9}VhXaY$jj`pz z5!-=*KA|LqC^bfUnlP?SCSjzf3FE3|62>KpXL7RJs6T36lCG9t_WTwW0kU|;`|}cp z*;OeNirs8Rk>}6FzX+rE)4vFl@27uBlp>Ca{@cyYQNR^*I(UY(FB1$CqZ?On+A;X& z*F<y%Kb&jIg1wu4TYVg3e5yD2brEe|pg3?VSk7xJ1uYy{ausD1_`4&yMS;t~w&2)9 z+lFnIF=PP)KmbQ<$PL_j`&i&uq`Way@~CE8xozRgTZHnKz@->Tv0clT9}&ur1O@^F zPxq3m<I9_c^5(!mq_j3%xA|IloG)z*7~sY}JoDkc?IOPXa3C*o=-Bq*#|uwx{qp8# zCqG~3t}k$lukwfP3Wx4;n##~6Ueg%S6a^g*^8>noZnqqVTgB+AcNvAkr<5RklUnOP zAE@OF`@#yrP$w7~xW<!D+Jwf_LgPj5(sk~JUAXj$aA}ddd4HE-&MLc=Uoy;+;+#~B zf+A*2$znm2b4VOh&P#<?`HW$*e24%9fdo_+Dj=;+2hWi9WrESb<P`-b9!_pd`VA37 zu3sO?(fG5|mT14C{22ovZHel#fB_(&h-mVH^$+s`*%7@VF!pwPpgmGjADr8Ag~zv* ze92*<<Z$3(q{tj>*lGzEh0pOtjY3gl;C!TTU$A7WCaerw_`(LEup!VJsW=#Fc+|3O z+_v%+Z9+v`U?`@`x^3i3nuU^P&}FO*9^ZO7TnCG1JSZ3s2KoYhPygb5f@zlQ3wbuD z!yUY-F`$nWSA;B^S3<tc5kO33p`y(Tp@~fxCvU6|=prUCINnqrp5={Ah*pPYHV4D| zdE)`VN~%KRo6fLt(+<W6$c@nCqZ`}Z+YY|ERj6*|OIiblr^V*5i7!47_VK2}Fhj;x zXqbs+s=+~oC!nM4cD|@30DJL;NF{afEhUZH&`a~Smp579Ly~EaRlKPkX!S?K1CKRN z3V*48GVr;co4CQ*o!p`i4DmLYFBCn>5iCaGf4zg^nv!5Kr*vbnqP&a6nzBa)MXzcE zi&51z71;EFX%*Nsz<?omjn~vhG{)d9UQ-s(Kh!@vuK;`7?N=~H6UP)r5Eey>j2Y`s znJj-6=*_u?TSYOATLmCc07kUMyNp&b1wA4J+s@Gh>fT)SuSPT#p{4D%M{c2}^U0CV zZhd-GIBDf;tlZ=bH_Hl>M3{8(H7@SfYux?UL8V7QH?2o;3A@>M2|E~4Ud6(uyoQ|) zDQVwBFa;<<Ct^WKH|?tOHcBig??}ZtoPmAkq*)ooVoWuT^U<raO2rK-L811Bii2Mo zHRYk{?b=6nq59Yp!)Ifk<_le;eDx@2wR5jH1nZ1oUF545x#hdu+C5=;9hA8g=W!%8 z=W&qz$_XqkD<^RX{mLn+uu};;vSySnEZoW!WX&jVNyR-XaSvJdm6vd=1FAtB<bCCk zRN(9~H56*6V65dh$whDa{Jx+fXn7|qnDzZ+(>eckC;R(J{`MyM|EQPYa(Z~CS73TM zrZ<9ahs)W=nJqliAut^r)A2QF=Xj<^V0t*FC)%)v+t<o77J;#FjO9gXyM|%~WLW9o z8PdK?Fj~^`0C|?ytSEiP001{>stfjQ4TsypV-WEKQ=@+*QhFeGd+UDKv8~`s4+*7* zICY6EnLCsP?Eyfh5Kj=Ip<fZM<qPYD!g>h((V$)%?&ggRg0X=H^%s(ZKx`@rvYVY4 z4ogGXn^z%*no79RCf?Kp(W;^{G{RRL1{Va9MU_F*R(a@TnEmh!UwBw3JRHzOj8(yo ztrOr$>-p*y-gs0n9tB;c=AduuZn$!Lg0F4kOD#gFC6M>jhzX#vA$*@V9)rMIY7Q4} z-V5Y`>avFL3}1Q>l$5jtaw8Q@+jV@!k?k42y!CNCUv@l@AE|5xw6gUvFghO3^5rMs zzYmFk%s5|h^f4r#?T;t;vJ)U!2Km5;IpLzsbx3kb8Uwkg{{V#a(xz<)(MKN}`Qi@D zTMt68E^prU@n!9gt$b-0WUm#6Km_yw<Je;_Uv?7oWs)ncPtymz6z>bIV}3Efn>x9! zi@fO~Ora6d2i~|JCdF7CdKI#+fbMC17gyi)r0lcWPb)vW&RHQqdLay~Dta*}oL7!x zVTI@i#dSzrp@_%5J`5NaAh@B3%8tb=Di;=R)qN~pR}HD57*^Y`xTYpp%&8Z#xT(IS zhR|}rqlTRgFez0SgESN~h06-Cx7{nLnL<e^#}udJ3(up(at9j*IRy>l0HJGuG<Ps4 z9Kb@Dk~@@#2Db|zjR;jIo(z6o`00r7(pA3dDmT5rITwZLo5J)xzUm&Rd0jDp+6I+F z7))PR3`@mz?5_Gcvh2#6SS%@*k!6P%Op7~I;tsObl+j7-$8fu*yeJiu7<H>D)K1c< z3mHu`Lpb$h`t#aP?ZWA6eDyW%2An&Vgd5Akjr)8x9zf11hf(o}auho|ryP?C{8FaI zfh-o104Q!LJ;-8}Ua9D&k)A?rx0IDshYj0f|Bx@3Pk(0keC*fx!dW|SwsSKs&b=bc z+!AJ9=gqHwMW3~_XRSlY!7p;@xx@F9{jE<nW|!Yv^tWTtf5W*$G{-p4GkpRBw>N!> z4CWZmbP7x-$8^3ZZP%c}3yE~_3~65`7<o)VRp8Z)b?^$+v*=L@SafLs;esN^DCCs+ z)e(Jhpkw1?kmdE2g1!>2l=8|#WkOyZTwmylxsnD!*XY;oYSMBVU0I-Rqa{=hR}DH4 zYM?^8e0m*a3>t%1H*2<Pc&%B`nlWiIQUJbPof~jG81xTD;M%8K(9{T;gZ`cbatM(8 z0)M{*qIX!<pcOi5dsM|2HweWI;ahz1K|Z%h$ZgtXva{+bfLy4cJXE`72#tkqeP|U5 zY6CeDLvhftF&HY`7zwB%`n+K2+ouDkBPHdb3!BS<{v=9uScQ~7K(y8s1rPGtiqLSV z@6qsf8zd4{twL2RuW9x7Jk{p~JP(ft+k@WCPM9%&U&L4*>ey`d4@C+wpcn3k1fT%# z2=ZI}mm)PSTusaNYfo%^O}|jn?;i|S^6Kh{IzL$W#;||DKd@WC6qmqlUZk{)V@e{X z;>`8044+!XDLj9lN(r7dv5;|+*PP@uH8{)Bz;&G09EXdy3_;*)G|He)BX9nPs8#o5 zNa&CAOqalPaZFdj^k0aUDWOk09YB)*0yNkg8W+Z6g&RXJK%fAWMwDH_Rkm<P&+?UL zx$beka-3(Z0%PSE>kIPBxbh=h^UHks%iNh!zI>Et#sp@JW5%NGE4eBQ*M6R_I?wf8 s;j6Cj%vFK8$}v}8kYCPKv~q1dd_@n}JIPl}^30ULOmVS)^q2qt2V3r{@Bjb+ literal 0 HcmV?d00001 -- GitLab