From 404dae3a283c69c3530c57f6381f5e57187933c5 Mon Sep 17 00:00:00 2001 From: mats Date: Tue, 22 Sep 2026 07:10:44 +0000 Subject: [PATCH] voice-poc: WebRTC voice + screen share + spatial audio with configurable STUN/TURN --- voice-poc/.codesearch/codesearch.db | Bin 0 -> 1789952 bytes voice-poc/.gitignore | 1 + voice-poc/README.md | 48 ++ voice-poc/package-lock.json | 36 ++ voice-poc/package.json | 12 + voice-poc/public/app.js | 794 ++++++++++++++++++++++++++++ voice-poc/public/index.html | 92 ++++ voice-poc/public/style.css | 204 +++++++ voice-poc/server.js | 199 +++++++ 9 files changed, 1386 insertions(+) create mode 100644 voice-poc/.codesearch/codesearch.db create mode 100644 voice-poc/.gitignore create mode 100644 voice-poc/README.md create mode 100644 voice-poc/package-lock.json create mode 100644 voice-poc/package.json create mode 100644 voice-poc/public/app.js create mode 100644 voice-poc/public/index.html create mode 100644 voice-poc/public/style.css create mode 100644 voice-poc/server.js diff --git a/voice-poc/.codesearch/codesearch.db b/voice-poc/.codesearch/codesearch.db new file mode 100644 index 0000000000000000000000000000000000000000..9e7df2668c46c7e9137cb7fdd59cc6fc3c1ece0e GIT binary patch literal 1789952 zcmeFa349aP+CM&-naq-8GA&RFEu|?1N@XjnKr>*0f@NP7mBrAeZJW zzGpvkX3p@T0~}tvrO@RrwRtTas5pwIsoN|TilRh{(rp9`{Uv~b4Oswn5#}2iMXJpc z2P8g)O47BWq;=A0(^b=prcQ>B4fh)w3zvoI0?T{&W?X;nCyvtR=#R25vl+~E<{P@2 zPSmy1?YvRI{}Xaw-G+Q(PL9sk&TAWAVz-x$w-*#RoJF2-lkNFlmwQ}(ak+D%CoAj5 zE)9DP%gq^)YZ;N#b3m@8$&D48v~atoI0`I7hUE>+8FrVYf9_qaNGu*p&jEvbS_Tas zVHq@Xz<|u*NnB!4j*fCT3+z)plS-gC$JxrgE^Hrn;~2)ZyRlo6FRcNe*tV_CH>q}3 zak4xSUWuT=4KqgEL;1-YG$OZe?y$&wS#m~>7@Ri<0vMP(XhbVVK`YGTILLiaJ1B4! z7JBU7kTBDyB;qvA&a9nAQVtPmB!a{nrjfWeX;C}knN09YI8X~SCnoTTEnDh*QtjkBoQ1B4#3O6M4U>*sn^;;*v`@2m?Nhy$GPk4D=ALE& zK`RR+r`&F_Ij3bR^|{2ME&qvHg2Gc(4J4>Ps~(@2mL~Z6*Gg+mGJ^@cBX8J+*>mI_P}E zaS94;B_-o+`4c1RcMMTI6>BjREG-P8DBe6hNTVi6sv7yqARm`i!CE^M~zTr8z&@IowD@K?UOTdzz9oLE2LBEb(BU|yc#8xrp!8A zqLO%{!p5l^*A7G7yf`i~BT<)+dkaUw)Nx+ByVNtTz?F{;@xe^w4eFgc%A#_&3?2kE z4wPGfG8AT}uc?_Zk%5`OZum!5F@Z&d31lQpgnBcaMG{_g<3icbca=NCT|l_q)np$B z5YcJ2KykFP1e1u#k#9y0PTjb67~)`%5zs(0Kmw8ybQ8lQL2#aNs2q{O9L(OxL3u+* z=0dVVRE4z=Rmjo;dCBydO?+ZPg3dP!^MoAGe@Vp>k`R(=y1~f$QmfNM)YQ}~6`Lh? zXB3q+d?7~4jWDb=)A{0S@@Frz!*Jrvci27S3f-BT_xqE|EOk+6}ZG( z6LmAgC6o{Su4f$jwYzbhzydLSibelofg(S_oX6ll=z7CK4Z8m`MTAvJer^vh4fF=3at1~RSTD%Pi&X0^QDH%jbzy~uH5OERBjL2xFFq89iv(s6=G0= zJIGcRL{KXWYO$>>sH$fUWucxV>l{(>A)TOKeN;^eMT3+gBf(vPje)A2teX`TB^ zNm)ic9}2_+^%ngP*)7O&<0vCsaa6Oje7D7uY-eQT%^sYV7ZurD>e*1>(5*X3u3>XQ zWeI6mR8rU~aFs&dTmSq147gQ5KU`$^_XXNIM&ZQF2<#KxMu&hw<5<1&5Ge$!H z^*~52^uF#;%XCoT)6)7%X?<(wp^Wl{5?W%nO}5|Ra^%}1+?~A zp#|tfT}o=|z}X|y2G&kMUU4Xj39xsCX$Tu?g&vmwSJZqIxTP)O`@g30|D)WHibMIb zg9X;CSq~|#M{T~k_YU!8FD!)pN5^D46k4P?f-cxeO<$KI9p1~uAQ8YT|$w< zWW?p}<8p^EB)5bFEpC(owF0TT7GIZO-Azm!IJZ6l+cB2Ej19GX`kM4aGB3~&-LkBM?3eAo9GPz1O?9VexYi;SSCBozL5 zx64+L4^=X32)S6o65NTlvfv78pPFwk^XA>4b^aqSIAt?@VmM*J8D5y|vG!2(Xv#9g z4s|wc2)S6o5}dFbr6qQ>1ksaK4RpcaU+Kf z7;dTg%XgKQ+FE<;Wi|-PUSRQf%ONSnI#w8wJ15`Fcw7HcBtgq2#0TPx7A)G;iKmAIVw>X<#U#xV-j@e1R)&Zr|Rl(5VMRlldOZIA|^mOcw_|P zFj=T}#?L7EA-PPxNA4rHlN-sr`6u&f^B(i-=B4I2W~X_Sxu?06xxSf_E=nIu+oYGJ z$D|ojp)^G5CN-7Jrr%AUnGTrVHa%~eXY!iHnr=6>H~wz?O#WUzD}NyS2p)}D z012t1_8r6LTIy^J>C4oa7}C|$=@`UgwN_bYWQ zhV)zNXbkDs)WFVo2YjK8zt0p?XesqQwL6CN0`+bT=~-%54CzX0XAJ2w zYDWy|Txxp^>4Vfe_1FxZx<;2#+oFXNs6ezZkMc(gyHnNC!miZTXkkZcOSG^hwK-at zMs12?Q*||MaSAnGEhwVqsRd)HDz%_1HCHWYOjW7{^{5Ji=?c}(w1bjgG8@edW%G;XP3GCA9dcuHXX%jiJnR8%krqj3<-PJc zxt{d3B*@3)S#mqmmr}9WBK;~qYdT`ODkVy7&Hd!B|BYRm7L>+-#(>6v#(>6v#(>6v z#(>6v#=!qg2I84!G=7QH?)9Q?aZ%@y#Oo?5DzW#r+Y0SY>YT)+(4kj&D72-)xysB; zYEWySBcD2ptmsV}^v;K!I+Mt>qsz+*z)ZsESq?9CIjPh2n3h2~_zDU?sl#N@1#a6E z@|Ig~mzO#f$E0J?aCiaRVJo3d)@3qj53vli!%G|a9_j@0=Y}}#?&0uyg5Bw%jw63W zGy;7vh&tAQ=@1n3g14QW_L5%c12`Vos$g1&JbP_L_T17k?=>Tr0PMG z8<*PwFKrEQc;MAp(EI?=PAD6K66&T7U|#HATYhnfhW$un^G1r^MTUPnSH0n#6lxDDWZ)29n?Z`IFp6_xOP`gmNBVQz^c8W{_t_#!-98Kig*wl8yWblPz z>K&O$qif!|rM96|gx-*)0!TUhvMS|AQANIsNmU0!BQ=NGihPG&K%}-9;PF3xd63%7 zF*4nh+7wRNeB?3wIuzp1hDN8`K3r;HPf-Hb-VX~PD? zBZeZwtp-*+DXtao7l(_@h2MnT!n1-$=*u6GPs;&$iR_UF%US&2|2MlQE!P?Y8Uq>w z8Uq>w|4j_ETf^^atw24awt9hT&L37jbqgq`*H-R>l!MdYuQxfic)u; z=)+1Stazje1YEavz}sOB6IS^sW>{~bYJpcbVZ{$)6|!zct#waW{cue6r)sT;!s>@& zQt)8ywNhCBV63v%m8(}#VeJoMH7K1Ua(xxnJrJv2=<*99S6*S|{V|n?sMcg*<@aMM zTUD#Iu=0B`Yg|@A%{nfux-X_`M#Ks)thzU55)xg`h_zo>c~1t^9_Y?gryZ#8L#x8D z-tJgsM_s7BUJUEM8>{T7v+9*(SbJBjvZGc;t}(;9JJTV>3AIza3{~c^&W>0VP;+qy zjK7Tr+a6)%?Xg-1^&os#2kmT>*EFMdKv9=gD`xoYLFf}y;Sjeq2gTZ?P6(}W!)gKG zURS$Y&kHYp!+L%wdtL3}qG0K(50dBnfNHt(}<0Xo(+ouB;tVz3{p}tW$x$|EHHfgJ0bS^!-2iviyzwnXEUT zfoJ`XnqB50=C)>8x+Lw9R>1TAzEZO3XVYHT4=6YFGc|=%{s)XJjWdj+jGc`MhHHkC zhRud243i844e8=_@k?=^_?q~LST2qf+l%qSufj3m4dDslK4G-bT}a{o;y>f}@vrce zd=cN5Z^kp+SKNEtT5b_n!sT(TI9dOr{-FL%{bPE!ez3m1UShvv53z5t3t1=IpKZg& zGnbkD%nD`>Q^fRRS~GF<75W&xg?^TH(miR5?ibxb-Saw+u9vPMb+OgLCL)#5OqVR_ zbgB*_vhMYOPY&mK?WH~BjD=~So~lc%tsbs_*&g_8p*_1^>xCAqnSNtUuWMu(e4we9 z%>(+kEKJ4vDL2&b7OK158n#^67?e|VX|j<4$uVP0@L0hKf!iHEkBW7r=NC%u-Vn?5YY9%EtYyjGlE-LP3O`CN~T9|l4$MmFy z^>641!6w9Zgzr)*Nek=U&=G>IdqYQ4(!x5i9n+hpcTQRue?v!0(!#hKIvO$-%HSyL zq9|*crutr1T0P4`GY%%Ig4YRF>N=uj9*~wQ(eO_f?pvrmu+s`-h@)^CwI?-c9#9AF zb=4{*t|Dp=lQa*gi*nqJ9CtI8c|cuM;O~Yz9qL`V(L5j!R2oXOSQG!Q61<5_?P@v? zCGL1FN5q+elcYp za7m(%$o>|5OM-{mQoqSOU=ZBXRlYYvdkDwAxlYnN2`i}yT8}tbueZ!IVMhogB8GM0 zQGi-!NSSAhk%-p{;JatAv;A69$~;31_q9RywfcthMC=Z^kBH(`$o;EO1VW7HSJss8 z%Erm_c&wskXeAoPsFlW~c^r0CXKp!EAZmGoqnF{F3u}OOb;=hYp9`8MRn3a&2tF6o zPp!HiJEo`zo$v7UaX8^J6>5HZYSqk}Ye*?oGq46!?1(~{H>e!$h;dW%nx|AvznOd8 z)T;Yp#4y|I8jhPLHM>Ehs%cmwQ5C~%_>h*zPR*7QtEM7nT|D%x;g&Va<($PdsG5RZ z>PEWEgz7qzNvWEQozO@W_B12312CgyeQ>6(xO%2!b zscllKTv$mJ08v7kO&U}=qvI}zc3#djt}4Y&>hQx;G*6tRsst;b@h+TaH~J2{tF-4d zuifJ|r&LYEDk@&xp~7^V8&pk*j(!p}vPtntRSxWgrXAtXC*hgKq__rE#nJxCz+YM2 zq^hE5e`VNTS)KY-h1d})M@_fubUB?(s_ftZGup`5!sR;wF*d=PQB{DIRE&g`io>)Q z$E8)}V@*|&hN&A5{EpYBRgJ%i&N#@-IJ2e720D^XMe$Hf2U^8A@`pk(-HTOJi5e6h zYX&uHTs1C+LO8L5qy|-Ev4SeGgCNI)^o^^=MEe~$#SOi|?RHziKz(Y}Xsm!HP~lP< zfY<(>J00HQ0eo83Jy@ezq(*--!5NOfDAzwOz3OhzN!O`T5RuEikeI&ujH0KnMC3|M*(gHO zs-aj}RqG>^t!UM1P0g$ta??~=o#@iE61cO+8rQyRFxG8%gF@<708g6>>?4Qe^@5KJ zx|}e-?N+x*)gbUxtM!GeaC%v}r#M~Tq-x+zl+w_OFRfmassT4qN<~Vk_0y{QVUON4iUcb__>B`& ztNLPR)sTRl$*|BkF}`4Y+SFPa-w-G*IN z>EPkJqU8>^olj|0)g#)O3p#UgjjFmwJL`kadI(&Jc4mXltf>*K?B7~c48N}|lHhm! z!`R%~8DL)`jkVne5$t`90 zw6FOO^F{Mn^M146{F-^0c@cacU>bZOAm2RPe7jjO-(pTR*E4g{Rq0#lob(ZVE8tb> z8R>qhSh@q=C}<^FqtYu2jLsxyl_G|EW9JE6`mFz5K4u+gh4_tp^MO3NEaFkvY_XG z;!pGY`2hb0znXuVpUY3;#9PjGX&>70`r z%MIgtab3B#Tr)12i|2U#U-~Qh3v{0Tl>R;acKs&(I{j+>v--vQ*?Nb5h~BDisgKvw z>=pJ4_9(lX-O8?KUtphR=d-g|FI&KlVEeJRu`Sv9EYJK7w>6xCJrO^%j(MJ01Une^rYfHE@G0t{zn`0jY+PY0`UEPrB1lz7&avm+> zAp>`f9IEod0Xhfz3NqgapXsxE2jhcq_{+$A3OcU`-UqngqbrfV|GtsKlKY1tNO2}D}_D9fZ5!iOdK=CuWKEdlpaZNa(do~&84$QUg$M2qy8 z2%y;RhDVy*DYf;e+Im=R4UmMP?OA*Vl5b6DL;|il!u%XDPk?Xab30Ls3C*h6qd16~ zWhnbCIs>WNBSgvCiW07pa*I&;qS+>&88+!cCiWmU!3LT>4mCME8RB-;7*~aj?A03M zuIMA8+*%a1>ai8~8fq4>5VaS%;G8UKR!+OUz+S*z#k!HlLb+dvD6&<3f$|*j*pT~% zXW~Jij}M|qko`S~Um@DV^LF+yYCfe7r(PE{uzzENZK|FQ87N{XV}A-6aO;EVEW0oI zJSlfEhV0`QvI8hI*oEP7dq)OSP@=CNG9-iyQqaKuhKiqTm+I@H)>ZSsj@w(y{sJnv z32;*kw;r2dqRM_4HsQ(>+T&ucqpB3P{e_xYaCXeTizo|En)UTmR`xtf8SDV+^=Lqi ze8$P))3&glzXLuA@4~g(!>1!AYRQBcG7g0XdLv;8FwkD$uyHS=ctH{jC`)Z^p|Wys zqYQvDdX&ShjI=zAMlo>d?SNs&HVuc(Hx8yCr@X)sOeyy($`~l}t%3&btB~Q-kl}2| za5`i-9x@yZ8uVPyz+Ma)z6lvVLkWXV(&xenX})cwg^#dsTOutRQ3W7tB^J+&g66%b z07DODxffAG#5Qgn@*UhFU{4}BUL0{h)EMzlN~B-bNOy;gES{`j1$H-zC-gv_JFl{R zfHDUCAB%ZGhEpNQv5?^inoz+7c(oS8-1ZyD-$4~2@(CUH9jfL94i8*O;Dla~Pp)N8 zLfwSw@B`1HZla*(AOd%yw%|=fE7@Y_PS%+9#t5?kB{6y(&mKZajNI8_KdF(Bv+#U; ztn=vHXN{Qbpif*8hkKznFCFeGcjw#rIFv6EY+swh$=5;oBKF`DGVWnXr+23r8RMBt~C{xWdC3zD?N3 zZNTXcKa}K_VJ92hDaHL+WBj_t_<4ogFb78JtlCj52+ zPsb2)f1w%x-gDv7jPP3%e3O_`5v7}K9S7TK))rb*tnH@<;Lt`C)mwTnsDzo^o6G7NBVU)%>~nusL8} zV_pKQ{YmDr=Kkg`=4R$P(%-PkKM5xTHo&(47E1R?Mex2rj?_j?SjY2*pADZH4jQTr zFT*K<*#;M^;`0ohVGSQA{v}=%kBje$Z@}7pzBpC1!@9i(tlArjoNxtJ>mLYPg_nfK z;r17&aF1}i&`D?_$o!xD1^yVni+`Pej&4rZr77Kax>LHny0`d;`B{7!Z{vsYz4(rB z_Mkq`bH8&JxKrGI&JTAVE`w7D4{(#X@!W8(H`j@4&Lwh!{;K|>{uBKHeE`htM9DO&^OSF>^1fhdz$@#-3F`l=h;Wu*{lcF=p)%a?5%7Iwjpa^{$Rdk z&M*g=cbM1V?80NrgN&E4Gj}k3VRfF#B*FUpPx?FhEPaUHPQO8~q!-h3=yJM{zLUP4 z?n-;QBfl9Z`An0`*Xq7Cf?VE?K*vZwQGXfil-1Y ze(S1T>!_{qYHOU@Dyyw#wN+AEad%P^uTkx4P+LW{m8_q`8RXTjoZ5<40yPogeyhfc z`>h%)t@f)^TPc;5RnyL1SG)eDw*INM{-L&BQ(Ld9t-q_Szp1Uis;$4Mtv{=+SJc*@ z)Yc!>R;+g$k?Rr^l{Z4KDR&6EwBjKPfs$DOrt>37vU#qQn*$^%=vgEC?lHHSV zM4zkuex|kt*X6<6$Jp~~*K=xX@U_H{GTuw8iTAWx`4hDjuRm*)PpVz zjn+C7Ejk@7!Y@Iq!#WkMbuwCn--1?qJRYreELwClTJ&+W=t#8aqiE5G(W1lAqC?T5 zgVCZ7qDA;kXmuX(o6u?zeiK?PdM`SxebFNPHniH~o@lMz(V};wMZ2O!JEKMT#b|Ym z+oQGKi56{(76qb3F*?5LXf3>xsZPX}XsylBqD|4Fx1&WHqeXZPtd4O*wAP!^qBo*N zuSbj4M~l`)i(ZQs;f+;wx?YXeS`#gLC0g`ywCJU1(TmZd)zP9CqD8BsMJuC4E22fu zM~jw6iw7k4K9ZM~fbd7Cjmvf|YzU zSNsMLNAty7;79;P#i1YVPh&u1Kx05-Kx05-Kx05-Kx05-Kx05-Kx05-;6IfC1In1T z{{K%cUM*i50~!Mw0~!Mw0~!Mw0~!Mw0~!Mw0~!Mw1DFAA{jXI7jRB1TjRB1TjRB1T zjRB1TjRB1TjRB1Tje-As2GIF`R$fcV-@$Etd%>XnX$)u#Xbfl!Xbfl!Xbfl!Xbfl! zXbfl!Xbfl!{EsrwP-LkN^kf%&jJ0){E5Gfq+??J6bK8^_P*>^-ELH2HaK;LmW2uOb zw9%*Hbu86PS7ytfXe+YAciLReWc2)>l{ZuJ5AtES_iyw6Xa=>&H3l>WGzK&VGzK&V zGzK&VGzK&VGzK&VGzK&VR173C9dt2v0>pSGLw&owATg;m_l9yZ(@c!q0MJ9IjC>h> zb#KboAZAA+ACE{uS=_?r=)q(Ovx$b!z}@Q zrEKXIxF;nVpSc^u##JX?*N>@jl;JJbmlVP20)pk^grvr(Vy0Tpx>&04ek|q zOg~3ot}oQzt?#eT*0oGDJXb>Jf~UQ;;u@tb!8D ztVb{#D$9|-0{i&#B5?8|MYlKK?Ja}gJ#1Z_4sP;+Ya1)wU>4hT$pY~tBz6@R3ba&N z1`+Apka}!4R=QBwrEo`0337EpPDBS>+gbt_0E5p`1#&uEyhNp|TjI#*yy=mm-waQU}~s;w<6} zm4!eFD3&`pPN=ja;-+{wAhiH!7K`D=74LYv&C3}p^HF^HaHlNT#LDp~W$m)EI7o>N z=b_vSmuWGk%6n1x5OZl6*o~FrkYl^99kSY^bc{t2cwL-ms2qbLhC7Aq9He42B6U2v z(;B?ogGt5ri-FVKNDo~*%<+cGyKrjZ!XHjAR*phx0J=H7sq#*g-~18>)BvuIRCxy? z3+|?Y3*d10Bay#iueXeY@JFEV$<tE zatJse0-fMvFiI?l*$3fF?`Dmil9G=pv(?8 zz|dl4KNLZGM50ug7fi7i<$y6(-i~;~ms@hIRM{65FEC$>i7-|6K_nMA+}J8s=AzW0 z1VH)rMohp(GgD9;rpjJO6VmO4N(XuGiSiCtIl}Efkdqvg69?QQHx-<2!?f6)Mc!g? z>VXsLa(g*8uChCu4$<4)9)}0g2lwllDix9fxE#q{0QJF&Qh-`0n6pu~N^Mh77Q11y zr--X#s_crq6xyKWLd_E^yC5gnT}D*jioDxPpb$)zow1tB4YzZm3e*WD3+~l%xshW> z9Id_3R$hXtVFwh3+g^frZ;yHRaE!UK9jd&fgh?&WLK*Fl1%D7mTf|WC3MTN^2Eu@v zJ{9VJYh>)0)d7@RA*CXhs|YF((AW}L$p`Z}gQ@Zsl#FucM5k+t6O=QNE8IPZDkC%j z=pl7tk=4V$nug>yxKka}EjY^sToYquDvAU;6;$em%Eq9iL$@7svavD+$M15L zdN@dHBa}F}k;efyN^|j*$!s&oi5seR@V01BNkS^)UC?%HD0dA}?w|@4I*L$PH9(1( zVjqu)PDEX=!|8>~5Fj*GsH~4N0JpS3wi8gaeQUx04a1UH!2L|g@ z%wRKc(}r>>hsF=1A!n$Vj#7o^Yn-X#K9pbk)O>rH7qVY54O!7O(x|64S4>4UF?>ZK z_??3MqAnRIsF;lCu$2SFd__4>Aa-aEQZGs!T=@*0afJsLf&+SHTC70h9pVyNV#Op} zEeknWs3=3m2{57HnL@6mkDS-+OLsLZ|QiH(=_=*!M>?qQy zr6mw_0rKI6+v=cmugFJnj)#X;TwKL?HVp!H!_|;ZxF@m%nsbE>(MIkCMl9ZotmHOa zR7T@ax={BI&C66V7BwB{kZjY?=vOfY#gDps4~l0rN?Dl;x+p`%JtzUiUPufhRosnA zwhZnMn}T{%L&aU-O@vzmAroQ+9_HW@NEo^*?nL3)&|Tt)t20s!975T_#-^+ApY zp&XO1zH_XhVjxPLcUl=5tSbhf>?4Z{%DbXJu!lw)bYC8+kNr?Sp~>420eL72yK^#U zG*sM<9MEm9TytYZUld=l9i~MbEm!nGeMQZE!+K*yE^^O@+Y6zt87g`suP`?$Kw4K7g+_Xh5!Rr{IO0_}0@LkAIXsrZ?$J zry@(S3)(ltkH$8!OIDXGDC88>a7rAda8EL>`Hc|U~ zDLYUrYlw-2rj8Qd0HrqHJ*^C8r_e?c5e-fkiVqEGI?rTi7ji`cs^1fAlWm@Sw*xv= zV?{j_qX!BD1|I{Al%fbua8bF?fK3oZh}wk zTn4jRm|HpQ96unXz>Ee1Q-iN5sx)yHXem( zkZ>|^Z8gFW2uXs{h0csOqR?RIHX4u=Uu}tIZ^&D_E`opqg0+Z|$DYWT1kd)>9e-x5~S*Tj4H`wiLj5y@m4 zW0=n6awfeb{?30ZC&^p&J)%Yp%kdSJeWxS?eA{UsRl;e!gFjtM~aKGVVextCRy_fz@oMZTyTgTon zH8d3oCxyEFNYgRtM|Lf@RleJBkN!=rLSAL4XBsX}=9`-~(WA|y^$fF-?Z(uns|<_i zLB{&h!-iksJdGWM1EoUc%kS?ve+ZuA5sKvRF=BWE?0Q)Q>b2 zN>in~^)~*DxtQNgZ)RZ5DGe4)@~z@|^H=iE>_}4|-YsNurE-bX)BHYnRDO+5WJVj7 zagQ*M)19QP`gu%_sWE#=Y$#8aX0vUj%c%jmq9-RbJzly%`-YPRv?#oGCIi&od~*0 z99=EW=uAfFedq$09sEMuf*A7ME)Q4?!~)~VL`ElKO9{G~ozV$6ynLAWctMZHHgc~m zqvJ?ooanA$z`bDWayKT#5TUfUcgYl5-#kv$q?f&*n%$wXQ-cXIPRkH zHio)_eT7yM4D}O9nmeDNeoSIJphQGn-OW%x5Um18$oFwD^ad}ih9ak_%Qz~$=A)_a zup+EUY3f@n$8$28x`gF0+oq|D*a%x1G7=)P+O`XDGnDEflNla#FK1ow2aCBr1O;g8lxVR$G)G_Qt z)&w+llyHM4o;39_4iIKmG<5_UVU0*rA7LX*i)iXY91U7Hq6G;}9mc-#ypyI55fbpK zjHV7^8<|7X)CZ)B1m`z2bpU(B(?6QpA51*i>!7LkaURij3r)R;&1jo}ruLE8(4G-Z z?ZqV!TyoRY9_)rEdo;Bhdn$tk7frp3i@*u_*oEs0y08~d)o5xb_JgOjG_?c!K?_Wp z+KwGc(f$@qy@NACmQ*yg4U+-03z`bx@WQQxru;Yv;0)4TjrCyVK~q~vT_M{WG_?g= zgH4yFHsiSPqLQXI)rGY=9l18Askd?bWHC-t8*#X>)}g7la6_z_dehVfoB$6@D`@IX z;u>Do(9|0^AhIf@sn>Bp(9CISJ@$s?S2VQ_mqloPMN_X~H`E!@)LLvtvv8Vv73U&2 z*`}#ABy2mW7Ow=8jCKxb>SY`gto&%|B^*L2EFfv>MO-irD9Y8OU_v`;H1z^jLz_c1 zwF>)&i7-vA#CqY46q;Ir;~{&VH1#}Y5-(=t=B{Y$DOr6F7@r zsC$p&IMLb%0$xmN0GYzm)MMBh+*+ckM{y8jeMM7`;ILt@il!D}Bdp?R>S3%y))+Lk z5C@KTTxn_nb|Q0fnwpROz>X$O&BG3GA$5TZx|%BN0CQZLnv3&{7N#@>J1b}eBHO4m zRe?jst52GG2xmLA%|TOha1bz4rKtz8UOu|Po2F*tFbc?y9ZmVL8{XHXsRv}VTng_% z(6fv%pu%<%>_^h~8_=8|Ei>quSd7->9(sm=CgxD#r(<`t4@TdIjc5i;Ps6HsuZ^Bc zR14@S*d47w>B&S^NSB+@5-YUhM0>F{v@1hkf7=>kk=c+Z~BCy7G$tJCA-(7r~^%7wOJe`t%4 zz84$OT7({l(?fPL>9N>9-aVnmUS7A_xtHySPwRZ>7H0GxSvVq;K;~glfDgG$i^1k zBOdKbMC`QF-EkN&>7|um-q9Vdv=t{2bs=;%4m-H#M0dk!2ydRyU9o>~rMr;gge?y* zeJeKOib;3IX1s`}JK^k3@z5O!U5Nh<*yw?WB6NG~+$oE0hYg)O(pflis3Yic58akT zfgX*}ZGzO`2TgQqoOtqBf^LP?@RlFll5pvE)3;y~?4i<`Sea}%(JgTFXz@>HU?bX- zq?;2m@P;tm42Op|zv-sI{CengY=Y?t-2|t$&_k!;GzB+BXbV<=L5fbrv`1_Q(T%ZY zaPNRl!LgOt(X$b{5y>*y45E{PZUDsLkWlw0!&bEj z8>VKG3YO0f42!0nvcHwd*31fM5eaAfCtu03Qb%0J;KLx0B%?Rs$0S zy$kH?aAyu-PjL$RJXqPA@F3tSLCR}L$L}Cdh?oEk?zDUnt^YU5zsMKmZ{*MAv+_y# zWBHK$zPuZD1ghn?9X`SoG3UceI)Id-jxE< z+tPaJWod=9R9Y-8kRFomm!?Q%l0zCV-2-O~21HA zlj)M_3)2}mb#TbE&$Pp|)wIF1*0kER%(TSxh^fjn+ce$eHI|!(qdF zhMk6L!&`>e3@;j%8=f*eYM5tu&@jVLZg9eBhI*8t@=*-Hu?;`Mc+_gM{k7l7=N+9vfs1cu%EK0*dy!# zb~n2Xc6(lDUtw3W&#;fP3)u>G7CRO8(R4S`n( zyiDLF0xuF+P2dFrs|c(lu!6wz1eOz6M&LOD&k}fsz)}KF6L^Zi5&};Wc!I#=1Qru` zjKHG=9wD%Zz{3O<5?DZBK7n}zstC*_P)VSIz(WM)5O|QlYyv(44-l9|;C=!#3Ctic zodE3YqB;RjoDfVUFonQm0_6l?M<1!cQwjv|@D#x$0%ZhXa~%ocbOeG@0`LqB*(MU0 zK)^wum_QK$c(Q>s;YlF^cr=0lP7oj%PrydtUIOC?j3qFJz-R*Z5V)JbT?9rExRbyg z1V$1VL0~w6VFZQ}7(!q$fk6ZY5*R?BKY@M(@(A2cpf7ui$GffZ3wg`(277y0=E#zB+!CD z27%@Tnh|J9Ae}%H0%-&+1X2k!CXhm)5rJd^Ndy`aXh0y5Kz#xU1nLo}OP~&ccmi<* zWCCUa5&;tdBLM>ek$^yeC%_TV6JQB21ZV;}0u%=3Zvxi|{6*kT0)G&=M&K%e-wFIi z;8y~_5crwE6#_pI_>sU51imM5nZS1hz9n!80mob||K1ojZvP2gPuy9n$gu!F#M0`CymMj$}IPoSE>RsvfHY$mXYz}o~i5_pTi z1_Eyqc!R*}1lAK+N8mLAYYDtcU=4v+2)s<-B?2!JSWVys0;>qDB(Q?O^8}U?SVrJE z0?!h7hQLw+PZM~Gz!Cya5_p2Z;{+BHc#OcK1Rf!4M4*s>oj?JBd;;SM*a+N9U>t$51jY~;P2e5^cN4gaz$gND z61aoFNCG1W3@0#*z)%812n;4Lh`>Ms0|@jd(2qbKf!hi6CD4aJE`iZ6|o^n+dNB2yjo6OVr4(2tCM;KaA6lhBU|{TR`Y0sV;RM?gP3`r%jxR`{=? z2nGEbFush9>`3zczh@{|_aBkB%Fn`pfR8^pfR8^pfR8^pfR8^pfR8^pfR8^ zpfT{@$3P0lcA(i9FZuKGgf}x!CFnkC0E+QK0T_@3Xy#S`9aal9_erqV2VD-wiB zAA_)0eI45jv?D(Kr=usl+3aiW`+xs^1**lQF`zM^F`zM^F`zM^F`zM^F`zM^F`zM^ zG4QW4aD(svaZ%s@)2qJ!$JYM-AA0^z#r>w8Uq>w8Uq>w8Uq>w8Uq>w z8Uq>w8Uz2E7zm&L|5`pMZ`98J|8FWgEv*^@8Uq>w8Uq>w8Uq>w8Uq>w8Uq>w8Uz0k z48Yd_I_Y{1%gq^)JMNC$VZ-wV4;nWlXGE{txkQHPB-U~nm^Wzfutb{aB-D1u=?4xv zCbOa1VRBZRc5OP7^Z%6v#(>6v#(>6v z#(>6v#(>6v#=!p}26h;90!7a@`5rK_)Zh3|_dk~XO~IHq2XRXfw+68~i2fi3g19Y+ z?*wss5O)M|XApM<@!cTq4&t65?hWF;AifvG_k*}UhzElBK@blH@lX&C2l2xoeiXzb zLHsy~M}v4Qh{uC?B8Vr0cq)jW1o3nb&jj&o5YGkid=M*wSQ$i$N|wxPsdnbubmmp& zrRGQBHojTr$>vh|clihTYq$sSsC+=)1@{8HA-^mym!Fgu!o7dfWw-2*@0IVA2f>|x zR=I6v#(>6v z#(>6v#(>6v#(>6v#(>7a|3U^h-@ST@5_OrJZyYwX;Cy4TA%pXc!G`9XZ!|VE<9sG; z$l`oPY-r2*4A{_y^NHBdn)31u~jt%jguP-*lalSs-AalN4 zY%p`a-q;{wV^Yy?6f%A382A=aN*uZfmpkUp6+d zoUa=;Fr2R|Hqd%s7i19izFQFr`1!y169xaYKaBy60gVBT0gVBT0gVBTf&WMb&OgBE zIMKKL0aJ4M$?6j?Bq~>%OjaIB{!SU$``he8+zWwArw1x^X7{#wx*SsO>^M3wdT+Wi zASorVWpImtd|Sh9J<{3-Hn$U$rt@wIyxQb@|6PxFR8Iaf!9TNKkLsnlo2}3KCI)`1 zZlJu_ZhRo4)2+(Ip1b{~U-i}vpUm(d?sU}uHr-fRv3|N=y57j&X#8>ilS8&D%arxj z*QpN5#&gdGCd{m_TyEade`e`|>^^sX<-a~*Y~ZEW9}eujCHj=SzFh=TY1j& zMu7LdWc_^2l0eRRtJ1vZQ2*-hhbr#VtFjmL9u|mCeJRk)x!SsEb|COp{igyM#wz8j zP0#s6PK3Dd%?h`oYct&Y3`|Uv6og0)jXN#1QU9$s4 zS19H6cJWGwos0biS#^}pKfYHqP2H({*3c1HSoWTEU-?pNH|0#=oPCaRYSlyjge!?k zk1i|y11=s_ey|O3_(>%V7mUf}e#L)qN1 z%l^Bb9uwHI;`i)dzjrE^+m!mtdYn|QPB;_j{8Iz#^%o`u?)`gDw=*aATH}U1>7UrBpPhY|pI%Zo(0#?D%7agSW1Tot4lqkzP#){J*xFKR9N0AD zRb}-Z8?2wW-&W4NQ*GV%^bu>F#1j8Ik8ZCn{;r2I>cI_xYp-Pmj+*aR#-+zqA84D^ zElpnN|7~vjYHNoH$|623@KU=I${RUP1c6Fq42r^%I;-LtiNWi3|!e# zPZ_iL(LnBpla;HtR4DVREBqIeW#yrqgzCGcCCbv2u1eMv$$H=BqQKo3HUvIieI+}m z@K{yG^HZ$#-|_@Ld^;;}&kJuT=W^c*dj==Y>Pp_uqi z$_F~e-?@h=aB*3a0DC<_Y5DmV*3N_GS1&#{$A9#zHC8^BUh>~x zL@D27@7(%wQbzTqhv#PZdf<8g>91y0KWn+5tliky`esIA;L-lPa&+eDK(9Z$`A_ZK z894BlG5fpvgOx1#kpG9-vy_ILMCJODuFCYsmng5rt@9tMK2yDP!@9s*$&CYx$4sp5 z*_=caB7)H&PGpSUGoS$p`jb^N!VS`+W~B z@o)NcPW6+2u z7S~yB-Bxcy^@%3G`%M{1)(1UXtev~I@DE9E8W?e;i8A`y9ZJ2mO_h^hcMUxEdqwtR zYwl1+cYQ3|o3y6dLY?zJW@#Ge(!DZp`f`=E&5D7_{regOIz75pdG+dA|H0SV26End zD9}Bw!n*vN$$GBMiNOBr69VzGUQ*7_U1(kU#9;rQx-#Y0C9?xvX;mRBZ zhPM>-{=ZKClY)QRpT>a3fX0BvfX0BvfX0BvfX0BvfX0BvfX0Bvz<(eE3?qt=twz+` zVCJfVI4_9vgSa4w8fXk?3}_5!3}_5!3}_5!3}_5!3}_5!3}_5!3}_5!3}_5!3}_5! z3}_5!3}_5!3}_5!3}_5!3}_5!4E+C5y@WorX&PT;N||L}jhecFBCcU9_+xb+WKyDj&=a@6#sb1qR8uhJp=WnITYYnC-^}jskcP*U|n4qxA1FKIc zZJ%9d&1(3&^^50=m8IMX>kq4D2HGEh_nmI>S>Nh5$N#$jORMsFivZhpm(?`Ts(d`= z(ZDLtqe_S6d?53YPRin?mC89&hBE5jSNxY=nOyx>^XuI%X3w!6{d!X1)fF#V7w??p z?>T&a;L@ywZtdK?{4f8!(RzL9N^6Vw4CPG6r?-Cgxkr(Ic_Oe}zdmsHq>O+mIpA+_ zXpJIVz7)u6cg_0OwCRCMgMQokcem#P53E_KoO2}lPb4?>f6z7~KxOr_4mR9gZE;Nt zjO=~U&#byfS^HPV!1BC`z%}beYs#1%%A)LMfjcI=U~QT_Fwn2{EdPCDW-HE5#sqde zcw9;OW|FdMMsD}V`S#WwN1yc%=rP;h^Ak4v*=DzHoxACj^1=qoJRj3OFl%pn>wBY; z0>>^jRT^9>Q2fP@TC;Zy_y3Z!PMLE1`oIDIcU#|YHQ74-iS__&W|NfnKXWMQ+ZT;>shjlZ% zG_c^w1OBqhPxvbz-mh%_VTXUugBPmbwM`9Bi5--HVo|PE@zxxwwf{?cZS~>CU-(~} z6CcQZ?!LgJS8|jsJ(2^R77qy6ri}7mU6iYI;GR|_0xLKJ?Y+)|H;u ztq1O36j)SZ@ULG!-~VRGqt<87Ew1+7*TK54i7D{zF;+SAVP^Hlmy-f7yp<4WesN;p z_;a6FGyhChHm7pR<#tI*gTIahURqN_g}V=r3+Lj;|YF~rwx^sUVUGhXi*IAVOp`a!R^ zl{I}o2@IIqC;NDyo^oOBvw_Y(T+V*3+gHL@mn*C*4lvgDp1u%R)pvxFVM|l;J)^Ay zTYl{CX+N*@9Qd36aK|Zuj^e!PKRcEw{~txy9gp?fg|kO0qB6=TTU!a=`=DebGgP8d z(vXByiU!Kwt0c)@p-AC-A4yh7Gzg{g(@-j_(xCTw|9$>@KA-14&$-6AuCm@~l3%q7 zmtA&4*|!7WZNDD-))Sa9zJu&kb3$ikDLHD83eUCPl50zEfzXREELtwfHdH+&iF_*{ zt=|YQYb0TV=m}is{)ifj@#B1RJy4#TPjb!vBb)7#7~>V&;C`McRb5dGuihv?pZ_X+ zWi$s$#>~l~&^R(v-+^}_W>{-i6I923c;ej470`q=#7S0l6B}S2~WR4 zw`(V|XQrpAnadQJ5>>-pJ52CQgCTJqNY^oN{Eq7zkKwHzD?I8NPXg`UQ-^(pY);%G z91F0-o8`Iq+tP|!+ggIA>SLNEBY^davS{?l4#>Vl*zlo{*6pZAw>Y!%6wOM){jdfd zd}J^S#ORrf-$c=@nJy1_$2f!xRQqw=rov)57`5~j`8UZ0f3lNdji?;Hn07>F@kxB3 zq=2~A5!YLNp+aS!Y5MC;aI0t=RS4mNMQhxNjPZQ1xh#NIdqRnJxCxXV(t*jd7G$%4 z0~^0|J2ihc2c2qdVByKnbjejY$p52GJ5C6Z>%&oSNr;P4SP%y{wm2Zy!Xv26>kIjk zl6Z7wCU!Taq51a~lv~;e_CrP0ZiT7XeA1e!X!uIm3tH%Il0?-NmZ73k1E}%3(Sxb6 zFk@E)oYDEgq)CNPN%Jo9ZksW4zf=;AYqi3?YFD~iO9fkUo>XV(+kv}&7EIW6GJ96V z(cK_!%9mr(iK3()u_0lOE^25*~7gui^Ms$+%=&G*{E z_Lv0YfiEIVt1Shq7p~R8&z_UtDi3g>PdTHMm;#{!|1rg17NA&KKJY$#L8|(sZ-y% z3-enmUPx~ z2TV*;L&;1d@?`EDHaYhOQEfSlzutbMTIECJ(Xwjb+V_IawYGvCYb?QHrXc)RsR5Vo zMA04FRam)2K{UEg3O4pf;e``rgnO1Ob*=CL*{Rv+vSFO?(0=-1xQ{#&dJEc>A5i?e zCf4al0@I;~)bS$JH;CZ5vIkUMv5DwPZKiWepOapCpN9ATq@n@$=)Vw4P`zpk-+o0B zgQZKbGa!<-hIr6=CtfO1s)}pnWkFqMAKg%@gp)iI#Qa_@(afHU#x5-0U3DI>NCwbf zR*cH}vUYklTT@Rg`8|XmC7^6`YL6*(WM4@@7NUxGQG}1Ua zM{Yd?8@NE4&lIC%-$cdZhslj4!g?lK4B*lCXgra96Ix_W(+}lW*&eSx9M8!jcbdMF z(%IWk>gEJJ*Zu%hq_yE@Z35kDBTUv0xZyL2cEtl#&wP` zj`|E7;OV_`ayrEZJHDn- zzqB~Iv+XuB)OVY`;H(C}LiN#OD4HG#%7kg_8?Z^R4h&x{1CMVV)UYd`UXio|%hGQ4 zN;Tq-h5ES4bTLi$Fb26Li{WI(dXUYz4D*-S(PL#j#BM|ypP3;#-pIv6Rx-p|Ac7&JSD-A zd(faj1=HIE%LnhPqNINSTBR#7WuDb6nJq;Vss!+0ei-$-Wq{>R=fLR=Jm5P^5vKSl zDRf5gs$PX(uJqSnS0MyLO;a`f@Cc z*oFQIFYvAZDfDtpf)6i+@s(vPiT@>wN^z}B&HEWJaC`>U&^QNcH)Vmc(r2otm`6h1 zH<{cC&4k6sB+vwr8`}Fb2OU$TE zJbF~Fz$d~!v{OV8>-hB`(r_tmf80x>Ps+fofOI%g9fOYUsZ_h)1S{?rv%Lpc4D-$c zP03}nOKbvP%@@V`nEm)w)(qUX%!jqnWdN3O%)OI=sAU^R>#7>q&%P?qIO77_#GTE^ zD_w=&xQncvtt<%6c}!O7@z;b^&4&~%RpyoSOq6fUhS%`+o{9Sadgc}p?IqlS}qPU%NifRqfkC(@t4CW z5uyz%a*~N&PYN7ex}13CEr;S11v2T?Ppz)$a=u#%_#DuLz4ymqj!p=^RqUW=qRLV2 za48A$-Gth0lQj5z7@Usap-$6J@WWs&5s#6Fc&@kf_(DlE%bz4C@`q^23xcsnmcY2C zHWoiVhs%x%V_GvmeCv$E?{(8u{Xc0u{S;ugNF^s%U=h|VP{uo}cjL}X4$j#08JZ&s zuzzVOe42Fu|5|i`=syo#oNbE}6)p7PST{W;EyRfKvV^xh>Y>(lF~nn4C-LDoz=7tK zkdwHKeo_=b^Rq8;A$KtC>6=|+*l-mS@72O?odVPxt0AqY=HQFh3-Pp>GcEb!3F++@ zkl+0}-j=$JGfeJbo#9MqWzSIo5fxhcBn0hJ66t)UTaX`{fRBZ)u?vP5((yl;qBfCw z5TMu&tt&g|jyx`0!mELs_#V@e7Jg9I?bZF{%Zo*$m#L;47u5N2VX+D~oZMbZzogE? z9+_?;Z&AP`c~6kTQn|3MgQc#Y^N9t20qGnG#g2>^Vx*Fd34P}{83*CGZG9N1uL_1! z$-#90^)xbDb&|CnD`E;Y&f%?=NL*&#tn>6(J+p;(DKx2i;o%ZBAVo8YpcVt}&Uba6 z$s17FAUA9`@1fHJ0@(JS4Y_=yln%?TBiggVL-oe5g4~TOwE6A_YVRrsikg~G8n6g| z3z?lrhFrG;5@Gppl1EeD+z0q9(N4HZ@2(?X>ps6FzESem<&dgl??d^!ftzB`8< zuG?_vY#)|-24n60DYC(7HPif|zq&2$J+T$Ch85M$s0hEQWt8*(8x!OzwMs}@q!|>w zD1xVNEOGiw0Hd1OO&*Bwuoq^o0jCT8@ZNbRKJmOsRbR)mT(^|ynd)>@-Ydy$P?}^` zjr?K*^IYjmOItc%zyl)+&bV-CB717nb;=mKg78jrbU*Dz{RXzf6JG`F{XGmNi4nx9 zR25u~cQEEd4Rq>BCX|y)*cWX;pV|DZo<5aEe~kuUY|tvG9P`D60TT==xiH!OPFOH+ zh`N;?g9^nMdd@cjeJ-mJ%|cD6iWNkvl}>BEsgT7Uo`B*B@ZRn_d!b+t#E6?v?p=>? z9ixR}?#-l4Gzj*;-9S_3ZpDI3(ehxY;!3ACyqNcHlEySIWXE3#<49ybx&EyPF^_ww+>87>i8T9wu zJ><#`73}mhAyxAS!MCjoX6HFjzae{8zAB%&!ef9-vt@~7p%F>m$pgo>z9#)kJ&5i$ zC*p0|%8o=RK{1n0RhpgX=RG0#*vS|UKNrwT=VaBy9WR5D9d&F@`fPYO!x=1{8B+07 z4Ufb}g8pzR;r`?WAG|t2-PjEmEO|vM_ol$Tb7OR|=U%+(YX`S%-jlzF)}pBNYuci! z1g2}nFfsl)JtDu3-C}5jCxabP6=y-!{0y8`w+fZ%ab3Om9ncy!PWB`RP|M!=D4`Jz zUA_xIQI83@cM!)C2P^6A16qPk@>7=$ty=T=7CuWmvcKEkZG*TCXE zPAHynf$2#&#g^H5LG%3<_Fmy2^GlhFG(PbqiHEnLrlT1(zLG^W|8rtCw-pl}qh<)$ zKFD&1?$E6|d4tr=ILwSqmC?BgcDPXL6?QFEL0O+0AY8ZtcuE9oe6B0%R23A`F->#2 zUd05qd{5VP`D;W{EziMlR57+qo~6>SZHVs9NxEUiS0Z1gk1ww+gfh2&(i+!-1K&2` z-t=_vzTZrLOnQ*pn(s+7BTF4UD6?w(A$mux0ya~Pz6rg=Jo$DHq*n;Ae0LL}a4Zdj zz1P96k?S<2>;Ro7un#78TBF=n93m?%QXf=jAHK_yPm%(gM(6Hb|a^uYvJs zB=hqxG3<(a>=Vr%NMl}NZ&nOj#a2K`avKbeyaF?euhi%Q7aTkJoocHF;|}L$vT(UR zt#6H`qC!$E^73J7H!>&v%JIODNEG=!7p~|zV4idZU0YQGBSQS>nomiRdK9T#Xj2^^ z<3ecUEO?p!nVGMefVYz~Nr|Zg`e-MS!UiKO_m`%AQl&bbUBmQ)@&rvNeMi5kRv^!+ z%hWh^jNRhd2kX3JsQ%>z7&5$xRcg1u*pBn$T!RAqzTSxc$@0Us>KAC|=Z`@m3-$OF z?hs$WZ6ro)F^+q!q_G*tf%nTJDAMD`Bt9RU_sy4RA>VCL*fA>}TCZz^gY6#FXgE*m?#>~Wb6V(p!v}Dq@;&_7 zt5!YppDVNG%W4Q~iK6e?eo#J-msL)iJ&6>*3b=mea3!(na6o>9b&po3-K3 z1xM);&kyX{+8Lm-%OClJLNL$l5cxN2E}FlY1J}wQ;$!(8wEEs&s0~<)61z8}{45n% zA@-1N7CnlK$|DJP=zNU4u>y+L4^=XHoL)QYPxLDn@ll;c4a$zIt~JPIrHy8>{|SM=7oX@!kKZr1E^UCY;}ZM=w56 z6i2PCedK{m1qPO0q>C;7BfjV7vX?ivun%8sN3Gen$$zgU%d>n!ux+;>>2$Y1rDiSY zZET{mR&Kz#&pwf7hT3G;rZyt5V-MaKJ;2G#aw9nxQsMCVUc7PQCgGW}kuK|vB0n4F z>or`C#uXgQ#JhA8TeNMEWVmjG{#%DJa}Z$lqO*{BNSBPR3xs4@SBPEwh=ju|MmESuDnKaH4l@fM0uua;aTAN){eVgYQSEdwJ6kf zhHhY9(f#$?$*1|>Ven%WXv#%mw7(nr1tepQ_(Av_98K|G22Om?z`!5&B>dYQ+>jl_ zE_ozDCvzVVJr6~?wOs*rgD-wPQ$&bkDIS*$0PTa5G}YRJIF5!>`&Z`~Gx4pUQFH^3 zKUO1K{a2zxm07hzoOkDg{qQ>O&DO8M0M(ca!^y|(Cs3Ncd!<_)n zM43WoQXLfRt za~iup{DT$_C*yA}sb|(?25UEGYc0{9kLNrVpw0zN^cioURUkxKZ8DkZxEehDGmJ(X z2GQ1|1`x)<>Brsb$iVHbWVv7?sZUg8V);{v&V63^_*5Qu=_~?~fn=0jbd&CXvV&@b zPf%@1&gbvCFzoIfwnyz2+py&%Iw`g?BmA8-_HR3@R#1$5ir#3MVF?%WeNc_(95F78 zt+u;o1?rhM$urKZh9jBSD0>0$Y8;(3Or)EH>PV&J0^)r*jSlIS;I`ho?_N6Z-4N(q+$k=+|;_Jw;PZM(g-aIO;A67qeH; z^*#$=lfwtrcK-yEeZ~f_sPWdwyM|DOnrfo`;4s`t5rfq_YEQHv;L0t(S0gB|jD`w2=qjcVU(PICUzg&B)EZG^HZvK*Au_U{ALr@#-K#W61qjl9ib|Y z$YqAV{e!rDkskg?6~-bCmz0p|Mn=}kVb1z8a$V~o28sQm{*8e| zV0QslD$NFy`oFq<|0-yoT{fKfz8>8k&*EUycT9?>D#)ojqLq3K92UKXmPV&Youi0e zWM&)tU$PEa>6s;DdP$9*8CAkpXRhNDiI{3}kxeiW%?E{sa!{0~KvpMP6Y0Ae@VTm! z^m^tpHZq+w#@3U*P?7+$Ll&&kpMmfqeU>N04)!<*fxws!r!WJpxG^cx$RW zOR4IkG05brN51IObmSI41nTzFcZs=dzc3$kwuR!#-lKTq-WeE9Yhe_lWpM6f3w>K+ z#c0-y(;d@duyEHYCT8VP{HEAT*6Uxw&}Y`L^GPYLE7=R(b~kCx!LMYln(5wtk`**>~IM}688tEHs~`kNyt=R&Bt?3 z&QNtNEvi5Go%U7A(t>e5EIFGG-|eEIq^5!TpPx(5lpEqc^?r8BdLDG;KA=KE-0anr zcI8XbGYI2+k1e6YY}G$4s&q7!Y`^~pg``dqP&Lw~$h6nJ-+jPvB-bB`_a(<`lwv(AA37~Yg z0KN+Ehs^pAB6KwcXBf+(!1Fi`ClJgoPxm8(KNRrg$z^apG=eIoCVSuZ5#uZ$rzEoA`4B!Sh{uScGY){MVWY+pa*3 zA4}MIwVdq4w)Id_l?u?VMb7_zLSJ#WVE?O!Y?tOQ6u43kE}5bz*c}b?pU$9*W~b4v z_CnMvUk2Wi%OI+L4?229(9^|Y#B={LTq(ifm_CMp&Ta!dW4>WHsqo^ED9lPY=`_h?o zpIj63>M=phiaAvA$9_D_Wdqe7KS`YKDACUP%dG#jlO(h($Gst6h?43$(7AsDi%SnM z&j#hGqR;>}n{vSo=1!cy%O~`o%Oi3ve>OhAuVi=7ZaVZ{0N&_%lj5g=%<}kLbkU3@ zLmzcHcrvMa%CZT@ih0GkfSEjREHLti8bX@DhY&DZsjnJyiFx39}AbVlWx_ubcDvHOhWMli_mKW`q_eAo+Ys~8&p$~Xj;&dPgEJVfe%B*;LcQlJeoSDJK z)JKtcmrm?{?g)lfnrJ4~OpE-RAwRE{nb?1hem_tQuT?hEIak7&)1r>Ff4>}F7;?l* zY#@EJim#?M=e=%1SvAep;Kn?;1H`1D6CJ&EA;f1jtJ7o!GOD_us>(|r=9+>m|0>!g zL#dzAad>FC4J}n=$l@$#nrD6zH{U!0dkT~2T-O9#k}sy`+Zn_j`tKb)H<6_ZhlD}J zJPE}9v_Omb1B?j_)*WB$Li#wpIs`uGR4zfT=Y;~tQs z{0u1jJR~XW;>m5t-LR$kA*npuLtUH~LJ|ohLZ1cUU|liDX#F4-OV?1h-Ce|AQX4|z zi)q_&9#FgciIy(8LPTvsP{B+c795)-(GJOYR3H!gg?-RaJ65+~r#$X8e@P|puY?tx zoz*8Xi8R)pBK>3E=y&r+sI&SVqkP;27P)pJkLxeps6~bl@#i0DyY~{6JqyUG{$HfP zU9dW6w=KKlOfEUsx*9jf2GSwvJhq_wJelivm7aWSg*OxqqlMvK=-Dj7$?%myQ&y-VQ@6_I<&(;a(J&LrV8STH}ok|q$ zR}nTS5E71kv41jEqAFzUS=jf-_R_h(i=vYTN~-=Pjsl*;#6I@g*}T zt%A$X{~>jM_*pfh1DH6W1@AjJ8hz|MNYtE#JDkqLk~>E*|1du)xN|ti?-%j#2SAmZ zO6cxbj5PrZQN<=7P3Nwsq->hivaKNrNegk3>nN>U#|>pwRZwKO6UVl#^W?47aOR6O*np;1iKS1?5|rw1fH8Z}!UJga^mF z;L}2Lm$l?D3;}20h)JoF=hiUdu4-7I*tjw$w*c@07 z-Me@}bom|PGa!qN+VR+ael-TQ8GG*P#YmXy6Dx)B%ftO!3g*3^>s zZ-QW{yazLQq=lWeZD+N8pC~Rl=}5Q(it+fzQ6d-jg^51E2fO9G>FV%Cd|;Uj+Z_0? z+BcT=H}G?Cz88!RKY^_=L16oLBQcLyfm_voKu$+DYr9hewa-V=155HqK=&K^d2;{^ z=6DJkw(ez`L+91VP9@>!>nW0Gije+J3s!zb;;M5W>gUR0cJEfK{Ur`nbF*;uAr%^% zmx)gOmw^@B#csQ*4|#tQNqbp7HN1QV7Z>gU!7&jm3*XHSo0fradk4QQH1mU!>}aV8~r`K zv2C+EYC8F0XXi6ItXs&@A5P#vco%&UtAZX|7tqx{c5K5UZOY>wgE_~HF*81n+H1_9 z)FX|AZiy$#+mEC6^CNhBPbTy|ctiR(*%148k?c&Va{A135e$hwWLKG~;~)D|)WU+d z#<}V;9vW;T%mH6`++mK&Ic`|`_&aHmeS^o3t*4#F*`)3C16uwv5H3qkRzHZ0rAlj; z!>B_ed9?Q=?)hy+aJN71oerQ2{P^^Krw}}8ZVN7J6>;&SEK;HViXN7-4Eu9hTldS? zhcJ<|5pjQ}Zu@HoR=uE~^i0l#V6hUIxz&+YCUuhF#&0CRoh3h#X5m;1M-%;akrbdL z`Lpji`D1@ecf+q;SgjfeHGNHFTZ|33sU3j@)!Tt^@#2(04ed0|qT}<_AvE>`310Mz z`V|$iyIOllg@q@Y+a=RkBp2pxOd>dZhU{(?hf~|4@vM{s@p(TDO7+uJL=LIytIIfl zs{qWCawq!-?&vn1+W{jhPofs=AlI8`fcD*RRre($KFJ%Lw7`;+2y|4?$&&hGLw>HKnEd_!U zV_;F|QFM!KW>T)l!u`zxHD}-c=48@uK>q!Q@P*Yf$QMun^UMzB;QVu_w|@`0=Pu1W z=h*@gmm3-XAFF9;Upd`yE)_2el@Z^=yFtf$i0=DU&Fl!>S^h4QV5M>m4NjDYl!E!V z+|iJEeS*Knd~+%pETv@nUL?4-Ia7n+aI*1!GE>?#0J=JJ!0U4!^;?#U>VeVN`}#I3 zJ`ha;y-KLvwR$4J7lHaQBb4`tIv=?*$ZvY*?H4lp zP8fL=?G8Pr{Ma>RLR`cI@mpRf{ph-m;|-{VZwt(zL#KfTi>0FZ^?Gu1ZUgDX4LsU$+A8M7WJlLp3N4f|F0w(s#&3GxDvb6s1wEO_kiJ76ynHw0d}h*U_J3*)Ao@wR9fX zP3_pcIJYEnlfxwy#|&N0{Bg1 zA3RVmL4nb9Jm0#O%0dKVmmf?&%gx1#S6iWcJPWsLc;StPK{nx)J2S}LjPL&C5#h`u z@J{;;mFVZkRE#D?%XM(-S`PX6&W8?tRKbq3&FuKID98yMXS$wcgT&S%Y95gex308P zx$ZRj=i(!1yj4$!Kfb3cD>spR1qCo%paX(a)wH=>4=yS^B?}WK$Z07#);DWC82DXd z)l0Z)#Q*#ylO9{3!o(d;HI+jVcOW!}NI z;7y)lB6!*!?k?j8`Q7=%^uPIxhioK7RmRc@>n^(L)^Tjx#gFS1m-fldPdpncJ7ZqbLSa=XbUyhMIH`}pk7(X>Ep7i@ zPg84+;q`fa#yubl4p>@+&G~FY!(|s!pO2j+*U=jW$NA`9zK3Mfizhhe*90wXGDi8W zTTyNF4OtpJ2f~;c>|{d-wP?tud~T`ucI{cH&Ev!52q73Xk44vNe@1a5XXd?kAoolp z@UO8a35eSb-_%^lwxCg}bu|^4Y;O8)*DKPbyailhV!^pv47#p=C#Iz_ONrRCY#x(JOwOAs#qtuF*S`U+N_xR`&VNKeyEdcCRwy%{~w=2uX^(&a>FC2vjKvMbS3rJqar>2UFKH_FE#W z+oqR`S8_%{q&keqC^_QOC+;xX&5tEY`RHBTMf>J-v!iZjX?{~a?(E6JzE!krt*Z?l z$gyN!bq%7lKoyQH*g^IseIu(X_YmQaVfg8lJc^|H(uzAh^nH>)wcm1$FxeMyC?l0N z?Egq>a{|dzcWJ%j%fjKsy?HP=&k&Y8mqG_nfbB`c zO?P*|?ur$VF=>L1<)$$7Z3)M(qrp1eT7nu}TcLt8Cx)*_!CW~LxcjvV$j(jH5o_`%A;JMxkzng%xCCp)9naN1p#mC}m3PJLMXu`q&3U;eG+`7?PFdg0s*|U)*XN5wrni}0#ZUDm^|9{x#b-2U& zI8D5Fzp}JU6?{*{kp|Ct_SW_qnmhfBPO?%=R;C{8o zUXavMz(;q!6Wt@%P~oEyPR#41P4|Q7hij3{(J#fI^FkaYEJI;wYbLq70`X?uC2GMj zz?7Chho+q=82*FB>vps8cj!61&7BOJr2T-q`7rtjTA+GgB_Xp+klP`Z#?1n|{=D*-$O ze$is-SmN%n7%f%>qRl=V&>wxr%uL$?%S5%{`@m%?6_rQ@yv~#AjBq$|xRE-Th+t>p z7^zqlPj+}!kc|pEA@5{1YDsjWNdOmpu(b%DydAIhd@YBqlbbP&#zJ8IBz`)754l|d zgP-(cpsznj2Hawp8+>>|GL)8S*AY9dIJA8e0uLDlD(ogj(}E>od;AJ&|Fx1T=dMMb zX^-ll!K+Z6;fxJN5%k!fRD4u$08T7?NqV=;L!ZtL>U#DoD_SZ8j@PeNt%`0YLfLOC z$2_~?t$;B5b*?1Q{(XRWZ*E|RjbrGJcW1$F^kDegf<|KG!Aq1k7NKNhCUG?H0Hq`1 z%#X%GP&V%+-kn*Pp6f(fRei8t@H-X0?txqN_M+d&6QU;`P4zMzVD=ze#YS0sbd*g|3ipAR?WK?1!vlto{scbghdg#w{{1uQU|YY!_0yT@3x2 zwF$i!{?Tpz-pg({--T)laZI1bGN?P=h2ei!>kSF*VKum2*q^)8(9=u>ACwBCcLArT zrP2Te)i)F2Ep_C3#5Zbf^Z-f1Js~;QB*yfk3emxbQqd3sBJ>a#zS1Q~M1MSQ*jBEo#Nr=S_!6L$4j*LlLf+Ni}J9>O6GW|%o|18+sNn!We6@XfsX7}B!ydmUH7G0=$k5y z;LKV7uWM^`Zi<7rWD_X+USzfJ6wrg(tt4bL2S(q|1VQ04u<$>QYs18Xv#mfr?NYEEuY1N8&5wWUY-eh0S~Y@H)FEdIdnX0fXaJ};V+v8 ze{_#QLYg`mn4YJ5$x{IRM7yci>jCDhwL5+kI*pC)?JUo*H7pKn(yVSNXs!01E< zZZn7itD<@`60nF(fr500YjWndxY&Iy&8lpT(VJFkND zb=lPRgA@L){y_fdI=~|rF}SO87H4Vp(xHASqCfhT9{%%#ICy!Jxs4{E_B(-|ym1R{ zhxF0&#zs7L%L*P>6c1`Fg6PZ(VCs1WM>T?QPQ`HoFW14`cvZ{_J&UbHd*Pv=6XU;+4;FmZ z!xb;L<6(o7B!}ZM;Y)5KZ`Jdtyju#+_A`S$s+aKlr3#jA4ubnX^4Rj=WmqD!7V3`% z(l3U(RP5>l!j+LvPo#aIuk;x`ZIe1GZT|wdro5+5k0rB3I}PAjf7cuWs3W>RFNd8XWWmRRi zK}z0CT5Y`=wkoc`qAXiTm2-uhu~_=Lb^&gW*@(S|?m@bGF!8QD07sPGCf^w(ULSejh}s|cHq5yx_@sv15pJkF^qdSmxr%3t74-~svO_Puv}CRST_mXS zl03g91$zhfF;ioUu|r@lsICp5(HAOlA^xUZ9ak`7-%2oV-v{xd%bDK(?Kmr&qapUP za5%Y_tSJbFrEe_h8lyxie$kwYy>8Y$WAlU_Gc2dsUzc$1A`<94iCC!FluyIj;we{% z04R%gQKN&yoX)Oxk}XwX zR?i6&1&5=7=vA44A2V%Ot82ZqWzj#f_niw|{}Dk#=v+9u*aAGvx!`a76tN9_K!azm z#QE>n;g!qcU^`yQ@(auai-{Rnc!RK0&zpZ>DpL=86m-e_%21*?*2U@8nuV1n4@2MW9if*l=z~BNKQs2b2_E1! zeDmQNv2vUsFZPcx{f-i3NO%PpRR1R0p7OeRn!2p@%9)_w8-O)-m!R3Uleiz`MQQs9 z@;CE5el?!~iRUYc&4%lAX-5KCk}ZqRgJT%4hk982Q--Yr7OCAB*-`I|!`%u{cW)PD zB`k+f=^)r}Cmc(Di|e&n7ePQ=4@6bmfsZXkklq_d^+r_bE|q(*Vs?I&pvmXzlU{dO z?Zl5n_0y;76uN;txUi5I{f=bacAaPWL;9)9BTYCbT6x!~eLmhDuf&rlYN*uf1q}J8 zgfbhK*PQp@^n&g0rvpvbiJz@H^4jN;D?&4I%hvCZ;Y;Yb^e+rgVGQYC;dfU*YLL!4 zl|{NYoX2`k6B>HE6N@EeNz5`m>_3+UK8xka86FWP#-fP!4mCi=nj0i5WI2p??I6h< zQuD^~P&{IjPfZU*!SG#cSTkaaRqubGo#*`Wb+0&gpmP?HMWqtBy6zX4tH=+I zZ>W?e^jVPI9VbEW)kUh)f04)}caqw&#d>+yEj%b8P10QU3D^2$Af!r>_K)Uk&#rr#vHxPgU2q$!dc5&aw6ms z_&wjjjw;P$54|YIgV*kpzdr)t!m%8%$Wlhxc^n;QMkI_p4T6Sbj@~fML*pWfX=q{t zF&avvQTaMJd)q9Ca7^O#%=wd2o<|t+DhOhh<}p{)uahyJ*)^METPVw}$DT*WP%*+D zZ$5rUmQ485@VQ=~UO5jNORmDNK}*omdW@z$!Sr=zB_7$Q55`s#bg1(_4HXyS;Dk8c zlmcn!6#2#s^;+VI-a#@)xE7SU6RDl+K77~I0_p)V)aT}MG7T=MG5Z4buDVDnKW7kO z(W6jywH$IngbyAxv%&4MIPj-|rmtQJf%i_6nJ%65 z^|}!h+tEvoIv)k)6FXr3pG72l@gA(&*Gh#S-64@{KjB~g5+-TQezd-GgRZ=;gq;ox ziOpy&c{&wK*#HTgCs7G~Ht*>zq2=JZU@mAWwUU1a_0ffMU$V3$ylV551AbwiB68ka zh;ui^uIKP(kr8>8no4}GN@Asi29*u#A;SwZ$i)xO;7Jb`hgVC5OB%0;#^TjzuBJ$uh~rTQ7}CJi@^J3}<+C>H;--odq>Bs>mA)NsRVNf(K6e)sx&u;g_Epj$2;G z)_w2k-&aMr;1z$hlzbcG!qKOjx+_Vc_!VrH-N|Su-=m_NtZ-WKHq#O#OV->J!nS=O zjALj96Rkd^s~7f|(PY)}efdf9iQNP$-+f7%coK2*_)c~L88~O?WrT|G|oW(6;VVbz?M88{Ex1#kAT1vD!O-PAFQ4i(~gG@v{S+9C?XgZ zi;5~&$*PEtB+a}D$IOmFsX_?cQ&q=Z<>ojb@{h{YAHbCy-uwL544i3ZNtz}%fbf#p za7MqBq%4gMJ3a3j+Et{|tCwO)H*p5kTa7I*_M*E{B78bU>GaS>rglUHCL*2^nTb-m zdYd5Y5Nkjie>nr|TSkQcjp)W#SX3LCNfU<)JJF<9o>*Log#fqPWV+2A1_o?V=g2eI zyAeQSX378Y|Kcast1-&hF*qL#u5M-6dsYu; zUcbqt8vKL*xXXz_-hKARGFP%oy++rLs|AHEpM&AqJoMFf#mibRn3?-FL*jBzh$`VG zA1_-$#fd1=z+FnC7RfVH%Uy|xODXI*{+SemFz)qIWnTqnV>wqXId#{Zeu++@-<>Pz zjZ**e*oIxKXBjX0ml;A)NemiQ&L`W)*5Degizv0O1YMO@k!=g^<0AW$D8@evgk&<| zbG|OB$koFWQy;`5;mGa6=q}36#$U=Oh{Z}>hF;BN58l*A-R>c>@M;dJ6kCUuHFa>* zvz&?C%!3#g4>Njmam$gt>^}YXWc`~S;=iJc>U|D_-uqo7+wC5aoVKKsYhBA}?@w9k@$Lf#4n#vmRU%3(5=RY-2uwc3 zjRp_1;j=i0U(F6BHk>>8y!ql#2RBjCO&QK8=F{&>ldEs=z9frPBI%(y-k9L5OTUh! z;6_~?xLdve)^Rz5x#t9HB6@;3wj~wAu5!VibYJq4?>HRztxPjd&w}ZWrL^NwD*Bxk zB|iFwkb5wPskOQaLuO^f<+!_a01?$RndvE#VCJ07SrcB z!m^2-7&G*PTE}MM(wR!IH}n(DJ){lCI+}pjWE0dxF}SgKIT2VR1TQZXa{6Gc@pYCN zYcN|Fvc6AMuh!Z`^`*Bk^+|4Q`#BHNwzq~%t_`Y|d~uC&-swPW5A#w>8J0+9p2K>H zL!_N=G5x?JgZrPJ#N{m^G+f6UJ%9NzKT{*odY1tGwloi_z6ao zy(O+IE3md%0{*)kM*R&MscxJe5%{?gD$eYOjg9g!_hUC5em6t!n=n82j7dX)L@AnG zi>FOPE=1rMLq&!!V9q895P4a|F7Tt(1~2()Dr$q_MD%`ozv~h{C=30+Hv{4>3lko} zI4Io12fFnvwkY<&)Cw`o^wq;B(|zQ$i7|3X>|-;#V`1mlgW;VcvtWVJWjr~f9ld5q zWAa^FYFK0i_tv$Mb=5~fqwPK}*6OFv_}b{3F-6Qc{+0CXJc(8&I=H;-1D*TrBCLkWZlE6mAq|F}@-cGr}HI^RZ3T=9474?m7!QR(_{% z2jkh^4IX&^JYt1q1lxb1g%z9`rZa5jK*p3ZSeyDZ;ErP^Ghj?Ucd2yTF##e-C^mps38H3|Lmqm zBGf>%ybE`QKY*Mf3Hb122PtrDKwpmA*=bgf*CY?Y#aZ3xJLxg=Y$AfX{pIE^O)qIq zW1DEO)iiv+UsEY+Xj@pmrb5u{z!{c4S7ZT9Wlq@J8P~gj8(f-V5RUINY@a+#IE;X((3`9 ze8t3S(jZ1l*TFyA7S`uX9p~EUBAtbmM4hRj+LMF9ByA_`zCgfrS^`|0Xk@~ROiBNz zJM^Qx205nSiQl_Sp=#$t8pqoUJfU{XH4~+Q`4L2GH%i8!tCOhlM+d6-tPhN(mtz}O6W=T@0n>zO z_|9L6jXP0GU6YMrY*h}NAd|3uUnX-<(*SQ<`w;W0aO@pS0Mk>k^zj#mnonhiu~}Oc zH@X$0>#AFg|24^j;-fG++M&xdSfpavs3i#$Yr|ttzLFM_z{t-sq&*Q9XjhX?JN$p+ zwu)jZY&Oo$_DR9P;AFJZpV7oy{hb||8;TC+-ja|1REWxqT-@(j1@qtQg4IeNGT(Rw zd3H@6=a~00dIC}y>hzZEoAi*HhCU-!>L;mW+XQ*>Rsyu9&L!RlJL!MXJ|wS83_WWu z!6(Oiu#3yJ{C*aN`z99Sh8Nw$Sj+~GFPwybE~R7F`F65yngji#b%}9}n~(qIbd!w* z0+{hHfUUi9kX~?VhvaHHtW-#sg~yWPKX#LMfnMl6`3jR$lK_w7;?O749;DVh zz}kkxP#T-atYx{Z&ZbqU+Ik5dwl1L!?>gaSSptzt?}w{;;wS{4>Ab!mn$aJHYT?18 z{hlh3YSRMq%tmtSo-e38DF-m0#lBjQf_oG;G(}$J7#yQyR^#1Sd~ov-oG|2v7t62E z6|02MH>Qrb=k6mxkAKtYc}Vv1hrslb$29f5F#Z0h5{5q;!;nx8*>kRh3hLg2s7F6& zOy@Y99N348jgI3`tOSf6Ux2UjVnFrrEqD`kkrdlULTXYO`SJ4nWqmi}kzm zmlkemq1XF0QRzk=sOEj8d-B3yz1Uo|GfO7g=3XRC;V>~aoJv>)BdC)Pgq?%txH9!7 zyu$57b6gfbE)oT=HE}qelTN4iABUH!Qcfr);q7n!rf5>czhD6;+{7^^1dPymfmu=wYCFMl4MU02k5_(M%=+@{1tbP7T6fRo{ zS$5~>SB~v^ch(k@V;2L?55+IKg!28o1VIVY*>W8nJlb@EK5f+|&OwVo?wug+8ZN?! zPA%lF#zal_G@g!G7}N7Q1{a)oPq+K3QoHYFu&}`j`E$?W=iG&mPF0f#=NU{;c8<)Ban6kuPiDdUVD1h%#8a;-GAHS-;{JPaK2A2jV^|V zYS!SlIfwD=QGx#^3lNigaR`MO7#wScS>q9muWB$JTfdHM|9O)t+bw|V=l`gwxDRnS zUqsV2>nR_{a@*OhC-Z%eV3)Kpc%&IIV+TWVfrS+W#{PyjM-jN`dV;)3ji;~OmP7x% z*>}fbXwHn;#JRzYDwHPSq z#6H`+2eN$Ax$K=K%#BJ#yxIn)7B{;_oPtw(frWgW`-dE)5=1!l!JHB#7_19{2( zB+u(U{P)BQ=I{BzSbXRszQL1_r%?f3Mo-|V&pCQReHy6b-k@`eyrAfQB9=|8fUU^| zbVl;*8qp08s7({VpnXtn%c5|LdjvOQIZxLV0r8iy!GHygjPI3~#@-A)|-w$br^5?D3jp{8jy# z$gfL6Yxia*Z>blV5Ocu?PgLP(#Zsu;kwm;kRAJ_%I$inbSLkb02>Yi*fw1@|GDXyu zsw+OF@!zM=;W=aEUhPL({+yD%PJtMyo<)Tx5?G-t)%5W7DCThDE?g3@o3TGog?BWi z35LY$UUyK%wjW*W{FjT+|8ONfcIs@p=wr-18-TfCYIHQx4P&yy$*(Oua&z(?Sh-b= z{w(sPhXRCPlSm0vR39MslA{RUluF{0^?@3$-HCCt#i8?t99^ueN>6?3B`&0sb0IiF z-P`#X$=#a@9i({XzfXb0WFD2!xW&{Jact#maUw|n(P{HSp~ibDyzm3y_1-2Uey^$Y zFL&~$D3MH>dmrrn`Jm{}$v7`J8?Ae#X^%`Zm|d)(t2;j9P@fJcF3y8jHI_6`VG=q< zyoY;1f2ivhdGbR&9C=6OpknVIS~+z!>2X_w|EkWz<5Mqnnij;7yRXhbX`m0?C0V;> zZthmJye7vuA4{Z}mUX1idl{HrzCkZdO$LX*Q`zHEr(yD`dXQRv01^&$u>qVL!>(l- zB#xZNjof>aS$>~RbdFJR_fv48_EVGmfGhs^nMgkxM(JL%F4H}hxr_5a$dY;1W@z?$ z9@*IVjmDf0(5&Qk;%Sj)Q~UA@sPsmgg?A9os)!k@1UhcxT!z;xFV&e>vn+IsPqp zd?q(9Z*PPTZ_D8ASsqNE>qQTC&cu#9chI}A4AI{LH*pzRiET!BVR$xd^!f>HDFw9Z zQ2~74nn<><=%>NwT43(zKHalP#iY;w6iya9gDbQ7(6VaCYuJFm_(li8Kc>OeEiT_PBt1v<3OhyeKoKa z*Ej&YoE!v!`;Bq%)oPeX5#zz>bL57sC4J{U4|7b*@quj@V|?s39Txcj!3WkrZEG)m zo~B77Z||g|W5Yx}tQ}nS)M?g?Y4nQeB{q1r4M-QygzL3aVl{i3nD&5loRT;P2N%Zz zzt~mk@}-_;cuCPe;TKuC^)c}4V=*y^NrTG;u9QD_4$4&@o zxZub`#a}8AlFj9&>oTB5?lK$L5k@x2{-Dim8@YK_C4{K_qxD?Q!OAY2ys!AHJ406( zeLkmw?L|o{^n4jj6CWjSR7Oa1n+wtXQ$~2Dcj)(Nvq9mw7N{8<<$Q$8QA4K!)V?mj zQ=5_@WxX_S1#PBFV@zOp_#?glpp~eI-lv204Zyx=1~=;su=H;($)6PiDTmd`tL%@o zP~!|+?HPlet92;XK1Gc@EBNoS9LLLA|*k(oIb}vuZ8~%!X zKNx}SDc8v(2^ZYuC`7mNt;fh6a#ZN}Q#$X#-kQQ=t58s-l8oHXrL8X|$)&kdVI(yR z9}PcZjU6uH(5XMvF!3e(>X-`>r^}qTBm~lDuy~c5%gec+#AAZ|^oQdW@^gnf#u!h~ zBH23KTz46Ib&&==DjMCis+!9niSC0E^;T%y_m70H%4>?uO(c7_h2lo-b7&a52ljO< zLDU;B(AjYe!uZnYnU?j;mS0!kmV7l6zIJ(&WawP5ta8N54{wm_<1^{4-gb!RZ^4tE zN^q&YhAf}RB4$a}c;4RwTW?*)Q?>bxwyoaeoSz{*HhYW)Ur0s&qCMo3syrk-w8K*Q z(=aIUlbNH1 zSHbR!#aO;g9G40wFz<7-NnH3#;v`~*A6HF>7nRinh6-t!RXu8z>A-ZcWO|#c*E`l$ zqcby)a-lrj%*w&6Fe7@M7YdzU#qo#e5tcV?g0Ya!AT}1t#B4s`h-wcj@m3NetIiPn zy9>c2$cJ|NJ;b7ZBl^38%bVO4Ezj-GJmF%;%#DB}_nZ*nwDA3u()0>0b( zNRoIGM?Wv8^&4-&vIimTQa%Z&+;|TgO3X-(;V#IylSLJhRw3W)H7Ln3)sv@(lD%W+ zFu-&Nvu;5K{N*xn8^ujA`oVHg(zFMO{0w-sI}41rPsV+-`eBp_Au(}hxY}_xTJ2Vb zlm)Ul^GygG8h;_W!8NSu#+Qefu_+NVL!uZTj~Hq&6yC=KOO&b? zg@_-QQ0kHs_@6$AVS(b9&hLmv-ihil!lmS?R~=+0$v|^UDoMOEAH#f(l1QT+jBVU> z{I)F|uS@;Fhcbtt98Ln9UrU$CXM!fjuc@w7K|!&@pz~3>{KD&@j7uvQ9E&c)CN=}y$?+yJ&RJK)@SC45XQMIX~FHB{MNYCSI+}S({0>@);V4WGLS-6AR`bAAQ zr*FY=fvanR>vw|gnFdnuZw{EatAfXtPvnySTxf7`hnH{u5QlnK*yTMyR`cIyO+D4f z?MPE5Y71A7Su{YHLn&Ew*Aw=Aib9K9Ymsl~*(Rl@rts_d3a0M*OFH*t8brJufgm4g zICDY*UWgWh+~pWFdb1q^uQ?JkH4D^tvcW&5;=FX9N4gJJ#=>An5{`5YfooPX@n|^7 z?vGKRFAV;WA2)nyO0*0JEV{_P^#^nh>>;)yW#mAa2@Ws)OTI3$!QrpLHPf;^>9H+o zx|^kq(W)VzspPf7_N-|9yX^wqx!@iySDZ(mB+bV%G^D3A42bE6#Sj#mM6I)|;N+W| z^vLc_bbh@AU9orvb`Uv`Fwz8Wu1~uRX0h{DOT%_4LEQAo509w!LNb3cG{{@A?@RxY z6HOe?CK87y%(u{8C;l{*zVm^}(G}pPl+M!8r&M9SxZXgDu-=C^%i+lvNzUxdriD2*p)q$`U1)x}lBjp( zGN+$uz~Ha9)cWOiFqr!awp!<4myZ@c`Pt2kyq%-#CODfn<{pi9gS}1tO?mX1m=Zmb zrH(qkmSb&K8RmUF-58#8lBkc^!zEBgyvR^vMQ**Gl!;6~Rb~Me4 zE+p@tUu9aa_7I03HPmJ1T_Oqo=d(+N1sKhPXr6&;O8_aeP1U zUJ6pLybjuCHyhI@#Ccrvh3f(4(LoC*=s5Y0{f5Qt^^Tcf*ksCF>=8$e$E(n7O&E-a zQ&hiQM_tEnV#KdF_LIXN;upa^<46Ix@IexCB+el#vz;V1Nb>eY>Vm0i192zoFznDc z<(FBMzm5>OaxpT@@q>S=F5nS|J$St@2ddlCK+`y$Wa<@yOl=C`ttq1)Pc=iQduP-7 z=uhNXG3TF@3&EzfU&!XqT$bU<2sfLI!aYyVVEG|qTt4F>K7PCw&EJ{PBjL;OXulC0 z6>lLOk=4wx+^e8un1yj?`S8m9!^lpGVFJCCFi2?|4ZALiv3#nyPD@o!^n*5PDXXBk z_Gi?o*obR{W})h`D)yb5ExtK&1g0iMaZVUnBJ?npr0r9LBa;r%U~OY)J|a#WXf6in zCy;DCXR@lx1XqZr(E<}`&V^TwexF*1vd|`obkqZFnIH6wkvaVLI*sI5o`OS?vGkD4 zVq6lKkH40!hW8utA*16>w80Wt=Hav+wy3OyvIFVltHD-C8y82dK3%MzBZ4-@oNJX4 z20^h(m_F5;3fu`JGZs&wXYDT$!}T>BYqted54KWi{uWv-bBTh6I(6Y&0C%=srfYlo z7_G#o#K9v*_reMx5LqRMrzg%4Z{s(pF?BP!<1Y-R^&@y^eIXu^I0MJoPmt&Mlv#i8 zGW}u}jxu=?aCVU=NC&H;M|dIjf1QNctD`~q(>t>G$$27P(gEc)Q|V(jbI9Df5cJ0l zVL>P#Xzi>Zg6npIVE-(*dvJ)}PK=_mCh~f+!_mx(O>5wHHXjeI?dZe;D{9tyhw5i> zj;CZB(D~d0K78)bq+SN8!d1ju_50n5{slEcGiLoXnyKA z2@;d$&NHQ&J_7~1>$Np|wr3NbwjXEyyLJ#>X?M~c4(?P?>nNtiSb??NBosO)%*+qY zq)T^*>#fx+r?OM5;HN?p2}tlDwXGUlMl_OS@mp{X%B8SHQ4SZ0loHpZBH}N4lJ4-a zCN8Wij4#U~uT(>cq)R3hxG^8K<1Vx6GbG5YnbK4{FopDZb8`|?Bgk4ilfK;@3GbC; z^f-GNJmjB@Z;w2pJEA!5$-tJdDnn$&Tz+)KNRGb}$M}If_UtziRBF#aj}^=Dve5ty z*72c^8~ACSJm*}}t@=qNN4;e+xU`jV6}w5N@2{fo6wYA% zNdXMai-q*pzuBu(m(zv%iJ0Jigv$7TAT9H`>{N!U?uYP?M3Mtgp1!|H+%7M{LozKe z-+d~E>Sm+CGkx0MRl!V3bRec{ImVNF#+R?WrKTG`(BGCrB=lZ0YdYf@2E5Zok?&FL z&s!O6#Nz+ZQBIT{UC6nce&tXnNk42hu!W}?n{}M`d4plIBG}}|WBPX^nC;P^bNvWE z+%;MOa*i69xcVsAZ*^dvRIj1K?Rl2uj*9}j{+DX9p88nT#N7d~%;FjMz$oSD2(6n%r z1};2`;t?qz>9C6B_cr3a9um@k4cx_^V35MBhTxAgk9SOmGQ$lI)HY<=RO(o8o98f1a7Sd7&*lWC3f&I`7>H?Q%)!6ue{I*m2{gXGHId@RlQM;OQ= z<1>@U%Efz0+VMzwLF+K0xeGjLf55I-Wq~SDR+z9Dsdeo|)+|aN*K*%~#3l|kk`Li` z-&6F9aRE6RUx*#4Q^_hDB;moUv0(5Ty*eNQ3wvZxFYd2y)094ibb^`nT@jNOWkA>202rJ|!U8@AO!DMd*!P@sD4napn03T%O*AzVjl^X|8hCYv z6WnLqA>AkdZ>p`qzq99pXG*J^$fmYJ zIdaTsFIMPBa*RPU*=%_fR$YEfMKsn@e`7`6QFBq4l&k01`@3-t@GFo1c+Y3Eu>%u>jXOafx({iD7A9OOaIPve0`= z8+Ydj=qVX{U{XLAwvT=wt}lIw*m6>YE>|h7q9ruBZv>f~%GQy$PQ;Ge#*CbYn>ijy< zOW6udWIipywwTvC$ty%*v(tGp$w?cBg0ldpyrv-wyxE*%-t=X85Kfe2lm5-z9P@Dw zob~Xe7yYWhe113WYWhU@W_rPkI0?PNe~a+pzHRi+p#cn-oxr|`5+yIa{lG8&5vdB6 zM3-nc)J@>#hjXh*|D;^HrS3bn3EiZnvX993Fcw!k^TEHXi(q_c0iJeg)b%im1sYNe zT0OJjT7@}T;jx!?KYB{5-*3Q^xk1>Z76Q?!j!f@mN}L2|vUmGq0VaQ^qBfEwV?hK8 zzstbm8|TyCLXGUN{#raNQ^?#*eNTI|)Zms-C_WNjN8eRkLmj>n;wL*n^8?~wyF(-u zmmg%dHSA>qEA!#aAxAo?`Y0$B3ge8c=D2y~NxCRLtm*K-2ztW!EggQJgu5@u@=^`9 z(%oKLAtJ1l{aQIpZ_Kg7@x&B7w>S&uTHe9qdQGge;B=C#oK1XOPNGVMg^q#-ch|1x zTp+41$d!Tp@LMR7lpA!CV4Z5{ThTxiZdzi?Jtw@ACO|A?Wyp17J^K4SKi!>DM*ht- zh0P{$bYY1Pk^UKjhAZkxrqw7Bm8~a{e>Nd&>ViT~zL70lo=Ny;1S(FRP3Me^l7zr| zR9Ml1ee3Vjo+tjG)1XeInb-6rzaLH^&h*5_*Q}P6Hm^P`7Q9w3L*Fe@kW{}xx7W-B zTJNtz_Npq%e{LfMTz=>8(!;uznu6H>x{^i;HZvZ3oXK*XA1Kn@&ldL;!jsPN6tODKBUJZ}jBes*4+zpohO~QEsEA=T=8m-z^Ms2e zPgW92=8IBAfgNO)=S?gRe%|E5IgKKvo8bvJ11?Tfq^8X-aDA%;uf$;?#+p2#6DFN> zqd28gWF0|pQ$DHs$kjUAUy;uiAL-KjwkS8#9j6)>V6T4^NZcPlP1j7)ekh&rAKr*> zV^-oVaz)hsPzE)tuLk)o9DgHwhvD9666~NycI-|DM~zsRVQ_`~STe{&|M!%*4`7W6E)gORANPRa%U3XQ-WwOmO^4mh zt&kk`lYO^+H@-26!x_5;;MT43rVSex(EI<%L;rg%RBj8Uea=$wlbMH?N{h(Vo5^rG zWQaVn;v-cTyNLS>DOe($5A!X>X#4MOcy&#gx8#8dj=a{PrRKTtoPR59y7QZzjA058byu7aFbCk*}v}iCWAxa$jSJ9M;f7?>k{QU2`dU*`!Kd39n+!?G#{(zj4j^ z?8W%QMU6iAHAa80&S`Y#vc2uz+E|*d$$Zqfh?>)cA=H`TB89n(naU?x)vv5)ReY1g z2bq$#y$Sem?lNNHHcaoQWRmWfXcBdPKf5<-KmF_#Ky9+($fau?l&y6}t=XPXwCEvO zfA2U%n(xAJA$K%9n@0@3E1`35FPX_7j|$zkBzJ)kTFVPiQ6&}dUeQimFD^wd;RjSB zf#V9rJ(;0_7G@)VIAq48(bT@#%v1pt&JE}ebEq$tzK^FHSGwT$_z=8qbsNfgo!G9C z2GxTtSgLM>4`TFTf~P>MBbPw%Ln~bU%oOq_eJ10QfjD|Z4aK_0uu*h6J}z7YnVF&> zuTx4!OrDZUgQobgZwh28*t1uz<>EstEtq)hi__w)Xi&2i6`jl@&1wbggEmz(kABJM zGza6N#93TlZlYE9A^vT3(sUS~z%26y0OQ8>$3tZOv6yx)t zfP^lzgF*Wy+!)zPONS28*;Bg72a~0ky*vi)O^G5B`hCn}r?b%5s)h1HX7ula5xP$E zL(|RK=0ttw87Qj>!yrHml>4$`csAp&i!+extMXs>$@?<3#P~Twrt0k!U_Xa=70B z9e19`H7-@SEG`y2CmT0?Z@A7p6se-7n%79s=xlIkFU5pQCG?2!7jR%W4*bU&Tobq) z6#WMB8xw8#Nnz?JgnviYR-pQKDlG4JSYxXbEZ-lze1wC<}uwK z(}+A@9sc+zf`!k6V7A)}mfD+>r9#p~*?%(BK6=t*>beB$3JkF+-~_9FAr2d#Nu$lP zf5gGJf~pCpLyON8A{LiOw{@-pwO{hFySPk6U$HNI%~Zw>bId_gX@aNvyQ|JANVOd&cMR&d>15cZBu#WNh!J(#zZHcJn&gPTHeZ&@Pl zA8jPx_t=4VDTO_Eq9FXt1odz~j?b8Xx@OCMlYILbM8Pu^A0#e>tta;3#gG{gkTgt= zxbhmSH%gHQbHmu@&E@nw;nzzO56&?#2W9RLuzT zxZh9xGcIVdXe&E9S(&~ZI*p=x@?g7wE$G&MrdOTklA+m$Va4+}c=J#YEzkkWR%q&m zN~`1KfyE&Ft(}2er#POxk9{`0y~erYH1>UYP4~CoMCrsWSlpkC^SroRc6B$2P*%j7 zgGL|~C(82~a3zM%&o^P%PpDj)4hhl+SCQ>6 zQ?PSy0l8cGjh>IX3=N7WNbS-T#}{N`fHeU zw`Z)Xu_Mgg!JSL@LUFCkN?5M)8O34+SVz65KseP!2R62D3MFdRyBYw zyA)@A6oJA?F>KuL5Hgc70HLBE^ws@F&==Fhkwh2xyK5zyJj{UfXFti1b_k7VH9(TU zWwbX+&`k$3xzF3oyj@!b9)n!2+93=-TgKomh4naofnyzKD?l$vLAf_T+AKox@zHh? z-Ry_wU7nIkb2Iw-m>f^SW-{)0vzpk|4AZ$=;?Vx~E*Nf^N!qd`$&Bt2P`MRL%B1(> z%bWbX)XDehitA%^t+6!kt>AvbU%QkjTMD6pT@wA)^N{Skd5`YT2nB(ur@;3+rOIY* zQ0TAq|O$q{MMkVH(_G$41&Yf&0xDa6Qnm;LPb|6@pMRrtrB&* zqZ|i&k-IzU=__DTo+#X|?qXxCzOb>Mlj)n3)AX~+Mo5+A-Z`&A+7+UL57+2I^wozX zN6(Tz4L(h;tQ(`x?d;%Gkt7=QJ;6=Z;(9ItcWH-q2I+22BR@$h+pASiZNfRHC;txo zey5e&wKNI;Owohxuel^*)kh}#b05|AzC~k1ipibkSe$A6R*TW5F}(CZ7Xpzo!DTGa2kQs6py2L7Y&23T4CkB&0tSHkUing6~VnH>t(gam^l_ z559?B?f#p(j!fp+&rHRteiyJEeaudl>!XTwMMTp|1>kNA@{XTlpRe|&i@_6Tj_$%j zFCXk_?1ROATI3#`q8EFskQjFOg5;-f)IHx0?CqtgWhXKXPJbFdPqQHFj|!td-wo8- zca=&8N#Kpr)$n3<4osJj2fLnU^vv7Y5V3>X`|=VH`M2^edv1R@vY$&xy;~!RwT)<6|NLJ=zn>1QPcnz{6n)*>k_)kFju4K- zT0+}73ECYZ#3uX>WL|VOHQo7e3YLiOhr^{DJF#g$zApPkzwe5Lk7md4c;7i3`&iKQ zAypoyziLC?y(c7=mqDa|MC+h+4xN402n%`ycxO*d!8x6MVE!otZKH)hlHrJJ|@l z4NG9pL@u3OG6S#7KZC*TeWbGGFtZiR;NJ8+c)Y+KSE^W`_ERHzXY)cLeVZj&tES?x zuNJ|Djbx8~I>axXiN6$0F)?fzYf?B$()z#9$E#(*qOJx#qhHeBAEx5?4SuS?Yo|h= zweiB0OjtMgg2~qGA-^ZeV2ATpW@c;?k((AsTn)4#^>rawFL%Il#S?UMq#a1N#lXQG zL1-`(2D2X~ljGd3fFzZxC?yk*E{2>(XQ&Mn69VwIUIop%lL~UrGRZMKO8%o03BVi@Ab`nL830C^k9!9_13A_a5==^=>u<^!R*cmJhZR-X}IHOE&1s2h(7k-im zAusSf(E^EzOK^12a=p-x;Z%8lBK%-viH-CFSY>4f{mDDvW@Qo%arx8WG#5NDk-+uq zw-YA8i;hg*3CG-xspzW-_MY-C)LfN^;#X$i*sfaye>}l0MYCai~(|m-APnro+suHRD!cYXO^{{4x7QDT=2tSFWaeF@R;Tw5J@ZirU%F6=D z-l`kA@BKfKnbSDG*>@8N4Jx1wL9w*8L;;+1-ckbxVVrOJ9G|Sw#TA+dIY(wL5!o~y zxlTMd3&+7E`5WZ!!6y_r@8+I7DRi83otpgGhg<7 zuBIJd){|{D@u2qa9%MIeB)Vr`!kY6g^pMVZCgAK{rlipl4wvYI_NO$cKf;~I+pn=$ zEJVDw=O9@f0A~*skrNBtY4k@)JlbDqeepPN2*9JAuMhf)~t>tfP({UH7vA9ZlNgak)auza>cXs&*NP@3e{p+4X??6ybW$^*2Cj?Q4sq01Z^t6L&dIDjNH08P2Pqv zD9(su4mZO++B^<_*Vl{8{NBoJbt*>ExD{QF9cBCG*MhTxHFO-Cr>lN=CVVL2c1gx7 zW1FQUq+AbZ8riCfj$fD1-P}&)kIu2Uq;~~KeA6NwQhx})`5P+zOd9y!31CDyk6W+C zhdB{t%*Vc1I<{{Ruc+3Lz2X&kjh97bnsOlE&f6cWF0O@k_vV!S!h1A5Bu`?4pHS_Bs9KZyNlq9kMj^F-}^Y)H+L`om>y` zTilMH_#5%LkO|h%YtY%yPdBV{CDC=(jQ0FVcuvL<);F(&@w`cRNH(92>T6SNdww{S z#Ic~Zb*Rv`g?yT^o%jfRrRF`HUtDfklg(3Suv;yJ%U$*HKg9vu_{5Ubzq>%8Hy$Ud z4}o2(A3ZnUnRXdog_(Y(q(A8mU2NV-oN9C6`#%kA;tjy{6Nd@akKyK2mL%TBlD2K* z#+?H$G2QG!TzPjfw~M2JUi!ztN5xEpLwl(3x5dy@Qb@dJ)l%s~d$MoVew2%i1NELF z%G+v@-0>LUTCmbIcYQe{NsSCcf-(Q?*{1V-T`Nn26#W8}OcDzzpEs^bqsE$38!)i71h_ZNdLr@7ri{Il^sz!~1|i$`(vex7{J&lKX+4aGU~Cy~AkW_kv7#{vb!WedD|0g&-xcjQUNhg>R*{ zuv#FHyt*p^Lw8N+`spE{<0yrJXC@=3uOYD65Xx0#@%7$OV&N-J^93H0o359@?!sC4 zy?PcFW-deiGyl8C*@EhKduUp-j^u5OK=!#AmSlC4)#t_0VAdZzHQxwt`x(?2@kOGX zgC|io6ky)mc|auZ9mc)G)2Z~i<#1kaG3GtG)+qU52lhTcNxRn_h6Jv6`eeX_^E%2x zzDPOQDdV#41w2D@&?ILK8ci6(RGoRS zUH>Un+2(~F?NhMXb~${pZi5S6EJ?ObVKrng;g6mXY8Pt=4#62D<%S}4EE>S^!3CK0 zb~@ZI+{DcP5C%0b!pWNR3`$i$A|`bfSeAF6q~5M2dl2INZnLfxS#a-^3vHS=jhCW(86O?r06iQ_bM6#jx1J=_ zL`Mc@U4BQ3=iH*#BYu$Dy`hXEx0CL>VHLz*i6$>Ul)eo*mep2yq46J$3Lo z5$)+BRy9*$$MJkT_wob|{ZoS$Mu_tcE0UVU(KIve3o~6w8T3o-@ayG7__rdPzWI0w zwhZ55+So`8c`pcCVjFe;{rSQ0LPD^mGM#MLV@}=`?xDV-CvjItDN$8?LgVj5Qjtxy z7_7Mm?YCXRRqA83kIjU;?!wR$nN8mY$@)a{v%jx&8=ZjLG55EMW;+h~YO`N8IL zY;oDQdsy21oceyt$G@Vpa8bAqbIB-=+$+6IRFsYBg;0IG&6f^(pT3bp1MiqD^(wf& zYsvrS|MTAqaQlcx`El)gIm-9KfhJNjk`|_e`Ol_;%fCU9^{*~c)!L1?E%FL^7k7?2 zgyfM~E>(<0p$cw3&`uQQrLxWUjiAkSDi{q2=m}1GzzThnz~vSx`2O;Gl(J7C&8^LF zIx`Q8f|p}h=tt6h^fqY|cA-0`)H0bfN9fNX2k7>Y$Mg_Aj7zr10VzG*-|HPnrnfB~ z{4ookew9Y`FWm3v$?K3?#p3whddT9kVp6N5Q10qUS~My|O=q~G#LFqTL&%nCE__Yo zpPIw1+5~!xX&`ssJt3NRxgA#*3W)YlIC@MzNUw5ERQcdBI(k?dN@c|K7`03k>OM=q zO6J37D+*J!gxOuk<8XjyOdWYnG|wl_KP|4rv=9_H$l013dZIskvqG7LxQ#`O!(N)yAcBDwbC3%9H;2UYLwC&2Q6^_ zqb<~t-HiJuSh{MRA!y!>CH+xruyD2$X74*n%2f|Q*7OQ=`fodXZC*Go)T_tN3vOWk zriG5^>d{Tx%IWQqI-1h_4pzIY!L4wm>EdK=2X%M>zCEi!{CcCnXWl6|!3(7GgKY6< zq9RGwXu~=u9{D|z3Ie0TbYQgv`c$mt&b~=xUiEIc>eL27>#q>2_RZ*P(@vLiz0pl> z`{~X7;=IMf1FXBb2O8M?V=wqFgL@W=Bx(6)x_9?U>Ubamgu?Sl#QJU`n)HE`>^#V9 zek6)D5?mkeUoUfB>j8bB`iV>qu&L?i9K=tDxVo%+g76yGaV*j$bkZ88{5n$L(;kZ5 z-^9r|zABV{#UmQu&yl45XOLQ`1BO2hA=|)&JoRSqWU2$m%@blSEIdioRQ#c8tpYu; zVk>NR`%4yZ`|cgoop6Q>68W3T^i*jPc$tV|)*lmmaL~F*_X(Fh@X}zmdL2R4(+#=; zE>|Ga%hL2O}W|1xss9#N-7p`J@XB~(CYdSlS=ie^W8C=beoTJ<3^zWhbS^H zazfXsnmacGoT#$P0qnlr3)^)S;H5StPrw;}tJ{EN*LqxEp+|=KIH%UpJWMfa25A$0 z{HFX0Z;hstKXZ5C_WA>~)ssh8RQ+MD*6CsY+S`ol+9xE=#u$P-_M-92MGzu(5`_lc z;MEifx?u8ca%AyN)GJwwPJ3!;rOZN{scMZ4(}ghePdEyh$D`(r2s*=+b0#WR>ps|= zibVM$nI3u@J8HD?)uBTCZ)H5$G_RD5&z=M8o)=^4^fi$1RgkCid=)$sDT4m9x!|Ap zlyMmK0x1_U=uKKo3Z6R9)y}neezy)hwc+A-rD4zwS7JQXHUgelA+%Fi@&IhsiK#Ld}=U4D zu>oi&_tU5Q{jsk;lWsab9bRQk;XSb*fIos~P}8`C7Py))m$b~pE>{SeBZpgKu0ZER1Mzab z#ay&l+w@=HZV0!^Wael*CZXa1&?Wtioh#c51s265vc8h>|Jp|V#QR7q=lbv0ssUNi znAo)}=VV+Jjy>T^@twgx681M7!dv9YNu2^{?2CkdTxP?o${I@^c#)-eId5d-h)I`+XiWG@g8lOwM$K`2ljwxi4RsOXm|RkE94<=TS#Gk;uYi z=O{dtm`2~1Mv@m}@#xrnh*T%UVYPWJ?Mo4^nWT0Rl~z&wacvOOLf+FWUDEX5suT3z z&PU8o?^yP%;ADEGVH)1+e1b)rKG7=Wd@|(cXv+UA3M)_@Ym6Ic!jBrTXm+J?d}GYc zS~+YU--4X>A!hCeu#VG6k*mdyVM3rC7k zd!Gm@jCH`zPHtCWXv35QNs6mZQ-hpr-OZ3pD@hWSV!^3kjD@mL)1%ZGkxVQQdH5*^XJRH15ABUupf$Uhg zJGqG1{Na(@P%T&~bQ)6R^2pH_a+o-?03Z5o2GiK1^w)G#jK31guDx9Xc{V&E+Zzi4 z7c)S%KM&8fn{wyiLip#w3dCDXlh6q%(p3CLtM9orc zrr=_3KC&(G01f9@PZ6tbk@G#PV5`nyYVzkl7}Q?GPWZir2k$T9aQZt;5ZQ${t8~!1 z*P6ZaK@0O@OW{-hAVe4?Lv2try+QM+ZbUHey=4-8vi2{1IO8B}?CYdg>1|9_1UP<+ z2iw(_vwk{CMuvf=_tBkrvxUr zxRVcu?P2KgP9pil9(rOd@$7tcRLZj=J*yk3mQ+3MT{Vdvw>Md?V29=-&tSr! zkoerSgT{ zoeo~n&d|HA2)(-#fbDpRht*Hx;)x6FI-kWroMuBniZ$jvN&>py9^a07QcV9#`(tyk zwrCIGpUnrd|J*>AxPw^8DUuO)hnime#QJP=WG)P4(6oi~Kw@(hJ#j7*J^LO~YvI?_ zVxkm|YE_`U@i>*|*Qyz-vM28+V%g6^M>)R6TGTbYOJdCA@%Bxy=E}rq3s7HPZNO(`?>@kI}f!rIHMVEh2NX0ze~95SnwwP2<8|!`M!5 z=5)0i-1h!Ve`qR0t%DA9P33kB-0mUv+I4m~c@zTD6WANmOTZ#i6JFG5P^**-c=3+w z&@4ZR@*|=(X+o0t%y1w1*K`W62(E)X`Chs%?FbGp5k&909P;PVe8|i-B{Ma)Ay`_| zqni%X=~LipuBIxo=2!}3pZr1Ta#=H#-V-GAKRZ@)=^Xm$nI6RP4bm&iCj;NVP7z6^&*XD& z6q<4Umx9^czU%QuSmB=nw~S;-$=*nCU94F1@Z3jw~Y>%?hdgBINIPl8)cQFOstG4xTjChH3 zR#n7}@6yoyu_CoHVCX{gFLX&%AFs9SA|3q|Q(f$Jn)p1lz=121YJ_(gVNOg8adAF` zFGjfg)bBoC+#z$k-EakRRe~WW&mCXyPNA17MQBpDEd1OT26_Gbu+QftPmOm4FAQA6 z)enrJYuFy*4__y_PKRNN*B9QarRQ;@@dJ8GLXh%Id@wjCxJuSE4o!Mu$U1>m;y3pz z1bJFf0dE(~-Mb54#r`JopC!zab^Nfohx3d7dBz40C4i&mVzOg}Z9?U}R(e4A09iQ4 z7I*%;Kt{4AL(J`3A}IZjXfE=>`%33v+7=~tIA|5!^~eEUe|O+MAKW~0_#PQp}UqZIp|#mZx0QF`kC#RS$d09C1rzjr4pF+uf|z-oWRl} z7xY7ZkY%AMWZ#Jy@LPN_*(5JVw~Hn)qxTGOIMM;MN;aZH;axI$;sbdr)j}o&E|A-j zie~pNms9zToImusPEF>54E)tEgpr&Xey2LpVKm8{-Ye;GY zdg-}x6ZEx`XXajgKLF0ha~UWZnv7l-BDI|AE(j_uELzjLU8U!G)TVt&2IeQfkuz6 z5UULl|z7$9f2TFb!W)PDdJ~ zp-2BL2bThO|JVJhbO9Cpcfe}t{doRA zuIJTuhIFicMD6eWB4R=>m>X*+fwi$0mY#KFmOT%JfzNgroRkkyPnAeU1BDP1bL3YR z1O52{7|(D$Rr!5P#+D@dLQ)iZ-uB{IVvXx&IWwgyFQ{8Y1jr5)qifkX5lYoYSJh91 zcfyX$i~mJJ=Qc6plSH9QyAf+m4dDfMR^~rt0OzS1ddS|vjGAlA))QNBgTW4};JX=n z(+261JDzw;#S&jv&*OdE`c*oKDZ9w;D9j z`|K>ZHzA3`^NL`|lECebJ0wf>B3Xay4pWw`3WFD}kPG7)SS<_`tL)(In|n0gMB41h z^fZuF@q&->yC7$FPE})w2+ZEWoyVM}!N$NW@T>Vvt4~E>|7-`0Y3QN}{sEZ!J_~~b zPQ&bDQ;;+@p@8fLoER3bd{<<}a|v7oJI`?a-RCk`_xc#MSd{{9ih4ESoJ2hZ+Gz5` zG%#0hF&&v4PUrC};(GrAIuaa5gD3wa3!YRg(ywzN&E^#_`aX>v9!#vtKfE35cT7c} zr&<^%Uw|RWx}a~ThYB7qV0QFda@9{9l9aOOreLmrUpEufoLxcnL>|=kaol64?{NQ* zE2+;kVRn}blEu}Ym-8`e&Qt?vkmpF+!a+1)TQ4A&54#VUiSt5Sp z1NpqW9rrZ;reZ!iY|L31T>0TAL9_YP++ick(Z7hZ4)B}pxL^hzH%@Y%WCcu2>>wvx z{i)=PROdP!EI_-PyLO$R1wr5g4% zM=}>qN`p!LOx)>y9GB-S)-3Z>dMr?jSN5&bvc>W$3H6_B%hyt3! zvA{08*^5;^XW(@i*VA_7BgZrMx-nOHS(HRHZbXx~WxiA=@g1)9 zJxX7nmV}P5?=(ck52AZ#u$4;>;G>-n$+AiHudjt|)q-Y|>~Et& zrZ?uFJ3%@OxX&>^57myPC)^9Tz~*oFf^P#{eq61c>^J;PrW)2P)(~-o?NO?bdsCG- zCEcS64WGz*UM5V~f2HiAeIztq0Y^8#B467Az)L)WmgPO>+~Dgl^73jbyZu>pT$V3n z{9Sz$jo{Dgt#X!OaN`^eQ1mu|9sdr%sOMv5ccUO-9<))d2WP1Fz)aAR zd2ZTR+)Zrt+GtGNGjhgAf_-W%L5dfgF)g243fE0m;4*s=vr86yHC?V(F+M4m7I^xD z_wE_^P9*}}<|vwJxX73V%XX44+c(4Ym5ZP{$)64k=Hl*XX(%HB@SkHXei%D}N=ipK zr?VER`?ae&|NAF0YM~5Egf(f$*=(p2O=ETz-eWZKHWEISZ>;*`3OaJ2l9siZ5T30O zguBRLu^-pz)io=>BQvyk?28N5-;QLP9dvP5z+}`{orZ0r?PN_-3cY-GGR!&{jr*S} zAbJUtwspyHzu|zXMBosKJhq0G{<_Eu>dRohQ%hPMSu(Z%*} z;QV@VvnJaX#(hizr}x=oijzLH^qe5e(+`2{)Q#|kq;98&E?(2r7jiupKtCp6?c%we`F08DUCPHQi!K6LDHm`qRe-rT2OivxqKp2;p+$Qf@u;}W@(JD} zpFDf0k?2Z@j6RR|&P>p~N3LV;OO|{e4Ft=EeDdN@CVTtsQvA+!-Vgo_1Cek6j+OhC z2JG9(+~{15{)r!mD1Qe|zQe$8qfN+57h^vJxsg7uS9HfS6)yU&!XAaQ`0RTO?c%AE z-~}&famGXXIQlre-ETyUFHOfCph@N5>_)kkai(>P1PQpl1HuB;;L9lhxy=Vja_TCm z(6FMZyB49zWF2g8KLt_ei)emiJ}8LVp$e)%n9o~~@lT`2mgT|mgHvGGc|PC;5$fF# zPxD^q()+@5@JZKc_T$NH>VH0+RW;9p?YoZ9xxYrxx+@TGq%_c3vvlB-=MbIu_B=T@ zC`sDX57IeWkElVCKhDj(2K`MDrZ#hAz?SvJMN77G9n3gPbN|V-bYG?UUlzdI2pu@V z-S=)x`G4oyjaT&hIq~g3h>HC}?Nx0md1V+S`Agtomm?$pY7XKiG^dgk={OwUjtH5W=J2Jq|ftkjTMfT zjbL=tRS@4@O};)Igd1s(nDklxaQU7EURhCr#-ZGd|MpCXU$L4hoLq&Lx3|OG@E0`L zGn&4(egfm>NzgxuoAJCc1kV+Y$j|k_WUM~0Bab%G=sB@W12^xHzq1F#4Uy(3MdN6S zG@~aNg;Kj)st-M!poiRsiODW${QWi%?kqEBzc3Q;?Op|L7MzU2hM$?{N)wpgu0&IQ zj4(U+>R6tt4SaUl3d;naFwcJ7XEjF*@af9CX;45j7)qIo66D6{#%E5WpJEb8DCEGxqCw7wgz%PFcQsTMQVE9{eYF9UV=Jb zB-wiMboJ8IwcuT6it|R^LY+_`niLjuZpBk1;>HQyp%wcnJ?fOO_;4h37}o=_i37MT zZwQ)=IKJJCbez^On<{>aCa)gcq95XFp>F;X-2Pbx4_=tcmK@5&Q=83+{_I;2XZfjm z-jfY@NjQ>*b9pJ#SuyChlk=e*x<&%tJHz8JF<3Z}O#IWVp>^j4o^y3SF1HNEpyyj~ zo0|pR>X*cMCjXIH>;Q98_#b^#Zv%Jv=aV-=evs%l8AjyKLemyCy8ZJPT48*OiMQED zy3J<7e|Jmpc3%TA;@CgRep}%k-wgcScZ=o!rp5UzESYPKT2Ou%IZk*iCI|#mDXS{j zyWl&k(GpEoIdtLv>o!nkRs>yg=O9@~2KUt@68qIkBzeyh(3DMtdn!l3T5SNBJ4#gk zXaXs0Hli-#XVJj_301LCr=f3^LF!Z;iE-k-+aKKo<8U94@?1j|#oW;MqcLRa{DG61 zF;Jx(3>*K-;A?3qT9rHx;!cgNe3USXkJ@>nV{3 zkvG;fKro1YH`c`N5hHx@c`5{KQ#NbcCQYV)I)o8n1h;U#Q;(p%blQ&j@Tm9})zi97 zCtL4f>`qCOmj)9gNF|cGyxWea-*}Y0f$MnBJ9{ z3x`)6#kSpd*&ZWD^4(`TtUGOi*sz+nM&mw?i_SvnrW|bgQ3W$*7ZEdSMd;?T%14FW z(Ae=eV{&~R_&Ma@FLf1M{{0qS?m9(6z!&BYMp27OezS9%HNmaL5|>HL!Zp>`z z^y9`%i>^je{=M;VH)=h*rDHMht~{r{-Ist_c^n?@X~8?SSJ;O88)$N5Bm1W|kFgT; zBC!ekIsb4nEIAzq+?OJqYnb^6&1vVdf0dld6q4K2{lr^Z~ALbop z3KQVLYD=h-KSdwhwxv!HJZSuMn>kpc0)?jxXy2KNk*>xtS@T_$!)BPp%<7t($3n zPBMyL&?EM%(uwu)Sy0pa3I6`@gOabDfA9T4{3cmJgSopyaQqP7nwJEJ6urpC$a&=b zhNI+?bQ&qza-B4DPW$Vkx9H%SFYKtl3tO;D8O2oG@k7x(^yVeQ(B>XedNK+d^}L~? zO$p|tM!;(;g5rx7!novD5byV-%586`rDiRS{CI=RpC$%3BwiBjYl2W^i$rTmB1A3} z1E%9A>E8Q}9PAYluX4D68l@Xic}Wu7(Y}kB$>wOaFNNtS&)|Mf6ew=x!Sa1KL2{uM z^JVj8;7Mwr7x&rOw(|&l_$oz~$Hzmx^GX_F+()nZz;k?`soZ=i_YKlu{6DKgUdY*^5Fg>rIpk$re8jd&S>b^FZ^FqI;k#ox_MJM4B^B$? z^w~zL`^^w+-i*=pOf)!UJ*p0WVt^t$SQ?&vznXW*khs3Nh%G;Vktg#{qpM*okTR^p|s@ z6A|0-?cDqDM*-pC2^;oaPc7PPTZBT^!Bl)=8D5l`_kaHXtdV&aKzNov9z3`Lg;oT> z@eBO0tZ^%vZ{3E6zMaIXH50^aO*<7(nvGx2c+rM&1+3;+S;8rQ;GUW+%Dnl`s_Tdm z%c4Ed9oa(ar?Es*aS2{Y{6cQ{bMMKFM39r*f}Fw(PI_F%(=oYFp4Wxv4ESJ+V+py| z8H>9fSW)|RTS$lf45Cn#438h}B6@C$bl>STT;z5WO?1m>Zp;GwBKDYf<7o#CQV+y4 zCxCh`s)BD@hv;GJ1+xl7>^XI0wHF$UK?Xr)KxnyU3yc|mFJBf6pCGl%IhCNIsOGooEHvB^yg z#6p9p@)2uP_gI4SN3)4&{U&yqqX4%5WJ!9g1&(FCBXwG#bbz~?oENU3hkW~3h4^`( zeY1y1e%2=y`p<~Uj1D+6--22mtDuwq9>8M~-vdf;Q!0bz=_-Erj z*wGU}&srYkl8@Us9_b3~78xS*U(W-VERO9p(2S97!SH7wzgjdo68pQ=P;S{@I(Jer z4qQCO<*QRs>&rII(GUxs&GI-u;V$Y}d*I2y#Tb0Mn!0S`!=jy+Y2)P^ygwfX=)kSx zG}?U*%GkFOHu)5MA6SJC&!&^c%5?PDSjyZV=XM-HvFLco9KG~x+49(K+*8*}cgLjT z#0@<#fBqP~Tr8NaIh<2e*Bdss9whS$KhUWbTi~-%DtT!-i8=?qq(58jK`CJa-i;Jt zL_8Hiy^Py|-~UdNT0Y~8;Xn-Nt)!h}jikxu7vu7YA9wVfWMxWjQ>#zi^h5Y`G#NaG zp|66e#^yCN*!D9s>A&+JSg?nk?!FOrT=64$^F`oa^kQ`IozGL-SOg*=$3XDlJ@(0= z7`m%O81mY`k*Sxu*(C?#n1>IKu;)1U-0P!ljQ_WIGJDN)R$F0=M6{fQ^!~&6ud|vy z-g5#O{}!HSl?;kImr}i4H(d6lkL-U?gv}jsxNblS?7nNl8wpF`1=(Yh^*Yuul%J9R z=+Ag9eTKTZmx=JgQ#iejzzMafH8SiYy5yWZnK$r}7tUp3KL3n?x+8Tol{8vSHiNt0ef^A@WUL7g88YGJZRe5@$0q%j|2y;wK-8xl=LDjNm%j zg@5TwjcT~MLjts|-m>z(Q{lr0Z>~4wOMAGTxSG{>w&){E4^6wws2X+BYh}I|za$mp z%#%T|?IZR+S&eC*<8k_c624&$(Vm`}xPW`6JAQ74i>D*$loL-OFuDv6pa*H#a}$mR zW|EJW;)sNjKXH|9sXn)3q=lv3`@f^z}o?4<1dZ2|m8ztkT zW`bfyZnS>=IQd|0Pd^j{kXK!)sIzX6tc~!Z1&>nkM~gPs3r#`cx%=t;^^ZB$2LsnU zj+3f$7pZoxGE@hM)O3~a!{JWOrybS}jz3ROCajZDx>th3DQ%Qz99MnXKobm#_{^%# z#54466|sqthF2W_`D=I%PI2ktzE?XKsb^Y{`M`)4D<)!0h9{kU(-L+SBw*KzoXVK- z_G2>gv7nlHtZF*N}tm+QE7T@m?k^$>6E zjWDX?z8MnhQ(?E=cG`H#5Pzu+6ZeeQ5OR4vzRZ;b$(%e)_2u}mN$Ct3RHhOe_Ew43 zUclx10N1o{1tIT?%BU!b}3&3ycBxFq8pin6su3njm zIcqani^GEWYdJrT#%5tx#<5B{6H^f8IfAPg_wxq)7~xqekiXvwz_AKFwQj(yMYr(L zGkaX#k&7kzfgtkg2x$)EYF4y?oZfE^w^nk_5OvO}aatCC=hxFOn|5JNNdb9OcaU^i zMzPclw7iqF8k1oGiQs@qR}Z>yY&(5ZjUro z_!N!Oe50rp*GY0>hKab(EeJZ|&MvIm38Ooo(Yd28sClK6K6a|7W|8}G{v7UHAh3|~ zIS8=ntL#~)m&OMU_szJM;g+{0U^Ba3m~ z;Y6x^7V0G~WuHH5LM;(hcHl3A#y^VLd zv$p{9>Hnd>Z!=`-O%vP_a2jtN+{Uos@9EZtYcQqDf+)@s1>d9(^u)z1I%`x7KI%p? zW9z5moSC{*=*CCdzw!soXY6rlb~cQMnt*DM1GM~b0ksN3w$j|*2?0cuq13*=|$H#CxMwY(7mISEV&&+KP*?OS-0T?C<$K$*Inlr(bY3yTrh@C zdv^&^&(|s}zAGS7Yx4A2!%L!@|E3 zxIoSj1pKBFZI6en+4N)xEc9W$n{VLu_Bkj~f0bFD9m6gy%7xU=Ls;`Ji}Kq#fZg;@`69U&9?IGvfVKUgO22Fdzuza}-23p2J1c@b6 z%Ae5Yp?T!ag)~}!IF>Cw7S2O|bto;E0Y9cG;>p4lY`;(}RC8>Ozu^uzVnJzRy%F@d zr4ygdaQd5nCElwXqC3{OLG!zOx+iNBgh+Ry-`X*fcBzq49~b=m{4|z*Jj<-twZs4Z zvnQeJ_vOf<)|9nx@=1M^??w2PN0`PLNCJ`*Cu?E)kaIX zJ=4~LgE01c3+d#$LU-+R2E}qI@R%@zU%ofMRrfndo_-A$gr~qZj71GIA2|L)64yzU z!}la#{K9ts&-vKQc4{^e`IXmE8Mj8E9;toSs-jbAhLHuv6It>vUpxMeb z)oPd3xt--==oOq!V|>iXt-A&A(c~wD*DDb_<%P(e_Q6sQBT!8{hJ#6stgv?&Stzs@ zt&`=+C5a4TU0{wY7x-e`7wwt`kAC{2Z|2$B-h|MOpKRFHrI6fsfq0dM;JI_<@P+FZ*lf%rpARMF$tjTKfL5gFFJcxjs!6#_%M@4eAH=pHkJ^rC-9o=(6tj?6PLmo zYorzP^Z)|#Na?BDyi11p^h?Q4vbT9RWLX)J$iLr^J#-Ddigt0eT#f}ddw@>)HCi3{ zLIBTr%bE?jU!v!Ijo`FwBu!Nd#q~tdjJyBq39j6Z3EXS#Giwqodiov4=gBkE$5o-W zJ{U!*{#7AY?QMV5gGPU5$+NGc`<_xC)alT+hMaXMDPRjUK zkVXH#(tz$O#7)1OI^->36mFg)Qb}iVa%L8G3MxX|e?mlm_coUAk1;y5x+DRvhIHo_M|Yc|04Rs5vO{RB8F?gqz=w)809FY@bp zS+%y-Q7X0QGRa?6L4H{xi*ZZO%>>J~vqWHUJ2F?}wCW#sw zpMcdKb?gCdjuG|i6)CX{CKtp9*_z{#IQ6F(bZ**@&)8a8f4h)mB;8{nSG_1@}p0qvibz zH1CZeu2#`T+r8Ett0t=Y=Qn;c*GfL%=dxin3)69pJcFNJA0m5OtclDC1FF9)86O8N zgzFtz&>@x$gS}Uo?HReG;tMxli8@OZ-L{~pq&0mlxDDC7*W{Alc2GAw3?=&y)U(mRU)tsH)i;qCrCC7y>|-$XVKJVznTdJt#d*h8573M?f2i7jt|%is6I$eK z%VUdWYJ60=JYz!)28QNfe(eW#>Q^fqTEB|x@`=KIi45wMBml|>NuY4fxxZ1ZDjs%j{UTmP*j>37t@QD}hrjJ}|Y^5PJ`u7cE(G-$aq9p!v3 z;3daWwB62w35gg8cE~2jE}kI^CH1lGy$8Ip^`>6FC#X$SKVF{^gK_Es=pp1p{8Y;D zsn|;r0T#^N$X2E?^eE?0mZuvQmXP1F#aNaKv^Kb6~7X?6@8Da{RT7V}>8NLYjF$s9ksziHjIzKAV^_ma)t5 zGg}59y|1Chu45$a9oOss{tiB#$%C~5ob%gxB{-J%!1X6y^!A;@kY9L<^73*Zx_c7j zEzUwSJxj>EdJIL@FUNyL4Yam7hPmV71cUGO=)GGK0DX0}6iSb<5qp#eaEWfS<1|DzdmUSO_8#mSAv_r#G zLWSciS3V-{*NbTH-DAY{>;)>$v1NtXamFCJ77v`QqfxyZ;LO-1y71C$qU5bke$0B$ zj%~R{pZ|J}au*M<8%Ar{V8tftl&wr3?DRsF1w{8@5eH>-l>iCwV)*o^}9sEp;FR`kB;t z&v~W^waJw49^kq11oi(@PCPy=!>>cj;2L)xoVI&7YA-s;hIn_=*eQju zM7x+CTVjgykDr2rfB9w>;|vj5 z*pPFaUN9^QS5PhKqpUGW^k9K#M z)Xy{Nmm5kDXK@m2e=*elNHRD^N>cZuStL<9i)>uij{H&v@WFR8xV+DYQ(v#KKO2t0 znoRC*?BFu7p0>myLmnc>HiPZ^dT!Q#m)^EECTpz{35__9A&+OG3=;zj_H%BAzXdcS z=LTr84dmqh9J0Xk2mR}pfZF^4w1?XT&8qp#SagkHUGOM1xLSrEx7E-ED`aTXfmjIE zvV);6FW%6N7~1MH=u|&G>VMz$a0+q$Mb?j(R?+C)vKdS{s0N=mNJu&4a6p% zF+Mf?OOup$kg8{sIsddIdJI1!_dhQwudm$3^Hy|Z;ti(Z@PT4FJYbCX1fDT-`X_4oMkuz56>#w^LB5?kfr zkFhXQc0qvjv~7iePW zw;3#~J4EBEZOD2bL3p5{j%$zRklkC35X&Yb(rc1Vc-%awZgn5l?-%3g_Dho&LvghA z2MS0o|ZAy*SpH)te$W)nnXcpbz+qL<}Ho-S2l7z^dIEDivmm-4X`t15;31yjw_=Wj8;*gH}>jakmd)H z#xKJ0bx+YWxudXP>0T<(Pl=t~IJGl910P=|LgVW#a5Gv2ODt62`MOp(e#0EwGb~|A zwiJ9+(0YH;U-u5XTA*<4s6C11EOfz zzLn^%J_oJm*HHDIer8tZT@35W!2P!u)@-jv$SFOH^0LEBxcCvoT^y5d*Ax1#kMkID zp^2VbYv5B+6Z_QjGUPwI4bbt7#;cqm7F=gF?cM?EL$kqFO$C+wtw`8F275HM4=O@T zFi4-!6|shBSTGeIUZ^1V=dD49v3{5*>jnpwwt+_c9vZsjI#rc7prkGew#=J?8x>?h zt*b?J(Pn#ipdN`@ZQtnCi^pJi*(z{Wy+ytqpF`4&6-nxO@tSiIzNk3I5_VJ^p%EWl zV3zG?5>vOD4czX9&qQsB*X83hz;-Q}nW0S2*EiAw&Z79Te*+yCxXM2K5QXK%j@*to z2rKFp;AFfXQ?IJcDjW1bV4yrvIM_}4b&XBneg>rGU5aBRs$O%(Fr!((sekjS{Fbl%E3YW|M zYV$0#abJf;>hkbh_!N9z$$6;%EP!NfGq{=a4S$7g#);XtX@G$a?E3YC>YcfW?cUp} zPaOV_b7;eNv;cf<*`%zu$K%Qq-`(u(GPuOR)qZ@>ySu7h3QMmpPK$xJSjr!csSOp*7JTH=GIhA1Wi#iBeMqNFR|6k|b{b>T zNSCclCEqT4gXXTqOpo*lxG8=Q*|2DAX^XW!h?_~()j;Ug!!RU} zLO)E*g`AGd9Lr1#3qD1$Hw%Sfm52nL7P5 zq$Dq*+DYgC+>%0i3-3dzqc7UbF$eo>H*9zkMsD!yktoBva8a&;y=alf=1vhIrmu^r z!&PMnFEV3#d~&$lR6BE=&l2kcwn6b0KM+kEp%&9Qp5GUJ$Q&rbFoy(qD|eoRT=K%d z2IWL$tdaV2o|M@U2@tyLI2Qi-j|rbyONQg$!k&v#X3L9y5$1(1I(m3eS5%}2J~8Cy z1`qgiZ-6pYS!B8C7cQGR86J}eXJ3kthmI~FJU2Y6~W2bm$ zEJf*_w@w(6(@GAgpNBUOM|l5E`oNoT&Y|@(hTg@wv{E<|*T)9n8va2#bi)YGDz`(; zihHzqxe#vfEGGH01X=fzB<99U_l5xD(jIlX!fm9Qcg~ zVa#JbqMxWoUz$lnp`JYE5L4oR-VYV@=D|Skaa=feEjdu}jlF+<5loU% zzzUuxEwr1Dp*m_6Q($w%Lzhrt-Bo6X|qc5yWFUJ8Hs1aZyEb?|~DQ?DPfq-@j} zVubC9`4u;+5O)H#a=PiZ(>W*_(MOdRZvj2`NwCoU9lJ8HkEpF_W_G$yN6{6MNUsUO zDccu3owLJqLN^BY9v`A%Cc(t1_%NvND#1OU)M2~Db&NH6#rS2#v-Kf5m^ev=<1+VR z^!zZqr^8ZRYjO>6leGPGxSk({=x{>BWF_dfX`$`VVtnkLYo<+P#NZ zF7+TV`#Mcma*CdeNybPR~^Ob6^Y9(?DRluNT zJvWd@;~>SsD!+{9)+N z2+v?hgPObkBg3m|VBKa)mg{odx_;R zX#|xnEWkbQ9^ry+RdC*rj599=L-1GyevFkcQ!_8Yu0795yVG5^P3Z?EaYNL0l_mar zxCxJmD&l1sF5kFJ9~25+Q2E%&=<3)<)5nB)=esl6<&GlcdfZHmbL}SQXN%!^$EmQj zEsE+kPK9|Q4FiBeH9miFRLT?QDaKodWQE-Xyqomt)K8bN-Y=wbd~p zUvT4NRbr)lj7+l^;_WsFXKkj{64TR5xGq*D^=;ijborIxDmg@))ugKV^sQlR8V}4B z4m0PIwCE%+BPLo@2gKx0(Ap`kIKJmNtzEB#xe-$#VeAT6-O+-&@tydCy$L@RAL3?# zRH)U>ql;&Ua^6B8cob?+r`e0u++Jvl{?ZmOsVAFZW-KDBYXl%zJQNm8e@8EHJdYJx zZ(0A3nbqW}E4n#3k)d_zL{rWfyEomXvhpfSLG4QNFzYqs#p@HNd#w=MGDLH)G>~Ec zg*fuhfbEa>1CgFdW>3HOq1Gp5=rk*%CD+rj*=z$S-go6(^Ji$y*QuNf^Ep0S>On|+s>P89|@l>qQ<%p)GMV!X_a z9+1Qslfmo9A^Tqv+rCN+LtR-h?CbrRbxWQq&u- zhtI9Ez@tYgEN6EpykMHPCG0xTbLL3H^O)+UyiS&8P)8)~@v?O?( zq(0NczTM&&IxYZ-`Q;d~@hkbH7)R`iW7%_$my*^TekLuX98aG9A4TWkkJbCe@kmA} z6rm(ULQ(c}?hAcsQ5r%+L!?xalq5;^N?F+>$|xcudCq+yDGeHEC`Bo$L`jS2cYgms zy?XVWbME`PKA-nHff))+0mJ9gDEN7l9mGk-*b6{cJ*B00_pm*3+d;Kck8131fxOf; zyh=wwvwut^h%|kr_|6<`LPgmdPSLm}Poj2}Pd20W{W=(!IMUd8L&UoK5(b}$g!W1s z@Ds}C7irJHbuxx9YORB=-<3!+H>U|5=ZLVZ>RPuD#Fyw zCXi=12kRd-Qabq_luV1GAzOKL@4htJDC3Shn?BHs>36`ipqqqWYh?YdOh!fHUUK-{ zU$7rerUs{Hn{AK`rzTrs@xdkqI5jSdOn4I9ib-ehHa;Q}kCgG*=6Vtq8cPj75lC+h zB9j+ek_i1{?5NKIY$^~Se34_cW@{Rq{c8&BNcDwE)kUB+Z8O&QYe8knsfrGgjX?+e zF*W5ok+eL74$-w#Qriem&prj!ha>sY2b~>MW|O2O9Ln7!+XOZ+}#k3_l!hPZedoicewnY09Br4gGZw;(9S|H*f}~Cbdw`!&1)VmpZu7V*AU3@RU@&o z5oF8U8JNrED@R_9(D39zy4E{}JaT`9K4D^@ni)#87d@l%mwcwj#y;Wga`9TVoI-f; zDV_N+FcmxxBw~q1GbnD(!{zNZc=)9bJw0y%?oYGi8|t3M?9j7ZXMQsLXZ#ifefPmK z7Z19`!WXq%1+YOViApzSl4@H;RJXAq$9c|xVKb6Du8 z1K0i;Vq;7jbD5t=zsW0N@%Ik;bZH^m^3MUjUsZ+)Q+e3`V?L<0U z1UFp!KpwU!(9vVth=Ij8GsMl`JI$ocZUrqiJ0kFu4*yid`noEdBlU!|DDA++^}!@F za|3>!Ckz#31>^u(i*uG`LiWr!G-QPFrlk$sH9EqadXgn@-m8 zG;mYXSK#n$!J%A`0`&&?}!{uiJp$vJHv^ip$n|| zy%9UwW2i$~5Q+F3NVjC1#92Kp>>i1!czoYEW@c^>*=!ZcOI!R6e|pkJRmE2AyEt;LYq?HEQO@g5N7C5jYhPf&-0Xja6(jvc7^mvp_V$2ubNIhCK(F_YTe9YoGW3xbtIo3 z{%;fIT|S2He%=7`evN(P>#bSrt|)QHGOvfx#acA@i4W{7ThHx|9ske&({2b-Lkaf~ zTB!bny!z^eGSkizx4efab}yWq(6L~I#ktvK-xUlE9ip`_&SK%qQSxQX9rxVP2lE7L zdYPJ14}ppBpf3tPRu!PhUU3{v>Sf+rHqb9q8sLv%G;NFxMEhZJCgCT+{-kqIE;$25 zvsV+vvs@?cjv9Avy9<}6BXLx3BBS-IS#h;3?C4WbxHbBkG+O*42S<*P;?6QG;DUkY zgO6e3J&xNjzn4AwYn+`B{eXFRS|4PEM2Y6-6zKe#0*u@_^6}t32IC|k$k7djzh5NT z6ZSENfhX|%rFybpRG7Qx>qEnnO(40(9KLOGgri5bAxAopsZ4xGq^nsn@wF*aXvRHb zPkNv;w2!}gngPkb>EvpXmJO0ORENY*)wJ z(bW*f^-$Jc*^W%M7nxkyOnQ5|NLJKbx_J9Dv=pBRWxqa>;SOO^#?7KvhzwEL@l^V| zS`W;(jWZ^vieT~|DVS2|N)DwghmxaG5I&qk{6aOspwI~#)2?AuY&wbr?nj^KTs*Ft z21f@Bp?20HM*cjqMNbZ*N%T}a9iVC!xu*gB&9lJyqC6hIa~%XCb-_lrjmk?$q0%&a zj+bGF;cfSsyyh3|KVAjdZFLA1^V;Yu;d+KOdZKT7>sc*x^VgT6*y~(7`0o` z#!r&piP?LiaV7WOw7d3&ZsU5i6K`%{j7^t;>D%MbkS<0)4J@J;#5>96P2%*K+G~D3 zj}TqmJM?Mxk(vh0<8U@b2tOAK;mZqhIIez*mpW|;yPULBpT&#F?kGy@TPPhnH9}8j z*Wd>e4?M&%A`kDqiEd}2sX^u}bo$NZo^A~gnLRQnw#5tXJ&s^Kxn!}la}@M<`oouT z7jW@bhVd_fSoq^K9`9AdeVl(}^NMV?;6D+(Sho{ia2%V$IuQ&C)Mrfch0(WkH+?xf zm27Nwg?CqYw6^ptOiw$6NpsGUsF&JYw=a!9@II1@RH?yDmvTJsRYKu0cfUG(0Af@G z>B43pqebV?E+daJ+uU$>*TmYg{ZsMf($6F%xt88+3&WdB63DfCd$HA{l3X_Dx^_(y z!2Yj1WAZTtC#}fGf2+5EU2`SaxUNTQCkMLl@lNxc)b3_cHMCY^$82H@ryQ7Ch#?TQ*L0wIDqkO`-eNYPj2b4!*nC6Hm8o^s2}=@~9VgjSUXv#gH^GPNpZr+%7Idm7Ff(Fh zOpi{Dg)e4h+%u`o{`OozpVSVpHi18Ajc5Y9$n70X*9gNi24V2mdjcHZ{E$is_L)ZB zzk}gic6?m!GG@pwr*(7M$<%MP7!YKId$~XB-u^;dZo7{;)+fs6trKNciW12Awn(3a0IGS)yIj~&EGQFmxd z?=QTb8cvMmBjAz7Wcorz#^RyPywHKvhGDplB2 zTg^F4mcn887|dXDX@5gCZCzVP*Ss5HoUZ?We&0ut^gs0Cq(k1QrP&9Lxyu5ZA z-=4MPeh*o&hwCb4=Wn5Nw*Fu`lz^|o^-;#C3QT9hILDw0jF--)%9P7<=HK8u{wwD z6te}Z>OATsdzvix?-*EXEv(Jd{)Fz{U-;7Mhv)}>04bZ2h=0DRfnJyvqJRd?FOtXE zYlLCj)O}=(%NQ#i`AlUzS?svA122w6g06!F$=mNjomQ@^=-=>=M9qH5+&(l+{%#+^ zKTl{-dmSM8oTB3O6nPE zG~+3)`JP2Ds=uMOQ?==aX)gHiq#9;%Q1I799D_q_4?GjMfc1|ba63zH{G#oSWUe@@ z>KUObU)8{rZK03may$o)K^M4bHEFqEiLxh@nA&BjM9^Lrqb9gRkdp<_8T%k}N*+lm zyM>$QzM%I9ITu~qO>Bv)#FZ0Gaboc_ED&&_ND)8mlEs%Y_y$)Tcc9x- ze>f;wjx%bmprMTkHJHB#tPh_9{=HS~?M)%1K;joWs(OlkM}MODJPl^FE~6JMv|;(4 z&#>XcCC+m^7d5y(qrYJa$jhB!W*G&7kBmA|xtjwIq{Gm}EST#(D?x^HDg=1)pe6kp zdonQ*n}b3)FTe#h$7&v5yuFDnz4?%tGBJYA{oGE^R|nHYHveehtc~#Shy}Gdai8>U zO2;!L4@p}69xAiu52>;ftbH@h7AB+^(x~&2fk#cWkp`zguO&NcQXK&x9@A9+PENHge~;tRUvc z)eO|xz5zU69e}%An~9UX4qVX7VETe@!}!S|rto19S-NimEN!i%6WdDhYq%`*YC6F) za|I~RIs<=XjIpb<5Xwi7ki5^abX--KoV{j1-o#A;e}`Ifw>XR(`_RV7avqWLjXQ9W zOCx=IE{?9EyWw8VFSKiY5sX8&x29tU?U?zf<^ z8e(`S%L!MWMD{qJ5z)D3NR8KLK$Y-m4B+>ZW%ZT#ae6&TG{{07vq@$SnXOb);V1L_ zat&PnD-SDd?eX1E1@5)U#Q$v0Lc7Ij{=nzypo>LFxH*Tjtu9@3_7$Bl)_WLiic`%ZHKKMV_`%e*eY|Do+-v#J)>nX{4s!M(UX`ugs zN0{^LE15KN6|Uu&lPA;nkaNjJc+T?$ahZ@w)Ga01<>9g<^y~%_d)}MQ$#-MgpLpRD z%{R=7#cCX%H)+#Ky{J2LF!=+Ctv7-d z^Aq@LJBlHAc?oQOeUIwaHbT|8dDx}q45tdp(68zt6YnI8>#F`kL8B6!m>*0d1PF};a2ZG$1 zamI#^bZCs@K6G`$*daplxg1aY@qX6&O#?qWeljACFj$6iyPYvOSd~7!umpqaw$l`;J48f0oIXB&8P<3_V5-*D z(@uL0*zzil-g-WP9&Bi*uM*0rkC892dOn@oXDi~d+5-A(#|?7$V=$aupgc7gF(hD?+`qyV3dH1%S*#3&f&LnA4`dJMEYm&G^f*yADD?D$AsggtjlCvobzH5|@QisWl`O9f$E_TpX1hlA+e?8hDfJK2r~aF_Kd?De~`a z9xd&;NE%~`v4W_QpCK+Vby_Dmxo$nxh&zvu;>NL!n}hA=SV@CpabUQk9bP4vLFeRe z)F$Nts{B%dPh=i+1NRJi#-QfE1|t0aEkxKKqj@_nk~RNUlkZz((D;`VUa#6gGM7ZM ziU9%`_ih^57#9eIZ6Dd-xfiHVnGD=+6UJ>aL*$8?HL&?hFl}i7dVCQzGp~uKe^tuS zKm?hWgWH(mSL#fY<}kILy9qlK_d>d$FTb*CE>`}(Q{SLP|LCOR(S4Z^`jp!ztu_Ox zoAZgP`DF0ne0765hat*J5V8yF!S_f4Dg^JOzlQ>$R<{GM(_Oqx@;8XA*EdHO;PT7!pHW zBO=KNaP;US?2y+E+_NK}I}392_^;2YU*A#?xMhdd7SZI$>D>_`Gt;nLU82q4p<}=00qtO zmLYxLs%=_wVpw)FW)rGN~S%thVC{{d9=amZc92-mxlQEy(P>%du}@58msx zrDZCz*pqtZuWl0yvIrAQODAO9F=OD1Ul%2n+ zn{!Jjq1F)xbliNODmg!5*9M1xYuPt`k5C4A@2!bEO+8lI@hw$*v5pjfGDoGg^<-_Z z167jmrkhff#g zp}a*8h<5#OK0+Vl%IF21L zL%W8y{8r*ETrY`3<9X2Q>rEHEPeoz>xg1k#tlZaQAH=j6(rw)er0V&4+%IH|A!|Fy zmhivK(oFH%$H}Ykd+s6XA8-@H3?I^(bPe#&TufG9@Bxji1acsg<7_V$fGX&v?~biS zzfZG3BcY8>4T?a;gdFG@A1A(=V)&+XoR>F!Hmq#g&z!1|z@^pIEIZ=@iJ7&E@bYHU z_7*j?bU#C-8?Lfbe8Z{!{RDDrl?ePYaD>Nx+?{KwC4Tw(fmlXq)9V8fP-r6tza;n3 zDbubH)vRu^$X5t5EwsQ-a1F}PY>p+M3lAX)*d5sv*um+oB=i{bgBYNwaAogX+f)q`K)3Z2loxvO~Lsvp86zb?9UJdS& zYs2q)_nBh#6YRyY@6_qFCx7J7P3mR3k7VZtqe=R9aFVpegXi9n<`ES*xGW6PW&Ma0!CGzGM1T`+43{>EM4N2;QCehnN4$ zMtiFS6s#42tu8VU`SdkAtz8Y5 zqN!g1+K(p_*JBSu|Ar*Oy^hoLLxmOY=@Owwr)kn5pB;(Yj;(+_Uqs2S1anAnZpD_PwoFvVBG}u)FnJrU!DIj3 zV6Y&9KeK_-I=^S6R?ZN%aCxFAP-UgE&ycWR&5Yjg9{f9PCd{tm9AVv2IKA!wSc_y6 zJ>&ndF*b*URE6Mb$p)&<Tss52-2@`K5sn-e0FCQ*zL_Ba?4JG`}<@}(kmpVTR47LjVAr2 zz-1>6iQ}ZBoj5zvflBH9px0{^;IBT2uTOT9fEHQEyZ8hYMbtTduM#V>Hv!ttZKNfFk8#z_ z?YOS@CSEe)Ty!s1L&yVVh_*dPC8}4!w<{s!>pQL=Av^;v*<65HLpO{xR3OtHUSblP zC>%UPNxo|nPOLvircfU!684~Pl?Fp=MW*4IN_{CsG$lB>0f;(D&hKPd?*rh^4)u&pPV{xaT8oVKap z{Fq~)$=N#Rgv^4&CxQ8%Aw(C2YLSaO^-wZIkNLQD1MHVzXi1hboRn9sSm!zmhFZQ- zMH^LksC*Pl3Nq=rZ=0!ZOEU9h@+Wk#b|D`s8}P!+OXSzaF~;+95Gv)gid%O*X8XXHVXXC6U*cI*GrRF5b5MLORdy z0A*0^B`ski<#c~(5As< z2)A3n-4T}f3yQ;_VKw>Ef0-tP2H-LEKcr*lWDGJY=Iyy60Ax1KXvkl9Y;fpZro}mhG%}{()F+or>9PVgp}K~^2dJC zFLn~%p83wr9PNSe)53DA0Q&li57oGs4+`s6f^Ojk*ku!hLRk7zRqh&fLsHclabe|VAF;)TS?k;|(a zMpBJlHENQ_`6CYI@+~gTMzfbMsN1{@XxvZ?qvuUAP*4~C*$TsE13zM!qXUt@r(pfd z3s8310=2I=lJ5GW^rJ(ahTAO^cHkFxRjnSIYk_;`%UfM zO@>7@4zCuzM$Nb}R{0AODWgTO>CYpEZH{5SRV7l7%@=U6cn_@gSPv!tCcuNrZrlrvQaH7}{OlHh@$R4<7MH==$#f_E=VdYzM^r`yFzh+>C-7)Pn_^1J#5U^tHWKHN- z<3CjKN+>4XI8M|>Ho@sYL;lsXdH8612bYHsCUH%TM4-eLK=?14do2iK4J)8`P6Me` zyb3?vF5;l0JYLZI0IC{|{2sOmKPp@%0*0ly>V70jzo>zW6FZ2wsR?6pUI_&X*TB?c z<@n1e1M`<0VC3!M@vM$A9Llp|vf(C@IL`4J5(%AlA>3{{gXUjI#Qt1C+#-4kTvcXb za@jI$P!gpp^&)YnZ5RX&ua49bvA`Kl$#8|cvs@nQB}X6VqLKp-o^6QcEetyZ*=xQr z#8?3a{vzadxR9lq^RYMg9JYlfplI_Ukkk%=itw*QyH63>BfHt-Hv*{f0UlATYh=_v zn1ikSZ2W;v(3B_#wOfo}a&k8lqZ^95-IIAyf;tf2#pVAVy`u3)jNrK0F!6sq9Xy;K zlFZ`A_;f=DJ-;Lnqf$kvaEl?w;0#2^l61m8*+=qE^)jvZRN&3~RrK`AW*YIT2uA<9 z;H@GS)^$z6)z|Dz>v;j>b`QZ*v(K>(6DvXe2%mLcbQB)UO2_Rvuc*4!IFoSfIhC7r zk;n?3L7mZ!knvB;OtOjl?OyAKh_F|rZrWw|R29Sh4uxP%u>-YYf8aqzuy$zSSz5;B zmdXd-k|Vt<;i={t*m!6PJ?zy-)`iJ~|KC$Ea^w_z;k`38c+*a1a-D~v$Vu@2WefQR z#i$61w6NKD9x;l)G05rC+6^%d9wFqY80z?M0>f57bzv0;A%p$n91> znZ7{XjQMRu{`q?WE7wnsmS%FUXJ^>gI}_u34pQsuay8o%Y#IHYYjmH+J`h_g3CY=O z(X3`3)HIwSul4T0%lvF+>C#~O)ZUq~Q|@MkO|)Ut*HFH}dINZqsDafTrDXQSQczse z3y~74VDNS)t{#a;hbh5O^<1*{KQ|TVf8oxox|~E$2aojdec!zL1E{};g`&%d^{k+YeWbaQC6i4X82TgF@*pw{m zs=?EW@3HL3TlCQ^rMv5=!^4K#LA{1;dS!|3qtDpz?!~a&lj8&5ji9@1#mU&35+d&PopBjV zq?e!8umVdHpJ=>x8&ubI=c+ZgAI za->wIm0WMMhrWtIQryMyu4l(%L&jI=>Qup<$p_Hrni?wW#sZ$c05Ymw?ACaLsOL+( zxj8}#)wK~u>nazb7;=-mHc&=`!kwUT=`QIi|HFD*y+a)3RUkF#0OTZn#LCzsWLUL| zEJ%#xU2ax`uGpP8u=xmxi?~qnlFwvn6u}mcLv(ZeGO}QP9i8{j5~4TqVQb-3@GbVi z?d=P3IH(QE-l*Z%r$x-HByH%cQHO&Oxn#=6F6uwFn0U<*MWcRI)aSB}iT4xHSg4<> z-%sSXI`P=>B24C-Oh_+%`Tic6C}5<#oPsF$-_PYct|9$YpXAkZ+pvoI3k6xjyqM@8moKa_iAn_Az&^%+Y%Zyj8RD*To3#TR+*%x3G=8 zd0K+EC#ErVZSJH^b_ND+3Wc3bi*Z?NGgVoi11ZrXH1e`Q?Jd_?V(yt(y*9=jy*K@) zcP3=R?@y8t-g<=QnOZR@7Yd6)HQ@R39rTiU5|j6EQ@Cd+14bSn$!c};?f1DQm zn@i874>Qw_P6I8`JM{b^HT3#;oA&yef!5o4jCvjef+b>P`;JCTp^aQ1@&Hu3M9^PX z?o)^BGoWR4E55iHjj4CNh{Q85BD4J%p1PAjERQ9UTDRTMF;AJu?dG$q4pia4_DFgo z#Svxd^`Y{SM6LDqNjP) zQ0K-O zc32tmrnph>QD3@on>%=gEugXX_HggLC@Bfo#7%N*+0qF+L8?9sqAIiSORxZbUN+aP zs#6h@GIrwbXO!8vtcaxB6wt5dbD{2u2d?YSgp)is>aHPJo09AXN2VRYl(X-tXDbhO z5*tW!H-<&K?O>_JAv`0t2@_5vl91*L^xE_w7`=a=ma#i%4mW2mZGFHj;VD85oTIPH z`HXd)0>+P|uy2#IUq%Qk5C|DP;pBn|B zy+s8-ED8pX7pkCT?tmSeQ>jsx66h>WMX8d1%$eBJ0Kc#Q+MhjJOQ}tO; zHH?OysZ*)vtt}8(9VzzV%OA41Q`IZRo)nLU=dm2&vmrUM3F7^!XS0M7X0UZAlqM5Q~g0(sQhdK zk2Mv@#hOskvRZ;Q<~n@#Pj%?Xsjqaa#zeCtU+nl2GmcR~%I(j-JOndS2Z-Y znq)hMziRF?)5i4S=Q~xL9DN&`TRrHwcN`uxEv88yeNjp&15exThbHv|x=F1GCpyUlS45<5}uT_5{3INHS4vLA@8UNCU-7D`SMH*cs$6+iW<_u!;fgB zbU)SdEn%*9Z^GfM51>8Y79%8TOcitT7>9`gAmEindy*e9M>XUzd_y?hv9=u+uSuXL zqGGk%ZmC60t-D8G?pcEOW!>r0pV2T+WrQr=Jq3iN9Kd=1Uhwa;hW!Nw9Lr-X4!3ag)w$GL(*(p??y?nUpPT$k-3EV$<+#qBGb)$5k-X>c}X%2~-^>0>?q zkA%Cpw!j)2{wQEzO9zxoRPis|OhIW+E<2sheY#_-=){mObY8wV{Um6`IOsm$IhTjf z+NfOWvt}ajS{t$ET`YH}$^h#x3Utb*J)G?PFFDevfFG?BIIp1-YfvSGi9MC{kIEfz zcPSwXVuJ8hx{8h+wIlbF*D|IvXEu1;N8-n~kv6XNZc?&9;16|Wmt9lmKXK{gz zrUT@--70*0DixoOy1}Kj4ostu8a2(#$1SbBq_g4(Zk&G(em^){V`XSfR`0f;*Pd6P z^iFlusqJF|j3Q}s)CaolI+xLzy`ELlFeW?RsFP*X8M=Qifuz%|od5O}$?R;P@9qEM zK7(kOd_ogWO4y=b52vZPy#bHSu%$+)#c-?ea;UlTjI7@g3*ELe05czAphhxk#srdW z$z@RV_&m8^G!r~7O4h#ev4j#EaVi|IXcjhWl#Cy@;`XVY*m&(e&iNQmZjT7jWvzS2 z!TL_Bcdv;ij;7!o(bACs~DzfoHf>5ET$Sax3){r0DZx%k3_ zb6QM;Wn#{J{lp9SYqB2&i&oq{ate;VR3s@N1UH|pg?N*zOkO}K>WV$1vFG1YVUCya z=mUdqq61N{s17Ghollm1Tuo({Y1gVP%j7a^qR{U+nJN|=W6NJ2-VaR0gR4`(ZDbEW zN4t$p+0C6%uBw6U%2@XKd>^9QkOkG3_AuMBU(?RaICTDg8UBRSF|u9a=sQ~wUR$rj zBLOAQ7^F@DUAY!(=x$K={6-reN<(3qK2|oEfcWHIBF5!=ypk6nJ0X{Z-ZjJS7hLyo z-xX#|Ssm)WPc@6(mBQ9Z{h<1@d|z}Y?dq7$3!Va0bzNUt)Y;|KCs z(LWE#f6n@_y)GC2DHajFn<%Ouk$_!WYN=NH1X!3JNq6rl!h0!&_|w#q_44F6x2x@m zrQHKESF;EdREimn;(~cLTMT$5yPpcyH54JEj3-^PO{%uC~+${R(i4__0Jp{KN^J$rk z1AOUG#cZ=w6qInqi<=c`<}+D1pbvCsl@Uwa_tQ591vo>y89L^sVz2H!M$q4vw&d7> zK)f)u`=W@BA6`=BdDm%PVj#%;kjG65d<_4AktcWUCr@)6@T}rhCVAIcSSi#+=Ih;} zi-W&HU4|1V99_e@wFy9m`!I3-o=8)Ey72w8lTp$6A~va zSUXFbH2UhHnfE-hK}iv7KF&64D6F7o{$$bvY0tsMv=N7g199S-E(rddMka|4^IwL` zgAK2eIcOz;0xwUIq&8oMKeU>TyLwUgb{F_`br1Mf@4zoyuQ1@5KFwMF8_%oo@JgH> zljD_(-sTr*Zec#~r(2Qzu@n=3{K3$QX0|Qk2UF5@9V7IT=%~IeZ{&2nEV_lw4f+$13)!gNxd4EJ{zF*}*vbPdNixocpIk{tqAT;2p1uLm>zSVc=?IF8m8 zFKk%lM60HYqqlc3W6^knScgPX-80SfBGI5b3PMSU631at;uzy)XJK1QCaXVBn2hL8 zf@5wns374_B9>^dW*(`ZW~S~i(lyA*0Qbr{{*wRC9U1tct!gP^tCd^ct_rdC8zZ9BVaov10Z{`u@RWCRRTPP8OHbv-ak-D$NU-@xTrA!POyF!{P^w zm8Mdm1(XIaIRXDHBco zGuA-*gY9gM`yve2ii2NzQm7lr`Lct8v2xBjeA+JykKOMv4+e^H2kj%Le&m6LWE(a0 zuBYKC5GY;w@hHG>*M^UJPrsGO6-^n)Jz$Xi~K| zopcJ6(arhy*pvQA*saG0wE9N)X69(VI*gkw`EWj=9D3@6Fg(}F#INs6;MUtl4E`NR z<8$6Zv!*!cJi5p$Zr_i(2VYY67j1Bvb1{gW6#%Kr=gF%4NL=mgfFVI<^jz5M$h|T1 z$V!X{v^s0fOex_ zsk0RiQnf|#sP+`hd=-P6#@ErX#ZoA7dNVoPoDHS9T)%s%4ZWRv4g?>&(k9iFXgB2w zPL7YkMXv@(73Tt-@vM!1)OD1w7&T*lD$19SP41QaiCBrUYxTvtxrFKnQ3+F$s_J3GjNH>qfN-3Sx{Z_#^;>_9)*i}%7X z6tC(?;mzryI6N@}Ml0Lk&*cLA*wc!l`-F(G5y!|?Yo`3EL+CA|NN!%zh1W)cQ1vMR zC!TytmsM{CFJ}=t(|rIE6{g{stTi2JKS7HRY@;qWi-GT@13DA-gJDP<9<}Dk@*BCC zU1&BI=osU;XEfcSyar9a57Re)l*yv`b70WpHaFK3rxSQ0Fk*4AV#T8S)LAT*O&)%W z8SFV~lWWB$h;@^)ucF{m6T)?UPgCvfB2e3y#(2*E%l@uHg)>`3-A0F%CeoCx%cX6 zJUnYTmxl_1=1Nb(9&|%%zf+)pBZ=sEc9M;)@oeI(i!oF23OV>@gdWdNrU&BP;rg{S*5ZH? z-q;dKR(^R5T_1uVw@@1zatDaj`zFY78e-Km!f5lKqYQYg#n*=v;Y3Fk&5K=4rPs`$ z{|19`(AAv`-(5kc?o8u-zC6O)=^hK;l2_8+EM06-%BEtM!-=b|6dDU#!|afD?p;yD zF1UOQzsYJrw*3{}k&S62>30MQN-ZasIe&3hu_YKyTF(AcoXDIJxlS*zJmzwLH<|9g z6Mx5DrHK^MKd>dx(rSl6U-*9^d$d+cku5OY)8%E9$cEs!};B7 zK_aOHf_7O_8o9{6#f`+YsOS4VpLs?*2#6tT3Qflvlivzvzy+|DyIv)aS=P2W`?Qxjl z_??KlW}?Ew^~~$wYQp?d$2BU4Y4^e!QV`$?6Ewz%QpXW^aM+O9_G}~OZ5p8FTt>-( zb9|1z*O%>kK`59Jez<=j2}_eGsf&724t`9hlbrk zoYUb7<0i;)rL4LzxycKY`j$h4!$iC{Hwg1Gr^B~b^04OENp@()EU-RqK#EE?G5b3o zkz?vy7j0=9Ip8<5R%EXP290Mj^G(m;jqEs@Ic$!@PqL}?24UuTeSP{VjVguWmEGDwv=yU$(+|PCHb6sz)=lPlW&g3(neeGsv zcC)+jIqxt0xZ^`f-QUU)QTMnDhV3g5Py3wb3vPK#3|QIIIrUj*g-_TnsyAz7K7Gv} z;&h+!X5|LX`=Ng-zvrd3Kid5RRqawI+KH(ZMp=J)rdSJhCAC|#^E!LSf#y~v=Wi)D zX>rUNlVFMY-=Brhk9-+-22=jQM3C2^X{7C?D_Xr z6yqPf)4Km1uU$AL$@;s*z?*4d$tiCuNBw`$jLTZ@uz7m-_^HLuTZBT}zwE!L%M6f^3( ztZA-FW@7ip?fVvWv!?xC&dOPFrZ8Ff?LUq?=c@IczYT7^Sy0A#&B~$qGwi_2uba-_ z6txHZkR+-_D?Sr1t)Qatt@1Llcsb;}g)*mQf+txp^>qu=c$UTgV{ z`1qwU!rkoD(~oz4OzdyD)I4u@waVUcn>}GmW#J#$Y){*@&hw=mH(AegtZ6PflH`2W z&gdu==aR%unW(vQowdtX_McHHUoPPTcX_ z4|cuOe%7PTW41Qahd6($uZ&gh`Qu4LYHkzFuW2gAm0NHB^5kRoFAFOa<~RDoy71I^ z+q>;|vsubp=CrWY;+0p|7dBYA#Vnh-LHzt!Mf0P2r|s9~k1&rt@Pj?FPD{H~?HFro zYA-SC*u&PvceaTa-a6TCRqO5TGb2V?8Hv4l9dZT?# z`Lfm@d3oab-|s72e{04w+^C8wJh`T#o1zo z{fKz5LcqG_+`6RH+|u^rx0kigzVCbn(b)lF#_k`iH;=5e_Qu>IVs3j+w5pb8rB|

W{N3l%8xx#MWznx-g@#;@xlAdz@p%Yg?}qAMb4}<`f*a9<8xi%w6)m$Qrp-^qp1T z>U4i;@pUi5I_8Q?dgs+uW`*Bh5;LEiYPLLDdC%Z2n=PZ&LNO*~NMXB&h9_URY`t8crh-|XR5XYu0wx+$dJ#xd=gN27WJZpb>`Zm$^!+B<>d!5h7 zS+G0lT-oWnOF7Ratvj(yeA#)vIi})Qg|XKUvF<Zdkv(D$S zk6%1ZR5%%CMtvV<_B{V-VdA<(tC{n=@{ad)N&0C0w`Ql5O@;4ejWNr9xl&Ag+WCFv z3zfu+?N_|b0W=;QN}%ATs2l=#ay@%0U*t+?TPMU@wFlbYW2vmKxI zfaqRlt$p~7UZU0wjYOs9kO~D6cqob=SZ%&S%zt(r}uY_;WzaaNd(OV5eyxuh~nyzHouvG zsrt@)9G9#&&v**NPv_T|Cze-nUdOrE?w{Y#@{MR=6%45*&K%7(JI>kIe$|d^MQP#u z-HXl%*70FCiyK|ni&YQRwHkhV%)IaXOJ?5M4Pto0NxNKHvh#bh3x#jBTxsW=Y+;o? z*w&i(>k?~tmDjB@BU@Qjvo<>Kw=m6zJ}Iz{HLYzIEL|`9mUcc9qS5Vke8Yxf!<0?t zvYA7ygiV!1`++r`=Y-GLH6EQVCJg$j{mu`+upikz$FBHDx;gsfe)ENWr|dz^Z?~SQ zP{I1T{aWkG9nJRKX)H0LUT&q_pn8%Jx5g#5oRM_e0=7NI#ORU7ri<8!->=hduuC={cHMVa} zdq&i&HeC3RO%vmt^OttZciLN=AE!I zzZqz^iW_RZcXq6~GHZi){hrb0h`dki!HqXrAKaa5oycF5RAKm0ak$GWGiuv9EB2H7 zMck9Z+PHC={YB@u?04&)x6^+3UM%lkO6=_LSW?v41oQr9JDR7nldV7BTW*z2SXtQR zCbw1U%e$btg?Jv!BSU)ghF$~z6ktCMymEnRF{b0#jaH+6Q4ovSUo?1dW( zN1ZDxHr#f=bf5dfJYTn}S$}g~(_8LN@lg48cG@Vv=(J&h+3gGGb74#0U@o}+QM2_E zovq)G-5^fS&$a6P+EJuTUy}6Hy4d6)d4=|o=RXlgZjKVY8_hIde7CEZT{zKl-B8at z$L%BH-k#w69f0o(mo)BSHt4vlu-e9U;$HU@G4G*~W~+c94(~sfbj!W#%_r)(#gm;s zw?7NKVuo*SSNKSJtQgz0w^{l31=dYFZx!!UeLyUIy}zG4N zMT^Wi_n03BUNzeWT;jFouNR+I>YTi+buTgTs*gnOGrh!3D_=F=Ya1&z1vXe_+Z_e< zM^v`vdUuIo6SkU(mG%ku?Qzzjg`327Cx%+Wd2R2X?_M;A?wINPt%HC$ z_4ys<-Zy60r3Q30f3Nv?l7H(CvrXMzV&j1C&1c^H$=p`G8$X2xn44t-L}I#k-5m6TJWT`YSE9@)vf)_`HnX@y-n^C`gn-rE&Rs2}c-}#-NFi+i^Z`L~Oe1PK1 zRmE+`p0t15_;kUE?N3^h7S=XD>3ow|TXwgo`sf;Kq37+Srz;+^%HQ>xUC-(!M!9Yf zPq%X33tPLK_`~lNbC&*IxVle0@j|11R=M*v#aA_F+pEhow&s?)N;K)3E>dHh&s05E zNi-YKOPtE6C3e>O#O{36IdkV5N#aiD?*c68Gs<~Q>kndVyGhoPiO-tNp0>?Vd)#~G z*Iz5zU2Rz39P4O*>sw;ZE;qyazM^Hl9G_{$|LXibw{g47yc4#W5pIzIDOcU*Wx^-3`i#v$eb12NxxZ2YdcuFFx?G`RVn&?RrCB zEIjvHxcU8qcZpx$TyKrPFgza zo9+~1N?dPi@SYC~r+yM84sX6EX=tszcH5;b#i7~1n{W1g+g#c(QrK_IFu(S6vi|(- zUa_gv1~a@}BMzS^w9Bqfvf7QYto&yV*u974iomT`7e4pR!*=Sr zP4;!8E{b+DhMSM3)h_Ri{$&v?_JXr&p9tzVX}r z)~1c?t=vib?AyL|{+3Vlv(|@)H<&HVPwkQ3hwNYK-r&4HI>PSrxpj{iYBveGvD#J3KP#{+Gl=B+Os&_GH0E3+3mb{ zn28;F*^xiaOxl0odSR6P%Gx$RPK?{R%gm|wn7OV=ZxL3ixB0B|9)*khYZiVNIA)i9 zYk^o;x|en6wbi@l-*TJz@>A8V**@pJ^rk<)y+wtwOeJa z$=WXNdD69K!A~DrNh4@H{h zTNU%{;js!-RR{^l-r@3S9^+n+mV zHfr%~LCt+G@p1Av`?(Rl#qo#*BJcN(_7c}b>$N*N+h;zlEv}EMP_Q;FNi1C0#(5kv z-irJARXeh7q`l91pV`R`7tOmP3$1w>3F72j=RMh@AGS6h{o4M%+gfw{=tJhSiOcOz zOP8}pOsZj}KG)1@)M%2~XZTtxKCO)P%hy@f$B#TM`oI5*d8XAi;h*-XHKTni>zgrS ztj@PAHyfnRv$wu{!EUrG!Ys3;(5~PcV<&%ivt@tZ%6eeLH`bE*cbdDWCt6LKeQ%yH z&)TW?3@v=5az|_Tlx(ZoYmLp1M=cQX1&i!XW%r72U)^E8&?~|mU1y`{Rwdv0OoMyO zdYwEXd~RcL?v1z1Yo7nbeD~oAR<#w*`v7jcUF?1HbF*-9hr+UZ4~TnjZ{nP1jNa${mYtJZC|!O zT)wAp^rx?j>h#I~(&8^KhS>FzPX>qwdZ=2u8IIrP|eboHu zqX^4b;c`9)sH2(iXR`A-qfdyzy|;^>2URxHhIAE!ZaHecy)EBb-tvut54t#?pL?Kp zQulY8i6OI3o5v=;UijPS7|T7Ptw??SPIE@nO5)b(T?${@;<4HtHtiZ!S6Z#Iwp$mE z)DXkhR~9c!&NkO&Otm^!OddnKRWQD!0&Ai>EUOH1)E^@zEc)=x36|S@1 zu90IMy~(xb>|4=R_?s)mun+uu($8+UM;(98JTYRPd1Cbrb7sSzcDDcVgx%$ah{8qP zPKqvH-DU6X)K_#*pP$s^s`u>i?O(S)ZZ^Pr_Uk701MTXHwO>Aw^lFDmrkU5&+&0De zJm)j_iF#{Jn~!*Zv8q3|&pf_*f%)aa4Dnmbe0z;+U!iaI1J?FY&zKc=9u{+Ixy45X zrnu;>?EJly_Y2E494S&Weh{Dk+Qa&O_4`)ty=|;!Sp{Oug!6X)KI_HB#{yRVRX>P_ z8q^cN)m~$jpV-j8tKiYXZ&pSG+O_OweKdZN7}{ZmIP!2;>%jeM?Vfj(5iaL*!N0nA z&WvsTl$aC#rdj`kkzz{Um+jr(#@lbay26_B=k3_mrPvoxZo4H88JhQv8QETMw_!6SYd;Dz<;oO8ho2 z$$9VeHtYQQX4cNuo9ww`OzUvni}p7^?@l`K?G$^>z8d!Z&mQ01a7?neb=!T`CtDvY zIMVW0v!#2YwQrAYji}LCRGehk6`Ss{qes4LZ`)T}Wb}@<2DG!RYnKF^=eq7|zv+$k z!ubQVW~qi{tsZY5wOdCT$xK*MP%yvN!gj0v{KYK%YHR!U{mvHrzRWFp^zev|BcC)cbU9-8^6j_he9+(8 zvdq7I&<88+4U_M((swN|lg6G(I{Ig9!I6(gio!Ox+Fw_wm9#1II`h=lLh;+C`PPK< z&8%AAPqf}hJ!P+|GPUqcZSJXMXFRuB)RW!6Ah0#pQXRopIqR+-G1uD2DU3h*pEKE z$J+Vg$L5}AHd!0bS)$B`1*WHMRcl~WZBhN`0((u&8gXj&9j5d6zj@=+)66|T`|X7I zp;p|l>ylpHIMI1t>kDyl%v9@+bO<3h%n>pncRksOYr>{6hc%1Q0*~0R#|0009ILKmY+f1+LPw7OfCK009ILKmY** z5I_I{1Q0+#p+F0TSwta#00IagfB*srAb{Ide)*90tg_000IagfB*srAb7OfCK009ILKmY**5I_I{ z1Q0+#p}-J@Swta#00IagfB*srAb||^sGfI1Q0*~0R#|0009ILKmY**5Kt&E zOkoyL2q1s}0tg_000IagfB*srAfTtf^?KH#6#@t#fB*srAb{N^{hoJ1Q0*~0R#|0009ILKmY**5Kt(vKw%b92q1s}0tg_000IagfB*sr zAfTtfZF<(C6#@t#fB*srAbx z2q1s}0tg_000IagfB*srC=^(tFpDSz5I_I{1Q0*~0R#|0009IL&{JTkp0#L&00Iag zfB*srAbRF3c2q1s}0tg_000IagfB*srAfQlS zmBK8d5I_I{1Q0*~0R#|0009ILKtNA{`}C|uD+CZg009ILKmY**5I_I{1Q1Xtuv%dj zQ3xP_00IagfB*srAbx2q1s}0tg_000IagfB*srC=@7A zm_-x<2q1s}0tg_000IagfB*sr=qXUBXDwPGfB*srAbx2q1s}0tg_000IagfB*sr zC=_^CVHQycAbETRxV009ILKmY**5I_I{1Q0+#Pl0oK)}j>x2q1s} z0tg_000IagfB*srC=~c!VHQycAb38C_saC5I_I{1Q0*~0R#|0009ILP$ytSsLLV=0R#|0009IL zKmY**5I_I{1oRXzyn6Pc6#@t#fB*srAbas{e009ILKmY**5I_I{ z1Q0*~0X+o_zn;Blg#ZEwAbI95fby*}KfB*srAbq_M#O62q1s}0tg_000IagfB*srs1q>CsLLV=0R#|0009ILKmY**5I_I{1oRXz z%IevRRtO+~00IagfB*srAb}EUKmY**5I_I{1Q0*~0R;3EFska=i&h9A zfB*srAb< z(Og{?NeCc-00IagfB*srAbI94y z>as{e009ILKmY**5I_I{1Q0*~0X+qbmU{N06#@t#fB*srAb<(Oq2@NeCc-00IagfB*srAbas{e009ILKmY**5I_I{1Q0*~ z0X+qbo_hA86#@t#fB*srAbPAb)DG| z2q1s}0tg_000IagfB*srAfQgb7@{tVBm@vZ009ILKmY**5I_I{1Q5_uz_?b=UbI30 z0R#|0009ILKmY**5I_I{bppmvby*}KfB*srAbDh}`2q1s}0tg_0 z00IagfB*srAfQgb7@;nUBm@vZ009ILKmY**5I_I{1Q5_uz!<4#FIpjh00IagfB*sr zAbI952>as{e009ILKmY**5I_I{1Q0*~0X+qbG(CIK3IPNVKmY**5I_I{1Q0*~ z0R+?u7-Q9Ck%RyO2q1s}0tg_000IagfB*t|3K-+`>_saC5I_I{1Q0*~0R#|0009IL zP$yuFSC>T+0tg_000IagfB*srAbRtO+~00IagfB*srAb)DG|2q1s}0tg_000IagfB*srAfQgbn4vC_saC5I_I{1Q0*~0R#|0009ILP$yu_RhLB)0tg_000IagfB*sr zAbby*}KfB*srAbas{e009ILKmY**5I_I{1Q0*~0X+qbd-d!^D+CZg009IL zKmY**5I_I{1Q1XsV60M?MG^uCAbTLG^ z_FrCPUguI_^}>DO)$7#h7L(YmVoXfd)X|gDQ=6q^Wi_3U6Sgkwy|Gg>QghQYGsdT6 zjG2@+IDK43%B0J`E?%E-`LO=voN)~jW=%+$mXed2ot~BZUt6VTWTa(}&+GJ8mGb3V z#U!?psyrCBwm2jwEn`g4{}(SO6fOMwE-zaf+|~T%c^yk%y4dyV^_<^7v8S}N#bNgs zhi7J`Wn8+{=^5if7K*n>2$|N;&di+bT=pjF{zc^k)t&uEsS9m#g)8TZ7bIww*Ez34 znM-Ez@p-P8#5|XTc5B$J#Uwdtxr1|4a;N5$d{Ml{xvu_NRX;avMy>;ukTxl&X-;tK zrbVMJnHjlh8Mz5oLeWxE!kjA<{XY-6bSXS}$4p=Qm-N>aR;Nyfn8XhM^h)kp z?3FflY?^b2IW5h((k}nHczwdKb=%^g z)XYhl+1)d$Y35V&D0_<=bwftBQA!o0*c68~mT* zNkVX`=vdJ>VPbm580TK5UOng1E4*Kg8lN^PD=jAq? zcTxpnmGV+-(2)#^CzkE^o^7JG(66C||x=Ok%UkcRAfRvpBi< zyrSs8MJBCGQG(QAIll-k*+)NgR3k4#rI?&L5qfnKCBTxk;9MQM@Lh zWD>j+ZJZFifu_w!P0Pyd`7b}6|I@bwo6XMil@$By46g)xL|XCgi%wYvq&c_Qk}rza zB$P~o#s00!6}Gwr6PXwJ*ZynO>KhaMSuNRryPm~+366?R7}8TO`?7egbD!nhJT9$v z4!2VpCuFDP{L58;9<7R<`?mMy*&|<=0aUUyb5DPR*W_Q~dwIACBOU zM*WZvC`t@f7*UxC0o1H$neuD;0$EHupP0Oy|IWyBa z1ITEg^3J7amu}A8X2#g`aZ|G$ugr}0327PAnvBVIjyM^OofCselM;Fj?%yvV)A@ZcN^5NQ{QgRVLO=8Wl*=S-TDpb*{M&0vxlPVI3YDVZA?zW z*v#yN6sK;{R+skbT)2_WcMt70Xzbq$C9@`_<)$Ufs_C4I4G!K@ zH_a)zl>a+-wnY>QuK!Cnzl6Mq(#7`??VMX*$Q@s~hQ+r%=R!JXz|Qqs@1W_C=En5xk~M86dMaP-vZUeUGvzxa>%*ZF7rhxuFk%ST;|dM|2M)ZI~2 zqWVVF^8Mla!gtX3ly8M^s_$A~3t#ETpCaFm+!lFv(Y#ob$ZudD?TQC)?BC)4~(u{>J^9dxv|eJHy@E z-PB#$^{wl$>tWXd*Em-%R})vM@blqshwl!*KRhG6b9jRBqw%V-*2pos7?s0LH(pxP z7gn#1Q8mUeLY{KC{Oq{HxU}4!xoML-#MN7x=xiQuRQ%`WC8x7VInL7-X-VapEKLY* zS?k}o%+0(u%Q->ol9JCOh}h&CAtaS}nMl6nbeh=MoM{pPZICHMhAd zereUbg*$um8F%Otz!&n-*sx&Xe&UvX-Wofy8UFpP@ z{nwSzRhE{y^2%DZYqhSjwDiBOOsKN7)W5Ebs<$-GSs7?E`99GumkZ`@*O&7ec8}WCS{HbJK(C4 z@6bsrUo2YrqAMZap_9V*mmEUE_QzGrcL1GDD#wKT{@(w-N$EMx^DklhYUewI&gyz0 z`+h#vIi<<&={!Y~JuPKY*z*-DB|jp#HuSRu2KaJw2y;dPcf)mE2w{J}~FMw}`18m>t~0 zxnW;+rR4XUI(c+jc36Jh>VaARwZ3e8;N~mrVSaAr;NXvD*!)V>0yBeKR1Dd}eCI?u zCoOD#OvS*AqSZ!e=bp9XC+n8Xj9Xll0@H(Q%3i)^j&pOJOK~E~%y>#BjAE3CcrNM%-wN`dU)+K^te zoCi0vT2u~939c$15?gc=o#m<-$a2<|H$plUt(sACE1%J{dLT2nQAoh0jf%FcSt*bq z?|Z8Ab3WBoBQQC*Dm1_3(PmDmgutZW21UoalFOW(?fkAHb8_dIxoJ7svDE_;gPVl7 zW*1+X*|C)Z6Xe}baem0Al&%s;53VXY?I=l~5vuwt*aWj)U`%kM5RsCN#+R^*B5(A_EW1ErAg&7%}5J+*hi7`Tm2L?GVJtiOMTuq~bn}n3=S8}ZB zSFJ{1*QBM4>FbFP+!)-T=me_d zTI%CG)XdJ!xh_3-d>?OOV0dtgI+t(J`_c){;NT<5-lb{{9k{%JlHm z3tS)Es_3v@vaidw>hAo?qUcH0?#&tmh6T3_F}Zxpl1tFt(;#r&e{S2QWZN#@T7jYe z*|Uq&vx~QW;M(9;AvgNV_TI@kxf|0xeNtK{SA)Qi|J-?U$h4D=3e6moMb*l#dodh><@@rI#5A+DG4mn^1S6@0T)Tmf1(B0YM z(&Mh+by9SSTGFzr^9)mFc2(yl+3i2JsvO*^vbRp4YjCTOADxn{O6fVBocryWmHf2= zUH&7jV(=JSu|nlQXJ@OJP#b^IZN*=%YM@haUC8C~T{`^xVygu@2G@r4@H)>cPEF5F z^H#4G=pe6-_-l1UscL~_d9~-S)gC9@l2^O`TJ4Um7BJ=2uD@2hVxyeL|95&ChQ)mo z_kP?eZ;is3)9f5#~o_ zM%@_IGpcn|t*BDI-+iZj@A&rnw)r0P-R_&=OY;r#b?`OzRrWb}!`i+hs$dUtnsOLu}h#&yy4rRy!%^RCUVHLk_3sjktk{w~wiz*WKJ3O^fu zJpASGo#E@l?+Bk8J~4b)c(?Et;ql?o#s%Y~@uu;d@szRJ)z;a%ipwAVTlhEOAC+;{ z3lDjo!rNaS^^-?^dT{g@~Eynsw0nT%cENIsHQwhlt&5jC|(}bkVn<>gU1c~n*&m61oK~9{ntjev(H&%A+6T(Rq3F zy*xT6kIu@Y@8r?9^5`3R^tC)XBacqYqp#%ADS7mzJUS_lzK}5qi5yOGxBJMJlZago|Z@3?v+RP z$fLXE(OvRrr98S*9^E02R>-5}@@QF9&{~Z2#_|fn^;TywO zh2IvQ9X>L=Pk6iVy5VKR!;Ei?_l=i~9g$x~z7_d=0R%=!#meI(L2oB&D+8o?~RVQ@PG0whVxp3HzS^N-sP}5Vo^kHL`p=z zh@^=65#=MoJ>Pjg^c?a$>v_bp!ZXJ+!E>FbtLG|Djp#$s1<@O$?~h&@JvTZtdQ|kl z=+4nCo#!;lM@RU7_Mh^<=YQE>=-=djz`x9Yi$BYs;veMi;=kHo$6vvDZsV7zucF?M zIviz3Jr(s})bgl#&g&#bM-7hZ8r3SQZdApnNZ$qLIgSr}M|{G!+4qq1x`{krwlCE; z#MjN&+E>q4$>(#fEa#teHG0R(qjB`S9yOOo z&E!#2dDKK6HI_$>S3bCV<%7FdKDc}3gS%HgxO?S;yH`HAd*y?>S3bCV z<%7FdKDc}3gS%HgxO?S;yH`HAd*y?>_g4AZo-dE`zQ3v2^HSsnEr^(8bu$#hB2==+H%f=wejpqAzqY zGIY@!x)>3<=m}kPhc3E87sEprjnKugkVW^Op^JZnF8&_6_*>}Wuc3<@I0q3{e zOWf1lS?+ZAX!juJHTPZJSG$|I>$*$3quegnZ>|$@o8#8S-4oe5qJn3D^SkgQ*U7kf zaT6j2Mud5`d2-w*+=rZ35_ELlQQ*8SF!tBThTiqDrz0zS_j^}*{SnW`eiVDy+soU` zTP|X6#PV1>_NmwhW0yOxGME{g5u55g<>?kX*!@TBHL+G~L+|ym@v-G%BO;!Nx!}C+ z;6%(Dk-H*Zb^jQ%C-TLZjghM&Z;Q;192wa;GQxY_dn{&6%-qQLV#db|jp^#$8q+u? zA*P)3s)V1TPe#8Py)Sxu#CH)NMnCLc86Ak85*#8@b~a1`&;=N`)fI`Xo&Ev@Q#mY?fD||C-1FM=b}E3ddIyf>R{CFs0~r8q83DD zIj?Z&71b#sKB|TDDu)WL@0@1=F8a>;PDWnqY3=*ac`m^ARCVumUb9du;#S{Q-{a1! zAMW-o@!jgX**DgC1w^v1mGc^iTD~g2(%x{->z#_@4Y22?QTFm0w7PA>{F&p1fNMb26o=BM<@1XbB z>Z%GMU9ccRx*x2aTDyqXJL^MzKXXe9_Ns#vZ-uy}o1W`CPLD>4q7}aT9TYXOL>Z5^ zl+(bJQM}q>e4)koOpEcs7UQKY#*3+>(}YFDIYGS_9GDB(_&LMI%Y!8AzIaqkwMnbL zpcQ&p+f`~(@1#Wv3uVC5duTq}ll80mX#K+Q6T^=T-&0CSNq_4*cKn9nD~2!qNUbl} z{yD>E4BL}mKV|zT3?DOm$nbtfD(|u5+f*~@GC9^;{NW8E9{iyspJTlq*86BJ$_}j8 zy6D3xi!&gTSUX3_6QGt~ZPWE7qOG8^#(IGwX_23?o~INbBRC^cP+~pZDut)0niON1 z^&}N_N(q7W1br!pKx=~acrx3MrAPH}y5+$(X}XQ`cxxwpFy(P-U14eElIlpox*F@+ z^w8I|8TwL67Od{p#Yw}3)FX)jH%(Mv4*l~oXw;AE7s-jEF%9emx)%sV4?Ieo0th6G!q|!Q`3N}Al zTw1XpQd?pjOT7$?fn`=R1xboLSw}1Sstc^6GW{pmS4C|E0;ran6bq{(8(I6nbYwzJ zikVJFCQIzFWTb~?M!GePzRj7RHl%&3$^2ABRwcNi%DH04CAN;*8EQuK5^E`Xg{q*<*v4Cv zd+HPYGMF1JERA3UjYi5BSJqV*M6F55+5o#gNxDt1EJur(4)qn*1iv|$YRp8JGTX6B zmGO1b@L1CDFeO|bSr;WqcGPoab)opA4Y%joa8n}%q%f=y#YP6tH<-BOP%dVdq#@`V zj32ngk+_uEDRY1l54EyipsE3yV#L+S3NfBeneL^&l9X{Ve$TM|My2ad6UP12l2c5x zraJpbS&g@dGDrZKCJo!^3Yo#Fg{5dK1v$iA;OZ=&F<+IE6pNqO}E@g4S;#24Ye}z%@0up zCMRrh5p{QE6IW4aUqrxoncUSJCcbPje%xYwzs2}K%4n#?iV9{tKk5=}bX*4N} z)?yA{Tm{+xNSS5OU{)A~@JHol>Z;sQ4 zNp={owz&Aq%?>mzvY+|YRp=&)jCcNQkZMo);vjotbh0{TjgsP2YPakqHSl$!`c9Tj zw{%O_bW4|XOJ}OaKHO*HNGPPBem)E9;Dif)Q~PS zt9z>nO`JxBhZQ3Rl!}^yD3n=Liyx^V*sWllH6-08exQ*9-+0Hfq>^gT>f<}^3l$2G z04t>(hNZRPD1K{mVbr%xSDWbO`PKL}&HPK6`QK{6C{Abi7sDwGCo`PHa3aGA497DZ z$8ap||3A}%?ZQ8Zr@{07xHZ-4A{K-{3cneC5$6C8h401=|MYMyTp3;&-X}aMJTg2m z+*7|%#qJHch&7p^w}q|_i2I+_EHG22Z#!yLUd1zK>q8t|*6zUSvf?ot*lf`nOb#d^q;BCQ6gZ~OP%7i?~ z9ARu1M~iB+5%LA)!8O6f!I{DF!NI{^@=ke1FeJtY4ew{~OYG}k^Pce@_U`g-@Gg^o zm{IR^^G@?TbE@&17x(JDO}Mcyf)v6M>kH#tV~saWK4@HHRO(~JE8+%k2;>reGrxAX zyU)1yxi`2Mx+l90);j%NeY<-wZt|n<3en4W(Ky+iV=Wc7`358wM#~p*v){#a-GH;* zdC}k1pY9yxY|$^l-g|{U$m%1$6Ay@$V!D2oUTV#?##+NI*9wSFMG2%EBE};|%vm4? zIWwFI&hE~x&Q4Cq(d{3NUN~Est_PtlVVHTaS*hQvKWBe#ykoy$diKA~1@_hUneuJ> z1iQ)JVy}lR#B#_$Tqtv_->u`sCFZX7{1%>pbhZq(o@=4| zSsI2i)Co+*rmN++!un4dk&m|N`H?nVA0k>%P`m}R9!M{@`&FDuZq~YwhT7yghjlMe zres&Ge`iK;PkID*r$umAMg(`ZM36eEv2LdsApIEY7LL23kc3L3*3E67^;kDiGX4S7 zjjiLjAv2EaY3S#Jrqm&lbsbfsIvcy1qT;Htu1YgsNgEQ9$-)|CYDHl^zdE&6X4|f4YP!x*QdKQPOY$O>s562$~y3>nW(Q&h4u2PBpRs z`!i@%m=>vmI;E&}b{k$#YbnK3DBo!ZQ`X7!t(p!LtP_bOT3fA)S|^a1l#F0Ae_WdT zF{&k3;xHn<Atu+*% zpV8GR*HzTH`~%n8NO5#Vc~$LZ>%i3ar76??Dbs!_(~^{Fab|B?ke1loHv8|KG#|6b z>^I(hyX$#ALDR6Bt%#OQLtCh=vG!?`Qgv~bd0;%Vbx)en+F?3XWp#OtH7$*Zz0!!7 zn)EQmuj{0i4r>p}an1VbT5BSeddA7`__Wx@DSvcoJ(fzQ<(T^ap;PP8)RXz3|Np`R z?BtYZO4W3eR)eqEQ&zsgPFdfiVYsHYvWge$i?JJtTD!L4D6Ua006wkUq)FVYCd!mB zzwuftyP6l3ytDBLH6}6^M8z*O1tpbd7~iJ`Pw{Ds@!XWrP`hq5$r&H21X5a;#2J1! zrFp5YMm(KqO-_ma*Sj*mUbvG!nueK0m?LVjBw%IO(Ap<{_InAYky29QXZ2L0RJ3+} zHJt~mImhZn9h(N%%7RE)dgwoP^x^YXozGMUT8P3LO8pZCu{~*cHfc~tX!vA&?zfziITM3&EAxtw{cgx<<4}=9hCX> zrOBw)4g*>{gj+d?uUk93NgLwKL07SfW;!W;$xJ6VJD`*8q4tvXw*&r_>x zu|Ab)y_0EGb1YqQSi`xf$wAznW>&Wj)zP&$<`wG1GO0wucwR-(qIJdC-qr*rZX?1o zR<=T|MM$}VHJDn1G6j+*<4I-0Es5El`l?#Yi~CxP=ckOuPc6p#s4G>few4g?5{hv% zL%+GWk~$HcS{GO1V2V0nMKoF%EfhZynUxjXY1I*@Q0Ezy73qEOJ<4-sMe3wMd}Qez z;9z#}(PlJ$^idsIR#a}Z#!&gE^i>#7QLn>N(G1Z3{|e)Z|B?Lv{~2%o|D4}GT_zzk zKQtwj8|oYC6f%O}1wRPB7<@Q*Yw$AM^B)!5608WW4laQ1fsw&}xaT*$@4XMbm;P_z z*Z<3X=RY3)DS>}V;4e#n#>fnf7*fx6(z2Zb*-q`UoUA{xoqo@D`Yqe(*KDU>vYmd; zc2a|WMuw~(vwi)L?eu-NlbS6uExeU|OCJ=^Ki zY^P7Moj%TX`Y7A!!)&JyvYp<~c6u+{>D_Fnce0({&USh$+et0QGHd9KY+tWuJH3|e z^lG-#E7?vjXFI)=?et={(+k;7&u2S5m+kayw$n4&PETh$J(cbBpKPZmvz?yEc6vP9 z>9K4lW|va;bx<(%5C6Y9r}f`NF#qBIPZI_){^9>mFOC0y{Qv3A%y^BDF8o$!yqalM zJIa(uj`4ElSH(!$@>MaCwpd@t^sIKHEnlC@{Q7LB^_fhofBKRnQtf10qWVv!XT=%V z^7V<#ua9S1AIr36j!4EMnO`5ywE7n-Nva;q{Q5wqRk852P<3DC*LyRq{_#>W=6f=~ z-koXn51*2r@67yqNA|G$NVe0%*-j5-J3W}~^gy=L{n<|UWjo!Q?ey<#r+c!U?#_0) zE8FSLY^OF#;`VG`>aZeniEwMSuUoR6Zq9bPDckABY^NJY|9{tZW$kcB-!Zt=d(Io= zp5^qn50_ub0_%CvU~V_(8IKyv^-0>rni)8v-Oup+fB0AL)GxyuK^orS89cbHH^{Ux zTIx}&%xkMmTk1W7Oy?auZI$hbABqw6OMPkv4xAe7GZinhWR$(uP1`M*QpN#Uh9&6( zFT@aoyw4B615&d5C`z{0@9z`RuivC#pGmC=34E`0NhZTFC^q~wWAdv{g!=raB&2+B zQS4H`pHD$vp8sY}Mo|Q|2fj_F!O3Ra`n2Jc^zBoW;r&l3%ks$-cC26GQ#gEhThHhP zJ`8-4Oq0pM@wk6c*4m!*m#ngs$3G>kB|h?|sM^-OezE_oWAEPM@vI{~u##DDZw1~@ zCdXvptTbgve(?#xCyM&N`OFF@h11Oco!4sG&VVYLiuy%~xGW~06*@NhCXF8T1E zwB^7&DB?5nw*BZ*D<9lM+SM=gQ|#TltTM%uV zfNW1p!_M^!d>V!hZR^3jz`22|k}0*ipK4`I`oaT78P`~YY9NABL9bZ0Jcjnyewn(i z_48BIwb{-86*xN?S1V4pR@S7ioL26Gs=yW3Hf=lbsVLhvyMCVEk%kXnye-;iaaKn< zJaBR{QFRHEcC**o-s*kD)}Q~|eGE5j5P{06p-aY`L1lDtHu!(1yZw!faYZ}zbNz~L zd!h~01-2$jGxOFW)0Xs;lj*#JaWdOelA1X_HU0ayId+!@Qk_5jsy^MEq9on%Pg+}B z-k6$D{cN8aJjEN#eu+0w5GYQjmcd4xVM+SH^Mq*}r+-3FoBo)hUFv70C|VxuvplQq zF9<}E>18muW>}Iwaxz>MMZ++Nkodz6I%Yc0Y-|6D!fkc+`}*B;;J}54@0r2oS3k+<29WpPo%`qpJg1z*KPKdq;}N*wlXLvVU`{~^c&bq@+;{OI zzqB}K14%0649zKoTJD0{oCpbF{qOYTzb*-G8lrw5ziIUA*Vc2{ff0eR$+!wz7~Ip0 z$**XrDgO6AZKhein36&Dd#5NV4)!U|YNP`Lsnv4Y6=j;S)##P>#cu%xNe=3acKSaG z#(myG6k;G&U@ERkFWB5eTt2MY>uH3;q{3pJdrmpqVeVT?3pB?NoJBy}| z+kKWyn}rWrL>gM#lm6)aMeta*c--;(yKQ<@lx;YhOoFN!LS;PD@&vKiF<$_Q_l0oy=kK2q_@@N^DS>}V;GYusrv&~ffqzQi|BVvZwnzOM zf05n4|DM|p?Xzd=^}qI=_D6DEsn}biwY4~5u1Pm1zvrYo{?`xQ{DgDLD+?oKIfDx7 za8_ELL+{S-PA|OwZ?CCa=Z&{dTK#H&`-Jifwo!aHYIh}zCtYqY-JJZMlkT{KQ@7S$ z6crolSNTNXVj`G*FQHwbU7t*ZBY?PC%8>lxCy!5mnzsMlPx!z;Pxun;vSjphh>lwo zJeip^B)_Obc=c%q38zBPcP{sx>sR_I=jOJxZPhN+E>6bJr-SJlow8k$esi)v?SQDZ zJu2$9jjKPv?^Q#G&e*m(d+Vy5r(KXtk|RQ~vbL#K)}$|=u#`8V>c4q@1|MN_s z8IZHFlpcuwUp@+JmCcr#T~@!MBVQX299Z8W*r&cj){s=F9hNMX4D~)4mZXoI4A(*Q zc;>L2(!yamn}+3V#+hJMG_nra9hOsGR~vhUgML1=Mk@6d$M z@K6r)^vU4wkm-Lb_-yc@;O)U{f)_%fKdw0S3-C(d-oc5%A$TV+9Mthr;Je-n-ecbF z-qqeY-ciu4U*Y9LAK$*-L~k&(@r69i{my;YecpZ8z16)OuLhpr#@vl=se7Qi5c>7U zx7Ux3eRLJ4iJ2g(Rv%;C;o3%@X2A@i8F5v(1U-aI=@$ z0WS}JZG31vZ#-<=0lfw18z&nv<6vW*vC>#zOf$w9gNzc7LzX!Ejw9B;9wPtObR;!ibRl=Ft1Z^0a z1OIukfU#2`!1p>*b7SpbwUw-3jkFsNHM#`sLcHoK!;M>w-hlvAh~O!ANVP~U)VRgy z6$lho7C?HcqE@z-jfWT=0)dK3X}OIDQ#_>=r1cB&97OR{V;+!B<7T59%%zZkm0sf} zqX!aTO+C_W+(@BnB1MtvQrI@YXP}n!5z3I$SV!Rsqxp5k_*6?Ct7{9YYpW1_jnOF( zfF>WglWeSp+0Gp|0?zBnxw5E8YQe@TBox3{SElT4VQ~08>3Wk8xbPZScqb_OQ3P3HXrAy z!fh;|^a}8%ENpgTK2erCVuS!C5tRoT!G!KLuA%sma(NZ(ZsThDm^(gi#7LrJ6(vwx zDQu_lKuQ=og`xsftfWHCr#Gz;J`qbrmMg-I^Qbx2L?OL}W>rXeoJ)But$^B-#yRvc zr8tHXm`w@LVXe^Y##xlWNGil&`DY+Jb`mRRif3E zRWSEe*^F$Y6756o5xl7m?>Q>Vg`%(9*qai;phC6oH0}aV0a8sW!fsa=<6EPd3`Bc!| zXy{ey9WagxLpFA$3_wd8vfYJ}Rbt0N3paMAu8_KSql|P?nL>}ZLya9N9*AUCSL0%o zxjtz$x169{Xz0{%eljOD2a4=D| zp_0VJy@rD*ztK$v(W+WxzhN_3NnIk1)S-q=)Dlyonh3j*!qSk8B52q^#Sy7P5nBy) zC;~fgBwTBWI>;PjFm9+(l>n`VD7^-n@2D)%6C2j6W?3Y{vZ0EMYcZoZ4K&rE;X{#! zkPQ`7UZX~g5^h5|WfHBimc^Tn$;-3exC??%WWeVq;AiRElfJiXl|hm)o$K=%V2t-OFoOMO_C2Qe-pDehmjw z`ZV0vP&zA#vZ_i9QBK1FL_kR`h|z-$E2w6xpg(LQjiye+as;!XuLGH|8`Lz1H_b71 zH7uq0BJ`FxmDT4ReXQ+RaroSvSm~?31Mu_1!QVrAM<3 zY0KpHIE(TLWn~d6fPE>6XvGHMIt}~K2NHo71KftaDZP>?mPHsV8fMa1!6jT;v{{&L z!wmXf07ZLfYfi&-3W~K!A;me3;;e{n#EPI{FUn3)9lBw#VJh`2Upk(mm_kvg5nN~; z8urAD7J#Z#=u_aHgLw;)Q%=m#IrOr&OAq$+X(l?Ga3 zMHKlTuPDcC6;YF%;Wmt;^5Hval<`=Kvj9UH;vb_5qqcNau4*@^d2S=Zq2-L^1hF(jd&{NvR#RE9E?SHEqhSQmg_=NacBe1CIz}|9-6)h& zC4ovCPG!LY=P1r$RGhT95RPmZs$!@Rrfe7j0x>>do^2ScXhqLOfe)fWCRujGN>iH+ zwLTa$y@mmliHf@Ne9S?n*U+D=OqvK;4Z9*@d(0?A){i2?7)BXWGaDuJ)vX8x=!EC8bAGTA*eF`bD^*3$^bS zc1RRuXG*aKm4V5}!Axn}%;_V$8(nN0iPzfQjBYSd3z3M+rZtZyyU=GE+uCq%jBEnw8wNxOUlfuI2NAw|ErB&3a9ZY;S zb|n~iG}|Cji%awK4-z^>v$4k3$VqKI+<=Nl1+1a_|KByyF8o#agYYZZ{ofqEB79c( zxNv>AHe3*15}u*<{XL<*|99;AUkN=Kx+io~=)%y+p{CHL(7Mopp?RUbLV2P7p{^k( z_-pX9;2Xhbf_GuZe}3?U;I?2bbnq_=&V_7#Ua)sCr1twHoByzPhj*2Co_C@b^J=}Q zx73^M?cwd_?c#OBe*YWyJ@;w%UiT*VGWT@%821Qwvs>&Q;LdfYx_RzE?Ds=%JLfa! zE$12R_iuNuan5&6a1M9soT#(Jndyvo206W)Aa?s-*>Bq~+KHbcv-B0qqA$Wbi+TD$ zy}NE}KWm?B?`V(Xt;K6`z<9FOq;1hEv^CmdZH6{p8>;oux}fsgc}<5>N8{O4+IG`c z)w^i>Yc*}5AtHB-bej&LUd2O+w3`m59$$-v2ENde#$W77r%7$%)$S6XHqoe71E$!h z)V-#SH2(SgFNk9UrGrh0G@Yh88ct{fCk?wvt!RphYNh5i)evo!N^PptoTh3TAZXWE zgV@(o?26}BcJ0(uWempRuL6A_wWdWPm6QnFn{NRx2s&rnM9hbFUP^rcxTgqGeHavSE8oCFGSCu+s3Fipi?jfor4@ zYAT`yU5XJOF-Pe;?}LbpLP{6wpB$U94bbox?TpGW>baHP>%VCBAZ2#@g#^e z_f=_bjFi?&H{7%jO(s-o#Y(*$65E>+tE-4?h?JH^^3jfiO*3hRqy0M;gE)U`nn873 zS>bPLkSAIU(K@|S%BE?Qi_#*wuidm4l@}&i={Zemn_pGB3BAl~qHTU4Up+cOHMJ*M zksx-jG8Al@Ov(A$h6<6~B&u23vlE?CZ{M_sS|6uYc+v_rO(c?d|3$fWn`lWC*jQRv zTS7HAo(QDL8w8Fc0!NRagvV0Ce33?dZ48y-Ml`4>yp1Mr<(qKK)ijC<5b7*TRaeQQ zqDTEzS65aep^@~lC=wZy8$n6rQkKE|FFSipBPe#({)|T{ns%oME7wtT*^R!8%!`a3 z9l_yY({Re5n#?dQQ-Z^Y_;T#9&;jkHp%mxH(POAChfr!*c#IlHG}4mDF2bpvY#Kzy z+!47j4y1&tHcLk~4Io!6vq72K;?pS~n#-<~QN#LKX(vi7AH7YTl{!sWzo^x48Fj^OWGRf)lu!wEB_c~JsxXMarndP} zQWGeR_D!ArlOj?(7^%QW=rmz9L!GV^{n%^jNQt60i%V)L(GHYo^85gP+fzEUub1sZ zO<}4UY?qV{G3umP-{4GUlhkEXkc@RzQg@m>3R8^kAv?NFw8OV6(O%G8>?Q}FkTl92 z`fE`Pf!vYfq-Hm%?L8VbHBXED6jsvVZj+#vjIpBtI}wz)(_~WIbOk6oyG;hgT{I$p zWZp=8(&8vZ&dW#hE0A`KXTRzK zX}Ym3h(l9jO1sl!>=3H8yfHXGj;ZMnlSP#b#SS70!Qs#QD=A}}RV%Am2Y;I=hv>V~ zaAUNUM?>07-N}uq6KtiMN{aTeI;ta_GV`>8e0s53sutdHNi7_!K`J;y^woo+kYj2p zEWn(FK{ckPLRzjCV%Cn)7T?axmBCmg)uw;eNd78_2qoKuh7wcze6;Q2C}y^pI?k@F zz@&(A#g?&kRH22KEkiLn%f{ggyix-~;-ys7#6U|qqbbnNAC2)S7v)i`%A-0`T+HKT ztcYmHucL!7kmtr|3Z(8B{bE^nA-3c<`=`bkcxR@jqGH{)RFdR9Eqa-Y0e9o=nB46w*^()s`P44%OBk>Iq8ylvd`qy`OfD7@RnWf-{- zb_j)4952%95F3oj#yLw$pBxcH6JMaF5W}z+8%U*4goO*r*zscOFo55Zp@!U_;!+1! zMB%PPA>D$Z!e|Qg&-ZD}P%~gHsp^xq7wbcjqF-Rfm!0icj!LhtoYL#frA`X_Xmr_y z5>ThjSmDQL2Bc*S)<2Dh1%EcH;w;@C>9d_eXgqaA1!UDD>T4>?qZ=^;V)Bi-ln9+d&}fHUKQ$C}Nr*L9j8439%v4iA*S*#Tw6x(ZP2hf>OuO zphN#(V1>A|UHI4V4|oCaGjIXC8-64Fa`-uD|9>?6K=_{U?ctlk*Wy&*V!ZTsX82#> z6T;2mrtlHrE#MBQ43~r>;T7S<;W;=dm>eD(9uXcK?i=nA?i>z=Md**vkD;$ZpMYE7 zHSh~O8F~n(2e*c<3tb+%0DJ={gSmJqV9(&VU@kZf`UQIiyWsS}3bylp^1k*y_1^Pd2iL)Wa1QZr?>6sx?+Wii z?=0^W?^wJDxXn8lXAx`;q&$ z`-=Ol`?&jndzX8&dyRXkdmhd#PIQlU8{9+PP40Skty|!(boX=T;cdVv?s#{kJJj9P z?d5iL!>$D1!q4Db*zUaVyn$B)o^l>>?!}454bGL$Mb6oHCGa>Wj+2c;aJEqaZiY3^ za%Yh<+nMf6a>n4zfI&_lXJ@CA<2k1NyZr;+4*b}D$9~m*&VIsv(7xNg#l99NALrX= z;N8GxT&EmnZ?>!Lb#|eBpuIod3E0P;YEQ89>|u6)dl$Q#-QKosP5vUkm7mEEaByU8mr8TTC1$3)&gr^ zYcFe}HOd-p4X}D!-K`FmW9i~oyrl5C_)xrs)0JnyPjSDvQ`{u37MF-~#cARMag;bx zY!w?tl_(YY;sCKk%oQ`mo?@KH#i>g_(NlE6$%_SEi=WJ|%}>qu%-78q%>S4VoBsya z#r5VD=7r{2<|*c}W|O%MZ!Xm0M5f4GZ7wqxnzPJl<{mhi+07hi=9oK~9ZeVf7{3|c z8($b78E+e}7|$Ay8xI(F88?GB<5J^1<8n=z&zNWIZA>x7 z8zYUO#;!&$qpJ}%q!GY5&NupY{eArn{YCvL{SmzOaJzm3_%|*}vYZM%ph@EahWi=r zW4MF!xQpRVhC3K;XTXDV6yR2dTNrL;xQXFLh8q~JXSj~xT83*Fu4cH3 z;Yx-p7%peHjNwv-OBgO@xQO9Gh6@qYVJ5>2hUpB` z81`bA$}ojtPlm}1lNk13n8+}JVLZb)hOrD|7)CRUV#s3{$&kx1f?;=t-57>53}YC| zFoa<+!ytx%3e8#Yy;Zp*kf5PxF!$%AsGJL@BKErzq?=rl@ z@HWF+3~w^L!SFi6YYeY4yu$D@!%GY=GQ7a>Ji~Jg&oVs2@HE3y4F6$xlHm!4#~B`D zc$DE0hKCs*VtA0@0fze-?qj%@;ol7RFx<^>7sH(lcQD+}a2vy|47V`c%y1LKjSM$1 zT+eVF!?g_8FkH=W6~mPbS1?@8a2dm;43{um%y1FIg$x%koX>C`!?_ISFr3YB7Q>kg zXE2=3a2ms@4F6&{h2dm|lNe59IDz4KhT|BHWjKbRnc--LqZkqlafT*_7(*jN1H+LF zM=%`Du#KUf;V_0n8MZQPVK{{0V1|PjHZyEu*vPPfp^l-Jp@yNFVLd|?LnT86Lpehk z!#akw45bVu48;sZ3{i$ch609sh6uwNhSdzK7!G7u$#4L}3Wntj%NUk2?9Z?t!xDzY z42u{RGAv-2&oGZ+F2fv#*$lH7_GQ?IVQ+?+3^N#}GfZRHi(x9m6ox$+CNoT8*n?pr z!vu!$4C5HaGK^su%`l1~k6|Q3F2e|h-5GXc7|t+^VJO28hQSPj7zQ#7VCc`VD?>kq zz6^aBau|9u?84BCp(jHRhMgI9V(8A$jiD<;7lzJ;ZU=UvpYHV2jefe)PZ#=8UptYh zBmH!spZ4?R0^wYo4@6?aeqxyK=(O!U_!S&ii%?UgnI4!U)Fg9R=y#L|fh+~3wyMY6> zUO~<0klG!GUeNQKA+4d|WT>pNdS+#{R@!CgF`f$2>Cc0J`=UTA(Q}V+mG9nv?z=ek zmbF%_4?D(DVY>Wzm}o7Y$Hg$C!T|YGr1q zm4k*IW2jI&{aIQonSViB*){hVU3u^KXWp0N9CD8ThM2Y-)ua7&63cKKgLlrfWu=3U zLBm90x7l8j#kC9!kJ_?PgO6$Vcl<^+Y0Cx;Za(yH_@!33tn2R0Tb187TVaZZmNvLd z&u!kKLi}mLEKM(%rTUQOLsXbH+ifzHC92gf={&6YVCDHwD{6sXiVM~ZX+G$$<6fZR zUa-%w=FNX2Zn`L4QmHMNIHY;g-;TTgu;z__BW`{aPFv7@_vQ`C`=6Hlf|inBU=C}p z`|AYe`vo%}1ylRi#Lrg+Gk?yo=9<3|w_h;xQ83kiJMO{5n%Do0xc!2ekAkUE-v6{< z=C>5gd~-;1h@-4?(8UrRb(wEiatcTnc{!wXB}ZoJNbm+zL%k+AzNCnMOQ8+Awps<`NYu zt9xdK8p@%xq2`$8Vih2(_%Z_wVP4uLplu#5_O&71@|uhO4t+z?=^J8>ZjP!@S#wHe zasxTJ8GKi+4eT_mxlo168ly794IsWMZGbtvxj=dE*1C{ec~{R?!~f{!{J%q1pG>m) zbQ;|p`8(lyXNK$Daai-3zmuJw#P6&1?73U>YUTYeYPE+yKlbQ4ta;VniGODm|IWLP zX+99%`)R}5F0Lgco1k^}%Pyr&7tdhlHm_6xchE>VV8`?(&=CXW0V>Q6GQ(jy_zkoJ zys!9c?;(CnTMKo}YhJFr@1TKk>`rEVI30#GFH@m*(7ZU5O&kiE-DODg(!cgBRnf{` zLz?&hYtNSQZ1ot@yx(7Y7Rs|2HKcjTUwbx{XLIb3=EZ;Q*-)O1PI=9Xl;=M!Lz312 zA9S*d20G+5FZ|0;f!{Mi1%B_id-DPnDr-LB)}~56@EZoNiByUbMI1Ce{HkUJPg4xq;;FWZbue9H#d7AQ=wJ!*~2(8tD z7svN$-b;DND%8LWe!;)cwNLZZ9r$_9FX-p=U7DxtAfaa|p=a~@Ht(rCWHpw+(>_B_ z;Azv*$^xd=Uk`sD-X4A@{8IRd@V$@$APoQ~Ljyp4cw@Lyn-DGxFAdKMPYI9K7KR6g zdxksUZvWTN*P-`AuZEruJ)~8K?hIWYx+HWOZuF19eSTG_P;UyY2+hG={2=4+#829H?soSL_Zjy= zNDf?}>$rtK%&l>w`hogM#w>RQZs7NV{6Ih4yxY!?&PUGckRP}gckP!rr#sEgVNRKI zfHMoy0|T9%90&L5U)vwpFWZmXci|TOeEUTENTZ$p9B$CpLWW?8c8Wa%QUpVBZ{ER} zWb5)f`H6g8J6}G9`|_LRMYt(X$irlv_NqQbmgu+Po_v;m5cCJ^CU?^MOUL@j`VhC` z_gObs7b^V$8?6#+xit&g19sQ$vie$GEKB?(J{7NtM~yz>PW?S`jnW}-lsFXk-1*v8 zvA>ulCX3z0uA;l}%-{8q=I7=c=F{eVdV9zgT&SoYix0d ziVnO#wm3+A0S_{GkML!)3dY>kw%DlR&j*Wbp)J;T0Gl4-0Q)VNy*5N`QK@oK$g<4{ zT)-44jv-sDVdB8rgHNluAo9U;XNzNPu}XQ(kCv2HAnN^n@|2LYE#@gJ3YEk_Z81aT zcy!*V@wS-86h+G_H`-!P^#T0Nxwe?7%q0D3i@apYH_G^nARC-4(rL;l+%`sGgVBqv6FKxV-OchTxb2UdyyrQ-^ z%g^lQO3LiXB;Z8cqQuASbOIxmmcj04OyPni4?b_{$1lB zKMbk%mgamvLfV{fmgc;U;JHH^LD&lB2sBqGos!a6()_MH1hf9Wp#iX=oV&5P4)LciKiU$q=*zLstk`VGF{0_?kl-c!{HE5gvf^V=>@LN#rrjg)ao5mfs7Q#RWu#qGy$8vaI1hBi`mWkupsBUT4 zLf@%XLlt^Hr=^ymh<>Xd5v@w4xlfu+=;PSN!al~Q9530VxmVHx{(f^K(*;&kvp@GT zUq_NODmgW_OY`M)tI+RDS+PTwCN#C6iK6K%4rikv-754)Qc)}E663+-XVRM?&4<&i zLVtlX-Xi;9+|kNK=(96ih)sB!vX?d(0R5A$~E@L?BHb-Vg zn(?sj!PQKAx#C^|E_i=jQ%r|(IjA{`2 z5uB4UDiqUVixNFC_TyqiANZC-Lj2CSmeXg(Z-dKyeE#V1`D3KHQdOvuPB3;?fya%L z<`XJ}FI#6^ru--oe|;C_2YLhaUD-53nqMg2zKEvrALR}aJ+r3@r$kze1?)OP8n^f+ zp+n&ddJ1VB(JOo-?)tA(vH2od#-Zv130@h8sDOEhcs!d%OY?a)(Qo4_Sd$EI9q zRH>q2JwrM#U-Lk3cjbXr9=oX6NuJQS+&3c9tJpYdq%_Y{#Q5TghW`Oti}Xi14#f6} zN`!@;jh|X9LVr`mLrTZ=uc5WZ4q(%yfaH*gPp5&9_fHgp9%8+ttSK7f%tM~50h zheC6}`p{Zv3|tx75BdZ44owM-4~+~B4ec801w8`ckPHQaKL@|TS;70zC-7qMso*2Q zd!a}0hTxUKi-KoEm*8>GCU|)8kYHV~B3K+;6I>o#6r3HL9-I^$6Wl#G2qy?T;|#$I zn%?i;58jvF$M$2;_;;s$lYO;)3AFy5W}jdmWgls8wKv*TcB!3jA7C%B=h`#vJ+Y_H zwTIaK?4EWPJ7nWpT>d1#mY>S^VUXa#&&{#)J#T>)3f3*}kz6nU&{f_}h*WvwiS zj=61Y&#lGCu$AC0~KK$!#8a~-7%9Rj~u--9pWBkOJJ6=)88+Y(K;Gh1P_HC!S&W!tH4@m?Ptxi_O_;2hpk@rDU;f=;s&|h$lajJ1V z&KHg_wip|XN~6Sx7%Pm$#vEgYG1(XkeFlS#zR+LT*$5g!|3m*#|4RQve^-A^e_nr5 ze@MSazg53Zzg)jSKhyizd&hef?^HhFJ?P!--Qr#AUFMzdo#CD2HG7TTVcur1+FR!p zdIv&-l%J%kzeL{h?W+o7dj6pE?~-^3PogInpAxDlKhEq3R)Gu+A0G&#Z@?DlngxSgSIQaFF$4CyQ96X#v$ zHRpNfNobN?43g$$43{!o!f-LeMGO}*T)=QX!+8wnGMvM3 zHp5vAXEL0@a5}?j45u>ui{TW8lNnB8IFaE5hT|EIV>p&Uu?%7{%(kN$j$%kK#2K0x zVhoK84Gc#z9Kmon!#0L`hQk;RW!TEFh2ao}gBcED*vznrVI#u^hB}5?25dj69&n~W zu%4lcL9q-<6SFscD`&u@Oty6lYZ*!zuq2{y*eVeeF<_lbwnByihI|I>l<3h8_$% zGwj6BouL~;SB5SOof$eYbY$qj(4Ha85Ml^2cnmIs!(cN=28%&3m<$Gk&Y&>_7}_Z? z{$Ti>;Wvg~8Gd2-nc*jf9~pjN_@3cAhHn|ZVfdQiD~2x_zF_#A;WLKq44*Q5!tgP} zM+_e_e8BKN!+Q+xGQ7j^Hp5#CZ!)~W@H)e546ic0!tgS~OAIeEyuk20!*dMJGCafZ zG{aL2|6zEN;R%Mv86IPJl;IJEhZ!Df*G}(dLmUpR+!hIjI71UdjG>XCf#FDoBNz^6 z*v3%La2Ug(3|kqtFdV{gFvCF%n;AASY-HHLP{&ZqP{UBou%4lcp^~A3p`4+NVI9L- zhEj$ShGK>yhA2ZJLjglRLxf=s!)k_A3CN!a6iL+4EHkpo8caYyBY3cxRc=yhT9o#W4M*!7KWP{ZeqBR z;Rc558Lnfvmf;$Ps~N6hxRT)thRYc)W4M&z5{8QzE@HTl;R1&98O~!km*E_Svl-4} zIFsQFhSM2NV>p%JUks-(oXl_%!-)(hFdWZt9K*2;$1pTA9L;bPLxLgB(8Lg9Xk=($ zIFjKAhQk@QG1N00#&9UZR)#GMhcFz>a1g_0hD{6`88$G~G1M~DFjO$ zXDDM>$FP>6l%a&7n4yRv%23Eqz>v=nVOYbknqd{gfeb4d4q#Zpu$*BT!%~L*N&kO9 zYu_&XEhPV6hQ$AE;mg9OL&E>?a7{Q0x&FPe#~&H)AMO@5LqFrb|E17_xaq$TH~r1H z>E9fx2(88*es*Y5XauD7+lNf-+dmJ!3mN_UaJzqg@Wfyv?)J-r2jXsj2JZF;2X_f} z2ntByf3EcYlODjUl^(!tkhw4NmV0v`YoF`&^}2WxGWK6W^Z&E%{q8N0IylQc&aHQA zu`4?OJF=9%(@=X2*x=UME(ZiCePInL3}R;LpCt@+LrCl7b|J)N++%YWB? zUTFfn26y=UTow;e2tTXoLp9 zbz&)`(I<#u(Erx~`v1N)Kfr$b3GB76G0!tkG>`N(04~JNdJLq@dzh~AE2PWcG@daY zHg18W#5veOA8yn@l6*Pj$oGQA|AEHNhQwa^Q~h=QY5jivCjBD)RQ)LZP<_3guP@eT z>J#Oj3B>r{Cq$PAE-Dg;k{CE3pyBVx%q@dPx#W=P~r&RLc$t(vp;Z zs|qfPL@kcU>_`#PR+<9wJUW!6L;q7kX+Nf$${u!NJ(5;x^`uNF^~aG7IFCtGQdk@- zx(THgNj(-UEtx2XJM?ZqBTu4?NCB%8ZgUdrNF9fI76f`@5^KrR$PrN5kzi#=q-{s{ z5+zgwP(!Gcad`=)50GDFhE9}((tgaUK@c!XMFIu0uyO(^aD>b+tabP}WpNqwbUlP07+HET56Hc8Te$A z!p2~NlprZx%GA<~P+}VCVM(3ccb190s7#g3JJiz@G8aOl6k5!lLg zhEo$plPG}}!o)DjBeBy`z1Rt*?hneOrQ;@)`lC8DQ|Rb)6N9N}==ugK%G|^tBClv< zUeTyL5KF3$Fm@@93NN8FAMxAA&?%Kry8qODo0r%X9?=sN7X-$$eq==psjY*?DVZQ$ z$o5Fw0$7PY)Wk+m+&L<4T!~?XYM z0_sKu34O%mu`7{ZqMk93M#n@K8o@KK@7gCilNz)Zh8zmkNwq-S=a%6v*-3PyZc;}H zAh)arDH_4(Cfr1ODs%M+43t+T=%y<5Mu0>m)Ab&1y!kR56&s|AttAbTrkC)DIJ72c zSf&b7dI8HptICDa3s{V|29TspiKxqVY8=pkOa((Xc5cF=PfB~c+}TbD$~wfMq}DTG z8WX8&w6r;@MW}vLUB^x+eMop6g$U7!kOICr2O;V)06gh}$7;|$)T=j<3a~Oko0FYr zN8?*bb#0M!<4RE=>5Qy~R=D_9Dl{-hAr%lE-$InBcb%jWjvqoA-$s3j zS8u>w2RiL|ts;{u$&J%QXe+f*=qB-M%B=rtR0w_vXyJ-iQT37jT&09dbK;d$ z)X<;{ZDumA-UGm+35Z=idZVt@op>41170(<6fdsyMFil4vx< z)ndnKl2q@Zpcq$DG5U9;c3kPmEdYN~M;Tv1y%yaAg|u9avS^xKd>OR|OcEHyiNK{) zPSH(7p&j3!2*iT{lnqi7s0b{S!T1ss5h>BDt%Nu#LaC>3=xsp^z;QJ-l9FYbYh+w0 z3dC)oX2;dMsIJGoxKb2|Wg4-oX~DRf8i_%T_|?!%NLe6sg@IcJY0n`G2@%N-GCrGV zFIJw^lK@eQ!FJ-L5|{LolV;ucK2(I<$|>tKE21?*J78RC2drW>yc9QS2c#EopjOX` ztM>p<(^z@9@oD%HK-uBCb&wn1OW72I6*|gP8Y?kr6_$d1EDD9I@hMd9=zw&m?!?uj zH_&c~anOlRCh|!PnMwH6`Nm z7%`0_FJ%!_4!n#dFKBPb`xtU3&F#3oiz}VCP%w!sD4n;J6{=?3xY7Yw6eUH3ri}9| zH-&Pr6VIhGP`cMqKuQTRV2DA zMgq->_eLysUY@k#yO0TW?ZtZ$?O41NqQM|dHSyu19mXD%CX`Qiwc+2@&#a2C7c*_#PL}$iWq2{#es8W=w zd2x*fqa>e=9S^9IjpDsCJFaH5Dm*159rN-)P#f9K{6<^|ZS_ZrgYY`tD)UUdLDyg& ztj{#pf@gf5IR#wfL!kStBlyODG`2%_|7qi1Xgj;yI9u&Y>!9Q8Kx4i!UAq|i&2}^T z;4atEf7A8{SHb)Gx#1VVQE;1jS>Rak5o`bt0m&2W86FiL1YLpQa3J)x77e`@dNK4^ z=(f<6p|c=Iuq{-l3%oF}TJIBDte+H`9vU4Qf-{EBAxi{t%CJ57hPDsR86E&%z_se6 zp$YE`t_Lr`BAhggQzs4WgNFB`cDlD+d(V3dx5f{PL3n5ID%=?VORw;b_UiR}yp3MD z_N7;VlZV;fB&RNd!<_k`vvkCXVtDVJSlrvM0ITM`S zoE)d4W8v0!yY?LJe4m4+zFWl3;7d5gPT*9c$}Z3j*0p`C9McoF*B-Ss!XiJ(C% z-^cO|`HXx}+e6+iuhB+A%HR|k*Tu)oo$_<-YP7!A~?C2Wla|Je!;HR&Q^Q%g2CtFb$yX|REvqb#SQv!^CM`= zd&<1eywSXzjtCU*NI7`CwI9u>UjV(%*GqrJBlqgzCk$w@=0#&QF z$XCo$$>&FG5#fliezV024gur@>V*uv*`#!l20GgVx)ZU-sTRY5>Sd@UHZY_XTh2KdlzF~$F)mI}6*%!NTq zY+H<1=@f(O)E1*vX0RE?JW34vxqi4}S|HhCi1G?O7ATDYicb*JB)If22I6a9l@(g3 zQ6ctGTxP1kxm0_rM0r#-yQz}FBw-F@XQj;D7}sJE`h2biJc3|+k~9i^OtNx>zOPEq z-({H>aag61+F0-V!kOk^-JbxBrTmzRmxF#fdptRU8&7tV!4yt;kV!wL~$BRUYWL%lwhU(K`m_ zQ|ydm0rMV?oOhY#Ip}*sHE7E>u2$~;>fWqT1;#334apW2A3bAZiz`*Ss-Z$ZEo5sh zR|V#aX4v8al^zsR+v02$SS?*_!Az_CxP&cERWZ_|8@4z>c`L(G4ej$d^?^>rY|*Te z@{f>6Am(sCU!?pTkHdkhHAA$7qSB5Xo^->CA-hkho@ z1}KZr-%e#-8eI2EBeyY^%M?d&CNuxxG*0NZv2QvfG(T2V=&Au24^Y%?3{l09JXtk=O}7gDL*L3T2vB!tt zQ<{EqW3e9$XH^ez+(}*5+(r2@2IC4CtU`(<^;hLdg;`cX^(ofVodG6DQ{ zoW7Q`8Z9h^Fv;hBC@8zHz?j;R>jDLm%S7S97~}h-QRugGtPva@8ONr~LO;g$QYFp( zlSZL0<8*y}>2rMlq{hBfrGrt$9IdF~Ev{Lnyr>Pcx!yNJtFo~|#YxJhjjl-1$%fLcf+HMHj&u7Q^pb zDi7>I8txoW}!1nHI!~p)8-LD?W;_lJy?OZ(Lse!`#5t?mG|V4@Bi1{mxoDFU2k{St*Wl7 z-q@98n4V$A83ty6VH0pe7DYvn0e8iL85DsToCQRQiiwhFSC`;IqDGB7ifCM-xWuRd zHKMpg6O(8*x5Q}NqM|1L-g8d%O!rj7knj2Z@qN$7Jj$u+y8FF#@2z{@b6(?R&Yx&` z^ba`{&0RPM?6@`+=3iJ+(C>Y@m*D$b7X&YO4ApW5)}Gm#;B>PmhsGu@KHZWfg-q>o zXJYe)9lJ(%a8lZFZK@Q%2{~+HN_vLR=#95IbL`a(%fB+!y_{+Gv)?#Ady8#6x>>Au zvixRh0QY1ExrV+j@7`1!c;t!dK!+I}Y)<4v$q9{u4Npel+c*X^CO=n>GmX2#v6>}y0(^KOr&YDPQ)n=}G z_JrPeTuMUJh?e1(gn1IxVUmJysp#vumpTcX)mxGou_UUga?Ni|n`8xwR&|wRoVOl^`knJ%S-HxlQ?Ui z3FpUhLnnl$5+gdO1I4d?l2i6?P4zQBC^^~Jo4951Yyls2o9b51m-S_an45_b(+qLF zeHuqKR?_sTDD=tx!=>2GnCc)&V=)<8{7`Zu-zKJ7nSFqT^9^nZ;wIC@x`OD2^o?kTxRj>~OZ)OW=3@Zad@L2<-Aj zz%4gB4fb5;Sm$tjvsODpoc{LJPQnS>pTR2r5B5vi;o6#L8lK8;(QR#ux=MYjAEVxJ zzBIoD2i|LuIeN4GKx8VuEmM&j)TPerk;@_%*iWbzBA-P+jl3QC4SkPV3G3?UuYJb7 z1^RUBSRm&Q0-FCQAo*+UN$}j?CmxP{=)7%J0QvnY{PjO#rwB1%x5w7SE{=T%c<mG9cdLD&Is-QUGlADGjxJS)s8QCpsubQ4`zk~GLVI7^s{Pq~+I-mD zWL^iX{6*#}dp=nD>dBs7YXwSvq*iB^n!Sy0wfV-!z{bC(y<|LRJZ9X@e0^)9J&je` zkBu{oI^%HtG-Coh!w)g~84>*p{e3N?zpg*0Kce5Q->7c@>U}k1D}HZ%lH9IdPd=4= zDAKGQnB17WCi-mB#X;DpBMnZ{y+BYZu zl6WogjCQ9zJ+VcvjGmI%44cyHqBlh!k8HMHOI()tZlW#G7(FC0&$>OjIWfcT0}h3% zME~fyiKsOwQXl^o))eo=Uyt>HCB-AKqPQ;Z#?Ozp#uw@1t-r>?kxB4qaJ+pqco8Q6 z4KXBgIL;g%#3u*-c)a8A%QlO6T=|*=qlF(p?PQzs^+=QWuzozap%cLeZyz>q%hdwf zW^Yad&l{E@#U4B>V6ivGTc)hu{=peg0DefO<}oe4W2#sv7$clFo%b6H#Il;4(^#g# zuNrb(!RjJY=k#&PXo$rng)&v8)Pub$n(And({TcC%;on*NN)6L{AOi2Zglyg$1PJ} zt95MW?sIBtw#2+nuVr%r^%}vf3tPz#C zI0`Y<8Gc-5oI-2;+%KjuQ0WblCll4^vQ0)x@Ukz(q6Ojdj*2aA!J07He{z{T;uwOwgo@^8}x)NT1-R4X+u*GkmI_Hc({u`LTG{YN+fT=~(n) zKNxm5@B@pjEnWhQB^j{v3X;OjIKz)aw;)Lfyq}gK=P`)D3IIbkdA`clNc$~QPe&qh zUO;a$uyeQhdD6z_7%2)JgRID2n(9W0%i1AB{9Qm*1i*}(?9jETw)%kx>|i`5g%#z2 zA(M}&5=Rt?VKNu z1X@~%K+N#+?oG8`(iY}C9qMy@4luK*Wr*o3vyNJ(3W>qDut%$Ej)oheKUed)NLiSR z@vQ$44T3Mp67DxvmKychXz+z%V#S8WKqDQeA;+eG^%$>75wK^)Hhvz*B~`o)E_fPq zOq8d~$uM1;>N&0v0Xt-C^0b7bZ*}9Yj%!m5_rv*Y>*~auvRL|i+)i1FAdtUBztP(9SGWAfK|$ja(`sbhFLd zI3?Dw+vcq~dD`YJ+&s{H+2)P%fB{an`4fK7v>c9Se#}YH$hOUEc#JkR+vb(oM9EFf z719P+4s6rq>n5B70l?3}n{j3hzy&;?v^G+A@)__CI2g^MwkgMI*#TsmVgpJ_EkjOC z_Uyori1|!)J(rwkZtBNpFHKd&6~tHMGJG+ggGu0Qza6l;>o0R-2~nkfc}D|TI<#mw5TM4A zFY%^kOMT#Wr*O%z zY%|#nbxJ7U-Hq>j-7 zbN$75>nY%HehlE5Z4Toa3VWMvmUG+qZwDG5Duy!29i4$4++e>2_`m|nWTR3VQ*{2a zdL5bj6C?HX7o@Hd$}*;Bv$u>VvX`cM2p(yecU?};meWDkY{_qFyHH2krmX*T@{0xd zuiR~X3~YQX-NxV-Lyjr%0L=921bM>Dy806mg}=k*bsY$%`g!&z!k{vJ;83`i(4yTDZaY@d?})K5v|! zknZi^iPK}8wQ$~H9v|h0hMN(*K)=elGnKfbX>F=sj!6=)XC3D+%zOIa&Kpx*$qgbr zd$K2{Yg4@}>EU}9N_KsglqEYlE&cWUA51mD56>);`V2o+I<-EQUy|%(ZK^d=4I!?# z^qX>TO?81Zjy#P>qPU^`*1M8W2Qy+dj~#4vP31}=@@|>x0Ex%9rn(cjG8<^b7QFs( zsXJYp>JX_!b}BWMj8kF%M23g^$?zA4E(b=;Gpk=D^+R8q>UF;u*r@);j{pD~J}dgj z128Y*6AccqY^+aVzo@?J{PrbQ!A{|8r`7dlh<3lUa5U;?=+^uSbylmGuCLpOzz zFM``|adJ{J0+v1xOnf!*&!Aaf8$Uii3|{!Q#ysf9Q_&A$Cw&fl=sB=>zS&vf90FYZ z)Ao9x=qup;?kQ^>(DFlpk$*gL2|WMzhUfpg;Hj?G_}tiHoCkLMUiu&OJ7EJpUGE3B zvrX!3b*Sp8{YkqOtn>$Hy~6K?9}ce#9}^xP)1zO|VHIqama-Y3H^NZ6UAV5nn2YaP=yhF|Deo;iRc!5d`0r~UAA7;7`gyAHlS z!q1gvCLvsJE$9Un{uZBZ1rDkjDg1;Q znVEoC#Rc3=W5mr|HM_YryhRZAvkCsu65di-mD!)81pG+Sfc2yJ4kfqrtIUk&z=5K7 z27ZVx!w;#7%s37jaA4UP^Z_j9;Rli-tRa3x0w^i0n+3UQS6dEEcUvty|k`!R3^odgHs+M?Q-k9&Y$_#fia+%;{--cptv5-03M1s zcn^!X7L7A?aVzadd0h#w?K3`8gvdj+K+DScKu1fg#)~kkWic9uk=NnXMr~#gVwMLz z4Cl@JXCWR|1O6TfpM^*R5vd}`79e2YIys>WW6{ex+6*@is?7}8lSmCYks1b!$@J$) z0YU^ZY|7?zT3%^S!*seYM+z?#KZ8#6F#xWm`qQO)J^Zq zl}P>`Vs5X4Gd(z3V7ru`7rj|HdI;{F>Oe!0Jl-# z=YTP4hDe?&3e0DD{d;hitPYNh&KQU|L<=;FZ=run-cqwN8qhPGFG&haX=x~>Kpt{Yh zm{9xS;+pX;kw8^w1sWhX-QuoIP#mpxi3+MBxHrl#W-;@ogo~p!F0nyX1PKK4!w<$1 z3UyR?aPI?L;)ANt#&+G+xQ8*!CCaFxAjw=uoP@+#xFnnyKguP>sNLm|z&kVd2L9Gv_Y*V(t)CElo_;D(?hO2k)+VRVNhaR(pRH%6WaB|ozM2LJ!B zCZA3|lDsE*WAe)6#qjsnWWAU?4PF4IC-=9?lU2#V@bae;pIO%@-nH5juLG_BXkv5X zhQ#{B8u$WR>qfDZ^TcE z&x}uw*GArnm&g0VQ(q|daqKN?0Q~*GXgwTziaq{ci*tuHv8LE5*3Q^5(C|-;jff42 z?PGm6=2#)1^#2)oBKkJGxNWtLhlhZTK?SJ2B%=yOh zoPRoRIlluw|0(AI=Qj5EzXoR*i=C6LxO0><*%=-AExZK`c6vLO{crmp)-Qq0e}%C5 z_9knzeVy%DN7@(K?e;Qzp?!k21lsZ`k$=HkV6|Op_p>(hX~o`u{-0=pPPAa*=ZxSxWla=W zhQr~azI{i;OGe~oxzb*hjY%s)_W#s@sY+mnho%lZC^r*&ocD;+U(;`mLmAlNqT=HD z@sjzu8JxZ}n|_DWrvxfAqoHs$yNkjlTfN5aDA=@k$+X;p zo!Xeqp7Nw!L2JiF_DQPa7cSVY%2FVdG>o;z^79`uWM;f%W^VoyW@K~W{;#9&v4uI8 z*{7+T-zouU7@opBTDVPi5t7UDy>r(@dS^$$nt>NDDOocxw>X3C!Py+4&TP&8PrZ%Y zFbpbNQ>#~}Dk_H7(4yH^Suq@!Fe|OBJe!}NT>~q&WtBsR)+|~~ptj0GVdm9X-!!!P zfA7zkF=bi`A7C(;ZHG=0cDfT&FwUtKJBZ;a0{o?psGD_kDyx`G!P!7-jZ-&w-qG{t z%{i(r)%gcY(q;A49qP>#{D>eqs<<-ob6RRdic^^~ zXWGTQrm1IA3H7g0Y^=wlRk1Lu{L)+ZIf!ZiB0U=1M*`~+YP=DH{uN8rhZrc<) z6gW6of(I?ER%>r+Y+6Xn4Ww2S1Dch1D2}jkDup9)+ic+Us0g-sGAn$@&XT|awpk~d z6NH4558FJ7gOVp0+Z6a~8`SBOr9ey;bD(H@=s3tW50I4EUTc3*B`t4c*uQO#WKB>T zZRiM!Wt&4eFbzK29MX}GWqi)QIRUnjhWcn|Fk`>@fFx4%RXZ_N4QVV{Yb7!i0Nr9dLLCB5W4tVqlas}X@ zfXUk1;9E-!ZN#mGu|99GnM$mc*vQvNal7!z}%@j%!n0CqWo~lD#xl zDeK|e;d=*@2f%!!R_z=3%~aQL1;mKjNO9eK=Ss$Zq!Q34ioUbGX$e#>P;uWOao7!t zafko1b$XW2pO)v)+QW_e*OCg*J6rhYwpGgs!Zwq$qMK$k%~A4*=225saOLQov`j%) z(zU5dxOQ!Dz+>#lUYhDa35{jP(huvnHr3M3cZ{^_ma&ry$}gR7xNY>4LaSb%w%#^G>7TXDH-<|%e!mg3>k>*2*MEb zL@Oo`P?OM{@dzg;KUn%#Id`VYaEh%ffV$|%9h2*K!&oFw+tH^f{}PkKByNhk?2@c#wP#ImVB&LGjR3Px{5?QCOY3s91&%0f1tQTx%JB@ym{3XZ*>(ZbbWw zg)=RJa0_JICyz5yOBa|U1;p&WC>yS&4X@STvfyef(X~rruij; zy)*&u{*(r2PB;MpW|EN-vb7qBKA$}rP$4}cG$@G zi~cQoUvzDBRy2h#>U*7bd^z{Pm-0sN;sJMV{l$6|IDiIgc;u_d^O36~r$@#_4D+|< z4dya%)%7&~U~Gc7yCaMu{ayWG{UZ2*-%tHRJ*F;J;2PJy*0yOIw3D>T@E75&;dFRG zczie>`U8sS|5dm|c3l)aS?f6AF!`LzjMTWqb6phFsC0zXbC0EUqrxSw>)j;{PzjXe z;Xaiv(Oee=55lrZhrVX;cIfL!g-iU_yGb;(lM)T>jEr-M+*b_>R?BiYO`?yn(EG?T^u8MD60daut!N;^ z-x+ii`g`pJmzb=pgJ){ND9h@XG*WJJ7^WQhdwjS{?AGPM_C>MaEUJ!iNugJyjb9mC z>z={E16qju;5i4ip;scq-P89Z4?fF8@G6%Gt;>T=mY2s%IK&IR)MvQcxCd!JFXexJ z)EKvcg9i@F^U{7k?+`TfJZeBR*4?$z^HPK7Bja6Su`Um49P)D69_XI!U~3uh9`%zts8u$Viv?tGlc7eVui_FEZ987VGlhB$8L>d%H{^_ok{`BDC(V8u!xV zb}!x|BDC(V8k?mWn^6s7vhJ=LcOmUM-Y$ghLKLF0?kh6kl z8}-F)cBM;H)qR8S1uv4E9d9H9#7Jb~Pmg#=s8 z(A7B3YhJpdF?97lweDdYBcOpN$bDyw4Q%j!EFG7GHsIwX8tOu-vAjrE$soE4;iv6M z`1P_xtRFeXoyy?@YkYp8*5~!!`gpZVbkyAzYaJVogx2-0afzL}kj5^r8X35m0{SA9 znLWxSs_Kehf901e)A=@JMox5zy1GIe70~kKWpXJ_j{xtVH)qC_>=$(C(i0}SL~H$j z7J2^~m$0NI!P4gRY&jsAxulc)w>DXl{$R|IqPU^7#X_N#RXLAu-4Zs~&IYw1<)5`eTQ*xKxq5WDDk#9pFLohOSsSC;H=V7x0xN2 z&`iuh1obQqm+Ug>BRglKBa>Awfji5C4VU{3IGHE>$-U_N|EK2CQ1a8{ACoVE_3!@V z?a3b{FM;lVIcxq8Pfkn@gB^Mg_~`optbQ*iw!uT+CUE(s6Dt#^gTe1;==*CDsYC*t zeWdOGHS7i+ir)r~zI6QT_!;q&iV~ckK!1KIbN913c}mf~UQDcr2LV9O#UKCchW#6F#>8Xm7V4x9_!YwXd-~`yw#@ zEw)dD_Wn?Nv^^9oe*mLdpIYyN+i$D2#oBD$Xk7t5zZKR}aQV%#rd#`4!>qwpZ+QRz z3ZC@-4CcPAVC~x!xdEQ^)<({WG)3ma+F@E`e55kcKN5?Cz|Hq2Sot0Y1Hg^u2GfOC z#iiNvi@kDh3+!!yy)E$nUkgNC@{KG`&TXxSJCeN6W4&*HYHTswg=i6X1i99&Z?i3z zxB+a^YdbDe1JG{9*5dAP_MI!Zc3Vrh!^qk3GP3Go_l8loit->RNUN>&a)*-R-+Tja z$E}2^IypgZwGG>?zzsZk!{*v?_d{GF34y25m|ITXcLCLe)t;@#+%j^fn{}HQb%`aw z_7&`w%OnA03m$VzI2t1aY!!1;6fLWIx7}j$!b{#3HOC!HxiPlXmjfh?1hEU7tA z85`{hZS*wmpl3!%D(x&c>Quo5l+IHF3|L8H}_qUU-&CZvzMwvD$0NpfN zrX8E!We6Lgv}x~&;*-07yPa_%m3}5ApY5busQ3c3aMEYd&4PM(Y_NNzmy=`cTtoL{x|w`YH_*8{dI}xq zq>1PT-urf8gCSL`?GOkFZ48f%?p+MA78%I2uo%%E`dqh+TZTs!?iCi)A6C6pCQ-6DL15!MmQp^TJ=O0JCnzi_krjMlzgjfY7o5yt$ z`~P@4m-hyPGF^wH*o!!$ThL^4s651+L+y7A)kB;RN7J(@A>RqHot{M{V<*J%^wG#a z%iBY}Mb7L9!~z9)iY`fz>$v$o#UXNOUr zVZz18n@)+4-&(|*M(G3iwXktH-lOzXN>f}N+vzD3ZtUnW6Aa29aK2-Iysgpn0SE`*>;&mSE3spLkkF5!BqmZ4 z;wQmLPoNwA5JCdv+}|bzyKSY%)0{yL6cXui)aO~tbQ)%3DIB|6w$fv$($p7rdNlnE z)|4}le=X&Y@wKcT>ra}9Zit)+r(byG;^~oepY@NAHW@*s0H6%DveQg(LrxhGv6=#6 z0)p8RX4anR;Y5&==cU0;GtmusX~67JB`qS3o)hVzRPs)|l9R5ajA-?2Me|iqVB*19 zj6&Jz{iyiBoiw5Nw2U#w5oWO-=`wnseNP1J?!ie9L145mN~tH)r8HeEh7|<9t;vUU zG)?OnlYPL4bS%xwnO_UEXEBwE=MtU}qG?*w!maE(0>g+FHL%DuqMZhzgyF19aMde4 zkQU}V3?Whr1I* z{i@n&A_Bk^z|$SUZ*Yx#$#@JXBV^i(f-eI^634*kz@F3`%b|?K+L`uQ0N7VqEKN&Z z*mrrNMbinYD<9%meXVqy>RJnS87Iwa9&K2xL_8g(ekTGRc3WYkNrO*yv|@1af}F8B z(AdT;t$JZOOtc2Z(h<7FQ3T!z3w>%*HE8Za2DJ3yI1&!e(6Y4lQJuu&Sv0MvSp0bp zUV*emHD1t&^RdSECMG;`(qW3efGCtA^!-0Dwm1aj|AWb^k}KhVZep@OnEw8dxIb}a zqBSuS-}aIC-{QZ*7yb9+3*(2x2gW{&ZI9g^|JO~0&eLCPps!wUDM^^RmptA%7gIh34 ztB;ZL$db_M(6?5br|Sm}LsS4n4wk7wTstr=JZq&?7i^ zp(^WTN+0AAgu75CTA9*@4fdM(all21(rC14!v=YT*4|b8z5_kNWEaXjT&BWfe}HkvJsLBmPGG9-#k^iC05!|F_t~;LEEAKb`~p|1;6sq8CT!M{A=A z=Us5!t#OWYQuZhIWA(t$P{=%?!A^`!bxJ+E$1tJEx2s(qzBt6irxYZJ6Y z`1j$v!smu(hl@g=pxF4U_5}MK@Gz8LSs59qaiu4)@7*`fH)Yy4@sXZDz5^KDyrjSG zctfA>3THU%#Ta2%$%M z0{7m1>34RPe&>KnPjKG5Fa6FkZKoRT3Cg=L9x+>%FLN;`+LvR8dxG>1cxuV3^OroQ zX3G7e%aGx@dz}y99TULCbR_N(#;dtIo4Z*~PS zYHyZ!guLdZv`e;c`T#)f&2o>R)`hC@yPSUgT_okr+C|x3m$JQ%AcUtbRQ%sEELZz& zq|74}b)jzjO$U}s`wg}U1f4FF(r*~Vh9HAILP;0uo7d3O+G|FMN66@S5dN>d>Q8R3 z9x}`$NHn)*K3r9MHPD)`8l@gVqYLazv{$pu`KnRn5gNKs2fZ9f^5qhbP|$@s=;dsR zFAwnu`OHn$r4wJozH0IcctmZ{UM%$p?_8*CFZjDJ?FCih5xTihlWZ5B0Bw8UAs!)` z3v5cX?QP99|aDUV>xg*s?E+cP0ZnMbJQLS6lAXSttMr5@pv3l;pCY{8#F!3l?4 zsNmcDf^VxC;t}+?P{Fr#6ntAv$|J;ap@MIdf^VxS_6S^DV8f+tBVQ5Pwpf)%km5pp zyfrY(Y#rzklDNR$LwmAJd$QIe=x_m}lf3!wF;R1{e^>1>EL8*@E@11B7wJ*L_1BSM zrS_K(Unw&`4clB=UmPT;sz?P%4^c(3?+lV?4(s)#Gek#xhw@PN(t>}7!9S_@8 zEVQlQ%e9;QC^sPr;f~|l_^#iH+O<(JXYcnY`9R}*8`NWZ1&mO`aUDQ zQVtVr`E?j)hZ2b!l&Djng>Hg>wuNolx*kKl5{?q^Rj6I&tD$EKuc&reyvj>)*x*(x z6KLAZaIcsHj|hx{OEJ&R7V3d1^~<3$ZPYHs@;aD<2fpXDOK5q$1WR-g2MBCUwYAJR zsI85cc!M}d;8R1p*l(hX(L@6|Ot6W*SGbA3hb9`pQG!kM-7Zb^T{KaD4jXKu3j^1g;2vj|0xJQWn~&&28HG@D#LkF0c~X`Ixx&;V6Mt$d9sG)|S=1Mtl7@e8BRy zOZc|td9bf15}_Sr9gTCFwRS}4xhE0YXx>1CHe;06gChh!$nuNSx}fp&#Z9xpkfXIC zljNRc0)}y}Mw2nz1DYLu9+Xe|QFr zCiTR>6Q3vknRpMD0>4YVlGvWun)rF*!Nff{Q@9Z}16L&6#Knp86K5yRN}QQk2?tW{5SCz!CLnucP^mH6Y+27dzvOl!nh4+Qm z?U(K6>|f#p=4bZZ_U-mh?5pj|?KG?%&V#+fa#%bpuurn*+B5Cx_QCL3ILfZFhrsrs zFRULTuz%QTePX?Dy=A=tD~KJz}`R)EwHx*_O`&@7Wluo1xyvzK=~))9uaqo z*ev2M5t~HZDdG+h8%5kM;x-Ytinv9@%_43RaifTzh`2$-^&+kl@naF!invC^)gpc* z;)fzOh`36`l_IVXak+@~BG!qxOoS&QBf=Gt7ICSFOGNxY#P>z46>+hMi$r`+#CJtp zC}NF>3q+hR;ye-G5wTjtxgyRH0a{S%4$!BQSSezKh;|Y1P({z+9E$`v2uYkJVz~&= z!PAd$KSu)Iyhy14SGlVv>l7A|{B~U&MG3<3x-VF-F8_5w#*l zi5Mwjgoqju)gp$A7$%}h#845HA}U1eC!$?5L|h`u8Fi0Cb%mx!JsdXND3rHF)xxQLjDs0c@dEy5BJ5n+ljMCc-v2u(y- zM2Lm)t%(1K__v5}M0_pcD-kG9y zM7%2E*CJjK@v?}QM7$_shlm$MJTGFqi04H7O2o4wo)Pi1h;1Uaiuk37r$js{;t3JI z5b?N(pNn`*#G@h}5%I8yEg~Kg@t}yGiFiQ7{UYuYaj%G=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/voice-poc/package.json b/voice-poc/package.json new file mode 100644 index 0000000..8b421c3 --- /dev/null +++ b/voice-poc/package.json @@ -0,0 +1,12 @@ +{ + "name": "gibbz-voice-poc", + "private": true, + "version": "0.1.0", + "description": "Discord-clone POC: WebRTC voice chat + screen sharing + spatial audio", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "ws": "^8.18.0" + } +} diff --git a/voice-poc/public/app.js b/voice-poc/public/app.js new file mode 100644 index 0000000..228df45 --- /dev/null +++ b/voice-poc/public/app.js @@ -0,0 +1,794 @@ +/* gibbz voice POC — WebRTC mesh voice + screen share + spatial audio. + POC shortcuts: no auth, no reconnection, no text chat, single audio context. */ +'use strict'; + +// --------------------------------------------------------------------------- +// state +// --------------------------------------------------------------------------- +const ROOM_UNITS = 100; // spatial plane is 0..100 x 0..100 +const SPATIAL_SCALE = 0.12; // room units -> audio world units +const FALLBACK_ICE = { iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }; +const LS_NAME = 'voicepoc.nick'; +const LS_ICE = 'voicepoc.iceOverride'; + +const S = { + ws: null, + myId: null, + room: null, + name: localStorage.getItem(LS_NAME) || '', + peers: new Map(), // id -> peer record + micStream: null, + screenStream: null, + screenSenders: new Map(), // peerId -> [RTCRtpSender] + audioCtx: null, + me: { x: 50, y: 50 }, + muted: false, + deafened: false, + iceServers: null, // resolved on join + sharing: false, + connecting: false, +}; +window.__dbg = S; // POC debug handle + +const $ = (sel) => document.querySelector(sel); +const els = { + stage: $('#stage'), screens: $('#screens'), tiles: $('#tiles'), + spatial: $('#spatial'), status: $('#voice-status'), nick: $('#nick'), + meAvatar: $('#me-avatar'), mic: $('#btn-mic'), deafen: $('#btn-deafen'), +}; + +// --------------------------------------------------------------------------- +// helpers +// --------------------------------------------------------------------------- +function toast(msg, kind = '') { + const t = document.createElement('div'); + t.className = `toast ${kind}`; + t.textContent = msg; + $('#toasts').appendChild(t); + setTimeout(() => t.remove(), 5000); +} + +const PEER_COLORS = ['#5865f2', '#23a55a', '#f0b232', '#eb459e', '#3ba55c', '#faa61a', '#e67e22', '#9b59b6']; +function colorFor(id) { + let h = 0; + for (const c of id) h = (h * 31 + c.charCodeAt(0)) >>> 0; + return PEER_COLORS[h % PEER_COLORS.length]; +} +function setAvatar(el, name, id) { + el.style.background = colorFor(id); + el.textContent = (name || '?').slice(0, 1).toUpperCase(); +} + +function effectiveIce() { + const raw = localStorage.getItem(LS_ICE); + if (raw) { + try { return JSON.parse(raw); } catch { /* fall through */ } + } + return S.iceServers || FALLBACK_ICE; +} + +// --------------------------------------------------------------------------- +// join / leave +// --------------------------------------------------------------------------- +async function joinVoice(room) { + if (S.room === room || S.connecting) return; + if (S.room) leaveVoice('switching channel'); + S.connecting = true; + setStatus(`connecting to ${room}…`); + + try { + S.iceServers = await fetchIce(); + } catch { + toast('Could not load ICE config from server — using fallback STUN', 'warn'); + } + + // mic (join anyway without one — listen-only) + try { + S.micStream = await navigator.mediaDevices.getUserMedia({ + audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true }, + }); + } catch { + S.micStream = null; + toast('No microphone available — joining in listen-only mode', 'warn'); + } + els.mic.disabled = !S.micStream; + S.muted = false; + + // audio context must exist after a user gesture — the channel click is one + if (!S.audioCtx) S.audioCtx = new AudioContext(); + await S.audioCtx.resume().catch(() => {}); + orientListener(); + + await openSignaling(room); + S.connecting = false; +} + +async function fetchIce() { + const res = await fetch('/api/ice'); + if (!res.ok) throw new Error(`ice ${res.status}`); + return res.json(); +} + +function leaveVoice(reason) { + if (!S.room && !S.ws) return; + if (S.sharing) stopScreenShare(true); + for (const peer of S.peers.values()) destroyPeer(peer); + S.peers.clear(); + if (S.ws) { try { S.ws.close(); } catch {} S.ws = null; } + if (S.micStream) { S.micStream.getTracks().forEach((t) => t.stop()); S.micStream = null; } + els.mic.disabled = false; + updateMicButton(); + document.querySelectorAll('.channel.voice').forEach((c) => c.classList.remove('active')); + S.room = null; + S.myId = null; + S.muted = false; + S.deafened = false; + updateDeafenButton(); + renderAll(); + setStatus(reason || 'not connected'); +} + +function setStatus(text) { els.status.textContent = text; } + +// --------------------------------------------------------------------------- +// signaling +// --------------------------------------------------------------------------- +function openSignaling(room) { + return new Promise((resolve, reject) => { + const proto = location.protocol === 'https:' ? 'wss' : 'ws'; + const url = `${proto}://${location.host}/ws?room=${encodeURIComponent(room)}&name=${encodeURIComponent(S.name)}`; + const ws = new WebSocket(url); + S.ws = ws; + ws.onerror = () => { S.connecting = false; setStatus('connection failed'); reject(new Error('websocket failed')); }; + ws.onmessage = (ev) => { + let msg; + try { msg = JSON.parse(ev.data); } catch { return; } + try { handleSignal(msg); } catch (err) { console.error('signal handler error', msg.type, err); } + }; + ws.onclose = () => { + if (S.ws === ws && S.room) { + toast('Signaling connection lost', 'error'); + leaveVoice('disconnected'); + } + }; + ws.onopen = () => resolve(); + }); +} + +function send(msg) { + if (S.ws && S.ws.readyState === 1) S.ws.send(JSON.stringify(msg)); +} + +function handleSignal(msg) { + switch (msg.type) { + case 'hello': { + S.myId = msg.id; + for (const p of msg.peers) { + S.peers.set(p.id, makePeerRecord(p)); + // deterministic initiator: lower id offers (no glare storm on join) + ensurePC(S.peers.get(p.id), S.myId < p.id); + } + sendMyPos(true); + renderAll(); + setStatus(`voice connected — ${msg.peers.length + 1} in ${msg.room}`); + toast(`Joined ${msg.room}`, 'ok'); + break; + } + case 'joined': + S.peers.set(msg.peer.id, makePeerRecord(msg.peer)); + renderAll(); + toast(`${msg.peer.name} joined`, 'ok'); + break; + case 'left': { + const peer = S.peers.get(msg.id); + if (peer) { + destroyPeer(peer); + S.peers.delete(msg.id); + renderAll(); + toast(`${peer.name} left`); + } + break; + } + case 'pos': { + const peer = S.peers.get(msg.from); + if (peer) { peer.x = msg.x; peer.y = msg.y; updatePanner(peer); } + break; + } + case 'state': { + const peer = S.peers.get(msg.from); + if (peer) { peer.state = msg.state; renderTiles(); } + break; + } + case 'offer': + case 'answer': { + const peer = ensurePC(S.peers.get(msg.from) || createOrphanPeer(msg.from), false); + onDescription(peer, msg.sdp).catch((e) => console.error('description failed', e)); + break; + } + case 'candidate': { + const peer = S.peers.get(msg.from); + if (!peer || !peer.pc) return; // candidates only after description path created pc + onCandidate(peer, msg.candidate).catch((e) => console.error('candidate failed', e)); + break; + } + default: + break; + } +} + +// --------------------------------------------------------------------------- +// peer records + WebRTC (perfect negotiation) +// --------------------------------------------------------------------------- +function makePeerRecord(p) { + return { + id: p.id, name: p.name, x: p.x, y: p.y, + state: p.state || { muted: false, deafened: false, sharing: false }, + pc: null, polite: false, makingOffer: false, ignoreOffer: false, + pendingCandidates: [], micStream: null, screenStream: null, + gain: null, panner: null, analyser: null, vol: 1, speaking: false, + els: {}, + }; +} + +function createOrphanPeer(id) { + const p = makePeerRecord({ id, name: 'peer-' + id.slice(0, 4), x: 50, y: 50 }); + S.peers.set(id, p); + return p; +} + +function ensurePC(peer, initiator) { + if (peer.pc) return peer; + const pc = new RTCPeerConnection({ ...effectiveIce(), iceCandidatePoolSize: 4 }); + peer.pc = pc; + peer.polite = S.myId > peer.id; + + pc.onnegotiationneeded = async () => { + try { + peer.makingOffer = true; + await pc.setLocalDescription(); + send({ type: 'offer', to: peer.id, sdp: pc.localDescription }); + } catch (err) { + console.error('negotiation failed', err); + } finally { + peer.makingOffer = false; + } + }; + pc.onicecandidate = ({ candidate }) => { + if (candidate) send({ type: 'candidate', to: peer.id, candidate }); + }; + pc.onconnectionstatechange = () => { + renderTiles(); + if (pc.connectionState === 'failed') { + console.warn('peer connection failed, restarting ICE', peer.id); + try { pc.restartIce(); } catch {} + } + }; + pc.ontrack = (ev) => onRemoteTrack(peer, ev); + + // send my mic; if I have none, ask to receive theirs + if (S.micStream) { + for (const track of S.micStream.getAudioTracks()) pc.addTrack(track, S.micStream); + } else { + pc.addTransceiver('audio', { direction: 'recvonly' }); + } + + if (initiator) pc.onnegotiationneeded(); + return peer; +} + +async function onDescription(peer, desc) { + const pc = peer.pc; + const collision = desc.type === 'offer' && (peer.makingOffer || pc.signalingState !== 'stable'); + peer.ignoreOffer = !peer.polite && collision; + if (peer.ignoreOffer) return; // impolite side ignores the rival offer + + await pc.setRemoteDescription(desc); // modern browsers roll back implicitly when polite + for (const c of peer.pendingCandidates.splice(0)) { + await pc.addIceCandidate(c).catch((e) => console.warn('buffered candidate failed', e)); + } + if (desc.type === 'offer') { + await pc.setLocalDescription(); + send({ type: 'answer', to: peer.id, sdp: pc.localDescription }); + } +} + +async function onCandidate(peer, candidate) { + if (peer.ignoreOffer) return; + if (!peer.pc.remoteDescription) { + peer.pendingCandidates.push(candidate); + return; + } + await peer.pc.addIceCandidate(candidate); +} + +function destroyPeer(peer) { + if (peer.pc) { try { peer.pc.close(); } catch {} peer.pc = null; } + detachSpatial(peer); + peer.micStream = null; + peer.screenStream = null; + peer.els = {}; + renderScreens(); +} + +// --------------------------------------------------------------------------- +// remote media: mic -> spatial chain, screen -> big video + direct audio +// --------------------------------------------------------------------------- +function onRemoteTrack(peer, ev) { + const stream = ev.streams[0]; + if (!stream) return; + if (stream.getVideoTracks().length > 0) { + peer.screenStream = stream; + stream.getVideoTracks().forEach((t) => { + t.addEventListener('ended', () => { + if (peer.screenStream === stream) { peer.screenStream = null; renderScreens(); } + }); + }); + renderScreens(); + console.log('remote screen share from', peer.name); + } else { + peer.micStream = stream; + attachSpatial(peer, stream); + console.log('remote mic from', peer.name); + } + renderTiles(); +} + +function attachSpatial(peer, stream) { + const ctx = S.audioCtx; + if (!ctx || peer.panner) return; + const src = ctx.createMediaStreamSource(stream); + const panner = ctx.createPanner(); + panner.panningModel = 'HRTF'; + panner.distanceModel = 'inverse'; + panner.refDistance = 4; + panner.rolloffFactor = 1.4; + panner.maxDistance = 200; + const gain = ctx.createGain(); + gain.gain.value = S.deafened ? 0 : peer.vol; + const analyser = ctx.createAnalyser(); + analyser.fftSize = 256; + src.connect(panner).connect(gain).connect(analyser).connect(ctx.destination); + Object.assign(peer, { panner, gain, analyser }); + updatePanner(peer); +} + +function detachSpatial(peer) { + if (peer.gain) { try { peer.gain.disconnect(); } catch {} } + if (peer.panner) { try { peer.panner.disconnect(); } catch {} } + peer.panner = peer.gain = peer.analyser = null; +} + +function updatePanner(peer) { + if (!peer.panner) return; + const x = (peer.x - S.me.x) * SPATIAL_SCALE; + const z = (peer.y - S.me.y) * SPATIAL_SCALE; // screen-down = behind listener + const p = peer.panner; + if (p.positionX) { + p.positionX.value = x; p.positionY.value = 0; p.positionZ.value = z; + } else { // old Safari + p.setPosition(x, 0, z); + } +} + +function orientListener() { + const l = S.audioCtx && S.audioCtx.listener; + if (!l) return; + if (l.forwardX) { + l.forwardX.value = 0; l.forwardY.value = 0; l.forwardZ.value = -1; + l.upX.value = 0; l.upY.value = 1; l.upZ.value = 0; + } else { + l.setOrientation(0, 0, -1, 0, 1, 0); + } +} + +// --------------------------------------------------------------------------- +// screen share (local) +// --------------------------------------------------------------------------- +async function startScreenShare() { + if (S.sharing || !S.room) return; + let stream; + try { + stream = await navigator.mediaDevices.getDisplayMedia({ + video: { frameRate: 30 }, audio: true, + }); + } catch { + return; // user cancelled + } + S.screenStream = stream; + S.sharing = true; + send({ type: 'state', state: { muted: S.muted, deafened: S.deafened, sharing: true } }); + + for (const peer of S.peers.values()) addScreenToPeer(peer); + stream.getVideoTracks()[0].addEventListener('ended', () => stopScreenShare()); + renderScreens(); + renderTiles(); + toast('You are sharing your screen', 'ok'); +} + +function addScreenToPeer(peer) { + if (!peer.pc || !S.screenStream) return; + const senders = []; + for (const track of S.screenStream.getTracks()) { + senders.push(peer.pc.addTrack(track, S.screenStream)); + } + S.screenSenders.set(peer.id, senders); // renegotiation fires automatically +} + +function stopScreenShare(silent) { + if (!S.sharing) return; + S.sharing = false; + for (const [peerId, senders] of S.screenSenders) { + const peer = S.peers.get(peerId); + if (peer && peer.pc) for (const s of senders) { try { peer.pc.removeTrack(s); } catch {} } + } + S.screenSenders.clear(); + if (S.screenStream) { S.screenStream.getTracks().forEach((t) => t.stop()); S.screenStream = null; } + send({ type: 'state', state: { muted: S.muted, deafened: S.deafened, sharing: false } }); + renderScreens(); + renderTiles(); + if (!silent) toast('Screen share stopped'); +} + +// --------------------------------------------------------------------------- +// position sync +// --------------------------------------------------------------------------- +let lastPosSend = 0; +function sendMyPos(force) { + const now = performance.now(); + if (!force && now - lastPosSend < 60) return; + lastPosSend = now; + send({ type: 'pos', x: S.me.x, y: S.me.y }); + for (const peer of S.peers.values()) updatePanner(peer); +} + +// --------------------------------------------------------------------------- +// speaking detection (local meter + per-peer analyser RMS) +// --------------------------------------------------------------------------- +const meterBuf = new Uint8Array(256); +function rms(analyser) { + analyser.getByteTimeDomainData(meterBuf); + let sum = 0; + for (let i = 0; i < meterBuf.length; i++) { + const v = (meterBuf[i] - 128) / 128; + sum += v * v; + } + return Math.sqrt(sum / meterBuf.length); +} + +let localAnalyser = null; +setInterval(() => { + if (!S.audioCtx) return; + if (S.micStream && !localAnalyser) { + const src = S.audioCtx.createMediaStreamSource(S.micStream); + localAnalyser = S.audioCtx.createAnalyser(); + localAnalyser.fftSize = 256; + src.connect(localAnalyser); // tap only — not connected to destination (no echo) + } + const meSpeaking = localAnalyser && !S.muted && rms(localAnalyser) > 0.04; + els.meAvatar.classList.toggle('speaking', !!meSpeaking); + let changed = false; + for (const peer of S.peers.values()) { + const speaking = !!(peer.analyser && !S.deafened && rms(peer.analyser) > 0.03); + if (speaking !== peer.speaking) { peer.speaking = speaking; changed = true; } + } + if (changed) renderTiles(); +}, 150); + +// --------------------------------------------------------------------------- +// rendering +// --------------------------------------------------------------------------- +function renderAll() { + renderTiles(); + renderScreens(); + renderStageEmpty(); + renderChannelCounts(); +} + +function renderStageEmpty() { + const anyone = S.peers.size > 0 || S.sharing || S.room; + els.stage.classList.toggle('empty', !anyone); +} + +function renderChannelCounts() { + // POC: server does not expose cross-room rosters; count is local-room only + const counts = {}; + for (const p of S.peers.values()) counts[S.room] = (counts[S.room] || 0) + 1; + document.querySelectorAll('[data-room-count]').forEach((el) => { + const n = counts[el.dataset.roomCount] || 0; + el.textContent = n ? `${n + (el.dataset.roomCount === S.room ? 1 : 0)}` : ''; + }); +} + +function renderTiles() { + els.tiles.innerHTML = ''; + for (const peer of S.peers.values()) { + const tile = document.createElement('div'); + tile.className = 'tile' + (peer.speaking ? ' speaking' : ''); + const av = document.createElement('div'); + av.className = 'avatar'; + setAvatar(av, peer.name, peer.id); + const name = document.createElement('div'); + name.className = 'name'; + name.textContent = peer.name; + const sub = document.createElement('div'); + sub.className = 'sub'; + const bits = []; + if (!peer.pc) bits.push('signaling…'); + else if (peer.pc.connectionState !== 'connected') bits.push(`${peer.pc.connectionState}…`); + else if (!peer.micStream && !peer.state.muted) bits.push('no audio yet'); + if (peer.state.muted) bits.push('muted'); + if (peer.state.sharing) bits.push(''); + sub.innerHTML = bits.join(' ') || 'connected'; + const vol = document.createElement('input'); + vol.type = 'range'; vol.min = 0; vol.max = 2; vol.step = 0.05; vol.value = peer.vol; + vol.title = 'Volume'; + vol.oninput = () => { + peer.vol = Number(vol.value); + if (peer.gain && !S.deafened) peer.gain.gain.value = peer.vol; + }; + tile.append(av, name, sub, vol); + els.tiles.appendChild(tile); + } + renderStageEmpty(); +} + +function renderScreens() { + els.screens.innerHTML = ''; + const shares = []; + if (S.sharing && S.screenStream) shares.push({ name: `${S.name} (you)`, stream: S.screenStream }); + for (const peer of S.peers.values()) { + if (peer.screenStream) shares.push({ name: peer.name, stream: peer.screenStream }); + } + for (const share of shares) { + const card = document.createElement('div'); + card.className = 'screen-card'; + const video = document.createElement('video'); + video.autoplay = true; + video.playsInline = true; + video.muted = false; + video.srcObject = share.stream; + video.play().catch(() => {}); + const label = document.createElement('div'); + label.className = 'label'; + label.innerHTML = '●'; + label.appendChild(document.createTextNode(share.name)); + card.append(video, label); + els.screens.appendChild(card); + } +} + +// --------------------------------------------------------------------------- +// spatial canvas +// --------------------------------------------------------------------------- +const ctx2d = els.spatial.getContext('2d'); +let dragging = null; + +function spatialMetrics() { + const r = els.spatial.getBoundingClientRect(); + const dpr = window.devicePixelRatio || 1; + if (els.spatial.width !== r.width * dpr) { + els.spatial.width = r.width * dpr; + els.spatial.height = r.height * dpr; + } + ctx2d.setTransform(dpr, 0, 0, dpr, 0, 0); + const pad = 30; + return { w: r.width, h: r.height, pad, + toPx: (x, y) => [pad + (x / ROOM_UNITS) * (r.width - 2 * pad), + pad + (y / ROOM_UNITS) * (r.height - 2 * pad)], + fromPx: (px, py) => [((px - pad) / (r.width - 2 * pad)) * ROOM_UNITS, + ((py - pad) / (r.height - 2 * pad)) * ROOM_UNITS] }; +} + +function drawSpatial() { + const m = spatialMetrics(); + ctx2d.clearRect(0, 0, m.w, m.h); + + // grid + ctx2d.strokeStyle = 'rgba(255,255,255,.05)'; + ctx2d.lineWidth = 1; + for (let i = 0; i <= ROOM_UNITS; i += 10) { + const [gx, gy] = m.toPx(i, i); + ctx2d.beginPath(); ctx2d.moveTo(gx, m.toPx(0, 0)[1]); ctx2d.lineTo(gx, m.toPx(0, 100)[1]); ctx2d.stroke(); + ctx2d.beginPath(); ctx2d.moveTo(m.toPx(0, 0)[0], gy); ctx2d.lineTo(m.toPx(100, 0)[0], gy); ctx2d.stroke(); + } + + // audible range around me (~gain 0.05 at 56 units with ref=4, rolloff=1.4) + const [mx, my] = m.toPx(S.me.x, S.me.y); + const rangeR = (56 / ROOM_UNITS) * (m.w - 2 * m.pad); + ctx2d.strokeStyle = 'rgba(88,101,242,.35)'; + ctx2d.setLineDash([5, 5]); + ctx2d.beginPath(); ctx2d.arc(mx, my, Math.max(0, Math.min(rangeR, m.h - 2 * m.pad)), 0, Math.PI * 2); ctx2d.stroke(); + ctx2d.setLineDash([]); + + // peers + for (const peer of S.peers.values()) drawAvatarDot(peer.name, peer.id, peer.x, peer.y, peer.speaking, peer.state.muted, false, m); + // me (draggable listener) + drawAvatarDot(S.name || 'me', S.myId || 'me', S.me.x, S.me.y, els.meAvatar.classList.contains('speaking'), S.muted, true, m); + + if (!dragging) requestAnimationFrame(drawSpatial); +} +requestAnimationFrame(drawSpatial); + +function drawAvatarDot(name, id, x, y, speaking, muted, isMe, m) { + const [px, py] = m.toPx(x, y); + const r = isMe ? 16 : 13; + ctx2d.beginPath(); + ctx2d.arc(px, py, r, 0, Math.PI * 2); + ctx2d.fillStyle = colorFor(id); + ctx2d.fill(); + if (speaking) { + ctx2d.strokeStyle = '#23a55a'; + ctx2d.lineWidth = 3; + ctx2d.stroke(); + } + if (muted) { + ctx2d.strokeStyle = '#f23f43'; + ctx2d.lineWidth = 3; + ctx2d.beginPath(); + ctx2d.moveTo(px - r, py + r); + ctx2d.lineTo(px + r, py - r); + ctx2d.stroke(); + } + ctx2d.fillStyle = '#fff'; + ctx2d.font = `bold ${Math.round(r)}px system-ui`; + ctx2d.textAlign = 'center'; + ctx2d.textBaseline = 'middle'; + ctx2d.fillText(name.slice(0, 1).toUpperCase(), px, py + 1); + ctx2d.font = '11px system-ui'; + ctx2d.fillStyle = isMe ? '#b5bac1' : '#80848e'; + ctx2d.fillText(name + (isMe ? ' (you)' : ''), px, py + r + 12); +} + +els.spatial.addEventListener('pointerdown', (ev) => { + const m = spatialMetrics(); + const rect = els.spatial.getBoundingClientRect(); + const px = ev.clientX - rect.left, py = ev.clientY - rect.top; + const [ux, uy] = m.fromPx(px, py); + const d = Math.hypot(ux - S.me.x, uy - S.me.y); + if (d < 10) { + dragging = { dx: S.me.x - ux, dy: S.me.y - uy }; + els.spatial.classList.add('dragging'); + els.spatial.setPointerCapture(ev.pointerId); + } +}); +els.spatial.addEventListener('pointermove', (ev) => { + if (!dragging) return; + const m = spatialMetrics(); + const rect = els.spatial.getBoundingClientRect(); + const [ux, uy] = m.fromPx(ev.clientX - rect.left, ev.clientY - rect.top); + S.me.x = Math.min(ROOM_UNITS, Math.max(0, ux + dragging.dx)); + S.me.y = Math.min(ROOM_UNITS, Math.max(0, uy + dragging.dy)); + sendMyPos(); +}); +els.spatial.addEventListener('pointerup', () => { + if (!dragging) return; + dragging = null; + els.spatial.classList.remove('dragging'); + sendMyPos(true); + requestAnimationFrame(drawSpatial); // rAF loop stopped while dragging +}); + +// --------------------------------------------------------------------------- +// controls & wiring +// --------------------------------------------------------------------------- +function updateMicButton() { + els.mic.classList.toggle('off', S.muted || !S.micStream); +} +function updateDeafenButton() { + els.deafen.classList.toggle('off', S.deafened); +} +function sendState() { + send({ type: 'state', state: { muted: S.muted, deafened: S.deafened, sharing: S.sharing } }); +} + +function toggleMic() { + if (!S.micStream) return; + S.muted = !S.muted; + S.micStream.getAudioTracks().forEach((t) => (t.enabled = !S.muted)); + updateMicButton(); + sendState(); + renderTiles(); +} + +function toggleDeafen() { + if (!S.audioCtx) return; + S.deafened = !S.deafened; + for (const peer of S.peers.values()) { + if (peer.gain) peer.gain.gain.value = S.deafened ? 0 : peer.vol; + } + updateDeafenButton(); + sendState(); + renderTiles(); +} + +els.mic.onclick = toggleMic; +els.deafen.onclick = toggleDeafen; +$('#btn-settings').onclick = openSettings; + +els.nick.value = S.name; +els.nick.addEventListener('change', () => { + S.name = els.nick.value.trim() || `guest-${Math.random().toString(36).slice(2, 6)}`; + els.nick.value = S.name; + localStorage.setItem(LS_NAME, S.name); + setAvatar(els.meAvatar, S.name, S.myId || 'me'); +}); +if (!S.name) { + S.name = `guest-${Math.random().toString(36).slice(2, 6)}`; + els.nick.value = S.name; + localStorage.setItem(LS_NAME, S.name); +} +setAvatar(els.meAvatar, S.name, 'me'); + +document.querySelectorAll('.channel.voice').forEach((el) => { + el.onclick = () => { + if (S.room === el.dataset.room) return; + document.querySelectorAll('.channel.voice').forEach((c) => c.classList.remove('active')); + el.classList.add('active'); + joinVoice(el.dataset.room).catch((e) => { + console.error(e); + toast(`Join failed: ${e.message}`, 'error'); + leaveVoice('join failed'); + }); + }; +}); +document.querySelectorAll('.channel.text').forEach((el) => { + el.onclick = () => toast('POC: text chat is not implemented'); +}); + +// spawn me somewhere spread out, not dead-center on top of others +(() => { + let h = 0; + for (const c of S.myId || S.name) h = (h * 33 + c.charCodeAt(0)) >>> 0; + const a = (h % 360) * (Math.PI / 180); + S.me.x = 50 + 20 * Math.cos(a); + S.me.y = 50 + 20 * Math.sin(a); +})(); + +window.addEventListener('keydown', (ev) => { + if (ev.target.tagName === 'INPUT' || ev.target.tagName === 'TEXTAREA') return; + if (ev.key === 'm') toggleMic(); + if (ev.key === 'd') toggleDeafen(); +}); +window.addEventListener('beforeunload', () => { try { leaveVoice(); } catch {} }); + +// --------------------------------------------------------------------------- +// settings modal (custom STUN/TURN) +// --------------------------------------------------------------------------- +function openSettings() { + const override = localStorage.getItem(LS_ICE); + $('#override-enabled').checked = !!override; + const current = override ? JSON.parse(override) : effectiveIce(); + $('#ice-json').value = JSON.stringify(current, null, 2); + fetchIce().then( + (server) => { $('#ice-server-default').textContent = JSON.stringify(server, null, 2); }, + () => { $('#ice-server-default').textContent = '(unavailable)'; }, + ); + $('#modal-backdrop').classList.remove('hidden'); +} +$('#ice-cancel').onclick = () => $('#modal-backdrop').classList.add('hidden'); +$('#modal-backdrop').onclick = (ev) => { + if (ev.target === $('#modal-backdrop')) $('#modal-backdrop').classList.add('hidden'); +}; +$('#ice-reset').onclick = () => { + localStorage.removeItem(LS_ICE); + $('#override-enabled').checked = false; + fetchIce().then((server) => { $('#ice-json').value = JSON.stringify(server, null, 2); }); +}; +$('#ice-save').onclick = () => { + const enabled = $('#override-enabled').checked; + let parsed = null; + if (enabled) { + try { + parsed = JSON.parse($('#ice-json').value); + if (!Array.isArray(parsed.iceServers)) throw new Error('missing "iceServers" array'); + } catch (err) { + toast(`Invalid ICE JSON: ${err.message}`, 'error'); + return; + } + localStorage.setItem(LS_ICE, JSON.stringify(parsed)); + } else { + localStorage.removeItem(LS_ICE); + } + $('#modal-backdrop').classList.add('hidden'); + toast(enabled ? 'Custom ICE saved — rejoin to apply' : 'Reverted to server ICE — rejoin to apply', 'ok'); +}; diff --git a/voice-poc/public/index.html b/voice-poc/public/index.html new file mode 100644 index 0000000..f264cbf --- /dev/null +++ b/voice-poc/public/index.html @@ -0,0 +1,92 @@ + + + + + +gibbz voice — POC + + + +

+ + + + + + + +
+
+
+
+
+
🔊
+

Pick a voice channel to join

+

Peer-to-peer WebRTC voice & screen sharing. Drag avatars on the spatial plane to position who you hear.

+
+
+ +
+
+ SPATIAL AUDIO + drag your avatar — others hear you shift; you hear them relative to position +
+ +
+
+
+ + + + +
+ + + + diff --git a/voice-poc/public/style.css b/voice-poc/public/style.css new file mode 100644 index 0000000..c5bec25 --- /dev/null +++ b/voice-poc/public/style.css @@ -0,0 +1,204 @@ +/* Discord-ish dark theme (POC) */ +:root { + --bg-0: #1e1f22; /* rail */ + --bg-1: #2b2d31; /* sidebar */ + --bg-2: #313338; /* main */ + --bg-3: #383a40; /* hover */ + --bg-4: #404249; + --text-0: #f2f3f5; + --text-1: #b5bac1; + --text-2: #80848e; + --brand: #5865f2; + --green: #23a55a; + --red: #f23f43; + --yellow: #f0b232; + --radius: 8px; +} +* { box-sizing: border-box; margin: 0; } +html, body { height: 100%; } +body { + font: 14px/1.4 "gg sans", "Segoe UI", system-ui, -apple-system, sans-serif; + background: var(--bg-2); + color: var(--text-0); + overflow: hidden; +} +#app { display: flex; height: 100vh; } + +/* rail */ +#rail { + width: 68px; background: var(--bg-0); padding: 12px 0; + display: flex; flex-direction: column; align-items: center; gap: 8px; flex-shrink: 0; +} +.rail-icon { + width: 44px; height: 44px; border-radius: 50%; background: var(--bg-3); + display: grid; place-items: center; font-weight: 700; color: var(--text-1); + cursor: pointer; transition: border-radius .15s, background .15s; +} +.rail-icon:hover, .rail-icon.home { border-radius: 16px; background: var(--brand); color: #fff; } +.rail-sep { width: 28px; height: 2px; background: var(--bg-3); border-radius: 1px; } + +/* sidebar */ +#sidebar { + width: 250px; background: var(--bg-1); display: flex; flex-direction: column; flex-shrink: 0; +} +#server-name { + padding: 14px 16px; font-weight: 700; font-size: 15px; + border-bottom: 1px solid rgba(0,0,0,.25); box-shadow: 0 1px 0 rgba(0,0,0,.06); +} +.poc-tag { + font-size: 10px; background: var(--yellow); color: #000; border-radius: 4px; + padding: 1px 5px; vertical-align: 2px; margin-left: 6px; font-weight: 800; +} +.channel-group-label { + padding: 18px 8px 4px 16px; font-size: 11px; font-weight: 700; + letter-spacing: .4px; color: var(--text-2); text-transform: uppercase; +} +.channel { + margin: 1px 8px; padding: 7px 8px; border-radius: 6px; color: var(--text-1); + cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; +} +.channel:hover { background: var(--bg-3); color: var(--text-0); } +.channel.text { cursor: not-allowed; color: var(--text-2); } +.channel.text .hint { font-size: 10px; margin-left: 4px; } +.channel.voice.active { background: rgba(88,101,242,.25); color: var(--text-0); } +.channel .count { float: right; color: var(--text-2); font-size: 12px; } + +#user-panel { + margin-top: auto; background: var(--bg-0); padding: 8px; + display: flex; align-items: center; gap: 8px; +} +.me { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; } +.me-meta { display: flex; flex-direction: column; min-width: 0; } +#nick { + background: transparent; border: none; color: var(--text-0); font: inherit; + font-weight: 600; width: 100%; padding: 0; outline: none; border-bottom: 1px dashed transparent; +} +#nick:hover, #nick:focus { border-bottom-color: var(--text-2); } +#voice-status { font-size: 11px; color: var(--text-2); } +.user-buttons { display: flex; gap: 2px; } +.ctl { + background: transparent; border: none; color: var(--text-1); font-size: 16px; + width: 32px; height: 32px; border-radius: 6px; cursor: pointer; position: relative; +} +.ctl:hover { background: var(--bg-3); color: var(--text-0); } +.ctl.off { color: var(--red); } +.ctl.off::after { + content: ""; position: absolute; left: 7px; top: 15px; width: 18px; height: 2px; + background: var(--red); transform: rotate(-40deg); border-radius: 1px; +} +.ctl:disabled { opacity: .35; cursor: not-allowed; } + +/* main */ +#main { flex: 1; display: flex; flex-direction: column; min-width: 0; } +#stage { + flex: 1; display: flex; flex-direction: column; padding: 16px; gap: 16px; + overflow: auto; position: relative; +} +#stage-empty { + position: absolute; inset: 0; display: grid; place-content: center; + text-align: center; gap: 8px; color: var(--text-1); padding: 24px; +} +#stage-empty .big-icon { font-size: 56px; } +#stage-empty h2 { font-size: 20px; color: var(--text-0); } +#stage-empty p { max-width: 420px; color: var(--text-2); } +#stage.empty #stage-empty { display: grid; } +#stage:not(.empty) #stage-empty { display: none; } + +#screens { display: flex; gap: 12px; flex-wrap: wrap; } +.screen-card { + position: relative; background: #000; border-radius: var(--radius); overflow: hidden; + flex: 1 1 480px; max-width: 100%; box-shadow: 0 8px 24px rgba(0,0,0,.4); +} +.screen-card video { width: 100%; display: block; max-height: 62vh; object-fit: contain; } +.screen-card .label { + position: absolute; left: 8px; bottom: 8px; background: rgba(0,0,0,.65); + padding: 3px 8px; border-radius: 5px; font-size: 12px; font-weight: 600; +} +.screen-card .label .live { color: var(--red); font-weight: 800; margin-right: 5px; } + +#tiles { display: flex; gap: 10px; flex-wrap: wrap; } +.tile { + background: var(--bg-1); border-radius: var(--radius); padding: 12px; width: 150px; + display: flex; flex-direction: column; align-items: center; gap: 6px; position: relative; + border: 2px solid transparent; +} +.tile.speaking { border-color: var(--green); } +.tile .avatar { width: 56px; height: 56px; font-size: 24px; } +.tile .name { font-weight: 600; max-width: 100%; overflow: hidden; text-overflow: ellipsis; } +.tile .sub { font-size: 11px; color: var(--text-2); display: flex; gap: 6px; align-items: center; } +.tile .mute-tag { color: var(--red); } +.tile .share-tag { color: var(--yellow); } +.tile input[type=range] { width: 100%; accent-color: var(--brand); } +.tile .connecting { font-size: 11px; color: var(--yellow); } + +.avatar { + width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; + font-weight: 700; color: #fff; flex-shrink: 0; user-select: none; +} + +/* spatial plane */ +#spatial-wrap { + height: 34vh; min-height: 220px; background: var(--bg-1); + border-top: 1px solid rgba(0,0,0,.35); display: flex; flex-direction: column; +} +.spatial-label { + padding: 8px 16px 0; font-size: 11px; font-weight: 700; color: var(--text-2); + letter-spacing: .5px; display: flex; gap: 16px; +} +.spatial-label .hint { font-weight: 400; letter-spacing: 0; text-transform: none; } +#spatial { flex: 1; width: 100%; cursor: grab; touch-action: none; } +#spatial.dragging { cursor: grabbing; } + +/* modal */ +#modal-backdrop { + position: fixed; inset: 0; background: rgba(0,0,0,.7); display: grid; + place-items: center; z-index: 50; +} +#modal-backdrop.hidden { display: none; } +#settings-modal { + width: min(620px, 92vw); max-height: 90vh; overflow: auto; + background: var(--bg-1); border-radius: 8px; padding: 20px; + box-shadow: 0 12px 40px rgba(0,0,0,.6); +} +#settings-modal h2 { font-size: 18px; margin-bottom: 6px; } +#settings-modal h3 { font-size: 13px; margin: 16px 0 4px; color: var(--text-1); } +#settings-modal p { margin-bottom: 10px; } +#ice-json { + width: 100%; background: var(--bg-0); color: var(--text-0); border: 1px solid var(--bg-4); + border-radius: 6px; padding: 10px; font: 12px/1.5 ui-monospace, "Cascadia Code", monospace; + resize: vertical; +} +#ice-json:focus { outline: none; border-color: var(--brand); } +#ice-server-default { + background: var(--bg-0); padding: 8px 10px; border-radius: 6px; + font: 11px/1.5 ui-monospace, monospace; white-space: pre-wrap; +} +.toggle-row { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; cursor: pointer; } +.toggle-row input { accent-color: var(--brand); width: 16px; height: 16px; } +.modal-actions { display: flex; gap: 8px; margin-top: 12px; align-items: center; } +.modal-actions .spacer { flex: 1; } +.modal-actions button { + padding: 8px 16px; border-radius: 6px; border: none; cursor: pointer; + font-weight: 600; font-size: 13px; +} +.modal-actions button:not(.ghost) { background: var(--brand); color: #fff; } +.modal-actions button.ghost { background: transparent; color: var(--text-1); } +.modal-actions button.ghost:hover { text-decoration: underline; } + +/* toasts */ +#toasts { + position: fixed; bottom: 16px; right: 16px; display: flex; flex-direction: column; + gap: 8px; z-index: 60; max-width: 380px; +} +.toast { + background: var(--bg-0); border-left: 3px solid var(--brand); border-radius: 6px; + padding: 10px 14px; box-shadow: 0 8px 20px rgba(0,0,0,.5); font-size: 13px; + animation: slide-in .18s ease-out; +} +.toast.error { border-left-color: var(--red); } +.toast.warn { border-left-color: var(--yellow); } +.toast.ok { border-left-color: var(--green); } +@keyframes slide-in { from { transform: translateX(30px); opacity: 0; } } + +.hint { color: var(--text-2); font-size: 12px; } +code { font-family: ui-monospace, monospace; font-size: 12px; } diff --git a/voice-poc/server.js b/voice-poc/server.js new file mode 100644 index 0000000..b4d56c7 --- /dev/null +++ b/voice-poc/server.js @@ -0,0 +1,199 @@ +// Minimal WebRTC signaling + static file server for the Discord-clone POC. +// POC shortcut: no auth, no persistence, in-memory rooms, no rate limiting. +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +const { WebSocketServer } = require('ws'); + +const PORT = Number(process.env.PORT || 8080); +const HOST = process.env.HOST || '0.0.0.0'; +const PUBLIC_DIR = path.join(__dirname, 'public'); + +// --------------------------------------------------------------------------- +// ICE configuration: env-driven, full JSON override wins. +// STUN_URLS comma-separated stun: urls +// TURN_URLS comma-separated turn:/turns: urls +// TURN_USERNAME / TURN_CREDENTIAL static creds for all TURN urls +// ICE_SERVERS_JSON complete {"iceServers":[...]} override +// --------------------------------------------------------------------------- +function iceConfig() { + if (process.env.ICE_SERVERS_JSON) { + try { + const parsed = JSON.parse(process.env.ICE_SERVERS_JSON); + if (Array.isArray(parsed.iceServers)) return parsed; + console.error('ICE_SERVERS_JSON missing iceServers array, falling back to env vars'); + } catch (err) { + console.error('ICE_SERVERS_JSON invalid JSON:', err.message); + } + } + const urls = (s) => (s || '').split(',').map((x) => x.trim()).filter(Boolean); + const iceServers = urls(process.env.STUN_URLS || 'stun:stun.l.google.com:19302,stun:stun1.l.google.com:19302') + .map((u) => ({ urls: u })); + const turnUrls = urls(process.env.TURN_URLS); + if (turnUrls.length) { + iceServers.push({ + urls: turnUrls, + username: process.env.TURN_USERNAME || '', + credential: process.env.TURN_CREDENTIAL || process.env.TURN_PASSWORD || '', + }); + } + return { iceServers }; +} + +// --------------------------------------------------------------------------- +// Static files +// --------------------------------------------------------------------------- +const MIME = { + '.html': 'text/html; charset=utf-8', + '.js': 'text/javascript; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.json': 'application/json', + '.svg': 'image/svg+xml', + '.png': 'image/png', + '.ico': 'image/x-icon', +}; + +function serveStatic(req, res) { + const urlPath = decodeURIComponent(new URL(req.url, 'http://x').pathname); + let rel = urlPath === '/' ? '/index.html' : urlPath; + const file = path.normalize(path.join(PUBLIC_DIR, rel)); + if (!file.startsWith(PUBLIC_DIR)) { + res.writeHead(403).end('forbidden'); + return; + } + fs.readFile(file, (err, data) => { + if (err) { + res.writeHead(404, { 'Content-Type': 'text/plain' }).end('not found'); + return; + } + res.writeHead(200, { 'Content-Type': MIME[path.extname(file)] || 'application/octet-stream', 'Cache-Control': 'no-cache' }); + res.end(data); + }); +} + +const server = http.createServer((req, res) => { + if (req.url.startsWith('/api/ice')) { + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify(iceConfig())); + return; + } + serveStatic(req, res); +}); + +// --------------------------------------------------------------------------- +// Signaling +// client -> server: {type: offer|answer|candidate, to} {type: pos|state} +// server -> client: {type: hello, id, peers} {type: joined|left, ...} +// relayed messages get "from" stamped +// --------------------------------------------------------------------------- +const rooms = new Map(); // roomId -> Map(peerId -> client) + +const wss = new WebSocketServer({ server, path: '/ws' }); + +function roomPeers(roomId) { + let room = rooms.get(roomId); + if (!room) { + room = new Map(); + rooms.set(roomId, room); + } + return room; +} + +function broadcast(room, msg, exceptId) { + const data = JSON.stringify(msg); + for (const [id, client] of room) { + if (id !== exceptId && client.socket.readyState === 1) client.socket.send(data); + } +} + +wss.on('connection', (socket, req) => { + const q = new URL(req.url, 'http://x').searchParams; + const roomId = (q.get('room') || 'general').slice(0, 64); + const name = (q.get('name') || 'anon').slice(0, 32); + const id = crypto.randomBytes(4).toString('hex'); + const room = roomPeers(roomId); + const client = { socket, id, name, x: 50, y: 50, state: { muted: false, deafened: false, sharing: false } }; + room.set(id, client); + + const send = (msg) => { + if (socket.readyState === 1) socket.send(JSON.stringify(msg)); + }; + + send({ type: 'hello', id, room: roomId, peers: [...room.values()].filter((p) => p.id !== id).map(snapshot) }); + broadcast(room, { type: 'joined', peer: snapshot(client) }, id); + console.log(`[signaling] ${name} (${id}) joined #${roomId} — ${room.size} in room`); + + socket.on('message', (raw) => { + let msg; + try { + msg = JSON.parse(raw.toString()); + } catch { + return; + } + if (!msg || typeof msg.type !== 'string') return; + + switch (msg.type) { + case 'pos': { + const x = Number(msg.x), y = Number(msg.y); + if (Number.isFinite(x) && Number.isFinite(y)) { + client.x = Math.min(100, Math.max(0, x)); + client.y = Math.min(100, Math.max(0, y)); + broadcast(room, { type: 'pos', from: id, x: client.x, y: client.y }, id); + } + break; + } + case 'state': { + client.state = { + muted: !!msg.state?.muted, + deafened: !!msg.state?.deafened, + sharing: !!msg.state?.sharing, + }; + broadcast(room, { type: 'state', from: id, state: client.state }, id); + break; + } + case 'offer': + case 'answer': + case 'candidate': { + if (!msg.to || !room.has(msg.to)) return; + const target = room.get(msg.to); + if (target.socket.readyState === 1) { + const { to: _to, ...rest } = msg; + target.socket.send(JSON.stringify({ ...rest, from: id })); + } + break; + } + default: + break; // ignore unknown types — forward compat + } + }); + + socket.on('close', () => { + room.delete(id); + if (room.size === 0) rooms.delete(roomId); + else broadcast(room, { type: 'left', id }); + console.log(`[signaling] ${name} (${id}) left #${roomId} — ${room.size} in room`); + }); +}); + +function snapshot(c) { + return { id: c.id, name: c.name, x: c.x, y: c.y, state: c.state }; +} + +// heartbeat: drop dead sockets +const interval = setInterval(() => { + for (const room of rooms.values()) { + for (const [, client] of room) { + if (client.socket.readyState === 1) { + client.socket.ping(); + } + } + } +}, 30000); +wss.on('close', () => clearInterval(interval)); + +server.listen(PORT, HOST, () => { + const ice = iceConfig(); + console.log(`voice-poc listening on http://${HOST}:${PORT}`); + console.log(`ICE servers: ${JSON.stringify(ice.iceServers)}`); +});