From 7bf33641931c7ce4c70339422750b1d3120edb63 Mon Sep 17 00:00:00 2001 From: Lorenzo Nicora Date: Fri, 15 Aug 2025 09:21:35 +0100 Subject: [PATCH 1/2] Improving Kafka connectors example (WIP) --- java/KafkaConnectors/README.md | 4 +--- .../images/flink-msk-serverless-example.png | Bin 35192 -> 0 bytes .../KafkaConnectors/images/runConfiguration.png | Bin 79162 -> 0 bytes 3 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 java/KafkaConnectors/images/flink-msk-serverless-example.png delete mode 100644 java/KafkaConnectors/images/runConfiguration.png diff --git a/java/KafkaConnectors/README.md b/java/KafkaConnectors/README.md index d5e99838..0ce33d64 100644 --- a/java/KafkaConnectors/README.md +++ b/java/KafkaConnectors/README.md @@ -53,12 +53,10 @@ If you are connecting with no-auth and no SSL, above will work. Else you need ad ### For IAM Auth When using IAM Auth, the following Runtime Properties are expected at the Group ID `AuthProperties`: -* `sasl.mechanism` AWS_MSK_IAM +* `sasl.mechanism` = `AWS_MSK_IAM * `sasl.client.callback.handler.class` software.amazon.msk.auth.iam.IAMClientCallbackHandler * `sasl.jaas.config` "software.amazon.msk.auth.iam.IAMLoginModule required;" * `security.protocol` SASL_SSL -* `ssl.truststore.location` /usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts -* `ssl.truststore.password` changeit ## Running locally in IntelliJ diff --git a/java/KafkaConnectors/images/flink-msk-serverless-example.png b/java/KafkaConnectors/images/flink-msk-serverless-example.png deleted file mode 100644 index 40b536fa3f574ba7a6e726028062d6e349be1b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35192 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 z 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 IIVCg!0JZg*EC2ui diff --git a/java/KafkaConnectors/images/runConfiguration.png b/java/KafkaConnectors/images/runConfiguration.png deleted file mode 100644 index beb1d7f76e01e66512e903a3d22afa6fea78b0a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79162 zcmd43cRXC}_C72^5H*MrqDJ%*HF}TE=%W)RI?+2pkPy9#-g_Bc^h6s`qIVL8FnaIa z?c_P;ggk}* z064Si5fg}nbkERIQW7L5DM{6*!E0ordLVL>8fUYU8 zi^gZo%;buGG%Gzane@=s``IIh=+Kg!mmi$=L>WR0!@f{4H2i+<{FtVYZeg;}cKo6t zl`_POGVwk)D&e4$A(F>Dr&{cCM;<&rbBEOTbU2vekoo({3mxSV^w!#{O+okf3pgL! zLL<#xUvHLGR{Av;7{tlk4D!W^=A?W&4Agx+SBa#O1YUqPEFn82ipxBrM4!+Xd6epU z)-1r47)r2+S6^KkL+wk0lZWswi#TXhI(7+c5Xsy)sLq`q^N}@1mh%+vjl#=I;E*Q0 zY9lDy{#JD_!j=Ra63oIf6A}G2I#6B+`zh8}^hXNl>M~LjZCs@u=S&=&l9lQQQ_OE? zFr5>u7uwl|9Z>WQow`82F-KE|POLPIbGpd7I8WCgk9M(<?#Bcpp#gvKfv;31^1rX5 zgk;|T_c8L+?TzB{Ob+@;Q015I}O#pZgI92rU5H~s3h$jAym9< z9BdpkA`hvksDvEN-Uz5kz51&-@JpD+!rA$)06V*zn;V-O7n{AKIr|HKetvciPIgXC zR^Sd+Cl5Pk6L(fSC)z)i{JS10h?A+K@V0j*#A>EP*mvltN_T;9b%&+WoZkD2WUftkMpI_zwZCXmH%t; zzeQVmni{hZ#`Yp1i6O~JiEFsu+e|}yM<_kfLs_|!`Y0+jhrw73m9996wjk-T z2H}vi?`rCxpbGr^Jq@AJpG6Ez*-6q-R3BDSmt(lD#@jMe7N*yW7t)fkzqdKBZ--X+ zYNjnTdm23B;u?5=PWr9}8p+90!^^FGYzxA;@%O2uI5> zpue;7drToO(PZDD-0`6b#{luibq5ZW-`%j-gGV1Ot2$%l6r^0YsImXib^p#+neH#5 zaa^QzCz;fyqzam!fvC`j9c8h<=H_W&J^nB)Oa1p|sfbZ_B}EqyB)|nnnRf}2p|j=l z7fX$)L zi@Qarn%ppHP>D*bH=M>TH=cOSHn{ zGLmJfm;h~L$GjH#hbZsi%hKFq2#(-iB`Gp&@yylLt}tX3y*i9_Moh4(`M#0IMV_s< zCuVr^DDx$YX0b+u;2;FT|El}{71m$FdU+3wC9R2-#j_Ir8d765&UCgCtFkgszYt?N znoq~}TU_J*X`0g@Kh(G*AnwF!XQ5>uxB=F@;eZ#q2b%!`Yq@w zcd@p(Vbht#+2&7zl}?dx$hQ^)_$5VnCsc2FXk$W*qB%S8a(O1A>1rPmrgyNW{VUqm z`uDY=r{idD=sSmYcPZ?Tl@T)!4x;}yA;iR~IIPAPfRTg??R_KI@3`1e7@`n{Zgsw9PmMlUFR4psFH z6bKvZ?B+KniN_|5DQ&5egwEUdRB|DZtMj8+D5M`2DSFL7N{SXb=eFoGQf?sF2v5)> zA0WJ53Hve;JM_Ffs>0WxSkURDYYRSSx&hnWA(q~l(`@^_yKR$$Uy@OVvwkzqR`5g?H}Bp0kMevhch}}p!+K5TPx27LctrXc513`~ zIP5Va&Bje`u&JJAqR3M#SewixY0<(QG(v-)>mP!-NAvFFVAj6Pz^-ZiIqTz30ue8N zp*LQiBWl~SMQ<*-CLex89vjdPLvB-|^t*H@??=OI0uQG0t1G|!iNe308+-Y>&w^~? z)xp|O;y%0|(7Ya$p^4XKii&_qBs`AFPhsvKG4fcukF$@W9qTB%9Q>7QkRjVgdZbo z5f$(vl{X5blCVCH`3-A+D-8xl9_ILnXX?dV;h&r2J()?3Zk%0tFeFi?NB0Bz%cDdk9wHk-M(*Vy%sSX$a`R^Qf zvU&OsxZBP`*+I+cuQ1OrA@p9qt=dWX(R`)a{rf~5CMF}faw9o1xJBv(5#(-j4*LUq zi>Eq%XK>>6nc5O%#B_Cm*fc)bC#;*R9X}UC2Ej^lOirq#LwC+@1VO25CW{`_>?7OG zMwlELS)A8KQ9%t{g+#%i=zOhi)-E>D$XDl8Bt=<2t3i`SB4Vm4hsCgY%Iu&%|0%IL zSSWcPbWMU;=m>{lT;t(|aHFj7csNV-ilTjgC&8Iy0mc=+*sOM(u`G})P)<{-wPty!qg-eb41 zY^6rIHqWXNA8LYNJ9C7|dz=m|x}49tQ82UO6j4dXGi~=2c=lCi4DR)ttjX63ZN1K$ zJ9|5a@3GOcj<2O1E6FUM97D?K*7c_Ca(L*Cb$@DCNj;3r4?$Cg&^ny;xco}W>9qIC zV=H)&)6zHJ*#az=P_an8CbV1TESz1Z?6PYelM5qaXKG`gVNkiU&sWU&qFkx5J+h6RYd6jb^*vBde#xgEVWX=Pp)Jp${d=OS z4ogj8a-*cRJ;mz$7xunig-Y}hS>1*7=W#}M)AZle@#Ci~hSi#e*N*9mUO!Y;asJ=k z0SSZ96PZpvE=paQUz)A;^z{|Re2bTxvKu+8ae z_=p1gIDBuL5(}hd;QT|{ao%OJkF*$zP{=&ZC7~2tCDGDDqT@m1qn-g#ZYmdqEBSh_DmeqLi`U=0(>hHQh4+BS(g8(uX z|I9;ieiVkdOjGf9pGXK$Vu|&%Ka`RS0A_u(WLoKavBl@ln1E4tk6o)Y>A_708fCB7 zPD=sW6U5UOmX+5y%E^O52a3YtyK*ALaUFa(6Eol47Cd^mGt6f<9xK46WhUdLs-JGR{M#jxbYYVoN&QBmi3AJCjDVJh_oyr>*~CR$;0;0yRlfCmeC+P3G2$!UoqXS zU3^TlfG^Qsn5<7`InlB!s-*m^q`ud~ieK;R6NuSAVnK>U{=IP=%i6I8K8c+kgG-so?Nl6g$ zeI-82XS#Ghr+h+Q?&ufsL9Xr9Lr1j`Ni%rx)BQ_gr`p#A8NZO2pR=4XY1MofG*V-A zV$Nq{VVKP_fspdL`q$YB$kck|Z}gYXd#$XFe(uv9zaFJEmm3JpbD`u4ZKUTQ1f8TU z>hkVPvEESd$gq!p$y5;bSQ$BX92i}`Y;@2Mv)bQ|R4_Yw1xHe>^+1pgz+Z^Q3;unT zeft)VM8LUFE87?o6_rqoW1^jti$$_?vNV&01BL>AqLePAlfclQ;0Q~@`Xo#NY^NTZ zRXsJ1=o-dyV_A}D*yv|Hk(BJ!Zw6vQA2VA?qY|pQ%S3A8i0d5nQ2PCL{NlP5gUQ|u z+HSqDYk5|@ofQJB+nTM}M=_cV@P5OX%7%A<>&@V@J*U$np*miy$y~M)fJy!yO#1a4 z1s;XbpU7T+jJnS8UZ=()TB8sop2BUJ&6=^)Pfwws&R*Ax8-(Xf9$c%sigIAGNGHP~ z+Pw|xV&mdc=e3(-fN0z(UG;`siOm+TpH-5;pY+z(d!PL(>Al`vM0e?8r-LeCOA`D%OgHANQ7hna~AhW?qc z;m{ntxY|e^N9{5R2l4sx;aVT1GQ1|0K4Go#a8RuT2EXqOIC+0j*=U)|u+H_fP*I!= z);~Hr=fWZk?}7|RlJTjf1K?_maxl)d%HY9fg22MQdf*+(}}cV~6A- zA|LTo&2U@OVJkj6$Nkl#>GA|#YC=s|W@Y9ls~ShNbxf@-J?4)-+6Exmc@8rn=tiE& znrjg=NO#^{%gIkCN%_;6`9QwU0_@Q|_>4iK;ULwA{?W0CZH?73j`>CJ7cJHciK!Y$ z;^s7>Z{jJMG8=iwiLRNnanYnFT!XBC*GiL(^@|374vEBk2`6rE*mC8tEdTLBqgO=* zi9~Ccb)B3vByUV3yk|3r%=t%`H4ex1uSB~2)2^+~Vl$zCY)kUUyVUPB1;J(amr)pu zA7GJWYVWmYM5^K>pV&J?#RDJAi1Ub4N4PnmFc{!P=0U3NwT6NCHkb{Y-EABbmK~P6 zEh&XXFLwiZA9fVyWX3B15e2GWWq>~%mnF(LnQ*6tGQ+ZGpYeU|h3F(jeqq%SqlL|{ z4NO8SFwp~rEKUgQcU@JaudyYmL{wfxZp0JmIXc}}qGf6_j2IqN#vu?DZ3*js ziivI>t-joN1e{x{@$24UK^MbUWG#*k$G8kq0mwdlE_qt%ml=-P^EpmW z{YNZUBr&+dEiL}%4g(9&*iF%4MnRNF}ihA?-{8t0L3 zEEarBs14K|sh8lNcy+4EY8fcG^?AsGS~#+lnfTbUG$Cg^F1i2Mzh+VaF@KZ3>ojD4NfLLXA}T8qblx6{qFnrw z$DiUc*&Qe1uB#BbPX{bP-ZZ5*8>JWhtCZ-?y z2d&*LJH{oHbE@(N~FC_!vm?utiw|b ziH`u=8vkbw`sy1G(&OnOa*MrmKHo%>dh#-#>m{fC(}1ag0-jM)z{Owu$vu&koaq{v zA}mGgGP7B`e-ino_iC*^I)u%V-S1|{nI9?_-{7K@QuQibdqVCMIz6hr>GU8NqQ6^k z&`HnbqF|(?L$@`q-9@3=Kex>;Vvx@Yu2>GtW&uOx(l0F%urxyB{0x1Q3?J~y^hL6} z+fKJK*IczMEZDegmGBL##M2_8*=QX4w-rYEN9`zib=ZWmvbZ(-zpa+d(JZf)#`?mF z_&Py!#4Ocz>dLu~cx`6sD*S|1b`Y)JFV*>f+0ooIm$vA>US+f{RdQUMz3_gyuDFrW zhsg!k&C_Qx$S!pCzS{JqlzX10_jf?3*BTit62xvO{*i!=%D$OSy92u05vVD$%U2_* zgJ{3!!eM;&s1^NzpTw&0Q-{+h#4O>)aMOjgXdH#KDNywrB~l)%xWUL~U!7psef=Hh5cw@QoX!9gko-PWiXt|9wVW*0l9apB++fUP-wwH#rD>UFm~0`K z36b?iQW!)#1|o)r=K8|{y~+F%4-^$=rNThcxhxftvmsPYN3R=I7&TwtPtcdfczcaS z_rXEqX`UjOLfhb!(5DMZx_?l^b6&mI;kiWe#dCawQ-wdp6%|bR)7peL%lh2I6NqV+`8<;bye$X9o>2i0vjktcZ; z5_F!e*9>ZrCoM86DOF5r9jZG1KRnN)#Nrb@+4A4uN=KQc)}QKmYDYezEJm(oKOHIk z>2$zawYIZ$vS}f&(J386HBY6O^kuokhu&5AnoJYU4L`%r{KUWAuw3&c^@VBoGc`?r zrZC7G092Xe{F!5vqynxZ#^Px8KT-#Os93=4-}-<%N+b{(^!!VzUJ%jug7@oACwf?P zS%CMj%STAG#PGyV6`3XR7pnHf9&CjdXF_z=ZEIW$Y+f`po5-%I&l#tZnPp0BR)ims zYfD|qp8tKrMX#E1MDd?XPShky=E{10g8Ym31n<&+e%Waqo#6c0n4Q;N{D4S}mrkxG z<)IeasUatGe5E~k7#V7`!i)C{&oucpDtAFCol?f_>Z1LP^u-WJZGTBc##X|fyyemI zN_dRFs)og~7@Es<91Yb*y`QapF}*c9_Rp4V1h>8aP4G7~hKM*Da!(gOGL3(@pxn-%8GcvTN7_ zV69PtKz;cQE`>RSQeBQ{QF(u}9^mJGBGSUzf9{s%NkjJm~$uZ#REI!(IU54Nrfn@IM5UMK1;i zWl>7F-pLmLh`q`?Sk_#%soekUejz#2p=2-4|KKXNZwUu4R~EUuaBDH-pmd~o$sk|! z={xcGd-%P#!*d*ppp(0^f0@I8bP9)YsRjRx_8vNF3BrR(!g)OV`NzlIvPJcGp}D1W!6r*91*4a4;A-c#A$PGnxmfr$TMr>=ma zAm*JUcblOs8F2ak$3tI9cI-W9-Ynz#AF`LFGQwE-=xDJvnD#Hm;a4cLvpE1-v#N-k zt%p@-l`wF%HeCc{R@ zJTX51wmgNzb5;OA?2OD1_Nud)ZyHzm>cCNvk?G27JM-+;ADuP!p7MPKmf&bLY>|X4 zcPsg70Ju$_)7l`XSub8kE3?gPol*k3Q8}ulAwvj-=WlBMl_*KG_ILNDLse3^=ipC;) zr+Ix)d9#J6j_u`sKReWBnzN(0#Ndmo91zUrNrw?}+ReQzQ+cuFygnigaC#-Uq8FQ7 zjE2n(SmZB3;ci;98GFk;{XiH6k5gBU2KbZDzp`d!Vbtp9zrxrPHpWZ(0f!1QR;cRO zflA!_`$vwF5P>07+Yq>_nBw1SiCYx zl+3II7DjRp#W$ZrAXCay$%$B!(! zH4I6qwth1;mX6(|=CaG(;kDg1yGtEVp9|MCdw@u4GGKtF`(1n7QhA5#qcW|R`wDI8 zgysLeyn?^$F~)rxN;CJa8M%)6TaccPv#gVwq-pSd0ctk|Ll4p^n|@TnMZ) zw~&z8wLQhcW0kj2oRt9KyJo?Em1PhA2t*JI?<$t~nfdxPhi;e*ZjOUeZ%!!9HahS3 zj~{Oyt;C^q!w75NZ`Sb@^zsoT_SH06!{aX6qAkPtdKHWY;+b!R*%$)mPS2%0tX4`{ z99~xTRoSlD8LSOgVXl<+w8q-i`!P#_4HgS8xFxw}GtqKz)oZnEDU7q_NYTren_{?uHDK#(mgLtsG&(pQ3x)=pJ(Rvt z4<9r2?*9CGwAb!G`J0uH3ojpF6?~6CyHq%cpU0ciIVV{yq1X%nt!!i~f+~&ky)csw z6SLP3&^HF5mbRfs-sR=N5U0%)2cr%&S8K_*@5xNpOcMa;%L2-SU+lCcD#X9G>IguE z0&7z*pf=E=is;p|5K7+$-X6!J$vDi|dx5up(my_Z&);5u3||RXtv36aQl{26(@JMZ zdEG2K__EyJ`*K-go;*%4&@h$iaeqQo5Bm;-HSbnbTbrn6DAOcced>h1>-GY3Jwumj z{KLGJz7oN{{i9iU2BqSGv}VOPRGBd`%6^w|U`6g|u+3xEuJPzlORd6_lreu{(&)w} z;k#j#PRaxmeF@)o)EdQJS;BC&*!pW?r=lu zY-qq>WhOSIx0_WEQlj>I&h?FTkzQ>ayY^UmWT@woanBdW+2K24FPl9D%so8OXl{9+*T(M}V6ExB6ZKK(~prMj%NA{S~_ zlckL2sbjQB!Xv(E0xr2)WxB}3F9GhoHo$5dXmUj!D2-YH_w$@blUmsOxF$PWm6mXxJNh@4xL3uS@tdtX@3lItN zjavUWEa7|9?2rvz#@syX=hx`APhF(E=AXrhgC3H0fjE@Rdw+@o*i1Ve*XZ`r7l5eM zjpl~H2~Q;3}W#$_VUyrMGb?2oi?S)gcv|d74r$ye1b!eyRU) za>LQ@N98(!aNJhs;E0KGgIVoo9RiFb8)HQ!@d6*X22<*6rnAdF;t|&huXOG6APrff z$5Iy@afsd_c`3TLu8HR};@sZYEf-%U_?ta={PBC<^TV>yu0P_a!X6VmnPg(Np0JPI z5Ipo7ZZ-mWgsVTtCOra;q9c-%hBY*1IfD&u8apPU5&vG0Uf4s9?+vEA)F0X)dWz zSU);T;oRI3n{mwA$`=%lkApDDff&7{))?=;bx!IA2MuG$r=cvUJO|5SK#vXg1NIq< zm$asf8#O_gC&`84ZzpG7jy68Pe)4;M$s7@Q@jPR?6N=vY-nb*s#TmRE9~(7#460Yv zO?Jg!uP6%q2YLboPqL`~hE|LkuU@@4GoE`*D(I1%niD780W#7d-U3CG1ZLD4HM@S+ zQ0woNk7p=O2rfEI1K?nYVx{k9MsaDl79%3vzMvvO2XnHYG!60X&7(x}{Pt`fv>C(P z4XMJ4go3h-(N!RVUkA=fX()iw39iA2dmD}pCXyN}7w04YLb@7tBC%nM4t7wR?^UkNG}QA<3#?;G{l3l@ zBoY;j^YlpqkDa&jY?wC2#C6tA zwg`1aEh=RWn(RI|UnmV~ zVgKwm38^n+t8e2J_v_mnE=G&vSA}z&8Q#2(;MVRRV`9pX^rL)XU{%<(q0L+pTcX9l zs19Ig9L67oFc)6tug|TERC9v0;;=|LrT9zO*eQKav%aSb>ovLUl!u|VnD*!{Ej7&fLI4D9 zzzp!!bVqsKE{PfN@`}=Uoourfq`9Wlft$9Q5G$2mar$E><6h`JOYyOB8ZoR)wKKaB zMY2cOH#_eA3UG1ExWie&rvphHm(2^P_-Of7?Em(j`EfKRxYw#%<&U44yN`Kz_)ZzB z#^^KXwW8Ok>Jwk8nIpgNCr=uHgvgR%7t|-JSfE)G;?~+G=T%jH*<7cLdC^nzNO5P@ zGJ^{q8!wvS-a!|_=+q2--?SIB=jb29qt2h{yB|t>DU#OY*Ekat=~qB*Y|km3>N6K< zCR*mxg%{%MYypxJD9Uqp!%k!9nLlrAE>5*xba%Bb(ywbU@@sy|5EPR~B5?&m{@D+C z%Ykjs|KSns;X|g;x*uFi4YptE&hP7&>DKPMP(3$_vwZ}g>kW%}Ay2`=HCt!0-t|D~QU{$8Ch)O{&~J5>(EhmYE{S#cr*rTuN*jgOevvgV-j5ng)`f|v z-&7+KBy~u8(bG@)$?K#*dViz<7_XOd6ep~zn)O@k{fzjXJwI6O_obY?G~Jn6xu@DJ zX$Inf5QyMd;^-2Vpy3B?w`T7u2T(c0Zl10(Kwv7+$Juep%c9J&ghWDJ^|53xCL&Er zQh6q9QY-r^T$}#yK;UhhN>za#r*1@Ajha}i2%hc$LXcSVvgj}`J}0JNP>4cAw!Ft< zl^5@!mB$$BSkgsg9=}j)l5s+*4~2^oB=?LtBkr&WS*jNFPp2*)+lN2}Nkfxs?>h}4 z_=jnZ7W1m(Kh-GUxrVC)$^fdcsYoJu#|#FfXDLZ_9nf5}F7m%Z?R6!f{2_(kar&L@ z58OuLs|4@n?@S++wZ9FePfn{(?obra_-)^~Gmth#?%0^3#5`}&s+OLNmb>eAx~=;R z#rWh-IA`QDfIzGZUvCQES$E29-2?PUUsUdrOVk1Y)yVJcneW_Pcj_&=A#!iZ=Pm@n z|L{40UU)`|dfi?3>TTTz81374f;72&{-08v{U*x|pcX%9`o4cB96E4Ri}R49V#Oc? z!doWI;%7%22TW{4ul_;{u&xIB!nm15Q;|wFNK3n z(Hpief+}RC~vplqo!+{n34QjVnMO*wpxu| zdPx=iQ2>rBGQX~tYvotto4YZe%uKw~ON2db*vQ(q^5}!^H{YY-AR7~kJ7o++%7k{v zjMd~%0Gi`Ed%BN4L%#t-)${M#WI#ayl0VV>)ekY*8Zz-@6&{&lY|ekt-W`{`eB9lB zmN=tYt%C~x*2JI)i_^iuCgBh(Z{CMhx{^{#8ZR_^?Eeg*?EXga(m9W^H@R9^|6S|N zwU@{FdI8+%=3Kk3v;5EomBaz`=;h_^S2&P=rQD#x-n<*YZ8awAw}odU^sQM!R_h7_ z6O6>1#ABVXBmn!bSV$FP&ii1%aa>co&n~R3ztH9JH*b@nI5r)K#=@xah!2U2(-e?sbG7MjPw=3g}i+a`_t=KT`e zFTQaN3B?9QZc({j+Io!gvqBOilbW%9U@V1cp5}Uh-{ytHJ9XWhwB5vymuM>h>8=nU zl$(Zr8L573{7qaMNuGS@0Dof?$mKd3*cQDxi*()?lbZ~}6p-NDn0);7{SAv=o#JiG z;j!06jN7?TrSP96qKN7prOz#3McNgbmwoPCHhQeMj*q4Iooj0_O%Q%_y>oMDv_6t& zAbsVmckxkVbiwcD3P4@jdT+CB-&*(q5>^;}t^^rA3cNhV{90|ow6=Jgo^0@C`=G#S zHQD@JKYJ6UM^yegAeBBnC~6>^f!;^17(V=>hdih3zA-h@)?7H>LXtF5>W5Rh%P2{l zA5TEJ=YDK7 z)OwOllyAhOF_63Ylg}AEQHOgw!{<1e?O?%c$C4FJX5UQBtX)0^x3%m=D%-iaJ`puI zQDAR*X5@1ezqq~Ac2hok0VG%+hH=hxF9NYt*+IidbRXT9MQ~~wkn|u6xNqERFZ+JU zM`{N+JH zrjhHPL2y|7ZI0j(Yr2hPAz9nR&&doRu2cYAo)usoN!3u=K!0W-?YEPYr&dL_wfbDV zVWfP1Vc<4TcRIe>d@xARi>)(RsF zwlmxvKF6oak%>Sm@xye!z2-Cmgwd=IpZrzbeiS9U>uUO&y2?(DjtS8fhj}mCt*;W- zAL-MFmC_u#N%wcZ;v%j9o6v9jv`qEmBB!JoG2QNZOsP&3#T9LK81n`G7^lJbeeaQ#P4h~536BV#p^`-I|EesTzzH*fNZk5rV@ zT~K@eayTebXPI(t~S#O+$>7u-U-AN*&S2rX9lp9lY=2qgpielr~IRzj7HMF z$w1EIq~Na)w1-t?rAF=0gRS~SPr$s|gl*bL1t-)M3Y+C(pP$hwp7SkwFZ%$||AM-T zFnl2C#a9*WP`aIro6CZNxL4_FEAAWFzkGnnBru;4j72LGF?JTu3$Bj@vTZWC+tZs! z+~qxT5j`T;&y`b27@sEVLlL3mH;T!e(kJ{ZpP7YA=Q;>06jfV*ye*nT+;x+CYsym| zs{$3B8{B(uF2Anw4%V7yc(^XkX&;as>;Mn~S6A8W@z$)DyiU;p18Sgl)oW=L;odWd z%^Li4Z`s6=@I>W`CL2*XZeKD>+zt)&Wv?DB9>=t0lbgyVRPC40(qBeZ>Di}zuSzI^Md%`*AI%}H_?LK&`q=CEIWUEiF zSlO2!H+cS}m;%f#=%n;i*t3Rld)ln+e51sr5lA|m^IA)DtGP|=4lz28mZ8{-Q^yV1repypzv1ulkIuEogC$(&cYLd7SSfy zmvn5K6Z=Uoe1Uf-1iM>{ZEcgeas=}QOQPjx@R*_THe}0^#iq8d)w|OU(c4a zm!GW(_}%P9`u)CM*4KpTshsJL?C3`c8@>e6;f3=Kk7Bd+Mc)d0AB}6f@c*Xn{zST* z$o^X}r~A{_wr6%HwJR$miHZaPy~cOd*+{R22%mRe{7{o1GNv z^1aA$_W1>AVuKY*Q~YFcxA-H>piSdWZ(wimWr_p6Y7CTZMv`DOL#9B_9D8w(-8D(^ zxmd@0Vr3M)CnF9oaG+j*QiW^vG39*4Zgxi~h-}t*r(cx2|HQuDnrRW#<6?tHG7IYk zp_!ntjk$mLSU@G=y%{9*q1~19!P=|JPt$JUS=M%@*Wz*}$b=874u*2O>;n0kfL!Y? z_5M!i;i#)2Qy9PfaVr0U45d#lB~li8_ls-ATT3K^J2+|Qm*`vvm<|IEc=$NIum$YP zX8}mHvBYsPx@9SD!2Cleb}dI*HzbpkN6a7m=Bl;XZ>AE0kvFuzu&i;F+ipzCwXr4I z^rA}>5w7kbcT+363XvDO?D)RWFUTz9yyuvNX74Ym`Zb|Mi>d8yTzO@Y_ zQ1H|h!$FUhUz|B?iq|yqh2JMfjOB8cBB)u_KnBCsY`W!-s50MNQwoV9Oj5)|83NUh zP)ZT&GMz&K%^c8A`Ou_9Ls*i`3|D zz)EkYixTn*$x#@_lcfrH62{rwVy-n#n2>1~x9<#jQ+BPb4Sjf-{qbo-BmDy=P-~NMwgc=D!T|CVeL3a7#q3JXn^45$Hk+sE|)1qO-uV;q|)L{O=y#R&hN<@9+J5u(Nh@!EFdRTJaP9a$T` zH=s!2Ok{lt;G@j9jMCDxFazeP9CO?<*)x~9m;Mz`OOr(ohb3#x%Au;?a9hW^`!iw> z1z?Hj*NW%~;YyMehs20yk1ESRSpf?w6QUi*fiAz`mYYuc@R7pfQ3Klf9>#HFtMUB8QC3w z6nE_70^|&CnCDcP_MCH0uSRC{RS_I3hP_rrgdn5(O8n&8kJmQpi+1eg^`i>3_0EBX zc&a@z=0Fa7NU%G2FC87G`|1Yu!h9dKzT@oa9Pa9ii*o1K3M#u;xVM1e;=Uq(jlK>t zquz^;5Y-Zr%t znKm1RIidW#eFPl_E4;Us#i`kauc6v6BF*|@3>IRRnh1CYSCutR2JHI#U#B@sarcnk zA@vK7g}smjJ^!LJvKMy$SIi@0x-sCf8&$-$i%WOs@Yq(&z{=M^o93twn++XIqLSGY zu86i61_hV+ zf_sfMF-6GlqY@#DARPccyO}lT<}`<1cM|&SY12wr5ffbqed^nQYj?s_yRWJ>jwdv? z$fX@7bL3K~S9p`FxJl%imG|xgBLC-7jlN4gssy_ccq-zyBcm>Q+!X>55LOZ-I6}sc z4l9%z&cLpB;GW!>*tC08?i5$x_`VQQtx5Euy?@vSo<&Z8@ut+>pDq7+B8F^6&T|Yy zysV_o0_1T|gV@wzB3)f~nGi;Vn&!@MmSnYe6;^ysWYX^_Oa;}~iC0r21kq0?*e&eS z&gWhtAMcsBuB^&W294}e!jp8oe)RCR1zOulihN>RrCQ}%&8+I}|F{VXW(8Na-_&?= z4)z;gbezYk^2Ld9^anl8)|Dx1QzX&|EpqvO{`^x-)kY%i+`B9WxmUmQ6KqY+SOz^9 za*g56fR}Nh`Nd4~m3P_e*<)MXA|CT?eVrE1S|gE1)A1F2s@FL+`W!F1!|{zYP5&fe zq0>kGTlH=0q=ek=Y(Xx*9M3!#!__E6Iewz4!?mT~8Y!%{u*zS6kUwcDwC=f>9U7ex z4M0l;U{^0bQG);F@dYeDs-xTy?px`qrbznLiUSEWvGI*_9bixNF25GXA)}-Cj zGJz<0j~!Q;VJIYRH?C0_aKkQN*h)=5$gqrF)D$K3Q%Gcc>@AEvwBfGO&BfBHNQPBs z{?)kE{i1HqrH{Cxb?W8hW!M0v7gpDk*1}H*hoB=<+uh`O@7C*|ArvFbe7ig*-w~Og zlNcstE=e8+Q6&&EWfY$Gw^ljkUO2#5LME6YlEW1^$644xjEufMs>%h21Jn~jo4K*d zBN+z4&++;#@v;+Yv7cXJbi96jn3yx35=P@Wf;tJIdD{A}+neVVXQ=saVy@<4I@YPX+-`7Ggi<;sDQ2|v@awT8p@_qg?DR6Rs zFLzdtn7yQ3N|}wqY9s16A?$t+4ERq!3g6;x*q^!2?{F>Y(MQve1E& z-W7k*Y|W#&U(^=mp0b?-cw0+}AAGOQ&vcBjQQ`Cx&ZZwr&gBEiy*8_SJvVVyB3lfT zg{mxJ7&X@}gp)5)Wg5y+eJCEX{%HUAy8s%^BwJ2V_JByOkTuQt8fQA|rA%cXj?OMZ z5B#nRFX8xC3Njl9Z7Y2@r8-!r`wvo;8}SaYVEpB{NB;3ndYDi{LvN6k|T`=;`vVqGvbxJk=e(Egnl;LO=M$2k-(HjOi z0+7j*KG+#S9IfGv z!2vs%;-c{WG6XrjXD^T`j<<3n;39DTiyOkM7tK$Rgo~roiu}l*-fxwIjj1xfPrwev(MEb(x~7@Ye*9D(tzT@^d;;&ma?U2b z8qpE+(4i-1aBbvySTS+F#%WZCfV`sJWgbng+ObCOXJwa8a;Rxfgu@r|qvlY(mw2SS z^?L|Z3g5TXLCD<4{v06bayJ5Dc3W(E-Flso$IbUpXC(#fKznx19o~)8A*d7+ppbE3 zX&-+>0}W(eksm+mr4t;zg(8=XpGWojEV|gsuFT-Bf}yI4Epb8fpYdCEp6iPIxTc$F zMO>2vWo%tKb++ba`n{QKiTGI_W zlJzVILCnJAwd9Wm)j&MSV3@?^V6Yi#<5ztcboLB7pNO@RtAkTC1leG}Fa9;eX!)n0 ztPjm#O)TVd?|X$@miOo>g^)*9H{#hxJtd>xOnls!B$*&8d2^+L{3!ZPWVlR4K)TMk z#$byS0!RHJ=?1V7v-9aqhSUG3BVYuYo7*)e{R4mU-J7hPkKeZHIJ$3^eO}{o!|gkYO|4*iHXXlsM2Poao&Ljvy7Nv_gs_`l@3^>v2j#MWAkWkSXwf3;#=c zq%dmlyug1v!Sayi-YH_PBu?V-xOPhxLumGI#t&Bv-#O`&_))OQMZ|jnWE511E_KAN zQJI_1{U0px&%wGxySKEE!MPsZg-1K42Fm)91?Ixetw-hfit2YRTivsv5-^R>^FJwY z{+&wgu8Zt*!a0Y3ilZ_61Nb=;kPYwsfFi>Fwp{k3_O(ujf56s}0A_A<>M8Z{4{SZ+ zFBZ|N^6eZ6AKOX1ZlnlP?d!$scW%X46fx|os9Xeoo)XAdo7YTtHA{KWc(yI0! zoYzB%Y7;U2DgtO;k=pJ~G6Luf4$i;O@wd*&Eq5pW-oxhrNC(bm4RrrZ@&nHJ1M-4{ zp5O?4`NJCg7s~uc0Jqtk!6^TD2<6XxQNg!_##eFk#Jl^~j+g1!8@2R5(ym9MZn>0~ zzc)GW;%SgDNC1|H6o2l2WO6>i2WT8@v^0aiRQLDcNxp+oO9tG<@ZXaBlD7=f&&=xn zznRNlKaJ7NlF}GvF$kVZ^>qu~eUBJ2>Ibo&h^LZyfFF!r>%6ldT*G;HD&8&Yz;a8U zR6YC#foKUS{*OH1z+2`D?c@~dc6XD;bYk$R$G8M{OM7YQd6a2}BpM&i@tuqzVDidK z2NiAM`h`Ou4QST}!amiI!!Thsv~U#Q)eLm$YhAYHK74V zcmnIA)ia$5mmxWBVbO~>GwED@{$iw$FS#rmr`7o5$gJepoVp%s%l^ogzG@rz%tzlC zw7ZdAGY>qkODf{+?oNl1|2>6A0eGx1szmoTmIK1`<~T<6R{*NVKy2uqrFEPM1zyb2 zt19!9j!q#V4!}IRBw`uB^-F3 zC84CeDKxZ&p>m%?#jYC;z{ZKdYZmw?)reLQ!~*dfPSlf2BbCN+7beA(QkH__PNY8l zTi(v|Dx*JrQz<9wrMg)*^aqvNvM07+iL-SCE%ps7@~=F7k67#1+&RxvHw3Z|0YIG~ zzJ;oPbwiJE+Q223>8f_p@b>i}@*nZ(pxi&3)}E!L=e_6$9+K(2X6bT_8_PAhZ#h!w z8v&c*ROdI#iIuU86h2M@;CmU7vlW6eZ}jSSazQUuXBL21L_VGdc-cm5{ema6_I%)L zbmAZ&C9+T3C_MTW<_*mU^0ShK_o z7PnaIxOofxexeYbVINAHBak)wo>OxU5DERjyISaSz*P*>$@G!vD{u6Vx92|(9~Dp; zwY?J_Uz4D~-V*}Hh@ zTYttdldhkQ*UzOd_x*M%Mtm5lpL0~vI1XU>TwnsY&p*6?nc1`V+H0?M-}f)>SnZ+u zf;yD=8dLEtyZeWf)ebw`{J^e8`x_a54IsWad7O0V@EH{^Wlq=wPSpIA?V!|jsxR64 zFd$7;FUOhJ05<%|Tl=l)yainDMf?IVa??Q9<{*f}Yv#4O2V_tA7S(_+G7T8Gc1eJu z>(Ys8LUR*z-qAm(`GP~T4k5@Qd01t5L{hfdoybeHkyaB#!fD)52571~Xj2(rW00}r z2BeoY&ur3jbe`6NBe{V2dJv(^CxHrn%6qm4d^UC?1}G(Xp4>GjG1YaOfR#I~&&k** z(WaIIpp?pqc?_x_gaYXGgg&IQ`yVSntK=v;6RNt~Uv;9s@e z_C4z6gvz-uBxeQ_mGf~j`8F+tmViaJ2$iu%()X)A9&o_Kj*5?x0Gw` zhUjP^Zfn$cyO!{~JpaZty8Jz7OL2x1`muTddj5LsY+WPbWWEYsm9GQ02LFZuCFR{( zd{FfkUqj3o%Ewki^bH)Cxj3VpQ9#+h&5239w7>6l*--T?!0Hw`O{?#_lK~dvb(+CO6)w{bT2BW$n8CU2f@WXQ-K9gnRyEtA* z+T%>ypSEs$%JcLN17AYm6OPV4kDb~h=l7)6p9Q4TEfi#H>D&GFRWR3A8BR~Q|LS!^HhZcCE-uYQK30!!Ip{A_I^M+O|B_(g18V3MD2hyMMysV z6Dmh3XSo&tLet>LTXQH*&ZC!87+a2M8b`wrs;0waOtW$k;FxQAfb)S5{P zjD<;8uGA)JavLLK*+UVnW#Fw@QFy{4WiCvm6^0|B1GA+-Fb0PKtMo_#e{3X z04IsVgp(I*3G(h5Jmf3%m=&vUz5Z-3z}EqvuWjMI72jaY5yeF9{~3_fjNqfO9JP;U!)NuU2)}jbxkfwT68;NU z$zMG*j;yjQ7(F1lwH9*eM&f)~v<1YPCacCe#=A?<$7q~S{ zWqPP_+&9ZodUQ9Yq)&ji>oJ9n>V#<1+xsK$Xbuz~@wMJ*q1Jf7ENduiZF1L<{__`Z zh!7lY0pa}x6<=h4bTmltrmfo>oTa~HSBnt&Nt+9Wl5n*KP-}|^QLESR6e;-_o@1p+!`Bp|lzx%ka9lwRLplYSxh=`E`|x@Sp%Gi=p`T zn3Nic!#Axh9OPPS5ay7n&yEXT`~8|SAuNt=4c4;Um^rVlAS?F=v?$;g019`$aSQh# zV63$#%9x?BXNgV|x&&Lv+NdH!YO;-Lm zu>Uz*V!HH>^bgw5R}4S-3i;^F@-FtQj=VZwC;xzMvcK=FqApcyB4%v)&5-$<8uwH! zgywrPjjxRyxm%+f&c!<S z+QQJ=3yVNNAUlO0s`y>el@#|LDY|JBGqLpMUslFILjj=%bcsDXGg&SKT(BgLbx-(LihO>d?an>-C*9l0kSXk3Sw`(ye~ z9jP}boO^?WS-k$6?jn_=*dOn0$7j#C#J*a(6pN_*p`1jAQ)E929SAGJfj^ymKb5sS zkRp6TP8rni8SX}SwvoByVv;9Oco!EF7{Pp|UQmdSAvX{K>d^&}{+$Wz5>5!uf#t3d zm`2H&FzaVs2@&T97Q!P9ZV}%Ipez140*Fe23^$D=P-8wHWrLTF)+}>z8cC`lDlj*2 zx8wKn^I(#)BT6O~ZGWvC%*^@j)dPPX-YE-IHBk^4(;UlN`}6qbg4gL!I!DsUa!9ct zE3szd@*C-bjjWI<2)Lg&pCD=LbX->h=498l=MkqmQk6LBk|;KK7dg}WA+>b1d9jh!*aUfshGTBzx& zM)s)>M4sCOiWqs5ufxnNw=Qj1=NZq0KJkgp2NACj=WL_Nv+nL)JLr4L^6z_kQ;^m2 z5O%VVF=vCMF|-(^6TF1T)#_NV%ZW|>c*C9Eo#saI=V898`CU~jy0(6IvXbwTX>Yix zqCCzP$kSX~R&`=_1B$Q<2^s@XDI2%e>dgzPl~D(424RU4V4k3rbW6a5j&Lbllv%l+ zIWFYG6!VxAFFcQ1Pfq3KP@aa0#%T=K2haN^UVDQP)aO9nbSQXUqp2oJZ^L^Y$((S_ z?BvTU^O5cc$Z|c{De-H2&EmI9^IJXRDw(=8&v z2Ehl{ttPKp{=CH(#AX49!`LW$s5KOsxf8z$SI$q#;DK#4G;tou06pj}Xh-dvQ&#AxoQ*R;dcTleYD#nt?cfI-lcpet!{l z(4!zhOhMA^xBt8X%$gj#8g;ds)Ql0{s;_;0{pcDX$+7~SmHNDWa=x%`Ew>Uaox;Tj z3!lw>_f&oyS?4Cqrm0yYrA&&?3`mHgC;bA&9*lht49GCYrXH(E(MMFgfoZyZ6?*hS z_1XG{k(z(SGRbl`P-;>T(n$7?{Onu_(wPRy)hh*07;|++3a*CJ;JZ!8y4{q0eu^{+ zdM@>r7rL-6ikDhMZ+>Wc1U(W#Bot~Hqy>V^D!yCP23&jqOknv?8*0d_y3=;z=2j9E zYc4&Se?Q-SY`Mxj|M?U;E`6Uhvxr@78FOH02|ItSk+mJaRTX>)+s9hdqv%93=DwJR zX{HVR6<`=IZ1c!K&)H1s8@XtpxQ{wWAe&^3)x41UV(T=MM3xzDd8m3Z& zy$_;Wca@l2A&+|}B!6YDMMe!Om`g}S)GM*rqHNrb)p6?RZmfKlh+;+#$~{WXRIbl; zieyw7Nq*Rti6`~=rS2ztK4|a)Y?x|f=}*Ujt|)qR8sN~=W7Lz!*$u-UB`e*3fVFAL zQ#b?lH+!?YD??UMMi>KgKkrEnVJYvo5$Q>O+UGbRvST1;8lP~p>Xxi?gi+!IkM2HX zCER^`U11vih~fzxr`T8BB$k@`!C!jaq(6i*iBg@bNQB#n+R%TMsV*0TImYtXjI2)g z;n`;nHlN71PsZ67bm8JRzNJUpBH|=+;L5HBauVAa3ijihV`IG!5w0H-89y2D_TkhN z{v&bEl1+7mvo?*=XZ*An8Rn$a7#)EyLn`HTo*Q`WF@w2ucU|mlp|!9J+`33hNA?jp z@oo3ci!qa=VdR{)kr%8k)xFz+ORL!p3l~3fDVyG`wyvsmNRa>%t);2?kLY!qN2MPg z6fa>v;abuGLy_9EKt57`EO6+sFf4>MZTseP&+*7;E!>Q49JfzoWFAZVh#lYeQ;-wH zv1__@v0$G-!4YCIb zHA4}#a^%hk`wr<9S1*4y<%I^U@a(%knoN`VD@)g7i#?|6{qcR#FAvX1Q-_k>s1eTW zJM?zL;|jz+jM&TN*uy{Mv7t46NFy)`tdPv#E5vUfe?R&C$u`$x0ZL9CJRm zK{%070E2~|Ce&!3x2L72h5x=q{>dVb3V|ufjY9L+D`=^v)hwnGV7Ssxkar+o;ju$oM zW}A!d+oC}ImfVb{&e+#_ctrC5${E!86+l;ubpNrepRiF|@XEcqp*8F-oHD(C%c!wup#s4uPw1}7q z)RwqSN7RR^oO8pB_j1pubMn#|eWx84aJI;4)G&(4&|ut4Oh-3XG-$(nJ&Dm?K$6|pObK&OJ~n()fJ%$okX=C>zMK0E{I&M>E-FlWp=WwI=~`dpUv4X+ zw=innr8m))d_yA&A?z4`5(gJ^ahLxW(1d_49UwXk={MdNU5zn3BgXt#lY5UW|DT+s ze=w8&^M5oVg^D4Iw)U}C zfB8LN1alAjf5Fq9;h;55U%Y#nuNIGd0_G$k6b(#Q<5lSt;MfCJ{bNS|ttR;gH241q z#QhS^Bi-YZQO?(-2W4rF^PWEt)wb=aY9pYB7~w$!H~{hZ8vhr914_?OQ#hO4c(*bI z<$vCtfB*dKxu-rLUZ1+bYXHMPk~YclH4uoWB~W{d0tb+SSWcr|PTNP8Rdn2_0m>DM)+hi;P)WvnzuO~# zLWb)E*fUEp2En1v-}*N*;l6!f$O|gZB^e^72WYEaz^9I-?ol=dvesUR9C2%=VMmxV zv{QPh~HkAzLw7Ka=5xRW|GVVB$kn}>?WN+VYrx`li$gX^}8c8;dyn$FwQs` z2>j3pkTlO4m1ptIR9Bxn&LpROURZb2fmQwh5LS<-x3?A9-6P{u^?%gE>zxCJK|BId zf4a>(g#h-m@3u+Uuf`xh0e}X7_@|tRMi<&gna!Z}9=ckg-0ONcW-`upOPQ5($~OG$ z;&caHi|l~ICep#segu`SyHUmzGr)4WOdoA=GG2VM^M~V~A5tZG+Iex)c|YLcG*V$c zcZtM7WFz%)a*KDThSGc_HxzAZ!LpPspWzRGHC}8Kz>M|@HWVTY*3~jZ=`sZ7 zeFwj>eOwf+-0Nhti*j`1FzR_UqFm_QIKaAl`>rl#2FVK_U1BUFQg{e9%!^W0_{94H zk)tBR*xnh3$^FF^@NYe zztjWPB-*X!1c}gTDn9;$F6jzU*rLtK8L4MLk&zzU=OH#Bx&4!sB&pH2fRQ9^OqqAW5h_F7LjCcaXr9dOh*e-HNSI3DRv#Y12^_W z+>`zvESd7MT5iZ;9$bkI{9f)A(%MPfI|T;ccp+_?cGPEA`GtrA72X?V+}b~_Bzr(b z)dA|`nbCH_p`Nn&n%rwvqk7{AoEPdTi@)Sw9AkLZKYxMco&1c>TlWOR2m1j;_TY2N z#5)Y-_p%ImI`z|0JxAD>GeQB6n8JAM*8j3Ni5x`3m;ppAhh4W$XWwT(T~N8LQDQmJ zgfbf_dRx6~Hw1|Oo<1^}y@_5OYKP#B%uji2Lp}m1k-aS9UX)N#YOc6Ba70m*?OKg{ zW$_%i93#{Mq3?Ppt%6_yZU41S{^Qp*;b+Ake*$9IK$*D;F$jL)imdJqVA3y#H%6D? zr$8HK^u$duSGugUame2S>?*>KkhT+8FQ-I`>iu!|v9?cn>`9(PHzM+b>x_oj>AtU< z>U<3TrnjFBtO@nxg)hWwYka(;ovW~srGh+{<#Dncp9l-$?vMEMNh=Pc$}33;qAVDp zks^gv4dhYbK3K;M4bk0C=yK8k+Og(#Ox762c6`Un3;0#IkCXqVLHZOG9v7md_#Q|r zWJ*T@P|uVa?+iJLvDhdNc>&yl+U2Y5VH)>M)Kzu7vGh0$$9>Xn>u5+QeOd}Ff^;$= z6gyg-uiWeIFniuuW)KUxFHxRS;iSMM>`icUL}b_3o7&J|Sfw@aV>&SN!=N3^5RVEZ z*&)F4PrSK4hy*UFztxIJ@4CCqW4$PQ?e406kyk!F&`G5_lHfA!^ryHjC_oGDBdO=c zq2nMzM(2wwcxFWmfj-79>vpESbs3YPpZ|Qf1+z6ia$pOXx3oW0Q6Z7MQU=R)eEWgi z2#tM7yygM1KgBT_gI1Mo)WBEoG`fnRJH(CifUe$neQ~_Vz!&~O{Iy+`e_`FtjW&W; zs<^2;S@%M)8t6*){LL9oo2#xI0C|aL)SanA{@vqOz6`dKu(!{O`%(=#+MWNsul!Gg zwL7?IU%6gYS%Rxq@^-Y8cZvHWMD!{#E}&TW0!9Ru$qPE{tM}YRZgBiPQf`v}g;C)J zXdtOx?2jToUmXtYq4m5@!3j85ukb<*Xgjh7;=AInuRcE~w2qnYeecbyhbUzhFkpVp z24YeFFLq~qXg9PZN)zuZA5SV-E8u6QXw~W!_FoI{KYtZULW`OELQ90N9$q>wbU4Rl zAS`zE4SLpx4tQ4D$DUn1ybnmh?Rl6`ltOj&`Gu^2<9FIDLPM?|-aELSfnJn%sKsb8 zKvhCCbGx|UiUWldU;^u|$KwK#BB>u@Ld-A#Z&1dLF!w4agn^`AF{}o;_bPI`{eAtY zb}vEKrJ4uBC-pjUpY%oE;6HqWf8U%Ag5P`-t}7LIr`hXMYcQ((Z4guInc}9L?2W@a zs)ea?22J2C^!@`6goQ#GPLp^1OxPW^yEnI&w6~{SlABi8*iEFJ`fQBt9qLY#94M|` zzb$kP1OL-C%xC}n@#i!qzHj!?85_@kzk+^Ki1;;Yx`%kQSA6i35RyiyJ9VAEJ`neR z9PzJ%doqaYZdQ0K!JG<`ruLahn7*#aM%-@u&u{+MNu=Do-%gK-gj*u2~mufkBD#@+~5veof{djKpvc9Zed zQnremK@zLMJNu;lqDsE4b`E0??SfmiE=O>Bg&&Is`aaQFlEx1ODpI`l7qr@A&N&oB zpGGqEvHI?W0^#t)u!_!B{tV!7bjB{hUX;q{^l=cJuuPgPKJa}jp3;v9^(TFoiqKbs z`c)Hk4oDXbiB*$#nHi8$&d8+NEN(;&N9pIPJZ)19Oen&}P>TIj~h*h4~bQ%ve@1ENS!MZAAfe7`@ zcq>`C?k{-c79dzucwJ!5Ssmj@#J0D~5w6SFkKW&uTV^b%(ZBW7 zHiTD4`;y~B|1Z#fMoYVAX-fL-A!D%EYt`wSBcHs`qIE!L%%OX)-VIlJP^eFAV>FtI zxKUfDG#tTF0-}XDvd4_PN_NvHy8*?_;O4JroNt24>*2)A1w2CS;jl?oaQi1AT#O|r zCK|g)dlstUEYlOyz>!wc;aAgvL>Tx#i7^+sBObB*eDTL~ew&aaQrrdnv@U!oB|U`zFW-df@b_?SkExrG|d!yaYaFub~1|QK|WpfJ>1J*unM) zEr-gy&NqWZI<9l;AI9RMe%h@Mbufkhv3nm#Y6{Hz%5b0ZjDmpFvhzqRNfJ#wD}#;= zxIII6gn|J@>0YJ;6p5d1BvF?e)qL^*VL4C}ZSom+kj?@+TAWg4 zuHIw|UkRz8pAq~@{YT!#eRA%C9Ebx?o5(L_t8FF(&(~z^fxNWpoKxH5`;h!E0-u00 zp);TcR|0K=Os1p2lNlephT15wblI-VbOYJNSQWa**Ex`9+Rh|6Y)_7nfyPV@7Q-y{ z73PYF%;jv4%L`_~yu3n~7}Abu3$zfT(Ev8#L@sL?(VEq9O#nb`+S;fGY>pX_7^QFi z0UiVvU{n%$rOiZW2YZc3?%Gqm*#>4chrPTz6`Q5jS-;E+YL~amTZ2fdHzZ~V7<}4t z4f;wzLK7ShRVK~=mFM5qL)^$bmsbg;_jcPUzm)AeSO(C>4FpNK;A``qS~uUfz~zWO zn(?ULs@d;lqvcpC=E&+xcb@CruHF&Y0A7_`T~ixCK3!71)0Ar`^SLcoJjrH~BkGlJ zHc{RCgQRCHGk`nR+mjLH?xRrA=gQ@~@kK|Y(Jfn&fPCh?0OHdQV-}NBQ%OL1`rDDHSAitTR5{E&P` zYSbD?w$KS!k>UBdn;(GOdl^huoAa9(l0N|9Cl)OCeTjJA%=7QWd~?5lxDZE z6Z3hDLB<}iP_!W}nf0z*U^7}*wl~~`OQHee^9>mBc4a&jLYsEZDkc(3K{6_r~{@PCNz>UA=u4DlFwoc zZOQ2}SO=VjCqM%wty-bmy`{i;hB8=uj_dh^iMet+2ZOhTcFBJw88s z1DlY8TY&X$DrCRB{=BE`dzI&r-tw$BUN0v3_N4iz?W1==PmKC#dz6N7`?L{Xv;%Bq zKr_Og^DHPnQBP0a@=#_;FApQ(SDTCeAhkekw=E8nZ`vicOzqOtee!Kp(uOwU$0a!L z?FZIZC&%@p>~X%T0K*G5PhT+_$6xjc-Gk|nJk$Mfd+>~pgC~1xqi$QNjQn=xcHKQp zMTg{7q~f{bbX`(Dx0a>nt?24}WL??;u!Atf@Dy>b=H_H3-r7ib7-Q@)gcldX7Dnhz;`PQE^Qj(r5ReC3q zCb#8z(tIK}81_+YYuiz1A4kf?!1#dbE1F9pSG6!~OefBFL5yojdywXyJd~t(owfix zb8KruY+W$VBHvtVLApxNj(Mw$({$1lp`q^Ko-lW$>>;zt9wh&)*Ki%^r?)-ImUf)B zXtgd)-DrY@Pky`TEoCeDA-;CDjTM|#L_kdH64Q^eN~=ss4d0Ku*sF29B~}{RcuOj> zv{bB?%!tk_9lmW;-KpEOmdao~INPtZbQ?>rlsB0}^rpKoZ6#UX+$YC;CYy)NciCx9 ze9m;Nr&sxHusrX}xw|7tugr#K->hlXr;Nmd6{^-%Pj!sI=Ad6UTCqu-3kSW`c9~)b zB^0$^hfXgdg?}ON>Zp4#XLgNzf>mzlwI>fM&xbTq^3QJQjU)#UnjXl`_HEqIo4r3D zO#LiN$4&KM1??TQS*r%R$q@YJXo9=-Gjt6r(9>TLwlK??lyd zc!Sy%+#t+lFP=!=Us`a?3MBGvJZID)|4c3PLGbto-(bF0H8h?e0D~oavuGzL25vep zyNhFRNTEaIz-&!-TX}1l{a9Im&@nKgg8Wt6MOBE=hrXVQydnlPH^Vz8hnwWzJU>U-@J2l-3v4?cZ1}&QLG&5UIP# z`Q@cN7n9?R7PebqDo5 z#k}-UV`Sko_K<4UGN@dB>H6*GQ~+}o9ibzw8E1S=(42scwX)H0fD6p;aE(`dKCX{r zc4BwpgNA^PhL#AR@;fAp*>0Y+Oes{h#@hBAJNt~2m4TgYV|;)s&2BK?E>fmi(5Ci~ zCWv>-Sz@E_8~YiGg5-wGcA!8sJ(l*+HoxrYocZrQok?W!NancM6W?B+9jux6lN@Qq z)`yv8c|793x%aoIYGuyLM?5aSjUXYd*0MNL-^6ytOcMrL?;9_|7=@*00C?;na z1W^wvO+DGeuIG(HMCwX%pW8;)kDf@AP-F9Pe!{Y71F)^3?uV%E13InIqss~^!WZZM z53L)$f@eIAys^3Uj*CsP_UXeVNIQvb=#FP$6VQ?%4(Mn<)9`NsVx}OuS<{xscX+J2 zx?O81unI?tBi?P~Wo9#DHTsxVs_yD<2iplGco7*@14g^%$cTpJQvoG2o$WG#tlV*> zIDT_D79PnDyWaw)9jcmfJa*X{UMWU`0$AFF?ws}{@Ucs?&?uIZ2Vc1?hy!~~JGyU@ zKxbvtW_?1ZzHKiyN!T@>Z*Vzsu`$W@7pI3d$d_Heag%O>x<^S#+Vd#z)Gl%Nu@~Nh zIg#?6=m%zGH+ER6XB+QscC+`{b`g|)raOkWd*Kb`LuXGS^H`3YnNIiUcVF#RThOb@ zYcM=8(Wr2@YKn{UHT6rL3_h=+ueV6#5q@@bp2%1c^?=N#n{`|L&-JkzeMAn)8D*jN z(uY_xX=5Q2BBkaquhWstSMTa1k9mgqcRVs)@)=KAJ_+CENG=_EFJ|pjTEpn7V~Q>J zjI`2aMrUKrg_4h@a+v|@yQ9%1;kI{pYd&5hdvSjdu8vwBd`ALXY|TLU{yOb4i5~qC zBzU~5ZdRGOtX%(D^5U$%g6P3%fh_WoWo!jvPN1O=9#G#F-@vjn|LJ2)1 zWm!g2;`%vGck7o;W8=c2g3c(4&y@F5kG}u46C^w5@6QU>%9yETM9G+ACq}^*!w2$N zhglAg^q?V5Yz6D7jaUKG+$kHmz=`&alhTKLLK?e1ks4oeH-yB_!nA#de#j4Sh36A{ zNG%z-2-wpila)EQ)DbZQ+kKh^wPFh+wPCik8Aw`}h{ghPo)P|CkIN&EA38sW`R}`` z{n#X+-$Ef=0_Bh0D9_xJAi-9&riibX3E6vkr{Uux1Fh*tt}`YBr;58+a{5!RaO<=# zlQI`}UF^pvse(jov_6Pe1rJLPY`m4ftg4F)TUJgcDNR>Rb}J**?0Y6|dKAcre-@3N z`7}L|uQ87!TFYPTl+(Mt5ow>5#@vJ%vw0OCjL)|To0R74y#!x4x zx@e8Fa$GQFza@!h;#_z)YNcYJp`4+pjOq!NHpcdfx0|4IN;hX#UCiorYSmt)H1*ve zFLMo684OEC2kBFSUuV85m)DhOTc~%R(CbOWs2qEXSA5qs4L;RH0`dB&xv(p+BCg|g ztrFjnu(~HGYImD#b_R5L8;o%yAo3&HD)_KdjLUt1KbX9%glE`LE+L%|`srsSXb-2H zRe9$UBiT}AA|3uJS#F{cSxW9oxw-A9>l7G}m*#|52kU&K0DXX^hOi@W%u}76o1HgU zd%}(S`CY3L9ZH=@TU5;5yc-o&>7uOR5tJF!g$SAe5d&UIm39-*2E8mA;`Y;?bJ019 zToyWV&(S5R9YOZbD~xMqNsi*`03p>n*`eJFPh~Ov$j`T^weT9`12G=8ugSXf1$Ke|{UjT(26lRCTklKU>7f|m=+B5qN`Bd^!j&gJT7vs`3#vgxKZxu}bJ?Se9T^d|WUwr!-27PLV|@~DwE znyGU9PR-t=x#p~J{CUy6ve-kO^dqm*2-_a2T9xLq$gb@Q9s!m-i}A92l*a=j5HvnXd~JH`DlIbimEE#;X<;WKx(F?`K8no({QOL6RoK%Q{kOH`(2F3 zwiQzK$+;uP1oajG9Nfa7?-FVE_$9Bq`b&%5@%H8Knw223?gOUy8lr;~4uIR;)l`ze zdVY_yAO+E|_k@T~fhCC+Q}|A}07&0_jvme)d?u7G6v5*k@}f5D4Sy%dOB_wL-QK(3 z%iD)RBuh)T7N6`osH_1q%JaG>6XsT zl6DcDjS|R%Us<0r_aLBN;U@0*QPftHpjELvCcKV+fYb9rWzTTKx}p4%^K9#;i*Yym z_6@JzjZ_H?p~CHng9a7y1SCGqb!jJ@bmoAvU0u#khbA6MnNw~hFlfAx#xlHHuN<~ECb?G<7V5@Ss`I>^ zWZkeksyGj}CN57sE?Fjw#x>t=?M5yprXn8u385-2oG{ijUe^Y%a?C|(SXh%$RY4v= zxlvWBvZnxGGS_GqqSjrWRj1Vrm7wQan?oH z`2NvnugeWLu1%x$jdZO`qqV_ulIf@wFt<(W`u-VsyH<-$?9E3ExeJ_F7ZCkEnz7=o zgpQbSmEW4%`j;1goAH24M4eFW*2sh=^3|8Q!~H3lxE!nVR~m!cu~sCTBG)j6!-eAW zG;V5(u#59sQUxi;b;7Znaj46bv`?G@MAXy1r(3$ahB4M-rqv#8Cn4_)lry8Sp14sK z5cQLJ-trZw&;f2)b?R^^gmUygshds8tqN>Uginp&eAxJrm|cx*1|L(&K!L$(&+GGb zqC4wDCpu0#GO$2m_SQwa?|9h4_~zw&jQP+CX-6G{d-GV_6q0z&ADxB=07=Y7c#`}G z$2huIE8!ERiYoQFx^L&IM(Q(xFoV#5=yjjAJOgU}2lPJC5o^Z)#?LCA52^DREKpqY z_K^`z(X3t`H{bk5d-2<;VKr4}WJ9j^c#>F|m(A~p5#=Fx1xo8iku%F6f(UmTHw-1M1zXrxd zc~{!f?Cn@gD}5h#JmiIG&N;j5Xp||Kbqgo)oi6%i6hUX)U1+7(z2jALYMLLpm1OBG z-o;Rv(7D(nLge<|Dk>>{K3#XZy@44!UUqp3bN_4h+OL!KBh!pDfYX%y^xKOBOf_t* zxEop`>wWA;Mz(nex3w7$X7kP8)cZf@b@h)zSPvY#C9Xp9ddCgX;rSlvSoWy|Sg9i* zf(-HYu+}L?YpBGM&vN6$cec5Y1Wh}@po13oLojtI%DfZdXVImfgObcyIlVoxtaJ3e z%cL`@O)~zJ*;)Ww)ICV|3V!@kO9T=GHSx;v?)U}Y2_Ia68$vn}A z<0NG79R<;0IEzI>otEG3-fr+T;YE!q6*}`op~N)GfcwSxk6M+CF>;t7A|cBa#31S* z0GYn&G4bGh)^%WA_k!DOuGcmtEsoP>Sl>{YzsDO&ub`F zxI^h8^}G`GNM6BrkHeNb5q|>11XO-ZvDe}J6^BscpEZB&IUT-El`IFrNs{8c?Niy2 zDg8D&D?``e;jmv_NBFI`$3Eq0r~x)g{?BG(!8#?mc=^K5bZJMZkcaEHT10*Gw)m?;ql?O~^ zb+7}8j7B6fFJhT}JE60(@{Yg@x9l$t{I z_ahYwgtPigrS|*z)~61&K3y3|B4(9U_wlnxm1I-52l|!?{GDAZZVdSr6+0Y7tSS?8 z?*2ygFCftw(vCIR$$gqW8y^I-W;Bl^OP>Z)T=QHPes=pEtbrwRi9e>c%C;2gjZb-! zUcn_Ih8&1Wq<2r|D+rgLN+(dq8!%${I`&ox7S%mi#DE*wfT4xB+u_tXWa9H~6n$z4em z@b8e;NWbNbVKLrJ`;TLf^OBoiAUN=k#ubwmzQW6B+KQD}UzA2DUKc6r7VF~XICPbd zP!q6Iq)B#eU@;v>tNo%Nt$rWOXo)t`-RGBIn$``=yv;}#2;XE5cxpZ{5;w#YkT=I; zKH#7^^*SF}ftrSE7Esn{I+B1f@5}thn5$QtuH0EOft68y5!+FygtprWz-r9pIrFCc z`BWaocgfS5-UH>5K=T!8wa19KxpV$PWm!;sBSw$=8xIz^IH4@})Y9;-kZ znv(q26`1Gu3V-jFX2*o_`Ic%*S{sB-TQQpFq8^D_oBRKU`|HcUFpw_(t_svEao=8# zOX(|%k|IHWu z8M@w0XEFr1&YiQV_^^M!2}(xD+lzao+4l3Y!|`cxrq*FxitMH@&Hjdj3bovCr^Y>J z*)wYy6Y9DO#Jq;_7C@yxMQLxA{0mwA7ru$cTYrr|lTE#zg=oFD`hA@sM1utT3dppR z8sMp&OENoGeL;#mc42O={GUPY{|nvz#~1w6#P})_*_AwfB~Y6|AViw2cxH?HH}n@A zf+70ayzJ6mro-Q^8sNXOSpXeocqo_%Hut}sm1igQCoaXxv$dyxf9?8hMTYCmsp2g% zD}VbOy7vAN`x&khvxl?qzme#FUrr=?DF44)s?b#DR?@UNgC`mn`GK2g{rBq{;qe3n z9qL0ru86N+2p>x6f;=p5mH7kt-!4*i0UH1=j9K?om81N9!>_zfXF@Ra)B9bkSIr6` z^bjfXC49bW5QgKgvHq{Xd^VkD(ZWS!`BJU3eP1=S^jVUK+;h^uU(B;>o=@I9W9dr; zebbtO1+g*)+U6PtywDgzRoXqrdFMV8Zlc@cmH}l-NH#|?l%htOd+9+npt?bUHu{@U zBM~)max|AMXnQ|CkRbt^vP1O12LZ#&1^B6!v>A=5)wxz0 zvBefEGR5)W@$G(M(ykc=#)FD;kfknj&|tzIcv;ipHOtZ{LZZ2-%y%jl zaCv7x-RSJu1s@*;?ZdkAYCFw745W*}bsN0y?9^55W?RYHUO{pAf;rFkd4SLVj&NZs zt1sv&Wb~BRzVtrjdv#z@pC{srYk!VJ#P6YzOh6m3#CExfOZoxb`D-8Dk0#s=3`BnJ zc*RD3wWh}O-IYvgiG=sP0EsjQMq0kWp?s(;awPN4@&3`YOM%_mKnrO2Wq{U2)B+3z z4vh3F44A6-#LfXRa}@MVGe6xd`PNa=N;{)GdHfGVwI7IrH#U<1<+5NIZn~i2i6?m0 ze>h<&XbudXf&C@ZhTqcZz5Nj1$dyQCgdOP__@dVPN>xSiMX0rP_-q`EE53H;(CKcw}%g&sf8h&3Y3~1$2)R;SPI4}VG z%vjze2rLeV9MX-(3gg*bf{`0Deb~hO&IeZW!F=XVI4z(A&(TON@8#LPRxNNB7zbRt zVp!lk%pU;RZNq*-AcD(%tcz$HEi!-s8+qvu*;>_bF5Qrv?9S$LYC-?g2Fi_ze z1yG%_3_mgg?cR(o_M?5Dp}tRnQ~v2e5#Vf01hCY7Q1~HPba8%K?XILvpH)C1@`bA! zO%y@%Qc1q&>~46NE+8s^ce*3*R_S1_O#db5pEkD{%j=LooTbo)BwkLX;V&qy^2f@s z1$OgefM7ex#ay%d`gF_E!yMR&RDmviU5N+}{RD_T(#A2lX=^!^leeH~uF01-Rje_5 zAl4+&lwcd!ujn~+dtC9XE8g?;KOpVYARQ=X^TQDkgI0jMf1V0V!|i%0-)r-LHsr;i z8*a?!IAEf>JRr8;pD7jDi60H;m?> zY6%kfMueekX}vG=t59a9NPWCq~A{6ZLXYq1t{+vpPqmz+O$v4Ye0^V}~YrF{lJMd7O&S+KXDr35tXH zW^yN~!;VXXyq)D|5iCStR4)G{wJ3U5DHzHc@V36vD)hg&5| zRL*ObK$%J1oT_O+bPBvNnlH{)1bOwOBuh#AO3X$J_278+SFGAUxiH?&aVw6@b=+M6 z)EkE)Q*;La65{674%&`|_g%ja2)FmtFG=QfK^G+rW2WdfHR0AVUPF}G#mVY z(x|XX-8UR?Tpad!`GBTF;BRq2iaxet`ikr{LjcBmkJGL4vHB0YOH`Qtp5J45?nnYE z+71Eeq-YmWaQqGk(;-Z^!V6Qmgo(6lL!UY=hMErF5hx#4*5Gac743uYgC_{kNx%R& z@|bJG=wl9m1JBNSi<0P*dM|0l;XDllwyru`v}I>zevR8AJ(WG$W`^WD6em;DK*fzI z;B+xuCSfJi%Z2mj%&!`*%wO|&TBW@HzR#ts6SPZ^hM5Fm-elU?^FZ0yh4j_q?_nSrhJsKK%jA3p4CG2K0d~-8WMZ4oml3$Ka#T^2KIMzxe z$0ONP<2*4zqx)YBb<{r73Ff=5JF}4M(3-}ZZwhQH$h+-bwQ<;u-lQL=57)$or(jSH5WX z3{4z-8K7i)&p%4~s#)<7ThTAMxIpvG!Id#NTr!dBg4Pl3vg=BXhB$&@RjcG zkpKuW!AF}@*LlkW?_G6Si&USuA_(teU3uC_bhzub5)~@^_ucfGX99?nKR!?U`xFOn z{#l16S?)}-v0W8phlGO&T>8y}e+R(-aaF_U@En<_@$TkT!TU!L*?0PVz3Nf`5Qq-@ z>ukE(ue=&*kTG!ImrF^*He`$S-%k55p;KlS3EHVJ4%eagg~>`AgRb<%fIQjO?pM5s zC>-k_nPU%C1maX;;qPH;@ogM-lVX8$p>Mvp{`;al<6eW%{YSU${os8N)0FUTS2Tfb zji>tjaAFIjpLvRm!YbV10ZyLnP-Q}nPihPaHq z+YB~_Z{j?ZU%_VT^w8)O(0e33=3W7FjB2phbO)pY;$dMW=dxIx`i`*v@veR}^rOdap(y3K7LLo2)282N|&kW6gdRymL+17CDz_AxF5Z zHSpFNzyF?84^|E{NB0wu-YJIOh^$eNTZk$I8r_$m?WrG=W<_Dxd$rac;G%s-ii-BRZ(p>5uSp{-;DplkbI`)>tv*_bLO2`9( zT?^9@u=5*OFOj)yvL5x*H)Pvn_Kv`IEP4$n&AdGdj|{b)*QhyzllWb#UW}E44O;^Q z+Xkn8i4kvESLrf( z-X?f4$43d82O2uxh5}s?I6DWL-%G!4;FX3;^K@YIIX{c2NEzjghl~yNaxL7O_}Ik+ z1G{Gag42x04%vtQ!`^$xQ{DgZ!zC(IWTfnhY%V1!v&hWeyOix18D*zP$X=1XM+nEU zNkv7-JRE!PvNzqYPuHsN)&2YTzVFB5{^xplTyoB5zTdCc^Yt9+1|;R=cwXYh>Qg|t zD1lzZ=E)HfOxk@ZI>!idDJE)%h3?C3Pp4U#walF3!nVT%(yP)uQr4%n21#XQ932!$ z>d6l7uV#vtuP3_9vKgDIl3k+w($3+>59a(uLr_cdLo9R06Gs8msb{1>R(znXdg!DK zy&Bm~rbh6|z=Cg6{Hu6njU1*O4Adwz6o2G1JadNzNTJNRl)=;&KdG!-1AL>d)NTdF zLqyJnlj2T(Uieg=@((>?r@(Zvj*y$ZK;YuCt;#<17t`-g@G8~3e{CkqKDA&5mTwS* z^~P>djxn0Y@T+%Y)|CK>tC1Vnrw#c+e#x>rHLP`}(fUqy{UZBW}s#?J5tDD9sZs%v9n-Om2IX%=jB)wT}9?9m4f9_BUB&L47JUnIFwXR!r|uA7k$e1voj5E?Db_$NVel1#EgtC=>F zYm8Y(?)gzH&nma8@HvN0?`C*WwZSBLhQ489gz=!5T<5sAk4ML2Ts5{j zho|uRb7lovh@S{bEy&G#A7$rtn@A*pe2I&Na96NxzkcMf{dg&c0K>om6~~ypNu5Y=D~z&anj35PvUI z>yM_|CCYjz8gs1wB&`V`N)<>UCxAvc;Nmg$T~V66a3JN!3BdS=wYTEEW}2}X9+G)k)KlrO%R?arO^ zerdKhT^RM$+&sQ&lnG7exx3VRPNyL~E&XxPO}xza+_h+{k0ECj)Y^s5URRd69$ZTz zG@c?e8Yc9WsQSda1+#e(pWZZm%^Eic-NCUS%(q}He{j+3MNE;;PsNQ`A^B}>?ZQ^2 z%O#2l{0Q>FwjL4|RWf~0o#ewZQK)Sj`(on^dPCBAB1`aPZq^$T1 zm;LZT&8>6CKAU+_vd^?OK zR_N<^-jpiNG2K;b^)b<&ttpH;1r$>h(tRuTJ5kS4}Gy zFhIbr>GM0ZT+#L}&oH9|sLKSRV|$7lfAAEL)t85gG4T)y_j5dbPM=UBA#3jY=B_la zCc@dEV%2gSt&(nUT%b5ASU_NKnJfn#!P4?nU~~DIvM1TqaWB9IZFRPyYcAAVADK`44Me{mP>8V6h^&BEnkv3m_eB-splT{B4ty1d#%Pc%rx>n zi=UH@MpnAHO!g~m^5o5pF@Q}b^6z}BPV)%M&rN(Rpbc)XuP;3|#03z~>%&t?Q;fX9 zGMuAU=ShC9e$@lT^4_SPQ|)@*FgPnNmOw;yWR;P@L#zAf#KhS)X*rXKakfQ7F$1Y| zU%k&IepA@rP81T@y%=Zf;UJnFx2?APR<84@nP7QP__j=Lw1$+CM1PsPtNFTrI)2F_ z8HZs3XCG^>Ti>(d^UYt~`qm~oql9$cHcdKkvkhTa`rMj)ns(;urzrdQ7h;z&{xL#d z-^xwzmQU|~gisWXNl)gM=v?-`%OfX^mDL-b$NyC6lS-d|G^IpM*PCc|e4fAV7(LFxbSMfIkPW2-0%;#*Nso?k6-Lx72 zSy~IEsNFp;8N{hxD^dTYF7B#5%m?U;O%t3O)M|6mk*c*#iU9?6U4cc$U7nw-)xQeY zo03T??~`FIY)1SJT*2YBNFd`@j1dB!=joMSeE9$x862?vHE+B@;z$=jrG|!Jx?WHM z*$B?Reu6|Eu0Ld4pRXO-=fC~tk=0&Vyy*T?a5rdaXuz@zQO#qZE$ur*B1Ec*&RV`V zM)#mUw8R_&t+c&3Uw%6Ao1-FS4H2sw4XJYW&?#cV&`iv^>4cSjf#P|}{}_XakgfwL zj~sVEgw{Cu>Ads|5|PUP4RD*nCnv6bq)U7-=~9qrzP!Ta`$f=UFU9^2o4US&u z;p;g=0~Io~+wxRr!FCx)%!(7PLs=cOVoi1={^iErMt8O<%MLi4>#Y^x=66hp|6OJN zZg0eznUzYvBr~}5+)=;}BX!s%WYJ1p>$blU8Wiau!i6ZNoIvXKQphLvvdv`F(;2N9 zXcg_C+HoH5O=Z3d8JIz9UkCaChCqRXMaj2AcO)K%yibG3lb-GMg}L|fNaF@2YxJ~y zs(=)kYQ=+Z28~r9!|0#*lsglW)NIlm+xyp)BYzM6;g7AQ@zzWJ=BFeylU0e6pA+ux zZEx7$XojH;N@mJseSXF};pf?gjwBY$eX*Kg?m7SE_WVn$B0rkiQO22m;0oWfJzCF5D2Pl~a%bvO z(oDt|ia}0P$*epmIGG-8(C9)Vvl#O6BJ^6NopSUd2;f2PMj@mlmy13I^uF;tdnnoj zlO^TysgI=iNzf9?wxta>*KRf2Sivif01J|em3N)bu^ny$=}Fvl`e*3t+Y!izia}-% z!4kOS!3%sqkIosdtH5w*f4#JpIU$@X#AXM&u8-?Hx-^$9#@{on?SSs558;F3;wgI= zuQ$0~)xZCVIU{KRtX(R}V-a*>r`2=+?r|D^&f?}G4sMyUb3a2Me|1kv!h{d=>Vorc zx1LpxC=KyuB$NOlL-5MOPt3=%6NF5n@ZW}k_ff89s~-)S_c$AHR8?8XzmcTjdRRlf9xp>QOlVn3&tPsc9SE;Mxef{*-Q+ zIH97X>BuGI&RT_= zHyZ>V<;ta9JRvjKPvhCC=mDob5QB0YSOI~f2`tLBO)p`j2oqWT-ZG)0DbVdY@;bl0 zo~J)DEXpOWDwGIbId4skOR;+PfdO8f5LYl2KQ_jg{iw=0q9EPaGK}Jg%vd;z?EPwH zne6gol~-vXeXDaO+7cPRoVGHO#(b|$EtFqsXY}-M7NS|H+kq4$gcpgXY1h#*H`17u zw;f-D`@Eo?^yA=t3UN~{(sv(N>Zw$QjiGM8rL3|z1v4Dcqxbewb#J6s!Q(K*G|T#C z6=r&7kTHz58*Au&-+Dm@+B&r~we6kbo)5ed)-26)&fBCyWm{k^^CHR-1yf9gEam46 z^&4$uXi$253=&%YsDh%5EriiVj5qCG1rBgL`O)sbh8ww`a%Bdu!M>C+r&$<^a9bC> zmt_(pjFMbN;M{z7?)=gq{P)hSr$UW!~4dUp;M1PA)d7K*&S5lpmO zY3U|p&(;SkUAv!1C5RDG=NayXi4}p4tzx*@vwW84t7e1Sz#^t^aKLJFafI7Cc-HFV zQSN0O7r>@a#m)Tos9br1sHl+hp)%KBf?3X}?ImrR2)2Vw0b18ixSsZDWdjOaoIsl$ zs09OcC1HO%plLWY`8j4Rs@rjfqp_u+Y+V*vzzoZQ>_=d$~6*gfeS!bxG$ z$NlC_1bUAG;KLtTj;{O!to`$&*i8g#m##qnTtfeIG5q5IRR~oio&3#ub->FXMhFO}iy|U$XNPBVHQ8e?H--l}Rj;S&2_Xfb40$^SYpJWH!pN+x&LPT&LaJkdLyA z?S;#Z1`}!`T<%~Eg|ISIZe}PZS|d8>Y`2TQ{XBUlC5q9Is4#s|r-ZH?eI8P;cFl^J zs>bZ9S?2V+!NT1x8(&cncgn6j4r_AhNhoSQj{SW@e>vGsHN2Z=Pp~zF@Wtu94M}8* zRCVr>lYXPA@_0bWEbWODR!w9>r*0J^PygSWqCpGWG2*k zxIVc~1K+z47B7}lJLaFrX!y)RP|&y|sB{m+`sr&s(>l)gv`PLdxi@@EF5`HFgx(5D zq!Q4&e*igYWDg0;Z;ykQj5WJVEzC!hTi4ieHtN_P?%OplwLj!hUkgBYEk&l97<0X% z+`ZQu+@x_Yc+3fwHEGMis&a62ZUyb_cZhHPj%tl=zIV~-W8D#5NHVvY?b5 z-$t-%gwAr}gm(rwc?jr6)BX0HpU3xqYcFje=Eb2v=w)WKXn8MQXTP;W>I1Wi5*$&e z_I47`n-pHp^k)~ZoFIx0DGl~c1z}rsvo$t9-W>v(ufLxAE?F6+8LFsjQ(YpMdACa) z2fkPX8sFWa{y{YP^Spw;y$n5Y83fQCPbx6?>Mh`9(yLZ1ty#|7Gp}v7+A%q9HQH~S zF=iWv4Vj$?$MhHxQ}IaiKGQ*)-2t9Tcy2fBxf}KykbP5p`1pS1tA)9OTK)-3b8Q`q z-Xi1SDzzpAqF$R45p4h4BY1H%jf2thQ@euh6?9kaE6%pQ$B7!fl!~oILjzZv zQI50<>;*1c8RXjuw-GBlu$ME*Mc6*pR}poa6@(V?gKnhbB40gwVO=NltIipKDahF7T)Y~p&aXP^QU(B+!HPGQ}FjTf*>A%8&;ZT93i|7&0c z-J2`=&02N<-#=a~4-DlF*Lkpux>LWWsF>{i_E_M?+T+9$MFZ{&cUX&E()Ar|Rr}78 zp7?pCANuu{JQ?hC`EWU#WVy07I}Z z8r4>7sBy%TBhO#}$DfA1Fu{IIJ)Q8K#&0i00=~a2ZTp+m^LPFa%k_Xt5p7{gQ#c9g zxBG#GeA4v$WDEJ1b-(@fx${aC2eSj76HfkS*9EqpIBZi5w=N(08LR#0?M+9f@+LQa z+u3IEBGAldwM$CBJ+)Za!^|&?|G()=ldKB^`NBW-z+z?!X2yj#iK!3@V&0v1Pcb8s zG`%pS)de$!JeW?@oA9sy_R!g7lDgme5MQb{+JY>r`FA9uXsDfZU~m{miUwO^91>oG zpNbINz;eY3+WQh{!YKlJdk+4x`TX_aIh~EJim;0 z>+JvBNlNJ?*7s+*n0LVAzzPULrO=r1JC-2_Rp25s^PqMo9){hn=?Y*q)VmIVN<^b! z`18LVgUIBOupMyeRytQuK}Yeftm%n;zW`AThhHFAWwNEomV+l!O)4!I4<)z+`y5fG zUm>;TG5?;OnQ(sthd2}=lM{|pm|`VCWH$U#@PW0;1LGEwKD9~7tfRkP&f8okS^Zy# z`}3+n+;`mD5YuyB)37!=$u;jDN)gpO(+9>F>aJ&5gDf4-Ja9ZC)lW+qMm3pa{4!N4 zm^*D-hfNSM0fBb*)q`&^FzSBag7gnCn@dFH3OV^l>N`IVlf=`qk|_W`hD1qh0*{CFRRXs3wmedj({$xK&WrSO&c0G^4BvFY}n-*<)v z3XLw!>>`*q2F9QFmts?#YuuNf2X&P48jVZO;YxBHAqzdfcHaf7fGab81Nyyto}2F& ziZJF=ik{oy0}vL+yu5q8T`#S7YHk~)qwUGv$ZJkp<3>y6JO_F~_uQq>8)b)z3Tou5*78Uau_}d6{cxevO2kvlmzvv&$X( zEAEY|iW@Os4{_~;1>`(pt@x&s_q#|d~<+$wjzR>}{GR0Nqe$4-3pc^#iW zT=1Q_aM5_&c@r3Ml}qn?!!!&ZuP=RINUT1LuqpeXS=H;XxMCHK^P>qS+VKdVtnX_) z^=mZ@1vV>DYqAfpMC2uq(y%BBYStQP@?bf~(>h&5* zhK({`tqI>1*hh2YFj>2cci#02{EYyS)R>QHh?3Q>igAYC>9`=@U(hmha2s(|oFQW~ z=SG5p;?}pGwoks2vqdr6J*Sb%$D9zH|AQs$Nk2%1@V!59^qZ<@ZiHvPd9%EwAq6cmqN2g67;!EzEC6lJ+bT4lic zRVjS9LS@;h;)&sRxw|9Z?l?2-!zcv-R5dxQ#+QKFFjrnRy~%Rx#qCRn3X&x2 zob@kZ4P5hzb&dS-&-Pxh(_*vAY}#C_FTd}@v9l_VLOa2`BuZ1`IJDiEKtJdAOMHU~mJ-K&QCM8T!M+LFArRu~8MUA7* z-ucMlM=mS6znR)9JMdIE#_f7y=6dA)KvjBG5p!Cy=4F}81ecrvnAa=NQlH_hrupNx zm{mzyc?fB8M3YFQ42>MMR99dI8pA|nrofc3$y9irEq!gF;HD^p#a;Prh1|IXjwU_X zN1+eTeyd=vBV!9RWRrQZ}XIWw6N1`7Ff>p##peY!ruJK@9I`<20LZO%;Rev}RS`=~Vjjs~uT<@HTq z(9V~<8JkI9G`OYW|B~3*XW0lc#E;Qkoj3G1oxl+T@G7^HIsAJz!WiTopzkp~b5Ts){k8 zM+h_kqwh*`?s0-7V;+!z+ma;tUrF(;K)lUP@fgfMzLhInf6QObZ9kp}5Rb~`Y(nf6=FRf?s6gYx%9tt50m%lA;U`M+gZ*e8g;Th zDtxRTV6P_|ODvo;g@?0#Av8+i%f=mveK?A{@XG)jv~tcT zS&8hVNpy8?M0~r?9I3j+_ss`kL^<^)^4Ql3WF%H_Gr`@POObdWx)Kx!QvN0w`R)G>D_O5JlPmYOM-7%6C{qUNO*&K#+ zTf-uGPm!BfH{JZQDl{odr3=%>mnib5n(8NJ;vQ>nOt-z$A$U9oXul;)7SRQxm^&|b zPgBt9OsFd^<#E?+8fo%d*!w;85LP-fq|h$RS-=Ns=UC&|50 zoqllek)c*Z8`4c(k~9qdAH36RnNf*DD{8g&WAQ|r(V4z47s-TQvv~wW0FJS8c=h{BY3p*oPVlB76xqj?kLR6l zWpv(RZ3!B6Gb0S97a#`C_)`yc4lZUt$((ST&u1gKBu=xV7x)C*=QTyQ($MSnU5eBj z!*x&eIZy4)KNNYp^15XIZ!dt5Z5e90v+L=R@`6-Xg3!x8N5!dib#%d$&wRpuEneda zPH|Nr=t<+apl{pyu3e|xhba~m_TI4({xRH{E7ozy6i1KKP83dyBE$_8b|na}iz_BP z3%IZB8o0_GG_Sfp2t}l=u?FJwE%#oIh*k^g6;qnbgV|=FVR=Kl2~Mx^3fZ4>6$uZQaLgB=m^!ikpTJAq58`zdgOI-O~NdS3G?3PO4L6V zaCLvq^-}&7FRqtGns6fmAN}7#F4xGO1*hoJNj1LsrG@xsO_V(e5Veo@vH$76{@h0F zk20RsT{utRScMx;U+kB3*YP!HuN4#FUAtLGjh*CE-G99aiF?x4}qa|=u z_g<;zLT4^5qf5tOIHj&Iu_CiF)mqw?D%A(Xbks`CcacPPr$)BS9*8qoVb{IoW6~05 z4ol%H((v~?)2YFjnU2gUD^Jw2ZnaCv02HAuh&^z`>p~?#zA4JO0#c`|BP#zzrj=TL z6jv%mKyQD80SgCYHm>TMwekZai-I9MXCKsy^H7tZE%VD8aEAw_+kC(O({(rh+jXrk};?#ivYBYBCa(%f2T5K zO5ndU4YdniDbKE^ofZez+a|VS&Prs@YWBA+OFOM#{ z#kHz+-ze61>Sg92laJ-gmL)NUO3q1CbJ^@Ra~;XG8L>Tkc9P`MJ%0Nq(Ylzi`QP#?1e4@wRD!1fg^0 zX4*q(izygK-|xHrID%&D$qo{UVxPKYZJH=eUW?@hHToa${IHRr(A#{6?w$o+MA7# zh-!6k>l0DOdX(I%%N+~D)AEG7$1SP6T7@44a*RGiF$uo@h0ZIJ(`LU*1ppVf`Pu13JGS2<#373(4hM9z9N_lGq*gMW&hd+YKZYD!A4b-0;A44 z%vJW<6H4FpF$;z@q%jAZuZ;E?{g;2js)!7oWUM|ivr8PwTONGL;?nXV&`F!DBK+Uobd=u8xHLf=wI`2>&UHzN*^9KH<*+m_AY zu#=vFWzn90I(h_{I}@XnGPEkL%G_j^-E>Uj9rcE;8I<2o2a1!O6IdtXpxTWwo@{DB zO{6o~$;q6HHIhb@*>qALMDM)Ce|gn1>avcFFxB&2hzN0XlA|Si2a^baHhH5vJ(5_h z=~_PeSV4lT-+9P$9(c)>^-UW7j8nY(wzM; z^}PRC`Jruq&Y!99Iz1y)1fN}RK}Th09>9gMeH<+Dg3hTYS>j|Zr);f9R20+hW?H&2 zh?MtRdF zG8Jt`Xkep5KZGk%r%DvKg-M(yJdI#Q%ymUPy~z<5TD<$#QeG}s9l!LrT*W`g@B`UX zHwzdI6{`+jTV`y$GBJv@j1kLxE12;djsh+}ANU9DDz#;47;v+@mf*Ke977e!@?XH7 zh#8qKN_v$gz2K4|>9l*I;@lM=M;6E=CbarR+zH;!Xx0=VXD4r;EVrA-ds%qS6If~- zShx|s-9^UgOoRw+@+;OS4nj6hs!B6B?%7b5q$kR3qz@aup084zkELdYl>rG z*f?9NmRONtg5cH#uB{c`jLGlYxwc$4jN)vh@De;Oa|=lldNlG#oK|r)7joE#g{4?k zQCPh)T_wL_0b@B8bwT!ZI8{{Gs8)UYGOeoK&iL=nC!}`nW-=F*lE(_;)8LJkkEO9l zlc#d*EWwo;z}Dj4FrJ+N)Rb>x2oxi|7R&u@VTHDT%+7!M7-ZBsJ+l9nn8%?hNo@); zl4RqOXoBx! zPG`8IupZPTTr}ZFdVVxy8an#wA%A4NP=?U%EPcl=b%aAf<;#{|_2k~;T%f44xIFv|O|^C5)A!JSleB&*7{y|7B1V$5{( zy`KU)B>Gv@Gnr#YGnoobl_YQb3#RT@ID8%TpyQY?B+Gx%nRBM*O=Jlx3= z?-16Ny)wimpF4*-zQNr0_O8NcN(It26HDav+$3t@Du7iX(vO~_m4%@AYg?*s36VDj zs-5lxk8N|$9B-)*h9{5ta$n7|UT6npcpMi)iJn@vx13~OtlEz>na%ad(u9B0oUjj6G?xBPvFdgCtP;oK;HF{P$Ypc$<8u}> zA@uE(SES@3!@|7Jf@7{}^WOcOv?38hxl)ZIcK6>FTJB!0<>Gr9_?}I;tjRTlQ)W#a z8$eZ#lb%ytif+eq$?R(GvZ0QKrYPUZ!C-liMCUe^@aQ?(0m2lm^`MjMJ?^CpcES~t;w;{KdmfYJv6S-QZMXpRWlG%U6c45A3 zn@@CjCl{?!VlD;BY5VXFdDOi95*t*vF;%J@HP#SV3}dIQj_f`&eachk2@VgzR0;)F z_)c<@OiqYGk)SkE$Lqf)Aznm`KYAJ~qQ{&_PqPX=O}Gj4G~5qYpMq7W(J`4n8nJy1 zrJpblkGkzHeE_(1=W%_ZKdqNl*auv!zrGH)0L(gAD6*?dY`UjzW*%INI@%h`7Cf$D_NT8e`;xPg!(&{R*}HN$%|OhIZ$2jP%prj@lZL59aL5`t6iBhY;E*i;JPh4*hS% zi8M?Rh|EVjOZgW8=-&^x8abY0?k9oMlF!~iKHLJlYQ^bt(K;8x3FGfThy$x69t3R^ zf$6>uGFt@BLcQ5J{$E$ht{2FG$LYb)55Tpe3dfjH3xWD$+0BB$MlD7c-V_xXCB$FET?jtw%*c2w@+4yyqY@!LKhEs@)Pg3Veh2d}w@2w6LRfl7 zEGG9!D^}$=OVn9)S3J%`dF!g55Bz+el_FrW>wjP852D{)j8}9(wzBlSRQ=oAmx8d9 zB03%`|9yFW{#UmbNLi`v%)l7}R5-!Cms*9!JPI>~d_{pyN+V!<+nGNG1sYgmC(yw5 zt;!yQxTl_Vfgu1yGhtkhqg|5GO{^JpU`q zq%mE%*YN}0g9tNA=!Bva8GDseC3_(ZPquU7zfBn2bm(^~B74iXYryJq!H3EK;Uenx zVNmf`5!frJT2-W3fjKgFDIJi8XoeN#qIwWar5fpz#v{kVg?xZz zY>C*oKvg?LsJI`8k#Tf41nxWhj6r11<8(qM5=m(`th4^`B zfs{|~fCBDE9t@QCTBX(l^AJemxYhQ3(0Ph(4y1e>EHup5{>KeQ{n?|h`qlKzdv-RO z$)Db<{fty}lHx_qUR?zuy`b{Vb25DTFy`Wxd)y3mu2%OLdteYItgsl$2$MIF?kZ<{ zSEyo9jS+0!e@)mB2b>=@e+6VMwwScWqTF}Zn)wqoG|xqBQ~wY9h};w59{tsm^nx;c z9(vd!B$~qs&d&lFo_ZpoC6MW2-p%s*8;p@(BQ3#XOS~n*eZnOb`EFe8x2AU~rn7x> zkl$_7b`D!G^xfv0!tg}wx9`E8MJz=!q}Q23Kb}j=!I#Nd=jzsJ$7QEra&%&Ia=I0| zRMIU_%GZ@{(CoJ97zHqtn2I}vJ^NVG`n{^wEpsX%&fa9QrTW3w>Z!H0GLy-;Z(H20 z-(tcA6L*A%3K1#z#ML=dQ|+M|cNA!#w(dTBd;ssb`0d<0%*8x}So6Gu`c+cldN`@r zfrI#e|Ho^aNvUl(PLsIHF8 z!NXAs?lD?B>kD}>(Y9`Ag-3WgsOv3O<^#Jxn!`k-CelTG^#H#LhEjvj$KvcZ)ob0w zP_&Qt(HdB0f#f3JIuhtGvOhTf*xLOPgrtYuG?bJ1&DSloJ*RU@ZGDXh^OSZKW#kiADVk9hpa3`Qms7U4(I8(v%K_wikHvO!%Z`FYt&M zEl;IB#>%>MTB2CaK01JRl=1KXtjQ;(T=Jzj(6*pju_t>l!L|atc~FpYvvol3VIm&S zc1XIT3y`u-4o;ZNm`Mg%&wY7C%iP?*#I~R{@K)oN|6$i%USuYMxcRKN%kh+Zm`{qe zzsdr-MBnNq&waNIE>!GR+8Je{W1*yCNh8F3HiP~8?*`pgea)SDT>y$g8^@lX!{LgaptX z8&3C$FCx;~j3k9p#?57@dT}tNxlLnTc4x5vhywb0Ye~kJBMff0LB@aI@({vTKroq7 z8(2QM7gNMSPGyQLy(fQi*{$ZQ1+K8B$W}i#nWBbr9K`jG1tn3ThL=7uWIhT$mD25U zUWc<1qKnjn)I}oG`8g81FSRe+N2Cb@_TPlJNJ1(mo)3p;PMrMrh5G9!3)LhUTV2(B zeh$`jD|ce8;@jPU-Q#Th<|C#AdZX68S~YIYBEw{w2Dn1It#^F@Y=kGykPqfhjhvBa zb8o|r^bMu#&Y`cm@!vnZ$Sh`?b@D`M_w9BUS>&nL!W*goMx)VW&h^vNew6Rt!N=mqoma_l zgWz-UQrOkWz|+M&bIt>)&KoK#&>x5z88fy9q9i1OGbhBSN~pA{`nZZqxZBP z4J$o8l9+$~zrSogYvzWB2pA9<70}bTqMI()oM=CfPaT7#mAwKUNjF?paC*CWevWS7 z`o9Nqz-yZu?srYF(q&xcn-G=O1mQeq`=@2p-n5U!;)y>eiVhJtUIE{)YXvWfetu~g z`|$cTx{rP^y!4dskk=cf^R#*uon{0Gj((-Dpv@^H=;!58teTQhK+VQCWBYhV-o5@< z6?f4fi6j-g{=+(K&a*fFJs$X2eBUDB{Z;z^T$qb+psZso2L}FgW4x@0NogC`H#=Pa z+5P_h>yKq(^-sh>Etrp_i+!B}&jd6elU+R_oVu9Lh!fn-=2)=ht6N0BKCC}>QR;B9 z`r4^o2o`-k(G;xU6Q{qbGcf zfor1McgL5mA7z58Fu)xHUD3|bEDeSLsx;wnWWrZ?z; zOe({NZ6GNV{vIX;*OpO33`?k=8Rk(I^uDO@m$i|dRcWcOF~!{wTx5{Z3O8fgaLWb= z+>p+~6~vPRpHtvG2P>QwX7QwfB~=K$Z11Ckhvs4GQVPLny@*L1*swHH2?CQB!PzTI ztiJE9+kXfGv|^yf3Dlhxx>%3p@WdVv0WP!%ezh$vZjL<@VZUp~{TdB2&hny`?Otu} zth8ZrLb&|WWIYzSdAH``!SwHL9w#DsGZ#gE@o!0yrHCgFW-E!g_nxd?HwR%%DdHt_ z+1J2h#(1u;pg;Ss2s|JL>NcIAlS8x6*z-&M+Y(6n8}YPRLn~|s zjlkdTf2i65lT#tXC%+GEKK59;19*_&RN?5%;5>e^64ZfaL)JK%MVG>htzFH+?70WE7D#7(6L@6WpWEP?Clbs2N;V{rC|fej9ZTK#h|mrN>> zLP?I9r&{v_$g$^wE^+Hk$nq-Gy95b*hh$_fg}LEiOw%v&U8jzj43XrZ6hDX2YAM>_*9`>qc>Fcd^G9}!Ij;y;sLK1q$$Byd^1 zBU>6Xv;M~({-yYNi0-o6*#UH3c&)($lKL|LZZb%)T{GywLia|LwLtcCY7ki5RK~g z*`GI*ziWVq3$NE3o73qOzq+s{l|-QP$>0U2juN}8eqT>CfNJrQsoVQ-h%)9Gp}b*uN*zf^PAsr62i9FZq}js^UeHo&0stS zABgu>?l-@YLv~<3+$!b2*W&M=o*gBn^?$VZ(^dNWHy^{`DE|M``tx%BAMcjf%Evj2 zTIBWQ(k^-rbW&q*9?f^UN(&9}QEvihhE0GqTng~chacUd`rX!YkFL|q1jyr0KrlO6 zVetCoy}wp|FZRFoucGw#RNG1=wj(#FDA<>jijX3anUGbw6OdeLVlulucE7~W@BoSh z5_hgTRyWW{d;Pgu-IGXqHT)%|J^&@ND2~)XvnsdaF{nKKMOB5-ZS^4f56DA&nL~*j zyB3Q&nf~WX7{cXcQE+t?Hi46;8@tPI*qqF|f=47fN3AySel54+KCLgDOlOc-Id%%S@DT@ zg*_41af|gvK9b5yC0{0eJdbBDl@7TE-S}l1rl|KbJjh}t=1$7WCXiNJF_$|lCl8y; z4+n_^>Xit00G-n54GLB~0q|H4Fx)+d2?WubY(JIoFaT7SBfCgd%Tb0ry zJLeJQty1?nJwcGtDo4E{uigO5VJ0{jyFgW0!t9NP!5 zV8DqN5jvX8%e9bm$#2>c*ONm@;X0e0X|!?k3Q}p+#2W4qIHgXcS0nMg3t-%BsS_2p z-X+nub~fV$$xz$VNF!QdOok!WTf7{V<5$R4`ds$83@D)ylwne@J>17`APiu}B#45ndJl4!W z#@KrY7;|xj&*^uN$;& z-R@c?rsBfX!_I&`-p!+>_v121aHzbw4@jN$3c?})b69yk;sVR-Nnu!Tvw?{k21J>H zWQSJ+OSU^xF;VA>EcZoR^myFFw-}J9fv(469XywNVFIn~;YG=w+`p8sRNR!0$=K1? z#I6+yD*W9UhfuMaPbyhA$L@O73zdT$WMOxuwe`qThvyzLHH&YF5ha5C%~ynt{oqkC zfTBSj1Qgg_+jhiI`JSroHVpRIYBI!uMsFTG9E&p(JSrLs5!VpJOT=l=*|ZV@Sy8~= zvG&~btbyYx|Il^C=>1V$YPUtTff3ifF76WDPYmH|H6j8vpt#I$ZY-!xO90LUKR9&k zjF5PmeFuZVlB`-cj=UT4egy9g- zdcF#Uq&D1X_#8vfOnfG@q@-tkoaVF;+u94PfoC&;sN;z^sDRY1AIMUFzcHmW1SzolvW{5@qfy41HYns?6iqytWIZYxqv@^KjrrPati@G4qzK$xS)AO5p{K`=D0>fB?V77tht<^#$QMdiH zxuSKJGwBN);~^S`dbR4BY*XdSzN-5A*msW0w14gNjpVRes>!MonSuKVmy<>_D7y4_ z;HlGBlB|8^32?6y;KUW#8{2bL-4_L5D5>v=`<}|M_Yo!sbhMTsg5~lXA%>;KD zuG@gcSmkU^ZvQcgJs0wDYtxU+rhecy&fgd9MY+?A}Y7c0LCvA_e|<>O?P@KN(X3Ai;7&BHh1XW}ai zfTDH5cEOo@iqAdHecOYt?}M(j-y`r{qm4CJ$BKY`r1D3BY=)e)i1ji_^|90L2axw# z|Ire(*0w?H9H`wAp6u2dx_#xj$?2+)cL<~j!tR%BAz2hxFgm5zuZ!>9G%O`#6-e6% zukDgpdpbnkb`gM-f%hAUvz&Yv8dX_KZ2CZ?J{?6u%B55FUijNUb)QbLA5o-w$Ij&h zIH7{$v;tqCwYETvU2FW2Ww(in)J280cAcu?L^nKY7jTpt1{zp(%wRzUm!{V-f-nF@ ztgnoz?YzT!r`2RuGpI=lL@w`dI7$tXR2Z-`SGT@f+nPeGkX#dINf-cjeLYv&s7O;V zz0|0o8cPMI_7}rTWMWv9o9`;SV*r!K&}NQ1X>0 zIJPa-&|yszjd-TwN^QQ0BrTL<6Rb@>m)5LtMH?0?BNjOxt9Q0$ZkvR9+zFD~K9EA< zBD)=Mo0l!y&3#kzUn2lxq-B3!wiz>qC&3oxil(p0IAVCjt(A7%++DGc3OjsbE8wc9#Tc~?`GUVI z&)oJadpTmNx!v~53R9^jW^8}ZE10`uZ*`_^h?gA`=2@$Lb$4`76_>Cof~_%I#(rYh z9X?_m{r#>)`$Gr?z)rbux@X%-S7K(a<#=xJi7Q=-SUp0#Cz$leOL5|PI$o;J;1o-o z?c>~8z~vUz^VeQD?5Xs%xA>qfD<4nD$|RWAif?+lx{Ifd>3Ug@_L-*5wS|1I5Ihum<*Z4C+r>2{3m0ohto#RQ>V zQ~kNNBN^Se(4w>1Zh6efy1fw;ac#a9dtnpdB4wMaAWp2zG~fHevns+y3Z7N2RAMsQ z9Isk)4Q~rN%}?Wrd+5TLb+_YjupJ8f@T2lV(0bFij_2ta^5HCr=7}QsK%||srlmAf zv6U|7S=F>2a7jNPwRz~dja8hpp5VI%J4m-)fL-#4cA-mFoPZzmAX_S6rGb96dI(V%2|D`PP}sF;WZ}t92^H)6lGpSd*)JI__x$&Z#oAl3qd4 zXlO>;`3+b0v|FMwti{sMNnkUNq(OFMNpa4V?VGRBP}4|-{#~Q}=v9&6PqAfe=2g2p zEW0(U8Y7;DZ?Qk1%=k>A6Xs7d45U=`&eU*E$lG%}SfTUNurg!mZ%X##{RFAhH1zgH z_Bj;8G7SxR7KRMy7@~=~X!bT*rxa&>3(hZ8#NA7?bi;`lI>kNNKb_?HpktqI@q;ge z<)~1B4czwcKizg&q7#=1Mdqn0t$jsqnaBG`eP7C|^x@FU>z4jv=tp^a(eq{(50A&G z&~APu+{3ZJ0iFP&i!k}wE8&XUEgV6m3vJZ)uqh?ajLB}_R5|$Es2ygAD*+Z9r&o}S z`!g4H@YUFMyXJ9;og{|Q%RAak+j2uNdP9W|m)%&1DBfNK&&X?xOv%@xAe_c|6%rKjC!FyC85rw$9O@`8IWz>do zT8Zu!QJ~*4MffhYcq}i)D}lS=PtHiB_iJQWswS&7uE`m*v8JIFZFOVXzk(ju^l<6) zOcY)7;s2|>?~H0Hi{o@0V*y2Gq^PLa=^#=C=@vQ&2uK&C6A*zQHG%?4RT1gEg9#{v zP=lg?g0#>RdWR4|sw9-XPp7D`XV0FqXZOR7A3Q|K%gep@-TN=Uq5xtWNgdr0q~E+P z62J65Q3~UD0QCfMwKN9Vy&h{DgobVO+`ORbvlCY9rAR89pQuPmOj~)#cRj4#i;oJn zg;)0y*+O&-O8n4pk6q(qeAn0THAule*zgkSc8gY{t_{LwvEOH|(xIgkZ&Vu+*|DIp z>NxJZA;H^*Y>yntMmjz36IUQF4jU?03|_=HPR`9T`l0I`uWcMnENt5B`(r#we>7;- z_3esyPv*UZ&T5y6xMfG~ziL%ljO=SqIA2tn)6a37<2ZcRHQ)b{XF-;06=b|D7{b}+na zF>JD18$>Tm4>wFbKl9gifg-L00C*XBqgaiRUvD7eJNaS;PsaJWB(gfH~cWmXn) zN=Fv*8Cc+*8rs}I#%fTx$gI-9-r9EG>#eGOp&+_kwx+reBSy|{~H+;UjQE&@Jykp@%N9Hqq}I_S5#BiZDs z{ki)7KzeR@l-FN@?iZIyy>#L=jB0D2%!Ag=39-~_dOX@UGLhO_${O_RWwsi834NBc*QYqsVntd<1YC7)e*NQ2pP6-^Vj{m zqopKTQ4S0Vw@2!^EV*fqlSu4~QG!OCQe*>mF#oY5(TI%?7?I0;)om=isa;ND|2*>j zp`rnx!BW<1y-D|oO0MS|e~m_yMhl;r{go#sM|++v8SH~cuV5a*{%O12{JLh&ajJ%7G2lzGsMvYUa-0<;BVy;7v*C1Gx!8s6(? zGd@bf?i8XQ6LK8xw_s7PTs$WZ8*czhfgWzwhNl|%&kV5W#biS)#p;jxGhvr6N|CPD zGEN1|lMp*lLTMWtJnT)_baipY$C^7-DxK@(SJ&;Lv;2G|IbA^x@7#fd(^!4d9ZtIX z9=TkQSmJ5p+Jn1Wq7qXROX_%hKzPCw0C{b3d@=kZo!4k0Z;ZMHyS=WlhV}!+OXsHs zYMWRhJx*{*C&8X$(APIN)_W;`x=XDtTo5Zdsy5mgystrV0eN+Wd~fWOZ3SIqGUh$L zktl1XVXl10h?~YD=!)gO)g8~48N&lhgc-wYJJTH`r;hAWUh)x&bDrURkV}NMQWA>z z3=)t=>`4A`HMoJCZHnPLmVVb(!{66RGOzPI$dfMHfOoNdExKq3_Lz$sNrgCOcd4%z z*UUI(&5_Dq*OQR3FP`^}Z$z1%2(RHn+I>JZyXbCuPY^Qs*d8m52Ae0F4NnCTUkV!0 z*r&(SZX5$)0-GDfOf#<{xyHYiXuOG^I&gfdakkK#J+CpokaX|)GxQg0s;BtSG5pj* ztsm9!(6}2&XuPO@_so6fVKKV|+SLz`1K*KQai&0o)7mr9y^xwir51_%}K za1~)kY{l1ur7iOjI+YWX%gHDRo?-h-h~RojWxPQb~SZ8%&4l4UNkYBIKh?_D;^_sZ0I~H4=R1E9cqIeGAEzofGRgosY9?CDw&3>k~Pj zDVCshQoP!pd<&GM%^0#uAFKT#(T3vIV@YabI6!mmcp{UQ0tLpI{Ys-K^3TH>C3?Yn z#uBWNcuLaRUn8?rkFL3jeL2bE=Iqf26jA1FGd^H$5Qlv2tl>(;NUiH|xSD`QJTxi~ zV{G($N(M-Qp>UTeZcMPO*$`2?HEeLnnkK>!8i;%U3)MP_B@d~uk}nnxgJP4W_SY_1^kBJrf(3m;>|&{UytNC1m~eLE#B$mf#aw-J20~&7 zPPW#cc=-6NMkr54eD#RJMf_`PYN1qPa+Ks1D(cPF0bq9)F49418+%)XCKzi^A`l$${!G9#&U@&Wvm{`l~U(epa0vEr&DVQ3Zx*=*H9Sxcv|$ z%g1z=Gby_x<*~k6YSeJ5Te0`mtM?&bMjJ|6#kiAHwAAMReTfYJ!7eU3!m)VDR$&g) zO7rKc!-qNQeW=Be!Srlf& zE!rmPHo>?}cc~bbQ!%DKY>^Bq!{E(7{Ut5D3&20j;wI1i{O{1O(Q|l zf{S;f#`4D2iEh;Bzf_R<)#9sEw zUm5h+A=t}{o7Yr|GGF=My|86B6QuDm?)#Dv?^17DWT9e@+UVJsu0?z??tinAQM)Is zL+s=mnRn?}w$BX?h8XvdQQyrM*Kn8H6Wq*7$ra=pAo1if?>050(DE+%kgDiANJOv< z;H4luLIGr-33%5!WMOZRUI+thkqxVHD>)k>CrbZ!`}ZFp%Fz(%T-YF;eFX3>3n^-M6J)Z9{(LovnfL=%tL(@%`&yCB zR^{Yxnx%hXyl4geR!CnV75DbneJH&e|QIuT@S&Z%%fU0UViF|M;^r*Go-enx1M!_BWl` zvh3O_-X27d%xBdoRT-bx#U@giE>r5X#P4S&bd;}lCNscX8;f1yc=U=m_m0_FX3q3C zCAfRVtlwVT)j7bJ+tF3>jv||@GdjJ(cJNIqf@~i4$l?U*mYFc$Uf^_bi@Jn?Q}P_v z-4Sm{sz>j{y22gAmu5|8)e^M)Tz`152&!pAl($&Wq=PJP(B;PwUyUCr?|DH? zfZB;L$Vt``ID`trtORMNKvTq(tZWmoQw|b{1vS%7`^t3$^V}`aF{a&!13qAgyUiOw zbhL}^(g;1Mv^V)$nbNWVb)>R&)!)vb!ki)DCIC}fuuyQhN{tH`+P8HEO5a)-5(rEc zV#MFyO(!oLoN{1o)U^uF?XEe2bPLSgOg%ztXK_JbA|nX#I-~-IqIA0cEgAC6WI<0Ry)M5bifXGq(y|KCj4pEane8BoIM09LNH=M9A)}479GN zAs(ms)cxK!!hkMJ>Uy0DFaJ_gWK3^|SB|wxN;^*|0PVoirBH@fM;7vsw?Iy77z;Yu z(Oq<~fER^hcwwU5Z~_TA6^VyfR#~Z`Z-7}s=Q2>tD;{W0QwX1iBn+VXz&u~&+C6bF z1BM$Klxe!X8<|N*eg+Cc8(iI?Ii<0*h;Pa*uyr}BDsQNN$z!xw9f z3#r#hhX9JMXk~`bG3H&;_7bIQ7LKVjFYq*(Agz1adY3ot*=2Olk)g~?nmXm$rcJcqhwY!JuYLy-)H&D_Ue{+^Im7wz(^ zePaq7@_67}plR}vjmL@{e$ajYk&7Q3AVmfU;5VPQ9v)-W1c?KR^m`V>eoBp&&W!U6 z(K_AQm>c6FURcz@6RWp!z;~T1 zg~}Wd#Qt^d0a>_+n7H)1^fRFL z{PA$Ln0={BeuA3vSZhFG;%40+4IBjZv-GepIoRhxRaLt?uUkmc8X10aacMAswe*OH zw?~heO5yc_=gwtB@Yq?J)rMj`Dpxx&g$S#LWGiUfWx`k-k-zF+xq%t9z50~ffSEi zW{<*iejR(mqI%>`;vSjA!N|>8Z$v#wIH|LAxn2&3(^M=7K#LBF3&R^t#i#K|V%`P? zSwwObR)yd1;W48gq)_80f|3Kc30y9rrxr2H0D_ zjM>sP>3-dg^SZ|J1tCND$RHiPT9=sd${|T!HGI*Y8dXf?liCGW19lC{sN<2n;xt-42x*z^*RhKk}tJ8#8Ur@@K=7QvMW zEGJcH-ECDeApdKfXGrdJ^qR~zkJUAv{Drp%$PU~t`P|0TRkRcQ-YiBe z4cCUb`keNX(~lM2q!P-w7ZWAFqso3vRo4L#L#whjpko`TD27wL4G>~%XxaaUGW>uv zl}<7Rs7KCgYSq8Y40tI$3OFP;z4u%F_Up6(C>lQidNQVFnr_8WCe1@vl-gYgPL3Zx z33{0o1<;a#Et>q>T+t0&F@p7Xy&t~U-|Iz78Bjo~C$bN3bH#FS#k#QHc>amR|NTtP z^MK)Dx~LWW_jUe#V6}|E6-R3yF#Y>a|NO*w2n;5_JLk2nUx1SjTyfq^n)crh`THlI zKma<;IV{1r4NWD28C-FdKMA(YAXkG*&CTG1z%5GiCv5uR zu`HaYcoXua0<06p&z;QzkRZ#qB+4cA)L}>@9|7nVTDeFuD~MxUKbqrJE|p)ZJsPa0 zg6Um3#TAww73tw^Uj4%R$Mr6a*cGFbk_(BgORWtaglNSOk5XCSi8s*fB|t*8Kra_{ zB|NL(#6C{|WNN3I$JqB0PJpo0y)AYq7XOrJV z;?Or&f!%b+tbj#G3Nc;30pR5he)F}>j7PiyuD+7Uj{rUj$SA4>0BlMCxrQxZM;K0X zKLadNh=>dk24VGa5*|gzfm3lu>h*&}K<|a9tT%nNaE+2)lrBKIw28Sf)CyQ9HXu|l zu+0r^-_ry{Ix+!-q6F9DG+VLUJL}yEMFeF4U84fDinxXVA-n;rh8<2n*WV|5%^I#q z(gAH=R~Hm->BQ;Q&!Lb_P;}O;BIgQZOEZjigg8KE`vlFbAV)+XG;~QS{)_?|hw_U9 z;LIVyJixP#lG@x{L4Z)&=~q+RdC2lP--Y`cip2M|lO=g)viTIefq_h=IJRnZ@@4h6 ztZIJr8gZtn8_KA(0OZ{+oO%Ekjxapg7Y;y1sqz8}Ht9#4#YoQ{+6Up_3q)kCd_sAY>d- zJ;bK!?1BKgQ-CZIYtp|$_GfXpTaW~KgSk!v1?&WepoFyce&8Dr=?ZL<5#z^QyC6xa z0*l>n(GAf~1T2;A@|-lYr~6FFxZPNAG-BGZR+~d=O_t14!;Vq`xGRO}$WWyzCly_Y zLIGf=$23ol0ggGgFC*;KEWgMKaxY?@N%YPjkat}xrp~N_kUXx$D6NEPIPD^I z2-mfws@bGA>Mvb_d*YRWGwdE?0}z-N&4M+yy5_E7^%*1eX%-@P%82xaa@fKi0{07Z zuq1I@B9lEj%_>DJyMJo{Skzt^Z|k>txsfS5W=(#aU`!@pl*;?Qu2?YI8U3^4eVe2Z z^`uX0s|)qUap_kM!1HF9n_$c%8E`Mk>G}oRYd)vE zq&ot<8>(&{+jV+T##n*4l&qY`cy?X^n*bQozf%S>3&B!fZOAsaIUnjPIruiz_czJa zgT6o%;7hFCOiu{}S7pw+57ECNH1hfobLCwitWWIM6V0PjBx&NB2cB5ed`(;CN=k}8 zJ5>OPQ{Id+7%WxY5?GW`Y_AGZcyYS<+`68hMa~u%S;ac&*kMV4i{x1<||%T5D+31T8B5qXd@*xs}8m2Ns??Ey>^ho)g%=@8pb`N z<88|*^gc(<-N)6>?`5@;ZP}DyfBr_7bitj%3U!l@k$-q`j~UF@3Ig+YiT1-(lgAdq zlW|;vl77mb$44(SO(~s{iZ6)y4Fb?Y{CjerNdsGYVG(sHzly9Xo>}LW=tttXlh8qD z94b{A_=yxY_!AA0-s;uPNljkPX4}nVO@Tm${l$RhKaWyZS3qKFXZW@%+h$ax{H>3wg`5(Y- zXeU;55oAt=$4eWmAY?r_zdIWwA&*FuOKyiPj2l0-vUFBr>S4aUwHUzZ8m`lrLRBY) zZq(CfQWsDv*6WHyokQ9-i53s7PdQc|#!&KhJhq3m>Rkao4USkB>x#Ik4AXdUE~Xz4 z?s{AJ^^JXQ>wVy5LWtM*t6^(MD}{%h(8=QSTXUwSbgbaTQ~~_c!P{Ru8?FY1$1U+H zRsZ8<)NxKOPjALL7F2BK4-XLtWUrfoyDBA02KI|LG-+0^-}KvY9R*nNw*5} ztOW(Gx_E3*Y;}3!wfefG!+oY;N-`^4 z^Q7!=`@D2JhiZXCT*~V5s@b~P>%R_hTui=(6vN^TDZv^&+PcVG*i(<)1%86p^j@s$ zR8k^l5mRPyw*0D`TB|RUId>wGt&|6?jJo9n6a$MLt^hrnB=IXj(v_g_%FE8cE9a6U z+0LResGpERT_Y7!)^VmMfY&=tdw_#nY#L01;XoN%Q|mAql|vneI5X6&&pT2TIRsEm z&_tg_8@6|AgNa^dYrmyP9B#~xaZkKTjI=n>89Mi6a3NQ{Z_e>=Z0uhN!O_^agd3sm z`1i#-l#8t$Nt=&WY9+$BGz;hpyB0vY`i-(T8T*uBM>F>JRZYEkZ;7M{{=rVirGOP? zccUpC+e}Pn=gq8dt29#EmEedobl=~k_=VV7x8$bi#hw1Su!#9+qQ(>l=Aa}pS&W9f zGJ1to=@RcuTu%1NtwKZVF-P)VR#wSMn$ZKSwN5`p>`AZpwGpG`Tn?c0+aW;2&Z`vR z{5fB|OE1%uToNDvO4|NH0F+KT1!8}jk3c_lo4nv6jPuP&muUFd-Jd?@d%EIt^iPm% z$US9v_|q}+?LZN{0&=YHbjP0_4(K=4m; zgG}mxjK=;S53TRVS2I0GAca2MNNw2iX%D0iKFc#5KmfnVJ#|?$jgT6Wg+KjEF!TKb+XAI~(vI76JM^9e}2^; z*^hsJ>nuhvRG2EovAyseW8EzQmeyYgpbyU zwkU3$wj^zk2KwnXT^c{udT?t6mi}WPxYbv|g6rFGBu&9vtCRBox8D_0YnS^q0|?QS zWC;VFNnw_!LiF_Tl}=x+xUFkSK;Onr)lzpoI#e^1<`*vRW5-_6d7bhs5c?Z+f1t*lgXHR)da`h zG?S-lyZp;{g>Ctz=BQm!mtI_q8N4MsIL;A}zm3F*l{%PZn*Gc&$vdT|w>&RCyCKDn z1MXj~E^i%O^#m}<^J}6eTW>r6CAe*jeAhOG zn>*K&PTSJ?xy_ysCteF#@97xncqGCm=|D)!J}!JmPTX5Q^26one;<*5e_~fn8hV!; zV6@s3BkW+^5G%};Q(YpIt5QpUj59Dud7C@Tk*;>&ss~*(6`EcCVujZB{Zp?)Nss5J z4*$8+aVO*g2g=Bu=T+klW6O*j^bf^#LT<>mo4`AzR9n9t3$hwCCVtCze{n|rOSGKd z(f*WMnpE;inO@$KUN=8h?KMnEhf(a&`VnSbkiw4ME7_en2Ov-c2)PP@j^V|F{x=Cy z-fQe0S$`dPr0J7T^3-|zYTr=-%IOOm3_i_NOM7Z!&`uI}>B5wANUhIS!! zEQ4HF_~QvA2r`O*ED-?+>1w5~LunY)427hPvFjja#6Wxxh&#i%df(@#hXKSsF1t9r z^>68=V(IM9iCd9e;EgFa5%mR5t#1gBDj3M7^C3MnptD5=q6?p!PPCvzAz?5g76|xu zgW^CupKbe8JMSh?gSLSHy^stUB)kT-5h01|iWB^%S8%V^eEKiD0ckBez_iPU*zypw z%wsItvL`{KUWL;VXab?VrZm5f1HlNVrL#*7ok$Q%79-%LlNrlp{p*bkR&yNLs<+k_ zGo_Zgr$HYPdr0jv|0ZQ9h!24y%z+wwH%Ng=6e*y4bEETK^Oh9=8U+g_|y3sG1GR70E{35UkZE;|4{yA2_=Uw0yQC6kS{)soV+ zeLMercU)>yiE6Ztn0df*evFPXoYwQup|L)m+U&eS$s$UAYS1sdh;?6z=~+$1^<{Wc zTKESUUbR05^%U|wkZ`!pfaY`EI^f%Ug0X&ef&c*zN1t?z_zqmP2j8{{h8-C(0)lY{ z^z0uEof?GDj|Z5}_99;Znj0<>(sOY_g3PUlbh7zbtf;jH@80E+7(wgj9za>4>SpOU zAjdR;6~zOUdBy-UEQZ!sm3J2OS)I~f#A-JJ;Rh#~lkA&Lz>;Rn*Fn8VHG%@R6XJ8NX4DyR4h4c?KUZAH~uBCjH)+ z$~)#W6DKb$PSw)(22iO+)GF8`PZM@t(X_Y0J9pZYsSz@g9`|EGCRE8K0!Xf&^zV_y ztRnUX-bf%Qw;;m+-*3S%>bqnzPaRIkItJry3pH6*mdv_gQ_^y;%7r7ppye9ND3qFF zFQFW8#*!aXe)qj4QUaXm&Kab6oIp8^=G-iyJ5Csf1Zpj_-hKvbyf_wdgq^C)NmxCo z(>)K*rsO918D*xYmA~76M8|*UX`1^J*MGavuiAeQ=3iw!(VSdTxi-pY-wJlRNKKZA zs&}Vm54jqpwa2z;>&T2CabDHIPRaN9iU)iRF353dyx%n1U66baY6@*)eJp?7R9~>u zGat(l!A9^H6%nq5Qt@Ji_7;__xF_)b0#wMRXNkljW$om~(}Y5Khw;XEp1o5e0#m{{ zkVzQK^WhPJnIg7IO>7v<=M3%6ecs_5VQQrznV>qmk&dx$J-=M^=54?CLTrC=^+U`? zJ=C)fZ9yaka$uwG`AP>Icl_|j3__%`BbXB3CerT@!1-Mw)j<6|ezPdIP%Ku&*1}`@ zb>=#?f3wKse3<@@)jd*QeI!7UmTA{xJ5Zv%cfK^jesMTe1*-)U2vWvIQ~+M^Dy0f+ z7&gh~={~>j(E|x?Zxe_OTs?qc-}?al3m(~Zw!Qx8ez6hGEGA!zxDxrvw%CEE?(=gj3*>OVm->;*4e-gjxb?xwCb$dx zgYY(en1t^U9;VMmpDbJ4FTUH)!c4ykHaG6#bhb*qs6Wgg7e67mp3%y~TbB?(v##W1 z9kA4fgJR^Wn4+6TR-B2j3jM3@_rAo=oLzg`X47!60uPN?^{mDLVLmDl9yEu9?e$N( zb>-h){&*%#_kzbKI;rV7&u%Jfex<&p{KmWK(?pQJ<^;=0n$4Z%&Fk2yp%0ns00||8 z6paBy;T)9fbVpx}?FaHlv=;a-$m5O1=&B~cE%}RDt_T`6xWJ{S^E%Hqx5t#kwng~l zhR=M;nHGGV=kXqGi_Xo;5@B)O2b8d;rq@kln+{(_3R8qqWeXnp3h6t?#_0#^3UC)5 zF0e@5WjoRZI6(GLH=4KtID0(}RSH}J)`?6K8^Awj5CLg5N!VmO+bIfsfNtP#XM^1A zM$#2y!xOLK%^+n^eRTpKr=e;;eoD&>VhS^f9muMlEMRBcnW!Lh z!45=)&IO)=u^hVZYxS@;aL`V?u6R2)tz2(W-zTP^QLH{h?Jj6~kmS0-!{MQG4ZpdF zx^wRmpo<%LH`G1JC|pPZC7vf>M-oCCw}`bGF>{Kz+ja4khW(sDgR{8pg>(fCUAAUo zqmcz$uTZtoiOT#5Nt@k|EyApppV&(s&9B};1ZKU4Z)FM|E*`i6%G8Cb@nR(o9W+en zA|>9E4-x%mEtb`tJ3@@8@Rc>P!^|@0@wMK8Wlk6yLlho+eNtO6G4I8_*18t*ol*=5 zXy9XC^5~Bt1*se;2Zbf-a(a6CdGupUs zn=%*zNAiLZF5VrLC_Bojc3)V(t0}U23vfz^r};|IQipT0^(cpY>a7csWLI)oN8zpd zlY8fu><(2*O!8wbFsNG;-<(EB|OR;e|+ZD~h0u%ga-0x`nYHUS5_FYqe?;h!7~-EGa8>rxW-8(wQQ? zpt$G-02dKiFU7Vwy>^}cE*KVMH@poe>VfpNUBxKwGry~dY<;hfC^-8ZIqe{t*e_?m oMMzEVzjysLF8_B&V{Y@elDTqOm)}nA-2wh6Tvfe-mNoJHAIJ5?9{>OV From 698e3b8a38538efca41d2f1c71d5356853c01315 Mon Sep 17 00:00:00 2001 From: Lorenzo Nicora Date: Mon, 18 Aug 2025 18:10:55 +0100 Subject: [PATCH 2/2] Added docker-compose with local kafka cluster Aligned expected records with records generated by Flink DataGenerator example --- .../flink-application-properties-dev.json | 6 +- java/KafkaConnectors/README.md | 55 +++++++------- .../KafkaConnectors/docker/docker-compose.yml | 74 +++++++++++++++++++ .../services/msf/KafkaStreamingJob.java | 20 +++-- .../com/amazonaws/services/msf/Stock.java | 45 ----------- .../services/msf/domain/StockPrice.java | 70 ++++++++++++++++++ .../flink-application-properties-dev.json | 22 ++---- 7 files changed, 193 insertions(+), 99 deletions(-) create mode 100644 java/KafkaConnectors/docker/docker-compose.yml delete mode 100644 java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/Stock.java create mode 100644 java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/domain/StockPrice.java diff --git a/java/FlinkDataGenerator/src/main/resources/flink-application-properties-dev.json b/java/FlinkDataGenerator/src/main/resources/flink-application-properties-dev.json index 03a4ae16..0e5e34b6 100644 --- a/java/FlinkDataGenerator/src/main/resources/flink-application-properties-dev.json +++ b/java/FlinkDataGenerator/src/main/resources/flink-application-properties-dev.json @@ -2,18 +2,18 @@ { "PropertyGroupId": "DataGen", "PropertyMap": { - "records.per.second": "1000" + "records.per.second": "10" } }, { - "PropertyGroupId": "KinesisSink", + "PropertyGroupId": "KinesisSink-DISABLE", "PropertyMap": { "stream.arn": "arn:aws:kinesis:eu-west-1::stream/FlinkDataGeneratorTestStream", "aws.region": "eu-west-1" } }, { - "PropertyGroupId": "KafkaSink-DISABLE", + "PropertyGroupId": "KafkaSink", "PropertyMap": { "bootstrap.servers": "localhost:9092", "topic": "stock-prices" diff --git a/java/KafkaConnectors/README.md b/java/KafkaConnectors/README.md index 0ce33d64..65593dd2 100644 --- a/java/KafkaConnectors/README.md +++ b/java/KafkaConnectors/README.md @@ -1,4 +1,4 @@ -# Flink Kafka Source & Sink Examples +## Flink Kafka Source & Sink Examples * Flink version: 1.20 * Flink API: DataStream API @@ -17,21 +17,12 @@ The JSON input follows the structure set in `Stock.java` and can be automaticall ![Flink Example](images/flink-example.png), -> In this example, the Kafka Sink uses *exactly-once* delivery guarantees. This leverages Kafka transaction under the hood, improving guarantees but -> adding some overhead and increasing the effective latency of the output to the consumers of the destination Kafka topic. -> -> Moreover, there are failure scenarios were the Kafka Sink may still cause duplicates, even when set for exactly-once guarantees. -> See [FLIP-319](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=255071710) for more details. -> -> We recommend not to consider Kafka Sink *exactly-once* guarantees as a default setting for all sinks to Kafka. -> Make sure you understand the implications before enabling it. Refer to the [Flink Kafka sink documentation](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/connectors/datastream/kafka/#fault-tolerance) for details. - Note that the old [`FlinkKafkaConsumer`](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/connectors/datastream/kafka/#kafka-sourcefunction) and [`FlinkKafkaProducer`](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/connectors/datastream/kafka/#kafka-producer) were removed in Flink 1.17 and 1.15, respectively. -## Runtime configuration +### Runtime configuration When running on Amazon Managed Service for Apache Flink the runtime configuration is read from *Runtime Properties*. @@ -39,32 +30,42 @@ When running locally, the configuration is read from the [`resources/flink-appli Runtime parameters: -| Group ID | Key | Description | -|-----------|---------------------|-----------------------------------| -| `Input0` | `bootstrap.servers` | Source cluster boostrap servers. | -| `Input0` | `topic` | Source topic (default: `source`). | -| `Input0` | `group.id` | Source group id (default: `my-group`) | -| `Output0` | `bootstrap.servers` | Destination cluster bootstrap servers. | +| Group ID | Key | Description | +|-----------|---------------------|---------------------------------------------| +| `Input0` | `bootstrap.servers` | Source cluster boostrap servers. | +| `Input0` | `topic` | Source topic (default: `source`). | +| `Input0` | `group.id` | Source group id (default: `my-group`) | +| `Output0` | `bootstrap.servers` | Destination cluster bootstrap servers. | | `Output0` | `topic` | Destination topic (default: `destination`). | -| `Output0` | `transaction.timeout.ms` | Sink transaction timeout (default: `1000`) | If you are connecting with no-auth and no SSL, above will work. Else you need additional configuration for both source and sink. -### For IAM Auth +#### For IAM Auth When using IAM Auth, the following Runtime Properties are expected at the Group ID `AuthProperties`: -* `sasl.mechanism` = `AWS_MSK_IAM -* `sasl.client.callback.handler.class` software.amazon.msk.auth.iam.IAMClientCallbackHandler -* `sasl.jaas.config` "software.amazon.msk.auth.iam.IAMLoginModule required;" -* `security.protocol` SASL_SSL +* `sasl.mechanism` = `AWS_MSK_IAM` +* `sasl.client.callback.handler.class` = `software.amazon.msk.auth.iam.IAMClientCallbackHandler` +* `sasl.jaas.config` = `software.amazon.msk.auth.iam.IAMLoginModule required;` +* `security.protocol` = `SASL_SSL` + +The properties in the `AuthProperties` group are passed to both Kafka Source and Kafka Sink configurations. + +### Data Generator +To generate the JSON data expected by this example, you can use the Python [data-generator](../../python/data-generator) +script you can find in the Python examples. -## Running locally in IntelliJ +Alternatively, you can use the [Flink DataGenerator](../FlinkDataGenerator) application, which generates the same schema. -> Due to MSK VPC networking, to run this example on your machine you need to set up network connectivity to the VPC where MSK is deployed, for example with a VPN. -> Alternatively, you can use a local Kafka installation, for example in a container. -> Setting up the connectivity or a local containerized Kafka depends on your set up and is out of scope for this example. +### Running locally in IntelliJ + +To run the example locally we provide a [docker-compose](docker/docker-compose.yml) file which starts a local Kafka cluster +with 3 brokers on `locakhost:9092`, `locakhost:9093`, and `locakhost:9094`. +It also runs a Kafka UI responding on `http://localhost:8080`. You can run this example directly in IntelliJ, without any local Flink cluster or local Flink installation. +Note that you can run both the [Flink DataGenerator](../FlinkDataGenerator) and this example locally, in the IDE, to observe +data being consumed and re-published to Kafka. + See [Running examples locally](../running-examples-locally.md) for details. diff --git a/java/KafkaConnectors/docker/docker-compose.yml b/java/KafkaConnectors/docker/docker-compose.yml new file mode 100644 index 00000000..14a518aa --- /dev/null +++ b/java/KafkaConnectors/docker/docker-compose.yml @@ -0,0 +1,74 @@ +version: '3.8' + +services: + zookeeper: + image: confluentinc/cp-zookeeper:7.4.0 + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + + kafka1: + image: confluentinc/cp-kafka:7.4.0 + depends_on: + - zookeeper + ports: + - "9092:9092" + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29092,PLAINTEXT_HOST://0.0.0.0:9092 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:29092,PLAINTEXT_HOST://localhost:9092 + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 + KAFKA_DEFAULT_REPLICATION_FACTOR: 3 + KAFKA_NUM_PARTITIONS: 3 + + kafka2: + image: confluentinc/cp-kafka:7.4.0 + depends_on: + - zookeeper + ports: + - "9093:9093" + environment: + KAFKA_BROKER_ID: 2 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29093,PLAINTEXT_HOST://0.0.0.0:9093 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:29093,PLAINTEXT_HOST://localhost:9093 + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 + KAFKA_DEFAULT_REPLICATION_FACTOR: 3 + KAFKA_NUM_PARTITIONS: 3 + + kafka3: + image: confluentinc/cp-kafka:7.4.0 + depends_on: + - zookeeper + ports: + - "9094:9094" + environment: + KAFKA_BROKER_ID: 3 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9094 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:29094,PLAINTEXT_HOST://localhost:9094 + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 + KAFKA_DEFAULT_REPLICATION_FACTOR: 3 + KAFKA_NUM_PARTITIONS: 3 + + kafka-ui: + image: provectuslabs/kafka-ui:latest + depends_on: + - kafka1 + - kafka2 + - kafka3 + ports: + - "8080:8080" + environment: + KAFKA_CLUSTERS_0_NAME: local + KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka1:29092,kafka2:29093,kafka3:29094 diff --git a/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/KafkaStreamingJob.java b/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/KafkaStreamingJob.java index 7fb92069..b45ff353 100644 --- a/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/KafkaStreamingJob.java +++ b/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/KafkaStreamingJob.java @@ -1,9 +1,9 @@ package com.amazonaws.services.msf; import com.amazonaws.services.kinesisanalytics.runtime.KinesisAnalyticsRuntime; +import com.amazonaws.services.msf.domain.StockPrice; import org.apache.flink.api.common.eventtime.WatermarkStrategy; import org.apache.flink.api.common.serialization.DeserializationSchema; -import org.apache.flink.api.common.serialization.SerializationSchema; import org.apache.flink.connector.base.DeliveryGuarantee; import org.apache.flink.connector.kafka.sink.KafkaRecordSerializationSchema; import org.apache.flink.connector.kafka.sink.KafkaSink; @@ -76,7 +76,7 @@ private static KafkaSink createKafkaSink(Properties outputProperties, Kaf .setBootstrapServers(outputProperties.getProperty("bootstrap.servers")) .setKafkaProducerConfig(outputProperties) .setRecordSerializer(recordSerializationSchema) - .setDeliveryGuarantee(DeliveryGuarantee.EXACTLY_ONCE) + .setDeliveryGuarantee(DeliveryGuarantee.AT_LEAST_ONCE) .build(); } @@ -89,7 +89,13 @@ private static Properties mergeProperties(Properties properties, Properties auth public static void main(String[] args) throws Exception { // Set up the streaming execution environment final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - env.enableCheckpointing(1000); + + if( isLocal(env)) { + env.enableCheckpointing(10_000); + env.setParallelism(3); + } + + // Load the application properties final Map applicationProperties = loadApplicationProperties(env); @@ -104,10 +110,10 @@ public static void main(String[] args) throws Exception { Properties outputProperties = mergeProperties(applicationProperties.get("Output0"), authProperties); // Create and add the Source - KafkaSource source = createKafkaSource(inputProperties, new JsonDeserializationSchema<>(Stock.class)); - DataStream input = env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka source"); + KafkaSource source = createKafkaSource(inputProperties, new JsonDeserializationSchema<>(StockPrice.class)); + DataStream input = env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka source"); - KafkaRecordSerializationSchema recordSerializationSchema = KafkaRecordSerializationSchema.builder() + KafkaRecordSerializationSchema recordSerializationSchema = KafkaRecordSerializationSchema.builder() .setTopic(outputProperties.getProperty("topic", DEFAULT_SINK_TOPIC)) // Use a field as kafka record key // Define no keySerializationSchema to publish kafka records with no key @@ -118,7 +124,7 @@ public static void main(String[] args) throws Exception { // Create and add the Sink - KafkaSink sink = createKafkaSink(outputProperties, recordSerializationSchema); + KafkaSink sink = createKafkaSink(outputProperties, recordSerializationSchema); input.sinkTo(sink); env.execute("Flink Kafka Source and Sink examples"); diff --git a/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/Stock.java b/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/Stock.java deleted file mode 100644 index dc84f43f..00000000 --- a/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/Stock.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.amazonaws.services.msf; - -import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.annotation.JsonProperty; - -public class Stock { - @JsonProperty("event_time") - private String eventTime; - private String ticker; - private float price; - - public Stock() {} - - public String getEventTime() { - return eventTime; - } - - public void setEventTime(String eventTime) { - this.eventTime = eventTime; - } - - public String getTicker() { - return ticker; - } - - public void setTicker(String ticker) { - this.ticker = ticker; - } - - public float getPrice() { - return price; - } - - public void setPrice(float price) { - this.price = price; - } - - @Override - public String toString() { - return "Stock{" + - "event_time='" + eventTime + '\'' + - ", ticker='" + ticker + '\'' + - ", price=" + price + - '}'; - } -} diff --git a/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/domain/StockPrice.java b/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/domain/StockPrice.java new file mode 100644 index 00000000..f1590365 --- /dev/null +++ b/java/KafkaConnectors/src/main/java/com/amazonaws/services/msf/domain/StockPrice.java @@ -0,0 +1,70 @@ +package com.amazonaws.services.msf.domain; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +public class StockPrice { + // This annotation as well as the associated jackson2 import is needed to correctly map the JSON input key to the + // appropriate POJO property name to ensure event_time isn't missed in serialization and deserialization + @JsonProperty("event_time") + private String eventTime; + private String ticker; + private float price; + + public StockPrice() {} + + public StockPrice(String eventTime, String ticker, float price) { + this.eventTime = eventTime; + this.ticker = ticker; + this.price = price; + } + + public String getEventTime() { + return eventTime; + } + + public void setEventTime(String eventTime) { + this.eventTime = eventTime; + } + + public String getTicker() { + return ticker; + } + + public void setTicker(String ticker) { + this.ticker = ticker; + } + + public float getPrice() { + return price; + } + + public void setPrice(float price) { + this.price = price; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StockPrice stock = (StockPrice) o; + return Float.compare(stock.price, price) == 0 && + Objects.equals(eventTime, stock.eventTime) && + Objects.equals(ticker, stock.ticker); + } + + @Override + public int hashCode() { + return Objects.hash(eventTime, ticker, price); + } + + @Override + public String toString() { + return "Stock{" + + "event_time='" + eventTime + '\'' + + ", ticker='" + ticker + '\'' + + ", price=" + price + + '}'; + } +} diff --git a/java/KafkaConnectors/src/main/resources/flink-application-properties-dev.json b/java/KafkaConnectors/src/main/resources/flink-application-properties-dev.json index 91f2034d..54265a2f 100644 --- a/java/KafkaConnectors/src/main/resources/flink-application-properties-dev.json +++ b/java/KafkaConnectors/src/main/resources/flink-application-properties-dev.json @@ -2,28 +2,16 @@ { "PropertyGroupId": "Input0", "PropertyMap": { - "bootstrap.servers": "", - "topic": "", - "group.id": "" + "bootstrap.servers": "localhost:9092", + "topic": "stock-prices", + "group.id": "flink-kafka-example" } }, { "PropertyGroupId": "Output0", "PropertyMap": { - "bootstrap.servers": "", - "topic": "", - "transaction.timeout.ms": "1000" - } - }, - { - "PropertyGroupId": "AuthProperties", - "PropertyMap": { - "sasl.mechanism": "AWS_MSK_IAM", - "sasl.client.callback.handler.class": "software.amazon.msk.auth.iam.IAMClientCallbackHandler", - "sasl.jaas.config": "software.amazon.msk.auth.iam.IAMLoginModule required;", - "security.protocol": "SASL_SSL", - "ssl.truststore.location": "/usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts", - "ssl.truststore.password": "changeit" + "bootstrap.servers": "localhost:9092", + "topic": "stock-prices-out" } } ] \ No newline at end of file