From 0c52b95ff2465def4385c81e686cd0a4da72136d Mon Sep 17 00:00:00 2001 From: Preethi G Date: Fri, 6 Sep 2019 15:09:40 -0700 Subject: [PATCH] Removed OSCache. Using EHCache and Guava instead. (#67) * Gateway HA implementation * perf: Utilize EHCache and Guava cache only * fix: changes after review * docs: update gateway-ha README.md * fix: updated after review * fix: replaced cacheDir with gatewayStateDir --- README.md | 154 +----------- docs/assets/prestogateway_ha_admin.png | Bin 0 -> 159643 bytes gateway-ha/README.md | 234 +++++++++++++++++- gateway-ha/gateway-ha-config.yml | 1 - gateway-ha/pom.xml | 20 +- .../ha/module/HaGatewayProviderModule.java | 3 +- .../gateway/ha/router/HaRoutingManager.java | 6 +- .../src/main/resources/activejdbc.properties | 3 +- .../main/resources/template/admin-view.ftl | 1 - .../ha/router/TestQueryHistoryManager.java | 7 +- .../test/resources/test-config-template.yml | 1 - gateway/README.md | 168 +++++++++++++ gateway/pom.xml | 6 - .../config/RequestRouterConfiguration.java | 3 +- .../gateway/module/GatewayProviderModule.java | 4 +- .../data/gateway/router/RoutingManager.java | 58 ++--- .../router/impl/DefaultRoutingManager.java | 2 +- .../src/main/resources/config.yml.template | 2 +- .../lyft/data/gateway/GatewayTestUtil.java | 2 +- .../test/resources/test_config_template.yaml | 2 +- 20 files changed, 454 insertions(+), 223 deletions(-) create mode 100644 docs/assets/prestogateway_ha_admin.png create mode 100644 gateway/README.md diff --git a/README.md b/README.md index 1cfa00df..5e2c1add 100644 --- a/README.md +++ b/README.md @@ -1,155 +1,21 @@ # presto-gateway -A load balancer / proxy / gateway for presto compute engine. - -## Getting Started - -### Build and run -run `mvn clean install` to build `presto-gateway` -Edit the [config file](gateway/src/main/resources/config.yml.template) and update backend urls +A load balancer / proxy / gateway for presto compute engine. -``` -cd gateway/target/ -java -jar gateway-{{VERSION}}-jar-with-dependencies.jar server ../src/presto-gateway/gateway/src/main/resources/config.yml.template -``` -Now you can access load balanced presto at localhost:8080 port. We will refer to this as `prestogateway.lyft.com` - -### Query History UI - check query plans etc. -PrestoGateway records history of recent queries and displays links to check query details page in respective presto cluster. -![prestogateway.lyft.com](docs/assets/prestogateway_query_history.png) +## Getting started -### Adhoc vs Scheduled query routing -In the [config](gateway/src/main/resources/config.yml.template) -you can specify if a backend cluster is a part of a routing group. -If not specified, cluster will be part of `adhoc` routing group by default. +Presto Gateway can be deployed as a standalone stateless service or with high availability and external database. For help with setting up a standalone gateway service, please visit [Standalone Gateway](/gateway/#standalone-gateway). For help with setting up a gateway service with high availability, please visit [Gateway-HA](/gateway-ha#gateway-ha). -PrestoGateway router will route any request to `scheduled` group of clusters if request contains header `X-Presto-Routing-Group: scheduled` and there are clusters present with config `routingGroup: scheduled`. +For further information regarding the design of the gateway, please visit the [Gateway Design Document](/docs/design.md) -If no matching `routingGroup` found, router will route to `adhoc` group of clusters. Please make sure there are clusters under `adhoc` routing group. ## Gateway API -### Get all backends behind the gateway - -`curl -X GET prestogateway.lyft.com/gateway/backend/all | python -m json.tool` -``` -[ - { - "active": true, - "includeInRouter": true, - "localPort": 8081, - "name": "presto1", - "proxyTo": "http://presto1.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8083, - "name": "presto3", - "proxyTo": "http://presto3.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8082, - "name": "presto2", - "proxyTo": "http://presto2.lyft.com", - "routingGroup": "adhoc" - } -] -``` - -### Get active backends behind the Gateway - -`curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool` -``` -[ - { - "active": true, - "includeInRouter": true, - "localPort": 8081, - "name": "presto1", - "proxyTo": "http://presto1.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8082, - "name": "presto2", - "proxyTo": "http://presto2.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8083, - "name": "presto3", - "proxyTo": "http://presto3.lyft.com", - "routingGroup": "adhoc" - } -] -``` -### Deactivate a backend - -`curl -X POST prestogateway.lyft.com/gateway/backend/deactivate/presto2` - -Verify this by calling get active backends -``` -curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool -[ - { - "active": true, - "includeInRouter": true, - "localPort": 8081, - "name": "presto1", - "proxyTo": "http://presto1.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8083, - "name": "presto3", - "proxyTo": "http://presto3.lyft.com", - "routingGroup": "adhoc" - } -] -``` -### Activate a backend - -curl -X POST prestogateway.lyft.com/gateway/backend/activate/presto2 + * [Get all backends behind the gateway](/gateway/#get-all-backends-behind-the-gateway) + * [Get active backends behind the Gateway](/gateway/#get-active-backends-behind-the-gateway) + * [Deactivate a backend](/gateway/#deactivate-a-backend) + * [Activate a backend](/gateway/#activate-a-backend) -Verify this by calling get active backends -``` -curl -X GET localhost:8090/gateway/backend/active | python -m json.tool +## Contributing -[ - { - "active": true, - "includeInRouter": true, - "localPort": 8081, - "name": "presto1", - "proxyTo": "http://presto1.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8082, - "name": "presto2", - "proxyTo": "http://presto2.lyft.com", - "routingGroup": "adhoc" - }, - { - "active": true, - "includeInRouter": true, - "localPort": 8083, - "name": "presto3", - "proxyTo": "http://presto3.lyft.com", - "routingGroup": "adhoc" - } -] -``` +Want to help build Presto Gateway? Check out our [contributing documentation](CONTRIBUTING.md) diff --git a/docs/assets/prestogateway_ha_admin.png b/docs/assets/prestogateway_ha_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..74a595d6013df4b6dcb50683ed63e87dbdd7b421 GIT binary patch literal 159643 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

LnH4rm zCMO&uHQM}QD~E^x9dHRxeeWV!9cPc}*FZT5az>%5grvexK&IvOks}R+FMx@wdiPP9GKEdg` zS1WV$3btCp%B_KE#bOyIMq=P;#Q7-{UXoi@xn3ctz8$6S;>d3_I%9_+}R z*C-3r3qTg#>dx1K>SUzKB{d;K?^Ey9%_{WinhFAd!xQl+!JW`1N@*;!IaX{1|QTP(l z+MVYC2y~OH&tYC_3$-0swm*N}5AiM6O}i+&Jb&4$M^ljUi9Al#95!Q0$XXnw{fCw$n3!2XK+7Ww$=X- z%!n}Ef*P=tuAXs@u__UE5od#FOZ{IbQWrm~N5LWx=_t(%TM%)nAt+8BJL%8Dmv2eK z<$&j>W?d}S6Z^-O3nfSoN2K~gHs&8LCRy(xdCBStxZ%?^--$3^&ozZ4}jGo6$D0pRL0atA=TVWa`+ zSLTA{R9p1`5@>SH-+Sy!!?m)<**8hj{k zH3zoDN5?16`0X>6nDRA@D8w4}*-QUgWx9^R2s*#1`tuO;9wzvj3fSpF+NnY9a36f% zp0OP8_KQS;5SE&qACSyz-SXRceOnQjW`_K7gXzPpc?|I-A!NxA#lDju!lad{3?`r< z6jk8I=M|~Ure8&3zWp8IKYV+;hwi8XTu?#KfPm^Q0NXu?(Q&n&!awTfi&&q2D(m8G zIUS!?G0bLyB5+yD{)8pM-5VVp7-_=!3lhJq;8Jn>o;&i}PIFPs`SpFHi6U3Wz1@}- zgWcy60ZF`tru*y3hG)wTuU{K`QY~Qoz1GG+b_eSyA~Y)yEgX2et02><=ebi_{k(Ie zF5rMy-E!k$h5-w=GPp(J@)bJ=KwlqK;*qb&Jwyyc0hKo=){2H7KMEMK}@)8xRm_q*FvBq(MRH?vNCa?v^g; zZc##7Kw^_hNP~3Orlh4CzPZkG&Qag@IljNYzA+dMRM=~-Iq!MTJFe@Rg^$fB&&jT; zsdq5fJrw$LVs0QKq0eVDV1SD9rC z>*Wju8|>W=6fz_UAoAEL!0OHef5UqS$W&Du6%##LpvY6Cg0@6#g)>VwY$t!i{ofvCOA*~%p1-REC7ziI)tVA z1*258ycklso=SWcMC@zdfFm?2lK{Ps{SXv6-~hKb24>a5zWd>nokHb+^dmT{`-+4` z{qfQoZeN21j=|s0`&WdW;2Siso;0uM{9jFKGkP3>Pfuj>g(z5k56{}i!6knp3oD|R zAA}_AbCLfI;`z_eyy^iZb2|Pbp_wcUaPPyXs;uX0JHJ0~^51uH`|gm@K6DD`m#QXg z)6YC1W|b>AMm2I*m(pAxA5;JP3H+ac%B!9RJYb}m5bIy#++WQ7#P^D~Q@XAZ z?Em`U|GXN2BB3JOrBb&4?`4OU;f)L`Sb8+0KmOGd{_;8h{|(+tNaDW{cYPcRqjwrX zV-}GO>X)2$-()#QG;QHvk9f*|`8@vbKpwEb=Sg5D8|wKaF_B=mQIV;91pt(Ea|RH1 zAt$qb-wX5%dm#6OIdKoloND!%lh~4P5&SgPa&#FHb z*{1(ZqNVI~4;NYqz5dy|SICx~$T zy<2}3_UcnJbwu!-&iSfJ2`sIuQvYoz3)aBE$UQ2t0xX)d^mGvfQ)9xzhfRlQRmRxGnMr^aQ5^wC z*e(&LUUOiz+x@apNLPcay#PFA z&GnhYY1YdmPGH18VN&=Ml&#BVY86!A7=(bW%hm)Aw;`52af0)pR}Z~S=Hnl#eX~@5 zv;t1cJ+_t-9Ls<^_P^a)bz*N6VV3}4Ublakz^0FA`xkz2|AgKmR6WZnNP&vq}j?VfnE7 zCd5=Gx^E!f#z1T+RS!_okIk&r20{Pb)sLsno+46F&qN#$Q!fF+X9{q2-E%@wOSw`N zqcrtBw_Im-dsXVkC=JO=6gJB|4{K)NO3G?2=G80N7GN(+=MSc0J;*L~BjvGs4<=w^ zb@)ELF)?TsZ32!%Fe*5dnJU4*x2)}n_71cV=&VzTcO~Pv>=(7n3U6W`h|&sjQYQ;v)Q0ug3v*x4;$g* zUTJ4PTGP24$EpLEoqYrJx?yD^#yvj86R=?wZi~&Vijg`u|4Bg)qD=!Y{xO8evbN8X z(i!mA&j*1ZTeH+LE-9j^NXWvEl3%>X5GS7T6uL1GjOILkB5Rx=yzNkXyp=)!1`=M)tyjMKAxVJ&|w4!5;6*$A3=M= zv#upW&jo-{&n-aK81B9|+%8Da3=Sqkvg>@RoYD*clF!3AY1MS33SbOm;*yK2YNS^; zYqt1%k%V~paki-ln(=1T=1^RcTuyFK1|IHV+D%^okojH)K4`=xR!h532C{ zr>B*WMuVmM8lcQj$I)#-hr46)%hIP>W1zY1=R)Z&)=3k`=9Ab>KZ0;t-;k(;(2y^0Xg+}5^>O)SIW9fmXVD5NFATsbNK zz5+Nur$}A{hA+D#4Hx@XYFxvn962|y1Ya#QRy))M;v;*c*PC@N_xSgf`|F&5;0B)< zTi<#AqrLKC_wL?|A!|eGVh>WM*{hDAg~sD9a?3)fw;qwVmMEbgC~-9Dak{}+bGcsD zn}WQh16c1C`GplW5KSt>LMHw5S2d>#mpdY70Oz-NxD5`_okNMOB}w+~TmB|4P^7nF zK+gxAMXVm%AtfHPY|Z<;E6D}MI_^-nzNFy^?a5L*dmBhG5unaLT`}(O0cFB_m}VPy zTmh2d=3~EkkXx@q;uI&fO;`exmY;Y)5}Mi*%Y)s#zxfSr&XMYIvLeM9ND)~1EZXI_ zAvQm`ZlgLyVysQKKl6Dd5EdDfL}eV@T4*eIYX-s#)s@@NU*gW1(I|4RdjOCk^WJkk zlcp1zxS=le4_|3s6NJ$;4@v5pj)tRiaF%^DAB{gbn?9^pVZX|MVB9Fv?c15XF*uB% zZUr2?Gr*0v5 zj4LnGd*Y&-(NvE}j=tV71_}(qmmBy0WcTPCk5&(#vtd`<^Jh5#kh*>csC=L`^@Px9 zNPS#}KOTZCW=$oas?SDNVvHmeZz^#PfFM(aovmT+41}o5Nt+sF21qZ>SF+++_Oe`w zmWtm6z4KcGdHDMxjR{SKvTnL^Kn?y7SJAuXaB^e#<_khdD&S0@Y_HgUXA9)K?-M!0 z8pj)}%@v+@i;nxBuTBv^e5smIR|H&T?>NK?Iz6atAnDvW9(#hNV?@MaiXT#Q@Q&>K zy%AA_-ub<7Aa}A{&ud9mB*k0ohG}jq){VUBZ{`Hpf9GzU^#Kq&Bv#??}FPfToFEs7(tviD_XDl1X0#&sx7MOTHw$=AredF^T6HsBS97g$6$_EQJxM z<1GxUtPNM0GID->Mq}!XdC_?B&LP*ZmTOVD18m`U1zS?H)&ayefyG9M1O+!uwdWuV zo7x0W8KwvE_KQHd18>)&ZeQ6lm54nGmycivpFDpWFaZuh+_I>;2)dxrl?SnpKaA(J z`*t~T8??c40Ixh{)ACL)zvBJAfp$~AOzDKY(6j(u^E)RzAnX7D*Y0;rE8P8j{c=x< z$LqxOm^rsyXbe*CL`?_asc5okx^&vAMdds#DFy;iYg`vX*GU!(ZWcJo_0C&*o=zNT z=B1{!LrY}E+J7<59l!rUuc5OWn20SkzMeBswIL{2whv#36de9y_;mW#-ev>HqUw(T zY1FQ?;-ZnDes-&_z$2Us5m=o~V{^Lik5nfjaNI6~t{+fZYf;lX3x1NgI`7dzv#_RZ zMK`*=`w}5kWz*30LO~xZ{Zi3Qm*$uOggo3MM?z-9W|}852jO_is-IoUBd#NF_&grgA!K*hsHlrCY$y{G9P?A93eDD99Op_drgo^Ktw$=o?I zh^`cu=IpXw(u(e$I|Cr)ti{Tm%zoYGc3P>@_vIywY}vF%9w)}u!t=xS4W644VVlzI zjTGL!r|!N#|@)cByQ`dSZVWiwveo0}rQl`STgD z4C(uu?^)f6Y%r{BEvk?A3_o}~; zy89m@=cW1|u2>k+r^I)j3h~Hbh{&;XZk9u#FU{K0Ag*^U`@%-~#m93HCT%k3Zq@Gg zjH?-^Dj9PWRXdY?7Utc%YxdHXO{Yv2nZp@1QYAz-``uF9L548}^GJ&MU4P5sLk`ai zNP>i5e8MOqDQKqzOUlYTJM)GCT9OqYS*kEYo@$Pd z0CoZHny-D*qPf--L}DsQYZ)kF#3DTQ_r8BP0(WA}_>i*#w1~oXp`f3krn5E9%rvOZ zxnnITR4rx%E!7B{wDsoM&P}Y<8eBH{&37W{JQa5XIrWn)NKxI_)C!;FPME_@x1M&S z@84J1&G0O14&4f0%5`ij@Ds6~dvELvwAvW%4Y(KN>AcXijttJkU#|J6Jm!yICe1n+ zE11TwU{j|PtH_B}7=eK>nE-J^>4&Af>Qr8z6)qkuZ{r$7?owtb%84;4@v5)3`IDz8 zW_}u|`rkAW)=mT;3CUyp-nHx$wd1+Gf2U7}(fZLdXw$}rtfNtmC{CDcsqd|9Jt$Z- z-$y$^5RR|BH*@pG>J10EU9d2y@W&H*#z?X#7Ie{aY`r6#W! zP|PTLhLhP9YkiB=J1~-rTD?8^gWP?Bwh}Tm4`ph#)aCPZ+aB($Ar0(i>I38uiy+yh z(wdK~h87^K@+(mikXo5kq?s#WXkX>f3K&k$QM|3F)grWM@~n^%RHFJiHaj-g0C-ML zMMqD$8WXL}Fjvwb#_&a2$Lb>J<=cj9Cx|@qc4E&Cj!i3)S%wED_t2s?AtoWRV@`_A zGsF1n#8!gO)0UzdN{i5M>2vGEGX*|+s(1UO|B-wwRn=M@s=Yl#7C;~B4t30^T~CxC z%4{q+F|)J0b;w6jBY=*`jnJ_706K3i_7GJ;?nWH7v+B$pvjXhhT@QmolGT-jc))Th zXxz2Yf+SZ;u*{Lr?H35i_X=H^S?^>p@#SfsFtx3T)5#Pzl?PES}+cltkpR6Cotyino zLQcl-=A_-Nll*;7(w8}g-l$0L#&T}#ZA36Dk)9%BT8SR63U$kYw7zG4ni^|0kV6^Z zR5LFhN`ccHEQ1)<_%+HVd+Ft<5fa(5N=X~2tV)r^yMt9?9F%{(VaMB|^ssYAIMsor zYq2^Ui+DWY6k(Qns$D*~2t zxkJunT`a>4X^(A4r3$zY4x?mp?LZ1rjP*?1>|pAm+oKd?e_$CC@oJKaX>LauCz;Ub zNU?cK5o1d6@Q^}i)6or@!1yn56`=%v3GH_zw+2DOMT5I2O`uMH37>yhZql;F!h)0D z$TqOtg6L|BIr{tcM&$3piE4R}8c@$NebGK;2os_!cuZ%)A7*S(im|^N0?GT(OS_00 z;c0Q#o8PfIsqi)McA}VeYTH^MykXuXH^W2S!nb8~zZm_ZW@n!4a?~;ZaD`FlI9Nac z#8Rn27Z;ja2S9yDk;ks;kVg2_1~(jIU-*W#;VO61%hGoAMGAph+Y=g1P#diebADrm z@6niU#)9Afw#dAVYwxRwzMBp1bSm8F@Ntv>&0S9nd@VaUvQFN?t-aBK+X&D!bD0nc zIF%iWxQ$RUX#1_1NFpP_g{Qx%52t<}AJ4wSj54qbK=TDfA%mqng%hjr$&P(gh@K6NuS$(Qht(rO$wYpEL16GpG9 z7wz;Y($up|SvFJyD;pm;wimH2+~Je4i7vdaR^K69oa+W4ZZ~>J>=~dgyzXsh?6{~8lT0FO!*>Y6s*KPepQy|eNSt7_C_zwNzv)!+RZ zg(Ja)T_$ydUN!6zLC_Fr_#d*Gv~r%aX^XHM=r;!9 z=Yq7n8iG4?<8(ZnjZ1nl%*RV$z08G%B$nHr80YqSsS~&u+scWn+F;c}t&7YG%j0UmJI|L( z59@fkI|9rO9Fp$H$ng?>_Xh#o@5m%46`%RlfDwVVQ$|@;H$dJ7a@huv0%F<6gUR_< z=F-+Qfyx}Yot0cG(rI|Y{o{sICvzE<0MU2US%bhvqFRB?Ewbk!nep`4=pOZiPs z3y|K>o8N~qH8UId47lE5Dv}_GGRVe9fJ$B=hBg@!vCy7oq+)mu;M1l4*=jA8strBn zK?4xhz(?-+`Td{_HXmZw%d}YuB<0>812ve5ufo%swXIu)LCa79%mEM#UVe0{yeTE! z>n5Wh!`#eKUmx2_;;1>0+a?iMf3+J2AJL5}hxuQNcK@kh!M=$grJ8P)UND!v_?SCl z5SyC)E{umk9VKrPx#wfm{H_r`0?ttim)>$J7`!iURs~jsXOrww4(y6wo>!0q*1!+c&+ySo6PTguBUK_g7C z6xX0*XdVMKmv4=mNClhENLK?~0EYYC0vu{IVYr9h;mBK2w87ZEk98{}+Dn(h!lD`D z22-Rd`)R$Jc|)-j4qR>`d)ed%50oE&&#A@5OO$;viRD-5xh7vjAc^d|JCN%GzqC?OPN z&1V|&Yz1}Nnd6}KHi7t4oBMib8JL%r>ZL;R;hVO}o)^bvHaY3N#Zzk*Xo%cVvf%{M z?rTDwwvS=OuCeXEt;tC~Ktd660})x?Qv(ayDUgE8?TNSeDDL$zb54}Y7beND3-N~Y zodYq8lDz!ver5pi{4I3Gsi|ZoQ+;^ED|Yq=)L1y?G(OtD=jyT_YmLX&DVJNSBnQ9SplWkmP31t z=CWt6^)_Pe{6XbmEW-58kICmbD z+cmj8c;c9ua5+1JE8cGz8Sm|?S2~?RX zhN^hhXZMPg)9cQTJwb6~JZTrGgeu+E&_*@znlz2lzXu@7k}hu%bhd zi|04GZ2?avcz4i|=XIez!@36XZW6C^<{}TI*r|UCit5EhyoEDTLYkhZMu0HQ<)BNV zS)ViikVgzw>>|1|natnvWpv#u?lLmj*WK(iPr6!JD=T!H>-nOw8gvpgK;r18*#fpUdE zcmgQRYABbpY(X7M+n5%kBpPZV&9!;}q(DDZyWw*M5%(N1j%5F;X|gn@o*1 zBJ>rb)nV$JnUClTqA=Q2JNdE<_hZ1+(u^iLX~Ea%(plad8PX}cz2zeXi!ZmGrF(t? z8e2tE&daGBb)Epa@|Xz&Y-3HN0=@Sj%U$%>MyyG3PANvydbwTmU0rB2mjM#UXY*u! z)_Ww6KwH7A0hH~}*~+a(+^Fs^+lq6)?*Z+NZxd!Bg7u%DA-PQR*KKB#7kTsofk~u! z(EQ4tJ6h3fHN{%E2Hq>17PsML+4Cu3CyRMIx@b^?t z_IZNtw4Zh3xUeUr8JbZ$6+&(raA7xCXA-CFw*8pZs=cm4wCe#7T}TU03@hH9+^;K$ z$(NT&e0HTrzvOzF4cT-z$WI^)w8^21#SS-f!`V)j{XiFxgns+It70vYVlTD^5&!BK z6r34vsgU}#IKZ}=zC?UdXf?7Jum$_kN(p`5?_$C_aeAGwtM!JrF-%Z{uLDsp`4Q7L z4YUtTb3Y|xAWmrfZ{Ep}@)+b~44p~sEd+VW$!QbWg>0ZgTCdQEdXDIho0}HYHwm9P zD6OE7v0myN&vB+N26!I0$@xd~p<~b~-${aT%wrvwi$Q|e$y7sa zqY36T%bh{N@OhXF|FJ)2Ro^9QJUYXI1wp^^nOxZ+|~s&JZiGMzK+?TTCn=@y9?>@M@x61; z6W_+7UcApdb8GTG$#d}>e8Sc_;M(`XM~vkbqoRn~>H=ZcDVn!&EcrOyWl1Y(zBz!#(FyNZ`DF3P|RvjXS<4 zJ5i?dkBBEVJU)li9HnPR)CZS98=Kyo;3UG#eyVryrrT{>KRo64?PcQcC%z@r7mu$G zzPHFX1dJaY-n-^)FUqCVS$WBhZJRiL*Xp@~OS)ILIVw--=Y9XOEig2!I-Lr$FVDqa``Eim<~w)_FX>hk7r7hlhdGQaqTo z0Ny72F;$U9JI@lW1xS&W6QoloJnfQv%npz0Wgg`yLN2xo!?DhnXL%ALq86nacaVEZ z7Nz;Z%;&MG7gHZU5G-WyY9Nxd4Y3QQRi2V|(eAfj8AE5Av}ZNgP6@6){(=j?J5t9a zfwR^0D3gsU#v!R$-J*8@?r$3u>0!8hV4 z{1(nD_i;R%b9Lpk$TeS|_S|fD2uy&AE4VYj4Ahq##N6%fTfBP+ip%0+yIjv;plDKTjW;100~72oTXRknYC zJ&}l)4Z#F5Iv}`(7iiOz` z=(t(eV$#xlgL5w>y!)hjsL?Bu)N%P@i1wrHQe3RarM) zeOOSa2j z+kxFw+7b|Cahy4RDVRxxtM}&LDl)$oK2VmKxfNNjwNhqE^z4i?@9Q^D0?0nd@Y6o6 zB&rDT%_SXn?th}yjoa$ctgL~MW{E?WpLAf1|2^dT>tAnJ{TX>JfZRy|P8HO#)G;gt zTBSV&S5rkBA3*S=9t33#075f$v!qBE#EgzIsqvbz?x_`Q3oDiR?#(|tiX)Gs-Dmx* zPB{xAE3yz~%mNMIT`|1Xn7X99-cCaBp+WyHR>?ycY7S|$CcI053Y9B}NB$)d0 z@|kVaXexS&NgV_uP@7zSke_9XW)CHO>>=N?_q*%rYJmFj6i@`mT}yiWfgq(9AZ&9y zouk^Azd)4-1+6k!d!x`bs-&g%$*vj@f=x1)G~<+fgWy+?XnC!)43)PTuJ1#X1jDK= zjYgNA@q&o+FBm}xoUbCQ_yfQV40VH|ZM{Y)wGe!wz2H--8t>_T+A{)DpH%< z^s&F~=2_aQ$-8qLO@7tg2h^mnFQv4ABnPb!5)$PWH=nN`>aoM z+a*$Z9&i@FLAW+Js*du=q$vbI@7--jF*hgv3bdXlm=Z%)co>DtE1fo{`)kxr^K7Ob zh4ij5{b7+i%QANiie|Q;xa|(mg64KFS{SA#iyo;lbCwau>7IkmOW{2wwJ*!w@8RZ$ zYY>ZI5}?I54YFpQ-9MbQ=%CMetyJ^*!4z@7_++S$gA?Vp%q=v|sXWu+R@> zXutdFVU~Cm@GN!b+1J&QI~DxW!Xp|F88lT$I_s}@r+v<=k10OQmJ)*4lLOf}ILJs> z%@g`(uGfvcj6+rA`ghGQu$gFpFfq`@ORJ{OPH1eOvPz;FZ4WI$W;-8cjkNuYLa=v9 zg>E0kB>k~6OsT=9l9@u)`w%q$r=B`8S4R4+f(&84(8KUKgG%QeSLo^qc(|eLJ! z{hoR>=CTnJRzYJp;mySwxjB-CUd)G6&+ymAFw&=zG^WGTDC$&PXbiWDmf0MK(kuJQ z)AZH)It%MBR_bC~c2w$j@I2F9cP~0HyuQS&o#bXGbuiZ-A*RtE-OQJLxLnF>PA8`W zx@pEbL<)O+vhugDZ^s)4D<{P4&(Iaq_Uc+Chs8SGZH!h{`+(W1b&_d6qsIK3=wQzh z@K~HK(^$%U1ZQBQdLhiU`wazWiyW_zf%^If9F_XXDzG8fo$-ojDUbj^*!FPBFV(j`1=aGU8!HjOc zh#V}Uhh0(v=X-UCr8W0xII#91B}( z5w7gn1}NjSLfO#t9XCiWT^KO5(pEq(icDY{&_k9X?f9Z_sQ{nwS4_TSo@drMqpO)u z!(Zw7vjXt31wc-v@8S1?3qyWW=Q>XTSZ09+A<1G#)D#FG2>@Wl>uvyy?g*uihTJGH zy1V4h-9Wlx0jN9{;3^#HxaQ2yV!D74VgWEb_96k8_JG7eAbd1i(^7!?8{hQ@HUQ-d z*|DoVTSEqStr!AW&!N&oC-7F2pqMVNCJk<9`Q2FmT&b^@&?;ZLHs5gd`UFALdVt<^ ze;UA1-LC{_rkJ=$=X(6=nohN9 zM6-xhQeHub+x@@X6eY<7J`gvAcm4na34-%0Od7XbO#_Xola`bO6M$#RaD5$ zXMTE1I(!f5e=oo%Dw)|YB1TMxAHWR9FGc^lMtl5T0FMhly#5>+b&nm)!}+@ZJ(B;m zil21J!7W#}H!012igj+kgfQ(BB!+y207`G^hhzU=-ta|;U@SSL@qO$8UCmH&^6vgG zOY)Wb>IG=6ID8~Nf zF!||c+=s)+d)R+A0I#PJg0Zq3Xm54f!PR8}$Pc+T&;6P6>)Fp>BQPSrUmlK!bmr+) zteZ7(RT$j7_G*$Y`{%{?vcP$dlUL3ChdU_0_#^|e+-!YA0U%cVy~KcP2X2|uJd7Ut z2+cpA_TbNafKP8Alc2M>8}jOtC^h(2ZkwI!=b0X-1ha_G!hm%jn(1}_zb?W%@?1|v zslrn_{4$ay5dlNPzKV?^dE?f#WE@<%muL52XPIn*qK~ssu+MkBg3)likPe}h-3)T%>#buiGdsB0;3inAbuE-aq7sC@GGK4WNztj}D6Zn5 zijv29A4O41WLnPD-*?>9{Oo+VIkgA~mRN%%OOaR5B7XWpCKnXqy+Ul1#p_jtf#8to zEqv3X;ZC(UXY=YmAN<#!5$}=d0%=#fKIl+I@FMF`2g;=JssWCakpRrHcH7@>eYB4? zl;D?N0fWK?gW_R~ljK9P#%q=!=%mIP?#`jZOm~odxW${~BFasPLw@zgmpBsAt>$Rm zsL{tb;#No{ux2bWex{*3rRc@Z`20QrAQou@t`-qb<+0Cv7R!Jp?K^e%r{5;`YNiG+ zW4-Lp7sBUNg@!oZH4+aY+LiFCZT-W3Hli(pJ~7IP-`xx~Td z6eGZF;-vS|I`1yU3j3iy?R)!}TBS(S<8T25Eke)~JJ653Uati`R})@}G*s(sO9&KU zOoirOh`&Pq@kJhhDhunS_+D!+3=2#qztEjJldo3wpLxT%wb%aLB+0BoT+?})WCA6=;zy9%bQA)h#O3N7*jf$6Y!c{~vfpb~UVx#)ABx(%V zLy^VFQBa$OVd*^fc~HG7xCdzbECT+U#8r7>q+e`ff%hspf?MGFx=;^xUXSPBP*$fvhsvk#5v7sI#ypcFvGnbhz^F_>}*wpqCv5EQq|`Vv1+1L|;t&eef-M zN=OEzu0`Z+i!fD$CbAwypiII&p*tL=nSxzO91=x9&uYQDaXRWJgN_jN#(6`Y_6E1f zqQy_J3uQYg4yN6U(|nB(*&1~|$RL+8FkS87_9Ygxj9cI&thKl>QS4s5?2U|#obJwy z;}X&DuYD#&K~YpcjY{gKFH5xt325bU@kOUmL-w zZ7Qb_Jpp)YCKL>HIaj96uC80Yax)E{4J?$fmR^82K24$pc9$zeKJ0xYBXCYtZZ;x) zQ2YC(fnpR78|dv#2Xfr-cCb5nURd4T|5Gv>1dyk z=V(7|I9#ML>}JQ!NqV#4f)cb?CN=qvIA$}QWLk|%i`Y;i&he+HsXgCU9%80N2tETY zCJkqxP3Y(0W}<=Nn%wUr&SvyVKu474EkvHRR@$*B)7_OAwF~U{uI_KB9$B)?^r(dO zqnYJ=#J7qO_-;i|?IFCZID9HWCs=*`-E(W)mhkoH*VmFKYi?{=I(e+sH5Nv!5{h9~ z#dF9jkvIhn{McHrkZ*adqar%vn9KMYLI_w{7CWzBT*lG|>&t9|zDRP$!0}nuO)pTH z5#OAIE4b7GKOz=R$_#8h9`OWgJI2F}i|fY}kb7}KUdnj3R!bNgOt?kZ12y4@<=$ip zSmds&sB`Z};lRt8n68v5l?h~`S>9V%?o7`TDwhHmQ@0fK8+kLd3p?OietWsQn5_E zv#*%6sueRj+S+6h4s?3y^l#I_rGgB#E<8I+2?OC*_}Lki3nJc$omakUToy|n;oeDg zcHUWt?1*Jt%cCGGxrd^hrhN!%~q5*!qQ zue_bEaCJR%25wg?n=2wB1vO(zt9m`j?r}M5SQEQXF^u_G2E13v^fTi9rs zad?3y{66CILT9`TgHj%q^R7$5CAZjR>57$`F6Uv(41Sm3)>jRUu#5um9x+9u0|bRfTq) z%hS_?jeY9y|8a_81II^7A*d{4ie!!3933ftj_lh@x8e=ud&t2r1LYlRZqAlKKU!^`fCAT{J;s$vFnEpQo!(p z&JYZ(2e}oLa6`7#r6|J=TOaC$JTw%FTJs~{RU=gTPtVz4eURU2`qC|*7>H_^pC^lPdUe8UAkeAXH4(U5dI zeuliR5+^BftC!0~&`s>%w9>xz4LD)3*Qup{Y;>;&w6G#_kMFZWYPC)!QiY~Nc~JtM zvw@;?wJ-W8x$VBGW>Px^G)bg9L0Wls<<$AEuL~V;BlPqN*^+dR&pUK`ZG0uL3`Ql0 z)0QLEKO$QP9s}cj z>G+$m3go@9%cE%va}`ZHKg>Ns54jPqnL?FWr(QFRlrK-*7eQVByy=gz3iD)!a9B5p z870_)i80Z9Wk4)!&x`D6+uVoK3=;NoGg|l41Er_HJA?&WSyuGg{xWKD705Z*FL7JI z0)xq?i>$qvrU&|(CtNk{P__-$EUTEX5w-94ud(r}$9?p!!u{0eLkZvER&f414hLg2 z5hEuSBGx;~Q_6oSV|f$fEf=q9Y8nD{?6vI5M5X1(<19_Mjr?2Dgg(#pab5~9U^Mv= zOWWw}7CoX&$kyv*(*$rK z>5#s$`u0oFi0DR6k;{Z@8#RutS`tZc?G!tg0X0JnQJ{iUGbVsQ0MXeH+n|<#xPd zgqIdAsE+$-8U55vgqZVY3&(?~?V+4;)$hP8kY6I@#Tz;saDKET__ z!N|}4=QCXVQ|c8IYeyDIDJ;l76bSKrbw@#9oXgwwO5dl|IfN+O`YVbUaJfoYc0-$9 zQp5E#r+dsyG8X=v0#|*Ee@qKZ3n>E?kr6oe*#)K8$|(Q}70%Ff(=B~vM&cqPDPkFv zqCgzKk{J;;8cm$hUuHH|$GRyd#9K3{7XFJ1LdXEebC$Rp79;|`c?Ey(`CL2K`h<;O z+c`hHZN!rpU6#kbtf(+i#Z-xVlfm*P`#|G8D?PiWQAU@5L-8j|_yQ62XE}ij^oaN` z7(dySR~s5KZnFq>lkH-M;THYoIyUbYiCBhM^IipG*IF7cMJnCkv9awzhv3yQ!x&Z_ ze(Em)Yl+feh|T{#L~;vnuG-gTid+ z8Dcu9M+GK79^?BwEm0+&eZ)X`s+?F^>HzPhuJ^_p>=W=&`7xP-NRcp9s=xqBf06G+ zswHo6nnCKAe?TCXV25h@-HKWEjUd&Oz7~!+5fZ8+W)o7Bm1KaHfXm){9S$cqvt1ss zdUjTj88T?r6cKf>;d>t~v_~&4C0i<2rgK@p9W2%nh$;GT_Hepf?voO%UQ%laHPuh_e11{?!lQ$n39ocNK`M zbJ_2RT2guSKWhY6!Q^5E1|-r;lV^K7z4>G=Eod0#mM_Y_}1X`Ylky6oiOXXYsVRgj;C_ zF|}cF6!&POs0Y%P`w&aifp;ZO!b31yWp0dI^QQB#(ir}}(z**Yv}JjJ3hR%Mg|VCa z7(}wL<uID7z@sPGdPX3)NgV)P^_`Lx>FX#40fekJ*KzMZXFfeJ4u|NYC?av z`2ZauO<7Cx!>4~m^JNHp_t?qIW^4NESSb}+CWe<2Dq^KEYW|1khfZu&$bifmUkXH` zH9v-3zfxHTpRb^`e`rKbf@1BoOTe5!VOBvB%b{T_i|m-pDsj8_1Me4iu>%dn(N!gH z?>uSN!57Gl*v%qlky&6j^@oC)wM(`Ri~reZ5}}Q?G^Rgumm0BePp6yfE)$w(aiUqcJ=tH5C>=;ClAo;hHAA9Xq}QD^{tM!x4kwBQ4_GrL`XtUBb+y`e$@IqqkR2tgcNaS#xL z>rA5(6X^*F3FY6*QgGY_>3A&I6#2W2ei*ddOf8jb+eUE98UF2KHxQh9v`5p1-&yy% zb{$;1dpC;HQoB8#RmbgW=E~G}wa><1&Tb^qammo!{Cl?u_CWJ&yY9T4LJJ1Ay!?vq z$6)^%xL3^G+4Ao+ef5EBGYt(NO$MH92i(KNw(rk;+W$uAT5N^xXCy!@v6Z**&|`b! zROWjH!xi8(GeM5ITB}^Bz5}@A5@kl+3qa#k+2jn52ubxyUzxFtGw6G55E1h_$ud9r zfLnmu6aCcZ@6#v378z&ba*kWf+fiB!EaiapFt^c9Gx_)60@=I_u$xc!*J#ZrDwH0~ zYTdA$2gn?8&?;9PuXWzd1d7pY*|B%JTayjRGxk9{Fb@0flgvLx?>*_Owl_-zM{5iy z-5B+zkv!@C9$chW_Jq{!yHMgo^CX?eb?=)c7kCpNI7$B%OLB{W_3bHHPPI*gOf~)5 z!9O|bPv6Lgf&Yw2?tgRbEjj5exh{+c7L%&=XFC$yE1A&-BSl(l@EIVPvH(P^;-+dG zjZM$EA)0f~k z1K#XY(1dhce_sA_Oy1*sUuEA%6dm#KPTF7FNU#xFZ!3jH%$7(nMy|%C!e7qo|GWgb z7HVc5dDw^5QCe;gkwAv$$`jA5K?4<0fWnH%Ik`ZB5U=Prle0H&z&k^MZPX)2i;=w1 zGUu6kcT*W7rz>U})pofB8kN#4@CBR({*^OORcZqg4a|=mH)A09?UYDB$*|#M7=OA9 zuo3DP4Is3)0hIDwkLuXR>XaA=?e%-t0c$tlj!JhDN0y)$l6Dhr@k4xOb*j#IR+X3e z%7sZ;7vMTz0}xx6f(%CJ0&w^&w(?W6KHPl{Sn7Ejz$Bg~-Zva9Qv!*%7`@!|cmk_$ z@FfVU6#17lh|&m(xm(%&*j~=mYk`ad|NHS*^EY*KO#z+el~Xj(rL~fY_a9FMgM0pZ z{!ZzsNWs1h;-p=dI|F6va5A&$pr73G-$u~yFPMjpkV<|S3wUvq2RcW5+iee5OT!(;w!nyP+qL5 zby5@U4y%7xOw%R0~T!cJ}@HaLX24Vc#A>A%ZN%=_43y4H4Kq z_GJ$MOfM2NZ&g5PGC9lC0eO2UUj-bV8ku0q)y6U6-n5JXdg{|^hmE}8cd1}`w9uNC zND~g(LhS3<7L`8$zp+fTGe)Pr(?-0T$a6R^BAqL(|*%P*4eb@M~VQzS*P77(rd zXP-bVi|0B1Bq7(pnpnT;()jtX_}k*EvBi~yAaGv6ReXZb>EcI+soY6$vBx zxLweH=mf%u1)|ox3Kkf*x}KF8_bOu}+o@MtOd(^SArVp{={9@^mCDhU?~=k@oOj7( zVU^q8egCpdoFuT1i==$4mF$~Jtp!183PtV@d$nKsuHZ9cjoVSiF9E|pL9d_#8uF>fXY|UACYjPC>iUxc z*6_jb#h{Hc(Mcwel4hBj*VOW-iyBDPy*q*jYTl*2=(!v50f47=)L3MO7VU9-?KK{LJ zsv?!>cvKPaxgLC+D6K7NDkN2QjwU%$ML5Qt)HrPH3>9jOY)0F<^*m(y%q>AA{z25H z=B638P~3gjgY|8-5Q_Et%7KnGT?J}o>wA!3sPqW!upSy&+N0N>)nSo_9)%GH3|PHh z$t1i^UjvL~1@6XOcZ$=K#vIn3Q|m}TbLz2k9VSH>;r}QZ;{*zpUJCGf$(Axc6(L}bSO%L(hUlViYO^kBB69QNTVQN5mI6x z-Q6kD-QC?OdB^e`WAA(J{j)cZB7AGDx#k?>t)bDid3SlJC@Vd! zcrc#0uG#Idr<(HM>eNX*LaW7VsrbXQy($#bBzLIhdXFiitJ5K+LE3>Z$=~?EgYSxP zbB3?|n+vx;OFuu;XULR&`GS!BR#nkZ(*k*Px1*Vj{c4rf!-zhg0<(hVTB7~51(&>2 z4l2kU6nv)1VGlg=RV!^n9!$H8IUGT}klrOv z^u?;w9UDU4mI~o&4YP9TU-guG{#n`WW8YdTGPAIIutj|Bw6^5@yF2{v*TGrn?Ke;( zfD|VA8NK+1_3kC-eC+#6ej|`@{m3C;KI1k|{DAX-F+zzvqvI}6Su5^1e5RCJrFZ0Wpx~=HBRD5cAybFHn z(K_3`Al&8%ktr~+LRHfRU`80=j7MXIOZ>Nx!oCK@ljLnop|b{1Vol&h=KX?>mcbrjCYHPJ<1bN8R6jpCyTWE2+OIS$IjmN^TFa=q!><-U zrr$)7^OX-L!o+^fw>IYzw{K+|jyrpAo+faKL+I4AaXP7^Z7)T}V1^B^Slb{g=`9op z6iPPdI%Je8vg}~!*ZZ!+=9QuqWYC4YA_YCR{Y!6;d>UTOU&ml2!tAEsuL`VjM+!gj zX}14e_}xX3Vl(<7`?e*h`3#84hN6S)amM2evedPT+etVyS(TEMx9abNS>JE;*~KI3 zZvZ%e8A_IWeOPX3Qt@yJ*y9Lf00Yw+lb-Zg8_YVM%iLa4{$IZQ)2L3K}qHKLT-Pq2}?Ki>^yg{{T-OSJMrq*$puZ+T6HwdHhV5|a)ofH|F4rP zn;x(wb<{|{#V76K`JtkqrK~`!#UJ<*2@G(Y zI?J}ORVKma%=tM}K<)dvtdecloj;%c6+=6gVN7f zunm%)C7~cFNnRrw>2Ov*@n`$DVnj94gC9XIrmJ3hI^y z8G{gaHt$eA+}f)y3^cTBi%h(epA&XwAAWe?omr9UF(UkySw-&qjnw?+AF`iz)mzy+ zt{9)=x198wtbZr>?&`qmxS3;rRmTD3Os*Eo=aWNauGn%bg4bj*Q7)7nz~98)9=L)I zPnXTvHcN2j_S!^UM2w>4JcD>CE3BSIIOC>@VZVU(=SXuj-h}ORP7Li5onM-2M&$+N zd~=UQd0!WDlL*rFE%`zlAiKKiL-KXa&Yc%zE z{s?SfY&`mnTX55IdC4SqjLFZ_|HyP6l+bUk`IBG^mk$|3C4JM}cQkp&Oy&@dzxeSQf6~x^ zfB;q{2%%6Q=QR$yY3EpEBtaRz+uY!=@}wiK4u;nx&5sL2fCNO)?r0B`K^U*lwE3GO z1v=EKOXFxwKaFDl_XKCW0%a+-h{)o@0PN3Rw4zV|$7`=Uw)x+jF#caRq5TS?{zCkH|{7LC?TZcC^RBt_PKAJLqq00wDxS z(}TZWN0W62hV|3Hxbvn9J5130qG<|kF`HJXC2 zQv~9v>p6TIF>XhfARhg-@o=%4L9GU=Ho6N{Y0&ik%ian3c>peN~D$(awBV z!}17(ycwSyx`Q`?E}3phxSvpEG|b4r^fT3C5<#5Pj%oIOix4>;*6&YA*EQC42&vU`rp&pk7kpjdOt3uM>KSlA zHK!FV3nFwcu^a0HG9laKdKsDw`%1i`V@M3W3FN@i0UV3WCn+_D`>lpH&&X6DG1J(i zy=B97C$~^nXrBHl%ILsP_*~b0ZH(t7z{eEdaA}`yfYUY*E6e-PWKReg{#Xo?IOA+#v~64f2Dn9QX=ctH`aGV1 zv)TA7=2$E4tP~#n(R_<)1fD9Q#T!q4UqTzwW71=JC(xZ$@?|s$^rFS&~?Gaa=jH{3iTK|C8rGZ0UOEtE32`N_F>RfBV+kEX^ zhL={EwTljRhiHS-fPn+sfXUqc1L`HwhAK7Em$QaTa!XP)t+p$}B@9nlRHp!s>(|Yw zHjW`C88X0bv!&R3CV;U4#C{*Qu%X~r9iDNWYAt1Ywhs;bJgBCul`Tqgg_o9i zSDg)NIW?Q6VeCoMowLbOzW^kZ*U!56`)b&2w3FDMBYo}jHHW83<}$1#x5?zaYlm61X_d)-?MBJ`8O+c!DXbCYqR zqWR2*gWnJ47=_|Yn6jCoyp%YANB{034C0;-u15zyx(*zMP%Yyi*}>Q;&r$_MC+#Db zoJ^PMp0Qo^TcH~e_tgLgYiz&UY^-mmTxj8FS~~V9hA2Q_Iz2ors&WQs z%h+)ZGaPuhQA?@nkM`8 z>6VdlhDyLJOdS2*9aNB)Nw!FJO6xs@@5!Oyd+VwbbaC0t+mqmlm>E5 zw)7MOPo2gKrV_G^&rL^tuwCj`c*3VaQ6c)cx4{UKWYAtwu#~2xKcP!ISBvAu+FM?U z*;oY-)Z6bbOUjC;(foyB$N7xXt;r|Wmv06Km$gK*#UI|~=Y#e_q)k}Cs*L~nj1H=N zUUo-NyM2M00L{$ePk*`zSa^`={oF8N z0Be%f)76*-Z(<05F#UNFvQ~ckZQ0PKt9$!MMF2kb28?5@@0)6qQ{V`00C4oPRdRDPbH}6 z{gj6%#&Q1AC8fl-;nn{XDbTuKxd0o=%Zp;}zCaRNT*Pd{wqbVVHym}s{-0OI?59qh z*$?W;PfJiss4eAvS(&gc27BRW5V@MF351*u8iV6P-T_rBi8=;9!Xz}XXR=)&xbB(= zqf>G@M1b6!Zi(UOUBUGyv#caxRsB$0Wnt#UUIw20NjM3V_k%I!3Ac@X<5NU7GWaNj zixp_7N01aNaS1Ap1lWO+-t#S9J6%=z?85E$=!I+>fA4efb-N#&pI6>5GE&R~(9Qu8 z-+Lm_P@g!4-u}4!)mmkYoPf}Rtkg&xUHJcTiM0}_7$LjV&E=tijfC>y76gGj!*tU= zq%Hxkm^1Z3&dulDZQH1p1g>k2Be0z6#f}d?ZMV6?v{`x+cJ-}`x8E}&kdzG#K<5dH z3HM}|oB=kuj82XNkaXQTGHDSM<|N*om@Vs| zec_3@jaA#W=_qQy`k{Y?k|m@8P|&-u;>Rw6@+`%44c4iTHH%e? z?dE;}Pcv3Rv`Q=-YKb!^lJczT?++)L-TGH!_FVwsE&@eXZv8rXezF#tNdNLm$59YU zIqHk>^g7^Oe~k1@ElPk(PeBg;hMa#lhV(J*zMnRGdTH1nYc!Aax^kK-|z6mC&hf{}mbO;dk+Tq)- zS^n5*kcp2t9auKczhxySy--aErI&yZKzWF z0#^qOF@5&=3|qywPDYO#?gP@7zVB{63W@ju;_+QRB4tGS56{>C#J8-4N$|@3UEl!- zs#D#LC3h+o5?MUN5n>0|mSD}mE6SV(0KKs*zg0E5Iu2>~W$LZB$i*=TKSE$|OcLQ7IfT1qqkJTfhH4L0{t1J^XCy6L3FE`4e`1Z}=Bgz4zl63_$14%~CzGmTf zjQXOp`quYDN=XAW6ZaCd%3MQufjeXZs5q|!?n&i7EOI z;X>zpnSdGSmhN{+;;S41r;~VhrD7Q)ZTl_*Ntn*S5Q!vu5$VPsG3!r`=-wOHvpXYI z0)Z+1MHy?mj}Geq?)b#klvbgOn37 zpSSi`gRD!}G0(^~?PFY?S(IY-*lpk_OWvmO-Q9=G-yaUH5la%EuZwB-!k7eql6hya zWUNECl3+!}{!k=9soMghNXcTnuM!*q!QjnRv-( z9HhUvV(dd`r~I(QF{j^%at?5)cL3-2UCXAWmZiO}<26bRn{}eEOZnIm)eDTX)kNJ+ ztsf+8?^l4_z=^`g5^Dk<>iXA>(IV4R=3BX0)^Yg1+H zIZA(gR3VlAi;AWQz97})CTv0rJ^~1JeA$_zuJV$rm!m`K00!3Fi(P3F)F<1%_vL0C z`04fZoubo#`9?0u9@))HxVszy;FsgrKJ>sP?;vUaZe8gNMKnmj<&;<5`jl{B8q z&8XdlD2^GWPL84EnOxspK;$L?P*JdfC9A)JyWHb9fyR+c=6lpW4l7=nBaFE_-$Hlm z^<4a!?k^9X0M@BgnM*P@w?oL))2O2X`E={D<2}&HWL9K73 z_G}FW?pnsX9UnanvW+6#Mp!BBG`rt5*njS=xZ@dFUJ1&TtG$9ar*+`}epk8?QH2ji zJ@m|hg0*SDJKX?FLf6&YEF@Zesra!7xO{wH?0O%8e7IvB=GB>zjfMMX|vioIZft$chYp({60C| zet(51jdNVfW$WFjH-Rlw;`M;nr8IjU;#}}!5aur)(y1u!ELqlbR1v~(%M(P6WpEci zu6u3T#|;sQ;dag|4l{`kJva)ts&CpX4y9B@_`+o52w zM*5*gquwHQbh-al54A^#XJU^Z?rpuvH5o{}Q6)rL?0xZ87;Ud5uFsB`F@7A|5c(Q4 zF^NlEo4cM=Fpx=^X%+x&Vb!*M)_Y-*X($RGrv1o)QdN0}P4yEix`C~Hm=P%?w6QROOa zwo?heq%g7pqwhOaNs%XY=%|j3B&l#Xr5UBURFAC%glceB$Z-jeZ#85*o!#ZIl3xe) zfZ`IL=`=(3FrW!tt|Q1W6&AZJXWM3?aq5ZsD4{%riI<2FkGYFUJsR)1x}!hK=Uj0r zmWCwJx9o>;XOfCMJB+LNaH#zs?Ctk|-8+$O{KqtZuy6h)KV&}gI!svTJ5^nDq0&Xy z{a|Or&Fm{;H{^zig!_UQ?`-Z1lXx+-M?}nVn^KR1E|ZA99Jz7z4#hbJd3@a)Y~vr4Mu`iQpAVL76SDheYfP`?N=P!$KV z1)~`*#g<1|(U)wCmgrI&9(~ya9C%Z&oI&%#7=|l|QGUFW`YwbuQ-K%ThoHe?@(x)9 z%H^Ic)d%7}t{s_4i4nziR^ia&R;u`Z!3x^yTQFwK+{svS+ZAY z{jV~j8q`q-)eoUtl27+0CV8)tqsU z!e6c}4i%|f^;~0EC&$CBA-a@m*!J;Wk*!G%zeZ@s*tfAKhe!#$9&fPTVMRnpXd(Tj z%5?)yJY^RNv7v7VP-E30VQ2N)v1P+)noO&tf6z2(1Ytp6RlPcg)O&lE@I+7e)ve-n z4|nL}`<3;M;Bv&o(Jkha-^1g0iO>K_-+AmqBj_({#?y&MI3Lx(oyz- z?ruVj677oQ`-vk{TPTa=QXb@VK7E=N>YSW=1Ow2QNbhD*bt0f^=g|xnAC{7$P90=vzf!wT zzrI$wbj3Kv+t9H2u;deypV?r(0`^Y689)|DU*@Xuj31d~a=FEj4Q~O>K8PBsD`f7o zV4dg@FfH33?WEnRNFJ?bU;oTcHZMs=1EBgK%*nA8$veBTAAno~ZmC0mM}5Z}e!%V|nrcA*+HdLhln6{l(!$?WHCX?+&n&G$WF=@eAuBH%dH3k(WPcdr5_OUIbrGlyy% z8++W@u8r@6HG3dp1P%s=OjGo&t*Xyo#UgYFv^iLxi)e>a)cM?NEog-nlCwHjJ%={XS~>>z@hhzH6!p9i7&Rex^%$8HeytzZ zT7D9+I=OV(liP5<-vGd|t6+d5Kq80;Z!5&YRPS$dS1jVFyL>4`?i!qn_brs)7~WDn zd`W6XCfu6Ea`R$a@Tc~!=Vvdz7(PA}JN^;$APn`+r^;{=QtlMSW@$f*Z8Y-ebUs%2 z*V_-2yzx(GgkER7f`>`vu=B?4oKdpjZ-Rq-)oQFCySo$aUlaj^dCInWRQtoS+D8&dyv+ytCc4N2khHPQrsV?4oP?#n*MF|shJrq_LcJ6;hA(sg zaqA4R=(RiVgJsUS`3cDVdCFv@{soE-@(@2erj@`Z`31W0%Rr?r*GnCPtVw0y!(63m zWRQV$gn(!i$*iA2EEJoGSR|N{pl*w<8LJ`Wa3hPphIRDUChzwas%Kg3OjmA%aBj>B zm3FC>6VXgxt0YLXwpY}>D%7qc3umdxnU~B4MK4IlK_Mh*gO;?iR)bbqQza!5;*)M| zHQh+$HP*AAsg&}dYegk`$56#I50d{E58&>Zw2{+g(q+Ft9a{v* z?Ys-w97IBeVp7|ev#)~|unyv>Qc~5k4P%>|3=LOJeGD=Jv%8Dz%%1e5MqMVfAXRs& zNFNF#u~+ig!qw@`2;xr$a__0pRU4hd7w`b?u3|kWKqmBcp`D71cqHQW*j{!aee}C8 zov?6k`DK;VWZ`-nMWL^>1RN&mIFAJ>9f86+$o0Ziyr@b|B4oHdT{=-QPdBo;_sx!O znjY7{1#8z)(?ZPe@c(!77+th-p1vyv{3*JmM(%QDg}@HiPI5V3j;|A_91ga~_@4mk7#JH=s>hZ5voDKVP5-p;K#1SskL8Z{`74|_do=S3s zfl#w?^^C6$yuoSwBrhj4`U`sa>Lq%=iB7H-mck(TcRd2_QW=m#{$R;0a61DdBv%&0 zVsi?jTGr0)jI{+GRhUO!H3|`w$={aaC{c_Oa-;ja2k5%uI^T#h1EO>l3LNe`i-^=*sURiaIr~o;4l&C|qV|`u?N?v52KCAqgMi0l)snOLmaZ5# zkC*yvinsC^4oIrtQ1Qk+$NWLES1Ca%8^Y1E7LFL^9H0}X++rrkS&W`LOW9~VNm zo`_XSSWZ2ku07U}k(aA!ZNiSjiLrL_)M;60l$D&^UFYn&wRiA3uV2}Kp{}M=8iBl? z-nVL9=k24l&tAOKc;-k`@9zr6>joT_VdbjAUl0@{VQy0UPr3dF&N4vOv+0Y$g`Tv~ zOuYujJJPVNm=Kz?MH7;9OT!FJE+x#ia@t8BU9glY?<+2(4_3@ymqYo6Ist1k33=6u zM5ESW)-GiUTG z@EB-DOYjyfuu}hiOtQ2CP&FHzr(%ga0SomK=ktFhcKk;u#fXF4ej%HAMo=>hyZXfq57+&-Z5Pzp)r22otC&&ns~Ed>;<9fZb8yu|2h zz`x2tE7WP9UM9R9zLN>l`=q`FQYB^bnGVL&FFL%_6Z}(1dfkM_5dT?~ofs)3Yt*K~ z{?}vh#X=r~Ba~Aj4``n{k_)?zk((~ll_Dl)7vv56*0qF$uf%aA3bH?` z5JazPiO|z`WHSnqYi2-~SQNe@a7i|( zUi&8*!XMD&ExE)YlhF~ciH*g6KGNf-&wC+~HWY#;V5JT%!hF})VA_snr9|3E8|vq@ zu3bth2#h>rO4^f+D1*#bk=y)$aiRRFL=@-I__tRz0qZY5+FQtkmg4axjx}-~ec9{ReG0#&LDPK`qz2MXL{h@0 zfG|eF{F0l}wZk2bgyvYqxTNfFf#`eQQAGK1SHo`TOJ#i3C(4~exQM0wQO0PT?Qr0JdJP0g`( z>N2d2*w>E=6cKM6vB5jtKVd$9uog=CU?2g4cUDHU0L?oaEb3)y?+bxS0&)UginW>@ z{c`+r?i1KprvlAK`w_ANfVj3$wLm!3vw%L-bVz038TQx($;1>;U%4d{S=Oue9@~z5 z8(9o~kOH!=CcN1eCt$ikUC}(IN7!OsqIy!8ZqnCCwe@b9t4k48-X3ZRoHR+>ntU4- zge~}Z``?O0#Pl70`N!bVK7*qmAADPL2zXG~#9#X_QtT(~$Hf>t50-0tWF+e~bKsfo zLEH-K6}r(}vk^^T@0`knvBE%3+&T+r$VLMX2mCoZ)J-URFClM>PMKa4KCW|UY?ATd zt1mZQ1`XeRG$#ZT1sHiLsnVArAfGp~%Acw`*F=4;<7-g!Yho7V-kthDmF%Hl8_U^N zI^r{~yQ^cF&Oa=9b`q2tc6M2ib zb*Z$0h53ABU(=dqr$`ZR;S@-(et{kn4UOO#>0gIbV$X6!_Bq9Ufs0 zCnKRRNkbe3Jn019Pn3lJV;7jDbyp;X`}6 zO44jU*aD(?0gqp;e`4=tmnd$KP9HrM}p$47UUE z;5A1oB>4-dgPb>j=vp3Td~LfJe8yuJ=mleLcv`tFQUZN&hG--M^Rg`<|38lFXXup( z!s@IKcIOJLU1w3`K$~oiQs?I8_8>M8{j-W5BR)agGZ#J+xxYnKM`_OYMTt448H7?U z{Er)5j%X8pF#g$XkzIKlx%u{1mDDvsfPr{|HTu+P`9CGopGxjLQahcZNc!hL4}hv8 zh)bI{rWKu@q&h=BzoSv4x@0|a?$yHx>hZnd*j$5cur|hbss{eE)A{*>2jO4a%~UG> zSuwD_zTbe4Y4uukC8`7YnO2S`^2;vy`LaBfxyMKJty%ORAKN)caO zkpI`ZfNLXlG%Rkfl3Gd?3WwW-C~jxr|KrE_;lih|sA!BpKD&7R+1@;}m`U(KL8TS7 zt~+%Cd2Y1S@StivxmRArBe$5esstWcI_OqMy&4n!;5uA2T!3bMgK%hF*p4b#a zp!y^T!(KxHb_32RjaurPU7#fq7gww@e!?JZ zscG^C@sM_5YyE*q!Z@hW($E%d7B8Rh?gQ0(0dViki5X)G1 z!SBCk`KNeERqwl;Pudxuw0>~Esh+Ow4wDiDu4&Ej z7TyC!X$t74w}?oDR=i5kZkZK{kBqc#zmaLw!>(~ZhV?=~k4W(tLLc3*xnf zGehmmnEx~=|9T-8>p!_N8b~v+oIgPz#G!GA*L09suOURKs>YzfL_wTcuiaaPwYC7n zBo5=xFFuB5eV*6eb&b+j7l7K=(IQTXm&5XaHoh7;f3l&{qVD#tk1V1EJDuFncosdq z9CsVMJU2jJ)8znQG&*I(Rig`tW8vlm91lO?W8uT;NCr`fXCC|*YiH$8wVZiaQ2Z9SfT=f_4~UQ=SaurchiJo*f-CdJ%>)gfpLr?pZ ztPlbx0pkY59_GeG+!Z5?4ZKL)fN`dJ1-f-|7(I8HAOfi%u@G|)iZ(;G9yTJ-H`dZD zgKjwKI6wtD(PX7BSiZSWyDk%pVrxCn&ar@6>rnCy1_h;LA)98gs`nMo)?}&oW7oEU z4ONIeMsgR0MDD7`XMykxW{bj+g_LdLHB!w|-vyElWy1InUD}#cLHFEq+rbjIudENn zJGLoefVx~zi6G$C$Svl(7Meou|GMzbEX0zb}3ESlnI=wsW9AAmk zm>o7I-@rE5pp(?ZT~qI{P50hoS7Ag!t;pq_@lei@b4!|N4$Fi!KJu+J_A_LTm1r)F{6#xM86HOcxG|zU59OzE7**ABvTdCX)9_fYsTp z8@fuT46i=hkJ#g?)hB&Xz1vFz8c?_FIdIm7o6hWoTW+Af(ng!gpMpa82zKNBjZq~> zB0p7>-7*n@Gvcj|6l@8nuCrm>e+GxzYtgUjFfH6gWe*Bj?WRv6|a zWddM$z7_^&eo^+p?8l`BSz=uTca4kI6b!e#<9(55r>erAbeq5Og*usLrG8_Wj@Bo6 z`%C8`?#3CgP+K=t9JZ5lfw!B-hro5R2vZdmX{V)uJj4*o$S9%FV@16d%Zf5eozm*c$h=kgoe1sf~eOEGoaV?hd;+Cw9mx+}bwREj+!HB#dStsJZb zRyH3rtFvV6jM-5%M4zhNwvasOMJ5x!c8IxC*ZSnt<9-h_MFEWh%elmLordSHg;Y$V zJ_j-%Z@-P^p6&@^qdV}^qOKRUwvls~e6RePFK@@yGG55IU!2K#|EjjeTfv0vsH4LT zt1owt&N>}a6J%5AH#I8cp*~yrt-8{c#2nh*wbqVNOuN)Hl+^`QQLcFeiQXY z>gwW?2_{J`^9l?#bVGw8WSq7*S&z^0iFvVYLAFkYO2-Phf$RdSnadm|_VJk9SO-{A zZ-=~Tp^E<+aGsC7feoocnay@t$xoh9HddqGAt>%ktDaI?sF#q3-WOJf%B~foV5KIZZb+H%jd1fhvB)7i>wMR*V8Y2R*O3R-oY1R&wfe?m?1xcf5@26go`KQ zj{Dv9Vb=8H*7tF}KFMip=WW*qN5ReI!6RIcCIL@=KUo!3=2TKE-Po&M)P9~QPwR6$ zS;HX8MIZAR6L`LqjbgfuOQSDfT;jd0Q;>{Nx@*BRD0hC@*J$vRGDxWEB6^%GxJjNP zYTtL@T#gqMbkkEoVahEI5mX&52~rkhxwu3HfDwhEc!PnPayk<~gsK^jYC6|I7m-mWR5cP*=`GJXuYwVvg>;0_R3x^Xj;7f#d!=ye zRxTN)aO+xlyITx+t#k)>i%wUK;2#{Wavuzpj}V3}=N%PIe3KMQigl$fUOvxEwSy^t zU{d2u_d@SOnOk$NWE5d1&kVIy^2{UX(dS1{(zg6l=XPZM;T<5{^L2IHQaCOGucg3! zBqOPnq7K3yu9GnayP_u_r!)WZ=CE3{e|4)|DogccV6#Ps@@#4!x@zZcw|PXTn&p-p zdiAPZw_Iq;9)s~$_2`Mzs0__PXK-oVn@T1XkI6X>F@x_DT@XtZZI~D^D0$pxq8i(~ z#GA}P;@mCwOska1azB|kQ`G2~v4~(#KP7(qc8utd9b&qg>&8tSBKh`l|Jiy-UT%wH z!iL&$>{hH>H|`s)2t%5=KCbL14!QeWV+&{dw^TIk9l>qVS#ULigialecNm#z_;gJ+nm}ub^S4FR02n zEpTbFX#Pu9S4(0_!;-D-(teN1&J>01kFR3(t$Bu3&M{L=rWV4B5k-4;T3LDXeLwhR z3ZI1d7OuP?ZBf)qb=wkF(wbRm7)<*1DA1~H&jEC}PHtNthf39&7Y6%v2h&PRImthW zF}OL77HqUk_s5V4rua-nAJ5gGf(K0MoZ#z11VC@2xUM$0jj3 z9|luD4amHo>Y5iM$bN$TJTZ`Ixi4=PWREwi$c7pp_^o7lG36ycdxAJ3hQy2rEtI;? zv@Ko7FC8!rUHtJUB=V1k$(#*3=M>CyTtWC&0YXGi1SQ zHKbbk-8DRZTn{`lG~7T9q!wnhy=O=&>grK;ahIU}U~oQjcVF8?el+=GslOEYK~$?- z(5l9pR0CK2OvP>4))=;I9T3ahOwlaqH$Ce{cuEcN+GdV8Z@e@EN9K0Ua_EL3+v_#& zJqIjnGXv@)cC`WC{9&4jYJ-7>Odc9TT(?u3yQ`GWVEtFyJK>}J_?C@PV`xrmjR9L~ z`a-N|v}cQ`)p6jByr7vo5!7Faxiv1X$)X`4tw@&A6MhUzOM)}yFLd-OG*xX1q=m23 z|Lm*P7#(8}SHAjVA90iSITU@($gJTe)-o$+iIXP>n^u|JNd|{B(M>@z_ip6lHQXY> zQs-8i)q9Ef94UfS$7|iEGc>=dvt-$1jPI`@`9JZ&4<>KdQvum}HQnaiN>@o&T|c>1raO%I9s?=^ngvE-U7ITYV}f z(Qp$j^N7&ug(6CH+YZ_fMr(VY!jBE~`({R(A`C+_gnO2(UCZ@2~KH0UJD z^0?8a7xg7yyT9a!I^tUz993@I*?*x0^5rJJBd13hK1LWUa6Xfg$NkM%GYYzEk8m*d zlUj`7j3Y|TGfc^T+OBAsB(#kT(uq)b>xXk|oL>20Iv#S#uWWbR-<94k)rh){^nQM= zQ`V&qMc5AA(M`5Rs2e({T$>`4)}WX5+brQrOP2O6+uUr{ADbZMuUd)i>B4>y)p=gy z_`TWUm{g+|P7ktAX?>NT>|9bG_$-ihN>c`G2eBRzqiOpdr4NQ{whti#z+~rsC|A(v z$*O~hx#kV%7$)m|Sq0`}F~&NMw0#p+U?lqkzq z#Tw6-fL3pj%Ylv8y~^(hZ}dl{ojXi(I$m_VqrXQ{X&oPfSypj6KRwq9&rxf$>)_V> zbfyqZycy2;?s@WA9;~nDH&)(F>rkh#(c0uKerovK8CmcMJM|`;@75vcZMMIIITo`KxVn%a) zQCwMKxz`3wKMn4~r?lHnTJS8Vd?6w16Nb-W@m1Bd``D<<%$BC#wRf=bo<|NzHC?2X zwe8u|P&3WN2*G2cvchIu))TEJDSf%^;Y$wqX^t9Z^@AKD4RoJcyh0Z~VxX(jqSzP_JAy)XNz4Lk94{CEoOI z4jVr(OblxxPNK0>x3=wETa%^c%&x1r*m;zX&g!|YCwIn1Hc>r0-iFVw9jrEg6MpKB z`q2~-W51)3rT>!9O53q@d>`ZUn9K;xNAlF$V|YvRmaFJJ;Ke8u1GUHfk&M}y`c3}Y zN-UP*oYd4nzx=NYZ!2w6V%Me`QeRyl9O6IUMKZu`BLJV=E^`&lciS zLf}VQQX#c2lV3#3B@&7Pa#5PXwAEc72mx!N&THmTdxpJ7IX_deRN8#Sykn=5$nAIy zk9J-H;IqSNJjt>Ge&+Tc<%92czBz!J+yzljnL(rIYL(J3W`$*D?%d;78liAu)xoA8 zG?%eQ7s4M298piKfMfiK;9_$jQWD9U0MvKi$yK1R9Kqji6BP@qI>8y|zB7Z=cXQo~J%3tXs^GRM= z824^uJ`*c6F6rUuzTI0ZGhEP>#->5yAynKIL*^K?(l8=sM_j*jJ^9TdYH5?{tcvNGs#{pNgKTg>!R*AK#2owVxB9OOJ@VMnFk- zz0jeTzUf@?ke7k+oE{DXs_qs~$w&?-;hM7Vu=ia8!h0RJV!yK(7jBEnxO`Q8noInG zmOw#eL)>Xq)UF?*v<~d&?W_$7?xr=N#^Nyb;IRH7+C%*SNy{4b1N#@9_HwK$$FZeR?rA_zZ>9(bH@`awL$!u?@Uf;%}sFJ z6RhGynEJ@oS}k1>In6=BOasfNFSpdTInT=dRJ{)C^oaRJxSzFXq(}aS85#+1`0%#9 zZSrA_%}!U_fe?Yd;QBKyx}R9-GX%6{zZ>?J7odO+DdAMYB7kMhHS{r&QJm`Lyd4&S z$Ec@-mTXt5Iw?6X~L>5Sd-_EG-kS~-i2sLJmerVKf4gccgko;9&4*2;HLukZ!@2)BHA3IUsY0T z!)Q)&4b>8MLc_c@=pd8*R6kC10$!-5)!Lm8MRnw-poycbS_-N($EuSmxSZk6i|6Cj` z^=#2etY?nSaaq{Q#EB=!fQ7>#)mJ=e^)SwGX4)M`p%^TQqO8iR+^pN>VQ3;{?)Bi2 zWEC^&#nsGOX^r*lF?aU69Nz$3XdS!njPh3@Qo>$uw8+^)P5Sgpf$uAmvu^Oa&*l~j zuPa)nf;EuQN8vim@s8sBlJROPJwUP~xB zXyk7#+Sn4(V{oeFmHt?+A%+VVgXHWAn+=V_PmYNLHh_}voFY^}|9z#U?wJujBSCpQ z)-}$foXha}HK^c00-s^2nTMF9_w}12$yYIBKdernE31HG|2o##G$F|e=|^$2rPlYg zEi`<2cg{G&V$cn;V8atzwPiqBkkdbYH18~A(zv(_x4z;tZN?gD&=uT8oh}`c3ECSK zNyRW4OzU#mad^aoVd14p*!6z1teLvu)u)S+c!gbBg%+_Ixg8hf^NH8wKG81wdj2C; z_=YrX6uO0U{04V1=2MAN)OB%l)>tf>KCShI57SZK9SQaA&j^}8=%cMrzZ~(>=`)d| zAi`jTG+jAU}*s!^V?`tMV{ zJL=wu*RjMD>C{zQiE~)2V^J1?!J-QhychJHUb%MD63iN)=(51KbFYa@C+U<1jSQ=x zTCQ=p3XfX5jYe9_=V`z1c-2@GA{%7ct2&H!JChMETpJtb? zx*IhX*PtHT$|d>KRMK+mPOrRd=yQO7LQfC5Ld0mJdhH}-?9MH&hcUhzkG75%qp*u_ zEA7|P=*GQ{y@k(M|F-NVIR&0W6Vv-EPq?L@zojSo`24Pq_l5Fo4JVYESL0T_w1#*u9qt;>^dr}vZM=k?%cZS8<4JN%@zp0Z81ip+garThZY@pqVVxGF7H^K>K* zpA&YRG$L(Bi7&t0J7D^{{MLIyQmIQ1QbXt;Vf>Aqqca7+L$??($?UNtGm_2c%zZ;7 zsNF`++GpWDW+|YUnZiBPU1PY@t!^eTj4xX!#fn@)q+&LviQr=EB}ksq~nd zH8T)Z-*zLrpa0m4nZtj|+=M4-kfhp#<^GQS=#3U((&eo{#S;O_C?pYOuxho)v?J~% z&jsg^Gq*EqTC|lX$L4!I>>XXZwTVr8C;VDcdV(}CGX`&4Iz8gt(#CkH+HC%by8cT} z!U_|b?i<;7OP_>0<(kUQ=bIba^F=}1 z{DU!9?KF05guAOqs>g0rv-El7FTE^J^}mhbLyBP$fro_2Ndn(P{eqz3UX*yF2ft?a zpxEj6LL&=b8at=Bj8J~pP`>Kc4A-4%45gfD7SHh6v`e9CFIU_yD)6PU8Z7a!uTTYI zhp=d-tXS4LhRd{xrJ$8@#)E#*V${l+ksUj`N^5*it_R)5NcaG=nGhN1s zASG1Zajt3K8R25h@=?X>!rh+G^{F9K+#Vz8&E(hK@7$0^Yd)`*PueX_DO~#&rUJgf z0{-n}MF#qd4PWI#ETj;1bK>L3X!&^citAO1)FRU+qKn|KG>+Piz= z3T}GSEIPY_{N9D^(;Q!CC}m*>3S#aCfwF2kz1&^~iJ7RJD$)Wdc(SQ#hnLUuxqV() z!uaG|5@)@A)@;mi@Q%5B>Eofi(v=?9Pu@=%Hplyq+`nwKO~@?8HUEgySU6lhDQAS$ z6dx4RHQ>5cvOXvNf0#QDcdYmSkC!MSGfMVORw#Q!g$R{0vUg>Zy&~flAtT8uWRyK` zdv8(5yzT6rRp#&Y>6}idbAA7S-*t6$Ifv@L@6YG+e!t$Y*Yo*!(p@v@_WZzLAG;-_ zQF`E-N?`x#gpbL(?T?vCi^|+}9s7CojJ~78YV*-lS^=!;LD#nB=l6X)^<{W;*P|YZ zOf8L~8!YFa?%MIopkMh5Rn3gCJ08GDZmWXV@s&!ji&Y2Ja^Hy76OL)4v#-A|S*uxn zQ#HRoeHHVV_0PM^2y47jS8j`E!u-WD%zqi8YH_bv=Juf^-j0xi)NUCiKklP2wDdig zMii^@63j_cdF)p7RLfGp1Z&CgUg5fMf)lGHz64Yu)BkTJihiobRZ!Xg@? z8}DD)xZJ5wQ2SOxZ76K8qH=uRsL}LP)~9h7F^qD~b2fh>x~=hD4mZd||Dq3#%aPu#dt z;t~$y9>F(lU<6PA+5feGFLwa)_r!M7miYojc!wHy+O-OTfSnM-E8^jAD~*T??R0vg zNLdwnlyuqeB%{)zoY^{K&-YzR)H$CFs0~(ylc&$q%M+X_47`_Bv2~wKcS$c21om?a zpp=w{^JQ$_Ew)+ZC9JJj-82V>Xj13v`>C4GD7YS(rq1mp(T#>5?T-IsVHTCmF`5xi zRghrYz|kC9)+qnEJ5bpET-7b@E$YE3Eq{@Rn%RLE-PC+ja#!kj@{D%s0Xw^B9THk99R@#KySt#8Sl--K8-S{rasz4_zdGX%+SjTkTcz0ft5e`0=j$5K_>*Y2($~hH=_glYK7jQebEzQ9e58Vbel+fOZVwAz z(f%bzfj_O)^!m6yyB<=$bzO$fH{venvu;&+6#)3UC*`5L?{+sx5}gTeTdcl>+5bWw zSbd-6opzXycEn;qwG})ZIjo`+cPUsON%y&1Wa`5CrF z;Y!I{41F8lr8ARA32{c_==Hfi+)YpHTr&euY$8T^!OX4rGX(pkwoBaRZM}~7Nkkza zEHQ|5(ZD^+K%oth8+U#&@wlzpbkzQ4qj8k>wA+cKYj<1X#mm@FI@fRWO}oBC#H4_8 zD1EZ?qNgRT^V|VzA!zSHND@@sbS5K#jlzRSA`WzL-6#0d#2)O}TOH71yJjIn;Qb#B zjyizb{$^&To2K6FUBxaZ-ya29j8EJS9cwhBUM~8%IKyx9a)=uB}Pt?NN1l(**PKt*ao_1CasiVnDO-9W_yUe zICQcue6J+K8&!DSndHtt_2N#C3|rhgtrP{QxRAFTMm0!&Lfte!T@1G41ze^ncV4^edIh-j`C}iR1OdikLt+;L_+S|MJ>UN*{ zHGk0wowuZ%r9;7$><>IGWG-(jYVx%>&dR;{(xBUlg~8BKV5|cyvz8{09a>C1EnAoC zDjN;97wUJf7TK@TC0w%@CKEGxP5OPGb8u-ZXX`+JxHj~vwdVBD($ae6%C0A?v_q@( zA8Twg_Rlreq3!h0qfOv4;K{28=t*qiJU_6h8hY)velYhXfHXF4Oa95$`^0tgHU*fg ze0h2zv++5V=zcXHiDlHs{qYphyL@)OLyw2FMGV4Z!x(dkix)OlMkOB<k^1bvf8|=2h~XG` zIsJ$%P>nq9gxc2>ok2Neh1T0l9N?7g^;^4}4ABbmJcHek_h zuPCg^ho7|1=wL;Vgd9lSv4Q8_&=Epxq!hpo4*;& ze**`LxbX~NvJ4-aI+(lQ&Y%J|fa|ogT8q}N^LxV+5l}tCg&Hyxv6(=-N9)g6hX;iJATMO(8o2~C&$Pn$U0zosIlX6pt0%!dpgdoBQWq^#qmChHDlWLJdb{sF>(!1++FfvOPSE z(HFV**4nWZ{#tM<`*J1CoR)|2u!QPwuV)x&EAr(o-JWJqXDaaKLQUpdu#ufSvJ~lm zqD(Ge+dv26-Y6;?V3oiJutcBc9o!#m_Dx;m_pW;EzS zTFKCMEy_yXJ&57kL6lB$nU+=z&w}=!07egummgYr{ zafm_q9w0qSH1dg2Q6NyyTWBY5VVu@|XX7(xh0}2|7bY6AdHoK*Q=HS?{0&!${m+^; z1~Qdn^iMHl4B)BOq|nxj)xT)m&$St4E~XFOX}yjnvWcsR=iuS6%?K$^VFk0$=R5Yg1&FQ!h$QQYf+bphMdmF(z*FBR>pGF$Bx70X(8 z)Vt@M>HFn1-ETz4^UVe)si}xDwY=rmUWxR7^0vR5Rp8!_{j`cVg`nwHFPs2`q{Mo5 z65W}-h33asV#K+FhAJqJY%Utj`@{A4A*PoUIEOF0ZNe~g468L)>evX&nsd$GDkcU% zVoOz-XRSCFUO=;;T=12!fdyh*$vX~JxrSk!u!0rRL@Bu#g?$HM;YMiRSNc~(FZ?8_ z_Z3wL&!uh0J*gv$?%m9rzGPnqf}C3@vlNdUChTGu*N7|-;VWwzTPRAe;!O~v>9hR=&} zj`xS+HIqjq=q@qR9onCUum+yawf<-miMQA`Jw)5iIoC}$=8SP@m!qXcGqyn$zQ{1Y zuHIWmOC_M`#A5Eo$CUqMDzu-5E(Xz|qjUSKx zM^(&x#>*NeX1ix>isbwwy^J%LJkDSp^SOpjBs6ihz#gzp4AF4LJzrF2!emhWjD({5 zaBq^%_M~)b`mr|IZ0zF66vAL6X!LzbgOUo-`pKzh1H(ss9J(E#=2@P2Vy6CJFzbV& z=2z(BvA^-S&#zY)SjkIQ%wl?rUp#4tw8>eod4AE_FH!%QBrUuQu4q z#>hz!0XQSIQj&A0*nD83GO`i`feG#o0R7R)AE}wBO|rS)cWk1tq!SK1Vokl+`=+tNkn*A(TWxVcPYZTw~|A~X$d*A{ZO0bvAWqjmZ5 zq+K}fjB%i634@;86BmBdjtGD@&Fuk~`wrA3B~QT0P>lu_T58$7i3D2B@|CxknuQhJge4^1^O_<4 zphhTG_U5TOU-+r0J46;ZwN)!z>~C9s6<=rwqg-Amo}>O0lD9)auAm7>5V4ApX@0Vn z?|cU0jFhsM>=CE`1u?noP;|=+rr^n=e;YDnu4=F|AT?cYm)+bSU z(QPA9G`q#FBkyk=Fm|Oq!fy%Z$Tk(`|F2e`o)k;t9^gb3^S*eUcN#E`dgw)F=zj$_ zH-g<6$x)o-Wis~VAP#vEaqk0?V19I1=1$Wkfb_)J(vrngGlhsTwz8mUzXIm!x`sL1 z)|34H*@$i8+qqw^JG&B3Y10ROjPGXg%0N_ez1prFT0Y)F30Qwroqq}8>AlcM>r5~r zy7z^xeFj&7uItiei`zk7SHz;loNZH{2M7ied2O7oZ+cF}28f1i+VdH)>(i$&)^s;$ z_*G6$_+9%(Jw7beaHCJ>60OTDgSfSNAK)T*wZ+7liK6SN*aZY@$oy@+cycIAVW)0B z2Me3&bNgw|3eakAPuFVw&lhzGu!Hf(AK>+1k2GMiy2mS>0i;zxsQkuWe&JS^3Nf^~ z3e$vEZR<`6HiLvz%>V2Sn(k04fhWS?l=?5D8>o?y`dLFFPEpgM?)ylj^;7J6Q^Id&|m4|Zx;V_k4zx+6l(gsz+?ms{V*!{*#G*o^@z)K zt=EU?&ob`hgxm2v#J!~9yeaJXKkg9};uo+fImgm4|3jxv_X-G?h1?l320 z{XhP!oEUtQ%t}#+@sDr98#Sf>fA~hdGU!nVDfJluM}_UCgZRZAWdFEH=a4Md9c$z4 z7EtOt*=CT*{;wdi8_@K^hGtes8_X)1z(gDloTZ12Y|8Nw0C-qf2LjcujVF?-0FcCR zAjxYY2Yf)QZ*X*G1cEN14Q#8MOJHkc2SaD;>f6W57!5>1kKANnjc(XH07G=w{@WG6 zK{gaxWnAtRQ?Ir2nt94@iv{6f2!dvq9^MG-Fb?j)ViCx0gSka2tknCr>&pubk3H>~ zphe~zc=enp1fAib(uB|85en8)o_#|#MD*p}@*h(0-;U(dj0kZAF?vCqoeK_q&{gYw z$k>2fELM>fu!l#UB)>4bj^tFQgO`A5-TV07ZpZq4Oa6Ko}q?_Oz9ufa~D8{m)}-ghUro;>Hxq3n4iShv1zi zRNwBfNTqKM7|;)z0AC??dc&XboxdJAIb1MJNEkH}J8yiJ-RwbJFkEWzgtLRBquco+ zcG}(aFn)VfB9Obf`heE}Zus{?#?j7Ut=``O-7_dwxW$+&NqbSy(Q*qkQbduut#8LzX6o z|E{>O23tQvgvQoC2)u|?C!w}cd}R!B{jGO7I5v|GBO893e)N*iZ59UVc*{%hL1>UJ zxiV||_>qfe%<*#!7`B|3!k`PAWS&4BVAR{=to!$)E~kz>`wkCPwL2>7+ExZ zQV=7@i+IIg-=7N-JuiY>2(lkL&*u+ADYRM;i>M#k^?piw99>(X1p}?c;nsI{R8!tb z^Z(_j)`8m;@fL{s3_Y7qmA^2`Cy-sj-M5OSiIol5gviE;R~qD z;7@i%k#3iG>uXNhJ&oA`3#2^2N1qNWX+Ah%7fnmF41}Sx7;sK*#6Eu~6#o>=OUG%p zA&S5V)W0qtc}iy)k?_h-r8U#zmQRGXzvm`YCCP?73U=xMBYSELeSEpijd+M1tk_zv zw0KhzXLCK~&BJYu;Bbm9=wudz_6j+*W0ZU-EPCXhGeJ{}m7@M=yYMb#ARi zxqrVAu>mX6ZqK&Jj%+}_i#lSJ3QrXn-#v9t15eag{;O@P$KIMO+aUz*t#U!Si5i&0 z*g7#+@m@+yc@I6DvH#XcW%a!SP+(7rE_f80n2z=pz`aza;tB3()}dlBam{_wMpX9Oo&yXJ>$q zyJ5ZsU0Tu2djvLBB5Pxo)5!uf-#3@+Kf|oelv93@FfGx?Ll<;Z?&=);f_CL#pmKv2 z6aIszL2!r`-dx+mQ2}GdLz)5#^D>bnx%LnuJ?$d}FPh zzw?#(%vpTXRI>QL&WE8_sDFNHlR}pru4C!r)i3gC@3ZlDlWC`z?vP#+JA&@LQ)YN< z9>Hl2UcPrl>ZED)=1Z6KK5q2l!&*gZ%os0=@X@K@TR)-|zTL3?{>K7MEbe7w7mY-O z+)jM$;3x(+#u6jtayZFT${PV0NHnN0{W7E^QVLqeR;o(pPV%`z^`3a`S}Ltl#1Ss* zQ3AF0S+YLX$C`kdX+URQdhW8l%+=b}qjeIa)A#O%ZpKS zXgV!#rtyQ>ZjPFU0@5V=7o_zxeM8MTZPuBbZ#K)vyZ^xaN8jX(0JAKADV5R4tLAt}ta{^-qZWvkEwocTD--(*D zzDF1}VRCBx0tP)P;ruPxp*WK>X|sQfmd*_3cr3SHenvQu2z?;V2BDhsU!nxT>sw@^ zrF%h23$|C2XM4d!VyjPrDEVb(YTP9;V@UlLp>{;0(yiotjaHQS&TJAAT{n@U;+fF5WFLXPVm)JlV6$yWiDr2jcpg%~$S=?n0~y(;1Qr$w{NA&8 z?zM#ym{5*3+c%hU;#LjWPiu;9+ zb}$PXH8blF1QZH5kcEpUfZ)?*pKFPW{|4J;f8a}WmhN{CeEnmg5%k>9?6i4Q-#Rdd zV*C3BAeP0NK8$ajyh-h9ti~M5j2&b|Yk8tLJqjf|)GGRN{aUQ%`{#I~W(tthvDytd z^t&;S`hQecygGxw$Z9IDgw^D*H@9n6k6*dDJvyt|omgaLI3wyVI(lwS)OjP}Yb>#> z;vYNlLwaa*_!<@8ye%DXNdBmdyEs$%i<-0q+R%ZG<&ubnzP1_L(BNrfYuP0wM4zwg zYRC}eGH1*{*f&tL>yYitE+tUSH%KcgM0uu1FA3YaOg*7)U#NBUSfB-(R*?M;{#t=` zlQ@h^)Yekn<#X&Car?F%^0YfRq*Tiei`s0mu34vwXS|85UcMX9AdPu!P{yuCC33T9 zbPeK9Z5uB_30B3Yb^gVuRpzSJP)i0$@ajq8be7^_|2|=9f`0dv;j+FD_nXDKY2#0p zhwbu1lhQi-kw~Xl_QOKrkVv~vUb(*xFb4FYi-$xZ`t#=USe381>Ma(`H|dmb^N{SE znCU&owGr(n`e7|JnWIv@xOLS&|+uOwp=VBP?elqOgI}rX=IoNvoOb)5PeXg1dw9uyDbkTi1=Npm>FX3;W znS0<@n3H?5nCo7*0Rs};CI>F^4e`5s=3eiL)$+JvZ)a87*}Wg9QN?TC5$QQ=j_-`= zQ(usI#1K!hd^Q3u9u|o3>Y~aJ4Gfm*uMz3$V@URhNFQXD zMW&s?-#JIIqNZizt74Kc=K2Dx>kFJ2Oc`Han0tJ_k6Iw?$%dnkkZRYe^(UCJy>bjNyXLM&T)CzB{?66ZNZYM)nI%>tkt5_ z3M!!2I1Z+ifos+my)_17wzh7UXsnk^R{1VS^0(&lj|5TK6op-g6B}3et>beWS{HY7 zm57}k>RFPoV7L4h_DG5PKT+#1uAo=Wgbnktkm9ca$Pee8Ki}rkivzEz{2Rp>+rV%u z&tiktI-2e_X=>F1lXCfjQz8WFx2P1%dWy+bQ0Wne?a3J+4WQtC5Qf|q$_R zjv$2V{3OQXA&^po&aIz1N^W{V0e`~pSTLN39kKO6Ek=E4o!)OLLGJnSp$brSMj>2! zx-KwbFnakb)eGUz*KN={{Dw$wSVam=l$g16wL;D_lG&#Ul}^c56)J6fRwVt!7alv` z88(|_auhXg+FrD6{pa%jwScC}(_XmC47PzYX zDv44v=W-6t8t{`?zM>6D>L+W2zmBPc3+ZPA>>)F<7Aa2_3s%(dq$z6xAmi@r~E&bCn1Bu4N)R6sGjkNFcTSt z;IZK^wK}p)sF;q`#d9Q-b~$9z-ZYyj)VVDryIgmlolwp`sQC)PYOCzU`Z^6FJWSX& z>YV4*tRxn(1toPvcb^jS$<@4+2oXx$#$#C=nrogXR~pC)u2q6Cq6e{PD zEVP9r$X#*~n>Ut0R7EJ>NFH5@DiJhTuUKQb@Lg z>PMERaQ5$J9>Pg!z`f{)MvYXC@yLTfdVpEy`m`3#gkDE5{AdD0UADN?}Ju=Sww3z~v3vSk>z?0ga zUmVDnh2Zmyb*QOWTA8ACOWfaL9*V9^weINX06j~a`XRv@qM1RUfJ14|r^48jX;XKt zdF$6CGHTz??X+HzdM#+RTyV<4d*$k)`W&lLF=;){=vC%Be1<5B*;huryL;B6XvKem|Z;r5F3zLrm8zvg3(ZEbea~0kB~QZa*nfhy8AQ;kz!CKZPMCF zopKplOTvRQkL;crQfBF>#@X>iIXaZxnrU)4m{NbT62F&X`XzI}bWX&~Dr-Tb<3CbX zmcIos5pr57sSS51DL&6rvFtx}EPSAH5#MHrQ6nH-s;rQ!Z)y9X6D|LwZI#MkT#fCZ z`u(KJxSZ*f5E#(*b3dCEOX94Lq+b@M9deioElIvJ%RXQBhA1zGfsydbV~QhNZ^@h}iF2p^xix>Ub4 z&O*#X4Gz6;Wa{IUtx9Qu-_>LuXF|s?c(?+vjtP13Tj|5)O3~?)e{CeQm{2^4@c zSqTwu-PZE(f-B%e<0OdNM7tt%yuZ7yRLlf59ZWFLij8~IxaAO9Z<@S{X8MkFADb3r z_5{Cv7@n0tbIVGLstATLIW;n(CM%)g>F8r!o;x{pPP73KmV=6{C8YdJN%9m;egXUAw*4PlbMpH{s;Zw+|T}qUyyGQ||5Q zruY+1Y643nS4Gud^BF%=A=+HJWZFTUO0eAhl%+g13$X5o{fTxa_!GE+s!1}ZObOLF z9I>eC9s+%E*gjPMaknVFF2LbUejS>4&)!7BFch>J?CMKe51kP+!7np1>yIsI;9kMM*NAI`0fV=sG$UZy;vP^`1_|;n5>PN^UnzXJu$5h{5f;g zq3&1iWgaVk>*K1gXe5@48q6(FG-7SxD|&#v#&Fe7XoB6LWAgd{$8$>l#`F_wUzA!e z7peH!ZMQMaU)Z)(qCpiv{OUY|jN?U{E$|mV-nqp+a9iA59s~$HZT&)e_0y2pB{GRR zp`6NZpQx28x?Qth-ABVuU5;7%l6(9tTLwkDPz{#zGTpAnL-D3p^z{f#U!t7ggl3)G zt|Zzzp2>kutDri6prcq;#6EawuREXc&#@u>Jw!#xFi?e3;E|$^F9_;KO+t_P7%d)d zCUgyM@5Twdq7PQe(HJPGa}5=(fS!et@H}YON22wFEe4q+@o7!c`5pthSXKcq}MMhz3`xnmtC9OrnF&{RxqGMNl67L{V=;h8c|*$34C( z<0o;^#8oRLesrt{C*!RmWiaIDeRf8|>4>Wvc<#YIFM>(m^58|EyPIwbMlMa>9YncnvI);z4s%O$9yzb*x9aPju*C z)R%1gj5`6WB-Uo%mU-i=E90$xxs- zk-|_!*c{9x9Nw3lz-Y(QrVVe)E!evRJ$LtGB~GWWgmH>2r?0&e+9@4+}-NE&hnJ$p|#PdI1x6&!zB&>=)YSYf6aqKFTh|ikizL{W-84G zD(UPv;+O9Yn}UOhO|W^lNoqL-+=tjB=z~}Fi*V zH%6?NX+zvkNsTVo#m0!hWq9!PBUTDg_GEnkS)48W;8w1+U$L}ZClpFV!@ppUSK5)u zX;3H)GcQu^-@1h5LYi&ZMJRp;R=7GD%=7x4{$R!DG+*SLNO;|EzPiZpu|4N=T~T>s zmc^pEf6NA$iZncr9>ITXmmNe}&r2ADziru-96-b<!e!O3tOO;QT-lo^dvG5O;TLp}Vms0JiE=*ih&B?z&6n0kO% z6n1>K!CaccW9Op|+++jEsIi>EEqUT27TXK6$9gd+wNszVVQ{W=sI&Cq#M|zoua_sE zTnXI1#G^JjW;8#(KcuuaMwm5AXNMnUu3(kzG>g09=iF~O{jpzP3W2Wsls5njd}T(5 z)N__wFIpWYYOs7|ZLb2fSI$uXhk_Ee?5COOaa;T(^9Up%{TB<1E=WDfhu zfwgZAM-hy;UxCAGT0?~e^*nje!gcKw|L2*8dk7BV)5FRZ6N>L1rnYHCjIlo= z%RbMebq64$>|h6L->xZ(dght2n*m{QU)!Vk=Ow^BMc;bvevgbb`~89kJxiaj;LRoq zm<66RWtA`gGRlHXL>1jx9x;(O-A9D_Fu#d{A+Fq|b(Q$x4H5DScjbzoI|MtKeDWVG zU;rWzVM#|TSLv853PN0GFE_Z_ny`pz%0CYIu{A4OLeuAtkoHp!B0h0b30g+L5*9Fc zgz@1L&$$lR?8uCX6Pq$?kIREF$>8-ds$Y-{+||QzH^MwVgf*J~4U2Ub!$e-s+X*P0 zXU}H1AY+lZFiETG6Hd$_;LNyM8)CQ*V40r+m`op!*LSR=HEJ<7h`k?LWgyg16SFm$Qg`A2s7{b!OtVs(Xi z{yg`6L58P=?vtJSS`qQX3v*gjb2o zVhXQ2fSV=OHdgOUp{*1fm@vvm(j}mZMVNH4B2cXO+4|Gcx7R(|1#tlJRO`*+8+WC| zXvJvG&oiq^QM<#*QQk2flhneIU7pyvr2F0Vm=u!i7zyKm!RsV(hEMB&`7o_^W+B@k z=LXCu_rE2T^z(0W4eWP37*4*nQWKUv7^$=_9^TZt?5ON~>HNUqy%x=q*D8%o{&Ck$LuuOQ|lJOLN(K1sWUi)Ci>dq;&OeCO}Lk7+~AuYn9h@xx#QT(LfLNjB>f) z2Ouur0mHcC^0i0g3penGn={n1_ol>i3X&}ET{p4GZjaik%3z+61 zJnpWbHm9$3if1t0>EFlhqhx3sjkWUYp3yQ^YA(u(hfmayS(a7P;8}Jss2XnP*(?|@ z`>r7gsndM3xj%)FZVR><$9f;ZfGKfeAmEukTYu~mpMx=hi(GRsoh2q0ylLfDZTIwY zIV8b!bwz@>0ju*RM{$J9xV>=ZhOh1HZnp96y7*)9QUyorHJ^V=j2aNg=o-%S2Hb;P zkx!m!FQbk9Q$^jZYJQ!h)<9VxMtgcdHV=_%WpG6KOv+#^)LCR-6Z;cj6~@sY83k*Z zOH@YOiajB|q58QpGHfT*Sflrlwq=%$=iV`!smR0oyNLv~f|%z_9U3{<3}-CAEMa?X z0|CEFBj4ovJijSd^kZlSqG^9WB z!4xeQa;b)8t0!IM*n9AC-PQCaqLaX=L{zRdQWX}KSZFUVW3Scd-`)rLB|0z}L<>j? zki`#efYQP!_)3~5xJC=w9+zPmgd>%4SC0PGVOolAxts@$k^;~_&a6agsY@1vJ$8Gg z-V0}ZH0#B9R5M<2d(jhk39C!*gXF1=B}$7l<5_ruYP=KsQ(t!>eOkdw->s5KzO8U1ypB@nI9sMH8**Go}m(@jP94SQj zuV)gZpK!e^@bW$3RVncBdqOPe6_N*&to=lw%H z%#3i(1Bw{`!#PI@3?B0b1{}!=JR>9$Iv*2eSNqR)`TGlC$bmAQPIK$eyy%B4Fuf=U zGc3D{-23FJFYNvp6a76b`Yo6J>woj&i|;YD?a zaJd4#<@aChRe(HUs3Q_e=e&a);kT>EWAf&C=Fq|M;dJG-)ks#vZ;z zB#3QX!fb!OrN4f5P8QMDo zG=stNbed03H5#k-aw!L$PwC=lm1K7lQe8KL9wV!X z7tz&1(l!z;*a6_!IDZ~fSm>$xYz{!56JINM?HgE18y;sP##%UoKBfbZbR~@E`BD!0 zU;VyLeBN+*g5I>dG9w`m0i}G@|H}UR=aMipAT%9+0!qdZiJdgoQ)-hrszo@;xF3)m z|5aq#{lfRuVotZ9AY^!Yf{5^JA9RM_!E!8u1Z2K|xyOl~mf0Y9p5@@6y=eiTG!q2S zeBmC3?2C+b9gtf;gg5{#e|z{~Av|8?aRS;AaB~}te&;Sf5{f_4<#KiR2Xd1?Gyg~R z8TuLdxG&j^@Vr3kq~tF!xcPO{{r-Z!1-TZZI6h{M%;-e{@9f=R>zGPt?r@3CKsbnY z?08=^0}4VgRS{YLOsVU(CHvj9TbOA@DKX3Q10=tejVs5Id(tb%`GXJgq>R7xIrgVm z_vZuY^%ar%y7zID!tb)g?kn(jQz=<@5(+M@-Gn^#8{zK1m5=}O^@AGE=HCC5@W|ak z2nVw5YalM2O90tfD`*jUpa==07Ph@s-~u42C@>JULK-siXxY}_oIwIjjt$1cItt0{ z$?K3glos-jf(+AXX*%II1G$(%zCxH9WH;)QHMe0pyFk#F4dF4U&Ka_H(9*eOb*V(b z>P%d(ChH6YmHp)v%TPG3Ivv31cV|l{_M&O~a9p(`IAL9AKGQBZ0g+rDJPnw8oA$}z z6Wf89RIopA4NC7r_Cz?e&YZXAA}LQ9W^c9sD^oiLR=t?xov`X{dMBxbn{Mx}*8Qp= zem_}17qN#dhzbH`%EN$#yn(>dmE9?mJtH1u_-}$khK|B9*3~aR6_xK|Zr1IIJ5$MH06& zJ<|HTB>aTVGPVbN=Br3Sr+s?E1=x#92_{<0NyBu@UZ%G#uC1E)Rk%9RHO?t*t-l3@ zSfG2Wc11P}iQ?V8=b#lx{;3hvU%3xEnSR}TNAR$jLLVFw5eX6T`z)rscX+mS~2CKZIyO|KHDA875@M!u9(ZNpc#Z#cR>W4 zCx4FyXVAXL1kUe|#tHd2PMkI|rbKq^_B(co|G9CH{|r6A4pSsf5O*y?X!B(hbOPqD z9LNs3l_l|fw3&^KxsVvCV_9G`HK@Gl^I;W~o~>X_PZ>g(w=NsA+?6WGG^z7H7)}FmKIoTv(_1k7_}jiDlubdQ&=kn z34cvEK~~RjB#9^JsQcBkehQBr-@_c_74LZkCw47#PS($C!D_E#nHxN_hVi`_v>HtOGj zTL4M>fWrWZ-F=v)a&J%gcq4gwkoCq5%91dM!y2B$UoV+>#<6jqBl}2KzNxZlcO9rw zI9^rV01uzJ!z<{oWWCSWpMrkX7cAkkdWLnO3|AjV_noV+?GJh``@0Cim8ssN>os>G zPz{0Hj%P?6GV$J4>3>~`8_1Oip&;|onIhH1PlfxQyxzB{8+63)fKo5gR`f|m2GoAk zAJ#x1J8!2Mp_+B{9Y`~=IBb*QL%#w1iH(vU#s;1sb@~{*`l!{KfEATQkjU5QznmV62>W-ByKSi6ple zEO*Q1)KBbPLDHQx&q~dvzFGwn&eBd~>ryvEglkrJui#i?@q~j!5~XixP*j(<*F@(@ zfMO%^a>Jl)N;x88o)b`h>~Ht|=VS58Ks*V(8fG1rLSdJ^!rJ~n${6rWGyTlf(H92m z=2r-wP%DFzO#urZH~qJ1h|HL&6FH0Z0CI9R3it7)&0$--))4j*f)!dxaunmNrLE3O zQNJ95n&FeSbBUtbS`9KL?wz`zR75dja}?>z6q@vw^Dmk>Pbw8db0g^L|Y!-OF8dp7y3>u>JND^zO*zBqG1eu9tdLbbkk#=^ znDV=Fg(}tyNnqU5m7?a(PgRUbQ9EOk^U;yfn%q*$RJLqm+-C&r%F8&#V~8p8aSY*6 zT5kbtJ+y*gZwIPyAH1UTZ>9T*SicP>E`u!+Ih%i0;<4PUvpMOQ1g+^CAiuz-Iuc6% zJ?8XHVp(T6apTy@zK3#948(^n$E21qCH6Wwx-HE@{aT3U^sjO`^c7MoPnTNXrMybd zf^D;SPM~G6NT6>#7~BH3@1a0x6rTB?=`2?^u=Bj>2{~55CZ-J5k@pSC>h>Ui6RbX8 zO;K;!{)z!DgSalLjUDgb5qc{aOAoG&Y$QZ)BNH}dHsmZPF$yr^$pacjZi7cLMuFvx zxU~@jvP0*wvL+ExS((t)&N`b~J-yGTwm15*bHI=QN{7HjObNdp&27OuKf~^b>-`*4 zp(c1#ykebd)ubl48TKNVQWW97{PpV}mrS$-LJxD)Oiv|`97vDr-TGZ&{rXw>6B==d z6JdR(GfLC4q(SA9eRc&G3W?L}E6O|IN|CA%B=QlIQX!ik$ z`gsPj>50*|Wq07l{0eCsUuM4BH&U7kt(C{MUt}|E40-|k2hYvS4GzL4ytOW?(m7TO zF1nWUpzQhF2MUm62$3BeE>#;PZp!7YsW+32GcsDdEQr97{;E)!xslqnOn_Qr2P|5a zyeY_$hW+;z@lPF_>~-Y={=`tRRTSJUq7xT87~a2x?G7{yobZ^WoaR)&1%ST;LsIrjq1TjW4T=DsO4P}`|lX!#!@%Q^Z0q?gZSBctqhZv;+^H5) zF3@myFBvrzL(8oA^o6_4+)B;sw_;&9&T&S^=`F3Gz~$=1Au}cL96o1yoqC+FOBN<(_6sqCvCN$dG-@`iDt4#7Hs=uqN9bm71h z4yBuD-!yh^IqcXT!Zs5=TFz6E9s4&+NL*~Jf@_%Ndy?&&wXG z2bFP^?SeBFVIdTIhgxY>m90EKpnt_wgEd&8QLQa0o_#76EJGS&i6cr09y{rmEHUb) z;t*l!ZEv3nha{2Sq4R;)h$S5sUrma?x#EQt2JR5YVm^;OCt2(jKv@s~`L^$dOykjT z!{fhh(XooUcL_|N3m?5}_zW3j^QGT$)JEXDVF;#Y22!i#ps_w3F2AXRA`rM zK%hH_b@={6Ru`6AmR3pPJR?jM*J94jEnlux)cfcTypx8Lzn%^=Hwa23tDpx+}&t*MQ{o^`MsP_-PQRA7>L+Y@qEvs;Ge}@~D z-QN^i_&X!J*C`0j^8Ct&q30k*o=JcobbA+T$g1B%LR&R8c{Gb|Lf2vew>E8(LUVg* zC{;VWF6>}|E1Mdj%*?OBylOH zGB~vfefMwfM?ZzVrcUvKVj}mG zp(bgw5Ee}%=0ckQr-NnxTMxmKnL!oN#kiaC^^r$1>Zq!md>40JLt@pEgKj#1ZA;r7 zEq8s20Jtn2?VbyCWwx+K1>Sb7KOQZkx1{@FYUrNb*AMq}TU#@$n#uYkITR1G@A(DI zy!IgfI=kkHwR~^i`~J6i@x%Me*mvcc2!c$%CE9%J^?qTy+MLc)xHMGZHlvuPxz)k!a9v#8_4Bt6G+?$w-c4K4j~04}fJnH8X11 zB1n%a9j4CEF9`#Q!aYZvqaL8@QQEU}JS46hzu*pDr)9<}Gj$o|IFZW_Bt0UZYM~o; zVEvRTbzGrME^>5$GLP$GquzvMD+t-nBOQQT!=?#7#;Cb8LBmFZ3KFcDx1>A1vekZdYTl&R##e_%%~kg3nuY z3YxAuVr_Hv|N<{o&O<`bdSGAmIrKj54r z=J&yhDLEz&DvSl;VdxOV=jJO`$b|sGAj&~Q2O8>2(jzo|Vp@`og?k{cPH}er(&Tzs zt7*tiYSGSI-3fNw!a!GaWRuBJbHyah0*U`v7`@s3gml-+Alh?C?&F{OR5gaut?tw_o22 z?1@B0JOyBo!MGz3BBt#lTL`py$=YKJdV$y z>V9W>%-tsS&J&6`nM+)y&ko1#+<7;rQD&9dX(}{v*X@L7h4zd)qmXxAPlpVEFr`ZT zs>73lU+t&aRaYBq@ieoGAH^xi&3gYz&79sSt!eb)F^!9olqPKHt4uH&|0t|nZKuMj zmWv&*8uz_!{9-l!)}KgvhE@`=`;V~S^jiSaZVNPf3R*WM{JSU`anuIkRl!(%%tL0N zb@oonPq=R95E{=}IK$xk_Rpg4yil?RFuj+d%TQ9QcL|<8Hmo~hkVB zk01Q7D@sIKCRfj*?rD|Se2l*NL;^By=R?nN?nD6D@YcXX>n=>o85GSu2K)~;+GKJ~ z0{yWaGU}u1q24Fkx*bX|3lnBTXP2FZ{${!2Q@%x8@%K4s3**t%4U^+9z2uHkqtZ-# zUO4RR`jK6N)%wYV#0bG_3adwu3D2uygl*t1a;;qMx2E}tcDl|Nb#_%%&c~muUyr5s zaec&kzt5!=uaxlOxjueyZGK>&<8if<~c57_W27__*=Id%^3#7 z!*mvHNYr4ml{+eN^BGi>4hw1!-&|7SK;YVag$>$L+6;E0n?J63*!Dp8_c|E$^J^Z` zYEQp?*+lF311=z6fKj@M@%t@%O@nc#&=|`h&-Y=4!&JQ;7WeqiYS~;5v+=6RQu*#* z0Le_*D-upf+18+R(KK-xy{T5q-P@3berC;BZKc8KY(F10C>;AJo2Inl_WAbwtb>fW zERLKaD*6H|DRPVP@`t74V>e@>gI+oNKe7?VU)tZf-~Y(FTQQCxI3})p>pjW0SGt3d zhJmx4?pm`s?!$%1ozjPodu-EiU z=KIJ!`Evd#`wLS{Ty8ybBHC`ZJm%`E%s+3wi!k%#)pM@4YI-r4kvY`K>Q+T2njby0 zKhFCqF901nQTu9k&?hy#&@<~zBKq{rt$CeAwl3nP^6E(>X)xV(thkN;bEhEAXIKqG;&?e+wB>uOGS?A4EBHsJZ``Jl z&Y|sF2o^uB^M+$^1*md^jv$t~$+BiZZn?|Oi&6;R#?;_{x%yu64plhkdzAXJ2}C`n z=dNa$2m>cz6S-D}Qyyz9ykD)L#cEiwBm8s#asj5G*&_RS#Z(bRhA;KZ0uPKF%fY<0 za5V0LR?yP^?BR`tgPBM2IIZhxFYX)0Q~EhX{hSAH;dRfGqb`U>6gE`}xW--vBnNg% zUAMfB#sR6&E0g`WnV3P7d;411QugK0$yY2%5uoY6uY+?L^*RKJ(vzg&ys?QAIZdv_^Ys+Ub> ztT}#Ujzg|y#YafJ^04}o-+pML&W}2eXpTjlGoR}^s?Of1$fXDx!68=NqaR}nJQ27~ z6jrG~S#MA@$;`K}+MXnwK*oi5bYX7G@gx7#7Nzm0U>!nkyeXCW0O1twhj=ZF!)v>VDkgHq^Ux zYp>Utf6;18^Y$Yt_l-AJds4%DDVwFeScgHBA%mix*E>B1M%M()w0EQyx?kj443}#> zLmT9>Yv$M3p1$@j$n*#dqhF&V>vOCrU@_V#vmSlu!a;A{r(Qltbn{5}{DWD`_ zpZhKL#$I(Y16Su_hN!6t=YE9_@`=0i#~pJ)^YWown>BO3-__@UxYf?3xUK)sU>AwhQ|q$RnnRL1fIz(Ty4LZvv8Gb)U-`mz-q{R_yabo;GTb=@4g%6nt1*Gx`Z=?q;CI`VuAEzq2I+%*5NoZ<*m02Gqe)H}c1ejc2bE zz+D5mGX;sc=2QkRbGHW!!<(TyzRV(X3eBFb58}RFH;8NWNiKO0u)T&W3E)n6H^yn; z{jf~et*)v<9kD39GYWn`4Jv~apjO$zt7*P*wQnr<@E&VC1K}i2)N-8_GcUP2@pzIKA!{L)`=y zt!QJLjE~4R;|EQA!%A@%QoivcO^zFi`7q`Ih%xD5zVaMN>;1M z(EM33%@QW(JAa}SqB{`3zUxcx+;?}6+yA-oS;{^eV@no`mtGO$?gsZopY&w&W)1hh z=$4RWF<*3?HvTE^89BsSpvcLlqVnwdR*|8Cd9a?X>sGFdhs3o$B5JPOvvrESTxrZX zW4yJ^!A)Dw1&4F(6NNVWMm?r)8}E`V4J$Pu9SKStXwgEjQfnVw^tAq^wY$C}aIdY+ zX}QNF5V)B?EOSm+J`kdYSi{{GW{R)4sUl*(+Ib75wo(c!9hZAmI32a$c5ia=ix^$1 z>~QIpzwWNe=AIH-)_FSqr9eb$;PFq>7yU9;)Q@rHHym%e7A^nlDwSb}`@>~(Vg7fS z;%Ccm_Mk|dr3IKEE}}ou^bLVc zoKvyz%*7|82R;gI_eGKKu_lGg|sp`T{&#*9SWn;+uZw zG|XnrHZS4w>qtgh>?*%Lqu-T2A?S_ZubO73y+26CfjB57MGPmj=1L<1JKc_8ak-3- zyGFBZCeOT*B|0B8k?SK=ZKg46;+o)=@xcDt8$)*DjbJkV)~%%S=!d4=lsOk~x_<3# z?UK<*mX5N}?`sVfcvEFTVzZuT_{HI%EUA5}0c*8c-BO3q^>mCQ$5Q~IF?hP_D7s!= zROg9}HU4RQzLhUy{sL+*U1v^^X&7kv(M8tp50^i3&w2E#t`s(%1x44%0hLm7?KRw& zYmrk+U>-=WAO?v)-vhjk0lb+QQBhiv+9 zQvOQzm4hzO=1dEl`Kfja)gZ-s6y1q@%X`%hD!JS!BT|(9s|t(yJ&)x4F%Dc=jve-- z=gyX1e165%S7#C1^|uapHTTe^F{gG7>~D*V-spX9xZC}0N+{H_F z$0@1WYD`>op1ePmgu2XiFTSxQkP_7CP5=2gJN>6vhjIe8hw>P!2?ts%5dSv$t=O^$ zjYY{OoQ5t%42`D+wy%atc%JHUgkgIS^{lWbpWIQ&kHaE0{{k2mH_h zIUsHKFv1bT)ad?pm2-^Iul^BjUq9SVDxvTEbB!YYKKpniCZc&IcJ%3)av%)-78s^j zuEn<9-hn0qw9Itg#~Z+{C?@Wi;B4d7*o6VvBp~0|6U_5FEF(rKsBFxwOZdr|gfNq& z8l<4m`KQ_18s!a+xP)sevCX~Pvp7&=y&`fq3Etiqcx8yS zLAH=hqEOJw^5D0rwX^E{VD;u~2fg0eP&+)!CM7!cjrh~pIbTI*!rwg~$_vsw%10qf zBv@c{{h*aby)Rdp?kjs(Czp$NH|`vkdB<9xTgui5MT6o)Bo^iBsq?DxeYs@E=Oc0x z9m4N=)_j`^ZU@}U{T}FVe+OUp#~u2oDj@;!l$p8pDNf&=mJ@NYIkOe&4n;hNZ&vf8 zi0?7JNoc=$#r`uTr(>UCO;&x1M~bJge0~5FOgTny*qk4el^Wfde<~WR)yRw6~EV^OCYIXcK`r zKU_ci$J8Z;g^{Cph14Wn$h)6ymnXNX1>JFY!Tf4cCLec=>cecH`g;fwzr z=-GYQ&5Ui=<_;io(7bHp{?N1+xg#`h3lQOtFzN2l;vUGUazC3#^GWEf#un;YL2mvJ5i3d05TmVFG-%KWty~uY#_G_o0V$=qzNj^!82O^a?qA!+eV5SWy@7 zdhIsc6IP6fuIc);S(N2*>f|UL1_4CyKf*jyH-vwsd1QzJjgEVRO_1! z=UZaQ$}ZtG)5*co!cH1Fu(zaI&Bkq=p^h#$K@eSQS2oar!fdp68_7qWOc~pGLwwzT z$;2k;&ZNj|-L&isNjD!na?5w8!xqLd!{U6B@)KWA`)^rLZW!qkOg;OQ->;|l!~?w^ zP?ly=D#$aFo%gKw<(QfA!>q<%%!q_3OS)Cx*{XFffT)+oQS$S3F)&_k3FH! zWoJB?QSjSzs4V=syT~L?E#kJ4>oyy!hY71=|KZi-jr&q}>@pX|*LakmZ`PTg-7GH! zIYC_aLMHP4I0$I99#_iqbP5GEQsL>+Lkcp!7%Gem$hbNxad*Aa!lGL_O11D=2_^2ecQ$X1ZU`?D;(u z{Hq@gvWc%hw(y>ep(>@^HUVr^pHHX#y&QcN6eSMQtAi7sZ>7WOdN+Pd8qlguPR8p;Ua;0mi?@lNS!L^`dm3=qowMc<5@{-cHev;MPNy5=DkJUB??&wWHP}~C03uFkzR^Lse-tCzu)_#rT*KX}xK1m#(!_jHp zVbj2|6^e5bi8R^U|JBJ{VIKV5eT|~>`Dew3fH1aWCtvjNSO+4rTw*;z7x}6&A^1ycQpDuwj43GAs~`NyQ5E%D|x-U(_N7{vMO| zQ;Ou#!<2#-dDnx}BHmE+>b@dnHZp(m-B=+c@jI9Q&7}d8wxhK*`FX)L_r1MDsmFU~n{t%m!qdis+GUg4~bWDt~ayLkP% zxDXq{Oq^!pmFRCl=7`A{0t>vv+8auoC8?)8PXe^8T5G%27xfy_J&q1}nJV(Fz*YCP zl6ppwjqHpv1I5YLyPm}+!ZWLlZ`a=1a~=w4;@F~8s~v1~3R(EyufI0-4z)QyuGu%) zd2CKgm&WI7Mvf{(^7U1xok~@voYl==9NlCI;w$~FN!2x}tNcVzEqnMez-&f|6CcgF~2YcdQURm-9q~kAO@uG4-w1HcL+}( zYV;F8I@J{z$9^Rk0lYyPVzx|FsUP$;+BX#5eF=6e#fKR5w9qS&RG#X4=k^xNmfA0s zX2-pI_f0$BoXr;O-l6v3GVTEFAV)U|6RwI}?(Kd2T$av0p@*u>+4o#j|sk#%N^H9$^dmQ;0 zKSa7U$eIUdYkufrRBYk!?@#QN9!44j;Ya=iEO8>l493$wDag#Umv-DtKKqZ8ACRnc3m+F$5(vNef`=8o@-H;WNs*HE9S zz+#wue4g<7{-a;ON>fPYq=K3v@jzhFsFc9-hv1nHS@n}7dWYR1$C`nklQT(Ck_T_S zHzXDK(|pdc$&8DZKe{l(dgZCQ#*Wn!VxkN8*)aYou^tS!1F6-B|BssrGkr##g?Y1W zZnO3$bu4biAXgn)0;XUu)}VT2H1yQg`9<;Sibow1Zuxp;Wfioye8igqDtxiF%Rn0KGk^#a+b*-)%lArW*U^(#|(+BWdF{5UfID*7Aq~o=Aq{ z5fk*iAU%4u&2^0b_RsY49<uO18QyW`(w9i4)nD zOj~0ysHxAoKgJeR!F(aMOQ%d{&3W&};QIX4m^F^D%E6m7;zIBDy5IXc9J@bHX`S)h zbGM>6s8AA4yu}gF6ZM%T?B+eC!bL7g(`^;Y^CP=u-_!O6YpeYy@untE+HTKNvMbR( z!g9y9+dq4(&Z*k_kiRq7F~p~&G^7GUmGK_HXuEcIquKteI1R!~IX-(5mHPa|_XCB1 zVhQha^)ZkZv$$ip@P5q_Cu_KCL7>5p# z-(SU$@P|pMI|WlxQ{`YnhpqNY29nNW#eGLc5!E|=TALtf&k+1tLlm<6SMEDTtX;J~ zMF3doPcFOL92^`9rCb=rtK7ywo?!}fi8-B5=zJi|FK#_|KLE#3S^3Q{anNKo5tmp+ z0D4=m8-yyeqmG>=RS(gAe%K9zaZ7HV(?&529;a!;Mmrt4(Ra5-s?4KhOu{aO$RPHU z_>tNTZjB>}vIKr(+M#R01zK~O?oV&oCTTm@s&cj$;)S+do#l!laeN&kaS%L!?Bb|( z-|s(%!^EZ>dDJkolqBjB+WZ>vgO9LWVwWBWb4LwP1YazEU2sSqv-)~^^tR&83YBW; ze&r?3k|8bCoC9|eSHxWAv1Ux?cWq_ED(|nEMkMgOD*INaxaY&^-my|fr%&1*rlEU- zSz{wAG>5dTIx~{&Z(!F{o|<1Xcg!M2ahk=z1L-`Nbh>m%k=26 z>5s3o(DxpVzY1@jtE`qyv_EBAd-?W5pein2oqO@kpkaPzNsJziTNWzvZObK4-F^Wr z*_-$8Y22gcL;nkm$HF*4800g_K4aHWpbVo4;$kjgzxUw}@FFGv#RGA!+R213(Q+i@ z9&v)AEH7EVu+nx~%3BYVEEdB!djLpZ7A&ddTDS3BTcA9E36d=2SS%mX3cid091d%U zDPA`W3m;GMv44$ZFq53%e3};F5&$#4CPL$eOX>?UL0iHw4`@!{%W;8B^8(UMV8=b& z2^CoveFwt~*Vi~&C;gVq4(y^n@>X`y90(;`m`IRw&71dh@DLb z9-)>lj48!^zRXw|pH9}z@c zeg0?iH{q(+1%1lJkKECN6}2?CDNPrLw(%G2dOvqq#F3 z9f3!8E}N=q3C)^)>x9_5L1dlr*}3wQ!H$~gY&%_8O>N!g=GyAnTo_6Os?#dw z9jTc12vm~PRP%KAbVqfvbC4nLRla1-ZXWq%q775zPn|!tJ>ykr(2#zJaIA09O66P| zHR#n!p(B{%xPGiz&2*YR^tjS9x31}IsJHHRgecMSQ{-6X9&ftNf!*lH?A1lIGt*8< zfk#%JOW;pN)WH~E<@LK9d#g@O6GiSl?Id^Sr~o;$%s8(OQe+4~~ zdX340)i<5bV2ko;5*~-s2s()IMT)PCMVL^Q)7N}wL+}NL(?7+f?aJzGDbD!XoT=Ka zxE0Vw0C_Flrk4zIP4vjr`^2tS`#&ZeHpR(!bxQnd1%uDTTk<#5dETnr8 zNcxi-rPW)dx>|Y2y;EAmf};LoZwb0aZ0W=AkyE!Oy|2UMdD1pcx$Zg-eJ^sYBSrF7 z{OZfoXLv)YJ&t$OtDki+dE@L_fOD^<{3>A|CL+Ke2lTk_YFepPZg{`j`T;!+PN*q&o?6U{|DZF(-!!ps77~S$)`8aj+!Ng0^kMMn=?icPe9$?$ueDLmT;8-0T@7f#_5YxtU1r)y&G$Gl4xtVmr(Q10{d45r>tq%##&h;O2Tiu$ z276dMBX}OR;=*yyF3&9zAuc^CD$ALU=r`>3R&n_e$9BV&-QI+P?XiSLXOh;ft#HH)eKh7Af3wGt09RJec~$;WmgIx_RVUrH z`s-=FxtI0_vv6!@CQT+~D<23)d@(78H>!^|L%{g*LCOEUi>3A9&x!^cEub!vv+-dt!&Ott3$2F{~Ey)^=$( zk@D$;F1ZkUfw+VngU!|8RL7gjjSoONV&L_V3uv|E_9ws``A6C-k=km*7JnE7sbA4~-!N8Xu}lvo~@&yL*)Z#iYp7>&8_L7I8a-W#Fb{UQ)C zlIyS=r&oAbHfx~M6khe~d(Y}h?uVV8CR*#_$E%UtIUvOtCvR`HthlxNbVn@2aS zG7sHPO5BQF0=^RmM3`wZEmhqPET?viD!+=1(v~fKS=40Czs7>S?^x}rI&pQ>t$0T) zF4-~V`^?^)GQH)5K+QscZZTg@E>i&UGMoRV$GfS*oGPTo>>E{_yr1sOehgkQJY90d z)f@`uK!eS^b%eJ3NhxeRmlM^-p0l@K;qYSnL%$uF-yv`P@*T3IGGWw$I=h^!(i#h4 z$jcYoUOV@ZpTt$M4UF!S@ zgDE%g6NfimDM!ifBw&y2BYtE!%!Y9eJ6_*(+4??P)+K@D%vE^ zvU(J9c4o6RVkq}GSi*C@&^)*t*NqP?UeS}1t9>dKK=maeyihYrqkRq&%%lwVnEdZt z0)@|%rYBJRBgB#nK1lm!iFs^}vYJD?R^4ii)k$7xqg_z$QMzcUf*ru{1<;$P66Ed^ zb7e*!yWYHy&Me<{?&W@6sc`{qVL@JZiGNDx+G|gv*!PYd2a6){)`Ja9@dEryFDQ>a zX$Baf5K|5$W%zL*NaKCaoMVz`wV5%9Ucf`9^rooGR4#IW`AH?^Y_QrzC+qF^b?%~j z8dE0}Y$Ipp)MwwnP|n*g73u%j)E;J@yJo7^aW?rEh2&y-{bhb5p4nFi8iVdX-Eq*o z_1$MC*ZtU>{3!Y3H^WJj*`m|f{kO<>?u7PN$hZ_&D89k@Bk&QBf@c`^arb@%YY+&g zm1!j$@A(WH)0{~0=R%uJFyz|QV8K9>-+K8i!o2#!ec+r>9&w_f1KZrnRlUp<54HN< zS!dmlpob>)*V~ReU)9q=A5Z_X`%9`<74GtJ5C8msNHCHvYzwSZn?7joiJJeOw${`2 zaXR|NpKs7DNMl<8Z8?{(5stRvH3@j{yF-%mcg@*Ob{!Ua*1f%i$oS`R^LD5G*U}Na z-iTqr;b{S7gws3fErY-_nX`df&&VPI9Naon$zLvKzGM5_D&_qiQ+&=N(A3Rj4=VAe zP7e8pXV+hx&wCblMKb8FlL?#Zx9H&>WfhfKSO|GKMwDQl1_8NYQ-Gs6@if)ki3)Kz zSKLAYarg!iU)*2rVMa_Bn~DEk2tKSqLj&s1h9qPt;k9mXcAAvW*SpsTToP6{%4YhI z1%%k9E=nH5hNZjMOju2IWjikI<~P}Yil{lqTR73vot-aFag|fJ&)iR#osl`iMwXMQ zZMVduePH$W4%1eZYluhJNpMG`fIvs^U#nh>BnT-^Q^)jRXlBMp%dA0s9wP?Egu->xEZ$oHJ2IRTY)iGRWxpCuygw@*x@YLU0wS$JMss%DyKNGU~T0cq#Mk5^{1PM#z zak+Uv=U}eB?`Fq&B1^%ALYH^-@OE>A3vC8{(**10falExl1 zZ&R49a%Y)-E*PmtpNJ0U-*f6;U&Rndd@46$KgklGfk`)$tpMI66nk~$RG_hrF(0WEI$!~LoC=a`bzH-jOHf0Sag+ANnB`E*LxY)OSjKucbOG<6>mW0 zka5cAGBE+pAPU=o*y|)v#ZjYwC#M=M~1TZ;c5EomtV(2 zl`(jrSBlvPWeS57rrJ~1cB%J@oJ^5%*b1en;xhMPp6Xe zFWR;4-ci84v9P&*&W6iTmr6^r1>r`C;CGhkB(?^|p#c_3)=rSJ>*79h%x<=XF z>Zn$w`CJ|22}WgY^P}#q1PKZ-C+uu$nZ&5rJ>+_g07cRcnlw}_WMJ0@DGK)EV$M8A z$$*QI7zj?5yy?W~(r|H(SWO@P8in6Ftk)KxGg-P`ygkn0_7#Gkvfl|oExkzl(j)ds z&>pp0!ky=z${ouC4ypQSCxtzC2Tf4;(fi&iqTfX3Ie^HogDmAgackM(-vjD<75-i3C;eQU@n;#9GOD7Rbr4~j3g z8VqKqqH|$LT18IER{wp~A>;GXRPZJQ_zYNXzh;&gUIBDGed3BkAv;2~^8BTaqZ3Hv zp&YPm&)cqK&K*2Pa5k=##WGmUPfPW$b)|$f6)xIoXGxyrwA|36jp)P(V@Ja^bjP(m znFcV+3?bVT;cjU>&-bF|2m7Y0wZ@{!M5|!@nlc~e+bzmOuM~QM$z5dpT7@LI+HEvg z=zQFZ`7DQw!k^>UQpL_zX(dKj}oo)!0lc)|mvqDB2jyy9@@C=tegn5uXBs?; zDZm6&f+?fP&^gn%PIv^YM%s#%3FZ*HQ&w|{MrHZ(K$T}mn--s37cWmGPCT2Uyv&=^ zrJ@(FdLpjvuKbeb6%JUqTmOkp*D0swYHaV&ujFjgJl5Jf#r=yU;79>Ntqn z`o(d1SSe9}%Nx|l-Nb;ARIi*{A`Wp;cdOL;>R+;ooxQ^??e=w|iq>AY>}C3`fRuem zrd;`X_Q%CN-Y~~e(y18fhueX|zeQ_`=)%m0!jVsPe*Yo z;S2|A+VynWV@K0}&(TM#e>&!WM3jH^o$x~i$@<=&zge;TFN(%K`e+`#SC+IVyFs6z z8Z7Efojnn%zmPDiOw_67#9dC9ncGel2ES=j0dWzwS>lS_C6ok>c_E4~&cVqG0L-tR zgmEpMDbZ=Va4GgIn~RPKZFF(#HYk8yM=}kORN1jNUlbQ(yXW7WL7NSVc1zG)#!_x+s@hM5V!0rj@A26U(k)u;liJ#Z+Il%iI4xpMQV;9)MZ@xaBXp z>#lH@3v2wW6D$W$<2Q3eME#qmq6yOI=ot-<3O8g2Gt+Z#ZJh|%33XeebC2yRjUSDEypLpb)c@U5&?* zQ57seeuJ?3X>qtvAyv_ba4`IkBoh9Tl=bsG){^6w%>B@5_h$uWk&D*AUI9>rA=27I zPEJn6_UA^@JXrcQ+Ls0T*5z?lboZnW;zT&*Nt`VdqQI?cF+)G-ua^MMF3y0F@iL1?mBiUx7@qJY$ zBAH!xrIon9KcU>{$4sp9JO5f_Bc#Ud%q64X)SSI{PEHKT7T$OU)f%@s1*!WgW=jK`$w zPTuz~Dy`%R;*>(%HoUfZ6frhSyR%nd7oi_lNkw`PXM$o~rYh z_65n|{(x!roBv}AvBSWxLNBV!oIuItZpVkCqhb@{Abtc3r~pS4WxpE(H&N66yGzhY zZ0{%@F->^5D?BADiS6L=Ji|UH!{ow@nB?{4WY!?`Wp~%@-}?54AgF4em0A{_>P(QR zq6nP(+7rWDE;EtR+Kn^k z{&o`^QNl=f@L}w+)H(R!SFYUq{{UzH-T}_wKfs4Sq@sc>^S6=d&}(M^gefOO`g3#XLJx0l>*>v$v> zLyC40dc8m-KiiooQoD0>kds(kh;+A;3}xE>&X}`vrAj4Lao6P-A7%BrQ#pW~dL)T= z_d;DE`Id+wm?WtXTw_$-q$6Y~k^r%_oZ>xAE;eFKN*(?JFdNL@@uCK?=L_x88p0qfXfv0 z*J9*fb!RTQ+Mh|ncmL`ekssd9If%Tv>1b#j>gBYOp(bU;a~$E;KsU^E+4e`fZCmi9 zW{_#a{ZI1_pvN=*lA4;(JuUptS4M#O%6wuHrSQ+9`7U`@=SnrZ{ON%I_oe!)+Q^sr z=gsoQ`$lY6sD~Rj3K>1?CD(FE?@luV`Kc$H59~DM;oy89>)^A-oGkqtEJ2-#_xmkg zjGM;!^RqkNJ%{J1H^sWMIy#&kc-UbSoSb{TiSdjse%~ZS^`?)e^6oknU>2z4ZA{0o z$v9!{Odsu~1(@mYo?w84OVJ8TRw~4SIHexNQ1r|c3TL(>h3Cu3vl)`elQ*E+9o|ZS z#EvFpjrqCE`Py`Nd{n>eCTgb*;{PCzZTj#ZpsVXU1;rE@zTpp4Ki@|~61;kI^MCaT z|E|{=ytAI3x*9Vtb*s07`u2G{yX9_ItUQcBDQZNxz`{Rx**TW%1X7f)L%U8 zN{VXdZvuMG`+S0(_c}iOf)G)fB`g}0;CZ|gCya~dih)h(Wc$mN*H!Zo`!M1GSF<}o z%Lb8 zTgAYz^TDYaqb2aKVf@NpTaaE~OWE~_>k(cTm+1Yw78|aW{D|wMP*(T&4`k~ZfCGC7lv#H zDqZX+3xNM}QCcTNJj3o8deTf9gi~QZ+cMjABOaHHvuMO=`nAL5id4W77boX$eg$CW zCfqJEI630h7DtOv?s*kA()NA{5>N5GXAY8s+>7OkP7$;`kan#_rz_7TL+##-q5NUG z53S{1!E@!t&XyRHYQ}D?mOFGU{6^!P^TCpQ(CK;d`8&HcP8Y;Ymh+Ev@(c0^OyvKp z_Vmmnv`b6Ijn%U{%@o%Wg1GX+663$c8Qu|in72hz^A2@nO*K@zTdIGyh9Ci~`;Mzm zJ!uNqFJWm?pO`%b$aCrbR7m~dIb|{5Jkr1S7>wA5AGR6Odrlqi1s>J-tuJwiVW+C|TUHBTtsA~ybZG6TiuM17IaINp3`H?ml@i54zqkx<-VD8%krPZ_u8oXJ^x;46 zb<@a|D~hM`@)o&0fE@|#fLt0yo~8$)vG*PFDv15MQ~HZwB%-|4i!1e>+}36WvgqEx zWIl~4mBC8mEk;UWw7)*t@pYH?fnCs8PUY^qmev>IG>HM|up>A{9}P5_4ya${F$!|Q zb?eoq`upSWL%(r^o-wxR&R-3J1N-M+m;SCj#jqmf^;mT;>eL;ZMv zSBjh}b?c`a*FcN%Ca$UUf09Ts)aAb_2*+MCjg(uIjj{36KcCeoI6v~;rzWu3F>2w5-7`yT+wHOJYfPKu}S|;w9^AFqqZ|3u)Ia6((49AgPtqw+%H0%Qt>%+pK`< zr4g87!gtl3e|`7-+WNADpqLOl?Mm02W}fH(b^EWSPv_VNimi16n7?HlSHSI?x2wDR zoCTF;A?%YGd$pxEAWV1-2@~D?aSqg%z35C|GOB%{cz4K8zGhhCb#`$}AAix|?cmt= z2gO?(&s^m6a?rao?`T)*jzg#I_aG~-tkkKgWM7*Lky|so{V#AyoFr)1GZ42Bp?2de zu6Hg6sy|c1@EE-;Uzh&Wjd2pYV2kWd=34yU)doX3UQHc}v@iuWq@oaMYeNms^}JDK zP0t6)Rtucv%RHDwz2X~f|4qbNmt^SUKpnG>n{uDDmjdK*mTBZ=;A;M_YJW5HSAH!I zoj~V_^?XVh_f)FL&tS*e2+{t+@i%8oN7p%R<$5fd=EHJTv3#$TeSiU4CdJ;o1vya; zwg+^NrNy7NG#~S36)G&5Eq`XdE(bM2Z+S#~{1wy%tc(j8mU0$EnRXOCk7Q*d!Jm#{ zBuYHHJO{dwa&6GS?*qtbc9t`~H7<*w0{l&Mt*%nNV z5#CMHR|t~dd@MG8{$+z`8B)T6>kr_;`}Yk!jlc|$=G^#H+&d921L_viR!!+_AV%#3 z7B_@Y%7IcpT1(b?<=@ASY3fg42#n)yQz>MeStMIDw#^&GS6invE>N)lE^-46wt)=X zE5ogjQ{43l40Pe_B_{uzCf=Eh(2F(a{~q`II`L(nlI};sJy{=iT+(I+!Z24XrobBL zz@)%-x7a$Ixw|&b1$V(HI6%^GfdViZ6AQ%Ig1e!z~vg+UFqjLEm>E2%z(x)= zEl65^Oy@Ll7L%IR&pb6g-6^ycO2($vW}fK8c7@j@6a#bQa0T3%GK9Q3N!INA`zehu zSr-}?qemZ-dqWnU3?hp)2$$_eVD~-Jz7Byu_o@<7n+sFKHHRVo|=3y_2vzBtlTax=zO33w3R=!9$d)*+XN~-Y(E3m1;~jq) zwZJ2M^;tQu{W2W3qq}pnCcegR@ zf_8uez3U+%;qw&CGjF1zI$PZMZ{p8fKg$u6`sK?HaJ5e%e}mhcEyFe+3&%F<{Mw)X z6Xqc?+`&Aa=|;6bleNG99gzrMs40uiF6{!gfg&*xEOI1)F|h z^0fmKD1|mrmzA8}GmX?FT0U_@1(EOoQ#kHm($fJTkao?}=kQTX@SD`HOaVe|21Yn9 zwM?LU{{>DLs{=CBXvFP5GvL3NxjvY=ikXqce~@qRD-9~b>My!BcZNis!9si_wDvW! zPC`rTc|G~Ps>)Wh-!RvM1L;U!?wJ8s*h8eN!*Pf;P07TTZ_c5%`c zbHJZU*Yb>*&QFTdp682k>)+ntzxSUoDF!tdVTQ*f&ItZ*&3a)Qyn^+D7*fb)M!@$& zB`GxEctdUp#u(Zj;J?Ojq}9D|$>Fxubuj#{XXYJ=f`F;Dq5&Fwh%|CO+^1PvaAuABVNn2qa z+ROL`Tmu3j^)4d2s@Afjccibg#*sNYJwdqV{Ri*K5`v1K1VnUdiZ+Lmf zU32(eS%a1w8DHcOcQJgb)x3g*h-7-`quE;Jjy3`r!y_4g0!O@JnctLZ6V1)d9_SEq zc;vYyU||@)QfeINpZk`OUL;e9xb3}wiZLbt4Xbugy-wc;z(bOlQ!)sdBPqWB zA}YpM1HOMzz@2^@d!Ea#@!e=ZrNPt?_MJrrY}68LP7!GAB{<1`Kr?1pWPMC%z2@Am z{cS!N(>!*?UBiJQj@6Kh zQUd?ow*)W5)n>Opdp0jrE@dSYwAm7va^&mH*B}17MMYvv=QGPVrvK#i{`r%4aD`Ct z>36#R=aeH1(&XP%jg85ze|3&daX3?3vSJ&@`*L2fezW-v#C8>2EKOpE-C;K~hGU`S z5`U%_$YC=xea2nagkw^v3(S5=oF}4NR@wH=ut(g(7-myA4!u z1Xp8WliNP~pkm?lSH2^l)@l{6tnpiFxM_hYsYEo=MRTfQVH#;5gn`TM;5N)2_BA@}bs zbSMV1gh1N02{Z@%DIeEIRoJ#YqE71{dNMUs?l!zz4|941iQiAA*b(pWUHuVbQ1oSz z{%+^Vt;RIP_O6cTmu6!m24DNIDR*UlFG2oF47F8>xcU?IAkc%ns=tC6o5b#7EG(GA zEQO9Pn4IlKid-C~)*^PoltZ>2B9Fs1Hs~ByM+T?8!(qy$Q`o!pFacQfvT$NS&(R1_IRb&tn{64Yyafa@Uge+cy7h=1^@3>LWS7BW_7Y^cDaW6emKl>o`{^s6WqA%m2 zDoxjqlR4hl9!9@M?0;pZ%ORJQiN>-7q=(Xv7^OEI=~lDl!F#EvW7nlcE1LvA+Rx>R zNv!%P@7D_WoG7)?-%1~j#lyBuBqfM`BaxW;>iUfgTcwl3S29v%w>sQyshj%?inDJ? zi&iTsu01mrHT1x-rr%oA?l4*^4^?5cbK7N*9Tn_;Mfu(jlB|< zMyoh1gK#Zq2L!1{1fVc1Eg>kM0fmUP3;KCTtOe2P^$`z1=+)qQM=geRjguMKvyQ?eOY(Zh* zAsSF%15@QJaSOz+Y=54~{^HJzmxk$^z_<$i?Q07d6JT#x=woT*@kiK;1)<Irc5+C|!Q+v&!8l%r?ayBLM)M~kZc&S7CX6FTkMygd5em->eV^*dnn@zLX{Izm)( zzkdNBj86l(x9u6!t^Ysv{`;Tm|NjHW3uT2PNj6#8MY30v5Q^*-vXZ@bG)VR)qmq!l zH;J;zJjp8ACuDCvx5xAOY`re;@8$akd_F(a<;3Yc&g1^LkK4G8CDt+CHIk?1hI9Ue zJgC6+9aL1FCltY3VWQ;H50Kk;F!q0Y9+>g4@x+!_KqP~~w;PZ7jpz!xNG^TdZ+JoB z=KGdBKw^)DrsQp%G@e|ryNaaf-uhQA$u$=l3dUjWMXxTk>e@-`y;q7ZpS$Q;rk={_ zt^Bz0BUFWDYL!Rflq+Wm-^!(V9`|{t=xEDP7VBN(YK2~53i*Z&lZBZ^CThj2pYeAo z1-BE$xGSwH11?<~u9H?%U;3zaxOp%*PaSra>QuPnicP@UBC&!PuEb_mgQmrcxG6s0DPjt zqK5**QfF#F*{GANeD^kveaBJU3pVxpE(2lgflSz52zZAjvu>r0^9^y6dd4#=yb<2I zt(P3lf=$!MaVx|F+AT6#7UWR@7H>uanaW&JCA|9^umc|y6kT}+MM9|%zh!%iqdb}3 zENV2wO{O9>#}S3{F|SpnYF({4$>k=pHdE0-;_Q3ek)D{oRE7hnX|>dDj%9zCg}R*7 z7Xh*{S}kcN>1fs#JM4ao&Ii~}=yDDc=FsjF1V57PX=(pY)J(Z(#mwiO`c4i3} z-)dIPqW%vXk3yT)k@Wrr3fjj#&?(Vy!ul9_n3wmLGKk&eM>xRvavw;x0F)h!raAX6mImTHfpVBT`t*$t{UVMjU zlrv+{mj%@laWZoC^JN#~!nVk49W~)v-!v8<-kVd$hJCr@S+eCnJZX$9Gf6NV5Wg`H zKE1J+qNJqyG%xCpth}Zy_{29us}*u?DL9+ortT-46A`)Lg9x$J~=fyo}dHwP%>Koa9e z>A*&HHZ5PPh!xn1G_dk{8WHz`a_;+#vy3){{FekqiW>D(m9@D8)5iPzZ|Sx;5lncD zAm!7Sm1?N*3i~uY=K=LM9D^irbBNHD&6~Uerw<;^4v?U|a}GAct4CcS%^yzqfy-VI zC+9zFbKuveP0i&Z#&*!|9IYEkGpJUd;rRJWVQeft~g3WOIo2Uskn zX_lI)ZEIe%y`@|_G2$unc5n`)Nu!{EKP%_=%*i^PB;}l|j#3(*thILwmj6Yrmz^Go zHerkNIGPrDBT|Wq^r_8mvHo~1Xp=y#mH=TpPtzI3^xhS*jEv6h{@*lKYR_f+g-b)5jv%7 z)5fn%ce9c9*}B*3^fDF{McoqhCOh-Y&9mj64GBqP?N?jnF^X&z%Di^NhtWTBSDE*n zrgLQi2PbOOQ0Rp(KKnnaHM8VY{N36nac>1X+-gx@=V%?joB0N_(s{ByEV%MYuNvPK z`@mh)_U~@@M3_{8e}z0=J<^7APcJ;_L-8Ph`ww-^f0`~oz-@#imC-ZM;GZxvb)a03 zM%oKXV+!&76i4E^P$EXO1V$sLq?O`^pmMCf++svD&z@ks46=67$0{>CM0n2-+Lz#K zqI|zTqWE4q_o>T+XPSI)_4B)7=&^9^L%OZ*jF+aYXfjGt!MIUYc5;JtZGPt~;Kqd> zpSjDb6@f6IIWQ0k#8xj>wR34~>Y!XX&+`>5S%huPn^A$5kb`8HSm3e;S8-^aoR_tA z<U$Tf+NAPKO-;}?yNi=ys*u`>%ZiDva+gfL{Q1(E!Nlw;BBHlds?u4G%i;?ts z3_i2DoU%_A;(g1H8F1If=&oBP;MylG4(YQt{p_nU_{FoLLK*77>S^}}$3d;N2i{Xl z3q6`YB6(1`K%|d{PQ;JOU4(*#J^yh*4FW59>kIgsW?OtweL(|UgzIC%0XKGALn|MN z#JO2ggfd7#&3Wozq?Ldtg;a76wBVvZIB@v=RwLq#(_hSnv9F$h-j113E}>DcVH?c< z!iKLaR2pq|ehb_Qmy6VDYGH?8IMY|~aWm$vGF!!QBrEfAs(#D~Fauiqq~y7GguJ(2 z)?_?DWnxrN^&o&0O; z_ufcLRieLFm`mWe;VqA;R`?4UYt8`pD%Z2t45AuiW0m;x z((hFRhTWUW9y^QnB4t6J{T+kd4VDv_t9A?exjF*t&{h#77^%d-;4DLL1=s1mOt+?? zz19()4RIFWmrjcq=bLL@u4#c%CgDWxw;SX+YlZZMkwrQv-jz>b(l7AkP%5KawKTgs z3C};sOg-FV;oAIRh&vie^ee%CnJOjZzlEf6VE0FWb!>Uom!bmekIJK83sTc`*zo6X zMWj@SrV--0u+y_B{|Za)kWZh1OxRJR{+KDy^Xd4#4}7j4P`3S<5mG{rb?-IlZ^T}* z9pgd;B4g66Gy8D;Slb>;69u$;Um}hH<^$JAo7R~-x9?MMVUkbJT7NFNx%j@v3^1IL z@$s3@s`Zs#BWVbf=!c!LNSjIpsxr<@xX2BLxFpbB8*v#Wc0~J2PUJ{#eR)vT@{Qd7 zt`; zrL_yIHyYS}j+CDTQZ7n#4Ridn#vZ5+LuTS^UYRF_*YuEquH~{e8z27UD+U`K)5euk zr@x^_Ygn}2EP@*X1Lpw5^86|8a1z9j7dz5H!>$fdY2bie?%864xArTUJN^E-&^In! zg4pfWp%B*>C6sel`*<=TJ$7Wy3vINZblw);|ivbGZ!w~R4-hre$(m+;>$oYy%+cOLrKRbTc8Y{+&xz< z1*SZA26l0AeOetUNX9U2fW*VHoGw;Y#+wk@Ln<2Oz)^1i4fB~;`Vh+IIw%R%oBNFU zlNYahG=flkuno(c+@`#7gQ{v~dt8;`?%fXuE(8;i5j+879cww^;pKs+7I%_ILj`}Y z%`Z=+H1H>cqKBaKq9SwtUwXtZBP)h$FsKi3KFnXZf|TGWnP{9k&P*ulRCOeD&ulS= zNBIlkNkZa}XjLAg&MScyG)qCG0GaH2P>1GVq|7Tr%(m>%3!KL|1Jii9FB$;S2O-nP zEdqorb0V3E^EK2Xb>cgE|#^m&Fe~)VAMg8Kf@*Fc>suE)-aJzTY`#cd zLkUlw9xq3)gY&|r4li{sH@Kv+WOcmHYnPYg&Z4f5>hrY@7h7N4u+XLrW$wPOi%oMM1*^5))}eIt=z z3-rnc9KkCX zlt6PA3voYXpS=>4X}(XyMY>9DKN^8Lq`mN|^u5SK!{8_DXAxm-ECb**XuixEdx|6+ zon+QM6nfQh;O9}=AV_mhN|afP)+Dvza(8pdSzMKzqe}#BjGx{Gjg}}kxWzwB086Pf zV>A=V(i#YI_K!UvCFYLz?Xc>3`N&~7%xyA7ufz)cunBR6!SsO(z#{$+h@r&d_+;DK z1OF4KL+@?YA70^)VW{~w`Uc#QJw8+iH4;IovV8o)>W!;cuRfk2BEi3g1XMdUx4kOt z1ZgDocbc0iK&LX(2R{sOh|C5&(>O<>P<9`!l=O2TWOL+O$H zS$?>-&4Dp|o3c$GaFxIemVO&wQQbtpSjOk zWS&KHFKp8KM*(w8%bq(HMv_dy-2kp*|-w8sP3_)eGn*tJTNsFWQfedHj22sL{J{TOveegEu z58EIQpj@MW+wlO~Hc0tsypNaUSl-pywMPBJU zkB6NzT#uGK*xDO)^{bA4{LH!Oyeli-zR=tIGIVt(#c;mdcrtfD|NRS3CC5>(BO6{#&^18Ls-?`@hB}@8q zD(B>I88ZbQL%9|GVZ%zL@?)#7^i*f_S|hd2tHXnF_^Vhgi{oc^%>E%?uWt_cuf&yDp_L!?a)2keY))9zzj&0zFKGwVaS9Z1w3(53!P zaQ@A7Mj*6sHGh}1g(NdR8;P8M-N3(_xZgd{lx7G$e*@JN0flKc#MH2?I}ZET9Uw2H z0DHnfM^fD(;DMl`s41uaPsk;X5<@o5vZjIil@#cbK5sV1{yCce9T=_q;mR68YF}1IP5guJ-RU z4_`oP-w4_OWDQrKCas7x&EU`7P{h~*XmjU>XWEbc%5RYu40OmK2k1{z)dC1+G33PR zUt{ufbp2UTISdHMzl}(6#&jMaS`Rd`_%dH4Ln3I01sNwo0O zZerI^DoPk8xepR{r~i-Vh$2HCa?>RT(m#KB0Xb`ft-^B4-TV=M&10{(61~;HsRIe_4zy5MSC0 zsKgs|r_bGZTSqd<%EIzKPXpTQyD3OUJtTJ+VQ{(9s%NT2&Wh^r4Gg^a}#RTAeYi&{Dk;W8$_FL>8e#I!jy zax&}ut=JV%`2bfa;vp&H#{AFTct;Y3Zm2t+>8~M`LJ%0Zioxq9fHbi;5o8afKJTW8 zHFWJZAbJ!|1jM)%SOP520a%_0cG%y#?RWeA-^nA4knoA6rcr;+C1w;eGKa8C*5l9q z*M%1`J7Leptv}sCGBZ?yA}RBAJUG?VICQLx#qTZtb*RWyUMIPNLb!B#fHda_b^F3p z#QN7Tgi9&I7Lua&N|^YspW`5~pf5RE{2O>k>WXy|5G5M@#2MDiImwO;aG=3@qH+y! z{M)7eEpl!KlUe;0aY`ve$1WwRL|Ee$T&m72q?WBAXwF4uEd2hJFI&ssKtby)q`1r^ z$Tqoqw8{9d9X!w&=3$!Ks*v*^KlY19Jh;uuV+jfGOLgE+I3>`%%_~-jCDQ`;9VC5t zGY(oWiU46L@(R|PKd*zc99$9==`%~xDpV!Md_nu<(_7(9@1}~ZIhB{RnJC%9D%MiN ztM4<%)b_K4k^DXCt;hmgS+ukH^T*4G-%8D*7@7#{0$X4}aV`vhfPq)J_e`?uosZ9@ z3Ep9oh%o@+K+g+%xp?OqMUzVI_GM+R{nR@&yTjHjm2b+!_t3<4?IeQVnj&2%Cs#0*AvV5)8sZ->#i*QsMH^RX(^l zC>qkl%)Zica%qY&Hc5wHJ+#}s)dT}@0R@Lg9(3*h5jTDYE)mE^_i6!e<{z=QUn6z) zRMYn9CZw1j%t#lvbO7VzI)0d+S8*hd=Yc?YTG zau`xlSOdmv&P7JpYAwZ6zQ&vcsI zqByE&{%$$GXDcLrPnJM#m_R00l9g1ye+GJoh@|PIjfiZ#5LlxG6EA9oZ;s7_Ta9Yz zUG>r+#3}Q0i6z+-XWPLXv~zWUK+OUH1gV>G1^6_}&^ZB}N43P_rY8y3!YoYUB8Mr3 ztea_%`@yE>quEik;&7do>T74sbw_lS{)&J*$Col~{R<1-BNKrJCWZ~#wk1c`Qv*FX;_!OT!`BfKkN zQEl1BI`I1PBLdZzviS1XuHEPc+)cEY`-{C^mqhpX_bze6kNxHETC|{f`k&f*4CURHanlp_wivnAI_x{gw4tu*DT0f52P}%4P;0_GUsX2IzFGc$7-M=<(FVCeTAE}VU78xy?Y4eV( ziJy7Dg-%{_Er1+%pWcd?oTYHfJu*D0xow==K}2b4JN3rnqyx|FS4)TbCs$6#zUmdo zwIV(2)cOO;c#R{_BG4^0MPhn(T~2aP*pH*p^j zuSvqqR=PF3`E@&QkS;v_S7lX#GI@g~S)$9(KJKdF;ZeF{3L`=-|iS?zclI0%+8`j##jp zy#@iHDLhu5ZOGOu3K6eR9x!ArFS^Z#02Q}EGIR7FwFFgA!YKFhrS#nResfjA?(NBt z2iJtYA8B{;@>AD%)#sZVN2WMNCNIh}7jRgD^R4#HaFg+jg0T;}RQgtztMhAW$C*!- z!>3!9w;QAJ7PuN67oX}VjAeW3zH~BBd2i$Xf?$FzE-W?*4238&LMzu3!bR(o4Y&N3 zSQu3p%SBr5TWy&bZj?3s=xAg$W9g8zO>1V^WGPP^`rTvyClNwm=+wvlzz-v#tT7VG z#^-*K?ZQH!$;Ic*%NZLUU#Il z0G0Yo959V#*Kbb|`wi<}Uu8@6QcdyT=nE0d`OfHqXlJBLb_}1IyD0>gBP>PLw@yqP zb$s^~%N*&UzXDgeu6y;}@rDWtLANFC-|OtLXjOlEj`PsY?bMGopDj$I+IAtOiv0W_ zy%@QB2WP+KODQfvwGUaRg!je-5(=9;v6{svA{tl3!cPS;_&B`B5iWc?D|w-n;8BVq zU$1fnk#@ntIe8A2l2mHTckColYk8bj>iMtQ?eu|N6Gy)waUGfb_ByYPf$JtwG_3N3(%OpWxLhz z{nR7I#4#wku7JeGFw+LW$=^pl)*_JJ1}DLY(Q59vkB6*U%HU?PKR@>$#tL(`UbDjr zFy{uxmJuk9M!o@efmT3f_GrNF$)*eEChQP9A_Lsd&LCO>5tT(Zk}I{Pi>*W?Ub5x@ z*n2oskQEn467tF~D8o*BOZedggsQDj;o(I!0h0DC_}#_==xyk9vyp)BRE*}Eod%yq zDnwFNn#Ml)HYG7oL&;?AEAmKWPoPb{*j)x6v3tiwB$F_6;#QMe{%EfDxl<8paxD9^ z5(Bh)57;Jo7kiymTkl35?nrAGyw>%pKEGc=IqsffKO`hrFC&I1^Jog5rI0$c^9=WGDEfp_$DVHs%{RqX7wz!2|t z?($5}RqBURQe+c4z<7{RhlW{NFT!CH9I<=wCJf`bq|H-J+p5Q#GmPoaGC_ZWT1|hx zp`p0Ui2zYYtvJy>fP^C(XE~;!SGQTqb#Q(2gjs=I^VehF`+xvAv0iY$zV2)(&BRvE z6aD_R6@dk&N?sRV-kMHvrU8eWHnrnW60cAfF12|~lPZ3`c-(470bqia1NLS(oPnvp zKMeIrao=K68C8xf|4M13yXk$m^Oj;eKg8Yitjrs=AL>xBsP-(lFgJmEdh=IduW&>qhg!tju9-9~Cfa%=@WD*N8C$H`U&|{TB<0^k<57M$)k)cz{nG)Hty;0{dV|B=&Qt$1$mGX%^lJxA z|EzUL?LlBq=j+);{?`B^TTev2T$0fSDWs5sCUz!?sP&S9&3|LmSKRkIYwVVi9q~%* zzsKulIzAb2q4!>kr~$EWte#=byU?Yn0r)46IuF#XSR5Mpw!v%Lp50O6Ew^ypZEl0i z8;s_KMW-Z({kH(RmaUg=;$Y`}@S~Arcr^)+X|TR2){Q%l2^N zaA+meK*@b$GSOAsc_FE{bCV>HB_&DaBtdNCh=5HASN(7W{uJuF3YUAc4dztu0v3jq zY5n0kx4tRTcR6LTAFJKr`DX|!gp^0R43F@n{*eeXoJ9hg7VEFC93W4&$G!-Eu3j2J zY!y?yH?*tGwImv?-Ipic$9yDm9Ro!y)hT7^k&?Gpzb}`M5vbgMibH7M^bHsj5%;#P4Ia`)`W-Jc$Rr?dm8#cYp9TZ9-h6`pP|dgR##QpS5w6MWn!9BH$IXTuKWSj9XHX z+%G{AWoK+f50wi;>t`x1-#}nLNpP5%xxC#3975RJ(wYP)Wu$Wrch*?cLqe?ryo6Bi z0bOqKo}#xrA2+b&?k!&D2pHQ6t7=u2)>{oY?{jzbdb{zyIVoqE`-iz(twQ!UdP$bb zxT~WSZbkXK2BVcG|2^6-E9CXwa7Z2R;8}Hx3O@%(Dn&@I1_@(_P00V?d;njU4OY`~ z<&vJjA9=de9oU-ahISi=OnLp{QBB1Zq@LXbSfB|ML2U^p>1{EU#fE`nVBdb@bRYEi zot3gJdMSQqGp+9NOc#yMw`UB8;?4@1=)6SD^ps&t@< z_#ZM_7FOSG@W;yDhWMva$rMU|z4?ZcF^6**sT_)qh&bQu0&nRWbkqlGSBD|& zS z-bAz6dQ|_oSr++p_3L~9Cq%X1?F&0#0o4AmL-Ij+8!(8(tane!Cu~$uG1;aqMrJ6# zKC;9|iTT=so69V2ni^>ORe!Q4-Q|K_6}?Y>mbJ9Oe-S5-pe>(rdP^2L8MAe_PV4UY zE_0TXQgQs|pTVU)QX5LDKcXk`$7oB*B8O3RLztlw760y9+2DqjX2Z^a?$*jp9)^=({vE+=zvuFZTh#>0ODudB=4vgGT2;W zmmjskZ;Z8C?(?;UL@7jFX1eN&NUM6f-vuv!=9qj=yQem<)v{Szm)#F_)O7P2SM{J< zr&+DT7fN6Ba3vqYOflU%SF0yioSD0)^tnhYA0xdy*JBuKtw@X$B-0Kn%_RLMDITub zJ5^i_RBV+mr~F5YRtDLvhtJ9<96a>7HRVn%$u7_GM#~*P(#Ik$NpCqTNk{nRfIOF~ z0l{dpbY5yw!&Jj z4V-^G-6QyTAi0h6?<_bpU+Vgno46?%>gzX5NV`r;8cxDKm46-J2t&Iko69bFG;Yw1icCU06U@B6@Ro zZ*hF-VA)`NiQ*^@O6rJT6Bz?arAFe#)n#}Qmg?MFkGO=ae74Ge@AUC)g*7vDtXP3Lo7i zTlSd2Tk4p1)oXa^V4Sf=!t&ip#&0L|VF6Zl z_d1U*<(y95(aWF+Q`dmD10ogU?J?bvVD`pkS1Oo@Hdn%9&4TO`tl?JYnB!<*tn#hr z-hA+}_t+_sg2T9*MYi+pJ<64#=}D^kL1lZG#$y;P+R<8bukw$0OZ8^L=Vw;ZuQkl0 z69j5Ey;g(8ORG})NN1Z3H?Qw75!0VIHW4D5!QFkA-9g=z{R~xzO$-xQwsw8(?8rO5 zDe_V`l&(;D*mpJg)`eTCDUtQ>9&Hr1ggj8Ji>fu0BzvQ>HeR6|VK7^xD`Q=u!Q6k9 z;J=|n##8wymVL(Y;eW^Wp8;lme8kVqcn!PshunRs5&F$nJ{TbVnnD%d?3F#pjVS%d z?hEo{7a6Tkj`7+0VZ>jhm!Y-EhovLqk{flr17P4W(4_FpQVv}NHweQH3%BHrz3;`{ zT^q$t1e@^dRED{~R%W?B&K68#F^jdZC;;I;sj9 zkzQ=EY&hKnbm)I>2>DB%ONt?-DOshD^w-=vsR47#sQPixduez<+){(}-=zCF{rv8b z!lH~#d7b=wblm0Py}awEoja{z8jhTva{v9ie_t^d!tkARl~9uVIf+r%wBWrD7pOQ+ zdlc+g*nIha-w{fRK^s0cDm}xJ z?bmdZGB^nrP^`V8@2CqmTz|;;eot~NCMgEG_`Fw)bU0X~fxNn99X31oY)Q9m z%}q@p7~L=hos+Wiq5qw$NBq9S3^yMS7XAHED4{`EU(Gu4Gi*gt3|Px8H|Gr+C~Fth zLwEmp(?6edje-F+6ZgmRl$yYY1!ItUBW(*_i00ro(Vn^Ydu{)_e!sxJGlET3{%e!M zW3UT`^&58Ke3*&_G8k3LZg=eS80j#2lgmlpMdbo@m%8Rxlh)Z#-EXMS|GOWc^kF!v z2<3inai||^a0wOfv4wJ}P;C2p>gP+Y$0vq}N*x_+&z2;M{Bh-fzI^yKxZ@}N)cwbP z?I=h5oZy7;!Ec2PRKhl8^l*r%Z-IJ9iXjfC%yygyYW7hei89qo=6>R@=YukYeP+vJ z_0q2$<0wwiS=fZhS@Q7TNPWSwe|?=~UPWMQ0g)`KfkxBo7fAIJRKbqb_mrHs#Mz+x z#Pk%M(F$pq(lbJeb6n=J;+#4AR%Ln7N}_#nU(czponkj!DJfX}{`)>AiI82hN2UMd zuRCCMrRPfR-s$2B`6HV*IFq^h*Wo$d4FE!zBJ8nuYR$hl|aXR`kq z1*sK0m;)+?eX9Qq{tVT~jvMU@>yX|tP%5AG?Q-C{Y;I0lw7Zuyg1JXA+{*p~sMxJg zthh7#@dc3bD`^-c){7TjAMq3NbL*hTW#c;y(od-%&^w^F1}NDUCBf0?Wul|vyFe&W z0Gh_ap!4iUX{5;{44hO`h~-wGIQH<^6zIuBg49WGT?&ycRsaco?6}Xa5`yOz;lB#y zms;_2U9O!vV(N5fdOp+$@S)HT=sVoxjw`u+NMb_?p4fZv^J`5C!&DSQo8CI}dn)21 zQ}KC}rSWxGR9MULlEjkAG-7Tyrn^&lAs9N}XKk*5OPijn=4d6PpQV~!q5M8M({Bqh z#5)jqeOT&OQ|SyoFE;}$Hdg2pRJwlv2q#z7#x}I<=r=kbJAB68=eqFOG}M!*2@Oqf zkf)4=|E&O$5bwrFt>xshvt=NX>&)DZj*hm7n`$+Y3#EymFmRJz+q8}0Gi|#Df?&C$ zH2cu4$jlij(kojSJ6pZ65Uu)NIkrzhJ>u-KuwR&{@|aIh zJ@5PC-hjzW9c__UqcQuf=i#?Rrh@N{=QE)-Z47v<%JZVtg5qLUSU4WfM;=g%*;&+2 zs<1O`hqlM%ir8QHIRR03VAvQod8}oAK5hbr!q#={pu4in5a4;*0VZ(o>N(MFOVn_N3Vor!_UNEdwGoqFh~wvl&Oov-%ZbpgZHFma`wv@nUgmkoEPKYp-pre*tloR*z7_xpJL zcrXVd@6f1>sTzi&dGaZaQ=)60Kn}YD*~)8foo*1T;evt-0d}4*_-FJmC8xLyvJV zZ(ma~bQYbT3W%VgMRUxnGP&I>=uZtYuDZgCnHEf27<^g(003 znCJkK>H#4^sh6x1o#uMq+cf5uk8$kpZpI;^HclejAg?438V{CNyHZ`p++U{6st8Y= z!q^WTh=Q9PCHN|0>R`_r_qskI67e1zQ=T6Kc4iTlzFwRGVKgqI>iIg@a|7R@#IN;% zUg!Frb&i*?c@BPI`QjLtX;55LF-Hn-`Jgq^F7aaL3f}Ss{S5hhlEtX)?01K@lN;@e zv7Xf89PHc1zLN!xOD>dqQ^hL-Bi*txR_5$JUig;U`L!i^esa4)<1^{%*6lP9QDd(kifyCL5Ru@0fiMbWv2Z40aJsT@10tKJBaCVTX!`?e=V;mHOZTy`v z#sY(HN43`~sYI+$3tr``i7l7r4&yO$#0fD#foX#?=ljiR1b+$$I=1g+z!qvaKwW-d zPBfc*MJ~%K+?JeZn;xXStk4hVMUv}|V|s!T=W&S)(8=iWdLOQn+H2Uy^&gB`&Hc!K zruWrxviRc2!Q_i27Q^WCI*m(gk{(h%dOI?c)*AINW%(uQ&4{x+K3-WGX_sVwGx?$J>~a(rLynOJ}E}MQvq_#5MqHy)N%t53z-K z#-_okg;UKxgF3%gry#Rwv&rcBo!a5^K;-g;R(3r!3r-ld*Yth#@vFe)Ej7<#jSuOd6zjSfWo&Q2wd zhp4LH*v^>t*f$59pBabqC}_5n`64KstzqNr zGe}{3af`gHwl#FE5QGlFs-IuwxwWuFi}38U*T|u*4RA8&wud!T23CRjYO$C=J6iJG zsZz87zqg5DQV0<(`yrUb#oyc%Nz~u%(7q^!U<;;zC47qLjdOo#=*FOwkYSzIbT9Cp zdV{OV7CmQQ1axHD(prNoommg*yvW2z(OoD&QOeus*Sjqn_n3vkKQ|QDycZg%RMQqGbWNUWSDF(E%y#{ z4_~9l^tjW*1MXKxj+||mmzBQt&`ntZedrWEM_3<4z@iezIx~KjLcQ|h#VhX4+I99% z)~JVNPUkA-d*++*Uh5+~Al=|dHmmK#_{Kf5ntAq(>ZGBg3t84lf@f%3L#FYr!^>q$ zLsTv*W_}e0IZI2Qpy1J__h3Vl_4Q^%%CnFAa_sh(*+)yBhR)lp-!&1vhCXsoXXSaV zluy9a*W%SyO-y~u(^PRDYL^`T%_O~?68x>?z5kz{-qZikA z_7%5H-M5;Fb6jm43;lk^5qN$=l30I4(I-_P7+cB8$ zvBx#&t>mh)e#!^z&=5N8_{AU2r;|5oLAl5br_3k*dEZA-xg0BMWP2jZ!FW?GT0OUl zf$~`^@s9zmTt}TXlSfb`@Ae4}y^0nQLZ3i;%z1nfVX2J;N7DosU8YtbKyt_FIXu}v zVPyhPSu@!(pRMOC4&072C5v5BBUOfn^TAjmMWTGD^1Pm&C6V=-(+i&a_up>oqL1kM zrq+6HUP4>k&S&Zjla$!Ca>OjDWGJJItkM&ex_%#J6-jryGgM?1 zwYTtIWZJG6a6w`9lGHA(xcp-g(qt(Ynw>b7(Vx@X*k6!-(&)+RO~qG|JXolyf9(MS zlJC9qo-b#A*ToQ1yyJWDD)_*5=R4kmB`?kS6jF&}K2I4#?!14^GF_U>Q?0mYJJR>Y ze}D7iSDBS=SKZ+kWyRt;-K_h(7pyWcL{uNjYhNmA(XMUX|Jc7m-|3|(sKkgWXWn}H z|8qv%fEjUA^byB%@4psMNYN_T+0d+-Z znUm((9>ZyF7}+N^;t|d-gpTOk8A*yx!kG|xUvWG)A|1l>=?6!g2XB7rLO?Q#fMM)l ztVJgtjJSt9?iRUgm@ylAqRH8*N&w3n!e`Y&<0~_{DP_riZj&OTg>;#IMWI`R(8loG zaKe2)Sljhc7cGe{80F}4tRxM@h%6~3UM!@e-#}Ly)E=K5~=F>oDg{X51vI9~Ik)px$ZWcGexv?_nR#_x);IoUc|LMy#|z zXO+C%S$(N(+_0)Yn3-3nBHpXdF|=|i!<7G3yXahZ*r4*R>5GsQdZ!5aRknE7^QKj5 zkF9@JXk3n74P@Kpy}!ZqEA?l73E9cn4Fcz&I3(kSq)!KG8H&#iojf6Zo0c3c3kto{ zv2aowH@{o*wDYP?9K-kwj3U8Z+NmV%p+b{@*{V*Rq9TLRy!>3uJu3(}?|jmkkcPMH z&&$z!_m`lz!$NPA4bB+UdX%n4TimwF?au2fqu|my|GlQvB=-UxWuR!ImA?5f6?gvT zT=W>#j*eQiZgvThKEIVIpH=&3u|YuKQ*PC(n;;e^0tclFD~$EM+eUzn0&lOPHKDTyW{& zQ=P2L+KvkP{BFXdmL+9M*2cOy+q_OL)ZvS6<5pL_oszA=b|C@MHz@WblaHgYu0=7qB4}ZJV?3O09p!G z=ygqO`(y|4A}v3+9MYu-G^XxxtB6untgz#Bd}&vwap)a?WLr|K2r$^On z=f`%oPfR-X>4avv;}cb7ZkQKy4TX8!c~-&A98tch=fuaB?kSs}4s1?*ycfxq9ly(j zy?nFpkXwdzgMTKaBCCGn#_qJ%!1-pwz3=$jlg+n^_m!IqRg3q8d(E9R6VA`5Io@lk zeX%|vV5ujt_f>+O}RHeQXRqQK<2ksT352J4A=au`?V@B zDvzn2p99jUl&rYC@m#eu-S?D%%_|>ECjw4TM$S=9RIye+UM&m?Z2^6N_RhH+uP>zA zNr0FPRPI~i0)3|zyDGPt(umaO2aE`~30NBk-bS84=F zkuoP67PE6p)%`dry;Pq8bc~h;uf^YV!+_ypV+J2 ze211E#DG=@C!)`1qj1%)0ydl%Z(=i2JQSd(NLRc7W=*&gT`rfvNh?P>h1YOvt-s1; zi%9TQ*j~tqCWs-=TvGBdOWV(7(2ZMF>M>Ah=gMHaoCKn6Bbx+IG zVhufy5^TZ`n1_36dRX0d2#MP2&MD&)kxIu?_Cc}lM7Qwo4Na}X95Xc za{A&iPSaGGVM~`3LwTJp_nVJgShFp<Uf$T+NQ}TU`27 z&Fy3@&M)rOu=nUrTNGi3H&wXRjl6W}&JQbI?M7yzgOa{B#N2}6syEt_Zb=NX(ERG{ zL@LA4J6Dx-{Pz(sc@(Mpe3ZYn9FGsx3bgY(rl-o|*(_;}5t{|6Vps;)%SZ>Fsmj^I zhL-VJWaNbZE+DxUZd~MR8hDyZ+Fd2?d*CHJ_bSS%?-bEKII6ILQeWv%_c;`ruq{r7 zqyfZc&G;QYjZALI9okAgXa`-z4=3bu+rPoxc>>JUs$9KMSAVk_ctS7x?5w<LQOBlnz8;(ud**uA(+IeCBo8z` z49T_8~CmDN2;BK_lWUb?!S_wtTMWKa~J}3TmQ&7cT z*}>!o=;vc{T`_}7L8sVHx`=U#cA+W&o&3tPug<94^5gy*TUble_=m)AJy^?Kw&l@= zvE6(#&e2aFwqW6rt-5q<|R|Y2;Hws6Ho7NiyiK#5g;4|OCgsY zA#i(c6|v=ql~=Jpf>)LTI9SR)*a4NCXFcBru`k~4N0mSgeDFm<{ooqLx>p-aX6-09{T?WtDuDfA!%dh{)CfR|OY{#t84DJ!c%o3@15=SjiTpbEL z9cU$*c+t}M>HvoOa~Ei`^<2j_cyo(=^%Rk9a~QqtGr3R{TEs%Xbk@Rh|GpIZ%izt; zu9w|;zzA6luN8Osu2l&k{et(t{;V7sY$tC3kS^m?yUDQ6v>I5t2WazrF1 zE#VlrQj@JpH%BnZbu4`Y9rJ<=qjJOW_aWBR7#*0k1UEU)p3@m886YrlrsNq*JKZr)O5oozaz zLfeM{#eof9u0So z6>>fW`R3R^C+#&C*mUk39{cF?>ooS0Md}z$1}~JCq3aqJ=M-5lCr660n8=9+(UY<3 z>U0aA0Uz;1SvS|n&g=@>V=!Vk;tIA3QC{-@)82cAHJL>Vql#2%QB<%%!eCe0D1rhZ z>L@BGI2KT($p|XaL`Z-@j7U+0I5tqJgNjO3L^`2IMLyiFFz{dlGiQbA28@?+A374<9pg; z%h#%%s+Fl_e|x2){UjSd)UU6OjE#-f*h6x^*Gq5|tasNvs4D18mDQVGWDO~mJDxS)0h9B|#>$1eAS_@0hGAOU*?v~OiQkeWtMGVk9GHo=&l#piuw5D} zy>-+Vt=27)0F1@>8e*2`pQtk6& zWgZ8@tFi(j-dMFkYtp;W7Pa(L%#loO{morFCHH8w=R#Tc`+fYDSQ+@O#=k`)q>}L*9weRmzC}zK_J#F7ub~Dh%mb&!Fs% zeV5+z<+n=wr*gE(nymu(&)za;Y}!X2?pAv5wj@2ZU6c{($V=b;xvPlqV8gqJHVtD! z99`~XOXG64E8I za7TH%aOMsnZ(wj_?cZF;2W^Wj8!Qs+BERn~PwXH0c-6mqg;m$*p8E8UPiUk;bdNzq zsd=1PEonhQN3)H&lRRXMcRbEaZNJm;W!PZ{Be-oSB)8$Ow>o)CfDD{h5`eyT|Kz*9%4q^}|@u znd*DrY_D?`#(ZpvyZU5*+?09y2c*+Uy@iJ-McI5oF32+Wktpma--W|UGkpXXn_~2| zp27|G&#b|-E~>FJYB@i8Jne>nOY_E(psCy?BrL&v4lnSKpYRdESwF$gaSALB739|d zrI;HOA>Kq@4tc5q)u{JZSm-zM8@d>VqT#~-{%A1P__2?d><_E6A7FIe?g;-rmC64D zs$fX(3U^LhDjpuO??#1=LdLw;RfOp&xOis^6hbYN%&`F?=U0ktIF;d?U~p?BBPo|J z>&oD`SC3nR+jWn4{$=~0!>&vc!)46x{4DZr)vCRdQxJ33LNvP8^Tx<`$amr#&-ZN> z?0cG@VqNqIj^Q1)Z-zuwM`NaINR0_;q-CBwoV?F~ei@sJmOXy__>8@LzXY;$|Kw=% z0g?a&qISUZse*#li7@adcU`#h2@%-81&SQDL*jx9ty5mwmahNHe}ih+ zci_OnUH3)18#9lrH4H<+$-HZxXCPb2zZ3CrrOT8bGmjVzqlqNypOc2D`l1km{Pg9(Zw}0j@XmkKieU2Bz!$&KCZ^>tI1jQ$qg0`z z`T8&+lI5W>dvQCVDpdL;>65}F+K4Ei3y~PvbG|013=DPoG6Ud}hn>Hac^D?t$6EwX-z{JZZs7s6*TlXOnHU6v66M3PeNTPMF?c6_ z6?=*r|6R;ws6uGmQ#knsAOjDQf}Jb=^fC!vMz{7)k4600H{7>^Qh25CSa*s0PufNIGGB4n6jgz$Vhv?$7C%H8|+~ zc}}#r=x!3fb7qf+D)Rvo@fU8r=oQ6%NBt!PGB59H5qSBJ*xQUhgnSjx;?Jm^-->4K zG(1|Yk4N0P9C+>UonpIUtple|FWDnD|5TukZ)>2iu`zL{pm5utqn;Hzva>4H*8`Lxru8xwHI^`*ii^f}|yRoYXq6ie`^1S&1f)gKH zm)3pY5ooy#Z>RLH(ATUj>s7zl)Q|QpVG;t?72ZGYm%o^ZTk3rj9Hhy2;luh}7?i~y zD=%D`91~-NK~d>yXAR+>Y0+JS8M6sqTnMLOI!`{F`uPKJP|C{_b_fc#x(ys&I(={y zCR%hp5x2-8MQmzPU3fw&idKhzHj*abB~5?h%?5}JJhOM0dU#GifVEXKwG)8|to^8e zY-(qGI1qn>S@*muSUUj?LD2ztqATTF3jcyNPC@bc^fyp(u-Leyv?%~R5)&=1YJC5E zH-JGOd2Hv*-Cl=TWj_i(oPzlW8AKpkOJW85)2wm+ws`6r{&K=$vEf-YYbQ~3b1ejc zUAM$b!EWWfj|$D)?HusufImShbCf?Pb|ysCoY7&%{f_fPSyl1%z3zT;e`p8axT0u7hag4g}Ly;TzFx^rJM^d%!L;wXkjkA zFc)5!3orag5@F^tS(E9hx$weVcwxe&oC`0^g%>7hVJ^Hd7haffDd)lqbK!*vT9^wj z%!L;wT*|rd!d!S^f)@TS4==3W*OD~aD;Y|Cx#N^a!$Ir82WCam1b6)m*B;#_sr33w z{mh%nucfk;o6wt^hhnVB^6uhhjxWFDFf34L#-nAY{(yqQJ)bw5t(g$CKkE%2i;ET; zFm8@5nkYXsJka8=O;}YiI=+-8qJ6&6CIJ0o_cPOjeQgHI#gxzR$ShP61urlX6*Lh4n{e77aw%Iel zx$tGtwh>1cA}8ln(QiRVF{r$KEA1L4r~dIF`VX+Uu9?4BH<|g~FM7(gp`2!Jf=4H0 zvU@#p8$XpRAS_3EXt=pi>cnq}wb{ae%?Htc1NYVW6fspUAlyZSFsToM=%Z z=jninCHE~1ugKY=;9`txdGZk3hR2qZ3h$;j)d@ALuji$WGUS?Rve+Ax?BXAoWGTl} zl4P54UGt41`eUnvTD#T^+J1vM->pp0nKkErm~(ZSdCL7Em@=-Z^~ ztkapFauu3$vDHS7oxSrcbHCS|Ya6e3*AB3wA|LSHeG~lJfwA-@8n8+iyTEk3POzJ(E{&Lk+Rft}hysYdV0)X!+h%*kM9A zSDL6ps4U8I)}}7^={pl|t7F$0q`rig>TPm~WNc}PQfSMysw^r})YiS&x!8sxzvosGi| zXJi+N^nV|zyF}z*Dk_(OBv5uYFP{N54C*!%+sGuGnJksQE~C})$+c(@+xWYKWq|I$ zVcOL*0e+06;lsG{F%r7cr8{p>iuQFZkF7oltXx>^N>x-r zL|sZZcTxv&EbGedj+pqt&-a!<@waM%;_KZLn7Vn;s!^#*q**b~vpkWO7K%UbTgyx9 zanIw0cVHhR=kc`P5I|TgZ}a+VvnVR@zI#QBpAx|%nR!Eh)mFJ7pU8hX=>@yqDrK}r z`|54B_Ib6&79)~jGwN@djmr>$CXJ^aPpX$6L`B>W+gzvI>p4j%;%l61(k#U+b65|S ztMa(I(&7QV15cenE)-=abJ)u(uc`LFzBFoq8n5nxezayD~6D)6wlUVooO zflmA0jB3EJ_Pt5{p%$G{Hu;vqwK`NOx+f>ng zPOtX?y_lt4LdSu*z~EUh9~MT~GkOJ>oHqkFO%I*ZatgbdoQPJ|#}2vxD-*4vo1}~& zEetsh084bYXqrUNj}Itc;Nu0)*GzK6^`#lK3Sv+ay5~K>*1vne8|j?P5^Q$@>2$#?|pj<+URweUT?W`nb z!6Jqnxo@2EOj_Ztf+Y!im*UE2N0B&5Lehi+(~9g-6<~ciuswM%NRVLjV=}WO2nsMJ zP>{WO;&J|!h2fVvGHD~)j&HL9n$oF?;h<>u*TU5eFYX_`226cx??&GV{Ql&|J1Ahz z81bP=VXbzK$Y~$At!lQkrqK&~&p@@Qd%hz2fOit<0P@0K6#6DJbq_2j$lPSh#JoR8 ze6t$PtO(kln8akOP*P^kcV^Niv>qb{CsAZMVVZ1%1y$WQCBlNPtldbQwIEO*s*h!c zCXb+i;$j_QZAsovpaQiaZ}Z9G7DEClCt57B`2VeKlJZorVt8neb+u%u)8|N&?kucU zuL&~yuzk35p;!|aZWbkv!W~%ef=^cdB@hJ0T%KIEZRJc7iZ+IQ#{|Dnp4{Oz@#5@~ z${EIH7oYeij7|Gk#zN#(8mkZ#0ZaSYpYZuL7diN~0?0@x<3 zQ^vr(YTCO7$A$5=jVpXOsoH$#Ne!IhP%8IzTIVDd`M`a_z=!wP) z0RW}Y!J`5bF#AbE>-WI%r334_Cuux-DN)jo_HieQ`p(jKhuvaCVCAD$jTzvF8#(s# zyE55M>1X0<{#(9mxHq2XI0n61)|yjR3k012stC)rV@yXL9PLtrrC3Y8ke?WpcwR`@ zn$4mhky5$?AI`Z+QAtjs#c?cL3>cia-Q~wO&Rp~xW#Aj-3*Hm&&lgaXDD3^Q0Nvl4 zEDx3eF79O~yH9=3Uw~RAJoXSyTQxZtaf5)XWDy;VnI(S|Jpqs(Of!2ibFHXk5Q53c z)sy(EU$#%IC^ig}(?fn(6E7Q>J}w*WGixFef1=`7OQt4TLD zGCUS4#-5w;I1D&0YHzF1jE6vc#{g0r?Gz^0!vF9U7T9K-HYpK)QukT#45?@7cMne3 zQ6RI4yFlCdZ7Y2}$y+}@DW&RgaLw{o_Kv=8rWg51G0#~P^#jn(zGEkW`OzE zBZ((xBKamC$9HR6XDm%kA9lQ|ApFqGVMTAixTJK}tn~ua&>pTPQ_}Fqtkq!s$2%kz zPDg&qdZ37)mk!&elL@T%9Z*E*7uoFJrmr_1)_Yt#*>To-cfxw-S5E~$_zS%?ac zZTb~}vxkalST`MFXW-$x70*}Am<^S36CV40#!fr13nTw0Yy|(OW`psG5-@&eNQPLRe=V7c$}>Xy!0?j8PezifLr9q5=eczE6{UTx-b)jR+?U(3yBBC{0a z0HpyJFdM^s?<>UW&~z}&BPPJW2|3GVJe)7!02prQOg}$ky;-o{0jV#u!aJt_71P5k zfMJCnB>XXJy&GV?j~uOP_ zbLRgdl`+wLNt>H{Z25HLFXLlK-Mu_=I@mFnF)=XTu9Y@s)2aQxln9J<5w`65^yKXs zJN^?`^V!Ak)76EH!P1a<^K=>f78iVmtpet&+LtqpL*St}#0xDk_|WN;2#?dmF04n8 z``&FTTKn+ApJrb=71ivB(2YxVGj!~z=r^2ZZ2s?{%J&ywIpOImt*Z`dF1?;i`Cv9E zUaW?P%W18nyoa8VO_xrg($osbMnE(F+bp;o6i5{-w#mJc{~#;rUgpALY5(FPvTx?Q z?NO84&u@giyJ~Kkv?TwPPI5qV$OZH>0!jeeMH1wx$=-l`tdzLmF_UsX@MX(m$9Rp| zYMz)0+}7r3D?A;MKqYE>LDCDCmI>|!$STSCOhvqJg8dn}ysmFLHo^Q{0|a5vble_H z9i3wp)8dV;phzm4-b>6}5XR~T5R1f(P_Y|;a(y-Klv+cj!Vp_hW<$#Wc6u*MH}hm| zqM58?4y!Z;I(r!Q{=7vd>FeX5yo{jl@94RM!N>UJfh7D6Mp z>}E#ZXs`3YNBw}Vq->Q{mp<&IjWGxW)0cnk9~Mfq3xHs93vM#9dO2T*58>sXFU|tk z8UAv#sjLuY9y>SLCb#8^cp?8jY)Gq+kik>G!1D+IcRUNr~p=6y^9$)`1VjmdWgR(ep*FCxW=wE~kE^&e-i=pXF zrQ=7rfk@BJXH}}kZ#O{<#gwX?-ndvLyZa?GjG|*(uhdT-E_d>`3EBSSNFX*0iEVT# z2@)+1a{60xlJ1X!*Ps0K{(+f#T0k6}nkXu;-=*94ElyaX&{e~}wSuh+#Pp_7M;JI> z=-bz8f6DDiMj);x`biZNhEk*aoCu>0ifCIexS3sAyXVyr!1ddN^OVK9}lF2PtQrgSe(QyGgb;t1HQIe7?x4 z4`Vv5fl7szIcdZvASF;gjq`{@o zq6AI=q0W5#ZZiIi)=-^Ib~D|k8p*sY@;)Q6eYA<;lOAsqYVIyZ?%PEEy^&%lBRm#J zFfemSt7hKeWDM~cr2BP)V-wHc=|YPvHqdF_n`ybB?+~j%lfv%JP#*II62&(kMfpHC zwgAoCj)SxZ_DLOSDF09+pT65gn=Dw@U(CNKQK`oyN?+n-_g84gl@qGtEvj{Id7Ww> z^+j?~;g>$`r@^J5jPl@}?%YFN4zItgO)!1&kC$pM-J{aWf{}AyI0|}r6-9C1M!g@X zVWz0mAQA1#&ODU=Cq7<_0F5i3 z>?lbY4|c-a;NI+3_}#7EnLC(F(B*!K8vCO5l;l)Az6#GQpjGm?l|{07Og{wDLxDuX ze^s)EE_OXWB;NL~H+N?}klN86&6MUbrJK5(Jj%?nBHetKkIS$xl`gj%pk70|N zKX^-fFoH)#0^}jvLE`KTd`1b-spV1!8!9*sDM93NakpD{4hqbG_j4|HJaJTlspF4#b zucM&1;hDb3Zrcca-&@*l6;r@lF$R*63KMPeYn$_cl2>6K^CL!Ls|r1Sn043JW^c zp;_08@<)?-Bgt`1Usf`N$LV_Gbd|=CY(hf=by>)c&ZpLj`U)O@$=*YA3Z#2`bpWgp z0gMvMR`U{dZZO5bqVJYtqN6j9a5`{@=xLjMs~906irwuj=psYT{@#-IMYz?spI!;A zAX8VC=JIt=tdkp=BwWFgYQt%|OMKHO;SS}Lc{A4!62@u?5rbF@imOczE3jZFyLqga z8nE!Rl>*WO&9T~v-|Q(7BtikjS*L5O8$tq{R$Lfh^|QS4>DyTg1buC`5jic5PCoq) zi=-usrL~If4R!bGaS*%vahl#-a3z82&9P>#z9M&zqCF}?`Haz7L1A1o(*1K> z{*gu5G@~jJYzi};xUt?em;xxnqA>>$S}F(=@lJDlEB%hGBKceTYI#Yvou>bnys zL2l5|M=9uuGSh+oo6x6IRxN10AHsRcI&x_HW3R5OGKWM}y*mu-b~x1Av;OX5Y1h+P z-&6@6r3^7rbCFLAQN+FN#tMpdlL)q&k}_^!Ir67z)}?b;YC8eCcYJr|&;q0_A5>!S zuL4}8Er;Kk*mBXsI16r4Ux8A!YUbBly^A_sj>HmiTt{|6z-s@Mk#yA!JgM(EvAAiW z9;WzwVus%Az?Ri%fekxbGB7&+PgoUSap5kd%V~j1A#!H=62&%Z3JX5UU8)$8lRQG` z*Ce>g=}?BDKO{jmvQ$5j@O?|v^6aneY`ZqmVw;q)%u4U1>~TIF_&I=VD9yd$U&T7a zs5+$WP}=__PwT1cz-V?{qzr{s(QTlb`^s(=(hi-Wq=&BXVZLGC|4w1B$3guxU*!EJ}f_#MShnYi6aF>b}FPG0418a?zGZ)(yunB?O7+DiLWXGbCNu zBk9NS&4o6yJ&M9KUz^Vk%=(tLr?q~v7ILlZ3=;aHPb2-kNIyMbMJqOfVuN15;*5P~ zy%=T%BBKLIAxLa7C6D4=YBR8i8%yM@(;I%f-P@95SbJa?t5&tcVpb_Z1R0itHlfIFrhDu6z~6iRf}+q>5G2xgU4fopfrn_hqa{N`}$d zQ50$E8`^s-BY-k5HOXc0hMagq8Om2H3FG~W=*7A)W9E+_@)Uah%QpuW?OYTFV{BcI z^v)SHJQ+(`%B!!RtnG6I{M+)uO2kj0bpK)pSzD%8OQY`52tE$5ru0$rK<$>J$W_IDl9=Tj?ZJ)C! zADmUA3txXB>1ZH1Su&@DmZ$kD0M}Gt!=bZZQX(n4QRpOli>c^|aUS@IT!k-+Gv&(D zy;gwAkJ8V01ndCgWJA5()8X2+4LCgRDJe+x)i+d zEe?l+yZGI=eFFP28|ZT27DgGCUwnS$|lE{=3aE#Kx#W3~lrQsqLlS_5fX8X(-YNom0f zvB>j*r0XPXV&$s<4f~p_(3VX{B2o^)b9~)+vCI)%ji*nWr@WlaD&PgRc7`@hx=cR- zwMSVkiineVNT(MjXMTTBv6@Pgr^HhDRtn#{a~}Q{id7}~1Pq*gGYmxQE|(53@Z&ff4z`!UOk3FH8Z7JY*}h=r?FK`Sg{roEE7bE#55yl@2JZ z7)NV4!fu&-b8%&9J{#KaNV(|6>f`Tt;!h2uy2k)w2=^~%LO&iU9Y>Gk)~nwk6^sB5 z@~OkIq%~2V>pXHcaiMD(4m*A%vhNP_iDvFI@p2Jyev^3G8C9xvC zBIOB^CeXi+Db=SHS=K~japk)89~LOMH@Ve1jzMFS+|=L@0vk(^HR=fg-KAX2IEGx+ z42|^ynoHy@gEVw{&KZf5xn<;4N#Nlpt@D-Ekof+74FZ|FK&OJxDic*_u9u`Innb6! z(nVGX1I-usTxvWQ7g1QQ*}Q6eIEuHunEV)5EWNZiPnU0&m9q2%Sc-m@Q?T2-18DId z`}>m9v^PKaT(U{6nTWd+NZLdwGo!w=xFdI?G`q+qOxv?K`-)B7_TIqxY&*TtFDj>^ zfIGuw7&$)U{ZV=nO>s#wMb#Xw{x+Sq?M-GIfS&Cw`ybRAnrCGXwUo#$B-13F+OISf z*l!uT(R^2-vH`qtTTicUdobd#+4>34<|pn@;7&ZZ`LmLbCXO4zbfJJhU6=~KfOUkc zSTX%Uvd>_AQ5<^k8MTj?P2SxlFQDnuVo6Haa3P+G54@3Vy_79MACqYcdpr`xxC7SH4EH}d>b_M{Vp zT==GGGPw45K(ZtQ-=-aam8NK(#;in!Dll$@C|;DfLelAbd#J3JPW=Yk7$*U|H59U;k4 zDU3Z)D^5{7TVv@a(9p~6T>=H$?2VP}oVkm*+4AEC)tW4t2u z7?P~5<714XzE!9Ne*!)9A_W>?Nr!qC%0wa@Gid&ZunTig&XK0A2rSK;GFTnWQIS)T^!kLb)4!q zyLV*YJ6&PZQg9eiNUR7=f&T~9XcU1;lBq z709&Q@@)<8&r{p?y96`58D5J1-RgqPf89Q~w>dJjnXW{pH?^qen>U+NA!KDFi=qUT zN()^8>$U&lSix^#51N_gdb+XCjzCvnk6f?i@0W9PVB^`jCDQ8+b8QIDhdL|keEEVJ z7Yq?K$6Vb&QW{CO89-1ZrQLng^X(&#OrHE|hj-Hw26y>obq)zHr&xzCb}-ijuH-My zK5cY+8Ixi4sWnM|!o&UW64dv%-uPKn7KWx6gqF2)=%zpO$-cieoIWxMp1BGBO&J)P zqJ)X|H3?#Xy|$~#-4_MlEvh>opI8X}YKzdL-A5{(bYGne%VYk#w$=Ebd=v7>F>Bnl z;1_XFlw-_o@s*C`xS3C7nKAZY*4FGuvY4`9CXq4i!`A;UUY+)fAA~SB*ffaD!E9Rk z>;E1)Gf2uC>2yn6YHpSb;dx8bJiLd)nP)Rov@_)=u<_3dvOK@2RYlA+`&xep+S$=G zZA7M#(+>l0rW>?=U%pb6`1!r>j_0w0oi0@gwr=qJ{vW@a${-p;E(`xR)&!OJX64z@ zUylA46c*XVM!YW+V7=AKUO02+sS$tRI0)*R@;II~4KFY`6zgedpOjEjABa#zjo%}(}g+DpI*>AEb>QA<;@z9E*Z?E9%*H{^h2Bx` z40LkssL!c!FL!e%BF>ZkNM5jYzsJ%k&+|Vv5iJG2T^I9fiN0)LElX^G^Go=x2KcRu z9m6gZFXqYHng0)zPk;HT7f9i&u0zoJ(I5Ji`mH_qV0G7T2&296YQF@J+bOF!Nbhyk z1{{k&?gxIL3VyUFJqCKN#hfX-2iciXORa$qyKjHod@4ijhMf98PxY(|uYO20OaCj^ z{S~uJmAtAnMBWTP_P4&m{-GNJEcpn<=4nBX2|Ydq3@fZ`T?_^fP2H?3!na%ZeSJ%7 ziy|adw}-n{h(Whv^F=pncUY}c$%8n6b^C{yJ$~n^p7=p4)!skSwp#LA78Zgbd%ZQ+ zb8sOv3q1H~A1dBKtAs!b1trfTG0AOjUmFP{STOAv<-aph- z-ReZm;YLL0J{2c&N`qGx-CAR?%U4+P{Fummhlbb6a_;Vf85q1B-(QR8$n_?N5P zO^DY8Sb99}mT<^7SVNx8j{?!NWm)b$S@#d((>c{9mhxz@?OUnsA7hK|npk9h$&k-A zmK9(*j5)v`vCLUjL$ipF7$Ng?Jp!r=JTjPt;z1$iS(n84xtC?x1W1jQykluaf3E{) zYg6$Dd~)v4LKmUoduRfer5|Yasy5kDZ|jA+6rBqOL>xYS7_hH!dMp-VhVf}OJgubj zJ)AMf6<1MuF5hV`ap|sodN{Tf=S478%**|=bb7hP|Dem1II*Kk0%3_18bmWx zZa}l$1hq5o?j(Aauw1&Bz)x4VIn>{w912rY)EWMIyJYyEJwb(#@ifje8EhG-GLqKg zGIwi1Tj#C> z0e;n*8!I%PYelNt>}{`mVPl$NwKHR=-abA!-ed8C;R9$mt@P@~RGq^V4^Hmh%4jj* zkq0#dg&X3+{~Wr;5Z3E^qg2+`;N=XCx<9|auUwukkt4P)9AR4#enQ1k1A)|bzYs|5 z*KEcg$+PT7<*~UC>_~FoE?lJ^?Fh8?LXrz){=7*wVxXr%^OVoe_}mjMSPr7z7vzWW^}=kq4VGAfzC`;g<&p91N< z-&T{Xy*m1-UW{XACFTo@4cPQ$-&whBF82L$rz#_~v8nU85S36KuYp9fCSULwhHJeT z7<7izC|?fTsk9d_u1zvunKwStb=vS;*KnPt{|HOQi*l^zE)8ZC4Tg z41);Bjdv zB-%s@5_!1IVWG>Qdq+g8IxcB>9}nmu#w^{jgx&gX`1z(%q1I}xh#B)w>HU8dS&JoK zf#{&WfrQ-Mc#8|tYlA?C9J+RB`4(G4xvgi7)6BAeMtjPEoF= z$DKzhnB-C%KG^%TcJ|1Pq=RNT726pm_Wk!mXQ*Cp={(^7NF2S}8~Z9!K+&JuiQxe&iHz0O|k0 z0dLl(7znT)81X<<_#RvcRc{m!2!F61L@ckJHag>QN!i|M0e`tj~{;m*6l zw!7MTEN-o7+Z`aKT;T*|AI@*rgx+CP>tp~`?3O5}+tnnTh=FfQz{0a)&Q5~Nf^c>s zW)Bf}>f0E^fS1TE5S9=H6Qy~hp~Q23uJ-hM?r{HZNG=7@#bnlAT^EIaspUft*4!1e zO!+$fxgM}(G9rB=DJoH@m9?E8mVIuS=&p0|>l^4yoYPvb&B&3Ff&zzDQ5B zx7Qh|gxIK2GhN%tJE2wk)`70tsVNI`sWV`fQqLG1gTBJxKs z*ifGzi!YA`m9?aGBa<)2Gh`PqK3!+x6qB}+Y5ps(d$GovA1jv!iSzhHD)SWA0BQ4nv&_aE#S+O~kD zl>%m53^d0rdENbDFTM?TYLSAT`UM}T5-5T?FVk=eG81^U;VmVfcST%9Gyv&?ON{?k zCT(6u#N;en68dWfV3PR6xFo3ICWX1pzrLaWT0?^Limhi;V@T+cvth6%+gbxzVX0Me z_f#zvmZ@6gRAca+pP!WsbsbwU@Mkaw0^moU7>WTF&R3UxS-=Xl@Z4}?rDjt7mXh0G z>0EGku$L8VHLG%&JR&#?Xg>rZQTIf2D@NyZB1BBzhp8(SV~L^EMHVtIyx6@opm=F8 z5feS)@e1iyWU!s%tIvWi*5cQvfDR~ZDew(q`_?x8&X1T&nwYyCJKRf*jd z*U2E0s;`Wwm}gyuT%E?}*NLNV{#Ggig?T++$MJ+kLmc#Yw+7i?(%BDv;%m1(;<5)j zs@Cxpqt4oz5Z%@Z_WtI@;&-#&!^1Jaq}$jm6BxQ-)vpD*Rh*#vdW5Rm4Ms;u!)*d@ zj7oB`+^sdQ?YOa{Y&|g9S;G_kje!3V-!vKrFV$B4`rgud&oyjQR57)u3i5{ z1QT;%n)s)7a<|716+<2Rszbk~U}HFM8@i$MJ5al0#lyH+C6hBvEL1M6BG=`U6f`c+ zxjr+WF){nUI@vftXy}0+Vf@JsF4v12s|j8VpFv;Q*E*8Y=gorhtQ8WUgTwlKh1-CZ ze=B$o&ti=jFMjD#p>FQYzt?f@)UjV0v>*-N!@%!lqIG92cJ^`}EkXpwxg5LuKkSQ{ zVE-LF_AN%2hh_q4=5JtYH=(*Xvh>)oU)p`5h#$4gI`iv)308=QuYlU)6(+}i4G_$~ zgn0JXzS?|&b5K4!2e@e_#vI^g)9D<=&1UI2R-G*w=VaV85%Pmv=9I&nR-H3PCgjAN zR-MzTa|ZCFpEIW%=9I&na+p&N|6Ak$vx3N5Aic4oZpoVfB=m!yw|~!}KazG?UHN|i D&Mj&E literal 0 HcmV?d00001 diff --git a/gateway-ha/README.md b/gateway-ha/README.md index aedf0760..bc190ddd 100644 --- a/gateway-ha/README.md +++ b/gateway-ha/README.md @@ -1,7 +1,45 @@ Gateway-HA ========== -How to setup dev environment +### Table of Contents + + * [Gateway-HA](#gateway-ha) + * [Getting Started](#getting-started) + * [Build and run](#build-and-run) + * [Query History UI - check query plans etc.](#query-history-ui---check-query-plans-etc) + * [Gateway Admin UI - add and modify backend information](#gateway-admin-ui---add-and-modify-backend-information) + * [How to setup a dev environment](#how-to-setup-a-dev-environment) + * [Gateway HA API](#gateway-api) + * [Get all backends behind the gateway](#get-all-backends-behind-the-gateway) + * [Delete a backend from the gateway](#delete-a-backend-from-the-gateway) + * [Add a backend to the gateway](#add-a-backend-to-the-gateway) + * [Update backend information](#update-backend-information) + * [Get active all backend behind the Gateway](#get-active-all-backend-behind-the-gateway) + * [Deactivate a backend](#deactivate-a-backend) + * [Activate a backend](#activate-a-backend) + +## Getting Started + +### Build and run +run `mvn clean install` to build `presto-gateway` + +Edit the [config file](../gateway/src/main/resources/config.yml.template) and update the mysql db information. + +``` +cd gateway-ha/target/ +java -jar gateway=ha-{{VERSION}}-jar-with-dependencies.jar server ../config.yml.template +``` +Now you can access load balanced presto at localhost:8080 port. We will refer to this as `prestogateway.lyft.com` + +### Query History UI - check query plans etc. +PrestoGateway records history of recent queries and displays links to check query details page in respective presto cluster. +![prestogateway.lyft.com](../docs/assets/prestogateway_query_history.png) + +### Gateway Admin UI - add and modify backend information +The Gateway admin page is used to configure the gateway to multiple backends. Existing backend information can also be modified using the same. +![prestogateway.lyft.com/admin](../docs/assets/prestogateway_ha_admin.png) + +How to setup a dev environment ---------------------------- Step 1: setup mysql. Install docker and run the below command when setting up first time: @@ -18,7 +56,7 @@ Now open mysql console and install the presto-gateway tables: mysql -uroot -proot123 -h127.0.0.1 -Dprestogateway ``` -Once logged in to mysql console, please run `resources/gateway-ha-presistence.sql` to populate the tables. +Once logged in to mysql console, please run [gateway-ha-persistence.sql](/src/main/resources/gateway-ha-persistence.sql) to populate the tables. Step 2: Edit the configuration `gateway-ha.yml` @@ -27,3 +65,195 @@ Step 3: Add below program argument to class `HaGatewayLauncher` and debug in IDE ```$xslt server /path/to/gateway-ha/src/test/resources/config-template.yml ``` + +## Gateway HA API + +### Get all backends behind the gateway + +`curl -X GET prestogateway.lyft.com/gateway/backend/all | python -m json.tool` +``` +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Delete a backend from the gateway + +``` +curl -v -H "Content-Type: application/json" -d '{"name": "presto3"}' http://prestogateway.lyft.com/gateway/backend/modify/delete +``` + +Verify this by calling get active backends +``` +curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool + +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + } +] + +``` +### Add a backend to the gateway + +``` +curl -v -H "Content-Type: application/json" -d '{"name": "presto3","proxyTo": "http://presto3.lyft.com","active": false,"routingGroup": "adhoc"}' http://prestogateway.lyft.com/gateway/backend/modify/add +``` + +Verify this by calling get active backends +``` +curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool + +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Update backend information + +``` +curl -v -H "Content-Type: application/json" -d '{"name": "presto3","localPort": 8084,"proxyTo": "http://presto3.lyft.com","includeInRouter": true,"active": false,"routingGroup": "adhoc"}' http://prestogateway.lyft.com/gateway/backend/modify/add +``` + +Verify if the port number is updated by calling get active backends +``` +curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool + +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Get active all backend behind the Gateway + +`curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool` +``` +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Deactivate a backend + +`curl -X POST prestogateway.lyft.com/gateway/backend/deactivate/presto2` + +Verify this by calling get active backends +``` +curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Activate a backend + +`curl -X POST prestogateway.lyft.com/gateway/backend/activate/presto2` + +Verify this by calling get active backends +``` +curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool + +[ + { + "active": true, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` diff --git a/gateway-ha/gateway-ha-config.yml b/gateway-ha/gateway-ha-config.yml index 2885af98..94089bb4 100644 --- a/gateway-ha/gateway-ha-config.yml +++ b/gateway-ha/gateway-ha-config.yml @@ -1,7 +1,6 @@ requestRouter: port: 8080 name: prestoRouter - cacheDir: /var/log/prestoproxy/cache historySize: 1000 dataStore: diff --git a/gateway-ha/pom.xml b/gateway-ha/pom.xml index f0f88723..e94f8ff4 100644 --- a/gateway-ha/pom.xml +++ b/gateway-ha/pom.xml @@ -19,6 +19,7 @@ 1.8 1.8 + 2.7.4 UTF-8 UTF-8 com.lyft.data.gateway.ha.HaGatewayLauncher @@ -64,23 +65,10 @@ 2.2 - opensymphony - oscache - 2.4.1 - - - javax.jms - jms - - + net.sf.ehcache + ehcache + ${ehcache.version} - - - - - - - diff --git a/gateway-ha/src/main/java/com/lyft/data/gateway/ha/module/HaGatewayProviderModule.java b/gateway-ha/src/main/java/com/lyft/data/gateway/ha/module/HaGatewayProviderModule.java index ee1a604a..66996096 100644 --- a/gateway-ha/src/main/java/com/lyft/data/gateway/ha/module/HaGatewayProviderModule.java +++ b/gateway-ha/src/main/java/com/lyft/data/gateway/ha/module/HaGatewayProviderModule.java @@ -37,8 +37,7 @@ public HaGatewayProviderModule(HaGatewayConfiguration configuration, Environment routingManager = new HaRoutingManager( gatewayBackendManager, - (HaQueryHistoryManager) queryHistoryManager, - getConfiguration().getRequestRouter().getCacheDir()); + (HaQueryHistoryManager) queryHistoryManager); } protected ProxyHandler getProxyHandler() { diff --git a/gateway-ha/src/main/java/com/lyft/data/gateway/ha/router/HaRoutingManager.java b/gateway-ha/src/main/java/com/lyft/data/gateway/ha/router/HaRoutingManager.java index 0d31270c..ced1353b 100644 --- a/gateway-ha/src/main/java/com/lyft/data/gateway/ha/router/HaRoutingManager.java +++ b/gateway-ha/src/main/java/com/lyft/data/gateway/ha/router/HaRoutingManager.java @@ -10,10 +10,8 @@ public class HaRoutingManager extends RoutingManager { HaQueryHistoryManager queryHistoryManager; public HaRoutingManager( - GatewayBackendManager gatewayBackendManager, - HaQueryHistoryManager queryHistoryManager, - String cacheDataDir) { - super(gatewayBackendManager, cacheDataDir); + GatewayBackendManager gatewayBackendManager, HaQueryHistoryManager queryHistoryManager) { + super(gatewayBackendManager); this.queryHistoryManager = queryHistoryManager; } diff --git a/gateway-ha/src/main/resources/activejdbc.properties b/gateway-ha/src/main/resources/activejdbc.properties index c01e5e34..4962bac1 100644 --- a/gateway-ha/src/main/resources/activejdbc.properties +++ b/gateway-ha/src/main/resources/activejdbc.properties @@ -1 +1,2 @@ -cache.manager=org.javalite.activejdbc.cache.OSCacheManager +cache.manager=org.javalite.activejdbc.cache.EHCacheManager + diff --git a/gateway-ha/src/main/resources/template/admin-view.ftl b/gateway-ha/src/main/resources/template/admin-view.ftl index aac95d75..f5396135 100644 --- a/gateway-ha/src/main/resources/template/admin-view.ftl +++ b/gateway-ha/src/main/resources/template/admin-view.ftl @@ -16,7 +16,6 @@ -HELLO

diff --git a/gateway-ha/src/test/java/com/lyft/data/gateway/ha/router/TestQueryHistoryManager.java b/gateway-ha/src/test/java/com/lyft/data/gateway/ha/router/TestQueryHistoryManager.java index 2ad398d0..5b88e89a 100644 --- a/gateway-ha/src/test/java/com/lyft/data/gateway/ha/router/TestQueryHistoryManager.java +++ b/gateway-ha/src/test/java/com/lyft/data/gateway/ha/router/TestQueryHistoryManager.java @@ -7,10 +7,9 @@ import com.lyft.data.gateway.router.QueryHistoryManager.QueryDetail; import java.io.File; +import java.sql.Timestamp; import java.util.List; - import org.javalite.activejdbc.Base; -import org.terracotta.statistics.Time; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -42,8 +41,8 @@ public void testSubmitAndFetchQueryHistory() { queryDetail.setUser("test@ea.com"); queryDetail.setQueryText("select 1"); for (int i = 0; i < 2; i++) { - queryDetail.setQueryId(String.valueOf(Time.absoluteTime())); - queryDetail.setCaptureTime(Time.absoluteTime()); + queryDetail.setQueryId(String.valueOf(System.currentTimeMillis())); + queryDetail.setCaptureTime(System.currentTimeMillis()); queryHistoryManager.submitQueryDetail(queryDetail); } queryDetails = queryHistoryManager.fetchQueryHistory(); diff --git a/gateway-ha/src/test/resources/test-config-template.yml b/gateway-ha/src/test/resources/test-config-template.yml index dd8a2ebb..bdc2280b 100644 --- a/gateway-ha/src/test/resources/test-config-template.yml +++ b/gateway-ha/src/test/resources/test-config-template.yml @@ -1,7 +1,6 @@ requestRouter: port: REQUEST_ROUTER_PORT name: testPrestoRouter - cacheDir: CACHE_DIR historySize: 1000 server: diff --git a/gateway/README.md b/gateway/README.md new file mode 100644 index 00000000..5b731256 --- /dev/null +++ b/gateway/README.md @@ -0,0 +1,168 @@ +# Standalone Gateway + + +### Table of Contents + + * [Standalone Gateway](#standalone-gateway) + * [Getting Started](#getting-started) + * [Build and run](#build-and-run) + * [Query History UI - check query plans etc.](#query-history-ui---check-query-plans-etc) + * [Adhoc vs Scheduled query routing](#adhoc-vs-scheduled-query-routing) + * [Gateway API](#gateway-api) + * [Get all backends behind the gateway](#get-all-backends-behind-the-gateway) + * [Get active backends behind the Gateway](#get-active-backends-behind-the-gateway) + * [Deactivate a backend](#deactivate-a-backend) + * [Activate a backend](#activate-a-backend) + +## Getting Started + +### Build and run +run `mvn clean install` to build `presto-gateway` + +Edit the [config file](src/main/resources/config.yml.template) and update backend urls + +``` +cd gateway/target/ +java -jar gateway-{{VERSION}}-jar-with-dependencies.jar server ../src/presto-gateway/gateway/src/main/resources/config.yml.template +``` +Now you can access load balanced presto at localhost:8080 port. We will refer to this as `prestogateway.lyft.com` + +### Query History UI - check query plans etc. +PrestoGateway records history of recent queries and displays links to check query details page in respective presto cluster. +![prestogateway.lyft.com](../docs/assets/prestogateway_query_history.png) + +### Adhoc vs Scheduled query routing +In the [config](src/main/resources/config.yml.template) +you can specify if a backend cluster is a part of a routing group. +If not specified, cluster will be part of `adhoc` routing group by default. + +PrestoGateway router will route any request to `scheduled` group of clusters if request contains header `X-Presto-Routing-Group: scheduled` and there are clusters present with config `routingGroup: scheduled`. + +If no matching `routingGroup` found, router will route to `adhoc` group of clusters. Please make sure there are clusters under `adhoc` routing group. + +## Gateway API + +### Get all backends behind the gateway + +`curl -X GET prestogateway.lyft.com/gateway/backend/all | python -m json.tool` +``` +[ + { + "active": true, + "includeInRouter": true, + "localPort": 8081, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8083, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8082, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + } +] +``` + +### Get active backends behind the Gateway + +`curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool` +``` +[ + { + "active": true, + "includeInRouter": true, + "localPort": 8081, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8082, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8083, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Deactivate a backend + +`curl -X POST prestogateway.lyft.com/gateway/backend/deactivate/presto2` + +Verify this by calling get active backends +``` +curl -X GET prestogateway.lyft.com/gateway/backend/active | python -m json.tool +[ + { + "active": true, + "includeInRouter": true, + "localPort": 8081, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8083, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` +### Activate a backend + +curl -X POST prestogateway.lyft.com/gateway/backend/activate/presto2 + +Verify this by calling get active backends +``` +curl -X GET localhost:8090/gateway/backend/active | python -m json.tool + +[ + { + "active": true, + "includeInRouter": true, + "localPort": 8081, + "name": "presto1", + "proxyTo": "http://presto1.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8082, + "name": "presto2", + "proxyTo": "http://presto2.lyft.com", + "routingGroup": "adhoc" + }, + { + "active": true, + "includeInRouter": true, + "localPort": 8083, + "name": "presto3", + "proxyTo": "http://presto3.lyft.com", + "routingGroup": "adhoc" + } +] +``` \ No newline at end of file diff --git a/gateway/pom.xml b/gateway/pom.xml index e2ef6794..36b79a27 100644 --- a/gateway/pom.xml +++ b/gateway/pom.xml @@ -21,7 +21,6 @@ 1.8 UTF-8 UTF-8 - 9.4.9.v20180320 1.3.8 3.5.2 @@ -62,11 +61,6 @@ dropwizard-assets ${dropwizard.version} - - org.ehcache - ehcache - ${ehcache.version} - com.google.inject guice diff --git a/gateway/src/main/java/com/lyft/data/gateway/config/RequestRouterConfiguration.java b/gateway/src/main/java/com/lyft/data/gateway/config/RequestRouterConfiguration.java index ec3b5995..6c484aa4 100644 --- a/gateway/src/main/java/com/lyft/data/gateway/config/RequestRouterConfiguration.java +++ b/gateway/src/main/java/com/lyft/data/gateway/config/RequestRouterConfiguration.java @@ -10,8 +10,7 @@ public class RequestRouterConfiguration { // Name of the routing gateway name (for metrics purposes) private String name; - // Cache dir to store query id <-> backend mapping - private String cacheDir; + private String gatewayStateDir; // Use SSL? private boolean ssl; diff --git a/gateway/src/main/java/com/lyft/data/gateway/module/GatewayProviderModule.java b/gateway/src/main/java/com/lyft/data/gateway/module/GatewayProviderModule.java index baad8f71..1dfc8128 100644 --- a/gateway/src/main/java/com/lyft/data/gateway/module/GatewayProviderModule.java +++ b/gateway/src/main/java/com/lyft/data/gateway/module/GatewayProviderModule.java @@ -40,10 +40,10 @@ public GatewayProviderModule(GatewayConfiguration configuration, Environment env new QueryHistoryManagerImpl(getConfiguration().getRequestRouter().getHistorySize()); this.gatewayBackendManager = new GatewayBackendManagerImpl( - gatewayBackends, getConfiguration().getRequestRouter().getCacheDir()); + gatewayBackends, getConfiguration().getRequestRouter().getGatewayStateDir()); this.routingManager = new DefaultRoutingManager( - gatewayBackendManager, getConfiguration().getRequestRouter().getCacheDir()); + gatewayBackendManager, getConfiguration().getRequestRouter().getGatewayStateDir()); } /* @return Provides instance of RoutingProxyHandler. */ diff --git a/gateway/src/main/java/com/lyft/data/gateway/router/RoutingManager.java b/gateway/src/main/java/com/lyft/data/gateway/router/RoutingManager.java index 8aefd6bf..51cbabb6 100644 --- a/gateway/src/main/java/com/lyft/data/gateway/router/RoutingManager.java +++ b/gateway/src/main/java/com/lyft/data/gateway/router/RoutingManager.java @@ -1,32 +1,28 @@ package com.lyft.data.gateway.router; import com.google.common.base.Strings; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.lyft.data.gateway.config.ProxyBackendConfiguration; import com.lyft.data.proxyserver.ProxyServerConfiguration; -import java.io.File; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; + import javax.ws.rs.HttpMethod; import lombok.extern.slf4j.Slf4j; -import org.ehcache.Cache; -import org.ehcache.PersistentCacheManager; -import org.ehcache.config.builders.CacheConfigurationBuilder; -import org.ehcache.config.builders.CacheManagerBuilder; -import org.ehcache.config.builders.ResourcePoolsBuilder; -import org.ehcache.config.units.EntryUnit; -import org.ehcache.config.units.MemoryUnit; - /** * This class performs health check, stats counts for each backend and provides a backend given * request object. Default implementation comes here. @@ -34,29 +30,23 @@ @Slf4j public abstract class RoutingManager { private static final Random RANDOM = new Random(); - private final Cache queryIdBackendCache; + private final LoadingCache queryIdBackendCache; private ExecutorService executorService = Executors.newFixedThreadPool(5); private GatewayBackendManager gatewayBackendManager; - public RoutingManager(GatewayBackendManager gatewayBackendManager, String cacheDataDir) { + public RoutingManager(GatewayBackendManager gatewayBackendManager) { this.gatewayBackendManager = gatewayBackendManager; - - PersistentCacheManager persistentCacheManager = - CacheManagerBuilder.newCacheManagerBuilder() - .with(CacheManagerBuilder.persistence(new File(cacheDataDir, "queryIdBackendMapping"))) - .withCache( - "queryIdBackendPersistentCache", - CacheConfigurationBuilder.newCacheConfigurationBuilder( - String.class, - String.class, - ResourcePoolsBuilder.newResourcePoolsBuilder() - .heap(1000, EntryUnit.ENTRIES) - .offheap(100, MemoryUnit.MB) - .disk(1, MemoryUnit.GB, true))) - .build(true); - this.queryIdBackendCache = - persistentCacheManager.getCache( - "queryIdBackendPersistentCache", String.class, String.class); + queryIdBackendCache = + CacheBuilder.newBuilder() + .maximumSize(10000) + .expireAfterAccess(30, TimeUnit.MINUTES) + .build( + new CacheLoader() { + @Override + public String load(String queryId) { + return findBackendForUnknownQueryId(queryId); + } + }); } protected GatewayBackendManager getGatewayBackendManager() { @@ -70,6 +60,8 @@ public void setBackendForQueryId(String queryId, String backend) { /** * Performs routing to an adhoc backend. * + *

d. + * * @return */ public String provideAdhocBackend() { @@ -105,11 +97,11 @@ public String provideBackendForRoutingGroup(String routingGroup) { * @return */ public String findBackendForQueryId(String queryId) { - String backendAddress = queryIdBackendCache.get(queryId); - if (Strings.isNullOrEmpty(backendAddress)) { - log.error("Could not find mapping for query id {}", queryId); - // for now fall back to the first backend as default - backendAddress = findBackendForUnknownQueryId(queryId); + String backendAddress = null; + try { + backendAddress = queryIdBackendCache.get(queryId); + } catch (ExecutionException e) { + log.error("Exception while loading queryId from cache {}", e.getLocalizedMessage()); } return backendAddress; } diff --git a/gateway/src/main/java/com/lyft/data/gateway/router/impl/DefaultRoutingManager.java b/gateway/src/main/java/com/lyft/data/gateway/router/impl/DefaultRoutingManager.java index f10ea7a0..4df12681 100644 --- a/gateway/src/main/java/com/lyft/data/gateway/router/impl/DefaultRoutingManager.java +++ b/gateway/src/main/java/com/lyft/data/gateway/router/impl/DefaultRoutingManager.java @@ -5,6 +5,6 @@ public class DefaultRoutingManager extends RoutingManager { public DefaultRoutingManager(GatewayBackendManager gatewayBackendManager, String cacheDataDir) { - super(gatewayBackendManager, cacheDataDir); + super(gatewayBackendManager); } } diff --git a/gateway/src/main/resources/config.yml.template b/gateway/src/main/resources/config.yml.template index a0051736..2e6cf978 100644 --- a/gateway/src/main/resources/config.yml.template +++ b/gateway/src/main/resources/config.yml.template @@ -1,7 +1,7 @@ requestRouter: port: 8080 name: prestoRouter - cacheDir: /var/log/prestoproxy/cache + gatewayStateDir: /var/log/prestoproxy/state/ historySize: 1000 backends: diff --git a/gateway/src/test/java/com/lyft/data/gateway/GatewayTestUtil.java b/gateway/src/test/java/com/lyft/data/gateway/GatewayTestUtil.java index aeea5ba9..72b4a6ba 100644 --- a/gateway/src/test/java/com/lyft/data/gateway/GatewayTestUtil.java +++ b/gateway/src/test/java/com/lyft/data/gateway/GatewayTestUtil.java @@ -34,7 +34,7 @@ public static String buildGatewayConfigPath( String configStr = sb.toString() .replace("REQUEST_ROUTER_PORT", String.valueOf(routerPort)) - .replace("CACHE_DIR", tempDir.getAbsolutePath()) + .replace("GATEWAY_STATE_DIR", tempDir.getAbsolutePath()) .replace( "APPLICATION_CONNECTOR_PORT", String.valueOf(30000 + (int) (Math.random() * 1000))) .replace("ADMIN_CONNECTOR_PORT", String.valueOf(31000 + (int) (Math.random() * 1000))); diff --git a/gateway/src/test/resources/test_config_template.yaml b/gateway/src/test/resources/test_config_template.yaml index d8bcba73..363c6137 100644 --- a/gateway/src/test/resources/test_config_template.yaml +++ b/gateway/src/test/resources/test_config_template.yaml @@ -1,7 +1,7 @@ requestRouter: port: REQUEST_ROUTER_PORT name: testPrestoRouter - cacheDir: CACHE_DIR + gatewayStateDir: GATEWAY_STATE_DIR historySize: 1000 server: