From 068c0f6f9e3adbfadf0a7c14a01a557fd30db69b Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Thu, 14 Sep 2017 19:34:18 +0200 Subject: [PATCH] Refactor for full Windows compatibility --- .gitignore | 1 + bin/windows/.gitattributes | Bin 0 -> 9 bytes bin/windows/ProcessWrapper.exe | Bin 0 -> 75776 bytes bin/windows/ProcessWrapper64.exe | Bin 0 -> 79872 bytes composer.json | 3 +- examples/basic-command.php | 3 +- examples/ping-many.php | 34 ++ examples/watch-live.php | 3 +- examples/write-command.php | 3 +- lib/Internal/Posix/Handle.php | 33 ++ lib/Internal/Posix/Runner.php | 162 +++++++++ lib/Internal/ProcessHandle.php | 24 ++ lib/Internal/ProcessRunner.php | 55 +++ lib/Internal/ProcessStatus.php | 12 + lib/Internal/Windows/Handle.php | 41 +++ lib/Internal/Windows/HandshakeStatus.php | 15 + lib/Internal/Windows/PendingSocketClient.php | 12 + lib/Internal/Windows/Runner.php | 168 ++++++++++ lib/Internal/Windows/SignalCode.php | 13 + lib/Internal/Windows/SocketConnector.php | 331 +++++++++++++++++++ lib/Process.php | 328 ++++++------------ lib/functions.php | 5 + 22 files changed, 1004 insertions(+), 242 deletions(-) create mode 100644 bin/windows/.gitattributes create mode 100644 bin/windows/ProcessWrapper.exe create mode 100644 bin/windows/ProcessWrapper64.exe create mode 100644 examples/ping-many.php create mode 100644 lib/Internal/Posix/Handle.php create mode 100644 lib/Internal/Posix/Runner.php create mode 100644 lib/Internal/ProcessHandle.php create mode 100644 lib/Internal/ProcessRunner.php create mode 100644 lib/Internal/ProcessStatus.php create mode 100644 lib/Internal/Windows/Handle.php create mode 100644 lib/Internal/Windows/HandshakeStatus.php create mode 100644 lib/Internal/Windows/PendingSocketClient.php create mode 100644 lib/Internal/Windows/Runner.php create mode 100644 lib/Internal/Windows/SignalCode.php create mode 100644 lib/Internal/Windows/SocketConnector.php create mode 100644 lib/functions.php diff --git a/.gitignore b/.gitignore index ae40550..426d796 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.idea build composer.lock phpunit.xml diff --git a/bin/windows/.gitattributes b/bin/windows/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..556f8c827b8e4a02ad5cab77dca2bcb3e226b0b3 GIT binary patch literal 9 QcmdN=NXpDhEUM%J01cx8+5i9m literal 0 HcmV?d00001 diff --git a/bin/windows/ProcessWrapper.exe b/bin/windows/ProcessWrapper.exe new file mode 100644 index 0000000000000000000000000000000000000000..df431cc4cf85e929005791a0e4308baa8a379d34 GIT binary patch literal 75776 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 literal 0 HcmV?d00001 diff --git a/bin/windows/ProcessWrapper64.exe b/bin/windows/ProcessWrapper64.exe new file mode 100644 index 0000000000000000000000000000000000000000..ffd0dc59315a3de81d3b9843ffcc60807bdcaf02 GIT binary patch literal 79872 zcmeFacR*Fg(>J~}#e$%675h~|v7^`!3s=A#6chz}0fdX7G~uGyQACB~RqVa@*h>^k z6hs9C6?=_hzlIc(ZxTxq_xG7S_bO`g&GS6(^ZxOB-sdFe?4H@(+1c6I*_qjM(Qilw zvtW!_;^v&OOr&&qi03~%%owXw?^q>vsN9A6nP$Eh>IX(dCaB}$V@Jh@M5{wXVq#)- z>XBM?d}53`GDhvyCqNw?8>Ve(V^iMIh&pudl6#FW{yyJyw>%s%zZu?rmb{(kB+}Q$ z^xeD;;+@Z<^0%#B<~Kmv_~P67Q;`0;?Lc!DwtPdtT`Zd7$mNHttcUD(1(;Iqm-D5%Yp?@ zH#IW01yn&|N~oR@LRt1p0AqQS$zW{zJ*07rb*2e2U2$g23wak`QDlOCmaa$n;?htL z#tfkM@2-|QZITX!*3IxBf@tixMzfzTuMLmy}qrxM@5*VvZMaj4c-vHdDE)S{~ zpAa7knBZLoGWT&0!d>d}5cRZCv8YJAWZW<3I=>E9(|Xp(I8 zvJVp1Gg6wDW0EA_&h>H>qAtlk*1meY9Ge<$naowKTQioLrE`$0N_v~`T){&*%kZQo zW3E{*{zaJ54mmDI>iU~oyB3%tDeZ*gdc5o0Y>(Jf1VBHvc4l<|!qL$n^h@(-Ysb=b zj>Bv#dpQPk)qO}5l@5{gfsTVpTr+95PuUsUNN7{opE21w&DYTvNRQx!t9BS0^`u6q z)63f1HD3Z&7cV)NQfGRoxym0EC0QX#k`-c8UUOX)F`^+DkwGPfQ_`5LTv54;Yh#eF z@{%niy=pYdU|wOyySC|d|m#XtFoYjKxblo zu3Cevw|o)g{N9Gh@so26^_3|Y2ZFrht10iSZD%|NcKMwAE~U7v?ZEGwy$-jHeX2Q5 z%(SgH6Hh{N-dpc!=4X+mk*`V?S2X%wT(Zdbv&h$^oVE_{ZX4r!mZ64axNVHrb%uJ# z1YTeoeSig(4x?-@^Kjddx4iYetO(?F7S-|rxeR@+tD)}G< z5=p_U8kppiGlMiinh`-GhAWal(m?Wn^_Bs~Ll%;uqlGNYbW9cyT5|r#p-@?J{>CMD zvPG#S7lMvy$&D3#zu1ZTvP~Xzri4YBM60)>Y+<`M8;ipO2wiB4I)@T7DKt;AusKFG zQ6_QKKqz@zJ5-UY(gGhO=gskQoSgl_L35O3WR9=n1UWDJg&i^znV0o<5HRHm<;5^r%Mho&6uIhuVvbg)Zh{b)Q8X*%rI*u|ZwiL0dFfa`S zEWt_01cYEX)vs!Jrg~prR_X_!zDe;(@?=NJ_HfzG<~m2AV#cGDm+i?c!=4ZA0+e=D z(a!d8AG4YHI!*GMvQsKcwkNZF^){C681s`WW|x%3%QDd`Fl2*-m3T2|KOicvAUY4G z8mWXzHR)uH{2L8_P&fo5*t`tM8_l%0d$vv`NSh1AVyG^#f#?!nDbyy~A7ixem9rsJ zlD?0*6j~%%s8RqmggXkkRGJPZLhjiUC#Y#!~9b(l6;A)#=yX!o~%Zq zx-wxPLUWYriJ39vza`1h*n0g&nom*BAJnz4V;qUjVlhLj9k)|6Md4~jK;yb*NwR%* z%0xT!$rUA@C8fN!nEbtKR*sN8lneRlFBGzVmt!)zB2mK)eeuaAA@S{m8Y4j57wphzQM@=ndy)%1}AtZnPT zSdrWoUl;@|y0Sc5+l1MY)%(r_MCcdTC0IFkR892ooWR zK+g)2^MvGlVx%VJtw%zr2?>>Z$xDb%4L|LbCUPZSDX+~EyJ_THZ&(2KgiFqo+yVh;u#FKJd^ zeJWAynlBbASDkc*u-w8bwVl}oaN=uY8kPLYN9I!}fWJ}-x0n)#DSD@@Z75Ez+KXlc z0*#doU;eI4$VRY}7nHb@Zk6;)s2{FM{ZP}!5G({wHyO25##%%fR|TO~YF1($eoo@K zsduNPW5Nv!6$O`C^Bw2d0(_*eLwPPlMA@xXTj~Sk$XslB_KYm?V8Mx(iN1F^o>Vn^;DY z`&gG)NV2WBYnBGG$W`-|Qcqe(xpuUaGIM(bM*yX9i>M@}&D$q>=BuVcK8*&RXHa9{CFb%wMZiX*n7ZStJNsns1%R99FN4A!{*CO8A;1%gXlwFtpJcAh}CP;(}#xmIx!eEbWsH}Z*XsP-j+SvTDX(c97 z*R-^h&WuEudekW51ftYjbwF^AC(h@pFMtorAQ@W`7zoZigR@WlaaCIsDZC0MUbO&A zef7f}p<#wP_{a%rANg@mj##n_(c1964Oo7btA1@DF!lzlWS9J|`j zy*sKZ{Ol-O+4(Sb^f#zMeP<5~uyZmH$(JPg7FW4}U>cB%1g5DmbdXp?u8dqD$uGG| zgR0O<4qP>!8qvb;K{VCCU`Qc>lP>NzbycZ}-X?&Gx`JF3wUn)vOF);_ZZ{HrMGq-7 zTe3KpX0ud4t+pW%tV^?5Ob~FpBXOgiExioGJVR&(L1;V_p)m~>DF#Vy&K3=78rPF+ z)*M(}a%EDfmf^Myeu%mctYY2jIc z6^2beW9v4F^emdclrw`qU*AU83lv*b{y>w5E0^?;5-<6c{GkB$ww!F zj?Rh{YUGPtwMVTeeS5CTK~~IJo2D3zwjy!%L3l=~{#T#|^g@jkY>X_iEzdRKzbodZ z#F49}q6((Bq#Rczi0oMi!Tu(M*-!;2Ne#japt%dh)RQFpLz10+*n|2P zBP>vO><^(HzfbA%z#AQj$N?E%FNrjLVv;ZN#1PF%bON*5`=u}0Vt~Mc)5!cNZCqSc zf?kgS2;<=*mRDLwFMW3_ue2oS#|#unX|SDyp+RV*w7Ot7rWe-5`6 zC!nm!pi{eEan0u{n|fgK6-n>6UXz&z@(Vo6M-@1JfyXNt4<(pM%zC0 zcQ&#@0^*!8%uw*)1sUU#zCYA1s;)pe);DS{Gu4ctnr>9H5o&t5O^LHjtxauYRe={Z z^)3=B7{nUzLWUI9nTN05+kjczM^$Lu(STgAlAJMcYf>)67sN&0ci70(p;aSvm{$%R zeuX-c><7J68HLEL=c=+wE|aVNtRrBU?|&iZC3_dcP5BP?1}Y{U!!$C(BcmM_B@lUo znb6_HN`J65^$iR`VzcWN!Cgs~tR>ldJ2|Ss$|weL)jHq?xe-JzHIIO)o+0v9j^MQ< zrzYdg^@_k$8qYq$lceB@gWpSdypzE=pz%uvmgNeT`>zC+Ie(2MOG@+0ASB*%xT>l$ z;v$;ZwAA%z!Br0soutXF##K*{6_Z;+9Gqp1ePJAU0g>+y0)9X#rWW;1d{l1))$0xR z#eschCiYnZxnYxHoVJ$qdK$8!s$i$CJ~5ayD_89YMQB-4Rcue8*vJgM%i@s_q`t5z zX_1g^Nef4Wp2WL;JFt<0=#E*2O-U<0Xy|a0M)-LDQo{i7kzXDqieOg=7TgfA0$({x zl3#OGXTY$yTf$F(0?^xR#_&sYQraZzOlkyA5KoZt-Z)D+qYlauo?%}!Jxaw~)zyfZ zqJ$>Qj|9(j^~nR-n&xRI@DbwAkm+rD6Vv;ap^o5kzD7$?iPRw(grZMn(?UE32Cf(u zgm)`yrdjAEKK;!*Sn=a4D4n4G&>W$zYzXmdY(PLIpdYsnr}m!qsaew$?e?1!@gLPo z;VHFQBI}!`QHw$&!-?O*^ita%HusTlLC1D(kyxu^ceBK5$xtMTb|Mx^!x1(uct=(i zMK?N|S(- zz;te5o7xU3$h1vuPI9I1X%2;73FG%kgKVBfY!a?5C@XL?QC1(6L1sW1c8kP#gyg&^ z#$o0o=lJ~teU;&ozNhcS6pX_s^fZy^qqih%x@bxEuqL$SGfDZpSVL71;MCj5*vfd( zi@5-t!zs&utUvJMLw_Z9A9t2mRl(fE5tDrn-NC|gLI1E6t`Z5bPi>s2EK4b~_tk%a zz?6-dpyYk*kY-VFSKd!8qg)fHQKA=+THnxbVY&E)7C|Sa6mTE;dq4St zr{1!uZ|F-u_aCM-hkx8hwuCjA^FH2*Io2e1h8^>pl#*@k!(sR3`C*oC`dFNoY`bII zIgQ|@M*h`TE~d!=ntmGhU#FHiS5^(@_gvWqc>2ipKN{r+Hc4{lnk?~^uS~1hFa(~b zWbr$B%4enA99R+D*v9>b$%oIC#VnjDu>j{uf?<_Kk)f|cfC{ULOcBj+&9Kr&C5<0L z7yg>Bqcvjbfku-~?fRQ<=v&vUw04>JSba^M2s;d| zC!fI_?rwm2H2|zQoES?~sj&8=?|a zS3;Ut6Z>Ey@L}Ebu1|^015A`*A{4({I|I!bNz(5qGEj_PK36i=t=$QN(?N^{Q8Gfn zUyQ}TMc_?7_d<(&DU~DXt)_Qn%%t8SUxAKxzAy?LgrOZUfZP;F?_08ugP|7<=Yha@ zkfNs5522Q^qF0fXlXAu-XoM+rD|(@+Qbd*F2kQ5;1#{EjEB}n(fnfp=QZ;9+e1rtv zdpFp(<=4P1rR1B#ZUlZ!N+FkDQ!G&WL*xEOqLl{1Gh7P2BtdQ=82(&kk1Ya57p?gY zKC&%VmTzblsTAsfXeILovxZIOHmV9-XK0VEBy6m25Jn`V7O?m}l}LmQB4~s{EQh_< z&yd1TmwFn7d?foDYGCrL18 z)P|Fg3WBM59)k5gnGD+vrWCSZSy|DKwuh~g->An|L0CB7$97X*f;Furo>%frl5Jj* zMokN_!?+RO7Li!=FT4fO9ql*rJs;HYOY?N_OY5bk-4C;D^(zjwjQ*OxYZf;7G|xO7 zmq0F@HNxKqpxE__kKVKRC_@kmudw<$h%N#VKS;fj*vJ=762@WkHEd#-@>j%IC@28q z;wcRx0PO@ryyP6i;?k|Ry>Ctar899=ZPGuo zjTwy^TVFWhg%lryD72R3LEr**bV~|lr{2}o6IKdW-NQSnD!r5ZLK7%3Q0Zc%e%~=s*C5<7`?+;UDy?yUmU^jQyNgMas^$3xAc( z`Ok^wKj%o<`F1Z3!s5gnC^my|X$>{u=NP)dOoPYfMfq4f$cwlHt4&l%voQ3sWNc=Z zF4QoDY&5;iIwXd!W$^eD540?f2NODN23VpcM?8(3xw# zp(zqWDjwKA4dX?6%g_s{Fl4Kv;_{cA%ePR~imHAK8o-#c=&l3aJ!bxvXeH{qUfFLZ z>ChDOQciKfTI8V^Z-*r3+4ay89kUns|tXNSOnqV?s zxd8knu^%d+BlffVt&xXXgIdgjBv{4JyKI$9Nt#thRHvFA$ae-P*QyF2)N8I)MdWCv zbFHcwbD5X}CXLCWS+7Jbb1ltiHb1~+oAx-h0+p6(6A(tOO%oFk4Ye>!3}g^sTpelE zdMG=c2RMOvw1{gRd=0Fw*z2+=Y!fU|z~(xYV6bjdN|<9ukU&l+6m+mJoI9`uCL1FA zbS8xtXYvi98MtaGn(^EeZa#TGI`lB^kzzi6R~Bb|tt4AIVL0G~WL;tYOTPZbzp zod}pE!7dA!?c%JGQHVSoZGrs&T2VfI)B{*jin}$-+h^u;HP6@ev~LJt1Z}XJ};|mvj%WeofRTq*=7S$Wp4&6hvyu{SeYS0QKh7p9B?$5={E#l zjJR2~xWIYhWGU1t7#S#oIwGlPH{Fds^hz9=Spn_B-82q~1AUvFwmqV;$9aW=WKo1{ z88{HhzWR#ir8Ij-ANR}n!lh?LU-#_z@^W`;i)>$~pPD7vdLee4ZNw+!aT_g)SGQ_qy}AXXL+oinh>h~0mQu71Ogi3X=#fIgL^AvBgbMS^xKx@jshI&R`@26JY{i)1b4S*d!%uq|N z$h&&mNv_$_QBZ*kh#TU?)zq1L4k(7HXVqVHJq*h2RS{k(&Q60E{{CDylX(cM79&n0 zEyJC@MDK-#r}2Qzn+lk+XZ`*QDFJIs!!z`UjJYyq*DNw{TTDwiS3jq{jV46cGW% zm$r)$Z-ALcoo+w{(tRFWwH8^jY=663E33YhnzXdM+OY_1qKFa_5l_M~ys#svu_HBx z4n-?kIvtD)*evm9DOA&0vdEs^QLNa5hSlH_2SSWTAH`su}Qqn_dWjd8Zq-!P9AW;(@Kcg`_X z20K2nTOg-(s=*gV48;~n32Xv)3BDXw*d;?G`r|jnLALw-_@|0RUplt*u?uGljBIxFUl?M7JaxmI2AN;9aL{xU|Vjq;Mu zYo`Ac8Kd>_lCOAI$dj*5|M?4TOrn>3%d5h9;Tvcm^wWO|)%bZ$|Cc6F7onN{vo=N- zsi|)H~+h8`CN-a@(4yBpcfLL1pVi5Dh%l+15MtFNzCdPHBxOHROBJAO z`ood%wsS1gxlCdk*~-uet0K=j*XkxR5E}NIw?Um|bs2BEswsKuT&t7FLgHDP)d}Qa zOu#S`AxGmHaI?w;9I`8%2ktZjW8qFS#S3vcM25GuHs4G@mybqHX&v0 z`pKG(l6>ArzHG3;AWgod@Ps@9yk!STzN1Nb{MuK}*ZjsTedWu#sv5-N{6hULU)}Px zxD3D6x8Y?(6no0{;H;+|MfxpzS^uW7u+>$xJ*=@vDSjy}_qBlefNt`KzSx12zC!La z5mbOrc*2DF~Bwv=T4f|mEW+>Z5AxcGwYyR|(n58V+#o2N; zW(H&VfAZQsP#N|iV_IlT?-^5rF*P5g)Uz|Djf`n0W7^Z04l+?ZA|rV2KE z0&eVgp)oyVObd;vi?RQ3<9jFLyQzJ9BRoL?B*z-lD#jEW6J5z(#(K12(L1RSN|zba z-p2Ck#`osNcPvx7lEo8`w???>{oGI`=LkEPu9wDggE2KX!j)32XJdWS`}R-DpBc-| zjq^~`_?~1;n;YRV#`o98_BV`aBO|=7v0kw8{e-c6hVgy5@qLyt?Pr9yHKv`7sfo@T z#&<7c8f9$P-k4S~;W4JBcExR(2W>P(os`rB@7VI=cN1LKLV-K~O}VMwr|J4&rJYBJ zk_IG(hH4WMSU}{cn2;zn{UAo06sHZZ-XkP33Z&~|QH18Pp<|FVbP|x5*q9b0@vDk4kujsh4}F@e!2%m@u^yxCzqUll4#K zoiGfr0rba)({tnmomMR2(s(}|=Rb{+=!yu52}_6w8DpB*5BM;zVe0qAYWn$$Iy^o$ zx-`{;j(Hd6KPQGC{KXhdXGn5om!d=T<2WaXnOYC))=$oSJR zLD~nrAKH~>;fHc8)G%eWV1@r3>W{|xkM;j{^?x=VAx;U#C7=t7BvtuW^nX_GKd>YP zo_<_m=+n+m&Vl2OQ|0c78XzYa9nJ>j!=n-YLO5*5ehnVd>Hd4eWi{IiBAw) zlcJPNjZps+_42;t6F8w495%s4KhUHTwF=|A7{_7Kld*B66W*&i)^kD&|B&VjQ-7Ww&I^s7{FvVQhR{%2@AM$P+ewUC2l%fCN|~ zWL<=@)@?epbiscVzbd76nNtGMtcklN877#ciwnB~ zSo`;|B*r`t^aIaZMw0e*Y=9;g2P^l+<1XJqy1Gd=$ z{Uj;79{s-i5c)CBLmOn-_CRH=7-6mi%L1&_e6RX#LYxI?2&)6^o zvormTF!W9D&v6$L40S(!FWsg_)3U5a+ncP0SrIG$(z>_|+K4{D`}$QaSykN)jORLg ziElc(z)`pFtKj_j-4dJ34JgQu>zS#nnM#K{tSnQtEyGl8Di_yiXwB@yY?*yvC1&5& zhS@K)i+exzx@DMcSQTd5wlcH5QbE9jY5W3S0r2w7HeP{uBshLRXt}Wz?;4k94q=s< zL!cdVXlu(H7TUk8Qmo+jp!$whtg2Z@W*KMUVs0GgcF00~92qtGr9HEM(g9=b%IwsP z9mdW2DPt}DZe~j~mIW-4&ep8+ld`NsSQ%Entu-s(rc9h!?TV~6 z4vA_9R$#S3d+jz3FRK;X7gfo!i!-ZLp4AGh$ZEB%z-qOr{!&$3HLG%*U9ed-OIEF4 zmAJ~mb}nW$%Cj0e8&(52Y5+%#eyW#Mi!0;Q!JJtEpFectQQZ5Cbe4WMb1-8LBSF8Y zTZXwbV{8QO??hcF1JGX@R->Ugvp--bWEresX5}D)8#%;}P`&EdW z>!!eGw#1rl#e@!~)W{EivvOvv9Qrr2wq(}v;CQgPOF2u-R|CdOZFAc&)*l++C1jdX zGjlUW^I~RW$!st_oA@&RO1>PkX@k7V3UYLesmwAN$*EF?wS+Q|Oxu-$!v!hz1=>ls zn6A1MAM$|C8(@MkHUuz9gTF)3{{!p>VAg=mDOIl{Vmo<&C6$5=0xT1-IOr;z!efMu3~-2?13@crHOzwt|jGyfaE{8&Q%r^PP=E&CyE)C0jc z#;REbXmu12iPHLf@ZfQtW&VX$7oZDMiWvLJY9L~JTG8mJ6?uF;V&nZ1qjZsRQQAHu zg=xyzHRcIdQ>XPuAc3*trg{PJgG{wpTf*!OKhzU$XrORS*#Lt1h9u~O>%`bJ<{1^6 zpfz^>+=$g!nb}co&&2q6gxidEuumAfY3f_CjIqvLOZQ}~h(F+B;e)fxc#17*!+Jy| zCPW1IMkeUkIx~z20SrHw)ghy_Xg{QMO@CDMj?u+WP-+LFEK(PV`07NhfJk5|8~jm= z*tk*+STFB>y}f;1+q4XeiXvMC-gG~0=s2dPoH3M%uZ!s|0O1LCnBkyR7Zj(9jRCAp zkf~*NhIlUihpo$kf^aIUjfTHJAt*W|GA1Z8W*maALGb@ajnc-mCZE?(!a?tASfhq# zkkNMw4N`(Rz}=NaYoig~!5_x)?AO0{ppTz->$WZm?G7wFUW@sy!J%-~;K(RMn}U=oz#bABuM3Kd9T^m!7!!&;S`i;RzriG~DrM-d!1VytBAM!z3)?Y*=7;DHtYNU<@Dzt{v-?pMZU=$P-7X%*0j|!!e;P-E! zs~RX4O_&NfrF9n;6t5ixX~xKvs80~)CnSp45QKG!9)j>1HBtmHG55-tm8znqmhcj{ zVzlFf1QD1qqCrd!(bV=Me#9cg3#1|h0Pmnw|HcxUbqY(cy66p(pisd^F=9q!3|?7C zTx5&rgcjo?V_Kj_iwJE%KS(p9JGeY`4zmg6^J_-3?q~QqP%t1a5X*%L7n~^UaGbtTUp*YL7YKTLj z4yAi>|AIWF7jawmg@23G6g#1GQw_x40H-t;w}d>UtR}2KjG;KjMx<{w30i zwejII!I2KCgLoM7!ALcA;Y%Voa*fo)d zJhQjBy^x0tGsr6oM4r-kV?G1vn#PDJ0lpsTQfJUcd8AL9z_+Kih)H=1*Xzu!e^Q{4BEFCB-V7{yfFzW`3@_qeSCFm|MSnMGHmOQ(2D81j@_yJK#V|DSM`#~^HQ+u`=c9giFAVHI%y z@Ady02Q1;eLHA&3Rzez#l;i?&{A35D8Ay?ox-5mAupMx+6|#_0`&&pYk-kKVq|{}` zw0N^N`y5Voh5B#c9sdGe&Ki2|Q)2|w5Ip#A;BkKgPyQQt#^1o#{}mhq-Um3Hn?%sy zjhFLM=s;qk@haMickCCYE2$7?cdJZq;PEIk`0*dEBD@bGrW!BjF=lK^ss6FWh_$Om zYR2e^t5p9A;N$1+>7Ce)$?eM>(|d>Jt>{yDVNKsxSGJ6JbA3nXlY&j58?I~(`r_`I zc4cp_^?cuOOosy2v|4W_InAxytJN2_$K@_bIT_u4JvgH+-#MujKc42sFRhgL%^e~9 z>aN%y4lWqF@IY!;hXeY)Y))s!Vme)937v1$8qi`}+F-XYMlO$X{cifO`u_^@R4wb* z$v$k9PYwO5Sm$Ra=X>#8%aeHKngo9LtEBx`*YVBt%wmGi zW#9DRTR*Ou@Zjyn-cJ@ruyAgF^&HyTIIuU zZY$OPl+ym(wsDVXJa_g*@!PvX`NdT|`PZ29C8Ha0wEZ)pXU%ternKTkE4=vCb$+O$ zMcrurD0?oyaXjPJ*Bf-(XgoK+9LX=N>BBQqUHQg%XFhF+ng_V6IAno;J-ao(xTG_` zy1oy;vnP_@J2;jlNMguG@Kt#ZOvE4H0E-s zBaiZ{#lwAS@?Dc#p{*ysy1}1A-uT`9G3a;p+j|G&Cw~>nEHYQeux)ckI@~@wd;f(k zqxibgyX{jyimE*C_e&`T)1=X>}~~ z=E9IFb%C$!>ZSo@i;qq9d7L$8{gcz_1y6J4W<5MHBjR+1hs~Z?yRsYnnAyg@rIZBP zzr>kv7WByHx~>%RPqI{(+7#PTyo?F$;(_$No++i*K56=IUuX2Kz}5_7W~syLI_#X* zNt?5z*Qxx~fh8xG1in1GCg`WD+e80Vv}yS5g4O+YpU&tWxhzs$YfreD#St9{`9HkY z#580}v^A~wPVX3Ue4bQzdRf4~u5TU6uWbtCSJwB1{tD)|caP$C_D1o$2gdTE9Z|2d z)@UzW-867%{(=r2j>ML+I5m|VlmFON#?q2mSz0hl3v)JOXk9kc&9cmvNp2JKSN3^T zwAzQCU(|)?W^~{=vMWC`*Ogyb+Km^j^x{|6Ncg!6h}C)uyhU8$1&Zz28oEd~Wxj3YK_?b+B_nGrn2Zgs+Tl zEbiTtn)4I0+khtM^A(=_+Qz>8#+E_+?%qg#o2aTj)g3)a}kSkzwFh!$)bH_&75j4i*j-~p5FQC*?ArKzA4T5vN4T#Y@gbH1a?;4 z`@*%#kuTa*IXJ|l`sJklb${Cc-H0>)5|@y^OSxjd}9WdOW624c@m? z)e`4A<;Rz?G>2EnaJmoC#&+7Edf7hEDY?s|8u7E3lO5B#@YRdw@WcCe@?$Hs{PEW_ zp_i7Dj<{X8sAK!ftG{4p(&1no(^ic=GVb43%Fmi zNxXf%KD@S_^G0|y6&pCHSf^&H3Sqq(_KfP=C?aM^=dP+MHjSYdkLtr3@{AcV{O&go z_@3qC`1NfgFc(qSQ)UU>c13OlPUv+^+ zcf8O6{TrtAxyo1QzTrF4AM;)MC;UtK3Ew)am~WVVm#?01kIxVLhGReHUJYk_+0C`S z--c;E-=A5hiN&X%Aj+nEL44^2BXWCs9*nGq5R&^ThUZ2?Nr$=97??18d#Eu|V#@V?^<6XOUJ^$s`-+0!c zjr{cdF8mhhhh5>&52N}0!%6&E?o$5Z!Ule8=g4J8Ml*{keXck!9CP=ZP17Ipjnf|T zP17Fn)QF?s^y-x0v^lAn>xqmW_wpBa<6Fly;^P7xd9bH9AKIl0=y2xeSNQV#r{@2e zy=7wjthD*8eYDe@LHzlrJ>5oy{dDFH+d0EyWd7;_KNha+#ZS$3;|FKB z@Du4B_~i|O{O*xy?+W%#Kd>j&8xb5wRGs*F%d!M+zI*mN+pRN7nvC>KN3?>Otr=CtYSUzo zUT4<~JAGku=#SUFjQHcm-uO2~dnVk^+m@hTHC|J5^SBlb>Q}dJ7VcB)*}}11`Hs26 z`F^<%Ul!Y%7i}E;Vf+VTF$d$Z4i@vr`RjQ8x?yW3j_h)L-HiU{(&Kt;&<*P_VMq_B ze(jwrwz99lD%7q53UC!2jAd)aHm|fN&9B|@r9=Ddn>WZiBi7w1SZYvj^F+5vD`J|h zR#&%f8{fB1$-XJgc;QkHer=sEKeNai`@}&0&HgBUZ+|rG!+6pEv)m>8%Bl75b}b0s z4IANSva^a|H{CiilNaus@cW51Q71BG{;h)tcseyt7~DE| z_UJAXHcs=|m??YT-Z8QDyOiPeliM`38Ie3x{rgwbTfwd-9oUcG*c8C8ZXU{4kMGQ9 zg|+0_t4H#OC#Lh~=U4L|?|x0T*3WwukN)#{?qdG*>>~aQe4+e{{H1)eKJtaXXN#OG zdlKK>JTQ)*+Z_F7R&zfA%d-(1iE#H(L!fncz;Vvzl`S@UWe*3FQ{CWOL^nZdsIkVu;eam9e{}RzZ(Lgu7 zXK$U%XU6(rA4}#Bj!x!x4<_(ai~I8Pi}9z%W~5xQ&p2r-^(u=B{?JCWLo zZyVo~&xM|a9rvB5OXcDaZwEe4>&TDHXvr@u>n`?Ts(*bW_`hY?zvchtd82Q`UKP3l zwj;j_8<=d_+j}C!IIgbs74~t_>Rvoc-W^H`8d*P_vi>Hm)b@%XOVSnG=9WHDcvS;YVUcs-d z>&8S_XS$MR$H>wPdu* zBe4EHtbd^cG5=2rHe>w_Uo&x3E%XZ?N$_JXNjQ+jR7Q0Sb_d^h?fyJI`}PJAXG zpkF5y@7b=3u%$C#*VEkR&2PsqE$u33AUa_CfS*`8`!Aq|0f=o}nduf>mY%FHJ zNguiN;pqkZ7WRpYYy0w?d7b#l*)H$zqo9H8tr_rnW`Ng`@E^Ljs?4$Gc=9kcUlZrd zv(j969{Q)7Y{DB`hba3V>_PHvZi9~dunV6TtmB3Yn_#yF>DPB*W;4flvY0{bJ6t+E z@5QaXG5l0o8-8+DtM`2q9lK!Tk<6tAH4x*6&BZ;@f0$H*&k1ROy{W0FpEtiP)?Zg4 zGdH&lFV%ktzXQHL{5q8z3O9g`3Evd0^lo-#tuJd_OQ?SHP3a@kADmvqFRmW|T&)GZ zQ|SA^)E0aJ_&ztxQQS2C!RQ}ro=5ktCH%OrX0+z#V1E`t=E(je-ADHMO{`rpcJLMa zra8y_r@XqnN{aZoXca45ro=1a2DW5FJ?qrW-a6^@le0_sCD4$S=E}dC-a`1RvaxSH z(g~RRk=`}<@b1-N7pnPg$X&r=ns4}mYkMhuQ~$WHg9h?zvDae1TZX+i{g0~~`p!Ey zyJ5M)g%mYaE-M7XayN#v^r)`wuN+Rh{VZ=ezq)NC-!`eO@HyqshGOjLBOCH)zuG*s zM-3i?bvMSh7GECi%*j5W{;#a=A!OdvH|7|6WrFCt`0JUku5IWy@4UW6r3;G?%>LwR zR;Mif+|9S_%h|oVe{)iQ`x(~gwcT<2D_Mg5(~8dvZzRSW+QWf|KyyCc52yt?P8+&PWP6=b-6(({McXrIdTCwCZR zpgra(=Xw6BcaO7WetmZ|KfSy^-#WD`*GIPI>7!iulDPJK-|Qaz(uP5p+bR6+p>h1y z9{6BL?`P6`;v2+NZeLvag?ui(d6V4(m|518Y9BiLo811m3hbK$(G0#;E%vKBQ zsSez4^TY8K|E9OU2Ny1E&(6+lV0mrx05|Y*8D!_~le3Fokqke>{{8&?8vZPQ)!T=s z=G;X5AUt2+(yC}>kH1IwUo1H9S2Vj%XV8PH{m5vxhV+6unBrdNYw zG0g02YQz6h4?N3^^JF#+f6ArX8~l6$F<{$bI5}AeEhpor47iPf3AMEHZjL$IJZBM(!hoc z>|cuq{Wnwf&*&D1)nbX>%xuG0r^YK|o9p1qA1qim`1fl&!Z_kiV$Zy^WhB1}T|xT` z#UAb*p2+VUOyt*hjrrr!#v$KspW1oj%Gjp9=hB-xpPb@gaeAiupF93Rw&jJmgWq;?5ao)0?$CHLaHU>D2!Vf?^zZ`pEihN}#ID_KB@$WiR$c--E>dLh(x4 z-_I}X2zv*Aq%n%P=2zpz-uoD_-22!EuWTInI6tGq zx_RMs9HrwYr?WJx)Ix);8cFj$VM?cW_Ud#Ixa2m z&MA&_0yZkyN=Ik5OsbFyz)Wuk^pV3WrG|kr?%*QvTaUezx zo%kolnN_sN)&2XGwajiWYxQ3mKy2rW3}J1{Ue59e2b&fF9qR_c=k3bYj%^Z=nXY+t zZjmQw>MZPm1JhavTW5WI6Jc{LMJ$_aLW*f`!M_VdF{)#*)lS1d$zRxsBhF*A2Vj$6 ze8y+f0|2B$u@V(^9yho{hzofc7nKBnb=N6x*kp` zSIb&fY|_uIE?YjvvGKkco$g@oLp-XD@Jq;cUmfdA{u+-(3><#bpMD+ee?|=L1^kE~ zU{AayTb9Q2C2U>tbIvbx!`kSn*fOwZV7u@w$zFU?^gy1Zi{rrqzTk(~P2x9pYJa-8 z#62GSY?=J|ICTFHTrut!SZwD)%a~4=;v+ibylzu-*g7;bKa=jlCJ(AN?O;kfesWG* zzJF?Sz5zbZf>BO+!=JRL7@`5kN^XKq+4TbB-_xR<);!g3fpDha( z;n4oyTofmrZ*YQ84Bo@`)R-?PHo@;Rw9_>-s4 z`1<8@d1giczmIrA@rjx6DHaO5{^pk>)MT~*;l3tPhMKozIxHJ&TP*l3QH;%;;bx4PiLDKCV}pEM0<2c+=#g* zXo?VLy~fjmZsMHkHlIK0Hct<}$)^Wi=i|MvaKy!VWQTLSPm@JIG^pZ{1dLXWb*gk( z6x;q^VNxyLqF#CK=T?Is+m^;df``vMw0{?aUs1PF-O861FUsHs!wde)FTWus9>t3` zDd%0pf4a$De*ioE(W!L!#+z`4G3E_?y1;$Y+OVK5WliLR@5K8HEkSoN(LJ{7C7wFu z2H%+cfFE4;j2~J3oF7{LjPG0YjPIHMjPIWJjPI16@vW(k`Leig_>?}^IMxdv&|<@@ z`jxvS0CA0J5#5hvtr*I)mkr>B+s5!?+vVpyyfm7qh!E=6(#OYVXI@?&|LLcn`19um zz9@-&jKP9#6a5sYxQnyGhgb{bM{ix6^k&6GpUpT6aLijO3HoWxMt3@I4xO11<9?CP z9CRJA-iQ3q3ZnA~-;(l3#9uc|eaP2Ly2DpZIM0{rj&gnUKIn~1zGA`^zG?bno;KnZ zkL!Gif8jLy+cM_WyLM_?C4EOS&P~5c^3&U({UOojZ5<@FJSU@(;`z$Pdiu3jeSbAJ@MbAL!AI z$Mj#smnPie<9#mhK8;uNI(Dt{L%gd!I5DTah>?7IWf#xeo=AGwtWM2p%)V-sw#%0- z`|3UvrZ4Zs{A^d#j zD{KAO?4h?iiKt(`zppZOb-~Yce!zQLkU=%$Uw} zzMRmM&m2(?IC>nD-Me@E(#1l)enKbE@1ew{LGy>$5MtywKc@5ZXE;Ot?#2NzA6M4& zjK992H;Z!5EeqOLg5Do+zctZL>89kzeEhI2KUS|?U(>0X3)>J=$2udbP0G2|L;k$B zzPA{|e#9}>#5U&XBh`FXP(8jZ$`SF?R=i-Tr|>DCo?p+uUN?4cXeU;|yG>P+9qT%^ zs%L!i7cs6_5$AY{c=ESJ+Ysm306Vw;@k=YbZ03wC zGy|XQH%u*VxnW9iZ=^chs~|t8HcoqVZ$;AeUwqxi>_NXavHohdF0N6%%(>o2 z?#iY?{Nf64es;ba>@=J`BFw0 zT07wZTd8|swszu!^6RHOsIz(cQ@1ezOZ(VWsBTx)rY75#)RL`_bF8%_-hJ}9wISbK z-#MDoHw<_7z-QSrnm@>##BU#&@$T}W)L+hS9J6nJM9W5zb(z`Pu}v!z^PAPHkdX*` zXhLuYo|YKMm(B>~E2j42+a`D5GeVk)u?x9>A6qn@u^`r|$k0;${mn!C;jyWIz{iMb zSj(nw$ENmS^{QESv$9|f&;@-mMV~?a?X`Jq1GaLMLz&&v+If6AQ<|B%WW@1{+oSIt zUln;Ne``#^v85wcEYo%I+LhP)?^STNWH!9>#ah z9rDZK@jV|+9@*(!Snp<=dv&Tir8WL=w|yl``UgEK<0qq^U0OFY)(#<%)e)+SdnYxi z0l%!u#!+?^clQ)7y+we=$$8cIF0*z_cKu;?aD!!pz@}_#4wbFi z*_Jc2x3)4XSH;G%apO8R?YvxT_KN7+JbppEX2&79=i`&I`#bmn@5cA9I}+qqMtrnz zK4PX6w?2(HGU6np&p~%@aXvsk(GA2%kIUWo_Q~yqO>q}~bMbNP!{Ur?3;*GECja?C zHhiDRXR~5^{YvZFbVg!2uOVGU=NI4RE#XJk>VBVj&cZ-RcON0MBx^(!TyX66| zw#@YZc~WTSjUm3xrfp32`F2lw-O<(wBZa7zP=9321yN&Nt8o-W@ z#o5O1bf!+RXY$GD8yDJlDZY1eJI+@2$MIQF-Fd?r<#}CI8ICh~zAHUYoY&BK2F2LF zzj28FRD6cwWxwgi^?OI>OQq>Aou{&^hi7w_CUx%*@7?YNo%=lcdIrwUA&aMG@Qt&F zy`37a`K|b?vEti;s~ZRK{6$@P)|}SDCqrEL&#`^$B-M8)7udgx>f5=9nUc?QR_`kO zF!CWy_nqBZUa)s2Z&Ig#<4sx*un+O;TND`*XLJ8a`AHqy@A=c*o-a3Q}FQ2 zQpnb9As1vTQH-33w<#Y~6=Rjl|(6@jd zE$leXfQ5fg@e^7P6tCEiwM%EwbPg%*O*{0Re(Kh0kQdB-=Q#xv#*DdZo1=;e)r_&Lb=@l+Sc%LlrN{?)Lb zQ${Ffkkdea?+*6j44Tei=`3(6WQt-YbQXM0#6?|s;o?poje)+EBmF~teS9`d_79y8 zr{G*=rSM-2SObVh97P}YWgOtM3IN5rh4H%({J${5=6 zi=hA7MkOBofqo_aU^*iw{Y~dv-(KErA&>{`nb?D#;_UW&*lqNk0oMBDhdcYRORN2ecGjz7E#~HI z)AGog#E0Kr+QKhy8j2XFa@Jj%W>fwI?1OdKW9jT0-@1tNcNz!j8Q%_7d6#CkLVuDT znmM9Ae9A^b_K#uho{?K4_KEX&e2YNm9O6tE-(`|+`)myKZ2|TrmGLCOJh0Y=Q?+?3? z)-HWVunOz@@C?Wx&ffDDcIKDGdAjjDAA2H=;nVLLXe{J2lFvnF>;~AKu&ZAdF6z{` zXlW;QVTBU^F^!>9)2jHJOsx8**+WhmigpM&DqPhEcEQK(r+ z+qBmP;yd(F_!gYzgx2?0_%^O!3BEtU_b;UD>H8C+`Qtm_{rBd#zQnhA7dvww}w7+G+PbtDTyr#1k+HXIm-82@QWneAP z_wx8QUHFRhO(9~rf8y+BCDu!&3yblix4*fn+E|Hm{^XIaL6;BC{OLQyifHXz`~PTr z>#(SzuwQg$Xc)RnTDn0}x=R`)WM~BhBqXG}yQNDyBt!%mK)OpoX{43zn!CsEoO{pr z-S3Zk?(-ZU=XqW8jC-%O_8Y(TzQ48h2Ma_e5O31}d;OoBhyOYTWNsfBtNw8yfcS;v zVIVOa((inU5cp5EqiLY7_n-U!AJ5}Ez~4sJ@R2?Q>FbfP3cz8v$i4%045IOj|8+;r ze?JHjHstahgqq_m>-O_Y?Af2WhJRdu*-AS^W26Ei%?WsUA7Hcp>o_6+oR6GuWZ(bi z2dPI$9uHEdYJ$Z6VVo%-Mor})bqLrS0pO5-WB9jT1ojF5erB=B<6oZVH*(DZ=ne2J zj>a>jgNKtv@PL>NvS9u1`}|+OwNQElVj}~ge~earv)mbVybt96ka!xIlOHKGMbwAO z0USym04KBj8;37|H<9=r$$$9|3GhIG_CMTd$ch-u)&h7wcK>V?iJy?4|H%hI=4X-h zyOs9fe|tQT`OP0SFYkf8(l8LCwTF|QppK;czw`b7wa@>xo$JmI^3oweoyga=SZ?#( zKB(h{-Y-qBHdwqB>X#5oN=LaMuIsU)uBtR~-g~mk|rVU*SbmhsYsD z0Y5em)P9jM2)PdkX_rW@2a>Ob)JV-BdjdVh=Npc+l!26aXL z|EoVD$1|QK2kH(W1p_fg65w)l16=X@z3FNszvJJ%k(dgJnWoFk5hMAA2%wIQ7!u~%h%YU8t|I%*pWdeOK(FKiX%aa4Sf*^q7wTa}-AmcbP7l7Q? z^pDF4z_R-Q&uJXs_QV7FCjk5($atpg|G}R9?_E0g zDHOEcss|cM5JCt1Gc8b4mjKqnI>5&mzz5m@MiBwxCHc27X2?J+*ZEJ9gH2jnVJ{>OO!$s=SN7$-12|6}}s1m@#kcLRZW0-9jN zzbX5V`GW&LL$+5z`2Xhl3Q5oc+6aIf2FPe_EoEG6s(;(hRaKBX^pTSS1|dt(ATzfL zJLHt9D#+@4|NP_cl}o*ujkwIK;(6_I(Ox4_he{sOJs&nHhXqbx4w~UqWxFob&uHH!cImk!gW>e(vAuyybGWn@-=M$nR@Qs6WFz=LO%+XWr+`Fp355heHo zByf^{zj&#+RHIGb5NA1vy;K+8wzZI^1$Yz{0?nj;oJG{ zD%8H@ePr|{fj!E)p_d$kWuGol&Kh3B?yWM|?WLEe$cpX*U1*jM@Z@f=dm>|7;Q?)E>V6|WS(8h$#! z6&lC|94KKRlQC%_{@p<8_d0>=8_dsQsET9^A{ZhQJxqM7l#qIOi2dI#9)k}mY~uQ% zjFl8o!&E)&xP+<$Fu86OUC&ZBsHU(7pO*sde7PZ}Z?=NZhqkZa;TahrmMn!{!qJ>7cL@4{8y=RPE zuM{u!gzv|9icliQ@ztxJ1kr}M|T|#*C|G;-7U3hss9S|c+*US zsCN+4Hibg3oq(U{e zAhqCn$`!)%BvO0S5JbkMcx2~Q181D{*oZe4@a%4U+5H7&fJBCjtGoUf8(}uwh5uQ! zCV#DW_=)tQr0J2b+MFQQoj$f7yNxmh>iDvFlqyyJGM%iw@$f<&pgzU|Eyr0zqBn0e zz@^C-$LcvZr~8Y>Gmm7H^S-PKtM8=lRft(cA627=*S)W9RKjXLJ1jH90#PCgtSMc? zLTs}~pRh)8qWeKY#d-1T;Xe;f-&zn&{G}UeL{DH3_QH5rBZXH=zuPzFc7ZT@RQR{$%kJ&nxC>(Gfn?C zCF`D#a?mAzV8wtF+GspDod{41JCkvP`R(5qQ??;$yJ=VoU)^jD$b~7hJ`|C_{}}-r zMMrJc=dR|VP+VGJvGT9w)D$WeQ7UC}6(K(4eEVN;xX>rfOHrH>EViU#N4}v_(qNXzHq_+?AjlalRGyay=uzoUlYbzxJ!~!ZjU;{ zr;#c1on0tYZZ2K}qAd(#fgE$8kSo)>^*Lg4p}~sM7+>OIVt!WUE_PMxJzV)S!uH8n z?f&ORf%$n}y!6uaBlSvZea&}t131;q`c4bR_2Gn)^otb&F|v8=xVvabLHajS76Yl!jBq< zJdu4Y@t=v>)?dmwT#jfi!&b(m-A8p@6TE66#$B(Pj05{x5U)P%xuc3&+JWAS%VkF{ zo*ZMWSN%PX$-a6UH9}<*&-mDJlD(?E#|R}LIN0Jhz1ufKFsR&7XP+ky^YqR($m0?O6b}Bo2%J3XwSYgSv`aaMhxq+N)XZ&09yv@|Q&RP`QqM61Y#- zvM(jdMuJ~N0TaAGfj}#lcGyY1QvAjWo0&R;hr>~2uuSu!ttOr1#z{jN4U|>%Gyx=) z%vpu0kWsk6`@0QQFjTHz+}r7rFF)W5aY~KN3zzz1`W;e2Ow=`UF;sJ!MZDNz(Tw0{ ze3$W@=#1>7{Lcquoi+^bmgtHL+lm@)lDTzA%mc zx;6Ki-WBRwED&&i_o5jcwOM$!Xne#dEj}wzH(H&H*+AJsPX3v`k_GcCj{#4mnOsgZ zx%j_sl79AiMR$92*$RF}Y(dRKhylOi3FkRpyMs*PJ2k^wD>gf{!799`q~SSHjQJ_D zvm_)#qg_U23gcfpMsPp`W<1^~4BFi|UWMpZl)>x~PH3?1J*~7vKbBQuism0}g)h(VZA-8Q<=Mv}B0f;dSA zIvh-1xtdpUdh$;@ip0ZAey(B7rb)B*J+zzCgqq+N42d+Xk{S!$hL5fYhC)2BJrY#d zBAqs?Y?rioXv=?7rdU5DV!Y{te=Q=x!|RV5Z}_tl#KrLJ+b!PGRpReQG;`RiA-_KP z|47)h`1!lrM}1F_(?D%*iq^o*(4RBcp1k*mM@&?yfz#G@FVU5PP+aeQuQn4((hV!G zTwhzq%h&J0h|%zhf(1)Q77{&B&?{Ntn?4AO_Td_V$NPh{!R)6PH9OIBlgwp0gE@F( zAQDY4Kf3$%mle7&z%8cL+OtKrS-~!4h+HleXx?A|J@Z!Fl6V$qdA>n>(x<^hla38T z0z)cs@dpvCr-yPyw^ot(UzlaTCI+W3tq!a2{jj8l!nUl2*swF zzmqv1#;Q3EX`uOO=T&Ii?S^WqB!6B;66E>pZyLNNDXRn)NyI@^1va3gTcC7He}Yg< zfU~;UmCV-Upnuqj=9r(#gfDk955GZ2V3Kv~d;p0{d7Un9e9u3Lyd$s}>|0yk#HCDK zNm%2xJxH9JH6o=9?OdYRJye{4!xrw-2kB=A;c3hA2Ao)gp06T)LzNyB3Z?h6 zDPSs^h$woc;(3_8XNm<{4aLps@?Z&Z&&XK%kwDR06GYp&xq;AHC4b&v?^|ODA;e!;>RQSE%~h7!??(` za4%fOjGOP0bPNvDt&W;|_Kk7p;Gla=9z)i1?)dg3`OgA=l~$r(+P5OwtQLo-;>&^A zI?hq5O}rus6ax*JmX8K8hhw~H>4JH}XX{Ov3WQNG-sk;oDjQgE5juReP?(?h%%=my>z7K(cErj-rwP>qRZpb#^Wu(exniE)+VLIz^9@3lx=}m`7mDf4Kd*VsIxr8S^*y_hE>#x z<|q<~QaoV&B~Xfdk}_lXLX8b0zvu|_Vyml+L{bt(WJ0cHTATF4L9l~%hX-4XNMe}s zMD&K6TKUG%>|5SyivS@Llo>-XK}MJ5z4VH&fA2c6z%Qx}NvXGTf_pRUouR72Gui!o zY)ZN&S|6z3*HzNbLkg}tUah0sn1aYm$m+hmA@?788<+s9l_du?=?sl?*noV!`;YmE ztDTEXctTBKQ@^?EF@cCV@rPDOyjNhuD;BN3X|h}3&yPolKUIfux22B>XLSE{;csT3 zxBq?>ZuaY1FkykoOv?52J1gvnR1S&=n=t7vvmep*F4;E{UVrmRx+j#1-M32vUOcI= zG||vSbZabd&&|etX zq)&|zyZf)1P{yPliKAWMr9VS(N9t|`vbes1%JIBiOb#oImG7MRn#I1l4sSwL?Soq% zLdoL;UZT@(MF;FoC8>%&nUj#E=L+ndj_vZh&(+MdX&tNeTuXH{S>3`8x0qwUu@d+w zmJ?Q7@*(aB9}m}ZVn1-8h-oSH>)y5*uVo<%W9rHCSw0w>Dn%9Qe>&h(_{{%(4%s@U*MzO}^yH?!Hm~abnbctRNdt zf-Om~-jU+7@h5@SrsMDYyG`_Q=725L48Pa4_t*MKbVjzRR|ANVHgLmhvUH3>qmg7*58o%Ga>mL}2eI4*WAMLh`he?<1?Id!tWlT$n zO2&1XT6Dvl?iL(~gQJJB*dE{cH4xT_ivNsjkPL(QC#(`@L~8$nJg#T8sHkh)fd)4g z5?yprRp=8MV<`mfLYmRTQntUi@P#X{P<~{=6b{8}a@HVsW2<*&pz7@OGnRscUA4MtDwhO{L3n}vPATwZ7z=J5Q_2R{*~fg>z27XI3|lD}}j_ zVx5AIOf98wlG9>>8AE8(g`D;AwbA*d!hL4cAgdCf^Kt9Cgb6% z|04Q0bRuz<(;*v0b^&ZxEp!;fx^ zJ$FoL&}v6f&pVqYTs~5H;cmg14`NlDWX#izHlN^RP{o!|2W^iC7KPY0VyL|9@FKyJ z@h09nU8vtXakgMpWOR1H+wk|h}c4;eJ@YS~)YCH6-L#Y2{K zDEXgSwB=`rAe{`D98|g# z#+d3&p(P{CKeyFID+*De>g!%3A;B+qLY<0aeRwLQrUscu{{!~#LR}bvQQk_3^83dV}u{3=oD3MHRIxKwEO5YUK_sjE$vPjU7X|d$J zpXN9dw>2vqeA%Y^Jz}w%?vjl0hR1!Roi#@v^l4pasJI+Y$WbhP+Dyf(4t^z&TYIAX zF$@GFz46oSAw43i`$_aE`2u!d0Rp!4NP|z9{7nvE4&y|+89OUK6e;ZL^0v( zF~L-dJ=%&SAa=Dg(oZ1hYo|Ixsq)n82|_)vXmF_xO~Rmo0i?-6!ITAN3w6HR&A1q9 z!zV5WO$Q)csJ`cJd|JO(e=kWnUC+w-eT9x%c>B~SV61R{=4o7A@}BMRrhLWgyeG-Q zYI>o6W8PzqEaV{KR^Pe}Vs-16K9GgZsgx2`w5#G7P9HYp675uYZJb?)lhF+%{j4ZO z*dkYIk8fURWI?>wvR58rIrRfi+Q%#~U^n;VJdUWalz?6U^^MA_XJ+7i+sqXO{CUUH zf=E%1i>0_Cx_4Jo%$MTdbS}I*eTLU=HZO(E>UNuNj5zKVc4#WOX zyv%|Ak1jvjRBV2Y{z^_<48k1YwZ?pSy*W@f5q8J(Vj09cVWT1)!9bzZ{f%89=^zp~t10gJ!yTZWkeaaSDS~s4c89=o{g1fvOzoYd}@QlV!|j`cM-_D7O@( zYJW0?f2WeI*@pSFf}08Hr-RwNFEj$1FVQ#)cunXYb;E?YbNU)gr12vcA?OQ z1$*&FJaT24GF+4`LGzlZD1xSKIN%zHe9qATq~Sh(J-dQ0<+1+|-NtHQGy?d-RkQs4 ziMw$N_^spQpN-?bR67|Mrmq!tPYSxhhwLfy@4uJ-Pz#gx6yOSrqx!5)ruj>0e|6*& zhVJM>O$2ggMv3`GeEu5yFI(8ZcTzBZRM$V9o2vaQCz_rhBXW?CFBkMloy$>J^X*a> ztr^Wm)>$>GV2GR|kK*9iW}MN4lK!;o<$fpHJ*rSB9*(w=rh;SUe54-3$8#C%x!MlW%4eGe%0RGi09KixQa{{;AiB^%-n^BYZ z)za|G*<{o<4`=37dAv?RMb!ffaUB)}Ia(SB| z&szbxdKRY1G72b*@Wt`E;;2`(qBpyCZL@?Gd)Se-G;o4ilEyb#PtRd%M0(h5f6RFD z@ChogG@sI4Z%xA4-wwlWeMUm3-6A1xe4tm@Kg8&k1GGgfc%1U&bj5G_|ScmuzO7eXXY zk}1^NTxvuCE3s~1;ALEvikte8Qu&<5X3HJ!h<*fCzXp~@H;4^h%KDs9ggCc9-wWseaW^m8!ZSQFTRF_J)O~;8j(mOZJ|A3M% z(>l5R{%3BzuetX~p1hd86&fh~8f`5tqAnTrhG_`PW#ols{|Y;E{1(B_%_QCPkXB1F zNl2(58OcT6k8vtvsZMg=_JO89q)B8#uVRJ2a!TnzT1&)B5-@)BW zP$5oPHhtYtj8T{2V<7F^x=JqJSW2%+-5cW+S1;VjU{GEW`&>(PP9{)4hfi^pc_6Tu zAiX)J3KN6KK}V{vWI5iJJ6z{|(!_a-!)M3_nN(FZV$&f<^XId#aNy*1vRU|uV3Z0K zQB1z|js5LC0O}=_Z>rzmrb5PvD@<(QKvo_m8lbD|otGP{6FkkpWzpK>%1F|!An>3C z#COgZC_wA_*vOP77{4$^>}}2{*S-3BPV~p|5_?ZB)+)*f&u47tfZ$&Sa;-em)X!K8 z3|(ne_ICk_GsoYHDhuLF*~5N*fAfjNo#SeuqFJtiLQN4r7xNP><#TBI(c^^}m?TZN z4c~*-6tSlkcGd1q7Oi*2>OGD_ccX^ylcFI4(TCCseL^^_!E5}^9ErCuM`9CC#pmoJ%|4?w;sF>D&&#!O5Uxk_w;`=>4F zE2$_yHmtuBijM0dt`HwP`|KLxs>bPx1`Q3d$IKA&ag{SI;sk*9%0?{}%@+u;Fanu3 zu3NchtV}<~-};_YUX{L6xJSaM%$K4oc>I9U$uyI3>=mQNh?1Ul+Xr`*6pa+aDtksqRxdj#5u&k56`N(keOrO;qq`;?@A7IPKkX9Pc77qHo?q-AJ3&1u>Tv-WfT z5g4~kGf)R&yHAAow7fL-gNQp+PwtNLQ`=^Zuo1JYbto zc)BOhw{bS}dnpX(tvXSHJa~dawF`)G3aKphG-qf`QRdi=ve}@_`U9$R8JuuIR0i@) zc^h9eGS-QfH)vSyectVu@tR+C(oTEXf-SwEOe__s!t1OoZM8hu4l#WBLtZl zO=xS*9&UG*T3QTL-+FEWV;d{(i{mpfu-AHVS~ZP_+=BsfDu-}26x-@`J(TmFVr{-LE7A#3ZCex%qiMk68 z=gi57W08J4FT|_g5Fb(_e)z+bmwM#0K^^GC5CKF{LJ~3ez8~yBx&_G2>3S+mo5{!t zC)L958DpKBiviReG#@6}UlR`#mV@b8MA@rl!fRbMQ83Spo zNVB;`4cgTOigMqr)o4kpmU&!cZ<5ihO!>~Xqd9nB`V~6s`tF-nb~lGLykhxso2J$F zhN`OB9p!Pgs~SdZa2s?^v|VmUweR=f9YpW@i2?3RPOE%vKW|@I=E&#GX^wyM_>4Rb3V>!?MXn7qsV)K$HbVTU~Qk1=3xUVvMp? zt{E#fy?unJW;CJ^GJ-)5*u-If2;AN%)&{AKk2OLH+uw4J9D7_0kpnMV_6!64u6sxk z&$-ebKjV!oFO1Bty9>%YGKHB-VYbu~-&~VX8jt?w$%d9XvP8?keOe3BN%a3t7W@@< zr_C4Pg#XArvUGdO`NUE zpUdo%GZ_t3n`5XHxB7^emlJ42{3w4Y4EI9{ohyJt!hRb5;$NH#N~bb&n442K21l4g zU{n5`knK#-jTI4>OF&+giNFlJsW&HJW`ZK+R$%T4nljr*=#nSjU%(W-TC^I zFt>^1MQ|UMAS8QkWm@a|9%(8PSPvv=!onw7wC9ShjVPiULHc%FuJ71uagWOCkCmVVNrMXcAp^@w}LqUg)l_WNnW?QAY4K)xx{mmH=EIE*M91qObly0?~`tdINm?$uv zK2@6UOF+*xxcc(Jm@hdQ{8hsxB;_1oyMC`#3^puDY2+Bt9kjpW45nnP=_qYmcjwyJ zmH>93t~gbobLY^`>uf6x=24SQV-2|Gy1x3nk)aPFyZ+IBLUQy#HCpdpvfOL$_Moi0 zwO61!Iv0pd)fGbi4NH^r`{wU9$3s>Q0r<6p+T)e9-(VVzJ8p8^20L6T-HxhzEJ;bd zG$2BynV7-)V;g}WMWAIsK**L%>+R=QM7l~gKan9}r-~-C`7IoD_nI{T6eQLQAgeMRw!W3I+jeMR;wKhN8J%sF9bQ;yM1EGG1Gs8)AScg z>1q|Go&~%Y;HIn`_vauys3wueYAL1+*o0v{7?0kkY-fACO{kJ}kJz^Bb#A2xOuJ6M ztr@}>$7!7KA)Zq!Jl5LPER{U@40r7E{)5%|CwaZeUch^aI|mdJ0buJ&Mt+V7MXsW9 z$8po|)Xh1l67)AQS^8C*et4mtDAuJx%-1$?XWdEceFM`YZhfmt1?G2XKy{MKiS0MA zDl4+llF>nv5w(0g@^RlWF;JTD=_9V!Cp}|LD(t?pO%s(b?oV~%KW?a*!Xy-1m{4qM zV~7}@nro%SqgNcecDGt-s-3?v0nd>I;A}9U|0hleIh(~9-Qt!cU)Rce)`mM=dWW6G0SLxi8P?Lc}2ZuQzFkO{F=no9%q z9uqj2#(b?)+lWP7Gn&q z1%m_ljiPtMtV5c%{NT=k@6ZYzw^3y7Pg1)HVK4Hiqnp3$c*dxxa+M`^Yxts&Kpwk=gcALhu5hTY}C*sA*jKHlHCRfIul*c(?m+IwbU z*z*x6I3zMT{EMrv-{V`D3vP*&E(98ge7K_`;eRg8VH7A~d?#ZLv%>bum8p15E5gq9 zT_{}xdzz@sXw%IQ#Mxfd7eQ0->~lv@B|!iVmSO=BFp69gaFuLqI~a!wy8z`AJkR=* zOEARyq4LWU$k8WWb6k+|qNvFQwUGz2O)3gsT#48Dr_djC-$oOzS35SSUVUWQ=wR&`nI0ktWK2xM=M8D~oSgm>8hdmycN7zdm8=kb8I|W- zRoQSJP}v6*8P_3IP*B;}SDMp6<}$2@u z%J8C6H6@f$e|1)L(k6)Uo7qbvr5l=p_YT(lZ3>oZCO%($tdyvyo6ePJh@AC;v(`1h z-(nS3y(0>j%H{Ze6Rs3=jU}Ln;)1BQxRnR{iU7wp8mKBf;K%v%Y&PFoR#zB1LJL@B zD#wjTr2U$;aa8slW{a70`gn7By zJC>STltZTb^Q;Au+YT-(2Gh2LW5Wx}o$Q&E!F>5J?vXbmK=|ptbrj%N9J%`>H1p-v z`Lnb^>!X{{EPlr)el6#zZ>4HRj06N=FCBtcP3fU}Pr3@tHuK5ohVI6XieJx9IE3w? z4y*764dGsb*|N$VBX=FpjP;uH3g=HHzO?dL$;%pUMxwYQV`}Y`aJumWBE^OY|{xTTEa<$ohe$?HcQokRqvMXT8lKyH;54}{5yNu5kcry#w4Q;J%Dr9fSJ0Paoj8IT%REacuw+&9b6-vN zjo#~K)fvisD}u09 zoXS`26=gI$T4g=Kf^wTaL2>`MQG;%aZp+kR^>vhgh3hn~cmYb=2vxc2%v=?$!*l(- z2xRwmv_LyRCR2|f1eadJ_SDpP3ipZjO^4bh8ea#suYk$h@E>Igs#?Kst_4nUQle4M zIP9N`AD`yYb7@MW(eKZ`5pBp~kq|U~3FgzcNH(X<^7;7iu=td9Cr6EH>;0I*_T1;f zQfh(PoR4^*yT7sE zEIk#y7`*3#Nm+K9(*3c(@zlfYRkTl<0W8Pl3&)@uF5kBc^}L0rQL^$Vqr01dd)#1c zI*Ll3W36;DQYWVvn5;jwc&Z{u`5w7> z;ol1K<1*rJ9iv_C=z5}I-_}vBBo8`%xjuQUb|koM(D&VPPEOc6s1;s8&DZevdB<65 zHDcBG>ifIe*9#85ETAiU9)-}%$oKX|dokIl%=?E_r-3!UEm&UG)GKRh;`;jDayW37 ztG_W_`vk|J=7_;;aHea6F~!-SvI%q!c%VtbP~sIoqjO8?3NdGWuAgFPz!g-(mWCdkD%J-@FSliP+C;_U+m+?;z)n~07hUJ?g{C?$ zt3jPl5dJivj-yc*a&2>#<^F7#Xnr=K0G7;LVfN9=7qrx;(&PI?Yp)Ap6}Unkf@Oa} zD657N-tC)~779)7z6^}mSbJp}q`xA|SJz`l7`Fpn^WK?yNHGk`kCWZFDt59zvH+}Yg zsIk&FxOcy9?NC4$xMdA366gglS2`HV_Oyji*yH8CdoYvwn|#6Me_rp43ggoDeA$ z^fBwBdU75MOq!7(`<*nbfF}SK1j6HtENh6CH+)^;s91lVvOHjxl-Uv&;3AJjI(2}u zvwJx3-lZ#){1R7Av#%)rjDD>SvH3@j_hF&QD6b5&l{;K@<^g2`! z!z`xD4M2M*OciPf3#nekSvN)xa71tgs?FdslhDRE<0)uV^p}1jsa869CR{`SKFILV zwwAY}=I%V9_?$WzwE5%R&&+YEg_~LTV6+z2O!0C;I&}6S42ACY4g$5B69=0@8%+qO zuZ;1d ztgk#V#GrgtTF%-77I=3n>|DE3Y7GpSqH zCc~3aNIf$HzNgVB4nPh_ihMV0Lf9@l&cfwoZnd)i$yXwQH|O(91E||_4n#fZh_Rwb zJ{p?A%+z8dw1Le>gWq$~8spIZ9Gs%WFz*eHDQDu^O%iH~TTIf^*3*d!!3?%1Ji8@0 z%6VvSDMlHr*^B$j@gksarlQF}hy5fD1F-3c-^@7CGy>D?wPN5jI*iVe4oeTA;5J2gd{&X+6lO)uT1qEQsYSzkowoKVO@Z`FP0 zLm4RPzuoUAWmo0mBgQ3+!oRwXy@fZK)BYSPeD(z7I`@PaRB?=%jVB|{LVArL#sz?` z*Bfg$rt;L=`ijjNt?(Q>Z#yoxMIh4EQnFzT9~HcMiWs?6UF+UXW0FumsP2yt6hv(b zmv-l#Dk?TqX7MDvCY#dl`AAlh67i4~*H$BDs1@xE1qfOFp^1_aKfL}_#q3v#Nh(!N zU`K_!jbhd*MevP6L9iKot;s%s@yBey)GMjw)#gJcE0So}74%%#nalaaQYRFnNsgx( zRpCmJj5H2C*R_<{zLx`Qq<2Z6z8Fg`S7bFx9Y%2>5%()lwit0FRdy&d@=dj{8meKr(zvwZ z@=hy!o78_9&4)SgK3?@y>er|zTb?siBc2pU13Hi29mjG3E*7{n8V{4Qb_RY)j!DvP zC2L9B;RD7S*TVz;f)Y!LNgBftGCfE@(b1w_)zq+#`6)^eg#b4Qe*#F>t5n{E5eKD) z*U{F4L3R_Sn4dsx$s=)9?az<1bUlF?7kuzz4VF(pv&^%xDZ!uQgld$CAY*BI5 zR5wL8Q-`NC#&VNX9z_z2n;l!8(K}0Bq*G7pW%neKDoaTma#r&`&tEJXr>8uVx+alY zJuhl3t6g^oPJ64;T2r7AUTW|(GJ6v3_agcADrgoQq%JfQxCDufa#8|!^qkS#_Q!Ve zN)*k*`|d6Gr=w^H#PP=>Z4)H)sgr98lb|i%b?PS@sDv`1Ws&} zlrYh{P55`#E?fsc!ymiKWnV+PWb=t&O+Vvinu!LTC5K)85-KffI2#vcg&=hri6LRk zz57%vY0UX7wrERuo{yw@7h}0(J2Qc;Tj5HfWT5HGb5d zJFI#du(PIo^o-meGaokAR##6Fvk95EJ#m9(kARx-K+q|C5CH{5QLu2QznKv{~;)i-G(tEF~uX4I~a zcxew>KUxr(J3moIXjh$7B;}I}`;>ti%Dkj|mzhbE`3o7T+!H35qHAaNH}!D2-wQEe zE4+LJr;D;(gR+yU-n+LJa87A}>5q(-j3L39bUj5Y_ZTTpZ{7N2bqZ{4@Ig@u2D2IRfz7HUa>A-S zoGyhlvMQoqoos?E=MRDR;&nzh+{I@Q6)MVk=^Kqz1jT>0sEW@js%)JJ`N&YI)a?(z z2g0`!vi17&r`>`;-8mdr$XdShYDPpl=0K#NcE=m&WF1Bzv=Ra9_TS%=jOvwmQFld? zcY(pR)&BGODNn*HTbWnDTUbBg*EOdyyy{CKOOT=o*q<9ceE0D1axTGCgF(pqI^?qx zS#B7DBRpNvm}7k02Zbda#PIufYm@XX8mO?{H?#~@H_v7BMbj!||01+Oa(1WiuY=1= zhauq*!gveqCv=FHbgC%x5RJ7T)=R&v2>7TXOA8srPxWDXW_Dtd+l)1wzMpW6> z0$v_l-rZ+^;An;9K1LyJBKfoL6BP-5X}9}{L`H2caSv1G$+GuB^yuM|OZ*aq4MUy5 zn5XxIjLvSZ&23Q0HiV0ll}C2rh<>|$Jcml&^Bg_MPkO2aqtd@VxWP>6sHsRP5+IP4 z-C&xSfneAYYu-mZURwaE_?v-7R3W*1{I3oka%I3VnL;Auxc^s0Pq z>brP4I~kL6mq7}5_1lW{yoR^?6}D#(zD;OKqzcnZohhjw@9jbyXEAG_N#faC%Q&W&!*BTkl^htoM=>5wbEi zNq!F^#=oY*44SCE`Qm_b=;f>qkAXzDd<8%GLc%K?H{2k-w)foCrvwSSD?7iy)vU_py$5&cVXE^8- zHTDFu$%sNJ#~1I!La=mEDpnoD|0}Yon3Yu{i}#NS*7q(m{LrjYxq`3*Nr1kP9GhwE$$!rUPspk2aX3IzNRHMT5fOudgDgdJ=N~?Ll$;mOiIaAtjt;n6?aYc1eCW5n z{jT4REe~T8K_K51wy*88KHj4)wSB5MIs9E^=r1m>h^&x&1JRN1hrG{4zkRM7Ii$r< zbAd2eq$}OiW1+u^LrQql z3?XC;FJ&|J3QgW*Dy7HR<2kg0eL~WM%-7?p%ilniAxzvu{M`{(v+|;UKSbLWBo3(5KtQRN^4a9uVJ;rW=ibs&!*Gf;-bum=~5l5pjE9&lunmaY8fa0 z%Ab&AQNEqgVkA)4#0hYzEJ)#CYWO!Ntoj`C8aZD+MC&YJ#3|hbYtadf@15@dQ(;_2 zPWY$6@spaCHiSwTg0|zN`CfvZI%R<0t(5E&wqG+b>-oUXqP(B3N&_yPSFIhH zgJRaDef#0l@6EDR*B&eJlwCYSFPv4FrDYQ>wmuJu zIgbIW5*KeBWqO0?8uVJ~I&W#|K2k@`iWE8v01p{pAkEVDx$H$NeIf?LQg+4mPs?V1 zRXEJ@93z9wX>2O&i85%EQz!ASLJH8ueUPT`)sdYV^A`bWq=_XCPsN3T!RI#^xM&^! z%KZMr0$47+paVydCo6DnYjO8*T{|Bk47rePnLOpIcSZ3D@+0zOJ!r%E^sp*qU%kfJX`rtZ4j!orItjasPnsaIj(gkl6-;uL z_b~pABhoiSY*lrD^>+vl9Y8a%L(E{;`@s;|q~PHo?JMK-bU;GIfAfoET7e)l|4p&I zi>U_vv#RC@$~8Eoqdi5lQ8l#3PzDX_JT4?WX7C5RXvTb)#gI#bM8|xkiJ_Q-@Q`}N z9DG#q4&yi?_F8$rOkf8+d`9h|7^F&i2TEbCdbM0-x1*~2wXwDdB<;q6Z-;EU%RG(8 z<3dvz<9@y$3d`)YhU_+0Oj(hZJOzlKpEeeLpBvfb_7?l3=#d>b zo8{RITz$a&sFSHae(vFjW54Uu(0;|p8e4lapVHu}+_T#+;0lSjuK%My$1uFN18^az z^_z0L;*0)c^8-&gFxuHfH83YI&niCG@mo6YRUCD6XlYM9G`B8^kHX;ebj1lj!%1+0 zTF&LZ8jS0L4=egaqE4Zyk?L2Ktks5yLADj$sw zYzZWZM`NEEBKa&^V)agF;F~0W=b)3pU}vdgo6{|}$W5Qw?Or}6_5CUMnl1yRW-|#h zYZ2EDEyYxOxc^B-WBFerd{zuY?F&4(+5YF8N;4EI!&FUuaU>x!s7j^CSV|LU`3ZIhW z$fG}fs-J3&Vsui@wHr-c?^t;amf=7EMQ%%mlFJ$jp77&;Il2jVgzv4!2{WBrd z4xA!Kt6(6hYRNe@O-%OYM!mtgd6xB}_$McF>&`sNuwF=e8N--RW>ko~v(iJT*qTgJ zJE#On8g=LeO$*M}97axTQEUEci)a@0i$b@qj5$Xsz8h<`r2v5zU~_nIn0*z0razkZ z_4pewfggat3l_>`uI5^2<2JdMzN90QoAES}zENvbT~kw+{xN!l{^pP% z5S8b0h5uBTeAsTJv$al<7jbw;0IY2spnh7)`Z6M7C-De@>mdv_)Gn|bd!{gLAeq+M zWBLK_BoO+!k><5c+&jt-^X)aU!jSwf-%-(TvIDoI;0KG+@DP0J^HQhA0N#6(37wKQ ziz|wsfqle1(@D=x9F#`XE}36Bj3g?1`60N7em~xOZ)KS6ol&|qaQpGWaQ6jYc-m2k`ryi`#{><|-9^G%=xBnU2dq4Q0&4Udr75!Hg z1^nolz3Gr++bvn)2gy8&*gtY)gx$_|#BHP|W?dq=JUrn_sHnt#XQ?m%mpsl6KMyWH z|MWH1l0CXo2k{bvA}8OX^>+E2i~Ekblx=m3l3Y6U%0W5gPU#uyUXfn+R@6mF`;9rIqV_om=49bez4YS0=T z7dfnpm?rL=?cQB`!7*LKOMexTK2%KhF8_|Wh6T}HJcV04S{B?f{@RVgoAQNS+neyU ze!`Y?SCk!}wUzXDc1N#3@Qoi1&#)udi+z-6cfun(lpywT7lWH){(bZ(jt zeSp3RpyA%5H%AOxQG_ID15xb}mzl5gx0}3dr)zqnjv_C@65VYA+ z0xjD(n6}$F(_mIy+Fa{a4>m6PsQCPg4s@-}=GSCZJNGaVceWmu-vxAAm zZk*JboDIzVL#@WBToPARO}KV5V)g5;2r!U^rv&T2)8`gN7S3O2!f?AShox$ae;o|F znzdRg3RG!f*cY;zfMeUOnlv}Zje9I5h2(^?zIX6u2O>Q4X$>Vd7NDK0w|~C2 zy*@?BPRLYMT1-PP8Cw5`pA>#Ax$_xC(VP*|XWlB?bVEDSfFFMX&mS#hKZd-P_$T&- z*|eULG4mqcy)e*GBqLr$su9wTsqS$$bbPyX)gv6ca_!GR>`isdXlyd|ur&1jrjWu2 z6jAV?d%5y3vZe@}J&?Z117;kXpNfgIp4qhUan0To5B*d5yJ6}3dp>Xy5w0(HJee)Z z0r*?{Xp59x;3LQXqyLkid0eWX$?;uoH0@Pf(dA#;v^wcfA-^Avd4N+`T{{(CrW+{`y;V}oh=!Sl}L$- zlrVzwF6&2lDmh>3n<5g{0)Qru!~l!U&ul5fFx0}ogQ|T99`NIZl!e_=A(&WVA};4~ z!@chCUPW3{#`%oguOGC%lAGp2GNt)On_K!%7-l;qJ?$Ic&OWCmp+N z@yTt-+5rJa++7ptv@(#0+CL}1{ZS$=R3p1lWOQBj2w}{$UtX>2;cXu;xic5XJbs@4 zhaMWM0^u)FkR+TMS*wQ^XNEGwRw-XekypceNE2v&RZHR}rKz9WpS$pYVzW!1yRizF z=cyahcir07ts0lqCCV=;d(cn$gdGi%jzZ28S;oG1MTZrw-+I2|tHR?*yK9E%&PHgC ziqsS{35av1&+01d>fIHfP0*VE`DxWgq%epAac2a!mA)gv?`nHrHpOuIwICRby5SACHkkIALXei27eNOpo~#rYzmCvKW@;8)HulAl~1KLJ;| zEXiEzDVR7YpdcRfh6Yz1jhOE|jzc69jX@O4Np(uuF0~yd7tbw1PosK268-qWPY(66s&YrCfH9EIl(*? zx;lg%o-REOeyMmkbz=%P;Zw6>29k+Ca)HyDDU%}d@&R6JmUGGtWqg*ZHvrp+f4XQB zMP(Tmdo+7w3c}T8&KEv@M(Ai;vwb*#+|MuYa#r67J466M)WJ3xOnYAN zYu(qJHUEB$Q@#teFf@5NuoI7t#^{<#TokQ-Ow8mzKTEF*i4|IQdFcB>=1P`UOU_!C zVf}BFfa!j&)!0DK&GeH{$3mlYsiWTQz#%)CCW+KzQ;rOB+`&Au;jGHhf1^zl2}ni% zPfNAh>Gq!*`V`%tO#;Pb1?SH1+1|NHYARGAR+2q9=v7|ZBgz9+3*kWEV%7d4Hu3T- zd$skI7B7K__B+pScZS=Ss9>dm%sX$KkRP{866yF$S7OxjC6Lxuh zQbz5$rH-qZA@?lnhS0ft(PSaf!XG1n;DsK$`K7xDI{z?)x$Ap6I;+Sttd<9FX{yTn z{slYb)vv~wbteMbPrz^CO22JIMgrv>lL;3m!J&WGC=HL{Mxt+scFpAwsGZ_8M-rdYNkFnEIM((V%*? zQ~;%6ZGN~xNA1u-YQoC+o-sFWuqk`!Y?Z_2cILJ0*b>04J@nOEDaoSh{QKyqAZm^- zF*XP;oBw;0OnG9^vml6lZ8p0u;(8N`D|k0^@!#9c@L!7+zMPrDQ@I=WD2FQrtb2PE zp|%Am)NEiHH6)!`V8ElXGY0sx8cU!IcMuzkSA{vKD&BRW@%Df;LMV*!v>qK~u=Pgw z7`M3#Ykgle(|tSnUS^HYb;zdAxh9SKel1c2Dtz)XyHxS9T4s1eL?GB~Y^V$_BW)p_ zf#C4%vk(%Vt;!ywD9_Yz4WF+Oc}&)92&j)(R9$U6xi32L^zI;b5J{y4T(@(jXO~_+ zn|t*oXSEz`{o7Hu$~j!u_a)M;npuN)6O}z3?}81GAx>{qw;;3C7s`{gAD;;+5T3fp zqSJFw#W>XXih@rX7Bjjmlzbc9s_eQ=*O^xLVU3T~kdIi=@;%`nEqp$tpCYhRkQXFp zGv$0L9nVl3PC=FF|I>=r1%WD)G#c@eH6dQa05<5Q>LB7kNi|;$@709dQMJSrXc)R; z;Ch@PYI}j`@Wyz^JT^o0shge1&D>a;11sRGYIXA7BJkBp^k$w{amDWfgV=bjj(rr3Nka^ejfRyEXNj$gEWEVHc zA@uM-Vi|2DI8=Ebs_*?$HqFPEPNs!`ahcfaaaG-;^Zd~GzklC*G2i6SxKV;RyGs4v z9;($=`H>3@)W|Q?c&Fw#F!&KAd2~*yBK>I}Xg$2wmPI^%?zS)U!JGXW82??|WuvzA zZVg~QhehfEEx$XbS80xBj{29IR3LnVYUJeq5qAt&kf3*?qNjRy+giF~D*=g$L<9-G zy%v~VOq2u7iLC~GJZytto8K5y%4lw0!T`7!pvd@%vp)^Oc}zS~;kJ2cRo=UZ+;l#6 z_&6?zR|-%6iST&6SJ3RM7%Q*CvUZ5&Q@7*1IM0SkN6eFz!I0!h=bD+vwOS@oqgO);i&u-%1R zFqYU!9B z@1>q=+db>bOIPfEz~tN4Uqn3!Nyagyd1^jlDhHEsYROgQ6wIM^^(bRsu5OPhuqM(w zy;8S^1pT-$pNCQtqOA=_R%YSr@;xT}$sR4B>EjF{7}9^(zr@}Mjt>N!FxP`%!(hUl z@xRrKO&W5K26$MpcH8j2IDDBkcI-jNUJle?Z^ENc1le1jo3OFgz44(oZiq!%;VpDz(n)8xyNW%_+`} zTL51)jQA1;qLIXM<1Vv(3@bmugv$xqe-ayuhML~LUTv-o#*iE-r0MgY&<-(mAuE~p zk#@v(-E2~Q>F^fz!s+At&uQ;`b~kxyiSo9()@>*=c$<>j@2}nO%kfo{M{cP2;{vz6 zV{LF%J}upT>PVR-uI#!mk!bQ(!Fh%26G4so+ zq3EBNC&d?^GN}UnmH4mqyz1eOH34d^Du$V-IY6yT7n1Huf;>15M#jv}zx?f@1(-M1x z(CnFYPByy#b1L9zAyAUp5M4tLSIYqej-qXZfvyL|JOH*q^Ek^S($0$dEdvB}u|5r1`hj z+b%|CFf);)1+2WG)PPq~=FQ$0Q;;r{&G>1B>*Q>W8MRaSQ`=uV8|78B*{TT|h*qtS zCb((6LveU+lT{I+@p6J4h5~CWijLlQ{V|85FDvy9W@JIz4rVA7U=A}}a0yxa3XCxF zU19Rw=40PKkSL(V^A3fN*QmUh$lsQd;ijE;GC@e*jDI-;0a=i(N0=BPVY|oB?Kurm zsti}aPbiGTRzh6YoZ}Sw zj1zTt=1y#UeR!wa6~sSVUb^TOCkXi*bGiaYJB1*lu%$$q1}0)L>NrFS` z@Cwv*>a~zw-F$a$N!P(S;sxyN!t_bPN^8%d$Jo50`e)w~Gfn;u-=1$2iY{e3u*lR3 zkfNw#*DCuZL?c6}gGI$`^Z|1@N$XJ4h9t1$ejRPXpVN}nY0u(oc{ z_HdR^9l$|NHcdmKun+$H`cgwGolQyrQbK&=2W{>?>g!-fQ)@}=wz~6oG6xpbQ3LD2 zS?n(lErKPulr$8uN==Qon)tX-?_0$)b|d4jG}b)eFmOccDdE{g5ddA#An(Vh=?Zlw z8|rjgkWZoiW1Tzpk|P1j+N^&(?%ZS$wdVrg$J(*K!_v%sgd3hQwc`_X{IB~9$Immt zmwLpQAkkv$z1TD&NFOOF9AlzfyIMqSPp!7NWJI!1Fz`zJB~3{|s|Rh}{WNyLeI!!l{mURPt27sG-{2#%nAZLacgm;Y$zYULOT7jA@d%pn*(5Wx_)f(B7x?TTlw`Bv{Lru)Dn_VhhK-urCv;Xx2*0!^Wf zSoDg>!}0!g&Za-!iR^5aLoQg2Xm8&9y@NlS>=WBZd;k8!ukI&of)Bv&E6sgxDJ;sn z$mN&XgPnWE)41*AuPtT8lXd=^i}1@H^>(4(a4BHyo5Cw#jMf0XyI+NYby@3*bMp_6 z*41HU+Ye7f7s1pVvNk;-$E72GqzL{wsmk2>kEePxrgKf2$a>OZQux1fLMYDkk-I($ zT!NzfbK*@{cc>9BA{gb&K^+wTPS{OH4?++ESa+FA@@?0~|DZ)$mFE>K) zYzw{0Laolixo6XEleSg#yr(NgbrRX5CqUT8DoVC>a*f?Ygk6Xy!^Lcg0g3j{LS_MJwMkHCJz^2sNiSoGD4$VQp&NF z|LtiGCn4UbA3l`kmO6llnu)Kl0HyjHGWcc5{gV3>On#Xt23ET;CXar7*@U-Kc8tZ_ zDY5l&)YNeVXsP}ABh4f@cc-w|w@RVv+8{Y19zsIUm-Sp{mp!(v#PmSlbHnaA{WR1l zN{Wj5yAE6F+J{Mul_)QDI*S-)CDixPbF<4hRLDV)xVZ*=*86=lZqmc9$9#Dz9~d3~gA z*fTb!)=Rifik8W+7xRxqJ|;xo%S=HfQ{wCW9&$`ppdV4k2{p8YnYLs6M_wB|EwA=< z%D1y&0jy(~E2Zm*o?T_JHjwxVmcRu&{s-kzZYY}j9Z~W<@pjo`?eDFxP2>d6pZEK> z?QOOqR~_M)%X~eQjv|S*)BQ8&WiS7WLczeHl|02=2<|eb?_d}fpq(63S8Lz%1sjH2 zI=UJal=fKgOTg{blcq+FjIs{R&;41vakw1bcidXjY8EvnJ!9NxfmIYJ>;W9CC|!P4 z&GIkKbSY(WemVIx*sdTfsohi3gzu93M>rpbvbg#4FRe*(9dOS8PgwzQ$jm8(Tn&K< zCFWr033^4LySSfW${*YCc7|d`U+yw&uc=;Pkf-(=03pP~K`f~OR&SPsm_S@L*lPCF z>6(~ded-BnHTM4Tbib&zzP4uWTtR@c(P63k_fbo+p{2Etz#E9Nmh<9etggSo? zPmwPpKBAV@w)eY#MiEB2bQigZ<)!;_sxUIg*KlPVC*_20Unk?ed=}04uY95Ccffq5 zNzs^&(1i*Hqzd)eo^;=DE|u*^8lQndNsO65%y$9TDe^WRNbSRt1dQYnouYYP)?(HD z323|Rnfx2Mwdt?FG8Ur6QZ9vyGeCgaHx%^TmKAN!75BWJPZG_OAQ`D}%z`+?MH)BvONVhqpJ zX+=$D4U#`99-?MfxS&wt-{C~S=9YKl1y;8~e4G>Ok8q574^WYl`%6wzoe= z63XP({2guWzfDqu5xP$s>(JY)(S&7=A~tDpDtVMzOxpdpYgJ}VeLt+b`SRbffb0*e zez|#gvM!;vm!;Hj`DqVor0$*g(&W1#0GnR_r(N{6BoxW;H2QqKad^o@FxxeZlxTQL zr}*XP{IBti$iocy5y*B_d2oA=uKvv83@n4)?E#P##$l*ncU%Ex7Dbwr272b;`OmS2i0i$>zU!F-iRNsWN zv;ph#aAdEOWZ_=ZK-kW+;JFlg*KPTmpaJ7?JWvWfaqvyr%oKb=`-v+JeZ# zn2xx>M_#rU0+wDoUB(Ld65>~)@Z|D81@R-%R?ZX9v)cT+c0y_314$qWC4s6<(ztq~ z1ce6mwn(j$!YDv82!Oe_+f;5e;}fy`#g$OjnJq=<9}H3bkvA2BPNXEjE*!d(Slr+T%7jwmwiRC2R0^Rx+B8ivN;c|%;vl;kF)Ak zNI?cL#w)~m52z3$^NKzgmI?%;iA}t#pBUDDy}*njK=J@d`3*B$Z)=fMf9-AO?{@-y zKrf|ccQ=qN>C3*_d9r`Uw7KS1M|(d*`_B8wwd&eDYk`Z114E;WV`$bc$@NI|&aqCk z0oJ(q-m(7WMXlkM?Z13qjSlQ4DI|Rw%BM#n^P#}t*fz07UHLttafIYB-q(^+Q2m$M zcKr$C!io4ha-BsGw788l)_3dYR^y;Z=)#Yrjfjem086vPe?_{P0K-c!m(jB^7ACIk9Xs)zOSQ;uTXn8b>3yUa<{jaT8Ny9m1T2 zuw!=DQ|A$8PQ_dHhMTpOaDn!)9JTg8%%G}@<8J9xIVX0zkp^gQTH+wVa?!>cbF#g< z_0aCiIXdaFTi{MoKmRTe>hUrl_{mV?5mM8VjQ>mhUTfKwdME!?x|Q7gk)ReYp*RQv zu^tiN7nJVLIfGC90aduoF&5yjphrCWuUx7@LB)L2croGNayBW7V0ozZVun8NRErb+H_JC?OewN0V)Ssa@!)V z^TVtFcZehBQ%IqBIEI*_jJOu5!l{VVsy8dQ$zP+hja}+{W{11GWHf|TEOjfu^|!u$tVzs@=EG91Mz58$Q=_6AV$<9)$uH*B>qvVSL$+{V{G zk#g<RcQ zzUi%4jww~ROxr2QB^fol7oKgoTJUQ7gV?^H{&)>Lkq^pRj?i0udb3a=M15ZVi1W>% zFM$yUxASv)gAGq+r){?x=Yzp1#3i3CSf_Edw}Sq&%$S8L5QHC3uw1BDIgnZ=D75@KAGfaC1;6=5&#pBLz<)$wr*9v{-|strI#@r3&A;!%~*%ayTw zUferO&~#QaA}?9gfLx#ro3;0bf)NkHWEQh6ikSsc(&A_}(t(O7#7!qFww7>G78mea zJ!Q0d9PW+Fvf-^kUq!`UGx5L?wC$Y3-*x)M7}4QsE?*j*C=|z%;OR}`$pvS~Nxe|G zK$GM}=DbuQJ@;o1fz_t}s_Dy>X4N%hFYtp@W-aW+ARYL` zZGz0hGbrj$)Xd-56F@wbOX*%~2M?#I= zlUuu;O}Mg92U^Y3hFiivlCgv~X1C#G6ykW}OllWm%lvNnvq3HyL5VnM>i`=D?GsQa zqLHP3w7w{yCY7}7=If|`W+%7d-Ea4YPvP#1dS{oWJ$8=bl!UHEO=hoDAdTEHyQm6> z)lgarRDbx#yhgIC1uejXuIxoD2EVL0;XMq>^tg8v6PozHwxGBlryhraLXn62OSKwj z25^vZ0&|gfgH1*6%IlAY*T3C;%VgyozC9vrDLHf04T)zoVsE@yT)+0fHX`9iN!ny$ z7$QF2SixX_8dux4Q#U+Slbj5DTh#7ch^@Ruvc~yrp*P)8H18Bh^l_y6y#m6_OhIJC zoAlvLW{8HoDYajWj`3>J2OuJMju~J)LxMNq&ji)5c;_S%*TIhnQkLqCusJW-*Rh2E3=NSnsov`f^5 z%*!1ML zI1PUe)OSRNLQ?*sfhDIMHlv8Ye}xWgC4QBcT2)(Z6btm6jnU*g5&T|%OFu9axE^Mnfq*nYn&LFk{NSndPQF^g9{(O1c zj!OM#Hb9#qq&PM;2iCNzoJN#b5zl7(sQONQo$=K%BeM^cX}oP{T`@X^&{Ei%Yny*l z+Uc-K(#4A@D@T`;uf4+KaC{N^Jb!_=l~WNgd$6RTalgAESGbc!i|{ec(cjk3TwaB} zU3~~fZg^f&{?g930~ghY)*mv#6GSiiK;P)#gYuV=P4XCd6@4`V>x@NUO@BN-4<=9_i$AoBtA6L5`PxmNBA!n{75!2)?8rL_j;68j8OX*W%TcEuJiqeUHIf^7?q@_t z5G^L#xk_iPNiZi3qwo*qEk)FSh8q#Sd|n&j$9EL+q^4@!u{#^lH%yct+Mz(MCd_8Z z^nJoDGqkY$@%qOAMqU;sqtx1w9wh*LJChsv%9skp5B6loE|kNHF4T~EM+j%-g6~g9 zq#`kXZkt?wDq1*AO=6X|I=k{%ken`q!0hiet~8bLn=F%CyMuhl2Spv(i>OAHyBs#3vG^dh+nY<^g}F;hLOXv?bw;Gt;CzK4N*)>xmJ%848QM zKh?tqNaXkTqM1nKnNbuyUz4d}_{R5mS>ADSzX3BGd3htjnSoyCFWe*D@m-;Hcrl{x z&0V_x-*E4_Lf*ZJEey1$hAOkmbO-z=V=$3iJUV1cglGkoeX*wHE%A>Fov zzRLPqaFfz@iIuAD^lS4|sBv!jU&5!T9^G*=xU?O*eFrgO4eVayEE{VHu~m<=&B0je z%NFXL5(v*Ic+p$&i5Dy2N?u7GQus@JTynUE#x} z@B)7$ywYRZ(@gl{lS}^gL%Va$$1yw{5UN-sK{xXUdF){K{Ae?F?dft9nc@ut@*H}$ z`SF6=-A&!FNYLNEe`_58U?`2JbkG0c@o{|WlMIv2%b@VtkS>QsDKs$IUGu_DEuuC% zriNaR2VHsT6Th|K%u_j z06UeM^5D2=saI&0uTX`}UQhh$DikfiB&d|%B^%P^H@4e>s}g6g-yu7D%Nd%rw|YUO zRY&=18pjj;TPL--$9Y+`vKndwQG&1INp8Vi_b{|$abLvwyJdE%BM@$FaeccYhVxm# z7;GK2_I*2Acgorle#Xng`+=Uin;u&f!_S*Kdp2g%TB`L#DV_bg4;GiN@1|>}rpBoewe17QJPf`!$C{ zV*N!cId*g7$-kc{w6j{5-RU%c51p`ns0h&+97kI++4}&Qo0k5S*MUP0e!L_c!@VZk z_ee<_aadQDboc{ZKKHD?TF=>C=cWdKcWDQY++RNdAPx^=vaOeF86=7qomW%0`jxH{ zl&UQ3fp}MS=Vb*`bCnRQ@0l5V2D1tYOsmeL1jKH0!wV6wMhQ z5admg@KqNoa$eWAKAH7EfENy;#M!~R@x`vodb`D7(tjsQH@1W9Bq?>tj?N}YL0Fr& zuKoN4xKuWnbWC!f5UiJ-5aT!T{=0pH4WIIu-;Zl$&Ou+^5Z>*1bOuZV%Ks1*Xvw?j z11it`uf4KEg{F>O2)zZFiQpu-cEQ*kmR^3fY%{dknFb=M-lab;j%HU%4$r@P;9ZRpoyF*ctHu{!D@0CO{x zARdZ#>&9%k(QW4Bg*fy67!DwGhV09ALO(e+-Ks)+8HkOeOgO@%=uAriq%L}fZ+@FP z<-Op$kD6M~(CB=c_2jFk&_bjvTx z7D}!!7TAppqN~P_wHe>I5%$B7DF#* zH&$bp$v+j*d^o`fOSS2V+2y3DLL&O7G-&inMIZhr*g+hS7Uoy=bP+Mo{%5e$Md+Gc zPqlL~6AthOy@hA{sy=99&RkUq^K43GRlBPS*O?E{lT71<0*ECt~ah<=hyt5l;p8k}j~BTCRf z^*=}vp~zWF#BbmH`_A(q^*4z6S1ud?)Ry0L^?VGalynvnt|H!bY$3;XKb8~yv-Jq3 zjeQ^HNQ^JY0lwK}Ft0>Ia=Pp!tx)K8AF7IfPj3bd~s#zr4DvWPPj zLNh{H1Ta0^p?HrMz24j*NW33fKMr4(+Zt`LulT-xN+q>32#Ry&jee4CU%%sMUA&}o z5V?cz{t%o97T%1x?h{Rj|!sWS^ulnUxutX?29?cgrxUH`T3zI^OzZB zpg(t+F5RUno*meM1>ISZkMbVO8NaU3{9c1d+%@BREbl7FXU_=7&#UAl-siqRyPj26 zbmjAw~ad>)UpTzM1!wh20tjCxy1q1tQAsRZipM%{(JZKbeqM1Y6F z(md>S#lj_ukIxpz?;)Q~7oEygkNae-W3Tc9?z!R|>euOKUWO_or{6A95s{7WxLuW{ zH;<&P9X^X0+G7Sl+SYG9!}svkuRUFS59}nYe^v4v1o&2$&7+G)Z)Oy|VAuIx*4%Bj z+=?mpX3?|W(vm!^GV@oCz%RDKk10a3Z-Q#tzXjsh$#_MkB>5qiwNZ^5T8;)DH{Gs3 zVW(qi@f49onpF&BCAw2j)o&wdJ zIBQ@0Vg8_>QuXQu>Z(Ii@NW)JBnn3UZqU7^3One@`?;6Jp`w;w2gAm0?U1!EE6h6-&tq zAj4wDy)=3K^h5-}q0e>-+JU(7q@g!oX10fw*x~#}ykO*@L>2(@MmZN!GgnMwy%S0$rW(SLD@h&xI^ADv4){9hxWu?``+&fpS`m zL!Q2`KX5}f&DRVCOT`rmOP{Hb$F{&7Y)^QX;O<$%-Yx_I0qEThRGW-i>2s94rQb;? zZHP?Tm~G=Inwlp>Ygl%8_nzp6`FRA}v3IuO1rNlyQol^2=YNzJ=MD(ij5B6xYZEM4 zb9cNU{H&usz+&`#@X%D^QZ3EFq|Tp87>Ex(Y|JZ}Dt4Zz;|pLV95Vs;P6F)M7JqPn zso}%+BmDFFZj1O-g)nGp$lAR90!qVK!Spb$gfcfuU!X1X%KbQF90(Ah;guYF%WRTN znGz=TVR8nG2Nxv0>!R-Kl#L;CNcy_BtwjDx=Zz5|YWZ?FtGX;CZalcxlDUTsOn8ei zSA8k5LyYiON0Zm!c*BS@{tBaHV2I?z-3)#&iEdAGQ#v?f+v8tY=8)a~@72_kKl6_t zI@1m8d!dbV#&>oqeCX+nC?a!eQ>VyEc7C|Bi24Wfk;|fY9y><9kI13}u2}ze;Un}Q z|K}(7D+P&J_w)FG;7xC~ilVpwL~*NM%c|%HT2VozG(!<8kv0F7x-%%eqt>wj-u}4} zr(s7}j^>{T{Z6ngC~yk5jxeT4;HjM(lX13$bgFB#&6ClB7armu@iC92Zdv(BwQIE_oAjNUtq_48$Oe2F4FEsNQh~- z|9?2CpzWS0Kkm2GB;)Wa+y2Z9@vFhJY8GnB14rnF!CbBgtn2~x@T7>QJ%1TX8oK`Y z58SKvMUoLi-3|e=XeGhYn-rw>V(i zj43a^z9^_yv~I%H;(T&@R}*^M%fQ)V4d?#QQt4sE6LyFx^8w|5G4y3!!Ou**3oT$d zv6&h`>0-N@;;~9&^t5CToofVJNCprttK~}4V4!zKJ-B%?V=<&Fj^G&n*XORvTZTz3 zDKsgpJ?_U1bw%lz1}Bb6f6(8Ras}`vhl$bA2AZ%9c%o4%1mMf|m{^{IK*snG>$lI6 zDrTd@S;J?Lf=1-|2Do|c_RdR@$RBT;7S7$iArK7{65MaO-wwz?m3oEskIn@jkC_!nb3c%(BCJ^8u=bv%-bbhB(OR^WCEw1)Q_uNm)oe9@M@l-ew2w%91gJe zI?qv+oVmnNdx(dn(kAOaP{jgS&ha?qXj`s|w9Hvu78E z{lrOpw^ZZ2%vAyaWW(}O;+pn2E-OwrS|74Jju&oK`1X@ynQXqlj5POPXBLMS;m47x z+%N{MZTI6+Bz4lT)?rV1G)|1>m!x0(VdwwBJb?j>ZNF+h?n^Bd8T{G#dCz1SQk6^G z%!{&OjJ#ru4H6STw&ocf%Ao(cG{~<4{BRA{p51T`K6ZSQOx+g*!EG~t!9Rf{!JCqB z1dxZ6h?Us{5K-n&jr}y;qc-(8m$u!LWoHyi;Vxzt##-}eSGqWNYep{X!{(fd!#(=m zIm&-odT1+|(sJ?2RRjhUgoxjq%)@IEYz3;VN^gdS9o;y@FTy5`7 zK(EEFfB6IPOvW`YeVRZlj{4@7a7o2_YCQb@m%_T}?JtKh&^Ea@!lBpGV0XB6hcx)# zzOTXMQnrZQS!KdU6-5)^)O=q@BcZtU@RZ(%Jwgtbtc@47_WpKT+E2YIlO{+FA2cJ+ zYzMw&0BrrL(rrlh$nM01$LXFE$U|JUAkM@7+eefA7P&PWCU z$vJ}{Q9zPN6af)Q4oR3n1|&%iiX=&*f&`HuD4-}w!T=&DNJdd|5)^?UhaqeY&-1>| z`+a+M_pkk9&)J^S)m^u4-MV$VreodT?Y6YvQ`T&z#C8NnmDp~n*FIT@-1!#1lNkE$ zHb7`{8mH<20YNcjfp#E#0B>K@qs@kWC19Cq^yot~c$^Ne9yz}N`SnZ=&vWKHwL0BP zi&(Xtu_)`+Gj#T+pDajK9X1%oOs>xKUE}{^H7v3+DHGmQ`=shA)CN2s0`_w!zb(wk zl_tJmOM_SW?tb1{@ak_{OJ>metPZ>GU0aOiuui%uBzbI7B5F0}&jV&A=DshSz4>)A zwiG)q`-DnQ)A8($G!QwGm_-SFwQ@WZcl0B{Aq!u72Ej4qkxk5cuEY@~L`4+Ka)~B< zzJ&q>JS9u=BQ}N^wC`)Dr6I8R^N$9}x*D&V*(@_UoP=p=@v<_rtmnqEL(*0F3CfSB z!%YXNdX_mF!z86X)PIGaviE#s`5I@7tLfIw3z1P?Pc@)HPgYCJ(#(lPSo7vsh*f$| zYyBCop&hO9(mqaV9<7IGP&8+`O7mTA(3`gRr*%HoUxA}#j(YFxHLe=9eshTz0Wpwm z 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%0A1=*&Ec zYi>AVH*VZcJEjv{#>6bui0^&9c)k$T{~RApXI5T@*Fsf0H~DYHx6@;(`kMUEcl#K6 zU3;h@?A@^Oh(*$3n*A(|>giAR%Tl}2Ngj{%-2}~JH9t=YxRTA&g?9^&F~Il`Ij_&; zIz^51mOrjlqHCXz5RRQ?-&~~YX~HcwpV?&xr-u!l%{qMU;o;!QM**J5osxo-$zkv1 zjJ^6~4LeR)H;5ne|U&{ywuC6!PR`M zHcfm>=bKjS533FTL`;?D`i0ep9P6=bVR*(&Hk8vUh3s0w!?&fQ{oI4nbcxBNA%a#% zn+LB`2JOmTX`K4>&TU!h{VHbQ;MXkK6ir_>vR79NHx%>K(ONcXfn}DBQs)p4zAApFJ{}O&Bkgo zS{=k`6in38*lYKD_D&~PNZa%UcPDWxe1BRl+ix`wjyYM0e(!4pT!62q@v1j z-m;Ihy^v?lV#<6B2cnLDl6S4f#aDzd7+t|tX>fnSEBH$0v4No%?Lnb4OAh{nd?GwA z-0zhIwTR($9(9fLDQTp0{#LQZ%%Fu9+Sm@hM*~wBiO6<-;G=izP9$y`wTYZDf57_Z zg4F_Wea6;%p~c-iJU$3#D$AwHw-3fSnh!pZC$G)VU>v(`4dY(LPw8k&A5>R;p0oi& zhW_f=RgYVBjk%{%Z>nt|u4ITJ;`3)o`zE(WFF}2qeg4EjJ$7uI*J7!1F4=I<+(mo2yJ=kH*9)?U3U%~(oS)Yu=3ia8pM z^KNl|Gt=m~_~U(o!8ef>n+pCO++jtwe`Lru7(tRwUJFf?C8h37x8}oM`P4SG-=mR4 z5?ft2)cu7|@K?FsA>dHLc{DNAlf1E)3zRk}J>YM4m{@Z8rhEaXF zz_TcnJuY^#Y!f5lmzF?fcguXY?#nT3;I3FvyG&;}1Qvq}#yaI%4v~a?!UBU35FH(1 z%LBO~PPROMSrf{v;*HLi|nnn*cVoVEz^i$n%AKAa@7_xdLhKkSBx$ zl2MQgga$n6Cp^-S5+n^NgH;}K0x5WGfJi`HZNTFNc|(qXKM-i+2y)1i1_*oJkQ-Pb zXb5Ny`?qWzz=46BPulbbZMy>*;5h^=7oY%8<_!4(DuIUw$m0QdLK|KuZQMAap&-JR z&?*M}{^IlnZ6N^_1M1#5k@?rY51jR5XuN`{Uy%_a5#e;K`Ma{ z4bsb?kEURYIVrmdN`1jT1Z+U|AAPz4=stk{PhVspNx<{36@tz|)PSF0S3-L}VCx7h z{g1^=0qvjGtw2rWi8TmzxdO3)x<-KFdQyvEb#GvA!clVtz3~M+|1*sT5(ZQep!+|^ zf(McXTFF3X31T6w6P--{mO~f;1fBjh1_-&oj^_VPH%*8R==K-K4RGX~fj0m23i`X` zAFEn{)*ONM-X~Uoz<46q@xRvp@7Db9w$uT-!+=#BfvkUN`_G7lApVno&gGMqP~fO| z0?z*&XXIp+2vv;$FHfG^NFR(l8l@&ABPlJ!gG4!_Z@8me)r2fB>q;mI@nC!%Q8yet z(I}*vP#_W`q@hktq3VdiAibPC19^Y|6h=+R&j)o5Ph@xjXxyF=!WG31_s| zIY*3_fR58^e(vX;osk&OHy1}w3{r?k>fdryrT*8gs7n18om8d%-8oQQRq9`M1DTW2_y3ds zD;CfsoSPwN@fq$JRKQxmQ(#(PT~JwCTZ%31EbS{DDV-|aeM$F<^%Y=pfFM?|(abZ= Zv(9tN^Ue#;yO;MU50L)<^8cs>{s+m5pvC|I literal 0 HcmV?d00001 diff --git a/composer.json b/composer.json index 045d03d..b055c3f 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,7 @@ "autoload": { "psr-4": { "Amp\\Process\\": "lib" - } + }, + "files": ["lib/functions.php"] } } diff --git a/examples/basic-command.php b/examples/basic-command.php index bb79d42..09c2b72 100644 --- a/examples/basic-command.php +++ b/examples/basic-command.php @@ -6,8 +6,7 @@ use Amp\ByteStream\Message; use Amp\Process\Process; Amp\Loop::run(function () { - $process = new Process("echo 'Hello, world!'"); - $process->start(); + $process = yield Process::start("echo 'Hello, world!'"); echo yield new Message($process->getStdout()); diff --git a/examples/ping-many.php b/examples/ping-many.php new file mode 100644 index 0000000..b618d4e --- /dev/null +++ b/examples/ping-many.php @@ -0,0 +1,34 @@ +getStdout(); + while ($chunk = yield $stream->read()) { + echo $chunk; + } + + $code = yield $process->join(); + + echo "Process {$process->getPid()} exited with {$code}\n"; +} + +Amp\Loop::run(function () { + $hosts = ['8.8.8.8', '8.8.4.4', 'google.com', 'stackoverflow.com', 'github.com']; + + $promises = []; + + foreach ($hosts as $host) { + $promises[] = new \Amp\Coroutine(show_process_output(Process::start("ping {$host}"))); + } + + yield all($promises); +}); diff --git a/examples/watch-live.php b/examples/watch-live.php index 0de1e5d..0d1b7b9 100644 --- a/examples/watch-live.php +++ b/examples/watch-live.php @@ -5,8 +5,7 @@ include dirname(__DIR__) . "/vendor/autoload.php"; use Amp\Process\Process; Amp\Loop::run(function () { - $process = new Process("echo 1; sleep 1; echo 2; sleep 1; echo 3; exit 42"); - $process->start(); + $process = yield Process::start("echo 1; sleep 1; echo 2; sleep 1; echo 3; exit 42"); $stream = $process->getStdout(); while ($chunk = yield $stream->read()) { diff --git a/examples/write-command.php b/examples/write-command.php index a1595e0..373830b 100644 --- a/examples/write-command.php +++ b/examples/write-command.php @@ -6,8 +6,7 @@ use Amp\ByteStream\Message; use Amp\Process\Process; Amp\Loop::run(function () { - $process = new Process('read ; echo "$REPLY"'); - $process->start(); + $process = yield Process::start('read ; echo "$REPLY"'); /* send to stdin */ $process->getStdin()->write("abc\n"); diff --git a/lib/Internal/Posix/Handle.php b/lib/Internal/Posix/Handle.php new file mode 100644 index 0000000..1a6a86a --- /dev/null +++ b/lib/Internal/Posix/Handle.php @@ -0,0 +1,33 @@ +startDeferred = new Deferred; + $this->endDeferred = new Deferred; + $this->originalParentPid = \getmypid(); + } + + /** @var Deferred */ + public $endDeferred; + + /** @var Deferred */ + public $startDeferred; + + /** @var resource */ + public $proc; + + /** @var resource[] */ + public $pipes; + + /** @var string */ + public $extraDataPipeWatcher; + + /** @var int */ + public $originalParentPid; +} diff --git a/lib/Internal/Posix/Runner.php b/lib/Internal/Posix/Runner.php new file mode 100644 index 0000000..e61394b --- /dev/null +++ b/lib/Internal/Posix/Runner.php @@ -0,0 +1,162 @@ +status = ProcessStatus::ENDED; + + if (!\is_resource($stream) || \feof($stream)) { + $handle->endDeferred->fail(new ProcessException("Process ended unexpectedly")); + } else { + $handle->endDeferred->resolve((int) \rtrim(@\stream_get_contents($stream))); + } + } + + public function onProcessStartExtraDataPipeReadable($watcher, $stream, Handle $handle) { + Loop::cancel($watcher); + + $pid = \rtrim(@\fgets($stream)); + + if (!$pid || !\is_numeric($pid)) { + $handle->startDeferred->fail(new ProcessException("Could not determine PID")); + return; + } + + $handle->status = ProcessStatus::RUNNING; + $handle->pid = (int) $pid; + $handle->stdin = new ResourceOutputStream($handle->pipes[0]); + $handle->stdout = new ResourceInputStream($handle->pipes[1]); + $handle->stderr = new ResourceInputStream($handle->pipes[2]); + + $handle->extraDataPipeWatcher = Loop::onReadable($stream, [$this, 'onProcessEndExtraDataPipeReadable'], $handle); + Loop::unreference($handle->extraDataPipeWatcher); + + $handle->startDeferred->resolve($handle); + } + + /** + * {@inheritdoc} + */ + public function start(string $command, string $cwd = null, array $env = [], array $options = []): Promise { + $command = \sprintf( + '{ (%s) <&3 3<&- 3>/dev/null & } 3<&0;' . + 'pid=$!; echo $pid >&3; wait $pid; RC=$?; echo $RC >&3; exit $RC', + $command + ); + + $handle = new Handle; + + $handle->proc = @\proc_open($command, self::FD_SPEC, $handle->pipes, $cwd ?: null, $env ?: null, $options); + + if (!\is_resource($handle->proc)) { + $message = "Could not start process"; + if ($error = \error_get_last()) { + $message .= \sprintf(" Errno: %d; %s", $error["type"], $error["message"]); + } + throw new ProcessException($message); + } + + $status = \proc_get_status($handle->proc); + + if (!$status) { + \proc_close($handle->proc); + throw new ProcessException("Could not get process status"); + } + + \stream_set_blocking($handle->pipes[3], false); + + /* It's fine to use an instance method here because this object is assigned to a static var in Process and never + needs to be dtor'd before the process ends */ + Loop::onReadable($handle->pipes[3], [$this, 'onProcessStartExtraDataPipeReadable'], $handle); + + return $handle->startDeferred->promise(); + } + + /** + * {@inheritdoc} + */ + public function join(ProcessHandle $handle): Promise { + /** @var Handle $handle */ + + if ($handle->extraDataPipeWatcher !== null) { + Loop::reference($handle->extraDataPipeWatcher); + } + + return $handle->endDeferred->promise(); + } + + /** + * {@inheritdoc} + */ + public function kill(ProcessHandle $handle) { + /** @var Handle $handle */ + + // Forcefully kill the process using SIGKILL. + if (!\proc_terminate($handle->proc, 9)) { + throw new ProcessException("Terminating process failed"); + } + + Loop::cancel($handle->extraDataPipeWatcher); + $handle->extraDataPipeWatcher = null; + + $handle->status = ProcessStatus::ENDED; + + $handle->endDeferred->fail(new ProcessException("The process was killed")); + } + + /** + * {@inheritdoc} + */ + public function signal(ProcessHandle $handle, int $signo) { + /** @var Handle $handle */ + + if (!\proc_terminate($handle->proc, $signo)) { + throw new ProcessException("Sending signal to process failed"); + } + } + + /** + * {@inheritdoc} + */ + public function destroy(ProcessHandle $handle) { + /** @var Handle $handle */ + + if (\getmypid() === $handle->originalParentPid && $handle->status < ProcessStatus::ENDED) { + $this->kill($handle); + } + + if ($handle->extraDataPipeWatcher !== null) { + Loop::cancel($handle->extraDataPipeWatcher); + } + + for ($i = 0; $i < 4; $i++) { + if (\is_resource($handle->pipes[$i] ?? null)) { + \fclose($handle->pipes[$i]); + } + } + + if (\is_resource($handle->proc)) { + \proc_close($handle->proc); + } + } +} diff --git a/lib/Internal/ProcessHandle.php b/lib/Internal/ProcessHandle.php new file mode 100644 index 0000000..30686ac --- /dev/null +++ b/lib/Internal/ProcessHandle.php @@ -0,0 +1,24 @@ + Succeeds with a process descriptor or fails if the process cannot be started + * @throws \Amp\Process\ProcessException If starting the process fails. + */ + function start(string $command, string $cwd = null, array $env = [], array $options = []): Promise; + + /** + * Wait for the child process to end + * + * @param ProcessHandle $handle The process descriptor + * @return Promise Succeeds with exit code of the process or fails if the process is killed. + */ + function join(ProcessHandle $handle): Promise; + + /** + * Forcibly end the child process + * + * @param ProcessHandle $handle The process descriptor + * @return void + * @throws \Amp\Process\ProcessException If terminating the process fails + */ + function kill(ProcessHandle $handle); + + /** + * Send a signal signal to the child process + * + * @param ProcessHandle $handle The process descriptor + * @param int $signo Signal number to send to process. + * @return void + * @throws \Amp\Process\ProcessException If sending the signal fails. + */ + function signal(ProcessHandle $handle, int $signo); + + /** + * Release all resources held by the process handle + * + * @param ProcessHandle $handle The process descriptor + * @return void + */ + function destroy(ProcessHandle $handle); +} diff --git a/lib/Internal/ProcessStatus.php b/lib/Internal/ProcessStatus.php new file mode 100644 index 0000000..22adde4 --- /dev/null +++ b/lib/Internal/ProcessStatus.php @@ -0,0 +1,12 @@ +startDeferred = new Deferred; + $this->endDeferred = new Deferred; + } + + /** @var Deferred */ + public $startDeferred; + + /** @var Deferred */ + public $endDeferred; + + /** @var string */ + public $exitCodeWatcher; + + /** @var resource */ + public $proc; + + /** @var int */ + public $wrapperPid; + + /** @var resource */ + public $wrapperStderrPipe; + + /** @var resource[] */ + public $sockets; + + /** @var string */ + public $connectTimeoutWatcher; + + /** @var string[] */ + public $securityTokens; +} diff --git a/lib/Internal/Windows/HandshakeStatus.php b/lib/Internal/Windows/HandshakeStatus.php new file mode 100644 index 0000000..da62978 --- /dev/null +++ b/lib/Internal/Windows/HandshakeStatus.php @@ -0,0 +1,15 @@ +socketConnector->address, + $this->socketConnector->port, + SocketConnector::SECURITY_TOKEN_SIZE + ); + + if ($workingDirectory !== '') { + $result .= ' ' . \escapeshellarg('--cwd=' . \rtrim($workingDirectory, '\\')); + } + + $result .= ' ' . $command; + + return $result; + } + + public function __construct() { + $this->socketConnector = new SocketConnector; + } + + /** + * {@inheritdoc} + */ + public function start(string $command, string $cwd = null, array $env = [], array $options = []): Promise + { + $command = $this->makeCommand($command, $cwd ?? ''); + + $options['bypass_shell'] = true; + + $handle = new Handle; + $handle->proc = @\proc_open($command, self::FD_SPEC, $pipes, $cwd ?: null, $env ?: null, $options); + + if (!\is_resource($handle->proc)) { + $message = "Could not start process"; + if ($error = \error_get_last()) { + $message .= \sprintf(" Errno: %d; %s", $error["type"], $error["message"]); + } + throw new ProcessException($message); + } + + $status = \proc_get_status($handle->proc); + + if (!$status) { + \proc_close($handle->proc); + throw new ProcessException("Could not get process status"); + } + + $securityTokens = \random_bytes(SocketConnector::SECURITY_TOKEN_SIZE * 6); + $written = \fwrite($pipes[0], $securityTokens); + + \fclose($pipes[0]); + \fclose($pipes[1]); + + if ($written !== SocketConnector::SECURITY_TOKEN_SIZE * 6) { + \fclose($pipes[2]); + \proc_close($handle->proc); + + throw new ProcessException("Could not send security tokens to process wrapper"); + } + + $handle->securityTokens = \str_split($securityTokens, SocketConnector::SECURITY_TOKEN_SIZE); + $handle->wrapperPid = $status['pid']; + $handle->wrapperStderrPipe = $pipes[2]; + + $this->socketConnector->registerPendingProcess($handle); + + return $handle->startDeferred->promise(); + } + + /** + * {@inheritdoc} + */ + public function join(ProcessHandle $handle): Promise + { + /** @var Handle $handle */ + + if ($handle->exitCodeWatcher !== null) { + Loop::reference($handle->exitCodeWatcher); + } + + return $handle->endDeferred->promise(); + } + + /** + * {@inheritdoc} + */ + public function kill(ProcessHandle $handle) + { + /** @var Handle $handle */ + + // todo: send a signal to the wrapper to kill the child instead ? + if (!\proc_terminate($handle->proc)) { + throw new ProcessException("Terminating process failed"); + } + + Loop::cancel($handle->exitCodeWatcher); + $handle->exitCodeWatcher = null; + + $handle->status = ProcessStatus::ENDED; + + $handle->endDeferred->fail(new ProcessException("The process was killed")); + } + + /** + * {@inheritdoc} + */ + public function signal(ProcessHandle $handle, int $signo) + { + throw new ProcessException('Signals are not supported on Windows'); + } + + /** + * {@inheritdoc} + */ + public function destroy(ProcessHandle $handle) + { + /** @var Handle $handle */ + + if ($handle->status < ProcessStatus::ENDED) { + $this->kill($handle); + } + + if ($handle->exitCodeWatcher !== null) { + Loop::cancel($handle->exitCodeWatcher); + } + + for ($i = 0; $i < 4; $i++) { + if (\is_resource($handle->sockets[$i] ?? null)) { + \fclose($handle->sockets[$i]); + } + } + + \stream_get_contents($handle->wrapperStderrPipe); + \fclose($handle->wrapperStderrPipe); + + if (\is_resource($handle->proc)) { + \proc_close($handle->proc); + } + } +} diff --git a/lib/Internal/Windows/SignalCode.php b/lib/Internal/Windows/SignalCode.php new file mode 100644 index 0000000..3849d73 --- /dev/null +++ b/lib/Internal/Windows/SignalCode.php @@ -0,0 +1,13 @@ +server = \stream_socket_server( + self::SERVER_SOCKET_URI, + $errNo, $errStr, + \STREAM_SERVER_LISTEN | \STREAM_SERVER_BIND + ); + + if (!$this->server) { + throw new \Error("Failed to create TCP server socket for process wrapper: {$errNo}: {$errStr}"); + } + + if (!\stream_set_blocking($this->server, false)) { + throw new \Error("Failed to set server socket to non-blocking mode"); + } + + list($this->address, $this->port) = \explode(':', \stream_socket_get_name($this->server, false)); + $this->port = (int)$this->port; + + Loop::unreference(Loop::onReadable($this->server, [$this, 'onServerSocketReadable'])); + } + + + private function failClientHandshake($socket, int $code): void + { + \fwrite($socket, \chr(SignalCode::HANDSHAKE_ACK) . \chr($code)); + \fclose($socket); + unset($this->pendingClients[(int)$socket]); + } + + private function failHandleStart(Handle $handle, string $message, ...$args) + { + Loop::cancel($handle->connectTimeoutWatcher); + unset($this->pendingProcesses[$handle->wrapperPid]); + + foreach ($handle->sockets as $socket) { + \fclose($socket); + } + + $handle->startDeferred->fail(new ProcessException(\vsprintf($message, $args))); + } + + /** + * Read data from a client socket + * + * This method cleans up internal state as appropriate. Returns null if the read fails or needs to be repeated. + * + * @param resource $socket + * @param int $length + * @param PendingSocketClient $state + * @return string|null + */ + private function readDataFromPendingClient($socket, int $length, PendingSocketClient $state) + { + $data = \fread($socket, $length); + + if ($data === false || $data === '') { + \fclose($socket); + Loop::cancel($state->readWatcher); + Loop::cancel($state->timeoutWatcher); + unset($this->pendingClients[(int)$socket]); + return null; + } + + $data = $state->recievedDataBuffer . $data; + + if (\strlen($data) < $length) { + $state->recievedDataBuffer = $data; + return null; + } + + $state->recievedDataBuffer = ''; + + Loop::cancel($state->readWatcher); + Loop::cancel($state->timeoutWatcher); + + return $data; + } + + public function onReadable_Handshake($watcher, $socket) { + $socketId = (int)$socket; + $pendingClient = $this->pendingClients[$socketId]; + + if (null === $data = $this->readDataFromPendingClient($socket, self::SECURITY_TOKEN_SIZE + 6, $pendingClient)) { + return; + } + + $packet = \unpack('Csignal/Npid/Cstream_id/a*client_token', $data); + + // validate the client's handshake + if ($packet['signal'] !== SignalCode::HANDSHAKE) { + $this->failClientHandshake($socket, HandshakeStatus::SIGNAL_UNEXPECTED); + return; + } + + if ($packet['stream_id'] > 2) { + $this->failClientHandshake($socket, HandshakeStatus::INVALID_STREAM_ID); + return; + } + + if (!isset($this->pendingProcesses[$packet['pid']])) { + $this->failClientHandshake($socket, HandshakeStatus::INVALID_PROCESS_ID); + return; + } + + $handle = $this->pendingProcesses[$packet['pid']]; + + if (isset($handle->sockets[$packet['stream_id']])) { + $this->failClientHandshake($socket, HandshakeStatus::DUPLICATE_STREAM_ID); + \trigger_error(\sprintf( + "%s: Received duplicate socket for process #%s stream #%d", + self::class, + $handle->pid, + $packet['stream_id'] + ), E_USER_WARNING); + return; + } + + if ($packet['client_token'] !== $handle->securityTokens[$packet['stream_id']]) { + $this->failClientHandshake($socket, HandshakeStatus::INVALID_CLIENT_TOKEN); + $this->failHandleStart($handle, "Invalid client security token for stream #%d", $packet['stream_id']); + return; + } + + $ackData = \chr(SignalCode::HANDSHAKE_ACK) . \chr(HandshakeStatus::SUCCESS) + . $handle->securityTokens[$packet['stream_id'] + 3]; + + // Unless we set the security token size so high that it won't fit in the + // buffer, this probably shouldn't ever happen unless something has gone wrong + if (\fwrite($socket, $ackData) !== self::SECURITY_TOKEN_SIZE + 2) { + unset($this->pendingClients[$socketId]); + return; + } + + $pendingClient->pid = $packet['pid']; + $pendingClient->streamId = $packet['stream_id']; + + $pendingClient->readWatcher = Loop::onReadable($socket, [$this, 'onReadable_HandshakeAck']); + } + + public function onReadable_HandshakeAck($watcher, $socket) + { + $socketId = (int)$socket; + $pendingClient = $this->pendingClients[$socketId]; + + // can happen if the start promise was failed + if (!isset($this->pendingProcesses[$pendingClient->pid])) { + \fclose($socket); + Loop::cancel($watcher); + Loop::cancel($pendingClient->timeoutWatcher); + unset($this->pendingClients[$socketId]); + return; + } + + if (null === $data = $this->readDataFromPendingClient($socket, 2, $pendingClient)) { + return; + } + + unset($this->pendingClients[$socketId]); + $handle = $this->pendingProcesses[$pendingClient->pid]; + + $packet = \unpack('Csignal/Cstatus', $data); + + if ($packet['signal'] !== SignalCode::HANDSHAKE_ACK || $packet['status'] !== HandshakeStatus::SUCCESS) { + $this->failHandleStart( + $handle, "Client rejected handshake with code %d for stream #%d", + $packet['status'], $pendingClient->streamId + ); + return; + } + + $handle->sockets[$pendingClient->streamId] = $socket; + + if (count($handle->sockets) === 3) { + $pendingClient->readWatcher = Loop::onReadable($handle->sockets[0], [$this, 'onReadable_ChildPid'], $handle); + } + } + + public function onReadable_ChildPid($watcher, $socket, Handle $handle) + { + Loop::cancel($watcher); + Loop::cancel($handle->connectTimeoutWatcher); + + $data = \fread($socket, 5); + + if ($data === false || $data === '') { + $this->failHandleStart($handle, 'Failed to read PID from wrapper: No data received'); + return; + } + + if (\strlen($data) !== 5) { + $this->failHandleStart( + $handle, 'Failed to read PID from wrapper: Recieved %d of 5 expected bytes', \strlen($data) + ); + return; + } + + $packet = \unpack('Csignal/Npid', $data); + + if ($packet['signal'] !== SignalCode::CHILD_PID) { + $this->failHandleStart( + $handle, "Failed to read PID from wrapper: Unexpected signal code %d", $packet['signal'] + ); + return; + } + + $handle->status = ProcessStatus::RUNNING; + $handle->pid = $packet['pid']; + $handle->stdin = new ResourceOutputStream($handle->sockets[0]); + $handle->stdout = new ResourceInputStream($handle->sockets[1]); + $handle->stderr = new ResourceInputStream($handle->sockets[2]); + + $handle->exitCodeWatcher = Loop::onReadable($handle->sockets[0], [$this, 'onReadable_ExitCode'], $handle); + Loop::unreference($handle->exitCodeWatcher); + + unset($this->pendingProcesses[$handle->wrapperPid]); + $handle->startDeferred->resolve($handle); + } + + public function onReadable_ExitCode($watcher, $socket, Handle $handle) + { + $handle->exitCodeWatcher = null; + Loop::cancel($watcher); + + $data = \fread($socket, 5); + + if ($data === false || $data === '') { + $handle->status = ProcessStatus::ENDED; + $handle->endDeferred->fail(new ProcessException('Failed to read exit code from wrapper: No data received')); + return; + } + + if (\strlen($data) !== 5) { + $handle->status = ProcessStatus::ENDED; + $handle->endDeferred->fail(new ProcessException( + \sprintf('Failed to read exit code from wrapper: Recieved %d of 5 expected bytes', \strlen($data)) + )); + return; + } + + $packet = \unpack('Csignal/Ncode', $data); + + if ($packet['signal'] !== SignalCode::EXIT_CODE) { + $this->failHandleStart( + $handle, "Failed to read exit code from wrapper: Unexpected signal code %d", $packet['signal'] + ); + return; + } + + $handle->status = ProcessStatus::ENDED; + $handle->endDeferred->resolve($packet['code']); + } + + public function onClientSocketConnectTimeout($watcher, $socket) { + $id = (int)$socket; + + Loop::cancel($this->pendingClients[$id]->readWatcher); + unset($this->pendingClients[$id]); + + \fclose($socket); + } + + public function onServerSocketReadable() { + $socket = \stream_socket_accept($this->server); + + if (!\stream_set_blocking($socket, false)) { + throw new \Error("Failed to set client socket to non-blocking mode"); + } + + $pendingClient = new PendingSocketClient; + $pendingClient->readWatcher = Loop::onReadable($socket, [$this, 'onReadable_Handshake']); + $pendingClient->timeoutWatcher = Loop::delay(self::CONNECT_TIMEOUT, [$this, 'onClientSocketConnectTimeout'], $socket); + + $this->pendingClients[(int)$socket] = $pendingClient; + } + + public function onProcessConnectTimeout($watcher, Handle $handle) { + $status = \proc_get_status($handle->proc); + + $error = null; + if (!$status['running']) { + $error = \stream_get_contents($handle->wrapperStderrPipe); + } + $error = $error ?: 'Process did not connect to server before timeout elapsed'; + + \fclose($handle->wrapperStderrPipe); + \proc_close($handle->proc); + foreach ($handle->sockets as $socket) { + \fclose($socket); + } + + $handle->startDeferred->fail(new ProcessException(\trim($error))); + } + + public function registerPendingProcess(Handle $handle) + { + $handle->connectTimeoutWatcher = Loop::delay(self::CONNECT_TIMEOUT, [$this, 'onProcessConnectTimeout'], $handle); + + $this->pendingProcesses[$handle->wrapperPid] = $handle; + } +} diff --git a/lib/Process.php b/lib/Process.php index 8dc545e..d18972c 100644 --- a/lib/Process.php +++ b/lib/Process.php @@ -5,17 +5,16 @@ namespace Amp\Process; use Amp\ByteStream\ResourceInputStream; use Amp\ByteStream\ResourceOutputStream; use Amp\Deferred; -use Amp\Delayed; -use Amp\Loop; +use Amp\Process\Internal\Posix\Runner as PosixProcessRunner; +use Amp\Process\Internal\ProcessHandle; +use Amp\Process\Internal\ProcessRunner; +use Amp\Process\Internal\ProcessStatus; +use Amp\Process\Internal\Windows\Runner as WindowsProcessRunner; use Amp\Promise; -use function Amp\call; class Process { - /** @var bool */ - private static $onWindows; - - /** @var resource|null */ - private $process; + /** @var ProcessRunner */ + private static $processRunner; /** @var string */ private $command; @@ -29,278 +28,133 @@ class Process { /** @var array */ private $options; - /** @var \Amp\ByteStream\ResourceOutputStream|null */ - private $stdin; - - /** @var \Amp\ByteStream\ResourceInputStream|null */ - private $stdout; - - /** @var \Amp\ByteStream\ResourceInputStream|null */ - private $stderr; - - /** @var int */ - private $pid = 0; - - /** @var int */ - private $oid = 0; - - /** @var \Amp\Deferred|null */ - private $deferred; - - /** @var string */ - private $watcher; - - /** @var bool */ - private $running = false; + /** @var ProcessHandle */ + private $handle; /** - * @param string|array $command Command to run. - * @param string|null $cwd Working directory or use an empty string to use the working directory of the current - * PHP process. - * @param mixed[] $env Environment variables or use an empty array to inherit from the current PHP process. - * @param mixed[] $options Options for proc_open(). + * @param string $command Command to run. + * @param string $cwd Working directory of child process. + * @param array $env Environment variables for child process. + * @param array $options Options for proc_open(). + * @param ProcessHandle $handle Handle for the created process. */ - public function __construct($command, string $cwd = null, array $env = [], array $options = []) { - if (self::$onWindows === null) { - self::$onWindows = \strncasecmp(\PHP_OS, "WIN", 3) === 0; - } - - if (\is_array($command)) { - $command = \implode(" ", \array_map("escapeshellarg", $command)); - } + private function __construct(string $command, string $cwd, array $env, array $options, ProcessHandle $handle) { $this->command = $command; - $this->cwd = $cwd ?? ""; - - foreach ($env as $key => $value) { - if (\is_array($value)) { - throw new \Error("\$env cannot accept array values"); - } - - $this->env[(string) $key] = (string) $value; - } - + $this->cwd = $cwd; + $this->env = $env; $this->options = $options; + $this->handle = $handle; } /** * Stops the process if it is still running. */ public function __destruct() { - if (\getmypid() === $this->oid) { - $this->kill(); // Will only terminate if the process is still running. - } - - if ($this->watcher !== null) { - Loop::cancel($this->watcher); - } - - if ($this->stdin && \is_resource($resource = $this->stdin->getResource())) { - \fclose($resource); - } - - if ($this->stdout && \is_resource($resource = $this->stdout->getResource())) { - \fclose($resource); - } - - if ($this->stderr && \is_resource($resource = $this->stderr->getResource())) { - \fclose($resource); - } - - if (\is_resource($this->process)) { - \proc_close($this->process); + if ($this->handle !== null) { + self::$processRunner->destroy($this->handle); } } /** - * Resets process values. + * Throw to prevent cloning + * + * @throws \Error */ public function __clone() { - $this->process = null; - $this->deferred = null; - $this->watcher = null; - $this->pid = 0; - $this->oid = 0; - $this->stdin = null; - $this->stdout = null; - $this->stderr = null; - $this->running = false; + throw new \Error(self::class . ' instances cannot be cloned'); } /** - * @throws \Amp\Process\ProcessException If starting the process fails. + * Start a new process. + * + * @param string|string[] $command Command to run. + * @param string|null $cwd Working directory or use an empty string to use the working directory of the current + * PHP process. + * @param mixed[] $env Environment variables or use an empty array to inherit from the current PHP process. + * @param mixed[] $options Options for proc_open(). + * @return Promise Fails with a ProcessException if starting the process fails. + * @throws \Error If the arguments are invalid. * @throws \Amp\Process\StatusError If the process is already running. + * @throws \Amp\Process\ProcessException If starting the process fails. */ - public function start() { - if ($this->deferred !== null) { - throw new StatusError("The process has already been started"); - } + public static function start($command, string $cwd = null, array $env = [], array $options = []): Promise { + $command = \is_array($command) + ? \implode(" ", \array_map("escapeshellarg", $command)) + : (string) $command; - $this->deferred = $deferred = new Deferred; + $cwd = $cwd ?? ""; - $fd = [ - ["pipe", "r"], // stdin - ["pipe", "w"], // stdout - ["pipe", "w"], // stderr - ["pipe", "w"], // exit code pipe - ]; - - if (self::$onWindows) { - $command = $this->command; - } else { - $command = \sprintf( - '{ (%s) <&3 3<&- 3>/dev/null & } 3<&0;' . - 'pid=$!; echo $pid >&3; wait $pid; RC=$?; echo $RC >&3; exit $RC', - $this->command - ); - } - - $this->process = @\proc_open($command, $fd, $pipes, $this->cwd ?: null, $this->env ?: null, $this->options); - - if (!\is_resource($this->process)) { - $message = "Could not start process"; - if ($error = \error_get_last()) { - $message .= \sprintf(" Errno: %d; %s", $error["type"], $error["message"]); - } - $deferred->fail(new ProcessException($message)); - return; - } - - $this->oid = \getmypid(); - $status = \proc_get_status($this->process); - - if (!$status) { - \proc_close($this->process); - $this->process = null; - $deferred->fail(new ProcessException("Could not get process status")); - return; - } - - if (self::$onWindows) { - $this->pid = $status["pid"]; - $exitcode = $status["exitcode"]; - } else { - // This blocking read will only block until the process scheduled, generally a few microseconds. - $pid = \rtrim(@\fgets($pipes[3])); - $exitcode = -1; - - if (!$pid || !\is_numeric($pid)) { - $deferred->fail(new ProcessException("Could not determine PID")); - return; + $envVars = []; + foreach ($env as $key => $value) { + if (\is_array($value)) { + throw new \Error("\$env cannot accept array values"); } - $this->pid = (int) $pid; + $envVars[(string) $key] = (string) $value; } - $this->stdin = new ResourceOutputStream($pipes[0]); - $this->stdout = new ResourceInputStream($pipes[1]); - $this->stderr = new ResourceInputStream($pipes[2]); - \stream_set_blocking($pipes[3], false); + $deferred = new Deferred; - $this->running = true; - - $process = &$this->process; - $running = &$this->running; - $this->watcher = Loop::onReadable($pipes[3], static function ($watcher, $resource) use ( - &$process, &$running, $exitcode, $deferred - ) { - Loop::cancel($watcher); - $running = false; - - try { - try { - if (self::$onWindows) { - // Avoid a generator on Unix - $code = call(function () use ($exitcode, $process) { - $status = \proc_get_status($process); - - while ($status["running"]) { - yield new Delayed(10); - $status = \proc_get_status($process); - } - - $code = $exitcode !== -1 ? $exitcode : $status["exitcode"]; - return (int) $code; - }); - } elseif (!\is_resource($resource) || \feof($resource)) { - throw new ProcessException("Process ended unexpectedly"); - } else { - $code = (int) \rtrim(@\stream_get_contents($resource)); - } - } finally { - if (\is_resource($resource)) { - \fclose($resource); - } + self::$processRunner->start($command, $cwd, $env, $options) + ->onResolve(function($error, $handle) use($deferred, $command, $cwd, $env, $options) { + if ($error) { + $deferred->fail($error); + } else { + $deferred->resolve(new Process($command, $cwd, $env, $options, $handle)); } - } catch (\Throwable $exception) { - $deferred->fail($exception); - return; - } + }); - $deferred->resolve($code); - }); - - Loop::unreference($this->watcher); + return $deferred->promise(); } /** - * @return \Amp\Promise Succeeds with exit code of the process or fails if the process is killed. + * Wait for the process to end.. + * + * @return Promise Succeeds with process exit code or fails with a ProcessException if the process is killed. */ public function join(): Promise { - if ($this->deferred === null) { + return self::$processRunner->join($this->handle); + } + + /** + * Forcibly end the process. + * + * @return void + * @throws \Amp\Process\StatusError If the process is not running. + * @throws \Amp\Process\ProcessException If terminating the process fails. + */ + public function kill() { + if (!$this->isRunning()) { throw new StatusError("The process is not running"); } - if ($this->watcher !== null && $this->running) { - Loop::reference($this->watcher); - } - - return $this->deferred->promise(); + self::$processRunner->kill($this->handle); } /** - * {@inheritdoc} - */ - public function kill() { - if ($this->running && \is_resource($this->process)) { - $this->running = false; - - // Forcefully kill the process using SIGKILL. - \proc_terminate($this->process, 9); - - Loop::cancel($this->watcher); - - $this->deferred->fail(new ProcessException("The process was killed")); - } - } - - /** - * Sends the given signal to the process. + * Send a signal signal to the process. * * @param int $signo Signal number to send to process. - * + * @return void * @throws \Amp\Process\StatusError If the process is not running. + * @throws \Amp\Process\ProcessException If sending the signal fails. */ public function signal(int $signo) { if (!$this->isRunning()) { throw new StatusError("The process is not running"); } - \proc_terminate($this->process, $signo); + self::$processRunner->signal($this->handle, $signo); } /** - * Returns the PID of the child process. Value is only meaningful if PHP was not compiled with --enable-sigchild. + * Returns the PID of the child process. * * @return int - * - * @throws \Amp\Process\StatusError + * @throws \Amp\Process\StatusError If the process has not started. */ public function getPid(): int { - if ($this->pid === 0) { - throw new StatusError("The process has not been started"); - } - - return $this->pid; + return $this->handle->pid; } /** @@ -349,51 +203,55 @@ class Process { * @return bool */ public function isRunning(): bool { - return $this->running; + return $this->handle->status === ProcessStatus::RUNNING; } /** * Gets the process input stream (STDIN). * * @return \Amp\ByteStream\ResourceOutputStream - * * @throws \Amp\Process\StatusError If the process is not running. */ public function getStdin(): ResourceOutputStream { - if ($this->stdin === null) { - throw new StatusError("The process has not been started"); + if (!$this->isRunning()) { + throw new StatusError("The process is not running"); } - return $this->stdin; + return $this->handle->stdin; } /** * Gets the process output stream (STDOUT). * * @return \Amp\ByteStream\ResourceInputStream - * * @throws \Amp\Process\StatusError If the process is not running. */ public function getStdout(): ResourceInputStream { - if ($this->stdout === null) { - throw new StatusError("The process has not been started"); + if (!$this->isRunning()) { + throw new StatusError("The process is not running"); } - return $this->stdout; + return $this->handle->stdout; } /** * Gets the process error stream (STDERR). * * @return \Amp\ByteStream\ResourceInputStream - * * @throws \Amp\Process\StatusError If the process is not running. */ public function getStderr(): ResourceInputStream { - if ($this->stderr === null) { - throw new StatusError("The process has not been started"); + if (!$this->isRunning()) { + throw new StatusError("The process is not running"); } - return $this->stderr; + return $this->handle->stderr; } } + +(function() { + /** @noinspection PhpUndefinedClassInspection */ + self::$processRunner = \strncasecmp(\PHP_OS, "WIN", 3) === 0 + ? new WindowsProcessRunner() + : new PosixProcessRunner(); +})->bindTo(null, Process::class)(); diff --git a/lib/functions.php b/lib/functions.php new file mode 100644 index 0000000..cb3caa3 --- /dev/null +++ b/lib/functions.php @@ -0,0 +1,5 @@ +