From c04ee690078e1fda285f84e13a36b34fed21a306 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 23 Oct 2007 06:03:24 +0000 Subject: [PATCH] Add the second of the "basic topics" tutorials. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43241 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/tutorial/JITTutorial2-1.png | Bin 0 -> 59107 bytes docs/tutorial/JITTutorial2.html | 186 +++++++++++++++++++++++++++++++ docs/tutorial/index.html | 2 +- 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 docs/tutorial/JITTutorial2-1.png create mode 100644 docs/tutorial/JITTutorial2.html diff --git a/docs/tutorial/JITTutorial2-1.png b/docs/tutorial/JITTutorial2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..eb21695f684aa96dbd8b77cca08726e90d19965d GIT binary patch literal 59107 zcmbTeWl)_>&^AZ}3oaoz!QI{6-Q9z`y95m$+}$05+ab8SySux?-sJh-s<(Fc&+e&8 zr7{e2dV0Ehdak}YA#yUJa9=RLfPsO*iHiv-fPsDD0t5Td4Fv&=JQvZ{0DpZp;g{wI z16%kcFe{r4{2SU}9!BhjdVuAUPj^fh7kaJ(q5TVH(JkWf>z`lct3-K$trX8;! zXld=F)4q;bnh+Q!D~V;pt?p*JqfEh)SfOZ+SO;0;I;FxFw2(Lz*_D213&Dvgpc&B7 zg?SuY#b2U8|5kx%O1)YIbGwIVev)9BSPf&IeKHPPrx*C;P!1A&Bs_g0dG(6(%@|$p zo|lf!a}^|FJi2zqK8A7W$v$?49r67m()&jq`7ulgl27RU!=#&Zj`(kI(x6lD-;j71 zG{V1m#MC5Q|3>0!YeV4mie0xNSkE`ZXh}F=2?$b18&=&das_}BX<1`P$5;Qb?^A?5mS zgv^Y71OI&_C$A^q|J$St;*Q|g*9{>^{&#U}x9K+2KXMGV`_-*^Fi+_J+a5K$lq(t^ z86qDUssP#TaR0UM801<~AcV$H^-0mE-66*a>UsTPQI19~m`&z6)gvZP3Y> z`SGQQsy|4kGFYb2UnVxJa1pW_1OK|7HS5|Hm#O*1^whHF!V>Np;u9uyMzfnzY3)vRup5p6st}-n5mMkYi6UJ{tc{3=I(_!;QiA6^U#8BSqx#&s9#?ljig)^mwT9X6kJYhwwz-r|k@RhaWB4$gh+C> z`8C&p{O%ppfZgs2L+L!+hJtIi^MpkxrtKggg|AiAVd`!YSH_r+7&O^wT}>i?AE2qVd@22L{|o3 z;O=s7T0gaQF=7v;{IlW^{Z2;N`c-#Sl7omN)bJo|Y+CA`i&jgm>N}cwaDI7sc5U;LFE57pJFNd`b@UXH~ZznEaDW8JBKGlbV z+NK`-IjgREv9&H-c)>Dz|5@rlIP{q30NnJ_m5+vl$Y z{jM;zi;nVc78A&S14u)zr@gRx{p+H~lq){zY5dd55XRFv5z?Cx`c&uEv~?F~K?>HdM+SjVDoS+u>_2N)9m2I{belT#>P{*r2o{&W@j z+IeoP#mXibMhp+Eukj`6oQO{^3nw4Eseg1-#90O(`(-243al+sVjmVF%@RY*G@KAZ zUN;6Zebsk(SSk<8v7gfH?>X0L^;HO0S(^bh=u)VU>(mGd#%b$xxK1rKIXJQ?&7`UZ z*9{W~_8{3nJx{Q3K+tP1DFzBI3seh+nT`u_!NIW4Oh(2VrB*!U`k|IrIaKSQ8C5qh zz8tFX>(33qNcMkc==eRfGklZ822>RXn{-Z9#b?9q{NvnVCkLIg5UE3ttgJ zl~X2nt!M{yy7-MGGpFGjuTL-NI#rx__)Mrj4BkFjD^1U2m&_B$mV4>Z;@ZKEF6lTW zl69GxX#bJwn}!0PVJ#jnDf~XI8zr^n-55rpS6S-ULnd9`lB*)D5u-_i4#5zj0z!V_u9+#RNei4HHiymnH5)7e%tkI_Tv_aZiF-A{3=t)F+!dsM|2GiuHUarI7aCJ-=nie zNo|3u(dqzWxVUjEez6Us{Tgki&8)&M5?gM?b4La17S#PltIL1(n{FE+^JkWvNswOg z0jB!jGvu<%x*y1korwxjN;)DPt6xEU&jK|gREdd6+)y&@blE%}(SOqNC7>!#C~Ba3 zsI4zne#^zujxs7kp=c%B)u?S|?GV$nuZ8?Fo!G?50B1Tb>mxsin28kBoC)@WN7%&K zB8@JF+fZNn@K?*rr90`WGc|$D=1Ff-O~J)oJ*8okc+n&lW;nCOa~8pQ&vulkHIUtppK+8I z>^0XUSf$gK2W4-Ot`AJ>2@xBRqXmDjPkj9Bbw`8O16r`V8KcBh3y_?baG)w*Zt=9m z9*SJ4Z+XH#nfR9UoeG6hGDf2PXKzw~y=Ad3X7l9w* zwo&goIAX#ZZJ6d>S0Hi1Vw&0yUTFA`9#TsFE}z(VeZ2aYH53Nx6!LE_Lxi^1kJ{G8jCu81*ODgRDtb0@Y0{J|+rcGCb26EkNZew}jc+!k`Ew89iojo#TI z%CdFCxR&wPaB~#)1EcC0C~2qq{=I#(jh*AutaZBu@X`ggKUyH^qEd2{;pm&t0FZn% zWFSwWc0X&$m9&wcN6f7;w{xmq^)}4I14=tp!lu0RPUn+ZDe@dM`4fF2JE23XwuA$3 zO}YASm8;Us`~nS}N+y_xf}$;?!WkxJXqF+OsWR!!RW833G%xrFzw#0hvYHgaqp!?O zq-+uma#ZOEl7ZuUH!!F5CH>Ck(>eN>4epPP#)U5kWyAivVE1mw=o z=SBP?Yr0^4X6o6(>(0_F_e{AAWY7eqJiCI+Iz-3Z-~0QO4q_G`Yvg^YtEN&=uV5&R zU*G3pR+iXlY&6UBn=??Pm=V6s=w~uXc2j!G(o>CpUP#g<6=K;l3nAkED$i`?qnfTq zuld=5Z9|?iAH|8-UOAiy7NvbS8brD^8jHCkrtqC4KmqwjZSkH!vT^KIHARTxII&vZ z31-;Ns~kghjzvu2S7`1HvsIQI^qxFvZj?he<}b|LgrxPv%Xd9mNLOqt(h|C{q4hi+ zgd~}`vWb|ojXqPq<@7PvTzYv==M65R;%o?I^y=+u4GDcz-u6cKdqp+S~8RKC)#O6EBju=S<}?W|;N%fs5Ug%e@0ohO=Ud#Ybna9{nbp1UaKZL;^sHZf`?{4YEM6Zag4a zw(TmvKcHY7CL#PoI~Nvqy-^5nRup8!hdTH>Nl5hA3~>wn75(ilZeI#_a5u4VM6f(*gYMPF zf)Cdx$rYa4C*WPGQIK%Z*d7x5$C%QZx0d;`spgVw^lvDrjf3ll9H-^nDksBsh22hV z{gb|_XC2pUEjmoZW07iX{(SAc`xBw*qZOky*G^~U>bb$);rxtPIg58C|pEr#Yr zzwC+W=pxJY?dvsu3JUCUyrjHJCHFZ61S8CPDo|z?yiR(g|MMXk-`<~LX@_u~5 z*~d-_&e+E%Guhk>rawIocz-2r*|gWOGU?GdMPM_ox_w){7cJ~>R9FqRo4cKGq4mUR zG(6EsqFg-h2Sta1n2^^T$CNxCKG5q^_P(^#oIg)p#)o)-UIY7e#dKaL7#p4Mn)lOl z9=m_`7ed;DxDT_7YnZRte5s$J_&{@xk3L=Qm0$bY@#ZdX;ekZ{PY)*-^fp@^3QaED zSn4FAsVXj>8R%fK-&8A7k=?i4%2P2dDWBz)r!&+{s)g-v3JeoB_Eo^9;~OivM|_ah zY-Do;a;ME}jY^r(()j_jHMUlY)7N1%7@muXs9qhgv#s*G%Fe;!3Ld9tE34TV`<~T6 z#>Tzv@_X?C>n02x(<+>&xl`Y!z9?$DqHz&Y7XNn3-)G}$pw}LB>1+kN6={R`=4zy1 zYSIf;+BkzS4bwKbzA8f-%;nd1Wdmn!-##3dT%oolq-!6xmURJqdi4nc;={DS$8>{1 zVjY5(H;?IV9aPNv4&~)=UA#pe26Zk~pIA3!g!?i5BPEv}h*85n=x>(PV}yc(&)Wt} zTg{Y;gjX&Z9~V#Yn!wzT+5`RT&>SC1FE~qaJ;tUDmKyAlJPmZGcQ6Hf`e?_WUi;3Q zjvDj^xxCTr`V|_6q#3bf*}eyTNOfQtIRf4|WM)LoC=&`uXENm-8O{A!;Fl&Yv6Bl+ z8icOTI@!Xw6C;?+G3t#dT%Rq3)8+K(ztq=f_k)2?K2@+HBp|X|=ei!0M zP7N%;C5N!t#*cq+8vI1lCgX$=t88lD1m5l=rrk@%bThJM$j?nZDCSVGxf^|-3n@US z{<)MRCV65uCnLky$k(r5@AD*+lkZ2f@BZht=ULz)saa|1=X!{U!#&dWqAoVNu^g`c z%)Mgv8{cPMiV@zZ{wxF#IDKxUXp-_5h;_TI*z4$ zEA6**^exCe4qX%u9`P7uaN6+a1QB|~Z`}Bl+a!f%UV@1AY>lJKas zzdYFlyym8sh9J3Y5^fY?E`>`yOq3yBmNsN@k=#4wiDgFfmGi1SI?O)2s3fxa!sxum zmbfDV_im1kC1&$qXPfc^GSWYqn+Azxk1Q~`ncTf2nxEw)rypn|G3{(l?ZR1!P$k!5 z{~Qpx)h@q-h!WPA2R^aOU<5P&2MEB|DYU3+$LrVf4@Vyf6UZJ9NPqR}@`pNv6_ZTY zwDHn4A%^Yks#0pSy&aE7$G!d-#FUpGzG4Ff;)6O5qsLI7x4spCxnGZcyf9V#jhU$D zSv1PLu9pi=^QLb31!16LNwA^0ppvFUUc?;?RV*KWi^S(PiajRjC8!Wi^Bd@_90NJQL zwu`IZp~!R0uz5bHETE^+WPs_Uj9OmjdnAz2=Uxf~1odAH}K8y1D|a(ZKWm6o~L z#8)$=cxQ#)fDvsbmYB(_bhH1{O(HS`KwQc7J8NKXX7Pgcm*jT@xA@VS*o)56gR|4W zweYbq(86MOA z_J7A)K35@(F%hd`ogsew&}8)clKgWXQLBTDL4bh5AQF#rzMC#~W-^DhuEHDE$;V@h z1>`Y1KKJj`W0WI&_Al=muU4a0OQ`+jT{~)D;b>7eksiByCnWZSxzNSHb8scj)fblE zf&oA^)bN&*BJTi?5CEr-3BbS_=+Sv|vwHf!?Bi+m>q82lU%zkHa)C9oLJ~=B*b1gc@|#=s_$U$tNYkMDU=nDz|LbOvtgGj%tO~CA;nal4pg2 zb~M`4u>@EA!ngat%BdUj<(-&n&p0vgPY{ZSwX{EW89wQZCmZ22~QxzqMa6%zhwlj z1?!5RYGLeNAcUN*23dv!++>Y)=b5p3Va5pP(ir!^ z5LU9^Y;r$z{b2uR#({Z@iz8t6l52me#g&DDe+cZSP^_X6<21N!8lheMkm+mjfP;qRo~OT;#!zos_H4^NZ`| zZ9G5wPpyWc9XYQB*=!F|%C=Z;DrPXQ+-VJ&+krX4@)_F}B$i&E@nW%4WZaTGO z6W7dQ8}w-$ddVsHq1=N5@O^BDr}48(hp4Za)OTJwwD4UEtIOY^pVoYeKdq(11gH&- zJ65yXVOLULH(Tb@j7UE8Sk>?(Btw63GKNY>sfZT$PSlIv3>G&{9sMAB;i5d!Xt}AJ zG4*e|v#l~6pL53}UF~2Gi_lo7j?Gn(UR6;%}Y@_vYJ64UX;5)_R&k`_5c|1iRHW*yKZCEoD3_W!w_| zhvE^CjbFP9#7Bv#C^@}NBca70c6Jsjg)-BT{7$+6EIp$E4!*1})J%vy*DL5_v=_MXijPqYgaS&O<~7IQcdtno z%jbt*Iy~Rg6UQ54QdI)FM%~4TAxm+B>r04Pxqi8XX9^YEuXxQm^9{q8+m6i+NXUGd z3f{0=^WV4qczH)jckxrmD?iRKLyXLxI=IRpA&SxcY*X0Da1i0aMR~9v@x065AN|(^ ztLdLJ|7#CD*Uqzfp&cL!4dI|)$?r>Rh;#7$)V;E&afAjr z^#1~KsudD!`f#xNOpq0({*CnINWbhl0J+SN0iZ&cN5~l{FQ?IMlBjX5*-OA znn>E;uADM@eu`u@79(P9(jV5SEmZPkz@+2jurB`&ER#Cu$h+Bk6qMG=*l<{ilCT5G za5<;Tkm6dqa!iMcIIzz|D~LPw4r$eZrJ**ipM_8Hz9PiS3@VC4&*g%6EyF z*B|GLRfL~=KyC`pSJiPUtc9HZwkuTdm1~B3fCsOac4_8v=0w!Ngfh~^BF>?3Dr*`k zn1^bLinV(Cyvv6?IyDX>Z{Bf%%;h>tBd5Jip~*V`iU4FE#T)n&W43V3QuWdG>q!#} zLwW8ay2^?Jqri&nIv=&%-M&>UY~e}QgZ+Vv--m<4yYCHE$S=_rmTJkguNA*Ry6$$~ zGW_fukTZN435aLI)DFvh`5(FL9z)2!;>jWjDxcINoz2_zl@#}E6&|e=4qK&!}2lAe4 z7oS9|DEF;VLd(&dn&wBO37#0GbH!8F$dhK+;?T%+vU_1W)Haa0?5C)6$GP&P&de>) zj&Dgi7IIlSpxwa}+tflD8pUlrmi_kPjq%rhgma*U$xTfY%~Qon)v!SGcM#57%|>4l zoX)8z6UM2J02o}#a_(4?uBS?B+}F~~LMmA| z@&-A}xLs8!FP-*v>(Wpv#i^Zi+qDZSJQs&Rz0l?Yy)U|kD%m!n_pP{za+V4e^d5txtQEAUYMG;&~XJ4 zTs4CE(j!}#sv@h8990wtFI**iREKaID}Ib{MBqh08+4goYDd1aJZG7D?II<`-@cA> zs8B&^*H(ZVMYnwcr9=L#7xkM~7lDPJ2Cld%vo=lsg{u3Nr;$SHvM&1>O(}ArXf(4q zt)Q30N=RrRqJ5)~JOetaxDn7tzdEzR#9@s2=T|YKvPSiikDmiUxD6TuI2M<;H;fXl z-7iev$m4T7Q>BYx2acL{ULi@U4XAH+s!HOC96$<9b#>%3s6LG`3P{Rk2+g0vv^ppf zo+!v5mvfW?B7_BGT~ivQi-%JOr(a3=ZyLKpRmb|H8|H`UABo)FK{&nYa3Uf59h0CJ zd;^s~C2>}>ML#1?H0jbW9a+iaPu_vNEi@E<*+f0XvFw3amJLu}s^-JzmT3$AGPS`O z1A6k4D=AV?k%ZT@@V-+*Pf?tPh;*uHW(-RmRak0g$n$Tx0umL*BOhj-gQWMZ^b-rOgTN}7c{rB zpKu0mx_t^Jz^usG29685is9-{|5I(bTM+~0S(`Vn$Rl{t#m<-!A7+#3NYD%llS_z6 zDjc;`KJ8z#$`0d;sX7FX4I7?->_>w%0Uq3z69sHm%PzBTdKPwD%P4!_Rp#ZMw&p}c zFZCT=52tUE#SmEOr+iS=FKe0mVP&Td;~*F*yK)Btmk!bOhcVeN-(f$uJksJ29XbZ) zuTK(Vo5u?dQ0{3}6rZ>@s(qeDu*V>)b|P!eVd3fmWh8)n}F7lQ= zKD`(6v86%&-LEW5H7s|>2nOLl^T4^0p31K_x1pbU>m0aDxuSbG zulRDauJ~$}jdfYFbeRtJhD%uASl8aL%R3wye^#jYx&~=y8V31BxfhqD$sKh4){NKd zU$`T`xZKH}*0#=HeT1!Z@u9LFL}uL)fK@T@%aV5MaSJN6opKas(a%N4d2q_!W&yiR z)N{kag~Eom6{3<$ywLls`^>46o2V;)Nekg}wk`;kT{mH=jHGQ@ zjP#cx5W;n>J1?IZTkY2W5@uK(%*pIh|=fC-J!gFp{qc^%E6mIvr z0&hj!R-Y!<1ag`uOcnFG>3tix2lsg4B`zYhPRI|Aw()DUDGND?yue1`Z(PQ?-bxX# zYd2S=J>)5MT%>78Sv(!EWY|b_O@^{b<)^A)AV(X=T@QVqOH8lUeR)9d3DQ7_i!0hs zx1!4)VUH%YYCihYwe-NfOde|4mc1k0U(><=10e>&kmaeg)5<7Fk2We)>|?lCWorH* zJUxEC(6-NCm_6=YAZ)2NyD2QF+r6JRzo@CWAPfXhOd%((%%=PJvFGkY^cva*v5t^A z)%)EaR)#~3akB3Frh*o{##a9uRka^ThPmjOF&}_?LmO)Z`HmE8lsz`4)o0zVwe(pM z`9{vFRx>C*T!*c}N2HW8|Ill5rCVeqt z#$&a?)E17?Bw&j8(!*xZ^Wz^V7})=tAtFiwWu)2f+Wlfai@o~a^_2=l%kTaF=sKtm(ZqkSfquxYk z3Llrd_QJ?G)?0K^s;3U1y8D@zFs7*?#vg zx9L7yW*{O5#hu|2FQ@IuI$w=KY88FSKVi+SF_dw$-@;YT8NnwiEQGugVp{xbC=1+N)TY?KT=TU0=&Qyc)gc)8#_E)yKp?bv@KrI#Y72O( zndROQlAw9vc60|=fh0~jIm7(VX=n``p}+s3iFAI?&C$W$B9YR#A4;U?B%ZL%RX8L> z&wRvivc8vGIsO>`Sm)qzO{THCNx}{RAf10;%LEeLPdoPpG$x1|+r0IQMAduMrip|Q zu8kT9ChW=WOH zbB;uaf?)ApyP(a4t_&pK!V2XWa}o$-lWnGXiAFjM7qE-aE~1FUWa>0UIOl)@>)&etJDoZ=e$@8o!T4YHfcrHg8kb4PWf z$2T)h5#0&**xdgHo`1(su&ghk$Yx{E$dK=+r9eK`UPWJnylJs6{uRDGt6&+|J~sK+ zMKNKD$#(qX`>nioK82d-gZRQNApE*N(Vgd08^7@*|3TZ&X_~9rPjQx@yTst$<2X0? zC0?}kP~I5A9UF}9_ahr*|eo3x{aMW)S*A@{ta&2toWOzKyYP%o0Z+FiKy|9v& zC}|b+^kL#rOe0+8DM|}i+?MD4ETI9>9dmvHHCE3}Wu~}3;a2iPUmL>9lOKD2bTGMd z8mDskX{l;Y6nQnUrN&8AE75$lQcNr~?^k9mC>ypnU|0Zcsq=6<&C=6rh$w53M#^fh z@z~>r3*Ywt9+sXEk3@HIh-Kh%mRFD0ok3;`N=#FDm3m3fJRd{7e8_9ipw(0nH%ap=A0e<(JVL*yr(Os)zc^ODK$lJ0nG zN9+N!F=Kk9CHQfcnXl$k2oZA1h(dLBP5SfoIK(6n=wN;@-PwWB)*fCzTPNOPI{{Qm~k-G`xcoj$=-8w#|hw~9AOm|ZB%)A z!|P2u(7$8wRSHOxSk;X*QbWTBn!|^au+GH4CMgwvWbB|(EGQug@my)-WrQrX9BFhe zAjJ5!gjZ)#uI6m$!j^uCIyQ1RV@GkbkTCY6;1?}3wR1;7UZf7`YP($XQI!7Pr_%A` zRhF8sg^Jebcs^9c7^PdcUL#3W>vU#+2>a-T%k0xIN=dbi-MjNxOIqtTwmbF$I;so@ z>mpc4X|UHg29OOllUW|s3KZcl-D9b~joAaB+jeI_Fj{ujqWt2|TU9ThsJ>i6|6%Ox zd;pVlbPW{$?Kx&su-$`ukqbfJ145E!L!nYcHc|4~S%v|T4{==AyQi}U$TpbZ%7n)^ zk@tHqa8hjt^F6tmM|>TGouBir6VzEJ#20K~A}xPu2Gr^)R6q4c1H@*e;`u5&$sB(G z<4vI_;i_%Sv+N$weX?V)H&;y zdI@Ia_jMTraM$Bjw!ganN8#?~wRc|^MCTVGAQ1&1hTRJ6iF`uc{(o3w<}D+=IU%ci$bJ8B5 zfO1WRDyOHL`RYsNW%uZ>d=e1F_s4K=pDvZHS+-`68Yt#K=0me5Y7^d=v~8J1_kd<& zKB3@hVAo=hdDEHXb$-Ka3cJ$pr+w8;cIa94xR}{Am0Q(%1~WXHx^}WD~FBQHdNJw(4|H`@X8!Cg;9M;43lvjqmb+y}uWQ9MT0w>lF=2Qc#e; z08G zIrq>vo38Z`skfObq-?f^3Gm>uP9#iJ@A~QH;i~P=TThrYhRP3#^f$#d1E~6bU^=^i z^j83T;h$^#|8F|zvrx;>F}gc9GA^?5|0X}g{j3g(wzb=`t{Ag#RX*?D_ue+!l) z3;0T@Lc|f5clmf!Ny_mV@LW+${?$8Ll&$c;TVjLZMh`g^CQFbHDb9yh2 zHzDxBrt%JK*kaPsJ$pQNO+vvjafe4oC^$gx#>giUt~fbT*^F+N_9yM@o0|X$2B1J{=;JOy=&h>waEzhvDd zh`{~Xxq}E$0wyGN7C0%hVaw$pr9MmQ#eQxS2?ur#abZmjibyUJ@8d*NmC0C!Q1E+o zu?R2|@H>CJXD~(5VwE4SO-&HUfy`xe1weiPVdM8noQ7?1O-2V9%m{CrR`a4R@3%v ze@-8T;JyOy<$lF|x*X#<#O7(5Ul5NQ%&78VxlQLxD`@N@3(0U5%9-DCPZB>Ir^ zu7v`^iM$K9`S<6i`tW^7+D5j?ce@aHyAP%ccSffv zRV&^PPF(h}%kNs-V?R3>83%|;6FERI+Z|b`F}b*1vdOKgqMOJ@q=s>C(*X@Bs;iUx z+yPtt)uk}S6-`r0ty!-JxT)*q04bpPi9Z*Gyf4s4v*lgdE-T=vBMJZXf*k1r?1k%Y z*}?T;C-LIM#)tELNlL&$i=W#{i;Dh^kIMmP30#(JtAK8zV`Kf};!vNrNqNN`$%KX? z$M#~+E|(p~xY^t;fBZL*44ByXv_tCy9o*H?!YKqDladl@*cZ7mA&S>?ehxVO`*Q!y zTATv~sp`0ax4+(0qTqa)__K54zSF`Li~!(E2s}yu$r$9~N>-ucal-t39?ZMFf|K)^ z5gqn^wgE(p07uIWmINrU325H3QwH38h_)U3UvL71TV-v3kbdsbeGYtX0~}AIBI#Ui zSCF< z>NEhUc6N6DohunWu#lGLc?YDu?$4Gpkme~TpHP^;W8&WaMDC?_#@(t1?SGcSM#6>q z4e;f7JbN`YwfCh=!_V(xT-*SW**B}EnM@{$YmJ7`EZ0CdvOEv(3d}*z%P!9EfXRzS z<-M(rBIW=(XL7*1IJuZi#<=gWb-W*p;Dx1YfAusE5i$#xmz4?8p-U;Ly@&SqvmBKo zc@M}6?10zwPm-aAcfIE}?Rgv9z*QB4go2wAdwc7AJYW6k?IH6mBrPrN zJ>JBgyK<>DSmP)tC~WI*cX{8G>TWP*K1h8e1ek9ryg*6c;WGWq6EgGV*d+NFk=kIR zz+%#6=Iky?!kNeh$dCL8-Y5EaauAJZ*x1l!xb0%N1+W0M&D)cu;NIR|=)E@}JZt?m zefLQ;;A$-6z8)6@2pn*)w>EDqfbC5X3whX=awh#5(^m?&-9UsynIFK1ht zYmaC=m(fu~fL2nv4`)g*Vl$sVCu%#Z4?n!O(UBzs;Zhw45f9(oe$;cGwKBf1$Yihl(j)Fo0a7#8Jz-D~{`R`K1QIepNj(JqCz(Fb^XQup^i9_jiTCYcY{Qlf8An2^_4V<{ z_3@z4?x?(h1c+w=noagbKnk7XM)2Z6`Vt*w%D#nzo03rJxkKr?m+ta@Apki*C~0U=L=D&fy8{2uaBG)f z?BU6Yu(mdixw-kaiPL{Qjl}Qc98QO*vlZH5FHd*>u0gu0a0Xa9oh`||+^|49&#kaoMn7|SkeUTW0_!vCTbVAEd# zSDpeQbolhN66(KL{^gz2GS2!m6AU@Nv=a9Ea|7e}4_@0#%^K-@uTl(M6JMAwLfqdg0%{hR7@EzW);V5vu>Br&cV4S$9#0 zPwIz4oRQaNXLallq9+Kfmb^HYi8po8;~Q=0n{LRtNNus17|dA*D;2IJUz*Y1!|)0E z06)C$)hzdCcR@@8JRLC}Z?gmyPU8;;u7c#7ZmBQtxiiwp=QCiFKuAh>z5;HN-zazo zr=z_QSa$LiL{p|bX|%MyB2tc%Q&almN53`ILSDs|s`QOOGPHMIlVMj5Uj`@Gi;OWr zI!sE51hks|FFXGgnVHdH$F~!5c_~UUPObSWL`cV`j+p2yIoP&LKLI2+Q>J;hPJD0k zZWe!$SFKfgDiYjJMgO}v|H(db&hT;rR$#x3RzA{aj)t8kf&>9a-VpP;L4`mwT(feD zpY*>n`MF(SvpgA2rS~<*yKh{DK#wup_3^&iP4B(?qbuOQwmb2vk>-aYJY33pe;#_4NX#YaYdL|3XZCi;MM6@DJR#1Z*-VeT3!yC^mHCAvUKzV8YUy z7ut=!_^R=26A@V)9)IQi>NpX$G7@<1dy-1aNSHD>e9Jg9{L1llC(^qY@{oQHYldv5kRcadi)kX(Z?Vg+|^sd4P}ZnHgDC>ci9IRT>PkJoKyUI^^$>@e69 zo7d(?VViH#jTT-0|7Bk~qz7lD;4#jS1Un5~yYIDhgo zj~JtIb)@ia^yc{RFtK_vdr#E9&5Rk*c)1!_{TRYA*}%Z;#1-T{l!VF36p3w$D;xQ3 zPkJCD*Gz&iQ{L8ia*Q&cLBX8qfm@gth>2i0R)JNuSAb<3cH@>bVvH`mAP2!ZXV9gB zBDKWotNs3-G|dKj&UZ;9TxBx2LRwo}!6S{UFE<2Q;sRU!?_P5EOn0IoKe{gEdcJOD zxlBLDF;PQf{|^`7+Ud7uT)EcI1K3mSeFy$U6qWKM^NFSjh=~hVq)EogzfEzP8VF2f zl;Pn1{15oKhC6$ETX?ST_nW;sQD+;KsDNGUTB4qRu)aNJszvuM(FIH67R(>7{MQntuvGo#I5Y zKbzVDMw5rq(!5{w7E%Dj;>7qO-W=h3i*^bP3D;0k-`3CXP`L#wo>wE6rdFub;Ho|{ zO_g^4l~_~{1ow-UqpaSJ1Ayny4tb=*Tjaj=+k1^=t(sov$qc<A;>lcIqiWUNQP)P0I}_ zn>ty!j{7uGDG2c&ysALG;FR0e-t`uS;JycUCg5Cqds$4D>aDPV zXLuhkXJD1xnU_Q$F8py@r*CVg!1m65)ycVVEteZ-#iAFi5sBF?G&Yr$GUc`ZeZ~o0 z9*FmCZ{C{y=ebjxuZEe*G!EXI#~|Xm&%Tf9FaygbkCRwEr2TBpHaX-X&Q1T4vr@*a z>%8CA%n9Q!E~v`Z2a)IF9b1ZmKBK`|+iN-U5}>^hbQOTyB`cfTSj!KR+`^DUt_V8= zRaPXBSNy??KN)mpn6*lXt!Zf8jLx&}SzD62yjFZ-#pgU@laP!e)NF??98qpuBO+1Z zAw8Y1M`7oz_=}Q`o%r5EjrNOgXclsri~AuU_Gx=>*{F-8+jG``Ds$L~I?gJG_N?6)Y_xy`Ai{!Lp zt{y!lZ+SgMcD{xC&h}X~%9K@RwCrMlrp}#Y z)j8B&9_q=GB7JyU^4W#1wGThrdf0t8Cnfs9JFyudcKjH+7aov$)12jP6^R%t;<_Dt zpv-jQ;q|UP3P^rYfW#O>LsPTb?P|AJRRa0_f1v>KaMlX(HOG6;!IhA>>1n$W(DsA> zr*p9eHcV|8LqhxinZhu?+(G`%yYWv18@puasOcDd=$sW(r*^C*&v@-5OP z-Sq=KKBg1Vq=U!*McG>hRzg z?9&o45W+0)bAGqZcGwe!z$1;lgpw>VHP&SmOPW?J3?D-`!Fuvkpr zXVld|h&-(cNh%sbzUFl(eS(cUEz4+6)hJU z$tMNgQZF6MFzY%@j0ky7?`|)qj*yy~T6Xta=h@`eiR~^IQnX_(&tQfn>4QRG=*-* z?YwLi4vt>80GALJi!LT59UTVR&2F8mofglH>Sx_ZSu$(ECFy|a5@`omijOc}0s>h7 zkiLRd^S9!|H~|=^D_x1@#3o62Z+J2HVp(JPh^+j6J{b>0SiyAS^Vh*&42ns4mqr+= za@#w!%rI2eDfY*iE}~c$LE}QQg=h^%Mf;&ktrC?(^RZ&4a60llQ%;5-kF?hD9|DY1 z)aaQR!%$LVK5AsNiK>msll#v*$Eo>mU^EcLc}caik1G;O+6MHEYj)586DU1Jh5l0yka&jQUs(Jj{^VynC+SUKcY2V@n8SI2k>sJH~R1>>Bo*$O5cys+XG&zPF zS~*WjN-&vKvz^$oeJ!NlW{tg?{|$+(iMOa4mo0hl#%Ra>0x;T()&q1OZumM$I&O*C z*Rv2dl0dmMGte!^i2n25kCF7bo{Fs$9vQvgnfYf8TuA!Raa0^0%7Gvs1>SmOtGU`_{R&kcS~u zLkq{oju&ofxazFw{j7O2**ir_uW|doe>6ch4Bx2 zSn#4UZ2SpY!E^8PL`rq8VeWSy;&Nzq5^Tn!d|2yW^pm~5=8v;Yz=6E-@Rmon$0je` z$8-2|z7z9kg($^@iGw;4q2P0B>Ilf)HqK9ZVfydw?^8v+BK|Vk2j%{+jCLEz<|&n; zY943%j|akH5vm_>_LaVkePb!oUNLc1CvK+Pt04U%HoWAf=)DHeNm@PKKtJ-W{+r!C z4Y1oivlS|h9_K_!NHSu^YS@XiF?*!~7BX2qmK|>|**zWuCzq$odz8$l>tUu#fBk>b z+Xn~!(c359=AZYApW@%Tu_mP$R5=XT>)t@HIy=bRIUCZv=aOD>29 z9(g=avO0;RG704&Aw$4hQqlN54atx$jn=SbdDE$#;z}whM@{h*l8O>>>(H$$cYh{Q zh>u@rrhjXFb%@b2HFt&;G`FCr=qLY}5}Pk~Q_kCY>!2uCaW{a7=UO$H=+!C#l2{fJV;HFNusdG6$y}QuN z*TpfWK2ybZF>E&97a-DYVg%~5Fv2x2`|FnohZ{ILu)Dqd1OE1?%`wTPQp?2Hrz$`8 zNI^bJlY2YFWol=A4aaJ!>LPbdWxao5LHab^vXl(j(k5nmBc%0y)%KFJDz(_XXMFU+ z!y?V1Zxn48IQue0h~nKld6DAcn@5cc1cZ(L38v_NK#U@yUAB4W^PbjPf_NRKc~-pO zlMYqQb_qIX#UC?zd1{B3%s<7|BGgS7MfxVRXeHaxg`p0LkWD4xMOYYY;fhDnfoZWJ*+uE`Pxo_5un+8W1tuWukj9GH{gS zQHFGd=_;Frykd0gybL?A#LkJ@SzRm?*eGZph8rPzxyq3u*YZ+T90Hj8oO60lUP-NL z$_Gd&!gIzQddZ&ElEcC;zRVq^(_TZv0<`w80IeP7UL>z0LdACY*-TP@gY=rT24^;x zLT9m~%qmy0wLDag5j!l|cox&bdJVmZA=*jv{(3R*cwwjG6;Q>weXY6WwY9=mS-q9< z3V=hH;KwMSu(9eFGiR$)y|lEVtZP6?VYhQuSoD@(){x^`UXbl@4m~ErJsLL-t4ZPY zZB5~yg6arCd9JlTrr#3tH%pc}GbV4Sl*%kC6jtBE!Ku=i3=TJ?HOdoN8uKtYnbjdf zCPMZZyEVWzJIUa1F+SmNI7#CWe8%_92XVA>S7_@KWy?2*1g*jV{^3n9NJzsNeUFIrqG|_-zk{-E^--iXZ#s89aP<9^Oi#wb zhvl$fPvRXAgv3@FQHKT14rtv(RbQBlOjS%RV?HEr47@9%)A54OCMy>=N>!EgWZ@eO z6oXb-3;J}54Whr9N$+lQkmqQzER+u{=6Q|elWDv)l>r}0ugqz0L0>{g6K+=!)Of6@ zOp14 z)EW<@v$;XOF!7Y=%@D$Zi>u(B%i8{?=~r~Tmg+OdbSAy0C&8$n9mzB9vxFb|U53%} z$QM5Cm_%&Qewxx>{si~oH5;MAsSSLqtgo-&TcA{nt@e_7xkkcOt+~^KV!*99X6ckp z+2L~|-Qs{W%et9+Q_lk?vB@VNUk--LcTSTZxF4Ib<2SS_J7&We2c^PJCZK|rD?O*} z6zkwO7W%StcSC-LA#mLiuY7%OyIayO3UFrs>9B8xBFeAu`#Y#%fKD+jF8pv~tWx+@ z_)l)4Z6IMQhi~{aJT6a;hj1H)k_b;SVtRk)G~d_zB3isEi-{&WYil$CWC#JWZ>wjL z=p8yIpb+$N1CybP*+VzQqPyKjg^&%FJZ`@iTkRJ^n%GMN)32v1pXVT-qns5rq_Y-` zIvu#BTt2!4q<2NOg(n<0Y|fF{d^Psd_5BQC!FtlOZqRRg_e*-~wu3qqe@|+nOzg<& zDve%+;#B5p@q7A5QUXKFatw<_)r>pD4;xFRK8=`Oq%{+|em^BP4uZti&PH%UtueN9 znhXq%mf>s|2vqCfn)|G|TPUX{cTw);>8jELpG`ps1Z&DaBp5<5LIri&d7icoG1q*s zQyR)5#y*Zx-Uj*b$laKZWEV{vJZ|=HIZuhH7gvt* z!7x>GRsmWD{B`y3UT(LHNS$si5kc$Kb8+tjx%!bh#qKT)TOC?y18PecJ47aKxP6!^ z`n3-GZsGggQ>r5R$pbOs1HE8!2JLv2J>eYPd8nzWqdl*tZsfOQZcs%-I?Cu@YO7sM z&=7gt7+2JgB5rg~i{)FlQ?|H2p&l>%c*#Y`CTsUpnIe|W`tGv6$xTRgqEA0l)as_r z8s4DW`RA^3vzv9@|DeH(n%WK;bSbV^QS~RUJF20lb>w862INCcFg_q`$!Qjpbx9T4 z2t}10b9mO2;?ND;qTk=X+HH+a${u#JyJ|;zXCN6f<{xp36IzFR6r%Om+F+Jyd3^%i zr_8lQx5!~C*G*G5; zmW?T>zd!YNpKUA^nhw=xv5%AmOfYPm_DZHC&7vtp;|x6R+!Sru?E!WEq})oCFSd@P zElg%w-JF;UBdY<(wM5CkbR}F#>hF$^WJ$7<5{Gy7(n!RWloZLB8<@nj%>~2hO64l_ z0~2^3Xu1m3PP*vB*e4_URc6JX)r2lLQisfm7r zrk*LpyC$<%pp;-p1_NY1@*=u}GpB^h$(^`5a@WuXIqE1|Yy}9!Wt$Kf38zTOO!P{-Yoa&OL8GUSl}Qg_qNlj zJPNEjk@OH}aoit7R?JIwF5z#1d-WT*EW^iR8}JErym-g-sEVY2K7$+;pAEm`<~vjf zt;;V3)Oy+4l^RMQ*C0aD5kZGeu?CQOt|LaR48niz&y0C)7StYWty=EXl%{lOdWbVs zh(1^0Bnio858xD=M3kX&v>>CiOK&BdD04I>oorpP-zrHoReR5BTJu@rmMG;nz14%7 zDq^IfOzY7#9pmNc{v9LY3qfW#Qj<@a&%6?b$0y= zM>`8FgZt|Me3E5VEW%z>e@t$a0@|HIf(y%o*Kd&o4PDB~k!EWQ1lv_cLQw zyM=x#z5=_JNo^Pl2xJ+21shY{(ZXE3VxCQMN*-&dek%^aR+$GSNvCH8&j4IoZZ;u`yt8KfbeV zf=de6KKs05FN$b`x=V~Kx=MWAs5Nq&)HIJ`F5^yMu4dc4`oM3XE#@?P1W}_un{N48 z_+-7i`iLM@6`|(7qy+D8P8YI^Ut+jOrrT5?2vThEG~{hBpnZQ52L%yfl zTe{j|GpKf8>Z@YR=~=Sp+j^XE9jW@ulc;F+vUNV9eB z)jh(FMsXPp+`vy?aTqZnwuN<PdCH^7pcn6&uofg$9`MCTsGx3Jh|4zPt`m4x^#Z+B0L!6W2mSCYQe(^ z)T`QOaCSNQ;7#TG-Sa8#*fdiK4nt-}E&HnD1x8ES29t-p5c4N?vYxQnhmEEcPWb*>{<-i>Uu1Y1fm5OIK@TG^o=$*lg!k4q_OX8}Jo>=IQ+P$WG zTiUn;RKG*3rP$Ub33-mSOG_6o$$+w;LR zv2H6gIKMAk7M;1xSCCldw`JqC?7$=UfcfL4E1n_!DJ(_?m0pa;q`=CpPLOwe`82g* zz$U{te@{9>GwW7?-j1w1Rc5RztZE? z{zjAtdhc0xegO3f&-SFF61}w#I-DF|4?eP&`b&QVIh&4|euO6dV(s z5QXb`FJ_g=I6?05g`f71GZh+nq>{`+(^1_?z}1m{R|Arfm31xu8fyLavD=2PAWVmPIBWe= zyixLjgSs1~A@5wIFI7n|8{5wYt_l}pqx8Xg$~5S1a6zmTyWHg7<(nr1Qmp79Q&&UF zi?nXF{KNEgPJwcyyvTW(^&n{d=AYey$kV#D1?Zq*7yh^!yjzy#X@{vl@7kL^(Us{K zKsI142ZYChmmy4r;y9lnnZwg->K5eWeNp!vt{hd^&69jA-xbi*$f~-+lI}P8Vlyu- zhvFC0Zf$K5Q8FN@k;hd^f2#LD<{2%h%qfN7kXJk5ejT2%`QOS&)9 z_SRzxsR(k|!-m;SH>Xqq{!AEXlvq$T@U8tlr(t3=qzTTbjX*bT+Qq%UZ$Hp z8wUE$8r@x1YxLai$HuuBvLo0K=67w~BH4KK$}d|~AIi!RGkkehbo{&R1a43K9%I08 zImVtrHM|1v5jJ*(auP+N<~aO1y>o7JchdA$?4g&$7eS5TSsx5a-`y!0Hiu_ra`1cp z5mD*X>3P9Tc9SQ^4eumk%x{D~uu5#23CC9W6lty8JPK(2;!1LH3kw>Jt^~f*q~iy% z{(CQ0KlY&V)p&{`vX~t^<^~4jgahN}XKB_2Ir0m?@+dcX_JnRty3-1_z}trTLp7-a zh16+9VykIZ@ikO~l6j^XN0~?U{J@ki2V`!UMi?rJ<}PiX2sDUP!y z#ct!Z-b{mzLn?o&80lC_nd3gBvQo78c$Nw?;XQ_WUTYg1lb zV@Yfl$$dc-_$*@M3ay_EF?)Z3X_U19)Bp1Le1X=K>C<)p{$K^{W1*j&%qeW8^D!(f zL$e+1RQSfW$>Fc=)D#3He{hwjU7O>9_WXBP?vRfu?=~-y#7zjtMODDXBQ>&GoS)D} zbw87(anDm&m&C>!o=CZ_5w#i^RBcYSA-2+gE!*8(N)@&LE&_Mn+P07PQ1Cf|6zk6G z!fKWAM?}Pr6!6b^5B}Wc=?TJ5b<(je{zh5!#u<{(>kU_p*L5g#yNlz__k19`X54??Y}g#Ubcdfifu9$=5vNOM zI@l&8l$J`AtZ$n!Hzug#5h{V~Fx3&0W~r$!ID45b$(n}oZ&xBoq$t6yqEkx~Z?=}C z_S;IJ+!xfA={)D!D%T8)gABMcjV8rc4!e8QzWE|o1lefO@buy0wbhwiE&uJNiI;va zJrTB^weFvWOknTs==jlK(1Xg?QL+o4VNM7?C$G1{Lr1{MNX+%fN6Za8P{PKI?Q1Nb-HjQ)!brAKT_5$jnSKX9UYqGEG%UWhX_4DkL z%u{6C&>g!EQt^RxPq`B>3*iEiV&eI)rSn5($RG{5*6YT*Rqxi1)N!x~d|psq(N6_K z577C6qqpg-9|^%myx@O*w6^giV(f^x~xf zWmh-uhkb&k)2zU$^PzAAr9?0Aq1vygPgg_ml<*SxCp&0dKjTz_xlUeabI+2xO~&=jTPgIDjTv8tm?S@;W>QlD@N z2Ma*CWyPb8Azi}Fg{&0+X%1BVNU7l`abjE=A~B}(2`No{FHH*F+(XVvCiR`wXdM;9 z`n9#N%ppt_gN;rxJ_1%mHQm0c$IEx)N$dL1-h(AMK&C(ELwT-zX^N_Eb$g5>P&#pe zZc;2>XiDhTDlozyJQRC4VzW6pSi9X#IcQ;Yri^=)Kegr<-C3V#RifSYl^wJ!@x+*eW6E8--qT5;u=*81L-Ev*`W(rtSJ2iuX_GBDe-;oH6r@ouv9FLF(j+-X- z(iPmgXe2JKbXxj}!@;^H{?^QaFWA$SPKaspHqt{^mzt^DODf9o!@fexRdTBQHlsWm zSS;EkdXMviLRlvdj!@2obP#OOKyX^vbs8Za?wm>q)qC{66an7OI z#sqIdE$GQj&s8!xbf5BwKeF%0T#zeKE62o-+pJTp8rfv7Nl@>urMa|qjj~1|-|Rz1 zJ8RFy%0)qV5lfXJSRkakF`M z1+7H;JFg)@L`-p?AR^-!au28xD9Ar{oQWQ&8cQ~@T%GO) zrg(1Ol4!P?5X0%{Mz8=Vk!m)2Eu*C_H8n|^gtz7{nR+xXcDQ|MQ%g#c`PY665)oDT z`tlGNW>SpkZZw|0B`fB@;iUzJW^g?}ig}rD93Rrec5)=SU%bun>-ihImGwRk;KSIZ z#wfu-Ezzg`pw9ElQdkPk(kNHb8TbX_T6)hl9X2M00C)TTcba{WlEUZ*L9=x0CP8%8 zf%n_ZER36DTnOSVs1DRC>s3dEp92t@3Oa=MkuRHgid?wSoH&m~IQU{nOrIK`6c45s ziCqG5TJT4+o~j=2srzso{NHxo?q#N$~8NgQNS zJ7DP_RLT*?#EX0RJ7f$!Z&pKV6@(=5MQtbirL}Uz1Cfx z4}0}U%id~&gqX@18nT7_J~$-g_jOWCAiE!~K=5H$kVVWv-5T7y zBxc&s4C=U}WnlcGT(0)L$4_{QLqrzA>bRrJm~~xwe}1QQI>5g^9dn*P4}5>L-Q~IcGsfkzd41?OVfKZpiI{S7Kl-!Z!+E^1E~f@L z%p8-i*x;aYy zLOLOC^1UF$Pw0+r#L4IiiGHDYM>I(XuYuiGSAC8Mjgrq;?5XWRoHIAk^=*bDYReLJ z*4cyFkv7Xe8gs5Pw<1#eJIkgDx}fKizz1NUT@c+3_{Q*6xxhQCtBzwK{d^_^=bKm8 z&xfndKV|Ao(|-bGYBpGZ*rf>0gKAq(qUbb?v1<78O$L-<+NGa8*b+h^>JAFjwc??p za9&*|;`=hJT}6PaEYd-U)qVSNl4+P`Zu_-BvL&sPY-R0g0B%ibt$`zTZutqioXe2` zK%!RaOx4n@J<0pBee~Akt^=o5f*I2X)o&(QwL#A>6#;{parEYsYE1K@eI{L-KhHy75s7izu` zR@j?>x~>Lp$ZUG$$B#BbxP%J&bnP})s;pESHex>EbF}l0Z-&3z?RN=?5!UL7Tjcgd znLqn;M$A#R`+aXT!F*ZQz6yWmQ>*#%Jhyz3czn=Ga&E|(KSIf$7DHKasE_~6Vo8N{ zIk$rMA(`;kZzoR2mWm}+l@!K{zd9;2=k7}P%^gx zga@fMr+Ao(-xv^==f3;>9AjW5Ua4+hE*eJC(_v;Je2L|K<@huB9j^L<)N94W@deN*vqO}dqW)teNiBX zIblQXH*1bLU+=Rfz2Y|PQMp{A=c3b--dmiRAk1fdoqY&)YfNK%+Pt7Hl|mZJ7j7Uz zuRkru1)m0z>!GU-b}a7RwH`yTSyP8vdF{6wuT99iCAW3N1_~ik+?}&N_vH}BKJcSR zrGhb6QWkqX?RzT8t9p)Fwc=?dTa2N7630Eb6+_4NkIMH&b*EnB^4d>dD9XlPaWh&# zCo6c9d?D?HM?p&jo%vdM%x(2C_KB~0I-S0@t z6SigZ_C;;IU|Vy+jtX$mjwMtwt`L!%WUqUBb~=(jc{Db_&6T(3qEs_Y-$ZL#P>=N2 zH&|jUrwb9S|bo{btQCV>VrujRZN*>cZA7H+ zRsi4dLQe9BG3we@%)zt65SjoplK)a+QBVj%IxL;1c@O&)zdoWFMKy6%Surk<~5R;YTe!7qkBjo8u3-Gu`s9jnCvMiN~@Ot{@8O z780~p8u*a~tPt7!Nu|mP+!0H%xCckI?Cel8wYtt<#c_p>A}y3+tNRs%8U~6)sAcI& zpHN;{0tc=GF{oz5%-)li$yGqm+YQcRYF~X`Vb$7P(xp<5rGknHaMDok3bVJzE(tH9 zm&R?vEXL6wQ)Agk7o98jx)}hz5D=4uZINBBmSbYv!j<;`z02GAyjeRFG+u^237wOJ zBm&k3fwwc@Ek-eFQhh82R&6dtH2|V^iY}_}cN)1fH7J*Md#@~2Cp<=DWfh60Ry&Ox z@r%{%w=3$58C9?VaF`)C)DaAuamJ~Qy4)*C>dX}Sjcbzg8|I|*+{us)w~Mo)n=y_& z(TK|Qy?|_NJ$4$Y980=ru=D_NS}$nWkuweY)Dj>rQ@~)dxb+mgs|gVFHqVt7C)xeV z$R8~y(fi>6kJZ?`)FjZI^bligh^XWn9yLquT~m}j^=|pP2<-!>W|Y#99CKS-5vFf< zx2InzBL!HxW`RAGa(i2bQmxt=*`ctx~y z`1T81=H)4|vV((%f_l}D{U%5a;8IuMxw7h1#fbx@%*9^w03TJdo=5vP+TKqx!~A1m z5SSA0Tg6bnJJ+J*zB}TomZx0D$<8RJ%p7H`zsG4hsZ!eK+?mWbU8F#1%)}7o^3a&h zu7AH+igt;cE4RKhBu1=zS)z~#T-vxaLeoRZ3oa$Ff|LlT<_xSSO>&@ekY=&8F|LaC z;3bI!fhay+I6P_iPoT9Fi*acW{+tIZ)<+!AocbQAO(SgY%F?VF1j;6#v6~7^zmN%s zTtD+a6Ej}i)B~uxS^q?t?<`U2K6LaXK?_FMAb9mZC=gMcuFS4ge?>IIYYx7Q*5!#i41~^Y} zvdz<^lTNwA!ef?}z4RN$g7Xk?z zTY%gz1FZ={Gf-V`xc>Yw^0b;0$Zj5X+t9#f)9CS-9mgrlb9H=G_9xS!7#?REJ|?2g zuWWKITxJ9!))GTZz3m~g<(Y%6=}$9FRN@v#c9g5Ta&QiCvay-JLg#G6=&0je-bFGn zbUS^3W0m=$s_SfRsa2HM9LDfX@j!t(1)XL}@$k)3mM6K@I~Zli8A&7ubQd(J;ZqiZ z+N=3uk@HxVjh_18_Hg-gh1CuQ6`%Foa%*@g^fIqeEWI{3Ra5g6xPC6J){3btONdiD z#fZ{-uRs_pYQAn2h}mC|SWZrDAVEaY1KqqBguiB2ET!FaNwFn8WiQTZl}kf5uZQxygPO{iNRTh+#7UrjH7C7Mw_+ ze5HA=KOC6kH1|}lvw=o|OMkM=4{OQ$^U)0cW;stiU6;xE-9XcNep8Iu+?oD@8)>ta zjDZ14UHgxk+$EqI%SseMk70>O3f-`f-8f`*dZgRQQ_!8BPD>a>tHvg^Pc zmN=cMhcDOpUOvsA3*~z!MwL$v6LCBg3-Y|8kv@G!kW;AAcn)RSV=T<}mvuc$RwE-v z#v(7+%{GjgpR6Pt?cPSHPFD+_mw518BtSig9ViF+?wmaiz;lDpSO^Oc&@J{>uHxWcw3g@rJ>%Eh$Z`k^tbRLh- zDG8_e_}_!Z)dn^lF#3>oFCxN8e#Qm)D(+16Ap6fVq%B~^j-}yZkEa@o1O~6srsFy_m^aPP7 zueO~Rm4E??E+zm3}OdKrw>A$(QkYwPPnI~-3@dRF*5Vc%@}pAo8p z-zwDqHMsC_G~raA!8F=sq|fWE&v-5Lzj9j-iS8gLcLuD9<<4 zC-)Sfj!qQ_z0i4y-`z%wU%4~WF$mD2`U%WvFGgj#oeT#d_dEsR5de0e zOLr-&T(0n2H5F+n!@b7gDpfAIn*6n5C1?@^V^j%#>BvyeJ#fm+#ofuDpGOYun;1)un-@+Ld_Nx4@!{b3)!*Q-ruX!TZ+i3Y z{_@+&c%|3o2SWq!`q;RQw9<<2%~}vq()K_$d`Y@WShL|gTJ1V*fIeii?5R%QJ==jw zijD*v!0GQ)SM7gi;8q%G<))zDwOwo?OJ>2A&kLEJDl^HloXa&X^SiY*wTm3E=t%alaVD)aa3(+aW zNx)L(zxyv6lkLuTyVf*d&VK;=Qz7qTWYvWhjakb)ZI1#WkPH2vM*Z4B)lzKvdbjIZ&`$q)#D&Q8BG0&mujg zs*Ju;JS=D&(NOubuj&toAlq!A04I+O1=P~U7IwHelSd|M44|a$nDsWoh)4DOk$*rH z;JU~X;MX`a+Qx;WwRpe-oB6K(zp?OtchtWD3avl+6%pxQC<-8lVZ6aq{)LZf?b{mt z^X;DOfVp+zcoyn7>S+?>o@oCQ9-x(eIdFbZjb8D7JT|qm8m+~WhzGP=-uYaz`S=|j zSw20lz48DuA53(p0?0K&M99C^UXItgPH#7H*X}+59Q$O+Fd^g~RKZ>>Ivr``o)r}M z4^>`|&hYT?nJq22fNH=%ttc>8CQ?$;g<3PTH?sM>wg-aw7akjOX#EoaP7D0&Cr|`l z=Nsi5kX5jEhSm@Hb?W3je(CX=6+|%f21B4_{OhV?g%uS+lcqgQ4!g4I>d9tyz)}j{ z@r<87=jT&o!2z@0fqk2NBAT|_HahpiUQS_IS#JbB7ZV+#05bNswMR`TTdiMCK-%ij zPRswZ955BgV|y?)&7P2MQT~jWr_JX#I!N_Yk(6`OTfd z-(U$sOZO)(9btfsK*&2tC`7!0w`q+yB&VbZ6ZzGcjBfyfIQIFyK<0}QkibU+yq%Ma zOSpf#;`O0o5ZDMv$Q#SCu&|Ju4XzJn7n+?c{>@PUsJ;4%;&N}GMh^6G(Rd~ffq1{> z7{mCAhVwnGBQ?IhJoXBr5j2H^oXLQOP;a3cg|X`M>hZdEtFc)=iZ*LL?&=L}Uo>()%Hm%DE4)6fUzY&am zKEgbnSyTkGJC-JBW@h%+2q?e)bv83UZ=#L|BpLR%Cug*}Q&1%cFDoxcDG7LzQBzf7{U~7-7w?bF-2)L|< ze|shR+pAHkG$pImlE2g8+$3VhpH z@`b1@k9?lzeL}=~fmpKo=R21zYtPdDZM!H$K6l-Op{CYA)EE7AC{gV8&$@1I9DzYW z=YSZ}w^RT@y8}^f(Kxo=9CS!j9tL=ce85}J@;iXu4w~S?($bPCx+Bo)W4S})$vS87 zAqkLs75~~R)^$Aq^XzI`=C7bgz2#!`TNtYP+Wzi#LY^1aq!8%Q49LB1G(af!XWyf%ucbn+vZ?BI*+2^>5Y z0K)C6+b;f_NYGsmC2!Q!7LH-%^w6r5{o`=i`L?lW%Cj$dg z0=-tY?JO{a|KF#Iczrp2?MrCCB4@`#Y<)N=d5cCyhV|xc;eX%n^8`Y(egtTQaZ4l6n$o}N6Pfa!NMEHF{U!wRAZ<~KSw9fN^%3FAzoi1CqATYFDp#p+nyw^oC zMzTzRw=Zt0bUdKjJ2=?AKHtKbPzo6tk!u6K4=*kPY#suDwQ1isD%9xr!k)9?oLu<_ zHUN%KE0Vo-B-EXj85MVBs;t7>75FH-q_dt-C!CA7_v}Fwh9S zW`W)BJ||5kD%bbGA^WXq+;+wMf3N_;($$oS+}ziIa+*INi1i1EYtpwJLl|=2OtZlb zzuyUe-Yq1vfg7Ug4ggz1R0WG+lkkghYwPNIa~00Od{v(& zaDhkd>4BnIXtX1x*J_5SS(F?DTuB19{Ic<6lk?|c7xKr}Z$ub;Kw9e|py~3y?x(Zvn)J6bQ`Kic5^UUm znbOJC`E)gnRSyWi;NIRahIaNtH_wZh3^ENNAU-8=lmF*Q>MdIW4S^p9-CGj>clfIM z|9@DE@7+GT12HlkjMjcM>p#8jI=nVfhX;BlK{qxGd%^<5CMG66_sJ_idcz~Z>(R20 z(wYb%dw1w86#X!i0dgu>Sl2rCzM05&1XH1X{AT)&jPv5F4o_-hk2R4?0a{}gNWfUZ;~0N{2a0s(Tj z&Gv*6&oxjkTMnTy^Py+03df1FoIzB=u(!AOPaBH1jCD#R7z1{ySJjV*GMxuZPi~8J z8;{|OYSZj~nBCo*arc%?OWon3h%81>dU4+UVaLZ7B6j=QEQ?Nsg%g7zHxw&xIJjgD zxi{SA$HXK$obG);4Lj{+XhMU^8Phx#npJPMCh#o!e+W4i`-sGdYY7o*R`VvqoFy7b zTZs!M6*g)zT&4PhRhTpupclzXD!lZg>@N%6r#ohZYs+Vlr4Ms)EaEI29P>84E-Q#E z2dGxpn@ZgRnM?3UE#H_;=zr~2@~_T@7PQZ^6;z`FOBusVsS4k25xS@&m<*OD?D=;MC*FujJiCEs-s?nU)SOc+;gUJJ=O=cL>X`zjp> zw)>tVc5ZJ5K)UPCHKp4S+SRaucZ}6;!5Qf0+C2tg6E@W9iDlX=on>kk_@c7%UOE1& zB`uks&Y(dtL>?N1U#EZd_J2TH+2GI4+-};Dol9xZNzF%b>fA;%!+g9ycycm!ZUO)M z(M_|MRaLd+AYsV0C1cI!8)c4seL+`m%a1^?Qj8)-Vq)S_XAKPs>gf?* z*jHC>?wJV%UPTNp*Vu0{c1+z=4}G`_r#_hD@~_`fk4-47Z0HP4pF`7MYi;E&bY{_I z7pI9ts12#=_SBG$hjlwdlvZ2%V@ng-K!CZn9GUPH$n!})#~>LEX6oTacq`MA-^6_s zyDQfXu9D)LkA;eHdokso*k?jfm8g!XK75_u2X-@nRxCE37#9~nJByflj4h^BX^BAJ zlu|`O&*78Dtq3+uVg_zPLw*ma^EjTyRsc|5eZ~#^=3sF#hFvk|!phGwdw-_q*3X=+ z`FfrP@D?$QiiTvD=L#I3{ICwp1dl`P2VaisW^NGHPNhq*9JpX& zbfh&5Q#2|d7GZz_fTsFT)fcdKyJ@{t+UY^nXk`Ew{!*1t`uJzXD%F4!fa3{7NN|#NkbIB1edHXiZ?UTTo(p7y%zgvsr${>@a`&1A{ z4Gg;HH~UAs)Th;N1A`14I01*w>+?!<7YlkB;Mdcxc@^|84hy4SHd^ZQ!KD+>d`_M* zx$6&!l1nuMwHB@)l-zbDRL+0)ey2X))Vd=ZF4V4pO5piDBwOPGd>4BdC3UG57R1XA z5!4T5(tv^^c7M92_@m|%6yAV{fWS@T%zqaRZIe&ie9(M+jvsV~=7D5YwQz=*D!eM? zvZ>`KJQ8qzo$`z84`@g_6iR7zb-K%&<+ri#bU(7~GFh8-@1PcrrNth~ZsWtDc4{dX zLqv;44f+X`#)P~MaeW$XN$0nVGdiAnD$Ew0v&@bh^{0*cfo;3)*=8MhbX@nQ4^W3o zdV7xR7e;{s4qr;0JkBlWO{bV|yiP4#v)jNB#qx(o5O~>tz37=*;8-gD)bNbJKke}k z9ERbGyu1V3U|6IA4#41M4z7LfFKjn#0`fy5rYaX>?)3G1xnU(1Qfw$`fYIjW=Wk1kA8d2-U-xKNQQVeoBQUx44jrDgbDn?tVULXN$iHk4z|!w+`8=IF?#ec zNG=r-f}%2?Oze0>xTT1v!K-m8U?Hfm0?sGAvs%I_YxU_RZWzPL#5Ekx%kTcq+<&7xUd1_M;WpILNWHpK zFpgogyQ4oF8n@x`QYTC`M8_`|WvTWud|7_y(G42~9?D18vEOk0L@~Jd)W~#}es#Nc zW=!aVr1%Zo$3_thH+N8EyS$4h+x2Kc>9Xx?nd0;va_u$*7%w3`o_6G|w;q}qm-8x)Q!Gxy>$cy;{P5{7(&%d0k=NBm zO?!rq_St>5_xPr}20>qNt2htH2ORsQf+8P3NADyMN($WmafY6kwD(uW7)pI`(!A)Bg%Q3BfCzg3~aiJe=Lpz8JF9~UsF|uh%VN|>m2zJ zOF49EP-kqk^XL)2#E`>6b>8J)y^gpmehZ3x0vtKr^Cp-#qQ2WzAISAQx$4hP7xJS( z#~l{g{E?meX#*nxj`Ojmx4MnOD6}Rz5&tP@saC|k%y;vLmJR#)D9$fSYf=X?T&Bc` z)P;38JRZHuf-l@MY5j8DP#msSP}8Ql@N$o1$d6k_Gd}1g5^@SX!QeBD-s|0F-fMr( z8hOZR5q1`M5eu)Qb&i^XkAIoSATMA%yQDSzc$G=_cyBA(%owVca@sSuJq+aaRhJ-S zeMRQ((;7ZWkZ!Pqf$Je&2cJy6*E*`DCQKu3Z-?%2*p&C^ZQ8}5l0yzaIafMIUvX{z zW0n0f|5&6mJ62CB2p(R#bw_eba~^97O^uK8S%2BS5OZnibiggH?CES?qmGn z2lUJtnUK;Irtv(^wK@M&ksQWrnKp>?xH5>zil8{*Lnb zsaO);60%1o1Sjw!l17$g<9k(i|6(`uCS-;KPdQECA$uWmq{z0rc5NPG07)v#Db#rK z1v_5FN!30w52ezi8uLtc6~#|#sH$z_5x9Vp+|*`ownD~VY(`15&sMXYE=@LKxTl4dR^HuGt-jh59>VSo zn*Yb4ndjxZrp+${V{B_OOZj++1hQfq(5dYPt2tw3h2o7aoO!60eofAn-@Cv4LPQmG=*h5-+nFNmgKUu|kn4)oEU`{o|z?>HrjRMr?qu%ES z7|pmkiozar`AfkgNT|cHJ}!*6QcKX0^YsRme~j}TcOk(I0fe(32ai3ylauk&=@uHG z@2!n7%0zZs>E9}>V|%kQr?dw8?>00Fe@9=cO0lX)vckm;TC~J~0d>K+%Rih-;Y-XA z$ly_ykAMWf-s0>zOwOwnDE)=!kMue?d15~rrw^2TgCOv>p+{ESTsXa48a`Q{3Q#U~ z3~7~9zC9b5G1g*h*Wt}G)ymBuRf+J;%jW`Sz#8+@^xXKbv~%*vTC68^&H-n=>*SeX zwXAx&7gfwaKB6cU`=IbORCN=pT#~f4UwhePt|ldFl8wY$bN?Q@=#oHN@|4^WJO5?Z zqK&`-ml%bdJhLV_iRbH6s7*YoADsEZR4bD1)O0(pZ`A%78m9hP!3F0l7hx5nZ{eu* z@P(z?cM>3fBn+{XQI2dUj^m^2mpeXw5P0J~m&kXFy!;2rqC>-FiYC%Dp~4vyb?Vn= z4B3PkQ|-9BV-Uw)xH>lwDhfzN=#P#*EytXg6(Xp5d#U>wl!;Z{sh5z{iU^3qyyp=& z&kl{Hli1qR%0ENDUS9|=V8lo)cK;;!o#ywc!8(Y|qOKC56aEdA&lyaGE=|Gz_W)yp z-_ga?i1zn>+~lotBWnY3`KvnsR6-`C%bPlCXylG2}QPpj^l|i0?DoWS7gsn9jr|GhRzDH4UYWPZrXhHkt;}C993IfU=}~~R+kbA~ApXA?{eN!d|8G7d!F}uUQ@g~&By<#hFH~>RL?RO#)5nY5 z*8Z;{C_6hxtii|X{`Wo1#Wrb#x?6?iN%6rIZHbaq;l2TA|!=KoRjXg3N z@kW%j@$f8hGGXQ9h5Oc_jFFFIQJHtC#d>>SQ{|r-Q&21Nk#eftF7`hjTz(Rr)bK>- z9#Nv8>45D_%ZWeYR*Y0;FYmz`zZuAjx~tF8iVtk-*;DIi`=VarP9^1uH8ir-^=-T<~UF@IueMjOuA^VJZFLpwRJr$;e~-qlf} zMe)#O7}{;x2526~jvpe`sp7Dhg6jB;B2Ehv81Eo!EF_0M+zBXk-_EkB}+ zuH4cnBfxJdiOvSY;;p!``9NV2{i@mrARnVTX!V(%f-^h5=JuB-2koX=jOs*%jnO_P z@ro&MGwA`en~+LN@rB$H*E>29y+KLq>Skn+aNeDwA~u`Her@l-Ko zU{38vpWnbPC(G&N25J!P+kw(;WTjm_lH|z?Pi`=z3PTqO%d;KFjnc7?8bm&rR78*F zSLX+Qx4hY6DykMfcKGj~1gSpoc6le}tpKgX0KI76jOIon7QanfeZZN?N#P_RAFyVZ zJ|%H`=)j)m6v^jcUM=g~7>404A#-wjiioY5VuRoN3ipsSaiEWvX-fy4PQ=&GA+t7Q zm%HuKtWI$33UH!pFXlhKaZ$q+TfNumL zFS-Qn+DSvaT`55;`l)r2i2B9-gK= z_j)n{2xmXfGq1FOX?mF+MhmfW?vhk_M&rFG0uA4UC%9 z#}A2A%*eKoxequv{hleZdd*xRs))~|>83r|NYFbd$dOsuZRjeiA;vrGLBSEw{yq;o z1JR*%55j?RO!y~UZ2Qs-FJ=E&E>v_~=imT!)$HI3Q5vA;7p7KM!y2Eo<-qY(wY5Ne zAQ{9;_bqk)VP`15BrxeZ>4KymJs2BW1R5^L6?uDp(ArIZV|j>fiG8P*>n;D&!WH-# zlE~kN=U>m=OC4ZZIlE1ntMhiHe;sZ*Yct*Vw-iF07{U@W_grgXOnRa8y>Bu*>xrMS zkKSgfX7v zlusX!PZJ$P6*zYFWByn2`u{C9k8#%jZz~v?%xyhNM`^#5ci1{|ls7)2YPlZje1aX< zdw0*;OVt%5V$c3->S_ero-M`|`jwP@xInzmzP+K0E2_D4I}u5%pb=0}L3XH7;_zrd zd8_72Th5N1aj217qKN|EMj>XEH)HORQdxQIvZTnKeKFKVKmbQ8JD_V5e@4&Hu&=F% z++cZucmn-tR)+mOtCefv)s4v~Q>|)bx#TKnE33Y^US17SVT{P$!ylX|B}=@h6jMzd z9Eg`Id=H$CG$0t@e`0-`c;7dsh@wlm?&4bOB3gPO@lYxWGRQ&x)4T1YVf>rL8~NLy zgmJm`|6vA<<^o`t@Km|Hto`_5BXTvrv+enOrC`s`E*9ov#bzxZ*5bIPO24(*(bPWs z*d#*iE4`aBmX@_^mhML-8v7W@-FI7}w0C$b;c~T2*}pH=P~0qgN_|uDHwuQ}Tnhs3 zEK$!J_KqBS;QT9FS6X1@$W|O7BW|E*chTcpgov*%Njz_Xk%ZQeiIP0lx!OJ(G*P*8 zOsRwY$B%A17J#(#Q_}=w=98+$98rPCq<=D9sx8dA6Nj&>!<#4;{X?egEzxP8P@Cs>E98e~k^uygh+Ncd!T zvjj{gPt-+3M6RRi+6(gex3=znmAg69XKsvzdoW11OD`SE1p$xZwv1jrw)F1g?bQvr z*}fH5RGQAo8ynP-V{3lVTYJH-A1Qse^O5&#!UbvRqO!uQCzpNtlwiRrTTA@dSC(9d zvwxyG^06$3w1jOnJx7{lS3$G2#$)({&VcFeRAQ z`B%Z}7>MLZP&zlg*$Re{2DF_p^V~`cvO3pm5D=05!~?RahzS;(b7CkQ9bVETWE2J2WjI4i(w#N?rcGh@{iR7l9+8Uvf*i17;)<-XEoZ|hR-d8 z^2?)4=IWt;*~jYuS5Z;tUGwn8m3|Ai*|;QRkJG+^ zAt17>ggGJc&S#wR#m`}DVSmChPZL{uiP2gTglz?SK7E|-6z3C1j$l)0u|UHKcNdJy zDvRafsopyRw2T{t(QCP&X=!$095I;16-rk(skLKn{X_vWzPj`V9$`I)6$WlI=I?%y zs5#Pv0U9Uzd>2+QGN7>_GsF5+{X6*`8D+57$^e|rbB2l(En^F@*=byrg( z$R1FliBIqcU}WR6JW{6L_v#Vk*L~vde*q2C%TRU>tGPeFP7cq&19MdjTcA7ME*tfa z+o7IQPt7V<==mbn=zgrLv5YZ~7*#?bAImIWUlYTQIT4)8(-RZ5FxT!k75ag!h?IYR z^!1~S+OKK^c6aIL5nY8ZM|jYdgnO{y@Duf)W^$++0E=+vsI~r75Qn~+iJ58>p93%6zh;#_esV_Cr^)pXY z&`L zD!&w&`!V_&BA>2`(T?I0^tS<(zTN{M$((%t>a-0efX(;7b*OB{TOe85@kd$jCkHrwwff%c3K?>QBopMV zdAIek6`^nxV87dj#kWVebrH|o8`J~-W5DMaKba{n9ACIFMY>zzcDWuvsBRb%X@Z6* zF`yK2TI2{FY|TOc%4+qj#9`fZM!^DmR>k2P6tRWqrx3j3!_#nzQ}siKU%g_+lD!${ zs!0HF2UKAZ7yNFuVvq`n%hu+{>ls||#XM1!I@gy~5BmR+5?7gyod(mB!x4QZ#;QKb z!wnjjq}V2m4HTT;a%4XUYP2nfYQc~4eCwo1ZcfA1jEg--MBXyfp*&^9d^x=wxLoqf zjuNj@W>Cpbyf-|hyO?TSev5c_j^KMSF z;q+KM1t(8 z(XP5n-rn!lVOz>e$M0XCXq)4^$HUjE2|vWL(XwX?lbMJi~0 z2wq2z+wT@RN}*G6r!)MY79b8ZrY(_lq&Uqza$+6#jCtI5G18vZ$H1J$Q?bel@4KsS zLBG)zwd8_N3$N8Q&9$)WlGuwSv&J1lz zLpghowsYjJY9-Xv(Jko9f78&RE4ymaRSf?Lgx)s5X6lz-4szzn&5wVa+)i7pdF;bJ zfMRov&Ih|EAW|bxu8r0+rfwFp>Rk4>KmmhwRg870dT~z_G!Fifs=TNG-&=6=YGn-`R$R8U>?oV z5Gg9G%d2;}KG_|!YV?G+Ee3s*L?~8j_V|-CA)gf6KDaeWeCqRPF(4&2{qd7yvBQRu z2^m_R5bwmURXd-;%(=?KXG*~P+^tx@GY3yQa%HCb4{X@aWYl0u8CQ)$028Y7T2usd z4kV4rJfB9ICJVK$G#8LE1N9it8Q0)p`5P-8+4{r$eCVg@`ECnt+Gx}y(c`M;k+#ad z7t+LZ25z-{_K~I*?uOYIJY!;)+FxR!>-I#T3ksClXJVR7ntMS*@BoWM!Aq4V^(QI5 z@idLb?2=15k2Uf5IH@ZL;aOB5bc`9TuVYC`YXYRn zk%Z?O5A;dK!WlyTV!?d_SpsrE`YsLv$qT24+Eh@ka<%^`giy(#jl|nk^PMzF&#n71 zo)rkEaQ1mNmtgp+0ewV^)~DwJ3j~hjD2<7}=P9I4?{@|<5rwc0X)w73B$dIo*^fab zg)$b_lYmPbV7_dFZn@19nYl#fW9LwrY!p1|NWVR|5MG*K9hp;OkA%(}SZqE;GRrl|>94 zWYYMOu5Ea!!r&~`!u%mo1(pc4X)?f`^S0~eP}OeYO7n{pavcw@^a24+4)^NJ_L|r;U@gP!672IhN;qU4o z5?djTTSS-J1|1yMQb<{}*Vfn+tA<+UicYcG3BNJjeQQ~UVf3&reoG6*iMi8USAMa& z|8;eU>^)_(`t(l*i6KPLff3+@Dlbib$Md*b^NpKm?C)#5Xrp}c)V$C9t;Z>!wnbXO z%~+BBI4ume^4=s-d;8|VK)0f01Hn!Ef3}3EnTwHs4FIL)J>q0J&&ZC_&2z%+ILIDA z^6At*)Kgv~d>HK@?v9qMBFxyFm`24w$y}LTSHAz%zVX@1M-?iGib52vN zuD(j&=J1%z=5BZU;l+jM`=)+47PJQP!oWmMdnp3BU@dh_T*2^|^w!IiK;3QTfLFgQ z7-%}RF(1|4-CdGf{?1Tf({xbxI}|)v#cd&HAKHBr$a9q?ABiAtT%cGdnu9b zB+JVmK-*~BU6`3kgOHhu-7lxf-Qw{yxv=1W*FYF96Q8(vx=Vq4*O=|U;Hat!OP}lC z#IyFZSlL(~dFMdZph`Nt5SEwsdTMGtsN0|1esB5Xj^@W&v;%uP`pT0?zE#(^L@rY! z`^QBBF1{DttkjYomX4tleaVe4WTP@ky@%C=b*@fVHK#(ds@y@5+BCMlf$HHIJRuEt z$T|saJlxB6mp8_*&q^`9eF)^$s$R&C_7A5RMamhenFCAyXKhkZ`s$f|*zUFkxaE&+ z^hrMo1|}q}-*$!b(G`+1yX1VEX)G>UaW|xo_(6=2s2+cE##*+gK3Ws&`ak_cW5rm= z4v$xIfm+QmlQSYuPsNx|Ek&P~LY)f$O*~#(hXRP#FE>^#D4nzJyR{2+hS8&=2L`Ou z!q-idDHiOKR4CRwwtig0{S32Hk-#11@{n?Oi!(8*a}|w)g96lTK4Vxt1aNRKNOLuC zDR1ffqOzmwmK0O>bomBD3$plrwYiH^LzDVrLH{ytoHH^IIB2&MBhi<%L3#nQwlC)P zC{&|4Rdva3s1h4nOa2aU-?c2yFk__2yd37XUReWOfEh}QJsJ2ALYjm2(g%WhWBM`1KcXtw>m>B<8LN|wwW%L$f14F#v`Z|DTm0AiY_jJ~}8aeSy$;KrJJCCc^i>*10 zMus2osl9)#U3!07=Bz^Q)w?4xTxLDhT(mUx9#N7c#j1>!2;&ZYr7f-@|i zgc;o< z$OC*rDvnli$8=SqpT_w}xIZON;ddR)q7dtzAd|1I16~`fto1NVDarvA!1>wzid-Rg zc{_VE_zoYccO_s^P^LgwcwL25tC!>QaR!ysc6@RqDfP*?*oBOiX7wlDL9?F}Ldvw1 zTRzV~z%(agr8KIF{$pB`s<~(Xw2?p|)$ekeoaTnufDO7#(_8ctq7m+I$i;0I?v zxvN|w;B_f(jkPvWEfW|~x2Z>M#P91Lr1H=}*2RXG6k$^snDKHMpWAlghmDdZC!@uO z9F~ra%fFOcc5kX{TI-=YFlXvT8i;~4yliZgZgvYhq~>z9uvm$?7b@vWvOD9)^OokC z#$tIYME`xe*@GIT!2Vdoq5E55P2wt*xlQq4j1T(Y#E*&}OqiP8ly~=H>;Q>J^Fn;X zS|k2iv~6Hg{Y0!1bO^vLbW+;wzRoCC$XuqfL4am|gu^oohw!VUeAP&=IR_! zk!>IujL~gC9q9xY%HX(M)`pavGfkzgpPx`v8iIr$WPDej^dulX=<5QBG2OG(f(4mIh(fO$fU4)&16cMcN&T9ru6!C^LaMDmpaEU& zi^^Ok#U8C0J7XaQ^o~OdZ}pySt4Nr;Z4Per+^8qhZpo5Le>d_T(8x;ZWu(`FC%4}b zJYB2R+8+Pw^ae4bN%nkJ-AZO3A)x8c>(CoW^SEP8*=i>Xu{EEWZeqAA?-2 z06PD6!7$P@mN@B4^cp`i0HV9IAR6(q34Xx_Vd=4 z;1%9rPZ~KgM+t#7ri~1ImR>O2A)1@`e&Zs5*49 zlRNepngEg^S{kyvWKndN-ZyNRx~`AY;GRs)y}5?o6H}SeWNMH62v*Bo_T>9xmpU$Y z)k0J=lm-6wksLyNM>Ti#BwU(rcJT%K4(eaGa2JXuvYSnkhR0O(s=v^)x2CzW`)1Ug znJ?nbiwp7klUIaa#^bx#)+(AS)Z}bAI2Y%-u(x&39J6(u5Ve=JnCUwx`hfNJCw}W3 zxN@2i(1Rg+!ssIt<%|W$MOU3$v#fh2jjkjio!yVFWO~Dd+R>v8G#F*4z*`+dC&An) zWQtwN;a54^%vE2##X=T4C_S{ZzdV*Rno9+=ER~sUtRbsi#b;P~RmhaE@;5PF3LC?k zX|4%)+MiuA(~v@2{Q?uE>3+N?@fDi6k)mIs3U<$~;*;M8euPiN{kL4n=&IjLnsZ*N z18xS04r}7EYZvXEJ=D7nXgvR!Ww_-YZ+&l^3fqcOaPRCna|WT2mRl9 z+%YjR>Y8i(D>;eNDJslk0_6NvAGe48D6zAKYqM(G)UFZ&O$YnKaCuUhED}`;zZIe6 z%JD)o9amGBf0ZO0TUC+Pd~A70;Uey=*n31Fi$i7ZUu>Xo>{Es|sG*e56r-@kuRqBq za`3d6`~xEI1?ejuB%Q>&XOM=0YxW+TPOrXh<0xM7Xwv$N0NDVAW}Bh8LS(LS`9w0q zNuLY$F4Z`OUf%uz^o=@Z%b=pp&?NY%sl$HN?$QkW<*sYSt#Q}pxQBK-8a8$cS7k&s ztUwRDRAnMl`|#op_2JEG;d3pt+miz5Vs?ZcIJ;!OB$1AF*7ZekT4QB%D~u6aKRc_W zj`f#pJLhx0pT3Xr_??32`Mh8E%m`aFW&p;V2vv&%@C1)}ww}t53A)AymiqkQdR0Rd z<*L`hnc>xBN=;|L`x8!Z*Wg)PU{W30_szmKVh+Z1@K%%CvYiD3(^3O zyME4~E{u;U>yUD>Nbv5)iR#t?GKuIU)kOuo`>nC>;^A2_sHm`AMMgD3x`9ds!EPtc zKW2Z;ZBDYM#HmIaSH8xfYAhP{=fNvw=x}1>H@6>CbSo6p?OBdjjx*q2*r}KA<;t9E zoYW{>uNnY})t*hJk>YQ4?|yq>IfrEz*NM@W&9)L3@!Y&@VUFg`GBHWOcJ=ifYknog zKW341Ud~s{4WC1Wb@#E+pv1RaGE0|}PuLc+R2b>J;t)A=RulvcmO&&}mAO}KiO6G8dojU^C@`YUG2J#<4Z z#)xNiMm=%YG0O*gVX1a!E)seZHuJO(6i|eu#2l5o>8@%lw*7*~JSULV@3ycmevhdf z`O9z^`MmI)FowDYT6=}!4?7`&{v@y z)2?jZIHQEP6&?WHimOSU$h_|lEK*UtqbI$AB&`7ms)}~P^jmup_#W6;C6D|=zRzrT z=)G@dy<|rh``k|w_Z`KxG+}8DTh@@A&@+zJRvcOGvFSnfXk8;Z$A`g~otH{n{52I* zdcz$Vt&xKmTRSZu2h-d7r3E|lH1_vF{=jtuJ^Dx;3<9``pDpF~uylEfV!j9e#G>UO z^ds}Ik!3D*45h{IDbPMpaaF(XLTfeIeSTE>^pYLzcHa3Wb+F2rw$2|?v=o8=gPFap zFzeNzN&Lz1DNmiwzlUX}oH-k50l=#kPp)+Q@WX ziqP#?i={0=`NvMA#&0a2@OQN(m2ItGlzRbDiD~!o_<4jyz-lNcDAw`Z6)Pq(? zX$l5w2*Oicw_}9zWnN~Nh&dpYf^Rj*tX)XJ#`ZpxSS8QfU6)<#wn3r9F4E4B4jk!l zp@6rTGRkeTiv(aD2yx+_!6OEVV7T4IQ-3?~9TU+nHVBZP`8-iru_?KN-v@Uw4V!~% z^?Lme31^$&HxJis(ETf%jmMX%Oeup5K!k!L{pR%)-;eK&gcFrSzFgauN z&q2wFpB`V&K6p7dzK~!qN32SfWi5mg+FXgjY)WqQ(nMJs?s3v)`EYCGw>8FDHOnZ* zgM;#sWvm7=eY^b>MKLjDMPCcrWz;&@s@htLf>w8r-k1NN9_=Is>-664IKibMa_D}ET!`yCN5Eexre7t*NVcdNm6*>wLojGrV`pP}yYbo*X0CB2uL zv0H`~i5IMI9@y<35jJ`<#-IayiRL#LU>X6?OGQ?WAySdWOQirSgm7X~o3Bf2AEkw_ z)v}viYA>(VIM_APt=3HaZ@W0d!+&($%UlRuY&eka!Wo|U^@Ud*e&{q&kBJZkfOP-d zhB7Yt4^~lP>|zoOI()-dEuVPI+*z4I*^)_*$=}PVy0p$7NqR2q1akFdKF@j{XAa>^ zt~apNv2xsHWR$hcE;>>R8~VIFurq4we>gB9V`NPg(!XQ!5H=h<6^_;J%D`QjT1h)w z)bO~7p0;>0drXZi24^0O4EotUh3^wm%r4b8p}m6-f|`Rk{Frwf8O|SQR<}Q{qWvi?_hmD>YfHKYO`hOb!9Mr4lzVA9J~-|ZIWNTgR0_seMl8;km%gF zCO06F5BIWd*?!}c(n%J~&XpWN87P#u{joa4O+D?d>Z{0y-6YJ`sYxa6b*UmfPy>8; zNr2V254JaXpEs~0Ockm1T$f4X>sl#?lD$|8NYshT5axMnM!|4CqVE7(ueKk|*I3pl z9$Z!BI5NJWr^smR%uSYWy6s0=fXS)^ zSd5IVj(ywwIBCTwIS@JId=^;QsRQOyG!4c+&TeREPb!j-F?3G`as}eYhvS+ugd)hE zci%-^XvlHa!D}yt&P|B~jiC^1VQn0SZ>`gwy|f_z;4ls3caabm%B@Ks7{k4ee!HPI zUsD>HXv0Q{Zd(_GR7F$sU&zfY1*cdhocr=Z`}!rSlHa_ya|bi_;pZ4~b|Ss?tFQTMMExDM~#|NUWl# zor;&2CsMxdg4qxug|ulcWiHF@Vb||DzwyQnB-?WPfeYXFO1FiA$P&BWg8QGCfd`il zq23R{hMsxsaDmOAdD`~q)V4paJKVxfHy1qfWrw$zG87ukXCYqK<<->Zb_af>{{R)9 z5`w^dje~xW;j4(4+U)kNU@!-c?EQOdSijaL%AC-{vh+KufH9RYDK{Q3@yLBnpR=fa{P@etT)@V_;3t_) z$S%!|gLG`a^H5QkV;7_&SV^`bdPd~rzg=7WNzwpGYVEEH(|a#1j-chz@U&dV?K zoDj@-*Z0paenP!>mD`{;J~CfF%g%RVFTHzY7G9evBW{iQHo)qvhJ3Mdp5wcdJT^ukkY;LReBuY85?Yc4}UiOwpyC zOg`zlZ<^Wv68~i`hWm>%gS$aIB?Rl9DAO`_Q2DwEf)gvbm+9g*gTcD~k3-)EMBSoB zcY89*r8~5hkU*ppc4mGW08fpYtD>N`?W2)$D+UrSmM@*DRyqk^nP^DdoodZ_dh?7Y zC|-V~t_-fK0PFsd&_*xOM#NCT3`}V5ROy*bPXNfk>FNJzIz<&(i!)anWY*v+qme2* zaF$g6Wa>a;N4_TVWr~i4RWn)oYFA%DOSS}uBNSma4KHedv?LU1GR%?TDJDb zfYUK)twohV)Rq>vX)Udy#Hm@?-=xeRB?qA#+!vulq6mhwN|S7s%B$x+CD6FFObtNA zyZy(PHEt3+oCNe$N=yS@VM5_G5zQpiVZQG6+368WZk&scTTac%^xxvK5KTwY#nr6Y z`Vr(Ptt~WTmx1g7or&a>Inodu{sY?vWr$pm@vcjg8k zoJmbOc5#u(mXPwqYkw{%4H~vphizei+>7x_EdW25l>{pD_46_*K!-5!3ZyW%#GH|&~JWaJy=t8_As#Zsf@&4 zeUL$@t1CicXn^1Z_71h2h0u~Y*= zu>dTuprfiML|9m36GvIXmD#_0P*ZXiUn{awb|<2}bg9zg09}|)#Z_uMSXOvA)qA8Y zeM;Z8Cw5;|YBjInna_=!&1tc1WNpPFq~@Jq^JQKaIUydXwa{6XfUBXmEv*EdX@PVd zmMEX(Dp#$PolPl~6TIUh7ROS8$UFu^89H-$K<80aziU?kfe{Fqv9Xl=C3odRgUxcx z%4wzs$iB|dB|6Gl)U~5H2pGJ}!-G}SYE-gx;b$h+9fCBQ3TrrTns=EUFH_e%>S?D~ z3okWU6x1^#Uf1I`BFzBEy*id1);T$#*8j8s(sFm5(;oRT=*z#OR&Gvtn9m!CYJI3e>aARVpdIszpjc^Xely*)8kdS&@y9~-2-8LtoH|&UA$6Rrt_)4)qc)agXtdObp2KBt(S&8U) z{B8TGiqG1Imb>MVuZozZK=oMpsr#g$)lqO3zIQrH4 zmHkhNQJKwBrZ-prPI+^$J8+koC&OumZ(h@n;JhlWxEiXqNztyrs?nBE(a?1ZGv?q3 zHLMka>KS;7k;Kx(qq|)x*Zh9J??t={on=NH|I zhP(uKFd)@aoP5{$yqvG?7DL+F?e(*uGHwI908J-$<@NO=W?eiFLTCj8?pQdPd4)!( zOWk4{_<)DBp`MhSKyiOtYdzHG>RO0~Sw1rVp}NXIQG1&Ub4g}YT@q&Exbctiv`Fbs zZFfo~o>BMgpm7TfY65O*wGg^6asNgYOo=>qZ*o%JxR6108Y0_Y8b=+C9dskLb&K>0 zY<-{;o|og)fd0r7AdimBe0HQ#NC*^Ye*Yd<;T~vZbI~*axk;;7A<16sFY|$p-NTPg zZORh?WxJ8RA?NG)p7f{-{&gJg5sWVL$@k`)d&+O6)sF7GKfi^iQ@4DPvO-ChrgKWV zdnc6?4xG*goDQx0aL8|>}<_^PoGcK;s zZ#(_$UlST+faG0kxWbI?igorVGxLnLnl85=Xq86Qo(Ch6*+*bc#>>7HH(YPPu~|KV z_6=DtK{F?wdrv^OIQO0R?(1UTS?Yq1*Jn|gh^}q;Ek%U&(tJjovB7A#Z`FHu$S;3z zc%x`057pnxf_QXHxtMVNI6rGoH&A}XL_t0^8!#Ma3Gz4>EF=%Nas%tC{(YltHC$N%T0t>VH722yqHr8x zyh``$D+SJ!Gn(bN-XB*jED)ZKx7mGCPeL=*K>>rl1$v+MmsuDJSyK&^Gx=FGBCV;i;RjXBX%Sl!;qP6n zF)R_87T(V4mDg^pL-yGwEER7!!uGl}^0KEZjk5Rm?BciBat)|AsU!;lVSl(V`brEL z%rHLI53-Zz0oFlc{x+rQaDslj_9soK;prw1nJU~L{%2PDG79}25@Ylq=Te#Gd`Gw9 zkiq^kVhwb9rh_^N!q4kmh$1yxVJ=x!^be057lcBhM$~+b4on!B6XzcDf1kemSP%gh zm41citO#yeH!G&1((~!4Zz;#1Q98hM$dmf)r-p60zM1Ud1E*=T;U~+_U;H`!zhrfG zWhDx)_SrWs7gR9D!njQ2ww^BzS4+#}+}xjrHwZmmURYJ~|KaW@iWc_ltY2uB-P0i4 zeff~V=+J+-`;3Vh3}eQqS|I~I7)CYs%WFpl4k&E8;*97q zK-S*%#Kb2vSRG(vhl{Ii|!?%yoBQ{B!|m^Ia%8bZ2}=i z+Vz63lUXDYM5Oz?R->yu4D->Nx4n-faLm_>#d~kM*A%$ zDWQDYw`wAv>p$Cc3j<>&UcH9#oo(`-9hY84=!JbKZ2ZW@+~DzvE$5k)DN~Bg)^Vuc z{eVGN7gb#?cHO}37n>=5ue~^9%CZ3-6IL}Xb{783xn%P72%%Hv;h&IH_Fs%PUQR_o_Z4!woR?PM7pX(RlsVXlD)q6Yk4JZq( z8Cp;haeTP@E{~SH>FU!_H0T57&td3@KgqD%=>OyR`=FWrrzqOom})U1{PY_(M&~sH zFRp)VPU1Yx7;)*GD&z(4$l7+>18`lA;%KlJ{`vcW31gd-My8DRS3Jnb4O?3?SoT-D zI_B#(gBdegN>I$I<2jw>xVUF$W(R}ox%7G}G45C>);%$dS2N$vk1d2&^!8HFl21=r z!=p0#<$Q6@`Eg@Kv{h&l?HTMW|Khx(=7+Q*W;Xq)QH@U%) zr(0pAC(HNQwf?GMux>YP)J9a#4VZ)Bcoecj5pgbUfG^c1{{+20yfj!y=cQKuUzMF@SXAHM_YDN3OF%jVq+4PTq>+^FmWH8ANg5Od-n)b+0GEj@x{}XR-1JX6iMyVpRVvs_63!Q zsy*ExJDHfiKP_(ZVI&XgMHX2Gk2MRR*{{^c26hqrk3TC4N;I9+u;<}l%<*juCf`j> zDg0p8x{uEWVS1#xt@g!Y)7PKs(btaVtPke-r#o8X(t=wVlUPmf<7N(FFNG6c>cH6+h8WVj(gZ09{unb+b5>1$ z8Zk`0XZ{V@%;?FRIyQ7i+F_c8MpXSN0wJ6lf0i|@lU36^#;?JHGN>5jRsHK9Of1E1(&gq_Dz^K?W_x#iXTKWRv$q%Qn$ zK)`!yyrFQyMdNT2>j)Yx>f)SwGM0>u*($X03LsSdAgG-k=OiF+B} z^PogGd-e<8YQ2b=OloqV4%5@RC2f$% z_kfG$=^h^8D6AtbeO=SLL~F<&H=?|c(Ct74SF!Jw7l$N*4E=~$Lu6brf<>5jZ}4`5 z$!Ylx!~uc;+Zj~&rL;cIaRK4us=9Ct^BDQR;jjLy>xw9-o5e$J_7@2R2A-su{D zRrgr)POh~v`Q{pTwYY_Vgwg1gO3Z4wT3TMugaG)RQM#;xA~|QEn4mkXSWs@uYSjU8&wNvLY9=WKXj%%`|ph2bC7Id`su9Sf^oLoqoU1Sjj$9?~6rU#|EFdG#?JPkQwobL(y;ro? zlZjekR!6DJK#P83%8#lzCnc%|uWc&%ea&1P!h)MfloDE8`VZ z{1T9^dOI?FO^13LitF$9GoiSFBBQv}!BhMAixq}$p=^BtFzsxf*3dMUpAxBLZxlfX zTgvP>&=_9g&Sjz%_!SZvI(lTEmW@kZM(k179$t3p+Ns8`nvI(rwkO}CJ!~1gKHC_C zs8mD9*HKVJqF-UmBC{pM{DraM>=0i2fvFU}iQdz*ZSEB32&SK$+~5PB1+=wFzC<5G zSKR0(lDNq!*lx`Hk7sKqzee5u2N4SkJjp7Nu-_=<#*EtKmhAAltb`crS3L1nho(~# z=92!)$MS#bPv4hFLAjF?fvhA2!=gAMvn9silymiT~ z?Nnt&jPl9NJB-ojT~VG4N&Z~CL7ykHZS#>2>PG?7FN5B#FG#j|qf}8n`Z2}l?^KYu zXTdSn^GEI?;gcSXF1NImNl=pY6%SD$wT&56fX@8*WX@*iBrPj7fYBTWKaGuOHoSjryS^; z5h7;+>@8*AR~o56*?cA`KPT9#L9;hUYv~t3iIW4rV`BQAfi&e&R4qNiL@Hp0r!^F@ zLaf6dN^m_H_ONIAV`y&f4{vos+%{dM2%Wa~SN0r;LUW%Ii2&-%GW(RFVcUyU`GA1# zH|_pyCcz=npiml91`6elLUC}2%*@Og+i7m$>@XA%o{vN9IYQbx8?*_$*p?YEsgHgn z?O*6}UQBG_0u@!5~sF zv^#ugvK#ePsybPIM!N6x2O*f0xk~r;3bTrAg@^O~<@fe&!Ll4ri z83WF=$5ve##X96^EX<(|V|y4{Xy8lT*eMJuuPy2&X@1{yu}|B!ti zq;OhlV41~H2WeZCrm@FKFn9!$vMh2fW+8t2>FE8F3j#x-*G3HiNq9bQ=#VDDSHCBYf{hVBV(bSUkfemHs8D^x3#i6pZ8 zA~b4;Ih!3qeVJ0~9AFuZ56+^~G0F-Roi&We|1_}yfr1pyThUcufGk05Yq!4s&V66*`-uAqXFpU5{~m)s zN8-?Gwl&xudt)}yB5ySgs!vOBCT0=b%C(#&nZP$jUegSe4{Q*@6XX+MJkZQ{OLG@e zZ{Ak1^#CB%92{+}SP#WI_7$p66$yAiykdQHVz$Mq`hAp{fmdj6!)?jT$NMg+IbG^_ zQ!wMc(c5i-;oHpSPOWc(->3CpTFe7n;qm1jw`cK>AXKlx4E#={K&J*CI;pmtRLWq;yd9$DyLtb0umuL)ZJP*rCiegyGx|f7zYqX1|l2^ zUSr}js7Th8!%5b==G0QJYMl&cfPc8}Y1En*xz2~(iTH&zp5?tP<;hwJy}{EM;H^B# z{o`<(Bi{Ue;44ul0IUrbQQ@mJCYWm<4KB(CFzHMN)RD5#tuzW!SrRdJk$;pAfS+T1 z@&7YuMAI5Zd1-RPzfs_I-VOS})g7{=LUq$Ql2EeNThw+oQGHOvchdiCD0s2@NWX{Pu`dRL%;XvJR~ZDT`H4% z99B92Ng1|J;a(kF;Yvr9F*IR}&2n0!v!*d@r6o!iO>1Lc_0}95QuN&ojM;sS_JoWC zqIm49hSLw_Ztjr!?`813#%y}h(b6acDdRLt&Xlz6y17wHz9Q=*`n_^>y#fWsEBf12 zC;<`CVG*O-#p&0`>z_c=$&s$H8=P7uh$7N$cVlZyPB{oiGT_4PQeHgpx5)3qeMDwn zweoF4P2!J54&-1|DCnE(R>xv3I)jEIDl0+CoL>C6(+A(S5;nkNA^wUa5=IyFWIo1n zt@xSQMZ6JvjDWeA{E#Jfg7p@L*|jMIU;6T5m8bTU*u(K4+MII8VQUd_Ehqdi0Cu-zX=IErvFrU(REQe$1e zQD^4w1NP2HH<;~JH)mpw>p_gIN{O%vTj4>dP(oS0c!Xf+0_`BC0a6gma7yDU}Il;F|2bw zoQFhdh|wB|umNulmLYdV-YwwWY-m5m$TzOXd0(X6&+k_Y@Nw`*f6oib@17Xv+u4QU zOjai-J?FSOwhimOetU}&|M%{~{UY`%dXWE8X`BOk1$D&V#7VaW#n*v9VYHB}W9)%I z{TEZxGCd}Ph;7fq9cW9@lQI|5*OL*%sE&Pmkrl6K+LzIMKHtg-6cSCb|Ioh%;Vg`H z8ddB?RDxu}q3(AZ35^M8r`)g$L1-e|U2eld0vf@lalY_- zESW>gMPc-POQ*iphfQs->5c>}f|YD{9H)Nw3yNbymnZ zw>#iZj3He@j&JNM(~YoCe$K^W@(K_c6Z<>w$Ed}Hh=v%y8|Jz_6BF~pdxf!h))KoO z?*hA7FV_Cf#lqWTtz*b^q4q@9bH8yZ_Z5!TI|bJrUPX5DzbcM-H2s2U+BRn5lcK4w zwqnWZR*t3&>MR$M_}NwhI*YIUn8ZRXOlW-&x+@p6)Y#3d4M5<3!b$(AG5CyWrr1~Z zaOOitWSO8Shkp(Jw6VGw03L{R3;1)aXeQM}MZYXr__R#WFi>~}R5SFl;~dOu%sTCo z>G{GeXnZUZ5K^coBwAXYb2i5ZR)RYp>M1|Hb|I(oJlr7R zFNz_}ZDy(LA{+Wp(L%`4=P=~*V$eM&9hINYSO0ytXBz#G!d|I%GoKYHVXKTC@B1#V zB^o_iN4@O15GGj|_bIgHfOcsalZNyqE@0^E-q7AO^Gq_FT^NHH??ycbCVH&rMLs51Rz7h)$8Bv|eBY1F?H3Qf>g+S(ctUy8lkqli&u_n(Q zwX!i}%D_t_rHfqB&sszH7vHJ9Axu5=v1LY*?`;l0Ijz+Wo*pQ52dx^9yQGcvA_z+! z{*CYy%a4>9V_aCTXT3d4>aNK~Xw5lmHs6 zY95D*G3KcrcY$+Tt`i8!s-_uA^bHO@>M9JCV5nnlPyO^r4L^|bw|Le>V!Vh*Rc0_( zCmm&4sgxUh{q(DK+Qs}<(u89O@QmJ23f=4?Tb-akem%Ep8jVZQ_sA3@l~3P+&@GGhxmas_6Jt+x)NRqNe;j zbaPp{tM!uaDb3O(}ZzgFeKIZ`K8##BTdaE|?Is9!DBFEBuIq?xzvP z65_)|_w852I5A__5N>}Cx1FX3?3~D)7frBGX6m5gJ@LZ6w(ucjVJcmx3@H_gz}5rm z`0S;pubf%gv1BNJx}}Q%P00~!nyqR(85vS;;dQHj><+h~z{s@)KaD?^5;fH_we`KN zD8NQ}EPG>BDBS&qx__on zy(-qaI!-Gn8`2$}NSN&=o^E;Jer^!F^GyJH<793wsVI zL8Ow7PubT88)SE_zIU3NWA;T0UaHc(;$aJ^R1j6_O%AL3T;(O42FZ5w`(E&?nhG$V z3bFn^H9`UKEDoyX0y7t`EGSudo$V0nOmXRkBbY}H#SFgrQu}bje??IeJ>5ps&w3U> znJg1R`bv=Br`Qq%0(U`Cte5m{$1Ot1E=`u#>W5Me&F3u}CRP`};439YAO?i^O&zbQz{{9HR?bL?)HAHG(X#b zvNIun1Bw5ba)SAmI;DNxG-Mv^;1`qD^i-Ns18?iO-3Zl}3#nz|WdA@VAQ*TZ+CLA1bLt`O?gj0Ku1t@_!j^Y1Yii zky*!5)o9H?0lqV`x5Cg*XQxXhd+GW}Pp}A~VIQ~epO~x!TB8O6(x>iV`<&`kZA}${ z)0$=q~kZQxA9oM^>V1yY%AwsB*XiG2Aq&nv@8!Dk|nZZg&?0j-#NVd54_ca2ktqU}?jB z{{&qS)%pNHYzF88X=%T;$;Nz~nVuvj==qP?me@c;(dGOcHF**TOLSvUGjz1+!##Av zz{oHQ+X%U^YkTQ1Ep1ScOT=b^a_wbDnCxS;SYsV)Od{k!?sn&ic>cpiD$_0}x_SK> z0nwcIWvLHAAm3mL3IQ2@aK=m&*djm5l_+|I@;x_4-##y2%jV9G-rhGXnfpyVUv;p0 zx6VknJ*1PX7WPU910?=q-ec8@d!v{2;kBHK_Lg@?C*U;^~wB469fT@Zu zeN#_zfzc_<#93w8=NZ5;x!4 t|AUA0&mr6YY@atn6Jhj!cfy9QiQD$4oj)~4E#3k?&lNQls^qL9{vYOSzXSjP literal 0 HcmV?d00001 diff --git a/docs/tutorial/JITTutorial2.html b/docs/tutorial/JITTutorial2.html new file mode 100644 index 00000000000..d88668ad771 --- /dev/null +++ b/docs/tutorial/JITTutorial2.html @@ -0,0 +1,186 @@ + + + + + LLVM Tutorial 2: A More Complicated Function + + + + + + + + +
LLVM Tutorial 2: A More Complicated Function
+ +
+ + + + + +
+All the code in this example can be downloaded at Tutorial2.tar.bz2 or Tutorial2.zip. +
+ + + + + +
+ +

Now that we understand the basics of creating functions in LLVM, let's move on to a more complicated example: something with control flow. As an example, let's consider Euclid's Greatest Common Denominator (GCD) algorithm:

+ +
+
+unsigned gcd(unsigned x, unsigned y) {
+  if(x == y) {
+    return x;
+  } else if(x < y) {
+    return gcd(x, y - x);
+  } else {
+    return gcd(x - y, y);
+  }
+}
+
+
+ +

With this example, we'll learn how to create functions with multiple blocks and control flow, and how to make function calls within your LLVM code. For starters, consider the diagram below.

+ +
GCD CFG
+ +

The above is a graphical representation of a program in LLVM IR. It places each basic block on a node of a graph, and uses directed edges to indicate flow control. These blocks will be serialized when written to a text or bitcode file, but it is often useful conceptually to think of them as a graph. Again, if you are unsure about the code in the diagram, you should skim through the LLVM Language Reference Manual and convince yourself that it is, in fact, the GCD algorithm.

+ +

The first part of our code is the same as from first tutorial. The same basic setup is required: creating a module, verifying it, and running the PrintModulePass on it. Even the first segment of makeLLVMModule() looks the same, because gcd happens the have the same prototype as our mul_add function.

+ +
+
+#include <llvm/Module.h>
+#include <llvm/Function.h>
+#include <llvm/PassManager.h>
+#include <llvm/Analysis/Verifier.h>
+#include <llvm/Assembly/PrintModulePass.h>
+#include <llvm/Support/LLVMBuilder.h>
+
+using namespace llvm;
+
+Module* makeLLVMModule();
+
+int main(int argc, char**argv) {
+  Module* Mod = makeLLVMModule();
+  
+  verifyModule(*Mod, PrintMessageAction);
+  
+  PassManager PM;
+  PM.add(new PrintModulePass(&llvm::cout));
+  PM.run(*Mod);
+  
+  return 0;
+}
+
+Module* makeLLVMModule() {
+  Module* mod = new Module("tut2");
+  
+  Constant* c = mod->getOrInsertFunction("gcd",
+                                         IntegerType::get(32),
+                                         IntegerType::get(32),
+                                         IntegerType::get(32),
+                                         NULL);
+  Function* gcd = cast(c);
+  
+  Function::arg_iterator args = gcd->arg_begin();
+  Value* x = args++;
+  x->setName("x");
+  Value* y = args++;
+  y->setName("y");
+
+
+ +

Here, however, is where our code begins to diverge from the first tutorial. Because gcd has control flow, it is composed of multiple blocks interconnected by branching (br) instructions. For those familiar with assembly language, a block is similar to a labeled set of instructions. For those not familiar with assembly language, a block is basically a set of instructions that can be branched to and is executed linearly until the block is terminated by one of a small number of control flow instructions, such as br or ret.

+ +

Blocks corresponds to the nodes in the diagram we looked at in the beginning of this tutorial. From the diagram, we can see that this function contains five blocks, so we'll go ahead and create them. Note that, in this code sample, we're making use of LLVM's automatic name uniquing, since we're giving two blocks the same name.

+ +
+
+  BasicBlock* entry = new BasicBlock("entry", gcd);
+  BasicBlock* ret = new BasicBlock("return", gcd);
+  BasicBlock* cond_false = new BasicBlock("cond_false", gcd);
+  BasicBlock* cond_true = new BasicBlock("cond_true", gcd);
+  BasicBlock* cond_false_2 = new BasicBlock("cond_false", gcd);
+
+
+ +

Now, we're ready to begin generate code! We'll start with the entry block. This block corresponds to the top-level if-statement in the original C code, so we need to compare x == y To achieve this, we perform an explicity comparison using ICmpEQ. ICmpEQ stands for an integer comparison for equality and returns a 1-bit integer result. This 1-bit result is then used as the input to a conditional branch, with ret as the true and cond_false as the false case.

+ +
+
+  LLVMBuilder builder(entry);
+  Value* xEqualsY = builder.CreateICmpEQ(x, y, "tmp");
+  builder.CreateCondBr(xEqualsY, ret, cond_false);
+
+
+ +

Our next block, ret, is pretty simple: it just returns the value of x. Recall that this block is only reached if x == y, so this is the correct behavior. Notice that, instead of creating a new LLVMBuilder for each block, we can use SetInsertPoint to retarget our existing one. This saves on construction and memory allocation costs.

+ +
+
+  builder.SetInsertPoint(ret);
+  builder.CreateRet(x);
+
+
+ +

cond_false is a more interesting block: we now know that x != y, so we must branch again to determine which of x and y is larger. This is achieved using the ICmpULT instruction, which stands for integer comparison for unsigned less-than. In LLVM, integer types do not carry sign; a 32-bit integer pseudo-register can interpreted as signed or unsigned without casting. Whether a signed or unsigned interpretation is desired is specified in the instruction. This is why several instructions in the LLVM IR, such as integer less-than, include a specifier for signed or unsigned.

+ +

Also, note that we're again making use of LLVM's automatic name uniquing, this time at a register level. We've deliberately chosen to name every instruction "tmp", to illustrate that LLVM will give them all unique names without getting confused.

+ +
+
+  builder.SetInsertPoint(cond_false);
+  Value* xLessThanY = builder.CreateICmpULT(x, y, "tmp");
+  builder.CreateCondBr(xLessThanY, cond_true, cond_false_2);
+
+
+ +

Our last two blocks are quite similar; they're both recursive calls to gcd with different parameters. To create a call instruction, we have to create a vector (or any other container with InputInterators) to hold the arguments. We then pass in the beginning and ending iterators for this vector.

+ +
+
+  builder.SetInsertPoint(cond_true);
+  Value* yMinusX = builder.CreateSub(y, x, "tmp");
+  std::vector args1;
+  args1.push_back(x);
+  args1.push_back(yMinusX);
+  Value* recur_1 = builder.CreateCall(gcd, args1.begin(), args1.end(), "tmp");
+  builder.CreateRet(recur_1);
+  
+  builder.SetInsertPoint(cond_false_2);
+  Value* xMinusY = builder.CreateSub(x, y, "tmp");
+  std::vector args2;
+  args2.push_back(xMinusY);
+  args2.push_back(y);
+  Value* recur_2 = builder.CreateCall(gcd, args2.begin(), args2.end(), "tmp");
+  builder.CreateRet(recur_2);
+  
+  return mod;
+}
+
+
+ +

And that's it! You can compile your code and execute your code in the same way as before, by executing:

+ +
+
+# c++ -g tut2.cpp `llvm-config --cppflags` `llvm-config --ldflags` \
+                  `llvm-config --libs core` -o tut2
+# ./tut2
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/tutorial/index.html b/docs/tutorial/index.html index 0101c6dccc5..79597d8e9d7 100644 --- a/docs/tutorial/index.html +++ b/docs/tutorial/index.html @@ -19,7 +19,7 @@
  • Simple JIT Tutorials
    1. A First Function
    2. -
    3. A More Complicated Function
    4. +
    5. A More Complicated Function
    6. Running Optimizations
    7. Reading and Writing Bitcode
    8. Invoking the JIT
    9. -- 2.34.1