src/cm/utils/system.py
author rbernard
Thu, 21 Jan 2010 09:16:56 +0100
changeset 113 cf99f4e14534
parent 0 40c8f766c9b8
permissions -rw-r--r--
fix ticket 22
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
# taken from plone
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
import os
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
bin_search_path = [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
    '/usr/bin',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
    '/usr/local/bin',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
    ]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
class MissingBinary(Exception): pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
def bin_search(binary):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
    """search the bin_search_path  for a given binary
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
    returning its fullname or None"""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
    result = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
    mode   = os.R_OK | os.X_OK
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
    for p in bin_search_path:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
        path = os.path.join(p, binary)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
        if os.access(path, mode) == 1:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
            result = path
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
            break
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
        raise MissingBinary('Unable to find binary "%s"' % binary)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
    return result
T!;ЕAK rdNTSdS"+0F鬞g\O:ހmh}X>:0)kxMK.шL$|4,[)Ǩr%VTV@vD7۵N"FT1XS¢r1?}kߥnYKߜ{!,ȉeqrQTzAt vhf?( ܆_ T]=|}^k:cA'("wE{J֠42"hsӡHDh1Na*^GJ\YN=cʅQ4__[F!nQJl*tt*u ە~9h~ykt:P,r) TWd"bQRY+IbEXՊ*g~q8~?lux>\Q`(saVlmi\\EXrWoK * m7Z/W פŲޝʄH###L'GbqڵEPʿH1vs2~f@.F^,bIњ`fS:KYu)6mBB$ΘLfw}i<B$$roS3N|REۘ`T6Voiwm/^׷ꟗQ*HR!" ^#PP8'e0ZW4*?]L=N..f%RSY"HfEYO>oO\CGǀW^Ast@@CK;bX?}M>akQ7o}/[*o]}L? * EZPgv̏w4ه5'x" &Ie6T @c&sNsmVl=x56ṿ.dF1dM!´!7L%D±. >ZowGczu=6:{ ["4J\/]Cߜ'Ol~$MIr\Iu>=͠}6>qhVeP;YW<8)7tHB)2CO`cϚ/ԌEbG k+c%g}dbl j£QOsi{}t&w+"u>nHfD #'Խnx}/QU%fۅIm(w A1>v݉YAA.IɴQ"*$?0xYT?q6cE-.-YXZ?&&Ic»Op 0 [(SOnIISl{W a̺f74gG~sw3M~w+܏B:C\[{-o5|_3ϰSs Se/V:OeUE+96jݢtNH;\keOG3ZzoM.6O_Ww"}xm6{/_ovܺvᕳ+gq<csY[6ʛݱ?;kIa^/ll5:Tr~o^~ѭj#WH-.↓^Ök5>Ekk^<ׯqgkwbS]&?u>i^ξQ35IBٛbn&TC6a= [ۨ"8VW,8u%XŦԹgRZpO^cӽ3Z^E֒7ב_ְ9ѯm9Z4xzk8joeLNխ9l5G._CsuǷe4?_u(]&!tM̵s!KnnQjn . .1~s]5U Wèd粗X gt>F#;cӿ[z>V: 6y;+QZܷMڣ%tWS6{GCz-ec#{)؏+/`)B`zQyWnzv?3쥲Њspl/^nߑ <4>lGA}\~#wocAey=wcqWm?/=='ik/|6ieiy/Z[]ý%үj}|kfSt:./U|oG'-z;ϫ9C#q|kŅzuӟ#{dz?^VrO+Wm^ɬ,+eW|\ѫނo2yl{TKZ̔[<_YFs_V锰-H9}<ʅn,^bu:5{ZXZn^14-I炻[Z`J^YKCb;\Jqi/._;?£~7+k됟'~fwӾ|-a_(Ă/l|^'qIt[}Tz7/ds-y}k{{x^ ᰵ N[%>;d=zJ]4~Kҟ,' h,'OvK׺uatKS?F.:,Ol*:{x?_v倷adԿ,vqwo,uO֟bcZF0iV~>LX3Wg^|{U/r'?对c=6xs}_৿"4Պ"}ݏש+Ek;~d6Z}=6[Њr>Z=kߧ+VLm0tb>NG5N˳Sc0w6Ž{ݛo^/Vw z:v>K=w6ý\n zukeiK]S2[v)rKggggx_ar|\ε͔qoʉD|}ŌOWs[X26> Y0i{~Ҫ{[_YwS^axy7[ 7;祂ܯWT~xJs甀鰿:ˀa0MG8h ѷ8 SW?XlGէs4|דQ5^;i뺶u#'3.y2.:=oAәYTOgZXovp}*'{jC?㶱;0 *'?'l\嘣6C=t~Cԗuu{~_<ܤ NMp4ၚU6??nY86o dVFiM7nϝ= nOfkRߺ"aϾ~jyv|q6n ĔvP0a7X2=,.GbmI٬w&k ANm^*sKOdYؗP|ta΋Vnw,^?d3 .MjɶoXΦ5ܵwETvm/;9vz>)O ~)?z\Y&zxh?W=p۶YawV%_ˣ.+MEڕ#/S9y5E>45|6GsiYsWnLVZ^av{Lޫkgrͷͬީ Jvoy7m"F!A{8t;Kv%E~Y`||mF9HĒWmƊF/?ez8^6L-#OF!irk/Ut෵2[}u2EMfSZÐ?Op1]MBQ,m=Rg:s<+Wi]/AI2Tb> pû5K+JouvVJl_p,spy&KKYݥ&UCxu/Sà aϵpc;M$1$xO<}Wl\HQ>p:Y潟S5rL=o^<8o}R[.:3=i=}tȹ10 `ܾW[_-/FRcE訅>VwQK]JϿU=UgdcXW-Er;3_!"+qS|)qΰ[:Yט_{+oiO_d9?l.^9RjZ䰜_z~7Wׄ>%8/ibvNq:X6qdb~Rݵ+Ñ^󌒣*ӘnR^/X\VٻuGc{ j+x9pu$cLz{׸uҌC7kciqQ {_N3{u竀ZsuǕ]5޹%]v'QkȺо;t'7ʜCKy*;^uK~@o-Yxl_np|{m݉x߽\/h㤲] W|?9Gmdtt՜ǍɧguvSӜtq=oFӴۺsV[ȉ=,mYl1AY&SYnV;U D@@a}>H|nm;}uֶڤ z4IԍJJP(e >WVus((%7}pK}"W=l3wd>P;۵}Cڤi(p|FKh6 kW\{}[ ֩u)^qn ) T{ ku[^^G}}v;v^޶﮸6g}{o*/`맥蛻w|o{=E7wgm&ڛEnڗZnր}FG=w=x=3i\:\ _e^nr}^Y޵Y'P]},o"zyJo_Vޢsꯊ FZ:^wlmyܽ}uWC>w)Z>}E=@#BiѪ~LB POP"A4z&&iSSޡz!I*jzzhO%74ިj" =G4C#Gz"DLb='&Mh JH@4ȘM53#&L򞦘5A D11 !0OFi @S*nS*ruT Є"hIn#'4Sݰ^>OMPԔ+\h֨$BBƉj,3*N6Ͱߔɗc+7EZTSTZ#_ele5Lұ?8Rdi[DCjko-i-mO%8e5ZU0Os/iuKe6$mz{˵8hݶ˩[-\FhZZwm[LTbPPM[W55ha3NOI<8)fd>y] nidEJ٤"+dQ^WW5skwtjbƬjZ5)Z%4+H.0(bѪM^*W[M[&gxrlV7WJM[U[6'j<9v4O~T︦j6jG)w޹+[ڒup=;0 A>?geG_QOW,SܧOSdW.s6.c&6kV0:+(߰WH #_g EUcES&m"UUIS޿/{b*/FT8d!B%\ieXfĭ tڡTwnr'%FS}WZJU0R JA+hTl-j,j)Qp՜84~=qJD%-2Rأe5llMV5Se[RVa6J%젼J|O9OU]ʗъxmk1ĿNUQg,-)fib UmCd؛ -lU&ĦȖȖMVKV66jѶ6lmh56LL(R*7SAsU(*1**3D02KYZZXpbDzhnD=,ypRKM$(*;,wS1nxsmERλw{&PA9әQXs1* %ck7ӏuL)Z 3EjlIڭ ^gÞ]znM Hl~>}Iɿ)}F[b1%v0֐$:1 jrԒm+F6F66 fU5ԓlafR_W℄/GHW53E32=dnuuc;TTqtfh!`]wxMmo^~k \ :y7؆sF] =A?ۘb)2(׭UxyI3$)aϻ x%FVz>y\GR>-̰GgW!Oh{a$ x/:f$ys=}:UV߶gn $DjԤu&;2[)dм8|89=~.p 铴v9t$OBGR]xm{D48I<Ia(!q0pIzʾZzT|[e< UBh,qyös5'L|r%v$RƗr|`?DiuBW oY#L6py(6.ccYލ0),\v2.׵g>*5y*]` T@~c ,ruP²*T79EkVeb] %q&tX%IMK[(TLOOWc%̬&D2i(;O#OS<ɉj^J,iވ# _G\(dkQ"h*o)YEշIg9gg qLޙp Y>3yyIV} ]1 |#126y9ޖ7i$!"|:1G4PƃrTI8S>gKc ; V1>7ςi7w&G JO({;r-|p :FRfw6Wr5NQlwa":k(xoiJ,b>MNw{<5#1*3Lisacns'1c@ͣE\MW0+?ĽϠ_nΒcHw5ϮSU1`s2fý;@bmmBm='e*&fBd-[Wyn{׼|2[_li n7w- f*&_'`z \kkwWw_?]vgUx1`dwg)CxQ]N 1>K\"?,9΃ \tA!k3Ɠ DG=2DP0sSZmry&]\E؁*LMȸ[|'JV4z32TUw9諕vpZ3@,]>f$4f _L#1Aor"o|۶xx|i`'zǰ¥wT:0 O$~$yLl-{A_~SG=dON)<~?WL?ɏ w!v9*GQp򤲃rad!B(4 \<ꎘ+e}1-^mk 9DS5W$ľwRٴ0\dޟy;>Ot9$|SRt0&v!@6ӜGΏɸY%<4CƪUzv`ׁx'M}!0N+Lzw”YFom"p;JV291ƒ&i$h n@D + N_}S??gw顣(vM}1<8 g<޳v vOmu霶=Y[',ā"/5߭}\ZOR>dM¸\11@N"*]j.H72j i+{KxSupS/IY5|]s9e80ԑA3MLǷ4PD+puc{R3*ㆊEO-#y*Ms NLD;3~lԞW)Iʸi0eiުrŪ7qZ-1>;v|.T2ֵ{R xRl ][M$^ӦV)TEyJ 5Kye( I]2`ff`Lk  1bD1@T07$+c5>xZ6egʍf"rMD#.\?)# ql0XI:fb8GN7w8#x\Eh>RQ4 *R"i>  _:Sa7GLjgw@!7ա !߄p(>r>;~;MzgfI2x|t3U8R2S㍫o)N"I3ȆGL1o~'UR>P5b8>br"RfA6-mY} c(4:*Sh zlGgQ ƅ 40`զe9G&c"1gs :%M Ǻ,0Z u9A ܠz*|fàKO=%kpRP)ES5km+Zee"0 rn*9eA:Ff/__uj7[vSBOR2?J~7rz vS)ҧAN.~dU?sU ITyi=M!8Qu{dWm'9'ZOn2Swœ)/ow SUiq?-Q#?r:+Qj*.ɒ*J-mWF=|>IНӺ{'~$ =SN wO4菊6GΎdiFiFiFiF{Uw9(<{e: YٓqtFt};|Cs)|b:1fj _yEDWInϓe{;`20OiVP==_*xֵ .4HVԵ-CPɓ&L\LL&aV*YHG 8&Ea0L& #8G*3434+*3${Z H0]Ygn+L^oB'p]6^9GmduU!!ז梻,C4?h~xAϝ?y)|$SOܑR6H&8$kј:Μq /{Ҁ ?@%=P#ƦR U—dWcr nZ_2ꦫUiRRZ-FUQj-i45-GH;!G=qBޚ_DtQD|#=h>Hꍇ<.&Y2ɗ4TrX6xdUuaiZݼ>_)ySe2">rH&UxI1z.N T㉾DF5'b&Ĝ2Tɹ)])xt)Qv{q'O < Un.y򗒝8\Qq8u+&:rtNs2k&+,ꧤvrd-Ϗ$iW)ԶôKjwR^=AK.+n,;4K I'JyԝiG~O"،Գ(&e45+5UID&&MUJ4ILMD5Ԧ&14&&Yd&jd0fbd4YF)Va.DrLLX6MPj4SdCTlčlf&ٲ1FUM`fT4M&mm5LLL2i3I*2L٤Лm-&-6SPFJ"IURcm&4ZMle5J5K*mMQڂ3M), e5F Si6)F6TmM&m&lL0ݾ2ݒ,Vζ[UmTr; ҚkI2m.5ͰsuWV.q\[UVN'Idɓ'DɈh#HĄ3)HѪvƷUu\Ԣ.h;v듺ar)ݷMs5V4Ŭdh$) $6KdAA9rڮuswqJY1?Tj! ?$듐W4VB """" " ` !Z{nO %??gwmq:;!P1;f}t3x7gfUcv%ԛm.k%i$(i^2ý4<_e/+c.=qPȃDn*;ox+IBӦSĭmw$I~$ N{j oX]b=CXX1j^_ ׏s%ZU7 $k=;9"LJkTnw""h6j )O( viݻz% $C"*4\Z' ѕSjӿs5b`]V;{oI$G[[CxVF۷Z[u0U̥0Tp i};ו8X랊bb/Z?}(<}Vcq.Cg+ ( `90ۑ!cqcnAڳK,KQcl= Ԫ:˄ ?3f;}};0vgY$"(b(rF9gz$q݆>l?~|-hr,::2x;Z}֗NtMt˹d!HX%q!F PSJ}WK֮W|onZZ5Jk}yZ6{zo &oͽF ۿ?UM*˴A0G1C`_h[&Ҷ?P/$uP?yJ~j~vCLϫ c^ٰ%<ɹ:n/- SW@C2eh=KjX5!AdPJ?_!Sµ"Q0:~GȂ!6,SԷ ؈!o7T:OU3*9J-. KZT J&L4d[v%I ŦC3.ZT8sԨ/ 382g2̵boz\gs[f6yۖ^.kBԠiLI`(QW4r۩V`hLO;Kׄ.ݦRW#7*Ki{J3^KdԊdT-`Nm2I6JÔ% Iin,B@Aٕuyx̮tΒ|us޶-I5gv%&L\` BRӌ#! jU>$رWB{~nh#$x "&$NV-]vhyU^zWoqAGR4𑹲4$wkg1*Fsگ7S~|59Ή7 B7<K's[BNV:zI3\REc`a' uo !iOw~o}5:S?ާʟB>rʙKu?{*q֫fWW&Q~?[0g|Ww5Q"PquWec\/gi^2-jcMmgθ99VA\C_ #m> bأMJd͊9cTm bhckrg]TAm3j2+l.`l,wy}S*ǥmݻO*un~-4ٵbCϯ $t[MbI~r6Q^Ak |zge<x׽$ zOSּoGP:"Mp l`N:πˀw4MT#؎g.==7vYI*m X!ˡu!|!H{oQfz7oP/a!6A(%m(!SCz9(. J! dsb3OS aרK(pn[3 8yM$d?STS*qeOw?ԊC%ϓW=M~KE>#)O҄A59SwS;ߏShU+4@d*\A;Wz?; <^,*GOoTS/;)⧝ UOJ}9NPsRܧ:SʧS>?~^nU=:~?'oη;)OΩ,H|}oo}_WЀH2I >OzGx׹#빹"EUU &N_m# CҌj(,Y Kj mTC yP(H!'q$1"OIuҒG_UH>U}RuY~ni3=b^2@$?)#${ Oͩ#3tOڿ| {GY?$'*}xp|( (9! %_WPaG,I8CM$%x8o|Dࣼ8}F]^G)#\3O_NRC/?s\#q $h\=ZHCIߢHIΒ3\XH$_|ϋST>7Dz?H'F !~߸f7[ug\L/dF0 7jҎvӨO~:SVe̶dŁ>; atS''J~){*oN)SO51oǎxNrsd}2~ܑ%­,i4Z,ifTNjG1y>l ZY,)YEb$5D0`^w/:47';r.(Aw=u)#a,Vۛm5l4tܱMq-W 23ާ9B\㬓B"r5ՆcKvbaYalq4\yHZ]QىNUʾtƶSyli얇L@RA*P4l "HYM*&i5jF6-0mL,z96bv漵Dbh2b#2ʘ M jj;fVlJZvhc:]rڕoQ)3MA"M^aU?ޮ{{vcתENd}"*&^tB;>㺉SzYێEyhCGF`-ѷX_B#܉Npi]I BV(%0֪_|# swB(Awpuciw'űL_ysː̶5ng9 f O$PkW۱QLbi ׍jԼsWC$h~}Jb@FibBIR[d~MiZW1t?WG<3>_ڝ-Dl>8{Qʭ'|uvT Va{u쐈kas):4HfR ˁ @q D-eXF-a m]ob''Il$>IǍzo;Ϲ3zi7´ )5gO݋,107aV!/2ӟ~ q֕ޛ::Ө9SʎQH9 ۷jܒ4XƞrC&Dnf G!Wvn% uӼhۢ07ؤ^# G<$O|e!HEA34|+m# fVEӪF<X:1qUJ̓ 㓼V."17;'? V~T5xP:x;1Pt!}HcT^$H;< ť~B4~8KPX3OZFkn.Ã|س3E32BC6fi:r0^|Y$Hi}rծE%`L=~J1L4l! 4@:@. ]~=s9+uMM[O(4'xp1Q6ϫ1䙜2>&1a!pCF]`+cVE/￟RS31 &14[kX0VtYVmcN CvwK0f!HLXNvS`-4S.8ps*KwC 1E籍JX>3*&VQNaۂK57T"uy9z]M2IUQA9DEH+=sNu?xAT?W % o礕71n|v?-|gIn+쏠[={v~JtŌN7JJE&kgL"CzDB45 \ 5p߯ܤIeSS__9QdfI]{&hb Iٹ^dfS}c!d2~,8VY{kMlfFN"}XOݓXT6gftx8O]o8PoM{]?qS.nѴ1gM;VE#lp=wjף"093X=;Tzc=ps~[U6E5Š>b夁6_f.^#:3 }ii88]K =shCZ`'OжvȾNq3W؆©#vhܰG7"o]}?O1NɜCL8m2[+Zjm^6ƩnO~a)6=;xdN,*,%+.rAZ2戥O>KFT _mS*}p%?qze I'[CCb/)(Z Ncb~-~Cm7uv3Q 'qigx=p?~umL9s0)&RAd! ,%E" DDM5䦸-irr=4gG !s ń2(!I$&%1IjrbᕀN2wIIw tRB2O%,%P dȄm uqΜJf)Br}ei$#;l &`HʃRu$x#$rEY0FԱd,zcyK4ꩊh0i+N2BdՅmV=֪ee,6F6u((2I|1aġibH"zy;C@P50!-#̶~ n|4|_ :%OSHn;VSJE{^X9Ȏ*/б6#2K%8^ 3)a&^A7{'YUUUVÞBm кx XwՐ# -~*,PB8~z?QsQudȋ❟<5G<^H:8UD]NA.%Ǭ2"gA4Zs^F%'uẕx ed́W T(bZuN_W4=l8 A4p >ݠ?<nKG  kܪWV/,5հ1^ _iK k6aT(/ 9g?I֊ȇ [7LuWܯ#_,N2'wG!h,c忌qNj-/ ϟl#?G,en=֜"`cBHf"OG!Q\iip~H^qAg( EU *\;2 }Ggzނ #WN9.-,WmB,/FՏ.^A^7j.q(xL"Hcvb(;ˉ~>0WXs'y ?$}'Ѽ)g\Y>dL99a(TLJƕ7ȝs6^=,1}.n!(t dHkgcö[Jk4/Ǫ3 QttaKs؅ԙzATD<5<`cL雫PG#E,1nZfȹe}?)?%|L ^/i?&?xLe?NIҘ3wSS%:SqLARSNRӝCʃeXӽzrX~1k%:w$Z"ZD1 $ \MP5&Ȁ( hc. sCvՇQ f!+ Ɂ"е'NKJ8 n֌"ce⶟l \&ӌ$8 x-SR t7B ys^#Ѥ^槯\[.:m(M9.'C]dfDٸX=Fm*B~NXZtv1QD2 2xć82 D`_M6&HUhplfjl;$ s! )*fM+d1dBV5%eA$mxJ#+}/`%k]79A#}QhtrN;_9_5YOhJE)K . -,K- ќtA|j)`  8Ēr aL牶k$owEW7d+hT[VذC,Nb}4]NU`0: 6fCNNwԅO<"# B%"KzPH6FF"܇vCn,WwPX(/ĸpZb-'j"L4Vp FQPpq[{IUu{`aAQ)լ7T*(v.N/ +9;"Ȅi+: i<€dlNČ,ޗ7t6S,na=;kŌJ[PU,UUft @ܦe5 i@qq 0! C!`)!iІD\2 ;) bD,ƍU!Cc%b-X 񲌰t`MApFiĬRPBW5]u*S_5ֳd 'V*!qġj)ʰ!ˌri,m<Nw#E*yʒ`ag ,UQH6|й9a`g{nAڔR 6D5M45pgsPiXSb%Bܶ1D/F0AmI@Mմkj"0Yy邒}^sN,DgFDegd@x!uy }/ ]zpxғVن1 M}M%Z*4iAUj 'jeƦBeZdMFM&5RL:Se1S"D"MLD! TTDiXͲ̵j lQ51mm-DRW͋i 6a41!F"smon#OJ_jH/AC~kW{cĄfjVٍif1j[h'rmMkLTBm-K2#!]@ CߓR0-!KI Im j;FM\8) *ҍE1l.4C^٠/,@"uWI &n G«άWo2Y:fKtmgtXs6xTxi*G|ŤɐEcij8Χz^jl2IrfQSf6(2؁wO^[zlY fml6QٶRJ҇Ozd>?)m ifiL2dɓ&Miiiiiiiih5VUP)֠MS қmA tM4M42dɓ&L2dɓ&L2dɛhm]mVNJkqNNT(cTK5UUI]02OSvA[:Rnۥ8)8Si;#?ST<ȧe0;Rskimwymw[Ih0=U/I"t4DİG =Y3Xᾄ$HO >!v߾ɽb0L N!jx$l:T_|\XIG-vA}YWZt$~t=94d%/kFuf+6MeIWѫ9ԶyvɲY4|s:l2ɬ&t.Gך8EEET vC?YmkWawyw5vEֱGR=1 o6ϦonXIEbo]㜜!۪֙&Oi=l?]"=OsʁҋhEo6$pqSM|\T<xm<j{qdW*8GӜ:rQrsېwa˒8Ӥ^CzЁ1 b# LC$v jbZՌ=>8T.8ko@pI~JR 8@~Ꝇ4mU\xȞ|bG8-K"E[Y[z,E !?oiڶ!6A1C]" ",Kpw[mrYs]Si2;$9lĈ<#M}V1h!(ez$r}mOrcbU8iLɳ"AM;z= wMr9BaqxAeÎ&e^!?S|믅=Eam5ű<עOxr9ԘVikdP$4o|\#w$Hx HP;U@PZVR҄Ui$~Gq>-G~Um~lIn.&iUI߫ůR(&CJ@_@t$z*OthD2mR|b'蚃dy>˖6yX;~y?1tRh/͉~OM>ة^MꏱQ,-FN{U^} {iU}6[*Ut~/Wɏ\h>y);ɶ.oҝG?].|=[[UxCe>{'|*~*ʙM)?&O}D!$fҧI! )(-i2ٚ bZ Fjr굦и7GOi2Ռ l֋er=Ho J?*g:>K#f**gf[r{EI>lk9sp=ٿ.M'4~x֓N^:t\S1W#u4|PL6ƶSO=~؟_);TszOxhx+i=},}lJ1|Y=0n?>$#Emiw2նK?Ix?OrSYxT'qQ6W9_}#$co歚\d^%G(>磣H([9ִg++c3QCC*3anW;?hצB5#ZbYCP"4sB|>3Ng*c*Y]I8x)yZ}ƯA=Zq$/H+נAßD[Eۂ3`$D"DHb!6ԅ!Hbms;tɓd1FQiF#o1mmn@9pn@ _)]]Vm 3vz$g!I{>dXĊyـ`6 Nqǀ@ ~r)$$M6uA KG/Sb@NaepA^?%iT\Z1c ?y!|c *SME N[f+lA4I^7lmJx!~bިH<}#ďnKT{GWݳ6|xzmW\ğ|>;E9O_ْ$GNi6Y?*YXKj`!x0 ,ʨH}6L/\뮮-m'O~%?S, 40Q9d}?LIcob}f^,1i=~4< lw' >p>cO\~}.tc%-~>=Զҷ?%^ݍ7ɄD,OqRJg;،Vx;?oK~cy4&e4e$6NiHoruOc<li$X$`${%??iRS1ȃU'ݷ۝*>_oO@G 'S~|=iXCѓH,,>'$9 3*{ZK!+LVK/Brc6hɑ RFQ>%\0TݟޭđC^yZ'j$<=Fw3JUi[-WrYصk<5ti#mmPkiXԁVXMdؙAb~cU[lmlpbJU2Tʙ&fW<ݶ޹-.ufd/ZR0V đB_;itei67YƧqUSZ  Z D@Napnrխ"dCdj*F}ާn Ӿ 26jXE#L)ˌ&q ӢEKB yG?|ռV>WikSbu@QʶS~<_ߗs]*76SII X*nd7&5v\6rwGnK&[k8H}9;PjmPy&ߒə 7|ѭV>K~ |ywB"u'U_ma3c5bc8=t/}P}󼏡FM3JVme2f}OFۙĂqm\q.BfK!.<rf/R8t._RukRkV6ǔ|uvk0u.F_[c;7OXu_r 'g̒&8Wci zvvavx@Ee/D n#xɎ6u4ۢ몙~)S߫ʻzɱƘ]3^n2 926ɘ{`2IZ~zV21Ur>e-}sP~ p͹K$s^Bմ[Ir2/_M|||ʼ7q'>mzGi1 jA 1H߇T#$^FDvi~&6e8t>~^8Aw=u-A&_o|}땭~U?}d?/w= RGo9{- ,GWj`ji1t\i_o/|j_OS/٦~ _+P9?u>ol'z^-x);j~d+БQ:u]6ͳ:㌂H0/\띭{M)YvX#LTȟQ?솜u钿5[5\X*!-򄑤iBZIO$i0Ug!h7$J_ҾbIM*1WzsɆM˽M[FzkbֹZ'  2Uq<#3/~{<5ɯ-9%ڪRIAx#B8ci cHL:~xonyԒhUN&|I?V1i4E5,KR%1 c&ƦIT##HPs4*!L YW9SurilƬk%puLhr]fgIm6 = 7qOUuT*)9};o\_bFܑQ@$1>0zf[Ո&s~DUf=*t vO{\[aUUH"S?č#J۳ATEHaI5ş "ݮʱbi"GpmH[4d|k|itɈ9`ЩޔLs1nMD#@b)ޞ0!G%PHXô0ýBBP1 $S\'97h3!鱱qCY~A#OD#BCHq+52elO2N HXINj-r[ 50aQt6?Gz1dfoy;QLP >(n$"&\cjRz&U!f O r-SJ;S)R$@aCf=R(}M䜒;َS9Լ~,OͶM"o?_Cޞ1>}tWs.߿tt])eIa4>C9 ŨݍƷZkLD#!Ć!!Hbi5i515!!HbR:uޫ\.)ܨ l>@~"Em)"44+׳sT}LhOg3zHUWKrF12X %U `DI(0 N.ıi`^ )5W&kr?0jƶ+|zvUUWHZi Q453VvHrH$R61MLG}W[LW'^vkwqS{{S)>;kg#ѳm(B((1N9 i*Ӛ,YYi6A0'z*A|xO+~EH$ޭܓmFTQExHR=OlP'ۤ>J~UUUUW[TDMn-L5SaH{?Rol0~z[N]xcE{VY t*)^~0YJkjo=|–9!<찁4"hDbV⟟QJpjE=bwT3b6%&ZUG32\,myb=sN/!@<"jnu(L&wB{-`I I"_,)e063RJECXɩB+h' mp(1frodލGYY+isj5YFk̅Y`E,댌7h p[9!ѹPjb$ |(t=fsKw8ld, 8:bg'!$l'&|sDu^`lLi=Q"M~șc|]j|kwPU+֏*U6\83ӯFk,fhqArOQǤ)9(H(9,H!5Pղq=NO,5[) Ki$40CMj-ƺRBRVFDC^ >`@p!:$%ZgC "9榹&͜xZC!kQȋ͏<#[;縇i Bh7;d3HrY ֋;Ȍ @D"W5"<,G|s1f㓷3| Alt]BA#I +uQReu! `Ҙ8 v$h@}2TbC9r̈D"pHB˧#"9}$Ĉ8BLгVijAb0s'9^ ,gE RRͪ׷5N ,n5cz.كZ(Ġ@m$4!PUƣPnYQL)V@d[)X\CyP6;RPzwJB DYܜ$fXCmf,ǎ%m*z7gcjFHrBLUbN-xtnrO<ʓo??WvJFmߧX$DKR2DY;g$UQ#d8 ά648ibavuD$$ƽ]y&U}N;UV $ '2B#h&og.!3Ɉ B *EDQ'D{-) ց$ $/_=;mmSʜnq9[_/SJst|[UO_8_SqW:R<<^^-]mE8ҥ8,Biŀd|I&<;d~3|dqtuODv:wsQ~'Yu*Y=tBg.ktFފnTR͗b.E6[~{̠IbHm Wo&O^"徖HkZQwzz0>RJQGqEQ1 t[$`cZӺBHЋ998G炥DNAcbM% -&MX,bY-]^u15PO&Ov)clCm|T^=W㶶Y9Y3V1aK[V6_OWbZ2?Greg@z$W$vԋ!$s_|I7 W:K*~}VaȤcUlL]蝾ߝOQ#Hi%m r8O$ʰޘxsx9I`nD2(,` H<(5Jsߎ:Sq9JlF]S"&=U\v&̽'g=3fE*Dvoݔ89s[mmJm!>_?h_>S)mSBS&mFk*f_§O}oC1:[F\TADTh"љ8ŜN7x;l|pFfNlәHyϟMQHַo Nb떻:&쐌ݗz&DX"2!IY<:a Z-DPL&L1g" !q98ڱW>[\'v&FsdYpLK#"4橖$\ZC")x83:@W+#m>R>R5!VwM$Q|zj&* MH#CawnLPL8sywd옶wĸz[ܩpqfҦ}VĄ;KKc幤{Źړ3 jJ3L٩8uh^XFm_9'S]c?c/5x'*,`cIU6|slQ~Hbxa'°^724!\caD0ANN Rt֭)st) `%0؍S52ۧ:AN14j.)i5&fڑB` >|DJӽf}m7sulfb`j4<"[~'w#>CZ3['Ss:U4zIԝIԝrLN'5+RՈg5g̓aZ,Y_98M'99&N)qCY]TI$z_W_Y mW뾜}ϙc\آeavyw.X Pȹͥ+/ӄvNVExiOpEH_w\bPɮbG(A(fo&mۣm*T7w?'%/(="ґ]= rO7z[[ld#q`Ж$jOIIrPuf)#7u%e=O.wbc ' -#KrT^//d^SoHƵ5[Jb7w#z*^RҔ1&TH%/l339qիa @aFsMH ,1SC>5`V:km `f sݦOfZIZ1&hcd8 1\g6#i"G7wPK52MwED30mQe)reԻeiGz׎ѴɥF̶Nzx }CShTfiD=jU)4l#&Fю Teu m ag: 1 pAm- #DS%d 26ĥRUJ%RAMSה.!wS'eٵJ.,cf,\3lwDXBWuZ)jJnMfc3G(w:4ZKrj&Z-m#W5sPT]9ՕV`(-,6 f䎣ާO5Lj͙df$~ƒJѾ$U>!$-b2 8:F2CJovkVۭuG|:; }5WEFYUSƧr~'=<]JBAILс|iYu"'c,{Q? bN)y))R9$_R9PMù=κ=;br?~jO𤞓q=.mz^$rAUh 5m6-Rka51j k,mAmYM,W{ITsv`P%O'#d }W!),ơKlc/OmHK!}xg]fL9;7f=Y^Ob-Dwsv>g<ȳۘg~I"G\% zI*P!H{sM}`swr"#?wΉD˖[D"<˺FMݰ=U )KHxUNd~(8nI%b?tx}PU):AҐy A;SIS!:𚈨j"퉈3A;e],SyzKѳLcgْ'8v]/=}>5$ɘ$1CZL $=}ǻ:Rj5i&O(#YIBJITk3P"Z#YOd[ HK]Vd&ȂA $@,hA\%G;]sA&nwm^gFjYcYw5uΛLbcd[bҕ+ -s !IC) b(8E6H+BDF'?[VQ›mb8Qa@D <ՒN`  AϥMg-] (󘷝yH=I zGڹzcViZjZU-+:.EmMFKi/h'1HTH@bD@8B7LKAD ם7+54ed½ok6l("ߞUMtOͼ#詨,75?LRSn!G= bG{_ _0Z)^-jO+Mp-Q'WYc(j=HgSrtW|"s69}PMУP DT[J$4@%3c%Gii9ZD%2ṫRv]ԕ˚_7ۭS2}3ͷ|";umLi4$ 4"I?&*fsG9+Li]kxUJN(i~_dϙMEĩ v<._b1_rgWEߖUGՕ}GڦZIdZx_ v4_׏;X}6~m9ge86MwU+u0Լ$ST,N. Co,#hi"qN$RtSky9Io&e?JORhқ*>ƒ}&kns_:ti6I&i6b #f[<$>vn iuYV>A H0dSϮܢ51a=wr 2^,mbH͠a}ol"SǣLIRUP*I)]?BB]6RkHs갴bR5s fY l8MMP7(TlQ^ݟk$T9a!+)Nid'epn`i3IBam2~- Bh4x@DNiO)fզMrR-&lڲ{lmY$$AY# vb.[Fu ,J* FPƷ>loB}7m|_%Yov%AJhPDƆ[PO1 Uܲ.'|v8Sc,I1:w0\I^>Q}5Wrl Ui~#ܾ[BjBz@TuI[Ӝ9jw:<< mnAެ020PHV慌1l=XMH) $#NHN ݩaղu]l+GrWٽM!'9<)ضѵI4QM9eN+㪮O~`XvSғ]yi٭jz/{O<=M׎N|$✐:ԅt}F|:&T2Dߧي >l'$<9 M$V'])oj5[ d6[ hf>-KYik*lĬ#Ҫ5xu-db5[jV^|1uZ֯ )3jj:N_\`T}>Tse? g.\'M.ia}EN'2TɿZP. ORC5EAWMq-=?pWRyhjCh}0E+{> QBy ZVf6gw=x)+p7U S CsgFH%/H1"#L@eHѬȹ!.pZH%0 58zG):հ*Y_[[l|w+_zmZ/GyWjkPj3335-T_^)տHr|ƓΖso%4 RjܕP|"$&2Ώ^w[`JHI׫ki5L*u,Ow\˶;^.T+㕽\kujXR =NuځϓfzkZ2iVi-LdMSU̒q}k ,a~THhU^ZG"*Isd=}I.|k*l.g~Ѯ'*Ä--Q3M,b*[FQC[R V"j5HHmd-55)Si}*aIq K+$GҋTdFdGV%u>> gmX)'i%hUle 3"#mHz9M6F:}ЖI@BiXtbۓr%r<}GVy>L0[[m-[! &P'~"~M|S}%oQߑ2li1;C_VJ}GY2r11zOUɴ{#p =1=]-S$/ۦ͍Fi4kAVʤ i05mVdhZ ZM/ֿ~ϛF_z_Eq=Zt^ ŠxU4yx^55샟w*qE;Vg, !Yj[ӎSS 3ekۦ^+uX@ާ&>:T4kX4F1e˔e6 Ar뎭[kVŭa@ TQ),(szxV(d%XЭmApeܲnF9Y#M[]Wk%#nRI"mbjv2.3qreN.쿀E[U-#Pc3m2tO([Yo Q5S6xWEO~8n<{$KЍ>{}.m-i{)TZzHobp`SW>Os.a\y_W7۶Ԛ:4PjCmL͖ɹr_E>O~>--,@>qavmiTGdL8^Q*&!F|a S*6ݝwN+O_=w|ڧ\'.ed&DX$ HO:o<$f~bK@*+s2QLd(@{cgkKL҃eKS@(WCc1J:68b6c] #c墭\,Ԏ=|g-l8ҝa^V0%lwjfXh6%H OcBI$IiwN7!h}n֑jG,Fjiyx<_xݪ/)^W5TOg]jHib![xBt09<Fh?2r>H]Њ!# o"#*2S"ѽ&?fTHJ((. ՟&CZ@H3h0"]e4iN|i$3LSP#&n tq8i))4Y5 t*4bRնgkԑZ3-x{UDý&Sm51E&#-Ae'#^4JG>zBQ 1 {tF Bvx~>#keUb& !DFL NXQϟI&磶iݛ.w{`jl:&dF1#(EysˊWiǢE;:~qO }2n'ݓ9UUO{nG_oT'K_h$`|1<%%^V!J]ᯑ^/23Χqpm׷8xISޫ5Te)ɴ%FQtN4"`5NWS)OYTI#<~oUrӉ#ޣ@5Dm"j`8ӛ[㻔WSU>jlj 8ഛzSw $1FbDò@ONu{{=>ByВ0 k7~H bDhZBh)mUTlCcC-7ryA' SG'i>)9>g$_Zz;&!'0 q뙧 Hy#95-tΈc 8ԶBW/`4jjq^+lwDAqRjJ\O1ǒ\vǑb؀ϚjI r-l+#Ia(  Hwv UR koږuH IC ]djLy%9XbӉ79LF[̢5|}3MqlЊq"+$NbG$_}$6򐌔##ZB%K֜X ҕg0ɀVB].;ݞsGJlUYAxѽno&  (4.X[JmDDz$>BXvq4qW79D$jE܄ _`?[ ECO:ml14i-̑eXg3)EکۭVr e[$S6jڐ)fؑƜjnIm8q&FNhKsRjlK\5!1$^yRG!!$pE8BmL w]߉AÎeFUUu)\leeqL/Bku=槅}ҭ+9NRv|8T_Ib2FXuC1Hcǡn $%OJncω"3*SQk3]q!JU{^Rq;sqn0ڍ%u/}FOQ6LFmBF $z O_'W'G%f1+VB GlEPFIJ荈h6e:O Eax R¥yt\Lc*uZ\`QUmAu-- vڶ$FI mTd2eRm}4\+͕̲UUˉOQ6XEO7虖W+_c[Z\l6-t.l4}JwAEPr )lR13(1rM'RrN44NNI9'vX"$4FhH^T^u1,Ű Hm)v뫦S)ܨ3_#i$.呯.ZJZn5o {8L'Jh$m0qX&!Dgp7)˾-[w|+;Ap#m]UÇww5UpH l:blHKv iJvof2hlxF/WNp( #æ*iۚ rUrNUMp sqsjIaah,XIve+Wk.ZA>̾I#SyU.#D".[Tv׎3HbZZO  v-Uo 'Wƽ9[Sh٩bϿW޴f ƨ2o有Zeq#mc*F6q"++h5hm(d-ȥ-j䃟C0j>DP BF%lm/orPx^:ʝ֙ۍs&5J4[4+0jٴƔ,l~U:>ؕqL\5| QĶZ>|RTEFPկUG5N,2km'(8e5YN[f\ijsm3Nf'U5)rZ-o߶d23eo ˹('U~:O;(?2>9f{AFک|>lFjiƫUý?ɖ̩>MԻZKb--ELj6,r#yNֱ`f}`gKٕZCԒcrԏB:U>򹖂GC/ڼ4Jwɔ>X:DS$-vȗa 36<V@$ -_8X)#[Fjx}a-u\uti4-&IœdklRm(]oG4W)9&}49E~{NJxj5Y~ۙER5(ZO&ee9v*Zbb«5P+RliJƣv}t͘I&2v^MҤiBH!f{ZqƗhLHܳۉn*ߑmЦ+m 5X0lkDd.|m$c`/s>H>2u&IʜSrń,!BmYW<6]ո*&> #vD=jnӐkS=2GHܑu<1s@ ʭJ?Ae!> _ubDv:8'I'F!dv 8XMr>rN2Cvm=W2*וֹb';nّmXX}=MO~ܤ `Xz,MȱWE?&K)@C-I@8$ mjQt]6fu1_Q8C"*s(U[h0˒D E(=4i!6]ÙtNw^r3j Q$$kRCCq];Cel0\VFfPI,Ac!1G[5(zi=(3ŚPLZbH[?"שMQSHG,^ݩ;FZ~z~<|{;A8G }u$ڑ&- cU><5d:S_5W8Su3fͅS~:SNBSt/=mUMҙ1HUm*6PGdTWfmZߚ E]I,^&r##?B2pg/aHVͳvv*`ŤL$IxM&[ s02C!K2ysncityCS$^G'(+$k8:"% YH^*CpDLL4ɦdz2mLdRTM=L6im# ==Fm@RH4!@4h44 C!" M im"FC̬sBd!b",]qk#k6͘oLd{̙;! 8ff Fi41r&=rd زD 90s[=Ь+ PҟR!11=xI2R8C$yʫ5.uttlx l1[O6&WtC&,5zv