From c8f7cdcc65f655b36c30cd706bc697872008c3d3 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Sun, 17 Mar 2024 14:31:22 +0100 Subject: [PATCH] refactor: replace `bfj` with `stream-json` (#8) * test: use bun test and add ndjson tests * refactor: replace `bfj` with `stream-json` * fix: remove the `test` script to not confuse bun * chore: fix linting issues --- .github/workflows/review.yml | 3 + bun.lockb | Bin 488514 -> 485184 bytes package.json | 6 +- src/data/StatsFileSource.ts | 14 ++-- src/utils/__tests__/fixtures/ndjson.json | 4 ++ src/utils/__tests__/ndjson.test.ts | 51 +++++++++++++++ src/utils/__tests__/search.test.ts | 79 ++++++++++++----------- src/utils/ndjson.ts | 76 +++++++++------------- src/utils/stats.ts | 4 +- 9 files changed, 143 insertions(+), 94 deletions(-) create mode 100644 src/utils/__tests__/fixtures/ndjson.json create mode 100644 src/utils/__tests__/ndjson.test.ts diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml index fd1d3a9..2d9a0b2 100644 --- a/.github/workflows/review.yml +++ b/.github/workflows/review.yml @@ -27,6 +27,9 @@ jobs: - name: 📋 Typecheck core run: bun run typecheck + - name: 🧪 Test core + run: bun test + - name: 👷 Build core run: bun run build diff --git a/bun.lockb b/bun.lockb index d96361570d26bfd802c0a1f75def7ac39f4324a3..674044641e6979953cebeb6e430af9d672facb5e 100755 GIT binary patch delta 101682 zcmeFadz@F(;{X4Czw2GIhb|LQQVCHgm1?G@-dz+mHEPoRLen%gQ`5{emzt275H$&7 z%PQx%gh-A{h(bsrzR%ZQ>zz5iKIeCS-{0@|c>Mn8eayVp>$%om zd)@ci`@N_0{GOK2z1s4Ij_vOr)iQtPv;Akbyz#kx7hlt0*Eiq)IOcCBY@BgyPPB4J z@>4Azo>o7k&oxzJTA%yXyt;w0zY;^CidP68g&rFYg^os_#Y>B`^QS6RaY<%LX>oS( zFD`z6)qSm-e2&pUx7D$UZ>UrC-f4+z99{c_hk18>6!dil%4gheDT7 z9-Vo=OJ3-F&jg$4^z4%C{5he}G)~)bMsa8@rD#a{?6Sh5?Be3koXnzmD%odbu0oW| zE6nbYTO7KbOqK7f+*#QjrcNmj-Gozuc*e7fbyz6$B2ZQA%r9kpD%t?e$t*6IO95YW z{sUCUzlo|MEu1!SI)Q_afxnJ6LkFWx(CGz*G+lWp^fcgDz>{vnieRFviy<`!m$Lbv19f>{LxGjs92i?2XcfKpTiEy|qRVM@W& zdBcE-oWJ5d0?KI0yprrBr<5w`ES;TClnB-2KH5t){TCTGLLY5z zGm6)A8NL;~0&R+Zc7komS$OJHv8097U8oAs;Y1r>T9TWm^L%+C?XMF|Y-vw0t)Qqw zc4k)2Uc3r+9?H2ZuI4P{UGV`Ks4HGVb;74mWju}(stacoX;_6qolmkgZH}tX`x4K8 z74e#1-o{oetKfLsSF-_X^2sjZ27iCu*5&uLwb{?>oRY8d-s*f`R1NsTX;x>WG+D(o zRK>oQcvWjYs&>mR&dSWooSL1Lms^@kKFizL5%xZ+^ryDBXD>#T?_Apt<)MrHpO%+9J*VV&(y1V)lfU9y23j7fIMl&{b357wEh*~ST_>nd0(H!{r`nqDIK`eo z1_6MazpVT;H*O%Hrp(I8 z%$v!HbGq7+vkG*WmX|qwBwjuLKQ(0&;u{m+mtw0WUgre#amC-rS9}JGW)}JOOSU8A zXH*6J3{|UFoIyZ(D8&xBl^m$1D$brYC%Y&Vno(Sk-;E5WXXh8s%g+jZ*TdF$H>xIn z5p9jWk!mx39A(s2tb(f`eS6!2&CATo%PlSmb;YaYy2h9rYU0~twhK;2)nvz@s&Rc( z36JA|R%l&R>)H)uthwU_gp{Ke%2)b!0!)%>&btv>Jk+(Gt$&8SX%4_p~c zE6$#ionKNsmm#Bqgwkw5N@f-2sR_yl+ZHNCb>hen8$YEeGfNBbJiK`Mvjmi3(ombA z2PaU8|2PQ$O1xUccj+3sbXmC_m|+E>KMr2X6Xf&S1@^ex)2&}N%=!;dDpX!^IRUl6 z)x+)jHwCZ3GYVCUEXlBaIfI(0U{ivI4~2$|urWwV6j)VicxiZeD(R`>QTvMyb5E6QRR09+7_LTwqPJt^mpJ8HCG7_%(gY3P-JU9+-YHMQKq&*HME%0HKzqMbnh;< zHR?FY7Vu+^ZwlW>Wz^I!psMlPsHV(or8fRPe7RQi_z+t($F7Uha`UHlC@l}2CppcO6Fn*8da8u}koP!-_CdA7jpehc#EWQR&GvFT=BLi;C@ zU=lzzSw}+k`3%>m<54ZtX-?xqzBgWd9hq-W@HH)`iEuwEh}Y@i&!|fl9iG4AfM=US$hVICFZ3skud=>@wySpFXZ& zg+&FkwDIkFwLRg?yzEkjN9YMxfV$V%i}gQ=*9o)Bva_gksN*6#y9)BNOSBJUGnkvz zVOoCq$wcVHg_$Ke9cE_FYmQfqjz)tfMpd&P$XG2iHzzkMhYWLz$r_zmX6?`@@1$QN!`d=cg(anE5~UMtg$zPI53_HTZ%ADsgZHpr$wa_Q1%$%ki2vb5J$mlegJ|HM-rNFjL#S znYksiTzq!1ZfA-^zY?!8lnGaX$Dr~T*mVB%q&DUK2&?dY?zC|cm-bn_dLh0hjh^c! zh+B)6)5@)hUyQ1;;)`c|cRU}ia~79o6=fD@hqkP;!)MkdL7Rj!?+Nm|kWF89e(tn+ zq0tsp#BU(td$r=c(&>tiUtdO&kqXuy)lBQ?GNx6#aMK?uzRw@uq*eI|Yg{J;TUcRR zzhB{M!*9`G$_5FH#q8LCW{%C{s@g2p~ zf~=CF-2Cj!8A1M`(xTiB>cMxPv_s`|jys;?jz?9XX_>_(vnfbXc4@Ij#BWd8k?{J{ zHvbbh+5$a?FV_J-K5XwpK16lB9sP{mtGbf#i$0wmp(4R=Jmip9b&5N|ZBAx(f)ZUJ2Fjk^E(WR*Rjxkb{ zJw3Z@23{wK-%w4$tDqO6YN@VhP$5(WYKrRkqg?!fEjIo`R0VmhoPZJ(yk@7-M!X7i zC#tTfL{*^p)?^+{sT0Mw{dss5;9{rgsE+T0YT9;jeA^qg$veMkyX1~dHom+O3Difu z-m(YYf~p2}w_9I{swQ8fI`Jn?X_4Y=rYSlrvygQIt{P22)k1B_M?OAyf8d0w$WBx( z{US7dQ31c7G0LkM_>vJG2pgC|oBz z+i5)h1bkEYJ3lc0&mb`W7kjJH=a6lhedy`%zoW{y^>3ljDd_jV+H{-Xs(Jho&?9)A za2eVXU4m+`wn5cpEvP_S^u8b1X`)x4%74-iw7(*{0@|b7zp;Jv1gZl+uNw~06BSGF zXQ2&AcN+TDziffNsTU4v@;qM0uiO_3(l_`n6gnF}JRuxZ@OdvB-2ML*)$xU>^1Gy* z15}bnXnHmA3YXDLR3$wh)u0(fyjrT2i~s6CD0B|~WmLzVM?PKAd+=(h%h7gdE4Xxm zXGyLzw>-b)H=@;au0&Q~I2UWU{_H*luu0&(#NHje(lKDTAiNy*Q1sp|0N%kxp zmrwVkwun0vp6-PvoDvQ$D*0@Eb%(IwWb1!oR_M5g@EUYgC;Mw!v?||qYB*Sd<9AAb z+#tqpUgI~d@3ytsy~Ao85wGp)$P2cy4jQlo>n-IG#z^4F4lTQzM|9 z(>Foa(tfmKc|~6uMh$wym$u9MplYBz4p0vaKo#E#Rf8R3sA#giiJpNjamOEnY6N`A z@fzdLqdIOHs&tLePU!7>?7FzIQ<#opVZDKX4m_O*Wjwe`I5_bR| zqbH&rx`u<5`WRHp(GTZ@gOxq2xL99Bg$8yD2kE<_NyOJ7osK`7V;j4nFJOa(moT|P)DaCfp8dMp)nru%Lza_gDe=M9QE(ID1YkS)G_>It%(rMH5 zbTT(PJ3F~s*U)O>Jhz0Lv?X1Ms?8~hpLbJqsODks0xrohH8;#2HS-) z0k0-rm1a*owZMLdd6KJnX;EH>83nodpANP0GsdOc8fi9jO${BwtI3C6VEZ<{n^(MM z^VIA-^-QSHZf8Q*4YN)A4XWclMOCnjVg4iTfqsLlRS%%b$3s<|YdH>I zUcq?D$u0|p<^YZ(;?4>70LCU?p%iD|j8{QO7u0XbL>r$~G_Q~)Q;*M!viWLdG3nHb zWs~d){&>$dHFJ8Ujh^=*RJ42(bCSvJ$QL_s0n7x1|duP)BXvjv)!SyVn#GiLx1 z8We3&T{oJdDtTQpREgc4e8oS8*u79`sa6Cw=>^uu$HvikwZOi7o6o{Rd;DCdyWkp2 zqh{N=F>8)L<&;+C@40MOp=zlAc0$LWgETL;Bc(8Zdayb-!0R-B?8q(dJcmkMM-}Gj z(Wd<-mv7rbkCQ;{@XZ|C5zFx!(|k9j>W1P6#`g`&=GyeUZqcEzpr|CfATLOF4P5P3 zh-%53M?Pv-=1MR!^rUl6W?m?-pp=Up*RgJw*b@a$HnL~uoq<V9#bwXEkpJk`Zac#Mj?+(SyuR=4uMP=4 zec;_wwza)#(ARw*eJ*)&QscUVhnIf(W^%X8ax# z_4I9vntXNgU9T*kcl(Sta{Y?IgS@vXu6BH3Q`In>?41-2h5BM6enw_;WOCTA9vlm= z^S!h_k%Wk!mKKZjjrf%aDXPXU|U@5%d1Ri0MRh*iXtx_F8jw2%1#Yj!a7Qt4G8l_a*v? z7skS$`-3m+-_Wld z9gFT^%#KwXczu~BL+v5d^je&)iu&wnfAN?;-qEaRwtX^2Cr8FN_7lg(yqkbJQ^?O4 znjC)BUp%&t*Mv1l%@njlbPz7hPye=8T>^d8k=`4GRD+;ZqxG0@gZ%W7son*I#A%Sf zr-YmMY2#zz=l#Xw`$QTa<5!Q5dE=OKx}%EtN$JUvs$=}L2{G?;pdGAg_S25FTlqTb zgy>jYf4{+y)W|Kz`e_qm;rIN-6Z=GtYwA}|jCn(w#z&@(ycVa-Dfal}@C*LpNqr&> zkMpZ1#k`5E`dx^s6AXjva2;_`pALvTO_HowSev~1s#aimT& zzjA8K>&CYAEL(WamWdm5ILjw-X*SC}DdFaRWp>PamQA4Q6$)zd8;;?dmg=3)W^gn- zXuZg-C-{}qV%|aE@F2Syx^EEsMy*PecUrP{Tiltd&J2+je&zI7q~D2tHBxz^pO_Pi z{CuLHmJ^H4WJ7yiFdWtrQe%XC@{4@m(of8dMZ2_OU+$-mPWA2}H1Tj5ere@b=aOY> zKXFDZdJ`*kU$wdS7NLQps_Q2WOOBp<61{74_LlTPs~XT`iUc92{TDw2W&*5Uf$n)*pYk|Y0W>!;<%ywgszT|q_2a}iE? z*7IwgPDyYk8q_6`yGQkn9VnA=8U_i$u(=Iqt3b})9^84vvBZu~_BytU7fd5@8cxG4 z!DNhJQNwA91*?wtIZk=j4Hk{g?d|L*mp4-CVtV;Y$D~F!wD+rL$Gk%T%_o)=Iysz;1R!OVzO7C z`DMF}l6#|Y!FaLlfm0zF80pE;8r&#<>8#XfkF!IeF$zU)INMK~8;cC<TUKc-cUM%un7e5W@evV&>Tz5{8 z-K*#LiI>E@lW8t>4r>r2Y7TAyj`2k|K8e$;3A#V}Puy@neSE6dpRKgqvQ%$yciXP?Fjtu?aoK))S!!fYcfb0wn3t7&`24Is%aZ-H z`LW1xDSqYrn3v1RHN7hx@$`Kt)h+deR>b0ihD4m8d19}q9RVgbu za(z!ftvnX}J1}UhXfq~PENH;dgeIG9?Zdt55*q8L&r6LA?B!Qh#G-dlm8t%=%P2pO zkTfo662|$JII5r`;WpqjyQtf|d2l~~>f`NYGqFCgyfqvSeSo9Z` z%=3d%pUVQ#CkS0ZsCN*0me4?d+oE0x=i9=vCNX@{aCY#oJl{{Oj79bb674#OD?xDJ zLP9|=M&2IeCoYLa+YVMvYPFjP**2+Rw*4Kau|XT=Cr7+AKk?dFbO6JuQ!tiG2#p}x zcIb;Z^FU0bfiDP{d&q1=YE^M;P{PGEMc!R*FrB(9I2erK-) z0!ow+jGeD>Dy5wlr=|z3%KmaHAuazcwQ@w(r2CcE$Gp8jJM3zvvlqJ{-pyKGGjPh5 zk_=@AUEo*V5R1HjfnR+?%sX*dD8wuwvnn!MIm}P1Vq*uS^|&Um;&{mn007mhVv~6X zZj^Pz9l(vlF}g-3dlzKb=czWczh?N=H^#i3K&=G~4sG9P%1(jP^caOx8?m$%Cwo;m zRhX+4aqr+%YP+_yxR8kybY2M|#+$8v^gTI$>4shjBW*>RsFL1joKDJ?<&zXeb+I{d z1$Yr>kEh0-M_tqt^@7XGxj1_m>y~#H&i1tyrXO&2>o{z*Eoa!TnVjt1h|@74Q`3bh zf@8s=)JaQ{z5Zituh50hr_{yt@EgoXjXp()3l}r(2SR=QZCR<&P1J@^>dt^$cpLSc!dnhwL z(se!m78kUBu=DH4v8-^eIE!%oalv92eG3=d{&wJ&9w8(sK244i70tM{gWsqBzyNk`QZvE70q> z!)t`sJl7T@n3vu~xNe72`Z(57dtCHAT#lbUrdK%6uUr+2UZ2PQF1Uj3CNzt5Y?T=F zBM8nt>|Vwd#9bsM-><$W=G~JY3N47k=;_2?|uLwS|GUuPEV;@#$mp;1EUFb@zdY$l|Vovg;kGz>h`A{&*H=cx=0DpI2*g!=jE zYkDOR;IgV&#+K@|OZ@7GxU;>4KmP&Ri~CPFwus#NbiefQ7^WdF#c>HFmF^6-;C>%w zq08d?XW}A*F7vCG^+|xKNOeqA7ONxf_c_#Xe(j?N;|_O?1Zn1yL(Uf5EZSxT#k{#o@`t zLUc1O)nEE%fP)q?HQbSe7x>ldV%|jz=d;LyuA$#6ajF?Zk(PJ?*E@bn@6;>etAmEy z)wnT1oUXCoUE!xa5sUV_QZqOGiPXqrSNhdY#3JFV{KWM!Z}?U5Lu)wn8JvbqP-@Rx z7$5Ii3C_paag#ALB>|)BYH;)HJ&QZMaC*PGgmwoXyE?x7*Ibp7fazlM=icIPxa8ns zdJW%g1|?P@%5c9gEn9FpB-rjo`z_M?sEg9|gu43;GE%)QgfvX;Oge;96_|+3kKT*p z*LW@p(NY|@D%|8hM5zDaWA@{E;h1mFrX*C_TC*Cmh~9+L>4UKweNiqr{Xs&()zKTW z#AX$29K5Btex$e8q;}WZQQ!r;ggo3J;z&6**?SIWuX-wI!=>@LrnWv0r%KpO%+UT050KQJoFaH=dJhOy2&^bqRKI z^>2(fx%LRtaCUyEaBFV#D_`JI6HpfiM$U|6uY+$lf_97b7u-3-S@$YVD*=n|Ja$z# z**0nH*9=bf?!~EZsrST`@J)W&i?L|yWvsTrHS$tID!%Qm2XLcsw!0eMY|n9Q(DfaR z-NpnXHN-Ywzskc2d}^FUHwnS+hMQ0iy{XL`8SXsWg#O zR```XDJxhJzs{)lH{je5<{3%DTl}=@m^bwnTdQEb^zOl_`Pc!l{rnQA0~iH+QWE|W zzem&7d@N2&7JDmtRd%h5-oR1Bb zpEqzC(DwGN`CYb{_Ubwer=GDF`K35j&&F-RW#a6xJne2<1)g(Jp=r1@;^_Lc^;JkNQv8igHzV8#c^il;mJ?h zD=Chps|c48iW^8m7Psli(GPI;Tb?sF#urO2{n6RDK7ND3UI_$71^L!wrtr;S z;@+57^o(5v>;`=EGr>SR2vpt3m;0BLXRV`msoO&5Y~8lt`UhF6jq5+h(?A@T2T~5l zjR>3`scgiJw~ld;vB_4kzF+eeJ^Z}g-zcgeEHQXzDA$LtH{WA#RGkNR93$#HF7ip80o1jJ{6rvIzZNh6ixnsS=Z%@%<@I zZBI|o`)#*rTC0MYghmEWL)Q_qi-P9mA>4VSryse&IQP|H86bT*p^-tk-y}5JHrdmOv*93p)yF9bn6dU?p0sa%-LF0n^FlT8g*Sur zy>UHB(m2=y&c)fWqdo72!!CpI@iWezNB7g`zhT!GI*OD_a5|0$TbCz$yKr`Z=%LAg zH~s26`Xs!0cs&}M9C`aqzw#gp?^`xY#tvUkK8)iFHL7&n_BiLn(OYnXg2wn4AuTO- z=g{TtxT~Qe`8ds98+T`I7kwKS41?%d?*!wMoy{CVqe)K%SP=e>(}KX!TqWx6INWYj zd?IdQkWzzgJyyjsoSLJiw^V1H+yyExl1(1_` zl7-;AOW}6n+)99J`GH*z!=_5l;BgvVbxg+D z*69qvN*vkyfnWVw%zI_0U7*-Ku=_soLwh2-(;baV2?qXkgu1BBBhP(k62swG^e2e@ z0$}7v@xlBep{bm}w&58c$9EPQSY@~_!O7W)M%H|6DkJ2Quq$|?Gcq+YW0y&+1L^$< zxtRua!l}_Jg6G-bI|MHZf?mH*ZGAZjZLt8S@#^Wi7JUlGeKPks;m_=IE89kCI1L6i z9;|_v<8%yFW<0L{EO?pWUqJP^y%Z(ywn>5|G&&m>GfNxr%?_c_wn)*>4+rldXbT!S z>I;)rKOBpk_l2oMqt|}H*tZ4$fZ!0$kf@7Yq}g7RmO#P@drhVE*}bM3^{)H}|F8h5 zxXw_aeK;omgT2Dvno5sk>%KMBXteSEV7~LM-137aEs>a=2Tdg!z4}LbMGKU|OVw!@-Pah2Tr`t8o{ZZD-Oi zgz|zi4UdFFmz!;^V1x<-7ONAFT|=lOV6EzgDVCmeEh5C%XM~zX!=bD7ys6OP zVbJI&pAfIsO@#7-;)YtN3Dv=u6S711gcHM|f}l(8CNwSx9U^pdGC&w`e&Pa^wU znzVM|K6P8gi}qSP)NWksaA>6p&rE3=%oqEsH~d6+tG~QE=i^2L?$NA?{M6c1wx-NC zpA-(=78Isyn{epqAoLTVuKv;&QlouO4)e4!Jt3UxJx{O`xv<$^o$UP+=PqYF7Ch|~ zlh%gJrt&8RsV2QiI5l$nDW)3a?EqT8y^CjWmB z)PiR(ah==R{JC7QiOa_6-1aftGTeZ}DL=v4tB5X?%}%TBF2HFf2bT};+JAG^IJ>~= zxCnoZpkmrb5xsD|g7ei3Pf5V^4>Hk)^=+I^$FubVDRtY0wg2KRsS$*N+)PFq`!}3@ zZ2bYDX~BT(-(G3;X2T*v!BF>pQi#mzo1{8n?xD|Myql%1Xuf}*VJchEKvT{Phb9L{ zJx|C^kgjLN`~FTsQ-d*8uS0w!T}G(LY&)I_Lg+G^-HeVV?F_Q}u%jY%hUoCK<43$m z=n9j525?ZPFnbvd&94aAL7LlHGf8X2ZbDOo!sPI$50lN(rrZn>%ApF}4REW{=^Rsi z7QLQ(4&w&eB)HXCjT@$F24Co<@#hWNe$gr1D%^z|9i(L27WuKON$kk+qxe$@+o|kU zB1^iNN@!$TH&ZQb(%mGUO{%=^l$K+;j6Rry8q6AR4?)+(Y+*X`*Ac(F zX}H6KDEbtR`-0)A?V9um2R9uN=8i5s32q`q;SD&~wcft_S{(i9eZi$C4``p@-bRS8 z&G@q98!-}g@oN?&M_%b^61z~;_Nn1ucN#pAiIk?AN@(;xC|`rHKlq4{#-AOj&3oDL z&c&anFY|ht%5%c8I#2cr`$NX}_I@H(jYD%XH#+sUX@lGN=wuwvCD<6<+1pfirLjKl zZ4$eoLt-Wk_3q|Ure)t=3^#xjpnV^Ud4R;WEfc3PZ+A|2;Z!*L9sJHdrn);B zo!Zw0j2v&pzW=KGrBekL)6gV#fCXXt+O7o5Eh z9pB&1SbO5-xC??}ByCO!_cv)hs7Tv$O(p7Ga&9|_9$=~k{{`%){7gm<-kfc5UO3ohIC}|Jmv(1&Vsn4D=bax8W&UpO#ZLI$Mh5*` zR+-pIzsEj<9rL?wKiE~$B%RMT7^fRHy1qC$^5tMt-J7D$PO}Rj%PqGvkKoQF4c{TL zSRKH1!*NqYlMWbSs$(4S?NHmK_BOj+x~+fk5G6Vv$2T2x&MSm8JVU0c3%!?F8*#I9_5tUsI4$#bgLm`@ zG6@RYmym7=gJ&d>Ye$&M0kqRQP>p8W0$$RE_B6JkC*m}>xL;B8+=x9(cO2f!gftW* z!PgmeM^bD*ePXINkdWOhR&g(QCGLV?KJ6uResJz29+h_*6|W0D=H=k}5=ZH2$kjMI z^>uyu1g8cGMuXRRv@1^VKx#TplZMGbW8IEZ2Uu5w($$0%Xxq;|)trP=i%}2S?X5zciQ6ZvtREv%;Xx3yjLjLBLP8;t6uSNeyf_4e)rxWw zGB@FpagEe?(Y$OGNw4p1BxFae`tE0(wtxx2OgM8|{L0Uqi5BC6S8$>m3E9U^;pr}g z$>_igz$q^~SFXX?%4WQfQWw)TIN?z_wyq2vy`+cZN;)~!yOxlO%l$b8*^1M0%|M~A z2j+%@FB0pTs`^|}%CK5KSn61%8q5d>4@P)@fK6d|hDn^jSk9ek{{)aLEi3z-I9C=% z?`JsGl6w_e=GeS&@XW?u4Cmq8gFWswH{*D3A~QAGY8ER^u<4Fw6C7u@d2FYjA*kM9 zZ$!SwurqI> zClqp}3)T&v5G%;E)aW}l!~@Y5vu(czqad1tV|8Rbd7RK$;gL?pU0Pz@Cb#UyIXlwR84GoaT(ZKp!kIiBsvu9;Nnp_EDT;HqJJ;+*+JU z8ax*866V+j^MZxuJe*qro=;Jf8!x=8@E}f^*wY@wY1jpq&1l!TIJIu%?zyIN8U=V0 zqJCgTWF~t_W$`xDh07a=)fyCxWp4@2?zXfdZN_QAq+@y3xxdUL=8#>td3GZnbhozz zH#tb7RpTq1h9&O|FqryZVhc^}@>3Eps!qhz^yIv2uxj~;N%FW4!tubax>w{<9-?q9 zm~yFRH??T6n$SQJYL88$Pdw9qZg4_0bQxn=H&oH{3GrU(i>Z;fE;H3L)Zp{&Izcxu zEDCYF5IeM2c)qEe$)#fNd{Zr*ak)v%Bl(?|+vJq;^5p2dxbyu6xv7zp%1t%#k&<$g zI17EG+@#G4clRrHdI{xrUqz$kCwuKEo3=q=lN6?Ad034Qn!EaJ|AxVJ%TJ)_`cV~H z@S~5kE5%0J7G&bP^F`DOz8NYyu6oo+*Qz^hLA zrYQJG#b38JPZZ!| z4_XJ`46dl=F8<$@_WyVA?_L?4$br(iBWab3+h#_S!)@_RhhlwhB$=&(4DcYZPoGYuY!-X5h1Qu!RLS1p#C<24&)*e^wC08$6W378dObpt@BG2$w#V!RiQfm zCddD4)d^LTn^8@d+gt{5ov*DzM>{T6 zx&}@gI$m29-^j%`cA6A%GbhO%P+OaDz$tKTvO1xfIo(h#LjBNY=r~lL+NzpPa=fVOKDUaAva<-Al~Q;B*ey^Nm4g>J$ghputS zq{rf)L6zOJPM>q}wN=@_0GDoc@lv(JHdM#IimH9yNBJ+bQ@^a12jC+YvCHYFPIo)~ z!s%Y8Upd|9^dC<5JN*vTS{Pyc5e(H0#^Il->scjGk2OYB;v{!~R5dvc6>9FdRJ@h* zQu$MyudOOTTgRo!|1_tkm%Bham!P)lz%$^|vrz4Uy18^x1yh`_tvW#uxU{EB*W0C& zD%jWgas||P15lmlJm=F;4VB@jGRknOf1*JjsnU-`m2SL?pWx!98bbxnOVvUp&P&O+ zJXGpHZ4JgaTu~ML3dS(1f-FRpQ6;JZTAcv;4&3RLa9RQ?s`|C1`ot4go&_nJFEstjItUfLYL7Zv)N zU#jsp&hJN+{-26;s^9^BsfB)W{LfU!{Y-qhnz|0{CQw)H=Ts-E=X`Bdy84bwHEWJR zb*|%39oNjoOO?JkD%8^XR!&>jrTul_$%_4hinoO;!_!eUeJ50RwnJQcsp8X}4s%?p z6AyR3wu)!C_z`t!e}M}DN;`&M%5a>_f2lftyh|^YpWytTsq&xX(p@x_fNGlQ4v;E? zDUN45uYdGJpV}%k!|~dx<7YZ9tz)*$51(#+nIG2Q?}S3L#n2L$Myf*1L3Qk0r)5s( zp-O+5({jfvP_{LpC8%c9ji^3SrC)|Bznh(!x_TtThd{7q+=}W`TXn!~j@Q;C_(SlB zX<6=WI5B7<=5G1H^+OT{8t|8%Wq}S57i0JMfItz ziXY&(R0SS_iVt;Ms+Jk%yi_+9nWzeo?Rag~^Muee7a>)NXF4r(T&fezc3On$M5Ui*E(H_*34c!!;eBb@8>e{0t)Y5}^`)i7Ml-o!^Hl;{#|0dLHerbmyZ=Hy9-B zR4p?CuO=Vu;wL&k8C86i^V93o{>oq$Kp&|xE^xlK>cskg3)H8!iqCdjDqn;KUF5V3 zRlfRvACz9^^z!<&zd(gccqOU~^iPzDU+r{}i(lg6uXX%7R88zVzYNvY>vmKva2Kll z?smEgRl!!H%70B)0!sLxi&*RQF;p${r1Kk{K8HrkzN^E>2iKKt*t({{HR0CHmEHR; z)rZ3PPvlK+qJyUo-?-@gsFHu@^nl|Bo&U-CL#PH$JqCfYOGI_t(Wq+C$oV9v$Dm4g zywet_(zQyUpVdsKxP)z8L_6otaC#Q1=IY?$JE6+3tBddM;*(L`7!7fLsMB;*=`)-k z;q*egY2(TR&_}8hjYQSV<5AUYqKmJss=>uB{bZ+^E`63uFI9e1otNsk>5k_F_XvO- z2Xb9PsR~els)b5W)u0Sj2A4XoP#I>*D2u3igci&!MXECg(S!`bZUg#qn(@>B>W|5>NqZ6#GA@ zGJL}x5PH+4e;d`5`WWTE&>ns%-Cn0(3iA0++DPmCk0ew9esKp#RkL56mn!4mP_;lk z4gEi;;_EwJTg4OLQV&%ZG(y#4$0)tlc?ERBrUHLZ9eA9JZ|35q;>}TI*xJRnar|WG zPet|lPpb0=3G{5N2M4GndbtB@tI$Bl|KHFP$uCp?Ut#(X2nN|ScY@kFl=w#+m#U>6 zbNV={!Kwd`RJF*{s6KzD>dhBix-F>kdCAi^KSAJsS2gW6m!ULb(yw)oYik^?tvdf3 zj!V^$+fnhiQFXcgKVS9vf1qasUH-Alc$d>pT*gwJ@KbrS?phXj)$o@(RqcAv@jp@f5aMT-;LlVU|3bXHv%CAMai)iH{ zq}qOVatS&+?c($tR3E7_=<2ka)9x-_ssf}q?diBw$E7+g??pf*>*Eqg<@>t?=c0Pj zaDnr~P<^C2K?bU+Fvj_DE?%lJG|BneDxL|aAmyPc1k^XVE@5p|LGm1z>V)~u*H)#Q z?YLCF1XWE-QFYlRE?%k%EkqNwz+6v22i%D203X%oKdI8)7~l&dFQ3U25+;Ac)>+T zmBEXSzl5r0ub^tFS5bZbOqK2p;&uF6E?sREe;clXyc4v)4Fq6^JMcZ1fT-a0n*Z-! zv9TAJ|K?pAmE}LCQ;q&_zhX0hgETsO@uQDa8TED=L-qMjdgK+GBd^#nlQ-Lua^w}8 zKYi6k>(-H1Y-+!9qh;pED>h5j41A=zb{%=eMz7jvwj6oIMthYbuh<-U#m24-M_#e1 z{b~(UBY5RTbL7Y?Hb-8usr|}LaF58ZBd^#57t$lI*c^GqhE-Cp+Gw*``_&q3;E%jw zLqqT!MD26r6`Lck*o2O}Vsqpbng+ z)HnUs0|spXtXdE7%zlA`0;4tnjxsAZ09HQ;^22l1aV7ovI z)8<(~yXOE4p9QouH3B;Xx;+PIZ5BKSShNYSTcC~Uya|xzz#f5t&jZ?; zs^jcg= z;THi3F9EV&1avlQ1=b5ReF<=m$$SZrvlXyKpqokB3TXB+pmZxB*=!QnD$w?2Ko2wf zWk6XqV7ox7X;Teo_X=QPHK4bt5!fNn?G->Dv)~oLqQ3)n3-mLc{|-pm23YoYz`16Z zz#f5t+W-Si)i%KLR{;kE&NuyD1q^x(ujZ|Ga19{g4M27cAj7N`STE4@4Zwva^9?}Gn}96>qs-v<0L|V4Jn$Z1jQLSu zt3ZeCfN>_{eL&fEz`FMV6HNF6K)bgA*&hHVnY98t1e)#yTx>FT0v5dk*dmZ=l0F2a z>;RO02*@&<1ojBD{Roh4W`6`&{w`pGfZ3+%Q^0zG0|LdS-)DfF4*{z_1C*Nm0?j@G zjM@#DYgX$J_nS23|J>{sR@4pXtxWH{RLpYSu3zZpy?h!xyjrESo8^C zi@*Ytv=@-_DWG&O;7YSeV2?oCF98e9>@NY!KLczRxW=^k3NUClVBuGQ#imB!pg^~; z0ZYt+uK}w+2kaJDYC7)&jQs+zY#-oyvr8ah4`ARofGSh<4Pd>%0Ri9i`v)LrFJRR_ z0L#pNfo5Lg3G5MQdjPP?%sv2E{tv)*fqPAxe*p%43t0Fs zzG~^PT(mMJ_Km@10eel zV53;1#nV0$BYEV7I_F)42{{>>YtgMIMijUUEziTq;b3j=buukB8 z6HWlMivY3{06WcEfgJ)(J-|mM(*rE31K1+4%OoWNQtARq69J!^O#*ua+8zbiZDt<@ zSRMsz7x==oIT|pi9$?|ofW4+h;GjUa27s^3f(C%q^#QvD_L&Y%Nj<8ME(&n zpEQh&HVGbNU?a%>kh!rDWWC4%k?%sLe`82aB4kx#$bpdgCnWN(kV#8Ie+Zd7QM2_Z zQbe1O;>VB~(F9UNc1p^$k*WQR!8VpxiyA_P5`VII3RG0>DK~~(-g3(1)!{fu5X05;ufu^kitxaZY zz@p}WEdp&!(n)}n69AZvog2;9t%+pS%+uZ3dkP>2NYh z+M9VNljNYlPJuH``%?g`TLPAz0_b4g6&TwJ(EC)t*=F&nfP~h7eFB|LkG6pI0=H_O zo@4e3&hoP6kYB2S_#dwF9&}1<;^9 zptl*<9=q<034GAlX*nw} zedhq$bp$l%3YcWZbp`AY*eGzZ@wx#Poeh}P4UlOz2&8lZwCoPZGP&IWdjz%#WSi#6 zfaRS5^OFJ7&C3FVx&S()0CLT|6u?1&odPpW`yPPR=Kz-W0L(J)3XJUv=-m@gU>5fT zByv;g*>=nrA2S`63u*|GDAJD8n;E;eZg9ib&3Oq0f zu)_Q(P@O6If-MrvsLs515}0xYxWaFlZ2w zfO%J7Y#N~VaKJ-m@o+%G5WqfxwWdb~V7$To&ZP~4cI48V|q*ktQWX-BH&H4S0HB$Abk>GyIC;_ z&}=N=kia`;@I`>F0uNjSc-Q0-e9=Dv#o?ZyKdOa|;U<0b=k2y7Ji$atB6 zMH2wCG6B2H27#1`fRN;wV!iuzCidTOpujYYw@EpJnf$TYe)@H51qS=6^a{+Bk=3GEZ5nzkJDJH25ut%V@4A9nW z5?EdgXgd#Zx|ux>FsKBuU7)>ba|z&}z`{!aXPO#;)un)LmjXJN1(yQG&H?NeINNl- z43IDvueIASWbRXZrM9l}ne%|eo_t^h1t2uL?I z0%I2dx?K$zW)@rxNVo#9TOh-9z6P*fVA(Z*3(YQpoGSqX7Xe0@szrciR{;(Pj4}Nd z1GWmRS_~Lx_6w9P1dOT#OfV}e0qw2^M3(?2nT#cX9RlkFE;iw70gJ8yWM2!&G;0M? z76F3fL_$+jPDWuwG!E4HvzT^thxy>&+Hc{y8$q28Q@a0av7jq6(D*uV7|$?8L&fOoj|z>8^EF)0oewy zz^oNW@c~Vj1Fkfg%K>`?wg@aVNh<)$ZvvFA09<1>2@F~WXnPA_v6+1f;Gn>EfhDHR zUjVCb1}yvwV5zAQ7;6CC{tCF>Ech!RVL4#8K$YoyD`36AvReVZ*(H#(0x?g~nzaHcw*i{o1-Q#(-UZkruti{%NxB=b{B}U;-GF<|CV@eB0NSns+-GL5 z0vr_BE^xnTa}QwkO2EQ<01ucNfw6Z2y4?$S$Sk-QkZ>1Zx4>G{c{O0Yz_QhVN6jvQ zoVx)7?*pteRrdj!tpXenc*68s1K29CY7Jn6*)LFb4`9^&fTzsL`vL9l1w{V_*l05T z2G}96PT*M+egLp&H6Z%|z$UX+Amu(l(+2^YP3D7uJpx+%F>TfYR{ssKa4le)sSz0a0HE6=fY;1|M*s;A0(J}3n9h#^ z)(b3q6!50mC6MzFVBlkb?WXE6K(mJd2L#?R{ni1t3anZOc-QO~C|e8oU$nh?7jC6Vy_sjouFDRtx+6WTeYYnN@=N0trl&y_NY;6l%lBh zd%o`Lx+>N2{(k=W-49RaT(7g|bLbza(B}A`B2>2Y~qKW$);i`l^5-yv}Um(ocfH3R}grCh033Wb0D6|>j znn~D<@KC}r3D-@?7KG&+5hiXyxM_|`XtN2S?3W0?nsHwu_kM3rfo!D34uc z$qtmFU!u5oqC9n(W;;=iOW7dhxy!hAp-kF}62FV=c$?&1WG8wXLcneW9}~A5;i`l^ z65J;99)vmD5r*wSNNsjVsIvp1&|ZWzCSfnaLkY(uq%$F3AuQjCF!3vd4CbhWHoFkY z?nB6A#_dD!+l_EpLS_@bA7PV(S^E*PnhO$o?Lnw{03pCkKY$Rp7va8y947W4!afPh z4k84ZI}(O}h0yX4LN2rT5JJ&?2=1>Da+{`KBOI5oK|)^R{SCsT{Rr{jAcUA?3DE}- z0uCb-FmZKsBSbQGbONjQq|P{J_@B}~Y-2+O}l znD{M1DRWdpn{N=xeuq%njQbA3?=Zq;3E?LEdxT9AW_^!P#$1rl>j*;4V+du<^kWEt zM-lEzC}(1SK-ec?*$)Wi%^eBDzeQ;IBSJ;9_(z1I-yyh?2|cwa)8bPgf@5<;9wmJod&A>cAXHxqXm;i`l^65>tfD+qHgAPl>L(9`UY zQ0FIvLO&z)HVHo?Jd|)uLSGYd6=C^Bgo#%X`kSK?+FU{?dktZr8FvlA?=r$=2?-|r z7lcg`X8nRN#9WZj>k2~6>j=Zl^y>(LKO@|i@T!Tufv``)vKt5^%pD2CuOhU(i7?76 zzKKxu8iM;4!Wh%^7Q%4}8zdwe?_Uun{elqxE5bOFEFt;h}_M5+<9Fy9mo~AxylB@U}TBq0O%dW$z(O zHRJ9f_}xahEMd9{zmKp&`8&caGyQjjz~2z=OE4z(0m42B%N`)i zHFqQozl+fFA;SA+@k4~7_YmBV5ayevj}VSa*dSq{@%{s0(tU*ZKM)q1WC_u~BLqA~ zSZd-PBV3iRN5V3b`3b_D2MEKSAbezYNT~A=q0m!=6(->+!b1tiBz$Z_o*^uMgfQ_L z!YAgagf@R5lzon{#*BN8;P)8evV`PW;XYIc*Ry8%un3uTfy-V`aIWdi^#(KD8zJy1 z!hH!FO{@!HpM+&DgwM?#1n)0QT_23iX0ePd=8=pqO;cZtt!9OcZN}S;vE8(lvBM-| zm}qYwDj*dR?J{wx5UxttBVmupoEl+{3t?Dlgs;pF1n+$&$PZ(`Nsw{C?3Z!SgrvbZ zWJbvN+8mYfjVYEEXH3&f2*)LCkZ{g;`y)(B zhY;_NaKR)?h)$0XkQw2kiOY;|Rl*(#mrdp@2y-$Z49kM>v)Lh`PDX@6SrM+8gscb; zB^;A*-GpRASe^-CVm5@E=BR`={s?6Q5Pmh|0ucN%BV3kn$Ao7`*d$?Ab|2OnKIW(F zKCCsepw!HPa^J_y$bk}=73IE^2R^1+Aj&=|%K}jz`Iz6N49|wrG6?0dk699gQZxX? zofGA$k7}SR|3JW2*PCv;U>H!!X^o`N+Ogo7bNs5icqr@LRmAt6hdGzg!>Z8nb=T- zeG-<1B9u3GBn&T((6Tf_MYFgxLeUZk?l6SPrfC?$aS0nFR5jk3qb8L^h!01IHOUg9 zOCbbAAXGPT5eQc$?2%B@WG;g+Clp~=8HCzqhlDz%5eh{j)HMl_2oEJ3lThD;ltow` zhA^=#LPK*@LYr`evQY?)&A2E8zX*iO5}KOuatNCw%qoY_++2{*s|-TTXoQw#dNe{{ zB*J|Otxarsgnbg0l}Bi6?noG37NKPYg!X1}1%#qe2=0mq9Zl1U2*)LCkkHw9S3;On z4k5l0LYzsK5FL#WP#K|{iK~ooRl*(#@g{Q>ggNCAhE+l6X?94cQvsn+RfOIqp(?^d z3CAS#H6bww%PS&Gj6vvcj!I}#388E(!ay@F7QwGF!et2wCcGNLCJD2uAq+7WB=o9+ zP_sJ1Ff+Y6LSR*&42iELY#y{e@?PSV-%AxZv~^~|)RRkR$v(2`Q2%20*4^FIc<0c0 zJqz7E-8Msp)o)kHUcCMJBk>;$$CQ?JPPILBAhuijmeK{R7_||Fr21f4`&I=JcFg{%@5T@6_{4a-NAuHgX-sT;pS&CM_41kKdhvf3mpR|aCz~nR z+$VkZbOrd`axd%MDgEPz4jxERn-|#FsJYKbA9t<@ephc})8^EsVm85TeEi()cu8Fv zgE-2g`A_lj3(8W#^ZRK@dOW$$kbwhuKeAVIw6tbiJD<%#k^H6>zsHu;tzYlZK0~Zu zD2wEGwX%EiXUN}r#g+D4L0&?Fzjm=^Y&)N=uE-juN_(GB*SQ*IKzpCU?%_2_TKRd` z+bWKNe&ESQ`d5AY(i~~U?*tN_HzjT?Ew?#x%TSnTd0sZ@Qd^=|&U<=Ni*N6xpQB3} z)ZVO)^C=uOs-t!7DMb8`p_IYPqgg2`zTuv zUbqH&>M!m4uX%n2H)+jlW@{gxT4}3xvQqqH;>L`9ed>8<82Of!)7LQlUnE<}6L+7# z=Sj8T=h}FrvCk%NH7ZTi+{gdjMMLr_w@EMM)=>1R9xZ7BB`Ca-MpGiWJh{tIezldG z8klL#jy^usGsF++*LwgJQGYF775tzlxGLN2scb8c%7)X!=!Slt?EXVlC{v5%nD*;6 zv_5rTW3{?k9;m5f)C98OQ<&}?fo_bj{!{>;5eGP?Dzt2#P7qO{_1=RKS$|i4~j+dc$ zed}%Z^tC6#-LrkVXGm_~tzUpoI?CJF0_EN6{r#-WzS^sIw_eo3 zFnh9X`f+L=~53cjTZP+u)2XKzox@vpMsur2Q8$5 zYYoPua&7gQzxH~o&upx;*eBAZX6?Rl&{Cg|&ZG?+Y0Zz9-ZUr2`&LbS_T2htFg?=` zQ()>hAoX#s)tJmdp3igJ4~8;seTY)w6tjMzQy*_GCu!3RpWKb)-u=;(&N1D+gc`DQy~su*C#Wk($H^C z9<;S=n4Vv&*Y8SxZHoc6MQ`>DlpBwpP&A^!6Txx95|nm)R(=9)-t(+aU5ZXXni?+4GXoJ$&^UVt+FBJm za51!DwpP{File<^YcY0wCD6v$T6NoBNwleG8U-~HZLt&=(`=75Z7med*jg=HD~&eS z)@q|EgJH19*6P~+!qJx7T0L81vEa4R*6Q0~6ZNy4t87s(EK(as!Y8)Y$kw!CcniBe zdXbS5j)H}@*3|aL;=}6`TWe-(YRc8Nrgs`Cjq(ttU$Is?Ef5tUD-y5tcEYV}j}_4} zqG^n`w*Bd+K#xk`)7JJ^8G9jh7(VT6O+O8)b(TJQ>5&qy3eC|pKXh>3v=qZdOWR{d z+hZ(RD_iSiYt_&?+gfK^tBzLF*1FhQ4YX7Cgrr}1QNrr^XKhU{Qj%6n{qJ`>a5qHN zLT$*d>5xyn?XeE_7+dRMYjx3LZLO!R)kCXhYrSl(KH5$@;ofLUqXF#2?&<%1ZI2BR zGho-JpY5>`c1@r946yw*#;(_N=`+yQnqb%cLZ3l)*rvL$!w$CnHAB+9L9^r#y=hC; z&>RXWTYQ}NKDEHE*O}_$yaTEw_I7BRPPN%ldYU`#*#2~HQ#7r?dCjHX4<+X|uoH`B z$uYLpR^<<~1CO=Ec6eA1`e=A6LRO-lHw%v zuk&HPW^0|Xub>0xSN&_pqC9kgHFmFl-PYpJ-asoL6HS@v3h&t3n`o+qZm)5TVt+j9*XlJ1&9k)u*pspAVuBy!2+8Sj;81HWd36 zJHn;5HVo}8Vy=bxfvvrQU9aHKXPK?NirsmA;D@$098GsVeLlj}{NptObPw0?``Gq4 z61x@|`mD0GQP{OW(MMCPN;evY(>-9D`zqr544*U+9YN0pgZd=n>S1m}}V{6l}>n#F(Fg3+$ zL`;YCX!`88{msC>!887_Xr-!z--Q{n@Hu3AoQXY)V&U_(9pNnO*=+5I?Qb@kRzdn4 zwKapitgU@(Yje=FGSVmUJ6qH`PfH_xzPB~4^Qzg}Fvv;aOpQ^z}L`AhU#$i)iV<0(7vBD9sZcG?cS7;UYsowfZfK})u^bGEh= zO>f)O=e(_bfL%?Ogn7Z%mSOLxpW&1ElP!LTy)z!iVP3SgkFXD+)4Yj!$<~%**U$Q^ zLtVDD71&*9>Q7hD_~*3}+-UmzV*C3TyWZNMK6YL0PkNp;x)N3=yJ2geU{|iyp>EpR zYV7K8(r($>8ti>i^B~ywrmF&TU&u#vWp8cWfs{EO)ZNaXvs@DpG^~yrUw+r;spNcn?t?jlo#gW?9 z_O#`q6M+?p^Pa=K*!9~jdocA*Dn^q>fhl3JOo}#;H6g{?1TMq z04|WfJ(zl@!e-b4U&2<{2HSz@sDPK|A5Ax!UNoI(`p|Tt>EQ&N^fhB=`sPoifp^K* zTzS{GUgB5S_kku&&5;K|^P=X#Z$O*$ETD~fHqd4~JLG^s&`Z2>L2k$cc_AN!z(p$K z5?qEW@H1S6Yw!!)(7NqcEVtnf{04X79^421`sySZ&hQ+&TFDz+=IKn|you?sriTo$ z3Rm??jnieINoF~y_pSs@vzk^ljaG#ih=poU9cn-=s10?XF4Ttx&=49yW6-_588p`n z+X9R3!)-vFtR0ktG7t%6At!7ngFVw&TkF1<+D>cxtnKn3NC54Khk$m$+VyIe`zj2F zQ7{^`%N-A|!Ru*Ev)R5`61Ab74l`gT%m!^}wSj#P-iLWG9~Qtu&_;GKEPS`RkAN~z7Ro_+ zs0fuI2K0Whl5x#}qGsictxjM%;IzuVsP$&(2UptriPupj0m$f~v4t>celc7- z-6BvFii38!ocVes07trBBOo4nLT#u698i1JgT~MVn!+4v$e-}~HTsO0t1*v(cEi7c zcEGz}9~|(`MQ_9MKFo(DPzgE{Nth`%%Qsh|Zt=RM>xQRWwr+B|t7TFKCK^3ZS<|X|I|OLZAQ?gu+k+ib8QH0i~dHT83*b zEWr>6LC~JW^&%}lYWFtg9rz9I!|(6_4ujqbb`7q>DL4(<0G|WB(S1IAi(Px&DD36n z0QS#dBYXj$Ci34qB&coqG?)(BdnALlar&XET2Kd?LOW;=ogoucg33?@szMCJLN%xk zH9+sFs{j>YJ0ol-?1J5pxR?LFg8gs?&VqK>SKw#R&Uy>1gHIuZNc4u)*`Qba=_t3u(JScW4ND(XC#7t5@?rf#=}GwKurH2YkT|XKo{^z9fQ=>L4=}a!9t3&~S%1)L z%KAWG$OzhTH-c!`O`p&U+~NtVO}96sA(M}F6nqoM8*mA z31uM)bOaC$6`&#{R_4Dd5CgGL4XT5-`?a7hB$0s$psoE!pq;yR>Z@T5Xos#H`8v=p zdEPx3x5i;X;l(>02vR5zY4cajGg?_MyOkLAaz*RiC$#FgihQl~C z!E8rDgP;?%h33!-j^L(^vNp!&;b*8unA%Ve>O*O?9++S8_j9b|eZq)nt` zKU1>G^nt1n12v%*XcMbV>+6)}4VVPkC{=dI0m1Msnb+%{2S95w*9LBo_)gdd9Uu<6 zLO19R{h&RWXos1&n_Q$L6MBWOHna^P4-w~ud=LV94R1X30R7IW-o9Iez_$qd5zK{} zP!C!{G*kfH+@?Y@B$2U+FbS4J3A8Yc|8!XNRgb=&X#t&}E<{q=Do_=EB*D{AgHr0n zw$Dl2n@IGvz$j=05hVBn=1%wmyAD32iTSVymcZ*U2_`}W>3fdpi+V2TnbgEucmv)B zow$!6p=FqJL8t9YAqmEVPSy1$$2w3C8bUEhP4(WRP`|)Q&>{Hua1{2#LHHcjsfwnM zz}v7D*1=lHjGhH%Q4@|`uMsRxZRlV-0d$zHv+J&)*SNQ*W_|*lQ%?q8>@BFV#!wsd zQ)18IFytqV0+1NQf2ly{$vQuFWA}kmcsc_*7H$t6Kxa^1_|ehsuh>*vq)vBrnrmPxOoQp58lqr{o>FE)@CP05WPz5T$f7V)CVr6``3X*d-qgCDjJ`!F z=Tkbp7hVYpz1(;T8H-2vrmvL8Uk%WCWgSr1e3;pF6t9ahpi=9g@ z*UPahjNU^$gAD4JFdOJ-&;`Em1UDyK%D66|e?~f+;9cU#qx*ke&=Fm37=S~6=mWi> zB{YGCa0d6wpv1q#tcBSebjr2@I9dBM(Jo|CKS!uqe7Sbhpg$!e@{{P~Qtyb@A(u+1 z#2Ue`T;BuL&JN5ypu@2tT+6Q_$bem?m%TC7ULOkKwjX5boU1UV(D|0mvvhvd6}tKH zh3udOq{Qd+ejQ%rPka}TuOUqUEtAp`F$+b{caE_n76bBA4qabxi~(&%bncvU zsaSL;V=>sPf- zQnS1-H2l$GnKCqtY7QnkO1E#|SmfHl}v z-O|()YKAXhHGBfAK+U2^)d4?*m9PSqgLI*IWGW8F|0e9oumRS?I#uDP@EL3bMIsNM zg92}dFJTL8gRQW`Hl_anP9_gx-v?iT5_Afpc=m!ay9ai|E|7boN-7U3;Q`nWDxor> z8j+hg2H(Rsa0nE^*YF*D3rFEFya`7@{7;QH`$FUbGI0ack#B)Iy$W|*?XN`dz+Jcp zIlQf5l?_uvN}1D8dW`u8$o~WQ9Uj6XcnVM889WEw@^mM4gD<$i2hxLd4dK*~Dv|#b za0;ZsE>Gzo3uJ~&pa2;_fii+W$So^42MaosRy>U%1ba>xi~TyN4+T}DdhIuu+SRs%B(Bwl8uLrJE)NRx zDW*!Q9WPHPd)%ef2k9#P8dwbSPUUyOS9usxT^% zN+EwuK@lpGDz#JM##}c66>KIspEY zH6rV}FM1#74ZWZz^niHi4&9(D#6f4+sSejgmj543#jV=VEI15Ph0*;$BP&tWqN-LE zt7_GLgD};;{b3*s07Wna)DJX6W&?$F!l~matTQvpp9(e-UWMWCifvaD&jB*V_lH>I zVFc{LJ^^zKjE2H63KC%~B*8cs4=>l6O63%03U(DHCrpAjKn0o%Z^4@oMq00H{HtWj ztpccureP`~_1YOAcXdK_B6Yx-;DnJb`z%l#PKQ-ov%!GVXPi-xGOSxAdmo&{QjSxV zXfZ5;g|Gmeo~tph%qSs^cXi77pi*ksDG`NN;_@SRO+5WDKLYiG4jS%Bt`pc)>G9epsMsUaH@41 z_O0+GYyn^R0ye<_*a)A)W}BUu+hGUnfgT$fik@ZQyEu;nXzk3@5fYF#j_96KugftPnzxrYFcO1B}$Zsq3{DJSE>nB z(=qrCjzW3(7QVNyf5Z%Sv6%op1hSNCJs5Hs^CBDp-LikeJOd}744j6Oa0(*T{`}`z zc$~*P2WLU+IdQ>ulcu)61nMWwYANNA%1Yv@Rt-tj))i3g=)^?pK|RHyZ*ui5uFi#Z zzLeHQ`|AkC2XxG)V~S@4ddP)s7KWD z^SiCx$NUZMsr~Q5BX|tYL2V`U<&tx)1XFRX^ZlZ@>5O0B>F8V2BDkqtm7q%NWGoYQ zm0Zv6sAlx+jtZn_cgAAs`JF^f9vWVHfJg0>6O(cI=e)lOO>V_NU#6?QL(mFf7J*Ut zEsR+R^Z?Ly+zMjKy((^bF$ZDl!Jz!0Ce4Q#VqGWx>prg)9+hBaP@)w;-*QBQI;m<% z9WKPqj54B*tP!HjlmdP8UlK|{X$XZVhy;C|S4Qox@ASfkEZepc-fiI+$z*O+mNp#+Z$u0n~?@pl?f504;c`W7iy#SPe^Us0($V z7RYlAkgjW)4WS9N07c#!+Cdx8wyG_rI;1*WXG~>S_BdO2I;%3SxuyqZyo>R#A<~zN z-p~gIKtJdYI%-u-DA%eT*;NZFtx7r+R6@B|BA!>U4})pgl>t?|_yo4Xm#_sk!xykx z?XR4z1Vyp}b2)qjAHoN)6tplIg{jEOVpp?`htk+1U>x?bFd9m6T>&Ct4A_&=31u%y(f9 zybc4=3}z^15@zCT{!`9p!VH)W(_kvR18>6=m<$u3HvyHgx3DY0*D&9NN$>_Jk%=I; zJ~r|%yTZuc7nE@_o#@HY04|&or*QPRy%gY2O|_!Z$lYm<|FX-!YC?XL8JVR?-;>i> zwu2&4&Q&$?;Gim(o30g+u4Q);Ry(V@7hBVZd&tLMaT&m-RW2!Xja49>R zI@%gg-%+OIN42*WyL!2kh|+LMtT>WE9hurm^xA|))wU4^5m;@c9;zl$=UNBqbe~~v zfc5YxC~~J6RLx3QGvmvNs>CU^zh2Y+e-*5pO4|)PK=<_Rn6co@<-4%&ggvkyz5-21 znnNbhbeb>Zf1mAk08`g$njb;U^CcWpwP_~$0lo*djrxG5SVgAE=qRWi73m>NMRWuX z!#D7?ZGMZHvZSi=l-J+ku4X<4X>gO7sKk`xlpYmOHE;z^!YMcbntqkIv`)6^=;ydr zrq6(G!>2KI9CH@)eay?47vTb^rp^Pm>O{|c-;0Z%Y*DvVMRW<2kP>(ml$q;r6`Vw! zJD%=nPNK(gS0;zUFK`V~7DWE!u0mba{I60ew-QJDuu6e&xX1Mf%slWb_FHfhcH&>p z5A_EsY7?6`=x@*Kt@M&=U-$pcoVeC8{qd zbHHFofI%=227n$)@rO*%3(~?GGWHt@-UekH)kH*iin0`b$C>spwq zi5fs{r1gryqAICk-rnt-%Uu?08T0vWp6@P>RrOI6ih$}x-*FZMeIKfZ3W0o(7gE+) zcCPinjvm}eSyvgk&H(8l9jM-(QuHVA2Rwq`;l7q8yQqVm@C`gbl-;Qx^_quh8avYE zP9Tq6_4pXO6aL@AsGhZF_Oru1!*m)fjSpS(d5TE<$Z2Xw1-{@7Uf=^RaD)6P!juuE zv^$aimzkM3b`r-&r2l7bQU=g7Q1YPjaz{^t76iIhOUpf_+ZSA~20ieT3vz-IT7|X? zo{B*KX}Wu%H+5olmJy1JTUR|2x9?9%Fv>LZRHby3HzF6-E3QfrBSmS7)( zQ<_h(JJ&0)%d>O6|E24c5h}dK#><+xV(<|KT8u(DUP!zdvoQr*5* ziIoWzK)T~sGfiU32>-1F@*|wUP8ijk<^<;cL&Gq z<&oqW4I2MWMDpmgWy)!C7rGNkN>iC|{40ZM-<0mkfOG8(+n0xG;=hem-B=aaX>)Zh zbr>f?)yiPB1Q-P)L2k;Fld#;RIRzYJUpwxsofADLzPX54Gu>-=m;@7GJUAykI+~KZ zO!;{OUWbXGYqhT;b%w7F>k7K8!@3!`sqd&?OowSO1(dNI8vjqRXkGLUqSi!#MD#Xx zef6ks`=(-7;$L9~<6aEbWB(LxVE-6%B`k-JU@e;?k1`LK{gFM<+fsCXXY(#kFXmf*e&G;%(`Txz51cd@SknPMFz!$soy1alQA z!;07QXwqsf*1{UtiKoq=@v9CcPrK2BFsr~$?8;0#+^TY|jD%oU6^Eg3;(7z<@Fq9z zTGVai`UviyVeWwKuno5A&nCabvIRE77w|b~;ur>62WbeYck9Md6DOC;`PF1k}N^gVR~FVD|?tQg&(l?<8k?x!40v$wJW7=6ZC^Y4dpOstG+atJ+W> z=!U&BRN%T9rXI+v4tnBPk0k5yWId|fkhofc9$nTW%!NT|rB39(#yF@t3n8jX3t|@F zIs{W0QPt+do)>g(nh`T6S`ZZG+KX$glAeYX?}Cw!Vl&*FXtet^Sp5cWeg!tTSIjGwE7sS5|V_Q6a8N3iQa zUtzw1L+~|d8>5cOXiM}uhR_J%DCWCFq@%@ev40QW!D%=JC*e5!2(9s>Qp$Af=eWKC zKfwji2LCeVCD2XjB4#r2-^Kh5?!d2V{~K6t!Y#NB@^laLJ`5m|-!Y%UAJ7&a!XtPB zk3nas8K^G(`IH~%Fy0r_2V9_sdQ(FxaD(&bR_U;3O60#vB&ff&@(2BGL=MOf*&r(@ z6In0=AQ1F;>ukb^JhrZk1!LFWRqVijZcN=B)o)bQ1u*q|tn8`KeW57f6T=WogHz4w zY@uAMRI1`q*!71SB|ufLX3`&XsHuu!s!tTbEDAakRhX10jQobeYI}pEy08O3%RRseflQ=m5Se320>Kj{uy+6}Af3 zFT3Z`)>PwAQ)&ZH^)~?hg@7Katqn@F7G_OI*^c$Ou4n6dvQ$r)HY8_FF&l#(ah*rl zjG$qu=9&f0d{UJ3nydXanP~iLD%B7y%yn^C%(W&HWw0Y=2!1+XDnojZUw+$SwtzOE zXXW*5Z7XOGDen)RxOS%S*9h+vI#CmjCJ`;a9+03Wia0!Xfv%uAzdL4s=m*ER?u)61 zdDU0c+f`~k*xL(wLJv^q)98>N%?mnj*My{P@G#tm!VtCpU@QqR2n?Qd?U-t>SGkrs z4s#5Qh7m9dMuOag^duMys#R&@ZBzD%w*7V6^gn>b3mRQAeZKQ8Oy0cA)bD)r=15CK z2T~RLvVPdOdw$-X!b8JCqv_!09gt z%k;%9Zs*S}v4RKJ)N9-$;JEwbb{%W%%jQ zxbJ-%dQUTJzV{9Ce$VWe_@T*h3^CcnAM+j8WE(N1C#LsDmvmp=_27a_*$Xcl8s^zq zDD@M00^f`KBqeJ6b*?1J+% z=mDo_j60^|d5lA53`O@oX^cdxB9y-?rzrd1o5*ebkdE}oTa z-QGB9+FZZOWQ%?lp$guDOEz4N1#dsyeEseZJTBp(k$+~(Nx{yYNqde|kC>1y?(A+_ z!AaP54lYR7R7>7iQ+aW=4K0h>@iELCpLVg#b|P}s@i(WH@239d_j5GjOI_A#p`L1t zz2|YJt^YXh+rw@~SL3W^^abBQy9=Au7ktO3aBA=q&3BSwYqUJdkbgr!%%a;a?{93y zYLEcmGLc?K%%?y3mQg3UN*JpxgG>#E%Rgjj!bRWrU9RjV-zB0SnVOl2=r@P|biu!x zUsd|K<`*i)>fbdAHqLHU$nTh$@Oge>K#iM8n-Z;xDIZ$K%bmlN{F%Z9u97>uS@E-P?x+>qV>1)l|GT1j`xk7Th0x3r8c#9Y9Ql_Nd8GErJY|}e z^9&tD>(w^MJR!c|{y0r>)XwcedJpuit@CR44r(4|~Y4EDs`h&XI~?+3%N|rYZSXwuxW%DygAs4(*N!R{~Uz}mL-6ylAicgu(>_N z9gvr?avD#Xu2&vwvvTj`wJM8d3d-_JusNb=Yvne#doY^p0cP^{beD5=$ZhiVa0mF3 zKWp%~uH`mI`ZE3q`Fb9+=odm-F$B27BfTvDe@3E?ZcG1BuKq!$(sfE6l+UvyO1d3! zY16QB)%X9cCDpRH2h|iv?Tu<);)-1@x?$ss4q^E&`6GE)cbiK;< zg+<1GeuJo~A&p}z&WK!N@u80L$>P4P54Nmw2Okmm;D(oI5}x~J3n{0{npVK_Rd2)d z^JhDpZ;7vRR(D!lVD?06Z&d+v{tw@5=JpL=U)PobX3#?}w!i82b?q-;{BM$#<3yqU zobzG-n=9()f6EgEGjo{N&jn1_eP;F!H+{#u?h=u_Kf!wzyw^O^uK9zCZI^oT6&4yr za~7OkoQ9yCg9@6^Tlg(p&>B<~`#gGm?&&0hUwcr66*TjF$X@w^=6p7HHZ$#(uWxV- zysO&!zda`7#e84Xz&j&QeX&VFvsMvy#s^(Fso(dXCY|?tceZBbXiws=6f|SWt7}|A z^GrUc*>O#6F>g=LjpqIfpYsZuFc(RGSkN^1l@RL*sq38uO_Ht;7c|?S6T>-TPy-a6 ze5F*H_r5;=B8J-q%{TarN?pkFhc`*Z#|}@QR4Q!i3m*%aN;I4Bv%aR&!MJ;#N@7%% z^U7Vw1m7l=B86uEPSrNL?VB@KIPs_j5-M*I63WXD6NnqSBaxI@QWfe+Pi<(@~n zkA9<1LHV$5&^-#9Eq5q&LSd_hR}Bnb-|tqp1^Cb$qxs2`iNL7c_)yu}dCxml>%qc7 z_|OdINyUo&X+Q6^gYwtVQYVu3OA&SsTN}^9>$@8TM-KFFix0cIp29`<+eW2#E(toY zE1M^*CtdPBaeb91EM*1{tId`KIJR272uysYD`$wR_8WqK)Rspv6YSt88`59t>F&_Byq3$GSTc-hF< zJB!z~d^+Z^reIBSjK^M)CjBG27Tq=G5o7D`-POM3d7Tb3L-83L!!)Y#adr7ynSS^o zmByC3?TbRDD#J`$yqq~re6HAX=66CxU7~YpR_s!@Te|#jw$!*Q!@ZPHk8$B%l=LWb zeBWo0U(faAjoVD5*VAaz=@0VsZ$84jh<(d5QkhoXtitD?wPf8<0$t0>nKatQ(`rQ`Mc*WPjqD^Zyu; z(;+{rXo5c_Ti;eRixy$p-7omxd)VRvCMgV`PT%-Tf7-s3Tc&Si)8r``&tBPd*{Hi# zvfDS{PArOb+p z`p)%=adG=28l|z@Cn_qsNEMS$wI5lFm2ytLJPLJoln9P9WztX-_JaYtXFp?nu|Q*jd%w5w1biX1(HW5Ink? zRm6i8YgII(mNoWlAU$2Wg5RvO?!c&Nc+j-E`P(a9mk(M0hCPXMKUrYAEGhFtqlL>J zu_7L;k%bFu@{*LbNn{PHW?erfB$?QV5}x|=ME>`Yl!RY@(is{*cu4$U&KbwId;U=Y z?^wc=wYKVcYMPne?ug*XnpTbekg@!LECKcF;)CW?wARW#yKk7rplUlfmJy~^`-nRm zj-RT!Wh{QRQH&_-Wvw$JT=v@K&vk}9{n~3JyZ(YN)wX&>gR{NADY#->XU*c_K z>&(_lX;&SS(}()(Q`fptuGzJuZi^!Mj(alaDe{Z;m))>`SzWn?)ip#JAji_(kYAfH}o_xT+Y%fCT&P}Lo zxTyVn+eEbZI@QWOxY+A~%ni&f!g|*;O-ry-ez$>{mXngqYhWt5F_|7)x#=hi8=AF# ze|j^6f*APIZu(|TqY0Kt%u}vFcJRV^YythZ|XaAkDx^dw*&A-e!6U zJDVu>8!a1~cNC&)WAjaRcVMoujjefdOqNO!pKa{-ou}lUsNhj1xDMXm z%&MNzsXD%2dCIZ@FA}9d=kXcbp}Ezf+Y;wIxe(iqruS4JH;|sqO{gDnIg49o>FO+1 z?V59KY;F$7-}dGvEZ7}rvZrz9bba029LY_FoLZpXdZZz_aV@R-I{VqjnYuMwwut2H z8|m9E&3b&e=C(9fWu9wkg3}Vi8?8)KTDo3xYpV~u+v+3lI?KGb*yEA)`KxWr0(?e| zZ)3%M<6+k`owNEyz9?+^w$`$$c8dXvs=52rd68;dTXTchU2EEz+f}KsBkiqJt|x@P zcj?nM3-MXb+L4}YZw90zl~f(9b?&G`(d#GPzxAWXhvzIQ2QGm$TtH9%vrUTEvz8Cx z-0&kxcQ9KB8(a+^Y(10Q+xqOAw6$FePgqYs?$p8DR_p`tp_ORG6%&@lWFGmxa$4SV zs~>?&K3v{xuqr4vc<3~_FxJ_I&Fx^Sq^F1diAs}p zuq*nlv(b?mUEVuUvXr5J~ zb*y2P%?!%m&f}`n(M-#L*s7yhnSmx;QOKO-I%+X1Ar)%Tp7Yb}}(pt&m}v$W+x%rn^ilhCo-nPUdXnpCt)&(e1C`{vR=O zs}B3voh?;3tD%{lOe6mk`6Aon{pnB3JDDT?q+(AW$(>A|%y`?<$@pi(w8x6;XeYCv zAlK(RnGTwrZget> zUbkmug0LzkIDMQ|!10+{&*|N;XjP?Y70{`wpg5B+g0WKspIU;qU$go1Z#Eyl^ulNP zIMXBtX*rcxFV6Ufa_vm{t>Vm+vRqr+{fOYdpGWC9Dx8t@*E6%cl>9QOs)LsPsLJ*$ z6T7l{@|;lN;*|8SC3Fq!YE~a*7Hk*Ejl@$@CmW->n$s1?#(}P;0XKw{Tgo@PnIuV0 zZ92W&zIOy?>25XQuzmTX7W^{N+7^259e+*TbNg~R^-yJv4(>)V+`+U^5h|+zczAU@LPn`3?AU0ym{o*0dq*2vxpb-K#(~Y z%sk4j;QWtt&u78z$l(8-ntdBLNx2!a>3W-ax~Dr?aqjU>*&O{}viN7XYJE(D$;8vM zk6A=fqQ>{(p#ri#v;VMfa?DK_>8Z77-Pu0EMfbd0OLrV{Q>P_$oeF z1}1&-=KH6%H|NFDs&P-)puVQb6jG_%*Hp@jIk2w@TYx#cuNkE49equMb!xM|9O)3l zmv7C@Gy2#UI{UF>aJFQ_`WgQa=KDyt)o5!Cq0wUUVg4VkiQ_;0|6kpeC$l|-o#Fp$ zCh+&?jmwz~*szVxPsYwCn6*sUW_5mA+S(5X28VJltKN})wW%AHGwM|K zea#u1&d_t_I(tqrV++vD?k8Axj|_#jRjP5cbUd+W+%ck>3^v~sAo2Et&5?4}*H})z zJ{V$xxii|!chjh#JLmt}eFXk_J9V;Q&G@vIwfiu>h1`*LjKRbDS!ElurFl}t9dGEH z1^YB`#ZWV#5V_ht)U2(<7Y1bXhoRQu-RD}lh97uc(+yDD3=Usz4mDd+csADyxpV7S z@5pegwLKNiLd}cwohpT2#Hud?4i7U2D!EIT`Gwu7wT%9-Fw@?oSIkM7s|IY&N(^TpF5Mk-k|r5A6D8u%)ZwIyT({4 zyt4G`Q2*XHs^igKC^$W)PY=_pIJtJFef#d@-1eMy|M&Zc9Z|0DNJ{4-OONdz{wJ zQmsI?>5TPoQA2jP{Pg-K%uSswPzmJab46u9`btb`2W5ZuyYc8X1w(cPUXFRMVtG5wSg+r z48*G1It0w_TTZiv=S#D&aOU|J@*5LOlW>w>Fu{r<{fwF|GQW153A#8vNT0t)?zj-; z0)_p@40_t~-(8#z@|Wqqf$Q08W&mq+XU;NTX*a2SJY?)SNxIaX`ZcQ&s zu8%A+w8LG_;5^d{M-a|>_~Pqkdl}+)l6TtF9#=q}lom;Ct zT+9ItlfR6a2XC0L8%)!#Nme};y>s^0AvtdA{2|I3oarZ-M&&3%&?FP~Ev9n_mVc6& zSB^1Y-G8ayN#>Vw?jEkbZ<%J%tV*j)HjAQ(`J2hs9sEgGuRp3i&%w7mp6^Ckp*bz| zFD;|{EId3;bGR1;QMJ`{d|9qJ%@?hz6Ja+)TGyr>D*+qsv_oZ zlT8fQ!D**hv+Aj>^_O0Hr&kA02+!B|P8&MYgS`MS+bfW+vjI!-U0%*9#-Es@{=NGD z<%l&r!b@jv%9XQNT2HQY4;(&u=$Bb<{P8xqvgbx8|J?8QR;0Q)d*tvi&}6CPj?DG% z#rHh95oCR1#&LfoW&nFS;ER~@Ue@x2uZ%sbhzOT+B*Q2OtV}9&oCcN2AHA;!*TJK@ zTD!D&>z7--F1m6~@@F5FQX#=r$j_n5?krWtPqj_~{^6Te^(GeE2Z$&w1x*M%a^>w= zC%s-2)Q%|l&2HAsU`LjU_d7S3anRF1o~dQbbkl^STyIV{s}9hVbEfkIGjV-YZ+CR^ zo<1(cWu13%lCq!*+1`kc?D!~tAy4hxVe>zF;p6M+=7!?p&?;3`P6&U-XI6YJz1#X* z--4y-rQy-mQOFYjKqW=Byfx0uS8{7Ug9oPKQ`G)faA9GNf8D@)41`~5wrM`6I zi=5l@Jw2+ku(F!0z3j6?=M2&0kD;@Te%DlqA#*d{HEm*O4c;X^Mc0nmd8XMO<1X&% zH`ClePy5zPtJ-P3jIj)kzaBLIdGmI?w5oBrW}CAdy!`LgjWcD`sOIkFik)p%S0j~1 zv(1xg6t4Abt8gO+f4aZgiDi4KWR^U9ljIdQ+k{o8>iXkD_xDY=3hjIMj$dyzgEhIl zV!KS8Tf5h9xmIeqWN)hzXPdDKI};!NgpJ6ts_@A0(VF1Z^O*KNz$G&-A9U|LW=VsA z+ThuJa>HzMsJgpH@G*R7oz(9^M|baWBYg3plX+I&=VzNnHOTu7JC1}3&EKn#XVsT4 z(ytzBI@O`hpUyV(V49_u{Usu3%_2CheQO{H4o(EXlO z%L}5qHBR2$b0|3srY%+`uE3~#&Y(rU0&!iYez6{&!Jlla@|kny9b>S5VqPf^9^C0`D}K5zP)O(%xpi5 zX6@j5xSVgyBWs#Lo81BC=lX0BFLpMmcmgDNj~(?dO}mY1GP$Vr6<#>gyH~3Z&432< ziO$RnIsM%e<(`=v?muYu%=+$(vd`AI%*+df9j>oIA{*t*L+ z=|^k#^lYUGYeEkHo=PVkh}IX4Pd_$e&ymB)tISw@M*Tgmv21O%xqU_|n(|sVo9FfH z*FO$;YD`;suOTbUA;P+5tTr8fp@N?^aW`@{{ia7#rhj|)?y}crI)T`JjSw@}m?KR| zb^RLao7)~Is;+BUDw>CfoVA+sYWjs;Z`_EhbyRm(N~XHKxW?pZM%V|0RXeR-aO~jR zghHC|s6o|Gnzh!w@=3F>hvPEGPsPQaX!EW${Rr!dSZiKyMz?z#pLvL5$d;BLuXbg+ zgHQWusgKv1TS{d&KK$_!Kla+IgWF#4+;>TYiT8V4G|^>ux6R!s_XM6yj1DcU?g*Kd(?+__cCAx#|4Axg3tgb!DdWb;;YrZKC20?f_kJYU%&(%ia$ zW0hnR(*mwy4&z8)zmNdt-WV1@{3zE%w%-~(bsI}UFN97+j?9(ilr}$AC(0U@PJ;nd`^VGwH zRq^w^Qg7|xZ1uJiHZ0WhsI0ZH3=BSD`)GOMLWwMS>+3*Mj}nrp_Up{rR-_-l&T9Tm zF$=$`@3rMVKJ+9tB^tZVJd=+}`0yu{;h*0x=dMs!W!C*R%84T|cq~4YkLcN@W`^v_ zLNm~DJtw}TlGK_wmTa(mq@91^dST=--YuVC!Q}HvYDS+^R->$jmFi6YTmQa z8rA)a<>|U|X4l3pZ`~d7?Zs{2wKha}Z<945=FE)Q{r#pkfkep7$upNHn{V5=ix-^u zxpk^`4pU<%ZfD4z+H-?&3zZ$Q)5>p)QzMI(2#)UI^3IQJCd)?b{sc;u9l`i-I2>}9~yl-P5M#fXT(l( zsH3~M-vryINt&TCx6|b8#NBBHYCckM{#JoOR&bYz89>0YyUes+m^}91WH5_Z`>E=f zUFJw9cVO9uyR7M~Kw_<8cW>m=(Y#hel&c#qnTd04x|98fPy9>|Q`oCf>klJ>|K}eh zxVG*x{W_E8i$6lJGDvPbx#J1$KmU5c)oqu#h38!V7_DcFc%lh%ZQpIi_Mt@1pC=6H z;?`eR=#Mpm-`Zm}aE(1r%2z#@@Rp}Ip1@1?n5|t1_0m)4`m>Ig{@%g$?PMI;wrWOCyL|VgZA~HR zPTZT-=CgFxA|pb*so-9-sw;gqa<4hxm7>g{|JjODksbG% z(dfbd(ig~FpS@-+KB7kLwQ6M4(#G}TRv-HRTKn#RsE?-qpyt6Gqba^v$M0aGkffMj;&4TX&hSYG2RVN#?AcKlA0_q!mKUag_TF>J;O}~ z1iR>PsC%#GjfADOBrfEN^D;6nJkQEPRD;O*=iN57Xc+G^UH>zAX&1#i|iKd%{Esl}g-QTStN#Tp^}lQ=!bF0^ zqG6zL;9ok1{m5izLG@q>Rv&DmtO28e{so82J{{B(`{a9c=K)4C)sFi_;fYgPrOO{u91* zS^3ZfGG-@KEX;7Zi+))ta(QAvO>8SofFxLv;DF<$d3udgf)cVOfdHA;K6`jWC*~qDmr1rdq4HV?MQ3Y#QWh zHB`l+iCKm^9cv~YYJTkt&L;+lB#d(+_}VkjO4)lOdAb~dSiW4p@L!YFq*y=#IhE`G zDN<20TZD1dAG6dWy4iD?Vxn=zIeS?w%-7?lKhCbRqOzTpZ!;FKa@CyNO6k$K9T|Fs zJjNmX1<+MVfF4Zxy*pdK;zk~v>doHSP-JL-zLO% zZ_D_3J#UYEX%wh{bfB>D2r0=kf}!bk5hX6;(`@QitAt-UI6pU@%n%`}u+X-zqHle@ zhqv&fnK(W8YkOWNp9xUrsO!{Y0$6|z6rk+;(DG(3p@DCvF_62jq|R{XhHN7(KYXa97+eSQue+O#kzSmY11^5Ch=%2 z7nZ0cF?^oO-%gEv+%{t2lG+`LBvLg;OFa;8H}EHiXZ_EIi$SqiW=Jjt`~b!h00D)I zO?7D#KkWK{*~thYcLs3)E%njTf9HFzW!b0fc?*vO<>u0I;3{9_34x4#5Zxlmzhx^U zM2kE+0|;$s9^G1v1TGkecmOkUwQlz888|Ycxe<6r9y!hcE0u?dVYqzfb^P!*0c;DF z`Cw^isSDhjp3fe=wyn*qxok<#qj2CVPeHvQAVNF>OE$6clXJtkt(H%T45C%OxaWL( zW?aKV6_)>Qq!9#&qhNMUJ{2%NwgHlH`Z(gwv8PM^y1*fM{m*5z)IrO_4OJ3%*KqpM zNaKAz`OHKwjt>Oxcb9`wz0y4eA6#f{9#AA8%xeONm;hWhSzDg=nt#oAeQ(h(tDRi+ zfc61bdk%k(p_g}ntO>|T3%o~`9KIyW$cJMAm74_!zXHKW-5M3Ws!!@(L?yxts0D+F z2Lx5c3%uH0}J2RQ&n0oKPoK^e*={f9AdL^xL#2bPAA$dw^hzC#+Pnp{sLsVJaVu%_sNr>o%F( ztIY|c$W`b~rt&J^%7vI)ze`%;_@{F@EskL+x%acD{H5yH-NT>OYPEQ`pTJ;=y!VDt z{v0Tx42h<0+N(>;FRHu45x9I1dWKbcRXx2Ta1V+6LjF$%>1}ib) z8@BiSMnEt#cO1CPSfph;CT{64kp^G&0HhQn`XY+ zAJ7(tdq8q_?#L9)xPA8bRO*d2d1zrW^FGqHOS_GK1{qt*zofT}Gqa|c_X|_(IuFz{ zVS<_Od-1c9_IHbwJ^^2g_D_?-Ih>K}%6n8N0n-O|Ao82X9=euh?Q zfx%0u8*AFWrZd3!q>jzTYWQo>>)Iw_OZ1rZ_C|MHFg|I!mT4QS+UK98}3*U)p zU3cI}e(&gC@*x~-0PGyL9W9?jY~ihAuWWa3&k}`@(!wS@4aof&aymem<5I29)GoI* zV-Em?op=E904+>Q+xi|qtUbQHC2!%UyJzn;v>C`Hs(;YX(M3A95-Kkrm+G4t6VJo9 z^u37_@pt+AmfDrO)>hnuURzM}{<65W!a0TJ8B0|#A9zT|j`)iL|FB!708c{NLm=1t z|MlwDksXz|G?78!u2#S((d~qqR($W&djHmQVl(z;0ZfxV3a3@uxfIn{ij^k;6wAAF zk%|`6(icb-zx`e0XX}L?4#z*s_e&A1nn8-=BP^#QaKNrKi zEOIi%C@g|1B4@r5r8o-VEjgpo-%`vUEcwo4ERl}PFn_v{a@1gQ$+OB?Y!c*Z)svhp&!Kogxgi|c-H*TJC zF%Hu_=XOR2PP{28-4SW5C%mU9R$wWM->}J;E^x#oJ~o3Qeh~ z5>9hLOj0*RxDy6K)416*~IW%RqV#N#Oe;bfI=Eq~1EaQ;-D(FIyJLWv}3(hMG{ASfApDjo} z{Imcct{Ota2GzNslr4yeU#>$>w&1>{M>O@`3P&Ajz;oH(arNi``#ZB9z1WIt2X&f6 zgv3EHTc^zrH1e3JeO*AClFY3Uu?X$>Lsu$U6nDF9GXk^jJ`Kp2kJ_2r2+hWoICrX2 zql46)7JU-tubSD``SLN{Ix(D6Y*~S#y1cl>Dq=JEQ2z0uiI(puV)#@E6=A%ny*66c zBK>h^!14^qeF78Up(;b+{95RyaCB;Aw+bf@MU=P`4`rF(F%hU^tDK2jEfBZh(=bSt zuoUP2z^94Nql8^X9a7F9z`{->YQNze0vznn9MvuV)y#JWb}K0l&1U1aI4Zb#Cb-g;WN6%f@LLV+NFLE3 zUH^RNzke{|%Ap&l)MW0>2ZcX6hp20don(Q{6i@lq-HMn0Y`$D0W&@6v0O8sdN?OC4Hl%>L<6Y<)zBgz)h&#XT1M)w-NeFs@NkSSeGw2(=#Q+D-+0|p{wG{=t zg&(LPl79cePFJI;5MH~bRfjiN8H)fcb^_E+;MMkd;+}I=$4*ytekTyUM;19dKBC%! zHUU>@0Ne@?yic`jUnyl-9X7``;I;pzbPEt#@$ykcM>kDJz?K1Q|0V6)TlmrOvwx)DqAGS6#k8jEhd{id5?}wDX^`Y4P z;HMjYHI?}f&5nn~ti1B*J!FS~1GHIVHfxEuh^!@h%HEH3s~`|yy1jV)=80X#R$(zG zM!*xV^81jIiV4JXuborDoOg;k+ z)4L`49x!r7kq3Yl+>++7FU5?pckaM&>H&n39)S=W>c%s@GRvH(z|18}X$7x7t*HD# z%uuIRR@{lZOR=>)>%S|K8esC^Xyid-8KroNSZp~CS}7f+l%G)9TNi%F%y64(#kuBr z<0x9>;SeSnFKrDt1b@oHqr%W~CqKG<2y-L~ zMJiLH!+4$Ld=9lgj4$PTi-usZ!gS=z%+*n6hi&g8rx+c1wHD(IeLX4Gy7|twvZXO9 zl3G*xVMwGGAedpBV%??It9i4|TC>OSc>r`&>qSSPfO7%BBBsanU;a=w_H-R1z*;#^sJm!{U_X)0p5K~$_QSd8k*7nAEzNOn z3tS~PSHz6d*2Gqf9NtIV9&q)Z7Di_nb+axKhcN3n@D@ZQ9FIbI)GOHqxL;vgSEv6@U-rZ!c@L4W5(FF+iGi`8h4z9Yg}c{LKJ| zFdO&hE%LI~V0P2z5N6~4yhUEY8q7xbImABvcn1r$m7aX?Rrs>`7qwQ~@C{Q{Y$p7y z6m=XcdTo1}dmJ9T+zqtjJCMx@Op?0PEY#IuT`%rH{Qz0aVqDvS{O^L6T1ourZV|(` z3s=pq4s;8&42L_2n5Jt?>o*Mt&rp-su#Z`;XS>pYT>bI+n zv3;3=aC8jI62t07ott|)3R8Oc)2Vb|2y^04)l8`^!vGuGsOm}GRP6wNT5%FXwOm&_ z44tym?ke|*o94~EtY`0zu)`z&5st(xRFpcN!tO8@U=;zjeB;tt-nDrO7y4ms z3N{M)O1!u*5#VyC;cx5Dk)ztSVD=eT$B7NNWnwm8v&f$woq}=1)04iZF{-ux^sm#9 z!!}^B{dclU>lF<;q~pMfuDEpukj`?ok_oEJ^D;1oF@Pq-3t)b zp}I8p0=OyhFFL^f%4eCV>_v>NbT4Xn5gj`8qH!0|_`DZwx(I#$&`WHWmj{*KH2u`T z-$5STvW`VvslRr1Ah}!u=AuBFbP1Th1X2?F9N&lDUqbie`jW$C_We%szYL0h^%G*N z8Tg>t!XACU21Qw$h~M{!z03wZlTHEBVCKaO7HUA>m1hZ`^+G_K^?5&KG0l)31Kzw) zuArAS{pB|Qy!QUe6Vrzn`Npt2146sGKZRXEZ|#EUk1JS>con1DRebi1r(doj;m;O7 zKGzk36|RxH@_LEzXy0CJuWjA!6!O`y^7#}9@5ue{3$K+|gT*wa`1hNn+1`U?AxUX! zgDLeIqy$xYhQG=e!D1l~v~yYN>QbZ!itG0Re579duhaVTEYa zwZ93zL|rYOq41~eHzA!0L#^1a%*SpSy6Be9?_a0!(H9?wL!>UQHrtsBGNzApUby!ubMJ+c;OB;z#Z#Y;5#^__ z1>xj$TNi8cwGtXGjm?cO_aSJxL(`i3*bUWU zZ?WN3rlWe^T_hPOfGU=@91d7Q= zR}Cl7;(T=BIf2siapeE>buu2q#j)LUf{`K7<8;X_>ua($$8opKO)P0R)O-rFmle|xa=ckAllGjk@gM^77SGx*!9jqsVx;o4z=@gZ$nDoa+1_VFjTzMVGi zp66tB2p}zxw+4j%-e^;sg;x-wh#te!I0t34aN0wdI(LQR( zS~1|O-6yW;`CE<3QTWUlo?5AU`44s;H)8Oa;U8|&ziaccO)m}%8WDSF_<|YUxIb29tcV=`sMK8{rVSy~ z^s%l(iGgEAP|RbUbA=Y8$43T_YBXweRB+I6=de)`_AWvicYb`&Dn3T(_hCh;OOj zQG+4|2M-BO&WqRAE=}W0;l8HDLVf9y!C)h3Y%opzN$*IpW%U8clNRdx*_Mfj96dB* zM9}DnD7vyvKdnq;RB-s1!NJbqqo~h%ePx)xk zmrjn~pkHy+qll0`5dvP&U_$sT5DDHf)|?x2e4g`u_rCl7V`(zx7_)!#n`M>g&MzA5 zy4+xC+g8IDc6KxjirJDc6H#%t-aQH?qt zdep}z@>h9H%XrlXnzpa3rm?1Os*oLuFGRbTJIq0l*M0(Lxk(90o`BfNx!O6Ez+3S2 zbY|1E8py>i<^fr7I?xvwADx~u6Ai3^Nb)v7R?rm4j!Xq1Mk{;+iK>A&LLs$*E5NG) z<5E&#x?E&NM0E(QRLfRZmIVlf^`Nr>NuG@Ol-P8wJh&hDJ*RA7W^!smsz=j)0;dII zQc|WRfS*R68_m1FBkPfbfmiUww8BqXM5 zxvCtm9-oquN~frRidpaE#LQgJGGVM|awbzG(LA^g zAf63t(?AZzN8lK(yv_|}e(zA!0>{634*Y^~@}@MBLwz0jI3&J}VSff<8q17t1L+HF zKPyUXA}ja~$O@*Uqy>1QW8$YZl?~eq9i7Q@Hq*4azzN{=mA*h$7z$*EPNG7Vo0LYs z*R;(K$qv2{hybjZw+jjC0KG$?HJ258o#|J9=@VyxbiNEL+NV)&o7S@UtoDKS05wv4 zS1UPCz1v9q6*|Tu?=p~vuLNW%e8xTRv4V5m}3>j&vbWhR@PJ7OJbV`f!B&TO3$7q>u z+2c4MO&kHlw8$IYO%@yo#I(z60i6xm6)qc=6`h!vke;Ev4^GRy-yMr5P28l19D?=T zrOB29+2e&kCR~9G4T1B49HOcyxCU?thK4=~Z4bXw;9 zzA`>KCMAv2XEiuGR0a*;thlW#*$|vg*9FM>zJ$*BGr0)R^e+JEEK>$Z?1_ZrcfgsU zSEQ`Cr7B=bx@U$bIU{{0T!syKbf9cVMp9}bEue$bLbs5Q6+b>m#!pU*j^PgR2RQZI z@WHYI3ur?4K(+YqPS|jWv_K6Y(=Ao$ViE!{!&0=rJ8w5Mf<824n9SE?sN}VVOFjWu z4gQy>AwUZ_N67W>JTlOEjsa-_-;r`Ge?(7M;AGqISiqsP2hqt{NzoZG@%=~1j#Pz( zICNLQnSW4}#563r8Q5aHvj{tqCz+dfca@+kkUjej8Cg-iF{%P!ZE#Oo8kg=_=2#g& zH9a6JIw?`Z&XXDqcQ^!{4XTXvY(N=>YsN|b9FXO<8862^4`_x!_yne8hIK#|Fg??g z$t7+sIKBOg2~y7lX9K+^kG8s&Ztz=kikl z$Yyvq$kc$ugrtNF&1Z_#Sv6bpJUH!l1;|!;kO*#{^%S_>TI{B1O>SN!8o&zLqgFQH z9x7zUC=^8f;RIQ*cNwb-&TjF5!-8I#D!cUzkoml;&fiy!_0y!?1d#ck0-6}Wyw*u_ zo zCqS0B2Ivo*53I)poQGWs_0gls!0Iz(&$EFQz*7{aCZt94eD*Ue#&m&5UkUi}OxdHz zXxYF&Gv(y1i0zFQIyXzk-vrhI{|P!L_g?Vk^$_s7*z4JHJ)Dw|92=0Cs^!gAV>;W) zuGlcw>*1j=4A*OaAU*p}w1@Rv$dT>B={qHHhDUpLu1vQGNEes`WP86xI*#l@HF8cD}I$^upaX|Uc%$00t6hOwh#T%VPie9SR6Gi1|!JpQ>3?DWhpFN9tk?kmkoFdNQ>SD)&w>N zvf{!gB!3Oa_{}JQ4gDVZX{iPaWdl;D#RbGBq-ma6m_fKEsD`Dcr6lp(J#3MzZ(5=! zGYzhy9aRlzwpi}Pen3{}ndON=lot7$KvJCxA5=lig&&G+q#nX zGYViqb)J(Ao(W_H-g9C+I6F`l$OhZ%J9@fF$b2sVYeJv9Lgr6Q$&IyF#vhl#A z*|H=c$7~{yJ*o_(iBr=PQN5=9@VpgNrETth^_;G85+ z0%@>AFU$7$zaoo|=9z6;LWcJi&3j9ghxDv=29U0kr1D2kj)oU&*7YiNawkD!Q?IU- zX_}}!Q(u!t_bxPr8n+cTQ zDVqjB+#7az!*GK0BqvPC(sU{0dG7|i2e0(R%s9q-H;q5n$%b76a$cPPa^lWPO6-6~ z3|hmD);E3)bN6giCb!R{lx6?czonc9$e|erWdGN_E&Df6>0RED@dq}@O?5M{F4F-y z{k-M9pwbKI9IMcGZOqNvH%U&X{^%^7&y${*z!fWdi)@JZ{`o)MH{V4%-s~j0Z zKfOot$)CuvE(BJGJ^;ueZl?4dpThn$T^Iy9S0^BO)6Zm!9|hI`ueM)WsP8_BWx&~! zUl31cx&q|T%>*)k6(D{74${+7XB8d-Qhy&vCw*}r?9a7)Ap};G4dmFtNzy!V*vr6K zf%k4`95@>~6j&bE5oq@a$OcshGJkm$|Jz;}e+tNkd;w&9@|V&XKg@-|7OeqtC>8?Q zAn(Cr7EH;Cyl3`l;B3GIg#&=h?*`Jl+bjL^BhuvUj>;ib2IfCk-S|_o0o%Wo8QXm)$M|KWXO9nobH010)lP6W+#a{o zRP8CGqtiX}z3jR7aGjKpjFUuqhP;)>_*Xt73wm573_U9?@;Z>-Jso;Ap!d1iNN^5S zS6~C+L{!At;Cn%?^oP&Oo?ihz1ijNmS^nQ2&v2cYoQnf&k|!YJiU7p3T_MxL&e0IS7e1HK>EfHKw4-FkPX~6Ne)r@A7%WtAEf>jFqdN! z{fj)-zx$KyNf>xj=r8>$XNA8iVBsIql<~kOi0^$@-ah;Sq*wQc&I;Qq^v2f#=j=LK ztZA)*bN-aK8*WX{wa4&BO}Fnm_5)dPLx-+41OBS(_I=4t=1ZqzIe^to|AM2C(Aqn)V2APzBxYVNpfhzIA^A$owflmY0R}Y{({F=)^HfZwX`rf4e2q zmt5CupE(51dUB6Lph@0^V0$|%4gi1drfk4t(Al%x+PW4991qSO#lcrtu}kr4Ko+=I zl{X3420R?t2zUh+Vuw;tE-g?5j)vyu)mIrT2(-X2D3}R5KJa0e zZm-l;fpx)u@1onQLQHx(Uvz0b19dxnN1z|#9Z1Lg1CgH%xHA!xH5Y;F2+))<@px&3 z_aN9bV>#H3g5}Vx2eNM0FgJnxZl*G)45e@+A!$8&?A7fz;h^o4Veq%m`+K@ z)3l7VXz%?G_ogWciJp_;GN1R1pMv!Ci7Bc96MINYj10v>N|Ovg1T7HTQ}#G1wsQar zx(?2U4eTWw5DcX0Mnh+VLV#RIgOHz2)ly+*B2JMh%0!j~;QxuuCr- zDYHcYY43NCoC634iQ}8ySHWq=#|K$oHfo+*>JfoGjQ*o#_Buc&s|@7uI>yT3{rj_# z<*N8vFoY3nkeIA(y~&qWb)Z}ng{Pi79bt1ICGM$;NNe$;GfZPw%ubA z(FNq2iux*W4LKjJGNj4_xc6z$hRL#`R}}uIr$9}fluJNrrd-tf#L9;J{b>-N0neUaG}UPt^X?)bu`M7$HrU7ZZ(t;yv29c-etXK>AO5dYbJD z1Hd^$gMoCI0AM9x1Ep65+V78bmEcyK9HYBaWkT-_cz;!)3&=%lW=it3XqYfS=^GQ} z8OjfwGtm3+=GkOviIh}4?8h|}oI@O!A{&$xot8U|Gp7e4XqtzBT)wLV+43?dkS$hs z?s-2AlxLyLOs)txGp9-J^^FSPw7`$kWjT+h%ltDGeh;0#G(1DjjiedYFHIZfo>0ZU z3Z$X_rxV)y+@tmk=_#qnarWw55uDZheIR$MdhX6r1C^S{CztXyEMApqTabWuxRxac zLV(k!@nVVH)w~(K=Z0sqWqN$f5s;damf=ZBwA0OpPP?T5x#Z14IkYS0itQPEkU1kd zQA+*Gd-~tI1O1B$Og4Su`I9&)?6+sPXQS}2go(4HjuOY_FTCZ z@5qz!-gFzlneQUvnf{Y}*+3lsv z8o$?gan$z*6b2O!+>%=Zh7${p7#by5USX|6@VjosCNlTZg)| zjM!P}()vD|V{e>jcEJDfh#$LsY;E5d9qw~_R_pKU&Dps-d0ObR3#Nbd?WbP-V&lG( zpYQR;z|$2jO&j^Pb8r5P14pZW)NPG5sYUJ0c`Z`QzH&RD+`FBR>(=*O8gF*GCiz*j zA|_csM?^T@)~tfQZr#Va(>Kg9O1FagxgAgIRyN?EZWZ)%>%P{Veqnkqt84!-$8?94 z-QR7lamdr5!wR43GVg$Og8_6ayr0YLT1Lb9&}Q!i`hWzA!Z_eJkrkbHK{kECh^wlWoa!TE#=$rW;@wd_%&^dC$K~=?@i4dE#OgXc%<)tOD|@)x z@l^$@V7S}pg6Y^vltjXm2zB>X=-5!v%7)#pLJYEUB7@C`Fx_Ydo#i_w_*y|D-Ht+E zD|@8daA5{SS%paTG(rPpJEyvglVI(voYk<)s4#OZ=8J6?D}1EOvA(iZJj!jJgUDhv zD|~=UZ(wCbg_+S<;b!R zHr}j(a;?y*!R9H1+9HwD9{ZYD_F11C*oc}|aX+{3a)`WL(y<6swDP0dSU(>yoe(*| z4y!2A<=YdhSFlP_2}9DxYS-7Pud?n;2s2M0j)sO!*T7?Os8t?2++{8TqgzQgDFBlx z^=Dk>?}|ygcfe6m4R~LdnFz))LB3Hg^PplrR?+!DXI&ZPu<|2aW-u6w^r4>^GZ|;) zj0`q6BE*i$0#1X4fmN{b6I^D)deUxXtfDxVITDNpGT2ea}a={jlE$oL^N!m%lr(iht2eLfzHNWk{|7Iq%^j&C%YXV zH?|4@6`NSafSe{)P>kES)n2RC`{C}8Qv1#Z^GPW zRzWO^Y-Sb5x{aC-(eF#p(2)rBLMk6iALKIkfT>x4)#(lxrytroIMC@YZ?en4gIvZl zV1uokNx`NcZa71b2qQ7xWk!P0NEp5TE>nQ9I9LaT?+2rkp}jC**%nqooZB3N`&ec- z>?Ete0>My8Uzg)_3oAR`ZGPTLJ|OY4$J5nX)54LYhR{7&4_jM732w)_)>d|c+brKk z7FO0?^0OQmuN1rwd!6K}}^C5aWD?8b3bVgJs+Y1s93PQRv^gzeE z?W~{_x9Qj3J1A(f5ee3liH&6l1#(?8_aVfF+YV}!L;pf-f9S!GY|^Sgry_Qv&0}B# z?3!#lbi61ua&YOs-k&|oWcOt85dA$A)M1|M_;S=lq(W>46UeTFUI z1$kiIt(^2=b3Z~ftq;e{FyOl$D>OaWF*VpKnCUhzKu~pKWvLZn1@+Y{=(_pel47$TF%nHhOn**`5 z-M5$VJeb=y&+#y;INNQcVEu`*LNkILpLVmdXS#iK;Y@S@A$9=vz-%IFI1D87{}?-K~N-ZnF~>BxMPBX=)EED97#C+{4NS7(K0m9Jet52A*J*WCR;; zAk^Cq{cMMF1_v8mu$J`Y=$p9+aox4IB4Z=iBes8BMyS7?q9a_NvkZQ)CC~}No?{Py z^KSr?6C-?_%V^uj>%VDs28G@6+iBFq}yP;kKyZK=PVcL9lfYXt9YK4jUYGjLTdCCOb}-`V@=>$yLR` z{=)&r>V>sz5SW}VWd8zVKDn|T1%s>QHL!}txy;r>WJ;&)JIP=iIeTK5uYqw7wCA&V z5sa(6ozL;`P%C?p+nk2BO4loz>@wGY$+710`V|-(foca}8V$3u7rPzfhgk)S-R6tK zGz~Krh2@WPIhqZ(f}V7n(}&9=NDcdhupJCtME~+}yly%I>yTt{qnQYf21CnmSUCj7 zbC4{o;Yh1siQAkwQZ5MgImlcE*3QnrDRK;q#=_Q?>@us3lASJNuM(rddh%RgtU@T< z9^Bs%>S2|<9pa3VyScR8OJM9oRd&!k4#pJ-YbsbxG>@jRcU4EkXscjDm=hYu0ZRhT z-h04gdaPKc|CswDjU_1yOrDevBg7HWMUfK+&9O2M8jd`Zz+846`h1rmz`9x`u~>u< z!XAZfq2@Sy(oDc{fFY!{$I{qn>pc8iLx`=AV;nU8{`8#cG8cley)y1&FqVK_9@DP+ z1lEBGYYs+;JuPcb@JGSqn#Kd*ai&5X?gl0z&qS1GpP~jLM7NP8uK|PG)05FF-)PyZ z2K0GjEm(W2F?y*(sGwOB0ORw4Gt@d%*+ zRL_aD1MGfTj(m@mz0z%d;qf{)cks$n?%N$K5{xUX^n%yHx`WvZobf9d?(uMs^GKX* zFvbc#8V^S6VLf@q<=BKrk1x2*A0cAZR8y*FyjA>bm^0q%%a|ZN#1T?GMhPIo$trJ3x*Y4<+}rh9?8AK(K^*C zSnW36O2v`d-uQf`TS05w#`NjQG3!fE#Hpnovvw*TO~;J z8A36(7Lb8)rRI1#!wP!EZQO-0%FaJ5(<*@QQ6}wD_(F(thTO;HwlojSjdo!P80j)U zRtzHtAJ%8yw+M{x0+angUyZq7SmfUb(Pvr(Yu#quS@LKu&wVq%um-}iTy$z@Ne_^A zj#3OaUx-@)HWDfA`*5>Nws#N6AL%kikXbp=!RA(k=tJ_#Dm?RXU0Y{tK^js=cBUl z^7eW>0W8cej(g@hFl9kB>LOU={lYswrfJx}luyqGlZ|4<$H02prEnbTJzi>QF=vCZ z!DU5J9M*EMzdHIen6w}AIl9cVir;aYIrHQlD~@t-lJ#KB4u)0h9N1s|?J?iGPH+mY z1si2I5X@2a2`l?uw=wAndoI5l?D*;ltN2~FqwxYOXtUc)S>Vme_MZal=54>xav`i> z-y}~#sEb`Wz2jeC+)m})@poWhR^ihj&P6hjeP}nvgJHaJIA4hnT?-?H&3iwX3rsGb zA&WI_?0qJ{{xbA=Fy@oT+(}Q$Ro>n-jJLqLSS4`W^9XT^l#{Oh67NErzcOp#v8?s9chGnrF%=9q ziP%&(AoSPN=(AM1glSK##bBJautgN^3%~|Swk^=P%sVq#xCe|QArCNX!J@!0qv4$; zU|cWco;&OrSpil8_^JR4K^!LCV>pDVIP5#Pi>zf?1s~$x-16=mJVty3#ti5$T((#- zX^Sq;%FPWAS)K`Wf-s>>vkJg3&OB&^t@U)*>7Hqxo{_+vp@Fc(h_2M3EaQpOZz( ze$4~xiF{>5(Qw@LKW7!}aGQpZi!A)e<1z<;@gOLVSp{Gn@3U)QoJ8n)hRbZZLYk$D zRn*sIegeiJwvX@*=SnNP2+vDbdRJ%;+4ErXsPH*LBam1+Wx(^YlIpe#^msv@Y2+UI z^b1z;F1Pt1M9#ko_O^LPC9#j#Mz4R_$9Z@{CPH*T`=nuP1nX^k$gd39I-23=y2{GN zQ^I+xyn7Pcb`Y$aDD>zd`ioZf9z11wQT9i!rXPagocd{q^Cjsg_M=g=8(3QutXn*g zCxg+Iak9cVYyjhkVT|Bk-+{@d+2_^O-ZKG@?)|_R2h)uSbgC$fMy$(xA1vOkfR5O3 zjchWu7O*t15W51-mAAm?>1x|~S=vj^-kxAXZA(0dkX+T+sMBDy3;GCG?)Zvy4!g(Z zOfWVIV~tb$+hF!=7WwVrRA8(b8z_#}{;zu109x1cs#UPxZN3bV8RY%aw_ses&>Wm* zE3QS+_Ab~HA=(Jm9Oo)CW348F%j<3@)b3E_-PLbktPJ-|cpTd9HCb+TD?BmK3Buz6 zTm?65yTQ0^?^_A8bY=#5Q3`+#Tqo z3?iS_A9=$nIE>l%rYu~}o3J;npfBBy%r~vI5Alg?+2##``k`KH>qB4$2N%U^F)tiVp&vARH69@K$>TRpwh})R*HipZ}nGo#Q{I(Tz)NTF(p{HyR&OANep&fJ9 zhd2=!4%s2{2f~NIMuJIi>#*s*x1qwRV63nbd+K<7lU01oZQg;XO2uu*z;{_{VH}== zAr!@8?Rj<;j4Mk;J8PNute_JZt1Z%nFji*+`SmgV3FeyNGHbl=-CK)bu3lg&E*a0E z$?Q9*LWKGu59axYE=ReoR`y9e_TGw5qHK|~aXVNSFq{`~q`1D7Z`aHg+hm(@(!CMr z1W_q4U*7~{RhZ`(wM$?eL(C`~0PAh1iFqS10--?YzE*e|9!Y@7^|uKAz86e-IOl)a z0y+QXP7(#i(oyl!Kqm-C8cjpCgJ5!%VzYfe@H!~Ry$4utnGKCvsN(E5C*}??Hqo^7 zi7xXl*g!ia=8Dpax=77cVjvj9^g$4cC0V7 ziqGI44FW5{jRG3i_#>Ive$;KGf(^1?7w-7TDn9FW`0cQQ&f&S^4%r2`E;hq#uwEzu zdjOW?lVEHLyzG-e=T7f($DKPBEX+>G#p7)-`VA6J3e=0N;`4YyQY5E19JUK~%OcyC zZb4*;C?B^gu3eI0Mxk?$D`t1j+zr-U7Ky%;{TPq*z%b8|auC>1n{jph5NwQOF#F)$ zatFrpcL<}rN1oV_54&^vC-;{qjQL@(!FCPoP?JyP{K9bIQF10&Kl>@^X9&6Z@W62H zKM77uNIA^5b+uZ1sq36&Is;c zO+PP{*cb=qwu^fnp#eOU8W#~7X=@<|7%GVh@j+mKEq#a3I2LOJePKU^Md%rXaO-n6 z*f@_6Zj14NrS(C&3tk79lM(u>`VC;5Sy%!vlxM+ccR1W+m+{acPGUZ_pM=nG`;Mlzr zp#dyZ=uP!NpRf3Q7mYTjA{1rk#C&t?`pPP};Wqz-$Q7=#6^<5!d@apa#Xi8z0F!>h zGwZhdjJK}EV0I<;t#j`qa(TfRA>|@4=EGi-7e*p;(kHx6oGS zyoUw4)J(7rcD*=8I@X`FvhTT#a_9NP29|OpoVSW0gj`@*CHI1jr3m3I1VTp)$p@uMF_0nmK(7kpNSRGP@gD^MRWm?Asa(d}1} zZ6Muyzls8&QTaD}isMb1_(KGhMa;Kg7w!zGWVC<4S_J=!kEm?#*@EHk0bG^FhDx=#*hSx`7 zqX6q*cj9$~!jKB5aoo^d1d9PHFZ5nGuKDQptjFXV6zBsof$z$Ua|k8c4IE^k3OjTF zp;S8*TGku89-$0TSQU@7%AtvN>=OvV(a^bCPFC(u@~pzu!NwhgX7CB8ajK%Ojpe&WBhZ(nvBj?;lx^i8 z)VPwjol6m#Vwd+jLK%E(X-uum{xEbIA=%=gRZy}BZHd|tlIcSHbZvp1ZZ|@*l-5;s zZINBudkD$4*RLjutD@~sRnxUJyDqJ|iZkL7nlB3dQ7%G@?9yh{(D`%~*7*jZskYX$ zrq`bDAT)t5Cyh$AbZw3uy9l97`^oH|2<6#%x8jcyEV_-+uMRE1{%k`i&Q8~;uGhv( z5Sl7-s-Oi3$q|jIr)#rBXm#8Y*AoS`(DvZ^v@FZmgixw&?IsPp{jm^Av}6B7Ncuuf zL*`&F>NL{%a2a`DL1?rcx{J``qNJ)GY~(dogW>qOvB<8A$|f~I<3wQvG>IV=(lV;4 zuC0MjmcxXp!C9lO5a{)xH+@%1YKS#rNDGk-G@fgL=_+#Sq5Pi^{A+V-*HV^`hdpsFBNnWk$Z3MP zicn8k9G1W{VE9H3n?tQu-cTe$_H#mG@%_*~gzS^FskfHR!LEQ6I2bGhrD0+EG0+Lp z9Yn6YN5Hr>;RP8M^a^csp0Wl68$%GnDeJ8e9|VTl4#3b9+ugz+W-?B$ClIn7*}TIL z3Myymf4Yom0d(e^y0FlV01joCPg`A^WalYDNIHMVN4&1L2BBEnZH#taXPJ!<(}nmT zFh>@a&|U;Jhe1!ZN1QDggF1LK>_O;J5!xJ{)Tg74lL}q#Dnil?<2$jKQ2G)=v36VH z@W&T+tISUkibwl#n~g7k9_b8MMIGd1NBFs-c@9` zL9Wywynjk*VeNoqw z=C$?pDxO=<31Uuz$TNbxb6y2DST<*Jpi@P4u!`om9G``X;sCU`rCYa8pY~G}M}}Ku zw}rY6D*XukcqY&X#6HZJwZr6Wg0tbN$*eGu{fO=^vpr0=g2#lKcM!`=xJSf&=Of)@ zTC@buhbDq`w+}ySx`~2zFxlyDqL|n(Tm-d8m9Ky6Ui>el>wrl zD;k-KzenM+iN`Cr`QHTA0}LlIobG=E>kNkb9K5#bF;El)A; zW5HOctomPIJj9_xaGzo@x{r(t879XRHSi(Bzp-s#vP{O^0Fx(R+)kSQ!|&HVBG9P_ zrUYIVELTiEuRH+eMs@NaS7C&A^I@aIzFv9wD;3!EQ&P(xa6{s*IF1NyCo? zvnQo(E@K(!!}guUUW5kPAJ^3!g=Sl!%(2{E`)4%<3ofp<;LsQ2a%yh_;@tQz6;JlNcsvNoqtSSb_1)~ zpJ37h&<;n(38FXx^ZJbmBB(E#e13v#2~OFYaql=$nh^|L9tTFl!3kh03yem^z0_fs zc>qkds0jCWe}b`ha0#%^lccZ0<6)}#U~C(P6RYFrU^qeGPR$YRZ6(@exWTYLp|2ST zv1Cj+Jj;0vjE0ua>wX1eS(pWAU)Ra9?b1o7gUP|8y|;kL){Jc-nIsOg4f~PW?P+uDuA4 zLg@bLZ>$8v@d%GK4kN^y9CY@q%Z!<#+iyql90s>M&x5gHc+igp;7c%iIE)IjRE?8y zayjS+CjDK{4|IaC)kui1CwGFm!0@#Ek3gSzwuc|?e29?rUk+F?7>}CrW7yUS_fG=- zTt*t0{pF1DAwu@UB}1FajfsO5fe_1)GiE-RvJ5_)-V4^ruC4qu*-LCeaEQKOOoayG z@$6zSHdnry`4o(+IGhDH`8^YL`+c8}$S;Fcb|$DjhwKHbVv=q@1HtlzDOi*wibukq zNbr5^0c%g~vW+ z8?gwE7KH}R&xHtbKrkOrcGcfo6*Ht|Ms69MHl_{L!)7z>bV#w{>9pS_P7 z9kapgv(YQrB6~6_{}KvE0#gtZvdV0)1?^40Cny&qIKb&ZACN$SzaI^8B1BVSRHIyu zpJ$8W7?jj$jy#pyV{I-1n`EcqqHz_BerdmEFv4@V5^|ExM2H4)h@vhSvGt%dwp_M; z0ORU_LGSM>(`>GN3NoVSa)#4AUPma*$|(wVbjlS$acIKIT)7m$zId{H2n?Su;m@6F zy~{Iw zeR6AS_8+}#KEV3;!6Bc2lWt$7kv9XamHtm?Anp+r|G$B`c9wt2zzShv`znoPpmf9! z3NsbX0J8I0_+eXS^G_*xAz)ws z4f(+1QI+n$AuE0iKNa!wG=A7I3qRDK#SgE)P}Xk?Y|(Rev_xin9zU#jjnawa>+r(@ z*W-s5krsH11Q(G##S2^eA~OBE_+h%O_~Esc_0wd9WVncI$PWB4!%qD0+G+p(zl-c( z?r!{Ig`cPjh^+Wi#fjv56(^eb!OI}~`X^-iFI7B|{44yho+AqJl7&~U#sE$7t->=v zW;m4_r$0H%TfdMN1ACcq#PZ2Dj9WoL-s)9Nx?5qkTvd1pP{|Olth+ph6o=eyl zk-;$hvi+X{3f=IF1$HO-8&dD7^wLNjH}Q792o+x%ISq$H=MawumIvazYhS=zyN5Vt z+Sh+WCc(MVZYYk9c7-_X+4*rQvpG&sHpf}UPKVQqeU(N^IF;D(nfOm)*cVP4c1G;& z_Ej1=O|V(o7m+>2K4)L0kwb<3%D#w|5n8JFe?+do%xD2QMk|5L^Sr_rfHd7|#n&(r z7m*EH3uOLvO8?(Mb|m)=WaM;tR~1ki*`RIEnXo{`6Y2FuiW3>!rT9M~qdr#Yb}QTi zLG_u0|N+*&ZP$3;3|>%pQQ;+uxQIR?G+nP{d(4lZw9YRox-_!b-=H(;{VDuT$MkK#lQQw1O^^aIjQs;l__3DUo6BR#X!Rr%^V(0^83 zPYFZ@8{il9hDtAulo~6Y$aGB7d`oUa2}-Z~Xu8f!xTNa@7t;9sirUn%@r#g|6bcN{wLTe=7@1Z+c`Q5nwyX`t&s z{HxvIFNF;Ls`Q%*Zz<$|@Bsg6e<&CNVf)oZT3{ml=k@?)viQRx4 z!oDgUk--6qdoh;*RuHLhAdqQ>@RvdchbvCx*hK+Z(HO-i0O>oiK$hoGI0eXy$n^0* zrc0Lbxmt=!K%^5rrZ|x%TA(=EWNBf#O8QF9NcF#R{KPxCF@bOBGs5e-_BI%}YQ|rq_VHh)loU2jj#7-+(}TQzaml z6``xKRZ)Id$)(W``p3}Ou01NgG*bUm=|tA|nZg4~|0iU9U#NJXJk1CPKq=;^!aub=nDUi*3NO6A^Ph@;^AbO^?R=kahFOAF} zpyJ!Acp~+7hO&2i74c8VhILZ$rIAxVR23Aa;)!fnH^qspsJqg80IPwI1Tz0b0~3Nh zh=IV1NFE1d#Z#3|Bu@gi0zL<1y61uTS9=M+Sn+CwYZSf=WCLDRd@Ya{kq+=?t_o}d zGVXo+Vny2(eyDJV!d(jY09o*-KsIDQkQb5sAdn3@r0}qcCo&kOlmx^y>mX-w~POAXq zDXp&Jjewk6&4JukIsjQf7a%JL1oHYPWVu}tPYhBRtS|&f|I@+|V1d09_O&DMY2&6tq=|oy4MsZ?QF36b(umM>rqBOFAY^4)vpb4Bs01?=pABSuK9CoY1wW>EX=H;QS9)or zK2PaH^7%k}h;minNgxY;O5sw4&nSEr$P5C=0#+#fd4>N{@h_?P)k=RENDIHN_XVtJ3+OoFjKD>;_~*!&Q7wAS;eg@%@}Q|1d#+ z2-U@sdFtld14?;{!Z;wW(#ZID=rnUOkoBgjbfuB)O^43(845F1`k5*{k@2%=5MBt_ z9i6Qr=BR{3Cd^Ts$Ob$Hq(K${*}*4)toUigEybTxxDtrL)K&x8@Rt?7>QpoA4JB+) z_!f`_ZUVBxt%?^YECjLvyMQcspVB`EvVt#wY}l8Ie+^_ujwpT%$m;xAk$q`=`X4DSAm>CzX9>Db{D^xu0-KIinzR(>kX7fZg9TvTsEKzJy;=o zR#kB#3$6yF1?nojG%}w5ds1Gdk$QcZKUZsj08QKsNRzct8HlWq|KC$yrI7`+R`Cz3 zcp~)xAj{+b*_HV_E4_>2fk0joG5-H9{5$8Ptw>~`B?haErIFHTrT-sc)ZYr=E7?p{ zAdya%t$1l10R0oC6WP>{}Zy@ zDyn=xg;iDhs=3}kDP#+)gA;2ioyfV_K=IPZ3K}ZCG*WK_o#iwEk~am?5nCvp+foHu z0eO{1W^AK$B753aaUu(RMCl!rPUKVRo+`eV!rlt|0C^FSKUa%T5q%Z*QwfM{zyO5< zl}=>EgA@)1vSGtiJdu2)iXR2!vx3Qr#{hW|?I*?_1n7;^Yyr1kDglvBG+pu1NIere z8!`jPp~+F{N+TPRr*tAa^r+%C(*GD>!g(r!NWK8b3Kjx6W>2YjB73wFNa+>)V*1yB zO#eE?{}*Jsbx3FXKLfmo?AZpziM$iqrZ|xqw<}I$k3LYG$Yc0kAk*zrI+6S{Ak%-Y zbfBDnr36IF1Wfn^64JCsR0bjoI;uF4{FuVyN++@--vViw(@Ot;BI;+tb4b7nFQ|m2 zk@_X*tmv|eN6>z^!uKo8|9|}X4g1freFQ(e{%;@~TKcmamP<}cbi@ziJK={{t~Wqr zL+qD?3YqXfe}98WT)`4-Y=m&>&u$n+P7B(f-vIG#xqT@Vjh5=hgAa1>9gds{4?f6w z@Ij9HLI=kmHCO%{wn3Vvn5bMPAAFGW;Da1~n8SrWpNqFb-UR-~4{=nwrF=loj1NA@ zdGJ9F+~C0nIs7n(ljFe$IWPpjrFif`&Vvtf9(<7V;Dek8ALRVE4|KR?Joq4o4@Gc2 z_#g*{XbwYE;IkEleAws*&c`ATKFFa}@NJ&5Pif@cNa+u8n2wwe`5%0c^WcM=fBF!I zK0=+V@PiL>9(<7V;Dek8ALQ5@?Sl_;)Mq0PKFE3SLC%8@avpq;!;@0!4|sT2^5BD< z2Os1-_#o%O2RWs`(BV2^b3U&4|Nny=e4z5b{Xvdsuvt$Pq3`Ma#qrI$uUL+dUPhdG zPah=~ya%Dz76^t|wgp1q76>;f;J@ejK7`8@*1iwH6gMcWcpt)utq>}RHCrJ>Y=vNK zgWxNMY=dx{!WIgZg}xoax@{0V+adUgO%$TGL#R;zp_+&;fZ!~Eu!lko;r9WAZ4@#; zfKW>mQHcKlg8zpQ>WJwdLa6;Agd-H{i6(^*_EMNv2%&*EOkq|bgw7v9Xe9DKg3$6K z2p1?c5$$(CI8I^t4hYS}843$_Kl=r1fi9yCJOm7=mXvg!W<+g{a*SYV3i~QAF>7 z;M@aY4~5Rc?-K~yC}e&D!6k|)#D4<8|5FHE#q>`h)czF05emVg$zBM1Da_joAygcu zFl#S_&if#QiTr&KTJD2zfkL=w{~3hi6qbJmp@%p_VZmn*dhLhMODx+DA#gv0n-uzp z@XsM!rm*&N2z|v33M)Q`Fya7&{$kAm2oVP$7+*k$6hpp%aGSyw3WJ1x5W>1IAb1W! z7$P=Nh&l+N#v#3br20cVdz$%NetE)KeOlbY=;v?#Yw&_w*PC?PJomN5(W57vKmYNY ztKxopc;eklwOWrn(|qIlT|3XeHSGH;HS?b9aXr(h^332*&c>`3B?tA|x#@Gh*|#HX znP>gJJu4pj;^6fmo%@gMf90bEEoz;-@W+osD>OPB@Z|6*k3HV`*pnSwWwf3+I(z+= zgWFclX}&lhZEf~4HbvL&Rpu+;5q7)eFCVdb^-rA=7S}rY=)Bd>Y@dDYxX;tO2YqxxLQx@VKP2)-Ly?Y0u$*FfqT=k`Jx%vmaj7>6X}d2+e!E zXTVn%`}>ZlIPcNe=3f&1P}`1XT= ztIYz(FW0g$>exHf)hxOV6){Uxl zI4yQY<)_QdiSaDkvGdip1`WFuo|tw0{E>bgDz13+)XBy>F4tdCb=c3%XZu&$|J?S* zt-h~l*1hul2CcdO-YkBQnqbw{3s?Qw<-UG4{<@8aMx}$(kw?ZVYaCso>(xvfn*-$FE=W&wmO1 zDlGaP-x2RzKb81ss|u_3{Zetj%}SN#FKM=+S=ioE<$Ax(qfvcgTRr7}@{6c;QO(Eg zTs_)x$Jd=S;PI{jp7+aVw)1p4Rs2M~OJf(G46jooa@owU%P;8COJ8)x-C*I6dp~%p zwrx;#V~|Mt3WM#}WX7opRa+*n9noZE{$mNrd!Kjo8I$tbq~KcHzj^Uq>lQP|&fc0* zeb$IuxvwORU-8|!ey5zf%FfzhRiBwWuj-NA{Pf9d&53N6x_o?2yjv;QcWh z;<6qSk4`G?9@4qPp`oLa7S|p0uj8MzADGs2d!17cm8q6Ja@m-guVx-eNu3s5c25`&N@d%hka8AMjq{%-S}Tm> zmk#T%i<~1c#O>z?dDa(xy!59Q89~=tZ)i7da{V>F5xYmcQg7$RUq-iy%r$=5-Svaf zR~PM@_G`fEm?8JJe*Wl-b56f^`|F>Z57HjFiO7g3_tm3$4cnIO6XIF$&60=0qoQUt z*`NJojtDr4=Kb;3!LJj{UK<8ie&w?^;Q_w|rgm%ec3t0t9bbBWYH_Rb&kZ{oRkGyj zOCPPM_OS8zhU0hFm5+VKbK!%Vjju0kK5yMa{4c3_n-^EQc@wOd%aaZrICiwS@VOV~ z-dNbU!L^RAr@OYVliGXWkwx46uOF*X67>23AVF=Si5$9LLaR~ljLP!$Rzl3m`!VwB7qRCef z)}4Sb?<)w?#bF9j-$3a6HH37L|1|{XNeCAxWQz7jAZ(+s{0M}Z;tYlOZz1$L3L#4@ zI|`xpDF`D{j2?)n2Y@zU& z(7%DO;Cl$3Zy?MQn!gW!J( z!V)q46olIpj!<}7H2Ds~y7Lg`eFtHgI7}hx0))<|Ay^{+Gz8~G2p1?U7wx}?u#Lj< z?;!|rhC=)$2))igSSgmBfl&K0gqsvz5aDMb?4_{wEQD3!28CHyAdEN%;U%%=9E6rv zAsFW&tPw-bLpV-h3x!vNegVRQA0T)xKv*j_Q3(7ILXC?MUKi09AzY@ghr)W{cL~CZ zYY;LoL3mRXQHb~ng8yX*8^!d?5N=aALg8)EshC=)=5PJOxVY^uNBZS(&Lbyrc0}*}=!d?n%uR$mj zHz>^d4Z?_@AnXupeuB{QCIsU;gd#EII)vjCwov$3=s!bP@H+(0&k**AO%wueL8x&9 z!lxqo287EL_E6X-{CfLUm)xkMHC|LK=A(+!T~Y;R|vN$9HDSfH2Dp}x?%|P zeuHpW9HtQU2ZYWyA$%qBZ$fb1g>Zqw5z+p42-_$u{~f|HafU*C34~s^Ae<1(Zb7Jh z55i3fCq?*e2zx24y$#`%xItmopAbgefpA)^xucI--qHbc6oa1;LyEzVgKr@}C-gs% zVSx_8^9O_rViScx2ZS1TAzTvCcOhJ+u!q7G;a37-MHvX0B@liPMHC`@Ao$;da7|3V z2jMn_BNVQSCVxU$XF!{Yrhh8oCO(?#)NHd|_rgDTzWnDBa4`p2yDD%og@zceZRHFQ#bgqB~ zR}=Xa&|qg(2p1^S5bY~M*hXP_MF_RT84B^$AoTKuP)98Dg;2XXgqsxViSSAg_EK0| z2|@#LgTkyD5Jpsn&`7MQ454LB2u2kMO~jBY5ROyWLZO+^{U9u;1;OJ7!C!2m5Lg>R zjj9k@i0G;iE>qY;p_TBf24O`V2$|I&v=K!VBI-i$uMQzVOs@{%HiaV;9uZAyKv-7~ z!n_&~+Ka;!qUuBFToXb^kzW&nvjKz)6grFcwIFPxu)G!ompDTqz9EEOwIOsBS87A3 z-3UTt9SFfkna88weZyAxso^D71VS!uaM8 zqQ&~=5ROyuZ2=)hjBWv8K>&n83Las$gb>&kLQ+czabi1#%M=>4f{-8*T0vOx2!sO^ zrinVOAw;x;kkcAMlGsP#HidvT5K=@|8wl&#LpViYx@h$mOKn0U7Voc>pafL$d&JZFWfiPRFd<4Q?3MCYBMBjE0W_5wE zu^oh5afd=n7liTcA>@no?I9ee;M)PhV`6j%2nzxs6jGQc%#IKOyFy6n2;m8_ox)`b z4LU(sC=xnBSP=x_0ENY(PG<-a!4Pt|JT4LYDBPwH&;`QNBC898bs-Q=QCKEgxgbP^ zLRjL0V2KkHoNfrAfe@C9g@F*ZQMg7yh^}2B#D_sx)fK`@afL$dZV)1aAiN+}20_?M zp@hOJ(HH+?doe2T4A~& z1oniG5JG!E*diA8fUu3iH40lr*PamK`$1UM6T)_J zg+gsC;UcmZgb&2ZUJ&+DD4|d&`u2t}YXF3ey&>!ncPO-sgfPAjgd(xN4}{|sd?O%y zEJjB_STGPmA%#7{>$28A|XT#gRmqL!dK!11?O-Gp#vct5eo-G*hb+R zg=3=YAPDgzAgme$;e@zCq4r1!k%J+e6e|Zq*h`^=!YR>r2!vUqAZ#20;k39zp=A_= z@k1e;5$lISI8MQL7=&|T^e_kuMnfp1a6y>EAq0+rkTe{^C9$2tWeN>OK)50jMnG6G z7Qz7vKZrUbAw-OWkTVj(HL;JvZ3+RSAY2z&qadss58)Jr8=_Sdgs2G+mPA4LRh*#U zoCqOwG=!UC;b;ikC|sj(OLQFrA$}5sRbwFB5mzYGj)o997Q!E5J5|jsG|m-w9C4IK-FRBM+ORjah6v_?@a+VXq8?tQ;2^{LPI_x=0#yAMz2ykBR}_c`ajbKfXg z9Hv(%lm*>Tj!MbqFooh#V!NY^j7Q1gFo&c(kW#TTN-hV#7>|eaX5xAvg!Dt$Dj~>t_e3}&A)zNiNwZ19#Qq5Wy%2&;d@qFP z0SNmglret25w1x{>Wxs=?2)h_5h1t_LV1(e2O)MK!YK(AO;BHi2NK5hMW|#>NJt-q z5Y-PM%%t{1X!{1j6$ue0tUrQp62iRx2vO#;gdGwZ3_z%AW(`2-F&N>#glZ-x5g}j* z!m31s8s?6K0}@&fM5txb1|kd{ir^ZAP{+g#LI@d#uvJ2g@qPp0jD&R5{Dqfjzl;mp_vI9its?f zxSz5nuIXY#7#mNIvruFgko09s2K<|OzI4T^tlLEB+N2lGZEU(Lzp)cVUD>h!FN7F zgINgk%&b`mJ0#qfU`)(xgdPTA)og@?=8lAb1qiL@AS^a%a}W+laLq+nYU1W13|)w@ zRl;)PJr5yd5kkT|gfz2B!Wjwv^AX-M@$(TTE=JfdVU_VS2+>Ork_^H-W{-qx5`q^X ztTBlT5Ed*&I3?j-6SNQ^b{WFBg$VDN6A~Ush+2fO!K5xiNMDX{MZzW%wiu!93WRx! z5w@7i5`5DT8Z1HBYGy4#*dgJ*gzY9~DMF8x2&WK2zU#j^)iGHP1-Vq0}@=z z5k59?%MpgYjj&b1C&qgPLdYtFgcS&T%q9tEB>1Nx>@)Fc2oqN$?3b|L_^m{Ueg`3G zCBo-skA!Oyg5N?oXcFH-SdflzO2T0i^fp558ia9gBOEm+Bs`E1wF==2le!8aeJ#Qj z2`5b0YJ|4$BFtNj@RhkN!FL@(gLe>4nOW~3?2vF@!q+Ay9ihj22&>W&zA<+s1guAB zy$0c&Nn3+(K!R&6!UYqz7GdZHgsl?3HQw(cglt4eco*Ta*(BkN1pjpi-<$Y#2opCU z?3ZxG_`Qb^y%{0tJ%k_49tqbZ1g}T9ZW7lcEZBl@O2W@3Xahp*`v~JUAlx)3Bs`E1 zwGrXAN!^H$z7^q$ggYi|6GGc<2=g`}+%uOY_-;pNuo>aLnY9^VhlKkQem5~&5PIxD zShWS=p}8X=-~)u#?<4$S(%wfnAi=d2;V%=n6=CR3gsl>u81HQeAs-?nY-1(B*Swpz zu@X2V#eX}BkB{lR9cAK2DEp|^#yxh5s}1C%U2X5a@X3wEKL zl9J8Gl-P+9`w7apohUhc%$HIgNQwH8?Bp`3ACjH)-3V7C_?fVe5ZdlRnD-GvUUON3 z?_PukA0zmiSsx?pkZ@l@0TZ(ep~pUiRl5)hnmZB#K1FE#2|{6$_6foP39j7;MNHgo zgrWNpwn`{wy!Rl4e1?#)2O-F8l5j?X|6YWWCVnr%#Lp4-O9(c8`w*fJASCTWC}Z|W zxF#X^Q-rc6@l%8a2N6z5C~t!HBg7s;7`GpxqB$YqfrO~f5Gt9}&k)iNBV3UXX2L#4 zXnO=<-scDr=CTCeqX-QSAVis22M~5hxG$lqi8+YS;~2uKg9z2k9SH$nAhbS&P{X7h zLO3A7br_+Ri93ui^fu)A4Qn>CBl9Q4UFG0 zgy^pjl8zxXGVoxEAJC4xIoRIK9LevR_7AExs zLi%ZhD-z;N*p~=xzebq%CBjSQvIO5V2o1hMXl-VFg|I`yeF<$$%t?eE-yp0yiSVkq zBO%}{LhDlqubH${2nQs%P9t{)rXC(NaLFi)Q z&mc^^fUsXeg7NzXA^IXh(l-d*%^nHYBm|#D=xGwqA}sh8;gp2lCg>bO>?MS8=Megu z6A~Ush&qqZ-=v;LNWYA5MM9zpyMWO4JA`=`5C)mc5`4c$XmAlB$;`TlutUOq2}4ZG zw+KCcKv?xH!Z343LckS-)|U{5o3u*^2PC*IBaAe0ml1|uMc67K*?5145b`5J!gmO% zW|M?768yhM7-QnUN0@jGVZVfN#_tD&=<5hcKOjsndn8C0iZIQbknli4)Q<==OzMva={FFrNSI~9t|7F&i7@XP!W?s1g6}Pa2G0j8uLw!E5#BL-BwUja{0qVw zllTk5g8K-kB)n^a?jXeehA{39!h7a~ga;C$?jme3sdo|5e@D0?VUr2FhtT!`!n}J3 zTg+t%z7G)^{ED#E%=#5!hlKkQwwsvy2t6Jlth$fzfw_a=z0)-M4dX+TCgUUXP{zk5 z?stq`W{r$bjQ0bK-R4ypd(0*bbLKB1@_$G~`%L^pgo%$4_Dk4r{2n1hKS4-(gz&l9 zgW!F@6#N6@ph=W*$Q+b$*aZEFal{OhanziUam79LV^#%WwS}b843PQgzrtf6JcT&g#8k(7(W+6 zbXJ5U7s8KbkA!Oyf-@mpH;I`L7Gy&>CE;filo=s5JHoik2sh0M2@fPh`6AplslEv5 zIS{T$xMRYyAhgYiFfR+jJ#$%tZ!UxeSrP7=Sy>TwNVqTIcN3Ehp+|0nRoM_8nmZB# z{194aNBF~}Wk)z5!IcByFB6voVQ3zNtrDIX@00cPE#TeN^Aj? zad}X3IL((*9!QDGOLlUZ)VyRTJpkc~1V0m&520;Agn9W8@|w#MdwJ1LyI76l~Bxh7eojt zijYtcA;@f!a7KcEA%v19z7WF1VhH;s1RKA?2+_q6k_sb~F?%FjlMoz;P}U>{A}k0( zI3=OH2`YjRTLNKR5rm57goFnYqKYC^GO0xo(n}&-kq~CWiXpTug)pxeLWH?2!8aJ8 zL2-mAGpjhl4hi=qR5dX{2t7(8tO`P?X6{G`D1*?t1VRmyRs!LG1XoFfS|+X}!q5woLQ-jjhGvh1YZ8LX zAT%e)E(D>OIU(VJgs8FzElg@zg!E8^D-z;NSUH5Yl@R8Y zLwLztmf%|%p+R|s)@D|DgdGy@OK4+aDj@U-Ls(S-;Z<`-LO?h|>xu}knY4-s2PC*c z5jvQ-P=uio2wNq*ZoDfYghV1FR6>Y1nijdyi~kU9tn)e%z7CJARG_}4%fW8!NdOstELR1;yG z*;5lCItC%Q7QzIRSj(r4_e670#v~I|8)LE=CS!^@A!Dj3TL)vBNtH3(d?RCq39IW9 zXC}w^ESpogk#qaY^?d4jyY$oTSxo#(KE<|g?CP__`|1BZyiIfypM2(0Z=V(3&N<#& zD$Q<`eS5xMmZzEC=16axn>O*uo_|^ye%8{97i99ZPv3+$2KL81Rc3p?CO&WaxR&w` zQ2*_TO~|_vHZ@!N_`1&XTX9*;tQeo+Zmn{AAK!v=dEqBN8R(9s*P#CWq7(~SR+HAs z=fi^AV%)z#n9`+B&(L0jJbyC1tsXy%>CV0(`|m5Rtnp>}lWL+l-@q(u<+IDNE!K2= z$tTni-^fgV$)~jIQ6rMx9@Ne!o8xI|ou0gn=uh5Sy~Ybm+-c@W4{`sjVu}yXH2EpJ z-Q7uy*l*xeM;wF6z{oK`FkY{dIQ62QT+Cz?R*M3T<&6JOmB9h5O<*~ zbn@|aR39a8IUUOX3duQkPIUjoO3E?JTuQT!TkhD|lg5!r{HUg?^96U7b1aLj> zxs}Wpo}%>WM(mzUU`!zZ=Vkxb8DOFeSDTVPQ150w69MI z?;JmD@+5T|Gwa_uFe~~|Ilpb8k)*xlF2mCb%UHsv^;*}HnST`3Du0flM8(UVQryXG z59{kw%samdWW!Z-;oBmCFj=H0ZoZ-_o$Ho@kdSOAz@irv+G{ZZ*RZlhLFWZnF zJ-hUvPEL09-d?Po58s^N16k#CvLI z<<}e;<5S9=@+CtDXuxX%8M%FY<`|7ydXJ~qY+tv~C(;CA? zTk@xAoRRGQ_;4XV`uPm~!nr<~&=i;cqVI{X^&7vwmPh?gq@8j$OT&+sx0RcmXm;it zmZmp#DMJ1DZ5B)OvovO9uZ!6A$&0DX=r@DEwY2>9tB&-;z?Usiul$n7oM6A-P`@f< z*FYIr_ynRUGpd2ImR7{lR0ENgR@4fsAD*^r=wg zRDBLoQ-UQeP46YlB7sjSODllg{gNZhU`x~Q0PhBUN?V#ZBWKT zERA`tV{icWvplaJAeDKaG#3IEn(xCHJS26}A{x^?*yS%KYbk z^-^&z>_0Wpi_jD}2(;i*=h4g1l)(}(%4*|C%U?;f6id^~(v;CskZNgqQJTUA!x&4e zZfT`e{;`&*H>oKwOGmHqmR1{0nF)c3mR8paTo!GTrNvlUIkd@^R?mu0e{(U*(i&L) zDxkfEmPz&hBBBzh2ya^+V=a%NXzyBDBTK7<_MW9Rw!-Qsl;5|srk1}jw2v&UnWcrJ z?XtAy3aj>yfZdkZ(()LIw#U-qEKSX^47)z96d04WwAU6(d)e|=6>X2DwYIcqw7r)0 zilyo2oRjO5h|+0;s0j6&&c&^SU$s2ycbrS0X^gkC{ME$%odiDZEr05O)zo45bg(pa zz?qtD_;j?iI@r6TF+U``-1{^ zyRF%ak6yB;G#bENOG|KTYJbG6?x~Mgqadml8bUcs>tO|sMSI!OdRkf|wAPl^%hDR7 zy<%y-Ev*UKX)EDAXiB3goV8z@r(XqA4x2#`c76I=9-Cv=WTH=^<*x;HO}+XIw6vDk z^H|y-OeGQr`7F(T#a}Ble>BaK$$H4T9BB3%XK5XPp=zNEY(^`MIm7bT75iMYGMKY0EdjgU4-kSmM^(c=uWrx| zQ6Gb#3h55*(aK>iu(Tf7BP@RlEv+Y-{#suX(;_rwrWf2n(`TvWuQ&F)mOsrSN+Y=s z|NUrrTyBYd(e$%hD3DFUFtdg10Sg zAa>pnmh4p*%PLD8gk3KZi@{uNX>VYEWJUOnr6r*)Bl|C6rd!%z?0RF8K5Hy(2zLAJ zt!pi9C|W)2`n;>Ra%#dF2D*D`_-(X2zKK25^0>*;hNG3Ww9S?_0&OatLc>o}v8r_> z%(S%kEo~H9LF^imTP-b_^xZFK#_-yPNEoja7)&f0eml_Ao~ghl&HXo*A6kJ&qa|9} zN0v4QEgz9+NPcW-W3lJAv|VUQL!(A-F<1ItyDg97v2T*VXAc_xye5F&&Cm%`?N1o5 ziLe$e9`iFxn}mH8T4zkX`cnQT!x%Ju4p`b0?7?Un1qbc*pT_F|%i|%-<1{qA=|rEy zXv+0;uwSF1_h>4S8K9c!iFwS@W@1;(Nc+OlW?|R6VtQd7M^mlNR{8m13-{+M%i|ob z$eH_d5>pA!h1Ig~Ic@oyhrP67;qx_`tn(qn(#~4`3|cI9ee^C)WqJWLlBW7UZ;1=B zH?cfku(U;JT2QFhUc^)$7Q-u+ze|?CC1|=`>vP%CmSTSmyTX2FY0I#0u`>8Qn)^*@ z%Mo`VDl=Csk1Mc$Y-mt{g*wuE@Zd%$q*axAdV&1Z}bnII}o%S}G;$8z2=rfZs?^^!WV%O_i)W_~w z+Pm2EqfK+SKO+CU)R?V82%xD&hHRsA+*R!jR3yJ}$- zrhdRu34a8|l`B5kE$w6M8t}CQ|9wo{yxRt(~3`Tt@T#>??=?j&lRy=S*t`ovou9g zz|ua)K9InQ#D0hE0qlAWp4{|4TZKIcdL^FR3ZbbWhd{5#lUtzWulO9=61&&jcg(Fx z&f0q4ASY>Ilbto(uWQrxTuXE9zO~!-0VlX16J!Qo(5^cxWP|LW7uw-n@fzV8(bs@cY?@4QMm7JP3k?Kye06knY;|OHT=i4+OBKM~7ctfU z)Zf&<)SWVeFQ^-3b(x$~oF%FUQyZm0yZ8{$&b=IzhYC;;DnS^8Lj-6iALTGbr#g9= zg=sd`Su96Z%9IVVLk_cNma}kjKCJ$b9|}MK6of)h7y_XP6ocXr1iLA~9#Au{fwiEH zs;NLjed1Al)P)#$0qR2ocoAZu5j2J-&=i_O3(&eD z4zvPq4Z3x=fk>zfVGs@{$?$O6S3B@zNCEA#$H3SuRT;Ke#=`{AZdtoy?S`koRG0xX zLA&AkumBdBv}w+~$=dg>g4K`?YeD;7?Q_?|2G|IjU^8q1?RU4rHrNh3U?*tL`!Q&r z`w8p@ZDsetr!b#xvkbIW(voMpRso-2(UM~?)WuUQG=ip}7qcFQBXA79fD`Z~=rw?$ zP#MCY925t=w=f6fgj{fij(!=mW!0OXE`YYGH6ctdU@niP0+fLeC<}L~@q6&CkC)da zxD21s5+!ge33_F9G0{>u#&xZXtOH^UZqUoX?$ z2{S;OWxbWRDCljVxbWVH}KyX)p|i!)v;ax5v@}Izkud3JIXwdMP6K61(0Tu^00?xUgpe?UKKS z^KcQqg$=L?wn0m1PaN7LGXZ*)gi;U;rJ)QQAbt1Ez+TV>c|UvxpM!ocFL^NkE#+c4X!pAla~o*+ zt>yL!7|it$7z)E+IE(~jwc(9~D5wh2P#tPOO{lGR#nr(Q z122GHJXjejKtP8o2f-H~~vcdOcUhjqc3!cDj_yx3sz6To__?zG=c5Rj$ zV{ZZ%u^)oNS*ZVGSU!i9B&MCOcDk!TdxQP35A^cTcF-OYpda*yK~NG}LL9V$m*8b+ z4X;2OXba7tIkbS24EEFTwPuhra2C$N1-JuuL0j}k@CRsXejGl7&moFP^k(g~kQaMC z$PWb|01AR1=r^@1K}Cq5!~F{1Qv=_D7Cy;Z>F9K%E)IO%>9vapKY@ji2{MB(=mpMM zVJb|6?sPJ}Q(W&K9|A)m9`u59z3g0XV$ThEAs_fdekcF|P!R6u73%HDKnEB>;v=CS zrMnNm!$Z&+!cz1Gm^vqj1pV-;)h@ ziz=PulbYw#1?g4=KcHi0&{@t{{Rz5}yKdSG}V zQb8}P90kcx0<=T#3{Bw-eWE_*Fv4n=p6t(mMU+cSZ_r`!13YPW{S*8QU%?l!nn39= z5&t?XI0$-4**bU+s^F(86oNWbab<|4a9TO1(cUYe2SNHkceK80|9)8d!yAwULtq#r zLkgtAXczC=0V-HoOkwshtT>A6|rp5DSf< zG3dykc{2aCfH-IcFN4nhbxzO*bT-fqI>1~qWI*QtAA+{|+Sc!deW2~Uw(p;Tw(P5+ z8UBkx02BmoxJ*HI!pD&O3IFYe{cw_Y8BhE70lj|sEEK@5-E|=d1ihYj4VlrAje{C< zsqLxW?+JUJ>b(G)!N5WY#_bAm569mK7zx@*>)rJ!nQ8xT$kAVT_!A0}<4C9s-=piz zH2p|uEDVIc&>ecg54dRutsV2P@CUp?nAe~qybdp*y@@#z*225635r7@I7Rwir^&f? z&w9h0I8H}H1sBe`o6#mPLqlA zFaVNZFbsjAkdn-Q{mDr`%rp2eMke$gckOoLA)JUKAQGZLuVNntZ-UBS8!qj&L$FT1QX<`xRfNMF7A$|9W=4dYD7zn|Z z{bOq4Q&)`Zc(s z`~L+j-@;M&3|5dx8hi<#!KV<6UK-X=8@By>BCJh~=!AS6j0YWp4~EyFKeh84=)ik9 z1Yqw$t#yIdAP;tMno=)=m74tW%7NyOw?8>B$gmnb`F1!WFZ}ZDzh zJGJr~+=Mw~;sBXlMoBkO!sR5WM8%(IE6Ch1bbmUm4o9152iX>jPCMI!B8bE+XW3_Q ztSO-x9p%{Mb%zwnS&X;uJwiUL4;w(evR+Dj^F@}K76?Kjnpzo1%PH0D# zF@gI8Iz-|};2k0fCj&a})A3#yj7Cp|Q7{5VLQm)l@o)z}I=WK^PGGjf><;7LW6;Um zAl?5}iZ@_8xz(wcj_4+mDOLBg%}@m059Hs@^cbpCCu?>sDDlqV1HPbIJcau=pwqSq zT+6@WXdc9cszeu^X`?RiI_PBW0?5?qS#?aIQ!|~C=~Qem41wM6kP4qpU+F-sL~~SsL}=ek)!<%m650nME+| zL^MYg28AyQIu>dS4WK@}pnFO^EHPjQB3FNBst$HLV;n%a52BPYl|~0s)u0?Gqh&!Q zRH^Mu24gP;B_RY#Lm4O!5fD!L?uQ~O=mOM_!k{vQTGv%DZMTZpb!Zj+jHdgB?jQ0i zKf(?tw;E6#R7kskDoCsGZa-4M71^+8043s|)gPyX!g@RLZ8H zIGTgfP%UIkTup^`2W%Z1ve6~uu&s@>FPsybC!cjyKQ&>CKbuFwWvfws^EIzv3P zgIA#=bb{AGyYBYz8c6S;_LpS<^aHJSdqHnd;J(lwCc;=43~#_7kpF=o|A~+ULqP6B z;Y}C@>a=5EG^E0CP_swCNLkcABS39F3Q|Cxq{)*^MXbapK*kJ==Xx9{!D%oRl({J| z879GAI0;ALW7q@R;R8rkwd?p+H=}0Q^MZCe^+CtGTCCKA`*Oq7zEfS?8~(!jCzQwj z7&9~G6HF)Ob<7*E4Yq>%#3tAXtKe;TOBFE>%SuRtS+E2a!y;G+b72n5h6P|iVdjI} zWM2x)GF&gmz5=X={+_JHz5&*Qnqw`b!#iq-HCWz-_h22!LE2_e1n*;Rfs9qCs+$QJ zYvFgURce)3rL_I;!LI6-rlwFc9D&{NiQ0b`s9h9kAJ_pO!H2LDqzgqPQ<2#I4`JU2 zpTlSHDeQ*>a1a!S+z*4oehFW|F*pIq$NBFokST|2VCV7z_OtK}C_%dPXA}E4y;R^f!-@|2C4Bx>euye2KR3!J|2B>O( z20D~`H!fXGAzj){_z7;qE%+6(!#%bCT`Wc64*X)-f5TLjJ%B&p5j=!mU}xencJ*Y9 zh9?**okoii^}%#OCeT~KHL6NuYD6h>8c8`IyVev6pobiN!T!=E7xtWx8~h*-==Q8{ zUG(isKF~KYMM1iTu)c{=0t&Z`IQ5N;{1kywP!fVb{)>UaBp2tu5+KK5C<8o@?>^{I zM4A&KFm;|j6Z>DFl531B@o-Q?VNe+=f)c9)p->ZQKr}=`6^MeWz%g>Nd#pFqlYhngA=mQ% zJ}8WuYm3@nIaRy82Wvr9IT{SK0y{Ewm=>TaZVt^L5R|}P;!xGbfey1f!rP!sjsztv zze@O3PIgJ7JFpm24HPgca~_rCg4##O&HtA(hrL zuxmF#?QbXE6$iDG=I8m?=Yb}fewcO@YR{pJ^#x_FH>kOKfnAWE*p*@RsqWAN6vp-| zH(mFEuw?#|phTXHNY^7^IJ^nNU?>cM!H@)Rz#!1RMEgt?An|`;CjV~($iGlC>3%UD zQ>D@UKtoHlqN-LEt7daRDyVr!K?;f(wt`)23a94ShN)2_`ySAUlK<_1J^AmI%uWfGgW6CYg-W36Q>Rj-yWnF`J5C2X zW1nD`zowuJ?ty)<7dpZzP+ayT&E}z%e)q`IGtYFdPKg55OTfV(}H`3HTCD!Ua%iGL}T0 zOr=plI)Dmd&w3gK=iv;TgRen_Qie3bl9l5&pj@BERL&J)N$eWaXJvvS`UVO^H|T?# zv{x~o9d>db2S0)`rJ7JJU4;b=&6)+f!2$d_9SclF43FUvJcI|J z#O%+XT+82I;6<2N4Ef27U0Nngoh#}KZzp60eW8^b)Ko%;nD({O)0bY!`u3|djyjms zmkyn=$Aj8c397Vq#&mqAlIt6G)r`JzSBXl)46e&yYVIfsde}(Kr3a4!xVGngZCK=1 z4Wb>izuLPPVg#n137CrKDwt8ACzZ6^*3(IHZ;4wa%v8)!Og+7%Hm!^qW?gT<|9a5c zQTGIG=iY(t_#;90w=7DtF*MTOhQwk~FI5$(!`YcpM%0rvLX??WP#yHJLJg<`wc$n3 z_lkAl1*iux&;S}jQ;^mKnnT94){?%v%9NNU2TdgR@pKiAfxdA$2}eO+Z2h8@M zlhIen2iyn#6gG#Z9s4uPRC0^Wq-pwXt9P^MKoeMsM34Jxfl zIvP|$d1yvNW3i8cH0;WNs$F~tN8m6Vf`f1XJ_2QI2Pls1nA>10ybqgU6KG*F2{TSP zir``z=1i!Fy)w+eJ{2ZId9I@&9Hwv`g=vS8CO>kQJ{`L>Ek+b>Bi9>1{Y+u1fZW%k zt&{#P|0&V6m}{Uac108h%7`LTX3}94_IEJTU^UEzRJ2u?6)=_f+n|iEgcYzHmcde3 z0*hf0EQDEV|KS8w&K4jj!P%Gw=EFQtB6C1)BP`@!c7>6BBq-y`v@(x$*0o(jN>nAzn34bK+79z2 z;l2Rf(vM+k9+{!`m*oT;hp*skI0c%JG>I&v4K-oN-)YP345qHtG*>{)a~Qq{O+-Jy zcc7+GAJ7b|xHK7k3u;EinS2(DBDx3{;5?kO%uARVORAD&yuOUP+F6Na#!aRYQ-(A8 zvuog2+^@lP_z{?jlii6+>;p0_2d|shmFu5Dx8a{Kr<2GH%=a+wVcvn;pqjb`x>akw z9}K@(n(nBI=PuaskHfCaJXHJthQ&_QzT@eRW+!?Tch%5%cmTgc#*)aN+*K;Yr5lVg zD^1TT=>ds4pu?*PPyznJ?N9h4ng6tW9*;O2#=)B~7RJD67zXtr6`tUKFbNKXm$+^L z&7cv)LPOBQ3bjDb8tA)2J*A;U%R?}vfSzR-C37VIjez1%6pDbJdI*3$WXucmv2qGZ zJduQzVQ+M8)4E`4vvD8VV}A`cVpnN@#Jm6sa}~24+N;nO+Q0~{|KG$>&-tl@b>S6g z4a3lf!Vpl2pFQm;jh_MNFJr1ET7hb#IjBaOf}SDFSTiqj-2n8gNetBSq1)ERQp@bw z=`8G51*^U?R*mWF<8X6%r?XhHDyGiPC}X5{ZnrPWszK}N?T zTvNuKp1a0k2gqn@Y-CJCZW=Sv)JJwd6V7f5 z`O{d-7`7hQcHDMTX-u9}``Zq-nXxpsCUXx7DpIwdGGI58+*E^Vo*kASyBRe2GiJor z|JF$V?+l!`>@BT8N=S*sS=YO=Nr< zDGwimCT~sLnyjnB5YSf@3D6a^5$l4fy|8Xcow3Km>(Bwp5tru7j-dIp6J|W-s~Z1W z83^6MmEZszdqOwRUbvT~_u#ra^tar4VfKbTpr_XQ!fgBx!W;;RmidP4=$fSGW2yjy zL1`86q5kbQnTMl9+p}&p_OmiO(kx{VYm6S{Uuq|l7gpXm;@880Lqk|Q@JS;yM$A$YujCG=e}gT zB50Fu6eMq9tfr6P4q7F?L_foUjzT5-<9Za>%G;r=P+7jO)Y!Vx$Ohu|O_fX_km#u(5tNFzv{TlbZh z(3(RtwSOZlvCt4SH+w`*3<@9WXZT(}2f2GIZ9Pj^KVK~98BWF`luX2Tz`tMg>% z+6DQsKSX-~zr$~^hj8~Xs}kWYOf9k0WD7uxcVzbgpJve;xc>}4zyOdWA)yK)KpcW@bgg6nV% zuEG`Qp*6BfiN%fVH{nKbHVD2LUZ)(H~o^bsaJc2*qPk0RbaCYFX zrw@~f!-<&<^dw?;+%sWj*56%Z#gauLo(f~?u~+>Omk#6eVERFB$OU@BI3MU~V?7Y6 zzq`<*vHByi>LgeUQ-3TL0>MxUN1uzS;#RO6lruebS{A+}KzU5v z9o2DE)nS;GEqeiUe<)3O{gFs5u&Y_axF**slxkIfOi~@HfvR536pcMuZKVf()hVJd z^#HKWL=`9_3M9XEa977_K*H*f8W}HuGT0!4UDx`9g66>UweG((&eP+Uh$h+H zsTy(-3jsJ3fIwUZkbvy^^8`C_1=a(*&$^e#uZE$f)OMii*Iz5N0sRGo{*pn7zKr=2 zJZ(nm|5XG%{40m{pof58qqMJMc7Tqsp1|2b!_q!P5^$Lt3KKy&^;%;E4R=s05-X7W(}Q)f|cSE+|^Js6VU4N&LP=#U@H3p#Mugrt4& z7|hX-3Mrt%=qcoM{OH;?r(vH26JZ=ofbl>xR&uwc9Hzo#nBsBpnr@kD>zQA1!Ke6b zbM>IJv zZ=IuNA&6Ob$QjA+9$!A>jNmtf{SP~v6@CM^thg-?PN`6STta7}iwX@3<*a9v8F|%~Ek2niDe(^HLk2nJy z553Haqs{>1IO-hzjM$W4jjnXYSV@}ugCz(w87tW@Hjyp@L2Q!)6$8nyN+0;Bos_loAtZ?YmjrWe{rA%R=;gv%<)cV5LtUFHp-}#!)6yYsj z^XRy<=`$q=cRcnr^G`U#t&(_WHQ%40PV1WTUt<(DO}?Z^Wlh4D&WOM!>N+Hr=~~c{ zW?8dua(Is-HRXfczW=2&Jn${DBp-`MRB&C{_xojcMx#{4R&|)jubhSW@$D905ug6* zQkn1k>N}|$ug-{ecvlXMkZ1n3!YuoWO!@OdZYm`{o2lE;72xQV&8%pTIVhVcev-1K zWHY79bb*5?ni}oKhFWR)wzdv&N9XR3&*Z~Q zKkY0OXmWYF_V8a%S4)0(KwDKtxVth|L&F(io_=aZoN+rsLuGUuk<I@-lxQRhW3tZj}!f7XDlV{iK zzAo539H|X%JP8Q{D)t=Y^-am6!DC}@)Wt=W!Bkj`Fv`j9oIkESQE;ya-{5AAn!YyKa!F>Oh7%|^(GC6JepOfXM(^UJ+Ni=E z`nj2VenQU=v#T)6H`2K@&cFW6lpV>cK;O`?Y82^cVRQaG6Xi$eoQ0w;;4csU=I2g{ ziRiGN>5zg)g@%WD)eQ9XoUu=~F8d?Ezn{Aa+>`$t^GOz0K~w5H9kzTCQ@C8w zka!}GH(XmZBCe{tDV3VnIb8DLl4W3*z)Cr?mQs5$X;I?aMa*=Cb#Py!Bd5Ilb;n`D zKCbz;l@dL%051GXsSvy9t%h0FFMOH@s}O;=n9fz7i$5yAz4ow8)!jbAGz(lPY;s>9 z_9!CI2)#G6U&%*zrZ7U?{hVg%#=1l~do}&%&+Dfh8G=iM=Pr?>xammPz<Gt97mIs1N%hpWS)^u(H+q)ti7lTa7w@!a2C2-Hy1s%Oh zn8!rq@GWVYzlQfdL8ij1m>!?*-~&2jxVDRTo2Fs5O4<0{uu>Ox{5IaI04i^BDRb=G z=QWMH0{+LQacn7Ns$8OKx)k?R&5eZonW}d8F6r(Xp;3&F?}9xAf0XA&;XK>&FzUiQ zvzFJrV6*HJB`Q$V>>v(@S7~#D>%ckI5dY!E&O*D3|8;^KQVDwzchQbthM4oe;q5Z!b<77Lrv3MrK4ndA zWh+lvGn4BoMaz07unWEcV;m0;FjAP{+_OgrE;-4<@YEyS&#bFI{i#cpvgV@Vs$bUR z{EI4#!>2~fr+d!djA_wp*;AkKWle=2@Hw!o>8MmEl{KBX4*btMSx4Q;!mD~MFKb4e zqF8Inn%$#Z0p_zGoP`Q+ApuQ2iM6(7zdm4gZK_S)=~Z*gA3v}v*jv^V{gDYM^onzI z;1kRDhMw=9I+Ax+ez$L?Al+olkt<}QSUGd`3jL^jIZr>T)%|$a5fgf8A_@1b>aO9U zo7|1A?OI=`xw}3t);jfGIn(?q6}OjEH1iiJak=E~EG0g`M-^J07J9L~$EBV3l5;Qq zzI*^KEWhMJx=RQf`24ViDw^Ypy+cJ$`pqltU0LwZzI?FHO+tUUkK$9v;|67|oz zUEFnHRYH~3gjL_^oLH(>-E6tEhSCjz^zY-MJfCR0_IRUTmtSFOR&kk9x`&#L)u{Hw zP&58VM#sWRX6KKrRNt;-e6Ml+UL{jg=3AA`fNPZCA$70L(I)O>vkrF;vdDB#L8zI- z%-h!pnH+BJ%G@7r>Z$`iXB1`9D9SKKoM!iRZUWEgwpG#@mzrM!uVpH``sL$upLVt9 zcS5`KSzYScoCN;QW7rPKjBxA*Wnm@={TZ`Wq-j2bS{oE;jxS*hYT-OR(u|PXyOE~T zBHTQ)#nXA<;?K_Lz!&I@+$K|k_pg4bOyOQms*kl*1TE1q%5=Iz@RTUiR7rWN=Be2v z#LQesv{se5leDw-Oj4QXFyqt#HB7%-Y*M<_ zbRSHlbZXQkTZu`n)r)nbB$1Id%`dl{`HMz+CD-!Y<}N=zx;`W_#{zd&-D^3IA9rli ze{=iIQ`_U$tJ|(mZ_Z3SkKb_5(%r5cyUohfHaU~YNo;L1^)?mKosjCu4ZrKtpxmDA z8pkw+s?M%XPnG9$SEpxI_t@zWGc19lg(`vgO1Kp>kcPBh#%6}uPYj}D6(ALChdeHNJa@zU$L0zAct zVAflJi&i{8znidX*_X?=J$2a@V?rkoU%1!a7?c05vuWU@dY%a}Vs@7|_bgp8(&0S< zMU%Zh-(OW~1U_h3 zHSIQXqIFaM1z+SEHLItKm7q^UCvrqetP%>aB)!57hjK@;(Q{`Dmzb8O=|g8g;W;fmVarvD{qw@is8(`6ykv_1K_T>4%q&n-M&_v*zHNJ-ukgW5MuW*JM1hx0zdx8zJK|9{ z#U9( zf7rTz%go0~Oy?CO)})Q8{U@au+rqT{lM1=m#!S`q^)_a;uC3K&;PY3L)>_f7N=LP} zrruwKtk>3r=AmAu|3$sDXlpL{QJv4P7pn6j!2*5SdD`saws&)NX|-y_(>BZ1&Qy3z z#D&|LPMCr5_+%fP(tf~;HyW?6a~hx4;LP%xS^t>+d;B%?=VK~petXYAFMWRXn}q{I zMm>!)t-Y!I1Rv!)c-El}U+%Y}o~u{vQy(cEOxGt&pvO9Ts&MF^$Mz&VYO%qcn(pgf zw_i6$6vxBY`J#gS3|tZPYtn)CtYGN4VbP)0yn;K;bp=$Z(#exw|L(ajwk+3pyT_f| zUU+j{)Wn%To_zC0y|f$dxZTrCe5ZNM2|5xFx$#hUZa;;Jk7p|4Pt|^ReM%!;|H19Ybns~Xtsz{kt zZfL{6M+e-yQLQQ~dmZd#cy(2H;4eg>nJmx|J^5mEWKM_oWfU#jA9gaMB531Y-mXG{ zZxE3Nu6;yIR;(l9`tfFkH%T>%=SUtOW9ytO-1zu`hC1CDN+@Oy_lV7Bu6etP26o4r zZruB4W}8vxm20FIX?aVEHzgdd@Rt9+yjP8tWP7Fhc>iJ1volkc?a1eyOl+!vpjIB2 zyNN~r9I?63ntbk>QaNYFo41Lz%CiN??OnST#}8!hG;yeCZJSS@TJi4e{hnH8Kj>vm zAdXA%CN~p_sqNz`R3&p~&*)#aGSA=*ANS0k&-(@uXj%CDh?;da(|uSXSP`1tMC9n$ z*_`)rh1;<^dUiHT%HYYG;514*I%%QjC&+DKcYdmV3t7rX2JXEQQ*+;tPI3QP0&3xr z)78}Rd1n*rB29Y+JWfc}=(?si+r||*yz^yL} zE}oFbi#8uSyVxzwI`mD|+CTFj;IM8Y8rmtDh{2jJ%nNXK z`jK~sUAE{1Gn3n!6k3g+09d9mENhn`|7yPtkT@)Pt4PHLH=0)$MkMyXNW7@QwA#!RTdG8R(5lm zR9(M0x>g}#VXoJ`^*S!<$B6;QuTGnH)(aO+nVc$ETg<@p?w+x}Cr^$0uQ#22*qsBm z&JkXA)!IGYx{*1;dYDexDDgjYrdw&DziZ3NnJJ!&c_I%(R0Fc{)+d)Pw!fr}3iBjW zR)igOp`NC3_NQI&@9y!BZc(A9sa=wEPe;$sfnm3JlU^pY7}xE4ndaz$J$rek&b+5e zgucCLvCeU$ z>AlVL++@ib;ep1AZso(1A1pifez&L5*(J8e!J6JCH#hvhM{+$ss)@}=M?a>RXQH({ zg$I`F>zVjZ*1G>*xZ|E`+iEL&im}%b&o9^iKC5=z@%_wWhIW#YYf6+O`|>$`0?XEXC}wnfsd* zd^n=}n~rnv*`vSv(S($rLR#%vG3=ga_3ch&dVh0FKDYKa$Jbz9>TfEiVrCj(0`p-$ z-7L->U|K#^0vuf5_+MTZ_y0S_e+~b?btgahGHEP(a`~@u{v(feZ@0(3=NuuwGurD( zlF3c}_PR0zO-|H0;$Mwo97Hl1{BrBry| z5YO1?-@b3%&Ao=Sp{*i4rykaB;IjbwY=%9MHUxhUWji%%qPOQLGoqkNUsk*KA+*Pl zg0%Gk7CE~6zcax9+;2HYdXtj1asGbj{6ciO`*_f1z~_3^W^a34ABG1VEV8)F&ev|* zSufr2;8)Y>+-_WS7|8_W32M3(B9m`dn!k^{dFnEs*;vTs46JP(H0OHZ#dEo8-PBoE8g5n;#!MM*b{2MZQ|H<}#ghnU z74C-3aQ*js!C^H^;K`AmY5wG?mFuR~2&v;Pw3e*T-u+FfA{61uNK>~6sgD?Cb|(`3 z#cpDI-m|?~-6F90XwPjYI6kRF%fx|8DZRD5TRPe_Elxh{ zX~&w<{^JJroP5{`9311BD;s1v`&WAGX&p3L2|Qb1`#$&22z7&Q?r1mG6fZ#s>^atR z+i!p6ubsy%fvwXZHlT zJ(DtHX!>~1xQiJG3WTj@kb8FgZfE1?y((uru@Lc+)AEOxeeX z`U21TYKcSfs`jCHb=g->@Z_M#tj7JiteC_1isjrJBA!jfh3~vmvd?btvftPn z;{TKQpEJTWH;{7W(w-c+O}h)&W5ODvW@BkrWMGj=o<(O`uc})=fB5E;r#;C%6a0Nh z;%+O`tqiSd$Mej7#2hO_d@oJ*EHYRA{AT$#+TYWvM6(?yfYuT+&@siceLOPDndR$h zm$b~adYhe5yM6!JXRYOKx4+Z(n__B~RXMGFk$p?BN2Pshuy!O>N|La?d7dyaQ_me^ zznk$i;pgvFp3}Xpy%+POwc@w;FjnXF>|N|-_47Aqb{4JCW9n(t{9_2^pK4mh^4%Xj zEoiD)#||s7{8Y~hf7SeDH(bR##i$&fL-y#Y=8}9o|L7}bs>xS@A>z3mx}$A2)pV}F z6hC>oIaI;bv`U8=p6Ih)Z&Resim8u?-kMu(;-aKvhOF7!gXgrM zJwf|KTjyJz4T8OjE)<$!)ya)%cV)`(FLy=j-uHNhS;oz{ir-An(zwfjQ7z*qF5$5X z`^&Vlxa20I=XN!D>xbz*+PjP3{z}8{8}?-5xq*iVK7ZF_fBjaCICU zj?K3x+E+cldF|y)xOMR7@4~yaq6z$p2z7HGI^~Uz^WJzgjR-v_FJ4vwb&pn6m{%&( zE9{fT$(5-r%Y`#;9YB7tZ8$2;Fm(ZSl)CBrxpKY&uJCX6C%Ko-rcOn zr(?-H^XL1R>GMpdI+)wJmd?pU{s_)zPS5kqh~+L9ZCIr8(sxu{p0lnSxaeT%#a6Yl zW=Y?!Es~Xn=Y*=MBh!3yB!b)&obTz{Id0!9FCa z*KZ8BJTQ9=!9~sAG`MPk=}Ff#YiU%lNSkAtMY;<9mm|Vs9nI)SYHzWz&f0qXY>Flo zyF?UWRYJq4!A-^-$A^P&4~lY{{I@x3f$7!RRj$;O1)lGE1}4OJ(K*%3AJ1GYIP=rF zxxLrmqWY%Q#z(QadgfgEdFzV8L5n<{uSvdrS-&X}(nkelVae^oTD?BAq%j{=arJO? zT4YLBbu|s_OK6=5P7PSFxAiwgk6M*MJq})ErdMTbrdaWR*x~516HC%^<3pzql^K^T zbrm+l16x*WO9zHCq(q&yAyi?TD!>Pj;4NgE;5z(Vjf;(>PItm z{k+JmLl6ATN_9lD8~x^IeyFbtwWudwj>YDZLh`lsV|^i>cd@xq1GB_p6RK;z){d=4 z3xq8;BV=ay;{1@VJ>kNu{M(~{S~2kCab8c2K7GC~X{l!x^28ZnMpftjm}{BG+n--I zb~JeT*hI2uJ&ag*nK@RSLcER-^|U*`1b?zJqKYb4(>r6l?=s`4K_mA_Gc9HQmS&cz z5T5IBt5D&N<10<^nl!?59>)j^_X>W?lSaOwqY9T=acPP5)fUZ@T)_0J>1xW%q6gvZ z`ZBj_G6iL*tWvdHO$-0TL+@G1Y0yXcer$2I&I)p>rzxoJx+cDutC06Q7+SjJe*}~1NO@+*~PIaRjAG#I3xX@67 zt5w6oy#Bel^DjoqbE7?#{z+n)b2pM3d-m^~c}MEGAEFI#e3Ncwo^`oB-%R&x0$(bd zcR-nizm6v6D9$RSix1FCpi=pkCITk|=d!EM#u+B;XTK;DSC$96%PzKYF zx=-D8G2x562Q}&Oc#j5HI@6)%us<$e>ovIRC622{akAicS!epxqe8b3wh%tH4LH0z z=J8DJ9;_Yd(RGGzKo(^vZXUCwvdh=>d%-n2u;_c9_WnIJ>+w3dV`i$?cmnQ!&t$Jp zRWx63>ei>s?bn-jx?a5AOy|1Fn)RMR-=@_PugA9^{h!jVJD{p#>0hp1h&7;yCDYy?X*HpCJYCFc9h z**#oBxaPh0`G<#dcV>2Wc6N4lcV^EywMLu|z^wg)W)LhQtNVs+bOX4GFY75gL7SEK~7Sfk%-vTZd+&Y(bsG-G9 z1lU7jXHzdetQ-*J0{*22_eTjkm4mOg*wMq;6R|g1$+(>q3tVLmAb9iL^0(*Zdla)B z0|+#rF->otzNjuOPM@jCkE zPI})CHo$Wi`TC%ip1TAew`N?A+3t7lBS5-CA0Xk#T@()pSm&ZcPPC5qP}pPcA^<@;n<)L+}G}+i%k6lAglp#w864#UOntP0s>~$1!FCJ z7wOxB4AiMS&5n5Qu$y}GGh#Q*?ua_qek!!A zivD&`m+WjYaj52BZb%x74E$AtPtC_}jo(dWJ3*%_*i)TOs4Z_d1@e0xdm4jx<39s+ zRrkY)Nz7hI+!RHuN)3Gi+)PRH4bxn;j~e)bCY+&mzIgXLK;wNOqmu`Ol78)a86(#7jc&gE&!L-uDy*MB*8AimbbWpW%{L{fbcw0=s>YE%`xP#+{-zT@Cg0lTT4pS3_0( z+*33k?l=SYWspW7yMUq8@{2Y%;`WB}tcra#6^tbP6VXA6; z*{<%3$5nZHZHOpv7?F_E6x$73VcU9o zfH;Jp4jV9-T{(L~a+PO<*H^KZAilxraK9SUnhk#iQ{FQCF_@Tpu zZoMUcz`TeOo_e1Qy8GbOj0wIfO*n6eF+WR>d*ln(UjOneRqcuQk}1@*r$I|}5$QFR zED){T6NjBb?)G}y6v_dxGQ7HIXsN3&7xms#YNRBOzOIo%HG4t#8l{Ntv7dG}@ksBD zcTA1ykV0icQ6WOfXZOOhYYHt7!&Bz@DCUJ2h}s8Y2SV+AD%%?hJQUS%4~=uK|0uRz z<=@q6;0Yjq4kavs32Xd24%nK?ZV7t`kj=~#3IwjQ0uVgJqFTm&f9y*yobRg;XvCfr zn#a`B0KxM8`Qg}%JC$Xyh3Zz`MoC4K*tYU$J^I9tJRLH1$Tv5IG8xzUoWM1di`kd7 ztew`Y;JrFZn6sSH6^DhTzwIn>VW6}icx^z8Jx9TPpsX@xe)2g=V@W+YM_ci;@i_=_ z<4fK4de~{fH)T{pYU7KY7o)gXkFg2&7AqXq#O%R(K>B&Wbtn&r62MJLENQH=fA&)e z0r9An*>Q-s7K^VvHMX>O!Jax|P{hewYP7%9o%{~gLi`J9bCIwgq9e<+46S_n8e4_U z$N%=bY74aCn$r)?m_|oyw#J9d0h7H$vx5Yz>kxF2G$tm~^#Qfk=xcPfcWM5rK&fg- zL)8AHx1C?KADp|2t} z16-6pPq8pq`8gU=09tkj{Tgg=)JvJXb6ZuuQt zSXPDK&B@f`tu}m244bCvtGGU~UtRC3)CQ+8hpfyJk{WIC}S3rjT=! z;^o%tFZqxsO?e=ZmPxiFw55eT1&_e)43+`OBOm~jog0DU4D-%@lPs}!TC$nRnlkWN3vMPTQyC%}1?96Gza*ZlK4LjcY>)lG0iN)}y=02|`;+K%ia z4ax_WHqwPxrh*_ZLz>mz(9pW|yj8L*U^|ANqN$M}I6sT_MZ#rI0%Scvete4_M`Brq zV4 zHFOq8diQ&jJqCJ#wVgV;w2)H~v55huLpqad3?R&>GkM&nK{24!@;)tzfzBO0x_C4Y z%ZZS`)DA@gFcEMjS=bmJ1qxVAx`a$MQ+BZ+g;{G)b{~7ajV8Y5dN{1--NMI zb+cQWgeZk3w?jTPz^~jW0y8|4uo zc{(`zzpVV4Lodb&R!P!vO$Z-mxmqMzI3cdgd%V;@lMai%V$)d2}LfqpA}@z4CJ*Tc2fLclCdFlh2!F{YA#2s8Vn7oFW)^0B|`Fv25)Hi;`9p_W>@- z+3zU%Sj@ibzOg<&Sr;3tmLM+7RktIX4gt4tq?fYtg*c6S9p2~8;NM>z=G06K7nnp- zREw)F_XRbN!@%Al)0d0Cq}lu~(|?S$f~EhJ>bYy$AK6#bD4d3z+iyO@O-t!R?3wiz z$jp4kTep`K_$Bx5OK^pD-`+prz#k#&cy|g~#>{5Eq-!H`c)B>2}olke*Xl&m#o(((B^{kew7v^<)Je(#vqZ!e^3OWmSe!J4cuN& zzL`<1+lE9FANT&C;CN6!9U-(lJD}H`-)+LX3F^F8@WCL`t-#fSNcCZnWW50I=0ZkG zzoOJR;Knja=-T0gM5owa4hX5JE%ACqaR@Foo`+4~wzg_G_S=PNRl1w_4S6NxrP$RC z$;?Wfsg*R*!3LxPS6KiE7vNUATjKY7?gP(i5RG)o)5ViP{5SyE&>fo+HS5%`SxZa+ z4^YBJ^5EyK<{zK81_oDjm%9$;!;f);VGQa6qV4Snx7jyK^BIBc(4q|rcXj#Kv>dof ztT{L)l|Xryz50b^-)xjNuj<5Ukh1#-J5zM*W!{Z8U;dmm%h(`IOC z6K;`)6Vs=M?(7?CHWi#b1TOSAeo))WpP#y>4AF4ib&k0d1&E?2XEm?3U9M<%p3Zqw z?qi>48ZOo*xpai7F98HkZ2q}Tve#U#K2C#h*NMrQqgNW~V5&<`19Z`*n)~2*F0}-N z@geB((Dgj+)3yDk^8++`jdW$+ioQ2|cHVW;$_sN%B?-@H4&&~D0d@ke$AG!hLM|`2 zH$fC>npGpx=q=q~&H_Qb7I2Sz^Ya(|yC-oNiPXwTZ^?Q(sBZuS4~neD^%FYo9f*5f zG>9V2x=Q`>TMA;_O7DchoiX}QEq!~d5qb;$6d_O9E_kwoqW><}eX{FE&Y%j5!KZMY z-qB{@>cieq-g-P|zN4(^Fu!nE)Noyq5^Qg5mnY8@LW9Jo2P=(at2FIIrDe+jEJ2fAxgNX*PS^1xbN82?1LkQftOO-LFO>% zIUWN@DS%u&psm>PU%y2v;qj21QFb5XQA5F zCbp>oo`DnBswJum;iR{q7PAZu74yuA$X0vhKNZ7&0jVijzT*B}p!rJpujRj4QQBN6 ztu_E8&;K#~CnYHF>jL<>zT}Fzv@m`#t$X$UrD*HY0swOI&1V1&DVVKcLewq^ke5wV z(D)_fpOI>D^1JMF6B5N6m)I-63I^{9s91PfWY~>tJZRP z%K&vvz<3p6;421XbxP4yunx;A3gBqM6Hjp;M&b5qf;QJ-8e3XEOJR5|-=)y+A84qA zREo9~d__Vb2QuGLDmdE|sxRNED*U_5+$q?f1ri|4tGI{m?-JoYkatuRRwli6$4KGw zzh4xQf5$~WzIL&M#&cnO?f1WPVp3*gC#jC*zrcMUze&S{#8)iFC@6Syin&@fjnHs4 zIO#-dl2#VNedPuF#6#WUy^en+7TapBl*ClN#O<$`1mouo+!L~3Z!HIHFch}OT2Maj zFVrlxV&0iAz}Me$mNY)K+W%uSnBQLoD62Z8UH&3}H`xYFfeYCPxJkGHMr7oCV1Nh< zU~&Qq4Ozwf3I~j|TxqZ+>t%-G%ymJ_^$$x|xHab90-!JgBI9?-Ns<^P0^4+G& zTBo_W{zD8}^Ji3{<;(MpGLIyoXZG?omID3TM8o;_>a>NQ8NQ32=CEO6G$>3EncudUO&S`D&IMCTp3n^@ zA@-!$uzTuSWRrCg+|VKy8VwmDu9k(mLD*r;&YkPGe9340*q;NvM#f+Y0APgOZ#tnFVtJCl(3v&Qh|;p84OA;wj9{C>0q;h%Qv|U*JzFK6v3fs3bR8(Ipm=>?X26^AwbaxfPDi%=1)rQV8^oS4F zWd|siKM{QN8QiUBU!T#Jz#)ed!F$U3gm$e432`eRj@gYG61lHI=zT^V8ny;iB10~H z4P5N_31qnz&$0EWDL<#zqlmS@*A%blT??LQYYnHIwdN$PE(zXXk;3~~_s?c7j_y%S z>?5fqvK{%RLh&zUp{}LNmdNVnlzp(D7*2dglg3Dq`N9Q>G0Xq5(IPhM#5zr~pfyyF z4Wz(z`J+MA%X$1RG+87P6fyg&BdE~qT6AlQ7<1SRX{p|=q_O^=E|E-DQHsahkjQwUD z22p|EnRO)r+daI8P~+ELy*?iq*+SD5)uyQHMcAii-xsLvg%d^byBS+)G_U08*stI{ zp6Kq6-+c9_QRMrpT8E9+(wo7}+(s7arapZiU)T0v6R{Pl?n)eLL@fcKwae5Mh5Ag% zLnXZ58N1MPq}7PTTcSa{u_2pYv_h%d7MkX?_pnfRbGKZrnto#bcn)TV&n*_IVi7GN zHFoqeFpAc1K>&tG{1RG@#X=S~ERC;>7HZ65e|$GCq(tq;G7Y9v#m( zxGvp(>`x6$CFL5E%U0kv0E8`?RLQl=(sca}j>(0E<+WQ&l$1cp1beTyL%-@im=90| zRiwGZZiNX#{mEN#Y?vq^Um3}F8|2u?liq{2zKti@Zv&k8-Hnwhp34h)UNURTUfI(@ z#Eo1o+a#h~g-#v7i!_#6cJ{iaq$C>#+g@mDq55iNClAZZ_-6Ou;uZ&*(&A)9AIgrP zv}7EmezIE__!ZL+ezxJyvRL1!cW=QySMj2%+rb)cChEQ&C+KEwV1k|A=tYONgK0E2 z;s~BqyeS9o#^sAdpy;a3{?`m`&SBpiVa^zv_@=`K5fC!zRBE=b!yh;s;>><7spCz} zcL2Akx0u-sy>cGTy&rWH4duOYNPSd7f(f^$KYBLH>jsC*BW4=w`#6-?qhxcLHorZjbsp+Pr)sRmVs9$D6N6$sAh?qc zdwhQC%DWnX(9XP*y{Yw1%rD4DnFmPy#;vpo@5c5m#D2geFRP3L#+80jVLWhoKT67g zmUqgqxRuv(-gB$OX_dUKj6-tT?ZTEyFd#X|cFFoJ6S|J6oGBqeBfJGI1cV;Ua*irwR1}pu? zD;Dnos(hfl@*dRH|1eC5M{yt zr*0>#l;`zf*y4~(z++hSPJWgd1?N;0d|lkkMG=%^WI3k%ygX z38wE@;3{(>1@*Mhmr3&+6+#}28qFV!)_EfiHD3qx`}Se?DW^?s5J#q!JaUWJnpcUNKQYB7yMl92ec^M_ ze?8mOW1D;hFqOl;Vi&8##2?;-FI#X$Z;^~&*b<4!z>a=DjHSxj&SZH64z)Do$~b%; zhmTdg&dh9?>rnd$d;cQWKuZx78C>=X0g}nBO|Xq^XZyfYYBT0YZLqBcgbg63zW(lR z_v$0>0)ltU0imUtvgtnx9oh{@HrAEj{WRU%=6i%)sG(Yo8tP7>qykD@=C2HC#Sl`{?z&y3`Hk@ zng>YEy4rNiuvFTPl$lX|C?7v^t1)Rxlj1OYshH8{Ci;Xuci6<*#vxUJSVRks z8zw3JL4ucH@ei+!-yQs88&w><1+A00m&z~+vC3`2=5OX)wd8x+RK9ic^Bd%P*-)7l zpTMP0qXBCNYRfk*o#9#Y!4{PvtQcK&I7mo60duA%hqx&#aXiFro%iayqyvt{Cacv# znE3RGKl%NDHZJm~upf$c3}g$|`coPp^vV9@bP^acg^vPGV)Z6dyl~%0(n-T$qq)mB z8|sdNW!9Y88*A3ta=eneU>VbmF3q2sokDKTZ9uU09dVBwqig%w5+Nd%Au@)JoI<1I zt+}cih*Rx5ThH%xZ`X~_%eGEs#}j%OVnl{eSF0^SPdkaTb>6k{pZw_pYmb@ znsOda`A31Y`aCME7)UuNR9*&(p|pP9plO}HHBOMMp`!PJ)I1f9IH6urg`3+_p)50k zXk9AM7X{JFRM1`(M0GCUJ)uA4WFR8~eK$6k=3M~gRr^GvOMZLn+ElAMjZBp94xr2n zpo~wAyaBReH(U6=0de7nZfxJV8IUrS5cfL-UxYY30l~iCWxsaoAI-hRs>ji+;Ib7; z*gqT7%gyoYSif^9k%C$iLR*2WHQxZ>%^`IABDnP#M6N#~rxW)(r2dHaesigEnxRce zYkaDz8;BKf#~k5;(egCV!H;{=&}5lPZ0=@v1ckjGLQc>Hy+s&#{sau68*ch?VU)zb zYZ6WW3EJ!!M%nmLaSjt!FR_l(&j+jQ;(SV}BVJ)tJsn*7hEY^H)HD!~tfu{fI+k)i zGciF51ESxK64s6G>&9<&img-N3`?d3Q_Y_Z%k_D~=)}+9OQw@j*-PNV*`MlNf(&fJ zE!6YwE#Wi{@A`}3bmWr3zGR;f7W^%{c-sid!n?6%gqV{O?j`5;dpi`T{aO&rXDDI* z>Qq`;`s2HHyTKol#5Wzn~@J>U%fw?V}2G@)v`rej#of`vt-&XezZ!g=7XL z#ld{)heXoS%ZB)(%9J6I(nMv3wjs9#Y@=C-=z63&PrZV{fuzjGS0L^zd^nQzCi=`5 zLGj-$stQQ4tkFFlNmVnzNU3OQngJ;Z|K4727fmxVKtZUwy)p(L*JRH+xk|GAtZJX| zCOjv`p&O=-qMBFH%k1^9Ndu!QX&?^+Z1aD7XFvsQW{I7S7lz&SW(fY1a<%XlwNEZY6o zG_$>-q}!UVN_vA5UUk&>nX^#oWaNkxctJ>@Ze;%@#omU1s^PfG+EH;GOB;iJ3gqdQgY!hw#oK{LW|i=d%X;v{L?O0urB= z+%>qiZi^)!o2;px9;p`N%D(^an?)UeGdNW*w^1nB^&S(}_WHhRB}cq7-ANUDl>N)r zJ+tmcN&s9_XY5?Df&0m2{_(HuXEpG`JG-papPWCIzWH%-7rgVTBw^pG^c7Jfa)O@; z;cps6w|_HqqQ>_OwJGwRVG!L2v2xfu<-WnCf;~Qq_o?%z_}^L0aBztkGJarK=)mE0 z)7`RKDfJs!D94j5)>?i-@l`F0*W>SL;YaP$TFyLz8Zzdnm;o_E2Ret284x}?Vo+%G zDDuB!S;ay8Juosl6j-Jg#-mBU8>%-bfCq>IZ_eyHxH0L_Q3E3fg$@agpjFc>1D$}% zzPwrx6Fp!I>I#jFiWwRiF(4)~n!fteFo0Swv8-&v_euaNDmpZL^q^4Z@KH2ziRD6? zoMKs>;&TiJ@=Ua>fX|jy%P~}=$VAJ^RQ$c6IvwP{Y=f+-(#Hd=4D>e9(vBRxE#s*E zbW1;~mSkC*hIm_A7sCvrqLxv=KnCX3CuQ}vtmUA}(K+UesL)X;DDdXokg9F6tXWa} z(iuv%Kb`TZGr`ODJi}#L+}zTEs?@Qv+WYiRgG&ptPqcK{yUg42TJybev6eMTP@*RQ z?oYF { + await forEachJsonLines(statsPath, (contents, line) => { // Skip the stats metadata line - if (index === 1) return; + if (line === 1) return; - const [_, platform, projectRoot, entryPoint] = line.match(bundlePattern) ?? []; + const [_, platform, projectRoot, entryPoint] = contents.match(bundlePattern) ?? []; if (platform && projectRoot && entryPoint) { entries.push({ - id: String(index), + id: String(line), platform: platform as any, projectRoot, entryPoint, @@ -49,7 +49,7 @@ export async function listStatsEntries(statsPath: string) { * Get the stats entry by id or line number, and parse the data. */ export async function readStatsEntry(statsPath: string, id: number): Promise { - const statsEntry = await parseNDJsonAtLine(statsPath, id); + const statsEntry = await parseJsonLine(statsPath, id); return { id: String(id), platform: statsEntry[0], @@ -80,5 +80,5 @@ export function writeStatsEntry(statsPath: string, stats: StatsEntry) { stats.serializeOptions, ]; - return (writeStatsQueue = writeStatsQueue.then(() => appendNDJsonToFile(statsPath, entry))); + return (writeStatsQueue = writeStatsQueue.then(() => appendJsonLine(statsPath, entry))); } diff --git a/src/utils/__tests__/fixtures/ndjson.json b/src/utils/__tests__/fixtures/ndjson.json new file mode 100644 index 0000000..9720dd6 --- /dev/null +++ b/src/utils/__tests__/fixtures/ndjson.json @@ -0,0 +1,4 @@ +{"name": "Gilbert", "wins": [["straight", "7♣"], ["one pair", "10♥"]]} +{"name": "Alexa", "wins": [["two pair", "4♠"], ["two pair", "9♠"]]} +{"name": "May", "wins": []} +{"name": "Deloise", "wins": [["three of a kind", "5♣"]]} diff --git a/src/utils/__tests__/ndjson.test.ts b/src/utils/__tests__/ndjson.test.ts new file mode 100644 index 0000000..a4251db --- /dev/null +++ b/src/utils/__tests__/ndjson.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, it, mock } from 'bun:test'; +import path from 'path'; + +import { forEachJsonLines, parseJsonLine } from '../ndjson'; + +function fixture(...filePath: string[]) { + return path.join(__dirname, 'fixtures', ...filePath); +} + +describe('forEachJsonLines', () => { + it('iterates each line of file', async () => { + const lines: string[] = []; + await forEachJsonLines(fixture('ndjson.json'), (content) => { + lines.push(content); + }); + + expect(lines).toEqual([ + expect.stringContaining('Gilbert'), + expect.stringContaining('Alexa'), + expect.stringContaining('May'), + expect.stringContaining('Deloise'), + ]); + }); + + it('iterates each line with line numbers starting from 1', async () => { + const onReadLine = mock(); + await forEachJsonLines(fixture('ndjson.json'), onReadLine); + + // Callback is invoked with (content, line, reader) => ... + expect(onReadLine).not.toHaveBeenCalledWith(expect.any(String), 0, expect.any(Object)); + expect(onReadLine).toHaveBeenCalledWith(expect.any(String), 1, expect.any(Object)); + expect(onReadLine).toHaveBeenCalledWith(expect.any(String), 2, expect.any(Object)); + expect(onReadLine).toHaveBeenCalledWith(expect.any(String), 3, expect.any(Object)); + expect(onReadLine).toHaveBeenCalledWith(expect.any(String), 4, expect.any(Object)); + }); +}); + +describe('parseJsonLine', () => { + it('parses a single line from file', async () => { + expect(await parseJsonLine(fixture('ndjson.json'), 1)).toMatchObject({ name: 'Gilbert' }); + expect(await parseJsonLine(fixture('ndjson.json'), 2)).toMatchObject({ name: 'Alexa' }); + expect(await parseJsonLine(fixture('ndjson.json'), 3)).toMatchObject({ name: 'May' }); + expect(await parseJsonLine(fixture('ndjson.json'), 4)).toMatchObject({ name: 'Deloise' }); + }); + + it('throws if single line is not found', async () => { + await expect(parseJsonLine(fixture('ndjson.json'), 99999)).rejects.toThrow( + 'Line 99999 not found in file' + ); + }); +}); diff --git a/src/utils/__tests__/search.test.ts b/src/utils/__tests__/search.test.ts index e887e4b..92c57a7 100644 --- a/src/utils/__tests__/search.test.ts +++ b/src/utils/__tests__/search.test.ts @@ -1,87 +1,90 @@ -import { expect } from 'chai'; -import { describe, it } from 'node:test'; +import { describe, expect, it } from 'bun:test'; import { type StatsModule } from '../../data/types'; import { fuzzyFilterModules } from '../search'; const modules = [ - { path: '/user/expo/node_modules/lodash/lodash.js' }, - { path: '/user/expo/node_modules/expo/package.json' }, - { path: '/user/expo/src/index.ts' }, - { path: '/user/expo/src/app/index.ts' }, -] as StatsModule[]; + asModule({ path: '/user/expo/node_modules/lodash/lodash.js' }), + asModule({ path: '/user/expo/node_modules/expo/package.json' }), + asModule({ path: '/user/expo/src/index.ts' }), + asModule({ path: '/user/expo/src/app/index.ts' }), +]; -describe('fuzzyGlobSearch', () => { +function asModule(module: Pick) { + return module as StatsModule; +} + +describe.skip('fuzzyGlobSearch', () => { describe('include', () => { it('filters by exact file name', () => { - expect(fuzzyFilterModules(modules, { include: 'index.ts' })).to.deep.equal([ - { path: '/user/expo/src/index.ts' }, - { path: '/user/expo/src/app/index.ts' }, + expect(fuzzyFilterModules(modules, { include: 'index.ts' })).toEqual([ + asModule({ path: '/user/expo/src/index.ts' }), + asModule({ path: '/user/expo/src/app/index.ts' }), ]); }); it('filters by exact directory name', () => { - expect(fuzzyFilterModules(modules, { include: 'node_modules' })).to.deep.equal([ - { path: '/user/expo/node_modules/lodash/lodash.js' }, - { path: '/user/expo/node_modules/expo/package.json' }, + expect(fuzzyFilterModules(modules, { include: 'node_modules' })).toEqual([ + asModule({ path: '/user/expo/node_modules/lodash/lodash.js' }), + asModule({ path: '/user/expo/node_modules/expo/package.json' }), ]); }); it('filters by multiple exact file or directory names', () => { - expect(fuzzyFilterModules(modules, { include: 'index.ts, lodash' })).to.deep.equal([ - { path: '/user/expo/src/index.ts' }, - { path: '/user/expo/src/app/index.ts' }, - { path: '/user/expo/node_modules/lodash/lodash.js' }, + expect(fuzzyFilterModules(modules, { include: 'index.ts, lodash' })).toEqual([ + asModule({ path: '/user/expo/src/index.ts' }), + asModule({ path: '/user/expo/src/app/index.ts' }), + asModule({ path: '/user/expo/node_modules/lodash/lodash.js' }), ]); }); it('filters using star pattern on directory', () => { - expect(fuzzyFilterModules(modules, { include: 'src/*' })).to.deep.equal([ - { path: '/user/expo/src/index.ts' }, - { path: '/user/expo/src/app/index.ts' }, + expect(fuzzyFilterModules(modules, { include: 'src/*' })).toEqual([ + asModule({ path: '/user/expo/src/index.ts' }), + asModule({ path: '/user/expo/src/app/index.ts' }), ]); }); it('filters using star pattern on nested directory', () => { - expect(fuzzyFilterModules(modules, { include: 'expo/src/**' })).to.deep.equal([ - { path: '/user/expo/src/index.ts' }, - { path: '/user/expo/src/app/index.ts' }, + expect(fuzzyFilterModules(modules, { include: 'expo/src/**' })).toEqual([ + asModule({ path: '/user/expo/src/index.ts' }), + asModule({ path: '/user/expo/src/app/index.ts' }), ]); }); }); describe('exclude', () => { it('filters by exact file name', () => { - expect(fuzzyFilterModules(modules, { exclude: 'index.ts' })).to.deep.equal([ - { path: '/user/expo/node_modules/lodash/lodash.js' }, - { path: '/user/expo/node_modules/expo/package.json' }, + expect(fuzzyFilterModules(modules, { exclude: 'index.ts' })).toEqual([ + asModule({ path: '/user/expo/node_modules/lodash/lodash.js' }), + asModule({ path: '/user/expo/node_modules/expo/package.json' }), ]); }); it('filters by exact directory name', () => { - expect(fuzzyFilterModules(modules, { exclude: 'node_modules' })).to.deep.equal([ - { path: '/user/expo/src/index.ts' }, - { path: '/user/expo/src/app/index.ts' }, + expect(fuzzyFilterModules(modules, { exclude: 'node_modules' })).toEqual([ + asModule({ path: '/user/expo/src/index.ts' }), + asModule({ path: '/user/expo/src/app/index.ts' }), ]); }); it('filters by multiple exact file or directory names', () => { - expect(fuzzyFilterModules(modules, { exclude: 'index.ts, lodash' })).to.deep.equal([ - { path: '/user/expo/node_modules/expo/package.json' }, + expect(fuzzyFilterModules(modules, { exclude: 'index.ts, lodash' })).toEqual([ + asModule({ path: '/user/expo/node_modules/expo/package.json' }), ]); }); it('filters using star pattern on directory', () => { - expect(fuzzyFilterModules(modules, { exclude: 'src/*' })).to.deep.equal([ - { path: '/user/expo/node_modules/lodash/lodash.js' }, - { path: '/user/expo/node_modules/expo/package.json' }, + expect(fuzzyFilterModules(modules, { exclude: 'src/*' })).toEqual([ + asModule({ path: '/user/expo/node_modules/lodash/lodash.js' }), + asModule({ path: '/user/expo/node_modules/expo/package.json' }), ]); }); it('filters using star pattern on nested directory', () => { - expect(fuzzyFilterModules(modules, { exclude: 'expo/src/**' })).to.deep.equal([ - { path: '/user/expo/node_modules/lodash/lodash.js' }, - { path: '/user/expo/node_modules/expo/package.json' }, + expect(fuzzyFilterModules(modules, { exclude: 'expo/src/**' })).toEqual([ + asModule({ path: '/user/expo/node_modules/lodash/lodash.js' }), + asModule({ path: '/user/expo/node_modules/expo/package.json' }), ]); }); }); diff --git a/src/utils/ndjson.ts b/src/utils/ndjson.ts index dba7a09..b5070be 100644 --- a/src/utils/ndjson.ts +++ b/src/utils/ndjson.ts @@ -1,18 +1,22 @@ import events from 'events'; import fs from 'fs'; import readline from 'readline'; +import stream from 'stream'; +import { disassembler } from 'stream-json/Disassembler'; +import { stringer } from 'stream-json/Stringer'; /** - * Efficiently map through all lines within the Newline-Delimited JSON (ndjson) file, using streams. - * This won't parse the actual JSON but returns the partial string instead. - * Note, line numbers starts at `1`. + * Iterate through lines of a ndjson/jsonl file using streams. + * This won't parse the actual JSON but invokes the callback for each line. + * + * @note Line numbers starts at `1` */ -export async function mapNDJson( +export async function forEachJsonLines( filePath: string, - callback: (line: number, contents: string) => any + callback: (lineContent: string, lineNumber: number, reader: readline.Interface) => any ) { - const stream = fs.createReadStream(filePath); - const reader = readline.createInterface({ input: stream }); + const input = fs.createReadStream(filePath); + const reader = readline.createInterface({ input }); let lineNumber = 1; reader.on('error', (error) => { @@ -20,60 +24,42 @@ export async function mapNDJson( }); reader.on('line', (contents) => { - callback(lineNumber++, contents); + callback(contents, lineNumber++, reader); }); await events.once(reader, 'close'); - stream.close(); } /** - * Efficiently parse a single line from a Newline-Delimited JSON (ndjson) file, using streams. - * Note, line numbers starts at `1`. + * Parse a single line of a jsonl/ndjson file using streams. + * Once the line is found, iteration is stopped and the parsed JSON is returned. + * + * @note Line numbers starts at `1` */ -export async function parseNDJsonAtLine(filePath: string, line: number): Promise { - const stream = fs.createReadStream(filePath); - const reader = readline.createInterface({ input: stream }); +export async function parseJsonLine(filePath: string, lineNumber: number): Promise { + let lineContent = ''; - let lineContents; - let lineNumber = 1; - - reader.on('error', (error) => { - throw error; - }); - - reader.on('line', (contents) => { - if (lineNumber++ === line) { - lineContents = contents; + await forEachJsonLines(filePath, (content, line, reader) => { + if (line === lineNumber) { + lineContent = content; reader.close(); } }); - await events.once(reader, 'close'); - stream.close(); - - if (!lineContents) { - throw new Error(`Line ${line} not found in file: ${filePath}`); + if (!lineContent) { + throw new Error(`Line ${lineNumber} not found in file: ${filePath}`); } - return JSON.parse(lineContents); + return JSON.parse(lineContent); } -/** Efficiently append a new line to a Newline-Delimited JSON (ndjson) file, using streams. */ -export async function appendNDJsonToFile(filePath: string, data: unknown): Promise { - // Note(cedric): keep this dependency inlined to avoid loading it in the WebUI - const bfj = require('bfj'); - await bfj.write(filePath, data, { - // Force stream to append to file - flags: 'a', - // Ignore all complex data types, which shouldn't exist in the data - buffers: 'ignore', - circular: 'ignore', - iterables: 'ignore', - promises: 'ignore', - // Only enable maps, as the graph dependencies are stored as a map - maps: 'object', - }); +/** Append a single line of json data to a jsonl/ndjson file using streams. */ +export async function appendJsonLine(filePath: string, data: unknown): Promise { + const input = stream.Readable.from([data] as any, { objectMode: true }); + const output = fs.createWriteStream(filePath, { flags: 'a' }); + + input.pipe(disassembler()).pipe(stringer()).pipe(output); + await events.once(output, 'finish'); await fs.promises.appendFile(filePath, '\n', 'utf-8'); } diff --git a/src/utils/stats.ts b/src/utils/stats.ts index 9d2f994..8a32f20 100644 --- a/src/utils/stats.ts +++ b/src/utils/stats.ts @@ -4,7 +4,7 @@ import path from 'path'; import { name, version } from '../../package.json'; import { env } from '../utils/env'; import { AtlasValidationError } from '../utils/errors'; -import { parseNDJsonAtLine } from '../utils/ndjson'; +import { parseJsonLine } from '../utils/ndjson'; export type StatsMetadata = { name: string; version: string }; @@ -28,7 +28,7 @@ export async function validateStatsFile(statsFile: string, metadata = getStatsMe return; } - const data = await parseNDJsonAtLine(statsFile, 1); + const data = await parseJsonLine(statsFile, 1); if (data.name !== metadata.name || data.version !== metadata.version) { throw new AtlasValidationError('STATS_FILE_INCOMPATIBLE', statsFile, data.version);