$U)6GB.sq-ӰMnx:bxa-#=W@oRD՚X;t՝ZH)r=Rz ~[a'Z-i'CUzeB/VjY<J<__P`LDvt`dinBBdZ-4um7޺rPxWko(c(1UNXH#ʬ)O^2=aץ6&?!=*]ڄ +5⍷"hw0Ȗm?>JO:Σe46g#]y.[jįgv@q3J@S8?_S;y;[&^h„PƧH&4 3X'e"ו[-!Cxn1ve5giS䣩M%CŀL)Hjwn= T{|Um\qM 05,tx4 wr0E\Sŭ疎oR\YXqII3}$1G0nXJ,e >T$`Fsk3jҵ1"slւ̘8s{W7~=m8szO0O#Yl+"oPV?޴)v"ٯ.{ ~1WyRPD JȧFFeq㑉.x#dGdzAUVz?%9L^Tf;A/j5B0gz( wclě#W9=𓋶Y>ld>@3+3'7݌ҧ6Q~ÈǖѭVmw}k/3z5DQdB*cPkF7fWb+~ޝѿViÙY 0^FI9c΂&>"oO9C7BLR( be׊ +K<(s/.K3Rhh ^WƢе8?{(06t)M!_^qP0;ՇO\bXkƻ w?. fK%H-b|RV@H\ȷ:Ç"Ïtp"˶}Ь hb1;U\B(!_U&%ށk[{Snu}[ 9 {HA">a $aazBm~-L&|ܬq' ^AsovR _$[?q:{Ð؝ZoU'W~6~D M:BVy.k8~Ċ 4˟;9C;oY3 Lœu5nIKXNDE:Ie'kЪ99$je+A뻙<2UJ3Iz2E;9K"!_\p<ߔ*juf;Vx2-:v\ iY&f5a1gRL]m^i1L5:&Xk5PQ/"IvJ#pu"Y~3!Su$W7C')P ND,6m ;S9gj-|f>/\6s,9C4a=`V9-&b# ̾,[ZCCڅ<?wdC'5B¸j8U;#qbv;*된a[Q~|QrI+6([. 52?%- W)- ͼnŴO-%ݚA q:ahCyORPIHJm `f|4 <ࢌoʚ27eJ[xڈ +z?q.5vz 80+kL}3}q)SD0kg"?M_ &b lI8uB25)ج^@r{1}OxX$z+uYBAeͱNԌbcKDasQ;[XNjUk'ǎ(&O_ X@*JmE?vY^8̊Ć<;)!Fus=(l)Žl3Ѡ+UEd]VQCϘT/a{}3(%WS d<\$>" 9cAl#`Pcc@ Lvŷ|'s.VG(wK7mRZO蝙bae;.NKF;tl>A39 ~oxJT8pfbDG|0-S2az 3#&9a&%J|30|+EMB_}y!)[2a"u!:z숓X/G ٙd ,r 1@3G VKJk.L7t%3C]H?ZN{FOds!YΓ8QU6>6jF-:N klU/!ǞnecNU)JrL7t%gh޿[N߆`u]a7GX] (o"DF1=Ә񆥋)@d)`;3<[Dx&{j/]~xzE wJtIRS-W)V Gwr9cDlgԾ €NO~S +"F1NUo;GL%r La>pS [ωT&*s$ /8&*0i:xG3E~fuz`PV94Rr3-IA}zҘv_Ӓtcʛ6.ϡa_ZfؿfԀL$M"N` x)V7?x`GaٳeΏV叡vIt`́{"qlԇ5!l2q""Wmp g燎[ryeAS-iP|6!h nboi.zHioE*.R!5q<`A'%[t[&(#vBzkmR^0A;A\V@V#[Eyr9g#@h>FGvukV+p2gm=ݺx$T] $mN5l@J>iRأ"bm|)6 )N'AX*n @{Z"bBF/a(czmú˱o'FO2`hUs$A70+h㊢b[ZЪh|kcid5J@]g},D kþLl(#T&r]p]`R<ڡF=#NPm\vbC11;/|ܐ5(\EDjPlxJ<6:,?d:vћ<$(\Zdݭ|}}(HDe%NajJ(mYvn4z=U\rg' U SyN Ġ29ǮSk}dU:7wȈwz4/6h.(VU'-5gjJƵ.v+SҺ563n9?Ec-=QE[ߓ!5h55U7YƄ"/17aSbI=Ti:Kka ʨ*p4ՋY}ltX#F*̛#ۄ0r Fdens. * @return HTMLPurifier_Token of node appended to previously passed tokens. */ protected function tokenizeDOM($node, &$tokens, $config) { $level = 0; $nodes = array($level => new HTMLPurifier_Queue(array($node))); $closingNodes = array(); do { while (!$nodes[$level]->isEmpty()) { $node = $nodes[$level]->shift(); // FIFO $collect = $level > 0 ? true : false; $needEndingTag = $this->createStartNode($node, $tokens, $collect, $config); if ($needEndingTag) { $closingNodes[$level][] = $node; } if ($node->childNodes && $node->childNodes->length) { $level++; $nodes[$level] = new HTMLPurifier_Queue(); foreach ($node->childNodes as $childNode) { $nodes[$level]->push($childNode); } } } $level--; if ($level && isset($closingNodes[$level])) { while ($node = array_pop($closingNodes[$level])) { $this->createEndNode($node, $tokens); } } } while ($level > 0); } /** * Portably retrieve the tag name of a node; deals with older versions * of libxml like 2.7.6 * @param DOMNode $node */ protected function getTagName($node) { if (isset($node->tagName)) { return $node->tagName; } else if (isset($node->nodeName)) { return $node->nodeName; } else if (isset($node->localName)) { return $node->localName; } return null; } /** * Portably retrieve the data of a node; deals with older versions * of libxml like 2.7.6 * @param DOMNode $node */ protected function getData($node) { if (isset($node->data)) { return $node->data; } else if (isset($node->nodeValue)) { return $node->nodeValue; } else if (isset($node->textContent)) { return $node->textContent; } return null; } /** * @param DOMNode $node DOMNode to be tokenized. * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens. * @param bool $collect Says whether or start and close are collected, set to * false at first recursion because it's the implicit DIV * tag you're dealing with. * @return bool if the token needs an endtoken * @todo data and tagName properties don't seem to exist in DOMNode? */ protected function createStartNode($node, &$tokens, $collect, $config) { // intercept non element nodes. WE MUST catch all of them, // but we're not getting the character reference nodes because // those should have been preprocessed if ($node->nodeType === XML_TEXT_NODE) { $data = $this->getData($node); // Handle variable data property if ($data !== null) { $tokens[] = $this->factory->createText($data); } return false; } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) { // undo libxml's special treatment of