From cc4fdb9cd0113abf162bca0f881f1284e90e33d0 Mon Sep 17 00:00:00 2001 From: Louis-Alexander Kerst Date: Wed, 7 Oct 2026 17:42:02 +0200 Subject: [PATCH] Add built-in updater, bump to 1.2.0 - predatord checks the Gitea releases every 6 hours, downloads the newest pacman package, verifies its SHA-256 from the release notes and installs it with `pacman -U` in a separate systemd unit - Update notice and install button on the System page, in the sidebar and in the panel widget; `predatorctl update [--check] [--yes]` - Optional API token for private repositories - packaging/release.py builds and publishes releases in the format the updater expects Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 10 ++ README.md | 13 +- docs/screenshots/system.png | Bin 0 -> 115313 bytes install.sh | 2 +- kernel/dkms.conf | 2 +- packaging/arch/PKGBUILD | 4 +- packaging/release.py | 72 ++++++++++ .../contents/ui/main.qml | 22 ++++ .../org.predatorcontrol.panel/metadata.json | 2 +- predator_control/__init__.py | 2 +- predator_control/cli.py | 19 +++ predator_control/daemon.py | 49 +++++++ predator_control/gui/app.py | 65 ++++++++- predator_control/updater.py | 123 ++++++++++++++++++ 14 files changed, 376 insertions(+), 9 deletions(-) create mode 100644 docs/screenshots/system.png create mode 100755 packaging/release.py create mode 100644 predator_control/updater.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d612a81..13c23dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 1.2.0 – 2026-10-07 + +### Added +- **Built-in updater**: predatord checks the release page every 6 hours (configurable), downloads the + new pacman package, verifies its SHA-256 and installs it with `pacman -U` in a separate systemd unit +- Update notice and *Install* button on the System page, in the sidebar and in the panel widget +- `predatorctl update [--check] [--yes]` +- Optional API token in `/etc/predator-control/update-token` for private repositories +- `packaging/release.py` builds the package and publishes a release in the format the updater expects + ## 1.1.0 – 2026-10-07 ### Added diff --git a/README.md b/README.md index c2c71a4..f46d869 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Download `predator-control--any.pkg.tar.zst` from the ```bash sudo pacman -S --needed linux-cachyos-headers clang lld llvm # headers for your kernel (stock Arch: linux-headers) -sudo pacman -U predator-control-1.1.0-1-any.pkg.tar.zst +sudo pacman -U predator-control-*-any.pkg.tar.zst ``` The service starts automatically and the kernel module is built by DKMS for every installed kernel. @@ -83,6 +83,16 @@ Keyboard RGB and performance profiles work without the module. Uninstall with `sudo pacman -R predator-control` (package) or `sudo ./uninstall.sh` (add `--purge` to also delete your settings). +## Updates + +Installed via the pacman package, Predator Control updates itself: the service checks for new +releases every 6 hours, and a notice with an *Install* button appears on the **System** page, in the +sidebar and in the panel widget. Downloads are verified with the SHA-256 from the release notes and +installed with `pacman -U`. From the terminal: `predatorctl update` (or `--check`). +Automatic checks can be turned off on the System page. + +If you installed with `install.sh`, update with `git pull && sudo ./install.sh`. + ## Usage ### Panel widget @@ -108,6 +118,7 @@ predatorctl kbd-brightness +25 predatorctl lightbar wave --color 00d4ff --speed 7 predatorctl lightbar --sync on # lightbar follows the keyboard predatorctl battery-limit on +predatorctl update # check for and install updates predatorctl open rgb # open the app on a page ``` diff --git a/docs/screenshots/system.png b/docs/screenshots/system.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f50d6fc3c712d714c1060a3dc2a2108d1decc7 GIT binary patch literal 115313 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.RF%MhWqM0SE+Sfipvh4s zj5rk{%^w8r8#1|X^OA;!5J7gML~uvPxCEyMyPU=zLwbk&e~a}~74228S070{{ob+U z=^3^X9N9ArQ^OxE&{pFvBZ^d;!X1*D9xrY6XOfhTGD~cjQz8oK&#aG^jf~{Bi70~k zMV|dUu<}vJPxmS06?x|2logUMBB$|4BS5ODGws3oIR;Ue|K8d)MyGh`@Gcld5k@=B zO&Iz$@+B!}Ia)>WSsEeCh8MKt2Cj55u6XuWjK05jQmFw~qCZ9%zkXIHjZ(bU|Z;|l$cUN(Q ztucY?kMnEUJcDD(w?@& z}+%tn*?m&sVzagGds?{eq=Sa zDwd-vf50~}b1N7#XHPr*xPyKVv%2Ibu+GgC=-aps>L%V-OKW~&_DeKEDJjiMtVjx1 z;GwxuUJfsm9kg?3X);|92c%Vpsha;2-oDv|I!7pulgK~(s!aNlr<0hLoHSvi!_N3G z$Tc;4AlM3JFxNA_|MzzX;{WSp$a~SjLy-64FQM{+u?_$Kf5wLWmm)a76TWn;IE(uF zu<3FyM)J7*cJd+%a{T%?TK?Q~A9Ad-U*=~QWyg(c7Ok*7Dj zt6+Sy#wJ*p|6u^~AM2CEPL$BG^p=h&!Es|v%Du z2{)V0P;wt32cf_9&dTzvtC7*u>(WC?5Gaqt2ogXu!mZFpA>FQzFRE(^wmk*?+Gxpb)!~~sD=EeRkTL__=$+)wF$M5R#_u>P3 z`akfRt_%F>xfRz^aMM%XM?se-&hV(1xYZl3hU8=k6jY`OBXG$dG#2$6TCTad1j&4b zLf*XX(_*Xuh4h!Q^GMhGRH@neGiv#^fBiK|nrdV?X`}6ru8C1VS7~3IW7IPmXU6*h zd?VrR262AL-I&2QS~&i(`xo&z?FmezEM3gM=L0{Kw`~5!Te#F@g$tb~Y5qA1+9HE= zk+gR-IU}EEq+=K!GS0D%$?EtU9sm2)Hn4!I6!}@1l<<~9?Vmhp64aMhP5|xIg%MBF ziAnlyY+y9BcD%uDm?SEGF>ol$kd7qHADV42D}6Qgdwt#7($P^2yjmaIaami}lZ;2q zDCLSAQhrgZc^3`ASIQp8cL?VO6synd%uQdDZcF?DJa7uvBjWK>_- zT;{zv#E9CZXI0H`&A5Dk!4K)!IPy#s{kvrjl-qa>(?4~row?&QFNT@+<~$BIGn8XM zdAvkM)C$WLtLPiXc9ijSZV-slDM80=w2B&%`zn`j_rnr~(h7>$?KOLbGb9IA2!Qfw z=Gy)!{y0C1bCpY*Ja@}7sv9V})zFei0P(XC?U$B4xBafDPLF`Tss2Ss-{mPwTYU4D2sncfX^T%+&OMAu;vmdbJ;+19MDF1 zDnvO%=d=2avQOy&cLqpLQ`<~TcWk1^AyI`jd-Ms}gW0I5VjCf$DKUx01211)5ioZG z;thgtBZ=g#iNVSi%g3t2uY9EUf)yl0MM;9+kaeyd&GNeokq4tQO=Z6J3>qOh$8E%a z{K%fDv%w<&bHIbd6a;uG8txRihNCa0wtQSd-8S4r7EwSJa@ zG~G|t(Zu*4`%@*np6+btGIexw`<`ssCJY;--x8*I2rkKBCTo07k^}V(Ep6FV~M(laR zl)k}-GG_4Sk;v=Ky`}5pJqCXcQA36R=--@yn)9ibNP~6(C*tjxk!$ecNaC+wo7gJNi@lZaX zyx*xzNWn6JkCb(>-n&EolI`!SZulpZ?l%cS!4^pGaB{ai`t30XtyUBNIgZP(O=%cE3$R%b_ooK;SP6kfY680i(P=OD+-;AwZqW zMLT7!wa&4|7KKWYwmdwBVgWrQUBZ2$w-<)6QDq&UBHUpG3Emt|LaRAeL(X;&4vt{c z3;){zc6NUau(lLn4LZ$&!oB4Awa^Qjpu& zgx)&XdFym+J@433T`M;3T?Y1)lCh>I2gUF`rF&(#sUW(p>=FeEjLv}_J|J{rSaYOYI71EUrH+z^Bnu~$oonp1ZnBS&5jr}p2O-y9qm#M5f4>km+c zEHn`pE`cQdep~Jh>+5;0`H?!h+M?oOpyR9JG)}Q{O9MrXHUXX{PO`ZqtMS_Xmcr6P z=0GQ}rqLDFK)F{EqT(C~GJruaQUqCg5mO`DOBW$VM%rzAdX-m&O{ug=x;&3$P$(3e zTGFF=$di!e*H0t5$Iunf)4$T|rWC*lHM(xKCw*x`p>;iyVhr51I|1f(!1$miIqJqD zOVy6LROk2_!xMPh%vWZ)#4D`j{Cv^Q=D)xK?Y@JanXnDDN=BBf_miBtxkp8PN1s|v zJtXQEak6`7pf^v1aW3)hC??ZzoxXb2Ei5GT>Q!et$hB$QHUjLhQ1GVu-d*C?>7v@4 z_LaZ(xBDtd6^JVkrCjTE-`)A2I}aotlJXddYHI6kZ*KClTDNy7Ga}AUH}X=bwe!cZ z2fO;2BMzGf->Wuwu9ssV))Pg9CJ=di>Qvq_MEBXj=d?f)FWcf#t8?IC%fV3w+V1AF zYD-{r$oli6V`540c7Yb>A^MO$MR0Vs^Yq=Ev@))W{7RtWI6x73P1m_bDW|V){fDfx zeI`4O{rr+sn-;tLr>bjR_*2z2W^2_7Dbu9<7cutneq)Hka7MWHM{_FIc00S07B}p} zsBZ8hm>yAFJXw&!D+6iySDo<`l={+BTG~Kmb?oWuin9kQXXjxnFo6(tU+oJ%;jM2d z3g?p7(0cU&6;#D`MD8R z6A|UD2PJev**Q1|hQEb}?t5E@W_`H~5fvAooc0hHh8Y;YH~IYL-P>5l+3`8f7{MvL zJLny)v7sSpkApV>Z6kAIeBT>IZr=_dycb|0noRQ6Fi}Ax*8S7;Rt@D)I+c{e7kGed z{9$r$pVG2Z8xDtG6F{3f*IeT4 zL(>d|sUFq^8>q6HTPvEqdsUrN$Rx>`#|uhfs$=D)J;AWLu0LdcXwOeWyJK7YtPjw) z`I5pVrCZk5J1V}9ItN{du_h1oH}ip)SlA-zc$359mEy}hLzkTZVZ_Br-N?TC#9XH5 z(@QfRIM&kRvIF8~_ipC??hN(Zl!P{C92^cm^@E>aGQ{X2m2xG^eTt3qcl-bg&}{J} z=Z=&&9Qi>I(2V*T3`0}APF+;yNB9&;qZsCFjn4aWkL6>mPwHbInRjJKdBvs${hhXx zF0gWYLu+A{vnLiKi^AB7VVsbM4;lGbdn=J~a%TQ&Z~In{Eh9tZexVj%v;Bx}jFq+p z3}VU~(otCS+=42vGD}dBQ!RTGDA8vNJ0%$)Z{Eeec=DBTj8EIMwY5B}-B6j(2kgK{ zdXJ~T_J`~mZ|f~AY#ut&$RBr@JIH;R?`RtX_C7d| ztky3L2*^HV`23=E?Xa4rxEH_`<0pqKmyE_o?{wC+`%kQ=PQy=7JJhnl5s8=)Nw}J> zj=r1jzYC`IgUqLl^M~d0oa`R$(zw3YHVyKnG-BSq`Pt;TokZx!`yC1?;a$Pp%6ut| zxD=N_#?p>YNG3=~_~_<$pr%qp6J-d1n`HGQntV#4;e>BzRQqq zN;gi&tS#VtKYpwbL6bs9LPkgNNWgKl@}r{pl6somfb}pE^}skV8lWU9$Fd3q);oU@ zpAzHKr1CObjD^!q3y_66G%JX@E|-Vo*Fj$Vv=~mz`NovFB>ldnAkmY@(b>q)F~k0! z{|7MOoa^2G^2Kt0%*wKcTzWnvtUh?Di1IruDqTZ<}iyWb!8i6_EOR$+>T;KN`XLSvfj?xZ{4o z@c7sXU3T~HOl^-)=yIolyiQ(Nd7fMa^|R%um6jFFqdP?6!A};*8KQ0`T%jZ~9|uj| zQHQNi9@kfU;+kKg*$`9Jzgk#D$pdluwRvc% zM$f^;d49k2uOdjRAl7&(y(x?{zf4Xx`zC%iUyAt;{L%WR_SbNAF89a_@64T|_5WQQ z$|q?i7gxx|V9QTe6aQl#W)bj?zZ3blbbqWichniF_{P?T@qPU58`~?ra2g4-NdhSR zd=7ytBa`8cwjjd0+5Piz9#0(qzWtv#wOgazx|YW9)VL(GSpkbK!{odux_MRqH55Jl zwePjEa_C-1O>AhbW;an%c$aZ}R3!b6828dB+Q~Xy@YxAXyy$lS@J+E!v8dr*?@EYO zGHZ+J?a!vO=Edm!S>!vD%ds6uZR8H^G-ULhi84MQp+``qtx}RaCBsL=hVD>rO_$|V zSukh4H^(DJR2~-J4NJhgM{G*fWd%qHTzb>c55|o$_^~3W385R%w#dF%twu7%!#60_#q@Pr)3wc5L2|-eD z-{2^^%b&Lo;0+Cpjh42yVM@7zi_N3&45JnNXXV4G0hdGDJtNo6>yHsRg`XEbX8V}F zX@LYuBM{;<0-688-;_0<5Pk0Qh zEP=YIz)ln3<5%X^4mmW>_U2EXH2m4!{+<4JZ;86kp$ca1gl5$`Vu~8FP%lOB>~#H& zr)E~Qbicnw+Ax4=sA$SYZET8*Jq?jLTUFP%U(S6$YjG+f>SVDip9?8Xe0;|1Y*T0k zAGJ^Om=1OHOJD9U-e&@wg#fd0LX6K(^-yjQ)kH&wZXRO#&T}I3y79qrmH7%O5M{P%QsJp- zda-(i%=$@&(5x<2^#@VmOUD;BxksBzaBl7_4f7ZvJ>6h&365Nb(#4lIH)B)9xp)g0 zL;3-&1LTE@HqIx7!G`q?dMY|D+0--a`Kg-q&YbIZDe>=+vZ^xj^3H$Y&&!aSbKFN5v`%NJ_#*4IM1JwwA6XR0ZitL4r@pGunOs`wtk4xsow2=&I$GUc-1uPh zjC;VO;bSGpS&>=R<7^b+5ZioPlDsB2>AdF>vCUkwEN1o=I#y2+#FfmrQV>q}i zr6aBRDONwyOV_7lZc$fJ5;2PHSd(lb8ECcoc2AEs%I5YbssJ??|SJeS)_=`s3iIx&KH_n`&g4MfIf_D z=EQQ*w%B}EjA2ztm-fNt?Kf9XkWkG--dL?-YHr4NP965rZQ?5PipKgC1}O2P=(nxV zvcRzynkc*)c@n@$CXo4EPO_27arv$uCY}cZnOaL%_s-o@+Y%`G zC8k)b&mZ@mvnXA1Uci@2O3LI8GkaAFk9F-DeId7*f>_1z7VI(v74&gH-|1u|JvdlA zyN#EXV-m0~7V}7FQF|jh`sE`TAbTf#$}v}0w^dk4Fa1>O=;+g$nmX~$_BPR0Zu2AU zUkn46HolgoEG#ep)D!<`*N(wo_ZxY1~YY zVV9V@sZ#C}9|X7E=Bn}|gM$?Scdp0OSw%Ixl#5F~0PC^KNJincwX9dFV=hQDHk{JJ zu{m24uB>E1+rfMHLM)xZ82lV^z5QQAA6-k>k*k!Xq|aur!csyw~1#1vO4!RJM13o`gH=iN&AQsL1&SIbBr?~AYVlCSsQ-TcO9I+~)W zrMBn{3XCqM-ns`jhK_6N#=>AJJ0$F_0n-~MQiKqD^L!IS~cn!y@kz+_!K~JJ+|CObO+gax{(*Ljq{BcOnZTppee($4o zh!UD;cab}3Bg9}tuynFum!8fl8QF07Oi{C=U4g-*8ubm3zT^1;n+<>-jM0C%%~rqU z+ojVxtEK#2&w!i^kfVXY3L7<`HfLI?rK6)urr9Ch zM<8e3DB$bCw%1Nv*_h4moe|uhv=J2H=LQJIKsbvfPdA5tM*Z52x9z+jd zUK_grPwpTp*7#V40kRH8DG((XOkwf&MrD1LgCAz_U7AJ6`(Zrw?N#GWw;pL!j8+8P zz0D;1H4QG+xmBRb3KtSxUq$ghc`C>`M>lbw>0UtF5Yl)7i(}){yFN(UtVAc|u$s7< zT4KAQPH&z)T{>=L=&oOCaYvoWam`88PRZ=pi+DGmy{~Olk;%~v%!we2|2%@IP%#rq z3fJP9l6TN_wS?hRVtwc6@!c_g0a#(PR>9@>n_M*Dh!f=@teUcR}!M zpHuNPW2mc(OJ(}q1>7CRR9N?1_c6kfUO-URb}rlQa&YW6Qv%6bJ!5`hYvzy+YATxa zS_oSQFYdjd8nC;8tujGE2eq_~VaqLCz^ED0k?Zf48Hs*Fwzjz{34rimzG0g@_Q*EV z=DP%$X>Xv{qtnc^&Da6&7m4<9F=1h9V;6{+-&iL3fKhLT%dMCYs8Mszl9MF7i7~nA zbt@$Rn(h1^7^Gy!#GHcp=!m+9kT0`!>Tc9uL9i!>VV3FuAvToM;<+&uF{w?yzRzC` zuz6)7f5m|VQ$T1)3cvli{5rF~9{5BM+77`UCrG472X~r{v6aR&Hec6elo!0yHb4xO z?o4vVX^qX~SrOikm^+{BM(x|XQbO%)H32`gdFWR%9N;qr|GWUQKQtNj%U2HxP5cM2 z!S;U4KCp>GSEBtzf2;l4C6*Y5Zbae2FlytlQgNib7juNnxK*x!&VX&UKypg$z* zIm19-`qE!egk+Ikd*+(-nt8nfYDFCFxqjpJW@D`E;V)V zSVqnvjKL2BoQcj0*sYh>AGzPLI)0zjNrA`(EK>5C+lj# zRXIr8!cQG>C`*bL6bu#*;~OQLe6&lKCVtOcyGWSSUjMQeFYSm;b$nW2OaN*e8cHn* z8O_ePI=gv3Y{Ygqy(rTO~T*gNsO>wDh&_&!9ybd>mgBC=(8Rn%izFA=1@aPBR%61EzY4dKxRC=7nq30 zH%D3Jyinog=PpMrA!Ex`u=s+9u?29OC?{{H&}`83%CrD?ZBGtO94DJVNB`y2ir0T~0Pm^`ctJ13 zlH7%~o3Xdng-;ka*Y{xH?lZvE3kZo8ofm=8^_kyY&8%=|s%tj#{4eqWA3 z4{%o341ue3YnO|=9u`{>5TI%9SK4c}dVFE_Xw*pkdv9{U+)b8?*!)aehq#BZ^3w>y z6*jd;_;<+UV4<&uxYtS67^w!<4yl5z3!u66k~<!zwyKblHjTQ$ZOMnN8j>uBQ z#m3wm-c*yXhXc~IklQMMWUdr?L>+8xQ$UIz6wuDh**9>UK~JCdfxl3{G>e^+lNIYB z^uf}EQHr~>v-2t<7!LQ#@BU%IUw9d{k)=u2{bj**eWD`s8;e4?(qkCx@WNLFtp2@c z0f}seytZ-}iYU{~VecF7XZ!Fb@YF?*B43?>0Z6o0(Myq$Y91cwfOZy5)?rZ}Oya1O z)7inphue-oHL`MaI{*XJuUsAd>BdNYYXLcpLd}oZz&cr=82Mzsef;P*@G*v-L?%OS z-9oKYF@JWbU)y6I#)>-V;(AV!Yv>+k_>TDd{c+d2 zYu#_%?^}0W7t4j7b7syt``zz;<9VK)MkvmsQlz=LZWij%+XmFO-zOb^FjHtUC}ZyF zKYHpx^G8&ek5)PL7$~oO2>#Zu7eg@%%l#52(>0U~{hq6+TXH_KK)&ZmT~z#&gXi_m zkw&XpZH&DtB(#}wo_QM#a4Jq+6oh5{OHO7GLo zFAE_GbgMwuMORNK_uVZI?paM|h!=B)|J%{)+r4>AZM97l=HbN}4HXtvaCsi-3w6h( zH;JEo97^1+CJLuu&E4?UUH7`WI-eOmJ3G4?d#5bz3(2={K74JaqVh?*N%ZymW0V&*q`V}i!2R8e<5EKapcos!nd{%vpZFKPRg;hgp#Zkys&Y% z*b02>dtj|Ox8$l}s?@^V9(LMa-m{fo|6o_BZ9NC`0&YT2 zzj~5pLeK?mXmAlwchfLG{y6VdLwR}s<4AuuzeB$U(CcY*2Xg?TKL9S5FWNp`Ciaxr7J2@OUw;unYq+Nb~rZ73bCm*4o!=+cJTrn-RvZAZ9u%=7S zzfSYy`tmwMC~<&Kr+)Gr+s?pEqrs0{`-M5Jfmn;2c{F_a)%C;rI*#C-wmpxOY?*Js z`#(9iZ_ki%2dSvg$z0Og3PJv;5e z@05)`sDDoJPsf$ht9=TCJLu6cGgA+HeY7S~kU`#<4f6h{VsXA6kf^X`VnpNa^oVS zm6F@3E2y6`n_*`sVL)GxZ%&E#W#|mBe*eC-ZqJq}is$ulw@t3HvOdvKpc^aOZ6W41 z?#iMqdMQzApfvnmUPWE2>x(5PK^`IO1Xg1QcaB{30e=d zU-p88b;8*R=`!JAe0pKjDX)ALSF5?4FF z7Z2K&90%w`2Uk5@S?@mU2LNg^<9dyTQ9oAAB$&be+wbl>>U|DVgS~6AO3FSF8aWEk z1r3>vkAisa-yt{VURb5a_5R?^#O8UU_d$IvQeV``;ST7uk1uJn9@5oV4&$! zxw*^xPS#3H?cZVWtT}h+vo`(rYHFEk{qw$!PKpv~(r;hpW`pmTWh1?#AbQJ!yvD}r zd2cb;D>MulOU@J~?5Z?EcMpxW^aMEV?$^L~|AR^VJN$p@ z#3gsvhiLnRWNZKi6|1w9N4d@AnUfWp)H2cEd5;zdGv`cUA&gTgtNDJan=ofK@)hqB z+RHXMnzQGRa(EzM4l70PlDB!rEOep9jvjaSZcoseDM*&Q;%JrLHVB3G=Buf%=_yG6 z*#|5md)2YQeqnx4I$Kkx_lacF-31;mO*vCoEhIko{unEILB_T?)>#M8?94kCXKSQ}R)UYl?l-y;g-e>}bo$gfu&^?|4hA>}^Ye=qx#9xE{|Ka~MJgnU2VqY1o>C`t|LxX zHVDob2Zg%BDVqETiM-Q>V8ezv>eT^hnI}#s`=tep2mhT`LW+tFDav(yzxRfopj}{- zJ`*zHfcgm{S0)#yk_I<`&VH55AJw6O?-xHvq@Xi6D=ni&t$2u<+E{H7m7yJbNNBlp#nlk^_tAHdK%obUB`;l5*3~ zn<5tC2VT|_xthMdf6E^ln)Wu&QZDfC1QXfcA8s4gPf8(`zLDey#IQct@w(}tn3b`In|5{ebo~@4= z=>?_;Mo^Y97|RGw``&bunDI^Z@@Te3UosFh59(A` zU$KDLJjSOP*-GuDgQzxbCO?Y8W{WCE1dmcBG135!cjunb&R$j}F%y2{la@7WvGcna?AH>4@>Xa zhwl7b-s)5P&6Bs6xKxrmbUvP)tHDpIdVhZC8BP=PU%s*Co1resAe09^q5>dt`5d>G z8JO}B*zid5=bXOkzdNE^Q9v;_;mIHRpSM4)T}VLJMaqj>Me(NeN(YpDJ?@Uk*v02W zFP=zvU%)AeMf;?fCh|3it%+i2D6J4FcW=ls7FbLj>FutNmN}}UB{GgT^}QMi>sMY= zGpqD5w3eX8t(_f0J_ZvMdOu$=A_fgvAh@b z`1T}gB7dd>h@c~lj_{=am8?VyBn1}Kwlv^z z`{m@7D1?hOi<*3IY`Z6zG&H2Vh9-(xTW>+C>Q7#z7zwY_xm+Bci&nE&XdOIZi&cI! zy6a}1Lks)>i%hmk1>nm<6dguLnfl~s0_fr@YL8~p+Lu#>U9#%)UvZ1_it;{Gz8mMZ zXkdYvGvve{T{mOrl^V$8U|LxdT&CZ=UTvehR~AMd+hYq7AhsTah@ zO=#mEYQzzek0x%HXYU8i0ACb#vDKfY@RkxJVcxb_kxG zZ)P?Je>ts=Z^<+!hOqGkgzq2n7dtH+Rxn|8 z*mO6GcmQMi@#1ADRd6L-RlQy8IgH;SpMhC}5v*XLrWW#^rc^q6)Qsne#0~ljrlNwmX9@5BvKS z@w|`ulc07}igaqs;5~w#qM|kD-41m{Ksz84{r5?!9zFDR@F^}X)SGs9dKtO54;UIE z_*~p$$CI13+%%9>R71zWo#m=6sv)wTr!MIc+20Rux_f|)A|D`5I#58yR{@?Qz|F50O|9>a$3Sd1LZavS;gRoQm1Ya2Rqpm>R zVx0eZ2umkfy<{PCk?(~6J!jetkjEop4}dFl9P zf91D`M2~p-H3Vp(CXZTuU`){B8vBO7$CadT9s&T|U)#7&FD;u8X_aW|gTAzSY|@!W zOR%^niCuimnDlk;pC~OYY;s-RgNwTU=MH|NeShLCNPRZ40QYTCdjp}!?pEe~d3v`z zQ=wxhCX0!)t`7_iw&qVTWsb~DiGL_jpXQ>NgHoUTdB_&Kxegb$SiuS9koBpBK}0xS zI|FI|K6wgLUqo7G={@~M>v1ND_rnWR!CCfsLyx^C0K9@j-hUJs9P81he@p?Qc+Vu{ z7_#|^LYlwZbh=?Ca{N5^& zC$I2HS?+8Wc!qc~-?Qg)MVzI|^RpW;<&N8I?4rNdPH~8I9HY}N2A`I~%>#g{jl0`I z73_I+8IvN?4V!9}R`D~s;M42<<#(<4o$nyd!;mU?gom8pLUk+fmk52{w@)`nXdQs5 zt==a8Px$QPk5fKll4}j_na?x)F6$uRL{mW9FlR=g-+0mZ&8^_q(YGw$+aLC&_FRad z&0#WeUn8xz3uhh%emkpmhW5GIcwy;+4o=Zo*U;g`#TIKn^||lTah-Gudr!$Kz1m~J zVgaoj;ukGpnsPL3tOa~+^RGBK4yOz!(}aCiViifR&*5XE6Ce4Ah={6$oi=BQ@=Q~0`g;1`r$Q4tBBV!-_BEo-HP8P z0npaN<0HMso$b@{cp#{QJYTOXl+*WlAP>s9MQoU+X)@EV9e$iYq0nAVwGM*!0j7AR@64*QNCGfma!>7POQSF z2+CG%7Pq%&in8-&kG&F4c-RGeA@6|qS717{rhQtf_{TUlsC2e zq{;ni>ROY7TpIe@%XW6zM!kTi?T@glV303S1*VQ>e1ci7;d`-im+2k>3W$g4)p23O zJA}LM#g&ifC&W2+)sVov2wNT72GAEo!7^u#>lkx&cp&zU!C9X>$N#(}6-t_iUQE|^ z({%7BOEbBVi{$USS#i9?qalAqzS9jzKBftmsTZh@vH4xCPpz>L@cp>$S`4UoSW2$i zb9uDt4=eY-J}vn85e4wLS={mVC&1f(XaP~a$D|_}b6~NXL-DE7_3`m>8d~x>_o9GibqKDtHRJQ{+3#1JE8cJ3YcLCqFvE&Szk^v#!Z> znP~vm+4+p;Ysct^J%p}0@#tSbdouzkR0_s_zI#DPD1Nx~?J0E@5sP+wLYm?}-O0uf zYVo$^;`n%{P2zWZ`+`40aUWOQZK9S5>UX^zU{={W$mMt;?0q^tZp}?C(3wPu36VRBJ>IU~sae)___xBBK>_=wZ{nSf~6 z1Q7I7*E{9cWK9jh(I5lie8? z?l*;I(^aNpdx%6c{l*WfAkVd>g~Eu+w@+1o9C8d)s+0#n^#}VDs&Zl}#d-a2)I*Kq z`;zwt#@jKUk!q&(N0V~*&UAK~a3v%VI)H9Pp>I?)rEMG+QP_}TzL%#N&9}NXeL9q_ zZI}>o3%-=d$m3Y@S)!2~QsLmsI=97`6fVTFhB7nwIgmd)U!1m7%mTGwp5&;pO;Ls? zpXDO4flynsXn%=Mbn8ucI23UX@3*J#=*|!uEd8y~J)^_pJI&#)mpw`$hZ;i_L!pS@ zAt%|{(ijgOJbG}yLBfd<{%6t-c5$Fwc@RCkDGYezPxI-#J`3ypI)M2XX_k_4ntTrn z>&|=^rgeM5d2S1`J&i9=yAC-&IgM9&E|d8I)a-qBxSZ{CzR%3aXgpS|TVpcOCo>H< z^q)TjEjjM+l0Sf}igLZsz$wz`-JLAAF zuj6_t{4X=7zrQpzbchUD+t}EL)dj#CGpcp2G_3D09I5@SN9mYh-#l z-#;@`zwtqZ3%i!Oda5v_(jUoAq_!(IX~tEDj(I-20^jDgFl=z1Xi3d{`V>6rYg(ji z3;JZ>(42JtBL^EBosF50Y*lN(2i;CgEt**v(3OlrJq|xzodB-Y$IHt_ z;AeI5%3Q-q>rLhIpPbOR+rLwBZsK0Kot))l&ECL;fzM=ZN_z6Q^yEKQUBlwO$lMT0 zB!cTVpGB3|?!m4tlrYk3I7Shu$~JPEn@i1HQ?``D{m)V0J!wsgWY*_(+5=(uGz%~N zgG^@=>Mz3SDe@S=l!(hq6^GW7bmYwR^h>dfVS7pu&-Zynl#?Fic4z;^0*JXQ{7!Lb zVS9#UCnF*%va({bx?&PbA$mSOHq1AxBP3!QSXFhhnc-)mH=JACl&YV8-HyK?|Nf<2 z#&q^%xp8~C=Ssz8uv0>U+q?Y~36=4kiK0YSeUn9qFayUc1`eZ}`id|-+SbcItu{6` z_5%VOA}lmCYrAD)9xidSc<0+=Q00t;)$UlIrC+piIh9GfHas>Tf9#8;in(l5bf;gR zO=+@6yU0Ao!pE+%qZGTLCq+J!aCR;=Z2C?@VK2)3^*sh2ndi>wwnd-UEz+Yaw(8uj zVp9ve(s6Xqgt#aC!bL;lY?N9Cc&wQR*)q{KPtfRTqAKkUW~w03{$8N{(lkAi)1wXN z?Q~I})4dtfuBdHhtx_e~hLPEBf9$i?r|lfOlcg1`WwddEv@}sMk&%9Yrm@~L&noN( zBGwSdhDq53j`S}T6mqgE;U==)j zv9GW1_}DqJ^Y=c*d$~sI(|$fYARMvIrcMGw;-Zn4s~4oA{hPwbYWrxvQ}9@k*09WN zL*dnKq596mtuLrRy;Sewq|%%j7>3~cc`1{%tdFs9OTceR;kT*Q0ZgnVEpX0ykFt$^ zLC2*Z$WnN?5qi^RhEJnR?Ec>V2J2asYG-#hFN5Xj)-{@E|72slbX>t(t^0^$T9YHh zL9?H5TAQB6Ek+`nzVGS^kPIWwVGa*4uItwR6ls-#8eJ<`uX&Rd&P5*qXWX-K_E_hK?>opIh}s` zbyQjGYTzTfEI6R};NEEbj~_o|64`6u_A`}sLvsi^rR4LCl-pXVSM8yAY5X2a*)vzZ z^bMdR6oQgfzjh^>f1$865vCMP%DFmCf>Gk1jJ zu`#UqF&0*Z!xVg~ETaV5!@ywS>g251bg~4&D2(XK%kUTT8M^t1PK|+2QG1;cONxVW zUR+joFp?SF99HaH~gM{hlVpEO?*t;JCTsrJ9((ni(FQTb-<45_ znV$T5Mm0-?RDlqEjp=a1#g$Fe6i=s3jm1F=GFB8d9uhe@QJcbVIi#Sc;LphmU)M4i z?CI(0??*}J4430B~M&b@6NyEy&kbySi|3u*&8Fwid@*E>t+%OJ>D&@xkN8QXa5pxD2= z7^sv72$z3c3|Mqs>F6zML7m4bi$S-AjL$8G(~W&5-S-u4w)4(_i%lxXF6*IB<`nvh!`;Y$JuU?H)L%yHP0 z>$_fz1-By45g6R^IeAkTQ-13SkjWCH@y(@E$quG4PgaX247Fp|Kig=RVy9ZVw6r8` znb_Cc;J+~-2-_dc?%vxxdKQ`1+x&*1nDUz)4{=KJ;xylMy;o@|8#-oacV}k|rMUg? z;3L$%GkDjK$yYm{Dt$-r;-(;~Y$~?XWTw`yJ9-^(TR5abJYxQ*!C0&G3NP88Pb`{Q zZeAZd=wRuP`ECXtd^xIB3R-t+aB|{2dwQI7U3TCfzn2`fc4RExdQFuqIJGMTt$ZFq z5|Sl-t>xF$+)OgS?YsI}Cwmm2x$1*J`z3~xI2g@#DcwleFebx=eab&IuZcrZsIPM+U<8VP=s)?k->m&oLI4FM%FV{Z!Pjnq>j zA|hs7HVzh=yIbZb=I8w;3SYqL9I!}7ZgU|7;XB^osTl3j6lDDsA z({3+o6$3iGf#uY|6E(AuwFq;;KC9!LcC$3vK09k=eDv_FtU|h`JP$24meL0B8%r_2 zh_C}S)fj95gQ6fHA9UAu_wa~~h_H1{WU18|s7;G=Y0l5jALU{$BFU(mu`P(rA$^WG z5K=kEyJjO>}~RpMRTMS=<;l-)INJ7cU;{XXbc$ z>QphB;Wv5tOib8)-+LvzyB-9lKG_=0c83E>LTJUR1s8Dn%ABakNMhk!dmE?7&f`&; zjJ+9XSyR)18J9Rvt-u$(Y-1JOhm{0mml5cFthFoIr(>4rUw;haF=AvS8dqegNKZSf z>&ybi70n*=zEPmw*YEWZ+`tlY9ZdX)OE8bAlT(FV8jYrPf!p%y$#4Sth3g9-PK+^x zCY}V8H6Q&7qh!_Q2w0C;-(%|7-`{T!lOYpwtp`-YI%#Xs>h-2d>6KEe)4ui2fj~Pj zaqP#~vh;3O&VDlcVt(GRjK{cGHFkNqx%?WxM?OD-^$i24t+J-$WIJ4{iun}{Ty;%N z3PEocw#n=3a1y~kQ&apjG(UeGw-$e;-raa%nHT=o+mPC2x0u&y2BiFGLqq5X1Q;TY z{;b!4HTkoDRu2%O-PXI$xAwxDOmk zOCS+LE^OZ_`31;O;EP8X*zNi1I}WW#fB0;Mt&E7s4$-Ccc;=cJ?7Z4KKyS@rC!Vo( zp*$p{Q;}DvjuenjxBe4M8%g;H7q_`8giO$Rd{Rf0j&F9N#vaGz!-o%^muT)VD;|T! z_(}DOS{7SvaO7~7dVi*Rr&(rDa}~R2C(lsR z(M=g}crpw=Xbmua|NgV&Ye3D+@A|aXkTtjXlrGu`?^0>wwU73L`X)qcW@wV zIRq%|o93|2l(pKwB8RWWE(Bbp1&Cj*5s>;L87m*E==5W&FxZ^K%fN2&pF0=*Pu73R z667jpTu*3az|u$3gb7lT)Qht!{aIWWTl~7C!t<17Wa;xCYN<4C*;t%5` z)jTd6QPPmx5?s06{tOXoUq?p{#W5hcyWPsh2Qo0-0MdPJqz)P0W=dJB0Y`v62sA(t zD_-mA3_ zXBCf0R;-w0!&7h_TE8fZBVY5;g(A2oH_dVa!X*TE8l6@dGt>2!AjEGq9+iZpy`hT4#7vwtbq74`uOW6zf z+naa91|T1fk$AMX1*121Sq1vxxG4cTz;eT^S!&uTVN=I2amVkb^*zk6joPF)XaR#^LU`xPg zR(}3_2M2b%Fg7+eG54D_V1Jmsym0%zVe#8<8CvC@z37=#nIJZOeSN=;frf*r8+K;q zqO7LM0`m+kDhQi?-%tyXzYGJ@q{eG!+meXoJHJa;b*Vlyc`&iE@=tqMEMQI^6BEbe z!US5S+Wztvt9awLze6H{f(GII?NY>x{%)G6qvPWbObK~PX{e2qgR06ZJ%f)xImMCT z>TsMf&cwv@2I-rl${*ROuFpCQgl~J(6?QO>`3>~HO^9+CSu;28U-##5MS>*cN|AOi z*T^@=L_r3c{0#pEJ7&e-pM#DOT@bHSHi?_O-E>!rqej01qi!-Ir%m*854w`hy%SkMT`o$`i$;T@NZ@ax4Z3CiG~*f_hr2M z5!v=5C8bYCak)O82;bZF0DBR6mj=@=IuF<2A{{*0HeC>u=AMD;kRq^T8h%>J|*k1VgW}ty#xUiw!4_v zX?hmkOtHfNz@WZnv<#4YA9*@T{tV5>2ceYCSyrF_qu_x`#SwtZSPZzLWP=EUQRv8a zOhb`?Tn((`l^sC{tBvQ`^P zWf&OF^lC~vA;c#Y+yO?EUCjSvTWewd^2DQ-ZA9X$i<3%A3HIsMk(wX!{?zSZ$fy+= zzt`k=5;lJ^qDv?~sXfVUaRrbjqJ__7=9hkc`4m><@m^Z@F;&M{zt+Zn(pTNZLL5gK zg;XJERu&6Keo=(U?Vs0DviL|E7i_+B@ z)>@HGU5XnN;_j8uF#51u7njognWL~76YJAwJYg}!ytNKnXup@u%yY@-GOYNL9#Orc zHvNq$eRz2@aH`&AVnGmwPa@>0y@qdiJ7uDkJZd|eQXg&n((pD=nthbstSy~9#Z8En zYV9lh?WTjv=zm zEBeiiC{?g=FiB?-#=KR;AMB3Bor%bfN^>6mi(IX{-h4N1;5$s59Rd<*hKTNU^IXH} z26J?urou|#Cv|>kNbcnL7;3E|LLqKDa(E{0tD<5c_ee0c8j&eOK_nPCXaRozB`wJv z=rr@0OY6!l`Y+p}%?X>mQF+S-dyMO7iAzpVa|EFTU@_3MEnd6x-+)<5XIsy8Y=ftK zRdfvKT-^aI_v40}5mZ{m5y7M{5-UYMTQftzy`JN?F)q$%^jkvnb+AQl9-pp10M7>q z1Q&(@CdMpP8w=tlW^-THkiVMWh2aoaEJG*@nVGLc@g7m~@NlEzHx<37NgkIG1P+BWe|=l$07wR10f4AADo z)2U;n=qq$c%V9r!=!4V9Sy;%PvyjaYGnY7>A3HiOvb|CfxM46gE|OP>n(j1BKWiQq zr+#AhLqJ1l!X$b{L#wO;hx&t7>*@|~$cBX;%YN`vU5Dahr?`rYqA6{Or1*rz-T2!l zjlSbQ#DvaX6UBNx&-pVhQdWp6E864%#}5sT}G+ z;c=#QOk7-f{;P{zsa_G0deHuyl>E%o&(EcvN_0F6moQL#)Z3stWd#yeJ=*&erg@z9 z0He9oRj)&!OGI0rgB;cxTTtHX( ztzCWom~|xfiGGf~Vglu?xa~n{iFb3%6KBr#0YCtbx)gYN%si;a8BCi$f_G zq3Da8O#p}i)rBY!#iB0dJAL%rg&(UYS3F^Sw-bfFV-Lt89`8&7-+tJIrma%ZdrjF+ z@VS*hwwU@hdiFu`&@%S9_B-$|FMd}%po-8=Ah4N0i+rAW)D5$jAid$~4C?NTi*)&OC@hanFIs=<38%Zs?M za2SjFRXi`WbH$YJED=IxNx%^mXiRgi!(u_1%{KHS2{lDN!bPYh(OXmaLfVgq3KY8h zwCh^%&F7g;(^}25&so0A!$Q52DP)avCP(VMi`k!Rym2xa<;HsS*VR!P^${!iFC*!x z1To<1%@%~FPYEI_w13v@wyO|U3B&HeNH)iECSQa3^_*Y)wRgu;&bAsu(UL_FG4|>z z<$I^CI2pW(v0k}(vsxY;V+JMUP6v)@W`5&*Vc+ApUK+Q!7epH~MEw|TxIgtpV8UjB zAJ$Scd=$OjJ-F{EQ=Vy!4iI`A|16k>;m4408?VGCwU*pwAd7oJYz{-8!tnOylhPA^ za}2~Mog}lR0vq|j>TG+4q4oiwY|RK-wp#tKA6)y-`1M#GOVt2mCLtNAM@|=~g~beD zjZZ1h8k@A#TH0l+KW>;i3z&oaBRc$4)WQW_iHEnpe>g5czAZVXl%BT=N2o@qne&~g z#@kuOssZc4x_;&wLG+4w&5d6;0-a1LNBf)svIvUB-+i;F8`YUm@t#2`sh2~NHDGY| zAQ@tvR$3N3IOHgxL0Clu6By726^s9xARPJUBHHE)#Kvu@MJN`5rg5jn4$+ADO0^g7 zV=onBgXpZ}Tx)hpLy7lO6o5a)nEnHZL7nXjzhQWWWz#y@UsMD=!%3{K7ZR4o!9a$% z&`ZZ=5YFXg6sd0jA2TxYRZ;)qPe_%19y!N| z;>KGQb;pAbNn!LU0{P&JOD8p5Rau}19o)-3!*C6RXYJIc5AJ7HReAOt<^y;(R@sqc z(r>#o*BT|Bo!8c{<}A6+C%_g@LggRX@r82Kn0nZyN(O9ATqNNb2YW5z=`S% zY9GuL&ERikhUIQxMa~FiqM3e8R{X_3DN|-(R^jFv`@n66jQ2Pb`PR+mp`ZvY&ikq>_DV$pwS@iL`wDZXFUhP z`Fcf$qU5Vq8DhBz@Y9>Dpe$9!q9P`>6n)Zd?PJta&LaTpvav=pVl|!@Ls`lIbm5z5 z+*~qz7T*D?CntY8qgp2i-Q5x}9=ZXlD!IF-$7!jJZU=5F+FVp?1L4`Fs&zncR?U$( z04P(Xi!FS6Q1Uw7myTW7XhdlP+vB~NJP_%CpWn(b5DX5+_h>#V^#8##%&4<<+@gyr z?c9@5AxU?ngaoL(GRQ7OX{*#iR@AXmr&P$mdOTEQii0i|YRVB@j$0s0EpQ;~H{YKs zVg_nQK6YdF2_KGM3=Y~{PKQ9_U+l6Hda$wU@0~MH;TV1~8&UiMp>x_&O&@bgSDOcU zOF-~>BDB_XWS^Tq7bv4rpMMpZ2)gs^`%3YW7IvZV_-Awq9v6ouQ?j3YLM%VL@2#n| ztG@Wlnu1>a1dm+x$j5%3Pj3oY=*L+F>8Gx2a0jo?)!EN4;!;T zJfA31w&GUoKwAp@-Y8gYKV*x;nbN2$PD7lodG&IzU-E8aDaSJKlx+DdW^DiJu@}JM zVvLCM!a@(cx1{-fuw^#clEuP7f*6dD7mq>wt@=5Z?FQd-tTXV-9c*YV%(6WRrBrkW zQ{M{=iu0DK5#cm+3}hD=Nu2l_0tTK>Vxcb;M~wq(>`5$7t=27|Ao#@O#ir$)68{)D!be( z=ap=ksN#P&uW5hx9Nj@cp{s-%z$_o0(gmjqB+hZy#}=vYtP*`tRc}iNG!RsrOs~%< zd)ALC*$oQ|i_3>$H#!oZ!}2`TK@x9_h$22DBmgS2lr6fX76cNK0PDg@4X|@#o|noQ zA~rn4M+0|vQvLXEiP;*Z!LVjdE0selCDwv!Mug7ZU)oYJ4aFhvb^n65O;kFyyLZAD zFgZWA+ky!>@f1m@l+GzWIy%b`+imd+hq0-^hXGytf4TsWOXF_L~b&`O4_~j>o zPY*YL87lA6j)6xT{QSj+0}4)0ks%IVKvz<_&u4mKiAD8QCEHWPKu31;nzEHwZ{R6_ z6^^3dcaK|X-s zY^)o!PVUE2{2k=BOx-{)5x6jTaJgMW6w%;+E>xjCTWB!Cc$g|lmRzKzH8lj8Bc9G} zO0ILPKpu(t0eU(w4%1Sn^%GQk?ejI$`{#$?3(n^j4HRIK+I zu4sHU?8j6U^mWDe`6rL0YIz1TYFbLFNh~dolGJ44@b|1gwEQv}ly?!h|M5fK*fWXX zno+Jho2`~bv&Gso{;o2$LyOvWk!&525TXBCpcaK$TQf)j&_11|nS9FiE|##=EC9%- zKk6ebtrT7M$Np7(5-yR0YYnzRxVX^|Rv&W>DQ;kN8w9o9U5A96lX@QA%JH=*lMuVCjfeq+&C+@AnuF{+1whB2Xww2-_m;K0aZcFNpE-cW5^FvU zg?1C|93Z8QYOf&1-}m~rb)!Q?zo#XLb%`X%yZBtdwY0xLyqD+NsM^tk8cY3Gq$0BR zgauO+b1jCRNyH$%e)tRdw}eG zrpZ^Vb^hRPW(Armd@?8DiR__1#HdAhOGvumOSQFMabq-OLqf6`$C0 z;#2_}A(a~Ra-}Gc)aTA_rm1Y4F?W!wp-*`#L?F>bp|GT`RqNFG zBhGmIxH9qQe|an#M}OCZe!DUGy9?idWt$tT-B?B<2#xrzYc}4VVwX%dXuiAiWoR8LLccglJkr-?n7vA|y6DnO_;9pt5gRZ- zN9d9=@sH(*CRF8)6=-dLwrhA;`NyoRnC7|Z;~m+F9zBh~8TOvF#hSsLyTM08OEdI& z&}NYorn9kLyYFI;;+1&B&Ykcii;|EzV8^ZuA*1F^o>IKh&-xpwm&RXKqH`T@zoy-# zBLR64&hPt<2vp{c5SDn~o5&sf^(skK_&f~!}>kocGf*(?KSYAKL zC_wj`VoPcEEn2u#tq&*yPFktSV50CDoTiUrmEnf_$29#}9rgO=u&6eur+K!al_eVB zS)9x!kgk3*4aUh>#Ebn8Pm;{-8B3(j^$>SsefWzE+mWb@!AFvlK^AdKJqG#%+I-<` zT(a^Pl%eTPm-5b22vU!pGq>mK3wmM8VY`%ygr=Nj3i|poX&w{E`F)Z zz^}N)F>YtsPv2v-N4e>7$z`t)j>DY+==~$=;^^kPnTOVPRK3dezDBX7l8BO!4*o&p zNE&Xmgq^y>HD4}J+tuk=BLRkAP-JbtDf-q+fXeT=6EbDKPvOzDCOfuKe7VUDY`~G$e{_Bp036s{ zY#kTc`85?VVLBWeQMS7{s&XBMpAL1zqUz9K@>|Oo9+?y7bNe)|cs`EpmZ47$-v3Pt z6gLSZfU3}UP7jrSZlzQqVJ`3IPBd5qxp?FhQv3F?#r{IC@=3RwY!CV{_IpyQ3nc8} zxG;4Mm^!#F2&~I^57G=Ws3EvOd*Ce!KHW(6tS|l$SQ4kSfCv!4Y-1#HMfdsk1XW z!#`b3$6mf2noNaUdN`4#v7>{Jr9|@-+tjW#$GXs+n8toV19>O_h;4IBuA;@XiNCV4 zGK(rRd==YW^0lA)4|}>m@|-)QNQGf-LPI(`6TP341lQRsK~-mLHcG;B^J7qGx;U^P zkA4xB(a09579X{33=7bVdk><}MQu%Gv{-WRprY0`^|hE1;09$rva=yB-um-%(RM!< z1K(N`4OhSYlTk50KUHA^t-Ee0^SQsEm@PXtNS9c+PAX01=FtLxVEHxZbuZ746Am`M`H{>_nPgD zhOzan>dQKWb>AP6t_Os>_{3;j(Wq#Ue>zQjF%{gAM2#1Z()kc#cwuoK$U>kVaD4va zQE+Wl;;iB4{bF%^IQ)zAOQ>NDkX}vQUJkN?stsEYpQ>bYjj0{jqS@AdXSe+M)knwb z_TvnMo%aP&_g0k&tX^{4`71O2`HO1nD?nu6os1-`MdEB5wg^Ofi7nK+y5CEG(T2u+ z?(I{6ZmwhqU((gEukq~%U{>9-*d_R!J{%b!jcZ?yqTsH0B~EnjkQMBRf6!wXA$+`H zbNF#)GGo}IoQo?d3}jGJN}lN@e1i^k6qx(el$yKHnYL8aFABSF%dthBHC{!;E%7w3 zP{Q%GY!gcU97jLCo3)4Yl#<2owxO{@#DDNzY?3IFp*bkv;tVT^wL(cyi)NpwO zxQSi^U5hlL>zwtz&R8w~@|f>~b4|>phA5~g#iKVV;Zf1CFZsUBTkzx2!wYt&l~uBV zc-~O}@vKf?LC_QdHtUCFTOO3ZeQHuc!+vnRke0#=Y>q|4#Fq)s1;Zl&-TV4)316!% zf$DsCG$p^l>*Fv7F>-#Vkodd z18VT%{uf?SUfWrn%=MrJKn9jNTSgcw_@S3zxG+C>VzLP5rGS~XSyY>>Cu$GNuob|v zi;DRJ;!}y&4hyx;&m(qZGQ6)O`iQ%1_hIZ&#@~VDH0~U3@-lQ|#0hH^5sb${9KEST zS+@?K%$^!(xUjU$b%5P4!@{jbzAURILEq*|rWdzl6 z)0BGn_9?aL3Kmr)L|pC>pj&$jkoazHg0fb-fZd6{4{j6}pSH{T;CTDRrvDn-WSMQ; zhU|;_gazZhpF5IqbDJn`h~z^x);1Ndb#1=?M?Qt-GMNwN8U|FO#H{#2&M5`BEO=sv z+1Xg8n_a4M&xe=Gd%lmLmX+>jDitZt)^YQ1GQrSoPP)#pR_T1MF8vTQm>5C+r_;Tn z-sgNtih0Up!~&kvl&vLkT3VxILKfrGEt%+#!r~H=+z-n#{23!2lm9=&y=7FD(YN+Z zgEUAth=53UcXvrkcS?7IfaDed0ck0bX45IsCEeZKCG{@_2e`-j=2Q zN45W8&y{|h%=)^3@6c~>kBE9)*B;VDvGjwMR?qG@cUaD^u(*gW!K@yIR+Gnt6FRp9 zO2N6Mt|Z9`kj&m3-gY@uU19;-o(-M%di*p3ES$m~&&Nmao3CPHC|O-xm{}P6nggf0 z1|wTbhgbT+WD|I}W|Fw)(Ph70UXSlFE3)skQy2YC@MB#%@y*c-NtEal!)a+9c;=QY z76NXTM;{M&ZrYmLTm8I}96m?TVoU5Yn{*&85Sf#1g!-lWIq$b-T?EEs0t?w{Dr~B6 zC&nrM?p8qa&q}l2P9s*f@&2M+>S+6;qM}6V2_FZ)o{K+D#afOwZ~xPHNT5^ab?Ylh zcnpsz7?__+4c!xiH-C15kYPHyCg_6>%7JJ2TY|7m*77?&?!v74HZj`G8Lg$znzgOc ziM>$CS6~#_(H;Y9qt(6#(^syTVfG~4-hRu+LUMGvizE1UoET~HvbZ<4dVEYHE270k zrTKq7ZS|)IDx+-RLUI!O6`b+n6XJC_-;_IL@t5+b6;C$K?TxR$m4L;n!tb}$a~FUQ z&*^DO_q*}}vu>4>sIX6AJE@J9+icVL>jysFH!iWeD5lUACG~wzE9w87H;5bEr-Z+d zPHLkiFfIoRBWIj7XjR2(-13YwjSbhCm$zNUNx9f0d(?8R+iXU;o z*txh&L1Fm!+G*IM@Yd^@L}D@&1Wuiws0raG!K>HqG{1OxH29V~KR3~wuhcr;q-HZ`P%B2t#hk&Stm*7+Swj4zbRx)3fI=x?))(N)pYfz z-Zh=_x!t`jNh<8ShsFaPmZ)wTf{dhgORu@O(nfopedxS%`x9Zzuu)q5SohR>I>_Yo z;)rfmj15kljB%B3D`=+y_p`XnsZGbe5C$L?EFvzpt|XX|q$H~(TcC*|EvUvh9!tJLSfq*KUmJt{2#iJFa%OQK?8sjRJF%tmuOC5gOm!#rO)b(Chf)6+QV>$mOWwSc`} z@|zpmj($jg{R~JBm`H-?K~XO)jrF=RYIkyoj3o2yI%LJYmKy`>+IhKc=OSqF#u7Ja z!f;6_PG*W{tm-WDNSQ~U-Px(f2LGo0+2x(Io|%F`X6Lswl6Ek{HXU-bwNa#93PvGg zi_XnsuUq%1uEA{3f8>8YtAjq{`Yu#*yqNw|^h>+2JXA}E{h58gv1`&TlJeRvCl2+WOJGE<))>WxK9t2eLI$@Og9O+NqiD#Qolx@pAeYOtYroed+p-jXp)ByE&2V~nxKn6IY{4Ug1vO;a2F8EJKv#O}z>c-Lo1 zit70n`J<9btg@<#g;hm$im)vG&g9Uy<#JD80Q}sM_+@ene3pyLMV}rN41$G17cVZ) zFV4^2SAJ!$I`dz4(D76B)^afPU%#D|bN1?858rIKm1;EPnH_y!OWR-VpJ%31zMP}+ zMo^!GoB^*&4P~^fM2m~0wQP$5Q&l(pOA}AfLFecb9Zrm;D{)dku*GFg?f-&`nAAOA z?Z%2Ap&aL-5*id<^;8oD-eJC4kp0ckwDPU?Mf4fuIz=Wzf+9QdbF1qxL^7M2 zRj=7p(e`X>Z%;l`JEPGbKW3QU|MX?6QM>;Z2~RJM58Z3wg{h^D(_B??l*N`S=%!`b zRQ(_f44VUGD0b=_S}xcA&zqb@ZTROtYY=vqnAB?_0ZFp##GlAl#sRRZ;sVW0uk820 z?HN%~4RE~uEJs7FD$~s*0z9dPhQ1^icN9AM{k`}7f*K*gQc+g&jfj*E($~D=&&tPC zU4+&KD?&?aW)gfqoccVu=dMK((6xOet;2HZ=4ZGhj8=C-%!MvV_=PqPONTYH*=OTN ze$wD{rZWm+OIsF;@pDJ);bKft!tjX7{Vk%yZ0*KoRfX(Fq!#~2lKmepy5H)ZgB5Z= zxLkbA%(^_gq9i5>reb*ARo$ReW2gM`SH78I4C@M0qe4ErXM0FDn%v?fR}xwk;R9di_IJ9IyDe)+ehfxJj<6 zYq#t#>M2Ceol!!iXvEdmd|cwleQ5F<<#wLX)hpaDRP|hx#rzku+WMa#(gLdGZpU03RPFICiVi3z*ZC z6NdU?t5WGs64S+i$*&K?gwIsi(RT)3MV8x(OpQn|!SxkE)_#K^5h~{TYwz45C^RYB z5y0SYzmLi~sMI;g!Qw;#_8WCB4kxE3Y-esIapyW10y{YPDONT8MP&E3u6?DC_HMF9(SAuHi^@kjEwSgD$C1+K?(29uAr$=UP&~DwLtSu1|=s)nqN47s8V?R+fpj6NN!-o?4D&pheVrmpk`bTV zVOYYG`}!_*BYONi^sDM`RZeBRm~NR~CYgO+E}BoGg68{=`kclW_J7jZjX!_&z22+` zPXRgI$tLB6c(T7rj5wt0?(3ky`s2%BswHR=D8GN|OZ`uXU?S-4o_g%ld4_{AnMlc0 zOwt5bePS=xBcl$V(CBc(v$4U)VXkWCtNbg1`Xz>FHd45zXJ#j6gi_AxA;g@% zP4nWyU%#fGJ(@NIE(x~;(}&8@B1Ovh-vHk&<8-K5&HIU}nAC3q*HD!T*4Z}enS&EU z5P`<;k|1L-uG$ql*Y3ZR#|OZpAL-hsDB&IJFzrg<>il;q|n{yi>B# zTUKU9)`$g2Qq9|Q%e|{#>!pMl`zOGBfhuXBXUDpb4lCeEw6|S2s@nt}P7)k$BRG4V zlJTdeX6Lp12NR{zOn0MOnEANKV1oTH{xyZOe0x&K54=PXcx%WP@Ux{BC2djKm6Qk< z38v$!lu)sPkRxD*pG zCqE2@ysxR5fD57GLjWCo*H@8LHWtOAe0)lMk+LB$Fqdx4_zH~)#)*3sG&JUd^XWak zGM717yu9W=hnocJJ$y5PmD9-No8Q?%6+lV^U6d>=#<=($vp^Ycg%~MaThDv3V=)?^T7r`tDEyeI|zTQ+0JsP@XC98(|}yOlt`UHdoJ9F7)pVzqmcsI32qDu2EvbMkvQl!&qL^D&4Uo zjyvYygJBKCoC9e1~2}>yLeRB zNGMCqvlTlqj38_KgR4ukrjI68sB7cTy-p6+j14gN*QaQo4keTZl9RpQIBB4{Z(n*v zRXk<`)+UuJ8agKasn3T$$OzHlp}@AWZ??N*@m2%QMZCJ^SLNqoW;4LVTC0 z%SX;^vxS9pWn;5p|Fo$b4D;pQBME`f~W47D@ixim1ZKSWM*ur^v2ah6J)6+_#+lFjHVJIB8`vmj3cAxFPC z*R}sF%9*v0W`Yetfb@OBXoe+AF?|2Gr8*?^JoL}hoE3VAj5bAVQ0cqVMV@4t`fCH) za`}SrW+gJr$jhz9WsxU5RK%Fb_D&LCm++@H3fi0qi2^e=q5{MC+j2PS6&cLC zk1n|bl>(o>OBDRl!+o)8ymu)OEoI@}UY4s}YVq;TJi_!BML&Kr5>^SKP=govID#O# zeD+nLArah8d|U$JcCLtSvzJk{Ev9Bf*0{t@;ig11a=$ARki`?FnDWMUYmv{t5mEYt zy44BHr-L(Lvw%J}7A%4|N!Z@u`t>q$yCg-&#tYi>E@^rTQ#XgpHDO1Y*e9OinT-!0 zo?LVf$G^C@2U9T-M0T&U(P5EBP7rL;WZ&dTp`K1L#iO8gRB(C3R+2@6=9 z+k0ay8brve`ulaw@B@;)w(eO=XL0w>@!i<(mc->qQ?HZW;GRiN&~p*J3tP%B(NZY8 zZbN2(ECyl4VUDgG`Q7OB$ueQ`23dmHZ(CtRuxVPK`r<}R(izL7m^emkga}6KVfAbI zc^p#bMwz$W0`tIuQ=^2Bjn=`}_1Eyy#`)d7OJ&_~svgEX+x7smz9V0uThI}Agr&iR*2dUkJKfCYmBprKOVz zx~&`7i>eQ7xl2+y_dHMtQ}Z*kFRJ~rRJx;dFR;IxbJ21{fEg` z@~7KYN*%PcsD{T(Xb+-=!ryh?Xz&f(Ts%YB;myA8gx)mJOat#|No?BG z{=@=x1f&>d{0!B=Ik)zn3&-FK$9TsDZcbs)Wp97?E!)P=O;XC8ET)@c_dvabB03go z)kd+2t^eoiE0&c_>zsX`y^rS~4wLPt9cDk**a>5*c9^i~GJRC?M0t_Gb;S(13fX#lUR|wI!>{t5 zoLQiZPK27Do71|hkX(z=F?hk;<(W3DQ@_WFfM4`adCMU>8g(90bM(O&-#qZnu zrB`|DA9RUybi9N@Z2l%KXT=xK0&7bn5WTvslH_iBt1ogjY~f%j=hTUb$*qsrom8#O zTm>LUf7b#cKLQQTvJu}2y$tA643Pr?n4L`F_w{w1zsH(bP(^8m zAP1SX+cyb{@H!R-dGD4!3u&2N(<`3l3K z2p2u_!P7(5Dn?+zV4Z-zf%FT3DpgaXpFR^v70Jt#)81;6!jm7VYu$U$vA-sd>`ju} z{QU*pss6n=(!xF?F6x%6kKuy`EkkX4#lj44$JB7ZY=j-De=m@! zQZ&^d#P9{`KLYCMQ{WlGMN^m$om086Y-h(peIZHU3g}c_rfUoNQE6< zk~cRL)eO5g*i_+*YO4fWFVeU1<;>9J=d>Wy^6(aG{kSdY2ZAIKlMD^+@USjl;jEnF zuw#6_CRhkXsVhr@^&FIOz8nR$4QyV+NLZ@QxY3Ifb9P7Qj4?{e@u{f<%*qOJ(eGU= zp5lRP>Ks!;=AwPWph=ZvSAJ+0jni^N6NhuxgSCFfzPyx~*5T(}X~j(q+s7qFNTRWU zo1eP>`abk7EG*#4>+MU;Qf9d;{#k1~UNPs!-!LbL@9AlVcQA(T4QG zltb#}m)AwsC$slF(NfwBo8WgeU5V}_;o_%>TA1iJ6Lea-6UY+V-E%lN_9t>pSY6+* zav5|Y!vtgFn*|LZ8+O35wb6eo{U-2E5G6F7)V@@C9Z%_>N?$)%cjT){mxPMwztLmP z2~K6nG1ja3$vk*N!$atoH@N6w35c(4XYYAe*S3-x&7j)(CC!>4-`)ud%?901$3gE5 z$QiUCY9H=Ed3<*Rk{j~Q{`}x%S+v-*vYnTS=I?cw&FS5`?fkWSN+fZO}y`00`O=_z|&^ny;V%b<*&LPA?z`UM*|=EnWB2b%pHf8%^Ary2njImD}N=l+@ zrU_FSos%uLHoLp&f8c#8k56G!96?7Ak02b~{Au*O9NDhJh_{qk)}x%9%KB|UziL18 zMzjZps7hBC0AeJN7zSJ{2q^*Y>`Dxod4A#`3-Ad@PD-t@Yn7mOcKUg=Z^N!QsRc{M zFge@sTDIM1Gb)p?1thxflkqJZKW1%#+Gp98n+OSpe`IKo*lFKsaOU=4p!xFD^5?Wn zu*<2FqtJr*%+W`y;=s+HHQDcSdW4KI1*xwawx9vBl;0RScQ1&MPkgMo#==N&P3Su)Esg>X9)p6ec{dv}cTjr!eQpj;C>{=<=Nl~lzQCKh)PMD* zBPY?4_-#CKeB7h0E;s-RP2Jjje|$RyGvl;KgNJggrJr@^2X_&X2sBWJRf9#t;Ly-t zu4e($Z7@x6v7zS*H6lTzD8}(L?jLfbqu7(*w{L2t@18_z{GSGerE-~fPs50D;+t1#vtNl+6TLbxH!ZHb`70_6jT!vaz>^? zt^SE9&pR0yWCW>DGY>z-eCd-L>zv|I9Oo4n3TK%&se)<@XVE1aqDMVKz-TAtjH5yh z{_+~w@SzI2o+cI9w_#I=a^WK)Zu#(a5EYQQ2H)I$#dp_>@mc5n(UFJP3IavTp_HYc51IyI%1~`kv@ML4RI?O zB_xHi^#xMLOknl%J>hq{TPt-uJV99TObxS{?=MK;;=o{n|9YL<{qnu0{*&N>%GGxK zWQ2HE*jm^dnxDgja@+Fi5)6s>pBF_}!fQieM56MY@!w3z_$|=`nB9T3B<{V0sQ>dC z7~FsXL`~z*7+K|Gd6f512b`P1%t@RYtm>J{LS*Ji{_AStf*@N3|8>+clnc zDpxVEGAI$)KeGnKbS((H3_LMtKfOGMH8QY=PTdlkyWvy(6SMC{$^4dgXWihcJh&$EYvU?pcE{`;|)6~?=Bw(%zO@g(Ts$@vNJ zHO|5(EjdEU6n>Xs>U~l4?P{8(5`$t0(y`h=y>^F&>K%y>#|`lYoDZF;2WyI%WMnOX9fM~eskk6(SE$03EcCFpy!o7N|HEV zC(msskM7yNoVcBQGXk$#ZsBr;mP(;y8rlMj@84M?sZijk8kGdN{&>|lNjPo6eNBz8 z8Z#}?`unnU3$0tTYON61M`B=pfL_Gj#hC15lNT0lM6+wMExeP=AM-j6*ttCG!mUE_ zP7%_^I&b;laWkX`J-)3+&K|oLz1>xPewtZPg8tp~GKPi0Zf2ksV!W1Z6AC&wt}FBv z#2Bn$c{7lt`h38}n7J+O%*epNfR=}R1!{+N*~Ggik7u93r?nOCZ(oq(Gb^hAnPGN= zF+4(6P@wstPrNdw)Ii^ABsw1%(LbxSc_&`jIW7*pf2$fC^kd^OGes|2OH1zy9V?Vo zH_K>0DJ5yz z2~0bR=M%B1l|U8|Ct}TeZjQ8CXo(1?pT}CaW=G9tm2ct>VoZ0SC#zSE#tW%+PG5ec zFjEd)Ryld~EDJ;;@E9zze!i!C{_wQ0_k5A*_-?fmEm~me?8MSlpvw!ptDm(pkyQ}7I*pixBp;Cl~83!Dk z>WlJQHc2>YmE{cUY~*o6Rq^gV<25{nN^YtN_==M}BN}7aIl!XUs+Z4Y39CCzVp$;^qne3Idg-1=Z3iur_U> z^C^XY|E4Q|t{PoKkQV@JL714WYxhOp%DTO+qYOyvz}(!sGVSDK!>emx&4+n*eyuz> z)c8)DDM=n=1yx@iP~g$AuJMfX)l2{2^ zS-u6(<{z5aBxpa^l0em9j6;XBGhwf&FcYk+$TJO>M!r30S4=3Y#Jc!3<(X}~9dsrN z`sb}F%v~~ZKx;-FGu&zB!o*Y5Tr*tvd9#ca`^6piyLxbiw~zeNPp0T-3vuN)m&>oO zr+e@l?e!dFbLBof4oELA##W8*q}D|v#KyW*xiinUX%HVhg&HTVpIckIpqou?+*6~IAS*TP)VQA=qtcl0@)=`%9I$DjI1LAw{vW1_m8^@Rll z29&_({YgA+u5=fDdvf!3_cS;u#sKKmFfdHp79xXg=Snfb2x}JQy7&|?Ds(>h3B)l^ zju3({JeRijHg&{dp_SD|4>+jmz`)2U$tT3dzk-l!DF735C?ppa9VrPMSD0wh#i$r8 zs>ewqHu7JcM&L;O+j&dEt=uFYjvmr}2La9@N`(#!S09sNG7RZJafF=@CgJIf&tF4d z+gpk&S}7|nouSzU-YI9$s{rvlXh@YRr&I%@K zHm>>vnIkaN#Z~3oMvvs*`7gX{mPG<7D3%$aK@PkE{TYQlvZGloLB}WNIJhK@Oac6Hos+iQWy3diKL&8-fDDW) z|J@_QO9I<)DCqI=Ihg8J_w^MPx>2Jq{CGLUiUk+-hx1Bp3d1KyHDn^htu2$IkIV(# zsYONf9{NWhM5)Fl;2ZIEn^bzXwHbG0OZv9mhJUG{Z{NDG;;eQ<^K5ge-=FRreFhZ8 zq0faF0F4g04mGdb>y{Xr5JFbx;}!rNm}v-pyc8auyDsE zQnGTj+rHCW8L)8u|7MA7piPS{alP^W{n;5FIT}FvIq!-po(1Lfr52Z|v3|>g5#De( zBV$z^1>d^T=H4~Q>`?3mp9A~;L5@=A)Un-IWdq}8kD7+&{5XkRJFb1e-+*R(KM$`& zzRjbG)~Ttn`ElJydhB5<10aEAzF$I-($G7TypxjY%@p>~dXoxpmywb8H;)ijSQy=Q zpUCbev9CmwnPilME7heST#C5pX-dXPF`=TPCV!IdNq)J!Sesy+W4ljF=eFg$^6Ri3ZPXqqU`Tp#QZ4M`c>ax$u!z( z@LnA#!Em{MP8pta5@DUN#>tul4B|dHN-8qfi7>{snOUHxL4Pnbe}`*lxqm*gY-BE`LN6pXmqKVI#1bf4^RLJfw^ zvlnmX-p-KmU#0=h=Y!nuu?mq18!m_VBo}`&{F>W`{(OM-hy=oB)E(`e9H=wm^|35+ z(qmruxWR@{ADq`yfd8q*D6cYnd44ARv_u`J(MbEo zOluSM5O^ z*Kg)_%Gc7IdIJf|mLLNB%u=+xZM_r0!YkGLsSf?}!-{`Vg4MYFW0M^j!OjtBjs}C_ zqL5V)eSrTXfVY%VSIYW_(=l$qu1tXhY~PyZ24`0Zc@6i3YWB7@e%PKxrhMG{Jtk=- zes1NN)o;cxz#nwcEeayR)ASM`YIqgP)fpy3$^8b)jrWd@O{!-z>W|dlzAIzC`6)jn z^N!`VMUIw%Q3wlpwZZ3b@m@t$hZJ|LlIzXYL&-^D5#0lP7!XnRcRb%F57Z8U)#bLi zN-vPf^41zUhx6hepi|hDeyxAMoEJK$NmC%vnUM*GQ9f9M3%u`fCu}#YWBkBM z5IJMZ4Ibx%@iPE6Vaei`Dd7B9Dx<|izq|^UmSX*+DiE~4ySO-19gD9t{fMX$VF-#X zzFX_WCm_9S7d&YVrP6SYDDP5 zge@~CpHQ1guaT2iFZAsWFh8%UdE0UVABy>W|B^20YC2@a|E}M7rUaw|3tsAKMwlcA_JDVUl3>IPySUx7XnMRv z5QoV989kCAFo%WN-SNEGwxUAWKRN0FJhSi5$?C7nF%n-A850R459xdC_M$vh?({g{7@!X`>nN;+6Sj^0XXY z<7AoNZd)Q3zMXnY%w0)9)QTtULc_YkAMW8(1D)z6-rSs_!HKs@G3n!F%N22cac$If zUm3l`jZY0r7ER5*6q#StE&4LJ_6~ZiA}iZ4=@6d}Z4wKn+BFJ@%V^e_9)N10 zmKC8<*sQ;hf|`cl0c&+ZJ~gEvZcgsK<1I-V2r*M(Mr4sLEh;)@X$hmVU9tS&0PJCY zTb;gh;@aV*1-Ny(OrcaZ!GI(|u(#nNiPk;b-88e70Jz#xSLu&Dt%`|~sUIN6Ppp(P zrX)fh z*xR=flA~plN>Sm4g-R~$L`dmRYQ&VWvhle)In`CvlZNK(^}8I0tu@DeV~WzH-QTwf zp^~FZR*FxcG4l^49QbZ_4nIsrNe+M?Ut&N+>7MqBag_WHS;r=>`6@<>iYNsA`;<}~ z=yU@pQByigwNmvObgWk^;3?Hdy1i}n7$#v-!6#4-j&}uy<;b0Ym+~e9c6lo@-FwuP zwYSv@1(SQVou)WPN5c<|de{hp3kFgWxtZs%FgbNi5=B$Hwdo>GSdlfA`qN8|z?tt- z;C+xW)`FAId5Lf#d^##v z{WRu;3n^c@3H-B0GbBAzhm=$qlTnc_+G_88n~RF*0Ix-|8wQ;;!4H#swSTNlJ^#*c zr|#&xqfG_$Nxj0?pH70 zmSO!he8ne}oA;9lLEK^?KF9=29pwHv`Pxif)w*uWTR+JS-3?HnZt^EkWiaMtg5(o3Nr z)TVkYN{(i)R)50Sr5WhzaA=-~Wo6}ZateZ8`@16`O^i=4t7?edDuumgD<9gu%28(* zL-|d@)yYEw{VYXCD(dTd@3hi7dKog&i$z+R(PQ%C9ph0LAd6@KW49_MPB%uVRYb{Z z5e{aZ438)QEDg}kp+|l|4dUVCUOQe(PW-B1%|VS~R>k)afeBj;Ht-7EQx{baIDBqe z5^FII^HN3iW@J3i-|5?xU8$G2mu%*yfPHDfB(s0B^(tAd#2p<8)RJCf zeM;~?#6vwa)GOtKh?xjw#VO>Anz=dfcyh*Kh4~7bkvf_$iaPi&Q~b{k93ED&=eE<~ zP3TyyT!TH{{Ov8{=@j6Y92x25vW7T8|DQCVXp9)7Ef6dfm~lI(1v2vQo)PP|Oy22c zymCWEq_AAhuZ794abjXApwiK4ZlVG`BGb%I(($ea6*x-#S80H zE9Q#6eR2<0VytSlUrN88|6}J@sZ9e_kfsr??Vr{!IE%E>{-R)BtfjE=t5AyR>CEvr z-%f${8x$Zji?Ln9X_U;~8uNJwWJ=_>-Vd(OP_pYT#+qJthDeYH<+y@PWm(D7XS8U! zH+OstwD92GjVhjm`2w}#!fr@Zw|J+i6`~I{sQJS#NX}l2{E&DQ9VJN`KBjAwo+W1*kA_k%r7Zgf0>t9h< zP{qRGtKNAnoE>zoGofsJ5ySsXO6n1UO@K2svk-y4vPRXjdYY41IdV;a6edlD3t5Xw zN-CX8kERHh%*3Gf)DwPx6cvULiX9BAj2xtTFqC_zira4y*B@nS=72CqgAI%N5;^mlB` zZ+}DySwASgNyWOn`Y7FV`xnt&Xm-PHz@Hg9{TI)bcuGpK-vU|Cl|$72&oAc7DkB@d zEe09^C+|wEWs>x7K$-VFJ9LSVINm+1-Wi7P<7{aJP8FkLHkTNPf-gU7LZmtEwWI82 zjU&bKIX`~Q!rwwtnAzgkYh4q!s42kt6(;-!ZQjRQ zwB1w`E~z_Z&=MP=-;(25%=?itq|;21l8=qxHIg$1cbcFikKMfYa#U*l$)`mRuoAK| zGC$sU2BMrCNqwy-h~gRFMW@w?keY(gS91xOfF6uS=Ej9MT z8nMU-6x|yt`1uaB!N{ zIt(>pMlT0|$YJCAeqHHTl0nhmGsOW(|RF)Au{IaM?# zFCB|Z8rns60Nw?{l!9tHRBYT_uyd%P8Jw0kig81V`P!eLxD&j@wY!|g*%{P#(*To!`&q_E1e2A z8iB^e%pbu>+M=el^+c8$WFRDQ@k}ylCE?QVYQL)4U$lZ^E3ksMaQ;C|0G%{DAl*Ij z@NkoTfaU3Z^Ben>U731Emd2ze!m9R9H#P`=ao3MX?giEfO!~b7yG+C`YK~rmZ!hfGA)HDM5NYy zo|v?o0w^~06DO;>vzNsX4Nvcju+H#s8P{*evbMM=2n6@CwI=AY0e@Q?>TYf2kVC|NgNwe%_{RL_#5eyte&nJHA&-lIo++yD~yw z_q18_!^_4R`6{Bcq=T}8UDt%rg-hTL^0jYwA(@=c}{Ha8E=d^Ll? zmcsZi$fm&R*BU?GK;CQljs!XEC)er@y7=zpq>0GP8Zy|q*(S>}5) zLV9?CJYj)SeEHt zjoee3!^G+`0jF86xV&2Nt+LNQzqNo4x@3v5sWIH^OaE07C&Gm>mxE*8Grosav6J6l zefZA$)PfuiJ!2-yUDGaq?U@q~x&aUok@|zD)!*~GBr22w)=>|4*Xe^R8rYS~C^}G4 z0{S|XM0qLmQ=k(s3=DVu;OB`Nufu>0DVn!<=YN}%TN;U@b=~hCN+y4POD>%*o%-?l zAOg4Q|7I`VsXDh~WOxRjK5@MRiA0SXD@fwu!@8F5Pj8mU%Ro1gsy3lxS)4na{Y=&) zADMR1#ByncIA%wK%aI1a=5B%>Wg{d4n;(#>Nrz)=hrZ3HD_AUyXZ|=J`X2!SVpt{h+E-CkzP$2mt$GH@@ay?o4JPD_hSMUK7G`dN- zP{MRvY_h)xE6=q86Wu=}^yw|N*CTyCT8-$}|Ghx0F z5>8d?L!cMAdN$s`t1X@$+gD(rN$@1W7o0TBH&VzRx7}9d+20M)y_Jpsulf(k^}lUw zV=|Tg@VEI!Rf6L11S2M@&C#``#j#PZ22iDo{|lQ5^BR@F*3wf?$*6~g2?hlq9*VEl zR-jTbym&aYfE*asZGw#4FqLd6H`x_2(Od0$?y6m;!>~CV2knXZ!>r)&A*UjHq4hrQ zMvE~*j)5)HwfeRN()qNUc-j|m@~A+U93PK9l8wfe-<0R>qq5v~6IeEL0E)#sCyczD zW;fCC?8oZj`N;ef>cM1_j(yC{5>GY2V(FVm|C+xt3h2So&zkw>I1U z99x-by&v`>Cu4Zk1&{wR{tXk20Qaj%nf$fWTX@PRQzy^Ai*NXx6icVFL_N5K?YBPv zw)BPrOq5Q_%4(N2rMnBC%7SNW2t77n#^NRr-r@7Qxz5lPS-pq|{W#BPO~`AWXZ|WI z(@}ZBXhD_=yFvKiMwdv=iI-uvRLKmt+o%*UM^JxAaGqayYP_2?^C+jq5u9J+`!^Kjotx2enY zHXM=C^m6_3^Nn>-O~9+mwR&6}q1#ezF?+|a`n#F+EjTSNr)lG>EsMugibTK3nHC2B)Af!Sh;@L>`V z^5pmt792=beu9%FFPLNi@JPg~K*tRboLtPWRYwOce;!t?U7wmCK5Qr)ZhbyYN{*5! z=-kmB-F;k1J1T2>)N1j{SS)r?}q_R*d_Sb z|3+Q@{duksEYJaHfdBKVKq&tI`7NxdK!T=xJR5xxUD7d#6f=Ccn-J8qcBZ=J2!wUl znN4_BTJTSxjTXKFS8hvWTJ^f^3Ju8b-x)Q>tG7ifJ!Ue1!q{BUGlS_pS@71cj#WnzKQ`%G!w zyeh{BATWT8QT8+Hwy3&(KCf5(!)@?(<7N9Fl`Qj_(;sI)e_;OudA9nA4o?uTRy85Z z%k_ckKBX2mIVVLw(I%wo+ph`MQGaL+G^UjRZXqCj1m#5 zu58MSU049q7BLf^r<|V;PCHelB*Z1m>=r*4aFM_xfbOK)yjq)_Y%~}#1^twyB>Oe2 zB4syH0-RQ>E&>=BklOve-OXIEtl^vx)qwjCU!%8bxea=DFHeFVl}pE9SQ)|P#v{49 z9wt?N_?Wa3fCwXYm=}IpthE?=`q54c5jc#AXPJo^ zjnw<##Z65kHM-N%+JUARss`Pfo`nQRE`(Qv!Low`Q6Uk4WGtyE+qsd3Jc~9|QjNnJ zieHo2-=2~F_|hHl^h@!rKOw_J^`WXp8XmymXg{WAtyj;1M#bpOPhyUfw(0ap#jDY) zUj=GWD3>Jcj{7j6!f{278C0RTOHr*8aa~ap%AQ>#Yjv1EZ1oh%{c1=I4r)FC|A1SH zvR@1^hM&|(pO=qZgFCWVl9|HMTv~5tZ^e<}+#I7Z7fe!inSQS!w2pAf6#=8XTNMD* z+$)Zk<8Oq!SS?292i9fdw2mQ50z12*gXWOqPaxII?JYnnzlQVkWX8%R99{09(Xf!g=ec)OASvXfshRId9~YVZshUWGcLZU&?5(;0&HGVdg_ zDko3Nk3l3a{)(JZH!COD!Oxb%d|xV%qr(D;3kzz>T5AWUX<-rJ7aEOSuaDDgP6$Df zPoY;Gz;ZAc%7mA4b#)^xt-En>^2+~y@VrWLS2h{GM}W~txKpM|&hGv%2MX*b-KM^& z;b4h8Anpb=^8k|~6qH<1?J^r)o7ZFDYadHR@3DhxXSRkC+cjt?V&EhA^WBI7xJ`skWdXGrT;e>ew~{fC9y&a zWC!P~P@m4MsJAF74+}6R zL@{@<-+PS16F-7g_Pk1Os(PDRd@->ROm>kh3J0P08?Pys%N&_Nu^ zju%{Yb42(^J;oGW-}A`6GkXVv=_7J(h)Y(5c#%@&JU$-M89LOzyv*WqD&rb1u;Bx{ zru0k6+~J=;=t&d>8+MJ^uWZ~0*&@X@Pd4h@LHf_j`3uSTM~Z@`W_ME1(sAwOuf|5; z`2@*S5}owdXwCS~#Au$)izIT=Kq0938>T&EUN*!jGq%8G32Id+ zNhmuSS{w3du>rvQf0`eBQMB~ri7M5O@E!!RCibA9@c+&L15Pq75ufJ;m4R}#YWexa z`PAVxALLjWBM-1Jy))L@&q%nD+??~2TbJN00V7NHPC&Utc~*qr18!_9UEJo@Px%tf zG~k!8QTODkM)9uM(f|k=KCoDYHXMN=OvGPQ^2d)P;~xb0#IRxEvd~cLfA&xN#exm~ zB!0{@Q7EiUT{6z#_W}6)^{dmPP+NO9FOQv}$^kQcBo2OVEggmL$yt=$qusP*w5oaW zNl6&pB;h=|M7Vplg(YIoE%ui(gtqzjH`2hR#!Ag*V*fh!OKM6gU5h*w8oc#1L97Uf zL))TtQINth!k|?dGEhU;cbZODkOz@IpoMD5`?M83mowp2g`*{Y%vUH>dS!caQ>GvS zx~ZRJU=!Tjyw8%Of+pQpQ9u6;h5tYt8`5y%QPa=@#IT_Z?<1B}7I)Ms`O@hYc_f$5IpfD1Y|Q>o{!vHtm}OH(uFVZ9u0{ zyZ1VWLDe3pxAdi>!~D?3Rn`{N%>`+?tMCj+o0W}Mr3s+63KZt>@qVMRH}&L7x216B z7||FcIVBYsYzH-}QhV*=C3?2WMGaw;2Q_s;*8T1w(Fa^ib+7Apq@jD;|5x>^plL}d za8eKMe`GH017Ukv9b~W3je$WIz^gA5i3~Za>6fOB;M;+P1ulV;D@z`5M8* z6eiW9Mon*%0q!r3hx&@O-<4;{2Sc9V z6kx@bris&$l&-IFb+W%ighLRpcOweYui5RevM}*!DE(PfmGQWs$dQ{(#qB)ne>9Rt zlQ-En<}*<;e7f>!e0c2YoQRu*x4Do?m(C(dGS91Be&-mEmD_M@&wirH5wt>opYTfH zML+VrbCY@lpZDXNpvY!b`PFOwy~dc(yC!vVSNIj)Rzrhbo4f6Ic@jk|ajz9G)h`qE zus;b}hAV|RJi21JbShw;xHmjfFTn25xQtQ4kITeu)}JU1ABeA9QDH0l z?!ALdqn*c8;L8FJQU;st*RS^aj*0>8kuLFwVHa+X`ed&yElU#Mxx#yMY$(O0(+FIj zjW(ZFyKa!)3`?HM&3)ybU|b}|QvD!WLVHTmmfJ|>Yc1QDe2(PMkjNqVX-OD&0|UC)+~2Yk%0t9 z3>uAPyg0b*jCMb`oJB*u2r8XdMzXnr9CI0DtlLL{$@F2pS1igE63{qNBws3KHYjXkw*Qz__JJ8Ck z+sr9X=oGcKx+*+_|KYL7&=uZsACV$ym?ehu4koPG(}QTSMmlg)KUT3nFbKli{4yI^ ztI07*nqx?gR^_rgIkLpTY`d1s$wgzQWwv~$D1LML^Q0a+Sf;+dZt3|!tVxQU!bs>S zJ&>o~%41r^+u?6!sGio|NB%WVt_>|`W%2hTgG1QN2CNuRHEKtGWAtC)c2S{mxJiGz z4ul9lJX_dUVPjz9vv{A3S*OAI|Gss;JSQ63#CfSd=Sh$-H_fxUqCc~R9YhSCM_oOh0L~WK!Ch{%6yN5ZLXT(hNmP zLszsn6*n?gRAuwilC9Y84TPIU#p&wzcS__<+I2TJ<;@(YslF^$hjto`XzO1 z11=R;EREmMM|zu&=AO+f@$hH!!Rk)rn)?F`A`XAEB9=7XYvZq!|t|zanYh*P=;lPzDY5j z0aVt3maPTjUwtQ@{>yYs9iNjuo+eLbAjD(mQBnMMPDRzh{Sn-ZV-S9g_)IWNT;8+( z0zT>tv0qT2;Zjh1wiW*L*7VzBoNQyQ?{E5Uj8rvVQr>xOiZXzHhE0lE@dEP;&S1HF z^E9w>umwrMMyK*yjz+t{B| zNWW4AA=dx&2x!t;ExlvV=Jm`WW>^x@<90kjOA$%6e+X)yGL)5qaCO}4^qvcQMnt|v z(9xL%MP_u0H+RCje}O83I!iuF#7V=_qjWtQ_F3(hj1aMgI@kI8!)WNRk>obB>AkG) zoEI5M^&7c;$7@ffhQg4vVA+v~CQS}ol=`{@&GO5$Yoj&V(*)BM8LV*8Zn20IPA-eX zo%cbm1tk}gK+@ge9H3^PjMHE?m~QMGJ9%)m_HOLTT}Wy0dJ{C0LEdpHQ%?BaxsFs{ zd^~n1zpuGDwQ%3@$Dc9&1-#$m&{F*O#yAJp{~xZiFfRYRtZ`V>3Ag@hsZ$xt4&GVL9u5+ z6alBbk*>8f`P#tzP@jq}MVt4VJ*U27Jk{}ZUaySD32zjc7^bbGK=_o$Unj>x&hPO2 ziCt`8K9QV^T$dz;g3&$eOXLqg?Ui!7JAsE4!{JtPhjBU;+$&Wv}x_DU-BrmXH zJDnWtWg`TZCYM3^y%L&J3te$$wUHD@EM3`_pLdb+G#Jyz3K-=>qpij^`huTaZ*ST% zT)xsIP+?rqQit*tK{ZScrqe19r5?~IvM{p{X0&rH;6%Q^=8P)Pl}!lgT|D&kxKmb& zSA1*6$%3n@7-!5(9koe=&rw-WR`$ur70SPmioqPKJ|#sHd!EXlSRa+?)aS~Vq2nAW zx*weJ(I$64LyD~E8;YvP+$c2XxU^zp9!VN1YjvvbH!(^CkitW3pH`)0g9Q^+GJ;+LU8t&%y zHaFHyTJ)H8iY->0=MkD5g)C~yqD@6A#w=M?MNB+#_~bIieN#)PLwV4ko0Sr^V%(p% z`6eptE(2r+%qd_*q9pPbJ3LD$?#Tmk{P9^>5Dqlg|Ln-CDoU>)UtAKoTss&j3iAn~ z%uOkbl$A;ows&TG9}S?(2)7kA-Te{_DB`~hdZWYuGR7jVnl&zxF)_Agrj?pK|1Kj> zR*N2#k0oGi;}e25@ruKsDo!13QWVhw4~3Dzz+by=9!+^2p<_{DZ);`cz^417VB#;@ z+M{jo)!9X5b)xgL78YVB&V8en!2TuWoaye$khy$>*v)|j>p!4CL=dQzkr}t2W8?61 zof8$61^D>1cwPN94F1y1Io{vw#ab}D6`dGJRu_HSq{R4G*kArvW+Sj>OSV$q75>t~ za!`KFby(tqL(1pR&!2$>ShwW|u;ySmxPuT*$!OFod z7wHV%+k+OnNt_hL+@$I8u)`MU&- zbI{!_xfRg!=~0>Nnx4U^xqZyoPX2C%^@b_bpPPpfn}44n zng@p#JM3IG_p6Z_2G5Ba7zGalR&|P8xy~KP&zh|~WHWfAfN7&cOSb@z- zGcA_`Wgd|8yFRqgsBo*nC(WZ{A(AA?*)|zk6zxQ_&GSf_nONZh+aZvY{TLh-k-;y% zBIQ(nvAU9>^eET=Uv}b0GU67r=$$hqCj+tU!2=yj$TAo5KKh`d~_oaMle$ zO-tH2C&ok^1yW@{w!o_o*Z2nCv&w#o5e z&yPtkJ6k_im7aXtWR1NtKnv*we0G!a`dJmij$8w?R7*SO4-ydDq6JIw2qXvmz4%o8 zOhI1 z&F_Ous-$5C%3kfSU(c>?!Xa!gXU~vn??eC?enDNq6&=Ku=p1CGfUW;P)|!qzZFJ{L z9-1GH`-|*H3eQG>y3~~2Z;w{VoVdL~$I&RyVe3>r(WRUhJyxewt}sJQxbQ&?oEvE-w9# z4)7;ts=9>EH^Cai?@*OzXLrjd{m=zAmS^=F7BS-eV=Acq!=5%_pOZ?w3_>LH^d zrePr=b+im&>yXnw`*~J$+%>zx<3rX0Swad4g-B}Shln0~kr`U>Qtm!WtG@{;?|9sr zfk_G3kv(=QwK{6_BD46L88kLxHkIMA_$%WeoXOc{8mjue7U}ub1s=f%4|VMgfH6SH z7bZl-jYhe7iX@5HhgXcEfh86Li}Dr%c6MLwvz2IO@m<@wp%}fgJiA7x3Z~|@;iGMr znSQMfsL^4@s=9HO6R=)fb3_!T+9aOw&()A7w=}beLb6eRqIjc?$XRaclXdTpr?wVS(&0x$X7C z=M$SGUkw!7>vRuLyP~MRG}yt6(f(;Plq$afE6pUmX6Mkvz(C@9A$MY*mr(Ynv-@I# zLeZn;@HoL&^J7&<#myA-U}=>mCe;usjlseCib!Mf0_!_^=rXxfvP?8ydc0 zb6SAnjvU)?D5}>2o#b350t`ve;2K_@r@)?el9(jNGKj-DydUhcjMP%G#K*jBQZi~E z6ZaB>%F|$da)tWTFJt>@X0|TM)gm?5qFUr5x4l#5MhqF#30+!mR21ZLE>ZWVLTF)I zS#z<$TDgF;O}*m1_8dwbf^B?)+-4yg^ud~|w&%p?`!DjI4|=B6m$|hZJJc?Oh)s%AUQcz zK{(Tie$Msp)p1K-$S-13tlRDf*RWnvN68ZMit;@d*JcOD+k6)6ROyC>dYY{Z#eO6@ zpY73a*p-;PfeA%*-ZS4bo>NTpQrfYcv^c+0Hxe zVz<0zIPV#h57*HVyXHT@j2t6oz-Npf-2s~oo;jq`b6|1NWpU(g%4DpezTVo}x~QaR zHfgY{6|CUkC~S08KEsRneFPm3;lr}@pMM>1PZIxeJ2?CrE9c2ak==UC*2h3md}k>E zs^un&74!rA&FbT@-uO;ddPJ##BMO^fYn{{V+tX)pt*9VFc~Er^#>NjMP1(;^ve4hw8SlwBDD0)EopL#am#X_;}MIRifj%=`LY z13%`q0aiC79*-xW8`ut*ei@Uy1|brCVq`O{;UW`%r>wksT#xfESDy|u?Y>`bj#hdI z5S4Io`J9}HQZ4Dr*8ybxFjIR@nBjb0SB*l~*k!YcCJ{0XRW$|WBZ#-*pzp=y4W5C8 ziC<1(S__A>Kwv6-lvn{ew7jBr=;U7N#5xR3LA!K((yD$9Cz)8JakbiXrMsgfZE-bV zQDCJ;XF{RPyENWh3({fIDoYeE5wb;U-8VCerqFJ8^9Kwn4L9g5{kk(l8Z@8*fvmB(^r0DH`I_pd8J z=5#zoM{Yr*Ap7zuOXQizvT^NRfF9&pA8q;>M|wx6I_+aN(o0(QF{jLH<+phI_93gd zSj-c{lvz_5f|2|ADKE++hv z)aXdj1D(>bcLZM!jDb`Nx8ziCdNUrI@j&~O z5lw(&t2)t(@TTyQ#CJdcym8S7w8BgR1}YQF^jf2rq@^Z9CKRrif~?0aEPCs%(Fzha zch~G##)v?`g1JMOxUy2RsfEcuxP!wW1KHDcYu5!gTj5-8a!X+YJlCH&6{IY!c zWBZz`T4?zgHRPIRh-u`L1kGkSI)Krjn{6B;AglmnKo;xGQCILw@QA zh7%~8kLids8u_WenIhP&jMkH5LZPET=B(mVa9NqPvIN0xsADw?si8@7nkGB@Y$j)I z65@s(FVo2pps;bIX4}H5k4iO7Zf!}yVM*-PwH3(F)@f7)2vS-61=;sw6JMmG(i;BO zRgvgZ!|f`fZBhh^zl*|KTV8hJ`_y~!3^f+tgMdyU-gduZktbBnx7q8Tw93eiYR9Sd zK~%N$QSPJ7ONnGaMjynVSCJ(gAg$kKwJpX3WXpv}=>XLGS}#nSdqYxClT*i&YeFnY zyzU|sa$Gk2R(ur#+*(!?t?$_v%YyC~@#e~gk_j=BfbUYDq^{qdB z+UF=Yi+-gdPEoc$S0R`5FgHn$gOft%<&Fa??G(2bq%@~^A)Qsmg6OH=FTndTm|W+` z4U}0$N$p=c^$`M1Q$`AQu-F=EHQH_j{+Vk^o#vv}G-{it6fKHr@eV9>b2%fgkV49LeK$+-yK(qI~Rc=K5y$|{%CUa zCQXr&$IjpEa+WKXvh;hT6rpU+MpMnRzk}W4kw6_79gQ43-^D#V41;$V9iiKy_X-@- zGg@v{aqe)HtXD$`I_TFCwF(jz_;UDhDTqRm*$rb1I1`{LuH(#%&hgnmpqEzx6zr87nZhD=2yi-VY%;I6(+8` zzzj2^R&r?}f*HR5LW*g3=?Tv|<18p)ZC1&qS-(S5Ysw`z#Ygn| zdbv2RLtdAA3-k3xIYmc=<6aox_(*a0P3_i|xXR(I1S}k5?r%^F*8~Pg)oPKjNv-muXExXZb!0Ig}(};qKA*o{6 z)LKaueQ9chH19 zwWeNbJ$SYq(WG1NLl8`(4)K+HHZDkWP3_#h5+u~s<$azu`ZxDEkzE}-8iZ|TkAH`5 zsBC?VE$fdynsRzQ*QB+(G1YL2yFaH`AO(3ks8&V`-J6XpnfB)BZV^`hdyzKn_|3AU zWGtPtw1xu+klW@-XgQ`MGwqXdG#Kt&>X?Zt5R+yDW_1#M)cmbBrP`(VbVS53n@x;7bRp~)=Yyrb>k&2%sAt!f#9w-i|MZgYFA>bW;r95pIbKzLS9Z9*b zOciF48Y)_uuB!pNriICPOY>wC^IrG9hsAdY;Lvm^bA zA;?sR>(yR%tl#FyNZAg!*yq=UBi?znPDIYWz zxDlN!Y)Wlyu_pH;0J1;jmw1Q>N=SGwgA)0E%gU7hSy=vqwVbR2jLygLUM!+3N8a{{ zm<>Pio0pl~I-)#@4n0$@YRTdv_c=;f|K0fZX2gQycI4N3P`@sV%gblyd<)}BS|o}} z%gQBM(x;t#XG{3UmX{42j1alVizJ*YavuLIM49^VqEVz_aFh6ZQN0#qWt%19sV$g# z{0as2dnu7lyK@syyD45xwZ!$?y`g947)WseVq1$T1OW=l$q&XG5&ZX`hOb$^XjeX1 zX31}H|EK>e)aMSUSB(FC{>|qV_*nmaJiP`0{lAasz)R%ZGoLd3vpN z1qF4_>QC&^?jSwWwv!KYOpYBSoy;0IX!JB{<>q#e5_NU|7rpC%kv( z%uV@r2+m(_qj+@{|KD{!>q313G=(!&7&xZECmz;g>^VNh8YAd%ZAkCmjLu~3?X*V` z%Uz)!k!*AmqmLtjt+qJsxV3sIE3bzUMA77V0FoWY(;3Fhr<;M!6|fb6EwaP*5h)jR za!&ojIgmnp28ewi2Td_*fMWxQ%&rqKAD_Jw zgC*i9ha;Z3afRG%nl0GCXq-^&3{tzim=i$JqyC0FKk0#QYjcB#!C1gXQw1=nj{A z@J$lin>wOJt z7@ihU5$Uzoa~}MDRA_tBmxz_tbIpW%SxMTo!B|C9X!XZ~Fc4w@Bzv%wD--I?HS$@td~*=3@IB;=bwUJ_aMMH8_?i(M+hDaw|Jis=9hU_yJjY zW(7eo#{co??`1(DzRQrWW?Ga1G+0-^5MaQacF!H`7ofe;TK`lpNS~CJst#x%SpS}p zWK~tg>!ti_CtN;elRf~A0c>YXm$|B406bMm5s&~rAn3Z+l;_{yX3oWS(u7+P5TNr; zEY8{t?-1F)&g3$+U!VUi`4y{9V0CiR>HcqLejg0@CT|(qVl&eg%8@9eAc_^&p&k+6O&9VuXM$CGCRGgub=%IJJlB$M8H=mx$DA{SHY*l&1v)l z($<~P;bV(ckC&E=0-dcyed)+N4&j$rce}c3B6}0SkbXRnP+$FnG*F0ZzPGHAF_TV= z=w%s%()Xe$KSA(x<_Dow@&2d78Z#I9@lEneE$$<`xDenm+pmp%0-h8S(84Nze6hok z_LD<#+va-M1=_){Z6nilPQnk|>ZUUej+Zp_^pA#9w-R}1-Hf^&*>Luz1N4VF{E^Oe z+_}1dFa}PP+vn?GB^o9<)7ld5x>GQ5;XJ-S#yNDZKzZ;VJiVfK+Ls-s{X~4FpxPG{ zl$(zrmKoH2vx`1nFlb1OH>Ag$mWFG@T=ZGb#L_hLhnrxY(vZ<4h{$aSR}m?u?6`p_ z4`?RpEe94y1X|j(p74S^g-|6L(CnJXE1g6{Lhs$K1^r4vL*+1Z)$60v}k zr=&^>3p%p@j2VW`-+}dSZ1&V{`$3u@5icRSxcw1wmpz4pHBM-2ZUYLqmzNU)6O8Cx z6RhlO7tjCo0{AaekDyD6LBQxnK!^dl_FNh7&7bKU(w!4#>EkB2`{RFW@@m%#5ImI#-EZWfS1 z5i#j|ulu48>(7`hg{691I+7M$CB7K^^?^)>{}q>dLmDm~tpAseL<^2zvAr8Rrlz3A zm7+EjsJrD@ZG%&&LG!x9ZUNlFJj~?=|5M^XqWHnS)+* z`UYOv6CAuvGX0qFWlMuLmuhGe zPgG=_7`8ePMU<(xdje@DYj>05`=AjjY}byRTq)VPOWBQ@R$iAGD-fG_eKaj=Ox}8L zx`EYDgym(34mP%J+BpT^$$do37Q^Xswa2Ut`Hxnc=MmiGljan{onsy-PpR$%zIwIGaddNflkMIkZe!l_8`b>Me9i>@b2R zueOO)JJrmCR1TaB?{YNWJfd|RW1~cNw zKa}6GBU^_Me>6Z{8%VZjA~)paV=AU##H?#jR#iS)x;CA2c6)q>%CI)jSbG(c41Dsu5h>cd%QhBYX^U$ub3rXlxaw(OR3x{X>BrW6wq=_gbU?uR*$Dmc2~ zeTlxUr2n@hdBw93SfRWjfMRT>2c8(Pg*n000Cpq4nVHiG4fKGmRs$6hfU9HrY%D(? zrr&RiMb8|2)OG+C0>{oi&BnnFEemVPnBv6UJ<|09QJ~re$S!79QZT&uNc~-t8V_Vz z^tz-8tn4xR$u;3T!AleDg|hmBtA)Qn9Zczh3GsJ9PA$=*fp>|s_28ytjWDvdmNa#` zqH?jntgNpWm7fNrSJzOp(ob`sZgMxE%o-&LjGE5N@|HVRJk)6&rPP8xPo=0K6%)cG8+fhqk|3 zKY@$OP3)*iBo5KsH&6QUMW}Mk?lA%~2Sgdxs!%dJ#NkvIA*C1qSLb{uSu zP7+;#zbj#B(_R6-3qAN&o<;B4h=YwME!~aDYlszE@aE{RHj93BJ705#3m3CTU&*kF z#K#{k#=WV*G}}hToGl)7y4U(TE@F>?Q};t1n)mf3kmpf6^VI9O&GDe`qV($bm;o}t z)Uw=hIKK7$a+6XT4x3$q26NYB?S>Ki4G{krQ$~L91Wrq-!tfptCSYPwP-=yQgt0NB zQf*&!!yTlnwNs{i+qn0h9jL>y_$vao8zl+1L%`3v zU-Eyu>z8yDR5ZT0M7q^es$w_~||Fk9P9& zhX?J)xj_SCFqiEA#eMXk``%d>E*pgiDW(9{L`A@+9wk+( z`8J)`*uzrtvdHiuwmq_+GBc%AiAIJ$s5k%p#U2*$GynJbZ-&oMi2r?_rTYyE`@hfsf5No;nlUJ-aa#7d z?_&m2W{4khNuDAk@_u1BQu@Gotrz|MpNniifX0Lc@c^IuMdG0*t#y4TcW?7Qwnh zyD;7X^gOedZYH|LV*ldI!lB7(RV@|f}4kSxs ze&@k|OZp)}bnImG{l6DN@!sm8(SetW8B!UcQ87U562b-zu<7x8EA8bx+9a5G_hM%$ z-TE%F25Bf|^G@v&%E&sm1^UFQf;2RYsW)daJZ7CeX0Q7}muv7?FY<%J{+1!cq#@w- zM;;lKbM^Q##$Ix%AOYfY5G$dE$)wr(N4HSqdz!{$S)_*ACgv>s%S2%%MoF7#s|i2+ zZRo$N{8kkNtISPe-Mzy*?>kfJaj~F6i}OmH#D7L- z9nSyXLjK)R`&6lGd>o>AB@@6KHkjWreKR_y^YuSqdHoc8Hh{WO)qAX#yTTaR4%?(r ztdLF^)!3=)Z`uFz`On<`t@Uru{_8m5s*fcNi#~PhJ1T#aGtu#FY;9rxeYo{la0~pJ z+R+nO-?@(Oi0i`2d^)UC)%9@TI;ddx4*HJxIqGHR?mDjeRF!#Dpk3@9(fzlP5-G@$ z7wQ#qm+LX~<>fzF4%z4?de}rlLc(dV#a8p{HL(3_|CATs6Y%baRCW&hc5`!#tewG7-Lgo>UfDJt)MF=RMd@55)y`y9qzo$@jr(+kCS z!{{+Ej;PEVOH}@#Y>yiC-R(<4x|_{fhIOZ)Aquqm{m>tfFdXFJIy+*{QBlCj%`Im= zmlVg)*wn(GcHg-{k}bc5p!x12ag5iw$H$9Fx2Tq z3lWtuks76^w>CzWn52HvQ=E=lN&<`#Pi5F74R7xY)kbcVFx3V)jP}0;L>C zUj!a0o8(MYEKf*YeBPw&NSa)C(8ea_Q>vDR49%Xy<jP(hWK9CMWOxyST*HR=14^ zlWadDROp4r!|`w|hUwL}s;XE7X*HF9Pg*MC&=_>uaGcWFVi;0+LIEjc{Pb?O< zUmmX3eA@Zn-JHs_IPCv==Cdg;=UXF?-gN=RIRA|q8bkhCW3~5^$_LRDsU5HfTs$@@ zQV+r{HCPice!kVa&dRd?8j7`l74Y4QL?=1Bp`F= zT)o3PjqdNyT3`kWVq*GwhU9tsEjoif`h()0QvCn%_I_gf8Gu+_V@2hCnyU-zI$ zO(n$Y86GZ0NUYcV9QOL>f-OIB_rTmNX+?W!DyWFA*Ix;3FlZRuqp7&kM&a#hoo%;Sg-zu6CkHUxG6DFj3kTcp{ zJ)BnD?QQx(N5S3SEM2d8UDlP9Ak^(VoR$rajNtRov(nSI2Ya^ZJuml4>L4Ly$f?O) zJ>ACVC?K$a+-Ppjx3`GdVeV(G#i|9F5QC zesHyQRtP>o>=Dc3=6zUL*m?|HMeD_4*!J-2H{u{|W?bOG={ohc?`_~%N(&${wP(xLh^^4!m%h);5JZNtavuj@>*_YA z*Lw#yFP!NsE3=75LllaY*x2fDaMT0dAuDja1QGH06lZ0{0B?NB9D}Y*8X6Z@N0wZX zoSVDHnY)&N@0vivDLfKI?sjZ0h@YN`5 zr~?IQsF?5U&&8I#1{;DR1Wj7~5go{MJ6_l>qKRS`D#&Wqh+pUieP5?^nhkL9#Ios< zR#n8fH#(roQ^i=q!NvtXx}m5)5LE9GlqE22CB+RaWs*9siSz}=9VTHM3|QE3r*MEj zBWW2Ecp5`;J_9X6BbK3A*dwyMOY+0K+RCl!6)=(5`1ts8m;va{u9*hc|!v5(# zS^%`u4K%3Q`qe3{ua91YvIpeB{r!dy@S^e)1jVa=I0Q-?d-6#aUf&s%~98ZWB%UF)B4dp zP9m>a)1HB!pM=gTN1>>&ygXIFH>0l3Sy3_0<=0xb(Y3u()&&eVMP8&X!YBR^Hy(hVZ$zS6Acqpa1>--R}(nkztFxydt~xeOXS90tM(? zBZTsii(HgGsYt1KxTxsn2Dxs_a-GxX?00qw%fPOceN#Fdy3o~%@W1e)*`Hn*>MAjD zM}_w3Jws}uexQP&s_SY^b+wbTeY;)xrbJY)!Q~wF<$<yyrLy`FHb}JD42h1+LG$VLlh0uVF84}= z(ZT2;zj~m%xz`fv>q(>M_7(e!1aJ_=6coZF@=`nW&L{IK@aH>r#XRm`o^Q);RNE;B z72-ZPX`5MFPt8)qfBBi3lQm`j+V37Om^hUhF&;k8gd;%$h`=lIGWz~(peHAe8Mj`{3L$4NwL&c8Z3n@^nbAI z6Nk;}{nqBKwDjB2(NEfIz4onBKZ1gSMvl@s63eD__Wm3h85#9#RI(-gjK9SCgG|6x zzkQp@!uq6g7~Ac)?gM~~>e_Zos|BZvrs=uw8KgV7Sv zJJF5anbD1I-;?})YrV(b>s#OYj=hgP|Gcj}&wW4bF4uLQ=XG7&Jmt>tN5xr7Ri*g@ zt;^!uCKeWYnf7jSaBmUYc~7#uk?MD*K*O$gvvU1I!1h?C+8t`02G zR_XlWZW#gp#ZzLwMtVBcST16#J+j5wx%|l3vBcO7xy8FN-m=uLvGo2d3DnUV)DyZL zmLu)&HYXK(-E6{fyE~KwhU4w3Y&iszwHIa_KG0syQvGruDLc@6G z0V(Qd^|e7DU&p-F(mCP9eywX3K1aH~vC-AlWs;dC>;@S|Q~z+P%g(O_+6lybKYvbVA_fT6;osRGWAvIrYa*7tH060N2O6N@DBGZB5|;o)2h z7ce;=7lLSl)>dhKjxfB@8@I^6s^zb5tlR!x8ajAyxzT~LoP7$|DQgpxENZy_!SKq` z5-DeWg$74rPr87>W81n0J3c->hDVGlNyLKQ`|VjW5XyE^Fe3VI0<7gLOuw4Q$k5+o zNM$3G0RPGS-nFaofq{^4Usriq*+WOS=rrOVUx(Isli_fxlpYQa7IrpHqk~>Njbay{#4>w3( z4nDVmQPu)4Eo|)vTRk!j zr$mBf(VMqLIPM!iiM{jSy<$+EaLoNB_+H)(wyxh^MByK%^xC1nZ*&QpxyjPauLdn< z(_5fp@4hfnp=-mQNncspGMVCj^;w0I{@fY1QFQ6w9LIp4Sih4T+>CWQOvG{axy%h8 z>MQ>#7e5m3w>YyU4ptDriSfJ0K$TIWJ%7=``zxE%&$Sn!mmdsLJ?vgQLbjJdygm!P8jq#- z?4x~{KD^(7Hl3Bf&3}PILGzAeiB3nL9W_o_c%i_*cyYntY%5$=WTN$eS_f3^KJbaX zIrQOIe0!@(>|MC){^|wQs?MmYG25=j*PmM6?&wNp4i5jN0uO9#Y{Jc%L~p@kSWn|q zxU1sxoFNr4yE?DELzKZ}i4nZaVJj^VD}eRmMA=fG+l-&fg7^BekpKmS*ynAXN5qY% z(_w5{b!%IBH1^Q0rLO#q(aZ0^%>$OnXpz6g@VZA=7kusbtR>M%MoJ2}tCxMyMkdA_ z%SN}u%@FEIn7+ImIdA(80zCpSiG?HhmLCz(YmjdQc=8K)IC0w-?YOTAz3+PcD3H)Z*?E z6LY+f4h=XQ52)n%$~i7}IR(}n<+P_|Hlw$Nf{Vx7lvDI7PekzXyRv`bx5ZEwLkll= zyGm}6Nx>$O9~)Y0-8S&?B5%`9q`NaLNgn8d2Rxb>)V@tUg&qo}g`__<_H@xMF<98~ zl-qvE00w0YE+6;M`Dajn@1}xGNpjp|eeF%EyueSjG*KHH60iAQPK}J=3wnz?M)weq z*$y2)Tx_Ac^WcvC`y^85MXP6}hq0fPP|F>f&=g34eqFkR@@j}qt3%)Olcb|+7h3;) zxjdSQuLAubf3Jm#-)=`^i6I<^0pQV`x84pnO+&7Ky$%3A8U>@2hj5Fi(QX-BNqWKb zTR~3@Mab6D-=p9rfsI?yqeeFN_HS3o0H&H1^cNA-U^L!3CCF)&LK7#%owmVJnR;+$ zZ{EaDaXeO2v$Wj4VIvkK0f5!*Z?EqG@Z9soeVVxa?RT&GNKqqh@-Yvpn_o{&t#{-p z6HP%k#&7t`oaEfR3s0)OdFDsP*=kfrPRIa~s?F{^2VBi8%NjyUW}BJ8w$A;I#fHZ> z{m@EY(GHywyz=hMx>LJ-pozi?Y#`Ldz`Y6bZ;f5=Zw=fPKcR|})^;0RA}uV@5_~EG zy?-F{%FnG&+uY#k&pKCS8j^hH!{7FwR^00%6nwhN*%!ow zMx?1Rn~~!gQHbObM-{8d5|Ght>|d<7E-$Wt0vx@lfRUs>C$A38TGN1&--o!~y8&=# zp?LQA3M!8Kx;j@je$y~F8U7TiNzu~9ZNWSv)@v+Gj1|dSI$~q&6sEw38}EAf?!ox> zvtI#>{YSfO@KxV=a#+c>|2gqLFmTUn&f&5-ADyCmtXvsM?uYd7G2-fTkRE({PU4)U z@~KRDGpM0o<(Bw&rPc4q z>*qXltZO8FD4k`(OBp(_stBouX5 zN!A>znS;aitFQaFW~+&V|HaG%HeAaZa7xG=g$+(pVSO!8?R*3T0)HAkPY=rcEWv?9 zLIIwALY<%{ZSo}D?GI%OjuZA%JkGfa?kbH}&IdofBgFX+uYmP+>-G1i+^QvFrX;$7 z;*D7!6%z1RqHjkx{k@U>o4hz6A3JjfpnU5yDl>u{-rO|%^Ra!f8xom=JPHYlHeL@)c4E*Y5EnV-a zyk-G6W-XG=2l#<=>S8s1t$RC)k87mOd4(h&B(jAbEb;vB_?i4iyT<%q6*#84057jQQM6ZrXtJo*QJrMntyHk5$0TJ7yK zHzKUyi`!X4O3+jdypR`TvUEf{SO2uwes`x@KBSQ7nrdebwoh3;)f2Z#K-l_L*S z$gVYgHCjl1wR@d^zDg)Z;-YBpZ=>gpfox0A=mdRwo_j|9YI;Fz2`Y9&Pk!CmH`2eW zkX99<~`X=uqo|VG6 zK|?;fw2!=BJZ8*(%&&~EhF<8b{Jm)4h4Pe^gEi05nk_z<+qB?Cu!daq7X3@kZg;bg zmR(wGH8f`x5Q{=)*5XBzT-5?UynFXD2Tkcs`lFbRHM7_cVTN$?L%5|NDql;EMlfH^ zkmI}};c$gm!h6e(J4qDn_p^zdg-cbU>DZs<^0Od%%B5E%{%E^P5Dn?EKG?oljpKJG zaLzf~xn@Gi#QK{ZAkx6k($w~wrkAHtaCHB**VXs)H6Fxw9k*hb>{;&z5!^Lutm+kR zVwgh$DzxR}{nJ^PR@?NEJqQk9g=RR0!6s#H^P! zlTxMiGMJY+E0fv7s13hq7X=Q`Cv-@`EC1sFqE+&HV4=#x*odM(boJ<6RT73cext8u z7()QGCB|*S{1+?n`CkgV`r6e$YT_maP>up~faC37KHKr;?ja49BmElXs7d?wz%->& zaD(W<;toO>*6O~&W!Cy7vVi?~tLwx&l@3?nfR@*LYH{n+Ij4ZII?+3G*1j)(GQk=cEje*U9E0ViHs!@Z)VzOHw3y zx7l5u&grL3^iFQboQ&+=ec>`AqHB`D(@yfRBSSMY2E@FN;8n-H1ifL9i4H4pY3V-14QhD<1X3P#?%TsB$2UTXj!pu~m#1pH7IX_+ zrWBV(4l#@I*UIV}5^J!c80{7ubU?7&Wg&F2E#oz}yo-CGD9~qA3f}(I(SlSZc zNrAk_c^GEoU$t*wBzBpyGBvE&19Ts>(dO&jH7cC`PGjv()WRMhd#Y`21M>s}arho| zq4I^TTO+26;&)iLDs;`f#-~&Df`#98m}%EVigGk)n@gXpD9pH>X{#HMQq5!~@w?Ru zMVE{mYZV^wP!edRR92p2=1n#61qDHc#)~{zvCAfqc1M-O2TlD_OV?TTxm%o^8JE+J zp8u;2-)>FsiTtA@Lz&x;jPiGWt223{sh_(38tX2%nifs|(JYg$EI2*!XG-%1gB$vY zu-_Pmm$Yizl#k=>?u``byXPdw4sbb#JQUuGDt{z`{QWh9zVhOVCh1b5NKW;)*FBwP z!J*M80mt_prt-pmZ_tPAP$Xs}dd~C6aN@%<1bbBL`3qQFk%`@el%wfZa@iC=67vMl zZLF>eSGnDrrFjkh!U|NN`>V&$zk22Wcx3;XVE>MWGfPWL zZwu~G6-mmdCW zpX#aU@o4(UutrSk6F0@5AKeNY?R1UD+DoTJ8)zHRq52%@ev=|1-e?i0{r+L>qYaRrZ*2r|C8JxRZ2dm)*%~YimK1WDo9F z#81L(zw1CjM+A7Nmj*h5o=4v*hFBhC%(W5HK6TpkeFooXkYb9Vt{S&<+Nu8(P@_R~ zjng5W>t;N?klP)p)19oaxGINQ+w$I6OW#V^6#v$2L$-Lcbcg9~QB;Lp%1Ba=d31^U z$QO8(t-i2vr(#OWZb#VV!Tvs_fR(r9t9PLINwoudK=SmO_)FFVlU9}RsEEq(qSLr4 zVZFoQlW1zO;XbkFtno|c7WVq5^&?`ACp|Eq)1znGpa^UwUst0(YhuR@0$S=(XqY^d zgPmil%*oD8GlvcrpVrTO$-^i*gF(q#y6#(IVVHnTdWmC+~ya<>7z$I1xt5C zRA|K1bPO4Bf2J8s-h1pVaS%Mgb-cpnx>4hVl+PNV!~OZg4}Q8&EsI&h9mTJ`{_6IK zIGj1c|KiG!If601a|C)(^_^~O(Aq*dFY3PVz?)K%#g(U{>|s&lR3w9Q3+S1O$is1$ zEt+Spzfq}r*Tmn4uYF2Nx)^|$=s`!){7zckww7?4bT6^QE(5{aA1Fn9VehM6f|SM0 zgW*`om0Fe1~11MFnXae@?*7DU_Y1^6%7uHK0$4$tZy6y(J7|; z`8bLD&qtKh*YkOF>%G#{0abbgeKmrlvkYn%2?~dWgpA`9{VxJ23B1o6>fv~ME*h){ z259yONVJM@YMDt_ZLA3syWgdfOzMwj=@2Q`v-yCn6oOFy;Lx51mH%#54 zd%VurO-?R$_zgw;ljAajr#kG*%i0O&XJ;S-H+6}dTcuWHOPjWymf9k-Dr-Vonjz^@ z4g^MOmZN*wq~(us@s8MMAG~_b<{BR1wb;=D9zD1B3y2gzZy}Q0g_g?rU=HIz@qpr5 zV46YqFVvsxC(1qwqWgtjb)ysPFy+?mUcTFQTgpR(*2XT=Z!dIMI_rmZWpHDMRv9A{#CdbsJzZ^=yok{U^= z@=_ACgdB@f&L{{+Zw&a%q^082Pn*MNWtHQ)Oy^RCgl|)eeisnqYmd;UQiSP6m#~A*&(3GEojdf#bJR@AsmSH!1~IS1u)NV<`2vxd=Tq`!zu#~PvyN(Ljw7Q( zg6PO8DV@0o7v_CXGjO&ly%Kh+yD9t|s5vuU@@{jNA<{KAzDW(q;ES`X`Nh2mMDv~Y z>*9`^a`sc@$R&E*pFv@1j&%v0rXW0pIQ$o)xg7PAp!=X!XvNxHHthQac9_@k(fiDA z1D4d2F)4AfkHB{ZpT75IzQg9k&`woB*-ss$yg|j64Dphe{2Zae-!#^9<6m?0f;Jk= z>?_MkIU18l_Y}m)gduot$1Hj*Z0LtnHy}62*U&8~ocvIo$)F0Q6GQ(Rz)pRbb%?an z$2TZnPdTgm61o2Vr^X?IehU}{ABZ_RdYYEsWT#S0ThhJ(!Zkj^{rO_@Gy-?H9&_=4dx?qh2uFh zU$UCiw)%L3bmiPeP$O4cUt{A2I$RbO8IYl21Bs}vAMfcw>YKx(HoIK~JkS6%{i19Y zm8e9hsr6A)TPup3M?6ELa|sU`@Ekvd`l;zVMGo!!-`HVMiYg**Rv`ruySsyNstb&) z3G(4D=CcMoy#$JH=B3L~KlQAZ&$0K-9G;DZbjs(bWoX>Hx5&?Nd2$jOmOe9P`-Ioi z+gnikv%2zqYF^iODPduXtkh3Dt2;~|*G`=eCL-r87}B5yP@{fSqtL_Wx~-}^`n_|Mjw(qE%{0tsWhC8h#F{HHF+mjU8)|Y3y+{Py zfA{_4ykWKm8WH>X;22T*JCDE@OA!ENMXf!y#-1@6?*>V!OxTXp%S~DrP@!1`cvn5P zrkpoY(Ziz~1%<5Y9M3Weva7c@lZN)lM76Zl&ySfD;ymmUqV5X>{KyJ=p{B3DeJ)_6 z@4m2O20uEM`y~5N$j$xP+afTOXB$LZ?9=mJ7J$_km={Z)60cU;SN(jb99Tsw9AaWx z(Qm`j%OVde)R}J6D%#6oUeZx?tf!UagwL&}n5z$K6HKXXhA3`AHVxE2Z3x8|?+kNz zu7+!09{c(bVjvAm2;+AXJ&P+<&;NL9|1{m29Q2jkNKex-hSR@15>4>_!CzR8H~$NJ ztvYsp72(l~L|@DgF{w0~0T)F=&)a(^lF|s7067H5P^oAGT~yY<<1@sTne(yKlJT8X zGSL%7s#|wKr^T!D0rpod5hWk~VV&)YOG@9S7StlT7TKbvr|!1c-|*2Sj5>@&ekt%r zv&oxUFB@L|6liV%w-@@bJIYm@DDA8nA0lL4o?lnQ>xG7#O%=^FF%grKJhK}?0vBdQ z9x#HgAS)}dXzT=V!e2O_iV)tHRqm8kv4j6vSwz6f(y0F;k3&6g=ArB(Bj4J^OsvPa z66W3$1*AqSBoXf+sd>G%l?7#)PsFtI)eug7!35rj)`LRUPK70Bspl^pL5R>^5vQ1e znwBmQ1OU6|%wef=BICIxL{d(t%LhE> zU|)!}FQ1&Kz<5&n=@^UgHw(A*@)uz#)iYF~%7(Q~u}06EQd9G6ZOxB2u3aNtUb%h$ z*`Phl54OnzNBG<4jDAT;^;*+mjNciXJ8zbT9PI8E=U;Hq2!lDu!m~VvJR|@`12f0U zJsPhB%Y6G?FgTy7w4r@^{hIO@?!9xEk<&i$ID`58N1d(4^D;VI>&jE8M=vOQ4b)j% z6IEPnZKNq*(E2||vrWbKL{X_tHHp5V`F*}!4Uss3B^z^)(mb`KJ^iXxh zG!;1}SYTs&7Fx+x&eIn~A;!SXI$~aqQkd|!(%&MY1cM^is2!Gx5VfBA1-!H%y6n8v zi7Km9<_Iu)Fk6eSQEACYz*)A{74ZirCntAh2n8o~j#hct8c(gK-sQjjK`rWgnlSsJ zKeCnIvHksR<2!7L0S|B`N<`1wl)hB$pTodpG*w%pR}q12?h!^t;_VZhtd7}R<*6Ul z-1zTowvw6|uB1AXL}pqeJAcC}I$YHOgBTjY+4h{Cm&_#f4(mq1Y0I%pePRVHZk03t zB<6@z_zOUvAEt1M78e)X7c~F*F$wng^voo(WkQgZkw-*{=v_6cUO8RJUU<|>-?z`9 z;jFqW^I4ffcZH5iV#DPpWo-fE@?@ucgs3N)uSQYSYN7`WnG(HoC><^zpXSEh#=?Rk zTs)LxTRmZJs;H__$=z$li=S_Hz&&h_9}L*rD3()3yRXFw6lra&zLQIwZksH1(ExX! znIfYMvQ(yyLa+&9j{_NI8t(1~1WYW7# zP^cguQFN~>$E2&H_x=;hY7N%PNu(;5Q%+7xtSVO+p~khaP`zF|7P4y(nAoz^O-V5R zUlZRB(c`bAwJ%zp?JmxPH?3~btI3*hibmNo%1cRm_??Zf(4L+fNk^wvzZtgxSulg> zs(rkHJ0r}x-(c0$tn%3ZD7=LyDw81Kxqsn2<`enVadX$g>S3HEKHE6%6+mbZc&fec);i^ za?yyA&LUVN`cz?3-eb*|6eTCj-}bAO?W4Rn5l9MA$jWw2oSB`4o1C)F&zCxSam9>Q z*tzLV>DXq~YBA!FiHRZ_r*OE;p|4kAhc!tSaKgmAl^s~KqTnw+!|CZKd<*QTY`K!_YmlPL~*I8 z+(HX_#QKE!s0xl69UT?Miw?yhR8eW$P-luUOH+#68eqzFAzRTg@;mX@u?p8OULC9H zVuvC25M_Pxk@zY6RQHJ~?-PTh6E>BpGq#&+OVr~Gj14}VE4en6DSDkd&B0-i{q5~d zatcjVRYM(r(I9@_)l{W5H#Zs@!?bBp#w_5~JjDa+Q?^=uN(#Ki781ENUT;C0qsD+2 zG|{820tlkZAhWi%=JHV_P|E+y;{4RL7>pBBS0MrN-=<%x9103# z)fSW$l==35SB)<0N1^;q2x@IB*`nE*gn1tEKIVP)aAC@?MQ6?G9OpK)fLUO*uf)gZ z96N=B9=wgFoPXPoy255)HcFm)#3+3}8z1!8*ls2Ev{Okq+^T3X5~P3~E< zP^T^x6cbR$*DyEBPDy^u&15(84D4%7vo8${kjYz(18bB5kC^-$ZEb&kl!_6t;Y#7@ zO&hQDGcob*etP#VS>x-0y9YuBhW1*@?yY7rWj<}o081fz>^%s!Or;4ebw7XM3UzyT z=@LVjV4BiFxeG(Yd~(9fBgHQ}+jj$gZ@Bun+fk)HSsS$0rc5a=t`aX10N&kxv`;S& z&rq9Ea)X#)hu52xUW41TQ|R($u&^{a#QjpB8k{!4@+To0fIixImC`Hw2kg_={_G0W zU6;)&cCYsQ{Oz?)A&aO}8qsRbd_;OZC?O?egEFA4+gl$#w>HCAETqXz5WCdtV^;~z z%n9yu5BB%>qt*a&3=9kcYOdBD)3w8gv9i)kiW6l{1Z%)#Z89sp8nuDX)}$@vI$FIG zZ!t2WA>6=%UgyOF{Y}lXHBDjPI>Sj7iT6HKwDyVlgPt~g|C@i~zlG1=QpL1tpYG3- z>8ZI)Wv^l55Wp*ZffahNia=XOTg+wky$kiI(}nWQsJ?o!!f)*h26uekjI(C$`TAeW z73zqHjNB3gkBAfjcN4fw6!_Lis`w=i&UH4;g4_^Hmj}Jqdts6?5WjhJAMhsICIg#h znJ%`2)bj81nl27S8f^|ayc}}jqeQ9)oHYug{9Y2h8?zUo@!lK4`3mGc@8v(!g*6nEoLRAeEZTFn7X{sh)U) zOvJ0pZtu4>EO$w8oZ^A8aqllGis4~fZnt$}zl$PBEI=L1%XNs}MeGiu>iy#kYtbl> zSbE(v)m_M}uNZ2^&|;&_-uTT%l|+yGXIy5`dIA42&1^dd*Oj+FWC&3@QwLc`X|>63R-uARNlHkObJg#$FQ$`KI|;S~2;E-Vj7cTcC|@5k+Z(WnV_=4weRIn@QD z?CilKntI@r(UMY6`fl;3RC>(31(#3kFda`?o8*V`r1Sv0ut?CuZoJwZSXca!OYwx4 z!d@rre8UMo@l^uF3WO8`aFu`%HGmLFRZMr1cDjwV#VDrHvAoN#CNhNjADbnG-t_>GEn&uAM^}G!ZH>=TdB@`W9r{+q?cH4t7LFojP8Y+L%}JEkX=T9E zY2X|@V}8o(v{aURZg{w!3|ap)xlBEk$ZI*qoP^1F<(@;hT83m!=;T_+dm-HdyjefF zNjt5=EFB~0%-D`Puwb&eb?n`jTPtV4VwyMO3x~z@VH1jJ>gkoAb>%oG`Sx!QI3c{h z{ay!z4LjASmbRvldrS#%SHOmcgX3|ujnv*>VH~%b{cwl+=R+-yO9`TPhJGh8DNpUz zP8~q}czgDsOq#bnun7;To)(p57OAgri2uj{t29_Qq*{KtMQ$<3=CHI8g2nU^u0+hV zA3&wqH)6+~Z;M!Wz{lU^ zD4>scW3R0BBCj1VT429fUNX(eOK&(wor1zOB4oyMsd0S_YBD}dD)*5CaECR*=qpb_ zwz|wBjgq1Bvyx){jNuc%Gn5T?jc@DbWY~X+t}1P`xkhh|I&2FV1*jS5+yOfxS_ykl zO$9HgpMkOJvdMVHx3U84W58~`o7)X4agbiia7kRvpl|cvYiS$SOrUR5{LH=gsYL9w zeLPu_6`ydc!lWxS*WlVU9F=sx(^}0gg-HDC;-5uN59fo;tM#L|aGK5XB(esqc_+YI2BGyEY1awEq+E4NHv<4-cQfAn78Rd8;LZ3^BMrwO zO-Lr;w4V}3yh^gW%gzbp)I@vval@*S_(1j(z+79%6L1& z;$UGZ(|t^4pseh^94OwLqn3}bkBJCpV`qm%MF{$SefX4j>J5KFBHzWG3=rVn)p(L! zmT9{ys#~0Ockf{D8Mk-BI>4!rr9_&EIO2 zzqq*5T#E2+Uy44>@j0wrn_9PttP-FdgH4*lKq_b8K})x_3gay~w|t@{wkarterjbO zQ3e>eni@pwQ{p)CP@Sa>r1+s;Ds>W3Q@#%^Vg|}MFn;s%^PN9>Y)qeObe0x$;;E7l z(vD3&;Qfhc9vV-MDJjulEG#&4a;b#D`ig2i>CGWfzI5kC&0h5d$LL|By~Qe zF}7}P1Kii%?6e{%^o|r4kI3-oXkY9Hu%0p?$85`Wl^9J1Aw68BJ77UBQ&5!h(m6>| z&t(2|k1S0DWK~w+b#W7;&~%RLu?M8-jYCx3<_*^z_e{9^Wcn9VUdke^t_Bg|RDxv1 z)}T6DRg!3FNhjk50Ei7LFL>`y!z}W|OJL*38*%ZA+&Z3ldocvUzONnp4IwSI4X&5I zI&!f+=JI#nTkLDr095t0xE^XEXbFO+O(T;6qRIsD|59A8lXz~*~fh6_3)!&dG`A>1EvT2A zYb0_mI!szQGE2l7&F#y_Q&W79nFih&eDMR8HQzUNwDsr{y))U#xc9ef4F!78Q(^S1y=;KC0_xyw9eP}h3aq1iUhJl zTYyFptEiOJ*6!`GM7;4c8C|(_9@rc6X4Il-Q3 zvT}FjuvtKPHzd4r+?FxE!yJ|#U;`5tt;|(yZC&zCkVk%T2WHyFl`G_yA)7_znam)C zl(zvQ^cQK*vvB#6l9D3k4KYVcFP(7uG_&k^a$3}+OdjWXt^La%6oy$} zz8kkyW7UKpW+8FZdI2vBf2&*coS!YAqojikOUlRXXzR`kT#{hnkzpQdfd>a}AdAtA z@3EZ1@|*?j&5^I8`M<40)T{*2vs@0*B?$Y`jrIM510X`Maz?JK{IZ8BFo-b<^)V{U ztb~nD4WGAz`?>QS5EkBk=Q*_f2@_oZBc39?J2*pp3kh{HH37p6SY@}4d$!oxdwQc# zlv`x4pQiXvSaXpruDFJyD5oAg-ua0=_M$XLED5qYNgmu2Euag$DSa_u;#UL}7ay+v z@BI|E>O3{73!iZRclx z1tB=MsDU0wlhv(Jym_z>(LWhgZlSi|bGS2n0;=VFF5c0-48%7`hinbVWLcdhk8^O9 z`d_?-?1BZ)d*-)Tw&dp*4`bOr{&#h6zr7R3pZ#D>uSU+$MQ9H^hU}ck!z?X@V z|Io1{pJ09T-YGv%d2I8rsC&QZ>jw^113>BoJbyVlh9WC2)@4n+;eqS&Y_qe*=eP|= z&)p3>?8{{!&TWdMH1Bn8Y`BE*nuXep+cd?1iAcBP^UTgFQ_I(2P6)YP6W!I=&@eZ* zBEU~|ivUnzy`;+@@5mMvxJ6^nO%cgaBXeHnT*f0Q(JawS&)w_iprz%l z+xS)zK+Oav=~If+68=}-0+OxG2!jq4(_+w}a=#6gw6ot)UpAu}utQA^$L`y}CSA(7 zgCr%~$lSjP=|DgIR%f}m@|Fx~h{8yTz7JS?paCpgq<3yNBpI#3&cWt4JC~QOrlZxG z1jI$WVxRXb)G3V`YdpH+*+{JNlmT^$Vip5~WVFu#Wq|H5+b!zm2{~SAR{MYY!V0}2 z6P<#ynL%}s)GUq(O}LdL(D$>i3%p*Nrh;zlEWe&f!}wzSI6Jrovwn-dKKJ1bG3a!w4n zi2rUB2$8#f1HE+<*ZORkCTrmPLD(;rAqTD`CC1>n-{D!h&`T+Ti_KxcLOZwJcw{xj z-sm&BB=)tds{H@vXD?S9!!yJieO5l{ZPk?kq{=`u$$9>LR!E$S2WOwr(JKR`gO&8h za?_QX+|E;H*JJRA<(!;;pl5ss&bTY%|Lu3*r$YRP*S(ggWWAn6q_mcLE9l$7H&$zicHlh-1v+$+#4k zP;N?kdVrj&xPo#w2t$wALcq70A{(xfjW&v&ynPd-aF z5KB1%;UhK&fS{t3KNlU?OwEJTW99C{yWWW78{(HmzY@A8JY6jTAdj>e64Tq9F0DaQ zf~Py;8@n34fv@-VkMJhj>Xg0z+5f<0$DI8S#oK?uGht5nPp_ZukD`aQ5+0+U^QnV` zIKQaAEvTz}{INU6L`fnLij@Oqnxhv`WDI8$hr=0VE5>bsA!AB}bZ6W-d6dw};9R4> zR(v=}=}KxI+)ytAXtBV<7r=vP>ru~gMsxA4+G_E*c%+t3LW9Pw?_P_PD>>ZOWJVlR zE+Ivj!Oc`qp@12%hfg2-ZOV^womH+;;C@zvbcQofAs|JF{+x03Nk1McnNB?z!U7jh zqI9K6{(4A*(F9KrfSrn^60Wk~*SP81U_4%AK47k1b6SCZ4vzMVVx(;yn$~bct1qH| zGgC7|1BS+2^j}9zBU-~)=cLVH@*Pn|35^9qZk`)_h$=3Th$@?V=U95(F=Z)s&HRqw26g{Irc{lN) z*f2o-a!yiO*>fEoDFY$*-a^3O6Rt8cZb=?})V;8UyRElq-9@qV*gq+yz$#}zwjr!p z=S8Fl)-0^gx->h_VpD$N?p^97<|ICw2|x5S61n8X%7<)eyo6_G?`Num{2aC0Z;#); zz2cs79$C_Gd=_a2fwr$vBuR$e+Pp`mr>lF|nzDtOj-OJjY3_dzY zcZ*7BY-i+6r4TFg$4;_~-L~m^@9LTwGmDk8rI1E4(gfZBDYg84j~G#2tDmnbe#t>6FuV*Bb~)XNdSV)Hq5%T^^t^_%sGu19a2w+=^%%} zLz!sGodKD2yr3uGnlfY})w4fjc6ag8JZ%TWjJ%C6f~3e&)jk*cXUKXB2UKi zXwSYoDR_B>(BYz|{n~y?#aNh{GelAC?KWQWyBwzGnv&mj8)5(l zPU$nNvy%g=Q~>#1iyW_;3+uT=!ve-_M*=SQT27Y{=jedCsWZ}pEsvowE_#c;8oil* zqC0mC4Kx{Wf3jVAu`nzx4)tB+OUiCrr2Bu4Pk}jH{?In`+v{kfO>*l>h1`Wp%hbT( z_4|F=_hA$Qb}rK*9-?RPJmoZbYHrWjjgoVlQ%Ls2M6Jv{5h9vMhGF#}N^8iPQ;3UAn2Cu=h3MVy3LZ@mxGxbzy)+5i z5=x0>iI~sr(E~wip|>f-MdoSfL*Wp;%QTE_T$(2S-Hd3EF2s)Zm7+srlx}R z^`AfIwcIfDe_{*Xlm1ZGgOk`Srh?)1;h6xl(pUFG-d?$o47;5sWEQjl{qcJLaL0RX ztB-JX2B5eBjc2U_UD}Gty#B2f9W*p3clheY0()%QrJkmyTV?sqVA(EKK;v>3H5j<) zrt`h4XXiM#Ruf~BQj-!8`&5GbUWxZ z@L^PxC4c(WVLrLl$0p@uGO}-Jg>>q2Hp{&HctlVjhDIclfh-|5sq(0X?CRAsBfn$X zy{#IPt}1H&Lbt)+dPQW;4Z-wfhHG}}?(p+WVpWnt8*6YP7%G&BL-qAQIJofA&JIE4 zP=7joN-K7{zYyTFQxkUY{3%Epiq(_=pzrE?BgK~)xmD&Db?|HAugcw<*gt|! zmj}2%qbN*r&chD7?NbfkQl7{v95r%X?SW07p7X@a2wAwhDfLVoh$)hbp)5Gtw6nZ+ zF4Ojgtb5G&227Ylk2mpwn#A9Hhet)M${2|!&dScg>c5tL$->Sq;wEHwdT77~)DhpZ zk05ZA5!}7G{Z4b0y>2-wOvxzV9NFg%68dgk&Jn6G7N4|QSNdKoIk%O=O}W?NW5fn) z)MesZ)Ly+jiU~OHriX)v$GQ=oc(_9AiLKA`FKf_>>_=?9O{a6f4^Z|JLg1EQ_ayU^ z_gYKi;u4vDg-31DZtf!Y_{6WJzRLsJ8@H+N*(=hZP;$Zoko&?q+IgpZ$ZDU{^DE^Z?ZO&-r<=i{tBa(s%EZY>#C{UcHK4bWdR-XUK1!I6hvq{4e9^2F5sw9DbCr&E{efFTcbe`8VPs@bE|DGU$zWb&*wIc_Wlj zyFe-Q6RfdHEb1NTFPqofE;X?xM&r$$viKN{)^*z?k=)?Gq1jVUnDI|(L z!o6H|W*QqfQ;iAtsR&6k=OcINIowGatnq9JVCczW;s7`x zfM`x;jyM=*VD+F4QG;r*JW`{G_w*~%VdpO#w*`eu+W! z;2#31t^>{l{14VYbytpp?kNdycW^6#8xb#9%O{KM5cnVvrOh5D?`4Y#-**&=?Ob$E z$?5U2+PEFK5j|}B`cEuLb+POtwaD?Yk$NH!3S+Akub5%GrHbkQC{{nCOczLrhRwf~ zsInrGw81~lo@BhNN!qu&V8|-MYF>KPBVE|S9AA!$k$CBonc^i3+kP**PHBl>NqU?n zdZn8k{JW#b_V&$h?0tG3Z1JO9O`;}(V zF}m8{CVl8Y+rW)DwqdpKq8-|m(Q9l?js|==I%&yGf4|yn=AwLM9^B;(- zB%yQ>NRfx&Q;LBJs_D2beeO&kpag zhUu|01|zJwe~*HZkdX@LMQKzrR%MDbV`54VPGQGue*X9Fh0GD%n2@$@Ho0u>d=17} zc{999hnLyIZ;GJppogD)GFYL7@tsQz;<5aZEnf>st`lQ)Y>o-x?kPR?peUd zlHGdPA&v&%T$hZfP$T-~6ugc+(f- zu1us3zbVs!(uiIe{mKb?hG=kT!>tqvD*ujntmr6$N>;)xo9}m$|HOW=nmP;4cw)Y} zKIaQnMs0bsh$>VVIJB_5X2MVPcNN0&H|3(zq?wkWq6ZVNoy0mN{7;CNzRY9uV70mF zzY~~*)dS94^~c-8Is`FW7Z6SQTt71kc#dNqp6mt6(-gq_2 zN1OUtEx1+_^Qau(7hmyy>Pc zmN0<~psfcn)<6W--lYYv0bxIf7TDhr_MB|&cdh}6I_y<9WE6CZ<6TwW ziI?Qfnxls{OoT2hWZgs&X?;jUdQwqNvxsp{#`;tD=BAEVRsf}sq6lc}$d1wOOSq2O zyYcavF-QS=2qXd~TqDxb*O-0gy;66BDjC+Ec@|;W|x-@ zOA1X6F}s8f=E)>{W2OOInn%{S>NyGZDapO^bm!CoXddh9{8}F=CO`374y}y#KvG8I z0AYA;bhVEs|Ma|#rDGkblq%7q-Ynvqrx@oxkpE8%;82(Fx9IQm&M| zroSQVRJQK$ECBgd<<^$v*6zA??p%=!6~+Tuh;az1anXg3)`7F0>ZB@Q{ESO}mP>b&De!9S1e^NyB?29m+zWAy|5|a4 z>E-|BhGI#}qz(xU3%g{r2sqr-Nq>C)?Qi6&K1M(HvyGM=q@LW~F$s%vx4S&bVyO2% zw1lsv@Y%GM*c#8j+cEOJSZi2BfV7b3?#H9pH*Ou7MOVY&H?@Nk^Hx$E>T3PZli4)i zM{U+wFL`iY%ouU{@IHLD8LuMx%#+S*sMT#KPYKQ{2{xfXg$Dq<-rHp>Iao(HoJ8rg zLGm8!>;mf7K9V9T9AfA=b7nO3^Bmn5aB;lSaDI5&p`ObWm44Kka@o`Ue-ZbVQBk&k zyD+zbL8%~J3eqLr2uOF=z#!d2cPNMm2q;LGbO}gzm$bCB)WFaU1I(~by#LSh?)~ny zKfL?PJ8QWX&dfD)&3RqtFOTE+_1W0dIM>-7EL+aci@b-jvaz`%4@N~+&Lt z?`k9(93(h2U+rcJfz0VZ{rrzN+AsnF*7qy*ce0{{55bVXdcl`vg@uLH)eggHO;4Xb z4Wzzve%W%^*W$7JyWH|@sHN#VFwfGo76%Ux+TuUBQ?poYe)M5=HTx{Sabygi7>z3hL&r8Wd4_q zSw1Sz4%GZMPA+z4Js^VTQ${{@h2@-YuD*ui=bc~Jpf9e{Db^k@y>Tit z%u{agI^H;N4)$#e^dby5Uy{TF+~O^JkBD@Rt}p5M-4Q^LHI3h?F93bC`KK)?%?sWu z#^&#^|9OeMYG{qNd;ePMXOrH{XV#)uWMkcFm$@(_H` zfK11##=f+$gp%9pSKS8xX-8Dt0|*{RyaQpjIX3FU-w-JgS_h zlw7`w!Ye8)WYOO0p$f=UXT-$jZ~1YBT!)eidxBG<4$G`)E-i)0$@S*!fK>5hdwS)B zZ-Fyess7?(YSEMV*|RpU@I4;|Q4UfZ>8v-i)f8V+g`lU0_Pn!DsApMq^#K#OrRts6 zHpj=g)d*r@&R*;+h`9BA<-PDyFPaA;ZK*JzeeCDQV?TbAc={Lpt@UCaZQ7QCD-|Cf zx4yb6XmkhjZdd2)y}7ck1MM7jpnoS%`$SBvB{TE6%o{zuM6S})&1utxMxP+bKq)nB zJgokKfyR9E0!>n4;tlLd(8sT=99P*|_e@UpYhKK?v9Y;z`!+i(-ou9_MPmZ6PF5zS z=zeq3h|(2%YwLoQ;0Y5o2DWRlkhwWu0LAd6ASd@-ejRqCs;2fO{Tiue=r%FILrE#N z5Vnm#SaYO6ac&|;{f`*f5Q?E!0AlBV^}6p0i3icl0OT(Y4i2u01367m(FH(|dmJTp zwU3H7y3kop;>l!aKAq_&s)EZlYH4Xbd-jZkBw|{ZDHikIJt86^sQwt@R|XAf#PE+d zk{){tW0j4WtK4*I#6&0>SdKqNIv1pfENEqAP3p~0#ZDw!(@N;!my6hX({N;wn{%3 z(rnyz1^5|RJ&`{%L8HPEJk>3jiQ3K(CVKeHhyFRX#Q^ z56l4*skhki?qS>Q=Ok5<&U(hiHtDo}BqgI$BA+7Qq7Q+5fBl?9*z?z~XOfd8hKq%D zq}*12(yy=b;xri;83nwz&n2;lm|_dlMCzl`KmTywsnQn%CPx*H>Ksm%*=KHmp#w*RF8nO1{s~=EA8iBa#IxbDmT=^yGE}#(17Xl zFg%RX_Yb<|dIyxWTwIPQ1C|Tw>+5^cJum9SP)_TSgP1{YW=~T~n@+vCB0grGUyxm+ zX2T<(13v49XAoCcVBf)O-9@EWvpPkC!?t!}d}o}OWyvEMl0V;~QD9U1GqN`_8(>XnLdVddpeP0)6&e?S4c=D7|b7dH?=cqMR{# zZf^c;cX!@n552eGx7*Or>%c2Q`|QCZLWv$@GLAv++YYs}ziWwlH=`%u*FPoSf3}~_ zy%X4+9N|7pHY2oVXFK8Kw*4N`X^d12Vje(K%%uuSvg5#F3qmj7N{NQOf?_L^A zH>}db#EJCp8|GjVdw(t|u#6va|NTD(|D8Ln|Niyo(SHqdcq{qe;~Q}Q`LDTp|9`)6 zAO8XNLq9~72jx-+t1D3xYD-M`vtds+eKDlwz`mHi(ZMvGm;TSjn*-2o)5Bn~K(k6Tk#&iG5IK2IeKTF4_ zrPtK1L=lPDtiN9`eVl(enc70o`Yiap^njwm+2MgHN5V3Cp`S>>rieLIX2#$e?Gs4N z5cn%!i%&mEC7l6GmOL|+84^xwfxgl(MZGs#V>=ue8ss`NWw0@RF;EvN2_=da!G zZ1_(ol7G!iL2~<1R=p)x=8=1^E2R{GWZ)&KHa8I$! zF~7LDyFK4Dco_XXMVOwq;m^L&#T!q}f%YzD6#~lYlH8i8z3l;Vu|kl|TE+na@iOdiN-6f%`Oip2ScqxH^vnJyNi>Qh&z zH|TdF-dUmy46X}TFW7vW-C!qQj^}l#&Q4Bi9|XI&5VGqwI-i{x?DZI#nBW6!75xmK zez~ubht7IilTe8FfIsIn#=)c7iuzAfL2W;W25n)sIX+zS!H|N_i%t&DzvO8Oep6?p z@-)AFD@c*xDIv+=nxJhJ>GFcLL;h@o4_SXG1tDQ#ja`-NtGVeB>ACfzL;QyR{??uz zSa08nVd~B#nV#b0Oiz0A!rcB^UceN>l~!)1v9BvQUX<@_YgnwdVns394BmJ*Ca`_g zIq}5Z<4e!xiAt)VS}kmfH>Q`{x8>fcKWzG^F-N)|GGZ&jEo&lk)%5^$UHyueS%zeN$oF+m`aRzH{95pPKSC|WX47-3_Tm0(@FxbZr_gf52QZ# zol24FzjZ6<*c+8|WVsQ)&T25WxG2QP(76~8?XK#AR&+A2+W{RL^tq>&iie^AX+MV2*@=?u#URDP(CvC>#Q`)HveSD-t=sH7M7V}2!XRh;6xmuy(V& zF|6>9VG$||$oV+>^jU~M(nM-{P_pS@TBop&E#9y$;VY-Tv<+rRKLWAI!rwStFY^>X zp5M}eZBc8#9S+sjf(UrzdUo2{os&=%mrGKWEgZqu4-D@**KGq#tLuI4G-g&tbA5ZQ z;F?k>L_KWH=Y`HY19t}_Rat(i#J!UeIWEwC(q!Y!eKaT&*Ny9Tg;meS18HR-@X&Ln2vgsBI z??js?CUC|!V@umINZYBi97{`zqy1fco;r0Hj=MG!A{J&EH9flGdapqQ;!az zvJ?VQqWs*H4}A4Nt43uZEiq2beQmj_uPAFLo>bzRBK~uxI@63p7_3y_lJ^?-jA4VA~vmTz8@SOkoo5(ZQ5GoSax;4aIT$8D~Zg^x_6Iu*{RwPKKtqe zPfJ!#RbErX5g)!5a9L*OawQIIDV_9S;UYe?Cns8y9E38G zmsDtH2^e|ipLpZTMI-c%OqZXerlgF^n=g%^cKGyVe5oSb+YHExos3YwHR9RRl3&{5 zCU<}n8WuYbnqg9Hq_@8t)8=_ne0_wfX7{NVl#TX95M8@x`hiLFb^c@2__HTt~`lmPZQ!9G3xY8$`y~W@Z8zv zQ|b__+WGo!(86*UN>2C~)B%UmMPCkuO2rY{RoYs2mJDV13H3D6E_j}KfXu$KrsoP3 z4^FGkO~wCwA>Hm&6y4lu)kRju{^mMJWrI!s==WIsPi3BsO?dGIGsxB^u>y$i>4+-Lj$!=g&s8KsNFwjp0XGA_Jm2=yS>)j4&#Xm zK#xGH^mj&Mw;U>Y_h!&MQ^7UPgDY`!+3LMZs0P|)e=6v84_}k6fuWkA7T_~%b;1eO z7Pm9l3{P}n9_s)W7u#jVs$b9Ku~aU3i8j}uarvfem?!|tFe-(?Y|C6fj&Z_~=g5GA z-b=c^O7HoYf{OJt0X;Lcgvhfxj)29oz#!jdWG#hRbG1NNre&GJ$ z!N0cbVw?EWhZ)MRf9&ecj&~_LBu--ur82S!mM@xdgGm9ObQ>R^ zRb5^dm$smi_nI$WyIr~-+dkDX!H-5@=&mBxmJnJ7h9snv0zxheXN&$XsUKTffH1&h z@U%GHz)0P|(3&&JVyO2D9*(yIHJ!Bdt?V0J#@BFnxR%dS9~?^IgSCyqs(ty>m?Qe# zaHGNmysoTNRHho|gcUFveFs;X<_*(vQmJ`EOxLd>btP=caruOqx+Paf7TkjtO#B{7 z5AZSx`p;C3@6`kdQ13=XsK_UBW>x3fRNA(}8v&c!a>!u6BeJ-uXYp-_<8v z-k*MYw{)I=^3q$77wD5CU&z*tIX;uSxU}2tO(7tkoERxH8C)@1XqL~p8V_xctk&MT zlaaCH#xvC|Jmijjy&Gl3`K>4mb)dw4=y|oUJG3H&44V!4$SND1@Lm68+2b zPvZhzQZl>t25-0%XJ+&R10}rc1wkC3$z(38OB>Y2k*EkrOE_*5?)n_b!?;QDHGAa~ zWVk!?))c5GcfJT(?(VzTkLl}^vkPxi5o>xcvG^%`{bkr`Qhs%d-X3}G7e=dHJkRf< zeGzJkG;IzpV(y=`^Q_<45Dzk1-=bo8bboWJaEJW!W1q(>)=8sWE+3|bjJbbXCw&O8 z8RL_T(EV^+S0|BS)!(y6g8kw9oRs3^`wpDTspzVg?4eG(P7;2hAkJuHf0>3S%9ru0 zV{Gdv06h^pXjJErwPxsRKx9kq*Yeoo>zBkWDt_xrzI4W?^6!$9U(Z1yt_&^|u4N3SEp`k(y9LLi+RjnOA*M5&HJrB*Q6!aKsvo>lrXv z=NETVMEnNKIOTGpfx+?ijRM-}^+~%KDsx*(Ks@8yulWv(sM}ARG!+}8N?XKBvxEkh zzKlF^YC#%!9eI975;mN#GMZ&+B zA7e)??_BFv?J_zAK;NK6y|cb>K85d%+3;WniE?sUyqa57wMA!Je=k+D)f9jBSi<8= zNZuL986xOnPA$G^D#&7Y>HrJ{$93J5b8$ztOi81e0<%MHq znJlONwo4`j6SFfJT8`Tjw~=1M%~#TZ4tV_i=XvL9_&ONCZ39@mQhEhB>duMZ%df(E z&7%8rD0Ye|)6yh+^p=S@7`cV}AZZy~oF;B|^1tUaVcf)ubQ=99m^E+8-t!36Rn6BL zxvym!mGa@@Q~;~;V5bPKA6y#n*4WBAuJ$}T_ky%o8$bTDb8)%i^W8j#&BLxI*Ketb zC<7|Vw;{lA%qf$AnZ(}6Kxy+`lgTN_(LTqNiLj17M7{4M7qd!#Vsd7{_~q@8$-IO8 zClI3lC`Gsr59_8&ht_!dy}N6CxwvPtEzGu(bfsVxl-lj<)oonm8k zy8N2xVi5Y~iLQSp8*5(4Jc`lWn^Fo%y3DwNI8WSv3fbW0G0}lEX=$AbwPS+_erij(?wneT|53Q{;_?z$j<%)8ld3`mnAd+{Jg4 zfS%Xq)u;-di_&pm4OIMM`p7a2@c+e2ZSzZ?hBj`ee-*N225AHR-H=3BQbd@oLw-y@ zCdfK;72^VoRr^n*g;)~?Ekguo32Q+`p=^I&)cfLX)j^8wC0mM!H3#V@Oi6%kxKy3! z_QmpWt7d+B`0=Mz{XeCpMI*^AKN1|-O$Ks%m3O3VlcX=lDa){LtmaT^Zu0VxrOFcz zv#Y6Sl!8f0L$WH=q;nZ(PvKKVxZA;;byjaaAo0YdR5peeiw$*eUq)1CCA`meu?!oW zY7_@$b=zF0N{%R|PZ+m9#arZywXGZ>N^VEA89SyLZtNikmJXuEnp}f|1m~&Khv{XH zrW9{d<-ub`i=(I-F}=mQH=Lv-igZoO1VL~7d#BQ`D>wq6hhIq)w7-v8jRVC%gjLHD zlcNTM15VIS^U=pNB%7y~Ya0bhlEEIa22H+Jy0i9`%X+h?6ZFS(&urC0JIiIUp?~0O zJC}W1d!u-IEcCeX9V=Ls`Vni9GU zA6_~qer+@UwJ5GT^)c;%o}PbB`IY>i>_5Q@+CoAN5Ppxa9uLD>v!_yt;WE+KsHl00 ztt?A!5|V6W0<@^HP^~C8FV}J%o+_jP(Q-2H+??~DyHjCdd2xP$7hzEU(>!|V-e5gj z)*9X8#loLfUCF&SoijhLFV5lFJ7Jel4TdNK0H3H)+S0T($31DcOR9F zCf~W5VSMHX+uYxY)8Npr7H%#&NyuCK^J%@Y_Tk)jm~?C}rl&9ZW8T6{&QV_RJ*g?t zY6P6Jr=F!pIJ6^~z=VZ`uHs6*z>}e~xVR)GCUI+LDQ&H&J z)rnt%^?IwSv;5DaX%n&Gbz?n<%U1SOvCBDTSb4(t*sZkt4rXDgC;O6bDm*YRWAiCzIaAnI94?(Pqp!pkX3<-oNie zSua<0P$QNc52>!z_io-k3_kDdwWajg3_3&01+sg38adwhK|BQ-s&U97%ucsDL2 zuHRF5U8-39X1nCp*M(oQ1m$EAYUNGo4cqadf2)E>SO2#)gI&_smwSU`pJmTWO5#FT z=;IDfM^41&sY5y_DrAA?O}#p1Q=51G7^ajOCjujVPacnoOOFNLoHOau^$fa7sqe== z17(zs;mgyc1=nZyLg*+Lkxw(VAKZ~}g0jy?xIe8O(Rk85=8gmN->Grtj*xcQ^c3$c zz}Kq_Ka4AxsoP;rZr|GvNBkES;NToS+aDt8cgLnGEHfWrO#(_jV%t~R#oAt;UScQP z7J}vh&?qlD-bFWLQcqsq5a1g11hhp}{63XT^%>Qc?L_Gp)6qpX7ngOsRtt|W9@#o( z9mF{`__5T$Eb9Kge~C@6ZWm}*l^eMY57kv`)RYzRM%FmGX?fXrYn!(%`GU8dORA>=7rTvO4^kW}V~)ty^>7q72% zw`bi&EU=F9+X<}RKH&FS&i8Wr%*f>_EE>N>PJ$0Iq3ALCaF!!hdX?0r_7yJTPXc;% zA|i&I1+PaJr>4e4_$;3#57NnvDlt^~oS?lxR~j2|x> zo&C#@+s&J)>1(>8V5@PNFKRHnc^_F4$H>i_M79O6Da%hZ65#CHsdpXP8yM57K3wRt zQ?=CIaTx-P`JSGrwNA>$$*_dhS6WbSlYG^zKeeww0t#Ep<}3Q6H-nsi$nl zK>&n}8AK}=THDf4L}Ti}7Sm8CO#*j%w8NvVpEA()8N=!^rGt`p~h%_otn4}@*TEQ08 z6EE8dHW+R1c_)EjVylwu^`j#F;%Hpijqh}>Z3dqzoSFmdgS|RSbF44E3q+jo5J-W- zI4I%#+|a#{v85XiWQ+|vEFUe2tPbvg|BiAmk;&37LIjU(YuXFL-ULG?r~OTpEtF5H z9$qA+Z}c34@>A%fL#4{j$oSO6fTGg6V=cU@Q=Lmjq1&u%BY*{7i@Cb(>b4De0ykwq z;63CWKCs|SkOM;Xz4|ZomJX3fkGGfJ%An1Hrub8zWE*Ag zI~m-ww}TL@UH7>dvt8WX(G$Re`tDFfQ=6B+YrjHe6~j$v=-8~0g*bFasn2GvPz@)7 zsYZFTO{TWm4o17}<~CKEn`=kM!*(`RNv1NV>_*iVs(k$UBaot6rYG}_e&b0Hy7?O0 z%arePNUV4qTpO&&Z9Z7t*s`7m<5Qq#H#lJQxxzR!l=I}&b#Jz6@Ri!VQ{VIkM?a-f!wQt&WEVexGXuCDJMzH$dzk_(A+T zm+jQ00@mrLM&MRhYbBoMCAGU_AXcFa<4i0pja5m0+2Fasr-t}^4r(RA;X3v84{!tx z{W=B>s-?5F8D$#5?km`~>fMG|4-E~ejW|L5Pd&DdwVvu&Br zr#lPMrPu+M(*E&EtF*W<_3k-q9ZMf^baSJ5k)daapNOH)^-1a=YND7`2}pgf>99XO z(?oPV;SD(&uPFVDZLxLI{dnp)jer2~#~UoyYgT$WXt^`Ztt8$jCvz|`yr=CIN{I8? z9e>FQ0-<#y8rgE7qZYE)lG9@Vyj{fas~OlDF>T_Prq+(Jek*SI7baU(SysTlpqfP3 z?a(iR+Uy*@XT`7A`4-T^re`dn-jZ2rhOAAmN~_nl+YKtsVzHutCYj)jK06Moee9-Q zvtpgHr(qy&YwZBCRp-o~S25!RQan84-SkRzFDnVwC@PKbA}`Z@Ph+jQEXJ70X2qtm z>O9fofsIc?do`kn$jOV}QLG!B>q||yzhEv77s-f19B?b)7tdRz&twT`KoU}u&p_Bq z67eB=tS4kxGMC=G5eaL_y5>z(L43S|_WH@0_+je@nR zjKvcV*KuvQ`5iYTm~rz>qzkyYh=|#))D_CijTEfNaJmqRoXiy|vsmcp^bGAaZ|`ne z7##@;uQF|A23NT;fwAk*S@QQTo@U`RRBG?|<-&VzAJ%|kpqg6@5W5k8M z1sN|kfA!or^NB`ocNcxcdUHZLQHIApD)KJJUD7{BnFCOoTNwNgW7VB5%+$1%DGwec z^H@3rr;1V3maumTKjv?o6B(h_w)U=g*`6VT2V0Jh51-wC4x3J@JZ1@`Hd%?$E}8X&VeS8? z&o0)Kta?7mj*jRpH&i#;VDrA53aG6y{|lO~B|9gfefvPS;Z2O{>H&a3Z@3D2_k*4u z5H6&-clO&$%hgW8MWYGb6aPE@^VfEdr@mL{bR`0*=+&#Pe!Si3Y3HUdv~o>G^s%_Q z^bR*Yc82X$_`nMC@-8>eB>q{1dIqX;3s4nDuKFR~t~NitQNzW+plQXx zU+r|2AJ*qUA7f+E2=PS?!as2}HT*1UsF=6nR3lhxUvc4|i*!GV;sp_ns*dTeMM5c1 z8#pDK+F1pe3o$8)iDa;q!&8MP50~$?g>~%#52TL&rS|&_8Hu+2Kg5# zO7lZ3i=|x}_f@w}a*ykdR$|m;qaPDKHuPUJ(X_iI{z#?eJbYod#IK>I1w91w@IBIl zsnom(0icMogI=MQS&2ulJzu-pc*hkLwZ2x1XaD-uNSG}Cb4pxVml=noB#li`kunhx z2*d=!Ibs>EXOka~v)+L` z#{*|Hj<7z0vo9R>E~*d_{g_s!!*|Qv;1GWV;zuLjomAHJt9d#GiZ7Z>0*wLjujlqw zwyw`}iEN9Q0b--c*EjWdO6C>HHR*qE5G|^Xr!o_SRr_A0wHg2HGco;FUfHXho4O2Ug9%ML=+PTxa5|t&ew6w|@i2A2L57n~e8%l}wU)F6_ zDg)Caiwan_wszuVFK9AN5p7_icfxd{00=m?Hmy9)_P@&IunD94+{l2~+pMYq#p9<9 zpox$kaI6CqeI9j2ui0W9ow<239^aS z6)wyB7!-||ZSQSmFfje6AZ?)Z=(VX|gnrh;hoRr_q0PFZ?pac$V<2?!2)WS@z@T&@ z{s%LGBP=tLa^@0XY=E*ji+Frdt5U{iz0sfMaB&5pL=KWqB-TLw?=d!JOq+4EhaV*{ zc>hZ=j8~z#h)nzusL|1(KDU|i@=eCjBHCB_&H1J#)tOd1I)27&DLqyzn_}vFO_?@` za{~HEKwM>^`5)H72-7(Eg3n_C37@3t#!ks}})i`T7`7s0CaBJxAOND4VlX7|Yl4)p_S>#WF=M5L5ld#a6-8;xzDM{%_D`0EV!xjE$QU zG{U47CG6}y_w52SdA<570Rkez4ekU;0i5MTv`T62o9Ai~@@s+wC5udr>I)Oorzj67 z?(m(CzoYOtloM{@IEM6<8mZfA%Eegz!Xw+X1^(})Qz)(6!+9x9Ef)Jvlr8 zrLH%e1HQgjy2^H2bAb}=a8_M!51AW2=f8JeZF1-@A6}7btcwi&oVovZWdDalN-Zxe zoN$$u{=UiOLpS9XUU@Dp0aszU#^QTWDIY$v&6H@sngOmPQ)&S0apdlDvPd3rec%G{H42ng%QcX zpb{|wfkZUz?wuQ8@7s~jCC`sq30fuFnHfqNknrr~%T7KPsTo_e`M*OBJw5L?1?_pT zyk)%6s{oJxTUaA*j~Vx8YiHDB~_$ixv zmqxp1xEPeYAH;E_-`6>F*^@EK1&E7ovca~E|tLrkcE9vdrSGVWz%F(>d z$wZMigiwsuj<@UZ7hATM58U5BHgfPT))>P*Vnup3 zl~xlWAt%U(h0I!+o3Fz7k2$;_J!{31Ps~}D!h>F1i z(mc2gx%uP&@^-21z)0wD8%k<<-&G&glF3bPi!Pr~d4#)Cr?Uu9s~`aO+8pRfpSGi4 zD}n)f1g*){?B8F7@dr2H9yrv0yMPFFE3mN<<^TI2r_Go+jn3mh9y7@6xRtFx?ykZV zG0um~tERKfS}-7h%RvLTtb0uZ*FKKNrol8VhT%iS&h9~2d%6(A<*PW(N^{s$4iz`1ea zkz(966JbbUzjr+hJKMRS6=Dn8EjY4G^FU~gp>-ka*csIE5) zIR!B$$&MpVCen;VK@zz#+-A6X@LPjDUCie>D_4A%8P6n?S-4UrkBs*Ib73Z4TeSMS z*5Zn+;+C4(!|2LmuLm)CE_Fks5%v4~X>qw1bB#|Qt2v2_zj1MiBUsxjE-jW%6lCV{ zqYT-ao1b>~TvV>JYxU0a4qEz&4gj$@l@%M(@f5!{93T>}S}qT1g4%wKOzImLe&IIn z4h;;Nw0@qs0ykrId|I2RIGz(7L!=PqLRjqRw6wE`qDVDfXg4ppwFG9#h3JH&wfY*L zRgHb@^yB@X7?4o^y?1qsO4r#Cumfvf!PlI{{CTHKjyKdnxOb2KatdD zZ`63Lv!5KiGh7V4^zlR8O7}j9Na|yb)nOM!Ua_bACU0{1Oxydrvp3{ym%L0cE7qp+ z>qwd0qA%KG{*STuY5Uq%+QsHdi#mb1mzMYBbLh2P`V~rr4j%;lSk^A<=}dyckz;?& z8OA6+!?esS6h_ zhQ@MuZPs!1fEIj{!~W))i|fCe1cQ9eufZ?=xolwNg0a69k9>i8!G;)tGh@`cd^GLw zgce;B4@{4Z>``dr#)GB;#E}F|CW!@0bR(-lQqikNkDtbT=8W*qpW3QrV`GY4HUg8b zw9BT+`z3ipioh_V(asl2a!JBL9ZRYNYuf`fByeYKNK?XR;i|$$Zc#5AExm$XGg1{d zD|hu#wU^?LFq<4yi`E(*vQ&JNi(WmttDtSifiq7(Kuz2cexuC|EY{my9SoLO`F0x9 z;u^py<>pK15wrGv_ezvt_hB%ld`@5{L##Rp>8^#GF^Nek553THL5KC4^dc>J71*LB z)a%mXVUeSL!RH!YzBEQr@AN{N$7c`b<`BIDcf>utE<-OJ<}(!^b!Pwh0ot?y4QoLQ z4o8LKu*S=K-ac+?YjsCNSaWk(CQq8t$9_H&B;CsLqR>~@OPz4XT1bwBgBKXLQYByK zu|7%0s&uv_`|k$1g3OmP{&Jh@L){Jnqr^Jg+?ND}R1#m#ic#molaT&~`ufti;a$s) zsTy1^nYc!WxZM*TiA8ZBBSFBfgL9A(-lne~kcw)o0>prZV{ z>)|KO>sI3%Z(-*hQSuV}ocQlEf0$~Yy3O8y5T4TFdGgD#vNCJuVtW8W7`{eDOpc$f zspa1#_#$e(a3ufIXHerC0HLRN@nv~L=+DooCMVaFx0HrZW>XXkc1+6&xWVm+DARk* zh7yx!XUBM`5jFnR%bPi$wxw?Ion`Djh5%dM?eZUz1*QF&?HygV7>Dc46|h{EX6z;$ zKTC$HDGbCiLVOXS4Ndc@>@6o$iqX@*Rs9ZiMN!dyLNyj^Yf4f;)l!9ASYXJDRYoqLQe0BP!pz2B>DlG|?w4Wd*u;dU zyW1Rb#bI80{dqa(}TZ`u>R6I;;2Z6VFk$jWT@JJPJ zh5dX-hZ!o6w|2Iu?8L<=&2ZauUuaZ2Sf^<5RoV9 zs6srBiWC2}85m-hT7L!Wz%l;vAVm6mZ0j@On~2W+zj!Ni^dKAi_ftdO{%49c2Kmh- z>c0=i`~S~@b3GXR|GHnrD@`~+LswsfrrZ7NyfF5U+LKf_dw7A0KB>4G2%G@0iJ<}F zyk^qt$4vI`hqc~*`1U~{zq@MyqE3T_keQ#wX6-`BuW8<%b?~f2_}@2S;K^VpauH)I zolGpFjlP8F7${Wy?65^IgX~FEk**@A0R3x$LON?i(C@YDT*~*mCAauuLhCi14^8C2 zHt*LK8=0D=ARwiDL=50RLxeh?QI`9dbqnoX@4fTDA9QCg$f|HXoolDN? zUdVVgCpn&2o#HWt7t6OBn(@!h0Qp1oWSI;+N$?QxP%GeOd%rK_bb2Cw{7jf2O9O6r zG=BoHChpw{_B}$1X*$=v+E7;0)HPG=Zj@TIN9Mhrix&w%99EIFAg`!yy_*d?Nygn- z0Ep&e(VPHfxK9KnY zkkxT%LS4ojASlxQ?vpgQ1gZ0!6yxxOZ`a-8dnTo}yPJk;;_EOBugzuz$)_VfIe_1% zdeH`D*D$ZDE0AXOwi(T{6WQg(<$f z5Gz~5#+6>UpHO0Vsh;6+KxhW zw(eZO^2WQ#EgVzr8!26I>BMjU`Sy9gN~PHmXtbBnT#n1<8xirmget;JTHO57H5ESCO;v zQFFX5_#CCjK_zxgpXOCncy$O4h{cgjF@)R-lvv|rL~Vc5KB^Hz0cL#^-0>)#`|<&db%fa8z@$R_|^ZPm`*D`cCW%(5lGwV4tzx|}i zXllYKE3ar?@SSu{y<=`d$J)a=Df~VGuT4e5nCUrP)9H5jk4x_cCAzE|t{novb*39> zd7b*e2UL<)Njwt^IDLHxW~GTJJ)xDuMZG}-JM%N)z1*{Kh#WNe_M*zwuP299?fL|a44f}6B>j5wlucc}V9J&4HOKG2%$pM}kQKR&XI z)T{2KS1ze_E^DbVD4j|b^`~WG3+-6bZ!sIVLn{}JjcJY^hBy&Xii!9vWi-t)_p=pf z$rnreHI*qBkP99Dtzcp}{=!HYCi1+zh=n%s>)(o|Mf$b@I%1t7Q|xh+m?dz&n<-u) zr~WGXvFnOXZQlj-V)F6^Ws}L06P!=YzMLrhwu>w(`qokt?*DsnY;9@HH1%6)UQtfn zQmCcTU|LJ|{tqu@H{I8YE~cre4~A*w*z~K}_-Wg{v#_G}sEB<})I(8BKXkv#wY?c} zlH)7ki)>kDA++t?>^VByAtxW#=LNl+vlI8RfPQmz5K_3FRr*gPJa~w=r`NQEa3f1+ zXA`#KCJpL%?iLh;Q#I8M<@kF!F+$RA?X<7sNI`DXh$f2!^vreEK{;cl65Gqd=k(SKf|9H%$wC1^}OaEke( zKMA%7MW$&gTS9jE!lM$r_u_hy4eCMr2V1A6=5Ow?(wj( z!D+&e}0p|mDP@CTid8ho*l0`oTNK@ zM|!zhug9gF(7m#Xmv4NA)}Rc{7+Slx(t`T3wH;mKi^^QH#oL*FTCe=b(-@Ubu@VkwE8k>E|+6+7aH?CK8{#@#rY`W=ZgrTTxdo$HJxI)WaTh| zCR#91en2Ah!!Ny`MCXm-@z_*B*tkAbHOFf*Jq~lwN};~*frr<%gXJ(NJ9xZ*IDK^r z3pm)_i!WYaI6S`SYG@(y@(k_r1HRpr^j&Mj;L`Egymr+~{NGkE>*e}dT|Caeja3YO zYPz0j;VzF90%yI`c5_-O1_I8kHU?KBrxe3VQa6b{?$FvOG=jz!vq{v&$OsCHSAVvC zfIK2(vn)$dPUkmC&22osnoxLQ9zPUoDA=>)*tLwl-Ow^-Gv2FViDSbvpK4Dlr=0pS zxqmG#HZ3oJte_}MiI4y1k|2GqqHTT=+&OifUC+?aDJQGAOL+-k*wxA&9Q2OSqMG!J z;|7<`FYe8x6DY;tesnp~{zA(bgS&C!jXNdq%qt1P>zI`zN9`J=lH!d1v;zj`)v<8V ztK^Z9e?G2A(UsG%pvzGd^WF#%-zhHW2gN8I_9RcemgkTp9`P-H_leX&ida%X{C< zR87sF`8D@vcU9lpx6avT?X}n1dpJ#E1gp-yP1vfFD^X1U2mrtHNNl(}NV74)|&J`ss0i3h2cFA0rAqNgNRYq!(gJB@kKS_wl_89f_tSab! zX1bHMm*Tj=r6n&NRL1C2nU1K~u_{gDOB+t>rKHSoPrq|lSq7&@otB$cels_98QGN5 zBMCU>P4^jl%?A5>=l~6B4$v?hcC?dxJ%D0Ggffw696|rN*kc_1_4FT_3kG~S1}*YPtVtz>@x5)a9VMb`v3Uh11LWF+*tjTrt-SWu9Tns z8Qv))8?_DkBCY2h?tT?3RiU7~EhS?J2S+k6i0wtD^}eLcMYYW8Kmu_IIrHD!-Zz(8 zPlA_W@_`^`tN+jDR4AnrXr=@%U;E$ied~ zQHs1K0w(Y=ccQVjD|ti3fmO2S#=M}#G`l3z0@)}CzBP5u) zX>i*RrxG-sX!?cqzrd{1Q;ACtnX$}z!Rt{wP3;38O|U2y zNIy7&Q8<0o+SW3{tzPW70#3@zjUm_7V?Y&=?v{jwgq4=A3=+XET%b=Jwtdqf?cRPC zj*br*f~xp+^L4e|S0fSkJE$Jn9;EtQrgq%SR{nl`D}F)PQsZJLxc=!PHRxJ(K?8OZ zlN;h~Zd=sE&;*h&&=UFYBpuGc-im0Or`!~Go_W5 zuo)27fwJKIc9#tLC1JZ5oTYJv1%yPDwbtZQmM|o6bX{!88!OdG0|%s%_%iprZ_h^Y zVf)P{p#KlHI+uaiS4b$Gz4glWohC%aF`#9@@q^`zMrNC9|M($=?qxL^69_ffI`_&H z2LPIXW4C%D^roGZRZj8U#R7vtBcKiDV!bT$CngtXAl9w)=$Ghwm@cn|8*j348ld-6CRE$E(3x z#QTU$YigQK)BssU`e#8Kb@%#zt8Wy`Gc44=~f&5(*Hq z^6T0H;ag|tGH}S+!oov~8nd#hn)qcvS}`-Lt`%Nwjlh?Ssxw+0A3q)pIkT>;EFK=x z!%KP{^qiz_b|{)+-i(7-lSLhNg76c~1|;#_T}FV2b<+D6bn2Z;^CxE`daYg4YK-w% z&&Zdi$7d|(lNu`FC5SQ9z%CF{C7BbguTRANspqUmK@M~MBzVh7TZT1RcH_u+F6}Em z%Jn9Mb?x{@Y6$IyjRn?m5VO$cUfiOzyI$@q1tTUt&DvNsVuDGkvSt+G)cJ1S!H5P5Km*b$1!=E17*jUsKUV>!H@f(r%?^$Hd!>)m?3l!*#=S33IeZ3q` zKG(M2r+76uIr$-P#F?OxX?=nM?#Y}ODm6S~yimrk!Ir2=E1Nwq+0ScuJxe8gHU%w= z*(8f!_L^{6; zLYXPZEo4O#KZqI=TKpF~DX>L^^V+VHOTo?{-S%iG{}s{bv&nwT+Wqb*myyUbLKg>P zkl_-L5ESx);Ys|Q&Kr9^Uf1)!Z*^VPyGk92P#@WXK65=3>nz$@-rGyXCYQgvE27E1 z6iRw(M4z$MGzFHqa+>z-4Nj_bES_Ym=N2@8++_YoR_(|Oy@ZbQY1cc)U53NSPKFSu z*X^>1=j}E;S(afJ0?I))Fk`we%z!Qg*q%O~Nq}e2a4M6P?FZJ*L=B;RditVvUDpv_8ky9^O*Tuh}JNj9i2oLYH1?ZBETyB!vE~>=4{Ns=L7&J4Y8Bj+F^1tvkd*p z7W=bD%Xc?RWSn)<`AVgdK2HD|`##2Sk8&JvWifk54GpuFRixeFaBfcX#G^a?eMK_0 zy)55>_J}O%h=Hg6I7`O5cu8;HM88+yO5cvp*xnXijvpOP$+MYE$B{E$BEaoM3G)pv zdK>HYB$h%tD~r*x(jBp(Ds;kFs!xzS$uAXu{RSa5U0!)`)_yqCcIbWXVM*{vwEaF! zOv^$C-vw@tx(5s5y)2ZC@8dbXPZB5KH2>DN8lDQT(6)%~D3#Tm|dGGOEyU9-#!W zik#ZC%QA<_NGs^IteW2~Ww&s4nt$5P@2Pcmo8*AE*7TpCe$*-ipD}Bc;N){kqCrSx%}YT z@m{;&Z`_=j=cXIVj5W+OiK9y$Dx7n0aWf8=1CKEV>b$llSW#Eta)cZf7F2F@_yx-Y z1}34xy6TFvRXy~?;Pf&Ru6eSC112W6Eo-ZjV+?KN!YKRGJ6@OU<20pmKpU2)hG_WM z@jep0PqWI3RTtdi3G?ZN>IF;cj>nS? zog9pp`b8Ssg8pUXP5z7-F%wnV0>5jhT35oVgX?_W1NXzgTyDSi)nzNLY_enizJ9#F zM{$b0GGmTv|G1kGm{7-CL4d3MIdJDW0R zCx`5bEw~<2&r-I*a&^OROCu?n0IZk}i);OST_t4Eg06s(Bg+|p(8{sRDYjSM zH1(hr_|Y>>VTWR;o9)n+LIp?hC<`VQ!v4;|OX+c@E&&|v7uks^C7-ckL{i_IzlHqX zQ87SL7~C4`va@lhSp@0A<`;-b+aK)eBeSZ)s>eAyx9XRlVD|Q9lE$EISc`B#F4w!_ zXCp9LJs;}N-$*KGTx(<^sW7{BT=%h~LQ9$qECgts>$yqvye2a^OX@AW2)S5r#PSti zIr4g)_7>usJg}mVkj_mRYK;ugoGw3n{;H?J@NcZvs@T&n$uGd4$=+(tgR1V}4)Dwc z+L?paTJ(zzE^`-v0{c(eaMlg)Y>2X?OieT!Z!}kpp1cGmt zRTpKsF^fx^7?PxM9~GA|*10CFBZ;xw+}m;4{7|f3N+2ii1h)3&#pA%GN?=i0 zw~V^-HYLf(R?a5g@`%hS5@Vwx+1n)1eL#+}Y*oa(5&k{pS@iYeU_O5Ki6XUM3eLQ8 zo;LyXLBHnM+%=>kWSM~#nsZ1iS9Ia)&I560OHejxyLk{bBj!f~P2HiwJQEScfp}U! zlTgB#-#PR6R1aEN@o@%wJ&zxxfznn7>5A{48{sN7K93sZJL;sW(r|%U{Wuk;SDCU@ zd;hWX>y$N5h?Q1jUGYrkU{g)`;8Ok0xf%hgKjYfBof3ykUo8ZOnW&^HoN0Dz`@npC zQA=6L4t{U7XYy>r{h34|eGnLN+X9 zqsdf%;G{vtQ^3!}p|6z|d-+O@X827Xl$TnV^LDS=GwiK(!sU@6Rkrl(>=HI+6m|Sy z&HT(XPB@9t=$V8{{5~rdWB3k*%?~NK2H?OFl{t^{QY#z09O>drH_FGvf>Fe9Sh-m7 zSPgKySM5!e!-_YNG6JD!l8><{#Q#~OReS>cV>J(T^|d3ft5#*B$11Qm-gcpRc1MlW zk&t|K>q{W~olTmW-PsqCMxLEU0JawFQ$Kl9^y+$v?n-D*+;g4^+_;M-7SBF+~+sy1Q*!?$-OJ#o)f5KX!)N z-=s)$Y3+fH7R*HWZTd}tc5woFtGn=Br~1sWO$+u`bNbty@omBO<*Bv6(Mh#@!K=%{ z}81Xr}G zz-}Nv9U*6mHF5C!=W+ZPT!jwWtYQ=FW5b;r3!zwL*4nRoA=RvTsm5AhL1|VB)_mc9 zMaQE`nXfBvrin}VeAX2;)g)IHmC!hGqik3;h(r0+sS|?YK|-YJwhfijkvp4L&AYOw1V1@W>vP zPYYywNs@d6b9H_&_bZ8#Q4Lb&W$`Z@fI?Z zL{0~r%7gj-zaDxC1sj;H+oU{`PrKTnB8~cR8LnxEr0$|$NzpWK+)nB#r!EP`otwe| z_%e|@-6%+b?HKPl9;ZKbrq2mO?k#$XY}ZeFhTk$$!FAj`VESi~jy~Mu*Fx`?J}JiV z4O^Izwvo)Tl_DGc2kk%_?eh9FQMKjnmQJJC%7ZzNqhH7b=^i?9ufiB_(H|C%51mH` z7q9xDvx~eH`}4?D-_Q2tgX89r7i*ELo$Vfprm}<# z+%FG*HklM~u{?dU`-zN9Ckz5?t2Km>9LLk*qUqTe5=5U`!=*ydbr4K0;=st{wY;EF zugh1i)Bn}DWP&uRpt@dw@pV^lzt7Tm$!929Z=~FCbTCt!|sgX-nSlQdujjS^Ef*AItdf$f9pQwt1{v{ zdKzV!{fzkdSbp}`6M^BmVOr_dBarR-1QYy3^xhwa?1W7{o$nihtePz35ZnOokXP6` z*qPec9A+)@nsLqh$BF`ddj7#4#jN& zuXs>F>vRAWZvv7!Ifj2NO1|wk;iVYPPu>24vW+P(Wo4qOix(xy5IX>1U9iFY8$NV~ zK0{*pF_`(4IegJ{mR6&;zo&5S$Obg>h0nk?o+K><>7*2+uQrHO7zo>$9o8DFJutE@ zV8#+vlo2n7(()p+j_AES*~K_b@O6Cm@x}OPM?4U$vu1wXU3vDyBPL8|!p5fL^y1ly zxkOdvmh67loP8vpVI7T$CEe=8YB@Yvw8S=U##OU2?ZZ-GyRyS=` zEv2})l$OI~Z0^vFgL38AJBtRc;x+kCgH~_OWj+)X2I7Mb=w^}3))gL6)GS?}eY1`b zsjjq)IiI1Ggy}#&2Z)}fumsBqYQI97*0CO>)Y?I~$)E>Ea_S zR30LixzLJeLgw^#fluY-<>}h_2m9MBd>@mKntz`Q+1lBl8sG+adD?7NCbPI$et<<; zNxUcFC&*8#=FpQ4YQ0&=Pbky4x^Bkm9T~1^Pp+Tv0I_-jT$9@#aWuhGQUDQB0nr=)M`@X)KP zEJad9htu%>7B{(l6wEy4x`Q1G3tSxgFs_{x&2dL831TStV6~~PSuY7Qkykcf%D!g5 zNBkGR3$B}~jIoQ<%{LD*-TdyGP28b5xdKi}GO#j~)BRnsDTv8)Z<>h<(gYpe$u$~b zxyh%c>4C|-=F;zIV}IgJ_C3l)Z%P}4gj9y|=leLF$pp59BqiB>U+vhY6hNVVfceiM z;LZH!5V-GaKp&`7z~Wf9HLRdQ@uXy6B1$mxzK<0XBU3*B$&~9cllz6f-s_H zcmJH56p`4a^6J%Tpu*qfDDcFSLYaOT|ET5u{0DE`jImRxzvfr{=e1(Cav9liU-aL~ ep+8^T;$8S$ABf40K=1y%;`b8rZ!5$M{r>~_#P6H{ literal 0 HcmV?d00001 diff --git a/install.sh b/install.sh index c5ca0ae..ab31bdf 100755 --- a/install.sh +++ b/install.sh @@ -4,7 +4,7 @@ # sudo ./install.sh --no-deps skip package installation (non-Arch distros) set -euo pipefail -VERSION="1.1.0" +VERSION="1.2.0" MODULE="predator-wmi" SRC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PREFIX="/usr" diff --git a/kernel/dkms.conf b/kernel/dkms.conf index 820f3a8..439c1d0 100644 --- a/kernel/dkms.conf +++ b/kernel/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME="predator-wmi" -PACKAGE_VERSION="1.1.0" +PACKAGE_VERSION="1.2.0" BUILT_MODULE_NAME[0]="predator_wmi" DEST_MODULE_LOCATION[0]="/kernel/drivers/platform/x86" MAKE[0]="make KVER=${kernelver} KDIR=${kernel_source_dir}" diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD index f799951..9cbe9fa 100644 --- a/packaging/arch/PKGBUILD +++ b/packaging/arch/PKGBUILD @@ -5,7 +5,7 @@ # sudo pacman -U predator-control-*.pkg.tar.zst pkgname=predator-control -pkgver=1.1.0 +pkgver=1.2.0 pkgrel=1 pkgdesc="PredatorSense replacement for Acer Predator laptops: performance modes, fans, keyboard RGB, lightbar, battery (Qt app + Plasma widget)" arch=('any') @@ -22,7 +22,7 @@ install=predator-control.install source=() _src="$(realpath "$startdir/../..")" -_modver=1.1.0 +_modver=1.2.0 package() { cd "$_src" diff --git a/packaging/release.py b/packaging/release.py new file mode 100755 index 0000000..7d3b9c1 --- /dev/null +++ b/packaging/release.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +"""Build the pacman package and publish a Gitea release for the current version. + +Usage: GITEA_TOKEN=... packaging/release.py +Requires a clean working tree and the tag v already pushed. +The release notes are taken from CHANGELOG.md and contain the package's SHA-256, +which the built-in updater uses to verify downloads. +""" + +import hashlib +import json +import os +import re +import subprocess +import sys +import urllib.request + +ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +API = "https://git.mrblake.cc/api/v1/repos/MrBlake/Cachy-Predator-Keyboard" + + +def api(method, path, data=None, ctype="application/json"): + headers = {"Authorization": "token " + os.environ["GITEA_TOKEN"]} + if data is not None: + headers["Content-Type"] = ctype + req = urllib.request.Request(API + path, data=data, method=method, headers=headers) + return json.load(urllib.request.urlopen(req)) + + +def main(): + if "GITEA_TOKEN" not in os.environ: + sys.exit("set GITEA_TOKEN") + version = re.search(r'__version__ = "([^"]+)"', open(os.path.join(ROOT, "predator_control/__init__.py")).read())[1] + pkgbuild = open(os.path.join(ROOT, "packaging/arch/PKGBUILD")).read() + if "pkgver=%s\n" % version not in pkgbuild: + sys.exit("PKGBUILD pkgver does not match version %s" % version) + pkgrel = re.search(r"^pkgrel=(\d+)", pkgbuild, re.M)[1] + + arch_dir = os.path.join(ROOT, "packaging/arch") + subprocess.run(["makepkg", "-f", "--cleanbuild"], cwd=arch_dir, check=True) + pkg = "predator-control-%s-%s-any.pkg.tar.zst" % (version, pkgrel) + data = open(os.path.join(arch_dir, pkg), "rb").read() + sha = hashlib.sha256(data).hexdigest() + + changelog = open(os.path.join(ROOT, "CHANGELOG.md")).read() + notes = changelog.split("## %s" % version, 1)[1].split("\n## ", 1)[0].split("\n", 1)[1].strip() + body = notes + f""" + +### Install (Arch / CachyOS / Manjaro) +```bash +sudo pacman -S --needed linux-cachyos-headers clang lld llvm # stock Arch kernel: linux-headers +sudo pacman -U {pkg} +``` +Already installed via pacman? Use the built-in updater (System page, panel widget or `predatorctl update`). + +SHA-256 `{pkg}`: `{sha}` + +Not affiliated with Acer Inc.""" + + rel = api("POST", "/releases", json.dumps({ + "tag_name": "v" + version, "name": "Predator Control " + version, + "body": body, "draft": False, "prerelease": False}).encode()) + boundary = "----predator" + sha[:16] + mp = (f'--{boundary}\r\nContent-Disposition: form-data; name="attachment"; filename="{pkg}"\r\n' + f"Content-Type: application/octet-stream\r\n\r\n").encode() + data + f"\r\n--{boundary}--\r\n".encode() + api("POST", "/releases/%d/assets?name=%s" % (rel["id"], pkg), mp, "multipart/form-data; boundary=" + boundary) + print("Released", rel["html_url"]) + print("SHA-256", sha) + + +if __name__ == "__main__": + main() diff --git a/plasmoid/org.predatorcontrol.panel/contents/ui/main.qml b/plasmoid/org.predatorcontrol.panel/contents/ui/main.qml index e2f98b2..417ae62 100644 --- a/plasmoid/org.predatorcontrol.panel/contents/ui/main.qml +++ b/plasmoid/org.predatorcontrol.panel/contents/ui/main.qml @@ -72,6 +72,7 @@ PlasmoidItem { ? profileLabel(st.profile) + " · CPU " + temp(st.sensors.cpu_temp) + " · GPU " + temp(st.sensors.gpu_temp) + "\nFans " + (st.sensors.cpu_fan || 0) + " / " + (st.sensors.gpu_fan || 0) + " RPM" + "\nBattery " + batteryText() + + (st.update && st.update.available ? "\nUpdate " + st.update.latest + " available" : "") : "Service predatord not running" P5Support.DataSource { @@ -352,6 +353,27 @@ PlasmoidItem { } } + Kirigami.InlineMessage { + Layout.fillWidth: true + visible: root.ok && root.st.update !== null && root.st.update !== undefined && root.st.update.available + type: Kirigami.MessageType.Positive + text: root.ok && root.st.update ? (root.st.update_status === "running" + ? "Installing update " + root.st.update.latest + "…" + : "Update " + root.st.update.latest + " available") : "" + actions: [ + Kirigami.Action { + text: "Install" + icon.name: "update-none" + visible: root.ok && root.st.update && root.st.update.can_install && root.st.update_status !== "running" + onTriggered: root.run("update --yes") + }, + Kirigami.Action { + text: "Details" + onTriggered: root.openPage("system") + } + ] + } + PC3.Label { Layout.fillWidth: true visible: root.lastError !== "" diff --git a/plasmoid/org.predatorcontrol.panel/metadata.json b/plasmoid/org.predatorcontrol.panel/metadata.json index dd26946..bb0e1a0 100644 --- a/plasmoid/org.predatorcontrol.panel/metadata.json +++ b/plasmoid/org.predatorcontrol.panel/metadata.json @@ -12,7 +12,7 @@ "Id": "org.predatorcontrol.panel", "License": "GPL-2.0-only", "Name": "Predator Control", - "Version": "1.1.0", + "Version": "1.2.0", "Website": "https://git.mrblake.cc/MrBlake/Cachy-Predator-Keyboard" }, "X-Plasma-API-Minimum-Version": "6.0", diff --git a/predator_control/__init__.py b/predator_control/__init__.py index 012ec92..573d4b3 100644 --- a/predator_control/__init__.py +++ b/predator_control/__init__.py @@ -2,7 +2,7 @@ import os -__version__ = "1.1.0" +__version__ = "1.2.0" APP_NAME = "Predator Control" RUN_DIR = os.environ.get("PREDATOR_CONTROL_RUN_DIR", "/run/predator-control") diff --git a/predator_control/cli.py b/predator_control/cli.py index e68519e..3ddfc2c 100644 --- a/predator_control/cli.py +++ b/predator_control/cli.py @@ -61,6 +61,10 @@ def main(argv=None): sp = sub.add_parser("battery-limit", help="80 %% charge limit") sp.add_argument("value", choices=["on", "off"]) + sp = sub.add_parser("update", help="check for and install updates") + sp.add_argument("--check", action="store_true", help="only check, do not install") + sp.add_argument("--yes", "-y", action="store_true", help="install without asking") + sp = sub.add_parser("open", help="open the main window") sp.add_argument("page", nargs="?", default="home") @@ -139,6 +143,21 @@ def main(argv=None): if a.sync: args["sync_keyboard"] = a.sync == "on" c.call("set_lightbar", **args) + elif a.cmd == "update": + u = c.call("check_update") + if not u["available"]: + print("Predator Control %s is up to date." % u["current"]) + return 0 + print("Update available: %s -> %s\n%s" % (u["current"], u["latest"], u["url"])) + if a.check: + return 0 + if not u["can_install"]: + print("Automatic install needs the pacman package. Update with: git pull && sudo ./install.sh") + return 1 + if not a.yes and sys.stdin.isatty() and input("Install now? [Y/n] ").strip().lower() not in ("", "y", "yes"): + return 0 + c.call("install_update") + print("Installing %s in the background (journalctl -fu predator-control-update)." % u["asset"]) elif a.cmd == "battery-limit": c.call("set_battery_limit", enabled=_bool(a.value)) except DaemonError as e: diff --git a/predator_control/daemon.py b/predator_control/daemon.py index c0390bd..ff4cb71 100644 --- a/predator_control/daemon.py +++ b/predator_control/daemon.py @@ -24,6 +24,7 @@ import traceback from . import CONFIG_DIR, CONFIG_PATH, SOCKET_PATH, STATE_PATH, __version__ from . import hardware as hw +from . import updater from .keyboard import EFFECTS, NUM_CELLS, Keyboard DEFAULT_CONFIG = { @@ -47,6 +48,7 @@ DEFAULT_CONFIG = { }, "battery": {"limit": None}, # None = leave the firmware state alone "keyboard_presets": {}, + "updates": {"auto_check": True, "interval_hours": 6}, } @@ -93,6 +95,9 @@ class Daemon: self.state = {} self.battery_limit = None self._ticks = 0 + self.update_info = None + self.update_error = None + self._update_checking = False # ---------------------------------------------------------- Configuration def _load_config(self): @@ -230,6 +235,9 @@ class Daemon: "lightbar_effective": self.lightbar_effective(), "fan_curve_applied": self.curve_applied, "battery_limit": self.battery_limit, + "update": self.update_info, + "update_error": self.update_error, + "update_status": updater.status(), "available": { "keyboard": self.kbd_present, "wmi": hw.wmi_available(hw.GUID_GAMING), @@ -241,6 +249,34 @@ class Daemon: } return st + def check_update_async(self): + if self._update_checking: + return + self._update_checking = True + + def work(): + try: + info = updater.check() + if info["available"] and (self.update_info or {}).get("latest") != info["latest"]: + log("Update available: %s -> %s" % (info["current"], info["latest"])) + self.update_info, self.update_error = info, None + except Exception as e: + self.update_error = str(e) + finally: + self._update_checking = False + threading.Thread(target=work, daemon=True).start() + + def maybe_check_update(self): + u = self.config.get("updates", {}) + if not u.get("auto_check", True): + return + last = (self.update_info or {}).get("checked", 0) + if time.time() - last > float(u.get("interval_hours", 6)) * 3600: + if self.update_error and time.time() - getattr(self, "_last_try", 0) < 900: + return # offline: retry every 15 min + self._last_try = time.time() + self.check_update_async() + def loop(self): while True: try: @@ -261,6 +297,8 @@ class Daemon: self.last_ac = ac self.fan_curve_tick() self._ticks += 1 + if self._ticks % 20 == 1: + self.maybe_check_update() if self._ticks % 40 == 0: self.refresh_battery_limit() self.state = self.build_state() @@ -279,6 +317,17 @@ class Daemon: if cmd == "state": self.state = self.build_state() return self.state + if cmd == "check_update": + self.update_info, self.update_error = updater.check(), None + return self.update_info + if cmd == "install_update": + info = updater.check() + self.update_info = info + return updater.install(info) + if cmd == "set_updates": + merge(self.config["updates"], {k: a[k] for k in ("auto_check", "interval_hours") if k in a}) + self.save_config() + return {} if cmd == "restore": self.restore() return {} diff --git a/predator_control/gui/app.py b/predator_control/gui/app.py index a95e132..df79a02 100644 --- a/predator_control/gui/app.py +++ b/predator_control/gui/app.py @@ -4,9 +4,10 @@ import argparse import os import sys import threading +import time from PySide6.QtCore import QObject, Qt, QTimer, Signal -from PySide6.QtGui import QColor, QIcon +from PySide6.QtGui import QColor, QIcon, QPalette from PySide6.QtNetwork import QLocalServer, QLocalSocket from PySide6.QtWidgets import (QApplication, QButtonGroup, QCheckBox, QComboBox, QFrame, QGridLayout, QHBoxLayout, QInputDialog, QLabel, QListWidget, @@ -673,6 +674,29 @@ class SystemPage(Page): self.fw_card.body.addWidget(_muted("Values are stored in the laptop firmware (EC/BIOS).")) self.lay.addWidget(self.fw_card) + upd = Card("Updates") + self.upd_head = QLabel("") + self.upd_head.setObjectName("big") + upd.body.addWidget(self.upd_head) + self.upd_text = _muted("") + self.upd_text.setTextFormat(Qt.MarkdownText) + self.upd_text.setOpenExternalLinks(True) + upd.body.addWidget(self.upd_text) + h = QHBoxLayout() + self.upd_check = QPushButton("Check now") + self.upd_check.clicked.connect(lambda: (self.upd_check.setEnabled(False), win.backend.run("check_update"))) + h.addWidget(self.upd_check) + self.upd_install = QPushButton("Install update") + self.upd_install.setObjectName("primary") + self.upd_install.clicked.connect(self._install) + h.addWidget(self.upd_install) + self.upd_auto = QCheckBox("Check for updates automatically") + self.upd_auto.clicked.connect(lambda v: win.backend.run("set_updates", auto_check=bool(v))) + h.addWidget(self.upd_auto) + h.addStretch(1) + upd.body.addLayout(h) + self.lay.addWidget(upd) + svc = Card("Status") self.status = _muted("") svc.body.addWidget(self.status) @@ -728,7 +752,37 @@ class SystemPage(Page): box.setChecked(bool(info.get("value"))) box.setToolTip(info.get("error", "") or "") + def _install(self): + u = self.win.state.get("update") or {} + if QMessageBox.question(self, "Install update", + "Install Predator Control %s now?\n\nThe background service restarts briefly; " + "reopen the app afterwards." % u.get("latest")) == QMessageBox.Yes: + self.upd_install.setEnabled(False) + self.win.backend.run("install_update") + def update_state(self, st): + u = st.get("update") or {} + status = st.get("update_status") + self.upd_check.setEnabled(True) + if status == "running": + self.upd_head.setText("Installing update…") + self.upd_text.setText("pacman is installing the new version.") + self.upd_install.hide() + elif u.get("available"): + self.upd_head.setText("Version %s available" % u["latest"]) + text = "Installed: %s · [Release page](%s)\n\n%s" % (u["current"], u.get("url"), u.get("notes", "").split("### Install")[0].strip()) + if not u.get("can_install"): + text += "\n\n*Automatic install needs the pacman package – otherwise run `git pull && sudo ./install.sh`.*" + self.upd_text.setText(text) + self.upd_install.setVisible(bool(u.get("can_install"))) + else: + self.upd_head.setText("Up to date" if u else "Not checked yet") + when = time.strftime("%d.%m.%Y %H:%M", time.localtime(u["checked"])) if u.get("checked") else "–" + extra = "\n\nLast update failed – see: journalctl -u predator-control-update" if status == "failed" else "" + err = ("\n\n⚠ %s" % st["update_error"]) if st.get("update_error") else "" + self.upd_text.setText("Installed version %s · last check %s%s%s" % (st.get("version"), when, err, extra)) + self.upd_install.hide() + self.upd_auto.setChecked(st["config"].get("updates", {}).get("auto_check", True)) a = st["available"] yes = lambda v: "✔" if v else "✘" lines = ["%s Service predatord %s" % (yes(True), st.get("version")), @@ -833,13 +887,17 @@ class MainWindow(QMainWindow): if self.stack.currentWidget() is not bat_page: bat_page.indicator.set_battery(st["battery"]) # keep the power history going s = st["sensors"] - self.footer.setText("%s\nCPU %s °C · GPU %s" % ( + u = st.get("update") or {} + badge = ("⬆ Update %s available\n" % u["latest"]) if u.get("available") else "" + self.footer.setText(badge + "%s\nCPU %s °C · GPU %s" % ( PROFILE_INFO.get(st["profile"], (st["profile"],))[0], s.get("cpu_temp"), ("%s °C" % s["gpu_temp"]) if s.get("gpu_temp") else "off")) def _done(self, cmd, result, err): if err: self.statusBar().showMessage("Error: %s" % err, 8000) + elif cmd == "install_update": + self.statusBar().showMessage("Update is being installed…", 8000) elif cmd == "get_firmware": self.pages["system"][0].firmware(result) self.pages["battery"][0].firmware(result) @@ -860,6 +918,9 @@ def main(argv=None): app.setDesktopFileName("predator-control") app.setStyle("Fusion") app.setStyleSheet(theme.QSS) + pal = app.palette() + pal.setColor(QPalette.Link, QColor(theme.ACCENT)) + app.setPalette(pal) # single instance: forward the requested page to a running window name = "predator-control-%d" % os.getuid() diff --git a/predator_control/updater.py b/predator_control/updater.py new file mode 100644 index 0000000..916bfd9 --- /dev/null +++ b/predator_control/updater.py @@ -0,0 +1,123 @@ +"""Self-updater: checks the Gitea releases for a newer pacman package and installs it. + +The release must carry a `predator-control---any.pkg.tar.zst` asset and its +SHA-256 in the release notes. Downloads are verified before `pacman -U` runs. +An optional API token (for private repositories) is read from +/etc/predator-control/update-token. +""" + +import hashlib +import json +import os +import re +import shutil +import subprocess +import time +import urllib.request + +from . import CONFIG_DIR, __version__ + +API = "https://git.mrblake.cc/api/v1/repos/MrBlake/Cachy-Predator-Keyboard" +CACHE_DIR = "/var/cache/predator-control" +TOKEN_PATH = CONFIG_DIR + "/update-token" +PKG_RE = re.compile(r"^predator-control-[\w.+]+-\d+-any\.pkg\.tar\.zst$") +UNIT = "predator-control-update" + + +class UpdateError(RuntimeError): + pass + + +def parse_version(v): + return tuple(int(x) for x in re.findall(r"\d+", v.lstrip("v"))[:3]) + + +def _request(url, binary=False): + headers = {"Accept": "application/json", "User-Agent": "predator-control/" + __version__} + try: + with open(TOKEN_PATH) as f: + token = f.read().strip() + if token: + headers["Authorization"] = "token " + token + except OSError: + pass + try: + with urllib.request.urlopen(urllib.request.Request(url, headers=headers), timeout=30) as r: + data = r.read() + except OSError as e: + raise UpdateError("cannot reach the update server: %s" % e) from e + return data if binary else json.loads(data) + + +def installed_as_package(): + """True if the app was installed through pacman (only then can it update itself).""" + if not shutil.which("pacman"): + return False + return subprocess.run(["pacman", "-Qq", "predator-control"], capture_output=True).returncode == 0 + + +def check(): + """Return information about the latest release.""" + releases = [r for r in _request(API + "/releases?limit=50") + if not r.get("draft") and not r.get("prerelease") and parse_version(r.get("tag_name", ""))] + if not releases: + raise UpdateError("no releases found") + rel = max(releases, key=lambda r: parse_version(r["tag_name"])) + latest = rel.get("tag_name", "").lstrip("v") + asset = next((a for a in rel.get("assets", []) if PKG_RE.match(a.get("name", ""))), None) + sha = None + if asset: + m = re.search(re.escape(asset["name"]) + r"\W+([0-9a-f]{64})", rel.get("body", "")) + sha = m.group(1) if m else None + return { + "current": __version__, + "latest": latest, + "available": parse_version(latest) > parse_version(__version__), + "notes": rel.get("body", ""), + "url": rel.get("html_url"), + "asset": asset["name"] if asset else None, + "asset_url": asset["browser_download_url"] if asset else None, + "sha256": sha, + "can_install": installed_as_package() and bool(asset and sha), + "checked": time.time(), + } + + +def install(info): + """Download, verify and install the package in a separate systemd unit. + + pacman's post_upgrade restarts predatord, so the installation must not run + inside the daemon's own process. + """ + if not info.get("available"): + raise UpdateError("already up to date") + if not installed_as_package(): + raise UpdateError("not installed via pacman – update with git pull && sudo ./install.sh") + if not info.get("asset_url") or not info.get("sha256"): + raise UpdateError("release has no verifiable package") + os.makedirs(CACHE_DIR, exist_ok=True) + path = os.path.join(CACHE_DIR, info["asset"]) + data = _request(info["asset_url"], binary=True) + digest = hashlib.sha256(data).hexdigest() + if digest != info["sha256"]: + raise UpdateError("checksum mismatch – download rejected") + with open(path, "wb") as f: + f.write(data) + subprocess.run(["systemctl", "reset-failed", UNIT + ".service"], capture_output=True) + r = subprocess.run(["systemd-run", "--unit=" + UNIT, "--description=Predator Control update", + "pacman", "-U", "--noconfirm", "--needed", path], + capture_output=True, text=True) + if r.returncode != 0: + raise UpdateError("could not start the update: %s" % r.stderr.strip()) + return {"started": True, "package": info["asset"]} + + +def status(): + """State of the installer unit: 'running', 'failed' or 'idle'.""" + r = subprocess.run(["systemctl", "is-active", UNIT + ".service"], capture_output=True, text=True) + s = r.stdout.strip() + if s in ("active", "activating"): + return "running" + if s == "failed": + return "failed" + return "idle"