aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/cache/driver/memcache.php
blob: caa82fb0b15ad18b2a400c9b284d32443f8bd0b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

namespace phpbb\cache\driver;

if (!defined('PHPBB_ACM_MEMCACHE_PORT'))
{
	define('PHPBB_ACM_MEMCACHE_PORT', 11211);
}

if (!defined('PHPBB_ACM_MEMCACHE_COMPRESS'))
{
	define('PHPBB_ACM_MEMCACHE_COMPRESS', false);
}

if (!defined('PHPBB_ACM_MEMCACHE_HOST'))
{
	define('PHPBB_ACM_MEMCACHE_HOST', 'localhost');
}

if (!defined('PHPBB_ACM_MEMCACHE'))
{
	//can define multiple servers with host1/port1,host2/port2 format
	define('PHPBB_ACM_MEMCACHE', PHPBB_ACM_MEMCACHE_HOST . '/' . PHPBB_ACM_MEMCACHE_PORT);
}

/**
* ACM for Memcached
*/
class memcache extends \phpbb\cache\driver\memory
{
	var $extension = 'memcache';

	var $memcache;
	var $flags = 0;

	function __construct()
	{
		// Call the parent constructor
		parent::__construct();

		$this->memcache = new \Memcache;
		foreach (explode(',', PHPBB_ACM_MEMCACHE) as $u)
		{
			$parts = explode('/', $u);
			$this->memcache->addServer(trim($parts[0]), trim($parts[1]));
		}
		$this->flags = (PHPBB_ACM_MEMCACHE_COMPRESS) ? MEMCACHE_COMPRESSED : 0;
	}

	/**
	* {@inheritDoc}
	*/
	function unload()
	{
		parent::unload();

		$this->memcache->close();
	}

	/**
	* {@inheritDoc}
	*/
	function purge()
	{
		$this->memcache->flush();

		parent::purge();
	}

	/**
	* Fetch an item from the cache
	*
	* @access protected
	* @param string $var Cache key
	* @return mixed Cached data
	*/
	function _read($var)
	{
		return $this->memcache->get($this->key_prefix . $var);
	}

	/**
	* Store data in the cache
	*
	* @access protected
	* @param string $var Cache key
	* @param mixed $data Data to store
	* @param int $ttl Time-to-live of cached data
	* @return bool True if the operation succeeded
	*/
	function _write($var, $data, $ttl = 2592000)
	{
		if (!$this->memcache->replace($this->key_prefix . $var, $data, $this->flags, $ttl))
		{
			return $this->memcache->set($this->key_prefix . $var, $data, $this->flags, $ttl);
		}
		return true;
	}

	/**
	* Remove an item from the cache
	*
	* @access protected
	* @param string $var Cache key
	* @return bool True if the operation succeeded
	*/
	function _delete($var)
	{
		return $this->memcache->delete($this->key_prefix . $var);
	}
}
|0ssr0fvVU<X Kڲ6MF0^/dOA-b(ϹQF}n F6rqX辧c 22o g_\J>̧]{DHMd"#| 74fѻ+x5vO/xIMNrgUː<{>jgd8ˋȰ ,; ϑLT!ZbqڛKﮰZs{±xgb2.إ+A̧ېJD UZ, HZ:wx,{7? l7H,XG U%X  =fAAkxx1=uխ߽C\|{qvܩ |}<<D[0Xo)&!3@{0`(!q,LUOEm 5 \gl.쪕]%S Ra)Yc(Y 4tckۢӑ]%CDL%cC$1+ڴ%-/&'(g>9|(yAKO2LވU1#h5 qD5yT |) п"SJG+SH.a4VղdEtK@ا⏗k:ᖨc`d F1 T8`* H b|x=Z @e HJVsOʱye}0-h(1ta1Ҏp.-SQ&`{{Y+@CCJL_YxN l6߇2]oR3*=++Έv*A+xD*!5v_KBEY疋Ng{*$a'5!hر%n]&m# 92dCJ@\Ej_N.a2J˼o Q:By jMFGe|G)wFg\! @ZEKw2NqLn?4!EܗfAcq>?`Au$[L"HO3yzNg/{[lx Y#lUa2eh!˘R9G܁LQkRE*8(|2?܂k2H"B(-JActZg";D}Mak쪐FVp~bo8>uE/u|4A1y2 ig=:+B|ܔ]9:R7]E=IcMRHDgbVkwEV$L }%=_!vh<]UA6m,~s2*8nR^pbRDV9e8dD/o}S}q7CIP[1KcdƵoC@zwLnD.{{)&TX moBDӷA4XѴU/@*{~v8]I:PHǡw)7b[äG57ц85:>_LcxrޚgwPWP5 &~+:f7..-QIB7GěyrڭnuX2 ]y* Dˣ4`y0&JT:$F^WBzܧ\B(}*c llvv/SO(mBפdԙNˬ;e[wGE=ޜwB3)Ru3D\^X;q"$;]iLOm#oW2za>)ۃFVsG 3M]h}WC#b*H7x02л&d4V§xyhB#;[$6p7(rѸcZwƃP!Ag(o엞ڬV0fЯwqKjBKn&Opms5xWLLE{f܌B.0e ϚQ3?'1N59ߐ?[YjuPin:$NG)Ôfz[ 6cyTQ;,6|H=C̎NlpVcdS+z#Q 8zj 37ѣBm¶p6]gi|"7)3p`h9-+Ma4K- s-klRMb}FyX`bA^tW`mtQ,2*iըc2GÓsgӜwc lսmmejҷnޘ9>CId F…ȵn@lwdτ*qV%&"r!MϮPy\b6s ERCQB Z0_oz4J:?bM>̋iT[("Bw1ER$\;;і5}[4qX.0#yF%R{{;U Ap8!W6z1l"z 6H?8:zs E7(-k9&k9-J4$&e샯$B}Ab9]}^}'fR1+rGJo0^nŦk^B6/\{Q,:N=wRoc fkͷI&(|sTD`Z9,zdMOsbiհ,'b3brbˢQהSs@V,iH]5G{Q.9O`"ή#$ND⨨7=0n\zF+~2zfZ8ۧ{ӴJIqB&e-qPKZب8.;p:9 {~EmO|lֿEF:紣A>ZhZ3e FŠ0KˋNXx8L#d.ܨ"'/`p`KAO Ӓ.Iv׶6^OYʳ<нkI.]#_*DV8=!l:iNvdwג105 24 HA$^/k:83 *TiXr1N:즫*ۈP!Dz vb 2!pԜPEcrǩgػQhM[}$~b-URZ%5NY]G[)hcO ҼE2N]incv84qcSP vSKj4ժk]fQ h4Bao1SK5F8@{ ͌ȶK`Y^_L*}8[X+$$h.>l@N)<&В՝ȜCc`@ h/tދc}+BQX0?N%d)Eksl~?1 ʢ"?Az23[N̢-E"P^]7\_uz&ܑ[|De=22F+%Mn#p6!ˢy ~2}pV%)wlǠuϠjSOLםEp_㱭K>o&T)J6䞧MZ#Ϧxdz体VNҎG0#o ,}gDm:9of`t=JѬ;>݁st [I~5qh@R $H{{w(^w:g+T#R&IDQ*q>~$:޶4ňxF:C輂"v!ws] l&dTN5 LJUVڶ! \jP-U"j[^Eu$$,#Zx}1C0?!eh+|Nzm9=\{;*t%3ao "FWze}ZdV?Ժ̖0xXgW[c3e\q|gU\om 3񦘝I6d ez}*ݥk)ǢLU߾Ʋ:~3vhd5w~EWJ0eNU8 m`S2eL)se%)dS6 et ;i6YL%_lyu'^ h=U?/)(%3ĆSYdbGy1tHͦKt1;-D&I{ɐIR/.P&@`8pKb7Kaܠ/فHok`n_VM9āiЧ{Vaϋ"4dqS =اushu[{+q腦l|HMش]B\Mgykk zZ<2C%S/V6σz鼐ND!/2SAl#ZCU.c)2^~SI9/6F{C6Z;?Qc/W\n|\Tym爓R5eÜf3=' hG0/>my'{j]B2 ]>dXc@#(`=TPyOY$3x.cAjۋ+gvpOwŝ!|PQ*&[gF,ZU%*뜌 _?TafEo ݴ*m{),|:D(֝V~vAȈ>'b/tAg54KRB49jt^qkLz-r}{}[/o2C1䊉A#88r׺qmB9r^D ڞ$ ԛMM-g 53m2vbHax ZS4OhİD ÷hMDM>[AP:%s#786Q-捞>4n71-[fyMZ^#nnLcbjkp#"yJ c/6GV1Hao!+|M9 <\9345p%νЖӂ]-~G#t05I#m&:A2IE8>šCHQy겥Jw o/%IS[Q`ZS5uȅJ*@W~ڞ  PxC~}2$/}]`E4G~ٱe3pM + T;T5ef9۝xEwxlyS+΅*}Tz<zҡO<;^J:u.f_OOս#G{ !{@hX,Ez%6ŽAQ3oؿV& Pxdv7ۑ OGm_"[ŐK[IG̲!NyԸE}mSdTp>]0/ U` #|kO = g^!,0R)q߮4as35Pn}UǶpCWfTgrFR{C-Y*sx^̏L?)>vؘYߝw6rD@N6Pޤ<_< qI^YH Rf *{684Œ9y thL.`K@Gx^~*EncFs?>'n+iR@uzɿlUϜ7{Eԓ"̅s||n;rx'Ӭ?/=f"נ_ \Y c|wϾ;x3hy].y *o'JO{t6Yewl`៮=꡸]J(тČR Hw@Gޙkd9HNRu$ZoFqRG| W]0@Wd9 i Yz/E0M}^-. Z?o*ȼ7F*$<7?j>iIoh&-&Mxa:Dr@uQL/=! ;M!6,Yz\fH'* ~ ޑxH&cX E㠡?fjRJ%(<ޚ:~ơ[zu06pH:wj[Lһr(! cҭ=f9N07wb`z t#Lt/EÓE#;[D)򺑏~e[Ut (:i/USH1 Y.D, Ο y Gȸ-2qw=dNV(J\ B v*h60T?FT䎥 ꛄ4{oyAOͽދvOA7sq?xnsh \rQ@Hϖs_EݧE^*:E'M֭yQvjF/ݺf [4I)R~xLlI('Mr5}LɊҲ@!GWN޾z1h7%AtsJI}:eaLzZ,'dʻQ_z6 u^D|Ǚ{.èya%]%a8/~zåaL+q|^ցw| QyjtVİ8gaMj~cJụ$atb[ odߊRk>Ne$\ЏP}%0~БtN&Bx>ߩ5WlZIWzb^0R\E!ʄSOߡvκn /XvS~b4 LF -bJ;ڠ7*Bz z_$pFJ4Qcg-Q e FPsk)R'b^{BfzHߎnexx8aR !U2 hENd~fPꨝ\=O=nIoG~[ƽI4?֋%Q 3ZL Xy˕y8ح+؄q|&ߜ@ ,JԤ܏NT/GP%s<՚MNXU~wExÅD+ Ֆj8V๑ާH:7'GuǮXO_N^~ѬD"z@+*;Ap_|WF8ZjLJYp`fkD P&rMWg5֐ʗu SU|w>8l|T ,xLm waɜ<_#ߴW)rX!rZ3nkG'M.)oHR4\QBתiZVE(S8A&c(Yd*{G *1m]<זy=zRcp]Vӵ:´IeXJB处o"Wd[O+ͼM~KMrh2B?gەאN~x NSbqw(^⎝9=C<>MK @} Rv>!e3ҫ)ed^C4]g:γNU4v gi0E =.dC0nTVTb\cr="{%ZmbBP/ʥuɁѓYB3~[ClH-B?Ew`z4<`#Co"ӎ zRSǸ߄m:sX)WU;"6 xm͈ĝ_jT[B'nTba."8(.β 8kAۊgLUPNNS\ߢ4 wHd#[kSI\ Â)3=A.ElīPkXҏh!SgItrn#J`}1c"cOZtZ=C\7^Uu e ٖ,mǓi:)IZ8 fߠThOsJB$9G3F:wk\f+5 dK1302'eET:A<ɏVeNĀ(?4R_q3*WJ/ v1;ϯJl2OGkY:6N|DD"Am ekރ$ $}Ge9T퀥Q@45u.cJ@%)W:SBRG`C#.Cw% )0^M#$Rҙ:w)X_y R 8_>^Tn1)/iKJJOﴂmEH#(扯=~ДlOlM ] [Yآ} 6(R4XnX=wLfFi~3п k !DחѬ8)+n.QkbY[D]+57[yu@)p^T,jɞJ}ggC+X(@DIpH%q-=9PQϟ=Ōho"n'r/PWd<;AH3[O?do9>@%t Ϥ$iȲ+U5&6%?ғ$M"?m"\F/ F7߯ɪn#sfLUMHъ%Ib( |?i|BMi $jvLw3y`L_ӕQa5 5Xjpp B\ . 8 b(qY'nV_&AF` 0E+RTsᓞ8w:nQ]zOe2C&.H;#v\1aZB5V򈘤]ve\vg\a}]^y+ɃJG!=D$?3`&0xƈSz粨9'TEt!-ٝz!o_9]JDHJ,ރLNKHdy&'EKH iwSP 6zBI}(p}￾E@Cg$oE']N>.qHLWjU6pU=&c4 p[z6'bI*ˍ\x$Nn5m}X_mzfw؄&ꚳpN`ZٲWOX FwkeչO>36#~^0CX{"ylaF}8[kl(c H>d_Zop zh|UZaA?z$_M0p`-EtRzu?ӈ:YGQZXjK+!x)Lmkw6v;3 paeiF"6K&^heBTAܱ(>Ąm2T lL_^rՏRj,nSڧ6pkc$aK歃d9v"TQIC cCBFŻB\N[ EW( ar"2Zuސ̘)B0*'%3ORU*Y t@K.V :~+3tygӑCU+kWgEMfM' ce$K, is݀ekPcQ|o }&+@H2bS@P0㋁{9DlF|zyA)I_g[1 4l3ier@4L`X@ x3?:K'bQ`^Mf~K9~6 1Pw [pGd{EZa-ՏippN\ roKe"kP~ 0`t W'T)C,=ߥ'Z{36-&h Q36qiκBY G1@5YXjjR]5ܷh*i:.:L.R?L>,f'݁Z9]+A/Gd5ќEݛX#Gь@ sQV勢X݇q=ѐ*BhmiQRT`%DE +'2RҸ0ߴ1b֭{5~U엫$J.GQV0sUf5e]B W a/zA*g } wK}8o9u_ƈ)/4$ڵ(2\֨H@2NEs,C[pSz%ςGK.iM!ߓ`+6~ӐCYu9˾72V e224ABZnHS=[,]'GnAGQ.?Wf#Qk?b+!-mGJ6 P"CǍ.\p= }\䗬;L47kÁbZis_GsnSB܅Dv6^aߛBM:AqK[ByE580B!/\Cy 1?GvuYڢ* 'nt'R G+TMY7}=g\& rb{nMLyM>=z: PQ8.`[x#b&%F'Dǃ6UT"?/X|WWRɌ*w[Y\Z{W0OK?樾35LeQm O8)9 I3?%^[G.`7_;YC4zq28[>˯L` 瘫h–'ɢ- H "~Cޥ3lp@t/Z_S37t+=.U:iHq,? =..YbXke UGt Ve Ŧg-TXPH:OGFgha9}n9Ɣ ]P^ hx c!Hk26XCCT{('ҤI\ wK#Z(CpjnY̲?2om5wUk7?SH5GLj*OMלx,I4<$MQ 8> MZ PV]eyөA^n/&X#&/\hP?TVJ3 =zlSZ~,SLOHq~*6DO(%4POx/"a5JJO8  /YL {+P__+*1 up/Dь>Qh20єwLag鰔.[ Q=4tzވ= ߌbK'iNXhs%]i)qfݻ" +O /p WjD`}ڡMhf%:pᎡFM\oXȌS@՗_f$<=i.E4O=g+}!f#HW;3<2vtT 'g8 ?<&p@S"dd![۟VIBή>Ia|]0J`c-kAZ1-s)r |j\]co{COɑ|H<n@8Q)pŽC;nH|0Z; :C𾋕xH%Wf\ '#"1EBNm߾{vk)H.XN} * 71Y [‰[Ed'C-C}}a̒)!eE3n G\Sඝ +md@aV4Ue]ϝspHa9N{4F3~{9Sy  )F4yiX=eo{]L*RPBNAyXpHG΅dDI`G0w 5dCy [J TJ0Lzvn{s6W󮦼G)A.-=-'y0Aohƅ7' iS'<4 0#\pz-5Xa-hwo! q> մ@9(:"+.|Z3x"\YE+"Vn]ժ߰ A2R&0:Co#ZQCFZ}1sy[rȏ܍yj` ;$KXx(W{ '1/xWBe]q~E{3q!RHY%=yz5> s=P$B>X52uJ[#>-G'*͍T9o /lH/ `#> } yᦃZ^_Ȋ\}ՊJd 1nx\XjObu/P't=hz_M S 5r|XpzL(iJsۜjt+Gث舚ImF*PyqT9Ovjj4*FSzT}d6Ji-blNRfoOx4?1uϏr+©{[a1KPL /Z @ث9 cx99s6\upZ9q8&,RnZ6=J&c1/3JWY5^F1.0$F wk+! FD;ՙLkvKy@#+:'߾};Y9"!1JK_wVyy@(ݝfÐ؍夾mB>3;vӏnO!WǿzOJda!~ʪ˒1axSŠz-քBWe1+xv<*F%Q@ߎǞ`ӌ4W"Ć8>1W M)dCB|'a&fA"'5!;M]՞FE\ F wMTYEJdž~)GCm}DH }<=OAq@Qa6O(]]m] \oGl_wQBԆt!D8"=}B dWIM{MV8+wM.p;++O8h_0iWYWEny p#s2P,.rS2$+NhJc b;FQ_U(7H 1+C<ӫWb}!yv$> M)3@CU.! F`q A& 3/^>+Fu21tr@PāW5,ʇSv;n0GC5m'ݡNĞ]Ҡ%{qUsӪWY14B-7B}劊֔Wc2vr q8;rdA)Ų[iN&P̆k\z%鬞/c?q=/J:S0]i&p)u=r]?ϸ21*öݻ?$,=q9ANԞ< p\GI zEΧBZemM,8*C`m- q+;tL ^Q-sZ+U حu^Ř O!pW8qZi@+%iTW\ݨYgg?G_aUj6=%8nhe0/]ITBrkZ3X%V)8 w:2eLZBA#z1?4zLvگOiHShh0^W?[zM)!dN,!n IEO+*f ~COsRQS.+*# _hN {(fT|_YͬkSz9[M)i*$ٔY M.^e2odH@.{ 8r܀>>,U쨷:櫬0ÎNiL^eᓙıD{ؗvEb:|7k #d %5 Ta,[zb1a /5<І]u@ԅ`,(Nhyvf굍$ /SSx`eݻX'Fog/B0. {ԶNC#P3.!(C[(41N̛s/_9UGx/d* eXYuCPՠ⚷ } +*D.W&Oc"7}KM9E-d03(h;5>iZJ11w/> j @JS9=ԥ{cQ8 X7 NWˈkTe_]'Tur Eyпsw}3(#'}<|,zw+  j(!)xحwEjVsv{Vq!\!,#Å$0 R,DnH331|,"F? q%'XT*@5\,LE& <4EޑhˌjTh2rG¬$*UVWQq + ;VM{1R)gE\p+2^XF~t0n`zؔBGCI|#Ь{YL͝e˪%;L"~(ʂJF9X&-)PR~;!NM3k W&xxg$TM֋|e}ͪF{*^KR0i=8QsƐeY8j+cil~FK8t/;G7wy//r@gilY2=Պ\,h]+)U`KL6.ix+cjPfŶCOXWҥmA N@;OXx/#>|ȋ'G}+=]-kL/Y{}_jUl `\O²wh#ȯG p4̽)2Ox xߟ) C rioSv_׷:!sU,ŧ{ذ2%mzAn,Y`. ;ʰ#", gB;S+ ˣ z-l,|N1fBHC0N@4^ے TQ?6;6\h@%}/9OʾQwFIQ<_R"-fuقxHTc1B mpQibk{ :j`l)4U̓*H]3,/{z4۝H F!MPjlF8 t) e/=&?Cg:КB̔b{Vn'mTY-7OC7846,頣&L2G&SKV<|,c)Y2yIC= uG**WUy`7{E OAyCCi)S])8լLLT8%- xX$yɻ)R Ft `Ibp'mѲV՟T!L A |}i`]>cW? `/HX0 XXq䮠<"f05VwƁ6-?$L[(OQIv6"YsH}JoZ @  &e EV’⩏FP)>4L疸"fTT-y49T3W<?uI)XtZ9(DF-/4"!;FZ+^F}F5 &76 '*|-lVYՎ᚝m7I"0;:\\*vGn8Az1oSG`zh< EPN&sR3MONa÷?o0ԟ ?4?-1Gً%N.)bbWYH~iN^]DrruY)b ݵ%CvHgZ+@DMND" -Tc"F v?Jk VӨLӱFN#>Zӹ2"&t ^+#'X"M9_iԎ:g8>jk& Mn(;?cޖT܊f $SK4'&/zR>qW Q?Z;ݨ{ C`⌂䍚YIR5z>` T&|Ư 2ΐRHoB|oP(ܘ.e|{eKa7pL[en_<:&ܐ|aIJŔ@|krftEE8LcNHC` 6YH>kJ:2>`a^ο5Q5^"4!C)Ӓ4"/3**B2˝ R8=JW1-yHB h(2XtL s}7qu2̈4ԄA`]iTħmup@v`wH@!l<%"ӣTAsվ1s#WIlMꜢP8༗K ]Ɠ-8lg.V"8U j|SoDB7-0I>G% REh}4LjfE~@KH%:6"7h&h} 4( g,a9 }6#/'41#Z BRF'6M)SC }k&M  :C_DMq}kKXx6/8?t6] :; DsbtؿŪ߭Q{H9x &RBRENyȋOjgNY%im5qd5!%4DyLh]9ڃ"dCl6&4sm{ tml4omT1G&+HqCJ Pc`p 2oءڃkA? c2ўpAt}ይcᢶZ;cx'n%tI?0SН3G 5F9{9Vsm3afbZ<32{w,mpjXKչ|Ѵ|&$rh[_G%|PD$]R"OӱO D-K2װp% ،dӱb{r'p" 5JWVs FtSGM?5$5's85 c=1ե8u'lDy}kݚS,|mqkX AwnhӔGD<{SKAhOF.1hf3|DfuEtŞDoײ'8;,~GIײ\?([?c'@2.hL^s;+֟9еosRVr=+Cxu4|,f,-l4>;z%:zg-bu+2_~G83b"Uh6o>|ޕ44>aPapxՆG7 zTD6Af(rv2\ +`-ܼGNLc$^Ԙ8aͪ3hF:~hT*<,Jf(r}d\9X+s5azZItީ䯽@5gd@q$ɳ 䊼Z󝵵j@e& !~}(ت>/%=N灐C7!Թle.Y>*+rBhIp^*PО7Fh7˵hU&HSl J:lw*:rgtW蝕,t| la)`#v 0L&!m"u)|jx<^z>+}{yx8ү9arZqm:ƨ ࡙.Z (q#>23CfLeRb 4$q& >o+mUZk^SЦJߴ |rZQ궿T &|6?:v{1dq 5 j2*iηvZK@ٿ^mXĻ$"8srr m!1j;, X{\ɸ5"D`2{a$<&Dȷ㪈ZԫPdzAck[S\$:qj4yx9Jkƕh&~vpJN ADas_xK57thAZ?i,}bNx D~ n0J"4[ۆwHjTRi0my v7A5!̧͢el /WOXeK@.Q:+?km+j`#G6{Q9EczSEf.)5s| ߀=:Ӡ^FgE+) $LDQ,*.ռTG ;Nڠ4쥑go~Y]s,#mߤ2NMGE;Oќ߯.Fdߪ*"~?,"6sD}_YU7UN9sDsBkl[;A#O7P's`EA,c0s5յs^wzc w"ΉpzsƏ$tC£TxkAy6%wvZ&_O&ќ>m_e KB*I4㎲jgd=,J9kG`Ȉ6/@ W9Uf) h/7;݆>ǵ"E0;o^$(Q68 >U输!>ĂY`_YpjڿN;$V!smA\ey!ɪꟚ!Htzz/t2 tQowV:hPTairD_E=5W'V#Bl'cl%T0gn!sd=yJ#7OI`#f ٛLySn! עHd]72'tSmuJ5_PJRlK0n52+iPϕ#\bC3 6K;=8UJnno˷ܙ30m$9IKtUѭj[g2/dg^yӚjZUMMiÿ} KXcy{;AU)Xz+' eɰ dϲ%-в: ΅/,/Ys!l_}һ6^*=q1b/d/+cjXCo^2b*&fI߭Pϧ!X k^챋4fLƾ]) ڕ[J,p<'?8ݸa* a䅸#%10CLsn"b#YǏl{c*Iu/ls>6z0"c61u(Z2"4ji0w :{a%gGK1/I*vt *o=6dGN ^OH=';đDRYةM}[,+PZ[]}gQt!No*~!OY`T<߂JIa" *~Gfffs{/-kWAm`KF$4-zŭ̥?\o*-7 Y Adu Gx[??c!VʙPk= |.K14Ez=hԻJg)TB"xџGWU %X l"l5[v|,XB^>Sj&fS +ɲ,U lB\pWBL1H9QD}^EGQi>Yv˽qW"?S6Xu"ʔ-Kg 3Y?SrgVQCg,Eyb,*m]22$Sk|=U|Ivb[ 3z?qVug4z!fIZ}/,sZ#S_҇@۵: [T/wmLq"b>ޤ9+cvE09ߺndЬY%"ь"Y$lp/EbDns8IGjAN|BTޚhh`{kݖ8#P[䬽J87#C{0ldz>^yc [ ^~iX,=Ǣr# x$xx #*DEcsxhP4o\ PtQ5MROv㾞w2+O"~_p[n[663yY5V^{9֞vXH_LMEc@uzo쳎Gl^'ɼs/O}(j.jMvjvQċxg⛼''R΃ Wg!MSaſH W_5JH""j>vEw߸UGĭ1-b#W3WJdPnؔJ nLTUt1C:@{bM9P5yZhp%.[lX^7eS==t`\r)0f&wwK#%=NtӿMp27q>yrj@ >ً (85_z;4 ׹IH%v --<TTt.`5aO.ƽjξmBxLG( IV@R}SoʽZya̱r^ƈO$?]+*0(X${Ed vki*jdUɘ[uެ7K<2IIT5'n}_;\NR وJI@64,BC+~T2uj,z)ur -=.)7QJλ=Kd,"nЫJ!Cmk뛻ҍȤѼ@Orcn85dž5r']2 ^{Lj)߳˿{T:8tN/ DK 3ctPC^%[h}ake]zmoК\cAhR2Pp+NI_b]e$HԨsRN$|־$x;p)Kcd`}iW;+hE~.n V6!qx=5, ;Kpvhw%fHz}hO&mCs!h6X\IwG(SGg/BwsU\EWȋ-Hqױ)FXX}L ijf/ ZO?m]UI!sGS"#~=rHĐ`Z4d3%.l9sEu!cvpjrhLNO5[ kZ|Dz kɶz7ZǬl> t+{ 1eq$![>,jSM6/w*ks|0㴑 :HHjwXm?P͎TUfۤh:(1WĘrđ<+|:gi9;A?SGQrvk]lC \ܠҷ;cm-Qs]EvL_T@- 0z*=iXeoEˆWm4-G?rf['#lÞv? )UT@ft|7׀ACA/49m*:~+jJo[lj:;W{AEK\ G/8'oFP~el&"Ԓב:8>d)0W 8i}mXрA痺>iE#~&`]l}/VW \W8B9ّzS.`P+9gdÑ(>GK= l}གྷUjc€xbz.Y XnO} Vm$F܉~Xb= xӢQeNP\yuA RoJcg%*mֱ(w";p,Gx.L_){ZkHZFhf%h~WJʄMԱB6[TLpXV@)UՖkŭr~!#@F7b6ֳ+Gwm>jY*BNFym\)-"&Y7IM4Žj2hφ/yU8Jn"'6`,錪3d< o3JSP*b}#"Iy{ Hx õB7n=ME^v KȄ/EA~ۺhg>ܼGqpA8]V<{gkjy,0.S fb _ ?j[ebGyĸOctW1FGaQ^h6:M$K* Ӈȗ|eWLb2+&q0C !nP0AQ_38 |*n]TT*2\ $=-]AłcLujƲ_ _4"G,ywzȐuBuv?pyD m)C:p+VpjzJG>dm-^okzqSXKmJ*Jџg9 wvkdX(|/WCDHwAOTmd^=eTiT@>õvQ[`mن]W0|1X~ܢ{ s2?y#n^ kJeM`-4t'~Vhcmc9ִ0#dTw*%A_,t2}V֍ #O-pBU#ɘg4wiW&Orro2^B9hu$}CTE \<(^)_N_/@A}̓'5D#dh 7)OjtOꬔ]&\sA65Q2ba&e ⓳t9RGQqYBCͭ$n=D<i:mT v<:+]|8CǁXkE<%/6h)o('l(<׋l)7 E%H1^aرasI5冀: ps^\~,A4DN~!Ry &s#sߪ sz֧YVSmĜ^dmaEakgOtQhvSeAYi-̮G~`*ޒ! mo2hk"SӠtfP)9cHt>zYT ,w'I0L7 yB {,iz$7Xz;8dL;ɦf'w$7Sc]` q\-3+/N>7}ʧ%J/hRf GoW|rQ[[ uDŽjǨ)q.h]P P$nmVKNoxBj.}Ag(@<6[Ӷ}BB pzȴ4+)wtŠܿj2ז>?>8UV]ܹ/fvR.c)L%m .g:$LXs<0fc*oSTt Ĺed"4HW8O *668FEY]72M߇/T|\!ޠ'uofߊ͘@=!/@z,NF`8&aӮXhJQ$c|{~ et!ۂGJGʴ|3<δ/T͉s]{_D(~w#/~Io+t m?T|jlSJ fFeS^:}kt bnZyA|YI|@zK5g;`| ҧpVU>0:Ƞ;bkt> ! { ^$<1'(&8~Ft6p16)t H}cE5Wl-&b0L_FDJ$!O0Cr7nH ?T3'Yt"Ag9"ޡ)cY6AIX?>i^vZ~HІ8nNaǵQ/,|!k«YϪWr&c ^x Jtk\)C d;Sp=?+>U:q1*ӈ,#txS{EE.:HaCa!3ʁnM2> I? f3yꩫ=Ra(Q: QJ._C-nm-3*gk lr/&kO3W򋖻IFh23 ##V\)14u'X5NSءkEve6qg0ȡ^2? 0\7V:s<5Ly`TWZtm ?KT,Lʧp`;Y/ ],9f\X& ?h\xJ#?y?<-st8 Mmu'<:,cС}ʲQm:b wu @n6l1ɓэ| x&RtY_v^C#5U|?k2ZBJ]5:4Z  #Z VxN4 M՝;K$- 5'QDSB9jGLr Ԡq\TD~>x!.l5b9> W(pC=>Xdʦ܁-p+}mhy*WC R?p"!W{=Gyǭ}?A0ō0Y,tAAe85*E^0$kdes! [s C- \kh*P 1[%#.Tjz'mrn$Zw3j)Z1#x7tT_QxDoI"jD̋ix[*<6F醏0\($PUCDqSڴJfDR #qIU8?wX32Ik^UFw?8$.J3rA@!&8qz~‰7Xĉ!YhgzKc>/NYI+7xOΊNvǏ_cO ~!J{=/P+q@}ۗߚpU4{nhV&kg`g-% : Fy1ԙYxt# c*jeulInpri+Ѭ~G%r ip)e.Q-@x0˝YFGh pUppCkw (P=Iַ>zŪf R{'+}Nņ7ͱ1Zqh)_!CUwd}a'Zw`F|n&`1n9 7SLW˦A RJ ;-q{p웫4͙Ǻ^ QʐITpev1̍^[ӧܧmPx:Xv[ rT]VwZ4~? nsV8M@}}pAKV'!ÄjUnR>.дT) YF)-p7=l<\K"#΀t` 3`MzNuuқ,/bjps{:z؉Qd;ʪ#Nj"7>zL,K# +:!}FuIYRUg36/w WZ[H/p*|dvx^dmt8;ژ'*hT\z{"u9rXv#fUVfݎdܯ;`Kt/Pnf5ǻX ճd68VLNEs `n gDO@tzoijiF)AܻKr_KWyִG2=9dGV&`FhJܹ+&smy37g=6п}l-WdMRq]z/vh0f1yK1ZaQrM nT>7s!l-Wo< s-p(#.ǔ $೉^Ê2spڻBziH#"ώ|@BU B&y$e`!K %QΖn32CQ*6h&C-.2v|QMWClO wt5LLz'(EyJ޵h+g~<0@C8GҞ>dH k ,Z7 r<ӌ7UЗ[x&2 ɔVg:8 }&SL7gRb2#UH6Q#S X΍!="*86L=#3JQ]Ge=jCD(_U20 \j@fb)w0\>.K0P%!mS.-ŷ62b\ RB Q [VmYU~uKxׅ&J+P*6' Jl_ݹt5ۄN EGJx1{vxLh߄'cc/摍0ob%!L&6"翣ͨl54#7(s3(x^؞KV^Y$B8oЬ Q}&Y3pv/,ץՌG