From 0d7367be7c25732670ec2c1a86ee89325cf46eee Mon Sep 17 00:00:00 2001 From: JR Cologne Date: Sun, 20 Sep 2020 17:21:53 +0200 Subject: [PATCH] Add support for XenForo Resources, bump version to v1.1.0 --- .../CodeFormatter/CodeFormatter.php | 34 +++++++------- .../Preparer/PreparerInterface.php | 40 ++++++++++++++++ .../CodeFormatter/Traits/FormatsCode.php | 43 ++++++++++++++++++ .../XF/Service/Post/Preparer.php | 29 ++++++------ .../XFRM/Service/ResourceUpdate/Preparer.php | 43 ++++++++++++++++++ .../CodeFormatter/_data/class_extensions.xml | 1 + ...-XFRM-Service-ResourceUpdate-Preparer.json | 6 +++ .../_output/class_extensions/_metadata.json | 3 ++ .../CodeFormatter/_output/extension_hint.php | 5 ++ ...vCommunityDE-CodeFormatter-0.1.0 Alpha.zip | Bin 12994 -> 12994 bytes .../DevCommunityDE-CodeFormatter-1.1.0.zip | Bin 0 -> 15706 bytes DevCommunityDE/CodeFormatter/addon.json | 4 +- 12 files changed, 174 insertions(+), 34 deletions(-) create mode 100644 DevCommunityDE/CodeFormatter/Preparer/PreparerInterface.php create mode 100644 DevCommunityDE/CodeFormatter/Traits/FormatsCode.php create mode 100644 DevCommunityDE/CodeFormatter/XFRM/Service/ResourceUpdate/Preparer.php create mode 100644 DevCommunityDE/CodeFormatter/_output/class_extensions/XFRM-Service-ResourceUpdate-Preparer_DevCommunityDE-CodeFormatter-XFRM-Service-ResourceUpdate-Preparer.json create mode 100644 DevCommunityDE/CodeFormatter/_releases/DevCommunityDE-CodeFormatter-1.1.0.zip diff --git a/DevCommunityDE/CodeFormatter/CodeFormatter.php b/DevCommunityDE/CodeFormatter/CodeFormatter.php index 66ced8d..3f4c281 100644 --- a/DevCommunityDE/CodeFormatter/CodeFormatter.php +++ b/DevCommunityDE/CodeFormatter/CodeFormatter.php @@ -2,7 +2,7 @@ namespace DevCommunityDE\CodeFormatter; -use DevCommunityDE\CodeFormatter\XF\Service\Post\Preparer; +use DevCommunityDE\CodeFormatter\Preparer\PreparerInterface; use \GuzzleHttp\Client as Guzzle; /** @@ -14,7 +14,7 @@ class CodeFormatter { /** - * @var Preparer + * @var PreparerInterface */ protected $preparer; @@ -36,7 +36,7 @@ class CodeFormatter /** * @param Preparer $preparer */ - public function __construct(Preparer $preparer) + public function __construct(PreparerInterface $preparer) { $this->preparer = $preparer; $this->guzzle = new Guzzle; @@ -50,37 +50,37 @@ public function __construct(Preparer $preparer) */ public function run() { - if (!$this->postContainsCodeBlock()) { + if (!$this->contentContainsCodeBlock()) { return; } - $post = $this->getPostWithFormattedCode(); + $content = $this->getEntityContentWithFormattedCode(); - if (!$post) { + if (!$content) { return; } - $this->setPost($post); - $this->savePost(); + $this->setEntityContent($content); + $this->saveEntity(); } /** * @return bool */ - protected function postContainsCodeBlock() + protected function contentContainsCodeBlock() { - return stripos($this->preparer->getPost()->message, '[CODE') !== false; + return stripos($this->preparer->getContent(), '[CODE') !== false; } /** * @return string|null */ - protected function getPostWithFormattedCode() : ?string + protected function getEntityContentWithFormattedCode() : ?string { $res = $this->guzzle->post( $this->populateApiUrlWithApiKey($this->api_base_url, $this->api_key), [ - 'body' => $this->preparer->getPost()->message, + 'body' => $this->preparer->getContent(), ] ); @@ -102,19 +102,19 @@ protected function populateApiUrlWithApiKey(string $api_url, string $api_key) : } /** - * @param string $post + * @param string $content */ - protected function setPost(string $post) + protected function setEntityContent(string $content) { - $this->preparer->setMessage($post); + $this->preparer->setContent($content); } /** * */ - protected function savePost() + protected function saveEntity() { - $this->preparer->getPost()->save(); + $this->preparer->getEntity()->save(); } } diff --git a/DevCommunityDE/CodeFormatter/Preparer/PreparerInterface.php b/DevCommunityDE/CodeFormatter/Preparer/PreparerInterface.php new file mode 100644 index 0000000..5f66587 --- /dev/null +++ b/DevCommunityDE/CodeFormatter/Preparer/PreparerInterface.php @@ -0,0 +1,40 @@ +formatCode(); + } + + /** + * + */ + public function afterUpdate() + { + parent::afterUpdate(); + + $this->formatCode(); + } + + /** + * + */ + protected function formatCode() + { + (new CodeFormatter($this))->run(); + } + +} diff --git a/DevCommunityDE/CodeFormatter/XF/Service/Post/Preparer.php b/DevCommunityDE/CodeFormatter/XF/Service/Post/Preparer.php index cab4243..7c401d7 100644 --- a/DevCommunityDE/CodeFormatter/XF/Service/Post/Preparer.php +++ b/DevCommunityDE/CodeFormatter/XF/Service/Post/Preparer.php @@ -2,7 +2,9 @@ namespace DevCommunityDE\CodeFormatter\XF\Service\Post; -use DevCommunityDE\CodeFormatter\CodeFormatter; +use DevCommunityDE\CodeFormatter\Preparer\PreparerInterface; +use DevCommunityDE\CodeFormatter\Traits\FormatsCode; +use XF\Entity\Post; use XF\Service\Post\Preparer as BasePreparer; /** @@ -10,35 +12,32 @@ * * @package DevCommunityDE\CodeFormatter\XF\Service\Post */ -class Preparer extends BasePreparer +class Preparer extends BasePreparer implements PreparerInterface { + use FormatsCode; /** - * + * @return Post */ - public function afterInsert() + public function getEntity() : Post { - parent::afterInsert(); - - $this->formatCode(); + return $this->getPost(); } /** - * + * @return string */ - public function afterUpdate() + public function getContent() : string { - parent::afterUpdate(); - - $this->formatCode(); + return $this->getEntity()->message; } /** - * + * @param string $content */ - protected function formatCode() + public function setContent(string $content) { - (new CodeFormatter($this))->run(); + $this->setMessage($content); } } diff --git a/DevCommunityDE/CodeFormatter/XFRM/Service/ResourceUpdate/Preparer.php b/DevCommunityDE/CodeFormatter/XFRM/Service/ResourceUpdate/Preparer.php new file mode 100644 index 0000000..4ff6c21 --- /dev/null +++ b/DevCommunityDE/CodeFormatter/XFRM/Service/ResourceUpdate/Preparer.php @@ -0,0 +1,43 @@ +getUpdate(); + } + + /** + * @return string + */ + public function getContent() : string + { + return $this->getEntity()->message; + } + + /** + * @param string $content + */ + public function setContent(string $content) + { + $this->setMessage($content); + } + +} diff --git a/DevCommunityDE/CodeFormatter/_data/class_extensions.xml b/DevCommunityDE/CodeFormatter/_data/class_extensions.xml index e5cdf94..c2635c3 100644 --- a/DevCommunityDE/CodeFormatter/_data/class_extensions.xml +++ b/DevCommunityDE/CodeFormatter/_data/class_extensions.xml @@ -1,4 +1,5 @@ + diff --git a/DevCommunityDE/CodeFormatter/_output/class_extensions/XFRM-Service-ResourceUpdate-Preparer_DevCommunityDE-CodeFormatter-XFRM-Service-ResourceUpdate-Preparer.json b/DevCommunityDE/CodeFormatter/_output/class_extensions/XFRM-Service-ResourceUpdate-Preparer_DevCommunityDE-CodeFormatter-XFRM-Service-ResourceUpdate-Preparer.json new file mode 100644 index 0000000..bfe0ad2 --- /dev/null +++ b/DevCommunityDE/CodeFormatter/_output/class_extensions/XFRM-Service-ResourceUpdate-Preparer_DevCommunityDE-CodeFormatter-XFRM-Service-ResourceUpdate-Preparer.json @@ -0,0 +1,6 @@ +{ + "from_class": "XFRM\\Service\\ResourceUpdate\\Preparer", + "to_class": "DevCommunityDE\\CodeFormatter\\XFRM\\Service\\ResourceUpdate\\Preparer", + "execute_order": 10, + "active": true +} \ No newline at end of file diff --git a/DevCommunityDE/CodeFormatter/_output/class_extensions/_metadata.json b/DevCommunityDE/CodeFormatter/_output/class_extensions/_metadata.json index 35cce5c..9f772c0 100644 --- a/DevCommunityDE/CodeFormatter/_output/class_extensions/_metadata.json +++ b/DevCommunityDE/CodeFormatter/_output/class_extensions/_metadata.json @@ -1,5 +1,8 @@ { "XF-Service-Post-Preparer_DevCommunityDE-CodeFormatter-XF-Service-Post-Preparer.json": { "hash": "38a93f88da5c59c03832964ae1f1522a" + }, + "XFRM-Service-ResourceUpdate-Preparer_DevCommunityDE-CodeFormatter-XFRM-Service-ResourceUpdate-Preparer.json": { + "hash": "2ae5311a3c6c9b3d0b7e0539e15ce8d9" } } \ No newline at end of file diff --git a/DevCommunityDE/CodeFormatter/_output/extension_hint.php b/DevCommunityDE/CodeFormatter/_output/extension_hint.php index 5600b62..fd4c3e3 100644 --- a/DevCommunityDE/CodeFormatter/_output/extension_hint.php +++ b/DevCommunityDE/CodeFormatter/_output/extension_hint.php @@ -3,6 +3,11 @@ // ################## THIS IS A GENERATED FILE ################## // DO NOT EDIT DIRECTLY. EDIT THE CLASS EXTENSIONS IN THE CONTROL PANEL. +namespace DevCommunityDE\CodeFormatter\XFRM\Service\ResourceUpdate +{ + class XFCP_Preparer extends \XFRM\Service\ResourceUpdate\Preparer {} +} + namespace DevCommunityDE\CodeFormatter\XF\Service\Post { class XFCP_Preparer extends \XF\Service\Post\Preparer {} diff --git a/DevCommunityDE/CodeFormatter/_releases/DevCommunityDE-CodeFormatter-0.1.0 Alpha.zip b/DevCommunityDE/CodeFormatter/_releases/DevCommunityDE-CodeFormatter-0.1.0 Alpha.zip index 5a6e32c86f46022a12fa635aa07f9c8714b9de1e..968fc21c38f4ebb63ee40311d15fc1eb3b2571c0 100644 GIT binary patch delta 2588 zcmY+`c{o(v0|#(p$;1p}U#A#jof%s+DkDqwnHtJ2OO}4JjJ;?XOO~`)t}T^aOhg$| zlx4Woa3Z5+2>>=64*h;9h!%tX2HV%d+A(SdhEb!6FTd$OWO z0xf2=Y)d%}gO|9>^0WOL^+*X%?4^1$wdX@MkQ$LscIcGHb-=mm_l6E>-N3kV*|NJ_Sw}QiJMq+qz2(~*>~apzX0J+emXT=TwHN5E-r)L zMnMRkDW2a~!(8Fcy40VuVJ0^hjN&=JXkF z5J9E@FCihIj!+)(snDOXxA2FJG1Cl1f`K4WgawYZOEhOgX0NC-3`}T>p9MCH7Xdva z7(fBZYG9*eCXg&u2H&_nhkTg_;MfRlafmE!4#I3{>W0iw>4Pw^%I@W(`w&^yif&6Q z>lA7JjTq$+; zPV2w!&dmJ?Z5b=ezjC3!vuI_cvv+8Asj=o&AjIz_5ifX!4t^;%!$R!$K| z4z8K&ir!{9g*)q3B*tYxq!1o{^|50Jj-3tX7F}?W!eqt!b42q3HM;xdvRd7( zR>5`R+NaJz9O`OjR}TK;v{>_XS)T%NYI$^gmD5F-Q^1uDn7>z0gjK1I($cb8#=CE8 zX+;cIfuxSWYwuEqpSg*clL9deq*30D1Tzuuow=UV zEy|kNgSWO=GH=-%yx1@KAbG5-<(>7b-lghp$fiV7g8pf>`*Vh%E0JOvgAogO=b@Xb zE*9e-`t_tmL|527=ZqjD?n6H!cbqh83wY3b-^WdZ#5T{gyOVfDdnwb)PeNs1DlYRt z9&6gUhiP-3ZxCwwa+3Ofo{h^G(vNiR@JH{-m5cN;WcbV#^x;b|4`n1RCXMmsLFXO> zWU;5xx#_Q`hE%2SZtG?#YU!}T9BYM&r;HHBKgt&UEY52u43ZK)wuvpGYTWvp8p`!@@WI_wBE%kG*zF?%iK%g&4$(Vq7D!q0pA zEw{cW`0DK_?{9~}x-k{`Y~n3>`{KNOR!Eav>k&E`VN$0*pK-B&JN`oS*5rw)r_33S z6jlY>MAVZuFS2eNNkE~-QcLO)vwc~&#`w-XjvrTSMutk(n9e6NO=7L6>->72Ywg*b z3+1{J1O_#XjS8JmVAr$U-FQXj3E?@!y|WM--t@**|(PIb&~(Y_sTWgs%$u~64SS_(eA<=5x_*F|1L^urYB zhW)*?y$lW6#5;`x248FpMDvcY;;lSvq!jJFW8z;7x6}#`E%hoV2vWV92Yb@A8QnL^ zgG_w}5Xv3JnQCDM``r72S%e-FuhcjnMV{N{!XH*g+x`^pMul$lWvhY>r~pAlL!gZ! z0T`>O0xVO+f};EH&jfm@=nX2#0OJEJ#6*LYQc6dFrxhoX4epB>`^f%Eu3C-5XhZrG(SKWY<7~ZJE+Ej-_5x;U`~EG|wSOnQbzDK%szU}MbxA;q?sj0ZuHipC C3e`#g delta 2565 zcmY+`c{tSD9|!PRGS;z_UG~9b8$&d*jxCLCkcun`)h&CnG%+`_cYl_zEnM4_$P$JW zN=UX;WCVL-r^{Gh8JO4kUDBK+?IV=ImHwd}H0`fIG)_h&-w7_x{6EwY#%fXCFzvNG;4roX~iz zs@CuI+kBpVSX2-lla!|R#MI`-di~^ZZ<@pRFr93E6PmKWtg1u~}Z} zM%eQv#DSbg?p+Oi8|en;*}tQ`*?)d|kTtg|w9CW+l{0bfmqCq8c0d7?1cG8Z%kVTvGmU;31w6C6|}cwmT-xv(j<%iFDu=gXD? zM;WrDzC^r#Xn1K@Ut@@;fAxb3x449695Zo8XX<3dgUWM;#_VwzmY>h{Lab&jRBDmc~_N*gIHRm*l#*V&#NvD}^g$Tej(g*IYTXVA=( zCsofI$Qpb2EjDkQ-ON^wZ&|6%EOoa!Q)Ve1a)_!B)3`Oi@@u{2Mf7C3t4{jDyBdnR zOrzecu%&A^i zrF;4WpC42->zxfAeV8mN(nmqGLAv*^gwLeIL@RNJ&wC|>cDw< zlg)akeHI^=az`3MbFP)wSo`Ah^R{3!bjK%JyQ_b-QRgUCDar+h@k(WIq{5{X;Z%1- z_;F7u*GrjZ!cN4a1YC@>jYaX9#r1-r%M-Y;h8GA|;SR?R#DZ?q$YXrrX}Iw^Go{Xg1p}g%2A=Fmi?d3vgZK}a+-~B>OUiR_L0IW>Vp~J^9y==?+ zr>cq0)XS%j6?Y@pj!aT`M14fEN7Ctwmlofzv6)7nFQJt-TT?C|<$``Z;MmB*b!f>ZhNmr5QNXZkM&v&dA%Ajm%nS--$`q&`%xSHb|~7)%08`PRX=9=D+(zR#1$;C^HDL6_7NSm5BZlQFBH8lV-LWtwUh_B$3e|f5odP zSty6gxxd?ydDBTsm}O3LAt3ZE!%4!eUGfD=nfrsHL!8iUw>e3sTe0?Y1NDrOH`LeM zKOKrTR9A-6T6-2+d|!lytbO?v{^qXidK9W;T8*{Vk&Hkb!DlNXZ`V9fx&?RhzevIQ zAhVfDJ~S{q6UBu4cH!OWdMXd;v|{sCQ~5KF6^F|2p}GeAy?BhKYp3l-2~Acg+Bb)f z5{|CVWjo{4!x8hfp0y#q&AQwsRXDTV96Lj$tM=Vm>hoIvr_a->_L=X@JoC&m&&;F;A=uiXafk6X}ewwiQ9SLq)7@Z4s_05fzx1GQ!2h(-rRFtD-8RjIf2NA>3W8Jv?CU zzyC=X>3~c%8orXGNaH_QbPXa*5M?ZK{$;vxhf}h=`PJL-tEHj>`C9cBwZf9##_LP1 zC4qqly$6{trp_f_NBGZM)43d~v$EAyRgt9-^Fw~~zges(-!eg&xV(7d`B_e`%j%*3 zgumd9M2KG2F#rDP;^=z`{VV$OV+J2r*gD(v)hLfq@m^KjHI>+)F!h;gDu|ViBds>7 zsJmsq+QUQ1FHWY7KAC5cIzvS?pLymbxQgh~s9?_rub4G8(ZrWmUxvNs6=Re5G$r2u zBw4nRJ155NiKL4j9q|iBT951XqXG0ErVNPoe&SeG3NnZ=x^2ryav-06qA^g+L|Cr1 z9Xh7@Ui%S!SZc7PIO7echr8=rq^e1>^Br0=@-A{mtsVcY-jb6~nI!B#NF64t&q48` zig|f)#?UI zbEDacqkZ~BGk;F&OQtu9_X}WU4dmYahw`PU&7`Yh$}FmqCYZC6GQuhIdh&9ud>6gg zo7I=BC6Bq3yR(^G)oU-b`W(0h)9hvbB;ZJ-d@W9`N*pT6n8lxc;Q}1VQJ~fFam6Pt zL`DCDWeV|I4eyffBi5_^A-$^<Hi@g zwIUcA9+Eu9#c+);)TZyUPSW)|P51VmEYd6}Ka{4@KM0LJ6(Jjd$%uD`SBSYq5^|9rX#05spTt^T?lR6Wwv_ph} z1_}ClNl4A*ezWA%(WSR{a#urp@r&}?pfql7@N z9+`N$8$#44Km~`xU*;{vJ}??&Cwh7^==dRFMQRYQgvt^Z!9P;!VdJJOk&a^PLi|1Qp!PjTi z6#7C-!->32(d)(XVV7-K^3|mXey9}C-i8}Ne`1Cd@WVFU2u714zi$-v7)&%DpcY5~ z0^vc`0OsL|MDNMvD>W3siZr2ZEe0R@BB`zP(#cbU1*b+}?qRVW=3e$0;X`tl4>CkW zi>)u!t+y~uID_`Fx|2Zk`7EwJfXf=Y>l&+eIyRXOq>=TJJ(1B5%MZUlgrsFpH4)_E zS>R@|dl=K_XIJ9n73}%A)THt7y~$~j<`hB4?}{`e1UZUa64Kd20u`m}f-;GeH~imw zSdqOg%bVh^@6QcllC|n7x=zP(vF_qH()L>j)9)H^qrYW10%$-3Fjdv<>($WR8t#D- z`QfioXxEKaN5MaGh}t7Gp-an*2lmBk@X8!C<-4cv-D?v4Mn9i!prkF0zbT-|rCwcn zQF$z(bng7QIRW1V+b<-F*6OWRIyS1$wY*b}V-<`=2DFYX-f;mtj2&cqQfb-H zAtcKiNvOhche(>IH8@gx-?MM1`L!oY3VoziyP}_Wq#sZW(NeoBT%bMpbr9T>{`rnw zZu}ET!E*-Dg7&_g-^JKZ-^=uoWEDk~Pty-Uj#)ftl=V}Wpr~6vglX*c<_4Bj?+S+8Al6b4|_iefUe62wWZInbH z5M=u_P1HmTVD4UUC`?2Tf%5p*k)SsxK33PMR*~lE+%n(92nWU36jq}nc z31JjMLhSn+)b&Rh!^sR+jZVlK-N|H4h<~oMoRMtI^HDARc3BJi8P?l}$qXM;a*vuw z?Nz_f;qctq;($XilTNQZ<)W>){*hpx>`Q6gs=4*{eYIt+vt}Xtc=+Yuq+jc%db0bh zobM_}MlaX8vQO&ZtmeLCZjtJ@`(k{~T8Sl%`)wPnAssXa zzJH`KNWI+=SQh$BjIYQsee|BNlsOgmmuIlD^l@_%l({|o@xsiq;_>S%QHO^|IKu@` z4BQr=>WuMV4EIYD8Ou?OAD`Pik?hc`-?wP_&;pW#{B`%*@uu@}u=;`bHYp41!6vERT3Nu35T6+Ly`|}Rmxbb3j0C%!+jC${arH z`#`YG$9e9-w-$&FhptkNdn3d3(1c!8u;FBz*ekY!M6!*617eo92V5x~lpn-#JUL~b zMaS-IVClZL4s*L&s7G2rP)$Cw7(;Z=4I=IUH#V8mUZEJtne{1-%TZh5zt(doeyCPd zso871EB+>=!0ME#YDMu8buCtx2P3m7qL&M8x*mZk_e-CbynV+mj|tMl8vOBboKZ_uaCuKB63bal(l!EM}u95+MMo&#(ZZp8J1gzE? zc+t4PT`gU$z2NrN9&m)Ku#bzgtOD@cK`)p)3it~-PEp|_oCjg9P=qbq)n1O%)5A_k zic>+JLKb(eh&;vb9KKTK@cln=h=jSjz)@(1w$CAU?N1J|Z#}s-p-{9lR0QS;{B;QE z$^(u9)MJT6px|gdqR?!X-YsfqImrtV;%{wkD>XX$QcO=@qXp8c+t>^#GvXK0?7FX4 zQZ`J7<4tHu1qdapYuanOgM-U=c?(p~_FO`=5Bh!W_)I>m z7aOoLL{N1cR`=@WnT<#VYw1mbFJ7V#C3@oV82#bcHVg{p1#|VVbcUk<{Q&N4JFa7^ z^_#2;B(ZWH9YCX}3NZ0+QDJYw%g=y z)ACLFd*e`1F9PTdJ>~G$pZoSM1t{?SO`I5!S!C|myE?#}k(Nkn`|Y_e?5a&%S()ft z9Ru`&o_M@?f<{K5|Gs-Ik8uk#cIxpIF% zS2uyF228xpBLa!Oz%A|F5uV5mg;`u~p{P4Z6Ef#Z(RY^h?0fK4TyF)p zpJ<2A*aFYovAK>L34Gzq?hE_wKaxMANpM$vay$o?b?ae#_H4Tir@vms1sZnK50MKe zAf%`(U4|Li-8DqgKJ~JvIU6S5%((h_^l++^tbR zoaX(mHb~tO2GaTEwFvv!g1#2z0a~75Uf!`2(75(Tg+UXfn$i!}hhA1hFbU-i9SB;g zx+xp$>}e>(*6s`UIFZ1|6%nX9U zns~e6%qIw6sf|2#iwFyhKJClODp|-inW-PKPwic-|Nd_y@=91g$dkK9ZmDQuUJK6(*J&gL8AAxHiVS;9w@a9smvqzh0K28S_{yb@h@cQF~jE z8x7SZf9X7iDFL2<^J-$@Z5PP3ci#f%__@hNJfykQp(m4ZaDwO1LB~$Sl9cfRw2J8W z*Atz{+^8s^QuIWJLU=hdz=>@$n*On3lL5L)H%RUHEr;^(b%t3Y-GK)P@L<~BHHo`+ z6NjY=M?Dk)J)tMwZ@J%4eDOHcTN2pBYr*b#J@hjKJ#~SJ*WP--T#(K{>dDdtc$(Y6 zp&JkQZJq3`DQx04F?{_EI%k2NN;~BiF9tV;*Yv_OuFH8JAMrr!s zm$?Uc)$$R7K*zUFa-+yD?1)0Rx}20j0D;%gCjlBKr>Ms&O{a_^r0t>%RrgBts+9yi zv6hJVI80f8MSMmGIXpfqRmjRfxReh2oMn^ZWTYAGO*Z~YhM3NemO%Jfeox&a4Q*tzeA|J^3z*AT^zjY0}@bB68VdI`*(#&x@*+ zKCWxf9^5H(KAp`Zx4$>zAn`4y^@VC*_Nk@;c`a$sxR>vc*3=3U`SePnfSJW^nYKb^ z_o00*qs)7UtxoTo@)uH{EAw2o5=k*op#4?5Yu(>N?b<1I^pU0^cs#e#g z7P=PB6~C8gtqz#1v=n(Bb}V4^OABX`GMy@_sG!%RwZ_M+^02Wbj5`lz1kubFI^8dA z&n&R}wiaUTV@X%F&(h$#!FTjzMp`cm%8aJ(_2n<5^|8Ksa~ahnbo9CTp1|0niEwb% zJJSx>?Zn`(-`IF$6qd&k)L(u2qT0eANyv)sF@O1LS{BmKob|Smn=Zk}eQYRr{>Hhe z?gqJs8cy`OpY&DM!{0A=P1a=yWrxT@T|qTln@B)_$|A%(dag}u&C|W|nQ<>~TNG>T5R1C|GYd~Ld+{=9QH6Jo zr_Yj9KD|wmvj^sOV0X3Wn?#!df{UZcVXJksHS!J4uUY$L9CEKUIBNL_AYQ!{pDc*!^ z^7M)M5hE)tl#y^;8h>QVE^Sik9`gSAayN142X1+P6#{j>=v^jH%e!+VADU4;4=I^+ z9EDf~iTarY?Y8}D{)X6;mYRK$pP^Fu>yTG@8js>WuNM~9VsKVc6oYw(L)z`{9}XXq zDN=a?{*VsIXwmnDdyPLWBS>2EdiY_i%t_Y##?`D^XsD6$kResj)7(QOc}_%#Y|5zu zKKke$E{0}b)!Ym((n!k}IE+ zO}U@J+$>D2bTQuM(cXqx|9~3g*h=Q1YsRruW+w)TB8c5GNaK_)8;6B9J4V|XoMMcA zjnabqg&o(mt6-$1V?`FS>)th6E?-htG-!7EN4BJ}b2_k3i%7TR$*|47QTjIqJ(-Wi zrJ#F!Xsrq!p3WE~n_79}mD0gfvX}4pDdCjm#fgl9d4P&u)jCY`c6j+^E(#6}lu zg~|qK9z`y9&DwhFvK&>t*mnc|J*1IIP4Z4|X>emycA;dsVUD&UqJBEFQ9S)i?*1}w z)@WrmwG{8fJh==P%R}QK!~-|O6-*ssCFC8cfI`XhoBYb9;Y5%}V%JL!(zbyDq?_pGf; z4&=UcD=wB;B(Q$9Clu0clnahs-C(bD3Ibvo6$%M|9?2 zrl|Q;lUH&*FKw914s7E6u;a66n0-(bhlmsGGh@4;X@tx<=z9)kztfN7Tx5cZD$+f9 z@>P^M{OdHlr~BwWWy-R! zkK7}ICaMOb&X2kgtMu*XR)`FeNRqT}?$Zp45EBMRrq|pt=Jyn`TQpm|lan;Ulg|4v zx;yah6#RM_xZ>HU2cm73+{}tu)5GJXy`khNGv%ZFAekhy!tt^u=sjaWctx-I%!)N4i06H0!{_y4XT_x>N5&?cKm!A{S2P z(ws>XR~HyJ@~P@qp;`q!t1S4^D{1E$66fte)fhugA}6MzlRB-E@tS4-u22eIqW$H2 z{6Dp{dqZXUvI(7pTAG}`}hC+MN;e+^&kX<3Pjkv z7;Z}=@Xd{p8HE1Wre>6XZFfXhyK&KQo5_A)fk2r-i$FxUO*Bkd{onffZ>?n*Xfy=6 zcM}7J{zSJ&Va5zteb)}4any<1goQ!L3`*TT%D*jH7+El>KHNqpEXqydZOgKC+Y<&7 zO&V8y=xh^a%z(#$P;;9*_Y)F>fe{P0Q3!*P86*i<@HR32);5FzMg!mqht8*9#tirs z+0KD~nh2UGE*LsI$BY@UIM7zS11bN4gKm()j2UngUN{(~VRj3*VFp7#Gw3xw^#9U_ z@k{#*h6ywnt}@YYeax5vUj@A5ww3u8CjO#bbUO%U%z#&R2>dq@(P z2-un+Zo3EuAu}jv`v^bMC%6qD==v%yEN%}77FKKbwgvkY7MqpE!eVbc+{O+p><9c| z|Ip@vD>81U1{OPU556M*+kt@<7Q3~$O&C}}A!Y%{gP~3(DENl=hzOd+imo3^8aG`NK46x7wKp?qI*Z1T2;Pe~d zBI5QAU=i!^N8Hp3u$3|4b^~CMo#^qE^=EGYu8_Fpek{~ye4(&q{Hj|?BY|8j zUiMP{sqaVxx7L?LE;5wZ1NT={T| zo>;VS7Ch0gB~V;2+?pm9Y%eRGV850BepWbfVQ~wUSlIIa3+%6DOI&Q+!Xp;jmJLsl zw=N=L9R&9H;MNhb;B@y%dV)1Zmgjl@W_~LD@`E4aAZrKkDtbG7aLANRb{@C0< z*YYs1GvHZ#VKESx2n@Hjhk?ip0<&*hGHj&}7Y4Vwg@w6&aN97y)VeS@XnMFWOLUSD zGiJcgdA5!7H{$4|A!f{g8F>E#@xPHnClN7Y25hh;xxcMPClxVc27KZ7^?zH4PBLP~ c3^*UVP!B>3q=