aboutsummaryrefslogtreecommitdiffstats
path: root/tests/text_processing/make_clickable_test.php
blob: 75a35daf82e7c92a9ca5bebf1a6af5410ab984b2 (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
<?php
/**
*
* @package testing
* @copyright (c) 2008 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

require_once __DIR__ . '/../../phpBB/includes/functions.php';
require_once __DIR__ . '/../../phpBB/includes/functions_content.php';

class phpbb_text_processing_make_clickable_test extends phpbb_test_case
{
	public static function make_clickable_data()
	{
		// value => whether it should work
		$prefix_texts = array(
			'' => true,
			"np \n" => true,
			'bp text ' => true,
			'cp text>' => true,
			'ep text.' => array('w' => false), // doesn't work for www. type urls, but for everything else
		);
		$suffix_texts = array(
			'' => true,
			"\n ns" => true,
			' bs text.' => true,
			'&gt;cs text' => true,
			'&quot;ds text' => true,
			'. es text.' => true,
			', fs text.' => true,
		);

		$urls = array(
			'http://example.com' => array('tag' => 'm', 'url' => false, 'text' => false), // false means same as key
			'http://example.com/' => array('tag' => 'm', 'url' => false, 'text' => false),
			'http://example.com/path?query=abc' => array('tag' => 'm', 'url' => false, 'text' => false),
			'http://example.com/1' => array('tag' => 'm', 'url' => false, 'text' => false),
			'http://example.com/some/very/long/path/with/over/55/characters?and=a&amp;long=query&amp;too=1' => array('tag' => 'm', 'url' => false, 'text' => 'http://example.com/some/very/long/path/ ... uery&amp;too=1'),
			'http://localhost' => array('tag' => 'm', 'url' => false, 'text' => false),
			'http://localhost/#abc' => array('tag' => 'm', 'url' => false, 'text' => false),

			'www.example.com/path/' => array('tag' => 'w', 'url' => 'http://www.example.com/path/', 'text' => false),
			'randomwww.example.com/path/' => false,

			'http://thisdomain.org' => array('tag' => 'm', 'url' => false, 'text' => false),
			'http://thisdomain.org/' => array('tag' => 'm', 'url' => false, 'text' => false),
			'http://thisdomain.org/1' => array('tag' => 'l', 'url' => false, 'text' => '1'),
			'http://thisdomain.org/path/some?query=abc#test' => array('tag' => 'l', 'url' => false, 'text' => 'path/some?query=abc#test'),

			'javascript:www.example.com/' => false,
		);

		$test_data = array();

		// run the test for each combination
		foreach ($prefix_texts as $prefix => $prefix_success)
		{
			foreach ($suffix_texts as $suffix => $suffix_success)
			{
				foreach ($urls as $url => $url_type)
				{
					$input = $prefix . $url . $suffix;
					// no valid url => no change
					$output = $input;

					if (
						($prefix_success && $suffix_success && is_array($url_type)) &&
						// handle except syntax for prefix/suffix
						(!is_array($prefix_success) || !isset($prefix_success[$url_type['tag']]) || $prefix_success[$url_type['tag']] == true) &&
						(!is_array($suffix_success) || !isset($suffix_success[$url_type['tag']]) || $suffix_success[$url_type['tag']] == true)
					)
					{
						// false means it's the same as the url, less typing
						$url_type['url'] = ($url_type['url']) ? $url_type['url'] : $url;
						$url_type['text'] = ($url_type['text']) ? $url_type['text'] : $url;

						$class = ($url_type['tag'] === 'l') ? 'postlink-local' : 'postlink';

						// replace the url with the desired output format
						$output = $prefix . '<!-- ' . $url_type['tag'] . ' --><a class="' . $class . '" href="' . $url_type['url'] . '">' . $url_type['text'] . '</a><!-- ' . $url_type['tag'] . ' -->' . $suffix;
					}
					$test_data[] = array($input, $output);
				}
			}
		}

		return $test_data;
	}

	/**
	* @dataProvider make_clickable_data
	*/
	public function test_make_clickable($input, $expected)
	{
		$result = make_clickable($input, 'http://thisdomain.org');

		$label = 'Making text clickable: ' . $input;
		$this->assertEquals($expected, $result, $label);
	}

}

=B'V 8Ls oSNjPD9*5ZlD)Fݼ B/?3ry!L!o Wh6C r ̽HunÜwŽXޞQ |䴮DTaW_|ަ33aKY7A ukq> 8?gvvތa ,y)۰ #CNmmN_鳧¢%kﹷx+#j+Ț,+%+7ZK:Y!s!v^ ʁ5z\7K+ҩ1_(frURNtgHc6u;z!ǻ,PINFKttZLUFT>z$rK9skXtH{0|yszC͙L3Cӵ3W-HIN)e@R0%1PUMvoutvrO+S=G[?ᆄ+U8{U `gD+G`$Pe3~oT)87mpŴ (|bdWtƍFAP$| Z/z@lO@u:8^ ?֐3d?3MUϨj;Qg5!dklSW(dnifHO*Tt/3)*d0&bٵב-`12mEܔ4OG5J9tN~tHKJ)~9gA߉hg-2K$H({<6` ,7:6̏*c?1u[4:EkYjpOՔK|$9U@)"+=Ƀ4& ą-}Pg! Y cw{ tw| ."C:&v@4NvMW"$ևNJX>LfO Utwq$A%"b\Z*v >F}](|-$ O2ZNǐ,u. SbO- >GF!i l[6s|ҽ$8 BW/rX!Λ3C(2*}ME},HNXN?`_8 &ssDZx2sd;}૎mW\*YqsE3qMP=͇x#% %hcż>KJ4kVévyxp@UQ%4/,c';>KCDу0 & gKq#^( F XH%vn/-ukyózj痿0釁~d2ǺBpTsy6Ӈ@YLt9zBB Z ?K>ѿ8f{D=D5UF UeQ^y«퀓hZ#Q!T9Zo9, -0@mǮ,|78`q}UD=;/QM-kɜ"yH:zQfP2K׈3[eg/L6ʶ%c?ęaYe_xۃY?~F^*XHB{cY>4lx~>hu㦈VJQaY&?h73Z77Q_\n Q`@1[b(8jQ$dX bَJk5OI+[IlRq*{Dž4Lm>|չ-\ 숬-W (%g%f |y-1[Pি-$h65372zgTMLCK+TTjU[p|RFj$FLk 0T.띹 g.-{bzRy{3IֈS>fCp#2vbLz59a闃95V,l11eX#^ nJ_J1.Ƿja5usyb^WT](ٜ#U E P ~adY8,= -/Ѻmab+ajp8g, ʈQv|';0O .G'!D+jfۂ] ko1:lD$$Yb:\]Uȧ]Y#Xt v@4G9@~3BN 2I|~=GÙ4pfE8;3Ƭ@Cq)j\Y*Y5|\'Ȅ*M((#3A]37Ga#B1#q+r5 RA }N̎;IɵhAܬQtEm7f +Nm_кX+ DzgGv_ci1iX.g,W=Aʡ$6e.9}{ / tnnf޲/ӈ.zÀ\=#QWR޺ {f`#KXq _S4%Fv\Kދ#+9 =tOL^,˲W/ح{ŸKWWC[U' Sqo|mӯ/f"3"+IOOEhc)3 e(;p1 Ob#'cVCm=׺fݶbG-F]Es}Y{HH9"׏T' * -'P?/(zÝf޼F]86oӍ|?N\n9mZBJ0aO-kŅ V:ȫ_Q>\hBm|c*^NavW^#KgR4XÞ,+yo:Pp-ӫڤAHid,`g]5|n}&DWu'jǕuDIo'ِ-ktz1~0&\C:N6"@{#2y*m*K8owpZѰ^m1v%Gjk%Iat8)QqO[ 3䩚OKD 18:oHk^2mJeA"z ]R'2O,w]"QPS^42 E&b*bjO_茉T ACtKU 99:-s_.b2tsgA]EѝrKܒɨ"BٰdҠ!"sETUPTSm.Yq1$2( 47Ŧ3 sG8uM#iDdDq f@, w) 13KASх7SG,ظ kL[Ϣ8\ 3J+k:"mwDQ%֠ zQ=0(a%)hslkBXcG>U΂Y_sKzq}&u-Lp)M) .VuX4ݾ0cYMu/ŵyzh0-~4{\/%MrmJKމϝWH$5DGho&3juNGyU>@`WRĪ@a,cW'|rS#-P35BUߨtvq$7oBJҿ\* JpvUiDuNo(i[AYJ>sYm~Ss7&-D)y?'^slB>_Dy@~vs7$* kN)=<;R xRu KwgPsB̺Lu!-7aC~se34Hr>J4Jpvf3wQ"`^X m gBܨK2{PVo+긠򒤵8l FUh52`Qp'~{D?>r>onURwbLQ%M/)(_l 3mѳ-U4rrB)ڹkTqR RZvvi2D.~ ^T8lv Si]K yZu ve1^JѨ _TR1 7@jUO\5&g(–\/zP5crZ"M[ VՙHH\[fݬJιhfB IA>N"0d__S@PBؖGƴ͒rh G}%ѣKmJr>/)gDij22W#T50:JR$c[=`o({D-Ӿ*>v^*jl/Y .~'"~X` qqi+L ,' эNf zW9_\!HչNI߅ˉoTqbHKo!flЕC(/K6n"$l2)7|c1sD`S/OԖy@JvpMS3}j|Upk[T{$!RS(=PJx껿qi.C;e~^v7jRTN4fԀp_? {iPἑR2c14hsᙸHvKv#b)ņ;_ꪗ&"2UG;?|j9(˻eӑjk`P⇣My4bFt'hJr zDOD&ϋ.uʄ]8K93rxu@t{_NfwV#|In"񧐚뼣S Z߫Z#Kߴ9-"iL Vp+ZO*-_wjU!Ʋ^r+Kd WGdW}PkI~,vO/*= x}Go.#F|TjL %ӿ|xymYRcݛaxlԁi&(c&JL$af2Z^YW բq3$.I2ubJ5/ai%_ c1)q`2o܆iC¼u\;NXuDEݬ!%iRCk~y['#ؑ*TyPd K%G6`1m;!rs[7Hg|̷` հ(4j@+ ۢ Evpjba wjO]9g*G򌃋ym$A\|} Xiry5YFt33YkmȵQh1{7ˠuTg'@1T'ߑDd`uhn⎠nQԂ1{Tߊ+%Z3j,fɤGQ pV$˛(a $xP"Fd}߽"M~mRiҎ ݎ]+b^uw[m7*V>h&T LN o6ENҿT-<` c-%aR蒯~GUQ>#"bd:f.YnYYw)uS Q%M%WX,Ԋ_ଆ?MMm,%5z~IVJLqfe]I7K?bp'X}Dgm RK2G;K \3o/֌;THc3ŵ bZ6^ {$B4 >i:DHx PAڻr.Pt ~|/k3F.A5U?-|w1FrRO s$J~">ίoc1tc $|޺/Kf|G=tӋ=a B1cm%T5H+/LŲm;9VJ˟9vYMw1pBPpr5 Ex[T##%o|x/v!70nש?0Of[r"C70yŲal~׫M 90&~\)elWq]om4=6 z .oIvPPMcݳ@d-~"2bԭh%?Fvv%q 1r(7S/¼,|995slʼn@2gErґwo^.x<$=ʄ!t5~@X ;#q:[{*'֬lpF~3bڂ-8_ (q~]v:eG@Ks"@4c syM 6*sy$Y3@|>ph&*!gcC[$0iߠ%[}74|oڵs^<$Ȟw:>?*ل n /Xԥ/jTg3=t?/mؾG9d:`t-GS &^#%}z2!>Д&RL`.ۚ@p 2`$3Qcy~&@1vb;՝F:%> c&O%Ug_8f >& +kkqMrRAz B۹GӃf,W7C`jW7l8Hۻdfh~SEUɸәgZmoMkO8C|a#DozXLrn̺PN'UFrՂ[NJ{;Qpl-92&tLB^D"?R"[_c l*ȢC - [LR +J ؼgRUU;;\2ة9E"HS]tFڡ;ZҢ9i[,c> Ŵzi|$X%:@*1{7E;s~haBy}>Ψں$E J5dj tɜIMvkAE4&]E=Y.Qb:xI'lda|s̲YVz~p)請Ie"u:A19Y4[єT!Eݟ5LPn݁]7bȣ׮hȄH+ee:1(NYY\$X滒4U?2;TA1DB|**{HZz]_!_GME.)=nJkqO)AEp'L34/ uLN9+Lb`2}2A1_d_XCұuGHϴ; бaD,'%AE:o|%[ 9cՈm?G_~G!%6 ~]D ^`lj;ڋ+?ԘDeTs!n/Jܻu[!E٤#Lo%͞AO"ot<&Vp HWD.(c4货=oO7:`k[|°n32RNSYE] +!buX9dg|ǫHT5K"5 Q^U ; Pb3J&B ,[Dx51/y5mPQoUg<Ѣ<kx=0 H۽=%AVV b%޸_]R 2$aA Y>KGXOgEy0ٿzo^8N"'8jmUmڮNNbԧez&Ӄ:3%!>r&}$!}<վȞ9 $'vS?twwȂ?%#<\Ғ4ѓ<],+6]5ھ  85ۮOH>z*INqi H6oۊXk s;>qՉvN])\(eJKFRX|V| QSlnT*w%wJr=8̾wҠzr/S+Pכh axTyE 4~(5%'P*KʷJ1*kvJ"lDٳ/"gxrd׍(G Z/ѝXI"mB;\NSd$%⺇FU2 &[4,ټϮ}= ITWKč'1Ɓ {A:7aQPPtBs[3§(,5APen:D'+ir2d|vuNVP_UMElSJlZ\DŢTnH1W>A E̛mUlʦ[GL^KSGtwE%鯝+ ;'ni@}+nnoDme>.YL"N3.=RS,S#Q^%wf'XXG1nmcѭ;?@:O|8[bAT??hw! -&'(I:$xLA8nvmĺ㓿C}9Sg6v&S 8ya:UE8weg– {b2{-=r~RytKoHMnKC(@w<5U_ge ʗonTV"Z7C;]'I(CDĖ_Vo$}wKƽ.`BQDLF,l Fƴe w0WWVX]d7 )bBN=SoTNڂӂsTi+ d|sohp; Zp :̴niP~ HDNB3݀d;%ּ<F7D "5Mb۞~l!=WwHa3 3qtq:/ѳ=kzORJ@RmC|hD2TΔ R!$WENZʗJaĚ_׼:,) aR¹<=3xZR^$|F+mi?K7>D^vl;t؅7i,jG\6iKÙ/iMʓow!z7z[YDxBXfPV:Mh_L|,)%UKeƸ ;hX\^dAR`ƫN&ƽXX֒wuO+XkpsخýjdpQ҃@y%/Asqյ2o}EmK&6&=H(Ҭ35SɠC¢nR>nՍ!9-PMa{W.~ӆ[U qlq$,v k^>9 Ѹ ,-.l#zZMg?\Ü(1*FVn5<_^{;$ B"6MX2~/ ZpQT#`|KAS$ŭȄ5* x򝭪|v@Qp[q2#`=D] #e?؅oU㞭B&+}  롇[y϶ͥ+0q1 + ;ׇy;Ltݔr%2q1;,`w]䮶RצM=oaҵWB>TY@ 37}P J+,G1'|OkY'JQ'@x7pG~F-8 *_GD$VaLm^&NRs`,e /2رS`bGS$dq$4M%g1t%*C)o&X^[˛B TD1e3B1jL" 0օ^>ot:'~HO_p,3pC-} 4]3/jo bˉpL6Qc|R$o6 "g)уk^$| VQ ~dGVHW"zPL@yJ-YBand ^QZo|?S7o;t#6N4Z5;[WXzQ,ydߔM

+$gyκj\`jDUA7}m5NVf`\Z z^l7vJ$~ +1h=wx>x2kIX >zCkGO;[PSxk/-QgG+6H]V«K=tAI:yq. ?O(ТT-OOp&9H@{OP#O.do$ZKeU}[ +i Z/olO ~G4l_jT=zG:(6C֯م<^`P:mHk)H{9SZ㟴*p聽#>RvkaU# $SfwmF-ȼ of{7t8J'veVL;8O Kivg9J^Uh/Roȫh8-PJT^$$xYy0z[[3y}`*:U`?ě 6l0[Ӎc-El:YJ^OO|p^"9%, J<de 9au@3=t2GWɗٴ#UV2.!Xzު_VDB% .,;1z|ygA &@D_vI+Tor~HXEhessKm/)deS)k; ~tgcR'{!{fmm@fBtcRo:728X+/r8c vrB""I|Bu}sY46IoU)E.`x?qɄ2Uḧ3bPgJH83^6g |K>H r~ 6"Q|l.#a!?)$ObG\Ъ !eXЂ! Z@Tk\gaRjyKxGlW\+ Y)̈s<7z1F1i.QڜAA < JR tO j \J3V8DҶZ򠈝ގ_ 0r@M719Q8so!M_\vsL1lUT*#qQ@ѡ{.K P[AM/u=a٦`Q߂x7HCʂzk=h,_|i#p2+?zT.d?W1,W6.1vO;DA߈_?4+ :"OjivޭUfr$ ;ĺنqˍ0[AgHsG`yl}#;J7=x$dGEN=*d~V~Pâ&+߄6P"PXQSM&@"QiߚMg`To<%7[l"Dس9?Ǔzp V (fjk[ ْaFqw{9 XZV="Tk*f8?&NF@\-7~ȒÁԍ)~kqł&gNCC%`D,rjW^vp"^xq/E"X鑃֛,y| chP-5'(,߱_+~?xk$^9]l{+,{n"֗Wxw 8/מNZi*+N$It{/%2 B4͗ tG@/ MLUI'yüNYo$NnVWvRleSvN7ĘU/>fQ$(yYIH7}B- y.6r=$+Ԗ2<\p 2Rٻyī7'o^KkN[+͖nߍ@E2p ĕm_0rOȥLh)Rf.D/+xYL'bE`ڎvcAˠ 7F-TR'D Nz>$+#Bz>g"_+L@?HzW75EJs 4('&?-Q!Sc΂:pvWYl[ X nTi|`4pcGNqv#YB$a[Jڟ\1weB/fF5;/Mgg151H̰znGWS}$%0w]hOx߬APir P;^pah_ȝːA bͲz]/gs3ENwJ<%7#ʴKʬ]?g(&[Ƿf"Ke2gu'`)=(PjM |_|/z wxY΁6<1n´2*W,%94[6e; w,QK;A!\C* i?Ԁ$޹&\pGGE u0L<, >p~QzGE5j$$v"w>s3S{#{;ˀi3Wįܫ Ϛ(%n,7Qtm;`MCI[ G 8(G;LhàdaEKz_͞Hv!"'x]?B}jCDhh?Y|ʧ6H\-YŪSqQāT2(we͘1胧xhZ;E{Jݵl0/n?) kD 7p4e|/Hc;(, +>2a۹:JzǠ`#&!5VOfxDܮHU9xgɮaJX [7~\Q5* tSwHeÒ ٧ho<4{E:4 }؉vFpE}>mP<\}k-a2-U %SjAe)ɱWm5zHwn| }鲳Cፆ\ܳ8$Q $\KL$BӃLKhzEԛPc,6 ylDM n O tDꢊ#2YmTiU+Ǻ4@>d5c !Lߎ  ^.B2 $"̡*!QIì lz>>N:J =r4X؃ohu8$oXN)"t@6 'o6a6` 7LK rkC1p2dW}&xM.35s)@ܾ{,&9+л(b= Y5Gܲg "yxsg/"Ь᧴#A۹EvN͸(쒛R:ЉQImzz=WczV0I!5! >M>1;xx~ ufDEcTv./ti+7|yOF.7v:y*bUU@BrxA+&A|œNi704yZ<xum,Jgn Jުf_j&]_Z^s+Z݉l-4^1q#BAhW?:F+n4?aQ|t/Ha)w+̥㴙`,[@nhNFcr'U[QksUQuUbNʐ_dKoLzqZIʥQ R^Gt0B0?]Mvaܝ~0J/\#%?@ö{U *wg3 KLYS[BV列Z o!A*[::a:ra۴BZؓh{N7GFW=n_|=6׭Er$0w7u<Kuo2HwTH< pڔhb@r=\.I ?a=fpCG,xeQ))#5Fn;" :"*`9j|ǖ5 ia&U0Hҁ^1CZw\H- kԽ3k, ķ5 %7&P ć2w\eyGkBcOMD31Rrx3%qkX\%!^@ALhE;},p3fu+CdX ,+tNQdL8¢4z7KB_-K4S@|H: ,\yΧ̥n-Fjb,.;c,[[x'T2?+V)=(%3zb񠼅~UAe #I=P/eCN#Tz;K KkC)GM$qOH 0 N=*IM~l+ ` "q8)= nOh'H 9♜ꔈG(+HtJ u+\*"!ZcD/B츫j,8eW@`ֱ0Tb\rM @2 ٮOh.=_gjjlma|1Y!LJ?R?cO^)e?xc+FxB:y' " q8w7m3']Tb?W$aeORГm˩QF&(*..6z!N)Ĥ[cNHtT 4iOs@Ɵj(btZ5@[6]L"SI]:0s\L0J}#_JڅC]u*S|[Kq}*]<.hȞf`2\OS|=oV: )eqKt|%BXx;txܯ#l{mQV獰DТ!ٔ2~YYSN$z VNM73eTQؐv' ӓM8f2`@~R&Ykakˍ {APWllcMBb<}nܴ~|T !d9b3v3æEBNf4BV%t'tP= #{DU,SH<$8 2{Lӄ}^}16#? w:JsRR>Nvoc%%M% $ӖNV-B{@mS4_ȋ9!0t $wgT`yR|R38Te ̓sN0&d.M"@4E;֜""6rGH=1Hpey Gk^ѐ;Tvتebslaw$NՑuJ`aLM~`jyoKm/^jq I&rzm SJ-TKx P7JO!)YɡU|q25yֲ6Ε"-h䱮m=@hb}7[l 2uM%w] o s`nGBtœkx؛:t3(p_۠rwO'DB G"E bA:oT]b21ȶzC;DmFCMJ1G(Cпp}GDW]o Ӗ(mnEcY[d/e$HBo!/D trY 3Ag'HpE9;0Z^yXH!hYuH7z6h[GI%(C>lŢ$nRLͳ miU[-w!w+o{܅d15>.m{ΉM)V" N gUCͥW΋..2c rSˎUߒMCFK=0kRG"p/j{803كq=Kh7P2t>hSOc&Cx2 oj6(BiNloՅoej\&Pq9WBVK?)}葃'>-p$\."'0C% (Khef̣}qx#ttt'q!ﻙ쯰( c/Şڶ@3*NL~ "B;=ĩfvce* Zޖ /491MR[yΚp. 7]խ :CTr> n*1d "eXd/V(}{'k $9P0OzÉH4))Jwai9Qv$O']k9#V'ً9->_Y+uIGpGcw_90x"Y Lvr:gZv.)O_biQ0 b5D)@ {GV5ziFD}8 >pQJ(+f-n6wg, )&L9f ;"juCFMk\K9*rd46ηt|?MCꯑ{ʝzϝ\F_^O9X:_h y.ĭbnvƊ)K&QX6Pl[qs4+G|j`ҼDAUl*A.Q.5s`:BXeLX-މ+]n"$wwx(^(3aDm澶x{\?At+C_{.[py]fq#7Oң`K[6[_Aӿn\6cJ"{r :PGͳ_:҃R.ՊsYJnڧ97=VNSzON;;7GV}o76Nn"0wkh"9NyWȠhUFqV[{aq7oH*|63;1Uƒ]o+My<$2좍kH)^US踶(rNI[|Kc#QوA=MG0WwJ&)y|˖_SWo/S7-#reqܯ=5+<*/Bwg4;a\pH #HeKk;Gy })ˌY}LS#VJ8:c|Xl+^KHBD9n\Љ h|b"Mra?Ki8l>f "h1jrKכ\578 tV Cp5DX*FA*Rf"cZz i;-%ɡۨ#8~_a_gpXb@ 4x .% %W>2W?S ʘ:aQ*1`݁@Ͼ1WK.{ BY}LaiŀQ9)+[${lĤ*c1 uj+G'm:;xAfv{AnIsw>ޯȡ~wICjQ]Ųz8I( mvX! rGqI̮XCuvl$F _cT"?0[uV,`*b~PI:˓Z& ʼnG%6?{) Vr3ah(8Ls{Yj 20lU'&YHeGVY;F_[3T"Ŭn4eGk0Ӄ!J@p_t'[^]*~tܳ! MLc=ExCC3 B[7KYz9eݠș7n4CjJNmhpSaQkv=rf[܏3V<2Rx}/WVH;2q%ډwh+ '<:J l4gT*Y l{M `wS ."}V 6UP[b6Ȯ?w `Ϧ, e/̣e~t^pV7YLՀMr{53rzfڼ@O;؟.(Dq'NDVD s!_ U@Q3TQ4;Eze#{SA$kڇsUc<91R@6g`eoTzU `^˚{An6-avbr4Lb2N{KU?4ωC_ߑ s^i1(צX bGwt7=њH07<) cv+OcyDFecH6b}Hy/!3^P\@ܫss̷~w'2n*׾Po %XF )CFm`4a3e_5aL[VUeBn48qJl :Xk/͊ǝE2ZE>2 :$9a+/6upV#86(p \v39^h<2zH@3Z(z5@C,M;ץrĥj|6x1qq8E'jgWS'dp/B"x 'HXꀖa00؍J u½sIj_. s *tKT=;b]Ś: -ثf`{`E]l Z@cvD/R!i&~Gυ̣?-ϙNA\r8,/:&Z W st?zPQSK.6iޒpβ|B~YwZ+Gc~΄y"P (>ǖқp\)E&GÁ];xg-D(ޖ.A|d3,M0]*C@]eyK>&[+tQU=\͘Ő./lGdk 8gPi /uVU]7HQK"8xS\ӻݰ:x1P06gkԯ% vXm)FdW6Y FT |A_2 N,t7J FJto!y^$%OďD\ {")%'9ղ[\k0vj x*N|J.AKuxKY'(co`[nywvYdKӛWj%\sq}z*^K w$ksXiLf`?[#: JÓѦ/YC g\]~@.H4Mhb61GԱQrt`濱x^QPf ?I巐Pۍt57E) |W2yW !{ = dߎW?߹ϠM!2y"-Ϡk%+ⳭŖU@ }w#؂) x KƎ&iaGznfB-;W#6$+=u/EjxYᦽt"!統K6q9HҲ!/ʟV͚ ZI?笮1͘s\i%)\JVo dHCР!XCJOZCmE~"?8 RLA Iۂ&r`K&Sl*;v-U,ݙֲ:h *ZUt>Rh>{1`*2MWP ֠dcMasDW oFi6ę4$ 8t]'A?sKи\~(/% ׄSvfb>x[^"Kʕ{KKg`#|':Yfδ{@ xyKke[4O 0qUk 4؟gzYIXuśG0deQī76SnϠȐ$bKgJVwڝ) ?/M-rq_hX.VŐǬBW,|lQ3H>sh6mՋkp](mP=$ry "ƨQ~! 㭚dOPmxP=xl5wZΊ%0!\r4oYXӏ6ӊx!'s{ĭf;2.KQu옮d}k\X,J0^)~H(k\n8%w/}}tď%9h:M胬 M~uG(>lF]@p,M2L7WܨIJ<7b%h_@vWy2c(Mv2 nF-S{MR-/̗χ f<Ϫ,g$4Mg:D1ʸ[%ó5:8 V)[ :;[1JOiI/ r?o L{>;\9̳OB'W, R¸%`NnO$VLb A.h{o9[CH4q${>tҧBWUݤd21BLJ+VȯW: gH'!CԙnSH[}1rCQ~KSabX7vhhq 'vQ=2ΥACWqE60_~3#59EzXOٳĭ/P]zZYiYeMNcZ u2CК2ڪHRb IA7:H."*1cit 1q:nŔgkq(KV"ciL@ǎBz»CF%A"rp7bxpZ}.4=s#yp{W ak'J2҂m-~ o&ѡj5IOLRԁqy]̔A lc2z*m}jʝ%u,H] H;2sC\oC,ʮ@x)Um5IZfP|st(:9L_RW.Lٌ;:K\"+wL8MV*d1i8- _F7U!=ϩ(Cתf[sQ5⏃zB()↧z~s`'ae3].ks󾙓R^U!)_@7Y\R2x-B}"Y~ ugc?pҀFn#$Գ 'Eyөd>j(#H,Dyē xY%uQL~6^CH]Tt<@aoD;nḥRpօb{0y{6poz :fbil PQ1 Il`t!y)b\0=+RLFsz*!>3C^nn5tF¼(maSzr#QVn]I\sJm^AY>e;h!@eOE+:IFG=s{;88S_DRT|v=ۼ:OHrqPF-Y? btLFy7<$l5K5Sz-gIi|jg.cwJqc j|;霁GzM)fW#WS=h'?$ś:P'R(';Zҭ f(ݒ\N,F]P Dt|prel\bK­ ~ۓg`A/jR;0 ʃo?NEHn;D@#rĽĴ[,o 4nq|/_c pUehWGM*TT_d_&`7Pev Ve5U+$WNps? ftZucN7KRW6$uP2s< X8 d o [$pÇ {IཥCF\sm :1'Yy1Nr~eyz'oI3G ^N* Lq7J2iKv.6wk|Q dB ;lpЌ bpJ]/w'L^V $r/ܞ߈8>O>Iڛ䰬-<{JNS6Ă$"P|T y;t$4);r}"H6gZDK_+҈F>Fzܢ۾\M UA 1a&@":z# k8!Pśm_9DTp%ƳT^Z`'k '4RD76oZI&&Uy:,Mc&h5ϟwEq\'UnT|Ⴒ-|eB*F^Nh$:$")K`F<ݵ(C;*4b߯YԴ[5[k/_OVmECI 16qC-M4>*~^A<$)Z5KQ ƥ8))t4#Yt'Į^rAy$ rN#I:{1y(4WxͿx8F˒3Ӛr . }*3JU'T ~Js?vQvL0(E.qÄ/U`ea%e= j/Ehʳ@%ttIH!~] W V[ͭxvBǑz#s -Tpς%{S6ء+ Y:Fj ղzaezxm )p`2*էea\u4(L(!u:guL ͷ7K3p> D<,v $+eqm] Aߨ]. FF.Nl{^C