#!/usr/bin/python # # Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING from ipsilon.util.log import Log import cherrypy import uuid class SecureCookie(Log): def __init__(self, name=None, value=None, maxage=None, expires=None): if name is None: self.name = str(uuid.uuid4()) else: self.name = str(name) self.path = None self.secure = cherrypy.config.get('tools.sessions.secure', True) self.httponly = cherrypy.config.get('tools.sessions.httponly', True) self.maxage = maxage self.expires = expires self.value = value def _get_cookie_attr(self, name): return getattr(cherrypy.request.cookie[self.name], name, None) def _set_cookie_attr(self, name, value): if value is not None and value is not False: cherrypy.response.cookie[self.name][name] = value def receive(self): if self.name not in cherrypy.request.cookie: return self.value = cherrypy.request.cookie[self.name].value self.path = self._get_cookie_attr('path') self.secure = self._get_cookie_attr('secure') self.httponly = self._get_cookie_attr('httponly') self.maxage = self._get_cookie_attr('max-age') self.expires = self._get_cookie_attr('expires') def _store(self): if self.value is None: raise ValueError('Cookie has no value') if self.maxage is None and self.expires is not 0: # 5 minutes should be enough ... self.maxage = 300 cherrypy.response.cookie[self.name] = str(self.value) if self.path: path = self.path else: path = cherrypy.config.get('base.mount', '/') self._set_cookie_attr('path', path) self._set_cookie_attr('secure', self.secure) self._set_cookie_attr('httponly', self.httponly) self._set_cookie_attr('max-age', self.maxage) self._set_cookie_attr('expires', self.expires) self.debug('Cookie op: %s' % cherrypy.response.cookie[self.name]) def delete(self): self.expires = 0 self.debug('Deleting cookie %s' % self.name) self._store() def send(self): self.debug('Sending cookie %s' % self.name) self._store() s{|Zx>BI¢3ݕ7<o~Dt1̱HhufA`u=54&6~8x\5z1#4 ~ncre;۲T,h'o'E\|z€N82ң RĖcvfGo]> W=NaC5+.Cab6a P;uBB1:Q$)Dn&:ʼҘbM%fUv$LY]'x8:Fi^ }'DQN7Ul`[bN9+YF+"*0)xW_"^{409',7H`xm)>$Ƒ kOrC`961_O[{L!FSm,#s{母GY#2! O8ǭveۑx`Po$\&31JxLw$) @@TF(A׀EMD7!"_hEx֓ݒ_vE{up- Q'%L̓~{,˭[?`i8.SU5MW$rȣU 4Η2H] @RqĝOGXA+uz|L)@tsH~E9Sv[მAj fOI+wJL+ YB S._Y \o`{ ;ᒛ>R [d>7LSI$ ٸK#Cj\D1""zpWڄu]`ˬA҈ ]ϔěn3v0xѱ> b[+YՀR7ir5IBG qgD"',TǼ❕;4%Lc]&ܵ#͠CFE'emxb!q+i&f=T8bJ8yا_"8~cOl2ؽ&[3Vu7[J gmyoº+u[OV\a>I@"9tVI_acF|B9w~滂(g;‰OI;SV%16=+MTEYBqYպ&t].Aӗf,t@"{ٺm:\͗}o|)d/Aja ECa)1<8]n $81\cH}Кp8 "5"7g*;y1+Gx5G= 7Zceyռ- ˊ&9`DZ-}ȝ8&i?) M@BN>%ǼW x2R e}0̓}RukY~B$ĒP.!-jwB9w xmG^&>7´$! r@l:Sc6fy>VϖK=JbQc۹x}hMD=bHlX۴hF~"Tgڇ$H8}V[&BפFBe |$K$Zzd >׭4\+yg.0Lൢ25tQ2Umݎ "%&t"|SS:i{biLQ⻈xG\9]֖WT$N5nhh ju,!VovE&`K#}}hąyrz bӨ˱f?*(lPm4)[Cn+6[-Z߆ Y#MvUKD@dX \i_ K22 ()TՔh(~}hc ɒ2zj rF"?;ԎLjbқ OEj⋏ >Bd5YAxa;k dXgH{QcuP)̺?I}R{bAx<*Urn3$u']@8"(y ݞ |m=ao% !--g|ЖbyfH_]s4` 'uew%*J4 -;HT"dVڬ&+GkݖV¹n6(׍:yz]C7^*[q]oZʎCrodC-dv!̝gd}g/ߒ]5>C rA[e$580ff*U#1F,vݢJh ו!>Žto @a4? 4{&A_7KO-H$AgCn|`C 57vE{)rIǮ:!D7(8D|0dn} N(D˘o%U;ϣU ȴ?Pq*9.kOE} ݩ=Lݾ{Ɉ~!K;U\, dUg4O~D7q@au5*r f1w#Ĺ+??] iU Z2E]/YH؇Ĩu>ER<9rԭ,t*pqԋS2($m}pufu`Ai’:XB@є:2rix,1a4v[[.Wƭ=*>VYlfBd;埼(#3nU%#U Z蕝 gNH&o3`7*3("@n9zTä>10c~\wnQl(vdYLք!օ%ˇ3b70HI2S~&Uߍȅ+JFPX>ttR WcL>$ ]ӟqm誸u]YVʱ?. ].5 ?>ZJjSnxw~^J 7젤G#*c<>@L7BxL+=X $ <75Qԏ1nEZCo}S2V2 7ُubu#H?69^٨0BMș#!0EG._=Nu;KqJSfwc4* د8a8_LX.bt2GMz6d"8sI9,B%'Ox-#;p]9.>37]܊;u+Y_vGu@BvRhg&̟ip4Ւ%?q,5,_8h8b=Iɬzh\QS4< lѫ2r@I=/޴*`'2+FEb=zߕ4(Փ&͍COνy򛵏C%~ي;Olf g7.Ԍ}¸TP(.udM} #U46^H9̡>R'@F'Ds{טsc@e'F2C"%׈_9۹uP'ZC#%Iy/8? XWu>,g„C9(7H9''PKu f<&VRw}U{@ȡY\((^$W)/SzܻMICBV;Lj `'0L}ޙ_b}w`059Hs٩SvH?,Q} xw3FܘeM57*7 V>qif@Thۺe[%UR@D#8IJ  R&gQӧmnm'YU(&"kzkꪝ!i%8z%`Zȭs"ZUVgWEuyj +WY1#mj6G{f`$p3?O)$*ǻ렝QRt!/4$cN% Rbvx&I} 1Au"&BĶ8O87l ى3{8`,S2(BA6z>$+p3bJi{{8,7+5T>9 OUf?gW¼1B592n<_cuC($ 疸Zpm)I3!sA|xܧ5;,-JbTu~w$GUș ܷ 4XHNA> g/0%+ڋ|-dL w4t[Ny5*E*ͧ&CQ=FJg*w/Qu ECUg_j'2QEJ>I_W?qXGPh}!&LmӻSEIUЬ=mJ 4∓cLмA!s  Gx7 L[g\g?Xrn|p%-G%r+hQ^4X+itO?: Ch˱)8(gEgu̘v@ߝeG]|)d Mw'hbLOd|mnj9u'fOUp6Ee;Ίɦgш*;m B0"$?:I) z9(aT6c`: ˛lf~AG/.=acP(#RI1qIJ|J!NĩflFg,92!!Sc'Y*/^^k4LdjbıKŹL\1 `7gۼ:Q4@S'R]pZ[WrnUmIPd|4AǷg^5 pf,ɭXԋb .XhLLJ+5:+ _F{[ޓLB`-@b9~\qVWH%۷J e=fHQ &IX Į5.&Ų"uGz&;)/Ш]i~($l.Vc5NfomW3}!%FIEb΅Z.V\IMYZv GtPQ<Һ=®ȁ Qm0iߑU9Rf 6[9$|4S MT([ ^4+n6JX8@8%Ec/:Ҕseq*c Hڵv{UXh!= b&w#d$!KA(nG:(vo=i=Qp ~"@6SP/ҜI@)Zvھ+Z[;'bO ^'?{0D L9SNtD^\dGMVP*лcĹ$)+qP69Cpih1/Ζ+;@2/$wf*yT͖w독3aΌEPklyvž1./Бs6?'Dl_sj竨LxhTj]PatXG<=yB+F2<11Hc. BII^I4 wH-Lw=J#c2 O6/c<7~q"[j"G- Z_)+g!^" ܌&낐û97 )#Cm&Qfܭ3boBV%4(k8Y?|jצè! `G+ vgl UMX01C:0ܧ) ggj?lc(E Te/ӂϋLJnH kū*:M'$0ԑ0+#EkD,MUӍ]ȺS@^Ýmiet}v|xHx6$kV({A*lP+wDIIcNPWR0g6ʼn, uT "YKB$/rBH2!hs3/޴ˀ.z R3x`PF4YǼ 3YNIVj Pg 3E|Y 4_ .AyJC\̗x?2J2WDn*$cx`CڋLfr:[9>hpxz"?o٣m]ҲVBhү ?A!;*[2 J&tvE}N-o{*; 7R㒃on֒)  _W_"v(UKATGioڍ*Tzf-h= O`t}s't+5A@?_ bΊ7z:SWWILpКʭ7`8kj򺄴R6oyFu45Ql4057VjS^+:2{]M;Wj5a/>ci#m| t)5𮽨ETe/t'7;r{ #wWA'F!}P*s)'f[x6A \IMceS#UǵHR\6~ w hRdZ}[xL܉ +k/XN+M$=$RjPe~7ze{4>iknarzVpf&LF7kȕ~ @{B395TrJnNr.JȎ^#(C D$LG7'S&S6:!khļhm@#KenoրŜs"޿ِX؅q[&&r#ޛ!uEa'y{ZDplA/GWk_@(CtI,!z?쟽 K oQ\J!C dш~;JP[[!6)1icB0ȋ\…Z< p,? );{:i&Jwv~67 Τ޸y t*bs׫K'd9 }4 m9$Ѹ|Ҙu܉ʼG^%j BK6bw]#lXD"=g);Fe-Dwv1L2 ;9S.(\O3?AQStD|Dfn?v붲rʟoDG| +fܮBS FSvBE*6 95`v}>@Y e'ـ,^*Z}=,A? L jfmC0:&6I a`WZ,qF}1ɜѣDaM𡖟$37f֨(|\)⅗ u>8B$ rѰ 6b́ ?r/PE$]E3WgN; PJO~q"e +nu#G9 0 "pjxVӯvJGES].l˄C{[6Dr-;UsA.-4_]aX/&׋6:o/M@v+qZhMs*mN:"4xf\_с] '};X̱VÐKŴk.$ I 4=_ROuϣ`5ὃr)GY Lޓn"MqN yIL9b/Zn/o[|$D"%e(NYZߎ1-Z@bk5;T,sypkF_g͜V W*&U׆8 6ܐ5;MAXMt#kR9/,CWvZGZ$-3e:<<"b=BupJ0xgѝ{6YףvNyRNp#%..)dF/-Gvju8?eO<þV='}bI g&8.cꨬwmU;)-תuWl4X uUi<|7sl%=WQͮrϤ2WQQ~1I] &io)*joYYqC)P1jįE -io:pR<С_vt")̏j`mTyEGZGǴG2L#@WEb 4%lB\50՝NIXIja 6XakNQhQ8iFDS"eEgs]j(^9ـusOi`4z[F_>]hlv/O3Saux퀒pPl =_riJ&TƇ3IQN:94_JS#J9|rF j-)p `>%v2`XtFI{1'?a9XEꚑ̨敧IU 0aUa|*Cy\}ucqPMقj.4(CNIHC`Ƅk2kHo_]JI)nxV*)}i\U8604S79z"b/Z<#_{Kɿd}Ђ^FL`>l9{6L%&l,:Pv~Kh/ބ/Tgwre"24kb*<'/jmَS(xm.t6m h: XK?$l]$3U90kAsDzP ?sъ>ڪ ;/; wMvEi(yؠ}?Xg ЗGI,Jkh n4lI`|"זUKC%D ?P[ }s/9!<OΚiсBX( RN^9`w_Y+ F!{)Ld&a$ r&A(4!TWuL7`W1rL' 6(uVtخgV\~_Xnj{C(iUJ索-IQvKΩipUaη$!Ԣ*lDfOm7>Lˇ̇9%L`;ӎ5ݖ:Ϟ%զ&oI4xro2;8x%>G6L&5d79_ts*/u&sv.:(r@}:|TG!?9ALchDp}6'l,9"S$Wy[r2=pPyG \oa;B{S!UZ$x4ZW5`rKSܺFWB47PjWI2 "PGwOMVf筫o!}~ଦQ'jC/T]ؐsţm[4& 3m6wPÞ/x_h{/E[lY?fSws((a,>r{(d3EkţvjCNnF2Fvd2 kr^U[≗ hT^%E3P'8ͽoj֟$ \Ő=Mqj\ z&&G znDtHE "y2H5΍usTb\x BڬMOFՏIB%Q'[GMEf3yQ0:8)$<*pLLjR/@T:؜ V3H7_a/RHA͹b繰ȳ[ 咿r$WpR x30B+&f}+Elr(G2P`o֒-qQ"Ʌ3';2gYiƶW\?e](BPvkv.~`FP-G&jϤאf; d5`[nd9 ;w"PmUm>ÀY̙9W7 YrPN+3`E=)DZ:͐^ü,8+92c|Yl#aP%t1 k#M[Xd#/%+cN?Yg> mW40qQqTJsC>ϞLC1oqn3~7GOҐ5lH{&Tխ}s!/smA9L=R9؛r~Y*MhJ0IRkGM*)Xgl=n=/e$O`j-)lrˌbp0|g%E'gplk{.Ja͵5xRhnAYP'Ӌ?j*`d^ta_ȋavjn/xؖ7W4ĿHI]5#yd{J]UE,ڈ2hrz¥gs-7{A-=5Z%QcMmtOm4a)qD0RoD2]ZjG(LbFBU8%>oz >Se*m٣X6=UȄ#ƭN(\NSXFͻT]B3el"NJevv6E۝ֺ~hzˮy%^uO:v_w\9AW̡HQqlMTnq?!{/HISS\ -?,mkaPΌ"q(Rz9ӻfHPP#PlƴfnF}&8ZT.^x,-K"0#$&޳$)QqaN#ney/ڟt}k-nU94 _禰u^,i%DlørQ!MiG3ڵ0Em#/@Цrr7Ք dEޒ'Y6~^^7 ߽j"~[~zh>UD7^ȂpYPg(<2jPwc-t"a2 ӵܻҏSr`?Z )vl8(-aĴqoȆ/{>y6>K, W]C;I3Dg8:jT׌.[ r+7"2`ʔnX ">J1][ˤZ|͚;$;1%綖y'<0a%;EE!l}|;X:.g/ru ڇ RxJOUae:-y̲ dAlXFLARF2NB^]#r X'YqqMvϨ)f9`p  0#R ~((nVf0WJZQ?.6?)` 1+Կ=xWκ U>`rqzI-HiB=dw?G܄c E)~̀6{q9!dOVnjsgyJ%̺ ~$n7c4QѼB%U:.F7([&gx֣Mj.TmPcW$9}q;szxQGpP.|Ɂ=&Q@:!%Gq\ZK쇆ȗQ|8v5n_4?|XfGZ 죎s\,v3y#,H'x4@ -?ʨ>DŽKA8b&" M1hJ|G9 41]+:<bR8xeE x=ǁ=1h݇^gkikZGF%6χhk|4ѣc#WheǞ 99)B d`ZfG#LH[1]i!=-gXed{ .T0RqU-ܲ2g|tl!/(,F{3 iTu RcwNeO[}>Y6`Gse,tGKDkE(:2xatڱS7.~,V:IjCr$ߑݹL7T >S2䲝整ݵd"_|+2\OI2> aHr}- Asbp!=uG+7á'y#n$2Dû]UU(bx?qsf:O@k^gPoWUWZ[ >(-&-?MU(qɍ|VWR lȏ7^U1Gs\ q2I@\2տU/_`#bYHQds_|I\&wcN>Izt_-8^0LG<&x@ʛkiѫF,t(9sx4d"˥nf6xt1SY ]%k02եD.d3"8@T^ay9YlxzJVk A+p:៳=P{8/Ɠ _Pٲyc_T9~K@/!fYno_¨>\}5'E[raWC|{w\P%/F=0}v˴N>c3YT?끏z7 i4.qڼz~Zc6ivr&߄;%&LwL~9(eь>ueZ\2( ,&)]T@Ync)vG\8qgcmcρX}~o-lakWںum%,iDSH?s?䆯+B6 R:SKayKz}8uf^+pFA<;]Q[AS|ڱ{jpgfx C;SZqv$E;azFE*}-$z}UԔLfzsr a9B2ku ֢Vf߄,dݠz˿ПjP)4't˕t%ji1!ApTԯ?xGfЏ 94Ɏzbԥ3hcS+E1]KAe`xzUv3}]#i"h,Xˉ Vr%NXi/pb"i~@ra3@p(3=4z,ZWr=ОpF}ZǤ̝or7$jJCRp/e!z4 :ƚ1 d]8o_dz@>F07Zh];Coɶ.D/'"".e{qtoI,.kv/ NbiK8\~J;{fy f$` NvdzR(HLZYx.?=wmC2t}es!B3_L&7LOx3Jk48~2򲑠N0u~,}cN8xPQ) VðR*ygDZ z%c'm)xfKE$/9rO.(䲣1slj-:xd*A0W-Z(E:P/W)QJrXQ_. F*Bg|kSlp2!V6$0eцZCt !!8N0w:J9urv$U!}N-Ցb'C&EJ bFH\! b/Eh!0A~np5ZQ!/ (GxFBgsYfo]߉U3ԻYCgLn4V`^Os>Js ^ v ~\9D,$UX;U1o;6GI]"m }d롂(?C SB8yJ:f4Jc)!*Uʽ*,{i^;rix hvKQikP'92dy#Py}pj WS `(~,bVyvQ0Y \B̆zLϛy.b[+Ck} { Ҩ7Ů=g/nJ'oq |xo}?%$20,} +$5霟 GR{ёg6Ų/lINxc:x6vnb.Mܠ&Kc5\خ(1{Pc.5@3pm dMc3,yL)}ޝ|`RBAU`T2j4[,ܺl*rov=j,oXU ɂ}Սͪj|( l2Ʃl+7z])< Q0u_}YzkJmku&7[r7f?|>TCN}*Z[%t/M}Ә-25_1En&Fd/D%a4d1K[s[GCWv N7 'Q؞Ei=ڳm(CV n.7uZAѐ.3ʐOkK'Y~rS6\Q ~\1L':~1 =qow񮭝 h|Sg[m-t %&ԭ/= wۺ݊s$ 1սäsΨ^$ǰFӐ^GGaA 6n"?EZn:'oT2Y4 H}b7P׉"4bhFf3Z[6kAR ['LQ0 { LG<99`em8F1R |HԷƕD|F$^7Xv{߬ 66rx߲ŮR+u(DHJŠ.lq;@N+/@2}?%gBϫt#@2[ْ˼ JPttpJ, !*J{=$fi)je.0 ")2<:>a?8_35ۯkW' f8O!fwAX[A/g~Ffyr"8+#bMCGM{,Ԥ>S[x"G\X&%BI3^sLU/&d=Eg+"i r#;\|"}^[*ͬ)WNJlD| (y2`FB+TQMgj-l~ߥX**?~ < IQ3<,pzlOtEh]Z ҠXQ|Nb~G1`o 1tK<$Tг0܍KK_,Y}򿰒fCTM 3i.b"y1a B0`Z6. |uw!;GD9&=R0.x)b땭}NTdc$ 3']ō_jym?TF=58$L˭{aGfiIwTuettVF4z,?0됁L١u4ǻy84J{(^-RC>"7 dy#OG}q>+;bIfq-R4 @a=Sֺ5%ɒ:г/┢NDetx~ŴN2 _kT4MyS)sFT((dl]hG^6A Xcl!qjU@2pOm:"rHAηaO8hֶ׸K ςNK{]=ŃA#/` CQKtb456ykA.!PeHB3pg!Y!TklKdJ۰Iz&in=Mf%qԴib~PF"1*#|% DvGSf}px_1hdbNϩFUn_ife;솇6jǯx4+"9Aa4@m~>?9)۵&5=K2<gjSⵡ*ڱ&uGy.틐j;FeR¦JJ%nT>+@q]_,[A.XbW8i m&?K؊T̫ʞƸe}, 4dLf _z:x_E] B`  $;RT<#x a$9e -:CoW2g>865hS%#=tP*I@\H->N})*74{puP| aHg P]m8!:4i g*( aDϴOuYrHa Љ_YD? nb`USƮP>c9ǣn"1XVRKDK^cghX6@!1<ajC"ڀ1iFz'XEo;sZbb5@׀G~P,i< uU&knrbh#+GB5(L#ٍZ*HZB7=Bܮ „/ZPz]͹: tZnA9O,'h1,7jrƅm7:"gfB@z@b ANBb!SJ>G0ET {y4(m5R\ MO0PDO5%BB|I8:EW{Ag1?=ҸRxE-QsŨ]uҌ${UNCE6vt#($R1sDH9{b#F @N#/hWP^MfϬDEł8ܹ"~/B@I[4O9_t؝pt0=3f̯%ķ:< }^0d;s5sw8rBu3whBbPj&{g( R$ S)~$yE}<J2S`k>g/á2&Lita=|iCW1ܸJ*gw/{bJvAomZ}tih7RiWlzZTwii88.lAtH_d^L-;aQ0M T-; 'bN W;ZkQ\qޞ+5.b~^j0Ѯ#d}w$ kTMFA@ Z?AG| X0FfB{r^rZȄ(VXB>I۟Rs&|UC -]Ixat`uߴ1;}L ÷Y%+?5'5H$%4Uls.Gq !g߯?J.'v:Xbg.kA+!r>duE\#Z=#el+\ z,]oAww. ?7~hnzq))&D 5g tC!΋yr- ?Za1 w\aNZa]cpVd}ωqDo]&IKǓiAh );kk1<~ ~3UVȓ>Xi2V =z˖'7;j<^IZ*. cM.OXŀmח+7ZQkC&~5[L=zPR%%p6T|밹}A|>qe`[ub\ʐ]S)^ ny}i0TG݂D,jQmb! ]_!(n4Yh"+Rxw\hgv/^9mj{ V")O[Yf;fˆJa8K ¡@ka=ƯyEC:r6KaK {ms<[ƣ#@Cv8dRL[WR0 @^6UnP.]!c;,VnGb;n8@nShCl x~.0ߧx8Èەe4T|a$c0;U"&Q}x<$^^@(uSmE`nX[O-~Cky-Wy68جH1#8'mv&yV癆i` i`*]Cս$a:u!s.#hH1 iMZ`bw4oXm~ʹ\[ǓƳNSxk-Lq!]paҧ`\ƇnD'`4"Mb g,: Fń%cɼ)rÌQ-#6E\\'\s׀L0O *7~镠Ca|>O 71඘F@b06rHyfFqGy0=>bCJ*tf :.o_,[Ǯַl(0:\Bh+_Wȍh𙠞WȭkT,ds+`w"uͅţƼ'OuNoiF{D έۏH௜vyqmN CYܬ!fm:+&(/k>DHP|dfgϦy钙wċSЉ'n1Bп@>T ͗x{nB|S0HMj`V8{"0;-x&̝/I#twL(}XKF+h{"J>B~8 z5(Uf!W5رtw , Р|~j<ȾlQwԐ&eÐs~z{£pwgәz2Qgqˇ[)JFr,ސ /^.%g>iyB u6;UO4/+pX'_IU HΨ21ݗaNB@Sl&-4_~7L@ kwÝ\~G_Rù" nR渜Ds4P녇nQ0 1B`+kE*f+̮ꓦ. P Jl9rLv%<=y[7D7BQ|E} Mq$m3'gf,AɷK+u\0#6Ҍna! 6ʶ}|cqZ\o.sBbiwM!JNQ.Dת+FNtp.jC] 6=2rda^}2W\tb@TG€h;_MΓ/bx[Q@v%苡=OӿV6BZ .xn)`x9箷'C5 .:tӁR[5~{ q@פ~Ə vl;d( / nf;/SdPDճH5Rx%n(L-M%JEXv0T'_R2"XUd7nL7Ĺޔ8l|XXMۣ4*3ӢMCGt;\8' 3 Hso^*U<11淑IJ bIes{C :c\ͯ|"VuH\ocN˂8K2"ՔU Sul؆¡mg^Ѷy<h!wWD]?}=')3 7a96 SnwZI+gH,)O(ڴmSA9ҷ$='?9n,{*R)]~O77b[OZǍ愨أǏip]Դn*rZF4vC+= -g[@{k PtF.iX?C|M{"yBH/ajmj/)sg}fnbjDԈ=͍Hܷnj^ d>Ced prWk?yOeP28햿U]:2Z]- \'F{.o^ٿQˆvZ_ fA,^G#+Wmv\JYC"-PCV@_gӰe6![*40V ȼҾ(_"y)/ f^9WstdٲkmN;2Uhn -yL,f5!MLV,v& 'Z`[$?$2nES252 ,r:b'BLjUn}YoܹLHM71i2ʦCe:cWf*(BDFuYUJi9ZLV72xtcIq(dq {*U-Cd^Qar%Sh|:+fks7YU Ya64WZh `9uOr8'puUmosXUON-"w)h;, iYCEv͛7({k)43mY&CT#$(I[_r.px˝3Xa# L+)|'\`%l2`׍aqBUb.3OSp>/6NDuvʞim, Lc;V>J x'1xT*MW!j2_0'*ϵ88 L`\^~h^%EuVCZjo琏耀)29UeT9=["-j [%Pvʬ.Iuɋ҂?LJZ2>P>ϡDV<߈ݷȒ{VoO*:@&v]B/]bUɬk 2@)] qOyꑟl3;yN L9% \"Vu^;];;=_`,yleoWJ\e(($rS_l8muzV9W:\3qI5fٞ5U_׊zL{ڀ"Zg I<) 6_x{p\BxT?z؜W^2ic tBW #1V_ ͎)զJ0,#cڇ:Tv$% K/ k26jpT# B@ P=SKQ^=.z8KAc&+}їLS: ԫW;f%2놗Q/i ,h-q!nSQfE@5Cfyg{=ȊP*EՒ?|S ֙ZB.zVC$֘F3+ Yv ؒ{7Ⱦ(L Dž?TӞ<rUyхyؘ^MMv,0В+{L+iտh.0Z; *%ܬFN>-/]D = : 8˳uxLw'3oVvWD~p<8X)c|j TueOH'uļ ⢄ GEKN}2.nnBnS$k)>4"`fI C.o{-uGL0}6>KP=ml=6`YOt7Lzdwv$yЍukx0,Lp  g[*T teα\AAGC%n";h;FL,:e 6ݦ1lfxAuTmB,D 8s_a7ۨ);8V=7H$4gϸPG0@]kÊc,k%Hr(QOMX$[U^hn'0g:pj *x2;;,Ķnu8fO,VwhLWQ[5L llni9]0ؤ(sRpO8˟`1T Yj3ljKdٚؿX+@bU ;Sl1IZ_tr?n e8M6$M>eǓ%2^R/G8ܳ# _5uXOKɈ`P)GHI??l,ipuS q;,%/AmhrwjXvʆNo63V+oݧA 2€xXFa[$.zg?ar"=f{KۇC=5 t+eT-a5LW𐊱I96&&<'qǞpHqV.G >!cij]HSF ct7ז J|Ǥ[{,thC̘?=ԇy4S&L9<'eâKxʹ,h0&y lP̊zA 92WZӵӓ;gYa0MH ,9p Қ8P( ɪkFk@њ:hpi(²ƥE(pH-|.Bvzq8;o^r'.,C-~ ZT͙fp/gBBlZ@HV!:Rk.lA3zP]&o^/LU:Jabvq d(:xV>ṹdb \ֈT X'yTw(&Dq(/m}>q}ElN]آ)ԓ`%/`pT`srSbo(]c;V lr9KEF !g}! PI [xnG0RY"-.r 76ݴ ,MYVuAWvUMnv= }}f.a Fḋ @2b^aE 6"ǎn(z}JEPp/9|@fb3CGX~['<0;ꔋY- 0MNɯ:+R$ B =W2=\tLTG r,ULu.YcF qOW Ľx '- 8FyD~Ȗ$V͗QzpW .KOu\jA^ @4-Jo:bϦf2p#Qn=2Qr#z U(?nH J+|yӤՔҪoreJ)q+7m&y |~D;WbQ7я6.ux%̿Lv ʙzl*#:\kacҒ5v)*Kx|a@ozh,64SCU)h,!f3ovi/guvbϓ5dMud*OIIleܚ1l80W(5oӓG|yp&0a{d*"5P#EX= yBhPg4 - 'ťN"RI^:K*-q DXm v:eLܧ fC7k9oQ&fG7v'ЊYLmy={DF NڟޱQsƨЧ zUj %69!E.6Q^KR4$i^g"Z")uFEgjފT3׃u7gZ'`wso<;"O-J9}=Ud-uxuM`Q/;R<,5렜C'pɩ%| ŝCXTeY:,ngͷAЛg&DJc)X5n{q+wI,Eysh#L)QbG#̓V&)liҗx 84KߋMÞOAţ1DbC%tJ; =IJ{ᒽwZ7md$V$5(KyOB kc?% :%J.H,(XS,H'k[ȧ g xj!HvqW7m3gYL33Dmf צXiNs㕅4vb9W aF6p2KDǐ.;hIݒ9]gnG3WX^Јb P'4?!)V,ۢ-8B>:!HoXxW%]ZWcь]].#e^>~  &͔{LwL'6F r#(9O0WStj̶1 o oIzFH`nb d`ŅٜʃZXb7 ŋX9TUvM tl]:&$a'31AHl2?Atr ){ps Nt Fp{$ ?MCc, Qik⪺1HYӮSA{W#3Jl;gjvc8wc{i"\ꗊoytcE߆=&M\at_mV'O+dFceɻ7aYz F"'H ށf^B)l3n M"tMiGRp!u ( b!&1fN$ZJA%q "iv/|\]f7m]!{nL3^+.Jk)+سv?vHY:!Tl2u'5hox?cWqoUK0k~WVw9jp|Lm x/K՛ 58xΠWЯtl #9 LS)CibttFUKҬo5b9O霆mmFn4z=+t?W5 EfHDMQl{`*b" 3wscHjr{p7 Bv_5gdH9qB0NlxUQ);w~{T)x qdQ4A`N@ay͋"J;2`ZL>YDlO܌B)'Q$|P-VO˚ÙzxW6J;L*.F5h}ZGGeuWLdT&?  T}ǎ7+--VYB3)ae|#(T=?8߀]KE{/~Dק'I2'">;%B, ݊ʿ6G]Le")V94AEC1ju;Ҋn Sgݍ%6^KwSZ?j:5j? @,J q =#](\,#Q!B;N572nHt@2e皺V @Ob9P5-6!Bv5.AҬ Ў;JPo"c_Q1+ O4_},N$U1}WYkEy2AwJuʭN} Dߎq~ha,Rx&1}z =p]qw@{Ѣ̟i<բ!!KR#T/|Vi;7>'heDD,Z6\uWM8؀lBd@npU;SkI.}hp3Ɩ/SMgIDD͞`eT-hw.gKsLnNwc[JlaZ)e9UT뀲EZ 9MeM]7A[J +}^vB~ .|3WV{W]G'Ų?mcgN 9 nlIņ}XJ,#A.!ݤ,_γcK& ߂W2ՃwMUN#ΨJ5 [8 7bNaaS{;H5Z&zS"tʽWOk4{? Oj{Ө4WV1[۸]Ad|M 3ndX] =tvehT:dhI(R ]*3I/4΅$UzD('F8Yvgg?/a܅R >T!0WQDܦn89P2 ~'~ΝRGJmS XiDi"¼`ѴOhVĬ\ PIa&X=ykIHn+p})w=H@N6v3J43ݲ==ӗp6B+f~fGDw/FF(Y[ӿ.}H܁/aXI&Oceʝ:>BT? %\8zc=}$BK:r}9A]?KWz|e/̼'$[+ڳŷ{ =qUZN@~5xeZ쩥_-g/ш"fmq$#X"/ ֏ӳWCj!4i4ESn%mJ)r _MS }*xt Щ&LF D5=m'T/.[IU,EM]jċق烟C)l:gy<6~07%ͩT EiŏJV|cq}3:R/pW<;k|Tyf\[]*PV:/SGm_ =#(3]LrM"`T 0tсМKcWf1SMXT\2ih$$g?h>JT8,eGSe`.NK\ %<2:σeRLUq7+j|T9; _)y[$%j22 '!~H/3i}g/(KPn+d}!!C jц_vA>{ZÅ{}|ĽyZkױ@V6a*Ҭ͈/0&);E n]AbQ F5 -X^NlY󸓻t;q="8Kv F~Blpo߅nnxj\Gܫ kLT07!BnKlat:y?0$y X&wA wa YjUȭm"6fK']WxĮX_',?fxX+q4yݑ죜0BhH>, >q6"$5U,( )7SJzRa 2*L#2$`HH CʞJ0>2 A^6ŵ]Dq\RsLe;n-թLZ 0!J򇰙a^$5;3n*G8p|,Gg/8Cl `hůPfkˢ2.Up ʴJąt/D?8s"=\trC@fT=eu+)=pI_QƉ1<ӕpjL觯b2 `vT&"QS{QP*qէcK@x6LZֽĦZ̨n=74Ot[:l "v ; MlL O`'b!F M+o_d6kWBkq(Fᢌq:5 |5)J&{Xl:  }|²-vXiJ&I\Y~dΑ!si &:w=SLfT1\zzMPEWRr xzh@Cd9%uT'tE:ɀ`e@c1u8d_S ښy0`JRs$g}4l=yWJr!d`CQ?EčW}kH#)B"*{OjWJM:^$^8W+4qq$5˧x''_#aRѯc" 4\u83<法6?~ ( vȀP(D1z(@m6e񉰩;"]V}6%G`FNR 3(2svN =Iʋ(fgE;\Ӌ./-50\3S>;uńI9xvy t#m̓xZ 5*A<+ vsGv RfP |wû4&'[tS(}i;RRnEM3}Z](aX5TP O{_婆!}fbXg.)s rE\>T޹#{9zrզo ԹBZ*P4cv|ʻubh~5r'WPZ#ٗ2 XڢVb{촹 5 Jcă$a12 c4Wn\Qk -A0&y:6|ouȬs=UGN)xUs. G߄w"5cZ8vB< 8A _#Vnc'0F0.Ƭ/_dvnqsw=`W!f f`y'RKXxM?#1&ȤhAnQ;}:h5z> @i(kRhV/TćfO|F))5@D6d Ph衮h'U:5jy|˄dv_V>1&hok+_ YW4-2Vfy@t2KQ'4+&sS@x-FKu:Ȋ08kٗD=j5"$ W[kQwDr歕U 5fX59$HEsR7cwI:w$h$Tn*t8bK纰\}(ݣT.ZS!oLT*%etQH>qyiYΆ`YP1yYC%x RL@:AX*3ً*T\$/B@(Z"\P3CQ,` E5Ӓ%M$jZlpm(єvV2}+d#&wi.!vxbBQORc6 ۑJN9lq ?<>&cmpJ)DO"7d!Uwq[Ob~eӘLDY:".mIbLQɩE$B zVvCJG2_sO׵P>%,-ft&9x}sz<nj{ԬAeGwqZDd!&xٱA]d KhRe]@}2I 0ӊ:|Pη@}õ8 DV`?dlS;pRoXҺ"*KWBF,}c깱O̍jK3jp板LDB\g<2YS\X1\g2 Tt*,vrz$ӾeQp %))پ"܊Wz-!] ^/p{V|I kQy &1BI&ɐ_ӛ}dH$ß[F/֮<+PdI"n@x>߉&oqF͐MbŤd@OWs6XUO⋨e$6'6p8PND[le*z N)M\B2ۊfIrLCl~”ޔcth +</`Z{ako^]N,VY YID7ސ0JJjRV,iXaJX҇mنH<8E60+r {E0*3Y4֐;݋X@*v흮{pb cch5]Y^ǐiR|nxQdH`߰Bg). $^,8bd.a \L]#@h&FznMTSaj_yBw.:N֑^pz-NrYZCߧ^Zv&Ja=QDRd!h_FJ{2d`52&~┠?'0^MAÕdl΋Q4QDE`jmB(,5 |l׳$e8Mb `8/bL{Sxs8N»Eپ k KE{^py. F:ҋKM%gWۨŎ6x4bE G&QR??N1ݑ+h~fY[D3'0e ^lHXcڂI~&_t_9IR34Fnb; 8Im ̛>@eДG;)Vbfy0o*KptM$*@GnMX}' 1\;k} L)̩`~ڧTp#jZ}p8uLXV2{7\wΒ!xֶ`Ǝ}nKm)JTRyZv7'Kh6>@21^26n?i6=W OIɵ]wiZzNC c sPߘ/_Ęs㯂||D7A7LFXb·_F*hn6}YTKĭAˣ!Q'11czq-z}H*u@ \xJWˈyk|/JMmYߤ xnh2ox;,فgE㒉 ;uH;]3+ ^n~} FNeaW=b /צ͘=^̺]8+M 2*`75Hnz}1DŽ{q.'Yg/l,lC0)ݹ@G~nS?ttvm.)W?V5757ex;2BS^c8@ux?m9h i(b<뤉A ϻ㠢J$^(om~:ny5呌Sh1E!5!t0%ِ6U%zCr Y u0~fg יhZT}7ꧪ'wP:w;77Kh0mV_#ۯ=޸zAy)Po YmՔxkĉw c.9,9>=4Ǖ$TcjNX{+YPΟFkpQ?ճYz_= DMo 8p^FrJM\.YuL>ڤ^" h3˚(z f6%>g>v*W;vk6X~@g:辦-J+뱭2MC"ấ-߆-sP=칱"Be=Ii݅35Cm1E1w,L>c)MGGo;%pE}:i :閡QEX>氤Qe7SS-O }C1ڬƫz s*ArZ1vbҎpOb]MI;.CB2i+vBZ1D)7gAõh UJ1JGfȨ.x n.¶wws'r RX։M ;X񻯯U f~Hhe>'qO(l #GȻV;aXL(9iǐ:%: HZwe;ّ @F``"rY~bJAU! l?,zgjR䯼mr\)&, d?{EpDVdGpRi)/+km]Wʭc,QPAcyp| YڜRajx#o8(q{HF|(f zV^P9Hq\7b*2k4VY~qVwP;x/ ="# Ks$Un>;SOjb*J.q>.%[s~&¸8xm!ƉN'd/M'Pt0LHZP\14o|qP(t5E,NXadY;WIe:){f1,k,zb_|RzV慹`ԤJO/ 6SBQzT74q7ؤ9SnNFj]hTc?(] Z)8[WRFyש3Xk ~3-eMȫⱇ_jnX;=ZSL˨%P#<15r~:?tmG\U[m`Ѥ8JEH_Q Xqǣ҄n+7 ]ex & +d%tflQEw6hqr+ԡӑ׈?lvBD2$wnԁ?09T3wV_ʱ 9nHUg{8KLU(MVPcJ3]P{g^xCIw.AZ1za8o`IRpK8B Q C/D? ،W7Fgs| G,IYLIZLP!9?گr5DSz2.~WN Y=8ץC\x&+5 2:]F7B&> &ra0%2!f*8Q<>ݦH(;X,Op`pm4SXc}=i$V6Cf掳O1vȏS{m/vV[,$9BG[G(RdeY̪8 LF*L7zn Q &q}IeɘwFVg:I[jE}6A@'<q.f{c$cO~?FQ!tTꔯÅ<=a Zg"'p>+p᣸pDKtR,cL.nʹ &jZ(@IQ1>ڭz3IXUpKyFGj@2V8&b$:uA9+pSK/%䣍^_ۉCOx̹hQo|( ,T }@>s%_1dƓiNY5q O*/OL^U$w޻ћ¦1z8ȠCy'zRIĞ>F[NvUS<-$[zvٍAb[rkB. {ە\NE5g"{0U#f ZZ8Nr+CMFd_DNaSTB0E'YgUyըXjOL*xlc4?8CKZ,43p|!"đ&{%R)/RQfq{mD9wnV|7/z.cUԙxk޶"e(=.?5u+S?[/I#Ҭ)rw=J~Ԗݘo]ZB w./8nGoþto9fEF؀yw_G,^=X`vrdrfP9{UdրɌ,Wk sQi9].L/? <[϶,P)HmoFh)W}28@Jh\92 H$ Ecy`(!-b "!1Rя@42[TlD4&P!~Yedp , uv5{G|O.W &=(uPN+YmiΜ=f /9"Cm)`qHA ,Ǖemߊ&s)IdZA+rdB:3LʩoawD 48!ߠ,g!b9_C-~G?凞(nN x|awmJՌY,qϟ?DɹIΧLVZLp%o˃>d"LDH ]QO-K5R$3 =+1_o)mؤenwoD\%Kli3Wsg[KD{gVI/MP+Iӵrk}_Vbbz8s*h/pn,=ڡ|Ae.+bݿ4}We> WqnL[P FWFf N=n|HkƊ 7{LJc?Zn[ 9ze W@M= ͪO5YЊ&kXWvBNVCiz{`;n m7f>v*,|bV=jy^,b@yTh5oֆzeJ.:KRTVhDn*3Rl`l`ٗkt3;];XM"Z;{=EBJ+reNՒgw2EBIeB z˙)ꀱPԵZa//z~^w2hef \'VgT.<ې*X; ؉JĶqfѰ6TUHsCJ#OIv5#Zs:OiuHHyMZ1J֢;AŜKUd-$: ~HX@&㧪OV i_>$?pU2BNB 5VÿF.Lxoq{>"E߿ WYCgSa_J^BWlݕ1^H -Iji0HU0:21=bXVm3Jt0v/]G8\}g}K'e)ZJf|L08gH d5nmό'1ߜqeݝXܑ ^4r^ZǺFc_ fr܉M1ʐ|RUn|9BJV0a ]ݐŰb'A%ԏ\{] ԳgDLI;/;s_*yS|J,꒪g: \ْr!NsYA*k:{EwU@N4w-h=}HVFa11'tS0o|䢡:yRU5ǿ|  D y͊O{15"-1ck+*Ch!< bרXNJ#睿usK3w1-z e]8H /_: =\)BC&`̫*HGx]OXS!K5=(~_Շq,Er):@5\,E(mAVzNqjYl_v+fm-7}›(Ȅ#]Xb|Ӣ1NV1Y6e;XWU7ªkCNոsJBX&D:cV5qSep$sua[vh?Ɩz`AMQcVF`Ziuax {4\Ln KM=RipDvl!/d& ga5e{Ntpڵ0N-kY";XE:jOUa7>w4*zaNu!vLr_gnMDm~Z¥GÕoPۅ3>M*R?Ǭp; X]B~ŝ~zwZ~n!HkZ,L) {|]w)ʹe֭?4tɻ5ueH>s]u@9Ǡ%+vir .c]?RHX&UM Y><9 Г a&yz->8WI&}0~`JP5Պp0|[ zg<y@ ^EY!>|a<=G/(?C 0D ]M8\ˀΏBZ#b{Orlvafd@N +k3\',ĉcuO,ĈÄ’FdgXo:-k[..xR8\seY^X*:ڎL_ys LuU[]WoqG*ȠA|jᠽ:j0^8դw P(Gշ1ĵ'c7i7(" ^E7*UJUV {p c^77}{Br=_WnJRHݡkVvB  &UC#Zy粊!| ^4. 1l$ƙ+"@,ȝUsu:J3K;wmbTI.x}pevO/8!wӫk $ .$ :1^W. \!{%~]~35oNK? dqrC}Pt_w`Z6,#?^mH(KXƠR qKryfD3iyc fQ$wbJ ݟCI aI ̜ȍ#d` i9Y|̯o[4Wqv&#kl,׌7,`tPzmܰ_Tɱ-Dh]o3֙>D V:|6f'1#ޏ \ftOAX&u$[)9`v5ۡ1jw uxFXGyC9b2~}t{g`S|s@bsPgXyL&%Z޻c &hYZ-kDӗ<̞ov ^6F sG|Ps1P&y%ܯ5WS0T2h?f g},ۚF[{GYvh6GRšSJrc.zEPDmş]s*VS5l\h ;Dq XFw崎+YDjbV1uŨm_L`Y6K(ۂX)A+_tG7w6sWDѵ(c,v;@Qp ]6#բdr'yKW҂[7* )ŠAh"AZ4ky,O$7,(^*t;'ơF>r,>y0,,.sR؈G¶c } d Rv˱^w%OE 22^G|OEF!^\|;|yG )w/DϜB?7/ތ# &m +1 HԲ繃mey̐F5UbX\Tߒ.י-/hQCtcȷX*b̫[z$2bEή1R48UlVڼH!snhTfw 9dmk ^1pڕ7kM%L -K)E _I)>ܜQrL"Nմc, tH,~۹lFNBSC=rֱؽ#ZYLJSFˀM+W{ef}T>{n8y#!Uu@qx@]Gk[,G`8~i ȰtPbip=ŲEyu|to e)uut3#)|a8j0?}bo4W0a4PkĬE^ Wrf$ >_9E('@StK7MxYv&HHE7G'^&Dؾ.Ēi.>|HbhmK)&GD )FUa:$~chvGG+T9|D 8˯+fThxV4<}oמ#6sSCY-p4ST۷5LH_%{=kh;9D}c=@ؾ3͟^-ؗډ31D3_8­:^K T*R*L&k I bxxi dx$SZ woo|VEAd5їCv^{Fĩz,]/B}O=x4cih'8~0|":L婴p.}tt$i)J{,傧b*}v$wgkIt4*E[YOpOlix^FSC>+W/k(X{ #Oɝ}˯^:/Rش\qIr`vr2B[8ƗfJ)`s;THj\”d bXF`qF___]:IykUzdL_D@E\08  ,HU^1%" K( }@LÚ5?9w #G>"Ӝ]fEMڟm_2 ͫދ~uF¶;'A{<^qPHVc W2CckM2d};F#vSo9#5//ʻWN!)G:gIN3vB>Ժ8 | !l8^1yւv  4d tDq]r=sekƦC8qW烤fh`;,UI+EoP8@~WtM;U;I>OڲA{KiP Hk `fH98A=B.E,mt#%L]pl:׈NjlOf9\Ҹ_|T|l{HTq2]7 !!W,ɂ"_9}jKLDм n;Miv:Z,zؽg1e05Ed,ǒ?d'.G J5Dhݸ/?L\^ 235νbbU2] Pz_Dd8^6&& `CH3h^m6"<$a"GՍ"u Oq^ !Y(qnٙ)6RJVG3 ӽT;!LīNî$1$ 0 @Sb% ;ʺ9'c B%u+| 2.nŃIV>F|WE2ƻ|tHd`4:&4H{1=֘{o>g㙇[u-5WUtp7A)!I칕 = }+ ` xQ!l&ʖ%ofز3&ӝGdiCKa֊ z~|9(/ovjkxL?jL*/ՃCKG;i/UJ?ݤ˴laZIY[\H-$z1>35EnHQ^0*EBSTnXe8ܰ4HG>.ٰd%.;`y5G9[Ͷ@;TNhgv{e0$=K}1 [[rfxdmT fP%s,\i*Lu;?_ar5-/Cil-4z &j v.ܱ(mzP*J7;a.&?#?<6;a>l2M?j~ D <cSm̗FS@ϖF]iE.Wщ!qgcf눬4ܬ=/