b\oTR;z.*d 3iʈ1n/|iƃ&e0Ty4f8LIpX'pT'0GzriPXD5׉Ew_L\ R@O? }r}"bw.c%JnGpT_x@fB @C3DX!RZlv}j?}|fMN(VE$*xӧUWl 2zei_dE2)3VU(*bFM7N ( u26eߩIMAW2WV*Y]G ߀݈Xes%$S;iF81oB uT &mZDVڊSO LĢ|teD`<,ab8:wg* %3^sGBJ4~pۜqp90la XʰBV+#?Q /s N'ё :]Ot(Ub_]o@qV*Wɍ/e><v (m)Dn6WŮOa$-9=]w?op}xDziXf*LG'eJ@=|rTs%O׏O=m?]8y׳'O_B5u"B7ݠoX(P$3=-&TEyo9¼픵~a(1jjAJ3Q,y5Y2i+mЌ/W|ytDtC5O^|+Nz&.`{MXZÇ=:Rpp:Dg;nO %"f! DCpXgL睥lEnOlB$J4~@_w_[ dstAi`Z$a|kP&*"'VA7M/¨I'(6̘, ջ${]kjZ˷\i=OR(0 ;4G"-,n= "+/>Qu-+04,caT腅DF>\f@t ..٭9A54 S_d!kJ&~"LYs]h=oҵfj` Utչ#}l~=ҲGa?"O%1#{py?oTt)`+]i)@.}}E+߾-ɌjU"(oy -ƍo5%u˕1Ӂ !%7?RrctZ"k) 홾\)Aj%'D >F}}4AQ^"|ܙGG_I#sE*N~4aLm_"V#|>Mg W*RDR|8" _`H&fqUHY1UZf?r,7ϳ;1Z G'>L]5,l'.b. -0A^.GrÊ0dd`1(4 aJB%s,s>yrmd :2ֱLrFnw1rY!BmIXd%ԳB=FMRtQxn Q dzfBh@jnXB neH+Kd"ʍ~YБv2 \ PRSr!0Y/Ñr4YLrxc~K.#5x^DQOu< ;\M=SḑXv$d!+hRƈ3 P"Vv!B+t&)*8dxւIbh@ÆAe/N" )>.;^Α8Gq P]*]VNʅң6S# .ҏ> [#;Q׿OK= /~V47ã?IB@qf7vߊWO[Pb;ξΓb1zӋ!Kd%U UNiAQ>*B5T]QD}%, j9MѦ 9}%g?kʁ`0ꂾY]ۙpeQ'Aף9O_ún J]ԗmZѦvc\zؖuxĴH(D"l/ID!%-5gf;yqvGPIfC%qKȜI#,' 2Jauia[nho@H-T T]dvQΎ%͔yJv@ }v* )hohzhؤd4sMV"K 'a0ԀKtw\^/Jӄ e_WOTr}|;x'4A(sF[pABzSXmP6zbHhrC(4,WUbj+$W1W uX %a qh#uȈQR+!LキvXMS8̢WvIi1M/v 3Rf{Pz+Έ~a[U+khs\#4Ꙧ\5zd+)0Dvby1AbpVZ[ ݱԹq #% -yp4 tBMG}XN q dS dkuL-ީ,p+ i8o{4 sf^ |_ڴ#\"8s{F)N6wvll|f9: uGAX an$ mznwQݞC/anzjX4(j}6*rZ92-giFiWN',M[=њʬ!~)#ЗjPq].wa4{Ўoh) qPt$LUT)fTBuq^cN\WNtV)U '"c3zձFO۔\ʈi<'Kp9FRߑ0]=m+Inkb SieEHkPE"=~m{xӨ$@B1Ux }N>l-_ EXd$zҪU<>2[~a±j"TIV=9L0TЃc7*8E3"Q,mx}U ER1|tYRRj0EY 9Bb'4#ZJPJ*}vX׳tC 1A-4DtmjWތ|8 DR D\s4%4n_3i*c'#T_tmSou%:_nukiY:m,LG֮yFK-#_ܢ;j:SS pwKBF ]2/}۪sR\ή^KڬVnx$Qճ|$;A!I ɕbۼtAjUMriAKۮ|$xQQRw žBE?x0Zu}[ѦSGV2s1?,Cu_hrBR3^}u%mК*LtF]nmHŐFBcQ%bZL^)m+/bB:A n߭8+UPۙUхyetgm()Xp2̋;&[U\a Exb[i 6t˝0jaiӍ @+P?(77>"S_&&zԫݳ`ɍIϻ:7%SvKMԥ E)RShnd) ƈ*W^2eOF,:O؞"؞0ED#cWuE3TˤYV5HApovX}ׇ9&ٷC r=sP*A1J>5%$~~[],b}=UNU:uŪUmlp qKl#2ӈ >իc xlj,Ns)Ow?h|:Xo4j3mcw/s6LJ 0mzJzSku~9:VAJl.gz[ߙe>dQNE})2_I@g3ӭjA!-&x^B֗ +2S.-C\S^||e%o )Z_U"X'*QN}w]A"Y:^17M5P]~\F62Ӂ2]Yi*uJiחo.@ ˺]Z5V4v k|cO/%Mci:m(^A5M[s\؜TuTZ4KO0m]],m]$R,25i]MZcn :=Ierc^w1Q,qV VYt{u}B`-6 ڃz@T){id]ʖ9ZSaeZoJlFqh:!vTbjUOT{'P`^uc\ 0OVDIuvv ֔ϕ O啂g0fm:D}ꄗwJN>[4޹w `Ը$~{_C&>S=JUWܑIn]"A9͛tj|4E(?T{N\1:ވSL3=slb3I.ИCw N4VFC%@B49-)DmIo-H(EuuIE#6%_+lKnd!6pP/[Js>hgZJC78Ndζ Ƀu˷ݴA*ACmayPnGܘ;JDy:EЏXi otEx kQWlլ77:tdEׄfc*SF}yܣr8xʉdUs#?a݈aK;VC1+.u 8H'/fJ7@IJ*'';8e)Ϙ s[=v.* Q.$@ o| KJL\H(#h$T4EϽ ҏR>K$m{YqqosՊ8pAT$VeKs֎рMB z]k(PTxQ\V4+jϐvdَ g4=ݫŒB* . MaF2,.35G)I$vk r^Q9JG((> Y5Dƙҳ~YPh4CD[2QURHMF ąU}eYaڮt5]q#4cs/Pn*YOFWw-"dffPI*\Y7,=H"i-q}v$f]W>~ڍ־T2xw'xI}U1H+pf88\fQd :MHa]xYBV͙ٷ@%XA㘪<h;0clY DXiZ R! 9i˯l?y)"\hV%T5 /(wjjeNog3+s:+' mSڍ3Fּ{ / 0RNoK*LRXK IGOgxgSRS4Z>$.VG}op_PbMd}vb %_ő5ueoZ`c_uC':i`J dZ?)a"&/gEAjx 4;7f2Q]݃PVKus:tݩ24IWEgIJMM葜YKo;^nNR>b_*v%_4Kq(Cʵ{ǖJT] 4NkffUfn )x*4a;\1,,(T|{ ]TkJY ^K8 'W .4my%NűƞjJ_;~}%ȞPQ xQvQֆ[mK2J CWɐ[Q Ön\$Ǫ0'"Qf5YE7 ѫz GJZ敩RR,HƧ kYNRp^֦6ܓkjݣJ4iV)BXn/Mgw$ S%X\ְv(C6fi( RҲ>49&%qАQiFCWsq2tggNw9]e>4Vl*MvdIQ׉e2,8Z"F,iS)YI"[e 'jXmhrΗRu*{6HIժ.54d2FL]XӂY a/թXIv JoϞ2v9hXj:.h^PA.#!IDX*%eH?^4n]LhuΆ|2mfzٺ}b=JS'v<*%?xR# ޻wxXgI\ '+0Pi5{Uju#3 RoxgAHM;VxGFP{ "@eL+(yʾ ѓ}$vșrK *+sXxs3gW{$yɀZғy-MP$AF)C1FưW-" RRL&!N'ΞV8 8MIi-ڦe8-ᾜ$//x"w w.iTϥV7́{t.3zx:wĥ Yj gAt"ɭvf (g4*FC4z lĎI=0Z T  cnF+)zt~j@=X 颦W^];|Ԛ>B/I:+ѽ ՜)Wy9AS{Ó{OěVǠJh'Ss~.EyJNo8SU9fU8z/%1958Ρ 4-TH|̶' "3H]M}/嬃AoVx$Nʳ/}b5_أ핳P@ީ;>MB@Ykv60 Dγ6ہQ3vǰhME AG}C D"jోD`Er?߇(˺#W65y-[ۤR{^p 2R$mztNR< ;WPDY14rX?TY+WufG03]o_r &eا4LE25?~hT4k;t 6ozY{Y>bh#7-(bt4%нH~ z>~!WkAcw=e$W+(.0, 0h14҅؟% 518YspĈAEoLylM|Eo)UhU_o[[ܙ6* +2W?e>:⃺9Z).k;SĨV'wo%A%ҾLlTn;K"N链$l'xRFD7BǡCxD1s0owZzV&H6< uvݓ75|K2$[X /,6Έ2b; l gKw'r4\-ݑpMɊ+i qjZ+fӯbڽе.Å͸ATחf@>MصݖR*k5"-wٚIs* aPS`(/F-HVD{5Ӏ}D؎"{w=^ h4@/o5= 4bbx*jv5嘳Ǝ ]$4}yqX҃ .l:/Z$)ae<7XuLً78>&nQCۮp j<m:r"_U:nɮjGۉ}h4"ˆtnVό' &a[~5VʙJyW4aN<:1Ӫ8Qf(OEW0%.,İT$c5^l,MZ&.ؙLhOV!:O9<]ᓠ)`a"¡8R20>R58C(/Cwぺbl3ҎwI(1Y=Ľ\T3UNo?}w+8w?M ycʎ*;RQ0iQg:rw܆zMeQB9$m}1q]|4#pyWM>9zS$DZ7}Oí ; [s!]x!Y}H? bV֫(yB+[0ԵZ1OywY.S9=4`ǶZLp|RػS2+g:7Sڌ>LΖé1 i>|$=AGѓK./JV 4a*X_aV:nJK [HpQFB+7gxFS7qaoi^]`ctc`h<e١w3RN>ll>g{e/lɘO_85تvThpCv)LA}͘z %_2-WR >aiJ^TF2f.?CK $A]ED1 )ob szcB;c8l kg"*"U%])ˌC;AWĤ>J_u9ܞ˘9[ϼD*Y B]?jLnJBӚT~>#*&̊dj!l ) uDse (f\T'%Ee:Ok/>"&ՋwUW+9~]~%Ff{lԸ2-ȇ`XuT1 2SćMu<|ÊQ A;Q%9|2=KE-zRdawN#V)BSЩ,.]My[F$WD4[m&Yk/YNśJծhd>5})_-2xjnSpAdVkmG@h$mi1bNȠ=\$ˊfʟ@v7p>W`Lڙ AepiPCjf" WoԺōiVV.h(3{5(W_+ψ뎔W*oͳiFb=@s` 9* M|T<+YM^ 0VFϨx|Uyg:VQ{MۙFOx#eEPG/EZʦ9;iT;ؼԣbj+;p+"t'A6U:Ç!4{(qXiHqV{/NeXfoF2 _䧖Lٟ㶡T7wBNx1$v^T+v}$\7}{OGVL'oUW.8H+E,(u,J77ɿy >* Kǰg8'qLmz@Jgc/m//-8-O6tymAu˃xm{hpkXX1}ĆIL[+B ̍$fz 40 vψU-AhAJSi L]u={bXNNW[n[c I/¾ns]RjVf}:OFޙ<jdJ#'7*793$TÈJ% eS+)=p.'^Ǘ1ڼ{.k2~I.Vd tѴ3zt&m$sȨ+p|A=pm4nCܘ6ܑ5PwCQ׬بy5PR6ѥ؅?EMf2(Q 3A/A_x'TGGs|,-Sg\Eߋ32(وTW9F;+-))␑4?`Ҽ$.36Gyq'9蚍5@#fN2[m,;/ݱSY`N˔B}#S$4"4?0y/=PKdȁ`#zIb/A#{wRd;&9pb;#4 ME){u>B eV)ԕM>tŸX=SqgɬZj[^0$,Sl9zWpNY}4̵\7*Sܡ9.i(N%m>ޣ&wlm}8a*:E'-`IˇI[I cjSEʅAC>!\!??ݪ\3$V*OCa`R[Q : ӳ3X%nkJ>_ GԱN>GH~u-Z]7/[qG|Rb^RxH"` ؔMa7u_W@ ǵchxC3JE:Uf9*Ѻ^/Jؿ 7MGi;,5y\L NAl1^>Fd(R`oZ%Z |6)و1qr =P/œtzކ,OFԄx$1ܠݐ>w> % Gp 4QvMfP!mP-.%Lf9lMN.ۑ0ķ,}NdE3,٨ d ޿mi잓&7|!\kڭֳwo۽m. `8+R!ގ3ʭ WDSa8lʥJ\p5|vlZxet_JmT' I*|gUnD^'<+x[f}\0myҌ:f5a'ڞo+ڔY'uI$v8wxH)I~ u(栮|QwyrSAuJ/[}_ au(|{a j2=tc_{ۅ7T3q9&a&.!{%'K|q/J^2 Lj`cj#L%C5:4DG﫫Q u !s>ˠLUڸN2SQ3rNWvĀ9}PbN:Zr\}#^ UA lzhCd9E[ǜ3빳̛c \U>Q, :BNO.ϧh|u >c g A嘗"҇nnD}LQ-Q8S&<@mjgܗ4I;LeMzؤئ1?쿴5`姟_l>/ϟi]>-jr[u\bb[PigX D9SK 4=1$0"#A27oqnDTD_6?>')[5dhM"͉V{m4& kҚԭLZ43naU-|5w n .w1VQk9޲dt-f掳0p[̰Hd>NШv=@H\~,LVf[?6/#g|]l6t PG WSt˥4wKjc-i-2B&RYQk/͵*Ƭ46^)x& $TI5; IDnf/Ӝ ܃t$TR^K  Kù\M/ˁ/Pji6ЦER򒃥8&|k;A8:b!Y% GC„_ɴ q bF+eI%ɠVY|oڛ='/ v:|KN#F1ox 3yC(xNͦ)OaWE D(R.pV@Qd)F?=oF\v?FDB՚ *zJMXKilS# 4~4*%~>? "|+4gD::dҗCfUc&/y-߉8th|X-N+. nݪ :VmrTN/3n)y=]icAe Q7ѧ !T.4KF}̊!3P%+ѓ6p0NLu",LBLk (6$?Q (b-kLrot*U@tV۶8R3H]p]eFDdgmM\da&LtQhu0ZTV엘ǢWF~7/B͌6ۚ'ށ_ήqήm[nV~~8-[}n16`[_S.#)4D 6_ie h]wn;gg'0;^NDL j5Q\9Z}zS¿E,EN/b}OzE=z9CB 2qm,g&|P\Ԭ7tZxjJՎ30ؽu(G֭->pQuF΁Gsv:Oe:8a@=)"uw½F N2/;:':>C!cV<0`Нo˽co`=O|ҐPQr袨tfCEF%(>HKu.b.E"]X5*qhxC]o~{#*b u^O|58<(lB 3ϳ|Qr(ϴ]ƖԯLLkk =C"0>zHJ߁ hvnfU!=&@m8c8@ s̆v:$SxVܵmVgoݼ&M17.NKTY7کt/o5=7 )Y(q]eFG{M^05~\}ϼ5Ee_`l]cYκffl)q\"RM4=[E߯x, X1q}D)&P6}C|Iz$kiϯr^)'  v6-FzK؍Rl_: !2"bs=,}B?0,O_ntw>O"PbQU>HWalnYu@7ig)fu}:TH̞{i'o7L&gߟTS$YVjB#=3H3qB O;|:޳/vudy'Dx5ԸU}^mWYIbWkyJʾ{2"hpbژFztqjfjDh:%Fkb֧BBpfN*/Ę.v9Aal!W}7o|]ҝn3-)˂J9ϼ Ly_E?opϨw؈XĐfOsƚ&Ws8[o$-?43='S퓽8?MM.(Щ̨UuD_{2֕^xeQȉGcV<,>[\R5/m!R]dž5_*nSn ]R3zx#‘c vYxnJ=kRW;grP7>91>_S Ybi ˛Bn!/.fi|ktGwd]#tNIN!Tq 77Zvnx~&߰0HU*$Wۄz8zuB=M!/T5/ cm6z۹)`kJ0j:$?70K|? Ĥr9 ~-h`j,zKy 4t{aH KLj9;-JHOc噃\5f2+!2Z 8ʢRmS#dbLU\AU:hƲP9lj4fy7񆝩wl: kHfSڲ,Mlק [ 5aLodtj,F㳪FQh]*C%4E</`3E [: oa]&$Ӎ4ltb!AGuЌǧL fU.3ZKB(6u{v6t%$cg _<=:ExlnM h~ff5H:xNgBP%y`X8)i>t7R]T^R QCtajjx&P J$8P%p8Ҹ2lpp6I gWUl/Qb˪\!ye5yYv㳨,6WN%~SbLGqZ88,SmRdM2pݺi ڷO5CTRgVKS|wGQ5/Va>ij@9dbeV1s OW˿* \`+)iWvE&״Ajݾ^%ceژ2?wq`t3Z|TQX̤Sp+4:F7aN(\p-`]ͮ55uAk:]uj <eSiUNles!}-,>^:(DTqԀ U-E@bfSnLRX)&܄qĴQlSi5s8:U#7<|j@+}1tB{ YCv5P0RO;dff{i]f9 ;EJ\j/ۈAYoKk%׌R'](}Q8> Y+;UҖð6:2g!ϧ:P9.&VZ˥>5"=?D)`RWC_%f?~Ҹd U \aoۡn!{"{6PwDLlݻ9ȪMk6M4KF# ߔəsP#r͞:Y9qTB&bxigTuI^.uT`=7|-ž4!P{<.]i^jS㦼Ѽ^tKɤx=ϦGUG'Q/6MOl2 55 -^)u13|݆z׉)DCR4 qUi'Rr 7ˮڧ klTyĿ]]Nq|vV\*j9/,U;>7R`4̸)"7 >ECw uZOO;Z{Ki<-X04鞓SsP#z"0v`ӪDkFKfiK:L2O[,/(8NN$F<&<f<<V<IWMHKH[o~[H;Jc;F;N;A;I77(8HOèwmZ)TVc'7XPyIf ykC4h=3CN&#o[!V}y&I=h=|~gq0uRRܔ1N)7tJ1;9Ff=FfmJBM߳,^U!F/ܹU*JDa9]hD@eRЎvf?tKe5P(#_1!̓搷CX `eHyIgv?v2=Jcћcb_#PCa}0"hzŒr("d:gl;Pw) EhҎ~\ɞ=&j{٭;|ukB;$<@~&s$Fe'976잳zs2cќq0}0`gF Hw:r)qa VtMJc%*)5;ė:՞Eδ\ojWJGcku]%-" ŭi,# y 7=1/r֑!oQ<A];0_O{ J4vۮO*C}pʀI6Z4Ւ#{R͔|4%W4tiRus{SҨz5$: KӲļ5׬*٫ChBOA| 4퐍K~qUoֻ_lFcBla,SZ4Xnn-,Y<Ь5FSW>]r65ܺcC=6cl%vk_:cJ5]urkMY^È#;Qs\ҋ3>و66 ,N73v弔$b_;sj)O141ЛT΃ al*ƔR4ZSzCM *z[MsW*4Ҙ]lL.m;l<|缍;wn<{yb:۽cRm8]&Y[wn>lܴmo}]wt6:lܹ{sossvښq]^l4Ott OMFp۝qi5C6pk22'5KncDe\/}2V{߈h" Niy֐kyڧV3vpl kLF -oWcL1s •ps`hͺX@ס4ӻ]e[w2vkK&űlat,?:Zgj!7=9;>9^M;, Y?6`1N$̓*aE,"`M;]a{Hk¹:33_]XAKZ-Ei4*$-2 m+ι2ϟcY;;ٺs#QܳΩlٺ3*6d+@,HB|!expY#?8_mX4bճrgl=ynlܽsmo۸}^V*֙;ΫE]r,+8s4HۆN]4$svbv(p[MN@JArގ۷e߹hHj޸#=Vz9"R 2jZ.uLR`K-Pm3uaohlYEZhYf涻ڮ]=Qe;/N H|&ضJXp\;;Om3hb GZl4\EBF w] 0!d6?uk[jD:}r8!XΒmٽڶ{E׫j<`exQumg޺%Տ3qeQ|CΛr(l9SoTc\-M(bC)jm&|#2Ojtb$,erXKVEM%aw$|2 Jt14_@q9}@ϫ}j6^zs:)"֛W㨓S}TU޿b=HUO; 7BB(ûBpV W֚8kr :@,XYֿ:8m%W:G0)Tx1/kO2ÚY8ytioh3JT^;vKf$R7QK݇fʚRm;"IhWTW*w0Qeo?geR^X-#QD} &SwA3_&~5ogިѠq@9F'ΧYc8m=rKEpKhUXCˉdDxDJ#%!#SԛRp#A;Sz DV5^r"[RVJ%Xs{(d[P"'|߯bV\?r:jnB" W%*!c_Qr͒ش )_\UE/Կ3F[ uf?+pĆK۠;DfiD&tX"$o MEMW!E @ hP)|3jA"ǿAVA?ij4 RZI+:n>KlQ(A/ae `m=xpgiq:ieּ z:3S,܆z^)'`jNٝ*Vb26E5C<_`wh***-2bx֥VUQ^Z]\JϜeW\ /Az`NNZ)Tͮ\֧"DlIw!a Zւ+V:a ^˝Y`?@Fel*:<@sgg+Y'G`R Mq{dpן LEZ((_¥T82V)PĮCQiv.BލR7rKq|۠HTRTUtJ1eV њ>Sg8[Z8K.{)M !L+n> $IUQob;{Xwgؤi~N#H9"UZ3`ͅ6L2?^K%QmMu jʋJSg+/T}=8zU'_p1z=poY<ԁ%"Pj@+`@ûuPE^O4WjPpL\ CࣾG=JE}8dK48АGH޸$n>C(v>#%&_oͪ/*%|C=sP }%1zԣ+uSڱ^s@RQB;#<+ mr`(FΝF+:,Bw C.xko`(Q|m,x u$ӗgVO])h5.c0XArXW>Lj<|_#Ẍ́Yu5|KbHІMpɴJ1ШOA A={<ŘD{غ[sT0L XYLPbx3qX<Wؚ`fA ov^4.]tEZ1SH> #1(Y>b#m$KeѠuo:y;=:6RjK~ WKx=:+CBAkl_]뛰85%:vޤ6٨%J*wsbˎ5Ӑ@ WJ)HTj5_ s&Tit],^B)% O0;v׌\h)a*"1 5W>me9TZ ' EU-v{40FFbnCV2VCSLJdNILOO#z2(Z 6$k?C@ Z2Rr:GYHBP6"9=Be{'{TgVWj{ 43Jc!x*fe"kⴻ! u0@yu֭tvjE&|Ȱ'-i. TT,4h5{(Ԕ%U+xanRSx:NkxV qQF*IГ[$+Y?EPUw~vbosxc.Tn'LE3_ u}eJż:c ge{mWgk"32նt %&lo+Z< iԪL!sE*|[)zޙO42W5y T`k"ci-v ;]ZGQ nKJLL.b8qة0N= .L>Ӽm]@Cyk/!6Bܑ]<1䀡pqg741[rH=viws]-cP8ԴnJk<ժM/ut7U MK;Ű4{ )addzJ䯙j7= _t$nJRM%& R%zG; w,PSjn B6 nرέIbp}$U va2Vs-ڠG@Q.ᫍ2?֌|PfpYw3xO cmf;Ota=hw<TE(ڰ;."ѼE#E$X|&NoޕciZ58nqM׺*w6 6&К|սM%`/܁j[,!0{Xէ>2 ^dG?IXnWZ[J^"Ï蟐ʟEDP=\^vJ5vBblScZ]5A0:XiݹŎ B$ )S{M Ό-F[kPAH{e7^`0ِ)Xal" nZD'M3XF  UdلA#C%>1wYOT/z\̭Yض9s9l={s֝[MY] .jW_lt ]癎\ =ЮS:۶߉Qp(Iڀ\$,y7U'Sl;پc9'oxx3ѩ.v; ĺq^:y@nglPgP\麮N+L(Wn%Gt8Zi얲L]x-KNγEE/YT/˅6Ohpj]Q)-vuW{ȡGg>J1i8j9yvyV= K6 4qvb!K3?sٔܪvTdty+ Neؾ@XmΥ1o;(-Se }֭Ķ)")ͫZ /*Ei6bhpj(#O>?-zn]DhCڸʒ^NEI"7pz\J'ҿ Uw+ OKȤ.@jrc=$&Ņn= F@r ߷(k Wҟ:JpM7{_ח:i {EdF3>:=Jvx)k*nH]]xRwus /aEܼoP`2xK㼮[;ݽ4f Y,Ŭ_80w. dpR|Z/X]ga>h<]E9k}_I+ ֈ㬎ڢ3"wOr1gNmwd8x-`VvpokNJ ]pG8\} T≨ W Fcvek.bǿ K|,rxCd2r:m-o6AE%hMfFhC ׀] |4TDi&R=vW(*{x+i.F a-Y:v1^zWA3Q [fB֮/ UH">jkn[4ɴ%30]:DB# u6n₣ډ:N6\6>Geaݯ;T.tP ؀GϨڕ jPԻbBDʴVA5AB jgNC6V+%`Ypa@Kp^I/aj#^lL(Ivk9&x{x<6#ay\>"qqz6ijW.0 8Ԇf.AB j#t#ՅM%݊;]pb\F<A˘L$~fu61!Vp\v\m0ZpDHS!"nUUVnZh#X2Hgx.)j;T{ɪpڤO/%rUCy͛sQcQJ<}Ori+hoL *c;1?zMaR(^ H lDcXܧ;v7řdfۇNݸr՞ZWk""+vf9AzFA ɛ$0_k-irgg֒dOKzxXoz[6ۇ0{aлޤL*bA#Jdէ\-LIgWuPz*57:vE\Q[OAM\/&؎:}H qUhiH5կ)4JE1Qo,G;p &:S 7 4q VT>B(CxutdMc.RlUR[a'BEt`FmkŮX^VF2%P!`}[vKhuN=X`-| y0[=>>c[=UGPߑj8ޓG\qnXlaijuՙ, 0ȣ촯-Z$v3-u=qΫC}ݟ&ޝutumf`e_eK6F^4ʗIɱsV L>2L ."-۞Fl. MڮnuZl}-1fT:iŌhnJrK%ǁ)ZZ}$XuN &Uj*nmw3!Ti{dr:gC>65&M.{LwENn%74_\mV9]J|7®'yuR椖|(ΊU|fzX7v-pLN[. 5듬j͠5=ri5ukw}\8R/(]zL,uޔi7AiKLQ$9q@ȗixLTս#;]tns%~95F%p5uw=]Bhmpaڠ&`O++n+80ikJ%<.QEQn > 桑6/., 7sjJgZ M9(?c>T:5E qD,QUhsiźZ'!7T:;kfh֎ UVaqا}mYuH3sC;QQA}d#Ӌ@vFLKhbC>#~\wMp B5:Ǝ4c9L;:Mm}mWykrc#. e]SN%:yxGu0Re5Vn6s&lomvUo*]&CWyOy0 !eVO2LCsg~(B(x4ҏ>B]!Z7 8ĹBm(. TЋ0L7<1;T$y6TݟauZިV-F ^vf;1>xMC-,>EԪWøJ7~ʌă.+T.QVw+S d[sa`D“"J (~5dHNl]:iʌv;ѝKxA:.\VXW:;Y͗,֕^Vw fM"-*á -:z 0[W'GsZHz}.V˙o$-cHN+* ߚًT:12@}3zgg1ǓTwXb{=I$Ԅ)ZAɱ1GLIY.U@=nVI)*V.sO-\IuE9qQw5 0;kS^yhѨ)j EZi#oN)iaNmZ#P"ࠡR5=l$lQ]$̗hѬa;EIPNt|Èآs @H Qq(4:O5Ub[1J׼[TϮ5b~F|B_ci7=.qZ-}dơ.a1_T]6!2,88{hq߰AB(Hwu*6),<*r^[Hmo+@,񪡆pw<#ߦA]g쓱8T]v©eoX1zbrvz,Ǵĕ5:ZDK`X@a7aD;Tb]=ua҂W_Lxxc*,n>"c}2Psp ^N8HemO x" jP@)ҙuvSpc'kֻݎZ)8ݛ7 MQЋQX/,6ZhL rg6&vuzHЗj{֥V{ um#ոsz]6ѽ4c(t}qR~nw|&v% !?wM"fcnČ jNphjʒp.*Mp2;/\e=*`w,> q!͐R$ +Cǯ~}_~<{[wCn'_뜣c~'Qh: j^QPW|[/x]ţz[Oy{?y *~Tc/u|~? U}^nakXKco+>vR^s}w~r(5 5Slh{q:yಷ t; V} `շc+co?x5{o}7߼InK SǮ=H^W>+~3coﭟ@Oruqn@Fi0޹r[?[. 7WS ꢺ#?5Ʈ;%uu}Tk\coȽ~F" xh9zmGGH@5p˃ŔMCy]UT:);/vCvxpLZ[o>ve\r{mrDxoL?>>v*y5҆= 6,VLqhTz:|m:>O:գ˱{|j,Ԩ9ԣW/SP[/4coћ.UJBhzo}ѫo>EdU_nU۰iYri5",{g~-4\}GػV?>y5?uOW6pMWtjͅD7.;-#kG1Q>p{}M}7|؍}co?rM}en:M};Ui.]5$G?@p-Uwprvptr]767ƞ"6G3ԝT~o((~oDCћwhwG±wֻ@]vWm4[.yx4cWPtvL?K|<$YkK$qs.K}#mjձ~୯w^P[)p_.=#|G?yS9֐|]. 'bw#P(q_[ju2 e*$]ezn[!0{PNe_^Zmʷ^^ *M[_uTXWm<ֿcٱ==u+J֦Zۢ׏pF3ZkvhE!#{rqfwuS;<4l&wG*f=Hq f4wߵ*m:GYm3[m'V#@3ZFN+CimbSRVԡ0nz.2jA\RFF]Lpņug`KZRu,2ljKKF+5h<(yVӊ̴BF]|)ؓcO)/q 2.ˍo[)f6D\]HٳCTUUXHG 6Qj]pak77̜Rmkoou҃ca$ij7ua_F]'&)qJ8D38?pʔ5XNhit՜)[*ϰLB$_:I+:CPt4ao:Q=>(ELP~'R,?ThfH=+ D1b7b!JQaJq]"͈ TI3Ś$&ҧEt]3c_mpl{w јˉ-x^7,mWT~T4j| ,xuwTRzP΁uWt+7|2Mru57w>EPXD#9JݯhB 嬸W[8*bVeόyޟV0]5׈0k$\6yͦ(ف!JS8I U!enHh-8I:<_'zU6s70C >-`AΖLrGacL;1Cb;&z9ա>4Va:H:;'0%Uz'Ϋ[j#ڷM4m޽cGgb3={7{-64hn/KӨiU4W:a j ab2Tj.ObȽ}3R)ų{ć`MQTp:*Q6v,]6Rᱲ+SxQK0Cp"dYe޿PO^b62/UIg}I`^7 (`1R}8W^:!QηRO8O ʡXO}m*F7**Bk<ĊHlDHkS aB4&ci+Ϻdoҟ%Hi=> |&'Tˣ9|gELCSMWC  ^Q=bXO2ItkM9)rγFTnȁ4*;hJ=h3@lT^E]Mh iS%#c<3*Ae@^CddPPnO3lӐϖApE2- Q]8+CI;=d٣VىvEX5&8^?ft$7 f@C-0 $H_.l![-WY%j@r.un`Q 0XLaL9W(L_B3bh $!.Sl.7%vZ7$AE(ap̲/Z+kbDaƩ9&=gпgDi7{h~>#iS't%31TX{twiJ)[ -0يF@ClNpfOWbg5Eӫ1I 2$( YJɴ$_$kVd<5xnuqO0 SuU0] I+bz17d.!Ҿ84>`+i>,JhI^hκ3=(ymNϪjGKNac;@65C|Ne"9l8#0c3Y"f b *= ~3h}'+"WP,,wpѶ02I 8 f̩j ak0,'_ժhEٺL@YahQ 5QY3*uIES]c*~tUʂ0{8^$4izؼLܵ\̪jc0 #azA`ݣYjGN*~uLm WPӊ"jxNù!OpzS|ùA+ Ak^ުYڋ tZF)2u5ƪ0e_ @~Z"iJ6yyrRKiYAf;Eg@+~\`&PsJUUXd@NkI%ٱ꺄gQQ2~R\u )Y|NM;yR ~n: /#FZ[LPʡNHit.sA1/`[|3)~h1ܑRѧ&+ݺ?l#]r L3.Ċ0Ac[!Uua&5MLs3B@ȰMﶪdH[ʮPS ,4 j\FzezxEo&SFӚ=(ya0(i@=^(my+G{sP =UMtVˋzΒ^-m/Ev>(OFVؒZ9z堜Uʛc{BFό){8qicUv77Mݿ่v1D:ZMj]o6M{TwOrU.kf~;yֹvCM#Q ЩFcQjF7u[vvw(k# Ɔ]3lTK"!2nMZ;=y/rcktXJ*cp(7D+/~y[˸`b}p qWfەNTw¢tn &we,BQQ^=!Kp|5Wl[= >4$W/an{Yy/u]^P:2ky܊yx.4 Si2`V}BfsPǧxؤRj֨-B"֞9yS.|dUK Z>gUsʄRЩM 켣s4fZ_mvQ.ue'lJ;i& /SߚZ9vÄ_:7_TW=h9;?r#qk^'ItUBIJVbV{9r'ԧfqD5wh-euk{1ѕƂYu}v՝ c\U8+4Z#a|3]AQk`TJ !=}x@1]^2ԮNgؠMJQGZʜ:| ԯf> N _!}'򠣅jˁdݤdI\PL&yn[2,p Bܿbc_fTM"jʴ=+/8uΧ Uo"]]%'NBz<" *fRDb\Svz 4Gf@S?`p"wwXj^NtyqD^>;1OYBK߅#ᏕnpKn%gAJlT 6Cۭ┺_g2Q]εڥV{ɱDB0ur+tŨIpq!-u<][GDb0=Kɴ/6? |.0lj(/ 'YvCΎM/rN *-U;4bM,--i%Zi7qBP Dl6:+ -&:pn|479@=eA8[͎OJ [(\&;J|q";L^G<P%d?oK;:g's9{ИRkR2h,x]d.nى8);9:1dVZM{Fi>6ǽT 0ub.*N=9VcI:7:DbOBXDd851,Rcy'rT(XnIZ\Лg?e.Dum/_|nr'# ӬKDͪ-L/JQAGsxLGf5aheh㽭<9^bA6%L8z>LǃI$X6!z'!E'œ@I:۱G& $? EV0>6ONp'ǣ>I)C}c ,?Lf'4ԑyJ0pP >R:GtĠQ$CvR>LE ~(L|>Ldy"ah$bd. Z_})5`46=qܣ&aǠuyY>K$c ұl6DV 7d\g|q4ꃟ&@U'g;6E}𓌎O B?x?IĒ@D A "5>=H'5[N h$1>0.1:wއ15 KMЗPAG! -!T q?nnIff:2$)gB6tB0ɘ >19 /.CňADr)c0&ǂ 1|MJskL؄6''Nx!Ky}X Jc MJKB늠#^Yf~cs%OHmX%/r`ҎMK"ύK}y/eفCQb \4Idc˨Hz"Kӌcs$FG\(I8L Ec~k}l\<0~Q cXBA6X1WP:V)^%W|_c:>4c"jJi,C֏1er1^>$-n E RУ"?L((\χ\~4CqTfBG|.v016L}e@,=EZ6WZ= Vƌ.mSI 2?Ґ =IZz׫"QC^ҠA ԓ E'ș9pKo&G2*+0LDFF'P=0 1hb"ώi@L@ ==5D:b( `Q;a Et^'!x (M}8W]Nns#y0R#őAFGFG;>2NL )P\~Fr9O#0RpQ(("4>2 L&PgGFr̍i<G)ő1OGGʜb/K'FQ&zoq_*`~d1iRCwlёBqd1 d?La|@DgK=H5IU2_&GYz@,z2,!?R,CnHՍZ%jc+[M&9\FFsP% iQ)Өz(XH2p Fk87u=JJG'RMXGr092ZpsCk^ܨ\7?2NYRS`*cWLGLG̔Ԭ;DԼD%8G?Np¡2Ny*ܣ'H^x&CS,"qcx ygyh3ggtch[ (ZfBQ(8}̢*+*3y#:b p#ݶX4#1LѧcFt u\'%qL hֈXLcKԽsL=H?7#ݘHcCnG #:7Fz |Y#:b k*i/11}#X4**T `c"&'P9SǠx&11oObhWZhqT="՘o2 sq0fULt`GsͫG㚧qh^f7g $OBɸ)* u:(AL$ I0#[H8'R*5#1g!|6oDG,bȢCP٢I ƌ%@4L5N1kh~k,O<=!VLJ< W:B7ϣ?GD(C<'$Y4p<,3ϪcF'PxvH44]ku<͏b:y#fk=k> F6_A5iBմ/ Bp8ST,j(*Zwן:jxEU`yL^TLVJriSa.]Wy֗ڳ iOzin zT ei繻^Jeؙ1bc;lUVܱcw 2VZnl z_:KG.~ϔ~(cFW{]gU^s+~l%WqU?yj}%S/|[|xLP~GW(0~O OAÁp_k_+ϝ5O[S˳w>Gߥaz7UXK[gye n/& _ui -7l[s -?m5L3~џ|SO nǩs?#{or)S&߀Po!u?z%ݷ1fվei̞~4?<[_v=`8n)_ ROEG.W_}t#~ߗ~T\ŏ9N?zߗ]S6*ԾçPo۟P8H s@KʗF~Cp~C, ^2F1ԾO>o?l"(/BnD ߞϊ |caoq p~Lf|}x~~ty.F0oՅ}euOxj#+>[?ݟ}ïWfgBKF}6upa9}mSq~o/?I͟՗ߚJj~_?^rAGJ>kG_^Eg ZsjOU\c|_A1Wyo^߮oGQooxߊ3t8DwW? ? ~)=/./6l^O~V>O|sc_/V"sW?/q*`_l\᷍6"~7Hlm}ؿ~lk%ߔ,?G+_8;Dه˃ qʇV?v'_&.m}տ~l׾oOqG8߾gA?qC0AFx_o?/6q7:ޗ>[y~_d6?~m~'8W=G~P8ݛv2uϷiV>|9"nomI6?va4}Hy۬W~Ŷ>[@`YƇm~'ϏMlV+<9!Ȅxp-?ʗ~犩?xb%>ݩXcY OdVߧ~}NJٿkw7oW\wM1oV=٩U[1^}٩37>_1į\Rp*Ϯ|d+|s%C~ܫJ/u7߄ywϧXn{T\&Q,);{o[~c)W /" .)?)SC> ;}&'o?ߏ?V c{Ap}>?a_8yܿh(Pkh|1>B?O\>~-~7|5\XkYo_ N!/5]'uN/}5??)_O7}OYuIkGfWʋv.?/P]1PST{Zg?gX_|ؓ~53@_NۯYoǁ?@?MXo [/@I9q9(̏Wc})_ӟlA'_8)_rF cu~0ܔ]>˗V? ͏:D/c[?ŏO}??w[Cŵ&/~=R>O?tFp"F/Wx_QŠ~oǭ?濧}Vqѻ(_W?vCY\l;ϸsп2?㯸.bwAƿ~g)ANp(>W~׾2ײ~/:1n~D>'ĕ剓˯Hvln$7u6U\X+_|jP%n}oOm3@}o z>*>>'76M,yUiӏ ~o,M~O׾?|ӷZEl_[Ǫߦّ|o~|zjꖧ|>_#|ÛNb?oRxgwQ a x$OP8;?C>Eϟ9 P~mHV w<p';(w<—(EnR= _5E)C)S?G- JO(o?gM;ߥ_w<_Sw  )\La^yBB;:;RXp²~+(\BϗRxWRLr ;^|R] x(Uop57RFBx~;Q  . Qx/)_>@& x(P0w<'(|ϟi YS[(|A6 _p+;a5b/ :DF3"&`4%hēAW>sԧnO>=~3z|Y^u_?2S&]ڄf+ 潯Zyӗ;{O'9kV__7Q|#;WL?)gwV =s N]S |V_)~/U.3 YxT\\D7E;X?HkG\{|qKʻ~)8x+/$8S|S&D~[6w8À3O/.=qS<ߧ\5>g~3?_J/p7 mg}S>G&?h}_<m R f) + 1WnV>|μ~8E "~[z[ \z/ Wh[6m㛍>~[z#'IS'Dϖu crdjo'r-%ߔ_#_v9j~UAOi>_HW~O, IEHW8OI>K+4B~[ >/mkA_?~_DJ~lw7QῖK勣J#w$wrƀsJ?_#w=K|{~sQ ~ o$&_k^~)_)__{;Dy||,4\B)ܯS+KWlZW~}6Wgo+\ῢR~[k!TG'7{_PO+T_wQ-/)Kp[r+I>oF|*{Gp1賕pcJߺeOο a_mmo߃/~Fi7Gǖ~fφߖFm^?Ɨ?[6NgoKo_grWej-q/ /?n/lS̟~?nU~s\+ŭ\G~sU??}\Go3] wNŭi累 Ub?6lm~['a+B>q~>a}q 7|W?&?䏸|fg6m~6n8ǭ՟!O\}ar*ŭ_}QK}?S#NJK?G--[m{EՏj_sߏ>[6m㛍>~[z#DϖegoKoW4g<>3F͏Ϩ<(7+?οDϨ<ٯ(Ϩ1Fy3 nkgT?r3 y3>g??g?m+.g`ǟ6_\Ϩi?m盢7|ddW<5?7Hߛk~!x<ͯ<֏~[z[ \?<ُ>[6m㛍>~[z#Ɨ?[6y}෕}_^ZK긼aY].o\.qIR\BǥG.?r u ].2]rKr9.r\:t r\.咹\.3.%s\g\ Krϸ@U꒹\.3.%s\g\ Krϸ@.r9q\.r<\2xrd. r\.咹\.3.%s\g\ Krϸ@.r9q\.r<\2xrd. r\.咹\.3.%s\g\ Krϸ@.r9q\.r<\2xrd.qܼT.q2\er\%r\KrYϸ.8q!\.eq=[eddUs6\Zd]B{x^>oI]7(Ҧ|8ڋ qÏiv~0uvر;TބD[3u6߫3u9gf`7rH?{|ae>?+lgnMx腑ϷO&<lx|lk>?An,?_L35<26Q_ܴo t&|?Q󥛸h΀}onwkmAo}|x~߽Ds?-}Z\4fOk=U5~MN;K} ~cpux [ Ҿ賕/G3nȼo_=wI;_ ˯xˍSB~)p}eoS?2\9tl\ûxa?_g?SS Fw|7ڿ{'am?h7j\*I/)_5u{_rAGi?%a1~Ԟh65۾&䋸 n^|7hn6h".]?%mm~{}{hʃ̏賕O}jX M>ɷ6Տ~m m~7b[?ŵGσ7Hlm}د~l8|-~G7/G6&!><_ 7m[g}~l׾oOqG8C_[cPO>LQgib~O6F~lk6A~m~'8W=G~P8ݛv2uϷiV>|9">~M?b['6?6a}Hy۬W~Ŷ>[ls`_lM> cm?lk|ݹ!ڿ_xf_7)p7Q֟G/8G;&<\>_{Ce n} /?X_SK?'QSgno}>O-e}޼!ڿCtw~$sC>\~s*  o>-}?D><+YmCOY ԯl7>$&>ڷ}"swe~iD4 FIϿ8yܿ}CA7D5\XkY/rݓB?2z-?/+"?(DSV]Rh6GW;hGY?U{p?,jO>6lx߾WX_*UDB}|+| W񇍿l򅔿[Coy]>/qE>u!͏Uև _ض>|B%nlo*߽!MG?߶?_lm~7?Ɨ惮ƧA~ gaV~;`+_\mC&/mC''o}؟/mi|8_4[6Vqѻ(_W?gq^l;ϸ 8C+n}fo _3n x?66ݶc_ˠbmǸ}|W'N."۱AWqc|A嗸M>Ϡ~AGg[A'76M,yUiӏ ~Aχƍm['fk|c럶m/?66/EOǧny '%/_O o:}akAl&>*[ÿ|9WLߞ|tV?Lo_[7H<-.Ng'{ NjZ ~-zI^O79~:!E7I^p\w1go_\,]Vկ~l S*jL}Ĕ/Δi0"UbRe* M+gw<ô\S+xS+0"WGLLܮ +beEYLܵ7ɂg$;aELh1"Y +bELWDf3̯1͂M@WDf3̯1͂g_-b0"&Z4 a~ELi@& x(P0w<'(|ϟi YS[(|A6 _p+;a5"t J:쇠 ؍x!nēv#X-޵+5]P])OwzV1sx_#w3+:BhB{ _yү W?=uRş_e{=L>B+}/w}ץx gTjl&<:~oɎb uBuw]D~B\ 8/.G\8ĵmgkq#. 8O﨔VWЫ=sGݿqcχM )_]8\l)w$?|j )J~2 S{{.ZOV~J\oφVqpqco+\ 8᷵O [Ƶ/.plS~Dn}ѕՓ5o]]٢>quC|_D? !F 6ǵ\\@'m>qm"H(ksblM_\A>?xߝ~υM>6#.qQ'|f-ykOͻ[?M\IW];/}f%G힋%[e+Y?%. y]sdV.`~.#)o/q1dVC+/7NJㇸoKoV~[Ꮻq׾"F-F -~6(׿>~[zojߞ[X_ o_=oSqagj~M~|e\? }ջ8G/](.1/+$.Gn~q1c+38cscµbΏbVqpq_\ՏkqP_\ Jq#. 8S83?qbߖD0l(?m챻WM\$}p~e ObVu:)0;w=W_\,賕pqa)_!}~ߜE~[z[ \ I6l跍o6lmmƏ8FDϖ%.l V~qixߟ,\ٰОzֿGy$Jǟ_~3/kΑ1Z>G뗨" (QϦjL?}#Q9Z~+q'?qp/M\lok?[կGO}d;%JQol | R{ş0g|E_@}u瑰R?(=G]ߥ7g V~}6ۆVw\lmӯo\;m]OsyQO羗g#oOa/gUWZME}%PJ?KZ??D?/6lmᷕ?}coko\'~6䋸e/lM~q~2N>M>wW];|KYq}QvGWlgj3鏏Dt?~/Ӈ}A~ e诟K?Dl %w ~F--[mۆ?~d'}eF-F -~a_Nl_cφߖF[Z{TO] =jg͎K^zrj+_{'G?я>A_F-/OilE?d\7.q#_:f]㩨[{__T?uR>[x}GpO跥o+Տĵo6ᷥo?_/lˉ-qKl V~7wASz_|*j;.ex敫"k=c<~ܚrY}.?Z ?_++}O.Ggh}(JW8ĵV\,}d''ٟ\˯~y/k@?!R/羗b* CSz;WӖÇ??[~}6ۆVw\lmӯo\;m]33s?_wNE' w*qW|17^?s}J1u~>H@6lmᷕ?}coko\'~6䋸e/lM~q~2N>M>w??G럣Gν Q+w|]rW?}a.'ߢsI% 6l(A(>CZoKoV~[Ꮻk_gFm|goKo6~_Ɨ?[6ᷥ6xkZ+;/Nq)ϯ\Uuy(SsU诮~+J? ~VSiϗLyߙү/.?qEW?kmW>_8(E?mW\aO/.OOC<i~^ƏQ_՟W]7|3_>_Wl?_?`V>(>u*J?mߖޖmW?׾?bϖ~fφߖFmٿ/'m/7~[U0}|{BߣAչ5{ G_~//q8G/?s~_vW#3Gi}ݴ>ү՟e'_G7q#?տlW?k/?qm'gyԆ('o]-S~篻.z&G#!J!K)=/!RK!gnUwO@l+>~[Emo+\;.?67}D_6~kG&#ÝOy#OZr(mw>.^)k%}~iHLoφVqp~[G?.?6k[Ƶ~}qG1?)JilM_  j&'33|?r e+W;r/{\9jF|пwE}=?jF|?"8Q}_ Qimo}m7}66mGm|9Qo?>~[zײ==sCOۖWzgU/mgle~kCE=GqXc?_}} QW?A?__\=~D>[/e'~e$}d''/q!Q8o㯸e)ڿl'gmֿ/G0wG9zA g Q+r.߯\Gk_L9jF|c[?EO~?J?mߖޖmW?׾?bϖ~fφߖFmٿ/'m/7~[ ЯhA|oRT%|QJO JG ?9)~)%R>RN]|oK&ſ$NI; gRK>$Ϥ3|HI/g?_!UϤ3|HI/g?_!)~&ſ$CRLI<ÇxI3)% gRK>$Ϥ3|HI/g?_!)~&ſ$CRLI<ÇxI3)% gRK>$Ϥ3|HI/g?_!)~&ſ$CRLI<ÇxI3)~%g+)~$_"ş?II/ )~#_$RFH<'xOH)" 7RE>!o3|BHg/ )~#_$RFH<'xOH)" 7RE>!oHOH)!QC?H;)AaED. ww<Q wYSءoS8.P8n w<^Ja/ (p )PP0KPP0Ga.ТФ0OM(t;PXХ|2.x~%^AUϿC2 Rx~Rx )V^G ox~#(\Ij7S›(E: Rx+w<_ONwSxwRx~(ޯA pw<G(|;?I>NfP4OQ~)|-|/RG(I +_% wQ[~W(|MQ} P~QC @;7)|Ÿw<- C)RK ߧGo((p½p?(Co))?Rx ?U)RS~F?;hoGwoRxgw*kG}nMY[nx6xp^LL ӵxΝNNLTgl-#^VmtڂFmTrݥJø{KwA,4yHRϷ@6§ȇ7TQ e׿ ѣ+*Sop?8/,E?r3W;kkrIg|N9K//#xOn/?/'ɏp<+uͿʹ{Wv A!%'v{K-7l[s -?m5L35<26Q_q|+vʔ _! _/E_R}Ѿ-Kf.˷M[oS'ÁpK }Whg-?y ?ʊi_DHΙeYi$1 $ (Haw0bE bW_U=Sw/}9|9uNuuz~}2Oଙ~7:^Xx~\?N޻B:[Ca+3󽬃q/38U?CjʜDxdf-A䝑;'yzj3Avj߼=aҾCKIxk^:R=kuP]T _Yq}X2kOT^i1_n_S~S+>S"ha)#6d*^ _Tu8JM?W-ڷ3?=s>S޿2ƷOD3k@ _9p|*vEG#yW?C}Wyp_ָeOXwAX4?F_dj_Y?cm|h|GهwSa|–_TXM#9DS8?ޯտi4qx|Fʇ+lzBԾ?꟨2C#Vi|0!|lDG{>_Xhc?/Hߌ;_>7#| G cߢOh~GX&,2֗7zLy]jZe hkA/h~BS?4w0ObE~|!z?G_'c=/Y_=;ۉ|??JWGFۃ{g+b~gqydYh|(-H}|ҿ|awS49 PAmi#[q0#ǧS6χw,Fg|8$<p}Xn{C~0>$o?C͜\ uݐ$5I&o<T,ԿNxœP|#xoևԩK H"2jF?SF/e֏#=u~G>C#x??ig=bA7߻53ʬ _㽡XCk&>w{S3@Ӟ|| S&|T2*¿nZ'kO?aZ_i}7~\1]TWeG״>ZN*z?3*¹E럦R|J,״`/].z~#|Xƿh)i GE/~_m6?͏h~4Dz>1odJjbNFz x‘T?].%7_nź~1ߣ)X|e%h7&/\IR+ҞKAG,oc>4>ߣ o=Fe 6ϧņ8 =uCmVPO/\-%ټR-W+,=ܯFhJH#Ƿ?x4߉Qgn\*fS~P׆EK~o}ƷMKU)\>?@j![SK7y3˗뿜9㬟q1[׏sK؜QQE_5;y<9&x=j1ԆxלiSMbqZbq5jkNsL5&18-18dӏ]ߊ˻4Zlwqnq8mwi&8fkMbqIl6i&$&9fl>wi&$&9flkMbqIl6i&$&9flkMbq+qnl6i&$&9flkMbqIl6i&$&9flkMbqIl6i&$&9flkMbqIl6i&$&9fllMbq:2F[wi&1$V%Vpmvwi&$9Nrn8mMbqI,7i&$9Nrn8mMbqI,7i&$9Nrn8mMbqI,7i&$9NrnmMbqZbql7ȘnkNs,7&8-8voۍcI7N#FCJ{ʔMp܈ʡ̸s+C;b:U]m~a'ͽfѳn埚Ӧ s?S;plQTOoQzgWR-|ZNk:Y> xZ͍?j?,SIp?q ]^QoÞ)V~g=;n+QƏ'g.}9xW; %ҫ% +G>-'ewƏIandߙ;ه3}GLp?"}?sߡ5pߙ ?U}wAW|~g>]}}HD3^C_~g|k?I/?>՟ G G5~>@x~b'[_X}/4)>ugO?L 7i}&lh}wfhG?t[s[%E*;<8][Q?mzӅ1Iھs+"P^\~#p]Y^1^G>_-CK8Lx,~%H?H!t~t?=H~ԾC#C~4~pZozه~%܇2~.|[?Hﱑ1"τ+_jQ?;p,Tp2xd 7gGCN ߁YPcSꇑp3h/{>S GTL/܏DSIp?ESn4q/r3d?/S=qSd]'?n2)lD7{IQ=֟_Ҹh#VD1?pױ~YB}|~#wct~t?=H~ԾC#C~4~pZoz~Th)zV1A?;h^f|A)xK[Adž[xz+;ƙ gLQ v[hg*s OLT?1C~fj1}{sx<]vE@;T%l O3_Yg7^C_?FG!L~T~Sۄҏ'Zկ}m/od_Jmh⯁~g ]P]Du#OwA?%H/+m_~wkJ2>Eퟠ#~T&\?ҏoj&\~>>M#L8OAO4/L6{٠ >A0/ILh}w7{s#~ 3Tce?j?S~e>c/?&d??1?(ԿLƹ_?iz>?O|qǷI4i8CA+Py yqN"hه8Y??r}! >T>Y?A}8돜?GQGL+#>?o>ݏG㇩_K}Gf?[Ϟ;<[~nܺS|]Ϋt>y>]Σ9u>s.'eK~w]Νyqϛr>w.ܹ/s|\ΙrNr9g.9g圹/4!s_xל3sr|\ΙrNr9g.9g圹/4!sr|\ΙrNr9g.9g|\ΙrNr9g.9g圹/4!sr|\ΙrNr9g.9g圹/4!sr|\ΙrNr9g.9g圹/4!sr|\ΙrNr9g.9g圹+s9/r\Ώyr^ϑp97.9gܸ4 sr^|&\΍yqNp97.9gܸ4 sr^|&\΍yqNp97.9gܸ4 sr^|&\΍yqNp97.9gܸ4 srNύGs|^ρp>.췜|>>ǎg^} {`(>Ӟ_oyӿ$?%%$%7LHLHHOLO+1i,G1:!_piЯQľt_r 5jاqF}%߰}}'O[/|Ka#?[͛o4}.Gu~$6pG;w VƤ K= /22闿L?f8@:t7?.-;Ϡ3noM'o }XO6:h2Gi4ial9"qkġ8}7q|8#Q8xF&LRڈC q!5'߈cq!qGhvz4X96qf*Eq8`&>;fˈ*Gy,>T _TurT=hKl,!uÖ(}1qG FKƨcŘʤq"U?P"V>@ R;6r2GѮ(poq oƸ7q,2?FA7Yۗq>E[?c'hC, ͯh|@ z#qأ͟Xʇw~~}h~7Dp۟ a=#8NMK>5"8z_G} c=hۨ~PoZ_u%CW~PڗGSBS~~đ yC#Vi|0!|lDG{>_XhgGPrC_m~B;ZIJ>0wdf9Wq}d}uѫeR/c_XG[_#zG'h~A"ɾysC+S| bx6h|AZe~|#3zQAkԿb5q8#N8>߉c#eэC3qawSA:ag0j8dzC4_I :utIjI!ı8GhCq!V| qB7&e>~p#E#qL8`ڟio&8Gc4 qj⸌<0?MR秠o&v]&S\XqGDXGqGFM>T>đ jZ_8Bٿcymq±m~D+F~`G2/1jPOҴG v#͏ph'4 XߟLS,{/3.h3aGEWg8/"i}RX8Դbl?WMg..F?Tr~P}Vo,+Z49cͿc/].z~#|Xƿh)i GE/~_m6?͏h~4Dz>1odJjbNFz x‘T?].%7_nź~1ߣ)X|e%h7&/\IR+ҞKAG,oc>4>ߣ o=Fe 6ϧņ8 =uCmVPO/\-%ټR-W+,=ܯFhJH#Ƿ?x4߉Qgn\*fS~P׆EK~o}ƷMKU)\>?@j![SK7y3˗뿜9㬟q1[׏sK؜QQE_5;^r=U,!59V**kEbp:28[EbHNK2ٻ++kNsxל,2cp:2&>Ebp,W$Ff4_-EbHlNs"Y8}*.3FiEbHlNs"Y8W$Ff4_-EbHlNs"Y8W$Ff4W-EbHlNs"Y8W$Ff4_-EbHlNs"Y8W$Ff4_-EbHlNs"Y8W$Ff4_-EbHlNs,"Y8-Y8fjtdTEbHNK"1\8vEbH,Ns"\8Z$r4k.˅EbH,Ns"\8Z$r4k.˅EbH,Ns"\8Z$r4k.˅EbH,Ns"\8ͱ[$rr/ۅӑ]{ל.EbpZbp±_$ ~/~dJ5E5_$YO%/l$@ɻV-$I^9ɫ$H{לI:]59jDot:^JOU\qFT~03nDWǍx39_yu=:n֏ʳv;`PvPƟ~%B;/pwhCšcok)TCw4zw7O1jN8]8g,5M1 [y>C8X?㬿e:iaSjuop4,mhyw< (.P&`p0p@C~C>e/P&c㞛v3|*Ws:Ӥ81;w;rǀ߻nq0N2wʟ)_Xq>3~O8pE3;3?ђD3> ~T~dҏτ ҏoj1́>c/8Ⱦ=˟l jn^ f9SIE'P/=rg}g|Nʟ_>;~{fUAG!L>Mp@!}L/կ}KG‘>C뻟j9N7:,6zp$%_JG&qKP(ֿ9o Goh|9?̱CZ/ٿæg(|cهwpo9> {?rd?ʏoT?ej_HBh|C!~d??L_8r7=_Cl=+@겸?yQ[NuOèz&{n8~&P#˼[pn99? \?Gpİ~/3Gڼsq9? GO 7k)mGΏ±τ IpG8|L#P&\8P3p@W8L#P&eO8LC8R>پO8P(ԿL ƹDa'?)-Dwew䞌M8MXp,CU߼n9 GRrھrt#XB1?pذ~YB8}|~#waI8j~?*?z~S}# هG هh00B˵??| /|8"Ns|yJz`!yr؊LN 緎k__g,ƃq_0_&;G}~_1՟p1~cjAjS>c/?&7k15;!/Qb.~}*wz7?FPI3~_A3jE3ʏCQp# Og7_Sۤ_Ⱦun~?4'b|r֭">{-ke/_gJ̼*_W}?iUه3~T~SH71To/gZ'y~  ?h}a_x}8L'h?iZ.RkG.v@s^] ?T3_?:*pgw /?FxWx }| g #5=ُG7ՏWG}(d?ߐ}H?ُS 4\kC#Mϗ ~t?)*hy={GnWwU2gV\?Y??ȿk踶w 6i 3c/wS>ce?j?S~e>c/?&d??1?(ԿLƹ_?iz>?O|_Ƿ{GFnd3~l(bکVm߶u d*<3fz~#A >T>Y?A}8O#(T~|#SGG#aƗk(dd_,Q%~7B6"N:Oq\1/nz;%p[M%{FAOۼG/n~OL gL1e^=0oAGs=MTceǤ_/}d~M+3SIۿ/߷'[txѿoUG]?'~[QyT&)O$xL#~T&\H?*}meG>67|.߿Ӂٛ~:/rZ!wL ȝ7|D}%"_evʟgkd?3#~T&\?ҏoj&\~>>M#L8OAO4/L6z٠ >A0/ILh}w.G9[-WPo6]o?2y%m P~$~.B@}|M gO#(T~|#SGG#aƗk(ddҏG{~r؊#?NQAWKyE;zyz{_M+?gAeTm] k蟿:cX՟ ~G.?Q_L+'~1'/!Qq/Ge_lA)OOϢ=.G~[S1WPOl_}_A1^?_~Y}ͯ*?GQGL+#>?o>ݏG㇩_K}Gf/;tmIG  77 ֍)m__aLG><}d/G'I>'rϪd?sWQ}H??'c?@?jhoTI},Q0󕩨ۧ+۴&Z51N;wHd}+&ϧ}ه3~T~SH71To/gZ'D”?q^/O?LҴ>,Z] g^XiԽd3fC߶cY{BA#?8W}|E W I?I Ag5O#(T~|#SGG#aƗk(ddҏGvP2py={řWrg݁?7r&)Yϒʖy148x3˨Wײ[8ǂLT?7pAc_?1>1}}AOd?/Sc ڿ@L|=sQN=9hp74ˁ+P^}YgG_J' _A1^?_~Yn@>g~?*?z~S}eهG هh0ٿ@˵??|/|g7eexV^Jd.J~J櫌>JdIJ楼CI?)|{~I~I~IdI~IN3L $CRx&_!){$zלAkN!0Qӟ'9Fw$'H>'»$IN|]sY3$kN_ kokN@=w$?zלDEkNF+/${ל2$9I"]s:+-$[V9Ird't$H#KRɍ$In")DR(I$%H&I9$eH*T )ORɻtU*$IyלIR:I-uI&]s:$$wd$I$ kN7!iL҈wi$DBkN7'I%iF»tkV$-In9ݎ-IN'65;t"HŻ$H]sI"Aҝ^$Hz#K҇>$I $d($#H #E24cIƐ&]sA $I90$$kN?B2d 4ӏ NwY$3I'y»$O9|y$O{ל^DdbKI!YBw$I<]syU$+IV{לHzל~d=:kNLd&[Il&yŻk$l#]sz'$;HvyלI2HI{I&yû$oIϻ$'9]sI#лG$H|]s'$Izל81$|Fr $_|IrY3$ߐ|Mr;oI.H$H~"HwH~%w\&5C7_$WkNgF-;*Hes9$IvkN!M$wI#)]s&B$I {ל.FRIqӥHJ ٻtY2$IyלHRI"II2I$$H4%iBH,_cG3hxZ5NN[qI%7j0_}7jԧ_R ק|Rľ·6i?aUo<_rrONNNKHJoT?~ 9!.>cƤ35bhp׼yS杻uaN6n|<{֦%̃npۋj=A˂}X zY=gqT\/}v(B3?Kxw ?wEYԲQNI9jOԔp>?ROoOQ)O gE3qVO=LS_;'_27PzG#MP?~QPyխNj<?Wζ7ߐޥ⿓օ_M'Ie\sߴXwgjAݿ5(mqg_ts0~YPrL]_^ָ7z-g)7Rn16;UuRY罔6x.>+ۭkNSC~ƟUՅ֮{8H?]8lijb{W=/[IksjKRL{fV^'RL9G?l "ޜJUm"M|=uXi5*^X)YˮT6NBϬxKs`-Zeٟ_)~pK[5Lav1vKcUbjd6Hzg<&?W %ȏV7u$dEP+_jx6mV]J82+-Iҿdw#?q[ݯTT)?CQ@q3ߚ911gҹe{%=_{~7o_q 7>T߆9מ9jssa/)_̮\WЖ*_NE?=Ƈ7Iag:}[F"dKz/Og N OZzB_X%¹~PgG[vz+?\E¹~J_yٍ{:j~*BxMOuP52,M!?}|(d9~d_,QُƏnbs95fq=ﭤ7Y?֡NԿu^!ݏXsPc4q^/)ѮBsi9geӡ/P&:mUvڥGxU-j NOmJVV22?V[N[ &Rqv%U;T>'$txt'5upդrK_7=TwnlZy>=3 G+ rs17,ƞhj\T ͚Jx(euO)/YՔ*$/Sd4'rvomb¥T *dbqN'Ko W+ uemT;vaO[^F|M/B{eN7 g2d5KG _LecO_g?bK/NVginsal_lߑg3>:Nij}P@qx͟d4yg}ߣ>ū*;ֿh!D?KS2>rw66t+EU N+; ;2Npxj i9|'fX@ü˿ڕsz;'r~'$ ;&}!eDVy s> dC֯lο+v*_BNڀŽ/L//T>Zb VNR =kN㫔W.}--bϲd@Mw6]`X,ZO:fH/\~Ο_bªbB̿~w+`ߵȾ{ymgܴ49j |Uos*,Ը#?=^P ^/"SUIGh@/|GVt|vUVɅSY?0oT>~ZPGߕg_xAGS$?Ͼه7'㏩}eA?ZϻVTjFV:ͯ~_:n.`j}3$jɳ߄)k|] X.:j5VFϛj_`##|gf?hP5j۪3\);ZeSi7bX֫*{yoC8~ g ٷˉTuFj2s|ѿeq,SaFzTV A礟qdҏOϴ~-BG?Q)щmԀ剪s.S[HpmCZ?K2vzy*OGQ_Bl~oRʕunڪFc~Ծm?B- 5rXp{Y?ѨΙq߆J\dO=Ź_-g]ޤ?G,Uِ38 .k8.Xp_sb綢U]?V<~4~35۷!wn}vW+M? //D8ҏƯ-wN^;;5^:7:.G׶╝SCN޿nx2GwOo14oV d?Gwo&#|M' 'rSyeHp_w+,w*h^Mq\9OWĀ#hܣ_ 4mIrZxKǀ#hzwSK'By}ϺK} N1/ڣI1H?ih7m?j:&4BmUonV[O =F7@s |wt(1cT`L)dQ_E!<>]3ZO SeM'] z|\1o/0~#~?/diwp!*n_ZHU3>k?!eh#:tq}P1Tnb|ܕQ@:落]kTNbόv5//?3\PeU*eISy;xKj#kdk|UꤟqdҟԠ۳zVF Գ[<>WWйjvM-3ݮIWChgڟsV]9b7zR(ϝOɗZ_KS֞JW?Sg*bF*3Դ{BW_G هg?tӪz)\4eUemmB!+?b+J=[ BrY /dҏA#|ևh#h?#h#h_#h}}j;l_ه8O4q*Wy}H~kT"*R[hFu>~@}}kN[UGNS/ʍoREjſr1WZ{0/Iky4^Ʒ/Cq~za[`R)g5:o-1Jh:-M]ȶ4޳iʪV0?߬T%Uҡg,8?O~J(峪.x kf[秥SZkO}Hҍu4^Tc|H|߬;kN;,!~G*Oo{m HEtu7׏Տ-a4~!n3-KU:GByl ه׭{JS|!a4>"v٤]Jxu}4;usF8=%>z_X{׆ \wCh|D+_և=DzłG. M?Z]ׇ`}GS|E3_Q?t^BGבه?? Aه.hFqPBc4P>T>4>A4>^3_'E;~ZǨZP!:AC{h_PP~fAwYO( GK8R ^x12 } t)0<5?&2 ݺV] guZW?},5K/gQv)1g'RcGMI>S!~Q}lrC@u?Qr(Om'O\\O~"?j{._k҃?ot?RO qQY~->#(,?  ~0ՏP<v?1:2">gz'ʎs E|BuvEP~  <D_)WaE~&BAcO(d;b"P)?'#Ox-')0 |{7D`-SܝOT' I8GL/G芾x(Aw-z/O8GT}|'VO'̬ 'Žad*pPeGt?ʿ+D0o=H~8Bl)}(d?ߐ}H?ُS4\ɥ>WOGsG~Th^I[I"XQ6nA!8ƥQ~{(IC4Up(1 1fC!vC9cR)چ'T>R~ A./~L#EheB8ZnjB)QV Q!^~_ fCU|Kg)ȥmz?"n@Og//}aOU7ěboPuX~?_ozZ}w!>}{!m?QAϔSG|o PKw8Do;7D}]憨u!jM/믗Gjk|,Q QCT#P7ѥ0Q~ !۹!ڕ?D;/{ĬK)Ntb!.E(8,ݏOy=Vɥ0P~ |#x%7S!P~4!~t?/4ح=R~ ?̥0ȾXE3"K'qWQ1K "%b.L'~K)N{x}|D!'= > :?p"_x_QՄ9QW/(>7;.ݯ>;f<.L!'K<<)du)d{#"'ȓcY_ť ?|ES \$Ɵv)?^!ʟz"N(鿃p?ͥceAQ[_BL?H?j*Z.EPTǤ_d:)ns)?EZ#׿b.EH[S8u) H/J+jR9~g4R~ +# ʢ"K)~_B1K)_i}(!H(Q1w.㧠B_D#j߆s)?>Ҋ)zTNE_CKE16 ?}H?z?GgzRLAuKA(o~R%SPv)TE_هcKAThB!<>3U_J)C _>DO4~RLӥPrJhB!K!PE}Hws+Rh9}Q/dҏh|Dc/)X,*/WnS w)XTE_ هoQS.S هb ] `AGh|D$D(@G~jKA)7ׁ܊)~5㧠B8ҏ/ƙbKA)bG7LAӥrT /%$GQLѥGgoiKN#;tQLW֥G_YSh +姰0b.şC8__A^u] /JjP^16S!G Lh\?Op_?l1{.şC8ҏƯ/,WAS!GsSLgH?=Կ /~GZ!~4GZ"}pC*w\%p[Y?:g?➯24bQC,^:kKiw7ap?y`M/r)Ҕ"MxSX!64H˻K)_ܿ7DxI7DE__y7DTOAG,7~nTJSPȤB#M?SPK}GFPP9~ *ԿH??w)?z~}H?O7q)?}Hkgvk(F7gNŕ~<{/ QM:q?ㆈVh|D":鍵VhB+?.SH هܮ -BG3>A)XW_R8~ 4~!wK)XC/dE ?D=}϶>ᆨw(^4å`p(2h|5 :#(*<~2AATq}~եR~ Xhb?ťxP~.h|Kh~Bo.S,,R ~!t>wu4 EQ4?At]B8ҏzݏG A_هʇoEAGo>}G4 / jT?_CT?}P"ϠWهʇ?CCk׺?GNx:u )S^Nx:u )S^Nx[I bK:?{kh$_R4Yye8_oV{rO㔘m`a:߯TXU0dj׽҄nKhJfN՝3B>|Ik|N Krmʹ>NNì7C8u3YUbN9Jܽ.Ƨ{ztOs綟8q{ Q_#v>}Js2I 8kQJG[OKL#Ź㭚? V_ hm ͒V8BGʇ/Jsx⃏֤:U,+qjZ;I9]+t+f]i}y{Da~<dWR-cVqxUaY!?Zz67kԊ,Y}řB\jxSg}1uӞ\!>%᝿b3~Ϊf{{?G*fɦ.O3\)9g}+Nw4-֌gHNY2`*5i|e-Oi-߯j[MTZcw3@Yf{هʷW6oʪ&PպVP_Իl :[,>{Sys0QhE7o?nZ_H|ndُ7dҏG%~6_NgVeƪ"n[A#9fuќΣZ_}Gf-mkk%9߹?|?x a\1.;vf;%V] gg·}/)1ROo~?p?'wͮ?9Ӧ#?y_w˦KgُGʇOr[>֊UOse^_U,U:a]C w]FǪ:yH,^-ͶֲZYEURY]7ɦ,|նή'̯2qKF]F upYT?aŵ7*ֿbMb*p5%~l}r՝ZU؟!_+Q-Uə٥>pCiwl\_]nCY|>}NUw~9g+{3`Vͯ8 Ydqzq)-̏1|Sa|t&a d?/hjC-vWv>"olgWտ/?OP3/=͜ Y-*T@~.cZvWveY.T3F|Y6;m_<ѯkGaTUJo}|7T5zQʯdppo}5Su}U{tY#P=c 4cfe}gwx}%7i*+eG8GCuCwE7oYssϴ}b|fa~dُ7dҏGeƗWzo}=*FT[%Gs|?ߴxNQad_,Qٟs ͏Σk +Gm]' ‹v)'fw`ʝ/-w?7Kz#o0M8O$|{~0¿D?'z op@Q!?I8@kj0 dߺ?y!ߪFPmWvsZ4@ hGPN4I-O8!ATU7e8gy{}iaGgj{>oR-2Bw?}/ھO?Usպx%=eT!7?vHa^s鄿}{R?&>ղ7g|?S~PPEtGNw]5IK[#/5y@~ؑ3.ܞ,<@1[5/<7SeEQFM#'SهG هh0ZozE?*_4-#[oPbi|wexJBMkᴝ\#H_"~[~ZR1UxjI?mr6SON,& #L޶)y.V=X-gm.V*G7Q"~>|,=&/E/h!u_4 s|Rblu| [oi_x}$7d}5ܷ> IL#]߷eoevOM+gSߤ_&dm2?}xx~ُG˔=o~+꟨g_')3z>oʿo5?T}㳬ͯ>|#Y_#PZ_ gd?Pg#O g~|[Y (T~|#}e}C#C~4~_r7=_GŢ/!pxB+_m+ oۡy{K%4_-]wp89'mV֮ߑD~>oO?LwM¸p%?]#sx LSjd|EG}wb_zFxK_~I=~$\o'+^ה?Oeʿfâ~VfD!NY/|?pH?*NY?+_xф'3z@kjLeA_W?i'ン5I<`xx;gg"]l葷՜ﲌT>]YR/?!^91 ه[QIO@{F!1n+4i8ZYU>هZ?ڿD!h}=Ahu|uu)mqGuLc.Ƌ5[cMiaU盩S,:pJb5ha3dP>)>Fc>ck~%vز>k^uێ9[H5?Tޒ_ָӆIVi57[ꨁWǖ[/[_XϬt CGMn7!^wz_H?}|>Xk<߇':Ok HtidW\?ž94lvt"cdpj_t _T?~Q|%oENbrZNG4~Cd_O_VSmuClq4>Q~P_7miY:%Mݻj9 ȣQDV*5 ? ܂ίOSJxe΢7ϽUş.{ GG?ZQSkFQoόG}Q@7Ec^}.kי>JB+ŵkvQܾ[9Z? 5ɽ:??M-Az(٬γeUګ_S*LϘAu#:fp7㿽s:_s]\/z1jj ǵ&U|Ϧ+S'#n>هʇCCڷ_":ީ]n3>w>OwCoݤ~v$?>:L,G3/|AGh|nz.+}s~GPE~P ?}|h@'d*)>|⟢꟨#ZnLǷkVUT_Ш7T_5uU"qլK+Οs%Kڇ)8B3.3K/H\QPMo}PO!±NhyG:VސO!z?Cn1W3UĿ?}Po;zS:WهA?vgN:SZ_FX7H36N@?jsT~l9?r-7f͏!aA!?fRt%2W>'C%h_ߡ3n9i-[FVr<@HhF!x3pЌ͝6Vr^<$[4~#B/ 'S75sZo>Nc5qL >DMq9>h~Ag_ڭq{TƪΡm_هjhC}];d81wr Nrw<$Ir9}#I~|$kNDR IaHŽkN")IRfeIʐ&)]s"I$kNW%BRw$5H9uHj9HtY߻t2 3b&49݄1I#59j$DyלnNJҌw$HZ%iCr m$#@Ҟv$H:t#J҅.;I Iz N˻t_>$Iyלd ]sz0 $CkN'F2dwQ$#I I9=d ӱ9 $yל~dD5!;*w%J  H@ %Ћ@ "%$ PQU:";Epf((" (>λwy~]f7g9sf&3{;Sc0^'z!XE⩗%`1Xe kl: |6c-`']⩙vI]{~ 8$3p| >O} GOKxSkpO-gS΁yԗEp\O} \Wu?%gO _S{xG!<O'<OS9,>m2 9σ : _9@ )%/<AO]A1%@(J. J`PF># 'q%J<)58 N|΀⩿wxK".+xMpO3 nw=@<#ӥ7N@:2S?@fxl +~ x@n ,: WS@~PH local f_blockpos_y = ProtoField.int16("minetest.client.signtext_blockpos_y", "Block position Y", base.DEC) local f_blockpos_z = ProtoField.int16("minetest.client.signtext_blockpos_z", "Block position Z", base.DEC) local f_id = ProtoField.int16("minetest.client.signtext_id", "ID", base.DEC) local f_textlen = ProtoField.uint16("minetest.client.signtext_textlen", "Text length", base.DEC) local f_text = ProtoField.string("minetest.client.signtext_text", "Text") minetest_client_commands[0x30] = { "SIGNTEXT", 12, { f_blockpos_x, f_blockpos_y, f_blockpos_z, f_id, f_textlen, f_text }, function(buffer, pinfo, tree, t) t:add(f_blockpos_x, buffer(2,2)) t:add(f_blockpos_y, buffer(4,2)) t:add(f_blockpos_z, buffer(6,2)) t:add(f_id, buffer(8,2)) t:add(f_textlen, buffer(10,2)) local textlen = buffer(10,2):uint() if minetest_check_length(buffer, 12 + textlen, t) then t:add(f_text, buffer, buffer(12,textlen)) end end } end -- TOSERVER_INVENTORY_ACTION do local f_action = ProtoField.string("minetest.client.inventory_action", "Action") minetest_client_commands[0x31] = { "INVENTORY_ACTION", 2, { f_action }, function(buffer, pinfo, tree, t) t:add(f_action, buffer(2, buffer:len() - 2)) end } end -- TOSERVER_CHAT_MESSAGE do local f_length = ProtoField.uint16("minetest.client.chat_message_length", "Length", base.DEC) local f_message = ProtoField.string("minetest.client.chat_message", "Message") minetest_client_commands[0x32] = { "CHAT_MESSAGE", 4, { f_length, f_message }, function(buffer, pinfo, tree, t) t:add(f_length, buffer(2,2)) local textlen = buffer(2,2):uint() if minetest_check_length(buffer, 4 + textlen*2, t) then t:add(f_message, minetest_convert_utf16(buffer(4, textlen*2), "Converted chat message")) end end } end -- TOSERVER_SIGNNODETEXT do local f_pos_x = ProtoField.int16("minetest.client.signnodetext_pos_x", "Block position X", base.DEC) local f_pos_y = ProtoField.int16("minetest.client.signnodetext_pos_y", "Block position Y", base.DEC) local f_pos_z = ProtoField.int16("minetest.client.signnodetext_pos_z", "Block position Z", base.DEC) local f_textlen = ProtoField.uint16("minetest.client.signnodetext_textlen", "Text length", base.DEC) local f_text = ProtoField.string("minetest.client.signnodetext_text", "Text") minetest_client_commands[0x33] = { "SIGNNODETEXT", 10, { f_pos_x, f_pos_y, f_pos_z, f_textlen, f_text }, function(buffer, pinfo, tree, t) t:add(f_pos_x, buffer(2,2)) t:add(f_pos_y, buffer(4,2)) t:add(f_pos_z, buffer(6,2)) t:add(f_textlen, buffer(8,2)) local textlen = buffer(8,2):uint() if minetest_check_length(buffer, 10 + textlen, t) then t:add(f_text, buffer(10, textlen)) end end } end -- TOSERVER_CLICK_ACTIVEOBJECT do local vs_button = { [0] = "left", [1] = "right" } local f_button = ProtoField.uint8("minetest.client.click_activeobject_button", "Button", base.DEC, vs_button) local f_id = ProtoField.uint16("minetest.client.click_activeobject_id", "ID", base.DEC) local f_item = ProtoField.uint16("minetest.client.click_activeobject_item", "Item", base.DEC) minetest_client_commands[0x34] = { "CLICK_ACTIVEOBJECT", 7, { f_button, f_id, f_item }, function(buffer, pinfo, tree, t) t:add(f_button, buffer(2,1)) t:add(f_id, buffer(3,2)) t:add(f_item, buffer(5,2)) end } end -- TOSERVER_DAMAGE do local f_amount = ProtoField.uint8("minetest.client.damage_amount", "Amount", base.DEC) minetest_client_commands[0x35] = { "DAMAGE", 3, { f_amount }, function(buffer, pinfo, tree, t) t:add(f_amount, buffer(2,1)) end } end -- TOSERVER_PASSWORD do local f_old_password = ProtoField.string("minetest.client.password_old", "Old password") local f_new_password = ProtoField.string("minetest.client.password_new", "New password") minetest_client_commands[0x36] = { "PASSWORD", 58, { f_old_password, f_new_password }, function(buffer, pinfo, tree, t) t:add(f_old_password, buffer(2,28)) t:add(f_new_password, buffer(30,28)) end } end -- TOSERVER_PLAYERITEM do local f_item = ProtoField.uint16("minetest.client.playeritem_item", "Wielded item") minetest_client_commands[0x37] = { "PLAYERITEM", 4, { f_item }, function(buffer, pinfo, tree, t) t:add(f_item, buffer(2,2)) end } end -- TOSERVER_RESPAWN minetest_client_commands[0x38] = { "RESPAWN", 2 } minetest_client_commands[0x39] = { "INTERACT", 2 } minetest_client_commands[0x3a] = { "REMOVED_SOUNDS", 2 } minetest_client_commands[0x3b] = { "NODEMETA_FIELDS", 2 } minetest_client_commands[0x3c] = { "INVENTORY_FIELDS", 2 } minetest_client_commands[0x40] = { "REQUEST_MEDIA", 2 } minetest_client_commands[0x41] = { "RECEIVED_MEDIA", 2 } minetest_client_commands[0x42] = { "BREATH", 2 } minetest_client_commands[0x43] = { "CLIENT_READY", 2 } minetest_client_commands[0x50] = { "FIRST_SRP", 2 } minetest_client_commands[0x51] = { "SRP_BYTES_A", 2 } minetest_client_commands[0x52] = { "SRP_BYTES_M", 2 } -------------------------------------------- -- Part 2 -- -- Server command dissectors (TOCLIENT_*) -- -------------------------------------------- minetest_server_commands = {} minetest_server_obsolete = {} -- TOCLIENT_INIT minetest_server_commands[0x02] = {"HELLO", 2} minetest_server_commands[0x03] = {"AUTH_ACCEPT", 2} minetest_server_commands[0x04] = {"ACCEPT_SUDO_MODE", 2} minetest_server_commands[0x05] = {"DENY_SUDO_MODE", 2} minetest_server_commands[0x0A] = {"ACCESS_DENIED", 2} do local f_version = ProtoField.uint8("minetest.server.init_version", "Deployed version", base.DEC) local f_pos_x = ProtoField.int16("minetest.server.init_pos_x", "Position X", base.DEC) local f_pos_y = ProtoField.int16("minetest.server.init_pos_y", "Position Y", base.DEC) local f_pos_z = ProtoField.int16("minetest.server.init_pos_x", "Position Z", base.DEC) local f_map_seed = ProtoField.uint64("minetest.server.init_map_seed", "Map seed", base.DEC) minetest_server_commands[0x10] = { "INIT", 17, { f_version, f_pos_x, f_pos_y, f_pos_z, f_map_seed }, function(buffer, pinfo, tree, t) t:add(f_version, buffer(2,1)) t:add(f_pos_x, buffer(3,2)) t:add(f_pos_y, buffer(5,2)) t:add(f_pos_z, buffer(7,2)) t:add(f_map_seed, buffer(9,8)) end } end -- TOCLIENT_BLOCKDATA do local f_x = ProtoField.int16("minetest.server.blockdata_x", "Block position X", base.DEC) local f_y = ProtoField.int16("minetest.server.blockdata_y", "Block position Y", base.DEC) local f_z = ProtoField.int16("minetest.server.blockdata_z", "Block position Z", base.DEC) local f_data = ProtoField.bytes("minetest.server.blockdata_block", "Serialized MapBlock") minetest_server_commands[0x20] = { "BLOCKDATA", 8, { f_x, f_y, f_z, f_data }, function(buffer, pinfo, tree, t) t:add(f_x, buffer(2,2)) t:add(f_y, buffer(4,2)) t:add(f_z, buffer(6,2)) t:add(f_data, buffer(8, buffer:len() - 8)) end } end -- TOCLIENT_ADDNODE do local f_x = ProtoField.int16("minetest.server.addnode_x", "Position X", base.DEC) local f_y = ProtoField.int16("minetest.server.addnode_y", "Position Y", base.DEC) local f_z = ProtoField.int16("minetest.server.addnode_z", "Position Z", base.DEC) local f_data = ProtoField.bytes("minetest.server.addnode_node", "Serialized MapNode") minetest_server_commands[0x21] = { "ADDNODE", 8, { f_x, f_y, f_z, f_data }, function(buffer, pinfo, tree, t) t:add(f_x, buffer(2,2)) t:add(f_y, buffer(4,2)) t:add(f_z, buffer(6,2)) t:add(f_data, buffer(8, buffer:len() - 8)) end } end -- TOCLIENT_REMOVENODE do local f_x = ProtoField.int16("minetest.server.removenode_x", "Position X", base.DEC) local f_y = ProtoField.int16("minetest.server.removenode_y", "Position Y", base.DEC) local f_z = ProtoField.int16("minetest.server.removenode_z", "Position Z", base.DEC) minetest_server_commands[0x22] = { "REMOVENODE", 8, { f_x, f_y, f_z }, function(buffer, pinfo, tree, t) t:add(f_x, buffer(2,2)) t:add(f_y, buffer(4,2)) t:add(f_z, buffer(6,2)) end } end -- TOCLIENT_PLAYERPOS (obsolete) minetest_server_commands[0x23] = { "PLAYERPOS", 2 } minetest_server_obsolete[0x23] = true -- TOCLIENT_PLAYERINFO do local f_count = ProtoField.uint16("minetest.server.playerinfo_count", "Count", base.DEC) local f_player = ProtoField.bytes("minetest.server.playerinfo_player", "Player", base.DEC) local f_peer_id = ProtoField.uint16("minetest.server.playerinfo_peer_id", "Peer ID", base.DEC) local f_name = ProtoField.string("minetest.server.playerinfo_name", "Name") minetest_server_commands[0x24] = { "PLAYERINFO", 2, { f_count, f_player, f_peer_id, f_name }, function(buffer, pinfo, tree, t) local count = 0 local pos, index for pos = 2, buffer:len() - 22, 22 do -- does lua have integer division? count = count + 1 end t:add(f_count, count):set_generated() t:set_len(2 + 22 * count) pinfo.cols.info:append(" * " .. count) for index = 0, count - 1 do local pos = 2 + 22 * index local t2 = t:add(f_player, buffer(pos, 22)) t2:set_text("Player, ID: " .. buffer(pos, 2):uint() .. ", Name: " .. buffer(pos + 2, 20):string()) t2:add(f_peer_id, buffer(pos, 2)) t2:add(f_name, buffer(pos + 2, 20)) end end } end -- TOCLIENT_OPT_BLOCK_NOT_FOUND (obsolete) minetest_server_commands[0x25] = { "OPT_BLOCK_NOT_FOUND", 2 } minetest_server_obsolete[0x25] = true -- TOCLIENT_SECTORMETA (obsolete) minetest_server_commands[0x26] = { "SECTORMETA", 2 } minetest_server_obsolete[0x26] = true -- TOCLIENT_INVENTORY do local f_inventory = ProtoField.string("minetest.server.inventory", "Inventory") minetest_server_commands[0x27] = { "INVENTORY", 2, { f_inventory }, function(buffer, pinfo, tree, t) t:add(f_inventory, buffer(2, buffer:len() - 2)) end } end -- TOCLIENT_OBJECTDATA do local f_player_count = ProtoField.uint16("minetest.server.objectdata_player_count", "Count of player positions", base.DEC) local f_player = ProtoField.bytes("minetest.server.objectdata_player", "Player position") local f_peer_id = ProtoField.uint16("minetest.server.objectdata_player_peer_id", "Peer ID") local f_x = ProtoField.int32("minetest.server.objectdata_player_x", "Position X", base.DEC) local f_y = ProtoField.int32("minetest.server.objectdata_player_y", "Position Y", base.DEC) local f_z = ProtoField.int32("minetest.server.objectdata_player_z", "Position Z", base.DEC) local f_speed_x = ProtoField.int32("minetest.server.objectdata_player_speed_x", "Speed X", base.DEC) local f_speed_y = ProtoField.int32("minetest.server.objectdata_player_speed_y", "Speed Y", base.DEC) local f_speed_z = ProtoField.int32("minetest.server.objectdata_player_speed_z", "Speed Z", base.DEC) local f_pitch = ProtoField.int32("minetest.server.objectdata_player_pitch", "Pitch", base.DEC) local f_yaw = ProtoField.int32("minetest.server.objectdata_player_yaw", "Yaw", base.DEC) local f_block_count = ProtoField.uint16("minetest.server.objectdata_block_count", "Count of blocks", base.DEC) minetest_server_commands[0x28] = { "OBJECTDATA", 6, { f_player_count, f_player, f_peer_id, f_x, f_y, f_z, f_speed_x, f_speed_y, f_speed_z,f_pitch, f_yaw, f_block_count }, function(buffer, pinfo, tree, t) local t2, index, pos local player_count_pos = 2 local player_count = buffer(player_count_pos, 2):uint() t:add(f_player_count, buffer(player_count_pos, 2)) local block_count_pos = player_count_pos + 2 + 34 * player_count if not minetest_check_length(buffer, block_count_pos + 2, t) then return end for index = 0, player_count - 1 do pos = player_count_pos + 2 + 34 * index t2 = t:add(f_player, buffer(pos, 34)) t2:set_text("Player position, ID: " .. buffer(pos, 2):uint()) t2:add(f_peer_id, buffer(pos, 2)) t2:add(f_x, buffer(pos + 2, 4)) t2:add(f_y, buffer(pos + 6, 4)) t2:add(f_z, buffer(pos + 10, 4)) t2:add(f_speed_x, buffer(pos + 14, 4)) t2:add(f_speed_y, buffer(pos + 18, 4)) t2:add(f_speed_z, buffer(pos + 22, 4)) t2:add(f_pitch, buffer(pos + 26, 4)) t2:add(f_yaw, buffer(pos + 30, 4)) end local block_count = buffer(block_count_pos, 2):uint() t:add(f_block_count, buffer(block_count_pos, 2)) -- TODO: dissect blocks. -- NOTE: block_count > 0 is obsolete. (?) pinfo.cols.info:append(" * " .. (player_count + block_count)) end } end -- TOCLIENT_TIME_OF_DAY do local f_time = ProtoField.uint16("minetest.server.time_of_day", "Time", base.DEC) minetest_server_commands[0x29] = { "TIME_OF_DAY", 4, { f_time }, function(buffer, pinfo, tree, t) t:add(f_time, buffer(2,2)) end } end -- TOCLIENT_CHAT_MESSAGE do local f_length = ProtoField.uint16("minetest.server.chat_message_length", "Length", base.DEC) local f_message = ProtoField.string("minetest.server.chat_message", "Message") minetest_server_commands[0x30] = { "CHAT_MESSAGE", 4, { f_length, f_message }, function(buffer, pinfo, tree, t) t:add(f_length, buffer(2,2)) local textlen = buffer(2,2):uint() if minetest_check_length(buffer, 4 + textlen*2, t) then t:add(f_message, minetest_convert_utf16(buffer(4, textlen*2), "Converted chat message")) end end } end -- TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD do local f_removed_count = ProtoField.uint16( "minetest.server.active_object_remove_add_removed_count", "Count of removed objects", base.DEC) local f_removed = ProtoField.bytes( "minetest.server.active_object_remove_add_removed", "Removed object") local f_removed_id = ProtoField.uint16( "minetest.server.active_object_remove_add_removed_id", "ID", base.DEC) local f_added_count = ProtoField.uint16( "minetest.server.active_object_remove_add_added_count", "Count of added objects", base.DEC) local f_added = ProtoField.bytes( "minetest.server.active_object_remove_add_added", "Added object") local f_added_id = ProtoField.uint16( "minetest.server.active_object_remove_add_added_id", "ID", base.DEC) local f_added_type = ProtoField.uint8( "minetest.server.active_object_remove_add_added_type", "Type", base.DEC) local f_added_init_length = ProtoField.uint32( "minetest.server.active_object_remove_add_added_init_length", "Initialization data length", base.DEC) local f_added_init_data = ProtoField.bytes( "minetest.server.active_object_remove_add_added_init_data", "Initialization data") minetest_server_commands[0x31] = { "ACTIVE_OBJECT_REMOVE_ADD", 6, { f_removed_count, f_removed, f_removed_id, f_added_count, f_added, f_added_id, f_added_type, f_added_init_length, f_added_init_data }, function(buffer, pinfo, tree, t) local t2, index, pos local removed_count_pos = 2 local removed_count = buffer(removed_count_pos, 2):uint() t:add(f_removed_count, buffer(removed_count_pos, 2)) local added_count_pos = removed_count_pos + 2 + 2 * removed_count if not minetest_check_length(buffer, added_count_pos + 2, t) then return end -- Loop through removed active objects for index = 0, removed_count - 1 do pos = removed_count_pos + 2 + 2 * index t2 = t:add(f_removed, buffer(pos, 2)) t2:set_text("Removed object, ID = " .. buffer(pos, 2):uint()) t2:add(f_removed_id, buffer(pos, 2)) end local added_count = buffer(added_count_pos, 2):uint() t:add(f_added_count, buffer(added_count_pos, 2)) -- Loop through added active objects pos = added_count_pos + 2 for index = 0, added_count - 1 do if not minetest_check_length(buffer, pos + 7, t) then return end local init_length = buffer(pos + 3, 4):uint() if not minetest_check_length(buffer, pos + 7 + init_length, t) then return end t2 = t:add(f_added, buffer(pos, 7 + init_length)) t2:set_text("Added object, ID = " .. buffer(pos, 2):uint()) t2:add(f_added_id, buffer(pos, 2)) t2:add(f_added_type, buffer(pos + 2, 1)) t2:add(f_added_init_length, buffer(pos + 3, 4)) t2:add(f_added_init_data, buffer(pos + 7, init_length)) pos = pos + 7 + init_length end pinfo.cols.info:append(" * " .. (removed_count + added_count)) end } end -- TOCLIENT_ACTIVE_OBJECT_MESSAGES do local f_object_count = ProtoField.uint16( "minetest.server.active_object_messages_object_count", "Count of objects", base.DEC) local f_object = ProtoField.bytes( "minetest.server.active_object_messages_object", "Object") local f_object_id = ProtoField.uint16( "minetest.server.active_object_messages_id", "ID", base.DEC) local f_message_length = ProtoField.uint16( "minetest.server.active_object_messages_message_length", "Message length", base.DEC) local f_message = ProtoField.bytes( "minetest.server.active_object_messages_message", "Message") minetest_server_commands[0x32] = { "ACTIVE_OBJECT_MESSAGES", 2, { f_object_count, f_object, f_object_id, f_message_length, f_message }, function(buffer, pinfo, tree, t) local t2, count, pos, message_length count = 0 pos = 2 while pos < buffer:len() do if not minetest_check_length(buffer, pos + 4, t) then return end message_length = buffer(pos + 2, 2):uint() if not minetest_check_length(buffer, pos + 4 + message_length, t) then return end count = count + 1 pos = pos + 4 + message_length end pinfo.cols.info:append(" * " .. count) t:add(f_object_count, count):set_generated() pos = 2 while pos < buffer:len() do message_length = buffer(pos + 2, 2):uint() t2 = t:add(f_object, buffer(pos, 4 + message_length)) t2:set_text("Object, ID = " .. buffer(pos, 2):uint()) t2:add(f_object_id, buffer(pos, 2)) t2:add(f_message_length, buffer(pos + 2, 2)) t2:add(f_message, buffer(pos + 4, message_length)) pos = pos + 4 + message_length end end } end -- TOCLIENT_HP do local f_hp = ProtoField.uint8("minetest.server.hp", "Hitpoints", base.DEC) minetest_server_commands[0x33] = { "HP", 3, { f_hp }, function(buffer, pinfo, tree, t) t:add(f_hp, buffer(2,1)) end } end -- TOCLIENT_MOVE_PLAYER do local f_x = ProtoField.int32("minetest.server.move_player_x", "Position X", base.DEC) local f_y = ProtoField.int32("minetest.server.move_player_y", "Position Y", base.DEC) local f_z = ProtoField.int32("minetest.server.move_player_z", "Position Z", base.DEC) local f_pitch = ProtoField.int32("minetest.server.move_player_pitch", "Pitch", base.DEC) local f_yaw = ProtoField.int32("minetest.server.move_player_yaw", "Yaw", base.DEC) local f_garbage = ProtoField.bytes("minetest.server.move_player_garbage", "Garbage") minetest_server_commands[0x34] = { "MOVE_PLAYER", 18, -- actually 22, but see below { f_x, f_y, f_z, f_pitch, f_yaw, f_garbage }, function(buffer, pinfo, tree, t) t:add(f_x, buffer(2, 4)) t:add(f_y, buffer(6, 4)) t:add(f_z, buffer(10, 4)) -- Compatibility note: -- Up to 2011-08-23, there was a bug in Minetest that -- caused the server to serialize the pitch and yaw -- with 2 bytes each instead of 4, creating a -- malformed message. if buffer:len() >= 22 then t:add(f_pitch, buffer(14, 4)) t:add(f_yaw, buffer(18, 4)) else t:add(f_garbage, buffer(14, 4)) t:add_expert_info(PI_MALFORMED, PI_WARN, "Malformed pitch and yaw, possibly caused by a serialization bug in Minetest") end end } end -- TOCLIENT_ACCESS_DENIED do local f_reason_length = ProtoField.uint16("minetest.server.access_denied_reason_length", "Reason length", base.DEC) local f_reason = ProtoField.string("minetest.server.access_denied_reason", "Reason") minetest_server_commands[0x35] = { "ACCESS_DENIED", 4, { f_reason_length, f_reason }, function(buffer, pinfo, tree, t) t:add(f_reason_length, buffer(2,2)) local reason_length = buffer(2,2):uint() if minetest_check_length(buffer, 4 + reason_length * 2, t) then t:add(f_reason, minetest_convert_utf16(buffer(4, reason_length * 2), "Converted reason message")) end end } end -- TOCLIENT_PLAYERITEM do local f_count = ProtoField.uint16( "minetest.server.playeritem_count", "Count of players", base.DEC) local f_player = ProtoField.bytes( "minetest.server.playeritem_player", "Player") local f_peer_id = ProtoField.uint16( "minetest.server.playeritem_peer_id", "Peer ID", base.DEC) local f_item_length = ProtoField.uint16( "minetest.server.playeritem_item_length", "Item information length", base.DEC) local f_item = ProtoField.string( "minetest.server.playeritem_item", "Item information") minetest_server_commands[0x36] = { "PLAYERITEM", 4, { f_count, f_player, f_peer_id, f_item_length, f_item }, function(buffer, pinfo, tree, t) local count, index, pos, item_length count = buffer(2,2):uint() pinfo.cols.info:append(" * " .. count) t:add(f_count, buffer(2,2)) pos = 4 for index = 0, count - 1 do if not minetest_check_length(buffer, pos + 4, t) then return end item_length = buffer(pos + 2, 2):uint() if not minetest_check_length(buffer, pos + 4 + item_length, t) then return end local t2 = t:add(f_player, buffer(pos, 4 + item_length)) t2:set_text("Player, ID: " .. buffer(pos, 2):uint()) t2:add(f_peer_id, buffer(pos, 2)) t2:add(f_item_length, buffer(pos + 2, 2)) t2:add(f_item, buffer(pos + 4, item_length)) pos = pos + 4 + item_length end end } end -- TOCLIENT_DEATHSCREEN do local vs_set_camera_point_target = { [0] = "False", [1] = "True" } local f_set_camera_point_target = ProtoField.uint8( "minetest.server.deathscreen_set_camera_point_target", "Set camera point target", base.DEC, vs_set_camera_point_target) local f_camera_point_target_x = ProtoField.int32( "minetest.server.deathscreen_camera_point_target_x", "Camera point target X", base.DEC) local f_camera_point_target_y = ProtoField.int32( "minetest.server.deathscreen_camera_point_target_y", "Camera point target Y", base.DEC) local f_camera_point_target_z = ProtoField.int32( "minetest.server.deathscreen_camera_point_target_z", "Camera point target Z", base.DEC) minetest_server_commands[0x37] = { "DEATHSCREEN", 15, { f_set_camera_point_target, f_camera_point_target_x, f_camera_point_target_y, f_camera_point_target_z}, function(buffer, pinfo, tree, t) t:add(f_set_camera_point_target, buffer(2,1)) t:add(f_camera_point_target_x, buffer(3,4)) t:add(f_camera_point_target_y, buffer(7,4)) t:add(f_camera_point_target_z, buffer(11,4)) end } end minetest_server_commands[0x38] = {"MEDIA", 2} minetest_server_commands[0x39] = {"TOOLDEF", 2} minetest_server_commands[0x3a] = {"NODEDEF", 2} minetest_server_commands[0x3b] = {"CRAFTITEMDEF", 2} minetest_server_commands[0x3c] = {"ANNOUNCE_MEDIA", 2} minetest_server_commands[0x3d] = {"ITEMDEF", 2} minetest_server_commands[0x3f] = {"PLAY_SOUND", 2} minetest_server_commands[0x40] = {"STOP_SOUND", 2} minetest_server_commands[0x41] = {"PRIVILEGES", 2} minetest_server_commands[0x42] = {"INVENTORY_FORMSPEC", 2} minetest_server_commands[0x43] = {"DETACHED_INVENTORY", 2} minetest_server_commands[0x44] = {"SHOW_FORMSPEC", 2} minetest_server_commands[0x45] = {"MOVEMENT", 2} minetest_server_commands[0x46] = {"SPAWN_PARTICLE", 2} minetest_server_commands[0x47] = {"ADD_PARTICLE_SPAWNER", 2} minetest_server_commands[0x48] = {"DELETE_PARTICLESPAWNER_LEGACY", 2} minetest_server_commands[0x49] = {"HUDADD", 2} minetest_server_commands[0x4a] = {"HUDRM", 2} minetest_server_commands[0x4b] = {"HUDCHANGE", 2} minetest_server_commands[0x4c] = {"HUD_SET_FLAGS", 2} minetest_server_commands[0x4d] = {"HUD_SET_PARAM", 2} minetest_server_commands[0x4e] = {"BREATH", 2} minetest_server_commands[0x4f] = {"SET_SKY", 2} minetest_server_commands[0x50] = {"OVERRIDE_DAY_NIGHT_RATIO", 2} minetest_server_commands[0x51] = {"LOCAL_PLAYER_ANIMATIONS", 2} minetest_server_commands[0x52] = {"EYE_OFFSET", 2} minetest_server_commands[0x53] = {"DELETE_PARTICLESPAWNER", 2} minetest_server_commands[0x54] = {"CLOUD_PARAMS", 2} minetest_server_commands[0x55] = {"FADE_SOUND", 2} minetest_server_commands[0x61] = {"SRP_BYTES_S_B", 2} ------------------------------------ -- Part 3 -- -- Wrapper protocol subdissectors -- ------------------------------------ -- minetest.control dissector do local p_control = Proto("minetest.control", "Minetest Control") local vs_control_type = { [0] = "Ack", [1] = "Set Peer ID", [2] = "Ping", [3] = "Disco" } local f_control_type = ProtoField.uint8("minetest.control.type", "Control Type", base.DEC, vs_control_type) local f_control_ack = ProtoField.uint16("minetest.control.ack", "ACK sequence number", base.DEC) local f_control_peerid = ProtoField.uint8("minetest.control.peerid", "New peer ID", base.DEC) p_control.fields = { f_control_type, f_control_ack, f_control_peerid } local data_dissector = Dissector.get("data") function p_control.dissector(buffer, pinfo, tree) local t = tree:add(p_control, buffer(0,1)) t:add(f_control_type, buffer(0,1)) pinfo.cols.info = "Control message" local pos = 1 if buffer(0,1):uint() == 0 then pos = 3 t:set_len(3) t:add(f_control_ack, buffer(1,2)) pinfo.cols.info = "Ack " .. buffer(1,2):uint() elseif buffer(0,1):uint() == 1 then pos = 3 t:set_len(3) t:add(f_control_peerid, buffer(1,2)) pinfo.cols.info = "Set peer ID " .. buffer(1,2):uint() elseif buffer(0,1):uint() == 2 then pinfo.cols.info = "Ping" elseif buffer(0,1):uint() == 3 then pinfo.cols.info = "Disco" end data_dissector:call(buffer(pos):tvb(), pinfo, tree) end end -- minetest.client dissector -- minetest.server dissector -- Defines the minetest.client or minetest.server Proto. These two protocols -- are created by the same function because they are so similar. -- Parameter: proto: the Proto object -- Parameter: this_peer: "Client" or "Server" -- Parameter: other_peer: "Server" or "Client" -- Parameter: commands: table of command information, built above -- Parameter: obsolete: table of obsolete commands, built above function minetest_define_client_or_server_proto(is_client) -- Differences between minetest.client and minetest.server local proto_name, this_peer, other_peer, empty_message_info local commands, obsolete if is_client then proto_name = "minetest.client" this_peer = "Client" other_peer = "Server" empty_message_info = "Empty message / Connect" commands = minetest_client_commands -- defined in Part 1 obsolete = minetest_client_obsolete -- defined in Part 1 else proto_name = "minetest.server" this_peer = "Server" other_peer = "Client" empty_message_info = "Empty message" commands = minetest_server_commands -- defined in Part 2 obsolete = minetest_server_obsolete -- defined in Part 2 end -- Create the protocol object. local proto = Proto(proto_name, "Minetest " .. this_peer .. " to " .. other_peer) -- Create a table vs_command that maps command codes to command names. local vs_command = {} local code, command_info for code, command_info in pairs(commands) do local command_name = command_info[1] vs_command[code] = "TO" .. other_peer:upper() .. "_" .. command_name end -- Field definitions local f_command = ProtoField.uint16(proto_name .. ".command", "Command", base.HEX, vs_command) local f_empty = ProtoField.bool(proto_name .. ".empty", "Is empty", BASE_NONE) proto.fields = { f_command, f_empty } -- Add command-specific fields to the protocol for code, command_info in pairs(commands) do local command_fields = command_info[3] if command_fields ~= nil then local index, field for index, field in ipairs(command_fields) do table.insert(proto.fields, field) end end end -- minetest.client or minetest.server dissector function function proto.dissector(buffer, pinfo, tree) local t = tree:add(proto, buffer) pinfo.cols.info = this_peer if buffer:len() == 0 then -- Empty message. t:add(f_empty, 1):set_generated() pinfo.cols.info:append(": " .. empty_message_info) elseif minetest_check_length(buffer, 2, t) then -- Get the command code. t:add(f_command, buffer(0,2)) local code = buffer(0,2):uint() local command_info = commands[code] if command_info == nil then -- Error: Unknown command. pinfo.cols.info:append(": Unknown command") t:add_expert_info(PI_UNDECODED, PI_WARN, "Unknown " .. this_peer .. " to " .. other_peer .. " command") else -- Process a known command local command_name = command_info[1] local command_min_length = command_info[2] local command_fields = command_info[3] local command_dissector = command_info[4] if minetest_check_length(buffer, command_min_length, t) then pinfo.cols.info:append(": " .. command_name) if command_dissector ~= nil then command_dissector(buffer, pinfo, tree, t) end end if obsolete[code] then t:add_expert_info(PI_REQUEST_CODE, PI_WARN, "Obsolete command.") end end end end end minetest_define_client_or_server_proto(true) -- minetest.client minetest_define_client_or_server_proto(false) -- minetest.server -- minetest.split dissector do local p_split = Proto("minetest.split", "Minetest Split Message") local f_split_seq = ProtoField.uint16("minetest.split.seq", "Sequence number", base.DEC) local f_split_chunkcount = ProtoField.uint16("minetest.split.chunkcount", "Chunk count", base.DEC) local f_split_chunknum = ProtoField.uint16("minetest.split.chunknum", "Chunk number", base.DEC) local f_split_data = ProtoField.bytes("minetest.split.data", "Split message data") p_split.fields = { f_split_seq, f_split_chunkcount, f_split_chunknum, f_split_data } function p_split.dissector(buffer, pinfo, tree) local t = tree:add(p_split, buffer(0,6)) t:add(f_split_seq, buffer(0,2)) t:add(f_split_chunkcount, buffer(2,2)) t:add(f_split_chunknum, buffer(4,2)) t:add(f_split_data, buffer(6)) pinfo.cols.info:append(" " .. buffer(0,2):uint() .. " chunk " .. buffer(4,2):uint() .. "/" .. buffer(2,2):uint()) end end ------------------------------------- -- Part 4 -- -- Wrapper protocol main dissector -- ------------------------------------- -- minetest dissector do local p_minetest = Proto("minetest", "Minetest") local minetest_id = 0x4f457403 local vs_id = { [minetest_id] = "Valid" } local vs_peer = { [0] = "Inexistent", [1] = "Server" } local vs_type = { [0] = "Control", [1] = "Original", [2] = "Split", [3] = "Reliable" } local f_id = ProtoField.uint32("minetest.id", "ID", base.HEX, vs_id) local f_peer = ProtoField.uint16("minetest.peer", "Peer", base.DEC, vs_peer) local f_channel = ProtoField.uint8("minetest.channel", "Channel", base.DEC) local f_type = ProtoField.uint8("minetest.type", "Type", base.DEC, vs_type) local f_seq = ProtoField.uint16("minetest.seq", "Sequence number", base.DEC) local f_subtype = ProtoField.uint8("minetest.subtype", "Subtype", base.DEC, vs_type) p_minetest.fields = { f_id, f_peer, f_channel, f_type, f_seq, f_subtype } local data_dissector = Dissector.get("data") local control_dissector = Dissector.get("minetest.control") local client_dissector = Dissector.get("minetest.client") local server_dissector = Dissector.get("minetest.server") local split_dissector = Dissector.get("minetest.split") function p_minetest.dissector(buffer, pinfo, tree) -- Add Minetest tree item and verify the ID local t = tree:add(p_minetest, buffer(0,8)) t:add(f_id, buffer(0,4)) if buffer(0,4):uint() ~= minetest_id then t:add_expert_info(PI_UNDECODED, PI_WARN, "Invalid ID, this is not a Minetest packet") return end -- ID is valid, so replace packet's shown protocol pinfo.cols.protocol = "Minetest" pinfo.cols.info = "Minetest" -- Set the other header fields t:add(f_peer, buffer(4,2)) t:add(f_channel, buffer(6,1)) t:add(f_type, buffer(7,1)) t:set_text("Minetest, Peer: " .. buffer(4,2):uint() .. ", Channel: " .. buffer(6,1):uint()) local reliability_info if buffer(7,1):uint() == 3 then -- Reliable message reliability_info = "Seq=" .. buffer(8,2):uint() t:set_len(11) t:add(f_seq, buffer(8,2)) t:add(f_subtype, buffer(10,1)) pos = 10 else -- Unreliable message reliability_info = "Unrel" pos = 7 end if buffer(pos,1):uint() == 0 then -- Control message, possibly reliable control_dissector:call(buffer(pos+1):tvb(), pinfo, tree) elseif buffer(pos,1):uint() == 1 then -- Original message, possibly reliable if buffer(4,2):uint() == 1 then server_dissector:call(buffer(pos+1):tvb(), pinfo, tree) else client_dissector:call(buffer(pos+1):tvb(), pinfo, tree) end elseif buffer(pos,1):uint() == 2 then -- Split message, possibly reliable if buffer(4,2):uint() == 1 then pinfo.cols.info = "Server: Split message" else pinfo.cols.info = "Client: Split message" end split_dissector:call(buffer(pos+1):tvb(), pinfo, tree) elseif buffer(pos,1):uint() == 3 then -- Doubly reliable message?? t:add_expert_info(PI_MALFORMED, PI_ERROR, "Reliable message wrapped in reliable message") else data_dissector:call(buffer(pos+1):tvb(), pinfo, tree) end pinfo.cols.info:append(" (" .. reliability_info .. ")") end -- FIXME Is there a way to let the dissector table check if the first payload bytes are 0x4f457403? DissectorTable.get("udp.port"):add(30000, p_minetest) DissectorTable.get("udp.port"):add(30001, p_minetest) end ----------------------- -- Part 5 -- -- Utility functions -- ----------------------- -- Checks if a (sub-)Tvb is long enough to be further dissected. -- If it is long enough, sets the dissector tree item length to min_len -- and returns true. If it is not long enough, adds expert info to the -- dissector tree and returns false. -- Parameter: tvb: the Tvb -- Parameter: min_len: required minimum length -- Parameter: t: dissector tree item -- Returns: true if tvb:len() >= min_len, false otherwise function minetest_check_length(tvb, min_len, t) if tvb:len() >= min_len then t:set_len(min_len) return true -- Tvb:reported_length_remaining() has been added in August 2011 -- and is not yet widely available, disable for the time being -- TODO: uncomment at a later date -- TODO: when uncommenting this, also re-check if other parts of -- the dissector could benefit from reported_length_remaining --elseif tvb:reported_length_remaining() >= min_len then -- t:add_expert_info(PI_UNDECODED, PI_INFO, "Only part of this packet was captured, unable to decode.") -- return false else t:add_expert_info(PI_MALFORMED, PI_ERROR, "Message is too short") return false end end -- Takes a Tvb or TvbRange (i.e. part of a packet) that -- contains a UTF-16 string and returns a TvbRange containing -- string converted to ASCII. Any characters outside the range -- 0x20 to 0x7e are replaced by a question mark. -- Parameter: tvb: Tvb or TvbRange that contains the UTF-16 data -- Parameter: name: will be the name of the newly created Tvb. -- Returns: New TvbRange containing the ASCII string. -- TODO: Handle surrogates (should only produce one question mark) -- TODO: Remove this when Wireshark supports UTF-16 strings natively. function minetest_convert_utf16(tvb, name) local hex, pos, char hex = "" for pos = 0, tvb:len() - 2, 2 do char = tvb(pos, 2):uint() if (char >= 0x20) and (char <= 0x7e) then hex = hex .. string.format(" %02x", char) else hex = hex .. " 3F" end end if hex == "" then -- This is a hack to avoid a failed assertion in tvbuff.c -- (function: ensure_contiguous_no_exception) return ByteArray.new("00"):tvb(name):range(0,0) else return ByteArray.new(hex):tvb(name):range() end end