From e64f1c1b855c6258d08bcc3bff2da4c966da9337 Mon Sep 17 00:00:00 2001 From: "Adrian A. Baumann" Date: Fri, 3 Jul 2026 20:43:46 +0200 Subject: [PATCH] Framework updated --- data/logo.png | Bin 0 -> 40774 bytes platformio.ini | 25 ++++++++++ src/main.cpp | 121 ++++++++++++++++++++++++++++++++++--------------- 3 files changed, 109 insertions(+), 37 deletions(-) create mode 100644 data/logo.png diff --git a/data/logo.png b/data/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5d18f7deb77d289912b5793934a8d4032e06c93f GIT binary patch literal 40774 zcmbSTWmlYAvkVCd?(XjH4#C~s-Q696y9Wsx90rHr?(XjH?hf}k?@zcNfMKm+)}HR# zUENhZL@3CK!$D(1fBEtSPEtZd3HUkm-xuT$;CqEeW%idZIdGC9f+`-FXYZz&I;sm- zaG!C%)xF)h>9c}Ke@Z|i27*gFK+$)*UUmO)$Fy;9cgNHTYE1$U|A|aXw6LM;XVOj( zJ6C#=-F$KAn|=Jp`l9@eTh-NN^rrq{rTWK07q-SXYXi9Q0Ji_nFINoU` zBGp7n{dj*J#xl>OAN|yz{=9Ij3}Bl&bT~Fm9g5ElDy*fZ>J39kKq3j1>KyPo-s}_< zi^U}p4u$<48QBz#)ta*AH7aWzZUXnV2`10`+*B@Lnb)_gh{amc8I8}U1S+E`ENW45 zTXOVXHi{}mju9)!&6OL7#Up!v<&a=SPpN2FQQAnqKfo5!{Pvl3wV$d#WXIx`WFji` z!nQDaG)>~Wx9L6DCK2)MeV)7K8tE8D6ub3}3GS0C{E5=VpoRZc| zU*n`pY$T~}-m2sFY|3nL^|Q3J^tWPu=;%;FFIhtPNLRr7{s_%yOQ^&`*QZ_6VRozO zS`$;E#DK|Bb@vRbQLFq0|Er(+@z}gA->t!tcvJ2+f@#nwEw579OpH7X+>GW$_h0W*T}V) zXucs<=SIuT({5Z;I1rpYoW2p{d*;lcy^pCB;AS|AFf}MrP-Kq4OtS^E#yi;uTDq=!nH{ zR1%HNCIkY}6zCfVWqKay7kJ(i5EC06w2-c@(;JzJ_9e;-ylXV@Y$+HndE~m4CFd@k{*&w~h`mAYcWsc=C+ZXtA~Fx_?)uLctb>oc65)r0>|L|3L`2DkF>f{>`BZ3tgQMejlDSxUP4KN~*e4uJ>%r zRw_xb_^dzkrmJN#IR&$QAF$N3n8{MDl7xzsMPz_?ITGW(PV=q!f{-;f@kCO2f5y5p zDHdJ42LM%rNdT_<0asonkEjJM)o#%_aUAb``O>o;5|sr1I{mXtSbhi=SM%w_s%c;N zHgc4x$x<~Dv(uhKX=P=6Xec+=>lw=;;xP7+cGJhpDR4y${{!~ZRW5U$Wg2OcBNnH_ zFCDLAvYF-SlO@<=x8cGSkv>EuZN04fSet*l_(J_(4EwyCj!Mmkfpk$46T4NaI<1$H zEw*bFOwkh;`8@2W*1iXX!2}IJ!u6W2=s^q(=J*{XCJ-%Os4>-@6B`ZRn0Aij$a86) z;GF0*UO{3po5c6+B4G*mowHdjVm~eRmQ{7o;>iCw6YGW;I+~URE<0U>h>qDrCKU`i zt%E~je4>qdokXs-h=^ZWr@{lzHLT&2hhZ1yA8um-&(|zX_-&2##8W*wu_DzmnW(fs zYE%WhRyEmKvJbFM{0HRigMo$oJY(i(V)$2#XLti(C~AEjs2 zy>7@cp@lUyf?_dti68Gcr1)_o6Rl^Y`o8!5|EoBgJ#jFHqupV+w8_bmrBzi4K$#ip z3W!0D5;vJ0XHQnw_ay6@U+o*?auc&2rRF-E>69`$`yte8fz`0==Cmjr*Ambjz1ONP zNi=_kES~Ta_K_h+i!Q{aE_|=B-L+81skcIj%aJA5F6~a+pQZWbC4+SR*sG~lH&NO> zJe zP5OZJ#B-n`t{)&DSpk@tHyv((|{b zcGb{7(Z1t-0P1Of70;D=eFr5pf&Sekyr3}HA@i0l@l=b<$TdnrY$NSH)TZH4uxG12 zqzJ0^GUtQV`EbIKG&~{2#yul^8}V{c-}mAmpdU!Po>+`kqTl-oUcL1p-u|pSzn(Cq z_0}h>-=Xf5on)#Y)qI+a{YWGvLhj{Ee_nl4yO#fwN|!biH)9t-bcC71!t6 zZ9$EHkct|)DZtCjE=LBEq{g)iTKRh&uNRuaq}G2?^*o1ttBr$Kh=ff2m#_ck@0Hmf zHhl#BHu)+Uzv*|IeAY5LfgC3e5LG(>#Yg8>w-rzE=d(JXJbm6*8+7w>?M(?609UQP zUbVxW8XImjMca;uz(+xbdd#g7ovJ`YWDh8MiSKcInwY#|M*>>xtGhovjTdNU!xRLmt_xTc2^JEeuy~{-;<52k>g{i%`V$($q@RsF zs_ME_?+~m~qM}0S>7m2bhCyV=P{T*{I<6zS`3a|X_wz}W4{FV4FByeaGb*`W;dePr z5o=D9zD9d3qNEJZb5=lMKw()`%fn74cBM+dw3J`BqRN&|)xBIL;)9xWfg;PXa$E2D zer#c%0#ntlh-|!w0s1jAMdudZiti;8ZIc?FM)q!Ht4Vg4H{RjvP#`-m&!N-mAmIYDnOpdOwvAQcI@dd z|LAb7Q)ykV(d>pqHT1aYOY)lK0AlpP%XJI4;Rh(=F(^*Q-DO3wRYv?go##;d50kMv z0M5!r>)^Xnbqc7()%$1joN}VypK2O+vqD^V|7D+;$kml?W{y?o2hdudgtQj+2gafvc%Rf|}nLSou0RM$^|nsr0P7K7{^7*;HP6ZLz)HxI+w zQ%*d0Q@-qvH_!HzBA3e~1WphNiv?f+{;^%RILGY-oA}v2sH_UO{0MHKV9t{{#E5=k zp!`ZS@5b`h zZzj2BC3mYHIL*%+VTJLdEhi>XsB47A=H6vGF4Nyvxy%`CP|cHqUAQZ(stNCM-6qU{>}8 zX<&lMa^Fzw02m2CZ6{m`?S~}1z#C&}iG+l$ZhbT^o6rx~BZ?Xgk%kQ~8qd%7M<3Ub z>25q%tB1_y+FK%VnET$~bivwLLGh8r%?Y==d!gcdInz}i?cONK-zdWZ;zxRIiu}31 z@lVe^$u741Z`9@fWxsO%SGvy7k(4(+wn&yu9^ZpUK7@>ua6b-N_7?SVQyX%Kw#$d3c-jD6|X3&CM&e1H>8+VcI@)odF^oB(49wXS#x4!IbcGZ zxAItEhqz#?sw$!)BB6?cfuTAIpdmtt2hRw?8O0)VGMElZ<-SqzQGgl`e@-4guy;2= z5({xE3KFf4+dc{mBtP;A-h$My#n~MX1Ye!j1iewD)f6QfgCMs}=(6x^*F0wF);tgK z3Y6CGP8WX}V*dO0Z)R?;?~i$Qe{LB5gMNteCtH^1bw9@52u;=A>t$ztOG~5#sg$-h zO=O-^*Vs3%!*UiZUK32UN|avK2=X#PTKvyf0CuD6v>$Hp3Ekhg?x((S?GAk_wJynx zKlusHDl3laUJYJ=@ta=glJYaIn~eE)?edfO(RmhnDx-I6d1??@SSGtxQA80{Fmm$S z%c)ak+ac41-+`!wUjGY@+*WO8X3xZ`>^JB=C9J#z$lx6SLN*hfSHv5hueOQ9;Hs*s zF0QWA^Yh~i+V;I|@;oudvE0b22nq7_xu-<`EXc;o)SSk35gcxJCzUjs)2DG{wpKbb z`|NmZ5E2jKOlhiV`}b?ujaCCVT4n@~LwI(XT*6doDp$zp4X2F-m_rr+B48L8U7kQ zF;4LA5X$j6kw<{Ip_l2!&m+~Rmp8`XIM#dGA2+1kK^ZSC+|VIkD=I30xir0Ql0WPl z0`HMOUG{sG%~QFi{fH=reqZKt9WXDGA;(TFZ2X`c!FNde0}ekj`Lu^smUx)D zkI`f6_^|oz;q}>en;7}qi}MJWx5Ko)oZ<0hr^DO(B9xL5zgtgT4%&STxD&JUlEVTG{s7pXQ8^-yRAa8N`sQmDkLU4t-mESko zK4^+aQ!a3_v(>hO%Bnx$u!kmiYzBw@`I9AB2mWB_j;u3u#;j)*Vtgp+uyK}7CHS(qE`5>W?%f0A_*?*Q{ zznxA>@72;&ZUN$teKCHx!1D6QARmsxdAL8ddVWDWD2pWHggiwi5PP?dp=0k2 z$L?_5o&Srh>E*iH-j1@oNtUB=(^1cD^TEpLkm)TfF6S>mQ9_C8S3n(n_)=}VDoCB6 zw4;DJhb-jKNkWP0PZJqv%QM74Z2G1HweoaP*XP^$yM1^?gsQuQ zpKUt&y{qY+<%-B6OrJrdrU+KT`#$EZZ?fOUabrFuGrCpJ}@Hfh8FISeBn0Kz-Xco?s@ZPCjB&T)Tqg+O>e~D=R zwEK~(7rPJU`h9knCOrlBO-}{+OTMYLV9CCZe80@IpLuX>s`+0pS{b$-(qd!bZC1q= zU0C_{h^x*CbLd2E2bJ?35~llA+ z!`+ke{^m8Mr#{U{s;V5ai&7zjytBYnXjE0fz9V(B%0>$XD3Hqd>eAU(ob%pY_0nqn zOY3~wXRT~L;6AgVLEwF7PF;US?4;8WF`b3{a5|Ea<9hp&n2d(1bpF>Wc$dxPU!&9R zc%#E&mOGGoV6uIjudFd1blmVftb5#eeXHtf|9lebxSd#aS~g9+em=}m)Yg{f#V@X? zKpRCjo8XOip5z~Wl>1X8N~#&5OX={b%-}G5{#a-8Aw&&Qmpx3KwQwW~FF*{Yf)>>77O)T1iLW{e;^t zvQEW)<%9^BL05@cA;W=7)>0rt4!2CbdeVH?Q5Mr@s7U=f^BTML>cX4Ies5xhx-0Bm+g;8q={o| zmfRSbE~LhTF}-6hKPe~HxayVx5?prZmBf84Hf}!L@Yd`w3i-6F2{B=oq%3HKEak>s zj&g0vY_dRV8mihV(aBCY*NNV8a{JUvb?6&VuCZ}c&HvlF=$jq5Baw=1%)13knZW9H z-40gIU=bHCZLwA2_(vvPhCHaqk}@*TFuk13ixog8f`9uCH1jd*rr$f)`wJVg(sv=r zj+YZ_`nC@>V1A|#&OfU=w9|3vQ7o@};1oX}DF|0p3+U=a5a_O7)E%Add;_3|mtIuk zb#Da%fw+zfk~m+_oIj1PuLNoh8`s^+biCK=%k}CLUtWIvw6L?wt@-@&;d3*L>wm@+ zOza5Ai@^QHFEiYa+}H7&#any0i;5p%v<$k|c{wy*_6)N$I2pX`vlm~3%jdxWa;V_%vu7#3=slbZK&39|5te&+-pdj5dL}rzAcfaKp71xp|9aQ zNwG|4<=}AM4#7y2D}DxqZLWi({HEs=ZD4XE-WdjmnBWc1uxkm3VPA_+)$@WPSq%VL zX{1DeD37kKv@+D4$FmR|catU+HR{uujK!R$bK>@Y`MN>$ldsOp(q@0*8&KExn*e%) zu~&jNc~w)i2$8_pSU1>NlS#gZoxs~ky;p?SV=n&SrSn$|O7c z2)^7PONnkeE#Fza@q$x(I?+1C>VzsUaLWqqu$Lfy1LWhj7h#jdVv6u##oAua_g+aI_$!7;B2S-6l+-BU>OQ@^EUE1c zK}T0nuC?9+;NaQ#89IgTH3)4qb#`S%%G(Hkf!Hw3wyWq?+M+EmG zR&K2>J2!2m<9MErKN2FFKH?QQFCSA>U$mSOi>3R}3;)Z5rp*w~@dyQG-cYhA3`KqY zFp%Xx*2bx+Dgufu59Hz;zX5-6yOYn0AG{As`A+ky>Q1lcjWbob1fX<-eNZwmYz!r< zXZP0lbEiwN%2l?0=R+k{TkeV!_}CiZxjal6%npo|Be(CsO3ijbUA1rhzVzc+g(tlz zuQc6Wn8y(;S%y5!c2z}9H9@Wz>bNEUCXM|5-gWQR6KL0DL`}&;6$!CpjMB-0o)hR= zzUm^>43lS6ue;4I+a$?aVDm3I;;X2A!-h}vCj12@1~$rCV+&IkFG}$>7ZP6a7YiJ< zLDS?_HpyR#Zu*}@=g4hRu1dv~W`sw*SrfTUkFD3pEb{K|7<3hQWBQCa0IYtyZ+ho6 zJ0JY|8uSA`4+Q!lsz|watD>&1sHrIkYRxe04NV+1Ws*%&pp+p`B14WylrtYXtR>w| z4qx&pimN8- zoDzhndvBO+-T{?)JSB)%(?tyoh}AaJ9%g#8YujlcE zS~hLF9e4?MaX;%`=8v|lZzOPrpuKps-oJrRv&JY`8uCZn^ff*-Az!ZPRBWMrk7YeUxgaV zk~C<)=0fv-zA4jpJR$SH90^m?&`6LX|Eq5_)^6A>Mm*evVjA zP_xYhX*7i{9|Vd78WD2)e_%Wp|4=gQxkE%m;o=9!3aV|USm$FrJ+he>>%IrOz_F$O zq}|?lCD_Vzo*>DYWHRXbGV=#;sj_8^jRk-}8n3LZVDfq}(x_LMT(&ZcZEo0&`Qny8yVVc@KfWY4d^qNruf7<-YN_gEx3u|lOLF}x&Ko(#-mQG&R%j-XlPD-16{()e8 zU9~^j>=bCh&#S0N_TU|kpvWGg^5>7x;1%p>MUzFy9RvYxwNho%y`G)-iRaOoQ7;va z({t%y&HEi)*GST&8J^v7ND|eLp*~~Voh8C;k<813G4p(?42Pj^2$VPq&)pb~l5&^1 z(8@|VU~*2cG{*d%^6>!yB!}j4!8h(f<;kn@#yTJm1|tJFHT~$?Or|5Kl`SVy59{6xMfQzJ0{j@dE?~O@v8JEj;P2wr zJqIhw?d*&<-yind8#lLrVRL(Rc{5S2aM@)xhU@04ciHU4x6}`7#`5U2X_JB9VbX5T z)#p?xm|$lmL!gA>To}4*X^DqPHK6189-%STeK@2K-X;3Cz~1)bzj59l2}`KW$6wls z&9e$!Yo#!}#?Vx@q!(xVL4Pj+f$~~gGg4C29+r#|09&`2zhCp-zhm!{hx4NkCGD~I z5f+O%*o9lz*_oyFvIFC??H2wp)0rMgcgVF7skB6Jx@YaWt5;^@71FNtRM3is=4qA8 z{CZpYu^LDbWdRSlkL|QWO%E7hlYoti=o;ez zr!}ZSAQ5rZ^C{ZSXF0J&{+|K3-fzP)e`>K11n$0ADE35nEy~)op5Gdg2Uc4CE!k_) z#%g@P)bl@AW#9Cn?tFis*;Yscdw*5dR6H)~=e)c0$=#D?+`=5Azh%)}dy1+&#yo~K z;~x)rJ?lQ4TBtQv=EG;WbfI=A;RdTTb-TA|m6~_+m&a6%$kf;bV zv-`s$GW4laUqaX@aPvq3i!DVmiF_Ck(tb-OEu_{MFCy!zn*xSwiV#1YS*0v==>fi} z&zMa{oluo`a`;~VQ2i*-Ruht>i%BTYLV7;@p(u!VZ4l6SddF}&u`G@>+yhn)l%S8z zm}<`x<+)C0>vU;EMfT>DQNe4n(ba8<#iLBP$4dw z=IiwU{hy9{omNl)(@O^|KCgt_$E{@TdBd#9)mFevtyi-|Zr#$SO&R90nt$}WlXyV$ zHNSJ|JaGs-;8BiNbtayh;giE+(!pZWz2dsIjpYbz>VB+URGOeN-B>n1AK?6NLBZj# za)8;?RzU4mShKGfsV}*pp8qZ!>i3&x+;0$Y2QiC!#*cgtJ!Aij%#{16Uu%q1c_^~I zp|o+GcrQC&kx(dN4wJp@wsJE*q-Mjx_LM8+7D|hnLvx!vB?B>5(FNd0;ujQC{%r44 zBuk-FD18hP_%r&5pggX*QnZ|SG^(i56cz1~6KJ7>iclmMZU;{786AVhJ?^Fln|7+y z89i@Mi)`z;h=7Y)WoDv`qOR)(7WqdM;n>b)O>EIsL`6kaxSTdWBXmkZJ!HvKD3`H; z(jqd3m>jfIZV??UyymlxcGMzQY0Wk~0?nSz8lda8o(z=nAQ<|#c-w}J6s}D_@q#?0 zD`YY>`S>rfk5oC5vr`KFy^ous#0drY?RcX1Mr3l>ksdRo@#;S&oN=Lav7Z^ROyogP zC^<~BQ9huM7

?4uZC1h^kK-z~|ll)7jZK0D(JR=-(QU2{vuQ_UuBF#wEvnjEe8I z<)?4s>gslL@k;R4+12-HK4lL6pGfJVOOY&B*FRT!N5Gk;140v>pB6&8@H&%ZUwf3W zYkf5YB|=rUT*>hJJqWsO_*p}j!bg{v$(8Qc{eAk(REg0`lP2t6eb2w^P;%lj-s1HIHGMPaB0&!Jt#E;FmT zGM^eyg9+Kkp0~x}xf}%Gd9Mf$d|t6|Z2y6IUpf;4!Zn&#d8h(uv}rn+*!GfKOJ&04 zh0)C3cr&0>YSeq7m8zu9nl)DGDH%U|Jbc+FAb70PMg6YpK2OgwnfrPv!Y19Dlv^9okp_ zh{`+tcIbA<=i1`$YM_x0{yX&*gdhXG`=0@*nc^- zHvq((!ovC_2j&RN^Z>yxA`172W(`5Rv3x1_6mmw(1pb`1swx~o%aZqxGk4OVOL&Wk zy8(t_O09k0%zZnB_~*qsTcqsT?tJ*Yw$K5;4CTP@mW~I{2Q|m<8qSLq3ebd6bgejy$f5?E?fruz$LovnMt2)^Cy$B(L|sQ%deGu_Q_En$gjJ{} z;=#?BB>1xpb$vRMgl6W~L-IhGej^com-Je)`di#wGgi6ggt%Fs!c zSWbf+ktzbEQ6x#4vK71=OO)mGH82uqkczt)^|zCx67Iy$)l7NCzT)1$VKhxY$Do+g zQD-V_xIOtcJa72nH=NB2+JhPeUVqHROP6z&vbL9uep)?oAW9evp?&WoqzKei?Tyv8 z52eGp`2*WhnOd<1GZgkkoT0Y*%h!}9wJSc&4NHID;PZrpsWvaRBntb!gADuFg5RQAaXG3KqBZfck;xg8cmTN!?i$HbxJno9+6- z;zk(6LJN$PanS^W%m(Xpv7$N@Q5Y8AvT;RXrYW5{m&Iw1h%{d~UpYd`r%arhZa0$2 zpY*Ass+pX^&HC%j8{VPC#GJykk-zmYSUaR$cK=FV3`nbl_~icN&N3aua}$A~V3HkO z?B>fLNwnE|ShYJitD7{9Dpg*#d(9du=AkOc;Ch-84j)AEdD_rEnhwsXIBk~pUB;k= zE1>)(D((&Q$0c2bI;bdw3iSrFNRU3YxV0<_IjdSmw(dLasHa_SyeJfz$HB7svf0W) zbWRh|awYtj4h68tib*0KX9jdahlLn9Budi=v#gQExs;gCU+3??E!(Z0TUuKW*2>_1 z+kBWW-+Fpr913zSKrN=^ROi3E@f35+W0e)|D^j5RT{-D)uYy+C_Uil9SDf(T=lve| z&e2>$56&h)av z5u?2~?LK5QKeXTgdy5vh|HFN``jI>WHFDGfY32_rTRj^q91g78gd-%S0rq!dG`O~> zp1L)sRXo5(qWyt@Kg4C8`BPjSn`Sd4@0e06c#yz5^FMI~xF=Z-qyxPOe0|6M{3%eU z@;%Hq0dI`r_Ufu=G>hHzJeT3b?4UGUzol+iYb&GCaSG?N=`bb}3IB2*Xj#>7r(C#| zl_B|npKG(>cc?p1RmVQrenp&N-#~>jST)YJxY0HC2cr6Rq7_(_g*)Ww*ip=bWqC=v-fPIaYg;Ee} z4$8B!`ZiZpg5A&CP>b?Y|90*nNrusIvR_9A=8z zi*ZmW6#uQ^&ayg@BJh2<&ne6>EN#^oc8U}C2~j6Fge#DaR2zO{n!ythrWOu`>!D23 zqlj8}0I~c9aYvyu98@%J?B6nUiYf}rtQ%QhG`)iTK)@ORG?Lu`W*K1Zmq`YOWOV@O zt^d~42(TdV{(fkH|EB=HiUV+U7ufrM@^_MKs~N@mrzA z^<))Y$G^+JlaQnqCg_99I2Qe?zPOhO{Y$8}!_U`@4$j$<9zZiulBvecqicSkheE17<~>V4#W zI5GwT$K zrWrc$?ULqcjjyt^KKG{tEDg18-^pAVWHyaqC!R2>Xyyyn+$8MNe_}a4Al+rbA!BwW zRzB`zQA!=(AU*brCFDcNeW+ev+;E_75*T>K*SBweEMKuzyTwDOcQ4N__@l)`ubNsi(Phq@8nyxKem&jVG4$_+OuMMWa z$bC4UnsW%0xI)i)=y=>`ne<4L?uL*8vw zd(W%2Ie-2VPi_kKMiSX)H=E8?GV=!VhZW%Q!x6zgOu!%j2`02fx?h$m=$hVW`skK3wD|3on$f9XT$oz>yQB;(>{z;flMboex;-U+rtk{P^wf53Xyq!_a9AAFU2QbX}G8Y)0=bsJL@A$PRNnse8lV zwqJ1U_ExL-$;*{}1hHQ4h$rq{+0N=8JHiu)OZ%35C);bB@%-i!@wv@@4WS`i^O`s= zR{je7Bl((E2+k-gGIfuL!l6Mxl?GrC-=MGthU;PF@(W|FMiG`p?I3QZYV36Q!1u%K zUN01in(a`WtEu-#hogi+B9QWXKeOzVu;^mh>qhqNUfq*FJl}-0frJtY7wg=0sw6e*)R^il)oDFG@(3@aOb?r*_<@k(k~|*W6DI| z)-*E{|2lX43HpMvsEae&pnyuXqe93qGQ`z?ex_2_*;5mL;Z*DIyG9?I1)^LMi>)7s z{SKBNzh87(dC-(3XBx-nMu9ss#frB|H@20`a*{B<3Zs#79$TY)*eIUcM)+IeUhiKd zKC41Oe8*hvOZ?A3HFNu7X=%@tU%%m8esT7p3)Mi%g&=~-jLASNL`_1C2~JJ@E989M z`GMH^>c_vVlRa;H&I*egkbL@+cJ><^$3JAm@1pZewVEnu zLN#8nIMB_k(&%&s6^bP9sQy)Y7#H~;R7R0?L~+UvU#n}=o_(0C^WL2FXHxm=)oJD_ zB8{|PpkL?}O2B7kg21=jA9AjWH{_c8a>Yq#b(+F?vi-6yF6_)Mc(abRZA1S^E3e%b zJ$>oyViE0~oc#&3a^C0l5UTTRnLaniHl4e2xc*~E!K{L4IP(-YgoUX{RZlpCTWGoP zuz}8FvQ_HFj^#EZ@7V?MCnD2j&s)8XYxgKW>^pA(c4-w*>loKXDp6n!&*FGaAcXQr z*WnqYYC9LZwO!OwP!UnIJU!c+siXgEIxnT?b4W4(izPBj5QT>}dUIlq<_!9n4u*vG zA|07!XzP)_^q-jec;~$Mg$0Yn3rUhgqnmxYYSf+}K1E80)l@s#ksr@L-hZP^=XIO^ zNwV9{fjAgHM~sC2*%nP_mfbZT_n9@Q?;U0P$eCuY=Yz+mb?lYN+dJ8+?z2ZloaC&e z$~LCMG26HvsjlY-wn`g+VFz^3gs8EMO7&@P@1&OkT zulf)54YYq4TtA`2{pXuA`@S^rUhmB+&?=vk*j5WMqAnzv&8R%qUwt+1 zB0>~}ah_CWm|9zz;E>-KzlqZ;wp@2@y6G6~9^tWuEa1pJ$Guje?P3zs<>SdYA`%H8oJ5^T9ew{8NZn9K1rk;bNulMrevkT`a{yl9)@`%qdH zBrcl!cGV1KiEt{4nx9&2cz=E~yXa&92$nL({~Ar#whU5~cnNI3ZH?e)s!jY#k6S9* zJliYu4+QR*y|nsm*Ea;mE5WdvRf4jo)p`H@Ds`RFYl>{Kix*>y&lBA=Ry>w@Bo}AY zc})lw?=elvf~1R+t*S@9k%QTWt+>XV!~R!0qv=U$&x86#MPWtrvA{`Z0cqQqTF;Yl zjWeE>t6X`q@Ww&0NgG*8jvi_L04J1b#gvS?*(b@9B~M4Rrv;h>B604xmL z-VNgUhxy2(z1ofj0vd+ z3n`(WZ7}rx-r)eJ30No=_4(+>n45px?UAnBO5IFJ7&h}fOMr;Lb>fPM$`Qg^3r_Pa zCdfX}u*+QwUyZ(W0iN#++J0;7cIHUa0P;Zg2D%8I9*pyOz0f`FZnL zn6TkqO5RPoiY!)u+V2@>h(v(Z7GuaOJO_1g{I9V->2iY6@zdCH#Yw!w|J7D*$(v$| z#IAkCN#uSEk_?fxPhFMQMPcoC+{y~}0-gZ=uuDE+i7H&UDK}QJDR0}@Z`fbv1sJBI zYXs=E{d2Ow<}Ja2? zD3;<*-l9vKXTxp3ba@+DQsz^N%CNmZmC;0CZf|3Xkw5l4??mt#ig+}K`q5wGt~Yak zdZy{jveJ?a=7~mWG&`{&2zU_Kciz*}q%fGzgV1&%UL{k zO3jZiY{*dIlQAdc8h_(A6+mhw!(|9%zw&vx29Ze6m`K4 zK?+8@Z0nnFqplf`X7tpNk;#__H?wiOAR2nYqSLebeR7++ag~Yo9dbMGEk)u8t3iC& zSXV4Ki7ijE*yL<2-5ijXZ`uXE1j2Qkr#@;9`d8jHK6Pp?kpPAAQ0GrCHud*=FL;3q z%8S;Quc+hTtO~>$%M-|W+>kpThx-(smkjFawD~_}b@?jJ@z$It+cSM1{)`P5Hv4`0 zHowdTN#go(g`{^|9HWa&zsb4<;&`Hxyvjk?APG%Fc7E0dtAH|MC+H7+1meo7UTE;L zvRqvL)xBPLS5NAB6RKe>vA>?Ta%@g!Oh)cYW3?|(_OY&yflVGzU79B#5%%al3P>=c zAD+8!0PbSNKJro6D>pM+;064JexB4q z>{@MxaTmP58p*37Clc&DI9lxkpB%z20k)}56%*z$*3TL$z3Aw zpF!nTiBqOPiCzU+)aNz%c=laXK?QAf=xR}#{vcJ~&$MEir0HzOS@WL-6VG`Yi}RtK zoVPc{fAhH-{XPU|l=FVXt-k?d(?jgws*N_Il5Ghn&=jghBk<6!HInbvQjYf#T4bK< z`sy2?Aa%oQAk%-|9(E{DVztin58%_?XF(n-L+uD6IF^?DrJhq!`)e(EHv;L`1x0BG zL-@A;Hrn)X0KvJvm*0G!$ifJN@>jd>eGQnM8=M1G z9AJHtz65-3xMnR;P^VQe!Hg`rl%P;zF!`iMO7;62vI_SpoY`Nknu@3b-At%TjJH@j zHHed&{yeXlF6{Q{+j+SUR>7OY;o5ywA7;Pwin|E@SP>HV3iE%!8e^HVj-wIH*@Y6D6| zpbN_-+*?HV?!*&cV6%7@Colz5c!C9wco+$)?CpIcW9c(mx_P^yHS<|kh1=N%dkbx~ z!FDd)N`gEJq^58{6EOIQbVn87kwqIycL>z6j_&`^s1JRok9o_t88)nIMO_8w(pi(Wt%7R zY?VOL>St3X9EPuq+hiGJOa}NeJw=Ve{FNGhWS)Um(W}F}xWZu;*tb>dUzgY^i4Dp1 ztPb)>f};^+oX~!szw^L*PHE^#6r);Cfqk*{La$NkgSzjJVt46(LDWTtz<)RJcnFn# ze%>R=Y*$5{*Zn_^&N3sGXI2!iHmEWb9_ja?y!-Unq=MOW;uVN7VV*WcSrf>PIc3#^_kN* zg_i(m@fl$A_jk#-0aBYv5LyWW1NJFCy zlV|X+nU%q<97LVS1Ndf^J01B3-F*iG3yFPPDq1pRO@DW3E%B@E49Wb^=eUZ@sUYWR zQd4yEE#E6yG2>R=%YO{r+Em`crsyA1A8KU~3iy5UJf4t$6Z_LVZ?Rpxa&vEglJL+p zG3$c)FJ8yj)`+rGi+_?Aag`J!AmmT6C`NkL$ry=-i?U1Po zdGTP<-#f?{%Llp0THiw-%t^yTGdeoz>-@Z7LILZ(!2Y7O-G@>e3)VAG(6e=k`~)uC|T_ zqDTmzc59t};wF>$SY%G&=PmTtYB|V>L{Wu7clio(W#mmF_o9`wO^c7l@m@UZeb0MU z4G8#{FDAgXW;l4~#r8kGaBg;mLTFc(z74G*-JFh-3aqDjWZxdD2!B5p?k5RW^xrm( zJ@KW_vM>9<`c3(LRGn=a8a~r}2Q9Pjp~!~;L)o!MuWo6KTinX2xCX_4KUgeUOTQ0sVWYnP9Pj37Elwd#SRzBR2=$s#*K} zoxN*N>tfVfr*VPOXh}$;AGgZJ+G5>~i)GII_PR&gyLA?C|8;)Bkn8yCDcurXUCZ)c z;xDvQE6m=OWuj~YBik5HbXK`M-Q!X>n$isL zgVSe@YUpc7h-O}O>8jRp${|LV5M*!|j%@KQ^%cBn-e?}>*sQZPSzSMHw){pjsBUN& zzE?Zg@S;L%tiRtUZT`^(oLS$Ab4_*rlaT635w~{B>r#NuOg%+@uRM@|iIwdL&`rvj z1}2b9OJLD8?|Epi^p`;tP-Om;C&eTf45c2?WD$Mu!I* z`@Uk_@3n4RPuwOn%|_pBL|j$z|Mh37nCKm8HqT~Uvm!1EORiwem($QgNl-D1h~NW4_6Wz882pZp5t;sYf{AtvCw1i>}V`yQnC-76nU}?~pz% z?(hGVWYF*yrPnd3r#af}Wc43j2sl{5{VoK%+4u zN5vDnrO$QYd13h0ZcD!=SP6D?HA~N6##W8lPRO{j)W-|9%cVZcHk09rt3Y8~UHiz2 zzT$@e@rFs=ZD`>`&1UpT@aohc^#%xjmDZLLX@}jmqc$%%utdM`hK5IRn_C&YP*{Jy z+x2<4fjNzKt9@Kc_|*}`%DSRVrhK5~vTWaGu^crWRT4-wajIa6l-+qn<-;z?Wnan7 z#1J_4%p@B5KY&~7O=hQ%4^3$l?pCRsb0rr6ERzKLg+KU^?8_9xLA|}_T@FdsMKD0Mp zqfX#lmA#<*Mde1?^5*o8SiMb{mOvaYa=3DF*VMFcuwHDS!PaO@NA35B<{hrt;XRtZ z|08AHe}n(zoT;VR$cjB_I&(*Y?FY_6pOv7bfa8ErC62CmDO>?$x~2VQ2L4xJZfy2S zQ$s{gnur^wo!^@CO1zR`vQ#0L5+L8N-MnnWI=#o8VcpgzIq0YH*@}|%v{W~Lu#E>} z`RSh3#<80~H{XN&0gcyUXJ(>=wa~tGY=X(Twk!b()5PM3NY3%7^DtSqJMKU1Rh|@` zBwU8Vx3K&P(B-~MY3#(Pdy=-#Ayci^Op??OeP#`N#yZot`Dc*pU@zeJB_qyodESFO z@DSDOCb1MwmO8MEX1ucA|G}=;ZGrLzPcTA`%Kt-cb2hHk%fdkt4n}pG5afr?eI{*3 zxYdF>G|?q2zk_D}2yQOe zB^HaBnN2$-N5+2Fj5VfW(Yvm#^M|;iQW!h$n0K{k;#$ z;|Nmwlf$kh;#tM)%-WJ^4sJ2$;tM~n_HAE9t#KuqK?y}|xd!Di$waTggpH{K4%^;P zLCoxUOGvx3?!c1fjn<=CA_2U>(*$W+&KWrJ`8^1vz3qcNpibml6FiG*NQ6?1ZQUNH+%UNYH;c#|eP+-b=B2r&4( zuM?jfpx+{Fv%8O_$ZB%Rm8T!ON4WrYL*hkeq5Pwkl>+eYk6a19OZOC1VcV_>fmb@u zBfMA)Xhi;Ns)cx>4$)!&Ni~qC0HlMl7;~uxM+y-LW9qOv)UKxKSTLfW1_ZjAo#54T zs1Vv@e3br|sT24~g9!JHAE~Ti5T}<+LCSq{_E#fm_T_x=JakS|QS_Gl_WL+iaGgSL0|Ng6edBZIj#aI1iG|3U zZrE+1E&XbKNoT)DIU42)AHS%|752TmS{AqLVPU$hJLrb~6{tLDU@j-9d@)caLoxGN zo_-y~XU-4bgjCvF5rw1TSb&h5xDOw=?u-}mbJ%U4y{oUw@F}9-)BcL{x$T{5r&G4u zXkfcm4SXWwd$W^y+;spapYg z@1jeDXTGm+qIGuFF^MmtDBnqPqbBX^Ue=~fd^uvQ5Q8t?(fO(Yx;ZV>o!PZ5zfgy! z-pm?{W2+MiKYkgdAjkvy0@GMZB4@{(4LO~=m%h8ICc05Kb$ z6l*f;lZ0q9!x2sH0$xWcl`DKlJUZKdn?5LKH6Yh(#yQzBxWge|gi#QIZbE6NiI;ei z)V?w7QQa<0M_@6PrIgjo5p@4n%vv?2i0;dlqzTjSqkTd)qfZ~4@I;fFwKDh$It$q= zYSfzFG31bZ!JtGfsDi4(6}Y4sGrh3gGob@SVdddVwx=g*JP3IRx>GzaR6Kr4r?vY% zRIC5t1efc8qt7C0EB?fHRNjl@NF9MMC5Lctmy2RXvfiz z=GD?r9(9P#os^o*7EC*$M8gs5%dq0T$bSLb_N3bRgxKy3vHTGhh8YwbZjLmI%}bs1 zaxx7AYpu<`xvP+Rk3@ylj*jOx!*5`Njy`nx>u$_JEs#RZTU?=+7)y6$^RjM*Yc2vi zqJtrITTaN3w6}dzZ#90HeF;+Ea>KNXCQ9GDKuwnB0STB0d$a<1xr*L{q~$)6Tt{iq z*>#;r&+P{O6X%7Z-aD8Q<^7O0UTq!e&UO#>E$7lw1I=S`t}64IhVPkxt*bDu2|bbV z41nb|o=^pp$`T%i{5GAx?JZT1{=(hj?fQiP&Eqy1jaH{lZ?iWjL3cLaq@p4s4ZPFX6<4YAQ?4mv6ECsztwN6-c1>V0HauRFO)Q+-5wqB%=b zP|FOdhQanZ(7fl`(ss!(`+U;w&mAeKQ-5Fik(azp8{1m#p)sTIyU;dDhQ69}KWT9K zET8hGt~-{(r7N@Hpr${m=l+Y!%H&1?>xB8mFa;n8dBl`T5B#Bonv|xkk182JtqZpX z?@({!#XIvYk(4KWqTfb&in64)I-TLjiqUEPc7OEFSb5Y_bw4%R?mR~>6uu*~{7Eq= z6%v9G-)ShZl>N*!QUbC5l3weBlz%1S0S`Lm#ZlZ_W=I6rIjU(6a&X7DHv62-bAiSM zwha3=-Ymiol;sXZPgTA6VVQNNHt(+GK-l2Ej&;BZH;*_HRw@WHUf(7rkX*yhP9!M^ z+z|0zc&ED@bZN32bdAg1p#OK!-LXSGe)gWuaGyHyrtPRd4UtAc8*ob{Ho=Z_7Uuez4;@W z`%Rt!B8#$mJ%(iVx(?UML>CI3+S9j35Dm0|VE+;l+}*YF$wL;UVGXQrkgg^E-gD(0g?aBVBSmQW%&9QX(2axcXYs;!|YXjs>LP5JANJdF$XwC0Gex%#yq zZ?mmM)a+Nc+a5U+G3si`D!PYE)-X$!IBMIA^~}}RKDNnhK|8ETcjXUbGbWZmoq|Y8YlsUup9*pleMN9 z6wv8#9Zz6|Pk*Df&b;>WAub}~Ot>DX$hVT=a4@Z5s92TnbnS$(s)-dKC5ojc8=hc( z#MZ1(wRsZp_Gl^4R2(Zhf50Ga5o7qeH#p+YQoO7Zq(C3kz4=qFWc4|RfniC)PR4W(*BsYcf zX%H>ss<3Z#?L&mKRFi?|s>k-2n*}7yhjej`CY_L<#5bAA^Zqq%o|nC%wl<&`#K@M= z6Jmg|0)*_OznIJU|Ke@0>%fQ`(2mZ5TiR$I_8f3WU3J9Gi9O~>Jlr-s)y-7Z#F&$u zJ2%Kql3;#r5M~#fXL9+ZM4z8F<-M|}A4G-5JUbNU@XWzYJ&y;=;bX5o<%#a7{oo6fs+Z5>mA|c^j(5y6yH>OlKg+lJ=E$o=PigV=@KOx{+P3 zlnLmHx?@=GZqrv}1nN_W7+JvI{7ZZ5floO#80X=Waw-@lOQLCklkJV;Jm)`K6Q1ZL zemEL#Nqals2W%*|yDy(l{vfOm5{d2aFw*4twYZqgZ;l9@aqpcLK7VdLy}y{0l0os8 zXQITo>v)#gBc(wc?-<3L>-aTIrTLj7XZ!0e>j9IdvcrKs%g3vieVHur%MB$+#kM|= z+TSY|sUdAHA6GrGuel6+De9j^B1by6ZGovc${e6(z>k^LdGK;tZq;VDl9cq&mb+d? zBo$^d$L4}l%hJCTV3P1T)B-D-(j9%u4${xLWW5_o>zrYsuqN8=HLG^ zpcHJglka2x#ebviq&wgS@bx4jVu^lkT$T5v$}<}8>3-1*5N+kFBj>D%lQN;aFnT2? zB_;L`cmePsCIJs#yxENyGZiYO9YT?C`|=^OF&Ig-ToqiFCZDFzfw9n`pZh4qz*=N^ zr8Hr>i2{MNQ;vjCcqN)ehx!C>Jy=mdag8DhlEhDy&81SkDL|!0AP&(Qn5y&|H!jh) zXoQ9~Vc3dh4sx?IxyONAqZBvcT1Ku5W9I0;bbgcjmIGia$`ya$7=}NS_>JSHDE~EA zM)%825X(;ct3fU8NJ$zw8q*?m&UyFI+IgE?r`D6lJH1XTj59q-l^J7ueaZ-~t;;9Z zui@d_3U8qh%zrS|z?)g!&cC+@Y^L3Lxh`#y=2Fqg%HJejW{wNS#^vO~sIq8XR$i)T zKe%xuUrSEaQfp^qRdRUv-+A64+2$!;BjA&9`!wCH*ZC?wqf6ro%(Q?< zyg$G=~dU0EYtV;Zj1V!upI+qcHZ-UDv@xglq7YCiwn;_&MGH67R zySA`KXA$?SsSAVXRJ5V52{l4z+;jaJ+=PlIbxh|(t(KLLEr92+=?8JR z!l1v!O--r#P0NyVUf=?cgM)K_y`fga7cATWGqCN?H>>xbCtQ}83tBWJ>XbmY(ZBkx zq!c~lC-X6CiuAjWZ2R;^9N6nvtQ4*l2{k$L-Xo$QpWrk$6x1W2^c$CcTAUDaUmM7r zT3-J44;4|P-!w#e{@Zl}2f+R^_?CUcGcri__xCxCbzMGTTH=#Zs=Ojw!(hbA@DhkY z#{6pGro(1B@yWb@@9=PSQK0EHCS!ke5_p!*03s_kg05U2{kSU_GY+vlaN=F5!2}&F zr$We?R^8Ne^39}hKVX0;7#p*%1YIGu*Zo6n#Xo>Ec>*55!2y8WjJa-UEScAe z)cUeT#{r5WvatFi1rFxriCa8dp$NS(x27o1d~H_U>Dk#We*AMk;dIqA-nO&n9v_|F z29JfCy|9?9IFny!j)cLGS#{WK7aFbSn^kmmN#A%cCV)Ni=^SgF#W_gP9=sB=+!9>c zLLPVyWfj&!3?3a}X!rTOm_Z9Yyw7Xv^>~;E`{{vfi{JWxA> z$nzC(W0T_AdYK-@Mgka0=)4=PEO8dr=3m4C@2wxxsS& zJ6i)oUApVsuEzBx|2fKza=&3VFZ*7-cx#Fr)VZmH?w*>mhH>4dq{UWFb^(RIK3-Bx zhK?Ye(H7uTUGt*zqnpbA*Z4GsH2j=*kTM9H)Y$iR$6+H;Dx*^H80JBIIYLylwOTNXTZ1%y zi>P+)|6SJ#I~(d#B5H6lwV2OHFvU|skkMGO<=@cc#AciMN|HM%_7o2?RWZMA1q=N5 zF)ADzF=X4vjT@em1sBq!t5&>~#M`2L9fL38@=B1u{P0(SDKNXniy!vBTInt}3{Fma z(t<^3)D5CyhgrNz=9>?OPR(^9j_`r2>6o_%fMvY)zC?f3bMDf4)pyrOb8Z|J(H!gAWsIM%$e%woB@Wu; z`|2?4lBD7j_lC{^g|LNJ&yhnogRr3@G&1?Riilnk;jL9C{`Sm@uCz#|+FF=i9Ce<_yu$zll6n#$u@Yo@y5R z;I&7lPL@r3;C*wiL8ndf>CP)nYbkEIy84M1S#T9_LeSeg^f}zu%MZh>?(+Q{!l27d zX+SB;#+1EWx5ZB*5OdQ_T!9Q9|uAGV_tU|NnLd> z9BsFhd$t*9j_Ip8S&i?%6&YY9{2f0~OU9bFwD`{4XY%j{WDFKhD&KIcCi9MRDKW5w z&R4;=Nh|?L3<6;r_52~ z=w0OIh(IP4X6ax`7zxVo=$DDgC0@uV4zoDF{!Z{kYfotU7nZCdD72U}*_BXE5;^LJ zq9p|*Eq)ywg*NQ(uh7`+y;uGvBlGncH69_=Va+z5xb)S#M#2Xcznqal-A=ZSE15oG z&bKLRuwRhH@E=^orOb5A$(!r1yA)EvwA+I&ej&|IkU`hw~aS=4Y!&NvC&>Ti`|k%=oFtHa~_KaYe45DVMHZ$R}Y{7en!cPoMQX-eOJJ zVXMnmYC3Yd8G9EtU{#o3&tf|*O5({~U-zqJ|CxxUCv;P83boJK%^^}+usfGMY@ET> zYdf~6H75A1p2b8Jk|GlqLIbchaC3P6(ejz{T=QaLHZ|F4ZFG2-?!?Vk4bG3| z3ghH;Fh7#~1I{{X;tFiOM4%_fiKBYUK>72bM_n%!{K(VO7k^^xkHSgjGY!#}Rt8yk zkd2Sac1o3Om-)J%A%oQe5aTQukv~!b5cFNTya36VpXqW`QRH z2>vM2J||Mq1fc(A(&Rh!Po_yDMG5b+e^*Hd0HUy?tJ<=&;wM|y+6dzz*yfjEF0 zU#Ox0xNMHyE`VWs= zn&Y$Cz z^bc&StxfE{+-CbHdv@8UP45!>l30p1kw(A$3%cg9+-Dtw3oItzvbcn5W|$kZ6EZrke`6rilAYN&aJ|!iHDfj zjeMV?s;bJW6o=PpY*!--g$UpKmzxmi&;Yn2O+&+eK)f2-=IVS}tArX*j(XQMIZ^yT zuJ0DbDpfBEu>{05I0%gacttR1;=nO$)h2Z^%|y$6{Vt)Rt~(G3Z*NK$_qqOoR5%vvZH@+Mfx!~;Om{=tC;aikno2%?PJU(%_5V#l`GpI?bodG4fX zM{pNil%NK&)+ioJh!>`btmV3w7?;NP-Sh{uVe5YlR#A|TOuRF*cS4pIdGPssasj~7xjIyHJDCrX*L{C#4hjo_*m z<8*O%qQt!E2#A!neq^pS&wi|78;FKvcb+_abb}*ne3D6tcWBFJRMf~qK6@s($4`zv$O_BYA zYQhhc8C#T1?EObAkU^cZ-^1k1J2ajz*c$B8GQbYPch4(&XvjP#ipZDPC8$H}OF6EG z46`#5)o$SHle!c6vJ-Ur-I0T%JdX2l^|7FHM&3f!Ps3>m*`h%K&5PdeyjLtu!4l(j zw(>XjUu<>nw66#T^=%0)`jV9HKjS8ivcQ4&vbefBb)m@?iRQ|`zKhCyRSB}=`n`#f zKOmU&&h~C-^HRry@946(8O3-;zsrHRzWa>VPGJxS{?+g1Kfc}LeaX2Oa#EbRt*ysp z*TFK{eG_j0w29mJ0x9($)m4R!WCLubXl9lo>)s(SAO9V!9oX_Cb{egq)$aq9D&sqa zLGSHeJG#)Rov0#wm35mty{_hacwCS!B`EN}wdcxrS|yo0Mbqh{#$z}&b&Zu5NW9j* zxcff2=;PIJzsn(t29=e9JqF%e_Obr9tV65rs74yyXUre5(AP(sBA%V}I-jBW?enoN zQS|DL8huZ2UB{rlw${r*oq0lZ&trR{KOdt=FI;`Z0S- z-j6_!A;h@YKX9=yWK52UN>+PwQ0oK8>)q1Wi3$P^G3YeLmDOGO)FB4aY~=miDgbl^ z4j!7qNupTk>!7{2!H+k5S{y;5r!QT`0vk0bOO$M<|5?PLc2I*Fy+yX(@vmOVXqv9- zdAF7TXjI>G69vA$66DcEAZ~neUV}5^lpkmnSD8!{r%15L4Im1iF}q}1LT6bXc*<_&2V zp;Bt@CU_YyM%#7vW2hih5+esT$8};Xk>1-j*`NmL>4(7uZktvYWt*KeH8lEupLB2B zopj5@>6~tn7B;O8MtYfiQq zXmYlzCC?)!oT8VK5%uG(`rC`W6=ZvQySp)6TCSe*wGtUXGi5HlRfR}@H7A&p(X+Bl zea1{lSJ09v7E1TlLi2fs6^U3x>#Ukeh6H=nTn1em9@9|A$D88E59c8vBrZHYy zB7*HGUxwfsDdI4 z!xUoT`3w~r7cRg4KM1xn&zT}=$2w84j8x%&RmlNMlSI&i}{e~X@!jeJg=d?eZiz$I~^VKs_PW$aFT?uS( z{8N|Fq)R7I3jiFT9PFSbCMIaF{*;q4L|pvgTe+5ymC?>>eMJ6AE`kaHkhB9LIf7wNaly_r~9x(OZ6EiDWZlGLQvJeoQx+llp9Bj#JCX;8R5`C}8Ks!^eD32co{7C@&l_5^PN3l^Gs zP(0N{{w}J+`H?3S>hD|aI9eT~dszT$3?THrROC9T%E_S(Tcwnb2JZluL0OyMe@!{B zQ_Tlo_%KqbU7K{SgX12isqvMiEbEOAZgNahR5>`~T3=g|@mf6_wu)?e6sEErULUA2 z>P8%2a&8Y4g~-t4D>VHyup|@m&g=MN6fYA;dht_;8h92rZ0IvRkX*Pa12{5AU;C8~ z|M2Bi=N@Sac@ko;t^K<3+UEeZUaegD)8KC*NF*U;-;*re5<=2N`hNb_GCOlexz^Hq zfY9fsq@jvSRsQ-gF6y+nz^*Vu=W9H}jj}j)`f#;E6w8kaudt6d^%17!w7G<0q9AE& zPkD_4_7RnbIt;ICUQvXRJ!S;9f;LH)K5RAbl$jqZYiXBLO0wj?SPMAA_GADVkakp| zR#{rwzjVu9RMD2kL~EDK8NzlK4%{Evc5JeJQ1I^zt|E9{R#%%{$E-mxQN9#&jc>X@n#wDNqlb1^zi%8A5ntJDsms3}*qaC_t3}`p(JWi<7oaMeK)leyeGF-rsg~ z&GYU`?d=^OML>9CDm^qDSp6HDlU%>=!bM(oc=%-DzZoy zitWAHi$i}Pr+Cio%L(i^l>jpU$g?uqv4iXXASlAOL;brA4wZk?>t-6;vsW@-F_8Qt zd(w!E#S}jfyw(p{NB*+*sj1$Cd!%F_j@hbxil_cCq!(qsrR{L$!Xn*hGbL*7F;oLc zQu+DDj{j|Gff5gK-dvPkuKa67mVAr5BOhS#n<|?zLA3UxLngrb0lgr7RZ?0S{-G{a z!FF%1J}hTn@rNA`pyl;*Vuws#P;Za-H%KX#H??q!&*VF>2Ap)i0o+gUexyxCkIP^y zscxDX?mkLLjqTrxd$$sqeRmXBQuUZ<3Pg5%70tbbbl*eiz&xmw3WKW*^|ay&VN8-M z0;cN`<`eg&UJ*&>3Mck)=LR@7)-9KVj|4<-Phar1r7b;@I#K zvQ;Ugr1zf#F-;5lms5iNY)*4pIJ|MsCKn9iO2z6g$zxB!w0U!MRbI8m>7BjOJ)gLG zzRKl7a_wy5)@1V_cb$58UsnaU%yp`m+9IEucx%$v7_sENfT6989vR2H{|XZoJLFlu zfJaY16rv7Ef3IQIkHh;?hX-F9r{OWeiy49qk&&3=>CP9S_!K}}bf>I63#i@Pm(*hg z0b@l?O;|E+4t5{m`>l3J@bWp^m2Dk}r-(FTs?Gk7aXSZxbB5&OBcdcyWO z(;%!MUH*x?w{<mK$%!uk58lS1OxGZwdtuU*+O=FQQ%G!x10A z6+>DO%|tUdVk{GFw-N5#w)Jh>>V1Ct0s`gf(v?^!xzFqe@hzNstS;^!SL)2=x+t+C zc5-$(iFyM6wg3%!h>J^n!iAG>Y{m>6+s{zT+6|`us4IlNzIJA6w&Dz!pwt@I$9uci zo`5H4$N0wfc=Up!Q=T@v_cPl+c<4Q6k|TT(Pg3v*L!QqyZtEkZ-}M@Oih}YC8&@RP zMjJ9>mdj#MG|^$pq)FLKc1n7(sMjU$Rxl;&={(^@sZq+~yS0_|?ex{Z6DF&2dnjik z@dT5k&YK=FkWa>w8P-B~B>pE2zst)f8g&vDJVM0hw5Tx*4GerABX|7v(slj*{5O|( zUg8W{=EB(?dq^xF2_9e3h)e6!=bSFU^g7)_n$ks$+x z0OZuDUb|;D9Su@gd(ov7@}m6f;PqQap&-GJTI4bs0sk2W1`IuzK(cTNC_kMnCk{?Q z1?BUw6pfyXf}ER)Q7=F8w9-vq$n(pOq}98Ge|`||WWk|k3*D2;a$K3YP|*~DK1OXU zni7y&{vgr!SCa-J<5p;iKke1H=e#|ctHw{+*Gzd5TOtX@2JQ58`gONX_)CjL=@J6) zMnr39JZ{HmN!04Ct+pqJR|v5_ve}lK(I2u!xqrs?DbHWm=n8E$?DliW*s77#>en92 zdX3c2`2u;)(|f@UO zdq;N5s+>A4!_>ZoLG}ShV;+j}o2!*UrZPgSzh&ZnQDFhG{dw53N&0d2i^_EAiUJ#Z z8{!%bEE2vA0bBCx#&d(HK!e(5Z#nK1`P3CDCZU#IUmIskD4?ws=}Q|1XOyQ;g~DXt z88+-k?RX)eu$MJjok@aPB3;_4n0K$xljY;BWKbG>-^+8$a+CiN(BUTB0=T_0a4B`2 zUtAmhHX4SxCkU>7j=V_)RdfY4;u@Vc1$%l^TuPxTJ9c2Gcj(wF%3d~};bPoDQcden*U6Il`ySO5TE3UFixc>(oZ zd33#_%>!X}XL|yXyPl=1$bsAd8j(KwY3Z*JfT|!j>dUFH3>fRW`$rI_r4+o8o#Nl^ z&E74>4{K5lc+Z=i#6(q|VaOnZHX(*tc+Xmd7sspakiF)PJQwtl1+!!ySstmVY#NOp z{zKokP{rDsA;UUlbnBn@Gu8^RpF2O^R4!Ha5{gCgD9@5#QdgJZ$S4&gg)}L0f&CxP zEN~yt5+s~#v#+m8;mY)V#O-M>&ju27srgL8Gol&Je0aR`5?m~U-E!{vn}1+g@YfZ+ zE(S--sZ$EN1fG`CiSCVNM_K{826f6`RdfNtZW?gA_vYD zaBTF6Yaj?;WO$pffRu*s+|NRL_ON4eInV2_0HC;s9Ld^`#JwF0zexN=VrFjDzTh6G zqVJP`2GGh$zHB-qQ0$7cs-pdgC^-hI#%Go|s04S<03||eMfB=FTmtb*mKt*(&lG0< z;h>2Od*>}Y-2r#ZY78i5VbEiCYCt3rG;UzS4n{O6U+y0Nd^UneVeZ=I?-dmD(I6_B zPOf3%8pF&pTn`_UK#dox~T93m$8w(?MdY0%}WOPU`#lDlHtEpltb0EqWHGof#eP>9W9s4;zLcu6g_N?TVZdmkGlHR{gVfv$_^%^^4m45I+KGGU)7(bEh4{s_M*tG&6X160RK6U6OcwmopMlmSs@`}-Z zc6B)i3JCdxI|Gh)GGdwO{)$~uQEs%b)yFcCkANuH5V zx*zlT#Jglg_Bu+tPaZSy|FQ225?-pj^U8%U%wUlmJSuz|Q? zK!;H9C;vYz!C8FNKRAo^Qc$o+&K4>Q38ulq7`vajf}QckDDk~HokcNAVo>_z4p^QQ zhTLRdiQQoGyhTCBB7Ky$wPmWXFFqg-xj#cYdXc}I42?7@D5e|yv{={ieQF_={k;aK z{!(Yoah>X%s;2(uYuoc1VU*HPC&T;Cb{Itjn2`jdW<5bypawEonK#ay3{0RpwFWpc zTe$dKA73%Lbl{*JbrUtO`BL$SL;$;P&SEsV&I*CNj0{7CJun>Ww}QEex4|keup;gc zW6daOz3@cZnPmgk#DuykrcBPF?i@W~+0DJ^#D$hLPho*-fc!Vxc}z zpaFG3=IIgX`X@tsJ|FEtr(7QFWcc8k&1 z6(_Gm@6)7d6}(h%z~2FM@bhIf>Tv#)KW9vZvKrd^6t~GWRb|a}i40;-u%7X}ic%nYJk2J@bo>PVbjj$uT^vOh)+p556Fbm z;R>Y{OGT$D>!=&*Mwe8LYHl;A)o5h5Zd0Y)W z5|iTuYeS&_7w?%@ezfpoae1waZ@VN*PgvYuM>Sl@sY0ZUHMNlcYTI;y#KI72kd*^h z^jy-|Al7Ec-!Bo$m%w8XS9W|8S0WSpjSv(t=oXS(>P1X6L)wg}8r-3? zZJzzR+0bMkCxXFHVhua{6U0U7+5UMQDwzoR&i61Y!Uh~j!;~k^Ozm;819|O{an{Y} zCW?AEokgjGxx+h_zLA;V)37RYE%pc}t7kNnwIvmTv3kx5v@&*1_TL)g(zjFOw z!F#wsLDPs;yeoaY9tjMd%t1ErRY_MDURyixae8wIMMd*9CaOO_j8O5s|ElR`G<)Y? z@3%ULA%I>Fj-E@xT*r35!d2%&RAwfX9B9weBLyJ$1CF}IYA6CIiq@y}`?|JElN;#6 z2d^Hy-L9oF`uOur#wvA_6I12LxFMoZ3++IF5po0jsEV!6v99(2N9Z=&+qW9rFC4K( zxj!K;kIB>TOFyyoyZr~pgi#@CePWN7q=LL481*S-fku2Ga9u)6)TlvNXEcCkW$fX9 zg5NYGszcX5^fWy$@h#922hU+&Q`6=^MK0u><{JadC^HnpWR+xeq2r1i1_6gf5$uTC?OAtH~bOx~3= ziyN%V4}JHhnf=g++*UtkhS`NkgMGWX`g?-C!F&mRVuVBzB8#4WO(3pYtm;>9tx@%~ zk`C#!MH`zAqlW#@eOJx5#aMH3n|bVi4APUDkcEx=zDM5;;Dp`unJzYBFtLhj0Wyq2 zUH7fa{rxDRgM))Q7@JvjK&xg7z;q{1y-T<`p~nw(>A6vy5WI5~y}8tcSHoilEI)Je zfv^==Pg2`HZeh!ECw!au?`}9s2Fe#-DB&fAu^Zf7UW;)2%6^|iT>tvGgp8Q8N{LGbn(vTd-7uXp& zkf!JG?pA4DdBUgBVzM<3PKcRLIWl1Y8f)W6k_GRTY{?@|^Hs8c<=sR4#Wo+l^S^Bt z*tJvmuO31-a|nqY^^w%NK}}5FL!)NTuA8;6F&r5B z9Gh%U%LrgR&cb!#lE)1_OJ2}4kWBAG#@8; z7wiU~OCG74_u83Xw;!+ge_3^NUt;Hrn->@^H~2b+inZIe@%(zU(ty73)#J@Zfdj#t z8IL-}r(ZxQCZJoQrEUIPWAe(jFen4mXewE2zs-@w%?v}jQ{pDiU~l>Lb~*4Oq1)5w z!L|<+=`kRo{>_B%V}kbEENt>0rt4=h%K7ctoohM@5LO1D>RKS9bvqK)ICjKrO4DyV zS|f#I7p&Aex4sBFb^y8#{=I`oKbcGYtB?h&CIF_c zziT1-*7F}PM=z*9t{p3QNC0*A<(+^2E`p35C`cFrnX?6#rw35->oXyA#rBiD3D>)O zhP{ZShWz-tfo;)d?fn46-ClPAC#~wtBUpUO({Z${p)Ts%BaSam4ye}~iF$P8vJVO_ zyg)Aud6NrH?+pE>5b@Z7n3w^dxL}*DeTdj&XS{X~hvnt&T8)SUr#H=!T&v;l%hQHZ zxrQ0sMgDJ1+Gf{ajq5YnUo*6`r(AxfMJSj5w&7fVOgXBSZ!ycfUlx&(qV#<3j;a(V zvc~*Ygy5M>-&-$b5oujpSh%WidXm_6%nR?O#6g$#oDX$ot$Q?yVv-D*qk_D$!V*gF zuy|%?e`qlXcx_`hulORBobl__EgFxNJwE;FnCARA!up`24V>R|zqDs5x^%Spat~#3 z%+X{dGOA)QH3-uf6lJH7)y35b)RSetTG5sa?Q^xN=pi$>#lD|^i7Nd!e;MBLtL1JY z=|soJYsQN4VoaLmDyZPja|Pb6q#LqRaM86RvV+7-zLzhm8MZ%yId#HM!*2haRRgh{ zKYkm#71QIxZfV~Al&>)3rjS2H_kwPefSPdFi^UeYr4NaDzbSvr&LYu&`^`g=BytNi zI!>V$&b#fyL4MZm(_?`0jDpYke}!FTTijgNg%)>rmr~qa1|3{VDN-oz?pEC0Z=g5~ zE`vjHAKal7N^xh<0)=94o?r0h%7=W)m1Ljny|$dSwgBx8*S#?_5i0M>WqZf98=;r$ zto&>NH@+bL{S}@Ze!Sb2xbMbwp+w0t4h`m$nbc(7hdm)97{j~L91HIYZQsrRun#pw zID?*qJR1r#C~$u4M=Dw{o73zx->qJ0JRGy5dU(O>WoMV0Jq>!}^8x=y?N>~b%(KyA zLYCs|2cE5pl>yUM#+~|f=3~}5+mAAJBsz%N?_=~O-blYy@20tOMN892CaOb`)~7kT zE)h@VNpbFP)AWIy9b;E4F#@s}fHj}`VCGx6OgL1p&gfwR19jjL2!HwRVS54+p4{*SDVP9#=VZpI(RRQQ z$UiFuVoAiW{|L!MR4r?z#(-sy=Ae?=+AXF=0`yunf+2f~g*5p^oE(Ggqnf7sQNjb# zXmb8v;tM@b!vxv&cJn!ZX)SNP6|~3dE@vlD(~4an#cxI;=nkJZ3ou=OKz)W1e)JoY=&~#A6dvgM-MkJ3x@u#-{Lm2HCZIIr!OL zp8x^>1~;$v!yQpoRq|SX@!Rs10iph4YqR&aVw&aBq?Vj0c@^;^R(e88Li~g3ZsyPA z3ByuWq0DyMqMXKtWJzaA)z%t9YDs^5=HK_@hlL9tgEGsZl6LU5^nW;di%Z4gn$*up z34Y{PdV(4^n*bYiwWDA6!GU4Axd&*R3^gfV+6zpx;$o!92Q!spF4My9@%qF;Barw0 ze5|VZ(EXvh6)yRYrrP5-T+&@&H?>H@0Gf8OC>M45(_{EOLwm$q7uv}`HnV>+O*Ry> z-F+AHefVjv_~2QG`iQt?F(I#;kB!8l&K(xzk}`5qcY!tvD1OzE$)(rM?iW%~nQ z1BdU^&w1Jas2l53rGye+r`Kumn~?Sm|9H$ogOG4k+j~;5%@QLw`c6|Pu#Cp`>((0KFmdkdK@;W z=ThZNgFB5zI5?&(K7VHG^6ZFn>1q8C6!t)V{fXHRSu-sQPsi$~;dleU-3bXj5ODjc zr_MLbN$bpby@oI92%u5AhvT4D)&#St6GY zQXI@s&vuVp_m(fuZD`r1##OTtIkH+Z8IS49(f*!*%c#2 zB8D;svSR7H?bdDd<-e|9_?Hi^a)pIOr=QLcVQzOuqC(w$)NHLNK3IK-k$$T&3PbL0 z8I=+`4%*V_zK@{x?MDbp(Sm)k#=NXTNed5cJJvC`9wWwT=jSq6HEoOA^6AQ|s-f?{ zoMm;(skO=gigyxVl!vQ?7abCf8#VbYIXjO-r$$Hrb;CQargE?{*CnL60lQ?I&eQ*` zaqu6>Jc&S(FZCxO+roDW5)=yN#D?{=$?CtP2EOqh((&T_2Y%}mhqH2b6c*Z3FT=4X zR}yI}L8EAI&sMZN`HD!4hf7ZrThjQm;QDaEQ#uYEXbz(n1lZF6k`esb31BiT6kyyg z3<;J%9j{oSDJNrgWyOEal}o7(15{)tD-LHzU!FJnt(#@Ca^fhGQBff1yQ9gYOQ;oe zL+8>QTBs9gXzFn!n=~R3lAAR0QH-Q0`6NC5o)H7~iUL~P&64)>ciMGPV$*MU=>lRR zheA{skF1S6f_!gC<4VIBIJP!*eq7$^iU zjf6Vny}3+b(bTS6rJ#N3k<+D4!4RnxDqb9TyXLm&Q1G|b=bbR3_&5r@Rtkz9V$zxX zk>+?3i?hzw7zIefsuLR0o67nc#d_l&UWXqXHy5C-CQ6sA-`Fe`+k?nPjXMfUKb9F5 zQ)Bfx;s7<{76)K#*+wb~2tkN3jC*y8aYDqTY;28}BYIa0kK!RwD4rK#pHS6>sLzp=0w(AjOZkPWQWt{GwL;9YLF_T7dG7RwRZTvtTH*jusJx@SJR&)}um0_Ax1+PNBPGSl5|q#ZeLh zCbq|HNug(!!#UWaNPefHPn9-z4lx*evpiCvmMJf&JfBlXx_)D9!HST!p_xLc&Y~n` zQWDJF@(%vHi#+YHx3Cq^C@7^ACrJU;FZw7@)F4hk`s0e*nibk>xQJQcbE zS=$W-*9~OzT3j6^9FI+Mch`>ov_=}8xrc7;;FSyRU|wPL=(|^pK5`$H1$7kpX9kJI%G{i_ z)}=G%@H)6)-G^n0&p19~umKpAMw6bc-#)DB(`2r4wQ`RVW47g%tU9~>#wRxET<5Tg zYK(Z})tC{74cWbQKhK^v%7Oq}0x(t&O^gCQ4stQS_0Hf!b9SGr)Q?&NOoWDCa5R)~ z+e@J$o7qA$fXNo3Ss0`@{IiqcCB{Qgx~8;l=k7STp3ohM@Dx`tbfyvD$KzFnP3?KTZ&BrS}=}0P2f8ibE4x zMMt}MPM%oxHz{<$QMR%e#m<_)WSdME`Z?N)n`5Y>*=EaCL|Ub?vQ}P32ESZAHwyi) z`u82!5^*#{vG=eZ_L^p06YJgeAG0$HKfe>u^Q7|n#ku}?o5e6nR%ynerJ%i2(8RYP zU`>^}&*ZM^`xt?G|9jvq6SGS3=f;diwLsXLF#AMgiE9UQ5XB|a^9|35CVaB~p(g#V zhI=iUIq7e^#5=dd;m3l5L%Xx5AkE#tVW4c+&zR=BEtWd`=#LwnkgK$pLD1nO>c2x2 zB*+>i9I;i5dbqa7f2 zIx}o@Jm~h*G`rZ~v$VAQ9~z}eMitAa0n`D9m!gBhu?$gUHz-QSH5Zm$fb_j z&^v_}%Sq9A4D*6w?W!U{{jI9n;la(mC}zqHne~t1&MU@=EHvLq8KZCz%*`U?%#IR- z@#_$(fq-9muH6JQ6&Qfy|5Cd`ESUuLT?r>rkN<|l9g4Qys?=I&Rk1c!Mii}rt#$$?)l5b8mTlsYbvJz zVUoBK(3HsM_OE`WPM(Jc2FIT<;LcARxSaXSDs0FxJ+ei@nNJQ+5-E>Q0^gdk7Bvnn z2l$V>|LbX$Z8HfDEiIgnN#^cp3DeMPOerKKZ7M3l_Oh#j&lOXf0POJW3l>k4JHuCy zJf175&m8a89CbU56sBgp=PdbL?=N#Z4%zX&W2YLTnI61WR~X<;qy$cD?n@D@>#yqM z&7@9(`9p1Bc*~5TgS?<%34=)sTT)Do|I8e>PhGg26-56nJm_Cm$`6WMgrYM zKCul}g`+CL$gVzV$1SBYy>|bR!y%hXMu8M`bgTjZ&9*Vl^(1vuYB28FBhJmJ>i%-5 z4*shicM;ppF+EGYqB+I7In==5Tb|UJPb~*Xm2UT{H%k{T^~hgg7kq|c+i>_7a|y2<9$Me6pfxyoi@v&NSNym9bmbnYM4-*Heg4~o zE$XU1tZXu~sq%XYIJ`hZ4<8frPvxTBYR8{X>kUEF*_^eze(to3LeTvkY&Sjt>x&(VWyuVv6}vtg5wl=d*o5bfc~ zPYx^dtB3Cfx63k#CQJi6&?;n&UyN}oZjQxB#4!zYGBoqKBB{mN4jt-ys>xt| z3>s7*7&_qvL~uwgcUrc+E8A(!a^7~y<7Y!L$D@DNly@wmQrhEP@KEjrjiv}j%+p=> z*-Las@T*iBK1@y!%a1*0-{CH!Po%W-y=P}BsXdJ@GnDXJHzidp?Zf$6bFOd# zwWdg(yawwdc^fb15q9iv3`$XIQynnwP=6ao!a zgf?e@R;6Q+^;oAZY;0PD`h&FvB0)$NjlvKNOy9%7fn4j_y6Ub zC+b4)P&2{=f@@Yr8eUPo=q5mx{S;5P^`;7mN*)MXoc?p{|BzV-nntymDJyTGOx?F$ zp>My=$CaWZXJEX=dO)fRJX!j%5!{DXQA=*!xjr&AJzYLfbeJfNa{%S;)54OI@!&9Q z%Rr8N0G=AKwt-RJtfw4Bm(RrnHsz0W?T`e)F|(}UoD+AAT>h-Jv>AD4LvJ#7paA3_ zo$#nMKB^_B@Mqv@b6WDLjvRd5I6cIMuYvB(M&rE2ek$Bld4b0OiGkhed2H-h-3X&4 z6QrzGxsFW|vm2Lo4Uc$s#H)SyAho!ly;>~y6>887=EXwJf;B>-Mco$Ut$zYau=*$F z-rnzS{izj`sAdAKOavpp1bujIu(>c!%6lrZy-45RiRl{k*xaaBf_*mY;*y#DXZW;{ zgU>wQ9+qFtNWN{-ch8QR)N8mDO60SX&6<4K6&?(+&CNiokZ-C7tfi)@X^|@=>M0g) zD@6G%J$HnhznpzLBkWaF>dBS;@#aij&Y$AXwL8+X9WS4-aBj1;6j*cLPpIuNHLR3q z=k#=?vD5~{07>~b1KO>%A!!EVbTRa@r6#&e<9()3b`YrVroCn!tRkDu7aw6wmelyK z3)76Ula>LD_9;vH@812^E^uyU)1mvsk(Rkprdz+|q>moT<_wP+omlKK~MD z_Wpj;>^N;DouLau1?R6j z+6h5Q;h2ApqVTwTL*Ix@kJM5>6}2GH`j`eXIqu_q^op^Kas7b2E_&S;=x!ME|LHS+lIx^;@O= z*LW=lY9h=tiAq#fgAa@ZAtD%WYwEG;egITL73out_vU!}_5k-0hl08-hC<1fb3igJ z5qD3n%9m{_hfH3_LVi&A+LZnb7L5Gp0}@FDjO}b*A=}Di@nkz1O~q3LTD%cE*t4EL zCRnSQQbVm!&xK9IVaB<=zwaAqb29u1jAfkMiXH6l&z*5)rYCsM1UQOGe%fbZJwWBH zH|-LF+H?hl$HKKwI&XF^00oCn`!-78oIz;3t%=On{T=9QV&=vKm2cRbQr<{f!?hpdZ#on@p4ifst&fzQ{<8a`sY6gK)^F_27}Wi1+v zg$+vNs2#)C>iAdc3{_!rmbC?;ogPd>wRO;)TAM7s9z&PGG|iP+6t~-d*iA@GV=3)v z_$CD6%#=9f=3{yzq%YsoL?!E4_)JDW7AhxaVQoRBibDP+A!@Vpq!Fn z#+I)4_H>CpK~3;hxfm)UnA4U6*IN4!#7k=dOlg!CRwKZl6v8& zTCQ=}xI3z(-SClq{&{aVx!t3`AMt-bjI%Sz7brsxCwPro2yk$8+{i=ks}ocTB|8lS1X z*@kI0R^re!9TUN&G zF7n@OSeQh4MMdN8C+ZIWRt5#VOUB{YT}4s5Yrsj>0_DIXF1Lm4F;k%G0<2tEkJZ<- zv;R-KRQ{de^Bhw+Lq92`F~`|r|xGyD~rmzytV!v8B*w&omp67%ve&H&C`F@b8J z{%=4TuyQ6b0U35HyQ*B>npiF%mSe2(2nt40i?Wq$Xvl%V-3!&z!yBAArqnccaIu zByHYg#Pk_i=2w(LliT4;vZ!l{X@$ExAAp7z%z1gm#nTsU)NHJ*I)FEZVle??xS&y;hNQ=o@5=|L>Ru literal 0 HcmV?d00001 diff --git a/platformio.ini b/platformio.ini index 7b1ecd1..3b247a9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,12 +8,37 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[env] + [env:esp32-s3-devkitc-1] platform = espressif32 board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 +board_build.filesystem = littlefs lib_deps = tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.0.0 knolleary/PubSubClient@^2.8 + +[env:esp32dev] +board = esp32dev +framework = arduino +platform = espressif32 +monitor_speed = 115200 +board_build.filesystem = littlefs +lib_deps = + tzapu/WiFiManager@^2.0.17 + bblanchon/ArduinoJson@^7.4.3 + knolleary/PubSubClient@^2.8 + +[env:esp32-C3-devkitm-1] +board = esp32-c3-devkitm-1 +framework = arduino +platform = espressif32 +monitor_speed = 115200 +board_build.filesystem = littlefs +lib_deps = + tzapu/WiFiManager@^2.0.17 + bblanchon/ArduinoJson@^7.4.3 + knolleary/PubSubClient@^2.8 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b1f17bd..33232d1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,12 +41,12 @@ struct AuthConfig { char pass[32] = ""; }; -static char hostname[32] = HOSTNAME_DEFAULT; +static char hostname[64] = HOSTNAME_DEFAULT; static int meterCount = 0; static MeterConfig meters[MAX_METERS] = {}; static MqttConfig mqttCfg; static AuthConfig authCfg; -static WiFiManagerParameter hostnameParam("hostname", "Device hostname", hostname, 32); +static WiFiManagerParameter hostnameParam("hostname", "Device hostname", hostname, 63); static WebServer server(80); static WiFiClient wifiClient; static PubSubClient mqttClient(wifiClient); @@ -413,6 +413,21 @@ static bool requireAuth() { // Web handlers // --------------------------------------------------------------------------- +static void handleLogo() { + File f = LittleFS.open("/logo.png", "r"); + if (!f) { server.send(404, "text/plain", "Not found"); return; } + server.streamFile(f, "image/png"); + f.close(); +} + +static void handleReset() { + if (!requireAuth()) { Serial.println("[HTTP] POST /reset -> 401"); return; } + Serial.println("[HTTP] POST /reset -> restarting"); + server.send(200, "text/plain", "Restarting..."); + delay(200); + ESP.restart(); +} + static void handleRoot() { if (!requireAuth()) { Serial.println("[HTTP] GET / -> 401"); return; } Serial.println("[HTTP] GET /"); @@ -515,7 +530,7 @@ static void handleRoot() { html += ".count-row{display:flex;gap:12px;align-items:flex-end;margin-bottom:20px}.count-row > div{flex:1}"; html += ".count-row label{margin-bottom:4px}"; html += ".btn{width:100%;margin-top:8px;padding:12px;background:#4361ee;color:#fff;border:none;border-radius:8px;font-size:15px;font-weight:600;cursor:pointer;transition:background .2s}"; - html += ".btn:hover{background:#3651d4}.mac{font-size:12px;color:#999;text-align:center;margin-top:20px}"; + html += ".btn:hover{background:#3651d4}.btn-danger{background:#dc2626}.btn-danger:hover{background:#b91c1c}.mac{font-size:12px;color:#999;text-align:center;margin-top:20px}"; html += ".tgl-lbl{margin-bottom:0!important;line-height:18px}.switch{position:relative;display:inline-block;width:32px;height:18px;margin-left:auto;flex-shrink:0}fieldset .row label.switch{width:32px}"; html += ".switch input{opacity:0;width:0;height:0}.slid{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background:#ccc;border-radius:18px;transition:.3s}"; html += ".slid::before{content:\"\";position:absolute;height:14px;width:14px;left:2px;top:2px;background:#fff;border-radius:50%;transition:.3s;box-shadow:0 1px 3px rgba(0,0,0,.2)}"; @@ -532,6 +547,8 @@ html += ".switch input:checked+.slid{background:#4361ee}.switch input:checked+.s html += authSection; html += mqttSection; html += ""; + html += "

"; + html += "
"; html += "
" + WiFi.macAddress() + "
"; html += "