From 7eb002a43746eb0ee43550441daa754d42d152d5 Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Wed, 1 Apr 2026 15:51:20 +1100 Subject: [PATCH] Add nginx visualization --- core/settings.py | 1 + core/urls.py | 1 + data/db.sqlite3 | Bin 811008 -> 1118208 bytes justfile | 24 +- nginxmon/__init__.py | 0 nginxmon/admin.py | 39 ++ nginxmon/apps.py | 26 ++ nginxmon/detector.py | 86 ++++ nginxmon/fetcher.py | 181 ++++++++ nginxmon/forms.py | 47 ++ nginxmon/geo.py | 100 +++++ nginxmon/management/__init__.py | 0 nginxmon/management/commands/__init__.py | 0 .../management/commands/nginxmon_ingest.py | 58 +++ .../management/commands/nginxmon_stern.py | 145 ++++++ nginxmon/migrations/0001_initial.py | 116 +++++ nginxmon/migrations/0002_covering_index.py | 17 + nginxmon/migrations/__init__.py | 0 nginxmon/models.py | 169 +++++++ nginxmon/notifications.py | 52 +++ nginxmon/parser.py | 83 ++++ nginxmon/tasks.py | 56 +++ nginxmon/templates/nginxmon/_alerts.html | 50 +++ nginxmon/templates/nginxmon/_live_logs.html | 29 ++ nginxmon/templates/nginxmon/dashboard.html | 416 ++++++++++++++++++ .../nginxmon/profile_confirm_delete.html | 28 ++ nginxmon/templates/nginxmon/profile_form.html | 36 ++ nginxmon/templates/nginxmon/settings.html | 103 +++++ nginxmon/urls.py | 29 ++ nginxmon/views.py | 384 ++++++++++++++++ tailwind.config.js | 2 + templates/base.html | 12 + 32 files changed, 2287 insertions(+), 3 deletions(-) create mode 100644 nginxmon/__init__.py create mode 100644 nginxmon/admin.py create mode 100644 nginxmon/apps.py create mode 100644 nginxmon/detector.py create mode 100644 nginxmon/fetcher.py create mode 100644 nginxmon/forms.py create mode 100644 nginxmon/geo.py create mode 100644 nginxmon/management/__init__.py create mode 100644 nginxmon/management/commands/__init__.py create mode 100644 nginxmon/management/commands/nginxmon_ingest.py create mode 100644 nginxmon/management/commands/nginxmon_stern.py create mode 100644 nginxmon/migrations/0001_initial.py create mode 100644 nginxmon/migrations/0002_covering_index.py create mode 100644 nginxmon/migrations/__init__.py create mode 100644 nginxmon/models.py create mode 100644 nginxmon/notifications.py create mode 100644 nginxmon/parser.py create mode 100644 nginxmon/tasks.py create mode 100644 nginxmon/templates/nginxmon/_alerts.html create mode 100644 nginxmon/templates/nginxmon/_live_logs.html create mode 100644 nginxmon/templates/nginxmon/dashboard.html create mode 100644 nginxmon/templates/nginxmon/profile_confirm_delete.html create mode 100644 nginxmon/templates/nginxmon/profile_form.html create mode 100644 nginxmon/templates/nginxmon/settings.html create mode 100644 nginxmon/urls.py create mode 100644 nginxmon/views.py diff --git a/core/settings.py b/core/settings.py index c837795..e253962 100644 --- a/core/settings.py +++ b/core/settings.py @@ -21,6 +21,7 @@ INSTALLED_APPS = [ 'simplemde', 'markdown', # 只需要基本的markdown包 'netscan', + 'nginxmon', ] ROOT_URLCONF = 'core.urls' diff --git a/core/urls.py b/core/urls.py index 762c147..b09f086 100644 --- a/core/urls.py +++ b/core/urls.py @@ -48,6 +48,7 @@ urlpatterns = [ # Include netscan and files BEFORE links.urls to prevent the alias catch-all from intercepting them path('ui/netscan/', include('netscan.urls')), + path('ui/nginxmon/', include('nginxmon.urls')), path('ui/files/', include('links.file_urls')), # Import external image by URL — /import/images/ (also plural alias) diff --git a/data/db.sqlite3 b/data/db.sqlite3 index 0471407b3690e8d8e02c5af6273219ec39dc485c..4cf1b0daae955c7b875a5e868a7452a8c0f01f85 100644 GIT binary patch literal 1118208 zcmeFa34C0~c_-M7ZlKWs`aObIlOicRf}%)>?8ZC$07a2a5~LuK;021JWxD;k`vGXN zFZDqXR+I#gY_FZzj_oLiwTUO5B$F9C+1TDmGP%6Yv2o&Lb2^z^>y7i9WOF#q<-`*w z+5K0&voErx$P+nJv|Nq%>Z`B5`qx)q9j~gsYgaB5n})Dlt(Wztp!l}<{C?j_LGby) zFZg`^NuTr2pTwU*=Mj;fzx(_N9`U!-h7mi$f0odEn*TEYcl=-Rf5!he{wAh_! zS~xsS1uGV&j|$UNJjgRWvoSXrims&n8@gKpGqz^b%f&{cSgka&?%$*kDK)R<)3QM& z>muH2mBK527f~OM9^t!^kRr6n0pX8q2}N%~_>1=v-sA+ibCN9PbIa-8a!(E90Rsw603tBb$NC29;`KgTg+< zp=yq_RgH%vU#&EaN;BJBuNg$8w!yx8nA_%p4ohAA{5PJ z{4XAB>ba8HPHF3>fh$DAwJn`75vveOnNt_$z4oM&kiZH{i;r#qfA#;7{(!wHGUYuWCf~b^9&s10E&(2?+Upzg3&6BB>$Bb}>#9pN$ zEi5i9Eo3fSxM{tdKhvdz-79mlmR!iPk@|KtYm%k#q?5(~Vxhxm! z$fiG~Eyz77jIv%Vxj7{@Hz%Ygf;RQ#Gu2|n07PBIpOMB! zqVrRJA2o-KXG<8aWl>R}$M}Z)Wesp7=g;xY#nDhSo%X+&bnDmDCAW2%4WsLAxJS)* z5xpukFuAIdAb0;^pIQ{DPJql8AH z=l0)IElk8sy`X=OVi-;S@7sK6I21i{#Q(zAx#e+Dq=j-HM|zaZjeQM@r+JEp>g*g6 z+`B>x&*+tvYFp=RiFE(Y$?2b6%OrYanb~+e7>ZUE|HgB)vGvF*tJiATlAbe4*)m2V zrED^hD<}meM~5Lj5)4~lw$CVf5Z;@!IST2KjFjDxiA*f0SQu8V1VT|o@o%yBL z4IV|xnT?zNP;_?Izo~n%D;HPldXr4XEL_|dLv4JgyW(FJYQV+qcVw--<7u}SZY$er018;qi@a2oKc|L@y%Pv4_mf{rr~^`c7hQzMuO|?i;yNk$;N(SY$1tPWmD*@wbj&9)ED`566CR?AqAw@E?S~H(Us7qyI4aU8A|tSm;+m?+%>{`9?lD zvN3XEBs~17;kOMx68!7nPX=EIo(XOV{CMC-VDHdx4}EB8$Iu)7zu{l=Z}ok~_gy60 z`}~uS5Bv5U%v6kKBd=FPQIxX9O0ikgOR^{@Vxkh0B|+5Yq{N)8#Z@UKDXC+R4*R0V zGNoeWc0&}ERJLxEt9LN1sWtDI?X+PgmSR#;kd-+_nvSUJi z!MLTeVqlDtHUBc_N$oLZqp73+*0Xx0fNbi9HxqeIOU-FgJgtZ+S$TR65^n8{mT!En)4A}wYXQB2O^KRFp!WkpLSuZobb z=*TC68Lk^8y-Qrbtj!lt%;|QCd$Ob5DQVkSil0?Ta!RgipeT5SPCpcIu6cB zRXI5W-t!J`#fHGkjZAY)BuoypphzRYOB$<)5*sUfmYU!*dfKJ29MwZ2tHb33QCXqD<14h=kTWmCo6__1I zqTXyIF_BK5+z&R69!OdiiOB5GO>A~w?d1{CBA^FKQb~zV3*g{%EE23GsR>Vdqh7DV zE_A%5GjJUyqg-p+%*C`I69qwwi>DHzh@N!{%#S#ArFbljlgR8$lGLK0FH#c6A4DRz zg5<8ey%i*)X+WzLqL*?Csx9BxhvW?>PsvPfmZEGl8l)h!G_(kHqgh|i>dme;M;J?U zw4aNoVCd3ndM_9|)?Knym-1>Bn%2!v*?eKb80d!%4o0Y7=}&JDO)DdG?MM) zq$?Crgd}={lMjI0sZ}v$H4X& zv==cArE%BN5~S1w^hxM8l~i0wqsCHC??g&R1x3{y+n5Q-;Llc+dq9jVGM0z`tI2A3*rT{b@ z`ifS?EQ*^Hg8+;LB~3}n;x;5b=;Y=dda5xe1+{2#H3{HUW$UnS-@!}+nn|Vx9phC` zBC~7J5^7pWK0Z0@+i@d9=G_?I+P0h6YYegMMXPLCznd)?l@-gJIoaEsP-}^kTfpg@ z%}L6(YIJp}Rb&Cnw zhp9WXK(v_-!bp}O&)EnVU9%b4Er&89!61CZbRv;DKLI|sY(7a#pgYhy;8U$b^Ds1R zGb%kHQq!m~IWrDs3pO({I)1iQtQ+-Lvz~a2k!fsqH zKy)!QTWOU{qtL}e(-PvzFnHK?jb`Qn*}(=wklqDJDrgy}N5R3aYY{_a+Qg|8be;1) zDyJq?QA#`>0ux(#(Yj0~?g9~AalIcWO-`iKkBou1S`nK?A1h)uV+EtZbaHkGm>#s%0i!KsxNC zqJK2-g$N7N4dHxX-cQ!#8rj>G>RQPttQh#RU0ZEb^cq<~5A0Y7NMVzrf!#-T!e}a> z_^t1h`+Rb zE)cU`y36FJxC?>(o-%CVX5D9qe>SS3@FpfCbQV;1^YOs`AvePJ9a|%T8H>_ht6bU^ zM7cV)+1!nU1N%qmOS;-NF&3CIAIX9Yl!mwJfUHn|9rBC@AVQBl8T+;k1!ALC1YL9> zYZg2Ffmxf{-Kp@z7$5WPi>&+jzu-U3{|^5X{J-Oi+*AB0_ZQrMZ;pICvL5+${u}P6&MclGzz|>vFa#I^3;~7!Lx3T`5MT)W zPmaI?!F`9Ed3@W1eBXn?eY5RRdda9atx4?Oso*}TJsRr-MeJh02lD0O%AQ@peFvQQ z<|^4iM$k7N0!F~IkICte>mk^Am&Dm@3#ewL~VDz9#;9VQoxjh)Q z=Feo}-Kv$UdSOR2xCfG%JGngz2HUp<_w4b$#}s~BC#_Zbt&w1Ko0%V`@RPfOQEPHd zw<|hZPPgm`Mh}=|o_&n`?qJkfndn$<;P_xPYSELuixF3TcTr#hDm&uyalz;gla#D( zjC&rDa4Z^(9x`Lw)&;^_gVBBFdwUgN)J;i9L)(M<_W13ML)P!e-r&Ile(#P5&)>t5 z;Eo-18G)=21i9djD1D;K2Z3$D9sB8{yA@+-5<-OOl7PL7!L$FrjQ#&PevY5u{%`Jo z=e~ujbBkP@+Zy@H$p01j!N^-9OOXQ;e>d?P6Cas)apKJrXC|g6eB+-R|B3PUjjxQK z9N#kbJ7eEHRv&wEOdZ=A{@d^`hQBjh3!e=?IQo~PKQ;Poqi-2~a#SAO8v1PLdqd?= zDij&{y^#-(eC^1^k)6Yz9sbDh`-bboSBDeB4+Osy{LSEx1m6{WWAI4ep98-e_*mc_ zfkGf17#;epq5m|rF?4n4fd5PWPy4^kZ}=0wzkTI)E*6P!GML?`@ z-d+$B&XE-{;hME17JDN&%%*qVDPjf6tM?=!c_~~Yw<=t-me{1HL9QI%i336g+0E%$ zL?a2z*BwdTU?#Cn8+0ZyU$-YYauZ2n$(^KFo%EzIZ6eJ)1>z&x4q5`Yi8}J1MXMFA z(`FmH0n*v@4omuWVoP=}`I9EOC3!o!CAWwC&~=c{C_9MM?X*N@58;s|5XO?*P0aJo za-$D;S~$O_`{-cq;;+KOPl zp25K>=pXOM?^3(Mo9`5yZSrd;I8*ZW^Dd6`3*^0U+8LE3ajwdrKF!%B=uT#pqAOv- zOlX&+JE2vY&V-VNgvxP_mZ&=wDOG2Z2XWpC`Wtae)?S`z9IWymj77YKAQWEFr*U$M z(0Jt~G+rt9N}!oK6mdi&1dc$5akj~SM46ycxI-{U6!+CpoLKVDCMPU;+z5|Q?#rV% zt3;?R$=nE!c<#%GaWu(4BTWz)-M6-&?wi9nhXiR&Yvdlka->~!PGlX$=_BNCTc&ne z3qlVy&KwbHOWJm73rv^#VVoj@wA5m?lM+~6y1h6n1mwpkw&ZJ)Bj;tJuZIwO;K-PT zryXy}Mk#RUhfr8j*%X#MgyI1l>VfSXBe>boL?Cvg0;$1q4P&~pMN6@;)Wy@UQB&fEA8 zNu#th_Q>8T2z?>2gfhDUq z!3@rSpvs4dz#Y^?XfNqr9PmJG2C3v^+UJN&9t0fTK*@uasCK+1Bc;H}3_@YaW>Z)~ zk;eycoiOcEHNtp|AunX>jy`&{z^U zG?obTc`uGOpp*e3gF`@spbv*}YysAGh)UtkZXHqFS4TsjoJ|f{^0*P6nsZ+s#rXq5 zZAs=v5Nb<2_vOPlV*qU&A~L#f2`LfOee)0w5QGm&R9Jh~?TCsO0zH^;7-s~+M>I=N zFP(**ONp}qptOYaQd%N9l+!pA5I#6d1oV;-@dynj&beD-2=5MG^YLH6*Z-g8KgNFt z|5m=t-{8;jD!-rK!uz=|aKF#}68FP66Yy59!o86@$I09jwDCBzxzPYule^`CcZ6d&5W{adRx?;XwX0F-$#si+xynupg-;3>t^HqM$mjP=s)h? z>&?m=-7urQ*?FVudxHL?f3K6JH}2VeLH{xT9yi;zZx6Mpp#Ow_k2l}8_^KK2&A2VT zLJPIW$+<1Eyff&J`5&NJdp>KFDBcfPd3qvln-NxKo``351pP<+50G3uZ;QKwe#O7r zEt&IiWR>Ev+gmCpZpDoAmdJ@)rULACO5;QrRDfMHEB9MVf!6dcD;xKH-h6Lm;l9sp z5Bg{Py9j&trM^GtKkbiF*1gxZ-+UnGKj)8H+4QE#nlx6Hy=mSg1pOKRJr>b#QMtR< z$lpkT?zI^Hv>9V%>s`Zs1Fie6rR|#($j(LVr)b9A>(w{R_ZEA1vH3{~WXB5hb(&+> zYV#7U(;n-}*USi8_Pnz`eU-}CxlVj#YtVnt-?k)tnTpY|0DQ@O>0ygy+r`PC|A61S zuzQh8+qI5+feO`Q#rC`z;bCj7t3E-c?OcIf;Di1tzq{D_I2FKN#2~Aq=gc=2L-OV< z7xeG*JIkl@^wC){J+md~-|zP>lA13p23Yt!6$$$H`0ZuT3{{O@OP?oc3+%nZdBTjd zn6@uTK1Lzvu~vDUV%fDO`6#9DvHEz-jPPb+t`W{rEIU^d)6~}YTsTZo^Ves2Flk2G z*|aa_B`7?-miaV_t7kP&rJC2ae5aVNysTwftZwvYl`P-L~1PV;&n$eW` z)?#ii`#eaiux%x1A1%DQ?z5K`)w|NO$9&_F^8s3TXC-Gh<=VD*vy0-~u~ri`Us{Z; zMV6hEyLT042W?qht1jCq#68wmwwV!jQQdW#trUaK^^!?iV0UR`3l+e-7{Z%xEQVx7 zgQEp@7CR!ewRqMyCMW`J3mW6*D~kzTkr<;nyUP_}DqrUU#VD=&?!}0Z`QBpat{jX| zR67vFa#I^41w1V0_6L@HUAI2exzcOFa#I^3;~7!Lx3T` z5MT%}1Q-Gg0fqoWfFbZ&BEY`?zm{k+UJL<-07HNwzz|>vFa#I^3;~7!Lx3T`5O{qe zz~=w2&w61}F$5R_3;~7!Lx3T`5MT%}1Q-Gg0fqoW;I%}+v;Uv|`C9U3ychxu0fqoW zfFZyTU)bDKKgWHN`!Vi6bN?InAGv?eeFyig+5a*A4Ir7EG7b1TW`NPQXM}8~vtC3Gfem3%n$bX4^Jo5dK{}B1E$jgzJ zBJYX3Bl1Gz`N&%2*~smP5y?hwMy^FJM$Sbtkz*(@`^OMq2rvW~0t^9$07HNwzz|>v zFa!ocU^w9S@4HLGH5%TbVT*)&n>1|Duuj8gNw}v*!zv9cG%S2! zm4+)cT&AHx!d(R#=4qItp-#f+n`xM(;hSi9i-bGhNW-UT_y!u@B;k&yXn2E$Ptx!@ z3AZoN@EQ%T((noiw_T>;B^oZ$@FEGfUZCN58a_e81rm-wPQ!CFJWIoQ5>B3>;b|J4 zqG5)FTTasO1Pvdf;c*i3kJ9iM4d-Z>CLx!iVUmUk8fqkrs5De)DAQ0P;e<%TSsKP^ z7$f2MQ5qhh;UhGhA>r6z8XltI!!$fd!tg^hJV3)~8ty0Is6fLh8a_zFeIyL+rQseL zK0w3WBplgA!zc}R(r^a}hqu#k8x6P8aFT?ve03w> zx&QC0yC6(@h5$o=A;1t|2rvW~0t^9$07HNwzz|>vFa-J{z~=vbp&ht07HNwzz|>vFa#I^3;~7!Lx3T`5MT)O zMS#u!`$EGa7y=9dh5$o=A;1t|2rvW~0t^9$07HNw@NWhIHvj)OQ1Ya8e`|yd; z`SC{spYs2lf3NQyzF+Yj?_jgBWm_nEDdyjhij{(KS8p{}v#o|v&#u&~ty;tUyI9C3 zbV)V}saz+)_S0AAGfVTr!s40v&=>uWb+BiT10(Rl*X{{LV=@2RXPbJiWE7s!D=XEk zUMLqU*-~|-^Z7vw_@&IL3-iKsXY{mic)D1a7K)Xov0~JP#Y;=V;`Iv`gv(bKE@rOY z6wc4z6f)PBE-fsA(Z%`2rK7@hHTR5>Z)Qolrg67P6S%MIMy)sWh|A^_oG&bc#occ6I*j{MGrz)AQFHJiG}kNM?jHgzhTEZDDa? zX(4mr!cFVt{2Amz^}i>0-W;5kFfd=M$jxFIMJwn{gZ$+nGqdqTG!(67{2R}9G({>; z&8U})jRr7oWZl03LRMPN<+Nov?+9czT9>HtfTxi@g{pEI`GB0Kg-eU~N=6WHvm+HV zvvFc;D0&-qrO{EC4!c4hNh#8*qKSDipKVo&&$<$t6uM&oSMEDw^7sAS^J&O z6P7%d>FbQP+T$xTeYOg8r}~$*d8d#AFs8JY^!Kq+Gvg2YE=Q-P{BJwZ4w(bSSRau3 zptG^IV>G%E&iFTHU5%ljblC_Cst!e!R6UVPC~`;p?M%JP602WJ?xc4HAa0|hHqV=z zN6~2VP9CJl^c@Tnns^&0wDWD-L(wa+R9Z*DX>~Nrfe^J&Nli;@s_H;&jgfZtXdX1X zehfP0HR*_y^e<{ZHy1}k(RAAXV$!W&Gu9QqK_%&W8}3o_T||A<;NIf{N4(conY-#_ z0QN2lR!Q#HU@#8b8Qs6%zj50O=tgR1D4Iu~d$XhRJ9Ws>Lp`k-dO`9GggZ%h_tS?? z!Y-bjiqVCsYq zvaoc#yItICG*3Bw1%|P0wbo;X(bZwP39NG5udQAl8i^h`;=f6OZ9H2lHjQkM#vCg2rvW~0t^9$07HNwzz|>vFa#I^ z41up&1R{a3Z*u64FZh2B-QiWP7|BfB9{-tfaqP?C#qgfd+~~p3yGLFg*%J5^{onJi zZ9zA-ocC@Zz*pbfjcg-dH;hVSwc5s5SZ_kMl{miSg&$m-1=t3Tk_s*yFJ{_!?0Law+%zR5dV0lW)!W~mA3 zfNOLcTlRVDy>tJ8v$mbr5~`8Y6P*Nm+v~kEx+}d|@10~sSbLpwX82j(C!&hte=+8% zcTzBOTLCsvn5Arc^+>PUZ=<-U0xT?!L~kYiKDyp*Ek9zxw@RP0W`4yoV9i%cC2X!B zdnBZuuj3ofT?|E&N&gEwJmPnx?V0jGuOf6Lv#XRkcP9t2CwVoOH&RBflW@;{^r|19{`%FC zVtNJ!^n=msihtuc71gX05;}TDE1pQ1lnup5iE0m;Bkh9rpy=Y_wS8^*k=i9MkR?87 zjwVCV^E3X98IO3dyZPH_0S?c+SWt7z^0Jw)9X;JkC_Az%tydnKs9ls=A{3pO@xQRg zqtZ5Id(QiNDX~pzYp=82$I?2l@^u#1G$lHq>eE;hDHq3AWBpZ4l; z13Q{X(>LzcighDP40cx6@(DSSP%I6$NQCwpXpiifzD;v2E<{*QUehzj#F6NwnSOSv zBNwUtd3+-=ORI775Us}c*!HK6Z3pdhrBGj&^PRduMqcy$JSgY3YUB?~|NOHeyOT(w$qI(ITIz}t3nE@@tz%`F&q7Wbe8iBZ;z zC09sUQ`>|jf;9EzI82L(|x=b);>-miyVX ztMikW)nvj@%}od{9cPJcjiqUM+}OTcOaszEO-kC;^KD$)ABwIY@o)0fxOF7y${=4Y z7^Lu7QPOitQq$c}`>t3cme4(R1i3^5vL3i3&@NjzY(G0Fgvj^i7yYh6xLJ1;a=3?T zxWunYKRRLV{><+ksaq!1o5;%bK3$Wy%&xiV7~!?+s_gwnJ+txn6gH@0-1D5bYx4?{ z#b@elNzWOjY#DW5$|e)Jf>Ka&wBmb69_(59JqYj3xvdNI3Pg}`WFnits8|>yEj$<^ zQ-#g6w@34)>>FzmtECU*#|J8D8e2e2Duz_gmagazDs@8}}kt;%;y!xhXCb z`LoEcMLrgJKa#S43;~7!Lx3T`5MT%}1Q-Gg0fqoWfFW=X1a|KW`t}{Fz%$3)adjicx?C(75AH#<)D{g6#b&jR8|asdE71oKf547!t`f&e zH2nj+5iw&&&|f{Dhldn62-&#{ar^DKVr|8!=JoulF%=E^qG{@E=XRyKRx%1J2Hf7) zRvQ()MqIS**a?Dzl%P>;8g?1B?ZE5(^fi&WRV!8X!p`kM-<|^%quI#o74rXOxB@_l zw{FAxJ)ZaVR%Peb4qB`96O&-PjWTZPE72`@nxRi{EOp0qleL{k!~r*ARj*Wx(k>2f zkC<=U-D+_W#6;bgZ4-Dl<#*lDp*lx=zQ{PDc2LqxsUMFwKI&zLo}8Ij#H<} zQM}(r-`jqPA|WRwdB1H0Rj|kMSkth6_Y4Pp2M<`T1)A$MxX`LrnntBb{+R4FvzH73h5$o=A;1t|2rvW~0t^9$07HNwzz|>veDxzh_WxfSKH}p) z%l{<*9sJkuPxEv9ZthDs^Z!HKOI(w?#>w1d;7eR%AhW5uz@#}17RhyO7A$?ylm z&xhX_J{I0R`uC%s8U6U^`$nG~y*xTQ%7s23`o++PL+=a~L+3&VL&1^Hjr<=Y9~}AG zkvERajqDo!yW!s${@Cz04OfRRLQM9LA;1t|2>fdxAS?xanITz}6ERVWNohe6=M)M5 z#nrSdC1u}B!nHPvq#!GET5?WK$Hj!4mPOyoQ&&OZcX&_=5Xs57DyPzNG9X;(WFgO~ z;+(9-laiWNHQ&p^9HP+aOk0YT+>QcFmR1d7FO3R#M2{}{|6z44pEhZ*niYQ1ZsW_*m9~qK(kV!Bt~Z4im(@g4 zPWoP&I@_Iz3fR+eS<+B*0b$0s7Eh!TX_BE3B=@_ltLzAN=gK#G8TavlVl1f&{n`CE~iyhRsvHe zT>>d4tAePa(&uCdA*YgJIx}^m2Z1=J$?;TDO{gGvtS5n}5HwXq$xI#ZCXkb;vv>kP zrBGpy_8`#altf%grBqSQOdab<0M(O|DOFZ8Q*)gJ%AA@c+Dn9lP6%lbkah?h%wmE- zCWvtw1~_Cez94)R7(pXlH03Vj?AK)u~5%5WuXd z@uUpRQL4fW2pq*gg^(r&0x>S8Q<|3aeVcH&Ck3iZQ`4HPf#OgP3fNyYuE~kCBm&Nd zyD3BpMVgrKwC`J|4uZl97KA`chB1I$Ov!R^>Y*M433L_llp<;(N^+n_9#lP(8Z3?m zDW+WtF(##`^1&Xc@suW~WTN8xds4u3s>wt;C4oZdq(GfRffF#U2}L5dbE+o=>Ldxk zl28oc!5$Q_T2Roml$2!OH&5ZDyNw1UO$s79nk4D3V8GK!DKLfe?k<6tBGy$>35zs3 z5?LIX!io2G0yIU`i5!>I1WaRK3P;{O1ezeG=TulfHpcz62m@O5S zO&$?&&fQiWF$Rl)`hw9BwYVszlIZTZGKvY66lr*Qtgi$Ecnz{00R`ScVH!gmp%38<(t1qOC(3a8@R2vATBN{${C+MCkG zrf@vI2LZBB(8s7+Z3-vmy9l5+DHts@Q(%dc^PL1ris+`CK&2;#r*MeAivW#Xj;B+^ zbOxqymfj)|(=jnkDjcIA)Tb&-sIR~j4%fF6sH7CI@Tw|erEGycvn5s?TJbo7e>LQISFjP~6Q#hU9MgXWW z+SAhL>BM9*JvxQ+`ke&C+9;?CQBBCBQ#iZdNdP9W%qdxt6RF`ToZoLJNReV9i7C;r{|5biJ|0nz(^8bbZ4}6us#s5D4 zTl`D>d-xZ)Z{fa)dnaxN{95iVSLafk%)f*GS^g0B|8f7F`y1RH_{aRG`Im8j;E!-0 z<-dmeU-=ep7F^&@@yB?T`+vCq#Ql5jCU=#a=N{u8;`VVnBcJDE`~&vFa#I^3;~9~S0Mr;fg!)|r6v0F z^0ncB-ygVYK3p+>E}K7>=+8@w=Fdg*=K}rtz zVV?fY(J(^aOwhl_Nmv~tVJ%F;;3x@4Lo^&A;qWjGgCqmusk#82Om5kutu`g7Yg(A5| zzhUozGBFU7@FI)z0SBn(N%)(=rvwdQKEUg*d`#%J=lh7a{hCxqC^fUSerhLBX= zJT!7~H!?_xs%|8W<)nhI_61SaWj!aSlbSALXJ0|r8wPIe@5ljr|FCUCRk5W4yF<)9 zWD+f$6QhaAtlum`V!2=>3P#?*PASz$$$Bc0SVqc}p(c%#VXPXZQni~6FhT+pqbmbD zW*8bBeC-@L}J(0-p%Hap+4!FAqKB|A_y(@1OpK&7+bT^XS?2`*LztJ5&U+fwEjts7E-LYrVS6+DgbEwvcZ)z0&9wu#WMkT&hyj`pr zg`ys>)>mf9)9l$|u3CX3jbgT8JlirVdBb@l*l&cGaKlb{wq7l}Pe+C3sv#`b4MRZE z^?a#H*)O)rIiubXs=20KtQZ9$w=U=f;w*#GH`l5{t!~^YR$HK{7>%>lI*ow836c=J z8b&!+GLAw7k382b35CNp!AyLiB9wIqfuNXgPa{v>-JRGA`J~YOd-{L9ZJ^O|LiY1l_q(65@BHg52F`GfRky z>V)f)(z;MED%GY@I9rJe7xl`zuvUjJ62O-;;9$iR%r5y_vAHUUf?g>I(osP#HCL;x zl~tipEgJ&ymQh8rMw5tDY@%LJSCUEmv~=rf`4&k>X%FiSp-?Ocj#x8ZYB?@kBTPuq z!6Y7!+f7hZ$!;bM>a1Z`7xsZ-U%0h{6njjugOqFwj!P2u@F^%?tz@8J&pp3+a`#r> zhX3{^u{WKHStwHDtk>7$dDMTs2rn&ELEVU1qq0&eHdbdFH8>kFu3bhmnHRoBm^WVw zWkatJVPnE+n}cx1VQY~W40voQl73)Lkm7uuR)lpTRk?=tCO{p_2HegF z@Jvz=5S?okOH>hnOnW*4HPwgZVzU9#W)*l>p+WV}ef{^wg$rn^(9mk#XoHY!BPZrS zO=734=FSC252YxvnfHmUHYV|FvdX-p-Q{+wkzyaYD zkz2TCG+Q-KCfL!2{e`gKu-+neHG681?8YOzFkG;tLId=9yKe~ zg(qS9s`a7{dq@D!tQgjhunN0R#4njVO7N3a5-KD)sUcevTn=&Js-YKzMf9#1CX~#a zXupzaH2_(us2>$>RO_%ZM2MrXI1MOgqhV5#YHOFWK?H-f^0pZ4mZrxz64?6PtVme3vJXh9>r3E_PzgAqSz*1kspoJLbGY09T z%w-T+C?>-LT5;e%M|Xwu~`uXUa^b)ICS(H9iE{lso!o~ zt{3m<`Sm5EUT(k)Qx9oYyzOiZT!>ZZzG41SSQ6@F4m#Y zL|I5{#|VX_B{L_Ca7y+7tLSnesXq7h-;NPjsamBi0JL#|j!oeh%z$3Pkkl|BB=&?< zGVR*Qunj3uGcD+=akqw9At4}++=#6q<4tdANMpe;3Npln8wQMD&7kQi{hG~<3~Du2d-2hsLa8y8=^2w$aRS5({k{owwRU-_*DsT|)L;@TfESjDIA`&DwDuS=74{=QZeVPb zZ?;fKv;ycK#+PU?0FI6$t9Q7Sw-TYJol z0-33r6K){XrkYMn0%r%39(*<)8Q(qN#ELy z&3=X|59Ne6yJFt%^`ZMQ()?%j7PUFCy3uHrnlL@|ku)vxh$5Xv(hDT1;FzTwMhSV- zUX&p2Qmh%qZOk+*o+u$1}>>opbA;1t|2rvX*j|j|f3;7Nn%na?H&10s8mETo; zRrmgl;fHyZ1Fm5}2TAWxK*xz=)4rEm^-|V!-aEhb6|uotNgQ@parXeZXu-o~@|Cf{ z`BR(&Or&Joq~K+<<(09)tOb`T;B={|wz1(~DI0v!!Icc)<7IP>3;7Nm@<80IVnl3X zOdr}oCYMa$&@GNhV-WI^i_W>oD`i9%P*b=NfSf}1Fq(MfjPSvToY+^|B^rN)jBsQb zvy@aChpW?V5{(VQhF1rY*^vibprQFZ|HhVxcAv*EdIf6%S!=d?Tr%I6^a^H%E5>nr3#gi} z$dX|egKxYvUo`Y(I65bw92YGTvS@I;Q6$Ut4hFACs)xNyAI5CJ;pc^g-l>3=s3maI zi-w7gZKO7rM*z!}&2&##yftbH{?!PP3H4X5;yQo^*0=~Et>LZ&FVKx)0DW!q$}0f6 zSBv>d7pAj8I?DKZ(}gb7ap4V)rYotW2laEoK};X+VR5d)z`YB&?kJH$kL5Le=K`;g z5kBVNHX>2PwH&w)!)k zcbGrh&7W=N&sOti()`(C{_ynYCC>bbm_HNd&$#(BX8wfDpP>0e_xac8S%4}%3s9wJ z0jl&YK)~GpPv-xRg~olMp9y_1^p?=|kQf^0f0zFu{=IyOKgUmV|HS=Q?&I9MxgvLl z6Cz)Z{AT2%k#CHwL{3HaO?+wM*C&2p;vEx(i4zkKjDKv8bNWMT*~ z1Q-Ggf&Xa`cqnkuf4|L;j}1a}d=R2X2O&B(2+`aiL}@~Fzm1UcAVkt2MB*Ssvx5-D z2O)|LLUeQxq9cP4Ju(Q<%pgRE2O&B%2+_lX5FH$Z=%GP~4h%vxJqXeML5PGwh^7W1 zdTpf9k#9G$^bCo6 ztR&mq2)9Df^GEy}GuT#S+%>7N*`%3m>MIQrWQ&Dtei{4OR4LIB{f5(5=Qk#rq3A_0 zi1lPZS%Cu%!K9WGN}+?pO>oF8%?k^QXXc+0raNM@ovEjVON(7p)576ti*R~oLu-Vh z2E@T;^d9B08CvDi(>dJsDaqMZrTA<|=1*CoU0+u~m+1_nnW3{k&X-QbTe&K>}`Rc;O%+;I1 z`T3hd=K9j51;Xdz{NfViumKcuMIhI76J4D@JAZY4@$~#PZ$<=j zP=9=rXj6YfR1IahkhZG9j()PI^4hU>+p!b3X@gBfN^GmZ#zd({OR_1mHS!l)QVLh1 z%5u(bi+23=dkfQF7oD{M(5HEDkXv?P!Yrt@z324FjQOWM$ip{Snm zZ(R3S%g&|)c1}l-$l>bxq^kC8O|;Ei?WKoG9*(=9aS$0>;X9gR+I9+2eVbxx3yBFcBYUZ7cNQ=iNmil2up1D`=*^%yF zxA}*2-Mt@a7Hz#>PATBK?6P9E7bp5+uSVj;+G=4Z_G*Mf)YhaY^zPozp`^V!>HQLV z4rg$6gTyq@Z{m=>DGT}-Di|C%B5e?Rx45C5@$3;~7!Lx3T`5MT%}1Q-Gg0fqoW zfFZyT_=+O1x$fWU+Y$C3I5cx`a&q(FzD#E0`YKN0hom%oJSO1w4;NyoaS2D;r8GSr z;Jg=SWwoX^8us~yr*A!dYb8VeovPg_CYwvAmy*rPmr{$(SPRz+KCWe+O|8kf%Wt^( zhU+Ey+TBX?Vs5dtl39K7rmmf;7Zz8RtF`mu)!ZAdJ}F!&SdMCQ+LwY(}{ztc$ET#Y5< zi?u76`f@QR-C1}dwsi6AlW$o&eteAkY2R_~T|WLF_`l`>f!hZ}m0DLe1@Awb!-^{<8|6gziz}N71_!|EVU*O-wKgD0;FXEg)2LAjsewLr% z5Agf=C_l-M!*8GC1CaXz?svJ*aKFs`Jogja4|5;oKFoa&_d)L4x%YGL;@$;lL`9ae zqNb&AcCuDkajt(bPlwp|M=I3mC+@w(bsz1p!PP7ril%VuBQ9UUibl-0--mq$xOD+n zsF3SrK&}yY!Q{#o+)oLIti)3)obZwxMLab_eAbeh!D&G0cDF$8j4b_s98;<4Iv{~S|UMI||^k}RdOVggQ% z<<18bq`8{VH%ArqD4RK=2D30T>7F^l;k!cJ zkfJ1LpFq{Ui^hpjp*iq+D<)@Z5BAMbK|P9XIl?V!k1{$r;+C{@JWce&y~op(g?ONa zXKvh>qCE(Yru}r4lu>HS5r<3fl_T6TCvXTWoj`N4u4u8!h}*YtC{vPg)#l8`DJ!1R4i4e(&x(7~9&Js31wBh8&q>?*tJuvD!)*B_NqQ zh{P?tz1Sm05qIC(-JiWW2>S&5-S%b=*WJ5r?ds1yH3)mCN+0%0TH1Rn+MoTsbkqTd zTyxV~dYIZh<(;Fxr+Z`XG(s_*l_d?1hX*K4Dy8+wE`_uD50-cI&(3avW_F4)NY$rQ z_ZpverGOmTRC#;<>};cEW{2C52PvJbbeI?$<`mo}3*~M7vr{blVrB<3KR|ZLG_HZ_ zS$D~FI<>#NwSRV2Cn1^HrQvk>{_Thy%M?dF~A5`&cv7b5m49mdQLmHEEesdjHfONW~f25Hu~fw50Rz=_+` z;c}#Zc5PrP7%L1=cL`kn*1L2GIibeN6aBMm15*`oy!igAg1cLto7CFdT>^uzczL{k zcF+*0w52MV0?+FMWQQR`@6u`LS)}q<-|V!uy2F+4=|QrCV)n@n_i4!GaR2PQMoh*n z1cTI_CiOF7XdelsJla1yuMxv&7jvfjgQ>zs_bwf-!&lUDsDE}|Bc@1+fxv{z``!Z* z>~u<`wem>+>}(@O#+{H%9H?|+vX6;Y#k7(r5BJZ`ZU{6x6rer$ktNBq*ArEUVxQa6F~)J@<#brX1ox(Pf(-2|SYZURqJH-V?gwRR(? z(ILuw^#XW;dI5Y)CNz&dLc- zU!e~BWa_+6qK^FH)Tv*LI{2FrNUE7B5+0`R{~n^Q01r^NfYa1P;C|{ZP@t{@r>Gmj z2dVqP2dQJhy}L--Jy873! zK3`_&z{YVO%(-*x863r6B`l3gMAKLd^S#{E8`x)AUBS)I&*2OJ9&m&2>hzp2t?LC{ zh8G&ckP6de;}xaEHX;(av{ohWs-;2}mykCNyld85xD0q2_bxfFmi1D@cz$DSmnBN3 zhbY8tjg(5^uCo53q;is;#@$$XH6eA0@;GsXGO#ess3pse4q0&Ri-?6K_>UVu#2Pe!G@5`yr4SpS*Fb%vfr#_eXb#THAZvaj`@9}Hr^aMBRBbWM39Ag(=*9dG))}uag(%XT5n1aI0S@FHF7$ z;nnkEzYbm-kB*M{Hpnf1lN&S6wRG-9f3NY?e9!f|{?B{eSdaXAU5#d6Cb$_5L40!2 z-{fZ65#RpMH_%;w|H51KJSBQX*?y%jciSwEjNuYQip-T)hs;-6M0?UG;xb3vq}Tg0 zyv zFa#I^41xb~2;9c}K9kvVWp~*8$l*COfIaSVGNF>q8{SRp)^P$Uosg1^R-SBme{OmW zezURafG;UBK0*=SpZGIDKGWUCAJX%1#@o_MWd1+y-{Rvw6#3%BXU5+U{_mqdH}d_% z&jkN0@O}O*V;>&78vZNn1sEND=cp9={?MZ%zdv$!`0t0`J-jFQvEb#vp9a1maAfF{ zL&yD}^RM~-#`nH|IZWAy$9y|7nb93S--&$nEe2iI5Yu$I1m6kZZ&jqbp|M~>Hm3B5 zNr`Z7e%`w}L-^1&8FH#*!+&tx&SArkH4t;<#ANi=9eXBy<%PFD*TXlaQHie=Zx?HD zf~wGaR8rfSU%>RH*oX`KQzSWaZI>jr=&hsohRZw9gbRYxoGQbuE4)h5@&0>92hIE6NJ1QjZ&?dKZ) zFm3ObmW=Sr3oWEV#s#}r)ZaUC`&uL3-z|5U-MI>c1b(O2D#+c9HnW7Nr0%K}c;ze@ z@EC6t&Q{`Zl3iIB)^O^Ez?U;{aUcc87T)x>DNKn7xAibw+ZKui!4Yf5OARmg@CXXm#>Am*y&8{u{dD5= z3A~_UN3NRGu!ozfv3WEFZpg4&jspe~_WCEhuFp45?q=TOt&M0n!vm+*D$Y>hOi5Ce za2}y82H?U+xR_E@ISmzoPbTQbbI(7&Yl|0r2ENreXKCGgj}lvD-RRx;v|?jp{qbQ zRMLxu81bHtLXoZtWh7a_kfNMxt01Vtk1>_93hw9&Epy*iVy}4=ajYpxPN>NWHI5#g zK@3hH$v9(%{iJQ?advXjmuYRz4x|?suty1QnjaQUp=PP~^F=rS7aWO>3QxjgH#}SG zmUHjSia~J4k3d|SlhTw-9;GS{cM8;RbQ+O{0#&;^4d@MsOx2!LnUS;=&%4*MS%eB0eMGycTxUcny_`16yW{s^Gq4 z*BWlVY0ISV*zOnlxz%2&Rp>gW;IAZ((SuVWBEoo~YlcLRD-D(V>k)yx#&BfD872Q=+sKMozeMxE;s zcjvbom+QqldVYP$sFxcs!=y*WFS+jvLmTrET!>xk=rYjXB}c^0F63j5@IiM~f#ENojYo?!+V$Qd;u@d^a-b zOWuCrdJmOsz`hu9T*(C>VWr#$=o@_`PRdaXjO1x+TEOVNP6lYzO1zC6Mq-^5cez-H zLK9^nuIn*EA!!99!U(5iw>UBfu(*&^a7~ZlRjFE~EdWt*fsRcrkBBfN@LLaMuhL2; zOx9NQCP|5!X+d9&yEWp*9t6v{td7_kGT!u-hBOuoqaZ_ExPi6N4#O;N0{wc}oo@u>yEunTT^1zej725mRA5 z0_27O9Gfi^60HFGhw&vE41lBKNXr^h-|w~Rno(bFl?0k~!yHh;^tXU6$qfynRCsi@ z_LvtR9P@=!Rd^mHFP&2>1Rp0Rkq{F}4?Y`@jBoKJv*&uC)2yRKG**kt&3Li88EYQEPFWRZ76+s>ie=Mj?kwC7foJWsk6% zPlqRcYd1Fg8LB)iP^r37%oAG`*ITpD{TONfvwDl#oLJpxz|Sa54}By}i#(!8r;+pm zNh&yI>4s4P8+2G^&+1aF8OCkQG%TJdAz>n5zEjrg>vXh_Nc5XJnx9ptux;yhKS7Kk zOx-%>TJ_sT6H}K8lmYFzVa`ZM^->)mC9fN+n4e*|;bfOD!L-rdvrhUQLB9iItYd=L zfv$?X1+cABg&SkR;6PDe{?Mh@y=G|*7=W(>BWRLtXc#`RbZedKKr>qUon zc7|YNC&gICOiJdJCD;O(mEtnFHGxj;mg!ijPNuF6R2%I(ofMQgQMt^5ki+TxxUhf= z9Z@@^qbR}4EXEw`Ld~c`bc}nq&q9xN|G%=VrGC({EE1K6)LcD^7UDF#C z5Wsx4jI8pQ4^x|HX?_qn4T_GTZQEkv2KNGzE#G64Sm!q z`nRV^Z9`x%767GrLjkzk1s7_q9MH3Ixqszov&5Ff%woonV~m!G%)If^t+r)A6T=#V zC0DEhKu|Fl1vjv8fIo{(RLvT+4`#a|00DF$4OAXf8{M^ukRzp4330*2Q&`ra(RzKQ zg)}Cf1VQ{~+|~2Y2D1+_Xwz72p>krRT|lP`q_h}#R@X?Tg(^lkW0%aidlhiiG4QGs zj(W2q=#jC~ifKrxdZ0m(Rw0xP3_uIC^D2;*jEZ%ErsdOZbcJe-)G`pGO4}<%8EaI{B24%C z34x6HC?6z;6~zwzHJUjY06ONed}7R_XJvG}$kLqo(2P+9nX>*CzyfWvhK6WU00%=u zusZZ!h1H)ZZTwj*B*Ljv0WlIBMP70G31@qpCDG8-M zZK2nf-jUzNnI>~P7>@C;-zF z+EJMjVD%R3t7x?_R?iTb;yK84vc0dRJTT>a`Xo(+V=!(h@6yiLevjU>B0Lor#;zLZ zsPejS3Tgmh#xR{h*F%S9FiZ8$coY#;K*a%jQ7!!Xmf|8W$c%ZnU+KX#oxcRRv5EF|L6% zL<>G!t;2F){)-t2S;K}!T7npvCQ1fVXg-|*i0ddWMp>p1X5V1;m!@d~EQ3~#4WGAq z>L#S|9EG$`6`{e^*J-y=M&}JvwBqc|Ji#N_^7VyUU-BAdTUJlAdc-YfE9ybX3qOTLXZ#w6eEl+Ft)LyoHOT) zG%%WxXEYMRams+fJZ!KNzrpWkVjJVw#uyB=_qJcs-uvC=w(0$v+}_(Z*67if`$)d@ zYt#O||JvuA(MTEzoH%WhJH#2yoUpcali^cNyg zPvBx;fZSvR(F9~dlGoiP=r1+lb<`RMWw&R*9S5*BnF@l?K$aTt3oL~KgmooJZcf=z zI>a)TxXDh(jSB1q8tWJ1P_S zAi803Fou3}(gge30!bof^rSClV8Cnv1VOKRLV7&jL)&_i219-08A;_qx8LA+zw|zq z2$I}H{d%KYg-dhk?SqhBF)~ z$o7Dbh!29iv$49z9asTyDhOd?gGK@SFK7?M37vYk%fg9$dxuEK3E<+P8e$zRq@7IW zFdiy%AtWN+nLxokCcc4QML_&8zEH2il)B|LIRDS_FY@`l6|z*FUhxqNk;ZM# zL?A26RCQCfOa!4X(Hmg!jmT`=^(kwpW&!C)Fb??Fo27z{#5(`EN9sk#1o<_Q*PA=6`DdinL& z2X2UwejB>qEzk_v;k9ti8Vor8Vw0>VHH$n;9c&RW(#GvBIL7sLLxlpJ6?7ltR-phH zA@bHxW*vr-rUsrra$sY7U}MLoz<+u#umPo*a$Rzj>#iY?bfJ9+bWqqJn#Ty3ZrwAo zdPZm01WbxEc$LE`3wkG*Y?(`Zfr1)Zxo*;p!{-Xfa&7e(H%%!WCG`fYB5X%bFAXxB5#jT`coF^2&-7r^(BR8`I> zp(abiqk#P5NdH7O+E}DO;Y|Kc1~b$#8&X$qxEqddZe%BDMWLqajRWTHzMlBXMAEX` ztQBk5cdWW?O{?C%_J$j7y7kufC3OD)F7|n&CUp;ZnO&2N3(gcdm>M^w2D;#21)V7= z_{ok$=1Hb^h3yxXBf>AVZ19utO*4n6E=W+V#}9HjxlCZeR=@)gmli@WnL+)C{|acs@eOpk zPaE-m=(W4xsS8{IKs4kSK3t=oWBWGT)kupG=6KQ?V|uV`94#`?S4h)wxQ?Izv*Iyx zp*I2H?IOZryI0Kw&h++E;k1%D5kdhkR> zM{t7!m16qGCkdBs3S28tss~J{AI?HF&25aZ$is?tfi5xU@SP#E2ia7q?PxLyRXQv; z%moPsXqq<19S0NT`noW}ft!Z`Hz1~MXYL)eQr&tkmn8%Cczw28xK)XJvt{cVTb=#H zb+Mu0M#$>w^=!mawBNXO$pZ&`3{G=|6Egae83Z18pl&ka5cL)i7=U(Yf*f+;j!)KF zH~={%7!AYihTL-CcL27;7EGdW{US^e_Q*6*KD_Vx<1a<;Yuzu&Q*y%L-2cOiu>R87@$H+V{iQ9FriXY8b18Oqf7(U*F_UnlgNG4gdF0uF<&q+7 z(oPOgXzjs~s2AizJ7NK|hVzpVgFL}NcL~Yy`F7@pR_BDd^!z2gvdk=uF0eS`xVVV5 z=6LxtU;&(Cn2sB8ilCJr3T(y#A)hh-@jC8MdbzbmxM(8CWnI znpA)chw#enfde4P5x|tgu$i;DE3D*e)4c^+FRq_0?ocix%s@0`n@=28INHxJ1h)ze z8FCjfq*ZW-voLWT_=EL`Z;%S$IY$%WzyaDDWllNXGP5$I_`xZyz~{D7XLw4_b&nR0Kk^Wsw09iw>J2AR~|_6d!Pl(@U&) zXX8h^OqOL{kF5sL?<#QKJcF^|nG6?B@>_Nr!!0G+;~*Bp#i1|YT>o%98kgZ#N?$Y{ z+p#Rr9*d-s>0}g}_^Kp+Z|sg4m@r=1xh&8cr;)8UOibYxW3V5{U56D&{C5rJoC?5I zc5N(<3P9Q|G02^P8*pU^&Uo&?urkRnl9sf0NmP)zrI-_ou8_dR1g254-&?pKLJcGL z`%=)Gv%xc87e?gK3}%L~7U+Vpl{wImY>k$l+8+uXKkeOt$->#yH%BYuucPm}z7*h*y?JKqIHGf)j zcTG+8^VLGtA6NBM{!8VtN^Q<>&9Uapp8d>hvEsj0bXQcCzfitn)}PJVKWk~(?km3d zDc{;`d-j_8=H_}IGLre~=jJaKB$M%UC=TTUx*x>NvP5`MIJf`t;l~e;-FJB8$$N9} zy_DPg-pKK{a5H20$b&=Yj^d>hNh97-n z_`Nf^gU=3~dIQggUw?k|{Nd5#=f@s9{?P~7PpX}~M+HkCh&wE}3&!ITB3vpwUyFh_ zlo~@S^tH%-Z3UtV#InIjctIRSI(-htwkH!^A@`yx{5(35-%!KtN2I{R|9EybAKZ?M zrz#FXh}zIO{M1{cho8=!+6~MMAAV){)#q|g9~wS(VC;zpb9-OU9XWO30t~~2jV{X_ zIav66)Dr7S{1f*C$CEf*2T!Fab@5pp1Dl^=<$==lBRPr0eL%hdz0k~Mk((Hat z0hm2-ABE2)Fa3N#3S1sa(jOA;)^6Oq%#juGW7EcV9HZC?1zvFw%D}O(i&_lw)i<{@ zhgj#j++fePF67Q(*QN(zR$n)v2guz4At{~|)Zzd#IvUSWi5LmU^a|Z4h>R#~{0(l3 zA+M#*BOwqb3c56?9`3&9-pb~!aD?Y&a3Ia0hs)%e1>`u+usv^Wm;YGxIt8^CI!Pwoy(7OOZkj90Ff*{C| z-a*{$N+^mFZh^LX19ZS?($<<`TNE_Yj+(rwh^k;q2GS)f5g12IQ;tMAMKcUBYT`a) zW2@SzX^qV-jjdXvt~WNX3U}a2ZUVANsK;8#lqf6sMeA{^c)W{|{jZNc@mgU)(oq3tjCyMz965bHcl2Cf>*$*g-HAn-JO0$j;R7U_?%y|b`ZY+UqsO1a zWI}8mIs4GanPaGn^0~9mQ<)7Uz58>=P7IxW09_58J&ztn_nghW_{`XoM{?)) z3?JAv{Q9?1Ah-Wy?)Z~KXU+_reI$3}O)7Kh<>9AZ8a;m${g_k2_QMW)>hO!Uc*=a*Xk`*$14B2GCSudbN0*$&OS4H zYsLRpvA4os{&soetT$%eP&Vv);1lra_;S`?zie0+EE}BHeKSr{HH5M*rIpGm=>Ief@07XD?6I`ux;EeSJ2VW@w!dK#<24 zhD>PV;i!Z_R+cXD-R;H=n^r2hn1wK7P%$>Mh-V_<^o(KaQxn4C)Pp>+NOnKn%sRC- z6(Pw)TJK_Mz5g1lcN}*SYEB4AA_6<*V>^xSkWvUvKZ;yr7ohd-)z&yT8VN)dLWwGV zJ*a|3&x1~o*QX{R2Cv{L;MX*}01LK**n5(QT;|H%_hdiKkH|z;$RU0)9gIz1PuJ!XC8bzsG?3wg-&h6XH_^HEVApCT!Mo|8^Z$G;eH>00&_I|dX;OObHy z#1Wirb7$Wgd*XRI=i>Ny`aDiAW6wWS_-b)srH?*1K!WzW@8w>6H21(^jL)f$lMPNu zkk*GzABI{2106c`tBJ>_{7=aJ$pwU**kpdRKdy2oe&w3dPAzpL(=xJJqqc%vBEIg3Z_L|pS=G#3xJ9n=~U)hxf1eT7&!!U}NIHdI0*&T%8j5#MZ zw#tpGS{s{N8(XEuRcjiXd3vJBOs|C}EseU$o~&tHr3M>YmBv+KW3$E{DUBMGU+hzJ z3av)zV7{x|x#KYWKqWHt!DG22?|t+EO&Oi5PVXCi<%Qw5U(M~ipVSMdk9_pOq1@4< zP)g)ZJ&2OSZ$3PFZVxPPgutU`b5A`8t;N``bG$T!6B@|j$P1XC+#~yjkDVTV>{+r` zy+~)}+*v}o4wZjnBZ>{5cnI1C*!&zoXp&#vJ^b`BoUn)QJp!%5@WW@^9+=hwE#R;R zJ;%tyZ;!tD-X!o*edz4Ip|j79Jo6If7D|lV@uw%1p|d+1$H-e}a{FJ)gOoe6AEX4` z&e*r^AAK_mg^K&-!N)%O;F(E{fKD9%M&8fnUL>7~12($Oz4^Xd7-QehR0VtA89hnZ z7(M^Q$eZ^8yCbhXn>(>@`0+OhR49v%-#>Ehuv5#y#_;|3Sfnm`|rv@ISA2+ zE(l>s$tx%w?BNaZRzZh3H*Zk#)^xrI4|}I52ohxIY}=yop-hxWCiD1T%4Wd9Hl~Jj zsQaZn?{VRzO&rrLBSpY;ya%xWK`cOmCPDI}^M7SU&e!mI-HWxytKY85&UvUJSMx`o zz-hkJLrJ;N z+odVuyJPNwKs0pb@W}C9xd+J10iR(QUWU#d8-6znm)g`KXGYFEgOY5!hjr=QkuygiV36eS{z=EkFnsv=(c`a@Vd`awF^`Px zdJ@e#7Cy+W`KDl9 z-g}m5bkUm}rubQ~Sg<=6L3XDs$gaB}N))?OMwUK!`oQqcqSw-$vLL&15Q_x8J7wXO zbo&hvVqwwlN~}mHDZ(PV5jVs2IM?0z=e)*-L)CcXJj2 zzA;_h+nmq9;#Ed$O{PE_w+5FQ$)_FR#axFEx>#u;=?VGNJ2zHwk%IXPBhFaBZHMmh z@cPfImn$4KESShlu3$qbbRMNq;|-2kZ~_sO{7DQpi`h+|@(u2}bWi!k3_H9EcQ}kS zaFASygeWVp0ayr)o$L>i**R~xb_O+Gc6k8j?9u(O7e5L015;GI>AD=h_$1p>@e=AF z?E1q`KbSlC&EW%wut^Ue_{PYy?>IiPqxZiuyq}zQ$T#`$Gj4f&`8I9mW6wi{1sC0K zkypgKCvp#x^Tz18y=W@8@9mK{9wnX0nZq2m-I2p5@D9GsL+73vefLqvt77;$bbOK& zA-^JUVns|w@4&8F^}mM3Bp1Ld((pvxa#71uR$Tu zY1_p++$ZddburH(cy6>gWdj?%vdiIi?-s_Dkb=VOw#s^3LD@nuKo<0F;~LO*Ljb{r zdJ6GKURG#;A_GE!g6Hh+7P;Y&+6CJ=93gDF=Y>mrxG`-+ZA2cYOMghhV8a(U7Qpfe zY)mE5-^&F!r7Z*6U??AvDTAef@o?(CQINkxRn)>%8O;B`@&~?#b9K+w?x=aIW^wh4 z)s0nIJSzPwVW5P85(Y{bC}E(4fnPNYWE-oie2tg)+!d*IqT_c`xOarxh$c7UOF)vu zz~XhAHf`)cHUYW|3(syh?M&Oo0K{+}iG+AE$my&UqBx)yl?>6f0Ni+m*@)y7w-RM< zaib!nLw7H9`;7G>*YLs#tt~_fVrmO70K+}m1yuxRENK*nQ{x;kFAB@}_LlVjuBz8c~8`!|2u`YIPoUpQKeTNgmnJ#U6WxT7+ zlsE$B89I=VCI-RWDQ69m%|sDL7L)P|_+~Wj6<&gg!}nfaeY8*)4 zTbVeF*hoCnoPcVOLh%rN(6aQF9No-==QL$*U<;YnDm4%a+~Q;6{3dx$KdwV9}$&IbG)_tHNmcn;Hsq)za3E&h^b+^Gl_iC4`h3zXGlrK zLJ%wu&=qGZEQYvW0gPgf2;5Ew_B8N*_d+&AMxXhS5CQB6MiGV|x|3dZ#|A|gb~LxQ z-gtA{+O`c&fgR~Ih1ADocPc_9_|M}ym}ReEfkLPdQt{cWDusIz_&~dna)MhR&o7*; zBss9QeG?S~2PN7Jk`Dq^=))y|FhwPEU%I(S=oOo?h4$L4JFq*dfnM@RcA z#uD5~#}?;Od|)w%a~UW=Ub2P7-p73emU<3XT4@a}M$IKeEN<2?;?Jl}XLGj&H`JCB zwgx)_U2H&vESBGf!b>0|(XRkCF#CU1!*_lDZ~G7VE&mVvEBse9e1r$3e~^Jg_yQLzg}^RH~IyqID&jdQ5j zg~I+P{Ke710@WUFz_pYfprzxOUt}~ z@V#a_)He|8ah&xj@0<}{w^|gp+-2N4(A+HC-rl_uu2e|qv|?Lt*XI&&MOdM8+z$M| zc1=are}RVj;{AO)w%pd-+}drWrZj}Wx?Ofnc2>pi%6vN!#DFz>jA+bY*9VaL&UHx$ zXAlP0u+m{T+e=|y2qTWQ9gG^x-v;*vD0NTJ=tHhD!=hXp$l;cv6fu;q30a4d^sWop zT#TNe0nY>kCZ&dgd^B{DkjGZxDWbDG91Y+dl7Q+l+v=SI=Trf7qy84V* zJRM9Uu?~Ea&~{Ztxv#8}KIYKJZ2G96k8=8$RbK9^rt^Qf|4(Q6$Nc}`|I=Rq5-NdM z!axZFB@C1>P{Ke710@WUFi^rk2?HezlrT`jKnVjAFi=;1O?COaGKzpPSYBOzWi`^* zLNicPer1{SZC2N;*{D(B|4XVD_5ZW~|MmZ!|1az7>Rzh-UhVGMhMN0omR5hKI)dzf zTPpv#vaixN=jl1h?6+pOR{VZNr2JpYA1N1SeQ#Ez>`%(RR(6T+z=ZBU-j8fWW1a8v zY*}-26{7#oh32EjQxrL2o_l&sBe9)SA|WFaP9a}gEFQ*<3wj!Mf+6({hH-%;HOTZd z!3lx=xsWdF0#ZGZ;-$zNU8Sr6ci$7gw$?ZAraTaF!}OqtB=IAJdmSt=N~kND?20=Y zn&NG$s^COtoYI@BO1#tC9gAvxmy7w{EZgg>A9*J&JB0Ww(~L#oSzfdvV?n%Q$!R@X zv9Qi}X|~*JKQZVvPZ))QiV|Y?$7~9s-4jMa;#6OFWqPp3OvYENYTMMYskwb)qu9J^ zQ_JR#)x`&i3p7r|(J6yO1WL{UWBYThwZ5xluL~sR z?CR~y_u>4Ueh`wTYffs1$vse>7Pp74&w?!43VQIGr{vM8bcQlpUx@xBm7iv6@Wz{( z$ThXTx%sJydfi;~lt{9~GGI<6L%b112VdK+#*%9HMic4l*Svm+43YE{i4sG7{b5S2 z9*)raqH`l5S~n$XE7F&!=x$$qSD`PXpf8#FLXydycWoOC(Ph;zdfKqFop0Z?om&Z- zPbBR4ik6m5w>XjNr_74LiPOL%aEeRe+dfn4yEM-jz&4Vn~BMNbO@g zC=M@j!4&8BqNI2nICTY9K*Z}IzmB&dIu^o6g|=l9$Q%<1Z*B{(2A?vM(B3a{c7Wo2 z3W)nX-5XVRr?BGkTHiHydz~he+avKzeja-Uk<*PmNr%!1P83IGZU>RH?`_1*!bD$q zeGD2VavC=!;3VFP zH~DQlThUM`s$iq`nxCFtKGsxeI+BhQ-FWc^>Ej%#N!4R(hsltUt((5r1B9-PGb3f5 zDInwp5~Q&lzeSgdrh^KK@;G`UyM3;&1CP7h>oXn?AqrV>L~^21bd%C_PSoAjvNzWP zk-O)6?RDj;4H?|h1#}R`?+j&n3}?bz*b3WWVPkX4twFy3rqx-LUq+ck5;?eUGbbaJih^xK=2fpwN_ZHNX}t?!5p+`1W2(7O7y+mowW6B`CMwX6w7 zy0_dYavN?Q;KGOmf{dE66-9+%4N{dGk9{(A;EgAg+clULYy*@RY_4H-WeNz~{pn0f z4@OaB>(VsYNh1uKD{_eml&}(E&^ak2DZrh;GKSrKPiHk|;`1Kn%(OT2M1ls4)m_Pc zV!;!8kPyRB4Cxqz8;m_aj{F-*cDbTe1+EBAz{as7o$SfWrUk(pt!>D-mn`T6aq`fV z%p=c}ME#5p5MkX!gv!&A4OxS@k8cR^3>(HRlolG)@b5{me_rr~H z>jp&O4X^CVI9WdJ)P&gr0O*EOLkj2?u^9^hD177biOxCT6F?&+S)1E06k-vwL4VSk z%a0s52aN^XM1mEB9MmNwtgUdE!JQSz700>()#cgU^vxr8n@%*vak7kD zTZAQ^XVgZ>qc?&q2)tPC?oj3BII2JjV0d!Gd2b9vajE2>5l4F7m}%NZg5k_f!U}f; zh&>o`Fp|nZ3@XfHhmJ&wtANx_NV`B#Aa%A96uAJ8^LSU5;{A2U@zJ{$A66sT{~xWX z^wr$qKkt9r|C;{=|6~3m{{8;n@b~+-`M=`d;{TGr#s7J~=wIf)*8ds*CH`u^ui?iH zV+}uS_=ASuZ8+a>vf+(}XB!@FIM}eeVX&dMA=>cehK`0C8df!E4dI3b4OcYGuK!8> zU)6tD|Ht*;^Z%s&J2jOxz4hRzb(M%|&hJ#}~2CF`uZJL)#o-B8z5 zC)ItfZeE?guCn%Lwf|82*R>zk{y(+9Tl-tJXKJpieY^Ix+GlFQwU5+3PEr+ zxQMUTJX`Z<%>(}L)aRXT z*joVtBz;X<#-Q&J`bw#rMc>0!<(JMvemvhp-ZS2J#9zK(RyW*dlL(X*w|s}|%CDNW zvpZwJnb!9JRoD@;efLwx{fXp&?+|s|-{U(-ullzQ_ztjFv9#ga?|icdeD_iN{V)L~ zef!u$95Q@+SxwG&FM*s%_fwTU)Ji68`F2ycnO^28>&r6eDF&Z!*QMo4%U~EmfNsQe z%%teJ^cygvmGvcikzui~|7*^VE*v@R)IID6oQC1G+w)a2wIQLJow~cS{8D@~cd{pa z$bCLY1xd|KXYd_!%IB7)?;2ol$x*n!s{Hb@G?I>FSVdS6*ejTscBE^|uPRGNQbu2- zJH_4_gLgT9W4*J>{blJS{Ys_NiTd*Su=L@eO|c_;sGj>PPOYVkl-aeNYNWPNcPteO z83GY3Z_rM4Q!Bm3V3+eZ7HueBP(}(5Co-W;jpy|r7Bx=4U@wYL8|-_`q;_$@6AWqu zU%oZZ$cX@ zXY{Wl5Vje;MuO;Uty2)c*3h?DUu-bbN~5B6;bfCZuORLt3(~o9? zFUA6WHWAgtdRMYP<`=28Zk&9BpeUGxR#1(uRPwGb5I|kgfzMOTE@o9*PVb_FlBu&V z@yrg5YDeQS9GPJQG*ap%<&9-gBuq#XvEp2*P;Gi(nKF%xzCtIQ?vq#(_$AW7C}Lh( zV2_}q=BaDMhvcX-5(FBS9i~TEDj_NjdhY8EQfVt?3@l?`k^_mQR0ia5J(a-~fYjg; zA`*O~RkfJ#f(U|0UDKDoj_O2`JMGUoUwV2PsS-2HUh6!v>_yaGBr&*<5Ik;HTtHAc z7Qg_t56chP?dG#;`2JZ!Y$VDI=FA3lHESByDETVZqG^1F6)~@5KaJR@=`Rcs^XReJ zcLhP}Y3?tlX6eUe)C$voUrN2YYUod~*U{&cs z$NqN3YS}wS30A|NndxfkhAEV)s72C=R8oum!W^2vypCixQFng@BMxT2Mi5e;ufcz2 z(*1wL0sOxI_x-=;{~iBt;^mD0vhl0u`aYj6%U*d^K3kKg#~>U10OeY6^xK=q;_0NGPTw3W7d5Y%!RKq!Ex!-HqBS71q~EfK&K9ORfn z1l~xR!83IL6e-gi4C1g3bjKpy0o%YwfO0D=V@cTMWYDrpI49T>?~0T2C^8kiC|T{l~V}Aa-@Tkr)gNq+mh^ z`b-;UGzTzmZp1*yfFGd647)5B0vXTv9`VCW=tIdfM1YZ!~14U0+eS66^({=ww!L;GgtHLo(+_mX#q`_%}Nyph(6TMqYUcDf*DodhD??^)_`o-FA3Vzv3mwhv zJ34ykEvm=z9*<{lBb9L^VUAneSyntTY_Rr%h)@gCOb4-H1+id)5cYz^SyRZDm+Fs2 zY|4>`Wf{zD4^hnBC4u^yfCmh+Xgi$_AAU7=-|0Na!^a-T9efUe4L^Hd?)+mTPwhf# zWe0L6UAF@{k`@&Vc=X_#$g+)Ogk!s&MIPwf2fK2w9LnuS{^K{0BiTvnjJ$$F=Z+$s z^Vm1eO&sDtdYhvP$J&WN{0L`)X;_IN1}VbjR^Q zJfVQ?LB+6;TT9ngB3$tbNYI^>i!YIkC%Xon!3S76=~su5!uruCkSKBZ(1F}5`$nF9 zc;uTWkr_L8

EWXOlSm@cG>7W0b@3@F7Zaeu{EKjlP^6ervZg4h(cG`)=;sw=n-G zMrp72pF}O>ee$q_JlGD2xNWm!k3*+UQw|_hL2gH6M;|-33vCV`c@WKlY=-a8PDIaC z3XsAiJ_RG#QNi(o-I#kb)`i1gq#K!z5O5hpLFo~b1C$gIiIA|UQaBjm=4H@M*r~3; z0(uCHJ$VGPJp9Os;RlY>RGr_0?_>8J0e~a>_l@j6mHXgG?)j(39-%x~lSVZB#tTG9 zyY`Ge@sN|sa`?=1qbJ{X2MGE{LxsciFw=2EfXM0K(cBBKjqZMK=*)XVrw$IEd^Mni z?Pc|?a!9Y%V4O4-iX!tl$xN6(*_INB*IhmioYXoDK!NaEcS z#BmS8T5qt&NWuLj*k{DI2cuC%;Z5F{ew_>-dwuxWGfvN=C-#pXKRtZ%-I1e@1~%I9 zWM47?C`V489Xb8-@M9;3559z@6zHIXa-cmHK@zJLh*lK;J}~me0f+XzLFV3jXY9WF z|I>S;=f9OZ^!1TfPJFoQVD5p#BS(*pJ$HU=_i;4#;jTkSl;$jj+^#3ab{#p?#QTws|1(Q+6AqU_H zgr67~Rt++YfuAO@R4hmaHW}2BO3aJ{kEp)Qjz)u~y)%jH!A^EkNM&iqS=ERK3F~w$ zMmGt_3Sh?tq(ezIh^R*&dSU4FA*`s0*cd+W{^*vmXdJa;r?6Nhiogjsvss(#60fZXjO{pZ5 z0fW8t)rc_8M4;u-SAev@R8WX_p4>Zf`W1pHu*Lv)>xLU82KoNj(S1m(J83Y;`Zsj? zaDMRMav*L81s=wldwbVI-;fA^8;!j5YVPQ>#KT;sgtY99v?cC;(8ZxdICOIAI;$47 zE{q!kdlmJ8E95woWADO!buet_<~Z^+BJEtzupB;4hZBgkL6TjASaL4X`U}Y^kUMd9 z6`VfrPyt$SmM>5? z`rNC?V(1PUdjpew&^|B-!2-h1=sQo1yz~6Pa{DwWnkR@ zRBr!Kr^&#^?m?(}a9C`^o(0N4YTSqo_=i3?0cZk(G!Dmwaa*`76BhCtK$k^10V$Oq z;W(8vfkYmcE<$haWZOd8Y>ay_1UviP7}Gz1Dp z#KuWAoY9V+JBO6gfr|3#vP&w;tIGWJ(Lf*d^ifA2we(R#AJz1MNB~t7380E10aQ^W zfU2^J^75)`^8YXQ{~ew1f9ClA*S}OhukO{lt7~7Z4c7dZn$^`Ot8cFQ)2iDm|FH7b zIX|6~ol`ygk=a*QyjUTYe^9<^)^}$`%ZAGmzQ6JH&!{Gt@UkC{=}WGgyWqOY%Eqc@ z9!XF&q#ohrkRYj>6F8e$bUeZVU~@-{5syI@NyLl}WN}$TD%lvE&usXr|FJstN7224LYN4Pr^|VX^C*C&QK;xmJ|d(Q&3{F zA4SJ4sqi5D%4h3**Ex8<2K^&14ct>hGG&`_0r(R2o6c-75`_Jxrpn)`$R>SFcb@qE zzx>0=HLMU^sEhU>!YxVOagEc%g38LZG(sf=&&&`~SP6>TgF9Paib1KJ=-L*uF}L#< z1P6qsJFob`756Qj<&4su+m>~08=84VpJ`5c+`-Vr9am4&v+5!Dm(VjZ=5RvhD)d}z z73thBhnRQ{eoad9Gx-6_Rn0hBV-ayU*@u*$Z@@FG8V)X^iqH>__oCc_mw!nEg@duK zY6G8Ut7cxKLsJ+i5}B#U)y=siwazx}SVuP)hCwzg&}~bF!!GW48q8wt@rfiw4CVqP z#X$!mYN>hXc>dh0=2up#Rn1_Ha9Sgh)|7Q1-M|g_Sa-t>$$@w>naDqBQf@l?(%fTz z)^x|g@8!PId|)+z%d@1wdWf)Kt5X+{8iL0iFX{bPOoL=W=6@N~gj}?^JECcQm!seL za~EK&JQgmgAOt`+R z9qL(RWr85<4z|cfKpAjlN#{E+V>CPu43QWTr-Vdu&yzy3;LR-(q9twu0E3v=rY~Ic z1!b-@yXlTEj_vsVzx@<|pc<@pT3mk6>KjKx7<$cm@0bR?Is)*SNxW1$B z#w+vOULuTw<4fKOU1!JQj0=Kj*TFUzOEj(dGqy!Hb$;^+{CmnU}M( z=GOU^0tN1-qoIG$Fm|I5_@;|x#`br_!1n1XPFK?x-uS1Mf4$@DO?Uj%y8Y_ct0n+} zb7JAf(=yY>LqI_5C*5@kW0BWj!w*(9!;uuU#dA6q@?_3&ODqLlaLj1NEssnp(bTf{ z=!(kk-te0po%|8(Ma}H^MyjXjWDF<=H9=G))9(x$UFP>XfCJjX#k|5{{~Ws=c&skL zP?4>LyF6Bn2=cmtHdIcLvB-zWh5q zcl^^EO?T|S=`Z(w_Ef%JU{wmyu5ho?@^-(#`o1Ep1JHm^YI3%so)O%9tYH!_Xh(nt zDzES%)!Tj75__~ja<_Nm11GRVld^a0&rck9w&{*rTb8}FbH{|a{y0L00O66B1^Fv= z42o;!xri5N`{y;vWa;6Z#2f+wLI40*wfW!=-~Y+&O?NimdWqTohYWzCiyE>imX9cA z;9FmG!xiOU28$$-n3U!HHEducwKCZTaudi{hHNA1E~lLTbx~mcUx*m3jktkt$#5A|z)%B+4T0lJ-=wE%6$FvJ@m1 z!h~aq^K$n zHi)T1M|YAY>R4cv4CnK(z>-AL*d0W42SG>nNSf{bw?gno*37QnOjFCkFWrCn`p28@ zcpflZFP&69d4O}hz+fqVAg>AK$$?<@nIq~$c_hutGu9aiaCd|lzA9D zu@oFz;M$G#1q#TEx9c)!3w`c{!3MPb#Y4|*KDwf+>5fM}?D*+_`$2Kq_WIy()uMlP zo>M~RP-(p2S~xjrlTRidr(BgBw4elQT6N30b60G9@i#jj`{$J}|L>nMrCvITU@jp@z3Y0uWshY(|HzP1)KbjqxkrX7JQ5?#7Do~(;2gnR#8-u zg%MI>PiH0-r!u4c`ax9r^*0zvrH1$XL1ErUwgQt=t|IHL7d$VS6Lxp_9@Q zclB*H2J#o7_wW*NQm`(PR_QIPMS7Nw;ob6pg0Bf&x9{{aPg1k=p5ekl4Z% zW~UP;fE;$HS?l6PE`!yeG!0bJLwd21>(tzIBPY8Lxy?|SUvTtDm05iB`i!IR&UArb zx+t3}B&Tp8Ko^Mv$TZY9!vPdE>eShnxEXQaxDoy0D3G{mP#|$Lq5x{#5VZK@%amr9 zzzLL#8$9i^dD6$-B&o>YS)$%)34pw*K7pab52EPoOZ<#OC$`|Y{e{xWFx{jMuO^7# z5D-yJHKIzKZc3a6gF6zksJ6xP5h0?;jHoXXML4jzaENk~HJU?Hw>-#K`}VIWb)PxS_7qym3q51ws)@ zmuDI`^S=B922RVZ=)mO}2fj0jI1LPjaF5ZO4yU2qhZP5xPcI$^D$YILW&lw@5{uwK znGpwl-JbvkXiqMR0cA!E5H}>JSnP)v8*=C3QKOJF>n;l&--|H>b!OC%zwRf1o#{kK zX=V{JlMXp9!yj{9Xd%XZnS21{PO)*%C>_FI`4brQbi$!Dvv7#cLx@I1(RNs1k&B;i z9h;py-I^Mb))QVtYMxl^=`9A?fOeYh{ zGs}eiQ6mIzLobv<1SSy#RJ-`$!*ZD40-)b3LiqBG0$=_n!zX}(>BK&HX0dM)3T!Lm zm{LIsxMcxHvPcYPSWNN7iNHEECY~$^xsWfiE6Ov-g5>{S=KmS||M8{tuY`dT21*zx zVW5P85(Y{bC}E(4ff5Ev7${+&gn<$Ue(f+&US3^YU-6pH@B6NA_Ww0ot(f2NHw|YR z_SgOQx}!D0%FoXE+N>VmcdH++`sv3U`kn>Zxs~%ov21Uw&%iBnI8`CkN}`iK5J-b` z;6)yZEjPC|Z)y!}YF@Rz6&Cral@E(aA9o2jhg}+Hm_eF*m(25Lzivs z%{Si`xS{p7K=bBJH@0m6`0cG5HbHX(kD$o*PD)t0Fwjq79E{XrxDGAJ1B^0h@>PxX z4UU%(CKl+6^~DS7guhX1%MF3Wi@(%y76$0L9WM64McSnz3?0M?CESz(ATgRT+(^l!r=2f^Ho&z>%;$s|DT;ir zs51fHuL+X?XO=FII6yI{ClPp#k^cB&&6Zo|B4;dHovEC6!_ueqQV8XQl09yLYf) z&WK{2(a|?Odu8_0%6T0iJe?6<;nw3yD4p13i0))jHZ0zhiWK?cM7k?dVsax6*%c{B z_;xzPYQ8-CDFBD%JQX-9GtTxqIYWXcw5S)hh$3H@9VrvEnIT%w(M+% z+5__oQEPNjxIALE_;zhE;-?os7tNC+Y5`SElA$JxNRwXYH`WO|GSO_30$)G|nDT-` z&Q00=$K``eFG&s4FETroN~St{>~xw9cyjZU%A*sRt5SoLBoJo_1Jw~!?Yw}X;WQ9I zs0NH+vM5Y)3gTZOd{cL_uam*!4bzok#@{k<;39_jSrg=;DFu5G|EXXaCP||3GTqK# zhS_o=MvDqRg~gpUUif5unJ>XbraAN0E-3S{6`ICQ)n|9Y7aTzYu*Wej?C|1Few=S< zd&F!xqtShQ0gY0D@j_}b8l~4i7md>0g95Q|f}kI8_EF5r1m|fNO)lsD1&J<#n2*~# zr>6%R*d+eUPdaMg4B<_k15=^xc>=H#=4t|c|6-HPe{IgZ*7-BfHAxMEGmH3oCx6ey zRdJ~URqojB|7zvD`SZ*6^c2trUgR6yT8uJK;O8QYi3dQr0O#Xm!D7|Tz)>#5af(dT zIJ-*6Gl0D43DkvP3EBUv{ogMV|LB|Ru&VxF>d({<)Jt_Eb)od^i$K}kGykwciEt;+%7-T6Kg z))LIAc}*(QrB8g|SY7ia3P*ro=OTrLSCJ=NR9EU~yd~eb>xAUgY!Y^al3!IVfLO+|bmRh9ruINyron4ewUKC8wFL<5*cwYB+bBI_KQyiQVzbrz`23Yq{KMBov@vSc6#p6f0t4Rm7U) z5wCy+fr{`GiHP^=5(EXE7d~cyIc<||y?}_2!jlb=vWTjb!Bj$U7FE5O1AMVOd>k4h zm18Fb-$$+rgj9BLg(L>v*CdO#LDZjb6H)RN%6*D#(xRpbVYIo#Yg5oYI_#o42zu|N zWmSMAkQ@;+LXNEnq0Y*D9j!Cg12RL%2{*hkxd}|Dj*J^v3kqWCp}wpK3(+j7g*ahx zD++r?Rn{}FOPq|Ga1)?as3(v&B7ID(0j?w|OHqfrX^^*HQ%=A zp`fs}3@#5kqvC_qg1B53k;NEMkPy*MT)7x6bE7B*;aGGF3!qRH=0l zs^?i9pC>-DFc&n!IGszw;OB+SAONN&w=SH}jMCW?L&y)^cv@M zN{@q_#)uw>?8^ueCC*3VOY?Ij7I2z;C1*2X*_4sYSrwHPpGBqd2@%QdK;&iBbX)h8HQoktUlt5en-HH^$Dw9kc*5d=x!^{dfvp1boN=`zeP z!*YH|pjqrkNbjs7@B-GW9=r-w=X)@54wIZ%oVG&TQ`S_34Qu)gisxsQ)7(YEcut{N zFy8_alw(SfeMrZS4xTLQR~Ev`IU>o_^~D8wWK_Z8z!IVLp>u++d>U2r?2dCJ4M&E7 zca77fmjoL*(SaTaK?udH%|ksoKSpfcY!`7DCG3UynsR`0P6I(&NYpW7+SV&jGf#q? z5IXI%(Db78-|Krz}U%NQ8j{I{C}d_;q=(#7<`Y^hV<3UI#o# z>VyEp9MAEZqF;t8`HAKP2Y>>rDI3aoRmxR^D0i}mOy`%PYGb~)LeUf9rFBYeLmM)2 zG_W%uP7*&g+jmW4Gm>(r5!fm{NnS0eE_H8X^{w zaWGfX&K?6sZ-kn2*;&4OuO-Zy(sT)0TI;pMcRJ=n@)+4M*ol-2JuwHai9>cr+V#)=^gXo=#wx%8pb$AVV zD~B~i9~aXOrz?tfLmk?=(`!d{0qO_U!Jz|*8<=!BfvGrLdJ>W)9TO%r*P^jDuQ8I2 z@5;nddAXV-!*nNR9yrpZlcsw4@kYS6?DUK8Hp8b=TaI+o~6Wa4znDbj{4D_j$T zx98^?%d7y&dE7t*DLxSR|7l7~6Aqs|3y_?oNF1-Mt3)Fn@nUs3 zjf~UU#ZV0dEJfGX&6(|MT-)p(PZ$~ri=Hs#K4-2BtkI&VK{P#4YMYI93z)2)SOQIm zoxmp?e#q|zM-YQ0-RO+QNm%SoBKc8K9ErMweWJMnO<_g3O@VuOO}U3k@<^d(i$No5 ziX;kLIpZQ;6Vq@JXAz2!26Z(&3pj1`$YbUTil}hBS_afLPDb6#6(voQWrPa!Et>P& zzWU4S{;=+;x;yGVQ+uv7&@Dg`hgcTNo-^CdO_X7O*3B!2U3mc7I{&C zhOeZPX4!eXn?U~-I_cFKgs5LwnfwW9wo5wcas6>gCtcD>lNqU`lg{g;zql5>DzDR) zpl-maGlu&y856$x%;W`Qp0g>5L6Hk!N5X#;Y+q0mC>YnEeqLiGDV^K9NQKjd+>z-{ zx=2-6RVC9W+5U7+6lARxRr6{)N$#Zd*l`;112d?4)bA$qeq0COgx()PW%7q#~z7ID^e;l;a3CRn>6;t8En;-I8xqm{1L^ z4_ji^^UGeD^V|Rd=YhqX(;a| zpc-aw;8|mqQ5b1CZPgcH8gDHyjSHQ~ib#nvI}u&irkLZ7iM9|O9-A#ar-)7uE z)=Xr2Mp9!`>y6o|2xyElv)Vy>5Xt6)9msawjdZ?75Y|#$DM}%mZ&xOTY^10VrJCvO zv4m3&d65SYzL;7-@mNo9+zukiJyMlgv?v|W(v&iiMK=JLD94OOlr=UQr|in;GPJE1 z8RyA3mJZ`8t6{5lG^oNH5tJ;Lcn!fYgMzNgSm3IFOyuFHCfm9Nt7}9srJyA1c2L7= z4T@2uB;lgG1YLdj*A+)$!q)7X?}INeyD5A%V8bD1BOr~J#6b|B_Kk;KLN4K!P+N%E zy_eL03|HQ3IAo~XQG9Wo#9|ac zIz|u%a;+0lQ1)8<*G+^)84wu3O&}yn!Bv!uVvJ!pRMcgpEIYA`GQhI*%*Zos4vv!) zQ860rhQZRIPBWR@PBp1tN_Uhe&N%iQdeMh0Jzd>>p^r_BwkbxD7YcI`iAI7_gyVvS zYQYM^>n8H$DSAY*!@u5`a!B$==ZX;?lG(^IY(`Uw6>k(IMROPYv?RH>8YH>p-a&^X zRY|is$QzHh7WZag>%t-a5gV@lKTgmRD%{Wi%1P_rV(&!pUOAJ~~ zZy$7PjzeqNQE>7I%Wq8WG5-9q$uokTLx9l}lBf<|X@NX7)#QRvQ8z`)ig3Jb=E?Kd zA8QV&{?7%I2oi@Cq>hqQnbW6x1GC2kNOiYbRomXRyV{{tUN9|PvusU64kAg`;J3v` zElZP>sAh|T2DWIEGlbRIi%ZGLbf+R&GK_l`tUjV;KwqP(U@IIFLiB#D-BA)O+g74r zzDRo*ggHtN8k%MYWw-`Kc>E92MEK+P&M;TjciBYzIQ}~51I|~|z0r``*4fpkTjbfh zDr?&pWLsS6$L3X=M}Ps9=TXmssZuu;Bnsw`21S=O$M>ZGEf&OKUNQM##KK@Dn=^xu zkFg`Dx+z;G(uay-*pv+}f;4SNqs|tBEd@0*q6YaWVx#a9oGPMXcv91B%(KeoPaK)R z&IhtCNzx?7R`|vPieMs;2%YzQ5#2upsgro5OIdMpbr1X zppI0lwx}Aa26`@NmW|c-ql3jpBmov2v5SlqZ$ys2;8^b}FQjE~8&I7R;cV>Dpg{04 zUWrCzH5!cwBFAP_{B05&B6b(wI5eaIxW(E=c2Ehe54r|O^zvE3iwERcw zij7PJHxY`Cncm34g~vRraLmZ(Ey~ddugR*UfXpmWwFF%^#3(1Is=>xAecUl?*fyeq z7ztWYod-Sh;As)Ca>1rpMVvqxDV_B@-n293;VY(&8EKkjnNnm=nP=yXcHw!p%WB)_ zW%c>9=#*;lkbHH;mNcD{EJZeSox}cVa7d77@|wMQWkQcL&$zgSu8tNlXtuDX>CKd9MLb!**$8olcI`mXwG>ffsQa_zplf2=!R zxw+~))k?!VmCw|?TFF)Jtew};+OVzRU#sq^`@`zFwXZcC@%L2!Ue#Y!Z>_(-s-fnx zy3bUORsMGUs_K_2YioZ}XZio6O052<=KuD;=U-H7)c=p#@AP{Ke710@Xndtu<(^7gWb3T>Z`BTQ6?BC;CJ4MG%JX~ncvOEN_1i&O}yDx>Hlgflr4=XmH~(X+%_GNO`( zt1_4i9^SLC7f^Q!@`geYZbdDT3PCrf2>?}#MgfydXHi+ixf%i`oVjIAph6fMCr5!z z8`A=b)v#cCz_p-=YKS)GfTu#bXxSoAWdVhfWvf61wD5vxsVZk%5s72nnR>*G;7E#(xU`i=$sDIhOI$_R4moBLsW>vd{|KSL7i<% zHqb6dafDYQYDC1CEhR{W@C(EO+d#x56quT>ssI?WIBpndnz@X12VH_LM=Yp5pt)8B zK!mw8`KS;vaVpW4QX$NpE#vN*D4-ChDF&wj>F_9)Oy05u;d&}$;u0MavI0A{Oy>=a zkK)*>2)1FUvZfnLs1UE)wjl8~hKmV?4oJ2lXbQ+R&@^u>rb6&&l_1$i(F9R}Y+~V< zQ7A-B-H6CMcO7dT!{&4-?ra!=pd7J2M}^P{EQA(@B3lvFw zk|{{ev>}z-LL(KjaiRu6OE~bD5Y@3ruyRRns(>`0__&q|MNQ7uYz4L_oS8vsI7vf! z2&IG+iD2b(i>QzWT?))oIL<~@EOZ06$8_Grsn(QL5vTTrR0z5&Alk$_iD2%Ohyfd@ zCSpB__z41Dz`Da}7@A4aaTyY*8+X?ts;SvBVO@_#15`*fphwrBvJ!C_3#6u-wrwMp zEi^U}!H|{tR7l4(S~g}ywnX%c1!xK~VM2|HFcC#Q%eqrxKf*QGh!w@{Jl+Hr@qe%| z=mjiGlCPmc5j_Hfs125-U~D*^gHSk&oTqs#b3?eA3Yi*@lb)i{a8U>v3>icd6*!&P zgB`hw3LzgoPJ$K~5Elh6;7vOUxIj$?7A%a}pJClaL6)4xi8d{BAe}c!mB!g%PaOE` zm8>PSZ$nqY;b0}nwqY7rOIVl!rpv@>>(f*SdLs*n)j=7G1bqsatPnx+U`+!?z^dm_ zAswWz;S?#OmIOsQ8U#7vq#jjGQlDSJTEciGEHmDqFq%>DLd%v&F9psWH3ji|o0QYBM2p|PUbqnnSa6qUrws8B?)L77o32H*+HNw-BD<07(+3n&rrhD%vXq;~)g zF)i3jQ~?J^WI~pq{1l+!kd;qSAp>jLfA`G&5UvYNC8`hHWT(X zY+@3aaU{xFb*#_@ti82V=t8!*8Y*-l>qs>fx{zYJiotXN9c(2Px{%Ux4l8s4E#GV^ zbRqRv1#9U7dZlt!=mLtE|DU~gfpe?6?u9k)(P%WnIL17KJjU1)Bk8;!Lkt-|0E5Ri z*yau5NIII4t&zr(X2xTe1Q{GiAPFIm2N3dTfP?^fK|=_Hw7315o3vlkuf2VwxqW)Z zcJIw?dVg(iZ*zaW-+%3Mj$U&l%@Eq~OV5C3q_g+gYwiDDd+pa+Yj>{i8uz!`xgh)h z01o;?=MG&G9 zzt;aq-(>FL|vdTb?>6Fn&?_O3Q|--IgA9w_tQqF|Rk1aHQc< zQpAL@VFY_zawH*YB5a6YAclQ@Z28Ht6!!jJzj=4P#Ra0?@ft#63D}QomZB;SOT-Z|MEumUb8lqL;CT6tNgc5-*iUR9NEd?{91h7i#h9DY3I$@X<3zTBa;l3rHoB=yf2{0nSTnc5HVkDu! zmdAjB6izg-IjV@Ue^QH(epIGPd_1o}ecysD+EL!~9IFm!|Ax1dFIGX-4JNtlEQsbmCKfTggbs3sL& zi@8%^65H`agN=~PAs!`SpousqX~3qEqNxsVO%a$`9T?wGzS=^d-7YvfQg{(qdTD*(R!@C-!_wL*EOZ<^Z0fA02oWm< zE+4k?XjbpzJ!c2TB-%eUFshi@dJI^o|=1r!mgZKaJbB$GI*F(YCUM!gbF;38T& z30qH`g5aD3Hhd{Q)|3dtq4SpSFRd-?J7Kzp)8{2PuoMA@G3{{JxGFGyQ`z=dXm@r| znw*(R;2u8&m7anyp7wnn5XDeaLus|G2Yfww%sY09$*8);q9s&=2t)XSon z!ize34=HCvUIbD&`ifuxzCwUxEkP5N6kK1!|ts9;r|bQteK$ znj!_6f;ByQ^a?v0&dOBH)CCNK21Z4b7SAedG-a45=$Iu4X*tmxsU=hyQe7YW%X&Nz zR8fX+D~#%4{81-Ul@!FEZI9GYEmCcc@>(GUGXumwULjH#bu<{T8xb8A#1Jfn$1smi zY12?(8-ml(wB8b_da9P5I`-#ocp$=+4i)Nx6s6$czKxzbaaOR_+YbgJEe|vu*Q)=} z-hMba)M2_07Ya>;-jFpuqH`ubaT?5eIM_lb`HDN$FDFt=Bzs(T`>FFHZZCqt)QcoM z>a7$6L2Tm)bfSB(&JViH@%b;SkMDB*piS6Cz<(qHBPntLfiP+q?;`@a^e17$BuJ_M zcz)1`v@XHKtF)1#eX{fUjysXG zyP;Yg;M_W>YXfg2fO_ObmGQ!xRpS#1xF{V0fa_0KKwBI}F+2Er#_xFUfEf zku|tJCEy+d_bNySHuzwR8CyP8YcBIgkJfi(8C_XK{9a5V8rKPSiUQNQcH_?R>xKj4 z$BtiQtrOZAlwpXI(mbkXz+?_4kOmg0Ff2-t^%@KW6YnieXJ;e%#KAZmpWcuOM%-q*jf5s$eE_Q| z7c{LD*n+hg#mkv>HGXF8EbkEicZCxg_@lz$)qtvn=_r;H9QG~v1Z+W+G|cT!7nUiX;Y}dN3vBA}KQoV{fuX6!h4#i87pq{_^Q1Xkb;Pq06g{>rX_&U@5RG zZ;R8$ch>0ac4nlQ-KA4WYyfIx)tc7f>P7)EU~LYwTUd&&SZ9lA#NXiHy{YKr!U{BnqKuuusw4 zmNuP&Q!B5+hTedqB6f`x_(LL21|kP@uqdUSW5+SjA>2|y!?YUK%m{mf*n|KIHo0(V zSJD{VV2%zEfC+6Xwrrvdr!L<=EyW3UoN(yCjk*gsu@so1JM1>y1KW6EjYPFGCx$sQ zc6i{mn^sL&qhfkY@v%+V>L+w;W>L>u*(?Bo=F@tL{9|F`jZHypi^3HXlLAwOF*L*s zoB6TjQ?+!|_+)6?V02AawZTlDnbPt5y(4NZp& zD72^!(Q6ENA=jj|Yt-W#&#P4vZQKA_ZBo6dE#gEvjeYDCMT5X{5tiuK&q$isK!*RXtS;sU=&)3=c%xz>PL;7+NW9kqVs~7{9V?N2G$bZ0QRDMiF_F`^hewuLb>iX`CN5Rq{XieJ`_8bX&aeDX z2BUit;4D&@9f(RD*&#$xAV_Ceu%`k?a%QLU(;pU z`St-N9G0Qiz>f(bZB*vfv(heuH8T7@MLi!C_Y`!(|M02dg)ynKh%W7;_~vU5ouE7j{1elMm3Z$gD6;Csl+ z901U;B_qL0Famcv43`F+Plco|3uYR4;QX@*9Se=W#eB3jh6OH5q#FP^xC1sSkeZZs z(tUhGtY+q=wDH*F;F<_e-!we(gan-F3^*@wm>^-Zn}@$;dZnTQhddz#4?4&O1#g5q zCLNGaFc&pxVl72M-D1lo%5du3ugfoHj;l25A^-v~*h45F81C)v!QO z(-K0f8CZ|NPcM;#_pS-2V&Js0xx8-q1}7qL>qRKcgp7S&0iiBs6JDJ-{D-X!%y5=X z)k12+e_DzMk8@n|Q*4%^x1FON4@7GES3A#Lc!a8v3f0+7A`uZ6ML4Dc z8*D`(PF50uafEaPuB>o=gfFovn6XxL7#hAW?^#l3UZGtDctAEw!Nx|rU8>+^f$=Tn zxTS5{xhPk(fQ%o6H+nPbh5|lu2KHGJh$V#}e}){f5hd&bQsqV zu5dGj&W3POkicx80+zzNIf96I2`qhKQj|*YVggIw}GZ|boiiutVTb5~FLx?WUNMb8R!$x1srFg6Ezlu)RP(u;@3GV(&mWYVs zMJXz_>)X~nv$5s`q+MhM>MtuBh!uo?pok>cb3|lGgik<_Jx!)<3xumca0p4@DJ)r~ zSgWp~e_mQw0g=sd&eXVThPqlQ2wu^yoo6nsu`T4=1c*pYY`^YkTwd`U4I!T;lPn4m z$APA=Fd@?s8U&5b!v`J_8WE}^wxn>Y-e-SwNxcz=A9EE1rf#0nuHMHtY^a&Dwu^az zKnqZghLKLdV_!z-M=gyIGa^OuP|}D%u~Mm*5ySvzA$-KdNfPj&BXX#;l_Mi9AsHe=4M6gF(7ss=2aNkve|MjpW%v9W@wKK9QNu$@8l ziP)RvfuYzL>TQrIoT=j0QJl>zIqh&#M854gqjmoOsBh?}!RH2317E@U|LWfF_53Ez z|6l8TwBuplqyPSk|ML75RSoZJ7m{h;WPWZZg#8fnNnZf}if*cFe+h;$+%_6Xt%aWR+Tt=|8uhn@Bi zoJ*}?{DU(;L?3RJ0%L2NG2)BZBCcwgI^MA*FwU3vF{$>oi!`P2`Rv@}(HUV57I!PI zKVsg)@*m-HIT_Z(Fm>c{D5s@i41jo42(dyTg0SpzCBZN_>-I;M))cD>%%Q7up(;8o z1z||qVzA-eRSoEC7f1`IB8YB;Qze`sVp)OhP{dNfo?OzvZLJ8YRnwIn!Y!o&$E+}T zOCowQ#SfMcGY4H6A(kl~7{b{g;JpA7iRBVyICXvcM{YPFj1Vk7nx()|t*xwFULz~* zVu@7*IlM`zv%z=Bv_wThKq?bf!Vv}ihiuScfQ5rLGQUZsaJs7_=1aA&)RVCK%Qs$d zt0`WCWq-3295=VcV6+AU%qm)jN~^&@Tsa0D0!2YOVBu=;z(B_MreIp)dHQ7FmZsOBjh@+D?p&!S`2DQSQwaa6qp>Js^lST%QnE%#0ZnR!c~T5ktm`LDCfihkm+&TU?T`s=>x$ ziZ^3#nh6WXFAX~qL-(QxqjV3G9;It0a9~#_O9IXVxF~|e!KcY#pSUOHiT7I8^EvbQ zZnbK(wz^$7K*Zg`&X%ByaWV`7d5opFqDJB4FwBOhf{b|8I>j4=h->kj?W5z^L^$lU zMAO7d3>Gdp!-MR>_!H|=w3dkY-{>6)9Xqv}1T^0~9}LjWXG;!jHlPA7eT*V7I>s|6 z#S%;aip?{eBH(6mrv}XcEzRYRU!zoKs%zVYPDD6q>`?MLWRn4kn1e8p((xU^zfoma zHo%Mm(HJQ_*vdr{@dM%EU_g;4$dfFEl|Bq9fGDEmVVhe(U_Jznf0H~|Kz{5j2d+9G zah%vVD(uN=fepzjQ3LEOd9W+VY-sNkk4)` zhRq`|!wBQ*wHXs7wV~Z$(lF#W%%+CHYU*?ZY#y zICz)Ah>zSYt9xs;DLBt)hhk8u*`dc6-8y8fb8e|{V>%9b-^_`HuBQ8B>a2@rS^Uh$@Rvsns2NH$oO3=g!sEn#baQRFb3cCdMrwO;WIeXt#?p5c-j? zf9UhR&=sL?gw_uI=b@j5%+N!4;Qe?AcnEk1cnEk1cnEk1cnEk1cnEk1cnEk1{JSD> zY4>1eoZ3nRX|Jr3@_y4uq z3SjsDwadir|7*7m!0!KRmxFuV!T|K>B>@Pz4vA>%-H1wbG z!29tK@DT72@DT72@DT72@DT72@DT72@DT72@DOF@A8-f#VVtgo-TgRTGB z-?5$^_P492+xpwxW&Q2!>_t9*m%aY~JzwZ&p??hh9rghJYv^x6e-!$?w@(E0QTpxzMd{@1@zKyYy{wUS2z3J z#eR2ocVPp-I{*IzAMF1Bz}^A)8|(%A*M@SvuO0#(0v-Y$0v-Y$0v-Y$0v-Y$0v-Y$ z0v-Y$0&gz_y1V=x{q&2i|KSOMm46Rg|M#%YqIce3@rpZxy^LNEJZ`A;4Ie;xV} z_5pqn`pwYmceG!;M##c-`cfn$HrzeDKlUF zWnIIzeV`YqwTaeqA;RlnPR6ZmqjXWDsA#w^m0e`FG({7x^7s1AJ8x`kBA=hgn%3`z z-2A8@M{&EVh->`n%c-P@+SdMF-xrKNdK1PFf2aUOhH;g#Fa#6Qxm3i{hSbT+P@d1vgc0@3k;VPG)ij`_+&axA@^Qdt9T8JICwz z5GyI7w6({oOBy$U(!ctgf;K9sQQYi{n<1N}=-Sq9tBh$QlcIl1bK-hU88=PZm+Coq zh`4bNDVmDgVBgba;jwGics4t=qy!F#ifEPwM8Th(qG;PYEj%)GaXtIhP>MP#sZj+t zA~&KcAfwm6W?YZzjdPn!_?;+qJ;DSIo zF)%bPUbn8xkMJR5W93jfiM!3Ev?SqnbSbSQ5(zEMnNkw>ASX3VOkK0Rl$|Xdx#^a% zu^p4Cf_2L=T@V~MC7I(*A+0OAqNGwP{+JDyApf6pp&gY7Cq@K;Mo?ZJ6}hOusnGS! zQdD`eRGKc1#$wZnVze}unVN_u^HZ@YGnFx74eVT*&KIVP(w2kM6PMu#5QSul*F+^DN``sOc2T_PuyOO;*qCtZ_+(8b6S!+$ zN+%UQnc$41E{JNHudigs_Fb-3!PV;c&#n4Mk=53ftYc?MC3TKFf`9#A^!*ju^5Xt~ z`?j2Lt;oN5JL=uR@tba1*VXUyb&QSq66us=nz%+?5ll%-ahhx#MO9Qz7BNv%5P30$JBbBdRWaVHyn(BRQi7_p zOl)M2QTFbCy{ofQc|Oc3qmn*~o4h4nS7o(HipD9&d-{jQ$E}VA-pjgZXo8p!MM+G` zAg(18Ih{&LB4;K|UQQ)+mUUS{C#ZJFniO0{>`3H9!8n>RFu%c{oXPs$ z+;oI)3^#M7*vxb`Z={O2_*jr)ybx>0cA&?1`*?YMMM{tNak?q;DFe4E^Ma(OC0$Dj z2?_U~CxmoDmqi{L zBCSedI-NEtk0lED(0S33I!Vw+MP*c$qY4%SkS_;U$VhF9A|JomA0h;p&V?wvl?aq( zQkguVGm$S%8dDKt&M2gc5o#RN5L(f?%stNOYEnm!5mG#41`1zP8>FW5M=B%nV2%t8Ka%VEWdr*)^0H2`&CB({9|MP=IvjBp`npmG=Ev` zg$_HwbQoCl=_xU7q*4MzPL~W(*V9Q^(@aUkq9~#8<`@=P<}B%ebY|9!KpQ~(Gr34< z(u^dt`5C4QBxo^3)|0BK^SUS~Qo=~8O!h_D5S4VjLh${=x?08|w9+WAL{&+Xp#Pkf zWxB1JqD#U5?&}@Dsmyf*$FH{dw{)y_`1Cg0raXM=h*`SJX*ib|st2D@zq4J`^E21GlrRfUK@p3)i{)dir)w3sI zeauBcMrNx#OC&9&?4&4?T;AOk9FKryf07Lwbdg*FOT#qutR!j}?{#zmA#DmmLI>Yx zzWm9BuYGOtqdIg=@xx4HZI5s8J|C zjjK+GtO{YE5uzBNBw5Ei?)92BNTmNgo1jkTfhh;*)=d!Y9JDzubDa$W1g*=Na*|U7 zNlj}B9s@yw!=Q-K)Z~VDmssB$EkKlQ8$tl!PLwd_qm76ML{O&=7g!32|-P!WIdfqN=XhvV=4*Bl!c^eruZbwWDP2mz3-B*H1H^614obY zB05RKs3HiXf`ZK!Nzo;;{|^iu^bNf<^ru4yL+f!1;E!<^;MCB+h8`LEh|A31d*mVD zA>bk4A>bk4A>bk4A>bk4A>bk4A>bj<5&^okuiXJkfHJi^N*bU{?RJ0J{eSKD%Gv#Y z?RNXv{eSJY+t~eoi8kwdcK=_y!v}W%U%Ra)cK=@@-FgS4bA8vizuhJev;Xh-LtpTU zz$F8JJ@DCq-u`>~{(Ik^?#&&4*s;2EqGgk|NxV-eZ|qxp`Q;t=A1fJ&tO@gzcpQ80 zhl=rHreqe)QVAQBWR>FfII-=99b@}@R zAKran*RJs18+MM5-Ed3zx*fNK#}4e@vvW7f8{e^e|7GFf>6t_}lZ+Q9jRF{mr}9%q zCN~_OH3~^QDsL%seQV7f9pyVRxs-Xt;`mT5KZhff2@~fU)04%VFR;cvj|s)d2#U?+Q)WDwpUIV$N)3{!iCZMk6wOo|MnA*hL_VLb zutYBw3i(2O$}ASKZ`i;wk`ptTY$~3bDHx?pJ{O-Vx>8RTOrrz}2AD(5%~EE{tR;dI z?CGqzGzTOeG^Pvri2@i{HfZ%PSh&?c3s;~Ud4ISZ?OV(99S(4LxVJ+wIccV5vSxhR%%w<2 zOrueYandq{StIM(c1zx=5^DQqEk|)`^!yAMHNkbtoxwvBabu>GM`dhA%^ay%Xu?Lh zT#~b8C6GIlOJ--#M_6mRmgnSPptR1BFP2aN7oMClO2&kHhN3xT?B2FxpED7ltag1z!rLkN1~ygNxqIjS zonyOp-C{r7u^mH0!7LT#n~iHD<#WpC^{w3p$ZuaVIz(Z(0{xXEZWyCb7C*W4ru)uF0(&Wa`@L$pS*v}d%yg_yl*-TL$ULY~UYoPm_=dyi&)XfV>bj;S zIEf$xt0O0_D6i>TD~cT-T+bvUXO>`TmBXlPPgnr(831LL@MunXC-3 z@kvY_YCvz8(^+da%pBUU44kai^w#-So!EkM5?!reEUPppt5urwt**2ZY?!ck!K?!d zM7tx@u?dQ~d?}Njk7FfJG-u61rc^tDsfPttFQs^4Cg<8!+6j1t7c^RlM%;S9Mg~GZ z!~K6h@WJQ*3?l#kBkuqEJKO>A$8DDOUb2UPhk%EGhk%EGhk%EGhk%EGhk%EGhk%EG zhrlle0gCh2>8Ia){q%c)#sBj!iT?-Rf28(yg3BHso&R@+e(DSTGk$qL9s(W$9s(W$ z9s(W$9s(W$9s(W$9s(W$9s(W$zZ3{q;r~W@dMW&0#|XRsuQT-bEdKv5MFqV|cnEk1 zcnEk1cnEk1cnEk1cnEk1cnEk1cnEk1_J`?(F4=xV@4*?GW4*?GW4*?GW4*?GW4*?GW4*?GW4}pIN1iHI?9Rd0^ zK)?L-tDk=L(XU?m)kD9!V_nIP!&5g*r3GVr*Y)xI)qCVyOJlbf@#MAJaoNnSsp}%~ zgC*hS=^d%9!ZqVv^ipS6m(Ne<{{x|4^M(E;^gly?iyHv`EcAz=-wFLz=sS4m{dfp? z2zUs12zUs12zUs12zUs12zUs12)y+OTrtq&TRS#Jm&@h_PLLwJ5aIPOCyz?_Uy2H% zqDfM-6iv9&-{U)PY-}Q*pU9dG+4xaGj&hPNa$2(#QQOkr<6AQ}hI`hFOEU3NRMu3E z=bNQS>bv`Te5=RCjvP5spGTBNIW4LxnyM&GQZ!DuqLf;K9sQB4s!rJ?TC6kXfW&0e22GO4An^HENgR8_A}5&2OWDVnMY z^1HiO-FNL8ug?P#9FP-%d;@aT6h*tDlhr*lh5K9^-d9H@HLB>U(10Ct;t%!=z=_}A z5%jY^gZ=Djpr?<04fL|F13f+L>p(aA>hJ5a{&sct;9bAH{{Jmz|Bsvh=ng>K{)bxt ze-Qeuw_eD-57Mfe-WiD5s1HT2vNvT_>CCr70rEDaxdQ|Jd6*1AV>=#>Rpdm`9AM zX=XZKd50S%>vcY=aw;d0^}1_{s@t#b7+`D#*S0s}uPsO%<$0L*%Yvq{7q9mBktKid zyk*$(yOblsTHJbbTYn!}^at0pwdr>$Mv_#C-W%)dBfI|K>UNg>E@jAys^hgCy*4iG z&HG&nfzyJ78L%>78L%>78L%>78L%>78L%>78 zL*SPc0kZUG`%;5}t_wQsjio>v`~R-h9oS~+qg-sKq?cR+Xt$$>KG2RucOUX#x1x*k zu$_a>o~~8?v7I&R|LW@hw735MWtA_lULFD-0v-Y$0v-Y$0v-Y$0v-Y$0v-Y$0&fol z{w>%4Fgs{i|6Aw(fe`cm|6ie>Ao|~*;~s$1p+Chf0KbRF-j9cXhk%EGhk%EGhk%EG zhk%EGhk%EGhk%EGhrrtk0dnuhRe^rGD$t1m(B0KfR|WRdRe^rGDzLw!n?B+Gzka&^ zuiuXsS)r7kDVbAX29E^6`8rczg~n25$;f15f)Jye`9cQuGO}?yd9qZRE{?`x z2aV(*vs8*6oXO2blgZeDow4mkaWauN3aRx)(GkE|z~lZ66}hS6x)9ZL7bIA{ znj$eXPt<-+C`1&&kZFWMYzakTW_~VHG_&)zL@dAFq7>z*jaa?qsLZ?6TcYBc)jMfq z-hz5d&FU?+tamb>E9SFi)X0@43;AiQN3b`R*XmMKbSf{ZQOTw5a?83W-h!&j&8jZ9 ztoq#C95wb-!pI$R^gzMtH#xIJPh+^LCRfUo=41F%m|qbriUW%*Min=iP+H?+yam7z z3$A@ZX$j0!bUvRyI+;o2qW~h7HFAeDGqGgCSP1}HR40+7ULiw6x@iNoB?8IPEEAod zQy-8@a>YPxiUBm^(ZdJlqnTVfA1lqqb{`$*$M+xNu1roExty8ZvTfV`8yRoQ>m#ZN zFEtwrMTiP+V}#ZY3zp&M#DbV`#X@U}1q~C_Q6@9Rl2M2PjcjJtj3v=JjHBftAj(ml zdMQZ*uKSS`7d@f3L?HbZbO#!yU8}FRtbPhZVlOcO{|te_(ZN>riYnN=Oi za%s&)u4T<9jkjQiAaYIWE^;mFK4ly-3&k0r7PTC1S6F*ZifT^7Q79+ z6$tRn5a3%PfIeRW11qezg8RH`>g`tTmb1cS)|g3|Kflb2&1QyT>zScNKWb!RaFAY4 zd@Qe{>v~impl!7;h%VyZauQhWXKz8}o6QBq)^ow1v%^EbRYpF{iCsoMvGsf~_ZG~9 z#b)zCvGshAbbYB{q%ygQ*^J31NHKJQLMe7-aegY1&u-bebN{~mW8-@_h+|v#Z#%GW z`|_nj;G$Y(Ae7u@i(>29B9=jKfmk$~FN&?_i?hWf=tooL>^;3u}83u4A$B%%e=S`EIrK|mFvywf8j0f8%AFlapP>Iw>!oE z>j=Hz!~foohk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%E`+W~>=JI?k6J32Z#`#b&k z=?m)ed7Vd&bX+!c)|HEC_Cu%FIF-oelSXzjUo0WEq$Em*=ggcKF{ct{iZ-uCxu}BO zs;n_(^q^iHp`TIh4u^h*yZ`<^cXm~n-Vi)tM44HZrl_&6uany5sla}zjhK*Y|HnPQ*PB z*D0tb-imM{1qbEiQCS<61?)Oa& zQCZa#jz}WhVkJc!U$lxs*zvd(i&NlL6PQdH4+T@q_aB84Ep zJ}a+D+~tRdTaeV^qC_MmUf}gOr-&T3pc;UcBD@gc^)LdfirlCmMrBD;If{l_pCXA- zRZ+pu=;3v(Ns8^-vc6ye_7bX~3K~e(x243xl0uOMY4mWoIY|lPBUrUW*vvROgzj2P zKEjI>K~@5MB1meAN^J>dYEmSeSm`_h!j2rixHU<>j-<9!d}<3;My#By~cC2XlKZOcksL{v1YE1bp?u(ixcqXJH7L`6{Lcb3n-aKKky z*Q94cXqdSSw!1e7SK)uQLq2Ju*V35~jEC^7IGrz)@V8(jp?fyC37Er_D34+rT;(B# zQaw}E6j5JYKKp_eObJ2*Q>jdn%#@4*>{pDbL?M#`d-(!bxvG-X0;vjVUZq&WHAq!c zH1(W2&-eQ-Z-SE`w=bVVz~Y9+x64P0$enlRc`eG9mQ%hW=&t;8x+00^-g$0|^0noZ z4-surzNqsT-nq6#`Ac-`Qj|Fs&)E%sq=?D|xpVx!+nV5C=^30J7kHV2u5R8l9Mm;U z=G^O}X^QsF+?p2joX&626LG}940;l)p-audh$j5EuqpQ>v#P`T7k)pc!M?(7!y>`}_5r;Flp=qY*=c~@0l8qTe1 zL5~f@cKyIJthd^?pDIaB`Y&c1-1^*EE$FeiMuncTy!!D?@#J;wl3b`cJ;@m&J zq8fL4p+!+>Ig8;1Di^CJU8~b-SfWoUwA#N6zYcAn^Zz@1|KJP#IP~?<1EEA{G&DH$ z=R+?IeSD}ew0kHzbawEk!T&e-)!>QX{^0t-e;WM5!RH6>8@y|9`{3}PFYwoa*8`6P zCIasXoHg*HfiDac25uaX2F~{Xga3E@Px+_)SNY%B|I_~8=>KH@(f%9zh5obq{-W=h zzNtQ~FWCFz-Y@sQw|BhvoSwhvdA{e7ohJvH&gVMIoi}u@@A&7AA9Q@O!|YJN`ig(vb4QP_V{Ck_kxIo61^IeRrtROkHQDov&c=z8q?R<+}CHed9TfWqm|v}ygs|l zcTM(<2atV4Tti&f=OvzNGH%|Fj1l!67UoGKm(Jv9GpoXK5zoT*!`MD#<}ZJTgLr** zo9Vh2Zm?c(@UDNsX1n%)a zDn=b{PZi?(jfr<|L)yBLRW@xq)h12pTdj1PvYl=dM*6v9NWWnHDxzyA5?Q41??H;V zk`b{k%cZNY2& zjOF%b^PY)!bF)t!JW!tn!sZ7Uxsg@T!7d;eIDQ4{xiqlB(h*ecO;zgQc(8wOI0^ zV!i0pWa*1`Z5m(XWxObE8DceB`WDry@s)QWM&wmFlC*V#pa&2W@_;2{lYrA6^!< za@(9$6KdG2KD;!7+#~!T@mPK8Fj{@G=`zNxrH$y;ER6Fdvryr7cjeJ#n;CsaGu7v{ zA*{*$E-SaqZGCPV%xdmSM;NzEW7TIRSgZLi+=P4=ZyaFQ(g{n2&%GqC8bPHz%2Rpfv6hr14w)j5_&%TJL4^6BRb-sUs_R zF0IEK@|fS|XvsS^YmILWTW{H1E_uslx8bemI=mIT+)tb@d4;ObkbgrM`8V?YtTxGP zCV8l~BJ4pJPev|Aw#{3_Eqq%hxr1euHW2OgDs`kLVCWHqXtLHQ3K!k=OM>M8~Pl~DA|E(_*|rIi1ae* zMYCAMMtp?<`}?J9k!OVOwRxz?WwYVrJIBgrb5fJfX2yOJUW0t=H}?`hHJOMd`|IX+ zAV);)v05#kE5U`4Jcuit!Sj=zh3R2zH8S&;_t@;&Nltc~#kv>HwqCILYvR=Hgn{hrE9XDCB3RD~Pdg!vUmkh;-TXD>-ZitULo&9-D(o z9-9UB{X#$TT)eT1c&KC`CfJuv{Yc#`b}}xe&B9csUaYE*F6%?inA&OcQ%xYYZKkRZ zFYC2(+niMsD7VdC_2H#G$UVY$5|7oVl$98*KDng3$LHV3GiIR)n6qpJH9QEjC!4yE zYqM-KTAR;ivzoJ$<+Pcs&1th($vNDCoEu`qU~M*Huabx2|G&St;0qP{9vXT$_`d$% z?Je}(6!>1~hYk+z2wfgrH~3%tj}6`wxYz$@{ac1s4Lmw@cjzw$|0VED-_XF$ zzKa9j9Q5_S7W}iJ|1tPb|Cd6WLY;x11UB^l&!O-2|GEE_(BJo;=-)H2zW)=wpBg+m zw0`iE|JuHz{%8I9z_tDTz3=yb&;O3z?+*Nr(C-Ew8~9eA*!PcpnZZ@CXIL0ehkiWx znb2K>O79;G{7&e(&}&1t46I)9hJyEkhk%EGhk%E`G7wnZHPVTLvM8@9QM&k87JTnN zyK7^ofQ@%J!@;J9=Vadr_K4Tv9EWRc;W#V!?qhG_s9A%{99#!^PVn7J*+f1nYj}h* zIo@}ivMCZ?#CI67fR3+h5k+_bl#at4M;?p0kIJ49j(+v^~!$-hERcwR*=nCd7|fjeeB0Wt7_ zI!fwMDq2Dk{X;Hcp0ZG#VeA598`R)PsB3)(Y5@C}D9V@StU>?@2%&J5n`KYv9hkS_ ziJ;6dj>*~!b%Qs(P+}b8d`AE(Ji_k?oLZ!U5m|uYhFTS<=Bx%_pDL%xhaGMdIf}z) zUKFMo!!lKoiqiSKMO=enT@*nZc$@&SC)Ebg=APCf*8dAxyC#?0++^~$|CRsUD17J)o%Lx;#9I%JeB~(=5((D0; zrep|7yve}OaG*ntqtHJwWfervP#FG5LUO2UT?aYf6Vi&1pd11+YiMNns^bjIU?qzr zP>5E6AQgA9s^c4&!!Zm@sN#%eR221u4DcLxC!w%q8i! zvBIk_%G#|&p9u?u3AdYbw=h{j&A=k4i#Iz3LvjHP_~dVDC`FTQWTbE^1fdt`k0>5! zq|S5usc2LZg;Qh-VIP4g04ZLBRB=E|;BTO^(Ico=keu=A^^6)Mm%1vL6tumKMa#+_ z_K4bo8d8TGsk^O5=z*vSNuDB&H!!Y?yBdoU)a&RGy+b`5-3LN*Eiq0K54$!9sI-%n zQ|;iQdJTJt8izQSyA1mWe7tO^v^@xQ)SN zH?2Tab#bee4N`($56eNw+E|4tNES4fAik%ex~h03@k9m7U{i%vFWM3I!E_kqEtn23M%VK;@DULqg<+8i>5q@I=-{MhLwf456zjqCi<-bqY99 z4R9^-7JHBkbZ7y$mjiCf1VT`tctSlU#sr`BRjQg0W$Y2$l!cg9l}ICXGt1%96NE79h5UC9X7WBYP3*09+FZf#)u@9wC{! zBgP|H-oVNttwvlx+X$DiC(u}=YrulWt#4ofH6ON0La7j2o#=_{8glWH7G?lrBmf5J z6Ec4>D;s^5hf+e@!eq^&4?6aUr(D$VMCC7JPpS~;+y(Rmh9gY+6^hq%ej|06JI`re zv@OOeojaEvpqG;#MeAtF+J=_|nLmd;LXp(*02$0&*D&%JK%g7xd|MXY!7^2QF|TT? ztw$L2=rvRqqQe@6x+roAFu2C3x{Atzxi<=j-58pkJIl&NkU-{0Zwpe06-J!`pg{03 zW(~1NYz)O~3I-)5Xyrl!Q(KYhlm;7+66Ju!7xg1F14*ntz<7WFW7L8%1laR4q|m>t zt}9FZ7B%WvXc=f2S?ObZqAhtEXfbYKXz!(xSoZ_#=!%-wLnVP}p2k}0_T7}l)*Cco zQI#&nqYVH!Q02~{uJwL47ApWL%G3G(dfx|pp`)P-aO%G=_y@tM;NalXfgc8r2Zjdj zAK2{wZGW==Px^1_`&nP9&)54@uhR3io*mu4*PX=a{9|2W=MOuR9Y5}PZ^v0E=FR_< zyEhE_)|5NO#`@Rze5)w-m=lR_<*~?^*$SseI4#U`qp~;(_;pybsFo>&ONy@U+PV9> zV|QmS3Ha7tUtt3A9ULxjzSAVwgF7`C!(w&=bH^prR8`_FYPYWs_|}LOYAMqpRufLc zy$pqHq+Lr_Ak%&|;@?Cd6L(@Td9*BOmQ+%bG|pn<(7J$c-42I| zN~kD@7q@^i?!*LmQ8Y^tWQ&*)4*1T~E5s;JkVB|GY>#_EoF-c~R!i!`X`0<=cU>It zT_8IotO!UI8Z`ltTq#Jf$FZ#b8Y#d?jkhUGyc1%vvxb6GynDnccS0%_I?Ym?rb%8D z@U5yeP1+%|>?V<9*m$`UktI>In&jYx=u+cOZ74RHLx;rBEq0oFi6V>?o26im$hvRo z0?;yQXvsutc`@tU%f^h?T_Vu^6kEa%o*(e7t|*O!;nc5rtUz~KoS-&oGPoZJRt?LY z=MDN+RrO>=KfOg-Qq*M0y_X?Hu>~}JE-G9RP$T117$+4j0W)1Ii`KLqPZ~P{QY6Ky z>|JX?XN%pOh(hYnX$(l}PC-(5cYQBPilc!G=b#599SS9fz%qiry3-VNSjW2QWtbYO zy4{4`YXZKDjyXi_$h!{d6~^LqCkD$)_r4-x^cwIuu?jd}>0pt`R(cCTk-&HQ$3p12 zmxR3(_n{sOQQht+iL+{HAVRTI(+P7blgreErgEnNdu(^Hg_2Voc?qGbIFl7))}fHk znFkF-NJijCx3V=|RcyQZhK`OD)fu+S-9xog6%5->@y+FBMNOsYl4QFlEn!1~dyUmp zg&>CZTkNKy2+s)T=`fO?Hgi*EDq~b4LeH6rh@GiP)v@4r9XvE$kYte zHfm(E?m%*)?H#zJ2ArtdrIl|80LbGPJLOGOq%DwC~^{EwTI7?A{yW+>UGXTgQ~SYf^G*cRI3l z*S^f$%?C2M*@;>0*8J8Tx!v>ow_O!UPTsUf(`BBEZ~`p~;IT^^uW(%vg-)yW z<9@WnL4tB^EE|r+9-;my&zp8I#nX@bryNJ`$lD5!*t88#(Vpq3mn~B zO9ZyDMlNYa=Z(pHp3yoylP{UE4f2lN*oBE*IWdz==4W8}P^fDyFaR>xrGN(zc2a8@ zs7-P7M7$Sz0x)*02?kfq3biOAnD%Tw)u=0|e5}&20){TN^^omz3~*6(ER|u!&PjF! z&7OeoV$AVDz_*GjSek?#utVoa#>gMZ5{5*-BxSe(H-!G7#T=iMcp+oUM0_A$P@<$b-Ci{M$$&$Q401JuwT(-6<_Y^!cqmZ z0EUwlK-Q@PNn9a6Z)B4O;^HSvBgZf^tmcW$OhenE%8_JY265SowJm~r$fI<8Aj;T1 zKnh%@;a;nT1re?dRDBW4C{YSoT+sTz&v%zEG!z``Thk+U?d{x#uW#AUy>|_t?YpVG z=Dzj8v9X|UUB7QExT?0A*$fcPO|bfr(OQhoLncd8*;5a{fAQXLEPn0v)2}}hj)WH; zc;d`GpFQ>Lw--M6#Z!;pxA5YxU1mR9_|_|@p81INj50p=$jR3~cJh@M7T&nGwv5yF zzqIhdCr-Zl;ghetinkYDePQtfA48FgPrS77;s+K^eDQDYDdY3W@4T`2p>JBBPe1U; znR||-L;|L0}leJC6(-)pyc|8u84`{=^wpE~u$2Q3Cp zedF7wzWo^#eCCBm7r*kAQ(t;@@%Zz^Fk|w}m%el6OTSk6iqtcocxu8GGIA0@$Qt@$z^kBnPhwr4y!PYuSCR@1)Cr|C$D&$<$kKKKIVBIR;l{?FK zxU_JMUYj!}=TnmPJG|-IncSS23Ew(ts= zvk3dy9PVq#A=L6uKlAW6qG7v;Nu!9KrG*P7tg|yET;qVe#w>1jFcOH_AHE7^xB0nn zY0}ITU_zBL!}**|hBl5_mF?<4|KOAjYkwDqQ99xfG*uRxg2CQab!d6{*xmQu753zv zI_|Ewm%J+&NU#Mj(yGW!-l4QPy=fD(w>7vq3nH30esOIRU%VWZCVMLF-(01MqjZL= zBG5{uiS7O^Vobzg6;6Lu44jpaF|{fHBO@J0S}pw0$U9g0^bH@snrXD94V+BPL{0ol z<`y4#_{_bplU9G>nS~SIIP-}Y@Zr>>pILnDQ>V)hEqwFo#m|0j;Uf>8e({Zk7e9aM z^^czV_LDRmJo?7TH$Jym{>s9M=NDePXUFcvho3z4(&x`S^YJsEdl?1brNw8CFTCIW zeCow}PJa7A>-niKe-;D5!owdr{oDtT?aX6uSkKRV{{0JIdCmH~@Wgjcec*nu2EGkGaPsvhL3;7QC&2&0SHE`hmB*`oq9^XXI1K7*;?!iPUYv#BTSu1D?qz!PZK(=UE*;ekg^efg==FF$eSV^1zT z{qfUpd=yZiMyDSA+QNyio%!@53r~EW&BR_L4p|3)aNzUFS6{^h5i+#+>cfz^ldnB~ z@{LcQd7MOtQW-gj-NJ`Hg0D2y1N9f4IbD7fU(bB%vC~h#fp$b8i(maHI{3n?Pa=sV z;}uLaEveMPlV1cOOjsdmXYP62(md!z3nyM$c=i1xc@MpczI5`H??7gNGXxzN zT7WD*R7R&gU49&*NR!|bkE8R0VFKs5^1}VEp8C!gPQLaDYVn6Zy70(D3okx(`kOCX zUrCBS{WwZEeeWxa_uPXp?JZ`koVL7i2j3?We6)u*iYL;s-yr_<;xM-PazY zavpi;*d3fPN_uCB$?fStdsDuaZ zCw^Xj5EF4~#Bb50mZ-n{gr&b0SixS#IuUz+m)atiFsPPgb@tSz~ZJD&Zq0jj;>!HzNWUu5?j~Nh6$`K6cqg4hA3f1^l8f^vRGk^#2WAbk4 zA>bk4A>bk4Az&j=j+HMO^lkRx)a|_T8lRrVo^1qkq*4S1tC+#moL>l-%#Fe{Sj4Wg zNT*PhlMN?D#*rZ}VZptB&-nWA_&g>|#Y4q`fk^naBX@+i&dihlXwsyeVtN+7BYcyQ zJ;bJ2sr-cVs6e56Xv28m*l;S5NDGq5nJ609GnNW7=H16{FXP~8?M9s3oOf?9SYB1i zr;Pbna;8|q894i5O})4Xwx_Y#E+Oi$76rc&&Ke!IbvlH^u^PRu{?+QD|ClmR~QFLZ%A~?WuMVkf>bhR}d zFCpA((m?If#uN-L3RW}(L?nGFT6ha=Xklg55D?#S~R|U>$K)> zizber*l{R35rri=te~w!b2^x^QV>WR8?lJ^#w*Twb{SS+=N)#4vYWS;Rw`y)!gl51 zEsY#Znm7n*U;rVz$*&A%b#QfZ)=2`blLU?8b;H71*QGwI)>CB|iLGTurNNC1(@Mo% zPJ?lzY;}7X2f{e><#4cMuRd#1;0c8t1Xv{yiG9u)Hud#mcSAM4qj7*JpI?S)?kO(sBK|UO~KJUZmL9Y zS8YQmqYO(Zk_TqTLBx57hPylv2?W(fK_G!xqSZL60s_`!#|Z-%`B%t*+Ocsc55a1h z$sDW?mKH>{~EVOCpLqlD` z>j(ea;PF9!;EBNH1FsKk_y5>m_MhGV#s2s7eXnnz_vW56J-2o*bU)O+w(F&?J)M8j z8SnIUNRJ+zj!og5Kej%G1VkR>xCVnNhcISQE>?BK66{*+HZGN6 zYqiEP?48XND@NHw*`x>2seIb72_sxb5fS3ExHtp02d;3Uy1Er#wo$ZDUEVgoOO(m@ z$}#q&m>*8-E-@c;CxYWkYd~5;M6DRt-c^Q$73m*8*~8633+5dvRkc7eLxGuw{7P=<}wnz++$u-bAcY{d*F_M{!9N5@4 zRX4|XZr_GEE$$K?JFwjq0}Pjvi-j;c1X2{cMYH7&Xx4FunQ6qG%vKa1F*IX6iZUBl zn3z#GP+r#-%?@Nm^C2` z#hC&bO**njNaf%MhV=y5f>!iKC1Z?ju4iajVHD;gFyKpJ0I^FcLaoEPGRJsDWg!G0 zQcZV9Rf3msvlQ9ZceC$>OM%m0OZjOy5|%19i^Oy)Ka;S{2=OtSDV8vpAdojMP|@9` z95V+PEYkd;Q5WHvWcS(h-Jt8}yAr}1(TdXn%b3nYooCS_^GBP|;Sj&voen2DJ`_L}<_eVJSnl6)6a%E=g;AWTxbx7*RJ1hPq$V&i zbsZgH{UWQ5m(DzD;&^vqbE4h}V=7M4G+b)hIgqWy1USxAe&^A~UGRI9S zk4()S&{751(4(j4Ct#F^z7b;&n9(_9EwIa*mWUV!19|s>5Gkm+HDLV89L9@^rSoBj zB#HYn)vKF}30001r<+Jpif&Jx?wkd@jvpYqDifbnXFFjn_R z9MZI;!xY#on7JH|R!gYsq}o;<$H=b32&ai~OSf<=#}3n|?+hbFqvEti?Gq`Liq@tbR&$3i>0~n-JUn(RlMYAs z8l}m*@4m8xZMH4Pj$KbXDLXJwPn%BC?K5zJRcOV(g?_<`cJ|mY?7iJ>?Qbk;UqrZY zof+WPCslBU>b_~>xX;;Osk-wOjZ9^SaVBH$u&@P(%Qnj}+xZ-B!U&A-Ea?C507 znxweX!o_Lsa;mE66P5%Wnu2?S(;;BpjG&^}gLSZ|JYdSyJc4;zp-IJL+>GYVhK&6m zix{o{H~60Rg`NprH}sRC6T$x-d_4H>!9N+C3H((+8TiA2xq)8)XZ)M{zuQ0F_tU=P zeIZ2c-`?~6o`XI8-Jj{^y8fT8c<0YLAMM z(GutCgNKfeZy$44l(4u#WEVF@O}04pyv3YAUvrv!x~f3&5sQ{2P4)9^&a%`S%i1D< z&!T`Z2(Dys$%x~ZnFbkbyR-3Nx~lbP_{N|^sAWp?Q6uBtCJJ1I-21YEogjNZz%*-i z@n{QxmO<4SW%WsOG9qG!xK~9)Km@B7Po|(UoT^lI8k{atdC*1(5NX6+e&I*0+wwb= zL|1h5AQg-ye=Qw+rK-^AMn`$Y=Ccxoa}FFDM=jbSwRPb{qDJNzxr#p{nMtMdg{i3Z zxcM|3XEpY9m5qdu;tYa!8R$ING-kqpUE<0PKS=|=XK5CT>8oo?;3g+Gk7P_FF&B4y zOYgi3;^ypZqC^KZn}F>X=UzT$`|jNn3C?W)NF3!mo0>J-id24!4Gw$P!_9G$_{Vmm z>l%V+S!^aj&2tH6w!|%wFOq?tthy0Ol}7O5u`N zdzLyiAGM#j`>j(|I9ESpmZI{uydAzBAUezFT%xWX>1+mmcexyHTp&pxGf ztA&srbl1|-6*PwwXIh%Q4I~fPl9#InkDzv&&*zU$W)gW+t`y4}xx<;67_zu4Bnh(> zcPT-NGv42JE2uf+PtK?Sh>wnTaA%mhYqJ!=p2{D-CE#1{D2JSugMT73UUXW?v1N=R zjoOLgj3n|{FS-|ui;LYAtb_};Yz3RS8Ea2xP@0;DH0SeKhaN%bJYx zI4yH+DA)+wwJY3&sR0h9nTnX2$L6O)2h!(kh2|g=j+fz+kb=!l(evh-gV%`Xv z&bG(YOfi#mXiggQhZB<%g=jI04d6obko)cmPS`Xoncb>}6sK$D4`BRo8g43&ed`GJ zR2)*32W*C$C_t^7G0cYY?!`h(nh@0BNoNgMx9zVHL+tuHq*#lYB?DuKd*QHbb#Ew9 zfh)IF_+9&IbU7*R+R|BnI@)}+5a9>rK0|>+tuw5bH{C#|I8Fo<+D&t4G`iUrr_l#e z#Yxk|b=Ekxxpw>1UggH4nX7fZGddm+`% zU<;RUv#!Uo2gPW5zRAQ3XZB5IL`ZRFM2S5ZlN=IdaMQ*wvI) zCn@`Pkz53Axi~mo*{2|UmbrblbL(|CSZ5R0?!CpGqKJF6o1|#Y)F^!&l(@5rd=Qoh z^Vnu`YV3S(1F6t#uN7mW(-&^P7IMdIV{mSUpe3nFUtnKahy$lIYcP!C_V{qiPN*I1 zU9j;11y-hz2bn{1ldV9W83VZKXQVixdTzc3l2%i+gH4ViuQb~uMijy(>s_Qc=QI@m z-**;Ue*Z3hJO6$MpMQXV-^ai2;oooLU#a0=5#RIp=lysHcnEk1cnEk1cnEk1cnEk1 zcnEk1cnEk1cnG}B5eW9aNv&gWkn{9f?tp1|P$?czJ0^ZyAR|HOA?XippV%kL^* z-naI)%R9?EnZY_mZaadF#W?$bjc|mIgGn{>GMg#JlPagCb&+e5&G)@+H|!YOzazYJ z_x2q(hliVFYb;FG{?;a%AmEMQV0K^;Mh+0WpE_bz; zpau(w=|@V*-sF$H&>@4;AV6&t942o*acd(4^6u>1jfEttqE`u1)$&<| zTvV5leec#Aca>ZBZro6Azj^)U?3)ji*B2frv-j@4as3uPcXQ#^U4#SG5kS{&Qly`< zK^`}L>pY_3F7#f;Bh3ctPx{56mi`D;IAtmR`j5bYb>J(N0Pb2#%zbvluc59h-YK_- zp~Zkia8$(}rH4B!{V!UHFXHYRXvBmOAXtk7Ttfim5+Bd+oK?#3zUjcBmm%ZAM{n&| z$B^n}^2Z&)GQg+0)j=9L8h&so;ypFla>O5e>?P^XI=LF`^GlS+q_HW*B7bnr-&$$~ zi0MO2sSw%y$AVU?(OQCA9cTe}9s?*1pQ_g7AB&uLmx_(fQm27{)w9Tmvek*NPVX5I zTW5&~Hu*&A!m|6vpu9A=sv((Q_-J~^IQFbzO#ayV;L28;%R!^$BRrtDr2VE#DQnq( z;;|O7+B{1oXItkDufGkHd$+FNxwilkXK8v{+x=xuZkO-@loKw;wx%|?r{Fh_yL!n- z;Qx}|3;&B~p}{5CzQecp%JYV58?%Vmf|1yM)%H>ozQK%Kk~@%XzSM=9x_qc~>{k9nym@*49oTu-GGyMPYnPQW@+18d*vD=*d9=HDblfK?mLtX$yr1 zB0d98?*UF4?z#RG@L`Q}+J1k?d_c%ZOfBR1} zXbKCHp{76%*6pQLxYa;nEK~47bERGPn{5Q;N9ssLE&3HLaAnWhgOnzFH2GOhYqB?p z3?fzM$6wrWjy?PG%acF--XOIN?vWnB4K}w@Xm0SS$0ED_j))1?_;QaRIm-6kz?wyD zMNg6}lT}OIR&{vAA(#;b(HKxf`rH-77-DZo1wvP`QQlrEZX==|QZt1T=~@l~t^$ws z*6`@8m#U~QAyWW-At|>aQYY1c6qlqT1}LIO2#XP~?IRE0Mp#vBKPQDhV!S$FHfv0^ zjpJ|-iM_{K(CrZK8Z5=f|JTHSI=HR- zJ&(DQJ2eTdkxnlpbEy^v8t*nq<4)1iXp?r=kdFk4Npk_3R1ps0Yml{F>zS9faCEu;&NgqxAV%eXWzpK z^QKfa33uv}i!2#-sZ#3E)F6kQ_~symq&x!esW^!=cYdW z^shdB>CA7RdFS;1a{AHflc)arsUJM~ADw*d#6LOl@c5q||Ec4jI`*r_E*<^tqYsas zJo2kYUVG~AKcyW0_YYq>^qYt7PJU~$KJjPx%wzv&efq?N|5>B~nmpbHfgs5YBx}3S z1gl)KwI#z@f)k02P+x5cY3E&J?`+nWS*Rsc5b__iD1|-3nUUpyvWuX&DS`?O@?Ayx z3nQm%3UYo}$izcc9#o{FnOXk<$&l)jVbhQne31o2AcX?aVA6&n(j^-vOXXqMrJk^sY(Z`23V$xFcx}ipa)e@ z9NPgrm)2j94{3~A%fSz$d@03NEx!Z{)wGDfB0Qk@1j??$ zXWk4WmwG_;dkpUrJKz1h1Snlk09CG*$R`~#BVY2@imfU%cnT8+Oua4%rg}poWNwfi z`aQ1meP8<2iHVm}@Pu?M=_?U_MfIX6&E%xfW2n!4={d>w&2heOhyKRH-$yj&C%^Pb z$@krHz8`s`4u2o%%|895XC>bs;;k`C?cs+UG6(i!zsInjuYcc(i7%$$zqd0~Z%K#u zC>ZDH^+46Al<`~_#gyycD;Y1^{Cqs5TN!6O)8j6uL-+$A)@SSABN;E^Z+tu(DYV9z zUzEgRcs#`YEA>xE#$zlTwLkfIkTYY9=Xfr6tR5QA@jUm1`gcpl3#C*z9)gy~84opV z#Ps4gnt8VVjAT3}h{O5e8_2;n8lOnQkzn2teL~w%U#x$ZWIU#8^v1Ktn;)DwQ|706 z?hn+b(#JC+NkQv}4S{;nqvwZeK`HwIp7-wg`WeZ11Nbzcv5YewQUHkOM`^lp_0y8^ z2JmUB$Qn6%eyIKvYBdRQggUQ~!Sz#;@qk9sq8NQLC+l&>gBBs4p9Mjq)la66XAP{M zh5Q-gj2Fdt4(&hW9dq>h3CVbIen!~{$5}rM$v9KyhpLiB{kUYjI6s5tjcj?N*UtpQ z7LSK$E5ocGlZ+SVXNdA23!kX4#=|9t@Cn_?v+74B<3;?8^ijZuX!9}Vr$$BVlJsdJ zWW}x@k&GAZ2R0tXq>V8ivRtO@KL~outv@9hj~&;rANY9QSo;sT+jxZ85I&J_$n=_r zPfRSO$al+LidK+m_|Vj3x-W|TsYtu(;y9U@A$maDx@%xj+~y(ah!KtQ5s@ZEf>X_= z5gii|;>i*1OFGpIgbXy?=A>jqXDQl+d_*L1l#PfC3nmh2qTYCdt7$l^qLw3)|6qaX z{2%)NKla)E;Kc(B9AMx80|yv5z`y|p4lrJVxG{_@isPhWZZ^qJp3^Ec0Q&s;h4iPQh$^xr*QJALugAD{XMryiYp z<>r+)X+P zBb@i^3biV?C>B&%3r1Mcq!M# zO9k&U2;Urj1C5Et-3}i27Czmd35$#ggZO&0VPh+-O9}g4Y2(eA>z|HKDfwE0xhuhK*X?_Fx*y_c^&-=8hq+pEZ@40r8HbvZHJun*NR zsq^yzYxwV@j^JE_zM@Rc;O}MQ#6sp(=>zl zqxuRSH7-BbU$0(#TMzhfnOU&4g5Xzs8Sgmr&&Ahi;H`l*;yvuW3V$!YJ_GL!tWEzt zHNbn?%yYeU8F;C`CjB>lu#7ieaz4ps)eocS&8XT`5OS%on9F<#&lX<(WH_6_r^A^H zJYVF`hqD-bKAb`P`SU)WzhHfmpdWmgAdf#e_hmde|HiWnYH=)BZw9YNp<>E4iWO59 z!(g$iOZdjM#b?9Wq<~HGW|Q@jMKhD=l{c}aQ?46{rB)c2md+1zySsh zFmQl@0}LEs-~a;|Vc=)39zHYinP-k4KXK;x?8IMlirs3hj9{Smsah0^=|Z`4RAELW z7eWa<6z$Ty_s=#<9aNb1bc*@x1Wo*XcG2I!Yf2P)ue{sURSh*v5#Covri=DPMMJ?a zg<|yE)Ti5L@iuhgHs1asYSY&cvya$P`lp&#(YMxKrVq~%L<(Y=TL>pS`@uy;^6Y%0 zR%2-o6oir}EQ)sQH%v>Rn8x~3`BWT393=M=~d}08L za*WVx9Yt6BuZ=rSxj{95cRds$$(8u43f07Gw-pU^#M?(BY^~X)lu1gkRt(BSjco<> zWH1YlqY73GU%^uQYko*dF(mwze?EVBYU0_y{r4sh9XfI5(CqBj4UHLH1_`4PL-mhL176EoDg)D(JVSanXADzJw?=%Gl*yt-{BdQ@B}Z$M^7M=L8C=4 zy=cyP^HqK+N#97r&jxi$P-CN;@Ge1( ziANZs5~wkysOi^U1`gPh@|j2Tb=|y9JdWn8IeFb4p0FjGa2s_6J5)1w?-R#j2q$hm znTczNr41);dwJa(o;YLQ;Yvdmb$84|XC|H_L9(-Se0KJk3NpI{<@Z0}?3=PwloeFi zQvTVG`~u7ynb$lAf#dIgu=DI>1om_s?CW*p zGOLyqq@jWIp;wK00RdYIKaUEU|A~W?|rgm7<+v-X4Cl znP2S|gBA({2W_gQOU8qlfoCWIV~b4Ht?%a+025j16deC8^%ByUxeg`hp!5IPiSESI zFHYs3{>`V|GynKZ>&$nZ{^irp!`J_DM=^Z9i^e45%T$ z)~NWXtebz>ETABJ8!5bM1=#Ydb<78o@p7uGXzHb~h_7bZrnr7NdTfK2z1+Hr5|GvS z(D7k69&YB#Fnq#X9*#@a>B5TzbilHys^XfUnyK0160PWo%FTai0V7A%LaUwXc9%xJ zR49;1mHpd7DM#_lbmXQ<>9Mu2{A6$i#h0CMW-zyIv>V+PY(&xg){Jhx3X19E*HVgo zBYjOuVO8|lVddWPJSy5_m=oWN8k+rK#vcWV5Ru=8s;`Yft;ei3;mzxT`;HlJt| zT9!(qQLYBdT~t_R#X;G81FCZ%F6@djp^OlajM2{FDgxOAEnI2oFlakS0eOPc;FrFD z+O$y(?rO7IuQZ}TQDJ-~D6QtPk;Q-`m5rDNQBqtF>(V~Bd}`vEsLW}#+5a|;l#VS! zH^kcqX;Q4PDDBSW&!3)nX6OBg%z6b>84)AlE0X+mV7^3==vD04FbQCx*=S))6)sa} zqdqe`KYw@W=CzynnZ17N-L47)<>JDdZ(W~Xn3=tqzwySksFm&ZyU0;Kqw&W|wa$$C zVhZ*(Go{unRSXWdNp}X@$0Zj z*dLxg?aot+H#a?pxA3k$Jv&D&c-X}=-n3`3KOB01UU%pL&tuU5ZT8BmCIQVGBI&lsXHM5sBU?sRs~aS`DMRH{*3GOn~_3@ zF0+Jlalyz13oU;JXYH)ZRB8I1%r!bwE-cIwB=Z}4I~ULv;vkO zni6)_auqy}M+@}7x#-10xyTyWzmY52FZ%6345H&XJp0jrvOpjr-%?nOeCJcv>51nC zKlFZ}wl=0nzv9Vhx=0hG$!W+X7II`QzROVZCz@OZf2UKu<53psA*BM}MvoqH`!B1g z*F6)>$M2Q5uRyQF_AUGEm14thQQqp|1#n0?N$ZKA_Y2^KUZ{ozw1<23?Yr$fZ;(s^ z317opjy)aByo4-tuI<@IxF|bM<*7pa;cyzbV~#LHOhQ~C{&IVJt=Oo|%w4~`cz5>Z zZ6pSsyE}hx@rrmp$VA6e>L$0RW4dOjvDb2-jXMz#xTNiY@u-0m!_dY$D}^<<^%UB; zC9P2ge=$`!P-9Z?YUmNa`tn6k#mnJn<(A(QrNLH-u4>UDK`RQY3(f&V8=7N;JG%H1 zMu>{tqX<*4&^`TKYxw0Jor`g%YMOXIIq-yv=4|4|rXoyLkzF|&g~)@7t2FBQcBAmHTi+;Lp?)0KN_NpHImlO7 zG*#F4%ckQxL0QvEdI?Dv#e-UDJREOCJUlpmYU24GQmg)Q%U_GYp|djdA8Kmnab6Zv z2X+LQgK*ZSsfKG;`y7rXuSau+=k?|1Ms@!W?vJ5Nq>hmWhw?L+Y^IB+P20tb;`t=VZ`Qf^b`@nuwbxuo2M zGYGkY*ed?B)>g2AgP_g?B-Vh}Ah4(g0gip}zd+tt9l4Z4{|h)NBKM+c(ScBP zRMRl79A2MGPwDQcOEyc~8Pz>7_2Ie)v5fepPFdusV1d)~M&Wf2&||uJWW_|L->d7h z@*!ES-u{s4P;S}5A<^%GB{7jT*aKjYsTUjT>iQSbhqS#Vo25gw$o_zIsKi8*i7g|{ z!dQS5o#@xVI9PiAM30q+QVK@0uzp!SB+D1tA5tC4-Z}VT^jjKqN#aq1Jt(!{sgT$h z^7E1*-6fkP4CO<@2muL{zAy+9GfL4=CHbj?Or+h4<}xmc!4T)oIo5T75K!C71gpT8i$fH|e6&PS57O^r7h1M8zkW$Rq&qOA zg#r^oeDM!sBWrokD`ig}91=ZnTy#)=#F<~WB|}04(o-ANe zp^G?QSl1;(>PtL3cSyLZt{EvC9aMyZD%vIV>#k;^=tYc*SPwQj8Xd#_{JJI?Qd=_P zdj&(PLkYV1MvsO>zX@*3bdbRwsmd>MV2^Il9C7$^ZS(TI!Y)4xmf_@)Q5$O5;AbgWvzCWNMRn}U_wu{= zED;$ixdNU59K=4$dqCIVIuL7@@8x#+S(tl)1RYF)bgu}voQaxF-m`HW#%C|?^0U|y zkfs2YS?C8p3l~(Ba~RF>r7(KMw`&dHf$yLKB4= z5kQQg^4(|KD817cvr!L73t72M)%e2t1<8>563YDm@#AcG zS`>x=WFA*7TCN1EvGSS$^+o^u`gzHa*nKP=Ki}{$b{J{;3#(40LrVjXabYhY%`k>@ zY!eh7(oGv^n)!+K&z(d?te-nYSQnPWifwre3P=Y8#{yO3y`~8sKZ<@ z=1$VEv;|cbPlGzC^psL*HP+w@joNppU8|i#(~Z zP*I59y$dH7JAP>uR)JD*>Ew%u=Gn5Wl3@kD@Dp6i?OKIr59zA_?qVzAi#zLFCJR=m&Y_m#^~ z#NvH!zc0}JN-^H&_4|sxVGQ(XeZ-jMvTju3FKT_vSXKZ%Y@oA`8p{am(g12uxGI{X zrB*b5@XbDQ(22wLz-Rl|@l7Kr4`4^@qsKQLy)yV_A3wfnmtA+@vwZ~NO;GwkXCFhp zUiOQncqf90qN(7`;vlqinhDp^*I-KU2j1*s$hU2;JTRu-#}GP;r2&f6`xx?ZuCNE+ zBn&x~BCOheplg+QXI^;|rnYT562e_yg~L8BBFgQ2p5g>zI~$@A=P$=Lb?ohd9*BPu zHag5*>dg8%DVs53+9`yHHe8h^J|v3Z(P0RDA+DW*=TV6>#J*AGFMH+)c>DBJ4!@Jn zO#Ru^zn=Q`)W4ki!>NBZ^-rh%yQ$xs`kkq7PW=~C|H;&UIQ45&|K8N!p86Y8KRfmH zsh^+viK(5b_oup3jj8HXY3jYH`%`zOUY}Z+x;*7g8B@8?(SR!M8IB3*1O*&S&vmaY z+$}UvUvot-uz-upt@2EC;!YT+P@U^hXCvQSX})^*?(G6J?aBP)-CS<+2QJ?(-u!RA z{VV?u^MuF&`OGh(N!NItT(z8I1LSZx+1k$0{X5t(V^x}MLt}T<=>5rjP}GW==c9<6 zY1^f;Z&q9_@GX>=@dK}@89T3>`o0O{#ZOFs=FsHS)S+YV<&GV?c?SRCvLbS*pn0Nz zo}SliaQ3_wndo{a>=O#m2zMQaCE3Ro(gw_vR*9O zAH8()*$LxwpZHPdGlvcV{^PT`a2; zY@fhtg~YaVOh#=ubdE)BHye)-=j0b~a#7CXBCiQMSFskntlWG}(~FHxVFPs{^X|(E zO&|8*wTG;k*%dDwYF+;F9yeO}{^Zv@&o4Q?UB+3+QT3o=Yxoyj76K3Fdeg0ZR6G93 z31j*bKl%buDouVib*rhkyMtne5+*nnsI=GqoKtG++U-?i?uOHO^{rdmH#f`vZ1ru> z$M*80H>&l8x8KNB?mTSO@82jrygo#!bw9pyB2L4|b8m~^8MXMsBpxxgiQm!#-zdX+ z0*5K^Be!HaxStA2nx&O|6&&Hi?>h!kpZ>%bqt#Altk^4w)lQQiVpKqAT+i(Z6_a0! zCYH9_#}_!2vguW{GRzmKq3Tz3&n)?t2{8mQ=~pW1&i2u9c>uWlpD!NZ2A*fBu17|A z7~{N>Q>v89HdJIN^JO#mXyXXy0aip65*~nhNq?buz^nH=x#nAUbC0S<`R=Q>TV0%c zv-O%ezkTh^=ElQ&TW`JIR39|ww}SamJfPJ8V{hj>Tb=B<0k*)(&v*Xghd=bEX4e_`<|*WXBhZW#297gU$Ks{cY z*{s$L{T#W9&QyIvAHeo~)P{#ki*oBOEWmm7W##@G_iginGTUs{g8M=7^=hYpgAcd6+9{TVKPSyY4hnMjC|9+_A_s>530sQ{Sho8jn z|NY?Ggm7E`I*eoA~*CdiVD{{QT}q z`1!BDA3y)q_u%JuPLlusLH$2M!ohzIFmQl@0}LEs-~a;$7&ySd0R|2*aDagW3>;wK z00VznY|J2dqh_??`X`X8r$W9q9@>r)S=W~VMpJ@fRRJpHYwzxnj9J^l5kcb=|3 zedlTK=@*_papv1+{@~0v&iu-mubtUGHMmzJ|naR_CbozHs|N7})I{nqt>!%-_ zo<(@bGpGLK)VEH3^VF{)vS8;__0*kH-l-Q(ojCdJlYemX8z+C|(`zima>rZJ6?uO4b1x_{{Nho%pmM%=?cnf%7& z-6;cNi1DAnwp7eqP+6P5c#chdS}Kw2r?l>@d8Eza;K(Cw@-cVNd*Q zTF1|bJFJPH7I&BvKb6+;RdI(g@sq+1U7z>~afdeXUy?psOEE>-Z?G<3n+W zJF%12@gvV3HYO89O^&!fEN-`dNZf9HAZ|CmB5v2;7q@GVQrfr0?dn!a`=+p6^)^!4 zyW)1YlhWQ6w>zzr_H}W)-4wT5jgNGal3jmrTvDW9bSCi z>*99zHF3LhUEFTJDsH!~iQCPqDeVg>?N`L@#=N*)pG#?<6}M|&5VxzBh3%&Id2zcl zBW|}}5w;uN%i?zDlDOUQ#O<0ZZdV;)yYAWIcGpU2H^uFakw76aSft2!(uMPYT;L^@Olpb&reN?PKD0^QgF8JtAl) zH>jru+HnZ|7sHyoiIg7ZN zn{VH%);E?n+;N-Ou@Fw|RbZmNZ5w|Kc(tL}!KxReJVL^S1t5YZTu z9I1$|)iOXdF?k_<=|V*35kxdTEjdP>*cI&}*Uk$VrpC%_rOpuko=AV0!7S6tb7}JW zToe$6B1lO0NO_m?rBY!tDCWow6=3aRPk9c~AcTl8G=yFYHkGstm)|XCfQ7V5T$;QT z7je;DCMX-9MB=FN3^?fuP$MnaJ(&tTEhv`0;@K0Z+vfU|}XZ3rmY zmWTyNHOwLc2v##dPMVUbjn*>7{1MLYZ{4iC@t_c8a%``UzguiG&#JW&pMX!lNE6eg zN@%gs$N(#Png*)NHPA=Mt;({A?_$Q#HzSqEaq_N!LFiK5lV)71b&Gqa1wBmx)ny7O z&i|XrSxT>4&Hx50O>42_T1z62?PI0@9)H<9 zq#%R&r>Q@dT>be@EQ_!U)FZEK#D6q9?+JvLE!DE9{KVdoZ>MQlwp`1i(RXQ^iGD8k;I9sY^#Y%W&F!3}+%a$oxg@UxQ$oR`oR=8;Skx)<-sGPRc3Rlg57u#t@ zI9qIli*h`X?5#d#nV6J1F}yimC}yBi%=n0fM&m|O4lGR#-BA57~)*amW9;KB3>fZ zVW|exh$$1Vsv}9&QU~d(a27sWtJc}MmYJ=qWi&AbLS)6Z$539=t5S_dgB4v4+7=9X zAtGSS_XM_XTdKxJWw=HlgD7kiGUyp0GUTdk1VO%E2y8S0qWL3jr5?>+H}aNfyGylN zRt${QSjzwd1c?v>a@}^IsN48+cX}Eu&i`AN6az_r1;-d$s>Sx_pTTXZouYWW~VoR~;Ea)W|~u6krN=ydzZ{ANnZOxc6B* zX_})W*BnWC7+s-pe0}c-X*#7N*C`1lBWh)ij}Iu8kvssU z2u%KtRIkLnQU-`fQ!E|1Vp*qKtzl%G9&&E`KJjK0Y|FtVZ;plq?|N`&yg#9 z4}BzZ#Ei#ZUdo&mS?`c%TBP|nQgsg#&caCSq-lGOT-#&A@ABk`IU6(_X?w1j7u?f0 zQf2QU^4)L4J1YaiPP0}za)mE~pm(1?{(|Fls6{p!7%DZYqsIJew{w6YGqRiN9w;${RKd4C%+3`Ren!t$VNHxF=?yA@|gh=soH*y0u1~E~4Ab?J{aPlB-T>xtc4Y5P8@XYz2ke z*KQW>!!@ulKmW$ln=xzd;PooqK-fnRQ~1gOdf-%0JYD{Hsyw;olmd0uDb^;gx}QftG!dfO_N%GS-h zl~sGeecjq}wmY|$3-Foiyts^H=DR>2QZzDUhR_Ff(h?k~T&W6K%fwgEO;aIVxe7^a z1?T_mM=RB0yk9}wV>mp8Y=-Y-fqDy zXk>VY!9?T?=1P^xwZ=v@$iW{ogL$WEldfEw?17L+#?JyTtXo(KT8;6sfTKh27y*ld zEn0Y~R=L(~S4$b7AWg4y<$C3czr9{uS#IUqDCdf*!mE#VAy}YMM`uR3`#6I0ge%n; z*S1mRI)k~VnG0RH*0{DE1s0%Q`P#P6gG&1Kh{vY_R_QCU7Qih;pi{Y0HF9mcT|%%+ z7TQIcF6qj3NyY<0DDo(sO~uE@M*!7I4(E^RCIT(mm8z6=x1M8l&Ks=^$RSOybme+w z2mq?$x^=ob>eZzl9}VCDOqVAS2s~(l9pOn;Ol0lfI|95k1=Eu&n6Z)p<4@VcQ8BV9 z=wN`NDNB{hdNBiwp_isydUEBGsD8WAU^1UoL$3Mt^=h{Opmst1sI|$Q*4VNO^=nV6 zH`a?8m{gdrsp#zN$<;ZD#Yz$&EL4#m+H1^lngR$Im|BBEcFPE|uc7)}4XWzd$RVu<#ABG1QL4K~ z3viJZnSW5IZ4?SxsLC2-a0tLqz@vy0pl2iwI21$_gEH!Di4x(Uq-gXM2~E*ZZbZnAshH4uC4$vc+%u+gVV4n%;-erK^tNQNyOx zMZuazE7F0-Uwp{?p8kg_+@e?zl+c#WABA+XA^bEA5CEj20M{yy)*o)e8@19Xz;WQ# z!_`MOugvbo`ioHUND`v1wJDH!R&hCt#ZEK*VSMRg zcVOlv81kLn_y|L;#l2)y!4(I}x=SY>Ak9Q61B(a7N#*l$m9ND?=rB#U5NtJTjn*zy z9SzRlk>d=a#Y8$EDvphTgH8s=9E_BT1-at4M=ZeJ-Sd~lRiQ}O%QMWh+8LNRwDj~c zBl63z%R<1g(k-&fk4Gzoz z&+EHRv;)cra(R8`{q=6p+P!7a2)elv)=-sJ&1EB=Zm-vqeJPVC9Jv+^a^fU~BJkDf6yc1Lkgl9Yo?fwJU}0Xs0?!7h(tor|i?7a(&tOdWI7Z4ka=Hj} zcF9xNw5!V*+|_98-dv0lx!&rRP`uagrrM>o3jP{;L>RDEiMNMTjcqp@ zSy=5f=8-GLL%I?R)$EUO8f_(z-vHYUm8t zW0!E`7b?x5MQXYlfFM25m0M)IkFg8Zz!C=%c&&it+!{|)18ta* zYU{$BBZw;2|8RvX@T*+dy=Yr|DA7u@lsS<(AJb(e}tF^;BD?E>|7lR+x|A$TwQcgmK)uoUuRnYf0BPTD!<#h;d)_A z>3H&h+n)>#k+0VKwYT!kdvsqPn}OAfGzb^~{T zg&uGP+S{o3KA*;d7!fyReuf<;GYd$q)=Uq9b2#p$n_DzYC2`Lqhjxhaz=} z$S`k6@87#^jE3|7SN3f0Fj8;d4Y>wOSQsK10#UQB4kLF+znKt$YSkNbzDQP<5DnKJ;+zr)+mMX26?Ii zqC%zGYIkn?tqyY{7>{uxRc$XE&_&`pkpMEJn(hWJOftbns+w!a)!ePB-`IjY-eA7V zyP$)9><-LeB4-Uls^21VCj*yF%}CX44Y_VRG8}wV7qPuqd?`R5n5fxi1I~`i4}oMGBHE_(7^NYm8QArCCsF4OofCCl44t ztjIzPQW2#y)eNatx{<}f*GN@K4Y^9%cjyQcpN_{1Aql;nBov0hYlc*b+{na<8-t`B zY7DssImijC^)h^Unk&r$YA3<5$KNhg5do{2@PBO6Uxhk;VftR_tnH#42F%AjeE|*t zq9iF8f`~26%X6!m#nI19)i6!Dh8e3OwCS&Gm(2osJmc_|gB&ea+of*1y}Q!~1ZT8e zOdLc+>ZB=ECm*eJ{Yn;jlr(0s6*5$Fv_8qe*rllq9-qD2B#076#5_%@`nZCGDh*r{ z*VsvCk7}fusz#b}HL|~VD7t=pUP<$htmGcdM8d_FYLk>SjZw#5r=F@#nsRmWai~-F$3X~~Vpy&wI5A)c?n#0=Ai}{74t1dDPno{{lYo5v6 zQ$?gH7Lf&Tw+;xr2f(ms#QFb&vmJkVsakGBA^KvJ83J(*YIHe3MsbnGY)a)LbA}nA zD3RphlB7J5xXUoZrn#|#JZF2J8IpTr=3u^S#sePyAb8T z2>jfb7}|w*5sr+J(5IX_BED})X@feJYO_iEq36WkG5 zR4l0sq>VCyK*qTyNi8;_ji@%#ClG={&K)A=p!Nv>O0*}kIm;`C(4;ew0;$D9v=P-p zNCNh!UO*t!<+eXlJ%>MLSU41ntJC^b{Fk1r_@#h~(~yRUrjn0*#ua}Jm85(hD1+6O zZc7?%^qp(MM`&jDjg7bbP0iiB=2hnFx7U`-58k+U?H#?koU5FJ9GcM_OEVnHwc(+! z!;|S;n=&NZ6V8Q1e1*EGFz8v*k1%+Jl=9F}fbVM-iCF1q6|Ns>m27uVzAD&w`Fq zRhpDSCXs-P#vhM@;quaR#>E~^+&(q2203~5*R^JTGpNG&mS1NH{0FD5>+_by)}UQ| zL`knnSsCE*Gz7iFcsfghJ)8&@PPX(|yD%aZY!a42yI{Zl&ZExS!&kS0h2q9a?d>~n zH*T7D1Vr&}*V0w{-L4t1u3ITNXbE(*Sh_*)dMes&$J7&F@H8Lowu4_+t>77a&A>CI3Se-8awYmEAJ-~+ zfX6LY2$GYf0+b6N2H}Wj&lAklE1JnK4aTaF{W8@09}0cw!`KJet>pxAcD7ozdgT< zx!U+{4=C2|Y5|@x1B392HB{znC`B0nge3NfG-7-q;`A^N(%Figb6`0g6mM*s*iyZB zcFlj(s4H#wFSix=h4?k4vx2;29dfK!Zui0smBvQUQb6qWPPL@4R7|9q<&?WYX=T3E zttVZPA7_WzL&|e+he=XQ(@k#&P?Q)H%toNAaK1o%0V3*rHo+X5V2({N7fvwOY2!DVXo9(Lg1Kmdh0EQ}+EU41L+s~reWu+g!O!;`wT0r~ZT1hk6YZ|ez>&qT^K4NG zE*GMCvr+$CM?s0##wN#QTLJQ`Kz18^2AKCdN|`-_n+ssNvW>Q2tsT@hg0|x0u`WFN zr)e-_Tt3FZ0N}ymL5-9z%#bc4f&#g&r0h6_r+FO__~6yDlpC$!Ns7E-G_K zAyyCCZT=+u2@+_;skc=P+G&f2fUaKdIs~}cgQpz6deSR^Yt_!H-6B>dv?=;nCmmIG z;eocC+seT)6k!lKaw=)GgG5VdKn5u=FFRh?(A6eu>Q;T%~}O+v=2Rjc&Q1tXO_kc}clV(WoRU>QYKFMm!z-VEM?m=2wC9^W-(xxy6s8?=uT!c4S!g#{zOKK~#ZF_m;p>lrCuU_qv z_*B)Rqj0LrfC~&MoPAo68_{CtNDiWa60UY@H3bg1rBy_g!2=98mn{k~3!0FIK6B4i zT47)rd^MGDuEaAm4?Wm2Rla={f5WdLHU)Xkm8%WL;=xs_Eo>wRbg&YRkknm{h@j|( z$4myO^F@%}b@w(ohp;dgbUOZ36n?x!L|XAlL1T(!r9$eJ85DcJpeYcfW9d*%LWK?r zAXs?46TM`sC89O<0o(CNchr3k^r)LX>b7;JBf19k9kUXUuBO`fuxsd~cj^ZI=9KGJ zNE@;Yk9zqx`S*ECsjoYFE@@KGVlj&C=%i0E4a+S%1cRwzl<1o-gOH%Iv?6JZMGHF# zy?Dk9N&&sV6jjG4;&1*Mwqe4y|5%c0$U&e_qjC>{AsX#3+~tm6oS_u4YXOv#9PwcR z0b^1Jiz``NqD2p!(=8J@8p!2ZR-&Qxwdg}C2p z)Dv;}k43LT_c48Xm0!q^W(9qqy-9#DT^k$_`HQR9t~w7&^*gHz#m$WeH*U`s{3`A( z*&K7tXpT8Q7fumcb|6kwVngOM+VA6c=;*I0pd1>t4N?N)@b-&sM>JJ&m2)*;&1RxFk+h)BqSBGs@shAXpHo<&kQ@xpH*$)rhUd z`7}G~(+M@=XCZ5Kh?f&@!#6FaIFyO-!L;f7fsS_0|LmepNAU^)<`zjY@vMNW7>SF& z$D*?#6L6o-S87!`Kb+oJ|Q z6!+9$+4KvKFfwqvx=P%m<(IIy1)M*YbXUi0Ja0+G|E0Qp?0w>dqG*f7ae9&PQu5l$GLkv)f)NZE32q z0`ma4_j2Pa79A+b2;a6emmR%p$Y-tG@K*z6@zon|D}KGP=GV6Ub~{)r)=-MDg)=88 zzJ$c*8#t;)iJxM_^gHa>NF^VMBHOdbeLw++u*pP!vMbhW5Vi=LV4YtvdqA0*^=3CZ z=-zK3b`?gB#YUyG>9+#qZkHK1YDn4dL(r50{L!EoD&kHp*!h_8qYjOE88Iv?Bo|{~ zu61hLu#Z86_tCKnAa%6|rLHTa%Y9m1LST&pw=3?BL*-<3qn$DmfVB1ASzQi zc+JQNUS3ss_XLmg{}1yTmGpUnt8boX5wZg}usxz5QD9k0^y&f89}s=t(PTf7&LJUD z7FmWG1={WEOHk88T#%`;T&+|ntwx7fAIdlaM;8^y7^PF~fJ zaWZ-7w|B8V>_FM$a3ee@ld#|d@dUApf6Aw9js6mUT|+E4+n!Hr)wCI!((}5 zVzP?71n}OJr{VCh9+t<54=bTE165}z)oJbtdM6c}ZVYk6!U2rHrQ@82Lzit?K%A?Z zy=zC?WtWyl3CA{mFtdtuYwA=ipc{9vc#_+PVH3s|`U)zI!W8|AsxI8Zw@q3Or%VSu zsMr|Oa~-mkvGMshHoJd?-7L}0@0ejdqr+qDdB-Pnn&XoV+cN2x>H02az`y2M4j_s@ z4?7;lwTcy*U+g>FdhX~Zvk=mP@};ybGSPV!zi%$V28erQdd4xB4UnvYo=rA)ekaXI z(W%%V$OxB3Ius6Z(!5`;MSD2mqTC(5lA2 z$;ahm@!MbyXKK4n2fFZiP91Tm9I|A3YJfwD6VNp_f09FvTXxI~qyW6(Xpd+3-7c|0k#9g)gNeF0KG{utyxpzvBd12IA26uOCR;nAdb2{5V`&!F z)bh$`57&!58TVu0v$pjz=#AswDjAIJFi(Zym5n_qSlM`Q%G#xkHL%Z2ni2Q3fPV(T z&-^Vw)tHxOo3xt-o*^qx{K;^a+l+D?h7H}o1(Ish|8u4 zp9)%!81Q_QfvFiPcF{0bvLAbz+>%U)?bEcS6Y|Y~xIOkikQ|!x7>DP}0lr2kJ~deMFj@TKMNW>ENtchVQ6x4|B*q6+qa{Rg$;6Y~UC1`r z+Hf-^Odi}$inqLgHm$A^b+L;XZa3t_-Ius{l8G?>B-ksy4A&kSOV@~X!T}F0WeeZ& zOcGm`N2YjKDrw4$82HjSxIaa&Mz$>vW={MKZzVP_ViTT@?}Vs}(H>_Fyq#+*mQMCl zmoXYUpvx-G$V`6oRiT}N{1Sj<@LjTs^4W2A28;n4{L2ujAk=W~j5WKe1)TF<*w;YV zr14-Z#$-7pc8TGZ31};z5&2soQ($gCfR>mnGYWs_tdzwp$b3dtkwiOZTiiJ-zWP`@ z!i?qs8y0g<3z?chq8h#IT@oamw*X^UQ(Wc|B``XSQ;2O4FXEyUxWX4W1H^X5-#GvO z2;W+q?{F-K)Z@F1ddTU@sSq>9diS?CyDAL*x?=8X;pUHBBw7xQ%He>Xi@Diw|BQAE zrvNjc3rUUzS5>k0*h`=u4hfvr&=TJd@fq@&*t!P}8^1oaDjL1TRV3zrW>!jg2K%Hp zR;V~|m9bI+RF*-zh>yj^gHs}{+<}f6Q71Qff|>~%Y(Iy)lA(vVM9WVIaZgLmo}fDu!_~+WF@BvR%q+43+dkx}A!82L0J zyHVuo45w#-9bF#vkCB;6r>$0Kip}+}H{z zERYsRizx|l1&lFj;miSE$6zLWg)K}T2!dMzu`lxY;ArB0u3S`bVaaKax0@BZTC@$i zsEoHm1p)>=CK5ubj(HtJAz+M@{Df%*Bg*8ggR3}}LG0Jo1BjFUTyA*h0VJ2%C6XNA zt3<|{4X^>cvv}{Vo_}!cH5adiE6Gg?%xQS!YmV?WGw`tC21cW;z+8U$HnLnM``Ix% zKH0dVHAk0Mq>XPEnWv6Vj@h>AW6BXS`>xua?_ja;3v>jPh5R3(eV-H8Ir6;HQ1)C;4>=uI-i^7#P=-MR5Sb&bhg`V!P z6Ba*_P(%yybv$3RN&4s%S`sRKMVAyJolYmA>c@l}lr}6YSI#_*&J*GDEN}-JI(hgQ>(;B&hkA|XV9Jgr&i^~O_|I9=c!zm7T;FOSn4R74^_V|U^ zi#M=m1q%w~GHz#=nDMtrY=YZ2xdR%U)Ue5DBi?41qv!k2Q2Se5?BitPVw2p95X{>d z>~o4_tLECX6$TU1K{6g9XmN{CXiJL*%forJ-f2~fC|yVw!6M8>-v8vG1P3OC6&oiX zAiu7Jb(Tl_@WZu_2`lo5LH5){;5~B=kZ14X;VjB|)D%JRs`3tYQ|9p$25wD_!0I3g*XBhv4rr?}ZJTuu=`_GZvV(X%!Pe;$5IHyXsSj$iOO_(-13z!%7j`#}vaG0{vuto_+- z2El4=TM55FadVEOvZ!7U9f_uw6L4(#r_q-i{)9;iC&L;?A~$$5-L= zg_B(wj=jjf*r>J@?(i; z9!~GmlNh7&`+yWtqj)<zF*MUmV5LmwEU0#!JQ{3magDA@$rP;m)KcHt5^mLfO{igIYf4aiE0 zLkPJ6a4$oCDHGJ~_%aEj@kBps1sx?O|5SV3+bGWkDR$suMG z_ONA`xvc5Ah3VOa=>>Co?&|ccMlG(z3}0xOpY|Nqa&>yn$xScV({sl3tjn70X&2Tp z_UrP8uHflhZzust_s$B;3l#1|gl=YZ_f&%!)8V!R#D>ml1|grH^el@ja*fLH?ca z(jrERPRSwS)aewL#1GnyQt#Xd*Cve4^OCtmmYId!at*eS!x**+*&C!=iJST37;pmS zUdb}5g^q`d7|yIw`1yX zS%yA)kRMZ%u^s+kEd9tZM)9WFum_oS;6ZlaLB{-r$Mhhxsdi7K%$neJ z1C?u-jYnSg?$7@w94@!l6IHr68GLl1p5j4f|C_!EasL14z?Cy}${%whq6!GR@+BS4 zLgFgHK9qV>T&)&SNVHU{B1!CeHz0d>PPt!Qtv0C;iKQ(_avFPF(H zfUX)kn+>JeLZz=pm(sWf?W+h}r;gH!PcPzIER_keqqc*f2NwKaLNuO_9=MRdUdJT` z-o;O~)MoJXUx?;Gd9Zqa*OkqcYH39YknKdNGf1N(Ah;lju0ui?k!XydCLr@lG%c2G z7Gd;=g>UulPliWT=#f>FkAfpayWh=+1gJ1vqc$q8X^^oNPB-PN^}KS^uWu`x$f82% zD+Wjazz`Dw&#zxp7PSvW#jnA!rn|hNwCNUzCr&}CTV!cLey@(gQmbnG;V)|MeNlgp zqW#&k=aGi7j6nV#SQp|?>+FiC#ZtN8Bk5r#D3szv88A_T(HhK`&t;V~sl#1le%wU1 zGv(fOY>qc7l`7>4R(j3zi;K9{LVndcCBUI<4*@Fp(ydYk`zJk1?uhcZplSwnx5{oG z1lwdTz-m-0-5N~{3mr{>7N8SNfwl!BdtAgJO%C=#WnkuM!9583XC;w{F&RioEYc99 z!97`Bmkn1j@5^a<_QvcS-#~VHbR~x4peaZxC@*Qgc>BinTMNop$oGbF5GiW`(q>@O z2IVJ4+Q8-=dxqP&;k zeBqZ|t+PvASSa$y6IerLG2)+;7_f@0pG1wDjRukdwt$ijc4ZfdvMFz1k-QNJL*NsG z?-Ao++_6Hbx#1Pu0QYHt##vutNuKxSC6+1urr(U@b`i8tBZ-ML zYHjEjt!<`iG$1ay{EUBN?;Dr}*@+b|ZS?U3y8)iKk+(;?*=ThNVM4z)^0=Y!JPOoP z^?By^mxIK}L5V1>`p6jH$w8aIM02aivy3?+BY%)9b(=Ysm@MbBqKAYcP1W68(^{=< zb<>VMccE|*4mZhh6B`wuQd-sJ75IrDe{PL=m4L;N_S5Yk2T%+8NV~%`20^Jo8c`^0 zev4&cqIXxI`!NybLx^D}b;Q!4-T`uZP-18wTmz}xh^h2vqwv{)>p&xf&ulqYq@D39Ut-%xh9*et#1Avx;;nlqOg4 z=^%_%iBXzBOCb`Ng>?H)PvmbSVMnB9Qk6OZ3z0g4@r+v;Z2WXjFHLSjr{#zhWfH8# zwKXV}*IA9EMO4gy@La^HiV|&If%|xYpsnK15*3(zm)0`=P&+G ze2KOkP7kb|WmqF8HBtxoqu~okI}BBJJNg$ghb^K)ic$d^puK$s4rR25*HA72+CJey z5X|7vjY((%L)~ImkU~t8x;eGM90Qb)N5QH(^f>lUasz~K9a2y-zH%MmOURN*S{>sV zd%IlG$ZVdnQRR7|zF?h?$ddm2N2aD1)4ZSlQ1B35-J0xkgon|a`i9d(aRwy>@3OR&f5V=Rn+FG=V*O%O_~JDLyDlf z3KRO6iGYc`()>K}^k{N?$=lH9OPwxI4mQEgnJ9}x%g8JNp%7*6oXy52lE>oE$_7O3 z5+V-2)#%cx72jnAeP1awKcBW*a7m0*JqP<%r0YquHQz<%!ZOcKj&$S92TNgXL?*=h zqM8vIEL-|T59%M$_tSzSJ3S!bE+JTi5N`Gu!5y!4k*1!wT0dgdMf9qG&ZSE7$K>iv zTT#sAM(e!?j?Oq}d#Dl<3N{^)Hi@7PxK!sfsU|afe^HseF*iv5S3M-bVy~svexmUivf#U!s5s# zELF(hGGkigQdDL!)GSw37~fAc_t^l zh!&pUl1CtOHzKn_bql%cR=hM~9Fq8mZkh6!nE@5ZiRWR%*W880+qapc6da0>KaL!t zxPuw1hscxv#J|OhOZFnF-8UES@z*n0W}&LdmszZ83YMAhMe)7dn-Sr>m=RBQBq%W% zUpeM9WtkMi&7IjWQ*x$aDGb7F38<4WxR$(-WgNfUb|v=#s}Wl_5L~U*nEsaU61&IbQB5gd~=1$5kmX3>9+#557i$ zQn9)47Pu7Bir5q?##`W7iqUyH4?;s4A4ab%XBrDC{~t^0vjVn|T*}Dh4j!|1}<;?tWk#Kq;!UI{xYQM1$rP8SO~P0OiX zj>-npzLP=MD89%`fV;%+9lMeaAa znTix659z1|mW(DNJr&=$adYpp5giBFY-+W&-A)IA_-1s>hZV;gJm=GVq+AoV!Rm<} z_BiV!;*xAe?EAZ&6Lyjli2@5!Z;&<8oHQxL1zRX$&nw9G_tfJ|i;;a&+_8CuL+o~D z*h(znEuF4Br2ZWuJ}Jv5ug$$vpNQSFInn2LJ0aZr^&H#442M@rs(kYM)xA$iq;0Y( z@d0)_Ddh1{BU_<4bao>8lb(R9bS1p^Nr_H~Y*Os|yPcDx^)G0hWQYPyNvbUm>r#)i zokV&vn-RN0BaDrC;3Ynec)i{lA$9to=%oosRST+#wf7|wDHd!(^!eSc5OxnR5W22g z9?t(iKExh0DdCYy$R5}u*Gr{5Ho&;^Vuy9YFZvw`e1ehnw9iuwzajj_bG{vV{AtF`flfg9F#0Rfhf>6 z@b?EF&@nWie3xkY;`?V;1L`{)FyYHR80g>dT3zK@6WrKQaE{t&`XX6IU+bxP@H|+; zgM(=B%vocOF{AKmY|!y5U<5vTaFN{E``}DB96h*bm+pOV#?VF&F5-K8ADk^_VsNHe z4z9UyBkz55eq3NaGd+s48AyY}KN*r^`#3RoRFfjQ9UNYymF|7=d@~GAUbEOTe;mWJ zdG=?|LPU5u$idM?=cc_+o)gpzj}Ol<{jm(skeWokVE8A5`~=hEvuBFZ$1?i_*GnD#3C%vi_1N$q8_VVK z4T+@}jQ(VJp3W9|^ynh}a_=0M--z@_XX;%-+OW2f3*YwFf~7KC|Eme7&8zcQ4D$-f z&rrux+1V$26zXFvLo5=k4;+I6U8Dhu;M2^Jde{?!Fu^ucF{qg%3FrwynBc7G5L%*> z*#MC}AqW%9w@-0>=EvIhZG7Vt2(sS zkAul9u$WMSWiaj+9(fV*1m6xhOcIa#1|!p+5-=u?kqoyUYfRjmWyE&KiN8?`HX3E} z-%m&vUg~QM2sL3+{f`Aik$B+_yh$^KWArhl||A;2%a#Dbw;b4 z4xUJ~B*0_maC@W*`1sN}9XgRn5kmI_HNClM;i3mDtKUUUE z96T5+7C|R0?ee5|1vfg4v9eE+>!q$NKWvNv-M(-Xe$W^Px+kb%rQ>c4X~FoNFrE1m zr@JwP1&3}wM42g)6&l~kNm;u;q$d&=LjdldI5R~8BL%+w5NQ0OA+dE+;M)(8#?KOC z!M86$jq{AL;M*6m#y8~NhS;Jz5ixxGB0p@Q{1DO~Z~U0~vn@J+i1D{C@`L-jjJH4b zLw@i|!Q;WVAM%3>g+6?-(?(K!><4?c6XHVx-o9|>g!D)UZ(o?RlMo*1;Oz@EJy9zK8SwSGns9d;n4{r;bo^h%mT6yiX`OMBwcU?{kHcLj>Nw@IF^4IfUTt z2k&!*l0yjIe(*k5C^>}S?Fa93g_46cCV1ZyU@oH>i^~v|)R;x!?F(aZg_1)A-u^Ha zq2v&Ow?B+UC^dxO?F(ZON(~`+`@vW|q0|t9w;znf6G;uuLlTT-Uv{o1k{Uwr_GRaK zBB>z+Z(nw<$H*+fmc`)h$IkUcQbP>hzU*9))DVNWFFRKxHTWh??A-m?8X~D71aE(~ zhDd6N!P}3mp{XLVA%<^1_J+m_S|?bG7{2}39H@`M0!DgqknA+hH$q}}>8z9JdIZ~VR^@F$Fh7Q?qM_!|nBMkbsbcfd;GZ-3xR$PgaK!?r>nKJN9* zo_sRb(B(#{9jh&qh)vLVczItCb08T%NdOt@6i)_96o;y>QQg!0!)|>eUn&j3nGhxt zIECfiGxFOV4QE2Aa5%X-mPF|O0-BI69MFVefj2Tf`efFf)i`PSR4#C%8f*$;q%>Z5 zD@mb3Kp8{bKR^@mCLN;&gMR-2O$eTJK)Jv7z5$wyO-~1uU+(Q6pp2_0XjDX^j5|od zM5*FBY84OWDY|Mp`W)Y|)kl=I5;zpjlPz|Ov&31luS zxSD_rjY-H7M;NxaBAhWbGZV-hR$V0l85)z2F(}4Z&C!f;?A2ry!jh0_Ly(E2iwI|< zIpNrlu{>Q#$S7ggMJ1M{OBaa~5oE$_nuF4LY|tnpSrW1#z!ImFR5BB$yL()~gpdt^ zCK4DzoMp#0T!Rw-C6MOg{QuL5%%_2-i^PNwyzF>~V^A*E1bApnP@6FPTnJi*%)_9( z#6zGZ*_tt~C=iyleN1{&Dc@ldG<7iJYoH0k%|%$_LL(cN%ZmFZLDPp8bX;K|EY|&) zSYyd#lc1S{Nt%H*hM_T}0cU~PV2vg2O@d|&)*S$7hLC2K{V6SblOO&B3AhAl(9=_1(lBnRP_V`FfT&?uYDUeH8`Wo>9p$2}ovSstuJr)6j8 zq%4dG7p`fhCo6#{O>#G3Ech^FIRF35Dw6Fo9A~qtrikLqA&MJUFlbpG{4~*VIZ+@5 zJ9TWyz|Z{I;B7p~AdCSYURSIsKlEn<8!Hc&byy^SZegt6aZ*jQ^e zcpJ}zDvbLU!)jyoIpwQ%^SgRCHo+hE5F0`0n%@g)w{s$34xAX&6ri zcS~T)kcWuY)EQn=(TRaUk#LO2ZkM92`>>LP#>5#g8Pv_NCW0)(J!%W?VH|s~rdgmR zu>%u9M`r$>{BLz_Qz(jxO2+`p_m29TJ4gnVp<+OwlGVhc0+z|UyB>!DYRlsMMsOa>tbh ze79sH4aRd7aL1JgS>EDQ>s;v_b$J?N8{Y<8Qf6_#SC1ZkNLZ$k#eX< z!ds_rfz9x&-sU{?&jKY!2Qk*lUBNadLDeB!@ZLqB;ha_ft<}gPh3*LoQC=Sb%bDq%+^FcPe;QJyK&@3~QI-OQ< zVWt9_WrmWa0plHK|$`qSn zlXHbJHSyx=1Zu(0DpV-9y#GxbORAKc)+Y1`#I+9M|3jTtW8-wE-o_x2r|TyW~eDPrPxw7@P!p2e#W+K^X5Wugy77HPsg=ahV}A+-WM3T7mMG88XWR zLxs7OmC&uEyk!c_aHo|Bv`Q%fjoAbW&CnTF^-vZlZ<#_fv<5_IiP8|g?V18}FWMYW zUDlMcmMJvD^I2lSaw!a!=@r)unx#WoU`DDC8Yz0aHHBtayj2Y)DNxEXg=Tm@ON?Jt z3VLP=l(9^q8JDLLm?E0nHh{Mjrj_N>FA} zGpzFII*ALEp-iC}9)pN^A5rLiP=+#vW*1XcSm1&egS{5sH0^p9C^S2t4N0M-@ zM3-ZrL}iZ6@SN&uwv?&NvAI`myrY=yw>YuiSUs6zGmJ=M=8DImQ%Tv%6q|3&vyq#w zXJ&=2jQIb^h}uTbJJwy1ta~s_0wD%}~eb(hZclOy%bL9gK7w zvkl?gg94>4b8L3!G}ck*d~>PBzci&8vw}$MU=W6V6!HHsfO7` zl)B82Sw=E!uZ4YW5hX6Wa~t%vS@vkDIMos5EmLTQ`N|3_tW|=-T108f6q?~7P%$AR z%37w--2SuCxvH@T5hW}$Xr3x#15Gs|GopND2JQ3AY)hNhrfP+XC|#LCb1&LRO~r+b zC|j99v%CaJRVj@qS(!pJl$xqi8d0t?gT|T$5dXjMxqJSZZVNAXizs24!m|utn6V1y z5=WG=%%E9T=2gAU5oIhhXqLo76;CaqjAaJRuq26D+{p@7VnBC98Os!!p&eC)@e$=L zQ)q@6hB6yqQ4UIy5#=m1Xr>jcG7I_2LChCX+A_yxC^yw$)`;?!DK+v@R+Kq9TBB2b8MFTjTOPe@n{j{E^};#rc@VPQSvgyW>`(Y zO#{iZkhp#zqU>dk%`pGL&S@NG>?6uv=GY9+g6bNih_aU{Hp^;)F7~7BWs1!*^Q^O{ zUK&Ammt!+rQ(cHf*~=80<*+JN^~3zY)m6WU-nY!L8QLtJ(@QU0c3SqgnAcJfh$2c{ zrqB$frn2s-sasmm0a;X%+DtD-Ak1csDCb1xe0 zG`iIid(Ewr0-9-pmleLliEN3S<>Ei0vlya9jHp48N?krH^vfo-^_-+>?>*mQt-f#z= zB*$jh%~NKz+j7{KLaECfo1IzE(GMfaUFO&f^_z;95K;0n$M(fT_~r0j#R-d6vzHP7 zAMN-4b9{z6jyWQsA3_Pt6q%)l)76G3gPCJ9JgHUIM_CQ~C@F=RW3xM{N{dQ4%p9BH zNmY&0iYSShV>3JnI;%xl%oLlihS+!_y1EsmF>`Eo78L_US-mgpXP`W0j?GZ}s)o-* zl*vr7S!QS07=$<+gAh?BGsk9kPL=%(l*!Do8D?l=rhDU1_fjS^$7ZNQbctumWTx0G zryc1c2Fhfn*bI|f71lF=7lVW#WioSYhS7|!xtKDUIX1)nrpqHyCNsrmIfzMDPM}O? zj?L08Ft@i7`n?raPoUWD_$a1`GMPCx%UMjUwJVp% zG?Be!zPHNuTQ#xYoMupAGxXn7?DUATnCY4t-f$eNSj-V+F>`E&J`$U#QYnTd8Ombj z*p}@A;{TVv`1F5W3p8aiQ+%cahI9vlQkhf0*=dqkHCZ{LT;>#ThT(mMl};<6nxkaq z6mWKDLYaG@Y-SG5ziJaitM2lPD4{t8oS_!hd2*D|oC40!1y+R)MM`N-0cW`9R9W*P z&GjueS;M_*i82-Gctk@igBC9tPgL*@e@|wBiEYrU#I(U&%n^V9U9*8pGd&K2n z@=KADn^V9US_l=1r%36|9Gqn*xoUDlkrJF!z!|C%W?BQwTBHPL4$ZR5U6olXQi^j5 zIKv&M8cb89B6VQqKmLdNzNSE?Kc|Y|6|%a=PPWOC0-0ym8O=Q+ZnE^p*>YmPm7f5%w=cjnO9g! zE=&OzDb<-{Gc;Muy9}L6?`ww!i>;`oSFR#v6)Dk~O3nYKO*o?>DHbWwnPW55A*vB{ zMM`w$*lw>yv>F6cd5KjBNA(sd(V1g2)F8S*ixQnVHp5fO62QoS1)7%3j?GT<>h6CiQlc}*X4qVy3l=ERnPM}&8jHES;XUs~N_6Jf4E?v5H37vz6Ht*7 zojEo;9a3STGhPhNDJ42{Y<6b>7ZVZP8{Sq_q(odgj;+eGy%WfzqBiHoG`b>HAXVGsk9U?_*}~@nT@_DfyXV zGi;!$uqI5r7+|CPXO7MCEU@^w7-rxo0h(j8+i$U|38+Xp&>Wjx-l4*Vk>ka1O`T@Y z_?N!t#Uz(hVNK?EF~sIpN`=kP7tz@*N`t0rYTDSvS_;BYi?X0opc$S8RWo6c(x6ko z86F0ve3QWz9ks=I)ToE6Q%8Je#m>lrDA4il$E zQ*f3YqO1`pP8fd9i{{`AkArG7ZIKhBIXJ^*)fq6(jHci$J4Bf~7n(0ljONhXt2Wj_ zS9sveXb#TMI_SDuI5nDsGdvEeo4bpg8y$eN?hs{Jxj2!PgB7)$o~vt>rq?@DY?cFBRK(~aCq}as zwY(rrb@ft_6Qe0M!wiH@^KxP|!)7@VR+l^Hq-cuGQiHGKaSMoAYr zC7NP0vCjF> zfuH1=R5qcODiK%WY-ozjFlD2P7)qQB&9GVWRg`P$6hr8hQ*7>l*sQ7Ql+t*CB6Ba= zAWO+hug*!AI1`#;GgQ2+_7;@hN}LAGkXc4qs=nV6XF*eJhG$eY>Y?PVx8@vJ##uW3 z;cN9OY=*l{HA|tyDbQ?9eP^G|DOGWNO5SQ}|;GG&RgpeZ&(-K&}rSK>TqhRw9kF=F-IC?JHCI1!qITR9Dg|4(k5?$q13 z0r2V1dta0)V^iX6Xb#Z5YNJY2^nntmLvwJ3`%V`#a6U8zXPFey1%jLq&A}NK1XWq- z5@$qnaE8mOY8NSSN;C&&Sc2A_R?dm0;4ITgDk4&elcG5|_o|I5Q8lraI4hchvkVDY zS9gL^Q{uE}4$iPbuDY70#Cg#i+=>bN;^vEGN5b2wOPm+F8*c z!tpVr4K`f{hqI$8Hp4|#RR>F)9nG*=W~WutZAzRSO|cp3I8_zD#M#jln|sk_zp0p9 zCC-dy*ep%Ha=$qkVOEY}v(&z-pp`SD88*v~7F{NSGovXs!;Ti!HBu$cjAqzwlW9f# ze`;Ok-nM#zmoCG^+0hK2WkypMc5!wz!)DnHq?%7y;_PUK%`$7KbK~e0(LQw@*n8h^ zWut#}aX!5xnqxDxTM^4rM?uGQiL;~Wnz|Qli3p1eEs@ zr$fG{t6@pVmzREOBl$#b%g|)AihN zYBa@Wn2b~E5Cnipa5eK@VY#2L{Po1K3d>nf_85KXZe`boO8!1>S=o1tyc zpmN_qknRCvKrjqkLS4OTJOJf$oJSHbcb8v>ss>>^Jb~FcPXd!e?a6pglQ==(3 z%YjO|v_2ss+61y^i-$Sa%K^`$srDJawv0hG?kp`t(L4mt`PLcl{r0{gEPzm zyE+%*|5w_LiN<)X)#z+P+n%!$$z zn_)UrRZc2%qBO&1na))1H)n}7=hU*zi{Y>3eGZL$k^`z z`Mu1E(j1zh@>TVYlsQqFgLALi90yfyzsyO}6r5!^qe{q?IZ2v>GYnL9aUds2b8wc5 zgjGcfK~rATvZhUP)Vfh$vnG{t6_d?+w4 zvkQwnqsr;^3tU*DKna5GxW@LsRzo8rr0dgA}U6CnKGj}HbW1I zW%9#BKIKJoWOjC5nY^UDXpYU&&L@>yqWnSci>Am-nQyv4i_)S~z!}O-)zDI=yl4*2 zGVj1jsiC2#wCEIQE?s96+N*fSWy*<80cUAWnc%|dHf2hR=HUFRMv`NmWj^#QDJzfYW=GYAV5nZ@NiP03BWim+@-cw>U$7YyL(j_nHmC+QNrM=g608wHz z$7Z?TNUAH@;z)_n6q{u_NoVgVF`8nt^pj$yL*h_}P+~O2W|^|lRRk$9nqxE6y}Cp` zB}Q{>hG&7<`q0!A_VP>jE#X<{g(QFFFOBVX{l7-zX`XgR@MGsMuv?ueLN! zQr>s<*?37Y+j4PY&pA7(17~!)KM!qB%70tS1%~@&D^%^`CXN zO$q=1Gt2?hRU0Tb+I!)lYi_r$6*i{@F9y1Va-%smyJc1CIm(Tu*evV3su_i4%8jPj zESt=AIaW%I=Gg4^n=;)+nb91ZVc5Vby-D|%5~C?L!>~cwD?)kE6q}`MuDUk8Oli>+ zn`Na}cNQosnqxDp^y&ycloU;|S%wWd{YE*_9GhjOmpMwM&{3kdMRRPH?yo9@ri^Hg z%~1EoEb|+OaRVhpQ*4$&4X)oHmFRrvh)_aw3OLJEWdVK^2KbZ^odV8qS#_B>N{Hs* zEF&&m&Ya#BodV8K0jtOZF(pK&fHPcHRc{yQ+xN=3X->CBTvX!jCr<%q=bGzUT4G9u z=HM(V<*M{=Ov%tG;0!BVssWENWkaWcGt_gcNHwN(Xb#RdH6=pn&lN_is;V*NLvwJS zu>k_{|C#1^vn9d*H@{zu3*U98z1`@~1B_MKrI?bUJtHHG^9>KI>aK*ClAnkZ9?h{?o(SeMehnRgz_%$>W?7hyZiFf$UXqMDe}p{dk- z8-k70R0aH)-WyG^`SPX>Hl2S-3DF#zp=MLc&DlrIezVLdshZ+qPi#|RGYn`{%`7ox zL(?_&`9z!jMifY(KYR?Jk(p(tOVx4)-%e`}e7?>`W~$pRVqe8l$;~her*p@>=dHqK z=(VYC8;bpwS79@Z>#M9$uNpM!VV;L}znNy?RH^)!Q=pllH=UB9v-F$;&A}ONIn|{S zF(*NDaE5!X$g3HbX5mx?xR`UIDLBjAFKc;({}u!g zoD@yLea77Ht@FOjfF;4HBZ$1`$=QSus-~8h6QjB03=f2AbYjez(auZ-8BFh(nh37S zMknIMaLYLvg)s!f=4l!x*eYyZ23`!Y(HMeab5CJ{Emo0zV$O`F*xZXY*c4Nq?ychq zn5)UK<-K2J15U-EjX5=%f-}tLS6F2bF9th~Q=>UJLr+e1*;UM`(GEtSMl6piGpm)b zuO;TpXo}79s4^G0m{?R7t%NF$VlzCds^++u^P(BHyy0nxt4wg!gy5)c;NaY=HhQGY zg8gzB>~m(c(|o~cuyit2EUuU{qbWAa9mf{6w6ds(|KF6_e?8{pXokwz!{O9uhRx3uusIK!axdpaGi0WvOV(Bx@&;qhi)Pp?o4Qq(Z^oP#&9GUP;8Zg+ zFw&E`aTJ?jK2Fz^!FkaPn`Nm>XHz*ZnqspoC$S(pA4d3`7frDlhN-&j1Ls9kY=%Bu ziA~HXg<&e^MKf%sBfNB-U7Q%r!5K_NsQ#ibZ1qJ3vgu%7o?s9N&S#2k7IlEY zl1^T!Pf&uC_S2Ev+TAZVMCC4sL;!zDKg7m8&&GJ zLdnq-n`O66g&F)xXz(dHnqxDJX;`y4rm+NOffA%CHcMwj)udmc1Zj@VFib76Vs9xZ z_EsoCnqspwSvt*23DO*!VV6>sb=y>fZW|2XWv1ROUtkq1vzJvC&{RYHMhVhXZaxQV zV@*}prdKFGnqxD}tg=R+ga)A%2D+klwiGU7(qJWe;49wM4)cQyn7MC zG-0l)KvyU;It83z!d&NIdK|iCRqr{(|8L7y9=RnMRMkXPq3q}s=^469x}b)#qf@{c z`oKlz%N0Xkjgf@b5qd7FoN|MgH`YsjKqI%A)jofs>G`%>QOV0A1My2FvmlE}b zEt_nW;M75cX_i&z3sZh{%CZ`2IbEfT@}s>k5C+t0x8(LNiE0{Jh0>!bw!Eb#VZ?IG z<_`RH%8&NCHV~X;?p!s~t3vON_HIgm&D#+hC8x_~Qhv1eQUYvwOAV~kBlO~E@1+Fb zEbHYlNk)K36K*)CYXj5eos;}#m%*X* zXo}CYRaB>bDL2Xb*R~9;?fHTZN=)7~v zkxl_;s7+Kib5tlvnuD{;53sWSNB+bED#?rdf z5+zCdyvc9T&s5#YRiPYdip{cxq`(%nkXTe_&qM#*y%@;N(g&`xqEa<1Dp7_sm78Th ztFHAirq+SU&2pHGYDh(e5~QizOxrYAyFqxfb%he7IX1)Cp~^}k)vzQ&`Oy@cW$d6U z*HC&i$7X1?RCG&Rb4@DK9NQO<9+n~pl>U;1X}lQ3s+1i~vDr35Fc&kt?y5rR(J9~z zS5+4iQfhPxIJ;%V1w+YY#f#yx(zFs&zoyec* z5QzWJue4BygCHtiw`x3+yzgkXNqrSrS8FlsYNZV66zLf{=(<>+lB78}%WzuPsX?!i zP61~aPV4v%lqQ`5&QKAnhU`};Pnv_X45xJ|9LkeU0cU6>bj^nJB54lJ*O_coiRxyv z3S~;CfHT~4x?Hf3P zXy0XS#!!_&uTr)&m78V8P&IP5 zO4-sJo1u5E3R$a^EKRXlW(--AM$n^Cr7UTR%+M-eT0!!Z;>AF}QI<5tW|@;y^|n+g zOPXUdwDc7sx44p!oBPHvie?(bd+;WnZ-tE+!;7oe6!HH%RZ5hmvNN^z5pyu3fD>1x zOz9MGhFNM=P*bH;=@f8=+fLO|Ri$j{6mW*&Alr9wxbLczF3rJNI&rFYgDT}qr+_n@ z$fLS_xJn7rDd6sS#6=m?Dd6t>o^$#^qlay?nJiHq-UVBwoaq$F8Tw1AaTQfcn&#jv zvze+HBvs0qP620lAe5(79X;gz4lptPxZ^eH(BZ|^#=lChmFAMO%x0=Om#UOHodV9# zwyIiOs+2m-!THW~n`KpkW7KI5&N5-B1m}*RN(q||Qf3`E`Je-*N~zN+k~7?Ms=HXK zlsX-PbK~v|{a{r=sY;2{K2;OsNDQOaST)3@>UmP(hI1w~z~+lPMkkf!fWzT8RZ5wr zax;t!V-*>`N*U7>n`v2Jm!PJMX%5bG5-QUoVRL4cGNwIEF4%E~>bJtkQ+P2j`2k@X z@&CK`jyEQ^WH~-NO+w)%&@tmck>w4qMXs=`>G5JHIu<_o6%3cv(#<4}TtaLt!Nif> z=>>H`UZ8v_GSdZR1{IT^!UbiGOWx@S7Swk%+gJt_si5lZdMG%zdI2^|!NoC)8{&lE zob?RBxup)knVNex$}<-vG^>;=?JF|@Hp?WnuIxam(j1#%azu4`dDS0E&6?WMx|l@` zJL9XADoq7v>Wk>=(UdEl0?sgVqw{_#S(<~h%s=S7IFBRPbG}j;oK;VXv{AsivM;?$ znqxCuRGt2%WNC`cvV5r;l3k@_X^PE~@Sq|jS1DPVV>9%Vbj4LlmZsP&?Ut^0#KX{> zQ_H!OWoGZop}nVcX)ZUzjE#!?Q>9dCj?K>Avn373@Kq^Knj&k+%%<1r+{+_0h>Li>u#Y`=@f8=idaQ< zs8X&p2WMIJEwiSoa+r;y_erOKGfcHI@_k|xB&3pc738Y z*=da2e*CWPv{JUTPdx>i#OHjH_&x_VkjauIbG#T7e<@j-W3!72!Db-X@(FCzIygfR z%FQrKQf8i9Ii#&psx+0G4OPMuVMLp19Hd==j#>$JUh}@M!(?UAgiMr46f_3` zom;NZhPn7O)FyVCuEH|bcyYBB1~?}r6*xmxr&1>X=Y*sIXQ}H{xd?!xMuIIXepfV) z$)?j0y77%Ph@j{!m7OZ420B`Ypy&+MNrl}4h!?{%L7CIuLkbS8r8>dj>7+WriwShp zP`J$)pex&*Sgkst^l4wS3&2^PSXIoAz>1m)Cb_)nt|NXOCf+30m6{2T&TwJbB~+NW zpFl_Lgv0UMTv%dZp#c-%sGVToEEksc3I(m2*mTrPaBOzV8Z&NpQqj3D4DGAa&EcXN zS}<}P;^b+d7J@=^i*I9GnMW5VJvvIB_H%bbxw+L(2Z#9o!e@#5wE(G&VA8WpA;v6g z5+_s%B~Vl8S>_NU68Xnb5c#8_h1v)vIm=cn6(b1XsEMH9oVrfmcb{d?sai__j#>x` z&hW%4BMC~NrhCq`r%82b2ELKn2qwC`4~c9RR+*WgH&1ifS@z`=S$?<}B#0q9Cnk*z zGaWEnVg|O9u&|UwogzEKQ^DM(gx5ql)G64UkZpFIs^o%Q?;rAo!U&~ zEn9O`GY^1HZ71@k>`dm_g`8WUQyU7~kqoSbGfE`HD3zL@3d`;sWe%H?sZ-Dyo>^r| zjMAw&I?EOqW+)PNg3_r|uo*f}Dz;%hNBPt#=nU6YRYn9lbvR+#1EbW%0j1j0sk!Vd zCt9d(1cvOGrSPrJVXWw+Y-41r>`YV>hk{;0&B57uCl%%a;KeYjL$9Ic;BFITf0k&6 zRj=c)dW~gu@(A1$3htH>Hsb$_pRx3>>Kz6^7E@4wmQl89SR}x)#1jW+sf(Eh5YC_h zI2KWGaCV16Ti2oVY6{LYR8$2NlwQrT`Pqmzx=z*P1kyAsVRLkr1DI7k;Xp^tgtG{N znaKON%|vz;R{qC}p(>^nYfp(upffxZDryd7#{vq^i3!koE{culszjSqs)=}la;!Nx z7qyvyi&ZzcKyuVbxUCpU&Jdh3??hSFzHAtPGcB+y^G=j!&CwYa6JyrEh8M#FOPSUw z=nSh)Z0<`O&V7MlV)2A06eU*Hu;Eli2?IK6D4bdg(OG7mv@1&u1x06R#wskJs3Z&p zWn6nURvy8-iSJhneRih;LvV)LjwQtsT)w;y_RPmjpR&gViED1;$$9{60YfqK*VO(UZ>1C zQO0!&x?4rCi2pBr*7%=k;$&Tn(ymhw8ty&TP828Gi74-yqqD3js_t6O=e(n&IvKv< z&Bke0`o)xaogzEKl~w9v4@4(BrwDCir))f>-0KwC8RpqlH}+uPsm+CHRZ%s`ET5z7 zYc4y>s-lW)3UoB4V5atWQB|b;Yc4y}sv;XF8D6~%+0mGS%FdTZZO*JRaYq^0DY7#> zv#OLQC17)GzMNqrIb~ImGO#&1OJcpUT3m4(Ol2u7nf1zEJIcaNk=?C4ywB*}X=TSO zg;&tO#ZXphC@2w|g0l=}mGxN4#OB~EmsO{TDHEH6GxY3~B?@|LH3ern1XgJ!C>fih zv-D1sSv$(a_AbkB@w_S%o|KAB!C4MYP~GF6&(V9UDLABC4D$diOA+2Q0CcR7&C$^~ z7V-b(`smo_;Ks&EznF5eQxIBuPpm&SANI%g3parez|mRuQR=L0e-wubou!AO(|G-) zT!_vUF9Mxnd2DqpW9afEWP2Y41>j7Lg~n;`=LVvP^QUCVR`yqR;4e zGIbZ$vik})6dZ$QnQK?gA$?ax=T(=~>0c|WLuXi2 z)OBO!>222ZO!S=u8`)Kut6oXC>hwD66m)i{0=2{BRE%UnF;6MkDd-Fvo|N7&z0jJY zqhaFb3lS?UC59J6jY0|8Dd-F>g|54^&rnmHS#MNqP6gA(aZ(#oN_L9u$f-d5|Ngz7 zZ*^lG5uoo+>g4BKXdC${wF)I>r^wGRJrNUI8^;M-ONrSWon?BW%EH)cNZ{>XJf~V& z%ao^TK0Lfn8dgw0#q#DW<;qfGHeXrGf~@k)QfhVzI>Raj89)_>^QZEZn4N-+XuQv> z?R4qlJSAqQpfl8VNf;Ja@-7XuLl1?Lvbo$WGj_TZd!CZAQ_vZ% zs&4d2e=f4hN?0}l=vox=l$On9XPIJW(=p@3bj&=ZWv8HX2{RktN!MMRr?l)8bcR+! zb=MzqD2zrCqMK^AJ6Xd>o2AC$WNM6(vVAX4khe3X7UfxEc0Li0QC2ob=M9R@u2aTi zl$Px~jY8R3`gO_-59MY1PNM*wVMbO--px}^HV0?uIq6yy`lC!kJK=n!KyrE0CO}nZ zOuzCFqH~#?0G;K!>gMg_DJk2RBSLV29!C8C0Ve-H{dv9O9E%iliAa$$vpGP+ji(z{ z*dH09Sz6OlvC>pfVm1|>>3lIQI%hj|vNLo&mChX{X8S8-!gFEh14K03NyM>~nC+EE z2+nXYi_!(4#B2`EFe6)G{z)a_pHN~p2N$TjFQDqQfKY=1nL1(w`V%-?ZJf&rGbcXe( zSeeJByzCTohT1OAJkNYMhAK~~*(vA@SC-Z8;$-cPaDejrGqh$(Pk_?1Q_$Ucd*QiGs+F~@ktrLXJ*Pv5&QNyB zCSyv^<|}JiBhy_Ekf-$Q6m*t4kJ;Kn!q)ndj%sBs$L}grvy`BnB0ED*Kv_Aa1nm%= zb&X6n;Wkg{*`7Tcg!xa*uh5~A~MwI)`!!g3XOG0gMOYqCALH$Z3D z-Hz@=)+(E5YV-Rm6rEEXAvnW$mN`%fxlwX9m76KqQ&}OS>}-zCGK)gf+2M|(==dDLI?V&eG>p=Ef*F z+i%7|(e>#AMzUjh#l+B^JSArP%^09FbUSs8V+BgiPC;ns0_a+J3iQ5gj?U7|vJ6F-peRssb_zDbP)s-7 zu0Ze0PC;jwlw~?4COXAsY(i7!c7LGo`aC@wb*yWXEl`GbitG#>DD8=LU#XIvr3?B`lB?@=hG8U1#bVvvo~e=uybiu!8Dh!Lq9fzq^7&>0rUbP3M_rD><2GxSi3EK5-go9+sfrk#S$&_mHAp9++uor29!*Xe@U zf;a1-K5@r5@Sc27ZgV7*F1xqtDsXmsSlM-7pcHK%QwNeWjb(LXiwgAG>=bl{CqkEg zDo}cM3Od6`yUeUuIm~1iC_Os`o!yD8FcL3b46PWwH#Fh1$ujS3Od6U8Kp+1MC}xGmKufGi+sXf zP@;AUIzvCD!cIjcc`BShG)`3B^4>9JtWAm9Ty~}zC^jFU6qXnZl&GD8&QRa!hTIe= zQ9A{lp`W74Q&5^V$7Y#-(h=|rl&GD8&Tw6I&8P)R)J{QXx30J>i&WhcH)s`nT1ll( zEDPJZ)~5m`YNyD~(2nUEc?*=Oor2ELQm~uR_h+Y|GdvYa z4~25IQ_vZ%Y?1i@3F1P5616!x%gm?l-qr%WLOTVWVdhgeKC?iX+9~J^BQjlUdx2h| zT}AwVmF4jAmaVe7fo%oK)=rV1;ki{-KsjAIkezFl^_3T+{3pvCCsP%iuFb$1suX1k zkF&KIHp@_(cqoYy8K-JHV;?4FBg0^kEomaX!%*uo|_S_RJ3cIPsbo#o}8EUg$P(~6X--5){~!t-e~BjJ$)n~1V0 zQ9BKsp*GQRQVW!+-LL6{vhyu)CbFwA$^u>tGscvvod(ZPdTcgDoS02fpj_=Vc!u_$ zCA1UyY)aKm1Ltg;$4D$&{^~0?v|5uIxskbnP^FhUZq9)TVsx6nK`zPm-BUj94g8 zs&*PU!{n#34T^HL`|dZ{{Of&;_m7i zZ%l5DnpaEDf5H07CiNY4Geq#|q25nW>Jl(?M&&rL*=-t#T! zMkkkbrzCswDTO;tdWKemZN22q<2HlJ&a(eQ<*oQ8ZQa6J8nl?@F5*P;!q-rg@C*%_ zZXQH|lDJd$on;G%vhkg=xYOVnN-w88weBS97T1#Kql<7OO5{$Fo*~mG)(x47D3dz{ zo@JdyD?MjJb&G51Ocj{gD}-TWM0wo(M)HI~Gc3sK=DJ3d$ejky(pzED%O|Dhltp53 zonMlWo}srgcr+0IUu$%>VJ>!V2xle;BqK`bPLrTvmy|Bni0GBuY48j^7TwIbh*G*! z;92@CI?EB|xaFYx&(dqr&31_>sXI-2mUfrKZQ>K2gn zW0(MnD62aKoTb&(RU#uw>rR7bnfPXQBXOBZM48=b@GK98${~#?wL9;1VQAL83Nndu zE0h+W;KfIj+ugs|C4^_#e^FsB6>gg#77Vo~1jb>tKl}(>o2Gq2ALKnb>{@C@S(*47#)+FBz@`A)#I9%8Pv8^x;`p435Fmh5{DDn zx!#n-xpmG{0-m8+(+#|iDCav(dWP=2GCNO6-)ZnZqhh|5QZ6&CS58=6%KA=$XPJJ~ zwPr??_?-sNQ0wX1Y$D41PJ?Ht^;oPHCu22A{Z4^r=`ZU@UlHYgr@*uH_?X&D#JQCE zod(WwX>|!S%Kc7(XX#97m-aK*3`1us*0m@_l>MD1JxjI1lDEmCAEke%!86=@N|Q$U z-wAl;&J;6fg@i%#yD8zVxJCSJdMnCmB;|kSy;qljXXvfy1~)~N0Gky0H-P|4hC81+K-8l}QZB0#Acz z=qu|Q`XfpOPl0Dy3)eNaMwAVn2G7uH=;((LrGuxyvs5k0MhD6VPlIPDJ!O7{62kje z5F}2o;nC2-qn)>2jfC(l!$_sa!a3n7@C@yS(yVb#cnUnjy{EeqBjTKJ4$t!BMy$yu zO7x#`PIwAD%f)4pS|Ob07;#p33OvKbRXU`c74AC>!jtO@`!>l(-I$Juv%)=)5T0eZ znK*o5!HP4&Q=l1^nsrkNBhCmBmSSw=2IXV zs%B-DfZpYu0?$(S>8M~4XNGg>St=K$Tfmv&ey1h&pXK7R)ORtFMB~ix6nK_#E}P4i zn0yv-W;lmuxwxv573YQfKD}^hEf0pmSLU4X6ljLas+*n^aZWggXKFLpx+d$moD-e` z&oI(Zx>KAJo&wL%Us0xQ>CN8x6nKUjk14!_zT>QL?>2>J*7x|?gx^Kxtt75ij5sSi z1)gE=4D;6Z~_bzfacnUnb zp=_~^&s^ke@DzBKI*&P`ORd0&|F3VU3;+M#dcMdR;T)pxkF@bvbhEpPoDrS^&v1b? z-d>UO!8thJien=?og-i5d~nY^NGN4Pt;Z?`VZort`QRzw3>AxxT~*|Ka1PJ%Sm+uu zi<}ScSsRI^HMAMJtW=Tn!BgNFF0Sq_qoS|YhV_gTc$P|qYL$e|<$UlIcz4QbtXK?R zxzI_^G`qs|N-m*TI3Ju#&vJf}uC1%+D;EjrxigwLxrRrBc?4mXe9@=1mEa6_o{pbU z^oiL7JSU}u?CjuG808f&2Kj*^XM_7|WPXeAVx`USDYAt0oSZ^lrTz*;&>y7`j{% zo|A_Xo}uh?vulc+1)d^3tF#&7{~MtB>-e}u?>OB~g65atMN};(^fD)chXQoy?EC>b z93~0Pxg`m~IsK718HQW0sLOYIww_bq@~?KCB@AeguXu-v^^fjhR8A=9z~Ez;Z)X z)(DCh!+quxaVw|Of%BFk0B3e@mTozHyr%+YWlEL6g3!T9EGz){7p>wNB`~Kx1Br29 zclKn4bnbMC6|9_brNmrzHI$fJwQ%#_VTm#AANHI$G2Us3G3_6w92_vSe2sD`nf9l^ z%&vLX0SoEce)9+6lzY*vdq@e)ZRvr{kNE!{@pQaT6dZs%doV+m_P~w`aNX(EWXeAg z--#5>DqPCdWXhidyR+U;$jSCg>Goc*l-^G=@P3pMqsl+1xB1h0XB~`?hwU*iiQQr4 zA2P5Vu&}|}zj$XopOAY!kR%w`W6gFaYqgR{Sm_9`#gKUIv4#3yu$fMn4@1n{P$iMA z3Q5-k`GG)ezT3*+XaYu+G(Y0SFfa*e*XiKw*0jQ!&+uXbTWAH`@`Vwd?S8AU3*PWz z0$XSZ1V)%Qkk_21Gg;DDN0}>zWNWvi44Rd*EvJ;_s7i^}nviJipoO-;t+G+-0MJrX zRDb{Ld;X8F{Kx$NS;!U2*<6&3a+zGbu25W8L|k7f#`$XEC#6UfQm!05eecvr2Q8fW zoXawG>QmCs`Mu_3J@a?dgwOi{a_|vjLVt&=vcj-X-sDFg`rAY9&fxk zCS#y}`t-f^@!C|oKKe8HYtH4ZCfZ~2f#02OjE`p8P!pZ{=)J#wFmsFFeW*D;ULV2l zW%8w5M)J#T^*f5Cj2IOC8}NX#cAw!5g-oY5)*h5jr`f5Edl}sZs1rkDa!fwL3sQuP zj)hxGMBdiP6mlzXQ@mkRzGt*KQNvQXHTw)-h25~~t(n?LtJ!X6^4MDbBX2LTiK*$1 zK&Ve_td9zqc4kwvg{P=`QDvTN)G}D=+C(i4S$;^mxBFY@VfQ)M6@}dJ@`t3ovoIu0 zUg0~7ig!jsVsFBCmKExdZKsMBU0FeY((_TNoN3o5YLlJDNMGUJ-`U)%w>LM(N52hQ@IX=ltp1=4 zwI}89wI`vFHv@4WB30%(XwD`qtNma9{ja}*`2Q>4n3pub|MHFh?;HQmH~#N${9pdB z^3vUZ?n>aU1nx?}OW@~!_|<#jZ>?Yd^*{Y%_&ddHKA+81vs;_3@zLyLeQW!hnV-m? zGxF!PqS8c#0-Ty`A-jaPu=JqKG-{YX>RsJ_v7>3vsW_fH*IRP zCNhg}AM5?*41T`&^3LAgce>YK|EKHEFWfxU-F0eV|NHX3YtM8~&;0%Un>(GU_PXKW zty{MajZAJF8G-?WH7pc|^ZDUiG+c9^m#sfFRht}bXE#o7%T6}8W~XY~vg5T*y_Id( zTTeDd>e)^++u2;tPH!37+?g1EAoKM#nI$mY)93w{_70x!?w(nO+&g`syYCEu^MuST!Tds{3izC&_cP5&n-)^({^Uhcl|d~g5W?zvs_uOFR%=W2K7Z@P!BK`wp~dq;0} zXHElk_u&5SzEgA8_RDI$y`%U3GyXa7po=>`>VEnz)*rvN`0`;00PmW=aBN9B-LvQX z7U_TX+t1A1cxmq1OlJKf8N6lT*&Dr?!;7c4<1>4Q4&!67ZF!rohrqHMe3f)EfB9=0*!g4{m<8K3Q*#Z5!ARnZ=Wb zu*$ucF82;xl%=})EdIQ>`w#%m@7Xo~%(d?IL)|xCU3}>#1Q0w?@4}n1k+wg(@bZza zd%E82nT4w#_8$=YA0IUMm`jq`@YfmHPWw)E-+XW3nKN^0wBu=TpvF7)=ETR8K4_u`4}k?Y;VJ0PsZ?XPujyx)EC!0mc2>@+h_5|Wua9P@r`%Q?5Lh4BLl6H= zW^wkpx!E1v{rmmC$P7LeFn0GI=-UrRqHz0<$xoqo-K^TOpl3m0d4S3jCRbu9CE zeZ1LeP6Flp%#Hb(w|mF0_V&GnqmX%{=5hZv1ur!d}1kmmaeF@s-8h z&;N&y7jC}W-T%V;xy%2!eP8#$!TD3C7SG&VeC8rP>>s!9pSyOzABFDrmlwD1otv4# zZj`S&J<~gJ2@?H>?WenE-(R?N=^wVgvRWqWxNNMoTHCUt4dgFc*%2&1jsyY#tax*i z(~w(hZRnISJQz+5vJTLvlQ=4)%@(|U9J6dKyKx+H#M^&S-?S;avHq)OJBtYUSMm;Q zs>UdOt5F-ziqty|ygCBi+`u`l4{V)>pPG`j$t)asb8cooPSk2?^!9$TaOpWJklyKc zy+Gz>XQ4xS+h^xzUmFxoch`sAizk<){7|zoxv_>gM;4}*FaJswLKF|INIBE}XH68 zXXRV7BhAT9tFdvqQ_segEJChv5sm1kRx>-&+BPMBtc^I$B+!<{Hz2f35{l@~t2^gs z&IzW>_Yu_LXm6?GAwO9>wQFu>SMV@U`ExS|mmeNl4x8JHU`b-@r=}ilA~efD8_mCU zzI*C*(P4e16yIUL*W%UFV$?w(h=drtX}%sjq%Tf2eN zn0W*?3p-=1J~>hc{<-UyfhJQZuHd-6YzL3!H@SmH1 zD1ZNhKX~w-uRQ*hFa5zm{Ne6DcO`IF0(T`qByczWzZ?JGjsNe)|99j6yYc^Ep6qV? ze>eU|CbD}s{+FcWs$f~t2zTTEyYc_;I{x>?I+q!UitD1{P+TpRN~l*!{Qsptx^fTx zz5CBy3EY*yT?yQkz+DO4mB8<@1P(v)M{Dl+%h$iOy2qsIYC&t)`dSP64A5uNJ8}Zm z=Cx}xzUVT)7lnx9y_YX`4_!i`eeU|n`PnP*+#mYkBad(BefU!E%%0m7PvYTDYkFcT zJKoq*M`0W#x#=nCXLN;cRHQ~aS#+6CHBiJudkzYls7y7+P*T}k?=)MD5otuJw@@@~ z*OnR!fNk#Di`|P?rD$|^2E~rAp z3+K0^;w&YS8>dlm>)v=#e$&-F<;B@!{fE7F0MFZd;cWNRtG)fF=U<*(ZrX5qS%SU^APb@rp8jp*P96YNC z%pvu)yyZR#k*LG&TXTHrZq*YEJnfY?x|gq`l(}&E+1|Bly*-Cec0!ZS!r`}iN3Slv zf%4pIw}0Mt6V=F8eX1!d9Y!y_u`w~YtPOfeIM1?L1f+QGu?e3$TOm3IrH}7(e2%%7kkg|?p}XMT0h=9 z;eK>=?%L5V8c=55#*@e+?Rlqn^=*hk`kD6Z>b-indu@+@ycJWDKOuwCyZtjwEq!hle`??Uv6gYjLgMVA5nyohp#Hy48cJ{k2OnhL7k0V_+3J=#0*8n(>(N9Lcs(7WN< z)y}?;#l;)ZdWimve4(6MR^q(_uc1lkb~308O9NfIHqoAj_S%F_1e`~71C5GWllDpU z5o~OtldAt}tMMfIe3qKZR(7~YhnB7Gg~PzO(&}~LME9BVi*M}ezV_O}VQCJ<%A-^4 zhtiX_{KQ_H`?Z_D{!Z`m6+E|7AX5KF$8COHP8w5(%9R}M5l{b#kN^MROPBBYFaFt= z-}!PLf4KY4@3jQ}{hxgGp1(kc^nd%Of4tNo?YhuDQ=4=tn=53&2rNWGFwB9WRmsIs zgndGP5|=mE-2ZK^J^kw^*LVPE0{`Lw(5O-@uLF+}ZQ+I7Ab?driO{D#@>MjS|D|(z zH#8^e=u!nUW=S96&)>`l#5HUB?cxK^l0z#@XaFde0^c4 z2pVOj`t+|~ZvHX4w?FvFl4so)$6v{}ZTVMlzTUclL)hDM1bw)0th?7PN`vs8k9#j& zfl`{gwta5)My2=48PRkD?cVbjw?ot6ozh!|ezIe`ySrYN54v;+zbyTrFfFg|UVP&O zS|!o)+&d^ul6cqrYZrQl4xyD3=UbXvckc0D-~IGB{yaB(bbfZ%;)$ILmuCAoTw|~( z&Ar>@GhGlM?V}ezkvH!BRJ@&?FxVIHJBzyy$TPg~JpRxiLs;d$RGE$!Sh$Cp0{Uxp?y=cu2B zlLQ3tw7PrVgI-_Q{jT@k1&4cJ{1k@GW1T;B4Ymz9V9k3M&i0>q=IFvD*t|X6Pw)UU z5H@6oABnfW{~iBSvI5uM?Mv{$hw%L6y|9sQKl9L!zWdPfm-QbJa)#poIQXsZ&JV@0 zeCcxc!tw4WH^mKd9roV5Ec47s`;Fo!?V`0e*FWX>mP*Kas7p0RCO?Z&f{LH)E8!!1!@16K` z{<*8Zxz;}@I#lOougWjq+_`vWw)_0f-u~b8pGoAkaPdrc&kN{T?e5+MV~0k>?pwze zcOUWIl)MkV%<-!rIG}aA^esI0!kas~N5pp@6s$bW&JP!lUYvhMHuNgdxn&V^kF^$=1c-fH9*`tHMV{vDj4Y2kvfk-*j)S+u0D~_=54rysyu&|p2msxVJ`VF+ z>BsfPXy%8_O`E^~#D0Yv^78ZZ$9MPn0|UK{z7Z9jkB|pGGkD&)8TPRFrQYiwBg*aW zeBUb{;1|s!&*Pe}-Lad+0SEj+U4&nlKXY;J<}1Aq&Ok*h?l|7NeyG2QH_!BT$cgcb zvAE-Acjp282+9FVx%_y&=l9OoQzmC>_`S2wb*L&gepqBGn;?`Pj z8Jj4~D?558;Qj1!yXdcmmsGH*rmwGAo#ycRb?sXD33^Mto|0#}dGr=~D&5yB4d)8O z`DnP)*wSfkK_J_iZo%J0vSX~-90ThF#H1++-C9c>wg}Aqw{}1N0AGyrhHW=LbMqEo z-#;C|o2GPn&%TbhYL&XV9p>V2Ej!j~B4aRy7WT0QI{2kaxSwf2LS`d49f-K)=Pv$q z#Fz=3P!=3i02KtE?-G;gDo%HwoiT+l8nJOdra}~50=dN}S4Qi2bRn_8BNvL3kY609WgKsqm=^NJQ?x4jsM+*u>yW0FQ-AqYulht2Qovqf+Tv(+ZZG}(J}qn4Ej{M zAHM}fi(L%9xdhC8jUk`YH&Msr7rd!h*!|(4sSwRJb1-3FRzG@zW#gV3^dJyCaOSWX zH`PY!2obkrSMjn?jxE$Gl}(go1MRYc&{?Ly#(6_EXyyX!E020>v*Z&ljv3(%((RtE zHi^_Fo@%r;EgGjig5?E$rUl~%u9-7_*=kfPkK_tb+Os_h=ej=n$mGI~qvGD7=l|S( z^#9))>3{)!OhABvF=$9v9(Xy8+&g((?EK|jz5SPZFCFpv`Zmwkw*X^JY{*fNqTHSp z$|1HW6w21kjd3syT}Hf(G8DRKN3X5NE=oS!`e-w`>U<^0}? zXZ6xeB$!c>fNSD^3MGrwA5!>-(khYt&JE@uSArW)u+c zX;3I_q) z@Vpg}Al>aj?6vOMlfh0zz_4)SxDQ=mQBfW7Vi%EKK8xj$-HlweSEjFDnVUKHPuKTA zbPrFqnv;<0k87ii=7!BRB-7zJpV*M zvNL}A#8BqPVC-fdM@bF;g)S2LfgB|ireRzEZK4IxwczEG9yHvxnH2amR+_$=WUdB)7-`kJM;KI4*5K8)UCi@#3_w|ou zQ?75-Gk@EhM$9$t#wI;H0S4VR@JcthZHhgJpSChTu6G(ON7T$bj;;8e61 zu(DTah9B3*rZFpLd|PG%{B%(gPUyn%6$Rm!;*mBsZgXR8BYtgt<_FE@Xyy_4>nkfE zyLJatqR%dQNyr@%;f?paUF@B@(tY;O!bhlfpOi0pKd|xbDw}i?mlGa`T4`o zI)(o%e%XJQcYI{Ec78l}{RGNrgC}kNJjQo8`+Mj;W6-EJXQD5F;KLz>|Ro$8;@Us36XR#&||x~$AHa%F+omD zDDUo#tB&FmwWl!SuQ}-tU3(o?d~4>3&Gl_Ere({6nV)Q~Pi8vJ%;U9ft4|)LK8$Wf zA41*hzW%5Um|T3G|E~n0ZdKb4EL^&RJPn|GtX^e{hCnsmbtME3=^oE@pIn=f5Nt;t z%74$Xf+J1i9Q2>jdw_dhMzRV0Dp*TM8EMkKd_LWQKj2~E&GomA(}>*z$6(a`@?#B< zGlh8jTgP>nc%$U~YdIpATHxLS0MNMjOtIx>K3zP15&opOtk_-`&tN;^M+;Y83l9?> zb8e>3Q1&>)ZAFUx=tV!_LpJ8y&&(ssj+O+sa{V2BT6VP8LNIJH8sy@hzW!Mn3bNvD z{bX~k<1E{cFk~Y0L^Jc(nBbCGzp**pS*>OJ7O(DCeD$JkMPN3GRuf4H4NcZN!&~vG z&YVrk=n7NzY#zo}uyZam`?C8b0*|!#7#`YIE zLRenz%SPRs8#&X5T*1LDVbXF*1J3D7K1qrt@r^yX>P?{$25njjCic5-@=n^cbrG-CAC_H?U9Di&PU-tjQF$Be+90A z8%Hx-+t?nSYBYv7Y=a+E`8UwmLCLU6VRfU!@P)w>BoW53GWCVGnfo9LFpP1WI!lu7hZEz!3KpNW$Zmll<(??yisI$T(NZFEw8Gd21hD z$@cKu1-k-m0V@uu|BjiXaCf|J@P`oU2|iEv=6hZTpseIGw_d`~zSzosU1ZG4YSSQ? zTyW&AgRIx=TY;64MlS26z z5LP3)z$hIg@c{xFDG07VV`MGG?psCI3pZa`c(xx1da=VW;)}ZnUxQOFU+>0B__bT* z=erg|46sQv=@MT$7j)SgOZ^Y?qx$Zr1Wf(|(Qk(k3Oagq{JMAHCg!@F6Eo@TIl!QT zvheDGL8T#kW_kS+mKZ->xN>3clgkoAqf^jF$u8r7uM?a9$<5w}r|`V6V!$x}{w(U3 zezm29vhS>S+Pgd6>dt)JHxJ@f4>$veC6_@!8+yk8DpCxZ8%hL0461(lbaeP^$LN+9 zVGq&XC~tTEoZoU-;lUjxThR{}S;~1VZ!ljggO`pSB*#N)BexD5GgmJ_y|pg$gI05k%)3N) zFtVx3F?gmn`Xr_lxBewEt92RUg*jU7X^a|&gEy4Hz~8^?4UY@R`4yZXjt~8~w#}yW{d} znD2?q9Ujd6YO7w`G77)k%^9!PMmDcovnHF(qOt3nm|{QV5=Z0piOh!PxEqd~U*{~= zV~uuOvQ6Jdb#2WW#7K~j_vk13KaslIgBj#Z9S+330}qFJ^T3N5|I& zX^u}%pdnqp2uP6z1UO_8Cy)=xJc+^3NMzL!U$0&J!+LErgT(GseeK!@@%QyIU~#h6 z|J%dc>TP*lK6CBbA2lITjLC1d)~+2|v*uwus(hvUsXTZ8Yh^hl@gkADv&Qac?pwte z4`r}m|FHdKtjEe)L6VKusQWZLXS-g{NU$d&?h6AlUAqeII&egOQb!9NVuxDhp+*a{ zH64-~R_CeOn0yg_E|0z>PZ81DwHtnkd_A6T$bI0_^A3KTz;1Vtz(X!yE&}kMD}%7H zRi{yyA9b%nyz~pO=~n&P(pQNv2fwD>97n&+#&IOoGj;sTp+}|`HDo+J_$cnxlrPy_ z8{Z^71)~5XZ-z85svF{-#0SY#HMci6gTR6resWKMJjVn6nOD|v5DvP-9D?tTPvaEQ zC;LGQshCOZ0=NEa*FMz5@fqo4*1O{*ABNN^j;_nsjkapo8p{ID$Zp1OIBaXz4hRY3 z#s{`s^1=M}lTR9x?*|!0YA#6Gu0UBnZc*~M75c}m2AN0>7e^7t4WjZ&AagG+tdot_ zm_&<$dz_8+ks7L{nfszb=I<~`5fc5o`|^eRFwj>LksI-ozq>E06z{{~+}yyvmu)Jc z>jc_sAb02}Sql78xp*J)Rg%A0vj!4fI>+v$*KkfIHX>y#heDiI{JwmNoHh9)-a1y3 z?{HagnQOixMn3%h$nRF?mIw^X7Q1+jc>9sAoky=&I2xeuTCROT;ngT}VZw=+O< z-Aup#^<3ioZh&+oE9d=KDg z=7+F4k8Hxy%O_9Exyd{9qKfe-vNa$K`0AKf|LsgEci&LveoW$n;KVkJHee4LSeeYm zZJ30NZ3?v+eqf<5j_?x;6?|e;zEAe{eNj2{clb1Xh`fkzc|t}mV-WL}_Mbx@*dF1> zMkya#lusxW1Zbg<4z!s3#A3=PVz~adGZp#3O8V!aPb_(=Hmrzs?b-rliQUrQVJq9j z>*#3Zr)$^tca+;kII@}hAKF|W*|JV{4g~d=*ws#WZl6Nv-fI2CZF1OFZ!agXt7Oli z2->%e$hY8n08bZiFx&~MqY~B1;NQ*l@hN}GB{T1MK^ZA-;M}>~uG`LXTgrEqtNaBS zf1R(aE98eNrE=`XUk`RXm(~@dp>i%?uI7FJ|Cj&pukQKde~16v{pYR(?n>aU1nx@U zt^^bkc<#@>{wMc5Blk5t_qTug$3D%POavocId^Tl`?-ELA5CaCPy*TW;|>27zwkMj zP~Kuz<*Kzxu~>FDJb3C)@RMR01x3(z7B0OF=1o}ALD$dWx50!#Jt3(0q6mT<5lHn{nDf4Xfc&$o9PEe4J;LP@g73bUO#aK4 zgk$7#?D)e{=3MHj%L!?LbZB2chu!Z^0y{(aw`fZM*=S+=PP9_U%?3Nqqh$TixE2?>$Ml}QIP?o<-eAD0Gp_0tOq2gg6O zG}`qEHm6>lzi`xd`a&}JJxJ9zJ9;7G#Z?8BrFsES_HQdlEU0`!qHrLq=4uDBsZkC> z`2gKDr!Obh7b03t()&e0iEnZDK1n(S^_*KYOZqmExf`$Ji)Hb^2nHW(2lm9t`J=D( zuHxMFyNG<@1mq6p;ILBGGh-$MCX8_hry@+3#Mue$uyy_CLy( zPu%G5m7dsErs2Kv;NV#hxT}~tuJQ?l7Z?5J{hv}1&)44sw)^T?Sd7-Nn7Xa z_PI~?48Gl01VxUws09i23~aKC?+k7~G^R=G-au7PcGRbPgg%8H5oyue<9kYck3$JH z&u^jYa;2eXrFCjA9;&a<5?cqlz<-HU82to`GqPmMWuU=rG$@V178kkC;L2ORx+XAP zAqii)Qt4h*=viIH{vGxMqHj!^E(X?nd9ld?&z?nRi*OImO34u#cVQpePfzxB6^M(@ z5V%8=6!X%EleAVF+GK-8z^9`}MUF6t|I#fidu8#&Z12JwgSbW5>Fpn04*>LM>I3oZ zkMgB6r(Bz(6j;&zJtzezD`4{zQqXPUWwFxf;>^L^>;Z2P`t@xmZV1|!Ed6m03YShj zX0v^*l#%Hlue~+@8yu3$^4eXqr!jkhPKWwMClOe^vTt5J?Dna%Ex&sw3HxgPIk6~ykZ(X=JK;KB#mkl+1gh0)wlha znfwYGNy8`baOrl&pX@yKlfPZR{^8A|ty@U9t^B+w`pGYA|8DF0^@acbvCWCktLAb~ z;r}04qU&Q^0j^;~^0REBXz@eF#}@e6QwSN5VbIJB`Ju{(xp)5FqGwbUQw8mWFU4MJ3ZJP3$~n_Ds;MDp(A zS#&B()16f8P={;DzNux=Y%vO$AQxfvP)h=L48K-?sxzG1Tffet2^4`-@w z^}J#bXODp_BLu2fo?SR|rg!k%!l&<`ov(N76TBVd8aV$jph6$IctQ|8zuV9Ag6Z)T zb~LKY&+ZXw_b%~3z3g{f?e2TCdlq9%j-ruy;lkU}vHt0Yy(=FqK6@UjQ#@$Q=DCa; z)GjRUz+9&pc!!Ip&WpozR+`^+OVLJ79u53x??@ z@BJ}|49_8r$CxODJ7NZ&MjjM<>oPoygJ_WI4ah*OyQ9zdp4p4BSJHd-#(5d`g-&5S z@wI1hB^HJQ%pbZSjYhk6LeSmU4$82C%V2FDM}zyIgceVH1PS4H=05#s;f)JRLYE5! z5jGw=u&@(7vNOF`(Uy4x!y07UgPuQgPCVm%XArhI^3(_D!p63O%Ovg)2pxOg0sBcO z_o?ZP8bIjqNzr);TIzDJn+_kwEm%okPz^`%+mA0)do%fK>sOs?F7e8 z7DjH1I{|_A_MckVaRSlK{CPBmOXrq!;=la~{*@hl`rYn3C%b3g>kGrrpj(p1^2*I! ze|K^F>+=^r#TQ}kd%it_3k*;|C)Uy$U~iy(e-T59-n`s9bOj8044K2q;%>9K>zA;~ zi?7Kqz~^1q3-0PAEEtvt5eF^;!*ysfAmWv`y@P@Hu7`bc{iV5?z0gp)g{h%Mzf;?W z0(5pGs;2Gi*f`EZb8@5TD`{wzyUqL@x)Id#8zZPHiGmuJ!_lt8u;4&VI$97GWeQeK z$V6DZ_VBh^t28#%94orT89W63iPukT8+WBSsk>~LY~XOU+FlH@2I-QJwnz}&pilOG zfL7AJd(|HZD36X_P(Kh5s|B&abH=LR=D5`uWKIWeh3j2B*1LQJ*$i9^hhM{}5%i`C zspZfSpKk%D53>cA77X3Gk3mVJgjbinaO^S^9F(AcLvR1i?oIH#POhBRYtH}>V&{IU zW5?-*8*k&zPCvW@M|I)K`T1iZ<4z)|HX7?;%9PI;Pk}uUp-^Y-JI#GuC?)>Ey46>(shPPi!(If ztNRyszJTE{pg_T*4v2B#*t_Vhl=K4hC-mFix4L`xf%}SMCqi}-hSI_9pmMyHHQ}{q z5XSsSI!S(9uaDFb@yI#F5j%Wj>BGI)9|vm}b^Y#=^zorEK8Qp8tPxl+baBc@yJeT0 z&DoQFEti&ke)dZD<5w3hy(Cjh-nr6!?&kcdBlxq|n_@eKmnJu+K|L()7WRg}cu#Jj z+;{%7t?!ZqVfaBM#^{EcQ-h5sH)XfhIwPA$n;1JL92;CwiH_~gW;mEIQ?-^*jpaS4 z0OM3|!B#-QQ08%p#$2_wqhnTUyYT5w(2^zBgoA{;ZBJk76VXq}pdpx(z(tX)#U%+} zy-4K*IqAt+O%X5DfiRtrJ6gINQ$_?`Miya}sBz~f+zv1BrFDZRA)X1=>XkS9HV*dI z1-7_sbAA@nO-?S~iugnL)V0kha5pDvZKQO12VRo?aM<_j2)|{x&FXbbbNHsvh63xg zyjD1x(wHNTIM{{IkbR9R!3pdidN9PhL&t%?{}D?lIB>WH2aYzJ$NK2-cy+41aU^O@ zxr5~&OuSN9{Ll0x5VU_7?0=jWxfs)VhyF#c1(BbUk3M_}dp9Y<{;6?Nbb@w1oFw>< zek`->FtF+BUYTo$H}8HI3j&=d&G<)d^j>(iyL(pLQb_mUxz*ylo!SE(Q||3W05^*5 zzcd(P6K=M}Et;75v84_N0ffMIVz<|)zW8qUE<^tbKmI@-!09Ei86a}K2hUiJe+gH& z`h2K=L%G`hV26KK@51cdj2jEKS~N(;LM{-0@1>m(r{u-q!d?6jHVJMPh+lGP?pa|q zVY!5C^YQzlBzHd7z5bd{K=)ogxp?+4-YaK3o0BL)&QGLOdSrN)es$uXHR=UYDAhoDpbziYIFAGx9b3AJ%N&*(M)25NMb zOHa3Z=Ytu{g=k^4`-AA|LqHthl7cm!twi%8~(-nG9m&emHrb-%o=neiAOhN zFd|FxK=>cG3uM^@GUO;f?IX`%3_%m!!S&I9=|xg+O-R=-eyh=ubzi&oQA|5&K^(}@ zk8BeuOIk^uSUwRC^=Q$3egmDdSR|oGAU>A4^Y}XVKo4ewn;=qmIdhTl#8BojkSj2U zLS|N=r+nZWun?0D3*@jFUG7Uzr>6Z*M3cOXv>(Yl^0;pfZlS3d6ynh(Ozr6@Hz_~! zuq0smzbFR*O~{+3$KCR~7IyfzvI(WH_mRhi*)MB9g8Kp{u>wdS4>=gkNkANvS!(W# z)G|`tkP1luTznHDb8TE?^@xZS62X=o|Bk$X&hOP{M>fQ&v-2b26RaE--%Y-J6ju(4 z>|X3jdBn$Y3XoxHqa*(QpJN1m(;Oq?*h%%) zgYK&U32_WgL$kH5k9@<1M>F`j+rpyl2F^3G(fHlgHrcXM$itu|*l(Hj4?UJa%BJH9 znRpWaNEyk(Jc&y=mYz&@5R{4hs(dffN|LLS&5o_o-#QMRJK`u&`QszHV=GdwvV2+p znVH&j$LS0a*z#`un@7I)kW1n{)Et{^KvMEs_=Y}BG=rIJU=U%;V&r5i)0##@da$Y8 z_-2_~1hzO7g^(F!X@xx`+gv^mDhK;|_1=5}yIw{iifup+B=hiJZxD4eI_;7jIK`gJ zBX9co&wmcGHAY;xmogv=xqagledhkb4-p+Z(HLpLVz})sis=#TCsYJFZoi85kbUbv z;E_p$?(Oyupk=n!wz(e!mSAba4(#=|J6y|Xz@@-(5}WfNjxUA@3FpWei{Pu>K9x=W z=yxA_z|30Fe`Rh2wejAqa8p(HNgBZ~KuD-uk*}>G$1I_RTp|B*w4eq=A6oKJ=(25WUtI_%FfF2+0oe}vQ*{|nV)8!$~>C6GjmDC$h2gdGEC;A^k37jq@PXS zpZ;k2nsiTkTY5u!ae8|C*mOGeX6o0eAEfS0U6ndFwI#JKH7}*4j!Z?9&nF*E-kH21 zd0BE-a$~Y7d0gWE62DA*H}S>9rxG_Mu1M@oY)q_7%uKL}lM?y(U*j*we;EI0^0nxP zBF%;8B0o!gD7riP=V&7Gu?U-sC+lP1j%6a7>3d^*YFzxh_|>u7<817a?C$K!%ypUW z=)HxrqfbPw=(6~#_zAIJB$r1^xlz$8V!g4B*xdNcMn6j>9wCi2Jhmm^O` zj*p#@y(yE6oS%BU_*C(O#n$4S;)uf63m+&fEgYYJDSv|i0GsU%ZepdW=o=6;&_#M>WJvL2y8l7IMQc1 zz9dlJD8qbxSaeK;Rk;!?DJ8bVQcwC3U-Kgl92uP)VHE~>iX{%aNh~K&UvdR7vtFI6b`6An&6sa4gRI;pL0shT+s3ovbVW>|#?{VnBC5}aa51zWuX*Z$7 zlpq4=>eRjdhP=m*_>@~;uEe7rs2;~M)ZH#_kYIh%;VA@-gXJx&pah&s-Q^%zJO~g! zB66}s-RUd5s8V-089JO&Af^xmhWbP~+3kLmMBPSE9IN895Fp5uKz-by0?KI(RF$J{ zb;~8WO3<5v?syH~U^> zA?qLR<3E@$%O#beKIE$aP&ZY0@kXaoq`2rf5)80d>Vs~jz)4vx@%XGn-QYvXEOou} zMRabrD~SSioxeRl;77c_?49?OVfL3{t}Vk{Q-;}BhPk>7^WHMdd&)3Zm0_+d!(35@ zxx5T>SsCWiGR!4qn0J?9E+&{k0&!6p&E5*a)mui@<7<2lefz>;(Q!1Sw7(56@FULm zBhK?9&h;bSC@0pyZtn~j)+d6Sw=#qa&)@L?evrE@FTW6`H~** z$|)-=-F})bKcdr*ILD9J=0|k+5$*1W*%H(*$3nXa>{dTb+lc678hRZB68aVf14h{5 zC)(^swE7X7{D_TygiSby1_WPM9PhKe%n1`P zd|>7yN~6kN8d-)p+Lz5yWfVu2VMh4g8SZFBXH^1~CSiKTNk^2uHLMI%^yO11qsW(G za=v%6WfU17MVd$t^el_Mjk57f%8y9;-bnZf;(kQTeFF=|Kag1on9h(tSSxV!JYawC zOfJdfRwyY@DV#(%ko7-Ze8c&>_(t(-#Yc)CFYYUDFP>eTRh(KpwiqwGT6nSWT;Y3# zrwU&we4+4A;f}&b3pWi+Eg<*wsA(H=V z{*CLvTtTz&AyayZFiCb;Waw8;c8yQt{+s zuJC`EiN)U*e^`9Hcz^N3#l6M$VoPy)aUymC{!w^2!xY~t{t@f;wS{{NTM7+W*PodG zPX3Af_4)JiN9GgQS9uIOD;MU@&VD=l5Oz{-&)%H9E_-$M((HxVUD<8fv$JcmOS5yc zr)QPy#B5!5ST>b;GxKWZ`OGt!Z)Xl<9?LwGxhHdb=H|@RnM*SlW_D$^WzNp5$t=yx z&77VYmO=2k^qc8d(=Vl;Pd}6XcKSg2vGhafd(tg3chsUuS9~zquxPd9pXTC)t@?muyMSPtHhk z$y1V}lgB1AiMJB3CtgXsnD|lR>BN(X#}oG@?nvB{xFK;(;_^gqVo#zou{oh9)+JgJ z^Aj@?4GAuBN@8^4*u?NeCJ~9h6@NYcO8mw6kK#|qpNu~qe>i?${Eql7@f+gT#4nHc z#`nZKFr^H9ckBtwHXX26ATd~(;uf$%A{V4Wy?8(^Uv4>;# z#qNmR61yRG4fcKZ#5!Y}V|r{|tR*%-HY3&$<6@`8M#qkg4Uc7Fk?32|*Q2jQUyS}J z`gHWk=;P6cqxVJch~5&tA$m>p@@Q{#PqZ_-IjTq3p({DRWHb_?_tUp}@M9kQs0VNH z;72@ovj;!y!4G-xCJ)}|!4G=y1`l5E!RtKu0S~_4gYWa;eh*&j!D~FY&x2Qc@Vy>< zj|Z>v;FTV{!h@H4@G=ix>cLAq_-+qg?7@pXxYvWd9_;bpg#=Ou=nK5(^F4T;2ha83 zyF9qZgS$Pr%Y!>TxWj|nJ=pERE)RBk@Ei|r^I(Su+da6|gKZw%;=#=xZ1vzK4{r3J z?Lo_frUwlV>K@cQc(w;OcpZyDgKIpv+Jmb+xYC0wJh|8&vRKU_5RcklUc9{j5Z-}2J`;yu6V!Tn!~em9zxUwpJosA={>Fo^c<^Nck3ppLp=c1mZi-dCx!c;Ikfl#)Cif;14|beGh)mgWvVw(;obe2fyvXZ+Y;W1mb&7 zdGH$!zC?Z9f%~W@J^a_4=l#?H4}R5yU-96VJ@_R8k>3;E^Wz@;q6Z)I;1@jjc>+QI zIq&&V4?g0-hduaN4?g6<2R-;14?f_*`w2vTpZ1>b^WeQ6{vPl7Qy#qA!++9yzRQDm zdiXoM=TCU>b`Rd>!H;|JRu6uRKz#qB-t#RU{D=o{_TYy-_#qG8@24*Ep7(mN*MmJ?`h|&Tgr*K$;DYmAaGnd!b-}w_u!jJ8|8Dnbm;1ESecIuI z?Jlz0ed=;Srwh(;!8R9kxS*W?djD4Usm*=b;y!J5L8}WkxnQFUY!_HAFkN7{KzD)W zg0o$)!3AfzU_Al!{xjXDGhDFF1#8{3HSW`D7p!u@N*Anf!EyrV{Vnd(GWThz`?SOb zi(RnD1q)rUzy+^3oD(+u~i$$dKA1&uB^%>~n4aHl)qVVIj%bkhnhGVdaDE;8#PGwxH`eM&h`rKF2YxX8GRjJe2Y z0xSN4*Y6&4&;K99iiM6AUn)MBYD>PFJdnIO@krv@#K`!UW9P+IM!yujB)TE;ROF+P z-Lb!5ZTa=|XVM=@Uzy&S*3%8?ap_^Hzoveb`cCT6)NQG2Qma!lQuV1(IMaVF`RU{p z$sI{8xiBeX4VX{7nfQ6)n~9Gn&QG)^RwNp+zKg_v7k?&xPyB=NcgN3(pBbNnRU1y^ zW8cF1?AF-Tu}!hlW0PY?$LQ#9qd$y(3hS-T==`V{t&3(Oe~!Emc`$NS#E2}4$dQwA z>i#GCXY|+TPt!Nim(b_XXVA^`)S_N^xo}fqZ2r#tQMns)iR@L`BQqb&j4s|??7>-l zs_xpCQNvv*-V&S!p|c{tOaX-fYo|DN0h)KSs;2uyP< z5&#&sR!Vz4&SbBxh`pvFc3(y8)fKVtt%!Y3MeJ1-u~$~aUQrQyc}47H6|t9A#9mSn z`|gU^i^(aO!$e)fot{p@$BQabI;Usd^|ZgmE~tb&zY_AiO2~67 zA>UOA>72+7F468vbi2ql>0r8@mFRXn=2t(Dtw8umj43LYh9c|sXf(Gk!=RRLOqN6IRRp~{u z64I!I)GHyiO31S-AvaV)o>d9CzMPL|R-!wj5^`N7q;nKFxCPf#qFY@FxvCO!WhLZ_ zN=WB;aPYTVD$zMdgoEjpR-#){3Awlua#1DZ!b->mm5}o*A?H;>&aH%;QwixDB@V7+ zb0s?GIB_uD%u005k>X&wrb=|DS3)*cLY`I$IlU6nIc6OE?P=wb+feCMwGvXPgp?~G zrAkP#5>lvyq?B9;#blUd(EZe5f3nY(t^3%GGM@x*9TRbqvia430=KNR9|wLd)eQ1TjcD8!>{ zfB57>$*b;Ah)=5h;S&!fuM-Z1`1sl%KJHNRI`&YAk2yX%o!-6;;UO%zs4^{EL*Np} z8wsp{M%6CW$V2(i(T75ORP7HRc_?{}I27XHwb*e)?NSXpln)gTg}6}r!}&wWD|aZw z+1ek@97Ty*qJ`OLuSia< zrs?7jigy*)7JKve#($nsacg~Mv^{%g_SEQ4GDpUq&s`Q@l0PB+hr+X&*W;g0ofmr~ z7D;|Mem%V@tHryMUnG5%*gEGn8N*7zdt~qNMA+&Ewi`yVD{a)#^To0E%be9 zDaGeE#@?U!Rqnf)r*d~EUrv2BwI+RGp)R?n&>WkPzBP7EGsDfm1g34$N%V@TsD3XA`4MsB*T~KG7%qJwd=GFo^AAwsK(Dw@DBMTSSg6&9`+IR)<+ zw$5AjazcdB*7m)u_LS%}9icg9*t4WG&2pU8}LT5tZ&|J2@ zgb*Qr8|}dxGJ2ULtEOderp=oIZ?ZO8YcV0h1w2NuG>t){3YHak zDU$+ADIFa~XL(z(R7F;Clh~3NT~QTV5Ec?5NkC_`B}k@fn+z*L{y5w@wp11JWEk86 z=W`M(+bl8=At0h@h?b?P3aja8Wwe7jpAZR(s_7zQ7-$5E7bMw4(=qT}DXXZED9_<6p0aKIPO9}7B$AyMPAi3PPb)z0QzPQA%Y>8 zh~A7=lTAiLm((msfo&=}4|OAmvk8%HL!fO@QWZlHp~s*TG+9#_*3h8@1*4e|Nv5jt zs?2H%%RxJ#-8f4|*Rs&pG}wvEa)`iQO|ifo-PBaHglx;Qt_n6Qp}kmfrt>)ku4&Mx zY!xiDp?6eOQ%nth&EjjSl5*yIqQ^-ab`duW0M zB`h+~UW$eJBnL}-gFBrNnG%X@Dx%3rEWA0YssR0g9?mHmSjkC^PELjeMT$psAqhGh zlEi{XC>himI{j%55u<3bA#k#7D-yZ^q|$);79q!~js8BJ5W(h76Les0qB|AnJ=0=T z2)SVCFsM>aB}C8-tcc>6nu%sGc?nijs1|QpvZ$lV(+ClIzK9`0^{V=cHFVpLN%Y%oscfrLgA2@!;qQ58{SDZGXO zP!=KG(5tALrE97tKv;PW&XNq45TW9x3E73PVU$v!8!?m%3ar6IFa&;roidpQ4;?9S z7%p`Qs$MlE$fdwQ(q&!JrxGHDK|9$HLo^^11g|1r333VLh$(<-mk5z1$bzgIngSIB zU5N>VY2zldq{FsT6a}T;DHAI|U83VdL$fHEWEh%;&qAWm?-+fG^EnQ!ChI&pq{=H` zjML5>1{e;5w#rN2Fwf>xDOLp8v9^e!kY1|>g*5Mf}|cqj)(wH1NGIK+t} z)Hh0JSqubzlJhy4f#MZx2nMKP2g)UY@lZGz4p(GBEmnf8f<2oo7Y1CLt$N>F4D<>6rjYI7n6l2L>ReL$7T+|-aH^lYa*&{9OMRE$dENQX#9&w-|d7Qz3l ztz&4BkcVvPP+<~#G$E4E+#CiU)X72vVW2`ApkyKsErhuCM>%D}>|3-jcM>^B8-s3Z zifCXR(*qNuxqT!dlHr~~<V?ZYMCe>BxD3bKl4O{gU@Is)Jar42r9z@} z&gU>W!^y`;iAQ2NG19B*<@b#^NyI5)2&P++o5F(7o zhO9|Y8>-A;c8NI`1|ujT6;pCSvD1WzvoHu^ZATb`)e#tr>41eHmo+rZf|L{?vP}Uh z!(?Qr0!JVOLlem$4Q4?dFiAq>Oz{{T2_Zr#2W1BRjUfUH8J-g{d$1CONU)(nR2Zu1 z&D6_L7)`2Wu& zmr?m^aL@jv>^Zn&o=C4r-G&?S%aC;VcbEf*IdGT*hdFSV1BW>fh66q0dYY0W=S_?B zEJFl(YnOA*3NKX~+Ba@+qF;Aw8&nw^zRZSJb6_ftV>QEoPbv5-qMn}F(%iJ7xo+O# zS-AgPpOk?%aT_5&>KJe5KM-PlYIMrOaxVcfcDc@F_i~xngj}VD3T; zJi-kuwoX{HmKc1aN{cN2*N?BnA9WnOizw9Ahc`!r5z|sD7oXP zlZb<DBxLUEl z7OvR->;lW|z2FGOwB*P$P~dqrS?zYy4F*}}VO>_Oyaz&-*Xi{Axdj)uPf4gf4at!f zO1r*hX$Oeb23}LKdSvBlMgD5IB3H^Xu-pS)0;{r$V}>g86*R_Ugr?->L3CWo(hd_%iN%KkFJ9QOpDZaU=BOcKpi_b zKY>21m;_CFI z)K62NP3=#0q~@o_r6}Cv|4edL@+8=Ae?M_g!c2^ce@6G9WMYhtCrWBu}=cJ>B_ZFH9C*{AN z|5Sc@eq`>c+-*52H!S-V*wC-aGMQgt=VC`@X|b(12e$anj*X4u2YFn=mNT3n3Ql+g z5=0K+5jKS&;x~pM;_Pv;3H)H^K;_?Ktq@r;W-yVU8X<^qz8}Z~LDE7HiD!o(5;lY& z;?D{}#I2tYn~cUA?0K+^p8|Vkh|JhCLJ%?Qf{A!_?fBRvQmlavlFCZOt7}5!rK}D? zB(DlVB&`f4Vx$!zh{WY?{RTN^DytvEw}i-xUluAaZfS_TxFsQo*u^1;m_=cT76uWC z4Whar1d%d71Q8DU19~YwC(R8(B+dyzB+L$O7<^D@4wKicPPfhA}{vz5JXI4Fp;317J^8g9)d_Z)vezkCtGFpkoL|h0Wk#)!JfeysVSdQxiA+i#th9Kfg zA&9v85Jc>hU?NtX9D+zWB?OT?X-sSk#=nC;ga@+;PNx}uqQlHVPS47zxCx=C#s`0o z8y6-gc5EoBF~Q$sM~BIYIXM(nUGVpqlLB)hqtS_>s7?s@9?9wWFgYp5g`zq(_3CxLQ(vC(O=wPpmoea+Z$=s_pk(3Pl8Y3k98DTyB zk8#L+kQ2VaB@mPbfv0za@^|C0dW5g>0luLJlOmWOBU2v)>9Y=l0_O*ye8#05=;_y& zsocOaJ2N1qhLOJx{|f3?o<%zEuTEi#JYCycO8h|oRty(*oYRG*A2 z8hONV#|_@tVT1;lK6zn^5EDff=QOXF>bTkKn#!=VSIIKBoSn@rUc0z?sX9ZNBR30+ z*acJJ2?#;5yLN1Jqd}J#dcVG@yL(&1)Tv#T)yb9INW<>K)NP12U60VXT3cyT_tv&X z63ZD8Y^NhSQi&Un)NTZ++&Uc>dw6aQX3RTVfv`R7ucr4>e_%!mH^WnU5BZZ0h2`-J;C9CD9uD% zZ*At{Ioq}Njk{VGwjyA4$IiX;G9yU?UL>Coi4=>GR8xH_vS`8)C-~cs9CQvkLLu!( z+%k1^w(hYSQOM4Y9aca7tl#&NUpKMA^B+PuAeN69eo=s1Mp@DDU~ zn~n(Cc(-d?M|+pGfm{lkP6G6f?=ld6eLDWMx0;i!t++=u*}I1{o?K+Krte;@&u?qh z_jK(t7bsh1?%HB4ZQHVQ^^7%(cIn2dP0P2Rvr=qdyh^o~Eki*D7YGg_w`-l|fHEO2 zc4^zDZH}O#(cymj<@)+a(zygx!Kal1V|K48Wfh@OS-ipUwXMunBBU|Gw=O58?^?MW z!F_QHt5uuPvD@tKXz$sbMq7>ZC|#pKw;=f%DY? ze!coRB1sLz&sX33^u8d|y1i{FD57yAE;^aWF{yl0)yl(l$AB0&{{wQ|IcMn>e#Sz% zd+w^myBF;=wWiiJuug{ElJKI+;G&avGljC-6V87~Xdq;TRUgLN7 zHD0yGFYf@2OI?je9SAa#>^(XOQ6D$rjK0>cF6yw?^tHAp>(0H-#!l1KG#F4Svw|+s z^WI)Rp!fAvtQso<`+>(8x)fv>+OstymF;`Mrm(OVFoG;AWJ*Q>cj?F7~ty-{+S-WlKE^B6x z4(RNFV(%(-@9O^dX#;eDP1klmy7~OKs&#=1+Q6ItPzMItF!LJR5tuTptPQwSfL9q^ z>8*=7+MuJa-K%K>OhU_ae>iPW&J^f{_;lfyXR(2ZDR7B#Hjn_3efPfn%3w~bUW(Iy$AinU0p=kNUNmPbDi;ABe zTNgP$zqjz0?A@8IsW<7f5FwzI?x7z4Z(l9w7RfRTY)7pK)cnw zv!ip%z=aYN>DKysdivY0UY|lJ1$jQHy^PwsHt+DKZ%OQ~Br5Xd515F7qR^8 zMa=d&_STlo#>!1=IyV}-=9{y&ZJDu-UEL25!lncV_-}7 zEs6hyl|lbpAjt1a?Y8ZW=Fl%Ej5sG)^vj#J+Dsv^-jMJWknpi@Tf+O70kF}n>DZ<= z7kW<3hSg5+=n`fwP#-D$+bXw@32?}hevtZwvuD-nwPN*YK0NlkGdt+s&LdqVG^mc1 zmC!r2j#c;NRx)$9Ew^{?>RLW;F59#g4(v8;s@K-FbnM<`YFqX&a{Z>c`tr6mW|0s= z356YpJnd8$B*+z3DhKy10vvM%^~>R5`z1V)h3l6}(84Ql*5EDN=zV5@udu=l>N6BS zdBhTD8MZo-oIa`A{v-Tf4Zc@QrWRyVmK+Am<(IZ7YvELPjmWGPlm$}Lika(_rA*&) zl-?g1J9yK~V;u9MG{o5w7ON zp5@3n1P&1z6nJCoqo(%zt=8q6TKBYeZPMEJwhVJsmFlWv93i0DE2}Cv zmHgkDFYQp87tG$+wY{Tjlf1TT(K#!XZ8PU6D>kg#vSejf^MVaa^tH;u+2?2*7m~A# zpd*BqEdpC%!j!5uU-D1!M+SeBkL0z;z9Crs_f9&&QF1-gf|~{|dwohSeA8gE zVsx~3TkT}A+`Y-#>MWi$1S8RazOXD=G4Pa)_#!Kpbx3sAoz z>YY&Mw*H_RRT$#lF*T}s(pn1g3tYSH_nv>E!>NmDubm$CUAt%3td99Btd`ANS{KdRCTZ<$X48sw{EFF1h{?deq6)k<%#yww=-d;7>hAB{WnH0fmQf0FA|1eq zDM!0XqbZmb(%WFgAUWB-ZDS|=3DhWQx(`wk2{oKZL?@F=b zU*7#MPp7^2ae@}$cfIFbqae!u%3+Osa`_q=@iR!b#wi-ZltkwQ?clbR*SQ0h)+KnUa_-kng>ygn&1TrT*|;cXckG%< z5~(M`t#j%9LB8Dk*0+cy)4B$etxa%rwr%@G^hkG1O9qc=@|`o+ zh|6~_G!|^x-PFBpcZb<7Fz2jjUA1g^$Fe0I^VV!{+tjr4P{*|Jy2=~YrUvP%TEkk9 zi~b<(bX3?5EQRgBtAeT%dZgMH6g2=Vrf)jy;YLSY*}YoZxog|J8RE`WdpdV4 zH8)Eu7`<(^(Pl4`H-_kt73NW1XUhh)XRXdg0{GO5(NVjzk^BF7>UAnHJoZw7&d4wr)9GcqLcQ zMXtn=+a1Evl`E$1wDe6K9b2Yu-`3Wlnf1h@urp5Kay4~ebo~rmD&E)$zm4W{TygF; zws*H|Z*R9crwSsckW1VpzHa91#qM$TR30HzN+Je4gwCj&rFG(l`BY8>5tCVZXX76; z)3<%}hZ%pw_r8fILM-$SpB%a->QL3>2Uj(|`j_WMfBTnb*Qg1GYguW$xq{FKm4QHF{s=l;I&k3EU8Kbd-5 zAX7eZJ^9^$+pPh?j%qXIe?{h9N%`b`^@UZjW2gf`!JTR`rAL@Ja6C&@yZ=YLL4_U9 z&ia?9)qU&7eTZyWGZfX~ZKZ?ZrfQD}@AL`F+zIZ4#krYW!^#E%`afr7vv9N4y?OPF zre!M^&f3kl&zrfUMcy-K)yi25XRzzI?Q_;>vzqIzrml5jm~hz7Ye1In05h` zKXu$dJzHyIKlH_+T+lo-bmjI1#p2t$eyrOKgVqgbJhp5{?j62vSSc@`A?@BUqj|&j zu6k?XoO7CYnX?u!%ZygBb#?dbO)J)IT(m}>#k4n-8wix&a6`CAZF^gHg}(T<)(t^{ z5^IZRZ*q*&H-q+`D>iTVzFDE}=%D}Rz2~54khM9{bL!}@9TkR|;cgNg{kA)5-v!-$ zK~XICo_n&}QO^t5aYIX%pCG=&J1Ro6&S5$i?CF}vbS>S`zL*h~uM}r*T)9eEu(NBe zxp0xV11o$1zm5_4-=$bKz*clO%suI&2kjO+w>@qaDzgUlnDn==<@HfNS(gv>GN zf24n&K9K%o`kM64^qJ|VbT&Oc^=j(-sSl?fPF<90O)XCGsZq(lCtpl{HF;NZUvfwC zjO6Lbamh^L4~g$3K9u-uVsBzoVo`!ijEw&+{zCjK@jK&J$G6AV#T(;e<7q@C_-^c> z*iEtC*v8nx7#lk}`q$|5(Jx2uh`u+vHrgE>6Fn`Oiu^9}bmYOvjS(|)VPtM(N@N)Q z2K@~ED19@15xt3CNHb*bW8m+&7$1oY-ihbr2412LP*+w-6OndBl{5iqm)A(UtV$Y> z_b#oR#&Jlyq)HkLpQ(3ONyA zjMuD89k`%M5}M)sDoJRC^Qt7F5zeiW1YW+YN)lMPr&?%nR8>>nZWW%hSBtQU+DoN-@dX*$J zidH2FRX)2)5~{qRN)oDkR+S`Fd3}{6mfnA6wIu4m8C8EvlEA~2m6I4Gt*DX&_AalI#MAp*swGhemQ_jO=>1EpB~b^KR7rxcEv}LT z_AaWPw6IbVaS%=&SWqPi?44gF3GAI$B?&y7TO|oRoKqzUB09TT61~5oL~Qt5DX#X z)PduwB+2x?W2z)!0yC;=(!QgrCY6q^mP8#GStUuN_YJR_R2oq&i8^p(l_YecBdR9t zD^yJ?6{{st2ZmKi;^|VZS`u|2UnL1LpRJZe9mrHpVj+j=%1I1*WvWV&M3<6Pk_38R zqDm69XnbH27N2ibSR^5O00&v2&p`U~71DX7fyJOky@B+f4a~1E03N*mLmi$+&i@P4 zg;e1;`5)xIn7u1AJv}isBJq#-%dzi8zYw{DejgJ5gTLP4YS@Eko*$xv=izsMsqt?g zy!GeH|LMmBWV5Qw${KH)1{`J>u;LN)T4$`i!21W=Ol7}h0z#M;2FC%Q{>Q0 zVTOn)v1fnV__K3=w{KJDJ%LQ=zoH<)p$sppye;8SMb->m6&2p(1VylQo6+RjOp(Ge z1s-dLMpEM6eX8*VaHQ@_HwH50Huw4tR=bwL=#r^PjEyMSssa88mZb2uDXAte8?~7t zhGxo8U1o`X`K`w1X1)1Hp4cPJ;ETSu0A}ccR?`YVvA*ei% zyv)~Tityjhl#g1C-~Dyl72r!CQ*L!{0%0AXYVgFw>6#_L!HZ>zmdx_H!Wb5ubgH&m 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

;^yKj{AIrGqF)t#0q6F+ zacVzQ_0_Uhz!s#>b5D}Ph@PrmO|{uR#L2K_IU*ZW5*cU1g$#b+zt9$2l| zsJO90^0O5el>eao$?`Y&e_Xy=K2Uyb@PhJ^vTv4sIPinASCyS8>ngj-x4(=k{i^R{ zrH_@qwDfpsbLsBD8+@+`N}*qez8E|fdY5l8^aB5_Aw6`x|1F^%!T$<=Hu&~nG;th1 z|L zT41|IVW$OvWBL)&%I1M&YM_`^2ay7!01DY;fMLojD*lb)SNgTiy->gm$^nbF6oB#& zwp~>Md%VKPxQGfM`ZdnIP_<$Uye6QeAFg*6%<_O((>PsaRYR~9`V~$qMQ0Qn2)-;L zjWV8S2tYBgOck|kI%jM2%bZq#@i7%-2H^=hr|59eGN#7xBC;4P0Ibq4C9Nz$;{^_d zNazkjL6NS(%L?#$0Fht;$-$uSC9QxFY^j=Tm>QsFQNJt825Y0(2BZ-@k3uH;CCjU_RbYRRb8)9@K0y2Q2>&@=FOUHZ;gD_g{^ZH?DadT9Vq)D=sGyHWksNG zA+11FjzJPJII?B3rmcvm%he6k9y4%98wb6%$ zL9aNiaGlXPK&+^wxX1wTf+m=n%8R0o-m{Q~MEWZaU_QMk-U{J&MdC#ZeqR(S0jkuH zR9of+)e>zU)FS?F+B6kaHsJ#{@M;(?f-J5XI)25etfq)NVz**Jdmt#LVXBNSBi0X> zJPI3a8A!nrc-Kxjt@7}h)6a5RVe;br5j(@wlysA2QLTn70f0=Hh<3}=SDaRwh46u@ zB9DLp{sg#9Opcc@7Az`Z6@{UG>AbvZvxtR*OqyW@WOkqqS`{#47%qh5bnQx~k*opL zn8i>q_cRSj9oBBHT6q7)K)vGY7xFtJJ%0b?s7U%?iEbHhj+A{batnnZodxs`-) zys3zA`LbkbtAe7lB8Xj4duU<}A9ikqFqUj`oG56bCMlw2>Jla?RwJilk!sWrW36<> z=4?QjV`*V3VB&F>LDoI`UAJZG|HfL07Dhz?k}=YZu$E95tgDO$+IU3(j|hE<^IAZh zwLqL;qbq?NArNjA30i{3%W{gX_r`7|U;=RlXJDP`4*G$@LoEqV07wB4sDE%;2}DJp zs2qC8;04@7gNqyU1=>ru4VHS;X~mgPZW1Pl#sQ=S)4;SqCV+PnRn9=};7?+$uy{oQ z{fX|!EhNC>s;sRrDAiZ7KIw~{muDc5EDWuQ&P3HB<|7X*6`&#_vaL%Ol1Atl{3jMZ zV`D|B2Cz;sc@+FcLbbnaNaT5tSej0fXhSB zkY@xA4@R<~78pz(#j=odWYQLCWkU&aPz_K(fQP`sHlTKZ$zdDNfvT>f7KtoG3&{My zmsYU|48WW#vS#3QR1PBwO>WUQJNIIFQ?)R4fCvn{30}gqRvF0@$=-kgqmMc7h2R0o zhA|Ns25-!11i{%t?;_)j6cD4fhP)S&&TPoBJn|6E?c%Wj-lI0r`lLd(6f>X)hwccAtAJlH-o0rP+4oVIE^fX@GN9w zad@n#0QFQ*3_@MPVwo6F1o1|k%^65?K;#d2d%B__VyA#Mg={bax6gSg3w@&M5|VKx z1P6iDYZKjz{eV#k4k-1vu~rP!vB*pKZqC+uRQF!pppOsYcm1oR(Yb#wBWSTp-wFu3xSiNaRdg5OSWQKmT5tkBRjalc_35* zMh!I1*v~LCdDaAUi-~c!C8BG_oLhk&2H#`Kz$wy2*%D0!-728wTj7BZrc(dxv;shd z!HEVkKqO>@2s&n&fs$qmL(Uq8N`1k3paKLDJkf^9pxEGy#-vfOQ>j=!8e*)C&aD() z(G3Q#iT77TgJ=M7PYXIwtZd|$P#=!niV=C;gqCG_V4q+gSMgTZ{-7oma7Y|+8p+s@ zG}N~8f+1LVBULbE*a$MVX_RoYN1f;8p=6-1h_%9)GYBvmL?38i7l9hW`i5rE0U<9@ zZ*yAZ2^rJ8^ID*cGE5fMkHW*oVKAW>tT@KB0QIcd%8kyg2){P+F_4al1}ad( zGK0|pjmc5(ac%`IgPm5w>O`G5Nyf22NQJ!{$ukH@@_kMt76?4p6EzXc5Sa9!s?s#< z*=Q$W;po>o&&vb#MAwm9K_eS1QX7!fsAKiRUb68G=ub%p7=WSU0}NS_KnjIz znrC?)1S}#0Z7N~A20QNiomQ}{02PD{Q^SmqK_!m&F+kZu6b}APIYv!Bd>h(%dCRah z7%xy6Jf3Q>60{H&DX$uM2AMN|;XDx&(E$2CdY%|pI*|7`yr*TuR74D!qaKL0!aKsy z#d;T^G8j%%f!Kuvf9%L(T(%^#v0~$L?(do<+wW(0;)ThV~^! zJM|*xR?x44h&>n(m{4s3)TM+;CcykA7B*Mm+zR?!R|M=(P?RPfjxVuQh0JxBrm9H& zJk|;;7&Z@M0NfOv2HV*tb}R?88J4_6{g=~9gawcEB9_O$fcqxfPFZ#|!HORSoP-s;L{cYyjmF z7kQZ%okpC9Nr}xDng;e7R5T0@?5PTjCI(~AIgMbAV@?7kN5NjmU~-Aj+c-j@Q*kSC z!FegzwT6w22iRLYG>9l^(D5)r7}-LOokpD|w=!Yr%TQxb9k9nZV#ebqx&<2)^A?Jj z+zJX?C=tEiPHJ z6M%koBR){CsHwSOYuOd_eRdwZ#Tx}0Xn+mQ`|pjtKY%=PzCR!}-0vTbtcGhM+3$X^ zu#6D;J{IWRI4xtLW4pkfufTRwpyXk+0l3Gsz2BLle1tS*-}c@4-#M$#?eL71{l-e6 zZwx|4>}t@iIJx2ItpN3sVK~_oun)of$??XhLTPp0_|p8dgwO0{Hv4tOtxgUOo4N*V z2=xSt8f>bp3d}s5H(;d0U{Sm~dZRYlQfNnKy|%tKuVlaZ|7-6%;N&XH_2=yL9(o9E zLr5d+?kO{KW;TTMLJFjjMoG@hoY|dZ8(Wf10L{+O38pxJ?YZC!Nb{ZI)YMp*l=!X>+0+Is@SIEFq?E_e69;x2AO#USNgC(jgvCS5D9zCx;-vnO?zdVG4eJTtJQ`sy|h)^4*a>y1d>as>M2VWtzNeD zjOwQ17PWezn%mMkwfb+!QOIrRn@knlW0z-_fmHiXTrUE~a2J8%ub}A^zzd7}U;1*dX3 z#}r-K5gEE9+;;PczPC6m7-xLxOlN-1%sFJ#&v_V6+=%_0p$5U-7CH-r5s2{6#mzo} zD+<)@VB$-v1&Wv&>gU{ZQE8U8;4V zz^*rn#g;I)Gy|*2grf|(rB518FUZCr3#_M9B%^DIgRrpk9kTQhmmk+#Nmot7v@fSi zUji6x3ez2K3V4mkhCV2x%jk=A^dd*NDIi}a^xd#HGjtu$2|)dgkXL$< zLo)`1!biKhxVS5FROmlK{}Q?;)Dl_&UcFnzwLX>cZ073zW=iCc<&#*KZWQ2-QKcS z^)7_pf7tW3=ewRy!|T7xv(}UGoB*HypSi!}zSn&PJpRviPjg4Behq*B&s5!5wXJGB zy!}t&{sMl$FT>aWDy|rRHU5?O1M#cj<-asu8y^#U7e4-`j~tBL3J?E_BC~9j7$>=BR9P*5+(Wj~2W_SMZKb zXe+(QR(heW^a5My`L@yxw$k;s(sj1dwYJhVw$k%#rK@eFt8Aq!ZKW%0rOR!l=h#Y@ z*-Dq%N|)G57u!nDwv{fjl`gcEF0hr(x0TMbmCm)5&asuwww2DZl?t}fNw(67w$ib7 zQrE9-rEl9xzhoo$!bn_k~q0xU_ad_u9a2tTk<|xh-mEO)+27 zs&sWW*0i;^c5kmqz<}lY=7?%PdxrZ$&gpkg!3ps%PAg9u$v00NN#zM6seI~4Dp%WA zwwDfl5B3B2fZb5x9!L4%>wjtZ`rtQ$fxrTP$^ClOi!OoN?fM1&2P@`! zO+i`NTnxX{VG7DlwY}MBlX7gugdapUBSWJK3L`j|W{{jOU4TO;TxsD}nYBze*KGG!s6rG}yL=w>aB`jmX&K%*b@5eYN3NP{9MUXIklet+6ckitYhn*;pi- zA8K-i{II1!}7VJa^&x&)mRrQqSVj zI;|fU>iwvvR5A4=fv2dkAN$R}N(ZvpSlWM=I&1Ghhr*MMhel3>J8&VzdKZ4i@T+8= z%{kb(d2^k4&!W;=?P;XJqr&`Y46Xx8zUQpcD(%l{&g$GLrhg6_#qiGPNT-Z1D&6-; zBkcghgCybb4C4hJ8(Gpa?ENW-GJsz*y!Ubz9q`ZY7*tzYIQR|NIR+VqWuZo^Yv$!+Q=MDR6Ft*JL7rzycMXjqtQl z;mK?3aEaS4cQyAg%^3HoSzMmjt-Qq!A>;BNj?Rm|WKU0m^eq z=MLE8z|-8H6V$-doUVtL^(asC$e8FxoDLL`Qn3CbJDiAsNQn^(%4xXTAy5ad*@(*` zbDTy*2jgl>!;Z$*uAWTk9BmlV@y~8CFq~DD&erCpqRFXh`iNHn9&YOh21z6kiX_3I zTt-S@=An7G4v&FZlZ)A87VJ?EAfMx_6iBH{9c%?|a6e;vD?X@DDfEg7)M? z9BoanfQVom_Ra=*EOj=j&2YC>vaMYvbKkL}Z5Gig2*!~S;tX$cWUxi>b_&5QSalKL zD+)a`N{ZIp${W1|C&r-{?3P@@xGWv^Mh~Y9Ifv*mOlr($P>!RfTQ?!ESsCFV1|9 zl&eeG!ESv0`@D%WCho)7=lfH7{C)jy{we56N4$+A6h~sZCINZqlOm$D5g>{GK!lho z;eclD#TP%TD&cS)GtP8=}CJ4eqa@r#d=%g$k z!QlCC5@g{}CpFOQB>X;;X#}+*6f~s@Aje0}WyE*G>t90JR;wFGO=;8Mg~?{GMv(Ea zg^A^8GhCr$XZ_9ff=(RA3WVQd$po!H8mu9C#DvS>k;O?#vWjO(l{PvYK&mE${elxl62NDIFiV8>D+uhyW-D81@n)K7;!RJ~CJ*or*2G)9gV|>K zdGkjwoT&ft`gx0om{!^_c>LQfHHL>UxnDY5AuDU`Et>n!XL1^~KJc}Y$j+PkrQSwE z*|(^SbO{m_5vxD8)I9cA5CK8GlE+yMWF#;Vf{(*uEX^*h(T4sI`1 z+rE}&Tp4+6w&3$XXkbc(JxD@?h=l6^RDV{njq^(9X%Dfa|Bz;NO$LF}u%p7DD;H97 zHFO~u#L~QVjjEAC5ws;BqQb)zGFE}SGfJzSZfJ(^M#KmI z4L3Bk0_TnSXu@Uq8SMcE^c7Y|O{4C9+lRrh#_az`yP93`vtw6+sm~u-5H5#48~lCX zLjR|HZ-4=?$@7H!FQ5{*hI^4a85RGUe?2v&t%KjU&AtPz>9BFTxxwUC>8<3*WmYy23x(~gkgYowzf7IN2o(*hrU&j>s2cd zv6+v|p1M+})^bu_+I6)-&C$@-+0kfhddBf;kV}I)N(HGM3`r`xxXFyHtRR5Kj1jb0 zH2JJj$KcMkIo`6lKU6cLG>Rtb$`Rft20EP)2j&pw&!;ocB`G2(R@4HR{4$`wK|GDs z6V#U42S0&Lr%Q$_9CY7BW1l-5E?9v6XkR@-V;f}3vGK-p$;4RWZ}9vB`<7D-n?tONQYuvf^)TmwrZ_|w1^$Ea$oF3ibN ztJZE(J=&}$AP*bXZqsvz!{u+F;YlzW30YVUz%M7j!kFO^oC>YB3QZOW0Ikj&GfOR6 z!z)`tj1BK#A*jYNa@dv-&_#hc0mD2egJ}ySCu&*&+b2wGAR7b&n#GuzQEDFC_cn`* zWVrIcBxQVn!&dvkflXq(rdeo(vM@q{*9vr>AORCJE3egAi7z#24^Wv}#`plbZr%6{ zj;Upm;C4%9(ckb}5CEwm!%vTHI^y+zY*4M1%Gu3mticR^tMd!_4JO6Adn_j(bt7B$|HEMeY z+%W1A$V)f3QOk8E;8?)d!r+)ha_iL4kn-vUU9377BkF`&o+~&^q}89h4#bBr07BaW zlMfb81!k*c3eHsE|4NEdwlCnbKMSDtADWf<%+h9UED_C;-9ltAR-L=GW>v8nOcy3b ztFxS)5C+yGkf1SEE1djtnYHNzuxTx_yE9QNvpobT8Q zR44_~;N#80d;q37u>69w5=RQr>K)8BGh&*m1&n5oK_luPWW=sO4eK zpxYR=I`vWH{GYNqMY*G4|6l8h$K~75=^6?|P5)obSHVwYKW* zDuLTRf~$W|rtH;*;=sMa>WB_g{jj5Mb4QJuFPb<3IJ{T%E#EL8ib#$N+At(^6~ODQ zg1Iq?T{FcfJ;9)3aclu2-Y%{2bidHeL#7@L3Bxr`G0{qy`Ev9m$^qk#n65a7|04yZ ztEsaF#MxWami$m3f6xVjg}=`*YbW2sU}EgLJy=*V;|4=r(uU zgvsTrhAB{M8dW84MnU7yT@^}^3Jm-f3uH~%r?q|H0%o;98rwcsF}XQ9ynvy>6_Np1 zG&ocCXbm3FR$DgMFpaP+brc&+oX|$7t%fsKg&YMIjhD)9t?^SUYNu;XSSj%HPbE|$sngN=>T5(calhRpeZEv2jt=J-ola%&cYyQbpq`RC@hhe00jG4XutRjxd9VZ+qz;_EpCHZrYBi;4O^-# zH&DYBr$yanyb?HEss?SINOYipP)>p_kq4`B3QXZ?Fu#N98${emtLY<@K8l7yZ11n)BK^i_L1ylCEY2w`AtEF1y}$ z$Z^&EiOw%<{>TTeLts^h8zAPsP=JLhkpgWp$i_i23ol6tPPO3e{fO4+_08d+mYx}}DZ^4BIrXb2D$R*z&f={_9*{7_Zg zU>Hw!3iS0z?x3pR$3;qK=E<0m3wdxQU#5+afm4d}5z=g;&@wxv*c>1R28x8Z%v2%) zzf+LO3h;AB2nihJQiVbuX+rWAo~JMdT{>)pTkdU!JL7i6qN2}jni{(Uw=B?-3od8 zltAVi1VRCKXb&-PN3obcz{`@ZtVd`lRKgZXfJj)ngte& zkX3o$8IUpyd22xFpG?Xkay_Bnk^Ddcmm}=?$Z%l(4CVQyZO+db;^;X8%YI#2#zN0h z0sTGL|B$iCHmjG#IfL2%W9}chyvsZ{xPKH|5xp+*?~!rg3qlVEe-*3`^!T6k{+auj z`^#>(x%a=z)l*#_!XIyWTh7!Ya%k9mOhYqnoRA}2QE)-2keUu*>SKqk8Cbea_II;3 z;sj)D;t2JV2+vSu1N{S%;=t!854AUv{2;qs5`GCiXO@rCnpk-|M;?b^-MGa> z1$@}sIno6n+9)BZ$S#5SdI47@C{GeOq=td>gk^+ws(h^0{(+6fYIj7MmSOGhco=7nXhF~_x#aO&tq^H{0=soCcpbWM_WWy>mg=0C^_qY8sMBriz9^1BKa%=RK>0N~E=yU|r(=nJZu5h zO<08{lK@J`>b63KoURtDSF(JB*6abDtks3Y*zC@N37wF`Yv8~U7=%I!t|1^Xhh+d) zYXngu?h_hAq~!!-fQ6NyXIgoT*6@KaBg+lX;LK=pdv)wY&thKevf^6w^UQKwYi?yL zGxApr8y=byxA72k*j8qwqOwidYw-wYlw;Z>4ETLn_PF7sSup8xhkjqs-d9K-Y|-BO za#U;Y_j? z4n0Ww9uPJvB$3QOUzf=6a1BKEThJyUc^Wh~$oPsx3KmUImcv@p2iy@X2a2KTFo+rZ ze8k6n=y+4eObWMSD0-1xR7fE6FH$8Su9qFGt>X1(mP1;@Df&{sOF1+OYL0f;wFQ9} zO~M#w_w}mNVS}VFih$IVpnzcsDg~w_LwaMZipar)G~MQXU!GPD!slz+Q4J?maZ=ge z@AG96o{Xqk8Gcd8WG#zd1S!c76U3qw{EC&U=A<%fmWlkbRC0M{<@|XY)-SJXZO3+} z)0O~dg-Wlnv$L(EzOJr<+t+!6Jin6Dt9LZkR4;4IBJak~b3ygGqSCsoShuX$Rh-k_x~&7M zK@o}pbOSH(@E_v-?C{{wZ)s4NQXZ-QaEZY33VpYXEC3+eLXu;)zx5p)hVlR7{(qjk z!4-cg{zUw`cw>A{{KVLMvFBnB#x9Rt6idgBjJ_59THxHk)PURnQ~&4vH~6=J?f(?t zfBU}gd&GB@Pw`Fn9pnAA_Z!}Oy_b2{dIhljzwY^>=N3&M13MtFUj0zCVD1HRf9KELoGq%4mhgyn1fmZ_o$;~&AN3|Yw zRBOM3S~B;5gIX!>en++Lb5!eI2ep#iJq~ImxVs(I+UKB_#NFkn)}0P&iQFBIYTfRj zmcZTSsMf6xYVq7Hm1?EylNoNWqgppRsFmh!a!^a=Zgf*J?+CP-D8bZuIy#X$*KyoW4>5`qDE*ZbO6rNvqiQ2|1#cKCuRrt1@F zmp(acYRUCN#&!8=SXMb1%Pz7qrjVEs2du%1FQ2UE(*XySQho=OcyFajiTY&PGtn~{ zZNgfQE?`PE||`^a+k? zjdM~fb)2JG$2zH%JlavMqny-AjB!*e?xdC!byO?jq?Q=crgaL@JM7vc!O}ToJWCk$ zqU(hTp7ByuGF_X(LC84ug?d499n^jfb#MX0+?Q$*tvlqa#AH2EtWUxOV&8=P@R&fD z+rxg4tq`&c8zbgfQe;U41)ll44V(O8sy->G`j_Ds*wO{l^oPc zayuQ>y39eX1b3;UT9-JeC2>1KxF2QwH{$;9|GB0CD8}c;Pm28^_Py9cu`6O5W0}}d z(YK?AqW45Ejjr|I7+4h*qmjrj{ZB={6uB+Z6*)IDHR2Ax96lJ{6K)PK4EV$2Lw^jt z5ITTdf@)}1V0&m>@OQ!Q1Zsl&gQegF!BlWe;LX5S19yEmE@q>x80~@49vJO`(H zfe%d&Oa$Lf76ivKl4M9pDT!#-Og5twL?rc1WRj{1)(q}*S}pkeL5}+)<7`y(86;~F z;Uo?hebC+tN$xRLO92CZ0Z#8QNbvcDnw4NXlXyim4fYT)pu1KW$&LWQqyxOvff&gLzXxmupMKuM( z9fItV8MF;O6Oon1T77i%|(IFrD0Oc@v0=txiqrdxW2B}O2~O|wDU0EAuKM%!s6i7 zp30{rB~wTgT(9W0V5!N$!~&XNu)`!IxxlMR77-q5z91w-*B-4_1u7h_Q>&Gg^Y|u& zLc;Y9TnhqX`e8gQWI$SuSI)b>sMV_Ar@-By)v7=Q!?o+R1cY}W<4iJ_#Y5mNWssyE z;SfrJN6%%rDy>!pS}*QAt?QFYu8;*4TLC0j8JQR56x@greGOI@IiD$XXkP_Fos0~_ zEi8#}B~%c4nB)s!j07JO_>ME&k@{DOASX#D!0>^Q0U|N935;%OKAS_npEQ(0^malY9SDpi12@vU`|XR@wIE8_Ek~=nJkd72!EAQG5C{=NeSZ+7Fn6c2-dzz z1k<;ghtCZU`T>xzrD1&o6)I?E!TzJDuHS045H!Z~1%wGCa|MLOix_~agn06FR!yZ9 z$@My`l~s8;gR3O`MKK!Kmtb^f5OgA{;N{NbxEj{1EM^T7C*dlZ#!CiGbuynp5-XVz zHX!Iy@MvF^N3III6A_F!AbJPYk&0=ZPAmBWW^G>LCTO+5P?QE&9KuF~3?jq?I1cgP zgGd$Byn^_5*H^V4RA6ynTPAf^>$=Hw|RksKpEPW!41*qSs-7?^hz5iP?c zDilDklE!kwOHjwLC(M9E8%qn;ganI6lfYZTv+sfJczBT_ z(t?-acb~>!#-zpT`9P~xfv1}*XtiK|1`(~SU?8C9kS+;}T?*?QTsrxjkaaz)JtDdf zQ%`_DKKN@3N>WZBolrqU&trirh(+zI&{rZOD`AY_2>C!nW)dqC$iLw3j^?>`Yqctb zhH#f^KPbtVrb)O8;BOI;lS-oB!S|3<;7N~kS*K`~Fb+~Y!VfVFkl6{Isi>J&g+u{y zJaAFfW>}>d2yO>!l>$a{L4iRRa{**jaBj_FnUp{>A+Uj+bp4$DppwT-$YJupI|vIi zhNg;WGc0&XcxEM&*-6@0fg2HSWSHd%(4iL)Q>1_bD2aE5cLirz&ZpN(D+munvIixl zWbmEnu|yWj8WMql2}a_yVTwtd#_wRcOXd;4f%TuyWz%qQ$ive+r-;zxu*PE%gZVj? z$RhWGoB{=r%42U!Va-h-5KeX-&}-RKDsgRkEp!4_1@K(u5i^3NIRTPlj5oYxkfG$D zR?&V@fes2&5B(%#%%KIC`Kg?oLr*Az#HF=b*aQ{ulL;!erEDgZk-$6xWptiL_aGL9 zo2u19C#NyOSz9qoQaKUJnwUY-Fl1@TVa)evwbGf4ge5ysU_U4!f&ytW((w6^u^wU< zHj_fTds2zN&&5pZl0zOTYxgP9fy+0N6bgxKbqG zUV;OGA}KO=s$L6AB*p=ldjxPkF$N#JGORtA9vB>X*In%X-{bqOEB;^cpTwVyAB;Z` z?~Rw@ZSjlZOXKzNDe+_Dp4hvwS7P6ZeE~iJdt+C|I%C<`^4M9iGh*Xnf#`eD*P_oy zpN>8ny*;`s+8r&x%0DN{M^A>9;Dg8;kryIgi98#UYv97bl0YUfIdBa84u0eRng84Vr~IGt z-|WA_-{DvM=lW;(r}>Zf`@@UF>F}iRG2yDvJE5P3z8QMT_gi=n>I`K=%R^^{ z&IpYQ1%mGdUkg4Td^-4O@b=)YV0W+(TpgSn6occTkN9)ot-y~zG^fAOhK%;WXb+6` zz-SNreR|+1_tasoINWEBa8DfKcEcSolsslAdDKwyh@s?RL&-yik_QbX`wb-z7)tIp zl-y@1xz|u~kD=slL&-iv$z6t$I}Igw7)ow8l-y=0xz$i|i=kw%q2y*m$xVim8^^dO z40bYbz0ax)b`@}Gk3OX2@-gm-LmUMH!wdYw3%tV%JV&@E4>jyhHk3>TLnP4ax zZz!oYl$>lRImu9Rf}v!bq2xG2$+3o#qYWiT8A`?&O5%o+sG%fcC<(FGImo!|dLix} zKgf{mI>`QHh|!oo(mi>of!KwijY@-!!Kzkiu;JJBHv6eTMqVzV4X!~3T~5$S1{rT% z-!hbZQ!5!{l;wI2C3_4dHyBEG8%nM>lw4;h`M9CvT0_Y-hLT-|lB*3RR~bsKG?ZLn zD7oBFQZ|&73?(}aC6^gWE;W=~Vkp^RDA{f(={A&XHI#H2N;(ZC9fp#2L&?R4k~Tw0 ztD&UDP||EDX)=^-Hk1?%C5?uX217}~P@)=2@`jR}p+qs1Y%-K=G?ZLqD7ny3a)F`b zd_&0wL&K~$qw2{1^(4zv z9L3@wy4n!eZko+>#IZPX61qu5v*e)zN+Dm73{5XIz*)Wk{3hf%uQn_4W|t(GUF-BXV$A^;~o!8$!4YquaE{sx{=N#;V8 zVc|Dhm8Lp`uPS0qSFtAF3g*D}e%3Cyc7e4^r|C+kHl`AN@i(qR-kMxjds7`eqYxfE zZ)TfLrdc88wR6YM7e0FQC9XqBgkFlsHwM03DBjex$}33FiWsjP_;{d&97c?;$lm#sVk2-@zrW~XB`Sa0%^u#v&`vZq*DnM*?U!(Fl6v6=fPl~$-)+tOG7z~ z)DsquQB$69*!^B?HVKY)7;B99vY z>|16W_jr<-U|@VuK}?9W&@yIeT1pghu=S;rX{#K{$@2JNJ#M*(8s=zsvk57P!yfN@ zJR~C*MA?Ie8^Vk~w8SwcLxx4n3=T?T=L9V{eH+-wI$JwB+lwtGi{l9M zwX-~=@S;#tY@q=~D{Rvs&WG~}JV~U2jNR4pHHdhe@El^L$4Ye1|N?%30;32e;UUd(YTnBxo`rB_Cm5589Xz7$C#r zCnaa#&m_o7nokI@)5E@95aqnp*>O(!6zvHXRz8XuXkOUStN$!k00WR^=D(#*&jm=_ z0nQYVsUw0O27O$xz-N|$BU&N{za2!>D=o0O&z(J#cnFuPlLs%ImgEvxIt@>uY&Gt# zBfeavML5iX?-Pf`JW@6xOEdgSkg7S8hl>T8Z_(~$<&(5_&*(ppS)OMM#{zB1tYN2L zfp4kFDY-_~_#g}W!v3ATfIePX@Wmp?KUVXMRABfri zH+pY(#b1jbia#9R9q){xnAx`3t7r_i2E0FnUu!g9WFZWps8EfYg z<}y%S^m3oEkg?x;+(ITn_Gxn&oXUH-12(e9EMx-y?ok`rBNj5S4sj2g%izx3%ROWx zd(cMqDI3{-3z>}f{z)qt+VX&fECt#9HnRI{WcOOg*!#Q3LY9E+ZX4M?3mJRwciG79 zw2-keafglUb_*FB6SvvOZncoHF>#BTOe3A><@VahZnluIxp|X?jLoAPZDhR`GWH%m zVIgCEy~jp&gN2Os^==#4^%gSL*Voy|K5ijneSNKs>>6{Kwr1_Jk$ucYcD03!y`!sa zWLH|q*!#P}Ms~S{jLqA!jjUuLV{@~|Mz+&N_7NM|WmYn*OCPn6u`zh5jqDN&85^HF zY-HPQWZf1rHg>n!$hKO@*x2o|kg@UEX(Q_}mq~2zXt$AFY$0P~u+2io##yV4ti?jc z##ytCtjR{U#X`o$;AR_H(L%WbD0PXd}BIX2 z?v1?@do}js*bidgj(sim#n?ea0o)tAJ$7U4y4Y2*ow4n)_EI28U0!G#ptuqFGN3!D1lFc32;yJn&{=xt5n#jQk?UyuAt?rX-w3|~O~j$_)6hfk;jv*?=nX^#G=f*K z8XAcG!CBBbydO9i*o$a`i~S$?U-Ccb-|Wx&>-|Uit9(y-cKIInJs5vI{#^W#_}=)X z@rL-4cq%?V9*O-SG$sC4{D<*pz?X1Wyc}7+!o#x zUKd^-UKE~%xP~d=>hPFw02-8cLa&5g1UKR#Xi^S>TVa1_UuZWpDs7=np>@!zEDFsE zjR^%puHgH@cY<#~zw%=6x!@thI~)ui0Egn<;O^kn!JUYEXbUz5HwD)Pmj@R?^TG$G z1gnE%gJXh$z&n9A0tACGwm%rrS;cxeE@UQeQ_RsN){?q-Z`p5Z0 zz7Krw`rh=t>U+ueyzg1xGpvVw_xNu0?eXpMm3%vV?Y_;vtZ##FrEjrsj<4P)`cC(q z>Ko@f(iieoc|Y*J>wVMvs`n-D^WJB@&v>8oKJIBs-X2K@IErgp1i-e7Y4TJ?kl`v13Bg_&igqsLA5?(}jA>jpt=M!!qTu-=;a4q2) z!t)4M6Rsj$Nw|V=IpMj4=MXLfBGo&MaDxAF7u(HGCHZ*5YQj?pPbNHx@I;1a=L!B- zT~qM)j`5y@1Bm6z#?+AZO_%1`&A=hsR-w7_#zUS8@|1ZL~3Ev|8Pr^3| zf5i~r^G5K1YZKb>A5{KJ!q*93Bm4#7tAsx%e1-65gfA2Rl<+4E@jE{b&0?>~^%9l; zi10Pm`0s>2ApAbz^Mv0ce2(zDgx_I^-}^SfPZ2&zsI3P0zJv7n z^Ms!x{4C)U4Do%Rq0f&KewxY;(C5bpAEoj~=<~yb4^jDp^!ZbS`w2fu_yFPkg!eJT z@83(G?;*UKa3A4agm)6&L3lgiZG^WH-og;yyO;20D!++7-$>X?_zA*2gf|fGCcK{T zI>L_=UQ2il;V#0D5nfGr72%bHS1`o;xtuq?{@uDxBh9H{%NZYU3y`s{;5NUb{#I(p-qQY9a2UUl>4mlmNIw(49(qW?x7wK>z1FrW1{nPn6Y|vr7E?cL6TC2kv9nRBXwGOKo zaJ?(_Pb>6K%k@v^>Tr$@%XC<(!x9}9>u|OXi*#71!vY3e?|l8!JpI#L{nH%%(`^0I zEFEU*aFz};bU0Io=?u8udi_&IhqMl|4k;ayIwW+EbP#nA7{F6V|5T?#tqwIhoT0-s z9ZuI_Dg*9@Df*|$+Nat{df`O9@HD+}f?jy4UN~Matkw%p(F;%33s2GuPt*%f&4isX(2MPuO@uMJEUwF9dSO&AjOc}7y)dMI3hJK% z+NWB-Ug*;cy?UWXFLZ0rTjh0E1-V{k|9?3+#ua}*{!aXj_$%=japOG{e;P~x2jctV z`*8Q&9ltuhGu{nOfJSHq*2R~{7sY4A({Ubm-sP2crj~`=Kk?8{HkfI=U0g0&UP1Y>KXnE{`sX&Wfg?E0_|kj*g9vi3XxB zXbau}+rTT47bDL_4&jb{FmfQWAG`y5BfFt5*hw0LO%8Mh&uLnNgC=+L#v!+JUb~-< zWjAza7v9Gm{SA{_`d;mxzBAN~yL#iG+j=_0ho&%Hgw4Huzvaz+*5JE)-;Hw=M|)tj z2S$5fvY4=K$)4h_T zdnKpcD^X7ON{;T8oOZ87Io&Hcx>s^^ujJ@HIjT*j_oLk>(O=qq5~$rLfpnkbc2d2M z5MD-jDd8oAI|#QEb`x$R+)CI**h$zy*iLvcVH;s9VGCh1VH4pN!p($5!bZXd!UCa6 zm?z8;W(gI-O@tc>FCx5<@B+f~2{#a~CtOFkmT(Q>d4#J8R}roxTtT>;@La-k2$vBq zC0s(dnDA`EMT83p7ZA=ToJTm9a1P;Y!dZkf3C|*&L3k$Nbi#VVG@(qGB1{q{2qi+1 zP#~-$tRXyua2nz1gi{D76HX$WNO&sYc*1JJQwUEcJc;l`!f}Mh6OJW3j__E*qX~~9 zJd!X@7$b}lMhL@%A;KVGfY49qBlHq_2;GF7j=FvqdZ9nj=RXpDK=?l49|+$g{5|3C z2!BiXF5#~U|BLW#!nX+jlkiQ#UlINX;V%haCwz_Y7lf}8{+#d?!k-boO!!m6pAf!8 z_#?s>34ciV0^z?C{($iNgwGRxkMKFd?-G88@DSnG3BN}8Rl=_jK128=7XKgRj&sH8 zqur5ziv+{7LfeC%3%u;V%KJsn;;J7)lrh~&dp49)h=iD`rH+ngD9vLO|Au<3Y96F4 z?U|M`1JUNZI3&yCg7vHCWaiCTzhHi1A*!XiLoc@iLq-+eb0B?5yzci zcs@OiB|_sAcZ9|SazstyI7lR zDyl7=`iHuE4D}!pI=lYaarq*VpEe+ z$C6S{SzBz$Bh6&>IjgG$zLuX}z4qL-sf6RimRh4~S`fZnLoL&OyP6VSre);2Oo(aZ zYe@*z^PALMClZXCXT)CH7vWOjW%Xyo77O62<-x(3NF+e!DE?l)Zy>gi(rRSvA+UFqMwryK&t|f~g_m0|JYjfR@7qLvq6_I+qqj7rm z*)5%FQ#A^z&s|l$4)0~7klZLcekXm&Mn#rv6#pBVVU%0uu%G)Ug@jlr8HBC^C|!~J z73|%-EJ=w}ItP+$FuyKSyNkKjW$SdTo?GnPKIlJ77ndb;`P5-uKKY1~PBL^kIEshl zLL4$@7X4HAIrXN~vCZcY>L*J1R1(2kpeDi428lXooIze*Kp^;eh&fdA)vG#{PPOB_ zRp+SNs@J!+Z|TGGyt0UON?(P0rj_Per`tt>Nw8sKmBPeLA`gucqw5@{Wix`OORLI)HhEN#wk+(KJ@6XG8z+y%^5F?cXNPQdq96}>jf>W#ghi{C zC4{*fmaJXFuU@e(BQ97of5ET~N8e8Sawcy_Q??g3ceSXs`UYEDY#q92VHImrI*ZvR zb$az2rI_#PXe;K`_L_FJ1yG0mYkKuG_I235*y@*Mb+omwLuGt1b$Wem_nOMxG1Bdt zG1apm&3qor(iu6S=5yEt8R z_yDB#;GM?;nHN%W!YT}PX1Pv#uG#(1WyMZW;km52Sk89#C^(f>$U$Kqc-k|!T&q1o zWl9;rz*k}RYH+?$yN&U*jwxj-CCRXOjQQmn?J<^BeiLSokwXwRJLh$^HME1O+lCwG zT&M4&QXUVB2NB9=Xb&>6@`D)2EE?2KY)>Y^@zb3)TFlCzte5k7P_pAlFQ#}|1oZozT}NXMNsR8{E;5t^8(WJ zfXhJQkp@FVx|9s^ks#Fq5+NvRE}5lk(yC&v5tpR7jcQ9nzKh-ey@7vq#r_mchFd~c z;6F$IjrPE34~+J}Xb+6`z-SMQ_P~d?2cZ3`AJBeDrRf7|lVMtVjW=p*?CjgUe7w%3}5wQ-3eY;%grc2$O!by@KL)*Ioa%_0SU;*P#?LV5%9s zc@YP0WV=JgNima0Ha4&rLq9i6B}JO4^4xM719q}*R%CzJnlChTFBqq#~`5k}&cqOwY9sb0{owB(8%xz_&=#kPWD delta 1249 zcmYjQZA=tL7@nEko!#5p-PtSRA)iZ-h~W0qrBNAwA0YfQ4G=O+HsB$0&ZLJnr zd$}_)O*9wWQbI$2z>k_VZBN}M*aVtLNt>dy+K{xyXyixJTA^uc6HC%LNK-d?CX?rV z=AHL_-r3Qq{iAd4i>WW*W&pqfMFoWb08F{$D9WU4!CM0yr8u%mSMVBnM*bq}crfWDCjWV6pg%OEY6qBFco}i&@tlGHgq^Vqh4s)LyHl7i)QQ9i?1~oSUCy}I zRW8Sxw0K;req>`h`Q;ejG#~eA7Cye*TKp!{Dc_9ow-d~U6u)_I-$TZ(WEuP%ETrZ9 zEJw4JpqaIV9?a(@I-?&?(M!=yF-Q@j=%*N>I6+Z<$(L%@j54Q)G5f??dwq&wHBCZ& zfLq{7*(~KZWmY*aElU%klh4E>s1NmV^)a93He2SHvjT$c#t(~3w&Cl7+f4KU&W5Jr zYi1=`tOOqd@)fyEj>Q%AF)^M!VJs=4+yclA5+M!Bx-z32R7Cl0B$9uzDf`?J(har~v}V7VNIr8jjYylWPz;qEQN%{!25MMfjfOIvq|B@RVpaVh@N^bdhZXEYL5MmrlE2xMY00@q&~6bYoJVek5>l6DY6L8WzeyP z+iXVvKIy#qU5ONdw0gKk<^RwKodQ+ghnu#{tYIy&37M=aLCprn0a^j$xPWb7_QPXf zf;RDvJzPaBAUS$AarhNF`t0`pp#MmoF}KQQn%{aQE3)P)7El~7-c0|fMoO0>UOwU# QB3?_xD@MH58Ly=M3(-wXe*gdg diff --git a/justfile b/justfile index eccf33e..208f02e 100644 --- a/justfile +++ b/justfile @@ -22,16 +22,34 @@ install-browsers: # ── Local Development ───────────────────────────────────────────────────────── -# Run Django server + Tailwind CSS together (Tailwind in background) +# Run Django server + Tailwind CSS + stern nginx ingestion together dev: #!/usr/bin/env bash set -eu source .venv/bin/activate + PIDS=() + cleanup() { + echo "Stopping background processes…" + for pid in "${PIDS[@]}"; do + kill "$pid" 2>/dev/null || true + done + } + trap cleanup EXIT INT TERM + npm run dev & - TAILWIND_PID=$! - trap "kill $TAILWIND_PID 2>/dev/null" EXIT + PIDS+=($!) + + uv run manage.py nginxmon_stern & + PIDS+=($!) + uv run manage.py runserver 0.0.0.0:8000 +# Stream nginx logs via stern only (without starting Django) +stern: + #!/usr/bin/env bash + source .venv/bin/activate + uv run manage.py nginxmon_stern + # Run Tailwind CSS in watch mode (standalone) tailwind: npm run dev diff --git a/nginxmon/__init__.py b/nginxmon/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nginxmon/admin.py b/nginxmon/admin.py new file mode 100644 index 0000000..8c08152 --- /dev/null +++ b/nginxmon/admin.py @@ -0,0 +1,39 @@ +from django.contrib import admin +from .models import NginxSettings, NginxAlertProfile, NginxAccessLog, IPGeoCache, ThreatAlert + + +@admin.register(NginxSettings) +class NginxSettingsAdmin(admin.ModelAdmin): + list_display = ['namespace', 'pod_label', 'container', 'fetch_interval_seconds', + 'log_file_path', 'enabled', 'last_fetch_at'] + + +@admin.register(NginxAlertProfile) +class NginxAlertProfileAdmin(admin.ModelAdmin): + list_display = ['name', 'alert_window_seconds', 'alert_max_requests', + 'alert_max_error_rate', 'enabled', 'created_at'] + list_filter = ['enabled'] + + +@admin.register(NginxAccessLog) +class NginxAccessLogAdmin(admin.ModelAdmin): + list_display = ['timestamp', 'remote_addr', 'method', 'request_uri', 'status', + 'request_time', 'service', 'country', 'city'] + list_filter = ['status', 'service', 'country'] + search_fields = ['remote_addr', 'request_uri', 'request_id'] + readonly_fields = ['timestamp', 'request_id'] + date_hierarchy = 'timestamp' + + +@admin.register(IPGeoCache) +class IPGeoCacheAdmin(admin.ModelAdmin): + list_display = ['ip', 'country', 'city', 'isp', 'is_private', 'fetched_at'] + search_fields = ['ip', 'country', 'city'] + + +@admin.register(ThreatAlert) +class ThreatAlertAdmin(admin.ModelAdmin): + list_display = ['detected_at', 'remote_addr', 'alert_type', 'profile', + 'request_count', 'error_count', 'country', 'notified', 'dismissed'] + list_filter = ['alert_type', 'dismissed', 'notified', 'profile'] + search_fields = ['remote_addr', 'country'] diff --git a/nginxmon/apps.py b/nginxmon/apps.py new file mode 100644 index 0000000..d4819ff --- /dev/null +++ b/nginxmon/apps.py @@ -0,0 +1,26 @@ +import logging +from django.apps import AppConfig + +logger = logging.getLogger(__name__) + + +class NginxmonConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'nginxmon' + verbose_name = 'Nginx Monitor' + + def ready(self): + try: + from nginxmon.models import NginxSettings, NginxAlertProfile + from nginxmon.tasks import start_fetch_job, schedule_profile, start_cleanup_job + + settings = NginxSettings.get() + if settings.enabled: + start_fetch_job(settings.fetch_interval_seconds) + + for profile in NginxAlertProfile.objects.filter(enabled=True): + schedule_profile(profile) + + start_cleanup_job() + except Exception as exc: + logger.warning('nginxmon: could not schedule on startup: %s', exc) diff --git a/nginxmon/detector.py b/nginxmon/detector.py new file mode 100644 index 0000000..ab03e15 --- /dev/null +++ b/nginxmon/detector.py @@ -0,0 +1,86 @@ +""" +Threat detection against NginxAccessLog for each enabled NginxAlertProfile. +""" +import logging +from datetime import timedelta + +from django.db.models import Count, Q +from django.utils import timezone + +from .models import NginxAlertProfile, NginxAccessLog, ThreatAlert, IPGeoCache +from .notifications import send_alert_telegram + +logger = logging.getLogger(__name__) + + +def detect_threats(profile_id: int): + try: + profile = NginxAlertProfile.objects.get(pk=profile_id, enabled=True) + except NginxAlertProfile.DoesNotExist: + return + + window = timedelta(seconds=profile.alert_window_seconds) + now = timezone.now() + window_start = now - window + + qs = ( + NginxAccessLog.objects + .filter(timestamp__gte=window_start) + .values('remote_addr') + .annotate( + total=Count('id'), + errors=Count('id', filter=Q(status__gte=400)), + ) + ) + + for row in qs: + ip, total, errors = row['remote_addr'], row['total'], row['errors'] + + existing = ThreatAlert.objects.filter( + profile=profile, + remote_addr=ip, + window_start__gte=window_start, + dismissed=False, + ) + + if total >= profile.alert_max_requests: + if not existing.filter(alert_type='rate_limit').exists(): + _create_alert(profile, 'rate_limit', ip, total, errors, window_start, now) + + if total >= profile.alert_min_requests: + if (errors / total) >= profile.alert_max_error_rate: + if not existing.filter(alert_type='error_rate').exists(): + _create_alert(profile, 'error_rate', ip, total, errors, window_start, now) + + +def _create_alert(profile, alert_type, ip, total, errors, window_start, window_end): + geo = IPGeoCache.objects.filter(ip=ip).first() + country = geo.country if geo else '' + city = geo.city if geo else '' + + if alert_type == 'rate_limit': + detail = ( + f'{total} requests from {ip} in the last {profile.alert_window_seconds}s ' + f'(threshold: {profile.alert_max_requests})' + ) + else: + rate_pct = round(errors / total * 100) + detail = ( + f'{errors}/{total} requests from {ip} failed ' + f'({rate_pct}% error rate, threshold: {int(profile.alert_max_error_rate * 100)}%)' + ) + + alert = ThreatAlert.objects.create( + profile=profile, + alert_type=alert_type, + remote_addr=ip, + window_start=window_start, + window_end=window_end, + request_count=total, + error_count=errors, + detail=detail, + country=country, + city=city, + ) + logger.warning('nginxmon alert: %s', detail) + send_alert_telegram(profile, alert) diff --git a/nginxmon/fetcher.py b/nginxmon/fetcher.py new file mode 100644 index 0000000..2864867 --- /dev/null +++ b/nginxmon/fetcher.py @@ -0,0 +1,181 @@ +""" +Fetch nginx ingress logs — from kubectl (production) or a local file (dev/testing). +Deduplicates by request_id so overlapping windows don't double-insert. +""" +import logging +import subprocess +from datetime import timedelta + +from django.db import transaction +from django.utils import timezone as dj_tz + +from .models import NginxSettings, NginxAccessLog +from .parser import parse_lines +from .geo import enrich_geo_batch + +logger = logging.getLogger(__name__) + +_OVERLAP = 60 # extra seconds to avoid missing entries near boundaries + + +def fetch_and_store() -> int: + """ + Pull new log lines, parse, deduplicate, and save. + Returns the number of new rows inserted. + """ + settings = NginxSettings.get() + if not settings.enabled: + return 0 + + raw = _read_file(settings) if settings.log_file_path else _kubectl_logs(settings) + if raw is None: + return 0 + + entries = parse_lines(raw) + if not entries: + _touch(settings) + return 0 + + since_seconds = settings.fetch_interval_seconds + _OVERLAP + existing_ids = set( + NginxAccessLog.objects.filter( + timestamp__gte=dj_tz.now() - timedelta(seconds=since_seconds + 10), + ).values_list('request_id', flat=True) + ) + + new_logs, seen = [], set() + for e in entries: + key = e['request_id'] or ( + f"{e['timestamp'].isoformat()}|{e['remote_addr']}|{e['request_uri']}" + ) + if key in existing_ids or key in seen: + continue + seen.add(key) + new_logs.append(NginxAccessLog( + timestamp=e['timestamp'], + remote_addr=e['remote_addr'], + method=e['method'], + request_uri=e['request_uri'], + protocol=e['protocol'], + status=e['status'], + body_bytes_sent=e['body_bytes_sent'], + http_referer=e['http_referer'], + http_user_agent=e['http_user_agent'], + request_length=e['request_length'], + request_time=e['request_time'], + service=e['service'], + upstream_addr=e['upstream_addr'], + upstream_response_time=e['upstream_response_time'], + upstream_status=e['upstream_status'], + request_id=e['request_id'], + )) + + if new_logs: + with transaction.atomic(): + NginxAccessLog.objects.bulk_create(new_logs, ignore_conflicts=True) + logger.info('nginxmon: inserted %d new log entries', len(new_logs)) + enrich_geo_batch(new_logs) + + _touch(settings) + return len(new_logs) + + +def ingest_raw(text: str) -> int: + """ + Parse and store log lines from a raw string (used by the paste-logs UI + and the management command). Returns the number of new rows inserted. + """ + entries = parse_lines(text) + if not entries: + return 0 + + existing_ids = set( + NginxAccessLog.objects.values_list('request_id', flat=True) + ) + new_logs, seen = [], set() + for e in entries: + key = e['request_id'] or ( + f"{e['timestamp'].isoformat()}|{e['remote_addr']}|{e['request_uri']}" + ) + if key in existing_ids or key in seen: + continue + seen.add(key) + new_logs.append(NginxAccessLog( + timestamp=e['timestamp'], + remote_addr=e['remote_addr'], + method=e['method'], + request_uri=e['request_uri'], + protocol=e['protocol'], + status=e['status'], + body_bytes_sent=e['body_bytes_sent'], + http_referer=e['http_referer'], + http_user_agent=e['http_user_agent'], + request_length=e['request_length'], + request_time=e['request_time'], + service=e['service'], + upstream_addr=e['upstream_addr'], + upstream_response_time=e['upstream_response_time'], + upstream_status=e['upstream_status'], + request_id=e['request_id'], + )) + + if new_logs: + with transaction.atomic(): + NginxAccessLog.objects.bulk_create(new_logs, ignore_conflicts=True) + logger.info('nginxmon: ingested %d log entries from raw text', len(new_logs)) + enrich_geo_batch(new_logs) + + return len(new_logs) + + +def _kubectl_logs(settings: NginxSettings) -> str | None: + since = settings.fetch_interval_seconds + _OVERLAP + cmd = [ + 'kubectl', 'logs', + '-n', settings.namespace, + '-l', settings.pod_label, + '--container', settings.container, + f'--since={since}s', + '--timestamps=false', + '--prefix=true', + '--max-log-requests=10', + ] + try: + result = subprocess.run(cmd, capture_output=True, text=True, timeout=30) + if result.returncode != 0: + logger.error('kubectl logs failed: %s', result.stderr[:500]) + return None + return result.stdout + except FileNotFoundError: + logger.error('kubectl not found in PATH') + return None + except subprocess.TimeoutExpired: + logger.error('kubectl logs timed out') + return None + except Exception as exc: + logger.error('kubectl logs error: %s', exc) + return None + + +def _read_file(settings: NginxSettings) -> str | None: + try: + with open(settings.log_file_path, 'r', encoding='utf-8', errors='replace') as f: + return f.read() + except FileNotFoundError: + logger.error('nginxmon: log file not found: %s', settings.log_file_path) + return None + except Exception as exc: + logger.error('nginxmon: error reading log file: %s', exc) + return None + + +def _touch(settings: NginxSettings): + NginxSettings.objects.filter(pk=settings.pk).update(last_fetch_at=dj_tz.now()) + + +def cleanup_old_logs(days: int = 7): + from datetime import timedelta + cutoff = dj_tz.now() - timedelta(days=days) + deleted, _ = NginxAccessLog.objects.filter(timestamp__lt=cutoff).delete() + if deleted: + logger.info('nginxmon: pruned %d old log entries (>%d days)', deleted, days) diff --git a/nginxmon/forms.py b/nginxmon/forms.py new file mode 100644 index 0000000..c6a4ca6 --- /dev/null +++ b/nginxmon/forms.py @@ -0,0 +1,47 @@ +from django import forms +from .models import NginxSettings, NginxAlertProfile + + +class NginxSettingsForm(forms.ModelForm): + class Meta: + model = NginxSettings + fields = [ + 'namespace', + 'pod_label', + 'container', + 'fetch_interval_seconds', + 'log_file_path', + 'enabled', + ] + + +class NginxAlertProfileForm(forms.ModelForm): + class Meta: + model = NginxAlertProfile + fields = [ + 'name', + 'alert_window_seconds', + 'alert_max_requests', + 'alert_max_error_rate', + 'alert_min_requests', + 'telegram_bot_token', + 'telegram_chat_id', + 'enabled', + ] + widgets = { + 'telegram_bot_token': forms.PasswordInput(render_value=True), + } + help_texts = { + 'alert_max_error_rate': 'Value between 0 and 1, e.g. 0.6 = 60% errors.', + } + + +class PasteLogsForm(forms.Form): + log_text = forms.CharField( + widget=forms.Textarea(attrs={ + 'rows': 10, + 'placeholder': 'Paste raw nginx ingress log lines here…', + 'class': 'font-mono text-xs', + }), + label='Raw log lines', + ) diff --git a/nginxmon/geo.py b/nginxmon/geo.py new file mode 100644 index 0000000..336de51 --- /dev/null +++ b/nginxmon/geo.py @@ -0,0 +1,100 @@ +""" +Geo-IP enrichment using ip-api.com batch endpoint (free, no key required). +Results are cached in IPGeoCache to minimise outbound requests. +""" +import ipaddress +import logging + +import requests + +from .models import IPGeoCache, NginxAccessLog + +logger = logging.getLogger(__name__) + +_BATCH_URL = 'http://ip-api.com/batch' +_BATCH_FIELDS = 'country,countryCode,regionName,city,lat,lon,isp,status,query' +_PRIVATE_RANGES = ( + ipaddress.ip_network('10.0.0.0/8'), + ipaddress.ip_network('172.16.0.0/12'), + ipaddress.ip_network('192.168.0.0/16'), + ipaddress.ip_network('127.0.0.0/8'), + ipaddress.ip_network('::1/128'), + ipaddress.ip_network('fc00::/7'), +) + + +def _is_private(ip: str) -> bool: + try: + addr = ipaddress.ip_address(ip) + return any(addr in net for net in _PRIVATE_RANGES) + except ValueError: + return False + + +def _lookup_batch(ips: list[str]) -> dict[str, dict]: + """Query ip-api.com for up to 100 IPs. Returns {ip: geo_dict}.""" + payload = [{'query': ip, 'fields': _BATCH_FIELDS} for ip in ips[:100]] + try: + resp = requests.post(_BATCH_URL, json=payload, timeout=10) + resp.raise_for_status() + results = {} + for item in resp.json(): + q = item.get('query', '') + if item.get('status') == 'success': + results[q] = item + return results + except Exception as exc: + logger.warning('ip-api.com batch lookup failed: %s', exc) + return {} + + +def enrich_geo_batch(log_objs: list[NginxAccessLog]): + """ + Look up geo data for IPs in `log_objs`, update cache and log records. + Uses the local cache first; only queries the API for unknown IPs. + """ + unique_ips = {obj.remote_addr for obj in log_objs} + + # Split private vs public + private_ips = {ip for ip in unique_ips if _is_private(ip)} + public_ips = unique_ips - private_ips + + # Ensure private IPs are in cache + for ip in private_ips: + IPGeoCache.objects.get_or_create(ip=ip, defaults={'is_private': True}) + + # Load cached public IPs + cached = { + g.ip: g + for g in IPGeoCache.objects.filter(ip__in=public_ips) + } + missing = [ip for ip in public_ips if ip not in cached] + + # Fetch missing from API in batches of 100 + api_results: dict[str, dict] = {} + for i in range(0, len(missing), 100): + api_results.update(_lookup_batch(missing[i:i + 100])) + + # Upsert cache + for ip, data in api_results.items(): + obj, _ = IPGeoCache.objects.get_or_create(ip=ip) + obj.country = data.get('country', '') + obj.country_code = data.get('countryCode', '') + obj.region = data.get('regionName', '') + obj.city = data.get('city', '') + obj.lat = data.get('lat') + obj.lon = data.get('lon') + obj.isp = data.get('isp', '') + obj.save() + cached[ip] = obj + + # Apply geo back via per-IP queryset update (avoids needing PKs on in-memory objects) + for ip, geo in cached.items(): + NginxAccessLog.objects.filter( + remote_addr=ip, country='' + ).update( + country=geo.country or '', + country_code=geo.country_code or '', + region=geo.region or '', + city=geo.city or '', + ) diff --git a/nginxmon/management/__init__.py b/nginxmon/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nginxmon/management/commands/__init__.py b/nginxmon/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nginxmon/management/commands/nginxmon_ingest.py b/nginxmon/management/commands/nginxmon_ingest.py new file mode 100644 index 0000000..630130a --- /dev/null +++ b/nginxmon/management/commands/nginxmon_ingest.py @@ -0,0 +1,58 @@ +""" +Management command to ingest nginx log lines into the database. + +Usage examples: + + # Read from a file + python manage.py nginxmon_ingest --file /path/to/nginx.log + + # Pipe from stdin + kubectl logs -n ingress-nginx deploy/ingress-nginx-controller | python manage.py nginxmon_ingest + + # Use the log file configured in NginxSettings + python manage.py nginxmon_ingest --from-settings +""" +import sys + +from django.core.management.base import BaseCommand + +from nginxmon.fetcher import fetch_and_store, ingest_raw + + +class Command(BaseCommand): + help = 'Ingest nginx ingress log lines into the nginxmon database' + + def add_arguments(self, parser): + group = parser.add_mutually_exclusive_group() + group.add_argument( + '--file', '-f', + metavar='PATH', + help='Path to a nginx log file to ingest', + ) + group.add_argument( + '--from-settings', + action='store_true', + help='Run a full fetch using the source configured in NginxSettings ' + '(kubectl or log file)', + ) + # No flag = read from stdin + + def handle(self, *args, **options): + if options['from_settings']: + count = fetch_and_store() + self.stdout.write(self.style.SUCCESS(f'Fetched and inserted {count} new log entries.')) + return + + if options['file']: + try: + with open(options['file'], 'r', encoding='utf-8', errors='replace') as fh: + text = fh.read() + except OSError as exc: + self.stderr.write(self.style.ERROR(f'Cannot read file: {exc}')) + return + else: + self.stdout.write('Reading from stdin… (Ctrl-D to finish)') + text = sys.stdin.read() + + count = ingest_raw(text) + self.stdout.write(self.style.SUCCESS(f'Inserted {count} new log entries.')) diff --git a/nginxmon/management/commands/nginxmon_stern.py b/nginxmon/management/commands/nginxmon_stern.py new file mode 100644 index 0000000..8965a38 --- /dev/null +++ b/nginxmon/management/commands/nginxmon_stern.py @@ -0,0 +1,145 @@ +""" +Management command that streams logs from stern and ingests them continuously. + +Usage: + python manage.py nginxmon_stern + python manage.py nginxmon_stern --namespace ingress-nginx --selector app.kubernetes.io/name=ingress-nginx + python manage.py nginxmon_stern --tail 200 --batch-size 20 + +The command checks NginxSettings.enabled every few seconds and pauses/resumes +ingestion accordingly. Stop with Ctrl-C. +""" +import subprocess +import time +import signal +import sys + +from django.core.management.base import BaseCommand + +from nginxmon.fetcher import ingest_raw +from nginxmon.models import NginxSettings + + +_STERN_BIN = '/opt/homebrew/bin/stern' +_DEFAULT_NAMESPACE = 'ingress-nginx' +_DEFAULT_SELECTOR = 'ingress-nginx-controller' +_BATCH_SIZE = 30 +_ENABLED_CHECK_INTERVAL = 5 # seconds between enabled-flag checks +_FLUSH_INTERVAL = 3 # seconds before flushing a partial batch + + +class Command(BaseCommand): + help = 'Stream nginx logs via stern and continuously ingest them into the database' + + def add_arguments(self, parser): + parser.add_argument('--namespace', '-n', default=_DEFAULT_NAMESPACE, + help='Kubernetes namespace (default: ingress-nginx)') + parser.add_argument('--selector', '-l', default=_DEFAULT_SELECTOR, + help='Pod selector passed to stern (default: ingress-nginx-controller)') + parser.add_argument('--tail', type=int, default=500, + help='Number of historical lines to retrieve on start (default: 500)') + parser.add_argument('--batch-size', type=int, default=_BATCH_SIZE, + help='Number of lines to batch before ingesting (default: 30)') + + def handle(self, *args, **options): + namespace = options['namespace'] + selector = options['selector'] + tail = options['tail'] + batch_size = options['batch_size'] + + self._shutdown = False + signal.signal(signal.SIGINT, self._handle_signal) + signal.signal(signal.SIGTERM, self._handle_signal) + + self.stdout.write(self.style.SUCCESS( + f'Starting stern: selector={selector!r} namespace={namespace!r} tail={tail}' + )) + + cmd = [ + _STERN_BIN, + selector, + '--namespace', namespace, + '--tail', str(tail), + '--color', 'never', + '--template', '{{.PodName}} {{.ContainerName}} {{.Message}}\n', + ] + + self.stdout.write(f'Command: {" ".join(cmd)}') + + proc = None + try: + proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=None, # pass stern's stderr straight to the terminal + text=True, + bufsize=1, + ) + self._ingest_loop(proc, batch_size) + except FileNotFoundError: + self.stderr.write(self.style.ERROR( + f'stern not found at {_STERN_BIN}. Install with: brew install stern' + )) + sys.exit(1) + finally: + if proc and proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except subprocess.TimeoutExpired: + proc.kill() + + def _handle_signal(self, signum, frame): + self.stdout.write('\nShutting down stern ingestion…') + self._shutdown = True + + def _ingest_loop(self, proc, batch_size): + batch = [] + last_flush = time.monotonic() + last_enabled_check = 0.0 + enabled = True + + import select + + while not self._shutdown: + # Periodically re-check NginxSettings.enabled + now = time.monotonic() + if now - last_enabled_check >= _ENABLED_CHECK_INTERVAL: + try: + enabled = NginxSettings.get().enabled + except Exception: + pass + last_enabled_check = now + + if proc.poll() is not None: + # stern process exited + self.stderr.write(self.style.WARNING('stern process exited.')) + break + + # Non-blocking readline with a short select timeout + ready, _, _ = select.select([proc.stdout], [], [], 0.5) + if ready: + line = proc.stdout.readline() + if not line: + break + if enabled: + batch.append(line) + + # Flush when batch is full or flush interval elapsed + if batch and (len(batch) >= batch_size or time.monotonic() - last_flush >= _FLUSH_INTERVAL): + self._flush(batch) + batch = [] + last_flush = time.monotonic() + + # Final flush + if batch: + self._flush(batch) + + def _flush(self, lines): + text = ''.join(lines) + try: + count = ingest_raw(text) + if count: + self.stdout.write(f' [stern] Ingested {count} new log entries') + except Exception as exc: + self.stderr.write(self.style.ERROR(f' [stern] Ingest error: {exc}')) diff --git a/nginxmon/migrations/0001_initial.py b/nginxmon/migrations/0001_initial.py new file mode 100644 index 0000000..dbc6c1b --- /dev/null +++ b/nginxmon/migrations/0001_initial.py @@ -0,0 +1,116 @@ +# Generated by Django 5.2.12 on 2026-04-01 03:47 + +import django.db.models.deletion +import netscan.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='IPGeoCache', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ip', models.GenericIPAddressField(db_index=True, unique=True)), + ('country', models.CharField(blank=True, max_length=100)), + ('country_code', models.CharField(blank=True, max_length=10)), + ('region', models.CharField(blank=True, max_length=100)), + ('city', models.CharField(blank=True, max_length=100)), + ('lat', models.FloatField(blank=True, null=True)), + ('lon', models.FloatField(blank=True, null=True)), + ('isp', models.CharField(blank=True, max_length=300)), + ('is_private', models.BooleanField(default=False)), + ('fetched_at', models.DateTimeField(auto_now=True)), + ], + ), + migrations.CreateModel( + name='NginxAlertProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('alert_window_seconds', models.IntegerField(default=60, help_text='Rolling window in seconds for rate analysis')), + ('alert_max_requests', models.IntegerField(default=200, help_text='Max requests per IP per window before triggering a rate alert')), + ('alert_max_error_rate', models.FloatField(default=0.6, help_text='Error rate threshold (0–1) to flag an IP')), + ('alert_min_requests', models.IntegerField(default=15, help_text='Minimum requests before running error-rate check')), + ('telegram_bot_token', netscan.fields.EncryptedCharField(blank=True)), + ('telegram_chat_id', netscan.fields.EncryptedCharField(blank=True)), + ('enabled', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='NginxSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('namespace', models.CharField(default='ingress-nginx', max_length=200)), + ('pod_label', models.CharField(default='app.kubernetes.io/name=ingress-nginx', help_text='kubectl -l selector for the ingress-nginx pods', max_length=200)), + ('container', models.CharField(default='controller', max_length=100)), + ('fetch_interval_seconds', models.IntegerField(default=30, help_text='How often to pull new logs (seconds)')), + ('log_file_path', models.CharField(blank=True, help_text='Absolute path to a local nginx log file for testing. Leave empty to use kubectl in production.', max_length=500)), + ('enabled', models.BooleanField(default=True)), + ('last_fetch_at', models.DateTimeField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'Nginx Settings', + 'verbose_name_plural': 'Nginx Settings', + }, + ), + migrations.CreateModel( + name='NginxAccessLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(db_index=True)), + ('remote_addr', models.GenericIPAddressField(db_index=True)), + ('method', models.CharField(max_length=20)), + ('request_uri', models.TextField()), + ('protocol', models.CharField(max_length=20)), + ('status', models.IntegerField(db_index=True)), + ('body_bytes_sent', models.IntegerField()), + ('http_referer', models.TextField(blank=True)), + ('http_user_agent', models.TextField(blank=True)), + ('request_length', models.IntegerField(default=0)), + ('request_time', models.FloatField()), + ('service', models.CharField(blank=True, db_index=True, max_length=200)), + ('upstream_addr', models.CharField(blank=True, max_length=200)), + ('upstream_response_time', models.FloatField(blank=True, null=True)), + ('upstream_status', models.IntegerField(blank=True, null=True)), + ('request_id', models.CharField(blank=True, db_index=True, max_length=100)), + ('country', models.CharField(blank=True, max_length=100)), + ('country_code', models.CharField(blank=True, max_length=10)), + ('region', models.CharField(blank=True, max_length=100)), + ('city', models.CharField(blank=True, max_length=100)), + ], + options={ + 'ordering': ['-timestamp'], + 'indexes': [models.Index(fields=['remote_addr', 'timestamp'], name='nginxmon_ng_remote__1ceb1d_idx')], + }, + ), + migrations.CreateModel( + name='ThreatAlert', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('alert_type', models.CharField(choices=[('rate_limit', 'High Request Rate'), ('error_rate', 'High Error Rate')], max_length=50)), + ('remote_addr', models.GenericIPAddressField(db_index=True)), + ('detected_at', models.DateTimeField(auto_now_add=True)), + ('window_start', models.DateTimeField()), + ('window_end', models.DateTimeField()), + ('request_count', models.IntegerField()), + ('error_count', models.IntegerField(default=0)), + ('detail', models.TextField()), + ('notified', models.BooleanField(default=False)), + ('dismissed', models.BooleanField(default=False)), + ('country', models.CharField(blank=True, max_length=100)), + ('city', models.CharField(blank=True, max_length=100)), + ('profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alerts', to='nginxmon.nginxalertprofile')), + ], + options={ + 'ordering': ['-detected_at'], + }, + ), + ] diff --git a/nginxmon/migrations/0002_covering_index.py b/nginxmon/migrations/0002_covering_index.py new file mode 100644 index 0000000..3a42e12 --- /dev/null +++ b/nginxmon/migrations/0002_covering_index.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.12 on 2026-04-01 04:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('nginxmon', '0001_initial'), + ] + + operations = [ + migrations.AddIndex( + model_name='nginxaccesslog', + index=models.Index(fields=['timestamp', 'status'], name='nginxmon_ng_timesta_978a40_idx'), + ), + ] diff --git a/nginxmon/migrations/__init__.py b/nginxmon/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nginxmon/models.py b/nginxmon/models.py new file mode 100644 index 0000000..5a16869 --- /dev/null +++ b/nginxmon/models.py @@ -0,0 +1,169 @@ +from django.db import models + +from netscan.fields import EncryptedCharField + + +class NginxSettings(models.Model): + """ + Singleton (pk=1) — the one-off cluster connection config. + Use NginxSettings.get() everywhere instead of pk lookups. + """ + namespace = models.CharField(max_length=200, default='ingress-nginx') + pod_label = models.CharField( + max_length=200, + default='app.kubernetes.io/name=ingress-nginx', + help_text='kubectl -l selector for the ingress-nginx pods', + ) + container = models.CharField(max_length=100, default='controller') + fetch_interval_seconds = models.IntegerField( + default=30, + help_text='How often to pull new logs (seconds)', + ) + # Local dev / testing: read from a file instead of kubectl + log_file_path = models.CharField( + max_length=500, + blank=True, + help_text=( + 'Absolute path to a local nginx log file for testing. ' + 'Leave empty to use kubectl in production.' + ), + ) + enabled = models.BooleanField(default=True) + last_fetch_at = models.DateTimeField(null=True, blank=True) + + class Meta: + verbose_name = 'Nginx Settings' + verbose_name_plural = 'Nginx Settings' + + def __str__(self): + return f'Nginx Settings ({self.namespace})' + + @classmethod + def get(cls): + obj, _ = cls.objects.get_or_create(pk=1) + return obj + + @property + def source_display(self): + if self.log_file_path: + return f'File: {self.log_file_path}' + return f'kubectl -n {self.namespace} -l {self.pod_label}' + + +class NginxAlertProfile(models.Model): + """ + One or more alert profiles — each with its own thresholds and Telegram config. + """ + name = models.CharField(max_length=200) + alert_window_seconds = models.IntegerField( + default=60, + help_text='Rolling window in seconds for rate analysis', + ) + alert_max_requests = models.IntegerField( + default=200, + help_text='Max requests per IP per window before triggering a rate alert', + ) + alert_max_error_rate = models.FloatField( + default=0.6, + help_text='Error rate threshold (0–1) to flag an IP', + ) + alert_min_requests = models.IntegerField( + default=15, + help_text='Minimum requests before running error-rate check', + ) + telegram_bot_token = EncryptedCharField(blank=True) + telegram_chat_id = EncryptedCharField(blank=True) + enabled = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.name + + +class NginxAccessLog(models.Model): + """Stores parsed nginx access log entries (cluster-global, no profile FK).""" + timestamp = models.DateTimeField(db_index=True) + remote_addr = models.GenericIPAddressField(db_index=True) + method = models.CharField(max_length=20) + request_uri = models.TextField() + protocol = models.CharField(max_length=20) + status = models.IntegerField(db_index=True) + body_bytes_sent = models.IntegerField() + http_referer = models.TextField(blank=True) + http_user_agent = models.TextField(blank=True) + request_length = models.IntegerField(default=0) + request_time = models.FloatField() + service = models.CharField(max_length=200, blank=True, db_index=True) + upstream_addr = models.CharField(max_length=200, blank=True) + upstream_response_time = models.FloatField(null=True, blank=True) + upstream_status = models.IntegerField(null=True, blank=True) + request_id = models.CharField(max_length=100, blank=True, db_index=True) + # Geo (populated after insert) + country = models.CharField(max_length=100, blank=True) + country_code = models.CharField(max_length=10, blank=True) + region = models.CharField(max_length=100, blank=True) + city = models.CharField(max_length=100, blank=True) + + class Meta: + ordering = ['-timestamp'] + indexes = [ + models.Index(fields=['remote_addr', 'timestamp']), + models.Index(fields=['timestamp', 'status']), # covers chart aggregation queries + ] + + @property + def geo_display(self): + parts = [p for p in [self.city, self.country] if p] + return ', '.join(parts) if parts else '—' + + +class IPGeoCache(models.Model): + ip = models.GenericIPAddressField(unique=True, db_index=True) + country = models.CharField(max_length=100, blank=True) + country_code = models.CharField(max_length=10, blank=True) + region = models.CharField(max_length=100, blank=True) + city = models.CharField(max_length=100, blank=True) + lat = models.FloatField(null=True, blank=True) + lon = models.FloatField(null=True, blank=True) + isp = models.CharField(max_length=300, blank=True) + is_private = models.BooleanField(default=False) + fetched_at = models.DateTimeField(auto_now=True) + + def __str__(self): + if self.is_private: + return f'{self.ip} (private)' + parts = [p for p in [self.city, self.country] if p] + return f'{self.ip} — {", ".join(parts)}' + + +class ThreatAlert(models.Model): + ALERT_TYPES = [ + ('rate_limit', 'High Request Rate'), + ('error_rate', 'High Error Rate'), + ] + + profile = models.ForeignKey( + NginxAlertProfile, on_delete=models.CASCADE, related_name='alerts' + ) + alert_type = models.CharField(max_length=50, choices=ALERT_TYPES) + remote_addr = models.GenericIPAddressField(db_index=True) + detected_at = models.DateTimeField(auto_now_add=True) + window_start = models.DateTimeField() + window_end = models.DateTimeField() + request_count = models.IntegerField() + error_count = models.IntegerField(default=0) + detail = models.TextField() + notified = models.BooleanField(default=False) + dismissed = models.BooleanField(default=False) + country = models.CharField(max_length=100, blank=True) + city = models.CharField(max_length=100, blank=True) + + class Meta: + ordering = ['-detected_at'] + + def __str__(self): + return f'[{self.get_alert_type_display()}] {self.remote_addr} @ {self.detected_at:%Y-%m-%d %H:%M}' + + @property + def error_rate(self): + return self.error_count / self.request_count if self.request_count else 0 diff --git a/nginxmon/notifications.py b/nginxmon/notifications.py new file mode 100644 index 0000000..25fe3de --- /dev/null +++ b/nginxmon/notifications.py @@ -0,0 +1,52 @@ +import logging +import requests + +logger = logging.getLogger(__name__) + +_ICONS = {'rate_limit': '🚨', 'error_rate': '⚠️'} + + +def send_alert_telegram(profile, alert) -> bool: + if not profile.telegram_bot_token or not profile.telegram_chat_id: + return False + + icon = _ICONS.get(alert.alert_type, '🔔') + geo = f' ({alert.city}, {alert.country})' if alert.country else '' + text = ( + f'{icon} *NginxMon Alert* — {profile.name}\n' + f'Type: {alert.get_alert_type_display()}\n' + f'IP: `{alert.remote_addr}`{geo}\n' + f'{alert.detail}\n' + f'_Detected at {alert.detected_at.strftime("%Y-%m-%d %H:%M:%S UTC") if alert.detected_at else "now"}_' + ) + url = f'https://api.telegram.org/bot{profile.telegram_bot_token}/sendMessage' + try: + resp = requests.post(url, json={ + 'chat_id': profile.telegram_chat_id, + 'text': text, + 'parse_mode': 'Markdown', + }, timeout=10) + resp.raise_for_status() + alert.notified = True + alert.save(update_fields=['notified']) + logger.info('nginxmon: Telegram alert sent for alert #%s', alert.pk) + return True + except Exception as exc: + logger.error('nginxmon: Telegram send failed: %s', exc) + return False + + +def send_test_telegram(profile) -> dict: + if not profile.telegram_bot_token or not profile.telegram_chat_id: + return {'ok': False, 'error': 'Bot token or chat ID not set.'} + try: + url = f'https://api.telegram.org/bot{profile.telegram_bot_token}/sendMessage' + resp = requests.post(url, json={ + 'chat_id': profile.telegram_chat_id, + 'text': f'✅ *NginxMon test* from profile _{profile.name}_. Alerts are working.', + 'parse_mode': 'Markdown', + }, timeout=10) + resp.raise_for_status() + return {'ok': True} + except Exception as e: + return {'ok': False, 'error': str(e)} diff --git a/nginxmon/parser.py b/nginxmon/parser.py new file mode 100644 index 0000000..4392523 --- /dev/null +++ b/nginxmon/parser.py @@ -0,0 +1,83 @@ +""" +Parse nginx ingress-controller log lines. + +Log format: + - - [] " " + "" "" [] [] + +""" +import re +import logging +from datetime import datetime, timezone + +logger = logging.getLogger(__name__) + +# The leading \S* tolerates stray chars (e.g. 'z') sometimes prepended by log shippers. +_LOG_RE = re.compile( + r'\S*ingress-nginx\S+\s+' # pod name + r'(?P\S+)\s+' # container + r'(?P[\d.a-fA-F:]+)\s+-\s+-\s+' # IP - - + r'\[(?P[^\]]+)\]\s+' # [timestamp] + r'"(?P\S+)\s+(?P\S+)\s+' # "METHOD /path + r'(?P[^"]+)"\s+' # PROTO" + r'(?P\d+)\s+' # status + r'(?P\d+)\s+' # bytes + r'"(?P[^"]*)"\s+' # "referer" + r'"(?P[^"]*)"\s+' # "ua" + r'(?P\d+)\s+' # req_len + r'(?P[\d.]+)\s+' # req_time + r'\[(?P[^\]]*)\]\s+' # [service] + r'\[(?P[^\]]*)\]\s+' # [] + r'(?P\S+)\s+' # upstream addr + r'(?P\d+)\s+' # upstream bytes + r'(?P[\d.]+)\s+' # upstream time + r'(?P\d+)\s+' # upstream status + r'(?P\S+)' # request id +) + +_TIME_FMT = '%d/%b/%Y:%H:%M:%S %z' + + +def parse_line(line: str) -> dict | None: + """Return a parsed dict or None if the line doesn't match.""" + m = _LOG_RE.search(line) + if not m: + return None + d = m.groupdict() + try: + ts = datetime.strptime(d['time_local'], _TIME_FMT) + except ValueError: + logger.debug('Bad timestamp: %s', d['time_local']) + return None + return { + 'timestamp': ts, + 'remote_addr': d['remote_addr'], + 'method': d['method'], + 'request_uri': d['request_uri'], + 'protocol': d['protocol'].strip(), + 'status': int(d['status']), + 'body_bytes_sent': int(d['body_bytes_sent']), + 'http_referer': d['http_referer'], + 'http_user_agent': d['http_user_agent'], + 'request_length': int(d['request_length']), + 'request_time': float(d['request_time']), + 'service': d['service'], + 'upstream_addr': d['upstream_addr'], + 'upstream_response_time': float(d['upstream_response_time']), + 'upstream_status': int(d['upstream_status']), + 'request_id': d['request_id'], + } + + +def parse_lines(text: str) -> list[dict]: + results = [] + for line in text.splitlines(): + line = line.strip() + if not line: + continue + parsed = parse_line(line) + if parsed: + results.append(parsed) + else: + logger.debug('Skipped unparseable line: %.120s', line) + return results diff --git a/nginxmon/tasks.py b/nginxmon/tasks.py new file mode 100644 index 0000000..014c61c --- /dev/null +++ b/nginxmon/tasks.py @@ -0,0 +1,56 @@ +import logging + +from apscheduler.triggers.interval import IntervalTrigger +from core.scheduler import scheduler +from nginxmon.fetcher import fetch_and_store, cleanup_old_logs +from nginxmon.detector import detect_threats + +logger = logging.getLogger(__name__) + +_FETCH_JOB = 'nginxmon_fetch' +_CLEANUP_JOB = 'nginxmon_cleanup' + + +def start_fetch_job(interval_seconds: int): + scheduler.add_job( + fetch_and_store, + trigger=IntervalTrigger(seconds=interval_seconds), + id=_FETCH_JOB, + replace_existing=True, + misfire_grace_time=60, + ) + logger.info('nginxmon: scheduled fetch every %ds', interval_seconds) + + +def stop_fetch_job(): + if scheduler.get_job(_FETCH_JOB): + scheduler.remove_job(_FETCH_JOB) + + +def schedule_profile(profile): + job_id = f'nginxmon_detect_{profile.pk}' + scheduler.add_job( + detect_threats, + trigger=IntervalTrigger(seconds=max(60, profile.alert_window_seconds)), + id=job_id, + args=[profile.pk], + replace_existing=True, + misfire_grace_time=120, + ) + logger.info('nginxmon: scheduled detect for profile "%s"', profile.name) + + +def unschedule_profile(profile): + job_id = f'nginxmon_detect_{profile.pk}' + if scheduler.get_job(job_id): + scheduler.remove_job(job_id) + + +def start_cleanup_job(): + if not scheduler.get_job(_CLEANUP_JOB): + scheduler.add_job( + cleanup_old_logs, + trigger=IntervalTrigger(hours=24), + id=_CLEANUP_JOB, + replace_existing=True, + ) diff --git a/nginxmon/templates/nginxmon/_alerts.html b/nginxmon/templates/nginxmon/_alerts.html new file mode 100644 index 0000000..3b68ba0 --- /dev/null +++ b/nginxmon/templates/nginxmon/_alerts.html @@ -0,0 +1,50 @@ +{% if alerts %} + + + + + + + + + + + + + + {% for alert in alerts %} + + + + + + + + + + {% endfor %} + +
DetectedTypeIPDetailAction
{{ alert.detected_at|date:"M d H:i" }} + + {% if alert.alert_type == 'rate_limit' %}🚨{% else %}⚠️{% endif %} + {{ alert.get_alert_type_display }} + + {{ alert.remote_addr }}{{ alert.detail }} + +
+{% else %} +

+ + No active threat alerts +
+{% endif %} diff --git a/nginxmon/templates/nginxmon/_live_logs.html b/nginxmon/templates/nginxmon/_live_logs.html new file mode 100644 index 0000000..a038ae7 --- /dev/null +++ b/nginxmon/templates/nginxmon/_live_logs.html @@ -0,0 +1,29 @@ +{% for log in logs %} + + {{ log.timestamp|date:"m/d H:i:s" }} + + + + {{ log.geo_display }} + + {{ log.method }} + + {{ log.request_uri }} + + {% if log.service %}{% else %}—{% endif %} + + + + + {{ log.request_time|floatformat:3 }}s + +{% empty %} +No logs yet — use "Fetch Now" or wait for the scheduler. +{% endfor %} diff --git a/nginxmon/templates/nginxmon/dashboard.html b/nginxmon/templates/nginxmon/dashboard.html new file mode 100644 index 0000000..3763314 --- /dev/null +++ b/nginxmon/templates/nginxmon/dashboard.html @@ -0,0 +1,416 @@ +{% extends 'base.html' %} + +{% block content %} + + +
+ + +
+
+

+ + Nginx Monitor + + Live + +

+

{{ nginx_settings.source_display }}

+
+ {% if nginx_settings.last_fetch_at %}Last: {{ nginx_settings.last_fetch_at|timesince }} ago{% else %}No ingestion yet{% endif %} + · + +
+
+
+ +
+ {% for rkey, rlabel in all_ranges %} + + {{ rlabel|slice:"5:" }} + + {% endfor %} +
+ +
+
+ +
+ {% csrf_token %} + +
+
+ {% csrf_token %} + +
+ + New Alert Profile + + + Settings + +
+
+
+ + + {% for msg in messages %} +
+ {{ msg }} +
+ {% endfor %} + + +
+ {% with s=stats %} +
+
Requests
+
{{ s.total }}
+
+
+
Errors
+
{{ s.errors }}
+
+
+
Unique IPs
+
{{ s.unique_ips }}
+
+
+
Avg Response
+
{{ s.avg_resp_ms }} ms
+
+ {% endwith %} +
+ + +
+
+
{{ range_label }}
+
+
+
+
Status codes — {{ range_label }}
+
+
+
+ + +
+
+
Top IPs — {{ range_label }}
+ + + + + + + + + + + {% for ip in top_ips %} + + + + + + + {% empty %} + + {% endfor %} + +
IPLocationReqsErrors
+ + + {% if ip.city or ip.country %}{{ ip.city }}{% if ip.city and ip.country %}, {% endif %}{{ ip.country }}{% else %}—{% endif %} + {{ ip.count }}{{ ip.errors }}
No data yet
+
+ +
+
Top Services — {{ range_label }}
+ + + + + + + + + {% for svc in top_services %} + + + + + {% empty %} + + {% endfor %} + +
ServiceRequests
+ {% if svc.service %}{% else %}—{% endif %} + {{ svc.count }}
No data yet
+
+
+ + + {% if profiles %} +
+
+
Alert Profiles
+ + New +
+
+ {% for p in profiles %} +
+
+ {{ p.name }} + + window {{ p.alert_window_seconds }}s • max {{ p.alert_max_requests }} req • {{ p.alert_max_error_rate|floatformat:0 }}% err rate + +
+
+
+ {% csrf_token %} + +
+ Edit + Delete +
+
+ {% endfor %} +
+
+ {% endif %} + + +
+
+ + Threat Alerts + {% if active_alerts %}{{ active_alerts }}{% endif %} +
+
+ {% include 'nginxmon/_alerts.html' %} +
+
+ + +
+
+
+ + Live Access Log +
+ Auto-refreshes every 5s • last 60 entries +
+
+ + + + + + + + + + + + + + + {% include 'nginxmon/_live_logs.html' %} + +
Time IP Method PathStatus
+
+
+ +
+ + + + + + +{% endblock %} diff --git a/nginxmon/templates/nginxmon/profile_confirm_delete.html b/nginxmon/templates/nginxmon/profile_confirm_delete.html new file mode 100644 index 0000000..0e6b897 --- /dev/null +++ b/nginxmon/templates/nginxmon/profile_confirm_delete.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+
+

+ Delete Alert Profile +

+
+
+

+ Delete alert profile {{ object.name }}? + Its alerts history will also be removed. +

+
+ {% csrf_token %} + + + Cancel + +
+
+
+
+{% endblock %} diff --git a/nginxmon/templates/nginxmon/profile_form.html b/nginxmon/templates/nginxmon/profile_form.html new file mode 100644 index 0000000..2a9d584 --- /dev/null +++ b/nginxmon/templates/nginxmon/profile_form.html @@ -0,0 +1,36 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+
+

+ {% if object %}Edit Alert Profile — {{ object.name }}{% else %}New Alert Profile{% endif %} +

+

+ Alert thresholds and Telegram notification settings for this monitoring rule. +

+
+ +
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.help_text %}

{{ field.help_text }}

{% endif %} + {% for error in field.errors %}

{{ error }}

{% endfor %} +
+ {% endfor %} + +
+ + Cancel +
+
+
+
+{% endblock %} diff --git a/nginxmon/templates/nginxmon/settings.html b/nginxmon/templates/nginxmon/settings.html new file mode 100644 index 0000000..0bff8c3 --- /dev/null +++ b/nginxmon/templates/nginxmon/settings.html @@ -0,0 +1,103 @@ +{% extends 'base.html' %} + +{% block content %} +
+ + +
+ + + +
+

+ Nginx Monitor Settings +

+

Cluster connection & local testing

+
+
+ + {% for msg in messages %} +
+ {{ msg }} +
+ {% endfor %} + + +
+
+

Cluster Connection

+

+ Configured once. The scheduler uses these to run + kubectl logs on a timer. +

+
+
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.help_text %}

{{ field.help_text }}

{% endif %} + {% for error in field.errors %}

{{ error }}

{% endfor %} +
+ {% endfor %} +
+ +
+
+
+ + +
+
+ +
+

Test Locally — Paste Log Lines

+

+ No kubectl needed. Paste raw nginx ingress log lines and they'll be parsed and stored + immediately, so you can preview the dashboard with real data. +

+
+
+
+ {% csrf_token %} + {% for field in paste_form %} +
+ +
{{ field }}
+ {% for error in field.errors %}

{{ error }}

{% endfor %} +
+ {% endfor %} +
+ + Duplicates are automatically skipped. +
+
+ + +
+

Or via the management command:

+
# From a file
+python manage.py nginxmon_ingest --file /path/to/nginx.log
+
+# Pipe from kubectl directly
+kubectl logs -n ingress-nginx \
+  -l app.kubernetes.io/name=ingress-nginx \
+  --container controller | python manage.py nginxmon_ingest
+
+# Re-run the configured source (kubectl or file)
+python manage.py nginxmon_ingest --from-settings
+
+
+ +
+{% endblock %} diff --git a/nginxmon/urls.py b/nginxmon/urls.py new file mode 100644 index 0000000..44ad6a0 --- /dev/null +++ b/nginxmon/urls.py @@ -0,0 +1,29 @@ +from django.urls import path +from . import views + +urlpatterns = [ + # Main dashboard + path('', views.DashboardView.as_view(), name='nginxmon-dashboard'), + + # One-off settings (k8s pod config + paste-logs test) + path('settings/', views.SettingsView.as_view(), name='nginxmon-settings'), + + # Alert profiles + path('profiles/new/', views.ProfileCreateView.as_view(), name='nginxmon-profile-create'), + path('profiles//edit/', views.ProfileUpdateView.as_view(), name='nginxmon-profile-edit'), + path('profiles//delete/', views.ProfileDeleteView.as_view(), name='nginxmon-profile-delete'), + path('profiles//test-telegram/', views.TestTelegramView.as_view(), name='nginxmon-test-telegram'), + + # Manual actions + path('actions/fetch/', views.TriggerFetchView.as_view(), name='nginxmon-fetch'), + path('actions/detect/', views.TriggerDetectView.as_view(), name='nginxmon-detect'), + path('alert//dismiss/', views.DismissAlertView.as_view(), name='nginxmon-dismiss-alert'), + + # HTMX partials & APIs + path('api/live-logs/', views.LiveLogsPartialView.as_view(), name='nginxmon-live-logs'), + path('api/alerts/', views.AlertsPartialView.as_view(), name='nginxmon-alerts-partial'), + path('api/chart-data/', views.ChartDataView.as_view(), name='nginxmon-chart-data'), + path('api/ingest/', views.IngestLogsView.as_view(), name='nginxmon-ingest'), + path('api/toggle-ingestion/', views.ToggleIngestionView.as_view(), name='nginxmon-toggle'), + path('api/status-stream/', views.StatusStreamView.as_view(), name='nginxmon-status-stream'), +] diff --git a/nginxmon/views.py b/nginxmon/views.py new file mode 100644 index 0000000..7ae5e2c --- /dev/null +++ b/nginxmon/views.py @@ -0,0 +1,384 @@ +import json +import logging +import threading +import time +from datetime import timedelta + +from django.contrib import messages +from django.db.models import Avg, Count, Q +from django.db.models.functions import TruncDay, TruncHour, TruncMinute +from django.http import JsonResponse, StreamingHttpResponse +from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse_lazy +from django.utils import timezone +from django.views.generic import CreateView, DeleteView, TemplateView, UpdateView, View + +from .detector import detect_threats as run_detect +from .fetcher import fetch_and_store, ingest_raw +from .forms import NginxSettingsForm, NginxAlertProfileForm, PasteLogsForm +from .models import NginxAccessLog, NginxAlertProfile, NginxSettings, ThreatAlert +from .notifications import send_test_telegram +from .tasks import start_fetch_job, stop_fetch_job, schedule_profile, unschedule_profile + +logger = logging.getLogger(__name__) + +# ── Time range config ───────────────────────────────────────────────────────── + +_RANGES = { + '5m': {'delta': timedelta(minutes=5), 'trunc': TruncMinute, 'group_n': 1, 'label': 'Last 5 min', 'fmt': '%H:%M'}, + '30m': {'delta': timedelta(minutes=30), 'trunc': TruncMinute, 'group_n': 2, 'label': 'Last 30 min', 'fmt': '%H:%M'}, + '6h': {'delta': timedelta(hours=6), 'trunc': TruncMinute, 'group_n': 15, 'label': 'Last 6 hours', 'fmt': '%H:%M'}, + '1d': {'delta': timedelta(hours=24), 'trunc': TruncHour, 'group_n': 1, 'label': 'Last 24 hours', 'fmt': '%H:%M'}, + '7d': {'delta': timedelta(days=7), 'trunc': TruncHour, 'group_n': 4, 'label': 'Last 7 days', 'fmt': '%m/%d %H:%M'}, + '30d': {'delta': timedelta(days=30), 'trunc': TruncDay, 'group_n': 1, 'label': 'Last 30 days', 'fmt': '%m/%d'}, + '90d': {'delta': timedelta(days=90), 'trunc': TruncDay, 'group_n': 3, 'label': 'Last 90 days', 'fmt': '%m/%d'}, +} +_DEFAULT_RANGE = '6h' + + +def _get_range(request): + key = request.GET.get('range', _DEFAULT_RANGE) + if key not in _RANGES: + key = _DEFAULT_RANGE + cfg = _RANGES[key] + return key, cfg, timezone.now() - cfg['delta'] + + +def _floor_bucket_key(dt, trunc_fn, group_n, fmt): + """Return format string for the bucket boundary dt falls into.""" + if trunc_fn is TruncMinute: + m = (dt.minute // group_n) * group_n + aligned = dt.replace(minute=m, second=0, microsecond=0) + elif trunc_fn is TruncHour: + h = (dt.hour // group_n) * group_n + aligned = dt.replace(hour=h, minute=0, second=0, microsecond=0) + else: # TruncDay + if group_n <= 1: + aligned = dt.replace(hour=0, minute=0, second=0, microsecond=0) + else: + from datetime import date + epoch = date(2020, 1, 1) + d = dt.date() if hasattr(dt, 'date') else dt + days = (d - epoch).days + floored_date = epoch + timedelta(days=(days // group_n) * group_n) + aligned = dt.replace( + year=floored_date.year, month=floored_date.month, + day=floored_date.day, hour=0, minute=0, second=0, microsecond=0, + ) + return aligned.strftime(fmt) + + +# ── Dashboard — live monitoring ─────────────────────────────────────────────── + +class DashboardView(TemplateView): + template_name = 'nginxmon/dashboard.html' + + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + range_key, cfg, since = _get_range(self.request) + + logs = NginxAccessLog.objects.filter(timestamp__gte=since) + stats = { + 'total': logs.count(), + 'errors': logs.filter(status__gte=400).count(), + 'unique_ips': logs.values('remote_addr').distinct().count(), + 'avg_resp_ms': round( + (logs.aggregate(a=Avg('request_time'))['a'] or 0) * 1000, 1 + ), + } + + top_services = list( + logs.values('service') + .annotate(count=Count('id')) + .order_by('-count')[:10] + ) + status_dist = list( + logs.values('status') + .annotate(count=Count('id')) + .order_by('status') + ) + top_ips = list( + logs.values('remote_addr', 'country', 'city') + .annotate(count=Count('id'), errors=Count('id', filter=Q(status__gte=400))) + .order_by('-count')[:10] + ) + active_alerts = ThreatAlert.objects.filter(dismissed=False).count() + profiles = NginxAlertProfile.objects.filter(enabled=True) + + ctx.update({ + 'nginx_settings': NginxSettings.get(), + 'stats': stats, + 'top_services': top_services, + 'status_dist': status_dist, + 'top_ips': top_ips, + 'active_alerts': active_alerts, + 'profiles': profiles, + 'status_dist_json': json.dumps(status_dist), + 'current_range': range_key, + 'range_label': cfg['label'], + 'all_ranges': [(k, v['label']) for k, v in _RANGES.items()], + }) + return ctx + + +# ── Settings (one-off k8s config + paste test logs) ────────────────────────── + +class SettingsView(View): + template_name = 'nginxmon/settings.html' + + def _get_settings(self): + return NginxSettings.get() + + def get(self, request): + obj = self._get_settings() + return render(request, self.template_name, { + 'form': NginxSettingsForm(instance=obj), + 'paste_form': PasteLogsForm(), + 'nginx_settings': obj, + }) + + def post(self, request): + obj = self._get_settings() + if 'save_settings' in request.POST: + form = NginxSettingsForm(request.POST, instance=obj) + if form.is_valid(): + saved = form.save() + stop_fetch_job() + if saved.enabled: + start_fetch_job(saved.fetch_interval_seconds) + messages.success(request, 'Settings saved.') + return redirect('nginxmon-settings') + return render(request, self.template_name, { + 'form': form, + 'paste_form': PasteLogsForm(), + 'nginx_settings': obj, + }) + + if 'paste_logs' in request.POST: + paste_form = PasteLogsForm(request.POST) + if paste_form.is_valid(): + count = ingest_raw(paste_form.cleaned_data['log_text']) + messages.success(request, f'Ingested {count} new log entries.') + return redirect('nginxmon-settings') + return render(request, self.template_name, { + 'form': NginxSettingsForm(instance=obj), + 'paste_form': paste_form, + 'nginx_settings': obj, + }) + + return redirect('nginxmon-settings') + + +# ── Alert profiles ──────────────────────────────────────────────────────────── + +class ProfileCreateView(CreateView): + model = NginxAlertProfile + form_class = NginxAlertProfileForm + template_name = 'nginxmon/profile_form.html' + success_url = reverse_lazy('nginxmon-dashboard') + + def form_valid(self, form): + response = super().form_valid(form) + if self.object.enabled: + schedule_profile(self.object) + messages.success(self.request, f'Alert profile "{self.object.name}" created.') + return response + + +class ProfileUpdateView(UpdateView): + model = NginxAlertProfile + form_class = NginxAlertProfileForm + template_name = 'nginxmon/profile_form.html' + success_url = reverse_lazy('nginxmon-dashboard') + + def form_valid(self, form): + response = super().form_valid(form) + unschedule_profile(self.object) + if self.object.enabled: + schedule_profile(self.object) + messages.success(self.request, f'Alert profile "{self.object.name}" updated.') + return response + + +class ProfileDeleteView(DeleteView): + model = NginxAlertProfile + template_name = 'nginxmon/profile_confirm_delete.html' + success_url = reverse_lazy('nginxmon-dashboard') + + def form_valid(self, form): + unschedule_profile(self.object) + return super().form_valid(form) + + +class TestTelegramView(View): + def post(self, request, pk): + profile = get_object_or_404(NginxAlertProfile, pk=pk) + result = send_test_telegram(profile) + if result['ok']: + messages.success(request, 'Telegram test message sent!') + else: + messages.error(request, f'Telegram error: {result["error"]}') + return redirect('nginxmon-dashboard') + + +# ── HTMX partials ───────────────────────────────────────────────────────────── + +class LiveLogsPartialView(View): + _SORT_MAP = { + 'timestamp': 'timestamp', + 'ip': 'remote_addr', + 'status': 'status', + 'method': 'method', + 'service': 'service', + 'time': 'request_time', + 'bytes': 'body_bytes_sent', + } + + def get(self, request): + qs = NginxAccessLog.objects.all() + + ip_f = request.GET.get('ip', '').strip() + status_f = request.GET.get('status', '').strip() + service_f = request.GET.get('service', '').strip() + sort_col = request.GET.get('sort', 'timestamp') + sort_ord = request.GET.get('order', 'desc') + + if ip_f: + qs = qs.filter(remote_addr=ip_f) + if status_f: + try: + qs = qs.filter(status=int(status_f)) + except ValueError: + pass + if service_f: + qs = qs.filter(service=service_f) + + db_col = self._SORT_MAP.get(sort_col, 'timestamp') + qs = qs.order_by(f'{"" if sort_ord == "asc" else "-"}{db_col}') + + return render(request, 'nginxmon/_live_logs.html', {'logs': qs[:60]}) + + +class AlertsPartialView(View): + def get(self, request): + alerts = ThreatAlert.objects.filter(dismissed=False).select_related('profile')[:20] + return render(request, 'nginxmon/_alerts.html', {'alerts': alerts}) + + +# ── Action views ────────────────────────────────────────────────────────────── + +class TriggerFetchView(View): + def post(self, request): + threading.Thread(target=fetch_and_store, daemon=True).start() + messages.success(request, 'Log fetch triggered in the background.') + return redirect('nginxmon-dashboard') + + +class TriggerDetectView(View): + def post(self, request): + for profile in NginxAlertProfile.objects.filter(enabled=True): + threading.Thread(target=run_detect, args=[profile.pk], daemon=True).start() + messages.success(request, 'Threat detection triggered for all profiles.') + return redirect('nginxmon-dashboard') + + +class DismissAlertView(View): + def post(self, request, pk): + alert = get_object_or_404(ThreatAlert, pk=pk) + alert.dismissed = True + alert.save(update_fields=['dismissed']) + if request.headers.get('HX-Request'): + return JsonResponse({'ok': True}) + return redirect('nginxmon-dashboard') + + +# ── Chart & ingest API ──────────────────────────────────────────────────────── + +class ChartDataView(View): + def get(self, request): + range_key, cfg, since = _get_range(request) + trunc_fn = cfg['trunc'] + group_n = cfg['group_n'] + fmt = cfg['fmt'] + + # Aggregate in DB using the timestamp index + trunc function. + # Returns at most ~360 rows (6h/minute) — then Python merges into final buckets. + rows = list( + NginxAccessLog.objects + .filter(timestamp__gte=since) + .annotate(bucket=trunc_fn('timestamp')) + .values('bucket') + .annotate(total=Count('id'), errors=Count('id', filter=Q(status__gte=400))) + .order_by('bucket') + ) + + # Merge adjacent DB buckets into the desired bucket size. + # Dict insertion order is preserved (Python 3.7+) so labels stay sorted. + buckets: dict = {} + for row in rows: + bkt = row['bucket'] + if bkt is None: + continue + key = _floor_bucket_key(bkt, trunc_fn, group_n, fmt) + if key not in buckets: + buckets[key] = {'total': 0, 'errors': 0} + buckets[key]['total'] += row['total'] + buckets[key]['errors'] += row['errors'] + + return JsonResponse({ + 'labels': list(buckets), + 'total': [v['total'] for v in buckets.values()], + 'errors': [v['errors'] for v in buckets.values()], + 'range': range_key, + 'label': cfg['label'], + }) + + +class IngestLogsView(View): + """POST endpoint for the paste-logs form (used from SettingsView).""" + def post(self, request): + text = request.POST.get('log_text', '') + count = ingest_raw(text) + return JsonResponse({'inserted': count}) + + +# ── Ingestion toggle & SSE status stream ───────────────────────────────────── + +class ToggleIngestionView(View): + """POST — flip NginxSettings.enabled and restart/stop the fetch job.""" + def post(self, request): + settings = NginxSettings.get() + settings.enabled = not settings.enabled + settings.save(update_fields=['enabled']) + stop_fetch_job() + if settings.enabled: + start_fetch_job(settings.fetch_interval_seconds) + return JsonResponse({'enabled': settings.enabled}) + + +class StatusStreamView(View): + """SSE endpoint — pushes ingestion status JSON every 2 seconds.""" + def get(self, request): + def event_stream(): + while True: + try: + settings = NginxSettings.get() + total = NginxAccessLog.objects.count() + last_fetch = ( + settings.last_fetch_at.isoformat() + if settings.last_fetch_at else None + ) + payload = json.dumps({ + 'enabled': settings.enabled, + 'last_fetch_at': last_fetch, + 'total_logs': total, + }) + yield f'data: {payload}\n\n' + except Exception: + pass + time.sleep(2) + + response = StreamingHttpResponse(event_stream(), content_type='text/event-stream') + response['Cache-Control'] = 'no-cache' + response['X-Accel-Buffering'] = 'no' + return response diff --git a/tailwind.config.js b/tailwind.config.js index 7e75998..7ef8fc2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,6 +3,8 @@ module.exports = { './templates/**/*.html', './links/templates/**/*.html', './new_theme/templates/**/*.html', + './netscan/templates/**/*.html', + './nginxmon/templates/**/*.html', './static_src/**/*.{js,jsx}', './**/*.js', ], diff --git a/templates/base.html b/templates/base.html index a0823c5..8bf7060 100644 --- a/templates/base.html +++ b/templates/base.html @@ -139,6 +139,18 @@ + +
+ + + + + {% trans "Nginx Monitor" %} +
+
+