From afabcd1547c649a32869ff1763026827d768e6ed Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 15 Apr 2025 09:35:13 -0600 Subject: [PATCH] Update block diagnostics (#28006) Release Notes: - "Block" diagnostics (that show up in the diagnostics view, or when using `f8`/`shift-f8`) are rendered more clearly - `f8`/`shift-f8` now always go to the "next" or "prev" diagnostic, regardless of the state of the editor ![Screenshot 2025-04-09 at 16 42 09](https://github.com/user-attachments/assets/ae6d2ff6-5183-4b74-89d0-fefee1aa11e3) --------- Co-authored-by: Kirill Bulatov Co-authored-by: Julia Ryan --- Cargo.lock | 5 + crates/auto_update_helper/app-icon.ico | Bin 590611 -> 0 bytes crates/diagnostics/Cargo.toml | 6 + crates/diagnostics/src/diagnostic_renderer.rs | 302 ++++ crates/diagnostics/src/diagnostics.rs | 761 +++------ crates/diagnostics/src/diagnostics_tests.rs | 1446 +++++++++-------- crates/editor/src/display_map/block_map.rs | 14 +- crates/editor/src/editor.rs | 560 ++----- crates/editor/src/editor_tests.rs | 270 --- crates/editor/src/element.rs | 133 +- crates/editor/src/hover_popover.rs | 30 +- crates/editor/src/test.rs | 138 +- crates/gpui/src/elements/text.rs | 19 + crates/language/src/buffer.rs | 1 + crates/language/src/language.rs | 8 +- crates/markdown/src/markdown.rs | 52 +- crates/multi_buffer/src/multi_buffer.rs | 36 +- 17 files changed, 1794 insertions(+), 1987 deletions(-) create mode 100644 crates/diagnostics/src/diagnostic_renderer.rs diff --git a/Cargo.lock b/Cargo.lock index 9ee0f5c3ea..e2f767145f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4315,19 +4315,24 @@ dependencies = [ "anyhow", "client", "collections", + "component", "ctor", "editor", "env_logger 0.11.8", "gpui", + "indoc", "language", + "linkme", "log", "lsp", + "markdown", "pretty_assertions", "project", "rand 0.8.5", "serde", "serde_json", "settings", + "text", "theme", "ui", "unindent", diff --git a/crates/auto_update_helper/app-icon.ico b/crates/auto_update_helper/app-icon.ico index 321e90fcfa15d8f84c2619b4d12af892ea5cda66..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 590611 zcmeF42b`Wowf{GDd*AG)Y_dJu-|g9iPy&GvTIkYS2rZ;i(&)W6>4e@PARs7;AfPCE zuZmO~C@6X@2#V!;uini6_dWB>`#!tbka8Eq```DoXXh#NJkQMUoH;XdX68&<+OV|D zw1R>(g_UW?j!a9tE-fu>>{x$(VP;y|T3xHG^yl|0-uZcHY3=RNd0kpsq9QGA#teVn zuw7c(8{4O)9e#Lp{~A4iep=d@XGZrkhNay*VOSbJzSmGWGVOac!;|L|pBiu`FXi6Hz(UDM2J>xzVFXi$=NZ>@1g`pYL*cPe#Tz;T<_SIrDk%==5~gnn<`+t4?vB`OJQ9pMCam zbLQ;sX799<+hw;ouA;KazVE-2w=g`Pmshxe_onL`wRN@bp@$!Kt5&Xbha7aEJMe)0 z-5$H|?zY%sx|=z3rpwC8c7;X7q;*kvzOcA>L2+@B%g#)92OM~S>zOjeeeQFgbIX>U z>~`9DXSdTXySOd4+{$%!cDg)$r({g2D=schet*oEF$>3zEmOX7-0{aRaEBjuxSKU= zmb?Ff2i)AbN4oNflU#d8muqfram6JiZtS>mZtU2x3&Quuj~~Bq;>2=SR8-`SKIT|= z%E}dPpS|~V7hiOtd;IawyN1b=U1@2ltE;PXnI7;XtgoxRHPPDa z+H^0GXj9nk+S@x^M`u?=-QsJno4&;suDh$_j`*|TxTU3Gi?)`gV-tzy`R!19LSbTl zqM7r={EkH8xbE)uKHm+`{D@{Fzmb)du?k(B zt#srUSJ?RcrCXiwnZvJt{xf7Nybqg0PaK{{dv^(O6 zBiw-p9_S7^F8we{AnrKQ=hFD@=o z9W#b+^r>gbOL6g-he~y?bWE{iEZyy`I`Yb^uCnxOyWO_#x#ym9H{WuLTfBIQ>AQx; zCeMed(_CX?gVoX0U!|pGZcOQzb>3fEI`-jlW5>DiZuadF=b=NT0NyYZk_j!9XH`2uqdA} z-sE$ieLmyPI`d4oRQ1K&BMx)(j-0EyXPJBJtvB6N$yJf~SX)!8?=-7^sixj^<5dTh zPn_r`Oqj6F`&Ab{RG~VqqGBR-wA)whh;z<9Tj@X1?YG}P%ENwc_3E44U3cB-zWL2> z+BYaulU2V|s@}1*l}}V#qmnvuo%c_iSn+VRFsQ1kaH{v+e)}Kb&OGZZw`A!O_s~NR zS^HtG^01%2bNvlBxc~m||8`q%wUx?quAZq>x+?Tu>bGjJT<8526_pRy*3>A^Rj#b8 z%pIn-#ATOVX65ok@nEIeMkg;@;g+pf=@u+nEV)0`J^$SEZU?n(%GEX?ZK|7HjozVf z9r>)Ns(z4mME&GiH%V=dnUcM4ed}AQpD%ako^y`7;DQU?1s7iAE;PE>oqqZmhSM*8 z{&UscN|);8I+bPcs;;S7=lxYRwRhG{u6L8`>s(_~gS81}?XbN&YTjJ6iw+hY;toGl zq>yrU)Vw1s+0q zlf*Mm@CK@`u2j5gOAGO)^iEY7?y_$rbgp*CivI5xZl!g#dbipr^-4#h~@{qy{@af$Mvd>V)xxS{hGIv^L(J zXlcF=YD=`--`?8#K%lnPmIt^dy04=xabJ6T%N<=EZOgaVVvEx7o}qB#5TG4aDViao zU&!xFI)FpJO+|ptbe1T46NzU=h&Jn&m6bDJZI0*FPJBBnGwU~*nOVOz%2H^Q9Sb?m z{;lGsC_DQ%YJ0q+KK9qrGcy-#LLy4kR(pju5pBZI-po-uCPixVsZE(A+JKxBCds!y zY4>I4*dK-b# zwKiL6BOSu+Wu-ypfPsIsk$qcL&*tgdYJV0LdMZ>{ptdpX(R{Vj@*t&ceT3ZtqTQ_e zTxq~|VeRCD2mZQ*EGz3#`@Yg^?R~zl_Hv=xZrDAtMYJcC54Df8EaVu{v$_{ZI4PaJ z{cP=8vjxzGRyv+o-}jZiSHOw>0wK1ALfHUlSLaC{%G3@Uqjp+JiR=v}W7M80QTkF; zsADK!?Okjq*hQ?}Yj&8Bj$Gtmz@PH`W{&zf#xKJ_wwqzY+!<$_>HhGCKe%U~ea^l3 z;;dg>|n`OkmeJ^0`nwVm#At8c#9U3=|y?y9Rk>#n}$8n@eSbCiY*wdo42 zPhg?aA-l}a2K=}#DvxjF<$<-A9e6iVeUt5X*un9eJ9n-dt-eWVNwF(adzWyG_*0^G z9c?@EN;@2z(fQ|}Z{L+18HS+`AWYs~-}jZqx2!LqXOR0s@etlCzT0NT4EMX={my;% zvsbD8c$T~TvP<20=bqzEJ!O?U@x&9{;zf&OCz)&Qbjt3DC!T0&!VX3Mpin#^ZA#;M zzppqy#pY8aoQfsyxw%yGZPfqR*YbJDA%|FdxUi_uFe%Zu$Ecs7 z_pkT+lIypzYn6_XO{{E;a4WF3{VT7$qPBgxTe4({`jtDlX|mby`{gfxskZ5b?uHv~ zbd^;#u3POP`kVA;_S|z%vyow6qs;K_QnjB&>-~ON+1R(~Phj_&Fn+AzhOLh8m+2jM z-Fc_G;QaF}uhXYbckjRdf%VyHs%zA?tdWhW!`hVUGr8@z-@)v9Me zAMTpex5K8$cc!UbNQiAwwn35JD-2~XT<`aF|LuwDM@=lBpgze&d$vmXdiB*;U4{Av zt8co|ophr5k=-4J{};aSguefQ9naZySC^fYY5k1~*&`DwgXD$&(*#K0R{x3f^?qM{ zwYMvyz8dXy`gPScb@u%#^~G+x?N+y9#WKUcySqy|W>@uTyWN56qyOeNzcIURw)Ak7 z`a8AioA5pIL*H(i?BQ!TtNc|GQhU za)n#IV!6>u*;S8UaJ+l^nWqhhJ@?pCIAj?Pq=WvQ`fy4MeGu!5t@rzi_cndn8u}@< z)t2`9`bPK08*i9=HK_k_)9Tgkjyvyix88Ppl5W4_F7^4ZmJYtf{r>mAcYE)(m+25} zxS{_?I_Lu`4eR}WWmWZ0iBl^(>tyu@;RSv8ci(;2?WOWWACLR>D(?*qO|GG_*~t1r zO)Zwklce|f9dgh?Zle11*mvo_k`C;|%HMjwFIoEu{kXci8rRq`S$)#UvOA2Eo;}z7 zN@e{AKX}8v@%roT^#KTse(-}IxbKKRfBMsh?#e4Jm&{IZ&9ZScs_z#1s7n9O($@2n zti24s88fKY_ZyoUWoKx#ve?qxs6Je?l|A}t97EP;(|Kom!u51@xZd7w_1DyYYim_G zQGczy&9%yojm@6?DF3go=ksaR)wOHTr8V@Y>nA7svyJN4lBPQG1Z)W5Prdq#_4U}# zmDa||($Nj-iz;3EW|#Ve*x~5kw#x?I($uuJS$Po;9$DY_We3<5zQU)v$&=S&D{2s5 zt-l-fbwi)GxwTb&Ugb@cAdd>$Iy+rE-;-UwL%O)Dr&oR89{R3pNdtEJ#>tcST;KP( zu5UlnqIA~F#!sKWQE6zDtp}nGGFemKySXJHQr|nlx7F{K?rlv{r)%p_8oGLv{~qz7 z+fAP~RlI6_{-eGfeLuaiuJ+mXh`;I+TVFh(FrhrB`sT86k*BDCP9L5AdOPP)AH7>R zV6)m%_4btRuCGfcZ?q-8rE&6}iPnZSiI%3963tCNQh)u&lDD5IJwK7my(v4vTguN{ z>Z`xi-q!k-?!VdArh9FzKT+TP#|nR>@TJbqwudB>dv7S;L-+sxL;yPlV?~FHl6H!Z z91T&#q2CY!LkO%7feekGb!v{oKBF=+j@H=XqV)94r5{O|x(|hT;XEGNJ>HdmjNZMk zzR{%wY;=9HzQo3^=g8)Dc6N5|+t@%D(+hS0AIkoLU1CF|XM+vLhuELiB^wjX%Kmvq zR+eVdq-h4u=Kn^G%Ia2ne~FC*+ZDE(Tz%8VMzQ-ugbirpX@IA>A4S^@Pm_n;Z9XBAZ(jk{|4BVLndC-#X{y+u}v`L8U#|49SPt znaGdwqC7C}+r5c-7$w`+&#+I4)?#bP$95vSiIHq5N&8{ahKL;z!j>40eaL*7T(c{B z`w#rHbGt^KQ`aqD5kF(s#+oRbZu`Pb24N`d`4n#i5zm5ZOjr{uWd%3hSmzjCu#-?9m`>!C+*d&o5?2Ezf zSR~sCR4n^TkqA3h0i^se4*ecQ_<GyU{@R!|EX=bhhwkvPHk{wpIG3FOwOVqf%(hiXiXrS|O&xe-pSpE$I$!o|% zj2{Dz)5Y^8dv6!x;ozPsN8$lxKzsE)woLkk&AFBjmx}q4e_&_|c|*&Ebb1;pQGW z&xm8@R~&Tk!DegRZ@>NAzWaX0?JfJ`9((TP=4fsma~XEl{D|2*?d)dlxRcv)_D(hj z1REr_a%`cN{yw}Ek0R_8?h?m(pkt+TSNLxBYIL#bHt7f}YZ~v6EuQ%-*e>{Cr~0q| z`Y-plzx~bTUA+JP`)0@d`8)5pH#MK+_19l>-}~P8Z0!4MU;CQo$UQB)>yxr^KkgoW z_;Z?f_k_Fj(#yoxV$+w{lRZW9DETwKd;aV-P@3b{l>Rx$F>_nc`{-q_?^1e$xjCnt zda9+L@pnBhyJ(r&M8;#MEGyNyNH$_W2Lv0d$ZWWj8|ICa3fFv_UvSSo_t?Be>3PH7 z_+Vv9dBILkxq~P9`TNAvI?!=$LBa0ipK@pQ7P?2+GiM3?h`z~{ERyDxD_2<_mM!zP zJFblwHUJIRwc*3uh!Mk$h&N2-fb=4(j4f=Xxf9GEMHiSo-E8XEx&1f;_VbNNzw){V zyfk}1@~-zY|A)C(=z4S}@;Hn#sB~ak=Z7tnc_P@MUVi!e?%Utic!=iMeCbP1x${?& z4dbu$?@4)rhlTJ>dX2HN;v$98`y=&D=F7gObYk}=56tD{$GjuPN3Om0TG2J`a?SO) z;DYnrnVNTlJ@Z7(jX73xtFF=gvou$Rd1Bb_&(ge>-rgyiXOv;One_WHC_lacKkR&? z(qFunACJ(pk~!+BlH!O;iY&eJH5ZECMA=S92{ZC=$|K(>uNGsQk#2`|dB@Yp=bgxn|G1d+)p7Y{H|{Gi{Fc5t{Fej%EzzNIlyo zn;GRwbIn9btFGIarln(yjgxF-`uAmA#m0;D9>$BtjV;wUhxDRs#v?|Ka>r=yG{5m0 z2Lby({_&4iMgt$tIO7bvkDN1}n@F^)TwGvtYt#?2It$+9-zWh$o_{%8i^tazu`ZdpP z^r#V<+tn_4UZ{Mf*}Qr(dbacnd6=N|Fs~eY>a?lTlpgU{>7O}sdmDQ|X5q0XeP3}c zElNAzCT)7pNB)RYu6ccaTukFs8mlN*`fdD6<&`qW+1G1-waD{_{Y4&@HND+Ee|z} zyD43aCol$Qn1Qo!V{FjI2Q3|wm?ODS=~ueRQqQ1NR^k-Zsh1uc5m78<(BUYR7X=+F^&iiJ^61MZu&Md z05QHvs5zJlCv8xEeEO?>`X%3tuhwYH6aF&hOS^92!o`-3+S)ps5B}zxZ`wSNTW-BY zdj4K_-~IQgy(7B+ep}n}z=IFEd+xp0U48Y{?$3YzvpsvR#_qDz2O{lZ9FY8gGvlHu zs<3N}FK$fwCrp^MFJtcT6PdBOoth)dxGxycwqB(9u>2Y{KU6jX8z+A2t+(8-e)TK& z&O1MM?`RHdk~kOr;upWLYv23cOYRMgC-S>Ua|~#k*Xg~CsWLw5=lmj9evFs=kQTgL4C z%H3-;51VI@8^)_iKjV^&6Vtw;y~1zXZMJcg!PXXy;V~ZD*l6<f(iA&wd zny*B7l7%`xLD$sgXY8J9%M_P+CM%XNbEm9Y=~im41J`!jb!U5Dr^b6V_NXysjgO0$ z@B%*A7`spZP8*UR@u-cl_G)B^awT3eN4x>~;Jr$Bv#3U8ns(jTGUfz{)V>}!c8uB^ zWfpQgUiT+xeZquss#itj6UM537$+W)BBHi)w50s;X=MQB&*l5XS78BX0B1)y|@=)!d@-bLEG;@ckyufhP>q z($c6lCHEREOfa{gjWOpIjU#J(S=80tsj+;eTWO!tJ4N9X>j!jnbXfbMMc+y0LFrfh zRSFJayQ`C;yYg*s;5LW{l+CDgu2w0GEXo3OR{44qmZ zV5Ip3-CAoX>V!0}pp$tHibuPMc>>ID&>Wq^H#YsmtFNp3F6~5x(gVKyQ(uvXFz>;y zIf!@>)*TQs4?=4X$cxQ`klt(+F&84y-f8n8e5f@E?V5|yHN~}eD&0}~yOjPe z)@ptN^Hg5jl(Z99b;nrMDSvE{TsKNDOMk9Kub~&3k$+@Kd1-1=c@QOazGSOaX*d0^ zr&qI^@+Pkhx!kj#8%T5tEs&RUnUi*)3!ot=r@IueOF9f{^STBAFsqa!g#ad*=*ySBHq?4oro zJ3}2Etvl)dY&|ne$J=!2MVc3tKNx8pddCm~LkJ8Z@Npx+Jgpg`GeyIq^<-(=>160P zguoC2LkJ8ZFjxq%J~2bYoHSPK(wF`?iEr>N=JN6Ff5xvuW9kQK{pFQfn*a6( z<}g4xIjozF&GXYZEH+n9{jYz-Iqz8KJ?qYc9B6K&&Bx2m{!sp0Zv41#7@e89m-707 z&6~V%v5Ju5_D)E7J%i_e~5UxkTYvvCH zzUOhC%N!Pw(&y(IM)NMk|A5EFgviRk@xXyOnSS11n2SkhSj0l+W7(W6;gF^Hnya{Q zbMqU2PVdh`B(1 z?y3)MUQ>h%^PDzBVcsh7$YY4_=eX(`*Q57@;~;ZhE_``Y{tW{^zcu?0%JW9qb_c>n za({YqzG)-_ee)m9do2i|pZ6N(zQ*Uj+S>ZOXpOx>Ki4%icg>%3ooj)j@@EjWtcc~W00y~u~;c$-biydo?Ai+NATf8c*o2PiEz z|IzaA^Bv}hG0)A<)$2FsQ#j;7`4L6O0iS@2-M4!wtinA%CmB4!!ei#~P+XG-+9fF+ z2_}+(b^H`<2oKFyzLt4oKL4R^Nyz}|@iM@Caphn0*_e-L*JF8PUPE%ut<}+?O~bpw zu|n~!&$-oO(e>ya?+Nb*Gw?^gk}`&@2m@=EQ65B;Bjx|r4du80eewPwbR9Bpx-`_U z3XuV;1B5?g>w(wI*=8Qu$WfY`A>w$%h*9#HC%<{ap%Jl=WBJnKUXm1_XX0e<;eF|D zcyt{MY)rqv&tc`5`3p8THIkdSo)!*I^v~ah&h^ZbKL6n7`5*KE<$}4offvLBlPj*c z(!KQ3OPb^QZTFq;e8+uDA#-29{`Ie$Upaj6efi5zxi88WD84`*dE^ndX3ZL#6LQzx zcWWN(9p-!P#v5;P*IjqL=7n5izUeNz{0euu=EgGDZpOCTxe=pASs4oRsr%-i`N%3? zk~?^Wj3_V9ZYaO~@9UXoD2K?LZ{vC#(5qJOA_M3iy`Op4_^%7Uzx?GdHlOA1fB(Dt z&;R^Sn?K8Z^7r0*&oQR|bIl|9spggZ=tn=Yd5~cCZ~yjh!s;95E9L2@pV9o_FS{q? zx8t$L9&-=Nm+bxbKj0pH^ij<#f82Z{GFRQ_-|Lt#M?N1}(ELL%pnNhvTNu31KYtrK zmmkGvk*VZ-bCt*BobyPp`g%&f7SWSgS>|^H44(PwS8W{w_?I(ZjX8gs1Lo(TYaE_A z=#b`ghI#0OHn)^{shZDf^K8+h%vlj>t(nH;Yc(J39-EguO69`%Oa5Y%uX!+`ESP>a zJn~=MP=5R07kl1Q4MflYuE_%WH*v!bt)VuxK1j-+CrB<$7srg?SmVfWVCN{TSb2kfw0lENOqWSro zp8tY^=a8>tSyDMjwL8?trM)Zp4{adIfz5rF4*ZJNLh!@q&jih}WIkk_=KIt!--@|E zn$uE)e?86L9+ha`2U}e8n*Mpa1zE zEB|()f2=9N-^6>r`<=}dVvgMFufOKL``zza`G5A=XAL*jl02ySajcUWJv!aW7jw8- z*RgQnLdk^uttw6A51&)k=1_X6gFX3U+9aEm|H7iLQSMByh_}XP)px9K!`Dz)H-HXM zKg->E>#e5e%T&&(2jdu!_pf~ADf2~*Og!<#6Q=tgc;Eq>pM0}?L0xyL7Vc&oizqIC!4AD>r0{pnAQ#mteW|Ecx4=J%C#LHyRNc`&IDY%QYt zvdFae0Y;xKJn~3A%epA?pUSV-nauHnw6;Q6 zpi`BHP0oK&Ny!V~ZEG|nQ(?Wu809%o@E65;kMDo~`<74mkDg+#J~|2??g0bJ1bifK zlxyyz-?XOJ=F`&#WNm`{sT+pJFIXsfxK#7b$J_jBS;_-;O^SdSrM zjR-{A!P3TZ|xLR0zMpZuQ>Pj4iuK*xyaIRRQAf!)?Ah|cG{M@&tb1UN z@Bs%LAYJUsek_lM9T-6&|Izx6P0qjG@gi#!cu!dG!FrW4<(ah;Wk$>;Emr>1-AfVw zNo%_NxFNG=Xnhc}%32Wk{j}PD{eK^R_$T)ht*86ui!W-f_I);|le|;+9wcl|I%%2a zzL%>VmTzk(juIy5MA|mUzU5D{=GTUJzr=oxi})|uXWfG8kxkEkY1xZmy$e3opfVA8 z$G7n~t-ly6BLDcU3;ZYF$T#x>`QZyJJ$ zCxA^L)~K+y2BO_58Q5h0>m4t~*W0i^18Z)|!9*d5H7{U;4#dwkzh}SttZZ9(Y6q8UPH8=Jc@0C-zV+5KZ2t=KPhAW@cG-1T z`HKll4HDPTIGRQHq&-$Fr;lK3Qi@XQEnLjv%sWm%VpQ1Jz>mk6L`tJKL zd;U+-x`NT8M#=|sz2)zP7ryRtvNF`>A7gW+cieH7+VRyU2hT=25iGD}6-hprN6q>X zzBxr}+qP4GkM$zxA@Yx(JbVax-uv}aq>+1mZINHw6V@8p`kwLQH<|zBpJ)9$wbn=L zeOPZb!Pfmuu=Omg13};CXx!oDDF38CWArGS+Xw*UKQAX!dxMOYuj(TWlU4Eu7y1VD zfBAtyvC1?$rYgdK`GM?LQK5Aj_!A_bTWz_OuJ!sdDgGjZVJ#DSGI=cCfg$Z^g`1pz z@%}~Dh#&*3MY4P=@3hTnqifBAt+S+VrjPjY%dc2ISgVnxbu`Rb=SThv^3~SKN|*nA zzrK$BM3^tWeEG>XU;M9s{j0@&PHkV-MbbZHjR5o9nLAmbZ%t4-$P2!)J3Bjth37qa zWc?DnKpuU1{Td^`<_KSY6E`{kdf$tzk0I}@mm<#5tW~fwAq>EQIiajGAm5fY z<(qu6o(g$|IOZBWBAvo*)AL_G@kQ3!`1kOxa;=kK%?)d=6e^#r$0GmO8>r{_S=mvVc=9OcAZEbC~{D0#c-%!1mXSjh4ZAko-5|)Tcr57RW+SFzA|M-Cc`W+sd zA3)aKC>_WHYnDtVA|8jl5|UolKl@|+Qpzu6#pdLH;)~?ZWC%G@|J?js(r=Hg`wIC_ z@}K-`oTg24hZi!i7bKUup2Q4WKQ`?UJCZKj*V7edx4s0?f-|FzyN@LzTc$~JllKKlKIw01(@ zp{*A3&zcDAQmjh}zvsX9y!5~~)W-d$wR36fLN7wvJAwTZ2(g>eHo~7o_^~$wx}Wu- ztec@cuoeqF8;COQ*Oi5Ja+Fhlzee#lH~*~bv-c?9RibL~KKL4CUnSP!AZtZxuZ8^A zX^js34{Q(@$$!D-{-_iFA=?Q*%ECD50_;Op{>4+u0fZcAZIBT-K%|*4tWVSNCi7pq z??vp5$W`Dwdum|EV%=I;LxPT^y&BIy`=5{o#za`tV|z$-Y3)ZRdpz{mdKT7Hn7>Q; zyd<15bqk~3Y119Vx_*4AutuKW*Ci9IbFP$3vu+}+XA2lmCXole>v`ta>5)#IZ*u;H z=?knY1Y0X_dcXO3RlC;KJt;&FBX?ueR>z+zKjaku5`?t9v72B+!Y1MS=J+2_zfv?t z>ko?wwFYtQINFlQa_Ng|m3!8Vur|@JuVjs-_Zb_? z1iUBhmd4Gr;RT6Y84S{BvgtYK`yFR9is`DD43K+UFKBBXweArf=>7PQ zSt482$MwTz$~a2+?XuHsvmdjD%J5Y>Y;B}M`rXL9uP42XBFmeUc}3QqFkiIwlF|F9 zbCG-2l6nm4E&skfQfFB8 zA`9f7w0Jp4uJ3(pQ}eHUUupT54q&~h?IReK`+8yR*PUveS~F|aJh5gI`S9zS(GyCu zh_InvYi%3wQS9^6pnO4%T#tx2O)6V0THD#&R4?9YO_|z}ti|f+U~Q+?St;*RoDpR9l;>x`uKPU)u>Dl7Hp}Zql!^vgYVi{sRUoPs$(pw{@%NHNL6*vu?FnJn%lS zS)0n*J>DntYyB!~S;;HcwQfs!WnVDmxl8<3etV~?o}A*> zwX&wQr$=iO)fem%u`ZOdz?wU&8zckhX|T|`&&8XRc|}&6p^<&4l53_ZQzF`Tll4y4 z?6U5ab*_H>tMV&3v}=+BuxJqmEtF671^qc|ViiyKT9wyU-6KqpXFF&AN%@Rs{T=)k zuc7W9tzQ(+yOsAY<+-P~S8W8XVWcmtIsyzj+O>{T-)~E(P9bgL5rl3~+3ncW{1ab! zf6LbUstiyUCi5?y!dlaYh*cQy;a;osR$GVGo+@lndhrKt zq;vM-;GV6g?a*4;Zv2BQkMLS;q7Jp62)kqh=_1rQ6fj^-t;vBfz;+-E@bS1=Kh=9j zHJX2O+TFfhp+04=Qj-B&bL;b-TrV80w+-u|@l^mOVcjjqti26ui1A^-aeD`AZrd#$ z{>j^P4z+js^~CHG#=7Emts{=FE5>Iz>xzB;{o3N73(S9def=iOejKdHwUd8D9VdOd z*6UUD8g&5mpVl1ytv!}3*ji)cL3kwBg-cGj4;DdIz#^givS!!gf-Gq5 ztJdwBpLVV7O|DJWHS*4yWY#8k(S{b0|1L=7pi?r_+1|dEHK$sW`;PMRznUYjx=$)k zdfSs>VCR%C=|8AR`DUFmA#0bDzUR3P@8LNi>#r5k&I{LBvurY;kagIsS0-%Hx$O}r zT!NqaL>n?8c@QS_B|_diB^N#PD^yP8t6*)f%1SqSv9+}|&dbd`Zmg@@x>5OO%{KKD zwmoa#qF*E%*rURF=O)R7?JGjwb-h_3?cG4FJ z_0fSWs7&B9A0KVqUGjM#J-NlSURx*K+uJp3bMrgUbIrB2YUWvTTNFVa!S|RJw5DB{_*^@W_-TdCfZM+#nyp$Qcp+g#aTB_n-s#|2kkW0kaJFX zWZgJx#;2$*C#3D>*O=3uV_iA@9>o`RDR0Cf#PY^d`BYjTx(0?v&8L4v_7N#8=i*r%vXfTQ|j+LrTYCzJ^z^K z9=-Rn?#{NOB^QZxQ#f>G2!SC4h7cG+UlJG%T%B|K&5{8ViR0 z4Iwauzz_mM2n-=GguoC2LkJ8ZFoeJm0)veJ<1-^g_%p(<5&kO1h}ctWoM?PR6BPb4 zDWromk+xD1X$`)ZM(Ox}HP)o(KdB$-%obIOw$b{WxmuHOrq*L!uk~2>Yc1>Nb^awC zKP~#I&Yy#{2JJbW>p0s&JCEP9<7|r?;)js9_8jjp(mV8?%xvO&@^Soq|6CL&y02@` zik{XS(JyOF?Bhzy14{FaO6xhw!#s%*9uBKTIilgBPvfsZYvN`qA6IH!{mY`ih4tlx z!QTLD?l+loV$Z~n`@hS+6Mc(#eTeHDCf55W<3-0>2lC$;S=p~??c=q|<7|Py*}i8! z2F6i7r)v$?L#*jfu4`A?S(B8)+ONwrA2M02%k*nAS)b`CT-(erThGNQ`Hkp(;uUM% zLwZ|+z-bd`^eXs@xk-MrYz`wR7Tdu%Z17UK2WH` zKgnOA>Z&gp?ss&N3w+v5pTuvt+7tJ99iwzczUzYA8}{M} z>kf^QJP5w*;E8;W<)(O$rd;w7bf*&PR?4>@4^`TSsxRKb==@zV0`fY z;qWt3pfyD1Q!s>q7s-(Qpv40y!g-xgar<23Jh~Qm)91c$G(N`SSiJu4iQ^tW7EioB zLoY@6t6pJ!Fg&1~z%%*FSoN`juQssi#lK|>7o}q@e4xFS3-!TXvX2j!b;$2)>V3RK zzFx!=^Jxe_BEkobk?;wAao}Az{^$_?`R9x$;aF)6*9pVD5c+$uZzz7a=gX8YOCJ9e z52CtWJn%dc51KzN9;mIe8o7zL8>Bq)fk%X)%=mZ2 zFpV&d`y}+dSU1k5T^C;{cjB+{Ac?=11$$SLUojtuRv!ohYu_3c(#2jssSGguJE%YD z{S)v_V|^vh178mKrpU@c&_U=O!xjATn;G+?X?}K6zBL1He0=|$)g4Jb;u~-PvTq4{ zyGNMfgXbM}QFJXlZ|BjwIF7zSJi|ZY0etWT5Bz&V`Jg<2bEvC>-XWx}M-HVY&KOki z^)hTEhCe(o63-*-k#7=9-E0egHorU;*&@$;ll&w`lGMLplwe`P-&MBnlFs}Djy zggU<;4amEQAEBHEK3MtVyYR){@4uPkXV72bPh1xz+gR{L_=^|+HpuuF2>U-$?*{DA zKVAn7B>!M1y<)QOu`VtSzC=UF9@&wPucF}FE9Ub~ya@P%so|?@-p{DcjXx3Q@wmhZ z@i!t2vSR6t-s#i6E-&FjsN)E&ZZOQF@(|&#^6@v}k1cgjezE~}S^3iY1MaC1{G}Jg z_oNO&24nam-`$wRU{MZ7WmBR(MO=%P5m6ZDyM(AI+jzFs2Tvu}>x z3lCDbNAj=ldz*-_1K>fBza$TYKkLQ~YptCIdyYLte$9kG=LJ?4isduFV-Nnm9LQ&* zVFg~Ej5o>SfL*{g6)(ik6%Qcr&((8KxaUJ~$0r`|qFvyR&EIjj&hwIeFaMMQ&jUhV z-+26m)e(b*e|C1}V%{Cs_q4x4pFG)5kIJ8ykx&K#_L1zD;5X0Xj2}olR%kv)3%rlb zfQi}j^2o1ngXF8r`-H_WEP3aeLgC?UuL_gL-ajz@z0B7t*Nr$AMehtD-%Rn^;|~7# z!-DX~=H(#bPbg1%r|_}A=@^P%8;s-Vy~BpfU!BOl5giX3;ja-6_s94(_B=>oZ}P7?ETrG_ zN4!v(^kpO}YbGPUOrWo5%ZU${4fuDjeFciic2yX|)Qr@YPKpYo=gRy%yR-EhMV=Ew3H`7QqJXFuz% zyz)wSxqKI2Dj$XyUwn!A?!<@jdFP$)&OYZHcb0tnopHvQ?zGcScc;j&S(Q}YcZZs&d_}+AHd$v0+{^h&BbierdFWlR2ziqxx-;@tW{8{4%1Kz#k$$ZU0^G!M_cD0P*93e;fRO ze(6hJa$k^t>);3cp@$xpzuPtPbA7+<34fQ$+3is|yZPo@RJLw(ci(-F-#`Ao`)!>i zesKf#!T)veee17#-dK4M_Et7Rc~^*USLOTOLBl^k{}#THss}@zBR}%!9bs>MKk8qr zgFPR7za^!Ih7TX^_TFco0KbJtA9IZH1>ZXOm%-oNSoz*FAAs@?G!`F?BK&5R$qxg* z7)n)-K=@R{S8IvdO>qisTl~bDj~3cqw5v>hk!98YItD*{dg6BuKfn0x#cwG-s?jZ` z|B?3~_fb9U>*7=y@bP>(2=Xud9~dnB^{!j{;BWPfbe!ZrSNI#|5%x*jmi6JiE(~d+ zZK*W5!w)~A4-fFW%605mHh!S@viDD%a@FVd#JGV!&WWxO#>tOsa!qwpY#U2^Ze_qusU9c8|CeYpjD-+qI4z6^L>#BtIexOil3q^P|Cua)Nq z2Md4s!MhC^Kqe>yK@VBG3m$+K?O*Gk>lk~M@W+-$8SwT6pAYny@!*KQJeWIou3axy z+VMLR-{dyM+Yo(e52QGcRDb|ic?7pr{&*}J6RiE?GfpOxQqrL`h@TU z*}Cwei&X#L;SM|OaN~*L5BAEpx0MKg>$A{)_U&eCJFCsi^T~Fqz8&eGHG_wL-feu- z@K>5icWCp5@x_2WHe>cH3it;*T*?+fx%WIc;)uC@%E7#O^Na`ZXT&hk@H96vBF^o2 z#IPvz_eTuZ-WZBQIFfrKhD(3Q_x;Go=eSG&tDyVPAJpXpa#d4;>;^2^+1mtL%P z=0)zJ3omfzpLec1_nfocS@OYr#_6ZIQ%_mtR<2m#mMuG3K9x_D5B(+bFTO~=a z63>^Yk550opkUDO*Sqc{jmdh*%0N`EB}0Ya4F19$N@CC03pRiBg>(x3%)uNgR(*;* z4a9>uKL$Gf$3OmIZO{)t{G;vt@vC3`%DwZ>JJ#-`orKS@@2HIwZy(_s^+~mjuD<3P ztK)q+z;CjAh$?UR#lJ@P_TPX1KKPrh#L7Ta4umbT=qaU#Qs+M2;No9+7k=K7_($c} zbW4PPk+8-Ws_h|Qm`Ao}R|A8^>dfNFP ze)yq#|NZyfZ-4t+7qEWw%{S#g>jxfdwe8uDhIS}>(XhwD<4-)UeN`TD4?XmdwJp)@ zx7~J|Tch(m_uSKD0lh)H7>rk~TBUt%u8`06&$x{A(N=D;8Jdk&`1>}M_rDLnk`&bm z^zE&VmVV+`elZ76{tFB527h=Q+HqFLq3f*9WA6s)LH2J@2vIjm?%BJHzB6*p{tV$4 z{9EHoJ(L4{y2pRZmoJliX7}+6W^WvHg%VM*2>A#9`_u>G_xs=fKJqV~Wxf;f zYma^eyS| zUh=h0o71-`Bs0SQ1lc0aJMTQV#~yoF{a`v%X)^s|;}qUL>v8wj!NmK2^!xgNzxj3) zf5fjrlYf<~d+8tfc7QOY93-))EhsX~!QB(smnhw~mxXXK{O`N3FaBzulXv6^zvF=i z^CExV7FqwOJ9&OQzQXZoD<7En=cX?8KHAl1)4BJ}F5mjGgYV0nKOqmbiVEsmPY$&Xg>+|mmqD(Yk&D?{{ifFUVi+( z9_)1hFNn*25b+=F7_N^}J)-$vHVzTZzwyUAE-S^JGo5$+mU&AKz|qf&pG#8 z+h=IkUFX=oB=8&FuqOd+CF+1(ciq*-Ig&U>c!O!+f!~J$f2V#w4rCJ^hG*DUVKDL6 zyYD9-fxo1KK9VQ)E-8^OVQd3_ACIty342?V=pOkTCL1s|7=GxVQu%15?ae!RH+q8o zPE7XnZm>T3=%eE-aI0k#MTRfE^fI$~g6CS@{o=t4Jpr=5*g@ZRtjen-wbN_Nqc+)g{~WcDkt40wWll7ua|TiFuk zN$kNRidTjo>e4ZTCjVo`ls&+{4e*#f%nW~h3*7Pd4S{`f{}gxumC0r!znSP5Z18dY z&z={^KjnaS1O7a>*=8HJ<(6BTzxz-Qun(>8M;i%VV)MjL@i)KuqHJ(an_U|p!=4A@ zq-RRZpY=&6FOyCB47bA$JBr_GBPc(#=_n_M9e%i5ykv=+HEWjo@4ih$K9Oa^l`z8I zJ;EL$hJRXL{IRoP zyFvvqJV-wCk8?9;&a`g_T?785l4r1oY(E&q z54z2Gk;KIFgt}>P@h@G2yvFgjbm_ZgN|WuM!yYoii~SA49uCxvq?3GNS7)z7ezfJ2 z_$&WlOxrO0Xj_6m`v9=l3HOf`Hu2vnr<`hfg>e&n^i@^Wm>u)7%PyCH@=I(#5%fOz zXFOp47381m`1qy_?z7LnZtmP8-HaJC)Lv5?0$B!c$++!9!?EEm>=nW@ zZ9CC=;YOAfSU2Az%{=n3* zRi4qoUhc!5K>i-rjf73u8%N=w;V&MqL6-Rj?+@}oh@J^@&ptYkVISeoJ}U5S_=r(S z`3HY6#r}m|fB3LrE{=b*d<@dBV{e*rwKw4b`$Y^>Jla9=-*Lyy*YhLvz6sXH+GXcm z+-|$hF~5tX7k}&Uy1aan+V*={-)lkK>b5si@aI>ln>(p z`Bz@Oj0*$d5b_!D2b+LDGAo%Gl%LwuYuE#Ze1vZV?9n&L{fmVC_#~-)E{xghiS#kP z{lEhc8g%HN2@|w0g>($%XQb?s*Ib>F|7PhQ>_`(QPO$wk-~srvR{^$6+KTZX=Ob0V z*dvNPQ5navJxp}YzDeLTN$sDV)b80sZU4^Bu1N2weQNq;tkt{NC8kcDYV8H`8Sq8+ zAku8d;GjHl&OR-H7yh2#8){JT7cbd+#^dkzjk2^UjqC-0oU(@l`zV1wSdoAFNj`n! zgnxPp|KGoF`v_o{FO&SIj~?l+mFd%7( z#~*L|t5#?q1@=&ZDug}wv&Rr2I%)Ro+44u-X84mI$|hKEyY05t_V4NGv36b(QXozE2Zzi0fr_@bpiqbQ$HF^wQ_#8-AZ4^+&-wBIMMQ-$RFVOn`5CX7uO` z_ki{t<%j;6r0dv_&|Mj$!2fEy2mbO+Y2z!Cw6724;27=W^QzjH>{T#L@=1L^S~hwx zkN-GNS0BRfC*$|EVb3p!{UoMMohJRhmHB`*S&|F~{JFlv4ztYnD|IjU2Rsd9%ChC1 zG7bLP!%HD$AnXstePqt?A2)dTD;=hP-~qUUKRAcIvrJD%x|-{gw5Lwkvxs^R9mHOO zjDzzt{DlcRo;|VBM~&!%e?mUhOJ&EX(B4e!uXTxR|KT@n>J-^0N2%}U+f9e74vznf z2jXXy_R?Ta8+ZZ!RkFpk%O`J7cenh{CX#x}^p*01-r08B?c|@m-P%6rSIetmoyvE> zmpp+7n8PRA3!1nh>MLP1X!>8WV*1D9ukY%c=$It_l2gC8u;0Us?@v;`!Jc}Lv}R;x z*`DNJ74XMCG(r7^jL{?1{=e2>^zz@NG52C&SFSPNOxeZGNkV+^!3UaO+L<%A)gE@+ z*q$wn*TjDd7aZ?0wO1PZ%dn@9-`A+p_WZ!VFTVT3zGv*CO)kDP67a z%GRRLY`>NE3_7Sk{^)6Bn0*(sGDf@WuS?YGg!oR9=qQ=@YZQLu4Z~tTF12H!! z{#(3gp~_CCl>yspOnhMP4EAhc4+-=i<%0ceke7}Q`7fT*V|zY;J@uFA^5{PK0{00M zQv0#RdBL7kkjb7xJwIsp^Dgi=U8nSrHV8e#{%wZ49jly6=1f+o|MU!d*%|(tZ;;eK zYX4NIe1JcDcCd$G9RJRagzDT9;Z>pbX_4Du`|aY;ZuIeD*)%;5v|on&jH8dxLlAn2 z5FQ{4_`;@au&+a?-^ioKoif6na9;im2i-GSj4&r&z@KB4sX@bk+_(vAXurYRB=$N+ z=Tr!H@&yn4K6>m^1@?X)J@6l=HaNCP#-8}0e~3f>jk+T{E5qG*gSS7Re|ow*q#w#` zPZah=89R22?J>ys?}eiCGzNVB`R66+f(y=f&{=1lp?#(weHO zYI{H5fWP2pbsPH^f_H>J$A0_?o`?rZOSx<>*xJILoQA*33APJ#SdMi3_1Am*1Nh_L ze7yFzsnh;0?D^6l-}qzIzh*v*w|A#(+}_rNZNS?Cv$8WZma;U!Zy~mQ<^;h5_E><} z0}>ukM<7G!B=%!qPbSJQ<$`)4sZS#O!J7R0eE@yPG4brW!ok-6;_;eF;SZjC%j8=! zLz^G{LmM60_r#uZ+FPu;#&i$QVS5Mv2ctbv>3^~J5O&%My+?Dk`{3W*%|4)I>d$H) zFwtb~pTiza9M|jE#va9!dQoGO->b;>r%}IweQcP!zjSF|9>5dkW3k^6_C4?p`iQ;) zys$A$rHlNTUea~s&C9h9(F4>2=pw^Iq1O!xkxS(r9;)07n*LE6W)1t*g>-nCKyUiJ z8z~1+wf0p)|FdTtd%9?^E9s$XtAjIx!p7J8+pgL7o_VTZZ)L!EK>LXL zK>PY3H&ObL53Z3{$jh|Kh3R3BIeZBG2-px09uF%1laPPvQuGXZ$LpU8$^y8vcc#)^ zt33q4H4ytKvezPYKz2@^^pDs7$UiuNe}%AO&Cbm?uQuMGe`an!Q~QKyABJx2g`hSG z`vdj#YG0%&Q{0r^UfUmN%G9aaS8%GEy2Tc5+Vtsei!Ga$8K_QhO>*HGVMH zJ^q6Sp&a-<#r)oK@ir1=0rL6tc?Mr}a0NP5`S-{E9_QRAgl~qwboQVafAkW)dyU62 z^&RvE1pe&dhwOttWzX;z?%)sK&_Ap>VJ0|Ce_`!qq(?9IqKmOsv z^~K{pbJeM9IFA3Q5Af?iIiS5mSqSxW*aOs;1;0ll`JrqD9w76iJJRz>c_SXzz(D<< zLBrqIzp9t){Ys0;LZoX<_ThVK4^{Zj-fA9y>4S!#H=+c9CF8>3_HL$|PgM(^<9tvbF{_4^H)=YMw} zmcj$(PJ%r)??#mc+xt`Lp=@}amha|0A#HZ2O++Ii*KD zpnY!p0!D2`_NJp95oE#dHCioOb3tGIBmA-9nyyveNH^nVjC(N_&$u}ALm0zl{1z%= z{8?iqMY7o!YHX#L#9#$R>LeRWC`_|p!eeP(SO zoqHb8zhwVfzn3TYQ@1f5MHxWGnKS)xvi>WnC~WA=(`wCmiP+@QT8TM`yduGhYqjegIx28B>lllDkcSSY?OUDB^@x|DK| zYx;+=2lNno!$ROs9z%H`-^K@Yk>n70jPSN&v=96k8DW)nCz?VV|!TBUs8Il zZHFAG9I(eBbLQ^U9N6$X?9fAP+`!^0KKq-Zd(i{f$k+pz{wT-n@z&hT9(aCFyp|U2 zeb^+q)}C-2hduHLA+E8IY2hq!%)`;ZT*qneWU4rlRK}g(G|X2Mm7TVOW6~Z zy_dKEYA+W-ANlg_^@1IXAIO~Q-+Km2 z{|NtUO_xiKDc9jUv=1l))`ny6LTmw)TiOvy1EJXps0&mU81FhybJjksznfRzB)jwk z?E~17+-pyJU3%;-U%p-rGKEb9T_5V-I_Zd@|D~7i7%coNs;Vxnk^ZC(@Ovivvd6c~ zE`#omY%|!(u*n4dfes0T%rH-V@4fbN_uO;0d*X4;(SPJ~qDR~#4?pZa_qm7NBU*>c zy#2=>d(fuF;P=p0TR`$Ap4>24 z_^S>(eKLD?(-skrLz^A^{WrCbDfTew9>YDdiE$kEsQ1UDyVk~hSxZ{RyhY8E9*gZ# z_8udRJ7W6}_Xzzlb4&dkJDX=}*ER1>*Vr4Jc@!Ko50x>^32MuZm(3Jn|8K^5&@Hr= zt7LOxY=Q9|hLZ??}}h?5o+LvVcxPo~*wnJxjR`d!k!?ApH;i z(ixWw7XGrM9mig{z70hCg7&WJo~WJAzS-C&y?s)9s4Jb=BYl0TW7V6@x<1 z=2Niexb~(rjJve|Huy5m!#pUOFU1*|(n$T<6-cL{Ub>%GTg-X*LVe}uY)KcVqK*He3d>mBXdLl^n7vK`8S zuivb{EFQoQ>Hqx)3xAD=)>o?yP5;N&0n`JY&_R>~D+Ay!TqY}RVIO(Fhdg~C=}pNF zc1`1p;+akohU^dDB826^UZ`#@< z_Zm|+{E>U%kIZ)q`>E5kudrx}?5p6;p6qt4ut#Kj@mjgi{>%yZr#+q}OJVO{%0M9S z=a_b%aOoT@{L^O47+F_^T1-OQ5( ze)3AZ%*zfVL3F;BN%)l@{B#p8l!g*Q?$Jdx$;i;R*ZH z!x#2vhab&qTfmbhh0V%SC?i~tA2*8!3E|wKy0I0!4RhpNeO&3~gx=8tzoK(^N8C2m zIou~~*Lepz9TK)Z!n>AC5(o11k%%)3&3FC)S>R z|0Ar}J7&;-YG0k&hz>HmWz(`U0QTO_Lx}Ce>|C;a1|EPpx(nP5Z^}Wl%0a{jctKpN zBck#V_+cS@imrnx?*RK&@dqB+x$c8MxVCDZq32z@9dpigy9Z{%JWy+U;Dc}$=Ix#E z2R`(QZwf^n@JG*diO@lYKfI2W0p!0!n6X~B>5JP*HYj6KA?Dj z{ui0;K|H`-L0PF+c|ae5FFZge!H*RA^S~QIbQbrKcVBNu^@w-|mcE?$d&F-SCJD)9 zYr^AgJkfQ-9elxCak$>rA$jlYb}jHo1pWzK>*$_hxOa3(7wH%Z_;;&JfIsur(LdPm z-~oLE+M|h<=Cxoio7Z2}R?Hdzw?Vt4GO#Te8{RcFYq42kyQE)>y&QW4Wgzr>(M9k9 z`#V@RhzIb(%7*SC*S;+HkT@pm$h!!BSvf(Uag6K>Tb^lYmHg|RkZa)0{Y0C}0l11M z#+T^4S@BwR44)FZ-`3Hs_|yrKZ^=2b@2?AI;omc5s`S6gf%wy<`@Pf);$ye;7laP# z>}X%xDIWBwK9P-f&Y%JP5igRSITgE9J$Tntt+l?Wco292Kde1KA4P3U%1f{jw@}BT zYpA#2gYJb8o|ruu?7>$dcI04FP6*#N;fGy0#BCL(3E>GJ;FrY_?&xgdg0;V=b|d`Y zd7eq$Q<-R2`4A=A;EBqD_|YC=&U-q9xyN1gwd(9{$$yXVpE{*yEoESu+EME3UHlP{ z4f-wh^{;ACzo(Hle{GF;pniXSt=a>$1+Y~K`>2md+n9Em^;;tR8>N@vO9Z}XR&gTL`nvM=1>1w5ksptk~V;0e5<+;kfL z(p!38m++q={R8ejI!5lNz=N*NwZh*`pElL?c6Hr0=m2lT3uR|H-E1rB6E$J0X>M5C zBs&efz=nW*z}jWv2lkWDXY}m^@K;|-xYCB>nzf~)Yk^lSx=tL67sUz3)()pW73N%{ zZwi07j-IC9z&&`$b-Newhhz8>_(VBtqkQQ;xYN#IPCB|C%)3f;k{(>j; zSKtvmVEh|9qqVEST@>1PTnA%9yGA_W9r{B&&#_&L;#quM<2uI>^`_^AKW9xwx8#{V zZFoM|8L&Nc2y<{p&!FR{^mMtcrcZNId#C(KHl#iJlCG&sA-qqOw z4&Vq@;3yjmq4 zo=@VT;=)s~hqw;bv|a3d3hlo5$u;`6guIh)cFRt|x*KrsozneZQ>S)c)YaAXv9@zI zhmW%PWwbQaA1u5d6@I^i7ZA3vKxXeXyKiLs#V(0`Mz#WEi~Ag7yTtyE%ylcAf=yDk z;a8Fw)kZ#59jLmQq|E{$qsytaJWvgeqAEb zbiL&JhSt`m8{68NZxrq~i6^Ud?`B=UMRcodmbdBJ?Rv)@3h!udZ!uDwJD_k~HqP5S z+uCkxYiYSv<>nTRCEl!itJ_!^jXaXq|6hL?q2Xt? zs6bRADie(tm5U~cDnyl{s)(u;{wq>QKY1Zfw{ zj~qSvH061L@{TWwnWA}xJ?n&gKYBmukWYD|WV)jJ>pVxgxVJ8mr&PXl zoSSFVH*SuT|L6~e#p~&rSr17r@a=*;)QHB2(2@VDa)6F664i_tJ^G-moSa96$A`JX z0ZQT{-Wg8tFe}^k&J-RS2(xrQ&_~40j@{!pe!iY>AX~%>p*_>@+}|VK=22f6h-62Y za9!{GtMtW_(ho-nyUC(r5xVnV=|_DwPWo*R$@eq4d4AvI{=CmodBR_FvOJ3?*@m@3 zj*~nJybfXfUW~`d_?vJoE)yKbX}#|g-?Jdn8}tUU!1F;SQtujAUX0g1zUR9g$7Lfk zE9;w49Wg<8g6XGS7tpTF71d{EW?h5M!#_3r54?|;ead~VC}4;zcuMgC-(EKQ%TG#%h!gQ7;;WAf|KOvipnHsG{o;9kr{el_bFOzp`3UmkuX$NW)h#Jm zPsvF?c~P0*UZ{UK9-WcJI^0$f{x9f1d>Vg&_tTZ%@3L1kzOmzc?|bZd5C1*oBt!h@ z#|hrV&p8hK^7m3a^!lXl{l0Pg-rG=o|7?nH@D;t~c^|$Tu7!8&daSLGtlx~U(X)Nt z5oBQCkUb96X8PgCkt4Sk<0)UCHW@%KWhs5LmDl(3^7BJ`XRYx(&)50=`Jb1Y>jLEp zk6fKw7~^+tPPY6Cugm}b@-WbOobO&v27b@F@z6u5xc%?jyOdrp2cGAqx1wvIUh}#v zE-O)+FfIq-Smj_{oq!zWt~Gt&@Bc;h!QR4}b|K~M)ACCf?{^R`f5yjp4tyMt=c*5= z6O!clpPxra`S+Bk5Q6ty_xHRU1bMI!*$~Bf#WC;cf9<2rLww_FjPD=yOyGSVzDK$t z@O_<7=?Z$IuMUZoduvzdoDkX2GlZE+mv0|tuayk!DaL;>qePGR?3$~Wmn-aj)NR24}G3De7x=mdLqb#@jKE7v?IdxOl!B89GEUpJLE4a zZ(9oYPeVOWmYJ3LE%+VkyukmY3`9JK@5X!85Bd4(*#=bzwzr_Blf191+%YVW=w{!bMBGk?P~GBPeC%|5;8DDd(1Tz~$DGM^9sqw>$* zZ}8iA9?640kK`av{1^HAzAivEybOf;Atn?3u!na+1_%S62jqWTMmS#QUD5N(V^Suf zI6)5Vdh$8X-%$Shgo@*3A*Cz43?K(7g5N;~2+;{aHiSLCuo++Yr~F2xjhafoi}Wf@ zYfWFlf9V3x`=}idEB{vR;kjhM6UTY3FiE+|WA;eyLnbF)9*_x7swZ>|g?5DTnQOv0 z=$OF!bwa&!oojk7buD!tc}QI!_}FAd@zx*L*J~yVQM|ZZ&}INnAEw$1K@OtOuqF=e zu73*iHBOhAnfaLKy_W%#+fe>#0|x5D|G@VsED--ig(CJQFD!ukc^{b|p2>}uiG0b1 zQKU2S;G-Q!a$x5X{}ngL$U6LsWG6gtq0-$)mf(9b9`78O_kG?S#gD%yDT^V^f&YZ2 zQ+$YC0K1e7sNACmDEpBzPv$IotPwIcs31lV63n4OqT=@5TnFze(S~w=`f1bJrf4%$+953AWa=h9yOp6x7N`qU7bWdovAV(ZgyN1!AFwsk4lxznmKe>iUX#06y6<9gXx4qg6;eA9!MFpk@*u%Y8$Kkq#JY#a=Wgy4` zeD%k^U6~i>JG=@+n39iTdR%_q$NlB}$Z-%|c#^}q2xv`zZ(-(IKen`+sCND`D31u5u@!#kx zPhN&neD8Z6`0V8&#(Q)^bY0XR!Li}*8&#^rhWXgxhctM6j$h(Y>v3KctFK=G%I1c*B>wV-Q#e3tw zy#srR=Y7x*Nj)G;lX?KYM-u5&a$Gebfek_ksKvR=;*YgcCfm zvP$_C58)~NEP~e}czR<|uCbS~!l&j(?u`Q9kWipI6gUT&LY)Z5L#KcwQDlXnILHlMp>% z6!9PV2r?1siKq^^>67Arc4p>R;lJsC7~cc`lXfi9j17={MC9{}UWHHa-}4ea7egh* zKD2X=MY?8k5MATAP%^=@p8x(h@YM6(%L07&yo=5U;AQ-|ycqBOb19km=zFnv`bJz1 zyj+qFPo}$+cg{oIWpN@|NY+o1i?|FV`ED{1lLMWLAKwxGKZ!8`HAS=D4QZhcO7T5) z9O{7nwg9h30}kSS;J=k|&u8N~e2-C)jv=lQdj1!Q|0&9k$%FAO$xF(1iu&+d*Zp~+ z#aV~vedL9>#2bj$ef38?PWT>t4>FJpjpvaZARqQUyMkz>h6VWwavzm{E6>vFf!D_S682^m6_=>oi%Q0b zIEVNCI($#+0P&_E#($3O9KIRfeY+reyv}v>68!h^L%bj#HkZYC6XUhw=js}ijMwkj zzZ3bPd2cM%kXdX}WYeewM?umznwXRdHlgAN%`^DjYj>X}*Ks>vy9FQ(Am&lfH^Ykh6 z5&x|%WAclPcv%f{;PVp6f{m+s9{9F`>`7`*W@l%9?0o>f5%}-Ndm|km$~$9IIz|`3 zf2$`VorSz0HgaqyKOf68c>(gTsMa7;LS!1H0lN4WHiOfQ%H z`03lN%6H&>lz-26e?7>s;gpn9FSh|luTy+mL0BL6u@-*4T;>00tCN!Dzc2p-?|ofB zI{+Is{Q%mizU~U`8lQIhMn1pj0m?f1gy)YtZoa$h^2^uh)CS!cO3&N#!Je){R|w9`bVp5{(HU z@)d5`vgPjNlb5-ZPCD70c;ZR!gcDA1OP4NnOO`Bgixw|-3l}YN3l}bO#~;7I&7Xg~ zegD{Fk8{TybF4f1=wsZxqmB|C?dBdi&mD2Zk)pZo@Wbc2Lk~OL9dhVl5gn@VPyivE2?!bX=ZwI=*gjb@=Q;s>6xBk2%?ByF~_UdaD7+3UiFz! ziGpy|X9N?7m_>p_MTv?i0!mOp1r-rR6p<{72~p~O|FvrEUFY=a8LrnE1<(2YR#)xX zwQKKPYkl8Z70&60ZMVI+LOKc?$T2JL%ezM!y7zkO6V-Q~z#qBqa2}{*L&v`#%O>{S z+WMCcUuFE*pnr6W9k?y{Iz{;Zn6s+KE9Em|+xCvx2JjI(jTw{9J@35#)xVSe%U}MI z?z`{4^v6H`G5!AczfZsY?QhesfBkFw|KE4qaYwrCw%gJzx7?C`@rz%ipZ)A->8JXi z-9P^EkJEM6{U}{~?GMurzW@Dn%{AAg?|kPw=_>vI?r(kTTj`1`zL74w?DF*WuV0!j zx#Vl4t=__CPO8U|T7o_vQ^riI0FMctdcitD$IcJ}f&N}PtbnK@-Wp;oK zm~Vjd0`sy1^9^PX@O{>~&IdP=Rz3wEWa4ol_@VFUPg3dTjays)iuqpW{*k!}|4u`- z-k7hhuf{&ML1{PWWnzVL-~?z!itv(G`_XX$@npQ-hY_OWAd?VVOr)1IKntVKEOD_xBxzIq3>)i zWb))UZ*BccfBU;lW3h2d|1 z``d=$Z+zp5bou3%S314uqKndn(&q)j@0Ut_o_)4-`FZ{C^E34S(?63=J@vG7$|z#OC{64V)y5kf2|B3XwaM7Z) zop^Ni>^at#^ylm>vu4iH|5KlpNN3HQssF!@@c-9mxM&WMe5b~ko$4zS<`aoIbYIfQ z)0d^7Bh!;%GJGq?5wn*^?zyM-YwTot41VXG z8N0ZzhZh>f+jjg{b?B>X1CfG%*}}WFw*JNA2fO}#jD$Zj8<-TScz}2hkb zee7c&OP@UU*z~lgKRs=)F#)8)09y{;`?h1Gfe2Rr)`CYwKS+ zJD6v5{O2*VbZ>D<*nqeozSCj)k#1b)by}^5+S-`b^=(bhd64lRI-Waso^0SI(|yj`k7HrHW-N0kSN$+^)I}QK%fu}z8X|nAd>o(M8*g?fNdQRrLVqPoe zI?Z3GUG#2q=Eg}JyYKH*pDDi$^gs0wo&}o>8>l(JF`j?Q(HaewW6Y~Yq zJ+`4|F@F#?V5$0ECU>wtqx7Z64`?gpEwsrinPtZZ|fOP$H;hs;)1NvX|#uFA_YCY2Ued2iS5f{%R z#`hgcU2LCt&QoUmj}MSc7(Y&&kC1m6Pg?i_TkjO7;|CCYo9n;k1?<4|-y!`gUSqD} z10VQ6`rrpYn4a*2C!`(Z7pN1s1^>3DWqL;69{>ATpq$@yu4wcD^?eOLQ>Siq{maG< zWe(PSlHSi#_eE3SKlx%PrP zevfS6ed%$Jdz|SX{D=Ns_qERp-{&y^_K}6Ypx@CyW#~Qk59REU*hc#Q@32F+MRb<& z53fns+eGU7w|&31>0LUX4(3Dmo-bitzFWVKV!B4(2)dtvwBUgl8yYFJ`19vK z|2h5XPk*xcKjwn&zWZ*Q2fF2!TQz@hQ-VL3^ZTLZ3z}`=>tAQS=VG7RlPxgMb56De z<^-^VQ%^fJoq6V&=}AwMqF+TG)<4nd%AKEvexf+R5I0zp^UccF8dF^+u z^5LKM*kh0MDXr}=wmbarBNUq~F#HEDiHqnb)*0XY<~N({wbx$OF1+WWv8L+yo=5is zVLx1J=Y(_e#<{Ws=K$9^WnKsS*hc!FGVT9ii{^_oCN(?27EGj1@gQSo#?;KEblP~j z#(n3EsW$eeobk8q^_4Bao2LJFyd%_a{A~EwTncv1eX#-bKTGSX+ikyHVhq?kF5tL( zakq3f#?Ip};EVb5N#~i}P=?G!G{?X^19{TfYMb_1yR}sJn;CJ4QvHrw+UwDew)hY1 zvp&6G!NLmjJS$^B@WJ}>A%`5IIPlQ)DDeiiO*Er12|A2zW44vjnz^8@(x#fujko)<1!m=n5p#zq*M2Vlgaa4?7jASw2kSHP;CF^x4cERHB$fd%PU{`N{a!A1NYSYKfFSD z;1=Gu{`^H{3^ZnTd@PqWfU90xc|EyWFwz~c`5A`|H9{ zOSgvc>6)L_+^go{kWT5^^Smp^=#_WO`ftKN`e$E(^?~k*4Ve8YaqP-8SeNtV`FX@2qp$Lgy}8Thjb9=fe&Hf^uG7MKfU7} z?@Wgtc39TGFb^*EobW%-$zGEE_S-KVaKHiSk&k?&tsl@&yt4`Kq-*HEnX~jx*~a}H z-R2?|F#o4E(LMHqNaxlMq}#&(>p9^O8@QG*7w_||(_H7X;3?UG z(pmXk;~lUk@c)h`{dacGvbZWRV12;*tDoR$bOvWLuimA(8g$O5v@>sg$Wvy zqdV3Y(NFBxC04UFY}T?Q%xl9r>>Hdj$8ErP!1!Q}+L@g8c*G;qyAD6x_8=XoJx24u zzxDwJMwu6bquD#O&pxl!o}<^NM?B&YdY1{VyUhJ1enY3Bd*0Q!NAF9Y&s1O7IhAvr zai>!Hj=s?KTOI$Ji+(3~;GS-e*kSF1T<5Z7;d-`oJR4nS>|5S+pY^Zvjsy4W?5ShD zBtG!}%$c)oF5Uc{`jdOn7dGE69kP!eTbMg{sr?EpJXg-3;x%$zYE@sXF@Ls?_}%ldKPq#&JF8I(fgb^dRC>gXY;P;-)&&_ z9Q>=}8U4S#3IDUy-(b=4PG7jKh5q4EcoY2-&k>(9U)#(BVN;Q^Pl)-Tn{WQ5#{NG} zS6_W~y8MbOY){wu=YL6aJ?Ez5jz1yw^$%*lmVB6aVAgDW!Cce-F1zinnC`H&{{aVT zoVkx;i$#iI)DO}XdY`J;7~TE*3tpgc=gZ9oc9Z^D^A60@XW*9jA3YLd&=+9?*2j8Z z_Bo(;!<)75{T+S6wZyP$Z>!^9`Z(PEVdf-zK92{8XG2WCI!5=Vf9c(A0N$RZJh8P> zJ-5BP+HwA`@qg>Bx2f(Ni>t9Q>>d7Gx^$_{*RUsuxty20Q73*?{oyyvHv{1>f6kmaTV4Oy7&^1()qCAw5!n-~Yo znLEdLfH5KC`o-8ljt4^LT)^BO`}5Ay9W;r3aYM|!sA zm;OU@O)pBDHf=J$#d{zPeJ3o0-q9z*ySvV@j~Z{@-`;m_Bf`J<58VhuTlIsFLI1%~ z7MFzn#lyZILs-}QfP2^fEZOHA>3>d|ujibr)a=!4z~gPWk3F)b|7ZSZw)occPk+hY z*jKc2H3Dd-VbCsfdQg|QTBj~6U;`gv~_Vy8f#RvRzAL4VviuA|7%|J>a>&e zkKVB>#(J#JGA3jn&XOfd)6KtdUl8L0)_%GdYiy`}dd%I-*ZduE4SSAW@rqaKI|BzP zuG?2@wofoynJ4VK{^!YNW~Q}k*V+F6=Rf}i={e7Rp5_%6Svh*bW{F!7_5d=Uj13GA zZ(xjO?-FqjeJ9>FUAiqumwJxSyN^HJRw#F!dmZ|QYZ2agTkyZ0QTitqa(-%jc0G@k z!};jm^$+&v&nG@}><9kw)iM4CD|}z3S^wAu>q_kL!Uovuu}bUwtmVXKpM74F#%f({ zf#!Fx0XTsCLe2HCR!__T58QOq$g$z_oGB@r-9Y!)##v`t>$Pf)437;vchr z^q(cTpZ+l2s~o+Dg#Jt2Q?@|QwXOJ{d6ZiJZj4@c_KBY}vBP7X%LwAGi%n z)Si#Usatl?v$`ks_4cLyzJBvH^Yje!=4s9_3--|0H(=ZjzMuG{Cz)Nq{ic8E3!g$C zJ@&DCrzdOe=$X%aW?CoxGtV8EL2vW)tf6!IgT5_ofjV>59`|(EQsr0FK>$DYM>k4;Js8IxeYQM^y*>b<}e`e)xSem6e&|M@!4egbrl z|6o5^&+1hT_Yuu zJ=x}r!IJ4*?+BMH()%tHFTfF;W6ycN^#8;sJjwjSW3^@tH!xO3oc}#`XPtmG!zal` z2G_0?M=%z4KWH%!dG(E9L3)ONtZ&Uv$`*KU`iQtj=d91OozRZihmN>rlo#e9XVIZpM4Tb=&VSQvc|Iu|E7iN5YnJs2p=KdynUUY5xSL%F>UAu3#H5l14+>GuSQ_*+C z)jMe)Rf+%GZUg`GY)*Nu`f0x2leOgjCjIZX@9WZpjM||>Kh!}N>?1(;2z$x;){NBugbvO9FPbm?$WJSsJZZeXfA{ICE%y20515PU zk_~ouEwp{!E0!wnV3j&$M)$43>L;BxE=jB;^zD3U@U4bvK&p510T-zmn((_gCifu1qJSE+eCl1j6 z`)t5J<3IY6^+ek2Qd{VMpl?ls|40ARrf8l|*k39RK==;O$3OnDN~f0D!k@r?X#>QB zeX;>;khlT8;|~zxLu>$C!wKlyM0yJS4=Cnet8w4Z&|0h8h!yvVp+n-w+LF0*CyjgMVq{t_Di|4Y<&W&@O~@47VK zf(;H$;an5>7VP+KemMa`R?Z6z)1Y#@8SNXOBR{_*>m*p-FJzm{;IT$2m1PY z?K#l*O3gpQ1Na2KCuFv*_rV6jKhO_IpSYpFuTRfBVAlla({Eq~+@rhj_s)?S|MV|B zpt_{g<2=`yuQ1Fx_Bh@a`d5r%^FQu`+|HR3VO$h3KDwe`=pVBI!#>}k^1ed%=p6l% zUm)zWe}?~g^zMTH4gY#a)(nZiXqP=@>({Mq;Qs>;*iYq(*X76kJ6+vM7i-R7M%v@y zyQNQv2Ts#|58}a3fBHmA$(P3`Yt8rMlTWg;V~_phh`nUY5A@3h*x$5DaY5*xF#n-q0L1|vrvLX;SjGR- zH^j>pKY)M5@Ph+=4g7z={`)CTn{4`DCcUG3>|nLN2guq3-$5jfn>jP@O;a1T4^iur z>`|Gkb!o;0>{*ySyHk5KCW^BMN6Zfp5A@0xunV)_52y0>#T&xek{b{FG1 z{ItdT#Nvy@i}H!WzjFYX*LQ3cJK6i$dtwX3h23eK_EnehKm5;ov9AOD!yRCBaB!eO z{|6m(pw`=`%C3Za=^H&SU$M;nG{-Al?<=Ku^Zb@Q$?moPLcdEQJD4v2PJV{QY||0>YZuQ`?xKB4ipOTLS4IAIj>ed? zbv&CnYu!(4op#LkeR$vRe)qffXfaMSU!XaC_9egrVFN2{YyjSU&WLh!Pdsen#%v3r ze{8_w8|j|DVZRD`hGP-u2x1E73;LTfj;XsO^J&*M82@XZ!x3QDe35i-{s=#Aw&3v} z`bYTv1m}L&f2Dh~0rk(a<;DTs@+S+`hR6Sn_{Y{*FXLUYA@j=`OY2*|VJ7MH(@(eG z?mSR_VE+RSNTdglKkz{1531x1`VP*4Dm&;6Z%79pa)|vl=s^d2p5r%AraIJPUpL2Z zIQS6d-)O%FTJB8_8}M;KzwrPz;C7(+Lps3@h!5Njm^X0Dhi?Eo@PYF}t!HeWzCy?7 zH}p<@@|+`&P=|dD_<;Efw+;XEOg?V+`*-OX;(5R*0{)4O!|xM!(GT{%*tl#6LBHk$ z6a!40I61xNy^Z+Cw$VTK#yyxbBZlC&Jo)_j&!d0myE2f!VTL(@m>&uoa31iveY1fa z^E(eLsbWN5Phwo`TxeWCpJbh)+b-feVICfU`vd2pbJDPZGDZLDpRMoz#sBD^m<@jw zc8bm|?lpUc`vd!=ypR933TyA^)WvOpwwA~b@Ex3H|BsC@XQFpAA=aHZX`+7r_bq=z zt^V~*l{UZ}&m8RyS#2?)VhPy+V+8nrrG)VzybyeV-XlIFO8+2>;wbWvptZVcA!~oJe^D_MIj>X5~gm`xB2;UF?Gp3xN zeR%wqLVSq-XdnMif0SIv_r>3$@71&a9~}@6{t3~(K=O91{GaYayqt3*&--<8O;D$9`)e?aJ5b1|BU~LO^lDE8*~cJ@%#9>&^y1W#9YiujmPi@76a*-m&x~|TlU^9 zT}pnL_W4d}i2r>2x5U;w(Z9W~_+YW_Lm%+nAI1{vhlkV9`t?dTqzyaooYrsHXtHtV zT`b+O^QN@RuDd6WhqY$EVbdoUv^9jU%S@*&9^a1C~WAfO6Y+_sB|L|qYR_GbPuE(nOjCxMyS^RgjeEzNatu0|6 z-LsDBHc)dH?Vx*7em|v*{|*20G3N92j>eay^nrwwxi8x@rMQ5-67zJ-y2KpTNwv0Y zYt@RS=WBkk%i_$%itW48ynH-=p~g|lFIc3xv@ZEv$r8OEb&*Bg;;ZE=l}abrse~~L zu`BmozixfYvEe$|z#Pq6VFP`PElu|te+sAA1nY_HVJ&CW9{kBSY<2x>-S6$o<>}Z+NW>4AH1Jzdub`v&){n%WK`ip+U{ynZ>?oaKiy_M4IGGTWGI@j?E*@o#{=U1&> zW3o(n>;fBDxoVB{t3BU3hyGXTnEKRRBfYPd-qHOUjrq}i@0woud+As)d%SxMF^S*umy0;BeU!@djfK<{cwt z{Q+61GW-!SF0mvmox=?t4?1UJ1J<9J7r>T@j`8)5HTR*Rf3uUNOSk&(|0+&DaJeuQ@gL7a zp63Ps=$F_Z+^;ZwW6O&z{v!q?27m|P1Ktz6C1sq%9`F73+t2zh{=8K&KKuU5_yN3F zETQ{>AA~+Mj!`@41b$cpR;3$!!YV|*fPK4Q7#&g$r?W4YbE|Z2jWE4hDbk}n$A)>O zd?$pxKCJ%`=llM@L9GR>HNi$VZQP*$NpPb*evA#-YXsiWH~Wbq&puXre)R?K$9U0v zg!lo!5dA{m1`psD%okdJ*F3=cc6D{VQ}du(^|PqEdp|G`z8@Y!-~o^SWC!8_kN2Ge zR6)?g5OKfSAukyi-gzF#VIAL-rV0erz7cifTg(3mh%;zPuab*?0bIbn}i2^ypOK&0eyY4dDdDpRxMR51P{d88SjMfyP*eZj`qR+DRs}g{QL8t z>-tw;tXr!+VTudj0&D^OBNih{r*Iqn5_3nyIp`lB5q^NahC4Zq_)q$O)7I9%##^sI z_rw6`AKfz^h-ZoTjBx;ZUTwDR>)##&!_z)5W?V;1Z123hvUk3(^9Ie|KU6*!UicNo zcuNfL>l6#He~~x<8!!&Y^8|r?`i;J_ev!_d2Z)h;o*%9?9#B8h_rU?u|G`^Z|JwiY z!llwbb9Tf-#DHOc*rJW^EXK=YJ;i>+0X7aK*3o)9!Wz8!X>pvb$;$@ZR%HKr&l#HE z+o*XR?BIh(e;^%o)H&vZN2d=RqcR=yTpv2- zgGwpmfBr~x-bDG2e)J>h&^I1p-&g9@I}d3*xK?|Y2DE?K^Zm-}d!~vh@B@q!*I3*_ z>>|G)e}K-h15(7sh)U^e`jGe;d%zdS|G#!?>wnSW#m`u-xT(UvY{AEXbvz0Opl?$4 z+Q9wT0D8Cm7TRZFYwh;@D=nTfdyvh;2?%53MViZD4u!p0eD7=jj7YM&i$^U?e{|UkWiy+2~->kB7_J!%b ze5cgE$IkZ;JM|qDeXmtz^Yq^8uBEOYoV2LLZDaZF3^?89O21^Q>NmF>HdU9Xm41HK;zK9KIS{%vjy+kgj2 zxmLn&`dchXJjwnIam&gT!h!aDt8xXRr zDr3S8vWY?Y05||!805Poh|27_;70KQxW@+IOY~p)1L4bJE|tLt^36}%+WOb`6#Hub zFCLN)=+?a%4`7G*BAx{surVHE8}kRU0qK+R6S_y(7aPYuuIkO4w$d>FucLBYt|^PQn`;m>TCG^n9ajTx9F2&__>m-Z`$L&=(=Ce zK%4!2J*I#1u5WZFeQQsO>wKN^uK#r^3)#4F*swmlex2!hSh~js*kg#k*-Hfe*(=U^ z0pjrz@gO$oyom1USDX7%KO6RC8~6q7E8cZ$>tA#6GrN~8y?2S?Kjy+C4z!qrxI_|j z62y7%I(xEA=d$G$#CrI8{GEhy_F2Vwc%WbXu})ZFkDm37`rh7O`sh>tua=I%d(SGz zIyyHUOV_>9B|7WD9;AP`fbWY_r&q^r3to?71U>Ve0&In2@XdG3qAl{^8{N|ub;0rA zpnSRV@HrSCQl0fGA0A#O5zduI{~I<8o0ttq|JcAr%@Yi3&5AthMc4tlH!k4&BKqDC z9Du&zfLJqt2jBzx1MGvfhzo?x#amndv@iYNz??d|M{FL@@~n#>iUnk|q`vn~;{&){ z_Pt!`O1%^F^6axC->dgtrFSIXgWXGdvrV{vkiAGp#1C)**h9bQbd_u%&T$@{agMZC zy0?@vT_5@cw_qAOsm0F+&e3bHbR8JSj%bf^?mtKy@cmj((eseuekkp{N#6-ZcHXGp zeA=LONpXVoyk3~!dDG6a4e4F6EoJfDAS;tSpnvxXT63Up)E8^DuK+F}F1B@K^(|vW z^l!dFc#>V*Eb^~3W0JMW^k zX4$~7@Xs3c@CIRCd430mW4=3%{$1dYA?aW7fcTHOMdpZX96;aD2Vh722=>YQSU@q4 z`cnLR$+plv_YmhCz?#Wo`F`|GJb=IhwyvN3033iFkb-~TZ>>HT-qAnlYT5T{&8@Cv zz7^fuv2#G5`l8&AjZK7Im>tMA`lJhlaRv6k_cKT->y?h*hfS>V78z>ve-cV5_4q{3lJChT!Gd&moDAvbH8C< z^XGRD+Pa#?0j#yT4*>5z7i4-DSC#sA&KHMC@2fQbz7m_(8XEd0Mfa5r0vLS3B>Tn*tnQf?@0qK)G_JWQhAGS7- zbl?-ILvX!#e+c~x??b{m>3V)EVi)Z((f*TlDr3(I z`$*9LTCE=j7oc}y0faap?0~s}hzA%Ck|%{56bC*c^s_C}rOQ^{$hxSlspI=u8@v3ov`+ane4Xo-x=UR)=8Y}UDt+(I{bgozHsy)gh@I;?5f&Q@*en+Pl zZcx5gx<@RYH0;ACiV@8|#Gi0z7UD{DHK14v{SIi{jjdoC{W%}!Xp?fj|KaEBYq^Gc zA%hyb(e9vRt#prWH*DHudUxH6=cQ}%>`hv?euIwj2im8kJxl0+eYOL5AOs#j!WPg! zabO7R$jlYU_usW{-MXE&h2G;H!tsBzuI_92j7Q}AZEaO!0Qmv42RK0GHb0ELW*nnC z*3y|rGQFFQS$8Kc(EG67u6-D5w8z5sTj)GK0-L}#`os%v7ubON5Nro~z)tWR*bK*R z7j84?iSq;aR;6AC?4!@MrcdmEbLf_QuXw?1L1lw*^tyFvfU&ySk;Zq#a>8}L+8oq5 z^h~-=dL0DU;9S2Wj=tAx?-}LmumP0~Z_u&I*A5XIDmKWr01q%GFv<8|uQq)z5%I6= zRquu!FlH1F92I)mR;m2WEOd+h(RKKK*76yXFdk%VYIFV4J!3w`cGPDdhOMskA3y4pWzg)3%-CK&@uKy{9)%+hq_UJPl{VgCf_*jYyTKmNKbS@CIySR23w>NSGCv|i;sD_6d%Ss#Co zW9j@PViEQ;x@hiSbAPeF3H^irn74!n@Lkw}&Hsa4^e^4x$I+?9iaPdjpYsFy*dB}kDj?P2Zv_l=ZeU0`H z_YE*6+-SO{%s4@1*a$iY|HH%le&8ly9^A_&q;Gyx5bQHI?CV9IGAGEMa(uuB<_-J% z&;NVqdX#%^r@d?6L*IsX_Wwxdtg*1)nKc{AnZsmV*!Mib0jv!R=capN8R?yIpv5)v z(JE&TAGTrp^6Z=+hrOWp0qN29=wTZYzOUUcUG)h2{7y6H;nhLu4Ev%k=VA{xc7Sk< z?$I|w89o_1;5ypGPJ(Al-@-oe2)+XzF`K|HxUcT#B442ML&CoKdFh(+b+QBWPWv|g zR~a^dpno_3%>pmpN=$!ibEO`A4t>KH{Af0ts#c$1~qpV_*r=KNMJUv@ux zUhFup-P+u|=HYGrO1k%TSJq_U1E1q0&zv`7UUYA^fqh7@4TL?N?7a^Az;4hfddE(< z&d!r&n_$0oAAUmZa4xQ)9Q%lRgNF4XYlkvFFMGhJn+i+8tjXItD(g2Y^SpG-+KaGnen2|MCVbvY{mIxp+X41~ zF!xDabc<~;CmQpiQ@(7&cSdj`UPplW1H@s(m58mN_>HYp;rMqfg zQM&*6KdSBv)7W0TfARq9Cz@Ba{TQsXvR)_s*LykgeplH5e#7=vFrJYeFvi8-#l9$x z8RruJnjH`~P$nMWm~|57M*7v~mdXauckl>h)Z-c}S6iIJ-fWIdu@!mFqhs=JJFNSP z`_0}Me`6>36#R_a71vY7b$$)D;dX<5y*= z@2a&#>HZ7q3uA2?drPmB2RAV$k1;y-5xS*) zyO-`u8P|B3be-={dx+^>&&FI1{vND{-gn)&@mTE>_`8np{}yH@e>_Jzev|fV{B%(I zAJTd{d!$G?2KVfy_U^cduD%(tI(I82^&#e+uLLQ2Oj~Z!M022%%9iK8CQu<&^daJJzi#e zD)aWizeMeWZ}iQ+F`jFK))6;p&j7mD@y)}-YY*4|7U=$4^!-0t8;acrdV5#yD_xx- zJzg*Q1AQEVjy7s91-yU^X}<;i!~QysO}DDUo=eKumqogP{TN!CMd(-fbG=gda|8Qt zq+7<#r0B!;>*+l8(KkZdoFm@0d#WyW7Q(gF^<10J4Re3B?Yi`odYtDOT+f=@Rogax zQ<=TrVE?@v)(!nsdrHn$y*CUG4i5jL>1%60&#t@fI%$`6>z4NQt=iPrvtsXo-qp|2 zew+WJ{WmY^U$gq<@(ZsL&%S18pl=`f;(fFScW)*g;Sq@Opc{7~)VI863+7-=Q_y@%=CVY-i<)4dMUwTH^*zESNR zLL0PYZK`c?`2mvs2mAW=Q(ODWH|)!E=(`H9Q~7JPhiD&hj6JKadA0Toyw0of41MMDY_dvS`+C9+jfp!nHd!XF|?H*|NK)VMX`aQ6U zSKLmrJxMo5`hlMvJ#GJO_dvS`+C9+jfp!nHd!XF|?H*|NK)VOpJ<#rfb`P|Bpxp!Q z9%%PKy9e4m(C&eD543xr-2?3&X!k(72iiT*?tyj>w0of41MMDY_dvS`+C9+jfp!nH zd!XF|?H*|NK)VOpJ<#rfb`P|Bpxp!Q9%%PKy9e4m(C&eD543xr-2?3&X!k(72iiT* z?tyj>w0of41MMDY_dvS`+C9+jfp!nHd!XF|?H*|NK)VOpJ<#rfb`P|Bpxp!iI6c5G zD2^ujWkr5nu`T}~eK4AyC~tq-J9GEUMV884ZTWuj7KQX!L- z58;2lM!ubH`@Sgkf}TQe=n!3^Q*?`tcaos*;O{m^s52hoA9M`P(LHv6U0^fdcDiJy zWVU3kWPxO%q)XB*Su9y1St?nUWx3Lj70S1gl`3z`|Gp1e^(|%5|B<2_bcC)D^o9-> zNzmy$$s7r~o*|hk!3MAe_+cjrHUckTFYV8Rw+GN4dPJw_7N0OpGE0ITU>Dd5_*^6D zmkdgVB}lIy6%;%lE4|=lKB$&A720`5HkcHw7Ec? z@gVsG=FuO%9j=G_!TM^+fCM`Te1mE7rR=QZT_n3n9xmBa@@UCpC6ALlUh)LVlO#`; zJVo-<5wgR>o~E+@o$Ro~(;kM}PphsOaqh2sR&Osq;}+X| zp!G&POLPCy=kz@~Ko{r)-Jqk#NYL3H5_E_z(J7oz>X~EoPl`=o8$A*@f%tEhgcyPN zV2lLYYIA`);UDaSPKeux>*4O167)xm2-m~?q5H^V7ylyLeb!DpjeXUaG2{Mw?AVT@ z#&vXjdfd42=X6Y%a8XCc_$xa)I8k~<}LcXUknjndzCjGyp( z$sd$Q{#eO`3HK`BQYK88*s`4ZYO9j*YNMfUQ=8SfvYfVCwND+|o5*?3|8;3@Ki_A< z#7Ta?xUZ#uyY}@ie?;`IA%9R_GU2yMf1`7EOYRy!e&QWUZF<(p z^)j>kUAxQ{%1KzvB72p3F|5KCffZ5~i3 z{GC66dvtNcaCwxc-cAcC~EhHrei9CQh7`LUf!aPMVa2 zk)-pZifk>_GC}zXUYF~1uDq6W)%oIFl*?YNetBHw^R?CWs%!bCb{g)N>j>Kkv3JpP z+3`e`HA_{;-`lUFel4``@2ff!Ch43D{pIabKGFJ-ifOCJ=)I4 zO3U`SceE9CNyj604*g9w9g;RYpFL}Ro_p&)cZtWZh4aUDbQ~@l`7hbd-V)-1h!cq! z@FUA5j1w3~5?}5pY4d3cYO*zduEO{ZQfM9NEDw*n-)H z(n;6|_JDn5nTRcByTfjyycHH(mAM@|*5iDuHtZe+uBqEx)_iR3fty^nRl9Lddv>#J z$A4h3AuaEp-_`FSOcduTY?geN@#`4%dsOdUor`jC+4vldb-_272E(2&u}|LmqS6a> z8tX;sP|WZv#eWx$89VkJ#D}t_O_CuAwne&1vOoe4 zwBrGF!Z!TCx6I2B=QEcJCxd(ZJn5ce#*I5@{P^(~3*YyGbHjS&3o_=hp=?``)_fp) zEpS%iA@XLE1x}(o($?q4tKC-O_v6~QF4AbPAJzh_cOIU)-m>wmDB54ed1F zw+YwHIOn(#>&^rIj5Q`J{OW#XeslGbN^#@cWLv}q z;2&EfWo&@&!3V|sfU@n+R_X!9UBq3TlEsn%3Az{*Pd{^W$U3DgOH<4^ef$!ZtAWsWxHYyU;#x8uaw_k#P$ zlc!WMKKc&)Ptuq^jdtN}D@i+Ly zIDfj@!soL_PoM89E95T^W*&*+8YHo&3K7>dfVVR;)eezwzpiro2Xb8AqpGj|sQ5PW z=%T`LBmaz6?$60}j@3v5=gr5I`yA%zJkfA%Za413Tw}DUb%jsL79W*uGGYPZQ{q%? zxBdC+dw~9)6wR2TJT)9&Cq{I1Riy_9q7R8?LYG)cE!?$4i}$W4~9;K^2xp!D#SWSuePaGTIIP z!@gV9FRzWhD$62o++l6PiH*F&eHz7a9%XiK;T}DfzTI)?JW%65IHJZccnnNNzIs;a zk#;x^TyH+*eq599YwJOc?fdy$ruo7h$BfxuwuxWDKM|iYH^q2>F>CwtKkothjs9az zZ;gcYmrb&(V-3@RYp@RXi~>%7PQlPpHaHk@%|wp(F8 z`}jDga>G1!Uz8bs4GXG2A$Wtj_#|&XxFF&T&hgA~KFa<6x&3^PX55W-9BqMplem98 zt38Y3n7Yx<=JL^I@Br74FMYi8i@#^!vo50#T;g0{FjBim)}!+QTmTMhE&!Vxd!N>A z20sM${n>&O8ZjUDi@H@Ba}{|U(_zQ7VPk@GWuwFbj0F(Z2$-j4PN4mH;5`8L*{{o5 zEB)A`vDTBNzaPdJfAZwX_tzMoY~y~88UIHb`MMr+fr#qC5fvA>jm9xpcM)G;zb5cN zYpLx%+jWb2&2^fO8~DYr=WR9DRs9O%|MUF)TsuKFrDwa7eJ0qf1fRus z516-VbAUSG0ek}ca3|PbJ$CHaS81GY^LzOE@b@*YOMgFl-ub}&e~opH-M`jlj{nJU z1soyWw!%KwwJN7`SZX(cnd)fl9=PI%F!FKLDb8~R%U&g+o;+kj)-_*^L#Kt z&uM(o6c5C_0{hHlyTq;7F#8AF9H36v!Y5*Wu+R51R%`$5+ZoqSnj*h0pC9-i!2zlh z{yx%@AMp2z8M6P+xVBhel45~;4A!xuEK{gYUiOHLhV`<%#C@4B>y-J@)+cITo=Lt} zJcr>T?vJf1-%4n=Ea%uT5!V)J)U&oX(`HrAuv6c=dZtmX%a%}tk^113+9KX#N54=;}e6CelLw)lveqF10pn)HRecz8LF395nU2{M4gV?9` zk{_4t7#@HF7z<$I?a#;_V6JbxB-ZzO#Gyw|2KTNLVV`~#Mup4Zfd-7{*gwj^yJJ3L z0$r=?t(>$;z`Jun%>iK0%kb&W1HlD$Oj(p$9vgM8cp&(Xx}&CQGtO0fklQbDLq6)2 z`6z3df;GcipjqrK*zlT9-($asLU0OQ&= z2dEQ@4{N3Dqh!vMy_Ku9uJVbAlO6BUosIP!^N!)b_~uf_f1VF8tb^~#DRAD5e>;|) zO~yV)NXB`_c!~YVli&!haej#FTVhT)rJkK5jr_a6<#` z^H`wffExP|2Lz5I4V+iU!pRhPL(k*_z9*=R<3>ye2Q-umOHn?0>ajzDVcFmGio-b>e3*EQ$S z3AVwt#XTafh?M8^XQVG878yBy0MFQA9Ul;{fb$yn4aRK>evx>T!T!8eCU`ErE5HDkcEuRz_VgpU;EKEP?Ad_Ig{!z2Bp;UikEwe>Bd? z_jNA7hW(n&aRBFNzr;?oS(a6K+N8eHW@&}75^t7QKUQrOSS-sd-=h6i_oK{kUDgMC zxozX0thKvmVf5?Kw=+aAY!4#JMOsSqs6Dc&wX2Ae{&pQJb>OypI>0ze0@Il_}(!e zvA%P_B=hNT0Dit9RoPU^g#~1qIAbbx%5j3qCr>Kk0P>~CW-Bhp`DW}o_G>H$rdy@W zb(@d5CNMNf&k;B#tweRKZQ%z_2`+H#@ceb%iE1P87uVPAgQ0vsuxLVm$j4I7F?h@Q zIJS0p2HhvxYL&+QDop2hE88sjsJxHm1M98Q0{=0W2*!yMynV*~yqnKc+89FZM7-~H zy$<>C{f2iPQ_u5xUy(QG0)BTXRe!huYbmI0CS+k{oRt@apT8b1D>sa)pya~ z(PyMB;{a?;yvn>liTCC_et(L@Qq?uAXDn|nZ+MrTg8x=|urg(`&P@rP2>fSWD7ip& z1Fwd$jKj#sSRszVXqkT?eBjp*2V=)zET_>{aqQ*oig*^KslNHN4uh zf}hdx*m%zCdi(i0-d}y*3i}lYs7|Z<8Mo+MeGh+E@a()X67M6+GuO!OD(=YGuk5eI zaUB=9|KA)3#JMuHc%h@?EZKgygzpS82L5MS4`9v@-kYy|z0Y93yYu3Bn=h?70KRqn z8}>8iBOh})wkFUb27m(^@m|OOV4hgOBy#|mZ6)B-%RL5w3+m&H{mcQJW1Qf8pmVZO z>Ke|Kcg)u~54>}JOVaGi9ZQbCxYqDsF-K#2yhC84tlQ8A@1SR|F;!!`yrw$efWNwK z+$Yld-en!<#Pa^puHn78ZH^nt9Ov94#sCp-c$@Y4vJP#OoWnhhYcdDKxCK6F=72gr zkWKoy-s+UtF7sT^v5z6(iu(Ip*e<_2DGV?M;QMW?f&DXl@cr-|@4Z5O@_p|oVW0k? z&vM^ef8+au1G4XTyl4L}+{YfF=9oYHKQ?V*IAA<$12F=Li~k0ou4&WNFZ>iay^8mIO_>UB9 zW1Eh7rB&W>Z+2@O;J6R`E48@*U3Zr-!0*?91?B?(8Dap&I;{22);!1?GWLxdEg$%& z@2&sU@A!SNpZ!1hC-45>$NpvPAMt)O{wsfPeqVSmupjY&b3(}v&I{lgtWSqC$Y;z? zo0@qbIDl047vlUt4A8^}89R1g%gg>%CuEA+v3!9I!?^Bk*rc2`RnH{1SDnk(1urz0 zbKG!F*E@!49Jab|DL4;4z&1mS3-C#Wl$_vv5FFrX#Sv9J0AI2uIPOEj0{hKZ-{B@4|GY?EP zA0C)@oEz4sO-<9M5hK)PRo*xN9w_|3um~?W<})vp@j=FF#0!DHGBqq^TvuF>c>%7d z>^Ya&v2fw_hE2I zq+DBaK*S7@+WY`<0d|Nl3hY}<3Kuv(1orE=pv1rDu~*IqXK3wf&x{H720xTz0LJ~( zB%Nc&?)2V?6a72zRa{hXZ1iWz0mcJ44lq54|2+n%IiU3Yo)o_+K;TqF?9}%PTF%|K3-59H2g|;{cEUBNhPXh>Zc{)8p7| z6?-+QV*vC274{wD;Jp#^f&F}*xW5(tTa?j`#S}UR2Q-c|h!50O)Ujs^j&L6G*dP2k zK1SHEY`GbqWu4%F)~RE=kwY?04No-TU1|B-q><-Sy3f%!5Huz7%p12PW;{wGV%q3hs)i2bK2w)e4qjq@4PrwNxTC+0^C z^CMH|3gLQM#0;4`?3yTZEL&WWu?~Nf$HoyE|JW|~GaJtK>G_%mO6;}5BlV*W=N%h$ zS$Qt%R`?AZH>HLjmBn*K8>FqC!Oxd`0v`zHdiS_zTpMlG<9I!5#;T?HS^Pe{M`ODj z({7a8Guk!O^Y?ZRsoOQa$KKP`tfp455c_@BAkl3I7K8y8Th@a3GV1I->01hzDgbOqlh_wKV&syMr zirHOL43PaVc$;ox`~vfVeWlZ@H)UV;cwfyud`&HH-`U z_8V=oagIxVu;W~Ab?fuL6*lwhC-fO=lg1eNyQRKA58Mei;LV?K$RR%A`W3#c998585VY};@`D+&9hKXlzxJ$K+@OR4XjYRvtJkAN!rQNV^Fjk1Q=loH%DeN@x3C9gm zUq4m-WzU_Tx3M1W_;XYkGH&+wY_3Z?&1J2Q%X;R!^RpS|=^Gt4NOKv_#5MF;b!{%o z$MA&j%L4!SejoRPajt2O1>gqG1?HRmeUy_1PgL^;+5h`B<1ZKXSqFTmtphNgVb9Mh z`Tbwj_-~B=>4SPa;B$c`CqzEd<~;#E2B_nJ%GR*~L^cNYZ4FR)a64UN{=jy5%v?a_ z`(q4{Q_AgpTw9(O{$kAFV*=s>j}gEo_S-CWUTpx`YFaX zfn8GCL8mePcl@h8mD|{gIw6#09mKWn|7$*o@^XzJIDqFfJA(_ry^gV4!*#|o=fOI2 zT%I~NjK&K-hv4-!54dZ_%0uZp0gPul#*EqF--!DI|D^O!h56>ZjsxqyUg~pyRhjxd zIKbus&`sz^Y1oq6p8G-ajz`BO_~+O$oAcFilt-G!0>V2S&^cpzb)E4@=8Up^Z<~74 z&sjXf`wCMHIIVbvHkn`K9-b$q-@Tt5 z?-l-aFY<=*mUANBR`tyI{wzEL?_uN2B5nuQA%S<}1l8d)@}T+)Yn>-k}o7UfH6R6-whLZ|w^?TNs_BQOez*>2ax~}tyKLasEeXZ4xWAIbt@pTQ)t#i$7md`oj z-o@0Hu*9F!sHG8Z%!F+u7>*nLZyy4!*4#6Ff(uVSP3M@H;18RJN z<4)mvx?#G+et~<{iP*qm0sMWI;03#0c$r>EaKQ8#GYm_dE3rKlo)A6}o;~nZ@j%9( zy$e`tfh&7w!%-{DsjS7hXy2|KtxfI+9~Jj4^MUIapF~@6O`IoqS_lY#P zAdW4C1F{fjSv+Ofr#xd{=Pj=1IP*i9*6n5PpgrS?%#~G4KpenW!0~T!fov`~fc?Ri zcRYJ6VR?Lh%@3{flajs<|2ScWG4n%V9{}tA`uAvKo?{#sdwvW5-)i4a#Qd!|pdkjJ zUnLQjmGc1T1^tDcg`Jr1&Es*8(eeGn=Y=1~=bL|bA7A3V%!B*pdcg&jHsGIo_SkYMCI{bq#PUetekU=b(-r>oyvS;V;j*PF~C$kM|GUr4s17; zdmGK|M;+4UbIr$PUCRr17FRUAV_6RlFuYs)++)j9_c?u7a{x9_V_)siris^a8Qs?=fPT;iT%5)9X!eACI3~h>1P`G9z`t>Tc)&1i zae(8y#B|_)=FCpT0r10&)LG<%6D-Z=Ee^ zb8$Y>@_d~Rb>SS82;e_$G!U(>@9E|a|AV>8}aWk zLRl7hn?F!oOWTT(PZIVSGd~pY&pUKz?(ZD@e~gLZy*Uo-M+&YZA3R{Zz&wEPZexLr zfBb&@Ux46%;9hJ6-5PI)KFubCDd{;d>2~8WfR)Mjf$m*mwN<@eJWR#|BEll?zw^`@{q}E-;@BE+u*g$9>>DmzQ-ckF7^r zO*}vw^b!4Ib;>px@gDUe-8?@1ejbN3-qZLh-!s~((#+LY}GA8`P@P?uFUhu@KnhJ8PfG_X%<_@6l8JHia#lY1!OAOAl? zG5+@g|KaoL8~#sBV7(O=#JNZ#J^<_H|052tF<1UwfUJXv0enp9daiB5{i^$5@;=`7 zF?t@i7aUOe`HcBEF4G$K1qV!L4$#N@)5u2*V0ahqE#41&!wDJx^4-)2E5QeLjL*%u z_jef``;M0yLw2ldgKIoCsPR6sJ;#4=PlZwJz7X1_PIG&945t)vNO>LaVgJ`nZABWm zj^jw99~!PNp22xg?^1Aq>D2mf3p}89N)BLMpu#^KqT`4if&(bScH-D{Hgv3yrwvJovXU0lyEpSORt)%xeHVJ98LIh5cUz{tfpnV*kK+na14zh_Z}-IDo!4 zE}+jP99x?6rX%SK+c7;?enEC?wj1~da~_X_Q?TtZg2w_JS8+f-ANX&HeXHN;m{%VB z*5dxY#6Ra|h+inf-W{jnfGQryT#(OU^M+aZc%Kt! z-*LbEY>hYsclgYjOK8J+Big9X#s6>T8YD0t*OX*kA54l zT_}?c8teyiT^SmxX0If+~D&7;r~hXTlgD= z8|Ka*?D*fVqhrTSypw%DB98$q2EhNfi2qsB1NZSAYFqbLSsnL-bC3HY9+hEhi`J`1G;P|fbuQ37VBvIC>_+~!maG!a=a3f3@=D}Hk*$N*`m?5t4b702tRAN2Kq7LUg-cViH zw)LBE(Tp?dH@9QYJ*DOmjswHITj0G+tqt0@y2JyH`?#+0`TU;FHy-c1UR|H@jFsQc zc!meSI64ka2)tXlo(;Zt&TuZEUd#tXyCv=;AF*aN4;{8B8wdN2^BV8=y&`PVIKbn6 z$G`JSN5`0_3Hy8=%xi%5>{`!w62IRD{;TguW&a<39sH6v?31_ePikyHN?kio9dU;G zmjAC{!ZD)ri1Vz+0q}rfUphxWwH=pnfNVywKfcoNj}4fwcKB|Z$B zjtRq;jvcRcJLPrW{z!~REaGjr&$V`}{mfIjZEs)LpG=<@qVpx*$(R1$eLi*k87_t&yTcd zEA|N*@4~rR9Qz)}x*i?>=qhlJUY!Ss`)lkwu36*5uj9WXerG)3WmYG10A-!CW*HB3 zc6titD-rIePuDSm|F3ue`}4Lbvp9gbz&IdMIKh2>84qwBv49I$0JBOfj5ux_6JAc< z<{Ook<+NL3%>DjI+*#YYPdrC?O<6|2mgfS~?$2wCH~RPd4)CC!$DYC7$B$``xFmRi z^Yn|?<=RH!8PE~>9!=nU!?xX%wz5QDMw?Z?Ik$L>!8>M-(0TixRAGOz<-q*rQfxH# zB?u$OJXG*MVbX-dV~y0~bH)Mgn@PcQ#QhC1z41Yg`E$G`z=!_3A`(9-~z*c-M2PY%l*mq z_zY|*Yz*vkZ?ivaFaLi!iy`0y*?b6Pw!bL*ePROE8Wj_qBK$LV{-7WK3-cdl4bHI7 zyIUXRHIj_~z;Dd`1t%EJ3;#bV{xb(y?63Of|BHU+o~9%8!QL<9fl{Z1&TTB<^F_lCIv*_7FIWsi>gz`ohO z?9h14Vga{raBg_axNsgAg%7A}woTuR#9`oVODSB$J*n4>cc0^H$u;?^xRt; zo3b!R$-IsKFGx=nyC^Q$5P|IZk<#aUJ??_z;zi8?Sxg<3>n_%DK+Z zjb-n68Z%~`guK_MoybSpT&6jist)JI=-LpTXUy25%-W;PTBtMDo;N>#9P>_+F|=6- zb?tgm-mOD*>>l}8Wq$1GIQ8pTo`d>IClFJMBT62Eb1W7CPZ{%IuhcWKIy~D7`{+CH zU8Uj~$G)dg9vtdi>HgmC1ux|}L5}P3r}ISEqx=2L9l}Dy2G}Qg)w@*KXAj_m8UL(Z z?x=S;hxdwiFFAm9Jm-PT0U7_`xAgUa_r_G$sD3q9AgopQP`-*cz`pKp&p-+fWDf9k zAorPpcXUi1yhoX@-}#)txQ>pb_cFU!uwY>dS-5bK@{7`Zm6=xFG%y}D^IHP z^OTy*o1f+t!g-G8&Yjmn=C&xCm*&iwE1Bamdrq3&EILOSb!N>9nXP;+oR4GjGj-0d znVV*-eS|WTnSR|&r6#m9JD8ATw!8GK0BLn-679be3J$sq1GjKQfANFOQ*e z9K~FV+L)$s6P)s}?Y2+b?XaWSPsAD}{(}S1C%OcWv6kWUE{%8}f&V7#dyJ8N260lh z6SyG805-3g@lSif0dT?;E9W;K;Rv_KR%yoncV%Pz4$y;r{eO(s{JtFT2_IJY7xu|F z!~x;|w}^lDs}>`~HA)Thfqhb2Q}Gz9jarP6z@1a}AKmOn6|D+AW?T0_| zk#zGff0_R9hd-p>{`R-&o_p>|zxfUFoAm2n|Jvm4yYEiFl34nyU!}Y5x+~pz=bh;e zSi?YG~aZoBO^lUr}SHQjQ{E$NqP^X8jxPQUoYFVamn-IRX*^Pi`m{S5h8y79&v zO@8{*pQambxFP-ICqGF){_&5~kAC!{blr8=r62zAhw0jDuQmDp_rIUM_r33>Yp%H_ zU48Y{>ATC@UBwcjT#p$bGy(oRVsgO+7o;zJ=}YPS^S_k7 z_{A@#FMQz(>AdsKOXr?@ZaU|jbJE#opPkM+>+JOTGtW$)|NNQhbD#TsI^&GbrO$r$ zjP#k$eAeXj(?63=JMHvz+UcjKQ%*fKoqWnE>7 zrM@jL5H_t$*!S^NqyIM!QM)#83ZEdlC+$*Z_Xq3dU*H9eYnrgmx#qI+IG?{(*yp!E zAIu-PYpgJMDeqVLW?|kqKp3|;oz!^1=K-rZfQke1I-oe8xEhK10a9N}^fE7Z9^ih> zF+lXar8x$G7to_&J@lVb${62cFZy4lsb@`(;W_;;Klk5%fBMT`{*wOu=Rcd=ci(;K zPk;JTy7%6D(;xr%N8^>>|Ni&scfb2x#V^h=&M(d>nNJEX2_At%keWlBKT7Vn{`%`1 zxZ?*u_(4LPH{gt`GiQ8fvz&2R=8WKti!Z)doNRfH&ZgGsP`ueC~7U zt#5mKTGg}0Vlv`M!=mO^42#lh$pK&#Ro00-^c|S_t|d1e*^Ep2ZnKQ zzIm)S_#|PZ8kbC+a)YqL|H*r>e>#NyD~Y#D{97E5@n8D?;Df+7ykI_Fbtwz%m-`2r z^CMz_JT5Q}f{Qc%q9bq*-v_T-{}&u!alh<^`Gv6>BjZ>3fZtNUa^M*(mv{!#t#Dmp zJK_e%_1%gU6ffL4I=)-S2{p!v4UlGx6CZ$a-lH)#5XKc7TzTbHRb1dP!4>JU%RDZK z*udk0!1!0wg%^5U@Z~RqZ;uHoe4i(LpX+hK*=L`V&Qe@(=2>T1TmZH$E)a&#I78U} z>}S*IpHWPpc)&!l!KsQ1PB}%f!O4mZ6c3zuqGEv)PE5z2a6&rnxZ~4tiU~fWYlt8A z-urRR0pKY6;_&xyK&|H(%h&jK&d7Tzn&N)0!?)KQ;P~er*v&}ntITju96-K|^@9)m zcaviO0d>qCu}R0uF9dx4FW`gyqwRW=zGL{;JKB7R#r?$oc`RT&kmmvL=Z1CGNb0gl z6Nw*mZ2rE5&sVwQzVSB};2gufQeS6rUC_to_l*NG4`ds$_zw;c?qd!>N=VOo*0U?G zUt&M<%^VQ^yu|+l_wB`a;f@$9_;?|Fd~m>)eEjtqAN;5oAB>8BjSCnXRO5mxG%mQ@ z#|4*NdYO$2@bS&~cmMun`S)^6ko|i#COB7P0^wg{0{l8-f_hwVhWxq41Woui>@zMf z?4Mj?Uzi8`$A0Ql>64#4Hho;fZKq_1~muJhOg7q`!p<$u)P}G6OQn9u_xyMj|Z^567OM$;rp{~ z-Xfdh{{lbQKU(^qbWJnaAyq;fNWrl2m4+t;ThY53HH7A_}VbzJ0>-2)|xZ#^M3m~|EcP#qIGBa zuEp=_wR@kl&-qW-`+MIn>~KgC6G*#$2HlU||E=GeqWgdC*V?)t?0@caziRA1``OPL z|Ia-Aj5z`OU}DW=_1Xgul3oV?YERk`{ar8)F5Mr?*bZYpaXR(9!N5Bxwf*Z0c~em%e7xA4z-@0|D5>=VIGsxdDe zjgC(rfE@f2^Uw0ce47iT?{z$rF>hUuzma3Bxh{44|M-u?KKP?Q!an$;DRD!`0OTV?3?OZUuQ+a)u|wj9_WzS7 z(oQIG!;BdcFZ^}I2GRY`sy#^0Jo78n)58B}KJ#=1PrUP;?{eQIb|iW@b+v7LVU{*E zw#@_R@30LbZ*xG{er^43{(wiU*Ml?YPvE*!61=1PlEMxMnVJpzS&sfm9i*If00%k% z|BIz(|M&EhB8LmG!^0jjwypQu@xa7;*z{4}#C~kIai92SjxlqMSX0$$77oBBXyV^( zK%YRd1JdqK{h)TJ?z;Q#8rid9AH9zKOguhg^Ue5tGftoJHgIOF{jU+PCsyxN;`J}T z9P#=WbzRc*m_67_-<-I;WA}9o4*&eC)mNpTYaOlF+w)3bZ%WKwe)$)bh^s}+t>|XQ z>xtF>meX%4PX8Ok>E)0Anqu?+MlpKqZ{qW*o1c3wY;*MUv(J9k7=7lMXN1$Ih11Ve z^q+kC)1R(B^{G!)pZw$}tB-%;6OlgtiRxn?`*`)ykAAHB$VWa}J@wQ_swba(%JKfk zAAh2H?6D74pZLTl{T#pgtDp1r;+juapVIZ<0OA8%wrtfL+JlWh9VF3+#Iw;Pf^@|Ev9NixoabJ`UEn8v63l$NXXEPv?LnhwE>+vG}0$^@e<< zjKL>SR$@wwlhgZAwzMSgOQx2wubi|*_R|ub$F|p}5Pwm|x2zYd-kg{HrCg8q(7Sn_ zDep{z^PFpae9q-KHj&Dvr(7euF4u3}7Ru9~BG2SCFY(!?C4MtK9*a%q{vRD{x2Miq zfGxO4_8u|ci2EKsE$+iuDe!#enP-V>!Ut&b$R|JfDf7@Z*IdIlbycsbFV)#1jTy8q zR^1?rncNmlY*W99|MJ^?a9@r$b${}JIY4d7z0$^r`xal5dguPirzgsJ-ctS}VSlIt z@V`tr`@ZX2bwb;Lb?T|czvS2U(lj36xaA98DA=bgzqx4qBTEJUfwy56xmbWC#_u&9IA^)zq_Bx->xIe$MO=An$HAiB+bM7fwrU*eef+&_W9~NN663tc+uQXRE}egv#{FfQGTy87 z@ixasQkOZ_k+wMfj5BQSV^3g1d;%LnF`8$7Lg8#f<;vX4`>n0b)+5!#CTMmLB7XL(JGKV_> z{|go^{OiDfvG*G|r*3GYi~%G@$g|$+*q%55EHv>C){())JUGeiIxjYWzY~qFD{%nu zA6%Px;4sGoW_zbEK>H$hH{N(t!hB8+xcTOreLmM=4M6P3>51}8tSORd1>1}{DrtrC zc3P@!ty3;;TCRCZq-Blm*vEd*H%;=mo`G+c@r@J8^P6YQ+-o5V6H80VZ=7LEEG@qe zeX4!kFTSHzaD={7{qX!#^%@)-_{wr{kbG}^7F?JUb)Aq2baY^f@{ApEjBUmbBO^~f z`DFDg!h2%>qaXX2{ffsv_(9v)nli+7TY0E@;Dy zkK{HSut0i}^K3_IKkP|#*VL5QPW_Ynb&kFV>(1GZl;3^|4hY;g<$$@sxh9NdTzGN( z7kO9P@$7KGO*h@VpB!+D&*vU1G+c~)vo zk{*q>B@cWj7r+b26TuC9t9V6yUK{^#z%rgm=aa(&Od z9|H%fr<7^?Qo=#tgJZ~f$bn@d_mPP@gT;raFf7N}X%~>CY_Do&}_lbRl5F^021@gwXPzV_qScF_rZRqb{k~_tKxuLf&_7F?Q^x-jPdwpzW_}i!5AJC{hcOLLkqW+P zTd;=>L+)6O?n#cmH#exjgMZcW zUuQdq-KVy#+qrN+1OLhMHWg`@O-}=2^y2%CLoo~O@_&4@drabVku~)io z8~+gpK<`ucp&N>mx3LS_JivAyTcK~6kd~JO7nmCgC)9iZ)|HYEf(ODbuuoy##5u$& zBlouu*oPBH)EDwTi_A}{Th*caSByij5!{;XPaTI0NN4JLiG5^;SONRs|1;`Sc@nk*Z_Dso>U|2<*w?crHhHd@QjY!hd?t87axi^70rQbq6T)jUv4#U& zRTA&eya)at@i)of1OLSNYW*K}0Be2P1{4pZEb!ds1Z2Fy0mudNXAY2` zpMTT)1)4FzTM7r@W2Eh0<3D+zk%Rvl^NIaw_zyk^8=y4 zN&i9RdZtWpPSYOXe3Cgp^^ln79OK>Cq0X@XBdV5BfzwLkQ1n?jFI5<798G0XH&$e#o z!57)?#w*XRbD5La)c@Ee5eq;+2;0-wa54Ua1A+&V8=@|_=M-MjK4p5}y_(BCD*5_l z|63sp8UNUKu})Rt0OP;-cV&Aj_6zP)|C5^o+VQ@$1rqzV{~NY{8~1JObIuZdBNF)~ z{*TLZDaRG3Z0)k z(9FSUVm@;)ZF@jD`X60y9xxYR>$f?9SYVwR_&4_X{+Y^1jv1D1;sL}Rjb&{Irc17R z4BKE|4sd-^k4o-i7bcPWCibb**f0K={4}4V-++DdLE#4a4T%js{El~M48f;``wwf3 zz!MdIKR&>FH7AI83+L>M|9B4CHn1Ge6z#6}Q{97g#{>0D#y`)-Hhdv}fM?-2=dmCD z0qct)JE7l0_akHNlraJGQK^qk$G_gS;GZ_nI6&F~(bmcN6s`3E!Lzs&>04B~g_emKE8A3n&` z#J{(}dOOwMJqG)#3v-2j3nzek>;S%jhTWez`rmw^W5&ENK0OxD*0UiCU_LPrHd$aD zo$sV;fPcUjcnS*)SIBmPczHNji z_J!%x`(eX_d&&auw*5ZxWZ`+{62en=E0QNmtHV33l0KUOBeUMp}w!e1mKAk4#m+8R3^@;(U>mF_7RVF-Y}@v?ZU{dy_5VW;f&Wif_kU1*e)#=x z!Mha~;GWt4Hyv-ZV_?5u#dgBPcrV&`J{q*z0a)pFFJ7gGd15` z@u5z^|4QNgKV=M+`biFmcrR^UVgt=FTG)B=`;C3&i=2dC*#Yna_y+HZedD~~ehGd( zx?k8|3YKddAoyU3a1Zt!GvHh$@SeUv*s9pDq3bQD+D2Z84cFLrY*=!yGS>5BTq7KC zi}ZW`%@q&0_13Th4n5@HYM#~4 z-z?YV zq3Q!4cueU7_5r{@ZI$@1@veIWM&+wuyX$&f(=mVT8?)@o2OzPJ-lu&N_qPA>0ZQ^Z zj`I6CUfT`YuE!IUdn7k-PWl#!dCMB-)pfA+=N;nzuUx!n$=~wMZQqAB%v9P#$LaUU zI%2J)b^_0E0Q$RZ3)3DGE8GSLw7CGxFTqZL14^PFoCGJN?T`JRK5mWw^6hxH2f7P= zU>OKK*3|drG|2#R;`Kb`4P67#*G@YzPZ}EbxXBn^QLOE5;CT-eCT3>Be&N-VltgAMzUt4V~`37y1)~_pR?PRrn?V4&`No$pp zCMT6oPE?a?BCVMiuSk?nOsuZc`1opv&d~u4{Hxu)FBvxe zOJ2wNwV&KUj=o4eg1oSw&qD5FOP1`F9CbqcuS@Uvchn2-K7|9s`@BE=4(_wfX=~br zx(K^HFweNO_CELr;~Wc|Tdy}TpV$ZU99ycG-x9XwYo6pS3+={*c%9U|o-TPVaAO?(S!W-3O{|+qP-0?tz{UK;5Q3 zOb$qWXkI9CLVbgO;zVzMJNSP}xPM>4|NHC%yhCw8ViJk}_V1&;!!K#zU-u3U2z(-! zZ626v^QHY4x?w8jc{X!^k8&tV6jF3>j$!SV66WYbADO(OKSrC8S8$%;&lR93xK(Xu?|pK z8<2GYnOpdWU)TCxvF=aK`)|(W%{2g-OBnMBwf5h?)A~NF?NfLl`QhrTuhv??hnW8p z|IIvk0a-zI(2t4#J$vrAzyIF%zE?5-_g3$D&wI=RiGSuPG_S=rd{6rZcVmmItyLaA zK(uG-=Vn{ewycqwZJ+ji;+%8qB%FJkNYQ&!IUu+NnejUn9x&%1TU zr?%hkZ+*HAiF@Ji1^)f)Y9sTrkGI>|cvsvmZAJEx3v55y77n;s{r>qkJsyy{znLe_ z{~zHzZ2<6|>xF>zwhf>)Mr8xAu4t|&n(K(hx*)N3C~JbW*8^j%&{zkop5OmU&h2M@ zajXZL^NM3WKWl(~t@@hR`e@JLXWh@{nx9}jaUJXVwDHcIVde`nS2*VGeb(!FVk=yI z^)=Ojny-gVU*vxu+$R3P8|R__ckjN}{yw-TJ^JXQ=7ERRFTi+d=7VET1_y+V$@WtD zdC3DA2T1OZaUd~HhqiZ{V*8bC;~zb)1kYQyHRK|6UDyFJHXv-@kP+QVd(?J`arBB9BT;Yx;3;v(g+8xZ@ z!54rRHf`SQIs1WCbp6x>{u6J}N4%igwQG0vp$~n?xMwZ^em@+5UjUAXGX|f;wc1$E zHdnugViDH&=wa((9V@XPV_j|N-zf*f$VB-2;k(Cv+eWPI0iByR0OueRwttH*fdeSx z+Q|nlGyXfq|L;+o{paAwh>^y-27iKk+9zxS)w}jdjtPhdJojDg-n9GE_Q!|E<_Fit zwDRS|`GoIf_6ax+zBw))&^8I~Cl=V=kAAN32{R_G+^!phX zvP?FEbp>rodn+-Q#oKZ8z9yZXAN=I4p01l=R2$y9&3er zt>4<_XPuF$`ajkIkF~yXolorjSl_d)`*Yn8H~@cty3ZeLcm5mW{&QZpk2OJJ%^v3O zv!3UjcirXhmeAK{89@%})Wq*n>2>kD@UwgOZu|S-{+*ihi`@_Y=@$Ug=>I0>&FN~Z z)b+#&@cUx?Lf{~8vlAEaw+Bj`5FY{mpv?^t5BT=C|Em6e0P6$4;#fd_ zFCbz8xz-o!fQDVb8sA^7e*X{l^$Yk80QP;855Rw}1qAk)yZ^MffU*00bAwMdQ;iDU$aDed)c7mmP=;j|I^RMxru-Dzf-|~azMyP$QsW= zOscQ1Z&nzx{w{MDn2Q4bc}MyI(;rA10GSG%621UqfAViOJAmWhmiRh&BOd?n^?eRv z@_+ot-}G9X|4aRij{mvfQ2u#Y>nmb%Z5#b}wXPm9xi5aPy|&jEzK}8b-_#o0zo9j~ zSYuObYs)?dqt89}S=r`cqvyI^tk>0^YyVM=wf~6b-LXd3lhubc2KVtN9=AW9V{yRd zdlZ*LC%;oVn(?~)9=qSzXUz_+_XP(qZhvTK*zJsp@$wa2i$kxeYU+K{vY^9ei+Y$UlEw3&ENv=lZpEVKlt8~!y4zpFx%+x zCf@7gItHHMdt?APN7p4EB!9JaeOx>2ldwI&zT*$emv@T)->b2a|44mNHyH!59Z>2k z>O0~k_Jxdj+6+D@dcWWtEN9A?f6PxM{vT=ivfu{qgLU&oa6s7pv~}Ttl26Be;=i}I z*Wcg(kLjC}^T+yr$Rg_&F#eNgXMRXE2|g?;}<>Ou^hucVt>&h&SA_1{UEZDBo%&pE*bfy2Z;_YV%jHo#ucm`vFyE0w@~>hv+C*rr#y*BQLt%yq35R zy})mS6B^IdIr_g(IQW68E9(G-F0=P*Iq#iQvlW~7?>u6&i+d%l$Hn@)QJ5w>< z)6B1eV*4k$$F4_i+M}LM0lR4wuKs9uP*Kd+xbJqJpSGTg`>+WX!!hQP zz`C!aeXbMO58mN9U1y!s|JSE?{b4N^@E>)lI&}{BsT~vl*#GcC+W%mm?brwN%r8+L zHFP@T+-uAW*E!Y?J0Q0?pWiVDhB9QI@$Ja4WnOK8EQbz=HsD*ibK+n6pE19zWtnY` zy_a?#m^b!yZSur_m*)HMzHq>;x9#6p;oEP&&F6Ou!(h3$w?}z9<$iyEua9%A*T-YO zzhB=J)o(bD?Ot6Y%X*k|pv1dU&hwcon46^YIR+0nG5-J_Va$rknmoil-x%fnN%8*h zAnzaF+e2^PuW>)v{~r-L8WYRreM*7&DfscvJpt=>;%)JgI{ z)9&ZpeZJm>Z~)XxX%4t`e>vcGpARO9OMvw@-V^t|)!-oC9B%Iq z4D<_Et!hB!#yB`v;u>5lFdlhs!vQ@yr(4I7Yf`RVl>6k}`c83|Vx-H3A$%X=Tec<2 z`#S!GJS#1hkA$xTMu{g7GXVP^(wtqs=gAn}mi&Lt$$CUq>~CAIw)F=fIYLE5H?U1P_pSMtBeWS?8)PY$qTCoGZ*`dp2`yp*R*C;p=j~ zc|ZJq>LKKTYsC4Mf4zU$Ghm_E61q=auZ0W34(k~IAN>EH)ERYP>>K~^U~pk@YhWMz zdrmoRMtdobK0vjZ>e*Nq=F<*fUK?fP``}*s9~;2y-x%Xu6IqBjP~x8brvJzDfK}Fx z8qk{G#L;KNe>47=0e9Ycr#YZYen6|m_s03A zcwe3R`}_8~{(S9jRYj(BuGfiH`9be?wfD0QY^`?}cOZ{(N7YXQeMBYybS7uK7&$5#$M z2tPRNf8>BMrt^)Jx%7YHKiXfhW#mM^1s~RZdMDZxxl0a69w0V=Esear8av>QJBl43 zJi<@tb?}SrJ}6EI{Vy9ITnq1VvkkysT*W zNqYAw96+5Hyr&%yYflN2YO9F#qtk_F_*(t@=zZ*Z#{PhJ>--gJOZoaP=h(Ca|ECV1 zzO&8Ac~;7ZSEF0^2mg)-O9m{TdVXvH;~)FKyi@AP#6SD+1lU0)UR^vOIKY?&=pDdr=4@vI>rTQb`W<|;5AJQ-8~;(hQqS3Ip6NIKmly0O2ar<_Q}8dj zU$IhUvJ1dJ^>g<Ua z065^f>#ldq58RXR`@uhbtng8e{YA#C`_UU}4|sqwwvjh-Qd15%C(q@asVQQ25#I@Y z-^71x2Y1!aulL74f(O7p^$~m&*XH?nCd!mL1^U8Opp9ugnCd)9I2 zez-yW4DOXjqJF3^;aqq}r+b|Xm3d8^m1;|2opSJRov(2KE5rw^n-lxAcO=Gr@yk0@p* z{Hy;Y@dRF|GwL(z7wix#zV5o~?C*nn>Vt$GfL{Qf=u1Mb66;{g{e8Cmk)^;r<;H*E z1llS3OR!@KhpYXNjj-*&X!PyCdpw_cT+g~pc0YWcdY~Ft7asav;J0Gl*;DQ0Aev-=vs@Cw3Vg^IO0qF6f%fWf@0vs`5d}ANL3D~RV23^B( z0PwEoT&cXfr_cDekAP1gJ>Rqi!2UAuU(N-)_)B-(d6)b8!2KidW?axC<^aCi*=ouD zxBhSAe~Qc$T!DXN=ep~!ulC%3e|7uqw>!a|*a7$j)A5g7fpN;IXX+m8g)La*j&t(7 zJg(oEyG!ohXqz_V-BZ7Z{0QrMXXHI)o*Zr@77%4|FRsJ0kcSOu+l@du3xu1a$*_6ZVo>H9CO@ufcpIM zZ!SCF_F@OnPuC}$lEA*Vg=fbI(fvxi4}EOtZty=Sec!{ju#S#TeQ(>}IzRk?{{BJB zI@mYfb!>&?xvQI4;egBd4Kcy=12}FU0d5dZ7!$$#ms=FG$KS`^N9RBEu*U8R`)_~n zAwAEKYV>@K0@Vv_4dvI^;tKQNkNFHk5m+NOaoS^NF zz`uOxmfq)|sSDdfsu$`DyaevU2jl(Ad)IoO_N#4xTJHz;(c`R<-^4xJq3em`a6RxA zm}fgVfY=WSoVi^k1K4`0lgW_-`i{|qbJ_pMDsxei!y<3!F3BqI3cn`@k_XlT>)7fX zhXcScz5vey2QAmthoP0~0W1P!xx`lhN-_@1&zv>VDR`3t*yWj&jPVt_VI*)eeyE!*$ zJ~aM5xPMTwd&UDksCE4I?783gU!ZlM0#i|smL17Y$PMG?a~|DNjgP!qV}S4S9BVL- z-iHHjyzxe39lM`)POQ=1O&>onhi(bmpq2@p$GOOYWdwYKXZQoz#l|oDj(LDZP`fWxa1%3Y~x+qOIND!n}P=m65{*5sT}7Rq+7&&~BFO-|aZq zJsKN(x3O`@9e3I`zE!sI&5DcNa?7p4;LWm~Z>X-7|9s6g*H%|akG}0~S5CJD^w@$C9-uT8hSC?IOd3E{aZ>%o6{0-Fw7hY6t-FAfaINXO1fc)blpySN} z_5<(*uy?^ep`X;&hyY9dNt){PJ%uJ0Q=QDd%^rC4fEi&;R_-o)5@;M&<#sJ_zdq{Ka4VW%Xx& z_Gi^gFTJEWM}JyC!N1rxWE7Y2W-a=%Ku*|UV$?bbCI`s z0IY$3(p!Z8TW`I+y5WW!tLt@L61xAYtFAKEvH!sn^_ci-Vm|nmu~?y(se8`P-ypBH z0aV6)X~X0u_Lniks-@5j zXABE=PA2Lkb-!bQ$pP{W&|~HR`M3Euoda@CQXXfYHAI*TjQ#SXAN|Pd1hGa4bASKS z-~O%F1Nf`I`i|ED`PR3-RlV@Si<)2f?mEub$UD|1W*%%hhlH_V0KNuP=Pz z-&Mc)`OjCs_Upf{`Mm#Q^|6nCLh<@hz0}Zx7ht*`|pc?^#4`T%@51=2ltEx zxceT)?cD46|HS{%@8G40e{?851bD;tHs(~nZ+g?4?fYM=@2y{Z?X^nRR5u9!SL+^N z3tZdxQvEh@pLkCWPHv$6sqflelN`ECeWH2Kee!~LY@pJn00UL+`io5B~-SM;*2IvEMlc?)eU;`}I^->-l;c4#0nc zJ0ji>-s4+(4cr%-0{nwH#=e+;;T&C`1YhxeSz=qW>HqJ3=ev?seFs)DO&)%wo>kWY z|G@#gD=FlUHE&<1b*{({maonjBi0vUUJTDc>>hbT53x-db^x3h@qoJ$;`_`QYK~7% z{G;y^|EvK3{{Q~(g@3IHg8lOCZ+~0s{{3%W?~nBiSnr29{lEVQe^6te`TJk^!WT40 z`14+;<5{iO!#DR>(*s}PaK-Br_t7VyIAS+C4L(J`4X94#533%~|M(jC{CC~6%h;zs z5MPCUf!5H7^*?gbtGXwSkiK?eKluTUxcm)o@b}n>1LDhEFZ&-G;H__cYmNUV?o-cF z#y0hvZ39MWyE;~*ZT6d75c?^|4cmY=Mz)Rh@D-9LXis08>t||Qn`_b+0q$w%;;VE7 z{uTclk&pD#u=}H4z*gu*?OQj37unodHzntL7~q~*oo)8Q0brYi-fwe&@GV>i-sAf? zsq3-*+X;SzmT!S;GdXg>^JfMwzplaKD)P9w+rvLDK>HIZS>vUX)YNc z{;xVkKfoJ~8%RdLQrg~yuuXfAH|30a z&hoaM-^P8mD|zaMEK5C6_lt^;g6s8r@c`w?3Hh6ua@rYu_#V0sGN8E$9fN=M7yS%f z(0q6BpLGTH0)GvD6lS8$@QK=qZ(cd>hYnZbTRHJf9PLZj6Zhvh^WS=UxGva_SOPiN zXWj>O4Cj*DHbFj=th133wFj~9fq~YX_J4k}fcFVblbl*{Q!}e=ffPHA#(y8z<8JZo5>ew+5$~KfHi`DsI@||0sf9)L7sh9djB&|Yu^4Rjr%7wU!O7j z>o;t){S&b;#Q|jhgZGFH5-*EB0^$MaZeojf@6s4O$0HSsyos3PZO-Zc$Dc6X!G!9u zZA;T$aV_wV{wFrc7(o1ebp91eY`^KvZ+5#T|IVaenmj=LQrFn!iSy|>a)K_W99hmb zM`j|%S@3QwhYX?X64&s|z6o9m*~1q=9(fkc+3FbltDb%q@sD=hCHDR9)R*v1-89?D zI-mAvBy_y}dF6?J{QcDLeZA6~!oR z{>{Y!9Gm_JC;V7(K zWAVKm=IpFrzd>Uk)h?1>lKp?h0>OWu;wRVuft$ep8{YUv+xmPf?S>m~a(^J(^hbby z^#3x+1ZlbSM&Lj6KQ;hZ!`~uZeDTE|1MrqBu8_{ZLL6|V`Z3<7xWJoSkBNWsCf=vx z&|FKIT)c<(x^~OEeCoaJ6(CvwT@E(c2q3|EE z|0CYA-2IVPs?U-*AnDE0`&WnyF2DS8*JBg+mbDpmFfyn%L$;7V>~ZDIl-Q@<(dmq- z3a*#^DcSb>(e@4O&xm_nmvLB@H=WzgL+&m6l6U>KBlJJ`*E{~4`k_9vew-H$XxjqO z4wiq_fqj2t9-g3Wh}RH1V7u7+%6n@&Km7gyY-jx*JArLC$tAH9#iC2R=O5zl8k@Sc5q=zFhw zV?Ky)>4KfK`@u{4dFFAroFrNEGbnFAW0!G&Jv!U?zwdqT`?mYh|8Q9I`J3C^7yEzX z#*GQZS?&MO|MLIQ_0szu(=UC&bF)u*#si64qD%O0#$0wl)BfkY0}gntF*&4IJNlNy zx|@u3K(EDk;g}1=cwE}%7dpu@ma&oP0bYi7ozfW;H#szkD zh0Ie97hof!yBR}tt#toeuY8;Qb&WStx>{q9ur+uFxCHx)K5Lm-Pk6NM7$_$eK4DH()MS0 zPPl?+jg&GKd=WCuwc{QU>q{Qt9`Fs<5!7(hI~hB&SX)}$TjfN(m1{qCgs z1Hv(wL;e{X_^9+gWAt|I+Fg$=yi+m!b+Z4FeZ~PzPsWaA8y?meK;i$~^Ujyfzealc ziaLRP{P&U3G4+E){15zNKj1^q9(iqi?j=iz_4ZWfo_nq^{|4dxQYY+wY=Da{y4deW zJQeI)KTDRv22B}E?3H#aZP&)W+7xX2-Z@T(YXr_S$G(Bz@EyZuAcl`jab2F9STxuU zZlN7(`PXmI4er|e%3+S|I~Yr>MiZE)Z6L*6AvV& z54MT(bvxD{c0SlQ{#D*vY-hNFHlV(^!TGTvq`u#QTjep`5E7bpYn7-Ak`2Sq^*Ex)FAa=n!_&s#TFE>(SMu%a!O8AhG@j_|Gu|_5pN% z>saNq2l&sqV`rXqmi0b(zv!Zis!L?|gMaJ-+LgErZ4+3OZdErua8 ze@HkYH&3gb>Naj{;{(U|-`Upx`<`Sq=An0~UD2oAk`wEG$qzE*cT-OMZ}XCI{So_dVi_19hENH8L{l z9PB&E1{ic2^gCcr!!3-nB{s--n@r>56Rtn7g6#kgfPL!2zJ$v00cdaVe8w4P*=8rM zc*!NCOEtIPa$)x}pNEam#FzD~Yys<8aR}Fe4><3vv(7f=FTC)=iewJZvz~X}d44A9 zpLPfT$Q5}lZ<3$DtnjZo1;eCTPC3{6=&sQD@Bk@vMa2C$mcQZpagWq1Mc?V1&@-{0 z&q3aNKDJ4E){eoy>T9p-R@ibqsV?9^-pSA9cdt}`@FMQ8)rG82s#XgC7J#*RrjGqJle4`kdf&*wzp4~d9 z@%;0&e*awff8m7}s)brNpIAn}-iLRHSVni%5)T9y1P}B}R>6HHcwl5izP#)JxZyRg zd5z}%%-%QHlb@JP@8N_#VuIKKYHP-UoO$6Q=z*B*F$p)OE-!~J_#Q9mqGbO)kyL0f5 z{a@Z6p1JL#T=tE(oM_378fO@Bm!)6BiU?df8-D!Aay=En)@(!nVje58TSYOe76Jq^ZZ~Q zJ0RaRY=B}1h~rx5e#sg41NSZY2Jiqm9PsMm0e1xl$lo8<`1_VHNMd_bb^+s%w{G25 z?L2O0b?mV_s$-AYQ5|#4vEDxM#1pGkW2^LzQHNk1+3!`~A8pGvz65*^erfj;PdZtc zMMq!YSirgB7VLF+fcnO^&+$X4`@uc776#B2wSnu75N*kWBltKk?Gm+pYq4~JQF#I za(IZGeREQW%>SeRPZ-;qb>+P9BJD@JQfI{WZ9}V!_osepoiF^X1Q)`*v8|jw0Ca!y zL1Kk{&S5{s&Ix~T1xfYmgzhJCuS}B7z<%3br9X`MXtVqOfq&L3!R}A}Z|v(Guvd5< z;ueYji2ltS|68d3Kh9@9BZ+qylwCut1HMZRXvsGi(t6&k>kIzj0&t%R9w0HtV1MlZ ze1-!Le4T!$z5rbdT#P9eN6xkA!(=Q1d5?5EZ3O>-Z_4_`9mqZSPx+^PGno@~9_@Yn z@h2GT=bUqHb@th3S7#}mrZE9 z?k_eda>sSiHI3g>mfXa)j&+Rwm*2J*xuQMr;auN(M`R;871^Rb`g9KUKp$w>`)T)c zO!yT(0{gL#y${~8m)mxK`NoCLH)qs&T-&nXXW@BtU)`H{Q?6&1Jis^<`o(6$KmGs6 zBWuwRw{%|xGNty%MknXln6orrYYA@I+#dfsJ^uf~3x8UHf6r$&-obn%cwlH~Q2LmD zI>qRbNnM}5%|XfLkj4e$A4C!t2(Kd}vgL*2*ZzX>0Zm_E*FC$c*XjFQ;2PYg9bjHD zFQ~7eln+YIIiB%{0oiaQ`}^X6j47B4RKMm8a@F(6C!bPXaQ=nWnP;9|VZWbo#+mXj z&aa5&fgj>~*a{IdKo>*;OVl?hWBMnacv5xtIp-MfV4rKSf4b~~#1q&AZ#Dm`T_{UA zL+&^R&XG-U4IhAgo@Z1%=s6WA~NHNysAA0K~^b+3hc>;8SP-^M+4nr%xx+g24Pfq&-s691+Q+y^i8dmbwN zSwEfS`#x_&bYtuQ?TXv{@7OZ|1AA~FKGP#qQmETPD5fJyfc=WeK??{ zcePJY^2ERG0O^15J~}G@-TuLlvB^GI<-42v+b^(t_ip(saDZf3_(taslZ5jjVH(`0 zj{w&59P5AN-khL*O4TjL;U=zOdr!LjsH3*q1~~DA6D#nG4RH3^=Ts-1bduUpbAFej zC(~|5E<%SQ7pebkdu#u=etQJs;Hp}cSY*7w%4B#-bMBws`2nIo$z?-=`EnA)4~ zPThj{tYhlddY5`pU09DuUajk~^_8%#oeM`955o_zT`XB|N%mX9hx^KeIdF#`VVp}> z;^V>b=KR7#J(;VWy#A%+7WqW~2mbrq|8M-y^8Fw5|1!m@_(oyc{y9D|`X=SW$oC)A zGw|Jlt(!Miv-$t%f8$@{nZZ4nA5dx)4j3HhtvO(17~4E}k2)X@fIS4(={HP$OrHRD z0QV~ zf?@zWcOEbN?o>SB`0CVCPOVNj;RMSDF@nTA@?qOizYUCr{hxTlb(m1_uxADZ2oO6JLvqtdFY(r z0`6_z0N-qjC%6aO+&AqHKVMJh*#D}py~bA7VIxQ1dJeAMpZ7LKg(R`%{zvM6@ZYa? z^fOD2((dn(K56Oxq$RTdkKDG!c0W$QO#c7UB@2Zay?Z8M9-PAmt--Jb*d7`Zw)9T( z4m+e`%mDp{T?8pfV|iUaDx*%U+oth5cN%+Bj0eskw+d`q5JUzPEdZFbog=FK5oZO;~$$U@#a{g z^gsH8vczNJ|CnQrsj-hO0S}Pi5`LS00>5YNVqZtwiMhl(_~#joJ)M{Pp_>Z!b^qi9 z>n*)cOLc(m_w|hb*v8JKoN*@DmTZ&k!<6$m2btuVkjKN0_0{;c`;s7vjJ~a=7>~U@C z+ij-$Huekt!M*WsUgtWBL#bZ^{Xbj$5B-m<@_mv%J?DU~3HFKi@yuYPMQlRP3jVhr zdBm*vfAPf^Wcx1@k8~UVL&81SA5pw-uwQVEg%>Dj?PzQ7{I_K(;)yZ#6NOBXMwy2Sxu_qXi;xFGp}e97X4ikF{L<9GVTpZv+6 zcpgDw9u8PDF&@|zCxB5nV3+iJ{>{Y!d{_4nozL&M=4#>$#Rjk)z;>|(IH%?S)iw42 zyfGp>ify=Hqt**K=IEoHjy&QB#RHD2wr}5FZ9i(e^*@-1dC%D6ML$SZ@W+i~Z%3SX z$FVz#FR|11MA{VO#ERn!BZJ+oz=HLSz!|%7;X`k~rM!yQ@2Pfz`RL=7tLu`X< z&G{7oKoBF^AqM1_k9|d1fB!`v&a8ml>fhEq5A(d&H;TtHi~Z5 z^JyEM5AJRIE6%Y@vBWdaI4z;OPyUs!eAyh)a!f$>r|gDN;eJ%u9UURjH#i_nAEa;P z?W%u27YFRR=kDs@gJcKjnv>#^F~u6N|4C^J)EpqY%^V=SgLxADk;Br5_;Tylt*f?e z-Kw4&*je)~qq^kcl4I{fsLz9>E>$qP&gkZu=5Db}%047~2xZ9T)Kg z#wT$eb^~tXX=5(`(~ZMd$C{Ixzqt=*pM0jXCE7& z#=LmIaewT4lKcO|_s!eur_q14_ff+M)&0|M>p}ZB2WdBJjU-@!^tp;UB+Wi9F+eT%#r5e^|bM zm)12t=j=0U+)lq%;-5Z)(NX+Q#`26LFU6=)~0-(3Hs zrE4ZezzN&<62~5UtYZjZe&^1e_ATH8u94@FPf7YM*8_vbK3t##wno( z+LrS;AASJuBy@dK-c#W_Gm>Z|5}CjJBWmOIrub=s1=)8=rq?SAx;{CsqO zwi)H%pK<8K|ArO2`RPw*xBr=&#J9_sf1EEnawdb>v+3Kl)$z@9*sr zU!d>%q_+oc2Y`KWziN!WxB>Sio_qFL3E3&WJB80{jsB(b5dx>u`@;V!;T?<;16aL^ zetmI(64+g!e#ckC0rNGNfw%#F~nnzKE{5;(MKO$k!b7G z|B3zlE&FNngFO;<02svPn{vL|F|o~gY)4QIko|EW|?oudp;93 zisMsyZegHf@UJ>>|3CHCd09!`=aLm z;Q#l_UjYB4@m0dqh&Zdn|H1LFY-?hPP5Xbk{{QlqzhwKLz63ZRk~l@%Tmye#Soob7 z7as_-BjUw_4rGkb{>>S>SK|W?JLDig3;3rmkeC3;c7X67enE0T@UHy;@j9`HwUd+P zfQ=hAmuiJNro4w=p=;FV zvW?#m@545nMbdWX;9p$kSi8n=yFUEB;bW&yMZNR>w)skZATLoj)KU2P*7ex>!aqE~ zm>_I_bAh+%N1uY*~bo0ISJg;uBq?M0}Wna4lI4ptVc1I|4+Yv>VNl1=sm!w z@n5iy|BwDZ_L!q)#s5n$zE~|+|6gCv3SpqHnpiz5-7MLY9WXp3K2RFME)a(C|Ia?_ zj9IVsJHPYW8uxpE#w8yv-(;~9-%78)nY>KjLsw$`#1-l*%x@^FqsiaT$O|`lh3#g) zz;5{hhaGaTxnq@L|D?15>R5xY4j&K~z}MiMh##&J2TWA!)~=1Dc);t`Cx|_OjbOgV zUZXz&?8!#t8U+_R9y)=T5NoQ?pU9X3bUxQ19sr*pPsTLZ)wys1*I+x7WlqO^F6S$O z`PJj&?$b!!PEKDQ_$Q&q(dWn#`-yXMbO{(|I}`idn|>18qJeSWm*=7!S?8S9ikFU! zjdc$GrT?ivlJTs%YsvPeZtM@a{#2)~JLzQAM{**vKpz0f*w4IR-ZnROx3C{vK)Wzr zHpaXJ4@5ufD%C5TO#5QrlluHz_!eQC!2`h!!=8JB|Npa}{mhVP;(>zb|BHDFa1rBt zZ1W56Iff72J*fR9!s5}}U!Tz0$7Uz~zkI3i->W`H;e15)zU=_=Iw_7Oy}f+dV#WW@ zp7mP)_>cck{oe2WZiO8{EFcqpfz$JmQ=a?3|NQgSm%sESedFUdsvrE|2flXmeRF#X z2dMu5-(k)8YWo512gE0k9e|$!4@?M0-d7oYGw655B;n_iI1Ud?${v_h?60M^Aq5Yp z?u4%#N0c&Q8(HUIC*V5}13=%?r@%JYhZ9ow^E>bj?nq$YxK|lD=UFb`9&M9^Kg(;b z69LY#3)=Fk^K`Amcjlq@^`7Di%GiewkVEdlb@Ms$UgVVJKIe(|Iu8HD*{KWSreF*l znok?;V835jqRqfDxMv-&#J_ES^#2U_Z%OZx_+8d<;-7ml9-ADy%`yMPy5{%|>)EhT zNZ15}DqEudKjwbypZ-_>ymXZPf8$?Vu6PCZHsg7gNw;rTpFKF@FY%Q7;D5z(tv8~W zAHF{}KE77)EtO%jgZUs9j9@(P$NlrY*ybGcf2WN95$5+&pVW)-CEO8LqYi?91Mh5828O}= zm}Dw!dFnRwe@oaVO~*g6L2OHY%WwECeSfttpzGrM5Ab{09?UbReFw^VHTFYPj=j&= zA7X;cLnjtA+xVaFm;OKO|9;x7JQsEfJOKW4EZ=h3?7tZQOXTb8y+;D;;C;1Xe(3*k z`2+L`Vi%zQXY>D?IQ^I0ZgK$Q2 zeagT+xP=GM_u!p8wlyXLe5wp=f)iuka?&zy5Ceb%um$i3h$T`+Oa@)g?^^nOVm-0O ze#l?JsIeZr0(L#`4;|6KKXS}5@Jx;jg?>k7z<=b)7nG%L2iwdKWIu6^yf^WmdP`*; zqyL5bz35voAJ~d|3Y#fn9`Gg{>~UYVg@~)-?_!&)4dnkvA0PGJ_W1+z*jF(}Hu3NN zX0eLz&|knwUOGDK0mf2#XjGk%RYe`|FgvZzyH1OyZ_(#7v3{2nfNEhhW(HK zPi*g~Be&L?xQR^)(f`Y2|J(N;m!B-0lfZn&{)q*SDiKd4b~lq<(!B1!^mda27)LOF z{yaS|Hh<{<)c1}L$mSZ8?9*2O_Kj!x1C+tj*aMzVpmvJ!Ly7;Q`&I6^V8K7z@B{q_ z;GNh3wtzW6W#pVgi~x+KEzslvwkda+un8}K#pDHWjm?jo&V+5_Uf1RrDKQ^%9lpPh z`S-ywtHgP>5#Th*JNM3*K=J@~fzH{hc+9BMFZCbef8{&vwatysUpTU^Bh|V4<6JJ= zN%fNTKzo2)uXO>ww2e(kT-)PXB|rANg>mrD@s{FaU>+V=t=N<6S2_lN3?B|2piRw1 z!ai|6xPX1e`Z5=YxBxZ+Yt@fR|IdUoFzfL@8tbz{aWwZmp!d@+(Kh&}?=I&5EYz6Y z*}wns(n~Me{zv~~;~W3OdM<4LVh>QB@%x1f=2cIB=F>ce|Nf=1KHK%19I#8izyghP z1pn?2P`w-Tl6m5N#=6=MoMRhgTrfCZxEB^UC(0vch^;^wIl2)nvrXSHc0u+dU_anP zY}~jZ`WD3n$Pf5WnM&Q7Iv=}$W8~wCLzpA9kIeYDvJWhql8@woI+vW-27p_XD2ES% z3nHG!b+{+j;CiHpD};Z_{Ybo%&(m>o>%k5g|BDYJo5}G%bEN7G4ghmeUr{gi^HulR zM&Jn@P7aol4Pt%Z8(Sazv(J3DmT+$#C|nUdpz-RGL#{EXbI|?P|H{Gkuw;rHe7B7E zrY(SdFj(9Fv*DllKiHS7QI@(tp9#z}UJv~b2Qati=6B(@9Xxtue|bdQow(+d^#62Ie@tbtaT0tVCxeTzz!hJH#xb+Hb303 zR@)IDh;f8q9=Uf?8%4WfKgE~<`wZd?bbiDV=nL#O=F$Dlz68b>zy&#eB=Mg)G6wE4 z2bYOO&OuM4&A>V6XJp5}*SY8tFzvX%_Sp{KHn!md^Myh9Za=3x}axA$a z&vCr7L-3FOS6%F-PJm%mJI3N4^;sCbs{n7i0eU4Gq+Y{e9d;00msE^{O^|k+7 zY=HUZJ2W|9&z}3VCh7wF_JMz%f5h>9V*c4rkTJvb2f#kZs6%8R=N8cJVA*Y|c4Zs> zhqvLC4Z^zlMg0fF5Z10$UxN50V+e`+lr`jzYk@u6h2`2{l4syNe#5cEGV+laCujb6 z+LOrxd7R(y+ZOL5?w}mpr@g`bi7n*w@GKnT-q;5`hn}sY{D0$LV`^*z$W|gw!uwLs z)C1!>@cqq|s*lw7_NApug9G@TY%A$>_cd!wTVg-f$0CMHtch5WHU2wtqIw#VF zI)2fGY{zddQh&oKr<|rKrmo# zP)-a0{G;o^aeEzu-~xU_+tOE#u1EjF0r(lj6PZVVe~|K(SRJd~dL6 z2QW^Mbx*-A9KiZSY?Huya5(Ry@q@w&b^!H=jQ~Hu0XdHdUTCo|Y``Cu6V)}>VhmyU z8ZoATdrgQ3{LMtLE}U_GOTR_uq#jNTTK*E7Iu}krf0LTHPyO!ea-I^{w{8Q|jg-gg zGM&qI-V1wz=SVw*XUSuf={Y;1{}2CPSlSD}!iUU>ZqbLLwxm9&17f1Vf!Ok#H>Ult z-LdE4fy6m>AO0h<+TtA9*5Dm~5xhs-KXC83GUtjzT55ME-H*6G3GTKnpnGB$n4^S$ zAD8~;J9BWvPi9;H2mHH_Db_9G-sS+X&vW@5u3YLaA$HfHukm&f(#fIEj9LbUxp%wlAQ#0PBB%|Jm&S?-l$L|KnMC zX8Rk;lfQTt^mF1r73XyPhyD-zj}YrK_5=4|wT*M(U)Q4y-EZt0^Wp)xK#6m~F!G7c zU8nx|HHyW-1K=6l<0FG>&Re%`QhjIZd_8i`^>LNM0pQ-(&~GR8o7KAaBF!(l|Ni^) zb>_AM!~qKy9A4uTe1chz3l#R@d-iL)Ky8AbkiJ0T9{zw2;DWYYKzxLCNw6nI9sfuF zb3JrESfZSEVLx$}dGY|Vk!9rQZ(~^4%x!E3uwC#OGOXk1HqNzvXJ6aaX)5Qpa0k4? zdEh^jF`@k?{@E7x(Tg2{|3j?*NA`lToM#9AsS|S7nR4ou_oh9t-G{OJW#55&^k@_R z#MQvOaW6fKf9+)46Jvz~0{i4GC-i8<09u6u!2hb%hK^TG89ZQ{ z8oQcQ6yfgdYo!`;!*n&;`TW?F&z^ZW#PQhovK5|K{3Ox@dIgev-DmHA!vcYn$b)0@} z=zV^}Z}BVfL6K=<%;6_+PdF#!Uvi>-Qpl0{qciZY_`h&g;~zhty1=)}cZW~29cTmO z796?nPgrURL*@bD-1fdOkA02&=Ug`QV8;E(!F}=oyxS^rK;FcE*Z}nJV7rI!4_CGE zKR&DeC;pEd(f13-v~7RdKI|8sJ@CI&_W$hhKkWZ*`Qn_L_#e@B?t>TP8vKKE@Ci=g z%H#lJO6Q?_;E1%>L;r(o@rV+~;1c@<+6UL0v^FXEI&lO%;p<}?=suIg)0MzI$uV}t z+{pP}IqL)E-!I|-#!7*I`r8xp;FD*j9}nD<63<{dQ*r=yp8WvTZN>;W#&5VLbwW(R z`d`22T)qXxe$3H~{&{en`WDb_@kzH^N{uAf9J)u}pj{if~rOvO* zbPs-m-pBSg1|&a>jmdRScn~)n_DenZM-PwxuX@-^y-^RmD|n~>Bi=LWJvo+m zfbm}N1MZ2bg*^@a+sUzhbbi5D;9l!ZNw(nzu0sMJ6S4`ZZ|r^UZJSN)&6uAt+h%-2 zgBYILS?vpFFO&U0Ci`GE`yc#+ePRHi7lH%0XW|R{AFf)yJn)}5nQs5nk54}Z@4$PZ zuSWF_q{KC4;2-&}`9Spv9~jr@RHei{Ws~ayv#U5(@Q+O&*q1*bJb^aD^3~?_1s;0nAgTd!}2gLiC!^};{g0FJYN z06g+bhIOTA7{7#%M`_lfu1N1s@xkQ?DU6FiaUgso3Jfp~*tLeGnD01wzM)jrRVeuIv81peVL z;b|{*l<%Ebw@p>*JJyB?of+{y>Pg(tu>YIbC+3GOkhVX#L03|a-k+KR_rzS7*J&F- zGBGGUkKRY$`r(+iUGX`v>`Ux0g(2`z)Yv3yE51z+yN*x3L zM<0Dujgjfs!v62=>sA~ho*lVO9dF#D(@45L_plwnwrzgta@qH5q`$|s4`$Kv!3&BL z;{OZVtFepKx4?PedtCN|@hlE7H;5M~vu-ZOCam+({p|$yeNEd0`mO5p)o{Rr4?d`I zf`=Qg#Oa9#p!?x~^a;qZ{Ykt(xQ%#V!xu;nz=juoz$@_|V_fH322|GKxN_u;>#`3g zu;0?}z#lw-T*3uxQ{LjYMQ)P=$VrLu#B&@E>^F~d9{XI6?V1zdBi+w>NICq#Gr`l8 zNuD|e|JeWO3sJ|8evYxrQ;0Pc$z#t$id0OD%&{s8SQ4uBWH|MzzJY!4PYQcneSg{>7xsx$8sA_X>??uk)xz;A zm2KFx!Pur8t{`y?yo2#^u&=VUw*57p#^)$Tpkvrh#=mU>Z7biXF?R6`jI~*->r9vf z_CF?guf_?^7YEQMp?mZE!X|o~M4vu$1yUzc2L93U*!I}{lp!0)3}Zs#Sd0~BE#j09 zuHiTW+)%b13n*Am8z3+m_BXaXcm&_!6NDXr{J;rm1Ay)6cn9ai1h^O5aW3|U)^yRk z+J6B594lOdZW>iP!#Utz^3)OdulxVh9_9eGm3dG5j++Rl#=kfKy-!=xHsA&fM?X)D z`-}FB*uU*${Cu6`arU;G8OI%Cek1;eE=3PS!nQK@OP=vRe0^eoqhsO>_6%(94f4=oEHUQXw1Cj?)|KlHU9Q;!j-yjGd z0GWUbz&?CnJD|u7*P%ZVJuogmj(yq&Tq0YX3${sMGs@A^VWWd9Ki(3&1+t+$+lBn#2Hou5i!w!A48ZrLvBR|H+q@{tx@#I+i+6LI>kF znGdLIy?exL@VgiX8TuZb?}Tly_J;q#J)DodM;URz?Dvi_fYfiMz&|zsF#tH0JY)ah ze^{6&4$uc+O@lW*EwT?_uZ%U z0~QLq^jXNSkS&oM0Or9on0Hy(rrl#4q25((N&BzSxr_k>)5Hhdx5&HbH^@%v7I-3X zAM*-Yl0)#8xJ-9r0>{A%@P%XgvJt{A!2ZNvAx0RSlH7rP3rFO= zkWGHixydcu8(bitiVJiE{tuA<-x?a;OC34}qW2^3r%hDv)Q|0cZAV+hcs<+AI>-85 zbwxX|O>!T9$rJzh0}&S!9&~;txRsPP0N4f_;GeO5v>RC0GpbD6%CY_F2W0&J>ixvO zc}4GFZrA;>pY4mlQM%tU{Qo)dPyC<$w52+)C3)^uyqfQp@jVEC7eZtB`s7peP^N8v zzg*+g$a@sm>K8Y1jMR%R(>oJi%EWJbbzV#F4c}3Y?MYkosh$UP&p~8T^4<>~;7C1p zpX#|!`;?LVd*Y|6Cy%A3{gmJueuL~Xe)_=I9aPyzeQ-gnPtiH{Kk+}= zM|&gQFaA`$ATQWV83*vUA&@QVj9l$R+hD6v=60j)N`lYLpWs~eh>e$c2Xhev2%Qi1 z%+o3dqv&b$zI8r!zvP(qW&95b>_<#cV|Mf%%3p+k>_OuHycbxay}2K@I6B&PjGhr( zAGQ6c8Sy~jkAM7Q%>jC`dO_=ezVy;d)k`nGRK5K2%g$e9Unz5!m$EqLV*nX@pWV;?4PG#UX+ugB0;V$h0e1qhG z^e5650H6Ghld+7j77KOwK^5I6~0W;^t`=3UH#&r9?$py`Kzwh3{ z0g{gijm2UdAGjy2)wX#-7=;6f4W6pRfUl5e>PY5!p%nV_Og}Lbl+E zke>uI$yT!6j^ogMn!$8;{gMb?NNu#N0-j52H*xP-(tQ^u2LQr_9emf$?e zN=MlL;2$nS?}qP>-k1HaL|wW*Rkzev)R8b`-sL!LqIxrqw6EO#JL(^2j11e1cgNp{ z$LVjw2cT~|^nTa^)(w&w?Edi2;2-WCen3n2PW-d}Ps9NgyVWyJPOh5~v%r)1A8Q$6 zOLGnE8T&ZOZO7>Oc^BRdTR^eU>g&>p{53J~uYG%84wx_e#(1E_KQTY-0LBM+{Ghns zm=~ThKET`pYy+=DCc7bgL)E?T$hqX$2k?bs1UetA+Gc>W!E2F2uv_C_@`O)lVk&LQVF;2k;Ty8N!mB|6>_@qh3yYz6*Rhj0KG%s3!* zLE`2Y zK*okVA5fSK{n5sM3%L{i$t`ob2K$La+LQKUA0Gfe75q{Lev#Kap19^Ww6%XzYh2Xq4%TzUphf@Li>RKSl3ux}2p`}Z;2Y+6A-2)+;Sb;wL_*G*$vOheBZoQ$ z78A$bFFHT5N}dUQKhtmWc;>_pkVWo=?5A(QZ}S?h;E;~Nzv6v+tzV@N@s~-wBRLqv z4r)=Cs&CtJ;zsxw+~eoN+d1Bcem?B{#6LOv;SVr&hA|}Y1U^DwpSq3|@fB}N?>iPC z{PS$!K5T#eUU309fN_0{Ync`QfAcqf56;5|$akZyGv33tc}&kh`=U3NY0P|+18Oq( zSGY0V25NEuF~NnUU%+$x)fV78eFE%&EgFx2jKB-vp5wGXT)^7n)&<~6@&E_WZ@~J* z_!1c#$oL{M82H48luf98Y!KuHu7Nj_56EfH)ceU5;Fv_ab3AdMIc1!S9B^%H0nP^l z9P|CfR~=>l3;*EDaer(8r>G<9#k#psSE0*8|AQUcjy6TN(-+>>@kQSY|IC-A+~e*g z57>a{|7PMofo;{be2|C*;ujF}4O_r50owu6|H3u#zuEAQ|4*!!IRL~lq7OK1Mr;k* zleW$FWh?-)M8DoVjeEKDvdgM(eB&GS^?`q`510bCG1zHCFaiDkmv&@NA#fb-lRsCL6P0Qa;RZAr>wY^Q&aZA=;G zCMSSxw(~eS@}B!_!!uyNE*Hm?>voR+-@t#y+p&>(PwFh+oi?EUvDb6_Pja;VJjTkiVlGLoy-HF`?3GQy~n^9_spHaCM$gbvinbRZ9SI3`tVzop0j-5NJoyVWxvSW4}SM5CE#OgTha~|pV6Hl&AI{8$ccS5z}IGxY$ zogeS>PB{4#|7Pb2CsjN2yAw}2HLl_7a4jWmbNslHPCE6p>SQIC9e{;nl< zpT3Q>)N=&Db;S5Ihe6xK09Y>s`=7WVW#g(_)&xXn#CQSO+R_Qkfd;>k!WKwg2ssP+ zOW8}`02u|#v>W4DOzU^>4-%|Myxq%#qWvSQiI7P5s3>2JZ3u z;1ajD?uAWG-EvWWmlJD4vZ&Usr@eXE%d9Ndc`j>-bd%DtXsT9c}sQK ztu+<9wN7D|5^ENZX}l7COs}>Fm2;dm&3kl>e(@6Jz5V(YhUTXZi0gVa-;sUi+U_aG zDeD{1`K63&jff)$T8eGycm3i>%7#>b{dzajfZCOFTrU5LyrnoQV|4J}su6kDCSLYr9g3;e4+;ed^lY3=VxZQ}>P5&kx@WPtt68pDh( zM=o-1VXhmB+)>`_FL3M`eCk-pW#AKxx-HAGdhCk!lM6TpJk#EkA>+ti$a=eV^4_lxLlSnU?+iSm!J8Z#}LyvK=6P0PnFD zp6Zjea>NPjvwnqbK4IHy;Hdq>7byB)a*@0f<2djU#23T@C9fVIRGzU*5aitBLw^r*m$QReSYbG_PSBdl2t>371 zL^NlhY_HXP->ut@&^~LAt(uND_D-ZO9?zrpsSJ!v0OVxD#YXU2Sq0kRK9Bd0yW zm+#j1f7b{LbK#%$O!!V+wmG^YanD#b_GxR5XL}Qy%yv)PgnB^+TtCXedW=bAj6U;s zWs?-1qArP7V5h9ccM(U>PYM3v3u9dv2lwC;n_!i&zgAcr6V};Zzj3oM%s$894JWPd!wq@Ya)vDqGH4d*btDSSfZ$CVvLGl!4^Q&5ETmwC>RT(QNThK z1qB79hyrr{_iwFdopUsK-#7p7`mW@A@j2(3Yi7^Po;}a(x$jkG_TDL~pO!8@5bg=7 zdafutJEtrsCs*%Aty9Jx;Q0IRIAGK@*Ob+&S=03WG~M%5;Tf6F{vcxa0m!eWd(Zv% zWA_Q#8iH&?=84G>###9DIfWjHed)SAeBk%X&MfIR136G9ij zpBKmEQIEjAj^pqFkWc#wF4!ydf8k%|QqyhN(_jqWUn|X1<~baI9e~U;8^FfKo@qH@h|MNcaizQT<|&M9MFXOotPtW-eVqpnw2&Qxyam(ETfhf;Mp$^S9MBgCV3~R?#R09`xQ<|4pnNc$ zmXYb0SK4(2@riIvU2qQOTPY0>v`s}fa4w(>yrTmk|Jg%D0P_T%7xr|zeDS>hBSqgw z{@3+@5ySO;fdmI+A=8CbWIqAle)s@P571Z<8z0~gNcaTci*gRoSTnEO7a;EEKIncD zSVMAK)O7*!z%w{CeO~F{dt%BWP)-_uf877zg{VUud_X$nl+t?z{-wTXOI(x9zR$*S zPulk1CuA-h;5q0wc68aG3T8u?C3#kL-8(?>vwp9zZt$4p1}hyf0&Qxg%w!mepQzD!2w`60{4#fedb-@Kgzhj<^$4wj5$CZ z%9;0y_X_-Lze@wjrLXb(n|__pwb27Y=f+=Nfq&;f#)om>9#}AbhNInAWA{w=1niUM z{)TNw9QFe-fw2aMguoilng;f;MM#t9db_>_D8Jr+>;D)2*%t=J4g2bA%meU`zlrOS z<~P7?aV{FvzffoJeX zntJ##@NuFe;48o$Cyu)1vGjq~YR7bb>F%7HB|SY&HbLkHl%YGAEnr;WX=Ho`c7@s{ zAm=T});10R>$+~H>Vz(kCSE`XAch051xAki*L;F}hv3j!hm@rVuc8091#{v8^Z@XW zZxFq}I6&hab^#m^&k%AhYX|VP*#@ddI(qk_n5&u}JN5?qU-JJ5;rvVFJ(#z>HVHcb{g%KSkKfIh zG9I>vU-!T`S7RHv_jLg00OxMuNF0t{XZoDd$X9#UE%%%ICH&jFF?0+bgKt}LU6cKl zWiWFg;r|!@+x`#he@C(ZSN?nKNS-0F@77pH5NP1y5A?2+%!fx3&0!n0Ad1betxPQ;yFf^nUOkwtw(KrtAws zb{607&9HHYAL~f2j~z26+yVcvPrC9Rp^@?%)YkV1z&HK?bbs)isdtoA)(4`THG;rC zT);W_1(-X?5#|(g&3%mGQ{}~bNx46i!wW~tM+DwOhNDx$8SsC^%;m~F5c&cf5VD?f z-g^)nKpFE>VTYaJn-~M;F)_OjVZ|;Hrko}AYznj2##JD&H(D&UY10T&a_TUGd zpZgQTO^?+=^b%B2r*kK6|UK3x7s3?`As!2!q|WDnPb3(8~h75jR@|Bf9yY%a!L zme@bDeED+u{*Scp%!7UA3~NiI>AUyeWe5Fd{TZJGbIP7iSDy7H!4t+!hI_XMf(y`_ zf-Av4G90WMZ;H?034H13)A$8j3G-l(JoFdyA1a0q%*SV#M=rS?5csbgQx6VknFwGU zT>$Qh0Orx-Y2VV=@(I~**Hk`oK1=xK{M=mm2s5Qq7%#|fP#L&~1M;;d0M7FCevxc_ zYXsf?ntyR!U_>PjK<=aaI~TAwAjS3w!Ud#hoAp3+0x<7m?*2e@1>^|x$70>f3Qnld zMFZb4KkZ%%w{X2-9(zCLfbz*>u7@1}-ff<#AI$l{L12J9g&nM&{ci`q`d?R=U(MW$ zy+8Q+uxA+;#)Pp5KIFICn!WA;K0wCbeK6tzVV!+HU^`v!$ny8!`&uCBIIc*u27sN0 zj)6ZAS;##WhJ+ceoo4$)IClKQ2j~T?>+&ul?6)mjw)|84fBWsXcAr_3Vooq`knj8! z?mx%Ye_cC#7tAqqf#$+KWd!()x~yr@H(NjCT>7MApF8jd`h;@>*v=4cT;^*Y+x%jV zc>wpWSF!I!Yj)_|=n&vKp)a5#AfMp@))<2ir~`gYhkz?o4rVii-H`R*ojTd_3%~*7 zV<%9LwCn#a^T|W@qvxYrG3FUszX$L6d3m1JabaPBt>dv)k3N1_?b>BvJO2K=b%Bv1 zhL;_#_b1^G3haaV9N|4*?=!;|KnEZo|8ui79?F9QxF`4#xGwj`=YromFpUmL9p;bS zAKfo>%)mJJ-eg!JrXKeWUf}-Od|*x_0&^U_pE3e-EbIU~Pvy!({x{nT@LxyrY6bHJ z{QEu_>|Gxhv->qJjEUohal!|JeJq*Iyw?3H*ZYNk@C^qb``HInj(6p^)OYguwuSEx z!uKZpD42bqdxoCIJ&a)Y0GXP=KhK?W|I98>K04mAWy}64{>fxLO83atrFl;|^Tpm* zt~B4>J4$kND+kGY1= zkvWsF6>YvTmNA~>ljeQq!3p?T!q-B~eh0A4+6cAn9 z&-uQ-<7+8g4vn2Os=Jzj@a;x;}w>fgFbavJx0XPXe2VX^-TUS6mSk zP`(E_bg{~|z|bLs%Z}7H6f+FVvL}RD?0|I52U{Ni!)g=#fOP}X<||Nrvk5fM&<$J% zfNPzf=_7qZXQNNt3-}2Rpp5y#Z(WbtX+5ZXG+06_Y_%`F8x&Zpltf|>HmQLumLC-J!+KgApyho z-Wg%HnF97Davr=l)$>gFo9$TKz%lPG582OrKU%n_zi=M;rZZ>`!a+6;nj7Y`P)t7= zD*}Aras%5HdkP(a^#|7%_?;Ywzcto5h@As8k0qDG#-J{C1OeG@7*<}C6PukO-2gp< zhJof$YO5Yg@>_;3Nuxr<@ zvcmj4`GcC36-$@MmaU&5JuzMQ2Iu$&h+}Oa^Z{E7(A)^$AbvsS3$_CHg1(uI2j8Zz zF=vrIj6ZXVac1mIZ?`hana{!9#sP^u?pa`-dch0KO>6^V@%~m}zsX*J|3f50KE`e> zUjsl7NZ_8i%e-W)2=FN5(@gUpekEoM;RM$B!9RAs@At#td}Mt$~c{k)v~_>Dg=^J70R&X4+)k4b<2`RCToXNl{OS2-{)ALzYg z-+%wT-G{(^>s7@zx}VK)~uHJ_l^SV!oS9b5V(&x#)o6aJmclOYtQ-0p6B~@_yOU0 z)Wa|F%y*zAxxB&cveeRpB3u(-e`yrng|Ik6<1$1o6xku=2^|dem zqoqr2iv8RMWez6){(U3x&&EG^fL=_S`e)fzN0!TeYysqdQ9-`Nq5Gr%!w1+0_z2(t zlMl*6FF@B1eV_G#Y`qU1+W`FM9AdcaI@OzZwU;2S@sm2!k z+t>>4*!<`K$bUG1=YG-s!F_HnYtQ(#+26tYVUX?a<3YFM{>FU)^XM1wGCC-{8=OvT zzI@#ic;PTTdv^M1r)qE1CTDr%TdU+ zbcXUM!$yDu+-KOv`~t{+<_b0$x2U4gmWRbDr`y2s=ma1^7QmzMuE85nbkk)lBpMn+-B+;Bcki$_vG>sp+y+1| z5U1-tlW#mA`>tk<8f9Zfk4|!c^qqejrvHCjD{jo7i+>}3OGCqW;678bAxi=5gZaQc zm?w=cz+4H;WBVifeP1DSi82eh1fj=Y$C?Qxd4AL{xIhN z?0m)@-74@+8r;Y8f5?1n1nwhT&HY2B8|D+(H~+HIoNHy~r&1jqb8q1Sd+(HD&d2ZL z955=Tn#KPwV&RwACvL{4pMGk3U#jE+avi-Me_)>ULgWL_isb5jL3ugZChtkdS|PT8 z`v}DYnitpr%pG(AmmT3qHs!}H(a2L$uj1o)QO-^P9b*U5eD)W^%m z4NgE`VqAS}*(0EPr27FE;M3z?kxoa~lRk%!k8zOZ7 zobJz$RB*tVr=MQ-(MKQsga?ub|Jf1Pym@okamRKpYoq&>t8ba(<1-FWI@|n!@(XER zgf4(RP+DAMyue-(D^odgAHC0P0GmHPk9;n98hOCH!X`l9r;I$aEfq6InOn>o~_Ltw8l>-)T0j&*@&o_@M)h5Y_}=YoBL1fCb>J^vAtj$`tE9x9hb z8eey`74_pd>O?;AKf5;h|EzB1^P*1Fi#Y21{5bL>rk~#>e)IQYtw|D=jIq_0$~UJtu*EH~`%~0@#NW$OrRq0P^31ze4~$ z!S21}Jo+VT0PH6=T~jd_C(Zt$&=tWnbCLBz^Hb^A^Z_uhwBcOXc3;0g3x>{_qjwfy zcZR+jIs$WE_+KjQ*Vqg2U!_U2qh}s1S+CeI5BAv))I>UfuO<6lDRh4Sj%|hS1U|ry zf>XgRSVi{31;zowzxe_+{$SpN>@}sS2N$p(sBK&PE!Y;EUm^cZKakwFy}8QgzMyYd zUDfB_!SCg|py>l@TfEZX$og8FXHQOZvoFyznSU8+(laGfu&0odVzUG+at9>u?In5ro!u)*Y>6+4Snd7`0 zGt$gW!$V^JSH=c)@}(z}hi|*6pde8j~_;1?0`D5%EXRjHU2mj^+P#T>d{RdxQ>{~$>z#d?%C=cF5mVxOPK;E#wsUiRJyae&=tT@$?z z-3~cmb3pf+eaZM88_V}}R6~6aRL9M}&FOFp8^{4>pL|*VIOwd$fK7W5IC?t=0JRnbPYx zX1!K*38eAe5^{xGu*I4UZKP-&H}v$jN^?wTo5H=pzbiQ)8y{@L8SpH)jsQ2%CbAy; zAG`;L(k}L4zW4_&gS+5P<34eM=>+J4y8rw(LfmK80^maCg{=*04wxOU`s@>c7pTj8 zb-9nu59al|HD}NbnA6Sy=(-i$z{&a*KhK{ha$B2|u8@@}U%djdy+iv_;SD_|LwJ_nA)H4jmcD@AKs~T-x)$x8yyF%yHC*90~l9iKwv-SK+Fl(6h0@DY4T@VhSyh)QL&+ZM_=QrqG6*r}5FD5(gv!B_?iUyc9K?M#o6xW>9#TE#J{UDTCoszVN4K|F^B+E7{vf-+ zdy4ia8CMAZY067cf7`$v3MTIo$K<8UoSI5c-eq z;@AbFl-XQP{5IoCjRn7tG~*T=61b0;YgYt*JL_R!!Z`v?V81;fP5s6P57x}S5$3@@ zIy$%o=g4E^H5lhNg7fSw^m4~+cDAS6l@?n$cn0^SrNX{!0mF8pZs44l_T6rgEnwF} zC%`U}J)l0p1su~qY=Gb<^a1WK?-RvdU@WkK^7UL|><0wL$O?2v#*6^=@d1Em*AIM; z0C+cBRdd&E1h2#VLVs<>{1)cfXJ+#}!3Dzqqk9Yf^$g18=>ORK?EQfQumQk-VBT;a zK0(tB9QV}6K45IXf12(I>-L%Ac5n-iq6gSIp7Nao&>b}AH7~hW)Pn;ub*~BV009mt zkF6ecy*~Co{1CQX+-GoBao-(h%wgs~`w)=NU=EyuY4AZz027pxXM7=Sw-FD(1uplg z3%+TCbCCVQf8a^iz?U6*0hpxB^0CjRvCEX+F*b_M!DnJ+e1!MA0Dwbbq@9I zw5U~2Y?SLg9DfYx$@cBdxNDja?E>(u?xU?Z~!<*M=_Yb^*Qt+yDRjy#@ab8Z_v}^FQFfwZ;LgqYJPeXgnaivo1&=A693YtsmzsY-xC@z&&5)(}fL)K=2kZ785IfH~0KBvIVmbkQ zuH#H`J2qI@0u^|7f1<4;(1rzU0rYRye`Ir5zzzVr{;U~T2TRQ5v{d$$!z;`YcmSJM zGCzTJ(#T41?OfpeL4AB=_|vdu!5r5DC*`;|?s0wzo@lE+a&2@G!?PW`USPU`j=?_u zFq7ex+5q>Q^IziMFt0iZUV>|AgZ47?8`1mAc}TeDcTzb7~#7kMvi<7@mm{tM&}AdlaJj4zgMQK)eP>jbbKq2f48{T1IR;O7J1rVj|$ z)HVG`X|sbgKTM`DSA=u-4~YAPYjBTEU^=79sYk#DU=Eo-5It6yH@%fxf z9^F^Z{|w(-@ZYdulVfcCFJ!*(&srcj=iOG#HFlNv1^AkP@T0K{xsRWKu|fx6e27hc zGrqz;0lZsKd(H*20noY8X%jp`Y&wLln=L*@A4rv)PX|-z7Rt}U_7l&;E#?D2S5Q7W z0bG)$b4bGjZfCgMWS)V=-~%|}Cuw0E-5!|_p5X#?`_#6~BYa-y;FABsm0?x*1K+fR zOa(8bS9ot(B z?u&}@%dwv?u0Xy!2XN1_Y@MN0wgS3+uJrmGbbJf4?Ipw8wJVj+(D?va&;3L$6WG&( zZ;${FAlF^~^SqG1XA~UsjuQ3&I{&->IIvGX`aeEXe2Bho;Csu-gA2er_^-?Xv(K8}`{-@UQpiq=NNkJOd~W;Qcj@fBf^>J8g15Y=8WMuKU9c_yWN@_%@$_(!`E) z$2@vI{zB@Y_h;yyhCF9Hk@>No2VWz254n$yPhEH+TbL)dGWjHkeZA1}kBlgiF3G%s z8^Atm3(PAp$r=PQ1Y8DAQ-nvJO9I!#E~|;r8CsZL3Ld~O_;7ykdWL1;6ilHvTf5eV z+9L+*3g8i(d413OY1*-F@?Gt@?(Z?@nQoA13!H*Kvq6+c8U6{lDr9r;27O9ZKK-L@ z>~@#a=^s)MJM!P&BO=*v<-&fR&Y=w4mXs8$4_YV1PEcN{jID9S18j}Ek}XiLUcD}R3;y*x z>Im;&vj+eUK<@|tq4T>v;QIl2o*ewM2I$WT`P!)K;u=SdC$b-`n=BVkgKzwQj3H_F z5jdvd5aR;y%KgxBnz)?MN?bu+_ycIK+&`##;6L^yqX!hoZY(O&o-xS>^b5EF`N2Gj zXOPi_-A6z<&$eT;%8x881@=A7T*24Rd~x{=z5|=2O@|g94Ce`%YkIxvJ9kKL6+W>8 zkiXzD+I0L?*!zBM);Sz|T$8kOf^&%Rh%jonreCI)xSj$>`P!LZ4{YP#3+#togKf|G znHktZ-WJCh>7K@qS1cJ$d)61}0LXmSaFFBK8ZXje>&G!=`O*bU)??p`5AxCV6=&-h zTqE1Tb)N8Pa$fhVn7s+QKj;AP2K6Y13)+>I8h3+v{CU^|)Iq;vec$Z?ez*G#&ulqrE>m=3AOAWcQn1ptN&9LjM;wk@4^V z`K^R~0$6vv%RWbcx1jwT%Fob!3*HDmAZA?_oq;s`fL{PEK+kX+K-keSTwolP$ZsP# z3n#EwAzkwyxrD3)*Bl2PIgYf=DRBmVIP%~RupPdA@CR0cBj6Uw!7yc!PfR{@5tWZR8_{2mP3BXs zdSI7&==KE03AvAc&oSjW#s$s^9GA%7-?38%ljVgb`>CfrQV9+~2a90&IyU((PH5Mz zouxU>77xJT;2fPFz5wre`22KC8jk4HQP)y^@CsLe>#z$LPh>pfi)<&KJyYlgp$p&- z0Q;;7fPL~wb1uiW_AfaWc(>>ObxgbBmoJ6?ntKuc*#kJex%U4c_X+0b6ZUyOZ4=uE z!1ICnCP=~;$a4Yg0Rpe=2}B=2?+4Gwf6AK6?@t_Z8!jMFhx_cD;P`K;JbaI|hYpYm zu7wG(ADob(d(V4y`7R%Ue6WwM5P8@ZT#sPu1CoQ`hje`bf1>k&`O^(s;up<(%tl^P%?r`6O+2}fl_RwPt_qslPplx(?FpKYl>p1q=d%?KDm*8D%|A};#eh+O0 z=D|H}z)h5qM#kre3$kTHAm7pTi?r4UCxG{3k2|KUSQssoE!IJPeADk$kGfzVoaZXe zN#MOy9FVWy4#qhrS9r$v6E*<;o}wcQB9c?|$O&17Zgt@6ib?oxr^1CG-QO-`bn7&u`KDa32z}o62Wsr_17v9KAfGw6g^tNH-q6^C`;wXOM)(h~6)azUF&S<;fc(npAIHpb<~tY# zM^T3uJdj5WuBi*gz_#;A1n%_=Iz4 z2mEHLJ~6li$5vlh2lvQq@;r8b8T?`RR~@d2pN=-2Lwx;?ez1>&w)w5Jou##Yj@xVB zPl4F!0v z@(rr2q@=`f?mU3pXPrpb!!MwFOqzF-q7Q&~aE;B6UEq3wI9_waeTI@Hnq$7MfUW0t zf2;+#?k}HJLLaE?3m}dD2p^yeu=b~SKTh1+@ZYj!%5l6$-rg|@&ZPr^b1?4qfbR{8 zbpY%D(($hFz&~pM;M?%8baVUw_-Vw?ZWD-eg-dwAN99P-}$tio%W@ZDDT zmv`ghi{#rE>{S5sS(*o&$2rJ(9dmh|)#VTr&#L~K!P zhg8!OoGa22m`fFAz+K=4``56d-$z`b3sm47+rxDS`K;9r=LdevImh&bI7jRA>KB-H z%yYh<<9Xhm=Q$_1T=sL&A>bt1MvviI;5YgQ#}VKFm;GR0eM1+JU%y2AcL@0Yz&rS6 zjB=$XfP3%_&dFo^Ozum+$W?x}@(YwM6-VSHbbMrbp)g-8Ov3^BvisqIfP9)d%a~-`D>td;)MKW#|Oh2(JGl|4IAWBA6$b{+__H;aO?$-9~W=xCZ~i zy?xt89MDGZ!zACnbD=umK3(%5P4^sbFy0Wiz%}p>JVDy+1nmzKC%{Rz)?io{)~uee zB0bgg1jDJ@667Hd@f*Ms#P9?7hcn6p=O~|Ya1%C2x^aVKv&!HS>eG(#kJZzj9%09L zL1o~V08WuV7IaJ>$fq872E%X)GMr=Drkp(bMm_X)FblpZgF{GzZ|a2IfFGZB=u`2} z@XvL@dy$^~$wdCFnE)ri z1>hb1pE~rzgZu-!&*^-#Li3C?enjF_(<9Jp-5vqs$Q)w&gigSI1LivN5DbF_^3Wdw zv!N?gj{P?|=CN@D=Z1T92H`LQToN2Wp799laS2{9f2H#MT*p5C4C-Mgd!PJ${9uxN z);a8&N*f2j0|_nw=kNhsg8atrrwptcj`@u$Lw`rcb6pz)lmD`bbPehu*R2j5p>e|= z%hI_7^!NhFdDHRfBf7ruZ?fKa04{(N^2^!@``jDuIh;@=yqCxa*!kFFEgz1cUXH#; z0`>#{h2jXlM~qF7rEeV&!v&?{5B$EN>$4_E8g76Wuou8B`ak{w*8{Kzcz!^0L-NU= z4`N-w1GWIVKYj*u1^9yfL9zkX2`bh0M*KHx-h3S2mGS3*kooTavv+nIA?mK*t zAwK|ezqRr$=zPP!@=V5KA1IG+Vc;{sPO0Dq>&o9Qz&`(vJUpFXJ94L>}iyecI=k^;CWjvK=`Op3^lhg{=1ry?gNB;AzDY$?&Kzk-g$L0sX517Ec?E@6HvDM)M=CZB-CwKs?fo3`KvTON$_JKAdvu2k<0 zD3Sjj-Hia&i{S&^#qu3?GTdhi?`9*2E6@pY6~hPk z1YHks9T6MAbO2#G{DR2(${Yax$@7rdA1ED`FacnWsE#y;|?ho6#uf${VV z2!{X5P9!-Q0Hd&TrO{20WR zPSlBV
2UJkZtlNc@l?_4MF57*J3H09G@`bi(bJlLm;J+z__uPEI1qY}f34H*Y z;O86wu5Gh+vFZ}Xt`@lRtzwrB&%k%`+!MkyS@Q+W>a8I7fIfhfHL*N?Npu{2jDMzQoUx0nV zx+8h9*8seS+^>vzlieyaJ}}%Tu%E~Sua)aqJ?ZAbAz+Na+8FC!>~C_}p1`6o2gYcJ zbEr$7(19JZlJ$u;I0nC5gO~tr!9R6qC-P~-^Z}J~UbIWhIpCW**j~h(8+G8)jKnoP zU;XBoIwt$|P5{aBOyM(MI0eIC+;9)Rh2;o2dGa+RFz<37-+}W3$AqF{*8#!~fD4MG zFTne(9k6Bq=2 z<_j$h;h);A) zzDtZ=fG?777Z)g>bppN*huvQ)Zm{PCbq}xwI1W8Oc))yonitfA58}B&(*q>SIHr!? zo%HLy9sm43>Gz9R2f*)#4j+4ciS2#B34I^DqZg1L&;RlrN#gk{@lpCfE z&u|4;rT^adBIzWo$MHM(ZKUzdf$Mbi0%4zg_@G$%92*Dd9>TxKe{c`}k@sM|K(ahb z_YNKieE{1ZKFAf;oh#7)W$()#KzGP5P`S=AeV?{+2-+K@a&&_%eKQ$-AV=5a8|JYt z0M1ztV1FPSfb6$50mbYMARyDhx7i1(2N#r@?tssbXT&r=(GOIIbY@x_-}^Y=mwfz65jw z_yF#ReE`_&U<}`0=mV+3Fmef>WQs7Ik;VQ1bO!7L=L2w>md?7M-v6k)-~!Ge4gQf; zv>W{5vc3ZQa1dNWKGzQ1(;u*gT!kar2;0U_>MIy>omu!$AAW-WL_O-lad1e;UgHN{ zkN&s~qIGV~S?bac@J$`$ZSacWUww-_uE(`$llu6|=?{G{e$n-~X7B`gaedA!1>3?a zp(A2;ca_Ll+>1Q}ET8U4X1tp7{fn4jGHS4qn_3z&fDT2ILoL-5N}ySEGOD{RF4T zd$%XRsr-j_jGm9}uQ@ILusr3{M&OJ*(s7J#0Pc}DA@7-o-~=9_KK-K}ZGs!ee8Q&C zyo&3i>Tj(+cU2z5g5rag|m%rVR{?SXYLPM{p08~!u606Tz~z96%`Pril{ zZBdTh-By?&fPe5ExHsECd2l54;3cpQ?!j=n?gs&WWPHIkGCX)7Lpm3sf&)l9{zJxl z3=cTQ!FhfWYXkIe|80$*-Cry2|jUND;z*{7dZY)5}e`nDC4}~5-{#ug&l$2BCgQ6ZMD!2K$uJ4lz7{3{TT> zp7008!7`XNPEbGLfpqC*;5o0b*p40l>;-6V`OXjc9))M=0)*g#9J`OQ?UiSE=Nby! zU&fp9Vr?djTrN zyc<#PueI3v_Id(G8Jd&K0pF7VN1)H+mjh?WM9pvU0rlM0 zcRc~SA&#lfaRl;cMYjIeDGf=|3W+IK#qB^@6Qms9)KT!_lo(N05Tu_ z9vL5gLEgI*9N@NqJu|$A{erRszHd>d#UX)-Us9~KfRj?efn+K2znRwlTMMuF@OT~) zy`Ruh{y*NKNE&|%>#JU_=cSbf|2#iom{&XOt>pb2@QCXRiDv@P3Dh>YbH4FC0)Z>j z{nZyMS3TQ5gq+v>2AAjv$awt6=n1iI$b3dO0PC@i5ZnU4fFH1dodF)viD}QUmS{Wh zUpWRdt;A(uh`DO=S#7y|cTNCXhH=H5>)4cEU44wUC?{lsA@rHVah%67eSzE1>#>R8 zkEll(?a?-Q*c$YWJokM%7a=z}7yOuSRDELXsEfZ1e;mIh&P~BUvB`GuFMPudU>#kbw!wS8I3hx(@dwWXYHyL!1@H&; z^t%K9xo`-4K%NEH{lPkNKk$za5KaK^V482Ep!Z_~Am1&W-~iq?Y<@r40q6=!U;0bJ z{Lg=@F#U207)edt!yYKohJWpiM!x$qRC>3U_`sf*HeSFM&~t#ud)0vpcozsfKz(cj z)@0EYXp8Tu7{^GbFh3wZ2k{K+Ipo_~0OzT$+Xcu>m$z^Om=0aQdYA5yqpa&Fc3|a5T?l=Fxz_X$n5~$(WZW+r|rQW;M)S4iv_HwXum2gz?R z7BW2W$1%9}eCGtOC#)J?!K{Z&%~R$NI0RdPY0d>-*aMsk4#GUlVfp;eu=F#`Tb^`OZms%Xa_jmaICiTHSYb?|^e}M9B@1@%19T_~2hTVoefDT}5 z3*ZgB;}bOB1Mlb1+P#j!4)`Mt7O@vd6Tl<-1N#XA&w>Al&5i~;oGaX$JuPfe9(J^G z0`gdO$V(OOxIWkA7(JBs{Tgmda6bG(o1{56&bMpmnEKXUf@?@e0N401D|o?mh`_jE zIq}=UBG;jQMY+rH;28RdE|ezO4wl$EV?I({)6W+dDh-z)cd;Yj1Jga=B3+}h{O6dy zrDw1YSGs|49rz~(_xSt3G{<1NSaLs2^}&5cB9NwC%4rLqe}_)TSRd&heeI-UvjNm* zv3vp8{OJ7X`t1AV-GQarN9fo`*6TM)#uNOVzW-cl1h=*QUq2{?8sHo`v8X>c+XmmD3^X$ukTKo8@&9?N!D<{iYla0lSsU zoCBPX=zo-9w*)`9?&5p|=7WDI$A4(}5dUB+V>6>SVDHmU>cSt$(9ki!d~gl1rH!9x zn{`58M__%$u%Ey*xJ1uSOLtp`m~!&Ld-x5&GQNA-A(+2Vcqbp+bIdv5J#>EhOX$$C zv*{)L=CJe2V~r2{{n7QY0nh_@XE3&Z=mF^T`25?6D|qfN)&cGN!qNr6JzO9=V2^zd zSv;Y43msKy>L-(l5fBHo!QMxAlCA#_9MDSg-E4f}nzdAL&$lnl9#Ed8(HoSuJ(U`J zYyii;>Z(5Hu}_2dZ{Z&R|LhZD9U)Eg8+!nM1UP4pH)(K>Uy?LB0DC_<&+Q5Ejn0XH zEl|!03EdtX8ot4}0_Ds%>e_ia&J{nPZ;*$5&Na=h;22$5$6ycr0L}7@Q#0g zeA)o>#Mm(S`r!mi%dSAyV*}W4QD4h(ue96y==IVY5&_>H`}_X^|H3!60HI_1_Gb6P z1NZ>RQ@n?Cp|IbkO^Xwffd8*Ypt;rrSsy`$OZVS{o{xUd_cL22z8?+l`G!sC1016Z z@SQE*r)_qC>;m3hYyJUo0N5wk^A~D6j@dteFMu@z^a5-U?lgK49LJNXHBgfqT-Bk2=q}LUUHv zC0!_goO6YjA?pphiYa5iIyfu+D@=0idVuo*=?Gja_zaF4=Hoku9Xnj+A??hxP*V#MI$BVA=D*EO>RFgVj-* zWAd4=M@z%9WW&O72J^@}um0bJuU-Z_ah`CJ1YpdNXqt0)hw8y83?@O*S2 z=}(Eifcqk3y~cyS(MJN;VT|})=vqAIM;d+K-UX=NU8KGv^V_#;Z$3WczOV7Q?H@89 zy&imb(zA)+A0Gg7Quct!ee(3|&*+%n$@qUB0li1^BEC0=Oc&<&w31$*Cj81kC~Jui z(DZ%2oh_USePT>7I#LNTmO<)f*cttk=&)}Wo2<9u$F&M|+i0u${1OL>e9Ni(fB~|h- z>QN3p4bNac5h$k*cC7QQUZP)>F>Yy{lOgOd=i``j4c96&8&}tN>^lC@@4*Jw#t%Z@ zdDb{|6Z#W@^MZ#$M?t@!4d(*d^y|5Az;O@u!F9-Gbn(a|2D7EYpZ6QRNcfLnT;P1* z9N=YO-s~Qo%e4sTHLS0o4|!lMPwNA+UuY= z9X$b`FLNOD17diCe8;)#3Z8Zw-*`ZE;1F;I_P{p21~|ldrvl5aXV9-GgG1Qwz`G`e zJGDibpD%qun2q;N1RrFY9OHRZ=OWI9M=T~?9)vli;Ujb!&LgHB^bR{;qNI6?W`Z}fKX58nsY z`Ifl(`ZcF4PaME8{yt>B$^ERXJ=6pLx!IYc{$XM#GydffXw~ZIll}YC;1$0fwm$gh z`>MjB_@PzHW~K*#`M|#E1PLzS+ZOh%Yw?JGqgvnMkblP328HE#J}Wo^U4V65cpX0k zbAfvk1qn=fZJH777kPg%$xkTJ_=U}o*>_B9^o(Yz&in5 zC1UJj_Qla=tf|_&2-TkB6|B0hKwpeA;1{)D%vz!P0rx~5;xu6!+;V>8M_c40w@r_r zUE>6|U*H`-N5`@c@Qr|V!#=;8->mVsJhNTU2jD;XOf>$CDVQhCJ>wXiKk(0<9{Xmf z@J=29xgXyfZ&y;hr$BsQet`V^i~r?`o~-y^jzDUQ7J_+;&(nota4osM2ib1lrWFUE z`==?+*Zby(Q-yP{r}clnyW5Hwe}J8<(zX5^$ zoY)5N0(&}<3!KY&a7WZ54Q}C(;0JJrUlZ}(&Q|$+Ye#KUh8_UE!7+if@r2F|8wPBXNBeM$ zW8U=~+GP))eG^c>%k&>%pS6DUeR#m^dX)wK1LyV~aozh4dM7EIP$Yj}2kZdl3IAs6 zx6^kG3JdafN~hSHzTf*_V)Nfs!2W=gRxM}d>w8nk{H%=BJ+9*m+u{PZ6STg^H}Uwc zu42A12~Py}-A9Nou%-ED`34rg0I0f8j*hGwj0y>IZrJ4j)7Ro)7$u zozJ%o_)aio^b_6>%=4Q`V+*)F;PT$q^Mrr=e#J!vwy($Z{haLgii!(-x~n0U?k3={oog~^K~3$5mQb*Fd1o%3ABX{5_O5a%>5N$7n_2%iQ%V^-?nc{ zzmvX&4nZBTPCe{;_{REYoWK~s3;z5be88~7Bh1=B_PAdf9{&@+S979KN}J{{r5oqg|+i*beMC21!4#qD!kGkgf(lyC*yTLgo_y(+jso263^+ANB_V$ z_WnzWUGVqMgk$Fuyfw{&UW8O0lDKp;DF=c#57d@k#50no_u!ccho6pR1&3kyj zIYo7l)yjuAnCIl9r$!y*JeZ}gcHN(0zB2wJ4To?J?U4tsWGFT+5VpwYns5ZyAy6;+ z0)LTb{Zef9vv6Ewe#5}0w?RGA%PZ9f!;Dq@F8pxDHT1y(wgUKfY|{_$Po2=MY`oMC zJj8F|m{1w>me$x4qtDBh*O+5BXwNaC-Q6Tu%~AD=WBBro&{ID|a=o~QCTCh$#B`eax#9wN`}49*4Dlt;{U1Mk+R za0gB)2WM~xJYf2b(&SSPE(w80e6H4}_=@wa4=S(F!&&cO-0=ype&Ko%ev9B1^5F^k zPG1b?3A|IE01s1-KwI1g#xJ-74knO?e~+R}gvd+dFVi}W2z?!R$> z^7+QC1z|lf5iJ4$dPo-^WX&PIQGF6!Ow#e=sz|H z@+f$MJn95z5QA|7vN8C>ImX-OcSXOsMw|>BhjV%U61{RLd=}>#rj@TXXv2gZC)%UUXxq}N2j7Hm!}MIkr2jUaQ|0_<177Lap}p|} z{i4s{#ri`3%iE{_9>6c>gC~9iSm!!m(8^RV@E%x?GG z_9n0Le{%$Ka?*44%++Yg_P+`1KfnVy`d&RDcmPb|>jS%$accQ0W4@sSGT#ILlm*to zH=KaJ04FeytR2o3E}~7txsHQ7Xb)@{c65H67xhE8piP_On#axs!VS0*UW+B0$g}>L zZQj-}#x+8R$gG4F!;9JrxyUhXfdT9U;}`XxJjw{vMHkMK?4~@*=vUPFY3%3HKhE`j zIJZTgD)`8+VPm2Cv>hA(2cg>|(~;jC(;j`m_du}zs+{Y``1*Ky-|}U5*jPxfqrcdP zoMYUj-)Z}F6604SZqj}|m8CCMd|PH_YG*yOap3>W`Iv0$KQ{t;x5y#lf@19r7%IK{ zaq+?1nj0IyG58_a91$+T8-ZiE0^1LL!SmQFgWO5Xr>u0z3%&)VXH8XCdZOkjb-cVF z(JseeoOwnXd=qGs`N%x=btQCNzc#T4wWT^>Ao6H~K64I%w#l>Ws4c^+a6>+Q;C#xc zi_e3!+roY=>x<+i{jhwcJ$Cy5Js5dU9&LjqxbLTR;~exB@rCMg4*G*(SI4CNT>b9E zHK+q$P{wbBi)fc~h{;FS0lSPZd4YXvOMPK1klh4uoGV?Pc4B>wJo$?JH|U;eJT~iE ze-{ToT~LrWGCMu}IDI?ji2vLSOPnpZ28Zy_V2 z?JDV^t0a?FD}1Il)~I}q(x0cNxBWu0erRS1h*D3v_%DxoNz7nq1tIm4KwGBGw zYlUwTVWZ+ry5?qr>U^v7wg}@}q^oY#@iv9+>c@9#>pNnCF#VnCm#4`SkJvFWWf63~ z&P})T)fbCtQ|)aNk8D-EH77G;i~9X7eegh^Qt6xbGcEONjo}7@uC-p*_)2p9EB&4? zg~N49uNCGAU&s%ly`62>=$X$o@?Cr;%&r!`SF7$S$#}v_U2~v6sD}1ba zOXS1*fO{eySSW6ID?cZDo{nG0%uIVqZ9J5ln{$W!jAJv?+g>7F{><#`^kS_cH%rR) ze>d8a*ZbKB?4x7CzTzPZO7BPL+O_L`ojP^eKZ2f9Ie@^NjUaudY6R7**0*opYI>jQ zL3)Pupau;ZR3}|Iknh3sD~==oA7l07AYC`nR+WRe4xwq4D%IlJ(I4XICvo(>@^4al z-w0)8W&03xOi2DEM<6)@$q`77Kyn0$z^Q04x`&E@H`zpC_m1+kn+IIDaI~DD7`L9kmrpk(un!Cbw7H zzuNINTQog1rB2`er(QSY`n#H@?SEj)dcVEC|Dnz6q>Op}S0%3>KX2a6r+s+afc%=v zXRN1xBqeC(0hkG)T!dXYu&MbIjH&p@js*K0k`Zsft}798uoEx(7V?b@^3~xi`s5Y(~h3oC*_XX zv1iAt9c!)KzO>KaUOT>gf6DGnYu2oJ{_FEbef8*{rk*is{jY~No;Y#h_!CzzU%q_F zt3Q16=f@|XymHjjJ6BcRx_J49yEjgoI(5@agMYa0?j!0}fBCSK&39kWcGGeFUtPE^ zZ`Pkp&5b}bz@x9@=L2L``;;mn02ik3C1^+v<3 z^ZQ@^%00Io(KWx(lGj#WlvV$=QS3?K)xV{7Ys%vEi()OJ5st)@@4`OnLv3 z=jxyO*dIpZH9EU%{u67rp4YzdgsBT}Te$Q4&u86t`s0fqp7HG9L1kqZpOs#3{EJgJ zyx4p5rw{l3^7(5z&%Wo}E9Xz>`S%}Ad-a`ZFV3j9czeUbZTF8HwrR=u`8}7`x^c>g zZndV)z3A*kj}6>@Ny!KK-50(1S;3we9ov1nVE(|leYOtXd1L0R$z`YPc%*Fo^YgFi zy=l`oODFc2xP4OTu&Ezk@>urShv#iwch2H#-W~hf`r~hS^SH9YvM+Yz-FR_cgLB8t zeY&K5`!|=?yz#Y*|t1BMfb>oz?^2a^*)p^r)tbe$Bk58Yt@wI+eUa@V~C!c&W z^}8M4P1{v#%4gPgt8^O583`h$3xGZGO&5taTn~lcXDx~+ow*wFMVxpuZK4rx%83_ zecE-n=H(}#&Z__ItOK4p>X8k)Jx@-Z|JNDozv`QHf6euCugIDB&eSgXPi`3T z+!OUa=+br3)E};S@rimfr%pYi-uU@Ldo6AK+KU}}e>iT9b->mMxdE<|Rs;(Sf(Eg<>uef5{#*3f1dRVWen-*L&ZR*9(Po0{7bAy`; z{?PBddP}-K`^qb4rLV1VP`z)z=+d>>Ewe7m>h$2EadUEhC_dwufkpN2tKIO!#TQ*P zX3Un)Z@zxv)xUl6zWXP2&E3CGt2SeD?<{R_+teQ}xqVLFofBKsSk&a;_0_MfI{1N8 zSI=&B_so~d7_Rszc?D_k{z1#KZx_xWaT_YEr@z~6D6KmbYjE2eBR&=mXa0T8%-372nQ_Bcha9+g`)21m zms~h(*tuKRG(Pv#j0Ufk%@{cA?iRD(UGnKAm+rZAP;Q@hrfq+Ad-X?8Dx19M(Z5}^ z^~0{uzWQqB0S8RzJbLW~RS$jYlwH|vyNO@BuRCGFAzdaEolv)Q#T(1k+{?t@^z`sfeeRmM{mPX69=jxCWy9II={x5S8dqn{U%&qSwcGpGn)UlR_cU&I^*xK~ z^ltd;*H54J&6D5UGW3{p>o%zS;vn~phodZXs!=bwL8*H>TYme%3i^!1q^ zPTARH<%?H+b9v#V%dY-mT$A0aHmv;H@9!G9Vl*1ir-K(}lzuk%l+4-NzCOQ0*}wz4 zZvS!oh|M=mow{>R=U#)GXH6P<+cWoH@bPEad52D@a_vdSrPf^iw_&$69W=3D#`%}7 zc=@bJlP7hp)ui32x1KWj<3Ap=blKwXcI{m7;_PGZ{=-3a_n$HSorN{C2QT=|yuuE3 zy6jt{UdwsCR(|(Vjf=-L-uLPB6HdM3hi5N6t=Wl(ZrgqB>dS9SX`6M%<*#nN`MQS( z|9;eUZ#=c8SGPs&#$5MCi&rQyF{Rh*l ztvcz%$rCTRCpV++oNYs=J-2ATRRtqAU3gNTo%vVS*8wZ*lsEp2q-&DWlO>*b>+Z9Vg=O}9R<5ypGJZz4og<#P>EXXOoiMNOd-p%v>C>f;_tu4;qH+OK2U(I~ynN$1S-fh&Mp3OOJc>UiEop=5jx2K=;%>z$9 zxv=`6Y8!ss_TiJ83J&`E$X+L1xb%wjotGbQ>SfQoR{xnt`rf+d){C~kG=F@~st1-_ zb9mbshc{Vt&eOFrPs(2K?9AD}?)SodZ?Aa$_sh0-?RwORY7b7Gw)&&}7oC6EjrTtJ z^vx4mSATd$oqpBl^qhLsb+Y~SHZ~QW&*TF0L4w(0F>q8oUwtMG_Cr@25ci?YF z^&0v5Yy13g-?q);>pph*(goY^dT~aeDb76d z_8YhKd?@XOHy%H$;H9f;x?TZ9<#c4 z-LVY|FTH3&$I;umE$V;CySX2=IO)$Fp4_nhix+3?8J+(?*|>9i5C5WU!3&qK=>Er* zD;gVY222`p!Viaa{PwUZeReKkqx1W3nN_V{ zyOA%wRPx>lXH1^{*PbsmocDRRPYVXs`0l&GS@mXqR5-s|+S*%2j%vE$cSHL=I;+dZ z$>ZKmJ9g>%t5RC6SUL35VGq1FK84(xVPz0wo@wsrZp-`@PnhVBDX-}o@Q>uJv% zbK<2Z&8l)v-aa3mnfvY^UOl!(&*%EqterP%=!{$T|I-T_x?j=kik!w>Z>n|Xi>J4ob7qzP-#4F8_40W;Umdz;#5td} z+c=|kr`;d^aqXh5wO3r7*5a;`+ke+}+k~ZEPU-N%bEl1cbm9$}cRqN@{sTu&81}%D zMRkta+P{9iy2}TBQo85#SH^t5IqRlrR}CBX$id5IpYp_%Z!dcCzQf+i+*Rv~rFTso zz3Eq5x^C~-YWbR5u3d9#>AQbfGW)%%7ynS&t9a~$r$=wO;+@mpA9C=bYdVaa-TlL| zzBv=i-s+qEW5?d3wl99F*V^584_YyTq3<#Hw2TI4{W!12rd?~Me7kvNql0fM`=oDC z(VQEq{^90*@4jis?}m0hrS|xn2j6n!Far|Mk zMxW5*y`dBCcyHjq^Pbo_d-P4I`*iD3?b@!{TiWb@?(n+HF8=Dpbz5gIez<$Xr;fb( z(wAFZd)0^$X{n2ry>QqIr){m@BKN-c#`d`F<3V)}IK1AfA!qh0?p`z?$dGzyI&Z8L+)v9UVW+K z=KdXb-SR^1HN*F<-Rg)}mVGtlq3PYG55H@l>1Xu({PF7T@3}5zpNoEVY}r+{A5AUZ z{oUrd;|kihKl_e$)n4w=__ooP^l3bJ+0Zwa4X$$8v)>F$8UFa=2d3Td?wV&_d45x) z+ebXJ-y>&aUpb*hS(hW<-unDKBNiO-QHR{_Z#B%Blz!fx<;T7|yx*o1=bqfH#znUe zY`O3L6L+0@(ag`UZ~WKCu6**$n)Pe^C8KBdZ)c|txn@S|5BoKqm~v9#4{KJ}{r08< zCQr)m^+uC77Tyydf(236fvr$M(L-+$}+)lKV8 znB1u4+@-fq8-HYGy}x`u{E&@Z>c72U=Y?06%mJC~j}`Gj#@Hx3whezoJ%h95TMpd}A1o7XKnYsTZ3w(ok>QAcTZ*Xl9jqpkA} zf2--7V-8te>xkp4H5l9PvJ*O9bI-lcF4}KF%C%Vy-d;H7#%YD;y_|JT&pCC@9C+A4 zX-9l=`k1o9IVbM-z{jO$w(a@-@ijiV;iVd9k2&}4^=FJ*Q@a0i^Dg9P$?w;|&uuYTGx~9}R>HE?jYuA3Sf5WEhE}C9@-ty96f2v!h z?m0`E)LNW<L1=4`*fonFIF8?GAX0p*7=!By8ig;%Uj-hW6bK?-g~a+u93$|FW}0*H*WrfCEHh3E&AQ$eYK$bfQ=*G`0Us>hgPXK@5C`3C-!_|NYib-Ubw7TgLQ|# zQSHa}Kc0F{x4)E(nqF?fSg@- zmUXPL@r0YEy#G@BrNhpv^6{3{$FIBm?kdOM_H3t~!&>#5({J{$O`|XDxqISkZ5MWY zA+KMz2j8F4b zy;}X34_&^p{TEMOF!${77Y`V9>^ZC7{Oaa|p1b#g>eK72UGSTOMs>UD`u)EA`_i2+ zT=3}Qnai#^V(cXYKDhp?A${xZ`tXje_s$sgdi5%WGhd#%e(l1E59fb%PuA$`5Bm7< ztZplAy5N+xuaDccLY+!v!Pf3|s}k zK)wTugSX1lG4(Fo?0Cd>wgt%JEbi^^iKY%jWiE!=KkKA&1~#tsw0az744?q;dt35n zj6^OdHCWE>$U7zB5p;t9*s8KT8GKE3(zdTf^(0Bx4t&6*2d%N z_@uFdnz*pBWEdMl5%)9#1??VC)8XNxHXtqK4s#db1*`-skQ3aOdat>pqq{lhHfL#R zC~ac02u3Tu5`^N4fHeXQhDr<^1`6|w;H%3JJ1R7mN57#z%q0R6ow>(xNm1}L!NmL- zs_F_X7IN!nfvWk9L@Sv4(UarEcAGr;)_7Zdo3&f3_74t(7Poo>r+VJr-o7kKzK0H2 zcCreyTX?R}41$^30EBfAM0|26ApG6w;mTM<6ZXa7`)JHFz)(Ox#@VwYtMzpXC=KM| zU-=1veSr`Y65X$NH?-C!D=&#~4wO?Zh*a-jQCByfx}m*BD4?a7~wrQ zQ|N+F$K%IG8hZ?#xssvpQeh?58-@C-U;CP#gS(u)s?@sin#LV5E|xjcRB?osUO%H7 zn$jB1=Th_xu$lm-L8(eI-%>uEMoUUpv)TIeF`j`U=bkJ}Da07)_a1QG@vaCDFvJT5 zHpNmLjYd^<^QjvO&5+HK(i4AaZ8-dIKKjv*{-evB+j7mfo&rSy_}0_-!Z*D5;)^@$ zo7;bRGM)VRY&IXb3zi!>Xb4T1J}$WYi3+{kl9s+?wNJ_6Hy|4PmG8|3ZQwn$a|8N#7IKS zBXD7U-3)>YiQ995EH&lMTk)Zolddd^s>;ky74jBdJY{Zq;sYufOQKejU?rQIoD{On zOiRXX>v2xyyOgVsJDqepW4-{#OxfXi(BA705Z86gfKQJ-vW-BN+t#R;H9~Urlu5C4S=kZ+n&di3e^yD(PvdiKM8OYJ-}!Y4-&&(-CTYN?r~bL zi4}0N*!hmm!O^3mT(HQM9_G(;VvfBDSp$K}a!oWxu`z(H?O*=u;T_5=Cw$C!1(LOIV{I&L&C$V~325r+xLldnbviS!W~?jF zTFm5=>E-$e^flcpUel_n(I{Mr5Qe$f*|zIub9oN^9;dH|TToujLoyaNWHz7w%JJiq zzxc6_edOhf_FDPzvn$aQdPsBeAlg~4qz~^-?@`3xMiN%aXC5z z*5VO!9*w0W02HHI8AV89+7od_;>8G1A$~z!CuM@lY<%Z=`(5{cwiY{Sc6`q>Ha6B} zwE}=U#^N1NSKbQM;QBVE&=i7cm^4-CaBrrxrw*lJEZmvzc|g5BLif9BVfLn!U@=p` z<=(vqx$J8!1q@@w$^lVrWri)!8y7hikAv~L?~Y?XxON~#=)uDW8RhS;@ul&F>;ug; z2}}e&fGY&ey}S1;T`yU@wnxnJV~hvauE`qx`q#deuk%{W?owudxFV(kN-*#~1;qt+ zS8%6)FNIw?*LBy>*U`3Z!+N+5fqd&-x8#*k5h=n)gIboaQb#9K%^#WoK+OAScSrMQ z|N3_^yyNdNceIrPW{o{9lwm+mv-YhRj*rvvDwZW;N+5B0===KX>eJA&c(=DV1-fHT zD`W#`lMq`H(uC-E#=GA2E{)^<{rkP(KHpDV%l_Ni-l~osA4$lvXQ2l|)s=_cT`%VI zM71=aWjFOQ1!MZ-{23$CbT??%)Myj{Eivmg991`N-qbmGboeM2%fch(U`!8JktO4M zg*qXGiO39@OecTiXg2-JpZWO5zj7g?EEjxBC{PrDZwXm1e(3G@zVxqDi^WfkN2BkR z3!T!Pl~o(l$5$o>oD;}L8uoBxR_26;BUm)Uobt!_Tbo-ts33@Oxm!w7vSd@-lUKMq zz3rkjhOF56$w?lQe@ASYYHQph4~25Z$ND=A9L71Ks#v z>L#48nUXrHoViV~FxZBM8V1D>k{&~*B-r&w#w zH;M=I1SjLsl{S-KM(t+hAZ=vTXlSM8wiN(Z;Osim6q}OB%p<1|hIClxY20ILXrR)w zv$N^m&hCHpp7%We-~H^*{_Ht!vTw%jEYIjtpeO*}<~{NJ^UuFf4MsmR9FBgF18N6* zbxGOo0cV3`NND)iYOb2m$TEdi<879ot7Io`c{FJ0?mb_G}H3wE_wwX4|Kp0IVcJv~tG0EEBc2+YOM^&Z&RQ})Gpq;tW)v7E^WuwqmQ&ox!5 z#5y)b)m-gPH~#B&|Gj5~|K?!OQ|Fb;2waBgnu4$8a;c?6@Vr+vw45(90+)7WyM>2H1D&3A4o5X z3ZnP~#iOi};nxly9{$I#yz=p;IrKMcQe>R)V|LQ<)S1+bx z1HfI#2aCN0vNI{N#Qf0Ev1T~%)|dq0m9f827hgPnDBGYkMZ?6?-O$TIUy zO=O|~yU_ifuyWU~?W@|JTTnXpbtNF*-Yzu>4poRKG$mQ8f(MfT?TjUZn{<_R^o=eZ z?qylY)XUHA2@@_}rvPgYH!CjA2m2@FPGd4YC<;X=Eh+=dix8gG6)>-Zdm(!F*f}*06qX}1Ab8zc z0^q#t6tAlhvLHOnCrnAFhJc4BR-_i>J?Hb`tjl9^Hu;6cV)pNsfw3FeI zlA=^SYdCXqV!7XpNg)C9#n(5)+!a1h;}omR$FsX32(PpTV~$nHx)#KFrcTnAx;jtrIke?c#-nyXT-cX=8lfv^@W*S8FI_s0c`G3yYQV3 zZB;xxwFnM43a^=3+mj)Nma&*ReFQv^_T3i2r6}V(uxm$`5pc(IUS#zHWs!ZzS65MVCUy6@(DPpM>GP#%13F0!Wkyd3en z`1dwIt3jvZ5%K~wSoe6D%>8X2#)ndY#fyuW`NcgEg)Sipln&hK-5v??x=4fW{)$4z zl#Vs6bGN`yTiEyQVtY#zR$T$zrB#FEw|IXRXsNt%ESZc&ya~8-eN7=RDGVX?^SnLA zd+}~DKhC3{5focxl%xh)C>A@r*7ym9fi&G5X7ChEN=C1$nUD?`${}ZgihqPrQ2tvU zsZO^2@9ckbND3J!|WY&!jWdpq0z!G}KdA^V|xzUdSw3cxp=r1rq4pMLr~MjKmy zcXxZ|pTm+SH`_jzro_jP_c1nZ)^fDm+>&v&sOBjY;n>_z&T^kXT(ziv_&C5YVi==$ z7vr6(4X_3iwDQ2R>JosEkbz+qEafLM@xJ$QFF-`OW|LJHJIT4lNX-H)0k4rSVV^p& z@g6?%9;7ryw}M2ERm?I8bIljaYdlo-KTk`7@8N?aq&l0^mxm?|;S~i+!;smQIN0 zsPO>Az3SjeXzcB_`Ca>RHeb|rU26@d)5o*v{D)t8fKKBEv_d;k!0;PZ1VU4c^PD-v z-^6sO;k~z4Jvln+Slu9q&DtmK9zkV19yGQ>6fRy`(NcsNa39K%n4#*t52|tM^RDh?-h?KkCicbVeZB~Mis*P4gm+-Iky_QYZV_aB zPH5$tlrx_n;|1(Ute;qX_ueSXE!7Nw-u;}Lj=+KjeQ5S?6ph~~K^9{_&vots(K8&} zjT;5FyQNVQqXN*UYItYBGDvg#B=7pPhUYuJTAIhH;u@e-4HYTQTPZ3^X|583$ zg_e#iJmX4@A@6HdtMvB7*|I$cJF0!MW}zQj_jdZBT<8p_<@Rny=*k;=iua<>F#q+n zjq3hGOZDR%s2b&TsusLtg@A`qZ-J48W4y#~^j7d<3C@Q{Xlwzj31kiFoQ1*!ATJHW=^{UX(p^U=ii8wH@{jq>PUUmt;>xHRpvZH#y_ zEbGM-ALhKau~y9{^z&%IxR&Kn^W9&1<<~#AjDC&$ND z<~CL;ON8mOrkB4vKbs(0q}}mFAr`HgmFp6$ZXbu!MZ!gu;3)e$6QbW_&BaI4W3kb- zd)~c~20m_3@hEgLZ(NFjG6d!Vk$P9a^Nvc>n5N0(;u#1(@D#iQ!5HVI6<92U%tsiI zTkpzYd{^K8^$v|$=?a;%Q4v!~=Fza4oHhl0;_oeCwu0vF(Lu?eV3 zWEdNtd&EW9GukuswLuV*=6m$`kvvLX(%8n_?g7v!I-Y9VAn>^!L5r~Wvx*1Hl{1eT za2;MGsuH3!;Qh(r#ST88J>r!OL6Wey^h9XEGuh|73t%gM*z=BE>C$vQpDzZ(p}Ya> z>ubO82Y>(f|LG5W-~(0;v3%Y%1uo_?Z~7Hi;{iYTgFiU>?Js}zZ;gkeKcz~3mVlk< z+p_Z0frO#pu2d=2aKK=?j^3Y6&Ej?@l&xs<0gdmTd`(*KiEQCC~ zRA!ek5DvhC%DvNVg!xjK805@?G2P4fvWs;^aRFzRQos_ZtP5Oo1`Shcpr7lJbcvh!~qPp&Wc`ZqoIVK zud~TyF`G?mN@Aa$p8n&b)8jw!>aYL$XD&J;<@bvzP!xcRX>{QgFTC)=yBGEFSL(Wc z(aN5tKAKUu8h*~)h{-Y{1rI?+`cJef>HFS2EC>j+XxElo!Y0Hh8xT<=xSMAKa5IEE zjGFhxHluDu@NN!m1dwU;WCj3wLhwkKpNJ8|c)aZ`F;r`Qva2|`iV~^3ty@9X5)~!| zBa2@A7NM8TJ|U%HLJpql0;asN3qlR%ffeJ-64yPzB7j=weIzt!8~oHwvsx8vw(vpA zdQIUJtTf9Ouyn!8Snl$s(7yTLK=;LNZ;swK+PF2hd`$U`{ea*ll!TD7!cCU)8GAGM zd{u^ZI-SzdgEMJi{M7!cZKP)ryw$vDyOVYreI4fdqN;Xb^fFb za;Gjq3MH_upds@{iSAAS1(Chr9uIfPFN6Dh=IOsH2;m+;_yT*K=et7e^yzLI)`~N7 z?b>zWXjEo7)q0R(znJ}rS6+GL7cXSa<$`l5P!xbSxj~+N_J!vMqs2cOkH@#n<-b_W zXY))~bK4J71+r7Qy)C9_@h=3bGbU$RR&JISrW}?g^+(oODks_%Mri&BImMY1@*765 zyR#!J8-}AYwC>nH!##r7PVZ5AJ5yyky~+iO#*NpId02f1<2%i#;REKu@(P4j9L>H<-pZ-< zR2Yqhi=CaFnre=ZjvoDcpZeq{|JIvi;aB?hq5!;!<-dLV_V+L9;jayc!%e_Fa+wmV zwsb#zIOs4r+*b%^wE&GVb3>Z7uE)(z7cmKxthF0si-5WK4q23YdrGVEHlt=`?yHy$ z`Qv~OIe;qClMa|MS(v#O?|tGq=-vRt8DEzv zMvsRWT8DLaRRjk^882#5mi%6ILR?>0=mcwl#wzNI?(2ZUbII7c)-9!iU1ZUtP~ge& z?tSr?aw$CF>!p3rDIDc{OY`rhUp8P7fU+#jt6qko8ynayU6w=Mn6D&9I&_nepHob*-wxb0p) z^yL5ZSdjY8{LKR80F4#vjCs$?jH_Wn?g}LxE2ai^1&SX&n1nhL<{JOYE^3q)3m;6g z_2CTB-^X*V9UN$!v0`9k92W^*zg8(kgF!0)+R%#o2}|%UxjMUU{BxKzPhk!SNGnWY z)~J74e79$5qsyByz@+85aYZLtwtX~@kK;M4DX482b?>^Kx3%QpF@+>Dcx8B}lONs8 z{++vMd9->mjD{g}($FC)3D8L%r`_FL2~cT(sW^`R9t%o!hb}J;IpoPzOfL!6*53nI zkdN`rE4+I&4r|J_E^!~b%LfhZ(djI-90E8*Jb!i z&qeJVd^`WF;ZwJ6RVOFMYBCg4c&!VkDX#T!C?FpOM?c86Dc#F+*OqY{advw8U;oB$eB!^j z45`aCZ3<5abQ&tDk=kR3*C-U?)y|wPJ{aAH zO&@xG5Ca8-w{A7w5omI^le2B9hHA<|+%(3k^LtY+yD9X>XnCf)7rUiY1p>z1lACWR5VJYE^{(%FaYkEtVgZVaXFl^bh?b5QbF8!T;T$+~qv zF%8gZ&RFHbryOt!#mK5wWkE}IYn_Dv#&nl|3_*GPnKA6_?rQHMV52gry&qi9K2EOj zjGD94iCp}`=tTEYXHrV#)A>5dp`BILJMC6O&hrPHj>>93JU_D~zj9@m!G37d2^T|E z(NBN|M;5y`HNk5PaQ4+SYBFq6>hr{7wJRaA=a2y`~ z%qKtj%AYH;>WxvLC;)GaUeyaPyznPS9qwEh-qGVHEjKj4D+CKgVX&Ubt%u1V^wl;vlsj#Y)tC!H zN5xA5@UH8I&I3+BGFfTKIQ615%#$J~FfeE=42AcmU$O4c5eCZK7$;V&hg~A00tCsz zw*+gl7RhJUdqI`^_UJPERQB0~GrnXiN&sh zK}lg{Ufv2<`TD7cMxTO$!ne6?;Te<$_7e)DGUiu!fc$&@%YOBHSDj7H3Uo$bqST@E z^m(-|7W#1kdtCy?TT;`fSX~cVaSl-mXa~&x#qwwCsjYHP!qCR%rq-IuhtWV`T~WZ8 zH}hg&oK2=HfPxWhSCUlnE8+r z>dK#oftrd>FMeJ^y()+@gr}LrC;gGivsWlmj6BPdCwoMs^LH6 zL`|o-{TC})v0FVBS8KaXBV*Kc19GKJh_jK^tR}UgwPHH}a%#o2U0Az7gpUEL;={Yl z`X){~)AhOKY(V@oez(|M6K8}u4J^5BW8AcPU*q<-v@+{m5I-7&n6q^*1ed@@KoDRW~j zJXe~zIV~gIx?T)>w+a1B(^T%5YvnReN=dkyDd&sz0y=InsTzUu_sL{SRG zS3I68%Rkif@80iwi2r(esw)M#NKd*cXAJ~F@0IG~Jv=n68U}&eIOoZk9J4c!g@?UOmQ^}*raTy`nL~%b zfFWVY=d`(=wxTE!W4RAu`c}-PYq8n5nr>u{anSc2I#_|ekutM%(LUcfDst^yJJ z#JVt*8_eJgLbN*0pB=xN_qy zkhw2<58TpnVd8OlhDM4W;R!rOPG_GV|8^R&Pk4`&k#5#w6)jd--G03bpNJMWH?M^c z@c!hw0X=IBCPd9@=<6Ckh6ZDowXvIx8u#dNCm^EKjG2zI=S7$$>Zt*U@_h76P8 z$|#B-e-5r)OI`tM{cNB#688vuDQ*^C!WG!VEfU+8G<&SxBjIU^( zi|y^Lnlj>d?%nzEPrmZXPo2jf%5O%2q5xcCCp`DubGPey_-b9(>$ADlsbXSYis_UK(U$pF3O95N#tUdH! z*xd|KXycaSK*O}X8d^6sE;44hP*b|#;e$gf?$dE2d&yXy*RDCxfSv$;b=}N9mqvj0 z6m5j?}={VhK_B#0>VLQmQ|%Njo(ArSK_U>ZawGU=@6Ac z+QGuesq=u>hO|s~_gY@}W6{AC0RC--fanlt@9SEq5;O?VkU`K59+>iouebr4N_Zqp z2Mks3KT3^mT3Hy4a|=a4$}vT&)~vUHO3z)O_&;Jd$PvMydR;ABFdR?W_@kDu##Xw~c#C_ob zvoKaMll~vH_vqF0J^YWCAOZ%bJVN^KpN?Zfh)NS-P0ryKvaxVh$KxYD_`lU{M%X`x0$oi z)Ef9;iSzG>G|57xE|5DIM_j>pT;9W?;O4^HgY*b)p*?Q#~S59zsvlfg6H!>fueupLI z7y|aMJRPZMkCE1DUGOe`gO*+akG(=42LBEkbU~_d(XHewfV2}08E=5+kUJd(NKFcg zyOjGB3ST!Dj{MiMIxN);91P!~M6(vlKtfZOyv4ECW5^2JpjK5(=&pi55igO(w_1!^ zsLmT0x%bHNL(EY$=zOq@GqxqwN>~QeTCWfiU%TEls~zEOo;%=V5iI}DilO(54BzJw zFzH*Q;d6j%ZSR|x(dg?ySrkL|Abdl82r#hljHMRo7G|=V9O7xIE(+JFsTk`zn=Ljr zHZ;hiho#4b9DRm^PdSQqvkOx5cRRyFki$^C%U?`uiXIAggEI!+v9+}= zYeTgGl2mm-Pq%51iGgOkT<>#1sHzfR6yh>Hl3OsOS#?2+t|;{}c(>@8znCE9fxYH> z;~LDuk9n)-{B+tBVd;R+uHU#J#)Gw|@u!dn^xNCpQF@~bkZj>4>zfoZzI*uafkFkm z3rk&Y_T+&vrnW6cM%6?tW3EGKKv=qq7kXYhxF!XR-(;ivTuav^}vUWx%WO#eMGU??tW&kM-Sg ze~EbylVoc%db6_UEfkp}T^ogZCEvcF``ae-{Sh;P~LTHo}f=sAh+lxmv7bK)7H#4{m3_#EHM zJ9htWHJwpGJ}Z#etG1k{BATV!wrJh5j}}i>8j>|;6&X`wn%qj( zT)&PC$D-ro%&}pNhLF#xgb7?2#~Q2t86%e1H)g0pM5gd~dLrwqHnOyW4PG99rX$vc zULTPjMO8Fw0n2yZz8Sjm-4d3fLr7n12dl9ceBUXKyiVhvQL<>;>7=~R-RT#-$6sqM zYOLI$YR^McFVl=w@174mH^ro>cR;v-dvp#G{=wti@_3~5wN@%w$Rz07Kg=r%(FXf4 zuo!>(^wue8wB%}Yb4$YK@bF4hs|~gptO-OZIBRQ3XdOvtnc`=^Sv`LP zFKVqx;S3M*_`Q2SP|Vn0^U?~D001BWNklXl;-I5t6zb6#>J}jMVVRl|i-d22e};?gUmAE(Z`U?T-_U zGJO&t6pw(@!^(_Ti@{(}PbQPEe(kGY{@y!x?$BtWd^!{;3c!jjar^e|zc3n&|NG?b zl^x|EAZ_9vk81qNt(-3C2_Y;u`g~qdu2VoL^`?Jf=;oxsOL_2K>cnwl^Am3on!tc< zFw-(1&jl^QkH1Gt$Atn6LkB3us(swit?AEk%iG<&SoZ?_t*zy5c2W7kHJ%&)Bp2fv zf(E8FpH(C(IZm&=9Bm?7xltHx({awPcO@x$L-HK3Ad+=WqZ2$DP5ptk0+5xb3%xVT z8%OT;pwt*Mx9X5uzm$H~_VO%)E%TFu^$z2w5M&K1(pqS9b6%+DRy3h8F9R-K6&6bFZEr&y*UsDgW+iB3N;hXi zC#f2hOvMK_Cv`}s|C57`XeFp`uw;aav8rlSnDJQ50hm@_Y?g!VC3 zSN7P8%-yYc+l!X2$9R0-;;leQWG&jCrk{a1(hT6*tjnNPMmX+i%VIGv2>0E*c|)N@ zK$OkdxkxMopJ!5ZWvp~QoO={6<^#`(T@-aTQt>E4FwWn+UI5p^A2Op&xCH}3TWM!I zM{%sCV8kzdiTK7Pv8C{Yiq*~nMU4p_3MrArzhAU zJpbUhmWx}9!*=)XT?0LNOU%inRdvh{3Ek43JU+_(&s*s*xQee|v$*wx2bOt|;FsNJiwGjYl_FMD*D1ZVlM(hB7Emfb4*~6qq|Yct^oR+TG z`RJm1n04g(E&{$gldem7)l6}Ni{?EFPgFMg!Xp)H*>U$A zII|zGSsw~OT?sUa=ZJa(N;gb7^#EKENYM-9%7hf;4ww`{!uYy%8zP-srJcJXARJqN z&qegXdqVi;=8YTG{reAu$pAo_KmLyNY@Q3aQ6RXwQheVl270(mIEi&=MD2~`&V=@; z9{0PzgYn#0Nn*q7&_BeyMwYhQfIaz*W;-Z>cwHJSQBq{NI5dIkDj|#!#h-nD_YUs) zY4&dUwNV(yv*bz(qmE6WsAGVlhk}LT6OAnmXJ{cHc$7D(Vx9Q{gA)la@s(gT-N$)W~j1sUn}^wUp&$7nSE!eB7mp3g1U-!AZGBg+JHcP~t# zPcTWqqyve2Pr$2WiN_9GY}zh!!@}6w+>o0Lw^;r?^8u^o=FiJj@Eq})3a8pYFBtdDhZ1Ur0DP7F&Q_-KzO<5KhFzK2{8V^<>E=vT0 z#+-Z5TWoigD&_Qb>%m>}yvK9&-BOkE;Z2v43qD#N?(X&PEGN2gN4ho4yrDaci8Wv? zToHg7!3beKxhPF)#_>8_Kf4vbsdD(L0!_p`QS?S_FzaB35B;(6l=VF=A_eAJjo+(?xfhl;T?j_3hk zjyhjp6jB|CD9}wWuJPO5FOw!XetTU)Euhvnq#-}wAzU;TTRIVV@;nu~lr zSBVZf8n>Uj{gKgV^aD$7H@TL2Ob09^xw3`=+{Dg)k$A=ctXRk4qsKZ3(QPRvXL`oc zCt5N=?&s^AIS_JIlN3wHpLvLQ-oWSZ|hn+i~`p? zX)5+^mj{9_Ji9nE*j2OklZ7*+FxBWUIP zrz5HT2<>jUeK zxzc-(lp_f!;X=GNMWyqwxxOjS*n`6dQi{YAB=Eq9B;%s%tx$0&>l#R$-QUeP@HXu3 z?Ii_$+DdK3u(17mU}=_Qu6UZ|ys9>~HWlu8^zh*l;1i(^Cgs+fN>3A~&1 z#OMrl%md02?{knYMSG5qQw@QGeeFLC27tU61{zD)z!^@sz(AQ-J9|47DXMqx-D|R6 za!R0eIduRpUfj`eRFlGedh+CZzWBv2{&wQD{qdr!BK1lgfc8p1_snxYK3*ID6MT(JR{*iiVw-Ghyb+D05*)((=9 zJ92kdOzYlV%eQuGv(JOUvthz+Sw}(4p+mqqL zRSTZ?c^`EcqvH{Bs3U<1obkY@u)46?eg55ba5}m2z<)u+d-q2F-76nPI>fj+h;>g( zJdcM&u;2=v??M(N!I=bvXqimY^MsGP&!g9XtO5Zv>9-#Cv1&Bz?kWSpL265bN|qdo z8?{Bq-GfQ|jbY-vb_r5|w8)R~vg=SWDrEGwvWp*mkM7%k;)}g1@&+ybaw=z8i z6$_CMW0X=%RmxQH(&y!tEy}!Sz_deHjTKJ@jtXsU)9TjJJ6pif4zXHiH);B;TdOBW z@?5ym?sM_DcbEPERuSYV<~*x=c9mwB3Mrw~JB<+dyqDjMH<>p;<+qapqY}cyL2nmI z8;7MAo7W9&ilukPkfWX7=EIs;1_#ZtIFHr}-Oq!(i3xNpVCJH-w$OQj>@T8+z_V8I zlurf$CeM?ff9=173owty$%jAl=}-S)dSut4yYSq-(=I3;0AnSKXP$ZHJ>%i{vv{25 z?95I^>_w_#H`XO9bE9ddkr{mlC}sd8Tw{P*x<{tH-Ike%AI0Tu*#-ut>jHzvdRCot zw^}TSxXk0zz@r7|0@Tpyqf|95S(Hhjb4{Nz;V7NxNHH`SESwQVcIp*^F=pf-06;cH!Y*G8i603Py;hAX~XSIT@mRj z02*uB6DW;dL6bFYS{z$*A@&qr2*)0H3So=pzR*2~);)ispNct+wAXweTi*)m032&f zvAI<9I8t@jMenHeB-xw=rH5pA9!05et+S@g!S7WnoL88(h_QUftlR-{xUBFKs04ZspZ zC(L&;Ir($1edaSi^JdTDJK_GTt^nk1{rvOKe{6ki{STa+o-XF|dHdKV;nKM5y*_*g z!JY166Jm8*Y|8*?SPX1_V&j10Bs^8T#;RPcD@IxO0`NF6&V(|-jBc%@bd0mjR87J5lgW{bI&f1r|-ba;!m#UEC4P@ zZ{+U#Q+V$%hu})(p4?S2~*^d5=Ct^GTKxpZL&|o+oSI2}&`ZN;PUfo(s zsB*?dScE-7=%cG>@oX
(v~sM6x0N0c3KoWiHrfrH7)22%a{HrHhbcUVPTa>nfBL zfpR(*vJ3|m)gyV2LSAZJjg{E9L+v|R;_DtdvsgAMYb$i(3zutI7j53dxELQE1H3C; zuM7JU<;Y^&){gn$U|*oPh@$s#yVqhBXvPHWg+tZ_C_aqcOZOVz>2&u?AVSUx-lOB= zlLnmJyM}}}tmv7xR}#>1-u`#4%iRFkGxRyhSs?SQ1hOws_@E6;G-bRWJ9l zwZD`bDgk56jcf`4n_79UDNV`1JofR_BF}dR@vfM%EJZ3>E!5>qG1H_Ba3AkVtTHo9 zT$04S_@jE`Rccq7QkR?&IuaJ92l$6~^u>qW^+>fj4zLLqvFGL(b-0+obgC+7Ion># zK){>OwePZ9fWwQm5kYr;uM0cI1Ev86?zzy-Z%LR0?&j8=F$8NynjBKY;8lrZWU^~Pu{A*irk>f>5P$njn(;L7!BYlr;+(*%oG<44Qc9l6AWvxq1UNa?>9;H0 zgMfE|Fa_BNfc*IIcTc^9-WKMu%moV{&NOyvQ+U@?)`$H}1yYs4ri&^yOH$av0f)?0 znF0AcfOTnjGyHTqnf+g%`OK?-Brw}cs!5mSaBq+6uCf9ko$#fXUV3qIdiE(+AJ;!+ zB;`WX!I=rj=E4JJXjYZ#PHUs$UM7}E997zOmST1QWVxq$L9)6N6X3W+ly^R$t*Us2 z5fGZ0Hky-(+<07j@7~?q64T4HVm(mdOfJEW8#XR9!j0lQ#5rGo{dGHRF7VF*gaPd1 z&f>jCM*l;A875>T~G}tEx``7e*TLZsgnHrg_$%1O7ZLJ`l3IQoD+GJ%crFC{v z;+BP0c5($!TR+8JFoS+@_j~*lV0+=Ccbx;P^vjE&vrw*5` zwXS3ZV^9Dl?J89gf+^!j0#+W9i);K_xMiVUBY+FyWwz*V)3J|z4n>Ec9p#VZ@@08 zbC_@`W@{{~jssc6G2hmGhhD`jdsx!}&SIi3W*dt8cySF2J(wlq7zSV9Lj z(F8@DwURQFtWi$|^!U7cWV%9cmG{9d&pc-6H%`4fP$+xG*Jhrp)d2PwW44|F?YC$CNP8*|1YIKrb>nFg?amn`!*l-G`-EWti=qhNje7hT1)%9r*~q6yYDeOtKqGo7!v0bVUI#+z&gve z0B1rt#Ean=|FWJ8-7^&p3Ft#?A7uhXRse=TdB1fh`aWKnFVy>wmqo<@zTxj|RZ|Us zRPN1Z%FO#D->qCWoGG7sZMgG=zs~=BVdb(_y7|yNojDX>{U*-NrhomjpMCW|OkbQ33EpuAh76xi5^yqi4N{2n|tuUp0r6wx77}$hV$I@OsgS^UyWUQ1%ZF zQl~eXwcrLj$*y9Ulb9C$&mSH(m9Lf{O9tej32|#&0Rxc7(z5)`YJ!0?=2K#hiSebv zw7L2hV?nrpF;HeeXdw$D?xK6!yWY~HM#FLSLaIL?_W zu}&8tD%{lR&KK9t+~U;sUrwEhbB1xl#Mqk_0s=rbZMoh12CVQ54T3u0$*vM&a-}IP z+hXDiL%kyuV*A!!d63HD-ne<)nlhc7=)4%J+`wH}tYA)H!q;zHmyq!SG!`23CtE*w zEN68=oLC-Z#uj<;05 zzV4$ahyV-$Jhm!4h6P>?pJ=i+qOp{L(mmRMWO~Rzk@qlt2hEjvLC=8PWz>FG=Ed0B zkW0A_V!F@rUsetpgU8;7=g7)9L!a?@_|nTSzx?T|=mofH3P3);&prLzkB!zw|AV8X z-Qux|X0?^IOf|y!jjhNgbb=IrEEPDi>0|^;}T$#yZBTq(pqK8v_VWMl) zdYqd(-J1Ymo%@_n=!}+);Pk(FgBX;MWluq}D3{7EM|N)yWzTW{c{%QBljz)_%nCb` z;?9;)>!8>{dXBewo~*36r%+eI;pqG&!N;B;Jx)S;tT=8fEa%tRp0^@NzD7zz1V~1U z>+~mr@EE6q9tEOI!YL}wzKfaSHb7snRo);dHw{W2g^Ps0^Dg(Gm{Y;P*LWoXI9e6O+28;4r(XRR(>Sk` z7vL%?0F?VZ7!60iJs8wGiv1@fzm$Q^b#0ELqbJ%NG~^)u$#vwR=gwKlwd@Sr)8w3K z$bATdIyr9K^b&$Fmd2%*Eg7!_*mK~NZ=2GT6t52MON#JmDDq6uU}x4zVaqyCOAvS^ zK=r*(UINR(HfD=k5)hrw=idE$8ExBVX=Ke@*#ZbH%M@Vjs*sq3uQSj-zT)xVRj%!< z+@x-ZSkMwQN!WTRV3ZZh0p~3d|JyP%J3}}xnz=mMmL=oh!WiC3InAcHSqvCKVkLt~ z(MwqXIrrJ#VX=Et7`(YmblY0$-FkKX+O_K8;iCjT>_K2hORJCAXK}M6{PJ7fs`h3}@UONa*xchv>Z&tmLbQ)5rJe$5jb%`bMhf2n^aS+h4Y1-f z=n=yFg{NBDJ1Hz#Tlyo{J>faY+oLgtn<6;0c}IU}z?B7_r6yWy>+TN!TqOk{OTydF-u}R7JpA*~s<8uLmo$RL4q3La6UffNd0v3T@1dcFQk9Zh z(kpTKGc0D0TXkJx33rz>DTD%_zUDb@RT2mDIH8ybH-s3z7;ZP`DKg=}RAoWemTu!? z5Yux;RoAI`hyng$+_fd=P&@#9O$?Ms99-do+K|3yrz!T`*=e#+hC^$9a*8EmtFs+9HLrwOJTSx9&t3wSs%fdRAmjJyhE@g7_J-ju zjFk{-;N!s1RS0Vf3HY8$VG*8}7@3dKL3`{C6ed|gYX*A4Dr$+Al#XeZk%gvw&pNYg zD=2oi6g$Q74G?LJ*lIcOA#M!NiZD%9IvV6 z`UQFzi8|=vAt8j7GMgfxw(%5%5qSZy0sSE?W!XQC%r=lA1F%ki%|~H>DTsC=)cYZ2 z8u+<}W+)o8FeXf3rOWMXoaYU2%U`roxY5p}R}oB})la?l+GoEnjp)jF0j`yt`Y}Oau0=Kv&)83Othvu~h~*7PThh~+9I(fKy&P)n zJam9+0=OML8#nWNo4nROyT#g#IG|W|>EVx=17$Qpw zz{a`+YE%H4Sg>VU5W1nxIKsVbK8{wNrDz^hM^Bz)FNyEMMp0a`j}lK{e9C~3*Ud5x@Eq`6&L)vkV6B?HE(57W{_VD-$fDa0Kec-avvSrh_mK30gUf>p)Cs^^(g?cPrxc=Amav8nj?$p zN}*a^zxAareBti|XU-dQ3$El!Z`~iRiUJU<|7Sli8jofDtJ7FLkQ>kYQH#m1 zS}!`nQTlXyTOceL?^4`s1x2HEBe&CVn9#e1)OCx7yjN?lYhCjEocMv`IxG&D10Dyg z19wrXWT;}|E^Hc)hB1^II@k~H-?NZ{4!RX0iZQ_cDKy_YL+8IR@Pqw*2@*US5tQXT zAX;!{iBxJMN@^UK04!O?Cqah=u&^9w+5|H{(%96TDJ{&o?#go-y%^Zdi#VAD4C4l* z2t$9Az+&&F=S3n5p9<>H19cZ*{L546D;K z1IPxzK}O!=*5%#oqx<*n$-}U_zb9pYbH*BK4w#iRB-f|K4BG0Z8Y><(SXp_p#qWBUpDgI4Jfd_eZ$G7#c9+lgTJvqT%(JH3{Oq*yeh7N@(Gw|c zzFzrp*<)t>!S_@4fCi6R8w6-SuqW|$=7L};r5b+8o=W(oSHJkh&%dun&wcAk@HaWK zi}&7}e8F4fc6?v+Teoh#Yj1b=w+D4ShG98k8z!ZETAIeF9=6pG@B6@Lh&|^xbBHr` z0YyueKzgPzd(*UCV7Mz2fdqr(02{!`tWw;LxM#`hf$ z$E;sVQRL8h?`&s!nQ`@%5moV=QEI+nUAu7Qdk^zQV@cSARFTiB{?YE!Qmf1(0$6M& zv^Q2j;}$fev&H79FlT@|^QHha^c1um)#axHx)>oTf6?3xZLO*ZY z%vu0CG>k*6sF0Ma%Bqg3#cN_Ds*pw&fB;OEM&)xm_rQ5Ahi+TxY>qESHhjEdlu5`k zP6xZOE^7ROg?fCvq}*oBc*Q~OEnbr>S@x>aT+LgmNvc>;M|MV+H>7Q*m+9tevq5TS_He-?J|s-WrC+p z&VT_3Ax+`DDr;RWtdSZB8ED#p;NSutJ$m@BzxLW|zi?H&0GHWU=bg{D!*7|#J^S?2 zKe4v9_Fv{g5?D=X&j>-jV{yw>y}+Hxn!CIK2FZG-8AWnYo=23fCqQj7$D{0O=3s4a zZ|M)MH9f`!gTrzGxPs7>+bYHQ8n<(*Ha4s+2InFDL;+&ZjBjluXQ3oKD{f$Dm>k%-w=aLBN6+S+m9-}Q+X_L2QXGfkIPoK?sTx@*P6;~5uVSFh&iSr=3VWREOia>BUs^U_@9iAjo>=?v$y*QH-q zTz|Qzm`ffypuAAw(-olZTJ#BR)+v_)4k4$wxAJpBS>4qNKw}Phwu9C&-QXSt6frOw zoIwQ`bIFa|!dT6=84r~p7WV&Di4Y7waGT3XMmC;= zI!XgE0iZ@rYlg|7njf^F5K61#+zKF=(@ZUb&n802OE9G3Fw6<%%Trse^I8*jVEisP#*a&O4F$;06iEM_jt7GWu(lYzCF_A&dzx89Kn0sD2e-)y~MwH zhbt5Eh$LmoTQJ9YcFz~@_0r~^dY7+Ho}4}fGFNU);K#UMjn2)C%pgiL^8EUddBpO4 zjbUy#_7o7Zxm%GlWh5mKAi!9|CCn8H#1mvZ(hMETitxftrqI)G1AakSW$1M6x`o6Z z3A1D1Na}{b=gBmPJp9Sg;~)5)-}#-7vfa{A=_65hN#B4pIA`|!QoprmcZ;yLMJA^vMCHybTn7q&W#p*5`o z$}C=OZ?zJ?4FJlS@*%8W5&K)@%l?xk>Mq%EA5%W0e_qL>zFR!K0 zhY&Xfz!U{zPz@%4bt1gOr==IJO#kL z5j>Ck5k{b%5&C$k_;{L_>Q$tib;ZkF0ifQ3upJZ8%v``t^}gP{oYs^+5sd<1Wv=;- zIZ*`=Kqh1K)Us%$v8GsOJ3CtfNV)<5y$Q1^#FjiR7jaCUYsHc*T;yxlG%K>on|#kZ zUHGw1yu6mBJDj&OFo(&D9rf3Wo3 z4etDgf4kRBz`L9YVQ0X?f#&JTDEP!!pjWG!U}9R#i@mMRqp4JQ-ec!;7gzh2*9-GA=2*FO8FuR<8$DkuP2 z+vlEn`u`aWhJR>Dh^5-s93~itZ**r0Fcvn*Dn`Jwvp@;8&z-ro3EVUTaskiA29Spq z>M41+O1;N6n>EHa-2z}kgPz8kq29HMgUH%!nug$ZrfQlg0Mu|dH@|`x(aee_n7%h~ z9I;WaxsLVF_A*?=zMC9u_og@_g0+M7R#n z9^MS9@O7Cp^s!XLVRirhJZV?LZym^a`+fPt)fk#c|2M62yRa%I|M?bi+tB;fAey|WY+iZ}p_0;*nj_=QntJ0B(90PsQCG7@CB!uY)UgN<9`9$I3pdD`V*A;rrp>fOB&qtJp#|gX&4D zE8=G?&oNZ#vvXsfB`{EU;M}^`I&5uK4<0^D-3r?tymWf=-ga#O1nXIUrAno%k>7om?ggDuDJXue9H~}!U1LL|K0C?_aC@<{o2RSXk!m{ z7icv5VZ%94%|isE)YJq^$1IJ;8jTXv8B`WnStAc)1o=;Mk!*RU_Lm%R+}5GF51W_6 zjm5<~trDD7FEdxFm4_wviXg8ews ztU7y$Radh)S?XmiW-ANT-Ik$txe3vRjd>v$ujq({s{HDjf=6ayV?Bb?=oYA161FS0 zu!nn;6_L80Y2A}m1><6@0;$c+we9pJb73?#S2k1TIqho*xC@|x_8i};lLKE zErE8`wfq?~VIP$no=q)97eFeRCsPXYG>wkhLrhBYhPA781EI}OQ)NW@&&zFXJvsXF z=iKY2wAe&n=PT@a0|VPmgnl_&B&0@)2JnJ4&&k2ybvP;C%ae25eV|S)T9+spe#v&0y8?p#VJdJ>T=!Zr;54A7K@u**8{C#eh;Taox8fuO8-t z5WRl$W_9wUsW-2w1#p@-2vSN~Xw~crM|VBlN(0HR#w)eetcM}Oq;frhgv(g9AKW@! zl{I2pqK#qjag&?Qo^++Av8pY7b$@qP%<#_LyQ19&c!1QT3YVx-1A9Ctajdq_twb%% zly|^fp%*c9EGk_2F~|R4k3J2f>h3-3)8NnGzc6uxB+9oJiozB9MnBp!p5>CjVA{U| zjhaB=57jM&0|_ti4w;6>uuaAD5EArtKwu)oTo9Am$Qri*!C^0&qpb0WTNYpWvx5!P68L%L2MNzzL|-=$evId)|!Ek6ClFT6%!AVqnJy1mi; z`gXYfovZ-(qHW)P=9%9budm%;QzL-9YMaG>aS?mIebbsUA1ZAS>lO&3K=w_vSUvC_{vUGFre9_ecCY(IDw=RzP@%+q3D9A=QUP0Ey|4B}QM z!@*;w=~O51jyd`bL=p}KAJJvUfkH>DIYi<#pYEMY8qaY1ZYFMXBA>-niSicB) zHF-+bB1)VW9pXAXJFE@Y37;_>sS{%N(9zWJ~p(S!o=}hE(t70{Bg{l?0NP`x7Q%gJ-NBLk#u^(v>WZu$_z(@u zyev727n6yVF{$;zcmP1Nws`+|FCXWjj-7F(*T>9r*-t2poMTl@O=rw2a{3uuE(Dad zgtRY6i{;!*HD9R-tQ86c9Zr)skbNaQfKnnWGI{>+m%sewUwbEe0p6(!0P|uEXHS3k zcmK(ajrE_WN*c_BO>Y~yVMYyjuVEsde{XSFPa)g2UH~V@xoMBNlr4pYm?Y0%0*eJI z+orX$v&0Yq%D9WlH-BTfH&P|K?uB}tS1L-R*nX&KuC&6e0NDM!2O&&qT1X@ib1&o>ByPxRoi5?iYP}TTHLMEWb(?d)Fuu72ryZS36r2s+V3S4})uMN-UkJXen z#mB7Kw#K%k@VOvvameN$ON=vk-n6$9_GD*gR~|G=do-oml{ktk#r@)$NXrW8GMkQG zfk^Kz4f^*N-bgDBgqLH9Za)50n2Ir@aGJ0;uNU9ZbW7t%Wu$qR7k%P7N=qYXP5H7i z=y(;S0E8w^M*F6nxK#qQlx6{H&(2awahU*y>B+S+n)JZL5n5KgJ(>b;wpXndhGi{C z@k~`ZJySxSy|m{hlj;BX#V>yT$BF{*M!D4Q{q?q^s%rk+v(NtAcr^UC9i=LZazX{V zlWJ#oS3-xXeqstBn71~?TqdbLeJm?#?l$?+4psk*=$Hd_3yAxkPs z61spzl6mJpT!)RztxMDfCF_g@e_ZnDDKV~x#=;xAYOFp0-Pi#LEdv-Is**RNfdrR2h#`(5d3YW{b| z8W=o6iuf;kurbL>?88ooJ}zXl62DOM8HO#!z4UP(k$DmfAS9#rBpeeH=Id-Db zoL>qhh~*%WUOb}Hyh;SvM*b!nfSV)jeR@z?PhItIb_kz=2Xqck8K_t-`dVB3Xn zBZ(ObKCjM4M{O-5T9qjIIw8uD-U zqV+nj1USXzYR!xqx4U~poR(xn82)8lEm~3T8n^T^d&o5;%owv&xD`F;Gtev)LFyA! zImDn&mci|wF1Gp(hH__5qinE_oH6F;;iX=;d^|aWT7XFhF!l*c3rCoe?E4-1vo_JY z0r->shf=9hzzF*jtjFZx^Xhw3>L3i|fpdjz`MtJxnWKXMEv9|ZiL~E&w(teCxIM8R z8hvwfg$>1o{p4rfGl;bQq+603Z6`zNe2hbxJdJ1Fp>tWXw-kUV{8yv^`pn#u(Et%0 zJlhC=Q;tp9etSWJ)C zNFkY2@lwU8f=OrA`7$dZM8#P8t#eDyWL%s#7X;lkme5M*egil_d_wL`9@URe-dn^q6 zyT7|%JwAHWszBM@GPaZZ3t07SFY_u4Du90|eDD;~L}@`D(+;Dsh0l>Dryd(gF~bwb ze5`w;A@!SkOkiqVf&yUrLE?>Za4mt~Z5XuNKq&4-7tAeQkSuckgQCOr!XqqSltUB; z*ABF&@PgUul8Itv*K?YxKR0+IxNc89N~|`3dDN<(`s62H`SGLxaMwEu4ERn|0C3eX zui3NDKK;|<(fB`!)~#)1147~6LhJTI5V9;&D_M6fIb%X8cE*iRKx6b+6`Knt3X`@L znr@|8aTq@9$n?PsVCqrWpA+=C*xy@$YLo8f%mRbtGjOSUPhRBQ7n)mx_4ZS z-Rz1!~u&7A1n+9y2(XqcfDOJd)^%=xfCv{#qfuiBo2$qC$ddYYRF5dxFa+*c%Kg|Lr8 z#`p4hYbOPFjF-&ZuYj>OJv@i92d+GwIajc~v!Y5?Q!$Q;k|8%fN$1q`wnM0NxR{gW zpKnQc8;J2tiWUM?^(PVv-D_%y{+uOM*?;u^%S%JlYwLPNemxBsE&OoZ=DfFXPCMgWClIBPt6Cz2N_d!>VKV zoL{r&p&zBOy(pE&rtq4zA?A~MwY>6~&wTn1Cc!V3+Q)<5uHRi|&%NE|hN}jtJHGwg zv#$(?gBNrEcq(P#;*#L0<#t6FS~>_DAZfX75XjYPLR_0ijbAKZTp@zwnnE)LXy*!m zF$^zHnOf0$f9u5jvoOqQD$7Qc+>xnobvG=)JX`^ghrnb|^9gZ1G2#$&wQ5~M&0W>p zI!xW#mCh6&2DIb#x|iOO-`02oTv+)}R-LR7??bgFwbU&MKe^=2+lFys?MX(ZfoGur zaA^DD(LSE8FzqS@2nXn8nH=r+trEmeKJX>nLZOxQO-uQtNr9nA1%h2R#x|B5 zOfX9*OSWZGkYcmt3Z^8Ic#Mrw_NZq@o<%d$(>=X+-zE7y@B4h;d(Qvd?$%68Gt;?$ zkf-l|Ip;gy@~+SOyk!ouoQd}%bQ>&^{CH#rW^kirSkrnOE%Ru}$%#YQvY`%!YHCAW z`A&p4t9R}Fgdik^#he)fz}{#Pk#_y0X{AJJhVjy0t5pY6!O=Y9N!o?T2KPe&;DI(T zG%+Vi%aj(-&9Erma)fwej%~QKc`6geUPSrhu~YgN6(%&P>J5UpMymoKC6N^|W+gqKC|! zY+8dLPzlXO>))&6uv+sd!fISySrdqfR}h~-R18hN2YF3XjwnO@;brLEd+Pfl z&e_^(C0}gtT4`V<#`pT+2oJA;z^u#CGRD*8nx|hlEzn@PTl&39m$t8|@sJw-tYM{R zOV=76#M4M2<7ZlxmyAOfUYbni#4s?eG&B0C{}FJ+tS(8{)Ej0-C;&tFRwym(frFVC43JI{7Bn=RFK_4lUb zTQT?D@a_MO=m!Sy-FMw3`e7n6!bW)g(;zn~5?-CKEZdaV^~!+Y`ybcUHzg?JI~L8D zo@?8bhpxy-Xl#zcVXS9O`ngfVAwPQ<*)h0Lw>qK=0Lm(1Q0dcwV#BcD8K>M2b=_Rv zS$mXtUPm&G`@R#J8Fog_3@mg@eu|p(Ut^j5>dceS+}}~ zp#T6N07*naR9h2>G7OFwb&DpHzguKCdo3Ura0p>0Wgn9&MKAEZt5>i5=Z`)1*!P1! zPUo^t$BmBTtNQaBOOsdi@D~Qx41k9oc;HWNZEgNFd+)Xm+0b+0&4@OI7m2_ik47le zO(;-eJ8TH+>jXeWJKZP)>>i`7Qg@sR^t?fZ+yjLho=!6d;veZk)b~Ret_*7eLB%-v zt-Z$%7Nf?tmo0L?00G9;9KmoYPHyfzEFpCHE<#E9va49)!K&2^7s<;Inr4;@2E44T z&0JwK0PN{!S(T#}C?I}E&O3gaW6bYKp=b0%bf|=9MRPiiz#&-qE<&RoY71rooDyir zsQI@_*U}K<*@7EjTkkn{Dld1&5Ev;}lLv()?%J$)dE~FfLr=#?!kaYbS>Moi)hmGZ z&!xsawpS1To7luX)7@<^g98f(pr>rI@l!QqiV-NrxRvFBCQ#G7bGtUk^vz9qW7AL}ae9!RzT zKqdm5hzI8!kZOx4)CgG4TI{(r0I~{(eec}Ayy=zf#(71oL0kJC9l(j-Oc z0j0657SL%p2`iITMRqR2AdG$qjuaVys-QY~;zN9=l)+O-_5O-Y;HGC@8}B`?DN5xfz_!;u`skyN zzUy|x0o-l|fb;*mU-G60e{yAY?e|3v-pVZwl2F5$7Zu?I9%)jW9s(G+vXZ53p-dst zAtZE(QkZ=4KEmPnv11bI2q`0oMZXJjIS;)LN$3gaK@SB9N4cKmNr?Z+%lZ36=Vo*< zz+%)#Ux9@V3;I|Z85lBwQ!wLN2u|K#7f6l>f;*pu1nWj^gb33ko(QErvL$t<6SLg; z=o)7o*i4$4-DQ9vyyPgrIX-_K%++9^Lun!mST_!P2UN!MoIH6#^L+aG&hcJ_9mUc|g9<8Au9b#9>%*OQ+$oYA(gXGu zn?g)uazUGyy@rRv9FPYUJ?%_{g0Ew|AsnZky}h6wYf3)!s=&Mj?8)x!X@4_^=gwbH zR0yvSg@f`vdhD1CxM;BAXir?k`=Otg@zX8tmD2d9gs(R?f>zm$hpZThB#{^9-oo9O z**(Y3`0hA)Qrz(3g3stq8->1CN@*uP9eaq7G-n^CIuuoZF4x^m(ry@-tI@oP9v$r6 zsbO2s4|CwXItC>!?gY2d2IMzRO@Y;j^X^vIT=R8zzb*{yOBa*Ucx*V^kSacM+*HOw zc+-)>y4X4ucHtM!1ow$_#Aa|C?CuVylL^ueLCtvh%%P;g8G+Kr0Obtx8T0JlaV?Cx z*S+p;fj$AK$|+!cd%G&xRRr@iYeOn6QjHRwDxO9D#$th$Zp>QzJ3}yn&-g zj@a$)?!NHoqrdi+VHgyhR+d6>e@$STU^Z%z8TJ&=P3#JTfQmBT( zEnsU2VSGQlZIcLrl(i5tC32KAMVGv}m!lBk+g_^Pd2|GeMjX*Z2_uA3K9^n+N)^H# zppQ$waxR+wDY%I0q1gMT=lQgGQ&sw`7tiRjEj)+d_@2}==i}AfKEfN%BRZ{J+n>*$ z*;!r^5s%713ya-U=<_%CFz}K^We!@`z+{5tdKf+^8}T`0J~otT40h_tu|_Bdgdq7- z--~PWo?4wcx>5`Zr;Tda(`cxy%tGcvl~ zJq+U*v&o=>hI@Vw>N&HmH1{#VlOt8^K@^J(0KUtdi@I5Deo5&yKYn(fd)~oS?C!-} zI$G7|bZj{Ua4^B0X;giK_PceE#JA}}vmpWVM9?9QBF)YN?j)?;I9GZgmrc19dc z2o>|lZ@oXsW*l3_;&XeF+2^sFQDWe?Y zCNU>`#`!vb{@m9-`skydxZTnKx0?Z={Qv7;|N7s2{OFNSwYHVzDI?51a(G+rSJeTH zt}`fTQ3Rc-jMAW}-*$r)D<#!OXDBLe&~G~aGlfBxRawEg#j2H}!)1=z2LFFyc(a#P z?(5%F17&=`V@wBB~MSa-vZ(0K_#B+~)?Aj69j*XE-I>&P^z#ctC zy|06l_7PF&-oBm>d_#Ir5JZWFS&VLDT3zN|;KM}VTe<0+2^X`ZIc>&H0m}ubw0DUN zM#BgxtI>_30nr4B@;HJSaqMpjlHqnN7&e-hiR`EHTyL*&aI{#VzNN5qFn0d?T zl8MkYiQ1?$C|w@4KNC=`>W=^r=alP=(6@p$b~s-(|5?>_;^fI_2YilbRhneEe=Wn? zJYy7)ZcQ!-MJp~}`jemj^rydvAWz}|Zi{Mw+sOdH`^Nyd_M5)^%RjiewfRFYoKBQy z0ZuiKICl;c;7x0EGlI-uu^uLmI(9Y#2MKTr(SfQ++CiG}T0%gE0vHGR>oOtgfS3`7*8za;M0-c@+ zLeai(T7q#5O!F@nYksBVRG!$&w-^^;(-2^5q1X%Q&)m2zShy349VLLVq1-;<@rh#M z?_jux#6bge1)XJd3vtR5Z{03Y%IVLiB4@2xzbQ~w zDqdLOD9fWvQ)#A5uyRd-Ht#lQv-gBRW?=9Ub!0B15+f;o-J4|ru%{<#06w2P){qJa zb@`Lw+&h@qqo)BA^9ws`@O|tIcinZjzR#ZAPwCmvMg~WD?6%Sx!ns_&{I@>yna})@ zGyqWkH)c-T@4&x`-oKp;0F*x}_S)ON^h>{gZDZ{}y+FvWM(CEpJH$f+^c5^oSbKO{ z5u&rlt;3uPDoGs%YjyCvni+yKc;1@e(GWt1T2Qvk_1C}!9XcP zniAz=2tbg}y5S~Y%`{SdVLkm&)aQ>k61kreHb;UAcX`r>+g9|c9!q0X;UV=)d4 zV1TH-Iac%s2=g|^( z9Pl$x*7I!R!VxI$%S>bR+JL|SaLAr9x@Uw!`@6eR{`?N(7&*xEaDCk)afqGczcX|y z5`gT>HtMSSC~{&v_Bat{9<7`XB0K}wtm>7j6k-Lf{Q0+{n&85Sf@G=k_Rh{DpLz7r zui|*;HnSkU+2j4H{NC+i0Pq|b0FrTE`Xz7q7sKA}SBDaD*gL9Wukt?tlG;kiYVm+^~tQ0#bJ+*eFgMK~j1UE&k}UXiEdmc$t~ZZh5BD|z=R z==~mtkkBu}1a`w-R;E$TZa^X(JS(L$fCC9jKmYvc2!ADa!SujbV3T7-IZ`t}^*s4b z2&gp)%y!uKIR=`N1Xcz@7~vRSc0Q7ZPWn!3R~t-&%IzK{w|hmxkmu(+0`(>^eKMxs@q#;C zdOgp(MMU<=mrs?{>hg*rB{f8QJ?W%9JiC8#CaqaZNZMg%D~}qkX1(yl?PaR6ql9DI znQDV7QKgn&PQhK~-*Yzgym_BU5w8omS7+N>!|(|mI9)?gj5(%2)o+MF6AzZgKHf)l z-Z)333&5!0eS*MuDyYo^Et^jsA9l8PhfAd2@*csxkxheIDxjwn;2FWl?aF=-c#S9a7!HCSG%bLj>R z$u2ZN<@hwrD0Z%%07neNmKGZ4!kVL?IW|tlMnyh^2!Hm$Wn~OxG!OM`B*1X{sVATO zlFOGbKb|-Ma!ret#H&)x??0&9$p8Spy?yA=p?mMU_ugNHt+RLZ>k80Z=7I7(DvLOJ zXU_wU6k;kne7rHDrkn669Naae7s7~6e9=t9O?SpJtxvz{a%-RTs{F0MRYEubwuxM4 zJXr}ywtV_Zf?4|alp0uFm5~rYs3;}0a1wwCzVtObpFkA{1ubZ1*HZUA@7yi_wYOg@ z8?3wtjYpmGh4wvFN@U3t#txAU=g8ZfXI|Nc&fID9eGz6A$b-j*v8R+mcBtdJcp`W| zY70H1Fq^lO1|aj*ysiSqi;!$YHKLC|L?A{$r`?`y8ToB7cw z!5W6+055mI1zb>VK3?DHGZ9ionaeJ&6IvvJOJ((p`F_I+z?qT9iF>J2Uq*U(oAqao zxu>f(oR^Olr^e(YkzFwrUou8#u017`DM(^3kHqJb^QIXxjQ4E6{w%d=g_Ur zNqMS;vH2_jR9?9}Tu$(*&#C2!Dy%T}jvtRwPJt+!y3IysdjbiwHW*C--h&kAsD8^i zKCcv8a1GSob05HuI6jVKw6jn)ciZOGQpv^j9DoN@acnsA*V8g<_&AwGgta>k1`H1c^T5P&KXN;$-c>jyMBtydBSWy3^Ujc`mR}bBW zA%nmUP)qHI)_W9iZq_#lL1ve%OVKl6PFZ@+Tzky?OxwXu@f76y`JQ z&<_Rc+TZ30Cm_o6fr4gijIl*f63_-94bajh7}`>3Ar!^_mifcE1E4t0OdopR(@I>C zi3Fi>Z*^~+5i)HR6MR&e5$6m6fxxmE(9~dX^rPP=NNlwCl(vb8lAB(gJAXdtf!EeW zHng9iTgS0@k3pWXz+H**=KHLB0Ogj3rR<&u@eFfJ#Oo536!0rhLO1c+KS&=!FqC0mJ1cP|Ak2Ze0v*Oka_*=fxgDjtFF#{Ua*& z#`%^=3mn#bC?aA~q7=*_Ll5cMFP=Xyo?S-8e6f%DJ$nJ;VMGR$)=H#m!y&RmBFg5X z;B%wQ9kmwvr>_JRN?^N;rwT5FSc8zw7ytXue)h9}9=jtk0Izu*!0luJpz*Fg@W31X z=;r$74@AB(!c$%7l~CfOUfWh{Adw+R2_hB0*zlqbPX7Ic!rsU3E-qaHzBIE?>GL#Y=57<5#&DyaVi`n^?!$O*!+Xq6k@y5oAuezPVqj z=QNI>r9hogV!`@%x4?OnrUnDuxRiFZMx#F_&5>I9q|q|dJz5N2@5>njAog`H!F0N3 zWGQ5-i~Sr;rncoJSMEVlMx+H$OjHj6o+ZjdbkOHVrMG@vH?X|;A#2Y)RL_3)>~Q7M zm8gAda>Mp?miCr2!Mtl+sq7gS&2-q)O6{fLtddo7`^DQAsMnP=842N>vd2XQk{Lx?k^(Vf)7y!L)@n#RttL%HXivd9X9|PdZLk~Rgm$$Yy z|15_w2qNhD9A#>iAKM$1O=iGK0DwZ6fB^%L0fKb-pNeDbcLyHdx5kqwDP} zh$=#=`%HNXptj-4rtLyBLX7?!4`LSuIztcJgPJott_-0m*%A?k1{HzedD-8Th|)Ea z4!Naogw+BRr037(BL)@mIm+C?FdGh(ZUqBZgjKuOmxfN}nz;^ZgLkL4rYXGerWiY6 zNxl>8YH=ZXt8jfggnfg9DAOy;z!Wl_r2DJ{CHRQ|?KoT=0%bV?WIRu_kd7uX;n~N& zL|_qC1xLXkG59bNxE6|HF6!bvs(qHvP{D%Ci@&424`A_9-6gZ#I-u_$_K}qDJDvvbunP-(@6Ga)56^?TL z)fNz#I9W@5E2j}0jk%ukXZ(}_iwFoNSmZrXhz<(;xkny(1_00C z3V`i5J@~-i-`d)G4?>qkHwa8M=}G^}VdapDl67fGz@9j`D3mB0;iXXK;ls*JA*ieJ zo(ku&cWHW1C`yBrhTqQ`_7l&;MnYu8ERTZ06y}mQ;F6ijTq#pvmAzFk`#1NIo z4q&Q81=wqp$`KuL+C;hH5jVi%f@z;QI*>+EjllTdF1^B=V}C~ob&(UlKKpeY&+t+iAlL=~t=%ZebC&x;TN@b&7UautB@qUW;Qn40~+Rqzd?Ko@G>{9H_rGc_Ho{R9c4erspX2~JB zc#MylPw)Bh_yy+$h1YNbO2dJj+0uSCjX0?gfrWDqxQUk29AOBwN1pZCn=#Nxe-3ww z=j;ktd!CHbxf7Gz-3imUvlBv8P?b%sQo`oP7z1PZednEbN^g)Z%L!>%iuLuiCx77= ze&OxIFhqlbZU|gYguJRhyIl+bOnya3-~7-+|9o|A<+lWXb?iWeU=y^}6jY@K&68Eb zl|Ibmug*K9Tm)$J42ayb-Aqvi16sLoKBzg@HYC8ppy-_8{La82u})EjcR7epxd}NO$Jh~%QGOa zmXLCC;QO~~6`fnC&2_tHo$*CpedqQo$AR~Tm34^~jjqZ#;1nP&5@mVGmKb_i-ktOK zeF~g<3H*u2&F4JdbgmZmi%E+D@uM<1D{ntL?~~tNU#I;rq)$nFl?wRy(c?ee5MkDROKX3@dP(01Ui#P0uU<>)viSAwH-3Z2DN^ELm;_OiKgpJ^SqE-umK;FFxv~ zbFcOGz_)_|fLjwWzhSuJ&2M_>->ob!pJ<5M^wQWo4n=$aRTS-123km?%mB=FkV$+~ z;ImB@P% z@e|A~EXtPWk|(~P{`>DGbfBeOiCWz-p7z%gO=x7#0>Zy|Tp=*x@R+){Dt440^BXz9 zJt4=#Q0Rm9%6N{WuM$?w8p<3)YM=BuR zBg~Dbghzz&CS>?(c%vckgRKs)k-x=8mvheFQH^m}p+>4m6uM6XfX@+b!l6tC?XpdQ z+HBNbM}bFa+NQ$d7p&~l_);tEB-PpP5&|R&lo;eq(@^#FcP7Jexn`7$C0-%ZDq$ey zIxg(1P{2GJnk_AM~HpG#) zj?_)}Wa!5Lf#saD}pdc#CWstR`Jnqs?6IQ5Uuw6di=sy^*e@{T_#OV{JV{)EA=kr-kk# zAveALNEoLAi@w|IQgC9^%Ij1k0AYOc`0*$?gq==Y3DGBjF!71wru~Ig%I9HNLAw}g1Pe~YxlBx{~A8igib4_3po%+X{{s+Y>Y z*{2vjq(Qg`A@=s241v2*R&Z5JpCqY=6?%@2e(Z}o?l`IOzVJen?Z!At8{V=OdW2*p zczdWH&;MCP+szym3LcRo01c&|;I#1O!qW}%nYkce zWRi0q>X1N~!=VW4I|LYBDF3aXv5~6G*=`=?PSAlW6qyQE<0}S$!icnC<$%Mymkfs5 z%#GxzTg3|+L1lgG5&{?(j*Q4MHg%~1bEyy@3*m(#V@`s-Fc`8BrYLfO$`V-TrYv>t z__uSYT+2j2c*;|-pxOMmKDk8%5Q3lZVU!3)TUC1<{8v300MsRG;DQdxH3`FD98hVy zG@0k9nFobU=d|#omWM;+d$)u8d=yQXZ1KjLmW+3NEcP%(0LJ8vN@9 z=I76uu9VW*z`zPvoBI`C7dzY}(&g_eTD6iTU&J#3)W(HwwkaP+2fD(!yK_g9A7-TMnlQ zHkuNxR_3EoFx%IHEs?u$R@}iZD2@A1jXvj1<{)b2<3)suy})mbj5mfr)i?=Yon6t~ zpJJuUeQwrIv*y)AyTbSxr3wO_H4zgjl94T%bzYJLD$+v+2EqgyZF%wb4N??iAp5u~ z{}hBxQf31%;U1D3LFr87i+U(r%v8)_(HpB|dI`F6qFz)11b;?7m)^=;C+2rusetGM zfjo?J%3PYLsnP@2`Q*yTEuK62oa}cJV&5U}41naDPMz@k%a;NulEVJ+`zT{%cRWk8jy>p@Q{^tTL!9zvHVxDiyP5%Gu@ z9);Kti$@az2DY}tGH?(;kg1R({oJ$9$Mja~-cw?)Af$O)hkZ_Xgy)ObtT6KmO=BQ5 zxe`6+mEKtq>l?=1g-bQ}IKBmAVjeAceBWv?jK(s1+UlEzEbjjVqfe?uR6gK})a@$| zYQm^}PC9dd;AajfpH!E;vNksAyf%*F#5o8rF1n?iAMr(aZV}Ql3?|FdK%iyq>V4h0 zjxe}DyQ|SBVt0UAI5_v4ft6#~JOtl-wg`3vB@GOF?H(6i{jLm_>B!=()_Xo9HI({N zf{XXAPKO0O58j1+z_c-cfM>mD>6?M^difHF`P@I*9ny@K`x$9EL+g=F3#SGUWi-(W zGA!%7QM+nZmMcdomReL?tLM!h(d{ zcvY-HYkyj8h}>&cQ447+B>xfRc~v(&3MGF9#AqT+6fO^lue*b>0_3@uRtN{(LWJPS;k4=Mrh0 z5_K`aF$w!hhBP4+DVpV_6$!r(22sw%JYBqu!55wT3N|=ymGCb+CalkfTSO<(5PJZS z6gBxWCQ~r8uM}ZfSsl)u>y2cXLxeKSlhMQ8FJl&}c`^>qcllVNJ(CU1^KpHY#yK@z znXiAI%NsbFqCJ%z`Re86T`ok&;v3idtS7hgYGa(==n2?c%n=NZ7@zeF@AdGt{RzT>vAc<<@YG3SNyj%9xwOepR6s;gRvMDKR|R5 zgN1wJtl(I*bx58KV|KXDD1|wi>OMC*eYRf8cfw!@S#s^#wV!$HvB%z>AEW$V)0Duk z^$36*w*23v2k*cCdp9;W{Qw z1p?lpce;KvZK5;rFk&mkW+Lw&z2v8Rs4Il761tEJk=9?wPn^(w5t=ABKriOa9_4tO z7aidj-t8URD4l_ae=r@bR`n-Ut@FHQI_c0a51E#+3!9lt+5| zituDEoAip>$!&)@?UTS~O1ou< zI>O*heWXemQ+kgKfNba^jE2@Eup{gMH_;O9bAlZO^i&g?FxG?+&pk@t46Z@`IzYV< z1v7{+1jP8^!_nR^AGJ79u_n>Hr!^OfJ7m|$z&V+vk$pId-Y6Vj4aQzdXs=)Mm&Sup z{naL)di%}yPi3wB)xdaBg4vliV{VmtNt*Eh{CU>npI+mxuwzjeqtde({ZNHWg8PI4 z0AnI{%54D!k@x0f!00g6KzAF>L!Ik*T45+ADH)#ubcf~1_V)HCAA9VvcMQW|USl@L zYqmA;?PLIKKlIQ;|Lgkd>bC}>b!oWc&O4=G@rF@!2;mA~8g2B+`BRHva?hm;S}QwA zZyKdSnT=|1DgQeUUqBIBr5&%7X9?F?EVE%zbnv#@l6Kg=v-ORYe@LwmbljWp7l#L- zDP=Ya4B9@KUup};IXPY5WmU9Z&k0JIf9<|#TVh>55v@o!aoVaXhyr;Xanu@xgDF7!}6Ycpf;0TjtoQfXQltzMl zXN|1M+W1_XYyW1atQn)pYT5v>DihrikWT>3!UG^#GdXKb!HVWOh_NvG)z3j`$WE4K z8Pkk&d+nBKY3#EG{Eu^H3{@CGUC$#!wMR$Zbuyd4-$A+x-iCCnd~eGWC&oy%AQRpC zxu1^lOyU%9ri@*hn!vGNI@Nka&HyaO`UYMJx^RPWR0PMtdS?+?R3i3V3X zFaU0LBYy$D=Mq5vyY{As9{j1*mDR5kdy`uH4#N)hpLn^+;^+MQR7p<9CM55K+dpmT z{?(-bP=;KR&--;Y1rADr?9s7GABHY{FjxS^WsVb^TRJF|5Oxly$M}wF&2a) z5Y_TpV=D8UN*(6s5-=H_)f}dW6zJR@mC} zTs^bkEQeu3B!Ib8q(UBSDEZX&s{7|}<{%7ZqHUX!)&}h|cGin$3s%oCEL@JMwHAp} z?&_@SX_1l9{+U$8RBTF_mPkj%o~&d}*PXek5>Mj}W87&i5g(;-fI=4*M*IC1jW@;v-$O~O@ekcriKs5SQ)e~}%B6}i zMKnVIy)=R+;DQl0KoNl4&;}LH9b=-01|+&fw>k|vH>)eE2(yt9C5tPG0SitA19{sC ziU`o_xATI%z`f?IRjehoPBL2B@nGo5!1V!~=dbT@rfCVd1=c#!D7C;X`s9^)g@KYKfsJdX&jR}dPlQgb*PtnkUk;>X2vz|N6$6*iCBkg0t-T)%NXYyM7?xzqBM`1 zdD8@^0%DCiZnt)`*{Wgd0*5jFAHX;aOyJahI;GXRbskB)QTWb9E==|QIX>a`$T z3WF~UYDz8ci%mndokXV5t?ZMA^9`4)*_fCPurfmU>F#$xkGU5M%bz}yuc4Rl}l7spv}_t z6t+zq0tntB%4(vxKIh$VuJ6V7PM<#gTh5+6`$*!?Uel$3Fa5;6bS-)-f9VoHu6gI% z-~JV!T3TAV_cEd4%wytJnlcu}N7pAdPM}ru0PXIMsAcCpy!fs*ZwVhYU|vo5m02Z! zM>+v3Jy7K#wB*yZ&EAE*ImD+4#PNm<*Jz{=Co8FpcmAjzXivVB?&_+_?E>|BFCouMKa%MPu1~5!V9^W_hf*686nP)@ zym2XuyO~pxIE^}&bx-q57@aQL6i`bHbnx^Okx25FRDPR>wq*EVICni1YZ#m@(d32w zV&K`0hk5fNW>M(&-?lKg4c$}<@@k`1YdcS3@XP2yTp|81W5*DXhnn31z25QcJ4Z z$)-G(N&bl$9#Pcc{J5K4$OF!Wqk@qm4;p95C&|rH838%hv15@sJ9{>av;2Q9K@JyX zZ#Z%MgbW4I49gyi5^42NSqf@lz6ZdQUz~dp&W$j1ZF~iODxRb&f3H2jON^&8XI>C4 zBGQ5h2+av_w8QIKr;>ZAd^m0_!?)jOI_Zm&$VU0aix=PV%rnpYi^QH00jP-H8y|^R z(Kl}XbiRrPU54TcfW6Jl&3oSR<~RNF((=;bE0>}f44Yf|GSxWq-ga`u?~FVcg`d|< zQ~_(&xb}OBGLCR~sE*j!lW8pGw}C_mT~Y+gy#bXfZ#Udx{fdW4TAthlS!G98R3$qHpURoXQ0r6@{cJ<=RRhn*7I6u zM$VR+PRN@96`ZkW7p-e3qd1f`g$}_>gduTNG)eWRb z2+sWlNMqugqI6Sv%j-^-$!5%^Cr+I`w`X7RY>YSdR~#)H0P(CVtMTO^F8)G`$VK#CT2=U;Mj2t zfTiJu(`Q-`PmP+0YN@{orGC-Am$Qix!S$F2cSnuA6vhaVN#+}F0H>~lrIQnoeV?ZV!i->f#SFI~Fy?x&u5>L;`M z%n^X=`7SqF)>rKF+r|Jmy0P)l-S^%5%gam4%Tpy1!eGvebAB*#MtBZlzG?=*czOhc z6TYCgx{SKqPG72jmXN--e$xGthQLBsuX7GshTr%);W-2$G`KE%@vhJ)awwcOfdHYGDPoDQ$smn)^4-TN7=mBqw1MWJ}@f z1n7B~hVi);g{Xl5`Y;U=fWs(PlfrD*Y}F2 z-pYgdMo_l3DN1_I6Swh04LRuli`kx6DG!<`T@6yDQE1s_UPcdOB#frx=8tXloTtjd zb2FNQ3F8`6tayktwTVc;+`Y?tGarvq55-uHa}gjgp5JA3N*fi6L6p&J>)GWoyu`lj zA$O(34;|88G9XQL{(8vX1j#8u*OL2SIRbFz>{%&^ZrsT~1Q;fZKw zhH*oa)Qk7N=bI2UYfc0pL`Qn1*HHtS5388T9Cw7fAoX$tT-5`%Bldq9>**jMZ+K4D zHRjq;$T+u=1K(512iZv4$JmiO?zmG6@ci@7B_}{(UWF8hh{F1Y2%ubQ8SBtP?Grqp z?zz4hPLj(%MLtyejEv-Ai^%0!ZNe#OgxA(&?6DVu+alxum0!Z*m{_biNhxvcK+PE6 zHbgI7y7ay$pM3I1lMeX60JzS+{X%}k$~ywE^Ts#6@hguU-ueYL57sQ9wFn1C#xEs7 z3FD^wD)e@=GF@6;(V?#4T0BEBXXWXOO%NeQhjgv5L7nqC8*ci-Pe;kwJ5XNEojn`a3(B0yPxZb1?y zOHn#nUsKt`9Fu>KkSBuJv%8N*xWTEjQBnbfQzhjSW5Z4n8W%Eoa2!#1Va3loY&0Iz8RyS)T7uxbs zIwbiK*jpySiBu1Gik%*zXj=>qJ4nj{)gG;0j+7Wv5fvrn%!@fSY$EzL2W?rCqxk z0NZbR)0@8j@S&}La_Q2AVQcHK6s_`B)k} zg~ve%6M+$>JbP+!x}O(2H44OEzDX{VlB7j0eS{kk7)mbXb?<}Qh+OH4zRNYq3p*;I zS;!81+~2KyZ?uK2w5xLWbM1EstC!1~Kvn~5cNEt8L(EvYlyLFx^{wBTBjDtKE zeTXA#BvND!DO2)y{(Kq$o64=@wO-pXXfw|sc9SH@k<-`spGNSQ2MLn_n3t1+U^($TiX3j%s!wv~nh8b@b>F z-JdguK?I-_rc-b+8dnA(+!V->H5&#pBJ)dLGmLVsL%!XW2R+0ezv%zB8}rCjuEF`D zZ8pe$A`a7Y-F{uzxbEUXCku9xws!P^2HqRyTCGxS5Xm!FaZ9$C!ToX zyM|$)+yrm$zySC>Wzenox(xtav1_k?{p-K^@S&}LIPx@{L&|Uwi^oA?!6P~l3rf36 zHkuD}6)@VIP2qtoq)0;FBOtot;^z{xB)3_SJ+_eY&i z$62May=Zyr*CGcz+R&|$NZsUdXF8~1X=8-=h1V}*B{2%|evhI!uZ& zBj=J(ZGbT^YfZplK>I2Wl5pMzhj-yU~Xg0 z^_e4tEzc8;l{Sa7XV0{IvFDgKp_!)yRG;Sw3ng>3vEhZswi7L9lh+?1UfV6RR@BK8 zF(P#CaC5(PRlM=8ds-+hC0=^i|4=+jSpgAe(j{)=JsYCCy*Juc`B_<@_Px?{$w~^t z`Q(W^G{02nU|=!F{Ci5u6i!537z3Q}Hu?Jz{%6LDyODQQpN(rd0?2vg@9;))b;;8;$!R&bKQvj4x^x8Yw?C zDS0#B!6dNucFV;Ik?reS**!94?cj$1uH|3G`Fc9(_ zR)vMkFoy-5*Hw;EAezfrgB##O-VYWrc<}>_)eiGMIi@*pcWQ}xV~$;($o<(Uami7H z`65-&UKtJ-{cDR5^!+QrlQrqScgy2a7AJ2g8kvkr^zxb97oK#A3?kz%Sg^!ebRr$* z1|ZkcaQcPFM+QJK%g+>jfz%_zgiFiAQNVrM*A$u$;2n%`7VU$)jR5M6eZY~gF-bzI zkqqegY*~tOQbU`SU=8HAt{l;vltwlJE|t75&%k`~9Bx)Zbcm3tORpsO{7m*(^Sa`( zDDA72*4kKC$dbIO1))-1tE;Lwu#%eiEc?o(9!l@I-{@9H>g-Z9S=yl_ZnY>ThnXX9 zP3nSikv~_kGLb=Cdb|R~29laz2i_f(FN@4Xj*-E2`XCcmE3+xe$AYG&H zYgElxRFo&9Zf1&<$(jL-AZi*^MoC1(-S1pSA6h?1n^10?6%1SUO6Q92_=3{Rq~ANTNnp31tSk@dX*at3&oC<2V87^BQd(1`Cw6Qd~z z(9kK_R$=UieDO1OT!LeNY9S7P!p_ccFdRF2Yyf%e9_CTDxjkIIN{6-DTOA{dbV`tR)H!Mbpgi-!ip}i&k@1zE zhp>xKt4pjD0V2Oj^+W*#y7xQW0g<;{SKYLc;ut*`PAe;+bQyc!t6}({aIM&1JR4qS z6=+ihJ2e;;MG`;!=kJizNLSteT$6Ld^Mak|0<;^!3eR6hn#4z?buS+7=BDVdnGc@x z%$eRM7Z4tboi@Hwl*7_+3^vE5rBPZ)X*$YTp{h=U++bKzH#W{yl7{hG(ii=CV_#{6 z>Vx1{{ENtt4C1R-_Ti+MJopXgA+FE;?QL>y@4WM_;hxvMPS1=H7ILJoV|8fq3N!y{ z?s%TpUG>!& zKy*iju7I*;Xk_g|MzH>>0)Q)n^1Zgn;*8b3Y&o=_;bgG&6hBiA)CkMvdvOoWX5{}d zuEOw{iuAD&(XXninrqj7^fRCN%m+&qz<~i!WbGI0pN;^?0J#7DH+;v|)}gW7B-G z_S_fkK2CXj(Qfz(-Dp2SJNN#6-|fn4{17!{{IVV|BQr1S8j~OMES$Y(pM7@tm4El| zhJW_Y|Hbf6{>lF?vK)-w5E2t3uKsCZG1B*A_QzuUx z1E#0l?49>WXN)TvoLvdPucMH=doogRRGj-qjAGCm`0V`@k;uSo`4!;M?SF9U)Tuur z7O7#t<2*0`Zsp;)$!nPf5Ch=S8{Y7SKYRGl)?bW+WfX8K_;SIy5WBs17CS&~K522v zs%JFk{kO~S6B(Eas2dvqV=G}lhoTBZHasP65Z|;4f@vd|sXS>sAz^(JL2$DgrAD^4 zvYxr}@6&#BRR#dz@(BIeUG`kn@f#-*C6Ld2?sJL)yyG4382->7{EvpO`I@hpji}t@ z9ys{g!3^9sGw|%Q&kcX^Fa4$AAN+6sPXCg-Dl5>oSr;d*Q83DNwP6UZaEP_Hf4? zC*_=-b~Lq&RWXT74Z)Rw;Q{D1f(KEitP;od-nc9xUUUr%8gW(CWE*AJHN^yYIa_*5 z(FfKAkfT$+ju7EpVFuu;|H9VxMZ|cexKr|Id8qcMfm7|Ba&| z-!gCQResW6o6iwmpJ$4{SZl0J9GUI zE1aIV6n;mJ9#0(ELiK^mp4~qL<sxr|ptj;fpd%-?IeO=;-&;Zy3Cy7 z#Pe6PH5F|K=?`N?ftzQA=VXk>k0niWq4?z<$WZPbwA&*yXl(eTjE^WI*p6T+WDU6Q zvx@UXs<^gbX2oq!kNGW=8b3gtL_Ap9U2(`^MK9A`p^v#Q~nVV@SueuySlSYP- z;V$x|s@D}wXMk6Nd?yZClogJ1Xp2I|+=cOpSj$%8u+%!*{URjstMEoTPk*i5&S*)^ zS;|1#89w*yv%}lI>}|vM{I$O}e9hN=v2OjwDjg9sHq7#Z_+t92lhvAPyR7R+ zmOgU+bU6bo7Pa9wTF&};_u{)oo)^bqsHa7psRGgfQKLNuMfT)LptT8We#^Ih%kVdU z=m%O}|3L8{sJ(+3*ypSjBjCUM&ObZ+*x&uT!<~2DX%K!WK?udDI#Mg-J+%V{WDIz) zOPPqm@i`s(1Y$mWrjbq|J9tm!ZW&DAyMgHOZ|fMduZQdEv%GK==`6-U3+K~ofC{Ko z?01|zsWBl-)1}bgc=m+-8IKqeGu%#viMtRwg;7(o%`urwXE=V8=#DF(A_V}a#-=zG z%)Ma82ZqGP(wM+VGe4ScdS_?nU!OX4>YGpz83i~n0A7IuT~h#89(dy$zi(r6^F!kr z-U#bNh&_NXLayh_jDEqU7cX0fHVn8PL>5y6KmeB@g$U0*BMCyK8h}R#e=S(EK*dMH znN@|=c(bcJC%%NU_bHCYgcQ~!o#D{E5)QYluy4T|H@QU1mO`xD>sCx*ZHU4J1C`*e)2z@|C4<-rWR+GoI#0IH6@ z{u_RmxGAW@XvTFbMUI{aR8vI%ddRJMX$Vho+h=_FOUX? zA_Q(AIs~eF=e1}N+$$8iyA4ML4_GhRZ4uhhTji zhx@&*9s!YAM{IkfAW{YV4^T3)vynLwolWkA$^HUS7-eV$D% zP=qk=En1}UJ8r?@M2S=OB98108rT3zSyBzIxvtNhbMzoe#e68aFJL^vedMZC#rxM*Eyx_{3BsR$b3}OoAb$-0R4RKbDtZ&<2(Mu@Lj3=YdPC1 zw`C6Qd@uvAjT!Kn{_}s~yM`b5!5a1WOs4fOLm&+y+I&AUdRWq3`89O^`Uf;oi&@l^H@e0 z)W^80anTffVwf-jqTH|>9iwRfB=qm!lS<(puY29=WHdokz@WPovObK5aSFh<*XA`IVP>@n4~o+qRy|nG3jepu9_tiX`FDuJ z6l}9JJoC&m!+YNI?%^XJ`LKR^p!{FW$LL^euhtnr8GZ7TpB%pR4}M!PQm)d;(%nDH zVcvs6I6CmzbG`fSyTm0xs9k+d!jBi(6(Hn`7cK_HIf(y_O(|!>@A3O^j3k%T0yti7 z8_aKUw1PIkslXmw@f53`BKx$rDQ+uT&x z3Trh}UZW9t<8a6zoZ)czrRyaRc>hsscv-R;X>dxxjcH?DNx!nZ zs)ig2u`eyFZkNs4Ijy;S9-b_9p$4~x_Uc2)l3tBGSQrSCMaVRS>t9U{gn<(G9apw+ zy&w^Z20_g-PA`G~KneTiH@|uK#3z2PQS{yzn{ewl$H5g3X5h6x1DqQ?+~4uFUpKsX z_N?;OL=ll6QozM?H!#qg9i%Nqct*r9OPhnHI~rz1yWkzk#7L1+%YRwU3vwzzdx1Al z3R4ZnsQHgp$21y37MRw&;;3j3Odo=Z2NDUEWCz_!vl<{3x|$-D##+^-kl~WwGp9;C z&kXf;*eva3Yyr<4!0bo~yJ?i82cM68N(12kId$sP?;M5!AcG?S!2$mod)+P(fSrdP zdhmzW*Vg`ECvBJl-g0f`2y$}K%qKTB5Tg4PRGMxBo8I{HlK9!VXJ-~%65TDR0y7M1 zU$&fn_vX8W5&v?Sj*$PM!&}-;*S2@mMmFx~E`aRM;`M<`5!NG7}T{B?C^i99- zn}=WiqurH@kHA+fv(b&MOrH$N-;r*VGgBqr?zps0t`` z@>^0R5(WdzoTLyiKnxO;tP(XdgkaGy?ZU<20jRhmgZ5C^YPY<(DPXmmr`ds^{dfQa z%>)@yODpR@>ql#1WE5N{Hfk)ZH3$2sU&~&;!tVh35%C~RIgOm&Xa}SL@N1_|o%*^o z0BRM$fdO!%3A}}$*9gGw+kV4u_>q;hm2bIpDeB}$JF)ouk;4x^dc0cu+d>^c(rsEd z;fOH4OG%vj&%9cK=at7lbSV1JtG($We>lThS%%Ppj7GHBb%bGk6%b&Q(NMNmI}q1)$m~LZSf9>qD}m>ZwbYRMixi!QH4>I&^5*5wqyEhMj8p z{=GfjgNUV~5smMpM*xDGASlo2L@IoMnuLwFhSQWzW7JQPT~u`eU<9OW(D+ow*Qh{s zlF|V9|A+ujeJugc2?+4O0Qe%FQValMNBnQ^%is1J|JL&A>bu1GU7FN*JXX3U#h7mt zb2Fn)mD?im5ms7Y{^^l=ZCYA(a=@a^VHkdoKoN+O`+M~^k``HPn?cTV%g zyGr?U@UZ?Pw|_xiJNY~A9aReZ@D!yLJ-dsOP^ki9>TH>P@aKR26T=(d_{LX6`Og7( zZe~Sq)pri=--Y$9n$yqcI&uY z{UqEU0gJh2Kx2PDzOuMs9r7YN0eC37b5TVQWkci-f#Q1ZyUb*yZ`5q2RA;I3%lX-$;I8;t#oj;gBiH>Gw^c3ubc-OWqs|}{m$X? zrAwmSjWB$?Q1qN#dCSch$g({fBbjgKdjO0n*+qHo=Q;B}Q3fK1L<|Ew7{-7MfMHpk z1Cc$HF-Q6{z=WeSZ^!|;4g^VKv2ZfJ_!`d#+&uJ~HV05}4$^xy+;{5xxF>%XrlD9?+m zR@%i@j{h=g)YPWc7wLgMB?i_wJtApDcoa>`b|- z&_A17R;?onF`lp|Vs8bazb7zi?=oAkqCw757XUw|FLvpVzsG$nq;wed==GU80TAFH zMt~uulmcy1SA#_n!wA9hv5$T9CFTADo!g@#pZ@fxhtGZP+2mIU3%}MW2Oc59f#fLz z8C};co&#Y3@)%%KKH3doI$}eklA{11sW;{osgHgut&&Tx3PPE2dCupKr=N9Uug-kg z=2jRk{SfP|AQY=gCO>%fN*6|cvk1g^>)>Wll7!($V$;>LYsl)FJaCg`GUby zCDp0?W8y>hAiv1{8%&4+0@)8QT2o^{a4(_&W-rANK`|4NWW7V)L_`6DLgN<8XwdoA z20Y1ZAZm8LhhY-0@g}oTq4wa};D_rVqmbb?3e@y$1z=#{9xzUbjv~t`Z8R0Id0Q|N zNZ-0cV6=T4nE_1lJFc_x7@M#u}J;+d1h6hLXd|^&PEx4=WNuDWwbpdJN>j1b`HZaa%}a(iK;(Lfc6l z?djpc2Ok*z)xY|M5Eq|^_g|I&_kaK27=H9e|Mu|Mp4;g8Dz-;H{2s$Qg~i3wtz14!V4iGu~UGgRAEGPC4{9zlz1up zuN!kAt`tJu+H9T2>X@ps_qyBGb5N+}BORGBQOPu)`BDy7bzy86hw+sBaLFkTq8o%c z-V`1mEOaP>-WMPG z&>tH<{?k7r;2O^Y5Y9$F4hb@;n?ut(#X6Y0C$K}IbjN2jYyY*zJ?tONe+qwp8egOt z6fxY{mQrN>?!N0TUH7@?+*_cWlO^MZs4y_cNyZg2G8*S_I)2}O?!&(D3mAadG3{t` zhS;N=51(Pnoo3`^8~19IV+^nl01NW6(Xz9%^Za9vJ@#9R0dNojcqyCwW&Xwn00jK2 zZ~f9Q`TI-DE8mD!=g<;XY<*4l*PN45zhe)@*Kl8V{w8csh&>Bi^$?- zegnJNGXTDTLRw_+z7DwTVj33_@*_gPHL4OC{UjqA=FV;&+hhRLKr6qpEeLu@A1`QC zr8*-+$Cml(iq0noh8!K<2qZ}S9x%-Z-v9pLul&`&l85f*B4Iv+cuenk&$kRe_j8|+ z1&)E?=L5_r0{|<2bxqNl=t&=?OD;dE2iMQ$&!=f2ONS`81T-1Z4+}<&p{rN7CFJm2 z)J~L;>jq3_;4|osm{}Tor6tsAhC~zs3KEbM;}ad~PJ};oZy~M$Xhyl042YE#Qn9Wzg=2wiA;mHvRvawmu zi0+Zb!(4Ph&u<3J5`tJk0xsM@WbCc{H_1xM|9bjlLBB4KKaQ{4exsQdjy~( z(!z5|k!|mY23Y%q6eYkwQ2xRVh0*SaS47XE{vDcgyl3`E#UWV<#+ftauV<#Cf*pBb z4@T~tMmkX~VES|_6sjgCXh6Ks28Yi)YtPwcO~C_jZMqLSWM2(q^Q3r0^)qv+>>o`F zStJgHObg6iXHFM6qM#lH+uN;s;Lgs@na3Z0{5KE7@N7l^4h(>osmx!>&#M8j_8Z^& z)_=INy!;IpFI`MU7Nsn6ul)>xIkgoBKg#dw=O~7#OYMpt@}M~bKmsFkXdH%ev=(I8 z%o{q;o10rY=r5i-H}aNdjhH5^5+mS|=L0w*&@vwRz63$@a7#HrO_8VtCj+`V$P~eDaJAdwc8($N2WoD-5 zp&LDW>N6oK)Kn%!Piluae%ox)jG%};KI_GW25({G>i|v5g^a23xMCe5z0h8{VMV`9 z6Rq;>+TnRNJ+{z+(=`W!Lm4Y!@Mulz$cfHpF+gHYvpx3ux=P%l<6b$tt>x@7;a?tm z?9}kicfND@@DKmZwkBgGc5@=m3X(PbUBCMqhhP2GUmZ@IJlRU@K-sI@_QC~?Clvb; zy~lbjJhh%HNXN)^vv+%=o6h9tDcO+B)JdDqG)8K)!N&R0 z%Ch7cBt%4A_zuPm<7@5Ai^Ls8?~;6o`&hA0Dd4BG?J?9;RXSPzJ=!x1^_L*{^0#@{PDww4}Tr#cQ!bdDBkS!r97C*XrhE< zdibMcZcLlmVKs5J@xkub(EIHKE(#zlUW6EmGc4965o=&kyF{-@y}a2dyFELPi|VcS zKme$N!mQ6*Qn{UebJSZra{u!7Q`vK4*AjaU@YWGJfN4JZ(H|ea>Z@+P_TO{(z2EzN z!=L(7e|os@zWX{3AUVKU3+}<;6L2Yl=(C!or(-f`+|tLrL0X{J@{}C_|JNAw&b=JTVW-Z&`b{HDxbAr^?6R8tiQ_W}+;S%S`+V-O7#~Ys`&P z1;e@$B|%6TuhLi`Cp*XU1;wm|+rA3R?xfRR31(f~j6F@DDK_Xezvw6mN?uHxGC0#y zkAv7Q*%Y!`UH8djj2LVxZQG&NJ?Lgt7MB(+kqrLnsERI4N!!Y*lnkji$g`--LD9Qp zPEnc6{euC)W2SHX>C-PPdh;c+@boj!$n(Ed%AfIm;Da9;e)1=OYPjp}yJJo?H5oRa z{2c}p=e0)$-VtB5DUwZlwx^_0?gG^yAfN zUCuhNcX1HB-%zGp{duYs(kTMpz~>mjR6#L5{v9$B5H_jFEv*gLeep#&31VzSz7`{5 zi#wC=aORxK6 zikHJibVyg>=uw=Ydi#XV*A+fT;1eDWYd?TJgk0yfdsigAQt-tlR z4W~|>l3&A2KB@)XxIUrta{Cq5B#qkvLTN8QV$Kwd9K z0CcC;^eWN|*9c{cpCY{5{k$Cnx5Jwra*TXp?dTq~pU!-4hKlQNLgz$VSsAt2!d9uW z9E0l00na8s1$!%g7pQHyl+Bk|QbAZTO8b#m;W`8>YvkEx65=2%g5w43f5XOF- zeY0gUUPnIoJh(R^ZJ<4qAqTz>?X{HuhksZ@f2m=Ad;VPGgCG2(!^eO67fKbv!%q3W%1m3CqI1%-Sj~v#uqmyV{hu`YlT)8TRUU>i{qt+u;V8;xgVc#b= zZvc4xEk~jxJ5oK4OfV+qz?BNTZv)&>iq+NCOTY3fzk&hq)PVsomYrYBzp4SS@!*3G z{N(D&%Ga>*Fajh5lf0r1s`s-FPch14j*I1woc5d-)X<=tn^H!RL+hSDp=ks&p~4Yp z$Z^{Q;-LHqD-*&DffENX9nz6-sX(gc#kK2A6jn;%id+T=htQKyTMP`g19|-T35~;E zP<#G7`UkUEe6I=8L`^v~fdxlX&FP>r?mFvJ=v2H37L;sEALa$2!W07V--}k=v40LLS%wDRT>~h;hEL&L~6XL*L)o6$_~VxVbAv4$fpO zW80(~32iKrb&+PMa(29aVXRK&aD1n%X>N$Q2*7kd#FiV6$7wmv4QVy8Af|E4yhJo& zQ-%lfhq+^q^4{|D@})-~ebfd3mnR>GFh7U@?0;Hs`6o36u=T(L4}5%Wb>+7;3w(jQ zKLumyr;Www5)m)(TXVgCH(Oa1dP06y`FPYC>HCNdq=Jm%{g8xa{vV5RThc2Pq!$GD;!SqK=<>5(IN zw>v7~F>vz8;lmP?SFT>pHN@KwVAyu%-HDz=31NiZWBsn5)2_O;39v;cT2~3|NcYU^ zoJAxd1P@UUeO5plB2(Gj)w~m>ARI2>tH_@=WwZ$VDqXQBJ5tZ#KJVs^C`jp>J(+P1 z0DnzOYEv*f)Xv^lBrfX1qnaRvzm+t~MiGUTVUI!X4Kffs&pa2eDUf%%5JVg>eBIiW z{Su07bvSbLh&bR$fh`*LaaMTWpiSl##qOe@dxp z1MNkLUV2Sd{<`nDV!B7ET(Uf|HiZ>&W3tJH>k7LoYM+tu^TrSRT6ROBo*{FpR5n43 z8lIW-oYR_4lQ{z5VL964bZ|?-^+@C8U;p)A|4o?!sNDb$41k*zCNJ}QN|_c6z@Y~p zc;FwcuCDy%{c<{OaWfYbbdr~c?Q1A)y7xsca^9Qhrd>n;vns!M>(B{5mtY82T%H(VD z_$foYaN(l%?&ik2qD%ETgx7CjYp;J8buZ=ReZKhIg}5q>vpLqyx|fRs8PJZLe2p#* zX*HYiYvHEZWNT$viW|?(;7HC8`C8TezcYIxT|q>@iqtpAH+67{LICuhI<1 zU|w|<>B=+|dk6fP6fO3SCw<)9$0;?BLf^{;ojL)dT{o@SE1=^ldpo)x`8>Z<_lx4W z)UEhX2K|tZ4}9p3 zWrg>#pmnH<{&*<{fDhEq|NPGn?|%1tTC~Ld4;H<(q63nP+?1kxmw7mO@{Zxs<%=?) zpbBOF&YnFZZyLS;l<9Vs4~AqPdm90ko{==yp-rAHqYXb459uI0_*VCfcX{N9QW9rg zc%g;l5p;?kO>*6B4eLfOdnrDT2WiVOt*H)8D&^=Lujg&n_$c>c+$fds6gwinKC_VV zEfUie%Jt4Q(J#)-2q!VM3i2jBt`JuwmB2#_@Ry4?XMn|ipZ%l^ZAojvJhF#_E<3?z zE~A^6Nf`1ME}S3U^{ziKeD`;Mx2|<7a{llCzz2sP|M8Cv_uTWkEYDjs)a`O3qlj`K zf7~W~LFT1l4_hgz7>wu&0@iuojr1qy8ly=BWRAc!WggQt1^iKM!o5!?xR2|=4Zt}> z$+}WT4i!c=E%t42Z z5zM?Aq%}Q%W&7(1#5JKgA9Hkc?K4%~eFLnnkrNN*I2!rqI*w<3X-{;Kj(`%B}JnBw!Ncj3CkS=Dw%VJ zsK#UoM2xhipDF%}fzFHbio7BE8RSq|DYe>V+Vr<$Q5uWy>H|{@hbW7C&82wxjNf1Y z)+S0eehp^itYm89%HxkeP6WUpz=H_D7eL8h?~>I3AQf=zE57{8|K;B9?w8bs2L~z0pxvH{z<}F;1mjlOP&I`?kvyTdi{meR6=8S7GT3<&08i z>ryX^0=aNLA{0F=h%#3{BnkGaWR%ZahvT1IX0Lh(H1MWE-_UjL=f&{6^A|OTYWWToMT+gW(jBw}n9HFty0CvO>h`PqhXz2)+ey z3)hp$I{$e#jqRv%yNa>0yr=Lrf2Yr^!L;NIPsP@ zzxfl(%gYaj_ZXWVCDFb3AoGd5WbD1Qji9ux^}=m~Ov<286j+JAo;GrcD8#AsuV=!K zGs+~CeR$#`P;u@3CImE_B6V?Tq6L{N2l_l0M0-9r!n%R>a$Gz+0)lb#9NNqR*p={Z zdVP&lL&^qrzyL)#ZBP;kVE`OGHvHl*-Mj%{0rvAU0N$;2;(6`8Mh$%N&da7!o;FL@ z>;*YoO)5nE4;7%Pe&s7l-|&)g!2@L1#1;WCp-d`Ra;GTR9&VoUKUgU5HAXX(p#*Lj z?}9OkF-LQ$OeLw(Aor|)rjpa8@H+c@%Ze7*dyoB)C3P?rW_^5k>_i5}Cy^o2!5gk5u#=tz-`Qd zQ)7Ei^EBfJU>qtn+uIBNftd%5h)0wJ))&eND%gh~et7udTUhG%fe(CW`01bdnc>kKr#qR}_cVzv(2|`$zV1 zevlU}!UK3RnK*0tw2YB76oZC5B5jTexUWY2O_Q3*E;v=#vDY0nif8n9!1*{`iX5*j zm~;D&-x*}Ryv>l#>jaTdaRCcGka$I!`?m3%U$%mFtd_AbI8_(coSPRl?9>v@=;!rVDh? z{7g-#?CE)j-Kdeh)dm3Lk-b2ZtW$E)5Hw^NQN9`-Is?;j>lBwJVCy zsKZ*h_;jsZV{HLk_YNUmM~W;gcS%oK@TY>Dk6=01(lQY9r`pvsYtSKIQG+ET!P!G@ zR71)I)V*u0n{d}Z=4Qlik2&fYD`|@pCr{}7lBOFH5U8stj8e+tiqYqYNxe5lCQoWW zXnfYkBcn^Hvu<>;*U1Tg^TQ9{a?k(cAOE=eXW%6hO4lCDvdx9$k_>`4`^>M(CPgiM zRb`7|)YaGLul%+3#qejqty2j>iwr22(#Mt(O=Cq-GC;4X?A0I)%5(5hjuw{iJM%0@ zOvFW#Q7=4rJH<1yFAQ>W_pF=BNY#{#=vN1GYn991P*gBMwwB$TcjSpvgf_&g@$T#J z-tO-1fdTN!>Hc^e|Na_508gKVA8s$k#8I?{bs zSA$2Kdg5VFxLl#jisI|3;za~}(Ft3J4(X6xk@1scGuN&Smo8=*;7f@B2m|o$RtCt} zK((VxQEEP*^Pc2B4?bG1sVC^ra|jLz|Aj&Kw*Xr~_{pNl@clw0y3fHi{ zCgV-yR@6x+j-%zMN4M|mF$NF@Ar>hNA~>d6UKsfd?7InRX|Vjo%;4utkA-tyZfNEI z@H-zKKK$WZ7xoXd|Hm@yALX}r#bLyaQ5Jfns%ZVUA2ahbBfYtBjq3R)L#P@y1-P$~ zFSUzI#*ktEk$KU}b%xDDTS~K$2GX^hJDSP6$MZxK5}>XcW{CxJAH%TSGzRCiC-=c= zK+XdeoJJEONvi!08V*-_d^dp_-|I0mrq)WAW#TH zy3Q3Kiu3BK^EB_Z!{!-}6WL5>>&-j&vKXv`f#A3iB)m!BpfsBE~f^ z0Lk5pYhZVKSSmdj*kioH$cPKth(*x`$yQ(MdDYV8lJ^AbgUn>^0w!I8Z~PR@PkC(_YscQ07oD9a=4eDT7?@a);}bgo;EPI7qm$|Vhh z%CYb^2}2tcMsAJ6z($rO8`^$B0T>uaN`ucaJR7tyQGDWS7wRq16R#gjFspg(%zk|>=Dw|LETnjEVo&GS>>UR_h;ON-?=#P+vCkJm z`3J*al2&E+NB*wf>KMu2>-(p)$m2?sFbn$9&IA4=mkK%1m}tCDOYXeU)`~eNb$UoL zmGu(>V>#$@eRJagDjyl+VQYoKM62H{Zvb3zyQ2*7Qn~=*x1;(_rBNP`-@9UONX$MQK|@;$U{b{RbpV0SuX}oRDi=L z5Fl+U;g&BUw^1otdc0Ov0F%@OZ7r-^2ITgf`a5%Dvf8u6F4~_)i5{OTT$<=z1do7* zcu*!ZDYyZr1<1oo4;Le$B6;hbN7t0%}#I4eTW<=s#PmnlJO5AjnKM^!P}xr0mxFw zUX-!dBCKldXalKLB=j+1%-SemAIosCJ4yvgmJ9M3UM7)^%TQh?qI(+3R@BA)H=HX@ zAR47$fL)1pnXf)Z5(88UgHDZGTQZzm7~4A_*$%^Vj#9~H-!v*{DkmHri&ow!VR8H4 z;;{ew-~WN($3OZ}h5fDkeFhw5wDRGZRqc|XH|<_?f|SsEvDZcstae85>=W2nm9wK( z5vlT3O4vVfKQ-H;WhPp&x+;&~y%AiIP(_2i{uVvW^5I!kF|kMMSz?cJ4W&kAUN$mt z8hAcO0_GIIzZ;HV01`DPDW_SJ7KusP-)am@t3>wp_Amg506dxA?(cX-sD`E z3V3N_W8?Mrz5d=umWHKG7M3=vEHrFsUUb)VD*O{-B(MT2E5n8J5k|82J;rfoEqWRN zs;ymvaV;VR2!AP~l~oBVT_=TO-FPlOu$hc7N7*BE006rGIAwQSn~m=lwK?3;Y@+be zAfL&g^^h3jRk$zl1zn8BI z)AbEwSv&_z0RVK$hKJyM5V^T{F(_zltnyz+=jz$0>xy?uq(cC=?cL$(wJT|h_F3eN zA3A(U&vEw5*=Q`37GPEMbf&}j1+eJ+ag?w z^S|Q`z-sj82-(9+`~>W~e(<8jF9sIPjFJyy6wN6){xpY%RT_H9n95MQbbmx&RN1iI zDas@L7oa_#w08geM>~V%UKl2<4S-k5W_{*D`R6`K1?%T?&Ht=7UX;J(Zk($)gH-y+ zn9jXD-JYHk0Kq&v_#8(q=RA3T-|}#30Pt++0(D6&27+Z|i=u`e*naxyr-=X@7yz?! z;|u@hoB{A}mxiVFW=W@V!^%g{5~62A;(4%{5m*6)S`mutlWKl zu~8Z>fO~Ak_b5NI7ZmmE~BOsFF6A6t_A|^ULk^PJR1xXkD2?s?ti?^ z#=PJ>qpJlJ34(CPBCk9%#u~;O{}s7O5|u2Lmc^W^GnrC5mx4<@!ATb8)2%;x3dzZ= zQ=U-YN`bRp=@~1vBdkbQ7{0dJno2-MdVtbKo|iotrI1nL zS`CSaenmeAjDQm-PD=5jC`vd$`-$kqGfzJ~Jp9gEtNh>l-uDgv?4SMffyP3l38!Ii zmNw3H$O6}&16~HNQ=7Q$eijAo{7EBcX@W?TR0~)1ENvWvEhZ&F9f1L zT2zLqDt5pnH3K3lifq%qD6PSfXLJ$_*%d@#jN6?A`<@tw=!=arS|`4RQGuMRCAU+V zD&uil+giS)2!$xr*K{^5YcUc{@G~-`it|(VzA*s%-7Cj&U;upKb^LYjU;_XQ00QH_ z`|iE>mzS27R<-c9u>lFKMtFyCCyVNE4*AHi`T_~f!ZyaRii;WT#I%`{A&=iIFb^u{ znW=>AL9Xwm&@;oIH~>nBvgiGK-i!Kml!D4!GS6%!j@MvgCO?-4CcU?V6O7A41iC3LOcLYtF+u`8YWW_Vj`d^1^}T|!@W|b zq*$n3POsITGy8+@IuvN5hkF|&I+C$v{UHldt$S(TEJY@-B~m@{N-ur!7DX+a-Pvy^+N{!{&cq~m$viJO7rek|^0LTV&=q9VlQRd^!}3U4@7T7d9Zorh_VnuMzKZ8#(DP=h06J5->a>y0BVaEoT}(qH@sbY zcIJ@aJ5g#D;s321SLgf)ua)mK<^Pe7=+gUwOm86c*h@CX>FNi`&;9q`uU}!9DP^;? ztO#Gm=pscax?DOFuC=J(4k-zgwln*=w*s5gn{(-NJxZKsuEG9n&A>pzo9{zm{55el zPbO!$Nr4<3!`|E<0Ma0 zOGzzW*GgR}vSdMZ{l3q-9Uh+708>ZMc+c`P&QP=$J}>}YVGVzS+h5lJu=1*cqFQ+l z!+|SJ$tVRNOFViE z)T^-x0bRkkMK~2w%R(kl<~4ei`wtGyr^!R**`d;~Bu|6_m2xJCsAr&^Ja zSI+<8hldZ}LgoM7_r7=dsh|4k;lBG`-yDRc&g9Qm`7Dc;Cc)7Mfj{50AK)!0Q}pf<)zhW>q>mu+%cgrHIiV&V%L&ektM;q55>van@LgsD*ylr9k_1o{2Q zOGyDtA^;LD3oHc_B^o2iii9925st%k^!4j0lWhJlU%?Z;)BDq>qH|YjTK8Iu1z0NDCDI%B}W_;$GLX;C5t67ha`3JO0*TmcrKVKq2r<_c=f*;E73PSVdH`Vm{{06gBLq-4niQ%mdkB!WK%l#fseyf_DR2PLy5d`k-$T)%3R;Pc4bbnf zK}&-T5}>MZ_7SkKm&I29j(^k59d+c{i#uv?J4BH|4Bs;m=kk*X0H!9XM1Zi1Wt`%N zcn%H-<_Gn*@tz2kRD(29DzoPeA zAY@~~LZJ^KO@%GMhcS}`diE?`kaSAnz*7KRj74fB7q#4}R!FykfPK zKL~&O_g@;JMy<8n_$Ih%?(sbGcT#xG%zUf@AUBAE;6kuh1?E0Hi^^1rz00|chF^0? zKUTdHcnSy}P9waj^|AWJzp(b0JIg+vsjTfgf?I!2nF9_=D8J@Jz^ma9d8FK0Wj3 zqmQnW0M|&lFXgsN007$X^%EzkXDin$tUz>Sx;_pb+-q!|X>v@DsMc<=*+So~6s7Jf zwzO4`HIB`V0}XTyZ-owj^6PcpGT+@U#MToBzKZKyTmu$|1XmUGt$U^)P*(vViof`) zFD^d~@ZNiy>w*ISparnP5~t^65e|KDs5fnf5+7f=&*P@WB~8$}6}%U4_Y=UJIvMWJ zX@a0jFTGT4V!3^s8PXpK;_djbHh)KcSy8~-Aten9bd~_Qb>>DYP6LGl<>c5jJP$Rc_B?@9@Xh#Nc-ydkC5L>_ z4U-;4PL2684k@(f%4>@A`(OQ|f7HD1eZS5dtd{cs#GRjLp8kwyG&^_h2=d{afN7M; zl|0gX81Q*6!BJ2=TKzdnnqKS?dQwIc%|(}7tOiWSju-ILtslt!h4b4g+Yu#r1K<@R zPfTH5)3)3+aK?H-_H}zQ*owCCg1#VVEsQzdzGDZ^9%? zK>t4ZX$~pS>Rf<9D_ti~04!B?h?4>y8ftzj;;s;QfAz)XHv_sig#Zv%fP!#_hOO)& zAV3%UQ1`Q#RCqop*h`;=Ho(GqLog#8^TR*Ndl*V+jbW-ROla$k@iqjj=e`y%K;l-PrH z24TyT(i}oB$-ekPfQ^=XEURu-kke0DkuZpk^3CBym4^AJ+lE5~g=e zFBuB}w4oMuAqyZR1wU8QkFXJ(yPV&EcV%2sRz}N0jti$IHxSL9V~f`QMgjsxNJ1>_ zHoMtz_R>u*n*Tr{V}s%#DCKWy_Mt$H5H}l+r1Glylp8MbuB8Zwz>(g$ZQyoi)`fun z^IsoWwg-R!;JQcyj04Yki?Yc$Y$iM9w=PcAF$Yyv2HcyK1m^XCh{0+aKk9qvUo4t>P;bcYpAaoSB2{jVy?= z6)tx=$||2{2+uJ90+s+0KD%vkSEKCR6jI+GXUUm8=iU5h&?s?+M!UptcF!YB1v2xY zLx)OT34$Eg8er{-DSCKV;LEOfhI_&k8z8~vwZVC2v#n@dj(K+n(W6I?MoofBz+G(p z{C9d*H*TaC0r$>s|AL9aV?yH&WLtG&T=xJhb&}WUx&Z*N?*Kdi+&IIY>ljMSqovEg zQ9%$|l!yT*t>-hL=0cOoFHNaM00LlR(=~SHOsT3?&ywJ@-D5=fiCj~8nL*tRhn=-7aNxh=%@@9TE39Zs*o6(G^Hv!)yk?*-JV1Ya;QnO;fcx&dulb3ecm;=~*l_)HV}P!PhWWspV=kcJA#}Os@vZ_= zdKVGoM3lt+pM3H-g~fZ`^WNsh8*eNRTd5*gqrJU;+i&3+7*hUw_wMB$! z)!BNjB)iI`U%=z zM9DC0aJJ!ghmu1Za-Rt(cw7rbix3&^p~gQbz9siLLX#lj;)5nXu4GDYCC;D=qXo&A z5CvhOY31#oK~0S@00j4Rs-V3F{+-E(3!UF_;R6FK+!M0I_s$#u%2!rDoaQwMZLnJG z+}t_`-~yk~@c#d#cYrIju+y zL>-3_3z@XJ7@A2D&5&iG0yz(_ps%uFkV#g8|3HoB_7Wc zSo#0}0M6UCQQ79SHw{T+0>=qsL3*kU3WWFYeWVpa`J-dwkt0W`5CJOep11Xkf=f&* zgeNrsKw0MG#-sd-qFQc*wvg+c##-_e40;a+_LISbvn+fG?gdgG=Gou{e?wZTWnd7>lIfIhHr3J6_=y)f-I0U{&cL*&vcoh8rFhQ3(97G^^ z97Hh7A!zVB$I>t+{2t^rkaJ)KFpkKOg1`Xd?uq;;aaBVDR zyz-U*B69EL?Z8Lf7-J+6gzS6!JF}R6)Ia0@vuVj`TK@Okb5BwJD~| z^b!%6-o*$}79+uP6{UJx@~Zr8*i^FDVr;teVqw;7QV3V*LAnE|@-yb1> zRK&-JPVsQLvRM;=Y~}N%0R(QyN_(uOZB63;*2o!LS0#7(9I9ajnr9WNC?bTs{!zmY zXi(1J0~FqPG;x1G~yNSvXO zpc1r5HxvJ%KGTmw%>=mA*$FN_P}oqea1*Ws0Ni)q=bN8+#VaTfA?WaI9zHbriOOR1 zoIp?}5~IOf8Awn0R{((TJ@Ld7&2RqZZ#F2Gel{i_Sn+{;z-C>zljp zxu@B4(H;_JX<9c2*S}M${1B}92;s7{~FOW@HgdPfz4=!Wuw$dS2T+;#1vGQUi zzyJr_%i&S5rHZgv;V^}`AoNJ__F?WoOg_EyA_UWbVGD6E^>xT}_Qo%i!>YPi;uPmU$~=R7&u-W-dr6%Jjd^#~LbtP~afHTIsTPBI8YQ$E)d~?J z7>!0VU;XM=*8#uO)m6O9W zTq1B$Um-LsuEKY5PIm0t(HuQ|gnXn@mC`P}ASK)7zkmwo{ZMNGA%0QJqJ)zV(x#0q>hNoaKtt2Y- zsq-Juez>$knO1^dRotjh#>{|XIg1sG51t`+)J9fht*!V!s000;-P<<%`v~%Z*JOH0Z9e``E z6_IEonl^2r_u_06>A|ymoQ;+x(h7=%cV>es%LS1V9*RHtlRs&`@B6-Q-SS_f!}wq7 zZQC*b8=Jd6aaXhd(o5C-Fxd0npPAfi;}?e#3J^qHC^m%M*vM)W6)%xZM2}@{%7r}- zvK^EaKm+6l0r9Dm0>Q48iTVl!_~EsL>{$%J+pEwrfXHP+ z(<4aK|0EYut;CD`O!2!X8X2nEOa0C`dzfJow!$Q5u^q&XuVHKml+751)X7T=G=+sV#6(&TPV@@Pd?P z|LoZN!K#`tZtSoK?}o~#PZNN^Ljqzh$8UCAHZMD(v_#qUTQ871=Q4!^oF?UZq{zUT|zwsN*4L97dfA_S31fO!zn&CV9D_c#p0@#OpV2=I`y9s4_!}e%GEo{O^$?M^shQ-n))5=I;>{q|`f{aaV%Gcj3mz z?{XND;;YjiAj=Sp5sDpYmNwF?3)nPjUTui+Z@g>H2*BU+Uhp{ANq`srpe_*rcY9FD`d#ep*8%$)Em(VJRL6uPF=etT6 zNA8;O1^{5RpA1id&ETFn+y(%0L!tnY-krI-aNR|1^(u7gT(y>WY=IEf&BlSjfB%{Q zK-IgJ^1&Q@{_~%2UUvQU42d8mO2TfKEaW_Eh6SP}Y5{c_xFJk4LgzwQ6;1OW|MX9r z@BGg1T=KYz<#@yfr(_m#uWPUNZhjrqAFhR0M>L{=^U0eApPu!)9XY(G zVYtB_Q7b>x_Q&sX+h{A@VE|Cizq>LP11rfYH#p02e#<+Pweho=`FN%kcK)5^DlB+_ ztZp$M$Rs?=x&C-hRy<9u*f9nG5B$!(5pZ9%i$|8#X?Zy28-^+;CMMQNfEQQxB8w+$|1 zWo@B(H3QnUG7i9fpTDnp#VcN3y6IsE5Js?uinTxxq;jKd2vgb~*B8#+={!CNETn1u zw3J>ocIk0Q4U;?}cs^e7?>dG?%$ zfhCXD`$;HQbvcZ=6UmRwq^x-0nM|(r+?zw^!|=V{3ji7lbkCkWREXdaWY47^ieg$y zfu1MRKiAUFyqg_S8z5WIEdX%tJi&JMMtH6ZgFd&M20%g9QPex3QI+%iIVbh3W;tgI zzWY1eYxnNm^bEitDW270#3}O$iXL;~ct5Vs_jF+)4MEM{a4oWk{4S`KFuh@V=79$u zSPua#MA)|q*OEWmw6&D!%=Hc_c<*ji!Zq5%>$hE{8CWc4yOhUd<&SjHPkiDN z&Az=6^DkPs3z20+NFlkjt?F4o&S=lMq_)l>_7*H+Z%1F#0`x)ltr<;KUh#RU%TGDG zo$#I0o*840!b15O@-nECAVL(`sK7ID)}S=;UH!bFv|#pq+^QPN-zju3nDB3ACIlY= z^Y8uu_%7s5?z#yB%enV>-cU(ipW&RwZ0`ZRnyH}=3pB(>-=i) z)~1pJB`7N-U*oTEpaTuG5oM-kjsTv7BJRA@vq1siP8FHE=3_AxSA-0)dGc^FmIrV~ zx-_Y85BMqXY@3b+NX0Z}2(c@NvO?;Iz!|p#y^zJu0Hp6<`A>^q(($aY>=-8}r^X$; z{liY>MvVa%wtyXj_B|LauE!0J$3_4c{`T?q$Q$s`E?U(45Kg&uP@`Tx%6!hyJKJTM z5SfS0G48i)2Aee}+kVhgEl$zmYANQ4mJl^sUhK}!fRzce%Bbh8A>RBrCjplXMC8)Z zbHCN`gfl?bl*8&^*u5mUFEqL;bmU+e@>c)ZSZBxCWnvsucHL-ga+}&62+t(*n~Tl_ zmkYe4H4krklGVM^{=llsdQAOgfwE-kC0rSbNGx$IRAz^bE-!Ksrsz@qmB06G;$w{Yx6&$w7Octsz5I*9X^>OOHh|Ngsbwta6eebTClUpLWwuc4*{ zx1XnB|B{ZbS?=Pd_-#oqvm6nSj~$es8{|Vu7A04+OZ*rX({0Ap>vzYjor{gZi*`yH zApU1_T)X+Y9*G4{b{GQ>-*UnOmjEjw*OtZZSWPslP2;&JtW9R7L@-=i7-QXyJPYHh z{xgCmUtO0#NX|=^m3Wc=+x<9u4CiKc9!Brwl}a~bpEUg;`c_`sirENGyvVJ!+o6UQ z582zvRdQdqI+~IerF-hfre{Sz*_Oc%k?EeX?GzKxW8a2^iO0)G`tzauVxH+2{N#}j zhxMKu#Ea{K0T}ak0b>>EQ_}U8Dm3XEuf-)A3(z5UYo<^0NL~Aq@BZ^Bwpbcu3Ij51 z*`vp@CM<{<@L3W#<0tpJ!wK`*qftah-qF9>Y6>qFeVs9ETUwQ)?~U8fLaSdP{rOs~ zz}T(u?;nIA5)|b(_-t_j@9cqDoV%&l$)b3n4pPVyrET5|-eACZAPhw<0&gFbzw-5P ztVA&@41Spt+h9v-Yn`qg0Y;{j#Z{JeQC-rs!K6gM;cMzu2~K*4fyKQEUW%GYSAq3~ zIQoHR_m^V|d2!7SeRqedib}Y`b4wBBr&&UE`Ka$Uh6eRJH)4*iErv`XHyd(Y$;!h% z9gXC}F*o_AW3Ix0NQ?o{do86-4kg~W$SAb(*2s5Yi5;zr%jJ)jAH+Sdl9*Gk3OJuR zwDSDAzBIC)T^9;Z$(PbOe%;Vv;5uj3q4=UAGYRd3w7j!c>q@w<5LL?DY^w_kr#c;B zQAkMzUySI4Vp01u<*dA*P+}!g;eL9gCi%whlC{mJjMrJo^xXj_HLdnqm3(mcYb>42 z`kT5kC8+9&v5ChNZ6YCF_(xCNcE(lUd=HF`2Aha3& z;Pc!a$olEw5D3kD3dPUK5TN;tZaD5looCM(=brwT;TIyaYoA6Rqw3|LsMLamFXJQn zpV2-X6JLhQVa_Qw$nHP^ofv5TE#bY-FFm2iXo){g!PF?T&iP$FX7i!xW`r4*z6fFY z6V666S_@_%=fUn!4*`_a3mztQ!0lv}o`;kEh5}w5FDwYj7jC1D(x043?W7AA;c3dj0zXwLg~Nhk3{F}QNqA6dlo*L}x)6sfghD@KK|+kqgMID->QeXsj{U=u zI8sH_Lw|B|e?3=WI)4ZijA zQ~xRMWvU4_3^A|ZtGX#Q`9fMA) z@AzCe=Rzsj86Rn^m{fPrxxjZNVu8WGJKbiTy=FkK%fH_QrH`f}NN$^qM33r+g3bU? zS|u)(5X9#-c*za>fU-A2z70FVhYo6Jh(lOQ4Q51tWt^xy|7s*l@ALK4FQQO1W;^(q ztUzT3rFK^YMF-?LNE;5t6tIAxr>_$l^XsHATBn5o2i?W6`1)*l=t>(7h*mmTGh{!3 z0N_BW&BRjo_yQb+L~1sHYd59?ZqY-$+3Z<{l(t7cRBQjpzAIwDyYwbidk}3aS5`h7 zap|?AFQuCHx~b1Ut+?uWNgiVs5X8Hu1PDbIj95wmNs-*>9m-yxo@NChdG3&jlEm0r z5SgZU>7lQC8y5fwptkc;cNq8#nUb0%j0QzxxxP0{K|QLP2K|n7=yCqka1_ew1yR-N zJ%ziTgzJ6{bnPGe$3;ybPT1){w=6FQSVK^IbDVGeb~|&t7BGEAGHKSn-^nb zu41S+M*@Zy)>GXVZW@U1aHGmQj}k{IScELz*zbMbVk@6x1J!>c(QdpdmQ9HL&kKMG zik{L#kNRQzH5VMjuzz!lF)`sxCj(gF{qPZ%Fdre=vNACvrw#GwyA_kF2Pu_yI@e>nsdiUp}eR ziS&;YWDOe-+-4M*&?EJ=yl?;i4Ef@NVce5M#RHX&&0}A4@$Qku9-zl3_inFjh`{m~z z#^Xwtg4%|&66vs**_KkCN(@^swF?7E67l=v{^gV-zN9N0qPKMFV8}Qwm6>D089#(U zf1W&37l)#5qYLBQ#90Ry68HfP7svu2J_;~>$Yg>~`EQG+lBflr`_}UP;SDYKs)u3K}CV#mAa8AwX(r8Y!?A!53jXTa0d8qDo05wLZ5` zE}^94o_m&>g$dzAJe0rr#b*Nfd6wf|02tdDAFX6f! zP=eMzL`XsV_4jPVL`su)5&*rF5ykiCooK_$@P^^lQv|s^$;5WJv6upUnf1J~6PdEUm~zBwX3U*LLtTX$7M z%ShsGr(wJ~_@UU~M`gt8W+hZpNQbcAP!)c89&g-}(r6uZ*))zU`<`1>H zHrN-m9{-so2}pHK%x`G^L{mGA78v)-%uH`gtiVjIiBl&btG)o^PQd%mJ^sA;3XWUl z7vOX3qcSs0`xe-Cv%T?n9MEG97@viZg4IgqoRKaFxj1(xnNLGby9vU~HUx<<0BSGU zW|J@GjzjDA5;?Rn8o-B&eyQvpC)~)wzflSC&=JyoIoq&Yjea2_eH0`KVX!RP4QCRX z^1Cvy&HIX9MRThrm3x_hC+?1l8ZC(v$b43%)Xjm?+ZrbX7xLj&sx`HKSFC2ReO7&Uz}Mh(4I>zRW_XG5VK1q`hXU9 zJN`P2Li7<5G}6q+s~lC|Yf`dSq6F^JvNZiPqKgw>ym8kv?S}dz%rCM#L>b~>eu-I6 z4i-TIJ|UD=we}^AS+6~;-u>mao+U(*T{(sPfFFC|5z#!TNE_As!)aB50DdSpy3Auh zHlb)?l#8zb*5O<=sMhM^_!^h`K#3!bNZ|7Ng%lNjx$Nskl+kfCQ!M+*M8Q9+r91YBYF>!4Qb7nLC!9dSZO*gJQ4-V z7PW|gwYSr7wrw?4-)M?!GE!tC6IB#bBy=0*|G)IOodUuE09BM9pkZt%+7J1Y&Z&-t z*i4A97l*7s(@y5BC7oF!DY%lQ?Aw;g#6};8%+Pshsc#w|^rE`+!t^4bsOF#OJ@o+}XqPm?9gIy_9ZlctX2m#RU#XaNJodHR`{I?e5AvbM8 zzXh6Ru;^~GWkj&GmrElknbNslM+YMHU-qaUf{z`L116rV1ekFvDrd--*LxCjMwN7{Tqjwjrl#AfO6iZ2e1BOHq6A_72P3$N`@b*y<%2AM^+Dd*DP6FWtn?>ic3B9(Z@x^X70J`=^3?bx>kXO9JW=pEX z)k$Jei=t__0-(h1%gUPhz*oje*XN?fOY?28$B!xkH9Lfo= zn6eu^1~txTBm%{6OM52B3hzJ_=@|qjmzv4U=!-Y%VVoqw09%mjF!!}Up>1WGrd%Ej zZ$1&^pYi4!iu#{*l!K7oNMb=gE#_|ew()&&If6FG!Z%O*h%(sm26~1o8Np>sI>7j> z7+q=5>5fdb6$CQzU#FwGVMt)aIZ2Yyw6G=H&$?->RD!vhCRE?Q>~JxGa2qAf2L?)` zG19&$qeovpxUzd%>G(>=a~IVO@{D9KcG z11@{)oOXKVtKII}wM+8PX`q6YOV&m9})ya|-`#RQj7Z@uwjq z_U+#9@z^qXp`6orc%+0$b&O0&@muVIjf(FRZfKq@6d(rDFB0m`h6jbY%GTlBWabv7 zo5BzJ3q|=|^R83M#kgF$x~tObw&0?fDb=DMfs~!*20Ecn?0* zklz?A|GX+?k51q%Gz|%lIpDjcOUW#Q6kR|xfps3_UYT)zJgzs_ircjsIrSC^t{!QQ zM8;~NQL3MBCn*6{$`g)b-Tw$8M{?05A{yfa&e}N4VL_ed*P1R^%G0sYL^T>vrgbg-@ z3`EAk=?MXhjmU&*H7d~du$BUYj*Eo)OMr!2Cz%d*s8o}9sn`4M>t(Q3=1YBY}#bTc2;PI|}d<#Q-V1>$9zV)L;g`7U>>?dsc!@4fR zhtFkCxXWFCKN@LF)7NWz0O*orVJ6WuimbD%;uo$?LtZv?@AFc!n zG$lrp$PWpI^PHeOT^ogf$Y}v!XHmRutkxa^D2A=f4L##1M^}!0Jf;-V>9ak>Q5$*L zH$)X4f59m3jtgx1G$CTajDL-Capw|1H46^_7FRB4kWoMRQEc@)bPD*!lUHo(>$xJ1k3 zsQp$ijcCGgoW(V?Zq}f6gyhAD+glS1zs;@MCM=TfBmBlQ%MM;2`ulla#Gam zri>FA`(=fuI-h=cTllFnm)sc|EJE6a8#iNy_lDLF@wv8gTw#S6*V85hX^F{>oPq3i z`wE@qp~0f>fJmZ`j?>CoIt^(lqO+g#T*_D17V>r4BDb%5G9n{CaG0#s?q0PPZUYvw zwtl~Yc{=`Xb3>J9#uGWmmbQ{jZpWyl8;RFAc6;vXqkw19M3jQuY_4SUy|CZEVnE%r z0o5DQ`g2kf)?q5OzwL9<-YFt)&!b^A1e02}RW?TTOK$Xovk|#@Lbg(pt(&cFlgWTN zm=!vAq5^on<6hF5yJOEtguw64xvd(7q}S)UpbRUrNP-L!P;-{Tzdr+g2kO}Swl;(k zhUH(rGYWkqxFJD=hYG>ezU0|Kt>ma(5)9*-@5hk{{=kHvO}DdXBbY6qC1u4i)R^}n z0hk;tmM<$wfu|NLp*OLGn9_qkkn9RWKG;nfYf-$VDNP&2Te52#mTgrEv=h^m)9w#U zydXijMg0X6p!bfbLUc2uvKgMSSh0x9mip1;Za~*@;#+?* zajh`|LCL9D0>$Q>E>kr!BI%*QIwjp{w1$NSV@Y#qV~VpfSWekM&2S@Q4ixr;9|GJD z30g{`|K4BOY!;st4@e8m&VcQ4no^Km7Z2-Mo;_y<=jCDE6RA6}_qIPU(8I4yaGK(d zX09N#gdgz!ef=qB&Oo=2=^KZ&~-Ti1jNlf67v?--$maRL^pl^ zE#x^qoNp~ungzDk%Wog1qZnSZIBo==84DTv`$}WK)QN4{4NQg}OyT3fCL~4kKSIL- zZ14l5xt5=GI#DLfpr5fZ+^*?w~iu@mcs%`25zbxpWW}3?cIRIQ< z@YkGOk^e{z4%K&qv{_K1e2Yq8?gJm)`FVCPCW|jQGyuozq|Y~XwdsZUN)G9?$5SST zLBZuL<9GO0y<0MqHR})q`3GGxEu$M7|LLZ+>5ztke|w&Ce86@y;7(0_dZ;wrBj%$| zz;c?&www`IrrZ+qGTWCds9*u<)DdMasEC;zPv<~GHRq490r^jo$hn6$Y6d~*(UuJZ zuE9R5_Re&FF4jLcnuy0*OP&W?V{TvHOYO$pkC>vMb{wtw`@=&+!i@aT3m`>=fL9U5 z0S^ZsH0sXLF*+Ko23e*zHKJKF&+Es2?smcW=F;+7=E;Gwak5Ys6QD z^NJCatI4s8<_r;L67w?pnkVpOnJrTJczO&HnKeYt;qmdK4QrPZ0S&chSVCg=yNLg} z*WIin8uzkcX9xSoa@SGV(L&z4`dy5b5EX~?EXAc1g$sv6nmYK*U-1ch{7feX8IY^7 zd)=pROqy?9l~hqMC`1-KZX{DWg@hhkFI{&YXq_^SR3EB9t$a_ij<(sbq7p1VLe75A&}5NlZ0}HKWjQ3+U6+id~Gke z0x!I~?p@~HpKmh-afHj@=nVt^VT+jqiC}oE1oN*djyk7Px5c+9&~3c-_db;zwzL}4 z()-VZE=(>S&jQ3&V)CF9`6#PfmQX15J22ya<30LU!PNB zp0pU%nOZDGT(k!8!X*qsClSf=lN?d6`qtSkF^^NSoOm!FXuieMkTR}KQG z7HJDKh!-nJ{x`<*XV-xuw8dh=5|IR=GxBIKGIbdO9S|ejscpo?hr6qu$;0Cfq>ea~ zMS!FF9l}kS7{5z}@q8_c-UweRa5L55UwjL<>i2}s)j{H{AbU}Uy0@bfr{XxpA7l_P z2$3)(|7LWg8*4X|qJ8Qn3{ zXat(*t1}eos4c?>k_V4CIfJWoGN%iNMe(W#o zqSnw@qm_KR6$rvGAx?&!Y9rQwe(_J0-!**+C znS672G-Bd5X%eEaM_?Q>4G#OGozqJEnN(j}zI@bdWslVH@PePAP?PmVASyFc1K1`Q_UPguL_Z|ElmR*+;k zzS^F(IOx|k&g@t1HHU=q5}tPa__0K~-t0yjNCd!(tPl~E@hZa$)YkdHqf3AW5IOcY z?qXDzY23<6?7oA^z9Z<8{IR0|@tNNyVaQv0wWs9%^roy;sBQrIVKrooERD#BP4_|)5ovy(~XMDeAY`pe#VkkeS> z?L`Z9U-NM3$@!vC$vvU;Nl3_AMA4nj*lm~!^cDWZbK``0N5#jFu~3BSXH~a!mX0UW z%QtY`A#L_cE^uxDd?yIh`SbJ^W;e!9mOg36IQ=f$a=hX!k!P&`~ zDokTJCpDO6fe3{R(}n!$k)>Ewgn=Bq<+czzi*!WqwIoxx`tr9eQS3Ns#WcgSRROhE zP3|L`i_d06V@dTZ!_y_uqFHV38%g8Or2h*2$DYNK^W2W>0A8b-B7=o?% zHc>H&It~U&R9g)cGlMsWg zW5BKWTLLfb~m?opX5z4lwYK zz7XdUYlai;06PNO@9{#n@OuB=A1+$&s&oRGWbBQJH6xVYJ+~rTNS_$~?$_fHY$DVH^kk{^2_QEe}i z#O9hgRv{e;hJR8lsjpDfPwW7Tjk25!Hv60S7nU^$QLt?ve1Y?ad!*J~K!7G#KOUf(nwr$?{jpN- z$tR6tb3}Z?ehpYwEO99p%9WVzYooItvVJe@1W*uYPe}3MakJ8vIHK=HAwkh~GT$r` zaS|QL@qZLXJXDyZrb`M`FUrds7C)YLGVDIkn^M`)~ye;4^p#IfYjF!H1+~|kw;!LJSozTq;+eW4gFQgbyJli)9feN(7)Zy+sq?+Ry*rC!e0p* zm4zBW(kh~BaAxgj>riqNBB0N{t^6s@;!faFBeX9cd)Edefyet9%o9CBHM0)r3?iRS zYQwK^EqXjBPWdQOf3G@yXg$2T?SbW@{8Momm@4f5t$?}Z7fLAUq65Bbzqhm^Kt}e8 zN>;1o9^uA7Duh`7t%0S{%ghk{oxCklA(&kBh@A|59$eHPfmgQhS@XjOT-M7I*iXoA9;`kq$J1`d4P2^k(~-WrY^L z3e*OFMIjg2c}r2tNsE9hGTi2uCGeO1oUn^%;+Li)=Cq~z4wDBTtU3Oc-Gn6&Y6EGY zrKc||TA;!6goiI_ZaGCPM8&w$qy#(?3EAzS}fH*@CN|+({Kj3M&Wia(Z7V8RjoKQBOKtPk6KQv zsqD+P@Y;TcNM0GmqJyV8j8U{o&qgEZsrr_wCPcn6Y6)-kX`U7d@p3)&v}qjO-=2a z#2Fdp9yCxwffHeZ2s0{BXF_NgTQOeFrK4Lv40Mr)?9Yqwm47ZcV)w!|J%S_vNL?4? z5Hw3DJv&uTmFp1=2|Tk0uAHUWri0Bh zP5usQJcx2oTs!iqJs{@qp!A1&!Rd{xG_|1~&lhmgtL5bVp;wL~o@pXF9(;19j@DBY zOOyI0jlTPb{^z5rA=@4D;OZQlPf|BKPZbiq9+ylL$1+5pi2EkI@5o=0#;mThzyXi? z-!3h)PJ?9U5c+4%Q3J9MEW7+T8J1_#3`C7sA-30qjW|vK=oxfA)U_vY-bW!;fkOH| zxe}iwKalq881-`ko0065`lyB(SN#bCB}lgmYk1swZP5CtAiSpm6-X;;(0X1Y1=!Dio>kM; zUvs8OEvVGH)Ldd5(0edl&qO*eaC9!$UpbB3LL`6|D|aIZMm83!-?4QY{ULogrfr9` z2(dP~QdBdGedOSCw^--j{A?xqFq66ce4*j~vJLca=aiJNelboY)YAVD*-5&F=8oZ9 z;7CuGj!h_J%!5#aP=iFjCf}=GAdF>GYlwJ8{tz`#Dj_q$^|H&)Hp%{JumuTd3m(1> zj0+J_`%6N5&}@iG@Qgytej_8ykQ`nKM%W{qW|4KFzUQmAO-qD@>1aWefT9c^M&GjT zoX1PMeY496#R=(Uaj^|tx9M2dLAaRcbX?T!f|tfJ=cp82gFl%&{~TuzJw#WV7RTpEW}2gaf7i0Z7Vm3YnInaSPssLqYK z<5`?4Z&)6kV1!P1U`=Ez_s@OZMB3m=6_tA?3EiW zIQLK9LGR*X%vjNJ(7V>eMTYjV!90t{LOv#z@G`ppqW&F~m;KSA@;KfbO4g0pYa^PJ zewuaTDHZwT$4~M>4-qPA={(9W1~&p;UQi0)C{%I#pK->lET?xiR=wDa4?Brxszo%I zR$p9p%cEB+do|Nb?u{!;?#5YaV&dQtUpf+;&?sAOneWRqgE^oiOZp83^tczku3nY^ ztHo|KNstxgjKvTV;y!yVNiJLvmiub--5&>o(Xm}WHGkjRB@bLN!vS4H;_WM+g*Btb znEQVjvO40y(^UO#UUfs4=~tI*DLA#yL{Gwb(KH%nUR0aiL*B5fXs0BG*t!MnKzZ21!b;4zI|6s5Z|Wj-ykk7zsdp+kk{(?$IR zfqJZiF^7bWJvgttZ8KS>b%t?0;C}R>u77!j)dj0~Z;%aay#_p$$cq_(A~r4-!7- zkEjlaHK-ktJqL5vTBxPyi!_2@l1i~M#eT&yK_JJrN5;qw>paxz^J0TbRerUxY`C zYNfbf%4*1&g$gyw1e0p?>?dJBVeHb{+vY_RC-i4kX^D2r0CEPg$wB6y@iz`$8OAdl z)&TFj_0~GW%Dj|cx3BV3F>?_f$YMN#-|p!KTvwy_{4`RXp408az}Gtu0B7};QA2f5 zxF!)~STm*^^Db3Bw7S`2CgZj@MynGXY{lzhHL9$%Gw@1z?i6VB*QfX2vZ)$kk+Fk? z*CekJtcqLqVWuS4^LF%@sZq2`LcP9F>>{Q1^xLaYs04(v9f3{wk84NgAwfH1cGhHz zPX~~a+`_jSBHVvt)KMjKLjO=-+}ivxyoCJWfw^PaX?^k0LkEl^Z(lk`NRuR=*^?%l zH4-fceT|h;|4r?wXcv7Vb~t7c9XmZ=h)y}S-rJI+Lcz$XiDQ>u5`uz=IX~<1X7i0$ zx4rj$CDtl*XiorRq7;Zk4=<$zjVpg5hbF+zuY!UEdWW9WB>+kYhJA`+mQ*H#q^a^Y zj*_b|dnJq|;=GAb-q09PC2HbBsM!-c~qL=oFQdb09EN$E4Xlm z`I>+JFd|T7DB31`6gfIU>7)WXxd?|5>NB0^^fgDQ?>ou^lXG!J>1R|=7yUR-UPZ8X zqybVl?N3k3;)O>e)141g7yKZFpSrmPFFsVnAn@d9qK(gW=)!_Syd!{(a@&qU&@QoA zU>0{(UfY|7IqZ^YksC}nbUG1bKc)4oo%&X5P@YNwa;SqDj_@3A3R2^~d)oicpn!{2 zZuj)a4Fyb3I1JgF@mfL}F7w(2MXq)|s4qB>mV84B9?1ojN1|$(#JB$`WGU~FkyoeZ zT-_sp1PU&`lOhBo29(w3(Vu_PIk0s9_4NHQNJrHTW01SggwOjAS7(LrbxEoRR0v!? z62RtpZAz{nu0_&@MSVz%_)%;eTf?P~h6=F-HGa?kagfKA*L7Tb2nEt}blCd7p!g{b z0RYkQDv?VA=s_T7dI_G%VPgdqn@HhW2?g4BNF?I5A>?x^nRp($f`6>w_OUD?LpRAg zaQ&LFotHbyWQ~^O^RM^6qKn|{!sgWFW@q#*>yi=r+xg9a9z(EM?T`2lxS=pbXlYl{ z!q_@FuTjo4gj7x72OBNzR)o1m2$H20a$6CtjC?SG=~yseN-`}}t#wYnR3C9;mkT`~ zrHUj>1Ip(aWO0QG-KaTZa|~@tH1Q7RSH(@%MbJV&P6KzIR6UFmCdVRKU6`+O-**<= zs5AO!65tKIQ2mvS@C?U;pomy)KT*a1G^20*1$rvM>~t5=gz{6A`}DV`iC(}Lry4~} zG;&M)Vfg8sIX5rwznHvqOiI}Uc-ugI>RrNj07u(Iw2zf52UreY75{dBgYOL(lhu;N zIG`+n{7NN?3!`;psUv_Fpyk-z6PrQqA8s`;Kg8|K+PRPw_iOaaQ<7=qV!@ZtYR=z0D!f@fuH%ou3bca_1jp+nZwbh22_0{i)vpa@B6#~HU!a)E-O;oUbY)B|l zyLd4B_jM2NSNZc3*{c&HB-k?yRRZ#io=ioF)DL7*Qm{Q9H)@TE@1fq~_I$s&6K z2Y5uT-?wdhUdTT7k$kI{j&256)`s#dqH(l>EJmt1Zep%Xp*wH1kk+@b|%tcJk^Nqe3*yi^OpFg((P}wG^3CzY

vDky&Z7IH+P+BTHvtq z``ZgzOy)Cv(yFd7dkx9$u9y%5>ZS2(xv)Eyb4C*h+3?<%PcGbC>M-i-COnjgyp*YY zQO|6ab+;YPGXj^g-~6z*>G~<$^>H92Hs1xifRYTP%I=0*F+~e}XI~ZZwa&l>ml&12 z+{+rb}I^3QHccyo^ zWpEfzDVlEh-NuF@Mw=sAEL4I;)7n|Ou@&`r373Y`V!BB4%{#RO<#WZ|EcItZjU(>U z;kQHagk^FcM18*-Vjpp9%^$aT!jiHNSveLa9R94+MJSkz`oTD<8ex;F1`ur5V^a}P z;hPOv@refeUkxV3ph0=u(v*jM!DySENiLr`a+T{+z3I$-i zef|jq2s~G|fjc@nDhrzs)r6E!{fQB8Wcud|dmELs?1aB*P%WjCb-uSf172OhwX8Wb zTce#7N5d_gnI(_wegOj|wh81&UyCDiXy~+zRefa!tS0T>PH7C}VP>nNOow$9J^$Lj zq)185#On#V4qtObs8D+uLIC4L`p;F&5$iGcn$wnDe%#3$LNpO9HH<(5cFn~}6i%BO&N=Wp%@hAvHe{@6RXGs07l@O(mK zz{T=3ZefZzHF|$$m@DK{NOP>4&+S3-_=i=A@L`^yB+!URLMv`4RU(>1KfrL2D<0C4 z5*Vz24*@Vr=&kKzSK;IwFK(c|ZlsESOZJq9kdIX2URa=WLWZP2lHou$+iYwFlh&kJn5`O;@r47GLph@&n1lIoxYyrc zLRfERm)7ItZ1MWi!Zx~9z{R8uVxxvW93i1D`etJH`!V+hMVU-nv)(SOSr5$gCV=m16!a%PaX{YJ^VcR+bFg& z0di&k9YnTJwyl{SGI9=|zS(b!uZB!gca<%1sOflke&^$@WagE?d^+&H!9Qod5&DJ(@K z12y#D9X*+nyt(06BG%56LSeZ4HUG7yf+{U6OF^W!k!{V!!X%eD8vG%sH;;^h5fGy#k$ zpjCUzC(pjss2&+VVRS2RnOA`$x9t<$HX38$K*sKhZ)HG!i!o7X~mvgMR$Tp0h;uDiPrqGOwHa%i*2JJ3^`Y@Cv3^J1XS?1M> z&6r57BSZ?9B~n=A3=V|YPwrBtXvD}2s==c^;nB~jVLWWZ!JhrOY)bt=FDXhmHu6K5 zZBxo@1!wP)4}`w6_Z$>J4pGR=g)M?wB5!X>)wxk2Go?6DNFNovA3)iy(3HxEN|Xhg zqZWT*T3nXawslUPw)1_2U}Ey;q)5S|!hRFH1kz-7I`g+mS)Y^BxbFDu0K^znqriCC z9*I|P$WfDxvb(pq%XISCkGf;(RN@&3y78SL!1y@Mk{a0An%P{}_nTUzv?#n$$>iKk zE|4=)Au|3h*9`F$4U1o;llTIpg$em|&D_f6)cJ)1C|)cWLp^#P+qZ7P%oIJ+*7$n@ z&)j4ft5}@HGbL5DLjRCOl>bVW_hx^0ZWVCV@%PGGA=b}Oa^mAF&qE^kJ)Z0-BxZ~< ze1-}U%Uy=VVpgO}eTl+td_kV>x=n18T6)s7^$Jhb88{d@d4FhTB=^E7-md`mZ(EK zQ4J$&E0lvP$>#FB5&0zy{dOb>g#reH!~@-yuVhLO0D5tI-=F?z8tWXYSX-_{Pp; zEILWyFNf;3FUJ{vzZ;C*YE|V$Gx3IWB+yWk{}#We=AOZFZs<^9{B>R`W+T$=0~}YP z6VNCp5sLS9CU<2%&(X~Wvp+^!Iy`a>r0BjmcMe3%3U6kY{%LGc<>bG<8OfuI?IJE6 z6_!+&EjJ3BwPIyhOHGiYq5YScmd+LI0&1R&p$s->&=#vu z$`43u(~orxqMS6OG34ylP$*l^dYW+#06WkgYABt>ig+fKrsdPZx%+?fe*DmZ1LXDd znmek|fQNJbdYAoS`h+{>E78ty=L}icAT~5yI{CxWAZGm?Rk`NagNDd!19T5D!k~XV zyYbJ3Dx+bWLx_Pj|H28}7%ik0xylVnsvo*|@Wtg~_5XhDn^P}zhBr{{qX3Oi9_J7N zKNA|XD3qbmh%&Ewb)))whDC$=!VFkwHw)2A550P1$RFdI6!tKE)x<6 z(n~-GIz0;L=TABRbmo3&8qo?tLsbufH|uXQW}P|R40SY+1aP0C5Tgx(E|FSKWTuVVAk?*zP^HuUjQ~U*o*pa*NjbQS#DOmS5a(l}~4! z(|571iXND=X0RLd2~im!|D{60sZx)KTgB{E%?+Xz0o+Y1oOayUXz+UaehhOqEGd6F zp01!kPvKr#BLC`um9f=MlL^Ir@Qj>1pj9j|1Sa-9|hyIiy+6$Fx@b0_X0`sFB(jZ=&`Gv^hYZLkP zY(%j){8|W4ICMu)p)-)S3vuo1cj=Z_1ZNxptv$fffP2V&7zm2SaGQ9TLO-W3!xMr* zZ}7ivpRo~Xk^oQO$@gadkEU~QkE?sX{+ZZnY@3a(rb&}Djcv5C&55msjh)7}Z8x?X ztFeCbyzlk>6Xx1;_P(*!XK6ws@Kbn{fVaaq6k@03-4e{FxD zsNNG^B(FD`y3&<$6KJjYb!XNYik+Os1&e_GO)^U%16$*@%&}nML8C<51GYvq=TuK0 zZ+E%FOXCY!|4n=^+-?Ea1(He6>LzsuBzvq`Y7Zyp_XdB|a)BNgYE<$vMEklL6-^hm zVU+^o9z-5k<9{#io>+VFg#h-!G*-gOSMdZ`qb|_TN|0t|S~@3~CJrx?((gU^x(B!Q z1I+IU(J9?z=1Yf52%HHZ|NBUO`*A@)6nRtXGr}E~1R3%X`1}e4KoA|enzX6o?jO$_95C&d!wBL zgIo{V7gWzz?#%QR=2N62akaOL-dDO(4!(xmfvLY7)6bufur}1>4TNd(_hwyr0o+Qk zShu)#419N}4F#|j7p)9+R=>Z>pvNc!K5*Der8poS5b^!nGG!xjbCl!(fd}55udf=S z{-%#J%Q5U)=xwHM`8=Te`K5N9syl!{2*rb>Tn2WlSV(*0| zLiumNro22#jFs?=M(UA~S;Q;2JJ`9r%gc4Q8mF;iw6oh(GxA7vcRZUaJp0V%o$^c4^CAloNKdLdERj)7)omyx#f9pt+-SNu6foDo{JOapfX{sMU+i5hI;$uY)-Jt-5|}E0H6Z8 z$6g#s2mG*r`(C{C0zVM>b&2rJX9=1eqF8rf`RQ*T_Z<<+n|;ivm*b3Kn&%2yy@;Td zk8hn2+IcEksaNvlQrFRtffOv{_xVB98M(11F-t-P8-b44*H#ybpt#*2KEuOuHx~dm97n+tVPrG_g#h16@;(BC#{1Ar_@jA2u1gtduEq0Dk^{BhV5rl@2dyShQ0`%}$SJq*AKR@oF` z;LvJ*9%bR}SFduD;%!EK7Euz^RVSt3-G~Ljkx5K<ysqXwu5JfXK!+Y- zY#6HCB7OEe^GgADu|hPzP+)@zO*h%w_CbQ1pYcenK{~JBTO`%{h-KJ@s6waz|n`u@~_flYB9%Sein@T)+ge`J*+>2I`zu;9n#r)vxXnv{7kr%gC3;6xROy zY#S{0aAFEszic}1ZmV!$FK#kA3|$YcIxXQlgBQjZ9AVRLNgU8KxC^w?-~p)!esRs- zT)r1fD`Sj5gnpiUIt`(84kgbBgW)||O)KQ*O65LSd{k>h6tKmDE6`wv{n0Sw=$@_7 z0$KT^9*C$A)UAwXi(09J0r0WVks%as=Q?6zaG_De@$kqB-gAC(qs0Hk$Mq&WXmNJ6 zV$?zkh_2pNf5A9izH$koM+%BY&XRnD$z=~?-X4u=3**jT(I2q32n3MY`5l-HuX08S z61jEv-|ydVvXfDO--^=tMJFJj^|MmGHil`qO|sxwYRy8mr~bcu(G~BV7*XBYyfYB+ z2ck`qy(za+_E_S0s0u=OSvSvf{CgRHz+&gAa#J>j0CLwQdwv*7pW1XY_(D{+yp-vq zKKSST6{uvoMQL8C*@N@qBl@dhe+GdgXz01@|2%a3TaLouSMb!c(|@z&(K{qm-unEH zP1U)NDA&3H4om1)yr-xbf9(pfbkC zde@=FBNB|q?%la|hPGn#bgO1ygAvg2Z0Kcg`Aew^rP_r7_1vPReYZm&29q%-`}q5@ ztjWRahOmGB zJ55@v=t?aBDBx=UXFr7OGJTxePg-nC8LqBklN zRUJQ$sKrFzqeY(&4xqbkyLeXJ&PuD+*S+3;Ei>vd{%D>z;UMX?9P>2m+p@D4ClhpR ze!O@OP2nPYUm8+1ZjuzxJARxT&F1hsc)YMna+&Yo%$+)o{rRF5USDHSgZn!zxWkA# zzq&h&gyvU+Ka@y(iAmhbYrBEu+p|!ySTWyl$V>QQ|`)OcB0`)gbg^BmDl8pu? zN7!(;*ua*^DX2OxiQV@zq9cI&!WK&gfNgxgWg0)^mHp=L4y4>_Etz_AD3&M)3q1VTk(< zoIhh;YKgX zEa_kk+2qDfVb>My(1v~L33lo>aJ0<1OxK!A&-Igk14QtE`ct(58n_IYQk4?g{*s;%*H_~MP#u4NWO zOy{wysAV@sFkOyqy=olw{C#@e!Ib)RUUAGt@Gt8^)O>y)9OgWbzy)!2#YLKV!rPo^7{uN3je#DYc2t{zplwxxD z#$2OlH5%==l!mb61whM%6{piFM4{=tOECA~33(l*dq3Dhd#9pVRhHyYIV8b@Lj`%ZXLO$w zx>T)$r;5|Rzwtle5K`(}$1+)*&;Y}-l|A+5KbRNlnK4dlW9BQtEk>)C%gg^Ag7%1< zGy<&b#9BZ*-k{d#Po;?TIRwOBQ!i2`H&|h0z_|cFiND5W4C1}+NxcGH>JJORcZtIc ze}&QF6Qv$iAKJ|m0PcrYj6}B2$&mBTzRGVc{ooh19hRKAezIBV=Xaw82>~Y*V5t;~ zuWXthfjE~r+an8Pu$fzeS^ZMj2tin6M%HIVjF51ilu?yhcu=C*@H??v6MXm7iOm+Q zdoX0%;k8A+MOx3ZW0FD(ld0%vD!~i@%|}YrtfQ}`-YkjmiP6K5JyIntK%R$gL_Mpn z){L+6%n6a2pf$sf-o4HFJ@p=_K$g)A0H6jnzJQttzti`NJ(!ZN^6AIE>RLMXUBk^T zWbg&?S6`tr!2x7Xm!avxcxNTa=j3{IhU$Zb+h_yrrj^L$E#WiNNlfkHQOj8gZ5gBQ zPxESTRUQ-36MAmz>$=_}11v_d4*a1Rzi75SY6A{E(-0PC9~lrfBik31yCTja0rQ^> z**(XZl+T_%)%mC4ST~&(F~q{^<$j0RCin**_Bip3!S{7}eao10x*lhI#>ZL;CmLURMY7=p<7QXq21agmZ?wKpE&4~&tk|**R%I67f))Y&)OEBL;%R|z5~h^ zL7MV9m1mowATcCRlyoBHgZs^gS5}Ae$*+U7>=B`6v64`*W=vL|A6CvL>yZrDvEmas z-?a4He9*e%^4LZ@IQ3oUEDzG1GD|%a)vJq!b-y#)f^6bLw)|FP|H{Ee3e1C+I!z8s zgMh8cVEe!=st=yZtRk(-a*T(mT48a(h_=&>wcJwxQ>D4c^Mz;wC2)DrwEjmIdjh44NREx9$ph8v1hBsGc!O#Fqlo`50ACPN@|n{z_DM^omLQ;ZE04eZ-UjgFGU zo4^OBs0LH(%!!)gaK#7%pOcpxdQT%h>;j&81h#qae?kUO&<+>MbRx&*IYy zj|hQeYngwp)Z45?!Xvy^(4dhWK~d9T7Jb@m9wKdu$pKj?d8f49?2Apo$(EBP`zrU;Nse$GHo{dB+nu*;#b{o7)_Aaz1Hq|x+GNjRY zjh9G#JAE;>&T!bg|IA_ZHL2CK;s70{uFQpjx1*|`+8($1Dg_yUqtyn)XcX&=gAfL$ zvd|0H8iLDfKd|E+cbw-@(=KdvY&{WwjWJ(7U27?8dH0830Dy-9xP$8cE|(0Qvvg@z zn19$nw~n1L39z7NUd8TLJ8SRB;0td|@B2B6rAD5QL`IN5%?IjWdB6<>E6~2L3BjuSAzO-Ey`LdI5Ave%uz4-tmX*JVKePpM z_~GOp*IKU}Im2uh)+~60Wbw_OKG`LFQl>erysi=gGAu6nxAwtAUCHMa&vHW?rBFY~ z0DyZ@=!FQ~WZufWRwH@ddKN2!pYdrqu+Hq;+k8|?In^Ni10cUhM_QvdlYFi z@_hO0o^Nl_G*!}h*zQgLrMbPXOwWrQ^wWG2nh9GL_uRJmLMdHro=e*L#QRuY73wsX zu`ug#9Aw>11@p5I9Ca5k)pbt=074-Hmty0Y8NrAPWZ>c$qoBX7hg|zz&uv{y)MAjg zi=LE~MrVJn(PlM&_Mj%QytHeVnGh^vM78>5I}CeRmA)LC@i=P+IQWpD+Fv=#$11*hL{1wUh{6Hc?C)_?+D)CplYul6lk~uZC zjbaUEi^LFv(E7|qRe*xZHWE@5rsHGMAcE0|b78Ij?OEf7oJq8(n7CN8_!s{sa38l; zcVKxS@#?~wg*_h%MvS2Axo!>o)+kd|-l|Fk|Gqy%5`l_88Rp=#!)L(;@gV9eEdG)B z&f5UIcEf!Na8qZrtw|xvyt_cT_n^X5!!tDbKV}L_5t%zfsGR9p$lxZ+edp>R+Rj_@ z=7b3V-mmp8EJZH;(YfhK^YQC+QCM+RGGxtup>jzs(@tUOBRah$z^ZZV}Bb z-`#=1;^VO2Qm25bx~kW_!mrVT#Kt(reD&Kn^rCk*bPO+v2=w_9bNR!SW4$jLKJkyA z`Qgz!b!Y_Jlm5c*pEA0Nh0iQtf#&K2Q=DezV-Y%JgXc~C(XPkzE=YNIsL_?OA9>OC zWT0bV71gZKQ8|a!-rq$dsQHwf+o@9Fyv3NyjA2YL^F(Zth1HX&$JJz=J5Kd2q$C^H zmV?P-caYLkbi2KV_&NiHz=OKG2a~_$SqVp@>j%qoIXkp6ba4x9GaW#5fJ+V!NH2c_ zaSgiv%x8Ikc;$+`HP6QWe`>-FDj+sgh~pJ?B}E$5D8;<2ViglhMBh0k>%z$?`(@Tv zcdz45VjvW3OM5zm)OyAVZ{l|33axM0U*jaX|o3etd%=N#wC1Gr?%3dA<1Dn=dzINVrAh_k94^3M6|ltotz~6-+!> zKe05odoTY&0|LeyR9;1%W@5`rubWo0y|O213T1uSu3 zV;!-PgWYpF6!Ky1O_NU7Y6A7ay>^(%Vc!yAV+ipZ;T#&#$ONzpYls5$hVE8L3qf|D z-QU(^%HKsi{fmWPEeJJ~`Gj=@<}K{cpEV$~nbsojn$I?Qs zZaq_#WZt0xvFyN_T8@dr-HUQ)@S|m-H2Q@u8W}S+-~OL?X|tQbEm#-?6?|o*pTAm= z`nB&*@>tyUp@@y_GWea+wqU?Wr0n3n1iEkbllFF=4*2RPeh4`b?{Z)00u!jR5#oD# z^#ly3veqjk#C*)S-|lSNB7@zabFFVB{+jIOdgWC7Y#-Vxk{l-q(_;{=#UD?e_~uG) zRgG;A4`4f@U~maI@Z+_H3h!Lvimi)`e}B7U`4k-$iX^2n8J-l0-i|b!d9F5**F&R2 z>;#z*CqaRks@iLRrA1M)^tB4VE{Kd9*@-Frxw(M>*u1xq)nR~XE$v>5_QXsfE8Eb2&9(%qOxVDs6q;i>Iu3jPxmFAdq{>woxfe9yF-&u#}_S>NyM==w-u+VT>IJm7ZAcSt&~ld6UzP;G+; zmE8()I5yPIfO*3`!eHTc806L|v|qVvPQ4^5tN5mvu@>j_X2r2Jl`6rxme zN7%d*CWCRSwF~029ir?fo5q{kZ8&<=v`6z}d#B>SS zw6)(BHK|w__Uep^ti2>Z;C8!m7!$kZn-C+&b<3`@^Ghvq01!KymyQKoeMa9E^2OW0 zfus^*++LNrTJ(dZwZXjPP~BwYsrn!mtJ(O~hgi`KU7s`VGTDbVNO~BL+qw&$;8V+I zD5mA$LJ@*W9WYgulb{cq_EW2ehHicJ^`h(d@Wro0R3hcaUP3=|iEFBqDzIqEuH?tj zJ58i|?315Ir6=Iv2}woV}s@@snXmHpbsrIwRkGhTOcR>#Pnd zFE{21DGP0-*J6W*x*75Wy(>K~d*G3QVUFk4Y+~0Q0`&vQH$${N%nAyiZM`SFckTB{ zZdc)G=pOAj;QpJFf{(XYi^$O0?L+5}ZSEj{BXDnNniBqqO`w{I6q)W&y^O1LhQ$G4 zk^){%YLo~xl3(Hq1q$B42Do5`UK=>Z0X)Ma$pjCGL7zk{fpl8SqaBMFpX7 zeSi)cc$xV51q?--f8Ycm?H`P$bS5&S5ltTo=`Jrb+O|cQIhHV&PK)$17@|q?AyNH4 zrksV~Rrnz**yrVa2)Ge2w6R-njQ&)vTQcq-*`ylMJJ2dg4^fEu>^c4(upu^!R6^qO z0+O9rHy$h9xG((PpVQ^;&aE1)Bhn7s-2#77a?QC)$a`A~C>ws`hVYaByxjP`eVCXa zgIJcdlTzQA4Ahq1zRQ{DD`fMl2w~{m#wCe@4ujh9(4gZHH)nIXRSKodQ6_XAC@y)} zNmK~fF9i(c?Iru1psZ^5vg^W9Nb{c1RAAawgTz-w-7kq$C*8>!phdn$rfmc*YlRT> zzfIYKeMPazZdrkc%8RGU|18?_M}e3%W@G9h^Evf$C40Za5VFP?xaiU{Z8{-5p2#Xr zju~qR+kMy7Yt8x-`Uu*KEiod77vc$ER)#{EwNU?c0ChUU_JA8eZZNw82SsCiro6`6 zKQH6B7i_#BUlQ>7JP*3Lj%*@lg%KM|p3vc&G#QGWF}{E6eYoO1rCKXDNawBwF3PrPR<6yFYb&$hp9i$ek|zJ^o= z5It+L0i+h1&V+fzWl>%c$UzW>CM`qP}Acsgm_>IYJWX^ zqZx5!EF@ycCP&N-$3jd{ZjX|l3?POB6a!D)>7o*>(iI36h=k!3L1+|IOlS^Lj)bMA zhQlV2!cXQ-r%N@)m=?N>N7^E}7N1HpOiq(FG9Mogws<>d{-Y&X`MTj)J$FH_ zZ_77~65r>$lqf{ZhGW8Q8YY=puX&`TfX$7=+9;!a{_zCw#&87f`?m4{MvwdiG61ig zO=%523sF@uh?0)tY>htv6vK_AF!D^3V}w2@iSCmb@ky5;7<+4(J_*=8#jTOFgIc<3 z2o32#ezCo>9)`Xw{~;Wig~+7zQ!4PP$|H@OeQU8dKk(W6NX`HY9`^Pu{|#pFRG&6- zCShqIWpUTLVP33KWg2?RqAdJBSH$43h9}-HHTJU6-$(hgyT|a`Zu2j+=wgSRe6h8& zR_Uf$eI=;W2T;xU0C~CbH}T4(Z5=`kKAeRtSediRq5cDmQNeHWQ46b}Sgi}Yg{l-d zAUSA=5%^s~<|r&aBOccq;bgtm6{whV9jj}t8B%R{wqmmIEj8$Y4JL$_cRe}bgY#K} z+PEj^>dOzz_wvn&(}$k1p-EvFtStCF`QVwhS_5m?2>68$V$pJh8fG+b0?e4>&~eX! zesz$>`fH~EdE$8a(&|6pWedF$ zAM&c$@N#?IpV6e|oH*$3>k_<)g`1WOcc9K?=3KfF0CpfirAmCOGDV=1l-$@n&%H2dE^R6B~tTGHU{tv#w&jw z%rz6U_MCboi6=7&rny8Ds(S zZ-qF(j=s_(Nt;I3mMUg33*mkocHD!+-Oy72y0M$PKICPsBo9vk6!G8T<9g#34P~1D z2=nQmnuu^5COg4lYc{Oq{aPy-HXhB%KZ8vzb^v!obNly7e=%woEVIp0pCNmRImCg@ z$WZ$jGXL#O#XT72R37SdL3%o4ds#(Ah12i--mi-k>fyV^v;QG88qjJW+uyK}EfJJT zpY$FR9Wfz=we@RmqCe;<1e*VcTYOoG*?mJEk}>`+h8Q`Xh69F=cL$=WJjZB30W9q= z28pnd-=GM|EJv7`YM`k2++h7EprE zzJXIVnkvL@@j7Phn-NMvxgP2;>^$NWrTvoUPxTw&M#-Xm6h|9vXc*Tcgo5bJ=QKur zua+W>93*Ez^xbWv*`q7M>RWXY5-S{2SJ4Rvq_g5U?;lPAc?oI3n zmc!TDEUGYJi%XJpJ&GoZVZ4!c?==fCUfWHOW}lEYD)sZ!vYAH zF!OS~5M(EeW`HGzhmTyN3xvrhK_YmpSDM>|C)o6-34BjGJ4UmD1%d{qmETs_>d#LV z3WD*j812rNGzt|FtZ-mvh8?)a+8T8+M-T%_K6V6`9`#1jQrk4G@}&$535{1c^CD$B z^M6N#?}L&lR3#c@qR`dY0b#&z$uinCT1KPJH;G}Juz+be`sDS%g)rYSjZwuVgh+{ry&wXnuuVq(|*pHkv|N9W^TY0**ts?XyPRhFmA%~k9>McI-W zuBT}!(_waQ-OUVq4>FMpVtw59@%^KUm4PFWQK}=vz^}I0tm;%*7yq>Al|OC9`jJTl zaB6eAKr~AhMgf8Qj=v8{7en)Wy}5^c4Dyer_}|IVubp zz}LmWXxJ|JU&`BDiJ|I$VY}uwG@$8wIh&$l?(f%HLLz!l_sDf1X}88(*!sGFU0UZv z#Q(GaW?DfCvF~}Y@CR6aW1Bt8oL59s2{pwRwbkmJqE3IqB~O4Y9Yo-CqvN8x-<(Sg z>83z9W+E8LV2PP;yyM$m23GXvcm&OSdB@5 zKbV$_Jm&`Sf{5F4T+6Al;hulp2krjVzA?Jh>jDQ-flQVvspXem&zZVaLCh*cbV}AT zUI#o#|8zcUaOzu-6CTM)N~@M_A1M7UqZy3b%TAh$~ho7KKLTqEu|WHEjFmA<+WYK z;yQ)3vO5G$Tk^9SvMY~Ee|Y)t=4{`mF?nL|V20h@^@qbBe4SP#HTwufYk_VM`*d7K zVrQQoW*^|6@@>G*{*=x4DiQ@Sgsn4DH>$iJp)y0R$9<*e*Kg1GXV1|Gll$qZnmW`` zK>wiq--SlO+cq>o@uA-K#Q4@1z##njJMSabxs6!Z{P{^O+i1ja7yXp7dVHeWv(CS* zJNjV#xFBI3K~BNjQztns;GO8UtD-GD5lel}&_mm|f2D6>O%$I<{`VHN;)U(M8aKBX z7&kJ3A&F}IwEgj)GL-)+M6asXowUT!)d|ka^2n0&VBPF+?%Cwj0SR30a%?N|UGB4q zeVjP!%};KPDMTMThC%{eQg<>UdW_Kkbs0l!i?T|rWIacUIk8}{V(O=>qeo^GU1aL+ z|I$^aP$iW3;%jTu7wE?Z)_fN}CNUV`YGkPrJM%(PHvu>A`O1~6$$uyxJ%Nt^`$wH! zDzxOnN}I)|T1X%JnV!>bRvs!U5U6vZjGS5dM_E~Z5#a8Kl{xUS=X>MyhjwAr)Ak<> z1ZBzfv>D}``}ItI{V#Zv*N_I}oon57)h4+y`H-_UTvrfDW-wO@G*F5hbtL`uK`KwfEHsqSF_h!mngRzN_tzVf8a0vFGE4ci20Q zA;!B~9RQ4HK#T} zQ%M-qRy~2h9>DkU2p%iHA+!%jn*CvFL{6&}$9&2vzSX4A+f|w>W=caB)DuzTFtl9^ zugbTv7KYUO^|p(@*K%N@f?HG6o3u8l94%J~vc_0rhE7_)cX*oTVOJP6@bJ`A0Q5C% zh;~1tu~!E=Dln!gLW>OE@0y-b05PccoolAimvM`IC*nAo>q-2RWgOJhiO)eR9b;+d z#Q4BNSNT~bV)6H%9I^Zxo2n>%SD#T}S~xYIJ*%)HskIb}jtIDXbE~U@93*0qu$z9F z!3y-|DwN}Fa;j3tB0?bV>HD#HLJ!PAtM9ER8&)1~L!?gDYD583^S8YkdAwADg=^YM z_Y%LIV2zJ{94LS0mgV+isKzMqen`ceT7R=-g$_oQBfzB%%U`}Rv@n@F3ZvpJj!x$x z@JP7m76#A+mEs0he4bY{II1?^4tSIEitlYsrVOzC(aOf9Vn4aAGa(l&*Vp!M*NR;A zCwv6Ji$5OsYU@|q;|k;P2ZJ#1`s|#YJ^*50KB^QyZ+n8}DS<6~DO{Mav{*XB`O+j; zgZhZc_~b`~Ok<0OqJ1)!Z=au+vD}$5CS<{u5pnEC_sz%#(jA<-@ zuUboVx-JwNsA{oe{ak&rPJ?U|d9juJXK1YzSLLSugY-?leLeymtau7+5G)dMwI+Ro zqBJ+(7^4`8M`G^3);}sIs*~L^b%0 zLdCAy7D4Qg*}zwErRG(t3>kt5&$1CoZseI2zF$jVZQtsJfbQH{TRuLIapN)N%hgN# zkWj@A8USi(fo`oInMs|kWM|+W&_g%;GYA~yWqXOGkIE#gY$P`_yt->(dIbfL=deQ? zUCdTpcBQNRegDL7$>;(}IEyu&A|2%2PHwpF)L<^ZmM+~qGiX`Y{8wrd%fTGjwuV$W zJyCg?URW9ZO|#R-;+@Fkj@YU^3G7r6dGH6jk2;eEeLr}R%iHw^d%V^ILqrP^uG(l6 z)+9YmR+`wQ023EAalcGuq}7IOQYv-Qf$zVLkB7E1vj3vzt#AhseS9Ut@xYb9`}BmbxM zT`c|ZD3IJ0$W-AbtT6tQJyr@`3(HEvM;vG+ zPia8DOl6nb5#myS~6H!H`c_ol@@@s8`t_A7?_0z%hN9T3k;>yv;A^ zs<^M|&(SAu$0-27hEE?GC(r$GmO)5$xB(vr-=^dwGKRDxG@g<;?l44VhjaUpgDW4Y z0qz?9Dm^mj8G^k{oWHPU%OS@&z}nzv5X^>xSLd5zB+R3(D`fbX2!2Ki`=tS}bicl8 zC5bSVjeY)(WO1aY?Sr^?-!@}5T2m5KdT*GeFa_?Bo7InngMLG!LOemjfurG6lk8qd zAGu^mZr2ZS-o#t)QC0L3d&%Ls)EWmbsS!2r0Q{mK5S5dv{Bki(yQ z{g9CGf!SVM3iczut|3Mmq$K7ZNdI*!4vzT>4nJ;r4^u)EYR*xciPGe$6B5gJitocmNsqY3f$oBZGtI>!R9}Sh#SNO8ibpDuyD6GQg1a!N?{8e4>DxyT``_4-p#;gin+Co;i} zpI_@yQTi^L55I$a^yg z+>Of%-2PFiV8^a-Eqb&#W3N}nEA%%G#Cc1|exY`P%VCy6*?;6dgw2(47tGx%oObm4 zz|A+>Z;X4+L3s#+?chg9zQBJ+0Z@qb_LQL&En<~SlDoCiN#(-RTe}M>W27 zQVtvx?tGGYA-b1FfFf=9X*sM2r;V~pfRUzH^p)vMenG%cW1BX3|1$`zG-`ne5dS{b zPrVT&1)~xzY>LY40mJ1@0;gef1OG&tg!&)wmOqgK10!1hBnt@ke2dohiX9DZN7<@) z(X2MVSo*|f3V+CY3N;}&|Mc)tZg#}Xm5Av?7F&q+B{Q{;{ooD$j-V z@9##kOisXyyD4%vRH$HUzWV{i?$S9QCQz=Ea$mP#IN{H{fsW~X(Q&U2O-_k@%wc$% zdOxt5p6>0WsEAOo?^#hihodW_SIKn#%lJ+NO8u{SfLMWaL65HWZ$m6X0o=A7ib7mLUP#o8CM6d%f1Z=Q5gMU4RPfG^Jq%|0if)to{5UyP zrXVk;GU1lc!lNbZ%9Bz@?E`l|T{FkSn;9726x}hk=gL7mUd}3IFF&I;OJYGrl zG%Zl|D^En~as8yLR&E-LPGbSA+S`SfU+d#R`fO1&k&}7pOoH%r z1z?g{$16AbX|4N}X2k5KFUi-PM{wlJo*}YtELO6pCHAo8*E9k!3SViOS7L>Zf3MZl zL4D~7q*b)lBAS~!Iuw1^^4xv|fES*Gv6NqJ5WJbEEX-bkQ-IrgkRKAbeP_Q)#%i$w z6|9dO7$*lKcY_UwwH52@Y)5+~#UJ`0@+j$i!6YrpSpQMQU)9ourri)jBK57;z2%O?HyALn~-U=mi=>Y z;ZV?v7)NrMI^M+X;AP_hBm>MZX|Cum=0`WBS3jbyxG+ORZHTm^-s5y3wR)soa zeYH)CLu&GX&}E=Cr}l(hs=8;Fb3?rPBQo6-HX|50uDgpyMEW%zT zvs!#wL8<7+WI*2HMHgbfUpnOz*cxOiOus+J!frt}fO%%+Cbo?N*aEwa=fD`W>Ulv|eX!Naz+# z-fxSf;6=+xPWk_=!2{iGrh1`qNGWspP=D&8KPLEI-5C4>037nW-Bk>5OLIy(X0;DI zp?wS8Y%QGTc(|1XPX}b$&y{0g)-ODk-=>P#YSfcg2{YMo(V6{}cA)`w8Ziu3`SXNV zQbbPEr(>CfAL{)C?yokfkyb=(5OrRW6?+xrgh^jl`e7n9ols@^JAFf}-JqQ9R*^&E zK}f`1q#XTRvQZjORBkHfyOT5*hvaVRtj8JaMW6eL-6Dpd`brnDmR&3h6o z^ckIIkmc@)%eBT&{Gq_eQ=+03nk}=~pgJncvBi(b-FvRJN>Q+Qj&$n{Jgj~>qC)T9 z0yk&R@PNo^62NP%X*ceKnRz*`_@Iu8a-lu{_$RgB%mI5uNwK7gUxE%cE-@j>dv8I9 zR{u+GNTe~UR_SIk%TWld^RoeD`+Ag|9(g@vnx^(UiZELz{hq^<+i~DaHZ;=-N~5nk z-YWnu5Z(94kFvV^i@?rjyG7P;jlQ`QQS*e8D;|Y8(N4k+07&P=KL2Lax8SXo#1btT zxzb5gY)CuBW$)i#4v&_9WFuREi9;EoSGYX^pw_b-<}7lHzFC^yo!TS1#`$>6AZwvg zuWv_Zvgc@&6a-+<-Y?Z4fTkmEE48+%u_zv;_Fz6?K*ZH}f{D7cZk{CJB9GF%BK|5b ziFro1T7Al9ZHugt>9E~PcbagaLKKd#(!Hk0r-;?`bn~?YLjXd|(9_7}FABgX*kI>Op18y#(G#hNKu=19C+-v7x<(o!IYghMuW9S> zfgT?3-Z1y)iYM=N_Tea@$%39ki#0z?X3NpAC$IQ-2E}9J1;m^?AzL5$Wlz!{Uq`S% zmh&;iA8Ev0$GQNQ34Flw4rtoTh;R$GQHf=sYiTT@zuw2vNo8Et|noO3=q3%gbBgE zXtWL;zcbJrd+%7(`@!K?_p&~}G1KDVjZZN5e!0Qi;BwFUeDRwqR<=0H(Q>P^|LL_A zobW{4pZES!<@b8>FMabRWQ(Hu!6QTi(K*lH1&yjl-@i90bYejc=wAw@%W{_xIQW|{ zyqmL3cV$o4q)ju}quKh7*Cq2!;M&7+Jf>b}QpWN7WDWo#p zyONv~-r&<4PFFa;flO{d1s1MZI0BLHlI<;C_*{7H@o9$dyrCyH4BHvM9P)0-DhK;s z3X3gOLz(_tVy^QEInKT*p~&$X*xx*yippb|Te&D#{bRW||V=%yoShGyVgo zqZqJ7MfQd4g`5vKnR|e-dYFq48=q+dwMxZrid-ksX&tCKY+t8Gthgf?Hq;{{sm_l! zhQ%eqFAU^0zv_&2F_*~h%UvDI>Cmw<7osT9|E<@^{0{3Q6YpLXzDQnS0S78T9CVnJsAe*3kiyx!&niP76UG1U_v&$QO zt+-i1u9bwg;_ySxbUAsH>GrRjFpF?1Y913KiKu+k``dM|R0eF+7D)ZA>U-wJYARUG zzGCZM z_dQCMv;k5jOCQcdQH@?ef8y_bK~5B_Mqz?fjwUxl#TLe8EyG{dgB2bZu<%n&{(zP= zfbK`qf*nwfq0%n(&&+8-y^f8Jaoa3T5hFTMf}&^isjljG3UI79_3LA{A9=-QwFr|7 z2xzmbT+j^c!WmOSpjXTKFzHxx-PiR3`x_V5B-VWqquPCOlyTa-x_7fz`)%foZEI+x zLc-R-XN|#`W7O~sDBmT))x(ff}wuQ9u;>9*er!X$*tozfTK;J zvJwXJ?~44Mn|uNACWkMGYC;Veh*~Q}L9OT~{b-{L>onHq`0xK{I?Jv&x^@Zo;1=9n z6WrY)1PC77U4pyY0KuK$PVnIF9wfL!aCdj-%=4~we!#5$uzUC1a#fWNwtq+O;)4{m zVK8;#2$~YgInf?9E`1q=TATT@fGJ+*E7%<+SVY52?1I|C-x_(WdKwcrP&k!+l7|Ou zR+@Wi0YguhgmbQXifW~PQ-{=H^YL3wN=z|nMS`zPoI+E7g@~;10ovkbCu?d}(deg1 zJSeSq+WcKhHZulp4wGK!4E;)GwjZGhP;{U85~ApjzSg^Sho0%+cC(@Z0~VuZEH?p; z;)YGW+uJH-lAjyG;pyU`FYaDHg8U#T;SD38?YG^+P#_SHHKdjCLhRXh)<4#~zydK=1W)iVeLN1`Q&Y(8Q+u6`04^hqr!W2kGV!eCo94}*L?pPb8Sw&;r|VUJ@JmqCu!R5^yt?G ztPBq;0Ql$;p-H8k$Buo&9O!k)%~}!NjCoN6pZoVf52r760CiL%tRdG+{2Ol%lD~S^ z=yjTrS~!~?2BuF_9ja(4!Y8rIcAz`!IR!Qj1P%=yO|nWFiWmyl2Q9^%5!EDA6bdm$ zua}eHr!;0dma7#G-H;cmn;l<@qOQRI?lOvyDVouniqC=L=ivq zfTOjkqxHTir@?)6yRec@6-Uf*Ix0OJv-kSx$%asr7E=_b`J!TtcmKtR$Yo6>fDoED zEozW2v=;pWgF4$-0E9e>N zV9LhJ)~NP}-AnF~2vfOGT4ZoRnFU_iIQr)%T?0&zTop52FeLiPc;Z{`*LWURjGIn2 zccxs8gU{Z2zy_NCL!UAUI7M>deytD$9EQz>LRwZ#43oQoRi3TGfED5 zrX}KQzY-LWz&W@dxNBAGJSr%~Y4|;**+;>NP%BA%QnPyGEk4WcMuhx>py8wcT`#Y( z(8QtL$VS?kJgrXNxfMDN%sw$hM?`@kRI^HA=!-KjSdKn{Y7Ou6{pl1MZCv0(H8KP^ zU=`aO9kK!Ou^29DV=?A!e3s%IpSwD8uAVIO;RjSdG-y0Tme|A3fvlLOq z@+UA~qN5%CP#mg!Rk-b)Fcx*N$G-;#2p!tGA{ zKD5sF*PEM0TR27s($3Ig&~Cu<+Ls=Amn@PkGd~RaNOH360skuBQ|sxF4@4tR-?4G` zvI-+$2^SwP*1Mip>+ym;P&V+YU`2(aelFG-?GCHKeP`XdG?MdT#r`bG zy9jZes;MP>ls;g+up%OD85pHQ|BZ_h<1z^M%U3-1$U$8vnzv*g2XR|Z^%mudD_*?X zWC;`w_lDcQAql(Yz5diqh4t<{{1^!bQr78ZX5t0xpC_?}zmTi&rCJNRr{t@F<&`?A z@&>JZ`fiVU>+V-uT!$YR2xdPTn#2>r6QEOb8DBdL^oUQoQdv zntbPtD5(cYJ*nRi(F?)%Xn@bq5m0UrYX>&fVsKFoGuOwam2=`!Z`u%3?`!`8l`Qy0 zu58P=u$KX^kI-`~{L?gU;=SIGYL|7DJkPp|3jfv+l~Ye@o_8iKqe$1hSz$h{7}g?T zoBOFumDgNZIXrZBiax6RyX^n70ARycZzLPIjcmzq*SkJQQ7CkE(O2GM_m72Gt^PZK za)}g!25S<6zp0dL>zgCX$;gbpr#Am(!B5R);pQt4UPS}g3^DJ8aoLFIfrLy}?!_T9fn(eRVI}zk>_=HR%XEtXE#DPV8MT|?g)=fF$GV4%lr1D;)Z4( zeXd61tPqaOq&E9M6#G~nGs^d`g3&&>`#to9yW6P$C5iG}tr@HSB&a|ntVpno|vJkl^OQ|9&I(}S2% zfT51AtXUkMlE_cv@-9h|ED>~iP=x4BYj=%JMFQvT925JxBg)Qqd1#P&ZytLsiIELS z2dR*;r0;`V_lJu&wA#mL`R@++9kNH)3Qd)jrZ(?`O|`x2fdem9m#ST3eC?Bi&%@Vt zv6EK1MYHMyF>OZfXG=*60;lyiXYO4B#XAJR1*h7{2d>0;C{|bz{DS`|*~2L*Qa0F7 zUsVPq`npyaoKHGPtn@q%A00R=AyOklr|GYs($q3Mna=2_4fhvEmqLR1h0H{^K8d_J zdO@%`4uH1u!Hw%t#(}2+0M`7Im=B8o>5h(nbON~dj1}R?uSm;qv5ytN9pTNabi4F24Ot&}*?untPGTit_0&NBRZt zJj@V0d>rEaYYmB?q*0I#U2+U-0cesLXiix0p}PqasbQuzxQBRQLz->bROYL562ReM zGjvsiLx>|!^#fz>oA5t9sSoYJth4B7n0rdP{9)xQi!-uyJb93tjCG zHVzhRp)7r#ovBN)a^Dp3d|(>e@5=jrQ^orBlKGwru9_ryLukf$UY5 zWjJUQgywySK2=KOMa;|Rc$)?}*HJ9-l`GBd)O1dyh`Sb(oc^RiADK?@&k{zuW}Ufh zWA(_}j`#q6wPaM?HnTtRb;r5?`knxTJKEQ8cQ>-@%;>qH-*O)GZ9ft@tj5?LRLB_1 zs;)m*U=kwGgO*$L*9n7*XLqc>dtoc?@Ne)B=nh^TW6Xw8AFsrfR_HV_I|6sl(WDRI zBtW&%>(jG}GAxM~YMWWHulCWkOq~mhFw>7luL`)uVr5Ak41h@P$bmT6 z^rq@yhRF`bYDVk`Hv0(euXq(XVtQIk{R1jmdKmra*Xy;rzhN6**1bvoz0um*tkK&fV>fGb1`dXanB(ntZ zdqe#o^FVYmt_xqu1U+v8&Cqu#WwW6z;m(`*{o~qgiD57#sO?rr^15_HZb8atoX`DOY7aOVi$Dxn>UV3jZnFX1N+U! zj3-Ted5Ef6?VCT+UGaGjbj6Yax*%deb@X{G=s6qqA`3D;*7G|oq*gJS;SP#mrD>JK zfHs}$N_h8;OCLFbC9{ajmf{hm0+E)$=L#@$K2PxvY2k8|zsIyR7<1Tq8SD~o?94ci z7yoJVd8rwk?nll(a*ytRVVYB{Fcwlk4UoEP`K*=mjsqXC$Zy+m(l$~67KIiW0*jTC zSR3t+-#jgJ3F|rZ1Y7P`lE45nss+uYV9acuE2v!C!NE^6Lhk+yuY>+?p%t#<@G6*_ z@qOvpsla7q*4`HU47^#ZQ$PJOe2KZm@z6ewDBL{9;vI|sV`)F;pS8xm19_7_=JQs_ zJMO8afKgHo_bttrEBg>Zd$+YJZL+k$xzZaxt2FyYbb!bPjF zzw~#wf-X_o@s9>FVJ`QgF0LydSD5rN5G$(29x;Zp*kwGt6}Dp|d$6EHB;S`soCyQv zLS%nTS0I@exc0SfB_OCWa?yxf zt;)hnTDmu$fh(L`TCcrwtVks^@9n;Tn=#+`-4I9-aBH2^E1G@H%Mq)QnS8c-V8`X& zN;lb|g^s+M9&APcKN?!Zk$4T($~WT>b8DJAl4JpsSl%AZJtx5eW#`kf%r%m%F3VRc zf*;>n(-E=gBB&&+rc%`qKZkWAg^?p~JnlzFxefYpK~us5u-cQJD8sTFN(|D0OMA=6 zsYAci8h>zF*S|E(-bDSTLmPP?W@ut$+&m|YeY6)|N%S9ZKYL1n&t3gR+Y;d(bs?)- zBsjkC<2MWcC2|+}-4jHa&87!&$xSBt_2RFkPW`u5D&z-yBG1|@PuJtvP2KYu2YRsL z-4(F2n~nUcULc5{{4rVF0D*-QhCE19fd8E0C;7Rx`@Iyboy@>rV~^PHTCX=ViaL!G z)QOhNJS51b4gtyT+DF$q_>?}Z!cKaVrS|k4o6+{tp|=TEEa!(e!XJkqqSy( zD#G{KCr>)RV*uPx_U}Wrv13HfN=(V8WPG&n5l)@G>;%)mspX9M6k8rx4V1|9-0{Zy z4=L*Q1AjPqcla4JG=7JCCoT1M7|Tm41i&y_HG(5T<*xLz`GrKkkqK7YN=gc?f|PC0 zdl~Vm13qiWtew@!;%>zwXm$5q@&jms7fMi%#jx_ekz&qBn_hqW@s=r^a_(8O2T*O_ z5A`v*xi(+&LZAP~9NjfkEp^?S>5_xqa>yP;m+Bo=w1xTN@0xdIiWN?Wcs3D`adu@l zeH|iI?RL^}l^Ff?k=B9}A^l9a%U_z5A|gB9YE=>apZCo#wX!q&!tcTLmakq^!?#|( zC_CI`9&spg0WcP0=DO_a)&C}bf|G?8JAI|RMs(H_Dp#BegQ3fbtAh&-gA+bsgsTAx z>KVp9jJ~gxZRNPYJi9DQ^ct2p~HgvgF0#8z{St zW3fi#$oM#zzm+NPzU~|g4X9FOni4HpYR=}hJJ)?LYnV6D6}?0^Je9Hco5`3l%0Md) zP>Pb+MP11amN;k0dX$Ly7~4A{cIme7KK|jaAf)RFCafKO1Ytl>(-WM2xV+0L`8c*bbM+ zT2Xf8oC)Abx>DC&t9W>FOhX@TT6Z5scCEX=d(k7B>^K_T$&xvRAD7RI66aJ*kE!D#r1ac47+KCEO8Rr+p!X-K6)Hc01cImB@%-H`Tf!t(nbh~SnzH0G!`ax51@e_GJj=iMfT~wC>u4Q^& z=&&<%ff8i1LMX58R=_dNOQq-7k7GF)b6S*Jeh}UNvm^JXs~cknvx8^cZd|43y6-&= zf*Bn{b6ZW(qFdTO{#0c^UX}wUe|@gVv*Wi}k3SA@5#q9BS#^WiQi-Bv+{fYkBGWQW zjPnBVfyv7DIx6Ld$$cKJnU#8FB!_|2(tCZf!M*dHc2>9>Sw@PGEslZ3(Rr=eo!q5~ zerYSAj78t<)%UYk7=m6UW5tkfyd6*kXO@90f3&+Fy}F3&x~O=Vp+-6p;km>7Njrbs zq5KeGB!W)UPD2szbG;sy`YtwP+0b&3N?2-D*co)4eV3x;~l4>0*m#I z+bnQFJ=DQ98n>TmYU8dm;AgajB`n6&y1|E{6-6dnJaO3D-de~WSQ0DzrV%xJ3 z9)AuuVF0Ob?(!IY&`yKtkxpJ8qoX72>BM2;k{?Y< z>GdnUg{m<13c*^PYaZR|*`Q(fH#GBAzK)?U__X~tyaJKr?xKdbq^+VKD}3EZ9zUno zfD^sd}6(%J8x7iEuI(!3JR-yXx+`2x*IAc|7yWe_32V%?iYX`P`p1uRr#OQKFW!<$p+;oqp z(&ABDmg=b>4t@j6QdDRV0g&k!VrHJ$VObrV#{&=T;aB*fmie##cB5e?(%)O#A5h%S zJPHP>b&{C@P9>p56C+3NrizecE z^RZ#otZc?nC&gp>SCh|u+PqkkR~>@j>aaQDnugQmrmp$r^{n9=VVMF!5Y7*_vYn53 zGy$S3_$`DR)fXXu65B3iY{8`{QO5D;W3n3dO}|FoSA8nny3tBvo`nIh_gSYvRw!q; z+0Syyl8etCTIGRzrKZ<6V&WS%>zzVbk9Qn1Dff6l2_BduLIBx`_U{C&dj`e>M``CqSYDBj9N~*!6l*Yg zl-AzClGG+$E?6d$+H8tTu?k3nS-U)K^6wW1YSF)pj+|LAO!qmpTV)3A0=2lp^Djjf zKTYH*Uhax`y8cCAQwUHDmVOwWA_67@FF@H;^H&dhJe@`qkoe!JVz1uDgXL3a5SU}_ zD%s^>Gvl9FEuZEKuF8|X8U_r{=;gxML%Qb&)dKU>tL^*o?X>;3zpmU{(51aw2!CyA z>6^q^vZ366{7c*N(Bv=jeV8=2F^cic8ZQJ2IvLvf2bWm_T}(4XS61kt!<^cCV7u;k zm&Fx@?jcY=1-Qjv`WML*gd#!{IN8@UIDtQBVM&mzEjo@VbtOwq)o?^>sI(m@mzpKq zsNEZDS1V^L;%H^++I+L(NuLP_4Av?)+_kGSPAf0{#@aXDfMmnwbDF{2JU!|R8Z@d@ zl|Dp}KufvH?&vhyj>-5y4Ez8x#e{O2Vl3bQ-uIVlX9}8vpu;qm=$Nuv4C5`-dVO>U zNY7Q>Mcv(q2bQI)@*U^3k!Rjo4!MnWr#j{>hU1UNoM^IL=GgoAegm4nv)})>wU$j^ z{5+#Wy(?Qdg4r=M{|8BpDzAJ@@7xuav4YJDR?c%~$%5qhSNHDtpwA)~lxA*mfYpqQ zV&CUI7||k^T0$D2JEhAkH7nNYOdlXNoT-?~s`fJ2lcQD(C?ztkR+ z#bNNpa6s|Z9>=(JagLvtcnziJGkt9l14V|&J;H{}I;6In+16?DA`9c)mUuVwPZGiz zQ(D&0ALlXOJ`n2IWwMvgh+RCP`^oi}Z5fY}y3L!=a1-KHN5~MUP+NBBBeJB}7c+Q{ zP?P$J78^UG_<9U+Br$`nfi2Rs@Zc{;#x7z9aQ%V8>SbHOjaa?3`kZgy3%AiMXGo1d zO{-U%`eR>laZ$G4+aV2Fw-4SbC9wtwyh~@R@Be30epB39}DII?jeoR6l1 zvOLXOk1N}3j`pZDsfop)UUIzwd_3eOtne}9euU?W|mcIsS0!McoK zDVZLxYhB1dW5;&41Nz_4Wlm%bo)Q|?^ct*^PGOUw%{{H5z{;ff*K}{lVJXQinBY7* z1rK2G8=?0wLU?t(!RwKRw-IR#xWkq;9YuXNK!}uuDGHMQKVJ{tjs*L%8eyxy$7@J^Swjuhg%8eLCn=f^csxkWH2zi+0$MRZ;h zMg6D=xHYM+?^TMoXD&>$_;MJk&)rmao;jVv;mN<}#k$t)D8>AaII%Po9pih|!U?hDpjYR7~yW{eND_;zeSDQ<&+K}+Y=|`ks zt-zt*3Nd_{NT9P_XoM3(aE-f}u8Mn7`GgAtcm$y}J3IO#kR2oO;MdhxST*)Mz~01OS(w?aj(;%^|ygZ{;HWecf=Hf#sodn5L3ypFv@8=2yz6n5oE zrugTLwu;4NRh?enlDZiEKv2PoFi6<%p}oV7{`bI8FAI5(Cje=FQo9CkgFb=t8i$A+ z#=+jGHiFsu#dot?KHasgxAQt#(4r}w@h5tBI!~qdOZaf9qqequucKYDFdWSpdEdXG zAlxEiL&xBNu7zEyX;H^W44%^=31ldqHc($YQjrEbR8|(;{OX2SQ8FzGgFho`Un4za zL-Pc50C7%Q5%E($(~2qISFLXr3;18)R(;R9Mi_t(J;w@LEa`;!d*Kk4{{ zLl`5?GSAaEZx`nWA=}aCI$GR=Ol}y5hj=NQPJ1`*iYP`eB=la3x*bN6alI|0pef^A z0mTecWr}{)qa33xrHrklNwYF#8x}y&r`$+t&H&_R`Ll9P1TV0o$+QcuIso0x%K-dmdm?N z2;f3+Pb+LQ2I2?xdab*)b}Bo|IqN2Em}yM;?|{(Cgy((RjD}s8Z%)d}?Seth+Iz8o zI=77|F2K|-2)}6s1BZ$2!SnWJVUEvFU}45a%MaOqyUwW{a^$pRTbl+j`RmOHepqvn znr~dW39cX1^Z@}kkl6Nxdv`jI{_oDTz}y{F3kwz!)qeMktn5R;8oF9zpTNtalt?^c1F_QzcD ze9!8{@x6^+D?*rRF-mq&_i59*oe^zA-+V2#Wo>eD4sXBG;iQMtQ{%M9^rpEds#lw%^ks4NyIi;JT@B0Dw(mgs+NcX6njDZE^n8 zl7rQT>U>OVebj!{M=bOdo@C`LL6H)+-cXj~GU|`K-k~uHt7s=*8$3Y!4(IEE#Rlg? zEynie$ExZ5eD%Si;T1ggJtI&!H;fKHXWAyoK9&eM)wQ5@2cf;%tuKRupdHp)%o`Y` zp67CT>g9W86cO#P2Uv?Xp z?drG(X#r>!31$JtU=hO}YMe!*S9jKaA>vJHQ3Pe$IP1!mkG@YcIa)ru=Yn7)1Wqj= ziHAG{_Jub%*?34)W;BA5uLf7`t*B$HD)D#An~?d0v$m$| zjV9fq%*HDX1~gow-v_n{fvpmY?pL$b!5awzy%uk4x+xpLu$1J&xFV{hYWaT{_sidh zhlifz;cc!VwJyR48mzD%ccHrp5#ML?mGWgyoQvnyzhV3>BmbetxYM$#${+Z+&xkO4 zIF7rA1Pn&x{P8fI(A~Rg=*+F)$l`@P+rozL<}Mv%y!<3iTP~|G0gs?g3)}v#1?+2& zVgQD*y9EnkiM&2G9;ItA7^RB(3Q-K{_#fziF<*^Dff{`nRL=FfvY;tyVUw)eKPRu13I>l~h@D(qPG zfUrDXcjG86fcuR2S{;d?SBjB)77ZAesq$VW(^`M3mHK{cBp=?CD>QE9QFmC@w4P1s zd-F|&xAA#}58j=t2i6KJQK%Td_UL@Dzu1~%mdo~wciiuY`B7RJRUDqHaTjf!`91HD zVE>D#rqz%e^&${G!>@)(npnw}H;`#LI2kF)vRlm~G8?|4uBG4k9^rm{rz0UYY$dvT zH_m5s(K`wQhvz4w!#TyoaY{vg0(nI3Cj>Es*nb8yEi}zLM<{}T>?!!(f`D<653<_u zTYVx^R8S!PC8)&^O6Ot?6-1_fk>K1ekgY(>QkhPgY^CRr-$Cjv&4F!rROlFw1`ley z&|8YTta^f89W$IT+f|L#7Tn%m5h}&1AbaaHBAvlJaOmJ0pO!1?z@!G{ zGYOGi2*E(E?tT$YnY#8Ugzm(o?5fhOh{<|DX>ZO|a>Tds+9e!}19LT8YNJ2)YQqbo z(Gw>v&khs11X8rp)&kM|Tuzd84d+Qj1nQR#SisCpea&DM3Ft*p-KR&RMF0fwff&b?aRT!n>DbbtPPx}Pq+!mW1&WER0c#M>1$9sFMx z{Ijw>%`-5}MnV~Y{;E_N1ORCA9#%|@bX8@s%?c6ACK`bc}S5;;w z>WygUgEfmq%)&Od2^*5m1?iuXE+|@nQ%93>$%&DdP;Cs_oP5QRNo>fhhU7q|R7CcU zdVJIM&qq?v(gAblZ{cm)cZgAGcrz*pRPMhPMwY0Yxa?c;c9{0&q9PA1{qM^=jI9kz z@w#91k0?nY@Vt*?2I_MC;b2frPhNAet*PR^rEHV95`I8=Ew*;e3`xt6D2U|4W3d*I zyM#3_B@!lD^KA}_aTO}q!;u78!$Z$L>W`JqCnW7(kSU?4^j2BvVJn6dUQGQj>2i%$ zC?Nxu0v z;Wr;Ly&t%m^NNAfb(Zw*f+mdzco69~Q8K-;APegpb6Bc7degZ=!=EvAUji6)*>JRG zWRcGv+6JLmN`Py%}}5hm9b#8s8tc!H*JW!tFRwGb*>*HRW0t;&Fkc z?o()C3_!KDhS#9LdYbaYD-CdxHOF$hkmty~{ywvz%46L-5{sQGA z!gxAr3L^Z>XT+#}NX0E`l7(ZgXMEm%on=7;C=u8-u*MjEmPOk)7THM8d0we##M@{c z;4rHC^^?-igee|_bf75Y%N;(dV-qxW-)9TUC<-ptN&{W!XY@6WGT0jU=#jlUCv{A^ zb{S7iw=*e8uSM7Sxo#GS2|k&smWWb;@{!|FP74q zh_O;B(MKOV+IK&7ro;t^Qi~U{-u<{f`K!dJO#aJ0+xob>LMw%RPv~L~?+bp(7e*nZ zy}#evsI;L|Ne<&aqkcsb4$}vo4?xY3r6$ERFgTcIvFg}W-ImTM(}18Z4Rzgj4>VQR z6~WWvLr-t3vO>`!Sf$M(l*sI-$O!wHcdGYb)!(qXr;9`#7An7y0FxdtqcUh??lPKy z41NR>v!BKZDN>jkblycglX5S7MT3Dih?5j!p%$JZ5o+Lte4xv?f7oT8#JzyXu6Zpn zb)J=op{6sWqQARx&@XxG1+eaJC)H}kj&y82Np_S5I0?&ay$#M(bk zr%eA;v}x#I+0PTzTo+cc1(nMt%nC~E;4nGHh;lMM)~(-Gy3Br)s>?SnVYm8RK4#EH zvWKJ}I^q9zeb+`0(k}YJb!3b)c<^@KhI$`JM4lX?`|$0uW#fy<_s9C+6V+7pl{DW$SK1`0XLqw2KBXA;D@)@YdH2 zz1C0PkJ2o%wJ1T%x#H^!vaUe)!0qul3Ce)F4h~D=P{S-m?Qq5COzN&S%g|NyF9HrW z8L;5fZ>&Z$<2+}#r}pbV znL7_C`#7ZQ4u7193knsxJxz{0GZxU01UUkKsRp!#UFp`w$0X_BNo$SFeXdc{zs=rB zX>nuOK7m&biReN6|#tUXrNlyAhn3}~+z0#k$YRv47dK1Zgk zK%pTHVQu_jcS1wZ1z|cyFGI+-n_w27o_630zXTzPmz3|Cy6X?=vHcG*X&M>80WvwS zRR{)vZvkbvpr&|eR0bYF^X=E^l+IMrXCYo-2r3tolX)Edm>W$>2sW`}`}M1Xef*Wf zpgRa4_Lci=uA&STUQ{C)zzY~a^18={W0HWvu)5)6(48ZhOi?&vm?u4jC~1oiUwT^J z@jml8oJ=k`>n|5wHA_>%OQkxC`po;uuRbDudo9V9t6#{s%NpseK#03&E%MVe9}r#Y zZA88mQNVio*w|Pd&sWGo8rOz9DAM&0AY!-0SU9?h__@raeaO8Uc#!fQi_0(TylECQ zSbd+@Zv1UJU$vs+XbwgCt!~ATjoXZk4{u&s!oh4?z_l*JyYiqYk*mD0!euZ*VrI6p zGSl>n@!aH}mn1P?{!cyJLEbEk{Z{v9^=_w2H)RIz=IeF9S<5HL;KY-9nXj~xjI2K@ zV!V6h$szLZ4~}5>f6Y5m8^=(AdyQ`lvRz;6RX=zYnbcMzGrpHqE+yEtUv{s&ITeq0 zz_m)b0AOh!5KLmP=ncB5pC}R3(3!91HuX9IXrk>TjX{v-*+`piKP56^FvTvBw(lA8 zbb8;jd7Wurk&X!jaBb!HlbK&*eD9{_>QV1U;rmK&66U)3=Yr2CH$^-he*th}XP7M? z#}N4Yp-{m7b1$B74ypeM+k~j-6PZd6e?bdtH7<-r_nFx7K?}qP<>?^5%*rpIST4oQ zLt%yJ>gYP>J#cqK<+3+vY{1aRG%$)!WQ~92x9*QE2@LxwRxuhWLY}Fg-*>doGA6$& zX@I)r z??rRzr|k^7(i#*cOmED>xCU>E^DJ1*5#1@T*d6?kHguyGt%9GVrcT!2dsmMN*#XPhHOwSrQOSadf1wC>}EI0)9 z8~{1(jN>pIHsVqCaeD${n76Qise<#UU4mX9Q9x4Qvwbfqpq4GHNU!ci+n@0_P>2|6 zd-@@L-fzOtMqtEw=KPgn)w!8$N!yvPCO(OIXfvi-nv6NHk-}u>W_QQ z`^x^bNvz0T!G!4_;}e5pPVMPl$;ehWk+kC2jpIz`@fvhdxel(vVJRzN#<6G<3@9ZE z^1n1%n|ixEGCy0l`)0JM7>gK9<=R==OMHz7)D@ed_CeI56japcvdFTM10n?G-@~VC z$g%5K>!nbD2kkI0{3~1(3yu!s^ICt)hJ|6J+etwKS}a>%Z{qnB^wfAJQL@T}$ooqI zyy4AngINOsV53?-!!H%iGD}xeU4rTkHmt8Enu}KO7sY3qK-b7_Se9)`QWlk`l)*{t zrazRyI3|BsV^7oACCiC!p&66EZkDdxuTk9Km;UAwRq9DU!&sF}(IUbC;^Dh?(c1`3uQ95z0|r~ z%kx+m@r}CjS!qa&yf0Z-u^nH>1)i0T4<3raBxEO5fC$6fNaXokx?ZsKChQsDZDiADbzdluw z?1*rWb!X$N8GTY`PEsd?Ko;!@JRu}}yzwvJp)MT* zF!c0jY$)9SActuYI@kC94f+A%6z1DRYQbks!iNR9B@Dz)Q!EoQF2X|rHN&*o;ohjE zWM^Mbq|~Ws($Zw>+g&lB-A`8L!g23TBRVUlweO~^**MGdT`c#tP~d_J#YH23ukCkw zAOqaQev3vTneuhVT1d?ZN9x82%}|l_nm_$~bWsQpTg|YdXPT94oGA+#qdgt5Jb_Gn z+-V3S%qqJAATbqJULa#l-rR)*Q+AUe^1;bPh33**>=G`C_h09(+zy!SUjunIXL>AC zme&c_wqJj7E?kaAA*$|-o{Ipy6WH8uL<8mXKPPK#@IuS1oW*K&Yj3C-9_DNx$!$(v z1NJv>cjfWZcKIyTwl(of{=7PWKrGY|=kw_JVUgqeQP1sh_wWh2`~olOoohiiOW1qH zVrC$ksKY8h_R~XkNWO-=l2)iP4f;HKZGG|vNx<#Q*m==hXggNUnf@`VZPnMr$axBD zIbN3T!#kU=V-89EdfuWojbm;*Js*l*u^c3X4ntR7{ zrpo|VA$;$gO{E+*a)j4> zIQalE&lU0vtd@2&Esh;GH&u8|jZbNAF7{G{_Q;Cs1=RN$^O#;%hH;+aNHVSB*|}X} z#y!ms6%$zGJ>m=2w!0bGH`-9Oli&fZY200h7Ek%O{PHVCgt)eu7?R}*?2AqSh(5Ke zg5hP0K?kJ4t9&J$H3NdaC*MQhKTfLSdrq~vJ;J%;8F}zsjA{~mi`|w%g!FGs29{jRHO_Zt~BxgoMUC-jW z->w&%^dzVt5_wlHSC<)h|3y^O(ZQPH(5h;XME-9Yaj*SpujL&!$N6#>wM z@3zR-sHd2ZZb?RA;|tUW?EW3;2Fs9#GB0`$*`UiUk@-ye4uS5buNKMq8cVFwJ2|ewDJw zfT2dYt}YECn}CA!3(iAaMy}o&3ef*bME0DOX08|I&N9P z87gDtuov6v%kSYu_jTyW>Jkk;dx6@?zb|!lh_GRh3N;H-U`h%|34S~pn>L%Q z#r3ImZjxlV!ih{V`?1|g0IUb;qp3_d#x1(MFt5kpz;Q5)IekYh-KOXAjN}wrF zp3w-E^+y*6_14BT6Qn-;bG@(1S&6*mcm!LmisVuGPp5r7A0F^u|BwDXM}rHJCjgp% zmFWB3;_ln)?#c^pdAg8cDK$D$r4=3`D~XNey$^|Oq-hd|F~2clTb;XAv1_1NYx%+e za?0#oL>R}0vM42Uu^O}nPWEFSfClM8pcahuk&kS zPQ4CoF|{np5e?>y->6CWIb{(D9_=C94 znmFFKSb1^_{jAMJ4z}@NL5lJkCqtO-+n@HvK->j(ipEvfGfG^@1&hV zLJzjI{E*By_hs2}ijdw>#IS>)&EI$hNLaJqQ;TZ$K=HqcEyYJc0x{k~rC!@I9fAIv zXhM!F`U6~O19Dx%bscbgZl{xIhu`UBOQ3(yG#d&Wh)c2Z%j%iY2f`5*Yc>Udi~GYL zIAN4VIfp*qQ1r+D6XZqFuu?m35voG8lg%U}B2k-nkgiar>3&56z0?#Uronf&`Aj`+ zlN{2c8aE_W2dpA5P#I5_7@W^W*^GrA*pgTt)ZO_iEU_XBl1Bb|sS4R;X%eaEEa9cn zjJE(@P=YPWA61zz<-oMC;9F>Jmyd>Xkp*7QH&JnUb~!686{iYx8jf{%aA7mdiYne> z4$i-f^5LEJL_8O~x--sfv!k}+tkAtXwl78z&I1sdtp^n_1y@IcxFWo;0Kng4Gq@WR zW-7{deu%5Vd&-gX=;C#AADa#jR$;d(PElLp;y>aPxY8>cRqnX>g*-E&e^*;?{mJR# zpY+$CELn2UU>w#<-Niu+K%y^qbvz-I7fuNDmk<;RrpkRW}?hspGn zp-e#$XZsL^*c5#?hYGF;-`M+^z=MPSS&q_K-u4*v?}(;0ikpqcOa|soFt4N+?FcC) z-&FdA!r1%5eaoLkeyUe!TTawjYgmSb+y@_9qxC>nV?$}Gz6$U6w*iK$t>@9Pv1H~M z^=8%gx-qa0!&1G9%*_bYhFOO0*dujo^nG8Ts$y@=Gb)M`Nd515GZ#o%jpa29Ojq!b zOWoaip0(Ehd z|Iw@l>2zm**WlNjuBQf$t{X%9Z=BKO~M?9a7Rt zQF6i^k9wg#5NedGF&on%l-ppW$mQjaU6;4>n#sGZ)G}wzS&LmqANQZ7dNSSZq;Knu z%iZ5sYzR|SEidix6O`fH-P!wxcX*E^8(v4YjYh+Sow-wF$8vd11>+SpWqB4AQky@b z^RK5_F#W{HTRE_8+k85n=|jtxuK~bR`4p7DN$j*h#7ribkmxCF`>RGVE z)lNAFbiFH|OF_V-ia2t!$%6-yL*rsaVr?&nO_Q~^DD_T@@q2;_DO8Y$_&~6kgJzkD zPR(ano_YGefmhk+v?G(Swd|M$bU}Lu9Sz6G!S&ZuOH~QN_{cD zy^m>`<4?gzu7a3%g>>$x9EIXSRA&%9Z5PC}+ul4P`yN7KEM{a`A!D8 zqsk#dmUg`@j(eMpyT1@1_#=^49rjmUO4@y(oNib_jr`b^6W4&jDx?fQ#K}mi9-|Vj z>X+E5{x}pDZQSGs^fB$dbc z)%o#iIzFpT*K=xC;ecl-O*%ZtByB605puW71PSIb0bt0@qH~+X@;P$(Z(dKp&>h$S z)d(64r(&wh=|r*avK@U$VeL}L2-eK5CDkF*oWdM^TH)pjPi-E2#M6z75jbnsjr)4u zrIR?9C^*4wU$nx%NfD|4sF3UQQ;`bJ=WaXtms?>gr% zhd75nyzD$kESVJuhXxAMv4de+FYKsg(TzvRJnzJ{c6qmi$xDT*8gMu&5<_5$ z`PS~Ay_GElnwud^p1__aL*%P78Sv0lQ&U5Qef>9M(dlOD46Bs4Qd9Ern2K*Q7V=LI zWvtM3hl1DgkApx64Q<$(!U>dIA?d^noBS%&EYTt|YOKV7HTaro50}n;6@3T|qp^L9fnB-k3+Ub$IW(hszlk_z@%ykPH0cstMpN zyljd4txS2$4_CyM!LkHvw0|ZUP#P}|%^l#-I-4)wL&3yC@kA#N2O*xL& z7|Np0lVJV{)ik<9Zp}elIbOWeQoP=28^%)i_QY9?_*DYe*q>r2gm^k$Pc4e@`awf{ z?`KaMS>Ef;s`zviFc)Foz!o=TcNoN4Cc1AKe?|KPpM3QJf5Of!t?z*u48PI5?F3>S ztwRV*M|&w{r5+D}CpQP(oVH|YpKtqq!!_HQwa)W6_MI_R(2%)FIQ!8|{?epObhOXK&Q_>1Qgck|+5pzS-Db6U zchR}$B+XKPirf~+W*Sr!3G!fc#LnL`-~_5dEFe$lz$D1laT+eyX3!*opfLnIq0V^x z@cqTI)9OyVz~lI z3g2E9Mb2gTxsj>|KJ{Mybls?yT=EL5RhIUMjZwTK7j0;3>)?JnrZG{oZw?;#uwUcj zk41Il1OVQ2yM!5e_aeeI*Y z&n5-uiTXQTWsl>hos*+Q!mp+I&!Vk51TZCvO+N}|n=^KWq-7Dqh%hUHJK+0B_2qOA zb>QsaBRR{g&Q-exCSMgT3+`bB+V(BVhz_B}cJb-st2S#mKt1PZu2So1wR>S9jt9_Z z)E=2|amv%lE*~8F*;3z$KDUoFGWRjX!yk8LAOibAa&vV5=bWj+svk=A9BBSbwhH}I z8TVcoJslZFRzm~MOY6ReeGZ9EO`qZR1qoM4Sq|3ZnePDqL5Dk_jEqHE0Rto?7>nLU@)woga}(s#aanc?pY`#nYtzcDhrF;{%$TW_<+f30YV z@OYJfJM>2Ly~Y_NBQu~KE=8GPW+w_@AuDL zj%+CZZ-dk+^5^1jdB+J4Ju#1j>oZR>@o_P}{?!14a*#ls3*sob`c+tc=XM#?o|Y{) z9^^1zQ|!y0Y;9%a$_oOrr}GLxnn_{=XC)$HT`KDezD0@8;)Hq`(ITh(s@-Ue5Plh{ zHgr@23Xzusx#iiMYr_!(t?r+#r#5wkD^}rYaQC)hChJcKq9xXd+-e8pPVktArH!{< zH>Eq1WSPC2Db=UH^ix3zxDqvyZJ9LaPxHD@<$owKddFa^5)t@2o3$eI;D8M`s2z#J zRk<9JGLc?RXctu?i&K8g|Fx&5Luw4?n48Xmpl+{1no|+nWT-ML!dW`zn2W==Yr~c{ zH8#W^QG(T3Q`pTH#*3Q-SE?-z#@@?2E~lyba{mJ*G=j4?K56XVSFJfDIEHVK&|^Yi zkQzV)JlUnpYN`<}4DvI`%2~kq_?=;T17F2njWEs8u32ex)|-^?W!D6}GVFc3kYxT~IEv(~b)mh>d_7~|rwFFj0=YRi4QzZK zH0)@fUK}J~k9c=}(1V&-s(#Y+&~Ze8y2r6Xe*W`={ro!Q zh!(cnwSq74kGJn(Le?nI#j=OfxLjv9c(n+1g-A1pxSn3BiTM6Oy0Fd$-Uh)KCAc5~PV|0v)2m!{kD?yu8j2m&@ z`Bxmahl;}*5|G4YyTtVxlenUG1{;4esPl7)`a`7nu2B^04kb z!isGDR%Q*imEFZ6A&~z2SNG^eTqI%uEo+SLUCBMJ^{^7jehM>DzPcTnc;A3p$tYG? zD+-neCi;a!gcaGvHFE9mNGFal#i=AV*MG&^SRe8(na-3di=_&G09|beEJ<2`1Uek_ zh7Qf8H}aHeDc@&^)3ONT_s49BBsJq%pzN4Ia;Mp-)OkEsM1*Br;Q|UA6?2Yy7XC2R#cXDro(p)5K1}aALB+PLp~KS zz?JUqeV)p!7s51RBmKNaJekxQNz!!QhdPKa?1jL8d|F-|tQ4ooFDxv4(~B#|0xg4H z)es(}umS3=r^`l0fkt&67neo*p1PIDpV@;+u?(U+BfhOL?6^Y}a!p?b$Oqr^j;vW- z&7?)=#_vge+a}EMrX2ux@v?1T@FP_mOF{U`{YIW!C36q3*BS>|;T6Oc{#0G?U~_~A zhOKuyYBbvFJf7J3wQ>O2^Xcjxbr%iREKkJx5$HbqqU;l-+lMB?%2nEAU~aQC4ZKDu zy+hY3zr3ftt&&9sX%Ed<@Ly%Ew%1abs+W|NK-*- zDk;sM+p!4}8Om%uswPwV!_=1EoyOHH)CBGi*Wyyvt>%_U>)AAI*z9-1Y7dN`PK4Hc z;Rd>(2${@DPeKZSmGY=BPHEphn4U!Fxgec`RyCa z^mmtCwhbNxk!Ej=bOAgC0qp$!U#P(IQRk~w1)O?0VkaZNs3#u+Ae!m7CPuq;ya-ED zLj%B#)^5W|Xl%u~eUQWS#at^|0XrqXyJarog;@SnE{KNhIz^ZDJY-m7MWZU8akW=r zNTgP`La2j26yKc)$Bf)UOM7>bQBmZ}hyarS&W-&_o7nK1C5sO6zqUu}Y9=cguG4>N z-PxGNBz?^A0Fhh13Jmi+OBn!2Oh`tn@Ly(oRg5Q8NKQO2$fGo=VFd|m`+9-^IBuyN z0W1Kz0Npb!?S+%dLKywS_1ve;ATGD52PL+ihv!n%eH1S%fd^xatr38(F0Pg2*xg6p z(*B3e@K#!?vrzi(L<=S}f_J(p<~R)Z^1&mkOux-%Y-3ejETVZq*`U*7~Doi1w;8{bvtS zp50``jmweBuV$U36c9zHEL-~!S-7C`$SR&t!{A=OhvXPSfTNy|F#7-&fT3<5rvKh? zMy~w^1-avXCqf3`;20<;J?z{bd*2Hyz(Op)&5(Zm`o&QvL+kX%W5U1+YL|yKD)6|Y z2!h9{E6L@B^F5Ds)jg%_JavsB2y zsMSxxy=-B?{%&Dm!C_^zt+?zo`VvD=xpOi4U>$^KDK2j;R_G(_cE)UKd?2r@nfL=y z+~juz`y9DJ>Hx2#$NKBRP6{>5=J%`=WfJli2W1Upuo`Si=e~U(+!NA@@sNo zx?M+KwDMGpk4}d=Ee&DBdE-Oan8o6U*cx@4GAx-QLCL`tv``L7)0bfSkJ!xN`9W5x zcc`l*aRiNovKcLMpF@?6q^?FZLlDjjOZT;1>>~k*jRpmFp_w8HZYp7#h-4}BJA2wz z-P>uG`KMo2Tg zI7@3vf3#5Z@ex`1q`k&Xc|ZWf*b|Bv^h`I*deT?^ihLlK1oL`7AhLD?sDDDjV`yQuyKU)pw{!=nob>Gtn?J-|_vSP>4X4;@ozTpS&f~b(l_t7UJup z&>1OW{S>MB3S^;fEa@U_ouO2{K?*4z|qxi1?~qYkQ&z zK(^}@whT#3IgzOc9B!ChHJ_?Eqy@kGsY#(<)fcCHhzPozNSf2Wmlt1rGd0|(OWr}t zar4CVOqmqIMG>d^K!s1G^$_3ITlcm1+-Wl*mrmA!QEiz;Sgv;3h6AeIoW`IYzDlZn)kfdg+W#}7T|D?Y`C;v+ITs-IF!1r`@9N78ygRD0A z=7bjJyHIK6D?K?olRd5S(hW>y7gP;_X^4xbrj9R+F=i>lILv)^vvJLATh6JXXU)pt z=@P5T;AnLB(FD`&Gc)ISSv}CPHOxFCfB|fMWIpS?OUBhPx$$}4rj*7My3Pgxkz99$ zgXy{4-$h4P-N~qDWeU=-e7sXoKuEyxmvlo6e%MT;Nf+T;6hWXJ0M5qdz{{h>WkmRb zKR&$+JmuZ4)G%-87wyS;7;=h(r$e=I8FOGlCl=&tlk8W!Fjd7%tq)bQ%e?%dtL8KO z5wo2OkK{a(33juCvgQ@(Bn}=W;8~9ej=M9t(_Hcf1hI>XifS)&?c|w@w5gghI&?>U z#$)k4%GllEqEKVs88YcPf**BQ*0v~9vg$(CLc_(ga`?*|QBm3;UL_O?fbE60J$Hq` znU|SD^n+c^eBHR$_@Lkq=oq6=r~)*r>6f8erfp!M$`EUK$Kc4QK7KcTr=pU6 z9e9Hp4Vs7hgYB~E;de*VtOh>SjfyEQ?>H0`ij1bohkxAn>M`))Xa!@(ANug|pxI~` zt~i|=_v!p?gf+fRUhK{UAp&$6Q`qMZd(w;>f_gu(yGp(=G0_6&)iFNYLidw_2UJ#a zS_y+%J)&z7_e4ywc~zMiY*O#xI6%mg>W3ZkJD(%Kq5$~kfympHNX!lpsazv;Hgr3! zJ=b}&WFKIvq~V;Hu4`AqOW|DGzjKMK>43G@n$I7?GYt!Hh{R5?zy&q$kjUp0b-Wn% zYE@ojU1-Z=SL0Bvg%2^BaIzHI)MM7r(`q3Mw>CKH&HDbl@T)94N!R|<~oE$epEps#-0nA&| zVR;0xVO(0_E5+?UL(%y(Z{O|2cZ$0w%aS=wS}>9rscW*VAW%SNOVza6uU{D9pd630 z>MM@%Xqsy?Q)@kZq}9X5=`jY~zcbSd{l$h1GQWBrm`-6g0Z`k?feq@~G#~R@4@T`0 zmTD&%b@2D*zZG;!?U&i&hG>e0V+Evo;gr(R2v%)cxO9GUHMY>hZZ3Kex7sl6f-WF9 zdA=uB&^zOYi&Z_UV19n$;`rsworwktQ-_j0IHoLnN&l{gS6cQ0@+(+^wBW14QSPCs;-3yIRw)ESBdGri1>WS zlh4*`T)hXo>;3jV9@B-yoJsp~E5d55)shuBk^@Cp zSYX0Lq+iKn1E1h-VS#$deu3`yMuc&f`bXNh_87)h68}M8Or%A{g_S0&clK9~*eO9E z)*rINelrH4oH|oa(rEC2(B04`+KZ{JT3cf*sz`4@tt<#&ruTDoxg?JW)@xl7u;W)A z3uc;k`a&X*pZ@|?rhHY$psmzYpi0bkiPyPhR++$A7d|tnzQ?L11egl(rQ=&->N%>& zn#>LgTDDL;fxl>9=Q?=y6<0CXk&N-T+V}=SMV>dWp_yAvgI`2AO8m%okonP?_bW~W zdZlxSrPT3w;Q|4Fx-ZnZ-e;-<5Ip{h?&<9e#Bxr-ED$8dhs6sRHQJq!HUbmNzo0g! zne4%0u#!^0^1hehSMJ?IVejcmUQE4P$&M1R(rBrb*RU?&2`0Kp#XUOb^w@K z$f{o@lq~7;6B?ioS95<+fd*XT*+u|ee@F;)7e)@lUhN`rdsPS9_bslQbzy)fDq6zr zNhlVw)pd+-U|>KlsH!gcl=BS3dZ2~m?z)JvuG{!{foUYFmMaOGrAZV#DaK%})6ceM z#6{W<+r5})GcQshGrGGm}9jLHylg!^##r; zR4T~HH5;QV=NvdjL_W{-nhqw^1y4tL7-`;|r4n?1(je#5pMx7$(vtr%bF0aa*}^ZB zkh$2vs^bGKFNKiWY4iWM}b4n(x*EUhZa3i6P5rz zOR6vURO0JyLTnBoxVh|5U_iHPC2&4F^2-XU!0o)Ylgs0_h%lcJv^AU5r`N=D`Vz)y zYXP092%dMr{(K`Ju@keN z5$#i}Rn(x6L2+toC?Nc4WWTx*8vHWI+TU}zROzS%Igj-u@=pG8r6B&8PG$lv7K)Z`2Ue6bO@AZ7srpZr z@rdmXE3aJkZ?Ld{Tj3RS&!j#?MNjf1;#YLTl@b7f7A2%odvhE;M#L0g0d*|r9<4nA zwUmR4b>yj~1|Ne`etlbRJo`GY>lIbb10CrR%S|M6QPvm* z`uYER+Qjr>5IWz0-33A7mEqgViUPM{;}r*gCpTG<5#Fvsw*HgnPKUqG%7}zpI2K}D zW+7eC4BdJgloU49g~KOF7{y(5Tc9}8`5{}597WkM<&MGLSK{~YkRY?xc@IX@1v8ju zwqcls{g)Lu)A9pExya}h-)3B}S@pY%Bo$#URFlHy z7xw=Gb4RR=id|=g%j>6tMCv*ZsO&8at1snt)!@k1DCy>{%^i%{R}@;JtQ{ zFB>#i<;x^Y!|A|=-%F*RAyU^@hzm(on~kcCt#<~x4_aLfOSOl-C;vBWK-&w-)Q6(H zC^V3(Fo7;E{|5;XWarL6@9cVQKI#Z*lax#LfperIZcF@EOW~fXcCtOXH8Ivikh;2m ztT(*7q*2Mveg2ixhchX+TmiT>pqYwH$@D?ee{TNoFacP|G7|r2Qczq;3BmO}mDla@ zW~UGr1XA*V#4t9>76%ux{^W*n`e=-$>hBHDD~$%xCGuIG z*38Y4W%BlG=b=WhNy&Y?&^)&x;zsF~%4iOjlMX$VRKFvDG4D5IWDYx|F6VHj%FibK zXF|TEOL0lRh;AP>3tFJW$wmQPtW;F-nYE}X*l*D9yv$mgb zD*t!0nP6RgmVF;_q17*Lu$ss4!ZUPOx8QDHFA=OFq;@JD&xgONwzc9Vy$0D!Q+v5ds6H0xhxvL?A~1E zU@OHp6kpZ=#HTTxwp5R^fK+|s{^{=*cl(b7gB+`if}|a_WUi%73LiX-+o$0t7QZlM zD-OS--SS!TiudMEc!d(SOhZk7>4d+P38c1S+rxbP{m$fTmtD<(QI|T_-1NNBx4?uRsK!5WQUf(+aKHsB(aUjMB)KOv`)mdmUE@a^ZW zN4C7~7H~Wvt<&X113)m3V_mG~*93TZZ&7Ggi3kZ4@uuE!vmAtkeK2N-T$AD7J*T$* z6Ubm{p1!iUo|HX0z*|zQmYS@sgbZ88*HUws_OHa-cFzA4TN_cFGeS}xHTm=e)iMGf z)8zoka;q7ODwNFeYs((=n%Rv=xpE-8b~o-&E`}+v%=4T2el*up}$$wMA zy;UIMJ&W8vJT=c~Oc@qo+RH5q=q1U${*(E}QMHmE6LGOyfq z`It{Kt<0nsSsWS0aHa>1;%bOpe4odRZfItwmAcv`{*f(_-2uf&NY>sRktm2cL9qOU z*j4rpNnZB43J+&@oqq3L#@3&sG-AtyHT*bu%VxYQAe}tFMTaTB^<4vhRg1tcvub+3 zW&o{NqPt9A*p05trvbm`0S^$cOxe+})j{wU?xY(tVH_Hx1-uK*>`hlN;>f}i))Nxb zMXe9I-OT|cyinX<9cp2w)FNOo}lY}^|w+2Q{dT|Ba;9OPhr zAS=}R7ge9a&glXJ8<1z*5aTV=bCZ+`RCA>M;-;j*O)L~rWt6pD;<6~2+-CFhJhn* z9|N>%jdc+=pFexq8t-o3_EeB}Hs0Zty!O>9$9xW=RJzjWGMzH_iz~<#aA!>N1Hp)M zf9po8-FRvPDZ2NxA>cEZ8$SA=C{{c)Ov+N~588Ss*z82rZHQ(B3SvZpzEsOAtt)HW zzZ|ieoQaLR52Gq(989=c@>zB5fvGVUs>6c#`y*V7RviYz-%Cwhc+8?^-;N`(Kzm-) z2jid4s@S4SRVxnlCdWAkk3KMHS&&}!j%901ugTlQ{UC^duVZM4qu1jSejop0eK(<2Sp|#xePs4x=$A_} zbmTzgC0a9S77(OQ>Ex=_5f#8#Yw~>|uMKq8BtK(3Y*Zgoepixg2Qx;PIjpVvtCqp+ zW0rYRgY75s6-2h-VD&a5>i|vxr`hECWB&Q8q2*m)AE&<#9L{HKK{Eb0mqstd*y{oR z;!~GA?GZ^31T)&`8)|v^%i_sOh(JKiVFQi$w#CDx$*xqN*_kp_zj2uuGe;@a{i*gC zsj;f&vhx^v`zuErzqKp$)MN2OJ|#eM?!eTA2;0kRtU5KlZP(|Sn88%Dvt_X=f6C=k z)}Ob=^HNqNj}hN~iRG{j58x?cB!e;8G5<7ZIWIWOEWaDPNyEq*;2iwk(iY}Uh?I`g zS^>f}&;w&2PgeEn_n_A)!>m@pa!@bE>qcQ!t4~C8m&;wkvR7?CI^c5VQ)vP!B0sOH z&m9T)hB+r92=rID8Is+yMq*3XItQbMv=(d~kb9MGvzV6Ac_`c>X@MnTujwTtLboEE zDx~a^2z$elHxp1bu@`ssG+oHUlU6B${{=9e_msjfst(Ce*sXmzqTL7%7S(xc3n9U! z)9tL?yE%ql(S4U5==e+imoo7h(6^R{y2MVj1nU8WQN1V*avYH#<%T(s@m z%in%r5R#I4?dPHM7asjhAg7NsoBfCM*Uw(`n(FJ63;&ysd_S~;gFhhV9K)f?HrZE? z{l*dxB|k}oncu_){@S)IW~?dkx~skjvQ9*K{_$ig)C$Ks44cpGJCrVX9(mft+N*ig zg8y|BKKPsBa$luH0~-?)bPa;+>+Dy(j*f#?^Kc!N1a3psw0mT5>E9_>&*2ySzI%GkP#iz1~vgapLWH;#%ZwPmdIfBX-fj zenN8C!Pv6P2tJd{J`DE!{h62E$A5`ROaKRpaS3798#ADvbfcJNKN*nwr9{_^&HhBe z4%K>@Aqc&8U`m?AsI7q9StOo4Q~9@SNyV3pZC(?eP!n2>N%nkut3q;Tu0Eb3`#AkY z8kfAfxj=#B;|8g8w)WP3ZR|m6v=(T_AnRXe*nl(8mBv%r`H`2`)zjBsZ0)0wAzpT~ zet4^(SGgxk#n+p=(2}&mCi^f_D&bG3#Y@vaVHTX)$Fy1LjO2RF3|hoe*ndc$YfJAPnAMh-J^Sy7&6`;{aaDXM+)C zXCJw!^K9b%AIQ=G`E6G3CCMLfdJBDFrQ^6u+tLkCiGEU7`&8*# zEEIfq-Er5s4lOJ~G#edk`aBf0w1WWGlSL!1$}=u*xMUA0_%AiV_wQK!CTznE3YzRr z?yxVVH844OaQD#7|-NHd_~pZ&ljPYIeeDl9C_^g3-W;Qnt859OXA0=AT-q+U1B#jvG&wTF!9 z>7Dbt9v9=BpRV~r6Wge`eni!#Uq@8MmUKr8@cf9$F>70+_=D;Z+yNJ`EO&%dqnI;t zjG}FKXq*a`U6j?Htp049)N^BO$U7#F3nINEd_@%2rhpG_zXuqWx25^1Xh^?L8Z!GK zZyQi$brW z<_dST%M5O~-uMEAuhD7SO=j~IItd-uee4Bt(7eaNh6AdBF^qP%4 zygAk>E)w+b7m2EZ?qrdleFN`!rJ4C zrpX$9Kjjs5ROefMy=J;G5D_fh4uq7wBp)6@$NG+#UGhM-t@dC$YZjKQqc{a&%%yob zit zGjqgJXdBr=4o`npTL89^b@)SaZO{HkU$$M$`4c+)MQfhnbtc+Bmwv8OEN`2`dR#gK zv7wAlzVH$^vv&z$M; zv1UE#CzF9<|IBmS*!T1%c2M8*{TmhxH*CHIv5x(#x)9f&4PbGue}-yYGG0&Z-o|(5 z2JK&Eb`LHSJ9Ra%l2oDv5RbZ0fGDls^4CBcB?UxD?j#>%XuX74otyg=@;0&lTCQtkf!)gwyjRp;R)+`JE-kL9%pXmyDI7#86$m3p;CG^z}L| zi#HyJ38{Ba0B-Ek1d;e2%pP$|YgDP{5!Y$30n*Jt4hlq2TF&(K9D+Spw0O#Vat1+l zpN%n5G3^rUO8MC#8p-T*iJ9|TVX^*Y^_FB8?(ajpUV>v%j`-zlcndgG5by>-Xbf*D z<(>{~1gTfpo=nd-UT}`e6@<#h-IK6zHHe?dr=F?deY-AsRGV^6M7bk??08&A z1~r5`A^5&3n?VTycRSIGDyl}-+{>7sNr}O5+GHl{c0DZjEL0DKC2v?g*7(o|PECU> zQj5y>#g#Ld#%+@C{^S_`F)MNV$oAR#oy$*iJiqAlR4&q&|7G4qUZC)Ap&{{C9WE{l zjPBjJOD+jawVGE>X_ml{)yTt3P;JBwKL$b#8ZSL>18c2-MvKlrgExUfuSd?9Qm@JY z?VNa;;xJKBoPJ~w+#oU=S~OS`6PAz#ZuSeS1RV_M=cnm`$tpc)q! zx-OIt??A{*M2x*O*bE9B#l1+#s{<>aR-xj8)tTa(`#D{&llr$e5h1P?r-4;_p4GkQ zm=|@ga=Z4o?q%YQ%ujCq6Pzl?R|ScA4P$kcB!=i{5$Av3^mn-t^x4K%e;+|7xo1k5m#=+}7k#}e3yl-MH;b^7 z^R}Ry)2q}dzIehdBpD(G0P-+`)$E#YnA3-(mELZSqF8Ll${2Jl#7R!WkMVV(m6>bmu7cvDm9%6@s{4sBH$60h#DcLa z^|7}uGh^>f-N6A(0hyoL?8B^{^tOq??wWyu13`2%V-^5SqYZbt2f_HD`hO11k*>3VWY}^o*zE*lniZS@z6!B>S!Ct zWCeCHy~%6hwyYyQ-$(cvn@}~vu8;iQS~`wNERlm!y?TChTm<)cQFyb9yqdzij&?TE zV|!A`BO58O8m#cux;0A#`_Y`Y*$K}^K-bD_09UAM4I(&w(iaOD@%2rdGa+H-d28*^=y`f)5??6a=UT_>IG!=?~Y@~eI>(g8~)9b#Y*W*b4A-`%oq~e-5H$GEtd?H#_O{dwra#* zOy#M3^}*ewAJZLTv_PIv0YqFtI*;!U|H&v)eE!((p*Qo!DJ9gdcT=ltsG6uc#X;r})vC6^CxxAX zS%S%lZ(xPR!x+Ek?H=gn(EtH>r|;%A;fPYkX1)24nvFai#0>c;(ugEcm_pwT&1qNO z-`Y`Tej@-JLGF!T&wmAG>Vv9?0M^q$r+){7A*c8F1L)1wzqu)cM066MNI>cHy`l(7 zd)Ma;&YKS^5l2zY`Z|ww7rDES4giE;-sU-^4DsQXkvz7BC#5j`W&s}bv+J)CP{mf; z);A9eU_H|OgFwR%A+Ppa?#&vqk zKxi+v8$BR6MX-;zkfV%>CxR;^_1|>ZjwI58tpodi$7%Zd7T*7TJ`}2@Cey^l8k7%cObtiMAQt3N(?nU`TMCg4XVu8B+M@4p| z@-sR-`nUXR?B=}d$Da}_?|-vAmiDrYkA}-u+qWjZ_axzJam%RlEJRi#j`a>@Mpr{Zmlp!GQ(lqA!KNxg|8zDxEKGKgrV680-((r5`8$qXSW48SitY>3>_~+ zhJX)lY+BH}E1T^35vV~0uaa7D7|}dK&$jHZlyyIxVkGTrxlZvG5#FmkE7e;)Sf@=4 z)$Oz>_@3$hA(lvtE`FZu%+hYedDlT!p{Na+OY7q4MQq}3Zom?jg|+_IW%iVS20U*$ zHb2Kxe0G;eA-*f0N<*^97Q3#xD^xVUIaLpjC2<{Y$YDYgm2g^ayFFAd25( zMi)}EO-a}eyu|@&kE1$9)?S``i0wxodxi^$1jvVqSR z$nB>_Hx*JOCGz4oQ8*}s4hB?`nnMfeAeA+vo=1KxK9|kIZ_PCsO{eIb(O}I9*G5*ZtuPD*8REYxK z*-b2?<(Yvr71mBRC1T&Mj2=vCDi4ZhBaT$z$xkMn_-Fl5qY|e z!OPz~+LD^1GL_mtKgp{&UEUDbft&6~B7$Ued^ZA2S+31C%j(UUz=^{G_+ygk^rN?ACBT@5gS~LUOQ24^(8i;E#h{E>|ZOnB7wqv}T6I-L* z$_z11gq{Cyb6fi!`R8aPbDO*q_!_Tdp2hI1+cRSs?uax^R>jIn3L`6e$lMBrEp;0_ zLq{AO{x8C;LbgBJ{74`G1!j~5z{i>_Kmgp2wAP2gRQ&)@#g#5~dGqq>p-U?xU+bXF zl^vOUH~q_EDBbK3Hup#_wW1frO8aLb9sO%5XyzlsIo3ImCO?~2M?6&*-k0~VgcR%= zxOKwB>PaP#`heuJ#bQ({+Q^A5GjyQoF4JqRQJt+LF^C%(=ZkF(W5cjRQr8DYr_xui z_hr4Izv=0P@@I2Sua<@mVrpqQ=cg9LQNP!HWyh$?J=GPcH^g5p)=ys&bML@GDy)L zU66%hAC_nC!ylIAQZt~uSp!9q3LCssPfPFIEU_YRzNpDn(ASkjKE&#9sK%iC5BE!7wpkg!QQ5-1 TiR= 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 T2@fmu2~d((m#cjFI^=%>, + buffer_id: BufferId, + diagnostics_editor: Option>, + cx: &mut App, + ) -> Vec { + let Some(primary_ix) = diagnostic_group + .iter() + .position(|d| d.diagnostic.is_primary) + else { + return Vec::new(); + }; + let primary = diagnostic_group[primary_ix].clone(); + let mut same_row = Vec::new(); + let mut close = Vec::new(); + let mut distant = Vec::new(); + let group_id = primary.diagnostic.group_id; + for (ix, entry) in diagnostic_group.into_iter().enumerate() { + if entry.diagnostic.is_primary { + continue; + } + if entry.range.start.row == primary.range.start.row { + same_row.push(entry) + } else if entry.range.start.row.abs_diff(primary.range.start.row) < 5 { + close.push(entry) + } else { + distant.push((ix, entry)) + } + } + + let mut markdown = + Markdown::escape(&if let Some(source) = primary.diagnostic.source.as_ref() { + format!("{}: {}", source, primary.diagnostic.message) + } else { + primary.diagnostic.message + }) + .to_string(); + for entry in same_row { + markdown.push_str("\n- hint: "); + markdown.push_str(&Markdown::escape(&entry.diagnostic.message)) + } + + for (ix, entry) in &distant { + markdown.push_str("\n- hint: ["); + markdown.push_str(&Markdown::escape(&entry.diagnostic.message)); + markdown.push_str(&format!("](file://#diagnostic-{group_id}-{ix})\n",)) + } + + let mut results = vec![DiagnosticBlock { + initial_range: primary.range, + severity: primary.diagnostic.severity, + buffer_id, + diagnostics_editor: diagnostics_editor.clone(), + markdown: cx.new(|cx| Markdown::new(markdown.into(), None, None, cx)), + }]; + + for entry in close { + let markdown = if let Some(source) = entry.diagnostic.source.as_ref() { + format!("{}: {}", source, entry.diagnostic.message) + } else { + entry.diagnostic.message + }; + let markdown = Markdown::escape(&markdown).to_string(); + + results.push(DiagnosticBlock { + initial_range: entry.range, + severity: entry.diagnostic.severity, + buffer_id, + diagnostics_editor: diagnostics_editor.clone(), + markdown: cx.new(|cx| Markdown::new(markdown.into(), None, None, cx)), + }); + } + + for (_, entry) in distant { + let markdown = if let Some(source) = entry.diagnostic.source.as_ref() { + format!("{}: {}", source, entry.diagnostic.message) + } else { + entry.diagnostic.message + }; + let mut markdown = Markdown::escape(&markdown).to_string(); + markdown.push_str(&format!( + " ([back](file://#diagnostic-{group_id}-{primary_ix}))" + )); + // problem: group-id changes... + // - only an issue in diagnostics because caching + + results.push(DiagnosticBlock { + initial_range: entry.range, + severity: entry.diagnostic.severity, + buffer_id, + diagnostics_editor: diagnostics_editor.clone(), + markdown: cx.new(|cx| Markdown::new(markdown.into(), None, None, cx)), + }); + } + + results + } +} + +impl editor::DiagnosticRenderer for DiagnosticRenderer { + fn render_group( + &self, + diagnostic_group: Vec>, + buffer_id: BufferId, + snapshot: EditorSnapshot, + editor: WeakEntity, + cx: &mut App, + ) -> Vec> { + let blocks = Self::diagnostic_blocks_for_group(diagnostic_group, buffer_id, None, cx); + blocks + .into_iter() + .map(|block| { + let editor = editor.clone(); + BlockProperties { + placement: BlockPlacement::Near( + snapshot + .buffer_snapshot + .anchor_after(block.initial_range.start), + ), + height: Some(1), + style: BlockStyle::Flex, + render: Arc::new(move |bcx| block.render_block(editor.clone(), bcx)), + priority: 1, + } + }) + .collect() + } +} + +#[derive(Clone)] +pub(crate) struct DiagnosticBlock { + pub(crate) initial_range: Range, + pub(crate) severity: DiagnosticSeverity, + pub(crate) buffer_id: BufferId, + pub(crate) markdown: Entity, + pub(crate) diagnostics_editor: Option>, +} + +impl DiagnosticBlock { + pub fn render_block(&self, editor: WeakEntity, bcx: &BlockContext) -> AnyElement { + let cx = &bcx.app; + let status_colors = bcx.app.theme().status(); + let max_width = px(600.); + + let (background_color, border_color) = match self.severity { + DiagnosticSeverity::ERROR => (status_colors.error_background, status_colors.error), + DiagnosticSeverity::WARNING => { + (status_colors.warning_background, status_colors.warning) + } + DiagnosticSeverity::INFORMATION => (status_colors.info_background, status_colors.info), + DiagnosticSeverity::HINT => (status_colors.hint_background, status_colors.info), + _ => (status_colors.ignored_background, status_colors.ignored), + }; + let settings = ThemeSettings::get_global(cx); + let editor_line_height = (settings.line_height() * settings.buffer_font_size(cx)).round(); + let line_height = editor_line_height; + let buffer_id = self.buffer_id; + let diagnostics_editor = self.diagnostics_editor.clone(); + + div() + .border_l_2() + .px_2() + .line_height(line_height) + .bg(background_color) + .border_color(border_color) + .max_w(max_width) + .child( + MarkdownElement::new(self.markdown.clone(), hover_markdown_style(bcx.window, cx)) + .on_url_click({ + move |link, window, cx| { + Self::open_link( + editor.clone(), + &diagnostics_editor, + link, + window, + buffer_id, + cx, + ) + } + }), + ) + .into_any_element() + } + + pub fn open_link( + editor: WeakEntity, + diagnostics_editor: &Option>, + link: SharedString, + window: &mut Window, + buffer_id: BufferId, + cx: &mut App, + ) { + editor + .update(cx, |editor, cx| { + let Some(diagnostic_link) = link.strip_prefix("file://#diagnostic-") else { + editor::hover_popover::open_markdown_url(link, window, cx); + return; + }; + let Some((group_id, ix)) = maybe!({ + let (group_id, ix) = diagnostic_link.split_once('-')?; + let group_id: usize = group_id.parse().ok()?; + let ix: usize = ix.parse().ok()?; + Some((group_id, ix)) + }) else { + return; + }; + + if let Some(diagnostics_editor) = diagnostics_editor { + if let Some(diagnostic) = diagnostics_editor + .update(cx, |diagnostics, _| { + diagnostics + .diagnostics + .get(&buffer_id) + .cloned() + .unwrap_or_default() + .into_iter() + .filter(|d| d.diagnostic.group_id == group_id) + .nth(ix) + }) + .ok() + .flatten() + { + let multibuffer = editor.buffer().read(cx); + let Some(snapshot) = multibuffer + .buffer(buffer_id) + .map(|entity| entity.read(cx).snapshot()) + else { + return; + }; + + for (excerpt_id, range) in multibuffer.excerpts_for_buffer(buffer_id, cx) { + if range.context.overlaps(&diagnostic.range, &snapshot) { + Self::jump_to( + editor, + Anchor::range_in_buffer( + excerpt_id, + buffer_id, + diagnostic.range, + ), + window, + cx, + ); + return; + } + } + } + } else { + if let Some(diagnostic) = editor + .snapshot(window, cx) + .buffer_snapshot + .diagnostic_group(buffer_id, group_id) + .nth(ix) + { + Self::jump_to(editor, diagnostic.range, window, cx) + } + }; + }) + .ok(); + } + + fn jump_to( + editor: &mut Editor, + range: Range, + window: &mut Window, + cx: &mut Context, + ) { + let snapshot = &editor.buffer().read(cx).snapshot(cx); + let range = range.start.to_offset(&snapshot)..range.end.to_offset(&snapshot); + + editor.unfold_ranges(&[range.start..range.end], true, false, cx); + editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| { + s.select_ranges([range.start..range.start]); + }); + window.focus(&editor.focus_handle(cx)); + } +} diff --git a/crates/diagnostics/src/diagnostics.rs b/crates/diagnostics/src/diagnostics.rs index fc336c7836..4f43db0a5c 100644 --- a/crates/diagnostics/src/diagnostics.rs +++ b/crates/diagnostics/src/diagnostics.rs @@ -1,38 +1,39 @@ pub mod items; mod toolbar_controls; +mod diagnostic_renderer; + #[cfg(test)] mod diagnostics_tests; use anyhow::Result; -use collections::{BTreeSet, HashSet}; +use collections::{BTreeSet, HashMap}; +use diagnostic_renderer::DiagnosticBlock; use editor::{ - Editor, EditorEvent, ExcerptId, ExcerptRange, MultiBuffer, ToOffset, diagnostic_block_renderer, - display_map::{BlockPlacement, BlockProperties, BlockStyle, CustomBlockId, RenderBlock}, - highlight_diagnostic_message, + DEFAULT_MULTIBUFFER_CONTEXT, Editor, EditorEvent, ExcerptRange, MultiBuffer, PathKey, + display_map::{BlockPlacement, BlockProperties, BlockStyle, CustomBlockId}, scroll::Autoscroll, }; use gpui::{ AnyElement, AnyView, App, AsyncApp, Context, Entity, EventEmitter, FocusHandle, Focusable, - Global, HighlightStyle, InteractiveElement, IntoElement, ParentElement, Render, SharedString, - Styled, StyledText, Subscription, Task, WeakEntity, Window, actions, div, svg, + Global, InteractiveElement, IntoElement, ParentElement, Render, SharedString, Styled, + Subscription, Task, WeakEntity, Window, actions, div, }; use language::{ - Bias, Buffer, BufferRow, BufferSnapshot, Diagnostic, DiagnosticEntry, DiagnosticSeverity, - Point, Selection, SelectionGoal, ToTreeSitterPoint, + Bias, Buffer, BufferRow, BufferSnapshot, DiagnosticEntry, Point, ToTreeSitterPoint, }; -use lsp::LanguageServerId; +use lsp::DiagnosticSeverity; use project::{DiagnosticSummary, Project, ProjectPath, project_settings::ProjectSettings}; use settings::Settings; use std::{ any::{Any, TypeId}, cmp, cmp::Ordering, - mem, ops::{Range, RangeInclusive}, sync::Arc, time::Duration, }; +use text::{BufferId, OffsetRangeExt}; use theme::ActiveTheme; pub use toolbar_controls::ToolbarControls; use ui::{Icon, IconName, Label, h_flex, prelude::*}; @@ -49,41 +50,28 @@ struct IncludeWarnings(bool); impl Global for IncludeWarnings {} pub fn init(cx: &mut App) { + editor::set_diagnostic_renderer(diagnostic_renderer::DiagnosticRenderer {}, cx); cx.observe_new(ProjectDiagnosticsEditor::register).detach(); } -struct ProjectDiagnosticsEditor { +pub(crate) struct ProjectDiagnosticsEditor { project: Entity, workspace: WeakEntity, focus_handle: FocusHandle, editor: Entity, + diagnostics: HashMap>>, + blocks: HashMap>, summary: DiagnosticSummary, - excerpts: Entity, - path_states: Vec, - paths_to_update: BTreeSet<(ProjectPath, Option)>, + multibuffer: Entity, + paths_to_update: BTreeSet, include_warnings: bool, - context: u32, update_excerpts_task: Option>>, _subscription: Subscription, } -struct PathState { - path: ProjectPath, - diagnostic_groups: Vec, -} - -struct DiagnosticGroupState { - language_server_id: LanguageServerId, - primary_diagnostic: DiagnosticEntry, - primary_excerpt_ix: usize, - excerpts: Vec, - blocks: HashSet, - block_count: usize, -} - impl EventEmitter for ProjectDiagnosticsEditor {} -const DIAGNOSTICS_UPDATE_DEBOUNCE: Duration = Duration::from_millis(50); +const DIAGNOSTICS_UPDATE_DELAY: Duration = Duration::from_millis(50); impl Render for ProjectDiagnosticsEditor { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { @@ -149,8 +137,7 @@ impl ProjectDiagnosticsEditor { workspace.register_action(Self::deploy); } - fn new_with_context( - context: u32, + fn new( include_warnings: bool, project_handle: Entity, workspace: WeakEntity, @@ -170,8 +157,7 @@ impl ProjectDiagnosticsEditor { language_server_id, path, } => { - this.paths_to_update - .insert((path.clone(), Some(*language_server_id))); + this.paths_to_update.insert(path.clone()); this.summary = project.read(cx).diagnostic_summary(false, cx); cx.emit(EditorEvent::TitleChanged); @@ -201,6 +187,7 @@ impl ProjectDiagnosticsEditor { Editor::for_multibuffer(excerpts.clone(), Some(project_handle.clone()), window, cx); editor.set_vertical_scroll_margin(5, cx); editor.disable_inline_diagnostics(); + editor.set_all_diagnostics_active(cx); editor }); cx.subscribe_in( @@ -210,7 +197,7 @@ impl ProjectDiagnosticsEditor { cx.emit(event.clone()); match event { EditorEvent::Focused => { - if this.path_states.is_empty() { + if this.multibuffer.read(cx).is_empty() { window.focus(&this.focus_handle); } } @@ -229,14 +216,14 @@ impl ProjectDiagnosticsEditor { let project = project_handle.read(cx); let mut this = Self { project: project_handle.clone(), - context, summary: project.diagnostic_summary(false, cx), + diagnostics: Default::default(), + blocks: Default::default(), include_warnings, workspace, - excerpts, + multibuffer: excerpts, focus_handle, editor, - path_states: Default::default(), paths_to_update: Default::default(), update_excerpts_task: None, _subscription: project_event_subscription, @@ -252,15 +239,15 @@ impl ProjectDiagnosticsEditor { let project_handle = self.project.clone(); self.update_excerpts_task = Some(cx.spawn_in(window, async move |this, cx| { cx.background_executor() - .timer(DIAGNOSTICS_UPDATE_DEBOUNCE) + .timer(DIAGNOSTICS_UPDATE_DELAY) .await; loop { - let Some((path, language_server_id)) = this.update(cx, |this, _| { - let Some((path, language_server_id)) = this.paths_to_update.pop_first() else { + let Some(path) = this.update(cx, |this, _| { + let Some(path) = this.paths_to_update.pop_first() else { this.update_excerpts_task.take(); return None; }; - Some((path, language_server_id)) + Some(path) })? else { break; @@ -272,7 +259,7 @@ impl ProjectDiagnosticsEditor { .log_err() { this.update_in(cx, |this, window, cx| { - this.update_excerpts(path, language_server_id, buffer, window, cx) + this.update_excerpts(buffer, window, cx) })? .await?; } @@ -281,23 +268,6 @@ impl ProjectDiagnosticsEditor { })); } - fn new( - project_handle: Entity, - include_warnings: bool, - workspace: WeakEntity, - window: &mut Window, - cx: &mut Context, - ) -> Self { - Self::new_with_context( - editor::DEFAULT_MULTIBUFFER_CONTEXT, - include_warnings, - project_handle, - workspace, - window, - cx, - ) - } - fn deploy( workspace: &mut Workspace, _: &Deploy, @@ -319,8 +289,8 @@ impl ProjectDiagnosticsEditor { let diagnostics = cx.new(|cx| { ProjectDiagnosticsEditor::new( - workspace.project().clone(), include_warnings, + workspace.project().clone(), workspace_handle, window, cx, @@ -338,7 +308,7 @@ impl ProjectDiagnosticsEditor { } fn focus_in(&mut self, window: &mut Window, cx: &mut Context) { - if self.focus_handle.is_focused(window) && !self.path_states.is_empty() { + if self.focus_handle.is_focused(window) && !self.multibuffer.read(cx).is_empty() { self.editor.focus_handle(cx).focus(window) } } @@ -356,396 +326,212 @@ impl ProjectDiagnosticsEditor { self.project.update(cx, |project, cx| { let mut paths = project .diagnostic_summaries(false, cx) - .map(|(path, _, _)| (path, None)) + .map(|(path, _, _)| path) .collect::>(); - paths.extend( - self.path_states - .iter() - .map(|state| (state.path.clone(), None)), - ); - let paths_to_update = std::mem::take(&mut self.paths_to_update); - paths.extend(paths_to_update.into_iter().map(|(path, _)| (path, None))); + self.multibuffer.update(cx, |multibuffer, cx| { + for buffer in multibuffer.all_buffers() { + if let Some(file) = buffer.read(cx).file() { + paths.insert(ProjectPath { + path: file.path().clone(), + worktree_id: file.worktree_id(cx), + }); + } + } + }); self.paths_to_update = paths; }); self.update_stale_excerpts(window, cx); } + fn diagnostics_are_unchanged( + &self, + existing: &Vec>, + new: &Vec>, + snapshot: &BufferSnapshot, + ) -> bool { + if existing.len() != new.len() { + return false; + } + existing.iter().zip(new.iter()).all(|(existing, new)| { + existing.diagnostic.message == new.diagnostic.message + && existing.diagnostic.severity == new.diagnostic.severity + && existing.diagnostic.is_primary == new.diagnostic.is_primary + && existing.range.to_offset(snapshot) == new.range.to_offset(snapshot) + }) + } + fn update_excerpts( &mut self, - path_to_update: ProjectPath, - server_to_update: Option, buffer: Entity, window: &mut Window, cx: &mut Context, ) -> Task> { - let was_empty = self.path_states.is_empty(); - let snapshot = buffer.read(cx).snapshot(); - let path_ix = match self - .path_states - .binary_search_by_key(&&path_to_update, |e| &e.path) - { - Ok(ix) => ix, - Err(ix) => { - self.path_states.insert( - ix, - PathState { - path: path_to_update.clone(), - diagnostic_groups: Default::default(), - }, - ); - ix - } - }; - let mut prev_excerpt_id = if path_ix > 0 { - let prev_path_last_group = &self.path_states[path_ix - 1] - .diagnostic_groups - .last() - .unwrap(); - *prev_path_last_group.excerpts.last().unwrap() - } else { - ExcerptId::min() - }; - - let mut new_group_ixs = Vec::new(); - let mut blocks_to_add = Vec::new(); - let mut blocks_to_remove = HashSet::default(); - let mut first_excerpt_id = None; + let was_empty = self.multibuffer.read(cx).is_empty(); + let buffer_snapshot = buffer.read(cx).snapshot(); + let buffer_id = buffer_snapshot.remote_id(); let max_severity = if self.include_warnings { DiagnosticSeverity::WARNING } else { DiagnosticSeverity::ERROR }; - let excerpts = self.excerpts.clone().downgrade(); - let context = self.context; - let editor = self.editor.clone().downgrade(); - cx.spawn_in(window, async move |this, cx| { - let mut old_groups = this - .update(cx, |this, _| { - mem::take(&mut this.path_states[path_ix].diagnostic_groups) - })? - .into_iter() - .enumerate() - .peekable(); - let mut new_groups = snapshot - .diagnostic_groups(server_to_update) - .into_iter() - .filter(|(_, group)| { - group.entries[group.primary_ix].diagnostic.severity <= max_severity - }) - .peekable(); - loop { - let mut to_insert = None; - let mut to_remove = None; - let mut to_keep = None; - match (old_groups.peek(), new_groups.peek()) { - (None, None) => break, - (None, Some(_)) => to_insert = new_groups.next(), - (Some((_, old_group)), None) => { - if server_to_update.map_or(true, |id| id == old_group.language_server_id) { - to_remove = old_groups.next(); - } else { - to_keep = old_groups.next(); - } - } - (Some((_, old_group)), Some((new_language_server_id, new_group))) => { - let old_primary = &old_group.primary_diagnostic; - let new_primary = &new_group.entries[new_group.primary_ix]; - match compare_diagnostics(old_primary, new_primary, &snapshot) - .then_with(|| old_group.language_server_id.cmp(new_language_server_id)) - { - Ordering::Less => { - if server_to_update - .map_or(true, |id| id == old_group.language_server_id) - { - to_remove = old_groups.next(); - } else { - to_keep = old_groups.next(); - } - } - Ordering::Equal => { - to_keep = old_groups.next(); - new_groups.next(); - } - Ordering::Greater => to_insert = new_groups.next(), - } - } + + cx.spawn_in(window, async move |this, mut cx| { + let diagnostics = buffer_snapshot + .diagnostics_in_range::<_, text::Anchor>( + Point::zero()..buffer_snapshot.max_point(), + false, + ) + .filter(|d| !(d.diagnostic.is_primary && d.diagnostic.is_unnecessary)) + .collect::>(); + let unchanged = this.update(cx, |this, _| { + if this.diagnostics.get(&buffer_id).is_some_and(|existing| { + this.diagnostics_are_unchanged(existing, &diagnostics, &buffer_snapshot) + }) { + return true; } + this.diagnostics.insert(buffer_id, diagnostics.clone()); + return false; + })?; + if unchanged { + return Ok(()); + } - if let Some((language_server_id, group)) = to_insert { - let mut group_state = DiagnosticGroupState { - language_server_id, - primary_diagnostic: group.entries[group.primary_ix].clone(), - primary_excerpt_ix: 0, - excerpts: Default::default(), - blocks: Default::default(), - block_count: 0, - }; - let mut pending_range: Option<(Range, Range, usize)> = None; - let mut is_first_excerpt_for_group = true; - for (ix, entry) in group.entries.iter().map(Some).chain([None]).enumerate() { - let resolved_entry = entry.map(|e| e.resolve::(&snapshot)); - let expanded_range = if let Some(entry) = &resolved_entry { - Some( - context_range_for_entry( - entry.range.clone(), - context, - snapshot.clone(), - (**cx).clone(), - ) - .await, - ) - } else { - None - }; - if let Some((range, context_range, start_ix)) = &mut pending_range { - if let Some(expanded_range) = expanded_range.clone() { - // If the entries are overlapping or next to each-other, merge them into one excerpt. - if context_range.end.row + 1 >= expanded_range.start.row { - context_range.end = context_range.end.max(expanded_range.end); - continue; - } + let mut grouped: HashMap> = HashMap::default(); + for entry in diagnostics { + grouped + .entry(entry.diagnostic.group_id) + .or_default() + .push(DiagnosticEntry { + range: entry.range.to_point(&buffer_snapshot), + diagnostic: entry.diagnostic, + }) + } + let mut blocks: Vec = Vec::new(); + + for (_, group) in grouped { + let group_severity = group.iter().map(|d| d.diagnostic.severity).min(); + if group_severity.is_none_or(|s| s > max_severity) { + continue; + } + let more = cx.update(|_, cx| { + crate::diagnostic_renderer::DiagnosticRenderer::diagnostic_blocks_for_group( + group, + buffer_snapshot.remote_id(), + Some(this.clone()), + cx, + ) + })?; + + for item in more { + let insert_pos = blocks + .binary_search_by(|existing| { + match existing.initial_range.start.cmp(&item.initial_range.start) { + Ordering::Equal => item + .initial_range + .end + .cmp(&existing.initial_range.end) + .reverse(), + other => other, } + }) + .unwrap_or_else(|pos| pos); - let excerpt_id = excerpts.update(cx, |excerpts, cx| { - excerpts - .insert_excerpts_after( - prev_excerpt_id, - buffer.clone(), - [ExcerptRange { - context: context_range.clone(), - primary: range.clone(), - }], - cx, - ) - .pop() - .unwrap() - })?; - - prev_excerpt_id = excerpt_id; - first_excerpt_id.get_or_insert(prev_excerpt_id); - group_state.excerpts.push(excerpt_id); - let header_position = (excerpt_id, language::Anchor::MIN); - - if is_first_excerpt_for_group { - is_first_excerpt_for_group = false; - let mut primary = - group.entries[group.primary_ix].diagnostic.clone(); - primary.message = - primary.message.split('\n').next().unwrap().to_string(); - group_state.block_count += 1; - blocks_to_add.push(BlockProperties { - placement: BlockPlacement::Above(header_position), - height: Some(2), - style: BlockStyle::Sticky, - render: diagnostic_header_renderer(primary), - priority: 0, - }); - } - - for entry in &group.entries[*start_ix..ix] { - let mut diagnostic = entry.diagnostic.clone(); - if diagnostic.is_primary { - group_state.primary_excerpt_ix = group_state.excerpts.len() - 1; - diagnostic.message = - entry.diagnostic.message.split('\n').skip(1).collect(); - } - - if !diagnostic.message.is_empty() { - group_state.block_count += 1; - blocks_to_add.push(BlockProperties { - placement: BlockPlacement::Below(( - excerpt_id, - entry.range.start, - )), - height: Some( - diagnostic.message.matches('\n').count() as u32 + 1, - ), - style: BlockStyle::Fixed, - render: diagnostic_block_renderer(diagnostic, None, true), - priority: 0, - }); - } - } - - pending_range.take(); - } - - if let Some(entry) = resolved_entry.as_ref() { - let range = entry.range.clone(); - pending_range = Some((range, expanded_range.unwrap(), ix)); - } - } - - this.update(cx, |this, _| { - new_group_ixs.push(this.path_states[path_ix].diagnostic_groups.len()); - this.path_states[path_ix] - .diagnostic_groups - .push(group_state); - })?; - } else if let Some((_, group_state)) = to_remove { - excerpts.update(cx, |excerpts, cx| { - excerpts.remove_excerpts(group_state.excerpts.iter().copied(), cx) - })?; - blocks_to_remove.extend(group_state.blocks.iter().copied()); - } else if let Some((_, group_state)) = to_keep { - prev_excerpt_id = *group_state.excerpts.last().unwrap(); - first_excerpt_id.get_or_insert(prev_excerpt_id); - - this.update(cx, |this, _| { - this.path_states[path_ix] - .diagnostic_groups - .push(group_state) - })?; + blocks.insert(insert_pos, item); } } - let excerpts_snapshot = excerpts.update(cx, |excerpts, cx| excerpts.snapshot(cx))?; - editor.update(cx, |editor, cx| { - editor.remove_blocks(blocks_to_remove, None, cx); - let block_ids = editor.insert_blocks( - blocks_to_add.into_iter().flat_map(|block| { - let placement = match block.placement { - BlockPlacement::Above((excerpt_id, text_anchor)) => { - BlockPlacement::Above( - excerpts_snapshot.anchor_in_excerpt(excerpt_id, text_anchor)?, - ) - } - BlockPlacement::Below((excerpt_id, text_anchor)) => { - BlockPlacement::Below( - excerpts_snapshot.anchor_in_excerpt(excerpt_id, text_anchor)?, - ) - } - BlockPlacement::Replace(_) | BlockPlacement::Near(_) => { - unreachable!( - "no Near/Replace block should have been pushed to blocks_to_add" - ) - } - }; - Some(BlockProperties { - placement, - height: block.height, - style: block.style, - render: block.render, - priority: 0, - }) - }), - Some(Autoscroll::fit()), - cx, - ); - - let mut block_ids = block_ids.into_iter(); - this.update(cx, |this, _| { - for ix in new_group_ixs { - let group_state = &mut this.path_states[path_ix].diagnostic_groups[ix]; - group_state.blocks = - block_ids.by_ref().take(group_state.block_count).collect(); - } - })?; - Result::<(), anyhow::Error>::Ok(()) - })??; + let mut excerpt_ranges: Vec> = Vec::new(); + for b in blocks.iter() { + let excerpt_range = context_range_for_entry( + b.initial_range.clone(), + DEFAULT_MULTIBUFFER_CONTEXT, + buffer_snapshot.clone(), + &mut cx, + ) + .await; + excerpt_ranges.push(ExcerptRange { + context: excerpt_range, + primary: b.initial_range.clone(), + }) + } this.update_in(cx, |this, window, cx| { - if this.path_states[path_ix].diagnostic_groups.is_empty() { - this.path_states.remove(path_ix); + if let Some(block_ids) = this.blocks.remove(&buffer_id) { + this.editor.update(cx, |editor, cx| { + editor.display_map.update(cx, |display_map, cx| { + display_map.remove_blocks(block_ids.into_iter().collect(), cx) + }); + }) } - - this.editor.update(cx, |editor, cx| { - let groups; - let mut selections; - let new_excerpt_ids_by_selection_id; - if was_empty { - groups = this.path_states.first()?.diagnostic_groups.as_slice(); - new_excerpt_ids_by_selection_id = - [(0, ExcerptId::min())].into_iter().collect(); - selections = vec![Selection { - id: 0, - start: 0, - end: 0, - reversed: false, - goal: SelectionGoal::None, - }]; - } else { - groups = this.path_states.get(path_ix)?.diagnostic_groups.as_slice(); - new_excerpt_ids_by_selection_id = - editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| { - s.refresh() - }); - selections = editor.selections.all::(cx); - } - - // If any selection has lost its position, move it to start of the next primary diagnostic. - let snapshot = editor.snapshot(window, cx); - for selection in &mut selections { - if let Some(new_excerpt_id) = - new_excerpt_ids_by_selection_id.get(&selection.id) - { - let group_ix = match groups.binary_search_by(|probe| { - probe - .excerpts - .last() - .unwrap() - .cmp(new_excerpt_id, &snapshot.buffer_snapshot) - }) { - Ok(ix) | Err(ix) => ix, - }; - if let Some(group) = groups.get(group_ix) { - if let Some(offset) = excerpts_snapshot - .anchor_in_excerpt( - group.excerpts[group.primary_excerpt_ix], - group.primary_diagnostic.range.start, - ) - .map(|anchor| anchor.to_offset(&excerpts_snapshot)) - { - selection.start = offset; - selection.end = offset; - } - } - } - } - editor.change_selections(None, window, cx, |s| { - s.select(selections); - }); - Some(()) + let (anchor_ranges, _) = this.multibuffer.update(cx, |multi_buffer, cx| { + multi_buffer.set_excerpt_ranges_for_path( + PathKey::for_buffer(&buffer, cx), + buffer.clone(), + &buffer_snapshot, + excerpt_ranges, + cx, + ) }); - })?; + #[cfg(test)] + let cloned_blocks = blocks.clone(); - this.update_in(cx, |this, window, cx| { - if this.path_states.is_empty() { - if this.editor.focus_handle(cx).is_focused(window) { - window.focus(&this.focus_handle); + if was_empty { + if let Some(anchor_range) = anchor_ranges.first() { + let range_to_select = anchor_range.start..anchor_range.start; + this.editor.update(cx, |editor, cx| { + editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| { + s.select_anchor_ranges([range_to_select]); + }) + }) } - } else if this.focus_handle.is_focused(window) { - let focus_handle = this.editor.focus_handle(cx); - window.focus(&focus_handle); } + let editor_blocks = + anchor_ranges + .into_iter() + .zip(blocks.into_iter()) + .map(|(anchor, block)| { + let editor = this.editor.downgrade(); + BlockProperties { + placement: BlockPlacement::Near(anchor.start), + height: Some(1), + style: BlockStyle::Flex, + render: Arc::new(move |bcx| { + block.render_block(editor.clone(), bcx) + }), + priority: 1, + } + }); + let block_ids = this.editor.update(cx, |editor, cx| { + editor.display_map.update(cx, |display_map, cx| { + display_map.insert_blocks(editor_blocks, cx) + }) + }); + #[cfg(test)] - this.check_invariants(cx); + { + for (block_id, block) in block_ids.iter().zip(cloned_blocks.iter()) { + let markdown = block.markdown.clone(); + editor::test::set_block_content_for_tests( + &this.editor, + *block_id, + cx, + move |cx| { + markdown::MarkdownElement::rendered_text( + markdown.clone(), + cx, + editor::hover_markdown_style, + ) + }, + ); + } + } - cx.notify(); + this.blocks.insert(buffer_id, block_ids); + cx.notify() }) }) } - - #[cfg(test)] - fn check_invariants(&self, cx: &mut Context) { - let mut excerpts = Vec::new(); - for (id, buffer, _) in self.excerpts.read(cx).snapshot(cx).excerpts() { - if let Some(file) = buffer.file() { - excerpts.push((id, file.path().clone())); - } - } - - let mut prev_path = None; - for (_, path) in &excerpts { - if let Some(prev_path) = prev_path { - if path < prev_path { - panic!("excerpts are not sorted by path {:?}", excerpts); - } - } - prev_path = Some(path); - } - } } impl Focusable for ProjectDiagnosticsEditor { @@ -857,8 +643,8 @@ impl Item for ProjectDiagnosticsEditor { { Some(cx.new(|cx| { ProjectDiagnosticsEditor::new( - self.project.clone(), self.include_warnings, + self.project.clone(), self.workspace.clone(), window, cx, @@ -867,15 +653,15 @@ impl Item for ProjectDiagnosticsEditor { } fn is_dirty(&self, cx: &App) -> bool { - self.excerpts.read(cx).is_dirty(cx) + self.multibuffer.read(cx).is_dirty(cx) } fn has_deleted_file(&self, cx: &App) -> bool { - self.excerpts.read(cx).has_deleted_file(cx) + self.multibuffer.read(cx).has_deleted_file(cx) } fn has_conflict(&self, cx: &App) -> bool { - self.excerpts.read(cx).has_conflict(cx) + self.multibuffer.read(cx).has_conflict(cx) } fn can_save(&self, _: &App) -> bool { @@ -950,128 +736,31 @@ impl Item for ProjectDiagnosticsEditor { } } -const DIAGNOSTIC_HEADER: &str = "diagnostic header"; - -fn diagnostic_header_renderer(diagnostic: Diagnostic) -> RenderBlock { - let (message, code_ranges) = highlight_diagnostic_message(&diagnostic, None); - let message: SharedString = message; - Arc::new(move |cx| { - let color = cx.theme().colors(); - let highlight_style: HighlightStyle = color.text_accent.into(); - - h_flex() - .id(DIAGNOSTIC_HEADER) - .block_mouse_down() - .h(2. * cx.window.line_height()) - .w_full() - .px_9() - .justify_between() - .gap_2() - .child( - h_flex() - .gap_2() - .px_1() - .rounded_sm() - .bg(color.surface_background.opacity(0.5)) - .map(|stack| { - stack.child( - svg() - .size(cx.window.text_style().font_size) - .flex_none() - .map(|icon| { - if diagnostic.severity == DiagnosticSeverity::ERROR { - icon.path(IconName::XCircle.path()) - .text_color(Color::Error.color(cx)) - } else { - icon.path(IconName::Warning.path()) - .text_color(Color::Warning.color(cx)) - } - }), - ) - }) - .child( - h_flex() - .gap_1() - .child( - StyledText::new(message.clone()).with_default_highlights( - &cx.window.text_style(), - code_ranges - .iter() - .map(|range| (range.clone(), highlight_style)), - ), - ) - .when_some(diagnostic.code.as_ref(), |stack, code| { - stack.child( - div() - .child(SharedString::from(format!("({code:?})"))) - .text_color(color.text_muted), - ) - }), - ), - ) - .when_some(diagnostic.source.as_ref(), |stack, source| { - stack.child( - div() - .child(SharedString::from(source.clone())) - .text_color(color.text_muted), - ) - }) - .into_any_element() - }) -} - -fn compare_diagnostics( - old: &DiagnosticEntry, - new: &DiagnosticEntry, - snapshot: &language::BufferSnapshot, -) -> Ordering { - use language::ToOffset; - - // The diagnostics may point to a previously open Buffer for this file. - if !old.range.start.is_valid(snapshot) || !new.range.start.is_valid(snapshot) { - return Ordering::Greater; - } - - old.range - .start - .to_offset(snapshot) - .cmp(&new.range.start.to_offset(snapshot)) - .then_with(|| { - old.range - .end - .to_offset(snapshot) - .cmp(&new.range.end.to_offset(snapshot)) - }) - .then_with(|| old.diagnostic.message.cmp(&new.diagnostic.message)) -} - const DIAGNOSTIC_EXPANSION_ROW_LIMIT: u32 = 32; -fn context_range_for_entry( +async fn context_range_for_entry( range: Range, context: u32, snapshot: BufferSnapshot, - cx: AsyncApp, -) -> Task> { - cx.spawn(async move |cx| { - if let Some(rows) = heuristic_syntactic_expand( - range.clone(), - DIAGNOSTIC_EXPANSION_ROW_LIMIT, - snapshot.clone(), - cx, - ) - .await - { - return Range { - start: Point::new(*rows.start(), 0), - end: snapshot.clip_point(Point::new(*rows.end(), u32::MAX), Bias::Left), - }; - } - Range { - start: Point::new(range.start.row.saturating_sub(context), 0), - end: snapshot.clip_point(Point::new(range.end.row + context, u32::MAX), Bias::Left), - } - }) + cx: &mut AsyncApp, +) -> Range { + if let Some(rows) = heuristic_syntactic_expand( + range.clone(), + DIAGNOSTIC_EXPANSION_ROW_LIMIT, + snapshot.clone(), + cx, + ) + .await + { + return Range { + start: Point::new(*rows.start(), 0), + end: snapshot.clip_point(Point::new(*rows.end(), u32::MAX), Bias::Left), + }; + } + Range { + start: Point::new(range.start.row.saturating_sub(context), 0), + end: snapshot.clip_point(Point::new(range.end.row + context, u32::MAX), Bias::Left), + } } /// Expands the input range using syntax information from TreeSitter. This expansion will be limited diff --git a/crates/diagnostics/src/diagnostics_tests.rs b/crates/diagnostics/src/diagnostics_tests.rs index d5428d581c..09d18166d9 100644 --- a/crates/diagnostics/src/diagnostics_tests.rs +++ b/crates/diagnostics/src/diagnostics_tests.rs @@ -1,13 +1,15 @@ use super::*; -use collections::HashMap; +use collections::{HashMap, HashSet}; use editor::{ - DisplayPoint, GutterDimensions, - display_map::{Block, BlockContext, DisplayRow}, -}; -use gpui::{AvailableSpace, Stateful, TestAppContext, VisualTestContext, px}; -use language::{ - Diagnostic, DiagnosticEntry, DiagnosticSeverity, OffsetRangeExt, PointUtf16, Rope, Unclipped, + DisplayPoint, + actions::{GoToDiagnostic, GoToPreviousDiagnostic, MoveToBeginning}, + display_map::DisplayRow, + test::{editor_content_with_blocks, editor_test_context::EditorTestContext}, }; +use gpui::{TestAppContext, VisualTestContext}; +use indoc::indoc; +use language::Rope; +use lsp::LanguageServerId; use pretty_assertions::assert_eq; use project::FakeFs; use rand::{Rng, rngs::StdRng, seq::IteratorRandom as _}; @@ -64,163 +66,91 @@ async fn test_diagnostics(cx: &mut TestAppContext) { let window = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*window, cx); let workspace = window.root(cx).unwrap(); + let uri = lsp::Url::from_file_path(path!("/test/main.rs")).unwrap(); // Create some diagnostics lsp_store.update(cx, |lsp_store, cx| { - lsp_store - .update_diagnostic_entries( - language_server_id, - PathBuf::from(path!("/test/main.rs")), - None, - vec![ - DiagnosticEntry { - range: Unclipped(PointUtf16::new(1, 8))..Unclipped(PointUtf16::new(1, 9)), - diagnostic: Diagnostic { - message: - "move occurs because `x` has type `Vec`, which does not implement the `Copy` trait" - .to_string(), - severity: DiagnosticSeverity::INFORMATION, - is_primary: false, - is_disk_based: true, - group_id: 1, - ..Default::default() - }, - }, - DiagnosticEntry { - range: Unclipped(PointUtf16::new(2, 8))..Unclipped(PointUtf16::new(2, 9)), - diagnostic: Diagnostic { - message: - "move occurs because `y` has type `Vec`, which does not implement the `Copy` trait" - .to_string(), - severity: DiagnosticSeverity::INFORMATION, - is_primary: false, - is_disk_based: true, - group_id: 0, - ..Default::default() - }, - }, - DiagnosticEntry { - range: Unclipped(PointUtf16::new(3, 6))..Unclipped(PointUtf16::new(3, 7)), - diagnostic: Diagnostic { - message: "value moved here".to_string(), - severity: DiagnosticSeverity::INFORMATION, - is_primary: false, - is_disk_based: true, - group_id: 1, - ..Default::default() - }, - }, - DiagnosticEntry { - range: Unclipped(PointUtf16::new(4, 6))..Unclipped(PointUtf16::new(4, 7)), - diagnostic: Diagnostic { - message: "value moved here".to_string(), - severity: DiagnosticSeverity::INFORMATION, - is_primary: false, - is_disk_based: true, - group_id: 0, - ..Default::default() - }, - }, - DiagnosticEntry { - range: Unclipped(PointUtf16::new(7, 6))..Unclipped(PointUtf16::new(7, 7)), - diagnostic: Diagnostic { - message: "use of moved value\nvalue used here after move".to_string(), - severity: DiagnosticSeverity::ERROR, - is_primary: true, - is_disk_based: true, - group_id: 0, - ..Default::default() - }, - }, - DiagnosticEntry { - range: Unclipped(PointUtf16::new(8, 6))..Unclipped(PointUtf16::new(8, 7)), - diagnostic: Diagnostic { - message: "use of moved value\nvalue used here after move".to_string(), - severity: DiagnosticSeverity::ERROR, - is_primary: true, - is_disk_based: true, - group_id: 1, - ..Default::default() - }, - }, - ], - cx, - ) - .unwrap(); + lsp_store.update_diagnostics(language_server_id, lsp::PublishDiagnosticsParams { + uri: uri.clone(), + diagnostics: vec![lsp::Diagnostic{ + range: lsp::Range::new(lsp::Position::new(7, 6),lsp::Position::new(7, 7)), + severity:Some(lsp::DiagnosticSeverity::ERROR), + message: "use of moved value\nvalue used here after move".to_string(), + related_information: Some(vec![lsp::DiagnosticRelatedInformation { + location: lsp::Location::new(uri.clone(), lsp::Range::new(lsp::Position::new(2,8),lsp::Position::new(2,9))), + message: "move occurs because `y` has type `Vec`, which does not implement the `Copy` trait".to_string() + }, + lsp::DiagnosticRelatedInformation { + location: lsp::Location::new(uri.clone(), lsp::Range::new(lsp::Position::new(4,6),lsp::Position::new(4,7))), + message: "value moved here".to_string() + }, + ]), + ..Default::default() + }, + lsp::Diagnostic{ + range: lsp::Range::new(lsp::Position::new(8, 6),lsp::Position::new(8, 7)), + severity:Some(lsp::DiagnosticSeverity::ERROR), + message: "use of moved value\nvalue used here after move".to_string(), + related_information: Some(vec![lsp::DiagnosticRelatedInformation { + location: lsp::Location::new(uri.clone(), lsp::Range::new(lsp::Position::new(1,8),lsp::Position::new(1,9))), + message: "move occurs because `x` has type `Vec`, which does not implement the `Copy` trait".to_string() + }, + lsp::DiagnosticRelatedInformation { + location: lsp::Location::new(uri.clone(), lsp::Range::new(lsp::Position::new(3,6),lsp::Position::new(3,7))), + message: "value moved here".to_string() + }, + ]), + ..Default::default() + } + ], + version: None + }, &[], cx).unwrap(); }); // Open the project diagnostics view while there are already diagnostics. let diagnostics = window.build_entity(cx, |window, cx| { - ProjectDiagnosticsEditor::new_with_context( - 1, - true, - project.clone(), - workspace.downgrade(), - window, - cx, - ) + ProjectDiagnosticsEditor::new(true, project.clone(), workspace.downgrade(), window, cx) }); let editor = diagnostics.update(cx, |diagnostics, _| diagnostics.editor.clone()); diagnostics - .next_notification(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10), cx) + .next_notification(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10), cx) .await; - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - (DisplayRow(15), EXCERPT_HEADER.into()), - (DisplayRow(16), DIAGNOSTIC_HEADER.into()), - (DisplayRow(25), EXCERPT_HEADER.into()), - ] - ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - // - // main.rs - // - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - " let x = vec![];\n", - " let y = vec![];\n", - "\n", // supporting diagnostic - " a(x);\n", - " b(y);\n", - "\n", // supporting diagnostic - " // comment 1\n", - " // comment 2\n", - " c(y);\n", - "\n", // supporting diagnostic - " d(x);\n", - "\n", // context ellipsis - // diagnostic group 2 - "\n", // primary message - "\n", // padding - "fn main() {\n", - " let x = vec![];\n", - "\n", // supporting diagnostic - " let y = vec![];\n", - " a(x);\n", - "\n", // supporting diagnostic - " b(y);\n", - "\n", // context ellipsis - " c(y);\n", - " d(x);\n", - "\n", // supporting diagnostic - "}", - ) + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.rs + § ----- + fn main() { + let x = vec![]; + § move occurs because `x` has type `Vec`, which does not implement + § the `Copy` trait (back) + let y = vec![]; + § move occurs because `y` has type `Vec`, which does not implement + § the `Copy` trait (back) + a(x); § value moved here (back) + b(y); § value moved here + // comment 1 + // comment 2 + c(y); + § use of moved value value used here after move + § hint: move occurs because `y` has type `Vec`, which does not + § implement the `Copy` trait + d(x); + § use of moved value value used here after move + § hint: move occurs because `x` has type `Vec`, which does not + § implement the `Copy` trait + § hint: value moved here + }" + } ); // Cursor is at the first diagnostic editor.update(cx, |editor, cx| { assert_eq!( editor.selections.display_ranges(cx), - [DisplayPoint::new(DisplayRow(12), 6)..DisplayPoint::new(DisplayRow(12), 6)] + [DisplayPoint::new(DisplayRow(3), 8)..DisplayPoint::new(DisplayRow(3), 8)] ); }); @@ -228,21 +158,22 @@ async fn test_diagnostics(cx: &mut TestAppContext) { lsp_store.update(cx, |lsp_store, cx| { lsp_store.disk_based_diagnostics_started(language_server_id, cx); lsp_store - .update_diagnostic_entries( + .update_diagnostics( language_server_id, - PathBuf::from(path!("/test/consts.rs")), - None, - vec![DiagnosticEntry { - range: Unclipped(PointUtf16::new(0, 15))..Unclipped(PointUtf16::new(0, 15)), - diagnostic: Diagnostic { + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/consts.rs")).unwrap(), + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 15), + lsp::Position::new(0, 15), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), message: "mismatched types\nexpected `usize`, found `char`".to_string(), - severity: DiagnosticSeverity::ERROR, - is_primary: true, - is_disk_based: true, - group_id: 0, ..Default::default() - }, - }], + }], + version: None, + }, + &[], cx, ) .unwrap(); @@ -250,78 +181,48 @@ async fn test_diagnostics(cx: &mut TestAppContext) { }); diagnostics - .next_notification(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10), cx) + .next_notification(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10), cx) .await; - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - (DisplayRow(7), FILE_HEADER.into()), - (DisplayRow(9), DIAGNOSTIC_HEADER.into()), - (DisplayRow(22), EXCERPT_HEADER.into()), - (DisplayRow(23), DIAGNOSTIC_HEADER.into()), - (DisplayRow(32), EXCERPT_HEADER.into()), - ] - ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - // - // consts.rs - // - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - "const a: i32 = 'a';\n", - "\n", // supporting diagnostic - "const b: i32 = c;\n", - // - // main.rs - // - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - " let x = vec![];\n", - " let y = vec![];\n", - "\n", // supporting diagnostic - " a(x);\n", - " b(y);\n", - "\n", // supporting diagnostic - " // comment 1\n", - " // comment 2\n", - " c(y);\n", - "\n", // supporting diagnostic - " d(x);\n", - "\n", // collapsed context - // diagnostic group 2 - "\n", // primary message - "\n", // filename - "fn main() {\n", - " let x = vec![];\n", - "\n", // supporting diagnostic - " let y = vec![];\n", - " a(x);\n", - "\n", // supporting diagnostic - " b(y);\n", - "\n", // context ellipsis - " c(y);\n", - " d(x);\n", - "\n", // supporting diagnostic - "}", - ) + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ consts.rs + § ----- + const a: i32 = 'a'; § mismatched types expected `usize`, found `char` + const b: i32 = c; + + § main.rs + § ----- + fn main() { + let x = vec![]; + § move occurs because `x` has type `Vec`, which does not implement + § the `Copy` trait (back) + let y = vec![]; + § move occurs because `y` has type `Vec`, which does not implement + § the `Copy` trait (back) + a(x); § value moved here (back) + b(y); § value moved here + // comment 1 + // comment 2 + c(y); + § use of moved value value used here after move + § hint: move occurs because `y` has type `Vec`, which does not + § implement the `Copy` trait + d(x); + § use of moved value value used here after move + § hint: move occurs because `x` has type `Vec`, which does not + § implement the `Copy` trait + § hint: value moved here + }" + } ); // Cursor keeps its position. editor.update(cx, |editor, cx| { assert_eq!( editor.selections.display_ranges(cx), - [DisplayPoint::new(DisplayRow(19), 6)..DisplayPoint::new(DisplayRow(19), 6)] + [DisplayPoint::new(DisplayRow(8), 8)..DisplayPoint::new(DisplayRow(8), 8)] ); }); @@ -329,34 +230,33 @@ async fn test_diagnostics(cx: &mut TestAppContext) { lsp_store.update(cx, |lsp_store, cx| { lsp_store.disk_based_diagnostics_started(language_server_id, cx); lsp_store - .update_diagnostic_entries( + .update_diagnostics( language_server_id, - PathBuf::from(path!("/test/consts.rs")), - None, - vec![ - DiagnosticEntry { - range: Unclipped(PointUtf16::new(0, 15))..Unclipped(PointUtf16::new(0, 15)), - diagnostic: Diagnostic { + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/consts.rs")).unwrap(), + diagnostics: vec![ + lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 15), + lsp::Position::new(0, 15), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), message: "mismatched types\nexpected `usize`, found `char`".to_string(), - severity: DiagnosticSeverity::ERROR, - is_primary: true, - is_disk_based: true, - group_id: 0, ..Default::default() }, - }, - DiagnosticEntry { - range: Unclipped(PointUtf16::new(1, 15))..Unclipped(PointUtf16::new(1, 15)), - diagnostic: Diagnostic { + lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(1, 15), + lsp::Position::new(1, 15), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), message: "unresolved name `c`".to_string(), - severity: DiagnosticSeverity::ERROR, - is_primary: true, - is_disk_based: true, - group_id: 1, ..Default::default() }, - }, - ], + ], + version: None, + }, + &[], cx, ) .unwrap(); @@ -364,80 +264,148 @@ async fn test_diagnostics(cx: &mut TestAppContext) { }); diagnostics - .next_notification(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10), cx) + .next_notification(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10), cx) .await; - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - (DisplayRow(7), EXCERPT_HEADER.into()), - (DisplayRow(8), DIAGNOSTIC_HEADER.into()), - (DisplayRow(13), FILE_HEADER.into()), - (DisplayRow(15), DIAGNOSTIC_HEADER.into()), - (DisplayRow(28), EXCERPT_HEADER.into()), - (DisplayRow(29), DIAGNOSTIC_HEADER.into()), - (DisplayRow(38), EXCERPT_HEADER.into()), - ] + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ consts.rs + § ----- + const a: i32 = 'a'; § mismatched types expected `usize`, found `char` + const b: i32 = c; § unresolved name `c` + + § main.rs + § ----- + fn main() { + let x = vec![]; + § move occurs because `x` has type `Vec`, which does not implement + § the `Copy` trait (back) + let y = vec![]; + § move occurs because `y` has type `Vec`, which does not implement + § the `Copy` trait (back) + a(x); § value moved here (back) + b(y); § value moved here + // comment 1 + // comment 2 + c(y); + § use of moved value value used here after move + § hint: move occurs because `y` has type `Vec`, which does not + § implement the `Copy` trait + d(x); + § use of moved value value used here after move + § hint: move occurs because `x` has type `Vec`, which does not + § implement the `Copy` trait + § hint: value moved here + }" + } + ); +} + +#[gpui::test] +async fn test_diagnostics_with_folds(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + path!("/test"), + json!({ + "main.js": " + function test() { + return 1 + }; + + tset(); + ".unindent() + }), + ) + .await; + + let server_id_1 = LanguageServerId(100); + let server_id_2 = LanguageServerId(101); + let project = Project::test(fs.clone(), [path!("/test").as_ref()], cx).await; + let lsp_store = project.read_with(cx, |project, _| project.lsp_store()); + let window = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*window, cx); + let workspace = window.root(cx).unwrap(); + + let diagnostics = window.build_entity(cx, |window, cx| { + ProjectDiagnosticsEditor::new(true, project.clone(), workspace.downgrade(), window, cx) + }); + let editor = diagnostics.update(cx, |diagnostics, _| diagnostics.editor.clone()); + + // Two language servers start updating diagnostics + lsp_store.update(cx, |lsp_store, cx| { + lsp_store.disk_based_diagnostics_started(server_id_1, cx); + lsp_store.disk_based_diagnostics_started(server_id_2, cx); + lsp_store + .update_diagnostics( + server_id_1, + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/main.js")).unwrap(), + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new(lsp::Position::new(4, 0), lsp::Position::new(4, 4)), + severity: Some(lsp::DiagnosticSeverity::WARNING), + message: "no method `tset`".to_string(), + related_information: Some(vec![lsp::DiagnosticRelatedInformation { + location: lsp::Location::new( + lsp::Url::from_file_path(path!("/test/main.js")).unwrap(), + lsp::Range::new( + lsp::Position::new(0, 9), + lsp::Position::new(0, 13), + ), + ), + message: "method `test` defined here".to_string(), + }]), + ..Default::default() + }], + version: None, + }, + &[], + cx, + ) + .unwrap(); + }); + + // The first language server finishes + lsp_store.update(cx, |lsp_store, cx| { + lsp_store.disk_based_diagnostics_finished(server_id_1, cx); + }); + + // Only the first language server's diagnostics are shown. + cx.executor() + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); + cx.executor().run_until_parked(); + editor.update_in(cx, |editor, window, cx| { + editor.fold_ranges(vec![Point::new(0, 0)..Point::new(3, 0)], false, window, cx); + }); + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.js + § ----- + ⋯ + + tset(); § no method `tset`" + } ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - // - // consts.rs - // - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - "const a: i32 = 'a';\n", - "\n", // supporting diagnostic - "const b: i32 = c;\n", - "\n", // context ellipsis - // diagnostic group 2 - "\n", // primary message - "\n", // padding - "const a: i32 = 'a';\n", - "const b: i32 = c;\n", - "\n", // supporting diagnostic - // - // main.rs - // - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - " let x = vec![];\n", - " let y = vec![];\n", - "\n", // supporting diagnostic - " a(x);\n", - " b(y);\n", - "\n", // supporting diagnostic - " // comment 1\n", - " // comment 2\n", - " c(y);\n", - "\n", // supporting diagnostic - " d(x);\n", - "\n", // context ellipsis - // diagnostic group 2 - "\n", // primary message - "\n", // filename - "fn main() {\n", - " let x = vec![];\n", - "\n", // supporting diagnostic - " let y = vec![];\n", - " a(x);\n", - "\n", // supporting diagnostic - " b(y);\n", - "\n", // context ellipsis - " c(y);\n", - " d(x);\n", - "\n", // supporting diagnostic - "}", - ) + editor.update(cx, |editor, cx| { + editor.unfold_ranges(&[Point::new(0, 0)..Point::new(3, 0)], false, false, cx); + }); + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.js + § ----- + function test() { § method `test` defined here + return 1 + }; + + tset(); § no method `tset`" + } ); } @@ -469,14 +437,7 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { let workspace = window.root(cx).unwrap(); let diagnostics = window.build_entity(cx, |window, cx| { - ProjectDiagnosticsEditor::new_with_context( - 1, - true, - project.clone(), - workspace.downgrade(), - window, - cx, - ) + ProjectDiagnosticsEditor::new(true, project.clone(), workspace.downgrade(), window, cx) }); let editor = diagnostics.update(cx, |diagnostics, _| diagnostics.editor.clone()); @@ -485,21 +446,19 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { lsp_store.disk_based_diagnostics_started(server_id_1, cx); lsp_store.disk_based_diagnostics_started(server_id_2, cx); lsp_store - .update_diagnostic_entries( + .update_diagnostics( server_id_1, - PathBuf::from(path!("/test/main.js")), - None, - vec![DiagnosticEntry { - range: Unclipped(PointUtf16::new(0, 0))..Unclipped(PointUtf16::new(0, 1)), - diagnostic: Diagnostic { + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/main.js")).unwrap(), + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new(lsp::Position::new(0, 0), lsp::Position::new(0, 1)), + severity: Some(lsp::DiagnosticSeverity::WARNING), message: "error 1".to_string(), - severity: DiagnosticSeverity::WARNING, - is_primary: true, - is_disk_based: true, - group_id: 1, ..Default::default() - }, - }], + }], + version: None, + }, + &[], cx, ) .unwrap(); @@ -512,46 +471,36 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { // Only the first language server's diagnostics are shown. cx.executor() - .advance_clock(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10)); + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); cx.executor().run_until_parked(); - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - ] - ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - "a();\n", // - "b();", - ) + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.js + § ----- + a(); § error 1 + b(); + c();" + } ); // The second language server finishes lsp_store.update(cx, |lsp_store, cx| { lsp_store - .update_diagnostic_entries( + .update_diagnostics( server_id_2, - PathBuf::from(path!("/test/main.js")), - None, - vec![DiagnosticEntry { - range: Unclipped(PointUtf16::new(1, 0))..Unclipped(PointUtf16::new(1, 1)), - diagnostic: Diagnostic { + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/main.js")).unwrap(), + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new(lsp::Position::new(1, 0), lsp::Position::new(1, 1)), + severity: Some(lsp::DiagnosticSeverity::ERROR), message: "warning 1".to_string(), - severity: DiagnosticSeverity::ERROR, - is_primary: true, - is_disk_based: true, - group_id: 2, ..Default::default() - }, - }], + }], + version: None, + }, + &[], cx, ) .unwrap(); @@ -560,35 +509,19 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { // Both language server's diagnostics are shown. cx.executor() - .advance_clock(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10)); + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); cx.executor().run_until_parked(); - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - (DisplayRow(6), EXCERPT_HEADER.into()), - (DisplayRow(7), DIAGNOSTIC_HEADER.into()), - ] - ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - "a();\n", // location - "b();\n", // - "\n", // collapsed context - // diagnostic group 2 - "\n", // primary message - "\n", // padding - "a();\n", // context - "b();\n", // - "c();", // context - ) + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.js + § ----- + a(); § error 1 + b(); § warning 1 + c(); + d();" + } ); // Both language servers start updating diagnostics, and the first server finishes. @@ -596,30 +529,31 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { lsp_store.disk_based_diagnostics_started(server_id_1, cx); lsp_store.disk_based_diagnostics_started(server_id_2, cx); lsp_store - .update_diagnostic_entries( + .update_diagnostics( server_id_1, - PathBuf::from(path!("/test/main.js")), - None, - vec![DiagnosticEntry { - range: Unclipped(PointUtf16::new(2, 0))..Unclipped(PointUtf16::new(2, 1)), - diagnostic: Diagnostic { + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/main.js")).unwrap(), + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new(lsp::Position::new(2, 0), lsp::Position::new(2, 1)), + severity: Some(lsp::DiagnosticSeverity::WARNING), message: "warning 2".to_string(), - severity: DiagnosticSeverity::WARNING, - is_primary: true, - is_disk_based: true, - group_id: 1, ..Default::default() - }, - }], + }], + version: None, + }, + &[], cx, ) .unwrap(); lsp_store - .update_diagnostic_entries( + .update_diagnostics( server_id_2, - PathBuf::from(path!("/test/main.rs")), - None, - vec![], + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/main.rs")).unwrap(), + diagnostics: vec![], + version: None, + }, + &[], cx, ) .unwrap(); @@ -628,56 +562,38 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { // Only the first language server's diagnostics are updated. cx.executor() - .advance_clock(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10)); + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); cx.executor().run_until_parked(); - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - (DisplayRow(7), EXCERPT_HEADER.into()), - (DisplayRow(8), DIAGNOSTIC_HEADER.into()), - ] - ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - "a();\n", // location - "b();\n", // - "c();\n", // context - "\n", // collapsed context - // diagnostic group 2 - "\n", // primary message - "\n", // padding - "b();\n", // context - "c();\n", // - "d();", // context - ) + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.js + § ----- + a(); + b(); § warning 1 + c(); § warning 2 + d(); + e();" + } ); // The second language server finishes. lsp_store.update(cx, |lsp_store, cx| { lsp_store - .update_diagnostic_entries( + .update_diagnostics( server_id_2, - PathBuf::from(path!("/test/main.js")), - None, - vec![DiagnosticEntry { - range: Unclipped(PointUtf16::new(3, 0))..Unclipped(PointUtf16::new(3, 1)), - diagnostic: Diagnostic { + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/test/main.js")).unwrap(), + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new(lsp::Position::new(3, 0), lsp::Position::new(3, 1)), + severity: Some(lsp::DiagnosticSeverity::WARNING), message: "warning 2".to_string(), - severity: DiagnosticSeverity::WARNING, - is_primary: true, - is_disk_based: true, - group_id: 1, ..Default::default() - }, - }], + }], + version: None, + }, + &[], cx, ) .unwrap(); @@ -686,36 +602,20 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { // Both language servers' diagnostics are updated. cx.executor() - .advance_clock(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10)); + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); cx.executor().run_until_parked(); - assert_eq!( - editor_blocks(&editor, cx), - [ - (DisplayRow(0), FILE_HEADER.into()), - (DisplayRow(2), DIAGNOSTIC_HEADER.into()), - (DisplayRow(7), EXCERPT_HEADER.into()), - (DisplayRow(8), DIAGNOSTIC_HEADER.into()), - ] - ); - assert_eq!( - editor.update(cx, |editor, cx| editor.display_text(cx)), - concat!( - "\n", // filename - "\n", // padding - // diagnostic group 1 - "\n", // primary message - "\n", // padding - "b();\n", // location - "c();\n", // - "d();\n", // context - "\n", // collapsed context - // diagnostic group 2 - "\n", // primary message - "\n", // padding - "c();\n", // context - "d();\n", // - "e();", // context - ) + + pretty_assertions::assert_eq!( + editor_content_with_blocks(&editor, cx), + indoc::indoc! { + "§ main.js + § ----- + a(); + b(); + c(); § warning 2 + d(); § warning 2 + e();" + } ); } @@ -737,14 +637,7 @@ async fn test_random_diagnostics(cx: &mut TestAppContext, mut rng: StdRng) { let workspace = window.root(cx).unwrap(); let mutated_diagnostics = window.build_entity(cx, |window, cx| { - ProjectDiagnosticsEditor::new_with_context( - 1, - true, - project.clone(), - workspace.downgrade(), - window, - cx, - ) + ProjectDiagnosticsEditor::new(true, project.clone(), workspace.downgrade(), window, cx) }); workspace.update_in(cx, |workspace, window, cx| { @@ -754,14 +647,12 @@ async fn test_random_diagnostics(cx: &mut TestAppContext, mut rng: StdRng) { assert!(diagnostics.focus_handle.is_focused(window)); }); - let mut next_group_id = 0; + let mut next_id = 0; let mut next_filename = 0; let mut language_server_ids = vec![LanguageServerId(0)]; let mut updated_language_servers = HashSet::default(); - let mut current_diagnostics: HashMap< - (PathBuf, LanguageServerId), - Vec>>, - > = Default::default(); + let mut current_diagnostics: HashMap<(PathBuf, LanguageServerId), Vec> = + Default::default(); for _ in 0..operations { match rng.gen_range(0..100) { @@ -821,15 +712,26 @@ async fn test_random_diagnostics(cx: &mut TestAppContext, mut rng: StdRng) { &fs, &path, diagnostics, - &mut next_group_id, + &mut next_id, &mut rng, ); lsp_store - .update_diagnostic_entries(server_id, path, None, diagnostics.clone(), cx) + .update_diagnostics( + server_id, + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(&path).unwrap_or_else(|_| { + lsp::Url::parse("file:///test/fallback.rs").unwrap() + }), + diagnostics: diagnostics.clone(), + version: None, + }, + &[], + cx, + ) .unwrap() }); cx.executor() - .advance_clock(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10)); + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); cx.run_until_parked(); } @@ -840,39 +742,298 @@ async fn test_random_diagnostics(cx: &mut TestAppContext, mut rng: StdRng) { mutated_diagnostics.update_in(cx, |diagnostics, window, cx| { diagnostics.update_stale_excerpts(window, cx) }); - cx.run_until_parked(); log::info!("constructing reference diagnostics view"); let reference_diagnostics = window.build_entity(cx, |window, cx| { - ProjectDiagnosticsEditor::new_with_context( - 1, - true, - project.clone(), - workspace.downgrade(), - window, - cx, - ) + ProjectDiagnosticsEditor::new(true, project.clone(), workspace.downgrade(), window, cx) }); cx.executor() - .advance_clock(DIAGNOSTICS_UPDATE_DEBOUNCE + Duration::from_millis(10)); + .advance_clock(DIAGNOSTICS_UPDATE_DELAY + Duration::from_millis(10)); cx.run_until_parked(); - let mutated_excerpts = get_diagnostics_excerpts(&mutated_diagnostics, cx); - let reference_excerpts = get_diagnostics_excerpts(&reference_diagnostics, cx); + let mutated_excerpts = + editor_content_with_blocks(&mutated_diagnostics.update(cx, |d, _| d.editor.clone()), cx); + let reference_excerpts = editor_content_with_blocks( + &reference_diagnostics.update(cx, |d, _| d.editor.clone()), + cx, + ); - for ((path, language_server_id), diagnostics) in current_diagnostics { - for diagnostic in diagnostics { - let found_excerpt = reference_excerpts.iter().any(|info| { - let row_range = info.range.context.start.row..info.range.context.end.row; - info.path == path.strip_prefix(path!("/test")).unwrap() - && info.language_server == language_server_id - && row_range.contains(&diagnostic.range.start.0.row) - }); - assert!(found_excerpt, "diagnostic not found in reference view"); + // The mutated view may contain more than the reference view as + // we don't currently shrink excerpts when diagnostics were removed. + let mut ref_iter = reference_excerpts.lines(); + let mut next_ref_line = ref_iter.next(); + let mut skipped_block = false; + + for mut_line in mutated_excerpts.lines() { + if let Some(ref_line) = next_ref_line { + if mut_line == ref_line { + next_ref_line = ref_iter.next(); + } else if mut_line.contains('§') { + skipped_block = true; + } } } - assert_eq!(mutated_excerpts, reference_excerpts); + if next_ref_line.is_some() || skipped_block { + pretty_assertions::assert_eq!(mutated_excerpts, reference_excerpts); + } +} + +#[gpui::test] +async fn active_diagnostics_dismiss_after_invalidation(cx: &mut TestAppContext) { + init_test(cx); + + let mut cx = EditorTestContext::new(cx).await; + let lsp_store = + cx.update_editor(|editor, _, cx| editor.project.as_ref().unwrap().read(cx).lsp_store()); + + cx.set_state(indoc! {" + ˇfn func(abc def: i32) -> u32 { + } + "}); + + let message = "Something's wrong!"; + cx.update(|_, cx| { + lsp_store.update(cx, |lsp_store, cx| { + lsp_store + .update_diagnostics( + LanguageServerId(0), + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/root/file")).unwrap(), + version: None, + diagnostics: vec![lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 11), + lsp::Position::new(0, 12), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), + message: message.to_string(), + ..Default::default() + }], + }, + &[], + cx, + ) + .unwrap() + }); + }); + cx.run_until_parked(); + + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + assert_eq!( + editor + .active_diagnostic_group() + .map(|diagnostics_group| diagnostics_group.active_message.as_str()), + Some(message), + "Should have a diagnostics group activated" + ); + }); + cx.assert_editor_state(indoc! {" + fn func(abcˇ def: i32) -> u32 { + } + "}); + + cx.update(|_, cx| { + lsp_store.update(cx, |lsp_store, cx| { + lsp_store + .update_diagnostics( + LanguageServerId(0), + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/root/file")).unwrap(), + version: None, + diagnostics: Vec::new(), + }, + &[], + cx, + ) + .unwrap() + }); + }); + cx.run_until_parked(); + cx.update_editor(|editor, _, _| { + assert_eq!(editor.active_diagnostic_group(), None); + }); + cx.assert_editor_state(indoc! {" + fn func(abcˇ def: i32) -> u32 { + } + "}); + + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + assert_eq!(editor.active_diagnostic_group(), None); + }); + cx.assert_editor_state(indoc! {" + fn func(abcˇ def: i32) -> u32 { + } + "}); +} + +#[gpui::test] +async fn cycle_through_same_place_diagnostics(cx: &mut TestAppContext) { + init_test(cx); + + let mut cx = EditorTestContext::new(cx).await; + let lsp_store = + cx.update_editor(|editor, _, cx| editor.project.as_ref().unwrap().read(cx).lsp_store()); + + cx.set_state(indoc! {" + ˇfn func(abc def: i32) -> u32 { + } + "}); + + cx.update(|_, cx| { + lsp_store.update(cx, |lsp_store, cx| { + lsp_store + .update_diagnostics( + LanguageServerId(0), + lsp::PublishDiagnosticsParams { + uri: lsp::Url::from_file_path(path!("/root/file")).unwrap(), + version: None, + diagnostics: vec![ + lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 11), + lsp::Position::new(0, 12), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), + ..Default::default() + }, + lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 12), + lsp::Position::new(0, 15), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), + ..Default::default() + }, + lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 12), + lsp::Position::new(0, 15), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), + ..Default::default() + }, + lsp::Diagnostic { + range: lsp::Range::new( + lsp::Position::new(0, 25), + lsp::Position::new(0, 28), + ), + severity: Some(lsp::DiagnosticSeverity::ERROR), + ..Default::default() + }, + ], + }, + &[], + cx, + ) + .unwrap() + }); + }); + cx.run_until_parked(); + + //// Backward + + // Fourth diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc def: i32) -> ˇu32 { + } + "}); + + // Third diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc ˇdef: i32) -> u32 { + } + "}); + + // Second diagnostic, same place + cx.update_editor(|editor, window, cx| { + editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc ˇdef: i32) -> u32 { + } + "}); + + // First diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abcˇ def: i32) -> u32 { + } + "}); + + // Wrapped over, fourth diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc def: i32) -> ˇu32 { + } + "}); + + cx.update_editor(|editor, window, cx| { + editor.move_to_beginning(&MoveToBeginning, window, cx); + }); + cx.assert_editor_state(indoc! {" + ˇfn func(abc def: i32) -> u32 { + } + "}); + + //// Forward + + // First diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abcˇ def: i32) -> u32 { + } + "}); + + // Second diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc ˇdef: i32) -> u32 { + } + "}); + + // Third diagnostic, same place + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc ˇdef: i32) -> u32 { + } + "}); + + // Fourth diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abc def: i32) -> ˇu32 { + } + "}); + + // Wrapped around, first diagnostic + cx.update_editor(|editor, window, cx| { + editor.go_to_diagnostic(&GoToDiagnostic, window, cx); + }); + cx.assert_editor_state(indoc! {" + fn func(abcˇ def: i32) -> u32 { + } + "}); } fn init_test(cx: &mut TestAppContext) { @@ -889,199 +1050,114 @@ fn init_test(cx: &mut TestAppContext) { }); } -#[derive(Debug, PartialEq, Eq)] -struct ExcerptInfo { - path: PathBuf, - range: ExcerptRange, - group_id: usize, - primary: bool, - language_server: LanguageServerId, -} - -fn get_diagnostics_excerpts( - diagnostics: &Entity, - cx: &mut VisualTestContext, -) -> Vec { - diagnostics.update(cx, |diagnostics, cx| { - let mut result = vec![]; - let mut excerpt_indices_by_id = HashMap::default(); - diagnostics.excerpts.update(cx, |multibuffer, cx| { - let snapshot = multibuffer.snapshot(cx); - for (id, buffer, range) in snapshot.excerpts() { - excerpt_indices_by_id.insert(id, result.len()); - result.push(ExcerptInfo { - path: buffer.file().unwrap().path().to_path_buf(), - range: ExcerptRange { - context: range.context.to_point(buffer), - primary: range.primary.to_point(buffer), - }, - group_id: usize::MAX, - primary: false, - language_server: LanguageServerId(0), - }); - } - }); - - for state in &diagnostics.path_states { - for group in &state.diagnostic_groups { - for (ix, excerpt_id) in group.excerpts.iter().enumerate() { - let excerpt_ix = excerpt_indices_by_id[excerpt_id]; - let excerpt = &mut result[excerpt_ix]; - excerpt.group_id = group.primary_diagnostic.diagnostic.group_id; - excerpt.language_server = group.language_server_id; - excerpt.primary = ix == group.primary_excerpt_ix; - } - } - } - - result - }) -} - fn randomly_update_diagnostics_for_path( fs: &FakeFs, path: &Path, - diagnostics: &mut Vec>>, - next_group_id: &mut usize, + diagnostics: &mut Vec, + next_id: &mut usize, rng: &mut impl Rng, ) { - let file_content = fs.read_file_sync(path).unwrap(); - let file_text = Rope::from(String::from_utf8_lossy(&file_content).as_ref()); - - let mut group_ids = diagnostics - .iter() - .map(|d| d.diagnostic.group_id) - .collect::>(); - let mutation_count = rng.gen_range(1..=3); for _ in 0..mutation_count { - if rng.gen_bool(0.5) && !group_ids.is_empty() { - let group_id = *group_ids.iter().choose(rng).unwrap(); - log::info!(" removing diagnostic group {group_id}"); - diagnostics.retain(|d| d.diagnostic.group_id != group_id); - group_ids.remove(&group_id); + if rng.gen_bool(0.3) && !diagnostics.is_empty() { + let idx = rng.gen_range(0..diagnostics.len()); + log::info!(" removing diagnostic at index {idx}"); + diagnostics.remove(idx); } else { - let group_id = *next_group_id; - *next_group_id += 1; + let unique_id = *next_id; + *next_id += 1; - let mut new_diagnostics = vec![random_diagnostic(rng, &file_text, group_id, true)]; - for _ in 0..rng.gen_range(0..=1) { - new_diagnostics.push(random_diagnostic(rng, &file_text, group_id, false)); - } + let new_diagnostic = random_lsp_diagnostic(rng, fs, path, unique_id); let ix = rng.gen_range(0..=diagnostics.len()); log::info!( - " inserting diagnostic group {group_id} at index {ix}. ranges: {:?}", - new_diagnostics - .iter() - .map(|d| (d.range.start.0, d.range.end.0)) - .collect::>() + " inserting {} at index {ix}. {},{}..{},{}", + new_diagnostic.message, + new_diagnostic.range.start.line, + new_diagnostic.range.start.character, + new_diagnostic.range.end.line, + new_diagnostic.range.end.character, ); - diagnostics.splice(ix..ix, new_diagnostics); + for related in new_diagnostic.related_information.iter().flatten() { + log::info!( + " {}. {},{}..{},{}", + related.message, + related.location.range.start.line, + related.location.range.start.character, + related.location.range.end.line, + related.location.range.end.character, + ); + } + diagnostics.insert(ix, new_diagnostic); } } } -fn random_diagnostic( +fn random_lsp_diagnostic( rng: &mut impl Rng, - file_text: &Rope, - group_id: usize, - is_primary: bool, -) -> DiagnosticEntry> { + fs: &FakeFs, + path: &Path, + unique_id: usize, +) -> lsp::Diagnostic { // Intentionally allow erroneous ranges some of the time (that run off the end of the file), // because language servers can potentially give us those, and we should handle them gracefully. const ERROR_MARGIN: usize = 10; + let file_content = fs.read_file_sync(path).unwrap(); + let file_text = Rope::from(String::from_utf8_lossy(&file_content).as_ref()); + let start = rng.gen_range(0..file_text.len().saturating_add(ERROR_MARGIN)); let end = rng.gen_range(start..file_text.len().saturating_add(ERROR_MARGIN)); - let range = Range { - start: Unclipped(file_text.offset_to_point_utf16(start)), - end: Unclipped(file_text.offset_to_point_utf16(end)), - }; - let severity = if rng.gen_bool(0.5) { - DiagnosticSeverity::WARNING - } else { - DiagnosticSeverity::ERROR - }; - let message = format!("diagnostic group {group_id}"); - DiagnosticEntry { + let start_point = file_text.offset_to_point_utf16(start); + let end_point = file_text.offset_to_point_utf16(end); + + let range = lsp::Range::new( + lsp::Position::new(start_point.row, start_point.column), + lsp::Position::new(end_point.row, end_point.column), + ); + + let severity = if rng.gen_bool(0.5) { + Some(lsp::DiagnosticSeverity::ERROR) + } else { + Some(lsp::DiagnosticSeverity::WARNING) + }; + + let message = format!("diagnostic {unique_id}"); + + let related_information = if rng.gen_bool(0.3) { + let info_count = rng.gen_range(1..=3); + let mut related_info = Vec::with_capacity(info_count); + + for i in 0..info_count { + let info_start = rng.gen_range(0..file_text.len().saturating_add(ERROR_MARGIN)); + let info_end = rng.gen_range(info_start..file_text.len().saturating_add(ERROR_MARGIN)); + + let info_start_point = file_text.offset_to_point_utf16(info_start); + let info_end_point = file_text.offset_to_point_utf16(info_end); + + let info_range = lsp::Range::new( + lsp::Position::new(info_start_point.row, info_start_point.column), + lsp::Position::new(info_end_point.row, info_end_point.column), + ); + + related_info.push(lsp::DiagnosticRelatedInformation { + location: lsp::Location::new(lsp::Url::from_file_path(path).unwrap(), info_range), + message: format!("related info {i} for diagnostic {unique_id}"), + }); + } + + Some(related_info) + } else { + None + }; + + lsp::Diagnostic { range, - diagnostic: Diagnostic { - source: None, // (optional) service that created the diagnostic - code: None, // (optional) machine-readable code that identifies the diagnostic - severity, - message, - group_id, - is_primary, - is_disk_based: false, - is_unnecessary: false, - data: None, - }, + severity, + message, + related_information, + data: None, + ..Default::default() } } - -const FILE_HEADER: &str = "file header"; -const EXCERPT_HEADER: &str = "excerpt header"; - -fn editor_blocks( - editor: &Entity, - cx: &mut VisualTestContext, -) -> Vec<(DisplayRow, SharedString)> { - let mut blocks = Vec::new(); - cx.draw( - gpui::Point::default(), - AvailableSpace::min_size(), - |window, cx| { - editor.update(cx, |editor, cx| { - let snapshot = editor.snapshot(window, cx); - blocks.extend( - snapshot - .blocks_in_range(DisplayRow(0)..snapshot.max_point().row()) - .filter_map(|(row, block)| { - let block_id = block.id(); - let name: SharedString = match block { - Block::Custom(block) => { - let mut element = block.render(&mut BlockContext { - app: cx, - window, - anchor_x: px(0.), - gutter_dimensions: &GutterDimensions::default(), - line_height: px(0.), - em_width: px(0.), - max_width: px(0.), - block_id, - selected: false, - editor_style: &editor::EditorStyle::default(), - }); - let element = element.downcast_mut::>().unwrap(); - element - .interactivity() - .element_id - .clone()? - .try_into() - .ok()? - } - - Block::FoldedBuffer { .. } => FILE_HEADER.into(), - Block::ExcerptBoundary { - starts_new_buffer, .. - } => { - if *starts_new_buffer { - FILE_HEADER.into() - } else { - EXCERPT_HEADER.into() - } - } - }; - - Some((row, name)) - }), - ) - }); - - div().into_any() - }, - ); - blocks -} diff --git a/crates/editor/src/display_map/block_map.rs b/crates/editor/src/display_map/block_map.rs index f57ae8b96b..39bc41b9dc 100644 --- a/crates/editor/src/display_map/block_map.rs +++ b/crates/editor/src/display_map/block_map.rs @@ -61,7 +61,7 @@ pub struct BlockSnapshot { } #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct CustomBlockId(usize); +pub struct CustomBlockId(pub usize); impl From for ElementId { fn from(val: CustomBlockId) -> Self { @@ -89,7 +89,7 @@ pub enum BlockPlacement { } impl BlockPlacement { - fn start(&self) -> &T { + pub fn start(&self) -> &T { match self { BlockPlacement::Above(position) => position, BlockPlacement::Below(position) => position, @@ -187,14 +187,15 @@ impl BlockPlacement { } pub struct CustomBlock { - id: CustomBlockId, - placement: BlockPlacement, - height: Option, + pub id: CustomBlockId, + pub placement: BlockPlacement, + pub height: Option, style: BlockStyle, render: Arc>, priority: usize, } +#[derive(Clone)] pub struct BlockProperties

{ pub placement: BlockPlacement

, // None if the block takes up no space @@ -686,6 +687,9 @@ impl BlockMap { rows_before_block = position.0 - new_transforms.summary().input_rows; } BlockPlacement::Near(position) | BlockPlacement::Below(position) => { + if position.0 + 1 < new_transforms.summary().input_rows { + continue; + } rows_before_block = (position.0 + 1) - new_transforms.summary().input_rows; } BlockPlacement::Replace(range) => { diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 6e779ebed4..18ca699603 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -23,7 +23,7 @@ mod element; mod git; mod highlight_matching_bracket; mod hover_links; -mod hover_popover; +pub mod hover_popover; mod indent_guides; mod inlay_hint_cache; pub mod items; @@ -88,10 +88,9 @@ use gpui::{ ClipboardItem, Context, DispatchPhase, Edges, Entity, EntityInputHandler, EventEmitter, FocusHandle, FocusOutEvent, Focusable, FontId, FontWeight, Global, HighlightStyle, Hsla, KeyContext, Modifiers, MouseButton, MouseDownEvent, PaintQuad, ParentElement, Pixels, Render, - SharedString, Size, Stateful, Styled, StyledText, Subscription, Task, TextStyle, - TextStyleRefinement, UTF16Selection, UnderlineStyle, UniformListScrollHandle, WeakEntity, - WeakFocusHandle, Window, div, impl_actions, point, prelude::*, pulsating_between, px, relative, - size, + SharedString, Size, Stateful, Styled, Subscription, Task, TextStyle, TextStyleRefinement, + UTF16Selection, UnderlineStyle, UniformListScrollHandle, WeakEntity, WeakFocusHandle, Window, + div, impl_actions, point, prelude::*, pulsating_between, px, relative, size, }; use highlight_matching_bracket::refresh_matching_bracket_highlights; use hover_links::{HoverLink, HoveredLinkState, InlayHighlight, find_file}; @@ -105,7 +104,7 @@ pub use items::MAX_TAB_TITLE_LEN; use itertools::Itertools; use language::{ AutoindentMode, BracketMatch, BracketPair, Buffer, Capability, CharKind, CodeLabel, - CursorShape, Diagnostic, DiffOptions, EditPredictionsMode, EditPreview, HighlightedText, + CursorShape, DiagnosticEntry, DiffOptions, EditPredictionsMode, EditPreview, HighlightedText, IndentKind, IndentSize, Language, OffsetRangeExt, Point, Selection, SelectionGoal, TextObject, TransactionId, TreeSitterOptions, WordsQuery, language_settings::{ @@ -143,12 +142,12 @@ use language::BufferSnapshot; pub use lsp_ext::lsp_tasks; use movement::TextLayoutDetails; pub use multi_buffer::{ - Anchor, AnchorRangeExt, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, RowInfo, - ToOffset, ToPoint, + Anchor, AnchorRangeExt, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, PathKey, + RowInfo, ToOffset, ToPoint, }; use multi_buffer::{ ExcerptInfo, ExpandExcerptDirection, MultiBufferDiffHunk, MultiBufferPoint, MultiBufferRow, - MultiOrSingleBufferOffsetRange, PathKey, ToOffsetUtf16, + MultiOrSingleBufferOffsetRange, ToOffsetUtf16, }; use parking_lot::Mutex; use project::{ @@ -356,6 +355,24 @@ pub fn set_blame_renderer(renderer: impl BlameRenderer + 'static, cx: &mut App) cx.set_global(GlobalBlameRenderer(Arc::new(renderer))); } +pub trait DiagnosticRenderer { + fn render_group( + &self, + diagnostic_group: Vec>, + buffer_id: BufferId, + snapshot: EditorSnapshot, + editor: WeakEntity, + cx: &mut App, + ) -> Vec>; +} + +pub(crate) struct GlobalDiagnosticRenderer(pub Arc); + +impl gpui::Global for GlobalDiagnosticRenderer {} +pub fn set_diagnostic_renderer(renderer: impl DiagnosticRenderer + 'static, cx: &mut App) { + cx.set_global(GlobalDiagnosticRenderer(Arc::new(renderer))); +} + pub struct SearchWithinRange; trait InvalidationRegion { @@ -701,7 +718,7 @@ pub struct Editor { snippet_stack: InvalidationStack, select_syntax_node_history: SelectSyntaxNodeHistory, ime_transaction: Option, - active_diagnostics: Option, + active_diagnostics: ActiveDiagnostic, show_inline_diagnostics: bool, inline_diagnostics_update: Task<()>, inline_diagnostics_enabled: bool, @@ -1074,12 +1091,19 @@ struct RegisteredInlineCompletionProvider { } #[derive(Debug, PartialEq, Eq)] -struct ActiveDiagnosticGroup { - primary_range: Range, - primary_message: String, - group_id: usize, - blocks: HashMap, - is_valid: bool, +pub struct ActiveDiagnosticGroup { + pub active_range: Range, + pub active_message: String, + pub group_id: usize, + pub blocks: HashSet, +} + +#[derive(Debug, PartialEq, Eq)] +#[allow(clippy::large_enum_variant)] +pub(crate) enum ActiveDiagnostic { + None, + All, + Group(ActiveDiagnosticGroup), } #[derive(Serialize, Deserialize, Clone, Debug)] @@ -1475,7 +1499,7 @@ impl Editor { snippet_stack: Default::default(), select_syntax_node_history: SelectSyntaxNodeHistory::default(), ime_transaction: Default::default(), - active_diagnostics: None, + active_diagnostics: ActiveDiagnostic::None, show_inline_diagnostics: ProjectSettings::get_global(cx).diagnostics.inline.enabled, inline_diagnostics_update: Task::ready(()), inline_diagnostics: Vec::new(), @@ -3076,7 +3100,7 @@ impl Editor { return true; } - if self.mode.is_full() && self.active_diagnostics.is_some() { + if self.mode.is_full() && matches!(self.active_diagnostics, ActiveDiagnostic::Group(_)) { self.dismiss_diagnostics(cx); return true; } @@ -13052,7 +13076,7 @@ impl Editor { }); } - fn go_to_diagnostic( + pub fn go_to_diagnostic( &mut self, _: &GoToDiagnostic, window: &mut Window, @@ -13062,7 +13086,7 @@ impl Editor { self.go_to_diagnostic_impl(Direction::Next, window, cx) } - fn go_to_prev_diagnostic( + pub fn go_to_prev_diagnostic( &mut self, _: &GoToPreviousDiagnostic, window: &mut Window, @@ -13080,137 +13104,76 @@ impl Editor { ) { let buffer = self.buffer.read(cx).snapshot(cx); let selection = self.selections.newest::(cx); - // If there is an active Diagnostic Popover jump to its diagnostic instead. - if direction == Direction::Next { - if let Some(popover) = self.hover_state.diagnostic_popover.as_ref() { - let Some(buffer_id) = popover.local_diagnostic.range.start.buffer_id else { - return; - }; - self.activate_diagnostics( - buffer_id, - popover.local_diagnostic.diagnostic.group_id, - window, - cx, - ); - if let Some(active_diagnostics) = self.active_diagnostics.as_ref() { - let primary_range_start = active_diagnostics.primary_range.start; - self.change_selections(Some(Autoscroll::fit()), window, cx, |s| { - let mut new_selection = s.newest_anchor().clone(); - new_selection.collapse_to(primary_range_start, SelectionGoal::None); - s.select_anchors(vec![new_selection.clone()]); - }); - self.refresh_inline_completion(false, true, window, cx); - } - return; + + let mut active_group_id = None; + if let ActiveDiagnostic::Group(active_group) = &self.active_diagnostics { + if active_group.active_range.start.to_offset(&buffer) == selection.start { + active_group_id = Some(active_group.group_id); } } - let active_group_id = self - .active_diagnostics - .as_ref() - .map(|active_group| active_group.group_id); - let active_primary_range = self.active_diagnostics.as_ref().map(|active_diagnostics| { - active_diagnostics - .primary_range - .to_offset(&buffer) - .to_inclusive() - }); - let search_start = if let Some(active_primary_range) = active_primary_range.as_ref() { - if active_primary_range.contains(&selection.head()) { - *active_primary_range.start() - } else { - selection.head() - } - } else { - selection.head() - }; + fn filtered( + snapshot: EditorSnapshot, + diagnostics: impl Iterator>, + ) -> impl Iterator> { + diagnostics + .filter(|entry| entry.range.start != entry.range.end) + .filter(|entry| !entry.diagnostic.is_unnecessary) + .filter(move |entry| !snapshot.intersects_fold(entry.range.start)) + } let snapshot = self.snapshot(window, cx); - let primary_diagnostics_before = buffer - .diagnostics_in_range::(0..search_start) - .filter(|entry| entry.diagnostic.is_primary) - .filter(|entry| entry.range.start != entry.range.end) - .filter(|entry| entry.diagnostic.severity <= DiagnosticSeverity::WARNING) - .filter(|entry| !snapshot.intersects_fold(entry.range.start)) - .collect::>(); - let last_same_group_diagnostic_before = active_group_id.and_then(|active_group_id| { - primary_diagnostics_before - .iter() - .position(|entry| entry.diagnostic.group_id == active_group_id) - }); + let before = filtered( + snapshot.clone(), + buffer + .diagnostics_in_range(0..selection.start) + .filter(|entry| entry.range.start <= selection.start), + ); + let after = filtered( + snapshot, + buffer + .diagnostics_in_range(selection.start..buffer.len()) + .filter(|entry| entry.range.start >= selection.start), + ); - let primary_diagnostics_after = buffer - .diagnostics_in_range::(search_start..buffer.len()) - .filter(|entry| entry.diagnostic.is_primary) - .filter(|entry| entry.range.start != entry.range.end) - .filter(|entry| entry.diagnostic.severity <= DiagnosticSeverity::WARNING) - .filter(|diagnostic| !snapshot.intersects_fold(diagnostic.range.start)) - .collect::>(); - let last_same_group_diagnostic_after = active_group_id.and_then(|active_group_id| { - primary_diagnostics_after - .iter() - .enumerate() - .rev() - .find_map(|(i, entry)| { - if entry.diagnostic.group_id == active_group_id { - Some(i) - } else { - None + let mut found: Option> = None; + if direction == Direction::Prev { + 'outer: for prev_diagnostics in [before.collect::>(), after.collect::>()] + { + for diagnostic in prev_diagnostics.into_iter().rev() { + if diagnostic.range.start != selection.start + || active_group_id + .is_some_and(|active| diagnostic.diagnostic.group_id < active) + { + found = Some(diagnostic); + break 'outer; } - }) - }); - - let next_primary_diagnostic = match direction { - Direction::Prev => primary_diagnostics_before - .iter() - .take(last_same_group_diagnostic_before.unwrap_or(usize::MAX)) - .rev() - .next(), - Direction::Next => primary_diagnostics_after - .iter() - .skip( - last_same_group_diagnostic_after - .map(|index| index + 1) - .unwrap_or(0), - ) - .next(), - }; - - // Cycle around to the start of the buffer, potentially moving back to the start of - // the currently active diagnostic. - let cycle_around = || match direction { - Direction::Prev => primary_diagnostics_after - .iter() - .rev() - .chain(primary_diagnostics_before.iter().rev()) - .next(), - Direction::Next => primary_diagnostics_before - .iter() - .chain(primary_diagnostics_after.iter()) - .next(), - }; - - if let Some((primary_range, group_id)) = next_primary_diagnostic - .or_else(cycle_around) - .map(|entry| (&entry.range, entry.diagnostic.group_id)) - { - let Some(buffer_id) = buffer.anchor_after(primary_range.start).buffer_id else { - return; - }; - self.activate_diagnostics(buffer_id, group_id, window, cx); - if self.active_diagnostics.is_some() { - self.change_selections(Some(Autoscroll::fit()), window, cx, |s| { - s.select(vec![Selection { - id: selection.id, - start: primary_range.start, - end: primary_range.start, - reversed: false, - goal: SelectionGoal::None, - }]); - }); - self.refresh_inline_completion(false, true, window, cx); + } + } + } else { + for diagnostic in after.chain(before) { + if diagnostic.range.start != selection.start + || active_group_id.is_some_and(|active| diagnostic.diagnostic.group_id > active) + { + found = Some(diagnostic); + break; + } } } + let Some(next_diagnostic) = found else { + return; + }; + + let Some(buffer_id) = buffer.anchor_after(next_diagnostic.range.start).buffer_id else { + return; + }; + self.change_selections(Some(Autoscroll::fit()), window, cx, |s| { + s.select_ranges(vec![ + next_diagnostic.range.start..next_diagnostic.range.start, + ]) + }); + self.activate_diagnostics(buffer_id, next_diagnostic, window, cx); + self.refresh_inline_completion(false, true, window, cx); } fn go_to_next_hunk(&mut self, _: &GoToHunk, window: &mut Window, cx: &mut Context) { @@ -14502,110 +14465,91 @@ impl Editor { } fn refresh_active_diagnostics(&mut self, cx: &mut Context) { - if let Some(active_diagnostics) = self.active_diagnostics.as_mut() { + if let ActiveDiagnostic::Group(active_diagnostics) = &mut self.active_diagnostics { let buffer = self.buffer.read(cx).snapshot(cx); - let primary_range_start = active_diagnostics.primary_range.start.to_offset(&buffer); - let primary_range_end = active_diagnostics.primary_range.end.to_offset(&buffer); + let primary_range_start = active_diagnostics.active_range.start.to_offset(&buffer); + let primary_range_end = active_diagnostics.active_range.end.to_offset(&buffer); let is_valid = buffer .diagnostics_in_range::(primary_range_start..primary_range_end) .any(|entry| { entry.diagnostic.is_primary && !entry.range.is_empty() && entry.range.start == primary_range_start - && entry.diagnostic.message == active_diagnostics.primary_message + && entry.diagnostic.message == active_diagnostics.active_message }); - if is_valid != active_diagnostics.is_valid { - active_diagnostics.is_valid = is_valid; - if is_valid { - let mut new_styles = HashMap::default(); - for (block_id, diagnostic) in &active_diagnostics.blocks { - new_styles.insert( - *block_id, - diagnostic_block_renderer(diagnostic.clone(), None, true), - ); - } - self.display_map.update(cx, |display_map, _cx| { - display_map.replace_blocks(new_styles); - }); - } else { - self.dismiss_diagnostics(cx); - } + if !is_valid { + self.dismiss_diagnostics(cx); } } } + pub fn active_diagnostic_group(&self) -> Option<&ActiveDiagnosticGroup> { + match &self.active_diagnostics { + ActiveDiagnostic::Group(group) => Some(group), + _ => None, + } + } + + pub fn set_all_diagnostics_active(&mut self, cx: &mut Context) { + self.dismiss_diagnostics(cx); + self.active_diagnostics = ActiveDiagnostic::All; + } + fn activate_diagnostics( &mut self, buffer_id: BufferId, - group_id: usize, + diagnostic: DiagnosticEntry, window: &mut Window, cx: &mut Context, ) { + if matches!(self.active_diagnostics, ActiveDiagnostic::All) { + return; + } self.dismiss_diagnostics(cx); let snapshot = self.snapshot(window, cx); - self.active_diagnostics = self.display_map.update(cx, |display_map, cx| { - let buffer = self.buffer.read(cx).snapshot(cx); + let Some(diagnostic_renderer) = cx + .try_global::() + .map(|g| g.0.clone()) + else { + return; + }; + let buffer = self.buffer.read(cx).snapshot(cx); - let mut primary_range = None; - let mut primary_message = None; - let diagnostic_group = buffer - .diagnostic_group(buffer_id, group_id) - .filter_map(|entry| { - let start = entry.range.start; - let end = entry.range.end; - if snapshot.is_line_folded(MultiBufferRow(start.row)) - && (start.row == end.row - || snapshot.is_line_folded(MultiBufferRow(end.row))) - { - return None; - } - if entry.diagnostic.is_primary { - primary_range = Some(entry.range.clone()); - primary_message = Some(entry.diagnostic.message.clone()); - } - Some(entry) - }) - .collect::>(); - let primary_range = primary_range?; - let primary_message = primary_message?; + let diagnostic_group = buffer + .diagnostic_group(buffer_id, diagnostic.diagnostic.group_id) + .collect::>(); - let blocks = display_map - .insert_blocks( - diagnostic_group.iter().map(|entry| { - let diagnostic = entry.diagnostic.clone(); - let message_height = diagnostic.message.matches('\n').count() as u32 + 1; - BlockProperties { - style: BlockStyle::Fixed, - placement: BlockPlacement::Below( - buffer.anchor_after(entry.range.start), - ), - height: Some(message_height), - render: diagnostic_block_renderer(diagnostic, None, true), - priority: 0, - } - }), - cx, - ) - .into_iter() - .zip(diagnostic_group.into_iter().map(|entry| entry.diagnostic)) - .collect(); + let blocks = diagnostic_renderer.render_group( + diagnostic_group, + buffer_id, + snapshot, + cx.weak_entity(), + cx, + ); - Some(ActiveDiagnosticGroup { - primary_range: buffer.anchor_before(primary_range.start) - ..buffer.anchor_after(primary_range.end), - primary_message, - group_id, - blocks, - is_valid: true, - }) + let blocks = self.display_map.update(cx, |display_map, cx| { + display_map.insert_blocks(blocks, cx).into_iter().collect() }); + self.active_diagnostics = ActiveDiagnostic::Group(ActiveDiagnosticGroup { + active_range: buffer.anchor_before(diagnostic.range.start) + ..buffer.anchor_after(diagnostic.range.end), + active_message: diagnostic.diagnostic.message.clone(), + group_id: diagnostic.diagnostic.group_id, + blocks, + }); + cx.notify(); } fn dismiss_diagnostics(&mut self, cx: &mut Context) { - if let Some(active_diagnostic_group) = self.active_diagnostics.take() { + if matches!(self.active_diagnostics, ActiveDiagnostic::All) { + return; + }; + + let prev = mem::replace(&mut self.active_diagnostics, ActiveDiagnostic::None); + if let ActiveDiagnostic::Group(group) = prev { self.display_map.update(cx, |display_map, cx| { - display_map.remove_blocks(active_diagnostic_group.blocks.into_keys().collect(), cx); + display_map.remove_blocks(group.blocks, cx); }); cx.notify(); } @@ -14658,6 +14602,8 @@ impl Editor { None }; self.inline_diagnostics_update = cx.spawn_in(window, async move |editor, cx| { + let editor = editor.upgrade().unwrap(); + if let Some(debounce) = debounce { cx.background_executor().timer(debounce).await; } @@ -15230,7 +15176,7 @@ impl Editor { &mut self, creases: Vec>, auto_scroll: bool, - window: &mut Window, + _window: &mut Window, cx: &mut Context, ) { if creases.is_empty() { @@ -15255,18 +15201,6 @@ impl Editor { cx.notify(); - if let Some(active_diagnostics) = self.active_diagnostics.take() { - // Clear diagnostics block when folding a range that contains it. - let snapshot = self.snapshot(window, cx); - if snapshot.intersects_fold(active_diagnostics.primary_range.start) { - drop(snapshot); - self.active_diagnostics = Some(active_diagnostics); - self.dismiss_diagnostics(cx); - } else { - self.active_diagnostics = Some(active_diagnostics); - } - } - self.scrollbar_marker_state.dirty = true; self.folds_did_change(cx); } @@ -20120,103 +20054,6 @@ impl InvalidationRegion for SnippetState { } } -pub fn diagnostic_block_renderer( - diagnostic: Diagnostic, - max_message_rows: Option, - allow_closing: bool, -) -> RenderBlock { - let (text_without_backticks, code_ranges) = - highlight_diagnostic_message(&diagnostic, max_message_rows); - - Arc::new(move |cx: &mut BlockContext| { - let group_id: SharedString = cx.block_id.to_string().into(); - - let mut text_style = cx.window.text_style().clone(); - text_style.color = diagnostic_style(diagnostic.severity, cx.theme().status()); - let theme_settings = ThemeSettings::get_global(cx); - text_style.font_family = theme_settings.buffer_font.family.clone(); - text_style.font_style = theme_settings.buffer_font.style; - text_style.font_features = theme_settings.buffer_font.features.clone(); - text_style.font_weight = theme_settings.buffer_font.weight; - - let multi_line_diagnostic = diagnostic.message.contains('\n'); - - let buttons = |diagnostic: &Diagnostic| { - if multi_line_diagnostic { - v_flex() - } else { - h_flex() - } - .when(allow_closing, |div| { - div.children(diagnostic.is_primary.then(|| { - IconButton::new("close-block", IconName::XCircle) - .icon_color(Color::Muted) - .size(ButtonSize::Compact) - .style(ButtonStyle::Transparent) - .visible_on_hover(group_id.clone()) - .on_click(move |_click, window, cx| { - window.dispatch_action(Box::new(Cancel), cx) - }) - .tooltip(|window, cx| { - Tooltip::for_action("Close Diagnostics", &Cancel, window, cx) - }) - })) - }) - .child( - IconButton::new("copy-block", IconName::Copy) - .icon_color(Color::Muted) - .size(ButtonSize::Compact) - .style(ButtonStyle::Transparent) - .visible_on_hover(group_id.clone()) - .on_click({ - let message = diagnostic.message.clone(); - move |_click, _, cx| { - cx.write_to_clipboard(ClipboardItem::new_string(message.clone())) - } - }) - .tooltip(Tooltip::text("Copy diagnostic message")), - ) - }; - - let icon_size = buttons(&diagnostic).into_any_element().layout_as_root( - AvailableSpace::min_size(), - cx.window, - cx.app, - ); - - h_flex() - .id(cx.block_id) - .group(group_id.clone()) - .relative() - .size_full() - .block_mouse_down() - .pl(cx.gutter_dimensions.width) - .w(cx.max_width - cx.gutter_dimensions.full_width()) - .child( - div() - .flex() - .w(cx.anchor_x - cx.gutter_dimensions.width - icon_size.width) - .flex_shrink(), - ) - .child(buttons(&diagnostic)) - .child(div().flex().flex_shrink_0().child( - StyledText::new(text_without_backticks.clone()).with_default_highlights( - &text_style, - code_ranges.iter().map(|range| { - ( - range.clone(), - HighlightStyle { - font_weight: Some(FontWeight::BOLD), - ..Default::default() - }, - ) - }), - ), - )) - .into_any_element() - }) -} - fn inline_completion_edit_text( current_snapshot: &BufferSnapshot, edits: &[(Range, String)], @@ -20237,74 +20074,7 @@ fn inline_completion_edit_text( edit_preview.highlight_edits(current_snapshot, &edits, include_deletions, cx) } -pub fn highlight_diagnostic_message( - diagnostic: &Diagnostic, - mut max_message_rows: Option, -) -> (SharedString, Vec>) { - let mut text_without_backticks = String::new(); - let mut code_ranges = Vec::new(); - - if let Some(source) = &diagnostic.source { - text_without_backticks.push_str(source); - code_ranges.push(0..source.len()); - text_without_backticks.push_str(": "); - } - - let mut prev_offset = 0; - let mut in_code_block = false; - let has_row_limit = max_message_rows.is_some(); - let mut newline_indices = diagnostic - .message - .match_indices('\n') - .filter(|_| has_row_limit) - .map(|(ix, _)| ix) - .fuse() - .peekable(); - - for (quote_ix, _) in diagnostic - .message - .match_indices('`') - .chain([(diagnostic.message.len(), "")]) - { - let mut first_newline_ix = None; - let mut last_newline_ix = None; - while let Some(newline_ix) = newline_indices.peek() { - if *newline_ix < quote_ix { - if first_newline_ix.is_none() { - first_newline_ix = Some(*newline_ix); - } - last_newline_ix = Some(*newline_ix); - - if let Some(rows_left) = &mut max_message_rows { - if *rows_left == 0 { - break; - } else { - *rows_left -= 1; - } - } - let _ = newline_indices.next(); - } else { - break; - } - } - let prev_len = text_without_backticks.len(); - let new_text = &diagnostic.message[prev_offset..first_newline_ix.unwrap_or(quote_ix)]; - text_without_backticks.push_str(new_text); - if in_code_block { - code_ranges.push(prev_len..text_without_backticks.len()); - } - prev_offset = last_newline_ix.unwrap_or(quote_ix) + 1; - in_code_block = !in_code_block; - if first_newline_ix.map_or(false, |newline_ix| newline_ix < quote_ix) { - text_without_backticks.push_str("..."); - break; - } - } - - (text_without_backticks.into(), code_ranges) -} - -fn diagnostic_style(severity: DiagnosticSeverity, colors: &StatusColors) -> Hsla { +pub fn diagnostic_style(severity: DiagnosticSeverity, colors: &StatusColors) -> Hsla { match severity { DiagnosticSeverity::ERROR => colors.error, DiagnosticSeverity::WARNING => colors.warning, diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index 51647b0226..3d55e20a8a 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -12585,276 +12585,6 @@ async fn go_to_prev_overlapping_diagnostic(executor: BackgroundExecutor, cx: &mu "}); } -#[gpui::test] -async fn cycle_through_same_place_diagnostics( - executor: BackgroundExecutor, - cx: &mut TestAppContext, -) { - init_test(cx, |_| {}); - - let mut cx = EditorTestContext::new(cx).await; - let lsp_store = - cx.update_editor(|editor, _, cx| editor.project.as_ref().unwrap().read(cx).lsp_store()); - - cx.set_state(indoc! {" - ˇfn func(abc def: i32) -> u32 { - } - "}); - - cx.update(|_, cx| { - lsp_store.update(cx, |lsp_store, cx| { - lsp_store - .update_diagnostics( - LanguageServerId(0), - lsp::PublishDiagnosticsParams { - uri: lsp::Url::from_file_path(path!("/root/file")).unwrap(), - version: None, - diagnostics: vec![ - lsp::Diagnostic { - range: lsp::Range::new( - lsp::Position::new(0, 11), - lsp::Position::new(0, 12), - ), - severity: Some(lsp::DiagnosticSeverity::ERROR), - ..Default::default() - }, - lsp::Diagnostic { - range: lsp::Range::new( - lsp::Position::new(0, 12), - lsp::Position::new(0, 15), - ), - severity: Some(lsp::DiagnosticSeverity::ERROR), - ..Default::default() - }, - lsp::Diagnostic { - range: lsp::Range::new( - lsp::Position::new(0, 12), - lsp::Position::new(0, 15), - ), - severity: Some(lsp::DiagnosticSeverity::ERROR), - ..Default::default() - }, - lsp::Diagnostic { - range: lsp::Range::new( - lsp::Position::new(0, 25), - lsp::Position::new(0, 28), - ), - severity: Some(lsp::DiagnosticSeverity::ERROR), - ..Default::default() - }, - ], - }, - &[], - cx, - ) - .unwrap() - }); - }); - executor.run_until_parked(); - - //// Backward - - // Fourth diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc def: i32) -> ˇu32 { - } - "}); - - // Third diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc ˇdef: i32) -> u32 { - } - "}); - - // Second diagnostic, same place - cx.update_editor(|editor, window, cx| { - editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc ˇdef: i32) -> u32 { - } - "}); - - // First diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abcˇ def: i32) -> u32 { - } - "}); - - // Wrapped over, fourth diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_prev_diagnostic(&GoToPreviousDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc def: i32) -> ˇu32 { - } - "}); - - cx.update_editor(|editor, window, cx| { - editor.move_to_beginning(&MoveToBeginning, window, cx); - }); - cx.assert_editor_state(indoc! {" - ˇfn func(abc def: i32) -> u32 { - } - "}); - - //// Forward - - // First diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abcˇ def: i32) -> u32 { - } - "}); - - // Second diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc ˇdef: i32) -> u32 { - } - "}); - - // Third diagnostic, same place - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc ˇdef: i32) -> u32 { - } - "}); - - // Fourth diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abc def: i32) -> ˇu32 { - } - "}); - - // Wrapped around, first diagnostic - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - }); - cx.assert_editor_state(indoc! {" - fn func(abcˇ def: i32) -> u32 { - } - "}); -} - -#[gpui::test] -async fn active_diagnostics_dismiss_after_invalidation( - executor: BackgroundExecutor, - cx: &mut TestAppContext, -) { - init_test(cx, |_| {}); - - let mut cx = EditorTestContext::new(cx).await; - let lsp_store = - cx.update_editor(|editor, _, cx| editor.project.as_ref().unwrap().read(cx).lsp_store()); - - cx.set_state(indoc! {" - ˇfn func(abc def: i32) -> u32 { - } - "}); - - let message = "Something's wrong!"; - cx.update(|_, cx| { - lsp_store.update(cx, |lsp_store, cx| { - lsp_store - .update_diagnostics( - LanguageServerId(0), - lsp::PublishDiagnosticsParams { - uri: lsp::Url::from_file_path(path!("/root/file")).unwrap(), - version: None, - diagnostics: vec![lsp::Diagnostic { - range: lsp::Range::new( - lsp::Position::new(0, 11), - lsp::Position::new(0, 12), - ), - severity: Some(lsp::DiagnosticSeverity::ERROR), - message: message.to_string(), - ..Default::default() - }], - }, - &[], - cx, - ) - .unwrap() - }); - }); - executor.run_until_parked(); - - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - assert_eq!( - editor - .active_diagnostics - .as_ref() - .map(|diagnostics_group| diagnostics_group.primary_message.as_str()), - Some(message), - "Should have a diagnostics group activated" - ); - }); - cx.assert_editor_state(indoc! {" - fn func(abcˇ def: i32) -> u32 { - } - "}); - - cx.update(|_, cx| { - lsp_store.update(cx, |lsp_store, cx| { - lsp_store - .update_diagnostics( - LanguageServerId(0), - lsp::PublishDiagnosticsParams { - uri: lsp::Url::from_file_path(path!("/root/file")).unwrap(), - version: None, - diagnostics: Vec::new(), - }, - &[], - cx, - ) - .unwrap() - }); - }); - executor.run_until_parked(); - cx.update_editor(|editor, _, _| { - assert_eq!( - editor.active_diagnostics, None, - "After no diagnostics set to the editor, no diagnostics should be active" - ); - }); - cx.assert_editor_state(indoc! {" - fn func(abcˇ def: i32) -> u32 { - } - "}); - - cx.update_editor(|editor, window, cx| { - editor.go_to_diagnostic(&GoToDiagnostic, window, cx); - assert_eq!( - editor.active_diagnostics, None, - "Should be no diagnostics to go to and activate" - ); - }); - cx.assert_editor_state(indoc! {" - fn func(abcˇ def: i32) -> u32 { - } - "}); -} - #[gpui::test] async fn test_diagnostics_with_links(cx: &mut TestAppContext) { init_test(cx, |_| {}); diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index a05e39e2f0..15e5b4d379 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1,11 +1,11 @@ use crate::{ - BlockId, COLUMNAR_SELECTION_MODIFIERS, CURSORS_VISIBLE_FOR, ChunkRendererContext, - ChunkReplacement, ContextMenuPlacement, CursorShape, CustomBlockId, DisplayDiffHunk, - DisplayPoint, DisplayRow, DocumentHighlightRead, DocumentHighlightWrite, EditDisplayMode, - Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle, FILE_HEADER_HEIGHT, - FocusedBlock, GutterDimensions, HalfPageDown, HalfPageUp, HandleInput, HoveredCursor, - InlayHintRefreshReason, InlineCompletion, JumpData, LineDown, LineHighlight, LineUp, - MAX_LINE_LEN, MIN_LINE_NUMBER_DIGITS, MULTI_BUFFER_EXCERPT_HEADER_HEIGHT, OpenExcerpts, + ActiveDiagnostic, BlockId, COLUMNAR_SELECTION_MODIFIERS, CURSORS_VISIBLE_FOR, + ChunkRendererContext, ChunkReplacement, ContextMenuPlacement, CursorShape, CustomBlockId, + DisplayDiffHunk, DisplayPoint, DisplayRow, DocumentHighlightRead, DocumentHighlightWrite, + EditDisplayMode, Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle, + FILE_HEADER_HEIGHT, FocusedBlock, GutterDimensions, HalfPageDown, HalfPageUp, HandleInput, + HoveredCursor, InlayHintRefreshReason, InlineCompletion, JumpData, LineDown, LineHighlight, + LineUp, MAX_LINE_LEN, MIN_LINE_NUMBER_DIGITS, MULTI_BUFFER_EXCERPT_HEADER_HEIGHT, OpenExcerpts, PageDown, PageUp, Point, RowExt, RowRangeExt, SelectPhase, SelectedTextHighlight, Selection, SoftWrap, StickyHeaderExcerpt, ToPoint, ToggleFold, code_context_menus::{CodeActionsMenu, MENU_ASIDE_MAX_WIDTH, MENU_ASIDE_MIN_WIDTH, MENU_GAP}, @@ -1614,12 +1614,12 @@ impl EditorElement { project_settings::DiagnosticSeverity::Hint => DiagnosticSeverity::HINT, }); - let active_diagnostics_group = self - .editor - .read(cx) - .active_diagnostics - .as_ref() - .map(|active_diagnostics| active_diagnostics.group_id); + let active_diagnostics_group = + if let ActiveDiagnostic::Group(group) = &self.editor.read(cx).active_diagnostics { + Some(group.group_id) + } else { + None + }; let diagnostics_by_rows = self.editor.update(cx, |editor, cx| { let snapshot = editor.snapshot(window, cx); @@ -2643,12 +2643,15 @@ impl EditorElement { sticky_header_excerpt_id: Option, window: &mut Window, cx: &mut App, - ) -> (AnyElement, Size, DisplayRow, Pixels) { + ) -> Option<(AnyElement, Size, DisplayRow, Pixels)> { let mut x_position = None; let mut element = match block { - Block::Custom(block) => { - let block_start = block.start().to_point(&snapshot.buffer_snapshot); - let block_end = block.end().to_point(&snapshot.buffer_snapshot); + Block::Custom(custom) => { + let block_start = custom.start().to_point(&snapshot.buffer_snapshot); + let block_end = custom.end().to_point(&snapshot.buffer_snapshot); + if block.place_near() && snapshot.is_line_folded(MultiBufferRow(block_start.row)) { + return None; + } let align_to = block_start.to_display_point(snapshot); let x_and_width = |layout: &LineWithInvisibles| { Some(( @@ -2686,7 +2689,7 @@ impl EditorElement { div() .size_full() - .child(block.render(&mut BlockContext { + .child(custom.render(&mut BlockContext { window, app: cx, anchor_x, @@ -2774,6 +2777,7 @@ impl EditorElement { } else { element.layout_as_root(size(available_width, quantized_height.into()), window, cx) }; + let mut element_height_in_lines = ((final_size.height / line_height).ceil() as u32).max(1); let mut row = block_row_start; let mut x_offset = px(0.); @@ -2781,20 +2785,19 @@ impl EditorElement { if let BlockId::Custom(custom_block_id) = block_id { if block.has_height() { - let mut element_height_in_lines = - ((final_size.height / line_height).ceil() as u32).max(1); - - if block.place_near() && element_height_in_lines == 1 { + if block.place_near() { if let Some((x_target, line_width)) = x_position { let margin = em_width * 2; if line_width + final_size.width + margin < editor_width + gutter_dimensions.full_width() && !row_block_types.contains_key(&(row - 1)) + && element_height_in_lines == 1 { x_offset = line_width + margin; row = row - 1; is_block = false; element_height_in_lines = 0; + row_block_types.insert(row, is_block); } else { let max_offset = editor_width + gutter_dimensions.full_width() - final_size.width; @@ -2809,9 +2812,11 @@ impl EditorElement { } } } - row_block_types.insert(row, is_block); + for i in 0..element_height_in_lines { + row_block_types.insert(row + i, is_block); + } - (element, final_size, row, x_offset) + Some((element, final_size, row, x_offset)) } fn render_buffer_header( @@ -3044,7 +3049,7 @@ impl EditorElement { focused_block = None; } - let (element, element_size, row, x_offset) = self.render_block( + if let Some((element, element_size, row, x_offset)) = self.render_block( block, AvailableSpace::MinContent, block_id, @@ -3067,19 +3072,19 @@ impl EditorElement { sticky_header_excerpt_id, window, cx, - ); - - fixed_block_max_width = fixed_block_max_width.max(element_size.width + em_width); - blocks.push(BlockLayout { - id: block_id, - x_offset, - row: Some(row), - element, - available_space: size(AvailableSpace::MinContent, element_size.height.into()), - style: BlockStyle::Fixed, - overlaps_gutter: true, - is_buffer_header: block.is_buffer_header(), - }); + ) { + fixed_block_max_width = fixed_block_max_width.max(element_size.width + em_width); + blocks.push(BlockLayout { + id: block_id, + x_offset, + row: Some(row), + element, + available_space: size(AvailableSpace::MinContent, element_size.height.into()), + style: BlockStyle::Fixed, + overlaps_gutter: true, + is_buffer_header: block.is_buffer_header(), + }); + } } for (row, block) in non_fixed_blocks { @@ -3101,7 +3106,7 @@ impl EditorElement { focused_block = None; } - let (element, element_size, row, x_offset) = self.render_block( + if let Some((element, element_size, row, x_offset)) = self.render_block( block, width, block_id, @@ -3124,18 +3129,18 @@ impl EditorElement { sticky_header_excerpt_id, window, cx, - ); - - blocks.push(BlockLayout { - id: block_id, - x_offset, - row: Some(row), - element, - available_space: size(width, element_size.height.into()), - style, - overlaps_gutter: !block.place_near(), - is_buffer_header: block.is_buffer_header(), - }); + ) { + blocks.push(BlockLayout { + id: block_id, + x_offset, + row: Some(row), + element, + available_space: size(width, element_size.height.into()), + style, + overlaps_gutter: !block.place_near(), + is_buffer_header: block.is_buffer_header(), + }); + } } if let Some(focused_block) = focused_block { @@ -3155,7 +3160,7 @@ impl EditorElement { BlockStyle::Sticky => AvailableSpace::Definite(hitbox.size.width), }; - let (element, element_size, _, x_offset) = self.render_block( + if let Some((element, element_size, _, x_offset)) = self.render_block( &block, width, focused_block.id, @@ -3178,18 +3183,18 @@ impl EditorElement { sticky_header_excerpt_id, window, cx, - ); - - blocks.push(BlockLayout { - id: block.id(), - x_offset, - row: None, - element, - available_space: size(width, element_size.height.into()), - style, - overlaps_gutter: true, - is_buffer_header: block.is_buffer_header(), - }); + ) { + blocks.push(BlockLayout { + id: block.id(), + x_offset, + row: None, + element, + available_space: size(width, element_size.height.into()), + style, + overlaps_gutter: true, + is_buffer_header: block.is_buffer_header(), + }); + } } } } diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index fd53c4b0ad..55a35fb11f 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -1,6 +1,6 @@ use crate::{ - Anchor, AnchorRangeExt, DisplayPoint, DisplayRow, Editor, EditorSettings, EditorSnapshot, - Hover, + ActiveDiagnostic, Anchor, AnchorRangeExt, DisplayPoint, DisplayRow, Editor, EditorSettings, + EditorSnapshot, Hover, display_map::{InlayOffset, ToDisplayPoint, invisibles::is_invisible}, hover_links::{InlayHighlight, RangeInEditor}, scroll::{Autoscroll, ScrollAmount}, @@ -95,7 +95,7 @@ pub fn show_keyboard_hover( } pub struct InlayHover { - pub range: InlayHighlight, + pub(crate) range: InlayHighlight, pub tooltip: HoverBlock, } @@ -276,6 +276,12 @@ fn show_hover( } let hover_popover_delay = EditorSettings::get_global(cx).hover_popover_delay; + let all_diagnostics_active = editor.active_diagnostics == ActiveDiagnostic::All; + let active_group_id = if let ActiveDiagnostic::Group(group) = &editor.active_diagnostics { + Some(group.group_id) + } else { + None + }; let task = cx.spawn_in(window, async move |this, cx| { async move { @@ -302,11 +308,16 @@ fn show_hover( } let offset = anchor.to_offset(&snapshot.buffer_snapshot); - let local_diagnostic = snapshot - .buffer_snapshot - .diagnostics_in_range::(offset..offset) - // Find the entry with the most specific range - .min_by_key(|entry| entry.range.len()); + let local_diagnostic = if all_diagnostics_active { + None + } else { + snapshot + .buffer_snapshot + .diagnostics_in_range::(offset..offset) + .filter(|diagnostic| Some(diagnostic.diagnostic.group_id) != active_group_id) + // Find the entry with the most specific range + .min_by_key(|entry| entry.range.len()) + }; let diagnostic_popover = if let Some(local_diagnostic) = local_diagnostic { let text = match local_diagnostic.diagnostic.source { @@ -638,6 +649,7 @@ pub fn hover_markdown_style(window: &Window, cx: &App) -> MarkdownStyle { }, syntax: cx.theme().syntax().clone(), selection_background_color: { cx.theme().players().local().selection }, + height_is_multiple_of_line_height: true, heading: StyleRefinement::default() .font_weight(FontWeight::BOLD) .text_base() @@ -707,7 +719,7 @@ pub fn open_markdown_url(link: SharedString, window: &mut Window, cx: &mut App) #[derive(Default)] pub struct HoverState { - pub info_popovers: Vec, + pub(crate) info_popovers: Vec, pub diagnostic_popover: Option, pub triggered_from: Option, pub info_task: Option>>, diff --git a/crates/editor/src/test.rs b/crates/editor/src/test.rs index b197c56bbc..5ab6866495 100644 --- a/crates/editor/src/test.rs +++ b/crates/editor/src/test.rs @@ -1,18 +1,25 @@ pub mod editor_lsp_test_context; pub mod editor_test_context; +use std::{rc::Rc, sync::LazyLock}; + pub use crate::rust_analyzer_ext::expand_macro_recursively; use crate::{ DisplayPoint, Editor, EditorMode, FoldPlaceholder, MultiBuffer, - display_map::{DisplayMap, DisplaySnapshot, ToDisplayPoint}, + display_map::{ + Block, BlockPlacement, CustomBlockId, DisplayMap, DisplayRow, DisplaySnapshot, + ToDisplayPoint, + }, }; +use collections::HashMap; use gpui::{ - AppContext as _, Context, Entity, Font, FontFeatures, FontStyle, FontWeight, Pixels, Window, - font, + AppContext as _, Context, Entity, EntityId, Font, FontFeatures, FontStyle, FontWeight, Pixels, + VisualTestContext, Window, font, size, }; +use multi_buffer::ToPoint; use pretty_assertions::assert_eq; use project::Project; -use std::sync::LazyLock; +use ui::{App, BorrowAppContext, px}; use util::test::{marked_text_offsets, marked_text_ranges}; #[cfg(test)] @@ -122,3 +129,126 @@ pub(crate) fn build_editor_with_project( ) -> Editor { Editor::new(EditorMode::full(), buffer, Some(project), window, cx) } + +#[derive(Default)] +struct TestBlockContent( + HashMap<(EntityId, CustomBlockId), Rc String>>, +); + +impl gpui::Global for TestBlockContent {} + +pub fn set_block_content_for_tests( + editor: &Entity, + id: CustomBlockId, + cx: &mut App, + f: impl Fn(&mut VisualTestContext) -> String + 'static, +) { + cx.update_default_global::(|bc, _| { + bc.0.insert((editor.entity_id(), id), Rc::new(f)) + }); +} + +pub fn block_content_for_tests( + editor: &Entity, + id: CustomBlockId, + cx: &mut VisualTestContext, +) -> Option { + let f = cx.update(|_, cx| { + cx.default_global::() + .0 + .get(&(editor.entity_id(), id)) + .cloned() + })?; + Some(f(cx)) +} + +pub fn editor_content_with_blocks(editor: &Entity, cx: &mut VisualTestContext) -> String { + cx.draw( + gpui::Point::default(), + size(px(3000.0), px(3000.0)), + |_, _| editor.clone(), + ); + let (snapshot, mut lines, blocks) = editor.update_in(cx, |editor, window, cx| { + let snapshot = editor.snapshot(window, cx); + let text = editor.display_text(cx); + let lines = text.lines().map(|s| s.to_string()).collect::>(); + let blocks = snapshot + .blocks_in_range(DisplayRow(0)..snapshot.max_point().row()) + .map(|(row, block)| (row, block.clone())) + .collect::>(); + (snapshot, lines, blocks) + }); + for (row, block) in blocks { + match block { + Block::Custom(custom_block) => { + if let BlockPlacement::Near(x) = &custom_block.placement { + if snapshot.intersects_fold(x.to_point(&snapshot.buffer_snapshot)) { + continue; + } + }; + let content = block_content_for_tests(&editor, custom_block.id, cx) + .expect("block content not found"); + // 2: "related info 1 for diagnostic 0" + if let Some(height) = custom_block.height { + if height == 0 { + lines[row.0 as usize - 1].push_str(" § "); + lines[row.0 as usize - 1].push_str(&content); + } else { + let block_lines = content.lines().collect::>(); + assert_eq!(block_lines.len(), height as usize); + lines[row.0 as usize].push_str("§ "); + lines[row.0 as usize].push_str(block_lines[0].trim_end()); + for i in 1..height as usize { + lines[row.0 as usize + i].push_str("§ "); + lines[row.0 as usize + i].push_str(block_lines[i].trim_end()); + } + } + } + } + Block::FoldedBuffer { + first_excerpt, + height, + } => { + lines[row.0 as usize].push_str(&cx.update(|_, cx| { + format!( + "§ {}", + first_excerpt + .buffer + .file() + .unwrap() + .file_name(cx) + .to_string_lossy() + ) + })); + for row in row.0 + 1..row.0 + height { + lines[row as usize].push_str("§ -----"); + } + } + Block::ExcerptBoundary { + excerpt, + height, + starts_new_buffer, + } => { + if starts_new_buffer { + lines[row.0 as usize].push_str(&cx.update(|_, cx| { + format!( + "§ {}", + excerpt + .buffer + .file() + .unwrap() + .file_name(cx) + .to_string_lossy() + ) + })); + } else { + lines[row.0 as usize].push_str("§ -----") + } + for row in row.0 + 1..row.0 + height { + lines[row as usize].push_str("§ -----"); + } + } + } + } + lines.join("\n") +} diff --git a/crates/gpui/src/elements/text.rs b/crates/gpui/src/elements/text.rs index 2407606a66..04e43f5b09 100644 --- a/crates/gpui/src/elements/text.rs +++ b/crates/gpui/src/elements/text.rs @@ -556,6 +556,25 @@ impl TextLayout { .collect::>() .join("\n") } + + /// The text for this layout (with soft-wraps as newlines) + pub fn wrapped_text(&self) -> String { + let mut lines = Vec::new(); + for wrapped in self.0.borrow().as_ref().unwrap().lines.iter() { + let mut seen = 0; + for boundary in wrapped.layout.wrap_boundaries.iter() { + let index = wrapped.layout.unwrapped_layout.runs[boundary.run_ix].glyphs + [boundary.glyph_ix] + .index; + + lines.push(wrapped.text[seen..index].to_string()); + seen = index; + } + lines.push(wrapped.text[seen..].to_string()); + } + + lines.join("\n") + } } /// A text element that can be interacted with. diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 0d6f797bc3..a95799845f 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1265,6 +1265,7 @@ impl Buffer { self.reload_task = Some(cx.spawn(async move |this, cx| { let Some((new_mtime, new_text)) = this.update(cx, |this, cx| { let file = this.file.as_ref()?.as_local()?; + Some((file.disk_state().mtime(), file.load(cx))) })? else { diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index ffae4b18d7..f341bf09c9 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -550,13 +550,7 @@ pub trait LspAdapter: 'static + Send + Sync { /// Returns a list of code actions supported by a given LspAdapter fn code_action_kinds(&self) -> Option> { - Some(vec![ - CodeActionKind::EMPTY, - CodeActionKind::QUICKFIX, - CodeActionKind::REFACTOR, - CodeActionKind::REFACTOR_EXTRACT, - CodeActionKind::SOURCE, - ]) + None } fn disk_based_diagnostic_sources(&self) -> Vec { diff --git a/crates/markdown/src/markdown.rs b/crates/markdown/src/markdown.rs index 16f4f621e0..03039f41fe 100644 --- a/crates/markdown/src/markdown.rs +++ b/crates/markdown/src/markdown.rs @@ -1,6 +1,7 @@ pub mod parser; mod path_range; +use std::borrow::Cow; use std::collections::HashSet; use std::iter; use std::mem; @@ -59,6 +60,7 @@ pub struct MarkdownStyle { pub heading: StyleRefinement, pub heading_level_styles: Option, pub table_overflow_x_scroll: bool, + pub height_is_multiple_of_line_height: bool, } impl Default for MarkdownStyle { @@ -78,6 +80,7 @@ impl Default for MarkdownStyle { heading: Default::default(), heading_level_styles: None, table_overflow_x_scroll: false, + height_is_multiple_of_line_height: false, } } } @@ -205,6 +208,22 @@ impl Markdown { &self.parsed_markdown } + pub fn escape(s: &str) -> Cow { + let count = s.bytes().filter(|c| c.is_ascii_punctuation()).count(); + if count > 0 { + let mut output = String::with_capacity(s.len() + count); + for c in s.chars() { + if c.is_ascii_punctuation() { + output.push('\\') + } + output.push(c) + } + output.into() + } else { + s.into() + } + } + fn copy(&self, text: &RenderedText, _: &mut Window, cx: &mut Context) { if self.selection.end <= self.selection.start { return; @@ -367,6 +386,27 @@ impl MarkdownElement { } } + #[cfg(any(test, feature = "test-support"))] + pub fn rendered_text( + markdown: Entity, + cx: &mut gpui::VisualTestContext, + style: impl FnOnce(&Window, &App) -> MarkdownStyle, + ) -> String { + use gpui::size; + + let (text, _) = cx.draw( + Default::default(), + size(px(600.0), px(600.0)), + |window, cx| Self::new(markdown, style(window, cx)), + ); + text.text + .lines + .iter() + .map(|line| line.layout.wrapped_text()) + .collect::>() + .join("\n") + } + pub fn code_block_renderer(mut self, variant: CodeBlockRenderer) -> Self { self.code_block_renderer = variant; self @@ -496,9 +536,9 @@ impl MarkdownElement { pending: true, }; window.focus(&markdown.focus_handle); - window.prevent_default(); } + window.prevent_default(); cx.notify(); } } else if phase.capture() { @@ -634,7 +674,9 @@ impl Element for MarkdownElement { match tag { MarkdownTag::Paragraph => { builder.push_div( - div().mb_2().line_height(rems(1.3)), + div().when(!self.style.height_is_multiple_of_line_height, |el| { + el.mb_2().line_height(rems(1.3)) + }), range, markdown_end, ); @@ -767,11 +809,11 @@ impl Element for MarkdownElement { }; builder.push_div( div() - .mb_1() + .when(!self.style.height_is_multiple_of_line_height, |el| { + el.mb_1().gap_1().line_height(rems(1.3)) + }) .h_flex() .items_start() - .gap_1() - .line_height(rems(1.3)) .child(bullet), range, markdown_end, diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 994815910c..2a4c558b5a 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -1578,7 +1578,27 @@ impl MultiBuffer { let excerpt_ranges = build_excerpt_ranges(ranges, context_line_count, &buffer_snapshot); let (new, counts) = Self::merge_excerpt_ranges(&excerpt_ranges); - self.set_excerpt_ranges_for_path( + self.set_merged_excerpt_ranges_for_path( + path, + buffer, + excerpt_ranges, + &buffer_snapshot, + new, + counts, + cx, + ) + } + + pub fn set_excerpt_ranges_for_path( + &mut self, + path: PathKey, + buffer: Entity, + buffer_snapshot: &BufferSnapshot, + excerpt_ranges: Vec>, + cx: &mut Context, + ) -> (Vec>, bool) { + let (new, counts) = Self::merge_excerpt_ranges(&excerpt_ranges); + self.set_merged_excerpt_ranges_for_path( path, buffer, excerpt_ranges, @@ -1612,11 +1632,11 @@ impl MultiBuffer { multi_buffer .update(cx, move |multi_buffer, cx| { - let (ranges, _) = multi_buffer.set_excerpt_ranges_for_path( + let (ranges, _) = multi_buffer.set_merged_excerpt_ranges_for_path( path_key, buffer, excerpt_ranges, - buffer_snapshot, + &buffer_snapshot, new, counts, cx, @@ -1629,12 +1649,12 @@ impl MultiBuffer { } /// Sets excerpts, returns `true` if at least one new excerpt was added. - fn set_excerpt_ranges_for_path( + fn set_merged_excerpt_ranges_for_path( &mut self, path: PathKey, buffer: Entity, ranges: Vec>, - buffer_snapshot: BufferSnapshot, + buffer_snapshot: &BufferSnapshot, new: Vec>, counts: Vec, cx: &mut Context, @@ -1665,6 +1685,7 @@ impl MultiBuffer { let mut counts: Vec = Vec::new(); for range in expanded_ranges { if let Some(last_range) = merged_ranges.last_mut() { + debug_assert!(last_range.context.start <= range.context.start); if last_range.context.end >= range.context.start { last_range.context.end = range.context.end; *counts.last_mut().unwrap() += 1; @@ -5878,13 +5899,14 @@ impl MultiBufferSnapshot { buffer_id: BufferId, group_id: usize, ) -> impl Iterator> + '_ { - self.lift_buffer_metadata(Point::zero()..self.max_point(), move |buffer, _| { + self.lift_buffer_metadata(Point::zero()..self.max_point(), move |buffer, range| { if buffer.remote_id() != buffer_id { return None; }; Some( buffer - .diagnostic_group(group_id) + .diagnostics_in_range(range, false) + .filter(move |diagnostic| diagnostic.diagnostic.group_id == group_id) .map(move |DiagnosticEntry { diagnostic, range }| (range, diagnostic)), ) })