<?php
$COMPILED = true;  // will be changed after compile
$INSTALLPROCESSVERSION = "2.0.0";  // will be changed after compile
define("EMPTY_PROJECT_MODULE_PACKAGE", "6130760b-885f-4738-aeb3-bce0998f93e2");
define("CoreModuleId", "1c1db23f-b5c5-40cd-b2c2-67a90c4ad7c0");
define("AdminModuleId", "76cadd5e-0d7d-11e2-9b84-5254003d369b");
define("WebModuleId", "da628c87-1654-411a-9ba7-d2f9a6e31a59");
define("VisualPHP1UpdateModuleId", "c86c4de6-c395-11e1-91bf-52540037481c");

define("INSTALL_VERSION", "2.0.43");
define("INSTALLER", true);
define("ADMIN", false);

// PHP 8+ - undefined constants cause Fatal errors
// copied from show.php

    // -------------------------------------------------------------------------------------
    // !!!!!!!!!!!!!!!!!!!!!!!! IF CHANGED - see Install.class.php  !!!!!!!!!!!!!!!!!!!!!!!!
    // -------------------------------------------------------------------------------------
    if ($corePath == "")
        $corePath = $mainPath;

    $urlPath = str_replace("\\", "/", dirname($_SERVER["SCRIPT_NAME"]));
    $urlPath .= ($urlPath != "/" ? "/" : "");

    $urlPathArray = explode("/", $urlPath);
    $testUrl = "/";
    $mainUrl = "/";
    $mainUrlFound = true;
    //var_dump($urlPathArray);
    for ($i = 0 ; $i < count($urlPathArray) && $mainUrlFound; $i++)
    {
        if ($urlPathArray[$i] != "" && (!ADMIN || $urlPathArray[$i] != "admin"))
        {
            $testUrl .= $urlPathArray[$i]."/";
        }
    }
    $mainUrl = $testUrl;
    
    if ($_SERVER["REQUEST_URI"] == "") // on some windows machines
    {
        $_SERVER["REQUEST_URI"] = $urlPath;
    }
    
    if ($_SERVER["HTTPS"] != "" && strtolower($_SERVER["HTTPS"]) != "off" || $_SERVER["HTTP_X_FORWARDED_PROTO"] == "https")
    {
        $serverName = $_SERVER["HTTP_HOST"];
        $serverProtocol = "https";
        $serverPort = "";
        $serverUrl = $serverProtocol."://".$serverName;
    }
    else
    {
        $serverName = $_SERVER["HTTP_HOST"];
        $serverProtocol = "http";
        $serverPort = $_SERVER["SERVER_PORT"];
        $serverUrl = $serverProtocol."://".$serverName.($serverPort != 80 && $serverPort != 443 && strpos($serverName, ":") === FALSE ? ":".$serverPort : "");
    }

    if ($coreUrl == "")
        $coreUrl = $mainUrl;
    
    if ($serverCoreUrl == "")
        $serverCoreUrl = $serverUrl;

    $rsRepositoryPath = $mainPath."repository/";
    $rsRepositoryUrl = $mainUrl."repository/";
    $repositoryPath = $mainPath."repository/";
    $repositoryUrl = $mainUrl."repository/";

    $rsImagesPath = $rsRepositoryPath."images/";
    $rsImagesUrl = $rsRepositoryUrl."images/";
    $rsFilesPath = $rsRepositoryPath."files/";
    $rsFilesUrl = $rsRepositoryUrl."files/";
    $releasePath = $rsRepositoryPath."release/";
    $externConfigFile = $mainPath."core/config.extern.".(ADMIN === true ? "admin" : "web").".php";
    //$ftpRsImagesPath = $mainFtpPath."/repository/images/";
    $ftpRsRepositoryPath = $mainFtpPath."/repository/";
    $cssUrl = $mainUrl."styles/";
    $cssPath = $mainPath."styles/";
    $cssFile = "default.css";
    
    // nefunguje - az zjistim, jak to udelat, tak zmenit v udalosti onParseHtml
    $_GLOBALS = &$GLOBALS;
    
    //$sessionPrefix = $serverUrl.$mainUrl;
    //$sessionPrefix = str_replace("http://", "", $sessionPrefix);
    //$sessionPrefix = str_replace("/", "_", $sessionPrefix);
    //$sessionPrefix = str_replace(".", "_", $sessionPrefix);
    
    $serverDomain = $serverUrl;
    $serverDomain = str_replace("https://", "", $serverDomain);
    $serverDomain = str_replace("http://", "", $serverDomain);
    $serverDomain = explode(":", $serverDomain);
    $serverDomain = $serverDomain[0];
    
    $sessionPrefix = $serverDomain;
    $sessionPrefix = str_replace("/", "_", $sessionPrefix);
    $sessionPrefix = str_replace(".", "_", $sessionPrefix);
    
    if ($coreUrlAlias)
    {
        $coreUrl = $coreUrlAlias;
    }
    
    define("COREPATH", $corePath);
    define("MAINPATH", $mainPath);
    define("PROJECTPATH", $mainPath);
    define("TEMPPATH", $mainPath."repository/temp/");
    define("CHMOD_WRITE", 0777);
    
    $__serverDomainA = explode(".", $serverDomain);
    define("DOMAIN", $serverDomain);
    define("DOMAIN1", $__serverDomainA[count($__serverDomainA)-1]);
    define("DOMAIN2", $__serverDomainA[count($__serverDomainA)-2]);
    define("DOMAIN3", $__serverDomainA[count($__serverDomainA)-3]);
    define("DOMAIN12", $__serverDomainA[count($__serverDomainA)-2].".".$__serverDomainA[count($__serverDomainA)-1]);
    define("DOMAIN123", $__serverDomainA[count($__serverDomainA)-3].".".$__serverDomainA[count($__serverDomainA)-2].".".$__serverDomainA[count($__serverDomainA)-1]);
    
    define("MAINURL",  $mainUrl);
    define("SERVERURL",  $serverUrl);
    define("SERVERCOREURL",  $serverCoreUrl);
    define("SERVERDOMAIN",  $serverDomain);
    define("CSSURL",  $cssUrl);
    define("CSSPATH",  $cssPath);
    define("CSSFILE",  $cssFile);
    define("RSIMAGESPATH",  $rsImagesPath);
    define("RSIMAGESURL",  $rsImagesUrl);
    define("RSFILESPATH",  $rsFilesPath);
    define("RSFILESURL",  $rsFilesUrl);
    define("REPOSITORYURL", $rsRepositoryUrl);
    define("REPOSITORYPATH", $rsRepositoryPath);
    define("COREURL", $coreUrl);
    define("RELEASEPATH", $releasePath);
    define("EXTERNCONFIGFILE", $externConfigFile);
    define("SERVERPROTOCOL", $serverProtocol);
    define("PROTOCOL", $serverProtocol);
    define("AJAXFILENAME", "ajax.php");
    //var_dump(PROTOCOL);
    /*define("CACHE_LINKS", getObject("Settings")->cacheLinks != "false");*/
    
    //define("SESSIONPREFIX", $sessionPrefix);
    
    define("PROJECTURL", SERVERURL.MAINURL);
    define("PROJECTPATH", MAINPATH);

    define("UNSETVALUE", "__UNSET_VALUE__");
    define("URL", str_replace(":/", "://", str_replace("//", "/", SERVERURL.substr($_SERVER["REQUEST_URI"], 0, strlen($_SERVER["REQUEST_URI"])))));
    
    define("INTRANET", false); // (strpos(SERVERURL, "://localhost") !== FALSE || strpos(SERVERURL, "://127.0.0.1") !== FALSE || strpos(SERVERURL, "://192.168.") !== FALSE || strpos(SERVERURL, "://10.") !== FALSE));

    //define("VERSION", createObject("Version", _file_get_contents(MAINPATH."config")))
        
                       
    //define(CHMOD_WRITE, ($chmodWritePermissions ? $chmodWritePermissions : 0777));
    //define(CHMOD_PHP, ($chmodPhpPermissions ? $chmodPhpPermissions : 0644));
    //@set_include_path(COREPATH."core/pear/PEAR".PATH_SEPARATOR.@get_include_path());
    
    /*
    $cookieBaseDomain = explode(".", DOMAIN);
    while(count($cookieBaseDomain) > 2)
        array_shift($cookieBaseDomain);
    
    // to enable authentication in 3rd domain and without www
    define("COOKIEDOMAIN", implode(".", $cookieBaseDomain));
    @ini_set("session.cookie_domain", ".".COOKIEDOMAIN);
    //var_dump(implode(".", $cookieBaseDomain));
    //exit;
    */
    $_DOMAIN = explode(".", DOMAIN);
    if (!preg_match("|^[0-9]+\$|", str_replace(".", "", DOMAIN)) && DOMAIN != "localhost") // NOT IP
        define("COOKIEDOMAIN", ".".$_DOMAIN[count($_DOMAIN)-2].".".$_DOMAIN[count($_DOMAIN)-1]);
    else
        define("COOKIEDOMAIN", "");
    ini_set("session.cookie_domain", COOKIEDOMAIN);

    
    //var_dump(CHMOD_PHP);
    include_once(MAINPATH."config/config.ini.php");
    
    define("AJAX", ($fileName == "ajax.php" || $_REQUEST["ajaxViewType"]));
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // !!!!!!!!!!!!!!!!!!!!!!!! IF CHANGED - see Install.class.php  !!!!!!!!!!!!!!!!!!!!!!!!
    // -------------------------------------------------------------------------------------




//var_dump($_REQUEST);
//exit;
// common settings - if changed see also Install.class.php!!!!!!
@error_reporting(E_ALL & ~E_NOTICE);
if (version_compare(PHP_VERSION, '5.4.0') >= 0)
    @ini_set('error_reporting', E_ALL & ~E_WARNING & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED); // 5.4.x calls some notices as warnings
else if (version_compare(PHP_VERSION, '5.3.0') >= 0)
    @ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_DEPRECATED);
else
    @ini_set('error_reporting', E_ALL & ~E_NOTICE);

@ini_set("output_buffering", "on"); // needed for UTF-8
@ini_set('display_errors', "on");
@ini_set("magic_quotes_gpc", "0");

// check PHP version
$_version = explode(".", phpversion());
if ($_version[0] < 5)
{
    echo "ERROR: PHP 5 required";
    exit;
}

if (basename(__FILE__) != "install.php" && basename(__FILE__) != "Install.class.php")
{
    echo "ERROR: bad filename (do not rename the install.php file)";
    exit;
}

/* ------ BINARY MODE UPLOAD TEST CONTENT
 (do not remove or edit this lines) */
$f = fopen(__FILE__, "r");
$content = fread($f, 1024*10);
fclose($f);
if (strpos($content, "\r") === FALSE && basename(__FILE__) == "install.php")
{
    echo "ERROR: Upload the file using BINARY mode";
    exit;
}

if ($_REQUEST["processEmptyUrl"])
{
    echo "OK";
    exit;
}

// BINARY DATA ----------------------------------- (do not remove or edit this lines) //
$binaryOffset =         182361;
$binaryIndex = array();
$binaryIndex["_lib.core/classes/_new/Core/functions.system.php"] = array(0,45416);
$binaryIndex["_lib.core/classes/_new/Core/functions.common.php"] = array(45416,29512);
$binaryIndex["_lib.core/classes/_new/Core/functions.core.php"] = array(74928,120316);
$binaryIndex["_lib.core/classes/_new/Core/functions.parse.php"] = array(195244,105480);
$binaryIndex["/core/classes/_new/Object/Object.class.js"] = array(300724,44384);
$binaryIndex["/core/classes/_new/Object/../DockArea/DockArea.class.css"] = array(345108,492);
$binaryIndex["_lib.core/classes/_new/Object/Object.class.php"] = array(345600,97812);
$binaryIndex["/core/classes/_new/Mouse/Mouse.class.js"] = array(443412,7500);
$binaryIndex["_lib.core/classes/_new/Mouse/Mouse.class.php"] = array(450912,692);
$binaryIndex["/core/classes/_new/Keyboard/Keyboard.class.js"] = array(451604,2988);
$binaryIndex["_lib.core/classes/_new/Keyboard/Keyboard.class.php"] = array(454592,712);
$binaryIndex["/core/classes/_new/JSON/JSON.class.js"] = array(455304,8204);
$binaryIndex["_lib.core/classes/_new/JSON/JSON.class.php"] = array(463508,10504);
$binaryIndex["_lib.core/classes/_new/CURL/CURL.class.php"] = array(474012,96188);
$binaryIndex["_lib.core/classes/_new/System/System.class.php"] = array(570200,21612);
$binaryIndex["_lib.core/classes/_new/String/String.class.php"] = array(591812,57948);
$binaryIndex["_lib.core/classes/_new/Array/Array.class.php"] = array(649760,25500);
$binaryIndex["_lib.core/classes/_new/File/File.class.php"] = array(675260,91016);
$binaryIndex["_lib.core/classes/_new/FTP/FTP.class.php"] = array(766276,11584);
$binaryIndex["_lib.core/classes/_new/Internet/Internet.class.php"] = array(777860,58964);
$binaryIndex["_lib.core/classes/_new/Version/Version.class.php"] = array(836824,3476);
$binaryIndex["_lib.core/classes/_new/DateFunctions/DateFunctions.class.php"] = array(840300,6924);
$binaryIndex["/core/classes/_new/AutoSize/AutoSize.class.js"] = array(847224,105068);
$binaryIndex["/core/classes/_new/AutoSize/AutoSize.css"] = array(952292,568);
$binaryIndex["_lib.core/classes/_new/AutoSize/AutoSize.class.php"] = array(952860,1264);
$binaryIndex["_lib.core/classes/_new/Process/Process.class.php"] = array(954124,43800);
$binaryIndex["/core/classes/_new/Process/ProcessManager.class.js"] = array(997924,4792);
$binaryIndex["_lib.core/classes/_new/Process/ProcessManager.class.php"] = array(1002716,26712);
$binaryIndex["/core/classes/_new/UUID/UUID.js"] = array(1029428,3452);
$binaryIndex["_lib.core/classes/_new/UUID/UUID.class.php"] = array(1032880,2416);
$binaryIndex["/core/classes/_new/Component/Component.class.js"] = array(1035296,27968);
$binaryIndex["/core/classes/_new/Component/Component.class.css"] = array(1063264,88);
$binaryIndex["_lib.core/classes/_new/Component/Component.class.php"] = array(1063352,14940);
$binaryIndex["/core/classes/_new/TextEdit/TextEdit.class.js"] = array(1078292,40384);
$binaryIndex["/core/classes/_new/TextEdit/TextEdit.class.css"] = array(1118676,2136);
$binaryIndex["_lib.core/classes/_new/TextEdit/TextEdit.class.php"] = array(1120812,10328);
$binaryIndex["/core/classes/_new/ButtonEdit/ButtonEdit.class.js"] = array(1131140,40592);
$binaryIndex["/core/classes/_new/ButtonEdit/ButtonEdit.class.css"] = array(1171732,2744);
$binaryIndex["_lib.core/classes/_new/ButtonEdit/ButtonEdit.class.php"] = array(1174476,4300);
$binaryIndex["/core/classes/_new/ComboBox/ComboBox.class.js"] = array(1178776,66276);
$binaryIndex["/core/classes/_new/ComboBox/ComboBox.class.css"] = array(1245052,3144);
$binaryIndex["_lib.core/classes/_new/ComboBox/ComboBox.class.php"] = array(1248196,23556);
$binaryIndex["/core/classes/_new/CheckBox/CheckBox.class.js"] = array(1271752,20108);
$binaryIndex["/core/classes/_new/CheckBox/CheckBox.class.css"] = array(1291860,2040);
$binaryIndex["_lib.core/classes/_new/CheckBox/CheckBox.class.php"] = array(1293900,10352);
$binaryIndex["/core/classes/_new/ToolTip/ToolTip.class.js"] = array(1304252,19216);
$binaryIndex["/core/classes/_new/ToolTip/ToolTip.class.css"] = array(1323468,564);
$binaryIndex["_lib.core/classes/_new/ToolTip/ToolTip.class.php"] = array(1324032,2168);
$binaryIndex["/core/classes/_new/ObjectComboBox/ObjectComboBox.class.js"] = array(1326200,568);
$binaryIndex["/core/classes/_new/ObjectComboBox/admin.css"] = array(1326768,36);
$binaryIndex["_lib.core/classes/_new/ObjectComboBox/ObjectComboBox.class.php"] = array(1326804,5876);
$binaryIndex["_lib.core/classes/_new/DbLink/DbLink.class.php"] = array(1332680,79256);
$binaryIndex["_lib.core/classes/_new/DbLink/FileDbLink.class.php"] = array(1411936,6612);
$binaryIndex["_lib.core/classes/_new/DbLink/SQLDbLink.class.php"] = array(1418548,91552);
$binaryIndex["_lib.core/classes/_new/DbLink/MySQLDbLink.class.php"] = array(1510100,38380);
$binaryIndex["_lib.core/classes/_new/DbLink/SQLiteDbLink.class.php"] = array(1548480,15036);
$binaryIndex["/core/classes/_new/Progress/Progress.class.js"] = array(1563516,6672);
$binaryIndex["/core/classes/_new/Progress/Progress.class.css"] = array(1570188,532);
$binaryIndex["_lib.core/classes/_new/Progress/Progress.class.php"] = array(1570720,3468);
$binaryIndex["_lib.core/classes/_new/DownloadProcess/DownloadProcess.class.php"] = array(1574188,15252);
$binaryIndex["_lib.core/classes/_new/InstallProcess/InstallProcess.class.php"] = array(1589440,189216);
$binaryIndex["/core/classes/_new/CSS3Converter/linear-gradient.php"] = array(1778656,1896);
$binaryIndex["_lib.core/classes/_new/CSS3Converter/CSS3Converter.class.php"] = array(1780552,27896);
$binaryIndex["_lib.core/classes/_new/Image/Image.class.php"] = array(1808448,57160);
$binaryIndex["_lib.core/classes/_new/Image/ImageLayer.class.php"] = array(1865608,17460);
$binaryIndex["_lib.core/classes/_new/Image/ImageEffect.class.php"] = array(1883068,1376);
$binaryIndex["_lib.core/classes/_new/Image/effects/ImageResize.class.php"] = array(1884444,18764);
$binaryIndex["/core/classes/_new/LoadingAnimation/LoadingAnimation.class.js"] = array(1903208,6300);
$binaryIndex["/core/classes/_new/LoadingAnimation/LoadingAnimation.class.css"] = array(1909508,908);
$binaryIndex["_lib.core/classes/_new/LoadingAnimation/LoadingAnimation.class.php"] = array(1910416,984);
$binaryIndex["/core/classes/_new/Tree/Tree.class.js"] = array(1911400,20816);
$binaryIndex["/core/classes/_new/Tree/TreeItem.class.js"] = array(1932216,39620);
$binaryIndex["/core/classes/_new/Tree/Tree.class.css"] = array(1971836,3184);
$binaryIndex["_lib.core/classes/_new/Tree/Tree.class.php"] = array(1975020,25736);
$binaryIndex["_lib.core/classes/_new/Tree/TreeItem.class.php"] = array(2000756,11096);
$binaryIndex["/core/classes/_new/DirectoryTree/DirectoryTree.class.js"] = array(2011852,5288);
$binaryIndex["_lib.core/classes/_new/DirectoryTree/DirectoryTree.class.php"] = array(2017140,15036);
$binaryIndex["core/classes/_new/Install/EULA.en.html"] = array(2032176,4008);
$binaryIndex["core/classes/_new/Install/EULA.cs.html"] = array(2036184,3972);
$binaryIndex["core/classes/_new/Install/EULA.sk.html"] = array(2040156,3984);
$binaryIndex["core/classes/_new/Core/functions.common.js"] = array(2044140,55320);
$binaryIndex["core/classes/_new/Core/functions.system.js"] = array(2099460,48672);
$binaryIndex["core/classes/_new/Core/functions.core.js"] = array(2148132,334032);
$binaryIndex["core/classes/_new/AJAX/AJAX.class.js"] = array(2482164,43824);
$binaryIndex["core/classes/_new/Browser/Browser.class.js"] = array(2525988,8824);
$binaryIndex["core/classes/_new/Install/Install.class.css"] = array(2534812,17216);
$binaryIndex["core/classes/_new/Install/visualphp.png"] = array(2552028,12712);
$binaryIndex["core/classes/_new/Install/directory.png"] = array(2564740,4972);
$binaryIndex["core/classes/_new/Install/install.png"] = array(2569712,5684);
$binaryIndex["core/classes/_new/Install/php.png"] = array(2575396,5272);
$binaryIndex["core/classes/_new/Install/jpg.png"] = array(2580668,5580);
$binaryIndex["core/classes/_new/Install/png.png"] = array(2586248,5628);
$binaryIndex["core/classes/_new/Install/gif.png"] = array(2591876,5488);
$binaryIndex["core/classes/_new/Install/file.png"] = array(2597364,4448);
$binaryIndex["core/classes/_new/Install/empty-project.png"] = array(2601812,12032);
$binaryIndex["core/classes/_new/Install/move-project.png"] = array(2613844,13916);
$binaryIndex["/core/classes/_new/CrossBrowser/box-sizing.htc"] = array(2627760,16688);
$binaryIndex["img/expand.png"] = array(2644448,3676);
$binaryIndex["img/loading.gif"] = array(2648124,7212);
$binaryIndex["img/plus.png"] = array(2655336,3688);
$binaryIndex["img/minus.png"] = array(2659024,3680);
$binaryIndex["core/classes/_new/Install/visualphp2-logo-circle.png"] = array(2662704,64416);
$binaryIndex["core/classes/_new/Install/visualphp-nologo.png"] = array(2727120,18024);
$binaryIndex["core/classes/_new/Install/left.png"] = array(2745144,58556);
$binaryIndex["core/classes/_new/Install/ok.png"] = array(2803700,5636);
$binaryIndex["core/classes/_new/Install/error.png"] = array(2809336,5740);
$binaryIndex["core/classes/_new/Install/progress.gif"] = array(2815076,12184);


global $STYLE;
$STYLE = array(
    "textColor" => "#2E2E2E",
    "borderColor" => "#C5C5C5",
    "barBgColorFrom" => "#EFEFEF",
    "barBgColorTo" => "#E3E3E3",
    
    "hoverBorderColor" => "#A99F9A",
    "hoverTextColor" => "#FFFFFF",
    "hoverBgColorFrom" => "#CEC8C6",
    "hoverBgColorTo" => "#AFA6A1",
    
    "activeBorderColor" => "#F0713A",
    "activeTextColor" => "#FFFFFF",
    "activeBgColorFrom" => "#F59F79",
    "activeBgColorTo" => "#EE6225",

    "buttonTextColor" => "#FFFFFF",
    "buttonBorderColor" => "#FFFFFF",
    "buttonBgColorFrom" => "#5C9DFF",
    "buttonBgColorTo" => "#304CFF",

    "buttonHoverTextColor" => "#FFFFFF",
    "buttonHoverBorderColor" => "#FFFFFF",
    "buttonHoverBgColorFrom" => "#7CBDFF",
    "buttonHoverBgColorTo" => "#506CFF",
);

$LANGUAGES = array("cs","hu","en","sk","de","it","ru","uk","zh","fr","pl","sv","no","da","fi","es","pt");
$LANGUAGEPACKS = array("cs" => "6a78cc88-b582-49cf-bd04-183fc41b901f","hu" => "edeea3ff-442c-4981-a144-00d5b0b9510f","en" => "9d5df45c-9c32-497b-88f2-ed92c6ec96d3","sk" => "675fd7a0-c116-44ed-ac2c-c5f87c20e422","de" => "5e515822-c6d8-4e52-8fd3-77962180acfd","it" => "e02b6dda-2f56-48df-a241-a4f17051fcac","ru" => "cc770a0f-5fd7-4c8a-988f-41a3eda25322","uk" => "f6849b20-1eca-4116-8c74-156d689e41ed","zh" => "a5f1326b-5be1-4dc6-9137-a3d77e9f65a7","fr" => "502269c6-0886-4523-9bae-7cf6b7f06e48","pl" => "ed7d919a-6d5b-4b78-a6d1-400e58d0abe4","sv" => "d4af5394-838b-4b94-952c-f91666178d0c","no" => "62b42798-dd57-4e0c-98c8-b9ae8145d2a3","da" => "3022994e-22df-4a92-8e0c-8c00ceac9f94","fi" => "4c6a03ce-de9c-49ee-9b52-96c604ece271","es" => "ab4fff32-867b-4cf7-9087-26859bb489a3","pt" => "dd52b6f1-64c5-4638-885e-dc96c8ff0b4c");
$TRANSLATIONS = array(
"I have read the EULA, agree and want to continue" => array(
"cs" => "Přečetl jsem si licenční smlouvu EULA, souhlasím a chci pokračovat",
"sk" => "Prečítal som si licenčnú zmluvu EULA, súhlasím a chcem pokračovať",
"de" => "Ich habe die EULA zu lesen, zustimmen und wollen weiter",
"it" => "Ho letto l' EULA, concordare e vuole continuare",
"ru" => "Я прочитал лицензионное соглашение, согласны и хотите продолжить",
"zh" => "我已阅读最终用户许可协议，同意并希望继续",
"pl" => "Czytałem EULA, zgadzam się i chcę kontynuować",
"fr" => "Je ai lu le CLUF, d&#39;accord et de vouloir continuer",
"sv" => "Jag har läst EULA, enas om och vill fortsätta",
"es" => "He leído el EULA, de acuerdo y desea continuar",
"uk" => "Я прочитав ліцензійну угоду, згодні і хочете продовжити",
"pt" => "Eu li o EULA, concorda e quer continuar",
"no" => "Jeg har lest EULA, er enig og ønsker å fortsette"),
"Please select, what you want to do" => array(
"cs" => "Vyberte prosím, jakou akci si přejete provést",
"sk" => "Vyberte prosím, akú akciu si prajete vykonať",
"de" => "Bitte wählen Sie, was Sie tun möchten,",
"it" => "Si prega di selezionare, che cosa volete fare",
"ru" => "Пожалуйста, выберите, что вы хотите сделать",
"zh" => "请选择，你想要做什么",
"pl" => "Proszę wybrać, co chcesz zrobić",
"fr" => "S&#39;il vous plaît sélectionnez, ce que vous voulez faire",
"sv" => "Välj vad du vill göra",
"es" => "Por favor seleccione, lo que quieres hacer",
"uk" => "Будь ласка, виберіть, що ви хочете зробити",
"pt" => "Por favor, selecione o que você quer fazer",
"no" => "Vennligst velg hva du vil gjøre"),
"Create new empty project" => array(
"cs" => "Vytvořit nový prázdný projekt",
"sk" => "Vytvoriť nový prázdny projekt",
"de" => "Neues leeres Projekt",
"it" => "Creare un nuovo progetto vuoto",
"ru" => "Создать новый пустой проект",
"zh" => "创建新的空项目",
"pl" => "Utwórz nowy pusty projekt",
"fr" => "Créer un nouveau projet vide",
"sv" => "Skapa nytt tomt projekt",
"es" => "Crear nuevo proyecto vacío",
"uk" => "Створити новий порожній проект",
"pt" => "Criar novo projeto vazio",
"no" => "Opprett nytt tomt prosjekt"),
"Update project to version 2" => array(
"cs" => "Aktualizovat projekt na verzi 2",
"sk" => "Aktualizovať projekt na verziu 2",
"de" => "Projekt -Update auf Version 2",
"it" => "Aggiornamento del progetto alla versione 2",
"ru" => "Обновление проекта до версии 2",
"zh" => "更新项目第2版",
"pl" => "Aktualizacja projektu do wersji 2",
"fr" => "Mise à jour de projet à la version 2",
"sv" => "Uppdatera projekt till version 2",
"es" => "Actualización del proyecto a la versión 2",
"uk" => "Оновлення проекту до версії 2",
"pt" => "Projeto de atualização para a versão 2",
"no" => "Oppdater prosjektet til versjon 2"),
"Install core files, database and scripts to allow update to version 2" => array(
"cs" => "Nainstaluje soubory jádra, databázi a skripty pro aktualizaci na verzi 2",
"sk" => "Nainštaluje súbory jadra, databázu a skripty pre aktualizáciu na verziu 2",
"de" => "Installieren Core-Dateien, Datenbanken und Skripte, um Update auf Version 2 zu ermöglichen",
"it" => "Installare file core, database e script per consentire l' aggiornamento alla versione 2",
"ru" => "Установите основные файлы, базы данных и сценариев, чтобы позволить обновления до версии 2",
"zh" => "安装核心文件，数据库和脚本，以便更新到版本2",
"pl" => "Zainstaluj podstawowe pliki, bazy danych i skryptów, aby umożliwić aktualizację do wersji 2",
"fr" => "Installez les fichiers de base, base de données et les scripts pour permettre la mise à jour vers la version 2",
"sv" => "Installera core-filer, databas och skript för att möjliggöra uppdatering till version 2",
"es" => "Instalar archivos del núcleo, base de datos y scripts para permitir la actualización a la versión 2",
"uk" => "Встановіть основні файли, бази даних і сценаріїв, щоб дозволити оновлення до версії 2",
"pt" => "Instalar arquivos principais, banco de dados e scripts para permitir a atualização para a versão 2",
"no" => "Installer kjernefiler, database og skript for å tillate oppdatering til versjon 2"),
"Install core files, database and empty project" => array(
"cs" => "Nainstaluje soubory jádra, databázi a vytvoří prázdný projekt",
"sk" => "Nainštaluje súbory jadra, databáze a vytvorí prázdny projekt",
"de" => "Installieren Core-Dateien, Datenbank-und leeres Projekt",
"it" => "Installare file core, database e progetto vuoto",
"ru" => "Установите основные файлы, базы данных и пустой проект",
"zh" => "安装核心文件，数据库和空项目",
"pl" => "Zainstaluj podstawowe pliki, bazy danych i pusty projekt",
"fr" => "Installez les fichiers de base, base de données et projet vide",
"sv" => "Installera core-filer, databas och tomt projekt",
"es" => "Instalar archivos del núcleo, base de datos y proyecto vacío",
"uk" => "Встановіть основні файли, бази даних та порожній проект",
"pt" => "Instalar arquivos principais, banco de dados e projeto vazio",
"no" => "Installer kjernefiler, database og tomt prosjekt"),
"Move project to this server" => array(
"cs" => "Přesunout projekt na tento server",
"sk" => "Presunúť projekt na tento server",
"de" => "Bewegen Projekt zu diesem Server",
"it" => "Spostare progetto a questo server",
"ru" => "Переместить проект к этому серверу",
"zh" => "移动项目到这台服务器",
"pl" => "Przenieść projekt na tym serwerze",
"fr" => "Déplacez projet à ce serveur",
"sv" => "Flytta projekt till servern",
"es" => "Mueva proyecto para este servidor",
"uk" => "Перемістити проект до цього сервера",
"pt" => "Mova projeto para este servidor",
"no" => "Flytt prosjektet til denne serveren"),
"Install project from install file compiled from other domain or your PC" => array(
"cs" => "Nainstaluje projekt z instalačního souboru, který byl zkompilován z jiné domény nebo z Vašeho PC",
"sk" => "Nainštaluje projekt z inštalačného súboru, ktorý bol skompilovaný z inej domény alebo z Vášho PC",
"de" => "Installieren Projekt von Installationsdatei von anderen Domänen kompiliert oder Ihren PC",
"it" => "Installare progetto di installare file compilato da altro dominio o il vostro PC",
"ru" => "Установите проект от установки файла, составленной на основе другого домена или компьютера",
"zh" => "从其他域编译或安装文件你的电脑安装项目",
"pl" => "Zainstaluj projekt od zainstalowania pliku skompilowanego z innej domeny lub komputera",
"fr" => "Installez projet de fichier d&#39;installation compilé à partir de l&#39;autre domaine ou votre PC",
"sv" => "Installera projekt från installationsfilen sammanställts från andra domän eller datorn",
"es" => "Instale proyecto de instalar el archivo compilado de otro dominio o su PC",
"uk" => "Встановіть проект від установки файлу, складеної на основі іншого домену або комп&#39;ютера",
"pt" => "Instale projeto do arquivo de instalação compilado a partir de outro domínio ou do seu PC",
"no" => "Installer prosjekt fra installasjonsfil kompilert fra et annet domene eller din PC"),
"Please select, which method use to install files on server" => array(
"cs" => "Vyberte prosím, jakou metodu použít pro instalaci souborů na tento server",
"sk" => "Vyberte prosím, akú metódu použiť pre inštaláciu súborov na tento server",
"de" => "Bitte wählen Sie, welche Methode verwenden, um Dateien auf dem Server installieren",
"it" => "Si prega di selezionare, che utilizzano il metodo per installare i file sul server di",
"ru" => "Пожалуйста, выберите, какой метод использовать для установки файлов на сервере",
"zh" => "请选择，哪一种方法来使用服务器上的安装文件",
"pl" => "Proszę wybrać, która metoda używana do instalowania plików na serwerze",
"fr" => "S&#39;il vous plaît sélectionner, quelle méthode utiliser pour installer les fichiers sur le serveur",
"sv" => "Välj, vilken metod använder för att installera filerna på servern",
"es" => "Por favor, seleccione, método que utiliza para instalar los archivos en el servidor",
"uk" => "Будь ласка, виберіть, який метод використовувати для установки файлів на сервері",
"pt" => "Por favor seleccione, que use o método para instalar os arquivos no servidor",
"no" => "Vennligst velg hvilken metode du bruker for å installere filer på serveren"),
"FTP (recommended)" => array(
"cs" => "FTP (doporučeno)",
"sk" => "FTP (doporučené)",
"de" => "FTP (empfohlen)",
"it" => "FTP (consigliato)",
"ru" => "FTP (рекомендуется)",
"zh" => "Ftp （推荐）",
"pl" => "FTP (zalecane)",
"fr" => "FTP (recommandé)",
"sv" => "FTP (rekommenderas)",
"es" => "FTP (recomendado)",
"uk" => "FTP (рекомендовано)",
"pt" => "FTP (recomendado)",
"no" => "FTP (anbefalt)"),
"Direct copy" => array(
"cs" => "Přímá kopie",
"sk" => "Priama kópie",
"de" => "Direktes Kopieren",
"it" => "Copia diretta",
"ru" => "Прямая копия",
"zh" => "直接拷贝",
"pl" => "Kopią",
"fr" => "Copie directe",
"sv" => "Direkt kopia",
"es" => "Copia directa",
"uk" => "Пряма копія",
"pt" => "Cópia direta",
"no" => "Direkte kopi"),
"Select" => array(
"cs" => "Vyberte",
"sk" => "Vyberte",
"de" => "Wählen",
"it" => "Selezionare",
"ru" => "Выбирать",
"zh" => "选择",
"pl" => "Wybierz",
"fr" => "Sélectionner",
"sv" => "Välj",
"es" => "Seleccionar",
"uk" => "Вибирати",
"pt" => "Selecionar",
"no" => "Plukke ut"),
"Test passed" => array(
"cs" => "Test proveden úspěšně",
"sk" => "Test vykonaný úspešne",
"de" => "Test bestanden",
"it" => "Prova superata",
"ru" => "Тест прошел",
"zh" => "测试通过",
"pl" => "Test przeszedł",
"fr" => "Test réussi",
"sv" => "Test passerade",
"es" => "Prueba aprobada",
"uk" => "Тест пройшов",
"pt" => "Teste passado",
"no" => "Test bestått"),
"Continue" => array(
"cs" => "Pokračovat",
"sk" => "Pokračovať",
"de" => "Fortsetzen",
"it" => "Continuare",
"ru" => "Продолжать",
"zh" => "继续",
"pl" => "Kontynuować",
"fr" => "Continuer",
"sv" => "Fortsätt",
"es" => "Continuar",
"uk" => "Продовжувати",
"pt" => "Continuar",
"no" => "Fortsette"),
"Host" => array(
"cs" => "Server",
"sk" => "Server",
"de" => "Gastgeber",
"it" => "Ospite",
"ru" => "Хозяин",
"zh" => "主持人",
"pl" => "Host",
"fr" => "Foule",
"sv" => "Värd",
"es" => "Anfitrión",
"uk" => "Господар",
"pt" => "Anfitrião",
"no" => "Vert"),
"Login" => array(
"cs" => "Přihlašovací jméno",
"sk" => "Prihlasovacie meno",
"de" => "Anmelden",
"it" => "Entra",
"ru" => "Войти",
"zh" => "注册",
"pl" => "Zaloguj się",
"fr" => "S&#39;identifier",
"sv" => "Logga in",
"es" => "Iniciar sesión",
"uk" => "Увійти",
"pt" => "Entrar",
"no" => "Logg Inn"),
"Password" => array(
"cs" => "Heslo",
"sk" => "Heslo",
"de" => "Passwort",
"it" => "Password",
"ru" => "Пароль",
"zh" => "密码",
"pl" => "Hasło",
"fr" => "Mot de passe",
"sv" => "Lösenord",
"es" => "Clave",
"uk" => "Пароль",
"pt" => "Senha",
"no" => "Passord"),
"Re-type Password" => array(
"cs" => "Heslo znovu",
"sk" => "Heslo znova",
"de" => "Passwort erneut eingeben",
"it" => "Re -type password",
"ru" => "Повторите пароль",
"zh" => "再输入一次密码",
"pl" => "Wpisz ponownie hasło",
"fr" => "Retaper le mot de passe",
"sv" => "Re-typ Lösenord",
"es" => "Vuelva a escribir la contraseña",
"uk" => "Повторіть пароль",
"pt" => "Redigite a senha",
"no" => "Skriv inn passordet på nytt"),
"Path" => array(
"cs" => "Cesta",
"sk" => "Cesta",
"de" => "Weg",
"it" => "Sentiero",
"ru" => "Путь",
"zh" => "路径",
"pl" => "Ścieżka",
"fr" => "Chemin",
"sv" => "Väg",
"es" => "Camino",
"uk" => "Шлях",
"pt" => "Caminho",
"no" => "Sti"),
"Domain name, server name or IP address" => array(
"cs" => "Doména, název serveru nebo IP adresa",
"sk" => "Doména, názov servera alebo IP adresa",
"de" => "Domain-Name, Servername oder IP-Adresse",
"it" => "Nome di dominio, il nome del server o l'indirizzo IP",
"ru" => "Доменное имя, имя сервера или IP- адрес",
"zh" => "域名，服务器名称或ip地址",
"pl" => "Nazwa domeny, nazwa serwera lub adres IP",
"fr" => "Nom de domaine, le nom du serveur ou adresse IP",
"sv" => "Domännamn, servernamn eller IP-adress",
"es" => "Nombre de dominio, nombre de servidor o dirección IP",
"uk" => "Доменне ім&#39;я, ім&#39;я сервера або IP- адреса",
"pt" => "Nome, nome do servidor de domínio ou endereço IP",
"no" => "Domenenavn, servernavn eller IP-adresse"),
"Username for FTP account" => array(
"cs" => "Přihlašovací jméno k FTP účtu",
"sk" => "Prihlasovacie meno k FTP účtu",
"de" => "Login für FTP-Account",
"it" => "Nome utente per l' account FTP",
"ru" => "Имя пользователя за счет FTP",
"zh" => "用户名ftp帐户",
"pl" => "Login do konta FTP",
"fr" => "Nom d&#39;utilisateur pour le compte FTP",
"sv" => "Användarnamn för FTP-konto",
"es" => "Nombre de usuario para la cuenta FTP",
"uk" => "Ім&#39;я користувача за рахунок FTP",
"pt" => "Nome de utilizador para a conta FTP",
"no" => "Brukernavn for FTP-konto"),
"Password for FTP account" => array(
"cs" => "Heslo k FTP účtu",
"sk" => "Heslo k FTP účtu",
"de" => "Passwort für den FTP- Account",
"it" => "Password per l' account FTP",
"ru" => "Пароль для учетной записи FTP",
"zh" => "密码为ftp帐户",
"pl" => "Hasło do konta FTP",
"fr" => "Mot de passe pour le compte FTP",
"sv" => "Lösenord för FTP-konto",
"es" => "Contraseña para la cuenta FTP",
"uk" => "Пароль для облікового запису FTP",
"pt" => "Senha para a conta FTP",
"no" => "Passord for FTP-konto"),
"Not all FTP accounts start in root of website. If website is located in subdirectory, specify directory path to install.php" => array(
"cs" => "Ne všechny FTP účty začínají v kořenovém adresáři stránek. Pokud jsou stránky až v některém z podadresářů, vložte cestu k adresáři, který obsahuje soubor install.php",
"sk" => "Nie všetky FTP účty začínajú v koreňovom adresári stránok. Ak sú stránky až v niektorom z podadresárov, vložte cestu k adresáru, ktorý obsahuje súbor install.php",
"de" => "Nicht alle FTP-Accounts starten in Wurzel der Website. Wenn Website ist im Unterverzeichnis befindet, geben Sie Verzeichnispfad zu install.php",
"it" => "Non tutti gli account FTP iniziano in radice del sito. Se il sito si trova nella sottodirectory, specificare il percorso di directory per install.php",
"ru" => "Не все FTP счетов начинаются в корне сайта. Если сайт находится в подкаталоге, указать путь к каталогу install.php",
"zh" => "并非所有的ftp帐户开始在网站的根目录下。 如果网站位于子目录，指定目录路径中install.php",
"pl" => "Nie wszystkie kont FTP rozpocznie się w katalogu głównym witryny. Jeśli strona znajduje się w katalogu, określ ścieżkę do katalogu, install.php",
"fr" => "Pas tous les comptes FTP commencent à la racine du site. Si le site est situé dans sous-répertoire, spécifier le chemin de répertoire pour install.php",
"sv" => "Inte alla FTP-konton börjar i roten på webbplatsen. Om webbplatsen ligger i katalog, ange sökvägen till install.php",
"es" => "No todas las cuentas FTP comienzan en la raíz del sitio web. Si el sitio web se encuentra en el subdirectorio, especifique la ruta del directorio de install.php",
"uk" => "Не всі FTP рахунків починаються в корені сайту. Якщо сайт знаходиться в підкаталозі, вказати шлях до каталогу install.php",
"pt" => "Nem todas as contas FTP começar na raiz do site. Se o site está localizado no subdiretório, especificar caminho do diretório para install.php",
"no" => "Ikke alle FTP-kontoer starter i roten til nettstedet.Hvis nettstedet er plassert i underkatalogen, spesifiser katalogbanen til install.php"),
"Please select, which database you want to use" => array(
"cs" => "Vyberte prosím, jakou databázi chcete použít",
"sk" => "Vyberte prosím, akú databázu chcete použiť",
"de" => "Bitte wählen Sie, welche Datenbank Sie verwenden möchten",
"it" => "Si prega di selezionare, quale database si desidera utilizzare",
"ru" => "Пожалуйста, выберите, какую базу данных вы хотите использовать",
"zh" => "请选择你要使用的数据库",
"pl" => "Proszę wybrać, która baza danych chcesz użyć",
"fr" => "S&#39;il vous plaît sélectionnez, qui base de données que vous souhaitez utiliser",
"sv" => "Välj, vilken databas du vill använda",
"es" => "Por favor selecciona, que la base de datos que desea utilizar",
"uk" => "Будь ласка, виберіть, яку базу даних ви хочете використовувати",
"pt" => "Por favor seleccione, qual banco de dados que deseja usar",
"no" => "Vennligst velg hvilken database du vil bruke"),
"Bad FTP path" => array(
"cs" => "Špatná FTP cesta",
"sk" => "Zlá FTP cesta",
"de" => "Bad FTP-Pfad",
"it" => "Percorso Bad FTP",
"ru" => "Плохой FTP путь",
"zh" => "坏的ftp路径",
"pl" => "Bad ścieżka FTP",
"fr" => "Chemin d&#39;accès FTP Bad",
"sv" => "Dålig FTP-sökväg",
"es" => "Ruta FTP Mala",
"uk" => "Поганий FTP шлях",
"pt" => "Mau caminho FTP",
"no" => "Dårlig FTP-bane"),
"Database" => array(
"cs" => "Databáze",
"sk" => "Databáza",
"de" => "Datenbank",
"it" => "Database",
"ru" => "База данных",
"zh" => "数据库",
"pl" => "Baza danych",
"fr" => "Base de données",
"sv" => "Databas",
"es" => "Base de datos",
"uk" => "База даних",
"pt" => "Banco de dados",
"no" => "Database"),
"Username for database access" => array(
"cs" => "Přihlašovací jméno k databázi",
"sk" => "Prihlasovacie meno k databáze",
"de" => "Login für Datenbankzugriff",
"it" => "Nome utente per l' accesso al database",
"ru" => "Имя пользователя для доступа к базе данных",
"zh" => "用户名访问数据库",
"pl" => "Login dla dostępu do bazy danych",
"fr" => "Nom d&#39;utilisateur pour l&#39;accès de base de données",
"sv" => "Användarnamn för databasåtkomst",
"es" => "Nombre de usuario para el acceso a la base de datos",
"uk" => "Ім&#39;я користувача для доступу до бази даних",
"pt" => "Nome de usuário para acesso de banco de dados",
"no" => "Brukernavn for databasetilgang"),
"Password for database access" => array(
"cs" => "Heslo k databázi",
"sk" => "Heslo k databáze",
"de" => "Kennwort für den Datenbankzugriff",
"it" => "Password per l' accesso al database",
"ru" => "Пароль для доступа к базе данных",
"zh" => "密码数据库访问",
"pl" => "Hasło dostępu do bazy danych",
"fr" => "Mot de passe pour l&#39;accès de base de données",
"sv" => "Lösenord för databasåtkomst",
"es" => "Contraseña de acceso de base de datos",
"uk" => "Пароль для доступу до бази даних",
"pt" => "Senha para acesso de banco de dados",
"no" => "Passord for databasetilgang"),
"Database name, your account has access to" => array(
"cs" => "Název databáze, ke které má Váš účet přístup",
"sk" => "Názov databázy, ku ktorej má Váš účet prístup",
"de" => "Datenbankname, hat Zugriff auf Ihr Konto",
"it" => "Nome database, l'account ha accesso a",
"ru" => "Имя базы данных, ваша учетная запись имеет доступ к",
"zh" => "数据库名，您的帐户可以访问",
"pl" => "Nazwa bazy danych, konto ma dostęp do",
"fr" => "Nom de base de données, votre compte a accès à",
"sv" => "Databasnamn, har tillgång till ditt konto",
"es" => "Nombre de la base, su cuenta tiene acceso a",
"uk" => "Ім&#39;я бази даних, ваш обліковий запис має доступ до",
"pt" => "Nome do banco, a conta tem acesso a",
"no" => "Databasenavn, kontoen din har tilgang til"),
"Path to database file or directory" => array(
"cs" => "Cesta k databázovému souboru nebo adresáři",
"sk" => "Cesta k databázovému súboru alebo adresáru",
"de" => "Pfad zur Datenbank-Datei oder das Verzeichnis",
"it" => "Percorso del file di database o directory",
"ru" => "Путь к файлу базы данных или каталога",
"zh" => "路径，数据库文件或目录",
"pl" => "Ścieżka do pliku bazy danych lub katalogu",
"fr" => "Chemin du fichier ou du répertoire base de données",
"sv" => "Sökvägen till databasfilen eller katalog",
"es" => "Ruta al archivo de base de datos o directorio",
"uk" => "Шлях до файлу бази даних або каталогу",
"pt" => "Caminho para o arquivo ou diretório de banco de dados",
"no" => "Sti til databasefil eller katalog"),
"Download finished" => array(
"cs" => "Stahování dokončeno",
"sk" => "Sťahovanie dokončené",
"de" => "Fertig herunterladen",
"it" => "Scarica finito",
"ru" => "Скачать отделкой",
"zh" => "下载完成",
"pl" => "Pobierz gotowy",
"fr" => "Télécharger fini",
"sv" => "Hämta färdiga",
"es" => "Descarga acabada",
"uk" => "Завантажити обробкою",
"pt" => "Baixar acabado",
"no" => "Nedlasting fullført"),
"Install finished" => array(
"cs" => "Instalace dokončena",
"sk" => "Inštalácia dokončená",
"de" => "Installieren Sie fertigen",
"it" => "Installare finito",
"ru" => "Установите отделкой",
"zh" => "安装完成",
"pl" => "Zainstaluj wykończone",
"fr" => "Installez fini",
"sv" => "Installera färdiga",
"es" => "Instale acabada",
"uk" => "Встановіть обробкою",
"pt" => "Instale acabado",
"no" => "Installasjonen er fullført"),
"Username for your developer account" => array(
"cs" => "Přihlašovací jméno pro Váš vývojářský účet",
"sk" => "Prihlasovacie meno pre Váš vývojársky účet",
"de" => "Login für Ihr Entwicklerkonto",
"it" => "Nome utente per il tuo account sviluppatore",
"ru" => "Имя пользователя для вашего аккаунта разработчика",
"zh" => "用户名您的开发者账户",
"pl" => "Użytkownik na koncie dewelopera",
"fr" => "Nom d&#39;utilisateur pour votre compte développeur",
"sv" => "Användarnamn för ditt utvecklarkonto",
"es" => "Nombre de usuario para su cuenta de desarrollador",
"uk" => "Ім&#39;я користувача для вашого аккаунта розробника",
"pt" => "Nome de utilizador para a sua conta de desenvolvedor",
"no" => "Brukernavn for utviklerkontoen din"),
"Password for your developer account" => array(
"cs" => "Heslo pro Váš vývojářský účet",
"sk" => "Heslo pre Váš vývojársky účet",
"de" => "Passwort für Ihr Entwicklerkonto",
"it" => "Password per l'account developer",
"ru" => "Пароль для вашей учетной записи разработчика",
"zh" => "密码为您的开发者账户",
"pl" => "Hasło do Twojego konta dewelopera",
"fr" => "Mot de passe pour votre compte développeur",
"sv" => "Lösenord för ditt utvecklarkonto",
"es" => "Contraseña para su cuenta de desarrollador",
"uk" => "Пароль для вашого облікового запису розробника",
"pt" => "Senha para a sua conta de desenvolvedor",
"no" => "Passord for utviklerkontoen din"),
"Password check for your developer account" => array(
"cs" => "Kontrola hesla pro Váš vývojářský účet",
"sk" => "Kontrola hesla pre Váš vývojársky účet",
"de" => "Passwort -Check für Ihr Entwicklerkonto",
"it" => "Controllo della password per l'account developer",
"ru" => "Проверка пароля для учетной записи разработчика",
"zh" => "密码检查为您的开发者账户",
"pl" => "Sprawdzić hasło do swojego konta dewelopera",
"fr" => "Vérification de mot de passe pour votre compte de développeur",
"sv" => "Lösenord check för ditt utvecklarkonto",
"es" => "Cheque contraseña para su cuenta de desarrollador",
"uk" => "Перевірка пароля для облікового запису розробника",
"pt" => "Verificação de senha para a sua conta de desenvolvedor",
"no" => "Passordsjekk for utviklerkontoen din"),
"Please enter username" => array(
"cs" => "Zadejte prosím uživatelské jméno",
"sk" => "Zadajte prosím užívateľské meno",
"de" => "Bitte geben Sie Benutzername",
"it" => "Si prega di inserire username",
"ru" => "Пожалуйста, введите логин",
"zh" => "请输入用户名",
"pl" => "Podaj nazwę użytkownika",
"fr" => "S&#39;il vous plaît entrer nom d&#39;utilisateur",
"sv" => "Ange användarnamn",
"es" => "Por favor, introduzca nombre de usuario",
"uk" => "Будь ласка, введіть логін",
"pt" => "Por favor, indique nome de usuário",
"no" => "Vennligst skriv inn brukernavn"),
"Both passwords must be the same" => array(
"cs" => "Obě hesla musí být shodná",
"sk" => "Obe hesla musí byť zhodná",
"de" => "Beide Passwörter müssen gleich sein",
"it" => "Entrambe le password devono essere uguali",
"ru" => "Оба пароля должны быть одинаковыми",
"zh" => "这两个密码必须相同",
"pl" => "Oba hasła muszą być takie same",
"fr" => "Les deux mots de passe doivent être les mêmes",
"sv" => "Båda lösenord måste vara samma",
"es" => "Ambas contraseñas deben ser iguales",
"uk" => "Обидва паролі повинні бути однаковими",
"pt" => "Ambas as senhas devem ser iguais",
"no" => "Begge passordene må være like"),
"Please wait, checking your account" => array(
"cs" => "Čekejte prosím, probíhá kontrola Vašeho účtu",
"sk" => "Čakajte prosím, prebieha kontrola Vášho účtu",
"de" => "Bitte warten Sie, Prüfen Sie Ihr Konto",
"it" => "Attendere prego, controllare il vostro conto",
"ru" => "Пожалуйста, подождите, проверяя свой аккаунт",
"zh" => "请稍候，检查您的帐户",
"pl" => "Proszę czekać, sprawdzając swoje konto",
"fr" => "S&#39;il vous plaît attendre, en vérifiant votre compte",
"sv" => "Vänta, kontrollera ditt konto",
"es" => "Por favor espere, comprobando su cuenta",
"uk" => "Будь ласка, зачекайте, перевіряючи свій аккаунт",
"pt" => "Por favor, aguarde, verificando sua conta",
"no" => "Vennligst vent, sjekk kontoen din"),
"Please wait, checking if install method available" => array(
"cs" => "Čekejte prosím, probíhá kontrola, zda je instalační metoda dostupná",
"sk" => "Čakajte prosím, prebieha kontrola, či je inštalačný metóda dostupná",
"de" => "Bitte warten Sie, zu überprüfen, ob Installationsmethode verfügbar",
"it" => "Attendere prego, controllando se installare il metodo disponibile",
"ru" => "Пожалуйста, подождите, проверки, если установить доступный метод",
"zh" => "请稍候，检查是否安装可用的方法",
"pl" => "Proszę czekać, sprawdzenie czy instalacja metody dostępne",
"fr" => "S&#39;il vous plaît attendre, vérifier si la méthode d&#39;installation soit disponible",
"sv" => "Vänta, kontrollera om installationsmetod finns",
"es" => "Por favor espere, comprobando si instalar método disponible",
"uk" => "Будь ласка, зачекайте, перевірки, якщо встановити доступний метод",
"pt" => "Por favor, aguarde, verificando se instalar método disponível",
"no" => "Vennligst vent, sjekk om installasjonsmetoden er tilgjengelig"),
"Please wait, checking if database available" => array(
"cs" => "Čekejte prosím, probíhá kontrola, zda je databáze k dispozici",
"sk" => "Čakajte prosím, prebieha kontrola, či je databáza k dispozícii",
"de" => "Bitte warten Sie, zu überprüfen, ob Datenbank verfügbar",
"it" => "Attendere prego, controllando se il database disponibile",
"ru" => "Пожалуйста, подождите, проверки, если база данных доступна",
"zh" => "请稍候，检查数据库是否可用",
"pl" => "Proszę czekać, sprawdzając, czy w bazie dostępne",
"fr" => "S&#39;il vous plaît attendre, vérifier si la base de données disponibles",
"sv" => "Vänta, kontrollera om databasen tillgänglig",
"es" => "Por favor espere, comprobar si la base de datos disponible",
"uk" => "Будь ласка, зачекайте, перевірки, якщо база даних доступна",
"pt" => "Por favor, aguarde, verificando se banco de dados disponível",
"no" => "Vennligst vent, sjekk om databasen er tilgjengelig"),
"Please wait, checking if database data are correct" => array(
"cs" => "Čekejte prosím, probíhá kontrola, zda jsou údaje správné",
"sk" => "Čakajte prosím, prebieha kontrola, či sú údaje správne",
"de" => "Bitte warten, prüfen, ob Datenbankdaten korrekt sind",
"it" => "Attendere prego, controllando se i dati del database sono corretti",
"ru" => "Пожалуйста, подождите, проверка, если данные базы данных являются правильными",
"zh" => "请稍候，如果数据库中的数据是正确的检查",
"pl" => "Proszę czekać, sprawdzenie czy dane bazy danych są poprawne",
"fr" => "S&#39;il vous plaît attendre, vérifier si les données de base de données sont correctes",
"sv" => "Vänta, kontrollera om databas data är korrekta",
"es" => "Por favor espere, comprobar si los datos de bases de datos son correctos",
"uk" => "Будь ласка, зачекайте, перевірка, якщо дані бази даних є правильними",
"pt" => "Por favor, aguarde, verificando se os dados do banco de dados estão corretos",
"no" => "Vennligst vent, sjekk om databasedataene er korrekte"),
"Copy the following settings to a file on your PC called config.ini.php, upload it to the server into the directory /config/ and click on the Reload button." => array(
"cs" => "Zkopírujte následující nastavení do souboru ve Vašem PC s názvem config.ini.php, nahrejte jej na server do adresáře /config/ a klikněte na tlačítko Opakovat.",
"sk" => "Skopírujte nasledujúce nastavenia do súboru vo Vašom PC s názvom config.ini.php, nahrajte ho na server do adresára /config/ a kliknite na tlačidlo Opakovať.",
"de" => "Kopieren Sie die folgenden Einstellungen in einer Datei auf Ihrem PC genannt config.ini.php, laden Sie sie auf dem Server in das Verzeichnis / config / und klicken Sie auf die Schaltfläche Neu laden.",
"it" => "Copiare le seguenti impostazioni in un file sul PC chiamato config.ini.php, caricarlo sul server nella directory / config / e fare clic sul pulsante Ricarica.",
"ru" => "Скопируйте следующие настройки в файл на компьютере под названием config.ini.php, загрузить его на сервер в каталог / конфигурации / и нажмите на кнопку Reload.",
"zh" => "复制下面的设置保存到文件你的电脑称为config.ini.php上，将其上传到服务器到目录/配置/ ，点击刷新按钮。",
"pl" => "Skopiuj następujące ustawienia do pliku na komputerze o nazwie config.ini.php, przesłać go na serwer do katalogu / config / i kliknij na przycisk Reload.",
"fr" => "Copiez les paramètres suivants dans un fichier sur votre PC appelé config.ini.php, le télécharger sur le serveur dans le répertoire / config / et cliquez sur le bouton Recharger.",
"sv" => "Kopiera följande inställningar till en fil på din dator som kallas config.ini.php, ladda upp den till servern i katalogen / config / och klicka på Ladda-knappen.",
"es" => "Copie la siguiente configuración en un archivo en su PC llamado config.ini.php, subirlo al servidor en el directorio / config / y haga clic en el botón Actualizar.",
"uk" => "Скопіюйте наступні налаштування у файлі на комп&#39;ютері під назвою config.ini.php, завантажити його на сервер в каталог / конфігурації / і натисніть на кнопку Reload.",
"pt" => "Copie as seguintes configurações para um arquivo no seu PC chamado config.ini.php, enviá-lo para o servidor para o diretório / config / e clique no botão Recarregar.",
"no" => "Kopier følgende innstillinger til en fil på din PC kalt config.ini.php, last den opp til serveren til katalogen/config/og klikk på Last inn på nytt."),
"Reload" => array(
"cs" => "Opakovat",
"sk" => "Opakovať",
"de" => "Nachladen",
"it" => "Ricaricare",
"ru" => "Перезагружать",
"zh" => "刷新",
"pl" => "Przeładować",
"fr" => "Recharger",
"sv" => "Ladda om",
"es" => "Recargar",
"uk" => "Перезавантажувати",
"pt" => "Recarregar",
"no" => "Last inn på nytt"),
"Unable to write config file" => array(
"cs" => "Nelze zapsat soubor s konfigurací",
"sk" => "Nemožno zapísať súbor s konfiguráciou",
"de" => "Unfähig, Config-Datei schreiben",
"it" => "Impossibile scrivere il file di configurazione",
"ru" => "Невозможно записать файл конфигурации",
"zh" => "无法写入配置文件",
"pl" => "Nie można zapisać pliku konfiguracyjnego",
"fr" => "Impossible d&#39;écrire le fichier de configuration",
"sv" => "Det går inte att skriva konfigurationsfilen",
"es" => "No se puede escribir el archivo de configuración",
"uk" => "Неможливо записати файл конфігурації",
"pt" => "Não é possível gravar arquivo de configuração",
"no" => "Kan ikke skrive konfigurasjonsfil"),
"The installation cannot be finished!" => array(
"cs" => "Instalaci nelze dokončit!",
"sk" => "Inštaláciu nemožno dokončiť!",
"de" => "Die Installation kann nicht abgeschlossen werden!",
"it" => "L'installazione non può essere finito!",
"ru" => "Установка не может быть завершена!",
"zh" => "安装无法完成！",
"pl" => "Instalacja nie może być zakończone!",
"fr" => "L&#39;installation ne peut pas être terminé!",
"sv" => "Installationen kan inte bli klar!",
"es" => "La instalación no se puede acabar!",
"uk" => "Установка не може бути завершена!",
"pt" => "A instalação não pode ser terminado!",
"no" => "Installasjonen kan ikke fullføres!"),
"The installation has been finished" => array(
"cs" => "Instalace byla dokončena",
"sk" => "Inštalácia bola dokončená",
"de" => "Die Installation abgeschlossen ist",
"it" => "L'installazione è stata terminata",
"ru" => "Установка была закончена",
"zh" => "安装已完成",
"pl" => "Instalacja została zakończona",
"fr" => "L&#39;installation a été terminée",
"sv" => "Installationen har avslutats",
"es" => "La instalación se ha terminado",
"uk" => "Установка була закінчена",
"pt" => "A instalação foi concluída",
"no" => "Installasjonen er fullført"),
"View Website" => array(
"cs" => "Zobrazit stránky",
"sk" => "Zobraziť stránky",
"de" => "Ansicht Website",
"it" => "Visualizza sito web",
"ru" => "Посмотреть Сайт",
"zh" => "浏览网站",
"pl" => "Zobacz strony",
"fr" => "Voir le site web",
"sv" => "Visa webbplats",
"es" => "Ver el sitio web",
"uk" => "Подивитися Сайт",
"pt" => "Veja site",
"no" => "Se nettstedet"),
"Enter Administration" => array(
"cs" => "Vstoupit do administrace",
"sk" => "Vstúpiť do administrácie",
"de" => "Geben Sie Verwaltung",
"it" => "Inserisci Amministrazione",
"ru" => "Введите администрации",
"zh" => "进入管理",
"pl" => "Wprowadź Administracja",
"fr" => "Entrez administration",
"sv" => "Ange Administrering",
"es" => "Introduzca Administración",
"uk" => "Введіть адміністрації",
"pt" => "Digite Administração",
"no" => "Gå inn i administrasjon"),
"Unable to write developer account to database" => array(
"cs" => "Nelze uložit účet vývojáře do databáze",
"sk" => "Nemožno uložiť účet vývojárov do databázy",
"de" => "Unfähig, Entwickler-Konto, um Datenbank zu schreiben",
"it" => "Impossibile scrivere account sviluppatore di database di",
"ru" => "Невозможно записать учетную запись разработчика в базу данных",
"zh" => "无法写入的开发人员帐户数据库",
"pl" => "Nie można zapisać konto dewelopera do bazy danych",
"fr" => "Impossible d&#39;écrire compte développeur base de données pour",
"sv" => "Det går inte att skriva utvecklarkonto till databasen",
"es" => "No se puede escribir cuenta de desarrollador de la base de datos",
"uk" => "Неможливо записати обліковий запис розробника в базу даних",
"pt" => "Não é possível gravar conta de desenvolvedor de banco de dados",
"no" => "Kan ikke skrive utviklerkonto til databasen"),
"Unable to write settings to database" => array(
"cs" => "Nelze uložit nastavení do databáze",
"sk" => "Nemožno uložiť nastavenia do databázy",
"de" => "Unfähig, Einstellungen, um Datenbank zu schreiben",
"it" => "Impossibile scrivere le impostazioni al database",
"ru" => "Невозможно записать настройки в базе данных",
"zh" => "无法写入设置数据库",
"pl" => "Nie można zapisać ustawienia do bazy danych",
"fr" => "Impossible d&#39;écrire les paramètres de base de données",
"sv" => "Det går inte att skriva inställningar till databas",
"es" => "No se puede escribir la configuración de la base de datos",
"uk" => "Неможливо записати настройки в базі даних",
"pt" => "Não é possível gravar configurações para banco de dados",
"no" => "Kan ikke skrive innstillinger til databasen"),
"Unable to write default translator to database" => array(
"cs" => "Nelze uložit výchozí překladač do databáze",
"sk" => "Nemožno uložiť predvolené prekladač do databázy",
"de" => "Unfähig, Standard Übersetzer -Datenbank schreiben",
"it" => "Impossibile scrivere traduttore predefinito del database",
"ru" => "Невозможно записать по умолчанию переводчик для базы данных",
"zh" => "无法写入默认的翻译数据库",
"pl" => "Nie można zapisać do bazy danych domyślnego tłumacz",
"fr" => "Impossible d&#39;écrire Traducteur défaut de base de données",
"sv" => "Det går inte att skriva standard översättare till databasen",
"es" => "No se puede escribir Traductor predeterminado para la base de datos",
"uk" => "Неможливо записати за замовчуванням перекладач для бази даних",
"pt" => "Não é possível gravar tradutor padrão para banco de dados",
"no" => "Kan ikke skrive standardoversetter til databasen"),
"Please setup your developer account" => array(
"cs" => "Založte si prosím Váš účet pro vývojáře",
"sk" => "Založte si prosím Váš účet pre vývojárov",
"de" => "Bitte stellen Sie Ihr Entwicklerkonto",
"it" => "Si prega di configurare il tuo account sviluppatore",
"ru" => "Пожалуйста, установите ваш аккаунт разработчика",
"zh" => "请设置您的开发者账户",
"pl" => "Proszę skonfigurować konto dewelopera",
"fr" => "S&#39;il vous plaît configurer votre compte développeur",
"sv" => "Vänligen konfigurera din utvecklarkonto",
"es" => "Configuración por favor su cuenta de desarrollador",
"uk" => "Будь ласка, встановіть ваш аккаунт розробника",
"pt" => "Configuração por favor sua conta de desenvolvedor",
"no" => "Konfigurer utviklerkontoen din"),
"Unable to write file. Please set up write permissions (chmod 777) to root directory, where install.php is located in" => array(
"cs" => "Nelze zapsat soubor. Nastavte prosím práva zápisu (chmod 777) na kořenový adresář, ve kterém se nachází soubor install.php",
"sk" => "Nemožno zapísať súbor. Nastavte prosím práva zápisu (chmod 777) na koreňový adresár, v ktorom sa nachádza súbor install.php",
"de" => "Kann Datei nicht schreiben. Bitte setzen Sie Schreibrechte (chmod 777) in das Stammverzeichnis, in dem install.php befindet",
"it" => "Impossibile scrivere il file. Si prega di impostare i permessi di scrittura (chmod 777) nella directory root, dove install.php si trova a",
"ru" => "Невозможно записать файл. Пожалуйста, настроить разрешения на запись (CHMOD 777) в корневой каталог, где install.php находится в",
"zh" => "无法写入文件。 请设置写权限（ CHMOD 777）到根目录下，其中的install.php位于",
"pl" => "Nie można zapisać pliku. Proszę ustawić uprawnienia do zapisu (chmod 777) do katalogu głównego, w którym znajduje się install.php",
"fr" => "Impossible d&#39;écrire le fichier. S&#39;il vous plaît configurer les permissions d&#39;écriture (chmod 777) dans le répertoire racine, où est situé dans install.php",
"sv" => "Det går inte att skriva filen. Ställ upp skrivrättigheter (chmod 777) till rotkatalogen, där install.php ligger i",
"es" => "No se puede escribir el archivo. Por favor, configurar permisos de escritura (chmod 777) a directorio raíz, donde se encuentra install.php en",
"uk" => "Неможливо записати файл. Ласка, налаштувати дозволу на запис (CHMOD 777) в кореневий каталог, де install.php знаходиться в",
"pt" => "Não é possível gravar arquivo. Por favor, configurar permissões de escrita (chmod 777) para o diretório root, onde install.php está localizado em",
"no" => "Kan ikke skrive fil.Vennligst sett opp skriverettigheter (chmod 777) til rotkatalogen, der install.php ligger i"),
"No databases found" => array(
"cs" => "Nebyly nalezeny žádné databáze",
"sk" => "Neboli nájdené žiadne databázy",
"de" => "Keine Datenbanken gefunden",
"it" => "Nessun database trovato",
"ru" => "Не базы данных не найдено",
"zh" => "没有找到数据库",
"pl" => "Nie znaleziono bazy danych",
"fr" => "Aucune base de données trouvés",
"sv" => "Inga databaser hittades",
"es" => "No hay bases de datos encontrados",
"uk" => "Чи не бази даних не знайдено",
"pt" => "Nenhum banco de dados encontrados",
"no" => "Ingen databaser funnet"),
"Install Modules" => array(
"cs" => "Nainstalovat moduly",
"sk" => "Nainštalovať moduly",
"de" => "Installieren Sie Module",
"it" => "Installare i moduli",
"ru" => "Установка модулей",
"zh" => "安装模块",
"pl" => "Zainstaluj moduły",
"fr" => "Installer des modules",
"sv" => "Installera moduler",
"es" => "Instalar módulos",
"uk" => "Установка модулів",
"pt" => "Instalação dos módulos",
"no" => "Installer moduler"),
"Downloading Install File" => array(
"cs" => "Stahování instalačního souboru",
"sk" => "Sťahovanie inštalačného súboru",
"de" => "Herunterladen Datei installieren",
"it" => "Scaricando file di installazione",
"ru" => "Скачивая файл установки",
"zh" => "下载安装文件",
"pl" => "Pobierając plik instalacyjny",
"fr" => "Installez le téléchargement de fichiers",
"sv" => "Hämtningen installationsfilen",
"es" => "Descarga de Instalar Archivo",
"uk" => "Завантажуючи файл установки",
"pt" => "Baixando Instalar Arquivo",
"no" => "Laster ned installasjonsfil"),
"Installing" => array(
"cs" => "Probíhá instalace",
"sk" => "Prebieha inštalácia",
"de" => "Installieren",
"it" => "Installazione",
"ru" => "Установка",
"zh" => "安装",
"pl" => "Instalacja",
"fr" => "Installation",
"sv" => "Installera",
"es" => "Instalación",
"uk" => "Установка",
"pt" => "Instalando",
"no" => "Installerer"),
"of" => array(
"cs" => "z",
"sk" => "z",
"de" => "von",
"it" => "di",
"ru" => "из",
"zh" => "的",
"pl" => "z",
"fr" => "de",
"sv" => "av",
"es" => "de",
"uk" => "з",
"pt" => "do",
"no" => "av"),
"Finished" => array(
"cs" => "Dokončeno",
"sk" => "Dokončené",
"de" => "Fertige",
"it" => "Finito",
"ru" => "Готовые",
"zh" => "完",
"pl" => "Zakończone",
"fr" => "Fini",
"sv" => "Färdiga",
"es" => "Terminado",
"uk" => "Готові",
"pt" => "Acabado",
"no" => "Ferdig"),
"Please select, which file to install from" => array(
"cs" => "Vyberte prosím, ze kterého souboru se má instalovat",
"sk" => "Vyberte prosím, z ktorého súboru sa má inštalovať",
"de" => "Bitte wählen Sie, welche Datei aus installieren",
"it" => "Si prega di selezionare, quale file da installare da",
"ru" => "Пожалуйста, выберите, какой файл для установки с",
"zh" => "请选择，从安装的文件",
"pl" => "Proszę wybrać, które pliki do instalacji z",
"fr" => "S&#39;il vous plaît sélectionner le fichier à installer à partir de",
"sv" => "Välj, vilken fil att installera från",
"es" => "Por favor, seleccione, qué archivo para instalar desde",
"uk" => "Будь ласка, виберіть, який файл для установки з",
"pt" => "Por favor seleccione, que arquivo para instalar a partir de",
"no" => "Velg hvilken fil du vil installere fra"),
"Select install file from server" => array(
"cs" => "Vyberte instalační soubor ze serveru",
"sk" => "Vyberte inštalačný súbor zo servera",
"de" => "Wählen Sie die Installationsdatei vom Server",
"it" => "Selezionare il file di installazione dal server",
"ru" => "Выберите файл установки с сервера",
"zh" => "选择从服务器安装文件",
"pl" => "Wybierz plik instalacyjny z serwera",
"fr" => "Sélectionnez d&#39;installer le fichier du serveur",
"sv" => "Välj installationsfilen från servern",
"es" => "Seleccione archivo de instalación del servidor",
"uk" => "Виберіть файл установки з сервера",
"pt" => "Selecione Instalar arquivo do servidor",
"no" => "Velg installer fil fra server"),
"or enter URL of install file to download" => array(
"cs" => "nebo zadejte URL adresu instalačního souboru ke stažení",
"sk" => "alebo zadajte URL adresu inštalačného súboru na stiahnutie",
"de" => "oder geben Sie die URL der Installationsdatei zum Download",
"it" => "o inserire l'URL del file di installazione da scaricare",
"ru" => "или введите URL из установки файла для загрузки",
"zh" => "或输入安装文件的url来下载",
"pl" => "lub podaj adres URL zainstalować plik do pobrania",
"fr" => "ou saisir l&#39;URL du fichier d&#39;installation pour télécharger",
"sv" => "eller ange webbadressen för installationsfilen för att ladda ner",
"es" => "o escriba el URL de archivo de instalación para descargar",
"uk" => "або введіть URL з установки файлу для завантаження",
"pt" => "ou digite a URL de instalar o arquivo para download",
"no" => "eller skriv inn URL-adressen til installasjonsfilen for å laste ned"),
"step" => array(
"cs" => "krok",
"sk" => "krok",
"de" => "Schritt",
"it" => "passo",
"ru" => "шаг",
"zh" => "步",
"pl" => "krok",
"fr" => "étape",
"sv" => "steg",
"es" => "paso",
"uk" => "крок",
"pt" => "passo",
"no" => "steg"),
"Please select a hosting provider for this server" => array(
"cs" => "Vyberte prosím poskytovatele hostingu pro tento server",
"sk" => "Prosím vyberte poskytovateľa hostingu pre tento server",
"de" => "Bitte wählen Sie ein Hosting-Anbieter für diesen Server",
"it" => "Si prega di selezionare un fornitore di hosting per questo server",
"ru" => "Пожалуйста, выберите хостинг-провайдера для этого сервера",
"zh" => "请选择此服务器托管服务提供商",
"pl" => "Proszę wybrać dostawcę usług hostingowych dla tego serwera",
"fr" => "S&#39;il vous plaît sélectionner un fournisseur d&#39;hébergement pour ce serveur",
"sv" => "Välj ett webbhotell för den här servern",
"es" => "Por favor, seleccione un proveedor de hosting para este servidor",
"uk" => "Будь ласка, виберіть хостинг-провайдера для цього сервера",
"pt" => "Por favor, selecione um provedor de hospedagem para este servidor",
"no" => "Velg en vertsleverandør for denne serveren"),
"If you choose your hosting provider then the specific characteristics of this type of hosting will be applied. If your provider is not in list, select the type of the operating system that is installed on this server." => array(
"cs" => "Pokud vyberete přímo Vašeho poskytovatele hostingu, pak se automaticky nastaví všechny specifické vlastnosti pro tento typ hostingu. Pokud seznam Vašeho poskytovatele neobsahuje, zvolte typ podle operačního systému, který je na serveru nainstalován.",
"sk" => "Ak vyberiete priamo Vášho poskytovateľa hostingu, potom sa automaticky nastaví všetky špecifické vlastnosti pre tento typ hostingu. Ak zoznam Vášho poskytovateľa neobsahuje, vyberte typ podľa operačného systému, ktorý je na serveri nainštalovaný.",
"de" => "Wenn Sie Ihr Hosting- Anbieter zu wählen, dann werden die spezifischen Merkmale dieser Art von Hosting angewendet werden. Wenn Ihr Provider nicht in der Liste, wählen Sie den Typ des Betriebssystems, die auf diesem Server installiert ist.",
"it" => "Se si sceglie il provider di hosting poi saranno applicate le caratteristiche specifiche di questo tipo di hosting. Se il vostro provider non è nella lista, selezionare il tipo di sistema operativo che è installato su questo server.",
"ru" => "Если вы выбираете хостинг-провайдера, то конкретные характеристики этого типа хостинга будет применяться. Если ваш провайдер не в списке, выберите тип операционной системы, установленной на этом сервере.",
"zh" => "如果你选择你的主机提供商那么这种类型的托管的具体特性将被应用。 如果您的提供商不在列表中，选择安装在此服务器上的操作系统的类型。",
"pl" => "Jeśli zdecydujesz się z dostawcą hostingu następnie zostaną zastosowane szczególne właściwości tego typu hosting. Jeśli dostawca nie jest na liście, wybierz typ systemu operacyjnego zainstalowanego na tym serwerze.",
"fr" => "Si vous choisissez votre fournisseur d&#39;hébergement, puis les caractéristiques spécifiques de ce type d&#39;hébergement seront appliqués. Si votre fournisseur est pas dans la liste, sélectionnez le type de système d&#39;exploitation qui est installé sur ce serveur.",
"sv" => "Om du väljer ditt webbhotell leverantör sedan de särskilda kännetecknen för denna typ av hosting kommer att tillämpas. Om din leverantör inte finns i listan väljer du vilken typ av operativsystem som är installerat på den här servern.",
"es" => "Si decide que su proveedor de alojamiento a continuación, se aplicarán las características específicas de este tipo de alojamiento. Si su proveedor no está en la lista, seleccione el tipo de sistema operativo que está instalado en este servidor.",
"uk" => "Якщо ви вибираєте хостинг-провайдера, то конкретні характеристики цього типу хостингу буде застосовуватися. Якщо ваш провайдер не в списку, виберіть тип операційної системи, встановленої на цьому сервері.",
"pt" => "Se você escolher o seu provedor de hospedagem, em seguida, as características específicas deste tipo de hospedagem será aplicado. Se o seu provedor não está na lista, selecione o tipo do sistema operacional que está instalado no servidor.",
"no" => "Hvis du velger din vertsleverandør, vil de spesifikke egenskapene til denne typen hosting bli brukt.Hvis leverandøren din ikke er på listen, velg typen operativsystem som er installert på denne serveren."),
"New project" => array(
"cs" => "Nový projekt",
"sk" => "Nový projekt",
"de" => "Neues Projekt",
"it" => "Nuovo progetto",
"ru" => "Новый проект",
"zh" => "新项目",
"pl" => "Nowy projekt",
"fr" => "Nouveau projet",
"sv" => "Nytt projekt",
"es" => "Nuevo proyecto",
"uk" => "Новий проект",
"pt" => "Novo projeto",
"no" => "Nytt prosjekt"),
"Install Locked" => array(
"cs" => "Instalace zablokována",
"sk" => "Inštalácia zablokovaná",
"de" => "Installieren Gesperrt",
"it" => "Installare Bloccato",
"ru" => "Установите Закрытая",
"zh" => "锁定安装",
"pl" => "Zainstaluj Zablokowany",
"fr" => "Installez Verrouillé",
"sv" => "Installera Låst",
"es" => "Instale Bloqueado",
"uk" => "Встановіть Закрита",
"pt" => "Instale Locked",
"no" => "Installer låst"),
"To disable unauthorised access the installer has been automaticaly locked. To continue please delete install.lock file (in the same directory as install.php)." => array(
"cs" => "K zamezení neautorizovaného přístupu byl instalátor automaticky uzamčen. Pro pokračování odstraňte soubor install.lock (nachází se ve stejném adresáři, jako soubor install.php).",
"sk" => "K zamedzeniu neautorizovaného prístupu bol inštalátor automaticky uzamknutý. Pre pokračovanie odstráňte súbor install.lock (nachádza sa v rovnakom adresári, ako súbor install.php).",
"de" => "Um unberechtigten Zugriff zu deaktivieren das Installationsprogramm automatisch gesperrt. Um fortzufahren bitte löschen install.lock Datei (im gleichen Verzeichnis wie install.php).",
"it" => "Per disabilitare l'accesso non autorizzato il programma di installazione è stato automaticamente bloccato. Per procedere nella prenotazione cancellare il file install.lock (nella stessa directory install.php).",
"ru" => "Чтобы отключить несанкционированный доступинсталлятор автоматически заблокирован. Чтобы продолжить, пожалуйста, удалите install.lock файл (в том же каталоге, что и install.php).",
"zh" => "要禁用未授权访问的安装程序已经automaticaly锁定。 要继续，请删除install.lock文件（在同一个目录中install.php了） 。",
"pl" => "Aby wyłączyć nieautoryzowany dostęp instalator został automatycznie zablokowany. Aby kontynuować, usuń plik install.lock (w tym samym katalogu co install.php).",
"fr" => "Pour désactiver l&#39;accès non autorisé à l&#39;installateur a été automatiquement verrouillée. Pour continuer s&#39;il vous plaît supprimer le fichier de install.lock (dans le même répertoire que install.php).",
"sv" => "Om du vill inaktivera obehörig åtkomst installatören har automaticaly låst. För att fortsätta stryk install.lock fil (i samma katalog som install.php).",
"es" => "Para desactivar el acceso no autorizado al instalador ha sido bloqueado de forma automática. Para continuar por favor, eliminar el archivo install.lock (en el mismo directorio que install.php).",
"uk" => "Щоб відключити несанкціонований доступінсталлятор автоматично заблокований. Щоб продовжити, будь ласка, видаліть install.lock файл (в тому ж каталозі, що і install.php).",
"pt" => "Para desativar o acesso não autorizado o instalador foi automaticamente bloqueado. Para continuar por favor, apague arquivo install.lock (no mesmo diretório que install.php).",
"no" => "For å deaktivere uautorisert tilgang har installasjonsprogrammet blitt låst automatisk.For å fortsette må du slette filen install.lock (i samme katalog som install.php)."),
);
$TRANSLATIONS["lang_cs"] = array("en" => "Česky");
$TRANSLATIONS["lang_hu"] = array("en" => "Magyar");
$TRANSLATIONS["lang_en"] = array("en" => "English");
$TRANSLATIONS["lang_sk"] = array("en" => "Slovensky");
$TRANSLATIONS["lang_de"] = array("en" => "Deutsch");
$TRANSLATIONS["lang_it"] = array("en" => "Italiano");
$TRANSLATIONS["lang_ru"] = array("en" => "Русский");
$TRANSLATIONS["lang_uk"] = array("en" => "Український");
$TRANSLATIONS["lang_zh"] = array("en" => "中国的");
$TRANSLATIONS["lang_fr"] = array("en" => "Français");
$TRANSLATIONS["lang_pl"] = array("en" => "Polskie");
$TRANSLATIONS["lang_sv"] = array("en" => "Svenska");
$TRANSLATIONS["lang_no"] = array("en" => "Norsk");
$TRANSLATIONS["lang_da"] = array("en" => "Dansk");
$TRANSLATIONS["lang_fi"] = array("en" => "Suomalainen");
$TRANSLATIONS["lang_es"] = array("en" => "Español");
$TRANSLATIONS["lang_pt"] = array("en" => "Português");
 // ----------------------------------- (do not remove or edit this lines) //

$HOSTINGS = array(
    "unknown" => array(
        "name" => "Unknown",
        "params" => array(
            "installMethod" => "copy",
        ),
    ),
    "linux" => array(
        "name" => "Linux",
        "params" => array(
            "installMethod" => "ftp",
        ),
        "phpinfo" => "linux",
    ),
    "windows" => array(
        "name" => "Windows",
        "params" => array(
            "installMethod" => "copy",
        ),
        "phpinfo" => "windows",
    ),
    "forpsi" => array(
        "name" => "FORPSI",
        "params" => array(
            "installMethod" => "ftp",
        ),
        "globals" => array(
            "_FILE_FORCE_PHP" => true,
            "_DIR_FORCE_PHP" => true,
            "_CHMOD_PHP" => 0755,
        ),
        "phpinfo" => "forpsi",
    ),
    "safe_mode" => array(
        "name" => "SAFE_MODE",
        "params" => array(
            "installMethod" => "ftp",
        ),
        "globals" => array(
            "_FILE_FORCE_PHP" => true,
            "_PHP_FILE_FORCE_FTP" => true,
            "_DIR_FORCE_FTP" => true,
            "_CHMOD_PHP" => 0755,
        ),
        "phpinfo" => "safe_mode</td><td class=\"v\">On",
    ),
);

// FOR USB/CD/DVD compiled projects - get config
if (file_exists("install.ini.php"))
{
    include("install.ini.php");
}

$_CONFIG = array();
$_CONFIG["globals"] = array();
$_CONFIG["ftp"] = array(
    "host" => $_REQUEST["ftpHost"],
    "login" => $_REQUEST["ftpLogin"],
    "password" => $_REQUEST["ftpPassword"],
    "path" => $_REQUEST["ftpPath"],
);
if ($_REQUEST["installHosting"])
{
    if ($HOSTINGS[$_REQUEST["installHosting"]]["globals"])
        $_CONFIG["globals"] = $HOSTINGS[$_REQUEST["installHosting"]]["globals"];
}
foreach($_CONFIG["globals"] as $_globalName => $_globalValue)
{
    global $$_globalName;
    $$_globalName = $_globalValue;
}

if (!$COMPILED)
{
    include("Install.i18n.php");
}

// FOR GOOGLE TRANSLATOR:
if (false)
{
    foreach($TRANSLATIONS as $text => $translatedText)
    {
        echo $translatedText["cs"]."<br />";
    }
    exit;
}



session_name("sid");
if ($_REQUEST["sid"])
    session_id($_REQUEST["sid"]);

$__scriptStartTime = microtime(true);
$__scriptStartMemory = memory_get_usage();

$coreObjects = array();
$__metaHtml = array();
$__headHtml = array();


if (true || $COMPILED) // new using debug compile
    $mainPath = str_replace("\\", "/", realpath(dirname(__FILE__))."/");
else
    $mainPath = str_replace("\\", "/", realpath(dirname(__FILE__)."/../../../../")."/");

$urlPath = str_replace("\\", "/", dirname($_SERVER["SCRIPT_NAME"]));
$urlPath .= ($urlPath != "/" ? "/" : "");

$urlPathArray = explode("/", $urlPath);
$testUrl = "/";
$mainUrl = "/";
$mainUrlFound = true;
//var_dump($urlPathArray);
for ($i = 0 ; $i < count($urlPathArray) && $mainUrlFound; $i++)
{
    if ($urlPathArray[$i] != "" && (!ADMIN || $urlPathArray[$i] != "admin"))
    {
        $testUrl .= $urlPathArray[$i]."/";
    }
}
$mainUrl = $testUrl;

if ($_SERVER["REQUEST_URI"] == "") // on some windows machines
{
    $_SERVER["REQUEST_URI"] = $urlPath;
}

if ($_SERVER["HTTPS"] != "" && strtolower($_SERVER["HTTPS"]) != "off" || $_SERVER["HTTP_X_FORWARDED_PROTO"] == "https")
{
    $serverName = $_SERVER["HTTP_HOST"];
    $serverProtocol = "https";
    $serverPort = "";
    $serverUrl = $serverProtocol."://".$serverName;
}
else
{
    $serverName = $_SERVER["HTTP_HOST"];
    $serverProtocol = "http";
    $serverPort = $_SERVER["SERVER_PORT"];
    $serverUrl = $serverProtocol."://".$serverName.($serverPort != 80 && strpos($serverName, ":") === FALSE ? ":".$serverPort : "");
}
define("PROJECTPATH", $mainPath);
//define("MAINPATH", $mainPath);
//if ($COMPILED)
    define("_PROJECTPATH", str_replace("\\", "/", dirname(__FILE__))."/");
//else
//    define("_PROJECTPATH", str_replace("\\", "/", dirname(__FILE__))."/out/");

    //define("PROJECTURL", $serverUrl.$mainUrl);
if ($COMPILED)
{
    define("PROJECTURL", $serverUrl.$mainUrl);
    define("PROJECTURL_C", $serverUrl.$mainUrl); // used after compile
}
else
{
    define("PROJECTURL", $serverUrl.$mainUrl);
    //define("PROJECTURL", $serverUrl."/");
}

define("PROJECTURL_NC", $serverUrl.$mainUrl); // used to disable adding files to compiled install.php
    
if ($COMPILED)
    define("AJAXFILENAME", basename(__FILE__));
else
    define("AJAXFILENAME", $mainUrl.basename(__FILE__));
define("TEMPPATH", $mainPath."__tmp/");

define("COMPILED", $COMPILED);
define("INSTALL", true);
define("CHMOD_WRITE", 0777);
define("CHMOD_PHP", ($_CHMOD_PHP ? $_CHMOD_PHP : 0644));
define("URL", str_replace(":/", "://", str_replace("//", "/", $serverUrl.substr($_SERVER["REQUEST_URI"], 0, strlen($_SERVER["REQUEST_URI"])))));

if ($INSTALLPROCESSVERSION)
    define("INSTALLPROCESSVERSION", $INSTALLPROCESSVERSION);

//var_dump(PROJECTPATH);
//var_dump(PROJECTURL);
//exit;

function startProfile()
{
    
}

function stopProfile()
{
    
}

function getCompiledFileContent($fileName)
{
    global $binaryOffset, $binaryIndex;
    
    if (!$binaryIndex[$fileName][1])
    {
        echo "TInstall::getCompiledFile(): file '".$fileName."' not found";
        return;
        
    }
    
    $f = fopen(__FILE__, "r");
    fseek($f, $binaryOffset+$binaryIndex[$fileName][0], SEEK_SET);
    $data = fread($f, $binaryIndex[$fileName][1]);
    
    return(base64_decode($data));
}

function getCompiledFile($fileName)
{
    $data = getCompiledFileContent($fileName);
    
    $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

    switch($ext)
    {
        case "pdf": $ctype="application/pdf"; break;
        case "exe": $ctype="application/octet-stream"; break;
        case "zip": $ctype="application/zip"; break;
        case "doc": $ctype="application/msword"; break;
        case "xls": $ctype="application/vnd.ms-excel"; break;
        case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
        case "gif": $ctype="image/gif"; break;
        case "png": $ctype="image/png"; break;
        case "jpeg":
        case "jpg": $ctype="image/jpg"; break;
        case "css": $ctype="text/css"; break;
        case "js": $ctype="text/javascript"; break;
        default: $ctype="application/force-download";     
    }    
    header("Content-Type: $ctype");     
    
    return($data);
}

if ($_REQUEST["include"])
{
    echo getCompiledFile($_REQUEST["include"]);
    exit;
    //var_dump($binaryIndex[$_REQUEST["include"]][1]);
    //var_dump(strlen($data));
    //echo $data;
}

if (COMPILED)
{
    foreach($binaryIndex as $fileName => $dummy)
    {
        if (strpos($fileName, "_lib.") === 0)
        {
            $code = getCompiledFile($fileName);

            /*
            set_error_handler("installEvalPhpErrorFunction"); 
            global $evalPhpFatalErrorEvalCode;
            $evalPhpFatalErrorEvalCode = $code;
        
            global $evalPhpErrorFunctionMessage;
            $evalPhpErrorFunctionMessage = "";
            eval($code);
            restore_error_handler(NULL); 
            $evalPhpFatalErrorEvalCode = "";
            */

            //if (strpos($code, "query") !== FALSE)
            //    echo $code."<hr>";
            
            ob_start();
            eval($code);
            $content = ob_get_contents();
            ob_end_clean();
            
            if (strpos($content, "Parse error") !== FALSE)
            {
                echo $content."<hr />".$code;
                exit;
            }
        }
    }
}
else
{
    // START --------- this lines will be removed after install.php compilation -------- (do not modify this line) - //
    include_once(PROJECTPATH."core/classes/_new/Core/functions.system.php");
    include_once(PROJECTPATH."core/classes/_new/Core/functions.common.php");
    include_once(PROJECTPATH."core/classes/_new/Core/functions.core.php");
    include_once(PROJECTPATH."core/classes/_new/Core/functions.parse.php");
    include_once(PROJECTPATH."core/classes/_new/Object/Object.class.php");
    include_once(PROJECTPATH."core/classes/_new/Mouse/Mouse.class.php");
    include_once(PROJECTPATH."core/classes/_new/Keyboard/Keyboard.class.php");
    include_once(PROJECTPATH."core/classes/_new/JSON/JSON.class.php");
    include_once(PROJECTPATH."core/classes/_new/CURL/CURL.class.php");
    include_once(PROJECTPATH."core/classes/_new/System/System.class.php");
    include_once(PROJECTPATH."core/classes/_new/String/String.class.php");
    include_once(PROJECTPATH."core/classes/_new/Array/Array.class.php");
    include_once(PROJECTPATH."core/classes/_new/File/File.class.php");
    include_once(PROJECTPATH."core/classes/_new/FTP/FTP.class.php");
    include_once(PROJECTPATH."core/classes/_new/Internet/Internet.class.php");
    include_once(PROJECTPATH."core/classes/_new/Version/Version.class.php");
    include_once(PROJECTPATH."core/classes/_new/DateFunctions/DateFunctions.class.php");

    include_once(PROJECTPATH."core/classes/_new/AutoSize/AutoSize.class.php");
    include_once(PROJECTPATH."core/classes/_new/Process/Process.class.php");
    include_once(PROJECTPATH."core/classes/_new/Process/ProcessManager.class.php");
    include_once(PROJECTPATH."core/classes/_new/UUID/UUID.class.php");
    include_once(PROJECTPATH."core/classes/_new/Component/Component.class.php");
    include_once(PROJECTPATH."core/classes/_new/TextEdit/TextEdit.class.php");
    include_once(PROJECTPATH."core/classes/_new/ButtonEdit/ButtonEdit.class.php");
    include_once(PROJECTPATH."core/classes/_new/ComboBox/ComboBox.class.php");
    include_once(PROJECTPATH."core/classes/_new/CheckBox/CheckBox.class.php");
    include_once(PROJECTPATH."core/classes/_new/ToolTip/ToolTip.class.php");
    include_once(PROJECTPATH."core/classes/_new/ObjectComboBox/ObjectComboBox.class.php");
    include_once(PROJECTPATH."core/classes/_new/DbLink/DbLink.class.php");
    include_once(PROJECTPATH."core/classes/_new/DbLink/FileDbLink.class.php");
    include_once(PROJECTPATH."core/classes/_new/DbLink/SQLDbLink.class.php");
    include_once(PROJECTPATH."core/classes/_new/DbLink/MySQLDbLink.class.php");
    include_once(PROJECTPATH."core/classes/_new/DbLink/SQLiteDbLink.class.php");
    include_once(PROJECTPATH."core/classes/_new/Progress/Progress.class.php");
    include_once(PROJECTPATH."core/classes/_new/DownloadProcess/DownloadProcess.class.php");
    include_once(PROJECTPATH."core/classes/_new/InstallProcess/InstallProcess.class.php");
    include_once(PROJECTPATH."core/classes/_new/CSS3Converter/CSS3Converter.class.php");

    include_once(PROJECTPATH."core/classes/_new/Image/Image.class.php");
    include_once(PROJECTPATH."core/classes/_new/Image/ImageLayer.class.php");
    include_once(PROJECTPATH."core/classes/_new/Image/ImageEffect.class.php");
    include_once(PROJECTPATH."core/classes/_new/Image/effects/ImageResize.class.php");

    include_once(PROJECTPATH."core/classes/_new/LoadingAnimation/LoadingAnimation.class.php");
    include_once(PROJECTPATH."core/classes/_new/Tree/Tree.class.php");
    include_once(PROJECTPATH."core/classes/_new/Tree/TreeItem.class.php");
    include_once(PROJECTPATH."core/classes/_new/DirectoryTree/DirectoryTree.class.php");

    
    // DO NOT REMOVE - will be compiled
    // <script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/EULA.en.html\"></script> 
    // <script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/EULA.cs.html\"></script> 
    // <script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/EULA.sk.html\"></script> 
    
    // END --------- this lines will be removed after install.php compilation -------- (do not modify this line) - //
}

// ---- DUMMY FUNCTIONS ----
/*
function showMessage($text)
{
    global $MainProcess;
    //var_dump($MainProcess);
    if ($MainProcess)
        $MainProcess->error($text);
        
    echo $text;
}
*/
// ---- DUMMY CLASSES ----
/*
function getObjectTypes()
{
    return(array(
        "MySQLDbLink",
        "PostgreSQLDbLink",
        "SQLiteDbLink",
    ));
}
*/

class TDummy
{
    function __call($name, $arguments)
    {
    }
}

class TEvents extends TDummy
{
    function hasEvent($name)
    {
        return(false);
    }
    
    function runEvents($name, $arguments=array(), $retVariableName="")
    {
        return($arguments[$retVariableName]);
    }
}
class TStyles extends TDummy
{
} 
class TSettings extends TObject
{
}

class TTranslator extends TObject
{
    function translate($text)
    {
        global $TRANSLATIONS;
        $_text = $TRANSLATIONS[$text][$this->language];
        if (!$_text)
            $_text = $TRANSLATIONS[$text]["en"];
        if (!$_text)
            $_text = $text;
            
        return($_text);
    }
}

//var_dump($Settings);
//exit;

$Translator = new TTranslator();
$Translator->language = ($_REQUEST["language"] ? $_REQUEST["language"] : "en");

class TTranslators extends TObject
{
    function getTranslator($language)
    {
        global $Translator;
        return($Translator);
        //echo "x";
        //exit;
    }
}

class TInstall extends TObject
{
    var $titles = array(
        "Language",
        "License",
        "Install type",
        "Filesystem",
        "Database",
    );
    
    function __construct($params=array())
    {
        if (!$params["step"])
            $params["step"] = 1;

        $this->params = $params;

        $this->getDbLink();
    }
    
    function getHeader()
    {
        $html .= "<!DOCTYPE html>\n";
        $html .= "<html>\n";
        $html .= "<head>\n";
        $html .= "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n";
        $html .= "<title>Visual PHP™ 2 Install - ".translate("step")." ".$this->params["step"]."</title>\n";
        $html .= "<script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Core/functions.common.js\"></script>\n";
        $html .= "<script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Core/functions.system.js\"></script>\n";
        $html .= "<script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Core/functions.core.js\"></script>\n";
        $html .= "<script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/AJAX/AJAX.class.js\"></script>\n";
        $html .= "<script type=\"text/javascript\" src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Browser/Browser.class.js\"></script>\n";
        global $__metaHtml;
        $html .= implode("\n", $__metaHtml);
        global $__headHtml;
        $html .= implode("\n", $__headHtml);
        
        // leave this line commented!!! needed to compile into instal.php
        /* $html .= "<link href=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/Install.class.css\" rel='stylesheet' type='text/css' />\n"; */

        if (COMPILED)
            $html .= "<link href='".AJAXFILENAME."?ajaxViewType=vtObject&objectName=Install&methodName=getCSS&file=core/classes/_new/Install/Install.class.css' rel='stylesheet' type='text/css' />\n";
        else
            $html .= "<link href=\"".AJAXFILENAME."?ajaxViewType=vtObject&objectName=Install&methodName=getCSS&file=".PROJECTPATH."core/classes/_new/Install/Install.class.css\" rel='stylesheet' type='text/css' />\n";
        
        $html .= "</head>\n";
        $html .= "<script type=\"text/javascript\">\n";
        $html .= "var PROJECTURL = '".PROJECTURL_NC."'; \n";
        $html .= "var AJAXFILENAME = '".AJAXFILENAME."'; \n";
        $html .= "var cookieDomain = '".COOKIEDOMAIN."'; \n";
        $html .= "var style = ''; \n";
        $html .= "var language = '".$this->params["language"]."'; \n";
        $html .= "var sid = '".session_id()."'; \n";
        $html .= "var dataChangeTimer = null; \n";
        $html .= "var PERSISTENTPARAMS = {}; \n";

        $html .= "addEvent(document, 'keydown', function(e){e=getEvent(e);if (e.keyCode==VK_ENTER) { e.stop();}}) \n";
        $html .= "</script>\n";
        $html .= "<body>\n";
        /*
        $html .= "<div class='body'>\n";
        $html .= "<div class='top'>\n";
        $html .= "<img src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/visualphp.png\" class='logo' />\n";
        $html .= "</div>\n";
        $html .= "<div class='left autoheight' >\n";
        $html .= "<h2>Install steps:</h2>";
        $html .= "<ol>";
        foreach($this->titles as $title)
        {
            $html .= "<li>".$title."</li>";
        }
        $html .= "</ol>";
        $html .= "</div>\n";
        $html .= "<div class='content autofill'>\n";
        */
        
        return($html);
    }
    
    function getFooter()
    {
        /*
        $html .= "</div>\n";
        $html .= "</div>\n";
        */
        $html .= "</body>\n";
        $html .= "</html>\n";

        return($html);
    }

    function getContent($params = array(), $value = '')
    {
        //var_dump(class_exists("TAutoSize", false));
        $html .= getObject("AutoSize")->getContent();
        $html .= getObject("JSON")->getContent();
        $html .= getObject("ToolTip")->getContent();

        $functionName = "getContent_".$this->params["step"];
        
        if (_file_exists(PROJECTPATH."install.lock") && $this->params["step"] == 2)
        {
            $functionName = "getContent_locked";
        }
        else if ($_REQUEST["debugUI"] == "true")
        {
            $functionName = "getContent_UI";
        }
        else if ($_REQUEST["debugPHPInfo"] == "true")
        {
            $functionName = "getContent_phpInfo";
        }
        
        $Settings = createObject("Settings");
        $Settings->setProperties($this->params);
        
        //$html .= "<form id='mainForm' style='width:100%;height:100%;' method='post'>";
        $html .= "<form id='mainForm' style='width:100%;' method='post' autocomplete='off'>";
        $html .= getAllParamsAsForm();
        $html .= "<div>";
        $html .= $this->$functionName();
        $html .= "</div>";
        $html .= "</form>";
        //$html = "";

        $html = str_replace("[##", "[", $html);
        
        $html = $this->getHeader().$html.$this->getFooter();
        
        return($html);
    }
        
    function getContent_UI()
    {
        $html .= "<div class='logo-circle' id='logo-circle'></div>";
        $html .= "<div class='logo-text' id='logo-text'></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='language'>";

        $html .= "<div style='padding:20px;'>";
        $html .= getObject("ComboBox")->getContent(array(
            "id" => "language",
            "values" => "|1|2|3|4|5",
            "texts" => "|lorem|ipsum|dolor|sit|amet",
            "labels" => translate("Lorem Ipsum Dolor Sit Amet")."...|lorem|ipsum|dolor|sit|amet",
            "class" => "",
        ));
        $html .= "</div>";
        
        $html .= "<div style='padding:20px;'>";
        $html .= getObject("Progress")->getContent(array(
            "id" => "ProcessProgress",
        ), 48);
        $html .= "</div>";

        $html .= "<div style='padding:20px;'>";
        $html .= "<input class='_TextEdit' type='text' name='ftpHost' value='lorem ipsum dolor' title='".translate("Lorem Ipsum Dolor Sit Amet")."' />";
        $html .= "</div>";

        $html .= "<div style='padding:20px;'>";
        $html .= getObject("ButtonEdit")->getContent(array("id"=>"sqlDatabase"));
        $html .= "</div>";

        $html .= "<div style='padding:20px;'>";
        $html .= "<button class='_Button'>Lorem Ipsum Dolor Sit Amet</button>";
        $html .= "</div>";

        $html .= "<div style='padding:20px;'>";
            $html .= getObject("DirectoryTree")->getContent(array(
                "id"=>"installFile",
                "onChange"=>"onInstallFileChange()",
                "style"=>"width:250px;height:250px;margin-left:25px;",
                "files"=>true,
                "dirs"=>true,
                //"ajaxLoad"=>true, // neni implementovano?
                "icons"=>array(
                    array("ext"=>"directory", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/directory.png"),
                    array("ext"=>"install", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/install.png"),
                    array("ext"=>"php", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/php.png"),
                    array("ext"=>"jpg", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/jpg.png"),
                    array("ext"=>"png", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/png.png"),
                    array("ext"=>"gif", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/gif.png"),
                    array("ext"=>"*", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/file.png"),
                ),
                "iconWidth" => "16px",
                "iconHeight" => "16px",
                "onChange"=>"onInstallSourceChange()",
            ));
        $html .= "</div>";

        $html .= "</div>";

        return($html);
    }
    
    function getContent_phpInfo()
    {
        $html .= "<div class='logo-circle' id='logo-circle'></div>";
        $html .= "<div class='logo-text' id='logo-text'></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='language'>";
        ob_start();
        phpinfo();
        $html .= ob_get_contents();
        ob_end_clean();
        $html .= "</div>";
        
        return($html);
    }
    
    function getContent_locked()
    {
        $html .= "<div class='logo-circle' id='logo-circle'></div>";
        $html .= "<div class='logo-text' id='logo-text'></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        $html .= "<div style='padding:20px;'>";
        $html .= "<h1>".translate("Install Locked")."</h1>";
        $html .= "<p>".translate("To disable unauthorised access the installer has been automaticaly locked. To continue please delete install.lock file (in the same directory as install.php).")."</p>";
        $html .= "</div>";
        $html .= "</div>";

        return($html);
    }

    function getContent_1()
    {
        $html .= "<div class='logo-circle' id='logo-circle' style='opacity:0;'></div>";
        $html .= "<div class='logo-text' id='logo-text' style='opacity:0;'></div>";
        $html .= "<div class='logo-version' id='logo-version' style='opacity:0;'>".INSTALL_VERSION."</div>";
        $html .= "<div class='language'>";
        
        global $LANGUAGES;
        $values = $LANGUAGES;
        $texts = array();
        foreach($values as $value)
            $texts[] = translate("lang_".$value);
        
        $html .= getObject("ComboBox")->getContent(array(
            "id" => "language",
            "values" => "|".implode("|", $values),
            "texts" => "|".implode("|", $texts),
            "labels" => translate("Select your language")."...|".implode("|", $texts),
            "class" => "",
            "style" => "opacity:0;",
            "onChange" => "if(getObject('language').getValue()) {getElement('mainForm').step.value='2';getElement('mainForm').submit();}",
        ));

        $html .= "</div>";
        
        //$html .= getJavaScriptHtml("animate(getElement('logo'), {'opacity':1}, 1000, 'linear', function(){animate(getElement('productlogo'), {'opacity':1}, 1000, 'linear', function(){animate(getElement('language'), {'opacity':1}, 1000);});});", true);
        $html .= getJavaScriptHtml("animate(getElement('logo-circle'), {'opacity':1}, 200, 'linear', function(){animate(getElement('logo-text'), {'opacity':1}, 200, 'linear', function(){animate(getElement('language'), {'opacity':1}, 200, 'linear', function(){animate(getElement('logo-version'), {'opacity':1}, 200)});});});", true);

        /*
        $html .= "<br /><br /><br /><br />";
        $html .= "<h1>Welcome to Visual PHP™</h1>";
        $html .= "Visual PHP is a visual development tool for web design. This installer will help you to easily install Visual PHP™ on the remote server. ";
        $html .= "It accelerates the install process to a few minutes rather than uploading may files slowly via FTP protocol. ";
        
        $html .= "Please select your language:";
        
        $html .= getObject("ComboBox")->getContent(array(
            "id" => "language",
            "values" => "aaa|bbb|ccc",
            "texts" => "AAA|BBB|CCC",
        ));
        
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."'>";
        $html .= "<button>Next</button>";
        */
        
        return($html);
        
    }
    function getContent_2()
    {
        $errors = $this->testServer();

        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        if ($errors)
        {
            $html .= "<div class='errors'>";
            $html .= implodeList($errors, "<br>");
            $html .= "</div>";
        }
        else
        {
            $html .= "<div class='eula'>";
            if (COMPILED)
            {
                $eula = getCompiledFileContent("core/classes/_new/Install/EULA.".$this->params["language"].".html");
            }
            else
            {
                $eula = file_get_contents("EULA.".$this->params["language"].".html");
            }
            $html .= parsePhp($eula);
            $html .= "</div>";
            $html .= "<button class='_Button' onclick=\"getElement('mainForm').submit();\">".translate("I have read the EULA, agree and want to continue")."</button>";
            $html .= "<br><a href='".basename(__FILE__)."?debugPHPInfo=true' style='font-weight:normal;font-size:9px;text-decoration:none;color:#AAAAAA'>PHP Info</a>";
        }
        $html .= "</div>";

        return($html);
    }

    function getContent_3()
    {
        $html .= "<input type='hidden' name='installType' value='' />";
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='install-type'>";
        $html .= "<h1>".translate("Please select, what you want to do").":</h1>";
        $html .= "<ul class='install-type'>";
        if (file_exists(PROJECTPATH."visual-php-core"))
        {
            $html .= "<li onclick=\"getElement('mainForm').installType.value='empty';getElement('mainForm').submit();\">";
            $html .= "<img src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/empty-project.png\" />";
            $html .= "<h2>".translate("Update project to version 2")."</h2>";
            $html .= translate("Install core files, database and scripts to allow update to version 2");
            $html .= "<div style='clear:both'></div>";
            $html .= "</li>";
        }
        else
        {
            $html .= "<li onclick=\"getElement('mainForm').installType.value='empty';getElement('mainForm').submit();\">";
            $html .= "<img src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/empty-project.png\" />";
            $html .= "<h2>".translate("Create new empty project")."</h2>";
            $html .= translate("Install core files, database and empty project");
            $html .= "<div style='clear:both'></div>";
            $html .= "</li>";
            $html .= "<li onclick=\"getElement('mainForm').installType.value='move';getElement('mainForm').submit();\">";
            $html .= "<img src=\"".PROJECTURL_C."install.php?include=core/classes/_new/Install/move-project.png\" />";
            $html .= "<h2>".translate("Move project to this server")."</h2>";
            $html .= translate("Install project from install file compiled from other domain or your PC");
            $html .= "<div style='clear:both'></div>";
            $html .= "</li>";
        }
        $html .= "</ul>";
        $html .= "</div>";
        
        return($html);
    }
    
    function getContent_4()
    {
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        
        $values = array();
        $texts = array();
        global $HOSTINGS;
        foreach($HOSTINGS as $name => $params)
        {
            $values[] = $name;
            $texts[] = $params["name"];
        }
        
        $html .= "<h1>".translate("Please select a hosting provider for this server").":</h1>";
        $html .= "<i>".translate("If you choose your hosting provider then the specific characteristics of this type of hosting will be applied. If your provider is not in list, select the type of the operating system that is installed on this server.")."</i><br /><br />";
        $html .= getObject("ComboBox")->getContent(array(
            "id" => "installHosting",
            "values" => $values,
            "texts" => $texts,
            "class" => "",
        ), $this->getDefaultHosting());

        
        $html .= "<div><button class='_Button' id='continue' onclick=\"getElement('mainForm').submit();\">".translate("Continue")."</button></div>";
        $html .= "</div>";

        return($html);
    }
    
    function getContent_5()
    {
        global $HOSTINGS;
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        
        $html .= "<h1>".translate("Please select, which method use to install files on server").":</h1>";
        $html .= getObject("ComboBox")->getContent(array(
            "id" => "installMethod",
            "values" => "|ftp|copy",
            "texts" => "|".translate("FTP (recommended)")."|".translate("Direct copy"),
            "labels" => translate("Select")."...|".translate("FTP (recommended)")."|".translate("Direct copy"),
            "class" => "",
            "onChange" => "onInstallMethodChange()",
        ), $HOSTINGS[$this->params["installHosting"]]["params"]["installMethod"]);

        if (!$this->params["ftpHost"])
            $this->params["ftpHost"] = "localhost";
        $html .= "<span class='status-icon' id='copyStatus'></span>";
        $html .= "<div id='checkStatus'></div>";
        $html .= "<div class='' id='installMethodFTP' style='text-align:center;'>";
        $html .= "<div><label>".translate("Host")."</label><input class='_TextEdit' type='text' name='ftpHost' value='".$this->params["ftpHost"]."' title='".translate("Domain name, server name or IP address")."'  onkeyup='onDataChange()' /><span class='status-icon' id='ftpHostStatus'></span></div>";
        $html .= "<div><label>".translate("Login")."</label><input class='_TextEdit' type='text' name='ftpLogin' value='".$this->params["ftpLogin"]."' title='".translate("Username for FTP account")."'  onkeyup='onDataChange()'/><span class='status-icon' id='ftpLoginStatus'></span></div>";
        $html .= "<div><label>".translate("Password")."</label><input class='_TextEdit _PasswordEdit' type='password' name='ftpPassword' value='".$this->params["ftpPassword"]."' title='".translate("Password for FTP account")."'  onkeyup='onDataChange()'/><span class='status-icon'></span></div>";
        $html .= "<div><label>".translate("Path")."</label>".getObject("ButtonEdit")->getContent(array("id"=>"ftpPath","onButtonClick"=>"onFtpPathButtonClick()","onKeyUp"=>"onDataChange()","title"=>translate("Not all FTP accounts start in root of website. If website is located in subdirectory, specify directory path to install.php")), $this->params["ftpPath"])."<span class='status-icon' id='ftpPathStatus'></span></div>";
        //$html .= "<div><label>".translate("Path")."</label><input class='_TextEdit' type='text' name='ftpPath' value='".$this->params["ftpPath"]."' title='".translate("Not all FTP accounts start in root of website. If website is located in subdirectory, specify directory path to install.php")."'  onkeyup='onDataChange()'/><span class='status-icon' id='ftpPathStatus'></span></div>";
        $html .= "</div>";
        $html .= "<div><button class='_Button' id='continue' onclick=\"getElement('mainForm').submit();\" style='display:none;'>".translate("Continue")."</button></div>";

        // !!!! ftpPath pres directorytree nebo directory edit
        // u kazde polozky kontrola - zelene OK, nebo cervene ERROR
        
        $html .= getJavaScriptHtml("
            function onInstallMethodCheck(result)
            {
                var installMethod = getObject('installMethod').getValue();
                //alert(result);
                removeClassName('copyStatus', 'status-error');
                removeClassName('copyStatus', 'status-ok');
                removeClassName('ftpHostStatus', 'status-error');
                removeClassName('ftpHostStatus', 'status-ok');
                removeClassName('ftpLoginStatus', 'status-error');
                removeClassName('ftpLoginStatus', 'status-ok');
                removeClassName('ftpPathStatus', 'status-error');
                removeClassName('ftpPathStatus', 'status-ok');

                if (installMethod == 'copy')
                {
                    if (result == 'OK')
                    {
                        getElement('checkStatus').innerHTML = '".translate("Test passed")."';
                        getElement('continue').style.display = '';
                        addClassName('copyStatus', 'status-ok');
                    }
                    else
                    {
                        //getElement('checkStatus').innerHTML = result;
                        getElement('checkStatus').innerHTML = '';
                    }
                }
                if (installMethod == 'ftp')
                {
                    getElement('ftpLoginStatus').title = '';
                    getElement('ftpHostStatus').title = '';
                    getElement('ftpPathStatus').title = '';
                    result = JSON.decode(result);
                    
                    if (result['ftpHost'] == 'OK')
                    {
                        getElement('checkStatus').innerHTML = '';
                        addClassName('ftpHostStatus', 'status-ok');
                    }
                    else if (typeof(result['ftpHost']) == 'undefined')
                    {
                        getElement('checkStatus').innerHTML = '';
                    }
                    else if (result['ftpHost'] != '')
                    {
                        //getElement('checkStatus').innerHTML = result['ftpHost'];
                        getElement('checkStatus').innerHTML = '';
                        addClassName('ftpHostStatus', 'status-error');
                    }
                    
                    if (result['ftpLogin'] == 'OK')
                    {
                        getElement('checkStatus').innerHTML = '';
                        addClassName('ftpLoginStatus', 'status-ok');
                    }
                    else if (typeof(result['ftpLogin']) == 'undefined')
                    {
                        getElement('checkStatus').innerHTML = '';
                    }
                    else if (result['ftpLogin'] != '')
                    {
                        //getElement('checkStatus').innerHTML = result['ftpLogin'];
                        getElement('checkStatus').innerHTML = '';
                        getElement('ftpLoginStatus').title = result['ftpLogin'];
                        addClassName('ftpLoginStatus', 'status-error');
                    }

                    //alert(result['ftpLogin']);
                    if (result['ftpLogin'] == 'OK')
                    {
                        if (result['ftpPath'] == 'OK')
                        {
                            getElement('checkStatus').innerHTML = '';
                            addClassName('ftpPathStatus', 'status-ok');
                        }
                        else if (typeof(result['ftpPath']) == 'undefined')
                        {
                            getElement('checkStatus').innerHTML = '';
                        }
                        else if (result['ftpPath'] != '')
                        {
                            getElement('checkStatus').innerHTML = result['ftpPath'];
                            getElement('ftpPathStatus').title = result['ftpPath'];
                            addClassName('ftpPathStatus', 'status-error');
                        }
                    }
                    
                    getElement('continue').style.display = (result['ftpHost'] == 'OK' && result['ftpLogin'] == 'OK' && result['ftpPath'] == 'OK' ? '' : 'none');
                }
            }

            function onInstallMethodChange()
            {
                var installMethod = getObject('installMethod').getValue();
                getElement('continue').style.display = 'none';
                getElement('checkStatus').innerHTML = '';
                removeClassName('copyStatus', 'status-ok');
                removeClassName('copyStatus', 'status-error');
                getElement('installMethodFTP').style.display = (installMethod=='ftp' ? '' : 'none');
                if (installMethod == 'copy')
                {
                    getElement('checkStatus').innerHTML = '".translate("Please wait, checking if install method available")."...';
                    AJAX.open('".basename(__FILE__)."?methodName=testInstallMethod&installMethod='+installMethod+'&language=".$this->params["language"]."&rand='+time(), onInstallMethodCheck);
                }
                if (installMethod == 'ftp')
                {
                    getElement('checkStatus').innerHTML = '".translate("Please wait, checking if install method available")."...';
                    //alert('".basename(__FILE__)."?methodName=testInstallMethod&installMethod='+installMethod+'&ftpHost='+getElement('mainForm').ftpHost.value+'&ftpLogin='+getElement('mainForm').ftpLogin.value+'&ftpPassword='+getElement('mainForm').ftpPassword.value+'&ftpPath='+getElement('mainForm').ftpPath.value);
                    AJAX.open('".basename(__FILE__)."?methodName=testInstallMethod&installMethod='+installMethod+'&ftpHost='+getElement('mainForm').ftpHost.value+'&ftpLogin='+getElement('mainForm').ftpLogin.value+'&ftpPassword='+getElement('mainForm').ftpPassword.value+'&ftpPath='+getElement('mainForm').ftpPath.value+'&language=".$this->params["language"]."&rand='+time(), onInstallMethodCheck);
                    //window.open('".basename(__FILE__)."?methodName=testInstallMethod&installMethod='+installMethod+'&ftpHost='+getElement('mainForm').ftpHost.value+'&ftpLogin='+getElement('mainForm').ftpLogin.value+'&ftpPassword='+getElement('mainForm').ftpPassword.value+'&ftpPath='+getElement('mainForm').ftpPath.value+'&rand='+time());
                }
            }
            function onFtpPathButtonClick()
            {
                AJAX.open('".basename(__FILE__)."?methodName=getFtpPath&ftpHost='+getElement('mainForm').ftpHost.value+'&ftpLogin='+getElement('mainForm').ftpLogin.value+'&ftpPassword='+getElement('mainForm').ftpPassword.value+'&language=".$this->params["language"]."&rand='+time(), onFtpPathResult);
            }
            function onFtpPathResult(result)
            {
                //alert(result);
                getObject('ftpPath').setValue(result);
                setTimeout(function(){onDataChange()}, 1000);
            }
            function onDataChange()
            {
                clearTimeout(dataChangeTimer);
                dataChangeTimer = setTimeout(function(){onInstallMethodChange()}, 1000);
            }            
            onInstallMethodChange();
        ");
        
        $html .= "</div>";
        
        return($html);
    }
    
    function getContent_6()
    {
        //$html .= "<input type='hidden' name='installType' value='' />";
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        
        $html .= "<h1>".translate("Please select, which database you want to use").":</h1>";
        $html .= getObject("ComboBox")->getContent(array(
            "id" => "databaseType",
            "class" => "",
            "values" => "|MySQL|SQLite",
            "texts" => translate("Select")."...|MySQL|SQLite",
            // TODO - add other methods by loading external files *DbLink.class.php
            //"values" => "|MySQL|PostgreSQL|SQLite",
            //"texts" => translate("Select")."...|MySQL|PostgreSQL|SQLite",
            "onChange" => "onDatabaseTypeChange();",
        ));

        if (!$this->params["sqlHost"])
            $this->params["sqlHost"] = "localhost";
        
        $html .= "<span class='status-icon' id='dbStatus'></span>";
        $html .= "<div id='checkStatus'></div>";
        $html .= "<div class='' id='installMethodSQL' style=''>";
        $html .= "<div><label>".translate("Host")."</label><input class='_TextEdit' type='text' name='sqlHost' value='".$this->params["sqlHost"]."' title='".translate("Domain name, server name or IP address")."'  onkeyup='onDataChange()' /><span class='status-icon' id='sqlHostStatus'></span></div>";
        $html .= "<div><label>".translate("Login")."</label><input class='_TextEdit' type='text' name='sqlLogin' value='".$this->params["sqlLogin"]."' title='".translate("Username for database access")."'  onkeyup='onDataChange()' /><span class='status-icon' id='sqlLoginStatus'></span></div>";
        $html .= "<div><label>".translate("Password")."</label><input class='_TextEdit _ButtonEdit' type='password' name='sqlPassword' value='".$this->params["sqlPassword"]."' title='".translate("Password for database access")."'  onkeyup='onDataChange()' /><span class='status-icon'></span></div>";
        $html .= "<div><label>".translate("Database")."</label>";
        //$html .= "   <input class='_TextEdit' type='text' id='sqlDatabase' name='sqlDatabase' value='".$this->params["sqlDatabase"]."' title='".translate("Database name, your account has access to")."'  onkeyup='onDataChange()'  />";
        $html .= "   ".getObject("ButtonEdit")->getContent(array("id"=>"sqlDatabase","onButtonClick"=>"onDatabaseButtonClick()","onKeyUp"=>"onDataChange()","title"=>translate("Database name")));
        $html .= "   ".getObject("ComboBox")->getContent(array("id"=>"sqlDatabaseSelect","onChange"=>"onDatabaseSelectChange()","title"=>translate("Database name")));
        $html .= "   <span class='status-icon' id='sqlDatabaseStatus'></span>";
        $html .= "</div>";
        $html .= "</div>";
        $html .= "<div class='' id='installMethodFile' style=''>";
        $html .= "<div><label>".translate("Path")."</label><input class='_TextEdit' type='text' name='dbPath' id='dbPath' value='".$this->params["dbPath"]."'  title='".translate("Path to database file or directory")."'  onkeyup='onDataChange()' /><span class='status-icon' id='dbPathStatus'></span></div>";
        $html .= "</div>";
        $html .= "<div><button class='_Button' id='continue' onclick=\"getElement('mainForm').submit();\" style='display:none;'>".translate("Continue")."</button></div>";

        $html .= getJavaScriptHtml("
            getObject('sqlDatabaseSelect').hide();
        ");

        // !!!! ftpPath pres directorytree nebo directory edit
        // u kazde polozky kontrola - zelene OK, nebo cervene ERROR
        
        $html .= getJavaScriptHtml("
            function onDatabaseTypeCheck(result)
            {
                var databaseType = getObject('databaseType').getValue();
                //alert(result);
                result = JSON.decode(result);
                removeClassName('dbStatus', 'status-error');
                removeClassName('dbStatus', 'status-ok');
                if (result['status'] == 'OK')
                {
                    getElement('checkStatus').innerHTML = '".translate("Test passed")."';
                    addClassName('dbStatus', 'status-ok');
                }
                else if (typeof(result['status']) == 'undefined')
                {
                    getElement('checkStatus').innerHTML = '';
                }
                else if (result['status'] != '')
                {
                    //getElement('checkStatus').innerHTML = result['status'];
                    getElement('checkStatus').innerHTML = '';
                    addClassName('dbStatus', 'status-error');
                }
                
                if (databaseType == 'SQLite')
                    getElement('dbPath').value = '/db/sqlite/default.sqlite';
                
                getElement('installMethodSQL').style.display=(result['inherits'] == 'TSQLDbLink' && databaseType != 'SQLite' ? '' : 'none');
                getElement('installMethodFile').style.display=(result['inherits'] == 'TFileDbLink' || databaseType == 'SQLite' ? '' : 'none');
                
                onDatabaseChange();
            }

            function onDatabaseButtonClick()
            {
                var databaseType = getObject('databaseType').getValue();
                AJAX.open('".basename(__FILE__)."?methodName=getDatabases&databaseType='+databaseType+'&sqlHost='+getElement('mainForm').sqlHost.value+'&sqlLogin='+getElement('mainForm').sqlLogin.value+'&sqlPassword='+getElement('mainForm').sqlPassword.value+'&dbPath='+getElement('mainForm').dbPath.value+'&language=".$this->params["language"]."&rand='+time(), onDatabasesResult);
            }
            
            function onDatabasesResult(result)
            {
                result = JSON.decode(result);

                removeClassName('sqlDatabaseStatus', 'status-error');
                removeClassName('sqlDatabaseStatus', 'status-ok');
                if (result['databases'].length)
                {
                    var Database = getObject('sqlDatabase');
                    var Databases = getObject('sqlDatabaseSelect');
                    Databases.clear();
                    Databases.addOption({'value':''});
                    for (var i = 0 ; i < result['databases'].length ; i++)
                    {
                        Databases.addOption({'value':result['databases'][i]});
                    }
                    Database.hide();
                    Databases.show();
                }
                else
                {
                    addClassName('sqlDatabaseStatus', 'status-error');
                    getElement('sqlDatabaseStatus').title = '".translate("No databases found")."';
                }
            }
            
            var databaseCheckResult = {};
            function onDatabaseCheck(result)
            {
                var databaseType = getObject('databaseType').getValue();
                //alert(result);
                result = JSON.decode(result);
                databaseCheckResult = result;
                removeClassName('sqlHostStatus', 'status-error');
                removeClassName('sqlHostStatus', 'status-ok');
                removeClassName('sqlLoginStatus', 'status-error');
                removeClassName('sqlLoginStatus', 'status-ok');
                removeClassName('sqlDatabaseStatus', 'status-error');
                removeClassName('sqlDatabaseStatus', 'status-ok');
                removeClassName('dbPathStatus', 'status-error');
                removeClassName('dbPathStatus', 'status-ok');

                getElement('sqlHostStatus').title = '';
                getElement('sqlDatabaseStatus').title = '';
                getElement('sqlLoginStatus').title = '';
                var hasErrors = false;
                if (typeof(result['path']) != 'undefined')
                {
                    if (result['path'] == 'OK')
                    {
                        addClassName('dbPathStatus', 'status-ok');
                    }  
                    else if (result['path'] != '')
                    {
                        addClassName('dbPathStatus', 'status-error');
                        getElement('dbPathStatus').title = (typeof(result['path']) != 'undefined' ? result['path'] : '');
                        hasErrors = true;
                    }              
                }
                else if (result['host'] == 'OK')
                {
                    addClassName('sqlHostStatus', 'status-ok');

                    if (result['login'] == 'OK')
                    {
                        addClassName('sqlLoginStatus', 'status-ok');

                        if (result['database'] == 'OK')
                        {
                            addClassName('sqlDatabaseStatus', 'status-ok');
                        }
                        else if (result['database'] != '')
                        {
                            addClassName('sqlDatabaseStatus', 'status-error');
                            getElement('sqlDatabaseStatus').title = (typeof(result['database']) != 'undefined' ? result['database'] : '');
                            hasErrors = true;
                        }
                    }
                    else if (result['login'] != '')
                    {
                        addClassName('sqlLoginStatus', 'status-error');
                        getElement('sqlLoginStatus').title = (typeof(result['login']) != 'undefined' ? result['login'] : '');
                        hasErrors = true;
                    }

                }
                else if (result['host'] != '')
                {
                    addClassName('sqlHostStatus', 'status-error');
                    getElement('sqlHostStatus').title = (typeof(result['host']) != 'undefined' ? result['host'] : '');
                    hasErrors = true;
                }
                
                getElement('continue').style.display = (hasErrors ? 'none' : '');
                getElement('checkStatus').innerHTML = '';
            }
            function onDatabaseSelectChange()
            {
                var value = getObject('sqlDatabaseSelect').getValue()
                getElement('sqlDatabase').value = value;
                if (value)
                    onDataChange();
            }
            function onDatabaseTypeChange()
            {
                var databaseType = getObject('databaseType').getValue();
                getElement('continue').style.display = 'none';
                getElement('checkStatus').innerHTML = '';
                getElement('installMethodSQL').style.display = 'none';
                getElement('installMethodFile').style.display = 'none';
                if (databaseType == 'MySQL')
                    getElement('installMethodSQL').style.display = '';
                if (databaseType == 'MySQL')
                    getElement('installMethodFile').style.display = '';

                getElement('checkStatus').innerHTML = '".translate("Please wait, checking if database available")."...';
                AJAX.open('".basename(__FILE__)."?methodName=testDatabaseType&databaseType='+databaseType+'&language=".$this->params["language"]."&rand='+time, onDatabaseTypeCheck);
            }
            function onDatabaseChange()
            {
                var databaseType = getObject('databaseType').getValue();
                getElement('continue').style.display = 'none';
                getElement('checkStatus').innerHTML = '".translate("Please wait, checking if database data are correct")."...';
                AJAX.open('".basename(__FILE__)."?methodName=testDatabase&databaseType='+databaseType+'&sqlHost='+getElement('mainForm').sqlHost.value+'&sqlLogin='+getElement('mainForm').sqlLogin.value+'&sqlPassword='+getElement('mainForm').sqlPassword.value+'&sqlDatabase='+getElement('mainForm').sqlDatabase.value+'&dbPath='+getElement('mainForm').dbPath.value+'&language=".$this->params["language"]."&rand='+time(), onDatabaseCheck);
                //window.open('".basename(__FILE__)."?methodName=testDatabase&databaseType='+databaseType+'&sqlHost='+getElement('mainForm').sqlHost.value+'&sqlLogin='+getElement('mainForm').sqlLogin.value+'&sqlPassword='+getElement('mainForm').sqlPassword.value+'&sqlDatabase='+getElement('mainForm').sqlDatabase.value+'&dbPath='+getElement('mainForm').dbPath.value+'&language=".$this->params["language"]."&rand='+time());
            }
            function onDataChange()
            {
                clearTimeout(dataChangeTimer);
                dataChangeTimer = setTimeout(function(){onDatabaseChange()}, 1000);
            }            

            onDatabaseTypeChange();
        ");
        
        $html .= "</div>";
        
        return($html);
    }
    
    function getContent_7()
    {
        if (!$this->params["downloadUrls"])
        {
            if ($this->params["installType"] == "empty")
            {
                global $LANGUAGEPACKS;
                $this->params["downloadUrls"] = array(
                    //"http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=".EMPTY_PROJECT_MODULE_PACKAGE => _PROJECTPATH."__tmp/EmptyProject.install",
                    "http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=".CoreModuleId => _PROJECTPATH."__tmp/Core.module.install",
                    "http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=".AdminModuleId => _PROJECTPATH."__tmp/Admin.module.install",
                    "http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=".WebModuleId => _PROJECTPATH."__tmp/Web.module.install",
                    "http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=".($LANGUAGEPACKS[$this->params["language"]] ? $LANGUAGEPACKS[$this->params["language"]] : $LANGUAGEPACKS["en"]) => _PROJECTPATH."__tmp/LanguagePack.module.install",
                );
                if (file_exists(PROJECTPATH."visual-php-core"))
                {
                    $this->params["downloadUrls"]["http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=".VisualPHP1UpdateModuleId] = _PROJECTPATH."__tmp/VisualPHP1Update.module.install";
                }
            }
            else if ($this->params["installUrl"])
            {
                $this->params["downloadUrls"] = array($this->params["installUrl"] => _PROJECTPATH."__tmp/Project.install");
            } 
            else
                $this->params["downloadUrls"] = array();
        }        
        
        $html .= "<input type='hidden' name='step' id='step' value='".($this->params["step"]+1)."' />";
        $html .= "<input type='hidden' name='installFiles' value='".implode("|", array_values($this->params["downloadUrls"]))."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        
        if ($this->params["downloadUrls"])
        {
            // download install file
            _mkdir(_PROJECTPATH."__tmp", CHMOD_WRITE);
            $ProcessManager = createObject("ProcessManager");
            $ProcessManager->storageType = "stFile";
            $ProcessManager->storagePath = _PROJECTPATH."/__tmp/";
            ob_start();
            $processId = $ProcessManager->run("DownloadProcess", array(
                "url"=>array_keys($this->params["downloadUrls"]), 
                "file"=>array_values($this->params["downloadUrls"]), 
                "ftpHost"=>$this->params["ftpHost"],
                "ftpLogin"=>$this->params["ftpLogin"],
                "ftpPassword"=>$this->params["ftpPassword"],
                "ftpPath"=>$this->params["ftpPath"],
                "_GET"=>array("installHosting" => $this->params["installHosting"]),
                //"runInBackground"=>($this->params["runInBackground"] !== "false" ? true : false),
                "runInBackground"=>false,
                "debugProcess"=>$this->params["debugProcess"],
                //"debugProcess"=>false,
                ));
            $html .= ob_get_contents();
            ob_end_clean();
            
            $html .= getObject("Progress")->getContent(array(
                "id" => "ProcessProgress",
            ));
            $html .= "<div id='ProcessProgressText'></div>";            
            $html .= "<div id='ProcessErrors'></div>";            
            
            $html .= getJavaScriptHtml("
                var notRespondCounter = 0;
                function reloadProcessProgress()
                {
                    if ('".$processId."')
                    {
                        AJAX.timeout = 10000;
                        var record = AJAX.getObjectMethod('ProcessManager', 'getProcessInfo', {'processId':'".$processId."','storageType':'stFile','storagePath':'"._PROJECTPATH."/__tmp/'});
                        //alert(record);
                        
                        if (typeof(record['progress']) == 'undefined')
                        {
                            notRespondCounter++;
                            if (notRespondCounter > 10)
                            {
                                getElement('ProcessErrors').innerHTML = '".translate("Install process is not responding, reload page and try again")."';
                            }
                        }
                        else
                        {
                            if (typeof(record['progressText']) == 'undefined' || record['progressText'] == null)
                                record['progressText'] = '';
                                
                            notRespondCounter = 0;
                            getObject('ProcessProgress').setValue(record['progress']);
                            getElement('ProcessProgressText').innerHTML = (record['progress'] == 100 ? '".translate("Download finished")."' : '".translate("Downloading Install File").": '+record['progressText']);
                            getElement('ProcessErrors').innerHTML = (typeof(record['errors']) != 'undefined' ? record['errors'] : '');
                        }

                        if (record['progress'] == 100)
                            getElement('continue').style.display = '';
                        else
                            setTimeout(function(){reloadProcessProgress()}, 4000);
                        
                    }
                    else
                    {
                        getElement('ProcessErrors').innerHTML = 'Error: Process not created';
                    }
                }
                setTimeout(function(){reloadProcessProgress()}, 1000);
            ");
        }
        else if ($this->params["installType"] == "move")
        {
            $html .= getJavaScriptHtml("
                function onInstallSourceChange()
                {
                    if (getElement('continue') && getObject('installUrl') && getObject('installFile'))
                    {
                        if (getObject('installUrl').getValue())
                        {
                            getElement('continue').style.display = '';
                        }
                        else if (getFileExt(getObject('installFile').getValue()))
                        {
                            getElement('continue').style.display = '';
                        }
                        else
                            getElement('continue').style.display = 'none';
                    }
                }            
            ");
            
            $html .= "<h1>".translate("Please select, which file to install from")."</h1>";
            $html .= "<div style='width:600px;margin-left:auto;margin-right:auto;'>";
            $html .= "<div style='width:300px;float:left;text-align:center;'>";
            $html .= "<h2>".translate("Select install file from server")."</h2>";
            $html .= getObject("DirectoryTree")->getContent(array(
                "id"=>"installFile",
                "onChange"=>"onInstallFileChange()",
                "style"=>"width:250px;height:250px;margin-left:25px;",
                "files"=>true,
                "dirs"=>true,
                //"ajaxLoad"=>true, // neni implementovano?
                "icons"=>array(
                    array("ext"=>"directory", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/directory.png"),
                    array("ext"=>"install", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/install.png"),
                    array("ext"=>"php", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/php.png"),
                    array("ext"=>"jpg", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/jpg.png"),
                    array("ext"=>"png", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/png.png"),
                    array("ext"=>"gif", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/gif.png"),
                    array("ext"=>"*", "icon"=>PROJECTURL_C."install.php?include=core/classes/_new/Install/file.png"),
                ),
                "onChange"=>"onInstallSourceChange()",
            ));
            $html .= "</div>";
            $html .= "<div style='width:300px;float:left;text-align:center;'>";
            $html .= "<h2>".translate("or enter URL of install file to download")."</h2>";
            $html .= getObject("TextEdit")->getContent(array(
                "id"=>"installUrl",
                "prefix"=>"http://",
                "style"=>"width:250px;",
                "onKeyDown"=>"onInstallSourceChange()",
                "onChange"=>"onInstallSourceChange()",
            ));
            $html .= "</div>";
            $html .= "</div>";
        }
        
        $html .= "<div style='clear:both;'><button class='_Button' id='continue' onclick=\"if (getObject('installUrl').getValue()) {getElement('step').value='".$this->params["step"]."'} getElement('mainForm').submit();\" style='display:none;'>".translate("Continue")."</button></div>";
        $html .= "</div>";
        
        return($html);
    }
    
    function getContent_8()
    {
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1+($this->params["installType"] == "move" ? 1 : 0))."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";

        if ($this->params["installFile"])
            $files = array(_PROJECTPATH.$this->params["installFile"]);
        else
        {
            $files = explode("|", $this->params["installFiles"]);
        }
        
        foreach($files as $file)
        {
            if (!_file_exists($file))
            {
                $errors[] = translatef("File '%s' not found", str_replace(PROJECTPATH, "/", $file));
            }
        }

        if ($errors)
        {
            $html .= "<div class='errors'>";
            $html .= implodeList($errors, "<br>");
            $html .= "</div>";
        }
        else
        {
            _mkdir(_PROJECTPATH."__tmp", CHMOD_WRITE);
            _mkdir(_PROJECTPATH."repository", CHMOD_WRITE);
            $ProcessManager = createObject("ProcessManager");
            $ProcessManager->storageType = "stFile";
            $ProcessManager->storagePath = _PROJECTPATH."/__tmp/";
            ob_start();
            $processId = $ProcessManager->run("InstallProcess", array(
                "actionType"=>"atUnpackProject",
                "installMethod"=>$this->params["installMethod"],
                "_GET"=>array("installHosting" => $this->params["installHosting"]),
                "emptyProject"=>($this->params["installType"] == "empty" ? true : false),
                "file"=>_PROJECTPATH."__tmp/",  //???
                //"installFile"=>_PROJECTPATH.($this->params["installFile"] ? $this->params["installFile"] : "__tmp/_downloaded.install"), 
                "installFile"=>$files, 
                //"path"=>(COMPILED ? _PROJECTPATH : _PROJECTPATH."__tmp/out/"),
                "path"=>_PROJECTPATH,
                
                "ftpHost"=>$this->params["ftpHost"],
                "ftpLogin"=>$this->params["ftpLogin"],
                "ftpPassword"=>$this->params["ftpPassword"],
                "ftpPath"=>$this->params["ftpPath"],

                "databaseType"=>$this->params["databaseType"],
                "sqlHost"=>$this->params["sqlHost"],
                "sqlLogin"=>$this->params["sqlLogin"],
                "sqlPassword"=>$this->params["sqlPassword"],
                "sqlDatabase"=>$this->params["sqlDatabase"],
                "dbPath"=>$this->params["dbPath"],

                //"runInBackground"=>($this->params["runInBackground"] !== "false" ? true : false),
                "runInBackground"=>false,
                "debugProcess"=>$this->params["debugProcess"],
                ));
            $html .= ob_get_contents();
            ob_end_clean();
            
            $html .= getObject("Progress")->getContent(array(
                "id" => "ProcessProgress",
            ));
            $html .= "<div id='ProcessProgressText'></div>";            
            $html .= "<div id='ProcessErrors'></div>";            
            
            $html .= getJavaScriptHtml("
                var notRespondCounter = 0;
                function reloadProcessProgress()
                {
                    if ('".$processId."')
                    {
                        AJAX.timeout = 10000;
                        var record = AJAX.getObjectMethod('ProcessManager', 'getProcessInfo', {'processId':'".$processId."','storageType':'stFile','storagePath':'"._PROJECTPATH."/__tmp/'});
                        //alert(record);
                        
                        if (typeof(record['progress']) == 'undefined')
                        {
                            notRespondCounter++;
                            if (notRespondCounter > 10)
                            {
                                getElement('ProcessErrors').innerHTML = '".translate("Install process is not responding, reload page and try again")."';
                            }
                        }
                        else
                        {
                            if (typeof(record['progressText']) == 'undefined' || record['progressText'] == null)
                                record['progressText'] = '';

                            notRespondCounter = 0;
                            getObject('ProcessProgress').setValue(record['progress']);
                            getElement('ProcessProgressText').innerHTML = (record['progress'] == 100 ? '".translate("Install finished")."' : '".translate("Installing").": '+record['progressText']);
                            getElement('ProcessErrors').innerHTML = (typeof(record['errors']) != 'undefined' ? record['errors'] : '');
                        }
                        if (record['progress'] == 100)
                        {
                            if (".toString(toBool($_REQUEST["autoContinue"])).")
                            {
                                getElement('mainForm').submit();
                            }
                            else
                                getElement('continue').style.display = '';
                        }
                        else
                            setTimeout(function(){reloadProcessProgress()}, 4000);
                        
                    }
                    else
                    {
                        getElement('ProcessErrors').innerHTML = 'Error: Process not created';
                    }
                }
                setTimeout(function(){reloadProcessProgress()}, 1000);
            ");

            $html .= "<div><button class='_Button' id='continue' onclick=\"getElement('mainForm').submit();\" style='display:none;'>".translate("Continue")."</button></div>";
        }

        $html .= "</div>";

        return($html);
    }
            
    function getContent_9()
    {
        $html .= "<input type='hidden' name='step' value='".($this->params["step"]+1)."' />";
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";
        $html .= "<h1>".translate("Please setup your developer account").":</h1>";

        $html .= "<span class='status-icon' id='userStatus'></span>";
        $html .= "<div id='checkStatus'></div>";
        $html .= "<div class='' id='installDeveloperAccount' style=''>";
        $html .= "<div><label>".translate("Login")."</label><input class='_TextEdit' type='text' name='developerLogin' value='".$this->params["sqlLogin"]."' title='".translate("Username for your developer account")."'  onkeyup='onDataChange()' /><span class='status-icon' id='developerLoginStatus'></span></div>";
        $html .= "<div><label>".translate("Password")."</label><input class='_TextEdit _ButtonEdit' type='password' name='developerPassword1' value='' title='".translate("Password for your developer account")."'  onkeyup='onDataChange()' /><span class='status-icon'></span></div>";
        $html .= "<div><label>".translate("Re-type Password")."</label><input class='_TextEdit _ButtonEdit' type='password' name='developerPassword2' value='' title='".translate("Password check for your developer account")."'  onkeyup='onDataChange()' /><span class='status-icon' id='developerPasswordStatus'></span></div>";
        $html .= "</div>";

        $html .= getJavaScriptHtml("
            function onDeveloperAccountCheck(result)
            {
                //alert(result);
                result = JSON.decode(result);
                removeClassName('developerLoginStatus', 'status-error');
                removeClassName('developerLoginStatus', 'status-ok');
                removeClassName('developerPasswordStatus', 'status-error');
                removeClassName('developerPasswordStatus', 'status-ok');

                if (result['login'] == 'OK')
                {
                    getElement('checkStatus').innerHTML = '".translate("Test passed")."';
                    addClassName('developerLoginStatus', 'status-ok');
                }
                else
                {
                    //getElement('checkStatus').innerHTML = result['login'];
                    getElement('checkStatus').innerHTML = '';
                    addClassName('developerLoginStatus', 'status-error');
                }
                if (result['password'] == 'OK')
                {
                    getElement('checkStatus').innerHTML = '".translate("Test passed")."';
                    addClassName('developerPasswordStatus', 'status-ok');
                }
                else
                {
                    //getElement('checkStatus').innerHTML = result['password'];
                    getElement('checkStatus').innerHTML = '';
                    addClassName('developerPasswordStatus', 'status-error');
                }
                getElement('continue').style.display = (result['login'] == 'OK' && result['password'] == 'OK' ? '' : 'none');
            }

            function onDeveloperAccountChange()
            {
                //alert(1);
                getElement('continue').style.display = 'none';
                getElement('checkStatus').innerHTML = '';
                getElement('checkStatus').innerHTML = '".translate("Please wait, checking your account")."...';
                AJAX.open('".basename(__FILE__)."?methodName=testDeveloperAccount&developerLogin='+getElement('mainForm').developerLogin.value+'&developerPassword1='+getElement('mainForm').developerPassword1.value+'&developerPassword2='+getElement('mainForm').developerPassword2.value+'&language=".$this->params["language"]."&rand='+time(), onDeveloperAccountCheck);
            }
            function onDataChange()
            {
                clearTimeout(dataChangeTimer);
                dataChangeTimer = setTimeout(function(){onDeveloperAccountChange()}, 1000);
            }            
        ");
        
        $html .= "<div><button class='_Button' id='continue' onclick=\"getElement('mainForm').submit();\" style='display:none;'>".translate("Continue")."</button></div>";
        $html .= "</div>";
        
        return($html);
    }
    
    function getContent_10()
    {
        $html .= "<div class='logo-circle' id='logo-circle' style=''></div>";
        $html .= "<div class='logo-text' id='logo-text' style=''></div>";
        $html .= "<div class='logo-version' id='logo-version'>".INSTALL_VERSION."</div>";
        $html .= "<div class='content'>";

        $finished = true;

        $configFile .= "<?php\r\n";
        
        if (file_exists(PROJECTPATH."visual-php-core"))
        {
            $content = _file_get_contents(PROJECTPATH."config/config.ini.php");
            $content = str_replace("<?php", "", $content);
            $content = str_replace("<?", "", $content);
            $content = str_replace("?>", "", $content);
            $content = str_replace("\r", "", $content);
            $content = str_replace("\n", "\r\n", $content);
            
            $configFile .= "/* Visual PHP 1 config - you may remove this after update */\r\n";
            $configFile .= "/* -------------------------------------------------------*/\r\n";
            $configFile .= $content."\r\n";
            $configFile .= "/* Visual PHP 2 config */\r\n";
            $configFile .= "/* ------------------- */\r\n";
        }

        $configFile .= "\$_CONFIG = array();\r\n";
        $configFile .= "\$_CONFIG[\"defaultDbLink\"] = array(\r\n";
        $configFile .= "   \"object\" => \"".$this->params["databaseType"]."DbLink\",\r\n";
        $configFile .= "   \"params\" => array(\r\n";
        if ($this->params["databaseType"] == "SQLite")
        {
            $configFile .= "      \"file\" => \"".$this->params["dbPath"]."\",\r\n";
        }
        else
        {
            $configFile .= "      \"host\" => \"".$this->params["sqlHost"]."\",\r\n";
            $configFile .= "      \"login\" => \"".$this->params["sqlLogin"]."\",\r\n";
            $configFile .= "      \"password\" => \"".$this->params["sqlPassword"]."\",\r\n";
            $configFile .= "      \"database\" => \"".$this->params["sqlDatabase"]."\",\r\n";
        }
        $configFile .= "   ),\r\n";
        $configFile .= ");\r\n";
        $configFile .= "\$_CONFIG[\"ftp\"] = array(\r\n";
        $configFile .= "   \"host\" => \"".$this->params["ftpHost"]."\",\r\n";
        $configFile .= "   \"login\" => \"".$this->params["ftpLogin"]."\",\r\n";
        $configFile .= "   \"password\" => \"".$this->params["ftpPassword"]."\",\r\n";
        $configFile .= "   \"path\" => \"".$this->params["ftpPath"]."\",\r\n";
        $configFile .= ");\r\n";
        
        global $HOSTINGS;
        if (is_array($HOSTINGS[$this->params["installHosting"]]["globals"]))
        {
            $configFile .= "\$_CONFIG[\"globals\"] = array(\r\n";
            foreach($HOSTINGS[$this->params["installHosting"]]["globals"] as $_globalName => $_globalValue)
                $configFile .= "   \"".$_globalName."\" => ".toString($_globalValue).",\r\n";
            $configFile .= ");\r\n";
        }
        
        $configFile .= "?>";

        // save config
        _file_put_contents(_PROJECTPATH."config/config.ini.php", $configFile);
        
        if (file_exists(PROJECTPATH.".htaccess"))
        {
            $content = _file_get_contents(PROJECTPATH.".htaccess");
            $content = str_replace("RewriteRule ^visual-php-core/.*$ - [PT]", "RewriteRule ^core/.*$ - [PT]\nRewriteRule ^img/.*$ - [PT]\nRewriteRule ^visual-php-core/.*$ - [PT]", $content);
            _file_put_contents(PROJECTPATH.".htaccess", $content);
        }

        // nekdy vyhodi chybu, tak to davam az za 100%
        if ($this->params["installType"] == "empty")
        {
            $files = _glob(PROJECTPATH."*.css");
            foreach($files as $file)
                _unlink($file);
        }

        // nemaze cache na PIPNI
        _rmdir(_PROJECTPATH."cache", true);
        _rmdir(_PROJECTPATH."css", true);
        
        if (!file_exists(_PROJECTPATH."config/config.ini.php"))
        {
            $finished = false;
            $_html .= "<h2 class='error'>".translate("Unable to write config file")."</h2>";
            $_html .= "<div class='error'>".translate("Copy the following settings to a file on your PC called config.ini.php, upload it to the server into the directory /config/ and click on the Reload button.")."</div>";
            $_html .= "<div class='config'><pre>".str_replace("\r\n", "<br />", htmlentities($configFile))."</pre></div>";
        }
        
        
        //$html .= htmlentities($configFile);
        
        // set default project values
        $DbLink = $this->getDbLink();

        if ($this->params["installType"] == "empty")
        {
            $DbLink->truncateTable("settings");
            $DbLink->insertRecord("settings", array("name"=>"siteTitle", "value"=>translate("New project")));
            $DbLink->insertRecord("settings", array("name"=>"siteCharset", "value"=>"UTF-8"));
            $DbLink->insertRecord("settings", array("name"=>"defaultWebLanguage", "value"=>$this->params["language"]));
            $DbLink->insertRecord("settings", array("name"=>"defaultAdminLanguage", "value"=>$this->params["language"]));
            if ($DbLink->error)
            {
                $finished = false;
                $_html .= "<h2 class='error'>".translate("Unable to write settings to database")."</h2>";
                $_html .= "<div class='error'>".$DbLink->error."</div>";
            }
            
            global $LANGUAGEPACKS;
            $DbLink->updateRecord("modules", array("installDate"=>now()), array("filter_id" => CoreModuleId));
            $DbLink->updateRecord("modules", array("installDate"=>now()), array("filter_id" => AdminModuleId));
            $DbLink->updateRecord("modules", array("installDate"=>now()), array("filter_id" => WebModuleId));
            $DbLink->updateRecord("modules", array("installDate"=>now()), array("filter_id" => ($LANGUAGEPACKS[$this->params["language"]] ? $LANGUAGEPACKS[$this->params["language"]] : $LANGUAGEPACKS["en"])));
            if ($DbLink->error)
            {
                $finished = false;
                $_html .= "<h2 class='error'>".translate("Unable to write module install dates to database")."</h2>";
                $_html .= "<div class='error'>".$DbLink->error."</div>";
            }

            /*
            $DbLink->truncateTable("translators");
            if ($this->params["language"] != "en")
            {
                $DbLink->insertRecord("translators", array("id"=>UUID(),"language"=>"en", "default"=>"false"));
                $DbLink->insertRecord("translators", array("id"=>UUID(),"language"=>$this->params["language"], "default"=>"true"));
            }
            else
                $DbLink->insertRecord("translators", array("id"=>UUID(),"language"=>"en", "default"=>"true"));
            */
                
            if ($DbLink->error)
            {
                $finished = false;
                $_html .= "<h2 class='error'>".translate("Unable to write default translator to database")."</h2>";
                $_html .= "<div class='error'>".$DbLink->error."</div>";
            }

            // insert developer account
            $DbLink->truncateTable("admin_users");
            $DbLink->insertRecord("admin_users", array("id"=>UUID(),"login"=>$this->params["developerLogin"], "password"=>md5($this->params["developerPassword1"]), "name"=>"Developer", "developer"=>"true"));
            if ($DbLink->error)
            {
                $finished = false;
                $_html .= "<h2 class='error'>".translate("Unable to write developer account to database")."</h2>";
                $_html .= "<div class='error'>".$DbLink->error."</div>";
            }
        }
        
        if ($this->params["installType"] == "move")
        {
            $records = $DbLink->select("styles");
            foreach($records as $record)
            {
                @unlink(_PROJECTPATH.$record["name"].".css");
            }
        }
        
        if ($finished)
        {
            session_start();
            $_SESSION["authAdminLoginS"] = $this->params["developerLogin"]; 
            $_SESSION["authAdminPasswordS"] = $this->params["developerPassword1"]; 
            session_write_close();
            
            $html .= "<h1>".translate("The installation has been finished")."</h1>";

            $html .= "</div>";
            $html .= "</div>";
            $html .= "</form>";
            $html .= "<div class='content'>";
            if (file_exists(PROJECTPATH."visual-php-core"))
            {
                $html .= "<form action='".PROJECTURL_NC."' target='_blank' method='get' style='display:inline-block'><input type='hidden' name='vphp' value='1'><button class='_Button' id='web' style=''>".translate("View Website")." (Visual PHP™ 1)</button></form>";
                $html .= "&nbsp;&nbsp;&nbsp;";
                $html .= "<form action='".PROJECTURL_NC."' target='_blank' method='get' style='display:inline-block'><input type='hidden' name='vphp' value='2'><button class='_Button' id='web' style=''>".translate("View Website")." (Visual PHP™ 2)</button></form><br /><br />";

                $html .= "<form action='".PROJECTURL_NC."admin/' target='_blank' method='get' style='display:inline-block'><input type='hidden' name='vphp' value='1'><input type='hidden' name='sid' value='".session_id()."'><input type='hidden' name='language' value='".$this->params["language"]."'><button class='_Button' id='admin' style=''>".translate("Enter Administration")." (Visual PHP™ 1)</button></form>";
                $html .= "&nbsp;&nbsp;&nbsp;";
                $html .= "<form action='".PROJECTURL_NC."admin/' target='_blank' method='get' style='display:inline-block'><input type='hidden' name='vphp' value='2'><input type='hidden' name='layoutName' value='VisualPHP1Update'><input type='hidden' name='sid' value='".session_id()."'><input type='hidden' name='language' value='".$this->params["language"]."'><button class='_Button' id='admin' style=''>".translate("Enter Administration")." (Visual PHP™ 2)</button></form>";
            }
            else
            {
                if ($_REQUEST["finishUrl"])
                {
                    header("Location: ".$_REQUEST["finishUrl"]);
                    exit;
                }
                else
                {
                    $html .= "<form action='".PROJECTURL_NC."' target='_blank' method='get' style='display:inline-block'><button class='_Button' id='web' style=''>".translate("View Website")."</button></form>";
                    $html .= "&nbsp;&nbsp;&nbsp;";
                    $html .= "<form action='".PROJECTURL_NC."admin/' target='_blank' method='get' style='display:inline-block'><input type='hidden' name='sid' value='".session_id()."'><input type='hidden' name='language' value='".$this->params["language"]."'><button class='_Button' id='admin' style=''>".translate("Enter Administration")."</button></form>";
                    $html .= "&nbsp;&nbsp;&nbsp;";
                    if ($this->params["installType"] != "move")
                        $html .= "<form action='".PROJECTURL_NC."admin/' target='_blank' method='get' style='display:inline-block'><input type='hidden' name='sid' value='".session_id()."'><input type='hidden' name='language' value='".$this->params["language"]."'><input type='hidden' name='layoutName' value='AdminMarket'><input type='hidden' name='mid' value='4790fefc-512b-47e4-bffb-5c999d4c55f7'><button class='_Button' id='admin' style=''>".translate("Install Modules")."</button></form>";
                }
            }
            $html .= "</div>";
            $html .= "<form>";
            
            _file_put_contents(PROJECTPATH."install.lock", "");
        }
        else
        {
            $html .= "<h1>".translate("The installation cannot be finished!")."</h1>";
            $html .= $_html;
            $html .= "<input type='hidden' name='step' value='".$this->params["step"]."' />";
            $html .= "<div><button class='_Button' id='continue' onclick=\"getElement('mainForm').submit();\" style=''>".translate("Reload")."</button></div>";

            $html .= "</div>";
        }
        
        return($html);
    }
    
    function getDbLink()
    {
        if (!$this->DbLink)
        {
            $this->DbLink = createObject($this->params["databaseType"]."DbLink");
            $this->DbLink->name = "default";
            $this->DbLink->host = $this->params["sqlHost"];
            $this->DbLink->login = $this->params["sqlLogin"];
            $this->DbLink->password = $this->params["sqlPassword"];
            $this->DbLink->database = $this->params["sqlDatabase"];
            $this->DbLink->file = $this->params["dbPath"];
        }
        
        global $DefaultDbLink;
        $DefaultDbLink = $this->DbLink;
        
        return($this->DbLink);
    }
    function testInstallMethod($params)
    {
        $file = UUID().".test";
        
        //var_dump($params);
        if ($params["installMethod"] == "copy")
        {
            ob_start();
            touch("./".$file);
            $errors = ob_get_contents();
            ob_end_clean();
            
            if ($errors)
            {
                return(translate("Unable to write file. Please set up write permissions (chmod 777) to root directory, where install.php is located in"));
            }
            else
            {
                @unlink("./".$file);
                return("OK");
            }
        }
        if ($params["installMethod"] == "ftp")
        {
            //touch("./".$file);
            $result = array();
            if ($this->params["ftpHost"])
            {
                ob_start();
                $connected = $this->ftpConnect();
                $errors = ob_get_contents();
                ob_end_clean();
                if ($connected)
                {
                    $result["ftpHost"] = "OK";
                    
                    ob_start();
                    //var_dump($this->params["ftpLogin"]);
                    //var_dump($this->params["ftpPassword"]);
                    if ($this->params["ftpLogin"] || $this->params["ftpPassword"])
                        $loggedIn = $this->ftpLogin();
                    $errors = ob_get_contents();
                    ob_end_clean();
                    
                    if ($loggedIn)
                    {
                        $result["ftpLogin"] = "OK";
                        
                        ob_start();
                        $chdired = $this->ftpChdir();
                        $errors = ob_get_contents();
                        ob_end_clean();
                        if ($chdired)
                        {
                            $file = UUID().".test";
                            // using ob_* because on some servers it outputs Opening BINARY mode data connection for ...
                            ob_start();
                            ftp_put($this->ftp, $file, __FILE__, FTP_BINARY);
                            $errors = ob_get_contents();
                            ob_end_clean();
                            clearstatcache();
                            if (!COMPILED || file_exists(dirname(__FILE__)."/".$file))
                            {
                                $result["ftpPath"] = "OK";
                            }
                            else
                            {
                                $result["ftpPath"] = translate("Bad FTP path").($errors ? " - ".$errors : "");
                            }
                            @ftp_delete($this->ftp, $file);
                        }
                        else
                            $result["ftpPath"] = $errors;
                    }
                    else
                    {
                        $result["ftpLogin"] = ($errors ? $errors : "Unknown login error");
                    }
                }
                else
                {
                    if ($errors)
                        $result["ftpHost"] = $errors;
                    else
                        $result["ftpHost"] = translate("Unable to connect to ".$this->params["ftpHost"]);
                }
            }
            
            //var_dump($result);
            return(TJSON::encode($result));
        }
    }
    
    function ftpConnect()
    {
        $this->ftp = ftp_connect($this->params["ftpHost"]);
        
        return($this->ftp);
    }

    function ftpDisconnect()
    {
        @ftp_close($this->ftp);

    }

    function ftpLogin()
    {
        //var_dump($this->ftp);
        $ret = ftp_login($this->ftp, $this->params["ftpLogin"], $this->params["ftpPassword"]);
        //$ret = ftp_login($this->ftp, "vphp2install", "teEsHpNt7xe4DzyC");
        
        if ($ret)
            ftp_pasv($this->ftp, true);            
            
        return($ret);
    }

    function ftpChdir()
    {
        if ($this->params["ftpPath"])
            return(ftp_chdir($this->ftp, $this->params["ftpPath"]));
        else
            return(true);
    }
    
    function testDatabaseType($params)
    {
        if ($params["databaseType"])
        {
            $objectName = $params["databaseType"]."DbLink";
            if (class_exists("T".$objectName, false))
            {
                $DbLink = createObject($objectName);
                if ($DbLink->check())
                {
                    return(TJSON::encode(array("status"=>"OK", "inherits"=>get_parent_class($DbLink))));
                }
                else
                {
                    return(TJSON::encode(array("status"=>"Not supported on this server")));
                }
            }
            else
            {
                return(TJSON::encode(array("status"=>"Object ".$objectName." not defined")));
            }
        }
    }    
    
    function testDeveloperAccount($params)
    {
        $ret = array();
        if ($params["developerLogin"])
        {
            $ret["login"] = "OK";
        }
        else
        {
            $ret["login"] = "Please enter username";
        }
        if (($params["developerPassword1"] || $params["developerPassword2"]) && $params["developerPassword1"] == $params["developerPassword2"])
        {
            $ret["password"] = "OK";
        }
        else
        {
            $ret["password"] = translate("Both passwords must be the same");
        }
        
        return(TJSON::encode($ret));
    }
    
    function testDatabase($params)
    {
        if ($params["databaseType"])
        {
            $objectName = $params["databaseType"]."DbLink";
            if (class_exists("T".$objectName, false))
            {
                $DbLink = createObject($objectName);
                $DbLink->host = $this->params["sqlHost"];
                $DbLink->login = $this->params["sqlLogin"];
                $DbLink->password = $this->params["sqlPassword"];
                $DbLink->database = $this->params["sqlDatabase"];
                $DbLink->directory = $this->params["dbPath"];
                $DbLink->file = $this->params["dbPath"];
                
                if ($objectName == "SQLiteDbLink" || get_parent_class($DbLink) == "TFileDbLink")
                {
                    if ($this->params["dbPath"])
                    {
                        return(TJSON::encode(array("path"=>"OK")));
                    }
                    else
                    {
                        return(TJSON::encode(array("path"=>"storage file not specified")));
                    }
                }
                else if ($DbLink->open())
                {
                    return(TJSON::encode(array("host"=>"OK","login"=>"OK","database"=>"OK")));
                }
                else
                {
                    $ret = array();
                    if ($DbLink->errorType == "host")
                    {
                        $ret["host"] = $DbLink->error;
                        return(TJSON::encode($ret));
                    }
                    else
                        $ret["host"] = "OK";
                        
                    if ($DbLink->errorType == "login")
                    {
                        $ret["login"] = $DbLink->error;
                        return(TJSON::encode($ret));
                    }
                    else
                        $ret["login"] = "OK";

                    if ($DbLink->errorType == "database")
                    {
                        if ($this->params["sqlDatabase"])
                        {
                            $ret["database"] = $DbLink->error;
                            return(TJSON::encode($ret));
                        }
                        else
                        {
                            // try to find
                            $ret["database"] = "Database not found";
                            //$ret["databases"] = $DbLink->getDatabases();
                            return(TJSON::encode($ret));
                        }
                    }
                    else
                        $ret["database"] = "OK";

                    if ($DbLink->errorType == "file")
                    {
                        $ret["path"] = $DbLink->error;
                        return(TJSON::encode($ret));
                    }
                    else
                        $ret["path"] = "OK";

                    // we are here? something is wrong - returned unknown error number
                    $ret["host"] = $ret["login"] = $ret["database"] = $ret["path"] = "UNKNOWN ERROR #".$DbLink->error;
                    return(TJSON::encode($ret));
                }
            }
        }
    }   
    
    function getDatabases($params)
    {
        if ($params["databaseType"])
        {
            $objectName = $params["databaseType"]."DbLink";
            if (class_exists("T".$objectName, false))
            {
                $DbLink = createObject($objectName);
                $DbLink->host = $this->params["sqlHost"];
                $DbLink->login = $this->params["sqlLogin"];
                $DbLink->password = $this->params["sqlPassword"];
                $DbLink->database = $this->params["sqlDatabase"];
                $DbLink->directory = $this->params["dbPath"];
                $DbLink->file = $this->params["dbPath"];
                
                $ret["databases"] = $DbLink->getDatabases();
                return(TJSON::encode($ret));
            }
        }
    }    
    
    function getFtpPath($params)
    {
        $this->params = $params;
        if ($this->ftpConnect())
        {
            if ($this->ftpLogin())
            {
                // needed for _ftp_remote_nlist
                global $__ftpConnections;
                if (!is_array($__ftpConnections))
                    $__ftpConnections = array();
                $connectionName = md5($this->params["ftpHost"].$this->params["ftpLogin"].$this->params["ftpPassword"]);
                $__ftpConnections[$connectionName] = array(
                    "host" => $this->params["ftpHost"],
                    "login" => $this->params["ftpLogin"],
                    "password" => $this->params["ftpPassword"],
                    "stream" => $this->ftp,
                );
                
                
                $path = dirname(__FILE__);
                $path = str_replace("\\", "/", $path);
                $path = explode("/", $path);
                
                for ($i = count($path)-1 ; $i >= 0 ; $i--)
                {
                    $dir = array();
                    for ($ii = $i ; $ii < count($path) ; $ii++)
                    {
                        $dir[] = $path[$ii];
                    }
                    if (ftp_file_exists($this->ftp, "/".implode("/", $dir)."/install.php"))
                    {
                        echo "/".implode("/", $dir)."/";
                    }
                }
            }
        }
    }    

    function getDefaultHosting()
    {
        ob_start();
        phpinfo();
        $phpInfo = ob_get_contents();
        ob_end_clean();
        
        $phpInfo = preg_replace("|<td class=\"e\">HTTP_USER_AGENT </td><td class=\"v\">[^<]+</td>|ims", "", $phpInfo);
        $phpInfo = preg_replace("|<td class=\"e\">User-Agent </td><td class=\"v\">[^<]+</td>|ims", "", $phpInfo);
        $phpInfo = preg_replace("|<td class=\"e\">_SERVER\\[\"HTTP_USER_AGENT\"\\]</td><td class=\"v\">[^<]+</td>|ims", "", $phpInfo);
        
        //echo $phpInfo;
        //exit;
        global $HOSTINGS;
        foreach(array_reverse($HOSTINGS) as $name => $hosting)
        {
            if ($hosting["phpinfo"] && stripos($phpInfo, $hosting["phpinfo"]))
            {
                return($name);
            }
        }
        
        return("unknown");
        
    }
    
    function phpInfo()
    {
        phpinfo();
    }
    
    function testServer()
    {
        /*
        $content = download("http://www.visual-php.com");    
        if (!$content)
            $errors[] = "Unable to connect to www.visual-php.com";
        
        $content = download(PROJECTURL_NC."install.php");    
        if (!$content)
            $errors[] = "Unable to connect to itself in background";
        */
        $url = "http://www2.visual-php.com/scripts.php?tid=install_download&moduleId=test";
        $headers = download($url, array(), array(), array("headersOnly"=>true,"headersAsArray"=>true));
        //var_dump($headers);
        //exit;
        if (!$headers["Content-Length"])
            $errors[] = "Unable to download headers for file downloading";
        //var_dump($headers);
        
        $buffer = download($url, array(), array(), array("range"=>(0)."-".(4)));
        if ($buffer != "12345")
            $errors[] = "Unable to download data for file downloading";

        $buffer = download($url, array(), array(), array("range"=>(5)."-".(9)));
        if ($buffer != "67890")
            $errors[] = "Unable to download data for file downloading";
        
        
        //var_dump(_curl_disabled());
        //var_dump($headers);
        //exit;
        
        return($errors);
    }

    function getCSS($params) 
    {
        // IE needed
        header("Content-type: text/css");
        
        if (COMPILED)
        {
            $css = getCompiledFile($params["file"]);
            //$css = str_replace("core/classes/_new/Install/", "", $css);
        }
        else
        {
            $css = _file_get_contents($params["file"]);
        }
        
        $css = parsePHP($css);
        $CSS3Converter = getObject("CSS3Converter");

        //var_dump(PROJECTPATH);
        //var_dump(PROJECTURL);
        //var_dump($CSS3Converter->url);
        //var_dump($CSS3Converter->url);
        //exit;
        $css = $CSS3Converter->convert($css);

        if (COMPILED)
        {
            // need to convert linear gradient
            $css = str_replace("linear-gradient.php?", "install.php?ajaxViewType=vtInclude&file=/core/classes/_new/CSS3Converter/linear-gradient.php&", $css);
        }
        
        return($css);
    }
}  

// TO store FTP account
$Settings = new TSettings();
$Settings->setProperties($_REQUEST);

header("Content-Type: text/html;charset=utf-8");
header("Vary: Accept");


global $language;
$language = $_REQUEST["language"];

//var_dump($_REQUEST);
//exit;
if ($_REQUEST["ajaxViewType"] == "vtProcess")
{
    $ProcessManager = createObject("ProcessManager");
    $ProcessManager->storageType = "stFile";
    $ProcessManager->storagePath = _PROJECTPATH."/__tmp/";
    
    $Process = $ProcessManager->loadProcess($_REQUEST["processId"]);
    $_CONFIG["ftp"] = array(
        "host" => $Process->params["ftpHost"],
        "login" => $Process->params["ftpLogin"],
        "password" => $Process->params["ftpPassword"],
        "path" => $Process->params["ftpPath"],
    );
    
    $ProcessManager->start($_REQUEST["processId"]);
    //if ($coreMessagesArray)    
        //var_dump($coreMessagesArray);
}
else if ($_REQUEST["ajaxViewType"] == "vtInclude")
{
    $php = getCompiledFile($_REQUEST["file"]);
    
    /* in code may be echo "<?xml version=\"1.0\"?>\n"; */
    
    $php = str_replace("\r", "", $php);
    $php = str_replace("<?php\n", "", $php);
    $php = str_replace("<?\n", "", $php);
    $php = str_replace("\n?>", "", $php);
    eval($php);
}
else if ($_REQUEST["ajaxViewType"] == "vtObject")
{
    $Object = createObject($_REQUEST["objectName"]);
    $methodName = $_REQUEST["methodName"];
    
    $ret = $Object->$methodName($_REQUEST);
    if (is_array($ret))
        $ret = TJSON::encode($ret);
        
    echo $ret;
}
else
{
    if (!$_GET["step"])
        $_GET["step"] = 1;

    $Install = new TInstall($_REQUEST);
    
    $methodName = $_REQUEST["methodName"];
    if ($methodName)
        echo $Install->$methodName($_REQUEST);
    else
        echo $Install->getContent();
}

exit;
?>
Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ29yZS9mdW5jdGlvbnMuc3lzdGVtLnBocCAtLS0tLS0tIA0KCiAgICBmdW5jdGlvbiBnZXRJU09MYW5ndWFnZSgkbGFuZ3VhZ2U9TlVMTCkKICAgIHsKICAgICAgICBpZiAoJGxhbmd1YWdlID09PSBOVUxMKQogICAgICAgICAgICAkbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZSgpOwogICAgICAgICAgICAKICAgICAgICAvLyRsYW5ndWFnZSA9IHN0cl9yZXBsYWNlKCJjeiIsICJjcyIsICRsYW5ndWFnZSk7CgogICAgICAgIHJldHVybigkbGFuZ3VhZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldExvY2FsZSgkbGFuZ3VhZ2U9TlVMTCkKICAgIHsKICAgICAgICBpZiAoJGxhbmd1YWdlID09PSBOVUxMKQogICAgICAgICAgICAkbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZSgpOwogICAgICAgICAgICAKICAgICAgICAkVHJhbnNsYXRvciA9IGdldE9iamVjdCgiVHJhbnNsYXRvcnMiKS0+Z2V0VHJhbnNsYXRvcigkbGFuZ3VhZ2UpOwogICAgICAgIGlmICgkVHJhbnNsYXRvcikKICAgICAgICAgICAgcmV0dXJuKCRUcmFuc2xhdG9yLT5nZXRMb2NhbGUoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2ltcGxlTG9jYWxlKCRsYW5ndWFnZT1OVUxMKQogICAgewogICAgICAgIGlmICgkbGFuZ3VhZ2UgPT09IE5VTEwpCiAgICAgICAgICAgICRsYW5ndWFnZSA9IGdldExhbmd1YWdlKCk7CiAgICAgICAgICAgIAogICAgICAgICRUcmFuc2xhdG9yID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9ycyIpLT5nZXRUcmFuc2xhdG9yKCRsYW5ndWFnZSk7CiAgICAgICAgaWYgKCRUcmFuc2xhdG9yKQogICAgICAgICAgICByZXR1cm4oJFRyYW5zbGF0b3ItPmdldFNpbXBsZUxvY2FsZSgpKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gc3dhcCgmJHgsJiR5KSAKICAgIHsKICAgICAgICAkdG1wPSR4OwogICAgICAgICR4PSR5OwogICAgICAgICR5PSR0bXA7CiAgICB9CiAgICBmdW5jdGlvbiBjbGVhclRvRGVsZXRlRGlyKCkKICAgIHsKICAgIC8vIC0tLS0tLS0tLS0tLS0tLSBkZWxheWVkIHJtZGlyIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAkZGlyZWN0b3J5ID0gTUFJTlBBVEguImNhY2hlL19fdG9kZWxldGUiOwogICAgJGkgPSAwOwogICAgJG1heCA9IDUwOwogICAgaWYgKF9maWxlX2V4aXN0cygkZGlyZWN0b3J5KSkKICAgIHsKICAgICAgICAvLyB3ZSBvcGVuIHRoZSBkaXJlY3RvcnkKICAgICAgICAkaGFuZGxlID0gQG9wZW5kaXIoJGRpcmVjdG9yeSk7CgogICAgICAgICR0aW1lVG90YWwgPSAwOwogICAgICAgICR0aW1lTWF4ID0gMC41MDA7CgogICAgICAgIC8vIGFuZCBzY2FuIHRocm91Z2ggdGhlIGl0ZW1zIGluc2lkZQogICAgICAgIHdoaWxlIChGQUxTRSAhPT0gKCRpdGVtID0gQHJlYWRkaXIoJGhhbmRsZSkpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0aW1lVG90YWwgPiAkdGltZU1heCB8fCAkaSA+PSAkbWF4KQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlcG9pbnRlciBpcyBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgICAgICAgICAgIC8vIG9yIHRoZSBwYXJlbnQgZGlyZWN0b3J5CiAgICAgICAgICAgIGlmKCRpdGVtICE9ICcuJyAmJiAkaXRlbSAhPSAnLi4nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3ZSBidWlsZCB0aGUgbmV3IHBhdGggdG8gZGVsZXRlCiAgICAgICAgICAgICAgICAkZGlyZWN0b3J5MiA9ICRkaXJlY3RvcnkuJy8nLiRpdGVtOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBuZXcgcGF0aCBpcyBhIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRkaXJlY3RvcnkyKSkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb3BlbiB0aGUgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgJGhhbmRsZTIgPSBAb3BlbmRpcigkZGlyZWN0b3J5Mik7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEZBTFNFICE9PSAoJGl0ZW0yID0gQHJlYWRkaXIoJGhhbmRsZTIpKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRpdGVtMiAhPSAnLicgJiYgJGl0ZW0yICE9ICcuLicpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lU3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYnVpbGQgdGhlIG5ldyBwYXRoIHRvIGRlbGV0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhdGgyID0gJGRpcmVjdG9yeTIuJy8nLiRpdGVtMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBfdW5saW5rKCRwYXRoMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lRW5kID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVUb3RhbCArPSAoJHRpbWVFbmQtJHRpbWVTdGFydCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aW1lVG90YWwgPiAkdGltZU1heCB8fCAkaSA+PSAkbWF4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGkgPj0gJG1heCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBAY2xvc2VkaXIoJGhhbmRsZTIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGRpcmVjdG9yeTIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZW1vdmUgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBAcm1kaXIoJGRpcmVjdG9yeTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGNsb3NlIHRoZSBkaXJlY3RvcnkKICAgICAgICBAY2xvc2VkaXIoJGhhbmRsZSk7CiAgICAgICAgQHJtZGlyKCRkaXJlY3RvcnkpOwogICAgfQp9ICAgIAogICAgCiAgICBmdW5jdGlvbiBpc011bHRpbGFuZ3VhZ2VWYWx1ZSgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgICAgIHJldHVybih0cnVlKTsKICAgICAgICAKICAgICAgICByZXR1cm4oc3RycG9zKCR2YWx1ZSwgIl9MKCIpID09PSAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRNdWx0aWxhbmd1YWdlVmFsdWUoJHZhbHVlLCAkbGFuZ3VhZ2U9IiIpCiAgICB7CiAgICAgICAgaWYgKCEkbGFuZ3VhZ2UpCiAgICAgICAgICAgICRsYW5ndWFnZSA9IGdldExhbmd1YWdlKCk7CiAgICAKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICAgICAgcmV0dXJuKCR2YWx1ZVskbGFuZ3VhZ2VdKTsKICAgICAgICAKICAgICAgICBpZiAoaXNNdWx0aWxhbmd1YWdlVmFsdWUoJHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgICRvbGRMYW5ndWFnZSA9IGdldExhbmd1YWdlKCk7CiAgICAgICAgICAgIHNldExhbmd1YWdlKCRsYW5ndWFnZSk7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifF9bTF1cXCgoey4qP30pXFwpfHMiLCAkdmFsdWUsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkZWxlbXMgYXMgJGVsZW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSAkZWxlbVsxXTsKICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcXCgiLCAiKCIsICRjb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcXCkiLCAiKSIsICRjb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IHRyYW5zbGF0ZSgkY29udGVudCk7CgogICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IHN1YnN0cl9yZXBsYWNlKCR2YWx1ZSwgJGNvbnRlbnQsIHN0cnBvcygkdmFsdWUsICRlbGVtWzBdKSwgc3RybGVuKCRlbGVtWzBdKSk7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0TGFuZ3VhZ2UoJG9sZExhbmd1YWdlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybigkdmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE11bHRpbGFuZ3VhZ2VWYWx1ZXMoJHZhbHVlKQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKQogICAgICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgICAgICAKICAgICAgICBpZiAoaXNNdWx0aWxhbmd1YWdlVmFsdWUoJHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgICR2YWx1ZSA9IHN1YnN0cigkdmFsdWUsIDMsIHN0cmxlbigkdmFsdWUpLTQpOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKFRKU09OOjpkZWNvZGUoJHZhbHVlLCBhcnJheSgpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGFycmF5KCIiPT4kdmFsdWUpKTsKICAgICAgICAKICAgICAgICAvL3JldHVybihhcnJheSgpKTsKICAgIH0KICAgIAogICAgLy8gaWYgbm90IHRyYW5zbGF0aW9uIGV4aXN0cyAtIHJldHVybiAiIgogICAgZnVuY3Rpb24gdHJhbnNsYXRleCgkdGV4dCwgJGxhbmc9IiIsICRqc29uPXRydWUpCiAgICB7CiAgICAgICAgJF90ZXh0ID0gJHRleHQ7CiAgICAgICAgCiAgICAgICAgJHRleHQgPSB0cmFuc2xhdGUoJHRleHQsICRsYW5nLCAkanNvbik7CiAgICAgICAgaWYgKCR0ZXh0ICE9ICRfdGV4dCkKICAgICAgICAgICAgcmV0dXJuKCR0ZXh0KTsKICAgIAogICAgICAgIHJldHVybigiIik7CiAgICB9CiAgICAKCWZ1bmN0aW9uIHRyYW5zbGF0ZSgkdGV4dCwgJGxhbmc9IiIsICRqc29uPXRydWUpCiAgICB7CiAgICAgICAgaWYgKGlzVVVJRCh0cmltKCR0ZXh0KSkpCiAgICAgICAgICAgIHJldHVybigkdGV4dCk7CiAgICAgICAgaWYgKGlzTnVtYmVyKHRyaW0oJHRleHQpKSkKICAgICAgICAgICAgcmV0dXJuKCR0ZXh0KTsKICAgICAgICAKICAgICAgICBzdGFydFByb2ZpbGUoInRyYW5zbGF0ZSgpIik7CiAgICAgICAgJF90ZXh0ID0gJHRleHQ7CiAgICAgICAgLy9yZXR1cm4oIlQiKTsKICAgICAgICAvL2R1bXAoJHRleHQpOwogICAgICAgIC8vJHRleHQgPSBwYXJzZUNvbmRpdGlvbmFscygkdGV4dCwgJGxhbmd1YWdlKTsgLy8gcGFyc2VzICNpZiwgI2xhbmcKICAgICAgICBpZiAoaXNfYXJyYXkoJHRleHQpKQogICAgICAgIHsKICAgICAgICAgICAgc3RvcFByb2ZpbGUoInRyYW5zbGF0ZSgpIik7CiAgICAgICAgICAgIHJldHVybigkdGV4dFskbGFuZ10pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RycG9zKCR0ZXh0LCAiaHR0cDoiKSA9PT0gMCB8fCBzdHJwb3MoJHRleHQsICJodHRwczoiKSA9PT0gMCB8fCBzdHJwb3MoJHRleHQsICJqYXZhc2NyaXB0OiIpID09PSAwIHx8IHN0cnBvcygkdGV4dCwgIm1haWx0bzoiKSA9PT0gMCB8fCBpc1VVSUQoJHRleHQpIHx8IHByZWdfbWF0Y2goInxeWzAtOVxcLixdK1wkfCIsICR0ZXh0KSkKICAgICAgICAgICAgcmV0dXJuKCR0ZXh0KTsKCiAgICAgICAgaWYgKHN0cnBvcygkdGV4dCwgIl9MKCIpICE9PSBGQUxTRSkgLy8gYWxzbyBpbiBvblBhcnNlSHRtbCBldmVudAogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkdGV4dCwgIl9MKCIpID09IDApCiAgICAgICAgICAgICAgICAkc2tpcFRyYW5zbGF0b3IgPSB0cnVlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICR0ZXh0ID0gdHJhbnNsYXRlbCgkdGV4dCwgJGxhbmcpOwogICAgICAgICAgICAKICAgICAgICAgICAgc3RvcFByb2ZpbGUoInRyYW5zbGF0ZSgpIik7CiAgICAgICAgICAgIHJldHVybigkdGV4dCk7CiAgICAgICAgICAgIC8vZHVtcCgkdGV4dCk7CiAgICAgICAgICAgIC8vJHRleHQgPSBzdWJzdHIodHJpbSgkdGV4dCksIDMsIHN0cmxlbigkdGV4dCktNCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdHJwb3MoJHRleHQsICJfVCgiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICBzdG9wUHJvZmlsZSgidHJhbnNsYXRlKCkiKTsKICAgICAgICAgICAgLy9yZXR1cm4oJHRleHQpOwogICAgICAgICAgICByZXR1cm4odHJhbnNsYXRldCgkdGV4dCwgJGxhbmcpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkanNvbiAmJiBUSlNPTjo6aXNKU09OKCR0ZXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiISEhIik7CiAgICAgICAgICAgIC8vZHVtcCgkdGV4dCk7CiAgICAgICAgICAgICR0ZXh0ID0gVEpTT046OmRlY29kZSgkdGV4dCk7CiAgICAgICAgICAgIC8vZHVtcCgkdGV4dCk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRleHQpOwoKICAgICAgICAgICAgaWYgKCRsYW5nID09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0RXhpc3RzKCJUcmFuc2xhdG9yIikpIC8vIGt2dWxpIHBydm5pbXUgc3B1c3RlbmkKICAgICAgICAgICAgICAgICAgICAkVHJhbnNsYXRvciA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3JzIiktPmdldFRyYW5zbGF0b3IoZ2V0TGFuZ3VhZ2UoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXQgPSAkdGV4dFtmaXJzdF92YWx1ZSgkVHJhbnNsYXRvci0+bGFuZ3VhZ2UsIGdldExhbmd1YWdlKCkpXTsKICAgICAgICAgICAgaWYgKCEkcmV0ICYmICRUcmFuc2xhdG9yLT5hbHRlcm5hdGl2ZVRyYW5zbGF0b3IgJiYgJFRyYW5zbGF0b3ItPmFsdGVybmF0aXZlVHJhbnNsYXRvciAhPSAkVHJhbnNsYXRvci0+bGFuZ3VhZ2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXQgPSB0cmFuc2xhdGUoJHRleHQsICRUcmFuc2xhdG9yLT5hbHRlcm5hdGl2ZVRyYW5zbGF0b3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzdG9wUHJvZmlsZSgidHJhbnNsYXRlKCkiKTsKICAgICAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2FycmF5KCR0ZXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIHN0b3BQcm9maWxlKCJ0cmFuc2xhdGUoKSIpOwogICAgICAgICAgICByZXR1cm4oImFycmF5Iik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgaWYgKHN0cmlwb3MoJHRleHQsICJ7I2xhbmcoIikgIT09IEZBTFNFIHx8IHN0cmlwb3MoJHRleHQsICJsYW5nPVwiIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgJHRyYW5zbGF0ZWRUZXh0ID0gcGFyc2VDb25kaXRpb25hbHMoJHRleHQsICRsYW5ndWFnZSk7IC8vIHBhcnNlcyAjaWYsICNsYW5nCiAgICAgICAgfQogICAgCWVsc2UKICAgICAgICB7CiAgICAgICAgKi8KICAgIAkgICAgaWYgKCRsYW5nID09ICIiKQogICAgCSAgICB7CiAgICAJCSAgICAvL2lmIChvYmplY3RFeGlzdHMoIlRyYW5zbGF0b3IiKSkgLy8ga3Z1bGkgcHJ2bmltdSBzcHVzdGVuaQogICAgCQkJLy8gICAgJFRyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKTsKICAgICAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgJFRyYW5zbGF0b3JzID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9ycyIpOwogICAgICAgICAgICAgICAgICAgICRUcmFuc2xhdG9yID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9ycyIpLT5nZXRUcmFuc2xhdG9yKGdldExhbmd1YWdlKCkpOwogICAgICAgICAgICAgICAgLy99CiAgICAJICAgIH0KICAgIAkgICAgZWxzZQogICAgCSAgICB7CiAgICAJCSAgICAkVHJhbnNsYXRvciA9IGdldE9iamVjdCgiVHJhbnNsYXRvcnMiKS0+Z2V0VHJhbnNsYXRvcigkbGFuZyk7CiAgICAgICAgICAgICAgICAvL2R1bXAoJGxhbmcpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRUcmFuc2xhdG9yLT5sYW5ndWFnZSk7CiAgICAJICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICgkdGFibGVOYW1lICE9ICIiKQogICAgICAgICAgICB7CiAgICAgICAgCSAgICAkX3RleHQgPSAkdGFibGVOYW1lLiI6OiIuJHRleHQ7CgkgICAgICAgICAgICBpZiAoJFRyYW5zbGF0b3IpCiAgICAJICAgICAgICB7ICAgCQogICAgCQkJICAgICR0cmFuc2xhdGVkVGV4dCA9ICRUcmFuc2xhdG9yLT50cmFuc2xhdGUoJF90ZXh0KTsKCSAgICAJICAgICAgICBpZiAoJHRyYW5zbGF0ZWRUZXh0ICE9ICRfdGV4dCkKCSAgICAJICAgIAkgICAgcmV0dXJuKCR0cmFuc2xhdGVkVGV4dCk7CiAgICAJICAgICAgICB9ICAgIAkJCQogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoJFRyYW5zbGF0b3IgJiYgISRza2lwVHJhbnNsYXRvcikKICAgICAgICAgICAgeyAgIAkKICAgICAgICAKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRleHQpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+cmVjb3Jkc1siQ2hhbmdlIGUtbWFpbCJdKTsgZXhpdDsKICAgICAgICAgICAgICAgICR0cmFuc2xhdGVkVGV4dFggPSAkVHJhbnNsYXRvci0+dHJhbnNsYXRlKCR0ZXh0KTsKICAgICAgICAgICAgICAgIGlmICgkdHJhbnNsYXRlZFRleHRYICE9IHRyaW0oJHRleHQpKQogICAgICAgICAgICAgICAgICAgICR0cmFuc2xhdGVkVGV4dCA9ICR0cmFuc2xhdGVkVGV4dFg7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgJHRyYW5zbGF0ZWRUZXh0ID0gJHRleHQ7CiAgICAgICAgICAgIAoJCQkgICAgLy8gVE9ETyBhbHRlcm5hdGl2ZSB0cmFuc2xhdG9yCiAgICAgICAgICAgICAgICAvLyBUT0RPIC0gY2hlY2sgYWxzbyBwZXJmb3JtYW5jZSBhZnRlci4uLiEhISEKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIHRyeSB0byB0cmFuc2xhdGUgdGFiU2hlZXRYWFhYIGFuZCBwYWdlQ29udHJvbFhYWFgKICAgIAkgICAgICAgIGlmICgkdHJhbnNsYXRlZFRleHQgPT0gJHRleHQgJiYgKHN0cnBvcygkdGV4dCwgInRhYlNoZWV0IikgPT09IDAgfHwgc3RycG9zKCR0ZXh0LCAicGFnZUNvbnRyb2wiKSA9PT0gMCkpCiAgICAgICAgCSAgICB7CiAgICAgICAgCQkgICAgaWYgKHN0cnBvcygkdGV4dCwgInRhYlNoZWV0IikgPT09IDApCgkgICAgCQkgICAgewogICAgCQkJCSAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJ0YWJTaGVldCIsICIiLCAkdGV4dCk7CiAgICAJCQkJICAgICR0ZXh0WzBdID0gc3RydG9sb3dlcigkdGV4dFswXSk7CiAgICAJCQkJICAgICR0cmFuc2xhdGVkVGV4dCA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpLT50cmFuc2xhdGUoJHRleHQpOwogICAgCQkJICAgIH0KICAgICAgICAJCSAgICBpZiAoc3RycG9zKCR0ZXh0LCAicGFnZUNvbnRyb2wiKSA9PT0gMCkKCSAgICAJCSAgICB7CgkgICAgCQkJICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoInRhYlNoZWV0IiwgIiIsICR0ZXh0KTsKICAgIAkJCQkgICAgJHRleHRbMF0gPSBzdHJ0b2xvd2VyKCR0ZXh0WzBdKTsKICAgIAkJCQkgICAgJHRyYW5zbGF0ZWRUZXh0ID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9yIiktPnRyYW5zbGF0ZSgkdGV4dCk7CiAgICAJCQkgICAgfQogICAJCQkJICAgIGlmICgkdHJhbnNsYXRlZFRleHQgPT0gJHRleHQpCgkgICAJCQkJICAgICR0cmFuc2xhdGVkVGV4dFswXSA9IHN0cnRvdXBwZXIoJHRyYW5zbGF0ZWRUZXh0WzBdKTsKICAgIAkgICAgICAgIH0KICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAJICAgIGlmICgkdHJhbnNsYXRlZFRleHQgPT0gJHRleHQgJiYgKHN0cnBvcygkdGV4dCwgImh0dHAiKSAhPT0gMCkgJiYgKHN0cnBvcygkdGV4dCwgIl8iKSAhPT0gRkFMU0UgfHwgJHRleHRbMF0gPT0gc3RydG9sb3dlcigkdGV4dFswXSkgKSkKCQkJICAgIHsKCSAgICAJCSAgICAkdHJhbnNsYXRlZFRleHQgPSBzdHJfcmVwbGFjZSgiXyIsICIgIiwgJHRyYW5zbGF0ZWRUZXh0KTsKCSAgICAJICAgICAgICAvLyBtYWtlIGFsbCBmaXJzdCBsZXR0ZXJzIHVwcGVyY2FzZQoJICAgIAkgICAgICAgICR0cmFuc2xhdGVkVGV4dCA9IHVjd29yZHMoJHRyYW5zbGF0ZWRUZXh0KTsKCSAgICAJICAgICAgICAkdHJhbnNsYXRlZFRleHQgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKS0+dHJhbnNsYXRlKCR0cmFuc2xhdGVkVGV4dCk7CgkgICAgCSAgICB9CgkgICAgCSAgICAqLwogICAgICAgICAgICB9CgkJICAgIGVsc2UKICAgICAgICAJICAgICR0cmFuc2xhdGVkVGV4dCA9ICR0ZXh0OwogICAgICAgIC8qfQkqLwoKICAgICAgICBzdG9wUHJvZmlsZSgidHJhbnNsYXRlKCkiKTsKICAgICAgICByZXR1cm4oJHRyYW5zbGF0ZWRUZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVsKCR0ZXh0LCAkbGFuZz0iIiwgJHRha2VGaXJzdD10cnVlKQogICAgewogICAgICAgIGlmICghaXNfc3RyaW5nKCR0ZXh0KSkKICAgICAgICAgICAgcmV0dXJuKCR0ZXh0KTsKICAgICAgICAKICAgICAgICBpZiAoISRsYW5nKQogICAgICAgICAgICAkbGFuZyA9IGdldExhbmd1YWdlKCk7CiAgICAKICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgifF9bTF1cXCgoey4qP30pXFwpfHMiLCAkdGV4dCwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIAogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifF9MXFwoKHsuKj99KVxcKXxzIiwgJHRleHQsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKSAKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJGVsZW1zIGFzICRlbGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9ICRlbGVtWzFdOwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgInsmcXVvdDsiKSA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IGh0bWxfZW50aXR5X2RlY29kZSgkY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAie1xcXCIiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcXCIsICIiLCAkY29udGVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiByZXBsYWNlZCBieSB1c2luZyBzdHJfcmVwbGFjZSAiIGFzICcgZm9yIEhUTUwgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgIntcXFxcJyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxcXFwnIiwgIlxcJyIsICRjb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICJ7XFwnIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXFwnIiwgIlwiIiwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgInsnIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiJyIsICJcIiIsICRjb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgLy8gdG9obGUgbmV2aW0gayBjZW11Li4gCiAgICAgICAgICAgICAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcXCgiLCAiKCIsICRjb250ZW50KTsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxcKSIsICIpIiwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAie1wiIikgIT09IDApIC8vIGluIGphdmFzY3JpcHRzIGFuZCBvdGhlciBtYXkgYmUgSlNPTmVkIHN0cmluZ3MgY29udGFpbmluZyBfTCgpIGFzIGp1c3QgdmFsdWUgYW5kIHdlIGRvbnQgd2FudCBpdCB0byBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAgICAgJF9jb250ZW50ID0gJGNvbnRlbnQ7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IFRKU09OOjpkZWNvZGUoJGNvbnRlbnQsICRjb250ZW50KTsKICAgICAgICAgICAgICAgIC8vJGNvbnRlbnQgPSBUSlNPTjo6ZGVjb2RlKCRjb250ZW50KTsKICAgICAgICAgICAgICAgIGlmICgkY29udGVudCA9PSAkX2NvbnRlbnQpICAvLyBzb21lIGVycm9yIG9uIGRlY29kaW5nIG9mIEpTT04gb2NjdXJlZCAtIGVycm9yIHdpbGwgYmUgc2hvd24KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9kdW1wKCRjb250ZW50KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCEkbGFuZykKICAgICAgICAgICAgICAgICAgICAkbGFuZyA9IGdldExhbmd1YWdlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRjb250ZW50MiA9ICRjb250ZW50WyRsYW5nXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCEkY29udGVudDIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGFsdExhbmcgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3JzIiktPmdldFRyYW5zbGF0b3IoJGxhbmcpLT5hbHRlcm5hdGl2ZUxhbmd1YWdlOwogICAgICAgICAgICAgICAgICAgIGlmICgkYWx0TGFuZykKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQyID0gJGNvbnRlbnRbJGFsdExhbmddOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCR0YWtlRmlyc3QpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGNvbnRlbnQgYXMgJGNvbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY29udCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudDIgPSAkY29udDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8genB1c29idWplIHByb2JsZW15IC0gbmFocmF6dWplIG5la3RlcmUgdGFneSBuYXByLiB2IHRhYnVsa2FjaAogICAgICAgICAgICAgICAgLy8kY29udGVudCA9IHRyYW5zbGF0ZSgkY29udGVudCwgJGxhbmcpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkY29udGVudCA9ICRjb250ZW50MjsKICAgICAgICAgICAgICAgICR0ZXh0ID0gc3Vic3RyX3JlcGxhY2UoJHRleHQsICRjb250ZW50LCBzdHJwb3MoJHRleHQsICRlbGVtWzBdKSwgc3RybGVuKCRlbGVtWzBdKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZHVtcCgkdGV4dCk7CiAgICAgICAgICAgIH0gICAgICAgICAgICAKICAgICAgICAgICAgLy9yZXR1cm4oJHRleHQpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHRleHQpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiB0cmFuc2xhdGV0KCR0ZXh0LCAkbGFuZz0iIikKICAgIHsKICAgICAgICBpZiAoIWlzX3N0cmluZygkdGV4dCkpCiAgICAgICAgICAgIHJldHVybigkdGV4dCk7CiAgICAgICAgCiAgICAgICAgaWYgKCEkbGFuZykKICAgICAgICAgICAgJGxhbmcgPSBnZXRMYW5ndWFnZSgpOwogICAgCiAgICAgICAgLy9pZiAocHJlZ19tYXRjaF9hbGwoInxfW1RdXFwoKC4qP1teXFxcXF0pXFwpfHMiLCAkdGV4dCwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8X1RcXCgoLio/W15cXFxcXSlcXCl8cyIsICR0ZXh0LCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJGVsZW1zIGFzICRlbGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9ICRlbGVtWzFdOwogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXFwoIiwgIigiLCAkY29udGVudCk7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcXCkiLCAiKSIsICRjb250ZW50KTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkY29udGVudCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygiYmVmb3JlVHJhbnNsYXRlVCIsIGFycmF5KCJ0ZXh0Ij0+JGNvbnRlbnQpLCAidGV4dCIpOwoKICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICIlIikgIT09IEZBTFNFICYmIHN0cnBvcygkY29udGVudCwgInwiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBleHBsb2RlKCJ8IiwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gdHJhbnNsYXRlZigkY29udGVudFswXSwgJGNvbnRlbnRbMV0sICRjb250ZW50WzJdLCAkY29udGVudFszXSwgJGNvbnRlbnRbNF0sICRjb250ZW50WzVdLCAkY29udGVudFs2XSwgJGNvbnRlbnRbN10sICRjb250ZW50WzhdLCAkY29udGVudFs5XSk7ICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gdHJhbnNsYXRlKCRjb250ZW50KTsKCiAgICAgICAgICAgICAgICAkdGV4dCA9IHN1YnN0cl9yZXBsYWNlKCR0ZXh0LCAkY29udGVudCwgc3RycG9zKCR0ZXh0LCAkZWxlbVswXSksIHN0cmxlbigkZWxlbVswXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgcmV0dXJuKCR0ZXh0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdHJhbnNsYXRlZigkdGV4dCwgJHAxPW51bGwsICRwMj1udWxsLCAkcDM9bnVsbCwgJHA0PW51bGwsICRwNT1udWxsLCAkcDY9bnVsbCwgJHA3PW51bGwsICRwOD1udWxsLCAkcDk9bnVsbCwgJHAxMD1udWxsKQogICAgewogICAgICAgIHJldHVybihzcHJpbnRmKHRyYW5zbGF0ZSgkdGV4dCksICRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTApKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdHJhbnNsYXRlZmwoJHRleHQsICRsYW5nLCAkcDE9bnVsbCwgJHAyPW51bGwsICRwMz1udWxsLCAkcDQ9bnVsbCwgJHA1PW51bGwsICRwNj1udWxsLCAkcDc9bnVsbCwgJHA4PW51bGwsICRwOT1udWxsLCAkcDEwPW51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuKHNwcmludGYodHJhbnNsYXRlKCR0ZXh0LCAkbGFuZyksICRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTApKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVEYXRlKCR0ZXh0LCAkYXNUZXh0PXRydWUsICRkYXlPZldlZWs9ZmFsc2UpCiAgICB7CgkJJHJldCA9ICIiOwoJCWlmICgkdGV4dCA9PSAiIikKCQl7CgkJCXJldHVybigiIik7CgkJfQoJCWVsc2UgCgkJewogICAgICAgICAgICBpZiAoZ2V0dHlwZSgkdGV4dCkgPT0gImludGVnZXIiKQogICAgICAgICAgICAgICAgJHVuaXhUaW1lID0gJHRleHQ7CiAgICAgICAgICAgIGVsc2UKCQkJICAgICR1bml4VGltZSA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpLT5nZXRVbml4VGltZSgkdGV4dCk7CgoJCQkvL2R1bXAoZGF0ZSgiWS1tLWQgSDppOnMiLCAkdW5peFRpbWUpKTsKCQkKCQkJJHJldCA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpLT5nZXREYXRlKCR1bml4VGltZSwgJGFzVGV4dCk7CgkJCiAgICAgICAgCWlmICgkZGF5T2ZXZWVrICYmICR1bml4VGltZSA+IDApCiAgICAgICAgCXsKCSAgICAgICAJCSRyZXQgPSB0cmFuc2xhdGUoZGF0ZSgiRCIsICR1bml4VGltZSkpLiIgIi4kcmV0OwogICAgICAgIAl9CiAgICAgICAgCiAgICAgICAgCXJldHVybigkcmV0KTsKCQl9CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNsYXRlU3FsRGF0ZSgkdGV4dCkKICAgIHsKICAgICAgICAkQ29tcG9uZW50ID0gbmV3IFREYXRlVGltZUVkaXQ7CiAgICAgICAgcmV0dXJuKCRDb21wb25lbnQtPmdldERhdGUoJHRleHQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTcWxEYXRlVGltZSgkdGV4dCkKICAgIHsKCQkkdW5peFRpbWUgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKS0+Z2V0VW5peFRpbWUoJHRleHQpOwogICAgICAgIHJldHVybihnZXRPYmplY3QoIlRyYW5zbGF0b3IiKS0+Z2V0RGF0ZSgkdW5peFRpbWUpLiIgIi5nZXRPYmplY3QoIlRyYW5zbGF0b3IiKS0+Z2V0VGltZSgkdW5peFRpbWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTcWxEYXRlKCR0ZXh0KQogICAgewoJCS8vIFRPRE8gLSBwcm9jIHZyYWNpbSBwb3V6ZSBkYXR1bT8KCgkJLy9kdW1wKCJnZXRTcWxEYXRlOiIuJHRleHQpOwoJCWlmICh0cmltKCR0ZXh0KSA9PSAiIikKCQkJcmV0dXJuKCIiKTsKCQkKICAgIAlpZiAoaXNTcWxEYXRlRm9ybWF0KCR0ZXh0KSkKCQkJcmV0dXJuKCR0ZXh0KTsKCQkKCQlpZiAoaXNSRkM4MjJEYXRlRm9ybWF0KCR0ZXh0KSkKCQl7CgkJCS8vZHVtcCgkdGV4dCk7CgkJCS8vZHVtcChkYXRlKCJZLW0tZCBIOmk6cyIsIHN0cnRvdGltZSgkdGV4dCkpKTsKCQkJcmV0dXJuKGRhdGUoIlktbS1kIEg6aTpzIiwgc3RydG90aW1lKCR0ZXh0KSkpOwoJCX0KCQkJCiAgICAJJHVuaXhUaW1lID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9yIiktPmdldFVuaXhUaW1lKCR0ZXh0LCB0cnVlLCB0cnVlKTsKICAgIAkvLyR1bml4VGltZSA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpLT5nZXRVbml4VGltZSgkdGV4dCwgdHJ1ZSwgZmFsc2UpOwoJCS8vZHVtcCgkdW5peFRpbWUpOwoJCSRyZXQgPSBfZGF0ZSgiWS1tLWQgSDppOnMiLCAkdW5peFRpbWUpOwoJCQoJCS8vZHVtcCgkcmV0KTsKCQlyZXR1cm4oJHJldCk7CiAgICB9CiAgICAKZnVuY3Rpb24gYWRkRXh0ZW5kaW5nSGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpLCAkY2xhc3NOYW1lPSIiKQp7CiAgICAkb2JqZWN0VHlwZSA9IHN1YnN0cigkY2xhc3NOYW1lLCAxLCAxMDAwKTsKICAgIGlmICgkY2xhc3NOYW1lICYmIG9iamVjdEV4aXN0cygiTW9kdWxlcyIpKQogICAgewogICAgICAgIGZvcmVhY2goZ2V0T2JqZWN0KCJNb2R1bGVzIiktPmdldEV4dGVuZGluZ09iamVjdFR5cGVzKCRvYmplY3RUeXBlKSBhcyAkZXh0ZW5kaW5nT2JqZWN0VHlwZSkKICAgICAgICB7CiAgICAgICAgICAgICRPYmplY3QgPSBnZXRPYmplY3QoJGV4dGVuZGluZ09iamVjdFR5cGUpOwogICAgICAgICAgICBpZiAoJE9iamVjdCkKICAgICAgICAgICAgICAgICRPYmplY3QtPm9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoImFkZEV4dGVuZGluZ0hlYWRIdG1sKCkgLSBPYmplY3QgJyIuJGV4dGVuZGluZ09iamVjdFR5cGUuIicgbm90IGZvdW5kIiwgbXRFcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9kdW1wKCRleHRlbmRpbmdPYmplY3RUeXBlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gVE9ETwp9CiAgICAKZnVuY3Rpb24gYWRkSGVhZEh0bWwoJGh0bWwsICRvbmNlT25seT1mYWxzZSwgJGFic29sdXRlPWZhbHNlKQp7CiAgICAvLyBNVVNUIE5PVCBETyBUSElTIFdBWSAtIGZhY2Vib29rIG1ldGEgb2c6aW1hZ2UgbXVzdCBiZSBmdWxsIFVSTAogICAgLy8kaHRtbCA9IHN0cl9yZXBsYWNlKFBST0pFQ1RVUkwsICIvIiwgJGh0bWwpOwogICAgaWYgKCEkYWJzb2x1dGUpCiAgICB7CiAgICAgICAgLy8gbmVlZCBTRVJWRVJVUkwgLSBvbmx5IHRoZSBkb21haW4gLSBub3QgUFJPSkVDVFVSTCBmb3IgcHJvamVjdHMgaW5zdGFsbGVkIGluIHN1YmRpcmVjdG9yeQogICAgICAgIAogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoInNyYz1cIiIuU0VSVkVSVVJMLCAic3JjPVwiLyIsICRodG1sKTsKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJzcmM9JyIuU0VSVkVSVVJMLCAic3JjPScvIiwgJGh0bWwpOwogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoImhyZWY9XCIiLlNFUlZFUlVSTCwgImhyZWY9XCIvIiwgJGh0bWwpOwogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoImhyZWY9JyIuU0VSVkVSVVJMLCAiaHJlZj0nLyIsICRodG1sKTsKCiAgICAgICAgLy8gaWYgZGlyZWN0b3J5IC0gcHNldWRvIGNsZWFuTGluaygpIHRvIG5vdCBzdGFydCBzcmM9Jy8vY29yZS9jbGFzc2VzLy4uLicKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJzcmM9XCIvLyIsICJzcmM9XCIvIiwgJGh0bWwpOwogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoInNyYz0nLy8iLCAic3JjPScvIiwgJGh0bWwpOwogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoImhyZWY9XCIvLyIsICJocmVmPVwiLyIsICRodG1sKTsKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJocmVmPScvLyIsICJocmVmPScvIiwgJGh0bWwpOwoKICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoU0VSVkVSVVJMLiIvIiwgU0VSVkVSVVJMLCAkaHRtbCk7CgoKICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoInNyYz1cIiIuUFJPSkVDVFVSTCwgInNyYz1cIi8iLCAkaHRtbCk7CiAgICAgICAgLy8kaHRtbCA9IHN0cl9yZXBsYWNlKCJzcmM9JyIuUFJPSkVDVFVSTCwgInNyYz0nLyIsICRodG1sKTsKICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoImhyZWY9XCIiLlBST0pFQ1RVUkwsICJocmVmPVwiLyIsICRodG1sKTsKICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoImhyZWY9JyIuUFJPSkVDVFVSTCwgImhyZWY9Jy8iLCAkaHRtbCk7CiAgICB9CiAgICAKICAgIGdsb2JhbCAkX19oZWFkSHRtbENvbXBpbGVkRmlsZXM7CiAgICBmb3JlYWNoKCRfX2hlYWRIdG1sQ29tcGlsZWRGaWxlcyBhcyAkZmlsZSkKICAgIHsKICAgICAgICBpZiAoc3RycG9zKCRodG1sLCAkZmlsZSkgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCRmaWxlLiIgYWxyZWFkeSBpbiBjb21waWxlZCBmaWxlIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIAogICAgZ2xvYmFsICRfX2hlYWRIdG1sOwogICAgaWYgKCFpc19hcnJheSgkX19oZWFkSHRtbCkpCiAgICAgICAgJF9faGVhZEh0bWwgPSBhcnJheSgpOwogICAgCiAgICBpZiAoaXNfYm9vbCgkb25jZU9ubHkpKQogICAgICAgICRtZDUgPSAkb25jZU9ubHkgPyBtZDUoJGh0bWwpIDogY291bnQoJF9faGVhZEh0bWwpOwogICAgZWxzZSAKICAgICAgICAkbWQ1ID0gJG9uY2VPbmx5OwogICAgCiAgICBpZiAob2JqZWN0RXhpc3RzKCJFdmVudHMiKSkKICAgICAgICAkaHRtbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25BZGRIZWFkSHRtbCIsIGFycmF5KCJodG1sIj0+JGh0bWwsIm9uY2VPbmx5Ij0+JG9uY2VPbmx5KSwgImh0bWwiKTsKCiAgICBpZihzdHJwb3MoJF9DT09LSUVbIkRlYnVnRXJyb3JKYXZhU2NyaXB0RGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSkKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCI8c2NyaXB0ICIsICI8c2NyaXB0IG9ubG9hZD0nb25TY3JpcHRMb2FkZWQoZXZlbnQpJyAiLCAkaHRtbCk7CiAgICAKICAgICRfX2hlYWRIdG1sWyRtZDVdID0gJGh0bWw7CiAgICAKfQoKZnVuY3Rpb24gZ2V0SGVhZEh0bWwoKQp7CiAgICBnbG9iYWwgJF9faGVhZEh0bWw7CiAgICByZXR1cm4oYXJyYXlfdmFsdWVzKCRfX2hlYWRIdG1sKSk7IC8vIHVzZWQgaW4gSHRtbENhY2hlCn0KCiRfX2JvZHlIdG1sUHJlZml4ID0gYXJyYXkoKTsKJF9fYm9keUh0bWxQb3N0Zml4ID0gYXJyYXkoKTsKZnVuY3Rpb24gYWRkQm9keUh0bWwoJGh0bWwsICRvbmNlT25seT1mYWxzZSkKewogICAgcmV0dXJuKGFkZEJvZHlIdG1sUG9zdGZpeCgkaHRtbCwgJG9uY2VPbmx5KSk7Cn0KZnVuY3Rpb24gYWRkQm9keUh0bWxQcmVmaXgoJGh0bWwsICRvbmNlT25seT1mYWxzZSkKewogICAgZ2xvYmFsICRfX2JvZHlIdG1sUHJlZml4OwogICAgaWYgKCFpc19hcnJheSgkX19ib2R5SHRtbFByZWZpeCkpCiAgICAgICAgJF9fYm9keUh0bWxQcmVmaXggPSBhcnJheSgpOwogICAgCiAgICAkbWQ1ID0gJG9uY2VPbmx5ID8gbWQ1KCRodG1sKSA6IGNvdW50KCRfX2JvZHlIdG1sUHJlZml4KTsKICAgIAogICAgaWYgKG9iamVjdEV4aXN0cygiRXZlbnRzIikpCiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uQWRkQm9keUh0bWxQcmVmaXgiLCBhcnJheSgiaHRtbCI9PiRodG1sLCJvbmNlT25seSI9PiRvbmNlT25seSksICJodG1sIik7CgogICAgaWYoc3RycG9zKCRfQ09PS0lFWyJEZWJ1Z0Vycm9ySmF2YVNjcmlwdERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSAhPT0gRkFMU0UpCiAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiPHNjcmlwdCAiLCAiPHNjcmlwdCBvbmxvYWQ9J29uU2NyaXB0TG9hZGVkKGV2ZW50KScgIiwgJGh0bWwpOwogICAgCiAgICAkX19ib2R5SHRtbFByZWZpeFskbWQ1XSA9ICRodG1sOwp9CmZ1bmN0aW9uIGFkZEJvZHlIdG1sUG9zdGZpeCgkaHRtbCwgJG9uY2VPbmx5PWZhbHNlKQp7CiAgICBnbG9iYWwgJF9fYm9keUh0bWxQb3N0Zml4OwogICAgaWYgKCFpc19hcnJheSgkX19ib2R5SHRtbFBvc3RmaXgpKQogICAgICAgICRfX2JvZHlIdG1sUG9zdGZpeCA9IGFycmF5KCk7CiAgICAKICAgICRtZDUgPSAkb25jZU9ubHkgPyBtZDUoJGh0bWwpIDogY291bnQoJF9fYm9keUh0bWxQb3N0Zml4KTsKICAgIAogICAgaWYgKG9iamVjdEV4aXN0cygiRXZlbnRzIikpCiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uQWRkQm9keUh0bWxQb3N0Zml4IiwgYXJyYXkoImh0bWwiPT4kaHRtbCwib25jZU9ubHkiPT4kb25jZU9ubHkpLCAiaHRtbCIpOwoKICAgIGlmKHN0cnBvcygkX0NPT0tJRVsiRGVidWdFcnJvckphdmFTY3JpcHREZWJ1Z1BhbmVsIl0sICJcInZpc2libGVcIjp0cnVlIikgIT09IEZBTFNFKQogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIjxzY3JpcHQgIiwgIjxzY3JpcHQgb25sb2FkPSdvblNjcmlwdExvYWRlZChldmVudCknICIsICRodG1sKTsKICAgIAogICAgLy8kbWQ1ID0gcmFuZCgpOwogICAgLy9kdW1wKCRtZDUuIiAtICIuaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICAkX19ib2R5SHRtbFBvc3RmaXhbJG1kNV0gPSAkaHRtbDsKfQoKZnVuY3Rpb24gYWRkTWV0YUh0bWwoJG5hbWUsICRjb250ZW50KQp7CiAgICBnbG9iYWwgJF9fbWV0YUh0bWw7CiAgICBpZiAoIWlzX2FycmF5KCRfX21ldGFIdG1sKSkKICAgICAgICAkX19tZXRhSHRtbCA9IGFycmF5KCk7CiAgICAKICAgICRfX21ldGFIdG1sW10gPSAiPG1ldGEgbmFtZT1cIiIuJG5hbWUuIlwiIGNvbnRlbnQ9XCIiLiRjb250ZW50LiJcIiAvPiI7Cn0KCmZ1bmN0aW9uIF9zZXNzaW9uX3N0YXJ0KCkKewogICAgZ2xvYmFsICRfX3Nlc3Npb25fc3RhcnRfaGVhZGVyczsKICAgIGlmICghJF9fc2Vzc2lvbl9zdGFydF9oZWFkZXJzKQogICAgewogICAgICAgIHNlc3Npb25fc3RhcnQoKTsKICAgICAgICAkX19zZXNzaW9uX3N0YXJ0X2hlYWRlcnMgPSB0cnVlOwogICAgfQogICAgZWxzZSAgICAKICAgIHsKICAgICAgICBpbmlfc2V0KCdzZXNzaW9uLnVzZV9jb29raWVzJywgJzAnKTsgICAgCiAgICAgICAgc2Vzc2lvbl9zdGFydCgpOwogICAgICAgIC8vc2Vzc2lvbl9zdGFydChNVVRFX0hFQURFUlMpOyAgLy8gdG8gbm90IHNlbmQgY29va2llcyBhZ2FpbiBhbmQgYWdhaW4gYW5kIGFnYWluCiAgICB9Cn0KCmZ1bmN0aW9uIF9zZXNzaW9uX3dyaXRlX2Nsb3NlKCkKewogICAgZ2xvYmFsICRfX3Nlc3Npb25fd3JpdGVfY2xvc2VfaGVhZGVyczsKICAgIGlmICghJF9fc2Vzc2lvbl93cml0ZV9jbG9zZV9oZWFkZXJzKQogICAgewogICAgICAgIHNlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgIH0KICAgIGVsc2UgICAgCiAgICB7CiAgICAgICAgaW5pX3NldCgnc2Vzc2lvbi51c2VfY29va2llcycsICcwJyk7ICAgIAogICAgICAgIHNlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICAvL3Nlc3Npb25fd3JpdGVfY2xvc2UoTVVURV9IRUFERVJTKTsgIC8vIHRvIG5vdCBzZW5kIGNvb2tpZXMgYWdhaW4gYW5kIGFnYWluIGFuZCBhZ2FpbgogICAgfQp9CgpmdW5jdGlvbiBfc2Vzc2lvbl9kZXN0cm95KCkKewogICAgc2Vzc2lvbl9kZXN0cm95KCk7Cn0KCiAgICAgICAgCmZ1bmN0aW9uIHJlYWxfZXNjYXBlX3N0cmluZygkc3RyKQp7CiAgICByZXR1cm4gc3RydHIoJHN0ciwgYXJyYXkoCiAgICAgICAgIlx4MDAiID0+ICdceDAwJywKICAgICAgICAiXG4iID0+ICdcbicsIAogICAgICAgICJcciIgPT4gJ1xyJywgCiAgICAgICAgJ1xcJyA9PiAnXFxcXCcsCiAgICAgICAgIiciID0+ICJcJyIsIAogICAgICAgICciJyA9PiAnXCInLCAKICAgICAgICAiXHgxYSIgPT4gJ1x4MWEnCiAgICApKTsgICAgCn0KCiRfX2Rpc2FibGVkRnVuY3Rpb25zID0gYXJyYXkoKTsKZnVuY3Rpb24gZ2V0RGlzYWJsZWRGdW5jdGlvbnMoKQp7CiAgICBnbG9iYWwgJF9fZGlzYWJsZWRGdW5jdGlvbnM7CiAgICBpZiAoISRfX2Rpc2FibGVkRnVuY3Rpb25zKQogICAgewogICAgICAgICRfX2Rpc2FibGVkRnVuY3Rpb25zID0gYXJyYXlfbWVyZ2UoJF9fZGlzYWJsZWRGdW5jdGlvbnMsIGV4cGxvZGUoJywnLCBzdHJfcmVwbGFjZSgiLCAiLCAiLCIsIGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpKSk7IAogICAgICAgICRfX2Rpc2FibGVkRnVuY3Rpb25zID0gYXJyYXlfbWVyZ2UoJF9fZGlzYWJsZWRGdW5jdGlvbnMsIGV4cGxvZGUoJywnLCBzdHJfcmVwbGFjZSgiLCAiLCAiLCIsIGluaV9nZXQoJ3N1aG9zaW4uZXhlY3V0b3IuZXZhbC5ibGFja2xpc3QnKSkpKTsgCiAgICAgICAgLy8gYWxzbyBzdWhvc2luLmV4ZWN1dG9yLmZ1bmMuYmxhY2tsaXN0Pz8gY29udGFpbnMgZXZhbCwgYnV0IGlzIGV4ZWN1dGVkCiAgICB9CiAgICAKICAgIHJldHVybigkX19kaXNhYmxlZEZ1bmN0aW9ucyk7Cn0KCmZ1bmN0aW9uIGlzRGlzYWJsZWRGdW5jdGlvbigkbmFtZSkKewogICAgcmV0dXJuKGluX2FycmF5KCRuYW1lLCBnZXREaXNhYmxlZEZ1bmN0aW9ucygpKSk7Cn0KCi8vIFBIUCA8IDUuMwovKgppZiggIWZ1bmN0aW9uX2V4aXN0cyggJ2dldF9jYWxsZWRfY2xhc3MnICkgKSB7CiAgY2xhc3MgY2xhc3NfdG9vbHMgeyAgICAgICAgCgogICAgc3RhdGljICRpID0gMDsgICAgICAgIAogICAgc3RhdGljICRmbCA9IG51bGw7CgogICAgc3RhdGljIGZ1bmN0aW9uIGdldF9jYWxsZWRfY2xhc3MoKSB7ICAgICAgICAgICAgCiAgICAgICRidCA9IGRlYnVnX2JhY2t0cmFjZSgpOwogICAgICBpZiggc2VsZjo6JGZsID09ICRidFsyXVsnZmlsZSddLiRidFsyXVsnbGluZSddICkgewogICAgICAgIHNlbGY6OiRpKys7ICAgICAgICAgICAgCiAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIAogICAgICAgIHNlbGY6OiRpID0gMDsgICAgICAgICAgICAgICAgCiAgICAgICAgc2VsZjo6JGZsID0gJGJ0WzJdWydmaWxlJ10uJGJ0WzJdWydsaW5lJ107ICAgICAgICAgICAgCiAgICAgIH0KCiAgICAgICRsaW5lcyA9IGZpbGUoJGJ0WzJdWydmaWxlJ10pOwogICAgICBwcmVnX21hdGNoX2FsbCgKICAgICAgICAnLyhbYS16QS1aMC05XF9dKyk6OicuJGJ0WzJdWydmdW5jdGlvbiddLicvJywgICAgICAgICAgICAgICAgCiAgICAgICAgJGxpbmVzWyRidFsyXVsnbGluZSddLTFdLCAgICAgICAgICAgICAgICAKICAgICAgICAkbWF0Y2hlcyAgICAgICAgICAgIAogICAgICApOyAgICAgICAgICAgICAKICAgICAgCiAgICAgIC8vdmFyX2R1bXAoJG1hdGNoZXNbMV1bMF0pOwogICAgICByZXR1cm4gJG1hdGNoZXNbMV1bMF07ICAgICAgICAKICAgIH0gICAgCiAgfQogIGZ1bmN0aW9uIGdldF9jYWxsZWRfY2xhc3MoKSB7ICAgICAgICAKICAgIHJldHVybiBjbGFzc190b29sczo6Z2V0X2NhbGxlZF9jbGFzcygpOyAgICAKICB9Cn0KKi8KCmlmICghZnVuY3Rpb25fZXhpc3RzKCJnZXRfY2FsbGVkX2NsYXNzIikpCnsKICAgIGRlZmluZSgiR0VUX0NBTExFRF9DTEFTU19NSVNTSU5HIiwgdHJ1ZSk7CiAgICAvLyBpZiBub3QgZm91bmQgYW55IGNsYXNzIHVzaW5nIGV2YWwoKSB3aGVuIGNhbGxlZCBVU0UgaWV2YWwoKSEhIQogICAgZnVuY3Rpb24gZ2V0X2NhbGxlZF9jbGFzcygpCiAgICB7CiAgICAgICAgLy9lY2hvICIhISEhISEhISEhISEhISEhISEhISEhISEhISE8aHI+IjsKICAgICAgICAkYXJyID0gYXJyYXkoKTsgCiAgICAgICAgJGFyclRyYWNlcyA9IF9kZWJ1Z19iYWNrdHJhY2UoKTsKICAgICAgICAkbWV0aG9kID0gIiI7CiAgICAgICAgLy9nbG9iYWwgJFhYOwogICAgICAgIC8vaWYgKCRYWCkKICAgICAgICAvL2V4aXQ7CiAgICAgICAgZm9yZWFjaCAoJGFyclRyYWNlcyBhcyAkYXJyVHJhY2UpCiAgICAgICAgewogICAgICAgICAgICAvL2lmIChpc0RldmVsb3BlcigpKQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgLy8gICAgZWNobyAiPGhyPiI7CiAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRhcnJUcmFjZSk7CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAvL3Zhcl9kdW1wKCRhcnJUcmFjZSk7CiAgICAgICAgICAgIC8vZWNobyAiPGhyIC8+IjsKICAgICAgICAgICAgaWYoJGFyclRyYWNlWydmdW5jdGlvbiddID09ICJjYWxsX3VzZXJfZnVuYyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRhcnJbXSA9ICRhcnJUcmFjZVsnYXJncyddWzBdWzBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZigkYXJyVHJhY2VbInR5cGUiXSA9PSAiOjoiICYmICRhcnJUcmFjZVsiZmlsZSJdKSAvLyBQSFAgVmVyc2lvbiA1LjIuNi0xK2xlbm55MTYgKHBsYWNlcyBUT2JqZWN0IGFzICRhcnJUcmFjZVsidHlwZSJdIC0gRkFMU0UhISkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2xvYmFsICRfX2V2YWxDb2RlczsKICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFyclRyYWNlWyJmaWxlIl0sICJldmFsKCknZCBjb2RlIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJF9fZXZhbENvZGVzW2NvdW50KCRfX2V2YWxDb2RlcyktMV0pOwogICAgICAgICAgICAgICAgICAgIC8vZWNobyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiOwogICAgICAgICAgICAgICAgICAgIC8vaWYgKGlzRGV2ZWxvcGVyKCkpCiAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgLy8gICAgZWNobyAiTElORVM6ICI7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyX2R1bXAoJGxpbmVzKTsKICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXJfZHVtcCgkX19ldmFsQ29kZXMpOwogICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkbGluZXMgPSBmaWxlKCRhcnJUcmFjZVsiZmlsZSJdKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKAogICAgICAgICAgICAgICAgICAgICcvKFthLXpBLVowLTlcX10rKTo6Jy4kYXJyVHJhY2VbJ2Z1bmN0aW9uJ10uJy8nLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkbGluZXNbJGFyclRyYWNlWydsaW5lJ10tMV0sICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRtYXRjaGVzICAgICAgICAgICAgCiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hlc1sxXVswXSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4oJG1hdGNoZXNbMV1bMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoIWFycmF5X2tleV9leGlzdHMoImNsYXNzIiwgJGFyclRyYWNlKSkgY29udGludWU7CiAgICAgICAgICAgIGVsc2UgaWYoY291bnQoJGFycik9PTApIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkYXJyW10gPSAkYXJyVHJhY2VbJ2NsYXNzJ107CiAgICAgICAgICAgICAgICAkbWV0aG9kID0gJGFyclRyYWNlWydmdW5jdGlvbiddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoZ2V0X3BhcmVudF9jbGFzcygkYXJyVHJhY2VbJ2NsYXNzJ10pPT1lbmQoJGFycikpIAogICAgICAgICAgICAgICAgJGFycltdID0gJGFyclRyYWNlWydjbGFzcyddOwogICAgICAgIH0KICAgICAgICAvL3Zhcl9kdW1wKCRhcnIpOwogICAgICAgIHJldHVybiBlbmQoJGFycik7CiAgICB9Cn0KZWxzZQogICAgZGVmaW5lKCJHRVRfQ0FMTEVEX0NMQVNTX01JU1NJTkciLCBmYWxzZSk7CgoKLy8gUEhQIDwgNS4zICBkb2VzIG5vdCBhbGxvdyBjYWxsaW5nICRjbGFzc05hbWU6Om1ldGhvZCgpIG9yICRjbGFzc05hbWU6OiR2YXJpYWJsZQpmdW5jdGlvbiBjYWxsX3N0YXRpY19tZXRob2QoJGNsYXNzTmFtZSwgJG1ldGhvZCwgJGExPSJOT19BUkciLCAkYTI9Ik5PX0FSRyIsICRhMz0iTk9fQVJHIiwgJGE0PSJOT19BUkciLCAkYTU9Ik5PX0FSRyIsICRhNj0iTk9fQVJHIikKewogICAgLy9pZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4zLjAnKSA+PSAwKQogICAgLy8gICAgcmV0dXJuKGNhbGxfdXNlcl9mdW5jKCkpCiAgICAKICAgIC8vZHVtcCgkY2xhc3NOYW1lKTsKICAgIC8vZHVtcCgkbWV0aG9kKTsKICAgIC8vZHVtcChhcnJheSgkY2xhc3NOYW1lLCAkbWV0aG9kKSk7CiAgICAvL2R1bXAoY2FsbF91c2VyX2Z1bmMoYXJyYXkoJGNsYXNzTmFtZSwgJG1ldGhvZCkpKTsKICAgIC8vdmFyX2R1bXAoJGExKTsKICAgIAogICAgLy9pZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4yLjMnKSA+PSAwKQogICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCkKICAgIHsKICAgICAgICBpZiAoJGExID09PSAiTk9fQVJHIikKICAgICAgICAgICAgcmV0dXJuKEBjYWxsX3VzZXJfZnVuYygkY2xhc3NOYW1lLiI6OiIuJG1ldGhvZCkpOwogICAgICAgIGVsc2UgaWYgKCRhMiA9PT0gIk5PX0FSRyIpCiAgICAgICAgICAgIHJldHVybihAY2FsbF91c2VyX2Z1bmMoJGNsYXNzTmFtZS4iOjoiLiRtZXRob2QsICRhMSkpOwogICAgICAgIGVsc2UgaWYgKCRhMyA9PT0gIk5PX0FSRyIpCiAgICAgICAgICAgIHJldHVybihAY2FsbF91c2VyX2Z1bmMoJGNsYXNzTmFtZS4iOjoiLiRtZXRob2QsICRhMSwgJGEyKSk7CiAgICAgICAgZWxzZSBpZiAoJGE0ID09PSAiTk9fQVJHIikKICAgICAgICAgICAgcmV0dXJuKEBjYWxsX3VzZXJfZnVuYygkY2xhc3NOYW1lLiI6OiIuJG1ldGhvZCwgJGExLCAkYTIsICRhMykpOwogICAgICAgIGVsc2UgaWYgKCRhNSA9PT0gIk5PX0FSRyIpCiAgICAgICAgICAgIHJldHVybihAY2FsbF91c2VyX2Z1bmMoJGNsYXNzTmFtZS4iOjoiLiRtZXRob2QsICRhMSwgJGEyLCAkYTMsICRhNCkpOwogICAgICAgIGVsc2UgaWYgKCRhNiA9PT0gIk5PX0FSRyIpCiAgICAgICAgICAgIHJldHVybihAY2FsbF91c2VyX2Z1bmMoJGNsYXNzTmFtZS4iOjoiLiRtZXRob2QsICRhMSwgJGEyLCAkYTMsICRhNCwgJGE1KSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oQGNhbGxfdXNlcl9mdW5jKCRjbGFzc05hbWUuIjo6Ii4kbWV0aG9kLCAkYTEsICRhMiwgJGEzLCAkYTQsICRhNSwgJGE2KSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCRhMSA9PT0gIk5PX0FSRyIpCiAgICAgICAgICAgIHJldHVybihAY2FsbF91c2VyX2Z1bmMoYXJyYXkoJGNsYXNzTmFtZSwgJG1ldGhvZCkpKTsKICAgICAgICBlbHNlIGlmICgkYTIgPT09ICJOT19BUkciKQogICAgICAgICAgICByZXR1cm4oQGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjbGFzc05hbWUsICRtZXRob2QpLCAkYTEpKTsKICAgICAgICBlbHNlIGlmICgkYTMgPT09ICJOT19BUkciKQogICAgICAgICAgICByZXR1cm4oQGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjbGFzc05hbWUsICRtZXRob2QpLCAkYTEsICRhMikpOwogICAgICAgIGVsc2UgaWYgKCRhNCA9PT0gIk5PX0FSRyIpCiAgICAgICAgICAgIHJldHVybihAY2FsbF91c2VyX2Z1bmMoYXJyYXkoJGNsYXNzTmFtZSwgJG1ldGhvZCksICRhMSwgJGEyLCAkYTMpKTsKICAgICAgICBlbHNlIGlmICgkYTUgPT09ICJOT19BUkciKQogICAgICAgICAgICByZXR1cm4oQGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjbGFzc05hbWUsICRtZXRob2QpLCAkYTEsICRhMiwgJGEzLCAkYTQpKTsKICAgICAgICBlbHNlIGlmICgkYTYgPT09ICJOT19BUkciKQogICAgICAgICAgICByZXR1cm4oQGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjbGFzc05hbWUsICRtZXRob2QpLCAkYTEsICRhMiwgJGEzLCAkYTQsICRhNSkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKEBjYWxsX3VzZXJfZnVuYyhhcnJheSgkY2xhc3NOYW1lLCAkbWV0aG9kKSwgJGExLCAkYTIsICRhMywgJGE0LCAkYTUsICRhNikpOwogICAgfQp9CgpmdW5jdGlvbiBnZXRfc3RhdGljX3ZhcmlhYmxlKCRjbGFzc05hbWUsICR2YXJpYWJsZSkKewogICAgaWYgKCRjbGFzc05hbWUgJiYgJHZhcmlhYmxlKQogICAgewogICAgICAgIG9iX3N0YXJ0KCk7ICAgIAogICAgICAgICRyZXQgPSBldmFsKCJyZXR1cm4oIi4kY2xhc3NOYW1lLiI6OlwkIi4kdmFyaWFibGUuIik7Iik7CiAgICAgICAgJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgLy92YXJfZHVtcCgicmV0dXJuKCIuJGNsYXNzTmFtZS4iOjpcJCIuJHZhcmlhYmxlLiIpOyIpOwogICAgICAgIC8vdmFyX2R1bXAoJGVycm9yKTsKICAgICAgICAKICAgICAgICBpZiAoc3RyaXBvcygkZXJyb3IsICJzeW50YXggZXJyb3IiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKCJyZXR1cm4oIi4kY2xhc3NOYW1lLiI6OlwkIi4kdmFyaWFibGUuIik7Iik7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJnZXRfc3RhdGljX3ZhcmlhYmxlKCkgLSAiLiRlcnJvci4iPGhyPiIuInJldHVybigiLiRjbGFzc05hbWUuIjo6XCQiLiR2YXJpYWJsZS4iKTsiLCBtdEVycm9yKTsgICAgCiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vdmFyX2R1bXAoInJldHVybigiLiRjbGFzc05hbWUuIjo6XCQiLiR2YXJpYWJsZS4iKTsiKTsKICAgICAgICAvL3Zhcl9kdW1wKGdldEZ1bmN0aW9uQ2FsbCgpKTsKICAgICAgICBzaG93TWVzc2FnZSgiZ2V0X3N0YXRpY192YXJpYWJsZSgpIC0gY2xhc3NOYW1lIG9yIHZhcmlhYmxlIG1pc3NpbmciLCBtdEVycm9yKTsgICAgCiAgICB9CiAgICAgICAgCiAgICByZXR1cm4oJHJldCk7Cn0KCmlmICggIWZ1bmN0aW9uX2V4aXN0cygnc3lzX2dldF90ZW1wX2RpcicpKSB7CiAgZnVuY3Rpb24gc3lzX2dldF90ZW1wX2RpcigpIHsKICAgIGlmICghZW1wdHkoJF9FTlZbJ1RNUCddKSkgeyByZXR1cm4gQHJlYWxwYXRoKCRfRU5WWydUTVAnXSk7IH0KICAgIGlmICghZW1wdHkoJF9FTlZbJ1RNUERJUiddKSkgeyByZXR1cm4gQHJlYWxwYXRoKCAkX0VOVlsnVE1QRElSJ10pOyB9CiAgICBpZiAoIWVtcHR5KCRfRU5WWydURU1QJ10pKSB7IHJldHVybiBAcmVhbHBhdGgoICRfRU5WWydURU1QJ10pOyB9CiAgICAkdGVtcGZpbGU9QHRlbXBuYW0oX19GSUxFX18sJycpOwogICAgaWYgKEBmaWxlX2V4aXN0cygkdGVtcGZpbGUpKSB7CiAgICAgIEB1bmxpbmsoJHRlbXBmaWxlKTsKICAgICAgcmV0dXJuIEByZWFscGF0aChAZGlybmFtZSgkdGVtcGZpbGUpKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfSAKCmZ1bmN0aW9uIGlzU2ltcGxlQXJyYXkoJGEpCnsKICAgIGlmICghaXNfYXJyYXkoJGEpKQogICAgICAgIHJldHVybihOVUxMKTsKCiAgICAkcmV0ID0gdHJ1ZTsKICAgIGZvcmVhY2goJGEgYXMgJGtleSA9PiAkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCJ8XlswLTldKyR8IiwgJGtleSkpCiAgICAgICAgewogICAgICAgICAgICAkcmV0ID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKCRyZXQpOwp9CgpmdW5jdGlvbiBpc0Fzc29jQXJyYXkoJGEpCnsKICAgIHJldHVybihfaXNfYXJyYXkoJGEpICYmICFpc1NpbXBsZUFycmF5KCRhKSk7Cn0KCmZ1bmN0aW9uIF9pc19hcnJheSgkYSkKewogICAgcmV0dXJuKGlzX2FycmF5KCRhKSB8fCAkYSBpbnN0YW5jZW9mIEFycmF5QWNjZXNzKTsKfQoKZnVuY3Rpb24gZmlyc3RfdmFsdWUoJHAxLCAkcDIsICRwMz1OVUxMLCAkcDQ9TlVMTCwgJHA1PU5VTEwsICRwNj1OVUxMLCAkcDc9TlVMTCwgJHA4PU5VTEwsICRwOT1OVUxMLCAkcDEwPU5VTEwpCnsKICAgIGlmICgkcDEpCiAgICAgICAgcmV0dXJuKCRwMSk7CiAgICBpZiAoJHAyKQogICAgICAgIHJldHVybigkcDIpOwogICAgaWYgKCRwMykKICAgICAgICByZXR1cm4oJHAzKTsKICAgIGlmICgkcDQpCiAgICAgICAgcmV0dXJuKCRwNCk7CiAgICBpZiAoJHA1KQogICAgICAgIHJldHVybigkcDUpOwogICAgaWYgKCRwNikKICAgICAgICByZXR1cm4oJHA2KTsKICAgIGlmICgkcDcpCiAgICAgICAgcmV0dXJuKCRwNyk7CiAgICBpZiAoJHA4KQogICAgICAgIHJldHVybigkcDgpOwogICAgaWYgKCRwOSkKICAgICAgICByZXR1cm4oJHA5KTsKICAgIGlmICgkcDEwKQogICAgICAgIHJldHVybigkcDEwKTsKICAgICAgICAKICAgIHJldHVybigkcDEpOyAvLyBpZiBpIGhhdmUgZmlyc3RfdmFsdWUoMCwgMCkgLSB3ZSBuZWVkIHRvIHJldHVybiB0aGUgc2FtZSB2YXJpYWJsZSB0eXBlIC0gaW50Cn0KCi8qIFBIUCA+IDUuNCAqLwppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc2Vzc2lvbl9yZWdpc3RlcicpKQp7CiAgICBmdW5jdGlvbiBzZXNzaW9uX3JlZ2lzdGVyKCl7CiAgICAgICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGtleSl7CiAgICAgICAgICAgICRfU0VTU0lPTlska2V5XT0kR0xPQkFMU1ska2V5XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZXNzaW9uX2lzX3JlZ2lzdGVyZWQoJGtleSl7CiAgICAgICAgcmV0dXJuIGlzc2V0KCRfU0VTU0lPTlska2V5XSk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXNzaW9uX3VucmVnaXN0ZXIoJGtleSl7CiAgICAgICAgdW5zZXQoJF9TRVNTSU9OWyRrZXldKTsKICAgIH0gCn0KCmZ1bmN0aW9uIG9kZCgkbnVtYmVyKQp7CiAgICByZXR1cm4oJG51bWJlciAlIDIgPT0gMSk7Cn0KCmZ1bmN0aW9uIGV2ZW4oJG51bWJlcikKewogICAgcmV0dXJuKCRudW1iZXIgJSAyID09IDApOwp9CgpmdW5jdGlvbiBfZGVidWdfYmFja3RyYWNlKCkKewogICAgc3RhcnRQcm9maWxlKCJfZGVidWdfYmFja3RyYWNlKCkiKTsKICAgICRidCA9IGRlYnVnX2JhY2t0cmFjZSgpOwogICAgYXJyYXlfc2hpZnQoJGJ0KTsKCiAgICBzdG9wUHJvZmlsZSgiX2RlYnVnX2JhY2t0cmFjZSgpIik7CiAgICByZXR1cm4oJGJ0KTsKfQoKZnVuY3Rpb24gZ2V0Q2FsbGVyT2JqZWN0KCkKewogICAgc3RhcnRQcm9maWxlKCJnZXRDYWxsZXJPYmplY3QoKSIpOwogICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuNC4wJykgPj0gMCkKICAgICAgICAkYnQgPSBkZWJ1Z19iYWNrdHJhY2UoREVCVUdfQkFDS1RSQUNFX1BST1ZJREVfT0JKRUNUfERFQlVHX0JBQ0tUUkFDRV9JR05PUkVfQVJHUywgMTApOwogICAgZWxzZSBpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4zLjYnKSA+PSAwKQogICAgICAgICRidCA9IGRlYnVnX2JhY2t0cmFjZShERUJVR19CQUNLVFJBQ0VfUFJPVklERV9PQkpFQ1R8REVCVUdfQkFDS1RSQUNFX0lHTk9SRV9BUkdTKTsKICAgIGVsc2UKICAgICAgICAkYnQgPSBkZWJ1Z19iYWNrdHJhY2UoVFJVRSk7CiAgICAKICAgIGFycmF5X3NoaWZ0KCRidCk7CiAgICBhcnJheV9zaGlmdCgkYnQpOwogICAgCiAgICBzdG9wUHJvZmlsZSgiZ2V0Q2FsbGVyT2JqZWN0KCkiKTsKICAgIHJldHVybigkYnRbMF1bIm9iamVjdCJdKTsKfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaW1hZ2VmbGlwJykpIHsKICBkZWZpbmUoJ0lNR19GTElQX0hPUklaT05UQUwnLCAwKTsKICBkZWZpbmUoJ0lNR19GTElQX1ZFUlRJQ0FMJywgMSk7CiAgZGVmaW5lKCdJTUdfRkxJUF9CT1RIJywgMik7CgogIGZ1bmN0aW9uIGltYWdlZmxpcCgkaW1hZ2UsICRtb2RlKSB7CiAgICBzd2l0Y2ggKCRtb2RlKSB7CiAgICAgIGNhc2UgSU1HX0ZMSVBfSE9SSVpPTlRBTDogewogICAgICAgICRtYXhfeCA9IGltYWdlc3goJGltYWdlKSAtIDE7CiAgICAgICAgJGhhbGZfeCA9ICRtYXhfeCAvIDI7CiAgICAgICAgJHN5ID0gaW1hZ2VzeSgkaW1hZ2UpOwogICAgICAgICR0ZW1wX2ltYWdlID0gaW1hZ2Vpc3RydWVjb2xvcigkaW1hZ2UpPyBpbWFnZWNyZWF0ZXRydWVjb2xvcigxLCAkc3kpOiBpbWFnZWNyZWF0ZSgxLCAkc3kpOwogICAgICAgIGZvciAoJHggPSAwOyAkeCA8ICRoYWxmX3g7ICsrJHgpIHsKICAgICAgICAgIGltYWdlY29weSgkdGVtcF9pbWFnZSwgJGltYWdlLCAwLCAwLCAkeCwgMCwgMSwgJHN5KTsKICAgICAgICAgIGltYWdlY29weSgkaW1hZ2UsICRpbWFnZSwgJHgsIDAsICRtYXhfeCAtICR4LCAwLCAxLCAkc3kpOwogICAgICAgICAgaW1hZ2Vjb3B5KCRpbWFnZSwgJHRlbXBfaW1hZ2UsICRtYXhfeCAtICR4LCAwLCAwLCAwLCAxLCAkc3kpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIElNR19GTElQX1ZFUlRJQ0FMOiB7CiAgICAgICAgJHN4ID0gaW1hZ2VzeCgkaW1hZ2UpOwogICAgICAgICRtYXhfeSA9IGltYWdlc3koJGltYWdlKSAtIDE7CiAgICAgICAgJGhhbGZfeSA9ICRtYXhfeSAvIDI7CiAgICAgICAgJHRlbXBfaW1hZ2UgPSBpbWFnZWlzdHJ1ZWNvbG9yKCRpbWFnZSk/IGltYWdlY3JlYXRldHJ1ZWNvbG9yKCRzeCwgMSk6IGltYWdlY3JlYXRlKCRzeCwgMSk7CiAgICAgICAgZm9yICgkeSA9IDA7ICR5IDwgJGhhbGZfeTsgKyskeSkgewogICAgICAgICAgaW1hZ2Vjb3B5KCR0ZW1wX2ltYWdlLCAkaW1hZ2UsIDAsIDAsIDAsICR5LCAkc3gsIDEpOwogICAgICAgICAgaW1hZ2Vjb3B5KCRpbWFnZSwgJGltYWdlLCAwLCAkeSwgMCwgJG1heF95IC0gJHksICRzeCwgMSk7CiAgICAgICAgICBpbWFnZWNvcHkoJGltYWdlLCAkdGVtcF9pbWFnZSwgMCwgJG1heF95IC0gJHksIDAsIDAsICRzeCwgMSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgSU1HX0ZMSVBfQk9USDogewogICAgICAgICRzeCA9IGltYWdlc3goJGltYWdlKTsKICAgICAgICAkc3kgPSBpbWFnZXN5KCRpbWFnZSk7CiAgICAgICAgJHRlbXBfaW1hZ2UgPSBpbWFnZXJvdGF0ZSgkaW1hZ2UsIDE4MCwgMCk7CiAgICAgICAgaW1hZ2Vjb3B5KCRpbWFnZSwgJHRlbXBfaW1hZ2UsIDAsIDAsIDAsIDAsICRzeCwgJHN5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OiB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBpbWFnZWRlc3Ryb3koJHRlbXBfaW1hZ2UpOwogIH0KfQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ29yZS9mdW5jdGlvbnMuY29tbW9uLnBocCAtLS0tLS0tIA0KCiAgICBkZWZpbmUoIm10Tm9ybWFsIiwgMCk7CiAgICBkZWZpbmUoIm10V2FybmluZyIsIDEpOwogICAgZGVmaW5lKCJtdEVycm9yIiwgMik7CiAgICBkZWZpbmUoIm10RGVidWciLCAzKTsKICAgIAogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoImVycm9yX2dldF9sYXN0IikpIC8vIFBIUCA8NS4yLjAKICAgIHsKICAgICAgICBzZXRfZXJyb3JfaGFuZGxlcigKICAgICAgICAgICAgY3JlYXRlX2Z1bmN0aW9uKAogICAgICAgICAgICAgICAgJyRlcnJubywkZXJyc3RyLCRlcnJmaWxlLCRlcnJsaW5lLCRlcnJjb250ZXh0JywKICAgICAgICAgICAgICAgICcKICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJF9fZXJyb3JfZ2V0X2xhc3Q7CiAgICAgICAgICAgICAgICAgICAgJF9fZXJyb3JfZ2V0X2xhc3QgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgXCd0eXBlXCcgICAgICAgID0+ICRlcnJubywKICAgICAgICAgICAgICAgICAgICAgICAgXCdtZXNzYWdlXCcgICAgICAgID0+ICRlcnJzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgIFwnZmlsZVwnICAgICAgICA9PiAkZXJyZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgXCdsaW5lXCcgICAgICAgID0+ICRlcnJsaW5lCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAnCiAgICAgICAgICAgICkKICAgICAgICApOwogICAgCiAgICAgICAgZnVuY3Rpb24gZXJyb3JfZ2V0X2xhc3QoKSAKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkX19lcnJvcl9nZXRfbGFzdDsKICAgICAgICAgICAgaWYgKCFpc3NldCgkX19lcnJvcl9nZXRfbGFzdCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJF9fZXJyb3JfZ2V0X2xhc3Q7CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiBpc0FkbWluaXN0cmF0b3IoKQogICAgewogICAgICAgIGdsb2JhbCAkYWRtaW5BdXRoU3VjY2VzcywgJGF1dGhBZG1pbk1lbmlhbExvZ2luOwogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIm9iamVjdEV4aXN0cyIpICYmIG9iamVjdEV4aXN0cygiQWRtaW5Vc2VyIikpCiAgICAgICAgewogICAgICAgICAgICAkQWRtaW5Vc2VyID0gZ2V0T2JqZWN0KCJBZG1pblVzZXIiKTsKICAgICAgICAgICAgaWYgKCRBZG1pblVzZXItPmxvZ2dlZEluKQogICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBpc0RldmVsb3BlcigkZGlzcGxheT0iIikKICAgIHsKICAgICAgICAvL19sb2coImlzRGV2ZWxvcGVyIik7CiAgICAgICAgaWYgKHRvU3RyaW5nKCRfUkVRVUVTVFsiZGVidWciXSkgPT09ICJmYWxzZSIpCiAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgCiAgICAgICAgaWYgKCRfUkVRVUVTVFsiaGFsdFByb2ZpbGUiXSkKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAKICAgICAgICBpZiAoJF9SRVFVRVNUWyJpc0RldmVsb3BlciJdID09ICJmYWxzZSIpCiAgICAgICAgICAgIHJldHVybihmYWxzZSk7CgogICAgICAgIC8vIFRPRE8gCiAgICAgICAgLy9yZXR1cm4odHJ1ZSk7CiAgICAgICAgZ2xvYmFsICRhZG1pbkF1dGhTdWNjZXNzLCAkYXV0aEFkbWluTWVuaWFsTG9naW47CiAgICAgICAgLy92YXJfZHVtcChmdW5jdGlvbl9leGlzdHMoIm9iamVjdEV4aXN0cyIpKTsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJvYmplY3RFeGlzdHMiKSAmJiBvYmplY3RFeGlzdHMoIkFkbWluVXNlciIpKQogICAgICAgIHsKICAgICAgICAgICAgJEFkbWluVXNlciA9IGdldE9iamVjdCgiQWRtaW5Vc2VyIik7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJEFkbWluVXNlci0+aWQpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRBZG1pblVzZXItPmRldmVsb3Blcik7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgLy9fbG9nKCRBZG1pblVzZXItPmxvZ2dlZEluICYmICRBZG1pblVzZXItPmRldmVsb3BlciAvKiRBZG1pblVzZXItPmluVXNlckdyb3VwKCJ1Z0RldmVsb3BlcnMiKSovKTsKICAgICAgICAgICAgaWYgKCRBZG1pblVzZXItPmxvZ2dlZEluICYmICRBZG1pblVzZXItPmRldmVsb3BlciAvKiRBZG1pblVzZXItPmluVXNlckdyb3VwKCJ1Z0RldmVsb3BlcnMiKSovKQogICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgICAgICAvL2lmICgoJEFkbWluVXNlci0+aW5Vc2VyR3JvdXAoInVnRGV2ZWxvcGVycyIpIHx8ICRhdXRoQWRtaW5NZW5pYWxMb2dpbikgJiYgc3RycG9zKCRBZG1pblVzZXItPnZhbHVlc1siZGV2ZWxvcGVyU2V0dGluZ3MiXSwgImRpc2FibGVEZWJ1ZyIpID09PSBGQUxTRSkKICAgICAgICAgICAgLy8gICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgcmV0dXJuKGlzRGVidWdJUCgkZGlzcGxheSkpOwoKICAgICAgICBnbG9iYWwgJF9fX2lzRGV2ZWxvcGVyQ2hlY2tlZDsKICAgICAgICAKICAgICAgICBpZiAoJF9fX2lzRGV2ZWxvcGVyQ2hlY2sgPT09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJF9TRVNTSU9OWyJhdXRoQWRtaW5Ub2tlbkxvZ2luUyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQURNSU4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdEV4aXN0cygiQWRtaW5Vc2VyIikpCiAgICAgICAgICAgICAgICAgICAgICAgICRfX19pc0RldmVsb3BlckNoZWNrID0gZ2V0T2JqZWN0KCJBZG1pblVzZXIiKS0+aW5Vc2VyR3JvdXAoInVnRGV2ZWxvcGVycyIpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgJF9fX2lzRGV2ZWxvcGVyQ2hlY2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHVzZXIKICAgICAgICAgICAgICAgICAgICAkRGJMaW5rID0gZ2V0RGJMaW5rQnlUeXBlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAkRGJMaW5rLT5xdWVyeSgiU0VMRUNUICogRlJPTSBgY21zX2FkbWluX3VzZXJzYCBXSEVSRSBjZXJ0aWZpY2F0ZT0nIi5yZWFsX2VzY2FwZV9zdHJpbmcoJF9TRVNTSU9OWyJhdXRoQWRtaW5Ub2tlbkxvZ2luUyJdKS4iJyIpOwogICAgICAgICAgICAgICAgICAgIGlmICgkRGJMaW5rLT5yZWNvcmRDb3VudCgpKQogICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkID0gJERiTGluay0+bmV4dFJlY29yZCgpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8kcmVjb3JkID0gZ2V0VGFibGUoImFkbWluX3VzZXJzIiktPmdldFJlY29yZCgiZmlsdGVyPWNlcnRpZmljYXRlPSciLiRfU0VTU0lPTlsiYXV0aEFkbWluVG9rZW5Mb2dpblMiXS4iJyIpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlY29yZCk7CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRfX19pc0RldmVsb3BlckNoZWNrID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkX19faXNEZXZlbG9wZXJDaGVjayk7CiAgICAgICAgCiAgICAgICAgLy8gY2hlY2sgZm9yIGNvb2tpZSBzZXNzaW9uIGlkCiAgICAgICAgLy92YXJfZHVtcCgkX0NPT0tJRSk7CiAgICAgICAgLy9pZiAoQURNSU4pCiAgICAgICAgLy97CiAgICAgICAgLy8gICAgdmFyX2R1bXAoJF9DT09LSUUpOwogICAgICAgIC8vICAgIGV4aXQ7CiAgICAgICAgLy99CiAgICAgICAgCiAgICAgICAgcmV0dXJuKGlzRGVidWdJUCgkZGlzcGxheSkpOwogICAgICAgICovCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGR1bXBGdW5jdGlvbkNhbGwoJG91dHB1dD1mYWxzZSkKICAgIHsKICAgICAgICBkdW1wKGdldEZ1bmN0aW9uQ2FsbCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkdW1wX3YyKCR2YXJpYWJsZSkKICAgIHsKICAgICAgICAkdHlwZSA9IGdldHR5cGUoJHZhcmlhYmxlKTsKCiAgICAgICAgJHJldCA9IGFycmF5KCk7CiAgICAgICAgJHJldFsibGFuZ3VhZ2UiXSA9ICJwaHAiOwogICAgICAgICRyZXRbInR5cGUiXSA9ICR0eXBlOwogICAgICAgIHN3aXRjaCgkdHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ2FycmF5JzoKICAgICAgICAgICAgICAgICRyZXRbInR5cGUyIl0gPSBjb3VudCgkdmFyaWFibGUpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR2YXJpYWJsZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHJldFsiaXRlbXMiXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGUgYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcmV0WyJpdGVtcyJdWyRrZXldID0gZHVtcF92MigkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICAgICAgJHJldFsidHlwZTIiXSA9IGdldF9jbGFzcygkdmFyaWFibGUpOwogICAgICAgICAgICAgICAgJHJldFsiaXRlbXMiXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAkeCA9IDA7CiAgICAgICAgICAgICAgICBmb3JlYWNoKGdldF9vYmplY3RfdmFycygkdmFyaWFibGUpIGFzICRuYW1lID0+ICR2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcmV0MiA9IGR1bXBfdjIoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAvLyRyZXQyWyJuYW1lIl0gPSAkbmFtZTsKICAgICAgICAgICAgICAgICAgICAkcmV0WyJpdGVtcyJdWyRuYW1lXSA9ICRyZXQyOwogICAgICAgICAgICAgICAgICAgIC8vaWYgKCR4ID09IDMpCiAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJldDIpOwogICAgICAgICAgICAgICAgICAgIC8vICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgIC8vJHgrKzsKICAgICAgICAgICAgICAgICAgICAvLyRyZXRbIml0ZW1zIl1bJG5hbWVdID0gYXJyYXkoInR5cGUiID0+ICJwcm9wZXJ0eSIsICJkYXRhIiA9PiAkbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgZm9yZWFjaChnZXRfY2xhc3NfbWV0aG9kcyhnZXRfY2xhc3MoJHZhcmlhYmxlKSkgYXMgJHZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZXRbIml0ZW1zIl1bJHZhbHVlXSA9IGFycmF5KCJ0eXBlIiA9PiAibWV0aG9kIiwgImRhdGEiID0+ICR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICAgICAgICAkcmV0WyJ0eXBlMiJdID0gc3RybGVuKCR2YXJpYWJsZSk7CiAgICAgICAgICAgICAgICAkcmV0WyJkYXRhIl0gPSAkdmFyaWFibGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgICAgICAgICAkcmV0WyJkYXRhIl0gPSAoJHZhcmlhYmxlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaW50ZWdlcic6CiAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzoKICAgICAgICAgICAgZGVmYXVsdDogCiAgICAgICAgICAgICAgICAkcmV0WyJkYXRhIl0gPSAoc3RyaW5nKSR2YXJpYWJsZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CgogICAgZnVuY3Rpb24gZHVtcF9oZXgoJHZhcmlhYmxlLCAkYXNTdHJpbmc9ZmFsc2UpCiAgICB7CiAgICAgICAgJGhleFZhcmlhYmxlID0gc3RyVG9IZXgoJHZhcmlhYmxlKTsKICAgICAgICAkaGV4ID0gIiI7CiAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IHN0cmxlbigkaGV4VmFyaWFibGUpIDsgJGkrPTIpCiAgICAgICAgewogICAgICAgICAgICAkaGV4IC49ICRoZXhWYXJpYWJsZVskaV0uJGhleFZhcmlhYmxlWyRpKzFdLiIoIi4kdmFyaWFibGVbJGkvMl0uIikgIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKGR1bXAoJGhleCwgJGFzU3RyaW5nKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGR1bXAoJHZhcmlhYmxlLCAkYXNTdHJpbmc9ZmFsc2UpCiAgICB7CiAgICAgICAgJGRtcCA9IGR1bXBfdjIoJHZhcmlhYmxlKTsKICAgICAgICBpZiAoJGFzU3RyaW5nKQogICAgICAgICAgICByZXR1cm4oJGRtcCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzaG93TWVzc2FnZSgkZG1wLCBtdERlYnVnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCAkZ3JvdXA9IiIsICRrZXk9IiIpCiAgICB7CiAgICAgICAgVE1lc3NhZ2VzOjplcnJvcigkbWVzc2FnZSwgJGdyb3VwLCAka2V5KTsKICAgICAgICAvL3Nob3dNZXNzYWdlKCRtZXNzYWdlLCBtdEVycm9yKTsKICAgIH0KICAgIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsICRncm91cD0iIiwgJGtleT0iIikKICAgIHsKICAgICAgICBUTWVzc2FnZXM6Ondhcm5pbmcoJG1lc3NhZ2UsICRncm91cCwgJGtleSk7CiAgICAgICAgLy9zaG93TWVzc2FnZSgkbWVzc2FnZSwgbXRXYXJuaW5nKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgJGdyb3VwPSIiLCAka2V5PSIiKQogICAgewogICAgICAgIFRNZXNzYWdlczo6bm90aWNlKCRtZXNzYWdlLCAkZ3JvdXAsICRrZXkpOwogICAgICAgIC8vc2hvd01lc3NhZ2UoJG1lc3NhZ2UsIG10V2FybmluZyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RXJyb3JzKCRncm91cD0iIikKICAgIHsKICAgICAgICByZXR1cm4oVE1lc3NhZ2VzOjpnZXRFcnJvcnMoJGdyb3VwKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXJuaW5ncygkZ3JvdXA9IiIpCiAgICB7CiAgICAgICAgcmV0dXJuKFRNZXNzYWdlczo6Z2V0V2FybmluZ3MoJGdyb3VwKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXROb3RpY2VzKCRncm91cD0iIikKICAgIHsKICAgICAgICByZXR1cm4oVE1lc3NhZ2VzOjpnZXROb3RpY2VzKCRncm91cCkpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWVzc2FnZXMoJGdyb3VwPSIiKQogICAgewogICAgICAgIHJldHVybihUTWVzc2FnZXM6OmdldE1lc3NhZ2VzKCRncm91cCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dNZXNzYWdlKCRtc2csICR0eXBlPTAsICRhc1N0cmluZz1mYWxzZSwgJGltbWVkaWF0ZU91dHB1dD1mYWxzZSkKICAgIHsKICAgICAgICBnbG9iYWwgJE1haW5Qcm9jZXNzOwogICAgICAgIC8vIGZvciBpbnN0YWxsZXIKICAgICAgICBpZiAoJE1haW5Qcm9jZXNzICYmIElOU1RBTExFUiA9PT0gdHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdHlwZSA9PSBtdEVycm9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICRtc2c7CiAgICAgICAgICAgICAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZ2xvYmFsICRfX29uU2h1dGRvd25SdW5uaW5nOwogICAgICAgIGlmICgkX19vblNodXRkb3duUnVubmluZykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkbXNnKSkKICAgICAgICAgICAgICAgIGVjaG8gJG1zZ1siZGF0YSJdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlY2hvICRtc2c7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZWNobyAkbXNnOwogICAgICAgIC8vZXhpdDsKICAgICAgICAKICAgICAgICAvL3JldHVybjsKICAgICAgICBnbG9iYWwgJGNvcmVNZXNzYWdlcywgJGNvcmVXYXJuaW5nTWVzc2FnZXMsICRjb3JlRXJyb3JNZXNzYWdlcywgJGNvcmVEZWJ1Z01lc3NhZ2VzOwogICAgICAgIGdsb2JhbCAkTWFpblByb2Nlc3M7CiAgICAgICAgZ2xvYmFsICRjb3JlTWVzc2FnZXNBcnJheSwgJGNvcmVXYXJuaW5nTWVzc2FnZXNBcnJheSwgJGNvcmVFcnJvck1lc3NhZ2VzQXJyYXksICRjb3JlRGVidWdNZXNzYWdlc0FycmF5OwogICAgICAgIAogICAgICAgICRfbWVzc2FnZSA9ICRtc2c7CiAgICAgICAgCiAgICAgICAgLy8kbWVzc2FnZSA9IGFycmF5KCJkYXRhIiA9PiAkbXNnLCAiZXhwYW5kIiA9PiBnZXRGdW5jdGlvbkNhbGwoKSk7CiAgICAgICAgJG1lc3NhZ2UgPSAkbXNnOwogICAgICAgIAogICAgICAgIC8vIHpwdXNvYnVqZSB2ZWxrZSBwcm9ibGVteSBwcmkgZGxvdWhvdHJ2YWppY2ljaCBza3JpcHRlY2ggYSB2eXBpc2VjaCBtb2MgcG9sb3playAtIHZpeiBkaXZva2Frb3NtZXRpa2EgLSB2eXBvY2V0IHByb3Zpemk8c3Bhbj48L3NwYW4+CiAgICAgICAgLy8gbmVqc3Bpc2UgdGltLCB6ZSBkdW1wdWppIG9iamVrdHkgCiAgICAgICAgZ2xvYmFsICRfX2xvZ0Z1bmN0aW9ucywgJF9faW5Mb2c7CiAgICAgICAgaWYgKCFpc19hcnJheSgkX19sb2dGdW5jdGlvbnMpKSAgICAKICAgICAgICAgICAgJF9fbG9nRnVuY3Rpb25zID0gYXJyYXkoKTsKICAgIAogICAgICAgIGlmICghJF9faW5Mb2cpCiAgICAgICAgewogICAgICAgICAgICAkX19pbkxvZyA9IHRydWU7CiAgICAgICAgCiAgICAgICAgICAgIGZvcmVhY2goJF9fbG9nRnVuY3Rpb25zIGFzICRsb2dGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJF90eXBlID0gIiI7CiAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPT0gbXRFcnJvcikKICAgICAgICAgICAgICAgICAgICAkX3R5cGUgPSAiZXJyb3IiOwogICAgICAgICAgICAgICAgaWYgKCR0eXBlID09IG10V2FybmluZykKICAgICAgICAgICAgICAgICAgICAkX3R5cGUgPSAid2FybmluZyI7CiAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPT0gbXREZWJ1ZykKICAgICAgICAgICAgICAgICAgICAkX3R5cGUgPSAiZHVtcCI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCRsb2dGdW5jdGlvbiwgJG1lc3NhZ2UsICIiLCAkX3R5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgICRfX2luTG9nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJE1haW5Qcm9jZXNzICYmICR0eXBlID09IG10RGVidWcpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAKICAgICAgICBpZiAoJE1haW5Qcm9jZXNzKQogICAgICAgIHsKICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIjxiciAvPiIuJE1haW5Qcm9jZXNzLT5fcHJvZ3Jlc3NUZXh0LiIgKCIuJE1haW5Qcm9jZXNzLT5wcm9ncmVzcy4iJSkiOwogICAgICAgIH0KCiAgICAgICAgZ2xvYmFsICRkZWJ1Z0Z1bmN0aW9uQ2FsbCwgJGR1bXBGdW5jdGlvbkNhbGw7CiAgICAgICAgaWYgKC8qKCR0eXBlID09IG10RXJyb3IgfHwgJHR5cGUgPT0gbXRXYXJuaW5nKSAmJiovICRkZWJ1Z0Z1bmN0aW9uQ2FsbCB8fCAkZHVtcEZ1bmN0aW9uQ2FsbCB8fCAkX1JFUVVFU1RbImRlYnVnRnVuY3Rpb25DYWxsIl0gfHwgJF9SRVFVRVNUWyJkdW1wRnVuY3Rpb25DYWxsIl0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJG1lc3NhZ2UpKQogICAgICAgICAgICAgICAgJG1lc3NhZ2VbImV4cGFuZCJdIC49IGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAiPGJyIC8+Ii5nZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gbmVlZGVkIGZvciBBRE1JTiBlcnJvcnMgYWZ0ZXIgc2F2ZSwgRm9ybUVycm9yLCAuLi4gCiAgICAgICAgaWYgKCR0eXBlID09IG10V2FybmluZykKICAgICAgICB7CiAgICAgICAgICAgICRjb3JlV2FybmluZ01lc3NhZ2VzQXJyYXlbXSA9IGFycmF5KCJkYXRhIiA9PiAkbWVzc2FnZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR0eXBlID09IG10RXJyb3IpCiAgICAgICAgewogICAgICAgICAgICAkY29yZUVycm9yTWVzc2FnZXNBcnJheVtdID0gYXJyYXkoImRhdGEiID0+ICRtZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIC8qCiAgICAgICAgaWYgKCFvYmplY3RFeGlzdHMoIkRlYnVnIikpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHR5cGUgPT0gbXRXYXJuaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29yZVdhcm5pbmdNZXNzYWdlc0FycmF5W10gPSBhcnJheSgiZGF0YSIgPT4gJG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0eXBlID09IG10RXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb3JlRXJyb3JNZXNzYWdlc0FycmF5W10gPSBhcnJheSgiZGF0YSIgPT4gJG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0eXBlID09IG10RGVidWcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb3JlRGVidWdNZXNzYWdlc0FycmF5W10gPSAkbWVzc2FnZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGdldE9iamVjdCgiRGVidWciKS0+c2hvd01lc3NhZ2UoJG1lc3NhZ2UsICR0eXBlKTsKICAgICAgICB9ICAgICAgICAKICAgICAgICAqLwogICAgICAgIGlmIChvYmplY3RFeGlzdHMoIkRlYnVnIikpCiAgICAgICAgewogICAgICAgICAgICBnZXRPYmplY3QoIkRlYnVnIiktPnNob3dNZXNzYWdlKCRtZXNzYWdlLCAkdHlwZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkX19iZWZvcmVEZWJ1Z01lc3NhZ2VzOwogICAgICAgICAgICAkX19iZWZvcmVEZWJ1Z01lc3NhZ2VzW10gPSBhcnJheSgibWVzc2FnZSI9PiRtZXNzYWdlLCAidHlwZSI9PiR0eXBlKTsKICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAvL2lmICgkdHlwZSA9PSBtdFdhcm5pbmcgJiYgKGlzRGV2ZWxvcGVyKCJkaXNwbGF5V2FybmluZ3MiKSAvKmdldE9iamVjdCgiU2V0dGluZ3MiKS0+ZGlzcGxheVdhcm5pbmdzICovIHx8ICRNYWluUHJvY2VzcyAvKmdldE9iamVjdCgiU2V0dGluZ3MiKS0+cHJvcGVydGllc1siZGVidWdNZXNzYWdlcyJdID09ICJkbVdhcm5pbmdzIiB8fCBnZXRPYmplY3QoIlNldHRpbmdzIiktPnByb3BlcnRpZXNbImRlYnVnTWVzc2FnZXMiXSA9PSAiZG1XYXJuaW5nc0Vycm9ycyIgKi8pKQogICAgICAgIC8qCiAgICAgICAgaWYgKGZhbHNlICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdHlwZSA9PSBtdFdhcm5pbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vJG1lc3NhZ2UgPSAiPGRpdiBjbGFzcz0nd2FybmluZyc+V2FybmluZzogIi4kbXNnLiI8L2Rpdj4iOwogICAgICAgICAgICAgICAgLy8kY29yZVdhcm5pbmdNZXNzYWdlcyAuPSAkbWVzc2FnZTsKICAgICAgICAgICAgICAgICRjb3JlV2FybmluZ01lc3NhZ2VzQXJyYXlbXSA9IGFycmF5KCJkYXRhIiA9PiAkbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9lbHNlIGlmICgkdHlwZSA9PSBtdEVycm9yICYmIChpc0RldmVsb3BlcigiZGlzcGxheUVycm9ycyIpIHx8ICRNYWluUHJvY2VzcykpCiAgICAgICAgICAgIGVsc2UgaWYgKCR0eXBlID09IG10RXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vJG1lc3NhZ2UgPSAiPGRpdiBjbGFzcz0nZXJyb3InPkVycm9yOiAiLiRtc2cuIjwvZGl2PiI7CiAgICAgICAgICAgICAgICAvLyRjb3JlRXJyb3JNZXNzYWdlcyAuPSAkbWVzc2FnZTsKICAgICAgICAgICAgICAgICRjb3JlRXJyb3JNZXNzYWdlc0FycmF5W10gPSBhcnJheSgiZGF0YSIgPT4gJG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0eXBlID09IG10Tm9ybWFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyRtZXNzYWdlID0gIjxkaXYgY2xhc3M9J25vcm1hbCc+U3lzdGVtIG1lc3NhZ2U6ICIuJG1zZy4iPC9kaXY+IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkdHlwZSA9PSBtdERlYnVnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyRtZXNzYWdlID0gIjxkaXYgY2xhc3M9J2RlYnVnJz4iLiRtc2cuIjwvZGl2PiI7CiAgICAgICAgICAgICAgICAvLyRtZXNzYWdlID0gIjxkaXYgY2xhc3M9J25vcm1hbCc+Ii4kbXNnLiI8L2Rpdj4iOwogICAgICAgICAgICAgICAgLy8kY29yZURlYnVnTWVzc2FnZXMgLj0gJG1lc3NhZ2U7CiAgICAgICAgICAgICAgICAkY29yZURlYnVnTWVzc2FnZXNBcnJheVtdID0gJG1lc3NhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNvcmVNZXNzYWdlc0FycmF5W10gPSAkbWVzc2FnZTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGdsb2JhbCAkX19pbk9uTWVzc2FnZTsKICAgICAgICAgICAgaWYgKEZBTFNFICYmICgkdHlwZSA9PSBtdEVycm9yIHx8ICR0eXBlID09IG10V2FybmluZykgJiYgISRfX2luT25NZXNzYWdlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX19pbk9uTWVzc2FnZSA9IHRydWU7CiAgICAgICAgICAgICAgICBnZXRUYWJsZSgiZXJyb3JfbG9nIiktPmluc2VydFJlY29yZChhcnJheSgKICAgICAgICAgICAgICAgICAgICAidHlwZSIgPT4gKCR0eXBlID09IG10RXJyb3IgPyAiZXJyb3IiIDogIndhcm5pbmciKSwKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIgPT4gJG1lc3NhZ2UsCiAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkX19pbk9uTWVzc2FnZSA9IGZhbHNlOyAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgICAgIGdsb2JhbCAkZGlyZWN0TWVzc2FnZU91dHB1dDsKICAgICAgICAKICAgICAgICBpZiAoJGRpcmVjdE1lc3NhZ2VPdXRwdXQgfHwgKCRNYWluUHJvY2VzcyAmJiAoaXNEZXZlbG9wZXIoKSAmJiAoJF9SRVFVRVNUWyJkZWJ1Z1Byb2Nlc3MiXSB8fCBzdHJwb3MoJF9DT09LSUVbIlByb2Nlc3Nlc1BIUERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSAhPT0gRkFMU0UpKSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHR5cGUgPT0gbXRXYXJuaW5nIHx8ICR0eXBlID09IG10RXJyb3IpCiAgICAgICAgICAgICAgICBlY2hvICI8ZGl2IHN0eWxlPSdjb2xvcjojRkYwMDAwO2JvcmRlcjoxcHggc29saWQgI0ZGNjY2NjtiYWNrZ3JvdW5kOiNGRkVFRUU7cGFkZGluZzoxMHB4O21hcmdpbjo1cHg7Jz4iLiRtZXNzYWdlLiI8L2Rpdj4iOwogICAgICAgICAgICAvL2lmICgkdHlwZSA9PSBtdERlYnVnKQogICAgICAgICAgICAvLyAgICBlY2hvICI8ZGl2IHN0eWxlPSdjb2xvcjojMDAwMEZGO2JvcmRlcjoxcHggc29saWQgIzY2NjZGRjtiYWNrZ3JvdW5kOiNFRUVFRkY7cGFkZGluZzoxMHB4O21hcmdpbjo1cHg7Jz4iLiRtZXNzYWdlLiI8L2Rpdj4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2lmICgkTWFpblByb2Nlc3MpCiAgICAgICAgLy8gICAgcmV0dXJuOwogICAgICAgIAogICAgICAgIGlmICgkTWFpblByb2Nlc3MgJiYgKCFkZWZpbmVkKCJJTlNUQUxMUFJPQ0VTUyIpIHx8ICFJTlNUQUxMUFJPQ0VTUykpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0eXBlID09IG10V2FybmluZyB8fCAkdHlwZSA9PSBtdEVycm9yKQogICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKCI8ZGl2IHN0eWxlPSdjb2xvcjojRkYwMDAwO2JvcmRlcjoxcHggc29saWQgI0ZGNjY2NjtiYWNrZ3JvdW5kOiNGRkVFRUU7cGFkZGluZzoxMHB4O21hcmdpbjo1cHg7Jz4iLiRtZXNzYWdlLiI8L2Rpdj4iKTsKICAgICAgICAgICAgLy8genB1c29idWplIHZlbGtlIHByb2JsZW15IHByaSBkbG91aG90cnZhamljaWNoIHNrcmlwdGVjaCBhIHZ5cGlzZWNoIG1vYyBwb2xvemVrIC0gdml6IGRpdm9rYWtvc21ldGlrYSAtIHZ5cG9jZXQgcHJvdml6aTxzcGFuPjwvc3Bhbj4KICAgICAgICAgICAgLy8gbmVqc3Bpc2UgdGltLCB6ZSBkdW1wdWppIG9iamVrdHkgCiAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAvLyAgICBwcm9jZXNzTWVzc2FnZSgiPGRpdiBzdHlsZT0nY29sb3I6I0ZGMDAwMDtib3JkZXI6MXB4IHNvbGlkICM2NjY2RkY7YmFja2dyb3VuZDojRUVFRUZGO3BhZGRpbmc6MTBweDttYXJnaW46NXB4Oyc+Ii4kbWVzc2FnZS4iPC9kaXY+Iik7CiAgICAgICAgfQoKICAgICAgICBpZiAoY291bnQoJGNvcmVNZXNzYWdlc0FycmF5KSA+IDEwMDAwMCkKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gIlBBTklDISBUT08gTUFOWSBFUlJPUlM6IDxociAvPiI7CiAgICAgICAgICAgIHZhcl9kdW1wKCRjb3JlTWVzc2FnZXNBcnJheSk7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm47CiAgICAgICAgCgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIGdsb2JhbCAkbm9Mb2c7IC8vIHRvIGRpc2FibGUgY3ljbGluZyAodGhlIGxvZ2dpbmcgYWxnb3JpdG0gY2FuIGdlbmVyYXRlIGVycm9yKQoKICAgICAgICBpZiAoJHR5cGUgPT0gbXRXYXJuaW5nIHx8ICR0eXBlID09IG10RXJyb3IpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPIC0gd2hlbiBlbmFibGUgY2hlY2sgYWxzbyBpbnN0YWxsLnBocCAtIGl0IGhhcyBubyBhY2Nlc3MgdG8gdGFibGVzCiAgICAgICAgICAgIGlmIChmYWxzZSAmJiAkbm9Mb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRub0xvZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICREYkxpbmsgPSBnZXREYkxpbmsoImNtc19sb2ciKTsgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlID09IG10V2FybmluZykKICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZVR5cGUgPSAibXRXYXJuaW5nIjsKICAgICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9PSBtdEVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlVHlwZSA9ICJtdEVycm9yIjsKCiAgICAgICAgICAgICAgICAgICAkc2VuZEVycm9ycyA9IGdldE9iamVjdCgiU2V0dGluZ3MiKS0+c2VuZEVycm9yczsKICAgICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9PSBtdEVycm9yICYmIGNvdW50KCRzZW5kRXJyb3JzKSA+IDApCiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8kRGJMaW5rLT5xdWVyeSgiSU5TRVJUIElOVE8gYGNtc19sb2dgIFNFVCBpZD1VVUlEKCksZGF0ZT1OT1coKSxtZXNzYWdlVHlwZT0nJG1lc3NhZ2VUeXBlJyxtZXNzYWdlPSciLnN0cl9yZXBsYWNlKCInIiwgIlxcJyIsICRtc2cpLiInLHVybD0nIi5TRVJWRVJVUkwuJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl0uIiciKTsKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAkTWFpbCA9IGNyZWF0ZU9iamVjdCgiTWFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICRNYWlsLT50cmFuc2xhdGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAkTWFpbC0+Y2hhclNldCA9ICJ1dGYtOCI7CiAgICAgICAgICAgICAgICAgICAgICAgJE1haWwtPmVycm9yU2VuZGluZyA9IHRydWU7IC8vIHRvIG9taXQgcmVjdXJzaW9uIGxvb3AKICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRzZW5kRXJyb3JzIGFzICRlbWFpbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNYWlsLT5hZGRSZWNpcGllbnQoJGVtYWlsKTsKICAgICAgICAgICAgICAgICAgICAgICAkTWFpbC0+c2V0U3ViamVjdCgiVmlzdWFsIFBIUOKEoiBFcnJvciAoIi4kX1NFUlZFUlsiU0VSVkVSX05BTUUiXS4kX1NFUlZFUlsiUkVRVUVTVF9VUkkiXS4iKSIpOwogICAgICAgICAgICAgICAgICAgICAgICRNYWlsLT5zZXRIdG1sQm9keSgkbXNnLiI8aHIgLz4iLnN0cl9kdW1wKCRfU0VSVkVSKSk7CiAgICAgICAgICAgICAgICAgICAgICAgJE1haWwtPnNlbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAkTWFpbC0+ZXJyb3JTZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICRub0xvZyA9IGZhbHNlOwovKgogICAgICAgICAgICAgICAgJFRhYmxlID0gZ2V0T2JqZWN0KCJUYWJsZXMiKS0+Z2V0VGFibGUoImNtc19sb2ciKTsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHJlY29yZFZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlID09IG10V2FybmluZykKICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZFZhbHVlc1sibWVzc2FnZVR5cGUiXSA9ICJtdFdhcm5pbmciOwogICAgICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9PSBtdEVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkVmFsdWVzWyJtZXNzYWdlVHlwZSJdID0gIm10RXJyb3IiOwoKICAgICAgICAgICAgICAgICAgICAkcmVjb3JkVmFsdWVzWyJtZXNzYWdlIl0gPSAkbXNnOwogICAgICAgICAgICAgICAgICAgICRyZWNvcmRWYWx1ZXNbInVybCJdID0gU0VSVkVSVVJMLiRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCRUYWJsZS0+cmVjb3JkRXhpc3RzKCRyZWNvcmRWYWx1ZXMsIGFycmF5KCJtZXNzYWdlVHlwZSIsIm1lc3NhZ2UiLCJ1cmwiKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gY291bnQoJFRhYmxlLT5Db21wb25lbnRzKTtleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkVmFsdWVzWyJjb3VudCJdID0gIntpc3FsOiBjb3VudCsxfSI7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYWJsZS0+dXBkYXRlUmVjb3JkKCRyZWNvcmRWYWx1ZXMsIGFycmF5KCJtZXNzYWdlVHlwZSIsIm1lc3NhZ2UiLCJ1cmwiKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyBjb3VudCgkVGFibGUtPkNvbXBvbmVudHMpO2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZWNvcmRWYWx1ZXNbImNvdW50Il0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUtPmluc2VydFJlY29yZCgkcmVjb3JkVmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZmFsc2UgJiYgJHR5cGUgPT0gbXRFcnJvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgiRXJyb3IgbG9nIGN5Y2xlZC4uLiIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgLy9yZXR1cm47CiAgICAgICAgICAgICAgICAvL2VjaG8gIkxvZyBjeWNsZWQuLi48YnIgLz4iOyAKICAgICAgICAgICAgICAgIGVjaG8gIkludGVybmFsIEVycm9yOiAiLiRtc2c7IAogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAkbm9Mb2cgPSBmYWxzZTsKICAgICAgICAKICAgICAgICBpZiAoJE1haW5Qcm9jZXNzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRtZXNzYWdlID09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoIkdPVCBFTVBUWSBNRVNTQUdFIC0gIi4kX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vcHJvY2Vzc01lc3NhZ2UoJG1lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHR5cGUgPT0gbXRXYXJuaW5nIHx8ICR0eXBlID09IG10RXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcigkbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkYXNTdHJpbmcgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHJldHVybigkbWVzc2FnZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKEFETUlOICYmICEkaW1tZWRpYXRlT3V0cHV0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29yZU1lc3NhZ2VzIC49ICRtZXNzYWdlOwogICAgICAgICAgICAgICAgLy9pZiAoaXNEZWJ1Z0lQKCkpCiAgICAgICAgICAgICAgICAvLyAgICAkY29yZU1lc3NhZ2VzIC49ICI8ZGl2IGNsYXNzPSd3YXJuaW5nJz4iLmR1bXBGdW5jdGlvbkNhbGwodHJ1ZSkuIjwvZGl2PiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29yZU1lc3NhZ2VzIC49ICRtZXNzYWdlOwogICAgICAgICAgICAgICAgLy9lY2hvICRtZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCR0eXBlID09IG10V2FybmluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICI8ZGl2IGNsYXNzPSd3YXJuaW5nJz5XYXJuaW5nOiAiLiRtc2cuIjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgJGNvcmVXYXJuaW5nTWVzc2FnZXMgLj0gJG1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoaXNEZWJ1Z0lQKCkpCiAgICAgICAgICAgICAgICAgICAgLy8gICAgJGNvcmVXYXJuaW5nTWVzc2FnZXMgLj0gZHVtcEZ1bmN0aW9uQ2FsbCh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCR0eXBlID09IG10RXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJF9fX3hjb3VudGVyOwogICAgICAgICAgICAgICAgICAgICRfX194Y291bnRlciA9ICRfX194Y291bnRlcisxOwogICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCRtc2cpOwogICAgICAgICAgICAgICAgICAgIGlmICgkX19feGNvdW50ZXIgPiAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIjxkaXYgY2xhc3M9J2Vycm9yJz5FcnJvcjogIi4kbXNnLiI8L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICRjb3JlRXJyb3JNZXNzYWdlcyAuPSAkbWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICAvL2lmIChpc0RlYnVnSVAoKSkKICAgICAgICAgICAgICAgICAgICAvLyAgICAkY29yZUVycm9yTWVzc2FnZXMgLj0gZHVtcEZ1bmN0aW9uQ2FsbCh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCmZ1bmN0aW9uIHByb2Nlc3NNZXNzYWdlKCRtZXNzYWdlLCAkZW5hYmxlZD1mYWxzZSkKewogICAgJGVuYWJsZWQgPSBmYWxzZTsKICAgIGdsb2JhbCAkTWFpblByb2Nlc3MsICRfX3Byb2Nlc3NNZXNzYWdlRW5hYmxlZCwgJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQsICRfX3Byb2Nlc3NNZXNzYWdlRmlsZTsKICAgIAogICAgaWYgKCRfX3Byb2Nlc3NNZXNzYWdlRW5hYmxlZCB8fCAkZW5hYmxlZCkKICAgIHsKICAgICAgICBpZiAoJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQgPT0gInBtb1NjcmVlbiIpCiAgICAgICAgewogICAgICAgICAgICAvLyBkbyBub3QgdXNlciBzaG93TWVzc2FnZSgpIC0gY2F1c2luZyByZWN1cnNpb24gY3ljbGluZwogICAgICAgICAgICBlY2hvICRtZXNzYWdlLiI8YnIgLz4iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkX19wcm9jZXNzTWVzc2FnZU91dHB1dCA9PSAicG1vRmlsZSIpCiAgICAgICAgewogICAgICAgICAgICAkZiA9IGZvcGVuKCRfX3Byb2Nlc3NNZXNzYWdlRmlsZSwgImEiKTsKICAgICAgICAgICAgZndyaXRlKCRmLCAkbWVzc2FnZS4iXHJcbiIpOwogICAgICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgICAgICAKICAgICAgICAgICAgY2htb2QoJF9fcHJvY2Vzc01lc3NhZ2VGaWxlLCBDSE1PRF9XUklURSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgLy8gcG1vVGFibGUKICAgICAgICB7CiAgICAgICAgICAgIC8vZWNobyAkbWVzc2FnZTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICBpZiAoJE1haW5Qcm9jZXNzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRtZXNzYWdlKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJE1haW5Qcm9jZXNzKTtleGl0OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyRNYWluUHJvY2Vzcy0+bWVzc2FnZSgkbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9lbHNlCiAgICAgICAgICAgIC8vewogICAgICAgICAgICAvLyAgICBlY2hvICJFcnJvcjogT2JqZWN0ICdNYWluUHJvY2Vzcycgbm90IGZvdW5kIjsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgLy99CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzTWVtb3J5KCRtZXNzYWdlKQp7CiAgICAvL3JldHVybjsKICAgIGdsb2JhbCAkTWFpblByb2Nlc3MsICRfX3Byb2Nlc3NNZXNzYWdlRW5hYmxlZCwgJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQ7CiAgICAKICAgIGlmICgkX19wcm9jZXNzTWVzc2FnZUVuYWJsZWQgfHwgJGVuYWJsZWQpCiAgICB7CiAgICAgICAgaWYgKCRfX3Byb2Nlc3NNZXNzYWdlT3V0cHV0ID09ICJwbW9TY3JlZW4iKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZG8gbm90IHVzZXIgc2hvd01lc3NhZ2UoKSAtIGNhdXNpbmcgcmVjdXJzaW9uIGN5Y2xpbmcKICAgICAgICAgICAgZWNobyAkbWVzc2FnZS4iPGJyIC8+IjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQgPT0gInBtb0ZpbGUiKQogICAgICAgIHsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGVsc2UgLy8gcG1vVGFibGUKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkTWFpblByb2Nlc3MpCiAgICAgICAgICAgICAgICAkTWFpblByb2Nlc3MtPm1lbW9yeSgkbWVzc2FnZSk7CiAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAvLyAgICBlY2hvICJFcnJvcjogT2JqZWN0ICdNYWluUHJvY2Vzcycgbm90IGZvdW5kIjsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFcnJvcigkbWVzc2FnZSkKewogICAgZ2xvYmFsICRNYWluUHJvY2VzcywgJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQ7CiAgICAKICAgIGlmICgkX19wcm9jZXNzTWVzc2FnZU91dHB1dCA9PSAicG1vU2NyZWVuIikKICAgIHsKICAgICAgICAvLyBkbyBub3QgdXNlciBzaG93TWVzc2FnZSgpIC0gY2F1c2luZyByZWN1cnNpb24gY3ljbGluZwogICAgICAgIGVjaG8gJG1lc3NhZ2UuIjxiciAvPiI7CiAgICB9CiAgICBlbHNlIGlmICgkX19wcm9jZXNzTWVzc2FnZU91dHB1dCA9PSAicG1vRmlsZSIpCiAgICB7CiAgICAgICAgCiAgICB9CiAgICBlbHNlIC8vIHBtb1RhYmxlCiAgICB7CiAgICAgICAgaWYgKCRNYWluUHJvY2VzcykKICAgICAgICAgICAgJE1haW5Qcm9jZXNzLT5lcnJvcigkbWVzc2FnZSk7CiAgICAgICAgLy9lbHNlCiAgICAgICAgLy8gICAgZWNobyAiRXJyb3I6IE9iamVjdCAnTWFpblByb2Nlc3MnIG5vdCBmb3VuZCI7CiAgICB9Cn0KCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ29yZS9mdW5jdGlvbnMuY29yZS5waHAgLS0tLS0tLSANCgppZiAoIWRlZmluZWQoIlNBRkVfTU9ERSIpKQp7CiAgICBpZiAoc3RydG9sb3dlcihpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIiB8fCBzdHJ0b2xvd2VyKGluaV9nZXQoInNhZmVfbW9kZSIpKSA9PSAidHJ1ZSIgfHwgaW5pX2dldCgic2FmZV9tb2RlIikgPT0gIjEiKQogICAgICAgIGRlZmluZSgiU0FGRV9NT0RFIiwgdHJ1ZSk7CiAgICBlbHNlCiAgICAgICAgZGVmaW5lKCJTQUZFX01PREUiLCBmYWxzZSk7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NTY3JpcHRSdW5uaW5nKCRpZCwgJHRpbWVvdXQ9MCkKewogICAgaWYgKCEkdGltZW91dCkKICAgICAgICAkdGltZW91dCA9IGdldE1heEV4ZWN1dGlvblRpbWUoKTsKCiAgICAkcmVjb3JkID0gZ2V0VGFibGUoInByb2Nlc3Nfc2NyaXB0cyIpLT5nZXRSZWNvcmQoImZpbHRlcj0oaWQ9JyIuJGlkLiInIE9SIG5hbWU9JyIuJGlkLiInKSIpOwogICAgaWYgKCRyZWNvcmRbImlkIl0pCiAgICB7CiAgICAgICAgJHByb2Nlc3NSZWNvcmQgPSBnZXRUYWJsZSgicHJvY2Vzc2VzIiktPmdldFJlY29yZCgiZmlsdGVyX25hbWU9Ii4kcmVjb3JkWyJuYW1lIl0uIixvcmRlckJ5PXRpbWVVcGRhdGUgREVTQyIpOwogICAgICAgIAogICAgICAgIGlmICgkcHJvY2Vzc1JlY29yZCAmJiAkcHJvY2Vzc1JlY29yZFsidGltZVVwZGF0ZSJdKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKF9zdHJ0b3RpbWUoJHByb2Nlc3NSZWNvcmRbInRpbWVVcGRhdGUiXSkgPCB0aW1lKCktJHRpbWVvdXQpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKGZhbHNlKTsgICAgCn0KICAgIApmdW5jdGlvbiBydW5Qcm9jZXNzU2NyaXB0KCRpZCwgJHBhcmFtcz1hcnJheSgpKQp7CiAgICAkcmVjb3JkID0gZ2V0VGFibGUoInByb2Nlc3Nfc2NyaXB0cyIpLT5nZXRSZWNvcmQoImZpbHRlcj0oaWQ9JyIuJGlkLiInIE9SIG5hbWU9JyIuJGlkLiInKSIpOwogICAgLy92YXJfZHVtcCgkcmVjb3JkKTsKICAgIC8vaWYgKCEkcmVjb3JkWyJpZCJdKQogICAgLy8gICAgJHJlY29yZCA9IGdldFRhYmxlKCJwcm9jZXNzX3NjcmlwdHMiKS0+Z2V0UmVjb3JkKCJ0aWQ9JyIuJGlkLiInIik7CiAgICAKICAgIGlmICgkcmVjb3JkWyJpZCJdKQogICAgewogICAgICAgICRQcm9jZXNzTWFuYWdlciA9IGdldE9iamVjdCgiUHJvY2Vzc01hbmFnZXIiKTsKICAgIAogICAgICAgIGlmIChjb3VudCgkcGFyYW1zKSAmJiBpc1NpbXBsZUFycmF5KCRwYXJhbXMpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XVsic2NyaXB0SWQiXSA9ICRyZWNvcmRbImlkIl07CiAgICAgICAgICAgICAgICBpZiAoISRwYXJhbXNbJGtleV1bIm1lc3NhZ2VzIl0gIT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV1bIm1lc3NhZ2VzIl0gPSB0cnVlOwogICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkcGFyYW1zWyRrZXldWyJydW5JbkJhY2tncm91bmQiXSkpCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XVsicnVuSW5CYWNrZ3JvdW5kIl0gPSB0cnVlOwogICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyRrZXldWyJjYXRjaEZhdGFsRXJyb3JzIl0gIT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV1bImNhdGNoRmF0YWxFcnJvcnMiXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1sic2NyaXB0SWQiXSA9ICRyZWNvcmRbImlkIl07CiAgICAgICAgICAgIGlmICghJHBhcmFtc1sibWVzc2FnZXMiXSAhPT0gZmFsc2UpCiAgICAgICAgICAgICAgICAkcGFyYW1zWyJtZXNzYWdlcyJdID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAgICAgaWYgKCFpc3NldCgkcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSkpCiAgICAgICAgICAgICAgICAkcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSA9IHRydWU7CiAgICAgICAgCiAgICAgICAgICAgIGlmICghJHBhcmFtc1siY2F0Y2hGYXRhbEVycm9ycyJdICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICRwYXJhbXNbImNhdGNoRmF0YWxFcnJvcnMiXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRwcm9jZXNzSWQgPSAkUHJvY2Vzc01hbmFnZXItPnJ1bigiUHJvY2Vzc1NjcmlwdCIsICRwYXJhbXMpOwogICAgICAgIC8vdmFyX2R1bXAoJHByb2Nlc3NJZCk7CiAgICAgICAgCiAgICAgICAgZ2xvYmFsICRNYWluUHJvY2VzczsKICAgICAgICBpZiAoJE1haW5Qcm9jZXNzKQogICAgICAgIHsKICAgICAgICAgICAgJE1haW5Qcm9jZXNzLT5uZXh0UHJvY2VzcyA9ICRwcm9jZXNzSWQ7CiAgICAgICAgICAgICRNYWluUHJvY2Vzcy0+c2F2ZVByb2dyZXNzKCk7CiAgICAgICAgfQogICAgCiAgICAgICAgcmV0dXJuKCRwcm9jZXNzSWQpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHNob3dNZXNzYWdlKCJydW5Qcm9jZXNzU2NyaXB0KCk6IHNjcmlwdCAnIi4kaWQuIicgbm90IGZvdW5kIiwgbXRFcnJvcik7CiAgICB9Cn0KCmZ1bmN0aW9uIHJ1blByb2Nlc3NTY3JpcHRzKCRwcm9jZXNzU2NyaXB0UXVldWU9YXJyYXkoKSkKewogICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgCiAgICAkbmV4dFByb2Nlc3NTY3JpcHQgPSBhcnJheV9zaGlmdCgkcHJvY2Vzc1NjcmlwdFF1ZXVlKTsKICAgICRuZXh0UHJvY2Vzc1NjcmlwdFsicGFyYW1zIl1bInByb2Nlc3NTY3JpcHRRdWV1ZSJdID0gJHByb2Nlc3NTY3JpcHRRdWV1ZTsKCiAgICByZXR1cm4ocnVuUHJvY2Vzc1NjcmlwdChmaXJzdF92YWx1ZSgkbmV4dFByb2Nlc3NTY3JpcHRbIm5hbWUiXSwgJG5leHRQcm9jZXNzU2NyaXB0WyJpZCJdKSwgJG5leHRQcm9jZXNzU2NyaXB0WyJwYXJhbXMiXSkpOwp9CgpmdW5jdGlvbiBydW5Qcm9jZXNzKCRvYmplY3RUeXBlLCAkcGFyYW1zPWFycmF5KCkpCnsKICAgICRQcm9jZXNzTWFuYWdlciA9IGdldE9iamVjdCgiUHJvY2Vzc01hbmFnZXIiKTsKICAgICRwcm9jZXNzSWQgPSAkUHJvY2Vzc01hbmFnZXItPnJ1bigkb2JqZWN0VHlwZSwgJHBhcmFtcyk7CgogICAgcmV0dXJuKCRwcm9jZXNzSWQpOwp9CgpmdW5jdGlvbiBnZXRMYW5ndWFnZSgpCnsKICAgIGdsb2JhbCAkbGFuZ3VhZ2U7CiAgICAKICAgIGlmICghJGxhbmd1YWdlKQogICAgICAgICRsYW5ndWFnZSA9ICRfR0VUWyJsYW5ndWFnZSJdOwoKICAgIGlmICghJGxhbmd1YWdlKQogICAgICAgICRsYW5ndWFnZSA9ICRfUE9TVFsibGFuZ3VhZ2UiXTsKCiAgICAvL3Zhcl9kdW1wKEFETUlOKTsKICAgIC8vdmFyX2R1bXAoJGxhbmd1YWdlKTsKICAgIC8vdmFyX2R1bXAoZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5kZWZhdWx0V2ViTGFuZ3VhZ2UpOwogICAgCiAgICBpZiAoISRsYW5ndWFnZSAmJiAhQURNSU4pCiAgICAgICAgJGxhbmd1YWdlID0gZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5kZWZhdWx0V2ViTGFuZ3VhZ2U7CgogICAgaWYgKCEkbGFuZ3VhZ2UpCiAgICAgICAgJGxhbmd1YWdlID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9ycyIpLT5nZXREZWZhdWx0TGFuZ3VhZ2UoKTsKICAgIAogICAgaWYgKCEkbGFuZ3VhZ2UpCiAgICAgICAgJGxhbmd1YWdlID0gImVuIjsKICAgICAgICAKICAgIC8vdmFyX2R1bXAoJGxhbmd1YWdlKTsKICAgIC8vZXhpdDsKICAgIHJldHVybigkbGFuZ3VhZ2UpOwp9CgpmdW5jdGlvbiBnZXRTdHlsZSgpCnsKICAgIGdsb2JhbCAkc3R5bGU7CiAgICAKICAgIHJldHVybigkc3R5bGUpOwp9CgokX19zdHlsZXMgPSBhcnJheSgpOwovKgpmdW5jdGlvbiBhZGRTdHlsZSgkbmFtZSwgJGVycm9yTWVzc2FnZT10cnVlKQp7CiAgICBnbG9iYWwgJF9fc3R5bGVzOwogICAgCiAgICAkU3R5bGUgPSBnZXRPYmplY3QoIlN0eWxlcyIpLT5nZXRTdHlsZSgkbmFtZSk7CiAgICBpZiAoJFN0eWxlKQogICAgewogICAgICAgIC8vIHNhdmVzIHRvIGZpbGVzeXN0ZW0KICAgICAgICAkU3R5bGUtPmdldENTUygpOwogICAgICAgIAogICAgICAgICRfX3N0eWxlc1skbmFtZV0gPSAkU3R5bGU7CiAgICB9Cn0KKi8KZnVuY3Rpb24gYWRkU3R5bGUoJG5hbWUpCnsKICAgIGdsb2JhbCAkX19zdHlsZXM7CiAgICAKICAgICRTdHlsZSA9IGdldE9iamVjdCgiU3R5bGVzIiktPmdldFN0eWxlKCRuYW1lKTsKICAgIC8vdmFyX2R1bXAoJFN0eWxlKTsKICAgIC8vZXhpdDsKICAgIC8vX21rZGlyKFBST0pFQ1RQQVRILiJ0ZXN0Iik7CiAgICBpZiAoJFN0eWxlICYmICRTdHlsZS0+aWQpCiAgICB7CiAgICAgICAgLy8gc2F2ZXMgdG8gZmlsZXN5c3RlbQogICAgICAgIC8vIHJlbW92ZWQgLSB3aWxsIHNhdmUgb24gZ2V0VXJsKCkgbWV0aG9kCiAgICAgICAgLy8kU3R5bGUtPmdldENTUygpOwogICAgICAgIAogICAgICAgICRfX3N0eWxlc1skbmFtZV0gPSAkU3R5bGU7CiAgICB9CiAgICAKICAgIC8vZHVtcChnZXRGdW5jdGlvbkNhbGwoKSk7CiAgICAvL2R1bXAoYXJyYXlfa2V5cygkX19zdHlsZXMpKTsKfQoKZnVuY3Rpb24gcmVtb3ZlU3R5bGUoJG5hbWUpCnsKICAgIGdsb2JhbCAkX19zdHlsZXMsICRfX3N0eWxlczIsICRfX3N0eWxlczM7CiAgICAKICAgIHVuc2V0KCRfX3N0eWxlc1skbmFtZV0pOwogICAgdW5zZXQoJF9fc3R5bGVzMlskbmFtZV0pOwogICAgdW5zZXQoJF9fc3R5bGVzM1skbmFtZV0pOwp9CgokX19zdHlsZXMyID0gYXJyYXkoKTsKZnVuY3Rpb24gYXBwZW5kU3R5bGUoJG5hbWUpCnsKICAgIGdsb2JhbCAkX19zdHlsZXMyOwogICAgCiAgICAkU3R5bGUgPSBnZXRPYmplY3QoIlN0eWxlcyIpLT5nZXRTdHlsZSgkbmFtZSk7CiAgICBpZiAoJFN0eWxlICYmICRTdHlsZS0+aWQpCiAgICB7CiAgICAgICAgLy8gc2F2ZXMgdG8gZmlsZXN5c3RlbQogICAgICAgIC8vIHJlbW92ZWQgLSB3aWxsIHNhdmUgb24gZ2V0VXJsKCkgbWV0aG9kCiAgICAgICAgLy8kU3R5bGUtPmdldENTUygpOwogICAgICAgIAogICAgICAgICRfX3N0eWxlczJbJG5hbWVdID0gJFN0eWxlOwogICAgfQp9CgokX19zdHlsZXMzID0gYXJyYXkoKTsKZnVuY3Rpb24gcHJlcGVuZFN0eWxlKCRuYW1lKQp7CiAgICBnbG9iYWwgJF9fc3R5bGVzMzsKICAgIAogICAgJFN0eWxlID0gZ2V0T2JqZWN0KCJTdHlsZXMiKS0+Z2V0U3R5bGUoJG5hbWUpOwogICAgaWYgKCRTdHlsZSAmJiAkU3R5bGUtPmlkKQogICAgewogICAgICAgIC8vIHNhdmVzIHRvIGZpbGVzeXN0ZW0KICAgICAgICAvLyByZW1vdmVkIC0gd2lsbCBzYXZlIG9uIGdldFVybCgpIG1ldGhvZAogICAgICAgIC8vJFN0eWxlLT5nZXRDU1MoKTsKICAgICAgICAKICAgICAgICAkX19zdHlsZXMzWyRuYW1lXSA9ICRTdHlsZTsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0QWxsUGFyYW1zQXNBcnJheSgkYWRkaXRpb25hbFBhcmFtcywgJGV4Y2x1ZGVOYW1lcz0iIiwgJG1ldGhvZD0iQk9USCIpCnsKICAgIGlmICghaXNfYXJyYXkoJGFkZGl0aW9uYWxQYXJhbXMpKQogICAgICAgICRhZGRpdGlvbmFsUGFyYW1zID0gZXh0cmFjdFBhcmFtcygkYWRkaXRpb25hbFBhcmFtcyk7CgogICAgaWYgKGlzX2FycmF5KCRleGNsdWRlTmFtZXMpKQogICAgICAgICRleGNsdWRlTmFtZXMgPSBpbXBsb2RlKCIsIiwgJGV4Y2x1ZGVOYW1lcyk7CgogICAgJGV4Y2x1ZGVOYW1lcyA9IHN0cl9yZXBsYWNlKCJ8IiwgIiwiLCAkZXhjbHVkZU5hbWVzKTsKICAgICRleGNsdWRlTmFtZXMgLj0gIiI7CgogICAgLy8ga3JhdmluYSBuZT8ganNvdSB0byBzdXBlcmdsb2JhbG5pIHByb21lbm5lCiAgICAvL2dsb2JhbCAkX0dFVDsKICAgIC8vZ2xvYmFsICRfUE9TVDsKCiAgICAkX0JPVEggPSBhcnJheSgpOwogICAgJF9CT1RIID0gYXJyYXlfbWVyZ2UoJF9CT1RILCAoJG1ldGhvZCA9PSAiR0VUIiB8fCAkbWV0aG9kID09ICJCT1RIIiA/ICRfR0VUIDogYXJyYXkoKSkpOwogICAgJF9CT1RIID0gYXJyYXlfbWVyZ2UoJF9CT1RILCAoJG1ldGhvZCA9PSAiUE9TVCIgfHwgJG1ldGhvZCA9PSAiQk9USCIgPyAkX1BPU1QgOiBhcnJheSgpKSk7CiAgICAKICAgICRuYW1lcyA9IGFycmF5X2tleXMoJF9CT1RIKTsKICAgICR2YWx1ZXMgPSBhcnJheV92YWx1ZXMoJF9CT1RIKTsKCiAgICAvL2R1bXAoJF9CT1RIKTsKICAgIAogICAgLy9kdW1wKCRfQk9USFsiZmlsdGVyT3BlcmF0b3JfZGF0ZSJdWzBdKTsKCiAgICBpZiAoQURNSU4pCiAgICB7CiAgICAgICAgJGV4Y2x1ZGVOYW1lcyAuPSAiLF9fZ3JpZFBvc2l0aW9uLF9fZ3JpZFBvc2l0aW9ucyxfX2dyaWRUcmVlTGV2ZWwsX19ncmlkS2V5LF9fZ3JpZFBhcmVudCxidWJibGVNZXNzYWdlVGl0bGUsYnViYmxlTWVzc2FnZVRleHQsYnViYmxlTWVzc2FnZUh0bWwiOwogICAgfQogICAgJGV4Y2x1ZGVOYW1lcyAuPSAiLGF1dGhMb2dpbixhdXRoUGFzc3dvcmQsYXV0aFVzZXJHcm91cCxhdXRoTG9nb3V0LGFudGlTcGFtQ29kZSxhbnRpU3BhbUNvZGVDaGVjayxzZW9QYXJhbXMsYXV0aEFkbWluTG9naW4sYXV0aEFkbWluUGFzc3dvcmQsZG9Qcm9maWxlLGR1bXBGdW5jdGlvbkNhbGwiOwogICAgCiAgICAkZXhjbHVkZU5hbWVzID0gZXhwbG9kZSgiLCIsICRleGNsdWRlTmFtZXMpOwogICAgJGV4Y2x1ZGVOYW1lcyA9IGFycmF5X21lcmdlKCRleGNsdWRlTmFtZXMsIGFycmF5KCJQSFBTRVNTSUQiKSk7CgogICAgLy8gY2xlYXIKICAgIGZvcmVhY2goJGV4Y2x1ZGVOYW1lcyBhcyAkbmFtZSkKICAgIHsKICAgICAgICBpZiAoc3RycG9zKCRuYW1lLCAiKiIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJF9CT1RIIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goInwiLnN0cl9yZXBsYWNlKCIqIiwgIiguKj8pIiwgJG5hbWUpLiJ8IiwgJGtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJF9CT1RIWyRrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB1bnNldCgkX0JPVEhbJG5hbWVdKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZvcmVhY2goJGFkZGl0aW9uYWxQYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgICRfQk9USFskbmFtZV0gPSAkdmFsdWU7CgogICAgZm9yZWFjaCgkX0JPVEggYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgeyAgICAKICAgICAgICBpZiAoaXNfc3RyaW5nKCRfQk9USFskbmFtZV0pICYmIHN0cnBvcygkX0JPVEhbJG5hbWVdLCAiaHR0cCIpID09IDApCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFsdWUgYXMgJGtleSA9PiAkdmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbCBhcyAka2V5MiA9PiAkdmFsMikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR2YWwyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR2YWwyIGFzICRrZXkzID0+ICR2YWwzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gISEhIGNhbm5vdCB1cmxlbmNvZGUgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyR2YWxbJGtleTNdID0gdXJsZW5jb2RlKCR2YWwzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbFska2V5M10gPSB0b1N0cmluZygkdmFsMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICEhISBjYW5ub3QgdXJsZW5jb2RlIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsWyRrZXkyXSA9IHRvU3RyaW5nKCR2YWwyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAhISEgY2Fubm90IHVybGVuY29kZSBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZVska2V5XSA9IHRvU3RyaW5nKCR2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyR2YWx1ZVska2V5XSA9IHN0cl9yZXBsYWNlKCIlMkIiLCAiICIsIHVybGVuY29kZSgkdmFsKSk7IC8vIHJlcGxhY2UgdXJsZW5jb2RlZCAiKyIgYXMgIiAiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkX0JPVEhbJG5hbWVdID0gdG9TdHJpbmcoJHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAvLyRfQk9USFskbmFtZV0gPSBzdHJfcmVwbGFjZSgiJTJCIiwgIiAiLCB1cmxlbmNvZGUoJHZhbHVlKSk7IC8vIHJlcGxhY2UgdXJsZW5jb2RlZCAiKyIgYXMgIiAiCiAgICAgICAgICAgICAgICAvLyAhISEgY2Fubm90IHVybGVuY29kZSBoZXJlCiAgICAgICAgICAgICAgICAkX0JPVEhbJG5hbWVdID0gdG9TdHJpbmcoJHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgLy9kdW1wKCRfQk9USCk7CiAgICByZXR1cm4oJF9CT1RIKTsKfQoKZnVuY3Rpb24gZ2V0QWxsUGFyYW1zQXNMaW5rKCRhZGRpdGlvbmFsUGFyYW1zID0gYXJyYXkoKSwgJGV4Y2x1ZGVOYW1lcz0iIiwgJG1ldGhvZD0iQk9USCIpCnsKICAgICRwYXJhbXMgPSBnZXRBbGxQYXJhbXNBc0FycmF5KCRhZGRpdGlvbmFsUGFyYW1zLCAkZXhjbHVkZU5hbWVzLCAkbWV0aG9kKTsKICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgIC8vZHVtcChnZXRQYXJhbXNBc0xpbmsoJHBhcmFtcykpOwogICAgCiAgICAvKgogICAgJHJldCA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgewogICAgICAgICRfcGFyYW1zID0gZ2V0UGFyYW1OYW1lc0FuZFZhbHVlcygkbmFtZSwgJHZhbHVlKTsKICAgICAgICAvL2R1bXAoJF9wYXJhbXMpOwogICAgICAgIAogICAgICAgIGZvcmVhY2goJF9wYXJhbXMgYXMgJHBhcmFtTmFtZSA9PiAkcGFyYW1WYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXRbXSA9ICRwYXJhbU5hbWUuIj0iLnVybGVuY29kZSh0b1N0cmluZygkcGFyYW1WYWx1ZSkpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybihpbXBsb2RlKCImIiwkcmV0KSk7CiAgICAqLwogICAgCiAgICByZXR1cm4oZ2V0UGFyYW1zQXNMaW5rKCRwYXJhbXMpKTsKfQoKZnVuY3Rpb24gZ2V0QWxsUGFyYW1zQXNGb3JtKCRhZGRpdGlvbmFsUGFyYW1zID0gYXJyYXkoKSwgJGV4Y2x1ZGVOYW1lcz0iIiwgJG1ldGhvZD0iQk9USCIpCnsKICAgICRwYXJhbXMgPSBnZXRBbGxQYXJhbXNBc0FycmF5KCRhZGRpdGlvbmFsUGFyYW1zLCAkZXhjbHVkZU5hbWVzLCAkbWV0aG9kKTsKICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICRyZXQgPSBhcnJheSgpOwoKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICB7CiAgICAgICAgJGh0bWwgLj0gdG9IaWRkZW4oJG5hbWUsICR2YWx1ZSwgdHJ1ZSwgZmFsc2UpLiJcbiI7CiAgICAgICAgLyoKICAgICAgICAkX3BhcmFtcyA9IGdldFBhcmFtTmFtZXNBbmRWYWx1ZXMoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgLy9kdW1wKCRfcGFyYW1zKTsKICAgICAgICAKICAgICAgICBmb3JlYWNoKCRfcGFyYW1zIGFzICRwYXJhbU5hbWUgPT4gJHBhcmFtVmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJHBhcmFtTmFtZSk7CiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1WYWx1ZSk7CiAgICAgICAgICAgIC8vJHBhcmFtVmFsdWUgPSBzdHJfcmVwbGFjZSgiXHIiLCAiIiwgJHBhcmFtVmFsdWUpOwogICAgICAgICAgICAvLyRwYXJhbVZhbHVlID0gc3RyX3JlcGxhY2UoIlxuIiwgIiIsICRwYXJhbVZhbHVlKTsKICAgICAgICAgICAgJHBhcmFtVmFsdWUgPSB0b1N0cmluZygkcGFyYW1WYWx1ZSk7CiAgICAgICAgICAgICRwYXJhbVZhbHVlID0gc3RyX3JlcGxhY2UoIlwiIiwgIiZxdW90OyIsICRwYXJhbVZhbHVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXRbXSA9ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIiLiRwYXJhbU5hbWUuIlwiIHZhbHVlPVwiIi4kcGFyYW1WYWx1ZS4iXCIgLz4iOwogICAgICAgIH0KICAgICAgICAqLwogICAgfQogICAgcmV0dXJuKCRodG1sKTsKCiAgICAvL3JldHVybihpbXBsb2RlKCJcbiIsJHJldCkpOwp9CgpmdW5jdGlvbiBnZXRQYXJhbXNBc0Zvcm0oJHBhcmFtcz1hcnJheSgpKQp7CiAgICAkcmV0ID0gYXJyYXkoKTsKICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICB7CiAgICAgICAgJGh0bWwgLj0gdG9IaWRkZW4oJG5hbWUsICR2YWx1ZSwgdHJ1ZSwgZmFsc2UpLiJcbiI7CiAgICB9CiAgICAvLyRodG1sID0gaGlkZUNvbXBvbmVudHMoJGh0bWwpOwogICAgcmV0dXJuKCRodG1sKTsKfQoKZnVuY3Rpb24gZ2V0UGFyYW1zQXNBcnJheSgkbmFtZXM9YXJyYXkoKSwgJG1ldGhvZD0iQk9USCIpCnsKICAgIGdsb2JhbCAkX0dFVDsKICAgIGdsb2JhbCAkX1BPU1Q7CgogICAgJF9CT1RIID0gYXJyYXkoKTsKICAgICRfQk9USCA9IGFycmF5X21lcmdlKCRfQk9USCwgKCRtZXRob2QgPT0gIkdFVCIgfHwgJG1ldGhvZCA9PSAiQk9USCIgPyAkX0dFVCA6IGFycmF5KCkpKTsKICAgICRfQk9USCA9IGFycmF5X21lcmdlKCRfQk9USCwgKCRtZXRob2QgPT0gIlBPU1QiIHx8ICRtZXRob2QgPT0gIkJPVEgiID8gJF9QT1NUIDogYXJyYXkoKSkpOwogICAgLy8kbmFtZXMgPSBhcnJheV9rZXlzKCRfQk9USCk7CiAgICAvLyR2YWx1ZXMgPSBhcnJheV92YWx1ZXMoJF9CT1RIKTsKCiAgICAvL2R1bXAoJF9CT1RIKTsKICAgIAogICAgaWYgKCFpc19hcnJheSgkbmFtZXMpKQogICAgICAgICRuYW1lcyA9IGV4cGxvZGUoIiwiLCAkbmFtZXMpOwoKICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgLy9kdW1wKCRuYW1lcyk7CiAgICBmb3JlYWNoKCRuYW1lcyBhcyAkbmFtZSkKICAgIHsKICAgICAgICBpZiAoc3RycG9zKCRuYW1lLCAiKiIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJF9CT1RIIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goInwiLnN0cl9yZXBsYWNlKCIqIiwgIiguKj8pIiwgJG5hbWUpLiJ8IiwgJGtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XSA9ICR2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1skbmFtZV0gPSAkQk9USFskbmFtZV07CiAgICAgICAgfQogICAgfQoKICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgIHJldHVybigkcGFyYW1zKTsKfQoKZnVuY3Rpb24gX2dldFBhcmFtc0FzTGluaygkcGFyYW0sICRrZXksICRlbXB0eT1mYWxzZSkKewogICAgaWYgKCRwYXJhbSA9PT0gTlVMTCkKICAgICAgICByZXR1cm4oYXJyYXkoKSk7CiAgICAKICAgICRfcGFyYW1zID0gYXJyYXkoKTsKICAgIGlmIChpc19hcnJheSgkcGFyYW0pKQogICAgewogICAgICAgIGZvcmVhY2goJHBhcmFtIGFzICRqID0+ICRfcGFyYW0pCiAgICAgICAgewogICAgICAgICAgICAkX3BhcmFtcyA9IGFycmF5X21lcmdlKCRfcGFyYW1zLCBfZ2V0UGFyYW1zQXNMaW5rKCRfcGFyYW0sICRrZXkuIlsiLiRqLiJdIikpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCFpc19vYmplY3QoJHBhcmFtKSkKICAgIHsKICAgICAgICAkX3ZhbHVlID0gIiI7CiAgICAgICAgaWYgKGlzX2Jvb2woJHBhcmFtKSkKICAgICAgICAgICAgJF92YWx1ZSA9ICgkcGFyYW0gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICBlbHNlIGlmICgkcGFyYW0pCiAgICAgICAgICAgICRfdmFsdWUgPSAkcGFyYW07CiAgICAgICAgCiAgICAgICAgaWYoJF92YWx1ZSAhPT0gIiIgfHwgJGVtcHR5KQogICAgICAgIHsKICAgICAgICAgICAgJF9wYXJhbXNbXSA9ICgka2V5LiI9Ii51cmxlbmNvZGUoJF92YWx1ZSkpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKCRfcGFyYW1zKTsKfQogICAgCmZ1bmN0aW9uIGdldFBhcmFtc0FzTGluaygkcGFyYW1zPWFycmF5KCksICRlbXB0eT1mYWxzZSkKewogICAgLy92YXJfZHVtcCgkcGFyYW1zKTsgZXhpdDsKICAgIC8vZHVtcCgiISEhIik7CiAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAkX3BhcmFtcyA9IGFycmF5KCk7CiAgICBpZiAoaXNfYXJyYXkoJHBhcmFtcykpCiAgICB7CiAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRwYXJhbU5hbWUgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1OYW1lKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAkX3BhcmFtcyA9IGFycmF5X21lcmdlKCRfcGFyYW1zLCBfZ2V0UGFyYW1zQXNMaW5rKCR2YWx1ZSwgJHBhcmFtTmFtZSwgJGVtcHR5KSk7CiAgICAgICAgfQogICAgfQogICAgLy9kdW1wKCRfcGFyYW1zKTsKICAgIHJldHVybihzdHJfcmVwbGFjZSgiKyIsICIlMjAiLCBpbXBsb2RlKCImIiwgJF9wYXJhbXMpKSk7Cn0KCgpmdW5jdGlvbiBnZXRQYXJhbU5hbWVzQW5kVmFsdWVzKCRuYW1lLCAkdmFsdWUpCnsKICAgICRyZXQgPSBhcnJheSgpOwogICAgCiAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkKICAgIHsKICAgICAgICBmb3JlYWNoKCR2YWx1ZSBhcyAkX25hbWUgPT4gJF92YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXQgPSBhcnJheV9tZXJnZSgkcmV0LCBnZXRQYXJhbU5hbWVzQW5kVmFsdWVzKCRuYW1lLiJbIi4kX25hbWUuIl0iLCAkX3ZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgZWxzZQogICAgICAgICRyZXRbJG5hbWVdID0gJHZhbHVlOwogICAgCiAgICByZXR1cm4oJHJldCk7Cn0KCmZ1bmN0aW9uIHNldExhbmd1YWdlKCRuZXdMYW5ndWFnZSwgJGV2ZW50cz10cnVlKQp7CiAgICAkbmV3TGFuZ3VhZ2UgPSBwcmVnX3JlcGxhY2UoIi9bXmEtekEtWjAtOV0rLyIsICIiLCAkbmV3TGFuZ3VhZ2UpOwogICAgLy9lY2hvICIhIi4kbmV3TGFuZ3VhZ2U7ZXhpdDsKICAgIGdsb2JhbCAkbGFuZ3VhZ2UsICRhY3RpdmVMYW5ndWFnZSwgJFRyYW5zbGF0b3I7CiAgICAvL2lmICgkZXZlbnRzKQogICAgLy8gICAgZHVtcCgkYWN0aXZlTGFuZ3VhZ2UpOwogICAgCiAgICBpZiAoJG5ld0xhbmd1YWdlICYmICRuZXdMYW5ndWFnZSAhPSAkYWN0aXZlTGFuZ3VhZ2UpCiAgICB7CiAgICAgICAgLy9kdW1wKCJzZXRMYW5ndWFnZTogIi4kbmV3TGFuZ3VhZ2UpOwogICAgCiAgICAgICAgaWYgKCRldmVudHMgJiYgb2JqZWN0RXhpc3RzKCJFdmVudHMiKSkKICAgICAgICAgICAgJGxhbmd1YWdlID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblNldExhbmd1YWdlIiwgYXJyYXkoImxhbmd1YWdlIj0+JG5ld0xhbmd1YWdlLCAib2xkTGFuZ3VhZ2UiPT4kYWN0aXZlTGFuZ3VhZ2UpLCAibGFuZ3VhZ2UiKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRsYW5ndWFnZSA9ICRuZXdMYW5ndWFnZTsKICAgICAgICAgICAgCiAgICAgICAgJGFjdGl2ZUxhbmd1YWdlID0gJGxhbmd1YWdlOwogICAgICAgICAgICAKICAgICAgICAkX1RyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3JzIiktPmdldFRyYW5zbGF0b3IoJG5ld0xhbmd1YWdlKTsKICAgICAgICBpZiAoJF9UcmFuc2xhdG9yKQogICAgICAgIHsKICAgICAgICAgICAgLy9fbG9nKCJYIik7CiAgICAgICAgICAgIC8vX2xvZygkbmV3TGFuZ3VhZ2UpOwogICAgICAgICAgICAvL19sb2coJF9UcmFuc2xhdG9yLT5sYW5ndWFnZSk7CiAgICAgICAgICAgIC8vIGFsc28gc2V0IGxvY2FsZSAtIGdvb2QgZm9yIHNvcnRpbmcgYXJyYXlzLCBkYXRlcywgdGltZXMsIC4uLgogICAgICAgICAgICAkX1RyYW5zbGF0b3ItPnNldExvY2FsZSgpOwogICAgICAgIAogICAgICAgICAgICAkVHJhbnNsYXRvciA9ICRfVHJhbnNsYXRvcjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8kX1RyYW5zbGF0b3IgPSBjcmVhdGVPYmplY3QoIlRyYW5zbGF0b3IiLCBhcnJheSgibGFuZ3VhZ2UiPT4kbmV3TGFuZ3VhZ2UpKTsKICAgICAgICAgICAgLy9kdW1wKCJUIik7CiAgICAgICAgICAgIC8vZHVtcCgkbmV3TGFuZ3VhZ2UpOwogICAgICAgICAgICAvL2lmICgkX1RyYW5zbGF0b3IpCiAgICAgICAgICAgIC8vICAgICRUcmFuc2xhdG9yID0gJF9UcmFuc2xhdG9yOwogICAgICAgICAgICAvLyRUcmFuc2xhdG9yLT5sYW5ndWFnZSA9ICRuZXdMYW5ndWFnZTsKICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgic2V0TGFuZ3VhZ2UoKTogbGFuZ3VhZ2UgJyIuJG5ld0xhbmd1YWdlLiInIG5vdCBmb3VuZCIsIG10RXJyb3IpOwogICAgICAgIH0KICAgIH0KfQogICAgCmZ1bmN0aW9uIGdldEN1cnJlbnRVcmwoJHBhcmFtcz1hcnJheSgpKQp7CiAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsKICAgIAogICAgZ2xvYmFsICRfX2N1cnJlbnRVcmw7CiAgICBpZiAoISRfX2N1cnJlbnRVcmwpCiAgICB7CiAgICAgICAgJHVybCA9IFVSTDsKICAgICAgICAkdXJsID0gdW5wYXJzZUxpbmsoJHVybCk7CiAgICAgICAgJGxpbmtJbmZvID0gZXhwbG9kZUxpbmsoJHVybCk7CiAgICAgICAgCiAgICAgICAgJF9fY3VycmVudFVybCA9ICRsaW5rSW5mbzsKICAgIH0KICAgIGVsc2UKICAgICAgICAkbGlua0luZm8gPSAkX19jdXJyZW50VXJsOyAgICAKICAgIAogICAgJGxpbmtJbmZvWyJwYXJhbXMiXSA9IGFycmF5X21lcmdlKCRsaW5rSW5mb1sicGFyYW1zIl0sICRwYXJhbXMpOwoKICAgIHJldHVybihpbXBsb2RlTGluaygkbGlua0luZm8pKTsKfQogICAgCmZ1bmN0aW9uIGV4dGVuZFVybCgkdXJsLCAkcGFyYW1zPWFycmF5KCkpCnsKICAgIC8vJHVybCA9IHVybGRlY29kZSgkdXJsKTsKICAgICRsaW5rSW5mbyA9IGV4cGxvZGVMaW5rKCR1cmwpOwogICAgJGxpbmtJbmZvWyJwYXJhbXMiXSA9IGFycmF5X21lcmdlKCRsaW5rSW5mb1sicGFyYW1zIl0sICRwYXJhbXMpOwogICAgCiAgICByZXR1cm4oaW1wbG9kZUxpbmsoJGxpbmtJbmZvKSk7Cn0KICAgIAogICAgCi8vIG9sZCBmdW5jdGlvbiBzZXRMYW5ndWFnZSgkbGFuZ3VhZ2UpCi8qCmZ1bmN0aW9uIGdldFVybFdpdGhMYW5ndWFnZSgkbGFuZ3VhZ2UpCnsKICAgIC8vZHVtcCgic2V0TGFuZ3VhZ2U6ICIuJGxhbmd1YWdlKTsKICAgIGdsb2JhbCAkZm91bmRTRU9QYXJhbXM7CiAgICBpZiAoaXNfYXJyYXkoJGZvdW5kU0VPUGFyYW1zKSAmJiBjb3VudCgkZm91bmRTRU9QYXJhbXMpID4gMCAmJiAkZm91bmRTRU9QYXJhbXNbInRhYmxlTmFtZSJdICE9ICIiKQogICAgewogICAgICAgICRyZXF1ZXN0VVJMID0gZ2V0VGFibGUoJGZvdW5kU0VPUGFyYW1zWyJ0YWJsZU5hbWUiXSktPmZpbGVOYW1lOwogICAgICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJGZvdW5kU0VPUGFyYW1zIGFzICRuYW1lID0+ICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkbmFtZSAhPSAidGFibGVOYW1lIikgIAogICAgICAgICAgICAgICAgJHBhcmFtc1tdID0gJG5hbWUuIj0iLiR2YWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvdW50KCRwYXJhbXMpKQogICAgICAgICAgICAkcmVxdWVzdFVSTCAuPSAiPyIuaW1wbG9kZSgiJiIsICRwYXJhbXMpOwogICAgICAgIAogICAgfQogICAgZWxzZQogICAgICAgICRyZXF1ZXN0VVJMID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107CiAgICAKICAgIC8vZHVtcCgkcmVxdWVzdFVSTCk7CiAgICBpZiAoc3RycG9zKCRyZXF1ZXN0VVJMLCAiLnBocCIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAvLyByZW1vdmUgb2xkIGxhbmd1YWdlCiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJgKFtcXD8mXSkobGFuZ3VhZ2U9KShbXiZdKikoJj8pYGltcyIsICRyZXF1ZXN0VVJMLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJHJlcXVlc3RVUkwsICImIikgPT09IEZBTFNFKQogICAgICAgICAgICAgICAgJHJlcXVlc3RVUkwgPSBzdHJfcmVwbGFjZSgkZWxlbXNbMF1bMV0uJGVsZW1zWzBdWzJdLiRlbGVtc1swXVszXSwgIiIsICRyZXF1ZXN0VVJMKTsKICAgICAgICAgICAgZWxzZSBpZiAoJGVsZW1zWzBdWzFdID09ICI/IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlcXVlc3RVUkwgPSBzdHJfcmVwbGFjZSgkZWxlbXNbMF1bMV0uJGVsZW1zWzBdWzJdLiRlbGVtc1swXVszXS4kZWxlbXNbMF1bNF0sICI/IiwgJHJlcXVlc3RVUkwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRyZXF1ZXN0VVJMID0gc3RyX3JlcGxhY2UoJGVsZW1zWzBdWzFdLiRlbGVtc1swXVsyXS4kZWxlbXNbMF1bM10sICIiLCAkcmVxdWVzdFVSTCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdHJwb3MoJHJlcXVlc3RVUkwsICI/IikpCiAgICAgICAgewogICAgICAgICAgICAkdXJsID0gc3RyX3JlcGxhY2UoIj8iLCAiP2xhbmd1YWdlPSIuJGxhbmd1YWdlLiImIiwgJHJlcXVlc3RVUkwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkdXJsID0gJHJlcXVlc3RVUkwuIj9sYW5ndWFnZT0iLiRsYW5ndWFnZTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJHVybCA9PSAiIikKICAgIHsKICAgICAgICAkdXJsID0gImluZGV4LnBocD9sYW5ndWFnZT0iLiRsYW5ndWFnZTsKICAgIH0KICAgIC8vZHVtcCgic2V0TGFuZ3VhZ2UoKTogIi4kdXJsKTsKICAgIAogICAgaWYgKHN0cnBvcygkdXJsLCAiLyIpID09PSAwKQogICAgICAgICR1cmwgPSBzdWJzdHIoJHVybCwgMSwgc3RybGVuKCR1cmwpKTsKICAgICR1cmwgPSBwYXJzZUxpbmtzKCR1cmwpOwogICAgCiAgICByZXR1cm4oJHVybCk7Cn0KKi8KCgpmdW5jdGlvbiBydW5JbkJhY2tncm91bmQoJHVybCwgJHRpbWVvdXQ9MSkKewogICAgaWYgKCR0aW1lb3V0ID09IDApCiAgICAgICAgJHRpbWVvdXQgPSA5OTk7CiAgICAgICAgCiAgICBpZiAoQGZpbGVfZXhpc3RzKCIvZGF0YS93ZWIvdmlzdWFscGhwLWJhY2tncm91bmQyLmxvZyIpKQogICAgewogICAgICAgICRmID0gZm9wZW4oIi9kYXRhL3dlYi92aXN1YWxwaHAtYmFja2dyb3VuZDIubG9nIiwgImEiKTsKICAgICAgICBmd3JpdGUoJGYsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiIpOwogICAgICAgIGZ3cml0ZSgkZiwgUFJPSkVDVFVSTC4iOiAiLiR1cmwuIlxyXG4iKTsKICAgICAgICBmd3JpdGUoJGYsICJ0aW1lOiAiLmRhdGUoIlktbS1kIEg6aTpzIikuIlxyXG4iKTsKICAgICAgICBmd3JpdGUoJGYsICJ0aW1lb3V0OiAiLiR0aW1lb3V0LiJcclxuIik7CiAgICB9ICAgICAgICAKICAgIC8vJHRpbWVvdXQgPSAxMDAwMDsKICAgIC8vIGZpcnN0IHRyeSB0byBsb2FkIHJlZmVyZW5jZSBwYWdlCiAgICAKICAgIGlmIChkZWZpbmVkKCJJTlNUQUxMUFJPQ0VTU1ZFUlNJT04iKSkKICAgICAgICAkY29udGVudCA9ICRfU0VSVkVSWyJTRVJWRVJfQUREUiJdOwogICAgZWxzZQogICAgeyAgICAKICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoUFJPSkVDVFBBVEguImNhY2hlL3Byb2Nlc3MuY2hlY2siLCAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSk7CiAgICAKICAgICAgICAkY29udGVudCA9IGRvd25sb2FkKFBST0pFQ1RVUkwuImNvcmUvY2xhc3Nlcy9fbmV3L1Byb2Nlc3MvY2hlY2sucGhwIiwgYXJyYXkoKSwgYXJyYXkoKSwgYXJyYXkoInRpbWVvdXQiID0+IDIsICJub1JlZGlyZWN0IiA9PiB0cnVlLCAibG9nIj0+ZmFsc2UpKTsKICAgICAgICAvL2VjaG8gIiEhISEhISEiOwogICAgICAgIC8vdmFyX2R1bXAoJGNvbnRlbnQpOyBleGl0OwogICAgICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxyIiwgIiIsICRjb250ZW50KTsKICAgICAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcbiIsICIiLCAkY29udGVudCk7CiAgICAgICAgJGNvbnRlbnQgPSB0cmltKCRjb250ZW50KTsKICAgIH0KICAgIAogICAgLy92YXJfZHVtcCgkY29udGVudCk7CiAgICAvL3Zhcl9kdW1wKCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdKTsKICAgIGlmICgkY29udGVudCA9PSAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSB8fCAkY29udGVudCA9PSAiIiAvKiBub3QgcmVhZGVkIHVudGlsIHRpbWVvdXQgKi8pCiAgICB7ICAgIAogICAgICAgICRjb250ZW50ID0gZG93bmxvYWQoJHVybCwgYXJyYXkoKSwgYXJyYXkoKSwgYXJyYXkoInRpbWVvdXQiID0+ICR0aW1lb3V0LCAibm9SZWRpcmVjdCIgPT4gdHJ1ZSwgImxvZyI9PmZhbHNlKSk7CiAgICAgICAgLy92YXJfZHVtcCgkY29udGVudCk7CiAgICAgICAgX2ZpbGVfYXBwZW5kX2NvbnRlbnRzKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAvcHJvY2Vzcy5vdXQiLCAicnVuSW5CYWNrZ3JvdW5kKCciLiR1cmwuIicpIG91dHB1dDogIi5zdHJfZHVtcCgkY29udGVudCkuIlxyXG4iKTsKICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlIHx8IHRyaW0oJGNvbnRlbnQpID09ICIiIC8qfHwgc3RybGVuKCRjb250ZW50KSA9PSAzICovfHwgJGNvbnRlbnQgPT0gMSB8fCBzdHJwb3MoJGNvbnRlbnQsICJwcm9jZXNzUmVzdW1lTGluayIpICE9PSBGQUxTRSkKICAgICAgICAgICAgJHJldCA9IHRydWU7CiAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygiL2RhdGEvd2ViL3Zpc3VhbHBocC1iYWNrZ3JvdW5kMi5sb2ciKSkKICAgICAgICAgICAgZndyaXRlKCRmLCAkY29udGVudC4iXHJcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChAZmlsZV9leGlzdHMoIi9kYXRhL3dlYi92aXN1YWxwaHAtYmFja2dyb3VuZDIubG9nIikpCiAgICAgICAgICAgIGZ3cml0ZSgkZiwgImNoZWNrLmh0bWw6ICIuJGNvbnRlbnQuIlxyXG4iKTsKICAgICAgICAKICAgICAgICBzaG93TWVzc2FnZSgicnVuSW5CYWNrZ3JvdW5kKCkgLSBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzIChsb2NhbDogIi4kX1NFUlZFUlsiU0VSVkVSX0FERFIiXS4iLCByZW1vdGU6ICIuc3RyX2R1bXAoJGNvbnRlbnQpLiIpIC0gaGF2ZSB5b3UgY2hhbmdlZCB5b3VyIGhvc3RzIGZpbGUgbG9jYWx5PyIsIG10RXJyb3IpOyAKICAgICAgICAKICAgICAgICAkcmV0ID0gRkFMU0U7CiAgICB9CiAgICAKICAgIGlmIChAZmlsZV9leGlzdHMoIi9kYXRhL3dlYi92aXN1YWxwaHAtYmFja2dyb3VuZDIubG9nIikpCiAgICB7CiAgICAgICAgZndyaXRlKCRmLCAkY29udGVudC4iXHJcbiIpOwogICAgICAgIC8vdmFyX2R1bXAoJGNvbnRlbnQpOwogICAgICAgIC8vZXhpdDsKICAgICAgICBmY2xvc2UoJGYpOwogICAgfQoKICAgIHJldHVybigkcmV0KTsKfQoKCiAgICBmdW5jdGlvbiBnZXRQZXJtaXNzaW9uUHJpb3JpdHkoJHBlcm1pc3Npb24sICR0eXBlPSJ0YWJsZSIpCiAgICB7CiAgICAgICAgaWYgKCR0eXBlID09ICJ0YWJsZSIpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2goJHBlcm1pc3Npb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgInRwRGVueSI6ICAgICAgICAgcmV0dXJuKDApOwogICAgICAgICAgICAgICAgY2FzZSAidHBSZWFkIjogICAgICAgICByZXR1cm4oMSk7CiAgICAgICAgICAgICAgICBjYXNlICJ0cFdyaXRlIjogICAgIHJldHVybigyKTsKICAgICAgICAgICAgICAgIGNhc2UgInRwUmVhZFdyaXRlIjogcmV0dXJuKDMpOwogICAgICAgICAgICAgICAgY2FzZSAidHBNb2RlcmF0ZSI6ICAgICByZXR1cm4oNCk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICByZXR1cm4oMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCR0eXBlID09ICJtb2R1bGUiKQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoKCRwZXJtaXNzaW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICJ0cERlbnkiOiAgICAgICAgIHJldHVybigwKTsKICAgICAgICAgICAgICAgIGNhc2UgInRwQWxsb3ciOiAgICAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgcmV0dXJuKDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkdHlwZSA9PSAicmVjb3JkIikKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCgkcGVybWlzc2lvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgcmV0dXJuKDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkdHlwZSA9PSAiY29tcG9uZW50IikKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCgkcGVybWlzc2lvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAiY3BEZW55IjogICAgICAgICByZXR1cm4oMCk7CiAgICAgICAgICAgICAgICBjYXNlICJjcE93bk9ubHkiOiAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICAgICAgY2FzZSAiY3BBbGwiOiAgICAgICAgIHJldHVybigyKTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHJldHVybigwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRUYWJsZSgkdGFibGVOYW1lLCAkZnVsbExvYWQ9dHJ1ZSwgJHdhcm5pbmc9dHJ1ZSkKICAgIHsKICAgICAgICAkVGFibGUgPSBnZXRPYmplY3QoIlRhYmxlcyIpLT5nZXRUYWJsZSgkdGFibGVOYW1lLCAkZnVsbExvYWQsICR3YXJuaW5nKTsKCiAgICAgICAgaWYgKCEkVGFibGUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHRhYmxlTmFtZSAmJiAkdGFibGVOYW1lICE9ICJlcnJvcl9wYWdlIikKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUYWJsZSBvYmplY3QgZm9yICciLiR0YWJsZU5hbWUuIicgbm90IGZvdW5kIC0gdXNpbmcgZHVtbXkiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICByZXR1cm4obmV3IFREdW1teU9iamVjdCgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybigkVGFibGUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiB0YWJsZUV4aXN0cygkdGFibGVOYW1lKQogICAgewogICAgICAgIGlmIChvYmplY3RFeGlzdHMoIlRhYmxlcyIpKQogICAgICAgICAgICByZXR1cm4oZ2V0T2JqZWN0KCJUYWJsZXMiKS0+dGFibGVFeGlzdHMoJHRhYmxlTmFtZSkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0YWJsZUxvYWRlZCgkdGFibGVOYW1lKQogICAgewogICAgICAgIGlmICgkdGFibGVOYW1lID09ICJ0YWJsZXMiKQogICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgIGVsc2UgaWYgKG9iamVjdEV4aXN0cygiVGFibGVzIikpCiAgICAgICAgICAgIHJldHVybihnZXRPYmplY3QoIlRhYmxlcyIpLT50YWJsZUxvYWRlZCgkdGFibGVOYW1lKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRhYmxlRmllbGRzRXhpc3RzKCR0YWJsZU5hbWUpCiAgICB7CiAgICAgICAgaWYgKG9iamVjdEV4aXN0cygiVGFibGVzIikgJiYgdGFibGVFeGlzdHMoJHRhYmxlTmFtZSkpCiAgICAgICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKCIhISEhISEhISEiKTsKICAgICAgICAgICAgLy92YXJfZHVtcChnZXRUYWJsZSgkdGFibGVOYW1lKS0+RmllbGRzKTsKICAgICAgICAgICAgcmV0dXJuKGdldFRhYmxlKCR0YWJsZU5hbWUpLT5GaWVsZHMgJiYgZ2V0VGFibGUoJHRhYmxlTmFtZSktPkZpZWxkcy0+bG9hZGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFBocENvZGVXaXRoR2xvYmFscygkY29kZSwgJHZhcmlhYmxlcykKICAgIHsKICAgICAgICAkcG9zdEZpeCA9ICJfIi5tZDUoVVVJRCgpKTsKICAgICAgICBmb3JlYWNoKCR2YXJpYWJsZXMgYXMgJHZhcmlhYmxlKQogICAgICAgIHsKICAgICAgICAgICAgJG5ld1Zhck5hbWUgPSBzdHJ0b3VwcGVyKCR2YXJpYWJsZVswXSkuJHBvc3RGaXg7CiAgICAgICAgICAgICRjb2RlID0gc3RyX3JlcGxhY2UoIlwkIi4kdmFyaWFibGVbMF0sICJcJCIuJG5ld1Zhck5hbWUsICRjb2RlKTsKCiAgICAgICAgICAgIGdsb2JhbCAkJG5ld1Zhck5hbWU7CiAgICAgICAgICAgICQkbmV3VmFyTmFtZSA9ICR2YXJpYWJsZVsxXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkZ2xvYmFscyAuPSAiZ2xvYmFsIFwkIi4kbmV3VmFyTmFtZS4iOyI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkZ2xvYmFscy4kY29kZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFBocENvZGVHbG9iYWxzKCRjb2RlLCAmJGdsb2JhbHNBcnJheT0iX19OVUxMX18iKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCIvWyRcJF1bXHddKy8iLCAkY29kZSwgJHZhcmlhYmxlcyk7CiAgICAgICAgJGdsb2JhbHMgPSBhcnJheSgpOwogICAgICAgIGlmICgkZ2xvYmFsc0FycmF5ICE9ICJfX05VTExfXyIpCiAgICAgICAgICAgICRnbG9iYWxzQXJyYXkgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGZvcmVhY2goJHZhcmlhYmxlcyBhcyAkdmFyaWFibGVBcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJHZhcmlhYmxlQXJyYXkgYXMgJHZhcmlhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cnN0cigiXCR0aGlzIiwgJHZhcmlhYmxlKSAmJiAkdmFyaWFibGUhPSJcJF9HRVQiICYmICR2YXJpYWJsZSE9IlwkX1BPU1QiICYmICR2YXJpYWJsZSE9IlwkX1JFUVVFU1QiICYmICR2YXJpYWJsZSE9IlwkX1NFU1NJT04iICYmICR2YXJpYWJsZSE9IlwkX0NPT0tJRSIgJiYgJHZhcmlhYmxlIT0iXCRfRklMRVMiKSAvLyBza2lwIGlubmVyIGNsYXNzIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRnbG9iYWxzWyR2YXJpYWJsZV0gPSAkdmFyaWFibGU7CgogICAgICAgICAgICAgICAgICAgIGlmICgkZ2xvYmFsc0FycmF5ICE9ICJfX05VTExfXyIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkX3ZhcmlhYmxlID0gc3RyX3JlcGxhY2UoIlwkIiwgIiIsICR2YXJpYWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhcmlhYmxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICQkX3ZhcmlhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJCRfdmFyaWFibGUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJF92YXJpYWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfb2JqZWN0KCQkX3ZhcmlhYmxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzQXJyYXlbJF92YXJpYWJsZV0gPSAkJF92YXJpYWJsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRnbG9iYWxzKQogICAgICAgICAgICByZXR1cm4oImdsb2JhbCAiLmltcGxvZGUoIiwiLCAkZ2xvYmFscykuIjsiKTsgICAgICAgIAogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXN0b3JlUGhwQ29kZUdsb2JhbHMoJGdsb2JhbHNBcnJheSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRnbG9iYWxzQXJyYXkgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICQkbmFtZTsKICAgICAgICAgICAgJCRuYW1lID0gJHZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgIH0KICAgIAogICAgZnVuY3Rpb24gc2V0TWlkKCRtaWQpCiAgICB7CiAgICAgICAgZ2xvYmFsICRfX2ZvdW5kTWlkOwogICAgICAgICRfX2ZvdW5kTWlkID0gJG1pZDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0TWlkKCRmaW5kSW5NZW51PXRydWUpCiAgICB7CiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgaWYgKEFETUlOKQogICAgICAgICAgICAkTWVudSA9IGdldE9iamVjdCgiQWRtaW5NZW51Iik7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkTWVudSA9IGdldE9iamVjdCgiV2ViTWVudSIpOwogICAgICAgIAogICAgICAgICRtaWQgPSAkTWVudS0+Z2V0TWlkKCRmaW5kSW5NZW51KTsKICAgICAgICByZXR1cm4oJG1pZCk7CiAgICB9ICAKICAgIAogICAgZnVuY3Rpb24gZ2V0TWlkcygkZmluZEluTWVudT10cnVlKQogICAgewogICAgICAgICRtaWQgPSBnZXRNaWQoJGZpbmRJbk1lbnUpOwogICAgICAgIGlmICgkbWlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKGV4cGxvZGUoInwiLCAkbWlkKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihhcnJheSgpKTsKICAgICAgICB9CiAgICB9ICAKCiAgICBmdW5jdGlvbiBnZXRNaWRCeUxldmVsKCRsZXZlbD0wLCAkZmluZEluTWVudT10cnVlKQogICAgewogICAgICAgICRyZXQgPSAiIjsKICAgICAgICAKICAgICAgICBnbG9iYWwgJF9fbWlkc0J5TGV2ZWw7CiAgICAgICAgCiAgICAgICAgaWYgKCFpc19hcnJheSgkX19taWRzQnlMZXZlbCkpCiAgICAgICAgICAgICRfX21pZHNCeUxldmVsID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICBpZiAoaXNzZXQoJF9fbWlkc0J5TGV2ZWxbJGxldmVsXSkpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJF9fbWlkc0J5TGV2ZWwpOwogICAgICAgICAgICByZXR1cm4oJF9fbWlkc0J5TGV2ZWxbJGxldmVsXSk7CiAgICAgICAgfQoKICAgICAgICAkbWlkID0gZ2V0TWlkKCRmaW5kSW5NZW51KTsKICAgICAgICAKICAgICAgICBpZiAoJG1pZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vJHBhcmVudExpc3QgPSBhcnJheSgkbWlkKTsKICAgICAgICAgICAgJHBhcmVudExpc3QgPSBhcnJheSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgJE1lbnUgPSBnZXRPYmplY3QoIldlYk1lbnUiKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkTWVudS0+aXRlbXMpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICRNZW51SXRlbSA9ICRNZW51LT5nZXRJdGVtQnlJZCgkbWlkKTsKICAgICAgICAgICAgd2hpbGUoJE1lbnVJdGVtLT5pZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHBhcmVudExpc3QgPSBhcnJheV9tZXJnZShhcnJheSgkTWVudUl0ZW0tPmlkKSwgJHBhcmVudExpc3QpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkTWVudUl0ZW0gPSAkTWVudUl0ZW0tPlBhcmVudEl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgkTWVudSk7CiAgICAgICAgICAgICRyZXQgPSAkcGFyZW50TGlzdFskbGV2ZWxdOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkX19taWRzQnlMZXZlbFskbGV2ZWxdID0gJHJldDsKCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfSAgCgogICAgZnVuY3Rpb24gZ2V0UGFyZW50TWlkKCRtaWQpCiAgICB7CiAgICAgICAgJG1pZCA9IGV4cGxvZGVMaXN0KCRtaWQpOwogICAgICAgICRtaWQgPSAkbWlkWzBdOwogICAgICAgIAogICAgICAgICRNZW51ID0gZ2V0T2JqZWN0KCJXZWJNZW51Iik7CiAgICAgICAgJE1lbnVJdGVtID0gJE1lbnUtPmdldEl0ZW1CeUlkKCRtaWQpOwoKICAgICAgICBpZiAoJE1lbnVJdGVtLT5pZCkKICAgICAgICB7CiAgICAgICAgICAgICRNZW51SXRlbSA9ICRNZW51SXRlbS0+UGFyZW50SXRlbTsKCiAgICAgICAgICAgIHJldHVybigkTWVudUl0ZW0tPmlkKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRNaWRCeUxldmVsKCRtaWQsICRsZXZlbD0wKQogICAgewogICAgICAgICRtaWQgPSBleHBsb2RlTGlzdCgkbWlkKTsKICAgICAgICAkbWlkID0gJG1pZFswXTsKICAgICAgICAKICAgICAgICAkcGFyZW50TGlzdCA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgICRNZW51ID0gZ2V0T2JqZWN0KCJXZWJNZW51Iik7CiAgICAgICAgJE1lbnVJdGVtID0gJE1lbnUtPmdldEl0ZW1CeUlkKCRtaWQpOwogICAgICAgIAogICAgICAgIHdoaWxlKCRNZW51SXRlbS0+aWQpCiAgICAgICAgewogICAgICAgICAgICAkcGFyZW50TGlzdCA9IGFycmF5X21lcmdlKGFycmF5KCRNZW51SXRlbS0+aWQpLCAkcGFyZW50TGlzdCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJE1lbnVJdGVtID0gJE1lbnVJdGVtLT5QYXJlbnRJdGVtOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKCRwYXJlbnRMaXN0WyRsZXZlbF0pOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBleHRyYWN0UHJlZml4KCRzZXBhcmF0b3IsICRzdHJpbmcpCiAgICB7CiAgICAgICAgaWYgKHN0cnBvcygkc3RyaW5nLCAkc2VwYXJhdG9yKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICAkc3RyaW5ncyA9IGV4cGxvZGUoJHNlcGFyYXRvciwgJHN0cmluZyk7CiAgICAgICAgICAgIHJldHVybigkc3RyaW5nc1swXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgICAgIHJldHVybigiIik7CiAgICB9CgogICAgZnVuY3Rpb24gZXh0cmFjdFBvc3RmaXgoJHNlcGFyYXRvciwgJHN0cmluZykKICAgIHsKICAgICAgICBpZiAoc3RycG9zKCRzdHJpbmcsICRzZXBhcmF0b3IpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICRzdHJpbmdzID0gZXhwbG9kZSgkc2VwYXJhdG9yLCAkc3RyaW5nKTsKICAgICAgICAgICAgcmV0dXJuKCRzdHJpbmdzWzFdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgcmV0dXJuKCRzdHJpbmcpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9UKCRwYXJhbSkKICAgIHsKICAgICAgICAgcmV0dXJuKHRyYW5zbGF0ZSgkcGFyYW0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXREZWZhdWx0RGJMaW5rKCkKICAgIHsKICAgICAgICAvL2dsb2JhbCAkRGVmYXVsdERiTGluazsKICAgICAgICAvL2lmICgkRGVmYXVsdERiTGluaykKICAgICAgICAvLyAgICByZXR1cm4oJERlZmF1bHREYkxpbmspOwogICAgICAgIAogICAgICAgIHJldHVybihnZXREYkxpbmtCeU5hbWUoImRlZmF1bHQiKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldERiTGluaygkdGFibGVOYW1lKQogICAgewogICAgICAgICRUYWJsZSA9IGdldFRhYmxlKCR0YWJsZU5hbWUpOwogICAgICAgIGlmICgkVGFibGUtPmRiTGluaykKICAgICAgICB7CiAgICAgICAgICAgICREYkxpbmsgPSBnZXREYkxpbmtCeU5hbWUoJFRhYmxlLT5kYkxpbmspOwogICAgICAgICAgICByZXR1cm4oJERiTGluayk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICREYkxpbmsgPSBnZXREZWZhdWx0RGJMaW5rKCk7CiAgICAgICAgICAgIHJldHVybigkRGJMaW5rKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldERiTGlua0J5TmFtZSgkbmFtZSkKICAgIHsKICAgICAgICBnbG9iYWwgJERlZmF1bHREYkxpbms7CiAgICAgICAgaWYgKCRuYW1lID09ICJkZWZhdWx0IiAmJiAkRGVmYXVsdERiTGluaykKICAgICAgICAgICAgcmV0dXJuKCREZWZhdWx0RGJMaW5rKTsKCiAgICAgICAgJERiTGlua3MgPSBnZXRPYmplY3QoIkRiTGlua3MiKTsKICAgICAgICBpZiAoISREYkxpbmtzKQogICAgICAgIHsKICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkVycm9yOiBPYmplY3QgJ0RiTGlua3MnIG5vdCBmb3VuZCIsIG10RXJyb3IpOwogICAgICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKCREYkxpbmtzLT5nZXREYkxpbmtCeU5hbWUoJG5hbWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXREYkxpbmtCeUlkKCRpZCkKICAgIHsKICAgICAgICAkRGJMaW5rcyA9IGdldE9iamVjdCgiRGJMaW5rcyIpOwogICAgICAgIGlmICghJERiTGlua3MpCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiRXJyb3I6IE9iamVjdCAnRGJMaW5rcycgbm90IGZvdW5kIiwgbXRFcnJvcik7CiAgICAgICAgICAgIHJldHVybihOVUxMKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKCREYkxpbmtzLT5nZXREYkxpbmtCeUlkKCRpZCkpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1bnNldFBhcmFtcygkcGFyYW1OYW1lcz0iIikKICAgIHsKICAgICAgICAgaWYgKCFpc19hcnJheSgkcGFyYW1OYW1lcykpCiAgICAgICAgICAgICRwYXJhbU5hbWVzID0gZXhwbG9kZSgiLCIsICRwYXJhbU5hbWVzKTsKCiAgICAgICAgZ2xvYmFsICRfR0VULCAkX1BPU1QsICRSRVFVRVNUOwoKICAgICAgICBmb3JlYWNoKCRwYXJhbU5hbWVzIGFzICRwYXJhbU5hbWUpCiAgICAgICAgewogICAgICAgICAgICAgdW5zZXQoJF9HRVRbJHBhcmFtTmFtZV0pOwogICAgICAgICAgICAgdW5zZXQoJF9QT1NUWyRwYXJhbU5hbWVdKTsKICAgICAgICAgICAgIHVuc2V0KCRfUkVRVUVTVFskcGFyYW1OYW1lXSk7CiAgICAgICAgICAgIGdsb2JhbCAkJHBhcmFtTmFtZTsKICAgICAgICAgICAgICQkcGFyYW1OYW1lID0gIiI7CiAgICAgICAgICAgIHVuc2V0KCRwYXJhbU5hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfZ2V0TWVtb3J5VXNhZ2UoJGRlc2NyaXB0aW9uID0gIiIpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkZWJ1ZzsKCiAgICAgICAgaWYgKHN0cnBvcygkZGVidWcsICJNZW1vcnkiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtZW1vcnlfZ2V0X3VzYWdlJykpCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRtZW1vcnlVc2FnZSA9IG1lbW9yeV9nZXRfdXNhZ2UoKTsKICAgICAgICAgICAgICAgIC8vcmV0dXJuICJNZW1vcnkgdXNhZ2U6ICIuJG1lbW9yeVVzYWdlLiIgKCIucm91bmQoJG1lbW9yeVVzYWdlLzEwMjQvMTAyNCwxKS4iTUIpIi4oJGRlc2NyaXB0aW9uICE9ICIiID8gIiAtICIuJGRlc2NyaXB0aW9uIDogIiIpLiI8YnIgLz4iOwogICAgICAgICAgICAgICAgcmV0dXJuICJNZW1vcnkgdXNhZ2U6ICIucm91bmQoJG1lbW9yeVVzYWdlLzEwMjQvMTAyNCwxKS4iTUIiLigkZGVzY3JpcHRpb24gIT0gIiIgPyAiIC0gIi4kZGVzY3JpcHRpb24gOiAiIikuIjxiciAvPiI7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdsb2JhbCAkc3RhcnRXaW5kb3dzTWVtb3J5VXNhZ2U7CiAgICAgICAgICAgICAgICAkbWVtb3J5VXNhZ2UgPSBnZXRXaW5kb3dzTWVtb3J5VXNhZ2UoKS0kc3RhcnRXaW5kb3dzTWVtb3J5VXNhZ2U7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiAiTWVtb3J5IHVzYWdlOiAiLnJvdW5kKCRtZW1vcnlVc2FnZS8xMDI0LzEwMjQsMSkuIk1CIi4oJGRlc2NyaXB0aW9uICE9ICIiID8gIiAtICIuJGRlc2NyaXB0aW9uIDogIiIpLiI8YnIgLz4iOwogICAgICAgICAgICAgICAgLy9yZXR1cm4gKCJNZW1vcnkgdXNhZ2U6ICIuc3Vic3RyKCRvdXRwdXRbNV0sIHN0cnBvcygkb3V0cHV0WzVdLCAnOicpICsgMSkuIjxiciAvPiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgcmV0dXJuICJNZW1vcnkgdXNhZ2U6IE4vQTxiciAvPiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oIiIpOwogICAgfQoKCiAgICBmdW5jdGlvbiBnZXRVcmxXaXRoUGFyYW1zKCRhZGRpdGlvbmFsUGFyYW1zID0gYXJyYXkoKSwgJG1ldGhvZD0iQk9USCIpCiAgICB7CiAgICAgICAgaWYgKCFpc19hcnJheSgkYWRkaXRpb25hbFBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICAkYWRkaXRpb25hbFBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJGFkZGl0aW9uYWxQYXJhbXMsICIsIik7CiAgICAgICAgfQogICAgICAgICRleGNsdWRlTmFtZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJGFkZGl0aW9uYWxQYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gIiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRleGNsdWRlTmFtZXNbXSA9ICRuYW1lOwogICAgICAgICAgICAgICAgdW5zZXQoJGFkZGl0aW9uYWxQYXJhbXNbJG5hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBnbG9iYWwgJGZpbGVOYW1lOwogICAgICAgIAogICAgICAgICRwYXJhbXMgPSBnZXRPYmplY3QoIkh0bWxQYWdlIiktPmdldEFsbFBhcmFtc0FzTGluaygkYWRkaXRpb25hbFBhcmFtcywgaW1wbG9kZSgiLCIsICRleGNsdWRlTmFtZXMpLCAkbWV0aG9kKTsKICAgICAgICAkdXJsID0gJGZpbGVOYW1lLigkcGFyYW1zID8gIj8iLiRwYXJhbXMgOiAiIik7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCR1cmwpOwogICAgfSAgICAKICAgICAgICAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJkYXRlX3BhcnNlX2Zyb21fZm9ybWF0IikpCnsKICAgIGZ1bmN0aW9uIGRhdGVfcGFyc2VfZnJvbV9mb3JtYXQoJGZvcm1hdCwgJGRhdGUpCiAgICB7CiAgICAgICAgJHJldCA9IGFycmF5KCk7CgogICAgICAgIHByZWdfbWF0Y2hfYWxsKCJ8KFthLXpdKXxpIiwgJGZvcm1hdCwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUik7CiAgICAgICAgCiAgICAgICAgJF9mb3JtYXQgPSAkZm9ybWF0OwogICAgICAgICRfZm9ybWF0ID0gc3RyX3JlcGxhY2UoIiAiLCAiICsiLCAkX2Zvcm1hdCk7CiAgICAgICAgJF9mb3JtYXQgPSBzdHJfcmVwbGFjZSgibiIsICIoWzAtOV0rKSIsICRfZm9ybWF0KTsKICAgICAgICAkX2Zvcm1hdCA9IHN0cl9yZXBsYWNlKCJqIiwgIihbMC05XSspIiwgJF9mb3JtYXQpOwogICAgICAgICRfZm9ybWF0ID0gc3RyX3JlcGxhY2UoIlkiLCAiKFswLTldKykiLCAkX2Zvcm1hdCk7CiAgICAgICAgJF9mb3JtYXQgPSBzdHJfcmVwbGFjZSgiSCIsICIoWzAtOV0rKSIsICRfZm9ybWF0KTsKICAgICAgICAkX2Zvcm1hdCA9IHN0cl9yZXBsYWNlKCJpIiwgIihbMC05XSspIiwgJF9mb3JtYXQpOwogICAgICAgICRfZm9ybWF0ID0gc3RyX3JlcGxhY2UoInMiLCAiKFswLTldKykiLCAkX2Zvcm1hdCk7CiAgICAgICAgCiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8Ii4kX2Zvcm1hdC4ifGkiLCAkZGF0ZSwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcigkaSA9IDAgOyAkaSA8IGNvdW50KCRlbGVtcykgOyAkaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkbmFtZSA9ICRlbGVtc1skaV1bMV07CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkbWF0Y2hlc1swXVskaSsxXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3dpdGNoKCRuYW1lKQogICAgICAgICAgICAgICAgeyAgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgIm4iOiAgICRyZXRbIm1vbnRoIl0gPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgImoiOiAgICRyZXRbImRheSJdID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBjYXNlICJZIjogICAkcmV0WyJ5ZWFyIl0gPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgIkgiOiAgICRyZXRbImhvdXIiXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaSI6ICAgJHJldFsibWludXRlIl0gPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgInMiOiAgICRyZXRbInNlY29uZCJdID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9ICAgIAp9CgpmdW5jdGlvbiBtb2RSZXdyaXRlQXZhaWxhYmxlKCkKewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9nZXRfbW9kdWxlcycpKQogICAgeyAKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIHBocGluZm8oKTsgCiAgICAgICAgJGNvbnRlbnQgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgIkxvYWRlZCBNb2R1bGVzIikgIT09IEZBTFNFKQogICAgICAgICAgICByZXR1cm4oc3RycG9zKCRjb250ZW50LCAibW9kX3Jld3JpdGUiKSAhPT0gRkFMU0UpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKHRydWUpOyAvLyBtYXliZSB5ZXMsIG1heWJlIG5vdCAtIGxldCdzIHJhdGhlciBzYXkgeWVzCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmV0dXJuKGluX2FycmF5KCdtb2RfcmV3cml0ZScsYXBhY2hlX2dldF9tb2R1bGVzKCkpKTsKICAgIH0KfQoKLyoKZnVuY3Rpb24gZ2V0UGFnZTQwNEh0bWwoKQp7CiAgICBnbG9iYWwgJHN0eWxlOwogICAgJF9vbGRTdHlsZSA9ICRzdHlsZTsKICAgICRzdHlsZSA9ICI0MDQiOwogICAgICAgICAgICAgICAgICAgIAogICAgJExheW91dCA9IGdldE9iamVjdCgiTGF5b3V0cyIpLT5nZXRMYXlvdXQoImdsb2JhbCIpOwogICAgaWYgKCRMYXlvdXQpCiAgICB7CiAgICAgICAgZ2xvYmFsICRsYXlvdXROYW1lLCAkTWFpblRhYmxlLCAkdGFibGVOYW1lOwogICAgICAgICRsYXlvdXROYW1lID0gImdsb2JhbCI7CiAgICAgICAgaWYgKCEkdGFibGVOYW1lKQogICAgICAgICAgICAkdGFibGVOYW1lID0gImluZGV4IjsKICAgICAgICAkTWFpblRhYmxlID0gZ2V0VGFibGUoJHRhYmxlTmFtZSk7CgogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgaW5jbHVkZShDT1JFUEFUSC4iY29yZS9sYXlvdXQubGliLnBocCIpOwogICAgICAgICRodG1sT3V0cHV0ID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CgogICAgICAgICRodG1sT3V0cHV0ID0gcGFyc2VFbWFpbCgkaHRtbE91dHB1dCk7CgogICAgICAgIC8vIGlmIGNoYW5nZWQgc2VlIGFsc28gYWpheC5saWIucGhwCiAgICAgICAgaWYgKGlzRGV2ZWxvcGVyKCJkaXNwbGF5RGVidWciKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifCg8Ym9keVtePl0qPil8aW1zIiwgJGh0bWxPdXRwdXQsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRodG1sT3V0cHV0ID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMF1bMV0sICRtYXRjaGVzWzBdWzFdLmdldE9iamVjdCgiRGVidWciKS0+Z2V0V2ViQ29udGVudCgkaHRtbE91dHB1dCksICRodG1sT3V0cHV0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIUFETUlOKQogICAgICAgIHsKICAgICAgICAgICAgJGh0bWxPdXRwdXQgPSBnZXRPYmplY3QoIkRlYnVnIiktPnBhcnNlT3V0cHV0SFRNTCgkaHRtbE91dHB1dCk7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgIH0KICAgICAgICAKICAgICRzdHlsZSA9ICRfb2xkU3R5bGU7CiAgICAKICAgIHJldHVybigkaHRtbE91dHB1dCk7Cn0KCmZ1bmN0aW9uIHNob3dQYWdlNDA0KCkKewogICAgaWYgKGlzU2VhcmNoRW5naW5lKCkgJiYgKGdldE9iamVjdCgiU2V0dGluZ3MiKS0+cGFnZTQwNCA9PSAicDQwNFNlYXJjaEVuZ2luZXMiIHx8IGdldE9iamVjdCgiU2V0dGluZ3MiKS0+cGFnZTQwNCA9PSAicDQwNEFsbCIpKQogICAgewogICAgICAgIGhlYWRlcigiSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCIpOwogICAgICAgIHdyaXRlU3RhdHMoKTsKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CiAgICBlbHNlIGlmICghaXNTZWFyY2hFbmdpbmUoKSAmJiAoZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5wYWdlNDA0ID09ICJwNDA0UGVvcGxlIiB8fCBnZXRPYmplY3QoIlNldHRpbmdzIiktPnBhZ2U0MDQgPT0gInA0MDRBbGwiKSkKICAgIHsKICAgICAgICAkaHRtbE91dHB1dCA9IGdldFBhZ2U0MDRIdG1sKCk7CiAgICAgICAgaWYgKCRodG1sT3V0cHV0KQogICAgICAgIHsKICAgICAgICAgICAgaGVhZGVyKCJIVFRQLzEuMCA0MDQgTm90IEZvdW5kIik7CiAgICAgICAgICAgIGVjaG8gJGh0bWxPdXRwdXQ7CiAgICAgICAgICAgIHdyaXRlU3RhdHMoKTsKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CiAgICAKICAgIHJldHVybihmYWxzZSk7Cn0gICAgIAoqLyAgICAgICAgICAgCgpmdW5jdGlvbiBzZXRTdHlsZSgkc3R5bGVOYW1lLCAkdGVtcG9yYXJ5PWZhbHNlKQp7CiAgICBnbG9iYWwgJF9fc3R5bGU7CiAgICAvLyB3aWxsIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgYmVmb3JlIG91dHB1dGluZwogICAgLyoKICAgIGlmICghJHRlbXBvcmFyeSkKICAgIHsKICAgICAgICByZW1vdmVTdHlsZSgkc3R5bGUpOwogICAgICAgIGFkZFN0eWxlKCRzdHlsZU5hbWUpOwogICAgfQogICAgKi8KICAgIGdsb2JhbCAkc3R5bGU7CiAgICAkc3R5bGUgPSAkc3R5bGVOYW1lOwogICAgCiAgICAkX19zdHlsZSA9ICRzdHlsZU5hbWU7CiAgICAKICAgIC8vIHBhayBzZSB0byBydmUgZG8gb2RrYXp1IC0gZGF0IHByeWMgb2QgdG9obyBqZSBQZXJzaXN0ZW50UGFyYW1ldGVycwogICAgaWYgKCRzdHlsZU5hbWUgIT0gImRlZmF1bHQiICYmICRzdHlsZU5hbWUgIT0gZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5kZWZhdWx0V2ViU3R5bGUpCiAgICAgICAgJF9HRVRbInN0eWxlIl0gPSAkc3R5bGVOYW1lOwp9ICAgICAgICAgICAgICAgCgpmdW5jdGlvbiBnZXRKc1BhcmFtcygkcGFyYW1zPWFycmF5KCksICRhcnJheUFzT2JqZWN0PWZhbHNlLCAkcmVjdXJzaW9uPWZhbHNlKQp7CiAgICAvL2lmICgka2V5c0FzU3RyaW5nKQogICAgLy8gICAgJGtleVN0ciA9ICJcIiI7CiAgICAvL2Vsc2UKICAgIC8vICAgICRrZXlTdHIgPSAiIjsKICAgICAgICAKICAgIAogICAgLy9kdW1wKCJTVEFSVC0tIi4kcmVjdXJzaW9uKTsKICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgIGlmICghaXNfYXJyYXkoJHBhcmFtcykpCiAgICAgICAgJHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7CiAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgCiAgICAkanNQYXJhbXMgPSBhcnJheSgpOwogICAgCiAgICAkaXNTaW1wbGVBcnJheSA9IGlzU2ltcGxlQXJyYXkoJHBhcmFtcyk7CiAgICAKICAgIGlmICghJHJlY3Vyc2lvbiAmJiAhJGlzU2ltcGxlQXJyYXkgJiYgIWlzX2FycmF5KCRwYXJhbXNbImV2ZW50cyJdKSkKICAgIHsKICAgICAgICAvL2R1bXAoIkFBIik7CiAgICAgICAgJHBhcmFtc1siZXZlbnRzIl0gPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJG5hbWUgIT0gImV2ZW50cyIgJiYgc3RycG9zKCRuYW1lLCAib24iKSA9PT0gMCAmJiBvcmQoJG5hbWVbMl0pID49IG9yZCgiQSIpICYmIG9yZCgkbmFtZVsyXSkgPD0gb3JkKCJaIikgJiYgJHZhbHVlICE9ICIiKSAvLyBjYW1lbGl6ZWQgb25Bbnl0aGluZwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX3ZhbHVlID0gJHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX3ZhbHVlLCAiZnVuY3Rpb24oIikgIT09IDApCiAgICAgICAgICAgICAgICAgICAgJF92YWx1ZSA9ICJmdW5jdGlvbigpeyIuJF92YWx1ZS4ifSI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRwYXJhbXNbImV2ZW50cyJdWyRuYW1lXSA9ICRfdmFsdWU7CgogICAgICAgICAgICAgICAgLy9kdW1wKCItLS0tLS0tLSIpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRuYW1lKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zWyJldmVudHMiXSk7CiAgICAgICAgICAgICAgICAvLyRwYXJhbXNbImV2ZW50cyJdWyRuYW1lXSA9ICJmdW5jdGlvbihfdGhpcyl7Ii5zdHJfcmVwbGFjZSgidGhpcyIsICJfdGhpcyIsICR2YWx1ZSkuIn0iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICBpZiAoY291bnQoJHBhcmFtc1siZXZlbnRzIl0pID09IDApCiAgICAgICAgICAgIHVuc2V0KCRwYXJhbXNbImV2ZW50cyJdKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRwYXJhbXNbImV2ZW50cyJdIGFzICRuYW1lID0+ICR2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtc1skbmFtZV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vZHVtcCgiLi4gIi4kcmVjdXJzaW9uKTsKICAgIC8vZHVtcCgkcGFyYW1zKTsKCiAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJGtleSA9PiAkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCRpc1NpbXBsZUFycmF5KQogICAgICAgICAgICAka2V5U3RyID0gIiI7CiAgICAgICAgZWxzZQogICAgICAgICAgICAka2V5U3RyID0gIlwiIjsKICAgICAgICAKICAgICAgICBpZiAoaXNfc3RyaW5nKCR2YWx1ZSkgJiYgc3RycG9zKCR2YWx1ZSwgIntwaHA6IikgIT09IEZBTFNFKQogICAgICAgICAgICAkanNQYXJhbXNbXSA9ICgkYXJyYXlBc09iamVjdCB8fCAhJGlzU2ltcGxlQXJyYXkgPyAka2V5U3RyLiRrZXkuJGtleVN0ci4iOiIgOiAiIikuIlwiYmFzZTY0OiIuYmFzZTY0X2VuY29kZSgkdmFsdWUpLiJcIiI7CiAgICAgICAgZWxzZSBpZiAoaXNfc3RyaW5nKCR2YWx1ZSkgJiYgc3RycG9zKCR2YWx1ZSwgImZ1bmN0aW9uKCIpID09PSAwKQogICAgICAgICAgICAkanNQYXJhbXNbXSA9ICgkYXJyYXlBc09iamVjdCB8fCAhJGlzU2ltcGxlQXJyYXkgPyAka2V5U3RyLiRrZXkuJGtleVN0ci4iOiIgOiAiIikuJHZhbHVlLiIiOwogICAgICAgIGVsc2UgaWYgKGlzX2Jvb2woJHZhbHVlKSkKICAgICAgICAgICAgJGpzUGFyYW1zW10gPSAoJGFycmF5QXNPYmplY3QgfHwgISRpc1NpbXBsZUFycmF5ID8gJGtleVN0ci4ka2V5LiRrZXlTdHIuIjoiIDogIiIpLigkdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKS4iIjsKICAgICAgICBlbHNlIGlmIChpc19pbnQoJHZhbHVlKSB8fCBpc19kb3VibGUoJHZhbHVlKSB8fCBpc19mbG9hdCgkdmFsdWUpKQogICAgICAgICAgICAkanNQYXJhbXNbXSA9ICgkYXJyYXlBc09iamVjdCB8fCAhJGlzU2ltcGxlQXJyYXkgPyAka2V5U3RyLiRrZXkuJGtleVN0ci4iOiIgOiAiIikuJHZhbHVlOwogICAgICAgIGVsc2UgaWYgKGlzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgICAgIC8vJGpzUGFyYW1zW10gPSAoJGFycmF5QXNPYmplY3QgfHwgISRpc1NpbXBsZUFycmF5ID8gJGtleVN0ci4ka2V5LiRrZXlTdHIuIjoiIDogIiIpLmdldEpzUGFyYW1zKCR2YWx1ZSwgJGFycmF5QXNPYmplY3QsICgka2V5ID09PSAiZXZlbnRzIikpLiIiOwogICAgICAgICAgICAkanNQYXJhbXNbXSA9ICgkYXJyYXlBc09iamVjdCB8fCAhJGlzU2ltcGxlQXJyYXkgPyAka2V5U3RyLiRrZXkuJGtleVN0ci4iOiIgOiAiIikuZ2V0SnNQYXJhbXMoJHZhbHVlLCAkYXJyYXlBc09iamVjdCwgdHJ1ZSkuIiI7ICAvLyBtdXNpbSB0cnVlIC0gdHJlYmEga3Z1bGkgdXByYXZlIGtvbXBvbmVudHkgdiBhZG1pbnUsIGtkeSBqZWRub3UgeiBwb2xvemVrIGplIG9uTmVjbyB1ZGFsb3N0IHYgcGFyYW1zW3ZhbHVlc10gYSB0YW0gbmVjaGNpIHByZXZhZGV0IG5hID0gZnVuY3Rpb24oKXt9CiAgICAgICAgZWxzZSBpZiAoIWlzX29iamVjdCgkdmFsdWUpKQogICAgICAgIHsKICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIlxcIiwgIlxcXFwiLCAkdmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXCIiLCAiXFxcIiIsICR2YWx1ZSk7CiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCJcciIsICIiLCAkdmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXG4iLCAiXFxuIiwgJHZhbHVlKTsKICAgICAgICAgICAgLy8kdmFsdWUgPSBzdHJfcmVwbGFjZSgie3BocDoiLCAieyNwaHA6IiwgJHZhbHVlKTsKICAgICAgICAKICAgICAgICAgICAgLy8gc2NyaXB0IG11c3QgTk9UIGNvbnRhaW4gPC9zY3JpcHQ+ICAtIENocm9tZSB0aGlua3MgdGhlIHNjcmlwdCBlbmRzIGFuZCB0aHJvd3MgZXJyb3IKICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIjwvc2NyaXB0PiIsICI8L3NjclxcXCIrXFxcImlwdD4iLCAkdmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiPGZvcm0+IiwgIjxmb1xcXCIrXFxcInJtPiIsICR2YWx1ZSk7CiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCI8L2Zvcm0+IiwgIjwvZm9cXFwiK1xcXCJybT4iLCAkdmFsdWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGpzUGFyYW1zW10gPSAoJGFycmF5QXNPYmplY3QgfHwgISRpc1NpbXBsZUFycmF5ID8gJGtleVN0ci4ka2V5LiRrZXlTdHIuIjoiIDogIiIpLiJcIiIuJHZhbHVlLiJcIiI7CiAgICAgICAgfQogICAgICAgIC8vJGpzUGFyYW1zW10gPSAoISRpc1NpbXBsZUFycmF5ID8gIlwiIi4ka2V5LiJcIjoiIDogIiIpLiJcIiIuc3RyX3JlcGxhY2UoIlxuIiwgIlxcXG4iLCBzdHJfcmVwbGFjZSgiXCIiLCAiXFxcIiIsIHN0cl9yZXBsYWNlKCJcXCIsICJcXFxcIiwgJHZhbHVlKSkpLiJcIiI7CiAgICAgICAgICAgIAogICAgfQogICAgCiAgICBpZiAoISRhcnJheUFzT2JqZWN0ICYmICRpc1NpbXBsZUFycmF5KQogICAgICAgICRyZXQgPSAiWyIuaW1wbG9kZSgiLCIsICRqc1BhcmFtcykuIl0iOwogICAgZWxzZQogICAgICAgICRyZXQgPSAieyIuaW1wbG9kZSgiLCIsICRqc1BhcmFtcykuIn0iOwogICAgICAgIAogICAgLy8kcmV0ID0gc3RyX3JlcGxhY2UoIj4iLCAiJmd0OyIsICRyZXQpOwogICAgCiAgICByZXR1cm4oJHJldCk7Cn0KCiAgICAkY3NzTWFwID0gYXJyYXkoCiAgICAgICAgIndpZHRoIiA9PiAiIiwKICAgICAgICAiaGVpZ2h0IiA9PiAiIiwKICAgICAgICAibWluV2lkdGgiID0+ICJtaW4td2lkdGgiLAogICAgICAgICJtaW5IZWlnaHQiID0+ICJtaW4taGVpZ2h0IiwKICAgICAgICAiZm9udFNpemUiID0+ICJmb250LXNpemUiLAogICAgICAgICJib3JkZXIiID0+ICIiLAogICAgICAgICJiYWNrZ3JvdW5kIiA9PiAiIiwKICAgICAgICAiZmxvYXQiID0+ICIiLAogICAgICAgICJwYWRkaW5nIiA9PiAiIiwKICAgICAgICAibWFyZ2luIiA9PiAiIiwKICAgICAgICAicG9zaXRpb24iID0+ICIiLAogICAgICAgICJkaXNwbGF5IiA9PiAiIiwKICAgICAgICAib3ZlcmZsb3ciID0+ICIiLAogICAgICAgICIiID0+ICIiLAogICAgKTsKCmZ1bmN0aW9uIGV4dHJhY3RDU1MoJHBhcmFtcz1hcnJheSgpKQp7CiAgICBnbG9iYWwgJGNzc01hcDsKICAgIAogICAgaWYgKCFpc19hcnJheSgkcGFyYW1zKSkKICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsKCiAgICAkY3NzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCRuYW1lICYmIChpc3NldCgkY3NzTWFwWyRuYW1lXSkgfHwgc3RycG9zKCRuYW1lLCAiY3NzLiIpID09PSAwKSkKICAgICAgICB7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoImNzcy4iLCAiIiwgJG5hbWUpOwogICAgICAgICAgICAkY3NzTmFtZSA9ICRjc3NNYXBbJG5hbWVdID8gJGNzc01hcFskbmFtZV0gOiAkbmFtZTsKICAgICAgICAgICAgaWYgKCR2YWx1ZSkKICAgICAgICAgICAgICAgICRjc3NbJGNzc05hbWVdID0gJHZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJHBhcmFtc1sic3R5bGUiXSkKICAgIHsKICAgICAgICAkY3NzID0gYXJyYXlfbWVyZ2UoJGNzcywgZXhwbG9kZUNTUygkcGFyYW1zWyJzdHlsZSJdKSk7CiAgICB9CiAgICAKICAgIHJldHVybigkY3NzKTsKfQogICAgCmZ1bmN0aW9uIGV4cGxvZGVDU1MoJHN0eWxlKQp7CiAgICBpZiAoaXNfYXJyYXkoJHN0eWxlKSkKICAgICAgICByZXR1cm4oJHN0eWxlKTsKICAgIAogICAgJHN0eWxlID0gc3RyX3JlcGxhY2UoIjoiLCAiPSIsICRzdHlsZSk7CiAgICAkc3R5bGUgPSBzdHJfcmVwbGFjZSgiaHR0cD0vLyIsICJodHRwOi8vIiwgJHN0eWxlKTsKICAgICRzdHlsZSA9IHN0cl9yZXBsYWNlKCJodHRwcz0vLyIsICJodHRwczovLyIsICRzdHlsZSk7CiAgICAkX3N0eWxlcyA9IGV4dHJhY3RQYXJhbXMoJHN0eWxlLCAiOyIsIGZhbHNlKTsKCiAgICAkY3NzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goJF9zdHlsZXMgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgewogICAgICAgIGlmICgkdmFsdWUpCiAgICAgICAgICAgICRjc3NbdHJpbSgkbmFtZSldID0gdHJpbSgkdmFsdWUpOwogICAgfQogICAgCiAgICByZXR1cm4oJGNzcyk7Cn0KCmZ1bmN0aW9uIGltcGxvZGVDU1MoJHBhcmFtcz1hcnJheSgpKQp7CiAgICAkcGFyYW1zID0gZXh0cmFjdENTUygkcGFyYW1zKTsKICAgIAogICAgJGNzc1BhcmFtcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKSAgICAKICAgIHsKICAgICAgICAkY3NzUGFyYW1zW10gPSAkbmFtZS4iOiIuJHZhbHVlOwogICAgfQogICAgCiAgICByZXR1cm4oaW1wbG9kZSgiOyIsICRjc3NQYXJhbXMpKTsKfSAgICAKZnVuY3Rpb24gZ2V0Q1NTUGFyYW1zKCRwYXJhbXM9YXJyYXkoKSkKewogICAgcmV0dXJuKGltcGxvZGVDU1MoJHBhcmFtcykpOwp9CgpmdW5jdGlvbiB1bnNldENzc1BhcmFtcygmJHBhcmFtcz1hcnJheSgpKQp7CiAgICBnbG9iYWwgJGNzc01hcDsKCiAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXMpKQogICAgICAgICRwYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRwYXJhbXMpOwoKICAgIGZvcmVhY2goJGNzc01hcCBhcyAkbmFtZSA9PiAkY3NzTmFtZSkKICAgIHsKICAgICAgICB1bnNldCgkcGFyYW1zWyRuYW1lXSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEF0dHJpYnV0ZVBhcmFtcygkcGFyYW1zPWFycmF5KCksICRyYXc9ZmFsc2UpCnsKICAgICRhdHRyaWJ1dGVzID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsKICAgIAogICAgJGF0dHJpYnV0ZU5hbWVzID0gYXJyYXkoCiAgICAgICAgImlkIiwgIm5hbWUiLCAidmFsdWUiLCAiY2xhc3MiLCAic3R5bGUiLCAKICAgICAgICAicmVhZG9ubHkiLCAiZGlzYWJsZWQiLCAicGxhY2Vob2xkZXIiLCAicmVxdWlyZWQiLCAic2l6ZSIsICJ0aXRsZSIsICJhdXRvY29tcGxldGUiLCAicGF0dGVybiIsIAogICAgICAgICJjaGVja2VkIiAsICJzZWxlY3RlZCIsICJtdWx0aXBsZSIsCiAgICAgICAgImFsdCIsICJtYXhsZW5ndGgiLCAiZm9ybSIsICJjb2xzIiwgInJvd3MiLCAibGlzdCIsIAogICAgICAgICJzcmMiLCAKICAgICk7CiAgICAKICAgIGlmIChfaXNfYXJyYXkoJGF0dHJpYnV0ZXNbImF0dHJpYnV0ZXMiXSkpCiAgICB7CiAgICAgICAgaWYgKGlzU2ltcGxlQXJyYXkoJGF0dHJpYnV0ZXNbImF0dHJpYnV0ZXMiXSkpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRhdHRyaWJ1dGVzWyJhdHRyaWJ1dGVzIl0gYXMgJGF0dHIpCiAgICAgICAgICAgICAgICAkYXR0cmlidXRlc1siYXR0ci4iLiRhdHRyWyJuYW1lIl1dID0gJGF0dHJbInZhbHVlIl07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJGF0dHJpYnV0ZXNbImF0dHJpYnV0ZXMiXSBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAkYXR0cmlidXRlc1siYXR0ci4iLiRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICB1bnNldCgkYXR0cmlidXRlc1siYXR0cmlidXRlcyJdKTsKICAgIAogICAgLy9kdW1wKCRhdHRyaWJ1dGVzKTsKICAgICRhdHRyUGFyYW1zID0gYXJyYXkoKTsKICAgIGZvcmVhY2goJGF0dHJpYnV0ZXMgYXMgJG5hbWUgPT4gJHZhbHVlKSAgICAKICAgIHsKICAgICAgICBpZiAoJHZhbHVlICE9PSAiIiAmJiAkdmFsdWUgIT09IE5VTEwgJiYgKGluX2FycmF5KCRuYW1lLCAkYXR0cmlidXRlTmFtZXMpIHx8IHN0cnBvcygkbmFtZSwgImF0dHIuIikgPT09IDAgfHwgJHJhdykpCiAgICAgICAgewogICAgICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCJhdHRyLiIsICIiLCAkbmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gdHJ1ZSAmJiAkbmFtZSAhPSAidmFsdWUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkYXR0clBhcmFtc1tdID0gJG5hbWUuIj1cIiIuJG5hbWUuIlwiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkdmFsdWUgPT09IHRydWUgfHwgJHZhbHVlID09PSBmYWxzZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkbmFtZSwgJGF0dHJpYnV0ZU5hbWVzKSB8fCAkbmFtZSA9PSAidmFsdWUiKSAvLyB0byBkaXNhYmxlIHJlYWRvbmx5PSJmYWxzZSIgd2hpY2ggbWFpbiB0cnVlCiAgICAgICAgICAgICAgICAgICAgJGF0dHJQYXJhbXNbXSA9ICRuYW1lLiI9XCIiLigkdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKS4iXCIiOyAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9TdHJpbmcoJHZhbHVlKSAhPT0gIiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR2YWx1ZSA9IHRvU3RyaW5nKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiWyIsICJbIyMiLCAkdmFsdWUpOyAvLyB0byBub3QgcGFyc2UgYnkgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRhdHRyUGFyYW1zW10gPSAkbmFtZS4iPVwiIi4kdmFsdWUuIlwiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcChpbXBsb2RlKCIgIiwgJGF0dHJQYXJhbXMpKTsKICAgIAogICAgcmV0dXJuKGltcGxvZGUoIiAiLCAkYXR0clBhcmFtcykpOwogICAgCn0KCmZ1bmN0aW9uIGV4dHJhY3RBdHRyaWJ1dGVQYXJhbXMoJHRhZykKewogICAgJGF0dHJpYnV0ZXMgPSBhcnJheSgpOwogICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFthLXpBLVowLTktXSspPVtcIiddKFteXCInXSopW1wiJ118aW1zIiwgJHRhZywgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRtYXRjaCkKICAgICAgICAgICAgJGF0dHJpYnV0ZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKICAgIH0KICAgIAogICAgcmV0dXJuKCRhdHRyaWJ1dGVzKTsKfQoKZnVuY3Rpb24gZ2V0VXJsUGFyYW1zKCRwYXJhbXM9YXJyYXkoKSkKewogICAgaWYgKCFpc19hcnJheSgkcGFyYW1zKSkKICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsKICAgICAgICAKICAgICR1cmxQYXJhbXMgPSBhcnJheSgpOwogICAgZm9yZWFjaCgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKQogICAgICAgICAgICBkdW1wKCJUT0RPISEhISEgZ2V0VXJsUGFyYW1zKCkgLSBhcnJheSIpOwoKICAgICAgICAkdXJsUGFyYW1zW10gPSAka2V5LiI9Ii4kdmFsdWU7CiAgICB9CiAgICAKICAgIHJldHVybihpbXBsb2RlKCImIiwgJHVybFBhcmFtcykpOwogICAgCn0KCmZ1bmN0aW9uIGdldFBhcmFtVmFsdWUoJHZhbHVlLCAkcmVjb3JkVmFsdWVzLCAkVGFibGU9TlVMTCAvKiBvciBEYXRhU2V0Ki8pCnsKICAgIC8vZHVtcCgkdmFsdWUpOwogICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpCiAgICB7CiAgICAgICAgZm9yZWFjaCgkdmFsdWUgYXMgJGtleSA9PiAkdmFsKQogICAgICAgIHsKICAgICAgICAgICAgJHZhbHVlWyRrZXldID0gZ2V0UGFyYW1WYWx1ZSgkdmFsLCAkcmVjb3JkVmFsdWVzLCAkVGFibGUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgIH0KICAgIAogICAgJF9yZWNvcmRWYWx1ZXMgPSAkcmVjb3JkVmFsdWVzOwogICAgCiAgICAvL3Zhcl9kdW1wKCRUYWJsZSk7CiAgICAvKgogICAgaWYgKCEkVGFibGUgJiYgJHJlY29yZFZhbHVlc1sicmVjb3JkVGFibGVOYW1lIl0pCiAgICB7CiAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoJHJlY29yZFZhbHVlc1sicmVjb3JkVGFibGVOYW1lIl0pOwogICAgfQogICAgKi8KICAgICAgICAKICAgIGlmICgkVGFibGUvKiAmJiAkVGFibGUtPmluaGVyaXRzKCJURGF0YVNldCIpKi8pCiAgICB7CiAgICAgICAgJERhdGFTZXQgPSAkVGFibGU7CiAgICAgICAgLy8kVGFibGUgPSBnZXRUYWJsZSgkRGF0YVNldC0+dGFibGVOYW1lKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAkRGF0YVNldCA9IGNyZWF0ZU9iamVjdCgiRGF0YVNldCIpOwogICAgICAgICREYXRhU2V0LT5yZWNvcmRzID0gYXJyYXkoJF9yZWNvcmRWYWx1ZXMpOwogICAgICAgIGlmICgkVGFibGUpCiAgICAgICAgewogICAgICAgICAgICAkRGF0YVNldC0+dGFibGVOYW1lID0gJFRhYmxlLT5uYW1lOwogICAgICAgICAgICAkRGF0YVNldC0+ZmllbGRzID0gJFRhYmxlLT5nZXREYXRhU2V0RmllbGRzKCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAoc3RycG9zKCR2YWx1ZSwgInt0ZW1wbGF0ZToiKSAhPT0gRkFMU0UpCiAgICB7CiAgICAgICAgLy8gVE9ETyAtIHVzZSB0ZW1wbGF0ZQogICAgICAgIC8vZHVtcChodG1sZW50aXRpZXMoJHZhbHVlKSk7CiAgICAgICAgJHRlbXBsYXRlTmFtZSA9IHRyaW0oc3Vic3RyKCR2YWx1ZSwgMTAsIHN0cmxlbigkdmFsdWUpLTExKSk7CiAgICAgICAgJFRlbXBsYXRlID0gZ2V0T2JqZWN0KCJUZW1wbGF0ZXMiKS0+Z2V0V2ViVGVtcGxhdGUoJHRlbXBsYXRlTmFtZSk7CiAgICAgICAgaWYgKCRUZW1wbGF0ZSkKICAgICAgICB7CiAgICAgICAgICAgICR2YWx1ZVQgPSBwYXJzZVRlbXBsYXRlKCRUZW1wbGF0ZS0+Z2V0SHRtbCgpLCAkX3JlY29yZFZhbHVlcywgJERhdGFTZXQsICRUZW1wbGF0ZSk7CiAgICAgICAgICAgICR2YWx1ZVQgPSBwcmVnX3JlcGxhY2UoInw8IS0tLio/LS0+fGltcyIsICIiLCAkdmFsdWVUKTsKICAgICAgICAgICAgcmV0dXJuKCR2YWx1ZVQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiZ2V0UGFyYW1WYWx1ZSgpIC0gdGVtcGxhdGUgJyIuJHRlbXBsYXRlTmFtZS4iJyBub3QgZm91bmQiLCBtdEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgICAgICB9CiAgICB9CiAgICAvL2R1bXAoJHZhbHVlKTsKICAgIAogICAgLy8gVVNFRCBmb3IgYWRtaW4gZmlsdGVyIC0gcGhwIHNjcmlwdCB3aWxsIGdlbmVyYXRlIGZpZWxkTmFtZQogICAgaWYgKHN0cnBvcygkdmFsdWUsICJbe3BocDoiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCR2YWx1ZSwgIl0iKSAhPT0gRkFMU0UpCiAgICB7CiAgICAgICAgJHZhbHVlID0gcGFyc2VQSFAoJHZhbHVlKTsKICAgIH0KICAgIAogICAgZ2xvYmFsICRyZWNvcmRWYWx1ZXM7CiAgICAkX19yZWNvcmRWYWx1ZXMgPSAkcmVjb3JkVmFsdWVzOwogICAgCiAgICAvLyBjYWxsZWQgdHdpY2UgLSBzZWUgYWZ0ZXIge3BocDogfSAuLiAKICAgIGlmIChzdHJwb3MoJHZhbHVlLCAiWyIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJHZhbHVlLCAiXSIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAkcmVjb3JkVmFsdWVzID0gJF9yZWNvcmRWYWx1ZXM7CiAgICAgICAgJHZhbHVlID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblBhcnNlVGVtcGxhdGVIdG1sIiwgYXJyYXkoCiAgICAgICAgICAgICJodG1sIiA9PiAkdmFsdWUsIAogICAgICAgICAgICAiVGVtcGxhdGUiID0+ICRUZW1wbGF0ZSwgCiAgICAgICAgICAgICJmaWVsZHMiID0+ICREYXRhU2V0LT5maWVsZHMsIAogICAgICAgICAgICAicmVjb3JkVmFsdWVzIiA9PiAkX3JlY29yZFZhbHVlcywKICAgICAgICAgICAgInJlY29yZHMiID0+ICREYXRhU2V0LT5yZWNvcmRzLAogICAgICAgICAgICAicmVjb3JkQ291bnQiID0+ICREYXRhU2V0LT5yZWNvcmRDb3VudCwKICAgICAgICAgICAgInJlY29yZEluZGV4IiA9PiAkRGF0YVNldC0+cmVjb3JkSW5kZXgsCiAgICAgICAgICAgICJhbGxSZWNvcmRzQ291bnQiID0+ICREYXRhU2V0LT5hbGxSZWNvcmRzQ291bnQsCiAgICAgICAgICAgICJEYXRhU2V0IiA9PiAkRGF0YVNldCwgCiAgICAgICAgICAgICJ2aWV3VHlwZSIgPT4gJHZpZXdUeXBlLAogICAgICAgICAgICApLCAiaHRtbCIpOwogICAgfQoKICAgIGlmIChzdHJwb3MoJHZhbHVlLCAie3BocDoiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCR2YWx1ZSwgIn0iKSAhPT0gRkFMU0UpCiAgICB7CiAgICAgICAgLy8gcGhwIHNjcmlwdCByZXR1cm5zIGZpZWxkIG5hbWUgZm9yIHRlbXBsYXRlCiAgICAgICAgJHJlY29yZFZhbHVlcyA9ICRfcmVjb3JkVmFsdWVzOwogICAgICAgIAogICAgICAgIC8vZHVtcChodG1sZW50aXRpZXMoJHZhbHVlKSk7CiAgICAgICAgJHZhbHVlID0gcGFyc2VQSFAoJHZhbHVlKTsKICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCR2YWx1ZSkpOwogICAgfQogICAgCiAgICAvLyBjYWxsZWQgYWdhaW4gLSBzZWUgYmVmb3JlIHtwaHA6IH0gLi4gCiAgICBpZiAoc3RycG9zKCR2YWx1ZSwgIlsiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCR2YWx1ZSwgIl0iKSAhPT0gRkFMU0UpCiAgICB7CiAgICAgICAgJHJlY29yZFZhbHVlcyA9ICRfcmVjb3JkVmFsdWVzOwogICAgICAgICR2YWx1ZSA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25QYXJzZVRlbXBsYXRlSHRtbCIsIGFycmF5KAogICAgICAgICAgICAiaHRtbCIgPT4gJHZhbHVlLCAKICAgICAgICAgICAgIlRlbXBsYXRlIiA9PiAkVGVtcGxhdGUsIAogICAgICAgICAgICAiZmllbGRzIiA9PiAkRGF0YVNldC0+ZmllbGRzLCAKICAgICAgICAgICAgInJlY29yZFZhbHVlcyIgPT4gJF9yZWNvcmRWYWx1ZXMsCiAgICAgICAgICAgICJyZWNvcmRzIiA9PiAkRGF0YVNldC0+cmVjb3JkcywKICAgICAgICAgICAgInJlY29yZENvdW50IiA9PiAkRGF0YVNldC0+cmVjb3JkQ291bnQsCiAgICAgICAgICAgICJyZWNvcmRJbmRleCIgPT4gJERhdGFTZXQtPnJlY29yZEluZGV4LAogICAgICAgICAgICAiYWxsUmVjb3Jkc0NvdW50IiA9PiAkRGF0YVNldC0+YWxsUmVjb3Jkc0NvdW50LAogICAgICAgICAgICAiRGF0YVNldCIgPT4gJERhdGFTZXQsIAogICAgICAgICAgICAidmlld1R5cGUiID0+ICR2aWV3VHlwZSwKICAgICAgICAgICAgKSwgImh0bWwiKTsKICAgIH0KCiAgICBpZiAoc3RycG9zKCR2YWx1ZSwgIjwiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCR2YWx1ZSwgIj4iKSAhPT0gRkFMU0UpCiAgICB7CiAgICAgICAgJHJlY29yZFZhbHVlcyA9ICRfcmVjb3JkVmFsdWVzOwogICAgICAgIAogICAgICAgICR2YWx1ZSA9IHBhcnNlSHRtbCgkdmFsdWUpOwogICAgfQoKICAgICRyZWNvcmRWYWx1ZXMgPSAkX19yZWNvcmRWYWx1ZXM7CiAgICAKICAgIC8vZHVtcChodG1sZW50aXRpZXMoJHZhbHVlKSk7CiAgICAvL2R1bXAoJHZhbHVlKTsKICAgICR2YWx1ZSA9IHRyaW0oJHZhbHVlKTsKICAgIAogICAgcmV0dXJuKCR2YWx1ZSk7Cn0KCiRfX2xhdGVKU0NhbGwgPSBmYWxzZTsKZnVuY3Rpb24gc2V0TGF0ZUpTQ2FsbCgkdmFsdWUpCnsKICAgIGdsb2JhbCAkX19sYXRlSlNDYWxsOwogICAgCiAgICAkX19sYXRlSlNDYWxsID0gJHZhbHVlOwp9CgoKZnVuY3Rpb24gZ2V0SmF2YVNjcmlwdEh0bWwoJGpzLCAkbGF0ZUpTQ2FsbD1mYWxzZSkKewogICAgZ2xvYmFsICRfX2xhdGVKU0NhbGw7CiAgICAKICAgIC8vIFsjIyB0byBub3QgcGFyc2UgdGVtcGxhdGUgZmllbGRzIGlmIG5hbWUvaWQgaXMgcmVjb3JkW25hbWVdIC0gdXNlZCBpbiBhdHRyaWJ1dGVzIGFuZCBKUyBjb25zdHJ1Y3RvcnMKICAgICRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJGpzKTsKICAgIGZvcmVhY2goJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpCiAgICB7CiAgICAgICAgaWYgKChzdHJwb3MoJGxpbmUsICI9IG5ldyBUIikgIT09IEZBTFNFIHx8IHN0cnBvcygkbGluZSwgIj1uZXcgVCIpICE9PSBGQUxTRSkgJiYgcHJlZ19tYXRjaF9hbGwoInxbJ1wiXShbXidcIl0rKVsnXCJdICpcXCkgKjt8aW1zIiwgJGpzLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgLy8kbGluZXNbJGtleV0gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1tjb3VudCgkbWF0Y2hlcyktMV1bMF0sIHN0cl9yZXBsYWNlKCJbIiwgIlsjIyIsICRtYXRjaGVzW2NvdW50KCRtYXRjaGVzKS0xXVswXSksICRsaW5lc1ska2V5XSk7CiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9IHN0cl9yZXBsYWNlKCJbIiwgIlsjIyIsICRsaW5lc1ska2V5XSk7CiAgICAgICAgfQogICAgfQogICAgJGpzID0gaW1wbG9kZSgiXG4iLCAkbGluZXMpOwogICAgCiAgICAvL2R1bXAoJGpzKTsKICAgICRodG1sIC49ICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+XG4iOwogICAgJGh0bWwgLj0gIi8vPCFbQ0RBVEFbXG4iOyAgLy8genJ1c2VubyBrdnVsaSBBVkFTVCAyMi4xMC4yMDE4IC0gaGxhc2kgSFRNTDpDaGFzZUJhbmstQSBbUGhpc2hdIGZhbGVzbmUKICAgIGlmICgkbGF0ZUpTQ2FsbCB8fCAkX19sYXRlSlNDYWxsKQogICAgICAgICRodG1sIC49ICJzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IFxuIjsKICAgICRodG1sIC49ICRqczsKICAgIGlmICgkbGF0ZUpTQ2FsbCB8fCAkX19sYXRlSlNDYWxsKQogICAgICAgICRodG1sIC49ICJ9LCAxMDApOyBcbiI7CiAgICAkaHRtbCAuPSAiXG4vL11dPlxuIjsKICAgICRodG1sIC49ICI8L3NjcmlwdD4iOwogICAgCiAgICByZXR1cm4oJGh0bWwpOwp9CgpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlQnlOYW1lKCRuYW1lLCAkcmVjb3JkVmFsdWVzLCAkRGF0YVNldCkKewogICAgJFRlbXBsYXRlID0gZ2V0T2JqZWN0KCJUZW1wbGF0ZXMiKS0+Z2V0V2ViVGVtcGxhdGUoJG5hbWUpOwogICAgLy9lY2hvICIhIjsgZXhpdDsKICAgIC8vdmFyX2R1bXAoJG5hbWUpOwogICAgLy92YXJfZHVtcCgkVGVtcGxhdGUpOyBleGl0OwogICAgaWYgKCRUZW1wbGF0ZSkKICAgICAgICByZXR1cm4ocGFyc2VUZW1wbGF0ZSgkVGVtcGxhdGUtPmdldEh0bWwoKSwgJHJlY29yZFZhbHVlcywgJERhdGFTZXQpKTsKICAgIGVsc2UKICAgICAgICBzaG93TWVzc2FnZSgicGFyc2VUZW1wbGF0ZUJ5TmFtZSgpIC0gdGVtcGxhdGUgJyIuJG5hbWUuIicgbm90IGZvdW5kIiwgbXRFcnJvcik7Cn0KCmZ1bmN0aW9uIHBhcnNlV2ViVGVtcGxhdGUoJGh0bWwsICRyZWNvcmRWYWx1ZXMsICREYXRhU2V0LCAkVGVtcGxhdGU9TlVMTCwgJHZpZXdUeXBlPSJ2dEFsbCIsICRPYmplY3Q9TlVMTCwgJHBhcmFtcz1hcnJheSgpKQp7CiAgICAvLyBpZiBjaGFuZ2VkIHNlZSBhbHNvIHRvIFRDb250ZW50OjpnZXRXZWJDb250ZW50KCkKICAgIAogICAgZ2xvYmFsICRzdHlsZSwgJFdFQkNPTlRFTlQ7CiAgICAkX3N0eWxlID0gJHN0eWxlOwogICAgJF9XRUJDT05URU5UID0gJFdFQkNPTlRFTlQ7CiAgICAkV0VCQ09OVEVOVCA9IHRydWU7CgogICAgLyoKICAgIGlmICghaXNzZXQoJHBhcmFtc1siaHRtbENhY2hlIl0pKQogICAgewogICAgICAgICRwYXJhbXNbImh0bWxDYWNoZSJdID0gZmFsc2U7CiAgICAgICAgJHBhcmFtc1siaHRtbENhY2hlSW5uZXIiXSA9IGZhbHNlOwogICAgICAgICRwYXJhbXNbImh0bWxDYWNoZU91dGVyIl0gPSBmYWxzZTsKICAgIH0KICAgICovCgogICAgJHN0eWxlID0gKCRwYXJhbXNbInN0eWxlIl0gPyAkcGFyYW1zWyJzdHlsZSJdIDogImRlZmF1bHQiKTsKICAgICRyZXQgPSBwYXJzZVRlbXBsYXRlKCRodG1sLCAkcmVjb3JkVmFsdWVzLCAkRGF0YVNldCwgJFRlbXBsYXRlLCAkdmlld1R5cGUsICRPYmplY3QsICRwYXJhbXMpOwogICAgCiAgICAkc3R5bGUgPSAkX3N0eWxlOwogICAgJFdFQkNPTlRFTlQgPSAkX1dFQkNPTlRFTlQ7CiAgICAKICAgIHJldHVybigkcmV0KTsKfQogICAgCmZ1bmN0aW9uIHBhcnNlVGVtcGxhdGUoJGh0bWwsICRyZWNvcmRWYWx1ZXMsICREYXRhU2V0LCAkVGVtcGxhdGU9TlVMTCwgJHZpZXdUeXBlPSJ2dEFsbCIsICRPYmplY3Q9TlVMTCwgJHBhcmFtcz1hcnJheSgpKQp7CiAgICBpZiAoIXRyaW0oJGh0bWwpKQogICAgewogICAgICAgIC8vZHVtcCgkVGVtcGxhdGUpOwogICAgICAgIC8vZHVtcCgkT2JqZWN0KTsKICAgICAgICAvL2lmIChpc0RldmVsb3BlcigpKQogICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KICAgIAogICAgLy9kdW1wKCIhISIuaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICBzdGFydFByb2ZpbGUoInBhcnNlVGVtcGxhdGUiKTsKCiAgICAkX19odG1sID0gJGh0bWw7CiAgICAvL3Zhcl9kdW1wKCRUZW1wbGF0ZSk7CiAgICAvL2R1bXAoIi0tLS0tIik7CiAgICAvL2R1bXAoJGh0bWwpOwogICAgLy9kdW1wKGh0bWxlbnRpdGllcygkaHRtbCkpOwoKICAgIGlmICgkcmVjb3JkVmFsdWVzIGluc3RhbmNlb2YgQXJyYXlBY2Nlc3MpCiAgICAgICAgJHJlY29yZFZhbHVlcyA9ICRyZWNvcmRWYWx1ZXMtPmdldEFycmF5Q29weSgpOwogICAgCiAgICBpZiAoISREYXRhU2V0ICYmIGlzX29iamVjdCgkcmVjb3JkVmFsdWVzKSAmJiAkcmVjb3JkVmFsdWVzLT5pbmhlcml0cygiRGF0YVNldCIpKQogICAgewogICAgICAgICREYXRhU2V0ID0gJHJlY29yZFZhbHVlczsKICAgICAgICAkcmVjb3JkVmFsdWVzID0gJERhdGFTZXQtPnJlY29yZHNbMF07CiAgICB9CiAgICAKICAgIGdsb2JhbCAkX19ldmFsQ29uZGl0aW9uR2xvYmFsczsKICAgICRfX19ldmFsQ29uZGl0aW9uR2xvYmFscyA9ICRfX2V2YWxDb25kaXRpb25HbG9iYWxzOwogICAgJF9fZXZhbENvbmRpdGlvbkdsb2JhbHMgPSBhcnJheSgKICAgICAgICAicmVjb3JkVmFsdWVzIiA9PiAkcmVjb3JkVmFsdWVzLAogICAgKTsKCiAgICAkaHRtbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25QYXJzZVRlbXBsYXRlSHRtbCIsIGFycmF5KAogICAgICAgICJodG1sIiA9PiAkaHRtbCwgCiAgICAgICAgIlRlbXBsYXRlIiA9PiAkVGVtcGxhdGUsIAogICAgICAgICJmaWVsZHMiID0+ICREYXRhU2V0LT5nZXRGaWVsZHMoKSwgCiAgICAgICAgInJlY29yZFZhbHVlcyIgPT4gJHJlY29yZFZhbHVlcywKICAgICAgICAicmVjb3JkcyIgPT4gJERhdGFTZXQtPnJlY29yZHMsCiAgICAgICAgInJlY29yZENvdW50IiA9PiAkRGF0YVNldC0+cmVjb3JkQ291bnQsCiAgICAgICAgInJlY29yZEluZGV4IiA9PiAkRGF0YVNldC0+cmVjb3JkSW5kZXgsCiAgICAgICAgImFsbFJlY29yZHNDb3VudCIgPT4gJERhdGFTZXQtPmFsbFJlY29yZHNDb3VudCwKICAgICAgICAiRGF0YVNldCIgPT4gJERhdGFTZXQsIAogICAgICAgICJ2aWV3VHlwZSIgPT4gJHZpZXdUeXBlLAogICAgICAgICJwYXJhbXMiID0+ICRwYXJhbXMsCiAgICAgICAgKSwgImh0bWwiKTsKICAgIC8vZHVtcCgkaHRtbCk7CiAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICAKICAgIC8vc3RvcFByb2ZpbGUoIngxIik7CiAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICAKICAgIC8vc3RhcnRQcm9maWxlKCJ4MiIpOwogICAgLy8gdjEKICAgICRfcmVjb3JkVmFsdWVzID0gJHJlY29yZFZhbHVlczsKICAgICRfRGF0YVNldCA9ICREYXRhU2V0OwogICAgJF9UZW1wbGF0ZSA9ICRUZW1wbGF0ZTsKICAgICRfT2JqZWN0ID0gJE9iamVjdDsKICAgICRfcGFyYW1zID0gJHBhcmFtczsKICAgIAogICAgZ2xvYmFsICRyZWNvcmRWYWx1ZXMsICRUYWJsZSwgJERhdGFTZXQsICRUZW1wbGF0ZSwgJE9iamVjdCwgJHBhcmFtczsKICAgICRvX3JlY29yZFZhbHVlcyA9ICRyZWNvcmRWYWx1ZXM7CiAgICAkb19UYWJsZSA9ICRUYWJsZTsKICAgICRvX0RhdGFTZXQgPSAkRGF0YVNldDsKICAgICRvX1RlbXBsYXRlID0gJFRlbXBsYXRlOwogICAgJG9fT2JqZWN0ID0gJE9iamVjdDsKICAgICRvX3BhcmFtcyA9ICRwYXJhbXM7CgogICAgJHJlY29yZFZhbHVlcyA9ICRfcmVjb3JkVmFsdWVzOwogICAgJERhdGFTZXQgPSAkX0RhdGFTZXQ7CiAgICAkVGVtcGxhdGUgPSAkX1RlbXBsYXRlOwogICAgJE9iamVjdCA9ICRfT2JqZWN0OwogICAgJHBhcmFtcyA9ICRfcGFyYW1zOwogICAgJFRhYmxlID0gZ2V0VGFibGUoJERhdGFTZXQtPnRhYmxlTmFtZSk7CiAgICAvL3Zhcl9kdW1wKCRUYWJsZSk7CgogICAgLy9zdG9wUHJvZmlsZSgieDIiKTsKICAgIC8vc3RhcnRQcm9maWxlKCJ4MyIpOwogICAgCiAgICBpZiAob2JqZWN0RGVmaW5lZCgiVmlzdWFsUEhQMUNvbnZlcnRlciIpKQogICAgICAgICRodG1sID0gZ2V0T2JqZWN0KCJWaXN1YWxQSFAxQ29udmVydGVyIiktPmdldEh0bWxBcmVhVmFsdWUoJGh0bWwpOwogICAgLy9zdG9wUHJvZmlsZSgieDMiKTsKICAgIC8vc3RhcnRQcm9maWxlKCJ4NCIpOwoKICAgIGlmIChzdHJwb3MoJGh0bWwsICI8Y29tcG9uZW50IikgIT09IEZBTFNFICYmIHByZWdfbWF0Y2hfYWxsKCJ8KDxjb21wb25lbnRbXj5dKj4pKC4qPykoPC9jb21wb25lbnQ+KXxpbXMiLCAkaHRtbCwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRtYXRjaCkKICAgICAgICB7CiAgICAgICAgICAgICRjUGFyYW1zID0gJG1hdGNoWzJdOwogICAgICAgICAgICBpZiAoJGNQYXJhbXMgPT0gIlwiXCIiKQogICAgICAgICAgICAgICAgJGNQYXJhbXMgPSAie30iOwogICAgICAgICAgICAkY1BhcmFtcyA9ICRjUGFyYW1zWzBdLiJcIl90ZW1wbGF0ZVJlY29yZElkXCI6XCIiLiRyZWNvcmRWYWx1ZXNbImlkIl0uIlwiIi4oc3RybGVuKCRjUGFyYW1zKSA+IDIgPyAiLCIgOiAiIikuc3Vic3RyKCRjUGFyYW1zLCAxLCBzdHJsZW4oJGNQYXJhbXMpKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkbWF0Y2hbMF0pKTsKICAgICAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkbWF0Y2hbMV0uJGNQYXJhbXMuJG1hdGNoWzNdKSk7CiAgICAgICAgICAgICRodG1sID0gc3Vic3RyX3JlcGxhY2UoJGh0bWwsICRtYXRjaFsxXS4kY1BhcmFtcy4kbWF0Y2hbM10sIHN0cnBvcygkaHRtbCwgJG1hdGNoWzBdKSwgc3RybGVuKCRtYXRjaFswXSkpOyAgICAgICAgICAgIAogICAgICAgIH0gICAgICAgIAogICAgfQogICAgCiAgICAvLyA/Pz8gayBjZW11IHRvIGJ5bG8/CiAgICAvLyRoYXNJbmNsdWRlID0gc3RycG9zKCRodG1sLCAiY2xhc3M9XCJJbmNsdWRlXCIiKTsKICAgIAogICAgLy8gcGFyc2VQaHAgYXogemEgdGltdG8sIHBva3VkIGplIFBIUCBzb3VjYXN0aSBrb21wb25lbnQsIHBhayBzZSBzdGVqbmUgdiBwYXJhbWV0cmVjaCBldmFsdXVqZQogICAgLy9kdW1wKCRodG1sKTsKICAgIC8vZHVtcCgkcmVjb3JkVmFsdWVzKTsKICAgIC8vZHVtcCgkaHRtbCk7CiAgICAvL2R1bXAoc3RycG9zKCRodG1sLCAiY29uZGl0aW9uPSIpKTsKICAgICRodG1sID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblBhcnNlSHRtbCIsIGFycmF5KAogICAgICAgICJodG1sIiA9PiAkaHRtbCwgCiAgICAgICAgKSwgImh0bWwiKTsKICAgIAogICAgLy9kdW1wKCRodG1sKTsKICAgIGlmIChzdHJwb3MoJGh0bWwsICI8Y29tcG9uZW50ICIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAvLyBkbyBpdCBhZ2FpbiAtIGxpa2UgaGF2aW5nIGVjaG8gJHJlY29yZFZhbHVlc1sidGV4dCJdIGluc2lkZSBQSFAgY29tcG9uZW50LCB3aGljaCBjb250YWlucyBvdGhlciBjb21wb25lbnRzCiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uUGFyc2VIdG1sIiwgYXJyYXkoCiAgICAgICAgICAgICJodG1sIiA9PiAkaHRtbCwgCiAgICAgICAgICAgICksICJodG1sIik7CiAgICB9CiAgICAvL2R1bXAoJHJlY29yZFZhbHVlcyk7CiAgICAvL2R1bXAoc3RycG9zKCRodG1sLCAiY29uZGl0aW9uPSIpKTsKICAgIC8vZHVtcCgkaHRtbCk7CgogICAgLy9kdW1wKGh0bWxlbnRpdGllcygkaHRtbCkpOwogICAgJGh0bWwgPSBwYXJzZVBocCgkaHRtbCk7CiAgICAKICAgIC8vc3RvcFByb2ZpbGUoIng0Iik7CiAgICAKICAgIC8vc3RhcnRQcm9maWxlKCJ4NSIpOwogICAgCiAgICAvL3N0b3BQcm9maWxlKCJ4NSIpOwogICAgLy9kdW1wKGh0bWxlbnRpdGllcygkaHRtbCkpOwogICAgCiAgICAvLyRodG1sID0gcGFyc2VDTVNFbGVtZW50cygkaHRtbCk7CiAgICAvLyRodG1sID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblBhcnNlSHRtbCIsIGFycmF5KCJodG1sIiA9PiAkaHRtbCksICJodG1sIik7CiAgICAKCiAgICAvLyRyZWNvcmRWYWx1ZXMgPSAkX3JlY29yZFZhbHVlczsKICAgICRyZWNvcmRWYWx1ZXMgPSAkb19yZWNvcmRWYWx1ZXM7CiAgICAkVGFibGUgPSAkb19UYWJsZTsKICAgICREYXRhU2V0ID0gJG9fRGF0YVNldDsKICAgICRUZW1wbGF0ZSA9ICRvX1RlbXBsYXRlOwogICAgJE9iamVjdCA9ICRvX09iamVjdDsKICAgICRwYXJhbXMgPSAkb19wYXJhbXM7CiAgICAKICAgICRfX2V2YWxDb25kaXRpb25HbG9iYWxzID0gJF9fX2V2YWxDb25kaXRpb25HbG9iYWxzOwoKCiAgICAvL2R1bXAoJF9faHRtbCk7CiAgICBzdG9wUHJvZmlsZSgicGFyc2VUZW1wbGF0ZSIsIGZpcnN0X3ZhbHVlKCRUZW1wbGF0ZS0+aWQsICRfX2h0bWwpKTsKICAgIC8vZHVtcCgkVGVtcGxhdGUtPmlkKTsKCiAgICBpZiAoJGhhc0luY2x1ZGUpCiAgICB7CiAgICAgICAgc3RhcnRQcm9maWxlKCJwYXJzZVRlbXBsYXRlIC0gaW5jbHVkZSIpOwogICAgICAgICRodG1sID0gcGFyc2VUZW1wbGF0ZSgkaHRtbCwgJF9yZWNvcmRWYWx1ZXMsICRfRGF0YVNldCwgJF9UZW1wbGF0ZSwgJHZpZXdUeXBlLCAkT2JqZWN0LCAkcGFyYW1zKTsKICAgICAgICBzdG9wUHJvZmlsZSgicGFyc2VUZW1wbGF0ZSAtIGluY2x1ZGUiLCAkVGVtcGxhdGUtPmlkKTsKICAgIH0KCgogICAgcmV0dXJuKCRodG1sKTsKfQoKCi8qCmZ1bmN0aW9uIHBhcnNlVGVtcGxhdGUoJGh0bWwsICRfcmVjb3JkVmFsdWVzLCAkX0RhdGFTZXQsICRfVGVtcGxhdGU9TlVMTCwgJF92aWV3VHlwZT0idnRBbGwiLCAkX09iamVjdD1OVUxMKQp7CiAgICBzdGFydFByb2ZpbGUoInBhcnNlVGVtcGxhdGUiKTsKICAgIC8vdmFyX2R1bXAoJFRlbXBsYXRlKTsKCiAgICAkaHRtbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25QYXJzZVRlbXBsYXRlSHRtbCIsIGFycmF5KAogICAgICAgICJodG1sIiA9PiAkaHRtbCwgCiAgICAgICAgIlRlbXBsYXRlIiA9PiAkX1RlbXBsYXRlLCAKICAgICAgICAiZmllbGRzIiA9PiAkX0RhdGFTZXQtPmZpZWxkcywgCiAgICAgICAgInJlY29yZFZhbHVlcyIgPT4gJF9yZWNvcmRWYWx1ZXMsCiAgICAgICAgInJlY29yZHMiID0+ICRfRGF0YVNldC0+cmVjb3JkcywKICAgICAgICAicmVjb3JkQ291bnQiID0+ICRfRGF0YVNldC0+cmVjb3JkQ291bnQsCiAgICAgICAgInJlY29yZEluZGV4IiA9PiAkX0RhdGFTZXQtPnJlY29yZEluZGV4LAogICAgICAgICJhbGxSZWNvcmRzQ291bnQiID0+ICRfRGF0YVNldC0+YWxsUmVjb3Jkc0NvdW50LAogICAgICAgICJEYXRhU2V0IiA9PiAkX0RhdGFTZXQsIAogICAgICAgICJ2aWV3VHlwZSIgPT4gJF92aWV3VHlwZSwKICAgICAgICApLCAiaHRtbCIpOwogICAgCgogICAgLy9zdG9wUHJvZmlsZSgieDEiKTsKICAgIC8vZHVtcChodG1sZW50aXRpZXMoJGh0bWwpKTsKICAgIAogICAgLy9zdGFydFByb2ZpbGUoIngyIik7CiAgICAvLyB2MQogICAgZ2xvYmFsICRyZWNvcmRWYWx1ZXMsICRUYWJsZSwgJERhdGFTZXQsICRUZW1wbGF0ZSwgJE9iamVjdDsKICAgICRvX3JlY29yZFZhbHVlcyA9ICRyZWNvcmRWYWx1ZXM7CiAgICAkb19UYWJsZSA9ICRUYWJsZTsKICAgICRvX0RhdGFTZXQgPSAkRGF0YVNldDsKICAgICRvX1RlbXBsYXRlID0gJFRlbXBsYXRlOwogICAgJG9fT2JqZWN0ID0gJE9iamVjdDsKCiAgICAkcmVjb3JkVmFsdWVzID0gJF9yZWNvcmRWYWx1ZXM7CiAgICAkRGF0YVNldCA9ICRfRGF0YVNldDsKICAgICRUZW1wbGF0ZSA9ICRfVGVtcGxhdGU7CiAgICAkT2JqZWN0ID0gJF9PYmplY3Q7CiAgICAkVGFibGUgPSBnZXRUYWJsZSgkX0RhdGFTZXQtPnRhYmxlTmFtZSk7CiAgICAvL3Zhcl9kdW1wKCRUYWJsZSk7CgogICAgLy9zdG9wUHJvZmlsZSgieDIiKTsKICAgIC8vc3RhcnRQcm9maWxlKCJ4MyIpOwogICAgCiAgICAkaHRtbCA9IGdldE9iamVjdCgiVmlzdWFsUEhQMUNvbnZlcnRlciIpLT5nZXRIdG1sQXJlYVZhbHVlKCRodG1sKTsKICAgIC8vc3RvcFByb2ZpbGUoIngzIik7CiAgICAvL3N0YXJ0UHJvZmlsZSgieDQiKTsKCiAgICAkaGFzSW5jbHVkZSA9IHN0cnBvcygkaHRtbCwgImNsYXNzPVwiSW5jbHVkZVwiIik7CiAgICAKICAgIC8vIHBhcnNlUGhwIGF6IHphIHRpbXRvLCBwb2t1ZCBqZSBQSFAgc291Y2FzdGkga29tcG9uZW50LCBwYWsgc2Ugc3Rlam5lIHYgcGFyYW1ldHJlY2ggZXZhbHV1amUKICAgICRodG1sID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblBhcnNlSHRtbCIsIGFycmF5KAogICAgICAgICJodG1sIiA9PiAkaHRtbCwgCiAgICAgICAgKSwgImh0bWwiKTsKCiAgICAkaHRtbCA9IHBhcnNlUGhwKCRodG1sKTsKICAgIAogICAgLy9zdG9wUHJvZmlsZSgieDQiKTsKICAgIAogICAgLy9zdGFydFByb2ZpbGUoIng1Iik7CiAgICAKICAgIC8vc3RvcFByb2ZpbGUoIng1Iik7CiAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICAKICAgIC8vJGh0bWwgPSBwYXJzZUNNU0VsZW1lbnRzKCRodG1sKTsKICAgIC8vJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uUGFyc2VIdG1sIiwgYXJyYXkoImh0bWwiID0+ICRodG1sKSwgImh0bWwiKTsKICAgIAoKICAgICRyZWNvcmRWYWx1ZXMgPSAkb19yZWNvcmRWYWx1ZXM7CiAgICAkVGFibGUgPSAkb19UYWJsZTsKICAgICREYXRhU2V0ID0gJG9fRGF0YVNldDsKICAgICRUZW1wbGF0ZSA9ICRvX1RlbXBsYXRlOwogICAgJE9iamVjdCA9ICRvX09iamVjdDsKICAgIAogICAgc3RvcFByb2ZpbGUoInBhcnNlVGVtcGxhdGUiKTsKCiAgICBpZiAoJGhhc0luY2x1ZGUpCiAgICB7CiAgICAgICAgJGh0bWwgPSBwYXJzZVRlbXBsYXRlKCRodG1sLCAkX3JlY29yZFZhbHVlcywgJF9EYXRhU2V0LCAkX1RlbXBsYXRlLCAkX3ZpZXdUeXBlLCAkX09iamVjdCk7CiAgICB9CgogICAgcmV0dXJuKCRodG1sKTsKfQoqLwoKZnVuY3Rpb24gbG9naW5SZW1vdGVVc2VyKCRsb2dpbikKewogICAgJFVzZXIgPSBsb2dpblVzZXIoJGxvZ2luLCBOVUxMLCAiIiwgIiIsIHRydWUpOwogICAgLy92YXJfZHVtcCgkX1NFU1NJT04pO2V4aXQ7CiAgICByZXR1cm4oJFVzZXIpOwp9CiAgICAKZnVuY3Rpb24gbG9naW5Vc2VyKCRsb2dpbiwgJHBhc3N3b3JkPU5VTEwsICR1c2VyR3JvdXA9IiIsICR0YWJsZU5hbWU9IiIsICRyZW1vdGU9ZmFsc2UpCnsKICAgIC8vZWNobyAiMSI7CiAgICAvL2V4aXQ7CiAgICAvL3JldHVybihmYWxzZSk7CiAgICBnbG9iYWwgJFVzZXIsICRhdXRoU3VjY2VzcywgJGF1dGhGYWlsZWQ7CiAgICAKICAgIGlmIChpc19hcnJheSgkcGFzc3dvcmQpKQogICAgICAgICRwYXNzd29yZCA9ICRwYXNzd29yZFswXTsKICAgIAogICAgJE9sZFVzZXIgPSBnZXRPYmplY3QoIlVzZXIiLCBmYWxzZSk7CiAgICAKICAgIC8vZHVtcCgkbG9naW4pOwogICAgCiAgICAkVXNlciA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25Mb2dpbiIsIGFycmF5KAogICAgICAgICJVc2VyIiA9PiAkVXNlciwgCiAgICAgICAgImxvZ2luIiA9PiAkbG9naW4sIAogICAgICAgICJwYXNzd29yZCIgPT4gJHBhc3N3b3JkLCAKICAgICAgICAidXNlckdyb3VwIiA9PiAkdXNlckdyb3VwLCAKICAgICAgICAidGFibGVOYW1lIiA9PiAkdGFibGVOYW1lCiAgICApLCAiVXNlciIpOwogICAgLy92YXJfZHVtcCgkVXNlcik7ZXhpdDsKICAgIGlmICgkVXNlcikKICAgIHsKICAgICAgICAkdG9rZW4gPSAkVXNlci0+dG9rZW47CiAgICAgICAgaWYgKCEkVXNlci0+dmlydHVhbCkKICAgICAgICAgICAgJFVzZXItPmxvZ2dlZEluID0gdHJ1ZTsKICAgICAgICAvL2R1bXAoJFVzZXIpOwogICAgICAgICRVc2VyLT50YWJsZU5hbWUgPSAkVXNlci0+cmVjb3JkVmFsdWVzWyJyZWNvcmRUYWJsZU5hbWUiXTsKICAgICAgICAkYXV0aFN1Y2Nlc3MgPSB0cnVlOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICRhdXRoU3VjY2VzcyA9IGZhbHNlOwogICAgICAgIGlmICgkbG9naW4gJiYgJHBhc3N3b3JkKQogICAgICAgICAgICAkYXV0aEZhaWxlZCA9IHRydWU7CiAgICB9CiAgICAKICAgIF9zZXNzaW9uX3N0YXJ0KCk7CiAgICAkZG9FdmVudCA9IGZhbHNlOwogICAgCiAgICAvLyBub3ZlIHNlIHZvbGEgcG91emUgcHJpIHByaWhsYXNlbmkgYSBuZSBwcmkgYWt0dWFsaXphY2kgcHJpaGxhc2VuaQogICAgLy9pZiAoJGF1dGhTdWNjZXNzICYmICgkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFVzZXJHcm91cCJdICE9ICR1c2VyR3JvdXAgJiYgJF9TRVNTSU9OWyhTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhMb2dpbiJdICE9ICRsb2dpbiAmJiAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFBhc3N3b3JkIl0gIT0gJHBhc3N3b3JkIHx8ICRfR0VUWyJhdXRoTG9naW4iXSAmJiAkX0dFVFsiYXV0aFBhc3N3b3JkIl0gfHwgJF9QT1NUWyJhdXRoTG9naW4iXSAmJiAkX1BPU1RbImF1dGhQYXNzd29yZCJdKSkKICAgIC8vaWYgKCRhdXRoU3VjY2VzcyAmJiAoKCRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoVXNlckdyb3VwIl0gIT0gJHVzZXJHcm91cCB8fCAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aExvZ2luIl0gIT0gJGxvZ2luIHx8ICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoUGFzc3dvcmQiXSAhPSAkcGFzc3dvcmQpIHx8ICRfR0VUWyJhdXRoTG9naW4iXSAmJiAkX0dFVFsiYXV0aFBhc3N3b3JkIl0gfHwgJF9QT1NUWyJhdXRoTG9naW4iXSAmJiAkX1BPU1RbImF1dGhQYXNzd29yZCJdKSkKICAgIC8vIG5ldyBjaGVjayBvbmx5IGxvZ2luIG5vdCBwYXNzd29yZCAobG9naW4gZW11bGF0aW9uIG9yIDIgYWNjb3VudHMgbWF5IGhhdmUgc2FtZSBwYXNzd29yZCkKICAgIGlmICgkYXV0aFN1Y2Nlc3MgJiYgKCgkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFVzZXJHcm91cCJdICE9ICR1c2VyR3JvdXAgfHwgJF9TRVNTSU9OWyhTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhMb2dpbiJdICE9ICRsb2dpbiB8fCAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFBhc3N3b3JkIl0gIT0gJHBhc3N3b3JkIHx8ICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoVG9rZW4iXSAhPSAkdG9rZW4pIHx8ICRfR0VUWyJhdXRoTG9naW4iXSB8fCAkX1BPU1RbImF1dGhMb2dpbiJdKSkKICAgICAgICAkZG9FdmVudCA9IHRydWU7CgogICAgLy92YXJfZHVtcCgkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFVzZXJHcm91cCJdKTsKICAgIC8vdmFyX2R1bXAoJGF1dGhVc2VyR3JvdXApOwogICAgaWYoISRyZW1vdGUpCiAgICB7CiAgICAgICAgJF9TRVNTSU9OWyhTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhVc2VyR3JvdXAiXSA9ICR1c2VyR3JvdXA7CiAgICAgICAgJF9TRVNTSU9OWyhTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhMb2dpbiJdID0gJGxvZ2luOwogICAgICAgICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoUGFzc3dvcmQiXSA9ICRwYXNzd29yZDsKICAgICAgICAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFRva2VuIl0gPSAkdG9rZW47CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJF9TRVNTSU9OWyhTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhVc2VyR3JvdXAiXSA9ICIiOwogICAgICAgICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoTG9naW4iXSA9ICIiOwogICAgICAgICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoUGFzc3dvcmQiXSA9ICIiOwogICAgICAgICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoVG9rZW4iXSA9ICIiOwogICAgICAgIC8vdmFyX2R1bXAoJF9DT09LSUUpOyB2YXJfZHVtcCgkX1NFU1NJT04pOyBleGl0OwogICAgfQogICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKCiAgICAvL2R1bXAoJF9TRVNTSU9OKTsKICAgIC8vZHVtcCgkYXV0aFN1Y2Nlc3MpOwogICAgLy9kdW1wKCRkb0V2ZW50KTsKICAgIC8vaWYgKCRfUE9TVFsiYXV0aExvZ2luIl0pCiAgICAvLyAgICBkdW1wKCI/Pz8/Iik7CiAgICAKICAgIGlmICgkZG9FdmVudCkKICAgIHsKICAgICAgICBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoImFmdGVyTG9naW4iLCBhcnJheSgKICAgICAgICAgICAgIlVzZXIiID0+ICRVc2VyLAogICAgICAgICAgICAiT2xkVXNlciIgPT4gJE9sZFVzZXIsCiAgICAgICAgKSk7CiAgICB9CgogICAgaWYgKCRVc2VyICYmICRVc2VyLT5sb2dnZWRJbikKICAgIHsKICAgICAgICBfc2V0Q29va2llKCJhdXRoU3VjY2VzcyIsICJ0cnVlIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgX2RlbGV0ZUNvb2tpZSgiYXV0aFN1Y2Nlc3MiKTsKICAgIH0KICAgIAogICAgcmV0dXJuKCRVc2VyKTsKCn0KICAgIApmdW5jdGlvbiBsb2dvdXRVc2VyKCRsb2dpbj1OVUxMKQp7CiAgICBnbG9iYWwgJGF1dGhTdWNjZXNzLCAkYXV0aExvZ2luLCAkVXNlcjsKCiAgICAvL3Zhcl9kdW1wKCRsb2dpbik7ICAgICBleGl0OwogICAgZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkxvZ291dCIsIGFycmF5KAogICAgICAgICJVc2VyIiA9PiAkVXNlciwgCiAgICAgICAgImxvZ2luIiA9PiBmaXJzdF92YWx1ZSgkbG9naW4sICRhdXRoTG9naW4pLCAKICAgICkpOwoKICAgIF9zZXNzaW9uX3N0YXJ0KCk7CiAgICAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFVzZXJHcm91cCJdID0gIiI7CiAgICAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFJlbWVtYmVyIl0gPSAiIjsKICAgICRfU0VTU0lPTlsoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoTG9naW4iXSA9ICIiOwogICAgJF9TRVNTSU9OWyhTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhQYXNzd29yZCJdID0gIiI7CiAgICAkX1NFU1NJT05bKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFRva2VuIl0gPSAiIjsKICAgIF9zZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgogICAgLyoKICAgIF9zZXRjb29raWUoKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFVzZXJHcm91cCIsICRhdXRoVXNlckdyb3VwLCA2MCo2MCoyNCozNjUpOwogICAgX3NldGNvb2tpZSgoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoUmVtZW1iZXIiLCAkYXV0aFJlbWVtYmVyLCA2MCo2MCoyNCozNjUpOwogICAgX3NldGNvb2tpZSgoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoTG9naW4iLCAkYXV0aExvZ2luLCA2MCo2MCoyNCozNjUsICIvIik7CiAgICBfc2V0Y29va2llKChTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhQYXNzd29yZCIsICRhdXRoUGFzc3dvcmQsIDYwKjYwKjI0KjM2NSk7CiAgICAqLwogICAgX3NldGNvb2tpZSgoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoVXNlckdyb3VwIiwgIiIpOwogICAgX3NldGNvb2tpZSgoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoUmVtZW1iZXIiLCAiIik7CiAgICBfc2V0Y29va2llKChTRVNTSU9OUFJFRklYID8gU0VTU0lPTlBSRUZJWC4iXyIgOiAiIikuImF1dGhMb2dpbiIsICIiKTsKICAgIF9zZXRjb29raWUoKFNFU1NJT05QUkVGSVggPyBTRVNTSU9OUFJFRklYLiJfIiA6ICIiKS4iYXV0aFBhc3N3b3JkIiwgIiIpOwogICAgX3NldGNvb2tpZSgoU0VTU0lPTlBSRUZJWCA/IFNFU1NJT05QUkVGSVguIl8iIDogIiIpLiJhdXRoVG9rZW4iLCAiIik7CgogICAgJGF1dGhTdWNjZXNzID0gZmFsc2U7CiAgICAkYXV0aExvZ2luID0gIiI7CiAgICAkVXNlciA9IE5VTEw7Cgp9CgpmdW5jdGlvbiBsb2dpbkFkbWluVXNlcigkbG9naW4sICRwYXNzd29yZD1OVUxMLCAkdXNlckdyb3VwPSIiLCAkdGFibGVOYW1lPSIiKQp7CiAgICBnbG9iYWwgJEFkbWluVXNlciwgJGF1dGhBZG1pblN1Y2Nlc3M7CiAgICAKICAgIGlmIChpc19hcnJheSgkcGFzc3dvcmQpKQogICAgICAgICRwYXNzd29yZCA9ICRwYXNzd29yZFswXTsKICAgIAogICAgJEFkbWluVXNlciA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25BZG1pbkxvZ2luIiwgYXJyYXkoIkFkbWluVXNlciIgPT4gJEFkbWluVXNlciwgImxvZ2luIiA9PiAkbG9naW4sICJwYXNzd29yZCIgPT4gJHBhc3N3b3JkKSwgIkFkbWluVXNlciIpOwogICAgLy92YXJfZHVtcCgkQWRtaW5Vc2VyKTsKICAgIGlmICgkQWRtaW5Vc2VyKQogICAgewogICAgICAgICRBZG1pblVzZXItPmxvZ2dlZEluID0gdHJ1ZTsKICAgICAgICAkYXV0aEFkbWluU3VjY2VzcyA9IHRydWU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJEFkbWluVXNlciA9IGNyZWF0ZU9iamVjdCgiQWRtaW5Vc2VyIik7CiAgICAgICAgJGF1dGhBZG1pblN1Y2Nlc3MgPSBmYWxzZTsKICAgIH0KICAgIAogICAgLy92YXJfZHVtcCgkVXNlcik7CiAgICAvL2V4aXQ7CiAgICByZXR1cm4oJGF1dGhBZG1pblN1Y2Nlc3MpOwp9CgpmdW5jdGlvbiBsb2dvdXRBZG1pblVzZXIoJGxvZ2luPU5VTEwpCnsKICAgIC8vcmV0dXJuOwogICAgZ2xvYmFsICRhdXRoQWRtaW5TdWNjZXNzLCAkYXV0aEFkbWluTG9naW4sICRBZG1pblVzZXI7CiAgICAvL2V4aXQ7CiAgICAvL3Zhcl9kdW1wKCRsb2dpbik7IHZhcl9kdW1wKCRhdXRoQWRtaW5Mb2dpbik7IHZhcl9kdW1wKCRBZG1pblVzZXIpOyBleGl0OwogICAgZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkFkbWluTG9nb3V0IiwgYXJyYXkoCiAgICAgICAgIkFkbWluVXNlciIgPT4gJEFkbWluVXNlciwgCiAgICAgICAgImxvZ2luIiA9PiBmaXJzdF92YWx1ZSgkbG9naW4sICRhdXRoQWRtaW5Mb2dpbiksIAogICAgKSk7CgogICAgJGF1dGhBZG1pblN1Y2Nlc3MgPSBmYWxzZTsKICAgICRhdXRoQWRtaW5Mb2dpbiA9ICIiOwogICAgJEFkbWluVXNlciA9IE5VTEw7Cn0KCiAgICBmdW5jdGlvbiBpc1NlYXJjaEVuZ2luZSgpCiAgICB7CiAgICAgICAgZ2xvYmFsICRzZWFyY2hFbmdpbmVBZ2VudFBhcnRzOwogICAgICAgIAogICAgICAgICRpc1NlYXJjaEVuZ2luZSA9IGZhbHNlOwogICAgICAgIGZvcmVhY2goJHNlYXJjaEVuZ2luZUFnZW50UGFydHMgYXMgJHNlYXJjaEVuZ2luZUFnZW50UGFydCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdHJpcG9zKCRfU0VSVkVSWyJIVFRQX1VTRVJfQUdFTlQiXSwgJHNlYXJjaEVuZ2luZUFnZW50UGFydCkgIT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkaXNTZWFyY2hFbmdpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICAvKgogICAgICAgIGlmICgkX1NFUlZFUlsiUkVNT1RFX0FERFIiXSA9PSAiNzguMTAyLjM3Ljg1IikKICAgICAgICAgICAgJGlzU2VhcmNoRW5naW5lID0gdHJ1ZTsKICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJGlzU2VhcmNoRW5naW5lKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gaXNWYWxpZGF0b3IoKQogICAgewogICAgICAgIC8qCiAgICAgICAgaWYgKHN0cmlwb3MoJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdLCAiVmlzdWFsUEhQIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyAid2FybmluZyBvbiBsaW5lIjsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICByZXR1cm4oc3RyaXBvcygkX1NFUlZFUlsiSFRUUF9VU0VSX0FHRU5UIl0sICJXM0NfVmFsaWRhdG9yIikgIT09IEZBTFNFIHx8IHN0cmlwb3MoJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdLCAiVzNDIikgIT09IEZBTFNFICB8fCBzdHJpcG9zKCRfU0VSVkVSWyJIVFRQX1VTRVJfQUdFTlQiXSwgIlZhbGlkYXRvciIpICE9PSBGQUxTRSB8fCBzdHJpcG9zKCRfU0VSVkVSWyJIVFRQX1VTRVJfQUdFTlQiXSwgIlZpc3VhbFBIUCIpICE9PSBGQUxTRSk7CiAgICB9CiAgICAKZnVuY3Rpb24gYWRtaW5Ccm93c2VyU3VwcG9ydGVkKCkKewogICAgcmV0dXJuKCJhZG1pbkJyb3dzZXJTdXBwb3J0ZWQgREVQUkVDQVRFRCIpOwp9CgpmdW5jdGlvbiBnZXRQcm9kdWN0VmVyc2lvbigpCnsKICAgIHJldHVybigiZ2V0UHJvZHVjdFZlcnNpb24gREVQUkVDQVRFRCIpOwp9CgpmdW5jdGlvbiBpc0hpZGRlbkZpbGUoJGZpbGUpCnsKICAgIHJldHVybihnZXRPYmplY3QoIkZpbGVQZXJtaXNzaW9ucyIpLT5pc0hpZGRlbigkZmlsZSkpOwp9CgpmdW5jdGlvbiBnZXRGaWVsZFRpdGxlKCRmaWVsZE5hbWUsICR0YWJsZU5hbWU9IiIsICRsYW5ndWFnZT0iIikKewogICAgaWYgKGlzX29iamVjdCgkZmllbGROYW1lKSkKICAgIHsKICAgICAgICAkRmllbGQgPSAkZmllbGROYW1lOwogICAgfSAgICAgICAgCiAgICBlbHNlCiAgICB7CiAgICAgICAgJEZpZWxkID0gZ2V0VGFibGUoJHRhYmxlTmFtZSktPmdldEZpZWxkKCRmaWVsZE5hbWUpOwogICAgfSAgICAgICAgCiAgICAKICAgIGdsb2JhbCAkX190cmFuc2xhdGluZywgJF9fdHJhbnNsYXRpbmdGaWVsZFRpdGxlOwogICAgaWYgKCEkX190cmFuc2xhdGluZykKICAgIHsKICAgICAgICAvLyB1c2VkIGluIHRyYW5zbGF0aW9uYXV0b2RldGVjdCBtb2R1bGUKICAgICAgICAkX190cmFuc2xhdGluZ0ZpZWxkVGl0bGUgPSB0cnVlOwogICAgICAgIAogICAgICAgICR0aXRsZSA9IHRyYW5zbGF0ZSgkRmllbGQtPnRpdGxlKTsKICAgICAgICBpZiAoISR0aXRsZSkgICAgICAgICAgICAKICAgICAgICAgICAgJHRpdGxlID0gdHJhbnNsYXRlKCJmaWVsZCgiLiRGaWVsZC0+dGFibGVOYW1lLiIpLnRpdGxlOiIuJEZpZWxkLT5uYW1lLCAkbGFuZ3VhZ2UpOwogICAgICAgIGlmICghJHRpdGxlIHx8ICR0aXRsZSA9PSAiZmllbGQoIi4kRmllbGQtPnRhYmxlTmFtZS4iKS50aXRsZToiLiRGaWVsZC0+bmFtZSkgICAgICAgICAgICAKICAgICAgICAgICAgJHRpdGxlID0gdHJhbnNsYXRlKCJmaWVsZC50aXRsZToiLiRGaWVsZC0+bmFtZSwgJGxhbmd1YWdlKTsKICAgICAgICBpZiAoISR0aXRsZSB8fCAkdGl0bGUgPT0gImZpZWxkLnRpdGxlOiIuJEZpZWxkLT5uYW1lKSAgICAgICAgICAgIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkRmllbGQtPm5hbWUsICJ0YWJTaGVldCIpID09PSBGQUxTRSAmJiBzdHJwb3MoJEZpZWxkLT5uYW1lLCAicGFnZUNvbnRyb2wiKSA9PT0gRkFMU0UgJiYgc3RycG9zKCRGaWVsZC0+bmFtZSwgImRvY2tQYW5lbCIpID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICRuYW1lID0gX3N0cnRvdXBwZXIoX3N1YnN0cigkRmllbGQtPm5hbWUsIDAsIDEpKS5fc3Vic3RyKCRGaWVsZC0+bmFtZSwgMSwgMTAwMCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRuYW1lID0gJEZpZWxkLT5uYW1lOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICR0aXRsZSA9IHRyYW5zbGF0ZSgkbmFtZSwgJGxhbmd1YWdlKTsKICAgICAgICB9CiAgICAgICAgJF9fdHJhbnNsYXRpbmdGaWVsZFRpdGxlID0gZmFsc2U7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJHRpdGxlID0gZmlyc3RfdmFsdWUoJEZpZWxkLT50aXRsZSwgJEZpZWxkLT5uYW1lKTsKICAgIH0KICAgIAogICAgaWYgKGdldE9iamVjdCgiRXZlbnRzIiktPmhhc0V2ZW50cyhhcnJheSgibmFtZSI9PiJvbkdldEZpZWxkVGl0bGUiLCAicGFyZW50Ij0+JEZpZWxkLT5pZCkpKQogICAgewogICAgICAgICR0aXRsZSA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cyhhcnJheSgibmFtZSI9PiJvbkdldEZpZWxkVGl0bGUiLCAicGFyZW50Ij0+JEZpZWxkLT5pZCksIGFycmF5KAogICAgICAgICAgICAiVGFibGUiID0+IGdldFRhYmxlKCRGaWVsZC0+dGFibGVOYW1lKSwKICAgICAgICAgICAgInRhYmxlTmFtZSIgPT4gJEZpZWxkLT50YWJsZU5hbWUsCiAgICAgICAgICAgICJGaWVsZCIgPT4gJEZpZWxkLAogICAgICAgICAgICAiZmllbGROYW1lIiA9PiAkRmllbGQtPm5hbWUsCiAgICAgICAgICAgICJ0aXRsZSIgPT4gJHRpdGxlLAogICAgICAgICksICJ0aXRsZSIpOyAgICAgICAgCiAgICB9CiAgICAKICAgIHJldHVybigkdGl0bGUpOwp9CgpmdW5jdGlvbiBpc0Rpc2FibGVkTW9kdWxlKCRtb2R1bGVJZCkKewogICAgZ2xvYmFsICRfQ09ORklHOwogICAgJF9DT05GSUdbImRpc2FibGVkTW9kdWxlcyJdID0gZXhwbG9kZUxpc3QoJF9DT05GSUdbImRpc2FibGVkTW9kdWxlcyJdKTsKICAgIGlmICgkbW9kdWxlSWQgJiYgX2luX2FycmF5KCRtb2R1bGVJZCwgJF9DT05GSUdbImRpc2FibGVkTW9kdWxlcyJdKSkKICAgIHsKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKfQoKZnVuY3Rpb24gZ2V0RmllbGREZXNjcmlwdGlvbigkRmllbGQsICRsYW5ndWFnZT0iIikKewogICAgZ2xvYmFsICRfX3RyYW5zbGF0aW5nOwogICAgaWYgKCEkX190cmFuc2xhdGluZykKICAgIHsKICAgICAgICAvL2R1bXAoJEZpZWxkLT5uYW1lKTsKICAgICAgICAkZGVzY3JpcHRpb24gPSB0cmFuc2xhdGUoJEZpZWxkLT5kZXNjcmlwdGlvbik7CiAgICAgICAgLy9kdW1wKCRkZXNjcmlwdGlvbik7CiAgICAgICAgaWYgKCEkZGVzY3JpcHRpb24pICAgICAgICAgICAgCiAgICAgICAgICAgICRkZXNjcmlwdGlvbiA9IHRyYW5zbGF0ZSgiZmllbGQoIi4kRmllbGQtPnRhYmxlTmFtZS4iKS5kZXNjcmlwdGlvbjoiLiRGaWVsZC0+bmFtZSwgJGxhbmd1YWdlKTsKICAgICAgICAvL2R1bXAoJGRlc2NyaXB0aW9uKTsKICAgICAgICBpZiAoISRkZXNjcmlwdGlvbiB8fCAkZGVzY3JpcHRpb24gPT0gImZpZWxkKCIuJEZpZWxkLT50YWJsZU5hbWUuIikuZGVzY3JpcHRpb246Ii4kRmllbGQtPm5hbWUpICAgICAgICAgICAgCiAgICAgICAgICAgICRkZXNjcmlwdGlvbiA9IHRyYW5zbGF0ZSgiZmllbGQuZGVzY3JpcHRpb246Ii4kRmllbGQtPm5hbWUsICRsYW5ndWFnZSk7CiAgICAgICAgLy9kdW1wKCRkZXNjcmlwdGlvbik7CiAgICAgICAgaWYgKCEkZGVzY3JpcHRpb24gfHwgJGRlc2NyaXB0aW9uID09ICJmaWVsZC5kZXNjcmlwdGlvbjoiLiRGaWVsZC0+bmFtZSkgICAgICAgICAgICAKICAgICAgICAgICAgJGRlc2NyaXB0aW9uID0gIiI7CiAgICAgICAgLy9kdW1wKCRkZXNjcmlwdGlvbik7CiAgICB9CiAgICBlbHNlCiAgICAgICAgJGRlc2NyaXB0aW9uID0gJEZpZWxkLT5kZXNjcmlwdGlvbjsKICAgIAogICAgcmV0dXJuKCRkZXNjcmlwdGlvbik7Cn0KCmZ1bmN0aW9uIGdldFRhYmxlVGl0bGUoJFRhYmxlLCAkbGFuZ3VhZ2U9IiIpCnsKICAgICR0aXRsZSA9IGdldE9iamVjdCgiVGFibGVzIiktPmdldFRhYmxlVGl0bGUoJFRhYmxlLCAkbGFuZ3VhZ2UpOwogICAgCiAgICBpZiAoZ2V0T2JqZWN0KCJFdmVudHMiKS0+aGFzRXZlbnRzKGFycmF5KCJuYW1lIj0+Im9uR2V0VGFibGVUaXRsZSIsICJwYXJlbnQiPT4kVGFibGUtPmlkKSkpCiAgICB7CiAgICAgICAgJHRpdGxlID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKGFycmF5KCJuYW1lIj0+Im9uR2V0VGFibGVUaXRsZSIsICJwYXJlbnQiPT4kVGFibGUtPmlkKSwgYXJyYXkoCiAgICAgICAgICAgICJUYWJsZSIgPT4gJFRhYmxlLAogICAgICAgICAgICAidGFibGVOYW1lIiA9PiAkVGFibGUtPm5hbWUsCiAgICAgICAgICAgICJ0aXRsZSIgPT4gJHRpdGxlLAogICAgICAgICksICJ0aXRsZSIpOyAgICAgICAgCiAgICB9CiAgICAKICAgIHJldHVybigkdGl0bGUpOwp9CgpmdW5jdGlvbiBnZXRUYWJsZURlc2NyaXB0aW9uKCRUYWJsZSwgJGxhbmd1YWdlPSIiKQp7CiAgICAkZGVzY3JpcHRpb24gPSBnZXRPYmplY3QoIlRhYmxlcyIpLT5nZXRUYWJsZURlc2NyaXB0aW9uKCRUYWJsZSwgJGxhbmd1YWdlKTsKCiAgICByZXR1cm4oJGRlc2NyaXB0aW9uKTsKfQoKZnVuY3Rpb24gbWVyZ2VQcm9wZXJ0aWVzKCkKewogICAgJGFyZ3MgPSBhcnJheSgpOwogICAgZm9yICgkaSA9IDAgOyAkaSA8IGZ1bmNfbnVtX2FyZ3MoKSA7ICRpKyspCiAgICB7CiAgICAgICAgJF9hcmdzID0gZnVuY19nZXRfYXJnKCRpKTsKICAgICAgICBmb3JlYWNoKCRfYXJncyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICAgICAgJF9hcmdzWyRrZXldID0gZXh0cmFjdFBhcmFtcygkdmFsdWUpOwogICAgICAgICAgICAKICAgICAgICAkaW5zZXJ0UG9zID0gLTE7CiAgICAgICAgZm9yICgkYSA9IDAgOyAkYSA8IGNvdW50KCRfYXJncykgOyAkYSsrKQogICAgICAgIHsKICAgICAgICAgICAgJF9hcmcgPSAkX2FyZ3NbJGFdOwogICAgICAgICAgICAkaW5zZXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkX2FyZ1sidHlwZSJdID09ICJncm91cCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpbnNlcnRQb3MgPSAtMTsKICAgICAgICAgICAgICAgIGZvciAoJHggPSAwIDsgJHggPCBjb3VudCgkYXJncykgOyAkeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRhcmcgPSAkYXJnc1skeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCRhcmdbInR5cGUiXSA9PSAiZ3JvdXAiICYmICRhcmdbImNhcHRpb24iXSA9PSAkX2FyZ1siY2FwdGlvbiJdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfYXJnWyJwb3NpdGlvbiJdID09ICJmaXJzdCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnNlcnRQb3MgPSAkeCsxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc2VydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc2VydFBvcyA9IGNvdW50KCRhcmdzKS0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkeHggPSAkeCsxIDsgJHh4IDwgY291bnQoJGFyZ3MpIDsgJHh4KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyZyA9ICRhcmdzWyR4eF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcmdbInR5cGUiXSA9PSAiZ3JvdXAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc2VydFBvcyA9ICR4eDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc2VydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRpbnNlcnRQb3MgPT0gLTEgJiYgJF9hcmdbImFmdGVyIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGluc2VydFBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGZvciAoJHggPSAwIDsgJHggPCBjb3VudCgkYXJncykgOyAkeCsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZyA9ICRhcmdzWyR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcmdbInR5cGUiXSA9PSAiZ3JvdXAiICYmICRhcmdbImNhcHRpb24iXSA9PSAkX2FyZ1siYWZ0ZXIiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkeHggPSAkeCsxIDsgJHh4IDwgY291bnQoJGFyZ3MpIDsgJHh4KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyZyA9ICRhcmdzWyR4eF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcmdbInR5cGUiXSA9PSAiZ3JvdXAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc2VydFBvcyA9ICR4eDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIiEhIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRfYXJnWyJ0eXBlIl0gPT0gImlnbm9yZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKCR4ID0gMCA7ICR4IDwgY291bnQoJGFyZ3MpIDsgJHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkYXJnID0gJGFyZ3NbJHhdOwogICAgICAgICAgICAgICAgICAgIGlmICgkYXJnWyJuYW1lIl0gPT0gJF9hcmdbIm5hbWUiXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3NwbGljZSgkYXJncywgJHgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAkaW5zZXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGluc2VydFBvcyk7CiAgICAgICAgICAgIGlmICghJGluc2VydGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJGluc2VydFBvcyA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGluc2VydFBvcyk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkX2FyZyk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkYXJncyk7CiAgICAgICAgICAgICAgICAgICAgYXJyYXlfc3BsaWNlKCRhcmdzLCAkaW5zZXJ0UG9zLCAwLCBhcnJheSgkX2FyZykpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAkaW5zZXJ0UG9zKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJGFyZ3NbXSA9ICRfYXJnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZWNobyAiPyI7CiAgICAgICAgICAgICRpbnNlcnRlZCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gc2V0IGxhc3QgdG8gYm90dG9tCiAgICAkYXJnczIgPSBhcnJheSgpOwogICAgJGxhc3RBcmdzMiA9IGFycmF5KCk7CiAgICBmb3IoJGkgPSAwIDsgJGkgPCBjb3VudCgkYXJncykgOyAkaSsrKQogICAgewogICAgICAgICRhcmcgPSAkYXJnc1skaV07CgogICAgICAgIGlmICgkYXJnWyJ0eXBlIl0gPT0gImdyb3VwIikKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkYXJnWyJwb3NpdGlvbiJdID09ICJsYXN0IikKICAgICAgICAgICAgICAgICRpbkxhc3QgPSB0cnVlOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkaW5MYXN0ID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGluTGFzdCkKICAgICAgICB7CiAgICAgICAgICAgICRsYXN0QXJnczJbXSA9ICRhcmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRhcmdzMltdID0gJGFyZzsKICAgICAgICB9CiAgICB9CiAgICAKICAgIAogICAgJGFyZ3MgPSBhcnJheV9tZXJnZSgkYXJnczIsICRsYXN0QXJnczIpOwoKICAgIC8vIG1lcmdlIGV4aXN0aW5nCiAgICAvL2dsb2JhbCAkQUFBOwogICAgLy9pZiAoJEFBQSkKICAgIC8vewogICAgICAgIC8vdmFyX2R1bXAoJGFyZ3MpOwogICAgICAgIC8vZXhpdDsKICAgIC8vfQoKICAgIAogICAgZm9yICgkaSA9IGNvdW50KCRhcmdzKS0xIDsgJGkgPj0gMCA7ICRpLS0pCiAgICB7CiAgICAgICAgZm9yICgkaiA9ICRpLTEgOyAkaiA+PSAwIDsgJGotLSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkYXJnc1skal1bIm5hbWUiXSAmJiAkYXJnc1skal1bIm5hbWUiXSA9PSAkYXJnc1skaV1bIm5hbWUiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkYXJnc1skal0gYXMgJG5hbWUgPT4gJHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0b3RvIGpzZW0gemFrb21lbnRvdmFsIGt2dWxpIFREYXRlVGltZUVkaXQgYSB2bGFzdG5vc3RpIHR5cGUgLSBwcm90b3plIGplIHByZWNpIGxvZ2lja2UsIHplIGtkeXogb3ZlcnJpZG51IHZsYXN0bm9zdCwgdGFrIGJ5IG1lbGEgYnl0IHRha292YSwgamFrIGpzZW0gamkgbmFzdGF2aWwgYSBuZSBqZW5vbSB6bWVueSwga3RlcmUgcHJlZHRpbSBuZWJ5bHkgZGVmaW5vdmFuZQogICAgICAgICAgICAgICAgICAgIC8vaWYgKCFpc3NldCgkYXJnc1skaV1bJG5hbWVdKSkKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ3NbJGldWyRuYW1lXSA9ICRhcmdzWyRqXVskbmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bnNldCgkYXJnc1skal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oJGFyZ3MpOwp9CmZ1bmN0aW9uIF9zbGVlcCgkc2Vjb25kcz0wKQp7CiAgICBnbG9iYWwgJF9fc2NyaXB0U3RhcnRUaW1lOyAvLyBkZWZpbmVkIGluIHNob3cucGhwCgogICAgJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0ID0gZ2V0QXBhY2hlQ29ubmVjdGlvblRpbWVvdXQoKTsKICAgIGlmICgkc2Vjb25kcyA+ICRhcGFjaGVDb25uZWN0aW9uVGltZW91dC0xMCkKICAgIHsKICAgICAgICBzaG93TWVzc2FnZSgiX3NsZWVwKCkgLSBjYW5ub3Qgc2xlZXAgbW9yZSB0aGFuICIuKCRhcGFjaGVDb25uZWN0aW9uVGltZW91dC0xMCkuIiBzIiwgbXRFcnJvcik7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvL2lmICgodGltZSgpLSR0aGlzLT5zdGFydFRpbWUpKyRzZWNvbmRzID4gJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0LTEwKQogICAgaWYgKCh0aW1lKCktJF9fc2NyaXB0U3RhcnRUaW1lKSskc2Vjb25kcyA+ICRhcGFjaGVDb25uZWN0aW9uVGltZW91dC0xMCkKICAgIHsKICAgICAgICAvLyBkbyBub3Qgc2xlZXAgb3IgaXQgd2lsbCBiZSBoYWx0ZWQgd2l0aG91dCBhbnkgb3V0cHV0CiAgICAgICAgLy8gcG9rdWQgYnljaCBzZSBwb2t1c2lsIHVzcGF0LCB0YWsgYnkgYnlsIHNrcmlwdCBiZWhlbSBzcGFua3UgbmFzaWxuZSB1a29uY2VuCiAgICAgICAgLy8gcHJvdG8gdnJhdGltIGZhbHNlIGEgamUgdHJlYmEgdmUgc2tyaXB0dSB2b2xhdCByZXN1bWVJbkJhY2tncm91bmQKICAgICAgICAvL3Byb2Nlc3NNZXNzYWdlKCJUUHJvY2Vzczo6c2xlZXAoKSAtIGNhbm5vdCBzbGVlcCBkdWUgdG8gQXBhY2hlIHRpbWVvdXQ8YnIgLz4iKTsKICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQogICAgZWxzZSAvLyBpdCdzIHNhZmUgdG8gc2xlZXAKICAgIHsKICAgICAgICAvLyBwcm9kbG91emltIHphY2F0ZWsgYmVodSBza3JpcHR1IC0gUEhQIG5lcG9jaXRhIHRlbnRvIGNhcyBkbyBtYXhfZXhlY3V0aW9uX3RpbWUKICAgICAgICAkX19zY3JpcHRTdGFydFRpbWUgKz0gJHNlY29uZHM7CiAgICAgICAgCiAgICAgICAgLy9wcm9jZXNzTWVzc2FnZSgiVFByb2Nlc3M6OnNsZWVwKCkgLSBzbGVlcGluZyBmb3IgJHNlY29uZHMgczxiciAvPiIpOwogICAgICAgIGlmICgkc2Vjb25kcykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoInRpbWVfc2xlZXBfdW50aWwiKSkKICAgICAgICAgICAgICAgIC8vJHJlc3VsdCA9IHRpbWVfc2xlZXBfdW50aWwodGltZSgpKyRzZWNvbmRzKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBAdGltZV9zbGVlcF91bnRpbChtaWNyb3RpbWUodHJ1ZSkrJHNlY29uZHMpOyAvLyB0byBlbmFibGUgZmxvYXQgbnVtYmVycyAoPSAwLjJzKQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoInVzbGVlcCIpKQogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSB1c2xlZXAoJHNlY29uZHMqMTAwMDAwMCk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHNsZWVwKChpbnQpJHNlY29uZHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vcHJvY2Vzc01lc3NhZ2UoIlRQcm9jZXNzOjpzbGVlcCgpIC0gcmVzdW1pbmcgZnJvbSBzbGVlcCgpPGJyIC8+Iik7CgogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0SHRtbFRhYmxlRnJvbURhdGFTZXQoJERhdGFTZXQsICRwYXJhbXM9YXJyYXkoKSkKewogICAgJHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7CiAgICAKICAgICRodG1sIC49ICI8dGFibGUgaWQ9JyIuJHBhcmFtc1siaWQiXS4iJyBjbGFzcz0nIi4kcGFyYW1zWyJjbGFzcyJdLiInIHN0eWxlPSciLmdldENTU1BhcmFtcygkcGFyYW1zKS4iJz4iOwogICAgaWYgKCRwYXJhbXNbImhlYWRlciJdKQogICAgewogICAgICAgICRodG1sIC49ICI8dGhlYWQ+IjsKICAgICAgICBmb3JlYWNoKCREYXRhU2V0LT5maWVsZHMgYXMgJGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJGh0bWwgLj0gIjx0aD4iLigkZmllbGRbInRpdGxlIl0gPyAkZmllbGRbInRpdGxlIl0gOiAkZmllbGRbIm5hbWUiXSkuIjwvdGg+IjsKICAgICAgICB9CiAgICAgICAgJGh0bWwgLj0gIjwvdGhlYWQ+IjsKICAgIH0KICAgICRodG1sIC49ICI8dGJvZHk+IjsKICAgIGZvcmVhY2goJERhdGFTZXQtPnJlY29yZHMgYXMgJHJlY29yZCkKICAgIHsKICAgICAgICAkaHRtbCAuPSAiPHRyPiI7CiAgICAgICAgZm9yZWFjaCgkRGF0YVNldC0+ZmllbGRzIGFzICRmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgICRodG1sIC49ICI8dGQ+Ii4kcmVjb3JkWyRmaWVsZFsibmFtZSJdXS4iPC90ZD4iOwogICAgICAgIH0KICAgICAgICAkaHRtbCAuPSAiPC90cj4iOwogICAgfQogICAgJGh0bWwgLj0gIjwvdGJvZHk+IjsKICAgIAogICAgJGh0bWwgLj0gIjwvdGFibGU+IjsKICAgIAogICAgcmV0dXJuKCRodG1sKSAgICA7Cn0KCmZ1bmN0aW9uIF9tYWlsKCRyZWNpcGllbnRzLCAkc3ViamVjdCwgJGJvZHk9IiIsICRhdHRhY2htZW50cz1hcnJheSgpLCAkcGFyYW1zPWFycmF5KCkpCnsKICAgICRNYWlsID0gY3JlYXRlT2JqZWN0KCJNYWlsIik7CiAgICAkTWFpbC0+c2V0UmVjaXBpZW50cyhleHBsb2RlTGlzdCgkcmVjaXBpZW50cykpOwogICAgJE1haWwtPnNldFN1YmplY3QoJHN1YmplY3QpOwogICAgaWYgKCRwYXJhbXNbInNlbmRlckVtYWlsIl0pCiAgICB7CiAgICAgICAgJE1haWwtPnNldFNlbmRlcigkcGFyYW1zWyJzZW5kZXJFbWFpbCJdLCAkcGFyYW1zWyJzZW5kZXJOYW1lIl0pOwogICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7IGV4aXQ7CiAgICB9CiAgICBpZiAoJHBhcmFtc1sic2VuZGVyIl0pCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRwYXJhbXNbInNlbmRlciJdKSkKICAgICAgICAgICAgJE1haWwtPnNldFNlbmRlcigkcGFyYW1zWyJzZW5kZXIiXVsiZW1haWwiXSwgJHBhcmFtc1sic2VuZGVyIl1bIm5hbWUiXSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkTWFpbC0+c2V0U2VuZGVyKCRwYXJhbXNbInNlbmRlciJdKTsKICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXMpOyBleGl0OwogICAgfQogICAgCiAgICBpZiAoc3RycG9zKCRib2R5LCAiPCIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJGJvZHksICI+IikgIT09IEZBTFNFKQogICAgICAgICRNYWlsLT5zZXRIdG1sQm9keSgkYm9keSk7CiAgICBlbHNlCiAgICAgICAgJE1haWwtPnNldEJvZHkoJGJvZHkpOwoKICAgIGZvcmVhY2goJGF0dGFjaG1lbnRzIGFzICRhdHRhY2htZW50KQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkYXR0YWNobWVudCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoX2ZpbGVfZXhpc3RzKGZpbmRGaWxlKCRhdHRhY2htZW50WyJmaWxlIl0pKSAmJiAhJGF0dGFjaG1lbnRbImNvbnRlbnQiXSkKICAgICAgICAgICAgICAgICRNYWlsLT5hZGRBdHRhY2htZW50KGZpbmRGaWxlKCRhdHRhY2htZW50WyJmaWxlIl0pLCAkYXR0YWNobWVudFsibmFtZSJdKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJE1haWwtPmFkZEF0dGFjaG1lbnRDb250ZW50KGZpcnN0X3ZhbHVlKCRhdHRhY2htZW50WyJjb250ZW50Il0sICRhdHRhY2htZW50WyJmaWxlIl0pLCAkYXR0YWNobWVudFsibmFtZSJdKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAkTWFpbC0+YWRkQXR0YWNobWVudCgkYXR0YWNobWVudCk7CiAgICB9CgogICAgcmV0dXJuKCRNYWlsLT5zZW5kKCkpOwp9CgpmdW5jdGlvbiBfcGhwX2NoZWNrX3N5bnRheCgkY29kZSwgJiRlcnJvcikKewogICAgJGZpbGUgPSAicmVwb3NpdG9yeS90ZW1wLyIuVVVJRCgpLiIucGhwIjsKICAgIC8vJGNvZGUgPSAiZWNobyB0aW1lKCk7IjsKICAgIF9maWxlX3B1dF9jb250ZW50cyhQUk9KRUNUUEFUSC4kZmlsZSwgIiBpZigwKXsiLiRjb2RlLiJcbn0gZWNobyAnT0snOyAiKTsKICAgIGlmIChfZmlsZV9leGlzdHMoUFJPSkVDVFBBVEguJGZpbGUpKQogICAgewogICAgICAgICRyZXN1bHQgPSBkb3dubG9hZChQUk9KRUNUVVJMLiRmaWxlKTsKICAgICAgICAvL3Zhcl9kdW1wKCRmaWxlKTsKICAgICAgICAvL3Zhcl9kdW1wKFBST0pFQ1RVUkwuJGZpbGUpOwogICAgICAgIC8vdmFyX2R1bXAoJHJlc3VsdCk7IGV4aXQ7CiAgICAgICAgX3VubGluayhQUk9KRUNUUEFUSC4kZmlsZSk7CiAgICAKICAgICAgICBpZiAoJHJlc3VsdCAhPT0gIk9LIiAmJiAkcmVzdWx0ICE9ICIiIC8qIHNvbWV0aGluZyBlbHNlIGlzIHdyb25nIC0gZm91bmQgb24gaHR0cHMgY29ubmVjdGlvbiB0cnlpbmcgdG8gZG93bmxvYWQgaXRzZWxmIC0gaHR0cHMgZXJyb3Igbm90IHJldHVybmluZyBlbnl0aGluZyAqLykKICAgICAgICB7CiAgICAgICAgICAgICRlcnJvciA9ICJVbmtub3duIHN5bnRheCBlcnJvciAoIi5QUk9KRUNUVVJMLiRmaWxlLiI6ICIuc3RyX2R1bXAoJHJlc3VsdCkuIikiOwogICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgIH0gICAgCiAgICB9CiAgICAKICAgIHJldHVybih0cnVlKTsKfQoKZnVuY3Rpb24gZ2V0TGFuZ3VhZ2VOYW1lKCRsYW5ndWFnZSkKewogICAgaWYgKCRsYW5ndWFnZSkKICAgIHsKICAgICAgICAkcmVjb3JkID0gZ2V0VGFibGUoIndvcmxkX2xhbmd1YWdlcyIpLT5nZXRSZWNvcmQoInRpZD0iLiRsYW5ndWFnZSk7CiAgICAgICAgcmV0dXJuKCRyZWNvcmRbIm5hbWUiXSk7CiAgICB9CiAgICByZXR1cm4oIiIpOwp9CgpmdW5jdGlvbiBnZXRMYXlvdXRDb250ZW50KCRuYW1lLCAkdmlld1R5cGU9InZ0QWxsIiwgJGRlZmF1bHQ9ZmFsc2UpCnsKICAgICRMYXlvdXQgPSBnZXRMYXlvdXQoJG5hbWUsICR2aWV3VHlwZSwgJGRlZmF1bHQpOwogICAgaWYgKCRMYXlvdXQpCiAgICAgICAgcmV0dXJuKCRMYXlvdXQtPmdldENvbnRlbnQoKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKCIiKTsKfQoKJF9fd2ViQ29udGVudE91dHB1dCA9IGZhbHNlOwpmdW5jdGlvbiBzZXRXZWJDb250ZW50T3V0cHV0KCR2YWx1ZSkKewogICAgZ2xvYmFsICRfX3dlYkNvbnRlbnRPdXRwdXQ7CiAgICAkX193ZWJDb250ZW50T3V0cHV0ID0gJHZhbHVlOwp9CgpmdW5jdGlvbiBfbG9nKCR0ZXh0LCAkbmFtZT0iIikKewogICAgaWYgKF9pc19hcnJheSgkdGV4dCkpCiAgICAgICAgJHRleHQgPSBUSlNPTjo6ZW5jb2RlKCR0ZXh0KTsKICAgIAogICAgLy8kZiA9IGZvcGVuKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAvc3lzdGVtX2xvZy50eHQiLCAiYSsiKTsKICAgIC8vZndyaXRlKCRmLCBtaWNyb3RpbWUodHJ1ZSkuInwiLlJFUVVFU1RJRC4iICIuJG5hbWUuIjogIi4kdGV4dC4iXG4iKTsKICAgIC8vZndyaXRlKCRmLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAvL2ZjbG9zZSgkZik7CgogICAgZ2xvYmFsICRfX2xvZ0Z1bmN0aW9ucywgJF9faW5Mb2c7CiAgICBpZiAoIWlzX2FycmF5KCRfX2xvZ0Z1bmN0aW9ucykpICAgIAogICAgICAgICRfX2xvZ0Z1bmN0aW9ucyA9IGFycmF5KCk7CiAgICAKICAgIGlmICghJF9faW5Mb2cpCiAgICB7CiAgICAgICAgJF9faW5Mb2cgPSB0cnVlOwogICAgICAgIAogICAgICAgIGZvcmVhY2goJF9fbG9nRnVuY3Rpb25zIGFzICRsb2dGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCRsb2dGdW5jdGlvbiwgJHRleHQsICRuYW1lLCAibG9nIik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRfX2luTG9nID0gZmFsc2U7CiAgICB9Cn0KCmZ1bmN0aW9uIHNlcnZlckxpbWl0UmVhY2hlZCgkc2Vjb25kc0JlZm9yZVRpbWVvdXQ9NSwgJG1lbW9yeUJlZm9yZVRpbWVvdXQ9MTApCnsKICAgIGlmICghQURNSU4pCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKCiAgICBnbG9iYWwgJF9fc2NyaXB0U3RhcnRUaW1lOyAvLyBkZWZpbmVkIGluIGFqYXgubGliLnBocAogICAgaWYgKCEkX19zY3JpcHRTdGFydFRpbWUpCiAgICAgICAgJF9fc2NyaXB0U3RhcnRUaW1lID0gZ2V0TWljcm9UaW1lKCk7CiAgICBpZiAoJF9TRVJWRVJbIlJFUVVFU1RfVElNRSJdKQogICAgICAgICRfX3NjcmlwdFN0YXJ0VGltZSA9ICRfU0VSVkVSWyJSRVFVRVNUX1RJTUUiXTsKCiAgICAkYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQgPSBnZXRBcGFjaGVDb25uZWN0aW9uVGltZW91dCgpOwoKICAgIGlmICgkc2Vjb25kc0JlZm9yZVRpbWVvdXQgPiAkYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQpCiAgICAgICAgJHNlY29uZHNCZWZvcmVUaW1lb3V0ID0gJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0LWNlaWwoJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0LzUpOwogICAgaWYgKCRzZWNvbmRzQmVmb3JlVGltZW91dCA+IGdldE1heEV4ZWN1dGlvblRpbWUoKSkKICAgICAgICAkc2Vjb25kc0JlZm9yZVRpbWVvdXQgPSBnZXRNYXhFeGVjdXRpb25UaW1lKCktY2VpbChnZXRNYXhFeGVjdXRpb25UaW1lKCkvNSk7CiAgICBpZiAoJG1lbW9yeUJlZm9yZVRpbWVvdXQgPiBnZXRNZW1vcnlMaW1pdCgpKQogICAgICAgICRtZW1vcnlCZWZvcmVUaW1lb3V0ID0gZ2V0TWVtb3J5TGltaXQoKS1jZWlsKGdldE1lbW9yeUxpbWl0KCkvNSk7CgogICAgaWYgKGdldE1pY3JvVGltZSgpLSRfX3NjcmlwdFN0YXJ0VGltZSA+IGdldFRpbWVMaW1pdCgpLSRzZWNvbmRzQmVmb3JlVGltZW91dCB8fCAodGltZSgpLSRfX3NjcmlwdFN0YXJ0VGltZSkgPiAkYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQtMTAgfHwgZ2V0TWVtb3J5VXNhZ2UodHJ1ZSkgPiBnZXRNZW1vcnlMaW1pdCgpLSRtZW1vcnlCZWZvcmVUaW1lb3V0KQogICAgICAgIHJldHVybih0cnVlKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oZmFsc2UpOyAgICAgICAgICAgICAgICAKfQoKZnVuY3Rpb24gZ2V0TGF5b3V0KCRuYW1lLCAkdmlld1R5cGU9InZ0QWxsIiwgJGRlZmF1bHQ9ZmFsc2UpCnsKICAgIHJldHVybihnZXRPYmplY3QoIkxheW91dHMiKS0+Z2V0TGF5b3V0KCRuYW1lLCAkdmlld1R5cGUsICRkZWZhdWx0KSk7Cn0KCmZ1bmN0aW9uIGdldExheW91dHMoJG5hbWUsICR2aWV3VHlwZT0idnRBbGwiLCAkZGVmYXVsdD1mYWxzZSkKewogICAgcmV0dXJuKGdldE9iamVjdCgiTGF5b3V0cyIpLT5nZXRMYXlvdXRzKCRuYW1lLCAkdmlld1R5cGUsICRkZWZhdWx0KSk7Cn0KCmZ1bmN0aW9uIGdldFRlbXBsYXRlKCRuYW1lLCAkdmlld1R5cGU9InZ0QWxsIiwgJHJlcXVpcmVkPWZhbHNlLCAkZW1wdHk9ZmFsc2UsICRfc3R5bGU9IiIpCnsKICAgIHJldHVybihnZXRPYmplY3QoIlRlbXBsYXRlcyIpLT5nZXRUZW1wbGF0ZSgkbmFtZSwgJHZpZXdUeXBlLCAkcmVxdWlyZWQsICRlbXB0eSwgJF9zdHlsZSkpOwp9CiAgICAKZnVuY3Rpb24gZ2V0VGVtcGxhdGVzKCRuYW1lLCAkdmlld1R5cGU9InZ0QWxsIiwgJHJlcXVpcmVkPWZhbHNlLCAkZW1wdHk9ZmFsc2UsICRfc3R5bGU9IiIsICRhbGw9ZmFsc2UpCnsKICAgIHJldHVybihnZXRPYmplY3QoIlRlbXBsYXRlcyIpLT5nZXRUZW1wbGF0ZXMoJG5hbWUsICR2aWV3VHlwZSwgJHJlcXVpcmVkLCAkZW1wdHksICRfc3R5bGUsICRhbGwpKTsKfQoKZnVuY3Rpb24gc2V0UGFnZVRpdGxlKCR0aXRsZSkKewogICAgZ2xvYmFsICRwYWdlVGl0bGU7CiAgICAkcGFnZVRpdGxlID0gJHRpdGxlOyAgICAKfQoKZnVuY3Rpb24gZ2V0QWdlKCRkb2IpCnsKICAgIC8vdmFyX2R1bXAoJGRvYik7CiAgICAkZG9iID0gX3N0cnRvdGltZSgkZG9iKTsKICAgIAogICAgJGRvYk9iamVjdCA9IG5ldyBEYXRlVGltZShkYXRlKCJZLW0tZCBIOmk6cyIsICRkb2IpKTsKICAgICRub3dPYmplY3QgPSBuZXcgRGF0ZVRpbWUoKTsKICAgICRkaWZmID0gJGRvYk9iamVjdC0+ZGlmZigkbm93T2JqZWN0KTsKCiAgICBpZiAoJGRvYiA+IHRpbWUoKSkKICAgICAgICByZXR1cm4oKC0xKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKCRkaWZmLT55KTsKfQoKZnVuY3Rpb24gZ2V0UGFyYW1zRmlsdGVyVmFsdWUoJHBhcmFtcywgJGZpZWxkTmFtZSkKewogICAgaWYgKCRwYXJhbXNbJGZpZWxkTmFtZV0pCiAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGZpZWxkTmFtZV0pOwogICAgaWYgKCRwYXJhbXNbImZpbHRlcl8iLiRmaWVsZE5hbWVdKQogICAgICAgIHJldHVybigkcGFyYW1zWyJmaWx0ZXJfIi4kZmllbGROYW1lXSk7CiAgICAKICAgIGlmICgkcGFyYW1zWyJjb21wb25lbnRGaWx0ZXJzIl0pCiAgICB7CiAgICAgICAgJHBhcmFtczMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdIGFzICR2YWx1ZTMpCiAgICAgICAgewogICAgICAgICAgICAkcGFyYW1zM1skdmFsdWUzWyJmaWVsZCJdXSA9ICR2YWx1ZTNbInZhbHVlIl07CiAgICAgICAgfQoKICAgICAgICAkdmFsdWUgPSBnZXRQYXJhbXNGaWx0ZXJWYWx1ZSgkcGFyYW1zMywgJGZpZWxkTmFtZSk7CiAgICAgICAgaWYgKCR2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuKCR2YWx1ZSk7CiAgICB9CiAgICAKICAgIHJldHVybigiIik7Cn0KCmZ1bmN0aW9uIHNldFBhcmFtc0ZpbHRlclZhbHVlKCRwYXJhbXMsICRmaWVsZE5hbWUsICR2YWx1ZSkKewogICAgaWYgKGlzc2V0KCRwYXJhbXNbJGZpZWxkTmFtZV0pKQogICAgICAgICRwYXJhbXNbJGZpZWxkTmFtZV0gPSAkdmFsdWU7CiAgICBlbHNlIGlmIChpc3NldCgkcGFyYW1zWyJmaWx0ZXJfIi4kZmllbGROYW1lXSkpCiAgICAgICAgJHBhcmFtc1siZmlsdGVyXyIuJGZpZWxkTmFtZV0gPSAkdmFsdWU7CiAgICAKICAgIC8qIFRPRE8gKi8KICAgIC8qCiAgICBpZiAoJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdKQogICAgewogICAgICAgIGZvcmVhY2goJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdIGFzICR2YWx1ZTMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHBhcmFtc1skdmFsdWUzWyJmaWVsZCJdXSA9PSAkZmllbGROYW1lKQogICAgICAgICAgICAgICAgJHBhcmFtc1skdmFsdWUzWyJmaWVsZCJdXSA9ICR2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAqLwogICAgCiAgICByZXR1cm4oJHBhcmFtcyk7Cn0KCmZ1bmN0aW9uIGdldEFkbWluTGluaygkdGFibGVOYW1lLCAkcGFyYW1zPWFycmF5KCkpCnsKICAgIGlmIChpc1VVSUQoJHBhcmFtcykpCiAgICB7CiAgICAgICAgJGlkID0gJHBhcmFtczsKICAgICAgICAkcGFyYW1zID0gYXJyYXkoKTsKICAgICAgICAkcGFyYW1zWyJpZCJdID0gJGlkOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICRwYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgfQogICAgCiAgICAkbGlua0luZm8gPSBhcnJheSgpOwogICAgJGxpbmtJbmZvWyJmaWxlIl0gPSAiaW5kZXgucGhwIjsKICAgICRsaW5rSW5mb1sicGF0aCJdID0gIi9hZG1pbi8iOwogICAgJGxpbmtJbmZvWyJ0YWJsZU5hbWUiXSA9ICR0YWJsZU5hbWU7CiAgICAkbGlua0luZm9bInBhcmFtcyJdID0gJHBhcmFtczsKICAgICRsaW5rSW5mb1sicGFyYW1zIl1bInRhYmxlTmFtZSJdID0gJHRhYmxlTmFtZTsKCiAgICBpZiAoJGxpbmtJbmZvWyJwYXJhbXMiXVsiaWQiXSkKICAgIHsKICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdWyJhY3Rpb25UeXBlIl0gPSAiYXREaXNwbGF5RWRpdCI7CiAgICAgICAgJGxpbmtJbmZvWyJwYXJhbXMiXVsidmlld1R5cGUiXSA9ICJ2dEZ1bGwiOwogICAgICAgICRsaW5rSW5mb1sicGFyYW1zIl1bImRpc3BsYXlUYWJsZU5hbWUiXSA9ICR0YWJsZU5hbWU7CiAgICB9CiAgICAKICAgIGlmICgkbGlua0luZm9bInBhcmFtcyJdWyJwYXJlbnQiXSkKICAgIHsKICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdWyJtYXN0ZXJGaWVsZFZhbHVlIl0gPSAkbGlua0luZm9bInBhcmFtcyJdWyJwYXJlbnQiXTsKICAgICAgICB1bnNldCgkbGlua0luZm9bInBhcmFtcyJdWyJwYXJlbnQiXSk7CiAgICB9CgogICAgJHVybCA9IGltcGxvZGVMaW5rKCRsaW5rSW5mbyk7CiAgICAKICAgIHJldHVybigkdXJsKTsKfQoKZnVuY3Rpb24gZ2V0TW9udGhOYW1lKCR2YWx1ZSwgJGNoYXJzPTEwMCkKewogICAgaWYgKCR2YWx1ZSA+PTEgJiYgJHZhbHVlIDw9MTIpCiAgICB7CiAgICAgICAgJHZhbHVlID0gbWt0aW1lKDAsMCwwLCR2YWx1ZSwxKTsKICAgIH0KICAgIAogICAgaWYgKCR2YWx1ZSkKICAgIHsKICAgICAgICAkbmFtZSA9IGRhdGUoIkYiLCBfc3RydG90aW1lKCR2YWx1ZSkpOwogICAgICAgICRuYW1lID0gdHJhbnNsYXRlKCRuYW1lKTsKICAgICAgICBpZiAoJGNoYXJzKQogICAgICAgICAgICAkbmFtZSA9IF9zdWJzdHIoJG5hbWUsIDAsIChpbnQpJGNoYXJzKTsKCiAgICAgICAgcmV0dXJuKCRuYW1lKTsKICAgIH0KfQpmdW5jdGlvbiBleHRyYWN0Q2FjaGVTdW1GaWVsZHMoJHN0cikKewogICAgJHIgPSBhcnJheSgpOwogICAgd2hpbGUocHJlZ19tYXRjaF9hbGwoInxbXixdK1xcKFteXFwoXFwpXStcXCl8aW1zIiwgJHN0ciwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRtYXRjaCkKICAgICAgICB7CiAgICAgICAgICAgICRfciA9IFVVSUQoKTsKICAgICAgICAgICAgJHJbJF9yXSA9ICRtYXRjaFswXTsKICAgICAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCRtYXRjaFswXSwgJF9yLCAkc3RyKTsKICAgICAgICB9CiAgICB9CiAgICAkciA9IGFycmF5X3JldmVyc2UoJHIpOwogICAgLy92YXJfZHVtcCgkcik7CiAgICAkc3RyID0gZXhwbG9kZSgiLCIsICRzdHIpOwogICAgZm9yZWFjaCgkc3RyIGFzICRfcyA9PiAkdikKICAgIHsKICAgICAgICBmb3JlYWNoKCRyIGFzICRfciA9PiAkX3YpCiAgICAgICAgewogICAgICAgICAgICAkc3RyWyRfc10gPSBzdHJfcmVwbGFjZSgkX3IsICRfdiwgJHN0clskX3NdKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybigkc3RyKTsKfQoKJF9faGVhZEh0bWxDb21waWxlZEZpbGVzID0gYXJyYXkoKTsKLyoKJF9faGVhZEh0bWxDb21waWxlZEZpbGVzID0gYXJyYXkoCiAgICAiY29yZS9jbGFzc2VzL19uZXcvVVVJRC9VVUlELmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9PYmplY3QvT2JqZWN0LmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9KU09OL0pTT04uY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L01vdXNlL01vdXNlLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9LZXlib2FyZC9LZXlib2FyZC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvVHJhbnNsYXRvci9UcmFuc2xhdG9ycy5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvVHJhbnNsYXRvci9UcmFuc2xhdG9yLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9Db21wb25lbnQvQ29tcG9uZW50LmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9BdXRvU2l6ZS9BdXRvU2l6ZS5jbGFzcy5qcyIsCiAgICAKICAgICJjb3JlL2NsYXNzZXMvX25ldy9EYXRlVGltZS9EYXRlVGltZS5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvTW9iaWxlQnJvd3Nlci9Nb2JpbGVCcm93c2VyLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9QcmludC9QcmludC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvQm91bmRzUmVjdC9Cb3VuZHNSZWN0LmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9QYW5lbC9QYW5lbC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvQnViYmxlUGFuZWwvQnViYmxlUGFuZWwuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0hlbHBBc3Npc3RhbnQvSGVscEFzc2lzdGFudC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvVGV4dEVkaXQvVGV4dEVkaXQuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0J1dHRvbkVkaXQvQnV0dG9uRWRpdC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvQ2hlY2tCb3gvQ2hlY2tCb3guY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0NvbWJvQm94L0NvbWJvQm94LmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9Mb29rdXBDb21ib0JveC9Mb29rdXBDb21ib0JveC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvTG9hZGluZ0FuaW1hdGlvbi9Mb2FkaW5nQW5pbWF0aW9uLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9UcmVlL1RyZWUuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L1RyZWUvVHJlZUl0ZW0uY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0FkdmFuY2VkVHJlZS9BZHZhbmNlZFRyZWUuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L01lbnUvTWVudS5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvTWVudS9NZW51SXRlbS5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvRHJhZ0Ryb3AvRHJhZ0Ryb3AuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0RvY2tQYW5lbC9Eb2NrUGFuZWwuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0RvY2tBcmVhL0RvY2tBcmVhLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9KU1JQQy9KU1JQQy5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvRGlhbG9nL0RpYWxvZy5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvU3RhcnRNZW51L1N0YXJ0TWVudS5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvU3RhcnRNZW51L1N0YXJ0TWVudUl0ZW0uY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L1Rvb2xUaXAvVG9vbFRpcC5jbGFzcy5qcyIsCiAgICAKICAgICJjb3JlL2NsYXNzZXMvX25ldy9EZWJ1Zy9EZWJ1Zy5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvRGVidWcvRGVidWdQYW5lbC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvRGVidWcvRGVidWdGbG9hdFBhbmVsLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9EZWJ1Zy9wYW5lbHMvTWVzc2FnZXMvTWVzc2FnZXNEZWJ1Z1BhbmVsLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9EZWJ1Zy9wYW5lbHMvUEhQL1BIUERlYnVnUGFuZWwuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0RlYnVnL3BhbmVscy9KYXZhU2NyaXB0L0phdmFTY3JpcHREZWJ1Z1BhbmVsLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9EZWJ1Zy9wYW5lbHMvRGVzaWduL0Rlc2lnbkRlYnVnUGFuZWwuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0RlYnVnL3BhbmVscy9TRU8vU0VPRGVidWdQYW5lbC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvRGVidWcvcGFuZWxzL0F1dGgvQXV0aERlYnVnUGFuZWwuY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0RlYnVnL3BhbmVscy9Nb2JpbGUvTW9iaWxlRGVidWdQYW5lbC5jbGFzcy5qcyIsCiAgICAiY29yZS9jbGFzc2VzL19uZXcvVGV4dFRyYW5zZm9ybS9UZXh0VHJhbnNmb3JtLmNsYXNzLmpzIiwKICAgICJjb3JlL2NsYXNzZXMvX25ldy9UZXh0VHJhbnNmb3JtL1RleHRUcmFuc2Zvcm0uY2xhc3MuanMiLAogICAgImNvcmUvY2xhc3Nlcy9fbmV3L0NvbnRleHRNZW51L0NvbnRleHRNZW51LmNsYXNzLmpzIiwKKTsKKi8KCi8vIHVzZWQgaW4gc2hvcF9vcmRlcl9jaGFuZ2VDb3VudCBzY3JpcHQgd2l0aCBnb29nbGUgYW5hbHl0aWNzIGFkdmFuY2VkIGV2ZW50cyBmb3IgcmVtb3ZlZnJvbWNhcnQKLy8gVE9ETyB1c2UgaXQgb24gYWpheC5saWIucGhwCmZ1bmN0aW9uIGdldEFKQVhGaW5hbEh0bWwoJGh0bWwpCnsKICAgICRodG1sID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkdldEh0bWxCb2R5IiwgYXJyYXkoImh0bWwiID0+ICRodG1sKSwgImh0bWwiKTsKICAgICRodG1sID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblBhcnNlRmluYWxIdG1sIiwgYXJyYXkoImh0bWwiID0+ICRodG1sKSwgImh0bWwiKTsKICAgICRodG1sID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblNob3ciLCBhcnJheSgiaHRtbCIgPT4gJGh0bWwpLCAiaHRtbCIpOwogICAgZ2xvYmFsICRfX2JvZHlIdG1sUHJlZml4OwogICAgZm9yZWFjaCgkX19ib2R5SHRtbFByZWZpeCBhcyAkX2JvZHlIdG1sUHJlZml4KQogICAgewogICAgICAgICRodG1sIC49ICRfYm9keUh0bWxQcmVmaXguIlxuIjsKICAgIH0KICAgICRodG1sIC49ICRib2R5SHRtbDsKICAgIGdsb2JhbCAkX19ib2R5SHRtbFBvc3RmaXg7CiAgICBmb3JlYWNoKCRfX2JvZHlIdG1sUG9zdGZpeCBhcyAkX2JvZHlIdG1sUG9zdGZpeCkKICAgIHsKICAgICAgICAkaHRtbCAuPSAkX2JvZHlIdG1sUG9zdGZpeC4iXG4iOwogICAgfSAgICAKICAgIAogICAgcmV0dXJuKCRodG1sKTsKfQoKZnVuY3Rpb24gX3JvdW5kKCRudW0sICRwcmVjaXNpb249MCkKewogICAgaWYgKChpbnQpJHByZWNpc2lvbiAhPSAkcHJlY2lzaW9uKSAgICAKICAgIHsKICAgICAgICAkcHJlY2lzaW9uMSA9IChpbnQpJHByZWNpc2lvbjsKICAgICAgICAkcHJlY2lzaW9uMiA9ICRwcmVjaXNpb24tJHByZWNpc2lvbjE7CiAgICAgICAgJHByZWNpc2lvbjIgKj0gMTA7CiAgICAgICAgLy9lY2hvICI8aHI+IjsKICAgICAgICAvL3Zhcl9kdW1wKCRwcmVjaXNpb24xKTsKICAgICAgICAvL3Zhcl9kdW1wKCRwcmVjaXNpb24yKTsKICAgICAgICAvL3Zhcl9kdW1wKHJvdW5kKCRudW0sICRwcmVjaXNpb24xKSk7CgogICAgICAgICRwcmVjaXNpb24zID0gMS8kcHJlY2lzaW9uMioxMDsKICAgICAgICAvL3Zhcl9kdW1wKCRwcmVjaXNpb24zKTsKICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKDEwKigkcHJlY2lzaW9uMS0xKSk7CiAgICAgICAgJG51bTEgPSAkbnVtKigxMCooJHByZWNpc2lvbjEtMSkpOwogICAgICAgIC8vdmFyX2R1bXAoJG51bTEpOwogICAgICAgICRudW0yID0gcm91bmQocm91bmQoJG51bTEsICRwcmVjaXNpb24xKSAqICRwcmVjaXNpb24zKS8kcHJlY2lzaW9uMzsKICAgICAgICAvL3Zhcl9kdW1wKCRudW0yKTsKICAgICAgICAkbnVtMyA9ICRudW0yLygxMCooJHByZWNpc2lvbjEtMSkpOwogICAgICAgIHJldHVybigkbnVtMyk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKHJvdW5kKCRudW0sICRwcmVjaXNpb24pKTsKfQoKZnVuY3Rpb24gc2V0VmFyaWFibGUoJG5hbWUsICR2YWx1ZSkKewogICAgZ2xvYmFsICQkbmFtZTsKICAgIAogICAgJCRuYW1lID0gJHZhbHVlOwogICAgaWYgKGlzc2V0KCRfR0VUWyRuYW1lXSkpCiAgICAgICAgJF9HRVRbJG5hbWVdID0gJHZhbHVlOwogICAgaWYgKGlzc2V0KCRfUE9TVFskbmFtZV0pKQogICAgICAgICRfUE9TVFskbmFtZV0gPSAkdmFsdWU7CiAgICBpZiAoIWlzc2V0KCRfR0VUWyRuYW1lXSkgJiYgIWlzc2V0KCRfUE9TVFskbmFtZV0pKQogICAgICAgICRfUE9TVFskbmFtZV0gPSAkdmFsdWU7CgogICAgJF9SRVFVRVNUWyRuYW1lXSA9ICR2YWx1ZTsKfQoKZnVuY3Rpb24gdW5zZXRWYXJpYWJsZSgkbmFtZSkKewogICAgZ2xvYmFsICQkbmFtZTsKICAgIAogICAgJCRuYW1lID0gTlVMTDsKICAgIHVuc2V0KCRfR0VUWyRuYW1lXSk7CiAgICB1bnNldCgkX1BPU1RbJG5hbWVdKTsKICAgIHVuc2V0KCRfUkVRVUVTVFskbmFtZV0pOwp9Cg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ29yZS9mdW5jdGlvbnMucGFyc2UucGhwIC0tLS0tLS0gDQoKICAgIAogICAgLy8gVE9ETyAtIG9wdGltaXplCiAgICBmdW5jdGlvbiBnZXRIcmVmcygkaHRtbCwgJHR5cGVzPWFycmF5KCksICRyYXc9ZmFsc2UpCiAgICB7CiAgICAgICAgJHR5cGVzID0gZXhwbG9kZUxpc3QoJHR5cGVzKTsKICAgICAgICAKICAgICAgICAkaHJlZnMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGlmICghJHJhdykKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSBwYXJzZWQgYWZ0ZXIgZXh0cmFjdGluZyBpbnRvIDxzY3JpcHQ+CiAgICAgICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKCJ8KHBhcmFtcz1cIihbXlwiXSopXCIpfGltcyIsICIiLCAkaHRtbCk7ICAgICAgICAgIC8vIGNtc2phdmFzY3JpcHQsIGNtc3BocHNjcmlwdCwgLi4uCiAgICAgICAgICAgIAogICAgICAgICAgICAvLyA8c3R5bGU+CiAgICAgICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKCJ8KDxzdHlsZVtePl0qPikoLio/KSg8L3N0eWxlPil8aW1zIiwgIiIsICRodG1sKTsgICAgICAgICAgLy8gc3R5bGUuLi4KCiAgICAgICAgICAgIC8vIGN1c3RvbSBKYXZhU2NyaXB0CiAgICAgICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKCJ8KC8vIEpTIEJFR0lOKC4qPykvLyBKUyBFTkQpfGltcyIsICIiLCAkaHRtbCk7ICAgLy8gZGlyZWN0IGphdmFzY3JpcHRzCiAgICAgICAgICAgIAogICAgICAgICAgICAvLyA8cHJlPiBzb3VyY2UgY29kZQogICAgICAgICAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgifCg8cHJlW14+XSo+KSguKj8pKDwvcHJlPil8aW1zIiwgIiIsICRodG1sKTsKCiAgICAgICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKCJ8KC8vPCFcW0NEQVRBXFsoLio/KS8vXF1cXT4pfGltcyIsICIiLCAkaHRtbCk7ICAgLy8gZGlyZWN0IGphdmFzY3JpcHRzCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIWluX2FycmF5KCJzcmMiLCAkdHlwZXMpKQogICAgICAgICAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2UoInwoPHNjcmlwdCguKj8pPC9zY3JpcHQ+KXxpbXMiLCAiIiwgJGh0bWwpOyAgIC8vIGRpcmVjdCBqYXZhc2NyaXB0cwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkaHRtbCwgIjwiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICAvLyBocmVmPz0iYW55dGhpbmciIC0gaWYgZW1wdHkgaHJlZiB3aWxsIGJlIHJlbW92ZWQKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vaWYgKCghJHR5cGVzIHx8IGluX2FycmF5KCJocmVmIiwgJHR5cGVzKSkgJiYgcHJlZ19tYXRjaF9hbGwoJ2AoaHJlZlxcPz89IikoW14iXSspKCIpYGltcycsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAvL2lmICgoISR0eXBlcyB8fCBpbl9hcnJheSgiaHJlZiIsICR0eXBlcykpICYmIHByZWdfbWF0Y2hfYWxsKCJgKGhyZWZcXD8/PScpKFteJ10rKSgnKWBpbXMiLCAkaHRtbCwgJHNlb0VsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIC8vICAgICRocmVmcyA9IGFycmF5X21lcmdlKCRocmVmcywgJHNlb0VsZW1lbnRzKTsKICAgICAgICAgICAgaWYgKCghJHR5cGVzIHx8IGluX2FycmF5KCJocmVmIiwgJHR5cGVzKSkgJiYgcHJlZ19tYXRjaF9hbGwoImAoaHJlZlxcPz89W1wiJ10pKFteXCInXSspKFtcIiddKWBpbXMiLCAkaHRtbCwgJHNlb0VsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgICAgICAkaHJlZnMgPSBhcnJheV9tZXJnZSgkaHJlZnMsICRzZW9FbGVtZW50cyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2lmICgoISR0eXBlcyB8fCBpbl9hcnJheSgic3JjIiwgJHR5cGVzKSkgJiYgcHJlZ19tYXRjaF9hbGwoJ2Aoc3JjXFw/Pz0iKShbXiJdKykoIilgaW1zJywgJGh0bWwsICRzZW9FbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICAvLyAgICAkaHJlZnMgPSBhcnJheV9tZXJnZSgkaHJlZnMsICRzZW9FbGVtZW50cyk7CiAgICAgICAgICAgIC8vaWYgKCghJHR5cGVzIHx8IGluX2FycmF5KCJzcmMiLCAkdHlwZXMpKSAmJiBwcmVnX21hdGNoX2FsbCgiYChzcmNcXD8/PScpKFteJ10rKSgnKWBpbXMiLCAkaHRtbCwgJHNlb0VsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIC8vICAgICRocmVmcyA9IGFycmF5X21lcmdlKCRocmVmcywgJHNlb0VsZW1lbnRzKTsKICAgICAgICAgICAgaWYgKCghJHR5cGVzIHx8IGluX2FycmF5KCJzcmMiLCAkdHlwZXMpKSAmJiBwcmVnX21hdGNoX2FsbCgiYChzcmNcXD8/PVtcIiddKShbXlwiJ10rKShbXCInXSlgaW1zIiwgJGh0bWwsICRzZW9FbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICAgICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gdG9kbyAtIGF0dHJpYnV0ZXMgeHh4LWFjdGlvbiBhcmUgY29udmVydGVkIGFuZCBzaG91bGQgYmUgbm90ISB0cmllZCB0byBhZGQgJyAnIGF0IGJlZ2lubmluZyBidXQgaXMgbWFrZXMgPGZvcm1hY3Rpb249IHRvZ2V0aGVyCiAgICAgICAgICAgIC8vIGFsZSAKICAgICAgICAgICAgLy9pZiAoKCEkdHlwZXMgfHwgaW5fYXJyYXkoImFjdGlvbiIsICR0eXBlcykpICYmIHByZWdfbWF0Y2hfYWxsKCdgKGFjdGlvblxcPz89IikoW14iXSspKCIpYGltcycsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAvL2lmICgoISR0eXBlcyB8fCBpbl9hcnJheSgiYWN0aW9uIiwgJHR5cGVzKSkgJiYgcHJlZ19tYXRjaF9hbGwoImAoYWN0aW9uXFw/Pz0nKShbXiddKykoJylgaW1zIiwgJGh0bWwsICRzZW9FbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICAvLyAgICAkaHJlZnMgPSBhcnJheV9tZXJnZSgkaHJlZnMsICRzZW9FbGVtZW50cyk7CiAgICAgICAgICAgIGlmICgoISR0eXBlcyB8fCBpbl9hcnJheSgiYWN0aW9uIiwgJHR5cGVzKSkgJiYgcHJlZ19tYXRjaF9hbGwoImAoYWN0aW9uXFw/Pz1bXCInXSkoW15cIiddKykoW1wiJ10pYGltcyIsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgICAgICRocmVmcyA9IGFycmF5X21lcmdlKCRocmVmcywgJHNlb0VsZW1lbnRzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgoISR0eXBlcyB8fCBpbl9hcnJheSgidXJsIiwgJHR5cGVzKSkgJiYgcHJlZ19tYXRjaF9hbGwoImAoWzogXXVybFwoW1wiJ10/KShbXlwiJ1wpXSspKFtcIidcKV0/KWBpbXMiLCAkaHRtbCwgJHNlb0VsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgICAgICAkaHJlZnMgPSBhcnJheV9tZXJnZSgkaHJlZnMsICRzZW9FbGVtZW50cyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gZW1haWwgVEQgYmFja2dyb3VuZAogICAgICAgICAgICBpZiAoKCEkdHlwZXMgfHwgaW5fYXJyYXkoImhyZWYiLCAkdHlwZXMpKSAmJiBwcmVnX21hdGNoX2FsbCgiYChiYWNrZ3JvdW5kXFw/Pz1bXCInXSkoW15cIiddKykoW1wiJ10pYGltcyIsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgICAgICRocmVmcyA9IGFycmF5X21lcmdlKCRocmVmcywgJHNlb0VsZW1lbnRzKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgnYChGbGFzaE9iamVjdFwoIikoW14iXSspKCIpYGltcycsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgnYChhY3Rpb249IikoW14iXSspKCIpYGltcycsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgiYChhY3Rpb249JykoW14nXSspKCcpYGltcyIsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgnYChvcGVuXCgiKShbXiJdKykoIilgaW1zJywgJGh0bWwsICRzZW9FbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICAvLyAgICAkaHJlZnMgPSBhcnJheV9tZXJnZSgkaHJlZnMsICRzZW9FbGVtZW50cyk7CiAgICAgICAgICAgIC8vaWYgKHByZWdfbWF0Y2hfYWxsKCJgKG9wZW5cKCcpKFteJ10rKSgnKWBpbXMiLCAkaHRtbCwgJHNlb0VsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIC8vICAgICRocmVmcyA9IGFycmF5X21lcmdlKCRocmVmcywgJHNlb0VsZW1lbnRzKTsKCiAgICAgICAgICAgIC8vIGt2dWxpIG9ka2F6dW0gcHJlcyBqYXZhc2NyaXB0IGF0ZC4gKG1lemVyYSBwcmVkIG9uIGt2dWxpIGNvbmRpdGlvbj0iIgogICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgnYCggb25bYS16QS1aXSs9IikoW14iXSspKCIpYGltcycsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgiYCggb25bYS16QS1aXSs9JykoW14nXSspKCcpYGltcyIsICRodG1sLCAkc2VvRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgLy8gICAgJGhyZWZzID0gYXJyYXlfbWVyZ2UoJGhyZWZzLCAkc2VvRWxlbWVudHMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdHJwb3MoJGh0bWwsICIucGhwIikgIT09IEZBTFNFICYmIHN0cnBvcygkaHRtbCwgIiAiKSA9PT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICAkaHJlZnMgPSBhcnJheShhcnJheSgkaHRtbCwiIiwkaHRtbCwiIikpOwogICAgICAgIH0KCiAgICAgICAgJF9ocmVmcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkaHJlZnMgYXMgJGhyZWYpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJGhyZWYpOwogICAgICAgICAgICAvLyBwcm9jIC0ga3Z1bGkgbWFpbHRvOiBhIGphdmFzY3JpcHQ6ID8/PwogICAgICAgICAgICAvL2lmIChzdHJwb3MoJGhyZWZbMF0sICI6IikgPT09IEZBTFNFKQogICAgICAgICAgICAKICAgICAgICAgICAgLy8ga3Z1bGkgYmFja2dyb3VuZDogdXJsKCB4eHh4ICkgd2l0aCBzcGFjZXMsIHdoaWNoIGlzIGFsc28gYXZhaWxhYmxlCiAgICAgICAgICAgICRocmVmWzFdID0gdHJpbSgkaHJlZlsxXSk7CiAgICAgICAgICAgICRocmVmWzJdID0gdHJpbSgkaHJlZlsyXSk7CiAgICAgICAgICAgICRocmVmWzNdID0gdHJpbSgkaHJlZlszXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgJF9ocmVmc1tdID0gJGhyZWY7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkX2hyZWZzKTsgICAgCiAgICB9CgogICAgZnVuY3Rpb24gdW5wYXJzZUxpbmsoJGxpbmspCiAgICB7CiAgICAgICAgJGxpbmsyID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblVucGFyc2VMaW5rIiwgYXJyYXkoImxpbmsiID0+ICRsaW5rKSwgImxpbmsiKTsKCiAgICAgICAgaWYgKCEkbGluazIpCiAgICAgICAgICAgICRsaW5rMiA9ICRsaW5rOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJGxpbmsyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZUxpbmsoJGxpbmssICRwZXJzaXN0ZW50UGFyYW1ldGVycz10cnVlLCAkcmF3PXRydWUsICRwcm9qZWN0VXJsPSIiKQogICAgewogICAgICAgIGlmIChpc19zdHJpbmcoJHBlcnNpc3RlbnRQYXJhbWV0ZXJzKSkKICAgICAgICB7CiAgICAgICAgICAgICRwcm9qZWN0VXJsID0gJHBlcnNpc3RlbnRQYXJhbWV0ZXJzOwogICAgICAgICAgICAkcGVyc2lzdGVudFBhcmFtZXRlcnMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2R1bXAoIi0tLS0iKTsKICAgICAgICAvL2R1bXAoJGxpbmspOwogICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIAogICAgICAgIGlmICgkbGluayA9PSAiIikKICAgICAgICAgICAgcmV0dXJuKCIiKTsKCiAgICAgICAgaWYgKHN0cnBvcygkbGluaywgImh0dHA6Ly8iKSA9PT0gMCB8fCBzdHJwb3MoJGxpbmssICJodHRwczovLyIpID09PSAwIHx8IHN0cnBvcygkbGluaywgIjovLyIpID09PSAwIHx8IHN0cnBvcygkbGluaywgIi8iKSA9PT0gMCB8fCAkbGlua1swXSA9PSAiWyIgfHwgJGxpbmtbMF0gPT0gInsiKQogICAgICAgICAgICByZXR1cm4oJGxpbmspOwogICAgICAgIAogICAgICAgIGdsb2JhbCAkZmlsZU5hbWU7CiAgICAgICAgaWYgKCRsaW5rWzBdID09ICI/IikKICAgICAgICAgICAgJGxpbmsgPSAkZmlsZU5hbWUuJGxpbms7CiAgICAgICAgICAgIAogICAgICAgIC8vZHVtcCgkbGluayk7CiAgICAgICAgLy9yZXR1cm4oJGxpbmspOwogICAgICAgIGlmICgkbGlua1swXSA9PSAiIyIpCiAgICAgICAgICAgIHJldHVybigkbGluayk7CiAgICAgICAgCiAgICAgICAgJHJlcGxhY2VtZW50cyA9IGFycmF5KCk7CiAgICAgICAgaWYgKGdldE9iamVjdCgiVHJhbnNsYXRvcnMiKS0+dHJhbnNsYXRvckNvdW50ID4gMSkKICAgICAgICAgICAgJHJlcGxhY2VtZW50c1sibGFuZ3VhZ2UiXSA9ICRhY3RpdmVMYW5ndWFnZTsKICAgICAgICAKICAgICAgICBpZiAoc3RycG9zKCRsaW5rLCAie3BocDoiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgIHJldHVybigkbGluayk7CgogICAgICAgIC8qCiAgICAgICAgaWYgKCRwZXJzaXN0ZW50UGFyYW1ldGVycykgLy8gdXNlZCBpbiBSU1MgZ2VuZXJhdGluZwogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRfUkVRVUVTVFsic3R5bGUiXSAmJiAhJGZvckZpbGUpCiAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnRzWyJzdHlsZSJdID0gJF9SRVFVRVNUWyJzdHlsZSJdOwogICAgICAgICAgICAvL2lmICgkX1JFUVVFU1RbIm1lbW9yeUxpbWl0Il0gJiYgISRmb3JGaWxlKQogICAgICAgICAgICAvLyAgICAkcmVwbGFjZW1lbnRzWyJtZW1vcnlMaW1pdCJdID0gJF9SRVFVRVNUWyJtZW1vcnlMaW1pdCJdOwoKICAgICAgICAgICAgLy8vLyBmb3IgQ1NSRiBwcm90ZWN0aW9uIHdlIG11c3QgbmV2ZXIgc2F2ZSBzaWQgaW50byBjb29raWVzCiAgICAgICAgICAgIGlmIChkZWZpbmVkKCJTSUQiKSAmJiBTSUQgJiYgJF9TRVJWRVJbIkhUVFBfQ09PS0lFIl0gPT0gIiIgJiYgc2Vzc2lvbl9pZCgpICYmICFpc1NlYXJjaEVuZ2luZSgpICYmICFpc1ZhbGlkYXRvcigpKSAvLyBkbyBub3QgdXNlIHdoZW4gYWNjZXB0aW5nIGNvb2tpZXMgKF9TRVJWRVJbIkhUVFBfQ09PS0lFIl0pCiAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnRzWyJzaWQiXSA9IHNlc3Npb25faWQoKTsKICAgICAgICAKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAvL2R1bXAoUFJPSkVDVFVSTCk7CiAgICAgICAgLy9kdW1wKCRwcm9qZWN0VXJsKTsKICAgICAgICAvL2R1bXAoJGxpbmspOwogICAgICAgICRsaW5rID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvblBhcnNlTGluayIsIGFycmF5KCJsaW5rIiA9PiAkbGluaywgInBlcnNpc3RlbnRQYXJhbWV0ZXJzIj0+JHBlcnNpc3RlbnRQYXJhbWV0ZXJzLCAicmF3Ij0+JHJhdywgInByb2plY3RVcmwiID0+ICRwcm9qZWN0VXJsKSwgImxpbmsiKTsKICAgICAgICAvL2R1bXAoJGxpbmspOwogICAgICAgIAogICAgICAgIHJldHVybigkbGluayk7CiAgICB9CiAgICAgICAgCiAgICBmdW5jdGlvbiBwYXJzZUZpbGVMaW5rcygkaHRtbCwgJHByb2plY3RVcmw9IiIpCiAgICB7CiAgICAgICAgaWYgKCEkcHJvamVjdFVybCkKICAgICAgICAgICAgJHByb2plY3RVcmwgPSBQUk9KRUNUVVJMOwoKICAgICAgICByZXR1cm4ocGFyc2VMaW5rcygkaHRtbCwgZmFsc2UsIHRydWUsICRwcm9qZWN0VXJsKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VGaWxlTGluaygkbGluaywgJHByb2plY3RVcmw9IiIpCiAgICB7CiAgICAgICAgaWYgKCEkcHJvamVjdFVybCkKICAgICAgICAgICAgJHByb2plY3RVcmwgPSBQUk9KRUNUVVJMOwogICAgICAgIAogICAgICAgICRwcm9qZWN0VXJsID0gc3RyX3JlcGxhY2UoImh0dHBzOi8vIiwgImh0dHA6Ly8iLCAkcHJvamVjdFVybCk7CgogICAgICAgIHJldHVybihwYXJzZUxpbmsoJGxpbmssIGZhbHNlLCB0cnVlLCAkcHJvamVjdFVybCkpOwogICAgfQoKICAgIC8vIFRPRE8gLSBvcHRpbWl6ZQogICAgZnVuY3Rpb24gcGFyc2VMaW5rcygkaHRtbCwgJHBlcnNpc3RlbnRQYXJhbWV0ZXJzPXRydWUsICRyYXc9ZmFsc2UsICRwcm9qZWN0VXJsPSIiKQogICAgewogICAgICAgIC8vIGRvIG5vdCBwYXJzZSBsaW5rcyBpbiBhbnkgSFRNTCBpbnB1dCBlbGVtZW50CiAgICAgICAgJHNraXBQYXJzZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKHN0cnBvcygkaHRtbCwgIjx0ZXh0YXJlYSIpICE9PSBGQUxTRSAmJiBwcmVnX21hdGNoX2FsbCgifDx0ZXh0YXJlYVtePl0qPltePF0qPC90ZXh0YXJlYT58aW1zIiwgJGh0bWwsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRtYXRjaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGlkID0gVVVJRCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgICRza2lwUGFyc2VbJGlkXSA9ICRtYXRjaFswXTsKICAgICAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoJG1hdGNoWzBdLCAkaWQsICRodG1sKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RycG9zKCRodG1sLCAiPCIpICE9PSBGQUxTRSkKICAgICAgICAgICAgJGhyZWZzID0gZ2V0SHJlZnMoJGh0bWwpOwogICAgICAgIGVsc2UgaWYgKHN0cnBvcygkaHRtbCwgIi5waHAiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICRocmVmcyA9IGFycmF5KGFycmF5KDAgPT4gJGh0bWwsIDEgPT4gIiIsIDIgPT4gJGh0bWwpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRocmVmcyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2goJGhyZWZzIGFzICRocmVmKQogICAgICAgIHsKICAgICAgICAgICAgLy8kcmVwbGFjZW1lbnQgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uUGFyc2VMaW5rIiwgYXJyYXkoImxpbmsiID0+ICRocmVmWzJdKSwgImxpbmsiKTsKICAgICAgICAgICAgLy9kdW1wKCRocmVmKTsKICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gcGFyc2VMaW5rKCRocmVmWzJdLCAkcGVyc2lzdGVudFBhcmFtZXRlcnMsICRyYXcsICRwcm9qZWN0VXJsKTsKICAgICAgICAgICAgLy8kcmVwbGFjZW1lbnQgPSAiaW5kZXgucGhwIjsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgkaHJlZlswXSwgJGhyZWZbMV0uJHJlcGxhY2VtZW50LiRocmVmWzNdLCAkaHRtbCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvcmVhY2goJHNraXBQYXJzZSBhcyAkaWQgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgkaWQsICR2YWx1ZSwgJGh0bWwpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0KICAgICAgICAKICAgIGZ1bmN0aW9uIHNob3dQaHBFcnJvcigkZXZhbFZhbHVlLCAkZXZhbENvZGUsICYkZXJyb3JNZXNzYWdlPSJub25lIikKICAgIHsKICAgICAgICBpZiAoRkFMU0UgJiYgcHJlZ19tYXRjaF9hbGwoInwoZXZhbFxcKFxcKSdkIGNvZGUgb24gbGluZSApKFswLTldKyl8aSIsICRldmFsVmFsdWUsICRsaW5lTnIsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgICAgICRsaW5lTnIgPSAkbGluZU5yWzBdWzJdOwogICAgICAgICAgICBzZXR0eXBlKCRsaW5lTnIsICJpbnRlZ2VyIik7CgogICAgICAgICAgICAkbGluZXMgPSBleHBsb2RlKCJcbiIsICRldmFsQ29kZSk7CgogICAgICAgICAgICAkZXJyb3IgPSAkZXZhbFZhbHVlOwogICAgICAgICAgICAkZXJyb3IgLj0gIjx0YWJsZSBjbGFzcz0nc291cmNlJz4iOwogICAgICAgICAgICBmb3IgKCRsID0gJGxpbmVOci00IDsgJGwgPCAkbGluZU5yKzUgOyAkbCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJGwgPD0gMCkKICAgICAgICAgICAgICAgICAgICAgICAkbCA9IDE7CiAgICAgICAgICAgICAgICAkbGluZSA9ICRsaW5lc1skbC0xXTsKICAgICAgICAgICAgICAgICRsaW5lID0gY29kZVRvSHRtbCgkbGluZSk7CiAgICAgICAgICAgICAgICAkZXJyb3IgLj0gIjx0cj48dGQgY2xhc3M9JyIuKCRsID09ICRsaW5lTnIgPyAiaGlsaXRlIiA6ICIiKS4iJyBzdHlsZT0nd2lkdGg6MjBweDt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246dG9wOyc+Ii4iTGluZSAiLiRsLiI6ICIuIjwvdGQ+PHRkIGNsYXNzPSciLigkbCA9PSAkbGluZU5yID8gImhpbGl0ZSIgOiAiIikuIicgc3R5bGU9J3ZlcnRpY2FsLWFsaWduOnRvcDsnPiIuJGxpbmUuIjwvdGQ+PC90cj4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlcnJvciAuPSAiPC90YWJsZT4iOwoKICAgICAgICAgICAgLy8kZXJyb3IgLj0gZ2V0RGVidWdDYWxsKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgZ2xvYmFsICRwaHBFcnJvck1lc3NhZ2VzOwogICAgICAgICAgICAgICAgJHBocEVycm9yTWVzc2FnZXNbXSA9ICRldmFsVmFsdWU7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCRlcnJvck1lc3NhZ2UgIT0gIm5vbmUiKQogICAgICAgICAgICAgICAgJGVycm9yTWVzc2FnZSA9ICRlcnJvcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoJGVycm9yLCBtdEVycm9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCRlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAkZXJyb3IgLj0gJGV2YWxWYWx1ZS4kZXJyb3JNZXNzYWdlOwogICAgICAgICAgICAkZXJyb3IgLj0gIjxociAvPiIuJGV2YWxDb2RlOwogICAgICAgICAgICAkZXJyb3IgLj0gIjxociAvPiIuZ2V0RnVuY3Rpb25DYWxsKCk7CgogICAgICAgICAgICBzaG93TWVzc2FnZSgkZXJyb3IsIG10RXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gZXZhbFBocEVycm9yRnVuY3Rpb24oJGVycm9yTGV2ZWwsJGVycm9yTWVzc2FnZSwkZXJyb3JGaWxlLCRlcnJvckxpbmUsJGVycm9yQ29udGV4dCkKICAgIHsKICAgICAgICBpZiAoJGVycm9yTGV2ZWwgIT0gRV9OT1RJQ0UgJiYgJGVycm9yTGV2ZWwgIT0gRV9TVFJJQ1QgJiYgJGVycm9yTGV2ZWwgIT0gRV9ERVBSRUNBVEVEICYmICRlcnJvckxldmVsICE9IEVfV0FSTklORykKICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChJTlNUQUxMID09PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICJldmFsUGhwRXJyb3JGdW5jdGlvbjoiOwogICAgICAgICAgICAgICAgZWNobyAkZXJyb3JMZXZlbDsKICAgICAgICAgICAgICAgIGVjaG8gJGVycm9yTWVzc2FnZTsKICAgICAgICAgICAgICAgIGVjaG8gJGVycm9yRmlsZTsKICAgICAgICAgICAgICAgIGVjaG8gJGVycm9yTGluZTsKICAgICAgICAgICAgICAgIGVjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsb2JhbCAkZXZhbFBocEVycm9yRnVuY3Rpb25NZXNzYWdlLCAkX19lcnJvcl9nZXRfbGFzdDsKICAgICAgICAgICAgCiAgICAgICAgICAgICRfX2Vycm9yX2dldF9sYXN0ID0gYXJyYXkoCiAgICAgICAgICAgICAgICAndHlwZScgICAgICAgID0+ICRlcnJvckxldmVsLAogICAgICAgICAgICAgICAgJ21lc3NhZ2UnICAgICA9PiAkZXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgJ2ZpbGUnICAgICAgICA9PiAkZXJyb3JGaWxlLAogICAgICAgICAgICAgICAgJ2xpbmUnICAgICAgICA9PiAkZXJyb3JMaW5lCiAgICAgICAgICAgICk7ICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgpOwogICAgICAgICAgICBpZiAoJGVycm9yTWVzc2FnZSkKICAgICAgICAgICAgICAgICRldmFsUGhwRXJyb3JGdW5jdGlvbk1lc3NhZ2UgPSAkZXJyb3JNZXNzYWdlLiIgaW4gIi4kZXJyb3JGaWxlLiIgb24gbGluZSAiLiRlcnJvckxpbmU7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGV2YWxQaHBGYXRhbEVycm9yRnVuY3Rpb24oKQogICAgewogICAgICAgIGdsb2JhbCAkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZTsKICAgICAgICAvL2dsb2JhbCAkZXZhbFBocEZhdGFsRXJyb3JGdW5jdGlvbkNhbGw7CiAgICAgICAgCiAgICAgICAgLy8kZnVuY3Rpb25DYWxsID0gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgLy9lY2hvICJYIGV2YWxQaHBGYXRhbEVycm9yRnVuY3Rpb24gWFhYWFgiOwogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoImVycm9yX2dldF9sYXN0IikpCiAgICAgICAgICAgICRlcnJvciA9IEBlcnJvcl9nZXRfbGFzdCgpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGVycm9yID0gTlVMTDsKICAgICAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkZXJyb3IpOwogICAgICAgIC8vZWNobyAiWCAiLiRlcnJvclsndHlwZSddOwogICAgICAgIC8vZWNobyAkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZTsKCiAgICAgICAgaWYgKCRlcnJvclsndHlwZSddICYmICgkZXJyb3JbJ3R5cGUnXSA9PSBFX0VSUk9SIHx8ICRlcnJvclsndHlwZSddID09IEVfQ09SRV9FUlJPUiB8fCAkZXJyb3JbJ3R5cGUnXSA9PSBFX0NPTVBJTEVfRVJST1IgfHwgJGVycm9yWyd0eXBlJ10gPT0gRV9SRUNPVkVSQUJMRV9FUlJPUiB8fCAkZXJyb3JbJ3R5cGUnXSA9PSBFX1BBUlNFKSkgLy8gb3IgaXQgZ2V0cyBjYWxsZWQgZXZlcnl0aW1lIG9uIG5vdGljZS4uLgogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvICJBQUFBIjsKICAgICAgICAgICAgLy9lY2hvICJldmFsUGhwRmF0YWxFcnJvckZ1bmN0aW9uOiI7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGVycm9yWyd0eXBlJ10pOwogICAgICAgICAgICAvL2VjaG8gIlhYWFgiOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3Zhcl9kdW1wKCRlcnJvcik7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgaWYgKCRldmFsUGhwRmF0YWxFcnJvckV2YWxDb2RlICYmIG9iamVjdEV4aXN0cygiTWFpblByb2Nlc3MiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKCRlcnJvclsibWVzc2FnZSJdLiI8aHIgLz4iLnN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCRldmFsUGhwRmF0YWxFcnJvckV2YWxDb2RlICYmIGlzRGV2ZWxvcGVyKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVjaG8gIjxociAvPiI7CiAgICAgICAgICAgICAgICBlY2hvICJldmFsUGhwRmF0YWxFcnJvckZ1bmN0aW9uKCk6IDxiciAvPiI7CiAgICAgICAgICAgICAgICBlY2hvIHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZSk7CiAgICAgICAgICAgICAgICBlY2hvICI8aHIgLz4iOwogICAgICAgICAgICAgICAgZ2xvYmFsICRfX2V2YWxGdW5jdGlvbkNhbGw7CiAgICAgICAgICAgICAgICBlY2hvICRfX2V2YWxGdW5jdGlvbkNhbGw7CiAgICAgICAgICAgICAgICAvL2VjaG8gJGZ1bmN0aW9uQ2FsbDsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZ2V0RnVuY3Rpb25DYWxsKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldEV2YWxDb2RlR2xvYmFscygkY29kZSkKICAgIHsKICAgICAgICAkZ2xvYmFscyA9IGFycmF5KCk7CiAgICAgICAgaWYgKHN0cnBvcygkY29kZSwgIiNOT19HTE9CQUxTIikgPT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgJHN5c3RlbVZhcmlhYmxlcyA9IGFycmF5KCJcJF9HRVQiLCAiXCRfUE9TVCIsICJcJF9SRVFVRVNUIiwgIlwkX0ZJTEVTIiwgIlwkX1NFU1NJT04iLCAiXCRfQ09PS0lFIiwgIlwkX1NFUlZFUiIsICJcJF9HTE9CQUxTIik7CgogICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgiL1skXCRdW1x3XSsvIiwgJGNvZGUsICR2YXJpYWJsZXMpOwogICAgICAgICAgICBmb3JlYWNoKCR2YXJpYWJsZXMgYXMgJHZhcmlhYmxlQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhcmlhYmxlQXJyYXkgYXMgJHZhcmlhYmxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghc3Ryc3RyKCJcJHRoaXMiLCBzdHJ0b2xvd2VyKCR2YXJpYWJsZSkpICYmICFpbl9hcnJheSgkdmFyaWFibGUsICRzeXN0ZW1WYXJpYWJsZXMpKSAvLyBza2lwIGlubmVyIGNsYXNzIGFuZCBzeXN0ZW0gdmFyaWFibGVzCiAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzW10gPSAiZ2xvYmFsICIuJHZhcmlhYmxlLiI7IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZ2xvYmFscyA9IGFycmF5X3VuaXF1ZSgkZ2xvYmFscyk7CiAgICAgICAgfQogICAgICAgIGlmICgkZ2xvYmFscykKICAgICAgICAgICAgJGV2YWxDb2RlID0gaW1wbG9kZSgiICIsICRnbG9iYWxzKS4iXG4iLiRjb2RlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGV2YWxDb2RlID0gJGNvZGU7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybigkZXZhbENvZGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9ldmFsKCRjb2RlKQogICAgewogICAgICAgICRldmFsQ29kZSA9IGdldEV2YWxDb2RlR2xvYmFscygkY29kZSk7CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAkZ2xvYmFscyA9IGFycmF5KCk7CiAgICAgICAgaWYgKHN0cnBvcygkY29kZSwgIiNOT19HTE9CQUxTIikgPT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgJHN5c3RlbVZhcmlhYmxlcyA9IGFycmF5KCJcJF9HRVQiLCAiXCRfUE9TVCIsICJcJF9SRVFVRVNUIiwgIlwkX0ZJTEVTIiwgIlwkX1NFU1NJT04iLCAiXCRfQ09PS0lFIiwgIlwkX1NFUlZFUiIsICJcJF9HTE9CQUxTIik7CgogICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgiL1skXCRdW1x3XSsvIiwgJGNvZGUsICR2YXJpYWJsZXMpOwogICAgICAgICAgICBmb3JlYWNoKCR2YXJpYWJsZXMgYXMgJHZhcmlhYmxlQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhcmlhYmxlQXJyYXkgYXMgJHZhcmlhYmxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghc3Ryc3RyKCJcJHRoaXMiLCBzdHJ0b2xvd2VyKCR2YXJpYWJsZSkpICYmICFpbl9hcnJheSgkdmFyaWFibGUsICRzeXN0ZW1WYXJpYWJsZXMpKSAvLyBza2lwIGlubmVyIGNsYXNzIGFuZCBzeXN0ZW0gdmFyaWFibGVzCiAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzW10gPSAiZ2xvYmFsICIuJHZhcmlhYmxlLiI7IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZ2xvYmFscyA9IGFycmF5X3VuaXF1ZSgkZ2xvYmFscyk7CiAgICAgICAgfQogICAgICAgIGlmICgkZ2xvYmFscykKICAgICAgICAgICAgJGV2YWxDb2RlID0gImdsb2JhbCBcJGFiY2Q7ICIuaW1wbG9kZSgiICIsICRnbG9iYWxzKS4iXG4iLiRjb2RlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGV2YWxDb2RlID0gJGNvZGU7CiAgICAgICAgICAgIAogICAgICAgICovCiAgICAgICAgCiAgICAgICAgLy9kdW1wKCRldmFsQ29kZSk7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICAkcmV0ID0gX19ldmFsKCRldmFsQ29kZSk7CiAgICAgICAgICAgIC8vZHVtcCgkcmV0KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goRXhjZXB0aW9uICRlKQogICAgICAgIHsKICAgICAgICAgICAgJGVycm9ycyAuPSAkZTsKICAgICAgICB9CgogICAgICAgIGlmICgkZXJyb3JzKQogICAgICAgIHsKICAgICAgICAgICAgc2hvd01lc3NhZ2UoIl9ldmFsKCk6ICIuJGVycm9ycy4iXG4iLiRldmFsQ29kZSwgbXRFcnJvcik7CiAgICAgICAgICAgIC8vcmV0dXJuKE5VTEwpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGlldmFsKCRjb2RlLCAkc2ltcGxlPXRydWUpCiAgICB7CiAgICAgICAgaWYgKCEkc2ltcGxlIHx8IEdFVF9DQUxMRURfQ0xBU1NfTUlTU0lORykKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkX19ldmFsRnVuY3Rpb25DYWxsOwogICAgICAgICAgICAkX19ldmFsRnVuY3Rpb25DYWxsID0gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICRfX2V2YWxDb2RlczsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkX19ldmFsQ29kZXMpKQogICAgICAgICAgICAgICAgJF9fZXZhbENvZGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgJF9fZXZhbENvZGVzW10gPSAkY29kZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9kdW1wKGlzRGlzYWJsZWRGdW5jdGlvbigiZXZhbCIpKTsKICAgICAgICBpZiAoIWlzRGlzYWJsZWRGdW5jdGlvbigiZXZhbCIpKQogICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHN0cnBvcygkY29kZSwgInNob3BDdXJyZW5jaWVzIikgIT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICI8YnI+ISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITxicj4iOwogICAgICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAvL2VjaG8gIjEiO2V4aXQ7CiAgICAgICAgICAgIC8vaWYgKHN0cnBvcygkY29kZSwgImdldFZhbHVlIikgIT09IEZBTFNFKQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgLy8gICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgLy8gICAgZWNobyAkY29kZS4iPGhyPiI7CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAvLyRmID0gZm9wZW4oUFJPSkVDVFBBVEguIm91dDUudHh0IiwgImErIik7CiAgICAgICAgICAgIC8vX2ZpbGVfYXBwZW5kX2NvbnRlbnRzKFBST0pFQ1RQQVRILiJvdXQ0LnR4dCIsICRjb2RlLiJcclxuLS0tLS0tXHJcbiIpOwogICAgICAgICAgICAvL2Z3cml0ZSgkZiwgJGNvZGUuIlxyXG4tLS0tLS1cclxuIik7CiAgICAgICAgICAgIC8vZmNsb3NlKCRmKTsKICAgICAgICAgICAgLy9kdW1wKCRjb2RlKTsKICAgICAgICAgICAgLy9lY2hvICI8aHI+IjsKICAgICAgICAgICAgLy9lY2hvICRjb2RlOwogICAgICAgICAgICB0cnkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vaWYgKHN0cnBvcygkY29kZSwgIkFBQSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIC8vICAgIF9sb2coJGNvZGUsICJBQkNERUYiKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkY29kZSk7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0RXhpc3RzKCJTZXR0aW5ncyIpICYmIGdldE9iamVjdCgiU2V0dGluZ3MiKS0+Z2VidWdMb2dFdmFsQ29kZSkKICAgICAgICAgICAgICAgICAgICBfbG9nKCRjb2RlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHJldCA9IGV2YWwoJGNvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgJHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJpZXZhbCgiLiRjb2RlLiIpOiAiLiR0LCBtdEVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gJGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJpZXZhbCgpOiAiLiRlLiI8aHI+Ii4kY29kZSwgbXRFcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25fZXhpc3RzKCJjcmVhdGVfZnVuY3Rpb24iKSAmJiAhaXNEaXNhYmxlZEZ1bmN0aW9uKCJjcmVhdGVfZnVuY3Rpb24iKSkKICAgICAgICB7CiAgICAgICAgICAgICRldmFsID0gY3JlYXRlX2Z1bmN0aW9uKCIiLCAiJGNvZGUiKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkY29kZSk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGV2YWwpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIGlmICgkZXZhbCkKICAgICAgICAgICAgICAgICRyZXQgPSAkZXZhbCgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiaWV2YWwoKSAtIHN5bnRheCBlcnJvcjogIi4kY29kZSwgbXRFcnJvcik7CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgZWxzZSBpZiAoZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICBhc3NlcnRfb3B0aW9ucyhBU1NFUlRfQUNUSVZFLCAxKTsgICAKICAgICAgICAgICAgYXNzZXJ0X29wdGlvbnMoQVNTRVJUX1FVSUVUX0VWQUwsIDEpOwogICAgICAgICAgICAkcmV0ID0gYXNzZXJ0KCIkY29kZSIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkdG1wPXRlbXBuYW0oIi90bXAiLCAiRVZBTCIpLCAiJGNvZGUiKTsKICAgICAgICAgICAgJHJldCA9IGluY2x1ZGUoJHRtcCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vaWYgKCEkc2ltcGxlIHx8IEdFVF9DQUxMRURfQ0xBU1NfTUlTU0lORykKICAgICAgICAvLyAgICBhcnJheV9wb3AoJF9fZXZhbENvZGVzKTsKICAgICAgICBpZiAoZmFsc2UpCiAgICAgICAgICAgIGFycmF5X3BvcCgkX19ldmFsQ29kZXMpOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIF9fZXZhbCgkY29kZSwgJHNpbXBsZT10cnVlKQogICAgewogICAgICAgIGlmICghJHNpbXBsZSkKICAgICAgICB7CiAgICAgICAgICAgIHNldF9lcnJvcl9oYW5kbGVyKCJldmFsUGhwRXJyb3JGdW5jdGlvbiIpOyAKICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oJ2V2YWxQaHBGYXRhbEVycm9yRnVuY3Rpb24nKTsKICAgICAgICAgICAgZ2xvYmFsICRldmFsUGhwRmF0YWxFcnJvckV2YWxDb2RlLCAkZXZhbFBocEVycm9yRnVuY3Rpb25NZXNzYWdlOwogICAgICAgICAgICAkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZSA9ICRjb2RlOwogICAgICAgICAgICAkZXZhbFBocEVycm9yRnVuY3Rpb25NZXNzYWdlID0gIiI7CiAgICAgICAgfQoKICAgICAgICAvL3Zhcl9kdW1wKCRjb2RlKTsKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICRldmFsVmFsdWUgPSBpZXZhbCgkY29kZSwgJHNpbXBsZSk7ICAgICAgLy8gdXNpbmcgcmV0dXJuKCkKICAgICAgICBpZiAoaXNfYXJyYXkoJGV2YWxWYWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICAvLyBkb24ndCBtb2RpZnkgZXZhbFZhbHVlCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICR2YWwgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICAgICAgJHZhbCA9IHN0cl9yZXBsYWNlKEJPTSwgIiIsICR2YWwpOwogICAgICAgICAgICBpZiAoJHZhbCAhPSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGV2YWxWYWx1ZSAuPSAkdmFsOyAgIC8vIHVzaW5nIGVjaG8gIiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvYl9lbmRfY2xlYW4oKTsKCiAgICAgICAgaWYgKCEkc2ltcGxlKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdG9yZV9lcnJvcl9oYW5kbGVyKE5VTEwpOyAKICAgICAgICAgICAgaWYgKCRldmFsUGhwRXJyb3JGdW5jdGlvbk1lc3NhZ2UgfHwgKCRldmFsVmFsdWUgJiYgaXNfc3RyaW5nKCRldmFsVmFsdWUpICYmIHN0cnBvcygkZXZhbFZhbHVlLCAiZXZhbCgpJ2QgY29kZSIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJGV2YWxWYWx1ZSwgIldhcm5pbmc6IikgPT09IEZBTFNFKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyX2R1bXAoJGV2YWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB2YXJfZHVtcCgkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgc2hvd1BocEVycm9yKCRldmFsVmFsdWUsICRldmFsUGhwRmF0YWxFcnJvckV2YWxDb2RlLCAkZXZhbFBocEVycm9yRnVuY3Rpb25NZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJGV2YWxQaHBGYXRhbEVycm9yRXZhbENvZGUgPSAiIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRldmFsVmFsdWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBldmFsUGhwKCRldmFsQ29kZSwgJFRhYmxlPU5VTEwsICYkZXJyb3JNZXNzYWdlPU5VTEwsICRjb252ZXJ0QXJyYXk9dHJ1ZSkKICAgIHsKICAgICAgICAvL2VjaG8gJGV2YWxDb2RlLiI8aHI+IjsKICAgICAgICAKICAgICAgICAkZG9TaG93RXJyb3IgPSAoZnVuY19udW1fYXJncygpIDwgMyB8fCAkZXJyb3JNZXNzYWdlID09PSBOVUxMKTsKICAgICAgICAKICAgICAgICBpZiAodHJpbSgkZXZhbENvZGUpID09ICIiKQogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvICJlbXB0eSBldmFsISEhIjsKICAgICAgICAgICAgcmV0dXJuOy8vZXhpdDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8kZXZhbENvZGUgPSBwYXJzZUluY2x1ZGVTY3JpcHQoJGV2YWxDb2RlKTsKCiAgICAgICAgLy8kZXZhbENvZGUgPSB1cmxkZWNvZGUoJGV2YWxDb2RlKTsKICAgICAgICAvLyAhISEhIENBTk5PVCBVU0UgdXJsZGVjb2RlIChyZW1vdmVzICsgb3BlcmF0b3IpCgogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgnfCNpbmNsdWRlKC4qPykiKC4qPykifGknLCAkZXZhbENvZGUsICRjbXNFbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkY21zRWxlbWVudHMgYXMgJGNtc0VsZW1lbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpbmNsdWRlTmFtZSA9ICRjbXNFbGVtZW50WzJdOwogICAgICAgICAgICAgICAgJFNjcmlwdCA9IGdldE9iamVjdCgiU2NyaXB0cyIpLT5nZXRTY3JpcHQoJGluY2x1ZGVOYW1lKTsKICAgICAgICAgICAgICAgIGlmICgkU2NyaXB0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlQ29kZSA9ICRTY3JpcHQtPmdldENvZGUoKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCIvWyRcJF1bXHddKy8iLCAkaW5jbHVkZUNvZGUsICR2YXJpYWJsZXMpOwogICAgICAgICAgICAgICAgICAgICRnbG9iYWxzID0gIiI7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGVzIGFzICR2YXJpYWJsZUFycmF5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGVBcnJheSBhcyAkdmFyaWFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3Ryc3RyKCJcJHRoaXMiLCBzdHJ0b2xvd2VyKCR2YXJpYWJsZSkpKSAvLyBza2lwIGlubmVyIGNsYXNzIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzIC49ICJnbG9iYWwgIi4kdmFyaWFibGUuIjsgIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlQ29kZSA9IHN0cl9yZXBsYWNlKCImcXVvdDsiLCAiXCIiLCAkaW5jbHVkZUNvZGUpOwogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlQ29kZSA9IHN0cl9yZXBsYWNlKCImbHQ7IiwgIjwiLCAkaW5jbHVkZUNvZGUpOwogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlQ29kZSA9IHN0cl9yZXBsYWNlKCImZ3Q7IiwgIj4iLCAkaW5jbHVkZUNvZGUpOwogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlQ29kZSA9IHN0cl9yZXBsYWNlKCImYW1wOyIsICImIiwgJGluY2x1ZGVDb2RlKTsKICAgICAgICAgICAgICAgICAgICAkaW5jbHVkZUNvZGUgPSBzdHJfcmVwbGFjZSgiJiMzOTsiLCAiJyIsICRpbmNsdWRlQ29kZSk7CgogICAgICAgICAgICAgICAgICAgIC8vJGluY2x1ZGVFdmFsQ29kZSA9ICRnbG9iYWxzLiJcbiIuJGluY2x1ZGVDb2RlOwoKICAgICAgICAgICAgICAgICAgICAkaW5jbHVkZUV2YWxDb2RlID0gZ2V0RXZhbENvZGVHbG9iYWxzKCRpbmNsdWRlQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoJGNtc0VsZW1lbnRbMF0sICRpbmNsdWRlRXZhbENvZGUsICRldmFsQ29kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIiNpbmNsdWRlIFwiIi4kaW5jbHVkZU5hbWUuIlwiOiBTY3JpcHQgJyIuJGluY2x1ZGVOYW1lLiInIG5vdCBmb3VuZCIsIG10RXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgfSAgICAKICAgICAgICAKICAgICAgICAvL2dsb2JhbCAkZGVidWc7CiAgICAgICAgLy9pZiAoc3RycG9zKCRkZWJ1ZywgIlNjcmlwdCIpICE9PSBGQUxTRSkKICAgICAgICAvL3sKICAgICAgICAvLyAgICAkZGVidWdFdmFsQ29kZSA9ICRldmFsQ29kZTsKICAgICAgICAvLyAgICAkZGVidWdFdmFsQ29kZSA9IHN0cl9yZXBsYWNlKCIgIiwgIiZuYnNwOyIsICRkZWJ1Z0V2YWxDb2RlKTsKICAgICAgICAvLyAgICAkZGVidWdFdmFsQ29kZSA9IHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkZGVidWdFdmFsQ29kZSk7CiAgICAgICAgLy8gICAgc2hvd01lc3NhZ2UoImV2YWxQaHA6ICIuJGRlYnVnRXZhbENvZGUsIG10RGVidWcpOwogICAgICAgIC8vfQoKICAgICAgICBpZiAoJFRhYmxlICE9IE5VTEwpCiAgICAgICAgICAgICRldmFsQ29kZSA9IHN0cl9yZXBsYWNlKCJcJHRoaXMiLCAiZ2V0T2JqZWN0KFwiVGFibGVzXCIpLT5nZXRUYWJsZShcIiIuJFRhYmxlLT5uYW1lLiJcIikiLCAkZXZhbENvZGUpOwoKICAgICAgICAvLyRldmFsQ29kZSA9IHN0cl9yZXBsYWNlKCImZ3Q7IiwgIj4iLCAkZXZhbENvZGUpOwogICAgICAgICAgIC8vJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoIiZsdDsiLCAiPCIsICRldmFsQ29kZSk7CiAgICAgICAgICAgLy8kZXZhbENvZGUgPSBzdHJfcmVwbGFjZSgiJmFtcDsiLCAiJiIsICRldmFsQ29kZSk7CiAgICAgICAgICAgCiAgICAgICAgICAgJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoIiYjMzk7IiwgIiciLCAkZXZhbENvZGUpOwogICAgICAgICAgIC8vJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoIiZxdW90OyIsICJcIiIsICRldmFsQ29kZSk7CiAgICAgICAgICAgJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoImBgIiwgIlwiIiwgJGV2YWxDb2RlKTsKICAgICAgICAKICAgICAgICAgICAvLyRldmFsQ29kZSA9IGh0bWxfZW50aXR5X2RlY29kZSgkZXZhbENvZGUpOwogICAgICAgICAgIAogICAgICAgICAgIC8vZHVtcCgkZXZhbENvZGUpOwogICAgICAgIC8vaWYgKHN0cnBvcygkZXZhbENvZGUsICJnZXRVc2VycygpIikgIT09IEZBTFNFKQogICAgICAgIC8vICAgIGVjaG8gJGV2YWxDb2RlLiI8YnIgLz4iOwogICAgICAgIC8vZHVtcCgkZXZhbENvZGUpOwogICAgICAgIC8vaWYgKGlzRGVidWdJUCgpKQogICAgICAgIC8vICAgIGVjaG8gJGV2YWxDb2RlLiI8aHIgLz4iOwogICAgICAgIC8vZWNobyAiMSI7CiAgICAgICAgLy9leGl0OwogICAgICAgIC8vZHVtcCgkZXZhbENvZGUpOwogICAgICAgIC8vZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAvL2VjaG8gJGV2YWxDb2RlOwogICAgICAgIC8vb2Jfc3RhcnQoKTsKICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCRldmFsQ29kZSkpOwogICAgICAgIC8vZWNobyAkZXZhbENvZGU7CiAgICAgICAgCiAgICAgICAgLy9pZiAoaXNEZXZlbG9wZXIoKSkKICAgICAgICAvLyAgICAkZXZhbENvZGUgLj0gIiEiOwogICAgICAgIAogICAgICAgIC8vc2V0X2Vycm9yX2hhbmRsZXIoImV2YWxQaHBFcnJvckZ1bmN0aW9uIik7IAogICAgICAgIC8vcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oJ2V2YWxQaHBGYXRhbEVycm9yRnVuY3Rpb24nKTsKICAgICAgICAvL2dsb2JhbCAkZXZhbFBocEZhdGFsRXJyb3JFdmFsQ29kZTsKICAgICAgICAvLyRldmFsUGhwRmF0YWxFcnJvckV2YWxDb2RlID0gJGV2YWxDb2RlOwogICAgICAgIAogICAgICAgIC8vZ2xvYmFsICRldmFsUGhwRXJyb3JGdW5jdGlvbk1lc3NhZ2U7CiAgICAgICAgLy8kZXZhbFBocEVycm9yRnVuY3Rpb25NZXNzYWdlID0gIiI7CiAgICAgICAgJGV2YWxWYWx1ZSA9IF9fZXZhbCgkZXZhbENvZGUpOyAgICAgIC8vIHVzaW5nIHJldHVybigpCiAgICAgICAgLy9yZXN0b3JlX2Vycm9yX2hhbmRsZXIoTlVMTCk7IAogICAgICAgIC8vJGV2YWxQaHBGYXRhbEVycm9yRXZhbENvZGUgPSAiIjsKICAgICAgICAvL3JlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKE5VTEwpOwogICAgICAgIAogICAgICAgIC8vZWNobyAkZXZhbFZhbHVlOwogICAgICAgIC8vZXhpdDsKICAgICAgICBpZiAoaXNfYXJyYXkoJGV2YWxWYWx1ZSkgJiYgJGNvbnZlcnRBcnJheSkKICAgICAgICB7CiAgICAgICAgICAgICRldmFsVmFsdWUgPSBUSlNPTjo6ZW5jb2RlKCRldmFsVmFsdWUpOwogICAgICAgICAgICAvLyRkYmdWYWx1ZSA9ICRldmFsVmFsdWU7CiAgICAgICAgICAgIC8vJGV2YWxWYWx1ZSA9ICJhcnJheSgxPT4naGFsbG8nKSI7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgZWxzZSBpZiAoaXNfYXJyYXkoJGV2YWxWYWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICAvLyBkb24ndCBtb2RpZnkgZXZhbFZhbHVlCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICR2YWwgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICAgICAgaWYgKCR2YWwgIT0gIiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRldmFsVmFsdWUgLj0gJHZhbDsgICAvLyB1c2luZyBlY2hvICIiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICAvL29iX2VuZF9jbGVhbigpOwogICAgICAgIAogICAgICAgIC8vZWNobyAiMSI7CiAgICAgICAgLy9leGl0OwogICAgICAgIAogICAgICAgIGlmICgkZGJnVmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAvL2VjaG8gIlsiLiRkYmdWYWx1ZS4iXSI7CiAgICAgICAgICAgIC8vZWNobyBldmFsKCJyZXR1cm4oIi4kZGJnVmFsdWUuIik7Iik7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICB9CiAgICAgICAgLy92YXJfZHVtcCgkZG9TaG93RXJyb3IpOwogICAgICAgIC8vaWYgKHN0cmlwb3MoJGV2YWxWYWx1ZSwgImVycm9yIikgIT09IEZBTFNFKQogICAgICAgIC8vICAgIGR1bXAoJGV2YWxDb2RlLiRldmFsVmFsdWUpOwogICAgICAgIC8qaWYgKHN0cnBvcygkdmFsLCAiZXZhbCgpJ2QgY29kZSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJldmFsUGhwKCk6ICIuJHZhbC4iOiA8aHIgLz4iLnN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCBodG1sZW50aXRpZXMoJGV2YWxDb2RlKSksIG10RXJyb3IpOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIGlmIChGQUxTRSAmJiAkZXZhbFBocEVycm9yRnVuY3Rpb25NZXNzYWdlICYmICRkb1Nob3dFcnJvciAvKmZhbHNlICYmIHN0cnBvcygkZXZhbFZhbHVlLCJldmFsKCknZCBjb2RlIikgIT09IEZBTFNFLyogJiYgJGRvU2hvd0Vycm9yKi8pCiAgICAgICAgewogICAgICAgICAgICAvL2VjaG8gJGV2YWxDb2RlOwogICAgICAgICAgICAvL2VjaG8gIjxocj4iOwogICAgICAgICAgICAvL2VjaG8gJGV2YWxWYWx1ZTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZXZhbENvZGUpOwogICAgICAgICAgICAvL2VjaG8gIjxocj4iOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGV2YWxDb2RlKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAvL2R1bXAoJGVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGV2YWxQaHBFcnJvckZ1bmN0aW9uTWVzc2FnZSk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHNob3dQaHBFcnJvcigiZXZhbFBocCgpOiAiLiRldmFsVmFsdWUsICRldmFsQ29kZSwgJGV2YWxQaHBFcnJvckZ1bmN0aW9uTWVzc2FnZSk7CiAgICAgICAgICAgIC8vc2hvd1BocEVycm9yKCRldmFsVmFsdWUsICRldmFsQ29kZSwgJGVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgIC8vZWNobyAiMSI7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGV2YWxDb2RlKTsKICAgICAgICAgICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIC8vZWNobyAkZXJyb3JNZXNzYWdlOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2VjaG8gIiI7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyRldmFsVmFsdWUgPSAiIjsKICAgICAgICB9CiAgICAgICAgLy9lY2hvICRldmFsQ29kZTsKCiAgICAgICAgcmV0dXJuKCRldmFsVmFsdWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBldmFsQ29uZGl0aW9uKCRjb25kaXRpb24sICYkZXJyb3JNZXNzYWdlPSJub25lIikKICAgIHsKICAgICAgICBpZiAoaXNfYm9vbCgkY29uZGl0aW9uKSkKICAgICAgICAgICAgcmV0dXJuKCRjb25kaXRpb24pOwogICAgICAgIAogICAgICAgIGlmICh0cmltKCRjb25kaXRpb24pID09ICIiKQogICAgICAgIHsKICAgICAgICAgICAgLy8gTkVaQVBJTkFUIFRPVE8gSExBU0VOSSAtIG11emUgc2UgcGFrIG9iamV2aXQgdiBTUUwgRE9UQVpFQ0gKICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgiWEhUTUwgY29uZGl0aW9uIGlzIGVtcHR5LiBFdmFsdWF0aW5nIHRvIHRydWUuIiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgLy9lY2hvICJlbXB0eSBldmFsISEhIjsKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZ2xvYmFsICRyZWNvcmRWYWx1ZXM7CiAgICAgICAgLy9kdW1wKCIhISEiKTsKICAgICAgICAvL2R1bXAoJHJlY29yZFZhbHVlcyk7CiAgICAgICAgLy9kdW1wKCRjb25kaXRpb24pOwogICAgICAgICRjb25kaXRpb24gPSBwYXJzZVBocCgkY29uZGl0aW9uKTsKICAgICAgICAvL2R1bXAoJGNvbmRpdGlvbik7CgogICAgICAgIGlmICgkY29uZGl0aW9uID09ICIiKQogICAgICAgICAgICAkY29uZGl0aW9uID0gInRydWUiOwogICAgICAgIAogICAgICAgICRjb25kaXRpb24gPSB0cmltKCRjb25kaXRpb24pOwogICAgICAgICRjb25kaXRpb25TdHIgPSAkY29uZGl0aW9uOwogICAgICAgIAogICAgICAgIGdsb2JhbCAkbWFpbkNvbnRlbnRSZWNvcmRzLCAkdGFibGVOYW1lOyAKICAgICAgICBpZiAoc3RycG9zKCRjb25kaXRpb24sICJcJG1haW5Db250ZW50UmVjb3JkcyIpICE9PSBGQUxTRSAmJiAhJG1haW5Db250ZW50UmVjb3JkcyAmJiAhZ2V0VGFibGUoJHRhYmxlTmFtZSktPnZpcnR1YWwpCiAgICAgICAgewogICAgICAgICAgICAkbWFpbkNvbnRlbnRSZWNvcmRzID0gZ2V0VGFibGUoJHRhYmxlTmFtZSktPmdldENvbnRlbnRSZWNvcmRzKCRfUkVRVUVTVCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIC8vZHVtcCgkY29uZGl0aW9uU3RyKTsKICAgICAgICAvLyRjb25kaXRpb25TdHIgPSBzdHJfcmVwbGFjZSgiJnF1b3Q7IiwgIlwiIiwgJGNvbmRpdGlvblN0cik7CiAgICAgICAgLy8kY29uZGl0aW9uU3RyID0gc3RyX3JlcGxhY2UoIiZndDsiLCAiPiIsICRjb25kaXRpb25TdHIpOwogICAgICAgIC8vJGNvbmRpdGlvblN0ciA9IHN0cl9yZXBsYWNlKCImYW1wOyIsICImIiwgJGNvbmRpdGlvblN0cik7CiAgICAgICAgCgogICAgICAgIC8vIGZpcnN0IGZpbmQgYWxsIHZhcmlhYmxlcyBhbmQgZG8gdGhlbSBnbG9iYWwKICAgICAgICBnbG9iYWwgJF9fZXZhbENvbmRpdGlvbkdsb2JhbHM7CiAgICAgICAgaWYgKCFpc19hcnJheSgkX19ldmFsQ29uZGl0aW9uR2xvYmFscykpCiAgICAgICAgICAgICRfX2V2YWxDb25kaXRpb25HbG9iYWxzID0gYXJyYXkoKTsKICAgICAgICAgICAgCiAgICAgICAgJGV2YWxDb2RlID0gJGNvbmRpdGlvblN0cjsKICAgICAgICBmb3JlYWNoKCRfX2V2YWxDb25kaXRpb25HbG9iYWxzIGFzICR2YXJpYWJsZSA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAkZXZhbENvZGUgPSBzdHJfcmVwbGFjZSgiXCQiLiR2YXJpYWJsZSwgIlwkX19ldmFsQ29uZGl0aW9uR2xvYmFsc1tcIiIuJHZhcmlhYmxlLiJcIl0iLCAkZXZhbENvZGUpOwogICAgICAgIH0KICAgICAgICAvL2R1bXAoJGV2YWxDb2RlKTsKICAgICAgICAvL2R1bXAoJF9fZXZhbENvbmRpdGlvbkdsb2JhbHMpOwoKICAgICAgICBwcmVnX21hdGNoX2FsbCgiL1skXCRdW1x3XSsvIiwgJGV2YWxDb2RlLCAkdmFyaWFibGVzKTsKICAgICAgICAkZ2xvYmFscyA9ICIiOwogICAgICAgICRnbG9iYWxzIC49ICJnbG9iYWwgXCRfX2V2YWxDb25kaXRpb25HbG9iYWxzOyAiOwogICAgICAgIGZvcmVhY2goJHZhcmlhYmxlcyBhcyAkdmFyaWFibGVBcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJHZhcmlhYmxlQXJyYXkgYXMgJHZhcmlhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cnN0cigiXCR0aGlzIiwgc3RydG9sb3dlcigkdmFyaWFibGUpKSAmJiAhaW5fYXJyYXkoJHZhcmlhYmxlLCBhcnJheV9rZXlzKCRfX2V2YWxDb25kaXRpb25HbG9iYWxzKSkgJiYgIXN0cnN0cigiXCRfX2V2YWxDb25kaXRpb25HbG9iYWxzIiwgJHZhcmlhYmxlKSkgLy8gc2tpcCBpbm5lciBjbGFzcyB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAkZ2xvYmFscyAuPSAiZ2xvYmFsICIuJHZhcmlhYmxlLiI7ICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9kdW1wKCRldmFsQ29kZSk7CiAgICAgICAgLy9kdW1wKCRfX2V2YWxDb25kaXRpb25HbG9iYWxzKTsKICAgICAgICBpZiAocHJlZ19tYXRjaCgifHJldHVybiAqXFwofGkiLCAkZXZhbENvZGUpIHx8IHN0cnBvcygkZXZhbENvZGUsICJkdW1wKCIpICE9PSBGQUxTRSAvKiBwcm8gxaF1bGlueSwgamFrbyBqc2VtIG/FvnJhdMOpIGrDoSA7KSAqLykKICAgICAgICAgICAgJGV2YWxDb2RlID0gJGdsb2JhbHMuIiAiLiRldmFsQ29kZS4iOyI7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkZXZhbENvZGUgPSAkZ2xvYmFscy4iIHJldHVybiAodHJ1ZSAmJiAoIi4kZXZhbENvZGUuIikpOyI7CgogICAgICAgIC8vZHVtcCgkZXZhbENvZGUpOwogICAgICAgIC8vZHVtcCgkX19ldmFsQ29uZGl0aW9uR2xvYmFsc1sicmVjb3JkVmFsdWVzIl0pOwogICAgICAgIC8vb2Jfc3RhcnQoKTsKICAgICAgICAgICAgCiAgICAgICAgJGV2YWxWYWx1ZSA9IF9fZXZhbCgkZXZhbENvZGUpOwogICAgICAgIGlmIChGQUxTRSAmJiBzdHJwb3MoJGV2YWxDb2RlLCAidmFyX2R1bXAoIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyAkZXZhbENvZGU7CiAgICAgICAgICAgIGVjaG8gJGV2YWxWYWx1ZTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgLy9pZiAoc3RycG9zKCRldmFsQ29kZSwgImRhdGVTdGFydCIpICE9PSBGQUxTRSkKICAgICAgICAvL3sKICAgICAgICAvLyAgICBlY2hvICRldmFsQ29kZTsKICAgICAgICAvLyAgICBleGl0OwogICAgICAgIC8vfQogICAgICAgIAogICAgICAgIGlmIChpc19hcnJheSgkZXZhbFZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgICRldmFsVmFsdWUgPSBhcnJheV90b19waHAoJGV2YWxWYWx1ZSwgIiMjIik7CiAgICAgICAgfQogICAgICAgIC8vZWxzZQogICAgICAgIC8vICAgICRldmFsVmFsdWUgLj0gb2JfZ2V0X2NvbnRlbnRzKCk7ICAgLy8gdXNpbmcgZWNobyAiIgogICAgICAgIC8vb2JfZW5kX2NsZWFuKCk7CgogICAgICAgIC8vZ2V0T2JqZWN0KCJEZWJ1ZyIpLT5hZGRDb25kaXRpb24oJGNvbmRpdGlvbiwgJGV2YWxWYWx1ZSk7CiAgICAgICAgCiAgICAgICAgLy8gICAgICAgIGVjaG8gIlsiLiRldmFsU3RyLiIgPT0gIi4kY29uZGl0aW9uVmFsdWUuIl08YnIgLz4iOwoKICAgICAgICAvL2R1bXAoJGV2YWxDb2RlKTsKICAgICAgICBnbG9iYWwgJGxpc3RSb3dJbmRleDsKICAgICAgICAvL2R1bXAoJGxpc3RSb3dJbmRleCk7CiAgICAgICAgLy9kdW1wKCRldmFsVmFsdWUpOwogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgaWYgKHN0cnBvcygkZXZhbFZhbHVlLCJldmFsKCknZCBjb2RlIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZXZhbENvZGUpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIHNob3dQaHBFcnJvcigkZXZhbFZhbHVlLCAkZXZhbENvZGUsICRlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAkZXZhbFZhbHVlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgICovCiAgICAgICAgLy9kdW1wKCRldmFsVmFsdWUpOwogICAgICAgIAogICAgICAgIGlmICgkZXZhbFZhbHVlID09PSAidHJ1ZSIgfHwgJGV2YWxWYWx1ZSA9PT0gImZhbHNlIikKICAgICAgICAgICAgJGV2YWxWYWx1ZSA9IHRvQm9vbCgkZXZhbFZhbHVlKTsKCiAgICAgICAgZ2xvYmFsICRfX2NvbmRpdGlvblN0YXRzOwogICAgICAgICRfX2NvbmRpdGlvblN0YXRzW10gPSBhcnJheSgKICAgICAgICAgICAgImNvbmRpdGlvbiIgPT4gJGNvbmRpdGlvblN0ciwKICAgICAgICAgICAgInJlc3VsdCIgPT4gJGV2YWxWYWx1ZSwKICAgICAgICApOwoKCiAgICAgICAgcmV0dXJuKCRldmFsVmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9pbmNsdWRlKCR0aWQsICR2aWV3VHlwZT0idnRBbGwiKQogICAgewogICAgICAgIC8vJFNjcmlwdCA9IGdldE9iamVjdCgiU2NyaXB0cyIpLT5nZXRTY3JpcHQoJHRpZCwgJHZpZXdUeXBlKTsKICAgICAgICAKICAgICAgICByZXR1cm4oaW5jbHVkZVNjcmlwdCgkdGlkLCAkdmlld1R5cGUpKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gaW5jbHVkZV9zdHlsZSgkbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4oZ2V0T2JqZWN0KCJTdHlsZXMiKS0+Z2V0U3R5bGUoJG5hbWUpLT5nZXRDU1MoKSk7CiAgICB9CiAgICAKICAgIC8vIC0tLS0tIFdJTEwgQkUgREVQUkVDQVRFRCAtLS0tLQogICAgZnVuY3Rpb24gaW5jbHVkZV9zY3JpcHQoJHRpZCwgJHZpZXdUeXBlPSJ2dEFsbCIpCiAgICB7CiAgICAgICAgcmV0dXJuKGluY2x1ZGVTY3JpcHQoJHRpZCwgJHZpZXdUeXBlKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGluY2x1ZGVTY3JpcHRzKCR0aWQsICR2aWV3VHlwZT0idnRBbGwiKQogICAgewogICAgICAgIHJldHVybihpbmNsdWRlU2NyaXB0KCR0aWQsICR2aWV3VHlwZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluY2x1ZGVfc2NyaXB0cygkdGlkLCAkdmlld1R5cGU9InZ0QWxsIikKICAgIHsKICAgICAgICByZXR1cm4oaW5jbHVkZVNjcmlwdCgkdGlkLCAkdmlld1R5cGUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbmNsdWRlU2NyaXB0KCR0aWQsICR2aWV3VHlwZT0idnRBbGwiKQogICAgewogICAgICAgIGdsb2JhbCAkX19faW5jbHVkZWRTY3JpcHRzOwogICAgICAgIGlmICghaXNfYXJyYXkoJF9fX2luY2x1ZGVkU2NyaXB0cykpCiAgICAgICAgICAgICRfX19pbmNsdWRlZFNjcmlwdHM9YXJyYXkoKTsKICAgICAgICAKICAgICAgICAkc2NyaXB0cyA9IGFycmF5KCk7CiAgICAgICAgaWYgKHN0cnBvcygkdGlkLCAiKiIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICRyZWNvcmRzID0gZ2V0VGFibGUoInNjcmlwdHMiKS0+Z2V0UmVjb3JkcygiZmlsdGVyPXRpZCBMSUtFICciLnN0cl9yZXBsYWNlKCIqIiwgIiUiLCBzdHJfcmVwbGFjZSgiXyIsICJcXF8iLCAkdGlkKSkuIicsb3JkZXJCeT1wb3NpdGlvbnx0aWQiKTsKICAgICAgICAgICAgZm9yZWFjaCgkcmVjb3JkcyBhcyAkcmVjb3JkKQogICAgICAgICAgICAgICAgJHNjcmlwdHNbXSA9IGdldE9iamVjdCgiU2NyaXB0cyIpLT5nZXRTY3JpcHQoJHJlY29yZFsiaWQiXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR0aWRbMF0gPT0gIi8iICYmICR0aWRbc3RybGVuKCR0aWQpLTFdID09ICIvIiB8fCAkdGlkWzBdID09ICJ8IiAmJiAkdGlkW3N0cmxlbigkdGlkKS0xXSA9PSAifCIpCiAgICAgICAgewogICAgICAgICAgICAkcmVjb3JkcyA9IGdldFRhYmxlKCJzY3JpcHRzIiktPmdldFJlY29yZHMoImZpbHRlcj10aWQgUkVHRVhQICciLnN1YnN0cigkdGlkLCAxLCBzdHJsZW4oJHRpZCktMikuIicsb3JkZXJCeT1wb3NpdGlvbnx0aWQiKTsKICAgICAgICAgICAgLy9kdW1wKCRyZWNvcmRzKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgZm9yZWFjaCgkcmVjb3JkcyBhcyAkcmVjb3JkKQogICAgICAgICAgICAgICAgJHNjcmlwdHNbXSA9IGdldE9iamVjdCgiU2NyaXB0cyIpLT5nZXRTY3JpcHQoJHJlY29yZFsiaWQiXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRyZWNvcmRzID0gZ2V0VGFibGUoInNjcmlwdHMiKS0+Z2V0UmVjb3JkcygiZmlsdGVyPXRpZD0nIi4kdGlkLiInLG9yZGVyQnk9cG9zaXRpb24iKTsKCiAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZHMgYXMgJHJlY29yZCkKICAgICAgICAgICAgICAgICRzY3JpcHRzW10gPSBnZXRPYmplY3QoIlNjcmlwdHMiKS0+Z2V0U2NyaXB0KCRyZWNvcmRbImlkIl0pOwoKICAgICAgICAgICAgLy8kc2NyaXB0cyA9IGdldE9iamVjdCgiU2NyaXB0cyIpLT5nZXRTY3JpcHRzKCR0aWQsICR2aWV3VHlwZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vaWYgKCFpbl9hcnJheSgkdGlkLiR2aWV3VHlwZSwgJF9fX2luY2x1ZGVkU2NyaXB0cykpCiAgICAgICAgLy97CiAgICAgICAgZm9yZWFjaCgkc2NyaXB0cyBhcyAkU2NyaXB0KQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkU2NyaXB0KTsKICAgICAgICAgICAgaWYgKCRTY3JpcHQgIT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGNvZGUgPSAkU2NyaXB0LT5jb2RlOwoKICAgICAgICAgICAgICAgIC8vIGZpcnN0IGZpbmQgYWxsIHZhcmlhYmxlcyBhbmQgZG8gdGhlbSBnbG9iYWwKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgiL1skXCRdW1x3XSsvIiwgJGNvZGUsICR2YXJpYWJsZXMpOwogICAgICAgICAgICAgICAgJGdsb2JhbHMgPSAiIjsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhcmlhYmxlcyBhcyAkdmFyaWFibGVBcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR2YXJpYWJsZUFycmF5IGFzICR2YXJpYWJsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3Ryc3RyKCJcJHRoaXMiLCBzdHJ0b2xvd2VyKCR2YXJpYWJsZSkpKSAvLyBza2lwIGlubmVyIGNsYXNzIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdsb2JhbHMgLj0gImdsb2JhbCAiLiR2YXJpYWJsZS4iOyAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAkY29kZSA9IHN0cl9yZXBsYWNlKCImcXVvdDsiLCAiXCIiLCAkY29kZSk7CiAgICAgICAgICAgICAgICAkY29kZSA9IHN0cl9yZXBsYWNlKCImbHQ7IiwgIjwiLCAkY29kZSk7CiAgICAgICAgICAgICAgICAkY29kZSA9IHN0cl9yZXBsYWNlKCImZ3Q7IiwgIj4iLCAkY29kZSk7CiAgICAgICAgICAgICAgICAkY29kZSA9IHN0cl9yZXBsYWNlKCImYW1wOyIsICImIiwgJGNvZGUpOwogICAgICAgICAgICAgICAgJGNvZGUgPSBzdHJfcmVwbGFjZSgiJiMzOTsiLCAiJyIsICRjb2RlKTsKCiAgICAgICAgICAgICAgICAvLyRldmFsQ29kZSA9ICRnbG9iYWxzLiRjb2RlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkZXZhbENvZGUgPSBnZXRFdmFsQ29kZUdsb2JhbHMoJGNvZGUpOwogICAgICAgICAgICAgICAgLy9lY2hvICRldmFsQ29kZS4iPGhyPiI7CiAgICAgICAgICAgICAgICAkaHRtbCA9IGV2YWxQaHAoJGV2YWxDb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy9yZXR1cm4oJGh0bWwpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRodG1sKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICBlY2hvICRodG1sOwogICAgICAgICAgICAKICAgICAgICAgICAgJF9fX2luY2x1ZGVkU2NyaXB0c1tdPSR0aWQuJHZpZXdUeXBlOwogICAgICAgIH0KICAgICAgICAvL30KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaW5jbHVkZV9zY3JpcHRfb25jZSgkdGlkLCAkdmlld1R5cGU9InZ0QWxsIikKICAgIHsKICAgICAgICByZXR1cm4oaW5jbHVkZVNjcmlwdE9uY2UoJHRpZCwgJHZpZXdUeXBlKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGluY2x1ZGVTY3JpcHRPbmNlKCR0aWQsICR2aWV3VHlwZT0idnRBbGwiKQogICAgewogICAgICAgIGdsb2JhbCAkX19pbmNsdWRlU2NyaXB0T25jZTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRfX2luY2x1ZGVTY3JpcHRPbmNlKSkKICAgICAgICAgICAgJF9faW5jbHVkZVNjcmlwdE9uY2UgPSBhcnJheSgpOwogICAgICAgICAgICAKICAgICAgICBpZiAoIWluX2FycmF5KCR0aWQsICRfX2luY2x1ZGVTY3JpcHRPbmNlKSkKICAgICAgICB7CiAgICAgICAgICAgICRfX2luY2x1ZGVTY3JpcHRPbmNlW10gPSAkdGlkOwogICAgICAgICAgICBpbmNsdWRlU2NyaXB0KCR0aWQsICR2aWV3VHlwZT0idnRBbGwiKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RGVmYXVsdFZpZXdUeXBlKCkKICAgIHsKICAgICAgICAvLyBwcm90b3plIG1hbSB0ZWQgbWVudSwga3RlcmUgYXV0b21hdGlja3kgdnl0dmFyaSAkbWlkLCB0YWsgbXVzaW0gZ2V0RGVmYXVsdFZpZXdUeXBlIHZvbGF0IHYgaW5pdC5saWIucGhwLCBqZXN0ZSBwcmVkIAogICAgICAgIC8vIHRpbSwgbmV6IG1lbnUgem1lbmkgJG1pZCBhICRpc0NhdGhlZ29yeQogICAgICAgIAogICAgICAgIGlmICgkX1JFUVVFU1RbImFjdGlvblR5cGUiXSA9PSAiYXRQcmV2aWV3IikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigidnRGdWxsIik7CiAgICAgICAgfQogICAgICAgIC8qZWxzZSBpZiAoIUFETUlOICYmIGRlZmluZWQoIkRFRkFVTFRfVklFV19UWVBFIikpIC8vIGt2dWxpIGNvbW1hbmQgbGluZQogICAgICAgICAgICByZXR1cm4oREVGQVVMVF9WSUVXX1RZUEUpOwogICAgICAgIGVsc2UKICAgICAgICB7ICovCiAgICAgICAgICAgICRkZWZhdWx0Vmlld1R5cGUgPSAidnRMaXN0IjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGdsb2JhbCAkaWQsICR0aWQsICRtaWQsICRpc0NhdGVnb3J5LCAkdGFibGVOYW1lLCAkX1JFUVVFU1QsICRtb2R1bGVOYW1lOwogICAgICAgICAgICAvL2R1bXAoJF9SRVFVRVNUKTsKCiAgICAgICAgICAgIC8vZHVtcCgkbWlkKTsKICAgICAgICAgICAgLy9kdW1wKCRpc0NhdGVnb3J5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgiISIpOwogICAgICAgICAgICBpZiAoJF9SRVFVRVNUWyJ2aWV3VHlwZSJdICE9ICIiKQogICAgICAgICAgICAgICAgJGRlZmF1bHRWaWV3VHlwZSA9ICRfUkVRVUVTVFsidmlld1R5cGUiXTsKICAgICAgICAgICAgZWxzZSBpZiAoJF9SRVFVRVNUWyJpZCJdICE9ICIiIHx8ICRfUkVRVUVTVFsidGlkIl0gIT0gIiIgfHwgJGlkIHx8ICR0aWQpICAvLyAkX0dFVCBrdnVsaSBTRU8gCiAgICAgICAgICAgICAgICAkZGVmYXVsdFZpZXdUeXBlID0gInZ0RnVsbCI7CiAgICAgICAgICAgIGVsc2UgaWYgKCRfUkVRVUVTVFsibWlkIl0gIT0gIiIgJiYgJF9SRVFVRVNUWyJpc0NhdGVnb3J5Il0gIT0gInRydWUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHRhYmxlTmFtZSAmJiAoZ2V0VGFibGUoJHRhYmxlTmFtZSktPnZpZXdUeXBlcyA9PSAidnRGdWxsIikpIC8vIG5la2RlIG5lY2hjaSBsaW1pdAogICAgICAgICAgICAgICAgICAgICRkZWZhdWx0Vmlld1R5cGUgPSAidnRGdWxsIjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkZGVmYXVsdFZpZXdUeXBlID0gInZ0TGlzdCI7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICRkZWZhdWx0Vmlld1R5cGUgPSAidnRGdWxsIjsKICAgICAgICAgICAgICAgIGlmICgkdGFibGVOYW1lICYmIGdldFRhYmxlKCR0YWJsZU5hbWUpLT52aWV3VHlwZXMgPT0gInZ0TGlzdCIpCiAgICAgICAgICAgICAgICAgICAgJGRlZmF1bHRWaWV3VHlwZSA9ICJ2dExpc3QiOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoJF9SRVFVRVNUWyJtaWQiXSAmJiAkX1JFUVVFU1RbImlzQ2F0ZWdvcnkiXSA9PSAidHJ1ZSIgfHwgJF9SRVFVRVNUWyJjbWlkIl0pCiAgICAgICAgICAgICAgICAkZGVmYXVsdFZpZXdUeXBlID0gInZ0TGlzdCI7CgogICAgICAgICAgICAvL2R1bXAoJGRlZmF1bHRWaWV3VHlwZSk7CiAgICAgICAgICAgIC8vZGVmaW5lKCJERUZBVUxUX1ZJRVdfVFlQRSIsICRkZWZhdWx0Vmlld1R5cGUpOwogICAgICAgICAgICByZXR1cm4oJGRlZmF1bHRWaWV3VHlwZSk7CiAgICAgICAgLyp9Ki8KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRWaWV3VHlwZSgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgZ2xvYmFsICR0YWJsZU5hbWU7CgogICAgICAgIGlmICghJHBhcmFtcykKICAgICAgICB7CiAgICAgICAgICAgICRwYXJhbXMgPSAkX1JFUVVFU1Q7CiAgICAgICAgICAgIAogICAgICAgICAgICBnbG9iYWwgJGlkLCAkdGlkOwogICAgICAgICAgICBpZiAoISRwYXJhbXNbImlkIl0gJiYgJGlkKQogICAgICAgICAgICAgICAgJHBhcmFtc1siaWQiXSA9ICRpZDsKICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJ0aWQiXSAmJiAkdGlkKQogICAgICAgICAgICAgICAgJHBhcmFtc1sidGlkIl0gPSAkdGlkOwogICAgICAgIH0KICAgICAgICAkdmlld1R5cGUgPSAidnRMaXN0IjsKCiAgICAgICAgaWYgKCRwYXJhbXNbInZpZXdUeXBlIl0gIT0gIiIpCiAgICAgICAgICAgICR2aWV3VHlwZSA9ICRwYXJhbXNbInZpZXdUeXBlIl07CiAgICAgICAgZWxzZSBpZiAoJHBhcmFtc1sibW9kdWxlTmFtZSJdICE9ICIiKQogICAgICAgICAgICAkdmlld1R5cGUgPSAidnRNb2R1bGUiOwogICAgICAgIGVsc2UgaWYgKCRwYXJhbXNbIm1pZCJdICE9ICIiICYmIHRvQm9vbCgkcGFyYW1zWyJpc0NhdGVnb3J5Il0pID09PSB0cnVlIHx8ICRwYXJhbXNbImNtaWQiXSAhPSAiIikKICAgICAgICAgICAgJHZpZXdUeXBlID0gInZ0TGlzdCI7CiAgICAgICAgZWxzZSBpZiAoJHBhcmFtc1sibWlkIl0gIT0gIiIgJiYgdG9Cb29sKCRwYXJhbXNbImlzQ2F0ZWdvcnkiXSkgIT09IHRydWUpCiAgICAgICAgewogICAgICAgICAgICAgJF90YWJsZU5hbWUgPSBmaXJzdF92YWx1ZSgkcGFyYW1zWyJ0YWJsZSJdLCAkdGFibGVOYW1lKTsKICAgICAgICAgICAgIC8vaWYgKCRfdGFibGVOYW1lICYmIChnZXRUYWJsZSgkX3RhYmxlTmFtZSktPnZpZXdUeXBlcyA9PSAidnRGdWxsIiB8fCBnZXRUYWJsZSgkX3RhYmxlTmFtZSktPnZpZXdUeXBlcyA9PSAidnRCb3RoIikgJiYgISRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdICYmICEkcGFyYW1zWyJiZWdpbiJdICYmICEkcGFyYW1zWyJsaW1pdCJdKQogICAgICAgICAgICAgaWYgKCRfdGFibGVOYW1lICYmIChnZXRUYWJsZSgkX3RhYmxlTmFtZSktPnZpZXdUeXBlcyA9PSAidnRGdWxsIikpIC8vIG5la2RlIG5lY2hjaSBsaW1pdAogICAgICAgICAgICAgICAgJHZpZXdUeXBlID0gInZ0RnVsbCI7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkdmlld1R5cGUgPSAidnRMaXN0IjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgLy9kdW1wKCR2aWV3VHlwZSk7CiAgICAgICAgICAgICAvL2dsb2JhbCAkdGFibGVOYW1lOwogICAgICAgICAgICAgLy9pZiAoZ2V0VGFibGUoJHRhYmxlTmFtZSktPnZpZXdUeXBlcyA9PSAidnRGdWxsIikKICAgICAgICAgICAgICAgIC8vJHZpZXdUeXBlID0gInZ0RnVsbCI7CiAgICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgIC8vICAgJHZpZXdUeXBlID0gInZ0TGlzdCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCRwYXJhbXNbImlkIl0gIT0gIiIgfHwgJHBhcmFtc1sidGlkIl0gIT0gIiIpCiAgICAgICAgICAgICR2aWV3VHlwZSA9ICJ2dEZ1bGwiOwoKICAgICAgICByZXR1cm4oJHZpZXdUeXBlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbXBsb2RlUGFyYW1zKCRwYXJhbXMsICRzZXBhcmF0b3I9IiwiLCAkZXF1YWw9Ij0iKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJHBhcmFtcykpCiAgICAgICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgICAgICAgICAgCiAgICAgICAgJF9wYXJhbXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkcGFyYW1OYW1lID0+ICRwYXJhbVZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgJF9wYXJhbXNbXSA9ICRwYXJhbU5hbWUuJGVxdWFsLiRwYXJhbVZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oaW1wbG9kZSgkc2VwYXJhdG9yLCAkX3BhcmFtcykpOwogICAgfQogICAgICAgIAogICAgZnVuY3Rpb24gcGFyc2VQYXJhbVNjcmlwdHMoJHBhcmFtcywgJHBhcmVudFBhcmFtcz1hcnJheSgpLCAkbGV2ZWw9MCkKICAgIHsKICAgICAgICAvL2R1bXAoIiEhIik7CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICRfcGFyYW1zID0gJHBhcmFtczsKICAgICAgICAKICAgICAgICBpZiAoaXNfc3RyaW5nKCRfcGFyYW1zKSAmJiAoc3RycG9zKCRfcGFyYW1zLCAie1wiIikgPT09IDAgfHwgc3RycG9zKCRfcGFyYW1zLCAiW1wiIikgPT09IDAgfHwgc3RycG9zKCRfcGFyYW1zLCAiW3tcIiIpID09PSAwKSkKICAgICAgICAgICAgJF9wYXJhbXMgPSBUSlNPTjo6ZGVjb2RlKCRfcGFyYW1zKTsKICAgICAgICAKICAgICAgICBpZiAoaXNfYXJyYXkoJF9wYXJhbXMpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkX3BhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJF9rZXkgPSBwYXJzZVBocCgka2V5KTsKICAgICAgICAgICAgICAgIHVuc2V0KCRfcGFyYW1zWyRrZXldKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJF9wYXJhbXNbJF9rZXldID0gcGFyc2VQYXJhbVNjcmlwdHMoJHZhbHVlLCAkcGFyYW1zLCAkbGV2ZWwrMSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vJF9wYXJhbXNbJGtleV0gPSBwYXJzZVBhcmFtU2NyaXB0cygkdmFsdWUsICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzX3N0cmluZygkX3BhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJF9wYXJhbXMgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgICRfcGFyYW1zID0gdHJ1ZTsKICAgICAgICAgICAgZWxzZSBpZiAoJF9wYXJhbXMgPT09ICJmYWxzZSIpCiAgICAgICAgICAgICAgICAkX3BhcmFtcyA9IGZhbHNlOwogICAgICAgICAgICAvL2Vsc2UgaWYgKHByZWdfbWF0Y2hfYWxsKCcve3BocDooW159XSopfS9pJywgJF9wYXJhbXMsICRjbXNFbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICAvLyBjb21wb25lbnQgPT0gZmFsc2UgLSB1c2VkIGluIHRlbXBsYXRlPUhUTUxDT0RFIGNvbnRhaW5pbmcgb3RoZXIgdGVtcGxhdGUuLi4KICAgICAgICAgICAgZWxzZSBpZiAoc3RycG9zKCRfcGFyYW1zLCAiPGNvbXBvbmVudCIpID09PSBGQUxTRSAmJiBzdHJwb3MoJF9wYXJhbXMsICJ7cGhwOiIpICE9PSBGQUxTRSAmJiBwcmVnX21hdGNoX2FsbCgnL3twaHA6KC4qP1teXFxcXF0pfS9pJywgJF9wYXJhbXMsICRjbXNFbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRjbXNFbGVtZW50cyBhcyAkY21zRWxlbWVudCkgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRzY3JpcHQgPSAkY21zRWxlbWVudFsxXTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoIi0tLS0tIik7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkc2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAkc2NyaXB0ID0gc3RyX3JlcGxhY2UoIiZsdDsiLCAiPCIsICRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICRzY3JpcHQgPSBzdHJfcmVwbGFjZSgiJmd0OyIsICI+IiwgJHNjcmlwdCk7CiAgICAgICAgICAgICAgICAgICAgJHNjcmlwdCA9IHN0cl9yZXBsYWNlKCJcXHsiLCAieyIsICRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICRzY3JpcHQgPSBzdHJfcmVwbGFjZSgiXFx9IiwgIn0iLCAkc2NyaXB0KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgZmluZCBhbGwgdmFyaWFibGVzIGFuZCBkbyB0aGVtIGdsb2JhbAogICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCIvWyRcJF1bXHddKy8iLCAkc2NyaXB0LCAkdmFyaWFibGVzKTsKICAgICAgICAgICAgICAgICAgICAkZ2xvYmFscyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGVzIGFzICR2YXJpYWJsZUFycmF5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGVBcnJheSBhcyAkdmFyaWFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3Ryc3RyKCJcJHRoaXMiLCBzdHJ0b2xvd2VyKCR2YXJpYWJsZSkpKSAvLyBza2lwIGlubmVyIGNsYXNzIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzWyR2YXJpYWJsZV0gPSAkdmFyaWFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHVzaW5nICRwYXJhbXMgaW4ge3BocDogLi4ufSBpbnNpZGUgcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwYXJlbnRQYXJhbXMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICRwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMgPSAkcGFyZW50UGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoJHNjcmlwdCwgInJldHVybiIpKSAgICAvLyBzY3JpcHQgY29udGFpbnMgb3RoZXIgY29kZSBiZWZvcmUgcmV0dXJuaW5nIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICRldmFsU3RyID0gKCRnbG9iYWxzID8gImdsb2JhbCAiLmltcGxvZGUoIiwiLCAkZ2xvYmFscykuIjsgIiA6ICIiKS4kc2NyaXB0LiI7IjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRldmFsU3RyID0gKCRnbG9iYWxzID8gImdsb2JhbCAiLmltcGxvZGUoIiwiLCAkZ2xvYmFscykuIjsgIiA6ICIiKS4icmV0dXJuICIuJHNjcmlwdC4iOyI7CgoKICAgICAgICAgICAgICAgICAgICAkZHVtbXkgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkZXZhbFN0cik7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRfUkVRVUVTVCk7CiAgICAgICAgICAgICAgICAgICAgLy8kdmFsdWUgPSBldmFsUGhwKCRldmFsU3RyLCAkZHVtbXksICRkdW1teSwgZmFsc2UpOyAgLy8gbmVmdW5ndWppIGdsb2JhbHkKICAgICAgICAgICAgICAgICAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZXZhbFN0cik7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gX19ldmFsKCRldmFsU3RyKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGV2YWxTdHIpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIC8vZ2xvYmFsICR0YWJsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCR0YWJsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpIHx8IGlzX29iamVjdCgkdmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICAkX3BhcmFtcyA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRfcGFyYW1zID0gc3RyX3JlcGxhY2UoJGNtc0VsZW1lbnRbMF0sICR2YWx1ZSwgJF9wYXJhbXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkX3BhcmFtcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIF9fZml4RXh0cmFjdFBhcmFtcygkcGFyYW1zKQogICAgewogICAgICAgIHVuc2V0KCRwYXJhbXNbIl9fdGltZVN0YXJ0Il0pOwoKICAgICAgICByZXR1cm4oJHBhcmFtcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGV4dHJhY3RQYXJhbXMoJHBhcmFtcywgJHNlcGFyYXRvcj0iIiwgJHBhcnNlU2NyaXB0cz10cnVlKQogICAgewogICAgICAgIGlmIChpc19vYmplY3QoJHBhcmFtcykpCiAgICAgICAgICAgICRwYXJhbXMgPSBjbG9uZSAkcGFyYW1zOwogICAgICAgICAgICAKICAgICAgICBpZiAoX2lzX2FycmF5KCRwYXJhbXMpKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbmV3IGluIHYyIC0gdG8gcGFyc2VTY3JpcHRzIGRvIGEgbG9vcCB0aHJvdWdoIGFsbCBpdGVtcyByZWN1cnNpdmVseQogICAgICAgICAgICBpZiAoJHBhcnNlU2NyaXB0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHBhcmFtcyA9IHBhcnNlUGFyYW1TY3JpcHRzKCRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkdmFsdWUpICYmIHN0cnBvcygkdmFsdWUsICJiYXNlNjQ6IikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XSA9IGJhc2U2NF9kZWNvZGUoc3Vic3RyKCR2YWx1ZSwgNywgc3RybGVuKCR2YWx1ZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHZhbHVlKSAmJiAoc3RycG9zKCR2YWx1ZSwgIntcIiIpID09PSAwIHx8IHN0cnBvcygkdmFsdWUsICJbXCIiKSA9PT0gMCB8fCBzdHJwb3MoJHZhbHVlLCAiW3tcIiIpID09PSAwKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXldID0gVEpTT046OmRlY29kZSgkdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbJGtleV0gPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRwYXJhbXNbJGtleV0gPT09ICJmYWxzZSIpCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkcGFyYW1zID0gX19maXhFeHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8kc2VwYXJhdG9yID0gIsKnIjsKICAgICAgICAgICAgLy8kcGFyYW1zID0gaW1wbG9kZVBhcmFtcygkcGFyYW1zLCAkc2VwYXJhdG9yKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFpc19zdHJpbmcoJHBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICAvL3Nob3dNZXNzYWdlKCJleHRyYWN0UGFyYW1zKCk6ICIuc3RyX2R1bXAoJHBhcmFtcyksIG10RXJyb3IpOwogICAgICAgICAgICByZXR1cm4oYXJyYXkoKSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdHJwb3MoJHBhcmFtcywgIntwaHA6IikgPT09IDApCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHBhcnNlU2NyaXB0cykKICAgICAgICAgICAgICAgIHJldHVybihwYXJzZVBocCgkcGFyYW1zKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJwb3MoJHBhcmFtcywgIntcIiIpID09PSAwIHx8IHN0cnBvcygkcGFyYW1zLCAiW1wiIikgPT09IDAgfHwgc3RycG9zKCRwYXJhbXMsICJbe1wiIikgPT09IDApCiAgICAgICAgewogICAgICAgICAgICAkcGFyYW1zID0gVEpTT046OmRlY29kZSgkcGFyYW1zKTsKCiAgICAgICAgICAgICRwYXJhbXMgPSBfX2ZpeEV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7CgogICAgICAgICAgICByZXR1cm4oJHBhcmFtcyk7CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgLy8genJ1c2VubyBrdnVsaSBwYXJhbWV0cnUgc2VwYXJhdG9yIHUgRURJVExJU1QgLSBuYXByICIsICIKICAgICAgICAvLyRwYXJhbXMgPSB0cmltKCRwYXJhbXMpOwogICAgICAgIAogICAgICAgICRyZXQgPSBhcnJheSgpOwoKICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIAogICAgICAgIGlmICgkc2VwYXJhdG9yID09ICIiKSAvLyB0cnkgdG8gZGV0ZXJtaW5lIGF1dG9tYXRpY2FseQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkcGFyYW1zLCAiXG4iKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAkc2VwYXJhdG9yID0gIlxuIjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJHNlcGFyYXRvciA9ICIsIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIC8vIGVzY2FwZSBzZXF1ZW5jZSBzZXBhcmF0b3IKICAgICAgICAkcGFyYW1zID0gc3RyX3JlcGxhY2UoIlxcLCIsICIlQ09NTUElIiwgJHBhcmFtcyk7CgogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvL2VjaG8gIjAiOwogICAgICAgIGlmICgkcGFyc2VTY3JpcHRzKQogICAgICAgIHsKICAgICAgICAgICAgLy8gdHJldGkgcGFyYW1ldHIgbmFocmF6dWplIGNhcmt1IChqYWtvIG9kZGVsb3ZhYyBwYXJhbWV0cnUpIHphICVDT01NQSUsIHByb3RvIGplIG1vem5lIHBvdXppdCBqZWogdmUgdmxhc3Rub3N0aSBrb21wb25lbnQKICAgICAgICAgICAgJHBhcmFtcyA9IHBhcnNlUGhwKCRwYXJhbXMsIHRydWUsIGFycmF5KCIsIiA9PiAiJUNPTU1BJSIpKTsKICAgICAgICB9CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIC8vJHBhcmFtcyA9IGZpeFBhcmFtU3RyaW5ncygkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAKICAgICAgICAvLyBhZnRlciBwYXJzZVBocCB0aGVyZSBtYXkgYmUgXFwsIGlmIGV2YWwnZCB2YWx1ZSBpcyBhcnJheSgpCiAgICAgICAgJHBhcmFtcyA9IHN0cl9yZXBsYWNlKCJcXCwiLCAiJUNPTU1BJSIsICRwYXJhbXMpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAvL2VjaG8gIjEiOwoKICAgICAgICAkcGFyYW1zID0gc3RyX3JlcGxhY2UoIlxyIiwgIiIsICRwYXJhbXMpOwogICAgICAgIGlmICgkc2VwYXJhdG9yID09ICIsIikKICAgICAgICAgICAgJHBhcmFtcyA9IHN0cl9yZXBsYWNlKCJcbiIsICIsIiwgJHBhcmFtcyk7CiAgICAgICAgJHBhcmFtcyA9IHN0cl9yZXBsYWNlKCJgYCIsICJcIiIsICRwYXJhbXMpOwogICAgICAgICRwYXJhbXMgPSBzdHJfcmVwbGFjZSgiJmFtcDsiLCAiJiIsICRwYXJhbXMpOwogICAgICAgICRwYXJhbXMgPSBzdHJfcmVwbGFjZSgiJmx0OyIsICI8IiwgJHBhcmFtcyk7CiAgICAgICAgJHBhcmFtcyA9IHN0cl9yZXBsYWNlKCImZ3Q7IiwgIj4iLCAkcGFyYW1zKTsKICAgICAgICAkcGFyYW1zID0gc3RyX3JlcGxhY2UoIiZxdW90OyIsICJcIiIsICRwYXJhbXMpOwogICAgICAgICRwYXJhbXMgPSBzdHJfcmVwbGFjZSgiJVFVT1QlIiwgIlwiIiwgJHBhcmFtcyk7CgogICAgICAgIC8vZWNobyAiQSI7CiAgICAgICAgJGNQYXJhbXMgPSBleHBsb2RlKCRzZXBhcmF0b3IsICRwYXJhbXMpOwogICAgICAgIGZvcmVhY2ggKCRjUGFyYW1zIGFzICRfcGFyYW0pCiAgICAgICAgewogICAgICAgICAgICAvLyBwYXJhbSBjYW4gY29udGFpbiA9IGV4dHJhY3Qgb25seSBieSB1c2luZyB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGlmICh0cmltKCRfcGFyYW0pICE9ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcG9zID0gc3RycG9zKCRfcGFyYW0sICI9Iik7CiAgICAgICAgICAgICAgICBpZiAoJHBvcyA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8kcGFyYW1OYW1lID0gdHJpbSgkX3BhcmFtKTsKICAgICAgICAgICAgICAgICAgICAvLyRwYXJhbU5hbWUgPSAkX3BhcmFtOwogICAgICAgICAgICAgICAgICAgICRwYXJhbU5hbWUgPSB0cmltKCRfcGFyYW0pOwogICAgICAgICAgICAgICAgICAgICRyZXRbJHBhcmFtTmFtZV0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vJHBhcmFtTmFtZSA9IHRyaW0oc3Vic3RyKCRfcGFyYW0sIDAsICRwb3MpKTsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1OYW1lID0gc3Vic3RyKCRfcGFyYW0sIDAsICRwb3MpOwogICAgICAgICAgICAgICAgICAgICRwYXJhbVZhbHVlID0gc3Vic3RyKCRfcGFyYW0sICRwb3MrMSwgc3RybGVuKCRfcGFyYW0pKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkcGFyYW1WYWx1ZSA9IHN0cl9yZXBsYWNlKCImIzEyNDsiLCAifCIsICRwYXJhbVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1WYWx1ZSA9IHN0cl9yZXBsYWNlKCImIzQ0OyIsICIsIiwgJHBhcmFtVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICRwYXJhbVZhbHVlID0gc3RyX3JlcGxhY2UoIiYjNjE7IiwgIj0iLCAkcGFyYW1WYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1WYWx1ZSA9PT0gInRydWUiKQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1WYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJHBhcmFtVmFsdWUgPT09ICJmYWxzZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbVZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJlZ19tYXRjaCgifF5bMC05XFwtXFwuXVwkfCIsICRwYXJhbVZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtVmFsdWUgPSBleHRyYWN0RmxvYXQoJHBhcmFtVmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZWdfbWF0Y2goInxeWzAtOVxcLV1cJHwiLCAkcGFyYW1WYWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbVZhbHVlID0gZXh0cmFjdEludCgkcGFyYW1WYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGdldHR5cGUoJHBhcmFtVmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtVmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHBhcmFtVmFsdWUsICJ7XCIiKSA9PT0gMCB8fCBzdHJwb3MoJHBhcmFtVmFsdWUsICJbXCIiKSA9PT0gMCB8fCBzdHJwb3MoJHBhcmFtVmFsdWUsICJbe1wiIikgPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1WYWx1ZSA9IFRKU09OOjpkZWNvZGUoJHBhcmFtVmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHBhcmFtTmFtZSwgIltdIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAkcmV0W3N0cl9yZXBsYWNlKCJbXSIsICIiLCAkcGFyYW1OYW1lKV1bXSA9ICRwYXJhbVZhbHVlOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnBvcygkcGFyYW1OYW1lLCAiJTVCJTVEIikgIT09IEZBTFNFKSAvLyB1cmxlbmNvZGVkIGxpbmsgcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXRbc3RyX3JlcGxhY2UoIiU1QiU1RCIsICIiLCAkcGFyYW1OYW1lKV1bXSA9ICRwYXJhbVZhbHVlOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgJHJldFskcGFyYW1OYW1lXSA9ICRwYXJhbVZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZWNobyAkcG9zLiI6Ii50cmltKHN1YnN0cigkX3BhcmFtLCAwLCAkcG9zKSkuIj0iLnRyaW0oc3Vic3RyKCRfcGFyYW0sICRwb3MrMSwgc3RybGVuKCRfcGFyYW0pKSkuIjxiciAvPiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZWNobyAiQiI7CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcmV0IGFzICRrZXkgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygka2V5LCAiWyIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJGtleSwgIl0iKSA9PT0gc3RybGVuKCRrZXkpLTEpIC8vIGFycmF5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRrZXkgPSBzdWJzdHIoJGtleSwgMCwgc3RybGVuKCRrZXkpLTEpOwogICAgICAgICAgICAgICAgJGtleSA9IGV4cGxvZGUoIlsiLCAka2V5KTsKICAgICAgICAgICAgICAgICRrZXlOYW1lID0gJGtleVswXTsKICAgICAgICAgICAgICAgICRrZXlQYXJhbSA9ICRrZXlbMV07CgogICAgICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkcGFyYW1zWyRrZXlOYW1lXSkpCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5TmFtZV0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXlOYW1lXVska2V5UGFyYW1dID0gJHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV0gPSAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICAKICAgICAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKCR2YWx1ZSk7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHZhbHVlKSAmJiBzdHJwb3MoJHZhbHVlLCAiYXJyYXkoIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAgICAgJHZhbHVlID0gdXJsZGVjb2RlKCR2YWx1ZSk7IC8vIG1heSBiZSBwYXNzZWQgdGhyb3VnaCBHRVQgb3IgUE9TVAogICAgICAgICAgICAgICAgJGV2YWxDb2RlID0gInJldHVybigiLiR2YWx1ZS4iKTsiOwogICAgICAgICAgICAgICAgJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoIiMjIiwgIiwiLCAkZXZhbENvZGUpOwogICAgICAgICAgICAgICAgJGV2YWxDb2RlID0gc3RyX3JlcGxhY2UoIiVDT01NQSUiLCAiLCIsICRldmFsQ29kZSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vb2Jfc3RhcnQoKTsKICAgICAgICAgICAgICAgICRldmFsVmFsdWUgPSBfX2V2YWwoJGV2YWxDb2RlKTsKICAgICAgICAgICAgICAgIC8vJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAvL29iX2VuZF9jbGVhbigpOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRlcnJvciwiZXZhbCgpJ2QgY29kZSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRldmFsQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgIHNob3dQaHBFcnJvcigkZXZhbFZhbHVlLCAkZXZhbENvZGUsICRlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJleHRyYWN0UGFyYW1zOjpjb252ZXJ0IGFycmF5KCk6ICIuJGV2YWxDb2RlLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAkZXZhbFZhbHVlID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvL2R1bXAoJGV2YWxDb2RlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRldmFsVmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRldmFsVmFsdWVbIl9pbnNlcnRfIl0pOyAgICAgICAgCgogICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XSA9ICRldmFsVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBhcmFtc1ska2V5XSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV0gPSBzdHJfcmVwbGFjZSgiJUNPTU1BJSIsICIsIiwgJHBhcmFtc1ska2V5XSk7CiAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXldID0gc3RyX3JlcGxhY2UoIiVRVU9UJSIsICJcIiIsICRwYXJhbXNbJGtleV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCRyZXQpOwogICAgICAgICRwYXJhbXMgPSBfX2ZpeEV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dHJhY3RGdW5jdGlvblBhcmFtcygkc3RyKQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkc3RyKSkKICAgICAgICAgICAgcmV0dXJuKCRzdHIpOwogICAgICAgICAgICAKICAgICAgICAvL2R1bXAoIiEiKTsKICAgICAgICAvL2R1bXAoJHN0cik7CiAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCImcXVvdDsiLCAiIiwgJHN0cik7CiAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkc3RyLCAiXCIiKSAhPT0gRkFMU0UgfHwgc3RycG9zKCRzdHIsICInIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgaW5zaWRlIEpTT04gLSBjb21wb25lbnQgcGFyYW1zCiAgICAgICAgICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiXFxcIiIsICIiLCAkc3RyKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiXCIiLCAiIiwgJHN0cik7CiAgICAgICAgICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiJyIsICIiLCAkc3RyKTsKICAgICAgICAgICAgJGl0ZW1zID0gZXhwbG9kZSgiLCIsICRzdHIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLyoKICAgICAgICAgICAgJGMgPSAoc3RycG9zKCRzdHIsICJcIiIpICE9PSBGQUxTRSA/ICJcIiIgOiAiJyIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGl0ZW1zID0gZXhwbG9kZSgkYywgJHN0cik7CiAgICAgICAgICAgIGZvciAoJGkgPSAxIDsgJGkgPCBjb3VudCgkaXRlbXMpIDsgJGkrPTIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpdGVtc1skaV0gPSBzdHJfcmVwbGFjZSgiLCIsICJbQ09NTUFdIiwgJGl0ZW1zWyRpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN0ciA9IGltcGxvZGUoJGMsICRpdGVtcyk7CiAgICAgICAgICAgICRpdGVtcyA9IGV4cGxvZGUoIiwiLCAkc3RyKTsKICAgICAgICAgICAgZm9yZWFjaCgkaXRlbXMgYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpdGVtc1ska2V5XSA9IHN0cl9yZXBsYWNlKCJbQ09NTUFdIiwgIiwiLCAkaXRlbXNbJGtleV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4oJGl0ZW1zKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oZXhwbG9kZSgiLCIsICRzdHIpKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tUGFyYW1zKCRwYXJhbXMsICRuYW1lKQogICAgewogICAgICAgIGlmIChzdHJwb3MoJG5hbWUsICJbIikgPT09IEZBTFNFKQogICAgICAgICAgICByZXR1cm4oJHBhcmFtc1skbmFtZV0pOwogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoW15cW10rKVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXXxpcyIsICRuYW1lLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkgLy8gbmFtZVt4XVt5XVt6XVthXVtiXVtjXQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1skZWxlbXNbMF1bMV1dWyRlbGVtc1swXVsyXV1bJGVsZW1zWzBdWzNdXVskZWxlbXNbMF1bNF1dWyRlbGVtc1swXVs1XV1bJGVsZW1zWzBdWzZdXVskZWxlbXNbMF1bNl1dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoW15cW10rKVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXXxpcyIsICRuYW1lLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkgLy8gbmFtZVt4XVt5XVt6XVthXVtiXQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1skZWxlbXNbMF1bMV1dWyRlbGVtc1swXVsyXV1bJGVsZW1zWzBdWzNdXVskZWxlbXNbMF1bNF1dWyRlbGVtc1swXVs1XV1bJGVsZW1zWzBdWzZdXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbeF1beV1bel1bYV0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXVskZWxlbXNbMF1bMl1dWyRlbGVtc1swXVszXV1bJGVsZW1zWzBdWzRdXVskZWxlbXNbMF1bNV1dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoW15cW10rKVxbKFteXF1dKylcXVxbKFteXF1dKylcXVxbKFteXF1dKylcXXxpcyIsICRuYW1lLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkgLy8gbmFtZVt4XVt5XVt6XQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1skZWxlbXNbMF1bMV1dWyRlbGVtc1swXVsyXV1bJGVsZW1zWzBdWzNdXVskZWxlbXNbMF1bNF1dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoW15cW10rKVxbKFteXF1dKylcXVxbKFteXF1dKylcXXxpcyIsICRuYW1lLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkgLy8gbmFtZVt4XVt5XQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1skZWxlbXNbMF1bMV1dWygkZWxlbXNbMF1bMl0hPScnPyRlbGVtc1swXVsyXTowKV1bKCRlbGVtc1swXVszXSE9Jyc/JGVsZW1zWzBdWzNdOjApXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcWyhbXlxdXSspXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbeF0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXVsoJGVsZW1zWzBdWzJdIT0nJz8kZWxlbXNbMF1bMl06MCldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoW15cW10rKVxbXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbXQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1skZWxlbXNbMF1bMV1dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbeF1beV1bel1bYV1bYl1bY10KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXVskZWxlbXNbMF1bMl1dWyRlbGVtc1swXVszXV1bJGVsZW1zWzBdWzRdXVskZWxlbXNbMF1bNV1dWyRlbGVtc1swXVs2XV1bJGVsZW1zWzBdWzZdXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbeF1beV1bel1bYV1bYl0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXVskZWxlbXNbMF1bMl1dWyRlbGVtc1swXVszXV1bJGVsZW1zWzBdWzRdXVskZWxlbXNbMF1bNV1dWyRlbGVtc1swXVs2XV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbXlxbXSspXFsoW15cXV0rKVxdXFsoW15cXV0rKVxdXFsoW15cXV0rKVxdXFsoW15cXV0rKVxdfGlzIiwgJG5hbWUsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKSAvLyBuYW1lW3hdW3ldW3pdW2FdCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybigkcGFyYW1zWyRlbGVtc1swXVsxXV1bJGVsZW1zWzBdWzJdXVskZWxlbXNbMF1bM11dWyRlbGVtc1swXVs0XV1bJGVsZW1zWzBdWzVdXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcWyhbXlxdXSspXF1cWyhbXlxdXSspXF1cWyhbXlxdXSspXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbeF1beV1bel0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXVskZWxlbXNbMF1bMl1dWyRlbGVtc1swXVszXV1bJGVsZW1zWzBdWzRdXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcWyhbXlxdXSspXF1cWyhbXlxdXSspXF18aXMiLCAkbmFtZSwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpIC8vIG5hbWVbeF1beV0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXVskZWxlbXNbMF1bMl1dWyRlbGVtc1swXVszXV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbXlxbXSspXFsoW15cXV0rKVxdfGlzIiwgJG5hbWUsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKSAvLyBuYW1lW3hdCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybigkcGFyYW1zWyRlbGVtc1swXVsxXV1bJGVsZW1zWzBdWzJdXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFteXFtdKylcW1xdfGlzIiwgJG5hbWUsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKSAvLyBuYW1lW10KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbJGVsZW1zWzBdWzFdXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VTcWwoJGh0bWwpCiAgICB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCcve3NxbDooW159XSopfS9pJywgJGh0bWwsICRjbXNFbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkY21zRWxlbWVudHMgYXMgJGNtc0VsZW1lbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRzY3JpcHQgPSAkY21zRWxlbWVudFsxXTsKICAgICAgICAgICAgICAgIC8vIGZpcnN0IGZpbmQgYWxsIHZhcmlhYmxlcyBhbmQgZG8gdGhlbSBnbG9iYWwKICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCIvWyRcJF1bXHddKy8iLCAkc2NyaXB0LCAkdmFyaWFibGVzKTsKICAgICAgICAgICAgICAgICRnbG9iYWxzID0gIiI7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCR2YXJpYWJsZXMgYXMgJHZhcmlhYmxlQXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGVBcnJheSBhcyAkdmFyaWFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cnN0cigiXCR0aGlzIiwgc3RydG9sb3dlcigkdmFyaWFibGUpKSkgLy8gc2tpcCBpbm5lciBjbGFzcyB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhcmlhYmxlID0gc3Vic3RyKCR2YXJpYWJsZSwgMSwgc3RybGVuKCR2YXJpYWJsZSktMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJCR2YXJpYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY3JpcHQgPSBzdHJfcmVwbGFjZSgiJCIuJHZhcmlhYmxlLCAkJHZhcmlhYmxlLCAkc2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyRldmFsU3RyID0gJGdsb2JhbHMuIiByZXR1cm4gJyIuJHNjcmlwdC4iJzsiOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBORVNNSU0gLSBwcm90b3plIGppbmFrIHRvIHRyZWJhICsgb2RzdHJhbmkKICAgICAgICAgICAgICAgIC8vJHNjcmlwdCA9IHVybGRlY29kZSgkc2NyaXB0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHNjcmlwdCA9IGh0bWxfZW50aXR5X2RlY29kZSgkc2NyaXB0KTsKICAgICAgICAgICAgICAgICRzY3JpcHQgPSBzdHJfcmVwbGFjZSgiJiMzOTsiLCAiJyIsICRzY3JpcHQpOwogICAgICAgICAgICAgICAgLy9lY2hvICRzY3JpcHQ7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZHVtcCgkc2NyaXB0KTsKICAgICAgICAgICAgICAgICRldmFsVmFsdWUgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgJERiTGluayA9IGdldERlZmF1bHREYkxpbmsoKTsKICAgICAgICAgICAgICAgICRyZWNvcmRzID0gJERiTGluay0+c2VsZWN0KCIiLCBhcnJheSgicXVlcnkiID0+ICRzY3JpcHQpKTsKICAgICAgICAgICAgICAgICRyZWNvcmRWYWx1ZXMgPSAkcmVjb3Jkc1swXTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZFZhbHVlcyBhcyAkZmllbGROYW1lID0+ICRmaWVsZFZhbHVlKQogICAgICAgICAgICAgICAgICAgICRldmFsVmFsdWVbXSA9ICRmaWVsZFZhbHVlOwoKICAgICAgICAgICAgICAgICRldmFsVmFsdWUgPSBpbXBsb2RlKCJ8IiwgJGV2YWxWYWx1ZSk7CgogICAgICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgkY21zRWxlbWVudFswXSwgJGV2YWxWYWx1ZSwgJGh0bWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBwYXJzZVBocCgkaHRtbCwgJGRpc3BsYXlFcnJvcnM9dHJ1ZSwgJHJlcGxhY2VtZW50cz1hcnJheSgpKQogICAgewogICAgICAgIC8vZWNobyBnZXRNZW1vcnlVc2FnZSgicGFyc2VQaHAoKSAtIGJlZ2luIik7CgogICAgICAgIC8vaWYgKHN0cnBvcygkaHRtbCwgIntwaHA6IikgIT09IEZBTFNFKQogICAgICAgIC8vewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRodG1sKSkKICAgICAgICAgICAgICAgICRodG1sQXJyYXkgPSBhcnJheSgkaHRtbCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRodG1sQXJyYXkgPSAkaHRtbDsKCiAgICAgICAgICAgIC8vZWNobyAkcGFyc2VWYWx1ZTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkaHRtbEFycmF5KTsKICAgICAgICAgICAgZm9yZWFjaCgkaHRtbEFycmF5IGFzICRwYXJzZUtleSA9PiAkcGFyc2VWYWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoIWlzX2FycmF5KCRwYXJzZVZhbHVlKSAmJiBzdHJwb3MoJHBhcnNlVmFsdWUsICJ7cGhwOiIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgnL3twaHA6KFtefV0qKX0vaScsICRwYXJzZVZhbHVlLCAkY21zRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoJ3x7cGhwOiguKj9bXlxcXFxdKX18aW1zJywgJHBhcnNlVmFsdWUsICRjbXNFbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkY21zRWxlbWVudHMgYXMgJGNtc0VsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGNtc0VsZW1lbnRbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRjbXNFbGVtZW50WzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY3JpcHQgPSAkY21zRWxlbWVudFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0UHJvZmlsZXJEYXRhKCJwYXJzZVBocCgpIiwgJHNjcmlwdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NldFByb2ZpbGVyRGF0YSgicGFyc2VQaHAoKSIsICItLSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjcmlwdCA9IHN0cl9yZXBsYWNlKCImZ3Q7IiwiPiIsJHNjcmlwdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NyaXB0ID0gc3RyX3JlcGxhY2UoIiZsdDsiLCI8Iiwkc2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY3JpcHQgPSBzdHJfcmVwbGFjZSgiJnF1b3Q7IiwiXCIiLCRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjcmlwdCA9IHN0cl9yZXBsYWNlKCImYW1wOyIsICImIiwgJHNjcmlwdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NyaXB0ID0gc3RyX3JlcGxhY2UoIiVDT01NQSUiLCAiLCIsICRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjcmlwdCA9IHN0cl9yZXBsYWNlKCJcXHsiLCAieyIsICRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjcmlwdCA9IHN0cl9yZXBsYWNlKCJcXH0iLCAifSIsICRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRzY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kc2NyaXB0ID0gc3RyX3JlcGxhY2UoIiVRVU9UJSIsICJcIiIsICRzY3JpcHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGZpbmQgYWxsIHZhcmlhYmxlcyBhbmQgZG8gdGhlbSBnbG9iYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCIvWyRcJF1bXHddKy8iLCAkc2NyaXB0LCAkdmFyaWFibGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR2YXJpYWJsZXMgYXMgJHZhcmlhYmxlQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFyaWFibGVBcnJheSBhcyAkdmFyaWFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cnN0cigiXCR0aGlzIiwgc3RydG9sb3dlcigkdmFyaWFibGUpKSkgLy8gc2tpcCBpbm5lciBjbGFzcyB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnbG9iYWxzIC49ICJnbG9iYWwgIi4kdmFyaWFibGUuIjsgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoc3Ryc3RyKCRzY3JpcHQsICJyZXR1cm4iKSB8fCBwcmVnX21hdGNoKCJ8PVtePl18aW1zIiwgJHNjcmlwdCkpICAgIC8vIHNjcmlwdCBjb250YWlucyBvdGhlciBjb2RlIGJlZm9yZSByZXR1cm5pbmcgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9tbWl0ICRWQVIgPSBhbnl0aGluZy4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cigkc2NyaXB0LCAicmV0dXJuIikgfHwgcHJlZ19tYXRjaCgifFxcXCRbYS16QS1aMC05X10gKj1bXj5dfGltcyIsICRzY3JpcHQpKSAgICAvLyBzY3JpcHQgY29udGFpbnMgb3RoZXIgY29kZSBiZWZvcmUgcmV0dXJuaW5nIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2YWxTdHIgPSAkZ2xvYmFscy4iICIuJHNjcmlwdC4iOyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2YWxTdHIgPSAkZ2xvYmFscy4iIHJldHVybiAiLiRzY3JpcHQuIjsiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGV2YWxTdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2YWxWYWx1ZSA9IGV2YWxQaHAoJGV2YWxTdHIsIE5VTEwsICRlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRpc3BsYXlFcnJvcnMgJiYgJGVycm9yTWVzc2FnZSAhPSAiIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgkZXJyb3JNZXNzYWdlLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gJGVycm9yTWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCAkZGVidWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChnZXRPYmplY3QoIkRlYnVnIiktPmRlYnVnUGFyc2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZ2V0T2JqZWN0KCJEZWJ1ZyIpLT5hZGRQYXJzZXJDb250ZW50KCJQSFAiLCBodG1sZW50aXRpZXMoJGV2YWxTdHIpLCAkaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChzdHJwb3MoJGRlYnVnLCAiUGFyc2UiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzaG93TWVzc2FnZSgiPGI+cGFyc2VQaHAoKTwvYj46ICIuKHN0cnBvcygkZGVidWcsICJGdWxsIikgIT09IEZBTFNFID8gIjxiciAvPjxiciAvPiIuJGh0bWwgOiBodG1sZW50aXRpZXMoJGV2YWxTdHIpLiIgPSIuJGV2YWxWYWx1ZSksIG10RGVidWcsIGZhbHNlLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJHBocENvZGVOcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiW1BIUCAiLiRwaHBDb2RlTnIuIjogIi4kZXZhbFN0ci4iID09ICIuJGV2YWxWYWx1ZS4iXTxiciAvPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGhwQ29kZU5yKys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcmVwbGFjZW1lbnRzIGFzICRmcm9tID0+ICR0bykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGV2YWxWYWx1ZS4iID0gIi4kZnJvbS4iIC0gIi4kdG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmFsVmFsdWUgPSBzdHJfcmVwbGFjZSgkZnJvbSwgJHRvLCAkZXZhbFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCItLS0tLS0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkc2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkY21zRWxlbWVudFswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGV2YWxWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCEkZXJyb3JNZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJzZVZhbHVlID0gc3RyX3JlcGxhY2UoJGNtc0VsZW1lbnRbMF0sICRldmFsVmFsdWUsICRwYXJzZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgJHBhcnNlVmFsdWUgPSBzdHJfcmVwbGFjZSgkY21zRWxlbWVudFswXSwgIiIsICRwYXJzZVZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGh0bWxBcnJheVskcGFyc2VLZXldID0gJHBhcnNlVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZWNobyBnZXRNZW1vcnlVc2FnZSgicGFyc2VQaHAoKSAtIGVuZCIpOwoKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkaHRtbCkpCiAgICAgICAgICAgICAgICAkcmV0ID0gJGh0bWxBcnJheTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJHJldCA9ICRodG1sQXJyYXlbMF07CiAgICAgICAgLy99CiAgICAgICAvLyBlbHNlCiAgICAgICAgLy8gICAgJHJldCA9ICRodG1sOwoKICAgICAgICAvL3Zhcl9kdW1wKCRyZXQpOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CgogICAgCiAgICBmdW5jdGlvbiBnZXRJbm5lck91dGVySFRNTCgkaHRtbCwgJGVsZW1lbnQsICR0YWdTdGFydFBvcz0tMSwgJHR5cGU9IiIpCiAgICB7CiAgICAgICAgaWYgKCEkZWxlbWVudCkKICAgICAgICAgICAgcmV0dXJuKCIiKTsKCiAgICAgICAgaWYgKHN0cnBvcygkaHRtbCwgJGVsZW1lbnQpID09PSBGQUxTRSkKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgICAgICAKICAgICAgICBpZiAoJGVsZW1lbnRbMF0gIT0gIjwiKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbm90IGEgdGFnIC0gdHJ5IHRvIGZpbmQgZmlyc3QgdGFnIGNvbnRhaW5pbmcgdGhlIHN0cmluZyA/Pz8/CiAgICAgICAgICAgICR0YWdTdGFydFBvcyA9IHN0cnBvcygkaHRtbCwgJGVsZW1lbnQpOwogICAgICAgICAgICAkciA9IDA7CiAgICAgICAgICAgIHdoaWxlKHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0YWdTdGFydFBvcy0tOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJGh0bWxbJHRhZ1N0YXJ0UG9zXSA9PSAiPCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBnbG9iYWwgJF9fZ2V0SW5uZXJPdXRlckhUTUxNZXNzYWdlRGlzcGxheWVkMzsgLy8gdG8gZGlzcGxheSBvbmx5IG9uY2UKICAgICAgICAgICAgICAgIGlmICgkciA9PSAxMDAwICYmICEkX19nZXRJbm5lck91dGVySFRNTE1lc3NhZ2VEaXNwbGF5ZWQzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCgkdHlwZSA9PSAiaW5uZXIiID8gImdldElubmVySFRNTCgpIiA6ICJnZXRPdXRlckhUTUwoKSIpLiIgISEhIDMgISEhIGZvciB0YWcgJyIuJHRhZ05hbWUuIic6IGluZmluaXRlIGxvb3AgLSBleGl0aW5nLi4uPGJyIC8+Ii5odG1sZW50aXRpZXMoJGh0bWwpLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAkdGFnU3RhcnRQb3MgPSBzdHJwb3MoJGh0bWwsICRlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAkX19nZXRJbm5lck91dGVySFRNTE1lc3NhZ2VEaXNwbGF5ZWQzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9kdW1wKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkaHRtbCkpOwogICAgICAgIC8vZHVtcCgkdGFnU3RhcnRQb3MuIjogIi4kdGFnU3RhcnRQb3MpOwogICAgICAgIC8vZHVtcCgkdGFnU3RhcnRQb3MuIjogIi5odG1sZW50aXRpZXMoc3Vic3RyKCRodG1sLCAkdGFnU3RhcnRQb3MsIDIwKSkpOwogICAgICAgIAogICAgICAgIGlmICgkdGFnU3RhcnRQb3MgPT0gLTEpICAgIAogICAgICAgIHsKICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJy88KFteID48XSspL2knLCAkZWxlbWVudCwgJGNtc0VsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUik7CiAgICAgICAgICAgICR0YWdTdGFydFBvcyA9IHN0cnBvcygkaHRtbCwgJGVsZW1lbnQpOwogICAgICAgICAgICAvL2R1bXAoIi0tLS0tLS1YWFhYWCIpOwogICAgICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKHN1YnN0cigkaHRtbCwgJHRhZ1N0YXJ0UG9zLCA0MCkpKTsKICAgICAgICB9ICAgIAogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICAvLyBtdXN0IGZpbmQgZmlyc3QgZWxlbWVudCAoX19fXyA8ZGl2KSBjYW4gYmVnaW4gd2l0aCB3aGl0ZSBzcGFjZXMKICAgICAgICAgICAgLy9pZiAoJHRhZ1N0YXJ0UG9zID09IC0xKQogICAgICAgICAgICAvLyAgICAkdGFnU3RhcnRQb3MgPSAwOwogICAgICAgICAgICAvL2R1bXAoc3Vic3RyKCRodG1sLCAkdGFnU3RhcnRQb3MsIHN0cmxlbigkaHRtbCkpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJy88KFteID5dKykoW14+XSopPi9pJywgc3Vic3RyKCRodG1sLCAkdGFnU3RhcnRQb3MsIHN0cmxlbigkaHRtbCkpLCAkY21zRWxlbWVudHMsIFBSRUdfU0VUX09SREVSKTsKICAgICAgICAgICAgJGVsZW1lbnQgPSAkY21zRWxlbWVudHNbMF1bMF07CiAgICAgICAgICAgIC8vZHVtcCgiLS0tLS0tLVhYWFhYIik7CiAgICAgICAgICAgIC8vZHVtcChodG1sZW50aXRpZXMoJGVsZW1lbnQpKTsKICAgICAgICAgICAgLy9kdW1wKCItLS0tLS0tIik7CiAgICAgICAgICAgICR0YWdTdGFydFBvcyA9IHN0cnBvcygkaHRtbCwgJGVsZW1lbnQsICR0YWdTdGFydFBvcyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBCVUchIQogICAgICAgICAgICBpZiAoJHRhZ1N0YXJ0UG9zIDwgMCkKICAgICAgICAgICAgICAgICR0YWdTdGFydFBvcyA9IDA7CiAgICAgICAgfQogICAgICAgICR0YWdOYW1lID0gJGNtc0VsZW1lbnRzWzBdWzFdOwogICAgICAgIC8vZHVtcCgkdGFnTmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICR0YWdFbmQgPSAiPC8iLiR0YWdOYW1lLiI+IjsKCiAgICAgICAgLy8gZmlyc3QgZmluZCBwb3NpdGlvbiBvZiBmaXJzdCB0YWcKICAgICAgICAvL2R1bXAoIkFBQUFBIik7CiAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkdGFnRW5kKSk7CiAgICAgICAgLy8kdGFnU3RhcnRQb3MgPSBzdHJwb3NyKCRwYXJzZVZhbHVlLCAiPCIsICR0YWdQb3MpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAkaW5uZXJUYWdDb3VudCA9IC0xOyAvLyBmaXJzdCBsb29wIGNvbnRhaW5zIGEgdGFnCiAgICAgICAgJHN0YXJ0UG9zID0gJHRhZ1N0YXJ0UG9zOwogICAgICAgIC8vZHVtcCgkc3RhcnRQb3MpOwogICAgICAgICRyID0gMDsKICAgICAgICB3aGlsZSh0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgJGVuZFBvcyA9IHN0cnBvcygkaHRtbCwgJHRhZ0VuZCwgJHN0YXJ0UG9zKTsKICAgICAgICAgICAgaWYgKCRlbmRQb3MgPT09IEZBTFNFKSAvLyBubyBwYWlyIHRhZyA8aW1nIC4uLi8+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9PSAiaW5uZXIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybigiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPT0gIm91dGVyIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGFnRW5kID0gIj4iOwogICAgICAgICAgICAgICAgICAgICRlbmRQb3MgPSBzdHJwb3MoJGh0bWwsICR0YWdFbmQsICRzdGFydFBvcyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkaW5uZXJUYWdDb3VudCArPSBzdHJwb3NjKHN1YnN0cigkaHRtbCwgJHN0YXJ0UG9zLCAkZW5kUG9zLSRzdGFydFBvcyksICI8Ii4kdGFnTmFtZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoIioqKiIpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRpbm5lclRhZ0NvdW50KTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdGFnTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJGlubmVyVGFnQ291bnQgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkc3RhcnRQb3MgPSAkZW5kUG9zKzE7CiAgICAgICAgICAgICAgICAgICAgJGlubmVyVGFnQ291bnQtLTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL2R1bXAoJGlubmVyVGFnQ291bnQpOwogICAgICAgICAgICAgICAgJHIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZ2xvYmFsICRfX2dldElubmVyT3V0ZXJIVE1MTWVzc2FnZURpc3BsYXllZDsgLy8gdG8gZGlzcGxheSBvbmx5IG9uY2UKICAgICAgICAgICAgICAgIGlmICgkciA9PSAxMDAwICYmICEkX19nZXRJbm5lck91dGVySFRNTE1lc3NhZ2VEaXNwbGF5ZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoKCR0eXBlID09ICJpbm5lciIgPyAiZ2V0SW5uZXJIVE1MKCkiIDogImdldE91dGVySFRNTCgpIikuIiBmb3IgdGFnICciLiR0YWdOYW1lLiInOiBpbmZpbml0ZSBsb29wIC0gZXhpdGluZy4uLjxiciAvPiIuaHRtbGVudGl0aWVzKCRodG1sKSwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgJHN0YXJ0UG9zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgJGVuZFBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICRfX2dldElubmVyT3V0ZXJIVE1MTWVzc2FnZURpc3BsYXllZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmICgkc3RhcnRQb3MgIT0gLTEgJiYgJGVuZFBvcyAhPSAtMSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAib3V0ZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkc3RhcnRQb3MgPSAkdGFnU3RhcnRQb3M7CiAgICAgICAgICAgICAgICAkZW5kUG9zICs9IHN0cmxlbigkdGFnRW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHR5cGUgPT0gImlubmVyIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkZWxlbWVudCkpOwogICAgICAgICAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkZWxlbWVudCkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyB0b3RvIGZ1bmd1amUgamVuIGEgcG91emUsIHBva3VkIHphZGFtIGtvbXBsZXRuaSB0YWcgPHh4eCAuLi4uPgogICAgICAgICAgICAgICAgLy8kc3RhcnRQb3MgPSAkdGFnU3RhcnRQb3Mrc3RybGVuKCRlbGVtZW50KTsgICAgICAgIC8vIG11c2ltICsxIGppbmFrIHZyYWNpICI+IDxpbm5lciB0YWc+CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIFVQREFURSAyMDIxIC0ga3Z1bGkgdGVtcGxhdGUgaHRtbCBjYWNoZSwga2RlIGhsZWRhbSBuYSB6YWtsYWRlIG5lamFrZSBjYXN0aSB0YWcKICAgICAgICAgICAgICAgICRzdGFydFBvcyA9ICR0YWdTdGFydFBvczsKICAgICAgICAgICAgICAgICRyID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHN0YXJ0UG9zKys7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCRodG1sWyRzdGFydFBvc10gPT0gIj4iKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJF9fZ2V0SW5uZXJPdXRlckhUTUxNZXNzYWdlRGlzcGxheWVkMjsgLy8gdG8gZGlzcGxheSBvbmx5IG9uY2UKICAgICAgICAgICAgICAgICAgICBpZiAoJHIgPT0gMTAwMCAmJiAhJF9fZ2V0SW5uZXJPdXRlckhUTUxNZXNzYWdlRGlzcGxheWVkMikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCgkdHlwZSA9PSAiaW5uZXIiID8gImdldElubmVySFRNTCgpIiA6ICJnZXRPdXRlckhUTUwoKSIpLiIgISEhIDIgISEhIGZvciB0YWcgJyIuJHRhZ05hbWUuIic6IGluZmluaXRlIGxvb3AgLSBleGl0aW5nLi4uPGJyIC8+Ii5odG1sZW50aXRpZXMoJGh0bWwpLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXJ0UG9zID0gJHN0YXJ0UG9zID0gJHRhZ1N0YXJ0UG9zK3N0cmxlbigkZWxlbWVudCk7IC8vIE9MRCBXT1JLSU5HIFZFUlNJT04KICAgICAgICAgICAgICAgICAgICAgICAgJF9fZ2V0SW5uZXJPdXRlckhUTUxNZXNzYWdlRGlzcGxheWVkMiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRodG1sWyRzdGFydFBvc10gPT0gIj4iKSAvLyBzb21ldGltZXMgY29tZXMgYSBCVUcKICAgICAgICAgICAgICAgICAgICAkc3RhcnRQb3MrKzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGVuZFBvcyArPSBzdHJsZW4oJHRhZ0VuZCktc3RybGVuKCI8LyIuJHRhZ05hbWUuIj4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgkdGFnU3RhcnRQb3MpOwogICAgICAgICAgICAvL2R1bXAoJHN0YXJ0UG9zKTsKICAgICAgICAgICAgLy9kdW1wKCRlbmRQb3MpOwogICAgICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCRodG1sKSk7CiAgICAgICAgICAgIC8vZHVtcChodG1sZW50aXRpZXMoc3Vic3RyKCRodG1sLCAkc3RhcnRQb3MsICRlbmRQb3MtJHN0YXJ0UG9zKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJHJldCA9IHN1YnN0cigkaHRtbCwgJHN0YXJ0UG9zLCAkZW5kUG9zLSRzdGFydFBvcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRyZXQgPSAiIjsKICAgICAgICB9CgogICAgICAgIC8vZHVtcChodG1sZW50aXRpZXMoJHJldCkpOwogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SW5uZXJIVE1MKCRodG1sLCAkZWxlbWVudCwgJHRhZ1N0YXJ0UG9zID0gLTEpCiAgICB7CiAgICAgICAgcmV0dXJuKGdldElubmVyT3V0ZXJIVE1MKCRodG1sLCAkZWxlbWVudCwgJHRhZ1N0YXJ0UG9zLCAiaW5uZXIiKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldE91dGVySFRNTCgkaHRtbCwgJGVsZW1lbnQsICR0YWdTdGFydFBvcyA9IC0xKQogICAgewogICAgICAgIHJldHVybihnZXRJbm5lck91dGVySFRNTCgkaHRtbCwgJGVsZW1lbnQsICR0YWdTdGFydFBvcywgIm91dGVyIikpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRBbGxJbm5lckhUTUwoJGh0bWwsICRlbGVtZW50KQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgpOwogICAgICAgICR0YWdTdGFydFBvcyA9IC0xOwogICAgICAgIAogICAgICAgIHdoaWxlKCgkdGFnU3RhcnRQb3MgPSBzdHJwb3MoJGh0bWwsICRlbGVtZW50LCAkdGFnU3RhcnRQb3MrMSkpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgkdGFnU3RhcnRQb3MpOwogICAgICAgICAgICAkcmV0W10gPSBnZXRJbm5lck91dGVySFRNTCgkaHRtbCwgIiIsICR0YWdTdGFydFBvcywgImlubmVyIik7CiAgICAgICAgICAgIGZpbGVfYXBwZW5kX2NvbnRlbnRzKCJmOi90ZW1wLzEuaHRtbCIsIGdldElubmVyT3V0ZXJIVE1MKCRodG1sLCAiIiwgJHRhZ1N0YXJ0UG9zLCAiaW5uZXIiKSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0QWxsT3V0ZXJIVE1MKCRodG1sLCAkZWxlbWVudCkKICAgIHsKICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICAkdGFnU3RhcnRQb3MgPSAtMTsKICAgICAgICAKICAgICAgICB3aGlsZSgoJHRhZ1N0YXJ0UG9zID0gc3RycG9zKCRodG1sLCAkZWxlbWVudCwgJHRhZ1N0YXJ0UG9zKzEpKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICAkcmV0W10gPSBnZXRJbm5lck91dGVySFRNTCgkaHRtbCwgIiIsICR0YWdTdGFydFBvcywgIm91dGVyIik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVUYWdzKCRodG1sLCAkdGFncz0iIikKICAgIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCR0YWdzKSkKICAgICAgICAgICAgJHRhZ3MgPSBleHBsb2RlKCIsIiwgJHRhZ3MpOwogICAgICAgICAgICAKICAgICAgICBmb3JlYWNoKCR0YWdzIGFzICR0YWdOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgJGh0bWwgPSBwcmVnX3JlcGxhY2UoInw8Ii4kdGFnTmFtZS4iW14+XSo+fCIsICIiLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gcHJlZ19yZXBsYWNlKCJ8PC8iLiR0YWdOYW1lLiJbXj5dKj58IiwgIiIsICRodG1sKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0KICAgIAogICAgLy8gISEhISEhISEhISEhISBPTiBDSEFOR0UgU0VFIEFMU08gVEZpZWxkQ29tcG9uZW50OjpnZXRDb2RlCiAgICBmdW5jdGlvbiBoaWRlQ29tcG9uZW50cygkaHRtbCkKICAgIHsKICAgICAgICAvL2dsb2JhbCAkV0VCQ09OVEVOVDsKICAgICAgICAvL2lmICgkV0VCQ09OVEVOVCkKICAgICAgICAvLyAgICByZXR1cm4oJGh0bWwpOwogICAgICAgIAogICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIGlmIChpc19hcnJheSgkaHRtbCkpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRodG1sIGFzICRrZXkgPT4gJHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkaHRtbFska2V5XSA9IGhpZGVDb21wb25lbnRzKCR2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIntwaHA6IiwgIntfcGhwOiIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiez8iLCAie18/IiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJ7anM6IiwgIntfanM6IiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJ7I2lmIiwgIntfI2lmIiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCIgY29uZGl0aW9uPSIsICIgY29uZGl0aW9uIz0iLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIl9UKCIsICJfVCMoIiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJfTCgiLCAiX0wjKCIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiW3NldHRpbmdzOiIsICJbX3NldHRpbmdzOiIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiW3M6IiwgIltfczoiLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIlt1c2VyOiIsICJbX3VzZXI6IiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJbdToiLCAiW191OiIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiW21hc3RlcjoiLCAiW19tYXN0ZXI6IiwgJGh0bWwpOwoKICAgICAgICAgICAgLy8kaHRtbCA9IHN0cl9yZXBsYWNlKCJbISIsICJbISEiLCAkaHRtbCk7CgogICAgICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoIl9MKCIsICJfTCMoIiwgJGh0bWwpOyAgLy8gbmVvZGtvbWVudG92YXZhdCAtIG1yaXprYSBzZSBwcmlkYXZhIHYgdWRhbG9zdGkgb25HZXRDb2RlIHUgTXVsdGlMYW5ndWFnZUZpZWxkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfQogICAgCiAgICAvLyAhISEhISEhISEhISEhIE9OIENIQU5HRSBTRUUgQUxTTyBURmllbGRDb21wb25lbnQ6OmdldENvZGUKICAgIGZ1bmN0aW9uIHJlc3RvcmVDb21wb25lbnRzKCRodG1sKQogICAgewogICAgICAgIC8vZ2xvYmFsICRXRUJDT05URU5UOwogICAgICAgIC8vaWYgKCRXRUJDT05URU5UKQogICAgICAgIC8vICAgIHJldHVybigkaHRtbCk7CiAgICAgICAgCiAgICAgICAgaWYgKGlzX2FycmF5KCRodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJGh0bWwgYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vJGh0bWxbJGtleV0gPSBoaWRlQ29tcG9uZW50cygkdmFsdWUpOwogICAgICAgICAgICAgICAgJGh0bWxbJGtleV0gPSByZXN0b3JlQ29tcG9uZW50cygkdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzX3N0cmluZygkaHRtbCkpCiAgICAgICAgewogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJ7X3BocDoiLCAie3BocDoiLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIntfPyIsICJ7PyIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgie19qczoiLCAie2pzOiIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgie18jaWYiLCAieyNpZiIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiIGNvbmRpdGlvbiM9IiwgIiBjb25kaXRpb249IiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJfVCMoIiwgIl9UKCIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiX0wjKCIsICJfTCgiLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIltfc2V0dGluZ3M6IiwgIltzZXR0aW5nczoiLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIltfczoiLCAiW3M6IiwgJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJbX3VzZXI6IiwgIlt1c2VyOiIsICRodG1sKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgiW191OiIsICJbdToiLCAkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIltfbWFzdGVyOiIsICJbbWFzdGVyOiIsICRodG1sKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGsgY2VtdSB0b3RvIGJ5bG8/Pz8/Pz8gLi4uIGFzaSBza3J6IHNhYmxvbnksIGFieSB0byBuZW1lbmlsbyBvYnNhaCBKUyBwb2xpCiAgICAgICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoIlsjIyIsICJbIiwgJGh0bWwpOwogICAgICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoIlshIiwgIlsiLCAkaHRtbCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBwb3V6aXRvIGtkeXogbWFtIG5hcHJpa2xhZCB2IGtvbXBvbmVudGUgdiBzYWJvbmUgbmF6ZXYgdGV4dGVkaXQgbmVjb1tuYW1lXSBhIHNhbW90bmEgdGFidWxrYSBtYSB0YWt5IHBvbGUgbmFtZQogICAgICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoIlshISIsICJbISIsICRodG1sKTsKCiAgICAgICAgICAgIC8vIHZpeiBoaWRlQ29tcG9uZW50cwogICAgICAgICAgICAvLyRodG1sID0gc3RyX3JlcGxhY2UoInsjIyNwaHA6IiwgInsjI3BocDoiLCAkaHRtbCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHBhcnNlSHRtbCgkaHRtbCkKICAgIHsKICAgICAgICAvLyBwb2t1ZCBjaGNpIG5hc3Rhdml0IGhvZG5vdHkgcHJvbWVubnljaCBwcm8gcG91eml0aSBuZWtkZSBqaW5kZSB2IHJhbWNpIEhUTUwgLSBpZGVhbCBqZSB2bG96aXQgUEhQIHNrcmlwdCBzIHBhcnNlT3JkZXI9cG9GaXJzdCAtIHBva3VkIHRha292eSBleGlzdHVqZSAtIHBvdG9tIGplIG51dG5vIGplaiBzcHVzdGl0IGpha28gcHJ2bmkgYSBheiBwYWsgcGFyc292YXQge3BocDogeHh4fX0KICAgICAgICBpZiAoc3RycG9zKCRodG1sLCAicG9GaXJzdCIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifDxjb21wb25lbnQgY2xhc3M9XCJQSFBTY3JpcHRcIj4oLio/KTwvY29tcG9uZW50PnwiLCAkaHRtbCwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkbWF0Y2hbMV0sICJwb0ZpcnN0IikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgkbWF0Y2hbMF0sIHBhcnNlSHRtbChzdHJfcmVwbGFjZSgicG9GaXJzdCIsICIiLCAkbWF0Y2hbMF0pKSwgJGh0bWwpOyAgIC8vIHN0cl9yZXBsYWNlIGF0IHNlIHRvIG5lY3lrbGkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGh0bWwgPSBwYXJzZVBocCgkaHRtbCk7CiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uUGFyc2VIdG1sIiwgYXJyYXkoImh0bWwiID0+ICRodG1sKSwgImh0bWwiKTsKICAgICAgICAKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJ7KnBocDoiLCAie3BocDoiLCAkaHRtbCk7CiAgICAgICAgJGh0bWwgPSBwYXJzZVBocCgkaHRtbCk7CgogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHRvQWJzb2x1dGVVcmwoJGh0bWwsICRwcm9qZWN0VXJsPSIiLCAkcmF3PWZhbHNlKQogICAgewogICAgICAgIGlmICghJHByb2plY3RVcmwpCiAgICAgICAgICAgICRwcm9qZWN0VXJsID0gUFJPSkVDVFVSTDsKICAgIAogICAgICAgIGlmIChzdHJwb3MoJGh0bWwsICI8IikgIT09IEZBTFNFKQogICAgICAgICAgICAkaHJlZnMgPSBnZXRIcmVmcygkaHRtbCwgYXJyYXkoKSwgJHJhdyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkaHJlZnMgPSBhcnJheShhcnJheSgwID0+ICRodG1sLCAxID0+ICIiLCAyID0+ICRodG1sKSk7CgogICAgICAgIGZvcmVhY2goJGhyZWZzIGFzICRocmVmKQogICAgICAgIHsKICAgICAgICAgICAgJGxpbmsgPSAkaHJlZlsyXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgkbGluayk7CiAgICAgICAgICAgIC8vaWYgKHN0cnBvcygkbGluaywgImh0dHA6IikgPT09IDAgfHwgc3RycG9zKCRsaW5rLCAiaHR0cHM6IikgPT09IDAgfHwgc3RycG9zKCRsaW5rLCAiamF2YXNjcmlwdDoiKSA9PT0gMCB8fCBzdHJwb3MoJGxpbmssICJtYWlsdG86IikgPT09IDAgfHwgc3RycG9zKCRsaW5rLCAiLy8iKSA9PT0gMCB8fCBzdHJwb3MoJGxpbmssICJkYXRhOiIpID09PSAwIHx8ICRsaW5rWzBdID09ICJbIiB8fCAkbGlua1swXSA9PSAieyIpCiAgICAgICAgICAgIGlmIChzdHJwb3MoJGxpbmssICI6IikgIT09IEZBTFNFIHx8IHN0cnBvcygkbGluaywgIi8vIikgPT09IDAgfHwgJGxpbmtbMF0gPT0gIlsiIHx8ICRsaW5rWzBdID09ICJ7IikKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IGNsZWFuTGluayhQUk9KRUNUVVJMLiRsaW5rKTsKICAgICAgICAgICAgJGh0bWwgPSBzdHJfcmVwbGFjZSgkaHJlZlswXSwgJGhyZWZbMV0uJHJlcGxhY2VtZW50LiRocmVmWzNdLCAkaHRtbCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHRvUmVsYXRpdmVVcmwoJGh0bWwpCiAgICB7CiAgICAgICAgZHVtcCgiVE9ETyE6IHRvUmVsYXRpdmVVcmwoKSIpOwogICAgICAgIAogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRPbGRJbmNsdWRlUGFyYW1WYWx1ZXMoJHBhcmFtcykKICAgIHsKICAgICAgICAkb2xkSW5jbHVkZVBhcmFtVmFsdWVzID0gYXJyYXkoIl9HTE9CQUxTIiA9PiBhcnJheSgpLCAiX0dFVCIgPT4gYXJyYXkoKSwgIl9QT1NUIiA9PiBhcnJheSgpKTsKICAgICAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJGlOYW1lID0+ICRpVmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJF9HRVRbJGlOYW1lXSkKICAgICAgICAgICAgICAgICRvbGRJbmNsdWRlUGFyYW1WYWx1ZXNbIl9HRVQiXVskaU5hbWVdID0gJF9HRVRbJGlOYW1lXTsKICAgICAgICAgICAgLy8ga3Z1bGkgSHRtbENhY2hlIGEgcG9kbWluY2UgaWYgKCEkX1BPU1QpIHJ1c2ltIFBPU1QKICAgICAgICAgICAgLy9pZiAoJF9QT1NUWyRpTmFtZV0pCiAgICAgICAgICAgIC8vICAgICRvbGRJbmNsdWRlUGFyYW1WYWx1ZXNbIl9QT1NUIl1bJGlOYW1lXSA9ICRfUE9TVFskaU5hbWVdOwoKICAgICAgICAgICAgZ2xvYmFsICQkaU5hbWU7CiAgICAgICAgICAgICRvbGRJbmNsdWRlUGFyYW1WYWx1ZXNbIl9HTE9CQUxTIl1bJGlOYW1lXSA9ICQkaU5hbWU7CgogICAgICAgICAgICAvLyRfUE9TVFskaU5hbWVdID0gJGlWYWx1ZTsKICAgICAgICAgICAgJF9HRVRbJGlOYW1lXSA9ICRpVmFsdWU7CiAgICAgICAgICAgICQkaU5hbWUgPSAkaVZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJG9sZEluY2x1ZGVQYXJhbVZhbHVlcyk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRPbGRJbmNsdWRlUGFyYW1WYWx1ZXMoJHBhcmFtcykKICAgIHsKICAgICAgICBmb3JlYWNoKCRwYXJhbXNbIl9HRVQiXSBhcyAkaU5hbWUgPT4gJGlWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRfR0VUWyJpTmFtZSJdID0gJGlWYWx1ZTsKICAgICAgICB9CiAgICAgICAgLy8ga3Z1bGkgSHRtbENhY2hlIGEgcG9kbWluY2UgaWYgKCEkX1BPU1QpIHJ1c2ltIFBPU1QKICAgICAgICAvL2ZvcmVhY2goJHBhcmFtc1siX1BPU1QiXSBhcyAkaU5hbWUgPT4gJGlWYWx1ZSkKICAgICAgICAvL3sKICAgICAgICAvLyAgICAkX1BPU1RbImlOYW1lIl0gPSAkaVZhbHVlOwogICAgICAgIC8vfQogICAgICAgIGZvcmVhY2goJHBhcmFtc1siX0dMT0JBTFMiXSBhcyAkaU5hbWUgPT4gJGlWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkJGlOYW1lOwogICAgICAgICAgICAvL2lmICghJHBhcmFtc1siX1BPU1QiXVskaU5hbWVdKQogICAgICAgICAgICAvLyAgICB1bnNldCgkX1BPU1RbJGlOYW1lXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkJGlOYW1lID0gJGlWYWx1ZTsKICAgICAgICB9CiAgICB9Cgo=ZnVuY3Rpb24gVE9iamVjdChwYXJhbXMsIGlkKQp7CiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgaWYgKCF0aGlzLmlkKQogICAgICAgIHRoaXMuaWQgPSBVVUlEKCk7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgIAogICAgYWRkT2JqZWN0KHRoaXMpOwogICAgdGhpcy5fY3JlYXRlKCk7Cn07CgpUT2JqZWN0LnByb3RvdHlwZS5fY3JlYXRlID0gZnVuY3Rpb24oKQp7CiAgICAvL2R1bXAoX0FKQVgpOwogICAgLy9pZiAoX0FKQVgpCiAgICAvLyAgICByZXR1cm47CiAgICAKICAgIC8vIGNhbGwgY3JlYXRlIG9ubHkgd2hlbiBhZGRPYmplY3QodGhpcykgZG9uZSB3ZWxsCiAgICBpZiAoIXRoaXMuX2FkZGVkKQogICAgewogICAgICAgIC8vX3Rocm93KCJPYmplY3QgJyIrdGhpcy5jbGFzc05hbWUrIigiK3RoaXMuaWQrIiknIGhhcyBub3QgYmVlbiBhZGRlZCB0byBvYmplY3RzIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBzdGFydFByb2ZpbGVyKHRoaXMuY2xhc3NOYW1lKyIuY3JlYXRlKCkiKTsKICAgIGlmIChmYWxzZSAvKmZhbHNlICYmIEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiICYmIEJyb3dzZXIudmVyc2lvbiA8PSA4ICYmIGluX2FycmF5KCJUQ29tcG9uZW50IiwgdGhpcy5pbmhlcml0cykqLykKICAgIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5jcmVhdGUoKTtfdGhpcy5fYWZ0ZXJDcmVhdGUoKTt9LCA1MCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdGhpcy5jcmVhdGUoKTsKICAgICAgICB0aGlzLl9hZnRlckNyZWF0ZSgpOwogICAgfQogICAgc3RvcFByb2ZpbGVyKHRoaXMuY2xhc3NOYW1lKyIuY3JlYXRlKCkiKTsKfQogICAgClRPYmplY3QucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5lbGVtZW50cyA9IFtdOwogICAgdGhpcy5vYmplY3RzID0gW107CiAgICB0aGlzLmV2ZW50cyA9IHt9OwoKICAgIC8vYWxlcnQoIlRPYmplY3Q6OmNyZWF0ZSIpOwogICAgaWYgKHRoaXMucGFyYW1zKQogICAgewogICAgICAgIGlmICghdGhpcy5wYXJhbXNbIm9iamVjdENvbnRhaW5lciJdKQogICAgICAgICAgICB0aGlzLnBhcmFtc1sib2JqZWN0Q29udGFpbmVyIl0gPSB0aGlzLnBhcmFtc1siY29udGFpbmVyIl07CiAgICAgICAgCiAgICAgICAgdGhpcy5vYmplY3RDb250YWluZXIgPSBnZXRFbGVtZW50KHRoaXMucGFyYW1zWyJvYmplY3RDb250YWluZXIiXSk7CiAgICB9CiAgICAKICAgIC8vdmFyIF90aGlzID0gdGhpczsKICAgIC8vc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLmFzc2lnbk9iamVjdFRvRWxlbWVudCgpfSwgMTApOwogICAgLy90aGlzLmFzc2lnbk9iamVjdFRvRWxlbWVudCgpOwogICAgCiAgICAvL2FsZXJ0KHRoaXMuaWQgKyB0aGlzLnBhcmFtc1siZXZlbnRzIl0pOwogICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWyJldmVudHMiXSkKICAgIHsKICAgICAgICAvL2FsZXJ0KHRoaXMucGFyYW1zWyJldmVudHMiXSk7CiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnBhcmFtc1siZXZlbnRzIl0pCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoaSk7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzW2ldKTsKICAgICAgICAgICAgLy9kdW1wKHRoaXMucGFyYW1zW2ldKTsKICAgICAgICAgICAgLy9hbGVydChpKTsKICAgICAgICAgICAgLy9hbGVydCh0aGlzLmkpOwogICAgICAgICAgICBpZiAodGhpc1tpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1ldGhvZE5hbWUgPSB0aGlzLl9nZXRFdmVudE1ldGhvZE5hbWUoaSk7CiAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZE5hbWUpCiAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRPYmplY3QuZXZlbnQoJyIraSsiJywgZnVuYyk6IG1ldGhvZCAnIittZXRob2ROYW1lKyInIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QiKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0UmVwbGFjZUV2ZW50cyAmJiBpbl9hcnJheShtZXRob2ROYW1lLCB0aGlzLl9fb2JqZWN0UmVwbGFjZUV2ZW50cykpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWV0aG9kKG1ldGhvZE5hbWUsIHRoaXMucGFyYW1zWyJldmVudHMiXVtpXSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHRlbmRNZXRob2QobWV0aG9kTmFtZSwgdGhpcy5wYXJhbXNbImV2ZW50cyJdW2ldKTsKICAgICAgICAgICAgICAgIC8vZHVtcCh0aGlzW21ldGhvZE5hbWVdKTsKICAgICAgICAgICAgICAgIC8vdGhpcy5hZGRFdmVudChpLCB0aGlzLnBhcmFtc1siZXZlbnRzIl1baV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLnBhcmFtc1siZXZlbnRzIl1baV0pOwogICAgICAgIH0KICAgIH0KfTsKClRPYmplY3QucHJvdG90eXBlLl9leHRlbmRzID0gZnVuY3Rpb24oY2xhc3NOYW1lKQp7CiAgICByZXR1cm4odGhpcy5jbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8IHRoaXMuY2xhc3NOYW1lID09ICJUIitjbGFzc05hbWUgfHwgaW5fYXJyYXkoY2xhc3NOYW1lLCB0aGlzLmluaGVyaXRzKSB8fCBpbl9hcnJheSgiVCIrY2xhc3NOYW1lLCB0aGlzLmluaGVyaXRzKSk7Cn0KICAgIApUT2JqZWN0LnByb3RvdHlwZS5fYWZ0ZXJDcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuYXNzaWduT2JqZWN0VG9FbGVtZW50KCk7CiAgICB0aGlzLl9fY3JlYXRlZCA9IHRydWU7CiAgICB0aGlzLmFmdGVyQ3JlYXRlKCk7ICAgIAp9CgpUT2JqZWN0LnByb3RvdHlwZS5hZnRlckNyZWF0ZSA9IGZ1bmN0aW9uKCkKewp9CgpUT2JqZWN0LnByb3RvdHlwZS5hc3NpZ25PYmplY3RUb0VsZW1lbnQgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLmNvbnRhaW5lcikKICAgICAgICB0aGlzLmNvbnRhaW5lci5vYmplY3QgPSB0aGlzOwogICAgLy92YXIgZWxlbSA9IGdldEVsZW1lbnQodGhpcy5wYXJhbXNbImNvbnRhaW5lciJdKTsKICAgIC8vaWYgKHRoaXMucGFyYW1zWyJjb250YWluZXIiXSkKICAgIC8vICAgIGFsZXJ0KHRoaXMucGFyYW1zWyJjb250YWluZXIiXSk7CiAgICAvKgogICAgaWYgKHRoaXMucGFyYW1zWyJjb250YWluZXIiXSAmJiBnZXRFbGVtZW50KHRoaXMucGFyYW1zWyJjb250YWluZXIiXSkpCiAgICB7CiAgICAgICAgZ2V0RWxlbWVudCh0aGlzLnBhcmFtc1siY29udGFpbmVyIl0pLm9iamVjdCA9IHRoaXM7CiAgICB9CiAgICAqLwp9CgpUT2JqZWN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQp7CiAgICAvL3RoaXMuZHVtcCgnZGVzdHJveScpOwogICAgCiAgICAvLyB0cnkgdG8gZmluZCBhbGwgb2JqZWN0cwogICAgLy9kdW1wKHRoaXMuY29udGFpbmVyKTsKICAgIGlmICh0aGlzLmNvbnRhaW5lcikKICAgIHsKICAgICAgICB2YXIgb2JqZWN0cyA9IGZpbmRPYmplY3RzKHRoaXMuY29udGFpbmVyKTsKICAgICAgICAvL2R1bXAob2JqZWN0cyk7CiAgICAgICAgaWYgKG9iamVjdHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gb2JqZWN0cy5sZW5ndGgtMSA7IGkgPj0gMCA7IGktLSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG9iamVjdHNbaV0gIT0gdGhpcykKICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3Qob2JqZWN0c1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy9yZW1vdmVOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7IC8vIHdpbGwgY2F1c2UgcmVjdXJzaW9uIChkdWUgdG8gb25SZW1vdmVOb2RlIGV2ZW50KQogICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpCiAgICB7CiAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7CiAgICB9CiAgICAKICAgIC8vZWxzZQogICAgLy97CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudHMpOwogICAgICAgIGlmICh0aGlzLmVsZW1lbnRzKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldICYmIHRoaXMuZWxlbWVudHNbaV0ucGFyZW50Tm9kZSkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50c1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAvL30KICAgICAgICBpZiAodGhpcy5vYmplY3RzKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5vYmplY3RzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpXSkKICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QodGhpcy5vYmplY3RzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KfQoKVE9iamVjdC5wcm90b3R5cGUuaGFzTWV0aG9kID0gZnVuY3Rpb24obmFtZSkKewogICAgcmV0dXJuKHRoaXNbbmFtZV0gJiYgdHlwZW9mKHRoaXNbbmFtZV0pID09ICJmdW5jdGlvbiIpOwp9CgpUT2JqZWN0LnByb3RvdHlwZS5tZXRob2RFeGlzdHMgPSBUT2JqZWN0LnByb3RvdHlwZS5oYXNNZXRob2Q7CgpUT2JqZWN0LnByb3RvdHlwZS5kdW1wID0gZnVuY3Rpb24obywgY2xlYXIsIGxldmVsKQp7CiAgICBpZiAodGhpcy5kdW1wRGF0YSkKICAgIHsKICAgICAgICBpZiAodGhpcy5kdW1wU3BlZWQgJiYgKHR5cGVvZihvKSA9PSAib2JqZWN0IiB8fCB0eXBlb2YobykgPT0gImZ1bmN0aW9uIiB8fCBvLnRhZ05hbWUpKQogICAgICAgIHsKICAgICAgICAgICAgbyA9ICImbHQ7Iit0eXBlb2YobykrIiZndDsgKGRpc2FibGVkIGJ5IGR1bXBTcGVlZCkiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkdW1wKG8sIGNsZWFyLCBsZXZlbCwgdGhpcy5jbGFzc05hbWUpOwogICAgfQp9OwoKVE9iamVjdC5wcm90b3R5cGUuZHVtcFRpbWVTdGFydCA9IGZ1bmN0aW9uKHRleHQpCnsKICAgIGlmICh0aGlzLmR1bXBTcGVlZCkKICAgIHsKICAgICAgICBkdW1wVGltZVN0YXJ0KHRleHQpOwogICAgfQp9OwoKVE9iamVjdC5wcm90b3R5cGUuZHVtcFRpbWVDb250aW51ZSA9IGZ1bmN0aW9uKHRleHQpCnsKICAgIGlmICh0aGlzLmR1bXBTcGVlZCkKICAgIHsKICAgICAgICBkdW1wVGltZUNvbnRpbnVlKHRleHQpOwogICAgfQp9OwoKVE9iamVjdC5wcm90b3R5cGUuZHVtcFRpbWUgPSBmdW5jdGlvbih0ZXh0KQp7CiAgICBpZiAodGhpcy5kdW1wU3BlZWQpCiAgICB7CiAgICAgICAgZHVtcFRpbWUodGV4dCk7CiAgICB9Cn07CgpUT2JqZWN0LnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbih0b0NvbnRhaW5lciwgcG9zaXRpb24pCnsKICAgIGlmICh0eXBlb2YocG9zaXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBvc2l0aW9uID0gImxhc3QiOwoKICAgIHZhciBmcm9tQ29udGFpbmVycyA9IFtdOwogICAgaWYgKHR5cGVvZih0b0NvbnRhaW5lcikgPT0gIm9iamVjdCIgJiYgIXRvQ29udGFpbmVyLnRhZ05hbWUpIC8vIGl0IGlzIFRPYmplY3QgZGVyaXZlZCBvYmplY3QKICAgIHsKICAgICAgICB2YXIgT2JqZWN0ID0gdG9Db250YWluZXI7CiAgICAgICAgLy9jb250YWluZXIgPSBPYmplY3Qub2JqZWN0Q29udGFpbmVyOyAvLyB8fCBPYmplY3QuY29udGVudENvbnRhaW5lciB8fCBPYmplY3QuY29udGFpbmVyIHx8IE9iamVjdC5lbGVtZW50OwogICAgICAgIHRvQ29udGFpbmVyID0gT2JqZWN0LmNvbnRlbnRDb250YWluZXIgfHwgT2JqZWN0Lm9iamVjdENvbnRhaW5lciB8fCBPYmplY3QuY29udGFpbmVyIHx8IE9iamVjdC5lbGVtZW50OwogICAgfQogICAgZWxzZSBpZiAodHlwZW9mKHRvQ29udGFpbmVyKSA9PSAic3RyaW5nIikKICAgIHsKICAgICAgICB0b0NvbnRhaW5lciA9IGdldEVsZW1lbnQodG9Db250YWluZXIpOwogICAgfQoKICAgIC8vY29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7CiAgICBpZiAodGhpcy5lbGVtZW50cyAmJiB0aGlzLmVsZW1lbnRzLmxlbmd0aCkKICAgIHsKICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50cyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGggOyBpKyspICAKICAgICAgICB7ICAKICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnRzW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfdGhyb3coIlRPYmplY3QubW92ZVRvKCkgLSB0aGlzLmVsZW1lbnRzIGNvbnRhaW5zIG51bGwgaXRlbSAoc2VlIGlmIHRoaXMiKyIucGFyZW50X2NyZWF0ZSgpIGlzIGNhbGxlZCBhZnRlciB0aGlzLmNvbnRhaW5lcj1nZXRFbGVtZW50KC4uLikgb3IgdGhpcy5lbGVtZW50PWdldEVsZW1lbnQoLi4uKSkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcm9tQ29udGFpbmVycy5wdXNoKHRoaXMuZWxlbWVudHNbaV0pOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmcm9tQ29udGFpbmVycy5wdXNoKHRoaXMuY29udGFpbmVyIHx8IHRoaXMuZWxlbWVudCk7CiAgICB9CiAgICAKICAgIHRyeQogICAgewogICAgICAgIGlmIChwb3NpdGlvbiA9PSAiZmlyc3QiKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGZyb21Db250YWluZXJzLmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBmcm9tQ29udGFpbmVycy5sZW5ndGgtMSA7IGkgPj0wICA7IGktLSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZyb21Db250YWluZXIgPSBmcm9tQ29udGFpbmVyc1tpXTsKICAgICAgICAgICAgICAgIC8vZHVtcChmcm9tQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGFwcGVuZEZpcnN0KHRvQ29udGFpbmVyLCBmcm9tQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwb3NpdGlvbiA9PSAibGFzdCIgfHwgcG9zaXRpb24gPj0gdG9Db250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoZnJvbUNvbnRhaW5lcnMubGVuZ3RoKTsKICAgICAgICAgICAgLy9mb3IgKHZhciBpID0gZnJvbUNvbnRhaW5lcnMubGVuZ3RoLTEgOyBpID49MCAgOyBpLS0pCiAgICAgICAgICAgIC8vewogICAgICAgICAgICAvLyAgICB2YXIgZnJvbUNvbnRhaW5lciA9IGZyb21Db250YWluZXJzW2ldOwogICAgICAgICAgICAvLyAgICAvL2R1bXAoZnJvbUNvbnRhaW5lcik7CiAgICAgICAgICAgIC8vICAgIGFwcGVuZEZpcnN0KHRvQ29udGFpbmVyLCBmcm9tQ29udGFpbmVyKTsKICAgICAgICAgICAgLy99CiAgICAgICAgICAgIC8vZHVtcChmcm9tQ29udGFpbmVycyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGZyb21Db250YWluZXJzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZyb21Db250YWluZXIgPSBmcm9tQ29udGFpbmVyc1tpXTsKICAgICAgICAgICAgICAgIC8vZHVtcChmcm9tQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGFwcGVuZExhc3QodG9Db250YWluZXIsIGZyb21Db250YWluZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiZWZvcmVDb250YWluZXIgPSB0b0NvbnRhaW5lci5jaGlsZE5vZGVzW3Bvc2l0aW9uXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZnJvbUNvbnRhaW5lcnMubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnJvbUNvbnRhaW5lciA9IGZyb21Db250YWluZXJzW2ldOyAgLy8gIC8qdGhpcy5vYmplY3RDb250YWluZXIgfHwgdGhpcy5jb250ZW50Q29udGFpbmVyIHx8ICovdGhpcy5jb250YWluZXIgfHwgdGhpcy5lbGVtZW50OwogICAgICAgICAgICAgICAgLy90b0NvbnRhaW5lci5hcHBlbmRDaGlsZChmcm9tQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZShiZWZvcmVDb250YWluZXIsIGZyb21Db250YWluZXIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyAhISEhIEhBTkdTIElFIElOIEhUTUxBUkVBCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtcyA9IGZyb21Db250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZAogICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KGVsZW1zW2ldLm91dGVySFRNTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1zW2ldLm91dGVySFRNTCA9IGVsZW1zW2ldLm91dGVySFRNTDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICAgICAgdGhyb3coIlRPYmplY3QubW92ZVRvKCkgLSB0aGlzLm9iamVjdENvbnRhaW5lciBub3Qgc2V0Li4uIGxvb2sgYXQgKi5jcmVhdGUoKSBpZiAqLnBhcmVudF9jcmVhdGUoKSBpcyBjYWxsZWQgIitlKTsKICAgIH0KfQpUT2JqZWN0LnByb3RvdHlwZS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbihub2RlKQp7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldID09IG5vZGUpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgCiAgICB0aGlzLm1vdmVUbyhub2RlLnBhcmVudE5vZGUsIGktMSk7Cn0KClRPYmplY3QucHJvdG90eXBlLmluc2VydEFmdGVyID0gZnVuY3Rpb24obm9kZSkKewogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlc1tpXSA9PSBub2RlKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIAogICAgdGhpcy5tb3ZlVG8obm9kZS5wYXJlbnROb2RlLCBpKzEpOwp9CgpUT2JqZWN0LnByb3RvdHlwZS5zZXRDb250ZW50ID0gZnVuY3Rpb24oY29udGVudCkKewogICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGVudENvbnRhaW5lciB8fCAgdGhpcy5jb250YWluZXI7CiAgICAKICAgIGlmIChjb250YWluZXIpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihjb250ZW50KSA9PSAib2JqZWN0IiAmJiAhY29udGVudC50YWdOYW1lKSAvLyBKYXZhU2NyaXB0IE9iamVjdAogICAgICAgIHsKICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgICAgICAgICBjb250ZW50Lm1vdmVUbyhjb250YWluZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YoY29udGVudCkgPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICBzZXRIdG1sKGNvbnRhaW5lciwgY29udGVudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgICAgIH0KICAgIH0KfTsKClRPYmplY3QucHJvdG90eXBlLmNhbGxKYXZhU2NyaXB0TWV0aG9kID0gZnVuY3Rpb24obWV0aG9kTmFtZSwgcGFyYW1zKQp7CiAgICB2YXIgcmV0ID0gbnVsbDsKICAgIGlmICh0eXBlb2YocGFyYW1zKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXMgPSB7fTsKICAgIAogICAgdHJ5CiAgICB7CiAgICAgICAgdGhpc1ttZXRob2ROYW1lXShwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdLCBwYXJhbXNbNl0sIHBhcmFtc1s3XSwgcGFyYW1zWzhdLCBwYXJhbXNbOV0pOwogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICBfdGhyb3coImNhbGxKU01ldGhvZCgnIittZXRob2ROYW1lKyInKSBlcnJvcjogXG4iK2UpOwogICAgfQogICAgCiAgICByZXR1cm4ocmV0KTsKfQpUT2JqZWN0LnByb3RvdHlwZS5jYWxsSlNNZXRob2QgPSBUT2JqZWN0LnByb3RvdHlwZS5jYWxsSmF2YVNjcmlwdE1ldGhvZDsKClRPYmplY3QucHJvdG90eXBlLmNhbGxQSFBNZXRob2QgPSBmdW5jdGlvbihtZXRob2ROYW1lLCBwYXJhbXMsIHJldHVyblR5cGUsIGFzeW5jKQp7CiAgICBpZiAodHlwZW9mKHBhcmFtcykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgcGFyYW1zID0ge307CiAgICBpZiAodHlwZW9mKHJldHVyblR5cGUpID09ICJ1bmRlZmluZWQiIHx8ICFyZXR1cm5UeXBlKQogICAgICAgIHJldHVyblR5cGUgPSAicnRWYWx1ZSI7CiAgICAvL2R1bXAocmV0dXJuVHlwZSk7CiAgICAgICAgCiAgICBpZiAoIXBhcmFtc1siYWpheFZpZXdUeXBlIl0pCiAgICAgICAgcGFyYW1zWyJhamF4Vmlld1R5cGUiXSA9ICJ2dE9iamVjdCI7CiAgICAgICAgCiAgICBpZiAodGhpcy5wYXJhbXNbIm9iamVjdFRhYmxlTmFtZSJdICYmIHRoaXMucGFyYW1zWyJvYmplY3RGaWVsZE5hbWUiXSkKICAgIHsKICAgICAgICBwYXJhbXNbIm9iamVjdFRhYmxlTmFtZSJdID0gdGhpcy5wYXJhbXNbIm9iamVjdFRhYmxlTmFtZSJdOwogICAgICAgIHBhcmFtc1sib2JqZWN0RmllbGROYW1lIl0gPSB0aGlzLnBhcmFtc1sib2JqZWN0RmllbGROYW1lIl07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcGFyYW1zWyJvYmplY3ROYW1lIl0gPSB0aGlzLmNsYXNzTmFtZS5zdWJzdHJpbmcoMSwgMTAwKTsKICAgICAgICBwYXJhbXNbIm9iamVjdElkIl0gPSB0aGlzLmlkOwogICAgfQogICAgcGFyYW1zWyJtZXRob2ROYW1lIl0gPSBtZXRob2ROYW1lOwogICAgcGFyYW1zWyJyZXR1cm5UeXBlIl0gPSByZXR1cm5UeXBlOwogICAgCiAgICAvL2R1bXAodGhpcy5pZCk7CiAgICAvL2R1bXAocGFyYW1zKTsKICAgIC8vZHVtcCh0aGlzLnBhcmFtcyk7CiAgICAvL3RoaXMuZHVtcCgiVE9iamVjdC5jYWxsTWV0aG9kKCkiKTsKICAgIC8vdGhpcy5kdW1wKHBhcmFtcyk7CiAgICAKICAgIC8vZHVtcCgiISIpOwogICAgLy9kdW1wKGFzeW5jKTsKICAgIC8vZHVtcChwYXJhbXMpOwogICAgdmFyIGh0bWwgPSBBSkFYLmxvYWQocGFyYW1zLCBhc3luYyk7CiAgICAKICAgIC8vYWxlcnQoaHRtbCk7CiAgICAvL3RoaXMuZHVtcCgiVE9iamVjdC5jYWxsUEhQTWV0aG9kKCkgLSByZXN1bHQ6Iik7CiAgICAvL3RoaXMuZHVtcChodG1sKTsKICAgIAogICAgcmV0dXJuKGh0bWwpOwp9CgpUT2JqZWN0LnByb3RvdHlwZS5ydW5QSFBNZXRob2QgPSBmdW5jdGlvbihtZXRob2ROYW1lLCBwYXJhbXMpCnsKICAgIHZhciBodG1sID0gdGhpcy5jYWxsUEhQTWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtcyk7CgogICAgdmFyIGVsZW0gPSBjcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIGVsZW0pOwogICAgc2V0SHRtbChlbGVtLCBodG1sKTsKfQoKVE9iamVjdC5wcm90b3R5cGUuZ2V0U2libGluZ09iamVjdHMgPSBmdW5jdGlvbigpCnsKICAgIHZhciBzaWJsaW5nT2JqZWN0SWRzID0gdGhpcy5nZXRTaWJsaW5nT2JqZWN0SWRzKCk7CiAgICAKICAgIHZhciBvYmplY3RzID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBzaWJsaW5nT2JqZWN0SWRzLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBvYmplY3RzLnB1c2goZ2V0T2JqZWN0KHNpYmxpbmdPYmplY3RJZHNbaV0pKTsKICAgIH0KICAgIAogICAgcmV0dXJuKG9iamVjdHMpOwp9CgpUT2JqZWN0LnByb3RvdHlwZS5nZXRTaWJsaW5nT2JqZWN0ID0gZnVuY3Rpb24oaWQpCnsKICAgIC8vIFRPRE8gLSBjaGFuZ2UgdXNpbmcgZ2V0U2libGluZ09iamVjdElkLi4uIGFuZCBnZXRPYmplY3QuLi4KICAgIHZhciBPYmplY3QgPSBudWxsOyAgICAKICAgIHZhciBlbGVtID0gdGhpcy5jb250YWluZXI7CiAgICB2YXIgdXNlRGlhbG9nID0gdHJ1ZTsKICAgIHdoaWxlKGVsZW0pCiAgICB7CiAgICAgICAgaWYgKGVsZW0udGFnTmFtZSAmJiBlbGVtLnRhZ05hbWUgPT0gIlRSIikKICAgICAgICB7CiAgICAgICAgICAgIHVzZURpYWxvZyA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTsKICAgIH0KICAgIAogICAgdmFyIERpYWxvZyA9IG51bGw7CiAgICAvL2R1bXAodXNlRGlhbG9nKTsKICAgIGlmICh1c2VEaWFsb2cgJiYgd2luZG93LmdldERpYWxvZykKICAgICAgICBEaWFsb2cgPSBnZXREaWFsb2codGhpcyk7CiAgICAKICAgIGlmIChEaWFsb2cpCiAgICAgICAgT2JqZWN0ID0gRGlhbG9nLmdldE9iamVjdChpZCk7CiAgICAKICAgIC8vZHVtcChPYmplY3QpOwogICAgaWYgKCFPYmplY3QpCiAgICB7CiAgICAgICAgLy9kdW1wKGlkKTsKICAgICAgICAvL2R1bXAodGhpcy5nZXRTaWJsaW5nT2JqZWN0SWQoaWQpKTsKICAgICAgICBPYmplY3QgPSBnZXRPYmplY3QodGhpcy5nZXRTaWJsaW5nT2JqZWN0SWQoaWQpKTsKICAgICAgICAgICAgCiAgICAgICAgLy8gdHJ5IHRvIGZpbmQgb2JqZWN0IGJ5IGlkCiAgICAgICAgaWYgKCFPYmplY3QpCiAgICAgICAgewogICAgICAgICAgICBPYmplY3QgPSBnZXRPYmplY3QoaWQpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKE9iamVjdCk7Cn0KICAgIApUT2JqZWN0LnByb3RvdHlwZS5nZXRTaWJsaW5nT2JqZWN0SWQgPSBmdW5jdGlvbihmaWVsZCkKewogICAgdmFyIGlkcyA9IHRoaXMuZ2V0U2libGluZ09iamVjdElkcyhbZmllbGRdKTsKICAgIHJldHVybihpZHNbZmllbGRdKTsKfQoKVE9iamVjdC5wcm90b3R5cGUuZ2V0U2libGluZ09iamVjdElkcyA9IGZ1bmN0aW9uKGZpZWxkcykKewogICAgaWYgKHR5cGVvZihmaWVsZHMpID09ICJ1bmRlZmluZWQiKQogICAgewogICAgICAgIGlmICh0aGlzLmlkLmluZGV4T2YoIlsiKSAhPSAtMSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfaWQgPSB0aGlzLmlkOwogICAgICAgICAgICBfaWQgPSBfaWQuc3BsaXQoIlsiKTsKICAgICAgICAgICAgX2lkLnBvcCgpOwogICAgICAgICAgICBfaWQgPSBfaWQuam9pbigiWyIpOwoKICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIF9vYmplY3RzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaS5pbmRleE9mKF9pZCkgPT09IDAgJiYgaSAhPSB0aGlzLmlkICYmIGlbaS5sZW5ndGgtMV0gPT0gIl0iKQogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4oaWRzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKFtdKTsKICAgICAgICB9CiAgICB9CgogICAgLy9kdW1wKGZpZWxkcyk7CiAgICAvL2R1bXAodGhpcy5pZCk7CiAgICB2YXIgc2libGluZ0lkcyA9IHt9OwogICAgdmFyIHJlcGxhY2VtZW50cyA9IFtdOwogICAgaWYgKHRoaXMuaWQuaW5kZXhPZigiWyIpICE9IC0xKQogICAgewogICAgICAgIC8vIHBhcnQgb2YgYXJyYXkKICAgICAgICB2YXIgX2lkID0gdGhpcy5pZDsKICAgICAgICAvL2R1bXAoX2lkKTsKICAgICAgICAKICAgICAgICAvLyBmb3Igc2l0dWF0aW9ucywgd2hlcmUgdGhlcmUgaXMgbm9uIFtdIGluc2lkZSBvdGhlcgogICAgICAgIC8vIHJlY29yZFtyZWNpcGllbnRUYWJsZXNdW2NlYjY5Y2FiLTA4Y2ItNDA1Yy05YThlLWFlODg5ZmM5ODQ4MF1bZmlsdGVyc11EaWFsb2dfZ3JpZFswZmY4NTM5OS1jZDVlLTQxZDAtYjhhOC0xNDhkOWQ3YWI2YjFdW2ZpZWxkXQogICAgICAgIHZhciBtYXRjaGVzID0gX2lkLm1hdGNoKC9cXShbXlxbXSspL2cpOwogICAgICAgIC8vZHVtcChtYXRjaGVzKTsKICAgICAgICBpZiAobWF0Y2hlcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG1hdGNoZXMubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeGlkID0gbWF0Y2hlc1tpXS5zdWJzdHJpbmcoMSwgMTAwMCk7CiAgICAgICAgICAgICAgICByZXBsYWNlbWVudHMucHVzaCh4aWQpOwogICAgICAgICAgICAgICAgX2lkID0gc3RyX3JlcGxhY2UoeGlkLCAiWyIreGlkKyJdIiwgX2lkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL2R1bXAocmVwbGFjZW1lbnRzKTsKICAgICAgICAvL19pZCA9IF9pZC5yZXBsYWNlKC9cXVteXFtdKy9nLCAiWyQxXSIpOwogICAgICAgIAogICAgICAgIF9pZCA9IHN0cl9yZXBsYWNlKCJdIiwgIiIsIF9pZCk7CiAgICAgICAgX2lkID0gX2lkLnNwbGl0KCJbIik7CiAgICAgICAgCiAgICAgICAgLy92YXIgbmFtZSA9IF9pZFtfaWQubGVuZ3RoLTFdOwogICAgICAgIF9pZC5wb3AoKTsKICAgICAgICB2YXIgbmFtZSA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IF9pZC5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoaSA9PSAwKQogICAgICAgICAgICAgICAgbmFtZSA9IF9pZFswXTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbmFtZSArPSAiWyIrX2lkW2ldKyJdIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZmllbGRzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfbmFtZSA9IGZpZWxkc1tpXTsKICAgICAgICAgICAgLy9kdW1wKF9uYW1lKTsKICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZXBsYWNlIG9ubHkgbGFzdCBvY2N1cmVuY2UhIHJlY29yZFt0cmFuc2xhdGVkVGV4dF1bMDAwMV1bdHJhbnNsYXRlZFRleHRdID0+IHJlY29yZFt0cmFuc2xhdGVkVGV4dF1bMDAwMV1bbGFuZ3VhZ2VdCiAgICAgICAgICAgIAogICAgICAgICAgICAvL3ZhciBfaWQgPSBzdHJfcmVwbGFjZSgiWyIrbmFtZSsiXSIsICJbIitfbmFtZSsiXSIsIHRoaXMuaWQpOwogICAgICAgICAgICAKICAgICAgICAgICAgc2libGluZ0lkc1tfbmFtZV0gPSBuYW1lKyJbIitfbmFtZSsiXSI7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgX2lkID0gZmllbGRzW2ldOwogICAgICAgICAgICBzaWJsaW5nSWRzW19pZF0gPSBfaWQ7CiAgICAgICAgfQogICAgfSAKICAgIAogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgcmVwbGFjZW1lbnRzLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBmb3IgKHZhciBpZCBpbiBzaWJsaW5nSWRzKQogICAgICAgIHsKICAgICAgICAgICAgc2libGluZ0lkc1tpZF0gPSBzdHJfcmVwbGFjZSgiWyIrcmVwbGFjZW1lbnRzW2ldKyJdIiwgcmVwbGFjZW1lbnRzW2ldLCBzaWJsaW5nSWRzW2lkXSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvL2R1bXAoc2libGluZ0lkcyk7CiAgICByZXR1cm4oc2libGluZ0lkcyk7Cn0KClRPYmplY3QucHJvdG90eXBlLmV4dGVuZE1ldGhvZCA9IGZ1bmN0aW9uKG1ldGhvZCwgZnVuYykKewogICAgLy9kdW1wKHRoaXMuaWQrIjogIittZXRob2QpOwogICAgZXh0ZW5kTWV0aG9kKHRoaXMsIG1ldGhvZCwgZnVuYyk7Cn0KClRPYmplY3QucHJvdG90eXBlLnJlcGxhY2VNZXRob2QgPSBmdW5jdGlvbihtZXRob2QsIGZ1bmMpCnsKICAgIHJlcGxhY2VNZXRob2QodGhpcywgbWV0aG9kLCBmdW5jKTsKfQoKVE9iamVjdC5wcm90b3R5cGUuX2dldEV2ZW50TWV0aG9kTmFtZSA9IGZ1bmN0aW9uKGV2ZW50KQp7CiAgICB2YXIgc01ldGhvZE5hbWUgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgdmFyIG1ldGhvZE5hbWUgPSAiIjsKICAgIGZvciAodmFyIGkgaW4gdGhpcykKICAgIHsKICAgICAgICBpZiAoaS50b0xvd2VyQ2FzZSgpID09IHNNZXRob2ROYW1lIHx8IGkudG9Mb3dlckNhc2UoKSA9PSAib24iK3NNZXRob2ROYW1lKQogICAgICAgIHsKICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKG1ldGhvZE5hbWUpOwp9CgpUT2JqZWN0LnByb3RvdHlwZS5hZGRFdmVudCA9IGZ1bmN0aW9uKGV2ZW50LCBmdW5jKQp7CiAgICB2YXIgbWV0aG9kTmFtZSA9IHRoaXMuX2dldEV2ZW50TWV0aG9kTmFtZShldmVudCk7CiAgICAvL2R1bXAoIi0tLS0iKTsKICAgIC8vZHVtcChldmVudCk7CiAgICAvL2R1bXAoZnVuYyk7CiAgICAvL2R1bXAobWV0aG9kTmFtZSk7CiAgICAKICAgIGlmICghbWV0aG9kTmFtZSkKICAgICAgICB0aHJvdygiVE9iamVjdC5hZGRFdmVudCgnIitldmVudCsiJywgZnVuYyk6IG1ldGhvZCAnIittZXRob2ROYW1lKyInIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QiKTsKICAgICAgICAgICAgICAgICAgICAKICAgIGlmICghdGhpcy5ldmVudHMpCiAgICAgICAgdGhpcy5ldmVudHMgPSB7fTsKCiAgICAvL2R1bXAodGhpcy5ldmVudHNbbWV0aG9kTmFtZV0pOwogICAgaWYgKCF0aGlzLmV2ZW50c1ttZXRob2ROYW1lXSkKICAgIHsKICAgICAgICB0aGlzLmV2ZW50c1ttZXRob2ROYW1lXSA9IFtdOwogICAgICAgIC8vZHVtcChtZXRob2ROYW1lKTsKICAgICAgICB2YXIgZm5jID0gIiI7CiAgICAgICAgZm5jICs9ICJmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLmV2ZW50c1snIittZXRob2ROYW1lKyInXS5sZW5ndGggOyBpKyspIFxuIjsKICAgICAgICBmbmMgKz0gInsiOwogICAgICAgIGZuYyArPSAiICAgdGhpcy5ldmVudHNbJyIrbWV0aG9kTmFtZSsiJ11baV0oYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0sYXJndW1lbnRzWzZdLGFyZ3VtZW50c1s3XSxhcmd1bWVudHNbOF0sYXJndW1lbnRzWzldKTsiOwogICAgICAgIGZuYyArPSAifSI7CgogICAgICAgIHRoaXMuZXh0ZW5kTWV0aG9kKG1ldGhvZE5hbWUsIGZuYyk7CiAgICB9CgogICAgdGhpcy5ldmVudHNbbWV0aG9kTmFtZV0ucHVzaChmdW5jKTsKfQoKVE9iamVjdC5wcm90b3R5cGUuZ2V0Q29udGV4dE1lbnUgPSBmdW5jdGlvbigpCnsKICAgIC8vZHVtcCgiLSIpOwogICAgLy9kdW1wKHRoaXMuY2xhc3NOYW1lKTsKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIC8vZHVtcCh0aGlzLnBhcmFtc1siY29udGV4dE1lbnVJZCJdKTsKICAgIHZhciBDb250ZXh0TWVudSA9IGdldE9iamVjdCh0aGlzLnBhcmFtc1siY29udGV4dE1lbnVJZCJdKTsKICAgIAogICAgaWYgKCFDb250ZXh0TWVudSkKICAgIHsKICAgICAgICB2YXIgcGFyYW1zID0gdGhpcy5wYXJhbXM7CiAgICAgICAgcGFyYW1zWyJfUkVRVUVTVCJdID0gZXhwbG9kZUxpbmsod2luZG93LmxvY2F0aW9uLmhyZWYpWyJwYXJhbXMiXTsKICAgICAgICAvL2R1bXAocGFyYW1zKTsKICAgICAgICBpZiAodGhpcy5mb3JtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGdldFZhbHVlc0luRWxlbWVudCh0aGlzLmZvcm0pOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbHVlcykKICAgICAgICAgICAgICAgIHBhcmFtc1siX1JFUVVFU1QiXVtpXSA9IHZhbHVlc1tpXTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgLy92YXIgdmFsdWVzID0ge307CiAgICAgICAgLy9pZiAodGhpcy5mb3JtKQogICAgICAgIC8vICAgIHZhbHVlcyA9IGdldFZhbHVlc0luRWxlbWVudCh0aGlzLmZvcm0pOwoKICAgICAgICB2YXIgdXJsUGFyYW1zID0gZXhwbG9kZUxpbmsod2luZG93LmxvY2F0aW9uLmhyZWYpWyJwYXJhbXMiXTsKCiAgICAgICAgLy9mb3IgKHZhciBpIGluIHZhbHVlcykKICAgICAgICAvLyAgICBwYXJhbXNbaV0gPSB2YWx1ZXNbaV07CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSBpbiB1cmxQYXJhbXMpCiAgICAgICAgICAgIHBhcmFtc1tpXSA9IHVybFBhcmFtc1tpXTsKICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMucGFyYW1zKQogICAgICAgICAgICBwYXJhbXNbaV0gPSB0aGlzLnBhcmFtc1tpXTsKICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vZHVtcChwYXJhbXMpOwogICAgICAgIHZhciBodG1sID0gdGhpcy5jYWxsUEhQTWV0aG9kKCJnZXRDb250ZXh0TWVudUh0bWwiLCBwYXJhbXMpOwogICAgICAgIGlmIChodG1sKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGR1bW15ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBmaW5kaW5nIGVsZW1lbnRzIGJ5IGlkCiAgICAgICAgICAgIGR1bW15LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHVtbXkpOwoKICAgICAgICAgICAgc2V0SHRtbChkdW1teSwgaHRtbCk7CiAgICAgICAgfQoKICAgICAgICBDb250ZXh0TWVudSA9IGdldE9iamVjdCh0aGlzLnBhcmFtc1siY29udGV4dE1lbnVJZCJdKTsKICAgICAgICAvL2R1bXAoQ29udGV4dE1lbnUpOwogICAgfQoKICAgIHJldHVybihDb250ZXh0TWVudSk7Cn0KCmlmICh0eXBlb2YoX29iamVjdHMpID09ICJ1bmRlZmluZWQiKQogICAgX29iamVjdHMgPSB7fTsKCmZ1bmN0aW9uIGdldE9iamVjdChpZCwgcGFyYW1zKSAvLyBpZiBvYmplY3Qgbm90IGZvdW5kIGFuZCBwYXJhbXMgZXhpc3QsIHRyeSB0byBjcmVhdGUgb25lCnsKICAgIC8vYWxlcnQoX29iamVjdHMpOwogICAgCiAgICBpZiAodHlwZW9mKGlkKSA9PSAib2JqZWN0IiB8fCB0eXBlb2YoaWQpID09ICJmdW5jdGlvbiIpCiAgICAgICAgcmV0dXJuKGlkKTsKICAgIAogICAgaWYgKGlkID09ICJCcm93c2VyIikKICAgICAgICByZXR1cm4oQnJvd3Nlcik7CgogICAgaWYgKF9vYmplY3RzW2lkXSkKICAgIHsKICAgICAgICAvL2FsZXJ0KF9vYmplY3RzW2lkXS5pZCk7CiAgICAgICAgLy9kdW1wKCJYIitpZCk7CiAgICAgICAgcmV0dXJuKF9vYmplY3RzW2lkXSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9hbGVydChpZCk7CiAgICAgICAgLy9hbGVydChUcmFuc2xhdG9ycyk7CiAgICB9CiAgICAKICAgIGlmIChwYXJhbXMpCiAgICB7CiAgICAgICAgcmV0dXJuKGNyZWF0ZU9iamVjdChpZCwgcGFyYW1zKSk7CiAgICB9CiAgICAKICAgIHJldHVybihudWxsKTsKfQoKZnVuY3Rpb24gZ2V0T2JqZWN0QXN5bmMob2JqZWN0LCBhc3luYykKewogICAgaWYgKHR5cGVvZihvYmplY3QpID09ICJvYmplY3QiICYmIG9iamVjdC5jbGFzc05hbWUgJiYgb2JqZWN0LmNsYXNzTmFtZVswXSA9PSAiVCIpCiAgICB7CiAgICAgICAgYXN5bmMob2JqZWN0KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBjcmVhdGVPYmplY3Qob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSwgb2JqZWN0WzNdLCBhc3luYyk7CiAgICB9Cn0KCmZ1bmN0aW9uIGZpbmRPYmplY3QoZWxlbSwgY2xhc3NOYW1lKQp7CiAgICB3aGlsZShlbGVtKQogICAgewogICAgICAgIC8vZHVtcChlbGVtKTsKICAgICAgICBpZiAoZWxlbS5vYmplY3QgJiYgKHR5cGVvZihjbGFzc05hbWUpID09ICJ1bmRlZmluZWQiIHx8IGVsZW0ub2JqZWN0LmNsYXNzTmFtZSA9PSBjbGFzc05hbWUpKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGVsZW0ub2JqZWN0KTsKICAgICAgICAgICAgcmV0dXJuKGVsZW0ub2JqZWN0KTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICB9CiAgICAKICAgIHJldHVybihudWxsKTsKfQoKZnVuY3Rpb24gZ2V0T2JqZWN0cygpCnsKICAgIHJldHVybihfb2JqZWN0cyk7Cn0KCmZ1bmN0aW9uIGdldE9iamVjdHNCeUNsYXNzTmFtZShjbGFzc05hbWUpCnsKICAgIHZhciBvYmplY3RzID0gW107CiAgICB2YXIgX29iamVjdHMgPSBnZXRPYmplY3RzKCk7CiAgICBmb3IgKHZhciBfaWQgaW4gX29iamVjdHMpCiAgICB7CiAgICAgICAgdmFyIE9iamVjdCA9IF9vYmplY3RzW19pZF07CiAgICAgICAgLy9kdW1wKE9iamVjdC5pbmhlcml0cyk7CiAgICAgICAgLy9kdW1wKE9iamVjdC5jb25zdHJ1Y3Rvcik7CiAgICAgICAgLy9kdW1wKE9iamVjdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpOwogICAgICAgIC8vZHVtcChPYmplY3QuY2xhc3NOYW1lKyI6KCIrY2xhc3NOYW1lKyIpICIrKE9iamVjdC5pbmhlcml0cyA/IE9iamVjdC5pbmhlcml0cy5qb2luKCIsIikgOiAiIikpOwogICAgICAgIGlmIChPYmplY3QgJiYgT2JqZWN0LmNsYXNzTmFtZSA9PSBjbGFzc05hbWUgfHwgKE9iamVjdC5pbmhlcml0cyAmJiBpbl9hcnJheShjbGFzc05hbWUsIE9iamVjdC5pbmhlcml0cykpKQogICAgICAgICAgICBvYmplY3RzLnB1c2goT2JqZWN0KTsKICAgIH0KICAgIAogICAgcmV0dXJuKG9iamVjdHMpOwp9CgpmdW5jdGlvbiBhZGRPYmplY3Qob2JqZWN0LCBpZCkKewogICAgaWYgKCFvYmplY3QuY2xhc3NOYW1lKQogICAgeyAgICAKICAgICAgICAvLyBnZXQgbmFtZSBvZiBjbGFzcwogICAgICAgIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKICAgICAgICB3aGlsZShjYWxsZXIpCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICBvYmplY3QuY2xhc3NOYW1lID0gY2FsbGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lOwogICAgICAgICAgICAqLwogICAgICAgICAgICAvL2FsZXJ0KGNhbGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IpOwogICAgICAgICAgICAvL2FsZXJ0KG9iamVjdC5pZCk7CiAgICAgICAgICAgIC8vZHVtcCgnMScpOwogICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKGNhbGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IpOwogICAgICAgICAgICBpZiAoY2xhc3NOYW1lICYmIGNsYXNzTmFtZSAhPSAiYWRkT2JqZWN0IikgLy8gSUU8PTgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICBvYmplY3QuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgICAgICBjYWxsZXIgPSBjYWxsZXIuY2FsbGVyOwogICAgICAgIH0KICAgIH0KICAgIG9iamVjdC5vYmplY3ROYW1lID0gb2JqZWN0LmNsYXNzTmFtZS5zdWJzdHJpbmcoMSwgMTAwKTsKICAgIAogICAgLy9vYmplY3QuY2xhc3NOYW1lID0gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWU7CiAgICAKICAgIGlmICghb2JqZWN0LmlkICYmIGlkKQogICAgICAgIG9iamVjdC5pZCA9IGlkOwogICAgZWxzZSBpZiAoIWlkKQogICAgICAgIGlkID0gb2JqZWN0LmlkCiAgICAvL2lmICghaWQpCiAgICAvLyAgICBpZCA9IG9iamVjdC5pZAogICAgCiAgICAvL2FsZXJ0KCJhZGRPYmplY3Q6ICIrb2JqZWN0LmlkKyIgIitvYmplY3QuY2xhc3NOYW1lKTsKICAgIAogICAgLy8gYWRkIHBhdGgKICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgc2NyaXB0cy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIHBhdGggPSBzY3JpcHRzW2ldLnNyYzsKICAgICAgICBpZiAocGF0aCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAob2JqZWN0LmNsYXNzTmFtZS5zdWJzdHJpbmcoMSwgMTAwKSsiXFwuY2xhc3NcXC5qcyIsICIiKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhdGguc2VhcmNoKHJlKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb2JqZWN0LnBhdGggPSBwYXRoLnN1YnN0cmluZygwLCByZXN1bHQpCiAgICAgICAgICAgICAgICAvL2FsZXJ0KG9iamVjdC5wYXRoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAoIWlkKQogICAgewogICAgICAgIG9iamVjdC5pZCA9ICJfIitVVUlEKCk7CiAgICAgICAgX3Rocm93KCJhZGRPYmplY3Q6IG9iamVjdCBvZiBjbGFzcyAiK29iamVjdC5jbGFzc05hbWUrIiBoYXMgbm8gaWQiLCBmYWxzZSk7CiAgICAgICAgLy9yZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy9hbGVydChvYmplY3QpOwogICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgaWYgKF9vYmplY3RzW2lkXSkKICAgIHsKICAgICAgICAvL2R1bXAoImFkZE9iamVjdDogb2JqZWN0ICciK2lkKyInIGFscmVhZHkgZXhpc3RzIChyZXBsYWNpbmcpIik7CiAgICAgICAgaWYgKGlzRGV2ZWxvcGVyKCkgJiYgIV9vYmplY3RzW2lkXS5jb3JlKQogICAgICAgICAgICBfdGhyb3coImFkZE9iamVjdDogb2JqZWN0ICciK2lkKyInIGFscmVhZHkgZXhpc3RzIChyZXBsYWNpbmcpIC4uLiAoZGlzcGxheWVkIG9ubHkgdG8gZGV2ZWxvcGVyKSIpOwogICAgICAgIC8vIHJlcGxhY2UgaXQKICAgICAgICBpZiAoIV9vYmplY3RzW2lkXS5jb3JlKQogICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgfQogICAgCiAgICBpZiAoIWV4aXN0cykKICAgIHsKICAgICAgICAvL2FsZXJ0KG9iamVjdC5pZCk7CiAgICAgICAgb2JqZWN0Ll9hZGRlZCA9IHRydWU7CiAgICAgICAgX29iamVjdHNbaWRdID0gb2JqZWN0OwogICAgICAgIC8vaWYgKG9iamVjdC5pZCA9PSAiVHJhbnNsYXRvcnMiKQogICAgICAgIC8vICAgIGFsZXJ0KGdldE9iamVjdChvYmplY3QuaWQpKTsKICAgIH0KfQpmdW5jdGlvbiBjcmVhdGVPYmplY3RBc3luYyhvYmplY3ROYW1lLCBwYXJhbXMsIGFzeW5jKQp7CiAgICByZXR1cm4oY3JlYXRlT2JqZWN0KG9iamVjdE5hbWUsIHBhcmFtcywgcGFyYW1zWyJpZCJdLCBudWxsLCBhc3luYykpOwp9CgpmdW5jdGlvbiBjcmVhdGVPYmplY3Qob2JqZWN0TmFtZSwgcGFyYW1zLCBpZCwgY29udGFpbmVyLCBhc3luYykKewogICAgLy9kdW1wKCdjcmVhdGVPYmplY3QoJytvYmplY3ROYW1lKycpJyk7CiAgICAvL2R1bXAocGFyYW1zKTsKICAgIGlmICh0eXBlb2YocGFyYW1zKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXMgPSB7fTsKICAgIGlmICh0eXBlb2YoaWQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGlkID0gcGFyYW1zWyJpZCJdOwogICAgaWYgKHR5cGVvZihpZCkgPT0gInVuZGVmaW5lZCIgfHwgIWlkKQogICAgICAgIGlkID0gVVVJRCgpOwogICAgLy9kdW1wKGlkKTsKICAgIAogICAgcGFyYW1zWyJhamF4Vmlld1R5cGUiXSA9ICJ2dE9iamVjdCI7CiAgICBwYXJhbXNbIm9iamVjdE5hbWUiXSA9IG9iamVjdE5hbWU7IC8vIHNob3VsZCBiZSBvYmplY3RUeXBlCiAgICAvL3BhcmFtc1siaWQiXSA9IGlkOwogICAgcGFyYW1zWyJvYmplY3RJZCJdID0gaWQ7CiAgICBwYXJhbXNbInJldHVyblR5cGUiXSA9ICJydFZhbHVlIjsKICAgIAogICAgdmFyIG9uTG9hZCA9IGZ1bmN0aW9uKGh0bWwpewogICAgICAgIGlmIChjb250YWluZXIpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyTm9kZSA9IGdldEVsZW1lbnQoY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lck5vZGUgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgY29udGFpbmVyTm9kZSk7IC8vIHRvIGVuYWJsZSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxhc3RMb2FkZWRIdG1sID0gaHRtbDsKICAgICAgICBzZXRIdG1sKGNvbnRhaW5lck5vZGUsIGh0bWwpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgiLS0iKTsKICAgICAgICAvL2R1bXAoY29udGFpbmVyKTsKICAgICAgICAvL2R1bXAoY29udGFpbmVyTm9kZSk7CiAgICAgICAgLy9kdW1wKGh0bWwpOwogICAgICAgIC8vZHVtcChpZCk7CiAgICAgICAgdmFyIE9iamVjdCA9IF9vYmplY3RzW2lkXTsKICAgICAgICAvL2R1bXAoT2JqZWN0KTsKCiAgICAgICAgaWYgKCFPYmplY3QpCiAgICAgICAgICAgIF90aHJvdygiY3JlYXRlT2JqZWN0KCciK29iamVjdE5hbWUrIicpOiBPYmplY3Qgbm90IGZvdW5kIGJ5IGlkICciK2lkKyInLiIpOwoKICAgICAgICBpZiAoIU9iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBrZXlzID0gYXJyYXlfa2V5cyhfb2JqZWN0cyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBrZXlzLmxlbmd0aC0xIDsgaSA+PSAwIDsgaS0tKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX2lkID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgIGlmIChfb2JqZWN0c1tfaWRdLmNsYXNzTmFtZSAmJiAoX29iamVjdHNbX2lkXS5jbGFzc05hbWUuc3Vic3RyaW5nKDEsIDEwMCkgPT0gb2JqZWN0TmFtZSB8fCBfb2JqZWN0c1tfaWRdLmNsYXNzTmFtZS5zdWJzdHJpbmcoMSwgMTAwKSA9PSBvYmplY3ROYW1lLnN1YnN0cmluZygwLCBvYmplY3ROYW1lLmxlbmd0aC0xKSkpIC8vIHRoZSBzZWNvbmQgaXMgdGVtcG9yYXJ5IGZvciBUVGFiU2hlZXQgLT4gVFRhYlNoZWV0MgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE9iamVjdCA9IF9vYmplY3RzW19pZF07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFPYmplY3QpCiAgICAgICAgICAgIF90aHJvdygiY3JlYXRlT2JqZWN0KCciK29iamVjdE5hbWUrIicpOiBPYmplY3Qgbm90IGZvdW5kIGJ5IG5hbWUgJyIrb2JqZWN0TmFtZSsiJy4gU2VlIGZvciB4eHggPSBuZXcgVHh4eCBpbiAiK29iamVjdE5hbWUrIi5jbGFzcy5waHAgZmlsZSIpOwogICAgICAgIAogICAgICAgIAogICAgICAgIGlmIChhc3luYykKICAgICAgICAgICAgYXN5bmMoT2JqZWN0KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybihPYmplY3QpOwogICAgfTsKICAgIAogICAgaWYgKGFzeW5jKQogICAgewogICAgICAgIC8vZHVtcCgiQUpBWC5sb2FkIC0gYXN5bmM6Iik7CiAgICAgICAgLy9kdW1wKHBhcmFtcyk7CiAgICAgICAgQUpBWC5sb2FkKHBhcmFtcywgb25Mb2FkKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL2R1bXAocGFyYW1zKTsKICAgICAgICB2YXIgaHRtbCA9IEFKQVgubG9hZChwYXJhbXMpOwogICAgICAgIHJldHVybihvbkxvYWQoaHRtbCkpOwogICAgfQp9CgpmdW5jdGlvbiBjcmVhdGVFeHRlcm5PYmplY3QoY2xhc3NOYW1lLCBwYXJhbXMsIGlkLCBwc2V1ZG9DbGFzc05hbWUpCnsKICAgIGlmICh0eXBlb2YocGFyYW1zKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXMgPSB7fTsKICAgIGlmICh0eXBlb2YoaWQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGlkID0gVVVJRCgpOwogICAgaWYgKHR5cGVvZihwc2V1ZG9DbGFzc05hbWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBzZXVkb0NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKCiAgICAvL2FsZXJ0KGNsYXNzTmFtZSk7CiAgICB2YXIgbCA9IHBhcmFtcy5sZW5ndGg7CiAgICBpZiAobCA9PSAwKQogICAgICAgIHZhciBvYmogPSBuZXcgd2luZG93W2NsYXNzTmFtZV0oKTsKICAgIGlmIChsID09IDEpCiAgICAgICAgdmFyIG9iaiA9IG5ldyB3aW5kb3dbY2xhc3NOYW1lXShwYXJhbXNbMF0pOwogICAgaWYgKGwgPT0gMikKICAgICAgICB2YXIgb2JqID0gbmV3IHdpbmRvd1tjbGFzc05hbWVdKHBhcmFtc1swXSwgcGFyYW1zWzFdKTsKICAgIGlmIChsID09IDMpCiAgICAgICAgdmFyIG9iaiA9IG5ldyB3aW5kb3dbY2xhc3NOYW1lXShwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdKTsKICAgIGlmIChsID09IDQpCiAgICAgICAgdmFyIG9iaiA9IG5ldyB3aW5kb3dbY2xhc3NOYW1lXShwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10pOwogICAgaWYgKGwgPT0gNSkKICAgICAgICB2YXIgb2JqID0gbmV3IHdpbmRvd1tjbGFzc05hbWVdKHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSwgcGFyYW1zWzRdKTsKICAgIGlmIChsID09IDYpCiAgICAgICAgdmFyIG9iaiA9IG5ldyB3aW5kb3dbY2xhc3NOYW1lXShwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdKTsKICAgIGlmIChsID09IDcpCiAgICAgICAgdmFyIG9iaiA9IG5ldyB3aW5kb3dbY2xhc3NOYW1lXShwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdLCBwYXJhbXNbNl0pOwogICAgaWYgKGwgPT0gOCkKICAgICAgICB2YXIgb2JqID0gbmV3IHdpbmRvd1tjbGFzc05hbWVdKHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSwgcGFyYW1zWzRdLCBwYXJhbXNbNV0sIHBhcmFtc1s2XSwgcGFyYW1zWzddKTsKICAgIGlmIChsID09IDkpCiAgICAgICAgdmFyIG9iaiA9IG5ldyB3aW5kb3dbY2xhc3NOYW1lXShwYXJhbXNbMF0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdLCBwYXJhbXNbNl0sIHBhcmFtc1s3XSwgcGFyYW1zWzhdKTsKICAgIGlmIChsID09IDEwKQogICAgICAgIHZhciBvYmogPSBuZXcgd2luZG93W2NsYXNzTmFtZV0ocGFyYW1zWzBdLCBwYXJhbXNbMV0sIHBhcmFtc1syXSwgcGFyYW1zWzNdLCBwYXJhbXNbNF0sIHBhcmFtc1s1XSwgcGFyYW1zWzZdLCBwYXJhbXNbN10sIHBhcmFtc1s4XSwgcGFyYW1zWzldKTsKICAgICAgICAKICAgIGlmIChvYmopCiAgICB7CiAgICAgICAgb2JqLmlkID0gaWQ7CiAgICAgICAgb2JqLmNsYXNzTmFtZSA9IHBzZXVkb0NsYXNzTmFtZTsKICAgICAgICBhZGRPYmplY3Qob2JqKTsKICAgICAgICAKICAgICAgICB2YXIgX29iaiA9IG9iajsKICAgICAgICB2YXIgX3BzZXVkb0NsYXNzTmFtZSA9IHBzZXVkb0NsYXNzTmFtZTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X29iai5jbGFzc05hbWU9X3BzZXVkb0NsYXNzTmFtZTt9LCAyMDApOwogICAgfQogICAgCiAgICByZXR1cm4ob2JqKTsKfQoKZnVuY3Rpb24gZGVsZXRlT2JqZWN0KG9iamVjdCkKewogICAgb2JqZWN0ID0gZ2V0T2JqZWN0KG9iamVjdCk7CiAgICAvL2R1bXAob2JqZWN0LmlkKTsKICAgIAogICAgaWYgKG9iamVjdCkKICAgIHsKICAgICAgICAvL2R1bXAob2JqZWN0KTsKICAgICAgICBpZiAob2JqZWN0LmRlc3Ryb3kpCiAgICAgICAgICAgIG9iamVjdC5kZXN0cm95KCk7CiAgICAgICAgZGVsZXRlKF9vYmplY3RzW29iamVjdC5pZF0pOwogICAgfQogICAgZWxzZQogICAgICAgIF90aHJvdygnZGVsZXRlT2JqZWN0KCkgLSBubyBvYmplY3QgZm91bmQnKTsKfQoKZnVuY3Rpb24gZmluZE9iamVjdHMoZWxlbSwgaW5oZXJpdHMpCnsKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gInN0cmluZyIpCiAgICAgICAgZWxlbSA9IGdldEVsZW1lbnQoZWxlbSk7CgogICAgdmFyIHJldCA9IFtdOwoKICAgIGlmICh0eXBlb2YoaW5oZXJpdHMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGluaGVyaXRzID0gIiI7CiAgICBlbHNlIGlmICghKGluaGVyaXRzIGluc3RhbmNlb2YgQXJyYXkpKQogICAgICAgIGluaGVyaXRzID0gW2luaGVyaXRzXTsKICAgIAogICAgLy9kdW1wKGluaGVyaXRzKTsKICAgIGlmIChlbGVtLm9iamVjdCkKICAgIHsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBpbmhlcml0cy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoaW5oZXJpdHNbaV0gPT0gIiIgfHwgZWxlbS5vYmplY3QuX2V4dGVuZHMoaW5oZXJpdHNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbS5vYmplY3QpOwogICAgICAgIH0KICAgIH0KICAgICAgICAKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW0uY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgcmV0ID0gcmV0LmNvbmNhdChmaW5kT2JqZWN0cyhlbGVtLmNoaWxkTm9kZXNbaV0sIGluaGVyaXRzKSk7CiAgICB9CiAgICAKICAgIC8vZHVtcChyZXQpOwogICAgLy9kdW1wKGFycmF5X3VuaXF1ZShyZXQpKTsKCiAgICByZXR1cm4oYXJyYXlfdW5pcXVlKHJldCkpOwp9CgppZiAod2luZG93WyJvblJlbW92ZU5vZGUiXSkKewogICAgZXh0ZW5kRnVuY3Rpb24ob25SZW1vdmVOb2RlLCBmdW5jdGlvbihub2RlKXsKICAgICAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IEVMRU1FTlRfTk9ERSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvYmplY3RzID0gZmluZE9iamVjdHMobm9kZSk7CiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAgOyBpIDwgb2JqZWN0cy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChvYmplY3RzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwp9CgpleHRlbmRGdW5jdGlvbihzZXRIdG1sLCBmdW5jdGlvbigpewogICAgCiAgICAvLyBkZWxldGUgb2xkIGNvbnRlbnQgLSBuZWVkIHRvIGxvb3AgZnJvbSBjaGlsZE5vZGVzLCBub3QgdGhlIG5vZGUgaXRzZWxmCiAgICBpZiAoZWxlbSAmJiBlbGVtLmNoaWxkTm9kZXMpCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfZWxlbSA9IGVsZW0uY2hpbGROb2Rlc1tpXTsKICAgICAgICAgICAgaWYgKF9lbGVtLnRhZ05hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYmplY3RzID0gZmluZE9iamVjdHMoX2VsZW0pOwogICAgICAgICAgICAgICAgaWYgKG9iamVjdHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSBvYmplY3RzLmxlbmd0aC0xIDsgaWkgPj0gMCA7IGlpLS0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0c1tpaV0gIT0gdGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChvYmplY3RzW2lpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcGFyZW50KGF1dG8pOyAKfSk7CgpmdW5jdGlvbiBnZXRPYmplY3RzQnlQYXJhbXMocGFyYW1zLCBlbGVtKQp7CiAgICBpZiAodHlwZW9mKHBhcmFtcykgIT0gIm9iamVjdCIpCiAgICAgICAgcGFyYW1zID0gW3BhcmFtc107CiAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpCiAgICB7CiAgICAgICAgdmFyIF9wYXJhbXMgPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBwYXJhbXMubGVuZ3RoIDsgaSsrKSAgICAgICAgCiAgICAgICAgewogICAgICAgICAgICBfcGFyYW1zW3BhcmFtc1tpXV0gPSAiKiI7CiAgICAgICAgfQogICAgICAgIHBhcmFtcyA9IF9wYXJhbXM7CiAgICB9CiAgICAKICAgIHZhciBvYmplY3RzID0gW107CiAgICB2YXIgX29iamVjdHMgPSBnZXRPYmplY3RzKCk7CgogICAgZm9yICh2YXIgX2lkIGluIF9vYmplY3RzKQogICAgewogICAgICAgIHZhciBPYmplY3QgPSBfb2JqZWN0c1tfaWRdOwogICAgICAgIGlmIChPYmplY3QgJiYgT2JqZWN0LnBhcmFtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIHBhcmFtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihPYmplY3QucGFyYW1zW2ldKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2ldID09ICIqIiB8fCBPYmplY3QucGFyYW1zW2ldID09IHBhcmFtc1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtc1tpXS5pbmRleE9mKCIqIikgPiAtMSAmJiBPYmplY3QucGFyYW1zW2ldICYmIE9iamVjdC5wYXJhbXNbaV0uc2VhcmNoKG5ldyBSZWdFeHAoIl4iK3N0cl9yZXBsYWNlKCIqIiwgIi4qIiwgcGFyYW1zW2ldKSsiJCIpKSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZm91bmQpCiAgICAgICAgICAgICAgICBvYmplY3RzLnB1c2goT2JqZWN0KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmICh0eXBlb2YoZWxlbSkgIT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgdmFyIF9vYmplY3RzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgb2JqZWN0cy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgT2JqZWN0ID0gb2JqZWN0c1tpXTsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGZpcnN0X3ZhbHVlKE9iamVjdC5jb250YWluZXIsIE9iamVjdC5lbGVtZW50KTsKICAgICAgICAgICAgd2hpbGUoY29udGFpbmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IGVsZW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX29iamVjdHMucHVzaChPYmplY3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBvYmplY3RzID0gX29iamVjdHM7CiAgICB9CiAgICAKICAgIAogICAgcmV0dXJuKG9iamVjdHMpOwp9CgpmdW5jdGlvbiBnZXRPYmplY3RCeVBhcmFtcyhwYXJhbXMsIGVsZW0pCnsKICAgIHZhciBPYmplY3QgPSBudWxsOwogICAgdmFyIG9iamVjdHMgPSBnZXRPYmplY3RzQnlQYXJhbXMocGFyYW1zLCBlbGVtKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG9iamVjdHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmICghb2JqZWN0c1tpXS5pc0NoaWxkQ29tcG9uZW50KCkpCiAgICAgICAgICAgIE9iamVjdCA9IG9iamVjdHNbaV07CiAgICB9CiAgICBpZiAoIU9iamVjdCkKICAgICAgICBPYmplY3QgPSBvYmplY3RzWzBdOwogICAgCiAgICByZXR1cm4oT2JqZWN0KTsKfQogICAgICAgICAgIAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3Jvc3Nicm93c2VyIF9fZ2V0dGVyX18gX19zZXR0ZXJfXyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3aW5kb3cuZ2V0c2V0ID0gZnVuY3Rpb24oZm4pCnsKICAgIGlmKHdpbmRvdy5nZXRzZXQudHlwZSA9PSAxKQogICAgewogICAgICAgIC8vVHlwZSAxOiBfX2RlZmluZUdldHRlcl9fL19fZGVmaW5lU2V0dGVyX18gbmF0aXZlCiAgICB9CiAgICBlbHNlIGlmICghd2luZG93LmdldHNldC50eXBlKQogICAgewogICAgICAgIC8vVHlwZSAwOiBkZWZpbmVQcm9wZXJ0eSBuYXRpdmUKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5nZXRzZXQudHlwZSA9PSAyKQogICAgewogICAgICAgIC8vVHlwZSAyOiBlbXVsYXRlZAogICAgICAgIHZhciBzcmMgPSBmbi50b1N0cmluZygpOyAvL2NvbnZlcnQgdG8gYSBwYXJzZWFibGUgc3RyaW5nCiAgICAgICAgZG9jdW1lbnQud3JpdGUoIk9yaWdpbmFsIENvZGU6IDxicj48cHJlPiIrc3JjKyI8L3ByZT4iKQogICAgICAgIHZhciBtb2RpZmllZCA9IG1vZGlmeV9zY3JpcHQoc3JjKTsKICAgICAgICBldmFsKCJ2YXIgbmV3ZnVuY3Rpb24gPSAoIittb2RpZmllZCsiKSIpCiAgICAgICAgZG9jdW1lbnQud3JpdGUoIk1vZGlmaWVkIENvZGU6IDxicj4gPHByZT4iK25ld2Z1bmN0aW9uKyI8L3ByZT4iKQogICAgICAgIG5ld2Z1bmN0aW9uKCkKICAgIH0KfQoKaWYoKEJyb3dzZXIubmFtZSAhPSAiRXhwbG9yZXIiIHx8IEJyb3dzZXIudmVyc2lvbiA+PSA5KSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkpCnsKICAgIFRPYmplY3QucHJvdG90eXBlLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgZnVuYykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHRoaXMuX19wcm9wZXJ0aWVzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgdGhpcy5fX3Byb3BlcnRpZXMgPSB7fTsKICAgICAgICBpZiAodHlwZW9mKHRoaXMuX19wcm9wZXJ0aWVzW25hbWVdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgdGhpcy5fX3Byb3BlcnRpZXNbbmFtZV0gPSB7fTsKICAgICAgICAKICAgICAgICB0aGlzLl9fcHJvcGVydGllc1tuYW1lXVsiY29uZmlndXJhYmxlIl0gPSB0cnVlOwogICAgICAgIHRoaXMuX19wcm9wZXJ0aWVzW25hbWVdW3R5cGVdID0gZnVuYzsKCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHRoaXMuX19wcm9wZXJ0aWVzW25hbWVdKTsKICAgIH0KfQplbHNlIGlmKCh7fSkuX19kZWZpbmVHZXR0ZXJfXykKewogICAgVE9iamVjdC5wcm90b3R5cGUuZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBmdW5jKQogICAgewogICAgICAgIGlmICh0eXBlID09ICJnZXQiKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fX2RlZmluZUdldHRlcl9fKG5hbWUsIGZ1bmMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICJzZXQiKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fX2RlZmluZVNldHRlcl9fKG5hbWUsIGZ1bmMpOwogICAgICAgIH0KICAgIH0KfQplbHNlCnsKICAgIC8vUHVyZSBFbXVsYXRpb24KICAgIFRPYmplY3QucHJvdG90eXBlLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgZnVuYykKICAgIHsKICAgICAgICB0aGlzWydfXycrdHlwZSsnXycrbmFtZV0gPSBmdW5jOwogICAgfQp9CgoKCg==Ll9Eb2NrQXJlYSB7DQogICAgYmFja2dyb3VuZDogI0VFRUVFRTsNCiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2Ow0KfQ0KDQouX0RvY2tBcmVhIC5Eb2NrU2l0ZSB7DQp9DQoNCi5Eb2NrU2l0ZU91dGxpbmUgew0KICAgIGJvcmRlcjogMnB4IGRhc2hlZCAjMDAwMDAwOw0KICAgIGJhY2tncm91bmQ6ICNBQUFBQUE7DQogICAgb3BhY2l0eTogMC41Ow0KICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB6LWluZGV4OiAxMDAwMDAwOw0KfQ0KDQouX0RvY2tBcmVhIC5fRG9ja1BhbmVsIHsNCiAgICBtaW4td2lkdGg6IDUwcHg7DQogICAgbWluLWhlaWdodDogNTBweDsNCiAgICAvKmJvcmRlcjogMnB4IHNvbGlkICMwMDAwRkY7Ki8NCn0NCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvT2JqZWN0L09iamVjdC5jbGFzcy5waHAgLS0tLS0tLSANCgpkZWZpbmUoIk5PX01FVEhPRCIsICJfX19FTVBUWV9fXyIpOwpjbGFzcyBUT2JqZWN0CnsKICAgIHZhciAkY2FjaGVQcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgIHZhciAkaWdub3JlZENhY2hlUHJvcGVydGllcyA9IGFycmF5KCk7CgogICAgdmFyICRfX3Byb3BlcnRpZXMgPSBhcnJheSgpOwogICAgdmFyICRfX21ldGhvZFRpbWVzID0gYXJyYXkoKTsKICAgIHZhciAkaW5kZXhLZXlzID0gYXJyYXkoKTsKICAgIAogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIGlmIChmYWxzZSAmJiBnZXRfY2xhc3MoJHRoaXMpID09ICJURmlsdGVyTG9va3VwQ29tYm9Cb3giKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgLy9kdW1wKCJBIik7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5qc0NsYXNzTmFtZSk7CiAgICAgICAgaWYgKCEkdGhpcy0+anNDbGFzc05hbWUpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+anNDbGFzc05hbWUgPSBnZXRfY2xhc3MoJHRoaXMpOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5qc09iamVjdE5hbWUpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+anNPYmplY3ROYW1lID0gc3Vic3RyKCR0aGlzLT5qc0NsYXNzTmFtZSwgMSwgMTAwMCk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcChnZXRfY2xhc3MoJHRoaXMpKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPmpzQ2xhc3NOYW1lKTsKICAgICAgICAkdGhpcy0+cGhwT2JqZWN0RmlsZSA9IGdldE9iamVjdFBhdGgoc3Vic3RyKGdldF9jbGFzcygkdGhpcyksIDEsIDEwMDApKTsKICAgICAgICAKICAgICAgICAkZXh0ZW5kaW5nT2JqZWN0VHlwZXMgPSAkdGhpcy0+Z2V0RXh0ZW5kaW5nT2JqZWN0VHlwZXMoKTsKICAgICAgICAvL2R1bXAoJGV4dGVuZGluZ09iamVjdFR5cGVzKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRleHRlbmRpbmdPYmplY3RUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJGV4dGVuZGluZ09iamVjdFR5cGVzIGFzICRleHRlbmRpbmdPYmplY3RUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoJGV4dGVuZGluZ09iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgJE9iamVjdCA9IGdldE9iamVjdCgkZXh0ZW5kaW5nT2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoJE9iamVjdCAmJiAkT2JqZWN0LT5oYXNNZXRob2QoIl9fX2NvbnN0cnVjdCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPl9fX2NvbnN0cnVjdCgkdGhpcyk7CiAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIUFKQVggJiYgIWhlYWRIdG1sQWRkZWQoX19DTEFTU19fLCAkcGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vVFVVSUQ6Om9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9PYmplY3QvT2JqZWN0LmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOwogICAgICAgICAgICBhZGRFeHRlbmRpbmdIZWFkSHRtbCgkcGFyYW1zLCBfX0NMQVNTX18pOwogICAgICAgICAgICBUSlNPTjo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICAgICAgVE1vdXNlOjpvbkdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgICAgICAgICBUS2V5Ym9hcmQ6Om9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gSUUgMzEgc3R5bGVzIGxpbWl0IHRlc3QKICAgICAgICAgICAgLyoKICAgICAgICAgICAgZ2xvYmFsICRpZTMxdGVzdDsKICAgICAgICAgICAgaWYgKCEkaWUzMXRlc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwIDsgJGkgPCAxMCA7ICRpKyspCiAgICAgICAgICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxsaW5rIGhyZWY9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L09iamVjdC8uLi9Eb2NrQXJlYS9Eb2NrQXJlYS5jbGFzcy5jc3MnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIC8+Iik7CiAgICAgICAgICAgICAgICAkaWUzMXRlc3QgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgICAgIAogICAgICAgICAgICAvL2lmICh0cnVlIHx8IEFETUlOKQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgLy8gICAgYWRkU3R5bGUoc3Vic3RyKGdldF9jbGFzcygkdGhpcyksIDEsIDEwMCksIGZhbHNlKTsKICAgICAgICAgICAgLy99CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzKSkKICAgICAgICAgICAgJHRoaXMtPm9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJGNsYXNzTmFtZSA9IGdldF9jYWxsZWRfY2xhc3MoKTsKICAgICAgICAgICAgY2FsbF9zdGF0aWNfbWV0aG9kKCRjbGFzc05hbWUsICJvbkdldEhlYWRIdG1sIiwgJHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAvKgoKICAgICAgICBnbG9iYWwgJF9fZ2V0SGVhZEh0bWxDbGFzc2VzOwogICAgICAgIC8vaWYgKGlzc2V0KCR0aGlzKSkKICAgICAgICAvLyAgICAkY2xhc3NOYW1lID0gZ2V0X2NsYXNzKCR0aGlzKTsKICAgICAgICAvL2Vsc2UKICAgICAgICAkY2xhc3NOYW1lID0gZ2V0X2NhbGxlZF9jbGFzcygpOwogICAgICAgIGR1bXAoJGNsYXNzTmFtZSk7CiAgICAgICAgCiAgICAgICAgaWYgKCRfX2dldEhlYWRIdG1sQ2xhc3Nlc1skY2xhc3NOYW1lXSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcykpCiAgICAgICAgICAgICAgICAkdGhpcy0+b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY2FsbF9zdGF0aWNfbWV0aG9kKCRjbGFzc05hbWUsICJvbkdldEhlYWRIdG1sIiwgJHBhcmFtcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJF9fZ2V0SGVhZEh0bWxDbGFzc2VzWyRjbGFzc05hbWVdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgKi8KICAgIH0KCiAgICBmdW5jdGlvbiBfX3NsZWVwKCkKICAgIHsKICAgICAgICAvL2lmIChnZXRfY2xhc3MoJHRoaXMpID09ICJUVGVtcGxhdGVzIiAmJiBjb3VudCgkdGhpcy0+Y2FjaGVQcm9wZXJ0aWVzKSA+IDEpCiAgICAgICAgLy97CiAgICAgICAgLy8gICAgdmFyX2R1bXAoJHRoaXMtPmNhY2hlUHJvcGVydGllcyk7CiAgICAgICAgLy8gICAgZXhpdDsKICAgICAgICAvL30KICAgICAgICAvL3Zhcl9kdW1wKGdldF9jbGFzcygkdGhpcykpOwogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmNhY2hlUHJvcGVydGllcyk7CiAgICAgICAgLy9leGl0OwoKICAgICAgICAkY2FjaGVQcm9wZXJ0aWVzID0gJHRoaXMtPmNhY2hlUHJvcGVydGllczsKICAgICAgICBpZiAoISRjYWNoZVByb3BlcnRpZXMpCiAgICAgICAgICAgICRjYWNoZVByb3BlcnRpZXMgPSBhcnJheV9rZXlzKGdldF9vYmplY3RfdmFycygkdGhpcykpOwogICAgICAgICAgICAKICAgICAgICBmb3JlYWNoKCR0aGlzLT5pZ25vcmVkQ2FjaGVQcm9wZXJ0aWVzIGFzICRwcm9wZXJ0eSkKICAgICAgICAgICAgYXJyYXlfZGVsZXRlKCRjYWNoZVByb3BlcnRpZXMsICRwcm9wZXJ0eSk7CgogICAgICAgIHJldHVybigkY2FjaGVQcm9wZXJ0aWVzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDb250ZW50KCRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiLCAkcGFyYW0xPU5VTEwsICRwYXJhbTI9TlVMTCwgJHBhcmFtMz1OVUxMLCAkcGFyYW00PU5VTEwsICRwYXJhbTU9TlVMTCwgJHBhcmFtNj1OVUxMLCAkcGFyYW03PU5VTEwsICRwYXJhbTg9TlVMTCwgJHBhcmFtOT1OVUxMKQogICAgewogICAgICAgIGdsb2JhbCAkX19kb1Byb2ZpbGU7CiAgICAgICAgaWYgKHRvQm9vbCgkX0NPT0tJRVsiT2JqZWN0c0RlYnVnUGFuZWxQZXJmb3JtYW5jZV8iLiR0aGlzLT5fX2RlYnVnSWRdKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZWNobyAiWCI7IGV4aXQ7CiAgICAgICAgICAgICRfX2RvUHJvZmlsZVtdID0gJHRoaXMtPl9fZGVidWdJZDsKICAgICAgICAgICAgZ2xvYmFsICRpZ25vcmVkRXZlbnRzOwogICAgICAgICAgICAkaWdub3JlZEV2ZW50cyA9IGFycmF5KAogICAgICAgICAgICAgICAgLy8ib25BZGRIZWFkSHRtbCIsCiAgICAgICAgICAgICAgICAvLyJvbkdldE9iamVjdFBhcmFtcyIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHN0YXJ0UHJvZmlsZShnZXRfY2xhc3MoJHRoaXMpLiI6OmdldENvbnRlbnQiKTsKICAgICAgICAkdGltZVN0YXJ0ID0gZ2V0TWljcm9UaW1lKHRydWUpOwogICAgICAgIC8vJGh0bWwgPSAkdGhpcy0+b25HZXRDb250ZW50KCYkcGFyYW1zLCAkdmFsdWUpOyAvLyBuZWVkIHRvIHBhc3MgYnkgcmVmZXJlbmNlIGR1ZSB0byBleHRyYWN0UGFyYW1zLCB0aGF0IGZpbGxzIGluIHNvbWUgdmFsdWVzCiAgICAgICAgCiAgICAgICAgLy8gbmVlZGVkIGZvciBIdG1sQ2FjaGUgLSBpdCdzIHNvdXJjZSBwYXJhbXMgbm90IG1vZGlmaWVkIGJ5IG9uR2V0T2JqZWN0UGFyYW1zCiAgICAgICAgLy8kcGFyYW1zID0gY2xvbmUoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCI9PT09PSIpOwogICAgICAgIC8vZHVtcChnZXRfY2xhc3MoJHRoaXMpKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgLy8gUEhQIFZlcnNpb246IDIuNi4xOC0yMzguMTkuMS5lbDUuMDI4c3RhYjA5Mi4yIC0gaXMgYnVnZ3kganVkb3Zicm5lLmN6IC0gcGxhY2VzIGludG8gX19wYXJhbXMgYW5vdGhlciBhcnJheSB0aGFuICRwYXJhbXMgLSB3aHk/CiAgICAgICAgLy8kcGFyYW1zWyJfX3BhcmFtcyJdID0gJHBhcmFtczsKICAgICAgICBpZiAoJHBhcmFtcykKICAgICAgICB7CiAgICAgICAgICAgICRwYXJhbXNbIl9fcGFyYW1zIl0gPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJGtleSA9PiAkdmFsKQogICAgICAgICAgICAgICAgJHBhcmFtc1siX19wYXJhbXMiXVska2V5XSA9ICR2YWw7CiAgICAgICAgfQoKICAgICAgICAvL2lmIChnZXRfY2xhc3MoJHRoaXMpID09ICJUQWRtaW5NZW51IikKICAgICAgICAvL3sKICAgICAgICAvLyAgICB2YXJfZHVtcCgkcGFyYW1zKTsgZXhpdDsKICAgICAgICAvL30KICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCRwYXJhbXNbIl9fcGFyYW1zIl0pOwogICAgICAgIC8vZHVtcChUSlNPTjo6ZW5jb2RlKCRwYXJhbXMpKTsKICAgICAgICAvL2R1bXAoIkJFOiIuZ2V0X2NsYXNzKCR0aGlzKSk7CiAgICAgICAgLy9kdW1wKCJiZWZvcmVHZXRPYmplY3RDb250ZW50Iik7CiAgICAgICAgLy9kdW1wKGdldF9jbGFzcygkdGhpcykpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAkaHRtbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygiYmVmb3JlR2V0T2JqZWN0Q29udGVudCIsIGFycmF5KCJodG1sIiA9PiAkaHRtbCwgInBhcmFtcyIgPT4gJHBhcmFtcywgInZhbHVlIiA9PiAkdmFsdWUsICJPYmplY3QiID0+ICR0aGlzLCAiY2xhc3NOYW1lIiA9PiBnZXRfY2xhc3MoJHRoaXMpKSwgImh0bWwiKTsKICAgICAgICBpZiAoJGh0bWwgPT09IE5VTEwgfHwgJGh0bWwgPT09ICIiIHx8IHN0cnBvcygkaHRtbCwgIl9fX2JlZm9yZUdldE9iamVjdENvbnRlbnRfX0NPTlRJTlVFX19fIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaHRtbCwgIl9fX2JlZm9yZUdldE9iamVjdENvbnRlbnRfX0NPTlRJTlVFX19fIikgIT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoIkFYQVhBWEFYQSIpOwogICAgICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIl9fX2JlZm9yZUdldE9iamVjdENvbnRlbnRfX0NPTlRJTlVFX19fIiwgIiIsICRodG1sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZnJvbSBQSFAgNS40IHdlIGhhZCB0byBzZXQgJiRwYXJhbXMgb24gZXZlcnkgb25HZXRDb250ZW50IGV2ZW50CiAgICAgICAgICAgICRodG1sID0gJHRoaXMtPm9uR2V0Q29udGVudCgkcGFyYW1zLCAkdmFsdWUsICRwYXJhbTEsICRwYXJhbTIsICRwYXJhbTMsICRwYXJhbTQsICRwYXJhbTUsICRwYXJhbTYsICRwYXJhbTcsICRwYXJhbTgsICRwYXJhbTkpOyAvLyBuZWVkIHRvIHBhc3MgYnkgcmVmZXJlbmNlIGR1ZSB0byBleHRyYWN0UGFyYW1zLCB0aGF0IGZpbGxzIGluIHNvbWUgdmFsdWVzCiAgICAgICAgCiAgICAgICAgICAgIC8vJF9wYXJhbXMgPSAmJHBhcmFtczsKICAgICAgICAgICAgLy8kaHRtbCA9ICR0aGlzLT5vbkdldENvbnRlbnQoJF9wYXJhbXMsICR2YWx1ZSk7IC8vIG5lZWQgdG8gcGFzcyBieSByZWZlcmVuY2UgZHVlIHRvIGV4dHJhY3RQYXJhbXMsIHRoYXQgZmlsbHMgaW4gc29tZSB2YWx1ZXMKICAgICAgICAgICAgLy8kcGFyYW1zID0gJiRfcGFyYW1zOwoKICAgICAgICAgICAgLy9pZiAoZ2V0X2NsYXNzKCR0aGlzKSA9PSAiVERpcmVjdG9yeVRyZWUiKQogICAgICAgICAgICAvLyAgICBkdW1wKCRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNEZXZlbG9wZXIoKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiLS0yIik7CiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAgICAgLy9kdW1wKCRodG1sKTsKICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAkdGltZUVuZCA9IGdldE1pY3JvVGltZSh0cnVlKTsKICAgICAgICAkdGhpcy0+X19tZXRob2RUaW1lc1siZ2V0Q29udGVudCJdW10gPSAkdGltZUVuZC0kdGltZVN0YXJ0OwogICAgICAgIC8vZHVtcCgiQToiLmdldF9jbGFzcygkdGhpcykpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+X19tZXRob2RUaW1lcyk7CiAgICAgICAgLy9leGl0OwogICAgICAgIC8vZHVtcCgkdGhpcy0+aWQuIiAoIi5nZXRfY2xhc3MoJHRoaXMpLiIpICIucm91bmQoJHRoaXMtPl9fZ2V0Q29udGVudFRpbWUsIDIpKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCJPTjoiLmdldF9jbGFzcygkdGhpcykpOwogICAgICAgIC8vZHVtcCgib25HZXRPYmplY3RDb250ZW50Iik7CiAgICAgICAgCiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uR2V0T2JqZWN0Q29udGVudCIsIGFycmF5KCJodG1sIiA9PiAkaHRtbCwgInBhcmFtcyIgPT4gJHBhcmFtcywgInZhbHVlIiA9PiAkdmFsdWUsICJPYmplY3QiID0+ICR0aGlzLCAiY2xhc3NOYW1lIiA9PiBnZXRfY2xhc3MoJHRoaXMpKSwgImh0bWwiKTsKICAgICAgICAvL2lmICgkcGFyYW1zWyJodG1sQ2FjaGVJZCJdKQogICAgICAgIC8vICAgIGR1bXAoJGh0bWwpOwogICAgICAgICAgICAKICAgICAgICAvL2R1bXAoIi0tMyIpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvL2R1bXAoJGh0bWwpOwogICAgICAgIC8vZHVtcCgkaHRtbCk7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5pZCk7CiAgICAgICAgCiAgICAgICAgc3RvcFByb2ZpbGUoZ2V0X2NsYXNzKCR0aGlzKS4iOjpnZXRDb250ZW50IiwgJHBhcmFtcyk7CgogICAgICAgICRleHRlbmRpbmdPYmplY3RUeXBlcyA9IGdldE9iamVjdChzdWJzdHIoZ2V0X2NsYXNzKCR0aGlzKSwgMSkpLT5nZXRFeHRlbmRpbmdPYmplY3RUeXBlcygpOwogICAgICAgIGlmICgkZXh0ZW5kaW5nT2JqZWN0VHlwZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRleHRlbmRpbmdPYmplY3RUeXBlcyBhcyAkZXh0ZW5kaW5nT2JqZWN0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJE9iamVjdCA9IGdldE9iamVjdCgkZXh0ZW5kaW5nT2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoJE9iamVjdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJE9iamVjdC0+aGFzTWV0aG9kKCJvbkdldENvbnRlbnQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgJGh0bWwgPSAkT2JqZWN0LT5vbkdldENvbnRlbnQoJHRoaXMsICRodG1sLCAkcGFyYW1zKTsKICAgICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0b0Jvb2woJF9DT09LSUVbIk9iamVjdHNEZWJ1Z1BhbmVsUGVyZm9ybWFuY2VfIi4kdGhpcy0+X19kZWJ1Z0lkXSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJGlnbm9yZWRFdmVudHMpCiAgICAgICAgICAgICAgICAkaWdub3JlZEV2ZW50cyA9IGFycmF5KCk7CiAgICAgICAgICAgIGFycmF5X3BvcCgkX19kb1Byb2ZpbGUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siY29udGVudE91dHB1dCJdID09ICJib2R5SHRtbFByZWZpeCIpCiAgICAgICAgewogICAgICAgICAgICBhZGRCb2R5SHRtbFByZWZpeCgkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gIiI7CiAgICAgICAgfQogICAgICAgIGlmICgkcGFyYW1zWyJjb250ZW50T3V0cHV0Il0gPT0gImJvZHlIdG1sUG9zdGZpeCIpCiAgICAgICAgewogICAgICAgICAgICBhZGRCb2R5SHRtbFBvc3RmaXgoJGh0bWwpOwogICAgICAgICAgICAkaHRtbCA9ICIiOwogICAgICAgIH0KICAgICAgICBpZiAoJHBhcmFtc1siY29udGVudE91dHB1dCJdID09ICJoZWFkSHRtbCIpCiAgICAgICAgewogICAgICAgICAgICBhZGRIZWFkSHRtbCgkaHRtbCk7CiAgICAgICAgICAgICRodG1sID0gIiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBvbkdldENvbnRlbnQoJiRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfSAKICAgIAogICAgZnVuY3Rpb24gZXh0cmFjdFBhcmFtcygkcGFyYW1zPWFycmF5KCksICRwYXJzZVNjcmlwdHM9dHJ1ZSkKICAgIHsKICAgICAgICAkYnQgPSBfZGVidWdfYmFja3RyYWNlKCk7CiAgICAgICAgZm9yICgkYiA9IDEgOyAkYiA8IGNvdW50KCRidCkgOyAkYisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRidFskYl1bImZ1bmN0aW9uIl0gIT0gImV4dHJhY3RQYXJhbXMiKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNfYXJyYXkoJHBhcmFtcykgJiYgJHBhcmFtc1siX19leHRyYWN0ZWQiXVskYnRbJGJdWyJmdW5jdGlvbiJdXSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHBhcmFtcywgIiIsICRwYXJzZVNjcmlwdHMpOwoKICAgICAgICBpZiAoJHBhcmFtc1sibWVyZ2VQYXJhbXMiXSkKICAgICAgICB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheV9tZXJnZSgkcGFyYW1zLCAkcGFyYW1zWyJtZXJnZVBhcmFtcyJdKTsKICAgICAgICAgICAgdW5zZXQoJHBhcmFtc1sibWVyZ2VQYXJhbXMiXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZWUgVERldGFpbFRhYmxlRWRpdEdyaWQgLSBtdWx0aXBsZSBleHRyYWN0UGFyYW1zIGNhbGxlZCB1c2luZyBwYXJlbnQ6OgogICAgICAgIAogICAgICAgIC8vIHpwb21hbHVqZSAsIGFsZSBqZSBwb3RyZWJhIGsgemlza2FuaSBwYXJhbWV0cnUgbWV0aG9kTmFtZQogICAgICAgIC8vIHN0YXJ0UHJvZmlsZSgiVE9iamVjdDo6ZXh0cmFjdFBhcmFtcygpIC0gZGVidWdfYmFja3RyYWNlIC0gbWV0aG9kTmFtZSIpOwogICAgICAgIC8vIHN0b3BQcm9maWxlKCJUT2JqZWN0OjpleHRyYWN0UGFyYW1zKCkgLSBkZWJ1Z19iYWNrdHJhY2UgLSBtZXRob2ROYW1lIik7CiAgICAgICAgCiAgICAgICAgJF9wYXJhbXMgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uR2V0T2JqZWN0UGFyYW1zIiwgYXJyYXkoInBhcmFtcyIgPT4gJHBhcmFtcywgImNsYXNzTmFtZSIgPT4gZ2V0X2NsYXNzKCR0aGlzKSwgIk9iamVjdCIgPT4gJHRoaXMsICJtZXRob2ROYW1lIj0+JGJ0WyRiXVsiZnVuY3Rpb24iXSksICJwYXJhbXMiKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJF9wYXJhbXMpKQogICAgICAgICAgICAkcGFyYW1zID0gJF9wYXJhbXM7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc2hvd01lc3NhZ2UoIm9uR2V0T2JqZWN0UGFyYW1zKCk6IEV2ZW50IHJldHVybmVkIG5vdCBhbiBhcnJheSBidXQgJyIuJF9wYXJhbXMuIiciKTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5vbkdldE9iamVjdFBhcmFtcygkcGFyYW1zKTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siY2hpbGRDb21wb25lbnQiXSkKICAgICAgICAgICAgJHBhcmFtc1siY2xhc3MiXSAuPSAiIF9DaGlsZENvbXBvbmVudCI7CiAgICAgICAgCiAgICAgICAgJHBhcmFtc1siX19leHRyYWN0ZWQiXVskYnRbJGJdWyJmdW5jdGlvbiJdXSA9IHRydWU7CgogICAgICAgICRwYXJhbXNbInBocENsYXNzTmFtZSJdID0gZ2V0X2NsYXNzKCR0aGlzKTsKCiAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgfSAKCiAgICBmdW5jdGlvbiBpbml0KCYkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCEkcGFyYW1zWyJpZCJdICYmICEkcGFyYW1zWyJvYmplY3RJZCJdKQogICAgICAgICAgICAkdGhpcy0+aWQgPSAkdGhpcy0+Y3JlYXRlSWQoKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICR0aGlzLT5pZCA9IGZpcnN0X3ZhbHVlKCRwYXJhbXNbIm9iamVjdElkIl0sICRwYXJhbXNbImlkIl0pOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBhZnRlckNyZWF0ZSgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QW5jZXN0b3JzKCkgCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5fZ2V0QW5jZXN0b3JzKGdldF9jbGFzcygkdGhpcykpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRBbmNlc3Rvck9iamVjdFR5cGVzKCkgCiAgICB7CiAgICAgICAgJGNsYXNzZXMgPSAkdGhpcy0+X2dldEFuY2VzdG9ycyhnZXRfY2xhc3MoJHRoaXMpKTsKICAgICAgICAKICAgICAgICBmb3JlYWNoKCRjbGFzc2VzIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgJGNsYXNzZXNbJGtleV0gPSBzdWJzdHIoJHZhbCwgMSwgMTAwMCk7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybigkY2xhc3Nlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gX2dldEFuY2VzdG9ycygkY2xhc3MpCiAgICB7CiAgICAgICAgJGNsYXNzZXMgPSBhcnJheSgpOwogICAgICAgIHdoaWxlKCRjbGFzcyA9IGdldF9wYXJlbnRfY2xhc3MoJGNsYXNzKSkKICAgICAgICB7IAogICAgICAgICAgICAkY2xhc3Nlc1tdID0gJGNsYXNzOyAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuICRjbGFzc2VzOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEV4dGVuZGluZ09iamVjdFR5cGVzKCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5leHRlbmRpbmdPYmplY3RUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5leHRlbmRpbmdPYmplY3RUeXBlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkaW1wbGVtZW50cyA9ICR0aGlzLT5fX2ltcGxlbWVudHMoKTsKICAgICAgICAgICAgaWYgKCEkaW1wbGVtZW50cykKICAgICAgICAgICAgICAgICRpbXBsZW1lbnRzID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCRpbXBsZW1lbnRzICYmICFpc19hcnJheSgkaW1wbGVtZW50cykpCiAgICAgICAgICAgICAgICAkaW1wbGVtZW50cyA9IGFycmF5KCRpbXBsZW1lbnRzKTsKCiAgICAgICAgICAgIGZvcmVhY2goJGltcGxlbWVudHMgYXMgJG9iamVjdFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkb2JqZWN0VHlwZSkKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXh0ZW5kaW5nT2JqZWN0VHlwZXNbXSA9ICRvYmplY3RUeXBlOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUT2JqZWN0KCciLmdldF9jbGFzcygkdGhpcykuIicpOjpnZXRFeHRlbmRpbmdPYmplY3RUeXBlcygpIC0gaW1wbGVtZW50cygpIHJldHVybmVkIGVtcHR5IG9iamVjdFR5cGUiLCBtdEVycm9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgbWV0aG9kIGluIGV4dGVuZGluZyBvYmplY3RzCiAgICAgICAgICAgIGlmIChvYmplY3RFeGlzdHMoIk1vZHVsZXMiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4dGVuZGluZ09iamVjdFR5cGVzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmV4dGVuZGluZ09iamVjdFR5cGVzLCBnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0RXh0ZW5kaW5nT2JqZWN0VHlwZXMoc3Vic3RyKGdldF9jbGFzcygkdGhpcyksIDEsIDEwMDApKSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoIkEiKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPmdldEFuY2VzdG9yT2JqZWN0VHlwZXMoKSBhcyAkb2JqZWN0VHlwZSkKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXh0ZW5kaW5nT2JqZWN0VHlwZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZXh0ZW5kaW5nT2JqZWN0VHlwZXMsIGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRFeHRlbmRpbmdPYmplY3RUeXBlcygkb2JqZWN0VHlwZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBzb3J0IGJ5IHByaW9yaXR5CiAgICAgICAgICAgICR0eXBlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPmV4dGVuZGluZ09iamVjdFR5cGVzIGFzICR0eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2lmIChjbGFzc19leGlzdHMoIlQiLiR0eXBlLCBmYWxzZSkpCiAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAkcHJpb3JpdHkgPSBjYWxsX3N0YXRpY19tZXRob2QoIlQiLiR0eXBlLCAiZ2V0RXh0ZW5kaW5nT2JqZWN0UHJpb3JpdHkiKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHR5cGUpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkcHJpb3JpdHkpOwoKICAgICAgICAgICAgICAgICAgICAkdHlwZXNbJHR5cGVdID0gJHByaW9yaXR5OwogICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJzb3J0KCR0eXBlcyk7CiAgICAgICAgICAgIC8vZHVtcCgkdHlwZXMpOwogICAgICAgICAgICAkdGhpcy0+ZXh0ZW5kaW5nT2JqZWN0VHlwZXMgPSBhcnJheV9rZXlzKCR0eXBlcyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3Zhcl9kdW1wKCR0eXBlcyk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICB9ICAgICAgIAogICAgICAgIAogICAgICAgIHJldHVybigkdGhpcy0+ZXh0ZW5kaW5nT2JqZWN0VHlwZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1ldGhvZEV4aXN0cygkbmFtZSwgJGluaGVyZW50PWZhbHNlKQogICAgewogICAgICAgIGlmICgkdGhpcy0+X19tZXRob2RzWyRuYW1lLiRpbmhlcmVudF0gPT09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+X19tZXRob2RzWyRuYW1lLiRpbmhlcmVudF0gPSBmYWxzZTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAkbmFtZSkpCiAgICAgICAgICAgICAgICAkdGhpcy0+X19tZXRob2RzWyRuYW1lLiRpbmhlcmVudF0gPSB0cnVlOwogICAgICAgICAgICBlbHNlIGlmICghJGluaGVyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkZXh0ZW5kaW5nT2JqZWN0VHlwZXMgPSAkdGhpcy0+Z2V0RXh0ZW5kaW5nT2JqZWN0VHlwZXMoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRleHRlbmRpbmdPYmplY3RUeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRleHRlbmRpbmdPYmplY3RUeXBlcyBhcyAkZXh0ZW5kaW5nT2JqZWN0VHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBnZXRPYmplY3QoJGV4dGVuZGluZ09iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kX2V4aXN0cygkT2JqZWN0LCAkbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fX21ldGhvZHNbJG5hbWUuJGluaGVyZW50XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkdGhpcy0+X19tZXRob2RzWyRuYW1lLiRpbmhlcmVudF0pOwogICAgfQogICAgCiAgICAvLyBjYWxsZWQgd2hlbiBtZXRob2QgZG9lcyBub3QgZXhpc3QKICAgIGZ1bmN0aW9uIF9fY2FsbCgkbmFtZSwgJGFyZ3VtZW50cykKICAgIHsKICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAwLCAyKSA9PSAiX19ub0pTRXZlbnRzXyIpCiAgICAgICAgewogICAgICAgICAgICAkbmFtZSA9IHN1YnN0cigkbmFtZSwgc3RybGVuKCJfX25vSlNFdmVudHNfIiksIHN0cmxlbigkbmFtZSktMik7CgogICAgICAgICAgICAvLyBjYWxscyBtZXRob2Qgd2l0aG91dCBhbnkgSmF2YVNjcmlwdCBvbkxvYWQgYW5kIG90aGVyIGV2ZW50cwogICAgICAgICAgICBnbG9iYWwgJG5vSlNFdmVudHM7CiAgICAgICAgICAgICRfbm9KU0V2ZW50cyA9ICRub0pTRXZlbnRzOwogICAgICAgICAgICAkbm9KU0V2ZW50cyA9IHRydWU7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcmV0ID0gJHRoaXMtPiRuYW1lKCRhcmd1bWVudHNbMF0sICRhcmd1bWVudHNbMV0sICRhcmd1bWVudHNbMl0sICRhcmd1bWVudHNbM10sICRhcmd1bWVudHNbNF0sICRhcmd1bWVudHNbNV0sICRhcmd1bWVudHNbNl0sICRhcmd1bWVudHNbN10sICRhcmd1bWVudHNbOF0sICRhcmd1bWVudHNbOV0pOwogICAgICAgICAgICAKICAgICAgICAgICAgJG5vSlNFdmVudHMgPSAkX25vSlNFdmVudHM7CiAgICAgICAgICAgIHJldHVybigkcmV0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCIhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIik7CiAgICAgICAgICAgIC8vZHVtcChnZXRfY2xhc3MoJHRoaXMpKTsKICAgICAgICAgICAgLy9kdW1wKCRuYW1lKTsKICAgICAgICAgICAgJGV4dGVuZGluZ09iamVjdFR5cGVzID0gJHRoaXMtPmdldEV4dGVuZGluZ09iamVjdFR5cGVzKCk7CiAgICAgICAgICAgICRleHRlbmRpbmdSZXRWYWx1ZVBhcmFtTWV0aG9kcyA9ICR0aGlzLT5fX2dldEV4dGVuZGluZ1JldFZhbHVlUGFyYW1NZXRob2RzKCk7CiAgICAgICAgICAgICRleHRlbmRpbmdSZXRWYWx1ZVBhcmFtTWV0aG9kID0gaW5fYXJyYXkoJG5hbWUsIGFycmF5X2tleXMoJGV4dGVuZGluZ1JldFZhbHVlUGFyYW1NZXRob2RzKSk7CiAgICAgICAgICAgIC8vZHVtcCgkZXh0ZW5kaW5nT2JqZWN0VHlwZXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCRleHRlbmRpbmdPYmplY3RUeXBlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRleHRlbmRpbmdSZXRWYWx1ZVBhcmFtTWV0aG9kKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bWV0aG9kRXhpc3RzKCJfXyIuJG5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmNhbGwoIl9fIi4kbmFtZSwgJGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gJGV4dGVuZGluZ1JldFZhbHVlUGFyYW1NZXRob2RzWyRuYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9fc2V0RXh0ZW5kaW5nUmV0VmFsdWVQYXJhbVZhbHVlKCRuYW1lLCAkcmV0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkcmV0ID0gTk9fTUVUSE9EOwoKICAgICAgICAgICAgICAgIC8vZHVtcCgkZXh0ZW5kaW5nT2JqZWN0VHlwZXMpOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkZXh0ZW5kaW5nT2JqZWN0VHlwZXMgYXMgJGV4dGVuZGluZ09iamVjdFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9lY2hvICRuYW1lOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkZXh0ZW5kaW5nT2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBnZXRPYmplY3QoJGV4dGVuZGluZ09iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmICgkT2JqZWN0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRuYW1lLCAkT2JqZWN0LT5yZWZlcmVuY2VQYXJhbU1ldGhvZHMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVmZXJlbmNlYWJsZUFyZ3VtZW50cyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXJndW1lbnRzIGFzICYkYXJndW1lbnQpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWZlcmVuY2VhYmxlQXJndW1lbnRzW10gPSAmJGFyZ3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3JldCA9ICRPYmplY3QtPmNhbGwoJHRoaXMsICRuYW1lLCAkcmVmZXJlbmNlYWJsZUFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3JldCA9ICRPYmplY3QtPmNhbGwoJHRoaXMsICRuYW1lLCAkYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgJF9yZXQgPSAkT2JqZWN0LT5jYWxsKCR0aGlzLCAkbmFtZSwgJGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGV4dGVuZGluZ09iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJF9yZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoRVhURU5ESU5HX09CSkVDVF9NRVRIT0RfTk9UX0ZPVU5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRPYmplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3JldCAhPT0gRVhURU5ESU5HX09CSkVDVF9NRVRIT0RfTk9UX0ZPVU5EKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoaXNfYm9vbCgkX3JldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGlzX2FycmF5KCRfcmV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGV4dGVuZGluZ1JldFZhbHVlUGFyYW1NZXRob2QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9fc2V0RXh0ZW5kaW5nUmV0VmFsdWVQYXJhbVZhbHVlKCRuYW1lLCAkX3JldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJYWFgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX3JldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9ICRfcmV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfYm9vbCgkX3JldCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXQgPT0gTk9fTUVUSE9EKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gJHJldCAmJiAkX3JldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzX2FycmF5KCRfcmV0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJldCA9PSBOT19NRVRIT0QgfHwgIWlzX2FycmF5KCRyZXQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gYXJyYXlfbWVyZ2UoJHJldCwgJF9yZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSAkX3JldDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJFeHRlbmRpbmcgT2JqZWN0ICciLiRleHRlbmRpbmdPYmplY3RUeXBlLiInIG5vdCBmb3VuZCIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHJldCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZXh0ZW5kaW5nUmV0VmFsdWVQYXJhbU1ldGhvZCAmJiAkcmV0ICE9PSBOT19NRVRIT0QpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigkcmV0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKCRyZXQgPT0gTk9fTUVUSE9EKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGR1bXAoJHRoaXMtPm5hbWUpOwogICAgICAgICAgICAgICAgICAgIGR1bXAoJG5hbWUpOwogICAgICAgICAgICAgICAgICAgIGR1bXAoJHJldCk7CiAgICAgICAgICAgICAgICAgICAgZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIC8vZHVtcCgiUkVUOiIuKQogICAgICAgICAgICAgICAgLy9kdW1wKCRyZXQpOwogICAgICAgICAgICAgICAgaWYgKCRyZXQgIT09IE5PX01FVEhPRCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4oJHJldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIG1ldGhvZCBpbnNpZGUgb2JqZWN0CiAgICAgICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAiX18iLiRuYW1lKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJF9uYW1lID0gIl9fIi4kbmFtZTsKICAgICAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+JF9uYW1lKCRhcmd1bWVudHNbMF0sICRhcmd1bWVudHNbMV0sICRhcmd1bWVudHNbMl0sICRhcmd1bWVudHNbM10sICRhcmd1bWVudHNbNF0sICRhcmd1bWVudHNbNV0sICRhcmd1bWVudHNbNl0sICRhcmd1bWVudHNbN10sICRhcmd1bWVudHNbOF0sICRhcmd1bWVudHNbOV0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4oJHJldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2VjaG8gIlRPYmplY3QoIi5nZXRfY2xhc3MoJHRoaXMpLiIpOjpfY2FsbCgpICBNZXRob2QgJyRuYW1lJyBkb2VzIG5vdCBleGlzdCI7CiAgICAgICAgICAgICAgICAvL2VjaG8gIjxociAvPiIuZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmV0dXJuIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgICAgIGlmICgkZXh0ZW5kaW5nUmV0VmFsdWVQYXJhbU1ldGhvZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4oJGV4dGVuZGluZ1JldFZhbHVlUGFyYW1NZXRob2RzWyRuYW1lXSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRPYmplY3QoIi5nZXRfY2xhc3MoJHRoaXMpLiIpOjpfY2FsbCgpICBNZXRob2QgJyRuYW1lJyBkb2VzIG5vdCBleGlzdCIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgIDsgLy8gdG9kbyB0aHJvdyBuaWNlIGVycm9yIChtZXRob2QgZG9lcyBub3QgZXhpc3RzKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBjYWxsZWQgd2hlbiBtZXRob2QgZG9lcyBub3QgZXhpc3QKICAgIC8vICEhISEhIEJVR0dZIElOIFBIUCA1LjMuMyAgLSBleC4gbGlmdGFnby1nbG9iYWwgIHBhcmVudDo6bWV0aG9kKCkgY2FsbHMgX19jYWxsU3RhdGljISEhISBodHRwOi8vd3d3LmNvbnRlbnR3aXRoc3R5bGUuY28udWsvY29udGVudC9iZWhhdmlvdXItb2YtcGFyZW50LWluLXBocC01MzMvIAogICAgLyoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX19jYWxsU3RhdGljKCRuYW1lLCAkYXJndW1lbnRzKQogICAgewogICAgICAgIC8vZWNobyAiU3RhdGljIG1ldGhvZCAnIi4kbmFtZS4iJyBub3QgZm91bmQiOwogICAgICAgIC8vZXhpdDsKICAgICAgICBzaG93TWVzc2FnZSgiU3RhdGljIG1ldGhvZCAnIi4kbmFtZS4iJyBub3QgZm91bmQiLCBtdEVycm9yKTsKICAgICAgICAKICAgICAgICAKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9IAogICAgKi8gICAKICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfX2ltcGxlbWVudHMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfaW1wbGVtZW50cygkb2JqZWN0VHlwZSkKICAgIHsKICAgICAgICByZXR1cm4oaW5fYXJyYXkoJG9iamVjdFR5cGUsICR0aGlzLT5fX2ltcGxlbWVudHMoKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUlkKCkKICAgIHsKICAgICAgICByZXR1cm4oImkiLm1kNShVVUlEKCkpKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SmF2YVNjcmlwdEh0bWwoJGpzKSAgICAKICAgIHsKICAgICAgICByZXR1cm4oZ2V0SmF2YVNjcmlwdEh0bWwoJGpzLCAkdGhpcy0+bGF0ZUpTQ2FsbCkpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRDbGFzc05hbWUoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPl9fY2xhc3NOYW1lKQogICAgICAgICAgICAkdGhpcy0+X19jbGFzc05hbWUgPSBnZXRfY2xhc3MoJHRoaXMpOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPl9fY2xhc3NOYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRDbGFzc05hbWVzKCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5fX3BhcmVudENsYXNzTmFtZXMpCiAgICAgICAgewogICAgICAgICAgICAkcGFyZW50Q2xhc3NOYW1lID0gJHRoaXMtPmdldENsYXNzTmFtZSgpOwogICAgICAgICAgICBkdW1wKCRwYXJlbnRDbGFzc05hbWUpOwogICAgICAgICAgICBkdW1wKGdldF9wYXJlbnRfY2xhc3MoJHBhcmVudENsYXNzTmFtZSkpOwogICAgICAgICAgICB3aGlsZSgkcGFyZW50Q2xhc3NOYW1lID0gZ2V0X3BhcmVudF9jbGFzcygkcGFyZW50Q2xhc3NOYW1lKSkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5fX3BhcmVudENsYXNzTmFtZXNbXSA9ICRwYXJlbnRDbGFzc05hbWU7CiAgICAgICAgICAgIH0gCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkdGhpcy0+X19wYXJlbnRDbGFzc05hbWVzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRPYmplY3RUeXBlcygpCiAgICB7CiAgICAgICAgJG9iamVjdFR5cGVzID0gYXJyYXkoKTsKICAgICAgICAkY2xhc3NOYW1lcyA9ICR0aGlzLT5nZXRQYXJlbnRDbGFzc05hbWVzKCk7CiAgICAgICAgZm9yZWFjaCgkY2xhc3NOYW1lcyBhcyAkY2xhc3NOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgJG9iamVjdFR5cGVzW10gPSBzdWJzdHIoJGNsYXNzTmFtZSwgMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkb2JqZWN0VHlwZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldENoaWxkQ2xhc3NOYW1lcygpCiAgICB7CiAgICAgICAgJGNsYXNzTmFtZXMgPSBhcnJheSgpOwogICAgICAgICRvYmplY3RUeXBlcyA9ICR0aGlzLT5nZXRDaGlsZE9iamVjdFR5cGVzKCk7CiAgICAgICAgZm9yZWFjaCgkb2JqZWN0VHlwZXMgYXMgJG9iamVjdFR5cGUpCiAgICAgICAgewogICAgICAgICAgICAkY2xhc3NOYW1lc1tdID0gIlQiLiRvYmplY3RUeXBlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGNsYXNzTmFtZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldENoaWxkT2JqZWN0VHlwZXMoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPl9fY2hpbGRPYmplY3RUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgICRvYmplY3RUeXBlID0gJHRoaXMtPmdldE9iamVjdFR5cGUoKTsKICAgICAgICAgICAgJHRoaXMtPl9fY2hpbGRPYmplY3RUeXBlcyA9IGdldE9iamVjdFR5cGVzKCRvYmplY3RUeXBlKTsKICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPl9fY2hpbGRPYmplY3RUeXBlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0T2JqZWN0VHlwZSgpCiAgICB7CiAgICAgICAgJGNsYXNzTmFtZSA9ICR0aGlzLT5nZXRDbGFzc05hbWUoKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHJldHVybihzdWJzdHIoJGNsYXNzTmFtZSwgMSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaGVyaXRzKCRjbGFzc05hbWUpCiAgICB7CiAgICAgICAgc3RhcnRQcm9maWxlKCJUT2JqZWN0Ojppbmhlcml0cyIpOwogICAgICAgIGlmIChpc3NldCgkdGhpcykpCiAgICAgICAgewogICAgICAgICAgICAkcmV0ID0gKGdldF9jbGFzcygkdGhpcykgPT0gJGNsYXNzTmFtZSB8fCBpc19zdWJjbGFzc19vZigkdGhpcywgJGNsYXNzTmFtZSkgfHwgZ2V0X2NsYXNzKCR0aGlzKSA9PSAiVCIuJGNsYXNzTmFtZSB8fCBpc19zdWJjbGFzc19vZigkdGhpcywgIlQiLiRjbGFzc05hbWUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9IChnZXRfY2FsbGVkX2NsYXNzKCkgPT0gJGNsYXNzTmFtZSB8fCBpc19zdWJjbGFzc19vZihnZXRfY2FsbGVkX2NsYXNzKCksICRjbGFzc05hbWUpIHx8IGdldF9jYWxsZWRfY2xhc3MoKSA9PSAiVCIuJGNsYXNzTmFtZSB8fCBpc19zdWJjbGFzc19vZihnZXRfY2FsbGVkX2NsYXNzKCksICJUIi4kY2xhc3NOYW1lKSk7CiAgICAgICAgfQogICAgICAgIHN0b3BQcm9maWxlKCJUT2JqZWN0Ojppbmhlcml0cyIpOwogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgICAgICAKICAgICAgICAvL3JldHVybihnZXRfY2xhc3MoJHRoaXMpID09ICRjbGFzc05hbWUgfHwgaXNfc3ViY2xhc3Nfb2YoJHRoaXMsICRjbGFzc05hbWUpIHx8IGdldF9jbGFzcygkdGhpcykgPT0gIlQiLiRjbGFzc05hbWUgfHwgaXNfc3ViY2xhc3Nfb2YoJHRoaXMsICJUIi4kY2xhc3NOYW1lKSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UHJvcGVydHkoJG5hbWUsICR2YWx1ZSkgICAgCiAgICB7CiAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBzZXRQcm9wZXJ0aWVzKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHBhcmFtcywgIiIsIGZhbHNlKTsKICAgICAgICAKICAgICAgICBpZiAoZ2V0X2NsYXNzKCR0aGlzKSAhPSAiVEV2ZW50IikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChvYmplY3RFeGlzdHMoIkV2ZW50cyIpICYmIGdldE9iamVjdCgiRXZlbnRzIiktPmhhc0V2ZW50cygib25TZXRPYmplY3RQcm9wZXJ0aWVzIikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRwYXJhbXMgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uU2V0T2JqZWN0UHJvcGVydGllcyIsIGFycmF5KCJPYmplY3QiPT4kdGhpcywgImNsYXNzTmFtZSI9PmdldF9jbGFzcygkdGhpcyksICJvYmplY3RUeXBlIj0+c3Vic3RyKGdldF9jbGFzcygkdGhpcyksIDEsIDEwMDApLCAicHJvcGVydGllcyI9PiRwYXJhbXMpLCAicHJvcGVydGllcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGdldF9jbGFzcygkdGhpcykpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJG5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRQcm9wZXJ0eSgkbmFtZSwgJHZhbHVlKTsKICAgICAgICAgICAgICAgIC8vJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vJHRoaXMtPl9fcHJvcGVydGllc1skbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRQcm9wZXJ0eSgkbmFtZSkKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+JG5hbWU7CiAgICAgICAgaWYgKG9iamVjdEV4aXN0cygiRXZlbnRzIikgJiYgZ2V0T2JqZWN0KCJFdmVudHMiKS0+aGFzRXZlbnRzKCJvbkdldE9iamVjdFByb3BlcnR5IikpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJG5hbWUpOwogICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgJHZhbHVlID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkdldE9iamVjdFByb3BlcnR5IiwgYXJyYXkoIk9iamVjdCI9PiR0aGlzLCAiY2xhc3NOYW1lIj0+Z2V0X2NsYXNzKCR0aGlzKSwgIm9iamVjdFR5cGUiPT5zdWJzdHIoZ2V0X2NsYXNzKCR0aGlzKSwgMSwgMTAwMCksICJuYW1lIj0+JG5hbWUsICJ2YWx1ZSI9PiR2YWx1ZSksICJ2YWx1ZSIpOwogICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCR2YWx1ZSk7CiAgICB9CiAgICAgICAgCiAgICAvKgogICAgZnVuY3Rpb24gX19nZXQoJG5hbWUpCiAgICB7CiAgICAgICAgZWNobyAiR0VUIjsKICAgICAgICBlY2hvICRuYW1lOwogICAgICAgIC8vdmFyX2R1bXAoaXNzZXQoJHRoaXMtPiRuYW1lKSk7CiAgICAgICAgcmV0dXJuKCR0aGlzLT4kbmFtZSk7CiAgICAgICAgLy9yZXR1cm4oJHRoaXMtPl9fcHJvcGVydGllc1skbmFtZV0pOwogICAgfQogICAgKi8KCiAgICAvKgogICAgZnVuY3Rpb24gX19zZXQoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICAvL2VjaG8gIlNFVCI7CiAgICAgICAgLy9lY2hvICRuYW1lOwogICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgJHRoaXMtPl9fcHJvcGVydGllc1skbmFtZV0gPSAkdmFsdWU7CiAgICB9CiAgICAqLwoKICAgIGZ1bmN0aW9uIGNhbGwoJG1ldGhvZE5hbWUsICRtZXRob2RQYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAvL3Zhcl9kdW1wKCRtZXRob2ROYW1lKTsKICAgICAgICAvL2R1bXAoJG1ldGhvZE5hbWUpOwogICAgICAgIC8vZHVtcCgkbWV0aG9kUGFyYW1zKTsKICAgICAgICBpZiAoIWlzX3N0cmluZygkbWV0aG9kTmFtZSkpCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiVE9iamVjdDo6Y2FsbCgpIC0gbWV0aG9kIG5hbWUgbXVzdCBiZSBzdHJpbmc6ICIuJG1ldGhvZE5hbWUsIG10RXJyb3IpOwogICAgICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aW1lU3RhcnQgPSBnZXRNaWNyb1RpbWUodHJ1ZSk7CiAgICAgICAgJHJldCA9IE5VTEw7CiAgICAgICAgc3dpdGNoKGNvdW50KCRtZXRob2RQYXJhbXMpKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAwOiAkcmV0ID0gJHRoaXMtPiRtZXRob2ROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTogJHJldCA9ICR0aGlzLT4kbWV0aG9kTmFtZSgkbWV0aG9kUGFyYW1zWzBdKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOiAkcmV0ID0gJHRoaXMtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6ICRyZXQgPSAkdGhpcy0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDogJHJldCA9ICR0aGlzLT4kbWV0aG9kTmFtZSgkbWV0aG9kUGFyYW1zWzBdLCAkbWV0aG9kUGFyYW1zWzFdLCAkbWV0aG9kUGFyYW1zWzJdLCAkbWV0aG9kUGFyYW1zWzNdKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA1OiAkcmV0ID0gJHRoaXMtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDY6ICRyZXQgPSAkdGhpcy0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNzogJHJldCA9ICR0aGlzLT4kbWV0aG9kTmFtZSgkbWV0aG9kUGFyYW1zWzBdLCAkbWV0aG9kUGFyYW1zWzFdLCAkbWV0aG9kUGFyYW1zWzJdLCAkbWV0aG9kUGFyYW1zWzNdLCAkbWV0aG9kUGFyYW1zWzRdLCAkbWV0aG9kUGFyYW1zWzVdLCAkbWV0aG9kUGFyYW1zWzZdKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA4OiAkcmV0ID0gJHRoaXMtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0sICRtZXRob2RQYXJhbXNbNV0sICRtZXRob2RQYXJhbXNbNl0sICRtZXRob2RQYXJhbXNbN10pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDk6ICRyZXQgPSAkdGhpcy0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTA6ICRyZXQgPSAkdGhpcy0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSwgJG1ldGhvZFBhcmFtc1s5XSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aW1lRW5kID0gZ2V0TWljcm9UaW1lKHRydWUpOwogICAgICAgICR0aGlzLT5fX21ldGhvZFRpbWVzWyRtZXRob2ROYW1lXVtdID0gJHRpbWVFbmQtJHRpbWVTdGFydDsKCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEpzUGFyYW1zKCRwYXJhbXMpCiAgICB7CiAgICAgICAgdW5zZXQoJHBhcmFtc1siX19wYXJhbXMiXVsiX19wYXJhbXMiXSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKGdldEpzUGFyYW1zKCRwYXJhbXMpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDU1NDbGFzc2VzKCRjbGFzc2VzKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGNsYXNzZXMpKQogICAgICAgICAgICAkY2xhc3NlcyA9IGV4cGxvZGUoIiAiLCAkY2xhc3Nlcyk7CiAgICAgICAgICAgIAogICAgICAgICRjbGFzc2VzID0gYXJyYXlfZmxpcCgkY2xhc3Nlcyk7CiAgICAgICAgZm9yZWFjaCgkY2xhc3NlcyBhcyAkY2xhc3MgPT4gJGR1bW15KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRjbGFzc1swXSA9PSAiISIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVuc2V0KCRjbGFzc2VzWyRjbGFzc10pOwogICAgICAgICAgICAgICAgdW5zZXQoJGNsYXNzZXNbc3Vic3RyKCRjbGFzcywgMSwgc3RybGVuKCRjbGFzcykpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGNsYXNzZXMgPSBhcnJheV9rZXlzKCRjbGFzc2VzKTsKICAgICAgICAKICAgICAgICByZXR1cm4oaW1wbG9kZSgiICIsICRjbGFzc2VzKSk7CiAgICB9CgogICAgZnVuY3Rpb24gaGFzTWV0aG9kKCRuYW1lLCAkaW5oZXJlbnQ9ZmFsc2UpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5tZXRob2RFeGlzdHMoJG5hbWUsICRpbmhlcmVudCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uR2V0T2JqZWN0UGFyYW1zKCRwYXJhbXMpCiAgICB7CiAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9fZ2V0RXh0ZW5kaW5nUmV0VmFsdWVQYXJhbU1ldGhvZHMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfX2dldEV4dGVuZGluZ1JldFZhbHVlUGFyYW1WYWx1ZSgkbWV0aG9kKQogICAgewogICAgICAgIGlmIChpc3NldCgkdGhpcy0+X19leHRlbmRpbmdSZXRWYWx1ZVBhcmFtVmFsdWVzWyRtZXRob2RdKSkKICAgICAgICAgICAgcmV0dXJuKCR0aGlzLT5fX2V4dGVuZGluZ1JldFZhbHVlUGFyYW1WYWx1ZXNbJG1ldGhvZF0pOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgJG1ldGhvZHMgPSAkdGhpcy0+X19nZXRFeHRlbmRpbmdSZXRWYWx1ZVBhcmFtTWV0aG9kcygpOwogICAgICAgICAgICByZXR1cm4oJG1ldGhvZHNbJG1ldGhvZF0pOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9fc2V0RXh0ZW5kaW5nUmV0VmFsdWVQYXJhbVZhbHVlKCRtZXRob2QsICR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+X19leHRlbmRpbmdSZXRWYWx1ZVBhcmFtVmFsdWVzWyRtZXRob2RdID0gJHZhbHVlOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uR2V0UHJvcGVydGllcygpCiAgICB7CiAgICAgICAgcmV0dXJuKGFycmF5KCkpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFByb3BlcnRpZXMoJHRhZz0iIikKICAgIHsKICAgICAgICAkY2xhc3NOYW1lID0gZ2V0X2NhbGxlZF9jbGFzcygpOwogICAgICAgIAogICAgICAgICRwcm9wZXJ0aWVzID0gbWVyZ2VQcm9wZXJ0aWVzKGNhbGxfc3RhdGljX21ldGhvZCgkY2xhc3NOYW1lLCAib25HZXRQcm9wZXJ0aWVzIiwgJHRhZyksIGFycmF5KCkpOwogICAgICAgICRwcm9wZXJ0aWVzID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkdldE9iamVjdFByb3BlcnRpZXMiLCBhcnJheSgiY2xhc3NOYW1lIj0+JGNsYXNzTmFtZSwicHJvcGVydGllcyI9PiRwcm9wZXJ0aWVzKSwgInByb3BlcnRpZXMiKTsKCiAgICAgICAgLy8gY2FsbGVkIGluIHN0YXRpYyBjb250ZW50IQogICAgICAgIC8vJGV4dGVuZGluZ09iamVjdFR5cGVzID0gY2FsbF9zdGF0aWNfbWV0aG9kKCRjbGFzc05hbWUsICJnZXRFeHRlbmRpbmdPYmplY3RUeXBlcyIpOwogICAgICAgICRleHRlbmRpbmdPYmplY3RUeXBlcyA9IGdldE9iamVjdChzdWJzdHIoJGNsYXNzTmFtZSwgMSkpLT5nZXRFeHRlbmRpbmdPYmplY3RUeXBlcygpOwogICAgICAgIGlmICgkZXh0ZW5kaW5nT2JqZWN0VHlwZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRleHRlbmRpbmdPYmplY3RUeXBlcyBhcyAkZXh0ZW5kaW5nT2JqZWN0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJE9iamVjdCA9IGdldE9iamVjdCgkZXh0ZW5kaW5nT2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoJE9iamVjdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJE9iamVjdC0+aGFzTWV0aG9kKCJvbkdldFByb3BlcnRpZXMiKSkKICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BlcnRpZXMgPSAkT2JqZWN0LT5vbkdldFByb3BlcnRpZXMoJHByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHByb3BlcnRpZXMpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRDb250ZXh0TWVudUh0bWwoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIC8vIFRPRE8gYmV0dGVyCiAgICAgICAgLy8kYWpheENvbnRleHRNZW51ID0gZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5hamF4Q29udGV4dE1lbnU7CiAgICAgICAgLy9nZXRPYmplY3QoIlNldHRpbmdzIiktPmFqYXhDb250ZXh0TWVudSA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8vJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMsIGZhbHNlKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgLy9nZXRPYmplY3QoIlNldHRpbmdzIiktPmFqYXhDb250ZXh0TWVudSA9ICRhamF4Q29udGV4dE1lbnU7CiAgICAgICAgLy9kdW1wKCR0aGlzKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9TZHVtcChnZXRfY2xhc3MoJHRoaXMpKTsKICAgICAgICBmb3JlYWNoKCRwYXJhbXNbIl9SRVFVRVNUIl0gYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICQkbmFtZTsKICAgICAgICAgICAgJCRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICAkX0dFVFskbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgICAgICRfUkVRVUVTVFskbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aGlzLT5pbml0KCRwYXJhbXMpOwogICAgICAgIGdsb2JhbCAkdGFibGVOYW1lOwogICAgICAgICRpdGVtcyA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25HZXRDb250ZXh0TWVudUl0ZW1zIiwgYXJyYXkoIml0ZW1zIj0+YXJyYXkoKSwgIk9iamVjdCI9PiR0aGlzLCAicGFyYW1zIj0+JHBhcmFtcywgInRhYmxlTmFtZSI9PiR0YWJsZU5hbWUpLCAiaXRlbXMiKTsKICAgICAgICAkT2JqZWN0ID0gY3JlYXRlT2JqZWN0KCJDb250ZXh0TWVudSIpOwogICAgICAgICRodG1sIC49ICRPYmplY3QtPmdldENvbnRlbnQoYXJyYXkoCiAgICAgICAgICAgICJpZCIgPT4gJHBhcmFtc1siY29udGV4dE1lbnVJZCJdLAogICAgICAgICAgICAiaXRlbXMiID0+ICRpdGVtcywKICAgICAgICApKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiB0b0FycmF5KCkKICAgIHsKICAgICAgICAkYSA9IChhcnJheSkkdGhpczsKICAgICAgICAKICAgICAgICAkYSA9IGFycmF5KCJvYmplY3QiPT5zdWJzdHIoZ2V0X2NsYXNzKCR0aGlzKSwgMSwgMTAwMCksICJwYXJhbXMiPT4kYSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRhKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdG9KU09OKCkKICAgIHsKICAgICAgICByZXR1cm4oVEpTT046OmVuY29kZSgkdGhpcy0+dG9BcnJheSgpKSk7CiAgICB9Cn0KCmNsYXNzIFREdW1teU9iamVjdAp7CiAgICBmdW5jdGlvbiBfX2NhbGwoJG5hbWUsICRhcmd1bWVudHMpCiAgICB7CiAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KICAgIAogICAgLy8gdG8gc2ltdWxhdGUgaWYgKCEkT2JqZWN0KSAKICAgIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybigiIik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfX2ltcGxlbWVudHMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSgpKTsKICAgIH0KCn0KCmNsYXNzIFRDb3JlT2JqZWN0IGV4dGVuZHMgVE9iamVjdAp7CiAgICAvLyB3ZSBkbyBub3Qgd2FudCB0byBjYWxsIHBhcmVudDo6Z2V0SGVhZEh0bWwoKTsKICAgIGZ1bmN0aW9uIGdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIUFKQVgpCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9PYmplY3QvT2JqZWN0LmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOwogICAgfQogICAgCgogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPmdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9fd2FrZXVwKCkKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0SGVhZEh0bWwoJHRoaXMtPnBhcmFtcyk7CiAgICB9Cn0KCmNsYXNzIFRDYWNoZU9iamVjdCBleHRlbmRzIFRDb3JlT2JqZWN0CnsKICAgIHZhciAkY2xlYXJlZCA9IGFycmF5KCk7CiAgICB2YXIgJHNhdmVkID0gYXJyYXkoKTsKICAgIC8vdmFyICRjYWNoZURvbWFpbiA9IHRydWU7CiAgICAKICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGNhbGwgcGFyZW50OjpnZXRIZWFkSHRtbCgpOwogICAgZnVuY3Rpb24gZ2V0SGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRDYWNoZU5hbWUoJGNsYXNzTmFtZSwgJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgICRjYWNoZU5hbWUgPSBzdWJzdHIoJGNsYXNzTmFtZSwgMSwgMTAwMCk7CiAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXMpKQogICAgICAgICAgICAgICAgJGNhY2hlTmFtZSAuPSAiXyIuJHBhcmFtczsKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbIm5hbWUiXSkKICAgICAgICAgICAgICAgICAgICAkY2FjaGVOYW1lIC49ICJfIi4kcGFyYW1zWyJuYW1lIl07CiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1sidGFibGVOYW1lIl0pCiAgICAgICAgICAgICAgICAgICAgJGNhY2hlTmFtZSAuPSAiXyIuJHBhcmFtc1sibmFtZSJdOwogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImlkIl0pCiAgICAgICAgICAgICAgICAgICAgJGNhY2hlTmFtZSAuPSAiXyIuJHBhcmFtc1siaWQiXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICByZXR1cm4oJGNhY2hlTmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2F2ZVRvQ2FjaGUoJGNhY2hlTmFtZT0iIikKICAgIHsKICAgICAgICBnbG9iYWwgJGNvcmVFcnJvck1lc3NhZ2VzQXJyYXk7CiAgICAgICAgaWYgKCRjb3JlRXJyb3JNZXNzYWdlc0FycmF5KQogICAgICAgIHsKICAgICAgICAgICAgLy9zaG93TWVzc2FnZShnZXRfY2xhc3MoJHRoaXMpLiIgLSBzb21lIHByZXZpb3VzIGVycm9ycyBkZXRlY3RlZCAtIHNraXBwaW5nIHNhdmUuLi4iLCBtdEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkY2FjaGVOYW1lKQogICAgICAgICAgICAkY2FjaGVOYW1lID0gJHRoaXMtPmdldENhY2hlTmFtZShnZXRfY2xhc3MoJHRoaXMpLCAkdGhpcy0+X19jcmVhdGVQYXJhbXMpOwogICAgICAgIAogICAgICAgICR0aGlzLT5zYXZlZFskY2FjaGVOYW1lXSA9IHRydWU7CiAgICAgICAgaWYgKCEkdGhpcy0+Y2xlYXJlZFskY2FjaGVOYW1lXSAmJiAhJHRoaXMtPmNhY2hlRGlzYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICBnZXRPYmplY3QoIkNhY2hlIiktPnNhdmVPYmplY3QoJGNhY2hlTmFtZSwgJHRoaXMsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJDYWNoZSgkY2FjaGVOYW1lPSIiKQogICAgewogICAgICAgIGlmICghJGNhY2hlTmFtZSkKICAgICAgICAgICAgJGNhY2hlTmFtZSA9ICR0aGlzLT5nZXRDYWNoZU5hbWUoZ2V0X2NsYXNzKCR0aGlzKSwgJHRoaXMtPl9fY3JlYXRlUGFyYW1zKTsKICAgICAgICAKICAgICAgICAkdGhpcy0+Y2xlYXJlZFskY2FjaGVOYW1lXSA9IHRydWU7CiAgICAgICAgZ2V0T2JqZWN0KCJDYWNoZSIpLT5jbGVhcigkY2FjaGVOYW1lKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gc2V0UHJvcGVydHkoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+Y2FjaGVEaXNhYmxlZCA9IHRydWU7CiAgICAgICAgCiAgICAgICAgcGFyZW50OjpzZXRQcm9wZXJ0eSgkbmFtZSwgJHZhbHVlKTsKICAgIH0KfQoKY2xhc3MgVERhdGFDYWNoZU9iamVjdCBleHRlbmRzIFRDYWNoZU9iamVjdAp7CiAgICB2YXIgJGRhdGEgPSBhcnJheSgpOwogICAgdmFyICRkYXRhQ2FjaGVUaW1lb3V0ID0gIjFkIjsKICAgIHZhciAkY2FjaGVQcm9wZXJ0aWVzID0gYXJyYXkoImRhdGEiKTsgICAgCiAgICAKICAgIGZ1bmN0aW9uIGdldFZhbHVlKCRpZCkKICAgIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmdldERhdGEoJGlkKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RGF0YSgkaWQpCiAgICB7CiAgICAgICAgLy8gZm9yIEFKQVggY2FsbAogICAgICAgIGlmIChpc19hcnJheSgkaWQpKQogICAgICAgICAgICAkaWQgPSAkaWRbImlkIl07CgogICAgICAgIC8vZHVtcCgkdGhpcy0+ZGF0YSk7CiAgICAgICAgaWYgKCR0aGlzLT5kYXRhWyRpZF0gJiYgX3N0cnRvdGltZSgkdGhpcy0+ZGF0YVskaWRdWyJ0aW1lIl0pID4gdGltZSgpLV9zdHJ0b3RpbWUoJHRoaXMtPmRhdGFDYWNoZVRpbWVvdXQpKQogICAgICAgICAgICByZXR1cm4oJHRoaXMtPmRhdGFbJGlkXVsiZGF0YSJdKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5nZXREYXRhVmFsdWUoJGlkKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkZGF0YSAhPT0gTlVMTCkKICAgICAgICAgICAgICAgICR0aGlzLT5zZXREYXRhKCRpZCwgJGRhdGEpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybigkZGF0YSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBzZXREYXRhKCRpZCwgJGRhdGEpCiAgICB7CiAgICAgICAgLy9kdW1wKCIhIik7CiAgICAgICAgLy9kdW1wKCRpZCk7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5kYXRhKTsKICAgICAgICAkdGhpcy0+ZGF0YVskaWRdID0gYXJyYXkoInRpbWUiPT5ub3coKSwgImRhdGEiPT4kZGF0YSk7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5kYXRhKTsKICAgICAgICAKICAgICAgICAvL2dsb2JhbCAkY29yZUVycm9yTWVzc2FnZXNBcnJheTsKICAgICAgICAvL2lmICghJGNvcmVFcnJvck1lc3NhZ2VzQXJyYXkpCiAgICAgICAgICAgICR0aGlzLT5zYXZlVG9DYWNoZSgpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBjbGVhcigkaWQ9IiIpCiAgICB7CiAgICAgICAgaWYgKCRpZCkKICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmRhdGFbJGlkXSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPnNhdmVUb0NhY2hlKCk7CiAgICB9CgogICAgLy8gcmV0dXJuIG5ldyBkYXRhIHRvIGdldCBhbmQgc2F2ZSB0byBjYWNoZQogICAgZnVuY3Rpb24gZ2V0RGF0YVZhbHVlKCRpZD0iIikKICAgIHsKICAgIH0KfQoKZGVmaW5lKCJFWFRFTkRJTkdfT0JKRUNUX01FVEhPRF9OT1RfRk9VTkQiLCAiRVhURU5ESU5HX09CSkVDVF9NRVRIT0RfTk9UX0ZPVU5EIik7CmNsYXNzIFRFeHRlbmRpbmdPYmplY3QKewogICAgLy9wdWJsaWMgc3RhdGljICRleHRlbmRpbmdPYmplY3RQcmlvcml0eSA9IDA7CiAgICBwdWJsaWMgc3RhdGljICRleHRlbmRpbmdPYmplY3RQcmlvcml0eSA9IDA7CiAgICB2YXIgJHJlZmVyZW5jZVBhcmFtTWV0aG9kcyA9IGFycmF5KCk7CgogICAgZnVuY3Rpb24gX19fY29uc3RydWN0KCRUSElTKQogICAgewogICAgICAgIAogICAgfQoKICAgIHN0YXRpYyBmdW5jdGlvbiBnZXRFeHRlbmRpbmdPYmplY3RQcmlvcml0eSgpCiAgICB7CiAgICAgICAgJGNsYXNzTmFtZSA9IGdldF9jYWxsZWRfY2xhc3MoKTsKICAgICAgICAkcHJpb3JpdHkgPSBnZXRfc3RhdGljX3ZhcmlhYmxlKCRjbGFzc05hbWUsICJleHRlbmRpbmdPYmplY3RQcmlvcml0eSIpOwogICAgICAgIC8vZHVtcCgiLSIpOwogICAgICAgIC8vZHVtcCgkY2xhc3NOYW1lKTsKICAgICAgICAvL2R1bXAoJHByaW9yaXR5KTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHByaW9yaXR5KTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9faW1wbGVtZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuKGFycmF5KCkpOwogICAgfQoKICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGNhbGwgcGFyZW50OjpnZXRIZWFkSHRtbCgpOwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgLy8gd2FzIGVtcHR5IC0gYnV0IG5lZWRlZCBmb3IgTW9iaWxlQnJvd3NlciBtb2R1bGUKICAgICAgICBpZiAoaXNzZXQoJHRoaXMpKQogICAgICAgICAgICAkdGhpcy0+b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkY2xhc3NOYW1lID0gZ2V0X2NhbGxlZF9jbGFzcygpOwogICAgICAgICAgICBjYWxsX3N0YXRpY19tZXRob2QoJGNsYXNzTmFtZSwgIm9uR2V0SGVhZEh0bWwiLCAkcGFyYW1zKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0SGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgfQogICAgCiAgICBmdW5jdGlvbiBjYWxsKCRPYmplY3QsICRtZXRob2ROYW1lLCAkbWV0aG9kUGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tZXRob2RzWyRtZXRob2ROYW1lXSA9PSAkY2xhc3NOYW1lICYmIG1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2ROYW1lKSkKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChjb3VudCgkbWV0aG9kUGFyYW1zKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4oJHRoaXMtPiRtZXRob2ROYW1lKCRPYmplY3QpKTsKICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuKCR0aGlzLT4kbWV0aG9kTmFtZSgkT2JqZWN0LCAkbWV0aG9kUGFyYW1zWzBdKSk7CiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybigkdGhpcy0+JG1ldGhvZE5hbWUoJE9iamVjdCwgJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSkpOwogICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4oJHRoaXMtPiRtZXRob2ROYW1lKCRPYmplY3QsICRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0pKTsKICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuKCR0aGlzLT4kbWV0aG9kTmFtZSgkT2JqZWN0LCAkbWV0aG9kUGFyYW1zWzBdLCAkbWV0aG9kUGFyYW1zWzFdLCAkbWV0aG9kUGFyYW1zWzJdLCAkbWV0aG9kUGFyYW1zWzNdKSk7CiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybigkdGhpcy0+JG1ldGhvZE5hbWUoJE9iamVjdCwgJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSkpOwogICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4oJHRoaXMtPiRtZXRob2ROYW1lKCRPYmplY3QsICRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0sICRtZXRob2RQYXJhbXNbNV0pKTsKICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuKCR0aGlzLT4kbWV0aG9kTmFtZSgkT2JqZWN0LCAkbWV0aG9kUGFyYW1zWzBdLCAkbWV0aG9kUGFyYW1zWzFdLCAkbWV0aG9kUGFyYW1zWzJdLCAkbWV0aG9kUGFyYW1zWzNdLCAkbWV0aG9kUGFyYW1zWzRdLCAkbWV0aG9kUGFyYW1zWzVdLCAkbWV0aG9kUGFyYW1zWzZdKSk7CiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybigkdGhpcy0+JG1ldGhvZE5hbWUoJE9iamVjdCwgJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSkpOwogICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4oJHRoaXMtPiRtZXRob2ROYW1lKCRPYmplY3QsICRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0sICRtZXRob2RQYXJhbXNbNV0sICRtZXRob2RQYXJhbXNbNl0sICRtZXRob2RQYXJhbXNbN10sICRtZXRob2RQYXJhbXNbOF0pKTsKICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybigkdGhpcy0+JG1ldGhvZE5hbWUoJE9iamVjdCwgJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSwgJG1ldGhvZFBhcmFtc1s5XSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgcmV0dXJuKEVYVEVORElOR19PQkpFQ1RfTUVUSE9EX05PVF9GT1VORCk7CiAgICB9CgogICAgZnVuY3Rpb24gbWV0aG9kRXhpc3RzKCRuYW1lKQogICAgewogICAgICAgIGlmICgkdGhpcy0+X19tZXRob2RzWyRuYW1lXSA9PT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5fX21ldGhvZHNbJG5hbWVdID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJG5hbWUpKQogICAgICAgICAgICAgICAgJHRoaXMtPl9fbWV0aG9kc1skbmFtZV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPl9fbWV0aG9kc1skbmFtZV0pOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYXNNZXRob2QoJG5hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5tZXRob2RFeGlzdHMoJG5hbWUpKTsKICAgIH0gICAgCn0KCmNsYXNzIFRPYmplY3RXcmFwcGVyIGV4dGVuZHMgVE9iamVjdAp7CiAgICB2YXIgJE9iamVjdCA9IE5VTEw7CiAgICAKICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGNhbGwgcGFyZW50OjpnZXRIZWFkSHRtbCgpOwogICAgZnVuY3Rpb24gZ2V0SGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgfQogICAgCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcDE9IlVOREVGSU5FRCIsICRwMj0iVU5ERUZJTkVEIiwgJHAzPSJVTkRFRklORUQiLCAkcDQ9IlVOREVGSU5FRCIsICRwNT0iVU5ERUZJTkVEIiwgJHA2PSJVTkRFRklORUQiLCAkcDc9IlVOREVGSU5FRCIsICRwOD0iVU5ERUZJTkVEIiwgJHA5PSJVTkRFRklORUQiLCAkcDEwPSJVTkRFRklORUQiLCAkcDExPSJVTkRFRklORUQiLCAkcDEyPSJVTkRFRklORUQiLCAkcDEzPSJVTkRFRklORUQiLCAkcDE0PSJVTkRFRklORUQiLCAkcDE1PSJVTkRFRklORUQiKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2xhc3NOYW1lICYmIGNsYXNzX2V4aXN0cygkdGhpcy0+Y2xhc3NOYW1lLCBmYWxzZSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHAxID09PSAiVU5ERUZJTkVEIikKICAgICAgICAgICAgICAgICR0aGlzLT5PYmplY3QgPSBuZXcgJHRoaXMtPmNsYXNzTmFtZSgpOwogICAgICAgICAgICBlbHNlIGlmICgkcDIgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSk7CiAgICAgICAgICAgIGVsc2UgaWYgKCRwMyA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICAgICAkdGhpcy0+T2JqZWN0ID0gbmV3ICR0aGlzLT5jbGFzc05hbWUoJHAxLCAkcDIpOwogICAgICAgICAgICBlbHNlIGlmICgkcDQgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMpOwogICAgICAgICAgICBlbHNlIGlmICgkcDUgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMsICRwNCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCRwNiA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICAgICAkdGhpcy0+T2JqZWN0ID0gbmV3ICR0aGlzLT5jbGFzc05hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUpOwogICAgICAgICAgICBlbHNlIGlmICgkcDcgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYpOwogICAgICAgICAgICBlbHNlIGlmICgkcDggPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNyk7CiAgICAgICAgICAgIGVsc2UgaWYgKCRwOSA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICAgICAkdGhpcy0+T2JqZWN0ID0gbmV3ICR0aGlzLT5jbGFzc05hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3LCAkcDgpOwogICAgICAgICAgICBlbHNlIGlmICgkcDEwID09PSAiVU5ERUZJTkVEIikKICAgICAgICAgICAgICAgICR0aGlzLT5PYmplY3QgPSBuZXcgJHRoaXMtPmNsYXNzTmFtZSgkcDEsICRwMiwgJHAzLCAkcDQsICRwNSwgJHA2LCAkcDcsICRwOCwgJHA5KTsKICAgICAgICAgICAgZWxzZSBpZiAoJHAxMSA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICAgICAkdGhpcy0+T2JqZWN0ID0gbmV3ICR0aGlzLT5jbGFzc05hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3LCAkcDgsICRwOSwgJHAxMCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCRwMTIgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTAsICRwMTEpOwogICAgICAgICAgICBlbHNlIGlmICgkcDEzID09PSAiVU5ERUZJTkVEIikKICAgICAgICAgICAgICAgICR0aGlzLT5PYmplY3QgPSBuZXcgJHRoaXMtPmNsYXNzTmFtZSgkcDEsICRwMiwgJHAzLCAkcDQsICRwNSwgJHA2LCAkcDcsICRwOCwgJHA5LCAkcDEwLCAkcDExLCAkcDEyKTsKICAgICAgICAgICAgZWxzZSBpZiAoJHAxNCA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICAgICAkdGhpcy0+T2JqZWN0ID0gbmV3ICR0aGlzLT5jbGFzc05hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3LCAkcDgsICRwOSwgJHAxMCwgJHAxMSwgJHAxMiwgJHAxMyk7CiAgICAgICAgICAgIGVsc2UgaWYgKCRwMTUgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTAsICRwMTEsICRwMTIsICRwMTMsICRwMTQpOwogICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgJHRoaXMtPk9iamVjdCA9IG5ldyAkdGhpcy0+Y2xhc3NOYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTAsICRwMTEsICRwMTIsICRwMTMsICRwMTQsICRwMTUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZShnZXRfY2xhc3MoJHRoaXMpLiI6Ol9fY29uc3RydWN0KCkgLSBjbGFzcyAiLiR0aGlzLT5jbGFzc05hbWUuIiBub3QgZm91bmQiLCBtdEVycm9yKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX19jYWxsKCRtZXRob2ROYW1lLCAkbWV0aG9kUGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkdGhpcyk7CiAgICAgICAgLy92YXJfZHVtcCgkbWV0aG9kTmFtZSk7CiAgICAgICAgLy9leGl0OwogICAgICAgIHN3aXRjaChjb3VudCgkbWV0aG9kUGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuKCR0aGlzLT5PYmplY3QtPiRtZXRob2ROYW1lKCkpOwogICAgICAgICAgICBjYXNlIDE6IHJldHVybigkdGhpcy0+T2JqZWN0LT4kbWV0aG9kTmFtZSgkbWV0aG9kUGFyYW1zWzBdKSk7CiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuKCR0aGlzLT5PYmplY3QtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0pKTsKICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSkpOwogICAgICAgICAgICBjYXNlIDQ6IHJldHVybigkdGhpcy0+T2JqZWN0LT4kbWV0aG9kTmFtZSgkbWV0aG9kUGFyYW1zWzBdLCAkbWV0aG9kUGFyYW1zWzFdLCAkbWV0aG9kUGFyYW1zWzJdLCAkbWV0aG9kUGFyYW1zWzNdKSk7CiAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuKCR0aGlzLT5PYmplY3QtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0pKTsKICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSkpOwogICAgICAgICAgICBjYXNlIDc6IHJldHVybigkdGhpcy0+T2JqZWN0LT4kbWV0aG9kTmFtZSgkbWV0aG9kUGFyYW1zWzBdLCAkbWV0aG9kUGFyYW1zWzFdLCAkbWV0aG9kUGFyYW1zWzJdLCAkbWV0aG9kUGFyYW1zWzNdLCAkbWV0aG9kUGFyYW1zWzRdLCAkbWV0aG9kUGFyYW1zWzVdLCAkbWV0aG9kUGFyYW1zWzZdKSk7CiAgICAgICAgICAgIGNhc2UgODogcmV0dXJuKCR0aGlzLT5PYmplY3QtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0sICRtZXRob2RQYXJhbXNbNV0sICRtZXRob2RQYXJhbXNbNl0sICRtZXRob2RQYXJhbXNbN10pKTsKICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSkpOwogICAgICAgICAgICBjYXNlIDEwOiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSwgJG1ldGhvZFBhcmFtc1s5XSkpOwogICAgICAgICAgICBjYXNlIDExOiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSwgJG1ldGhvZFBhcmFtc1s5XSwgJG1ldGhvZFBhcmFtc1sxMF0pKTsKICAgICAgICAgICAgY2FzZSAxMjogcmV0dXJuKCR0aGlzLT5PYmplY3QtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0sICRtZXRob2RQYXJhbXNbNV0sICRtZXRob2RQYXJhbXNbNl0sICRtZXRob2RQYXJhbXNbN10sICRtZXRob2RQYXJhbXNbOF0sICRtZXRob2RQYXJhbXNbOV0sICRtZXRob2RQYXJhbXNbMTBdLCAkbWV0aG9kUGFyYW1zWzExXSkpOwogICAgICAgICAgICBjYXNlIDEzOiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSwgJG1ldGhvZFBhcmFtc1s5XSwgJG1ldGhvZFBhcmFtc1sxMF0sICRtZXRob2RQYXJhbXNbMTFdLCAkbWV0aG9kUGFyYW1zWzEyXSkpOwogICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4oJHRoaXMtPk9iamVjdC0+JG1ldGhvZE5hbWUoJG1ldGhvZFBhcmFtc1swXSwgJG1ldGhvZFBhcmFtc1sxXSwgJG1ldGhvZFBhcmFtc1syXSwgJG1ldGhvZFBhcmFtc1szXSwgJG1ldGhvZFBhcmFtc1s0XSwgJG1ldGhvZFBhcmFtc1s1XSwgJG1ldGhvZFBhcmFtc1s2XSwgJG1ldGhvZFBhcmFtc1s3XSwgJG1ldGhvZFBhcmFtc1s4XSwgJG1ldGhvZFBhcmFtc1s5XSwgJG1ldGhvZFBhcmFtc1sxMF0sICRtZXRob2RQYXJhbXNbMTFdLCAkbWV0aG9kUGFyYW1zWzEyXSwgJG1ldGhvZFBhcmFtc1sxM10pKTsKICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuKCR0aGlzLT5PYmplY3QtPiRtZXRob2ROYW1lKCRtZXRob2RQYXJhbXNbMF0sICRtZXRob2RQYXJhbXNbMV0sICRtZXRob2RQYXJhbXNbMl0sICRtZXRob2RQYXJhbXNbM10sICRtZXRob2RQYXJhbXNbNF0sICRtZXRob2RQYXJhbXNbNV0sICRtZXRob2RQYXJhbXNbNl0sICRtZXRob2RQYXJhbXNbN10sICRtZXRob2RQYXJhbXNbOF0sICRtZXRob2RQYXJhbXNbOV0sICRtZXRob2RQYXJhbXNbMTBdLCAkbWV0aG9kUGFyYW1zWzExXSwgJG1ldGhvZFBhcmFtc1sxMl0sICRtZXRob2RQYXJhbXNbMTNdLCAkbWV0aG9kUGFyYW1zWzE0XSkpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKICAgIHsKICAgICAgICBkZWxldGVPYmplY3QoJHRoaXMtPk9iamVjdCk7CiAgICB9Cn0KCmNsYXNzIFRIVE1MRGlzcGxheU9iamVjdCBleHRlbmRzIFRDYWNoZU9iamVjdAp7CiAgICAvL3ZhciAkcmVjb3JkcyA9IGFycmF5KCk7CiAgICB2YXIgJGluZGV4ID0gYXJyYXkoKTsKICAgIHZhciAkY2FjaGVQcm9wZXJ0aWVzID0gYXJyYXkoImluZGV4IiwgImZpZWxkcyIsICJpbmRleEZpZWxkcyIpOwoKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICAgICAgCiAgICAgICAgJERiTGluayA9IGdldERlZmF1bHREYkxpbmsoKTsKICAgICAgICAkcmF3RmllbGRzID0gJERiTGluay0+c2VsZWN0KCJ0YWJsZV9maWVsZHMiLCBhcnJheSgiZmllbGRzIj0+Im5hbWUiLCAicmF3Ij0+dHJ1ZSwgImZpbHRlcl90YWJsZU5hbWUiPT4kdGhpcy0+dGFibGVOYW1lLCAiZmlsdGVyX2RhdGFUeXBlIj0+IiE9TlVMTCIsICJvcmRlckJ5Ij0+InBvc2l0aW9uIikpOwogICAgICAgICR0aGlzLT5maWVsZHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5pbmRleEZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcmF3RmllbGRzIGFzICRmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJGZpZWxkWyJuYW1lIl0sICR0aGlzLT5pbmRleERpc2FibGVkRmllbGRzKSkKICAgICAgICAgICAgICAgICR0aGlzLT5pbmRleEZpZWxkc1tdID0gJGZpZWxkWyJuYW1lIl07CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIWluX2FycmF5KCRmaWVsZFsibmFtZSJdLCAkdGhpcy0+c2VsZWN0RGlzYWJsZWRGaWVsZHMpKQogICAgICAgICAgICAgICAgJHRoaXMtPmZpZWxkc1tdID0gJGZpZWxkWyJuYW1lIl07CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRyZWNvcmRzID0gYXJyYXlfYXNzb2MoJERiTGluay0+c2VsZWN0KCR0aGlzLT50YWJsZU5hbWUsIGFycmF5KCJmaWVsZHMiPT4kdGhpcy0+ZmllbGRzLCAicmF3Ij0+dHJ1ZSwgIm9yZGVyQnkiPT4ibmFtZSIuKGluX2FycmF5KCJwb3NpdGlvbiIsICR0aGlzLT5maWVsZHMpID8gIixwb3NpdGlvbiIgOiAiIikpKSwgImlkIik7CiAgICAgICAgZm9yZWFjaCgkcmVjb3JkcyBhcyAka2V5ID0+ICRyZWNvcmQpCiAgICAgICAgewogICAgICAgICAgICAkcmVjb3Jkc1ska2V5XSA9ICR0aGlzLT5maXhWYWx1ZXMoJHJlY29yZCk7CiAgICAgICAgfQogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmZpZWxkcyk7CiAgICAgICAgCiAgICAgICAgLy8gY3JlYXRlIGluZGV4CiAgICAgICAgZm9yZWFjaCgkcmVjb3JkcyBhcyAka2V5ID0+ICRyZWNvcmQpCiAgICAgICAgewogICAgICAgICAgICAkcmVjb3JkMiA9IGFycmF5KCk7CiAgICAgICAgICAgICRyZWNvcmQyWyJpZCJdID0gJHJlY29yZFsiaWQiXTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRyZWNvcmRbImNvbmRpdGlvbiJdKSkKICAgICAgICAgICAgICAgICRyZWNvcmQyWyJjb25kaXRpb24iXSA9ICRyZWNvcmRbImNvbmRpdGlvbiJdOwogICAgICAgICAgICBpZiAoaXNzZXQoJHJlY29yZFsicG9zaXRpb24iXSkpCiAgICAgICAgICAgICAgICAkcmVjb3JkMlsicG9zaXRpb24iXSA9ICRyZWNvcmRbInBvc2l0aW9uIl07CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+aW5kZXhbJHRoaXMtPmdldEluZGV4S2V5KCRyZWNvcmQpXVtdID0gJHJlY29yZDI7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBmaXhWYWx1ZXMoJHZhbHVlcz1hcnJheSgpKQogICAgewogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCJzdHlsZSIsICR2YWx1ZXMpICYmICEkdmFsdWVzWyJzdHlsZSJdKQogICAgICAgICAgICAkdmFsdWVzWyJzdHlsZSJdID0gImRlZmF1bHQiOwogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCJ2aWV3VHlwZSIsICR2YWx1ZXMpICYmICEkdmFsdWVzWyJ2aWV3VHlwZSJdKQogICAgICAgICAgICAkdmFsdWVzWyJ2aWV3VHlwZSJdID0gInZ0QWxsIjsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygibGFuZ3VhZ2UiLCAkdmFsdWVzKSAmJiAhJHZhbHVlc1sibGFuZ3VhZ2UiXSkKICAgICAgICAgICAgJHZhbHVlc1sibGFuZ3VhZ2UiXSA9ICJhbGwiOwogICAgICAgIC8vaWYgKGFycmF5X2tleV9leGlzdHMoIm1lZGlhIiwgJHZhbHVlcykgJiYgISR2YWx1ZXNbIm1lZGlhIl0pCiAgICAgICAgLy8gICAgJHZhbHVlc1sibWVkaWEiXSA9ICJOVUxMfGVtYWlsIjsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygiZW1wdHkiLCAkdmFsdWVzKSkKICAgICAgICAgICAgJHZhbHVlc1siZW1wdHkiXSA9IHRvQm9vbCgkdmFsdWVzWyJlbXB0eSJdKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKCR2YWx1ZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEluZGV4S2V5KCR2YWx1ZXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAkdmFsdWVzID0gJHRoaXMtPmZpeFZhbHVlcygkdmFsdWVzKTsKICAgICAgICAKICAgICAgICAkaW5kZXhLZXkgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHRoaXMtPmluZGV4RmllbGRzIGFzICRpbmRleEZpZWxkKSAgICAKICAgICAgICB7CiAgICAgICAgICAgICRpbmRleEtleVtdID0gJHZhbHVlc1skaW5kZXhGaWVsZF07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybihpbXBsb2RlKCJ8IiwgJGluZGV4S2V5KSk7CiAgICB9CgogICAgZnVuY3Rpb24gX19zb3J0KCRhLCAkYikKICAgIHsKICAgICAgICBpZiAoKGludCkkYVsicG9zaXRpb24iXSA+IChpbnQpJGJbInBvc2l0aW9uIl0pCiAgICAgICAgICAgIHJldHVybigxKTsKICAgICAgICBlbHNlIGlmICgoaW50KSRhWyJwb3NpdGlvbiJdIDwgKGludCkkYlsicG9zaXRpb24iXSkKICAgICAgICAgICAgcmV0dXJuKC0xKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybigwKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZmluZFJlY29yZHMoJHBhcmFtcywgJGNvbmRpdGlvbikKICAgIHsKICAgICAgICBnbG9iYWwgJF9fSFRNTERpc3BsYXlPYmplY3RTZWFyY2hGdW5jdGlvbnM7CiAgICAgICAgaWYgKCFpc19hcnJheSgkX19IVE1MRGlzcGxheU9iamVjdFNlYXJjaEZ1bmN0aW9ucykpCiAgICAgICAgICAgICRfX0hUTUxEaXNwbGF5T2JqZWN0U2VhcmNoRnVuY3Rpb25zID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICAkcGFyYW1zMiA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkX19IVE1MRGlzcGxheU9iamVjdFNlYXJjaEZ1bmN0aW9ucyBhcyAkX19IVE1MRGlzcGxheU9iamVjdFNlYXJjaEZ1bmN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtczIgPSAkX19IVE1MRGlzcGxheU9iamVjdFNlYXJjaEZ1bmN0aW9uKCRwYXJhbXMyKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gVE9ETyAtIHJlY3Vyc2l2ZSBpZiBtb3JlIHRoYW4gb25lIGFkZGl0aW9uYWwgc2VhcmNoIHBhcmFtIChpbiB0aGUgZnV0dXJlIC0gbm93IGl0J3Mgb2sgZm9yIEFCVGVzdGluZykKICAgICAgICBpZiAoJHBhcmFtczIpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRwYXJhbXMyIGFzICRrZXkgPT4gJHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFsdWVzIGFzICR2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXldID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICRyZWNvcmRzID0gJHRoaXMtPl9maW5kUmVjb3JkcygkcGFyYW1zLCAkY29uZGl0aW9uKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAkcmVjb3JkcyA9ICR0aGlzLT5fZmluZFJlY29yZHMoJHBhcmFtcywgJGNvbmRpdGlvbik7CiAgICAgICAgICAgICAgICAKICAgICAgICByZXR1cm4oJHJlY29yZHMpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBfZmluZFJlY29yZHMoJHBhcmFtcywgJGNvbmRpdGlvbikKICAgIHsKICAgICAgICAkcmV0UmVjb3JkcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgJHJlY29yZHMgPSAkdGhpcy0+aW5kZXhbJHRoaXMtPmdldEluZGV4S2V5KCRwYXJhbXMpXTsKCiAgICAgICAgLy9pZiAoaXNEZXZlbG9wZXIoKSAmJiBnZXRfY2xhc3MoJHRoaXMpID09ICJUTWVkaWFUZW1wbGF0ZXMiKSB7ZWNobyAiWFhYIjsgZWNobyAiPGhyPjxocj4iOyB2YXJfZHVtcCgkcGFyYW1zKTsgdmFyX2R1bXAoJHRoaXMtPmdldEluZGV4S2V5KCRwYXJhbXMpKTsgdmFyX2R1bXAoJHRoaXMtPmluZGV4KTsgZWNobyAiPGhyPiI7IHZhcl9kdW1wKCRyZWNvcmRzKTsgdmFyX2R1bXAoJGNvbmRpdGlvbik7IGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4iOyB9CiAgICAgICAgCiAgICAgICAgaWYgKCFpc19hcnJheSgkcmVjb3JkcykpCiAgICAgICAgICAgICRyZWNvcmRzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCgkcmVjb3JkcyBhcyAkcmVjb3JkKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3JkKTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRyZWNvcmRbImNvbmRpdGlvbiJdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRjb25kaXRpb24gPT09IE5VTEwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZWNvcmRbImNvbmRpdGlvbiJdICE9ICIiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2YWxDb25kaXRpb24oJHJlY29yZFsiY29uZGl0aW9uIl0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0UmVjb3Jkc1tdID0gJHJlY29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXRSZWNvcmRzW10gPSAkcmVjb3JkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJGNvbmRpdGlvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJHJlY29yZFZhbHVlczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZWNvcmRbImNvbmRpdGlvbiJdICE9ICIiICYmIGV2YWxDb25kaXRpb24oJHJlY29yZFsiY29uZGl0aW9uIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAkcmV0UmVjb3Jkc1tdID0gJHJlY29yZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZFsiY29uZGl0aW9uIl0gPT0gIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXRSZWNvcmRzW10gPSAkcmVjb3JkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRyZXRSZWNvcmRzW10gPSAkcmVjb3JkOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgdXNvcnQoJHJldFJlY29yZHMsIGFycmF5KCR0aGlzLCAiX19zb3J0IikpOwoKICAgICAgICByZXR1cm4oJHJldFJlY29yZHMpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gZ2V0T2JqZWN0QnlJZCgkaWQpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+b2JqZWN0c1skaWRdKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPm9iamVjdHNbJGlkXSA9IGNyZWF0ZU9iamVjdCgkdGhpcy0+b2JqZWN0VHlwZSwgJGlkKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCR0aGlzLT5vYmplY3RzWyRpZF0pOwogICAgfSAgICAgICAgCiAgICAKICAgIGZ1bmN0aW9uIGdldE9iamVjdEJ5TmFtZSgkbmFtZSkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5vYmplY3RzWyRuYW1lXSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5vYmplY3RzWyRuYW1lXSA9IGNyZWF0ZU9iamVjdCgkdGhpcy0+b2JqZWN0VHlwZSwgJG5hbWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPm9iamVjdHNbJG5hbWVdKTsKICAgIH0gICAgICAgIAoKICAgIGZ1bmN0aW9uIGZpbmRPYmplY3QoJHBhcmFtcywgJGNvbmRpdGlvbikKICAgIHsKICAgICAgICAkb2JqZWN0cyA9ICR0aGlzLT5maW5kT2JqZWN0cygkcGFyYW1zLCAkY29uZGl0aW9uKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKGNvdW50KCRvYmplY3RzKSA9PSAwKQogICAgICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybigkb2JqZWN0c1tyYW5kKDAsIGNvdW50KCRvYmplY3RzKS0xKV0pOwogICAgfSAKICAgIAogICAgZnVuY3Rpb24gZmluZE9iamVjdHMoJHBhcmFtcywgJGNvbmRpdGlvbikKICAgIHsKICAgICAgICAkcmVjb3JkcyA9ICR0aGlzLT5maW5kUmVjb3JkcygkcGFyYW1zLCAkY29uZGl0aW9uKTsKICAgIAogICAgICAgICRvYmplY3RzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCRyZWNvcmRzIGFzICRyZWNvcmQpCiAgICAgICAgICAgICRvYmplY3RzW10gPSAkdGhpcy0+Z2V0T2JqZWN0QnlJZCgkcmVjb3JkWyJpZCJdKTsKCiAgICAgICAgcmV0dXJuKCRvYmplY3RzKTsKICAgIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiRfX2NvbXBvbmVudElkUHJlZml4ID0gYXJyYXkoKTsKJF9fY29tcG9uZW50SWRQcmVmaXhTa2lwID0gZmFsc2U7CmZ1bmN0aW9uIGFkZENvbXBvbmVudElkUHJlZml4KCRwcmVmaXggPSAiIikKewogICAgaWYgKCEkcHJlZml4KQogICAgICAgICRwcmVmaXggPSBVVUlEKCk7CiAgICAgICAgCiAgICBnbG9iYWwgJF9fY29tcG9uZW50SWRQcmVmaXg7CgogICAgJF9fY29tcG9uZW50SWRQcmVmaXhbXSA9ICRwcmVmaXg7Cn0KCmZ1bmN0aW9uIHJlbW92ZUNvbXBvbmVudElkUHJlZml4KCkKewogICAgZ2xvYmFsICRfX2NvbXBvbmVudElkUHJlZml4OwogICAgCiAgICBhcnJheV9wb3AoJF9fY29tcG9uZW50SWRQcmVmaXgpOwp9CgpmdW5jdGlvbiBnZXRDb21wb25lbnRJZFByZWZpeCgpCnsKICAgIGdsb2JhbCAkX19jb21wb25lbnRJZFByZWZpeCwgJF9fY29tcG9uZW50SWRQcmVmaXhTa2lwOwoKICAgIGlmICghJF9fY29tcG9uZW50SWRQcmVmaXhTa2lwKQogICAgICAgIHJldHVybigkX19jb21wb25lbnRJZFByZWZpeFtjb3VudCgkX19jb21wb25lbnRJZFByZWZpeCktMV0pOwp9CgpmdW5jdGlvbiBza2lwQ29tcG9uZW50SWRQcmVmaXgoJHNraXApCnsKICAgIGdsb2JhbCAkX19jb21wb25lbnRJZFByZWZpeFNraXA7CiAgICAkX19jb21wb25lbnRJZFByZWZpeFNraXAgPSAkc2tpcDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmN0aW9uIGdldE9iamVjdFVybCgkb2JqZWN0VHlwZSkKewogICAgJHBhdGggPSBsb2FkT2JqZWN0UGF0aCgkb2JqZWN0VHlwZSk7CiAgICAKICAgICR1cmwgPSBnZXRVcmxGcm9tUGF0aCgkcGF0aCwgdHJ1ZSk7CiAgICAKICAgIHJldHVybigkdXJsKTsKfSAgICAKCmZ1bmN0aW9uIGF1dG9sb2FkT2JqZWN0KCRuYW1lKQp7CiAgICAvKgogICAgaWYgKCRuYW1lWzBdICE9PSAiVCIpCiAgICB7CiAgICAgICAgJGYgPSBmb3BlbihQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wL291dC50eHQiLCAiYSsiKTsKICAgICAgICBmd3JpdGUoJGYsIFJFUVVFU1RJRC4iOkI6ICIuJG5hbWUuIlxuIik7CiAgICAgICAgLy9md3JpdGUoJGYsIGdldEZ1bmN0aW9uQ2FsbCgpLiJcbiIpOwogICAgICAgIGZjbG9zZSgkZik7CiAgICB9CiAgICAqLwogICAgLy9pZiAoY2xhc3NfZXhpc3RzKCJUSlNPTiIsIGZhbHNlKSkKICAgIC8vICAgIGR1bXAoJG5hbWUpOwogICAgLy9zdGFydFByb2ZpbGUoImF1dG9sb2FkT2JqZWN0IiwgJG5hbWUpOwogICAgCiAgICAvLyBQSFAgbmFtZXNwYWNlcyBhbmQgZXh0ZXJuIGxpYnMKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJG5hbWUpOwogICAgJGZvdW5kID0gY2xhc3NfZXhpc3RzKCRuYW1lLCBmYWxzZSk7CiAgICAKICAgIGlmICghJGZvdW5kICYmIHN0cnBvcygkbmFtZSwgIlxcIikgIT09IEZBTFNFKQogICAgewogICAgICAgICRmaWxlID0gUFJPSkVDVFBBVEguImNvcmUvY2xhc3Nlcy9fbmV3LyIuc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkbmFtZSkuIi5waHAiOwogICAgICAgIC8vZWNobyAkZmlsZTsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKQogICAgICAgIHsKICAgICAgICAgICAgaW5jbHVkZV9vbmNlKCRmaWxlKTsKICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmICghJGZvdW5kIC8qJiYgJG5hbWVbMF0gPT0gIlQiKi8pCiAgICB7CiAgICAgICAgJG9iamVjdFR5cGUgPSBzdWJzdHIoJG5hbWUsIDEsIHN0cmxlbigkbmFtZSktMSk7CiAgICAgICAgbG9hZE9iamVjdFBhdGgoJG9iamVjdFR5cGUpOwogICAgICAgIHVzZU9iamVjdCgkb2JqZWN0VHlwZSk7CgogICAgICAgIC8qCiAgICAgICAgaWYgKCRuYW1lWzBdID09ICJUIikKICAgICAgICAgICAgJF9vYmplY3RUeXBlc1tdID0gc3Vic3RyKCRuYW1lLCAxLCBzdHJsZW4oJG5hbWUpLTEpOwogICAgICAgICRfb2JqZWN0VHlwZXNbXSA9ICRuYW1lOwogICAgICAgIGZvcmVhY2goJF9vYmplY3RUeXBlcyBhcyAkX29iamVjdFR5cGUpCiAgICAgICAgewogICAgICAgICAgICBsb2FkT2JqZWN0UGF0aCgkX29iamVjdFR5cGUpOwogICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCRuYW1lLCBmYWxzZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVzZU9iamVjdCgkX29iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgaWYgKCFjbGFzc19leGlzdHMoJG5hbWUsIGZhbHNlKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIG5vbi1WaXN1YWxQSFAgb2JqZWN0cwogICAgICAgICAgICBpZiAob2JqZWN0RXhpc3RzKCJNb2R1bGVzIikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpbmNsdWRlUGF0aCA9IGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRJbmNsdWRlUGF0aCgkbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoJGluY2x1ZGVQYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIF9faW5jbHVkZV9vbmNlKFBST0pFQ1RQQVRILiRpbmNsdWRlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKCiAgICAgICAgICAgIGlmICghJGZvdW5kICYmIHN0cnBvcygkbmFtZSwgIlxcIikgPT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIC8vaWYgKGNsYXNzX2V4aXN0cygiVEpTT04iLCBmYWxzZSkpCiAgICAgICAgLy9kdW1wKCRuYW1lKTsKICAgICAgICAgICAgICAgIC8vZGVidWdfcHJpbnRfYmFja3RyYWNlKCk7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1heSBiZSBtb3JlIGF1dG9sb2FkZXJzIC0gUEhQRXhjZWwsIC4uLiBzbyBkbyBub3Qgc2F5IGVycm9yIGFuZCBkbyBub3QgY3JlYXRlIGR1bW15IG9iamVjdHMKICAgICAgICAgICAgICAgIC8vc2hvd01lc3NhZ2UoImF1dG9sb2FkT2JqZWN0KCk6IGNsYXNzICciLiRuYW1lLiInIGRvZXMgbm90IGV4aXN0IiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAvL2V2YWwoImNsYXNzICIuJG5hbWUuIiBleHRlbmRzIFREdW1teU9iamVjdCB7fTsiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgICRmb3VuZCA9IHRydWU7CiAgICB9Cn0Kc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKCJhdXRvbG9hZE9iamVjdCIpOwoKZnVuY3Rpb24gdXNlT2JqZWN0KCRvYmplY3RUeXBlKQp7CiAgICBpZiAoY2xhc3NfZXhpc3RzKCJUIi4kb2JqZWN0VHlwZSwgZmFsc2UpKQogICAgICAgIHJldHVybih0cnVlKTsKICAgIAogICAgLy92YXJfZHVtcCgkb2JqZWN0VHlwZSk7CiAgICAKICAgICRmb3VuZCA9IGZhbHNlOwogICAgZ2xvYmFsICRjb3JlT2JqZWN0czsKICAgIAogICAgLy8gYWRkIG9iamVjdCBuYW1lIG9uIHJlY3Vyc2lvbiBsb29wCiAgICAkbm9EZWJ1ZyA9ICgkb2JqZWN0VHlwZSA9PSAiRGVidWciIHx8ICRvYmplY3RUeXBlID09ICJPYmplY3QiKTsKCiAgICBsb2FkT2JqZWN0UGF0aCgkb2JqZWN0VHlwZSk7CiAgICAvL3Zhcl9kdW1wKCRjb3JlT2JqZWN0c1skb2JqZWN0VHlwZV0pOwoKICAgIGlmICgkY29yZU9iamVjdHNbJG9iamVjdFR5cGVdICE9ICIiKQogICAgewogICAgICAgIC8vaWYgKCEkbm9EZWJ1ZykKICAgICAgICAvLyAgICBzdGFydEluY2x1ZGUoQ09SRVBBVEguJGNvcmVPYmplY3RzWyRvYmplY3RUeXBlXSk7CiAgICAgICAgICAgIAogICAgICAgIC8vIHYyCiAgICAgICAgJGluY2x1ZGVQYXRoID0gJGNvcmVPYmplY3RzWyRvYmplY3RUeXBlXTsKICAgICAgICAkaW5jbHVkZVBhdGhzID0gYXJyYXkoTUFJTlBBVEguIi92aXN1YWwtcGhwLyIuJGluY2x1ZGVQYXRoLCBDT1JFUEFUSC4iL3Zpc3VhbC1waHAvIi4kaW5jbHVkZVBhdGgsIENPUkVQQVRILiRpbmNsdWRlUGF0aCAvKiwgQ09SRVBBVEguImNvcmUvIi4kaW5jbHVkZVBhdGgqLyk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkaW5jbHVkZVBhdGhzIGFzICRpbmNsdWRlUGF0aCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkaW5jbHVkZVBhdGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoJG9iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgLy9pZiAoISRub0RlYnVnKQogICAgICAgICAgICAgICAgLy8gICAgc3RhcnRJbmNsdWRlKCRpbmNsdWRlUGF0aCk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCJUIi4kb2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRpbmNsdWRlUGF0aCk7CiAgICAgICAgICAgICAgICBfX2luY2x1ZGVfb25jZSgkaW5jbHVkZVBhdGgpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcChjbGFzc19leGlzdHMoIlQiLiRvYmplY3RUeXBlKSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCIhISEhISEhISEhIik7CiAgICAgICAgICAgICAgICAvL2lmICghJG5vRGVidWcpCiAgICAgICAgICAgICAgICAvLyAgICBzdG9wSW5jbHVkZSgkaW5jbHVkZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0gICAgCiAgICAgICAgaWYgKCEkZm91bmQpCiAgICAgICAgICAgIHJldHVybihOVUxMKTsKICAgICAgICAgICAgCiAgICAgICAgLy9pZiAoISRub0RlYnVnKQogICAgICAgIC8vICAgIHN0b3BJbmNsdWRlKENPUkVQQVRILiRjb3JlT2JqZWN0c1skb2JqZWN0VHlwZV0pOwogICAgfQogICAgLy9lbHNlCiAgICAvL3sKICAgIC8vICAgIHNob3dNZXNzYWdlKCJ1c2VPYmplY3QoJG9iamVjdFR5cGUpIG5vdCBmb3VuZCIsIG10RXJyb3IpOwogICAgICAgIC8vZXhpdDsKICAgIC8vfQogICAgcmV0dXJuKCRmb3VuZCk7Cn0KCmZ1bmN0aW9uIG9iamVjdERlZmluZWQoJG9iamVjdFR5cGUpCnsKICAgIHJldHVybih1c2VPYmplY3QoJG9iamVjdFR5cGUpKTsKfQoKZnVuY3Rpb24gbG9hZE9iamVjdFBhdGgoJG9iamVjdFR5cGUpCnsKICAgIGdsb2JhbCAkY29yZU9iamVjdHM7CiAgICAKICAgIC8vdmFyX2R1bXAoJG9iamVjdFR5cGUpOwogICAgLy92YXJfZHVtcCgkY29yZU9iamVjdHMpOwogICAgLy92YXJfZHVtcCgkb2JqZWN0VHlwZSk7CiAgICBpZiAoIWluX2FycmF5KCRvYmplY3RUeXBlLCBhcnJheV9rZXlzKCRjb3JlT2JqZWN0cykpKQogICAgewogICAgICAgIC8vIHRyeSB0byBmaW5kIHVzaW5nICpDbGFzc05hbWUKICAgICAgICAvL3Zhcl9kdW1wKCJsb2FkaW5nLi4uICIuJG9iamVjdFR5cGUpOwogICAgICAgIGZvcmVhY2goJGNvcmVPYmplY3RzIGFzICRuYW1lID0+ICRwYXRoKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkbmFtZSwgIioiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCJ8XiIuc3RyX3JlcGxhY2UoIioiLCAiLioiLCAkbmFtZSkuIlwkfCIsICRvYmplY3RUeXBlLCAkbWF0Y2hlcykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGNvcmVPYmplY3RzWyRvYmplY3RUeXBlXSA9ICRwYXRoLiRvYmplY3RUeXBlLiIuY2xhc3MucGhwIjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oJGNvcmVPYmplY3RzWyRvYmplY3RUeXBlXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy92YXJfZHVtcCgibm90IGZvdW5kIC0gdXNpbmcgVE1vZHVsZXMuLi4iKTsKCiAgICAgICAgZ2xvYmFsICRfTW9kdWxlTWFuYWdlciwgJF9sb2FkaW5nTW9kdWxlTWFuYWdlcjsKICAgICAgICAvLyBsb2FkIGZyb20gREIKICAgICAgICBpZiAoISRfTW9kdWxlTWFuYWdlciAmJiAhJF9sb2FkaW5nTW9kdWxlTWFuYWdlcikKICAgICAgICB7CiAgICAgICAgICAgICRfbG9hZGluZ01vZHVsZU1hbmFnZXIgPSB0cnVlOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCIhISEheHh4eCIpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRvYmplY3RUeXBlKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAvL2luY2x1ZGVfb25jZShDT1JFUEFUSC4iY29yZS9tb2R1bGVzLmNsYXNzLnBocCIpOwogICAgICAgICAgICB1c2VPYmplY3QoIk1vZHVsZXMiKTsgLy8gbm90IHVzaW5nIGF1dG9sb2FkIGhlcmUgZHVlIHRvIDo6Z2V0SGVhZEh0bWwoKQogICAgICAgICAgICBnbG9iYWwgJE1vZHVsZXM7CiAgICAgICAgICAgIGlmICgkTW9kdWxlcykKICAgICAgICAgICAgICAgICRfTW9kdWxlTWFuYWdlciA9ICRNb2R1bGVzOwogICAgICAgICAgICBlbHNlIGlmIChjbGFzc19leGlzdHMoIlRNb2R1bGVzIiwgZmFsc2UpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX01vZHVsZU1hbmFnZXIgPSBuZXcgVE1vZHVsZXM7CiAgICAgICAgICAgICAgICAkTW9kdWxlcyA9ICRfTW9kdWxlTWFuYWdlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghSU5TVEFMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkNsYXNzIFRNb2R1bGVzIGRvZXMgbm90IGV4aXN0IChsb2FkaW5nIGNsYXNzIFQiLiRvYmplY3RUeXBlLiIpPGhyIC8+Ii5nZXRGdW5jdGlvbkNhbGwoKSwgbXRFcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy92YXJfZHVtcCgkX01vZHVsZU1hbmFnZXIpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICRfbG9hZGluZ01vZHVsZU1hbmFnZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCRfTW9kdWxlTWFuYWdlcikKICAgICAgICB7CiAgICAgICAgICAgICRvYmplY3RQYXRoID0gJF9Nb2R1bGVNYW5hZ2VyLT5nZXRJbmNsdWRlUGF0aCgkb2JqZWN0VHlwZSk7CiAgICAgICAgICAgIGlmICgkb2JqZWN0UGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGNvcmVPYmplY3RzWyRvYmplY3RUeXBlXSA9ICRvYmplY3RQYXRoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgICRvYmplY3RQYXRoID0gJGNvcmVPYmplY3RzWyRvYmplY3RUeXBlXTsKICAgIAogICAgcmV0dXJuKCRvYmplY3RQYXRoKTsKfQoKZnVuY3Rpb24gZ2V0T2JqZWN0UGF0aCgkb2JqZWN0VHlwZSkKewogICAgZ2xvYmFsICRjb3JlT2JqZWN0czsKICAgIGlmICgkY29yZU9iamVjdHNbJG9iamVjdFR5cGVdKQogICAgICAgIHJldHVybigkY29yZU9iamVjdHNbJG9iamVjdFR5cGVdKTsKICAgIAogICAgaWYgKG9iamVjdEV4aXN0cygiTW9kdWxlcyIpKQogICAgewogICAgICAgIHJldHVybihnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0SW5jbHVkZVBhdGgoJG9iamVjdFR5cGUpKTsKICAgIH0KICAgIAp9CgpmdW5jdGlvbiBjcmVhdGVPYmplY3QoJG9iamVjdFR5cGUgPSBmYWxzZSwgJHBhcmFtMT0iX19fRU1QVFlfX18iLCAkcGFyYW0yPSJfX19FTVBUWV9fXyIsICRwYXJhbTM9Il9fX0VNUFRZX19fIiwgJHBhcmFtND0iX19fRU1QVFlfX18iLCAkcGFyYW01PSJfX19FTVBUWV9fXyIsICRwYXJhbTY9Il9fX0VNUFRZX19fIiwgJHBhcmFtNz0iX19fRU1QVFlfX18iLCAkcGFyYW04PSJfX19FTVBUWV9fXyIsICRwYXJhbTk9Il9fX0VNUFRZX19fIiwgJHBhcmFtMTA9Il9fX0VNUFRZX19fIiwgJHBhcmFtMTE9Il9fX0VNUFRZX19fIiwgJHBhcmFtMTI9Il9fX0VNUFRZX19fIikKewogICAgLy9pZiAoJG9iamVjdFR5cGUgPT0gIkRhdGFTZXQiKQogICAgLy8gICAgZHVtcChnZXRGdW5jdGlvbkNhbGwoKSk7CiAgICAKICAgIC8vZHVtcCgkb2JqZWN0VHlwZSk7CiAgICAKICAgIC8vaWYgKCRvYmplY3RUeXBlID09ICJIdG1sQXJlYVJpYmJvbiIpCiAgICAvL3sKICAgIC8vICAgIGVjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAvLyAgICBleGl0OwogICAgLy99CgogICAgLy9pZiAoJG9iamVjdFR5cGUgPT0gIkxvb2t1cENvbWJvQm94IikgICAgCiAgICAvLyAgICAkb2JqZWN0VHlwZSA9ICJGaWx0ZXJMb29rdXBDb21ib0JveCI7CiAgICAKICAgIHN0YXJ0UHJvZmlsZSgiY3JlYXRlT2JqZWN0Iik7CiAgICBnbG9iYWwgJGNvcmVPYmplY3RzLCAkX19fYWxsT2JqZWN0czsKICAgIAogICAgaWYgKFRKU09OOjppc0pTT04oJG9iamVjdFR5cGUpKQogICAgICAgICRvYmplY3RUeXBlID0gVEpTT046OmRlY29kZSgkb2JqZWN0VHlwZSk7CgogICAgaWYgKGlzX2FycmF5KCRvYmplY3RUeXBlKSAmJiAkb2JqZWN0VHlwZVsib2JqZWN0Il0pIC8vIGt2dWxpIFByb3BlcnR5RWRpdG9yIGEgZ2V0RGlzcGxheVZhbHVlQXNBcnJheQogICAgewogICAgICAgICRvYmplY3RQYXJhbXMgPSAkb2JqZWN0VHlwZVsicGFyYW1zIl07CiAgICAgICAgJG9iamVjdFR5cGUgPSAkb2JqZWN0VHlwZVsib2JqZWN0Il07CiAgICB9CgogICAgJGNsYXNzTmFtZSA9ICJUIi4kb2JqZWN0VHlwZTsKCiAgICBpZiAoIWNsYXNzX2V4aXN0cygkY2xhc3NOYW1lLCBmYWxzZSkgJiYgIWluX2FycmF5KCRvYmplY3RUeXBlLCBhcnJheV9rZXlzKCRjb3JlT2JqZWN0cykpKQogICAgewogICAgICAgIC8vZWNobyAkY2xhc3NOYW1lOwogICAgICAgIGxvYWRPYmplY3RQYXRoKCRvYmplY3RUeXBlKTsKCiAgICB9CiAgICBpZiAoJG9iamVjdFR5cGUgPT0gIk1lbnUiICYmICEkcGFyYW0xICYmICEkcGFyYW0yKQogICAgewogICAgICAgIGR1bXAoIldBUk5JTkc6IGNyZWF0aW5nIG9iamVjdCAnTWVudScuIENyZWF0ZSBhIFdlYk1lbnUgb2JqZWN0IGluc3RlYWQuIik7CiAgICAgICAgZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgfQogICAgLy9kdW1wKCRvYmplY3RUeXBlKTsKICAgIC8vdmFyX2R1bXAoJG9iamVjdFR5cGUpOwogICAgLy92YXJfZHVtcCgkY29yZU9iamVjdHNbJG9iamVjdFR5cGVdKTsKCiAgICBpZiAoIWNsYXNzX2V4aXN0cygkY2xhc3NOYW1lLCBmYWxzZSkpCiAgICB7CiAgICAgICAgaWYgKCF1c2VPYmplY3QoJG9iamVjdFR5cGUpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgICAgIH0KICAgIH0KICAgICAgICAKICAgIGlmIChkZWZpbmVkKCRjbGFzc05hbWUpKSAgICAgICAgIC8vIHVzZWQgZGVmaW5lKCJUQ2xhc3NOYW1lIiwgIlJlYWxDbGFzc05hbWUiKTsKICAgIHsKICAgICAgICAkY2xhc3NOYW1lID0gY29uc3RhbnQoJGNsYXNzTmFtZSk7CiAgICB9CiAgICAKICAgIGlmIChjbGFzc19leGlzdHMoJGNsYXNzTmFtZSwgZmFsc2UpLyogfHwgaW5fYXJyYXkoJG9iamVjdFR5cGUsIGFycmF5X2tleXMoJGNvcmVPYmplY3RzKSkqLykKICAgIHsKICAgICAgICAvL3Zhcl9kdW1wKCRvYmplY3RUeXBlKTsKICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCRjbGFzc05hbWUsIGZhbHNlKSkKICAgICAgICB7CiAgICAgICAgICAgICRjYWNoZU9iamVjdCA9IGlzX3N1YmNsYXNzX29mKCRjbGFzc05hbWUsICJUQ2FjaGVPYmplY3QiKSB8fCBtZXRob2RfZXhpc3RzKCRjbGFzc05hbWUsICJnZXRDYWNoZU5hbWUiKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkY2xhc3NOYW1lKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkY2FjaGVPYmplY3QpOwogICAgICAgICAgICAkY2FjaGVMb2FkZWQgPSBmYWxzZTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkY2FjaGVOYW1lKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkY2FjaGVPYmplY3QpOwogICAgICAgICAgICAvL2R1bXAoJGNsYXNzTmFtZSk7CiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW0xKTsKICAgICAgICAgICAgLy9kdW1wKCRjYWNoZU5hbWUpOwogICAgICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgaWYgKCRjYWNoZU9iamVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGNhY2hlTmFtZSA9IGNhbGxfc3RhdGljX21ldGhvZCgkY2xhc3NOYW1lLCAiZ2V0Q2FjaGVOYW1lIiwgJGNsYXNzTmFtZSwgKCRwYXJhbTEgIT0gIl9fX0VNUFRZX19fIiA/ICRwYXJhbTEgOiBhcnJheSgpKSk7CiAgICAgICAgICAgICAgICAkY2FjaGVMYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vZWNobyAiWyIuJGNhY2hlTmFtZS4iXSI7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbTEpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkY2FjaGVOYW1lKTsKICAgICAgICAgICAgICAgIC8vIHRyeSB0byBsb2FkIGZyb20gY2FjaGUKICAgICAgICAgICAgICAgIGlmICgkY2FjaGVOYW1lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkY2FjaGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjYWNoZUxhdGUgPSAhJGNhY2hlTmFtZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNhY2hlTmFtZSA9ICRjYWNoZU5hbWVbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZWNobyAieyIuJGNsYXNzTmFtZS4ifSI7CiAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJbIi4kY2FjaGVOYW1lLiJdIjsKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0ID0gZ2V0T2JqZWN0KCJDYWNoZSIpLT5sb2FkT2JqZWN0KCRjYWNoZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIC8vaWYgKCRjYWNoZU5hbWUgPT0gIk1vZHVsZXMiKQogICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRPYmplY3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kdW1wKCRjYWNoZU5hbWUpOwogICAgICAgICAgICAgICAgJGNhY2hlTG9hZGVkID0gKCRPYmplY3QgIT0gTlVMTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZ2xvYmFsICR4eHh4eDsKICAgICAgICAgICAgLy92YXJfZHVtcCgkY2xhc3NOYW1lKTsKICAgICAgICAgICAgLy9pZiAoJHh4eHh4ID4gNTAwMCkKICAgICAgICAgICAgLy8gICAgZXhpdDsKICAgICAgICAgICAgLy8keHh4eHgrKzsKCiAgICAgICAgICAgIGlmICghJE9iamVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9lY2hvICRjbGFzc05hbWU7CiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICAgICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgaWYgKCRwYXJhbTEgPT09ICJfX19FTVBUWV9fXyIpCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdCA9IG5ldyAkY2xhc3NOYW1lKCk7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkcGFyYW0yID09PSAiX19fRU1QVFlfX18iKQogICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBuZXcgJGNsYXNzTmFtZSgkcGFyYW0xKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRwYXJhbTMgPT09ICJfX19FTVBUWV9fXyIpCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdCA9IG5ldyAkY2xhc3NOYW1lKCRwYXJhbTEsICRwYXJhbTIpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHBhcmFtNCA9PT0gIl9fX0VNUFRZX19fIikKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0ID0gbmV3ICRjbGFzc05hbWUoJHBhcmFtMSwgJHBhcmFtMiwgJHBhcmFtMyk7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkcGFyYW01ID09PSAiX19fRU1QVFlfX18iKQogICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBuZXcgJGNsYXNzTmFtZSgkcGFyYW0xLCAkcGFyYW0yLCAkcGFyYW0zLCAkcGFyYW00KTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRwYXJhbTYgPT09ICJfX19FTVBUWV9fXyIpCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdCA9IG5ldyAkY2xhc3NOYW1lKCRwYXJhbTEsICRwYXJhbTIsICRwYXJhbTMsICRwYXJhbTQsICRwYXJhbTUpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHBhcmFtNyA9PT0gIl9fX0VNUFRZX19fIikKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0ID0gbmV3ICRjbGFzc05hbWUoJHBhcmFtMSwgJHBhcmFtMiwgJHBhcmFtMywgJHBhcmFtNCwgJHBhcmFtNSwgJHBhcmFtNik7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkcGFyYW04ID09PSAiX19fRU1QVFlfX18iKQogICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBuZXcgJGNsYXNzTmFtZSgkcGFyYW0xLCAkcGFyYW0yLCAkcGFyYW0zLCAkcGFyYW00LCAkcGFyYW01LCAkcGFyYW02LCAkcGFyYW03KTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRwYXJhbTkgPT09ICJfX19FTVBUWV9fXyIpCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdCA9IG5ldyAkY2xhc3NOYW1lKCRwYXJhbTEsICRwYXJhbTIsICRwYXJhbTMsICRwYXJhbTQsICRwYXJhbTUsICRwYXJhbTYsICRwYXJhbTcsICRwYXJhbTgpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHBhcmFtMTAgPT09ICJfX19FTVBUWV9fXyIpCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdCA9IG5ldyAkY2xhc3NOYW1lKCRwYXJhbTEsICRwYXJhbTIsICRwYXJhbTMsICRwYXJhbTQsICRwYXJhbTUsICRwYXJhbTYsICRwYXJhbTcsICRwYXJhbTgsICRwYXJhbTkpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHBhcmFtMTEgPT09ICJfX19FTVBUWV9fXyIpCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdCA9IG5ldyAkY2xhc3NOYW1lKCRwYXJhbTEsICRwYXJhbTIsICRwYXJhbTMsICRwYXJhbTQsICRwYXJhbTUsICRwYXJhbTYsICRwYXJhbTcsICRwYXJhbTgsICRwYXJhbTksICRwYXJhbTEwKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRwYXJhbTEyID09PSAiX19fRU1QVFlfX18iKQogICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBuZXcgJGNsYXNzTmFtZSgkcGFyYW0xLCAkcGFyYW0yLCAkcGFyYW0zLCAkcGFyYW00LCAkcGFyYW01LCAkcGFyYW02LCAkcGFyYW03LCAkcGFyYW04LCAkcGFyYW05LCAkcGFyYW0xMCwgJHBhcmFtMTEpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRPYmplY3QgPSBuZXcgJGNsYXNzTmFtZSgkcGFyYW0xLCAkcGFyYW0yLCAkcGFyYW0zLCAkcGFyYW00LCAkcGFyYW01LCAkcGFyYW02LCAkcGFyYW03LCAkcGFyYW04LCAkcGFyYW05LCAkcGFyYW0xMCwgJHBhcmFtMTEsICRwYXJhbTEyKTsKCiAgICAgICAgICAgICAgICAkZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICAgICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gImNyZWF0ZU9iamVjdCgiLiRjbGFzc05hbWUuIikgLSBjbGFzcyBkb2VzIG5vdCBleGlzdCI7CiAgICAgICAgICAgIGVjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdFBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICAkT2JqZWN0LT5wYXJhbXMgPSAkb2JqZWN0UGFyYW1zOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgLy9lY2hvICIxIjsKICAgICAgICBpZiAoJGVycm9yICYmIHN0cnBvcygkZXJyb3IsICJjcmVhdGVPYmplY3Q6IiA9PT0gRkFMU0UpICYmICRjbGFzc05hbWUgIT0gIlRUYWJsZXMiKSAvLyBvbiBUVGFibGVzIHRoaXMgY2F1c2VzIGxvb3AKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yX3JlcG9ydGluZygpICE9PSAwICYmIHNob3dNZXNzYWdlKCJjcmVhdGVPYmplY3Q6ICIuJGVycm9yLCBtdFdhcm5pbmcpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoJGNhY2hlT2JqZWN0ICYmICRjYWNoZU5hbWUgJiYgISRjYWNoZUxvYWRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8kT2JqZWN0LT5fX2NyZWF0ZVBhcmFtcyA9ICgkcGFyYW0xICE9ICJfX19FTVBUWV9fXyIgJiYgaXNfYXJyYXkoJHBhcmFtMSkgPyAkcGFyYW0xIDogYXJyYXkoKSk7CiAgICAgICAgICAgICAgICAkT2JqZWN0LT5fX2NyZWF0ZVBhcmFtcyA9ICgkcGFyYW0xICE9ICJfX19FTVBUWV9fXyIgPyAkcGFyYW0xIDogYXJyYXkoKSk7CiAgICAgICAgICAgICAgICBpZiAoISRPYmplY3QtPmNhY2hlUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKGdldF9vYmplY3RfdmFycygkT2JqZWN0KSBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICRPYmplY3QtPmNhY2hlUHJvcGVydGllc1tdID0gJG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkT2JqZWN0LT5jYWNoZVByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkY2FjaGVOYW1lKTsKICAgICAgICAgICAgICAgIGdldE9iamVjdCgiQ2FjaGUiKS0+c2F2ZU9iamVjdCgkY2FjaGVOYW1lLCAkT2JqZWN0LCAkY2FjaGVMYXRlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyB0b2hsZSBhc2kgayBuaWNlbXUgbmVuaQogICAgICAgICRfX19hbGxPYmplY3RzWyRvYmplY3RUeXBlXSA9ICRPYmplY3Q7CiAgICAgICAgCiAgICAgICAgZ2xvYmFsICRfT0JKRUNUUzsKICAgICAgICAkX09CSkVDVFNbXSA9ICRPYmplY3Q7CiAgICB9CiAgICBzdG9wUHJvZmlsZSgiY3JlYXRlT2JqZWN0IiwgJG9iamVjdFR5cGUpOwogICAgCiAgICByZXR1cm4oJE9iamVjdCk7Cn0KCmZ1bmN0aW9uIGdldE9iamVjdHNCeUNsYXNzTmFtZSgkY2xhc3NOYW1lLCAkaW5oZXJpdGVkPWZhbHNlKQp7CiAgICBnbG9iYWwgJF9PQkpFQ1RTOwogICAgCiAgICAkb2JqZWN0cyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRfT0JKRUNUUyBhcyAkT2JqZWN0KQogICAgewogICAgICAgIGlmIChnZXRfY2xhc3MoJE9iamVjdCkgPT0gJGNsYXNzTmFtZSB8fCAoJGluaGVyaXRlZCAmJiBpc19zdWJjbGFzc19vZigkT2JqZWN0LCAkY2xhc3NOYW1lKSkpCiAgICAgICAgewogICAgICAgICAgICAkb2JqZWN0c1tdID0gJE9iamVjdDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybigkb2JqZWN0cyk7Cn0KCmZ1bmN0aW9uIGdldE9iamVjdEJ5SWQoJGlkKQp7CiAgICBnbG9iYWwgJF9PQkpFQ1RTOwogICAgaWYgKCFpc19hcnJheSgkX09CSkVDVFMpKQogICAgICAgICRfT0JKRUNUUyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAvL3Zhcl9kdW1wKCRpZCk7CiAgICAvLyRvYmplY3RzID0gYXJyYXkoKTsKICAgIC8vZm9yZWFjaCgkX09CSkVDVFMgYXMgJE9iamVjdCkKICAgIC8vIG11c2ltIG9kemFkdSwgcHJvdG96ZSBtdXp1IHZ5dHZhcmV0IG5vdmUgb2JqZWt0eSBzZSBzdGVqbnltIGlkCiAgICAvLyBUT1RPIGlkZWFsbmUgYWxlIG1pdCB0byB6YWluZGV4b3ZhbmUga2xpY2VtCiAgICBmb3IgKCRpID0gY291bnQoJF9PQkpFQ1RTKS0xIDsgJGkgPj0gMCA7ICRpLS0pCiAgICB7CiAgICAgICAgJE9iamVjdCA9ICRfT0JKRUNUU1skaV07CiAgICAgICAgLy9kdW1wKGdldF9jbGFzcygkT2JqZWN0KSk7CiAgICAgICAgaWYgKCRPYmplY3QtPmlkID09ICRpZCB8fCAkT2JqZWN0LT5pZCA9PSBnZXRDb21wb25lbnRJZFByZWZpeCgpLiJfIi4kaWQpCiAgICAgICAgewogICAgICAgICAgICAvL2lmIChnZXRfY2xhc3MoJE9iamVjdCkgPT0gIlREYXRhU2V0IikKICAgICAgICAgICAgICAgIC8vZHVtcCgkT2JqZWN0KTsKICAgICAgICAgICAgcmV0dXJuKCRPYmplY3QpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKE5VTEwpOwp9CgpmdW5jdGlvbiBnZXRPYmplY3RzKCRleHRlbmRzPSIiKQp7CiAgICBnbG9iYWwgJF9PQkpFQ1RTOwogICAgCiAgICAkb2JqZWN0cyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRfT0JKRUNUUyBhcyAkT2JqZWN0KQogICAgewogICAgICAgIGlmICghJGV4dGVuZHMgfHwgKGlzX3N1YmNsYXNzX29mKCRPYmplY3QsICJUT2JqZWN0IikgJiYgJE9iamVjdC0+aW5oZXJpdHMoJGV4dGVuZHMpKSkKICAgICAgICAgICAgJG9iamVjdHNbXSA9ICRPYmplY3Q7CiAgICB9CiAgICAKICAgIHJldHVybigkb2JqZWN0cyk7Cn0KCmZ1bmN0aW9uIGdldE9iamVjdCgkb2JqZWN0VHlwZSA9IGZhbHNlLCAkY3JlYXRlSWZOb3RFeGlzdHM9dHJ1ZSwgJGNhY2hlPWZhbHNlKQp7CiAgICAgICAgICAgICAgICAvL2dsb2JhbCAkeHh4OwogICAgICAgICAgICAgICAgLy9pZiAoJHh4eCA+IDgzMCkgZXhpdDsKICAgICAgICAgICAgICAgIC8vJHh4eCsrOwogICAgICAgICAgICAgICAgLy9lY2hvICJbIi4kb2JqZWN0VHlwZS4iXSI7CgogICAgZ2xvYmFsICRjb3JlT2JqZWN0czsKICAgIGdsb2JhbCAkX19hbGxPYmplY3RzOwoKICAgIGlmIChpc19vYmplY3QoJG9iamVjdFR5cGUpKQogICAgewogICAgICAgIHJldHVybigkb2JqZWN0VHlwZSk7CiAgICB9CiAgICAKICAgIGlmIChUSlNPTjo6aXNKU09OKCRvYmplY3RUeXBlKSkKICAgICAgICAkb2JqZWN0VHlwZSA9IFRKU09OOjpkZWNvZGUoJG9iamVjdFR5cGUpOwogICAgCiAgICBpZiAoaXNfYXJyYXkoJG9iamVjdFR5cGUpICYmICRvYmplY3RUeXBlWyJvYmplY3QiXSkKICAgIHsKICAgICAgICAkT2JqZWN0ID0gY3JlYXRlT2JqZWN0KCRvYmplY3RUeXBlWyJvYmplY3QiXSk7CiAgICAgICAgaWYgKCRPYmplY3QpCiAgICAgICAgewogICAgICAgICAgICAkb2JqZWN0UGFyYW1zID0gJG9iamVjdFR5cGVbInBhcmFtcyJdOwogICAgICAgICAgICBpZiAoVEpTT046OmlzSlNPTigkb2JqZWN0UGFyYW1zKSkKICAgICAgICAgICAgICAgICRvYmplY3RQYXJhbXMgPSBUSlNPTjo6ZGVjb2RlKCRvYmplY3RQYXJhbXMpOwoKICAgICAgICAgICAgJG9iamVjdFBhcmFtcyA9ICRPYmplY3QtPmV4dHJhY3RQYXJhbXMoJG9iamVjdFBhcmFtcyk7CiAgICAgICAgICAgICRPYmplY3QtPmluaXQoJG9iamVjdFBhcmFtcyk7CiAgICAgICAgICAgICRPYmplY3QtPnBhcmFtcyA9ICRvYmplY3RQYXJhbXM7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBrdnVsaSBEYXRhU2V0IAogICAgICAgICAgICBmb3JlYWNoKCRvYmplY3RQYXJhbXMgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgICAgICAgICAgJE9iamVjdC0+JG5hbWUgPSAkdmFsdWU7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBQUk9DPz8/Pz8gLSB1eiB2aW0gYnlsbyB0byBrdnVsaSBMb29rdXBEYXRhU2V0LCB0byBqZSBhbGUgYmxiaW5hLCBkb3BsbmVuYSBmdW5rY2UgYWZ0ZXJDcmVhdGUKICAgICAgICAgICAgLy8kT2JqZWN0LT5nZXRDb250ZW50KCRvYmplY3RUeXBlWyJwYXJhbXMiXSk7CiAgICAgICAgICAgICRPYmplY3QtPmFmdGVyQ3JlYXRlKCRvYmplY3RUeXBlWyJwYXJhbXMiXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgc2hvd01lc3NhZ2UoImdldE9iamVjdCgnIi4kb2JqZWN0VHlwZVsib2JqZWN0Il0uIicpIC0gb2JqZWN0IG5vdCBmb3VuZCIsIG10RXJyb3IpOwogICAgICAgIAogICAgICAgIHJldHVybigkT2JqZWN0KTsKICAgIH0KICAgIAogICAgaWYgKCRvYmplY3RUeXBlKQogICAgewogICAgICAgIGdsb2JhbCAkJG9iamVjdFR5cGU7CiAgICAgICAgJE9iamVjdCA9ICQkb2JqZWN0VHlwZTsKCiAgICAgICAgaWYgKCRPYmplY3QgPT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHByb2MgdG8gdHUgbWFtPyAgLSBwcm90b3plIHRvIHBvdHJlYnVqdSB0cmViYSBrdnVsaSBUQ29udGVudCBhIGRhdGFTZXQgemFkYW5lbSBwb2RsZSBpZAogICAgICAgICAgICAkT2JqZWN0ID0gZ2V0T2JqZWN0QnlJZCgkb2JqZWN0VHlwZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKCRPYmplY3QgPT0gTlVMTCB8fCAhaXNfb2JqZWN0KCRPYmplY3QpKSAmJiAkY3JlYXRlSWZOb3RFeGlzdHMpCiAgICAgICAgewogICAgICAgICAgICAvL2VjaG8gIlsiLiRvYmplY3RUeXBlLiJdIjsKICAgICAgICAgICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAvLyAgICBnbG9iYWwgJHh4eDsKICAgICAgICAgICAgLy8gICAgaWYgKCR4eHggPiAxNSkgZXhpdDsKICAgICAgICAgICAgLy8gICAgJHh4eCsrOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICBnbG9iYWwgJGNvcmVPYmplY3RzOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVE9ETyAoaW5jbHVkZSB3aGVuIG5lY2Vzc2FyeSkKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkb2JqZWN0VHlwZSwgYXJyYXlfa2V5cygkY29yZU9iamVjdHMpKSAmJiAkT2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJE9iamVjdCk7IC8vIHZhcmlhYmxlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRvYmplY3RUeXBlKTsKICAgICAgICAgICAgICAgICRPYmplY3QgPSBjcmVhdGVPYmplY3QoJG9iamVjdFR5cGUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJGNyZWF0ZUlmTm90RXhpc3RzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRuYW1lID0gJG9iamVjdFR5cGU7CiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICQkb2JqZWN0VHlwZTsKICAgICAgICAgICAgICAgICAgICAkJG9iamVjdFR5cGUgPSAkT2JqZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJE9iamVjdCA9PSBOVUxMKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yX3JlcG9ydGluZygpICE9PSAwICYmIHNob3dNZXNzYWdlKCJPYmplY3QgJyRvYmplY3RUeXBlJyBub3QgZm91bmQuIiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoZHVtcEZ1bmN0aW9uQ2FsbCh0cnVlKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghJE9iamVjdCAmJiAkY3JlYXRlSWZOb3RFeGlzdHMvKiAmJiBJTlNUQUxMUFJPQ0VTUyovKQogICAgICAgIHsKICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgiT2JqZWN0ICciLiRvYmplY3RUeXBlLiInIG5vdCBmb3VuZCAtIHVzaW5nIGR1bW15IGZvciBpbnN0YWxsIHByb2Nlc3MiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICBzaG93TWVzc2FnZSgiT2JqZWN0ICciLiRvYmplY3RUeXBlLiInIG5vdCBmb3VuZCAtIHVzaW5nIGR1bW15IiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgJE9iamVjdCA9IG5ldyBURHVtbXlPYmplY3QoKTsKICAgICAgICB9CiAgICAgICAgCgogICAgICAgIHJldHVybigkT2JqZWN0KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9Cn0KCmZ1bmN0aW9uIG9iamVjdEV4aXN0cygkb2JqZWN0VHlwZSA9IGZhbHNlKQp7CiAgICByZXR1cm4oZ2V0T2JqZWN0KCRvYmplY3RUeXBlLCBmYWxzZSkgIT0gTlVMTCk7Cn0KCmZ1bmN0aW9uIGhlYWRIdG1sQWRkZWQoJGNsYXNzTmFtZSwgJHBhcmFtcz1hcnJheSgpKQp7CiAgICAvLyB2eXBudXRvIGt2dWxpIEh0bWxDYWNoZSAtIFpEIC0gdSB2dEZ1bGwgdnlyb2JrdSBGYWNlQm9va01ldGEgYSB2ZSBmb290ZXJ1IHBhayBGYWNlYm9va1N0aWNrUGFuZWwKICAgIHJldHVybihmYWxzZSk7CiAgICAKICAgIGdsb2JhbCAkX19nZXRIZWFkSHRtbENsYXNzZXM7CiAgICBpZiAoJF9fZ2V0SGVhZEh0bWxDbGFzc2VzWyRjbGFzc05hbWVdKQogICAgICAgIHJldHVybih0cnVlKTsKICAgIGVsc2UKICAgIHsKICAgICAgICAkX19nZXRIZWFkSHRtbENsYXNzZXNbJGNsYXNzTmFtZV0gPSB0cnVlOwogICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9Cn0KICAgIAoKCg==ZnVuY3Rpb24gVE1vdXNlKCkKewogICAgdGhpcy5pZCA9ICJNb3VzZSI7CiAgICAKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIAogICAgdGhpcy5fY3JlYXRlKCk7Cn0KCmV4dGVuZENsYXNzKFRNb3VzZSwgVE9iamVjdCk7CgpUTW91c2UucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CiAgICAKICAgIHRoaXMubGJ1dHRvbiA9IGZhbHNlOwogICAgdGhpcy54ID0gbnVsbDsKICAgIHRoaXMueSA9IG51bGw7CiAgICB0aGlzLnd4ID0gbnVsbDsKICAgIHRoaXMud3kgPSBudWxsOwogICAgdGhpcy5jb3JlID0gdHJ1ZTsKCiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgLy8gbm90IG5lZWRlZCB5ZXQKICAgIGFkZEV2ZW50KHdpbmRvdywgIm1vdXNlZG93biIsIGZ1bmN0aW9uKGUpe190aGlzLm9uTW91c2VNb3ZlKGUsICJkb3duIil9KTsgICAgIC8vIGRvd24gYW5kIHVwIG5lZWRlZCBmb3IgdG91Y2ggZXZlbnRzCiAgICBhZGRFdmVudCh3aW5kb3csICJtb3VzZXVwIiwgZnVuY3Rpb24oZSl7X3RoaXMub25Nb3VzZU1vdmUoZSwgInVwIil9KTsKICAgIAogICAgYWRkRXZlbnQod2luZG93LCAibW91c2Vtb3ZlIiwgZnVuY3Rpb24oZSl7X3RoaXMub25Nb3VzZU1vdmUoZSl9KTsKICAgIGFkZEV2ZW50KHdpbmRvdywgInRvdWNoc3RhcnQiLCBmdW5jdGlvbihlKXtfdGhpcy5vbk1vdXNlTW92ZShlKX0pOwogICAgCiAgICAvL2FkZEdsb2JhbEV2ZW50KCJkcmFnb3ZlciIsIGZ1bmN0aW9uKGUpe190aGlzLm9uTW91c2VNb3ZlKGUpO3JldHVybiB0cnVlO30pOwogICAgLy9hZGRFdmVudCh3aW5kb3csICJkcmFnb3ZlciIsIGZ1bmN0aW9uKGUpe190aGlzLm9uTW91c2VNb3ZlKGUpfSk7CgogICAgLy90aGlzLmFkZENvbnRhaW5lcih3aW5kb3cpOwp9CgovKgpUTW91c2UucHJvdG90eXBlLmFkZENvbnRhaW5lciA9IGZ1bmN0aW9uKG9iamVjdCkKewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHZhciBfd2luZG93ID0gb2JqZWN0OwogICAgYWRkRXZlbnQob2JqZWN0LCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSl7X3RoaXMub25Nb3VzZU1vdmUoZSwgX3dpbmRvdywgImRvd24iKX0pOyAgICAgLy8gZG93biBhbmQgdXAgbmVlZGVkIGZvciB0b3VjaCBldmVudHMKICAgIGFkZEV2ZW50KG9iamVjdCwgIm1vdXNldXAiLCBmdW5jdGlvbihlKXtfdGhpcy5vbk1vdXNlTW92ZShlLCBfd2luZG93LCAidXAiKX0pOwogICAgYWRkRXZlbnQob2JqZWN0LCAibW91c2Vtb3ZlIiwgZnVuY3Rpb24oZSl7X3RoaXMub25Nb3VzZU1vdmUoZSwgX3dpbmRvdyl9KTsKfQoqLwoKVE1vdXNlLnByb3RvdHlwZS5vbkNoYW5nZSA9IGZ1bmN0aW9uKCkKewp9CgovL1RNb3VzZS5wcm90b3R5cGUub25Nb3VzZU1vdmUgPSBmdW5jdGlvbihlLCB3aW5kb3csIGFjdGlvbikKVE1vdXNlLnByb3RvdHlwZS5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uKGUsIGFjdGlvbikKewogICAgZSA9IGdldEV2ZW50KGUpOwogICAgCiAgICBpZiAoYWN0aW9uKQogICAgewogICAgICAgIGlmIChhY3Rpb24gPT0gImRvd24iKQogICAgICAgICAgICB0aGlzLmxidXR0b24gPSB0cnVlOwogICAgICAgIGlmIChhY3Rpb24gPT0gInVwIikKICAgICAgICAgICAgdGhpcy5sYnV0dG9uID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvL2lmICghZSkgCiAgICAvLyAgICBlID0gd2luZG93LmV2ZW50OyAvLyB3b3JrcyBvbiBJRSwgYnV0IG5vdCBOUyAod2UgcmVseSBvbiBOUyBwYXNzaW5nIHVzIHRoZSBldmVudCkKCiAgICBpZiAoZSkKICAgIHsKICAgICAgICAvLyB3aGF0J3MgdGhhdD8KICAgICAgICAvKgogICAgICAgIGlmIChlLm9yaWdpbmFsRXZlbnQpIC8vIHRvdWNoIHNjcmVlbiBuZXdlc3QgZGV2aWNlcyBvciBtYXliZSBqcXVlcnkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMueCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYOwogICAgICAgICAgICB0aGlzLnkgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICAqLwogICAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdLyogJiYgIWUudG91Y2hlc1sxXSovKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vZG9jdW1lbnQud3JpdGUoZS50b3VjaGVzWzBdLnBhZ2VYKTsKICAgICAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZChlLnRvdWNoZXNbMF0ucGFnZVgpOwogICAgICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKGUudG91Y2hlc1swXS5wYWdlWSk7CiAgICAgICAgICAgIC8vZG9jdW1lbnQud3JpdGUodGhpcy54KTsKICAgICAgICAgICAgLy9hbGVydCh4KTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICBpZiAoZS50eXBlLmluZGV4T2YoInRvdWNoIikgPT0gMCkgLy8gdG91Y2ggc2NyZWVuIAogICAgICAgIHsKICAgICAgICAgICAgCgogICAgICAgICAgICAvL2R1bXAoIlQ6ICIgKyB0aGlzLnggKyAiICIgKyB0aGlzLnkpOwogICAgICAgICAgICAvL2FsZXJ0KHRoaXMueCArICIgIiArIHRoaXMueSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2FsZXJ0KGUudG91Y2hlc1swXS5wYWdlWCk7CiAgICAgICAgICAgIC8vYWxlcnQoZS50b3VjaGVzWzBdLnNjcmVlblgpOwogICAgICAgICAgICAvL2FsZXJ0KGUudG91Y2hlc1swXS5jbGllbnRYKTsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICBlbHNlIGlmIChlLnBhZ2VYIHx8IGUucGFnZVkpCiAgICAgICAgeyAvLyB0aGlzIGRvZXNuJ3Qgd29yayBvbiBJRTYhISAod29ya3Mgb24gRkYsTW96LE9wZXJhNykKICAgICAgICAgICAgdGhpcy54ID0gZS5wYWdlWDsKICAgICAgICAgICAgdGhpcy55ID0gZS5wYWdlWTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZS5jbGllbnRYIHx8IGUuY2xpZW50WSkKICAgICAgICB7IC8vIHdvcmtzIG9uIElFNixGRixNb3osT3BlcmE3CiAgICAgICAgICAgIHRoaXMueCA9IGUuY2xpZW50WDsKICAgICAgICAgICAgdGhpcy55ID0gZS5jbGllbnRZOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gY2hlY2sgaW4gSUU3IGlmIHVuY29tbWVudGVkCiAgICAgICAgICAgIC8vICsgKGRvY3VtZW50ICYmIGRvY3VtZW50LmJvZHkgPyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgOiAwKSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAvLyArIChkb2N1bWVudCAmJiBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgOiAwKSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgfQogICAgfQogICAgCiAgICB0aGlzLnJ4ID0gdGhpcy54OwogICAgdGhpcy5yeSA9IHRoaXMueTsKICAgIAogICAgLy8gZmluZCBpZiB3ZSBhcmUgaW4gSUZSQU1FCiAgICB2YXIgaWZyYW1lID0gZ2V0SWZyYW1lKGUudGFyZ2V0KTsKICAgIGlmIChpZnJhbWUpCiAgICB7CiAgICAgICAgdmFyIHBvcyA9IGdldFBvc2l0aW9uKGlmcmFtZSk7CiAgICAgICAgdGhpcy54ICs9IHBvc1sneCddOwogICAgICAgIHRoaXMueSArPSBwb3NbJ3knXTsKICAgIH0KICAgIAogICAgLyoKICAgIGlmICh3aW5kb3cuZnJhbWVFbGVtZW50KQogICAgewogICAgICAgIHZhciBwb3MgPSBnZXRQb3NpdGlvbih3aW5kb3cuZnJhbWVFbGVtZW50KTsKICAgICAgICB0aGlzLnggKz0gcG9zWyd4J107CiAgICAgICAgdGhpcy55ICs9IHBvc1sneSddOwogICAgfQogICAgKi8KICAgIAogICAgLy9kb2N1bWVudC53cml0ZSgifCIpOwogICAgLy9kb2N1bWVudC53cml0ZSh0aGlzLngpOwogICAgLy9kb2N1bWVudC53cml0ZSgifCIpOwogICAgLy9kb2N1bWVudC53cml0ZShldmVudC50b3VjaGVzWzBdLnBhZ2VYKTsKICAgIC8vZG9jdW1lbnQud3JpdGUoInwiKTsKICAgIC8vZG9jdW1lbnQud3JpdGUoY2FudmFzLm9mZnNldExlZnQpOwogICAgLy9kb2N1bWVudC53cml0ZSgifCIpOwogICAgdGhpcy53eCA9IGUuY2xpZW50WCB8fCBlLnBhZ2VYIC8qIFNhZmFyaSA0IGFuZCBPcGVyYSAxMC4xMCAqLyB8fCBlLnNjcmVlblg7CiAgICB0aGlzLnd5ID0gZS5jbGllbnRZIHx8IGUucGFnZVkgfHwgZS5zY3JlZW5ZOwogICAgICAgIAogICAgaWYgKGUudG91Y2hlcyAmJiBlLnRvdWNoZXNbMF0pCiAgICB7CiAgICAgICAgdGhpcy53eCA9IE1hdGgucm91bmQoZS50b3VjaGVzWzBdLmNsaWVudFgpOwogICAgICAgIHRoaXMud3kgPSBNYXRoLnJvdW5kKGUudG91Y2hlc1swXS5jbGllbnRZKTsKCiAgICAgICAgLy90aGlzLnd4ID0gTWF0aC5yb3VuZChlLnRvdWNoZXNbMF0ucGFnZVgtZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KTsKICAgICAgICAvL3RoaXMud3kgPSBNYXRoLnJvdW5kKGUudG91Y2hlc1swXS5wYWdlWS1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCk7CiAgICB9CiAgICAKICAgIC8vZG9jdW1lbnQud3JpdGUodGhpcy54KTsKICAgIC8vZG9jdW1lbnQud3JpdGUoInwiKTsKICAgIC8vZG9jdW1lbnQud3JpdGUodGhpcy53eCk7CiAgICAKCgogICAgdGhpcy5vbkNoYW5nZSgpOwogICAgCiAgICAvL2lmIChuZXcgU3RyaW5nKHRoaXMud3gpID09ICJ1bmRlZmluZWQiKQogICAgLy8gICAgZG9jdW1lbnQud3JpdGUoZ2V0RnVuY3Rpb25DYWxsKCkpOwogICAgLy9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNyZWF0ZVRleHROb2RlKHRoaXMud3grIngiK3RoaXMud3krIiwgIikpOwogICAgLy9kdW1wKHRoaXMueCsiICIrdGhpcy55LCB0cnVlKTsKfTsKClRNb3VzZS5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbihyZWxhdGl2ZVRvKQp7CiAgICBpZiAodHlwZW9mKHJlbGF0aXZlVG8pID09ICJzdHJpbmciKQogICAgICAgIHJlbGF0aXZlVG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyZWxhdGl2ZVRvKTsKCiAgICBpZiAocmVsYXRpdmVUbykKICAgIHsKICAgICAgICB2YXIgeCA9IHRoaXMud3g7CiAgICAgICAgdmFyIHkgPSB0aGlzLnd5OwogICAgICAgIAogICAgICAgIC8vZHVtcCh0aGlzLnd4KTsKICAgICAgICAvL2lmICh3aW5kb3cuX3h4eCkKICAgICAgICAvLyAgICBkdW1wKHRoaXMud3kpOwoKICAgICAgICAvL2lmICh3aW5kb3cuX3h4eCkKICAgICAgICAvLyAgICBkdW1wKHJlbGF0aXZlVG8pOwogICAgICAgIHZhciBwb3MgPSBnZXRXaW5kb3dQb3NpdGlvbihyZWxhdGl2ZVRvKTsKICAgICAgICAgICAgCiAgICAgICAgeCAtPSBwb3NbIngiXTsKICAgICAgICB5IC09IHBvc1sieSJdOwoKICAgICAgICByZXR1cm4oW3gseV0pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldHVybihbdGhpcy54LHRoaXMueV0pOwogICAgfQoKICAgIC8vcmV0dXJuKFt4LHldKTsKfQoKVE1vdXNlLnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24ocmVsYXRpdmVUbykKewogICAgdmFyIHBvcyA9IHRoaXMuZ2V0UG9zaXRpb24ocmVsYXRpdmVUbyk7CiAgICByZXR1cm4ocG9zWzBdKTsKfQogICAgClRNb3VzZS5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uKHJlbGF0aXZlVG8pCnsKICAgIHZhciBwb3MgPSB0aGlzLmdldFBvc2l0aW9uKHJlbGF0aXZlVG8pOwogICAgcmV0dXJuKHBvc1sxXSk7Cn0KCmlmICghd2luZG93Lk1vdXNlKQogICAgTW91c2UgPSBuZXcgVE1vdXNlKCk7Cgo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvTW91c2UvTW91c2UuY2xhc3MucGhwIC0tLS0tLS0gDQoNCmNsYXNzIFRNb3VzZSBleHRlbmRzIFRPYmplY3QNCnsNCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkNCiAgICB7DQogICAgICAgIGlmICghaGVhZEh0bWxBZGRlZChfX0NMQVNTX18sICRwYXJhbXMpKQ0KICAgICAgICB7DQogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvTW91c2UvTW91c2UuY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7DQogICAgICAgICAgICBhZGRFeHRlbmRpbmdIZWFkSHRtbCgkcGFyYW1zLCBfX0NMQVNTX18pOw0KICAgICAgICAgICAgLy9wYXJlbnQ6OmdldEhlYWRIdG1sKCRwYXJhbXMpOw0KICAgICAgICB9DQogICAgfQ0KfQ==ZnVuY3Rpb24gVEtleWJvYXJkKCkKewogICAgdGhpcy5pZCA9ICJLZXlib2FyZCI7CiAgICAKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIAogICAgdGhpcy5fY3JlYXRlKCk7Cn0KCmV4dGVuZENsYXNzKFRLZXlib2FyZCwgVE9iamVjdCk7CgpUS2V5Ym9hcmQucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CiAgICAKICAgIHRoaXMuY2hhbmdlSW5kZXggPSAwOwogICAgdGhpcy5jdHJsID0gZmFsc2U7CiAgICB0aGlzLnNoaWZ0ID0gZmFsc2U7CiAgICB0aGlzLmFsdCA9IGZhbHNlOwogICAgdGhpcy5tZXRhID0gZmFsc2U7CiAgICB0aGlzLmNvcmUgPSB0cnVlOwoKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgLy9ydW4gb25sb2FkIGluIERPTTIgYnJvd3NlcnMKICAgIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24oZSl7X3RoaXMub25LZXkoZSwgImRvd24iKX0sIGZhbHNlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIGZ1bmN0aW9uKGUpe190aGlzLm9uS2V5KGUsICJ1cCIpfSwgZmFsc2UpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIiwgZnVuY3Rpb24oZSl7X3RoaXMub25QcmVzcyhlKX0sIGZhbHNlKTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSAvL3J1biBvbmxvYWQgaW4gSUU1LjUrCiAgICB7CiAgICAgICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ua2V5ZG93biIsIGZ1bmN0aW9uKGUpe190aGlzLm9uS2V5KGUsICJkb3duIil9KTsKICAgICAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25rZXl1cCIsIGZ1bmN0aW9uKGUpe190aGlzLm9uS2V5KGUsICJ1cCIpfSk7CiAgICAgICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ua2V5cHJlc3MiLCBmdW5jdGlvbihlKXtfdGhpcy5vblByZXNzKGUpfSk7CiAgICB9CiAgICAvL3RoaXMuYWRkQ29udGFpbmVyKHdpbmRvdyk7Cn0KClRLZXlib2FyZC5wcm90b3R5cGUub25DaGFuZ2UgPSBmdW5jdGlvbigpCnsKfQoKVEtleWJvYXJkLnByb3RvdHlwZS5vblByZXNzID0gZnVuY3Rpb24oZSwgYWN0aW9uKQp7CiAgICB2YXIgZSA9IGdldEV2ZW50KGUpOwoKICAgIHRoaXMuY2hhckNvZGUgPSBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZTsKICAgIHRoaXMuY2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jaGFyQ29kZSk7Cn0KICAgIApUS2V5Ym9hcmQucHJvdG90eXBlLm9uS2V5ID0gZnVuY3Rpb24oZSwgYWN0aW9uKQp7CiAgICAvL2R1bXAoJ1RLZXlib2FyZDonK2FjdGlvbik7CiAgICBlID0gZ2V0S2V5RXZlbnQoZSk7CiAgICAKICAgIGlmIChlKQogICAgewogICAgICAgIHRoaXMuY3RybCA9IGUuY3RybEtleTsKICAgICAgICB0aGlzLmFsdCA9IGUuYWx0S2V5OwogICAgICAgIHRoaXMuc2hpZnQgPSBlLnNoaWZ0S2V5OwogICAgICAgIHRoaXMubWV0YSA9IGUubWV0YUtleTsKCiAgICAgICAgdGhpcy5rZXlDb2RlID0gZS5rZXlDb2RlOwoKICAgICAgICBpZiAodGhpcy5fY3RybCAhPSB0aGlzLmN0cmwgfHwgdGhpcy5fYWx0ICE9IHRoaXMuYWx0IHx8IHRoaXMuX3NoaWZ0ICE9IHRoaXMuc2hpZnQgfHwgdGhpcy5fbWV0YSAhPSB0aGlzLm1ldGEgfHwgdGhpcy5fa2V5Q29kZSAhPSB0aGlzLmtleUNvZGUgfHwgdGhpcy5fYWN0aW9uICE9IGFjdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX2N0cmwgPSB0aGlzLmN0cmw7CiAgICAgICAgICAgIHRoaXMuX2FsdCA9IHRoaXMuYWx0OwogICAgICAgICAgICB0aGlzLl9zaGlmdCA9IHRoaXMuc2hpZnQ7CiAgICAgICAgICAgIHRoaXMuX21ldGEgPSB0aGlzLm1ldGE7CiAgICAgICAgICAgIHRoaXMuX2tleUNvZGUgPSB0aGlzLmtleUNvZGU7CiAgICAgICAgICAgIHRoaXMuX2FjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuY2hhbmdlSW5kZXgrKzsKICAgICAgICAgICAgLy9kdW1wKCJ0aGlzLmNoYW5nZUluZGV4PSIrdGhpcy5jaGFuZ2VJbmRleCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMub25DaGFuZ2UoKTsKICAgIH0KICAgIAp9OwoKLy8gbmV3IHZlcnNpb24gb2YgQ2hyb21lIGhhcyBpdCBhcyBuZXcgb2JqZWN0Ci8vaWYgKCF3aW5kb3cuS2V5Ym9hcmQpCiAgICBLZXlib2FyZCA9IG5ldyBUS2V5Ym9hcmQoKTsKCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvS2V5Ym9hcmQvS2V5Ym9hcmQuY2xhc3MucGhwIC0tLS0tLS0gDQoNCmNsYXNzIFRLZXlib2FyZCBleHRlbmRzIFRPYmplY3QNCnsNCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkNCiAgICB7DQogICAgICAgIGlmICghaGVhZEh0bWxBZGRlZChfX0NMQVNTX18sICRwYXJhbXMpKQ0KICAgICAgICB7DQogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvS2V5Ym9hcmQvS2V5Ym9hcmQuY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7DQogICAgICAgICAgICAvL3BhcmVudDo6Z2V0SGVhZEh0bWwoJHBhcmFtcyk7DQogICAgICAgICAgICBhZGRFeHRlbmRpbmdIZWFkSHRtbCgkcGFyYW1zLCBfX0NMQVNTX18pOw0KICAgICAgICB9DQogICAgfQ0KfQ==Ly8gc2F2ZSBvbGQgSlNPTiBmb3IgY29tcGF0aWJpbGl0eQppZiAoIXdpbmRvdy5fX2pzb25Db21wYXRpYmlsaXR5T2JqZWN0KQp7CiAgICB3aW5kb3cuX19qc29uQ29tcGF0aWJpbGl0eU9iamVjdCA9IHdpbmRvdy5KU09OOwp9CgppZiAodHlwZW9mKHdpbmRvdy5fSlNPTikgIT0gInVuZGVmaW5lZCIgJiYgd2luZG93LlRKU09OKQogICAgOyAvL190aHJvdygiSlNPTi5jbGFzcy5qcyBhbHJlYWR5IGxvYWRlZCEiKTsgLy8gcHJvYyB0aHJvdz8gCmVsc2UgCiAgICB3aW5kb3cuX0pTT04gPSBudWxsOwogICAgCmlmICghd2luZG93Ll9KU09OICYmIHR5cGVvZihKU09OKSAhPSAidW5kZWZpbmVkIikKICAgIF9KU09OID0gSlNPTjsKCmZ1bmN0aW9uIFRKU09OKCkKewogICAgdGhpcy5pZCA9ICJKU09OIjsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIAogICAgLy90aGlzLnN0cmlnaWZ5ID0gd2luZG93Ll9fanNvbkNvbXBhdGliaWxpdHlPYmplY3Quc3RyaW5naWZ5OwogICAgLy90aGlzLnBhcnNlID0gd2luZG93Ll9fanNvbkNvbXBhdGliaWxpdHlPYmplY3QucGFyc2U7Cn0KClRKU09OLnByb3RvdHlwZS5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIAp7IAogICAgaWYgKHN0cikKICAgIHsKICAgICAgICAvL2FsZXJ0KHN0cik7CiAgICAgICAgc3RyID0gc3RyX3JlcGxhY2UoIlxcIiwgIlxcXFwiLCBzdHIpOwogICAgICAgIC8vYWxlcnQoc3RyKTsKICAgICAgICBzdHIgPSBzdHJfcmVwbGFjZSgiXCIiLCAiXFxcIiIsIHN0cik7CiAgICAgICAgLy9hbGVydChzdHIpOwogICAgICAgIHN0ciA9IHN0cl9yZXBsYWNlKCJcdCIsICJcXHQiLCBzdHIpOwogICAgICAgIHN0ciA9IHN0cl9yZXBsYWNlKCJcbiIsICJcXG4iLCBzdHIpOwogICAgICAgIHN0ciA9IHN0cl9yZXBsYWNlKCJcciIsICIiLCBzdHIpOwogICAgICAgIHN0ciA9IHN0cl9yZXBsYWNlKFpXTkwsICJcXG4iLCBzdHIpOwogICAgfSAgICAKCiAgICByZXR1cm4oc3RyKTsKfQogICAgClRKU09OLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbihvYmopIAp7IAogICAgLy9kdW1wKG9iaik7CiAgICB2YXIgcmV0ID0gIiI7CiAgICBpZiAoZmFsc2UgJiYgX0pTT04pICAKICAgIHsKICAgICAgICAvLyBoYXMgcHJvYmxlbSB3aXRoIHNvbWUgb2JqZWN0cwogICAgICAgIHJldCA9IF9KU09OLnN0cmluZ2lmeShvYmopOyAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgdCA9IHR5cGVvZiAob2JqKTsgIAogICAgICAgIGlmICh0ICE9ICJvYmplY3QiIHx8IG9iaiA9PT0gbnVsbCkgCiAgICAgICAgeyAgCiAgICAgICAgICAgIC8vIHNpbXBsZSBkYXRhIHR5cGUgIAogICAgICAgICAgICBpZiAodCA9PSAic3RyaW5nIikKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIG9iaiA9ICciJyt0aGlzLmVzY2FwZShvYmopKyciJzsgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IFN0cmluZyhvYmopOyAgCiAgICAgICAgfSAgCiAgICAgICAgZWxzZSAKICAgICAgICB7ICAKICAgICAgICAgICAgLy8gcmVjdXJzZSBhcnJheSBvciBvYmplY3QgIAogICAgICAgICAgICB2YXIgbiwgdiwganNvbiA9IFtdLCBhcnIgPSAob2JqICYmIG9iai5jb25zdHJ1Y3RvciA9PSBBcnJheSk7ICAKICAgICAgICAgICAgZm9yIChuIGluIG9iaikgCiAgICAgICAgICAgIHsgIAogICAgICAgICAgICAgICAgdiA9IG9ialtuXTsgCiAgICAgICAgICAgICAgICB0ID0gdHlwZW9mKHYpOyAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0ICE9ICJmdW5jdGlvbiIpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0ID09ICJzdHJpbmciKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAnIicrdGhpcy5lc2NhcGUodikrJyInOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCh2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCA9PSAib2JqZWN0IiAmJiB2ICE9PSBudWxsKSAKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpOyAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAganNvbi5wdXNoKChhcnIgPyAiIiA6ICciJyArIHRoaXMuZXNjYXBlKG4pICsgJyI6JykgKyBTdHJpbmcodikpOyAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gIAogICAgICAgICAgICByZXQgPSAoYXJyID8gIlsiIDogInsiKSArIFN0cmluZyhqc29uKSArIChhcnIgPyAiXSIgOiAifSIpOyAgCiAgICAgICAgfSAgCiAgICB9CiAgICAKICAgIGlmIChyZXQgJiYgdHlwZW9mKHJldCkgPT0gInN0cmluZyIpCiAgICB7CiAgICAgICAgLy8gYWxsIGlzIG9rCiAgICAgICAgcmV0ID0gc3RyX3JlcGxhY2UoIjp1bmRlZmluZWQiLCAiOm51bGwiLCByZXQpOwogICAgfQogICAgZWxzZSAKICAgICAgICBfdGhyb3coIkpTT04uZW5jb2RlKCk6IHVuYWJsZSB0byBlbmNvZGUgdGhpcyBvYmplY3Q6ICIrX2R1bXAob2JqKSk7CgogICAgLy9hbGVydChyZXQpOwogICAgCiAgICByZXR1cm4ocmV0KTsKfTsgIAoKVEpTT04ucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uKHN0cikgCnsgIAogICAgLy9pZiAoc3RyLmluZGV4T2YoIl9MKCIpID4gLTEpCiAgICAvLyAgICBhbGVydChzdHIpOwogICAgaWYgKHN0ciA9PT0gbnVsbCkgCiAgICAgICAgcmV0dXJuKHt9KTsKCiAgICBpZiAoc3RyIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mKHN0cikgPT0gIm9iamVjdCIpCiAgICAgICAgcmV0dXJuKHN0cik7CiAgICAKICAgIGlmICh0eXBlb2Yoc3RyKSAhPSAic3RyaW5nIikgCiAgICAgICAgc3RyID0gbmV3IFN0cmluZyhzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICBpZiAoc3RyID09PSAiIikgCiAgICAgICAgc3RyID0gJyIiJzsgIAogICAgCiAgICBpZiAoc3RyLm1hdGNoKC9eWzAtOVwuXSskLykpCiAgICAgICAgcmV0dXJuKHN0cik7CgogICAgc3RyID0gc3RyX3JlcGxhY2UoIlx0IiwgIiIsIHN0cik7CiAgICBzdHIgPSBzdHJfcmVwbGFjZSgiXHIiLCAiIiwgc3RyKTsKICAgIHN0ciA9IHN0cl9yZXBsYWNlKCJcbiIsICIiLCBzdHIpOwogICAgc3RyID0gc3RyX3JlcGxhY2UoWldTUCwgIiIsIHN0cik7CiAgICBzdHIgPSBzdHJfcmVwbGFjZShaV05MLCAiIiwgc3RyKTsKICAgIHN0ciA9IHN0cl9yZXBsYWNlKCI6TmFOIiwgIjpudWxsIiwgc3RyKTsKICAgIHN0ciA9IHN0cl9yZXBsYWNlKCI6dW5kZWZpbmVkIiwgIjpudWxsIiwgc3RyKTsKICAgIHN0ciA9IHN0cl9yZXBsYWNlKCJbdW5kZWZpbmVkIiwgIltudWxsIiwgc3RyKTsKICAgIHN0ciA9IHN0cl9yZXBsYWNlKCIsdW5kZWZpbmVkIiwgIixudWxsIiwgc3RyKTsKICAgIAogICAgLy8gcmVwbGFjZSBVVEYtOCBjaGFyYWN0ZXJzCiAgICAvL2R1bXAoZW5jb2RlVVJJKHN0cikpOwogICAgCgogICAgaWYgKHN0ci5pbmRleE9mKCJfTCh7XCIiKSA+IC0xKQogICAgewogICAgICAgIF90aHJvdygiVEpTT04uZGVjb2RlKCkgLSBzeXRheCBlcnJvciBfTChcIi4uLiIpOwogICAgICAgIHJldHVybih7fSk7CiAgICB9CgogICAgLy9zdHIgPSBzdHIucmVwbGFjZSgvOm51bGwvZywgIjonJyIpOwogICAgLy9kdW1wKHN0cik7CiAgICAKICAgIC8vdHJ5CiAgICAvL3sKICAgIHZhciBqc29uUmV0ID0gIiI7CiAgICB2YXIgbWV0aG9kID0gMDsKICAgIHRyeQogICAgewogICAgICAgIGlmIChfSlNPTiA9PSB0aGlzKQogICAgICAgIHsKICAgICAgICAgICAgX3Rocm93KCJUSlNPTjo6cGFyc2UoKSAtIHdpbmRvdy5fSlNPTiBpcyB0aGUgc2FtZSBhcyBUSlNPTiBhbmQgbm90IG5hdGl2ZSBvYmplY3QiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX0pTT04gJiYgc3RyLmluZGV4T2YoIjpmdW5jdGlvbigiKSA9PT0gLTEgJiYgc3RyLmluZGV4T2YoIntfcGhwIikgPT09IC0xICYmIHN0ci5pbmRleE9mKCInIikgPT09IC0xIC8qICYmIHN0ci5pbmRleE9mKCI6dHJ1ZSIpID09PSAtMSAmJiBzdHIuaW5kZXhPZigiOmZhbHNlIikgPT09IC0xICYmIHN0ci5pbmRleE9mKCI6bnVsbCIpID09PSAtMSovKQogICAgICAgIHsKICAgICAgICAgICAganNvblJldCA9IF9KU09OLnBhcnNlKHN0cik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGV2YWwoImpzb25SZXQ9IitzdHIrIjsiKTsgICAgLy8gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlIG5lZWRlZCBmb3IgSUUgNwogICAgICAgIH0KICAgIH0KICAgIGNhdGNoKGUpCiAgICB7CiAgICAgICAgX3Rocm93KGUrIiBmb3IgIitzdHIpOwogICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIC8vYWxlcnQoZSsiIGZvciAiK3N0cik7CiAgICB9CiAgICAKICAgIHJldHVybiBqc29uUmV0OwogICAgCn07ICAKClRKU09OLnByb3RvdHlwZS5pc0pTT04gPSBmdW5jdGlvbih2YWx1ZSkgCnsgIAogICAgcmV0dXJuKGlzSlNPTih2YWx1ZSkpOwp9OwoKLy8gVVBEQVRFIDIwMjIgLSBsZXQgdGhlIHN0cmluZ2lmeSBhbmQgcGFyc2UgYXMgaXMsIGJlY2F1c2UgaXQgaXMgdXNlZCBieSBtYW55IG90aGVyIDNyZCBwYXJ0eSBBUElzIGFuZCBTREtzIAoKVEpTT04ucHJvdG90eXBlLnN0cmluZ2lmeSA9IGZ1bmN0aW9uKHZhbHVlLCByZXBsYWNlciwgc3BhY2UpCnsKICAgIHJldHVybih3aW5kb3cuX19qc29uQ29tcGF0aWJpbGl0eU9iamVjdC5zdHJpbmdpZnkodmFsdWUsIHJlcGxhY2VyLCBzcGFjZSkpOwp9CgpUSlNPTi5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih0ZXN0LCByZXZpdmVyKQp7CiAgICByZXR1cm4od2luZG93Ll9fanNvbkNvbXBhdGliaWxpdHlPYmplY3QucGFyc2UodGVzdCwgcmV2aXZlcikpOwp9CgovL1RKU09OLnByb3RvdHlwZS5lbmNvZGUgPSBUSlNPTi5wcm90b3R5cGUuc3RyaW5naWZ5OwovL1RKU09OLnByb3RvdHlwZS5kZWNvZGUgPSBUSlNPTi5wcm90b3R5cGUucGFyc2U7CmlmICghd2luZG93LkpTT05sb2FkZWQpCnsKICAgIEpTT05sb2FkZWQgPSB0cnVlOwogICAgSlNPTiA9IG5ldyBUSlNPTigpOwogICAgd2luZG93Ll9fanNvblZpc3VhbFBIUE9iamVjdCA9IHdpbmRvdy5KU09OOwogICAgCiAgICBfX0pTT04gPSBKU09OOyAvLyB0byBzZXQgYmFjayBpZiBzb21lIGV4dGVybmFsIHNjcmlwdHMgY2hhbmdlcyBKU09OIG9iamVjdCB0byBpdHMgZGVmYXVsdCAgIEZhY2Vib29rJ3MgZmJldmVudHMuanMKfQoKZnVuY3Rpb24gaXNKU09OKHZhbHVlKQp7CiAgICByZXR1cm4odHlwZW9mKHZhbHVlKSA9PSAic3RyaW5nIiAmJiAodmFsdWUuaW5kZXhPZigiW1wiIikgPT09IDAgfHwgdmFsdWUuaW5kZXhPZigie1wiIikgPT09IDAgfHwgdmFsdWUuaW5kZXhPZigiW3tcIiIpID09PSAwIHx8IHZhbHVlID09ICJbXSIgfHwgdmFsdWUgPT0gInt9IikpOwp9CgovLyBwb3V6aXZhIHNlIHRvPyBwb2t1ZCBhbm8sIHVwcmF2aXQgcHJvIGpzb25Db21wYXRpYmlsaXR5CmZ1bmN0aW9uIF9fSlNPTkZpeCh0aW1lcikKewogICAgaWYgKHRpbWVyIHx8ICF3aW5kb3cuSlNPTkZpeENhbGxlZCkKICAgIHsKICAgICAgICB3aW5kb3cuSlNPTkZpeENhbGxlZCA9IHRydWU7CiAgICAgICAgd2luZG93LkpTT04gPSB3aW5kb3cuX19KU09OOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfX0pTT05GaXgodHJ1ZSl9LCAxMCk7CiAgICB9Cn0KCi8vIHphYmV6cGVjZW5pID8gCi8qCnZhciBteV9KU09OX29iamVjdCA9ICEoL1teLDp7fVxbXF0wLTkuXC0rRWFlZmxuci11IFxuXHJcdF0vLnRlc3QoCiAgICAgICAgICAgIHRleHQucmVwbGFjZSgvIihcXC58W14iXFxdKSoiL2csICcnKSkpICYmCiAgICAgZXZhbCgnKCcgKyB0ZXh0ICsgJyknKTsKICAgICAqLwogICAgIAoKLy8gUGF5UGFsIHBvdHJlYnVqZSBrIGNob2R1IHB1dm9kbmkgd2luZG93LkpTT04sIHRha3plIHBvdHJlYnVqZW1lIHphY2hvdmF0IHB1dm9kbmkKZnVuY3Rpb24ganNvbkNvbXBhdGliaWxpdHkob24pCnsKICAgIGlmIChvbikKICAgIHsKICAgICAgICB3aW5kb3cuSlNPTiA9IHdpbmRvdy5fX2pzb25Db21wYXRpYmlsaXR5T2JqZWN0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHdpbmRvdy5KU09OID0gd2luZG93Ll9fanNvblZpc3VhbFBIUE9iamVjdDsKICAgIH0KfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSlNPTi9KU09OLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFRKU09OIGV4dGVuZHMgVE9iamVjdAp7CiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmdldEhlYWRIdG1sKCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0SGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIGlmICghaGVhZEh0bWxBZGRlZChfX0NMQVNTX18sICRwYXJhbXMpKQogICAgICAgIHsKICAgICAgICAgICAgLy9wYXJlbnQ6OmdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvSlNPTi9KU09OLmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOwogICAgICAgICAgICBhZGRFeHRlbmRpbmdIZWFkSHRtbCgkcGFyYW1zLCBfX0NMQVNTX18pOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfY2xlYXJFbmNvZGVWYXJpYWJsZSgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QWNjZXNzKQogICAgICAgIHsKICAgICAgICAgICAgJHZhbHVlID0gJHZhbHVlLT5nZXRBcnJheUNvcHkoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCR2YWx1ZSBhcyAka2V5ID0+ICR2YWwpICAgICAgICAgICAgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR2YWx1ZVska2V5XSA9IFRKU09OOjpfY2xlYXJFbmNvZGVWYXJpYWJsZSgkdmFsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc19zdHJpbmcoJHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKFpXU1AsICIiLCAkdmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZShaV05MLCAiXG4iLCAkdmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICR2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkdmFsdWUpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kZSgkdmFsdWU9YXJyYXkoKSwgJHNpbGVudD1mYWxzZSwgJHVuZXNjYXBlPXRydWUpCiAgICB7CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwogICAgICAgICR2YWx1ZSA9IFRKU09OOjpfY2xlYXJFbmNvZGVWYXJpYWJsZSgkdmFsdWUpOwogICAgICAgIC8vJHZhbHVlID0gc3RyX3JlcGxhY2UoWldTUCwgIiIsICR2YWx1ZSk7CiAgICAgICAgLy8kdmFsdWUgPSBzdHJfcmVwbGFjZShaV05MLCAiXG4iLCAkdmFsdWUpOwogICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICAKICAgICAgICAkX3ZhbHVlID0gJHZhbHVlOwogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICBpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpCiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKGNocigwKSwgIiIsICR2YWx1ZSk7CiAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwoKICAgICAgICAkdmFsdWUgPSBAanNvbl9lbmNvZGUoJHZhbHVlKTsKICAgICAgICAkZXJyb3IgPSBqc29uX2xhc3RfZXJyb3IoKTsKICAgICAgICBpZiAoISRzaWxlbnQgJiYgJGVycm9yICYmICRlcnJvciAhPSAtMSkKICAgICAgICB7CiAgICAgICAgICAgICRlcnJvcnMgPSBhcnJheSgKICAgICAgICAgICAgICAgIDAgPT4gIkpTT05fRVJST1JfTk9ORSIsCiAgICAgICAgICAgICAgICAxID0+ICJKU09OX0VSUk9SX0RFUFRIIiwKICAgICAgICAgICAgICAgIDIgPT4gIkpTT05fRVJST1JfU1RBVEVfTUlTTUFUQ0giLAogICAgICAgICAgICAgICAgMyA9PiAiSlNPTl9FUlJPUl9DVFJMX0NIQVIiLAogICAgICAgICAgICAgICAgNCA9PiAiSlNPTl9FUlJPUl9TWU5UQVgiLAogICAgICAgICAgICAgICAgNSA9PiAiSlNPTl9FUlJPUl9VVEY4IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSlNPTjo6ZW5jb2RlKCkgZXJyb3IgIyIuJGVycm9yLiIgIi4kZXJyb3JzWyRlcnJvcl0sIG10RXJyb3IpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyByZXZlcnQgYmFjayBcdVhYWFggdXRmOCBjaGFyYWN0ZXJzCiAgICAgICAgLy8genB1c29idWplIHByb2JsZW15IHByaSBkZWtvZG92YW5pIHYgSmF2YVNjcmlwdHUhID0gYWxlIGplIG51dG5lIHBybyBQSFAgPSBqaW5hayBqZSB6IHRvaG8gRG9tXHUwMGUxY1x1MDBlZHxaYWhyYW5pXHUwMTBkblx1MDBlZAogICAgICAgIGlmICgkdW5lc2NhcGUpCiAgICAgICAgewogICAgICAgICAgICAvL2lmIChBSkFYKQogICAgICAgICAgICAvLyAgICB2YXJfZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vaWYgKEFKQVgpCiAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCR2YWx1ZSk7CiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCJcXFxcdSIsICJcXHUiLCAkdmFsdWUpOyAvLyAiX0woe1wiY3NcIjpcIkJlenBlXFx1MDEwZG5vc3RcIixcImVuXCI6XCJTZWN1cml0eVwifSkiIC0gXFx1MDEwZCA9PiBcxI0KICAgICAgICAgICAgJHZhbHVlID0gdW5pY29kZV91bmVzY2FwZSgkdmFsdWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSlNPTigkdmFsdWU9IiIpCiAgICB7CiAgICAgICAgcmV0dXJuKCBpc19zdHJpbmcoJHZhbHVlKSAmJiAKICAgICAgICAgICAgICAgIHN0cnBvcygkdmFsdWUsICJ7cGhwOiIpICE9PSAwICYmCiAgICAgICAgICAgICAgICBzdHJwb3MoJHZhbHVlLCAieyNwaHA6IikgIT09IDAgJiYgCiAgICAgICAgICAgICAgICBzdHJwb3MoJHZhbHVlLCAie19waHA6IikgIT09IDAgJiYgCiAgICAgICAgICAgICAgICBzdHJwb3MoJHZhbHVlLCAieyMiKSAhPT0gMCAmJiAKICAgICAgICAgICAgICAgICgkdmFsdWVbMF0gPT0gInsiIHx8ICR2YWx1ZVswXSA9PSAiWyIpICYmICgkdmFsdWVbc3RybGVuKCR2YWx1ZSktMV0gPT0gIn0iIHx8ICR2YWx1ZVtzdHJsZW4oJHZhbHVlKS0xXSA9PSAiXSIpICYmIAogICAgICAgICAgICAgICAgIXByZWdfbWF0Y2goInxeXFxbW2EtekEtWl18IiwgJHZhbHVlKSAvLyBpcyB0ZW1wbGF0ZSBmaWVsZAogICAgICAgICAgICAgICAgLy8hcHJlZ19tYXRjaCgifF5cXFtbYS16QS1aXVthLXpBLVowLTldKlxcXVwkfCIsICR2YWx1ZSkKICAgICAgICApOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlY29kZSgkdmFsdWU9Int9IiwgJGRlZmF1bHQ9Il9ERUZBVUxUX1ZBTFVFXyIsICRzaWxlbnQ9ZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRkZWZhdWx0ID09PSB0cnVlIHx8ICRkZWZhdWx0ID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSlNPTjo6ZGVjb2RlKCkgLSBkZWZhdWx0IGFuZCBzaWxlbnQgYXJndW1lbnRzIGFyZSBzd2FwcGVkIG5vdy4gIi5nZXRGdW5jdGlvbkNhbGwoKSwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgJF9kZWZhdWx0ID0gJHNpbGVudDsKICAgICAgICAgICAgJHNpbGVudCA9ICRfZGVmYXVsdDsKICAgICAgICAgICAgJGRlZmF1bHQgPSAkX2RlZmF1bHQ7CiAgICAgICAgfQogICAgCiAgICAgICAgLy8gUEhQIDcKICAgICAgICBpZiAoJHZhbHVlID09PSBOVUxMIHx8ICR2YWx1ZSA9PT0gIiIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oJGRlZmF1bHQgIT09ICJfREVGQVVMVF9WQUxVRV8iID8gJGRlZmF1bHQgOiAkdmFsdWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiWyciLCAiW1wiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgieyciLCAie1wiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiJ10iLCAiXCJdIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiJ30iLCAiXCJ9IiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiJzoiLCAiXCI6IiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiOiciLCAiOlwiIiwgJHZhbHVlKTsKICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vJHZhbHVlID0gc3RyX3JlcGxhY2UoIiciLCAiXCIiLCAkdmFsdWUpOwogICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICAKICAgICAgICAKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZShjaHIoMCksICIiLCAkdmFsdWUpOwoKICAgICAgICB3aGlsZShzdHJwb3MoJHZhbHVlLCAiLCwiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCIsLCIsICIsbnVsbCwiLCAkdmFsdWUpOwogICAgICAgIHdoaWxlKHN0cnBvcygkdmFsdWUsICJbLCIpICE9PSBGQUxTRSkKICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIlssIiwgIltudWxsLCIsICR2YWx1ZSk7CiAgICAgICAgd2hpbGUoc3RycG9zKCR2YWx1ZSwgIixdIikgIT09IEZBTFNFKQogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiLF0iLCAiLG51bGxdIiwgJHZhbHVlKTsKICAgICAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZShaV1NQLCAiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZShaV05MLCAiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXG4iLCAiIiwgJHZhbHVlKTsKICAgICAgICAqLwoKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZShaV1NQLCAiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZShaV05MLCAiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXG4iLCAiIiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXHQiLCAiIiwgJHZhbHVlKTsKICAgICAgICAKICAgICAgICBpZiAoJHZhbHVlID09ICIiICYmICRkZWZhdWx0ICE9ICJfREVGQVVMVF9WQUxVRV8iKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKCRkZWZhdWx0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkdmFsdWUsICJ7XFxcIiIpID09PSAwKQogICAgICAgIHsKICAgICAgICAgICAgLy8kdmFsdWUgPSBzdHJfcmVwbGFjZSgiXFwiLCAiIiwgJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJF92YWx1ZSA9ICR2YWx1ZTsKICAgICAgICAKICAgICAgICAkdmFsdWUgPSBAanNvbl9kZWNvZGUoJHZhbHVlLCB0cnVlKTsKICAgICAgICAkZXJyb3IgPSBqc29uX2xhc3RfZXJyb3IoKTsKICAgICAgICBpZiAoJGVycm9yICYmICRlcnJvciAhPSAtMSkKICAgICAgICB7CiAgICAgICAgICAgICRlcnJvcnMgPSBhcnJheSgKICAgICAgICAgICAgICAgIDAgPT4gIkpTT05fRVJST1JfTk9ORSIsCiAgICAgICAgICAgICAgICAxID0+ICJKU09OX0VSUk9SX0RFUFRIIiwKICAgICAgICAgICAgICAgIDIgPT4gIkpTT05fRVJST1JfU1RBVEVfTUlTTUFUQ0giLAogICAgICAgICAgICAgICAgMyA9PiAiSlNPTl9FUlJPUl9DVFJMX0NIQVIiLAogICAgICAgICAgICAgICAgNCA9PiAiSlNPTl9FUlJPUl9TWU5UQVgiLAogICAgICAgICAgICAgICAgNSA9PiAiSlNPTl9FUlJPUl9VVEY4IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghJHNpbGVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9lY2hvICJUSlNPTjo6ZGVjb2RlKCkgZXJyb3IgIyIuJGVycm9yLiIgIi4kZXJyb3JzWyRlcnJvcl0uIiBmb3IgIi4kX3ZhbHVlLiI8aHI+IjsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgIC8vZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRKU09OOjpkZWNvZGUoKSBlcnJvciAjIi4kZXJyb3IuIiAiLiRlcnJvcnNbJGVycm9yXS4iIGZvciAiLnN0cl9kdW1wKCRfdmFsdWUpLihzdHJwb3MoJF92YWx1ZSwgIiYiKSAhPT0gRkFMU0UgPyAiIChodG1sZW50aXRpZXM6Ii5faHRtbGVudGl0aWVzKCRfdmFsdWUpLiIpIiA6ICIiKSwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX3ZhbHVlLCAiXCRpY29uIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKCRfdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgLy9zaG93TWVzc2FnZShnZXRGdW5jdGlvbkNhbGwoKSwgbXRFcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRkZWZhdWx0ICE9ICJfREVGQVVMVF9WQUxVRV8iKQogICAgICAgICAgICAgICAgcmV0dXJuKCRkZWZhdWx0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwogICAgICAgIAogICAgICAgIC8vJHZhbHVlID0gc3Vic3RyKCR2YWx1ZSwgc3RycG9zKCR2YWx1ZSwneycpKzEsIHN0cmxlbigkdmFsdWUpKTsKICAgICAgICAvLyR2YWx1ZSA9IHN1YnN0cigkdmFsdWUsIDAsIHN0cnJwb3MoJHZhbHVlLCd9JykpOwogICAgICAgIC8vJHZhbHVlID0gcHJlZ19yZXBsYWNlKCcvKF58LCkoW1xcc1xcdF0qKShbXjpdKikgKChbXFxzXFx0XSopKTooKFtcXHNcXHRdKikpL3MnLCAnJDEiJDMiJDQ6JywgdHJpbSgkdmFsdWUpKTsKCiAgICAgICAgLy9yZXR1cm4ganNvbl9kZWNvZGUoJ3snLiR2YWx1ZS4nfScsIHRydWUpOwoKCiAgICAgICAgcmV0dXJuKCR2YWx1ZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWNvZGVSZWN1cnNpdmUoJHZhbHVlPSJ7fSIsICRkZWZhdWx0PSJfREVGQVVMVF9WQUxVRV8iLCAkc2lsZW50PWZhbHNlKQogICAgewogICAgICAgICR2YWx1ZSA9IFRKU09OOjpkZWNvZGUoJHZhbHVlLCAkZGVmYXVsdCwgJHNpbGVudCk7CiAgICAgICAgCiAgICAgICAgaWYgKF9pc19hcnJheSgkdmFsdWUpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkdmFsdWUgYXMgJGtleSA9PiAkdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoVEpTT046OmlzSlNPTigkdmFsKSkKICAgICAgICAgICAgICAgICAgICAkdmFsdWVbJGtleV0gPSBUSlNPTjo6ZGVjb2RlUmVjdXJzaXZlKCR2YWwsICRkZWZhdWx0LCAkc2lsZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgIH0KCn0KCgpmdW5jdGlvbiBpc0pTT04oJHN0cikKewogICAgcmV0dXJuKFRKU09OOjppc0pTT04oJHN0cikpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygianNvbl9sYXN0X2Vycm9yIikpCnsKICAgIGZ1bmN0aW9uIGpzb25fbGFzdF9lcnJvcigpCiAgICB7CiAgICAgICAgcmV0dXJuKC0xKTsKICAgIH0KfQoKLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ1VSTC9DVVJMLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFRDVVJMIGV4dGVuZHMgVE9iamVjdAp7CiAgICAKfQoKLyogSFRUUCBSZXRyaWV2ZXIKICogVmVyc2lvbiB2MS4xLjEwCiAqIENvcHlyaWdodCAyMDA0LTIwMDcsIFN0ZXZlIEJsaW5jaAogKiBodHRwOi8vY29kZS5ibGl0emFmZmUuY29tCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogREVTQ1JJUFRJT04KICoKICogUHJvdmlkZXMgYSBwdXJlLVBIUCBpbXBsZW1lbnRhdGlvbiBvZiBhbiBIVFRQIHYxLjEgY2xpZW50LCBpbmNsdWRpbmcgc3VwcG9ydAogKiBmb3IgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBhbmQgdXNlciBhZ2VudCBzcG9vZmluZy4gIEJvdGggR0VUIGFuZCBQT1NUCiAqIHJlcXVlc3RzIGFyZSBzdXBwb3J0ZWQuCiAqCiAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2Ygc29tZXRoaW5nIGxpa2UgQ1VSTCBvciBXR0VUIGZvciBIVFRQIHJlcXVlc3RzLgogKiBOYXRpdmUgU1NMIChIVFRQUykgcmVxdWVzdHMgYXJlIGFsc28gc3VwcG9ydGVkIGlmIHRoZSBPcGVuU1NMIGV4dGVuc2lvbiBpcyAKICogaW5zdGFsbGVkIHVuZGVyIFBIUCB2NC4zLjAgb3IgZ3JlYXRlci4KICoKICogSWYgbmF0aXZlIFNTTCBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBjbGFzcyB3aWxsIGFsc28gY2hlY2sgZm9yIHRoZQogKiBDVVJMIGV4dGVuc2lvbjsgaWYgaXQncyBpbnN0YWxsZWQsIGl0IHdpbGwgdHJhbnNwYXJlbnRseSBiZSB1c2VkIGZvciBTU0wKICogKEhUVFBTKSByZXF1ZXN0cy4KICoKICogSWYgbmVpdGhlciBuYXRpdmUgU1NMIHN1cHBvcnQgbm9yIHRoZSBDVVJMIGV4dGVuc2lvbiBhcmUgYXZhaWxhYmxlLCBhbmQKICogbGliY3VybGVtdSAoYSBDVVJMIGVtdWxhdGlvbiBsaWJyYXJ5IGF2YWlsYWJsZSBmcm9tIG91ciB3ZWIgc2l0ZSkgaXMgZm91bmQsCiAqIHRoZSBjbGFzcyB3aWxsIGFsc28gY2hlY2sgZm9yIHRoZSBDVVJMIGNvbnNvbGUgYmluYXJ5ICh1c3VhbGx5IGluIAogKiAvdXNyL2Jpbi9jdXJsKTsgaWYgaXQncyBpbnN0YWxsZWQsIGl0IHdpbGwgdHJhbnNwYXJlbnRseSBiZSB1c2VkIGZvciBTU0wKICogcmVxdWVzdHMuCiAqCiAqIEluIHNob3J0LCBpZiBpdCdzIHBvc3NpYmxlIHRvIG1ha2UgYW4gSFRUUC9IVFRQUyByZXF1ZXN0IGZyb20geW91ciBzZXJ2ZXIsCiAqIHRoaXMgY2xhc3MgY2FuIG1vc3QgbGlrZWx5IGRvIGl0LgogKgogKgogKiBISVNUT1JZCiAqCiAqIDEuMS4xMCAoMTMtRmViLTIwMDcpCiAqICAgICAgICAtIEZpeGVkIGJ1ZyB3aGVyZWluIGxpYmN1cmxlbXUgbWF5IG5vdCBiZSBjb3JyZWN0bHkgaW5jbHVkZWQgd2hlbgogKiAgICAgICAgICBuZWVkZWQuCiAqICAgICAgICAtIEZpeGVkIGJ1ZyB3aGVyZWluIHN0cmVhbSByZWFkIHRpbWVvdXRzIG1heSBub3QgYmUgcmVjb2duaXplZAogKiAgICAgICAgLSBBZGp1c3RlZCB0aW1lb3V0IGhhbmRsaW5nIGNvZGUgdG8gYmV0dGVyIGhhbmRsZSB0aW1lb3V0IGNvbmRpdGlvbnMKICogICAgICAgIC0gQWRkZWQgaW50ZWxsaWdlbnQgY2FjaGluZyBzdXBwb3J0CiAqICAgICAgICAtIENhY2hpbmcgaXMgbm93IGJldHRlci1oYW5kbGVkIGZvciBoaWdoLXZvbHVtZSByZXF1ZXN0cwogKiAgICAgICAgLSBBZGRlZCBwb3N0cHJvY2Vzc2luZyBjYWxsYmFjayBzdXBwb3J0CiAqICAgICAgICAtIEltcHJvdmVkIHJlZGlyZWN0IHN1cHBvcnQKICogICAgICAgIC0gRml4ZWQgYnVnIGluIHdoaWNoIFBPU1QgcmVxdWVzdHMgY291bGRuJ3QgdXNlIEdFVC1zdHlsZSBxdWVyeSBzdHJpbmdzCiAqICAgICAgICAtIEFkZGVkIGhlYWRlciBjbGVhbnVwIGJldHdlZW4gcmVxdWVzdHMKICogICAgICAgIC0gQWRkZWQgcGFydGlhbCBwcm94eSBzdXBwb3J0IHZpYSAkaHR0cC0+Y3VybF9wcm94eSAob25seSB1c2VhYmxlIHdoZW4KICogICAgICAgICAgJGh0dHAtPmZvcmNlX2N1cmwgaXMgVFJVRTsgaW50ZXJuYWwgc3VwcG9ydCBub3QgeWV0IGltcGxlbWVudGVkKQogKgogKgogKiAxLjEuOSAoMTEtT2N0LTIwMDYpCiAqICAgICAgICAtIEFkZGVkIHNldF90cmFuc2Zlcl9kaXNwbGF5KCkgYW5kIGRlZmF1bHRfdHJhbnNmZXJfY2FsbGJhY2soKQogKiAgICAgICAgICBtZXRob2RzIGZvciB0cmFuc2ZlciBwcm9ncmVzcyB0cmFja2luZwogKiAgICAgICAgLSBTdXBwcmVzc2VkIHBvc3NpYmxlICJmYXRhbCBwcm90b2NvbCBlcnJvciIgd2hlbiByZW1vdGUgU1NMIHNlcnZlcgogKiAgICAgICAgICBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gZWFybHkKICogICAgICAgIC0gQWRkZWQgZ2V0X2NvbnRlbnRfdHlwZSgpIG1ldGhvZAogKiAgICAgICAgLSBtYWtlX3F1ZXJ5X3N0cmluZygpIG5vdyBoYW5kbGVzIGFycmF5cwogKgogKiAxLjEuOCAoMTktSnVuLTIwMDYpCiAqICAgICAgICAtIEFkZGVkIHNldF9wcm9ncmVzc19kaXNwbGF5KCkgYW5kIGRlZmF1bHRfcHJvZ3Jlc3NfY2FsbGJhY2soKQogKiAgICAgICAgICBtZXRob2RzIGZvciBkZWJ1ZyBvdXRwdXQKICogICAgICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgcmVsYXRpdmUgVVJMcyBpbiBIVFRQIHJlZGlyZWN0cwogKiAgICAgICAgLSBBZGRlZCBjb29raWUgc3VwcG9ydCAoc2VuZGluZyBhbmQgcmVjZWl2aW5nKQogKiAgICAgICAgLSBOdW1lcm91cyBidWcgZml4ZXMKICoKICogMS4xLjcgKDE4LUFwci0yMDA2KQogKiAgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBhdXRvbWF0aWNhbGx5IGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cwogKiAgICAgICAgLSBBZGRlZCA6OmdldF9lcnJvcigpIG1ldGhvZCB0byBnZXQgYW55IGF2YWlsYWJsZSBlcnJvciBtZXNzYWdlIChiZQogKiAgICAgICAgICBpdCBhbiBIVFRQIHJlc3VsdCBlcnJvciBvciBhbiBpbnRlcm5hbC9jb25uZWN0aW9uIGVycm9yKQogKiAgICAgICAgLSBBZGRlZCA6OmNhY2hlX2hpdCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGFnZSB3YXMgY2FjaGVkCiAqCiAqIDEuMS42ICgwNC1NYXItMjAwNikKICogICAgICAgIC0gQWRkZWQgc3RyZWFtX3RpbWVvdXQgY2xhc3MgdmFyaWFibGUuCiAqICAgICAgICAtIEFkZGVkIHByb2dyZXNzX2NhbGxiYWNrIGNsYXNzIHZhcmlhYmxlLgogKiAgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBicmFpbmRlYWQgc2VydmVycyB0aGF0IGlnbm9yZSBDb25uZWN0aW9uOiBjbG9zZQogKgogKgogKiBFWEFNUExFCiAqCiAqIC8vIEhUVFBSZXRyaWV2ZXIgdXNhZ2UgZXhhbXBsZQogKiByZXF1aXJlX29uY2UoImNsYXNzX0hUVFBSZXRyaWV2ZXIucGhwIik7CiAqICRodHRwID0gJm5ldyBIVFRQUmV0cmlldmVyKCk7CiAqCiAqCiAqIC8vIEV4YW1wbGUgR0VUIHJlcXVlc3Q6CiAqIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogJGtleXdvcmQgPSAiYmxpdHphZmZlIGNvZGUiOyAvLyBzZWFyY2ggR29vZ2xlIGZvciB0aGlzIGtleXdvcmQKICogaWYgKCEkaHR0cC0+Z2V0KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP2hsPWVuJnE9JTIyIi51cmxlbmNvZGUoJGtleXdvcmQpLiIlMjImYnRuRz1TZWFyY2gmbWV0YT0iKSkgewogKiAgICAgZWNobyAiSFRUUCByZXF1ZXN0IGVycm9yOiAjeyRodHRwLT5yZXN1bHRfY29kZX06IHskaHR0cC0+cmVzdWx0X3RleHR9IjsKICogICAgIHJldHVybiBmYWxzZTsKICogfQogKiBlY2hvICJIVFRQIHJlc3BvbnNlIGhlYWRlcnM6PGJyPjxwcmU+IjsKICogdmFyX2R1bXAoJGh0dHAtPnJlc3BvbnNlX2hlYWRlcnMpOwogKiBlY2hvICI8L3ByZT48YnI+IjsKICogCiAqIGVjaG8gIlBhZ2UgY29udGVudDo8YnI+PHByZT4iOwogKiBlY2hvICRodHRwLT5yZXNwb25zZTsKICogZWNobyAiPC9wcmU+IjsKICogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgCiAqCiAqIC8vIEV4YW1wbGUgUE9TVCByZXF1ZXN0OgogKiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICRrZXl3b3JkID0gImJsaXR6YWZmZSBjb2RlIjsgLy8gc2VhcmNoIEdvb2dsZSBmb3IgdGhpcyBrZXl3b3JkCiAqICR2YWx1ZXMgPSBhcnJheSgKICogICAgICJobCI9PiJlbiIsCiAqICAgICAicSI9PiIlMjIiLnVybGVuY29kZSgka2V5d29yZCkuIiUyMiIsCiAqICAgICAiYnRuRyI9PiJTZWFyY2giLAogKiAgICAgIm1ldGEiPT4iIgogKiApOwogKiAvLyBOb3RlOiBUaGlzIGV4YW1wbGUgaXMganVzdCB0byBkZW1vbnN0cmF0ZSB0aGUgUE9TVCBlcXVpdmFsZW50IG9mIHRoZSBHRVQKICogLy8gZXhhbXBsZSBhYm92ZTsgcnVubmluZyB0aGlzIHNjcmlwdCB3aWxsIHJldHVybiBhIDUwMSBOb3QgSW1wbGVtZW50ZWQsIGFzCiAqIC8vIEdvb2dsZSBkb2VzIG5vdCBzdXBwb3J0IFBPU1QgcmVxdWVzdHMuCiAqIGlmICghJGh0dHAtPnBvc3QoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giLCRodHRwLT5tYWtlX3F1ZXJ5X3N0cmluZygkdmFsdWVzKSkpIHsKICogICAgIGVjaG8gIkhUVFAgcmVxdWVzdCBlcnJvcjogI3skaHR0cC0+cmVzdWx0X2NvZGV9OiB7JGh0dHAtPnJlc3VsdF90ZXh0fSI7CiAqICAgICByZXR1cm4gZmFsc2U7CiAqIH0KICogZWNobyAiSFRUUCByZXNwb25zZSBoZWFkZXJzOjxicj48cHJlPiI7CiAqIHZhcl9kdW1wKCRodHRwLT5yZXNwb25zZV9oZWFkZXJzKTsKICogZWNobyAiPC9wcmU+PGJyPiI7CiAqIAogKiBlY2hvICJQYWdlIGNvbnRlbnQ6PGJyPjxwcmU+IjsKICogZWNobyAkaHR0cC0+cmVzcG9uc2U7CiAqIGVjaG8gIjwvcHJlPiI7CiAqIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICoKICogTElDRU5TRQogKgogKiBUaGlzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQogKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCiAqIHZlcnNpb24uCiAqCiAqIFRoaXMgc2NyaXB0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQogKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICogICAgCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCiAqIHdpdGggdGhpcyBzY3JpcHQ7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCi8vIGRlZmluZSB1c2VyIGFnZW50IElEJ3MKZGVmaW5lKCJVQV9FWFBMT1JFUiIsMCk7CmRlZmluZSgiVUFfTU9aSUxMQSIsMSk7CmRlZmluZSgiVUFfRklSRUZPWCIsMik7CmRlZmluZSgiVUFfT1BFUkEiLDMpOwoKLy8gZGVmaW5lIHByb2dyZXNzIG1lc3NhZ2Ugc2V2ZXJpdHkgbGV2ZWxzCmRlZmluZSgnSFJQX0RFQlVHJywwKTsKZGVmaW5lKCdIUlBfSU5GTycsMSk7CmRlZmluZSgnSFJQX0VSUk9SJywyKTsKCmlmICghZGVmaW5lZCgiQ1VSTF9QQVRIIikpIGRlZmluZSgiQ1VSTF9QQVRIIiwiL3Vzci9iaW4vY3VybCIpOwoKLy8gaWYgdGhlIENVUkwgZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWQsIGJ1dCB0aGUgQ1VSTCBFbXVsYXRpb24gTGlicmFyeSBpcyBmb3VuZCwgdHJ5Ci8vIHRvIGxvYWQgaXQKaWYgKCFleHRlbnNpb25fbG9hZGVkKCJjdXJsIikgJiYgIWRlZmluZWQoJ0hUVFBSX05PX1JFREVDTEFSRV9DVVJMJykgKSB7CiAgICBmb3JlYWNoIChhcnJheShkaXJuYW1lKF9fRklMRV9fKS4iLyIsZGlybmFtZShfX0ZJTEVfXykuIi9saWJjdXJsZW11LyIpIGFzICRrPT4kbGliY3VybGVtdXBhdGgpIHsKICAgICAgICAkbGliY3VybGVtdWluYyA9ICRsaWJjdXJsZW11cGF0aC4nbGliY3VybGVtdS5pbmMucGhwJzsKICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGxpYmN1cmxlbXVpbmMpKSByZXF1aXJlX29uY2UoJGxpYmN1cmxlbXVpbmMpOwogICAgfQp9CgpmdW5jdGlvbiBfX2N1cmxfcHJvZ3Jlc3NfY2FsbGJhY2soJGxldmVsLCAkbXNnKQp7CiAgICAvL2R1bXAoJGxldmVsKTsKICAgIC8vZHVtcCgkbXNnKTsKfQoKY2xhc3MgVEhUVFBSZXRyaWV2ZXIgZXh0ZW5kcyBUQ29yZU9iamVjdCAKeyAgICAKICAgIC8vIENvbnN0cnVjdG9yCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKICAgICAgICAvLyBkZWZhdWx0IEhUVFAgaGVhZGVycyB0byBzZW5kIHdpdGggYWxsIHJlcXVlc3RzCiAgICAgICAgJHRoaXMtPmhlYWRlcnMgPSBhcnJheSgKICAgICAgICAgICAgIlJlZmVyZXIiPT4iIiwKICAgICAgICAgICAgIlVzZXItQWdlbnQiPT4iSFRUUFJldHJpZXZlci8xLjAiLAogICAgICAgICAgICAiQ29ubmVjdGlvbiI9PiJjbG9zZSIKICAgICAgICApOwogICAgICAgIAogICAgICAgIC8vIEhUVFAgdmVyc2lvbiAoaGFzIG5vIGVmZmVjdCBpZiB1c2luZyBDVVJMKQogICAgICAgICR0aGlzLT52ZXJzaW9uID0gIjEuMSI7CiAgICAgICAgCiAgICAgICAgLy8gTm9ybWFsbHksIENVUkwgaXMgb25seSB1c2VkIGZvciBIVFRQUyByZXF1ZXN0czsgc2V0dGluZyB0aGlzIHRvCiAgICAgICAgLy8gVFJVRSB3aWxsIGZvcmNlIENVUkwgZm9yIEhUVFAgcmVxdWVzdHMgYXMgd2VsbC4gIE5vdCByZWNvbW1lbmRlZC4KICAgICAgICAkdGhpcy0+Zm9yY2VfY3VybCA9IGZhbHNlOyAgICAKICAgICAgICAKICAgICAgICAvLyBJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgQ1VSTCBhdCBhbGwsIHNldCB0aGlzIHRvIFRSVUUuCiAgICAgICAgJHRoaXMtPmRpc2FibGVfY3VybCA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8vIElmIEhUVFBTIHJlcXVlc3QgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgU1NMIGNlcnRpZmljYXRlcyBpbgogICAgICAgIC8vICR0aGlzLT5lcnJvciBhbmQgeW91IGRvbid0IGNhcmUgYWJvdXQgc2VjdXJpdHksIHNldCB0aGlzIHRvIFRSVUUKICAgICAgICAkdGhpcy0+aW5zZWN1cmVfc3NsID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAvLyBTZXQgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24KICAgICAgICAkdGhpcy0+Y29ubmVjdF90aW1lb3V0ID0gMTU7CiAgICAgICAgCiAgICAgICAgLy8gU2V0IHRoZSBtYXhpbXVtIHRpbWUgdG8gYWxsb3cgYSB0cmFuc2ZlciB0byBydW4sIG9yIDAgdG8gZGlzYWJsZS4KICAgICAgICAkdGhpcy0+bWF4X3RpbWUgPSAwOwogICAgICAgIAogICAgICAgIC8vIFNldCB0aGUgbWF4aW11bSB0aW1lIGZvciBhIHNvY2tldCByZWFkL3dyaXRlIG9wZXJhdGlvbiwgb3IgMCB0byBkaXNhYmxlLgogICAgICAgICR0aGlzLT5zdHJlYW1fdGltZW91dCA9IDA7CiAgICAgICAgCiAgICAgICAgLy8gSWYgeW91J3JlIG1ha2luZyBhbiBIVFRQUyByZXF1ZXN0IHRvIGEgaG9zdCB3aG9zZSBTU0wgY2VydGlmaWNhdGUKICAgICAgICAvLyBkb2Vzbid0IG1hdGNoIGl0cyBkb21haW4gbmFtZSwgQU5EIFlPVSBGVUxMWSBVTkRFUlNUQU5EIFRIRQogICAgICAgIC8vIFNFQ1VSSVRZIElNUExJQ0FUSU9OUyBPRiBJR05PUklORyBUSElTIFBST0JMRU0sIHNldCB0aGlzIHRvIFRSVUUuCiAgICAgICAgJHRoaXMtPmlnbm9yZV9zc2xfaG9zdG5hbWUgPSB0cnVlOwogICAgICAgIAogICAgICAgIC8vIElmIFRSVUUsIHRoZSBnZXQoKSBhbmQgcG9zdCgpIG1ldGhvZHMgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbgogICAgICAgIC8vIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBIVFRQIHJlc3VsdCBjb2RlCiAgICAgICAgJHRoaXMtPnJlc3VsdF9jbG9zZSA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8vIElmIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUsIHJldHJpZXZlZCBwYWdlcyB3aWxsIGJlIGNhY2hlZAogICAgICAgIC8vIGZvciB0aGlzIG51bWJlciBvZiBzZWNvbmRzLiAgQW55IHN1YnNlcXVlbnQgY2FsbHMgd2l0aGluIHRoZSBjYWNoZQogICAgICAgIC8vIHBlcmlvZCB3aWxsIHJldHVybiB0aGUgY2FjaGVkIHBhZ2UsIHdpdGhvdXQgY29udGFjdGluZyB0aGUgcmVtb3RlCiAgICAgICAgLy8gc2VydmVyLgogICAgICAgICR0aGlzLT5jYWNoaW5nID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgLy8gSWYgVFJVRSBhbmQgJHRoaXMtPmNhY2hpbmcgaXMgbm90IGZhbHNlLCByZXRyaWV2ZWQgcGFnZXMvZmlsZXMgd2lsbCBiZQogICAgICAgIC8vIGNhY2hlZCBvbmx5IGlmIHRoZXkgYXBwZWFyIHRvIGJlIHN0YXRpYy4KICAgICAgICAkdGhpcy0+Y2FjaGluZ19pbnRlbGxpZ2VudCA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8vIElmIFRSVUUsIGNhY2hlZCBmaWxlcyB3aWxsIGJlIHN0b3JlZCBpbiBzdWJkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nCiAgICAgICAgLy8gdG8gdGhlIGZpcnN0IDIgbGV0dGVycyBvZiB0aGUgaGFzaCBmaWxlbmFtZQogICAgICAgICR0aGlzLT5jYWNoaW5nX2hpZ2h2b2x1bWUgPSBmYWxzZTsKCiAgICAgICAgLy8gSWYgJHRoaXMtPmNhY2hpbmcgaXMgZW5hYmxlZCwgdGhpcyBzcGVjaWZpZXMgdGhlIGZvbGRlciB1bmRlciB3aGljaAogICAgICAgIC8vIGNhY2hlZCBwYWdlcyBhcmUgc2F2ZWQuCiAgICAgICAgJHRoaXMtPmNhY2hlX3BhdGggPSAnL3RtcC8nOwogICAgICAgIAogICAgICAgIC8vIFNldCB0aGVzZSB0byBwZXJmb3JtIGJhc2ljIEhUVFAgYXV0aGVudGljYXRpb24KICAgICAgICAkdGhpcy0+YXV0aF91c2VybmFtZSA9ICcnOwogICAgICAgICR0aGlzLT5hdXRoX3Bhc3N3b3JkID0gJyc7CgogICAgICAgIC8vIE9wdGlvbmFsbHkgc2V0IHRoaXMgdG8gYSB2YWxpZCBjYWxsYmFjayBtZXRob2QgdG8gaGF2ZSBIVFRQUmV0cmlldmVyCiAgICAgICAgLy8gcHJvdmlkZSBwYWdlIHByZXByb2Nlc3NpbmcgY2FwYWJpbGl0aWVzIHRvIHlvdXIgc2NyaXB0LiAgSWYgc2V0LCB0aGlzCiAgICAgICAgLy8gbWV0aG9kIHNob3VsZCBhY2NlcHQgdHdvIGFyZ3VtZW50czogYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpbnN0YW5jZQogICAgICAgIC8vIG9mIEhUVFBSZXRyaWV2ZXIsIGFuZCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYWdlIGNvbnRlbnRzCiAgICAgICAgJHRoaXMtPnBhZ2VfcHJlcHJvY2Vzc29yID0gbnVsbDsKICAgICAgICAKICAgICAgICAvLyBPcHRpb25hbGx5IHNldCB0aGlzIHRvIGEgdmFsaWQgY2FsbGJhY2sgbWV0aG9kIHRvIGhhdmUgSFRUUFJldHJpZXZlcgogICAgICAgIC8vIHByb3ZpZGUgcHJvZ3Jlc3MgbWVzc2FnZXMuICBZb3VyIGNhbGxiYWNrIG11c3QgYWNjZXB0IDIgcGFyYW1ldGVyczoKICAgICAgICAvLyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgc2V2ZXJpdHkgKDA9ZGVidWcsIDE9aW5mb3JtYXRpb24sIDI9ZXJyb3IpLAogICAgICAgIC8vIGFuZCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb2dyZXNzIG1lc3NhZ2UKICAgICAgICAvLyR0aGlzLT5wcm9ncmVzc19jYWxsYmFjayA9IG51bGw7CiAgICAgICAgJHRoaXMtPnByb2dyZXNzX2NhbGxiYWNrID0gIl9fY3VybF9wcm9ncmVzc19jYWxsYmFjayI7CiAgICAgICAgCiAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgdGhpcyB0byBhIHZhbGlkIGNhbGxiYWNrIG1ldGhvZCB0byBoYXZlIEhUVFBSZXRyaWV2ZXIKICAgICAgICAvLyBwcm92aWRlIGJ5dGVzLXRyYW5zZmVycmVkIG1lc3NhZ2VzLiAgWW91ciBjYWxsYmNhayBtdXN0IGFjY2VwdCAyCiAgICAgICAgLy8gcGFyYW1ldGVyczogYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwKICAgICAgICAvLyBhbmQgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBleHBlY3RlZCAob3IKICAgICAgICAvLyAtMSBpZiB1bmtub3duKS4KICAgICAgICAkdGhpcy0+dHJhbnNmZXJfY2FsbGJhY2sgPSBudWxsOwogICAgICAgIAogICAgICAgIC8vIFNldCB0aGlzIHRvIFRSVUUgaWYgeW91IEhUVFBSZXRyaWV2ZXIgdG8gdHJhbnNwYXJlbnRseSBmb2xsb3cgSFRUUAogICAgICAgIC8vIHJlZGlyZWN0cyAoY29kZSAzMDEsIDMwMiwgMzAzLCBhbmQgMzA3KS4gIE9wdGlvbmFsbHkgc2V0IHRoaXMgdG8gYQogICAgICAgIC8vIG51bWVyaWMgdmFsdWUgdG8gbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0cyB0byB0aGUgc3BlY2lmaWVkCiAgICAgICAgLy8gdmFsdWUuICAoUmVkaXJlY3Rpb24gbG9vcHMgYXJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuKQogICAgICAgIC8vIE5vdGUgdGhhdCBub24tR0VUL0hFQUQgcmVxdWVzdHMgd2lsbCBOT1QgYmUgcmVkaXJlY3RlZCBleGNlcHQgb24gY29kZQogICAgICAgIC8vIDMwMywgYXMgcGVyIEhUVFAgc3RhbmRhcmRzLgogICAgICAgICR0aGlzLT5mb2xsb3dfcmVkaXJlY3RzID0gZmFsc2U7CiAgICB9CiAgICAKICAgIC8vIFNlbmQgYW4gSFRUUCBHRVQgcmVxdWVzdCB0byAkdXJsOyBpZiAkaXBhZGRyZXNzIGlzIHNwZWNpZmllZCwgdGhlCiAgICAvLyBjb25uZWN0aW9uIHdpbGwgYmUgbWFkZSB0byB0aGUgc2VsZWN0ZWQgSVAgaW5zdGVhZCBvZiByZXNvbHZpbmcgdGhlIAogICAgLy8gaG9zdG5hbWUgaW4gJHVybC4KICAgIC8vCiAgICAvLyBJZiAkY29va2llcyBpcyBzZXQsIGl0IHNob3VsZCBiZSBhbiBhcnJheSBpbiBvbmUgb2YgdHdvIGZvcm1hdHMuCiAgICAvLwogICAgLy8gRWl0aGVyOiAkY29va2llc1sgJ2Nvb2tpZW5hbWUnIF0gPSBhcnJheSAoCiAgICAvLyAgICAgICAgJy9wYXRoLyc9PmFycmF5KAogICAgLy8gICAgICAgICAgICAnZXhwaXJlcyc9PnRpbWUoKSwKICAgIC8vICAgICAgICAgICAgJ2RvbWFpbic9Pid5b3VyZG9tYWluLmNvbScsCiAgICAvLyAgICAgICAgICAgICd2YWx1ZSc9Pidjb29raWV2YWx1ZScKICAgIC8vICAgICAgICApCiAgICAvLyApOwogICAgLy8KICAgIC8vIE9yLCBhIG1vcmUgc2ltcGxpZmllZCBmb3JtYXQ6CiAgICAvLyAgICAkY29va2llc1sgJ2Nvb2tpZW5hbWUnIF0gPSAndmFsdWUnOwogICAgLy8KICAgIC8vIFRoZSBmb3JtZXIgZm9ybWF0IHdpbGwgYXV0b21hdGljYWxseSBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGF0aCwgZG9tYWluLAogICAgLy8gYW5kIGV4cGlyYXRpb24gdmFsdWVzIG1hdGNoIHRoZSBIVFRQIHJlcXVlc3QsIGFuZCB3aWxsIG9ubHkgc2VuZCB0aGUgY29va2llIGlmCiAgICAvLyB0aGV5IGRvIG1hdGNoLiAgVGhlIGxhdHRlciB3aWxsIGZvcmNlIHRoZSBjb29raWUgdG8gYmUgc2V0IGZvciB0aGUgSFRUUCByZXF1ZXN0CiAgICAvLyB1bmNvbmRpdGlvbmFsbHkuCiAgICAvLyAKICAgIGZ1bmN0aW9uIGdldCgkdXJsLCRpcGFkZHJlc3MgPSBmYWxzZSwkY29va2llcyA9IGZhbHNlKSB7CiAgICAgICAgJHRoaXMtPm1ldGhvZCA9ICJHRVQiOwogICAgICAgICR0aGlzLT5wb3N0X2RhdGEgPSAiIjsKICAgICAgICAkdGhpcy0+Y29ubmVjdF9pcCA9ICRpcGFkZHJlc3M7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fZXhlY3V0ZV9yZXF1ZXN0KCR1cmwsJGNvb2tpZXMpOwogICAgfQogICAgCiAgICAvLyBTZW5kIGFuIEhUVFAgUE9TVCByZXF1ZXN0IHRvICR1cmwgY29udGFpbmluZyB0aGUgUE9TVCBkYXRhICRkYXRhLiAgU2VlIDo6Z2V0KCkKICAgIC8vIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLgogICAgZnVuY3Rpb24gcG9zdCgkdXJsLCRkYXRhPSIiLCRpcGFkZHJlc3MgPSBmYWxzZSwkY29va2llcyA9IGZhbHNlKSB7CiAgICAgICAgJHRoaXMtPm1ldGhvZCA9ICJQT1NUIjsKICAgICAgICAkdGhpcy0+cG9zdF9kYXRhID0gJGRhdGE7CiAgICAgICAgJHRoaXMtPmNvbm5lY3RfaXAgPSAkaXBhZGRyZXNzOwogICAgICAgIHJldHVybiAkdGhpcy0+X2V4ZWN1dGVfcmVxdWVzdCgkdXJsLCRjb29raWVzKTsKICAgIH0KICAgIAogICAgLy8gU2VuZCBhbiBIVFRQIEhFQUQgcmVxdWVzdCB0byAkdXJsLiAgU2VlIDo6Z2V0KCkgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFyZ3VtZW50cy4gICAgCiAgICBmdW5jdGlvbiBoZWFkKCR1cmwsJGlwYWRkcmVzcyA9IGZhbHNlLCRjb29raWVzID0gZmFsc2UpIHsKICAgICAgICAkdGhpcy0+bWV0aG9kID0gIkhFQUQiOwogICAgICAgICR0aGlzLT5wb3N0X2RhdGEgPSAiIjsKICAgICAgICAkdGhpcy0+Y29ubmVjdF9pcCA9ICRpcGFkZHJlc3M7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fZXhlY3V0ZV9yZXF1ZXN0KCR1cmwsJGNvb2tpZXMpOwogICAgfQogICAgICAgIAogICAgLy8gc2VuZCBhbiBhbHRlcm5hdGUgKG5vbi1HRVQvUE9TVCkgSFRUUCByZXF1ZXN0IHRvICR1cmwKICAgIGZ1bmN0aW9uIGN1c3RvbSgkbWV0aG9kLCR1cmwsJGRhdGE9IiIsJGlwYWRkcmVzcyA9IGZhbHNlLCRjb29raWVzID0gZmFsc2UpIHsKICAgICAgICAkdGhpcy0+bWV0aG9kID0gJG1ldGhvZDsKICAgICAgICAkdGhpcy0+cG9zdF9kYXRhID0gJGRhdGE7CiAgICAgICAgJHRoaXMtPmNvbm5lY3RfaXAgPSAkaXBhZGRyZXNzOwogICAgICAgIHJldHVybiAkdGhpcy0+X2V4ZWN1dGVfcmVxdWVzdCgkdXJsLCRjb29raWVzKTsKICAgIH0gICAgCiAgICAKICAgIGZ1bmN0aW9uIGFycmF5X3RvX3F1ZXJ5KCRhcnJheW5hbWUsJGFycmF5Y29udGVudHMpIHsKICAgICAgICAkb3V0cHV0ID0gIiI7CiAgICAgICAgZm9yZWFjaCAoJGFycmF5Y29udGVudHMgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkb3V0cHV0IC49ICR0aGlzLT5hcnJheV90b19xdWVyeShzcHJpbnRmKCclc1slc10nLCRhcnJheW5hbWUsdXJsZW5jb2RlKCRrZXkpKSwkdmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG91dHB1dCAuPSBzcHJpbnRmKCclc1slc109JXMmJywkYXJyYXluYW1lLHVybGVuY29kZSgka2V5KSx1cmxlbmNvZGUoJHZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9CiAgICAKICAgIC8vIGJ1aWxkcyBhIHF1ZXJ5IHN0cmluZyBmcm9tIHRoZSBhc3NvY2lhdGl2ZSBhcnJheSBhcnJheSAkZGF0YTsKICAgIC8vIHJldHVybnMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIHRvICR0aGlzLT5wb3N0KCkKICAgIGZ1bmN0aW9uIG1ha2VfcXVlcnlfc3RyaW5nKCRkYXRhKSB7CiAgICAgICAgJG91dHB1dCA9ICIiOwogICAgICAgIGlmIChpc19hcnJheSgkZGF0YSkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGRhdGEgYXMgJG5hbWU9PiR2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49ICR0aGlzLT5hcnJheV90b19xdWVyeSh1cmxlbmNvZGUoJG5hbWUpLCR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfc2NhbGFyKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IHVybGVuY29kZSgkbmFtZSkuIj0iLnVybGVuY29kZSgkdmFsdWUpLiImIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSB1cmxlbmNvZGUoJG5hbWUpLiI9Ii51cmxlbmNvZGUoc2VyaWFsaXplKCR2YWx1ZSkpLicmJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3Vic3RyKCRvdXRwdXQsMCxzdHJsZW4oJG91dHB1dCktMSk7CiAgICB9CgogICAgCiAgICAvLyB0aGlzIGlzIHByZXR0eSBsaW1pdGVkLi4uIGJ1dCByZWFsbHksIGlmIHlvdSdyZSBnb2luZyB0byBzcG9vZiB5b3UgVUEsIHlvdSdsbCBwcm9iYWJseQogICAgLy8gd2FudCB0byB1c2UgYSBXaW5kb3dzIE9TIGZvciB0aGUgc3Bvb2YgYW55d2F5CiAgICAvLwogICAgLy8gaWYgeW91IHdhbnQgdG8gc2V0IHRoZSB1c2VyIGFnZW50IHRvIGEgY3VzdG9tIHN0cmluZywganVzdCBhc3NpZ24geW91ciBzdHJpbmcgdG8KICAgIC8vICR0aGlzLT5oZWFkZXJzWyJVc2VyLUFnZW50Il0gZGlyZWN0bHkKICAgIGZ1bmN0aW9uIHNldF91c2VyX2FnZW50KCRhZ2VudHR5cGUsJGFnZW50dmVyc2lvbiwkd2luZG93c3ZlcnNpb24pIHsKICAgICAgICAkdXNlcmFnZW50cyA9IGFycmF5KAogICAgICAgICAgICAiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgJWFnZW50JTsgV2luZG93cyBOVCAlb3MlKSIsIC8vIElFCiAgICAgICAgICAgICJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCAlb3MlOyBlbi1VUzsgcnY6JWFnZW50JSkgR2Vja28vMjAwNDA1MTQiLCAvLyBNb3oKICAgICAgICAgICAgIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UICVvcyU7IGVuLVVTOyBydjoxLjcpIEdlY2tvLzIwMDQwODAzIEZpcmVmb3gvJWFnZW50JSIsIC8vIEZGb3gKICAgICAgICAgICAgIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCAlb3MlKSBPcGVyYSAlYWdlbnQlICBbZW5dIiwgLy8gT3BlcmEKICAgICAgICApOwogICAgICAgICRhZ2VudCA9ICR1c2VyYWdlbnRzWyRhZ2VudHR5cGVdOwogICAgICAgICR0aGlzLT5oZWFkZXJzWyJVc2VyLUFnZW50Il0gPSBzdHJfcmVwbGFjZShhcnJheSgiJWFnZW50JSIsIiVvcyUiKSxhcnJheSgkYWdlbnR2ZXJzaW9uLCR3aW5kb3dzdmVyc2lvbiksJGFnZW50KTsKICAgIH0KICAgIAogICAgLy8gdGhpcyBpc24ndCBwcmVzZW50bHkgdXNlZCBhcyBpdCdzIG5vdyBoYW5kbGVkIGlubGluZSBieSB0aGUgcmVxdWVzdCBwYXJzZXIKICAgIGZ1bmN0aW9uIHJlbW92ZV9jaHVua2luZXNzKCkgewogICAgICAgICRyZW1haW5pbmcgPSAkdGhpcy0+cmVzcG9uc2U7CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlID0gIiI7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKCRyZW1haW5pbmcpIHsKICAgICAgICAgICAgJGhleGxlbiA9IHN0cnBvcygkcmVtYWluaW5nLCJcciIpOwogICAgICAgICAgICAkY2h1bmtzaXplID0gc3Vic3RyKCRyZW1haW5pbmcsMCwkaGV4bGVuKTsKICAgICAgICAgICAgJGFyZ3N0YXJ0ID0gc3RycG9zKCRjaHVua3NpemUsJzsnKTsKICAgICAgICAgICAgaWYgKCRhcmdzdGFydCE9PWZhbHNlKSAkY2h1bmtzaXplID0gc3Vic3RyKCRjaHVua3NpemUsMCwkYXJnc3RhcnQpOwogICAgICAgICAgICAkY2h1bmtzaXplID0gKGludCkgQGhleGRlYygkY2h1bmtzaXplKTsKCiAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZSAuPSBzdWJzdHIoJHJlbWFpbmluZywkaGV4bGVuKzIsJGNodW5rc2l6ZSk7CiAgICAgICAgICAgICRyZW1haW5pbmcgPSBzdWJzdHIoJHJlbWFpbmluZywkaGV4bGVuKzIrJGNodW5rc2l6ZSsyKTsKCiAgICAgICAgICAgIGlmICghJGNodW5rc2l6ZSkgewogICAgICAgICAgICAgICAgLy8gZWl0aGVyIHdlJ3JlIGRvbmUsIG9yIHNvbWV0aGluZydzIGJvcmtlZC4uLiBleGl0CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2UgLj0gJHJlbWFpbmluZzsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gKGludGVybmFsKSBzdG9yZSBhIHBhZ2UgaW4gdGhlIGNhY2hlCiAgICBmdW5jdGlvbiBfY2FjaGVfc3RvcmUoJHRva2VuLCR1cmwpIHsKCiAgICAgICAgaWYgKCR0aGlzLT5jYWNoaW5nX2ludGVsbGlnZW50KSB7CiAgICAgICAgICAgICR1cmxpbmZvID0gcGFyc2VfdXJsKCR1cmwpOwogICAgICAgICAgICBpZiAoJHRoaXMtPm1ldGhvZD09J1BPU1QnKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0RFQlVHLCJQT1NUIHJlcXVlc3Q7IG5vdCBjYWNoaW5nIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybGVuKCR1cmxpbmZvWydxdWVyeSddKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiUmVxdWVzdCB1c2VkIHF1ZXJ5IHN0cmluZzsgbm90IGNhY2hpbmciKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfREVCVUcsIlJlcXVlc3QgYXBwZWFycyB0byBiZSBzdGF0aWMgYW5kIGNhY2hlYWJsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdmFsdWVzID0gYXJyYXkoCiAgICAgICAgICAgICJzdGF0cyI9PiR0aGlzLT5zdGF0cywKICAgICAgICAgICAgInJlc3VsdF9jb2RlIj0+JHRoaXMtPnJlc3VsdF9jb2RlLAogICAgICAgICAgICAicmVzdWx0X3RleHQiPT4kdGhpcy0+cmVzdWx0X3RleHQsCiAgICAgICAgICAgICJ2ZXJzaW9uIj0+JHRoaXMtPnZlcnNpb24sCiAgICAgICAgICAgICJyZXNwb25zZSI9PiR0aGlzLT5yZXNwb25zZSwKICAgICAgICAgICAgInJlc3BvbnNlX2hlYWRlcnMiPT4kdGhpcy0+cmVzcG9uc2VfaGVhZGVycywKICAgICAgICAgICAgInJlc3BvbnNlX2Nvb2tpZXMiPT4kdGhpcy0+cmVzcG9uc2VfY29va2llcywKICAgICAgICAgICAgInJhd19yZXNwb25zZSI9PiR0aGlzLT5yYXdfcmVzcG9uc2UsCiAgICAgICAgKTsKICAgICAgICAkdmFsdWVzID0gc2VyaWFsaXplKCR2YWx1ZXMpOwoKICAgICAgICAkY2FjaGVfZGlyID0gJHRoaXMtPmNhY2hlX3BhdGg7CiAgICAgICAgaWYgKHN1YnN0cigkY2FjaGVfZGlyLC0xKSE9Jy8nKSAkY2FjaGVfZGlyIC49ICcvJzsKICAgICAgICAKICAgICAgICBpZiAoJHRoaXMtPmNhY2hpbmdfaGlnaHZvbHVtZSkgewogICAgICAgICAgICAkY2FjaGVfZGlyIC49IHN1YnN0cigkdG9rZW4sMCwyKSAuICcvJzsKICAgICAgICAgICAgaWYgKCFpc19kaXIoJGNhY2hlX2RpcikpIEBta2RpcigkY2FjaGVfZGlyKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGZpbGVuYW1lID0gJGNhY2hlX2Rpci4kdG9rZW4uJy50bXAnOwoKICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGVuYW1lLCJ3Iik7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiVW5hYmxlIHRvIGNyZWF0ZSBjYWNoZSBmaWxlIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZndyaXRlKCRmcCwkdmFsdWVzKTsKICAgICAgICBmY2xvc2UoJGZwKTsKCiAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiSFRUUCByZXNwb25zZSBzdG9yZWQgdG8gY2FjaGUiKTsKICAgIH0KICAgIAogICAgLy8gKGludGVybmFsKSBmZXRjaCBhIHBhZ2UgZnJvbSB0aGUgY2FjaGUKICAgIGZ1bmN0aW9uIF9jYWNoZV9mZXRjaCgkdG9rZW4pIHsKICAgICAgICAkdGhpcy0+Y2FjaGVfaGl0ID0gZmFsc2U7CiAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiQ2hlY2tpbmcgZm9yIGNhY2hlZCBwYWdlIHZhbHVlIik7CgogICAgICAgICRjYWNoZV9kaXIgPSAkdGhpcy0+Y2FjaGVfcGF0aDsKICAgICAgICBpZiAoc3Vic3RyKCRjYWNoZV9kaXIsLTEpIT0nLycpICRjYWNoZV9kaXIgLj0gJy8nOwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+Y2FjaGluZ19oaWdodm9sdW1lKSAkY2FjaGVfZGlyIC49IHN1YnN0cigkdG9rZW4sMCwyKSAuICcvJzsKICAgICAgICAKICAgICAgICAkZmlsZW5hbWUgPSAkY2FjaGVfZGlyLiR0b2tlbi4nLnRtcCc7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkZmlsZW5hbWUpKSB7CiAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfREVCVUcsIlBhZ2Ugbm90IGF2YWlsYWJsZSBpbiBjYWNoZSIpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aW1lKCktZmlsZW10aW1lKCRmaWxlbmFtZSk+JHRoaXMtPmNhY2hpbmcpIHsKICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiUGFnZSBpbiBjYWNoZSBpcyBleHBpcmVkIik7CiAgICAgICAgICAgIEB1bmxpbmsoJGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJHZhbHVlcyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSkpIHsKICAgICAgICAgICAgJHZhbHVlcyA9IHVuc2VyaWFsaXplKCR2YWx1ZXMpOwogICAgICAgICAgICBpZiAoISR2YWx1ZXMpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfREVCVUcsIkludmFsaWQgY2FjaGUgY29udGVudHMiKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPnN0YXRzID0gJHZhbHVlc1sic3RhdHMiXTsKICAgICAgICAgICAgJHRoaXMtPnJlc3VsdF9jb2RlID0gJHZhbHVlc1sicmVzdWx0X2NvZGUiXTsKICAgICAgICAgICAgJHRoaXMtPnJlc3VsdF90ZXh0ID0gJHZhbHVlc1sicmVzdWx0X3RleHQiXTsKICAgICAgICAgICAgJHRoaXMtPnZlcnNpb24gPSAkdmFsdWVzWyJ2ZXJzaW9uIl07CiAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZSA9ICR2YWx1ZXNbInJlc3BvbnNlIl07CiAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gJHZhbHVlc1sicmVzcG9uc2VfaGVhZGVycyJdOwogICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfY29va2llcyA9ICR2YWx1ZXNbInJlc3BvbnNlX2Nvb2tpZXMiXTsKICAgICAgICAgICAgJHRoaXMtPnJhd19yZXNwb25zZSA9ICR2YWx1ZXNbInJhd19yZXNwb25zZSJdOwogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiUGFnZSBsb2FkZWQgZnJvbSBjYWNoZSIpOwogICAgICAgICAgICAkdGhpcy0+Y2FjaGVfaGl0ID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiRXJyb3IgcmVhZGluZyBjYWNoZSBmaWxlIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHBhcmVudF9wYXRoKCRwYXRoKSB7CiAgICAgICAgaWYgKHN1YnN0cigkcGF0aCwwLDEpPT0nLycpICRwYXRoID0gc3Vic3RyKCRwYXRoLDEpOwogICAgICAgIGlmIChzdWJzdHIoJHBhdGgsLTEpPT0nLycpICRwYXRoID0gc3Vic3RyKCRwYXRoLDAsc3RybGVuKCRwYXRoKS0xKTsKICAgICAgICAkcGF0aCA9IGV4cGxvZGUoJy8nLCRwYXRoKTsKICAgICAgICBhcnJheV9wb3AoJHBhdGgpOwogICAgICAgIHJldHVybiBjb3VudCgkcGF0aCkgPyAoJy8nIC4gaW1wbG9kZSgnLycsJHBhdGgpKSA6ICcnOwogICAgfQogICAgCiAgICAvLyAkY29va2llcyBzaG91bGQgYmUgYW4gYXJyYXkgaW4gb25lIG9mIHR3byBmb3JtYXRzLgogICAgLy8KICAgIC8vIEVpdGhlcjogJGNvb2tpZXNbICdjb29raWVuYW1lJyBdID0gYXJyYXkgKAogICAgLy8gICAgICAgICcvcGF0aC8nPT5hcnJheSgKICAgIC8vICAgICAgICAgICAgJ2V4cGlyZXMnPT50aW1lKCksCiAgICAvLyAgICAgICAgICAgICdkb21haW4nPT4neW91cmRvbWFpbi5jb20nLAogICAgLy8gICAgICAgICAgICAndmFsdWUnPT4nY29va2lldmFsdWUnCiAgICAvLyAgICAgICAgKQogICAgLy8gKTsKICAgIC8vCiAgICAvLyBPciwgYSBtb3JlIHNpbXBsaWZpZWQgZm9ybWF0OgogICAgLy8gICAgJGNvb2tpZXNbICdjb29raWVuYW1lJyBdID0gJ3ZhbHVlJzsKICAgIC8vCiAgICAvLyBUaGUgZm9ybWVyIGZvcm1hdCB3aWxsIGF1dG9tYXRpY2FsbHkgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBhdGgsIGRvbWFpbiwKICAgIC8vIGFuZCBleHBpcmF0aW9uIHZhbHVlcyBtYXRjaCB0aGUgSFRUUCByZXF1ZXN0LCBhbmQgd2lsbCBvbmx5IHNlbmQgdGhlIGNvb2tpZSBpZgogICAgLy8gdGhleSBkbyBtYXRjaC4gIFRoZSBsYXR0ZXIgd2lsbCBmb3JjZSB0aGUgY29va2llIHRvIGJlIHNldCBmb3IgdGhlIEhUVFAgcmVxdWVzdAogICAgLy8gdW5jb25kaXRpb25hbGx5LgogICAgLy8gICAgIAogICAgZnVuY3Rpb24gcmVzcG9uc2VfdG9fcmVxdWVzdF9jb29raWVzKCRjb29raWVzLCR1cmxpbmZvKSB7CiAgICAgICAgCiAgICAgICAgLy8gY2hlY2sgZm9yIHNpbXBsaWZpZWQgY29va2llIGZvcm1hdCAobmFtZT12YWx1ZSkKICAgICAgICAkY29va2lla2V5cyA9IGFycmF5X2tleXMoJGNvb2tpZXMpOwogICAgICAgIGlmICghY291bnQoJGNvb2tpZWtleXMpKSByZXR1cm47CiAgICAgICAgCiAgICAgICAgJHRlc3RrZXkgPSBhcnJheV9wb3AoJGNvb2tpZWtleXMpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGNvb2tpZXNbICR0ZXN0a2V5IF0pKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRjb29raWVzIGFzICRrPT4kdikgJHRoaXMtPnJlcXVlc3RfY29va2llc1ska10gPSAkdjsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBtdXN0IG5vdCBiZSBzaW1wbGlmaWVkIGZvcm1hdCwgc28gcGFyc2UgYXMgY29tcGxleCBmb3JtYXQ6CiAgICAgICAgZm9yZWFjaCAoJGNvb2tpZXMgYXMgJG5hbWU9PiRwYXRocykgewogICAgICAgICAgICBmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGg9PiR2YWx1ZXMpIHsKICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY29va2llIGlzbid0IGV4cGlyZWQKICAgICAgICAgICAgICAgIGlmICggaXNzZXQoJHZhbHVlc1snZXhwaXJlcyddKSAmJiAoJHZhbHVlc1snZXhwaXJlcyddPHRpbWUoKSkgKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGNvb2tpZWhvc3QgPSAkdmFsdWVzWydkb21haW4nXTsKICAgICAgICAgICAgICAgICRyZXF1ZXN0aG9zdCA9ICR1cmxpbmZvWydob3N0J107CiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNvb2tpZSBpcyB2YWxpZCBmb3IgdGhpcyBob3N0CiAgICAgICAgICAgICAgICAkZG9tYWluX21hdGNoID0gKAogICAgICAgICAgICAgICAgICAgICgkcmVxdWVzdGhvc3Q9PSRjb29raWVob3N0KSB8fAogICAgICAgICAgICAgICAgICAgIChzdWJzdHIoJHJlcXVlc3Rob3N0LC0oc3RybGVuKCRjb29raWVob3N0KSsxKSk9PScuJy4kY29va2llaG9zdCkKICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNvb2tpZSBpcyB2YWxpZCBmb3IgdGhpcyBwYXRoCiAgICAgICAgICAgICAgICAkY29va2llcGF0aCA9ICRwYXRoOyBpZiAoc3Vic3RyKCRjb29raWVwYXRoLC0xKSE9Jy8nKSAkY29va2llcGF0aCAuPSAnLyc7CiAgICAgICAgICAgICAgICAkcmVxdWVzdHBhdGggPSAkdXJsaW5mb1sncGF0aCddOyBpZiAoc3Vic3RyKCRyZXF1ZXN0cGF0aCwtMSkhPScvJykgJHJlcXVlc3RwYXRoIC49ICcvJzsKICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJHJlcXVlc3RwYXRoLDAsc3RybGVuKCRjb29raWVwYXRoKSkhPSRjb29raWVwYXRoKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHRoaXMtPnJlcXVlc3RfY29va2llc1skbmFtZV0gPSAkdmFsdWVzWyd2YWx1ZSddOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAgICAgICAgICAgICAgICAgICAgCiAgICAKICAgIC8vIEV4ZWN1dGUgdGhlIHJlcXVlc3QgZm9yIGEgcGFydGljdWxhciBVUkwsIGFuZCB0cmFuc3BhcmVudGx5IGZvbGxvdwogICAgLy8gSFRUUCByZWRpcmVjdHMgaWYgZW5hYmxlZC4gIElmICRjb29raWVzIGlzIHNwZWNpZmllZCwgaXQgaXMgYXNzdW1lZAogICAgLy8gdG8gYmUgYW4gYXJyYXkgcmVjZWl2ZWQgZnJvbSAkdGhpcy0+cmVzcG9uc2VfY29va2llcyBhbmQgd2lsbCBiZQogICAgLy8gcHJvY2Vzc2VkIHRvIGRldGVybWluZSB3aGljaCBjb29raWVzIGFyZSB2YWxpZCBmb3IgdGhpcyBob3N0L1VSTC4KICAgIGZ1bmN0aW9uIF9leGVjdXRlX3JlcXVlc3QoJHVybCwkY29va2llcyA9IGZhbHNlKSB7CiAgICAgICAgLy8gdmFsaWQgY29kZXMgZm9yIHdoaWNoIHdlIHRyYW5zcGFyZW50bHkgZm9sbG93IGEgcmVkaXJlY3QKICAgICAgICAkcmVkaXJlY3RfY29kZXMgPSBhcnJheSgzMDEsMzAyLDMwMywzMDcpOwogICAgICAgIC8vIHZhbGlkIG1ldGhvZHMgZm9yIHdoaWNoIHdlIHRyYW5zcGFyZW50bHkgZm9sbG93IGEgcmVkaXJlY3QKICAgICAgICAkcmVkaXJlY3RfbWV0aG9kcyA9IGFycmF5KCdHRVQnLCdIRUFEJyk7CgogICAgICAgICRyZXF1ZXN0X3Jlc3VsdCA9IGZhbHNlOwogICAgICAgIAogICAgICAgICR0aGlzLT5mb2xsb3dlZF9yZWRpcmVjdCA9IGZhbHNlOwogICAgICAgICR0aGlzLT5yZXNwb25zZV9jb29raWVzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y29va2llX2hlYWRlcnMgPSAnJzsKCiAgICAgICAgJHByZXZpb3VzX3JlZGlyZWN0cyA9IGFycmF5KCk7CiAgICAgICAgZG8gewogICAgICAgICAgICAvLyBzZW5kIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICRyZXF1ZXN0X3Jlc3VsdCA9ICR0aGlzLT5fc2VuZF9yZXF1ZXN0KCR1cmwsJGNvb2tpZXMpOwogICAgICAgICAgICAkbGFzdHVybCA9ICR1cmw7CiAgICAgICAgICAgICR1cmwgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIHNlZSBpZiBhIHJlZGlyZWN0IGNvZGUgd2FzIHJlY2VpdmVkCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmZvbGxvd19yZWRpcmVjdHMpOy8vIGV4aXQ7CiAgICAgICAgICAgICR0aGlzLT5mb2xsb3dfcmVkaXJlY3RzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5mb2xsb3dfcmVkaXJlY3RzICYmIGluX2FycmF5KCR0aGlzLT5yZXN1bHRfY29kZSwkcmVkaXJlY3RfY29kZXMpKSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVkaXJlY3Qgb24gYSBjb2RlIDMwMyBvciBpZiB0aGUgbWV0aG9kIHdhcyBHRVQvSEVBRAogICAgICAgICAgICAgICAgaWYgKCAoJHRoaXMtPnJlc3VsdF9jb2RlPT0zMDMpIHx8IGluX2FycmF5KCR0aGlzLT5tZXRob2QsJHJlZGlyZWN0X21ldGhvZHMpICkgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBPTEQgVVJMIHNvIHRoYXQgd2UgY2FuIGhhbmRsZQogICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIGxpbmtzCiAgICAgICAgICAgICAgICAgICAgJG9sZHVybGluZm8gPSBwYXJzZV91cmwoJGxhc3R1cmwpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICR1cmwgPSAkdGhpcy0+cmVzcG9uc2VfaGVhZGVyc1snTG9jYXRpb24nXTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIG5ldyBVUkwsIGFuZCBmaWxsIGluIGFueSBibGFua3MKICAgICAgICAgICAgICAgICAgICAvLyB1c2luZyB2YWx1ZXMgZnJvbSB0aGUgb2xkIFVSTAogICAgICAgICAgICAgICAgICAgICR1cmxpbmZvID0gcGFyc2VfdXJsKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRvbGR1cmxpbmZvIGFzICRrPT4kdikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR1cmxpbmZvWyRrXSkgJHVybGluZm9bJGtdID0gJHY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBhYnNvbHV0ZSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkdXJsaW5mb1sncGF0aCddLDAsMSkhPScvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZXVybCA9ICRvbGR1cmxpbmZvWydwYXRoJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJGJhc2V1cmwsLTEpIT0nLycpICRiYXNldXJsID0gJHRoaXMtPnBhcmVudF9wYXRoKCR1cmwpIC4gJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAkdXJsaW5mb1sncGF0aCddID0gJGJhc2V1cmwgLiAkdXJsaW5mb1sncGF0aCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHRoZSBVUkwKICAgICAgICAgICAgICAgICAgICAkdXJsID0gJHRoaXMtPnJlYnVpbGRfdXJsKCR1cmxpbmZvKTsKCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1ldGhvZCA9ICJHRVQiOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5wb3N0X2RhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0lORk8sJ1JlZGlyZWN0ZWQgdG8gJy4kdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCAkdXJsICYmIHN0cmxlbigkdXJsKSApIHsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRwcmV2aW91c19yZWRpcmVjdHNbJHVybF0pKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIkluZmluaXRlIHJlZGlyZWN0aW9uIGxvb3AiOwogICAgICAgICAgICAgICAgICAgICRyZXF1ZXN0X3Jlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCBpc19udW1lcmljKCR0aGlzLT5mb2xsb3dfcmVkaXJlY3RzKSAmJiAoY291bnQoJHByZXZpb3VzX3JlZGlyZWN0cyk+JHRoaXMtPmZvbGxvd19yZWRpcmVjdHMpICkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJFeGNlZWRlZCByZWRpcmVjdGlvbiBsaW1pdCI7CiAgICAgICAgICAgICAgICAgICAgJHJlcXVlc3RfcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHByZXZpb3VzX3JlZGlyZWN0c1skdXJsXSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSB3aGlsZSAoJHVybCAmJiBzdHJsZW4oJHVybCkpOwoKICAgICAgICAvLyBjbGVhciBoZWFkZXJzIHRoYXQgc2hvdWxkbid0IHBlcnNpc3QgYWNyb3NzIG11bHRpcGxlIHJlcXVlc3RzCiAgICAgICAgJHBlcl9yZXF1ZXN0X2hlYWRlcnMgPSBhcnJheSgnSG9zdCcsJ0NvbnRlbnQtTGVuZ3RoJyk7CiAgICAgICAgZm9yZWFjaCAoJHBlcl9yZXF1ZXN0X2hlYWRlcnMgYXMgJGs9PiR2KSB1bnNldCgkdGhpcy0+aGVhZGVyc1skdl0pOwogICAgICAgIAogICAgICAgIGlmIChjb3VudCgkcHJldmlvdXNfcmVkaXJlY3RzKT4xKSAkdGhpcy0+Zm9sbG93ZWRfcmVkaXJlY3QgPSBhcnJheV9rZXlzKCRwcmV2aW91c19yZWRpcmVjdHMpOwogICAgICAgIAogICAgICAgIHJldHVybiAkcmVxdWVzdF9yZXN1bHQ7CiAgICB9CiAgICAKICAgIC8vIHByaXZhdGUgLSBzZW5kcyBhbiBIVFRQIHJlcXVlc3QgdG8gJHVybAogICAgZnVuY3Rpb24gX3NlbmRfcmVxdWVzdCgkdXJsLCRjb29raWVzID0gZmFsc2UpIHsKICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0lORk8sIkluaXRpYXRpbmcgeyR0aGlzLT5tZXRob2R9IHJlcXVlc3QgZm9yICR1cmwiKTsKICAgICAgICBpZiAoJHRoaXMtPmNhY2hpbmcpIHsKICAgICAgICAgICAgJGNhY2hldG9rZW4gPSBtZDUoJHVybC4nfCcuJHRoaXMtPnBvc3RfZGF0YSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+X2NhY2hlX2ZldGNoKCRjYWNoZXRva2VuKSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aW1lX3JlcXVlc3Rfc3RhcnQgPSAkdGhpcy0+Z2V0bWljcm90aW1lKCk7CiAgICAgICAgCiAgICAgICAgJHVybGRhdGEgPSBwYXJzZV91cmwoJHVybCk7CiAgICAgICAgJHRoaXMtPnVybGRhdGEgPSAmJHVybGRhdGE7CiAgICAgICAgJGh0dHBfaG9zdCA9ICR1cmxkYXRhWydob3N0J10gLiAoaXNzZXQoJHVybGRhdGFbJ3BvcnQnXSkgPyAnOicuJHVybGRhdGFbJ3BvcnQnXSA6ICcnKTsKICAgICAgICAKICAgICAgICBpZiAoIWlzc2V0KCR1cmxkYXRhWyJwb3J0Il0pIHx8ICEkdXJsZGF0YVsicG9ydCJdKSAkdXJsZGF0YVsicG9ydCJdID0gKCR1cmxkYXRhWyJzY2hlbWUiXT09Imh0dHBzIikgPyA0NDMgOiA4MDsKICAgICAgICBpZiAoIWlzc2V0KCR1cmxkYXRhWyJwYXRoIl0pIHx8ICEkdXJsZGF0YVsicGF0aCJdKSAkdXJsZGF0YVsicGF0aCJdID0gJy8nOwogICAgICAgIAogICAgICAgIGlmICghZW1wdHkoJHVybGRhdGFbJ3VzZXInXSkpICR0aGlzLT5hdXRoX3VzZXJuYW1lID0gJHVybGRhdGFbJ3VzZXInXTsKICAgICAgICBpZiAoIWVtcHR5KCR1cmxkYXRhWydwYXNzJ10pKSAkdGhpcy0+YXV0aF9wYXNzd29yZCA9ICR1cmxkYXRhWydwYXNzJ107CiAgICAgICAgCiAgICAgICAgLy9lY2hvICJTZW5kaW5nIEhUVFAveyR0aGlzLT52ZXJzaW9ufSB7JHRoaXMtPm1ldGhvZH0gcmVxdWVzdCBmb3IgIi4kdXJsZGF0YVsiaG9zdCJdLiI6Ii4kdXJsZGF0YVsicG9ydCJdLiIgcGFnZSAiLiR1cmxkYXRhWyJwYXRoIl0uIjxicj4iOwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+dmVyc2lvbj4iMS4wIikgJHRoaXMtPmhlYWRlcnNbIkhvc3QiXSA9ICRodHRwX2hvc3Q7CiAgICAgICAgaWYgKCR0aGlzLT5tZXRob2Q9PSJQT1NUIikgewogICAgICAgICAgICAkdGhpcy0+aGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSA9IHN0cmxlbigkdGhpcy0+cG9zdF9kYXRhKTsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+aGVhZGVyc1siQ29udGVudC1UeXBlIl0pKSAkdGhpcy0+aGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCAhZW1wdHkoJHRoaXMtPmF1dGhfdXNlcm5hbWUpIHx8ICFlbXB0eSgkdGhpcy0+YXV0aF9wYXNzd29yZCkgKSB7CiAgICAgICAgICAgICR0aGlzLT5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJy5iYXNlNjRfZW5jb2RlKCR0aGlzLT5hdXRoX3VzZXJuYW1lLic6Jy4kdGhpcy0+YXV0aF9wYXNzd29yZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICggJHRoaXMtPnJhbmdlICkgewogICAgICAgICAgICAkdGhpcy0+aGVhZGVyc1snUmFuZ2UnXSA9ICJieXRlcz0iLiR0aGlzLT5yYW5nZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+aGVhZGVyc1snUmFuZ2UnXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNfYXJyYXkoJGNvb2tpZXMpKSB7CiAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV90b19yZXF1ZXN0X2Nvb2tpZXMoJGNvb2tpZXMsJHVybGRhdGEpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIWVtcHR5KCR1cmxkYXRhWyJxdWVyeSJdKSkgJHVybGRhdGFbInBhdGgiXSAuPSAiPyIuJHVybGRhdGFbInF1ZXJ5Il07CiAgICAgICAgJHJlcXVlc3QgPSAkdGhpcy0+bWV0aG9kLiIgIi4kdXJsZGF0YVsicGF0aCJdLiIgSFRUUC8iLiR0aGlzLT52ZXJzaW9uLiJcclxuIjsKICAgICAgICAkcmVxdWVzdCAuPSAkdGhpcy0+YnVpbGRfaGVhZGVycygpOwogICAgICAgICRyZXF1ZXN0IC49ICR0aGlzLT5wb3N0X2RhdGE7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPnJlc3BvbnNlID0gIiI7CiAgICAgICAgCiAgICAgICAgLy8gY2xlYXIgaGVhZGVycyB0aGF0IHNob3VsZG4ndCBwZXJzaXN0IGFjcm9zcyBtdWx0aXBsZSByZXF1ZXN0cwogICAgICAgIC8vICh3ZSBjYW4gZG8gdGhpcyBoZXJlIGFzIHdlJ3ZlIGFscmVhZHkgYnVpbHQgdGhlIHJlcXVlc3QsIGluY2x1ZGluZyBoZWFkZXJzLCBhYm92ZSkKICAgICAgICAkcGVyX3JlcXVlc3RfaGVhZGVycyA9IGFycmF5KCdIb3N0JywnQ29udGVudC1MZW5ndGgnKTsKICAgICAgICBmb3JlYWNoICgkcGVyX3JlcXVlc3RfaGVhZGVycyBhcyAkaz0+JHYpIHVuc2V0KCR0aGlzLT5oZWFkZXJzWyR2XSk7CiAgICAgICAgCiAgICAgICAgLy8gTmF0aXZlIFNTTCBzdXBwb3J0IHJlcXVpcmVzIHRoZSBPcGVuU1NMIGV4dGVuc2lvbiwgYW5kIHdhcyBpbnRyb2R1Y2VkIGluIFBIUCA0LjMuMAogICAgICAgICRwaHBfc3NsX3N1cHBvcnQgPSBleHRlbnNpb25fbG9hZGVkKCJvcGVuc3NsIikgJiYgdmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwiNC4zLjAiKT49MDsKICAgICAgICAvL3Zhcl9kdW1wKCRwaHBfc3NsX3N1cHBvcnQpOyBleGl0OwogICAgICAgIAogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBwbGFpbiBIVFRQIHJlcXVlc3QsIG9yIGlmIGl0J3MgYW4gSFRUUFMgcmVxdWVzdCBhbmQgT3BlblNTTCBzdXBwb3J0IGlzIGF2YWlsYWJsZSwKICAgICAgICAvLyBuYXRpdmVseSBwZXJmb3JtIHRoZSBIVFRQIHJlcXVlc3QKICAgICAgICBpZiAoICggKCR1cmxkYXRhWyJzY2hlbWUiXT09Imh0dHAiKSB8fCAoJHBocF9zc2xfc3VwcG9ydCAmJiAoJHVybGRhdGFbInNjaGVtZSJdPT0iaHR0cHMiKSkgKSAmJiAoISR0aGlzLT5mb3JjZV9jdXJsKSApIHsKICAgICAgICAgICAgJGN1cmxfbW9kZSA9IGZhbHNlOwoKICAgICAgICAgICAgJGhvc3RuYW1lID0gJHRoaXMtPmNvbm5lY3RfaXAgPyAkdGhpcy0+Y29ubmVjdF9pcCA6ICR1cmxkYXRhWydob3N0J107CiAgICAgICAgICAgIGlmICgkdXJsZGF0YVsic2NoZW1lIl09PSJodHRwcyIpICRob3N0bmFtZSA9ICdzc2w6Ly8nLiRob3N0bmFtZTsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aW1lX2Nvbm5lY3Rfc3RhcnQgPSAkdGhpcy0+Z2V0bWljcm90aW1lKCk7CgogICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0lORk8sJ09wZW5pbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gJy4kaG9zdG5hbWUuJyBwb3J0ICcuJHVybGRhdGFbJ3BvcnQnXSk7CgogICAgICAgICAgICAkdGhpcy0+ZXhwZWN0ZWRfYnl0ZXMgPSAtMTsKICAgICAgICAgICAgJHRoaXMtPnJlY2VpdmVkX2J5dGVzID0gMDsKICAgICAgICAgICAgCiAgICAgICAgICAgICRmcCA9IEBmc29ja29wZW4gKCRob3N0bmFtZSwkdXJsZGF0YVsicG9ydCJdLCRlcnJubywkZXJyc3RyLCR0aGlzLT5jb25uZWN0X3RpbWVvdXQpOwogICAgICAgICAgICAkdGltZV9jb25uZWN0ZWQgPSAkdGhpcy0+Z2V0bWljcm90aW1lKCk7CiAgICAgICAgICAgICRjb25uZWN0X3RpbWUgPSAkdGltZV9jb25uZWN0ZWQgLSAkdGltZV9jb25uZWN0X3N0YXJ0OwogICAgICAgICAgICBpZiAoJGZwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnN0cmVhbV90aW1lb3V0KSBzdHJlYW1fc2V0X3RpbWVvdXQoJGZwLCR0aGlzLT5zdHJlYW1fdGltZW91dCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0lORk8sIkNvbm5lY3RlZDsgc2VuZGluZyByZXF1ZXN0Iik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfREVCVUcsJHJlcXVlc3QpOwogICAgICAgICAgICAgICAgZnB1dHMgKCRmcCwgJHJlcXVlc3QpOwogICAgICAgICAgICAgICAgJHRoaXMtPnJhd19yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRyZXF1ZXN0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5zdHJlYW1fdGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICRtZXRhID0gc29ja2V0X2dldF9zdGF0dXMoJGZwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJG1ldGFbJ3RpbWVkX291dCddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJFeGNlZWRlZCBzb2NrZXQgd3JpdGUgdGltZW91dCBvZiAiLiR0aGlzLT5zdHJlYW1fdGltZW91dC4iIHNlY29uZHMiOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0VSUk9SLCR0aGlzLT5lcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfSU5GTywiUmVxdWVzdCBzZW50OyBhd2FpdGluZyByZXBseSIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkaGVhZGVyc19yZWNlaXZlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJGRhdGFfbGVuZ3RoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAkY2h1bmtlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJGl0ZXJhdGlvbnMgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRmcCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGRhdGFfbGVuZ3RoPjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSBmcmVhZCgkZnAsJGRhdGFfbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiW0RMXSBHb3QgYSBsaW5lOiBbeyRsaW5lfV0gIiAuIGdldHR5cGUoJGxpbmUpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbGluZSE9PWZhbHNlKSAkZGF0YV9sZW5ndGggLT0gc3RybGVuKCRsaW5lKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkbGluZSA9IEBmZ2V0cygkZnAsMTAyNDApOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0RFQlVHLCJbTkRMXSBHb3QgYSBsaW5lOiBbeyRsaW5lfV0gIiAuIGdldHR5cGUoJGxpbmUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCRjaHVua2VkKSAmJiAoJGxpbmUhPT1mYWxzZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGluZSA9IHRyaW0oJGxpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJsZW4oJGxpbmUpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgkZGF0YV9sZW5ndGgsKSA9IGV4cGxvZGUoJzsnLCRsaW5lLDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGFfbGVuZ3RoID0gKGludCkgaGV4ZGVjKHRyaW0oJGRhdGFfbGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGF0YV9sZW5ndGg9PTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0RFQlVHLCJEb25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIGNodW5rZWQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiQ2h1bmsgbGVuZ3RoICRkYXRhX2xlbmd0aCAoMHgkbGluZSkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICgkbGluZT09PWZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhID0gc29ja2V0X2dldF9zdGF0dXMoJGZwKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtZXRhWyd0aW1lZF9vdXQnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5zdHJlYW1fdGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJFeGNlZWRlZCBzb2NrZXQgcmVhZCB0aW1lb3V0IG9mICIuJHRoaXMtPnN0cmVhbV90aW1lb3V0LiIgc2Vjb25kcyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJFeGNlZWRlZCBkZWZhdWx0IHNvY2tldCByZWFkIHRpbWVvdXQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9FUlJPUiwkdGhpcy0+ZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9FUlJPUiwnTm8gZGF0YSBidXQgbm90IHRpbWVkIG91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aW1lIGxpbWl0cyBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPm1heF90aW1lPjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5nZXRtaWNyb3RpbWUoKSAtICR0aW1lX3JlcXVlc3Rfc3RhcnQgPiAkdGhpcy0+bWF4X3RpbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJFeGNlZWRlZCBtYXhpbXVtIHRyYW5zZmVyIHRpbWUgb2YgIi4kdGhpcy0+bWF4X3RpbWUuIiBzZWNvbmRzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfRVJST1IsJHRoaXMtPmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2UgLj0gJGxpbmU7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJGl0ZXJhdGlvbnMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoJGhlYWRlcnNfcmVjZWl2ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aW1lX2Nvbm5lY3RlZD4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGltZV9maXJzdGRhdGEgPSAkdGhpcy0+Z2V0bWljcm90aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvY2Vzc190aW1lID0gJHRpbWVfZmlyc3RkYXRhIC0gJHRpbWVfY29ubmVjdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVfY29ubmVjdGVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVjZWl2ZWRfYnl0ZXMgKz0gc3RybGVuKCRsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVyYXRpb25zICUgMjAgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnVwZGF0ZV90cmFuc2Zlcl9jb3VudGVycygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGR1bWJhc3Mgd2Vic2VydmVycyBkb24ndCByZXNwZWN0IENvbm5lY3Rpb246IGNsb3NlIGFuZCBqdXN0CiAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgdGhlIGNvbm5lY3Rpb24gb3Blbiwgc28gd2UgaGF2ZSB0byBiZSBkaWxpZ2VudCBhYm91dAogICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0aW5nIHRoZSBjb250ZW50IGxlbmd0aCBzbyB3ZSBjYW4gZGlzY29ubmVjdCBhdCB0aGUgZW5kIG9mCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAoISRoZWFkZXJzX3JlY2VpdmVkKSAmJiAodHJpbSgkbGluZSk9PSIiKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlcnNfcmVjZWl2ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0RFQlVHLCJHb3QgaGVhZGVyczogeyR0aGlzLT5yZXNwb25zZX0iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXkNvbnRlbnQtTGVuZ3RoOiAoWzAtOV0rKS9pbScsJHRoaXMtPnJlc3BvbnNlLCRtYXRjaGVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGFfbGVuZ3RoID0gKGludCkgJG1hdGNoZXNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0RFQlVHLCJDb250ZW50IGxlbmd0aCBpcyAkZGF0YV9sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RlZF9ieXRlcyA9ICRkYXRhX2xlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT51cGRhdGVfdHJhbnNmZXJfY291bnRlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfREVCVUcsIk5vIGRhdGEgbGVuZ3RoIHNwZWNpZmllZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvXlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkL2ltIiwkdGhpcy0+cmVzcG9uc2UsJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2h1bmtlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0RFQlVHLCJDaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIHJlcXVlc3RlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywiQ1RFIG5vdCByZXF1ZXN0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCIvXlNldC1Db29raWU6ICgoLio/KVw9KC4qPykoPzo7XHMqKC4qKSk/KSQvaW0iLCR0aGlzLT5yZXNwb25zZSwkY29va2llbGlzdCxQUkVHX1NFVF9PUkRFUikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjb29raWVsaXN0IGFzICRrPT4kY29va2llKSAkdGhpcy0+Y29va2llX2hlYWRlcnMgLj0gJGNvb2tpZVswXS4iXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBhdGggZm9yIHdoaWNoIGNvb2tpZXMgd2lsbCBiZSB2YWxpZCBpZiBubyBwYXRoIGlzIHNwZWNpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvb2tpZXBhdGggPSBwcmVnX3JlcGxhY2UoJy9cL3syLH0vJywnJywkdXJsZGF0YVsncGF0aCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJGNvb2tpZXBhdGgsLTEpIT0nLycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29va2llcGF0aCA9IGV4cGxvZGUoJy8nLCRjb29raWVwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGNvb2tpZXBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb29raWVwYXRoID0gaW1wbG9kZSgnLycsJGNvb2tpZXBhdGgpIC4gJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBlYWNoIGNvb2tpZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNvb2tpZWxpc3QgYXMgJGs9PiRjb29raWVkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgsJHJhd2Nvb2tpZSwkbmFtZSwkdmFsdWUsJGF0dHJpYnV0ZWRhdGEpID0gJGNvb2tpZWRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0dHJpYnV0ZWRhdGEgPSBleHBsb2RlKCc7Jyx0cmltKCRhdHRyaWJ1dGVkYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0dHJpYnV0ZXMgPSBhcnJheSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29va2llID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc9PiR2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jhdyc9PnRyaW0oJHJhd2Nvb2tpZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXR0cmlidXRlZGF0YSBhcyAkaz0+JGF0dHJpYnV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCRhdHRybmFtZSwkYXR0cnZhbHVlKSA9IGV4cGxvZGUoJz0nLHRyaW0oJGF0dHJpYnV0ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29va2llWyRhdHRybmFtZV0gPSAkYXR0cnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkY29va2llWydkb21haW4nXSkgfHwgISRjb29raWVbJ2RvbWFpbiddKSAkY29va2llWydkb21haW4nXSA9ICR1cmxkYXRhWydob3N0J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkY29va2llWydwYXRoJ10pIHx8ICEkY29va2llWydwYXRoJ10pICRjb29raWVbJ3BhdGgnXSA9ICRjb29raWVwYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkY29va2llWydleHBpcmVzJ10pICYmICRjb29raWVbJ2V4cGlyZXMnXSkgJGNvb2tpZVsnZXhwaXJlcyddID0gc3RydG90aW1lKCRjb29raWVbJ2V4cGlyZXMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+dmFsaWRhdGVfcmVzcG9uc2VfY29va2llKCRjb29raWUsJHVybGRhdGFbJ2hvc3QnXSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdG9yZSBleHBpcmVkIGNvb2tpZXM7IGlmIG9uZSBleGlzdHMsIHVuc2V0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpc3NldCgkY29va2llWydleHBpcmVzJ10pICYmICgkY29va2llWydleHBpcmVzJ108dGltZSgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPnJlc3BvbnNlX2Nvb2tpZXNbICRuYW1lIF1bICRjb29raWVbJ3BhdGgnXSBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV9jb29raWVzWyAkbmFtZSBdWyAkY29va2llWydwYXRoJ10gXSA9ICRjb29raWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bHRfY2xvc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCIvSFRUUFwvKFswLTlcLl0rKSAoWzAtOV0rKSAoLio/KVtcclxuXS8iLCR0aGlzLT5yZXNwb25zZSwkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRjb2RlcyA9ICRtYXRjaGVzWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3VsdGNvZGVzIGFzICRrPT4kY29kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY29kZSE9MTAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfSU5GTywnSFRUUCByZXN1bHQgY29kZSByZWNlaXZlZDsgY2xvc2luZyBjb25uZWN0aW9uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVzdWx0X2NvZGUgPSAkY29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlc3VsdF90ZXh0ID0gJG1hdGNoZXNbM11bJGtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgkdGhpcy0+cmVzdWx0X2NvZGU9PTIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZlb2YoJGZwKSkgJHRoaXMtPnByb2dyZXNzKEhSUF9ERUJVRywnRU9GIG9uIHNvY2tldCcpOwogICAgICAgICAgICAgICAgQGZjbG9zZSAoJGZwKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHRoaXMtPnVwZGF0ZV90cmFuc2Zlcl9jb3VudGVycygpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHRoaXMtPnJlc3BvbnNlX2Nvb2tpZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHBhdGhzIGFyZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQKICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHNldHRpbmcgcmVzcG9uc2UgY29va2llcwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5yZXNwb25zZV9jb29raWVzIGFzICRuYW1lPT4kcGF0aHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAga3NvcnQoJHRoaXMtPnJlc3BvbnNlX2Nvb2tpZXNbJG5hbWVdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0lORk8sJ1JlcXVlc3QgY29tcGxldGUnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9IHN0cnRvdXBwZXIoJHVybGRhdGFbInNjaGVtZSJdKS4iIGNvbm5lY3Rpb24gdG8gIi4kaG9zdG5hbWUuIiBwb3J0ICIuJHVybGRhdGFbInBvcnQiXS4iIGZhaWxlZCI7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHJvZ3Jlc3MoSFJQX0VSUk9SLCR0aGlzLT5lcnJvcik7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgLy8gcGVyZm9ybSBhbiBIVFRQL0hUVFBTIHJlcXVlc3QgdXNpbmcgQ1VSTAogICAgICAgIH0gZWxzZWlmICggISR0aGlzLT5kaXNhYmxlX2N1cmwgJiYgKCAoJHVybGRhdGFbInNjaGVtZSJdPT0iaHR0cHMiKSB8fCAoJHRoaXMtPmZvcmNlX2N1cmwpICkgKSB7CiAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzcyhIUlBfSU5GTywnUGFzc2luZyBIVFRQIHJlcXVlc3QgZm9yICR1cmwgdG8gQ1VSTCcpOwogICAgICAgICAgICAkY3VybF9tb2RlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCEkdGhpcy0+X2N1cmxfcmVxdWVzdCgkdXJsKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAKICAgICAgICAvLyB1bmtub3duIHByb3RvY29sCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIlVuc3VwcG9ydGVkIHByb3RvY29sOiAiLiR1cmxkYXRhWyJzY2hlbWUiXTsKICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzKEhSUF9FUlJPUiwkdGhpcy0+ZXJyb3IpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aGlzLT5yYXdfcmVzcG9uc2UgPSAkdGhpcy0+cmVzcG9uc2U7CgogICAgICAgICR0b3RhbGxlbmd0aCA9IHN0cmxlbigkdGhpcy0+cmVzcG9uc2UpOwogICAgICAgIAogICAgICAgIGRvIHsKICAgICAgICAgICAgJGhlYWRlcmxlbmd0aCA9IHN0cnBvcygkdGhpcy0+cmVzcG9uc2UsIlxyXG5cclxuIik7CgogICAgICAgICAgICAkcmVzcG9uc2VfaGVhZGVycyA9IGV4cGxvZGUoIlxyXG4iLHN1YnN0cigkdGhpcy0+cmVzcG9uc2UsMCwkaGVhZGVybGVuZ3RoKSk7CiAgICAgICAgICAgICRodHRwX3N0YXR1cyA9IHRyaW0oYXJyYXlfc2hpZnQoJHJlc3BvbnNlX2hlYWRlcnMpKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3BvbnNlX2hlYWRlcnMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgICAgIGxpc3QoJGssJHYpID0gZXhwbG9kZSgiOiIsJGxpbmUsMik7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfaGVhZGVyc1t0cmltKCRrKV0gPSB0cmltKCR2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2UgPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlLCRoZWFkZXJsZW5ndGgrNCk7CiAgICAKICAgICAgICAgICAgLyogLy8gSGFuZGxlZCBpbi10cmFuc2ZlciBub3cKICAgICAgICAgICAgaWYgKCgkdGhpcy0+cmVzcG9uc2VfaGVhZGVyc1snVHJhbnNmZXItRW5jb2RpbmcnXT09ImNodW5rZWQiKSAmJiAoISRjdXJsX21vZGUpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVtb3ZlX2NodW5raW5lc3MoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIAogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goIi9eSFRUUFwvKFswLTlcLl0rKSAoWzAtOV0rKSAoLio/KSQvIiwkaHR0cF9zdGF0dXMsJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICAgICAkbWF0Y2hlcyA9IGFycmF5KCIiLCR0aGlzLT52ZXJzaW9uLDAsIkhUVFAgcmVxdWVzdCBlcnJvciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3QgKCwkcmVzcG9uc2VfdmVyc2lvbiwkdGhpcy0+cmVzdWx0X2NvZGUsJHRoaXMtPnJlc3VsdF90ZXh0KSA9ICRtYXRjaGVzOwoKICAgICAgICAgICAgLy8gc2tpcCBIVFRQIHJlc3VsdCBjb2RlIDEwMCAoQ29udGludWUpIHJlc3BvbnNlcwogICAgICAgIH0gd2hpbGUgKCgkdGhpcy0+cmVzdWx0X2NvZGU9PTEwMCkgJiYgKCRoZWFkZXJsZW5ndGgpKTsKICAgICAgICAKICAgICAgICAvLyByZWNvcmQgc29tZSBzdGF0aXN0aWNzLCByb3VnaGx5IGNvbXBhdGlibGUgd2l0aCBDVVJMJ3MgY3VybF9nZXRpbmZvKCkKICAgICAgICBpZiAoISRjdXJsX21vZGUpIHsKICAgICAgICAgICAgJHRvdGFsX3RpbWUgPSAkdGhpcy0+Z2V0bWljcm90aW1lKCkgLSAkdGltZV9yZXF1ZXN0X3N0YXJ0OwogICAgICAgICAgICAkdHJhbnNmZXJfdGltZSA9ICR0b3RhbF90aW1lIC0gJGNvbm5lY3RfdGltZTsKICAgICAgICAgICAgJHRoaXMtPnN0YXRzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAidG90YWxfdGltZSI9PiR0b3RhbF90aW1lLAogICAgICAgICAgICAgICAgImNvbm5lY3RfdGltZSI9PiRjb25uZWN0X3RpbWUsICAgIC8vIHRpbWUgYmV0d2VlbiBjb25uZWN0aW9uIHJlcXVlc3QgYW5kIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKICAgICAgICAgICAgICAgICJwcm9jZXNzX3RpbWUiPT4kcHJvY2Vzc190aW1lLCAgICAvLyB0aW1lIGJldHdlZW4gSFRUUCByZXF1ZXN0IGFuZCBmaXJzdCBkYXRhIChub24taGVhZGVycykgcmVjZWl2ZWQKICAgICAgICAgICAgICAgICJ1cmwiPT4kdXJsLAogICAgICAgICAgICAgICAgImNvbnRlbnRfdHlwZSI9PiR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWyJDb250ZW50LVR5cGUiXSwKICAgICAgICAgICAgICAgICJodHRwX2NvZGUiPT4kdGhpcy0+cmVzdWx0X2NvZGUsCiAgICAgICAgICAgICAgICAiaGVhZGVyX3NpemUiPT4kaGVhZGVybGVuZ3RoLAogICAgICAgICAgICAgICAgInJlcXVlc3Rfc2l6ZSI9PiR0b3RhbGxlbmd0aCwKICAgICAgICAgICAgICAgICJmaWxldGltZSI9PnN0cnRvdGltZSgkdGhpcy0+cmVzcG9uc2VfaGVhZGVyc1siRGF0ZSJdKSwKICAgICAgICAgICAgICAgICJwcmV0cmFuc2Zlcl90aW1lIj0+JGNvbm5lY3RfdGltZSwKICAgICAgICAgICAgICAgICJzaXplX2Rvd25sb2FkIj0+JHRvdGFsbGVuZ3RoLAogICAgICAgICAgICAgICAgInNwZWVkX2Rvd25sb2FkIj0+JHRyYW5zZmVyX3RpbWUgPiAwID8gcm91bmQoJHRvdGFsbGVuZ3RoIC8gJHRyYW5zZmVyX3RpbWUpIDogMCwKICAgICAgICAgICAgICAgICJkb3dubG9hZF9jb250ZW50X2xlbmd0aCI9PiR0b3RhbGxlbmd0aCwKICAgICAgICAgICAgICAgICJ1cGxvYWRfY29udGVudF9sZW5ndGgiPT4wLAogICAgICAgICAgICAgICAgInN0YXJ0dHJhbnNmZXJfdGltZSI9PiRjb25uZWN0X3RpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgICRvayA9ICgkdGhpcy0+cmVzdWx0X2NvZGU9PTIwMCk7CiAgICAgICAgaWYgKCRvaykgewogICAgICAgICAgICAvLyBpZiBhIHBhZ2UgcHJlcHJvY2Vzc29yIGlzIGRlZmluZWQsIGNhbGwgaXQgdG8gcHJvY2VzcyB0aGUgcGFnZSBjb250ZW50cwogICAgICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHRoaXMtPnBhZ2VfcHJlcHJvY2Vzc29yKSkgJHRoaXMtPnJlc3BvbnNlID0gY2FsbF91c2VyX2Z1bmMoJHRoaXMtPnBhZ2VfcHJlcHJvY2Vzc29yLCR0aGlzLCR0aGlzLT5yZXNwb25zZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBpZiBjYWNoaW5nIGlzIGVuYWJsZWQsIHNhdmUgdGhlIHBhZ2UKICAgICAgICAgICAgaWYgKCR0aGlzLT5jYWNoaW5nKSAkdGhpcy0+X2NhY2hlX3N0b3JlKCRjYWNoZXRva2VuLCR1cmwpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvazsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdmFsaWRhdGVfcmVzcG9uc2VfY29va2llKCRjb29raWUsJGFjdHVhbF9ob3N0bmFtZSkgewogICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY29va2llIGNhbid0IGJlIHNldCBmb3IgYSBUTEQsIGVnOiAnLmNvbScgICAgICAgIAogICAgICAgICRjb29raWVob3N0ID0gJGNvb2tpZVsnZG9tYWluJ107CiAgICAgICAgJHAgPSBzdHJycG9zKCRjb29raWVob3N0LCcuJyk7CiAgICAgICAgaWYgKCRwPT09ZmFsc2UpIHJldHVybiBmYWxzZTsKICAgICAgICAKICAgICAgICAkdGxkID0gc3RydG9sb3dlcihzdWJzdHIoJGNvb2tpZWhvc3QsJHArMSkpOwogICAgICAgICRzcGVjaWFsX2RvbWFpbnMgPSBhcnJheSgiY29tIiwgImVkdSIsICJuZXQiLCAib3JnIiwgImdvdiIsICJtaWwiLCAiaW50Iik7CiAgICAgICAgJHBlcmlvZHNfcmVxdWlyZWQgPSBpbl9hcnJheSgkdGxkLCRzcGVjaWFsX2RvbWFpbnMpID8gMSA6IDI7CiAgICAgICAgCiAgICAgICAgJHBlcmlvZHMgPSBzdWJzdHJfY291bnQoJGNvb2tpZWhvc3QsJy4nKTsKICAgICAgICBpZiAoJHBlcmlvZHM8JHBlcmlvZHNfcmVxdWlyZWQpIHJldHVybiBmYWxzZTsKICAgICAgICAKICAgICAgICBpZiAoc3Vic3RyKCRhY3R1YWxfaG9zdG5hbWUsMCwxKSE9Jy4nKSAkYWN0dWFsX2hvc3RuYW1lID0gJy4nLiRhY3R1YWxfaG9zdG5hbWU7CiAgICAgICAgaWYgKHN1YnN0cigkY29va2llaG9zdCwwLDEpIT0nLicpICRjb29raWVob3N0ID0gJy4nLiRjb29raWVob3N0OwogICAgICAgICRkb21haW5fbWF0Y2ggPSAoCiAgICAgICAgICAgICgkYWN0dWFsX2hvc3RuYW1lPT0kY29va2llaG9zdCkgfHwKICAgICAgICAgICAgKHN1YnN0cigkYWN0dWFsX2hvc3RuYW1lLC1zdHJsZW4oJGNvb2tpZWhvc3QpKT09JGNvb2tpZWhvc3QpCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICByZXR1cm4gJGRvbWFpbl9tYXRjaDsKCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGJ1aWxkX2hlYWRlcnMoKSB7CiAgICAgICAgJGhlYWRlcnMgPSAiIjsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+aGVhZGVycyBhcyAkbmFtZT0+JHZhbHVlKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IHRyaW0oJHZhbHVlKTsKICAgICAgICAgICAgaWYgKGVtcHR5KCR2YWx1ZSkpIGNvbnRpbnVlOwogICAgICAgICAgICAkaGVhZGVycyAuPSAieyRuYW1lfTogeyR2YWx1ZX1cclxuIjsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+cmVxdWVzdF9jb29raWVzKSAmJiBpc19hcnJheSgkdGhpcy0+cmVxdWVzdF9jb29raWVzKSkgewogICAgICAgICAgICAkY29va2llbGlzdCA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5yZXF1ZXN0X2Nvb2tpZXMgYXMgJG5hbWU9PiR2YWx1ZSkgewogICAgICAgICAgICAgICAgJGNvb2tpZWxpc3RbXSA9ICJ7JG5hbWV9PXskdmFsdWV9IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY291bnQoJGNvb2tpZWxpc3QpKSAkaGVhZGVycyAuPSAiQ29va2llOiAiLmltcGxvZGUoJzsgJywkY29va2llbGlzdCkuIlxyXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICAkaGVhZGVycyAuPSAiXHJcbiI7CiAgICAgICAgCiAgICAgICAgcmV0dXJuICRoZWFkZXJzOwogICAgfQogICAgCiAgICAvLyBvcHBvc2l0ZSBvZiBwYXJzZV91cmwoKQogICAgZnVuY3Rpb24gcmVidWlsZF91cmwoJHVybGluZm8pIHsKICAgICAgICAkdXJsID0gJHVybGluZm9bJ3NjaGVtZSddLic6Ly8nOwogICAgICAgIAogICAgICAgIGlmICgkdXJsaW5mb1sndXNlciddIHx8ICR1cmxpbmZvWydwYXNzJ10pIHsKICAgICAgICAgICAgJHVybCAuPSAkdXJsaW5mb1sndXNlciddOwogICAgICAgICAgICBpZiAoJHVybGluZm9bJ3Bhc3MnXSkgewogICAgICAgICAgICAgICAgaWYgKCR1cmxpbmZvWyd1c2VyJ10pICR1cmwgLj0gJzonOwogICAgICAgICAgICAgICAgJHVybCAuPSAkdXJsaW5mb1sncGFzcyddOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR1cmwgLj0gJ0AnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkdXJsIC49ICR1cmxpbmZvWydob3N0J107CiAgICAgICAgaWYgKCR1cmxpbmZvWydwb3J0J10pICR1cmwgLj0gJzonLiR1cmxpbmZvWydwb3J0J107CiAgICAgICAgCiAgICAgICAgJHVybCAuPSAkdXJsaW5mb1sncGF0aCddOwogICAgICAgIAogICAgICAgIGlmICgkdXJsaW5mb1sncXVlcnknXSkgJHVybCAuPSAnPycuJHVybGluZm9bJ3F1ZXJ5J107CiAgICAgICAgaWYgKCR1cmxpbmZvWydmcmFnbWVudCddKSAkdXJsIC49ICcjJy4kdXJsaW5mb1snZnJhZ21lbnQnXTsKICAgICAgICAKICAgICAgICByZXR1cm4gJHVybDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gX3JlcGxhY2VfaG9zdG5hbWUoJiR1cmwsJG5ld19ob3N0bmFtZSkgewogICAgICAgICRwYXJ0cyA9IHBhcnNlX3VybCgkdXJsKTsKICAgICAgICAkb2xkX2hvc3RuYW1lID0gJHBhcnRzWydob3N0J107CiAgICAgICAgCiAgICAgICAgJHBhcnRzWydob3N0J10gPSAkbmV3X2hvc3RuYW1lOwogICAgICAgIAogICAgICAgICR1cmwgPSAkdGhpcy0+cmVidWlsZF91cmwoJHBhcnRzKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHJldHVybiAkb2xkX2hvc3RuYW1lOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBfY3VybF9yZXF1ZXN0KCR1cmwpIHsKICAgICAgICAkdGhpcy0+ZXJyb3IgPSBmYWxzZTsKCiAgICAgICAgLy8gaWYgYSBkaXJlY3QgY29ubmVjdGlvbiBJUCBhZGRyZXNzIHdhcyBzcGVjaWZpZWQsICAgIHJlcGxhY2UgdGhlIGhvc3RuYW1lCiAgICAgICAgLy8gaW4gdGhlIFVSTCB3aXRoIHRoZSBJUCBhZGRyZXNzLCBhbmQgc2V0IHRoZSBIb3N0OiBoZWFkZXIgdG8gdGhlCiAgICAgICAgLy8gb3JpZ2luYWwgaG9zdG5hbWUKICAgICAgICBpZiAoJHRoaXMtPmNvbm5lY3RfaXApIHsKICAgICAgICAgICAgJG9sZF9ob3N0bmFtZSA9ICR0aGlzLT5fcmVwbGFjZV9ob3N0bmFtZSgkdXJsLCR0aGlzLT5jb25uZWN0X2lwKTsKICAgICAgICAgICAgJHRoaXMtPmhlYWRlcnNbIkhvc3QiXSA9ICRvbGRfaG9zdG5hbWU7CiAgICAgICAgfQogICAgICAgIAoKICAgICAgICB1bnNldCgkdGhpcy0+aGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSk7CiAgICAgICAgJGhlYWRlcnMgPSBleHBsb2RlKCJcbiIsJHRoaXMtPmJ1aWxkX2hlYWRlcnMoKSk7CiAgICAgICAgCiAgICAgICAgJGNoID0gY3VybF9pbml0KCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVJMLCAkdXJsKTsgCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVVNFUkFHRU5ULCAkdGhpcy0+aGVhZGVyc1siVXNlci1BZ2VudCJdKTsgCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfSEVBREVSLCAxKTsgCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOyAKLy8gICAgICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsgLy8gbmF0aXZlIG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXQsIHNvIGl0J3MgZGlzYWJsZWQgZm9yIGNvbnNpc3RlbmN5CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfVElNRU9VVCwgMTApOwogICAgICAgIGlmICgkdGhpcy0+Y3VybF9wcm94eSkgewogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9QUk9YWSwkdGhpcy0+Y3VybF9wcm94eSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+Y3VybF9wcm94eXR5cGUpIHsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1BST1hZVFlQRSwkdGhpcy0+Y3VybF9wcm94eXR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsKICAgICAgICAKICAgICAgICBpZiAoJHRoaXMtPm1ldGhvZD09IlBPU1QiKSB7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1BPU1QsMSk7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1BPU1RGSUVMRFMsJHRoaXMtPnBvc3RfZGF0YSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+aW5zZWN1cmVfc3NsKSB7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPmlnbm9yZV9zc2xfaG9zdG5hbWUpIHsKICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aGlzLT5yZXNwb25zZSA9IGN1cmxfZXhlYyAoJGNoKTsKICAgICAgICBpZiAoY3VybF9lcnJubygkY2gpIT0wKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJDVVJMIGVycm9yICMiLmN1cmxfZXJybm8oJGNoKS4iOiAiLmN1cmxfZXJyb3IoJGNoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHRoaXMtPnN0YXRzID0gY3VybF9nZXRpbmZvKCRjaCk7CiAgICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgICAgIAogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yID09PSBmYWxzZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHByb2dyZXNzKCRsZXZlbCwkbXNnKSB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCR0aGlzLT5wcm9ncmVzc19jYWxsYmFjaykpIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5wcm9ncmVzc19jYWxsYmFjaywkbGV2ZWwsJG1zZyk7CiAgICB9CiAgICAKICAgIC8vIEdldHMgYW55IGF2YWlsYWJsZSBIVFRQUmV0cmlldmVyIGVycm9yIG1lc3NhZ2UgKGluY2x1ZGluZyBib3RoIGludGVybmFsCiAgICAvLyBlcnJvcnMgYW5kIEhUVFAgZXJyb3JzKQogICAgZnVuY3Rpb24gZ2V0X2Vycm9yKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3IgPyAkdGhpcy0+ZXJyb3IgOiAnSFRUUCAnIC4gJHRoaXMtPnJlc3VsdF9jb2RlLic6ICcuJHRoaXMtPnJlc3VsdF90ZXh0OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRfY29udGVudF90eXBlKCkgewogICAgICAgIGlmICghJGN0eXBlID0gJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSB7CiAgICAgICAgICAgICRjdHlwZSA9ICR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydDb250ZW50LXR5cGUnXTsKICAgICAgICB9CiAgICAgICAgbGlzdCgkY3R5cGUsKSA9IGV4cGxvZGUoJzsnLCRjdHlwZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHN0cnRvbG93ZXIoJGN0eXBlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdXBkYXRlX3RyYW5zZmVyX2NvdW50ZXJzKCkgewogICAgICAgIGlmIChpc19jYWxsYWJsZSgkdGhpcy0+dHJhbnNmZXJfY2FsbGJhY2spKSBjYWxsX3VzZXJfZnVuYygkdGhpcy0+dHJhbnNmZXJfY2FsbGJhY2ssJHRoaXMtPnJlY2VpdmVkX2J5dGVzLCR0aGlzLT5leHBlY3RlZF9ieXRlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0X3RyYW5zZmVyX2Rpc3BsYXkoJGVuYWJsZWQgPSB0cnVlKSB7CiAgICAgICAgaWYgKCRlbmFibGVkKSB7CiAgICAgICAgICAgICR0aGlzLT50cmFuc2Zlcl9jYWxsYmFjayA9IGFycmF5KCYkdGhpcywnZGVmYXVsdF90cmFuc2Zlcl9jYWxsYmFjaycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT50cmFuc2Zlcl9jYWxsYmFjayk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBzZXRfcHJvZ3Jlc3NfZGlzcGxheSgkZW5hYmxlZCA9IHRydWUpIHsKICAgICAgICBpZiAoJGVuYWJsZWQpIHsKICAgICAgICAgICAgJHRoaXMtPnByb2dyZXNzX2NhbGxiYWNrID0gYXJyYXkoJiR0aGlzLCdkZWZhdWx0X3Byb2dyZXNzX2NhbGxiYWNrJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdW5zZXQoJHRoaXMtPnByb2dyZXNzX2NhbGxiYWNrKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGRlZmF1bHRfcHJvZ3Jlc3NfY2FsbGJhY2soJHNldmVyaXR5LCRtZXNzYWdlKSB7CiAgICAgICAgJHNldmVyaXRpZXMgPSBhcnJheSgKICAgICAgICAgICAgSFJQX0RFQlVHPT4nZGVidWcnLAogICAgICAgICAgICBIUlBfSU5GTz0+J2luZm8nLAogICAgICAgICAgICBIUlBfRVJST1I9PidlcnJvcicsCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICBlY2hvIGRhdGUoJ1ktbS1kIEg6aTpzYScpLicgWycuJHNldmVyaXRpZXNbJHNldmVyaXR5XS4nXSAnLiRtZXNzYWdlLiJcbiI7CiAgICAgICAgZmx1c2goKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0X3RyYW5zZmVyX2NhbGxiYWNrKCR0cmFuc2ZlcnJlZCwkZXhwZWN0ZWQpIHsKICAgICAgICAkbXNnID0gIlRyYW5zZmVycmVkICIgLiByb3VuZCgkdHJhbnNmZXJyZWQvMTAyNCwxKTsKICAgICAgICBpZiAoJGV4cGVjdGVkPj0wKSAkbXNnIC49ICIvIiAuIHJvdW5kKCRleHBlY3RlZC8xMDI0LDEpOwogICAgICAgICRtc2cgLj0gICAgIktCIjsKICAgICAgICBpZiAoJGV4cGVjdGVkPjApICRtc2cgLj0gIiAoIi5yb3VuZCgkdHJhbnNmZXJyZWQqMTAwLyRleHBlY3RlZCwxKS4iJSkiOwogICAgICAgIGVjaG8gZGF0ZSgnWS1tLWQgSDppOnNhJykuIiAkbXNnXG4iOwogICAgICAgIGZsdXNoKCk7CiAgICB9ICAgIAogICAgCiAgICBmdW5jdGlvbiBnZXRtaWNyb3RpbWUoKSB7IAogICAgICAgIGxpc3QoJHVzZWMsICRzZWMpID0gZXhwbG9kZSgiICIsbWljcm90aW1lKCkpOyAKICAgICAgICByZXR1cm4gKChmbG9hdCkkdXNlYyArIChmbG9hdCkkc2VjKTsgCiAgICB9ICAgIAp9CgpmdW5jdGlvbiBfY3VybF9kaXNhYmxlZCgpCnsKICAgIGlmIChkZWZpbmVkKCJDVVJMX0VNVUxBVElPTiIpKQogICAgICAgIGRlZmluZSgiQ1VSTF9ESVNBQkxFRCIsIHRydWUpOwoKICAgIGlmIChkZWZpbmVkKCJDVVJMX0RJU0FCTEVEIikpCiAgICAgICAgcmV0dXJuKENVUkxfRElTQUJMRUQpOwogICAgCiAgICAvKiRkaXNhYmxlZEZ1bmN0aW9ucyA9IGFycmF5KCk7CiAgICAkZGlzYWJsZWRGdW5jdGlvbnMgPSBhcnJheV9tZXJnZSgkZGlzYWJsZWRGdW5jdGlvbnMsIGV4cGxvZGUoIiwiLCBpbmlfZ2V0KCJkaXNhYmxlX2Z1bmN0aW9ucyIpKSk7CiAgICAkZGlzYWJsZWRGdW5jdGlvbnMgPSBhcnJheV9tZXJnZSgkZGlzYWJsZWRGdW5jdGlvbnMsIGV4cGxvZGUoIiwiLCBpbmlfZ2V0KCJzdWhvc2luLmV4ZWN1dG9yLmV2YWwuYmxhY2tsaXN0IikpKTsKCiAgICBmb3JlYWNoKCRkaXNhYmxlZEZ1bmN0aW9ucyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICAkZGlzYWJsZWRGdW5jdGlvbnNbJGtleV0gPSB0cmltKCR2YWx1ZSk7CgogICAgJGN1cmxGdW5jdGlvbk5hbWVzID0gYXJyYXkoCiAgICAgICAgImN1cmxfY2xvc2UiLAogICAgICAgICJjdXJsX2NvcHlfaGFuZGxlIiwKICAgICAgICAiY3VybF9lcnJubyIsCiAgICAgICAgImN1cmxfZXJyb3IiLAogICAgICAgICJjdXJsX2V4ZWMiLAogICAgICAgICJjdXJsX2dldGluZm8iLAogICAgICAgICJjdXJsX2luaXQiLAogICAgICAgICJjdXJsX211bHRpX2FkZF8gaGFuZGxlIiwKICAgICAgICAiY3VybF9tdWx0aV9jbG9zZSIsCiAgICAgICAgImN1cmxfbXVsdGlfZXhlYyIsCiAgICAgICAgImN1cmxfbXVsdGlfZ2V0Y29udGVudCIsCiAgICAgICAgImN1cmxfbXVsdGlfaW5mb18gcmVhZCIsCiAgICAgICAgImN1cmxfbXVsdGlfaW5pdCIsCiAgICAgICAgImN1cmxfbXVsdGlfcmVtb3ZlXyBoYW5kbGUiLAogICAgICAgICJjdXJsX211bHRpX3NlbGVjdCIsCiAgICAgICAgImN1cmxfc2V0b3B0X2FycmF5IiwKICAgICAgICAiY3VybF9zZXRvcHQiLAogICAgICAgICJjdXJsX3ZlcnNpb24iLAogICAgKTsKCiAgICBmb3JlYWNoKCRjdXJsRnVuY3Rpb25OYW1lcyBhcyAkY3VybEZ1bmN0aW9uTmFtZSkKICAgIHsKICAgICAgICBpZiAoaW5fYXJyYXkoJGN1cmxGdW5jdGlvbk5hbWUsICRkaXNhYmxlZEZ1bmN0aW9ucykpCiAgICAgICAgewogICAgICAgICAgICBkZWZpbmUoIkNVUkxfRElTQUJMRUQiLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgKi8KICAgIAogICAgaWYgKGlzRGlzYWJsZWRGdW5jdGlvbigiY3VybF9pbml0IikpCiAgICAgICAgZGVmaW5lKCJDVVJMX0RJU0FCTEVEIiwgdHJ1ZSk7CiAgICAKICAgIGlmICghZGVmaW5lZCgiQ1VSTF9ESVNBQkxFRCIpKQogICAgICAgIGRlZmluZSgiQ1VSTF9ESVNBQkxFRCIsIGZhbHNlKTsKICAgIAogICAgcmV0dXJuKENVUkxfRElTQUJMRUQpOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoImN1cmwiKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCJjdXJsX2luaXQiKSkgCnsKICAgIGRlZmluZSgiQ1VSTE5BVF9WRVJTSU9OIiwiMS4wLjAiKTsKICAgIGRlZmluZSgiQ1VSTF9FTVVMQVRJT04iLHRydWUpOwogICAgCiAgICBkZWZpbmUoJ0NVUkxPUFRfTk9USElORycsMCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfRklMRScsMTAwMDEpOwogICAgZGVmaW5lKCdDVVJMT1BUX1VSTCcsMTAwMDIpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BPUlQnLDMpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BST1hZJywxMDAwNCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfVVNFUlBXRCcsMTAwMDUpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BST1hZVVNFUlBXRCcsMTAwMDYpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BST1hZVFlQRScsMTAxKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9SQU5HRScsMTAwMDcpOwogICAgZGVmaW5lKCdDVVJMT1BUX0lORklMRScsMTAwMDkpOwogICAgZGVmaW5lKCdDVVJMT1BUX0VSUk9SQlVGRkVSJywxMDAxMCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfV1JJVEVGVU5DVElPTicsMjAwMTEpOwogICAgZGVmaW5lKCdDVVJMT1BUX1JFQURGVU5DVElPTicsMjAwMTIpOwogICAgZGVmaW5lKCdDVVJMT1BUX1RJTUVPVVQnLDEzKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9USU1FT1VUX01TJywxNTUpOyAgCiAgICBkZWZpbmUoJ0NVUkxPUFRfQ09OTkVDVFRJTUVPVVRfTVMnLDE1Nik7ICAKICAgIGRlZmluZSgnQ1VSTE9QVF9JTkZJTEVTSVpFJywxNCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfUE9TVEZJRUxEUycsMTAwMTUpOwogICAgZGVmaW5lKCdDVVJMT1BUX1JFRkVSRVInLDEwMDE2KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9GVFBQT1JUJywxMDAxNyk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfVVNFUkFHRU5UJywxMDAxOCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfTE9XX1NQRUVEX0xJTUlUJywxOSk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfTE9XX1NQRUVEX1RJTUUnLDIwKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9SRVNVTUVfRlJPTScsMjEpOwogICAgZGVmaW5lKCdDVVJMT1BUX0NPT0tJRScsMTAwMjIpOwogICAgZGVmaW5lKCdDVVJMT1BUX0hUVFBIRUFERVInLDEwMDIzKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9IVFRQUE9TVCcsMTAwMjQpOwogICAgZGVmaW5lKCdDVVJMT1BUX1NTTENFUlQnLDEwMDI1KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9TU0xDRVJUUEFTU1dEJywxMDAyNik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfU1NMS0VZUEFTU1dEJywxMDAyNik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfQ1JMRicsMjcpOwogICAgZGVmaW5lKCdDVVJMT1BUX1FVT1RFJywxMDAyOCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfV1JJVEVIRUFERVInLDEwMDI5KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9DT09LSUVGSUxFJywxMDAzMSk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfU1NMVkVSU0lPTicsMzIpOwogICAgZGVmaW5lKCdDVVJMT1BUX1RJTUVDT05ESVRJT04nLDMzKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9USU1FVkFMVUUnLDM0KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9IVFRQUkVRVUVTVCcsMTAwMzUpOwogICAgZGVmaW5lKCdDVVJMT1BUX0NVU1RPTVJFUVVFU1QnLDEwMDM2KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9TVERFUlInLDEwMDM3KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9QT1NUUVVPVEUnLDEwMDM5KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9XUklURUlORk8nLDEwMDQwKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9WRVJCT1NFJyw0MSk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfSEVBREVSJyw0Mik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfTk9QUk9HUkVTUycsNDMpOwogICAgZGVmaW5lKCdDVVJMT1BUX05PQk9EWScsNDQpOwogICAgZGVmaW5lKCdDVVJMT1BUX0ZBSUxPTkVSUk9SJyw0NSk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfVVBMT0FEJyw0Nik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfUE9TVCcsNDcpOwogICAgZGVmaW5lKCdDVVJMT1BUX0ZUUExJU1RPTkxZJyw0OCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfRlRQQVBQRU5EJyw1MCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfTkVUUkMnLDUxKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9GT0xMT1dMT0NBVElPTicsNTIpOwogICAgZGVmaW5lKCdDVVJMT1BUX0ZUUEFTQ0lJJyw1Myk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfVFJBTlNGRVJURVhUJyw1Myk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfUFVUJyw1NCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfTVVURScsNTUpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BST0dSRVNTRlVOQ1RJT04nLDIwMDU2KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9QUk9HUkVTU0RBVEEnLDEwMDU3KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9BVVRPUkVGRVJFUicsNTgpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BST1hZUE9SVCcsNTkpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BPU1RGSUVMRFNJWkUnLDYwKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwnLDYxKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9JTlRFUkZBQ0UnLDEwMDYyKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9LUkI0TEVWRUwnLDEwMDYzKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUicsNjQpOwogICAgZGVmaW5lKCdDVVJMT1BUX0NBSU5GTycsMTAwNjUpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BBU1NXREZVTkNUSU9OJywyMDA2Nik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfUEFTU1dEREFUQScsMTAwNjcpOwogICAgZGVmaW5lKCdDVVJMT1BUX01BWFJFRElSUycsNjgpOwogICAgZGVmaW5lKCdDVVJMT1BUX0ZJTEVUSU1FJywxMDA2OSk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfVEVMTkVUT1BUSU9OUycsMTAwNzApOwogICAgZGVmaW5lKCdDVVJMT1BUX01BWENPTk5FQ1RTJyw3MSk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfQ0xPU0VQT0xJQ1knLDcyKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9DTE9TRUZVTkNUSU9OJywyMDA3Myk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfRlJFU0hfQ09OTkVDVCcsNzQpOwogICAgZGVmaW5lKCdDVVJMT1BUX0ZPUkJJRF9SRVVTRScsNzUpOwogICAgZGVmaW5lKCdDVVJMT1BUX1JBTkRPTV9GSUxFJywxMDA3Nik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfRUdEU09DS0VUJywxMDA3Nyk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfQ09OTkVDVFRJTUVPVVQnLDc4KTsKICAgIGRlZmluZSgnQ1VSTE9QVF9IRUFERVJGVU5DVElPTicsMjAwNzkpOwogICAgZGVmaW5lKCdDVVJMT1BUX0hUVFBHRVQnLDgwKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCcsODEpOwogICAgZGVmaW5lKCdDVVJMT1BUX0NPT0tJRUpBUicsMTAwODIpOwogICAgZGVmaW5lKCdDVVJMT1BUX1NTTF9DSVBIRVJfTElTVCcsMTAwODMpOwogICAgZGVmaW5lKCdDVVJMT1BUX0hUVFBfVkVSU0lPTicsODQpOwogICAgZGVmaW5lKCdDVVJMT1BUX0ZUUF9VU0VfRVBTVicsODUpOwogICAgZGVmaW5lKCdDVVJMT1BUX1NTTENFUlRUWVBFJywxMDA4Nik7CiAgICBkZWZpbmUoJ0NVUkxPUFRfU1NMS0VZJywxMDA4Nyk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfU1NMS0VZVFlQRScsMTAwODgpOwogICAgZGVmaW5lKCdDVVJMT1BUX1NTTEVOR0lORScsMTAwODkpOwogICAgZGVmaW5lKCdDVVJMT1BUX1NTTEVOR0lORV9ERUZBVUxUJyw5MCk7CiAgICBkZWZpbmUoJ0NVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUnLDkxKTsKICAgIGRlZmluZSgnQ1VSTE9QVF9ETlNfQ0FDSEVfVElNRU9VVCcsOTIpOwogICAgZGVmaW5lKCdDVVJMT1BUX1BSRVFVT1RFJywxMDA5Myk7IAoKICAgIGRlZmluZSgnQ1VSTElORk9fRUZGRUNUSVZFX1VSTCcsMSk7CiAgICBkZWZpbmUoJ0NVUkxJTkZPX0hUVFBfQ09ERScsMik7CiAgICBkZWZpbmUoJ0NVUkxJTkZPX0ZJTEVUSU1FJywxNCk7CiAgICBkZWZpbmUoJ0NVUkxJTkZPX1RPVEFMX1RJTUUnLDMpOwogICAgZGVmaW5lKCdDVVJMSU5GT19OQU1FTE9PS1VQX1RJTUUnLDQpOwogICAgZGVmaW5lKCdDVVJMSU5GT19DT05ORUNUX1RJTUUnLDUpOwogICAgZGVmaW5lKCdDVVJMSU5GT19QUkVUUkFOU0ZFUl9USU1FJyw2KTsKICAgIGRlZmluZSgnQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FJywxNyk7CiAgICBkZWZpbmUoJ0NVUkxJTkZPX1JFRElSRUNUX1RJTUUnLDE5KTsKICAgIGRlZmluZSgnQ1VSTElORk9fUkVESVJFQ1RfQ09VTlQnLDIwKTsKICAgIGRlZmluZSgnQ1VSTElORk9fU0laRV9VUExPQUQnLDcpOwogICAgZGVmaW5lKCdDVVJMSU5GT19TSVpFX0RPV05MT0FEJyw4KTsKICAgIGRlZmluZSgnQ1VSTElORk9fU1BFRURfRE9XTkxPQUQnLDkpOwogICAgZGVmaW5lKCdDVVJMSU5GT19TUEVFRF9VUExPQUQnLDEwKTsKICAgIGRlZmluZSgnQ1VSTElORk9fSEVBREVSX1NJWkUnLDExKTsKICAgIGRlZmluZSgnQ1VSTElORk9fUkVRVUVTVF9TSVpFJywxMik7CiAgICBkZWZpbmUoJ0NVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQnLDEzKTsKICAgIGRlZmluZSgnQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQnLDE1KTsKICAgIGRlZmluZSgnQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfVVBMT0FEJywxNik7CiAgICBkZWZpbmUoJ0NVUkxJTkZPX0NPTlRFTlRfVFlQRScsMTgpOwoKCiAgICBkZWZpbmUoIlRJTUVDT05EX0lTVU5NT0RTSU5DRSIsMSk7CiAgICBkZWZpbmUoIlRJTUVDT05EX0lGTU9EU0lOQ0UiLDIpOwogICAgCiAgICBkZWZpbmUoIkNVUkxfU1NMVkVSU0lPTl9UTFN2MV8yIiwgNik7CiAgICAKfQoKLy8gbm90IGRlZmluZWQgaW4gY3VybCBleHRlbnNpb24KZGVmaW5lKCJDVVJMRV9PSyIsIDApOwpkZWZpbmUoIkNVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MIiwgMSk7CmRlZmluZSgiQ1VSTEVfRkFJTEVEX0lOSVQiLCAyKTsKZGVmaW5lKCJDVVJMRV9VUkxfTUFMRk9STUFUIiwgMyk7CmRlZmluZSgiQ1VSTEVfQ09VTEROVF9SRVNPTFZFX1BST1hZIiwgNCk7CmRlZmluZSgiQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QiLCA1KTsKZGVmaW5lKCJDVVJMRV9DT1VMRE5UX0NPTk5FQ1QiLCA2KTsKZGVmaW5lKCJDVVJMRV9GVFBfV0VJUkRfU0VSVkVSX1JFUExZIiwgNyk7CmRlZmluZSgiQ1VSTEVfUkVNT1RFX0FDQ0VTU19ERU5JRUQiLCA4KTsKZGVmaW5lKCJDVVJMRV9GVFBfV0VJUkRfUEFTU19SRVBMWSIsIDkpOwoKZGVmaW5lKCJDVVJMRV9GVFBfV0VJUkRfUEFTVl9SRVBMWSIsIDEzKTsKZGVmaW5lKCJDVVJMRV9GVFBfV0VJUkRfMjI3X0ZPUk1BVCIsIDE0KTsKZGVmaW5lKCJDVVJMRV9GVFBfUFJFVF9GQUlMRUQiLCA4NCk7CmRlZmluZSgiQ1VSTEVfRlRQX0NBTlRfR0VUX0hPU1QiLCAxNSk7CmRlZmluZSgiQ1VSTEVfRlRQX0NPVUxETlRfU0VUX1RZUEUiLCAxNyk7CmRlZmluZSgiQ1VSTEVfUEFSVElBTF9GSUxFIiwgMTgpOwpkZWZpbmUoIkNVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRSIsIDE5KTsKZGVmaW5lKCJDVVJMRV9RVU9URV9FUlJPUiIsIDIxKTsKZGVmaW5lKCJDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIiwgMjIpOwpkZWZpbmUoIkNVUkxFX1dSSVRFX0VSUk9SIiwgMjMpOwpkZWZpbmUoIkNVUkxFX1VQTE9BRF9GQUlMRUQiLCAyNSk7CmRlZmluZSgiQ1VSTEVfUkVBRF9FUlJPUiIsIDI2KTsKZGVmaW5lKCJDVVJMRV9PVVRfT0ZfTUVNT1JZIiwgMjcpOwpkZWZpbmUoIkNVUkxFX09QRVJBVElPTl9USU1FRE9VVCIsIDI4KTsKZGVmaW5lKCJDVVJMRV9GVFBfUE9SVF9GQUlMRUQiLCAzMCk7CmRlZmluZSgiQ1VSTEVfRlRQX0NPVUxETlRfVVNFX1JFU1QiLCAzMSk7CmRlZmluZSgiQ1VSTEVfUkFOR0VfRVJST1IiLCAzMyk7CmRlZmluZSgiQ1VSTEVfSFRUUF9QT1NUX0VSUk9SIiwgMzQpOwpkZWZpbmUoIkNVUkxFX1NTTF9DT05ORUNUX0VSUk9SIiwgMzUpOwpkZWZpbmUoIkNVUkxFX0JBRF9ET1dOTE9BRF9SRVNVTUUiLCAzNik7CmRlZmluZSgiQ1VSTEVfRklMRV9DT1VMRE5UX1JFQURfRklMRSIsIDM3KTsKZGVmaW5lKCJDVVJMRV9MREFQX0NBTk5PVF9CSU5EIiwgMzgpOwpkZWZpbmUoIkNVUkxFX0xEQVBfU0VBUkNIX0ZBSUxFRCIsIDM5KTsKZGVmaW5lKCJDVVJMRV9GVU5DVElPTl9OT1RfRk9VTkQiLCA0MSk7CmRlZmluZSgiQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSyIsIDQyKTsKZGVmaW5lKCJDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQiLCA0Myk7CmRlZmluZSgiQ1VSTEVfSU5URVJGQUNFX0ZBSUxFRCIsIDQ1KTsKZGVmaW5lKCJDVVJMRV9UT09fTUFOWV9SRURJUkVDVFMiLCA0Nyk7CmRlZmluZSgiQ1VSTEVfVU5LTk9XTl9URUxORVRfT1BUSU9OIiwgNDgpOwpkZWZpbmUoIkNVUkxFX1RFTE5FVF9PUFRJT05fU1lOVEFYIiwgNDkpOwpkZWZpbmUoIkNVUkxFX1BFRVJfRkFJTEVEX1ZFUklGSUNBVElPTiIsIDUxKTsKZGVmaW5lKCJDVVJMRV9HT1RfTk9USElORyIsIDUyKTsKZGVmaW5lKCJDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5EIiwgNTMpOwpkZWZpbmUoIkNVUkxFX1NTTF9FTkdJTkVfU0VURkFJTEVEIiwgNTQpOwpkZWZpbmUoIkNVUkxFX1NFTkRfRVJST1IiLCA1NSk7CmRlZmluZSgiQ1VSTEVfUkVDVl9FUlJPUiIsIDU2KTsKZGVmaW5lKCJDVVJMRV9TU0xfQ0VSVFBST0JMRU0iLCA1OCk7CmRlZmluZSgiQ1VSTEVfU1NMX0NJUEhFUiIsIDU5KTsKZGVmaW5lKCJDVVJMRV9TU0xfQ0FDRVJUIiwgNjApOwpkZWZpbmUoIkNVUkxFX0JBRF9DT05URU5UX0VOQ09ESU5HIiwgNjEpOwpkZWZpbmUoIkNVUkxFX0xEQVBfSU5WQUxJRF9VUkwiLCA2Mik7CmRlZmluZSgiQ1VSTEVfRklMRVNJWkVfRVhDRUVERUQiLCA2Myk7CmRlZmluZSgiQ1VSTEVfVVNFX1NTTF9GQUlMRUQiLCA2NCk7CmRlZmluZSgiQ1VSTEVfU0VORF9GQUlMX1JFV0lORCIsIDY1KTsKZGVmaW5lKCJDVVJMRV9TU0xfRU5HSU5FX0lOSVRGQUlMRUQiLCA2Nik7CmRlZmluZSgiQ1VSTEVfTE9HSU5fREVOSUVEIiwgNjcpOwpkZWZpbmUoIkNVUkxFX1RGVFBfTk9URk9VTkQiLCA2OCk7CmRlZmluZSgiQ1VSTEVfVEZUUF9QRVJNIiwgNjkpOwpkZWZpbmUoIkNVUkxFX1JFTU9URV9ESVNLX0ZVTEwiLCA3MCk7CmRlZmluZSgiQ1VSTEVfVEZUUF9JTExFR0FMIiwgNzEpOwpkZWZpbmUoIkNVUkxFX1RGVFBfVU5LTk9XTklEIiwgNzIpOwpkZWZpbmUoIkNVUkxFX1JFTU9URV9GSUxFX0VYSVNUUyIsIDczKTsKZGVmaW5lKCJDVVJMRV9URlRQX05PU1VDSFVTRVIiLCA3NCk7CmRlZmluZSgiQ1VSTEVfQ09OVl9GQUlMRUQiLCA3NSk7CmRlZmluZSgiQ1VSTEVfQ09OVl9SRVFEIiwgNzYpOwpkZWZpbmUoIkNVUkxFX1NTTF9DQUNFUlRfQkFERklMRSIsIDc3KTsKZGVmaW5lKCJDVVJMRV9SRU1PVEVfRklMRV9OT1RfRk9VTkQiLCA3OCk7CmRlZmluZSgiQ1VSTEVfU1NIIiwgNzkpOwpkZWZpbmUoIkNVUkxFX1NTTF9TSFVURE9XTl9GQUlMRUQiLCA4MCk7CmRlZmluZSgiQ1VSTEVfQUdBSU4iLCA4MSk7CmRlZmluZSgiQ1VSTEVfU1NMX0NSTF9CQURGSUxFIiwgODIpOwpkZWZpbmUoIkNVUkxFX1NTTF9JU1NVRVJfRVJST1IiLCA4Myk7CgpmdW5jdGlvbiBfY3VybG9wdF9uYW1lKCRjdXJsb3B0KSB7CiAgICBmb3JlYWNoIChnZXRfZGVmaW5lZF9jb25zdGFudHMoKSBhcyAkaz0+JHYpIHsKICAgICAgICBpZiAoIChzdWJzdHIoJGssMCw4KT09IkNVUkxPUFRfIikgJiYgKCR2PT0kY3VybG9wdCkpIHJldHVybiAkazsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLy8gSW5pdGlhbGl6ZSBhIENVUkwgZW11bGF0aW9uIHNlc3Npb24KZnVuY3Rpb24gX19jdXJsX2luaXQoJHVybD0iIikgewogICAgJGkgPSAkR0xPQkFMU1siX0NVUkxOQVRfT1BUIl1bImluZGV4Il0rKzsKICAgICRHTE9CQUxTWyJfQ1VSTE5BVF9PUFQiXVskaV0gPSBhcnJheSgpOwogICAgJEdMT0JBTFNbIl9DVVJMTkFUX09QVCJdWyRpXVsiaHR0cCJdID0gbmV3IFRIVFRQUmV0cmlldmVyKCk7CiAgICAkR0xPQkFMU1siX0NVUkxOQVRfT1BUIl1bJGldWyJpbmNsdWRlX2JvZHkiXSA9IHRydWU7CgogICAgLy8gZS12aXNpb24KICAgIF9fY3VybF9zZXRvcHQoJGksQ1VSTE9QVF9VUkwsJHVybCk7CgogICAgcmV0dXJuICRpOwp9CgpmdW5jdGlvbiBfX2N1cmxfc2V0b3B0X2FycmF5KCRjaCwkb3B0aW9ucykgewogICAgZm9yZWFjaCgkb3B0aW9ucyBhcyAkb3B0aW9uID0+ICR2YWx1ZSkKICAgICAgICBfX2N1cmxfc2V0b3B0KCRjaCwgJG9wdGlvbiwgJHZhbHVlKTsKfQoKCi8vIFNldCBhbiBvcHRpb24gZm9yIGEgQ1VSTCBlbXVsYXRpb24gdHJhbnNmZXIgCmZ1bmN0aW9uIF9fY3VybF9zZXRvcHQoJGNoLCRvcHRpb24sJHZhbHVlKSB7CiAgICAKICAgICRvcHQgPSAmJEdMT0JBTFNbIl9DVVJMTkFUX09QVCJdWyRjaF07CiAgICBpZiAoISRvcHRbImFyZ3MiXSkgJG9wdFsiYXJncyJdID0gYXJyYXkoKTsKICAgICRhcmdzID0gJiRvcHRbImFyZ3MiXTsKICAgIGlmICghJG9wdFsic2V0dGluZ3MiXSkgJG9wdFsic2V0dGluZ3MiXSA9IGFycmF5KCk7CiAgICAkc2V0dGluZ3MgPSAmJG9wdFsic2V0dGluZ3MiXTsKICAgICRodHRwID0gJiRvcHRbImh0dHAiXTsKICAgIAogICAgc3dpdGNoKCRvcHRpb24pIHsKICAgICAgICBjYXNlIENVUkxPUFRfVVJMOgogICAgICAgICAgICAkb3B0WyJ1cmwiXSA9ICR2YWx1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDVVJMT1BUX0NVU1RPTVJFUVVFU1Q6CiAgICAgICAgICAgICRvcHRbIm1ldGhvZCJdID0gJHZhbHVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENVUkxPUFRfUkVGRVJFUjoKICAgICAgICAgICAgJGh0dHAtPmhlYWRlcnNbIlJlZmVyZXIiXSA9ICR2YWx1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDVVJMT1BUX05PQk9EWToKICAgICAgICAgICAgJG9wdFsiaW5jbHVkZV9ib2R5Il0gPSAkdmFsdWU9PTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ1VSTE9QVF9GQUlMT05FUlJPUjoKICAgICAgICAgICAgJG9wdFsiZmFpbF9vbl9lcnJvciJdID0gJHZhbHVlPjA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ1VSTE9QVF9VU0VSQUdFTlQ6CiAgICAgICAgICAgICRodHRwLT5oZWFkZXJzWyJVc2VyLUFnZW50Il0gPSAkdmFsdWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ1VSTE9QVF9IRUFERVI6CiAgICAgICAgICAgICRvcHRbImluY2x1ZGVfaGVhZGVycyJdID0gJHZhbHVlPjA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUjoKICAgICAgICAgICAgJG9wdFsicmV0dXJuX3RyYW5zZmVyIl0gPSAkdmFsdWU+MDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDVVJMT1BUX1RJTUVPVVQ6CiAgICAgICAgICAgICRvcHRbIm1heC10aW1lIl0gPSAoaW50KSR2YWx1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDVVJMT1BUX1RJTUVPVVRfTVM6CiAgICAgICAgICAgICRvcHRbIm1heC10aW1lIl0gPSAoaW50KSR2YWx1ZS8xMDAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQ6CiAgICAgICAgICAgICRvcHRbImNvbm5lY3QtdGltZW91dCJdID0gKGludCkkdmFsdWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ1VSTE9QVF9DT05ORUNUVElNRU9VVF9NUzoKICAgICAgICAgICAgJG9wdFsiY29ubmVjdC10aW1lb3V0Il0gPSAoaW50KSR2YWx1ZS8xMDAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENVUkxPUFRfSFRUUEhFQURFUjoKICAgICAgICAgICAgcmVzZXQoJHZhbHVlKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlIGFzICRrPT4kaGVhZGVyKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRoZWFkZXJuYW1lLCRoZWFkZXJ2YWx1ZSkgPSBleHBsb2RlKCI6IiwkaGVhZGVyKTsKICAgICAgICAgICAgICAgICRodHRwLT5oZWFkZXJzWyRoZWFkZXJuYW1lXSA9IGx0cmltKCRoZWFkZXJ2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDVVJMT1BUX1BPU1Q6CiAgICAgICAgICAgICRvcHRbInBvc3QiXSA9ICR2YWx1ZT4wOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENVUkxPUFRfUE9TVEZJRUxEUzoKICAgICAgICAgICAgJG9wdFsicG9zdGRhdGEiXSA9ICR2YWx1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDVVJMT1BUX01VVEU6CiAgICAgICAgICAgIC8vIHdlJ3JlIGFscmVhZHkgbXV0ZSwgbm8/CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ1VSTE9QVF9GSUxFOgogICAgICAgICAgICBpZiAoaXNfcmVzb3VyY2UoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgJG9wdFsib3V0cHV0X2hhbmRsZSJdID0gJHZhbHVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiQ1VSTE9QVF9GSUxFIG11c3Qgc3BlY2lmeSBhIHZhbGlkIGZpbGUgcmVzb3VyY2UiLEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENVUkxPUFRfV1JJVEVIRUFERVI6CiAgICAgICAgICAgIGlmIChpc19yZXNvdXJjZSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkb3B0WyJoZWFkZXJfaGFuZGxlIl0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJDVVJMT1BUX1dSSVRFSEVBREVSIG11c3Qgc3BlY2lmeSBhIHZhbGlkIGZpbGUgcmVzb3VyY2UiLEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENVUkxPUFRfU1RERVJSOgogICAgICAgICAgICAvLyBub3QgaW1wbGVtZW50ZWQgZm9yIG5vdyAtIG5vdCByZWFsbHkgcmVsZXZhbnQKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUjoKICAgICAgICBjYXNlIENVUkxPUFRfU1NMX1ZFUklGWUhPU1Q6CiAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIHVzaW5nIHNzbDovLyBhbnl3YXkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIAogICAgICAgIGNhc2UgQ1VSTE9QVF9VU0VSUFdEOgogICAgICAgICAgICBsaXN0KCRjdXJsX3VzZXIsJGN1cmxfcGFzcykgPSBleHBsb2RlKCc6JywkdmFsdWUsMik7CiAgICAgICAgICAgICRodHRwLT5hdXRoX3VzZXJuYW1lID0gJGN1cmxfdXNlcjsKICAgICAgICAgICAgJGh0dHAtPmF1dGhfcGFzc3dvcmQgPSAkY3VybF9wYXNzOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBDVVJMT1BUX1JBTkdFOgogICAgICAgICAgICAkb3B0WyJyYW5nZSJdID0gJHZhbHVlOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgLy8gSW1wb3J0YW50IHN0dWZmIG5vdCBpbXBsZW1lbnRlZCAoYXMgaXQncyBub3QgeWV0IHN1cHBvcnRlZCBieSBIVFRQUmV0cmlldmVyKQogICAgICAgIGNhc2UgQ1VSTE9QVF9QVVQ6CiAgICAgICAgY2FzZSBDVVJMT1BUX0lORklMRToKICAgICAgICBjYXNlIENVUkxPUFRfRk9MTE9XTE9DQVRJT046CiAgICAgICAgY2FzZSBDVVJMT1BUX1BST1hZVVNFUlBXRDoKICAgICAgICBjYXNlIENVUkxPUFRfQ09PS0lFOgogICAgICAgIGNhc2UgQ1VSTE9QVF9DT09LSUVGSUxFOgogICAgICAgIGNhc2UgQ1VSTE9QVF9QUk9YWToKICAgICAgICAvLyBlLXZpc2lvbgogICAgICAgIC8vY2FzZSBDVVJMT1BUX1JBTkdFOgogICAgICAgIGNhc2UgQ1VSTE9QVF9SRVNVTUVfRlJPTToKCiAgICAgICAgLy8gVGhpbmdzIHRoYXQgY2Fubm90IChyZWFzb25hYmx5KSBiZSBpbXBsZW1lbnRlZCBoZXJlCiAgICAgICAgY2FzZSBDVVJMT1BUX0xPV19TUEVFRF9MSU1JVDoKICAgICAgICBjYXNlIENVUkxPUFRfTE9XX1NQRUVEX1RJTUU6CiAgICAgICAgY2FzZSBDVVJMT1BUX0tSQjRMRVZFTDoKICAgICAgICBjYXNlIENVUkxPUFRfU1NMQ0VSVDoKICAgICAgICBjYXNlIENVUkxPUFRfU1NMQ0VSVFBBU1NXRDoKICAgICAgICBjYXNlIENVUkxPUFRfU1NMVkVSU0lPTjoKICAgICAgICBjYXNlIENVUkxPUFRfSU5URVJGQUNFOgogICAgICAgIGNhc2UgQ1VSTE9QVF9DQUlORk86CiAgICAgICAgY2FzZSBDVVJMT1BUX1RJTUVDT05ESVRJT046CiAgICAgICAgY2FzZSBDVVJMT1BUX1RJTUVWQUxVRToKICAgIAogICAgICAgIC8vIEZUUCBzdHVmZiBub3QgaW1wbGVtZW50ZWQKICAgICAgICBjYXNlIENVUkxPUFRfUVVPVEU6CiAgICAgICAgY2FzZSBDVVJMT1BUX1BPU1RRVU9URToKICAgICAgICBjYXNlIENVUkxPUFRfVVBMT0FEOgogICAgICAgIGNhc2UgQ1VSTE9QVF9GVFBMSVNUT05MWToKICAgICAgICBjYXNlIENVUkxPUFRfRlRQQVBQRU5EOgogICAgICAgIGNhc2UgQ1VSTE9QVF9GVFBQT1JUOgogICAgICAgIAogICAgICAgIC8vIE90aGVyIHN0dWZmIG5vdCBpbXBsZW1lbnRlZAogICAgICAgIGNhc2UgQ1VSTE9QVF9WRVJCT1NFOgogICAgICAgIGNhc2UgQ1VSTE9QVF9ORVRSQzoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvL3RyaWdnZXJfZXJyb3IoIkNVUkwgZW11bGF0aW9uIGRvZXMgbm90IGltcGxlbWVudCBDVVJMIG9wdGlvbiAiLl9jdXJsb3B0X25hbWUoJG9wdGlvbiksRV9VU0VSX1dBUk5JTkcpOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKLy8gUGVyZm9ybSBhIENVUkwgZW11bGF0aW9uIHNlc3Npb24KZnVuY3Rpb24gX19jdXJsX2V4ZWMoJGNoKSB7CiAgICAkb3B0ID0gJiRHTE9CQUxTWyJfQ1VSTE5BVF9PUFQiXVskY2hdOwogICAgJHVybCA9ICRvcHRbInVybCJdOwoKICAgICRodHRwID0gJiRvcHRbImh0dHAiXTsKICAgICRodHRwLT5kaXNhYmxlX2N1cmwgPSB0cnVlOyAvLyBhdm9pZCBwcm9ibGVtcyB3aXRoIHJlY3Vyc2lvbiwgc2luY2Ugd2UgKkFSRSogQ1VSTAogICAgCiAgICAKICAgIAogICAgaWYgKCRvcHRbImNvbm5lY3QtdGltZW91dCJdKSB7CiAgICAgICAgJGh0dHAtPmNvbm5lY3RfdGltZW91dCA9ICRvcHRbImNvbm5lY3QtdGltZW91dCJdOwogICAgfQogICAgaWYgKCRvcHRbIm1heC10aW1lIl0pIHsKICAgICAgICAkaHR0cC0+bWF4X3RpbWUgPSAkb3B0WyJtYXgtdGltZSJdOwogICAgICAgICRodHRwLT5zdHJlYW1fdGltZW91dCA9ICRvcHRbImNvbm5lY3QtdGltZW91dCJdOwogICAgfQogICAgCiAgICAvLyBlLXZpc2lvbgogICAgJGh0dHAtPmhlYWRlcnNfb25seSA9ICRvcHRbImluY2x1ZGVfaGVhZGVycyJdICYmICEkb3B0WyJpbmNsdWRlX2JvZHkiXTsKICAgICRodHRwLT5pbmNsdWRlX2hlYWRlcnMgPSAkb3B0WyJpbmNsdWRlX2hlYWRlcnMiXTsKICAgICRodHRwLT5pbmNsdWRlX2JvZHkgPSAkb3B0WyJpbmNsdWRlX2JvZHkiXTsKICAgICRodHRwLT5oZWFkZXJfaGFuZGxlID0gJG9wdFsiaGVhZGVyX2hhbmRsZSJdOwogICAgJGh0dHAtPm91dHB1dF9oYW5kbGUgPSAkb3B0WyJvdXRwdXRfaGFuZGxlIl07CiAgICAkaHR0cC0+cmFuZ2UgPSAkb3B0WyJyYW5nZSJdOwogICAgCiAgICAvL3Zhcl9kdW1wKCRodHRwLT5oZWFkZXJzX29ubHkpOwogICAgLy92YXJfZHVtcCgkaHR0cC0+aW5jbHVkZV9oZWFkZXJzKTsKICAgIAogICAgaWYgKCRvcHRbInBvc3QiXSkgCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRbInBvc3RkYXRhIl0pKQogICAgICAgIHsKICAgICAgICAgICAgJGRhdGEgPSAkaHR0cC0+bWFrZV9xdWVyeV9zdHJpbmcoJG9wdFsicG9zdGRhdGEiXSk7CiAgICAgICAgICAgICRyZXMgPSAkaHR0cC0+cG9zdCgkdXJsLCRkYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAkcmVzID0gJGh0dHAtPnBvc3QoJHVybCwkb3B0WyJwb3N0ZGF0YSJdKTsKICAgICAgICAgICAgCiAgICB9IGVsc2VpZiAoJG9wdFsibWV0aG9kIl0pIHsKICAgICAgICAkcmVzID0gJGh0dHAtPmN1c3RvbSgkb3B0WyJtZXRob2QiXSwkdXJsLCRvcHRbInBvc3RkYXRhIl0pOwogICAgfSBlbHNlIHsKICAgICAgICAkcmVzID0gJGh0dHAtPmdldCgkdXJsKTsKICAgIH0KICAgIAogICAgLy9pZiAoc3RycG9zKCR1cmwsICJ0ZXN0IikgIT09IEZBTFNFKQogICAgLy97CiAgICAvLyAgICBlY2hvICI9PT0iOwogICAgLy8gICAgdmFyX2R1bXAoJG9wdFsicG9zdCJdKTsKICAgIC8vICAgIHZhcl9kdW1wKCRvcHRbIm1ldGhvZCJdKTsKICAgIC8vICAgIHZhcl9kdW1wKCRvcHQpOwogICAgLy8gICAgZXhpdDsKICAgIC8vfQogICAgCiAgICAgICAgLy9pZiAoJG9wdFsib3V0cHV0X2hhbmRsZSJdICYmICRvcHRbInJhbmdlIl0pCiAgICAgICAgLy97CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2VjaG8gJG9wdFsicmFuZ2UiXTsKICAgICAgICAgICAvLyBleGl0OwogICAgICAgIC8vfQogICAgICAgIAogICAgLy8gY2hlY2sgZm9yIGVycm9ycwogICAgLy8kb3B0WyJlcnJubyJdID0gKCEkcmVzICYmICRodHRwLT5lcnJubykgPyAkaHR0cC0+ZXJyb3JubyA6IDA7CiAgICAkb3B0WyJlcnJubyJdID0gKCEkcmVzICYmICRodHRwLT5lcnJubykgPyAkaHR0cC0+ZXJybm8gOiAwOwogICAgaWYgKCRvcHRbImVycm5vIl0pICRvcHRbImVycm9yIl0gPSAkaHR0cC0+ZXJyb3I7CiAgICAKICAgIC8vIGRpZSBpZiBDVVJMT1BUX0ZBSUxPTkVSUk9SIGlzIHNldCBhbmQgdGhlIEhUVFAgcmVzdWx0IGNvZGUgaXMgZ3JlYXRlciB0aGFuIDMwMAogICAgaWYgKCRvcHRbImZhaWxfb25fZXJyb3IiXSkgewogICAgICAgIGlmICgkaHR0cC0+cmVzdWx0X2NvZGU+MzAwKSBkaWU7CiAgICB9CiAgICAKICAgICRvcHRbInN0YXRzIl0gPSAkaHR0cC0+c3RhdHM7CgogICAgJGhlYWRlcnMgPSAiIjsKICAgIAogICAgLy8gZS12aXNpb24KICAgIC8vdmFyX2R1bXAoJGh0dHAtPnJlc3BvbnNlX2hlYWRlcnMpOwogICAgaWYgKGlzX2FycmF5KCRodHRwLT5yZXNwb25zZV9oZWFkZXJzKSkKICAgIHsKICAgICAgICBmb3JlYWNoICgkaHR0cC0+cmVzcG9uc2VfaGVhZGVycyBhcyAkaz0+JHYpIHsKICAgICAgICAgICAgaWYgKCRrKQogICAgICAgICAgICAgICAgJGhlYWRlcnMgLj0gIiRrOiAkdlxuIjsKICAgICAgICB9CiAgICAgICAgJGhlYWRlcnMgPSAiSFRUUC8xLjEgIi4kaHR0cC0+cmVzdWx0X2NvZGUuIlxuIi4kaGVhZGVyczsKICAgICAgICAvL3Zhcl9kdW1wKCRoZWFkZXJzKTsKICAgIH0KICAgIAogICAgLy8gaWYgYSBmaWxlIGhhbmRsZSB3YXMgcHJvdmlkZWQgZm9yIGhlYWRlciBvdXRwdXQsIGV4dHJhY3QgdGhlIGhlYWRlcnMKICAgIC8vIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBoYW5kbGUKICAgIGlmIChpc3NldCgkb3B0WyJoZWFkZXJfaGFuZGxlIl0pKSB7CiAgICAgICAgZndyaXRlKCRvcHRbImhlYWRlcl9oYW5kbGUiXSwkaGVhZGVycyk7CiAgICB9CiAgICAvL3Zhcl9kdW1wKCRodHRwLT5yZXNwb25zZSk7CiAgICAKICAgIC8vJG91dHB1dCA9ICgkb3B0WyJpbmNsdWRlX2hlYWRlcnMiXSAmJiAkaGVhZGVycyA/ICRoZWFkZXJzLiJcclxuIiA6ICIiKSAuICgkb3B0WyJpbmNsdWRlX2JvZHkiXSA/ICRodHRwLT5yZXNwb25zZSA6ICIiKTsKICAgIC8vIGUtdmlzaW9uCiAgICAvLyRvdXRwdXQgPSAkaHR0cC0+cmVzcG9uc2U7CiAgICAKICAgIC8vIGt2dWxpIGRlbW8xLnB1amNvdm5hd2VidS5jegogICAgLy8kb3V0cHV0ID0gKCRvcHRbImluY2x1ZGVfaGVhZGVycyJdICYmICRoZWFkZXJzID8gJGhlYWRlcnMuIlxyXG4iIDogIiIpIC4gJGh0dHAtPnJlc3BvbnNlOwogICAgJG91dHB1dCA9ICgkb3B0WyJpbmNsdWRlX2hlYWRlcnMiXSAmJiAkaGVhZGVycyA/ICRoZWFkZXJzLiJcbiIgOiAiIikgLiAoJG9wdFsiaW5jbHVkZV9ib2R5Il0gPyAkaHR0cC0+cmVzcG9uc2UgOiAiIik7CiAgICAvLyRvdXRwdXQgPSAkaHR0cC0+cmVzcG9uc2U7CiAgICAKICAgIC8vdmFyX2R1bXAoJGhlYWRlcnMpOwogICAgLy92YXJfZHVtcCgkaHR0cC0+cmVzcG9uc2UpOwogICAgLy92YXJfZHVtcCgkb3V0cHV0KTsKICAgIAogICAgLy8gaWYgYSBmaWxlIGhhbmRsZSB3YXMgcHJvdmlkZWQgZm9yIG91dHB1dCwgd3JpdGUgdGhlIG91dHB1dCB0byBpdAogICAgaWYgKGlzc2V0KCRvcHRbIm91dHB1dF9oYW5kbGUiXSkpIHsKICAgICAgICAvL2Z3cml0ZSgkb3B0WyJvdXRwdXRfaGFuZGxlIl0sJG91dHB1dCk7CiAgICAgICAgCiAgICAvLyBpZiB0aGUgY2FsbGVyIHJlcXVlc3RlZCB0aGF0IHRoZSByZXNwb25zZSBiZSByZXR1cm5lZCwgcmV0dXJuIGl0CiAgICB9IGVsc2VpZiAoJG9wdFsicmV0dXJuX3RyYW5zZmVyIl0pIHsKICAgICAgICByZXR1cm4gJG91dHB1dDsKICAgICAgICAKICAgIC8vIG90aGVyd2lzZSwganVzdCBlY2hvIHRoZSBvdXRwdXQgdG8gc3Rkb3V0CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gJG91dHB1dDsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBfX2N1cmxfY2xvc2UoJGNoKSB7CiAgICAkb3B0ID0gJiRHTE9CQUxTWyJfQ1VSTE5BVF9PUFQiXVskY2hdOwogICAgCiAgICBpZiAoJG9wdFsic2V0dGluZ3MiXSkgewogICAgICAgICRzZXR0aW5ncyA9ICYkb3B0WyJzZXR0aW5ncyJdOwogICAgICAgIC8vIGlmIHRoZSB1c2VyIHVzZWQgQ1VSTE9QVF9JTkZJTEUgdG8gc3BlY2lmeSBhIGZpbGUgdG8gdXBsb2FkLCByZW1vdmUgdGhlCiAgICAgICAgLy8gdGVtcG9yYXJ5IGZpbGUgY3JlYXRlZCBmb3IgdGhlIENVUkwgYmluYXJ5CiAgICAgICAgaWYgKCRzZXR0aW5nc1sidXBsb2FkLWZpbGUiXVsidmFsdWUiXSAmJiBmaWxlX2V4aXN0cygkc2V0dGluZ3NbInVwbG9hZC1maWxlIl1bInZhbHVlIl0pKSB1bmxpbmsoJHNldHRpbmdzWyJ1cGxvYWQtZmlsZSJdWyJ2YWx1ZSJdKTsKICAgIH0KCiAgICB1bnNldCgkR0xPQkFMU1siX0NVUkxOQVRfT1BUIl1bJGNoXSk7Cn0KCmZ1bmN0aW9uIF9fY3VybF9lcnJubygkY2gpIHsKICAgIHJldHVybiAoaW50KSAkR0xPQkFMU1siX0NVUkxOQVRfT1BUIl1bJGNoXVsiZXJybm8iXTsKfQoKZnVuY3Rpb24gX19jdXJsX2Vycm9yKCRjaCkgewogICAgcmV0dXJuICRHTE9CQUxTWyJfQ1VSTE5BVF9PUFQiXVskY2hdWyJlcnJvciJdOwp9CgpmdW5jdGlvbiBfX2N1cmxfZ2V0aW5mbygkY2gsJG9wdD1OVUxMKSB7CiAgICBpZiAoJG9wdCkgewogICAgICAgICRjdXJsaW5mb190YWdzID0gYXJyYXkoCiAgICAgICAgICAgIENVUkxJTkZPX0VGRkVDVElWRV9VUkw9PiJ1cmwiLAogICAgICAgICAgICBDVVJMSU5GT19DT05URU5UX1RZUEU9PiJjb250ZW50X3R5cGUiLAogICAgICAgICAgICBDVVJMSU5GT19IVFRQX0NPREU9PiJodHRwX2NvZGUiLAogICAgICAgICAgICBDVVJMSU5GT19IRUFERVJfU0laRT0+ImhlYWRlcl9zaXplIiwKICAgICAgICAgICAgQ1VSTElORk9fUkVRVUVTVF9TSVpFPT4icmVxdWVzdF9zaXplIiwKICAgICAgICAgICAgQ1VSTElORk9fRklMRVRJTUU9PiJmaWxldGltZSIsCiAgICAgICAgICAgIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQ9PiJzc2xfdmVyaWZ5X3Jlc3VsdCIsCiAgICAgICAgICAgIENVUkxJTkZPX1JFRElSRUNUX0NPVU5UPT4icmVkaXJlY3RfY291bnQiLAogICAgICAgICAgICBDVVJMSU5GT19UT1RBTF9USU1FPT4idG90YWxfdGltZSIsCiAgICAgICAgICAgIENVUkxJTkZPX05BTUVMT09LVVBfVElNRT0+Im5hbWVsb29rdXBfdGltZSIsCiAgICAgICAgICAgIENVUkxJTkZPX0NPTk5FQ1RfVElNRT0+ImNvbm5lY3RfdGltZSIsCiAgICAgICAgICAgIENVUkxJTkZPX1BSRVRSQU5TRkVSX1RJTUU9PiJwcmV0cmFuc2Zlcl90aW1lIiwKICAgICAgICAgICAgQ1VSTElORk9fU0laRV9VUExPQUQ9PiJzaXplX3VwbG9hZCIsCiAgICAgICAgICAgIENVUkxJTkZPX1NJWkVfRE9XTkxPQUQ9PiJzaXplX2Rvd25sb2FkIiwKICAgICAgICAgICAgQ1VSTElORk9fU1BFRURfRE9XTkxPQUQ9PiJzcGVlZF9kb3dubG9hZCIsCiAgICAgICAgICAgIENVUkxJTkZPX1NQRUVEX1VQTE9BRD0+InNwZWVkX3VwbG9hZCIsCiAgICAgICAgICAgIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEPT4iZG93bmxvYWRfY29udGVudF9sZW5ndGgiLAogICAgICAgICAgICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQ9PiJ1cGxvYWRfY29udGVudF9sZW5ndGgiLAogICAgICAgICAgICBDVVJMSU5GT19TVEFSVFRSQU5TRkVSX1RJTUU9PiJzdGFydHRyYW5zZmVyX3RpbWUiLAogICAgICAgICAgICBDVVJMSU5GT19SRURJUkVDVF9USU1FPT4icmVkaXJlY3RfdGltZSIKICAgICAgICApOwogICAgICAgIAogICAgICAgICRrZXkgPSAkY3VybGluZm9fdGFnc1skb3B0XTsKICAgICAgICByZXR1cm4gJEdMT0JBTFNbIl9DVVJMTkFUX09QVCJdWyRjaF1bInN0YXRzIl1bJGtleV07CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkR0xPQkFMU1siX0NVUkxOQVRfT1BUIl1bJGNoXVsic3RhdHMiXTsKICAgIH0KfQoKZnVuY3Rpb24gX19jdXJsX3ZlcnNpb24oKSB7CiAgICByZXR1cm4gImxpYmN1cmxlbXUvIi5DVVJMTkFUX1ZFUlNJT04uIi1uYXQiOwp9CgoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCJjdXJsIikgJiYgIWZ1bmN0aW9uX2V4aXN0cygiY3VybF9pbml0IikpIAp7CiAgICBkZWZpbmUoIkNVUkxfRU1VTEFURUQiLCB0cnVlKTsKICAgIAogICAgZnVuY3Rpb24gY3VybF9nZXRpbmZvKCRjaCwkb3B0PU5VTEwpIHsKICAgICAgICByZXR1cm4oX19jdXJsX2dldGluZm8oJGNoLCRvcHQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjdXJsX3ZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuKF9fY3VybF92ZXJzaW9uKCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1cmxfZXJybm8oJGNoKSB7CiAgICAgICAgcmV0dXJuKF9fY3VybF9lcnJubygkY2gpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjdXJsX2Vycm9yKCRjaCkgewogICAgICAgIHJldHVybihfX2N1cmxfZXJyb3IoJGNoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3VybF9jbG9zZSgkY2gpIHsKICAgICAgICByZXR1cm4oX19jdXJsX2Nsb3NlKCRjaCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1cmxfZXhlYygkY2gpIHsKICAgICAgICByZXR1cm4oX19jdXJsX2V4ZWMoJGNoKSk7CiAgICB9ICAgIAogICAgICAgIAogICAgZnVuY3Rpb24gY3VybF9pbml0KCkgewogICAgICAgIHJldHVybihfX2N1cmxfaW5pdCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjdXJsX3NldG9wdCgkY2gsJG9wdGlvbiwkdmFsdWUpIHsKICAgICAgICByZXR1cm4oX19jdXJsX3NldG9wdCgkY2gsJG9wdGlvbiwkdmFsdWUpKTsKICAgIH0KfQoKZnVuY3Rpb24gX2N1cmxfZ2V0aW5mbygkY2gsJG9wdD1OVUxMKSB7CiAgICBpZiAoX2N1cmxfZGlzYWJsZWQoKSkKICAgICAgICByZXR1cm4oX19jdXJsX2dldGluZm8oJGNoLCRvcHQpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oY3VybF9nZXRpbmZvKCRjaCwkb3B0KSk7Cn0KCmZ1bmN0aW9uIF9jdXJsX3ZlcnNpb24oKSB7CiAgICBpZiAoX2N1cmxfZGlzYWJsZWQoKSkKICAgICAgICByZXR1cm4oX19jdXJsX3ZlcnNpb24oKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGN1cmxfdmVyc2lvbigpKTsKfQoKZnVuY3Rpb24gX2N1cmxfZXJybm8oJGNoKSB7CiAgICBpZiAoX2N1cmxfZGlzYWJsZWQoKSkKICAgICAgICByZXR1cm4oX19jdXJsX2Vycm5vKCRjaCkpOwogICAgZWxzZQogICAgICAgIHJldHVybihjdXJsX2Vycm5vKCRjaCkpOwp9CgpmdW5jdGlvbiBfY3VybF9lcnJvcigkY2gpIHsKICAgIGlmIChfY3VybF9kaXNhYmxlZCgpKQogICAgICAgIHJldHVybihfX2N1cmxfZXJyb3IoJGNoKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGN1cmxfZXJyb3IoJGNoKSk7Cn0KCmZ1bmN0aW9uIF9jdXJsX2Nsb3NlKCRjaCkgewogICAgaWYgKF9jdXJsX2Rpc2FibGVkKCkpCiAgICAgICAgcmV0dXJuKF9fY3VybF9jbG9zZSgkY2gpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oY3VybF9jbG9zZSgkY2gpKTsKfQoKZnVuY3Rpb24gX2N1cmxfZXhlYygkY2gpIHsKICAgIGlmIChfY3VybF9kaXNhYmxlZCgpKQogICAgICAgIHJldHVybihfX2N1cmxfZXhlYygkY2gpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oY3VybF9leGVjKCRjaCkpOwp9ICAgIAogICAgCmZ1bmN0aW9uIF9jdXJsX2luaXQoJHVybD0iIikgewogICAgaWYgKF9jdXJsX2Rpc2FibGVkKCkpCiAgICAgICAgcmV0dXJuKF9fY3VybF9pbml0KCR1cmwpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oY3VybF9pbml0KCR1cmwpKTsKfQoKZnVuY3Rpb24gX2N1cmxfc2V0b3B0KCRjaCwkb3B0aW9uLCR2YWx1ZSkgewogICAgaWYgKF9jdXJsX2Rpc2FibGVkKCkpCiAgICAgICAgcmV0dXJuKF9fY3VybF9zZXRvcHQoJGNoLCRvcHRpb24sJHZhbHVlKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGN1cmxfc2V0b3B0KCRjaCwkb3B0aW9uLCR2YWx1ZSkpOwp9CgpmdW5jdGlvbiBfY3VybF9zZXRvcHRfYXJyYXkoJGNoLCRvcHRpb25zKSB7CiAgICBpZiAoX2N1cmxfZGlzYWJsZWQoKSkKICAgICAgICByZXR1cm4oX19jdXJsX3NldG9wdF9hcnJheSgkY2gsJG9wdGlvbnMpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oY3VybF9zZXRvcHRfYXJyYXkoJGNoLCRvcHRpb25zKSk7Cn0KCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvU3lzdGVtL1N5c3RlbS5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBUU3lzdGVtIGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgCn0gIAoKZnVuY3Rpb24gZGVsZXRlT2JqZWN0KCYkb2JqZWN0LCAmJHBhcmVudFZhck9iamVjdHM9YXJyYXkoKSkKewogICAgZnJlZU9iamVjdCgkb2JqZWN0LCAkcGFyZW50VmFyT2JqZWN0cyk7Cn0KCmZ1bmN0aW9uIGRlbGV0ZUFsbE9iamVjdHMoJHNraXA9YXJyYXkoKSkKewogICAgZ2xvYmFsICRfX19hbGxPYmplY3RzOwogICAgCiAgICBmb3JlYWNoKCRfX19hbGxPYmplY3RzIGFzICRvYmplY3ROYW1lID0+ICRvYmplY3QpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkb2JqZWN0TmFtZSwgJHNraXApKQogICAgICAgIHsKICAgICAgICAgICAgZnJlZU9iamVjdCgkb2JqZWN0KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICRvYmplY3ROYW1lcyA9IGFycmF5X2tleXMoJF9fX2FsbE9iamVjdHMpOwogICAgZm9yZWFjaCgkb2JqZWN0TmFtZXMgYXMgJG9iamVjdE5hbWUpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkb2JqZWN0TmFtZSwgJHNraXApKQogICAgICAgIHsKICAgICAgICAgICAgdW5zZXQoJF9fX2FsbE9iamVjdHNbJG9iamVjdE5hbWVdKTsKICAgICAgICAgICAgJF9fX2FsbE9iamVjdHNbJG9iamVjdE5hbWVdID0gTlVMTDsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGZyZWVPYmplY3QoJiRvYmplY3QsICYkcGFyZW50VmFyT2JqZWN0cz1hcnJheSgpKSAvLyBDQUxMIFRISVMgVE8gQVZPSUQgTUVNT1JZIExFQUtTIERVRSBUTyBDUk9TUyBSRUZFUkVOQ0UKewogICAgaWYgKGlzX29iamVjdCgkb2JqZWN0KSAmJiBpbl9hcnJheSgiX19kZXN0cnVjdCIsIGdldF9jbGFzc19tZXRob2RzKCRvYmplY3QpKSkKICAgIHsKICAgICAgICAkb2JqZWN0LT5fX2Rlc3RydWN0KCk7CiAgICB9CiAgICAKICAgICRvYmplY3RWYXJzID0gQGdldF9vYmplY3RfdmFycygkb2JqZWN0KTsKICAgICRwYXJlbnRWYXJPYmplY3RzW10gPSAoaXNfb2JqZWN0KCRvYmplY3QpICYmIGZ1bmN0aW9uX2V4aXN0cygic3BsX29iamVjdF9oYXNoIikgPyBzcGxfb2JqZWN0X2hhc2goJG9iamVjdCkgOiAoc3RyaW5nKSRvYmplY3QpOwoKICAgIGlmIChpc19hcnJheSgkb2JqZWN0VmFycykpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJG9iamVjdFZhcnMgYXMgJG9iamVjdFZhck5hbWUgPT4gJG9iamVjdFZhclZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkb2JqZWN0VmFyVmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KChpc19vYmplY3QoJG9iamVjdFZhclZhbHVlKSAgJiYgZnVuY3Rpb25fZXhpc3RzKCJzcGxfb2JqZWN0X2hhc2giKSA/IHNwbF9vYmplY3RfaGFzaCgkb2JqZWN0VmFyVmFsdWUpIDogKHN0cmluZykkb2JqZWN0VmFyVmFsdWUpLCAkcGFyZW50VmFyT2JqZWN0cykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZnJlZU9iamVjdCgkb2JqZWN0VmFyVmFsdWUsICRwYXJlbnRWYXJPYmplY3RzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdFZhclZhbHVlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkb2JqZWN0VmFyVmFsdWUgYXMgJF9vYmplY3RWYXJWYWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCRfb2JqZWN0VmFyVmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgoaXNfb2JqZWN0KCRfb2JqZWN0VmFyVmFsdWUpICYmIGZ1bmN0aW9uX2V4aXN0cygic3BsX29iamVjdF9oYXNoIikgPyBzcGxfb2JqZWN0X2hhc2goJF9vYmplY3RWYXJWYWx1ZSkgOiAoc3RyaW5nKSRfb2JqZWN0VmFyVmFsdWUpLCAkcGFyZW50VmFyT2JqZWN0cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVPYmplY3QoJF9vYmplY3RWYXJWYWx1ZSwgJHBhcmVudFZhck9iamVjdHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkb2JqZWN0LT4kb2JqZWN0VmFyTmFtZSA9IE5VTEw7CiAgICAgICAgICAgIHVuc2V0KCRvYmplY3QtPiRvYmplY3RWYXJOYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAkb2JqZWN0ID0gTlVMTDsKICAgIHVuc2V0KCRvYmplY3QpOwp9CgpmdW5jdGlvbiBnZXRNaWNyb1RpbWUoKQp7CiAgICAkdG1wPWV4cGxvZGUoIiAiLG1pY3JvdGltZSgpKTsKICAgICRydD0kdG1wWzBdKyR0bXBbMV07CiAgICByZXR1cm4gJHJ0Owp9CgpmdW5jdGlvbiBnZXRNZW1vcnlVc2FnZSgkcmVhbD1mYWxzZSkKewogICAgZ2xvYmFsICRzdGFydE1lbW9yeVVzYWdlOwogICAgaWYgKGlzV2luZG93cygpKQogICAgICAgIHJldHVybihnZXRXaW5kb3dzTWVtb3J5VXNhZ2UoKS0kc3RhcnRNZW1vcnlVc2FnZSk7CiAgICBlbHNlIGlmICgkcmVhbCAmJiBmdW5jdGlvbl9leGlzdHMoIm1lbW9yeV9nZXRfcGVha191c2FnZSIpKQogICAgewogICAgICAgIHJldHVybiAobWVtb3J5X2dldF9wZWFrX3VzYWdlKCkpOwogICAgfQogICAgZWxzZSBpZiAoZnVuY3Rpb25fZXhpc3RzKCJtZW1vcnlfZ2V0X3VzYWdlIikpCiAgICB7CiAgICAgICAgcmV0dXJuIChtZW1vcnlfZ2V0X3VzYWdlKCkpOwogICAgfQogICAgZWxzZSAKICAgICAgICByZXR1cm4oMCk7Cn0KCmZ1bmN0aW9uIGlzV2luZG93cygpCnsKICAgIHJldHVybihzdWJzdHIoUEhQX09TLDAsMykgPT0gJ1dJTicpOwp9CgpmdW5jdGlvbiBnZXRXaW5kb3dzTWVtb3J5VXNhZ2UoKQp7CiAgICByZXR1cm4oMCk7ICAgICAgICAKICAgIAogICAgJG91dHB1dCA9IGFycmF5KCk7CiAgICBleGVjKCd0YXNrbGlzdCAvRkkgIlBJRCBlcSAnIC4gZ2V0bXlwaWQoKSAuICciIC9GTyBMSVNUJywgJG91dHB1dCk7CgogICAgJG1lbW9yeVVzYWdlID0gc3Vic3RyKCRvdXRwdXRbNV0sIHN0cnBvcygkb3V0cHV0WzVdLCAnOicpICsgMSk7CiAgICAkbWVtb3J5VXNhZ2UgPSBzdHJfcmVwbGFjZSgi77+9IiwgIiIsICRtZW1vcnlVc2FnZSk7CiAgICAkbWVtb3J5VXNhZ2UgPSBzdHJfcmVwbGFjZSgiICIsICIiLCAkbWVtb3J5VXNhZ2UpOwogICAgaWYgKHN0cnBvcygkbWVtb3J5VXNhZ2UsICJrQiIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAkbWVtb3J5VXNhZ2UgPSBzdHJfcmVwbGFjZSgia0IiLCAiIiwgJG1lbW9yeVVzYWdlKTsKICAgICAgICBzZXR0eXBlKCRtZW1vcnlVc2FnZSwgImludGVnZXIiKTsKICAgICAgICAkbWVtb3J5VXNhZ2UgKj0gMTAyNDsgICAgICAgIAogICAgfQogICAgLy8yMO+/vTgzNiBrQgogICAgc2V0dHlwZSgkbWVtb3J5VXNhZ2UsICJpbnRlZ2VyIik7CiAgICAKICAgIGR1bXAoJG1lbW9yeVVzYWdlKTsKICAgIHJldHVybiAoJG1lbW9yeVVzYWdlKTsKfQoKZnVuY3Rpb24gZ2V0RnVuY3Rpb25DYWxsKCRhc0FycmF5PWZhbHNlKQp7CiAgICAvLyBaUFVTT0JVSkUgUFJPQkxFTSBOQSBJR05VTQogICAgCiAgICAvLyBuZWtkeSB6cHVzb2J1amUgbWVtb3J5X2xpbWl0CiAgICBnbG9iYWwgJF9fZ2V0RnVuY3Rpb25DYWxsQ291bnRlciwgJF9fZXZhbENvZGVzOwogICAgJF9fZ2V0RnVuY3Rpb25DYWxsQ291bnRlcisrOwogICAgCiAgICAkZnVuY3Rpb25DYWxsID0gX2RlYnVnX2JhY2t0cmFjZSgpOwogICAgJGV2YWxJbmRleCA9IDA7CiAgICAKICAgIGZvciAoJGkgPSAxIDsgJGkgPCBjb3VudCgkZnVuY3Rpb25DYWxsKSA7ICRpKyspCiAgICB7CiAgICAgICAgJGNhbGwgPSAkZnVuY3Rpb25DYWxsWyRpXTsKICAgICAgICAKICAgICAgICAkX3N0ciA9ICRjYWxsWyJmdW5jdGlvbiJdLiIoKSBpbiBmaWxlICIuJGNhbGxbImZpbGUiXS4iIG9uIGxpbmUgIi4kY2FsbFsibGluZSJdLiI8YnIgLz4iOwogICAgICAgIGlmICgkY2FsbFsiZnVuY3Rpb24iXSA9PSAiaWV2YWwiKQogICAgICAgIHsKICAgICAgICAgICAgJF9zdHIgLj0gIjxiPlBIUCBjb2RlOjwvYj48YnIgLz48cHJlPiIuJF9fZXZhbENvZGVzW2NvdW50KCRfX2V2YWxDb2RlcyktMS0kZXZhbEluZGV4XS4iPC9wcmU+PGJyIC8+IjsKICAgICAgICAgICAgJGV2YWxJbmRleCsrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJGFzQXJyYXkpCiAgICAgICAgICAgICRzdHJbXSA9ICRfc3RyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHN0ciAuPSAkX3N0cjsKICAgIH0KICAgIAogICAgcmV0dXJuKCRzdHIpOwp9CgpmdW5jdGlvbiB0eXBlb2YoJHZhcmlhYmxlKQp7CiAgICBpZiAoaXNfYXJyYXkoJHZhcmlhYmxlKSkKICAgICAgICByZXR1cm4oImFycmF5Iik7CiAgICBlbHNlIGlmIChpc19vYmplY3QoJHZhcmlhYmxlKSkKICAgICAgICByZXR1cm4oIm9iamVjdCIpOwogICAgZWxzZSBpZiAoaXNfaW50KCR2YXJpYWJsZSkpCiAgICAgICAgcmV0dXJuKCJpbnRlZ2VyIik7CiAgICBlbHNlIGlmIChpc19mbG9hdCgkdmFyaWFibGUpKQogICAgICAgIHJldHVybigiZmxvYXQiKTsKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkdmFyaWFibGUpKQogICAgICAgIHJldHVybigic3RyaW5nIik7CiAgICBlbHNlIGlmIChpc19ib29sKCR2YXJpYWJsZSkpCiAgICAgICAgcmV0dXJuKCJib29sIik7CiAgICBlbHNlIGlmIChpc19yZXNvdXJjZSgkdmFyaWFibGUpKQogICAgICAgIHJldHVybigicmVzb3VyY2UiKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oInVua25vd24iKTsKfQoKZnVuY3Rpb24gZXhlY0NvbW1hbmQoJGNtZCwmJGVycm9ycz0iX19OT1RfU0VUX18iLCYkY29kZT1OVUxMKSAKewogICAgaWYgKGlzV2luZG93cygpKQogICAgewogICAgICAgIC8vZXhlYygic3RhcnQgL0IgXCJ3aW5kb3dfbmFtZVwiIFwiIi4kY21kLiJcIiIsJG91dHB1dCwkY29kZSk7CiAgICAKICAgICAgICAvLyBydW5zIGEgY29tbWFuZCBsaW5lIGFuZCByZXR1cm5zCiAgICAgICAgLy8gdGhlIG91dHB1dCBldmVuIGZvciBXaW5kIFhQIFNQMgogICAgICAgIC8vIGV4YW1wbGU6ICRjbWQgPSAiZnVsbHBhdGguZXhlIC1hcmcxIC1hcmcyIgogICAgICAgIC8vICRvdXRwdXRTdHJpbmcgPSB3aW5kRXhlYygkY21kLCJDOlxcbXlfYWx0ZXJuYXRlXFxwYXRoX3RvXFxhX3RtcF9maWxlLnR4dCIpOwoKICAgICAgICAvLyBTZXR1cCB0aGUgY29tbWFuZCB0byBydW4gZnJvbSAicnVuIgogICAgICAgICRvdXRwdXRmaWxlID0gTUFJTlBBVEguInJlcG9zaXRvcnkvdGVtcC8iLlVVSUQoKTsKICAgICAgICAvLyRjbWRsaW5lID0gImNtZCAvQyBcIiRjbWRcIiA+ICRvdXRwdXRmaWxlIiA7CiAgICAgICAgJGNtZGxpbmUgPSAiY21kIC9DICIuJGNtZC4iID4gXCIiLiRvdXRwdXRmaWxlLiJfc3Rkb3V0XCIgMj4gXCIiLiRvdXRwdXRmaWxlLiJfc3RkZXJyXCIiIDsKCiAgICAgICAgLy9lY2hvICRjbWRsaW5lOwogICAgICAgIC8vIE1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENPTSBvYmplY3QKICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCJDT00iKSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICAgICAgJFdzaFNoZWxsID0gbmV3IENPTSAoICJXU2NyaXB0LlNoZWxsIiApOwogICAgICAgICAgICAgICAgJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAgICAgICAgIGlmICgkZXJyb3JzID09ICIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNvbW1hbmQgd2luZG93IGJ1dCBkb250IHNob3cgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgJG9FeGVjID0gJFdzaFNoZWxsLT5SdW4gKCAkY21kbGluZSAsIDAgLCB0cnVlICk7CgogICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gX2ZpbGVfZ2V0X2NvbnRlbnRzKCRvdXRwdXRmaWxlLiJfc3Rkb3V0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yID0gX2ZpbGVfZ2V0X2NvbnRlbnRzKCRvdXRwdXRmaWxlLiJfc3RkZXJyIik7CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAvLyRvdXRwdXQgPSBpY29udigid2luZG93cy0xMjUwIiwgInV0Zi04IiwgJG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgLy8kZXJyb3JzID0gaWNvbnYoIndpbmRvd3MtMTI1MCIsICJ1dGYtOCIsICRlcnJvcnMpOwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKCRvdXRwdXRmaWxlLiJfc3Rkb3V0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKCRvdXRwdXRmaWxlLiJfc3RkZXJyIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uICRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiZXhlY0NvbW1hbmQ6ICIuJGUtPmdldE1lc3NhZ2UoKSwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiZXhlY0NvbW1hbmQgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHNlcnZlciIsIG10V2FybmluZyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAKICAgIHsKICAgICAgICBpZiAoIWlzRGlzYWJsZWRGdW5jdGlvbigicHJvY19vcGVuIikpCiAgICAgICAgewogICAgICAgICAgICAkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKICAgICAgICAgICAgMCA9PiBhcnJheSgicGlwZSIsICJyIiksICAvLyBzdGRpbiBpcyBhIHBpcGUgdGhhdCB0aGUgY2hpbGQgd2lsbCByZWFkIGZyb20KICAgICAgICAgICAgMSA9PiBhcnJheSgicGlwZSIsICJ3IiksICAvLyBzdGRvdXQgaXMgYSBwaXBlIHRoYXQgdGhlIGNoaWxkIHdpbGwgd3JpdGUgdG8KICAgICAgICAgICAgMiA9PiBhcnJheSgicGlwZSIsICJ3IikgLy8gc3RkZXJyIGlzIGEgZmlsZSB0byB3cml0ZSB0bwogICAgICAgICAgICApOwoKICAgICAgICAgICAgJHBpcGVzPSBhcnJheSgpOwogICAgICAgICAgICAkcHJvY2VzcyA9IHByb2Nfb3BlbigkY21kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7CgogICAgICAgICAgICAkb3V0cHV0ID0gIiI7CiAgICAgICAgICAgICRlcnJvciA9ICIiOwoKICAgICAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkcHJvY2VzcykpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgICNjbG9zZSBjaGlsZCdzIGlucHV0IGltaWRpYXRlbHkKICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1swXSk7CgogICAgICAgICAgICBzdHJlYW1fc2V0X2Jsb2NraW5nKCRwaXBlc1sxXSxmYWxzZSk7CiAgICAgICAgICAgIHN0cmVhbV9zZXRfYmxvY2tpbmcoJHBpcGVzWzJdLGZhbHNlKTsKCiAgICAgICAgICAgICR0b2RvID0gYXJyYXkoJHBpcGVzWzFdLCRwaXBlc1syXSk7CgogICAgICAgICAgICAvLyBUT0RPIC0gcHJpZGF0IHNlbSB0aW1lb3V0CiAgICAgICAgICAgIHdoaWxlKCB0cnVlICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlYWQ9IGFycmF5KCk7CiAgICAgICAgICAgICAgICBpZiggIWZlb2YoJHBpcGVzWzFdKSApICRyZWFkW109ICRwaXBlc1sxXTsKICAgICAgICAgICAgICAgIGlmKCAhZmVvZigkcGlwZXNbMl0pICkgJHJlYWRbXT0gJHBpcGVzWzJdOwoKICAgICAgICAgICAgICAgIGlmICghJHJlYWQpIGJyZWFrOwoKICAgICAgICAgICAgICAgICRyZWFkeSA9IHN0cmVhbV9zZWxlY3QoJHJlYWQsICR3cml0ZT1OVUxMLCAkZXg9IE5VTEwsIDEpOwoKICAgICAgICAgICAgICAgIGlmICgkcmVhZHkgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAjc2hvdWxkIG5ldmVyIGhhcHBlbiAtIHNvbWV0aGluZyBkaWVkCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJlYWQgYXMgJHIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHMgPSBmcmVhZCgkciwxMDI0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHIgPT0gJHBpcGVzWzFdKQogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgLj0gJHM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRyID09ICRwaXBlc1syXSkKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgLj0gJHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vZHVtcCgkb3V0cHV0KTsKICAgICAgICAgICAgLy9kdW1wKCRlcnJvcik7CiAgICAgICAgICAgIAogICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzFdKTsKICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1syXSk7CgogICAgICAgICAgICAkY29kZSA9IHByb2NfY2xvc2UoJHByb2Nlc3MpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiZXhlY0NvbW1hbmQgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHNlcnZlciIsIG10V2FybmluZyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCRlcnJvcnMgIT0gIl9fTk9UX1NFVF9fIikKICAgIHsKICAgICAgICAkZXJyb3JzID0gJGVycm9yOwogICAgICAgIC8vcmV0dXJuKCRvdXRwdXQpOwogICAgfQogICAgLy9lbHNlCiAgICAvLyAgICByZXR1cm4gKCRvdXRwdXQuJGVycm9yKTsKICAgIAogICAgcmV0dXJuKCRvdXRwdXQpOwp9CiAgIAovLyBnZXQgc3lzdGVtIHRlbXAgZGlyZWN0b3J5CmlmICggIWZ1bmN0aW9uX2V4aXN0cygnc3lzX2dldF90ZW1wX2RpcicpICkgLy8gPCBwaHAgNS4yLjEKewogICBmdW5jdGlvbiBzeXNfZ2V0X3RlbXBfZGlyKCkKICAgewogICAgICAgLy8gVHJ5IHRvIGdldCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgICBpZiAoICFlbXB0eSgkX0VOVlsnVE1QJ10pICkKICAgICAgIHsKICAgICAgICAgICByZXR1cm4gcmVhbHBhdGgoICRfRU5WWydUTVAnXSApOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoICFlbXB0eSgkX0VOVlsnVE1QRElSJ10pICkKICAgICAgIHsKICAgICAgICAgICByZXR1cm4gcmVhbHBhdGgoICRfRU5WWydUTVBESVInXSApOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoICFlbXB0eSgkX0VOVlsnVEVNUCddKSApCiAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIHJlYWxwYXRoKCAkX0VOVlsnVEVNUCddICk7CiAgICAgICB9CgogICAgICAgLy8gRGV0ZWN0IGJ5IGNyZWF0aW5nIGEgdGVtcG9yYXJ5IGZpbGUKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgICAvLyBUcnkgdG8gdXNlIHN5c3RlbSdzIHRlbXBvcmFyeSBkaXJlY3RvcnkKICAgICAgICAgICAvLyBhcyByYW5kb20gbmFtZSBzaG91bGRuJ3QgZXhpc3QKICAgICAgICAgICAkdGVtcF9maWxlID0gdGVtcG5hbSggbWQ1KHVuaXFpZChyYW5kKCksIFRSVUUpKSwgJycgKTsKICAgICAgICAgICBpZiAoICR0ZW1wX2ZpbGUgKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgJHRlbXBfZGlyID0gcmVhbHBhdGgoIGRpcm5hbWUoJHRlbXBfZmlsZSkgKTsKICAgICAgICAgICAgICAgdW5saW5rKCAkdGVtcF9maWxlICk7CiAgICAgICAgICAgICAgIHJldHVybiAkdGVtcF9kaXI7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICB9CiAgICAgICB9CiAgIH0KfQoKZnVuY3Rpb24gc2V0VGltZW91dCgkc2Vjb25kcykKewogICAgaWYgKCRzZWNvbmRzID09IDApCiAgICAgICAgJHNlY29uZHMgPSA2MCo2MDsgLy8xaAogICAgCiAgICBpbmlfc2V0KCJtYXhfZXhlY3V0aW9uX3RpbWUiLCAoaW50KSRzZWNvbmRzKTsKfQoKZnVuY3Rpb24gc2V0TWVtb3J5TGltaXQoJG1lZ2FieXRlcykKewogICAgaWYgKCRtZWdhYnl0ZXMgPiAxMDI0KjEwMjQpIC8vIGJ5dGVzCiAgICAgICAgJG1lZ2FieXRlcyA9IHJvdW5kKCRtZWdhYnl0ZXMvMTAyNC8xMDI0KTsKICAgIAogICAgaWYgKCRtZWdhYnl0ZXMgPT0gMCkKICAgICAgICAkbWVnYWJ5dGVzID0gMTAyNDsgLy8xR0IKICAgIAogICAgJG9sZE1lbW9yeUxpbWl0ID0gZ2V0TWVtb3J5TGltaXQoKTsKICAgIGluaV9zZXQoIm1lbW9yeV9saW1pdCIsICRtZWdhYnl0ZXMuIk0iKTsKICAgIAogICAgcmV0dXJuKCRvbGRNZW1vcnlMaW1pdCAhPSBnZXRNZW1vcnlMaW1pdCgpKTsKfQoKCmZ1bmN0aW9uIGdldE1lbW9yeUxpbWl0KCkKewogICAgaWYgKGlzV2luZG93cygpKQogICAgICAgICRtZW1vcnlMaW1pdCA9ICI2NE0iOwogICAgZWxzZQogICAgICAgICRtZW1vcnlMaW1pdCA9IGluaV9nZXQoIm1lbW9yeV9saW1pdCIpOwogICAgICAgIAogICAgaWYgKCEkbWVtb3J5TGltaXQpCiAgICAgICAgJG1lbW9yeUxpbWl0ID0gIjY0TSI7CiAgICAKICAgIGlmIChzdHJwb3MoJG1lbW9yeUxpbWl0LCAiTSIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAkbWVtb3J5TGltaXQgPSBzdHJfcmVwbGFjZSgiTSIsICIiLCAkbWVtb3J5TGltaXQpOwogICAgICAgIHNldHR5cGUoJG1lbW9yeUxpbWl0LCAiaW50ZWdlciIpOwogICAgICAgICRtZW1vcnlMaW1pdCAqPSAxMDI0KjEwMjQ7CiAgICB9CgogICAgc2V0dHlwZSgkbWVtb3J5TGltaXQsICJpbnRlZ2VyIik7CiAgICByZXR1cm4oJG1lbW9yeUxpbWl0KTsKfQoKZnVuY3Rpb24gZ2V0VGltZVVzYWdlKCkKewogICAgZ2xvYmFsICRfX3NjcmlwdFN0YXJ0VGltZTsKICAgIAogICAgcmV0dXJuKHRpbWUoKS0kX19zY3JpcHRTdGFydFRpbWUpOwp9CgovLyBpbml0aWFsIG1lbW9yeSB1c2FnZSBmb3IgV2luZG93cwokc3RhcnRUaW1lVXNhZ2UgPSB0aW1lKCk7CgpmdW5jdGlvbiBnZXRUaW1lTGltaXQoKQp7CiAgICAkdGltZUxpbWl0ID0gaW5pX2dldCgibWF4X2V4ZWN1dGlvbl90aW1lIik7CiAgICAKICAgIHJldHVybigkdGltZUxpbWl0KTsKfQoKZnVuY3Rpb24gY2xlYW5MaW5rKCRsaW5rKQp7CiAgICAvLyBmb3IgV2luZG93cwogICAgJGxpbmsgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRsaW5rKTsKCiAgICAkb2xkTGluayA9ICIiOwogICAgd2hpbGUgKCRvbGRMaW5rICE9ICRsaW5rKQogICAgewogICAgICAgICRvbGRMaW5rID0gJGxpbms7CiAgICAgICAgJGxpbmsgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsICRsaW5rKTsKICAgIH0KCiAgICAkbGluayA9IHN0cl9yZXBsYWNlKCJodHRwOi8iLCAiaHR0cDovLyIsICRsaW5rKTsKICAgICRsaW5rID0gc3RyX3JlcGxhY2UoImh0dHBzOi8iLCAiaHR0cHM6Ly8iLCAkbGluayk7CiAgICAkbGluayA9IHN0cl9yZXBsYWNlKCJmdHA6LyIsICJmdHA6Ly8iLCAkbGluayk7CiAgICBpZiAoc3RycG9zKCRsaW5rLCAiZmlsZTovIikgPT09IDApCiAgICB7CiAgICAgICAgaWYgKGlzV2luZG93cygpKQogICAgICAgICAgICAkbGluayA9IHN0cl9yZXBsYWNlKCJmaWxlOi8iLCAiZmlsZTovLyIsICRsaW5rKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRsaW5rID0gc3RyX3JlcGxhY2UoImZpbGU6LyIsICJmaWxlOi8vLyIsICRsaW5rKTsKICAgIH0KICAgIHJldHVybigkbGluayk7Cn0KCmZ1bmN0aW9uIG5vdygkZGF0ZT10cnVlLCAkdGltZT10cnVlKQp7CiAgICAgcmV0dXJuKGRhdGUoKCRkYXRlID8gIlktbS1kICIgOiAiIikuKCR0aW1lID8gIkg6aTpzIiA6ICIiKSwgdGltZSgpKSk7Cn0KCmZ1bmN0aW9uIHRvZGF5KCkKewogICAgIHJldHVybihub3codHJ1ZSwgZmFsc2UpKTsKfQoKZnVuY3Rpb24gZ2V0QXBhY2hlQ29ubmVjdGlvblRpbWVvdXQoKQp7CiAgICBnbG9iYWwgJF9fYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQ7CgogICAgaWYgKCEkX19hcGFjaGVDb25uZWN0aW9uVGltZW91dCkKICAgIHsKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIHBocGluZm8oKTsKICAgICAgICAkcGhwSW5mbyA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIG9iX2VuZF9jbGVhbigpOwoKICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoJ3w8dHI+PHRkIGNsYXNzPSJlIj5UaW1lb3V0cyA8L3RkPjx0ZCBjbGFzcz0idiI+Q29ubmVjdGlvbjogKFteIF0rKSAtIEtlZXAtQWxpdmU6IDE1IDwvdGQ+PC90cj58aW1zJywgJHBocEluZm8sICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgICRfX2FwYWNoZUNvbm5lY3Rpb25UaW1lb3V0ID0gKGludCkkbWF0Y2hlc1swXVsxXTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRfX2FwYWNoZUNvbm5lY3Rpb25UaW1lb3V0ID0gNjA7IC8vIE5HSU5YLCAuLi4KICAgICAgICAKICAgIH0KCiAgICByZXR1cm4oJF9fYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQpOwp9CgpmdW5jdGlvbiBnZXRNYXhFeGVjdXRpb25UaW1lKCkKewogICAgcmV0dXJuKGdldFRpbWVMaW1pdCgpKTsKfQoKZnVuY3Rpb24gcHJvY19wcmlvcml0eSgkcHJpb3JpdHk9MCkKewogICAgaWYgKCRwcmlvcml0eSA8IDApCiAgICB7CiAgICAgICAgJG5pY2VQcmlvcml0eSA9IG1pbigxOSwgJHByaW9yaXR5KTsKICAgICAgICAkaW9uaWNlUHJpb3JpdHkgPSAzOwogICAgfQogICAgZWxzZSBpZiAoJHByaW9yaXR5ID4gMCkKICAgIHsKICAgICAgICAkbmljZVByaW9yaXR5ID0gbWF4KC0yMCwgJHByaW9yaXR5KTsKICAgICAgICAkaW9uaWNlUHJpb3JpdHkgPSAyOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICRuaWNlUHJpb3JpdHkgPSAwOwogICAgICAgICRpb25pY2VQcmlvcml0eSA9IDA7CiAgICB9CiAgICAKICAgIC8vIHRyeSB0byB1c2UgZXhlYyBjb21tYW5kCiAgICAvLyBuZXZlciBkbyBpdAogICAgLyoKICAgIG9iX3N0YXJ0KCk7CiAgICAkcmVzdWx0MSA9IGV4ZWNDb21tYW5kKCJyZW5pY2UgLW4gJG5pY2VQcmlvcml0eSAtcCAiLmdldG15cGlkKCkpOwogICAgJHJlc3VsdDIgPSBleGVjQ29tbWFuZCgiaW9uaWNlIC1jJGlvbmljZVByaW9yaXR5IC1wICIuZ2V0bXlwaWQoKSk7CiAgICAkZXJyb3JzID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICBvYl9lbmRfY2xlYW4oKTsKICAgICovCgogICAgaWYgKCRyZXN1bHQxICYmICRyZXN1bHQyICYmICEkZXJyb3JzKQogICAgICAgIHJldHVybih0cnVlKTsKICAgIGVsc2UgaWYgKGZ1bmN0aW9uX2V4aXN0cygicHJvY19uaWNlIikgJiYgIWlzRGlzYWJsZWRGdW5jdGlvbigicHJvY19uaWNlIikpCiAgICB7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAkcmVzdWx0MyA9IHByb2NfbmljZSgkbmljZVByaW9yaXR5KTsKICAgICAgICAkZXJyb3JzID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgCiAgICAgICAgaWYgKCRyZXN1bHQzICYmICEkZXJyb3JzKQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CiAgICAKICAgIHJldHVybihmYWxzZSk7Cn0KCiRfX3VybEZyb21QYXRoID0gYXJyYXkoKTsKZnVuY3Rpb24gZ2V0VXJsRnJvbVBhdGgoJHBhdGgsICRkaXI9ZmFsc2UpCnsKICAgICRwYXRoID0gc3RyX3JlcGxhY2UoImZpbGU6Ly8iLCAiIiwgJHBhdGgpOwogICAgCiAgICAkcGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJHBhdGgpOwoKICAgIGdsb2JhbCAkX191cmxGcm9tUGF0aDsKICAgICRfcGF0aCA9ICRwYXRoOwogICAgaWYgKGlzc2V0KCRfX3VybEZyb21QYXRoWyRfcGF0aC4kZGlyXSkpCiAgICAgICAgcmV0dXJuKCRfX3VybEZyb21QYXRoWyRfcGF0aC4kZGlyXSk7CiAgICAKICAgIGlmICghJHBhdGgpCiAgICAgICAgcmV0dXJuKCIiKTsKCiAgICBpZiAoc3RycG9zKCRwYXRoLCAiaHR0cDovLyIpID09PSAwIHx8IHN0cnBvcygkcGF0aCwgImh0dHBzOi8vIikgPT09IDApCiAgICAgICAgcmV0dXJuKCRwYXRoKTsKCiAgICBzdGFydFByb2ZpbGUoImdldFVybEZyb21QYXRoIik7CiAgICBpZiAoc3RycG9zKCRwYXRoLCBQUk9KRUNUUEFUSCkgIT09IDApCiAgICAgICAgJHBhdGggPSBjbGVhbkxpbmsoUFJPSkVDVFBBVEguJHBhdGgpOwogICAgCiAgICAvL3Zhcl9kdW1wKCRwYXRoKTsKICAgIGlmICgkZGlyICYmICFfaXNfZGlyKCRwYXRoKSkKICAgIHsKICAgICAgICAkcGF0aCA9IGRpcm5hbWUoJHBhdGgpOwogICAgICAgICRwYXRoIC49ICIvIjsKICAgIH0KICAgIAogICAgJHBhdGggPSBzdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgUFJPSkVDVFVSTCwgJHBhdGgpOwogICAgCiAgICBpZiAoJGRpciAmJiAkcGF0aFtzdHJsZW4oJHBhdGgpLTFdICE9ICIvIikKICAgICAgICAkcGF0aCAuPSAiLyI7CiAgICAKICAgIGdsb2JhbCAkX19nZXRVcmxGcm9tUGF0aFJlbGF0aXZlOwogICAgaWYgKCRfX2dldFVybEZyb21QYXRoUmVsYXRpdmUpCiAgICB7CiAgICAgICAgJHBhdGggPSBzdHJfcmVwbGFjZShQUk9KRUNUVVJMLCAiLyIsICRwYXRoKTsKICAgIH0KCiAgICBpZiAoISRfX2dldFVybEZyb21QYXRoUmVsYXRpdmUpCiAgICAgICAgJF9fdXJsRnJvbVBhdGhbJF9wYXRoLiRkaXJdID0gJHBhdGg7CiAgICAKICAgIC8vdmFyX2R1bXAoJHBhdGgpOwogICAgc3RvcFByb2ZpbGUoImdldFVybEZyb21QYXRoIik7CiAgICByZXR1cm4oJHBhdGgpOwp9CgpmdW5jdGlvbiBnZXRQYXRoRnJvbVVybCgkdXJsLCAkcmVsYXRpdmVUbz1OVUxMKQp7CiAgICBzdGFydFByb2ZpbGUoImdldFBhdGhGcm9tVXJsIik7CiAgICAkdXJsID0gc3RyX3JlcGxhY2UoImh0dHBzOi8vIiwgImh0dHA6Ly8iLCAkdXJsKTsKICAgICRQUk9KRUNUVVJMID0gc3RyX3JlcGxhY2UoImh0dHBzOi8vIiwgImh0dHA6Ly8iLCBQUk9KRUNUVVJMKTsKICAgIAogICAgJHBhdGggPSBzdHJfcmVwbGFjZSgkUFJPSkVDVFVSTCwgIi8iLCAkdXJsKTsKCiAgICBpZiAoJHJlbGF0aXZlVG8pCiAgICB7CiAgICAgICAgaWYgKCRyZWxhdGl2ZVRvICE9PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgJHBhdGggPSBzdHJfcmVwbGFjZSgkcmVsYXRpdmVUbywgIi8iLCAkcGF0aCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgICRwYXRoID0gUFJPSkVDVFBBVEguJHBhdGg7CiAgICAKICAgIHN0b3BQcm9maWxlKCJnZXRQYXRoRnJvbVVybCIpOwogICAgcmV0dXJuKGNsZWFuTGluaygkcGF0aCkpOwp9CgpmdW5jdGlvbiBfaW1hZ2V0dGZiYm94KCRzaXplLCAkYW5nbGUsICRmb250LCAkdGV4dC8qLCAkZml4PWZhbHNlKi8pCnsKICAgICRyZWN0ID0gaW1hZ2V0dGZiYm94KCRzaXplLCRhbmdsZSwkZm9udCwkdGV4dCk7CgogICAgJG1pblggPSBtaW4oYXJyYXkoJHJlY3RbMF0sJHJlY3RbMl0sJHJlY3RbNF0sJHJlY3RbNl0pKTsKICAgICRtYXhYID0gbWF4KGFycmF5KCRyZWN0WzBdLCRyZWN0WzJdLCRyZWN0WzRdLCRyZWN0WzZdKSk7CiAgICAkbWluWSA9IG1pbihhcnJheSgkcmVjdFsxXSwkcmVjdFszXSwkcmVjdFs1XSwkcmVjdFs3XSkpOwogICAgJG1heFkgPSBtYXgoYXJyYXkoJHJlY3RbMV0sJHJlY3RbM10sJHJlY3RbNV0sJHJlY3RbN10pKTsKCiAgICAkeCA9ICRtaW5YOwogICAgJHkgPSAkbWluWTsKICAgICR3ID0gJG1heFggLSAkbWluWDsKICAgICRoID0gJG1heFkgLSAkbWluWTsKICAgIAogICAgLyoKICAgIGlmICgkYW5nbGUgPT0gMCAmJiAhJGZpeCkKICAgIHsKICAgICAgICAvLyB4IG9mZnNldCBmaXgKICAgICAgICAvLyBpZiB3ZSBzdGFydCB3aXRoIF8sIHRoZW4gZXZlcnl0aGluZyBpcyBPSywgaWYgb3RoZXIgY2hhcmFjdGVyLCBpdCBzdGFydHMgZmV3IHBpeGVscyBsYXRlcgogICAgICAgICRyZWN0MiA9IF9pbWFnZXR0ZmJib3goJHNpemUsJGFuZ2xlLCRmb250LCIgIix0cnVlKTsKICAgICAgICAkcmVjdDMgPSBfaW1hZ2V0dGZiYm94KCRzaXplLCRhbmdsZSwkZm9udCwiICIuJHRleHQsdHJ1ZSk7CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkdyk7CiAgICAgICAgLy92YXJfZHVtcCgkdyskcmVjdDJbIndpZHRoIl0pOwogICAgICAgIC8vdmFyX2R1bXAoJHJlY3QzWyJ3aWR0aCJdKTsKICAgICAgICAvL3Zhcl9kdW1wKCRyZWN0Mik7CiAgICB9CiAgICAqLwoKICAgIHJldHVybiBhcnJheSgKICAgICAgICAieCIgICA9PiAkeCwKICAgICAgICAieSIgICAgPT4gJHksCiAgICAgICAgIndpZHRoIiAgPT4gJHcsCiAgICAgICAgImhlaWdodCIgPT4gJGgsCiAgICAgICAgImJveCIgICAgPT4gJHJlY3QKICAgICk7Cn0KCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvU3RyaW5nL1N0cmluZy5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBUU3RyaW5nIGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgCn0gIAoKCi8qCmZ1bmN0aW9uIHVuaWNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nPW51bGwpIAp7CiAgICBpZiAoaXNfbnVsbCgkZW5jb2RpbmcpKSAKICAgICAgICAkZW5jb2RpbmcgPSBpbmlfZ2V0KCdtYnN0cmluZy5pbnRlcm5hbF9lbmNvZGluZycpOwogICAgcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1xcXFx1KFswLTlhLWZBLUZdezR9KS91JywgZnVuY3Rpb24oJG1hdGNoKSB1c2UgKCRlbmNvZGluZykgewogICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoWzFdKSwgJGVuY29kaW5nLCAnVVRGLTE2QkUnKTsKICAgIH0sICRzdHIpOwp9CiovCgovL2RlZmluZSgiWldTUCIsIGNocigweDIwKS5jaHIoMHgwYikpOwovL2RlZmluZSgiWldOTCIsIGNocigweDIwKS5jaHIoMHgwYykpOwoKLy9kZWZpbmUoIlpXU1AiLCB1bmljb2RlU3RyaW5nKCJcdTIwMGIiKSk7Ci8vZGVmaW5lKCJaV05MIiwgdW5pY29kZVN0cmluZygiXHUyMDBjIikpOwoKZGVmaW5lKCJaV1NQIiwgbWJfY29udmVydF9lbmNvZGluZygiXHgyMFx4MGIiLCAnVVRGLTgnLCAnVVRGLTE2QkUnKSk7CmRlZmluZSgiWldOTCIsIG1iX2NvbnZlcnRfZW5jb2RpbmcoIlx4MjBceDBjIiwgJ1VURi04JywgJ1VURi0xNkJFJykpOwovL2RlZmluZSgiTkJTUCIsIG1iX2NvbnZlcnRfZW5jb2RpbmcoIlx4QzJceEEwIiwgJ1VURi04JywgJ1VURi0xNkJFJykpOyAvLyBOTyBCUkVBS0lORyBTUEFDRQovL2RlZmluZSgiTkJTUCIsIG1iX2NvbnZlcnRfZW5jb2RpbmcoIlx4QTBceDBjIiwgJ1VURi04JywgJ1VURi0xNkJFJykpOwpkZWZpbmUoIk5CU1AiLCBjaHIoMHhDMikuY2hyKDB4QTApKTsgLy8gTk8gQlJFQUtJTkcgU1BBQ0UKZGVmaW5lKCJIWldTUCIsICImI3gyMDBiOyIpOwpkZWZpbmUoIkhaV05MIiwgIiYjeDIwMGM7Iik7CmRlZmluZSgiQk9NIiwgY2hyKDIzOSkuY2hyKDE4NykuY2hyKDE5MSkpOwoKZnVuY3Rpb24gcGFyc2VJbnQoJHN0ciwgJGRlZmF1bHQ9MCkKewogICAgaWYgKCRzdHIgIT0gIiIgJiYgcHJlZ19tYXRjaF9hbGwoInwoWzAtOV0rKXxpbXMiLCAkc3RyLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgewogICAgICAgICRyZXQgPSAiIjsKICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRtYXRjaCkKICAgICAgICAgICAgJHJldCAuPSAkbWF0Y2hbMV07CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybigkZGVmYXVsdCk7Cn0KICAgIApmdW5jdGlvbiBwYXJzZUZsb2F0KCRzdHIsICRkZWZhdWx0PTApCnsKICAgIGlmICgkc3RyICE9ICIiICYmIHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKyl8aW1zIiwgJHN0ciwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgIHsKICAgICAgICAkcmV0ID0gIiI7CiAgICAgICAgZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpCiAgICAgICAgICAgICRyZXQgLj0gJG1hdGNoWzFdOwoKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKCRkZWZhdWx0KTsKfQoKZnVuY3Rpb24gcGFyc2VEb3VibGUoJHN0ciwgJGRlZmF1bHQ9MCkKewogICAgcmV0dXJuKHBhcnNlRmxvYXQoJHN0ciwgJGRlZmF1bHQpKTsKfQoKZnVuY3Rpb24gcGFyc2VDb2xvcigkaGV4LCAkZGVmYXVsdD0iIzAwMDAwMCIpCnsKICAgIGlmIChfaXNfYXJyYXkoJGhleCkpCiAgICAgICAgcmV0dXJuKCRoZXgpOwogICAgICAgICAgICAKICAgIGlmICgkaGV4KQogICAgICAgIHJldHVybihoZXhUb0RlY0NvbG9yKCRoZXgpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oaGV4VG9EZWNDb2xvcigkZGVmYXVsdCkpOwp9CiAgICAKZnVuY3Rpb24gY29tcGFyZUNvbG9ycygkaGV4MSwgJGhleDIpCnsKICAgICRoZXgxID0gcGFyc2VDb2xvcigkaGV4MSk7CiAgICAkaGV4MiA9IHBhcnNlQ29sb3IoJGhleDIpOwoKICAgICRwMSA9ICgkaGV4MVsiciJdIC8gMjU1KSAqIDEwMDsKICAgICRwMiA9ICgkaGV4MVsiZyJdIC8gMjU1KSAqIDEwMDsKICAgICRwMyA9ICgkaGV4MVsiYiJdIC8gMjU1KSAqIDEwMDsKICAgICRwNCA9ICgkaGV4MVsiYSJdIC8gMjU1KSAqIDEwMDsKCiAgICAkcGVyYzEgPSAoJHAxICsgJHAyICsgJHAzICsgJHA0KSAvIDQ7CiAgICAKICAgICRwMSA9ICgkaGV4MlsiciJdIC8gMjU1KSAqIDEwMDsKICAgICRwMiA9ICgkaGV4MlsiZyJdIC8gMjU1KSAqIDEwMDsKICAgICRwMyA9ICgkaGV4MlsiYiJdIC8gMjU1KSAqIDEwMDsKICAgICRwNCA9ICgkaGV4MlsiYSJdIC8gMjU1KSAqIDEwMDsKCiAgICAkcGVyYzIgPSAoJHAxICsgJHAyICsgJHAzICsgJHA0KSAvIDQ7CiAgICAKICAgIHJldHVybihhYnMoJHBlcmMxIC0gJHBlcmMyKSk7ICAgICAgIAp9CgpmdW5jdGlvbiBwYXJzZUJ5dGVzKCRzdHIsICRkZWZhdWx0PTApCnsKICAgIGlmICgkc3RyICE9ICIiICYmIHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKyl8aW1zIiwgJHN0ciwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgIHsKICAgICAgICAkcmV0ID0gIiI7CiAgICAgICAgZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpCiAgICAgICAgICAgICRyZXQgLj0gJG1hdGNoWzFdOwogICAgICAgIAogICAgICAgIGlmIChzdHJpcG9zKCRzdHIsICJrQiIpKQogICAgICAgICAgICAkcmV0ICo9IDEwMjQ7ICAgIAogICAgICAgIGVsc2UgaWYgKHN0cmlwb3MoJHN0ciwgIk1CIikpCiAgICAgICAgICAgICRyZXQgKj0gMTAyNCoxMDI0OyAgICAKICAgICAgICBlbHNlIGlmIChzdHJpcG9zKCRzdHIsICJHQiIpKQogICAgICAgICAgICAkcmV0ICo9IDEwMjQqMTAyNCoxMDI0OyAgICAKICAgICAgICBlbHNlIGlmIChzdHJpcG9zKCRzdHIsICJUQiIpKQogICAgICAgICAgICAkcmV0ICo9IDEwMjQqMTAyNCoxMDI0KjEwMjQ7ICAgIAogICAgICAgIGVsc2UgaWYgKHN0cmlwb3MoJHN0ciwgImsiKSkKICAgICAgICAgICAgJHJldCAqPSAxMDI0OyAgICAKICAgICAgICBlbHNlIGlmIChzdHJpcG9zKCRzdHIsICJNIikpCiAgICAgICAgICAgICRyZXQgKj0gMTAyNCoxMDI0OyAgICAKICAgICAgICBlbHNlIGlmIChzdHJpcG9zKCRzdHIsICJHIikpCiAgICAgICAgICAgICRyZXQgKj0gMTAyNCoxMDI0KjEwMjQ7ICAgIAogICAgICAgIGVsc2UgaWYgKHN0cmlwb3MoJHN0ciwgIlQiKSkKICAgICAgICAgICAgJHJldCAqPSAxMDI0KjEwMjQqMTAyNCoxMDI0OyAgICAKCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybigkZGVmYXVsdCk7Cn0KCmZ1bmN0aW9uIGhleFRvRGVjQ29sb3IoJGhleCkgCnsKICAgIGlmIChpc19hcnJheSgkaGV4KSkKICAgICAgICByZXR1cm4oJGhleCk7CgogICAgaWYgKCRoZXggPT0gIiIpCiAgICB7CiAgICAgICAgJGNvbG9yWydyZWQnXSA9ICRjb2xvclsnciddID0gLTE7CiAgICAgICAgJGNvbG9yWydncmVlbiddID0gJGNvbG9yWydnJ10gPSAtMTsKICAgICAgICAkY29sb3JbJ2JsdWUnXSA9ICRjb2xvclsnYiddID0gLTE7CiAgICAgICAgJGNvbG9yWydhbHBoYSddID0gJGNvbG9yWydhJ10gPSAtMTsKICAgIH0KICAgIGVsc2UKICAgIHsgICAgCiAgICAgICAgJGhleCA9IHN0cl9yZXBsYWNlKCIjIiwgIiIsICRoZXgpOwoKICAgICAgICAkY29sb3JbJ3JlZCddID0gJGNvbG9yWydyJ10gPSBoZXhkZWMoc3Vic3RyKCRoZXgsIDAsIDIpKTsKICAgICAgICAkY29sb3JbJ2dyZWVuJ10gPSAkY29sb3JbJ2cnXSA9IGhleGRlYyhzdWJzdHIoJGhleCwgMiwgMikpOwogICAgICAgICRjb2xvclsnYmx1ZSddID0gJGNvbG9yWydiJ10gPSBoZXhkZWMoc3Vic3RyKCRoZXgsIDQsIDIpKTsKCiAgICAgICAgLy8gbGlrZSBSUkdHQkIvMC0xCiAgICAgICAgaWYgKCRoZXhbNl0gPT0gIi8iKQogICAgICAgICAgICAkY29sb3JbJ2FscGhhJ10gPSAkY29sb3JbJ2EnXSA9IGV4dHJhY3RGbG9hdChzdWJzdHIoJGhleCwgNykpOwogICAgICAgIGVsc2UgaWYgKHN1YnN0cigkaGV4LCA2LCAyKSAhPSAiIikKICAgICAgICAgICAgJGNvbG9yWydhbHBoYSddID0gJGNvbG9yWydhJ10gPSBoZXhkZWMoc3Vic3RyKCRoZXgsIDYsIDIpKS8yNTU7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkY29sb3JbJ2FscGhhJ10gPSAkY29sb3JbJ2EnXSA9IDE7CiAgICB9CiAgICAKICAgIHJldHVybiAkY29sb3I7Cn0KCmZ1bmN0aW9uIGhleFRvR0RDb2xvcigkaGV4LCAkZ2RJbWFnZSkgCnsKICAgICRjb2xvciA9IGhleFRvRGVjQ29sb3IoJGhleCk7CiAgICAKICAgIGlmICgkZ2RJbWFnZSkKICAgICAgICAvLyRjb2xvciA9IGltYWdlY29sb3JjbG9zZXN0KCRnZEltYWdlLCAkY29sb3JbInJlZCJdLCAkY29sb3JbImdyZWVuIl0sICRjb2xvclsiYmx1ZSJdKTsKICAgICAgICAkY29sb3IgPSBpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYSgkZ2RJbWFnZSwgZmlyc3RfdmFsdWUoJGNvbG9yWyJyIl0sICRjb2xvclsicmVkIl0pLCBmaXJzdF92YWx1ZSgkY29sb3JbImciXSwgJGNvbG9yWyJncmVlbiJdKSwgZmlyc3RfdmFsdWUoJGNvbG9yWyJiIl0sICRjb2xvclsiYmx1ZSJdKSwgZmlyc3RfdmFsdWUoJGNvbG9yWyJhIl0sICRjb2xvclsiYWxwaGEiXSkpOwogICAgICAgIC8vJGNvbG9yID0gaW1hZ2Vjb2xvcmFsbG9jYXRlKCRnZEltYWdlLCAyNTUsIDIwLCA2MCk7CiAgICAvL2R1bXAoJGNvbG9yKTsKICAgICAgICAKICAgIHJldHVybiAkY29sb3I7Cn0KCmZ1bmN0aW9uIGV4cGxvZGVDb2xvcigkY29sb3IpCnsKICAgIGlmIChwcmVnX21hdGNoKCJ8XlsjYWJjZGVmZ2gwLTldK1wkfGkiLCAkY29sb3IpKQogICAgewogICAgICAgICRjb2xvciA9IHN0cl9yZXBsYWNlKCIjIiwgIiIsICRjb2xvcik7CiAgICAgICAgJGNbJ3InXSA9IGhleGRlYyhzdWJzdHIoJGNvbG9yLCAwLCAyKSk7CiAgICAgICAgJGNbJ2cnXSA9IGhleGRlYyhzdWJzdHIoJGNvbG9yLCAyLCAyKSk7CiAgICAgICAgJGNbJ2InXSA9IGhleGRlYyhzdWJzdHIoJGNvbG9yLCA0LCAyKSk7CiAgICAgICAgaWYgKHN1YnN0cigkY29sb3IsIDYsIDIpKQogICAgICAgICAgICAkY1snYSddID0gaGV4ZGVjKHN1YnN0cigkY29sb3IsIDYsIDIpKTsKICAgIH0KICAgIAogICAgcmV0dXJuKCRjKTsKfQoKZnVuY3Rpb24gaW1wbG9kZUNvbG9yKCRjb2xvciwgJGZvcm1hdD0iaGV4IikKewogICAgaWYgKCRmb3JtYXQgPT0gImhleCIpICAgIAogICAgewogICAgICAgICRjID0gIiMiOwogICAgICAgICRjIC49IHplcm9maWxsKHN0cnRvdXBwZXIoZGVjaGV4KCRjb2xvclsiciJdKSksIDIpOwogICAgICAgICRjIC49IHplcm9maWxsKHN0cnRvdXBwZXIoZGVjaGV4KCRjb2xvclsiZyJdKSksIDIpOwogICAgICAgICRjIC49IHplcm9maWxsKHN0cnRvdXBwZXIoZGVjaGV4KCRjb2xvclsiYiJdKSksIDIpOwogICAgICAgIGlmIChpc3NldCgkY29sb3JbImEiXSkpCiAgICAgICAgICAgICRjIC49IHplcm9maWxsKHN0cnRvdXBwZXIoZGVjaGV4KCRjb2xvclsiYSJdKSksIDIpOwogICAgfQogICAgCiAgICByZXR1cm4oJGMpOwp9CgpmdW5jdGlvbiBtb2RpZnlDb2xvcigkY29sb3IsICR2YWx1ZSwgJGFjdGlvbj0iYnJpZ2h0bmVzcyIpCnsKICAgICRjb2xvciA9IGV4cGxvZGVDb2xvcigkY29sb3IpOwogICAgCiAgICBpZiAoJGFjdGlvbiA9PSAiYnJpZ2h0bmVzcyIpCiAgICB7CiAgICAgICAgaWYgKHN0cnBvcygkdmFsdWUsICIlIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaChhcnJheSgiciIsICJnIiwgImIiKSBhcyAkYykKICAgICAgICAgICAgICAgICRjb2xvclskY10gPSByb3VuZCgkY29sb3JbJGNdKigxMDArZXh0cmFjdEZsb2F0KCR2YWx1ZSkpLzEwMCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAkY29sb3JbInIiXSA9IG1heChtaW4oJGNvbG9yWyJyIl0sIDI1NSksIDApOwogICAgJGNvbG9yWyJnIl0gPSBtYXgobWluKCRjb2xvclsiZyJdLCAyNTUpLCAwKTsKICAgICRjb2xvclsiYiJdID0gbWF4KG1pbigkY29sb3JbImIiXSwgMjU1KSwgMCk7CgogICAgcmV0dXJuKGltcGxvZGVDb2xvcigkY29sb3IpKTsKfQoKLyoKZnVuY3Rpb24gbW9kaWZ5Q29sb3IoJGNvbG9yLCAkdmFsdWUsICRhY3Rpb249ImJyaWdodG5lc3MiKQp7CiAgICAkY29sb3IgPSBleHBsb2RlQ29sb3IoJGNvbG9yKTsKICAgIAogICAgaWYgKCRhY3Rpb24gPT0gImJyaWdodG5lc3MiKQogICAgewogICAgICAgIGlmIChzdHJwb3MoJHZhbHVlLCAiJSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICRoc2wgPSBjb2xvclRvSFNMKCRjb2xvcik7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJHZhbHVlIDwgMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHZhbHVlID0gYWJzKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAkaHNsWydsJ10gPSAoJGhzbFsnbCddICogMTAwKSAtICR2YWx1ZTsKICAgICAgICAgICAgICAgICRoc2xbJ2wnXSA9ICgkaHNsWydsJ10gPCAwKSA/IDA6JGhzbFsnOyddLzEwMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRoc2xbJ2wnXSA9ICgkaHNsWydsJ10gKiAxMDApICsgJHZhbHVlOwogICAgICAgICAgICAgICAgJGhzbFsnbCddID0gKCRoc2xbJ2wnXSA+IDEwMCkgPyAxOiRoc2xbJ2wnXS8xMDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjb2xvciA9IGhzbFRvQ29sb3IoJGhzbCk7CgogICAgICAgICAgICAKICAgICAgICAgICAgLy8kY29sb3JbInIiXSA9IHJvdW5kKCRjb2xvclsiciJdKigxMDArKCRhY3Rpb24gPT0gImRhcmtlciIgPyAtMSA6IDEpKmV4dHJhY3RGbG9hdCgkdmFsdWUpKS8xMDApOwogICAgICAgICAgICAvLyRjb2xvclsiZyJdID0gcm91bmQoJGNvbG9yWyJnIl0qKDEwMCsoJGFjdGlvbiA9PSAiZGFya2VyIiA/IC0xIDogMSkqZXh0cmFjdEZsb2F0KCR2YWx1ZSkpLzEwMCk7CiAgICAgICAgICAgIC8vJGNvbG9yWyJiIl0gPSByb3VuZCgkY29sb3JbImIiXSooMTAwKygkYWN0aW9uID09ICJkYXJrZXIiID8gLTEgOiAxKSpleHRyYWN0RmxvYXQoJHZhbHVlKSkvMTAwKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vJGNvbG9yWyJyIl0gPSBtYXgobWluKCRjb2xvclsiciJdLCAyNTUpLCAwKTsKICAgIC8vJGNvbG9yWyJnIl0gPSBtYXgobWluKCRjb2xvclsiZyJdLCAyNTUpLCAwKTsKICAgIC8vJGNvbG9yWyJiIl0gPSBtYXgobWluKCRjb2xvclsiYiJdLCAyNTUpLCAwKTsKCiAgICByZXR1cm4oaW1wbG9kZUNvbG9yKCRjb2xvcikpOwp9CiovCgovKgpmdW5jdGlvbiBjb2xvclRvSFNMKCRjb2xvcikKewogICAgJGNvbG9yID0gZXhwbG9kZUNvbG9yKCRjb2xvcik7CgogICAgJHZhcl9SID0gJGNvbG9yWyJyIl07CiAgICAkdmFyX0cgPSAkY29sb3JbImciXTsKICAgICR2YXJfQiA9ICRjb2xvclsiYiJdOwogICAgCiAgICAkSFNMID0gYXJyYXkoKTsKCiAgICAkdmFyX01pbiA9IG1pbigkdmFyX1IsICR2YXJfRywgJHZhcl9CKTsKICAgICR2YXJfTWF4ID0gbWF4KCR2YXJfUiwgJHZhcl9HLCAkdmFyX0IpOwogICAgJGRlbF9NYXggPSAkdmFyX01heCAtICR2YXJfTWluOwoKICAgICRMID0gKCR2YXJfTWF4ICsgJHZhcl9NaW4pLzI7CgogICAgaWYgKCRkZWxfTWF4ID09IDApCiAgICB7CiAgICAgICAgJEggPSAwOwogICAgICAgICRTID0gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoICRMIDwgMC41ICkgJFMgPSAkZGVsX01heCAvICggJHZhcl9NYXggKyAkdmFyX01pbiApOwogICAgICAgIGVsc2UgICAgICAgICAgICAkUyA9ICRkZWxfTWF4IC8gKCAyIC0gJHZhcl9NYXggLSAkdmFyX01pbiApOwoKICAgICAgICAkZGVsX1IgPSAoICggKCAkdmFyX01heCAtICR2YXJfUiApIC8gNiApICsgKCAkZGVsX01heCAvIDIgKSApIC8gJGRlbF9NYXg7CiAgICAgICAgJGRlbF9HID0gKCAoICggJHZhcl9NYXggLSAkdmFyX0cgKSAvIDYgKSArICggJGRlbF9NYXggLyAyICkgKSAvICRkZWxfTWF4OwogICAgICAgICRkZWxfQiA9ICggKCAoICR2YXJfTWF4IC0gJHZhcl9CICkgLyA2ICkgKyAoICRkZWxfTWF4IC8gMiApICkgLyAkZGVsX01heDsKCiAgICAgICAgaWYgICAgICAoJHZhcl9SID09ICR2YXJfTWF4KSAkSCA9ICRkZWxfQiAtICRkZWxfRzsKICAgICAgICBlbHNlIGlmICgkdmFyX0cgPT0gJHZhcl9NYXgpICRIID0gKCAxIC8gMyApICsgJGRlbF9SIC0gJGRlbF9COwogICAgICAgIGVsc2UgaWYgKCR2YXJfQiA9PSAkdmFyX01heCkgJEggPSAoIDIgLyAzICkgKyAkZGVsX0cgLSAkZGVsX1I7CgogICAgICAgIGlmICgkSDwwKSAkSCsrOwogICAgICAgIGlmICgkSD4xKSAkSC0tOwogICAgfQoKICAgICRIU0xbJ2gnXSA9ICgkSCozNjApOwogICAgJEhTTFsncyddID0gJFM7CiAgICAkSFNMWydsJ10gPSAkTDsKCiAgICByZXR1cm4gJEhTTDsKfQoKZnVuY3Rpb24gaHNsVG9Db2xvcigkaHNsID0gYXJyYXkoKSl7CiAgICBsaXN0KCRILCRTLCRMKSA9IGFycmF5KCAkaHNsWydoJ10vMzYwLCRoc2xbJ3MnXSwkaHNsWydsJ10gKTsKCiAgICBpZiggJFMgPT0gMCApIHsKICAgICAgICAkciA9ICRMICogMjU1OwogICAgICAgICRnID0gJEwgKiAyNTU7CiAgICAgICAgJGIgPSAkTCAqIDI1NTsKICAgIH0gZWxzZSB7CgogICAgICAgIGlmKCRMPDAuNSkgewogICAgICAgICAgICAkdmFyXzIgPSAkTCooMSskUyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHZhcl8yID0gKCRMKyRTKSAtICgkUyokTCk7CiAgICAgICAgfQoKICAgICAgICAkdmFyXzEgPSAyICogJEwgLSAkdmFyXzI7CgogICAgICAgICRyID0gcm91bmQoMjU1ICogaHVlVG9SR0IoICR2YXJfMSwgJHZhcl8yLCAkSCArICgxLzMpICkpOwogICAgICAgICRnID0gcm91bmQoMjU1ICogaHVlVG9SR0IoICR2YXJfMSwgJHZhcl8yLCAkSCApKTsKICAgICAgICAkYiA9IHJvdW5kKDI1NSAqIGh1ZVRvUkdCKCAkdmFyXzEsICR2YXJfMiwgJEggLSAoMS8zKSApKTsKCiAgICB9CgogICAgcmV0dXJuIGFycmF5KCJyIj0+JHIsICJnIj0+JGcsICJiIj0+JGIpOwp9CgpmdW5jdGlvbiBodWVUb1JHQiggJHYxLCR2MiwkdkggKSB7CiAgICBpZiggJHZIIDwgMCApIHsKICAgICAgICAkdkggKz0gMTsKICAgIH0KCiAgICBpZiggJHZIID4gMSApIHsKICAgICAgICAkdkggLT0gMTsKICAgIH0KCiAgICBpZiggKDYqJHZIKSA8IDEgKSB7CiAgICAgICAgICAgcmV0dXJuICgkdjEgKyAoJHYyIC0gJHYxKSAqIDYgKiAkdkgpOwogICAgfQoKICAgIGlmKCAoMiokdkgpIDwgMSApIHsKICAgICAgICByZXR1cm4gJHYyOwogICAgfQoKICAgIGlmKCAoMyokdkgpIDwgMiApIHsKICAgICAgICByZXR1cm4gKCR2MSArICgkdjItJHYxKSAqICggKDIvMyktJHZIICkgKiA2KTsKICAgIH0KCiAgICByZXR1cm4gJHYxOwp9CiovCgoKZnVuY3Rpb24gY2hhckZpbGwoJHN0ciwgJGNoYXIsICRsZW5ndGgpIAp7CiAgICAkc3RyID0gKHN0cmluZykkc3RyOwogICAgJGNoYXIyID0gY2hyKDEpOwogICAgCiAgICB3aGlsZShfc3RybGVuKCRzdHIpIDwgYWJzKCRsZW5ndGgpKQogICAgewogICAgICAgIGlmICgkbGVuZ3RoIDwgMCkKICAgICAgICAgICAgJHN0ciA9ICRjaGFyMi4kc3RyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHN0ciA9ICRzdHIuJGNoYXIyOwogICAgfQogICAgCiAgICAkc3RyID0gc3RyX3JlcGxhY2UoJGNoYXIyLCAkY2hhciwgJHN0cik7CiAgICAKICAgIHJldHVybigkc3RyKTsKfQogICAgCmZ1bmN0aW9uIHplcm9GaWxsKCRzdHIsICRsZW5ndGgpIAp7CiAgICByZXR1cm4oY2hhckZpbGwoJHN0ciwgIjAiLCAoLTEpKiRsZW5ndGgpKTsKfQogICAgCmZ1bmN0aW9uIGRlY1RvSGV4Q29sb3IoJGRlYykgCnsKICAgIGlmIChfaXNfYXJyYXkoJGRlYykpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJGRlYzsKICAgICAgICAkY29sb3JbJ3InXSA9ICRjb2xvclsnciddID8gJGNvbG9yWydyJ10gOiAkY29sb3JbJ3JlZCddOwogICAgICAgICRjb2xvclsnZyddID0gJGNvbG9yWydnJ10gPyAkY29sb3JbJ2cnXSA6ICRjb2xvclsnZ3JlZW4nXTsKICAgICAgICAkY29sb3JbJ2InXSA9ICRjb2xvclsnYiddID8gJGNvbG9yWydiJ10gOiAkY29sb3JbJ2JsdWUnXTsKICAgICAgICB1bnNldCgkY29sb3JbJ3JlZCddKTsKICAgICAgICB1bnNldCgkY29sb3JbJ2dyZWVuJ10pOwogICAgICAgIHVuc2V0KCRjb2xvclsnYmx1ZSddKTsKICAgICAgICAKICAgICAgICBmb3JlYWNoKCRjb2xvciBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRjb2xvclska2V5XSA9IHplcm9GaWxsKHN0cnRvdXBwZXIoZGVjaGV4KCR2YWx1ZSkpLCAyKTsKICAgICAgICB9CgogICAgICAgIHJldHVybigiIyIuaW1wbG9kZSgkY29sb3IpKTsKICAgIH0KICAgIGVsc2UKICAgIHsgICAgCiAgICAgICAgcmV0dXJuKCIjIi5kZWNoZXgoJGRlYykpOwogICAgfQogICAgCiAgICByZXR1cm4gJGNvbG9yOwp9CgoKZnVuY3Rpb24gc3RyaV9yZXBsYWNlKCR3b3JkLCRyZXBsYWNlLCRzdHIpCnsKICAgICR3b3JkcmF5ID0gX2lzX2FycmF5KCR3b3JkKSA/IHRydWUgOiBmYWxzZTsKICAgICRyZXBscmF5ID0gX2lzX2FycmF5KCRyZXBsYWNlKSA/IHRydWU6IGZhbHNlOwogICAgaWYoJHdvcmRyYXkpCiAgICB7CiAgICAgICAgJHdvcmRrZXlzID0gYXJyYXlfa2V5cygkd29yZCk7CiAgICAgICAgJHNpemV3b3JkID0gY291bnQoJHdvcmRrZXlzKTsKICAgICAgICBpZigkcmVwbHJheSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXBsa2V5cyA9IGFycmF5X2tleXMoJHJlcGxhY2UpOwogICAgICAgICAgICAkc2l6ZXJlcGwgPSBjb3VudCgkcmVwbGFjZSk7CiAgICAgICAgfQogICAgICAgIGZvcigkaT0wOyAkaTwkc2l6ZXdvcmQ7ICRpKyspCiAgICAgICAgewogICAgICAgICAgICBpZigkcmVwbHJheSAmJiBhcnJheV9rZXlfZXhpc3RzKCRpLCRyZXBsa2V5cykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXBsbCA9ICRyZXBsYWNlWyRyZXBsa2V5c1skaV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZigkcmVwbHJheSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlcGxsID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVwbGwgPSAkcmVwbGFjZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc3RyID0gc3RyaV9yZXBsYWNlKCR3b3JkWyR3b3Jka2V5c1skaV1dLCRyZXBsbCwkc3RyKTsKICAgICAgICB9CiAgICAgICAgJHJldCA9ICRzdHI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJHN0cl9sb3cgPSBzdHJ0b2xvd2VyKCRzdHIpOwogICAgICAgICR3b3JkX2xvdyA9IHN0cnRvbG93ZXIoJHdvcmQpOwogICAgICAgICRzdHJfbG93ID0gc3RyX3JlcGxhY2UoJHdvcmRfbG93LCR3b3JkLCRzdHJfbG93KTsKICAgICAgICAkZXhwbG9kZSA9IGV4cGxvZGUoJHdvcmQsJHN0cl9sb3cpOwogICAgICAgICRjb3VudCA9IGNvdW50KCRleHBsb2RlKTsKICAgICAgICAkcmV0ID0gJyc7CiAgICAgICAgJGhvbGRlciA9IDA7CiAgICAgICAgJGxlbiA9IHN0cmxlbigkd29yZCk7CiAgICAgICAgZm9yKCRpPTA7ICRpPCRjb3VudDsgJGkrKykKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzbGVuID0gc3RybGVuKCRleHBsb2RlWyRpXSk7CiAgICAgICAgICAgICRyZXQgLj0gc3Vic3RyKCRzdHIsJGhvbGRlciwkdGhpc2xlbik7CiAgICAgICAgICAgIGlmKCRpICE9PSAoJGNvdW50IC0gMSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXQgLj0gJHJlcGxhY2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvbGRlciA9ICRob2xkZXIgKyAkdGhpc2xlbiArICRsZW47CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRyZXQ7Cn0gICAgCiAgICAKZnVuY3Rpb24gbWJfc3RyaV9yZXBsYWNlKCR3b3JkLCRyZXBsYWNlLCRzdHIpCnsKICAgICR3b3JkcmF5ID0gX2lzX2FycmF5KCR3b3JkKSA/IHRydWUgOiBmYWxzZTsKICAgICRyZXBscmF5ID0gX2lzX2FycmF5KCRyZXBsYWNlKSA/IHRydWU6IGZhbHNlOwogICAgaWYoJHdvcmRyYXkpCiAgICB7CiAgICAgICAgJHdvcmRrZXlzID0gYXJyYXlfa2V5cygkd29yZCk7CiAgICAgICAgJHNpemV3b3JkID0gY291bnQoJHdvcmRrZXlzKTsKICAgICAgICBpZigkcmVwbHJheSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXBsa2V5cyA9IGFycmF5X2tleXMoJHJlcGxhY2UpOwogICAgICAgICAgICAkc2l6ZXJlcGwgPSBjb3VudCgkcmVwbGFjZSk7CiAgICAgICAgfQogICAgICAgIGZvcigkaT0wOyAkaTwkc2l6ZXdvcmQ7ICRpKyspCiAgICAgICAgewogICAgICAgICAgICBpZigkcmVwbHJheSAmJiBhcnJheV9rZXlfZXhpc3RzKCRpLCRyZXBsa2V5cykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXBsbCA9ICRyZXBsYWNlWyRyZXBsa2V5c1skaV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCRyZXBscmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVwbGwgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXBsbCA9ICRyZXBsYWNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdHIgPSBtYl9zdHJpX3JlcGxhY2UoJHdvcmRbJHdvcmRrZXlzWyRpXV0sJHJlcGxsLCRzdHIpOwogICAgICAgIH0KICAgICAgICAkcmV0ID0gJHN0cjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAkc3RyX2xvdyA9IG1iX3N0cnRvbG93ZXIoJHN0cik7CiAgICAgICAgJHdvcmRfbG93ID0gbWJfc3RydG9sb3dlcigkd29yZCk7CiAgICAgICAgJHN0cl9sb3cgPSBzdHJfcmVwbGFjZSgkd29yZF9sb3csJHdvcmQsJHN0cl9sb3cpOwogICAgICAgICRleHBsb2RlID0gZXhwbG9kZSgkd29yZCwkc3RyX2xvdyk7CiAgICAgICAgJGNvdW50ID0gY291bnQoJGV4cGxvZGUpOwogICAgICAgICRyZXQgPSAnJzsKICAgICAgICAkaG9sZGVyID0gMDsKICAgICAgICAkbGVuID0gbWJfc3RybGVuKCR3b3JkKTsKICAgICAgICBmb3IoJGk9MDsgJGk8JGNvdW50OyAkaSsrKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXNsZW4gPSBtYl9zdHJsZW4oJGV4cGxvZGVbJGldKTsKICAgICAgICAgICAgJHJldCAuPSBtYl9zdWJzdHIoJHN0ciwkaG9sZGVyLCR0aGlzbGVuKTsKICAgICAgICAgICAgaWYoJGkgIT09ICgkY291bnQgLSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJldCAuPSAkcmVwbGFjZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9sZGVyID0gJGhvbGRlciArICR0aGlzbGVuICsgJGxlbjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJldDsKfSAgICAKCi8vIGZpbmQgZmlyc3Qgb2NjdXJhbmNlIG9mIG5lZWRsZSBmcm9tIGJhY2sgdG8gYmVnaW4gKHJldmVyc2UgdG8gc3RycG9zKQpmdW5jdGlvbiBzdHJwb3NyKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldD1udWxsKQp7CiAgICBpZiAoJG9mZnNldCA9PSBudWxsKQogICAgICAgIC8vJG9mZnNldCA9IHN0cmxlbigkaGF5c3RhY2spLTE7CiAgICAgICAgJG9mZnNldCA9IHN0cmxlbigkaGF5c3RhY2spOwoKICAgICRySGF5c3RhY2sgPSBzdHJyZXYoJGhheXN0YWNrKTsKICAgICRyTmVlZGxlID0gc3RycmV2KCRuZWVkbGUpOwogICAgJGhheXN0YWNrTGVuID0gc3RybGVuKCRoYXlzdGFjayk7CiAgICAKICAgICRwb3MgPSBzdHJwb3MoJHJIYXlzdGFjaywgJHJOZWVkbGUsICRoYXlzdGFja0xlbi0kb2Zmc2V0KTsKICAgIGlmICgkcG9zICE9PSBGQUxTRSkKICAgICAgICByZXR1cm4oJGhheXN0YWNrTGVuLSRwb3MtMSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKEZBTFNFKTsKfQoKLy8gZmluZCBjb3VudCBvZiBhbGwgb2NjdXJlbmNlcyBvZiBuZWVkbGUKZnVuY3Rpb24gc3RycG9zYygkaGF5c3RhY2ssICRuZWVkbGUpCnsKICAgICRvZmZzZXQgPSAtMTsKICAgICRjb3VudCA9IDA7CiAgICB3aGlsZSh0cnVlKQogICAgewogICAgICAgICRvZmZzZXQgPSBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KzEpOwogICAgICAgIAogICAgICAgIGlmICgkb2Zmc2V0ID09PSBGQUxTRSkKICAgICAgICAgICAgcmV0dXJuKCRjb3VudCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkY291bnQrKzsKICAgIH0KfQoKZnVuY3Rpb24gZW5kRWxsaXBzaXMoJHN0ciwgJGxlbmd0aCA9IDUwLCAkZWxsaXBzaXMgPSAiLi4uIikKewogICAgcmV0dXJuIChjb3VudCgkd29yZHMgPSBleHBsb2RlKCcgJywgJHN0cikpID4gJGxlbmd0aCkgPyBpbXBsb2RlKCcgJywgYXJyYXlfc2xpY2UoJHdvcmRzLCAwLCAkbGVuZ3RoKSkuJGVsbGlwc2lzIDogJHN0cjsKfQoKZnVuY3Rpb24gc3RyVG9IZXhEdW1wKCRzdHIpCnsKICAgICRoZXg9IiI7CiAgICBmb3IgKCRpPTA7JGk8c3RybGVuKCRzdHIpOyRpKyspCiAgICB7CiAgICAgICAgJGhleCAuPSAiPGI+WyIuJHN0clskaV0uIl08L2I+PHN1Yj4iLihvcmQoJHN0clskaV0pIDwgMTYgPyAiMCIgOiAiIikuZGVjaGV4KG9yZCgkc3RyWyRpXSkpLiI8L3N1Yj4iOwogICAgfQogICAgCiAgICByZXR1cm4oJGhleCk7Cn0KCmZ1bmN0aW9uIHN0clRvSGV4KCRzdHIpCnsKICAgICRoZXg9IiI7CiAgICBmb3IgKCRpPTA7JGk8c3RybGVuKCRzdHIpOyRpKyspCiAgICB7CiAgICAgICAgJGhleCAuPSAob3JkKCRzdHJbJGldKSA8IDE2ID8gIjAiIDogIiIpLmRlY2hleChvcmQoJHN0clskaV0pKTsKICAgIH0KICAgICRoZXggPSBzdHJ0b3VwcGVyKCRoZXgpOwogICAgcmV0dXJuICRoZXg7Cn0KZnVuY3Rpb24gaGV4VG9TdHIoJGhleCkKewogICAgJHN0cj0iIjsKICAgIGZvciAoJGk9MDskaTxzdHJsZW4oJGhleCktMTskaSs9MikKICAgICAgICAkc3RyLj1jaHIoaGV4ZGVjKCRoZXhbJGldLiRoZXhbJGkrMV0pKTsKICAgIHJldHVybiAkc3RyOwp9CgpmdW5jdGlvbiByZW1vdmVXb3JkV3JhcCgkdGV4dCkKewogICAgcmV0dXJuKHN0cl9yZXBsYWNlKCIgIiwgIiZuYnNwOyIsICR0ZXh0KSk7Cn0KCmZ1bmN0aW9uIF9odG1sZW50aXRpZXMoJHN0cmluZywgJHF1b3RlX3N0eWxlPUVOVF9DT01QQVQsICRjaGFyc2V0PSJVVEYtOCIpCnsKICAgIGlmICgkY2hhcnNldCAhPSAiVVRGLTgiKQogICAgewogICAgICAgICRzdHJpbmcgPSBodG1sZW50aXRpZXMoJHN0cmluZywgJHF1b3RlX3N0eWxlLCAkY2hhcnNldCk7CiAgICAgICAgJHN0cmluZyA9IHN0cl9yZXBsYWNlKCJcIiIsICImcXVvdDsiLCAkc3RyaW5nKTsKICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoIiciLCAiJmFwb3M7IiwgJHN0cmluZyk7CiAgICB9CiAgICBlbHNlCiAgICB7ICAgCiAgICAgICAgJHN0cmluZyA9IHN0cl9yZXBsYWNlKCImIiwgIiZhbXA7IiwgJHN0cmluZyk7CiAgICAgICAgJHN0cmluZyA9IHN0cl9yZXBsYWNlKCJcIiIsICImcXVvdDsiLCAkc3RyaW5nKTsKICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoIiciLCAiJmFwb3M7IiwgJHN0cmluZyk7CiAgICAgICAgJHN0cmluZyA9IHN0cl9yZXBsYWNlKCI8IiwgIiZsdDsiLCAkc3RyaW5nKTsKICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoIj4iLCAiJmd0OyIsICRzdHJpbmcpOwogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJHJldCk7CiAgICB9CgogICAgcmV0dXJuKCRzdHJpbmcpOyAgICAKfQoKZnVuY3Rpb24gcmVwbGFjZV9udW1fZW50aXR5KCRvcmQpCnsKICAgICRvcmQgPSAkb3JkWzFdOwogICAgaWYgKHByZWdfbWF0Y2goJy9eeChbMC05YS1mXSspJC9pJywgJG9yZCwgJG1hdGNoKSkKICAgIHsKICAgICAgICAkb3JkID0gaGV4ZGVjKCRtYXRjaFsxXSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJG9yZCA9IGludHZhbCgkb3JkKTsKICAgIH0KICAgCiAgICAkbm9fYnl0ZXMgPSAwOwogICAgJGJ5dGUgPSBhcnJheSgpOwoKICAgIGlmICgkb3JkIDwgMTI4KQogICAgewogICAgICAgIHJldHVybiBjaHIoJG9yZCk7CiAgICB9CiAgICBlbHNlaWYgKCRvcmQgPCAyMDQ4KQogICAgewogICAgICAgICRub19ieXRlcyA9IDI7CiAgICB9CiAgICBlbHNlaWYgKCRvcmQgPCA2NTUzNikKICAgIHsKICAgICAgICAkbm9fYnl0ZXMgPSAzOwogICAgfQogICAgZWxzZWlmICgkb3JkIDwgMTExNDExMikKICAgIHsKICAgICAgICAkbm9fYnl0ZXMgPSA0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzd2l0Y2goJG5vX2J5dGVzKQogICAgewogICAgICAgIGNhc2UgMjoKICAgICAgICB7CiAgICAgICAgICAgICRwcmVmaXggPSBhcnJheSgzMSwgMTkyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgMzoKICAgICAgICB7CiAgICAgICAgICAgICRwcmVmaXggPSBhcnJheSgxNSwgMjI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgNDoKICAgICAgICB7CiAgICAgICAgICAgICRwcmVmaXggPSBhcnJheSg3LCAyNDApOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbm9fYnl0ZXM7ICRpKyspCiAgICB7CiAgICAgICAgJGJ5dGVbJG5vX2J5dGVzIC0gJGkgLSAxXSA9ICgoJG9yZCAmICg2MyAqIHBvdygyLCA2ICogJGkpKSkgLyBwb3coMiwgNiAqICRpKSkgJiA2MyB8IDEyODsKICAgIH0KCiAgICAkYnl0ZVswXSA9ICgkYnl0ZVswXSAmICRwcmVmaXhbMF0pIHwgJHByZWZpeFsxXTsKCiAgICAkcmV0ID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbm9fYnl0ZXM7ICRpKyspCiAgICB7CiAgICAgICAgJHJldCAuPSBjaHIoJGJ5dGVbJGldKTsKICAgIH0KCiAgICByZXR1cm4gJHJldDsKfQoKZnVuY3Rpb24gX2h0bWxfZW50aXR5X2RlY29kZSgkc3RyKQp7CiAgICAkc3RyID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvJiMoWzAtOWEtZnhdKyk7L21pJywgJ3JlcGxhY2VfbnVtX2VudGl0eScsICRzdHIpOwogICAgCiAgICByZXR1cm4oJHN0cik7Cn0KCmZ1bmN0aW9uIGV4dHJhY3RJbnQoJHN0ciwgJGRlZmF1bHRWYWx1ZT0wKQp7CiAgICBpZiAoaXNfaW50KCRzdHIpKQogICAgICAgIHJldHVybigkc3RyKTsKICAgIGlmIChpc19mbG9hdCgkc3RyKSkKICAgICAgICByZXR1cm4oKGludCkkc3RyKTsKICAgIGlmIChpc19kb3VibGUoJHN0cikpCiAgICAgICAgcmV0dXJuKChpbnQpJHN0cik7CiAgICBpZiAoIWlzX3N0cmluZygkc3RyKSkKICAgICAgICAkc3RyID0gIiI7CiAgICAKICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiICIsICIiLCAkc3RyKTsKCiAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoWzAtOS1dKyl8IiwgJHN0ciwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgIHsKICAgICAgICByZXR1cm4oKGludClzdHJfcmVwbGFjZSgiICIsICIiLCAkbWF0Y2hlc1swXVsxXSkpOwogICAgfSAgICAKICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoJGRlZmF1bHRWYWx1ZSA9PT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oKGludCkkZGVmYXVsdFZhbHVlKTsKICAgIH0KfQoKZnVuY3Rpb24gZXh0cmFjdEJvb2woJHN0ciwgJGRlZmF1bHRWYWx1ZT1mYWxzZSkKewogICAgaWYgKGlzX2Jvb2woJHN0cikpCiAgICAgICAgcmV0dXJuKCRzdHIgPyB0cnVlIDogZmFsc2UpOwogICAgaWYgKGlzX2ludCgkc3RyKSkKICAgICAgICByZXR1cm4oJHN0ciA/IHRydWUgOiBmYWxzZSk7CiAgICBpZiAoIWlzX3N0cmluZygkc3RyKSkKICAgICAgICAkc3RyID0gIiI7CiAgICAKICAgIHJldHVybihzdHJ0b2xvd2VyKCRzdHIpID09ICJ0cnVlIiA/IHRydWUgOiBmYWxzZSk7Cn0KCmZ1bmN0aW9uIGV4dHJhY3RGbG9hdCgkc3RyLCAkZGVmYXVsdFZhbHVlPTApCnsKICAgIGlmIChpc19mbG9hdCgkc3RyKSB8fCBpc19pbnQoJHN0cikpCiAgICAgICAgcmV0dXJuKCRzdHIpOwogICAgaWYgKCFpc19zdHJpbmcoJHN0cikpCiAgICAgICAgJHN0ciA9ICIiOwogICAgCiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIiwiLCAiLiIsICRzdHIpOwogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCIgIiwgIiIsICRzdHIpOwogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCImbmJzcDsiLCAiIiwgJHN0cik7CiAgICAKICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbMC05LVxcLl0rKXwiLCAkc3RyLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgewogICAgICAgIHJldHVybigoZmxvYXQpc3RyX3JlcGxhY2UoIiAiLCAiIiwgJG1hdGNoZXNbMF1bMV0pKTsKICAgIH0gICAgCiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCRkZWZhdWx0VmFsdWUgPT09IE5VTEwpCiAgICAgICAgICAgIHJldHVybihOVUxMKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKChmbG9hdCkkZGVmYXVsdFZhbHVlKTsKICAgIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFNlY29uZHMoJHN0ciwgJGRlZmF1bHRWYWx1ZT0wKQp7CiAgICBpZiAoaXNfZmxvYXQoJHN0cikgfHwgaXNfaW50KCRzdHIpKQogICAgICAgIHJldHVybigkc3RyKTsKICAgIGlmICghaXNfc3RyaW5nKCRzdHIpKQogICAgICAgICRzdHIgPSAiIjsKICAgIAogICAgJHRpbWUgPSBleHRyYWN0SW50KCRzdHIpOwogICAgaWYgKHN0cnBvcygkc3RyLCAibW9uIikpCiAgICAgICAgJHRpbWUgPSAkdGltZSo2MCo2MCoyNCozMDsKICAgIGVsc2UgaWYgKHN0cnBvcygkc3RyLCAibXMiKSkKICAgICAgICAkdGltZSA9ICR0aW1lLzEwMDA7CiAgICBlbHNlIGlmIChzdHJwb3MoJHN0ciwgIm0iKSkKICAgICAgICAkdGltZSA9ICR0aW1lKjYwOwogICAgZWxzZSBpZiAoc3RycG9zKCRzdHIsICJoIikgIT09IEZBTFNFKQogICAgICAgICR0aW1lID0gJHRpbWUqNjAqNjA7CiAgICBlbHNlIGlmIChzdHJwb3MoJHN0ciwgImQiKSAhPT0gRkFMU0UpCiAgICAgICAgJHRpbWUgPSAkdGltZSo2MCo2MCoyNDsKICAgIGVsc2UgaWYgKHN0cnBvcygkc3RyLCAieSIpKQogICAgICAgICR0aW1lID0gJHRpbWUqNjAqNjAqMjQqMzY1OwogICAgICAgCiAgICByZXR1cm4oJHRpbWUpOwp9CgpmdW5jdGlvbiBleHRyYWN0Qnl0ZXMoJHN0ciwgJGRlZmF1bHRWYWx1ZT0wKQp7CiAgICBpZiAoaXNfZmxvYXQoJHN0cikgfHwgaXNfaW50KCRzdHIpKQogICAgICAgIHJldHVybigkc3RyKTsKICAgIGlmICghaXNfc3RyaW5nKCRzdHIpKQogICAgICAgICRzdHIgPSAiIjsKICAgIAogICAgJGJ5dGVzID0gZXh0cmFjdEZsb2F0KCRzdHIpOwogICAgaWYgKHN0cmlwb3MoJHN0ciwgIlRCIikpCiAgICAgICAgJGJ5dGVzID0gJGJ5dGVzKjEwMjQqMTAyNCoxMDI0KjEwMjQ7CiAgICBlbHNlIGlmIChzdHJpcG9zKCRzdHIsICJHQiIpKQogICAgICAgICRieXRlcyA9ICRieXRlcyoxMDI0KjEwMjQqMTAyNDsKICAgIGVsc2UgaWYgKHN0cmlwb3MoJHN0ciwgIk1CIikpCiAgICAgICAgJGJ5dGVzID0gJGJ5dGVzKjEwMjQqMTAyNDsKICAgIGVsc2UgaWYgKHN0cmlwb3MoJHN0ciwgImtCIikpCiAgICAgICAgJGJ5dGVzID0gJGJ5dGVzKjEwMjQ7CiAgICAgICAKICAgIHJldHVybigkYnl0ZXMpOwp9CgpmdW5jdGlvbiBnZXRFbmRFbGxpcHNpcygkdmFsdWUsICRsZW5ndGg9NTAsICRlbGxpcHNpcz0iLi4uIikKewogICAgcmV0dXJuKGdldFdvcmRFbmRFbGxpcHNpcygkdmFsdWUsICRsZW5ndGgsICRlbGxpcHNpcykpOwp9CgpmdW5jdGlvbiBnZXRXb3JkRW5kRWxsaXBzaXMoJHZhbHVlLCAkbGVuZ3RoPTUwLCAkZWxsaXBzaXM9Ii4uLiIpCnsKICAgIGlmICghJGxlbmd0aCkKICAgICAgICAkbGVuZ3RoID0gMTAwMDsKICAgIAogICAgJHZhbHVlID0gdHJhbnNsYXRlKCR2YWx1ZSk7CiAgICAKICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCI+IiwgIj4gIiwgJHZhbHVlKTsKICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCJcbiIsICIgIiwgJHZhbHVlKTsKICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCImbmJzcDsiLCAiICIsICR2YWx1ZSk7CiAgICAkdmFsdWUgPSBzdHJpcF90YWdzKCR2YWx1ZSk7CiAgICAKICAgICR2YWx1ZSA9IGVuZEVsbGlwc2lzKCR2YWx1ZSwgJGxlbmd0aCwgJGVsbGlwc2lzKTsKCiAgICByZXR1cm4oJHZhbHVlKTsKfQoKZnVuY3Rpb24gZ2V0Q2hhckVuZEVsbGlwc2lzKCR2YWx1ZSwgJGxlbmd0aD01MCwgJGVsbGlwc2lzPSIuLi4iKQp7CiAgICBpZiAoISRsZW5ndGgpCiAgICAgICAgJGxlbmd0aCA9IDEwMDAwMDsKCiAgICAkdmFsdWUgPSB0cmFuc2xhdGUoJHZhbHVlKTsKICAgIAogICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIj4iLCAiPiAiLCAkdmFsdWUpOwogICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIlxuIiwgIiAiLCAkdmFsdWUpOwogICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIiZuYnNwOyIsICIgIiwgJHZhbHVlKTsKICAgICR2YWx1ZSA9IHN0cmlwX3RhZ3MoJHZhbHVlKTsKICAgIAogICAgaWYgKF9zdHJsZW4oJHZhbHVlKSA+ICRsZW5ndGgpCiAgICAgICAgJHZhbHVlID0gX3N1YnN0cigkdmFsdWUsIDAsICRsZW5ndGgtX3N0cmxlbigkZWxsaXBzaXMpKS4kZWxsaXBzaXM7CgogICAgcmV0dXJuKCR2YWx1ZSk7Cn0KCmZ1bmN0aW9uIGlzX3V0Zjhfc3RhcnQoJGIpIAp7CiAgICByZXR1cm4oKCRiICYgMHg4MCkgPT0gMCkgfHwgKCRiICYgMHg0MCk7Cn0KCmZ1bmN0aW9uIF9zdWJzdHIoJHN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoPU5VTEwpCnsKICAgIGlmICgkbGVuZ3RoID09PSBOVUxMKQogICAgICAgICRsZW5ndGggPSBfc3RybGVuKCRzdHJpbmcpOwoKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N1YnN0ciIpKQogICAgICAgIHJldHVybihtYl9zdWJzdHIoJHN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoKSk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgJHJldCA9ICIiOwogICAgICAgICR1aSA9IC0xOwogICAgICAgIGZvciAoJGkgPSAwIDsgJGkgPCBzdHJsZW4oJHN0cmluZykgOyAkaSsrKQogICAgICAgIHsKICAgICAgICAgICAgJGIgPSAkc3RyaW5nWyRpXTsKICAgICAgICAgICAgaWYgKGlzX3V0Zjhfc3RhcnQob3JkKCRiKSkpCiAgICAgICAgICAgICAgICAkdWkrKzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJHVpID49ICRzdGFydCAmJiAkdWkgPCAkc3RhcnQrJGxlbmd0aCkKICAgICAgICAgICAgICAgICRyZXQgLj0gJGI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9ICAgIAp9CgpmdW5jdGlvbiBfc3RybGVuKCRzdHJpbmcpCnsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cmxlbiIpKQogICAgICAgIHJldHVybihtYl9zdHJsZW4oJHN0cmluZykpOwogICAgZWxzZQogICAgewogICAgICAgICR1aSA9IDA7CiAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IHN0cmxlbigkc3RyaW5nKSA7ICRpKyspCiAgICAgICAgewogICAgICAgICAgICAkYiA9ICRzdHJpbmdbJGldOwogICAgICAgICAgICBpZiAoaXNfdXRmOF9zdGFydChvcmQoJGIpKSkKICAgICAgICAgICAgICAgICR1aSsrOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKCR1aSk7CgogICAgICAgIC8vJF9zdHJpbmcgPSBpY29udigidXRmOCIsICJBU0NJSS8vVFJBTlNMSVQiLCAkc3RyaW5nKTsgLy8gamluYWsgbmFwci4gdiBFTiB2ZXJ6aSBzIHRleHRlbSB2IENaIHRvIHNrb25jaSBuYSBwcnZuaW0gem5ha3UgcyBkaWFrcml0aWtvdQogICAgICAgIC8vJGxlbmd0aCA9IHN0cmxlbigkX3N0cmluZyk7CgogICAgICAgIC8vJFRyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKTsKICAgICAgICAvLyRfc3RyaW5nID0gaWNvbnYoInV0ZjgiLCAkVHJhbnNsYXRvci0+Y2hhcnNldC4iLy9UUkFOU0xJVCIsICRzdHJpbmcpOwogICAgICAgIC8vJF9zdHJpbmcgPSBpY29udigidXRmOCIsICJBU0NJSS8vVFJBTlNMSVQiLCAkc3RyaW5nKTsgLy8gamluYWsgbmFwci4gdiBFTiB2ZXJ6aSBzIHRleHRlbSB2IENaIHRvIHNrb25jaSBuYSBwcnZuaW0gem5ha3UgcyBkaWFrcml0aWtvdQogICAgICAgIC8vJGxlbmd0aCA9IHN0cmxlbigkX3N0cmluZyk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRsZW5ndGgpOwogICAgfSAgICAKfQoKZnVuY3Rpb24gX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQ9MCkKewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygibWJfc3RycG9zIikpCiAgICAgICAgcmV0dXJuKG1iX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpKTsKICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBUT0RPIHVkZWxhdCBwb2RvYm5lIGpha28gc3Vic3RyCiAgICAgICAgCiAgICAgICAgJFRyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKTsKICAgICAgICAkaGF5c3RhY2sgPSBpY29udigidXRmOCIsICRUcmFuc2xhdG9yLT5nZXRDaGFyc2V0KCksICRoYXlzdGFjayk7CiAgICAgICAgJG5lZWRsZSA9IGljb252KCJ1dGY4IiwgJFRyYW5zbGF0b3ItPmdldENoYXJzZXQoKSwgJG5lZWRsZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpKTsKICAgIH0KICAgIHJldHVybihzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KSk7Cn0KCmZ1bmN0aW9uIF9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldD0wKQp7CiAgICBpZiAoISRuZWVkbGUpCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoIl9zdHJpcG9zKCkgLSBuZWVkbGUgaXMgZW1wdHkiLCBtdFdhcm5pbmcpOwogICAgICAgIAogICAgICAgIHJldHVybihGQUxTRSk7CiAgICB9CiAgICBpZiAoISRoYXlzdGFjaykKICAgIHsKICAgICAgICBzaG93TWVzc2FnZSgiX3N0cmlwb3MoKSAtIGhheXN0YWNrIGlzIGVtcHR5IiwgbXRXYXJuaW5nKTsKICAgICAgICAKICAgICAgICByZXR1cm4oRkFMU0UpOwogICAgfQogICAgCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJtYl9zdHJpcG9zIikpCiAgICAgICAgcmV0dXJuKG1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KSk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gVE9ETyB1ZGVsYXQgcG9kb2JuZSBqYWtvIHN1YnN0cgoKICAgICAgICAkVHJhbnNsYXRvciA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpOwogICAgICAgICRoYXlzdGFjayA9IGljb252KCJ1dGY4IiwgJFRyYW5zbGF0b3ItPmdldENoYXJzZXQoKSwgJGhheXN0YWNrKTsKICAgICAgICAkbmVlZGxlID0gaWNvbnYoInV0ZjgiLCAkVHJhbnNsYXRvci0+Z2V0Q2hhcnNldCgpLCAkbmVlZGxlKTsKICAgICAgICAkaGF5c3RhY2sgPSBzdHJ0b2xvd2VyKCRoYXlzdGFjayk7CiAgICAgICAgJG5lZWRsZSA9IHN0cnRvbG93ZXIoJG5lZWRsZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpKTsKICAgIH0gICAgCn0KCmZ1bmN0aW9uIF9zdHJ0b2xvd2VyKCRzdHJpbmcpCnsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIiKSkKICAgICAgICByZXR1cm4obWJfc3RydG9sb3dlcigkc3RyaW5nKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKHN0cnRvbG93ZXIoJHN0cmluZykpOwogICAgLyoKICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBUT0RPIG5lYnVkZSBmdW5nb3ZhdCBjZXN0aW5hIHYgZW4gbXV0YWNpIC0gcG90cmViYSB1ZGVsYXQgcG9tb2NpIHZvbGFuaSBteXNxbCBTRUxFQ1QgVE9MT1dFUignc3RyaW5nJykgLSB0YW0gamUgdXRmLTggdiBwb3JhZGt1CiAgICAgICAgJERiTGluayA9IGdldERiTGlua0J5VHlwZShmYWxzZSk7CiAgICAgICAgJERiTGluay0+cXVlcnkoIlNFTEVDVCBMT1dFUignIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRzdHJpbmcpLiInKSBBUyByZXN1bHQiKTsKICAgICAgICAkcmVzdWx0ID0gJERiTGluay0+bmV4dFJlY29yZCgpOwogICAgICAgIAogICAgICAgIHJldHVybigkcmVzdWx0WyJyZXN1bHQiXSk7CiAgICB9ICAgIAogICAgKi8KfQoKZnVuY3Rpb24gX3N0cnRvdXBwZXIoJHN0cmluZykKewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygibWJfc3RydG91cHBlciIpKQogICAgICAgIHJldHVybihtYl9zdHJ0b3VwcGVyKCRzdHJpbmcpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oc3RydG91cHBlcigkc3RyaW5nKSk7Cn0KCmZ1bmN0aW9uIGNocl91dGY4KCRjb2RlKSAKewogICAgaWYgKCRjb2RlIDwgMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZWlmICgkY29kZSA8IDEyOCkgewogICAgICAgIHJldHVybiBjaHIoJGNvZGUpOwogICAgfSBlbHNlaWYgKCRjb2RlIDwgMjA0OCkgewogICAgICAgIHJldHVybiBjaHIoMTkyIHwgKCRjb2RlID4+IDYpKSAuIGNocigxMjggfCAoJGNvZGUgJiA2MykpOwogICAgfSBlbHNlaWYgKCRjb2RlIDwgNjU1MzYpIHsKICAgICAgICByZXR1cm4gY2hyKDIyNCB8ICgkY29kZSA+PiAxMikpIC4gY2hyKDEyOCB8ICgoJGNvZGUgPj4gNikgJiA2MykpIC4gY2hyKDEyOCB8ICgkY29kZSAmIDYzKSk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjaHIoMjQwIHwgKCRjb2RlID4+IDE4KSkgLiBjaHIoMTI4IHwgKCgkY29kZSA+PiAxMikgJiA2MykpIC4gY2hyKDEyOCB8ICgoJGNvZGUgPj4gNikgJiA2MykpIC4gY2hyKDEyOCB8ICgkY29kZSAmIDYzKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZUJPTSgkc3RyKQp7CiAgICBpZihzdWJzdHIoJHN0ciwgMCwzKSA9PSBwYWNrKCJDQ0MiLDB4ZWYsMHhiYiwweGJmKSkgCiAgICB7CiAgICAgICAgJHN0cj1zdWJzdHIoJHN0ciwgMyk7CiAgICB9ICAgIAogICAgcmV0dXJuKCRzdHIpOwp9CgpmdW5jdGlvbiBfaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpCnsKICAgIGlmIChpc19zdHJpbmcoJHZhbHVlKSkKICAgIHsKICAgICAgICAkdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSk7CiAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIlxyIiwgIiIsICR2YWx1ZSk7CiAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIlxuIiwgIiYjMTM7IiwgJHZhbHVlKTsKICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXHQiLCAiJiMwOTsiLCAkdmFsdWUpOwogICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCI8IiwgIiZsdDsiLCAkdmFsdWUpOwogICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCI+IiwgIiZndDsiLCAkdmFsdWUpOwogICAgfQogICAgcmV0dXJuKCR2YWx1ZSk7Cn0KCmZ1bmN0aW9uIHVuaWNvZGVfZGVjb2RlKCR0eHQpIAp7CiAgICBpZiAoIV9pc19hcnJheSgkdHh0KSkKICAgIHsKICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwldTAoW1s6YWxudW06XV17M30pfCIsICR0eHQsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRtYXRjaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gdXJsZGVjb2RlKCImI3giLiRtYXRjaFsxXS4iOyIpOwogICAgICAgICAgICAgICAgJHR4dCA9IHN0cl9yZXBsYWNlKCIldTAiLiRtYXRjaFsxXSwgJHJlcGxhY2VtZW50LCAkdHh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4oJHR4dCk7Cn0KCmZ1bmN0aW9uIF9yZXBsYWNlX3VuaWNvZGVfZXNjYXBlX3NlcXVlbmNlKCRtYXRjaCkgCnsKICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoWzFdKSwgJ1VURi04JywgJ1VDUy0yQkUnKTsKfQoKZnVuY3Rpb24gdW5pY29kZV91bmVzY2FwZSgkdmFsdWUpIAp7CiAgICBpZiAoc3RycG9zKCR2YWx1ZSwgIlxcdSIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICBpZiAodHJ1ZSB8fCBzdHJsZW4oJHZhbHVlKSA8IDAuNSoxMDI0KjEwMjQpCiAgICAgICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKCR2YWx1ZSk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpLiI8aHI+IjsKICAgICAgICAgICAgJHZhbHVlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXFxcXHUoWzAtOWEtZl17NH0pL2knLCAnX3JlcGxhY2VfdW5pY29kZV9lc2NhcGVfc2VxdWVuY2UnLCAkdmFsdWUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJ1bmljb2RlX3VuZXNjYXBlKCkgLSBzdHJpbmcgaXMgdG9vIGJpZyB0byB1bmVzY2FwZSIsIG10V2FybmluZyk7CiAgICB9CiAgICByZXR1cm4oJHZhbHVlKTsKfQogICAgCmZ1bmN0aW9uIF9pY29udigkaW5fY2hhcnNldCwgJG91dF9jaGFyc2V0LCAkc3RyKQp7CiAgICBpZiAoISRpbl9jaGFyc2V0IHx8ICEkb3V0X2NoYXJzZXQgfHwgc3RydG9sb3dlcigkaW5fY2hhcnNldCkgPT0gc3RydG9sb3dlcigkb3V0X2NoYXJzZXQpKQogICAgICAgIHJldHVybigkc3RyKTsKCiAgICBpZiAoX2lzX2FycmF5KCRzdHIpKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGZvcmVhY2goJHN0ciBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXRbX2ljb252KCRpbl9jaGFyc2V0LCAkb3V0X2NoYXJzZXQsICRrZXkpXSA9IF9pY29udigkaW5fY2hhcnNldCwgJG91dF9jaGFyc2V0LCAkdmFsdWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CgogICAgLy8gISEhISEhICB1c2UgVFJBTlNMSVQgaW5zdGVhZCBvZiBJR05PUkUKICAgIAogICAgaWYgKEZBTFNFICYmIHN0cnRvbG93ZXIoJGluX2NoYXJzZXQpID09ICJ1dGYtOCIpICAvLyBvZGViZXJlIFxuICEhISEgdG8gamUgc3BhdG5lCiAgICB7CiAgICAgICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycwogICAgICAgICRzdHIgPSBzdHJfcmVwbGFjZShjaHIoMHgwRCkuY2hyKDB4MEEpLCAiIiwgJHN0cik7ICAgCiAgICB9CgogICAgaWYgKCRpbl9jaGFyc2V0ICYmICRvdXRfY2hhcnNldCAmJiBzdHJwb3Moc3RydG9sb3dlcigkb3V0X2NoYXJzZXQpLCBzdHJ0b2xvd2VyKCRpbl9jaGFyc2V0KSkgPT09IDApCiAgICB7CiAgICAgICAgLy8gbm8gbmVlZCB0byBlbmNvZGUgICB1dGYtOCA9PiBVVEYtOC8vSUdOT1JFCiAgICAgICAgcmV0dXJuKCRzdHIpOyAgIAogICAgfQogICAgCiAgICBpZiAoJG91dF9jaGFyc2V0ICYmIHN0cnBvcygkb3V0X2NoYXJzZXQsICIvLyIpID09PSBGQUxTRSkKICAgICAgICAkb3V0X2NoYXJzZXQgLj0gIi8vVFJBTlNMSVQiOwogICAgCiAgICAkb2xkRXJyb3JSZXBvcnRpbmcgPSBpbmlfZ2V0KCJlcnJvcl9yZXBvcnRpbmciKTsKICAgIGVycm9yX3JlcG9ydGluZyhFX0FMTCk7CgoKICAgIG9iX3N0YXJ0KCk7CgogICAgLy8gSW50ZXJlc3RpbmdseSwgc2V0dGluZyBkaWZmZXJlbnQgdGFyZ2V0IGxvY2FsZXMgcmVzdWx0cyBpbiBkaWZmZXJlbnQsIHlldCBhcHByb3ByaWF0ZSwgdHJhbnNsaXRlcmF0aW9ucwogICAgLy9zZXRsb2NhbGUoTENfQUxMLCBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKS0+bG9jYWxlKTsKICAgIC8vc2V0bG9jYWxlKExDX0FMTCwgImNzX0NaLnV0ZjgiKTsKCiAgICBpZiAoZmFsc2UgJiYgZnVuY3Rpb25fZXhpc3RzKCJtYl9jb252ZXJ0X2VuY29kaW5nIikpICAgLy8gbmVqc3BvbGVobGl2ZWpzaQogICAgewogICAgICAgICRvdXRfY2hhcnNldCA9IGV4cGxvZGUoIi8vIiwgJG91dF9jaGFyc2V0KTsKICAgICAgICAkb3V0X2NoYXJzZXQgPSAkb3V0X2NoYXJzZXRbMF07CiAgICAgICAgCiAgICAgICAgbWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXIoIm5vbmUiKTsKICAgICAgICAkcmVzdWx0ID0gbWJfY29udmVydF9lbmNvZGluZygkc3RyLCAkb3V0X2NoYXJzZXQsICRpbl9jaGFyc2V0KTsKICAgIH0KICAgIGVsc2UgaWYgKGZ1bmN0aW9uX2V4aXN0cygiaWNvbnYiKSkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gaWNvbnYoJGluX2NoYXJzZXQsICRvdXRfY2hhcnNldCwgJHN0cik7CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAgIHNob3dNZXNzYWdlKCJfaWNvbnYoKSBubyBtZXRob2Qgc3VwcG9ydGVkIG9uIHRoaXMgc2VydmVyIiwgbXRFcnJvcik7CiAgICAgICAgJHJlc3VsdCA9ICRzdHI7CiAgICB9CiAgICAkZXJyb3JzID0gb2JfZ2V0X2NvbnRlbnRzKCk7CgogICAgb2JfZW5kX2NsZWFuKCk7CiAgICBlcnJvcl9yZXBvcnRpbmcoJG9sZEVycm9yUmVwb3J0aW5nKTsKICAgIAogICAgaWYgKCRlcnJvcnMpCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoIl9pY29udihcIiIuJGluX2NoYXJzZXQuIlwiLCBcIiIuJG91dF9jaGFyc2V0LiJcIiwgXCIiLiRzdHIuIlwiKTogIi4kZXJyb3JzLCBtdEVycm9yKTsKICAgIH0KCiAgICByZXR1cm4oJHJlc3VsdCk7Cn0KCmZ1bmN0aW9uIHN0cl9kdW1wKCR2YXJpYWJsZSwgJGZvcm1hdEh0bWw9ZmFsc2UpCnsKICAgIG9iX3N0YXJ0KCk7CiAgICB2YXJfZHVtcCgkdmFyaWFibGUpOwogICAgJHN0ciA9IG9iX2dldF9jb250ZW50cygpOwogICAgb2JfZW5kX2NsZWFuKCk7CiAgICAKICAgIGlmICgkZm9ybWF0SHRtbCkKICAgIHsKICAgICAgICAkc3RyID0gc3RyX3JlcGxhY2UoIiAiLCAiJm5ic3A7IiwgJHN0cik7CiAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkc3RyKTsKICAgIH0KICAgIAogICAgcmV0dXJuKCRzdHIpOwp9CgpmdW5jdGlvbiBzdHJfZHVtcF90cmVlKCR2YXJpYWJsZSwgJGRpc3BsYXlQcm9wZXJ0eSwgJGl0ZW1zUHJvcGVydHksICRmb3JtYXRIdG1sPWZhbHNlKQp7CiAgICAkc3RyIC49ICI8dWw+IjsKICAgICRzdHIgLj0gX3N0cl9kdW1wX3RyZWUoJHZhcmlhYmxlLCAkZGlzcGxheVByb3BlcnR5LCAkaXRlbXNQcm9wZXJ0eSk7CiAgICAkc3RyIC49ICI8L3VsPiI7CiAgICAgICAgCiAgICBpZiAoJGZvcm1hdEh0bWwpCiAgICB7CiAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCIgIiwgIiZuYnNwOyIsICRzdHIpOwogICAgICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiXG4iLCAiPGJyIC8+IiwgJHN0cik7CiAgICB9CiAgICAKICAgIHJldHVybigkc3RyKTsKfQoKZnVuY3Rpb24gX3N0cl9kdW1wX3RyZWUoJHZhcmlhYmxlLCAkZGlzcGxheVByb3BlcnR5LCAkaXRlbXNQcm9wZXJ0eSkKewogICAgJHN0ciAuPSAiPGxpPiI7CiAgICAkc3RyIC49IHN0cl9kdW1wKCR2YXJpYWJsZS0+JGRpc3BsYXlQcm9wZXJ0eSk7CiAgICBpZiAoY291bnQoJHZhcmlhYmxlLT4kaXRlbXNQcm9wZXJ0eSkpCiAgICB7CiAgICAgICAgJHN0ciAuPSAiPHVsPiI7CiAgICAgICAgZm9yZWFjaCgkdmFyaWFibGUtPiRpdGVtc1Byb3BlcnR5IGFzICRpdGVtKQogICAgICAgICAgICAkc3RyIC49IF9zdHJfZHVtcF90cmVlKCRpdGVtLCAkZGlzcGxheVByb3BlcnR5LCAkaXRlbXNQcm9wZXJ0eSk7CiAgICAgICAgJHN0ciAuPSAiPC91bD4iOwogICAgfQogICAgJHN0ciAuPSAiPC9saT4iOwogICAgICAgIAogICAgcmV0dXJuKCRzdHIpOwp9CgpmdW5jdGlvbiBfc3RyaXBzbGFzaGVzKCR2YWx1ZSkKewogICAgaWYgKF9pc19hcnJheSgkdmFsdWUpKQogICAgewogICAgICAgIGZvcmVhY2goJHZhbHVlIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICB7CiAgICAgICAgICAgICR2YWx1ZVska2V5XSA9IF9zdHJpcHNsYXNoZXMoJHZhbCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChpc19zdHJpbmcoJHZhbHVlKSkKICAgICAgICAgICAgJHZhbHVlID0gc3RyaXBzbGFzaGVzKCR2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4oJHZhbHVlKTsKfQoKZnVuY3Rpb24gY29udmVydFRvQmFzaWNMZXR0ZXJzKCRzdHIsICRsYW5nPSIiKQp7CiAgICBnbG9iYWwgJGxhbmd1YWdlOwogICAgCiAgICBpZiAoJGxhbmcgPT0gIiIpCiAgICAgICAgJGxhbmcgPSAkbGFuZ3VhZ2U7CiAgICAKICAgICRUcmFuc2xhdG9yID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9ycyIpLT5nZXRUcmFuc2xhdG9yKCRsYW5nKTsKICAgIAogICAgaWYgKCRUcmFuc2xhdG9yKQogICAgewogICAgICAgIC8vZHVtcCgkVHJhbnNsYXRvci0+bGV0dGVycyk7CiAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCRUcmFuc2xhdG9yLT5sZXR0ZXJzKSA7ICRpKyspCiAgICAgICAgewogICAgICAgICAgICAkbGV0dGVyID0gJFRyYW5zbGF0b3ItPmxldHRlcnNbJGldOwogICAgICAgICAgICBpZiAoX3N0cmxlbigkbGV0dGVyKSA9PSAxKSAvLyBOT1QgJ2NoJwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KCRsZXR0ZXIsICRUcmFuc2xhdG9yLT5iYXNpY0xldHRlcnMpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAkc3RyID0gc3RyX3JlcGxhY2UoJGxldHRlciwgJGJhc2ljTGV0dGVyLCAkc3RyKTsKICAgICAgICAgICAgICAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKF9zdHJ0b3VwcGVyKCRsZXR0ZXIpLCBfc3RydG91cHBlcigkYmFzaWNMZXR0ZXIpLCAkc3RyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkYmFzaWNMZXR0ZXIgPSAkbGV0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oJHN0cik7Cn0KICAgIApmdW5jdGlvbiByZXBsYWNlQWNjZW50Q2hhcnMoJHN0ciwgJGxhbmc9IiIpCnsKICAgIHJldHVybihjb252ZXJ0VG9CYXNpY0xldHRlcnMoJHN0ciwgJGxhbmcpKTsKfQoKZnVuY3Rpb24gZ2V0QWNjZW50Q2hhclJlZ0V4cCgkc3RyLCAkbGFuZz0iIikKewogICAgJHN0ciA9IF9zdHJ0b2xvd2VyKGNvbnZlcnRUb0Jhc2ljTGV0dGVycygkc3RyLCAkbGFuZykpOwogICAgCiAgICBnbG9iYWwgJGxhbmd1YWdlOwogICAgCiAgICBpZiAoJGxhbmcgPT0gIiIpCiAgICAgICAgJGxhbmcgPSAkbGFuZ3VhZ2U7CiAgICAKICAgICRUcmFuc2xhdG9yID0gZ2V0T2JqZWN0KCJUcmFuc2xhdG9ycyIpLT5nZXRUcmFuc2xhdG9yKCRsYW5nKTsKICAgIAogICAgaWYgKCRUcmFuc2xhdG9yKQogICAgewogICAgICAgIGZvcmVhY2goJFRyYW5zbGF0b3ItPmFjY2VudExldHRlcnMgYXMgJGJhc2ljTGV0dGVyID0+ICRhY2NlbnRMZXR0ZXJzKQogICAgICAgIHsKICAgICAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCRiYXNpY0xldHRlciwgIlsiLiRiYXNpY0xldHRlci5pbXBsb2RlKCIiLCAkYWNjZW50TGV0dGVycykuIl0iLCAkc3RyKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybigkc3RyKTsKfQoKCmZ1bmN0aW9uIGZvcm1hdE51bWJlcigkbnVtYmVyLCAkdGhvdXNhbmRTZXBhcmF0b3I9Ii4iLCAkZmxvYXRTZXBhcmF0b3I9IiwiLCAkbnVsbEZsb2F0UmVwbGFjZW1lbnQ9IiIpCnsKICAgICRudW1iZXIgPSBAbnVtYmVyX2Zvcm1hdCgkbnVtYmVyLCAyLCAkZmxvYXRTZXBhcmF0b3IsICR0aG91c2FuZFNlcGFyYXRvcik7CiAgICAKICAgIGlmICgkZmxvYXRTZXBhcmF0b3IpCiAgICAgICAgJG51bWJlciA9IHN0cl9yZXBsYWNlKCRmbG9hdFNlcGFyYXRvci4iMDAiLCAkbnVsbEZsb2F0UmVwbGFjZW1lbnQsICRudW1iZXIpOwogICAgICAgIAogICAgcmV0dXJuKCRudW1iZXIpOwp9CgpmdW5jdGlvbiBmb3JtYXRQaG9uZSgkbnVtYmVyLCAkc2VwYXJhdG9yPSIgIiwgJGRpZ2l0cz0zKQp7CiAgICAkbnVtYmVyID0gcHJlZ19yZXBsYWNlKCJ8W14wLTlcXCtdfCIsICIiLCAkbnVtYmVyKTsKICAgICRudW1iZXIyID0gYXJyYXkoKTsKICAgIHdoaWxlKCRudW1iZXIpCiAgICB7CiAgICAgICAgJHBhcnQgPSBzdWJzdHIoJG51bWJlciwgc3RybGVuKCRudW1iZXIpLSRkaWdpdHMsICRkaWdpdHMpOwogICAgICAgICRudW1iZXIyID0gYXJyYXlfbWVyZ2UoYXJyYXkoJHBhcnQpLCAkbnVtYmVyMik7CiAgICAgICAgJG51bWJlciA9IHN1YnN0cigkbnVtYmVyLCAwLCBzdHJsZW4oJG51bWJlciktJGRpZ2l0cyk7CiAgICB9CiAgICAKICAgIGlmIChzdHJwb3MoJG51bWJlcjJbMF0sICIrIikgIT09IEZBTFNFKQogICAgewogICAgICAgICRudW1iZXIycCA9IGFycmF5X3NoaWZ0KCRudW1iZXIyKTsKICAgICAgICAkbnVtYmVyMlswXSA9ICRudW1iZXIycC4kbnVtYmVyMlswXTsKICAgIH0KICAgIAogICAgICAgIAogICAgCiAgICAkbnVtYmVyMiA9IGltcGxvZGUoJHNlcGFyYXRvciwgJG51bWJlcjIpOwogICAgCiAgICByZXR1cm4oJG51bWJlcjIpOwp9CgpmdW5jdGlvbiBpc1ZhbGlkTWFpbCgkbWFpbCkKewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiZmlsdGVyX3ZhciIpKQogICAgICAgIHJldHVybiAoZmlsdGVyX3ZhcigkbWFpbCwgRklMVEVSX1ZBTElEQVRFX0VNQUlMKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKHByZWdfbWF0Y2goICIvXihbYS16QS1aMC05Xy1dKSsoW2EtekEtWjAtOVwuXy1dKSpAKFthLXpBLVowLTlfLV0pKyhcLlthLXpBLVowLTlfLV0rKSskLyIsICRtYWlsKSk7Cn0KCmZ1bmN0aW9uIGlzVmFsaWREYXRlKCRkYXRlLCAkZm9ybWF0PSIiKQp7CiAgICBpZiAoISRmb3JtYXQpCiAgICB7CiAgICAgICAgJFRyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3IiKTsKICAgICAgICAkZm9ybWF0ID0gJFRyYW5zbGF0b3ItPnNob3J0RGF0ZUZvcm1hdDsKICAgIH0KICAgIAogICAgJHJlZ2V4cCA9ICRmb3JtYXQ7CiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoImQiLCAiWzAtM11bMC05XSIsICRyZWdleHApOwogICAgJHJlZ2V4cCA9IHN0cl9yZXBsYWNlKCJqIiwgIlswLTNdP1swLTldIiwgJHJlZ2V4cCk7CiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoIm0iLCAiWzAtMV1bMC05XSIsICRyZWdleHApOwogICAgJHJlZ2V4cCA9IHN0cl9yZXBsYWNlKCJuIiwgIlswLTFdP1swLTldIiwgJHJlZ2V4cCk7CiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoIlkiLCAiWzAtOV1bMC05XVswLTldWzAtOV0iLCAkcmVnZXhwKTsKICAgICRyZWdleHAgPSBzdHJfcmVwbGFjZSgieSIsICJbMC05XVswLTldIiwgJHJlZ2V4cCk7CgogICAgJHJlZ2V4cCA9IHN0cl9yZXBsYWNlKCJnIiwgIlswLTFdP1swLTldIiwgJHJlZ2V4cCk7CiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoIkciLCAiWzAtMl0/WzAtOV0iLCAkcmVnZXhwKTsKICAgICRyZWdleHAgPSBzdHJfcmVwbGFjZSgiaCIsICJbMC0xXVswLTldIiwgJHJlZ2V4cCk7CiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoIkgiLCAiWzAtMl1bMC05XSIsICRyZWdleHApOwogICAgCiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoImkiLCAiWzAtNV1bMC05XSIsICRyZWdleHApOwogICAgJHJlZ2V4cCA9IHN0cl9yZXBsYWNlKCJzIiwgIlswLTVdWzAtOV0iLCAkcmVnZXhwKTsKCiAgICAkcmVnZXhwID0gc3RyX3JlcGxhY2UoIi4iLCAiXFwuIiwgJHJlZ2V4cCk7CiAgICAKICAgIGlmIChwcmVnX21hdGNoX2FsbCgifCIuJHJlZ2V4cC4ifCIsICRkYXRlLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHJldHVybih0cnVlKTsKICAgIAogICAgcmV0dXJuKGZhbHNlKTsKfQoKZnVuY3Rpb24gdG9TdHJpbmcoJHZhbHVlKQp7CiAgICBpZiAoX2lzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgJHZhbHVlID0gVEpTT046OmVuY29kZSgkdmFsdWUpOwogICAgZWxzZSBpZiAoaXNfYm9vbCgkdmFsdWUpKQogICAgewogICAgICAgIGlmICgkdmFsdWUgPT09IHRydWUpCiAgICAgICAgICAgICR2YWx1ZSA9ICJ0cnVlIjsKICAgICAgICBpZiAoJHZhbHVlID09PSBmYWxzZSkKICAgICAgICAgICAgJHZhbHVlID0gImZhbHNlIjsKICAgIH0KICAgIGVsc2UgaWYgKGlzX2Zsb2F0KCR2YWx1ZSkgfHwgaXNfZG91YmxlKCR2YWx1ZSkgfHwgaXNfaW50KCR2YWx1ZSkpCiAgICB7CiAgICAgICAgJHZhbHVlID0gKHN0cmluZykkdmFsdWU7CiAgICAgICAgaWYgKCEkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAkdmFsdWUgPSAiMCI7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoJHZhbHVlID09PSBOVUxMKQogICAgICAgICR2YWx1ZSA9ICIiOwogICAgICAgIAogICAgLy9kdW1wKCR2YWx1ZSk7CiAgICByZXR1cm4oJHZhbHVlKTsgICAKfQoKZnVuY3Rpb24gdG9Cb29sKCR2YWx1ZSkKewogICAgaWYgKGlzX2Jvb2woJHZhbHVlKSkKICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgIGVsc2UgaWYgKGlzX2ludCgkdmFsdWUpKQogICAgICAgIHJldHVybigkdmFsdWUgPiAwKTsKICAgIGVsc2UgaWYgKCR2YWx1ZSA9PT0gInRydWUiIHx8ICR2YWx1ZSA9PT0gIjEiKQogICAgICAgIHJldHVybih0cnVlKTsKICAgIGVsc2UgaWYgKCR2YWx1ZSA9PT0gImZhbHNlIiB8fCAkdmFsdWUgPT09ICIwIikKICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgZWxzZSBpZiAoJHZhbHVlICE9ICIiKQogICAgICAgIHJldHVybih0cnVlKTsKICAgIAogICAgLy9pZiAoJHZhbHVlID09PSBOVUxMKQogICAgLy8gICAgcmV0dXJuKE5VTEwpOyAgICAgLy8gbXVzaSBieXQgTlVMTCAvLyBza3J6IGluc3RhbGF0b3IgenJ1c2VubyBrdnVsaSB0b1N0cmluZyh0b0Jvb2woIiIpKTsgMTI2OTogaWYgKCIudG9TdHJpbmcodG9Cb29sKCRfUkVRVUVTVFsiYXV0b0NvbnRpbnVlIl0pKS4iKSAtIHRvQm9vbCBwcm9zdGUgbXVzaSB2cmFjZXQgdHJ1ZXxmYWxzZQogICAgCiAgICByZXR1cm4oZmFsc2UpOyAgIAp9CgpmdW5jdGlvbiBpc051bWJlcigkdmFsdWUpCnsKICAgIHJldHVybihwcmVnX21hdGNoKCJ8XlswLTlcXC1cXC5dK1wkfCIsIChzdHJpbmcpJHZhbHVlKSk7Cn0KCmZ1bmN0aW9uIHRvSW50KCR2YWx1ZSkKewogICAgcmV0dXJuKChpbnQpJHZhbHVlKTsKfQoKZnVuY3Rpb24gdG9GbG9hdCgkdmFsdWUpCnsKICAgIHJldHVybigoZmxvYXQpJHZhbHVlKTsKfQoKZnVuY3Rpb24gdG9GaWxlTmFtZSgkdmFsdWUpCnsKICAgIHJldHVybihnZXRTYWZlRmlsZU5hbWUoJHZhbHVlKSk7CgogICAgLyogICAgCiAgICAkdmFsdWUgPSByZXBsYWNlQWNjZW50Q2hhcnMoJHZhbHVlKTsKICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCIgIiwgIl8iLCAkdmFsdWUpOwogICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIi8iLCAiXyIsICR2YWx1ZSk7CiAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXFwiLCAiXyIsICR2YWx1ZSk7CiAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiOiIsICItIiwgJHZhbHVlKTsKICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCI/IiwgIiIsICR2YWx1ZSk7CiAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiISIsICIiLCAkdmFsdWUpOwoKICAgIHJldHVybigkdmFsdWUpOyAgIAogICAgKi8KfQoKZnVuY3Rpb24gdG9CeXRlcygkdmFsdWUsICRwcmVjaXNpb249MikKewogICAgJHZhbHVlID0gKGludCkkdmFsdWU7CiAgICBpZiAoJHZhbHVlIDwgMTAyNCkKICAgIHsKICAgICAgICByZXR1cm4oJHZhbHVlLiIgQiIpOwogICAgfQogICAgaWYgKCR2YWx1ZSA8IDEwMjQqMTAyNCkKICAgIHsKICAgICAgICByZXR1cm4ocm91bmQoJHZhbHVlLzEwMjQsICRwcmVjaXNpb24pLiIga0IiKTsKICAgIH0KICAgIGlmICgkdmFsdWUgPCAxMDI0KjEwMjQqMTAyNCkKICAgIHsKICAgICAgICByZXR1cm4ocm91bmQoJHZhbHVlLygxMDI0KjEwMjQpLCAkcHJlY2lzaW9uKS4iIE1CIik7CiAgICB9CiAgICBpZiAoJHZhbHVlIDwgMTAyNCoxMDI0KjEwMjQqMTAyNCkKICAgIHsKICAgICAgICByZXR1cm4ocm91bmQoJHZhbHVlLygxMDI0KjEwMjQqMTAyNCksICRwcmVjaXNpb24pLiIgR0IiKTsKICAgIH0KCiAgICByZXR1cm4ocm91bmQoJHZhbHVlLygxMDI0KjEwMjQqMTAyNCoxMDI0KSwgJHByZWNpc2lvbikuIiBUQiIpOwp9CgpmdW5jdGlvbiBxdW90ZSgkc3RyaW5nKSAKewogICAgJHNlYXJjaCAgPSBhcnJheSgiXHQiLCAiXG4iLCAiXHIiKTsKICAgICRyZXBsYWNlID0gYXJyYXkoICJcXHQiLCAgIlxcbiIsICAiXFxyIik7CiAgICAKICAgIHJldHVybiBzdHJfcmVwbGFjZSgkc2VhcmNoLCAkcmVwbGFjZSwgJHN0cmluZyk7Cn0KCmZ1bmN0aW9uIHVucXVvdGUoJHN0cmluZykgCnsKICAgICRzZWFyY2ggID0gYXJyYXkoIlxcdCIsICJcXG4iLCAiXFxyIik7CiAgICAkcmVwbGFjZSA9IGFycmF5KCAiXHQiLCAgIlxuIiwgICJcciIpOwogICAgCiAgICByZXR1cm4gc3RyX3JlcGxhY2UoJHNlYXJjaCwgJHJlcGxhY2UsICRzdHJpbmcpOwp9CgpmdW5jdGlvbiBpc0Jhc2U2NCgkc3RyKQp7CiAgICByZXR1cm4oYmFzZTY0X2RlY29kZSgkc3RyLCB0cnVlKSAhPT0gRkFMU0UpOwp9CgpmdW5jdGlvbiBjaGFyV3JhcCgkdGV4dCkKewogICAgcmV0dXJuKGdldENoYXJXcmFwKCR0ZXh0KSk7Cn0KICAgIApmdW5jdGlvbiBnZXRDaGFyV3JhcCgkdGV4dCkKewogICAgJHJldCA9ICIiOwogICAgZm9yICgkYyA9IDAgOyAkYyA8IF9zdHJsZW4oJHRleHQpIDsgJGMrKykKICAgIHsKICAgICAgICAkcmV0IC49IF9zdWJzdHIoJHRleHQsICRjLCAxKS4iJiN4MjAwYjsiOyAvLyBaV1NQCiAgICB9CiAgICAKICAgIC8vZHVtcCgkcmV0KTsKICAgIC8vZHVtcChaV1NQKTsKICAgIAogICAgcmV0dXJuKCRyZXQpOwp9CgpmdW5jdGlvbiB0b0hpZGRlbigkbmFtZSwgJHZhbHVlLCAkYWxsb3dTdWJtaXQ9dHJ1ZSwgJGFzSlNPTj10cnVlLCAkZGlzYWJsZWQ9ZmFsc2UpCnsKICAgIC8vZHVtcCgkbmFtZSk7CiAgICAvL2R1bXAoJHZhbHVlKTsKICAgIGlmICgkYWxsb3dTdWJtaXQpCiAgICB7CiAgICAgICAgLy8gbmVtZWwgYnljaCBqYWtvIEpTT04sIHBvdHJlYmEgdG8gcm96ZGVsaXQgbmEgdmljZSBzdWJtaXR1CiAgICAgICAgaWYgKF9pc19hcnJheSgkdmFsdWUpICYmICRhc0pTT04pCiAgICAgICAgewogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgie3BocDoiLCAieyNwaHA6IiwgVEpTT046OmVuY29kZSgkdmFsdWUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX2lzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCR2YWx1ZSBhcyAka2V5ID0+ICR2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRodG1sIC49IHRvSGlkZGVuKCRuYW1lLiJbIi4ka2V5LiJdIiwgJHZhbCwgJGFsbG93U3VibWl0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkdmFsdWUsICJfTCh7IikgPT09IDApIC8vIG11bHRpbGFuZ3VhZ2UgZmllbGRzIGluIGZpbHRlcl8qKiogCiAgICAgICAgewogICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiX0woeyIsICJfTCMoeyIsICR2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHZhbHVlID09PSB0cnVlKQogICAgICAgICAgICAkdmFsdWUgPSAidHJ1ZSI7CiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gZmFsc2UpCiAgICAgICAgICAgICR2YWx1ZSA9ICJmYWxzZSI7CiAgICAKICAgICAgICBpZiAoJHZhbHVlICE9ICIiKQogICAgICAgICAgICAkaHRtbCAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIi4kbmFtZS4iXCIgdmFsdWU9XCIiLl9odG1sZW50aXRpZXMoc3RyX3JlcGxhY2UoIntwaHA6IiwgInsjcGhwOiIsICR2YWx1ZSkpLiJcIiAiLigkZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiIpLiIgLz4iOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICRodG1sIC49ICI8IS0taGlkZGVuOiI7CiAgICAgICAgJGh0bWwgLj0gVEpTT046OmVuY29kZShhcnJheSgkbmFtZSA9PiAkdmFsdWUpKTsKICAgICAgICAkaHRtbCAuPSAiLS0+IjsKICAgIH0KICAgIAogICAgLy9kdW1wKCRodG1sKTsKICAgIC8vZXhpdDsKICAgIHJldHVybigkaHRtbCk7Cn0KCmZ1bmN0aW9uIHRvU3FsRGF0ZSgkdGltZXN0YW1wKQp7CiAgICBpZiAoaXNfc3RyaW5nKCR0aW1lc3RhbXApKQogICAgICAgICR0aW1lc3RhbXAgPSBfc3RydG90aW1lKCR0aW1lc3RhbXApOwogICAgCiAgICByZXR1cm4oZGF0ZSgiWS1tLWQiLCAkdGltZXN0YW1wKSk7Cn0KCmZ1bmN0aW9uIHRvU3FsVGltZSgkdGltZXN0YW1wKQp7CiAgICBpZiAoaXNfc3RyaW5nKCR0aW1lc3RhbXApKQogICAgICAgICR0aW1lc3RhbXAgPSBfc3RydG90aW1lKCR0aW1lc3RhbXApOwogICAgCiAgICByZXR1cm4oZGF0ZSgiSDppOnMiLCAkdGltZXN0YW1wKSk7Cn0KCmZ1bmN0aW9uIHRvU3FsRGF0ZVRpbWUoJHRpbWVzdGFtcCkKewogICAgaWYgKGlzX3N0cmluZygkdGltZXN0YW1wKSkKICAgICAgICAkdGltZXN0YW1wID0gX3N0cnRvdGltZSgkdGltZXN0YW1wKTsKICAgIAogICAgcmV0dXJuKHRvU3FsRGF0ZSgkdGltZXN0YW1wKS4iICIudG9TcWxUaW1lKCR0aW1lc3RhbXApKTsKfQoKZnVuY3Rpb24gdG9Qb3N0Zml4VGltZSgkdGltZXN0YW1wLCAkcm91bmQ9MCkKewogICAgaWYgKGlzX3N0cmluZygkdGltZXN0YW1wKSkKICAgICAgICAkdGltZXN0YW1wID0gX3N0cnRvdGltZSgkdGltZXN0YW1wKTsKICAgIAogICAgaWYgKCR0aW1lc3RhbXAgPCA2MCkKICAgICAgICByZXR1cm4ocm91bmQoJHRpbWVzdGFtcCwgJHJvdW5kKS4icyIpOwogICAgaWYgKCR0aW1lc3RhbXAgPCA2MCo2MCkKICAgICAgICByZXR1cm4ocm91bmQoJHRpbWVzdGFtcC82MCwgJHJvdW5kKS4ibSIpOwogICAgaWYgKCR0aW1lc3RhbXAgPCA2MCo2MCoyNCkKICAgICAgICByZXR1cm4ocm91bmQoJHRpbWVzdGFtcC82MC82MCwgJHJvdW5kKS4iaCIpOwogICAgCiAgICByZXR1cm4ocm91bmQoJHRpbWVzdGFtcC82MC82MC8yNCwgJHJvdW5kKS4iZCIpOwp9CgpmdW5jdGlvbiBnZXRDU1NJZCgkaWQpCnsKICAgIHN3aXRjaCgkaWRbMF0pCiAgICB7CiAgICAgICAgY2FzZSAiMCI6IHJldHVybigiXFwzMCAiLnN1YnN0cigkaWQsIDEsIDEwMDApKTsKICAgICAgICBjYXNlICIxIjogcmV0dXJuKCJcXDMxICIuc3Vic3RyKCRpZCwgMSwgMTAwMCkpOwogICAgICAgIGNhc2UgIjIiOiByZXR1cm4oIlxcMzIgIi5zdWJzdHIoJGlkLCAxLCAxMDAwKSk7CiAgICAgICAgY2FzZSAiMyI6IHJldHVybigiXFwzMyAiLnN1YnN0cigkaWQsIDEsIDEwMDApKTsKICAgICAgICBjYXNlICI0IjogcmV0dXJuKCJcXDM0ICIuc3Vic3RyKCRpZCwgMSwgMTAwMCkpOwogICAgICAgIGNhc2UgIjUiOiByZXR1cm4oIlxcMzUgIi5zdWJzdHIoJGlkLCAxLCAxMDAwKSk7CiAgICAgICAgY2FzZSAiNiI6IHJldHVybigiXFwzNiAiLnN1YnN0cigkaWQsIDEsIDEwMDApKTsKICAgICAgICBjYXNlICI3IjogcmV0dXJuKCJcXDM3ICIuc3Vic3RyKCRpZCwgMSwgMTAwMCkpOwogICAgICAgIGNhc2UgIjgiOiByZXR1cm4oIlxcMzggIi5zdWJzdHIoJGlkLCAxLCAxMDAwKSk7CiAgICAgICAgY2FzZSAiOSI6IHJldHVybigiXFwzOSAiLnN1YnN0cigkaWQsIDEsIDEwMDApKTsKICAgICAgICBkZWZhdWx0OiByZXR1cm4oJGlkKTsKICAgIH0KfQoKZnVuY3Rpb24gX2ZnZXRjc3YoJGhhbmRsZSwgJGVuY29kaW5nPSJ1dGYtOCIsICRsZW5ndGg9MCwgJGRlbGltaXRlcj0iLCIsICRlbmNsb3N1cmU9IlwiIiwgJGVzY2FwZT0iXFwiKQp7CiAgICAkbG9jYWxlID0gc2V0bG9jYWxlKExDX0FMTCwgMCk7CiAgICAkZW5jb2RpbmcgPSBzdHJ0b2xvd2VyKCRlbmNvZGluZyk7CiAgICBpZiAoJGVuY29kaW5nID09ICJ1dGYtOCIgfHwgJGVuY29kaW5nID09ICJ1dGY4IikKICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCAiZW5fVVMudXRmLTgiKTsgLy8gZm9yIFVURiBlbmNvZGluZyBtdXN0IHNldCAudXRmLTgKICAgIGVsc2UKICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCAiZW5fVVMiKTsgLy8gb3RoZXIgb25lIGJ5dGUgZW5jb2RpbmcgLSB3aWxsIGJlIGNvbnZlcnRlZCB1c2luZyBpY29udgoKICAgICRyZXN1bHQgPSBmZ2V0Y3N2KCRoYW5kbGUsICRsZW5ndGgsICRkZWxpbWl0ZXIsICRlbmNsb3N1cmUsICRlc2NhcGUpOwogICAgc2V0bG9jYWxlKExDX0FMTCwgJGxvY2FsZSk7CiAgICAKICAgIHJldHVybigkcmVzdWx0KTsKfQoKZnVuY3Rpb24gX3N0cl9nZXRjc3YoJGlucHV0LCAkZW5jb2Rpbmc9InV0Zi04IiwgJGRlbGltaXRlcj0iLCIsICRlbmNsb3N1cmU9IlwiIiwgJGVzY2FwZT0iXFwiKQp7CiAgICAkbG9jYWxlID0gc2V0bG9jYWxlKExDX0FMTCwgMCk7CiAgICAkZW5jb2RpbmcgPSBzdHJ0b2xvd2VyKCRlbmNvZGluZyk7CiAgICBpZiAoJGVuY29kaW5nID09ICJ1dGYtOCIgfHwgJGVuY29kaW5nID09ICJ1dGY4IikKICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCAiZW5fVVMudXRmLTgiKTsgLy8gZm9yIFVURiBlbmNvZGluZyBtdXN0IHNldCAudXRmLTgKICAgIGVsc2UKICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCAiZW5fVVMiKTsgLy8gb3RoZXIgb25lIGJ5dGUgZW5jb2RpbmcgLSB3aWxsIGJlIGNvbnZlcnRlZCB1c2luZyBpY29udgoKICAgICRyZXN1bHQgPSBzdHJfZ2V0Y3N2KCRpbnB1dCwgJGRlbGltaXRlciwgJGVuY2xvc3VyZSwgJGVzY2FwZSk7CiAgICBzZXRsb2NhbGUoTENfQUxMLCAkbG9jYWxlKTsKICAgIAogICAgcmV0dXJuKCRyZXN1bHQpOwp9CgpmdW5jdGlvbiBfZnN0cnRvbG93ZXIoJHN0cikKewogICAgcmV0dXJuKF9zdHJ0b2xvd2VyKF9zdWJzdHIoJHN0ciwgMCwgMSkpLl9zdWJzdHIoJHN0ciwgMSwgc3RybGVuKCRzdHIpKSk7Cn0KCmZ1bmN0aW9uIF9mc3RydG91cHBlcigkc3RyKQp7CiAgICByZXR1cm4oX3N0cnRvdXBwZXIoX3N1YnN0cigkc3RyLCAwLCAxKSkuX3N1YnN0cigkc3RyLCAxLCBzdHJsZW4oJHN0cikpKTsKfQoKZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoJHZhbHVlKQp7CiAgICBpZiAoJHZhbHVlIDwgMTAyNCkKICAgIHsKICAgICAgICByZXR1cm4oJHZhbHVlLiJiIik7CiAgICB9CiAgICBlbHNlIGlmICgkdmFsdWUgPCAxMDI0KjEwMjQpCiAgICB7CiAgICAgICAgcmV0dXJuKHJvdW5kKCR2YWx1ZS8xMDI0LCAyKS4ia0IiKTsKICAgIH0KICAgIGVsc2UgaWYgKCR2YWx1ZSA8IDEwMjQqMTAyNCoxMDI0KQogICAgewogICAgICAgIHJldHVybihyb3VuZCgkdmFsdWUvMTAyNC8xMDI0LCAyKS4iTUIiKTsKICAgIH0KICAgIGVsc2UgaWYgKCR2YWx1ZSA8IDEwMjQqMTAyNCoxMDI0KjEwMjQpCiAgICB7CiAgICAgICAgcmV0dXJuKHJvdW5kKCR2YWx1ZS8xMDI0LzEwMjQvMTAyNCwgMikuIkdCIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmV0dXJuKHJvdW5kKCR2YWx1ZS8xMDI0LzEwMjQvMTAyNC8xMDI0LCAyKS4iVEIiKTsKICAgIH0KfQoKZnVuY3Rpb24gc3RyX3JlcGxhY2VfZmlyc3QoJHNlYXJjaCwgJHJlcGxhY2UsICRzdWJqZWN0KSAKewogICAgcmV0dXJuIGltcGxvZGUoJHJlcGxhY2UsIGV4cGxvZGUoJHNlYXJjaCwgJHN1YmplY3QsIDIpKTsKfQoKZnVuY3Rpb24gc3RyaXBfY29tcG9uZW50cygkaHRtbCkKewogICAgJGh0bWwgPSBwcmVnX3JlcGxhY2UoInw8Y29tcG9uZW50KC4qPyk8L2NvbXBvbmVudD58aW1zIiwgIiIsICRodG1sKTsKICAgIAogICAgcmV0dXJuKCRodG1sKTsKfQoKZnVuY3Rpb24gZXh0cmFjdFdvcmRzKCRzdHIpCnsKICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiXHIiLCAifCIsICRzdHIpOwogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJcbiIsICJ8IiwgJHN0cik7CgogICAgJHN0ciA9IHN0cmlwX2NvbXBvbmVudHMoJHN0cik7CiAgICAkc3RyID0gc3RyaXBfdGFncygkc3RyKTsKCiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIiAiLCAifCIsICRzdHIpOwogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCIsIiwgInwiLCAkc3RyKTsKICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiLiIsICJ8IiwgJHN0cik7CiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIiEiLCAifCIsICRzdHIpOwogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCI/IiwgInwiLCAkc3RyKTsKICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiOiIsICJ8IiwgJHN0cik7CiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIjsiLCAifCIsICRzdHIpOwogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJcIiIsICJ8IiwgJHN0cik7CiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIiciLCAifCIsICRzdHIpOwoKICAgIHdoaWxlKHN0cmxlbigkc3RyKSAhPSAkbGVuZ3RoKQogICAgewogICAgICAgICRsZW5ndGggPSBzdHJsZW4oJHN0cik7CiAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJ8fCIsICJ8IiwgJHN0cik7CiAgICB9CgogICAgcmV0dXJuKGV4cGxvZGVMaXN0KCRzdHIpKTsKfQoKZnVuY3Rpb24gcmVhbHVybCgkdXJsLCAkYmFzZT1QUk9KRUNUVVJMKQp7CiAgICBpZiAoc3RycG9zKCR1cmwsICI6Ly8iKSA9PT0gRkFMU0UpCiAgICAgICAgJHVybCA9ICRiYXNlLiIvIi4kdXJsOwoKICAgICR1cmwgPSBjbGVhbkxpbmsoJHVybCk7CiAgICAkbGlua0luZm8gPSBleHBsb2RlTGluaygkdXJsKTsKICAgICRwYXRoID0gZXhwbG9kZSgiLyIsICRsaW5rSW5mb1sicGF0aCJdKTsKICAgICRwYXRoMiA9IGFycmF5KCk7CiAgICBmb3IoJGkgPSAwIDsgJGkgPCBjb3VudCgkcGF0aCkgOyAkaSsrKQogICAgewogICAgICAgIGlmICgkcGF0aFskaV0gPT0gIi4iKQogICAgICAgICAgICA7CiAgICAgICAgZWxzZSBpZiAoJHBhdGhbJGldID09ICIuLiIpCiAgICAgICAgICAgIGFycmF5X3BvcCgkcGF0aDIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHBhdGgyW10gPSAkcGF0aFskaV07CiAgICB9CiAgICAKICAgICRsaW5rSW5mb1sicGF0aCJdID0gaW1wbG9kZSgiLyIsICRwYXRoMik7CiAgICAKICAgIHJldHVybihpbXBsb2RlTGluaygkbGlua0luZm8pKTsKIH0KIAogZnVuY3Rpb24gZ2V0R3JpZEZyb21SZWNvcmRzKCRyZWNvcmRzKQogewogICAgICRmaWVsZHMgPSBhcnJheSgpOwogICAgIGZvcmVhY2goJHJlY29yZHMgYXMgJHJlY29yZCkKICAgICB7CiAgICAgICAgZm9yZWFjaCgkcmVjb3JkIGFzICRmaWVsZE5hbWUgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkZmllbGROYW1lLCAkZmllbGRzKSkKICAgICAgICAgICAgICAgICRmaWVsZHNbXSA9ICRmaWVsZE5hbWU7CiAgICAgICAgfQogICAgIH0KICAgICAKICAgICAkaHRtbCA9ICIiOwogICAgICRodG1sIC49ICI8dGFibGUgY2xhc3M9J19HcmlkJz4iOwogICAgICRodG1sIC49ICI8dGhlYWQ+IjsKICAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJGZpZWxkTmFtZSkKICAgICB7CiAgICAgICAgJGh0bWwgLj0gIjx0aD4iOwogICAgICAgICRodG1sIC49ICRmaWVsZE5hbWU7CiAgICAgICAgJGh0bWwgLj0gIjwvdGg+IjsKICAgICB9CiAgICAgJGh0bWwgLj0gIjwvdGhlYWQ+IjsKICAgICAkaHRtbCAuPSAiPHRib2R5PiI7CiAgICAgZm9yZWFjaCgkcmVjb3JkcyBhcyAkcmVjb3JkKQogICAgIHsKICAgICAgICAkaHRtbCAuPSAiPHRyPiI7CiAgICAgICAgZm9yZWFjaCgkZmllbGRzIGFzICRmaWVsZE5hbWUpCiAgICAgICAgewogICAgICAgICAgICAkaHRtbCAuPSAiPHRkPiI7CiAgICAgICAgICAgICRodG1sIC49ICRyZWNvcmRbJGZpZWxkTmFtZV07CiAgICAgICAgICAgICRodG1sIC49ICI8L3RkPiI7CiAgICAgICAgfQogICAgICAgICRodG1sIC49ICI8L3RyPiI7CiAgICAgfQogICAgICRodG1sIC49ICI8L3Rib2R5PiI7CiAgICAgJGh0bWwgLj0gIjwvdGFibGU+IjsKICAgICAKICAgICByZXR1cm4oJGh0bWwpOwogfQoKCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQXJyYXkvQXJyYXkuY2xhc3MucGhwIC0tLS0tLS0gDQoKY2xhc3MgVEFycmF5IGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgCn0gIAoKLy8gc29ydCBiYXNlZCBvbiBsYW5ndWFnZQpmdW5jdGlvbiBsa3NvcnQoJiRoYXlzdGFjaykKewogICAgZ2xvYmFsICRhY3RpdmVMYW5ndWFnZTsKICAgIAogICAgJFRyYW5zbGF0b3IgPSBnZXRPYmplY3QoIlRyYW5zbGF0b3JzIiktPmdldFRyYW5zbGF0b3IoJGFjdGl2ZUxhbmd1YWdlKTsKICAgIAogICAgaWYgKCRUcmFuc2xhdG9yKQogICAgewogICAgICAgICRUcmFuc2xhdG9yLT5rc29ydCgkaGF5c3RhY2spOwogICAgfQogICAgZWxzZSAgICAKICAgIHsKICAgICAgICBrc29ydCgkaGF5c3RhY2spOwogICAgfQp9CgpmdW5jdGlvbiBhcnJheV9kZWxldGUoJiRhcnJheSwgJHZhbHVlKQp7CiAgICAkcmV0ID0gYXJyYXkoKTsKICAgIGZvcmVhY2goJGFycmF5IGFzICRrZXkgPT4gJHZhbCkKICAgIHsKICAgICAgICBpZiAoJHZhbCAhPT0gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGlzU2ltcGxlQXJyYXkoJGFycmF5KSk7CiAgICAgICAgICAgIGlmIChpc1NpbXBsZUFycmF5KCRhcnJheSkpCiAgICAgICAgICAgICAgICAkcmV0W10gPSAkdmFsOyAgICAKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJHJldFska2V5XSA9ICR2YWw7ICAgIAogICAgICAgIH0KICAgIH0KICAgIAogICAgJGFycmF5ID0gJHJldDsKICAgIHJldHVybigkcmV0KTsKfQoKZnVuY3Rpb24gYXJyYXlfcmVtb3ZlKCYkYXJyYXksICR2YWx1ZSkKewogICAgcmV0dXJuKGFycmF5X2RlbGV0ZSgkYXJyYXksICR2YWx1ZSkpOwp9CgpmdW5jdGlvbiBhcnJheV9hc3NvYygkYXJyYXksICRrZXlOYW1lPU5VTEwsICR2YWxOYW1lPU5VTEwpCnsKICAgICRyZXQgPSBhcnJheSgpOwogICAgaWYgKF9pc19hcnJheSgkYXJyYXkpKQogICAgewogICAgICAgIGZvcmVhY2goJGFycmF5IGFzICR2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJGtleU5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdmFsTmFtZSkKICAgICAgICAgICAgICAgICAgICAkcmV0WyhzdHJpbmcpJHZhbFska2V5TmFtZV1dID0gJHZhbFskdmFsTmFtZV07CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgJHJldFsoc3RyaW5nKSR2YWxbJGtleU5hbWVdXSA9ICR2YWw7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2R1bXAoKHN0cmluZykkdmFsWyRrZXlOYW1lXSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJHJldFsoc3RyaW5nKSR2YWxdID0gJHZhbDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4oJHJldCk7Cn0gICAgIAoKZnVuY3Rpb24gYXJyYXlfa2V5X3ZhbHVlcygkYXJyYXksICRrZXlOYW1lPU5VTEwpCnsKICAgICR2YWx1ZXMgPSBhcnJheSgpOwogICAgZm9yZWFjaCgkYXJyYXkgYXMgJGEpCiAgICB7CiAgICAgICAgJHZhbHVlc1tdID0gJGFbJGtleU5hbWVdOwogICAgfQogICAgCiAgICByZXR1cm4oJHZhbHVlcyk7Cn0KCmZ1bmN0aW9uIHNodWZmbGVfYXNzb2MoJiRhcnJheSkgewogICAgJG5ldyA9IGFycmF5KCk7CiAgICAka2V5cyA9IGFycmF5X2tleXMoJGFycmF5KTsKCiAgICBzaHVmZmxlKCRrZXlzKTsKCiAgICBmb3JlYWNoKCRrZXlzIGFzICRrZXkpIHsKICAgICAgICAkbmV3WyRrZXldID0gJGFycmF5WyRrZXldOwogICAgfQoKICAgICRhcnJheSA9ICRuZXc7CgogICAgcmV0dXJuIHRydWU7Cn0KICAgIApmdW5jdGlvbiBleHBsb2RlTGlzdCgkbGlzdCwgJHNlcGFyYXRvcj0ifCIpCnsKICAgIGlmIChfaXNfYXJyYXkoJGxpc3QpKQogICAgICAgIHJldHVybigkbGlzdCk7CiAgICBlbHNlIGlmICgkbGlzdCAhPSAiIikKICAgIHsKICAgICAgICAkbGlzdCA9IHRvU3RyaW5nKCRsaXN0KTsgLy8ga3Z1bGkgYm9vbCB0cnVlL2ZhbHNlCiAgICAgICAgaWYgKGlzX2FycmF5KCRzZXBhcmF0b3IpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICgkaSA9IDEgOyAkaSA8IGNvdW50KCRzZXBhcmF0b3IpIDsgJGkrKykKICAgICAgICAgICAgICAgICRsaXN0ID0gc3RyX3JlcGxhY2UoJHNlcGFyYXRvclskaV0sICRzZXBhcmF0b3JbMF0sICRsaXN0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkc2VwYXJhdG9yID0gJHNlcGFyYXRvclswXTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGxpc3QgPSBzdHJfcmVwbGFjZSgiXFx8IiwgIltOT1NFUEFSQVRPUl0iLCAkbGlzdCk7CiAgICAgICAgJGxpc3QgPSBleHBsb2RlKCRzZXBhcmF0b3IsICRsaXN0KTsKICAgICAgICBmb3JlYWNoKCRsaXN0IGFzICRrZXkgPT4gJHZhbHVlKQogICAgICAgICAgICAkbGlzdFska2V5XSA9IHN0cl9yZXBsYWNlKCJbTk9TRVBBUkFUT1JdIiwgInwiLCAkdmFsdWUpOwogICAgICAgIAogICAgICAgIHJldHVybigkbGlzdCk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGFycmF5KCkpOwp9CgpmdW5jdGlvbiBpbXBsb2RlTGlzdCgkbGlzdCwgJHNlcGFyYXRvcj0ifCIsICRwcmVmaXg9IiIsICRwb3N0Zml4PSIiKQp7CiAgICAkbGlzdCA9IGV4cGxvZGVMaXN0KCRsaXN0KTsKICAgICAgICAKICAgICRyZXQgPSBhcnJheSgpOwogICAgZm9yZWFjaCgkbGlzdCBhcyAkaXRlbSkKICAgIHsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRpdGVtKSkKICAgICAgICB7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJpbXBsb2RlTGlzdCgpIG9iamVjdCBpbnNpZGUgbGlzdCIsIG10RXJyb3IpOwogICAgICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9pc19hcnJheSgkaXRlbSkpCiAgICAgICAgICAgICRpdGVtID0gaW1wbG9kZUxpc3QoJGl0ZW0sICRzZXBhcmF0b3IsICRwcmVmaXgsICRwb3N0Zml4KTsKICAgICAgICBpZiAoJGl0ZW0gfHwgJGl0ZW0gPT09IDAgfHwgJGl0ZW0gPT09ICIwIikKICAgICAgICB7CiAgICAgICAgICAgICRyZXRbXSA9ICRwcmVmaXguJGl0ZW0uJHBvc3RmaXg7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChzdHJwb3MoJHNlcGFyYXRvciwgIjwiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCRzZXBhcmF0b3IsICI+IikgIT09IEZBTFNFKQogICAgICAgIHJldHVybihhcnJheVRvVGFnKCRyZXQsICRzZXBhcmF0b3IpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4oaW1wbG9kZSgkc2VwYXJhdG9yLCAkcmV0KSk7Cn0KCmZ1bmN0aW9uIGFycmF5VG9UYWcoJGxpc3QsICR0YWc9ImJyIikKewogICAgJHRhZyA9IHN0cl9yZXBsYWNlKCI8IiwgIiIsICR0YWcpOwogICAgJHRhZyA9IHN0cl9yZXBsYWNlKCI+IiwgIiIsICR0YWcpOwogICAgJHRhZyA9IHN0cl9yZXBsYWNlKCIvIiwgIiIsICR0YWcpOwogICAgJHRhZyA9IHN0cl9yZXBsYWNlKCIgIiwgIiIsICR0YWcpOwogICAgJHRhZyA9IHN0cnRvbG93ZXIoJHRhZyk7CiAgICAKICAgIGlmICgkdGFnID09ICJ1bCIgfHwgJHRhZyA9PSAib2wiKQogICAgICAgICRodG1sIC49ICI8Ii4kdGFnLiI+IjsKICAgIAogICAgZm9yZWFjaCgkbGlzdCBhcyAkaXRlbSkKICAgIHsKICAgICAgICBpZiAoJHRhZyA9PSAidWwiIHx8ICR0YWcgPT0gIm9sIikKICAgICAgICAgICAgJGh0bWwgLj0gIjxsaT4iLiRpdGVtLiI8L2xpPiI7CiAgICAgICAgZWxzZSBpZiAoJHRhZyA9PSAiYnIiKQogICAgICAgICAgICAkaHRtbCAuPSAkaXRlbS4iPGJyIC8+IjsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRodG1sIC49ICI8Ii4kdGFnLiI+Ii4kaXRlbS4iPC8iLiR0YWcuIj4iOwogICAgfQogICAgCiAgICBpZiAoJHRhZyA9PSAidWwiIHx8ICR0YWcgPT0gIm9sIikKICAgICAgICAkaHRtbCAuPSAiPC8iLiR0YWcuIj4iOwoKICAgIHJldHVybigkaHRtbCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZExpc3QoJGxpc3QsICR2YWx1ZSwgJHNlcGFyYXRvcj0ifCIpCnsKICAgICRsaXN0ID0gZXhwbG9kZUxpc3QoJGxpc3QsICRzZXBhcmF0b3IpOwogICAgJGxpc3QgPSBhcnJheV9tZXJnZSgkbGlzdCwgZXhwbG9kZUxpc3QoJHZhbHVlLCAkc2VwYXJhdG9yKSk7CiAgICAkbGlzdCA9IGFycmF5X3VuaXF1ZSgkbGlzdCk7CiAgICAKICAgIHJldHVybihpbXBsb2RlTGlzdCgkbGlzdCwgJHNlcGFyYXRvcikpOwp9CgpmdW5jdGlvbiByZW1vdmVMaXN0KCRsaXN0LCAkdmFsdWUsICRzZXBhcmF0b3I9InwiKQp7CiAgICAkbGlzdCA9IGV4cGxvZGVMaXN0KCRsaXN0KTsKICAgIGFycmF5X2RlbGV0ZSgkbGlzdCwgJHZhbHVlKTsKICAgIAogICAgcmV0dXJuKCRsaXN0KTsKfQoKZnVuY3Rpb24gaXNfYXNzb2NfYXJyYXkoJiRhcnJheSkKewogICAgaWYgKCEkYXJyYXkpCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAKICAgIGZvcmVhY2goYXJyYXlfa2V5cygkYXJyYXkpIGFzICRrZXkpCiAgICB7CiAgICAgICAgaWYgKGlzVVVJRCgka2V5KSB8fCAhaXNfaW50KCRrZXkpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4odHJ1ZSk7Cn0KCmZ1bmN0aW9uIGdldE5vcm1hbGl6ZWRGaWxlc0FycmF5MigkYSwgJG5hbWUsICRGSUxFKQp7CiAgICAvL3Zhcl9kdW1wKCRuYW1lKTsKICAgIGZvcmVhY2goJEZJTEUgYXMgJGtleSA9PiAkdmFsKQogICAgewogICAgICAgIC8vIFBST0M/IGtkeXogY2hjaSBwb3NsYXQgbmFwciBpbWFnZXNbXSAuLi4gcG90b20gcG90cmVidWppIHphc2UgMCwxLDIgYSBuZSAwMCwwMSwwMi4uLgogICAgICAgIGlmIChnZXR0eXBlKCRrZXkpID09ICJpbnRlZ2VyIikKICAgICAgICAgICAgJGtleSA9ICIwIi4ka2V5OwogICAgICAgIAogICAgICAgIGlmIChfaXNfYXJyYXkoJHZhbCkpCiAgICAgICAgewogICAgICAgICAgICAkYVska2V5XSA9IGFycmF5KCk7CiAgICAgICAgICAgICRhWyRrZXldID0gYXJyYXlfbWVyZ2VfcmVjdXJzaXZlKCRhWyRrZXldLCBnZXROb3JtYWxpemVkRmlsZXNBcnJheTIoJGFbJGtleV0sICRuYW1lLCAkdmFsKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vaWYgKCFpc19hcnJheSgkYVska2V5XSkpCiAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgJGFbJGtleV0gPSBhcnJheSgpOwogICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkYVska2V5XVskbmFtZV0gPSAkdmFsOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKCRhKTsKICAgIAogICAgLy92YXJfZHVtcCgkbmFtZSk7CiAgICAvL3Zhcl9kdW1wKCRGSUxFKTsKfQoKZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZEZpbGVzQXJyYXkzKCRhKQp7CiAgICAvL3Zhcl9kdW1wKCRhKTsKICAgIGZvcmVhY2goJGEgYXMgJGtleSA9PiAkdmFsKQogICAgewogICAgICAgIGlmIChfaXNfYXJyYXkoJHZhbCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzc2V0KCR2YWxbIm5hbWUiXSkgJiYgIWlzc2V0KCR2YWxbInR5cGUiXSkgJiYgIWlzc2V0KCR2YWxbInRtcF9uYW1lIl0pICYmICFpc3NldCgkdmFsWyJlcnJvciJdKSkKICAgICAgICAgICAgICAgICRhWyRrZXldID0gZ2V0Tm9ybWFsaXplZEZpbGVzQXJyYXkzKCR2YWwpOwogICAgICAgICAgICBlbHNlIGlmICgkdmFsWyJlcnJvciJdID09IFVQTE9BRF9FUlJfTk9fRklMRSkKICAgICAgICAgICAgICAgICRhWyRrZXldID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCEkYVska2V5XSkKICAgICAgICAgICAgdW5zZXQoJGFbJGtleV0pOwogICAgfQogICAgCiAgICByZXR1cm4oJGEpOwp9CgpmdW5jdGlvbiBnZXROb3JtYWxpemVkRmlsZXNBcnJheTQoJGEpCnsKICAgIGZvcmVhY2goJGEgYXMgJGtleSA9PiAkdmFsKQogICAgewogICAgICAgIGlmIChfaXNfYXJyYXkoJHZhbCkpCiAgICAgICAgewogICAgICAgICAgICAkdmFsID0gZ2V0Tm9ybWFsaXplZEZpbGVzQXJyYXk0KCR2YWwpOwogICAgICAgICAgICAkYVska2V5XSA9ICR2YWw7CiAgICAgICAgfQoKICAgICAgICAvLyBwcm9jIHRvIGJ5bG8/IC0gcG9rdWQgbWFtIGZpbGVbMCoqKipdIC0gVVVJRCB6YWNpbmFqaWNpIG51bG91LCBwYWsgbWkgdG8gb2RlYmVyZSEKICAgICAgICAvL2lmICgka2V5WzBdID09ICIwIikKCiAgICAgICAgaWYgKCRrZXkgPT09ICIwIikKICAgICAgICB7CiAgICAgICAgICAgIHVuc2V0KCRhWyRrZXldKTsKICAgICAgICAgICAgc2V0dHlwZSgka2V5LCAiaW50ZWdlciIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGFbJGtleV0gPSAkdmFsOwogICAgICAgIH0gICAgICAgIAogICAgfQogICAgCiAgICByZXR1cm4oJGEpOwp9CgpmdW5jdGlvbiBnZXROb3JtYWxpemVkRmlsZXNBcnJheSgpCnsKICAgICRhID0gYXJyYXkoKTsKICAgIGlmIChjb3VudCgkX0ZJTEVTKSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRfRklMRVMgYXMgJGtleSA9PiAkRklMRSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChfaXNfYXJyYXkoJEZJTEVbIm5hbWUiXSkgJiYgX2lzX2FycmF5KCRGSUxFWyJ0bXBfbmFtZSJdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGFbJGtleV0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRGSUxFIGFzICRrZXkyID0+ICR2YWwyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZWNobyAka2V5MjsKICAgICAgICAgICAgICAgICAgICAkYVska2V5XSA9IGFycmF5X21lcmdlX3JlY3Vyc2l2ZSgkYVska2V5XSwgZ2V0Tm9ybWFsaXplZEZpbGVzQXJyYXkyKCRhWyRrZXldLCAka2V5MiwgJHZhbDIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRhWyRrZXldID0gJEZJTEU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gY2xlYXIKICAgICRhID0gZ2V0Tm9ybWFsaXplZEZpbGVzQXJyYXkzKCRhKTsKICAgICAgICAKICAgICRhID0gZ2V0Tm9ybWFsaXplZEZpbGVzQXJyYXk0KCRhKTsKCiAgICAvL3Zhcl9kdW1wKCRhKTsKICAgIC8vZXhpdDsKCiAgICByZXR1cm4oJGEpOwp9Cgokc29ydF9tdWx0aV9hcnJheV9mbkluZGV4ID0gMDsKZnVuY3Rpb24gX19zb3J0X211bHRpX2FycmF5X2ZuKCRhLCAkYikKewogICAgZ2xvYmFsICRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXg7CiAgICAKICAgIHJldHVybihnZXRPYmplY3QoIlRyYW5zbGF0b3IiKS0+c3RyY21wKCRhWyRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXhdLCAkYlskc29ydF9tdWx0aV9hcnJheV9mbkluZGV4XSkpOwoKICAgIC8vaWYgKCRhWyRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXhdID4gJGJbJHNvcnRfbXVsdGlfYXJyYXlfZm5JbmRleF0pCiAgICAvLyAgICByZXR1cm4oMSk7CiAgICAvL2lmICgkYVskc29ydF9tdWx0aV9hcnJheV9mbkluZGV4XSA8ICRiWyRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXhdKQogICAgLy8gICAgcmV0dXJuKC0xKTsKICAgICAgICAgICAgCiAgICAvL3JldHVybigwKTsKfQoKZnVuY3Rpb24gc29ydF9tdWx0aV9hcnJheV9vbGQoKQp7CiAgICBnbG9iYWwgJHNvcnRfbXVsdGlfYXJyYXlfZm5JbmRleDsKCiAgICAkbnVtID0gZnVuY19udW1fYXJncygpOwogICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAkc29ydF9tdWx0aV9hcnJheV9mbkluZGV4ID0gJGFyZ3NbMF07CiAgICAKICAgIC8vdmFyX2R1bXAoJGFyZ3MpOwogICAgLy9leGl0OwogICAgJG1hcnJheSA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRhcmdzWyRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXgrMV0gYXMgJGtleSA9PiAkdmFsdWUpCiAgICB7CiAgICAgICAgJGl0ZW0gPSBhcnJheSgpOwogICAgICAgIGZvcigkaSA9IDEgOyAkaSA8ICRudW0gOyAkaSsrKQogICAgICAgICAgICAkaXRlbVtdID0gJGFyZ3NbJGldWyRrZXldOwogICAgICAgIAogICAgICAgICRtYXJyYXlbXSA9ICRpdGVtOwogICAgfQogICAgCiAgICB1c29ydCgkbWFycmF5LCAiX19zb3J0X211bHRpX2FycmF5X2ZuIik7CiAgICAKICAgIGZvcmVhY2goJG1hcnJheSBhcyAkaXRlbSkKICAgIHsKICAgICAgICBmb3IoJGkgPSAwIDsgJGkgPCAkbnVtLTEgOyAkaSsrKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSAkbWFycmF5WyRpXTsKICAgICAgICB9ICAgIAogICAgfQogICAgCiAgICAvL2ZvcmVhY2goJG1hcnJheSkKfQoKZnVuY3Rpb24gc29ydF9tdWx0aV9hcnJheSgkaW5kZXgsICYkYTEsICYkYTIsICYkYTM9TlVMTCwgJiRhND1OVUxMLCAmJGE1PU5VTEwsICYkYTY9TlVMTCkKewogICAgZ2xvYmFsICRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXg7CgogICAgJG51bSA9IGZ1bmNfbnVtX2FyZ3MoKTsKICAgICRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXggPSAkaW5kZXg7CiAgICAKICAgICRtYXJyYXkgPSBhcnJheSgpOwogICAgJGtleU5hbWUgPSAiYSIuKCRzb3J0X211bHRpX2FycmF5X2ZuSW5kZXgrMSk7CiAgICAvL3Zhcl9kdW1wKCRhYTFbMF0pOwogICAgJF9hID0gJCRrZXlOYW1lOwogICAgaWYgKGlzX2FycmF5KCRfYSkpCiAgICB7CiAgICAgICAgZm9yZWFjaCgkX2EgYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAkaXRlbSA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcigkaSA9IDEgOyAkaSA8ICRudW0gOyAkaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkbmFtZSA9ICJhIi4kaTsKICAgICAgICAgICAgICAgICRhID0gJCRuYW1lOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkYSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRuYW1lKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGtleSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRhWyRrZXldKTsKICAgICAgICAgICAgICAgICRpdGVtW10gPSAkYVska2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJG1hcnJheVtdID0gJGl0ZW07CiAgICAgICAgfQogICAgfQogICAgLy92YXJfZHVtcCgkbWFycmF5KTsKICAgIHVzb3J0KCRtYXJyYXksICJfX3NvcnRfbXVsdGlfYXJyYXlfZm4iKTsKICAgIC8vdmFyX2R1bXAoJG1hcnJheSk7CiAgICAKICAgIGZvcigkaSA9IDEgOyAkaSA8ICRudW0gOyAkaSsrKQogICAgewogICAgICAgICRuYW1lID0gImEiLiRpOwogICAgICAgICQkbmFtZSA9IGFycmF5KCk7CiAgICB9ICAgIAogICAgCiAgICBmb3JlYWNoKCRtYXJyYXkgYXMgJGl0ZW0pCiAgICB7CiAgICAgICAgZm9yKCRpID0gMSA7ICRpIDwgJG51bSA7ICRpKyspCiAgICAgICAgewogICAgICAgICAgICAkbmFtZSA9ICJhIi4kaTsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkJG5hbWUsICRpdGVtWyRpLTFdKTsKICAgICAgICB9ICAgIAogICAgfQp9CgpmdW5jdGlvbiBnZXRBcnJheVZhbHVlQnlOYW1lKCRuYW1lLCAkYSkKewogICAgaWYgKCRuYW1lID09PSAiIikgLy8ga3Z1bGkgIjAiCiAgICAgICAgcmV0dXJuKCIiKTsKCiAgICAkX25hbWUgPSAkbmFtZTsKICAgIAogICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCAkbmFtZSk7CiAgICAkbmFtZSA9IGV4cGxvZGUoIlsiLCAkbmFtZSk7CiAgICBpZiAoY291bnQoJG5hbWUpID09IDIgJiYgJG5hbWVbMF0gIT09ICIiICYmICRuYW1lWzFdID09PSAiIikgLy8gbmFtZVtdIAogICAgewogICAgICAgIHJldHVybigkYVskbmFtZVswXV0pOwogICAgfQogICAgaWYgKGNvdW50KCRuYW1lKSA9PSAxKQogICAgewogICAgICAgIGlmIChfaXNfYXJyYXkoJGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKCRhWyRuYW1lWzBdXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KCiAgICAkX25hbWUgPSBhcnJheV9zaGlmdCgkbmFtZSk7CiAgICBmb3IgKCRpID0gMSA7ICRpIDwgY291bnQoJG5hbWUpIDsgJGkrKykKICAgICAgICAkbmFtZVskaV0gLj0gIl0iOwogICAgJG5hbWUgPSBpbXBsb2RlKCJbIiwgJG5hbWUpOwogICAgCiAgICByZXR1cm4oZ2V0QXJyYXlWYWx1ZUJ5TmFtZSgkbmFtZSwgJGFbJF9uYW1lXSkpOwp9CgpmdW5jdGlvbiBnZXRBcnJheVZhbHVlc0J5TmFtZSgkbmFtZSwgJGEpCnsKICAgIGlmICghJG5hbWUpCiAgICAgICAgcmV0dXJuKCIiKTsKCiAgICAkX25hbWUgPSAkbmFtZTsKICAgIAogICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCAkbmFtZSk7CiAgICAkbmFtZSA9IGV4cGxvZGUoIlsiLCAkbmFtZSk7CiAgICBpZiAoY291bnQoJG5hbWUpID09IDEpCiAgICB7CiAgICAgICAgaWYgKF9pc19hcnJheSgkYSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oJGFbJG5hbWVbMF1dKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oIiIpOwogICAgfQogICAgICAgIAogICAgJF9uYW1lID0gYXJyYXlfc2hpZnQoJG5hbWUpOwogICAgZm9yICgkaSA9IDEgOyAkaSA8IGNvdW50KCRuYW1lKSA7ICRpKyspCiAgICAgICAgJG5hbWVbJGldIC49ICJdIjsKICAgICRuYW1lID0gaW1wbG9kZSgiWyIsICRuYW1lKTsKICAgIAogICAgcmV0dXJuKGdldEFycmF5VmFsdWVCeU5hbWUoJG5hbWUsICRhWyRfbmFtZV0pKTsKfQoKZnVuY3Rpb24gYXJyYXlfaW5zZXJ0KCYkYXJyYXksICRpdGVtLCAka2V5LCAkcG9zaXRpb24gPSAnYWZ0ZXInICkgCnsKICAgIGlmICgka2V5ID49IDApCiAgICAgICAgJGtleV9wb3MgPSBhcnJheV9zZWFyY2goICRrZXksIGFycmF5X2tleXMoICRhcnJheSApICk7CiAgICBlbHNlCiAgICAgICAgJGtleV9wb3MgPSBhcnJheV9zZWFyY2goIGFicygka2V5KSwgYXJyYXlfcmV2ZXJzZShhcnJheV9rZXlzKCAkYXJyYXkgKSkgKTsKIAogICAgaWYgKCAnYWZ0ZXInID09ICRwb3NpdGlvbiApCiAgICAgICAgJGtleV9wb3MrKzsKIAogICAgaWYgKCBmYWxzZSAhPT0gJGtleV9wb3MgKSAKICAgIHsKICAgICAgICAkcmVzdWx0ID0gYXJyYXlfc2xpY2UoICRhcnJheSwgMCwgJGtleV9wb3MgKTsKICAgICAgICAkcmVzdWx0ID0gYXJyYXlfbWVyZ2UoICRyZXN1bHQsIGFycmF5KCRpdGVtKSApOwogICAgICAgICRyZXN1bHQgPSBhcnJheV9tZXJnZSggJHJlc3VsdCwgYXJyYXlfc2xpY2UoICRhcnJheSwgJGtleV9wb3MgKSApOwogICAgfQogICAgZWxzZSAKICAgIHsKICAgICAgICAkcmVzdWx0ID0gYXJyYXlfbWVyZ2UoICRhcnJheSwgYXJyYXkoJGl0ZW0pICk7CiAgICB9CiAKICAgICRhcnJheSA9ICRyZXN1bHQ7CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKZnVuY3Rpb24gYXJyYXlfdmFsdWUoJGFyciwgJGtleXMpCnsKICAgICRrZXlzID0gZXhwbG9kZUxpc3QoJGtleXMpOwogICAgCiAgICB3aGlsZSgka2V5cykKICAgIHsKICAgICAgICAka2V5ID0gYXJyYXlfc2hpZnQoJGtleXMpOwogICAgICAgICRhcnIgPSAkYXJyWyRrZXldOwogICAgfQogICAgCiAgICByZXR1cm4oJGFycik7Cn0KZnVuY3Rpb24gZ2V0QXJyYXlWYWx1ZSgkYXJyLCAka2V5KQp7CiAgICByZXR1cm4oJGFyclska2V5XSk7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZScpKQp7CiAgICBmdW5jdGlvbiByZWN1cnNlKCRhcnJheSwgJGFycmF5MSkKICAgIHsKICAgICAgZm9yZWFjaCAoJGFycmF5MSBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgewogICAgICAgIC8vIGNyZWF0ZSBuZXcga2V5IGluICRhcnJheSwgaWYgaXQgaXMgZW1wdHkgb3Igbm90IGFuIGFycmF5CiAgICAgICAgaWYgKCFpc3NldCgkYXJyYXlbJGtleV0pIHx8IChpc3NldCgkYXJyYXlbJGtleV0pICYmICFpc19hcnJheSgkYXJyYXlbJGtleV0pKSkKICAgICAgICB7CiAgICAgICAgICAkYXJyYXlbJGtleV0gPSBhcnJheSgpOwogICAgICAgIH0KIAogICAgICAgIC8vIG92ZXJ3cml0ZSB0aGUgdmFsdWUgaW4gdGhlIGJhc2UgYXJyYXkKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAkdmFsdWUgPSByZWN1cnNlKCRhcnJheVska2V5XSwgJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgJGFycmF5WyRrZXldID0gJHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiAkYXJyYXk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRhcnJheSwgJGFycmF5MSkKICAgIHsKICAgICAgICAvLyBoYW5kbGUgdGhlIGFyZ3VtZW50cywgbWVyZ2Ugb25lIGJ5IG9uZQogICAgICAgICRhcmdzID0gZnVuY19nZXRfYXJncygpOwogICAgICAgICRhcnJheSA9ICRhcmdzWzBdOwogICAgICAgIGlmICghaXNfYXJyYXkoJGFycmF5KSkKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gJGFycmF5OwogICAgICAgIH0KICAgICAgICBmb3IgKCRpID0gMTsgJGkgPCBjb3VudCgkYXJncyk7ICRpKyspCiAgICAgICAgewogICAgICAgICAgaWYgKGlzX2FycmF5KCRhcmdzWyRpXSkpCiAgICAgICAgICB7CiAgICAgICAgICAgICRhcnJheSA9IHJlY3Vyc2UoJGFycmF5LCAkYXJnc1skaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGFycmF5OwogICAgfSAgICAKfQoKZnVuY3Rpb24gY2xvbmVfYXJyYXkoJGEpCnsKICAgIGlmICgkYSBpbnN0YW5jZW9mIEFycmF5QWNjZXNzKQogICAgICAgIHJldHVybigkYS0+Z2V0QXJyYXlDb3B5KCkpOwogICAgCiAgICAvL3JldHVybigkYSk7CiAgICAKICAgICRhMiA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCRhIGFzICRrZXkgPT4gJHZhbCkKICAgIHsKICAgICAgICBpZiAoX2lzX2FycmF5KCR2YWwpKQogICAgICAgICAgICAkYTJbJGtleV0gPSBjbG9uZV9hcnJheSgkdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRhMlska2V5XSA9ICR2YWw7CiAgICB9CiAgICAKICAgIHJldHVybigkYTIpOwp9CgovLyB3b3JrcyB3aXRoIEFycmF5T2JqZWN0CmZ1bmN0aW9uIF9hcnJheV9tZXJnZSgkYTEsICRhMiwgJGEzPU5VTEwsICRhND1OVUxMLCAkYTU9TlVMTCkKewogICAgaWYgKFRKU09OOjppc0pTT04oJGExKSkKICAgICAgICAkYTEgPSBUSlNPTjo6ZGVjb2RlKCRhMSk7CiAgICBpZiAoVEpTT046OmlzSlNPTigkYTIpKQogICAgICAgICRhMSA9IFRKU09OOjpkZWNvZGUoJGEyKTsKICAgIGlmIChUSlNPTjo6aXNKU09OKCRhMykpCiAgICAgICAgJGExID0gVEpTT046OmRlY29kZSgkYTMpOwogICAgaWYgKFRKU09OOjppc0pTT04oJGE0KSkKICAgICAgICAkYTEgPSBUSlNPTjo6ZGVjb2RlKCRhNCk7CiAgICBpZiAoVEpTT046OmlzSlNPTigkYTUpKQogICAgICAgICRhMSA9IFRKU09OOjpkZWNvZGUoJGE1KTsKCiAgICBpZiAoaXNfb2JqZWN0KCRhMSkpCiAgICAgICAgJGExID0gJGExLT5nZXRBcnJheUNvcHkoKTsKICAgIGlmIChpc19vYmplY3QoJGEyKSkKICAgICAgICAkYTIgPSAkYTItPmdldEFycmF5Q29weSgpOwogICAgaWYgKGlzX29iamVjdCgkYTMpKQogICAgICAgICRhMyA9ICRhMy0+Z2V0QXJyYXlDb3B5KCk7CiAgICBpZiAoaXNfb2JqZWN0KCRhNCkpCiAgICAgICAgJGE0ID0gJGE0LT5nZXRBcnJheUNvcHkoKTsKICAgIGlmIChpc19vYmplY3QoJGE1KSkKICAgICAgICAkYTUgPSAkYTUtPmdldEFycmF5Q29weSgpOwoKICAgIGlmICgkYTEgPT0gTlVMTCkKICAgICAgICAkYTEgPSBhcnJheSgpOwogICAgaWYgKCRhMiA9PSBOVUxMKQogICAgICAgICRhMiA9IGFycmF5KCk7CiAgICBpZiAoJGEzID09IE5VTEwpCiAgICAgICAgJGEzID0gYXJyYXkoKTsKICAgIGlmICgkYTQgPT0gTlVMTCkKICAgICAgICAkYTQgPSBhcnJheSgpOwogICAgaWYgKCRhNSA9PSBOVUxMKQogICAgICAgICRhNSA9IGFycmF5KCk7CiAgICAgICAgCiAgICAvL3JldHVybihhcnJheV9tZXJnZSgkYTEsICRhMiwgJGEzLCAkYTQsICRhNSkpOwogICAgLy9kdW1wKCIhISIpOwogICAgLy9kdW1wKCRhMSk7CiAgICAvL2R1bXAoJGEyKTsKICAgIC8vZHVtcChfYXJyYXlfbWVyZ2VfcmVjdXJzaXZlKCRhMSwgJGEyLCAkYTMsICRhNCwgJGE1KSk7CiAgICAKICAgIHJldHVybihfYXJyYXlfbWVyZ2VfcmVjdXJzaXZlKCRhMSwgJGEyLCAkYTMsICRhNCwgJGE1KSk7Cn0KCmZ1bmN0aW9uIF9hcnJheV9tZXJnZV9yZWN1cnNpdmUoJGExLCAkYTIsICRhMz1OVUxMLCAkYTQ9TlVMTCwgJGE1PU5VTEwpCnsKICAgIGlmIChpc19vYmplY3QoJGExKSkKICAgICAgICAkYTEgPSAkYTEtPmdldEFycmF5Q29weSgpOwogICAgaWYgKGlzX29iamVjdCgkYTIpKQogICAgICAgICRhMiA9ICRhMi0+Z2V0QXJyYXlDb3B5KCk7CiAgICBpZiAoaXNfb2JqZWN0KCRhMykpCiAgICAgICAgJGEzID0gJGEzLT5nZXRBcnJheUNvcHkoKTsKICAgIGlmIChpc19vYmplY3QoJGE0KSkKICAgICAgICAkYTQgPSAkYTQtPmdldEFycmF5Q29weSgpOwogICAgaWYgKGlzX29iamVjdCgkYTUpKQogICAgICAgICRhNSA9ICRhNS0+Z2V0QXJyYXlDb3B5KCk7CgogICAgaWYgKCRhMSA9PSBOVUxMKQogICAgICAgICRhMSA9IGFycmF5KCk7CiAgICBpZiAoJGEyID09IE5VTEwpCiAgICAgICAgJGEyID0gYXJyYXkoKTsKICAgIGlmICgkYTMgPT0gTlVMTCkKICAgICAgICAkYTMgPSBhcnJheSgpOwogICAgaWYgKCRhNCA9PSBOVUxMKQogICAgICAgICRhNCA9IGFycmF5KCk7CiAgICBpZiAoJGE1ID09IE5VTEwpCiAgICAgICAgJGE1ID0gYXJyYXkoKTsKICAgICAgICAKICAgIGlmICghX2lzX2FycmF5KCRhMSkpCiAgICAgICAgJGExID0gYXJyYXkoJGExKTsKICAgIGlmICghX2lzX2FycmF5KCRhMikpCiAgICAgICAgJGEyID0gYXJyYXkoJGEyKTsKICAgIGlmICghX2lzX2FycmF5KCRhMykpCiAgICAgICAgJGEzID0gYXJyYXkoJGEzKTsKICAgIGlmICghX2lzX2FycmF5KCRhNCkpCiAgICAgICAgJGE0ID0gYXJyYXkoJGE0KTsKICAgIGlmICghX2lzX2FycmF5KCRhNSkpCiAgICAgICAgJGE1ID0gYXJyYXkoJGE1KTsKICAgIAogICAgZm9yZWFjaChhcnJheSgkYTIsICRhMywgJGE0LCAkYTUpIGFzICRhKQogICAgewogICAgICAgIC8vZHVtcCgiLSIpOwogICAgICAgIC8vZHVtcCgkYSk7CiAgICAgICAgZm9yZWFjaChhcnJheV9rZXlzKCRhKSBhcyAka2V5KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKF9pc19hcnJheSgkYVska2V5XSkpCiAgICAgICAgICAgICAgICAkYTFbJGtleV0gPSBfYXJyYXlfbWVyZ2UoJGExWyRrZXldLCAkYVska2V5XSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzX251bWVyaWMoJGtleSkpCiAgICAgICAgICAgICAgICAkYTFbXSA9ICRhWyRrZXldOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkYTFbJGtleV0gPSAkYVska2V5XTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuKCRhMSk7Cn0KICAgIApmdW5jdGlvbiBfaW1wbG9kZSgkZ2x1ZSwgJHBpZWNlcykKewogICAgaWYgKF9pc19hcnJheSgkcGllY2VzKSkKICAgICAgICByZXR1cm4oaW1wbG9kZSgkZ2x1ZSwgJHBpZWNlcykpOwogICAgICAgIAogICAgcmV0dXJuKCRwaWVjZXMpOwp9CgpmdW5jdGlvbiBfZXhwbG9kZSgkZGVsaW1pdGVyLCAkc3RyaW5nKQp7CiAgICBpZiAoIV9pc19hcnJheSgkc3RyaW5nKSkKICAgICAgICByZXR1cm4oZXhwbG9kZSgkZGVsaW1pdGVyLCAkc3RyaW5nKSk7CiAgICAgICAgCiAgICByZXR1cm4oJHN0cmluZyk7Cn0KCmZ1bmN0aW9uIF9fX3NvcnRfcmVjb3JkcygkYSwgJGIpCnsKICAgIGdsb2JhbCAkX19fc29ydF9yZWNvcmRzX2tleTsKICAgIGdsb2JhbCAkX19fc29ydF9yZWNvcmRzX3JldmVyc2U7CiAgICBnbG9iYWwgJFRyYW5zbGF0b3I7CgogICAgaWYgKGlzX251bWVyaWMoJGFbJF9fX3NvcnRfcmVjb3Jkc19rZXldKSB8fCBpc19udW1lcmljKCRiWyRfX19zb3J0X3JlY29yZHNfa2V5XSkpCiAgICB7CiAgICAgICAgaWYgKCRfX19zb3J0X3JlY29yZHNfcmV2ZXJzZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkYlskX19fc29ydF9yZWNvcmRzX2tleV0gPiAkYVskX19fc29ydF9yZWNvcmRzX2tleV0pCiAgICAgICAgICAgICAgICAkcmV0ID0gMTsKICAgICAgICAgICAgZWxzZSBpZiAoJGJbJF9fX3NvcnRfcmVjb3Jkc19rZXldIDwgJGFbJF9fX3NvcnRfcmVjb3Jkc19rZXldKQogICAgICAgICAgICAgICAgJHJldCA9ICgtMSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRyZXQgPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoJGFbJF9fX3NvcnRfcmVjb3Jkc19rZXldID4gJGJbJF9fX3NvcnRfcmVjb3Jkc19rZXldKQogICAgICAgICAgICAgICAgJHJldCA9IDE7CiAgICAgICAgICAgIGVsc2UgaWYgKCRhWyRfX19zb3J0X3JlY29yZHNfa2V5XSA8ICRiWyRfX19zb3J0X3JlY29yZHNfa2V5XSkKICAgICAgICAgICAgICAgICRyZXQgPSAoLTEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkcmV0ID0gMDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCRfX19zb3J0X3JlY29yZHNfcmV2ZXJzZSkKICAgICAgICAgICAgJHJldCA9ICRUcmFuc2xhdG9yLT5zdHJjbXAoJGJbJF9fX3NvcnRfcmVjb3Jkc19rZXldLCAkYVskX19fc29ydF9yZWNvcmRzX2tleV0pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHJldCA9ICRUcmFuc2xhdG9yLT5zdHJjbXAoJGFbJF9fX3NvcnRfcmVjb3Jkc19rZXldLCAkYlskX19fc29ydF9yZWNvcmRzX2tleV0pOwogICAgfQogICAgCiAgICByZXR1cm4oJHJldCk7CgogICAgLy8kYXQgPSBpY29udignVVRGLTgnLCAnQVNDSUkvL1RSQU5TTElUJywgJGFbJF9fX3NvcnRfcmVjb3Jkc19rZXldKTsKICAgIC8vJGJ0ID0gaWNvbnYoJ1VURi04JywgJ0FTQ0lJLy9UUkFOU0xJVCcsICRiWyRfX19zb3J0X3JlY29yZHNfa2V5XSk7CiAgICAvL3JldHVybiBzdHJjbXAoJGF0LCAkYnQpOwogICAgCiAgICAvL3JldHVybihzdHJjb2xsKCRhWyRfX19zb3J0X3JlY29yZHNfa2V5XSwgJGJbJF9fX3NvcnRfcmVjb3Jkc19rZXldKSk7CgoKICAgIC8qCiAgICBpZiAoJGFbJF9fX3NvcnRfcmVjb3Jkc19rZXldID4gJGJbJF9fX3NvcnRfcmVjb3Jkc19rZXldKQogICAgICAgIHJldHVybigxKTsKICAgIGVsc2UgaWYgKCRhWyRfX19zb3J0X3JlY29yZHNfa2V5XSA8ICRiWyRfX19zb3J0X3JlY29yZHNfa2V5XSkKICAgICAgICByZXR1cm4oLTEpOwogICAgZWxzZQogICAgICAgIHJldHVybigwKTsKICAgICovCn0KCmZ1bmN0aW9uIHNvcnRfcmVjb3JkcygmJHJlY29yZHMsICRjb2x1bW4sICRyZXZlcnNlPWZhbHNlKQp7CiAgICAvLyB0b2RvIC0gdXNlIGFycmF5X211bHRpc29ydCBmb3IgbW9yZSBjb2x1bW5zCiAgICBnbG9iYWwgJF9fX3NvcnRfcmVjb3Jkc19rZXk7CiAgICBnbG9iYWwgJF9fX3NvcnRfcmVjb3Jkc19yZXZlcnNlOwogICAgJF9fX3NvcnRfcmVjb3Jkc19rZXkgPSAkY29sdW1uOwogICAgJF9fX3NvcnRfcmVjb3Jkc19yZXZlcnNlID0gJHJldmVyc2U7CiAgICAKICAgIHVzb3J0KCRyZWNvcmRzLCAiX19fc29ydF9yZWNvcmRzIik7Cn0KCmZ1bmN0aW9uIHNvcnRSZWNvcmRzKCYkcmVjb3JkcywgJGNvbHVtbiwgJHJldmVyc2U9ZmFsc2UpCnsKICAgIHNvcnRfcmVjb3JkcygkcmVjb3JkcywgJGNvbHVtbiwgJHJldmVyc2UpOwp9CgpmdW5jdGlvbiBfaW5fYXJyYXkoJG5lZWRsZSwgJGhheXN0YWNrLCAkYWxsPWZhbHNlKSAKewogICAgaWYgKFRKU09OOjppc0pTT04oJG5lZWRsZSkpCiAgICAgICAgJG5lZWRsZSA9IFRKU09OOjpkZWNvZGUoJG5lZWRsZSk7CiAgICBpZiAoVEpTT046OmlzSlNPTigkaGF5c3RhY2spKQogICAgICAgICRoYXlzdGFjayA9IFRKU09OOjpkZWNvZGUoJGhheXN0YWNrKTsKICAgIAogICAgJG5lZWRsZSA9IGV4cGxvZGVMaXN0KCRuZWVkbGUpOwogICAgJGhheXN0YWNrID0gZXhwbG9kZUxpc3QoJGhheXN0YWNrKTsKICAgIAogICAgJGZvdW5kID0gZmFsc2U7CiAgICAkYWxsRm91bmQgPSB0cnVlOwogICAgZm9yZWFjaCgkbmVlZGxlIGFzICRuKQogICAgewogICAgICAgICRuRm91bmQgPSBmYWxzZTsKICAgICAgICBmb3JlYWNoKCRoYXlzdGFjayBhcyAkaCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkbiA9PSAkaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICghJGFsbCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRuRm91bmQgPSB0cnVlOyAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkYWxsICYmICRmb3VuZCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIAogICAgICAgIGlmICgkYWxsICYmICEkbkZvdW5kKQogICAgICAgIHsKICAgICAgICAgICAgJGFsbEZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKCRhbGwpCiAgICAgICAgcmV0dXJuKCRhbGxGb3VuZCk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKCRmb3VuZCk7Cn0KCmZ1bmN0aW9uIGNsZWFuX2FycmF5KCRhKQp7CiAgICBmb3JlYWNoKCRhIGFzICRrZXkgPT4gJHZhbCkKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhbCkpCiAgICAgICAgICAgICR2YWwgPSBjbGVhbl9hcnJheSgkdmFsKTsKICAgICAgICAKICAgICAgICBpZiAoJHZhbCA9PT0gTlVMTCB8fCAkdmFsID09PSAiIiB8fCBpc19hcnJheSgkdmFsKSAmJiAhY291bnQoJHZhbCkpCiAgICAgICAgICAgIHVuc2V0KCRhWyRrZXldKTsKICAgIH0KICAgIAogICAgcmV0dXJuKCRhKTsKfQpmdW5jdGlvbiBhcnJheV9jbGVhbigkYSkKewogICAgcmV0dXJuKGNsZWFuX2FycmF5KCRhKSk7Cn0KZnVuY3Rpb24gb2JqZWN0VG9BcnJheSgkb2JqPWZhbHNlKSAgCnsKICAgIGlmIChpc19vYmplY3QoJG9iaikpCiAgICAgICAgJG9iaj0gZ2V0X29iamVjdF92YXJzKCRvYmopOwogICAgaWYgKGlzX2FycmF5KCRvYmopKSB7CiAgICAgICAgcmV0dXJuIGFycmF5X21hcChfX0ZVTkNUSU9OX18sICRvYmopOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KfQoKCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRmlsZS9GaWxlLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFRGaWxlIGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgCn0gIAoKZ2xvYmFsICRfQ09ORklHOwppZiAoIWRlZmluZWQoIkNITU9EX1dSSVRFIikpCiAgICBkZWZpbmUoIkNITU9EX1dSSVRFIiwgZmlyc3RfdmFsdWUoJF9DT05GSUdbIkNITU9EX1dSSVRFIl0sIDA3NzcpKTsKaWYgKCFkZWZpbmVkKCJDSE1PRF9GSUxFX0RFRkFVTFQiKSkKICAgIGRlZmluZSgiQ0hNT0RfRklMRV9ERUZBVUxUIiwgZmlyc3RfdmFsdWUoJF9DT05GSUdbIkNITU9EX0ZJTEVfREVGQVVMVCJdLCAwNjQ0KSk7CmlmICghZGVmaW5lZCgiQ0hNT0RfRElSX0RFRkFVTFQiKSkKICAgIGRlZmluZSgiQ0hNT0RfRElSX0RFRkFVTFQiLCBmaXJzdF92YWx1ZSgkX0NPTkZJR1siQ0hNT0RfRElSX0RFRkFVTFQiXSwgMDc1NSkpOwppZiAoIWRlZmluZWQoIkNITU9EX0lOSEVSSVQiKSkKICAgIGRlZmluZSgiQ0hNT0RfSU5IRVJJVCIsIGZpcnN0X3ZhbHVlKCRfQ09ORklHWyJDSE1PRF9JTkhFUklUIl0sIDAwMDApKTsKaWYgKCFkZWZpbmVkKCJDSE1PRF9QSFAiKSkKICAgIGRlZmluZSgiQ0hNT0RfUEhQIiwgZmlyc3RfdmFsdWUoJF9DT05GSUdbIkNITU9EX1BIUCJdLCAwNjQ0KSk7CmlmICghZGVmaW5lZCgiQ0hPV05fUEhQIikpCiAgICBkZWZpbmUoIkNIT1dOX1BIUCIsIGZpcnN0X3ZhbHVlKCRfQ09ORklHWyJDSE9XTl9QSFAiXSwgMCkpOwppZiAoIWRlZmluZWQoIkNIT1dOX0RFRkFVTFQiKSkKICAgIGRlZmluZSgiQ0hPV05fREVGQVVMVCIsIGZpcnN0X3ZhbHVlKCRfQ09ORklHWyJDSE9XTl9ERUZBVUxUIl0sIDApKTsKJF9fZmlsZVN0YXRzID0gYXJyYXkoKTsKJF9fZmlsZVN0YXRzTGFzdEZpbGUgPSBhcnJheSgpOwoKLy92YXJfZHVtcChkaXNrX2ZyZWVfc3BhY2UoUFJPSkVDVFBBVEgpKTsKCgpmdW5jdGlvbiBzdGFydEZpbGUoJGZpbGVOYW1lLCAkb3BlcmF0aW9uKQp7CiAgICAvKgogICAgZ2xvYmFsICRYWFg7CiAgICAkWFhYKys7CiAgICBpZiAoJFhYWCA+IDUwMDApCiAgICB7CiAgICAgICAgZWNobyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CiAgICAgICAgZXhpdDsKICAgIH0KICAgIGVjaG8gJGZpbGVOYW1lLiItIi4kb3BlcmF0aW9uLiI8YnI+IjsKICAgICovCiAgICAKICAgIGdsb2JhbCAkX19kZWJ1Z0ZpbGVzRGlzYWJsZWQ7CiAgICBpZiAoISRfX2RlYnVnRmlsZXNEaXNhYmxlZCAmJiAoJF9SRVFVRVNUWyJkZWJ1Z0ZpbGVzIl0gfHwgc3RycG9zKCRfQ09PS0lFWyJGaWxlc1BIUERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSAhPT0gRkFMU0UpKQogICAgewogICAgICAgIGdsb2JhbCAkX19maWxlU3RhdHNMYXN0RmlsZTsKICAgICAgICBpZiAoIWlzc2V0KCRfX2ZpbGVTdGF0c0xhc3RGaWxlWyRmaWxlTmFtZS4kb3BlcmF0aW9uXSkpCiAgICAgICAgICAgICRfX2ZpbGVTdGF0c0xhc3RGaWxlWyRmaWxlTmFtZS4kb3BlcmF0aW9uXSA9IGFycmF5KCk7CiAgICAKICAgICAgICAkX19maWxlU3RhdHNMYXN0RmlsZVskZmlsZU5hbWUuJG9wZXJhdGlvbl1bInRpbWUiXSA9IG1pY3JvdGltZSh0cnVlKTsKICAgICAgICAkX19maWxlU3RhdHNMYXN0RmlsZVskZmlsZU5hbWUuJG9wZXJhdGlvbl1bIm1lbW9yeSJdID0gbWVtb3J5X2dldF91c2FnZSgpOwogICAgfQp9CgpmdW5jdGlvbiBzdG9wRmlsZSgkZmlsZU5hbWUsICRvcGVyYXRpb24pCnsKICAgIGdsb2JhbCAkX19kZWJ1Z0ZpbGVzRGlzYWJsZWQ7CiAgICBpZiAoISRfX2RlYnVnRmlsZXNEaXNhYmxlZCAmJiAoJF9SRVFVRVNUWyJkZWJ1Z0ZpbGVzIl0gfHwgc3RycG9zKCRfQ09PS0lFWyJGaWxlc1BIUERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSAhPT0gRkFMU0UpKQogICAgewogICAgICAgIGdsb2JhbCAkX19maWxlU3RhdHMsICRfX2ZpbGVTdGF0c0xhc3RGaWxlOwoKICAgICAgICAkX19maWxlU3RhdHNbXSA9IGFycmF5KAogICAgICAgICAgICAiZmlsZSIgPT4gJGZpbGVOYW1lLAogICAgICAgICAgICAidGltZSIgPT4gbWljcm90aW1lKHRydWUpLSRfX2ZpbGVTdGF0c0xhc3RGaWxlWyRmaWxlTmFtZS4kb3BlcmF0aW9uXVsidGltZSJdLAogICAgICAgICAgICAibWVtb3J5IiA9PiAobWVtb3J5X2dldF91c2FnZSgpLSRfX2ZpbGVTdGF0c0xhc3RGaWxlWyRmaWxlTmFtZS4kb3BlcmF0aW9uXVsibWVtb3J5Il0pLzEwMjQvMTAyNCwKICAgICAgICAgICAgIm9wZXJhdGlvbiIgPT4gJG9wZXJhdGlvbiwKICAgICAgICApOwogICAgICAgIAogICAgICAgIHVuc2V0KCRfX2ZpbGVTdGF0c0xhc3RGaWxlWyRmaWxlTmFtZS4kb3BlcmF0aW9uXSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGdldFN5bWxpbmtGaWxlKCRmaWxlTmFtZSkKewogICAgcmV0dXJuKCRmaWxlTmFtZSk7CiAgICAKICAgIGlmICgkZmlsZU5hbWUgJiYgZmlsZV9leGlzdHMoJGZpbGVOYW1lLiIubG5rIikpIC8vIGNhbm5vdCB1c2UgX2ZpbGVfZXhpc3RzIC0gbG9vcHMKICAgIHsKICAgICAgICAkZmlsZU5hbWUgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZU5hbWUuIi5sbmsiKTsKICAgICAgICByZXR1cm4oZ2V0U3ltbGlua0ZpbGUoJGZpbGVOYW1lKSk7IC8vIHJlY3Vyc2l2ZSAtIG1heSBiZSBsaW5rIHRvIGxpbmsKICAgIH0KICAgIAogICAgcmV0dXJuKCRmaWxlTmFtZSk7Cn0KCgpmdW5jdGlvbiBfZmlsZV9nZXRfY29udGVudHMoJGZpbGVOYW1lKQp7CiAgICAkZmlsZU5hbWUgPSBnZXRTeW1saW5rRmlsZSgkZmlsZU5hbWUpOwogICAgCiAgICAvL3Zhcl9kdW1wKCRmaWxlTmFtZSk7CiAgICAkZmlsZU5hbWUgPSBmaW5kRmlsZSgkZmlsZU5hbWUpOwogICAgLy92YXJfZHVtcCgkZmlsZU5hbWUpOwogICAgLy9kdW1wKGdldEZ1bmN0aW9uQ2FsbCgpKTsKICAgIC8vdmFyX2R1bXAoJGZpbGVOYW1lKTsKICAgIHN0YXJ0RmlsZSgkZmlsZU5hbWUsICJyZWFkIik7CiAgICBvYl9zdGFydCgpOwogICAgJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZU5hbWUpOwogICAgJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICBvYl9lbmRfY2xlYW4oKTsKICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgInJlYWQiKTsKICAgIAogICAgaWYgKCRlcnJvcikKICAgICAgICBzaG93TWVzc2FnZSgiX2ZpbGVfZ2V0X2NvbnRlbnRzKCk6ICIuJGVycm9yLCBtdEVycm9yKTsKICAgIAogICAgcmV0dXJuKCRjb250ZW50KTsKfQoKZnVuY3Rpb24gX2dldG1vZCgkZmlsZU5hbWUpIAp7CiAgICBzdGFydEZpbGUoJGZpbGVOYW1lLCAicmVhZCIpOwogICAgb2Jfc3RhcnQoKTsKICAgICRtb2QgPSBnZXRtb2QoJGZpbGVOYW1lKTsKICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgb2JfZW5kX2NsZWFuKCk7CiAgICBzdG9wRmlsZSgkZmlsZU5hbWUsICJyZWFkIik7CiAgICAKICAgIHJldHVybigkbW9kKTsKfQoKZnVuY3Rpb24gX2ZyZWFkaW50NCgkZikKewogICAgLy9SZWFkIGEgNC1ieXRlIGludGVnZXIgZnJvbSBmaWxlCiAgICAkaT1vcmQoZnJlYWQoJGYsMSkpPDwyNDsKICAgICRpKz1vcmQoZnJlYWQoJGYsMSkpPDwxNjsKICAgICRpKz1vcmQoZnJlYWQoJGYsMSkpPDw4OwogICAgJGkrPW9yZChmcmVhZCgkZiwxKSk7CiAgICByZXR1cm4gJGk7Cn0KCmZ1bmN0aW9uIGdldG1vZCgkZmlsZW5hbWUpIAp7CiAgICAkZmlsZW5hbWUgPSBnZXRTeW1saW5rRmlsZSgkZmlsZW5hbWUpOwoKICAgIHN0YXJ0RmlsZSgkZmlsZU5hbWUsICJnZXRtb2QiKTsKICAgIGNsZWFyc3RhdGNhY2hlKCk7CiAgICBpZiAoQF9maWxlX2V4aXN0cygkZmlsZW5hbWUpKQogICAgewogICAgICAgJHZhbCA9IDA7CiAgICAgICBvYl9zdGFydCgpOwogICAgICAgJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlbmFtZSk7CiAgICAgICAkZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgIG9iX2VuZF9jbGVhbigpOwoKICAgICAgIGlmICgkZXJyb3IpCiAgICAgICB7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJnZXRtb2QoKSA6Ii4kZXJyb3IsIG10RXJyb3IpOwogICAgICAgICAgICAkdmFsID0gMDsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsgICAKICAgICAgICAgICAvLyBPd25lcjsgVXNlcgogICAgICAgICAgICR2YWwgKz0gKCgkcGVybXMgJiAweDAxMDApID8gMHgwMTAwIDogMHgwMDAwKTsgLy9SZWFkCiAgICAgICAgICAgJHZhbCArPSAoKCRwZXJtcyAmIDB4MDA4MCkgPyAweDAwODAgOiAweDAwMDApOyAvL1dyaXRlCiAgICAgICAgICAgJHZhbCArPSAoKCRwZXJtcyAmIDB4MDA0MCkgPyAweDAwNDAgOiAweDAwMDApOyAvL0V4ZWN1dGUKICAgICAgICAgCiAgICAgICAgICAgLy8gR3JvdXAKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHgwMDIwKSA/IDB4MDAyMCA6IDB4MDAwMCk7IC8vUmVhZAogICAgICAgICAgICR2YWwgKz0gKCgkcGVybXMgJiAweDAwMTApID8gMHgwMDEwIDogMHgwMDAwKTsgLy9Xcml0ZQogICAgICAgICAgICR2YWwgKz0gKCgkcGVybXMgJiAweDAwMDgpID8gMHgwMDA4IDogMHgwMDAwKTsgLy9FeGVjdXRlCiAgICAgICAgIAogICAgICAgICAgIC8vIEdsb2JhbDsgV29ybGQKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHgwMDA0KSA/IDB4MDAwNCA6IDB4MDAwMCk7IC8vUmVhZAogICAgICAgICAgICR2YWwgKz0gKCgkcGVybXMgJiAweDAwMDIpID8gMHgwMDAyIDogMHgwMDAwKTsgLy9Xcml0ZQogICAgICAgICAgICR2YWwgKz0gKCgkcGVybXMgJiAweDAwMDEpID8gMHgwMDAxIDogMHgwMDAwKTsgLy9FeGVjdXRlCgogICAgICAgICAgIC8vIE1pc2MKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHg0MDAwMCkgPyAweDQwMDAwIDogMHgwMDAwKTsgLy90ZW1wb3JhcnkgZmlsZSAoMDEwMDAwMDApCiAgICAgICAgICAgJHZhbCArPSAoKCRwZXJtcyAmIDB4ODAwMDApID8gMHg4MDAwMCA6IDB4MDAwMCk7IC8vY29tcHJlc3NlZCBmaWxlICgwMjAwMDAwMCkKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHgxMDAwMDApID8gMHgxMDAwMDAgOiAweDAwMDApOyAvL3NwYXJzZSBmaWxlICgwNDAwMDAwMCkKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHgwODAwKSA/IDB4MDgwMCA6IDB4MDAwMCk7IC8vSGlkZGVuIGZpbGUgKHNldHVpZCBiaXQpICgwNDAwMCkKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHgwNDAwKSA/IDB4MDQwMCA6IDB4MDAwMCk7IC8vU3lzdGVtIGZpbGUgKHNldGdpZCBiaXQpICgwMjAwMCkKICAgICAgICAgICAkdmFsICs9ICgoJHBlcm1zICYgMHgwMjAwKSA/IDB4MDIwMCA6IDB4MDAwMCk7IC8vQXJjaGl2ZSBiaXQgKHN0aWNreSBiaXQpICgwMTAwMCkKICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICR2YWwgPSAwOwoKICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgImdldG1vZCIpOwogICAgcmV0dXJuICR2YWw7Cn0gICAgIAoKLy8gcmVjdXJzaXZlIGRlbGV0ZSBkaXJlY3RvcnkKZnVuY3Rpb24gX3JtZGlyKCRkaXJlY3RvcnksICRlbXB0eT1GQUxTRSwgJHNpbGVudD1mYWxzZSkgIC8vICRlbXB0eSBtZWFucyByZWN1cnNpdmU/IAp7CiAgICAkZGlyZWN0b3J5ID0gZ2V0U3ltbGlua0ZpbGUoJGRpcmVjdG9yeSk7CgogICAgaWYoc3Vic3RyKCRkaXJlY3RvcnksLTEpID09ICcvJykKICAgIHsKICAgICAgICAkZGlyZWN0b3J5ID0gc3Vic3RyKCRkaXJlY3RvcnksMCwtMSk7CiAgICB9CgogICAgaWYoIV9maWxlX2V4aXN0cygkZGlyZWN0b3J5KSB8fCAhaXNfZGlyKCRkaXJlY3RvcnkpKQogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGVsc2UgaWYoIWlzX3JlYWRhYmxlKCRkaXJlY3RvcnkpKQogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdGFydEZpbGUoJGRpcmVjdG9yeSwgInJtZGlyIik7CiAgICAgICAgaWYgKG9iamVjdEV4aXN0cygiU2V0dGluZ3MiKSAmJiBnZXRPYmplY3QoIlNldHRpbmdzIiktPnJtZGlyTWV0aG9kID09ICJkZWxheWVkIikKICAgICAgICB7CiAgICAgICAgICAgICRkaXJOYW1lID0gUFJPSkVDVFBBVEguImNhY2hlL19fdG9kZWxldGUiOwogICAgICAgICAgICBpZiAoIV9maWxlX2V4aXN0cygkZGlyTmFtZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9ta2RpcigkZGlyTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRkaXJOYW1lIC49ICIvIi5VVUlEKCk7CgogICAgICAgICAgICBfcmVuYW1lKCRkaXJlY3RvcnksICRkaXJOYW1lKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChfZmlsZV9leGlzdHMoJGRpcmVjdG9yeSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghJHNpbGVudCkKICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiX3JtZGlyKCRkaXJlY3RvcnkpIC0gbm90IGRlbGV0ZWQgKGRlbGF5ZWQpIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkaGFuZGxlID0gQG9wZW5kaXIoJGRpcmVjdG9yeSk7CgogICAgICAgICAgICB3aGlsZSAoRkFMU0UgIT09ICgkaXRlbSA9IEByZWFkZGlyKCRoYW5kbGUpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoJGl0ZW0gIT0gJy4nICYmICRpdGVtICE9ICcuLicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAkZGlyZWN0b3J5LicvJy4kaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRwYXRoKSkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfcm1kaXIoJHBhdGgsICRlbXB0eSwgJHNpbGVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF91bmxpbmsoJHBhdGgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBAY2xvc2VkaXIoJGhhbmRsZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBAcm1kaXIoJGRpcmVjdG9yeSk7CiAgICAgICAgICAgIGlmIChfZmlsZV9leGlzdHMoJGRpcmVjdG9yeSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdsb2JhbCAkX0NPTkZJRzsKICAgICAgICAgICAgICAgIGlmICgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSAmJiAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiZnRwX2Nvbm5lY3QiKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb25uX2lkID0gX2Z0cF9jb25uZWN0KCRfQ09ORklHWyJmdHAiXVsiaG9zdCJdLCAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0sICRfQ09ORklHWyJmdHAiXVsicGFzc3dvcmQiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY29ubl9pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpcm5hbWUgPSBzdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgIiIsIHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgZGlybmFtZSgkZGlyZWN0b3J5KSkuIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgPSAkX0NPTkZJR1siZnRwIl1bInBhdGgiXS4iLyIuJGRpcm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwRm9sZGVyID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkZnRwRm9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsICRmdHBGb2xkZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZnRwRm9sZGVyW3N0cmxlbigkbmV3RnRwRm9sZGVyKS0xXSAhPSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cEZvbGRlciAuPSAiLyI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cEZvbGRlciA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJGZ0cEZvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAZnRwX2NoZGlyKCRjb25uX2lkLCAkZnRwRm9sZGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9ybWRpcigkY29ubl9pZCwgJGZ0cEZvbGRlci4iLyIuYmFzZW5hbWUoJGRpcmVjdG9yeSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAiX3JtZGlyKCk6IHVuYWJsZSB0byBjaGFuZ2UgZnRwIGRpcmVjdG9yeSB0byAnIi4kZnRwRm9sZGVyLiInLiBQbGVhc2UgZml4IFwkZnRwUGF0aCB2YXJpYWJsZSBpbiAnY29uZmlnL2NvbmZpZy5pbmkucGhwJyBhbmQgdHJ5IGFnYWluLiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRyZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRzaWxlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIl9ybWRpcigpOiBDYW5ub3QgZGVsZXRlIGZpbGUgJyIuJGZ0cEZvbGRlci4iLyIuYmFzZW5hbWUoJGRpcmVjdG9yeSkuIicgaW4gc2FmZV9tb2RlIHVzaW5nIEZUUCBjb25uZWN0aW9uICgiLiRlcnJvci4iKSIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHNpbGVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJfcm1kaXIoKTogQnVpbHQgRlRQIENvbm5lY3Rpb24gZm9yIGRlbGV0aW5nIGZpbGVzIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzZXJ2ZXIiLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfZmlsZV9leGlzdHMoJGRpcmVjdG9yeSkgJiYgaXNXaW5kb3dzKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQGV4ZWNDb21tYW5kKCJybWRpciBcIiRkaXJlY3RvcnlcIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKF9maWxlX2V4aXN0cygkZGlyZWN0b3J5KSAmJiAhJHNpbGVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIl9ybWRpcigkZGlyZWN0b3J5KSAtIG5vdCBkZWxldGVkIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdG9wRmlsZSgkZGlyZWN0b3J5LCAicm1kaXIiKTsKICAgICAgICAKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KfQoKZnVuY3Rpb24gX2ZpbGVfZXhpc3RzKCRmaWxlTmFtZSkKewogICAgJGZpbGVOYW1lID0gZ2V0U3ltbGlua0ZpbGUoJGZpbGVOYW1lKTsKICAgIAogICAgc3RhcnRGaWxlKCRmaWxlTmFtZSwgImV4aXN0cyIpOwogICAgaWYgKHByZWdfbWF0Y2goInxeaHR0cDouKnwiLCAkZmlsZU5hbWUpKQogICAgICAgICRyZXQgPSB1cmxfZXhpc3RzKCRmaWxlTmFtZSk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9lY2hvICRmaWxlTmFtZS4iPGhyPiI7CiAgICAgICAgZ2xvYmFsICRfQ09ORklHLCAkX0ZJTEVFWElTVFNfRk9SQ0VfRlRQLCAkX0ZJTEVFWElTVFNfRU5BQkxFX0ZUUCwgJF9GSUxFX0VYSVNUU19DT05OLCAkX0ZJTEVfRVhJU1RTX0xPR0dFRElOOwogICAgICAgIGlmICgoJF9GSUxFRVhJU1RTX0ZPUkNFX0ZUUCB8fCAkX0ZJTEVFWElTVFNfRU5BQkxFX0ZUUCkgJiYgJF9DT05GSUdbImZ0cCJdWyJob3N0Il0gJiYgJF9DT05GSUdbImZ0cCJdWyJsb2dpbiJdKQogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvICJGVFAiOwogICAgICAgICAgICBpZiAoY2xlYW5MaW5rKCRmaWxlTmFtZS4iLyIpID09ICIvIikKICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY2xlYW5MaW5rKCRmaWxlTmFtZSkgPT0gUFJPSkVDVFBBVEggfHwgY2xlYW5MaW5rKCRmaWxlTmFtZS4iLyIpID09IFBST0pFQ1RQQVRIKQogICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9lY2hvICIhIi4kZmlsZU5hbWUuIiEiOwogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29ubl9pZCA9IF9mdHBfY29ubmVjdCgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSwgJF9DT05GSUdbImZ0cCJdWyJsb2dpbiJdLCAkX0NPTkZJR1siZnRwIl1bInBhc3N3b3JkIl0pOwogICAgICAgICAgICAgICAgaWYgKCRjb25uX2lkKQogICAgICAgICAgICAgICAgLy9pZiAoZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vaWYgKCEkX0ZJTEVfRVhJU1RTX0NPTk4pCiAgICAgICAgICAgICAgICAgICAgLy8gICAgJF9GSUxFX0VYSVNUU19DT05OID0gZnRwX2Nvbm5lY3QoJF9DT05GSUdbImZ0cCJdWyJob3N0Il0pOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vaWYgKCEkX0ZJTEVfRVhJU1RTX0xPR0dFRElOKQogICAgICAgICAgICAgICAgICAgIC8vICAgICRfRklMRV9FWElTVFNfTE9HR0VESU4gPSBmdHBfbG9naW4oJF9GSUxFX0VYSVNUU19DT05OLCAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0sICRfQ09ORklHWyJmdHAiXVsicGFzc3dvcmQiXSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy9pZiAoJF9GSUxFX0VYSVNUU19DT05OKQogICAgICAgICAgICAgICAgICAgIGlmICh0cnVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICItIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjb25uX2lkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIj0iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChQUk9KRUNUUEFUSCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlybmFtZSA9IHN0cl9yZXBsYWNlKFBST0pFQ1RQQVRILCAiIiwgc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCBkaXJuYW1lKCRmaWxlTmFtZSkpLiIvIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwRm9sZGVyID0gJF9DT05GSUdbImZ0cCJdWyJwYXRoIl0uIi8iLiRkaXJuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cEZvbGRlciA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGZ0cEZvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwRm9sZGVyID0gc3RyX3JlcGxhY2UoIi8vIiwgIi8iLCAkZnRwRm9sZGVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0cEZvbGRlcltzdHJsZW4oJG5ld0Z0cEZvbGRlciktMV0gIT0gIi8iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgLj0gIi8iOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsICRmdHBGb2xkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICI9Ii4kZnRwRm9sZGVyLiI9IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hkaXIgPSBAZnRwX2NoZGlyKCRjb25uX2lkLCAkZnRwRm9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY2hkaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoSU5TVEFMTFBST0NFU1MgPT09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZWNobyAiPyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZWNobyAkZmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IEBmdHBfc2l6ZSgkY29ubl9pZCwgYmFzZW5hbWUoJGZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoSU5TVEFMTFBST0NFU1MgPT09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyX2R1bXAoJHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXQgPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGZ0cF9jaGRpcigkY29ubl9pZCwgJGZ0cEZvbGRlci4iLyIuYmFzZW5hbWUoJGZpbGVOYW1lKSkpIC8vIGlzIGRpcj8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyIGRvZXMgbm90IGV4aXN0LCBzbyBmaWxlIGFsc28gY2Fubm90IGV4aXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kZXJyb3IgPSAiX2ZpbGVfZXhpc3RzKCk6IHVuYWJsZSB0byBjaGFuZ2UgZnRwIGRpcmVjdG9yeSB0byAnIi4kZnRwRm9sZGVyLiInLiBQbGVhc2UgZml4IFwkZnRwUGF0aCB2YXJpYWJsZSBpbiAnY29uZmlnL2NvbmZpZy5pbmkucGhwJyBhbmQgdHJ5IGFnYWluLiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yID0gIl9maWxlX2V4aXN0cygpOiB1bmFibGUgdG8gbG9naW4gdG8gZnRwIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBpZiAoJGVycm9yKQogICAgICAgICAgICAgICAgeyAgIAogICAgICAgICAgICAgICAgICAgIC8vZWNobyAkZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoJGVycm9yLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL2VjaG8gJGZpbGVOYW1lLiI6IjsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmV0KTsKICAgICAgICAgICAgLy9lY2hvICI8YnI+IjsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEkX0ZJTEVFWElTVFNfRk9SQ0VfRlRQKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZmlsZU5hbWUpOwogICAgICAgICAgICBjbGVhcnN0YXRjYWNoZSgpOwogICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICAkcmV0ID0gQGZpbGVfZXhpc3RzKCRmaWxlTmFtZSk7CiAgICAgICAgICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmV0KTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZXJyb3IpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJGVycm9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgkZXJyb3IsIG10V2FybmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vZ2xvYmFsICR4eHg7CiAgICAvL2lmICgkeHh4ID4gMTAwKQogICAgLy8gICAgZXhpdDsKICAgIC8vJHh4eCsrOwogICAgLy9lY2hvICRmaWxlTmFtZS4iPGJyPiI7CiAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAKICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgImV4aXN0cyIpOwoKICAgIHJldHVybigkcmV0KTsKfQoKZnVuY3Rpb24gdXJsX2V4aXN0cygkdXJsKQp7CiAgICBzdGFydEZpbGUoJGZpbGVOYW1lLCAiZXhpc3RzIik7CiAgICAkaGFuZGxlID0gQGZvcGVuKCR1cmwsICJyIik7CiAgICBAZmNsb3NlKCRoYW5kbGUpOwogICAgc3RvcEZpbGUoJGZpbGVOYW1lLCAiZXhpc3RzIik7CiAgICAKICAgIHJldHVybigkaGFuZGxlICE9PSBmYWxzZSk7Cn0KCmZ1bmN0aW9uIF9maWxlX2FwcGVuZF9jb250ZW50cygkZmlsZU5hbWUsICRjb250ZW50LCAkbmV3TGluZT1mYWxzZSkKewogICAgcmV0dXJuKGZpbGVfYXBwZW5kX2NvbnRlbnRzKCRmaWxlTmFtZSwgJGNvbnRlbnQsICRuZXdMaW5lKSk7Cn0KCmZ1bmN0aW9uIGZpbGVfYXBwZW5kX2NvbnRlbnRzKCRmaWxlTmFtZSwgJGNvbnRlbnQsICRuZXdMaW5lPWZhbHNlKQp7CiAgICAkZmlsZU5hbWUgPSBnZXRTeW1saW5rRmlsZSgkZmlsZU5hbWUpOwoKICAgIHN0YXJ0RmlsZSgkZmlsZU5hbWUsICJhcHBlbmQiKTsKICAgICRzaXplID0gQF9maWxlc2l6ZSgkZmlsZU5hbWUpOwogICAgJGYgPSBAZm9wZW4oJGZpbGVOYW1lLCAiYSIpOwogICAgCiAgICBpZiAoJG5ld0xpbmUpCiAgICAgICAgJGNvbnRlbnQgLj0gIlxyXG4iOwogICAgICAgIAogICAgaWYgKCRmKQogICAgewogICAgICAgIGZ3cml0ZSgkZiwgJGNvbnRlbnQpOwogICAgICAgIGZjbG9zZSgkZik7CiAgICB9CiAgICBlbHNlCiAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlTmFtZSwgJGNvbnRlbnQpOwogICAgCgogICAgJHJldCA9IHRydWU7CiAgICAvL2VjaG8gJGNvbnRlbnQ7CiAgICAvL3Zhcl9kdW1wKCRmaWxlTmFtZSk7CiAgICAvL3Zhcl9kdW1wKF9maWxlc2l6ZSgkZmlsZU5hbWUpKTsKICAgIC8vdmFyX2R1bXAoJHNpemUpOwogICAgLy92YXJfZHVtcChzdHJsZW4oJGNvbnRlbnQpKTsKICAgIC8vdmFyX2R1bXAoJHNpemUrc3RybGVuKCRjb250ZW50KSk7CiAgICAvL2V4aXQ7CiAgICBpZiAoX2ZpbGVzaXplKCRmaWxlTmFtZSkgIT0gJHNpemUrc3RybGVuKCRjb250ZW50KSkKICAgIHsKICAgICAgICAkcmV0ID0gZmFsc2U7CiAgICAgICAgLy8gbXVzdCBOT1QgdXNlIHNob3dtZXNzYWdlCiAgICAgICAgLy9zaG93TWVzc2FnZSgiZmlsZV9hcHBlbmRfY29udGVudHMoKSAtIHVuYWJsZSB0byB3cml0ZSB0byBmaWxlICIuJGZpbGVOYW1lLCBtdEVycm9yKTsKICAgICAgICAvL2V4aXQ7CiAgICB9CgogICAgc3RvcEZpbGUoJGZpbGVOYW1lLCAiYXBwZW5kIik7CiAgICAKICAgIHJldHVybigkcmV0KTsKfQoKCmRlZmluZSgiR0xPQl9GSUxFUyIsIDEpOwpkZWZpbmUoIkdMT0JfRElSUyIsIDIpOwoKZnVuY3Rpb24gX2dsb2IoJHBhdHRlcm4sICR0eXBlcz1OVUxMLCAkcmVjdXJzaXZlPWZhbHNlLCAkbGltaXQ9TlVMTCwgJGJlZ2luPU5VTEwpCnsKICAgICRfcGF0dGVybiA9ICRwYXR0ZXJuOwogICAgLy9kdW1wKCJfZ2xvYiIpOwogICAgLy9kdW1wKGRpcm5hbWUoJHBhdHRlcm4pKTsKICAgIHN0YXJ0RmlsZSgkX3BhdHRlcm4sICJnbG9iIik7CiAgICAvLyB2MSBiYWNrIGNvbXBhdAogICAgCiAgICAkZGlyID0gZmluZERpcihkaXJuYW1lKCRwYXR0ZXJuKSk7CiAgICBpZiAoISRkaXIpCiAgICB7CiAgICAgICAgc3RvcEZpbGUoJF9wYXR0ZXJuLCAiZ2xvYiIpOwogICAgICAgIHJldHVybihhcnJheSgpKTsKICAgIH0KICAgIAogICAgJHBhdHRlcm4gPSBjbGVhbkxpbmsoJGRpci4iLyIuYmFzZW5hbWUoJHBhdHRlcm4pKTsKICAgIC8vZHVtcCgkcGF0dGVybik7CiAgICAKICAgIGlmICgkdHlwZXMgPT09IHRydWUgfHwgJHR5cGVzID09PSBmYWxzZSkKICAgIHsKICAgICAgICBkdW1wKCJfZ2xvYiBzaG91bGQgYmUgY2FsbGVkIF9nbG9iKFwkcGF0dGVybiwgXCR0eXBlcz1OVUxMLCBcJHJlY3Vyc2l2ZT1mYWxzZSk7Iik7CiAgICAgICAgJF90eXBlcyA9ICR0eXBlczsKICAgICAgICAkdHlwZXMgPSAkcmVjdXJzaXZlOwogICAgICAgICRyZWN1cnNpdmUgPSAkX3R5cGVzOwogICAgfQogICAgCiAgICAkZGlzYWJsZWRGdW5jdGlvbnMgPSBleHBsb2RlKCIsIiwgaW5pX2dldCgiZGlzYWJsZV9mdW5jdGlvbnMiKSk7CiAgICBmb3JlYWNoKCRkaXNhYmxlZEZ1bmN0aW9ucyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICAkZGlzYWJsZWRGdW5jdGlvbnNbJGtleV0gPSB0cmltKCR2YWx1ZSk7CiAgICAKICAgIGlmICgkdHlwZXMgPT09IE5VTEwpCiAgICB7CiAgICAgICAgJHR5cGVzID0gR0xPQl9GSUxFU3xHTE9CX0RJUlM7CiAgICAgICAgJF90eXBlcyA9IE5VTEw7CiAgICB9CiAgICBlbHNlIGlmICgkdHlwZXMgPT09IEdMT0JfRElSUykKICAgICAgICAkdHlwZXMgPSBHTE9CX09OTFlESVI7CiAgICBlbHNlCiAgICAgICAgJF90eXBlcyA9ICR0eXBlczsKICAgIAogICAgLy8kX3R5cGVzID0gJF90eXBlc3xHTE9CX05PU09SVDsgICAvLyBmYXN0ZXIKICAgIAogICAgJG91dHB1dCA9IGFycmF5KCk7IAogICAgLy8gZ2xvYigpIG5lcG91eml0LCBwb2t1ZCBobGVkYW0gdnNlY2hueSBzb3Vib3J5L2FkcmVzYXJlIC0gcHJvdG96ZSBrZHl6IHBhayBjaGNpIHByb3Zlc3QgaXNfbGluaygpIHRhayB2cmF0aSBmYWxzZSwgcHJvdG96ZQogICAgLy8gZnVua2NlIGdsb2IgdXogdnJhY2kgY2VzdHUgayBsaW5rb3ZhbmVtdSBzb3Vib3J1IGEgbmUgcHV2b2RuaSBsaW5rISEhISEKICAgIC8vZWNobyBiYXNlbmFtZSgkcGF0dGVybik7CiAgICAvL2V4aXQ7CiAgICAvL2lmIChiYXNlbmFtZSgkcGF0dGVybikgIT0gIioiICYmICFpbl9hcnJheSgiZ2xvYiIsICRkaXNhYmxlZEZ1bmN0aW9ucykpCiAgICBpZiAoIWluX2FycmF5KCJnbG9iIiwgJGRpc2FibGVkRnVuY3Rpb25zKSAmJiAhJGxpbWl0KQogICAgewogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgJG91dHB1dCA9IGdsb2IoJHBhdHRlcm4sICRfdHlwZXMpOyAvLyBqaW5hayB0byB1IGFkcmVzYXJ1IHByaWRhIHpwZXRuZSBsb21pdGtvIG5hIGtvbmVjCiAgICAgICAgJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkZXJyb3IsICJBdCBsZWFzdCBvbmUgb2YgdGhlIHBhc3NlZCBmbGFncyBpcyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICRvdXRwdXQgPSBnbG9iKCRwYXR0ZXJuKTsgLy8gamluYWsgdG8gdSBhZHJlc2FydSBwcmlkYSB6cGV0bmUgbG9taXRrbyBuYSBrb25lYwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighaXNfYXJyYXkoJG91dHB1dCkpCiAgICAgICAgICAgICRvdXRwdXQgPSBhcnJheSgpOwogICAgfQogICAgLy8gZWxzZSB1c2UgZ2xvYiBzaW11bGF0aW9uCiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoInBhdHRlcm5fbWF0Y2giKSkKICAgICAgICB7CiAgICAgICAgICAgIGZ1bmN0aW9uIHBhdHRlcm5fbWF0Y2goJHBhdHRlcm4sJHN0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9iYXNpY2FsbHkgcHJlcGFyZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgJG91dCA9IG51bGw7CiAgICAgICAgICAgICAgICAkY2h1bmtzID0gZXhwbG9kZSgnOycsJHBhdHRlcm4pOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkY2h1bmtzIGFzICRwYXR0ZXJuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRlc2NhcGU9YXJyYXkoJyQnLCdeJywnLicsJ3snLCd9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnLCcpJywnWycsJ10nLCd8Jyk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUoc3RycG9zKCRwYXR0ZXJuLCcqKicpICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdHRlcm4gPSBzdHJfcmVwbGFjZSgnKionLCcqJywkcGF0dGVybik7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkZXNjYXBlIGFzICRwcm9iZSkKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdHRlcm4gPSBzdHJfcmVwbGFjZSgkcHJvYmUsIlxcJHByb2JlIiwkcGF0dGVybik7CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybiA9IHN0cl9yZXBsYWNlKCc/KicsJyonLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnKj8nLCcqJywKICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJyonLCIuKiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCc/JywnLnsxLDF9JywkcGF0dGVybikpKSk7CiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJHBhdHRlcm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihjb3VudCgkb3V0KSA9PSAxKQogICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuKGVyZWdpKCJeJG91dFswXSQiLCRzdHJpbmcpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4ocHJlZ19tYXRjaCgifF4kb3V0WzBdJHxpcyIsJHN0cmluZykpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJG91dCBhcyAkdGVzdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAvL2lmKGVyZWdpKCJeJHRlc3RlciQiLCRzdHJpbmcpKQogICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVnX21hdGNoKCJ8XiR0ZXN0ZXIkfGlzIiwkc3RyaW5nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZ2V0IHBhdGhuYW1lIChldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBsYXN0IC8gb3IgXCkKICAgICAgICAkcGF0aCA9ICRvdXRwdXQgPSBudWxsOwogICAgICAgIGlmKFBIUF9PUz09J1dJTjMyJykKICAgICAgICAgICAgJHNsYXNoPSdcXCc7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkc2xhc2g9Jy8nOwogICAgICAgICRsYXN0cG9zID0gc3RycnBvcygkcGF0dGVybiwkc2xhc2gpOwogICAgICAgIGlmKCEoJGxhc3Rwb3MgPT09IGZhbHNlKSkKICAgICAgICB7CiAgICAgICAgICAgICRwYXRoID0gc3Vic3RyKCRwYXR0ZXJuLDAsJGxhc3Rwb3MrMSk7IC8vbmVnYXRpdmUgbGVuZ3RoIG1lYW5zIHRha2UgZnJvbSB0aGUgcmlnaHQKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gc3Vic3RyKCRwYXR0ZXJuLCRsYXN0cG9zKzEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvL25vIGRpciBpbmZvLCB1c2UgY3VycmVudCBkaXIKICAgICAgICAgICAgJHBhdGggPSBnZXRjd2QoKTsKICAgICAgICB9CiAgICAgICAgJGhhbmRsZSA9QCBvcGVuZGlyKCRwYXRoKTsKICAgICAgICBpZigkaGFuZGxlID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0b3BGaWxlKCRwYXR0ZXJuLCAiZ2xvYiIpOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgJGkgPSAwOwogICAgICAgIHdoaWxlKCRkaXIgPSByZWFkZGlyKCRoYW5kbGUpKQogICAgICAgIHsKICAgICAgICAgICAgaWYocGF0dGVybl9tYXRjaCgkcGF0dGVybiwkZGlyKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRkaXIgIT0gIi4iICYmICRkaXIgIT0gIi4uIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCEkYmVnaW4gfHwgJGkgPj0gJGJlZ2luKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaXNfZGlyKCRwYXRoLiRkaXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpciAuPSAiLyI7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lzX2RpcigkcGF0aC4kZGlyKSAmJiAoJHR5cGVzICYgR0xPQl9ESVJTIHx8ICR0eXBlcyAmIEdMT0JfT05MWURJUikgfHwgIWlzX2RpcigkcGF0aC4kZGlyKSAmJiAoJHR5cGVzICYgR0xPQl9GSUxFUyAmJiAhKCR0eXBlcyAmIEdMT0JfT05MWURJUikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dFtdID0gJHBhdGguJGRpcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKF9pc19kaXIoJHBhdGguJGRpcikgJiYgKCR0eXBlcyAmIEdMT0JfRElSUyB8fCAkdHlwZXMgJiBHTE9CX09OTFlESVIpIHx8ICFpc19kaXIoJHBhdGguJGRpcikgJiYgKCR0eXBlcyAmIEdMT0JfRklMRVMgJiYgISgkdHlwZXMgJiBHTE9CX09OTFlESVIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoJGxpbWl0ICYmICRpID49ICRiZWdpbiskbGltaXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICB9CiAgICAgICAgY2xvc2VkaXIoJGhhbmRsZSk7CiAgICAgICAgICAKICAgICAgICBpZighaXNfYXJyYXkoJG91dHB1dCkpCiAgICAgICAgICAgICRvdXRwdXQgPSBhcnJheSgpOyAKICAgIH0KICAgIAogICAgJF9vdXRwdXQgPSBhcnJheSgpOwogICAgLy9kdW1wKCRfb3V0cHV0KTsKICAgIGZvcmVhY2goJG91dHB1dCBhcyAkX291dCkKICAgIHsKICAgICAgICAvLyAhISEgTkVTTUlNIFBPVVpJVCByZWFscGF0aCgpICEhISEgdG8gcHJldmVkZSBzeW1saW5reSBuYSBzb3Vib3J5LCBrYW0gb2RrYXp1amkKICAgICAgICAvLyRfb3V0ID0gY2xlYW5MaW5rKHJlYWxwYXRoKCRfb3V0KSk7CiAgICAgICAgaWYgKGlzX2RpcigkX291dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHR5cGVzICYgR0xPQl9ESVJTIHx8ICR0eXBlcyAmIEdMT0JfT05MWURJUikKICAgICAgICAgICAgICAgICRfb3V0cHV0W10gPSAkX291dDsKICAgICAgICAgICAgLy9pZiAoJHJlY3Vyc2l2ZSkKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkcmVjdXJzaXZlKSB8fCBpc19hcnJheSgkcmVjdXJzaXZlKSkgLy8gY2FsbGJhY2sgZnVuY3Rpb24gbmFtZQogICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHJlY3Vyc2l2ZSwgJF9vdXQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCRyZWN1cnNpdmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vJF9vdXRwdXQgPSBhcnJheV9tZXJnZSgkX291dHB1dCwgX2dsb2IoJF9vdXQuIi8qIiwgJHR5cGVzLCAkcmVjdXJzaXZlKSk7CiAgICAgICAgICAgICAgICBpZiAoJHJlY3Vyc2l2ZSAhPT0gdHJ1ZSkgLy8gY2FsbGJhY2sgZnVuY3Rpb24gbmFtZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCRyZWN1cnNpdmUsICRfb3V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJF9vdXRwdXQgPSBhcnJheV9tZXJnZSgkX291dHB1dCwgX2dsb2IoJF9vdXQuIi8qIiwgJHR5cGVzLCAkcmVjdXJzaXZlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHR5cGVzICYgR0xPQl9GSUxFUyAmJiAhKCR0eXBlcyAmIEdMT0JfT05MWURJUikpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZ2V0RmlsZUV4dCgkX291dCkgPT0gImxuayIpCiAgICAgICAgICAgICAgICAkX291dCA9IHN1YnN0cigkX291dCwgMCwgc3RybGVuKCRfb3V0KS00KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vaWYgKGlzX3N0cmluZygkcmVjdXJzaXZlKSkgLy8gY2FsbGJhY2sgZnVuY3Rpb24gbmFtZQogICAgICAgICAgICAvLyAgICBjYWxsX3VzZXJfZnVuYygkcmVjdXJzaXZlLCAkX291dCk7CgogICAgICAgICAgICAkX291dHB1dFtdID0gJF9vdXQ7CiAgICAgICAgfQogICAgfQogICAgICAgIAogICAgc3RvcEZpbGUoJF9wYXR0ZXJuLCAiZ2xvYiIpOwogICAgcmV0dXJuICRfb3V0cHV0Owp9CgpmdW5jdGlvbiBnZXRGaWxlTmFtZSgkZmlsZW5hbWUpCnsKICAgIGlmIChpc19hcnJheSgkZmlsZW5hbWUpICYmICRmaWxlbmFtZVsibmFtZSJdKQogICAgICAgICRmaWxlbmFtZSA9ICRmaWxlbmFtZVsibmFtZSJdOwogICAgCiAgICAkZmV4dCAgPSBnZXRGaWxlRXh0KCRmaWxlbmFtZSk7CiAgICAkZm5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUsICcuJy4kZmV4dCk7CgogICAgcmV0dXJuKCRmbmFtZSk7Cn0KZnVuY3Rpb24gZ2V0RmlsZUV4dCgkZmlsZW5hbWUpCnsKICAgIGlmIChpc19hcnJheSgkZmlsZW5hbWUpICYmICRmaWxlbmFtZVsibmFtZSJdKQogICAgICAgICRmaWxlbmFtZSA9ICRmaWxlbmFtZVsibmFtZSJdOwoKICAgICRmZXh0QXJyYXkgPSBleHBsb2RlKCcuJywgJGZpbGVuYW1lKTsKICAgIGlmIChjb3VudCgkZmV4dEFycmF5KSA+IDEpCiAgICAgICAgJGZleHQgID0gYXJyYXlfcG9wKCRmZXh0QXJyYXkpOwogICAgZWxzZQogICAgICAgICRmZXh0ID0gIiI7CgogICAgcmV0dXJuKCRmZXh0KTsKfQpmdW5jdGlvbiBnZXRGaWxlUGF0aCgkZmlsZW5hbWUpCnsKICAgICRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGZpbGVuYW1lKTsKICAgICRmcGF0aCA9IGNsZWFuTGluayhkaXJuYW1lKCRmaWxlbmFtZSkuIi8iKTsKCiAgICByZXR1cm4oJGZwYXRoKTsKfQoKZnVuY3Rpb24gX2ZpbGVzaXplKCRmaWxlTmFtZSkKewogICAgJGZpbGVOYW1lID0gZmluZEZpbGUoJGZpbGVOYW1lKTsKICAgIAogICAgJGZpbGVOYW1lID0gZ2V0U3ltbGlua0ZpbGUoJGZpbGVOYW1lKTsKCiAgICBzdGFydEZpbGUoJGZpbGVOYW1lLCAic2l6ZSIpOwogICAgLy8gY2hlY2sgcGxhdGZvcm0KICAgIGNsZWFyc3RhdGNhY2hlKCk7CiAgICBpZiAoUEhQX0lOVF9NQVggPCAyKjIxNDc0ODM2NDcpIC8vIDMyYml0CiAgICB7CiAgICAgICAgLy8gdHJ5IHRvIHVzZSBjdXJsCiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiY3VybF9pbml0IikpCiAgICAgICAgewogICAgICAgICAgICAkY2ggPSBAY3VybF9pbml0KCJmaWxlOi8vIi5yZWFscGF0aCgkZmlsZU5hbWUpKTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9OT0JPRFksIHRydWUpOwogICAgICAgICAgICBAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIHRydWUpOwogICAgICAgICAgICAkZGF0YSA9IEBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICAgICAgQGN1cmxfY2xvc2UoJGNoKTsgICAgICAgICAgICAKCiAgICAgICAgICAgIGlmICgkZGF0YSAhPT0gRkFMU0UgJiYgcHJlZ19tYXRjaCgnL0NvbnRlbnQtTGVuZ3RoOiAoXGQrKS8nLCAkZGF0YSwgJG1hdGNoZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdG9wRmlsZSgkZmlsZU5hbWUsICJzaXplIik7CiAgICAgICAgICAgICAgICByZXR1cm4oKHN0cmluZykkbWF0Y2hlc1sxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gdHJ5IHRvIHVzZSBuYXRpdmUgc2VlawogICAgICAgICRmcCA9IGZvcGVuKCRmaWxlTmFtZSwgInJiIik7CiAgICAgICAgZmxvY2soJGZwLCBMT0NLX1NIKTsKICAgICAgICBpZiAoJGZwKSAKICAgICAgICB7CiAgICAgICAgICAgICRyZXMgPSBmc2VlaygkZnAsIDAsIFNFRUtfRU5EKTsKICAgICAgICAgICAgaWYgKCRyZXMgPT09IDApIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcG9zID0gZnRlbGwoJGZwKTsKICAgICAgICAgICAgICAgIGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIC8vICRwb3Mgd2lsbCBiZSBwb3NpdGl2ZSBpbnQgaWYgZmlsZSBpcyA8MkdCCiAgICAgICAgICAgICAgICAvLyBpZiBpcyA+MkdCIDw0R0IgaXQgd2lsbCBiZSBuZWdhdGl2ZSBudW1iZXIKICAgICAgICAgICAgICAgIGlmKCRwb3M+PTApIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgInNpemUiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZykkcG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgInNpemUiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ByaW50ZigiJXUiLCAkcG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHRyeSB0byB1c2UgQ09NCiAgICAgICAgaWYgKGlzV2luZG93cygpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNsYXNzX2V4aXN0cygiQ09NIikpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIFdpbmRvd3MgQ09NIGludGVyZmFjZQogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGZzb2JqID0gbmV3IENPTSgnU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGZzb2JqKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcm5hbWUoJGZpbGVOYW1lKSA9PSAnLicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZk5hbWUgPSAoKHN1YnN0cihnZXRjd2QoKSwgLTEpID09IERJUkVDVE9SWV9TRVBBUkFUT1IpID8gZ2V0Y3dkKCkgLiBiYXNlbmFtZSgkZmlsZU5hbWUpIDogZ2V0Y3dkKCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYmFzZW5hbWUoJGZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmID0gJGZzb2JqLT5HZXRGaWxlKCRmTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBzdG9wRmlsZSgkZmlsZU5hbWUsICJzaXplIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKSAkZi0+U2l6ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gJGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAvLyB0cnkgdG8gdXNlIGV4ZWMKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJleGVjIikpIAogICAgICAgIHsKICAgICAgICAgICAgJGVzY2FwZWRQYXRoID0gZXNjYXBlc2hlbGxhcmcoJGZpbGVOYW1lKTsKCiAgICAgICAgICAgIGlmIChzdHJ0b3VwcGVyKHN1YnN0cihQSFBfT1MsIDAsIDMpKSA9PSAnV0lOJykgCiAgICAgICAgICAgIHsgLy8gV2luZG93cwogICAgICAgICAgICAgICAgLy8gVHJ5IHVzaW5nIHRoZSBOVCBzdWJzdGl0aW9uIG1vZGlmaWVyICV+egogICAgICAgICAgICAgICAgJHNpemUgPSB0cmltKEBleGVjKCJmb3IgJUYgaW4gKCRlc2NhcGVkUGF0aCkgZG8gQGVjaG8gJX56RiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsgLy8gb3RoZXIgT1MKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF0Zm9ybSBpcyBub3QgV2luZG93cywgdXNlIHRoZSBzdGF0IGNvbW1hbmQgKHNob3VsZCB3b3JrIGZvciAqbml4IGFuZCBNYWNPUykKICAgICAgICAgICAgICAgICRzaXplID0gdHJpbShAZXhlYygic3RhdCAtYyVzICRlc2NhcGVkUGF0aCIpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgdGhlIHJldHVybiBpcyBub3QgYmxhbmssIG5vdCB6ZXJvLCBhbmQgaXMgbnVtYmVyCiAgICAgICAgICAgIGlmICgkc2l6ZSAmJiBjdHlwZV9kaWdpdCgkc2l6ZSkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdG9wRmlsZSgkZmlsZU5hbWUsICJzaXplIik7CiAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZykgJHNpemU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFpc19kaXIoJGZpbGVOYW1lKSkKICAgICAgICAgICAgJHNpemUgPSBmaWxlc2l6ZSgkZmlsZU5hbWUpOwogICAgICAgIAogICAgICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgInNpemUiKTsKCiAgICAgICAgcmV0dXJuKCRzaXplKTsKICAgIH0KICAgIGVsc2UgLy8gNjRiaXQKICAgIHsKICAgICAgICBpZiAoIWlzX2RpcigkZmlsZU5hbWUpKQogICAgICAgICAgICAkc2l6ZSA9IGZpbGVzaXplKCRmaWxlTmFtZSk7CiAgICAgICAgICAgIAogICAgICAgIHN0b3BGaWxlKCRmaWxlTmFtZSwgInNpemUiKTsKICAgICAgICByZXR1cm4oJHNpemUpOwogICAgfQp9CgpmdW5jdGlvbiBnZXRGaWxlVHlwZUljb24oJGZpbGVOYW1lLCAkc2l6ZT0xNikKewogICAgJGZpbGVOYW1lID0gZ2V0U3ltbGlua0ZpbGUoJGZpbGVOYW1lKTsKCiAgICAkZmlsZU5hbWUgPSBiYXNlbmFtZSgkZmlsZU5hbWUpOwogICAgJG5hbWUgPSBzdHJ0b2xvd2VyKGdldEZpbGVOYW1lKCRmaWxlTmFtZSkpOwogICAgJGV4dCA9IHN0cnRvbG93ZXIoZ2V0RmlsZUV4dCgkZmlsZU5hbWUpKTsKICAgIAogICAgJHBhdGggPSBDT1JFUEFUSC4iaW1hZ2VzL2NvcmUvZmlsZXMvJHNpemUvIjsgICAgCiAgICAkdXJsID0gU0VSVkVSQ09SRVVSTC5DT1JFVVJMLiJpbWFnZXMvY29yZS9maWxlcy8kc2l6ZS8iOyAgICAKCiAgICBpZiAoX2ZpbGVfZXhpc3RzKCRwYXRoLiRuYW1lLiIuIi4kZXh0LiIucG5nIikpCiAgICAgICAgcmV0dXJuKCR1cmwuJG5hbWUuIi4iLiRleHQuIi5wbmciKTsKICAgIGlmIChfZmlsZV9leGlzdHMoJHBhdGguJGV4dC4iLnBuZyIpKQogICAgICAgIHJldHVybigkdXJsLiRleHQuIi5wbmciKTsKCiAgICByZXR1cm4oJHVybC4iXy5wbmciKTsKfQoKZnVuY3Rpb24gX3JlbmFtZSgkZmlsZU5hbWVGcm9tLCAkZmlsZU5hbWVUbykKewogICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlTmFtZUZyb20uIi5sbmsiKSkKICAgIHsKICAgICAgICAkZmlsZU5hbWVGcm9tID0gJGZpbGVOYW1lRnJvbS4iLmxuayI7CiAgICAgICAgJGZpbGVOYW1lVG8gPSAkZmlsZU5hbWVUby4iLmxuayI7CiAgICB9CgogICAgJGZyb21GaWxlU2l6ZSA9IF9maWxlc2l6ZSgkZmlsZU5hbWVGcm9tKTsKCiAgICBzdGFydEZpbGUoJGZpbGVOYW1lRnJvbSwgInJlbmFtZSIpOwogICAgb2Jfc3RhcnQoKTsKICAgIHJlbmFtZSgkZmlsZU5hbWVGcm9tLCAkZmlsZU5hbWVUbyk7CiAgICAkZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgIG9iX2VuZF9jbGVhbigpOwoKICAgIGlmICgkZXJyb3IgfHwgX2ZpbGVzaXplKCRmaWxlTmFtZVRvKSAhPSAkZnJvbUZpbGVTaXplKQogICAgewogICAgICAgIGlmIChfY29weSgkZmlsZU5hbWVGcm9tLCAkZmlsZU5hbWVUbykpCiAgICAgICAgICAgIF91bmxpbmsoJGZpbGVOYW1lRnJvbSk7CgogICAgICAgICRlcnJvciA9ICghX2ZpbGVfZXhpc3RzKCRmaWxlTmFtZVRvKSB8fCBfZmlsZXNpemUoJGZpbGVOYW1lVG8pICE9ICRmcm9tRmlsZVNpemUpOwogICAgfQogICAgCiAgICBzdG9wRmlsZSgkZmlsZU5hbWVGcm9tLCAicmVuYW1lIik7CiAgICAKICAgIHJldHVybighJGVycm9yKTsKfQogICAgCmZ1bmN0aW9uIF91bmxpbmsoJGZpbGVOYW1lKQp7CiAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGVOYW1lLiIubG5rIikpCiAgICAgICAgJGZpbGVOYW1lID0gJGZpbGVOYW1lLiIubG5rIjsKCiAgICAkZmlsZU5hbWUgPSBmaW5kRmlsZSgkZmlsZU5hbWUpOwoKICAgIGlmICghJGZpbGVOYW1lKQogICAgICAgIHJldHVybjsKICAgIAogICAgc3RhcnRGaWxlKCRmaWxlTmFtZSwgInVubGluayIpOwogICAgQHVubGluaygkZmlsZU5hbWUpOwoKICAgIGlmIChfZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkKICAgIHsKICAgICAgICAkcmV0ID0gZmFsc2U7CgogICAgICAgIC8vIHRyeSB0byBjcmVhdGUgZGlyZWN0b3J5IHZpYSBGVFAKICAgICAgICBnbG9iYWwgJF9DT05GSUc7CiAgICAgICAgaWYgKCRfQ09ORklHWyJmdHAiXVsiaG9zdCJdICE9ICIiICYmICRfQ09ORklHWyJmdHAiXVsibG9naW4iXSAhPSAiIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoImZ0cF9jb25uZWN0IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb25uX2lkID0gX2Z0cF9jb25uZWN0KCRfQ09ORklHWyJmdHAiXVsiaG9zdCJdLCAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0sICRfQ09ORklHWyJmdHAiXVsicGFzc3dvcmQiXSk7CiAgICAgICAgICAgICAgICBpZiAoJGNvbm5faWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGRpcm5hbWUgPSBzdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgIiIsIHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgZGlybmFtZSgkZmlsZU5hbWUpKS4iLyIpOwogICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgPSAkX0NPTkZJR1siZnRwIl1bInBhdGgiXS4iLyIuJGRpcm5hbWU7CiAgICAgICAgICAgICAgICAgICAgJGZ0cEZvbGRlciA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGZ0cEZvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgJGZ0cEZvbGRlciA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJGZ0cEZvbGRlcik7CgogICAgICAgICAgICAgICAgICAgIGlmICgkZnRwRm9sZGVyW3N0cmxlbigkbmV3RnRwRm9sZGVyKS0xXSAhPSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgLj0gIi8iOwoKICAgICAgICAgICAgICAgICAgICAkZnRwRm9sZGVyID0gc3RyX3JlcGxhY2UoIi8vIiwgIi8iLCAkZnRwRm9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoQGZ0cF9jaGRpcigkY29ubl9pZCwgJGZ0cEZvbGRlcikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICBmdHBfZGVsZXRlKCRjb25uX2lkLCAkZnRwRm9sZGVyLiIvIi5iYXNlbmFtZSgkZmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRlcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAidW5hYmxlIHRvIGNoYW5nZSBmdHAgZGlyZWN0b3J5IHRvICciLiRmdHBGb2xkZXIuIicuIFBsZWFzZSBmaXggXCRmdHBQYXRoIHZhcmlhYmxlIGluICdjb25maWcvY29uZmlnLmluaS5waHAnIGFuZCB0cnkgYWdhaW4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoISRyZXQpCiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkNhbm5vdCBkZWxldGUgZmlsZSAnJGZpbGVOYW1lJyBpbiBzYWZlX21vZGUgdXNpbmcgRlRQIGNvbm5lY3Rpb24gKCIuJGVycm9yLiIpIiwgbXRFcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkJ1aWx0IEZUUCBDb25uZWN0aW9uIGZvciBkZWxldGluZyBmaWxlcyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc2VydmVyIiwgbXRFcnJvcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJDYW5ub3QgZGVsZXRlIGZpbGUgJyRmaWxlbmFtZScgaW4gc2FmZV9tb2RlICh0cnkgdG8gc2V0dXAgRlRQIGNvbm5lY3Rpb24pIiwgbXRFcnJvcik7CiAgICB9CiAgICBzdG9wRmlsZSgkZmlsZU5hbWUsICJ1bmxpbmsiKTsKfQoKLy8gdHJ5IHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQpmdW5jdGlvbiBfdGVtcG5hbSgkcHJlZml4PSIiKQp7CiAgICAkcGF0aHMgPSBhcnJheShzeXNfZ2V0X3RlbXBfZGlyKCksIFBST0pFQ1RQQVRILiJfX3RtcCIsIFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAiKTsKCiAgICBmb3JlYWNoKCRwYXRocyBhcyAkcGF0aCkKICAgIHsKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICRmaWxlID0gJHBhdGguIi8iLiRwcmVmaXguVVVJRCgpLiIudG1wIjsKICAgICAgICAkZiA9IGZvcGVuKCRmaWxlLCAidysiKTsKICAgICAgICAvLyRmaWxlID0gdGVtcG5hbSgkcGF0aC4iLyIsICRwcmVmaXgpOwogICAgICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIGlmICgkZiAmJiAhJGVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgZmNsb3NlKCRmKTsKICAgICAgICAgICAgX2NobW9kKCRmaWxlLCAwNzc3LCB0cnVlKTsKICAgICAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgCiAgICAgICAgICAgIHJldHVybigkZmlsZSk7CiAgICAgICAgfQogICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgIC8vaWYgKCRlcnJvcikKICAgICAgICAvL3sKICAgICAgICAgICAgLy9lY2hvICIhIi4kZXJyb3IuIiEiOwogICAgICAgICAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgLy99CiAgICAgICAgCiAgICAgICAgLy9pZiAoJGZpbGVOYW1lKQogICAgICAgIC8vICAgIHJldHVybigkZmlsZU5hbWUpOwogICAgfQoKICAgIC8vZWNobyAiPGhyPiI7CiAgICAKICAgIC8vc2hvd01lc3NhZ2UoIl90ZW1wbmFtKCkgLSBjYW5ub3QgY3JlYXRlIGZpbGUiLCBtdEVycm9yKTsKICAgIAogICAgcmV0dXJuKE5VTEwpOwp9CgpmdW5jdGlvbiBfZmlsZV9wdXRfY29udGVudHMoJGZpbGVOYW1lLCAkZGF0YT0iIiwgJHBlcm1pc3Npb25zPUNITU9EX0ZJTEVfREVGQVVMVCwgJHNpbGVudD1mYWxzZSkKewogICAgJGZpbGVOYW1lID0gZ2V0U3ltbGlua0ZpbGUoJGZpbGVOYW1lKTsKCiAgICBpZiAoZGVmaW5lZCgiT0ZGTElORV9SRUFET05MWSIpICYmIE9GRkxJTkVfUkVBRE9OTFkpCiAgICAgICAgcmV0dXJuKHRydWUpOwogICAgCiAgICBpZiAoISRmaWxlTmFtZSkKICAgICAgICByZXR1cm4oZmFsc2UpOwoKICAgIHN0YXJ0RmlsZSgkZmlsZU5hbWUsICJ3cml0ZSIpOwoKICAgICRmaWxlTmFtZSA9IGNsZWFuTGluaygkZmlsZU5hbWUpOwogICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAKICAgIC8vIGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgaWYgdGhlc2UgZG8gbm90IGV4aXN0CiAgICAkcGFyZW50RGlyID0gZGlybmFtZSgkZmlsZU5hbWUpOwogICAgLy92YXJfZHVtcCgkcGFyZW50RGlyKTsKICAgIC8vdmFyX2R1bXAoZmlsZV9leGlzdHMoJHBhcmVudERpcikpOwogICAgLy92YXJfZHVtcChzdHJwb3MoJHBhcmVudERpciwgUFJPSkVDVFBBVEgpID09PSAwKTsKICAgIGlmICghX2ZpbGVfZXhpc3RzKCRwYXJlbnREaXIpICYmIHN0cnBvcygkcGFyZW50RGlyLCBQUk9KRUNUUEFUSCkgPT09IDApCiAgICB7CiAgICAgICAgX21rZGlyKCRwYXJlbnREaXIsIENITU9EX0lOSEVSSVQsICRjcmVhdGVJbmRleCk7CiAgICB9CiAgICAKICAgIC8qCiAgICAkZGlyTmFtZSA9IGRpcm5hbWUoY2xlYW5MaW5rKCRmaWxlTmFtZSkpOwogICAgCiAgICAvLyBUT0RPICEhISEhISEhIGRvIGl0IGJldHRlcgogICAgaWYgKHN0cnBvcyhQUk9KRUNUUEFUSCwgJGRpck5hbWUpID09PSAwICYmIGNsZWFuTGluayhQUk9KRUNUUEFUSC4iLyIpICE9IGNsZWFuTGluaygkZGlyTmFtZS4iLyIpKQogICAgewogICAgICAgIHNob3dNZXNzYWdlKCJJbnRlcm5hbCBlcnJvciBpbiBfZmlsZV9wdXRfY29udGVudHMgKGluc2lkZSBvZiBQUk9KRUNUUEFUSCkiLCBtdEVycm9yKTsKICAgICAgICByZXR1cm47CiAgICB9CgoKICAgIGlmICghX2ZpbGVfZXhpc3RzKCRkaXJOYW1lKSkKICAgIHsKICAgICAgICAvLyB0cnkgdG8gY3JlYXRlIGRpcmVjdG9yeQogICAgICAgICRkaXJzID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkZGlyTmFtZSk7CiAgICAgICAgJGRpcnMgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsICRkaXJzKTsKICAgICAgICAkZGlycyA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJGRpcnMpOwogICAgICAgICAgICAKICAgICAgICAkZGlycyA9IGV4cGxvZGUoIi8iLCAkZGlycyk7CgogICAgICAgICRkaXIgPSAkZGlyc1swXTsKICAgICAgICAkb3BlbkJhc2VEaXJzID0gYXJyYXkoKTsKICAgICAgICBmb3IoJGkgPSAxIDsgJGkgPCBjb3VudCgkZGlycykgOyAkaSsrKQogICAgICAgIHsKICAgICAgICAgICAgJGRpciAuPSAiLyIuJGRpcnNbJGldOwogICAgICAgICAgICBpZiAoc3RyaXBvcyhQUk9KRUNUUEFUSCwgJGRpcikgIT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgICAgICAgICAkZmlsZUV4aXN0cyA9IF9maWxlX2V4aXN0cygkZGlyKTsKICAgICAgICAgICAgICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChzdHJpcG9zKCRlcnJvciwgIm9wZW5fYmFzZWRpciByZXN0cmljdGlvbiBpbiBlZmZlY3QiKSAhPT0gRkFMU0UgfHwgaW5fYXJyYXkoJGRpciwgJG9wZW5CYXNlRGlycykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoY291bnQoJG9wZW5CYXNlRGlycykgPT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL2lzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcGF0aFwoc1wpOiBcKChbXlwpXSopXCkvaW1zIiwgJGVycm9yLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZW5CYXNlRGlycyA9IGV4cGxvZGUoIjoiLCAkZWxlbXNbMF1bMV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRmaWxlRXhpc3RzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoISRmaWxlRXhpc3RzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghX21rZGlyKCRkaXIpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIl9maWxlX3B1dF9jb250ZW50cygnIi4kZmlsZU5hbWUuIicpIC0gZXJyb3IgY3JlYXRpbmcgZGlyZWN0b3J5ICciLiRkaXIuIiciLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBfY2htb2QoJGRpciwgQ0hNT0RfV1JJVEUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgKi8KICAgIAogICAgLy8gdHJ5IHRvIHNhdmUgZmlsZQogICAgLy8kcmVzdWx0ID0gVFJVRTsKICAgIGdsb2JhbCAkX0ZJTEVfRk9SQ0VfRlRQLCAkX0ZJTEVfRk9SQ0VfUEhQLCAkX1BIUF9GSUxFX0ZPUkNFX0ZUUCwgJF9DT05GSUc7CiAgICAvL2VjaG8gIiEhISEhIjsKICAgIC8vdmFyX2R1bXAoJF9GSUxFX0ZPUkNFX1BIUCk7CiAgICAvL3Zhcl9kdW1wKCRfRklMRV9GT1JDRV9GVFApOwogICAgLy9leGl0OwogICAgCiAgICBpZiAoLyokX0ZJTEVfRk9SQ0VfUEhQICYmICovISRfRklMRV9GT1JDRV9GVFAgJiYgKCEkX1BIUF9GSUxFX0ZPUkNFX0ZUUCB8fCBnZXRGaWxlRXh0KCRmaWxlTmFtZSkgIT0gInBocCIpIHx8ICEoJF9DT05GSUdbImZ0cCJdWyJob3N0Il0gJiYgJF9DT05GSUdbImZ0cCJdWyJsb2dpbiJdKSkgIC8vIG9uIHNhZmUgbW9kZSBjYW5ub3QgY3JlYXRlIGZpbGVzLCBvciBpdCB3aWxsIGJlIG5vdCByZWFkYWJsZSBieSBBcGFjaGUgKFNBRkUgTU9ERSBSZXN0cmljdGlvbiBpbiBlZmZlY3QuIFRoZSBzY3JpcHQgd2hvc2UgdWlkIGlzIDMzIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyApCiAgICB7CiAgICAgICAgLy9AdW5saW5rKCRmaWxlTmFtZSk7CiAgICAgICAgLyoKICAgICAgICBpZiAoc3RycG9zKERPTUFJTiwgImNvcmUyLiIpID09PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gIjxocj4iOwogICAgICAgICAgICB2YXJfZHVtcCgkZmlsZU5hbWUpOwogICAgICAgICAgICB2YXJfZHVtcCgkX0ZJTEVfRk9SQ0VfUEhQKTsKICAgICAgICAgICAgdmFyX2R1bXAoJF9QSFBfRklMRV9GT1JDRV9GVFApOwogICAgICAgICAgICB2YXJfZHVtcCgkX0ZJTEVfRk9SQ0VfRlRQKTsKICAgICAgICAgICAgdmFyX2R1bXAoZ2V0RmlsZUV4dCgkZmlsZU5hbWUpKTsKICAgICAgICB9CiAgICAgICAgKi8gICAgICAgIAoKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlTmFtZSwgJGRhdGEpOwogICAgICAgICRyZXN1bHQgPSBfZmlsZV9leGlzdHMoJGZpbGVOYW1lKTsKICAgICAgICAkZXJyb3JzID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICBpZiAoc3RycG9zKCRmaWxlTmFtZSwgIi5jc3MiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICB2YXJfZHVtcChfZmlsZV9leGlzdHMoJGZpbGVOYW1lKSk7CiAgICAgICAgICAgIHZhcl9kdW1wKGZpbGVzaXplKCRmaWxlTmFtZSkpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vaWYgKCEkcmVzdWx0KQogICAgICAgIC8vICAgIEB1bmxpbmsoJGZpbGVOYW1lKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRlcnJvcnMgIT0gIiIpCiAgICAgICAgICAgICRyZXN1bHQgPSBGQUxTRTsKCiAgICAgICAgLyoKICAgICAgICBpZiAoJHJlc3VsdCAmJiBzdHJsZW4oJGRhdGEpID09IDApCiAgICAgICAgewogICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkZmlsZU5hbWUsICIiKTsKICAgICAgICAgICAgJHJlc3VsdCA9IF9maWxlX2V4aXN0cygkZmlsZU5hbWUpOwogICAgICAgICAgICAkZXJyb3JzID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vZWNobyAkZXJyb3JzOwogICAgICAgIC8vdmFyX2R1bXAoJHJlc3VsdCk7CiAgICAgICAgLy92YXJfZHVtcCgkcmVzdWx0KTsKICAgICAgICAvL3Zhcl9kdW1wKCRlcnJvcnMpOwogICAgICAgIC8vdmFyX2R1bXAoJHJlc3VsdCk7CiAgICB9CiAgICAvL2VjaG8gJGZpbGVOYW1lOwogICAgCiAgICBnbG9iYWwgJF9DT05GSUc7CiAgICBnbG9iYWwgJF9fc2V0dGluZ3NJbkNvbnN0cnVjdG9yOwogICAgaWYgKCEkcmVzdWx0ICYmICEkX19zZXR0aW5nc0luQ29uc3RydWN0b3IpCiAgICB7CiAgICAgICAgLy8gdXNlIEZUUAogICAgICAgIC8vdmFyX2R1bXAoIkZUUCIpOwogICAgICAgIGlmICgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSAhPSAiIiAmJiAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0gIT0gIiIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29ubl9pZCA9IF9mdHBfY29ubmVjdCgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSwgJF9DT05GSUdbImZ0cCJdWyJsb2dpbiJdLCAkX0NPTkZJR1siZnRwIl1bInBhc3N3b3JkIl0pOwogICAgICAgICAgICAgICAgaWYgKCRjb25uX2lkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoIkZUUENPTk5FQ1RFRCIpOwogICAgICAgICAgICAgICAgICAgICRkaXJuYW1lID0gc3RyX3JlcGxhY2UoUFJPSkVDVFBBVEgsICIiLCBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsIGRpcm5hbWUoJGZpbGVOYW1lKSkuIi8iKTsKICAgICAgICAgICAgICAgICAgICAkZnRwRm9sZGVyID0gJF9DT05GSUdbImZ0cCJdWyJwYXRoIl0uIi8iLiRkaXJuYW1lOwogICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRmdHBGb2xkZXIpOwogICAgICAgICAgICAgICAgICAgICRmdHBGb2xkZXIgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsICRmdHBGb2xkZXIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0cEZvbGRlcltzdHJsZW4oJG5ld0Z0cEZvbGRlciktMV0gIT0gIi8iKQogICAgICAgICAgICAgICAgICAgICAgICAkZnRwRm9sZGVyIC49ICIvIjsKCiAgICAgICAgICAgICAgICAgICAgJGZ0cEZvbGRlciA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJGZ0cEZvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBmdHBfY2hkaXIoJGNvbm5faWQsICRmdHBGb2xkZXIpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXRPYmplY3QoIkRlYnVnIiktPmNvbnRpbnVlRmlsZSgkZmlsZU5hbWUsICJ3IiwgImZ0cCIpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIkNIQU5HRUQiOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRmdHBGb2xkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9vYl9zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAvL3VubGluaygkZmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkdG1wRmlsZU5hbWUgPSBVVUlEKCkuIi50bXAiOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSB0ZW1wIGRpcgogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCIhQCEhISEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChzeXNfZ2V0X3RlbXBfZGlyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyRmcm9tRmlsZU5hbWUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgImZwY18iKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICRmdHBfdG1wX25hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGZ0cF90bXBfbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHBfdG1wX25hbWUgPSBVVUlEKCkuIi5mdHAiOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgJGZyb21GaWxlTmFtZSA9IF90ZW1wbmFtKCJmcGNfIiwgJGZ0cF90bXBfbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmcm9tRmlsZU5hbWUsICRkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZnJvbUZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChmaWxlX2V4aXN0cygkZnJvbUZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGZpbGVfZ2V0X2NvbnRlbnRzKCRmcm9tRmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkZnJvbUZpbGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZyb21GaWxlTmFtZSA9IFBST0pFQ1RQQVRILiJjYWNoZS9mdHAvIi4kdG1wRmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9maWxlX2V4aXN0cyhQUk9KRUNUUEFUSC4iY2FjaGUvZnRwIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJESVIgTk9UIEVYSVNUUyBTVEFSVCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21rZGlyKFBST0pFQ1RQQVRILiJjYWNoZS9mdHAiLCBDSE1PRF9XUklURSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJESVIgTk9UIEVYSVNUUyBFTkQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJGZyb21GaWxlTmFtZSwgJGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkZnJvbUZpbGVOYW1lKSkgLy8gZmlsZXMgY3JlYXRlZCB1c2luZyBubyBGVFAgbXVzdCBiZSBjaGVja2VkIHVzaW5nIG5vIEZUUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvciAuPSAiX2ZpbGVfcHV0X2NvbnRlbnRzKCk6IGNhbm5vdCBzYXZlIGZpbGUgIi5QUk9KRUNUUEFUSC4iY2FjaGUvZnRwLyIuJHRtcEZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChfZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZnRwX2RlbGV0ZSgkY29ubl9pZCwgJGZ0cEZvbGRlci4iLyIuYmFzZW5hbWUoJGZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAvL2lmICghZmlsZV9leGlzdHMoJGZpbGVOYW1lKSAmJiBzdHJwb3MoJGZpbGVOYW1lLCAicHJvY2Vzcy4iKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICR4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBzb21lIHNlcnZlcnMgYWRkaW5nIHJlbGF0aXZlIHBhdGggZG9lc24ndCB3b3JrIGZvciB1cGxvYWQKICAgICAgICAgICAgICAgICAgICAgICAgJHByZXQgPSBmdHBfcHV0KCRjb25uX2lkLCBjbGVhbkxpbmsoJGZ0cEZvbGRlci4iLyIuYmFzZW5hbWUoJGZpbGVOYW1lKSksICRmcm9tRmlsZU5hbWUsIEZUUF9CSU5BUlkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRwcmV0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIkEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGNoYW5naW5nIGRpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2NoZGlyKCRjb25uX2lkLCAkZnRwRm9sZGVyLiIvIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJldCA9IGZ0cF9wdXQoJGNvbm5faWQsIGNsZWFuTGluayhiYXNlbmFtZSgkZmlsZU5hbWUpKSwgJGZyb21GaWxlTmFtZSwgRlRQX0JJTkFSWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY2hkaXIoJGNvbm5faWQsICIvIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGZyb21GaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoY2xlYW5MaW5rKCRmdHBGb2xkZXIuIi8iLmJhc2VuYW1lKCRmaWxlTmFtZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkeCkKICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRmcm9tRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXJfZHVtcCgkZnRwRm9sZGVyLiIvIi5iYXNlbmFtZSgkZmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2Z0cF9jaG1vZCgkY29ubl9pZCwgJHBlcm1pc3Npb25zLCAkZnRwRm9sZGVyLiIvIi5iYXNlbmFtZSgkZmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKCRmcm9tRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAvL29iX2VuZF9jbGVhbigpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yIC49ICJfZmlsZV9wdXRfY29udGVudHMoJyIuJGZpbGVOYW1lLiInKTogZmlsZSBub3Qgc2F2ZWQiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJDSE1PRCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2htb2QoJGZpbGVOYW1lLCAkcGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJOT1QgQ0hBTkdFRCI7CiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRFcnJvciAuPSAiVW5hYmxlIHRvIGNoYW5nZSBmdHAgZGlyZWN0b3J5IHRvICciLiRmdHBGb2xkZXIuIicuIFBsZWFzZSBmaXggXCRmdHBQYXRoIHZhcmlhYmxlIGluICdjb25maWcvY29uZmlnLmluaS5waHAnIGFuZCB0cnkgYWdhaW4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCEkcmV0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRvdXRFcnJvciAuPSAiQ2Fubm90IHNhdmUgZmlsZSAnIi4kZmlsZU5hbWUuIicgdXNpbmcgRlRQIGNvbm5lY3Rpb24gKCIuJGVycm9yLiIpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRvdXRFcnJvciAuPSAiQnVpbHQgRlRQIENvbm5lY3Rpb24gZm9yIHNhdmluZyBmaWxlcyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc2VydmVyIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgJG91dEVycm9yIC49ICJDYW5ub3Qgc2F2ZSBmaWxlICIuJGZpbGVOYW1lLiIgdG8gZGlyZWN0b3J5ICciLiRwYXJlbnREaXIuIicgdGhhdCBoYXMgbm90IGNobW9kIDc3NyAodHJ5IHRvIHNldHVwIEZUUCBjb25uZWN0aW9uKSI7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIF9jaG1vZCgkZmlsZU5hbWUsIChnZXRGaWxlRXh0KCRmaWxlTmFtZSkgPT0gInBocCIgPyBDSE1PRF9QSFAgOiAkcGVybWlzc2lvbnMpLCAkc2lsZW50KTsKICAgIH0KICAgIAogICAgaWYgKENIT1dOX1BIUCAmJiBnZXRGaWxlRXh0KCRmaWxlTmFtZSkgPT0gInBocCIpCiAgICB7CiAgICAgICAgY2hvd24oJGZpbGVOYW1lLCBDSE9XTl9QSFApOwogICAgfQogICAgZWxzZSBpZiAoQ0hPV05fREVGQVVMVCkKICAgIHsKICAgICAgICBjaG93bigkZmlsZU5hbWUsIENIT1dOX0RFRkFVTFQpOwogICAgfQoKICAgIGlmICgkb3V0RXJyb3IgJiYgISRzaWxlbnQpICAgIAogICAgewogICAgICAgIC8vZWNobyAiX2ZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlTmFtZSkgZXJyb3I6IjsKICAgICAgICAvL2VjaG8gJGVycm9yOwogICAgICAgIC8vZWNobyAkb3V0RXJyb3I7CiAgICAgICAgLy9leGl0OwogICAgICAgIHNob3dNZXNzYWdlKCRvdXRFcnJvciwgbXRFcnJvcik7CiAgICB9CiAgICBzdG9wRmlsZSgkZmlsZU5hbWUsICJ3cml0ZSIpOwogICAgCiAgICByZXR1cm4oISRvdXRFcnJvcik7Cn0KCmZ1bmN0aW9uIF9ta2RpcigkZGlybmFtZSwgJHBlcm1pc3Npb25zPUNITU9EX0RJUl9ERUZBVUxULCAkY3JlYXRlSW5kZXg9dHJ1ZSkKewogICAgaWYgKGRlZmluZWQoIk9GRkxJTkVfUkVBRE9OTFkiKSAmJiBPRkZMSU5FX1JFQURPTkxZKQogICAgICAgIHJldHVybihmYWxzZSk7CiAgICAKICAgIHN0YXJ0RmlsZSgkZGlybmFtZSwgIm1rZGlyIik7CgogICAgaWYgKHN0cnBvcygkZGlybmFtZSwgIi9jYWNoZSIpICE9PSBGQUxTRSkKICAgICAgICAkcGVybWlzc2lvbnMgPSBDSE1PRF9XUklURTsKICAgIAogICAgJGRpcm5hbWUgPSBjbGVhbkxpbmsoJGRpcm5hbWUpOwogICAgCiAgICBpZiAoJGRpcm5hbWVbc3RybGVuKCRkaXJuYW1lKV0gPT0gIi8iKQogICAgICAgICRkaXJuYW1lID0gc3Vic3RyKCRkaXJuYW1lLCAwLCBzdHJsZW4oJGRpcm5hbWUpLTIpOwogICAgCiAgICAkX2Rpcm5hbWUgPSAkZGlybmFtZTsKICAgIAogICAgLy8gY3JlYXRlIHBhcmVudCBkaXJlY3RvcmllcyBpZiB0aGVzZSBkbyBub3QgZXhpc3QKICAgICRwYXJlbnREaXIgPSBkaXJuYW1lKGNsZWFuTGluaygkZGlybmFtZSkpOwogICAgaWYgKCFfZmlsZV9leGlzdHMoJHBhcmVudERpcikgJiYgc3RycG9zKCRwYXJlbnREaXIsIFBST0pFQ1RQQVRIKSA9PT0gMCkKICAgIHsKICAgICAgICBfbWtkaXIoJHBhcmVudERpciwgJHBlcm1pc3Npb25zLCAkY3JlYXRlSW5kZXgpOwogICAgfQoKICAgIGlmICgkcGVybWlzc2lvbnMgPT0gQ0hNT0RfSU5IRVJJVCkKICAgIHsKICAgICAgICAkcGVybWlzc2lvbnMgPSBnZXRtb2QoJHBhcmVudERpcik7CiAgICB9CiAgICAvLyBubyBtYXR0ZXIgaWYgc2FmZV9tb2RlIG9yIG5vdAogICAgLy92YXJfZHVtcChmaWxlX2V4aXN0cygkZGlybmFtZSkpOwogICAgJGNyZWF0ZWQgPSBAX2ZpbGVfZXhpc3RzKCRkaXJuYW1lKTsKICAgIGdsb2JhbCAkX19zZXR0aW5nc0luQ29uc3RydWN0b3IsICRfRklMRV9GT1JDRV9GVFAsICRfRElSX0ZPUkNFX0ZUUCwgJF9ESVJfRk9SQ0VfUEhQLCAkX0NPTkZJRzsKICAgIC8vIE5FVyAtIGZpcnN0IHRyeSBieSBGVFAKICAgIAogICAgLy8gbXVzaSBieXQgcHJ2bmkga3Z1bGkgZm9ycHNpLmN6CiAgICBpZiAoISRjcmVhdGVkICYmICgkX0RJUl9GT1JDRV9QSFAgfHwgISRfRElSX0ZPUkNFX0ZUUCB8fCAhKCRfQ09ORklHWyJmdHAiXVsiaG9zdCJdICYmICRfQ09ORklHWyJmdHAiXVsibG9naW4iXSkpICYmICghU0FGRV9NT0RFIHx8IGlzV2luZG93cygpIHx8ICRfX3NldHRpbmdzSW5Db25zdHJ1Y3RvciAvKiB0byBvbW1pdCBsb29wICovIHx8IChvYmplY3RFeGlzdHMoIlNldHRpbmdzIikgJiYgKGdldE9iamVjdCgiU2V0dGluZ3MiKS0+bWtkaXJNZXRob2QgPT0gInBocCIgfHwgZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5ta2Rpck1ldGhvZCA9PSAiIikpKSkKICAgIHsKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIGlmICghJGNyZWF0ZWQpCiAgICAgICAgICAgICRyZXQgPSBAbWtkaXIoJGRpcm5hbWUpOwoKICAgICAgICAvLyRyZXQgPSBfY2htb2QoJGRpcm5hbWUsICRwZXJtaXNzaW9ucyk7CgogICAgICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgIAogICAgICAgICRjcmVhdGVkID0gQF9maWxlX2V4aXN0cygkZGlybmFtZSk7CiAgICB9ICAgIAogICAgCiAgICBpZiAoISRjcmVhdGVkICYmICEkX19zZXR0aW5nc0luQ29uc3RydWN0b3IpCiAgICB7CiAgICAgICAgJHJldCA9IGZhbHNlOwoKICAgICAgICAvLyB0cnkgdG8gY3JlYXRlIGRpcmVjdG9yeSB2aWEgRlRQCiAgICAgICAgZ2xvYmFsICRfQ09ORklHOwogICAgICAgIGlmICgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSAhPSAiIiAmJiAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0gIT0gIiIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29ubl9pZCA9IF9mdHBfY29ubmVjdCgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSwgJF9DT05GSUdbImZ0cCJdWyJsb2dpbiJdLCAkX0NPTkZJR1siZnRwIl1bInBhc3N3b3JkIl0pOwogICAgICAgICAgICAgICAgaWYgKCRjb25uX2lkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRkaXJuYW1lID0gc3RyX3JlcGxhY2UoUFJPSkVDVFBBVEgsICIiLCAkZGlybmFtZSk7CiAgICAgICAgICAgICAgICAgICAgJG5ld0Z0cEZvbGRlciA9ICRfQ09ORklHWyJmdHAiXVsicGF0aCJdLiIvIi4kZGlybmFtZTsKICAgICAgICAgICAgICAgICAgICAkbmV3RnRwRm9sZGVyID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkbmV3RnRwRm9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAkbmV3RnRwRm9sZGVyID0gc3RyX3JlcGxhY2UoIi8vIiwgIi8iLCAkbmV3RnRwRm9sZGVyKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXdGdHBGb2xkZXJbc3RybGVuKCRuZXdGdHBGb2xkZXIpLTFdID09ICIvIikKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0Z0cEZvbGRlciA9IHN1YnN0cigkbmV3RnRwRm9sZGVyLCAwLCBzdHJsZW4oJG5ld0Z0cEZvbGRlciktMSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJG1rZGlyX3Jlc3VsdCA9IEBmdHBfbWtkaXIoJGNvbm5faWQsICRuZXdGdHBGb2xkZXIpOwogICAgICAgICAgICAgICAgICAgIC8vZWNobyAiWCI7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkbWtkaXJfcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKF9maWxlX2V4aXN0cygkZGlybmFtZSkpOwogICAgICAgICAgICAgICAgICAgIC8vZWNobyAiWCI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkbWtkaXJfcmVzdWx0ICYmICFAX2ZpbGVfZXhpc3RzKCRkaXJuYW1lKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEBmdHBfcGFzdigkY29ubl9pZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRta2Rpcl9yZXN1bHQgPSBmdHBfbWtkaXIoJGNvbm5faWQsICRuZXdGdHBGb2xkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkbWtkaXJfZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJG1rZGlyX3Jlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJG1rZGlyX2Vycm9yLCAiZmlsZSBleGlzdHMiKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfQ09ORklHWyJmdHAiXVsicGF0aCJdID09ICIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAiZnRwUGF0aCBpcyBlbXB0eS4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yID0gIm1heWJlIGJhZCBmdHBQYXRoICckbmV3RnRwRm9sZGVyJyAtICIuJG1rZGlyX2Vycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWtkaXJfcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAxOyBleGl0OyAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgLy8gamUgdnl0dm9yZW4gcHJlcyBGVFAsIGFsZSBzeXN0ZW0gamVqIG5lbXVzaSBqZXN0ZSB2aWRldAogICAgICAgICAgICAgICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRta2Rpcl9yZXN1bHQgJiYgIWZpbGVfZXhpc3RzKCRkaXJuYW1lKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIl9ta2RpcigpOiBEaXJlY3RvcnkgJyIuJGRpcm5hbWUuIicgbm90IGNyZWF0ZWQgdXNpbmcgRlRQIChNS0RJUiAnIi4kbmV3RnRwRm9sZGVyLiInKSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJG1rZGlyX2Vycm9yOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLyppZiAoJG1rZGlyX3Jlc3VsdCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgSUlTIEZUUCBzZXJ2ZXIgZG9lcyBub3QgcmVjb2duaXplIENITU9ECiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXR0eXBlKCRwZXJtaXNzaW9ucykgPT0gImludGVnZXIiKSAvLyBvY3RhbCBmb3JtYXQgMDc3NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcm1pc3Npb25zID0gYmFzZV9jb252ZXJ0KCRwZXJtaXNzaW9ucywgMTAsIDgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXR0eXBlKCRwZXJtaXNzaW9ucywgInN0cmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkZnRwX3Jlc3VsdCA9IEBmdHBfc2l0ZSgkY29ubl9pZCwgImNobW9kICIuJHBlcm1pc3Npb25zLiIgJG5ld0Z0cEZvbGRlciIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0cF9yZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkcmV0ID0gJG1rZGlyX3Jlc3VsdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoISRyZXQpCiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICckZGlybmFtZScgaW4gc2FmZV9tb2RlIHVzaW5nIEZUUCBjb25uZWN0aW9uICgiLiRlcnJvci4iKSIsIG10RXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJCdWlsdCBGVFAgQ29ubmVjdGlvbiBmb3IgY3JlYXRpbmcgZGlyZWN0b3JpZXMgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHNlcnZlciIsIG10RXJyb3IpOwogICAgICAgIH0KICAgICAgICAvL2Vsc2UgCiAgICAgICAgLy8gICAgc2hvd01lc3NhZ2UoIkNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICckZGlybmFtZScgaW4gc2FmZV9tb2RlICh0cnkgdG8gc2V0dXAgRlRQIGNvbm5lY3Rpb24pIiwgbXRFcnJvcik7CiAgICAgICAgICAgIAogICAgICAgICRjcmVhdGVkID0gJG1rZGlyX3Jlc3VsdDsKICAgIH0KICAgIC8vdmFyX2R1bXAoJGRpcm5hbWUpOwogICAgLy92YXJfZHVtcCgoISRfRklMRV9GT1JDRV9GVFAgfHwgISgkX0NPTkZJR1siZnRwIl1bImhvc3QiXSAmJiAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0pKSAmJiAhJGNyZWF0ZWQgJiYgKCFTQUZFX01PREUgfHwgaXNXaW5kb3dzKCkgfHwgJF9fc2V0dGluZ3NJbkNvbnN0cnVjdG9yIC8qIHRvIG9tbWl0IGxvb3AgKi8gfHwgKG9iamVjdEV4aXN0cygiU2V0dGluZ3MiKSAmJiAoZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5ta2Rpck1ldGhvZCA9PSAicGhwIiB8fCBnZXRPYmplY3QoIlNldHRpbmdzIiktPm1rZGlyTWV0aG9kID09ICIiKSkpKTsKCiAgICBfY2htb2QoJF9kaXJuYW1lLCAkcGVybWlzc2lvbnMpOwoKICAgIGlmIChDSE9XTl9QSFAgJiYgZ2V0RmlsZUV4dCgkZmlsZU5hbWUpID09ICJwaHAiKQogICAgewogICAgICAgIGNob3duKCRfZGlybmFtZSwgQ0hPV05fUEhQKTsKICAgIH0KICAgIGVsc2UgaWYgKENIT1dOX0RFRkFVTFQpCiAgICB7CiAgICAgICAgY2hvd24oJF9kaXJuYW1lLCBDSE9XTl9ERUZBVUxUKTsKICAgIH0KCiAgICBpZiAoRkFMU0UgJiYgJGNyZWF0ZUluZGV4ICYmIF9maWxlX2V4aXN0cygkX2Rpcm5hbWUpKQogICAgICAgIEBfZmlsZV9wdXRfY29udGVudHMoJF9kaXJuYW1lLiIvaW5kZXgucGhwIiwgX2ZpbGVfZ2V0X2NvbnRlbnRzKENPUkVQQVRILiJjb3JlL2luZGV4LnBocCIpKTsKCiAgICBzdG9wRmlsZSgkZGlybmFtZSwgIm1rZGlyIik7CiAgICByZXR1cm4oJHJldCk7Cn0KCmZ1bmN0aW9uIF9jaG1vZCgkZmlsZW5hbWUsICRwZXJtaXNzaW9ucz1DSE1PRF9XUklURSwgJHNpbGVudD1mYWxzZSkKewogICAgJGZpbGVOYW1lID0gZ2V0U3ltbGlua0ZpbGUoJGZpbGVuYW1lKTsKCiAgICBpZiAoaXNXaW5kb3dzKCkpCiAgICAgICAgcmV0dXJuKHRydWUpOwoKICAgIGlmIChkZWZpbmVkKCJPRkZMSU5FX1JFQURPTkxZIikgJiYgT0ZGTElORV9SRUFET05MWSkKICAgICAgICByZXR1cm4oZmFsc2UpOwoKICAgIGlmICgkcGVybWlzc2lvbnMgPT0gMDQyMCkKICAgIHsKICAgICAgICBzaG93TWVzc2FnZSgiQkFEIFBFUk1JU1NJT05TISA0MjAiLCBtdEVycm9yKTsKICAgICAgICAkcGVybWlzc2lvbnMgPSAwNjQ0OwogICAgfQogICAgaWYgKCRwZXJtaXNzaW9ucyA9PSAiMDAwNCIpCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoIkJBRCBQRVJNSVNTSU9OUyEgMDA0IiwgbXRFcnJvcik7CiAgICAgICAgJHBlcm1pc3Npb25zID0gMDc1NTsKICAgIH0KICAgICAgICAKICAgIHN0YXJ0RmlsZSgkZmlsZW5hbWUsICJjaG1vZCIpOwogICAgaWYgKCFAX2ZpbGVfZXhpc3RzKCRmaWxlbmFtZSkpCiAgICB7CiAgICAgICAgaWYgKCEkc2lsZW50KQogICAgICAgIHsKICAgICAgICAgICAgc2hvd01lc3NhZ2UoIl9jaG1vZCgkZmlsZW5hbWUpIC0gZmlsZSBkb2VzIG5vdCBleGlzdCIsIG10V2FybmluZyk7CiAgICAgICAgICAgIHN0b3BGaWxlKCRmaWxlbmFtZSwgImNobW9kIik7CiAgICAgICAgfQogICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9ICAgICAgICAKCiAgICAkbW9kID0gZ2V0bW9kKCRmaWxlbmFtZSk7CiAgICBpZiAoJG1vZCA9PSAkcGVybWlzc2lvbnMpCiAgICB7CiAgICAgICAgc3RvcEZpbGUoJGZpbGVuYW1lLCAiY2htb2QiKTsKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CgogICAgZ2xvYmFsICRfX3NldHRpbmdzSW5Db25zdHJ1Y3RvcjsKICAgIGlmICh0cnVlIC8qIHx8IGluaV9nZXQoInNhZmVfbW9kZSIpICE9ICIxIiovKQogICAgewogICAgICAgIC8vIHRyeSB0byBjaG1vZCBub3JtYWxseQogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgJHJldCA9IGNobW9kKCRmaWxlbmFtZSwgJHBlcm1pc3Npb25zKTsKICAgICAgICAkZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAKICAgICAgICBpZiAoKCRlcnJvciB8fCAkcmV0ID09PSBGQUxTRSkgJiYgISRzaWxlbnQgJiYgISRfX3NldHRpbmdzSW5Db25zdHJ1Y3RvcikKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRyeSB0byBjcmVhdGUgZGlyZWN0b3J5IHZpYSBGVFAKICAgICAgICAgICAgZ2xvYmFsICRfQ09ORklHOwogICAgICAgICAgICBpZiAoJF9DT05GSUdbImZ0cCJdWyJob3N0Il0gIT0gIiIgJiYgJF9DT05GSUdbImZ0cCJdWyJsb2dpbiJdICE9ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRjb25uX2lkID0gX2Z0cF9jb25uZWN0KCRfQ09ORklHWyJmdHAiXVsiaG9zdCJdLCAkX0NPTkZJR1siZnRwIl1bImxvZ2luIl0sICRfQ09ORklHWyJmdHAiXVsicGFzc3dvcmQiXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRjb25uX2lkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lID0gc3RyX3JlcGxhY2UoUFJPSkVDVFBBVEgsICIiLCAkZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkZnRwRmlsZSA9ICRfQ09ORklHWyJmdHAiXVsicGF0aCJdLiIvIi4kZmlsZW5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGaWxlID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkZnRwRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmdHBGaWxlID0gc3RyX3JlcGxhY2UoIi8vIiwgIi8iLCAkZnRwRmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0cEZpbGVbc3RybGVuKCRmdHBGaWxlKS0xXSA9PSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwRmlsZSA9IHN1YnN0cigkZnRwRmlsZSwgMCwgc3RybGVuKCRmdHBGaWxlKS0xKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgSUlTIEZUUCBzZXJ2ZXIgZG9lcyBub3QgcmVjb2duaXplIENITU9ECiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCItLS0tIik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZ2V0dHlwZSgkcGVybWlzc2lvbnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dHlwZSgkcGVybWlzc2lvbnMpID09ICJpbnRlZ2VyIikgLy8gb2N0YWwgZm9ybWF0IDA3NzcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwZXJtaXNzaW9ucyA9IGJhc2VfY29udmVydCgkcGVybWlzc2lvbnMsIDEwLCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dHlwZSgkcGVybWlzc2lvbnMsICJzdHJpbmciKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwZXJtaXNzaW9ucyA9PSAiNDIwIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkJBRCBGVFAgUEVSTUlTU0lPTlMhIDQyMCIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcm1pc3Npb25zID0gIjY0NCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwZXJtaXNzaW9ucyA9PSAiMDA0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkJBRCBGVFAgUEVSTUlTU0lPTlMhIDAwNCIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcm1pc3Npb25zID0gIjc1NSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyRwZXJtaXNzaW9ucyA9IG9jdGRlYygkcGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChJTlNUQUxMUFJPQ0VTUyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZWNobyAiY2htb2QgIi4kcGVybWlzc2lvbnMuIiAkZnRwRmlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICRmdHBfcmVzdWx0ID0gQGZ0cF9zaXRlKCRjb25uX2lkLCAiY2htb2QgIi4kcGVybWlzc2lvbnMuIiAkZnRwRmlsZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0cF9yZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkc2lsZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yID0gIlVuYWJsZSB0byBjb25uZWN0IHRvIGxvY2FsIEZUUCI7ICAgCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoISRyZXQgJiYgISRzaWxlbnQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiQ2Fubm90IGNoYW5nZSBjaG1vZCAiLiRwZXJtaXNzaW9ucy4iIGZvciAnIi4kZmlsZW5hbWUuIicgaW4gc2FmZV9tb2RlIHVzaW5nIEZUUCBjb25uZWN0aW9uICgiLigkZXJyb3IgPyAkZXJyb3IgOiAidW5rbm93biBlcnJvciIpLiIpIiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoISRzaWxlbnQpCiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiQ2Fubm90IGNobW9kICciLiRmaWxlbmFtZS4iJy4gQnVpbHQgRlRQIENvbm5lY3Rpb24gZm9yIGNobW9kIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzZXJ2ZXIiLCBtdFdhcm5pbmcpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBzdG9wRmlsZSgkZmlsZW5hbWUsICJjaG1vZCIpOwogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoISRzaWxlbnQpCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiRXJyb3I6IGNhbm5vdCBjaG1vZCBpbiBzYWZlX21vZGUiLCBtdEVycm9yKTsKICAgICAgICB9CiAgICAgICAgc3RvcEZpbGUoJGZpbGVuYW1lLCAiY2htb2QiKTsKICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQp9CiAgICAKZnVuY3Rpb24gdG9BYnNvbHV0ZVBhdGgoJHBhdGgpCnsKICAgIGlmIChzdHJwb3MoJHBhdGgsIFBST0pFQ1RQQVRIKSA9PT0gMCkgICAgCiAgICAgICAgcmV0dXJuKCRwYXRoKTsKICAgICAgICAKICAgIGlmICgkcGF0aFtzdHJsZW4oJHBhdGgpLTFdID09ICIvIikKICAgICAgICAkcGF0aCA9IGNsZWFuTGluayhQUk9KRUNUUEFUSC5zdWJzdHIoJHBhdGgsIDAsIHN0cmxlbigkcGF0aCktMSkpOwogICAgZWxzZSAgICAKICAgICAgICAvLyRwYXRoID0gY2xlYW5MaW5rKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5LyIuc3Vic3RyKCRwYXRoLCAwLCBzdHJsZW4oJHBhdGgpLTEpKTsKICAgICAgICAkcGF0aCA9IGNsZWFuTGluayhQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS8iLiRwYXRoKTsKICAgICAgICAKICAgIHJldHVybigkcGF0aCk7Cn0KICAgIApmdW5jdGlvbiBmaW5kRGlyKCRmaWxlLCAkZGlycz1hcnJheSgpLCAkZGVmYXVsdERpcnM9dHJ1ZSkKewogICAgcmV0dXJuKGZpbmRGaWxlKCRmaWxlLCAkZGlycywgJGRlZmF1bHREaXJzLCB0cnVlKSk7Cn0gICAgCgpmdW5jdGlvbiBmaW5kRmlsZSgkZmlsZSwgJGRpcnM9YXJyYXkoKSwgJGRlZmF1bHREaXJzPXRydWUsICRkaXJzT25seT1mYWxzZSkKewogICAgaWYgKCEkZmlsZSkKICAgICAgICByZXR1cm4oIiIpOwogICAgCiAgICBzdGFydFByb2ZpbGUoImZpbmRGaWxlKCkiKTsKICAgICRkaXJzID0gZXhwbG9kZUxpc3QoJGRpcnMpOwogICAgCiAgICBpZiAoaXNfYXJyYXkoJGZpbGUpICYmICRmaWxlWyJ0bXBfbmFtZSJdKQogICAgICAgICRmaWxlID0gJGZpbGVbInRtcF9uYW1lIl07CiAgICAKICAgIGlmIChzdHJwb3MoJGZpbGUsICJodHRwOi8vIikgPT09IDAgfHwgc3RycG9zKCRmaWxlLCAiaHR0cHM6Ly8iKSA9PT0gMCkKICAgIHsKICAgICAgICBzdG9wUHJvZmlsZSgiZmluZEZpbGUoKSIpOwogICAgICAgIHJldHVybigkZmlsZSk7CiAgICB9CgogICAgaWYgKHN0cnBvcygkZmlsZSwgImZpbGU6Ly8iKSA9PT0gMCkKICAgICAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCJmaWxlOi8vIiwgIiIsICRmaWxlKTsKCiAgICBpZiAoJGZpbGVbc3RybGVuKCRmaWxlKS0xXSA9PSAiLyIpCiAgICAgICAgJGZpbGUgPSBzdWJzdHIoJGZpbGUsIDAsIHN0cmxlbigkZmlsZSktMSk7CiAgICAKICAgIC8vdmFyX2R1bXAoJGZpbGUpOwogICAgLy8gRE8gTk9UIFVTRSBfZmlsZV9leGlzdHMKICAgIG9iX3N0YXJ0KCk7CiAgICBpZiAoKGZpbGVfZXhpc3RzKCRmaWxlKSB8fCBpc19saW5rKCRmaWxlKSkgJiYgISRkaXJPbmx5IHx8IGlzX2RpcigkZmlsZSkpCiAgICB7CiAgICAgICAgaWYgKGlzX2xpbmsoJGZpbGUpKQogICAgICAgICAgICAkcmV0ID0gY2xlYW5MaW5rKCRmaWxlKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRyZXQgPSBjbGVhbkxpbmsocmVhbHBhdGgoJGZpbGUpKTsKICAgIH0KICAgICRlcnJvcnMgPSBvYl9nZXRfY29udGVudHMoKTsKICAgIG9iX2VuZF9jbGVhbigpOwogICAgaWYgKCRlcnJvcnMpCiAgICAgICAgc2hvd01lc3NhZ2UoJGVycm9ycywgbXRXYXJuaW5nKTsKICAgICAgICAKICAgIGlmICgkcmV0KQogICAgewogICAgICAgIHN0b3BQcm9maWxlKCJmaW5kRmlsZSgpIik7CiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQoKCiAgICAkX2RpcnMgPSBhcnJheSgpOwogICAgaWYgKCEkZGlycyB8fCAkZGVmYXVsdERpcnMpCiAgICB7CiAgICAgICAgJF9kaXJzW10gPSBQUk9KRUNUUEFUSDsKICAgICAgICAkX2RpcnNbXSA9IFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5LyI7CiAgICB9CgogICAgZm9yZWFjaCgkZGlycyBhcyAkZGlyKQogICAgewogICAgICAgIGlmIChzdHJpcG9zKCRkaXIsIFBST0pFQ1RQQVRIKSAhPT0gMCkKICAgICAgICAgICAgJF9kaXJzW10gPSBQUk9KRUNUUEFUSC4kZGlyOwogICAgfQogICAgCiAgICBmb3JlYWNoKCRfZGlycyBhcyAkZGlyKQogICAgewogICAgICAgIC8vZHVtcCgkZGlyLiIvIi4kZmlsZSk7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBpZiAoKGZpbGVfZXhpc3RzKCRkaXIuIi8iLiRmaWxlKSB8fCBpc19saW5rKCRkaXIuIi8iLiRmaWxlKSkgJiYgISRkaXJPbmx5IHx8IGlzX2RpcigkZmlsZSkpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoIkZPVU5EIik7CiAgICAgICAgICAgICRyZXQgPSBjbGVhbkxpbmsocmVhbHBhdGgoJGRpcikuIi8iLiRmaWxlKTsKICAgICAgICB9CiAgICAgICAgJGVycm9ycyA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgIGlmICgkZXJyb3JzKQogICAgICAgICAgICBzaG93TWVzc2FnZSgkZXJyb3JzLCBtdFdhcm5pbmcpOwogICAgICAgIAogICAgICAgIGlmICgkcmV0KQogICAgICAgIHsKICAgICAgICAgICAgc3RvcFByb2ZpbGUoImZpbmRGaWxlKCkiKTsKICAgICAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgc3RvcFByb2ZpbGUoImZpbmRGaWxlKCkiKTsKICAgIHJldHVybihOVUxMKTsKfQoKZnVuY3Rpb24gX2NvcHkoJGZyb21GaWxlLCAkdG9GaWxlLCAmJGZpbGVDaGFuZ2VkPWZhbHNlKQp7CiAgICAkZnJvbUZpbGUgPSBnZXRTeW1saW5rRmlsZSgkZnJvbUZpbGUpOwogICAgCiAgICBzdGFydEZpbGUoJGZyb21GaWxlLCAiY29weSIpOwogICAgCiAgICBpZiAoVEpTT046OmlzSlNPTigkZnJvbUZpbGUpKQogICAgICAgICRmcm9tRmlsZSA9IFRKU09OOjpkZWNvZGUoJGZyb21GaWxlKTsKICAgIAogICAgLy92YXJfZHVtcCgkZnJvbUZpbGUpOwogICAgLy92YXJfZHVtcCgkdG9GaWxlKTsKICAgIGlmIChpc19hcnJheSgkZnJvbUZpbGUpKQogICAgewogICAgICAgIF91bmxpbmsoJHRvRmlsZSk7CiAgICAgICAgaWYgKCRmcm9tRmlsZVsidG1wX25hbWUiXSkKICAgICAgICB7CiAgICAgICAgICAgIEBfY29weSgkZnJvbUZpbGVbInRtcF9uYW1lIl0sICR0b0ZpbGUpOwogICAgICAgICAgICBpZiAoIV9maWxlX2V4aXN0cygkdG9GaWxlKSkKICAgICAgICAgICAgICAgIG1vdmVfdXBsb2FkZWRfZmlsZSgkZnJvbUZpbGVbInRtcF9uYW1lIl0sICR0b0ZpbGUpOwogICAgICAgICAgICAkZmlsZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAvL3Zhcl9kdW1wKF9maWxlX2V4aXN0cygkdG9GaWxlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCRmcm9tRmlsZVsiZGF0YSJdICYmIGlzQmFzZTY0KCRmcm9tRmlsZVsiZGF0YSJdKSkKICAgICAgICB7CiAgICAgICAgICAgICRjb250ZW50ID0gYmFzZTY0X2RlY29kZSgkZnJvbUZpbGVbImRhdGEiXSk7CiAgICAgICAgICAgIGlmICgkY29udGVudCAhPSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3VubGluaygkdG9GaWxlKTsKICAgICAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdG9GaWxlLCAkY29udGVudCwgMDc3Nyk7CiAgICAgICAgICAgICAgICAkZmlsZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCRmcm9tRmlsZVsidXJsIl0pCiAgICAgICAgewogICAgICAgICAgICAkY29udGVudCA9IGRvd25sb2FkKCRmcm9tRmlsZVsidXJsIl0pOwogICAgICAgICAgICAvL2VjaG8gJGNvbnRlbnQ7ZXhpdDsKICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGNvbnRlbnQsICJub3QgZm91bmQiKSA9PT0gRkFMU0UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF91bmxpbmsoJHRvRmlsZSk7CiAgICAgICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJHRvRmlsZSwgJGNvbnRlbnQsIDA3NzcpOwogICAgICAgICAgICAgICAgJGZpbGVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgICAgIC8vIGNyZWF0ZXMgemVyb2xlbmd0aAogICAgICAgIC8vaWYgKCRmcm9tRmlsZVsidG1wX25hbWUiXSkKICAgICAgICAvLyAgICBtb3ZlX3VwbG9hZGVkX2ZpbGUoJHZhbHVlWyJ0bXBfbmFtZSJdLCAkdG9GaWxlKTsKICAgIH0KICAgIGVsc2UgaWYgKHN0cnBvcygkZnJvbUZpbGUsICJmaWxlOi8vIikgPT09IDApCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkZnJvbUZpbGUpOwogICAgICAgICRmcm9tRmlsZSA9IGZpbmRGaWxlKHN1YnN0cigkZnJvbUZpbGUsIDcsIHN0cmxlbigkZnJvbUZpbGUpKSk7CiAgICAgICAgLy92YXJfZHVtcCgkZnJvbUZpbGUpOwogICAgICAgIGlmICgkZnJvbUZpbGUgIT0gJHRvRmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIF91bmxpbmsoJHRvRmlsZSk7CiAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdG9GaWxlLCAiIiwgMDc3Nyk7IC8vIHRvIGVuYWJsZSB3cml0aW5nIGZvciBpbm5lciBQSFAgZnVuY3Rpb25zCiAgICAgICAgICAgIF9jb3B5KCRmcm9tRmlsZSwgJHRvRmlsZSk7CiAgICAgICAgICAgICRmaWxlQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoc3RycG9zKCRmcm9tRmlsZSwgImh0dHA6Ly8iKSA9PT0gMCB8fCBzdHJwb3MoJGZyb21GaWxlLCAiaHR0cHM6Ly8iKSA9PT0gMCkKICAgIHsKICAgICAgICAvL2VjaG8gIlgiOwogICAgICAgIC8vdmFyX2R1bXAoJGZyb21GaWxlKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgJGNvbnRlbnQgPSBkb3dubG9hZCgkZnJvbUZpbGUpOwogICAgICAgIC8vZWNobyAkY29udGVudDtleGl0OwogICAgICAgIGlmIChzdHJpcG9zKCRjb250ZW50LCAibm90IGZvdW5kIikgPT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgX3VubGluaygkdG9GaWxlKTsKICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0b0ZpbGUsICRjb250ZW50LCAwNzc3KTsKICAgICAgICAgICAgJGZpbGVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoJGZyb21GaWxlKSkKICAgICAgICAgICAgJGZyb21GaWxlID0gZmluZEZpbGUoJGZyb21GaWxlKTsKICAgICAgICBpZiAoJGZyb21GaWxlICYmICRmcm9tRmlsZSAhPSAkdG9GaWxlKQogICAgICAgIHsKICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0b0ZpbGUsICIiLCAwNzc3KTsgLy8gdG8gZW5hYmxlIHdyaXRpbmcgZm9yIGlubmVyIFBIUCBmdW5jdGlvbnMKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRvZXNuJ3Qgd29yayBzb21ld2hlcmUKICAgICAgICAgICAgLy8gT04gQklHIEZJTEVTID4yR0IgV0UgTkVFRCBUTyBjb3B5IGJ5IHBhcnRzCiAgICAgICAgICAgIC8vY29weSgkZnJvbUZpbGUsICR0b0ZpbGUpOwogICAgICAgICAgICAkYnVmZmVyU2l6ZSA9IDEwNDg1NzY7CiAgICAgICAgICAgICRieXRlcyA9IDA7CiAgICAgICAgICAgICRmaW4gPSBmb3BlbigkZnJvbUZpbGUsICJyYiIpOwogICAgICAgICAgICAkZm91dCA9IGZvcGVuKCR0b0ZpbGUsICJ3Iik7CiAgICAgICAgICAgIHdoaWxlKCFmZW9mKCRmaW4pKSB7CiAgICAgICAgICAgICAgICAkYnl0ZXMgKz0gZndyaXRlKCRmb3V0LCBmcmVhZCgkZmluLCAkYnVmZmVyU2l6ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZjbG9zZSgkZmluKTsKICAgICAgICAgICAgZmNsb3NlKCRmb3V0KTsKICAgIAogICAgICAgICAgICBpZiAoJGJ5dGVzICE9IF9maWxlc2l6ZSgkZnJvbUZpbGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiX2NvcHkoKTogZmlsZSBzaXplIGNvcGllZCBkb2VzIG5vdCBtYXRjaCIsIG10RXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkZmlsZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9fZmlsZV9wdXRfY29udGVudHMoJHRvRmlsZSwgX2ZpbGVfZ2V0X2NvbnRlbnRzKCRmcm9tRmlsZSkpOyAvLyB0byBlbmFibGUgd3JpdGluZyBmb3IgaW5uZXIgUEhQIGZ1bmN0aW9ucwogICAgICAgIH0KICAgIH0KICAgIAogICAgJHJldCA9IF9maWxlX2V4aXN0cygkdG9GaWxlKTsKICAgIHN0b3BGaWxlKCRmcm9tRmlsZSwgImNvcHkiKTsKICAgIHJldHVybigkcmV0KTsKfQoKJF9faXNEaXIgPSBhcnJheSgpOwpmdW5jdGlvbiBfaXNfZGlyKCRmaWxlKQp7CiAgICAkZmlsZSA9IGdldFN5bWxpbmtGaWxlKCRmaWxlKTsKCiAgICAvL3N0YXJ0UHJvZmlsZSgiX2lzX2RpciIpOwogICAgLy8gb3B0aW1pemF0aW9uCiAgICBnbG9iYWwgJF9faXNEaXI7CiAgICBpZiAoaXNzZXQoJF9faXNEaXJbJGZpbGVdKSkKICAgICAgICAkcmV0ID0gJF9faXNEaXJbJGZpbGVdOwogICAgZWxzZQogICAgewogICAgICAgIHN0YXJ0RmlsZSgkZmlsZSwgImlzZGlyIik7CiAgICAgICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7CgogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgJHJldCA9IGlzX2RpcigkZmlsZSk7CiAgICAgICAgJGVycm9yID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgLy92YXJfZHVtcCgkcmV0KTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRlcnJvcikKICAgICAgICAgICAgc2hvd01lc3NhZ2UoJGVycm9yLCBtdFdhcm5pbmcpOwoKICAgICAgICBzdG9wRmlsZSgkZmlsZSwgImlzZGlyIik7CiAgICAgICAgCiAgICAgICAgJF9faXNEaXJbJGZpbGVdID0gJHJldDsKICAgIH0gICAgCiAgICAvL3N0b3BQcm9maWxlKCJfaXNfZGlyIik7CiAgICByZXR1cm4oJHJldCk7Cn0KCiRfX2lzX2ZpbGVfY2FjaGUgPSBhcnJheSgpOwpmdW5jdGlvbiBfaXNfZmlsZSgkZmlsZSwgJGNhY2hlPWZhbHNlKQp7CiAgICBnbG9iYWwgJF9faXNfZmlsZV9jYWNoZTsKICAgIAogICAgaWYgKCRjYWNoZSAmJiBpc3NldCgkX19pc19maWxlX2NhY2hlWyRmaWxlXSkpCiAgICAgICAgcmV0dXJuKCRfX2lzX2ZpbGVfY2FjaGVbJGZpbGVdKTsKCiAgICAkZmlsZSA9IGdldFN5bWxpbmtGaWxlKCRmaWxlKTsKCiAgICBzdGFydEZpbGUoJGZpbGUsICJpc2ZpbGUiKTsKICAgICRyZXQgPSBpc19maWxlKCRmaWxlKTsKICAgIHN0b3BGaWxlKCRmaWxlLCAiaXNmaWxlIik7CiAgICAKICAgIGlmICgkY2FjaGUpCiAgICAgICAgJF9faXNfZmlsZV9jYWNoZVskZmlsZV0gPSAkcmV0OwogICAgCiAgICByZXR1cm4oJHJldCk7Cn0KCmZ1bmN0aW9uIGNsZWFyRmlsZUNhY2hlKCRmaWxlPU5VTEwpCnsKICAgIGdsb2JhbCAkX19pc19maWxlX2NhY2hlOwogICAgCiAgICBpZiAoJGZpbGUpICAgIAogICAgICAgIHVuc2V0KCRfX2lzX2ZpbGVfY2FjaGVbJGZpbGVdKTsKICAgIGVsc2UKICAgICAgICAkX19pc19maWxlX2NhY2hlID0gYXJyYXkoKTsKfQogICAgLyoKJF9faXNGaWxlID0gYXJyYXkoKTsKZnVuY3Rpb24gX2lzX2ZpbGUoJGZpbGUpCnsKICAgIGdsb2JhbCAkX19pc0ZpbGU7CiAgICBpZiAoaXNzZXQoJF9faXNGaWxlWyRmaWxlXSkpCiAgICAgICAgJHJldCA9ICRfX2lzRmlsZVskZmlsZV07CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RhcnRGaWxlKCRmaWxlLCAiaXNmaWxlIik7CiAgICAgICAgJHJldCA9IGlzX2ZpbGUoJGZpbGUpOwogICAgICAgIHN0b3BGaWxlKCRmaWxlLCAiaXNmaWxlIik7CiAgICAgICAgCiAgICAgICAgJF9faXNGaWxlWyRmaWxlXSA9ICRyZXQ7CiAgICB9ICAgIAogICAgcmV0dXJuKCRyZXQpOwp9CiovCgpmdW5jdGlvbiBfZmlsZW10aW1lKCRmaWxlKQp7CiAgICAkZmlsZSA9IGdldFN5bWxpbmtGaWxlKCRmaWxlKTsKCiAgICAvL3N0YXJ0UHJvZmlsZSgiX2ZpbGVtdGltZSIpOwoKICAgIHN0YXJ0RmlsZSgkZmlsZSwgImZpbGVtdGltZSIpOwogICAgJHJldCA9IGZpbGVtdGltZSgkZmlsZSk7CiAgICBzdG9wRmlsZSgkZmlsZSwgImZpbGVtdGltZSIpOwogICAgCiAgICByZXR1cm4oJHJldCk7Cn0KCmZ1bmN0aW9uIF9faW5jbHVkZV9vbmNlKCRmaWxlKQp7CiAgICBzdGFydEZpbGUoJGZpbGUsICJpbmNsdWRlIik7CiAgICBpbmNsdWRlX29uY2UoJGZpbGUpOwogICAgc3RvcEZpbGUoJGZpbGUsICJpbmNsdWRlIik7Cn0KZnVuY3Rpb24gX19pbmNsdWRlKCRmaWxlKQp7CiAgICBzdGFydEZpbGUoJGZpbGUsICJpbmNsdWRlIik7CiAgICBpbmNsdWRlKCRmaWxlKTsKICAgIHN0b3BGaWxlKCRmaWxlLCAiaW5jbHVkZSIpOwp9CgpmdW5jdGlvbiBoYXNGaWxlcygkZGlyKQp7CiAgICAkcmV0ID0gZmFsc2U7CiAgICAkX2RpciA9IEBvcGVuZGlyKCRkaXIpOwogICAgd2hpbGUoJF9maWxlID0gQHJlYWRkaXIoJF9kaXIpKQogICAgewogICAgICAgIGlmICgkX2ZpbGUgIT0gIi4iICYmICRfZmlsZSAhPSAiLi4iKQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIEBjbG9zZWRpcigkX2Rpcik7CiAgICAKICAgIHJldHVybigkcmV0KTsKfQoKZnVuY3Rpb24gaGFzRGlycygkZGlyKQp7CiAgICAvL2VjaG8gJGRpcjsKICAgICRkaXJzID0gX2dsb2IoJGRpci4iLyoiLCBHTE9CX0RJUlMpOwogICAgLy92YXJfZHVtcCgkZGlycyk7CiAgICAvL2V4aXQ7CiAgICAKICAgIHJldHVybihjb3VudCgkZGlycykgPiAwKTsKfQoKZnVuY3Rpb24gX3N5bWxpbmsoJHRhcmdldCwgJGxpbmspCnsKICAgIC8vdmFyX2R1bXAoaW5fYXJyYXkoInN5bWxpbmsiLCBleHBsb2RlKCIsIiwgaW5pX2dldCgiZGlzYWJsZV9mdW5jdGlvbnMiKSkpKTsKICAgIC8vdmFyX2R1bXAoJHRhcmdldCk7CiAgICAvL3Zhcl9kdW1wKCRsaW5rKTsKICAgIC8vZXhpdDsKICAgIGlmIChpbl9hcnJheSgic3ltbGluayIsIGV4cGxvZGUoIiwiLCBpbmlfZ2V0KCJkaXNhYmxlX2Z1bmN0aW9ucyIpKSkpCiAgICB7CiAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCRsaW5rLiIubG5rIiwgJHRhcmdldCk7CiAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybihzeW1saW5rKCR0YXJnZXQsICRsaW5rKSk7Cn0KCmZ1bmN0aW9uIF9pc19saW5rKCRmaWxlbmFtZSkKewogICAgaWYgKF9maWxlX2V4aXN0cygkZmlsZW5hbWUpKQogICAgICAgIHJldHVybihpc19saW5rKCRmaWxlbmFtZSkpOwogICAgZWxzZQogICAgICAgIHJldHVybihmaWxlX2V4aXN0cygkZmlsZW5hbWUuIi5sbmsiKSk7Cn0KCmZ1bmN0aW9uIGdldE1heFVwbG9hZEZpbGVTaXplKCkKewogICAgJHVwbG9hZFNpemUgPSBwYXJzZUJ5dGVzKGluaV9nZXQoInVwbG9hZF9tYXhfZmlsZXNpemUiKSk7CiAgICAkcG9zdFNpemUgPSBwYXJzZUJ5dGVzKGluaV9nZXQoInBvc3RfbWF4X3NpemUiKSk7CiAgICAKICAgIHJldHVybihtaW4oJHVwbG9hZFNpemUsICRwb3N0U2l6ZSkpOwp9CgpmdW5jdGlvbiBnZXRTYWZlRmlsZU5hbWUoJG5hbWUpCnsKICAgICRuYW1lID0gdXJsZGVjb2RlKCRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIiAiLCAiXyIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIi8iLCAiXyIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIiwiLCAiLiIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIjoiLCAiXyIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIjsiLCAiXyIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIioiLCAiIiwgJG5hbWUpOwogICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiPyIsICIiLCAkbmFtZSk7CiAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCImIiwgIiIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIlwiIiwgIiIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIjwiLCAiIiwgJG5hbWUpOwogICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiPiIsICIiLCAkbmFtZSk7CiAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCJ8IiwgIiIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIj0iLCAiLSIsICRuYW1lKTsKICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIiUiLCAiIiwgJG5hbWUpOwogICAgJG5hbWUgPSByZXBsYWNlQWNjZW50Q2hhcnMoJG5hbWUpOwogICAgLy8gbmVzbWltIC0gdnl1eml2YSBzZSBpIHBybyBjdGVuaSBhIHpvYnJhemVuaSBzb3Vib3J1IGEgbXV6ZSBieXQgcyBwcmlwb25vdSBKUEcgbmVibyBzY2h2YWxuZSBVcHBlcmNhc2UKICAgIC8vJG5hbWUgPSBfc3RydG9sb3dlcigkbmFtZSk7CiAgICAkbmFtZSA9IF9pY29udigiVVRGLTgiLCAiQVNDSUkiLCAkbmFtZSk7CiAgICAKICAgIHJldHVybigkbmFtZSk7Cn0KCmZ1bmN0aW9uIGdldENvbnRlbnRUeXBlKCRmaWxlKQp7CiAgICBpZiAoc3RycG9zKCRmaWxlLCAiLiIpICE9PSBGQUxTRSkKICAgICAgICAkZXh0ID0gX3N0cnRvbG93ZXIoZ2V0RmlsZUV4dCgkZmlsZSkpOyAgICAgICAgCiAgICBlbHNlCiAgICAgICAgJGV4dCA9IF9zdHJ0b2xvd2VyKCRmaWxlKTsKICAgICAgICAKICAgICRjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwogICAgaWYgKCRleHQgPT0gImRvYyIgfHwgJGV4dCA9PSAiZG9jeCIpCiAgICAgICAgJGNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL21zd29yZCI7CiAgICBpZiAoJGV4dCA9PSAieGxzIiB8fCAkZXh0ID09ICJ4bHN4IikKICAgICAgICAkY29udGVudFR5cGUgPSAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIjsKICAgIGlmICgkZXh0ID09ICJwZGYiKQogICAgICAgICRjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9wZGYiOwogICAgICAgIAogICAgcmV0dXJuKCRjb250ZW50VHlwZSk7Cn0KCmZ1bmN0aW9uIHNlbmRGaWxlQ29udGVudElubGluZSgkY29udGVudCwgJG5hbWU9IiIpCnsKICAgIHJldHVybihzZW5kRmlsZUNvbnRlbnQoJGNvbnRlbnQsICRuYW1lLCB0cnVlKSk7Cn0KCgpmdW5jdGlvbiBzZW5kRmlsZUNvbnRlbnQoJGNvbnRlbnQsICRuYW1lPSIiLCAkaW5saW5lPWZhbHNlKQp7CiAgICAkY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgkbmFtZSk7CiAgICAKICAgICRuYW1lID0gZ2V0U2FmZUZpbGVOYW1lKCRuYW1lKTsKICAgIAogICAgZm9yICgkaSA9IDAgOyAkaSA8IDEwIDsgJGkrKykKICAgICAgICBvYl9lbmRfY2xlYW4oKTsKCiAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogIi4kY29udGVudFR5cGUuIjsgY2hhcnNldD11dGYtOCIpOwogICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiAiLigkaW5saW5lID8gImlubGluZSIgOiAiYXR0YWNobWVudCIpLiI7IGZpbGVuYW1lPSIuJG5hbWUpOwogICAgaGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkiKTsKICAgIGhlYWRlcigiQ29udGVudC1MZW5ndGg6ICIuc3RybGVuKCRjb250ZW50KSk7CiAgICAgICAgCiAgICAvLyBrdnVsaSBJRTYKICAgIGhlYWRlcigiUHJhZ21hOiBjYWNoZSIpOwogICAgaGVhZGVyKCJDYWNoZS1Db250cm9sOiBwcml2YXRlIik7CiAgICBoZWFkZXIoIkV4cGlyZXM6IDAiKTsKICAgIAogICAgZWNobyAkY29udGVudDsKICAgIGV4aXQ7ICAgIAp9CgpmdW5jdGlvbiBzZW5kRmlsZUlubGluZSgkZmlsZSwgJG5hbWU9IiIsICRzYWZlRmlsZU5hbWU9dHJ1ZSkKewogICAgcmV0dXJuKHNlbmRGaWxlKCRmaWxlLCAkbmFtZSwgJHNhZmVGaWxlTmFtZSwgdHJ1ZSkpOwp9CgpmdW5jdGlvbiBzZW5kRmlsZSgkZmlsZSwgJG5hbWU9IiIsICRzYWZlRmlsZU5hbWU9dHJ1ZSwgJGlubGluZT1mYWxzZSkKewogICAgJGZpbGUgPSBmaW5kRmlsZSgkZmlsZSk7CiAgICAKICAgIGlmIChfZmlsZV9leGlzdHMoJGZpbGUpKQogICAgewogICAgICAgICRjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKCRmaWxlKTsgICAgICAgIAogICAgICAgICAgICAKICAgICAgICBpZiAoISRuYW1lKQogICAgICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRmaWxlKTsKCiAgICAgICAgaWYgKCRzYWZlRmlsZU5hbWUpCiAgICAgICAgICAgICRuYW1lID0gZ2V0U2FmZUZpbGVOYW1lKCRuYW1lKTsKICAgICAgICAKICAgICAgICBmb3IgKCRpID0gMCA7ICRpIDwgMTAgOyAkaSsrKQogICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAgICAgCiAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6ICIuJGNvbnRlbnRUeXBlLiI7IGNoYXJzZXQ9dXRmLTgiKTsKICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246ICIuKCRpbmxpbmUgPyAiaW5saW5lIiA6ICJhdHRhY2htZW50IikuIjsgZmlsZW5hbWU9Ii4kbmFtZSk7CiAgICAgICAgaGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkiKTsKICAgICAgICBoZWFkZXIoIkNvbnRlbnQtTGVuZ3RoOiAiLkBfZmlsZXNpemUoJGZpbGUpKTsKICAgICAgICAKICAgICAgICAvLyBrdnVsaSBJRTYKICAgICAgICBoZWFkZXIoIlByYWdtYTogY2FjaGUiKTsKICAgICAgICBoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IHByaXZhdGUiKTsKICAgICAgICBoZWFkZXIoIkV4cGlyZXM6IDAiKTsKICAgICAgICAKICAgICAgICAvLyBNVVNUIE5PVCBVU0UhISEhISAtIG9uIHNoaW5keS5jeiBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCB3aG9sZSBmaWxlCiAgICAgICAgLy9Ac2V0TWVtb3J5TGltaXQoMTAyNCk7CiAgICAgICAgLy9Ac2V0VGltZW91dCg1KjYwKTsKICAgICAgICAKICAgICAgICAkZnAgPSBmb3BlbigkZmlsZSwgInIiKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZnApOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgaWYgKCEkZnApCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiQ2Fubm90IG9wZW4gZmlsZSAiLiRmaWxlLCBtdEVycm9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvIF9maWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkYnl0ZXMgPSAwOwogICAgICAgICAgICB3aGlsZSghZmVvZigkZnApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkYnVmZmVyID0gZnJlYWQoJGZwLCAxMCoxMDI0KTsKICAgICAgICAgICAgICAgICRieXRlcyArPSBzdHJsZW4oJGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAvL2VjaG8gIjxocj4iOwogICAgICAgICAgICAgICAgLy9lY2hvIGdldE1lbW9yeVVzYWdlKCkuIiAvICIuZ2V0TWVtb3J5TGltaXQoKTsKICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICBwcmludCgkYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iX2ZsdXNoKCk7CiAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgLy9lY2hvICJ4IjsKICAgICAgICAgICAgICAgIC8vZWNobyAkYnl0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmNsb3NlKCRmcCk7ICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAvL2VjaG8gIjxocj4iOwogICAgICAgICAgICAvL2VjaG8gIkJ5dGVzOiAiLkBfZmlsZXNpemUoJGZpbGUpLiI8YnIgLz4iOwogICAgICAgICAgICAvL2VjaG8gIlNlbnQ6ICIuJGJ5dGVzLiI8YnIgLz4iOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9leGl0OwogICAgICAgIH0KICAgIH0gICAgICAgCn0KCgo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRlRQL0ZUUC5jbGFzcy5waHAgLS0tLS0tLSANCg0KY2xhc3MgVEZUUCBleHRlbmRzIFRDb3JlT2JqZWN0DQp7DQogICAgZnVuY3Rpb24gY29ubmVjdCgkaG9zdCwgJGxvZ2luLCAkcGFzc3dvcmQpDQogICAgew0KICAgICAgICAkdGhpcy0+ZiA9IF9mdHBfY29ubmVjdCgkaG9zdCwgJGxvZ2luLCAkcGFzc3dvcmQpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuKChib29sKSR0aGlzLT5mKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gcHV0KCRyZW1vdGVGaWxlLCAkbG9jYWxGaWxlKQ0KICAgIHsNCiAgICAgICAgJGxvY2FsRmlsZSA9IGZpbmRGaWxlKCRsb2NhbEZpbGUpOw0KDQogICAgICAgIGlmICgkbG9jYWxGaWxlKQ0KICAgICAgICAgICAgcmV0dXJuKGZ0cF9wdXQoJHRoaXMtPmYsICRyZW1vdGVGaWxlLCAkbG9jYWxGaWxlLCBGVFBfQklOQVJZKSk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHJldHVybihmYWxzZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0KCRyZW1vdGVGaWxlLCAkbG9jYWxGaWxlPU5VTEwpDQogICAgew0KICAgICAgICBpZiAoISRsb2NhbEZpbGUpDQogICAgICAgICAgICAkX2xvY2FsRmlsZSA9IFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAvZnRwLWdldC0iLlVVSUQoKS4iLiIuZ2V0RmlsZUV4dCgkcmVtb3RlRmlsZSk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgICRfbG9jYWxGaWxlID0gJGxvY2FsRmlsZTsNCiAgICANCiAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCRfbG9jYWxGaWxlLCAiIiwgMDc3Nyk7DQogICAgICAgIA0KICAgICAgICBmdHBfZ2V0KCR0aGlzLT5mLCAkX2xvY2FsRmlsZSwgJHJlbW90ZUZpbGUsIEZUUF9CSU5BUlkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCRsb2NhbEZpbGUpDQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgJGNvbnRlbnQgPSBfZmlsZV9nZXRfY29udGVudHMoJF9sb2NhbEZpbGUpOw0KICAgICAgICAgICAgX3VubGluaygkX2xvY2FsRmlsZSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybigkY29udGVudCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnbG9iKCRyZW1vdGVEaXI9Ii8iKQ0KICAgIHsNCiAgICAgICAgJGZpbGVzID0gX2Z0cF9ubGlzdCgkdGhpcy0+ZiwgJHJlbW90ZURpcik7DQogICAgICAgIA0KICAgICAgICBmb3JlYWNoKCRmaWxlcyBhcyAka2V5ID0+ICRmaWxlKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoJGZpbGUgPT0gIi8uIiB8fCAkZmlsZSA9PSAiLy4uIikNCiAgICAgICAgICAgICAgICB1bnNldCgkZmlsZXNbJGtleV0pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4oJGZpbGVzKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gdW5saW5rKCRyZW1vdGVGaWxlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuKGZ0cF9kZWxldGUoJHRoaXMtPmYsICRyZW1vdGVGaWxlKSk7DQogICAgfQ0KfSAgICANCg0KZnVuY3Rpb24gX2Z0cF9jb25uZWN0KCRob3N0LCAkbG9naW4sICRwYXNzd29yZCwgJHNpbGVudD1mYWxzZSkNCnsNCiAgICAvL2VjaG8gIkZUUDxicj4iOw0KICAgIC8vZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsNCiAgICAvL2V4aXQ7DQogICAgDQogICAgZ2xvYmFsICRfX2Z0cENvbm5lY3Rpb25zOw0KICAgIGlmICghaXNfYXJyYXkoJF9fZnRwQ29ubmVjdGlvbnMpKQ0KICAgICAgICAkX19mdHBDb25uZWN0aW9ucyA9IGFycmF5KCk7DQoNCiAgICAkY29ubmVjdGlvbk5hbWUgPSBtZDUoJGhvc3QuJGxvZ2luLiRwYXNzd29yZCk7DQogICAgJHJldCA9ICRfX2Z0cENvbm5lY3Rpb25zWyRjb25uZWN0aW9uTmFtZV1bInN0cmVhbSJdOw0KICAgIA0KICAgIGlmICghJHJldCkNCiAgICB7DQogICAgICAgICRob3N0ID0gZXhwbG9kZSgiOiIsICRob3N0KTsNCiAgICAgICAgJHBvcnQgPSAkaG9zdFsxXTsNCiAgICAgICAgJGhvc3QgPSAkaG9zdFswXTsNCiAgICAgICAgaWYgKCEkcG9ydCkNCiAgICAgICAgICAgICRwb3J0ID0gMjE7DQogICAgICAgIA0KICAgICAgICAkY29ubl9pZCA9IEBmdHBfY29ubmVjdCgkaG9zdCwgJHBvcnQpOw0KICAgICAgICBpZiAoJGNvbm5faWQpDQogICAgICAgIHsNCiAgICAgICAgICAgICRsb2dpbl9yZXN1bHQgPSBAZnRwX2xvZ2luKCRjb25uX2lkLCAkbG9naW4sICRwYXNzd29yZCk7DQogICAgICAgICAgICBpZiAoJGxvZ2luX3Jlc3VsdCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBAZnRwX3Bhc3YoJGNvbm5faWQsIHRydWUpOw0KICAgICAgICAgICAgICAgICRyZXQgPSAkY29ubl9pZDsNCiAgICAgICAgICAgICAgICAkX19mdHBDb25uZWN0aW9uc1skY29ubmVjdGlvbk5hbWVdID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICJob3N0IiA9PiAkaG9zdCwNCiAgICAgICAgICAgICAgICAgICAgImxvZ2luIiA9PiAkbG9naW4sDQogICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCIgPT4gJHBhc3N3b3JkLA0KICAgICAgICAgICAgICAgICAgICAic3RyZWFtIiA9PiAkY29ubl9pZCwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICRyZXQgPSAkY29ubl9pZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoISRzaWxlbnQpDQogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJGVFA6IHVuYWJsZSB0byBsb2dpbiB0byAnIi4kaG9zdC4iJyB3aXRoIGxvZ2luICciLiRsb2dpbi4iJyBhbmQgcGFzc3dvcmQiLCBtdEVycm9yKTsNCiAgICAgICAgICAgICAgICAkcmV0ID0gRkFMU0U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoISRzaWxlbnQpDQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkZUUDogdW5hYmxlIHRvIGNvbm5lY3QgdG8gJyIuJGhvc3QuIiciLCBtdEVycm9yKTsNCiAgICAgICAgICAgICRyZXQgPSBGQUxTRTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4oJHJldCk7DQp9DQoNCmZ1bmN0aW9uIGZ0cF9pc19kaXIoJGZ0cCwgJGRpcikgDQp7DQogICAgaWYgKEBmdHBfY2hkaXIoJGZ0cCwgJGRpcikpIA0KICAgIHsNCiAgICAgICAgQGZ0cF9jaGRpcigkZnRwLCAnLi4nKTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSANCiAgICBlbHNlIA0KICAgIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gX2Z0cF9jbG9zZV9hbGwoKQ0Kew0KICAgIGdsb2JhbCAkX19mdHBDb25uZWN0aW9uczsNCiAgICANCiAgICBpZiAoaXNfYXJyYXkoJF9fZnRwQ29ubmVjdGlvbnMpKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCgkX19mdHBDb25uZWN0aW9ucyBhcyAkX19mdHBDb25uZWN0aW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBAZnRwX2Nsb3NlKCRfX2Z0cENvbm5lY3Rpb25bInN0cmVhbSJdKTsNCiAgICAgICAgfQ0KICAgICAgICAkX19mdHBDb25uZWN0aW9ucyA9IGFycmF5KCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBfZnRwX25saXN0KCRzdHJlYW0sICRkaXJlY3RvcnkpDQp7DQogICAgb2Jfc3RhcnQoKTsNCiAgICAkZmlsZXMgPSBmdHBfbmxpc3QoJHN0cmVhbSwgJGRpcmVjdG9yeSk7DQogICAgJGVycm9ycyA9IG9iX2dldF9jb250ZW50cygpOw0KICAgIG9iX2VuZF9jbGVhbigpOw0KICAgIA0KICAgIGlmIChzdHJwb3MoJGVycm9ycywgIm9wZW5fYmFzZWRpciIpICE9PSBGQUxTRSB8fCAkZmlsZXMgPT09IEZBTFNFKSAvLyBTQUZFIE1PREUgLSBCVUcgaW4gRlRQIGZ1bmN0aW9ucw0KICAgIHsNCiAgICAgICAgLy8gbmVlZCB0byB1c2UgVmlzdWFsIFBIUCBzZXJ2ZXIgc29sdXRpb24NCiAgICAgICAgJGZpbGVzID0gX2Z0cF9yZW1vdGVfbmxpc3QoJHN0cmVhbSwgJGRpcmVjdG9yeSk7ICAgIA0KICAgICAgICAgICAgDQogICAgICAgIGlmICghaXNfYXJyYXkoJGZpbGVzKSkNCiAgICAgICAgICAgICRmaWxlcyA9IGFycmF5KCk7DQogICAgICAgIHJldHVybigkZmlsZXMpOw0KICAgIH0NCiAgICBpZiAoIWlzX2FycmF5KCRmaWxlcykpDQogICAgICAgICRmaWxlcyA9IGFycmF5KCk7DQogICAgDQogICAgZm9yZWFjaCgkZmlsZXMgYXMgJGtleSA9PiAkdmFsdWUpICAgIA0KICAgIHsNCiAgICAgICAgJGZpbGVzWyRrZXldID0gc3RyX3JlcGxhY2UoIi8vIiwgIi8iLCAkdmFsdWUpOw0KICAgIH0NCiAgICAgICAgDQogICAgcmV0dXJuKCRmaWxlcyk7DQp9DQoNCi8qDQpmdW5jdGlvbiBfZnRwX3JlbW90ZV9ubGlzdCgkc3RyZWFtLCAkZGlyZWN0b3J5KQ0Kew0KICAgIGdsb2JhbCAkX19mdHBMaW5rczsNCiAgICANCiAgICAkZm91bmQgPSBmYWxzZTsNCiAgICBmb3JlYWNoKCRfX2Z0cExpbmtzIGFzICRmdHBMaW5rKSAgICANCiAgICB7DQogICAgICAgIGlmICgkZnRwTGlua1sibGluayJdID09ICRzdHJlYW0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgkZnRwTGlua1siaG9zdCJdID09ICJsb2NhbGhvc3QiIHx8ICRmdHBMaW5rWyJob3N0Il0gPT0gIjEyNy4wLjAuMSIgfHwgc3RycG9zKCRmdHBMaW5rWyJob3N0Il0sICIxOTIuMTY4LiIpID09PSAwIHx8IHN0cnBvcygkZnRwTGlua1siaG9zdCJdLCAiMTAuIikgPT09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZWNobyAiQ2Fubm90IHVzZSByZW1vdGUgRlRQIExJU1QgY29tbWFuZCBzaW11bGF0aW9uIG9uIHNlcnZlciBob3N0ICciLiRmdHBMaW5rWyJob3N0Il0uIicuIFBsZWFzZSBlbnRlciBleHRlcm4gSVAgb3IgRG9tYWluIE5hbWUgZm9yIEZUUCBzZXJ2ZXIuIjsNCiAgICAgICAgICAgICAgICByZXR1cm4oYXJyYXkoKSk7DQogICAgICAgICAgICB9DQogICAgDQogICAgICAgICAgICAkZm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgJHJldCA9IGRvd25sb2FkKCJodHRwOi8vd3d3LnZpc3VhbC1waHAuY29tL3Rvb2xzL2Z0cF9ubGlzdC5waHA/aG9zdD0iLiRmdHBMaW5rWyJob3N0Il0uIiZwb3J0PSIuJGZ0cExpbmtbInBvcnQiXS4iJnVzZXJuYW1lPSIuJGZ0cExpbmtbInVzZXJuYW1lIl0uIiZwYXNzd29yZD0iLiRmdHBMaW5rWyJwYXNzd29yZCJdLiImc2VydmVyTmFtZT0iLiRfU0VSVkVSWyJIVFRQX0hPU1QiXS4iJmRpcmVjdG9yeT0iLiRkaXJlY3RvcnkpOw0KICAgICAgICAgICAgaWYgKHN0cmlwb3MoJHJldCwgIjQwNCBOb3QgRm91bmQiKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBlY2hvICJDYW5ub3QgdXNlIHJlbW90ZSBGVFAgTElTVCBjb21tYW5kIHNpbXVsYXRpb24gb24gc2VydmVyIGhvc3QgJyIuJGZ0cExpbmtbImhvc3QiXS4iJy4gSW50ZXJuYWwgZXJyb3IgLSA0MDQgTm90IEZvdW5kLiI7DQogICAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzdHJpcG9zKCRyZXQsICJlcnJvciIpICE9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgVVRGLTggc3RhcnQgY29kZQ0KICAgICAgICAgICAgICAgIHdoaWxlKCRyZXRbMF0gIT0gImEiKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgJHJldCA9IHN1YnN0cigkcmV0LCAxLCBzdHJsZW4oJHJldCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRyZXQgPSB1bnNlcmlhbGl6ZSgkcmV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkcmV0ID0gYXJyYXkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybigkcmV0KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICBpZiAoISRmb3VuZCkNCiAgICAgICAgZWNobyAiTm8gRlRQIGNvbm5lY3Rpb24gZm91bmQiOw0KICAgIA0KICAgIHJldHVybihhcnJheSgpKTsNCn0NCiovDQoNCmZ1bmN0aW9uIF9mdHBfcmVtb3RlX25saXN0KCRzdHJlYW0sICRkaXJlY3RvcnkpDQp7DQogICAgZ2xvYmFsICRfX2Z0cENvbm5lY3Rpb25zOw0KICAgIA0KICAgICRmb3VuZCA9IGZhbHNlOw0KICAgIGZvcmVhY2goJF9fZnRwQ29ubmVjdGlvbnMgYXMgJF9fZnRwQ29ubmVjdGlvbikgICAgDQogICAgew0KICAgICAgICBpZiAoJF9fZnRwQ29ubmVjdGlvblsic3RyZWFtIl0gPT0gJHN0cmVhbSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCRfX2Z0cENvbm5lY3Rpb25bImhvc3QiXSA9PSAibG9jYWxob3N0IiB8fCAkX19mdHBDb25uZWN0aW9uWyJob3N0Il0gPT0gIjEyNy4wLjAuMSIgfHwgc3RycG9zKCRfX2Z0cENvbm5lY3Rpb25bImhvc3QiXSwgIjE5Mi4xNjguIikgPT09IDAgfHwgc3RycG9zKCRfX2Z0cENvbm5lY3Rpb25bImhvc3QiXSwgIjEwLiIpID09PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJDYW5ub3QgdXNlIHJlbW90ZSBGVFAgTElTVCBjb21tYW5kIHNpbXVsYXRpb24gb24gc2VydmVyIGhvc3QgJyIuJF9fZnRwQ29ubmVjdGlvblsiaG9zdCJdLiInLiBQbGVhc2UgZW50ZXIgZXh0ZXJuIElQIG9yIERvbWFpbiBOYW1lIGZvciBGVFAgc2VydmVyLiIsIG10RXJyb3IpOw0KICAgICAgICAgICAgICAgIHJldHVybihhcnJheSgpKTsNCiAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgICRmb3VuZCA9IHRydWU7DQogICAgICAgICAgICAkcmV0ID0gZG93bmxvYWQoImh0dHA6Ly93d3cudmlzdWFsLXBocC5jb20vdG9vbHMvZnRwX25saXN0LnBocD9ob3N0PSIuJF9fZnRwQ29ubmVjdGlvblsiaG9zdCJdLiImcG9ydD0iLiRfX2Z0cENvbm5lY3Rpb25bInBvcnQiXS4iJnVzZXJuYW1lPSIuJF9fZnRwQ29ubmVjdGlvblsibG9naW4iXS4iJnBhc3N3b3JkPSIuJF9fZnRwQ29ubmVjdGlvblsicGFzc3dvcmQiXS4iJnNlcnZlck5hbWU9Ii4kX1NFUlZFUlsiSFRUUF9IT1NUIl0uIiZkaXJlY3Rvcnk9Ii4kZGlyZWN0b3J5KTsNCiAgICAgICAgICAgIGlmIChzdHJpcG9zKCRyZXQsICI0MDQgTm90IEZvdW5kIikpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkNhbm5vdCB1c2UgcmVtb3RlIEZUUCBMSVNUIGNvbW1hbmQgc2ltdWxhdGlvbiBvbiBzZXJ2ZXIgaG9zdCAnIi4kX19mdHBDb25uZWN0aW9uWyJob3N0Il0uIicuIEludGVybmFsIGVycm9yIC0gNDA0IE5vdCBGb3VuZC4iLCBtdEVycm9yKTsNCiAgICAgICAgICAgICAgICByZXR1cm4oYXJyYXkoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3RyaXBvcygkcmV0LCAiZXJyb3IiKSAhPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIFVURi04IHN0YXJ0IGNvZGUNCiAgICAgICAgICAgICAgICB3aGlsZSgkcmV0WzBdICE9ICJhIikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICRyZXQgPSBzdWJzdHIoJHJldCwgMSwgc3RybGVuKCRyZXQpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkcmV0ID0gdW5zZXJpYWxpemUoJHJldCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHJldCA9IGFycmF5KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm4oJHJldCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgaWYgKCEkZm91bmQpDQogICAgICAgIHNob3dNZXNzYWdlKCJObyBGVFAgY29ubmVjdGlvbiBmb3VuZCIsIG10RXJyb3IpOw0KICAgIA0KICAgIHJldHVybihhcnJheSgpKTsNCn0NCg0KZnVuY3Rpb24gZnRwX2ZpbGVfZXhpc3RzKCRmdHAsICRmaWxlKSANCnsNCiAgICAkcGF0aCA9IGdldEZpbGVQYXRoKCRmaWxlKTsNCiAgICAvL2VjaG8gIiEhKCIuJHBhdGguIikhISI7DQogICAgLy9leGl0Ow0KICAgIC8vaWYgKCRwYXRoW3N0cmxlbigkcGF0aCktMV0gPT0gIi8iKQ0KICAgIC8vICAgICRwYXRoID0gc3Vic3RyKCRwYXRoLCAwLCBzdHJsZW4oJHBhdGgpLTEpOw0KICAgIA0KICAgICRmaWxlcyA9IF9mdHBfbmxpc3QoJGZ0cCwgJHBhdGgpOyAvLyBAIGt2dWxpIG9wZW5fYmFzZWRpcg0KICAgIA0KICAgIC8vZWNobyAiISEoIi4kcGF0aC4iKSEhIjsNCiAgICAvL3Zhcl9kdW1wKCRmaWxlcyk7DQogICAgLy9leGl0Ow0KICAgIGlmIChpc19hcnJheSgkZmlsZXMpKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCgkZmlsZXMgYXMgJF9maWxlKQ0KICAgICAgICB7DQogICAgICAgICAgICAvL2VjaG8gIj8iLiRfZmlsZS4iPyI7DQogICAgICAgICAgICAvL2VjaG8gZ2V0RmlsZU5hbWUoJF9maWxlKS4ifCI7DQogICAgICAgICAgICBpZiAoZ2V0RmlsZU5hbWUoJF9maWxlKS4iLiIuZ2V0RmlsZUV4dCgkX2ZpbGUpID09IGdldEZpbGVOYW1lKCRmaWxlKS4iLiIuZ2V0RmlsZUV4dCgkZmlsZSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy9lY2hvICJFWElTVFMiOw0KICAgICAgICAgICAgICAgLy8gZXhpdDsNCiAgICAgICAgICAgICAgIC8vIGV4aXQ7DQogICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybihmYWxzZSk7DQp9DQoNCg0KLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSW50ZXJuZXQvSW50ZXJuZXQuY2xhc3MucGhwIC0tLS0tLS0gDQoKLy8gVE9ETyAtIHogQ1VSTCBlbXVsYWNlIHVkZWxhdCBwbGFjZW55IG1vZHVsCi8vIFRPRE8gLSBmdW5rY2UgZG93bmxvYWQgLSBwbGFjZW55IG1vZHVsCnVzZU9iamVjdCgiQ1VSTCIpOwoKY2xhc3MgVEludGVybmV0IGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgLy8gY2FsbGVkIGZyb20gL3JlZGlyZWN0LnBocAogICAgZnVuY3Rpb24gX3JlZGlyZWN0KCkKICAgIHsKICAgICAgICAkdXJsID0gJF9SRVFVRVNUWyJ1cmwiXTsKICAgICAgICAkbGlua0luZm8gPSBleHBsb2RlTGluaygkdXJsKTsKICAgICAgICAvL3Zhcl9kdW1wKCRsaW5rSW5mbyk7IGV4aXQ7CiAgICAKICAgICAgICAkaHRtbCAuPSAiPGZvcm0gaWQ9J3JlZGlyZWN0Rm9ybScgYWN0aW9uPSciLiRsaW5rSW5mb1sicHJvdG9jb2wiXS4iOi8vIi4kbGlua0luZm9bImRvbWFpbiJdLiRsaW5rSW5mb1sicGF0aCJdLiRsaW5rSW5mb1siZmlsZSJdLiInIG1ldGhvZD0ncG9zdCcgdGFyZ2V0PSdfc2VsZic+IjsKICAgICAgICAkaHRtbCAuPSBnZXRQYXJhbXNBc0Zvcm0oJGxpbmtJbmZvWyJwYXJhbXMiXSk7CiAgICAgICAgJGh0bWwgLj0gIjwvZm9ybT4iOwogICAgCiAgICAgICAgJGh0bWwgLj0gZ2V0SmF2YVNjcmlwdEh0bWwoImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWRpcmVjdEZvcm0nKS5zdWJtaXQoKTsiKTsKCiAgICAgICAgZWNobyAkaHRtbDsgZXhpdDsKICAgIH0gICAgCn0KCmZ1bmN0aW9uIGhhc0ludGVybmV0KCkKewogICAgZ2xvYmFsICRfX19oYXNJbnRlcm5ldFJlc3VsdDsKICAgIAogICAgaWYgKCRfX19oYXNJbnRlcm5ldFJlc3VsdCA9PT0gTlVMTCkKICAgIHsKICAgICAgICAkY29udGVudCA9IGRvd25sb2FkKCJodHRwOi8vYXV0aC52aXN1YWwtcGhwLmNvbS9hdmFpbGFibGUucGhwIiwgYXJyYXkoKSwgYXJyYXkoKSwgYXJyYXkoInRpbWVvdXQiID0+IDIsICIiKSk7CiAgICAgICAgICAgIAogICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICJPSyIpICE9PSBGQUxTRSkgLy8gYmVjYXVzZSBvZiBVVEYtOCBjaGFycwogICAgICAgIHsKICAgICAgICAgICAgJF9fX2hhc0ludGVybmV0UmVzdWx0ID0gdHJ1ZTsKICAgICAgICB9ICAgCiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJF9fX2hhc0ludGVybmV0UmVzdWx0ID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oJF9fX2hhc0ludGVybmV0UmVzdWx0KTsKfQoKZnVuY3Rpb24gcGRvd25sb2FkKCR1cmwsICRwYXJhbXM9YXJyYXkoKSkKewogICAgaWYgKGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRJbmNsdWRlUGF0aCgiUHJveHlEb3dubG9hZCIpKQogICAgewogICAgICAgIHJldHVybihnZXRPYmplY3QoIlByb3h5RG93bmxvYWQiKS0+ZG93bmxvYWQoJHVybCwgJHBhcmFtcykpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybihkb3dubG9hZCgkdXJsLCBhcnJheSgpLCBhcnJheSgpLCAkcGFyYW1zKSk7Cn0KCmZ1bmN0aW9uIGd1bnppcCgkemlwcGVkLCAkc2lsZW50PWZhbHNlKSAKewogICAgJG9mZnNldCA9IDA7CiAgICBpZiAoc3Vic3RyKCR6aXBwZWQsMCwyKSA9PSAiXHgxZlx4OGIiKQogICAgICAgICRvZmZzZXQgPSAyOwogICAgaWYgKHN1YnN0cigkemlwcGVkLCRvZmZzZXQsMSkgPT0gIlx4MDgiKSAgCiAgICB7CiAgICAgICAgIyBmaWxlX3B1dF9jb250ZW50cygidG1wLmd6Iiwgc3Vic3RyKCR6aXBwZWQsICRvZmZzZXQgLSAyKSk7CiAgICAgICAgcmV0dXJuIGd6aW5mbGF0ZShzdWJzdHIoJHppcHBlZCwgJG9mZnNldCArIDgpKTsKICAgIH0KCiAgICBpZiAoISRzaWxlbnQpCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoImd1bnppcDogVW5rbm93biBGb3JtYXQgJyIuaHRtbGVudGl0aWVzKHN1YnN0cigkemlwcGVkLCAwLCAxMDApKS4iJy4uLiIsIG10RXJyb3IpOwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9IAogICAKZnVuY3Rpb24gZG93bmxvYWQoJHVybCwgJHBvc3Q9YXJyYXkoKSwgJGNvb2tpZXM9YXJyYXkoKSwgJHBhcmFtcz1hcnJheSgpKQp7CiAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXMpKQogICAgICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgCiAgICAkbGlua0luZm8gPSBleHBsb2RlTGluaygkdXJsKTsgCiAgICBpZiAoJGxpbmtJbmZvWyJmaWxlIl0gIT0gdXJsZW5jb2RlKCRsaW5rSW5mb1siZmlsZSJdKSkKICAgICAgICAkbGlua0luZm9bImZpbGUiXSA9IHVybGVuY29kZSgkbGlua0luZm9bImZpbGUiXSk7CiAgICAkdXJsID0gaW1wbG9kZUxpbmsoJGxpbmtJbmZvKTsKICAgIAogICAgICAgIAogICAgaWYgKHN0cnBvcygkdXJsLCAidmlzdWFsLXBocC5jb20iKSA9PT0gRkFMU0UgJiYgZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5kb3dubG9hZFByb3h5Q2xpZW50KQogICAgewogICAgICAgICRkb3dubG9hZFByb3h5Q2xpZW50ID0gVEpTT046OmRlY29kZShnZXRPYmplY3QoIlNldHRpbmdzIiktPmRvd25sb2FkUHJveHlDbGllbnQpOwogICAgICAgIGZvcmVhY2goJGRvd25sb2FkUHJveHlDbGllbnQgYXMgJGRvd25sb2FkUHJveHlDbGllbnRJdGVtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRkb3dubG9hZFByb3h5Q2xpZW50SXRlbVsidXJsIl0gPT0gIiIgfHwgJGRvd25sb2FkUHJveHlDbGllbnRJdGVtWyJ1cmwiXSA9PSAiKiIgfHwgc3RycG9zKCR1cmwsICRkb3dubG9hZFByb3h5Q2xpZW50SXRlbVsidXJsIl0pICE9PSBGQUxTRSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGRvd25sb2FkUHJveHlTZXJ2ZXIgPSAkZG93bmxvYWRQcm94eUNsaWVudEl0ZW1bInByb3h5Il07CiAgICAgICAgICAgICAgICAkZG93bmxvYWRQcm94eVNlcnZlcktleSA9ICRkb3dubG9hZFByb3h5Q2xpZW50SXRlbVsia2V5Il07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGRvd25sb2FkUHJveHlTZXJ2ZXIgJiYgJGRvd25sb2FkUHJveHlTZXJ2ZXJLZXkpCiAgICAgICAgewogICAgICAgICAgICAkX3Bvc3QgPSBhcnJheSgpOwogICAgICAgICAgICAkX3Bvc3RbIl9fcG9zdCJdID0gJHBvc3Q7CiAgICAgICAgICAgICRfcG9zdFsiX191cmwiXSA9ICR1cmw7CiAgICAgICAgICAgICRfcG9zdFsiX19rZXkiXSA9ICRkb3dubG9hZFByb3h5U2VydmVyS2V5OwogICAgICAgICAgICAkX3Bvc3RbIl9fY29va2llcyJdID0gJGNvb2tpZXM7CiAgICAgICAgICAgICRfcG9zdFsiX19wYXJhbXMiXSA9ICRwYXJhbXM7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoc3RycG9zKCRkb3dubG9hZFByb3h5U2VydmVyLCAiOi8vIikgPT09IEZBTFNFKQogICAgICAgICAgICAgICAgJGRvd25sb2FkUHJveHlTZXJ2ZXIgPSAiaHR0cDovLyIuJGRvd25sb2FkUHJveHlTZXJ2ZXI7CgogICAgICAgICAgICAkbGlua0luZm8gPSBleHBsb2RlTGluaygkZG93bmxvYWRQcm94eVNlcnZlcik7CiAgICAgICAgICAgIGlmICghJGxpbmtJbmZvWyJmaWxlIl0pCiAgICAgICAgICAgICAgICAkbGlua0luZm9bImZpbGUiXSA9ICJkb3dubG9hZF9wcm94eS5waHAiOwogICAgICAgICAgICAKICAgICAgICAgICAgJF91cmwgPSBpbXBsb2RlTGluaygkbGlua0luZm8pOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRfdXJsKTsgZXhpdDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybihkb3dubG9hZCgkX3VybCwgJF9wb3N0KSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvL3JldHVybigieCIpOwogICAgLy9leGl0OwogICAgdXNlT2JqZWN0KCJDVVJMIik7CiAgICAvL2R1bXAoQ1VSTF9FTVVMQVRJT04pOwogICAgCiAgICBpZiAoZ2V0T2JqZWN0KCJFdmVudHMiKS0+aGFzRXZlbnRzKCJvbkRvd25sb2FkIikpICAgIAogICAgewogICAgICAgICRyZXQgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uRG93bmxvYWQiLCBhcnJheSgKICAgICAgICAgICAgInVybCIgPT4gJHVybCwKICAgICAgICAgICAgInBvc3QiID0+ICRwb3N0LAogICAgICAgICAgICAiY29va2llcyIgPT4gJGNvb2tpZXMsCiAgICAgICAgICAgICJwYXJhbXMiID0+ICRwYXJhbXMKICAgICAgICApKTsKICAgICAgICBpZiAoJHJldCAhPT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigkcmV0KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICR0aW1lU3RhcnQgPSBnZXRNaWNyb3RpbWUoKTsKICAgIAogICAgaWYgKCFpc3NldCgkcGFyYW1zWyJzYXZlQ29va2llcyJdKSkKICAgICAgICAkcGFyYW1zWyJzYXZlQ29va2llcyJdID0gdHJ1ZTsKCiAgICBpZiAoISRwYXJhbXNbImhlYWRlcnMiXSkKICAgICAgICAkcGFyYW1zWyJoZWFkZXJzIl0gPSBhcnJheSgpOwogICAgCiAgICBpZiAoJHBhcmFtc1siYnJvd3NlciJdKQogICAgewogICAgICAgIC8vIFRPRE8gLSBmaXJlZm94LCBjaHJvbWUsIElFLCAuLi4KICAgICAgICAKICAgICAgICAvLyBIRUFERVJTIEFORCBPUFRJT05TIEFQUEVBUiBUTyBCRSBBIEZJUkVGT1ggQlJPV1NFUiBSRUZFUlJFRCBCWSBHT09HTEUKICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CiAgICAgICAgJGhlYWRlcnNbXSA9ICJBY2NlcHQ6IHRleHQveG1sLGFwcGxpY2F0aW9uL3htbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsdGV4dC9odG1sO3E9MC45LHRleHQvcGxhaW47cT0wLjgsaW1hZ2UvcG5nLCovKjtxPTAuNSI7CiAgICAgICAgJGhlYWRlcnNbXSA9ICJDYWNoZS1Db250cm9sOiBtYXgtYWdlPTAiOwogICAgICAgICRoZWFkZXJzW10gPSAiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSI7CiAgICAgICAgJGhlYWRlcnNbXSA9ICJLZWVwLUFsaXZlOiAzMDAiOwogICAgICAgICRoZWFkZXJzW10gPSAiQWNjZXB0LUNoYXJzZXQ6IElTTy04ODU5LTEsdXRmLTg7cT0wLjcsKjtxPTAuNyI7CiAgICAgICAgJGhlYWRlcnNbXSA9ICJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzLGVuO3E9MC41IjsKICAgICAgICAkaGVhZGVyc1tdID0gIlByYWdtYTogIjsgLy8gQlJPV1NFUlMgVVNVQUxMWSBMRUFWRSBCTEFOSwogICAgICAgIAogICAgICAgICRwYXJhbXNbImhlYWRlcnMiXSA9IGFycmF5X21lcmdlKCRoZWFkZXJzLCAkcGFyYW1zWyJoZWFkZXJzIl0pOwoKICAgICAgICAvLyBTRVQgVEhFIENVUkwgT1BUSU9OUyAtIFNFRSBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uY3VybC1zZXRvcHQucGhwCiAgICAgICAgJHBhcmFtc1siYWdlbnQiXSA9ICJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLVVTOyBydjoxLjkuMS42KSBHZWNrby8yMDA5MTIwMSBGaXJlZm94LzMuNS42IjsKICAgICAgICAvLyRwYXJhbXNbInJlZmVyZXIiXSA9ICJodHRwOi8vd3d3Lmdvb2dsZS5jb20iOwogICAgICAgICRwYXJhbXNbImVuY29kaW5nIl0gPSAiZ3ppcCxkZWZsYXRlIjsKICAgICAgICAkcGFyYW1zWyJhdXRvUmVmZXJlciJdID0gInRydWUiOwogICAgfQogICAgCiAgICBpZiAoaXNfYXJyYXkoJHBvc3QpKQogICAgewogICAgICAgIGZvcmVhY2goJHBvc3QgYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gIkAiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2VjaG8gc3Vic3RyKCR2YWx1ZSwgMSk7CiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKHN1YnN0cigkdmFsdWUsIDEpKSkKICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiZG93bmxvYWQoKSAtIHVwbG9hZGVkIGZpbGUgJyIuc3Vic3RyKCR2YWx1ZSwgMSkuIicgZG9lcyBub3QgZXhpc3QiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHBocCA1LjYrICAgLy8gYmFjayBjb21wYXRpYmlsaXR5CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9maWxlX2NyZWF0ZScpKSAKICAgICAgICB7IAogICAgICAgICAgICBmb3JlYWNoKCRwb3N0IGFzICRuYW1lID0+ICR2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gIkAiKQogICAgICAgICAgICAgICAgICAgICRwb3N0WyRuYW1lXSA9IGN1cmxfZmlsZV9jcmVhdGUoc3Vic3RyKCR2YWx1ZSwgMSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgIH0KICAgIGlmIChzdHJwb3MoJHVybCwgIi8vIikgPT09IDApCiAgICAgICAgJHVybCA9ICJodHRwOiIuJHVybDsKICAgIAogICAgJHVybCA9IHN0cl9yZXBsYWNlKCIgIiwgIiUyMCIsICR1cmwpOwogICAgICAgICAgICAKICAgICRkb3dubG9hZExvZ0ZpbGVOYW1lID0gZ2V0X2NmZ192YXIoInZpc3VhbHBocC5kb3dubG9hZF9sb2ciKTsKICAgIGlmICgkZG93bmxvYWRMb2dGaWxlTmFtZSAvKmZpbGVfZXhpc3RzKCIvZGF0YS93ZWIvdmlzdWFscGhwLWRvd25sb2FkLmxvZyIpKi8pCiAgICB7CiAgICAgICAgJGYgPSBmb3BlbigiL2RhdGEvd2ViL3Zpc3VhbHBocC1kb3dubG9hZC5sb2ciLCAiYSsiKTsKICAgICAgICBmd3JpdGUoJGYsIGRhdGUoIlktbS1kIEg6aTpzIikuIiAiLlBST0pFQ1RVUkwuIjogIi4kdXJsLiJcclxuIik7CiAgICAgICAgZmNsb3NlKCRmKTsKICAgIH0gICAgICAgIAoKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIl9jdXJsX2luaXQiKSkKICAgIHsKICAgICAgICAkZG9tYWluTmFtZSA9ICIiOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifGh0dHBzPzovLyguKj8pL3wiLCAkdXJsLCAkZWxlbWVudHMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgICRkb21haW5OYW1lID0gJGVsZW1lbnRzWzBdWzFdOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cnBvcygkdXJsLCAidmlzdWFsLXBocC5jb20iKSAhPT0gRkFMU0UgJiYgISRwYXJhbXNbInJlZmVyZXIiXSkKICAgICAgICAgICAgJHBhcmFtc1sicmVmZXJlciJdID0gUFJPSkVDVFVSTDsKICAgICAgICAKICAgICAgICAkY3VybCA9IF9jdXJsX2luaXQoKTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siZGVidWciXSkKICAgICAgICB7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9WRVJCT1NFLCB0cnVlKTsKCiAgICAgICAgICAgICRkZiA9IGZvcGVuKCdwaHA6Ly90ZW1wJywgJ3crJyk7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TVERFUlIsICRkZik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRfY29va2llcyA9IGFycmF5KCk7CgogICAgICAgIGlmICh0b0Jvb2woJHBhcmFtc1siY2xlYXJDb29raWVzIl0pKQogICAgICAgIHsKICAgICAgICAgICAgJGRvbWFpbk5hbWVBID0gZXhwbG9kZSgiLiIsICRkb21haW5OYW1lKTsKICAgICAgICAgICAgd2hpbGUoJGRvbWFpbk5hbWVBKQogICAgICAgICAgICB7ICAgICAgIAogICAgICAgICAgICAgICAgJF9kb21haW5OYW1lID0gaW1wbG9kZSgiLiIsICRkb21haW5OYW1lQSk7CiAgICAgICAgICAgICAgICAkY29va2llRmlsZSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgVEVNUFBBVEguIi9kb3dubG9hZC4iLiRfZG9tYWluTmFtZS4iLmNvb2tpZXMiKTsKICAgICAgICAgICAgICAgIGlmIChfZmlsZV9leGlzdHMoJGNvb2tpZUZpbGUpKQogICAgICAgICAgICAgICAgICAgIF91bmxpbmsoJGNvb2tpZUZpbGUpOwoKICAgICAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRkb21haW5OYW1lQSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICBpZiAoJHBhcmFtc1sic2F2ZUNvb2tpZXMiXSkKICAgICAgICB7CiAgICAgICAgICAgICRkb21haW5OYW1lQSA9IGV4cGxvZGUoIi4iLCAkZG9tYWluTmFtZSk7CiAgICAgICAgICAgIHdoaWxlKCRkb21haW5OYW1lQSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJF9kb21haW5OYW1lID0gaW1wbG9kZSgiLiIsICRkb21haW5OYW1lQSk7CiAgICAgICAgICAgICAgICAkY29va2llRmlsZSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgVEVNUFBBVEguIi9kb3dubG9hZC4iLiRfZG9tYWluTmFtZS4iLmNvb2tpZXMiKTsKICAgICAgICAgICAgICAgIGlmIChfZmlsZV9leGlzdHMoJGNvb2tpZUZpbGUpKQogICAgICAgICAgICAgICAgICAgICRfY29va2llcyA9IGFycmF5X21lcmdlKCRfY29va2llcywgdW5zZXJpYWxpemUoX2ZpbGVfZ2V0X2NvbnRlbnRzKCRjb29raWVGaWxlKSkpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJGRvbWFpbk5hbWVBKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIWlzX2FycmF5KCRfY29va2llcykpCiAgICAgICAgICAgICRfY29va2llcyA9IGFycmF5KCk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkY29va2llcykpCiAgICAgICAgICAgICRjb29raWVzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHBhcmFtc1siY29va2llcyJdKQogICAgICAgICAgICAkY29va2llcyA9ICRwYXJhbXNbImNvb2tpZXMiXTsKCiAgICAgICAgJF9jb29raWVzID0gYXJyYXlfbWVyZ2UoJF9jb29raWVzLCAkY29va2llcyk7CiAgICAgICAgJGNvb2tpZXMgPSAkX2Nvb2tpZXM7CgogICAgICAgIC8vX2xvZygkX2Nvb2tpZXMpOwogICAgICAgIC8vX2xvZygkY29va2llcyk7CgogICAgICAgIGlmICgkcGFyYW1zWyJmb2xsb3dSZWRpcmVjdCJdID09PSBOVUxMKQogICAgICAgICAgICAkcGFyYW1zWyJmb2xsb3dSZWRpcmVjdCJdID0gdHJ1ZTsKICAgICAgICBpZiAoJHBhcmFtc1siaGVhZGVyc09ubHkiXSA9PT0gTlVMTCkKICAgICAgICAgICAgJHBhcmFtc1siaGVhZGVyc09ubHkiXSA9IGZhbHNlOwogICAgICAgIGlmICgkcGFyYW1zWyJoZWFkZXJzQXNBcnJheSJdID09PSB0cnVlKQogICAgICAgICAgICAkcGFyYW1zWyJoZWFkZXJzT25seSJdID0gdHJ1ZTsKICAgICAgICBpZiAoJHBhcmFtc1siaGVhZGVyc09ubHkiXSkKICAgICAgICAgICAgJHBhcmFtc1siZm9sbG93UmVkaXJlY3QiXSA9IGZhbHNlOwogICAgICAgIGlmICgkcGFyYW1zWyJ0aW1lb3V0Il0gPT09IE5VTEwpCiAgICAgICAgICAgICRwYXJhbXNbInRpbWVvdXQiXSA9IDIwOwogICAgICAgIGlmIChpc19hcnJheSgkcGFyYW1zWyJyYW5nZSJdKSkKICAgICAgICAgICAgJHBhcmFtc1sicmFuZ2UiXSA9IGltcGxvZGUoIi0iLCAkcGFyYW1zWyJyYW5nZSJdKTsKICAgICAgICBpZiAoJHBhcmFtc1sic2F2ZUNvb2tpZXMiXSA9PT0gTlVMTCkKICAgICAgICAgICAgJHBhcmFtc1sic2F2ZUNvb2tpZXMiXSA9IHRydWU7CgogICAgICAgIGlmICgkcGFyYW1zWyJhdXRoTG9naW4iXSkKICAgICAgICB7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0hUVFBBVVRILDEpOwogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSUFdELCRwYXJhbXNbImF1dGhMb2dpbiJdLiI6Ii4kcGFyYW1zWyJhdXRoUGFzc3dvcmQiXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhcmFtc1siYWNjZXB0Il0pCiAgICAgICAgICAgICRwYXJhbXNbImhlYWRlcnMiXVtdID0gIkFjY2VwdDogIi4kcGFyYW1zWyJhY2NlcHQiXTsKICAgICAgICBpZiAoJHBhcmFtc1siYWNjZXB0TGFuZ3VhZ2UiXSkKICAgICAgICAgICAgJHBhcmFtc1siaGVhZGVycyJdW10gPSAiQWNjZXB0LUxhbmd1YWdlOiAiLiRwYXJhbXNbImFjY2VwdExhbmd1YWdlIl07CgogICAgICAgIGlmICgkcGFyYW1zWyJjb250ZW50VHlwZSJdKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkcGFyYW1zWyJjb250ZW50VHlwZSJdLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikgIT09IEZBTFNFICYmIGlzX2FycmF5KCRwb3N0KSkKICAgICAgICAgICAgICAgICRwb3N0ID0gZ2V0UGFyYW1zQXNMaW5rKCRwb3N0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtc1siY29udGVudFR5cGUiXSk7CiAgICAgICAgICAgICRwYXJhbXNbImhlYWRlcnMiXVtdID0gIkNvbnRlbnQtVHlwZTogIi4kcGFyYW1zWyJjb250ZW50VHlwZSJdOwogICAgICAgICAgICAvL19jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0hUVFBIRUFERVIsICJDb250ZW50LVR5cGU6ICIuJHBhcmFtc1siY29udGVudFR5cGUiXSk7IC8vIG5lb2R6a291c2VubwogICAgICAgIH0KICAgICAgICBpZiAoJHBhcmFtc1siaGVhZGVycyJdKQogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9IVFRQSEVBREVSLCAkcGFyYW1zWyJoZWFkZXJzIl0pOwogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtc1siaGVhZGVycyJdKTsKICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXNbImhlYWRlcnMiXSk7ICAgIAogICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwgJHVybCk7CiAgICAgICAgaWYgKCRwYXJhbXNbInJhbmdlIl0pCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JBTkdFLCAkcGFyYW1zWyJyYW5nZSJdKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbInJlbW90ZURvd25sb2FkIl0pCiAgICAgICAgewogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9IRUFERVIsMCk7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX05PQk9EWSwwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHBhcmFtc1siaGVhZGVyc09ubHkiXSkKICAgICAgICB7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0hFQURFUiwxKTsKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfTk9CT0RZLDEpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZGlzYWJsZSB0byBzd2l0Y2ggZnJvbSBIRUFEIHRvIFBPU1QKICAgICAgICAgICAgLy8kcG9zdCA9IGFycmF5KCk7IC0gZG8gbm90IGRvIHRoaXMgLSBQcm9Sb3p2b3ogcmV0dXJucyB0aGUgc3RhdHVzIG9ubHkgZnJvbSBoZWFkZXIgLSByZXN1bHQgaXMgW10gZm9yIGV2ZXJ5dGhpbmcsIGJ1dCB3ZSBuZWVkIFBPU1QgZGF0YQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9IRUFERVIsMSk7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX05PQk9EWSwwKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbImVuY29kaW5nIl0pCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0VOQ09ESU5HLCRwYXJhbXNbImVuY29kaW5nIl0pOwogICAgICAgIGlmICgkcGFyYW1zWyJhdXRvUmVmZXJlciJdKQogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9BVVRPUkVGRVJFUiwkcGFyYW1zWyJhdXRvUmVmZXJlciJdKTsKCiAgICAgICAgaWYgKCRwYXJhbXNbInByb3h5Il0pCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BST1hZLCAkcGFyYW1zWyJwcm94eSJdKTsKICAgICAgICBpZiAoJHBhcmFtc1sicHJveHlQb3J0Il0pCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BST1hZUE9SVCwgJHBhcmFtc1sicHJveHlQb3J0Il0pOwogICAgICAgIGlmICgkcGFyYW1zWyJwcm94eVVzZXIiXSAmJiAkcGFyYW1zWyJwcm94eVBhc3N3b3JkIl0pCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BST1hZVVNFUlBXRCwgJHBhcmFtc1sicHJveHlVc2VyIl0uIjoiLiRwYXJhbXNbInByb3h5UGFzc3dvcmQiXSk7CgoKICAgICAgICBpZiAoJHBhcmFtc1sicHJveHlUeXBlIl0pCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2goc3RydG9sb3dlcigkcGFyYW1zWyJwcm94eVR5cGUiXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgInNvY2tzNCI6CiAgICAgICAgICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUFJPWFlUWVBFLCBDVVJMUFJPWFlfU09DS1M0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInNvY2tzNGEiOgogICAgICAgICAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BST1hZVFlQRSwgQ1VSTFBST1hZX1NPQ0tTNEEpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAic29ja3M1IjoKICAgICAgICAgICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QUk9YWVRZUEUsIENVUkxQUk9YWV9TT0NLUzUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAic29ja3M1SG9zdE5hbWUiOgogICAgICAgICAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BST1hZVFlQRSwgQ1VSTFBST1hZX1NPQ0tTNV9IT1NUTkFNRSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJodHRwMS4wIjoKICAgICAgICAgICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QUk9YWVRZUEUsIENVUkxQUk9YWV9TT0NLUzVfSFRUUF8xXzApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QUk9YWVRZUEUsIENVUkxQUk9YWV9IVFRQKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwgVFJVRSk7CiAgICAgICAgQF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1RJTUVPVVQsJHBhcmFtc1sidGltZW91dCJdKTsgLy8gZm9yIENVUkwgZW11bGF0aW9uCiAgICAgICAgQF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUX01TLCRwYXJhbXNbInRpbWVvdXQiXSoxMDAwKTsKICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9USU1FT1VUX01TLCRwYXJhbXNbInRpbWVvdXQiXSoxMDAwKTsKICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfTk9TSUdOQUwsIDEpOwogICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOwogICAgICAgIC8vX2N1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfU1NMVkVSU0lPTiw2KTsgLy8gVExTMS4yCiAgICAgICAgaWYgKCRwYXJhbXNbInNzbFZlcnNpb24iXSkKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCRwYXJhbXNbInNzbFZlcnNpb24iXSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9TU0xWRVJTSU9OLENVUkxfU1NMVkVSU0lPTl9UTFN2MV8yKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbInJlZmVyZXIiXSkKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVGRVJFUiwkcGFyYW1zWyJyZWZlcmVyIl0pOwogICAgICAgIAogICAgICAgIC8vIGt2dWxpIGh0dHBzIHByZW5vc3VtCiAgICAgICAgaWYgKCEkcGFyYW1zWyJzc2xWZXJpZnlIb3N0Il0pCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgZmFsc2UpOyAKICAgICAgICBpZiAoISRwYXJhbXNbInNzbFZlcmlmeVBlZXIiXSkKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBmYWxzZSk7IAogICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJhZ2VudCJdICE9PSAiIikgIC8vIHdlIHdhbnQgaXQgZW1wdHkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghJHBhcmFtc1siYWdlbnQiXSkKICAgICAgICAgICAgICAgICRwYXJhbXNbImFnZW50Il0gPSBnZXRPYmplY3QoIlNldHRpbmdzIiktPmRvd25sb2FkQWdlbnQ7IC8vIHYgc2V0dGluZ3MgdG90byBwb2xlIG5lbWFtLCBhbGUgbXV6ZSBieXQKICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJhZ2VudCJdKQogICAgICAgICAgICAgICAgJHBhcmFtc1siYWdlbnQiXSA9ICJWaXN1YWxQSFAgKCIuRE9NQUlOLiIpIjsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJhZ2VudCJdICE9ICIiKQogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCAkcGFyYW1zWyJhZ2VudCJdKTsKICAgICAgICAgICAgCiAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRE5TX0NBQ0hFX1RJTUVPVVQsNjAqNjApOwoKICAgICAgICBpZiAoJHBhcmFtc1siaW50ZXJmYWNlIl0gIT0gIiIpCiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9JTlRFUkZBQ0UsICRwYXJhbXNbImludGVyZmFjZSJdKTsKICAgICAgICAKICAgICAgICAvL19jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9ETlNfU0VSVkVSUywgIiIpOwogICAgICAgIGlmIChjb3VudCgkY29va2llcykgPT0gMCB8fCAkcGFyYW1zWyJjb29raWVzIl0gPT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJGNvb2tpZSA9ICIiOwogICAgICAgICAgICBmb3JlYWNoKCRjb29raWVzIGFzICRjb29raWVOYW1lID0+ICRjb29raWVWYWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGNvb2tpZSAuPSAoJGNvb2tpZSA/ICI7ICIgOiAiIikuJGNvb2tpZU5hbWUuIj0iLiRjb29raWVWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0NPT0tJRSwgJGNvb2tpZSk7CiAgICAgICAgICAgICRjb29raWVFcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICBpZiAoJGNvb2tpZUVycm9yKQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoImRvd25sb2FkKCk6IHVuYWJsZSB0byBzZXQgY29va2llcyAoIi4kY29va2llRXJyb3IuIikiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICB9CgogICAgICAgIC8vX2N1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRE5TX0NBQ0hFX1RJTUVPVVQsIDApOwoKICAgICAgICAvLyByZXNpbSBheiBzYW0gcHJpIGFuYWx5emUgaGVhZGVycywgYXQgbXV6dSB1a2xhZGF0IGNvb2tpZXMgYXRkLi4uCiAgICAgICAgLyoKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAoJHBhcmFtc1siZm9sbG93UmVkaXJlY3QiXSA/IDEgOiAwKSk7IC8vIGplIHBvdHJlYmEgdGFtLCBrZGUgdG8gdnlob2RpIFJFRElSRUNUIHYgaGVhZGVycwogICAgICAgICRmb2xsb3dFcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIG9iX2VuZF9jbGVhbigpOwoKICAgICAgICBpZiAoJGZvbGxvd0Vycm9yICYmICEkcGFyYW1zWyJub1JlZGlyZWN0Il0gJiYgISRwYXJhbXNbImhlYWRlcnNPbmx5Il0gJiYgISRwYXJhbXNbInJlbW90ZURvd25sb2FkIl0pCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVjayBoZWFkZXJzIGZpcnN0CiAgICAgICAgICAgICRwYXJhbXMyID0gJHBhcmFtczsKICAgICAgICAgICAgJHBhcmFtczJbImhlYWRlcnNPbmx5Il0gPSB0cnVlOwogICAgICAgICAgICAkcGFyYW1zMlsiaGVhZGVyc0FzQXJyYXkiXSA9IHRydWU7CiAgICAgICAgICAgICRoZWFkZXJzID0gZG93bmxvYWQoJHVybCwgJHBvc3QsICRjb29raWVzLCAkcGFyYW1zMik7CiAgICAgICAgICAgIGlmICgkaGVhZGVyc1siTG9jYXRpb24iXSkgLy8gMzAxIHJlZGlyZWN0ZWQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKGRvd25sb2FkKCRoZWFkZXJzWyJMb2NhdGlvbiJdLCAkcG9zdCwgJGNvb2tpZXMsICRwYXJhbXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghaXNfYXJyYXkoJGhlYWRlcnMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICBpZiAodHJ1ZSB8fCAkcGFyYW1zWyJyZXF1ZXN0SGVhZGVycyJdKQogICAgICAgIHsKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMSU5GT19IRUFERVJfT1VULCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vZHVtcCgkcG9zdCk7CiAgICAgICAgLy8gaWYgSSB3YW50IHRvIHNlbmQgSlNPTiBkYXRhIGFzIHN0cmluZyAtIHVzZSAkcGFyYW1zWyJyZXF1ZXN0Il0gPSAiUE9TVCIKICAgICAgICBpZiAoJHBhcmFtc1sicmVxdWVzdCJdKQogICAgICAgIHsKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICRwYXJhbXNbInJlcXVlc3QiXSk7CiAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NURklFTERTLCAkcG9zdCk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtc1sicmVxdWVzdCJdKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcG9zdCk7CiAgICAgICAgICAgIC8vZWNobyAieCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCRwb3N0ICYmIGlzX3N0cmluZygkcG9zdCkpCiAgICAgICAgewogICAgICAgICAgICAvL2VjaG8gJHBvc3Q7IHJldHVybjsKICAgICAgICAgICAgLy9kdW1wKFRKU09OOjppc0pTT04oJHBvc3QpKTsKICAgICAgICAgICAgLy9pZiAoVEpTT046OmlzSlNPTigkcG9zdCkgPT0gInsiKSAKICAgICAgICAgICAgLy8gICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICJQVVQiKTsgICAvLyB2YWRpIHUgQml0Y29pblBheSAtIGt2dWxpIGNlbXUgdG8gYnlsbyBwcmVkdGltIG5ldmltIC0gdWRlbGF0IHByZXBpbmFjIGtkeXp0YWsgbWV0aG9kPVBVVAogICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgICAgIF9jdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NULCAxKTsgLy8gb3RhemthIHpkYSB0byBuZXZhZGkgdSBiaXRjb2lucGF5Pz8/IC0gYWxlIHUgUHJvUm96dm96IHRvIGplIHBvdHJlYmEKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwb3N0KTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcG9zdCk7IGV4aXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzX2FycmF5KCRwb3N0KSAmJiBjb3VudCgkcG9zdCkgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgX2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIDEpOwogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywgJHBvc3QpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBfY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgIkdFVCIpOwogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgJGNvbnRlbnQgPSBfY3VybF9leGVjKCRjdXJsKTsKICAgICAgICAvL3Zhcl9kdW1wKCRjb250ZW50KTsgZXhpdDsKICAgICAgICAvL2lmIChpc0RldmVsb3BlcigpICYmICRwb3N0KQogICAgICAgIC8vewogICAgICAgIC8vICAgIGVjaG8gJGNvbnRlbnQ7IGV4aXQ7CiAgICAgICAgLy99CiAgICAgICAgJGVycm9yID0gX2N1cmxfZXJyb3IoJGN1cmwpOwogICAgICAgIGlmICh0cnVlIHx8ICRwYXJhbXNbInJlcXVlc3RIZWFkZXJzIl0pCiAgICAgICAgewogICAgICAgICAgICAkaW5mbyA9IF9jdXJsX2dldGluZm8oJGN1cmwsIENVUkxJTkZPX0hFQURFUl9PVVQpOwogICAgICAgICAgICBpZiAoJHBhcmFtc1sibG9nIl0pCiAgICAgICAgICAgICAgICBfbG9nKCRpbmZvKTsKICAgICAgICAgICAgLy8kaW5mbyA9IF9jdXJsX2dldGluZm8oJGN1cmwpOwogICAgICAgIH0KICAgICAgICAkZXJyb3JOdW1iZXIgPSBfY3VybF9lcnJubygkY3VybCk7CiAgICAgICAgX2N1cmxfY2xvc2UoJGN1cmwpOwoKICAgICAgICBpZiAoZmFsc2UgJiYgaXNEZXZlbG9wZXIoKSkKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gdGltZSgpOwogICAgICAgICAgICB2YXJfZHVtcCgkY29udGVudCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbInJlcXVlc3RIZWFkZXJzIl0pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oJGluZm8pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRlcnJvciAmJiAkZXJyb3JOdW1iZXIgIT0gQ1VSTEVfT1BFUkFUSU9OX1RJTUVET1VUICYmICRlcnJvck51bWJlciAhPSBDVVJMRV9HT1RfTk9USElORyAmJiAkZXJyb3JOdW1iZXIgIT0gQ1VSTEVfUEFSVElBTF9GSUxFIC8qIHJ1bkluQmFja2dyb3VuZCAqLykKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlbW90ZSBkb3dubG9hZCBkaXNhYmxlZAogICAgICAgICAgICBpZiAoRkFMU0UgJiYgJHBhcmFtc1sicmVtb3RlRG93bmxvYWQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImRpc3BsYXlFcnJvcnMiXSAhPT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlJlbW90ZSBEb3dubG9hZCBFcnJvcjogIi4kZXJyb3IuIiAoIi4kdXJsLiIgLSAiLiRwYXJhbXNbInJlbW90ZURvd25sb2FkVXJsIl0uIikiLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChGQUxTRSAmJiAkZXJyb3JOdW1iZXIgPT0gQ1VSTEVfQ09VTEROVF9DT05ORUNUIHx8ICRlcnJvck51bWJlciA9PSBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMiA9ICRwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtczJbImhlYWRlcnNBc0FycmF5Il0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAkcG9zdDIgPSBhcnJheSgicGFyYW1zIiA9PiBzZXJpYWxpemUoJHBhcmFtczIpLCAicG9zdCIgPT4gc2VyaWFsaXplKCRwb3N0KSwgImNvb2tpZXMiID0+IHNlcmlhbGl6ZSgkY29va2llcyksICJ1cmwiID0+ICR1cmwpOwogICAgICAgICAgICAgICAgICAgICR1cmwyID0gImh0dHA6Ly93d3cudmlzdWFsLXBocC5jb20vdG9vbHMvZG93bmxvYWQucGhwIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRwYXJhbXMzID0gJHBhcmFtczsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtczNbInJlbW90ZURvd25sb2FkIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICRwYXJhbXMzWyJoZWFkZXJzQXNBcnJheSJdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtczNbInJlbW90ZURvd25sb2FkVXJsIl0gPSAkdXJsOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gZG93bmxvYWQoJHVybDIsICRwb3N0MiwgJGNvb2tpZXMsICRwYXJhbXMzKTsKICAgICAgICAgICAgICAgICAgICAkbm9IZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siZGlzcGxheUVycm9ycyJdICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkRvd25sb2FkIEVycm9yOiAiLiRlcnJvci4iICgiLiR1cmwuIikiLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRwYXJhbXNbInJlbW90ZURvd25sb2FkIl0pCiAgICAgICAgICAgIHJldHVybigkY29udGVudCk7CgogICAgICAgICRoZWFkZXJzID0gIiI7CiAgICAgICAgJGJvZHkgPSAiIjsKICAgICAgICAkcmV0ID0gIiI7CiAgICAgICAgJGhlYWRlcnNBID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1sicmF3Il0pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oJGNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoISRwYXJhbXNbImhlYWRlcnNPbmx5Il0gfHwgc3RyaXBvcygkY29udGVudCwgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIikgIT09IEZBTFNFKSAmJiAhJG5vSGVhZGVycykKICAgICAgICB7CiAgICAgICAgICAgICRib2R5UG9zID0gMDsKCiAgICAgICAgICAgICRhbnRpTG9vcCA9IDA7CiAgICAgICAgICAgIHdoaWxlKHN1YnN0cigkY29udGVudCwgJGJvZHlQb3MsIDUpID09PSAiSFRUUC8iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkYm9keVBvczEgPSBzdHJwb3MoJGNvbnRlbnQsICJcclxuXHJcbiIsICRib2R5UG9zKTsKICAgICAgICAgICAgICAgICRib2R5UG9zMiA9IHN0cnBvcygkY29udGVudCwgIlxuXG4iLCAkYm9keVBvcyk7CiAgICAgICAgICAgICAgICBpZiAoJGJvZHlQb3MxID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAkYm9keVBvczEgPSAxMDAwMDAwOwogICAgICAgICAgICAgICAgaWYgKCRib2R5UG9zMiA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgJGJvZHlQb3MyID0gMTAwMDAwMDsKCiAgICAgICAgICAgICAgICBpZiAoJGJvZHlQb3MxIDwgJGJvZHlQb3MyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRib2R5UG9zID0gJGJvZHlQb3MxKzQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHlQb3MgPSAkYm9keVBvczIrMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRhbnRpTG9vcCsrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJGFudGlMb29wID4gMTAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVjaG8gImRvd25sb2FkKCkgLSBleHRyYWN0IGhlYWRlcnMgYW5kIGJvZHkgbG9vcCI7IGV4aXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhlYWRlcnMgPSBzdWJzdHIoJGNvbnRlbnQsIDAsICRib2R5UG9zKTsKICAgICAgICAgICAgJGJvZHkgPSBzdWJzdHIoJGNvbnRlbnQsICRib2R5UG9zLyorJGhlYWRlckJyZWFrTGVuZ3RoKi8pOwoKICAgICAgICAgICAgJHJldCA9ICRib2R5OwogICAgICAgICAgICBpZiAoJHBhcmFtc1siaGVhZGVyc09ubHkiXSkKICAgICAgICAgICAgICAgICRyZXQgPSAkaGVhZGVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHBhcmFtc1siaGVhZGVyc09ubHkiXSkKICAgICAgICB7CiAgICAgICAgICAgICRoZWFkZXJzID0gJGNvbnRlbnQ7CgogICAgICAgICAgICAkcmV0ID0gJGNvbnRlbnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRyZXQgPSAkY29udGVudDsKICAgICAgICB9CgogICAgICAgIC8vdmFyX2R1bXAoJGhlYWRlcnMpOwogICAgICAgIGlmICgkaGVhZGVycykKICAgICAgICB7CiAgICAgICAgICAgICRfaGVhZGVycyA9ICRoZWFkZXJzOwogICAgICAgICAgICAkX2hlYWRlcnMgPSBzdHJfcmVwbGFjZSgiXHIiLCAiIiwgJF9oZWFkZXJzKTsKICAgICAgICAgICAgJF9oZWFkZXJzID0gZXhwbG9kZSgiXG4iLCAkX2hlYWRlcnMpOwoKICAgICAgICAgICAgLy8gcGFyc2UgaGVhZGVycwogICAgICAgICAgICAkaWkgPSAxOwogICAgICAgICAgICBmb3JlYWNoKCRfaGVhZGVycyBhcyAkaGVhZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoJGhlYWRlcik7CiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInxeSFRUUC9bXiBdKyAoW14gXSspICguKil8IiwgJGhlYWRlciwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyRoZWFkZXJzQVsic3RhdHVzIl0gPSAkbWF0Y2hlc1swXVsxXS4iICIuJG1hdGNoZXNbMF1bMl07CiAgICAgICAgICAgICAgICAgICAgLy8kaGVhZGVyc0FbInN0YXR1c0NvZGUiXSA9ICRtYXRjaGVzWzBdWzFdOwogICAgICAgICAgICAgICAgICAgICRoZWFkZXJzQVsic3RhdHVzIl0gPSAkbWF0Y2hlc1swXVsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcG9zID0gc3RycG9zKCRoZWFkZXIsICI6Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRwb3MgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlck5hbWUgPSBzdWJzdHIoJGhlYWRlciwgMCwgJHBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkZXJWYWx1ZSA9IHRyaW0oc3Vic3RyKCRoZWFkZXIsICRwb3MrMSwgc3RybGVuKCRoZWFkZXIpKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhlYWRlck5hbWUgPT0gIlNldC1Db29raWUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZGVyc0FbJGhlYWRlck5hbWUuIl8iLiRpaV0gPSAkaGVhZGVyVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaWkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZGVyc0FbJGhlYWRlck5hbWVdID0gJGhlYWRlclZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gb24gc2VydmVyIGh0dHA6Ly9kZW1vMS5wdWpjb3ZuYXdlYnUuY3ogdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBpcyByZXBsYWNlZCBieSByZWFsIHNpemUgb2YgY29udGVudCAtIGZpeGVkIHNlbmRpbmcgY3VzdG9tIFgtQ29udGVudC1MZW5ndGgKICAgICAgICAgICAgaWYgKCEkaGVhZGVyc0FbIkNvbnRlbnQtTGVuZ3RoIl0gJiYgJGhlYWRlcnNBWyJYLUNvbnRlbnQtTGVuZ3RoIl0pCiAgICAgICAgICAgICAgICAkaGVhZGVyc0FbIkNvbnRlbnQtTGVuZ3RoIl0gPSAkaGVhZGVyc0FbIlgtQ29udGVudC1MZW5ndGgiXTsKCiAgICAgICAgICAgICRoZWFkZXJzID0gc3RyX3JlcGxhY2UoIlxyIiwgIiIsICRoZWFkZXJzKTsKICAgICAgICAgICAgJGhlYWRlcnMgPSBleHBsb2RlKCJcbiIsICRoZWFkZXJzKTsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbImxvZyJdKQogICAgICAgICAgICAgICAgX2xvZygkaGVhZGVyc0EpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy92YXJfZHVtcCgkaGVhZGVyc0EpOwogICAgICAgICAgICAvLyBwYXJzZSBoZWFkZXJzCiAgICAgICAgICAgICRjb29raWVzMiA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJGhlYWRlcnNBIGFzICRoZWFkZXJOYW1lID0+ICRoZWFkZXJWYWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRoZWFkZXJOYW1lID09ICJDb250ZW50LUVuY29kaW5nIiAmJiAkaGVhZGVyVmFsdWUgPT0gImd6aXAiICYmICEkcGFyYW1zWyJoZWFkZXJzT25seSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZXQyID0gZ3VuemlwKCRyZXQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmV0MikKICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9ICRyZXQyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGhlYWRlck5hbWUpOwogICAgICAgICAgICAgICAgaWYgKCRoZWFkZXJOYW1lID09ICJDb250ZW50LUxlbmd0aCIpCiAgICAgICAgICAgICAgICAgICAgJGJvZHlMZW5ndGggPSAkaGVhZGVyVmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRoZWFkZXJOYW1lLCAiU2V0LUNvb2tpZSIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGhlYWRlclZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkaGVhZGVyVmFsdWUgPSBleHBsb2RlKCI7IiwgJGhlYWRlclZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkY29va2llID0gJGhlYWRlclZhbHVlWzBdOwogICAgICAgICAgICAgICAgICAgICRwb3NDID0gc3RycG9zKCRjb29raWUsICI9Iik7CiAgICAgICAgICAgICAgICAgICAgJGNvb2tpZU5hbWUgPSBzdWJzdHIoJGNvb2tpZSwgMCwgJHBvc0MpOwogICAgICAgICAgICAgICAgICAgICRjb29raWVWYWx1ZSA9IHN1YnN0cigkY29va2llLCAkcG9zQysxLCBzdHJsZW4oJGNvb2tpZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBmb3IgKCRpID0gMSA7ICRpIDwgY291bnQoJGhlYWRlclZhbHVlKSA7ICRpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkY29va2llID0gdHJpbSgkaGVhZGVyVmFsdWVbJGldKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHBvc0MgPSBzdHJwb3MoJGNvb2tpZSwgIj0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkY29va2llLCAwLCAkcG9zQykgPT0gImRvbWFpbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb29raWVEb21haW4gPSBzdWJzdHIoJGNvb2tpZSwgJHBvc0MrMSwgc3RybGVuKCRjb29raWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCEkY29va2llRG9tYWluIHx8ICRjb29raWVEb21haW4gPT0gIi4iKQogICAgICAgICAgICAgICAgICAgICAgICAkY29va2llRG9tYWluID0gJGRvbWFpbk5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRjb29raWVzMlskY29va2llRG9tYWluXVskY29va2llTmFtZV0gPSAkY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGNvb2tpZXMyKTsKICAgICAgICAgICAgZm9yZWFjaCgkY29va2llczIgYXMgJGNvb2tpZURvbWFpbiA9PiAkY29va2llMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbInNhdmVDb29raWVzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGNvb2tpZUZpbGUgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsIFRFTVBQQVRILiIvZG93bmxvYWQuIi4kY29va2llRG9tYWluLiIuY29va2llcyIpOwoKICAgICAgICAgICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJGNvb2tpZUZpbGUsIHNlcmlhbGl6ZShhcnJheV9tZXJnZSgkY29va2llcywgJGNvb2tpZTIpKSwgQ0hNT0RfV1JJVEUsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yZWFjaCgkY29va2llMiBhcyAkY29va2llTmFtZSA9PiAkY29va2llVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgJGhlYWRlcnNBWyJjb29raWVzIl1bJGNvb2tpZU5hbWVdID0gJGNvb2tpZVZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3JlYWNoKCRoZWFkZXJzQSBhcyAkaGVhZGVyTmFtZSA9PiAkaGVhZGVyVmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZGlyZWN0IEJVRyBmaXggLSBmb3VuZCBvbiBodHRwczovL3lvdXR1LmJlID0+IGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tIAogICAgICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJoZWFkZXJzT25seSJdICYmIHN0cnRvbG93ZXIoJGhlYWRlck5hbWUpID09ICJsb2NhdGlvbiIvKiAmJiBzdHJwb3MoJGhlYWRlcnNBWzBdLCAiIDMwIikqLyAmJiAkcGFyYW1zWyJmb2xsb3dSZWRpcmVjdCJdKSAvLyAzMDEsIDMwMiwgLi4uIDMwNwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGhlYWRlclZhbHVlLCAiaHR0cDoiKSAhPT0gMCAmJiBzdHJwb3MoJGhlYWRlclZhbHVlLCAiaHR0cHM6IikgIT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkbGlua0luZm8gPSBleHBsb2RlTGluaygkdXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlclZhbHVlID0gY2xlYW5MaW5rKCRsaW5rSW5mb1sicHJvdG9jb2wiXS4iOi8vIi4kbGlua0luZm9bImRvbWFpbiJdLiIvIi4kaGVhZGVyVmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyB2eXBudWwganNlbSBQT1NUIGt2dWxpIGNhbmlzIHdlYnUsIHZyYWNlbG8gbWkgc3RhdHVzIDUwMCBwbyByZWRpcmVjdHUgemUgc3RhdnUgMzAyCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCRoZWFkZXJzQVsic3RhdHVzIl0gPT0gIjMwMiIgfHwgJGhlYWRlcnNBWyJzdGF0dXMiXSA9PSAiMzAzIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGRvd25sb2FkKCRoZWFkZXJWYWx1ZSwgYXJyYXkoKS8qJHBvc3QqLywgJGNvb2tpZXMsICRwYXJhbXMpKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihkb3dubG9hZCgkaGVhZGVyVmFsdWUsICRwb3N0LCAkY29va2llcywgJHBhcmFtcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZWNobyAieCI7IGV4aXQ7CiAgICAgICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJoZWFkZXJzQXNBcnJheSJdKQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9ICRoZWFkZXJzQTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbImRlYnVnIl0pCiAgICAgICAgewogICAgICAgICAgICByZXdpbmQoJGRmKTsKICAgICAgICAgICAgJHJldCA9IHN0cmVhbV9nZXRfY29udGVudHMoJGRmKTsKICAgICAgICB9ICAgICAgICAKICAgICAgICAKICAgICAgICAvL2VjaG8gdGltZSgpOwogICAgICAgIC8vZWNobyAkdXJsOyBleGl0OwogICAgICAgIGlmICgkcGFyYW1zWyJsb2ciXSAhPT0gZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICAkcmV0ID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJhZnRlckRvd25sb2FkIiwgYXJyYXkoCiAgICAgICAgICAgICAgICAidXJsIiA9PiAkdXJsLAogICAgICAgICAgICAgICAgImdldCIgPT4gYXJyYXlfdmFsdWUoZXhwbG9kZUxpbmsoJHVybCksICJwYXJhbXMiKSwKICAgICAgICAgICAgICAgICJwb3N0IiA9PiAkcG9zdCwKICAgICAgICAgICAgICAgICJjb29raWVzIiA9PiAkY29va2llcywKICAgICAgICAgICAgICAgICJyZXNwb25zZSIgPT4gJHJldCwKICAgICAgICAgICAgICAgICJwYXJhbXMiID0+ICRwYXJhbXMsCiAgICAgICAgICAgICAgICAidGltZSIgPT4gZ2V0TWljcm90aW1lKCktJHRpbWVTdGFydCwKICAgICAgICAgICAgKSwgInJlc3BvbnNlIik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoImRvd25sb2FkKCk6IENVUkwgbm90IGluc3RhbGxlZC4uLiIsIG10RXJyb3IpOwogICAgfQp9CgpmdW5jdGlvbiByZWRpcmVjdCgkdXJsLCAkamF2YXNjcmlwdD1mYWxzZSwgJHRhcmdldD0iX3NlbGYiKQp7CiAgICB1c2VPYmplY3QoIkludGVybmV0Iik7CiAgICBfc2Vzc2lvbl93cml0ZV9jbG9zZSgpOwogICAgCiAgICBnbG9iYWwgJFJFRElSRUNUX0RJU0FCTEVEOwogICAgCiAgICBpZiAoJFJFRElSRUNUX0RJU0FCTEVEKQogICAgICAgIHJldHVybjsKICAgIAogICAgLy9lY2hvICR1cmw7CiAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAvL0VYSVQ7CiAgICAvL3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgIAogICAgaWYgKHRvQm9vbCgkX0dFVFsibm9SZWRpcmVjdCJdKSB8fCB0b0Jvb2woJF9QT1NUWyJub1JlZGlyZWN0Il0pKQogICAgICAgIHJldHVybjsKICAgICAgICAKICAgIGlmICghJHVybCkKICAgIHsKICAgICAgICBlY2hvICJGQVRBTCBFUlJPUjogcmVkaXJlY3QoKSBVUkwgaXMgZW1wdHkiOyAgICAKICAgICAgICBleGl0OwogICAgfQogICAgCiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIGdsb2JhbCAkY29yZU1lc3NhZ2VzLCAkY29yZVdhcm5pbmdNZXNzYWdlcywgJGNvcmVFcnJvck1lc3NhZ2VzOwogICAgCiAgICBpZiAoQURNSU4gJiYgJGNvcmVNZXNzYWdlcykKICAgIHsKICAgIH0KCiAgICAvL2lmICgkX1JFUVVFU1RbImRlYnVnUmVkaXJlY3QiXSA9PSAidHJ1ZSIgfHwgc3RycG9zKCRfQ09PS0lFWyhBRE1JTiA/ICJBZG1pbiIgOiAiIikuIlJlZGlyZWN0UEhQRGVidWdQYW5lbCJdLCAidjp0cnVlIikgIT09IEZBTFNFKQogICAgaWYgKCRfUkVRVUVTVFsiZGVidWdSZWRpcmVjdCJdID09ICJ0cnVlIiB8fCBzdHJwb3MoJF9DT09LSUVbIlJlZGlyZWN0UEhQRGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAkX3VybCA9ICR1cmw7CiAgICAgICAgJHVybCA9IHBhcnNlTGluaygkdXJsKTsKICAgICAgICAKICAgICAgICAvLyRodG1sIC49ICJSZWRpcmVjdCBVUkwgKHBhcnNlZCk6IDxhIGhyZWY9JyIuJHVybC4iJz4iLiR1cmwuIjwvYT48aHI+IjsKICAgICAgICAvLyRodG1sIC49ICJSZWRpcmVjdCBVUkwgKHNvdXJjZSk6IDxhIGhyZWY9JyIuJF91cmwuIic+Ii4kX3VybC4iPC9hPjxicj4iOwogICAgICAgIC8vJGh0bWwgLj0gIkN1cnJlbnQgVVJMOiA8YSBocmVmPSciLlVSTC4iJz4iLlVSTC4iPC9hPjxocj4iOwogICAgICAgIC8vJGh0bWwgLj0gIkZ1bmN0aW9uIGNhbGw6PGJyPiIuZ2V0RnVuY3Rpb25DYWxsKCkuIjxocj4iOwoKICAgICAgICAkaHRtbCA9ICIiOwoKICAgICAgICAvLyBwcm9jIHRvIHR1IHZvbGFtPyAtIHppc2thbmkgSFRNTCBwcmVzdW51dG8gYXogcG9kIHRvdG8KICAgICAgICAkaHRtbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25HZXRIdG1sQm9keSIsIGFycmF5KCJodG1sIiA9PiAkaHRtbCksICJodG1sIik7CiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uR2V0T3V0cHV0SHRtbCIsIGFycmF5KCJib2R5SHRtbCIgPT4gJGh0bWwpLCAiYm9keUh0bWwiKTsgCiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uU2hvdyIsIGFycmF5KCJodG1sIiA9PiAkaHRtbCksICJodG1sIik7CiAgICAgICAgJGh0bWwgPSBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoIm9uUGFyc2VGaW5hbEh0bWwiLCBhcnJheSgiaHRtbCIgPT4gJGh0bWwpLCAiaHRtbCIpOwogICAgICAgIAogICAgICAgICRodG1sIC49ICJSZWRpcmVjdCBVUkwgKHBhcnNlZCk6IDxhIGhyZWY9JyIuJHVybC4iJz4iLiR1cmwuIjwvYT48aHI+IjsKICAgICAgICAkaHRtbCAuPSAiUmVkaXJlY3QgVVJMIChzb3VyY2UpOiA8YSBocmVmPSciLiRfdXJsLiInPiIuJF91cmwuIjwvYT48YnI+IjsKICAgICAgICAkaHRtbCAuPSAiQ3VycmVudCBVUkw6IDxhIGhyZWY9JyIuVVJMLiInPiIuVVJMLiI8L2E+PGhyPiI7CiAgICAgICAgJGh0bWwgLj0gIkZ1bmN0aW9uIGNhbGw6PGJyPiIuZ2V0RnVuY3Rpb25DYWxsKCkuIjxocj4iOwogICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIAogICAgICAgIGdsb2JhbCAkX19zY3JpcHRTdGFydFRpbWUsICRfX3NjcmlwdFN0YXJ0VGltZURlY3JlbWVudDsKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJfX190aW1lX19fIiwgcm91bmQobWljcm90aW1lKHRydWUpIC0gJF9fc2NyaXB0U3RhcnRUaW1lIC0gJF9fc2NyaXB0U3RhcnRUaW1lRGVjcmVtZW50LCAyKS4icyIsICRodG1sKTsKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCJfX19tZW1vcnlfX18iLCByb3VuZCgoZ2V0TWVtb3J5VXNhZ2UoKS0kX19zY3JpcHRTdGFydE1lbW9yeURlY3JlbWVudCkvMTAyNC8xMDI0LCAwKS4iTUIiLCAkaHRtbCk7CiAgICAgICAgCiAgICAgICAgLy8gVE9ETwogICAgICAgIC8qCiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBpbmNsdWRlKENPUkVQQVRILiJjb3JlL3dlYi5oZWFkZXIucGhwIik7CiAgICAgICAgZWNobyAiRGVidWcgUmVkaXJlY3Q6IDxhIGhyZWY9JyIuJHVybC4iJz4iLiR1cmwuIjwvYT4iOwogICAgICAgIGluY2x1ZGUoQ09SRVBBVEguImNvcmUvd2ViLmZvb3Rlci5waHAiKTsKICAgICAgICAkaHRtbE91dHB1dCA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIG9iX2VuZF9jbGVhbigpOwoKICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoPGJvZHlbXj5dKj4pfGltcyIsICRodG1sT3V0cHV0LCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgLy8kaHRtbE91dHB1dCA9IHN0cl9yZXBsYWNlKCI8L2JvZHk+IiwgZ2V0T2JqZWN0KCJEZWJ1ZyIpLT5nZXRXZWJDb250ZW50KCRodG1sT3V0cHV0KS4iPC9ib2R5PiIsICRodG1sT3V0cHV0KTsKICAgICAgICAgICAgJGh0bWxPdXRwdXQgPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXVsxXSwgJG1hdGNoZXNbMF1bMV0uZ2V0T2JqZWN0KCJEZWJ1ZyIpLT5nZXRXZWJDb250ZW50KCRodG1sT3V0cHV0KSwgJGh0bWxPdXRwdXQpOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgICAgIGVjaG8gJGh0bWw7CiAgICAgICAgZXhpdDsKICAgIH0KICAgIAogICAgLy8gY2xlYXIgYWxsIGxvY2tzCiAgICBnZXRPYmplY3QoIkxvY2siKS0+dW5sb2NrQWxsKCk7IAogICAgCiAgICBpZiAodHJ1ZSAvKiRjb3JlV2FybmluZ01lc3NhZ2VzID09ICIiICYmICRjb3JlRXJyb3JNZXNzYWdlcyA9PSAiIiovKQogICAgewogICAgICAgIGlmICgkamF2YXNjcmlwdCkKICAgICAgICB7CiAgICAgICAgICAgICRsaW5rSW5mbyA9IGV4cGxvZGVMaW5rKHBhcnNlTGluaygkdXJsKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBlY2hvICI8aHRtbD4iOwogICAgICAgICAgICBlY2hvICI8Ym9keT4iOwogICAgICAgICAgICBlY2hvICI8Zm9ybSBpZD0ncmVkaXJlY3QnIGFjdGlvbj0nIi5wYXJzZUxpbmsoJHVybCkuIicgbWV0aG9kPSdQT1NUJyB0YXJnZXQ9JyIuJHRhcmdldC4iJz4iOyAvLyBjZWxvdSBVUkwgcG90cmVidWp1IGt2dWxpIHNhdmVBbmRFZGl0TmV4dCAtIGt2dWxpIEhUVFBfUkVGRVJFUgogICAgICAgICAgICBpZiAoQURNSU4gJiYgJGNvcmVNZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYnViYmxlTWVzc2FnZVRleHQnIHZhbHVlPSciLnVybGVuY29kZSgkY29yZU1lc3NhZ2VzKS4iJyAvPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPC9mb3JtPiI7CgogICAgICAgICAgICBlY2hvICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+IjsKICAgICAgICAgICAgZWNobyAidmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVkaXJlY3QnKTsiOwogICAgICAgICAgICAvL2VjaG8gImlmICh3aW5kb3cucGFyZW50ICE9IHRvcCkiOyAvLyAxNk0gLSBmcmFtZQogICAgICAgICAgICAvL2VjaG8gIiAgICBmb3JtLnRhcmdldD0nX3BhcmVudCc7IjsKICAgICAgICAgICAgLy9lY2hvICJlbHNlIjsKICAgICAgICAgICAgLy9lY2hvICIgICAgZm9ybS50YXJnZXQ9J190b3AnOyI7CiAgICAgICAgICAgIGVjaG8gImZvcm0uc3VibWl0KCk7IjsKICAgICAgICAgICAgZWNobyAiPC9zY3JpcHQ+IjsKICAgICAgICAgICAgZWNobyAiPC9ib2R5PiI7CiAgICAgICAgICAgIGVjaG8gIjwvaHRtbD4iOwogICAgICAgICAgICAKICAgICAgICAgICAgZWNobyAiWCI7IGV4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICBleGl0OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFETUlOICYmICghZGVmaW5lZCgiT0ZGTElORSIpIHx8ICFPRkZMSU5FKSkKICAgICAgICAgICAgICAgICR1cmwgPSBwYXJzZUxpbmsoJHVybCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBQUk9DPz8/PwogICAgICAgICAgICAkdXJsID0gaHRtbF9lbnRpdHlfZGVjb2RlKCR1cmwpOwogICAgICAgICAgICAKICAgICAgICAgICAgaGVhZGVyKCJIVFRQLzEuMSAzMDEgTW92ZWQgUGVybWFuZW50bHkiKTsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogIi4kdXJsKTsKICAgICAgICAgICAgaGVhZGVyKCJDb25uZWN0aW9uOiBjbG9zZSIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9oZWFkZXIoIkxvY2F0aW9uOiAiLiR1cmwpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgLyplY2hvICJmdW5jdGlvbiByZWRpcmVjdCgpOiBjYW5ub3QgcmVkaXJlY3QsIGJlY2F1c2Ugc29tZSBlcnJvcnMgb3Igd2FybmluZ3Mgb2NjdXJlZC4iOyovCiAgICB9CiAgICAKfQoKZnVuY3Rpb24gdXJsZGVjb2RlUmVjdXJzaXZlKCRhKQp7CiAgICAkX2NvdW50ZXJzID0gYXJyYXkoKTsKICAgIAogICAgaWYgKGlzX2FycmF5KCRhKSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRhIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzdHJwb3MoJGtleSwgIltdIikgIT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX2tleSA9ICRrZXk7CiAgICAgICAgICAgICAgICAka2V5ID0gc3RyX3JlcGxhY2UoIltdIiwgIlsiLigoaW50KSRfY291bnRlcnNbJF9rZXldKS4iXSIsICRrZXkpOwogICAgICAgICAgICAgICAgJF9jb3VudGVyc1skX2tleV0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJGFbJGtleV0gPSB1cmxkZWNvZGVSZWN1cnNpdmUoJHZhbCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRhKSkKICAgICAgICAkYSA9IHVybGRlY29kZSgkYSk7CiAgICAKICAgIHJldHVybigkYSk7Cn0KCmZ1bmN0aW9uIGV4cGxvZGVMaW5rKCRsaW5rKQp7CiAgICAkbGlua0luZm8gPSBhcnJheSgpOwogICAgJGxpbmtJbmZvWyJwYXJhbXMiXSA9IGFycmF5KCk7CiAgICAKICAgICRsaW5rQSA9IGV4cGxvZGUoIj8iLCAkbGluayk7CiAgICBpZiAoJGxpbmtBWzFdKQogICAgewogICAgICAgICRsaW5rQiA9IGV4cGxvZGUoIiMiLCAkbGlua0FbMV0pOwogICAgICAgIC8vJGxpbmtJbmZvWyJwYXJhbXMiXSA9IGV4dHJhY3RQYXJhbXModXJsZGVjb2RlKCRsaW5rQlswXSksICImIiwgZmFsc2UpOwogICAgICAgIC8vZ2xvYmFsICR4eHg7ICR4eHggPSB0cnVlOwogICAgICAgICRsaW5rSW5mb1sicGFyYW1zIl0gPSBleHRyYWN0UGFyYW1zKCRsaW5rQlswXSwgIiYiLCBmYWxzZSk7CiAgICAgICAgaWYgKHRydWUpCiAgICAgICAgewogICAgICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdID0gdXJsZGVjb2RlUmVjdXJzaXZlKCRsaW5rSW5mb1sicGFyYW1zIl0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBuZWVkcyB0byBiZSByZWN1cnNpdmUKICAgICAgICAgICAgZm9yZWFjaCgkbGlua0luZm9bInBhcmFtcyJdIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkdmFsKSkKICAgICAgICAgICAgICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdWyRrZXldID0gdXJsZGVjb2RlKCRsaW5rSW5mb1sicGFyYW1zIl1bJGtleV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgaWYgKCRsaW5rQlswXSkKICAgICAgICAgICAgJGxpbmtJbmZvWyJzcGFyYW1zIl0gPSAkbGlua0JbMF07CiAgICAgICAgaWYgKCRsaW5rQlsxXSkKICAgICAgICAgICAgJGxpbmtJbmZvWyJhbmNob3IiXSA9ICRsaW5rQlsxXTsKICAgIH0KCiAgICBpZiAoc3RycG9zKCRsaW5rQVswXSwgIjoiKSAhPT0gRkFMU0UgfHwgc3RycG9zKCRsaW5rQVswXSwgIi8vIikgPT09IDApCiAgICB7CiAgICAgICAgJGxpbmtQID0gZXhwbG9kZSgiOiIsICRsaW5rQVswXSk7CiAgICAgICAgaWYgKHN0cnBvcygkbGlua0FbMF0sICIvLyIpID09PSAwKQogICAgICAgIHsKICAgICAgICAgICAgJGxpbmtQWzFdID0gJGxpbmtQWzBdOwogICAgICAgICAgICAkbGlua1BbMF0gPSAiIjsKICAgICAgICB9CiAgICAgICAgJGxpbmtJbmZvWyJwcm90b2NvbCJdID0gJGxpbmtQWzBdOwogICAgICAgIGlmIChzdHJwb3MoJGxpbmtBWzBdLCAibWFpbHRvOiIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIC8vJGxpbmtJbmZvWyJ2YWx1ZSJdID0gJGxpbmtBWzFdOwogICAgICAgICAgICAkbGlua0luZm9bInZhbHVlIl0gPSAkbGlua1BbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0cnBvcygkbGlua0FbMF0sICJqYXZhc2NyaXB0OiIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIC8vJGxpbmtJbmZvWyJ2YWx1ZSJdID0gJGxpbmtBWzFdOwogICAgICAgICAgICAkbGlua0luZm9bInZhbHVlIl0gPSAkbGlua1BbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0cnBvcygkbGlua1BbMV0sICIvLyIpID09PSAwKQogICAgICAgIHsKICAgICAgICAgICAgJGxpbmtYID0gZXhwbG9kZSgiLyIsIHN1YnN0cigkbGlua1BbMV0sIDIsIHN0cmxlbigkbGlua1BbMV0pKSk7CiAgICAgICAgICAgICRsaW5rSW5mb1siZG9tYWluIl0gPSAkbGlua1hbMF07CiAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRsaW5rWCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRsaW5rSW5mb1sidmFsdWUiXSA9ICRsaW5rUFsxXTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJGxpbmtYID0gZXhwbG9kZSgiLyIsICRsaW5rQVswXSk7CiAgICB9CiAgICAKICAgIGlmICgkbGlua1gpCiAgICB7CiAgICAgICAgaWYgKCRsaW5rQVswXVtzdHJsZW4oJGxpbmtBWzBdKS0xXSAhPSAiLyIpCiAgICAgICAgewogICAgICAgICAgICAkbGlua0luZm9bImZpbGUiXSA9ICRsaW5rWFtjb3VudCgkbGlua1gpLTFdOwogICAgICAgICAgICBhcnJheV9wb3AoJGxpbmtYKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGxpbmtJbmZvWyJwYXRoIl0gPSAoY291bnQoJGxpbmtYKSB8fCAkbGlua0luZm9bImRvbWFpbiJdID8gY2xlYW5MaW5rKCIvIi5pbXBsb2RlKCIvIiwgJGxpbmtYKS4iLyIpIDogIiIpOwogICAgfQoKICAgIGlmICgkbGlua0luZm9bImZpbGUiXSkKICAgIHsKICAgICAgICAkbGlua0luZm9bInRhYmxlIl0gPSBzdHJfcmVwbGFjZSgiLiIuZ2V0RmlsZUV4dCgkbGlua0luZm9bImZpbGUiXSksICIiLCAkbGlua0luZm9bImZpbGUiXSk7CiAgICB9CgogICAgcmV0dXJuKCRsaW5rSW5mbyk7Cn0KCmZ1bmN0aW9uIGltcGxvZGVMaW5rKCRsaW5rSW5mbykKewogICAgLy9wcm9jZXNzRXJyb3IoMSk7CiAgICAvL3Byb2Nlc3NFcnJvcihQUk9UT0NPTCk7CiAgICAvL3Byb2Nlc3NFcnJvcihET01BSU4pOwogICAgLy9wcm9jZXNzRXJyb3IoUFJPSkVDVFVSTCk7CiAgICAvL3Zhcl9kdW1wKFBST1RPQ09MKTsKICAgIGlmICghJGxpbmtJbmZvWyJwcm90b2NvbCJdKQogICAgICAgICRsaW5rSW5mb1sicHJvdG9jb2wiXSA9IFBST1RPQ09MOwogICAgCiAgICAkbGluayA9ICIiOwogICAgaWYgKCRsaW5rSW5mb1sidmFsdWUiXSkKICAgIHsKICAgICAgICAkbGluayA9ICRsaW5rSW5mb1sicHJvdG9jb2wiXS4iOiIuJGxpbmtJbmZvWyJ2YWx1ZSJdOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICgkbGlua0luZm9bImRvbWFpbiJdKQogICAgICAgIHsKICAgICAgICAgICAgJGxpbmsgPSAkbGlua0luZm9bInByb3RvY29sIl0uIjovLyIuJGxpbmtJbmZvWyJkb21haW4iXS4iLyI7CiAgICAgICAgfQoKICAgICAgICAkbGluayAuPSAkbGlua0luZm9bInBhdGgiXS4kbGlua0luZm9bImZpbGUiXTsKICAgICAgICAvL2lmIChzdHJwb3MoJGxpbmtJbmZvWyJwYXRoIl0sICJzdG9jayIpICE9PSBGQUxTRSkKICAgICAgICAvL3sKICAgICAgICAvLyAgICB2YXJfZHVtcCgkbGlua0luZm8pOwogICAgICAgIC8vICAgIGV4aXQ7CiAgICAgICAgLy99CiAgICAgICAgCiAgICAgICAgLy9pZiAoaXNfYXJyYXkoJGxpbmtJbmZvWyJwYXJhbXMiXSkpCiAgICAgICAgaWYgKGlzc2V0KCRsaW5rSW5mb1sicGFyYW1zIl0pKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCRsaW5rSW5mb1sicGFyYW1zIl0pOwogICAgICAgICAgICBmb3JlYWNoKCRsaW5rSW5mb1sicGFyYW1zIl0gYXMgJGtleSA9PiAkdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNfYm9vbCgkdmFsKSkKICAgICAgICAgICAgICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdWyRrZXldID0gKCRsaW5rSW5mb1sicGFyYW1zIl1bJGtleV0gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vJGxpbmtJbmZvWyJwYXJhbXMiXVska2V5XSA9IHVybGVuY29kZSgkbGlua0luZm9bInBhcmFtcyJdWyRrZXldKTsKICAgICAgICAgICAgICAgIC8vIHVybGVuY29kZSBzZSBwb3V6aWplIHYgZ2V0UGFyYW1zQXNMaW5rCiAgICAgICAgICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdWyRrZXldID0gJGxpbmtJbmZvWyJwYXJhbXMiXVska2V5XTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIC8vJGxpbmsgLj0gIj8iLmltcGxvZGVQYXJhbXMoJGxpbmtJbmZvWyJwYXJhbXMiXSwgIiYiKTsKICAgICAgICAgICAgaWYgKCRsaW5rSW5mb1sicGFyYW1zIl0pCiAgICAgICAgICAgICAgICAkbGluayAuPSAiPyIuZ2V0UGFyYW1zQXNMaW5rKCRsaW5rSW5mb1sicGFyYW1zIl0pOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkbGlua0luZm9bInNwYXJhbXMiXSkKICAgICAgICB7CiAgICAgICAgICAgICRsaW5rIC49ICI/Ii4kbGlua0luZm9bInNwYXJhbXMiXTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCRsaW5rSW5mb1siYW5jaG9yIl0pCiAgICAgICAgewogICAgICAgICAgICAkbGluayAuPSAiIyIuJGxpbmtJbmZvWyJhbmNob3IiXTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybihjbGVhbkxpbmsoJGxpbmspKTsKfQoKZnVuY3Rpb24gYXBwZW5kTGluaygkbGluaywgJHBhcmFtcykKewogICAgaWYgKCFpc19hcnJheSgkcGFyYW1zKSkKICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zLCAiJiIsIGZhbHNlKTsKICAgICAgICAKICAgICRsaW5rSW5mbyA9IGV4cGxvZGVMaW5rKCRsaW5rKTsKICAgICRsaW5rSW5mb1sicGFyYW1zIl0gPSBhcnJheV9tZXJnZSgkbGlua0luZm9bInBhcmFtcyJdLCAkcGFyYW1zKTsKICAgIAogICAgcmV0dXJuKGltcGxvZGVMaW5rKCRsaW5rSW5mbykpOwp9CgpmdW5jdGlvbiBnZXREb3dubG9hZFVybEZyb21QYXRoKCRwYXRoKQp7CiAgICAkdXJsID0gUFJPSkVDVFVSTC4iZG93bmxvYWQucGhwP2ZpbGU9Ii51cmxlbmNvZGUoJHBhdGgpOwogICAgCiAgICByZXR1cm4oJHVybCk7Cn0KCmZ1bmN0aW9uIF9zZXRDb29raWUoJG5hbWUsICR2YWx1ZSwgJGV4cGlyZT0wLCAkcGF0aD0iIiwgJGRvbWFpbj0iIiwgJHNlY3VyZT1mYWxzZSwgJGh0dHBvbmx5PWZhbHNlKQp7CiAgICBnbG9iYWwgJENPT0tJRVNfRElTQUJMRUQ7CiAgICBpZiAoJENPT0tJRVNfRElTQUJMRUQpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICAvL3NldGNvb2tpZSgkbmFtZSwgJHZhbHVlLCAoJGV4cGlyZSA/IHRpbWUoKStfc3RydG90aW1lKCRleHBpcmUpIDogMCksICgkcGF0aCA/ICRwYXRoIDogIi8iKSwgKCRkb21haW4gPyAkZG9tYWluIDogQ09PS0lFRE9NQUlOKSwgJHNlY3VyZSwgJGh0dHBvbmx5KTsKICAgIC8vIGF0IHRvIG5lcHJldmFkaSBtZXplcnkgbmEgKwogICAgc2V0cmF3Y29va2llKCRuYW1lLCByYXd1cmxlbmNvZGUoJHZhbHVlKSwgKCRleHBpcmUgPyB0aW1lKCkrX3N0cnRvdGltZSgkZXhwaXJlKSA6IDApLCAoJHBhdGggPyAkcGF0aCA6ICIvIiksICgkZG9tYWluID8gJGRvbWFpbiA6IENPT0tJRURPTUFJTiksICRzZWN1cmUsICRodHRwb25seSk7CgogICAgaWYgKG9iamVjdEV4aXN0cygiRXZlbnRzIikgJiYgZ2V0T2JqZWN0KCJFdmVudHMiKS0+aGFzRXZlbnRzKCJhZnRlclNldENvb2tpZSIpKQogICAgewogICAgICAgIGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygiYWZ0ZXJTZXRDb29raWUiLCBhcnJheSgKICAgICAgICAgICAgIm5hbWUiID0+ICRuYW1lLAogICAgICAgICAgICAidmFsdWUiID0+ICR2YWx1ZSwKICAgICAgICAgICAgImV4cGlyZSIgPT4gJGV4cGlyZSwKICAgICAgICAgICAgInBhdGgiID0+ICRwYXRoLAogICAgICAgICAgICAiZG9tYWluIiA9PiAkZG9tYWluLAogICAgICAgICAgICAic2VjdXJlIiA9PiAkc2VjdXJlLAogICAgICAgICAgICAiaHR0cG9ubHkiID0+ICRodHRwb25seSwKICAgICAgICApKTsKICAgIH0KfQoKZnVuY3Rpb24gX2RlbGV0ZUNvb2tpZSgkbmFtZSwgJHBhdGg9IiIsICRkb21haW49IiIsICRzZWN1cmU9ZmFsc2UsICRodHRwb25seT1mYWxzZSkKewogICAgZ2xvYmFsICRDT09LSUVTX0RJU0FCTEVEOwogICAgaWYgKCRDT09LSUVTX0RJU0FCTEVEKQogICAgICAgIHJldHVybjsKICAgIAogICAgLy9zZXRjb29raWUoJG5hbWUsICR2YWx1ZSwgKCRleHBpcmUgPyB0aW1lKCkrX3N0cnRvdGltZSgkZXhwaXJlKSA6IDApLCAoJHBhdGggPyAkcGF0aCA6ICIvIiksICgkZG9tYWluID8gJGRvbWFpbiA6IENPT0tJRURPTUFJTiksICRzZWN1cmUsICRodHRwb25seSk7CiAgICAvLyBhdCB0byBuZXByZXZhZGkgbWV6ZXJ5IG5hICsKICAgIHNldHJhd2Nvb2tpZSgkbmFtZSwgIiIsICgkZXhwaXJlID8gdGltZSgpK19zdHJ0b3RpbWUoJGV4cGlyZSkgOiAwKSwgKCRwYXRoID8gJHBhdGggOiAiLyIpLCAoJGRvbWFpbiA/ICRkb21haW4gOiBDT09LSUVET01BSU4pLCAkc2VjdXJlLCAkaHR0cG9ubHkpOwp9CgpnbG9iYWwgJGh0dHBSZXNwb25zZUNvZGVzOwokaHR0cFJlc3BvbnNlQ29kZXMgPSBhcnJheSgKICAgIDEwMCA9PiAnQ29udGludWUnLAogICAgMTAxID0+ICdTd2l0Y2hpbmcgUHJvdG9jb2xzJywKICAgIDEwMiA9PiAnUHJvY2Vzc2luZycsCiAgICAyMDAgPT4gJ09LJywKICAgIDIwMSA9PiAnQ3JlYXRlZCcsCiAgICAyMDIgPT4gJ0FjY2VwdGVkJywKICAgIDIwMyA9PiAnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLAogICAgMjA0ID0+ICdObyBDb250ZW50JywKICAgIDIwNSA9PiAnUmVzZXQgQ29udGVudCcsCiAgICAyMDYgPT4gJ1BhcnRpYWwgQ29udGVudCcsCiAgICAyMDcgPT4gJ011bHRpLVN0YXR1cycsCiAgICAzMDAgPT4gJ011bHRpcGxlIENob2ljZXMnLAogICAgMzAxID0+ICdNb3ZlZCBQZXJtYW5lbnRseScsCiAgICAzMDIgPT4gJ0ZvdW5kJywKICAgIDMwMyA9PiAnU2VlIE90aGVyJywKICAgIDMwNCA9PiAnTm90IE1vZGlmaWVkJywKICAgIDMwNSA9PiAnVXNlIFByb3h5JywKICAgIDMwNiA9PiAnU3dpdGNoIFByb3h5JywKICAgIDMwNyA9PiAnVGVtcG9yYXJ5IFJlZGlyZWN0JywKICAgIDQwMCA9PiAnQmFkIFJlcXVlc3QnLAogICAgNDAxID0+ICdVbmF1dGhvcml6ZWQnLAogICAgNDAyID0+ICdQYXltZW50IFJlcXVpcmVkJywKICAgIDQwMyA9PiAnRm9yYmlkZGVuJywKICAgIDQwNCA9PiAnTm90IEZvdW5kJywKICAgIDQwNSA9PiAnTWV0aG9kIE5vdCBBbGxvd2VkJywKICAgIDQwNiA9PiAnTm90IEFjY2VwdGFibGUnLAogICAgNDA3ID0+ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsCiAgICA0MDggPT4gJ1JlcXVlc3QgVGltZW91dCcsCiAgICA0MDkgPT4gJ0NvbmZsaWN0JywKICAgIDQxMCA9PiAnR29uZScsCiAgICA0MTEgPT4gJ0xlbmd0aCBSZXF1aXJlZCcsCiAgICA0MTIgPT4gJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLAogICAgNDEzID0+ICdSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UnLAogICAgNDE0ID0+ICdSZXF1ZXN0LVVSSSBUb28gTG9uZycsCiAgICA0MTUgPT4gJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLAogICAgNDE2ID0+ICdSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlJywKICAgIDQxNyA9PiAnRXhwZWN0YXRpb24gRmFpbGVkJywKICAgIDQxOCA9PiAnSVwnbSBhIHRlYXBvdCcsCiAgICA0MjIgPT4gJ1VucHJvY2Vzc2FibGUgRW50aXR5JywKICAgIDQyMyA9PiAnTG9ja2VkJywKICAgIDQyNCA9PiAnRmFpbGVkIERlcGVuZGVuY3knLAogICAgNDI1ID0+ICdVbm9yZGVyZWQgQ29sbGVjdGlvbicsCiAgICA0MjYgPT4gJ1VwZ3JhZGUgUmVxdWlyZWQnLAogICAgNDI5ID0+ICdUb28gTWFueSBSZXF1ZXN0cycsCiAgICA0NDkgPT4gJ1JldHJ5IFdpdGgnLAogICAgNDUwID0+ICdCbG9ja2VkIGJ5IFdpbmRvd3MgUGFyZW50YWwgQ29udHJvbHMnLAogICAgNTAwID0+ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLAogICAgNTAxID0+ICdOb3QgSW1wbGVtZW50ZWQnLAogICAgNTAyID0+ICdCYWQgR2F0ZXdheScsCiAgICA1MDMgPT4gJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAogICAgNTA0ID0+ICdHYXRld2F5IFRpbWVvdXQnLAogICAgNTA1ID0+ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsCiAgICA1MDYgPT4gJ1ZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzJywKICAgIDUwNyA9PiAnSW5zdWZmaWNpZW50IFN0b3JhZ2UnLAogICAgNTA5ID0+ICdCYW5kd2lkdGggTGltaXQgRXhjZWVkZWQnLAogICAgNTEwID0+ICdOb3QgRXh0ZW5kZWQnCik7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaHR0cF9yZXNwb25zZV9jb2RlJykpIAp7CiAgICBmdW5jdGlvbiBodHRwX3Jlc3BvbnNlX2NvZGUoJGNvZGUgPSBOVUxMKSAKICAgIHsKICAgICAgICBpZiAoJGNvZGUgIT09IE5VTEwpIAogICAgICAgIHsKICAgICAgICAgICAgJHRleHQgPSBnZXRIdHRwUmVzcG9uc2VDb2RlRGVzY3JpcHRpb24oJGNvZGUpOwogICAgICAgICAgICBpZiAoJHRleHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRwcm90b2NvbCA9IChpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1BST1RPQ09MJ10pID8gJF9TRVJWRVJbJ1NFUlZFUl9QUk9UT0NPTCddIDogJ0hUVFAvMS4wJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJHByb3RvY29sIC4gJyAnIC4gJGNvZGUgLiAnICcgLiAkdGV4dCk7CgogICAgICAgICAgICAgICAgJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddID0gJGNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoJ2h0dHBfcmVzcG9uc2VfY29kZSgpIC0gdW5rbm93biBodHRwIHN0YXR1cyBjb2RlICInIC4gaHRtbGVudGl0aWVzKCRjb2RlKSAuICciJywgbXRFcnJvcik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgJGNvZGUgPSAoaXNzZXQoJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddKSA/ICRHTE9CQUxTWydodHRwX3Jlc3BvbnNlX2NvZGUnXSA6IDIwMCk7CgogICAgICAgIHJldHVybiAkY29kZTsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0SHR0cFJlc3BvbnNlQ29kZURlc2NyaXB0aW9uKCRjb2RlKQp7ICAgCiAgICBnbG9iYWwgJGh0dHBSZXNwb25zZUNvZGVzOwogICAgJHRleHQgPSAkaHR0cFJlc3BvbnNlQ29kZXNbKGludCkkY29kZV07CiAgICAKICAgIHJldHVybigkdGV4dCk7Cn0KCmZ1bmN0aW9uIGVycm9yUGFnZSgkY29kZSwgJGZ1bGxQYWdlPWZhbHNlKQp7ICAgICAgICAgICAgICAgIAogICAgZ2xvYmFsICR0YWJsZU5hbWUsICRzdHlsZSwgJGVycm9yUGFnZVRpdGxlLCAkZXJyb3JGdWxsUGFnZSwgJGVycm9yUGFnZUNvZGUsICRlcnJvclBhZ2VEZXNjcmlwdGlvbiwgJGVycm9yUGFnZVRleHQsICRNYWluVGFibGU7CiAgICAgICAgICAgICAgICAKICAgIGdsb2JhbCAkaHRtbENhY2hlOwogICAgJGh0bWxDYWNoZSA9IGZhbHNlOwogICAgCiAgICAkZXJyb3JQYWdlQ29kZSA9ICRjb2RlOwogICAgJGVycm9yUGFnZURlc2NyaXB0aW9uID0gdHJhbnNsYXRlKGdldEh0dHBSZXNwb25zZUNvZGVEZXNjcmlwdGlvbigkZXJyb3JQYWdlQ29kZSkpOyAKICAgICRlcnJvclBhZ2VUZXh0ID0gdHJhbnNsYXRleCgiRXJyb3IiLiRlcnJvclBhZ2VDb2RlLiJUZXh0Iik7IAogICAgCiAgICBodHRwX3Jlc3BvbnNlX2NvZGUoJGVycm9yUGFnZUNvZGUpOwoKICAgIGFkZFN0eWxlKGZpcnN0X3ZhbHVlKCRzdHlsZSwgImRlZmF1bHQiKSk7CiAgICBhcHBlbmRTdHlsZSgiZXJyb3JfcGFnZSIpOwogICAgCiAgICAkdGFibGVOYW1lID0gImVycm9yX3BhZ2UiOwogICAgJE1haW5UYWJsZSA9IGdldFRhYmxlKCJpbmRleCIpOwogICAgJGVycm9yUGFnZVRpdGxlID0gJGVycm9yUGFnZUNvZGUuIiAtICIuJGVycm9yUGFnZURlc2NyaXB0aW9uOwoKICAgIGlmICgkZnVsbFBhZ2UpCiAgICB7CiAgICAgICAgZ2xvYmFsICRodG1sQ2FjaGU7CiAgICAgICAgJGh0bWxDYWNoZSA9IGZhbHNlOwogICAgICAgIAogICAgICAgICRlcnJvckZ1bGxQYWdlID0gdHJ1ZTsKICAgICAgICAkTGF5b3V0ID0gZ2V0T2JqZWN0KCJMYXlvdXRzIiktPmdldExheW91dCgiZ2xvYmFsIik7CiAgICAgICAgaWYgKCRMYXlvdXQpCiAgICAgICAgewogICAgICAgICAgICAkaHRtbCAuPSAiPGh0bWwgbGFuZz1cIiIuZ2V0SVNPTGFuZ3VhZ2UoKS4iXCI+XG4iOwogICAgICAgICAgICAkaHRtbCAuPSAiPG1ldGEgY2hhcnNldD1cIiIuZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5zaXRlQ2hhcnNldC4iXCIgLz5cbiI7ICAKICAgICAgICAgICAgJGh0bWwgLj0gIjxoZWFkPlxuIjsKICAgICAgICAgICAgJGh0bWwgLj0gIjx0aXRsZT4iLiRlcnJvclBhZ2VUaXRsZS4iIC0gIi50cmFuc2xhdGUoZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5zaXRlVGl0bGUpLiI8L3RpdGxlPlxuIjsKICAgICAgICAgICAgZ2xvYmFsICRfX3N0eWxlczsKICAgICAgICAgICAgZm9yZWFjaCgkX19zdHlsZXMgYXMgJFN0eWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJFN0eWxlLT5nZXRVcmwoKSkKICAgICAgICAgICAgICAgICAgICAkaHRtbCAuPSAiPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIiLiRTdHlsZS0+Z2V0VXJsKCkuKEZBTFNFICYmIGlzRGV2ZWxvcGVyKCkgPyAiP3JhbmQ9Ii50aW1lKCkgOiAiIikuIlwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIC8+IFxuIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2xvYmFsICRfX3N0eWxlczI7CiAgICAgICAgICAgIGZvcmVhY2goJF9fc3R5bGVzMiBhcyAkU3R5bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkU3R5bGUtPmdldFVybCgpKQogICAgICAgICAgICAgICAgICAgICRodG1sIC49ICI8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIiIuJFN0eWxlLT5nZXRVcmwoKS4oRkFMU0UgJiYgaXNEZXZlbG9wZXIoKSA/ICI/cmFuZD0iLnRpbWUoKSA6ICIiKS4iXCIgdHlwZT1cInRleHQvY3NzXCIgLz4gXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRodG1sIC49ICI8L2hlYWQ+XG4iOwogICAgICAgICAgICAkaHRtbCAuPSAiPGJvZHk+XG4iOwogICAgICAgICAgICAkaHRtbCAuPSAkTGF5b3V0LT5nZXRDb250ZW50KCk7CiAgICAgICAgICAgICRodG1sIC49ICI8L2JvZHk+XG4iOwogICAgICAgICAgICAkaHRtbCAuPSAiPC9odG1sPlxuIjsKICAgICAgICAgICAgLy8kaHRtbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25HZXRPdXRwdXRIdG1sIiwgYXJyYXkoImJvZHlIdG1sIiA9PiAieCIpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGVjaG8gJGh0bWw7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gIkVycm9yICIuJGVycm9yUGFnZUNvZGUuIiAtICIuJGVycm9yUGFnZURlc2NyaXB0aW9uOwogICAgICAgIH0KICAgICAgICBleGl0OwogICAgfQp9Cgo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvVmVyc2lvbi9WZXJzaW9uLmNsYXNzLnBocCAtLS0tLS0tIA0KDQpjbGFzcyBUVmVyc2lvbiBleHRlbmRzIFRDb3JlT2JqZWN0DQp7DQogICAgdmFyICRtYWpvclZlcnNpb247ICAgIA0KICAgIHZhciAkbWlub3JWZXJzaW9uOyAgICANCiAgICB2YXIgJGJ1aWxkOyAgICANCiAgICB2YXIgJHJlbGVhc2VDYW5kaWRhdGU7DQogICAgDQogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZlcnNpb249IiIpDQogICAgew0KICAgICAgICBpZiAoJHZlcnNpb24pDQogICAgICAgICAgICAkdGhpcy0+c2V0VmVyc2lvbigkdmVyc2lvbik7DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIHNldFZhbHVlKCR2ZXJzaW9uKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPnNldFZlcnNpb24oJHZlcnNpb24pOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBzZXRWZXJzaW9uKCR2ZXJzaW9uKQ0KICAgIHsNCiAgICAgICAgLy9kdW1wKCR2ZXJzaW9uKTsNCiAgICAgICAgJHZlcnNpb24gPSBleHBsb2RlKCIuIiwgJHZlcnNpb24pOw0KICAgICAgICANCiAgICAgICAgLy9kdW1wKCR2ZXJzaW9uKTsNCiAgICAgICAgJHRoaXMtPm1ham9yVmVyc2lvbiA9IChpbnQpJHZlcnNpb25bMF07DQogICAgICAgICR0aGlzLT5taW5vclZlcnNpb24gPSAoaW50KSR2ZXJzaW9uWzFdOw0KICAgICAgICAkdGhpcy0+YnVpbGQgPSAoaW50KSR2ZXJzaW9uWzJdOw0KICAgICAgICAkdGhpcy0+cmVsZWFzZUNhbmRpZGF0ZSA9IChpbnQpJHZlcnNpb25bM107DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIGFzTnVtYmVyKCRzdHJpbmc9IiIpDQogICAgew0KICAgICAgICBpZiAoJHN0cmluZykNCiAgICAgICAgICAgICRWZXJzaW9uID0gbmV3IFRWZXJzaW9uKCRzdHJpbmcpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICAkVmVyc2lvbiA9ICR0aGlzOw0KICAgIA0KICAgICAgICAkdmVyc2lvbk51bWJlciA9IDA7DQogICAgICAgICR2ZXJzaW9uTnVtYmVyICs9IDEwMDAwMDAwMCokVmVyc2lvbi0+bWFqb3JWZXJzaW9uOyAvLyAwLTk5DQogICAgICAgICR2ZXJzaW9uTnVtYmVyICs9IDEwMDAwMDAqJFZlcnNpb24tPm1pbm9yVmVyc2lvbjsgICAgIC8vIDAtOTkNCiAgICAgICAgJHZlcnNpb25OdW1iZXIgKz0gMTAwMDAqJFZlcnNpb24tPmJ1aWxkOyAgICAgICAgICAgICAgIC8vIDAtOTkNCiAgICAgICAgJHZlcnNpb25OdW1iZXIgKz0gJFZlcnNpb24tPnJlbGVhc2VDYW5kaWRhdGU7ICAgICAgICAgLy8gMC05OTk5DQogICAgICAgIA0KICAgICAgICByZXR1cm4oJHZlcnNpb25OdW1iZXIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCRtYWpvclZlcnNpb249dHJ1ZSwgJG1pbm9yVmVyc2lvbj10cnVlLCAkYnVpbGQ9dHJ1ZSwgJHJlbGVhc2VDYW5kaWRhdGU9dHJ1ZSkNCiAgICB7DQogICAgICAgIHJldHVybigkdGhpcy0+YXNTdHJpbmcoJG1ham9yVmVyc2lvbiwgJG1pbm9yVmVyc2lvbiwgJGJ1aWxkLCAkcmVsZWFzZUNhbmRpZGF0ZSkpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBhc1N0cmluZygkbWFqb3JWZXJzaW9uPXRydWUsICRtaW5vclZlcnNpb249dHJ1ZSwgJGJ1aWxkPXRydWUsICRyZWxlYXNlQ2FuZGlkYXRlPXRydWUpDQogICAgew0KICAgICAgICAkdmVyc2lvblN0cmluZyA9IGFycmF5KCk7DQogICAgICAgIGlmICgkbWFqb3JWZXJzaW9uKQ0KICAgICAgICAgICAgJHZlcnNpb25TdHJpbmdbXSA9ICR0aGlzLT5tYWpvclZlcnNpb247DQogICAgICAgIGlmICgkbWlub3JWZXJzaW9uKQ0KICAgICAgICAgICAgJHZlcnNpb25TdHJpbmdbXSA9ICR0aGlzLT5taW5vclZlcnNpb247DQogICAgICAgIGlmICgkYnVpbGQpDQogICAgICAgICAgICAkdmVyc2lvblN0cmluZ1tdID0gJHRoaXMtPmJ1aWxkOw0KICAgICAgICBpZiAoJHJlbGVhc2VDYW5kaWRhdGUpDQogICAgICAgICAgICAkdmVyc2lvblN0cmluZ1tdID0gJHRoaXMtPnJlbGVhc2VDYW5kaWRhdGU7DQogICAgICAgIA0KICAgICAgICByZXR1cm4oaW1wbG9kZSgiLiIsICR2ZXJzaW9uU3RyaW5nKSk7DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21wYXJlKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQ0KICAgIHsNCiAgICAgICAgJFZlcnNpb24xID0gbmV3IFRWZXJzaW9uKCR2ZXJzaW9uMSk7DQogICAgICAgICRWZXJzaW9uMiA9IG5ldyBUVmVyc2lvbigkdmVyc2lvbjIpOw0KICAgICAgICANCiAgICAgICAgaWYgKCRWZXJzaW9uMS0+YXNOdW1iZXIoKSA8ICRWZXJzaW9uMi0+YXNOdW1iZXIoKSkNCiAgICAgICAgICAgIHJldHVybigtMSk7DQogICAgICAgIGVsc2UgaWYgKCRWZXJzaW9uMS0+YXNOdW1iZXIoKSA+ICRWZXJzaW9uMi0+YXNOdW1iZXIoKSkNCiAgICAgICAgICAgIHJldHVybigxKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuKDApOw0KICAgIH0NCn0NCg0KLy8gbnV0bm8gcHJlZHRpbSB1c2UoIlZlcnNpb24iKQ0KZnVuY3Rpb24gZ2V0VmVyc2lvbkFzTnVtYmVyKCR2ZXJzaW9uKQ0Kew0KICAgICRWZXJzaW9uID0gbmV3IFRWZXJzaW9uKCR2ZXJzaW9uKTsNCiAgICANCiAgICByZXR1cm4oJFZlcnNpb24tPmFzTnVtYmVyKCkpOw0KfSAgDQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGF0ZUZ1bmN0aW9ucy9EYXRlRnVuY3Rpb25zLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFREYXRlRnVuY3Rpb25zIGV4dGVuZHMgVENvcmVPYmplY3QKewp9CgpmdW5jdGlvbiBfc3RydG90aW1lKCRzdHIsICRub3c9TlVMTCwgJGNoZWNrPWZhbHNlKQp7CiAgICBpZiAoaXNfYXJyYXkoJHN0cikpCiAgICB7CiAgICAgICAgJHkgPSBmaXJzdF92YWx1ZSgkc3RyWyJ5ZWFyIl0sICRzdHJbInkiXSwgJHN0clsiWSJdKTsKICAgICAgICAkbSA9IGZpcnN0X3ZhbHVlKCRzdHJbIm1vbnRoIl0sICRzdHJbIm0iXSk7CiAgICAgICAgJGQgPSBmaXJzdF92YWx1ZSgkc3RyWyJkYXkiXSwgJHN0clsiZCJdKTsKCiAgICAgICAgJGggPSBmaXJzdF92YWx1ZSgkc3RyWyJob3VyIl0sICRzdHJbImhvdXJzIl0sICRzdHJbImgiXSwgJHN0clsiSCJdKTsKICAgICAgICAkaSA9IGZpcnN0X3ZhbHVlKCRzdHJbIm1pbnV0ZSJdLCAkc3RyWyJtaW51dGVzIl0sICRzdHJbIm1pbiJdLCAkc3RyWyJpIl0pOwogICAgICAgICRzID0gZmlyc3RfdmFsdWUoJHN0clsic2Vjb25kIl0sICRzdHJbInNlY29uZHMiXSwgJHN0clsic2VjIl0sICRzdHJbInMiXSk7CiAgICAgICAgCiAgICAgICAgJHRpbWUgPSBta3RpbWUoJGgsICRpLCAkcywgJG0sICRkLCAkeSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCR0aW1lKTsKICAgIH0KCiAgICBpZiAoaXNfc3RyaW5nKCRzdHIpICYmIChwcmVnX21hdGNoKCJ8XlswLTldK1wkfCIsICRzdHIpIHx8IHByZWdfbWF0Y2goInxeWzAtOV0rXFwuWzAtOV0rXCR8IiwgJHN0cikpKQogICAgewogICAgICAgIC8vZHVtcCgkc3RyKTsKICAgICAgICAkc3RyID0gZXh0cmFjdEZsb2F0KCRzdHIpOwogICAgfQogICAgCiAgICBpZiAoaXNfZG91YmxlKCRzdHIpIHx8IGlzX2Zsb2F0KCRzdHIpIHx8IGlzX2ludCgkc3RyKSB8fCAkc3RyID09PSBOVUxMKQogICAgICAgIHJldHVybigkc3RyKTsKICAgIAogICAgaWYgKCFpc19zdHJpbmcoJHN0cikpCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoIl9zdHJ0b3RpbWUoKSAtIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBzdHJpbmc6ICIuc3RyX2R1bXAoJHN0ciksIG10RXJyb3IpOwogICAgICAgIC8vc2hvd01lc3NhZ2UoZ2V0RnVuY3Rpb25DYWxsKCksIG10RXJyb3IpOwogICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KCiAgICAvLyBuYSBXaW5kb3dzIHBsYXRmb3JtZSB0byBmdW5ndWplIHNrdmVsZQogICAgaWYgKCRzdHIgPT0gIjAwMDAtMDAtMDAiIHx8ICRzdHIgPT0gIjAwMDAtMDAtMDAgMDA6MDA6MDAiIHx8ICRzdHIgPT0gIiIgfHwgc3RycG9zKCRzdHIsIjAwOjAwOjAwLiIpICE9PSBGQUxTRSkKICAgICAgICByZXR1cm4oMCk7CiAgICAKICAgIGlmIChwcmVnX21hdGNoKCJ8XlswLTldWzAtOV0/OlswLTldWzAtOV0/OlswLTldWzAtOV0/XCR8IiwgJHN0cikgfHwgcHJlZ19tYXRjaCgifF5bMC05XVswLTldPzpbMC05XVswLTldPzpbMC05XVswLTldP1xcLlswLTldK1wkfCIsICRzdHIpKQogICAgewogICAgICAgIHJldHVybihzdHJ0b3RpbWUoZGF0ZSgiWS1tLWQiLCAwKS4iICIuJHN0cikpOyAgLy9hYnMga3Z1bGkgbGV0bmltdSBjYXN1CiAgICB9CiAgICAKICAgIAogICAgLy9kdW1wKCI/Iik7CiAgICAvL2R1bXAoJHN0cik7CiAgICBpZiAoISRjaGVjayAmJiAhaXNTcWxEYXRlRm9ybWF0KCRzdHIpKQogICAgewogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifF5bMC05XStcJHxpbXMiLCAkc3RyLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkgLy8gZG9udCB1c2UgLgogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKChmbG9hdCkkc3RyKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKykgKm1zfGltcyIsICRzdHIsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKChmbG9hdCkoJGVsZW1zWzBdWzFdLzEwMDApKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKykgKmQoKGF5KT9zKT98aW1zIiwgJHN0ciwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oKGZsb2F0KSgkZWxlbXNbMF1bMV0qNjAqNjAqMjQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKykgKmgoKG91cik/cyk/fGltcyIsICRzdHIsICRlbGVtcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKChmbG9hdCkoJGVsZW1zWzBdWzFdKjYwKjYwKSk7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbMC05XFwuXSspICptb24oKHRoKT9zKT98aW1zIiwgJHN0ciwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oKGZsb2F0KSgkZWxlbXNbMF1bMV0qNjAqNjAqMjQqMzApKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKykgKm0oKChpbik/dXRlKT9zKT98aW1zIiwgJHN0ciwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oKGZsb2F0KSgkZWxlbXNbMF1bMV0qNjApKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKykgKnMoKChlYyk/b25kKT9zKT98aW1zIiwgJHN0ciwgJGVsZW1zLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oKGZsb2F0KSgkZWxlbXNbMF1bMV0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFswLTlcXC5dKykgKnkoKGVhcik/P3MpP3xpbXMiLCAkc3RyLCAkZWxlbXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigoZmxvYXQpKCRlbGVtc1swXVsxXSo2MCo2MCoyNCozNjUpKTsKICAgICAgICB9CiAgICB9CiAgICAKCWlmIChzdHJwb3MoJHN0ciwgIjoiKSA9PT0gRkFMU0UpCiAgICAgICAgJHN0ciAuPSAiIDAwOjAwOjAwIjsKICAgIAogICAgLy8gcmVtb3ZlIG1pbGlzZWNvbmRzCiAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCJ8KFswLTldWzAtOV0/OlswLTldWzAtOV0/OlswLTldWzAtOV0/KVxcLlswLTldKnwiLCAiXFwxIiwgJHN0cik7CiAgICAvL2R1bXAoJHN0cik7CiAgICAKICAgIC8vdmFyX2R1bXAoJHN0cik7CiAgICAkdGltZSA9IHN0cnRvdGltZSgkc3RyLCAkbm93KTsKICAgIC8vZHVtcCgkdGltZSk7CiAgICAvL3Zhcl9kdW1wKCR0aW1lKTsKICAgIC8vdmFyX2R1bXAoZGF0ZSgiZC5tLlkiLCAkdGltZSkpOwogICAgLy9leGl0OwogICAgLy92YXJfZHVtcCgkdGltZSk7CiAgICAvL2V4aXQ7CgkvLyR0aW1lID0gTlVMTDsKICAgIAoJaWYgKCR0aW1lID09PSBOVUxMIHx8ICR0aW1lID09PSAwIHx8ICR0aW1lID09PSAtMSB8fCAkdGltZSA9PT0gRkFMU0UgfHwgZGF0ZSgiWS1tLWQgSDppOnMiLCAkdGltZSkgPT0gIjE5NzAtMDEtMDEgMDA6MDA6MDAiKSAvLyBsb2NhbGUgc3RydG90aW1lIG5vdCBzdXBwb3J0ZWQKCXsKICAgICAgICAkdGltZSA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpLT5nZXRUaW1lU3RhbXAoJHN0cik7CiAgICAgICAgLy92YXJfZHVtcCgkdGltZSk7Cgl9CgkKCWlmICgkY2hlY2spCiAgICAgICAgcmV0dXJuKCEoJHRpbWUgPT09IE5VTEwgfHwgJHRpbWUgPT09IDAgfHwgJHRpbWUgPT09IC0xIHx8ICR0aW1lID09PSBGQUxTRSB8fCBkYXRlKCJZLW0tZCBIOmk6cyIsICR0aW1lKSA9PSAiMTk3MC0wMS0wMSAwMDowMDowMCIpKTsKICAgIAogICAgLy9kdW1wKCI/Iik7CiAgICAvL2R1bXAoJHN0cik7CiAgICAvL2R1bXAoJHRpbWUpOwogICAgcmV0dXJuKCR0aW1lKTsKfQoKZnVuY3Rpb24gX2dldGRhdGUoJGQ9ZmFsc2UsJGZhc3Q9ZmFsc2UpCnsKCXJldHVybihnZXRkYXRlKCRkLCRmYXN0KSk7CQp9CgpmdW5jdGlvbiBfZGF0ZSgkZm10LCRkPWZhbHNlLCRpc19nbXQ9ZmFsc2UpCnsKCXJldHVybihkYXRlKCRmbXQsJGQpKTsKfQoKZnVuY3Rpb24gX2dtZGF0ZSgkZm10LCRkPWZhbHNlKQp7CglyZXR1cm4oZ21kYXRlKCRmbXQsJGQpKTsKfQoKZnVuY3Rpb24gX21rdGltZSgkaHIsJG1pbiwkc2VjLCRtb249ZmFsc2UsJGRheT1mYWxzZSwkeWVhcj1mYWxzZSwkaXNfZHN0PS0xLCRpc19nbXQ9ZmFsc2UpIAp7CglyZXR1cm4obWt0aW1lKCRociwkbWluLCRzZWMsJG1vbiwkZGF5LCR5ZWFyLCRpc19kc3QpKTsKfQoKZnVuY3Rpb24gX2dtbWt0aW1lKCRociwkbWluLCRzZWMsJG1vbj1mYWxzZSwkZGF5PWZhbHNlLCR5ZWFyPWZhbHNlLCRpc19kc3Q9ZmFsc2UpCnsKCXJldHVybihnbW1rdGltZSgkaHIsJG1pbiwkc2VjLCRtb24sJGRheSwkeWVhciwkaXNfZHN0KSk7Cn0KCmZ1bmN0aW9uIF9zdHJmdGltZSgkZm10LCAkdHM9ZmFsc2UsJGlzX2dtdD1mYWxzZSkKewoJcmV0dXJuKHN0cmZ0aW1lKCRmbXQsICR0cywkaXNfZ210KSk7CQp9CgpmdW5jdGlvbiBfZ21zdHJmdGltZSgkZm10LCAkdHM9ZmFsc2UpCnsKCXJldHVybihnbXN0cmZ0aW1lKCRmbXQsICR0cykpOwp9CgoKCgoKCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURESVRJT05BTCBEQVRFIEZVTkNUSU9OUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gaXNTcWxEYXRlRm9ybWF0KCR2YWx1ZSkKewogICAgaWYgKCR2YWx1ZVs0XSA9PSAiLSIgJiYgJHZhbHVlWzddID09ICItIikKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICBlbHNlICAgICAKICAgICAgICByZXR1cm4oZmFsc2UpOwp9CgpmdW5jdGlvbiBpc1JGQzgyMkRhdGVGb3JtYXQoJHZhbHVlKQp7CiAgICAvLyBTdW4sIDA4IEp1bCAyMDA3IDE4OjI1OjAwICswMTAwCiAgICBpZiAocHJlZ19tYXRjaCgifFthLXpBLVpdW2EtekEtWl1bYS16QS1aXSwgWzAtOV1bMC05XSBbYS16QS1aXVthLXpBLVpdW2EtekEtWl0gWzAtOV1bMC05XVswLTldWzAtOV0gWzAtOV1bMC05XTpbMC05XVswLTldOlswLTldWzAtOV0gXFwrWzAtOV1bMC05XVswLTldWzAtOV18IiwgJHZhbHVlKSkKICAgIHsKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CiAgICBlbHNlICAgICAKICAgICAgICByZXR1cm4oZmFsc2UpOwp9Cgo=Ly8geHBhdGguanMgcmVxdWlyZWQgKGZvciBJRSA6KSkKLy8gI05PX0NPTVBJTEUKCmZ1bmN0aW9uIFRBdXRvU2l6ZShwYXJhbXMsIGlkKSAgIAp7CiAgICBpZiAoIWlkKQogICAgICAgIGlkID0gIkF1dG9TaXplIjsKICAgIHRoaXMuVEhJUyA9IHRoaXM7CiAgICB0aGlzLmlkID0gaWQ7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgIAogICAgLy8genJ1c2l0IG9uVGltZXIgYSB1ZGVsYXQgdG8gdGFrLCB6ZSBzZSB0byBidWRlIGhsZWRhdCBwcmkgc2V0SFRNTCBhIGFwcGVuZENoaWxkLi4uIGF0ZC4uLgogICAgdGhpcy50aW1lciA9IDIwMDA7CiAgICB0aGlzLmRvbUNoYW5nZVRpbWVyID0gMTAwMDsgLy8gMTAKICAgIHRoaXMudGltZXJDb3VudGVyID0gMDsKICAgIHRoaXMucmVzaXplQ291bnRlciA9IDA7IC8vIGZvciBkZWJ1ZwogICAgdGhpcy5yZXNpemVFbGVtZW50VGltZXIgPSAxMDsgICAgCiAgICAKICAgIHRoaXMuZWxlbWVudHMgPSBbXTsKCiAgICB0aGlzLmtleURlYnVnID0gZmFsc2U7IC8vIHByZXNzIFtIT01FXSB0byBzaW11bGF0ZSB0aW1lciwgW0RFTEVURV0gdG8gb25lIGJ5IG9uZSBlbGVtZW50IHJlc2l6ZQogICAgdGhpcy5kdW1wRGF0YSA9IGZhbHNlOwogICAgdGhpcy5kdW1wT3V0bGluZUVsZW1lbnRzID0gZmFsc2U7CiAgICB0aGlzLmR1bXBPdmVyZmxvdyA9IGZhbHNlOwogICAgdGhpcy5kdW1wRGVidWdQYW5lbHMgPSBmYWxzZTsKICAgIHRoaXMuZHVtcFNwZWVkID0gZmFsc2U7CiAgICB0aGlzLmR1bXBJbmRlbnQgPSAwOyAvLyAxMAogICAgdGhpcy5lbGVtZW50c1RvUmVzaXplID0gW107CiAgICB0aGlzLmdyb3VwRWxlbWVudHNUb1Jlc2l6ZSA9IFtdOwogICAgdGhpcy5yZXNpemVkRWxlbWVudHMgPSBbXTsKICAgIHRoaXMucmVzaXppbmdFbGVtZW50cyA9IGZhbHNlOwogICAgCiAgICBpZiAod2luZG93LmRlYnVnQXV0b1NpemUpCiAgICB7CiAgICAgICAgdGhpcy5rZXlEZWJ1ZyA9IHRydWU7CiAgICAgICAgdGhpcy5kdW1wRGF0YSA9IHRydWU7CiAgICAgICAgdGhpcy5kdW1wT3V0bGluZUVsZW1lbnRzID0gdHJ1ZTsKICAgIH0KCiAgICBhZGRPYmplY3QodGhpcyk7CiAgICAKICAgIC8vIGZvciBuZXcgYnJvd3NlcnMgLSBhdXRvc2l6ZSB1c2luZyBGbGV4IEJveCBNb2RlbAogICAgLy8gVE9ETyAtIHNldFN0eWxlKCk6IGFkZCAtLW1vei0sIC0taWUsIC0td2Via2l0LCAuLi4gcHJlZml4ZXMKICAgIGlmICgvKkJyb3dzZXIubmFtZSA9PSAiRWRnZSIgfHwgKi9Ccm93c2VyLm5hbWUgPT0gIkZpcmVmb3giICYmIEJyb3dzZXIudmVyc2lvbiA+PSA0NSB8fCBCcm93c2VyLm5hbWUgPT0gIkNocm9tZSIgJiYgQnJvd3Nlci52ZXJzaW9uID49IDQ4IHx8IAogICAgICAgIEJyb3dzZXIubmFtZSA9PSAiU2FmYXJpIiAmJiBCcm93c2VyLnZlcnNpb24gPj0gOS4yIHx8IEJyb3dzZXIubmFtZSA9PSAiT3BlcmEiICYmIEJyb3dzZXIudmVyc2lvbiA+PSAzNyB8fCBCcm93c2VyLm5hbWUgPT0gIkVkZ2UiKQogICAgewogICAgICAgIHRoaXMuZmxleCA9IHRydWU7CiAgICB9CiAgICBlbHNlCiAgICAgICAgdGhpcy5mbGV4ID0gZmFsc2U7CgogICAgLy9kdW1wKHRoaXMuZmxleCk7CiAgICAvL2FsZXJ0KHRoaXMuZmxleCk7CiAgICAvL3JldHVybjsKICAgIAogICAgdGhpcy5fY3JlYXRlKCk7Cn0KCmV4dGVuZENsYXNzKFRBdXRvU2l6ZSwgVE9iamVjdCk7CgpUQXV0b1NpemUucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5zY3JvbGxCYXJXaWR0aCA9IDIwOwogICAgdGhpcy5jb3JlID0gdHJ1ZTsKICAgIAogICAgLy9yZXR1cm47CiAgICAKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAKICAgIGlmICh0aGlzLmtleURlYnVnKQogICAgewogICAgICAgIGR1bXAoIkF1dG9TaXplOiBwcmVzcyBbSE9NRV0gdG8gZmluZCBuZXcgZWxlbWVudHMsIHByZXNzIFtERUxFVEVdIHRvIGF1dG9zaXplIGVsZW1lbnRzIik7CiAgICAgICAgYWRkRXZlbnQod2luZG93LCAia2V5ZG93biIsIGZ1bmN0aW9uKGUpe190aGlzLl9vbktleURvd24oZSl9KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL3N0YXJ0UHJvZmlsZXIoIlRBdXRvU2l6ZTo6Y3JlYXRlKCkgLSAxIik7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAodGhpcy5mbGV4KQogICAgICAgIHsKICAgICAgICAgICAgZXh0ZW5kRnVuY3Rpb24oYWRkQ2xhc3NOYW1lLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgcGFyZW50KGF1dG8pOyAKICAgICAgICAgICAgICAgIGlmKGNsYXNzTmFtZSAmJiBjbGFzc05hbWUuaW5kZXhPZignYXV0bycpID09IDAgJiYgZ2V0T2JqZWN0KCdBdXRvU2l6ZScpKSAKICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoJ0F1dG9TaXplJykub25ET01DaGFuZ2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGV4dGVuZEZ1bmN0aW9uKHJlbW92ZUNsYXNzTmFtZSwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHBhcmVudChhdXRvKTsgCiAgICAgICAgICAgICAgICBpZihjbGFzc05hbWUgJiYgY2xhc3NOYW1lLmluZGV4T2YoJ2F1dG8nKSA9PSAwICYmIGdldE9iamVjdCgnQXV0b1NpemUnKSkgCiAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0KCdBdXRvU2l6ZScpLm9uRE9NQ2hhbmdlKCkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGV4dGVuZEZ1bmN0aW9uKHNldFN0eWxlLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgcGFyZW50KGF1dG8pOyAKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09ICJzdHJpbmciICYmIHZhbHVlLmluZGV4T2YoIjEwMCUiKSAhPSAtMSAmJiBnZXRPYmplY3QoJ0F1dG9TaXplJykpIAogICAgICAgICAgICAgICAgICAgIGdldE9iamVjdCgnQXV0b1NpemUnKS5vbkRPTUNoYW5nZSgpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBleHRlbmRGdW5jdGlvbihzZXRIdG1sLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgcGFyZW50KGF1dG8pOyAKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0T2JqZWN0KCdBdXRvU2l6ZScpKQogICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoJ0F1dG9TaXplJykub25ET01DaGFuZ2UoKQogICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgYWRkRXZlbnQod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBfdGhpcy5fb25ET01DaGFuZ2UoKTsKICAgICAgICAgICAgfSk7ICAgIAogICAgICAgICAgICB0aGlzLl9vbkRPTUNoYW5nZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBhZGRFdmVudCh3aW5kb3csICJsb2FkIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIF90aGlzLl9vbkRPTUNoYW5nZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBleHRlbmRGdW5jdGlvbihhZGRDbGFzc05hbWUsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50KGF1dG8pOyAKICAgICAgICAgICAgICAgICAgICBpZihjbGFzc05hbWUgJiYgY2xhc3NOYW1lLmluZGV4T2YoJ2F1dG8nKSA9PSAwICYmIGdldE9iamVjdCgnQXV0b1NpemUnKSkgCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdCgnQXV0b1NpemUnKS5vbkRPTUNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBleHRlbmRGdW5jdGlvbihyZW1vdmVDbGFzc05hbWUsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50KGF1dG8pOyAKICAgICAgICAgICAgICAgICAgICBpZihjbGFzc05hbWUgJiYgY2xhc3NOYW1lLmluZGV4T2YoJ2F1dG8nKSA9PSAwICYmIGdldE9iamVjdCgnQXV0b1NpemUnKSkgCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdCgnQXV0b1NpemUnKS5vbkRPTUNoYW5nZSgpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGV4dGVuZEZ1bmN0aW9uKHNldFN0eWxlLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHBhcmVudChhdXRvKTsgCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gInN0cmluZyIgJiYgdmFsdWUuaW5kZXhPZigiMTAwJSIpICE9IC0xICYmIGdldE9iamVjdCgnQXV0b1NpemUnKSkgCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdCgnQXV0b1NpemUnKS5vbkRPTUNoYW5nZSgpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGV4dGVuZEZ1bmN0aW9uKHNldEh0bWwsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50KGF1dG8pOyAKICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0T2JqZWN0KCdBdXRvU2l6ZScpKQogICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoJ0F1dG9TaXplJykub25ET01DaGFuZ2UoKQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmICghdGhpcy5mbGV4KQogICAgICAgICAgICBhZGRFdmVudCh3aW5kb3csICJyZXNpemUiLCBmdW5jdGlvbigpe190aGlzLm9uV2luZG93UmVzaXplKCl9KTsKICAgIH0KfQoKVEF1dG9TaXplLnByb3RvdHlwZS5vbldpbmRvd1Jlc2l6ZSA9IGZ1bmN0aW9uKGUpCnsKICAgIHRoaXMuZHVtcCgiVEF1dG9TaXplOjpvbldpbmRvd1Jlc2l6ZSgpIiwgdHJ1ZSk7CiAgICB2YXIgZWxlbXMgPSB0aGlzLmdldEF1dG9TaXplRWxlbWVudHMoKTsKICAgIHRoaXMuZWxlbWVudHNUb1Jlc2l6ZSA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5wdXNoKGVsZW1zW2ldKTsKICAgIH0KICAgIAogICAgdmFyIGVsZW1zID0gdGhpcy5nZXRHcm91cEF1dG9TaXplRWxlbWVudHMoKTsKICAgIHRoaXMuZ3JvdXBFbGVtZW50c1RvUmVzaXplID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdGhpcy5ncm91cEVsZW1lbnRzVG9SZXNpemUucHVzaChlbGVtc1tpXSk7CiAgICB9CgogICAgaWYgKCF0aGlzLmtleURlYnVnIC8qJiYgIXRoaXMucmVzaXppbmdFbGVtZW50cyovKQogICAgICAgIHRoaXMuX3Jlc2l6ZUVsZW1lbnRzKCk7Cn0KICAgIApUQXV0b1NpemUucHJvdG90eXBlLm9uRE9NQ2hhbmdlID0gZnVuY3Rpb24oZSkKewogICAgaWYgKHRoaXMuX29uRE9NQ2hhbmdlVGltZW91dCkKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fb25ET01DaGFuZ2VUaW1lb3V0KTsKCiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdGhpcy5fb25ET01DaGFuZ2VUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLl9vbkRPTUNoYW5nZSgpfSwgdGhpcy5kb21DaGFuZ2VUaW1lcik7Cn0KICAgIApUQXV0b1NpemUucHJvdG90eXBlLl9vbkRPTUNoYW5nZSA9IGZ1bmN0aW9uKGUpCnsKICAgIGlmICh0aGlzLmZsZXgpCiAgICB7CiAgICAgICAgc3RhcnRQcm9maWxlcigiVEF1dG9TaXplOjpfb25ET01DaGFuZ2UoKSIpOwogICAgICAgIHRoaXMuZHVtcFRpbWVTdGFydCgiX29uRE9NQ2hhbmdlKCkiKTsKICAgICAgICAvL2R1bXAoIi0tLSIpOwogICAgICAgIC8vZHVtcChub3coKSk7CiAgICAgICAgCiAgICAgICAgc3RhcnRQcm9maWxlcigiVEF1dG9TaXplOjpfb25ET01DaGFuZ2UoKSAtIDEiKTsKICAgICAgICB2YXIgbmV3Rm91bmQgPSB0aGlzLmZpbmROZXdFbGVtZW50cygpOwogICAgICAgIC8vZHVtcChuZXdGb3VuZC5sZW5ndGgpOwogICAgICAgIHN0b3BQcm9maWxlcigiVEF1dG9TaXplOjpfb25ET01DaGFuZ2UoKSAtIDEiKTsKCiAgICAgICAgc3RhcnRQcm9maWxlcigiVEF1dG9TaXplOjpfb25ET01DaGFuZ2UoKSAtIDIiKTsKICAgICAgICAvL2FsZXJ0KG5ld0ZvdW5kLmxlbmd0aCk7CiAgICAgICAgLy9hbGVydChnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhdXRvc2l6ZSIpKTsKICAgICAgICBpZiAobmV3Rm91bmQubGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbmV3Rm91bmQubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUVsZW1lbnQobmV3Rm91bmRbaV0pOwogICAgICAgIH0KICAgICAgICBzdG9wUHJvZmlsZXIoIlRBdXRvU2l6ZTo6X29uRE9NQ2hhbmdlKCkgLSAyIik7CgogICAgICAgIC8vZHVtcChub3coKSk7CiAgICAgICAgdGhpcy5kdW1wVGltZSgiX29uRE9NQ2hhbmdlIik7CiAgICAgICAgc3RvcFByb2ZpbGVyKCJUQXV0b1NpemU6Ol9vbkRPTUNoYW5nZSgpIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9kdW1wKDEpOwogICAgICAgIHN0YXJ0UHJvZmlsZXIoIlRBdXRvU2l6ZTo6X29uRE9NQ2hhbmdlKCkiKTsKICAgICAgICB0aGlzLmR1bXBUaW1lU3RhcnQoIl9vbkRPTUNoYW5nZSgpIik7CiAgICAgICAgLy9kdW1wKCJ4OiIrdGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCk7CiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnRzVG9SZXNpemUubGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgc3RhcnRQcm9maWxlcigiVEF1dG9TaXplOjpfb25ET01DaGFuZ2UoKSAtIDEiKTsKICAgICAgICAgICAgdmFyIG5ld0ZvdW5kID0gdGhpcy5maW5kTmV3RWxlbWVudHMoKTsKICAgICAgICAgICAgLy9kdW1wKG5ld0ZvdW5kKTsKICAgICAgICAgICAgc3RvcFByb2ZpbGVyKCJUQXV0b1NpemU6Ol9vbkRPTUNoYW5nZSgpIC0gMSIpOwogICAgICAgICAgICAvL2FsZXJ0KG5ld0ZvdW5kLmxlbmd0aCk7CiAgICAgICAgICAgIHN0YXJ0UHJvZmlsZXIoIlRBdXRvU2l6ZTo6X29uRE9NQ2hhbmdlKCkgLSAyIik7CiAgICAgICAgICAgIGlmIChuZXdGb3VuZC5sZW5ndGgpCiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplTmV3RWxlbWVudHMobmV3Rm91bmQpOwogICAgICAgICAgICBzdG9wUHJvZmlsZXIoIlRBdXRvU2l6ZTo6X29uRE9NQ2hhbmdlKCkgLSAyIik7CiAgICAgICAgICAgIHRoaXMuaW5pdFJlc2l6ZWQgPSB0cnVlOwogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy50aW1lckNvdW50ZXIrKzsKICAgICAgICAgICAgdGhpcy5fb25ET01DaGFuZ2VEdW1wID0gdHJ1ZTsKICAgICAgICAgICAgLy9pZiAodGhpcy50aW1lckNvdW50ZXIgPCAyKQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuX29uRE9NQ2hhbmdlRHVtcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kdW1wKCJUQXV0b1NpemU6Ol9vbkRPTUNoYW5nZSgpIC0gTm90aGluZyBkb25lLCBiZWNhdXNlIHRoZXJlIGlzICIrdGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCsiIGVsZW1lbnRzIHJlbWFpbmluZyB0byByZXNpemUiKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRE9NQ2hhbmdlRHVtcCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLm9uRE9NQ2hhbmdlKGUpOwogICAgICAgIH0KCiAgICAgICAgLy9kdW1wKHRoaXMuZ3JvdXBFbGVtZW50c1RvUmVzaXplKTsKICAgICAgICBpZiAoIXRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5sZW5ndGggJiYgIXRoaXMuZ3JvdXBFbGVtZW50c1RvUmVzaXplLmxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuZXdGb3VuZCA9IHRoaXMuZmluZE5ld0dyb3VwRWxlbWVudHMoKTsKICAgICAgICAgICAgLy9kdW1wKG5ld0ZvdW5kKTsKICAgICAgICAgICAgLy9hbGVydChuZXdGb3VuZC5sZW5ndGgpOwogICAgICAgICAgICBpZiAobmV3Rm91bmQubGVuZ3RoKQogICAgICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZU5ld0dyb3VwRWxlbWVudHMobmV3Rm91bmQpOwogICAgICAgIAogICAgICAgICAgICB0aGlzLnRpbWVyQ291bnRlcisrOwogICAgICAgICAgICAvL2lmICh0aGlzLnRpbWVyQ291bnRlciA8IDIpCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vbkRPTUNoYW5nZUR1bXAgJiYgdGhpcy5ncm91cEVsZW1lbnRzVG9SZXNpemUubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIlRBdXRvU2l6ZTo6X29uRE9NQ2hhbmdlKCkgLSBOb3RoaW5nIGRvbmUsIGJlY2F1c2UgdGhlcmUgaXMgIit0aGlzLmVsZW1lbnRzVG9SZXNpemUubGVuZ3RoKyIgZ3JvdXAgZWxlbWVudHMgcmVtYWluaW5nIHRvIHJlc2l6ZSIpOwogICAgICAgICAgICAgICAgdGhpcy5fb25ET01DaGFuZ2VEdW1wID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5vbkRPTUNoYW5nZShlKTsKICAgICAgICAgICAgdGhpcy5vbkRPTUNoYW5nZShlKTsKICAgICAgICB9CgogICAgICAgIC8vdGhpcy5kdW1wVGltZVN0YXJ0KCJfb25ET01DaGFuZ2UoKSIpOwogICAgICAgIHRoaXMuZHVtcFRpbWUoIl9vbkRPTUNoYW5nZSIpOwogICAgICAgIHN0b3BQcm9maWxlcigiVEF1dG9TaXplOjpfb25ET01DaGFuZ2UoKSIpOwogICAgICAgIC8vZHVtcCgyKTsKICAgIH0KfQoKVEF1dG9TaXplLnByb3RvdHlwZS5hZGRFbGVtZW50ID0gZnVuY3Rpb24oZWxlbSkKewogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5lbGVtZW50cyA7IGkrKykKICAgIHsKICAgICAgICBpZiAodGhpcy5lbGVtZW50c1tpXSA9PSBlbGVtKQogICAgICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIHRoaXMuZWxlbWVudHMucHVzaChlbGVtKTsKfQoKVEF1dG9TaXplLnByb3RvdHlwZS5fb25LZXlEb3duID0gZnVuY3Rpb24oZSkKewogICAgdmFyIGUgPSBnZXRLZXlFdmVudChlKTsKICAgIAogICAgLy9hbGVydChlLmtleUNvZGUpOwogICAgLy9hbGVydChWS19ERUxFVEUpOwogICAgaWYgKGUua2V5Q29kZSA9PSBWS19IT01FKQogICAgewogICAgICAgIC8vdGhpcy5YWFggPSB0cnVlOwogICAgICAgIAogICAgICAgIC8vdmFyIGNhbGxTdGFjayA9IGdldENhbGxTdGFjaygpOwogICAgICAgIC8vcmV0dXJuOwogICAgICAgIHRoaXMuX29uRE9NQ2hhbmdlKCk7CiAgICB9CiAgICBpZiAoZS5rZXlDb2RlID09IFZLX0RFTEVURSkKICAgIHsKICAgICAgICAvL2FsZXJ0KDEpOwogICAgICAgIC8vdGhpcy5YWFggPSB0cnVlOwogICAgICAgIAogICAgICAgIC8vdmFyIGNhbGxTdGFjayA9IGdldENhbGxTdGFjaygpOwogICAgICAgIC8vcmV0dXJuOwogICAgICAgIHRoaXMuX3Jlc2l6ZUVsZW1lbnRzKCk7CiAgICB9Cn0KClRBdXRvU2l6ZS5wcm90b3R5cGUuX3Jlc2l6ZUVsZW1lbnRzID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLmR1bXBUaW1lU3RhcnQoIl9yZXNpemVFbGVtZW50cygpIik7CiAgICAvL3RoaXMuZHVtcCgiX3Jlc2l6ZUVsZW1lbnRzKCkgLSByZW1haW5pbmc6ICIrdGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCk7CiAgICB0aGlzLnJlc2l6aW5nRWxlbWVudHMgPSB0cnVlOwogICAgaWYgKHRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5sZW5ndGgpCiAgICB7CiAgICAgICAgLy93aGlsZSh0aGlzLmVsZW1lbnRzVG9SZXNpemUubGVuZ3RoKQogICAgICAgIC8vewogICAgICAgICAgICB2YXIgZWxlbSA9IHRoaXMuZWxlbWVudHNUb1Jlc2l6ZVswXTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGhhcyBzb21lIHBhcmVudHMgdG8gcmVzaXplCiAgICAgICAgICAgIGlmIChlbGVtLmF1dG9TaXplUGFyZW50TGlzdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGVsZW0uYXV0b1NpemVQYXJlbnRMaXN0Lmxlbmd0aC0xIDsgaSA+PSAwIDsgaS0tKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRFbGVtID0gZWxlbS5hdXRvU2l6ZVBhcmVudExpc3RbaV07CiAgICAgICAgICAgICAgICAgICAgLy92YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IHRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudHNUb1Jlc2l6ZVtpaV0gPT0gcGFyZW50RWxlbSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHRoaXMuZWxlbWVudHNUb1Jlc2l6ZVtpaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLyppZiAoZWxlbS5wYXJlbnROb2RlICYmICgoaGFzQ2xhc3NOYW1lKGVsZW0ucGFyZW50Tm9kZSwgImF1dG9zaXplIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0ucGFyZW50Tm9kZSwgImF1dG9maWxsIikpICYmICghZWxlbS5wYXJlbnROb2RlLnN0eWxlLndpZHRoIHx8ICFlbGVtLnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0IHx8IGVsZW0ucGFyZW50Tm9kZS5zdHlsZS53aWR0aCA9PSAiMXB4IiB8fCBlbGVtLnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID09ICIxcHgiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF90aHJvdygiVEF1dG9TaXplIC0gcGFyZW50IGVsZW1lbnQgbm90IHJlc2l6ZWQgeWV0OiAiK2h0bWxlbnRpdGllcyhvdXRlckhUTUwoZWxlbS5wYXJlbnROb2RlKSkpOwogICAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlc2l6ZShlbGVtLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKHRoaXMuZWxlbWVudHNUb1Jlc2l6ZSwgZWxlbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzVG9SZXNpemUgPSBhcnJheV9yZW1vdmUodGhpcy5lbGVtZW50c1RvUmVzaXplLCBlbGVtKTsKICAgICAgICAgICAgICAgIC8vdmFyIGVsZW0gPSB0aGlzLmVsZW1lbnRzVG9SZXNpemUuc2hpZnQoKTsKICAgICAgICAgICAgICAgIHZhciByZXNpemVkID0gdGhpcy5hdXRvU2l6ZUVsZW1lbnQoZWxlbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMua2V5RGVidWcvKiAmJiAodGhpcy5kdW1wRGVidWdQYW5lbHMgfHwgb3V0ZXJIVE1MKGVsZW0pLmluZGV4T2YoIkRlYnVnUGFuZWwiKSA9PSAtMSkqLykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc2l6ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVFbGVtZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvL2JyZWFrOwogICAgICAgIC8vfQoKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmICghdGhpcy5rZXlEZWJ1ZykKICAgICAgICB7CiAgICAgICAgICAgIC8vc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLl9yZXNpemVFbGVtZW50cygpfSwgdGhpcy5yZXNpemVFbGVtZW50VGltZXIpOwogICAgICAgICAgICB0aGlzLl9yZXNpemVFbGVtZW50cygpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICB0aGlzLnJlc2l6aW5nRWxlbWVudHMgPSBmYWxzZTsKCiAgICBpZiAodGhpcy5ncm91cEVsZW1lbnRzVG9SZXNpemUubGVuZ3RoKQogICAgewogICAgICAgIC8vZHVtcCh0aGlzLmdyb3VwRWxlbWVudHNUb1Jlc2l6ZS5sZW5ndGgpOwogICAgICAgIHZhciBlbGVtID0gdGhpcy5ncm91cEVsZW1lbnRzVG9SZXNpemVbMF07CiAgICAgICAgCiAgICAgICAgdGhpcy5ncm91cEVsZW1lbnRzVG9SZXNpemUgPSBhcnJheV9yZW1vdmUodGhpcy5ncm91cEVsZW1lbnRzVG9SZXNpemUsIGVsZW0pOwogICAgICAgIHZhciByZXNpemVkID0gdGhpcy5hdXRvU2l6ZUdyb3VwRWxlbWVudChlbGVtKTsKICAgICAgICAKICAgICAgICBpZiAoIXRoaXMua2V5RGVidWcvKiAmJiAodGhpcy5kdW1wRGVidWdQYW5lbHMgfHwgb3V0ZXJIVE1MKGVsZW0pLmluZGV4T2YoIkRlYnVnUGFuZWwiKSA9PSAtMSkqLykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUVsZW1lbnRzKCk7CiAgICAgICAgfQogICAgfSAgICAKICAgIGVsc2UKICAgICAgICB0aGlzLnJlc2l6aW5nRWxlbWVudHMgPSBmYWxzZTsKICAgIAogICAgdGhpcy5kdW1wVGltZSgiX3Jlc2l6ZUVsZW1lbnRzKCkiKTsKICAgIHRoaXMuZHVtcCgiVEF1dG9TaXplLl9yZXNpemVFbGVtZW50cygpOiByZW1haW5pbmc6ICIrdGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCk7CiAgICAKICAgIC8vIHJldmVydCBvdmVyZmxvdyBiYWNrCiAgICAvL2R1bXAodGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCk7CiAgICBpZiAodGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCA9PSAwICYmIHRoaXMucmVzaXplZEVsZW1lbnRzLmxlbmd0aCkKICAgIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIC8vY2FsbChmdW5jdGlvbigpewogICAgICAgICAgICBfdGhpcy5kdW1wKCJUQXV0b1NpemUuX3Jlc2l6ZUVsZW1lbnRzKCk6IG5vdGhpbmcgcmVtYWluaW5nLCByZXZlcnRpbmcgYmFjayBvdmVyZmxvdyIpOwogICAgICAgICAgICAvL2R1bXAoX3RoaXMucmVzaXplZEVsZW1lbnRzLmxlbmd0aCk7CiAgICAgICAgICAgIHdoaWxlKF90aGlzLnJlc2l6ZWRFbGVtZW50cy5sZW5ndGgpCiAgICAgICAgICAgIHsgICAgICAKICAgICAgICAgICAgICAgIHZhciBlbGVtID0gX3RoaXMucmVzaXplZEVsZW1lbnRzLnBvcCgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW0uY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uY2hpbGROb2Rlc1tpXS50YWdOYW1lICYmIGVsZW0uY2hpbGROb2Rlc1tpXS5jbGFzc05hbWUuaW5kZXhPZigiYXV0b3NpemUiKSA+IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIHpydXNpbCBqc2VtIHRvIGEgbWEgdG8gbG9naWt1IC0gcG9rdWQgc2UgbmVjbyBhdXRvc2l6ZSwgdGFrIHRvIG1hIHZ5cGxuaXQgdnpkeSBjZWxvdSBvYmxhc3QgYSBvdmVyZmxvdyBwYWsgamVuCiAgICAgICAgICAgICAgICAvLyBkZWxhIGJpbmVjLCBrZGUgdG8gbmVzZWRpIG5hIHBpeGVsIHByZXNuZS4gKGplIGFsZSBtb3puZSwgemUgdG8gYnVkdSBwb3RyZWJvdmF0IHBybyBhdXRvd2lkdGggYSBhdXRvaGVpZ2h0KQogICAgICAgICAgICAgICAgaWYgKGVsZW0uX292ZXJmbG93ICE9ICIiICYmICFmb3VuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGx3aWR0aCIpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5vdmVyZmxvdyA9IGVsZW0uX292ZXJmbG93OwogICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLm92ZXJmbG93WCA9IGVsZW0uX292ZXJmbG93WDsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5vdmVyZmxvd1kgPSBlbGVtLl9vdmVyZmxvd1k7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBpZiBhdXRvc2l6aW5nIHRvIHdob2xlIGFyZWEgLSBtdXN0IHNldCBvdmVyZmxvdzpoaWRkZW4gdG8gcGFyZW50IGVsZW1lbnQKICAgICAgICAgICAgICAgIGlmIChoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9zaXplIikgJiYgZWxlbS5wYXJlbnROb2RlLnRhZ05hbWUgIT0gIkJPRFkiIC8qIGt2dWxpIHd3dyBhIHBvZGtyZXN1IGRpYWxvZ3UqLykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2RlbGV0ZSBlbGVtLl9vdmVyZmxvdzsKICAgICAgICAgICAgICAgIC8vZWxlbS5zdHlsZS5vdmVyZmxvdyA9IGVsZW0uX292ZXJmbG93OwogICAgICAgICAgICB9CiAgICAgICAgLy99LCB0cnVlKTsKICAgIH0KfQoKLyoKVEF1dG9TaXplLnByb3RvdHlwZS5fZmluZEVsZW1lbnRzID0gZnVuY3Rpb24oZWxlbWVudHMpCnsKICAgIHZhciBuZXdGb3VuZCA9IDA7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtZW50cy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGVsZW0gPSBlbGVtZW50c1tpXTsKICAgICAgICBpZiAoIWVsZW0uQXV0b1NpemUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbSk7CiAgICAgICAgICAgIGVsZW0uQXV0b1NpemUgPSB0aGlzOwogICAgICAgICAgICBuZXdGb3VuZCsrOwogICAgICAgICAgICAvL3RoaXMuZHVtcCgiVEF1dG9TaXplOjpmaW5kRWxlbWVudHMoKTogYWRkZWQoIitvdXRlckhUTUwoZWxlbSkrIikiKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLmR1bXAoIlRBdXRvU2l6ZTo6ZmluZEVsZW1lbnRzKCk6IG5ldyBmb3VuZCAiK25ld0ZvdW5kKTsKfQoqLwoKVEF1dG9TaXplLnByb3RvdHlwZS5pc0F1dG9TaXplRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW0pCnsKICAgIHJldHVybihlbGVtLkF1dG9TaXplICE9IG51bGwpOwp9CgpUQXV0b1NpemUucHJvdG90eXBlLmdldEF1dG9TaXplRWxlbWVudHMgPSBmdW5jdGlvbigpCnsKICAgIGZ1bmN0aW9uIGNvbmNhdCh4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHg5KQogICAgewogICAgICAgIHZhciByZXQgPSBbXTsKICAgICAgICBpZiAoeDEpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHgxLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHgxW2ldKTsKICAgICAgICBpZiAoeDIpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHgyLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHgyW2ldKTsKICAgICAgICBpZiAoeDMpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHgzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHgzW2ldKTsKICAgICAgICBpZiAoeDQpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg0Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg0W2ldKTsKICAgICAgICBpZiAoeDUpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg1Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg1W2ldKTsKICAgICAgICBpZiAoeDYpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg2Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg2W2ldKTsKICAgICAgICBpZiAoeDcpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg3Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg3W2ldKTsKICAgICAgICBpZiAoeDgpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg4Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg4W2ldKTsKICAgICAgICBpZiAoeDkpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg5Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg5W2ldKTsKICAgICAgICAKICAgICAgICByZXR1cm4ocmV0KTsKICAgIH0KICAgIAogICAgdmFyIGVsZW1zMSA9IGdldEVsZW1lbnRzQnlDbGFzc05hbWUoImF1dG9zaXplIik7CiAgICB2YXIgZWxlbXMyID0gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXV0b3dpZHRoIik7CiAgICB2YXIgZWxlbXMzID0gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXV0b2hlaWdodCIpOwogICAgdmFyIGVsZW1zNCA9IGdldEVsZW1lbnRzQnlDbGFzc05hbWUoImF1dG9maWxsIik7CiAgICB2YXIgZWxlbXM1ID0gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXV0b2ZpbGx3aWR0aCIpOwogICAgdmFyIGVsZW1zNiA9IGdldEVsZW1lbnRzQnlDbGFzc05hbWUoImF1dG9maWxsaGVpZ2h0Iik7CgogICAgdmFyIGVsZW1zID0gY29uY2F0KGVsZW1zMSwgZWxlbXMyLCBlbGVtczMsIGVsZW1zNCwgZWxlbXM1LCBlbGVtczYpOwogICAgCiAgICByZXR1cm4oZWxlbXMpOwp9CgoKVEF1dG9TaXplLnByb3RvdHlwZS5nZXRHcm91cEF1dG9TaXplRWxlbWVudHMgPSBmdW5jdGlvbigpCnsKICAgIGZ1bmN0aW9uIGNvbmNhdCh4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHg5KQogICAgewogICAgICAgIHZhciByZXQgPSBbXTsKICAgICAgICBpZiAoeDEpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHgxLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHgxW2ldKTsKICAgICAgICBpZiAoeDIpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHgyLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHgyW2ldKTsKICAgICAgICBpZiAoeDMpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHgzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHgzW2ldKTsKICAgICAgICBpZiAoeDQpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg0Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg0W2ldKTsKICAgICAgICBpZiAoeDUpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg1Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg1W2ldKTsKICAgICAgICBpZiAoeDYpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg2Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg2W2ldKTsKICAgICAgICBpZiAoeDcpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg3Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg3W2ldKTsKICAgICAgICBpZiAoeDgpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg4Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg4W2ldKTsKICAgICAgICBpZiAoeDkpCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHg5Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHJldC5wdXNoKHg5W2ldKTsKICAgICAgICAKICAgICAgICByZXR1cm4ocmV0KTsKICAgIH0KICAgIAogICAgdmFyIGVsZW1zMSA9IGdldEVsZW1lbnRzQnlDbGFzc05hbWUoImdyb3VwYXV0b3dpZHRoIik7CgogICAgdmFyIGVsZW1zID0gY29uY2F0KGVsZW1zMSk7CiAgICAvL2R1bXAoZWxlbXMpOwogICAgCiAgICByZXR1cm4oZWxlbXMpOwp9CgpUQXV0b1NpemUucHJvdG90eXBlLmZpbmROZXdFbGVtZW50cyA9IGZ1bmN0aW9uKCkKewogICAgaWYgKHRoaXMuZmxleCkKICAgIHsKICAgICAgICB0aGlzLmR1bXBUaW1lU3RhcnQoImZpbmROZXdFbGVtZW50cygpIik7CgogICAgICAgIHZhciBuZXdGb3VuZCA9IFtdOwogICAgICAgIHZhciBlbGVtcyA9IHRoaXMuZ2V0QXV0b1NpemVFbGVtZW50cygpOwoKICAgICAgICB0aGlzLmR1bXBUaW1lQ29udGludWUoJ2dldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiknKTsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWxlbSA9IGVsZW1zW2ldOwoKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXV0b1NpemVFbGVtZW50KGVsZW0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlbGVtLkF1dG9TaXplID0gdGhpczsKCiAgICAgICAgICAgICAgICBuZXdGb3VuZC5wdXNoKGVsZW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZHVtcCgiVEF1dG9TaXplOjpmaW5kRWxlbWVudHMoKTogbmV3IGZvdW5kICIrbmV3Rm91bmQubGVuZ3RoKTsKICAgICAgICAKICAgICAgICB0aGlzLmR1bXBUaW1lKCJmaW5kRWxlbWVudHMoKSIpOwogICAgICAgIC8vZHVtcChuZXdGb3VuZCk7CiAgICAgICAgcmV0dXJuKG5ld0ZvdW5kKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0aGlzLmR1bXBUaW1lU3RhcnQoImZpbmROZXdFbGVtZW50cygpIik7CgogICAgICAgIC8vcmV0dXJuKFtdKTsKICAgICAgICAKICAgICAgICB2YXIgbmV3Rm91bmQgPSBbXTsKICAgICAgICAKICAgICAgICAvL3ZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CiAgICAgICAgLy92YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhdXRvc2l6ZSIpOwogICAgICAgIAogICAgICAgIHZhciBlbGVtcyA9IHRoaXMuZ2V0QXV0b1NpemVFbGVtZW50cygpOwoKICAgICAgICB0aGlzLmR1bXBUaW1lQ29udGludWUoJ2dldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiknKTsKICAgICAgICAKICAgICAgICAvL3ZhciBlbGVtcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoWyJhdXRvc2l6ZSIsICJhdXRvd2lkdGgiLCAiYXV0b2hlaWdodCJdKTsKICAgICAgICAvL3ZhciBlbGVtcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImF1dG9zaXplIik7CgogICAgICAgIC8vZHVtcChlbGVtcyk7CiAgICAgICAgLy90aGlzLmR1bXBUaW1lU3RhcnQoKTsKICAgICAgICB0aGlzLmR1bXAoIj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09IiwgdGhpcy5rZXlEZWJ1Zyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW0gPSBlbGVtc1tpXTsKICAgICAgICAgICAgLy9pZiAoKGVsZW0udGFnTmFtZSA9PSAiRElWIiB8fCBlbGVtLnRhZ05hbWUgPT0gIlRFWFRBUkVBIiB8fCBlbGVtLnRhZ05hbWUgPT0gIlZJREVPIiB8fCBlbGVtLnRhZ05hbWUgPT0gIkVNQkVEIiB8fCBlbGVtLnRhZ05hbWUgPT0gIk9CSkVDVCIpICYmIChoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9zaXplIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvd2lkdGgiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9oZWlnaHQiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgfHwgZ2V0U3R5bGUoZWxlbSwgIndpZHRoIikgPT0gIjEwMCUiIHx8IGdldFN0eWxlKGVsZW0sICJoZWlnaHQiKSA9PSAiMTAwJSIpKQogICAgICAgICAgICBpZiAodHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXV0b1NpemVFbGVtZW50KGVsZW0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVsZW0uQXV0b1NpemUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtKTsKICAgICAgICAgICAgICAgICAgICBlbGVtLmF1dG9TaXplUGFyZW50TGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIGVsZW0uYXV0b1NpemVDaGlsZExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IGdldFBhcmVudE5vZGVzKGVsZW0pOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwIDsgbCA8IGxpc3QubGVuZ3RoIDsgbCsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbGVtID0gbGlzdFtsXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBdXRvU2l6ZUVsZW1lbnQoX2VsZW0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmF1dG9TaXplUGFyZW50TGlzdC5wdXNoKF9lbGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lbGVtLmF1dG9TaXplQ2hpbGRMaXN0LnB1c2goZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBnZXRDaGlsZE5vZGVzKGVsZW0sIC0xKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMCA7IGwgPCBsaXN0Lmxlbmd0aCA7IGwrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZWxlbSA9IGxpc3RbbF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQXV0b1NpemVFbGVtZW50KF9lbGVtKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hdXRvU2l6ZUNoaWxkTGlzdC5wdXNoKF9lbGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lbGVtLmF1dG9TaXplUGFyZW50TGlzdC5wdXNoKGVsZW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgbmV3Rm91bmQucHVzaChlbGVtKTsKCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzaXplIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihlbGVtLnBhcmVudE5vZGUuYXV0b1NpemVFbGVtZW50cykgIT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5hdXRvU2l6ZUVsZW1lbnRzID0gW107CiAgICAgICAgICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLmF1dG9TaXplRWxlbWVudHMucHVzaChlbGVtKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KGVsZW0ucGFyZW50Tm9kZSwgInJlc2l6ZSIsIGZ1bmN0aW9uKGVsZW0pe190aGlzLl9vblBhcmVudE5vZGVSZXNpemUoZWxlbSl9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW0ucmVzaXplKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc3VyZSBjYWxsIC0gYmVjYXVzZSB3ZSBhcmUgaW4gZm9yIGxvb3AKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbGVtID0gZWxlbTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5yZXNpemUgPSAoZnVuY3Rpb24oX19lbGVtKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpe190aGlzLmZvcmNlUmVzaXplKF9fZWxlbSl9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKF9lbGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy90aGlzLmR1bXAoIlRBdXRvU2l6ZTo6ZmluZEVsZW1lbnRzKCk6IGFkZGVkKCIrb3V0ZXJIVE1MKGVsZW0pKyIpIik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNoZWNrIGZvciBzaWJsaW5nIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGwiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsd2lkdGgiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsaGVpZ2h0IikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IGdldFNpYmxpbmdOb2RlcyhlbGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbCA9IDAgOyBsIDwgbGlzdC5sZW5ndGggOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0W2xdLnRhZ05hbWUgJiYgbGlzdFtsXS50YWdOYW1lICE9ICJTQ1JJUFQiICYmIGxpc3RbbF0udGFnTmFtZSAhPSAiU1RZTEUiICYmIGxpc3RbbF0udGFnTmFtZSAhPSAiTElOSyIgJiYgbGlzdFtsXS50YWdOYW1lICE9ICJCUiIgJiYgbGlzdFtsXS50YWdOYW1lICE9ICJIUiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGxpc3RbbF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0W2xdLl9fYXV0b3NpemVfc2libGluZ1Jlc2l6ZUV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQobGlzdFtsXSwgInJlc2l6ZSIsIGZ1bmN0aW9uKGVsZW0pe190aGlzLl9vblNpYmxpbmdOb2RlUmVzaXplKGVsZW0pfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RbbF0uX19hdXRvc2l6ZV9zaWJsaW5nUmVzaXplRXZlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmR1bXAoIlRBdXRvU2l6ZTo6ZmluZEVsZW1lbnRzKCk6IG5ldyBmb3VuZCAiK25ld0ZvdW5kLmxlbmd0aCk7CiAgICAgICAgLy90aGlzLmR1bXBUaW1lKCJUQXV0b1NpemU6OmZpbmRFbGVtZW50cygpIik7CiAgICAgICAgCiAgICAgICAgdGhpcy5kdW1wVGltZSgiZmluZEVsZW1lbnRzKCkiKTsKICAgICAgICAvL2R1bXAobmV3Rm91bmQpOwogICAgICAgIHJldHVybihuZXdGb3VuZCk7CiAgICAgICAgLy90aGlzLl9maW5kRWxlbWVudHMoZm91bmRFbGVtcyk7CgoKICAgICAgICAvL3RoaXMuZHVtcChmb3VuZEVsZW1zLmxlbmd0aCk7CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICB0aGlzLmR1bXAoInhwYXRoID09PT09PT09PT0iKTsKICAgICAgICB2YXIgZWxlbXMgPSBnZXROb2Rlc0J5WFBhdGgoIi8vZGl2W2NvbnRhaW5zKGNvbmNhdCgnICcsbm9ybWFsaXplLXNwYWNlKEBjbGFzcyksJyAnKSwnIGF1dG9zaXplICcpXSIpOyAgCiAgICAgICAgdGhpcy5kdW1wKGVsZW1zLmxlbmd0aCk7CiAgICAgICAgLy9mb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgLy8gICAgdGhpcy5kdW1wKG91dGVySFRNTChlbGVtc1tpXSkpOwogICAgICAgICAgICAKCiAgICAgICAgdmFyIGVsZW1zID0gZ2V0Tm9kZXNCeVhQYXRoKCIvL2Rpdltjb250YWlucyhAc3R5bGUsJzEwMCUnKV0iKTsgIAogICAgICAgIHRoaXMuZHVtcChlbGVtcy5sZW5ndGgpOwoKICAgICAgICAvL3ZhciBlbGVtcyA9IGdldE5vZGVzQnlYUGF0aCgiLy8qW2NvbnRhaW5zKGNvbmNhdCgnICcsbm9ybWFsaXplLXNwYWNlKEBjbGFzcyksJyAnKSwnIGF1dG9zaXplICcpIG9yIGNvbnRhaW5zKEBjc3MsJzEwMCUnKV0iKTsgIAogICAgICAgIC8vdGhpcy5kdW1wKGVsZW1zLmxlbmd0aCk7CiAgICAgICAgKi8KICAgICAgICAvKgogICAgICAgIHRoaXMuZHVtcCgic2x5ID09PT09PT09PT0iKTsKICAgICAgICB2YXIgcm93cyA9IFNseS5zZWFyY2goJ2RpdltjbGFzcyo9ImF1dG9zaXplIl0nKTsKICAgICAgICB0aGlzLmR1bXAocm93cy5sZW5ndGgpOwogICAgICAgIC8vZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIC8vICAgIHRoaXMuZHVtcChvdXRlckhUTUwoZWxlbXNbaV0pKTsKICAgICAgICAKICAgICAgICB2YXIgcm93cyA9IFNseS5zZWFyY2goJ2Rpdltjc3MqPSIxMDAlIl0nKTsKICAgICAgICB0aGlzLmR1bXAocm93cy5sZW5ndGgpOwogICAgICAgICovCiAgICAgICAgLy9zcGFuW2NvbnRhaW5zKEBjbGFzcywgJ2FjdGl2ZScpXQogICAgICAgIAogICAgICAgIC8vIFRPRE8gLSBkbyBhbGwgYnkgZmluZEVsZW1lbnRzQnlUYWdOYW1lCiAgICAgICAgLy90aGlzLl9maW5kRWxlbWVudHMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXV0b3NpemUiKSk7CiAgICAgICAgLy90aGlzLl9maW5kRWxlbWVudHMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXV0b3dpZHRoIikpOwogICAgICAgIC8vdGhpcy5fZmluZEVsZW1lbnRzKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImF1dG9oZWlnaHQiKSk7CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgICAgICAvL3ZhciBlbGVtcyA9IGZpbmRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWxlbSA9IGVsZW1zW2ldOwogICAgICAgICAgICAvL3ZhciBzdHlsZSA9IGdldFN0eWxlKGVsZW0sICJoZWlnaHQiKTsKICAgICAgICAgICAgaWYgKCFlbGVtLkF1dG9TaXplICYmIGdldFN0eWxlKGVsZW0sICJ3aWR0aCIpID09ICIxMDAlIiB8fCBnZXRTdHlsZShlbGVtLCAiaGVpZ2h0IikgPT0gIjEwMCUiIHx8IGVsZW0uY2xhc3NOYW1lLmluZGV4T2YoImF1dG9zaXplIikgPiAtMSB8fCBlbGVtLmNsYXNzTmFtZS5pbmRleE9mKCJhdXRvd2lkdGgiKSA+IC0xIHx8IGVsZW0uY2xhc3NOYW1lLmluZGV4T2YoImF1dG9oZWlnaHQiKSA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vdGhpcy5fZmluZEVsZW1lbnRzKGVsZW1lbnRzKTsKICAgICAgICAqLwogICAgfQp9CgpUQXV0b1NpemUucHJvdG90eXBlLmZpbmROZXdHcm91cEVsZW1lbnRzID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgZWxlbXMgPSB0aGlzLmdldEdyb3VwQXV0b1NpemVFbGVtZW50cygpOwogICAgdmFyIG5ld0ZvdW5kID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGVsZW0gPSBlbGVtc1tpXTsKICAgICAgICBpZiAoIWVsZW0uZ3JvdXBBdXRvU2l6ZVByb2Nlc3NlZCkKICAgICAgICAgICAgbmV3Rm91bmQucHVzaChlbGVtKTsKICAgIH0KICAgIHJldHVybihuZXdGb3VuZCk7Cn0gICAgICAgIAoKClRBdXRvU2l6ZS5wcm90b3R5cGUuYXV0b1NpemVHcm91cEVsZW1lbnQgPSBmdW5jdGlvbihlbGVtKQp7CiAgICAvL2R1bXAoIlsgeCBdID09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgLy9kdW1wKGVsZW0pOwogICAgCiAgICBpZiAoZWxlbS5ncm91cEF1dG9TaXplUHJvY2Vzc2VkKQogICAgICAgIHJldHVybjsKICAgIAogICAgZWxlbS5ncm91cEF1dG9TaXplUHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgICAKICAgIC8vIGZpbmQgc2libGluZyBlbGVtZW50cwogICAgdmFyIHJvb3RFbGVtZW50ID0gZWxlbTsKICAgIHdoaWxlKHJvb3RFbGVtZW50KQogICAgewogICAgICAgIGlmIChyb290RWxlbWVudC50YWdOYW1lID09ICJESVYiIHx8IHJvb3RFbGVtZW50LnRhZ05hbWUgPT0gIkZJRUxEU0VUIikKICAgICAgICB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByb290RWxlbWVudCA9IHJvb3RFbGVtZW50LnBhcmVudE5vZGU7CiAgICB9CiAgICAKICAgIC8vZHVtcChyb290RWxlbWVudCk7CiAgICBpZiAocm9vdEVsZW1lbnQpCiAgICB7CiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZ3JvdXBhdXRvd2lkdGgiLCByb290RWxlbWVudCk7CiAgICAgICAgLy9kdW1wKGVsZW1zKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBlbGVtc1tpXS5zdHlsZS53aWR0aCA9ICJhdXRvIjsKCiAgICAgICAgICAgIGVsZW1zW2ldLm9sZERpc3BsYXkgPSBlbGVtc1tpXS5zdHlsZS5kaXNwbGF5OwogICAgICAgICAgICBlbGVtc1tpXS5vbGRXaGl0ZVNwYWNlID0gZWxlbXNbaV0uc3R5bGUud2hpdGVTcGFjZTsKICAgICAgICAgICAgZWxlbXNbaV0uc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwogICAgICAgICAgICBlbGVtc1tpXS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CiAgICAgICAgfQogICAgICAgIHZhciBtYXhXaWR0aCA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZWxlbXNbaV0ub2Zmc2V0V2lkdGgpOwogICAgICAgIH0KICAgICAgICAvL3Jvb3RFbGVtZW50LnN0eWxlLndpZHRoID0gIiI7CiAgICAgICAgLy9yb290RWxlbWVudC5zdHlsZS53aGl0ZVNwYWNlID0gIm5vd3JhcCI7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKG1heFdpZHRoKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBzZXRTdHlsZShlbGVtc1tpXSwgIm91dGVyV2lkdGgiLCBtYXhXaWR0aCsicHgiKTsKICAgICAgICAgICAgZWxlbXNbaV0uc3R5bGUuZGlzcGxheSA9IGVsZW1zW2ldLm9sZERpc3BsYXk7CiAgICAgICAgICAgIC8vZWxlbXNbaV0uc3R5bGUud2hpdGVTcGFjZSA9IGVsZW1zW2ldLm9sZFdoaXRlU3BhY2U7CiAgICAgICAgICAgIC8vYWxlcnQob3V0ZXJIVE1MKGVsZW1zW2ldKSk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcChlbGVtcyk7CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICBlbGVtc1tpXS5ncm91cEF1dG9TaXplUHJvY2Vzc2VkID0gdHJ1ZTsKICAgIH0KICAgIAogICAgcmV0dXJuKHRydWUpOwp9CiAgICAKVEF1dG9TaXplLnByb3RvdHlwZS5hdXRvU2l6ZUVsZW1lbnQgPSBmdW5jdGlvbihlbGVtKQp7CiAgICBpZiAoIWVsZW0pCiAgICAgICAgcmV0dXJuOyAKICAgICAgICAKICAgIC8vZHVtcCh0aGlzLmZsZXgpOwogICAgaWYgKHRoaXMuZmxleCAmJiAhaGFzQ2xhc3NOYW1lKGVsZW0sICJmb3JjZWF1dG9zaXplIikgLyogJiYgZ2V0U3R5bGUoZWxlbSwgInBvc2l0aW9uIikgIT0gImFic29sdXRlIiAmJiBnZXRTdHlsZShlbGVtLCAicG9zaXRpb24iKSAhPSAiZml4ZWQiKi8pCiAgICB7CiAgICAgICAgLy9pZiAoIWVsZW0pCiAgICAgICAgLy8gICAgdGhyb3coIlRBdXRvU2l6ZS5hdXRvU2l6ZUVsZW1lbnQoKTogdHJ5aW5nIHRvIGF1dG9zaXplIG5vbiBleGlzdGluZyBlbGVtZW50IChtYXliZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gRE9NKSIpOwoKICAgICAgICBpZiAoIWVsZW0uQXV0b1NpemUgJiYgKGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b3NpemUiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbGhlaWdodCIpKSkKICAgICAgICAgICAgZWxlbS5BdXRvU2l6ZSA9IHRoaXM7CgogICAgICAgIGlmICghZWxlbS5BdXRvU2l6ZSkKICAgICAgICB7CiAgICAgICAgICAgIF90aHJvdygiVEF1dG9TaXplLmF1dG9TaXplRWxlbWVudCgpOiB0cnlpbmcgdG8gYXV0b3NpemUgbm9uIGF1dG9zaXphYmxlIGVsZW1lbnQgLSAiK2h0bWxlbnRpdGllcyhnZXRUYWcoZWxlbSkpKTsKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLmR1bXBUaW1lU3RhcnQoImF1dG9TaXplRWxlbWVudCgpIik7CgogICAgICAgIC8vZHVtcCgiKysrIitnZXRUYWcoZWxlbSkpOwogICAgICAgIAogICAgICAgIHZhciBwYXJlbnROb2RlID0gZWxlbS5fYXV0b1NpemVQYXJlbnROb2RlIHx8IGVsZW0ucGFyZW50Tm9kZTsKICAgICAgICB2YXIgc0VsZW1zID0gZ2V0U2libGluZ05vZGVzKGVsZW0pOwogICAgICAgIHNFbGVtcy5wdXNoKGVsZW0pOwogICAgICAgIAogICAgICAgIHZhciBjc3NGbG9hdCA9ICIiOwogICAgICAgIHZhciBjc3NEaXNwbGF5ID0gIiI7CiAgICAgICAgCiAgICAgICAgdmFyIG9sZEZsZXggPSAoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAiZGlzcGxheSIpID09ICJmbGV4Iik7CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgc0VsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzRWxlbXNbaV0udGFnTmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdldFN0eWxlKHNFbGVtc1tpXSwgImZsb2F0IiwgdHJ1ZSkgIT0gIm5vbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNzc0Zsb2F0ID0gZ2V0U3R5bGUoc0VsZW1zW2ldLCAiZmxvYXQiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3NzRmxvYXQgPT0gInJpZ2h0IikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKHNFbGVtc1tpXSwgIm9yZGVyIiwgIjIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChnZXRTdHlsZShzRWxlbXNbaV0sICJkaXNwbGF5IikgIT0gImJsb2NrIiAmJiBnZXRTdHlsZShzRWxlbXNbaV0sICJkaXNwbGF5IikgIT0gImZsZXgiICYmIGdldFN0eWxlKHNFbGVtc1tpXSwgImRpc3BsYXkiKSAhPSAibm9uZSIgJiYgIWhhc0NsYXNzTmFtZShzRWxlbXNbaV0sICJhdXRvc2l6ZSIpICAmJiAhaGFzQ2xhc3NOYW1lKHNFbGVtc1tpXSwgImF1dG9maWxsIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3NzRGlzcGxheSA9IGdldFN0eWxlKHNFbGVtc1tpXSwgImRpc3BsYXkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoYXNDbGFzc05hbWUoc0VsZW1zW2ldLCAiYXV0b2hlaWdodCIpKQogICAgICAgICAgICAgICAgICAgIGNzc0Zsb2F0ID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZHVtcCgiLS0tIik7CiAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgIC8vZHVtcChjc3NGbG9hdCk7CiAgICAgICAgLy9kdW1wKGNzc0Rpc3BsYXkpOwogICAgICAgIAogICAgICAgIGlmICghb2xkRmxleCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY3NzRmxvYXQgJiYgIWNzc0Rpc3BsYXkpCiAgICAgICAgICAgICAgICBzZXRTdHlsZShwYXJlbnROb2RlLCAiZmxleC1kaXJlY3Rpb24iLCAiY29sdW1uIik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0U3R5bGUocGFyZW50Tm9kZSwgImZsZXgtZGlyZWN0aW9uIiwgInJvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vZHVtcChwYXJlbnROb2RlKTsKICAgICAgICAvKgogICAgICAgIC8vIGt2dWxpIEVkaXRBcmVhICAgICAgICAgICAgICAgIAogICAgICAgIGlmIChjc3NGbG9hdCkKICAgICAgICAgICAgc2V0U3R5bGUocGFyZW50Tm9kZSwgImZsZXgtZGlyZWN0aW9uIiwgInJvdyIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc2V0U3R5bGUocGFyZW50Tm9kZSwgImZsZXgtZGlyZWN0aW9uIiwgImNvbHVtbiIpOwogICAgICAgICovCiAgICAgICAgCiAgICAgICAgcGFyZW50Tm9kZS5faGlkZU9sZERpc3BsYXkgPSAiZmxleCI7CiAgICAgICAgaWYgKGdldFN0eWxlKHBhcmVudE5vZGUsICJkaXNwbGF5IikgPT0gIm5vbmUiKQogICAgICAgICAgICBlbGVtLl9oaWRlT2xkRGlzcGxheSA9ICJmbGV4IjsKICAgICAgICBlbHNlIGlmIChnZXRTdHlsZShwYXJlbnROb2RlLCAiZGlzcGxheSIpID09ICJpbmxpbmUtYmxvY2siKQogICAgICAgICAgICBzZXRTdHlsZShwYXJlbnROb2RlLCAiZGlzcGxheSIsICJpbmxpbmUtZmxleCIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc2V0U3R5bGUocGFyZW50Tm9kZSwgImRpc3BsYXkiLCAiZmxleCIpOwogICAgICAgICAgICAKICAgICAgICAvL2R1bXAoIioiKTsKICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgLy9kdW1wKG5vdygpKTsKICAgICAgICB2YXIgd2lkdGggPSBnZXRTdHlsZShlbGVtLCAid2lkdGgiKTsKICAgICAgICB2YXIgaGVpZ2h0ID0gZ2V0U3R5bGUoZWxlbSwgImhlaWdodCIpOwoKICAgICAgICAvL2R1bXAod2lkdGgpOwogICAgICAgIC8vZHVtcChoZWlnaHQpOwogICAgICAgIC8vZHVtcChub3coKSk7CiAgICAgICAgCiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgCiAgICAgICAgLy8gWlJVU0VOTyAtIHBva3VkIGpzZW0gdmUgZmllbGRzZXQgdiBhZG1pbmlzdHJhY2ksIHRhayBzZSB0byBuZXJvenRhaHVqZSAtIHZpeiBwb3phZGF2ZWsgcC4gQ2hhZHJhYnkKICAgICAgICBpZiAod2lkdGggPT0gImF1dG8iIHx8IHdpZHRoID09ICIxMDAlIikKICAgICAgICB7CiAgICAgICAgICAgIGlmICh3aWR0aCAhPSAiMTAwJSIpCiAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAid2lkdGgiLCAiYXV0byIpOwoKICAgICAgICAgICAgd2lkdGggPSAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKGhlaWdodCA9PSAiYXV0byIgfHwgaGVpZ2h0ID09ICIxMDAlIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gIjEwMCUiKQogICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImhlaWdodCIsICJhdXRvIik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaGVpZ2h0ID0gIiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIC8vc2V0U3R5bGUoZWxlbSwgImZsZXgiLCAod2lkdGggPyB3aWR0aCA6ICgoaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvaGVpZ2h0IikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbGhlaWdodCIpKSAmJiAhaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbCIpID8gIjAiIDogIjEiKSkrIiAiKyhoZWlnaHQgPyBoZWlnaHQgOiAoKGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b3dpZHRoIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikpICYmICFoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgPyAiMCIgOiAiMSIpKSsiIGF1dG8iKTsKICAgICAgICAvL3NldFN0eWxlKGVsZW0sICJmbGV4IiwgKCh3aWR0aCB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9oZWlnaHQiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsaGVpZ2h0IikgfHwgaGVpZ2h0IHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b3dpZHRoIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikpICYmICFoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgPyAiMCAwIiA6ICIxIDEiKSsiIGF1dG8iKTsKICAgICAgICBzZXRTdHlsZShlbGVtLCAoZ2V0U3R5bGUoZWxlbSwgImRpc3BsYXkiKSA9PSAiaW5saW5lLWJsb2NrIiA/ICIiIDogImZsZXgiKSwgKCh3aWR0aCB8fCBoZWlnaHQpICYmICFoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgJiYgIWhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGx3aWR0aCIpICYmICFoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsaGVpZ2h0IikgPyAiMCAwIiA6ICIxIDEiKSsiIGF1dG8iKTsKICAgICAgICAgICAgICAgIAogICAgICAgIC8vYWxlcnQoZ2V0U3R5bGUoZWxlbSwgIm92ZXJmbG93IikpOwoKICAgICAgICAvLyBGaXJlRm94IEJVRyBmaXgKICAgICAgICAvLyBwb3RvbSBibGJuZSB6b2JyYXplbmkgb2JzYWh1IGRlYnVnIGRpYWxvZ3UsIGtkeXoganNvdSBza3J5dGUgYSBwYWsgc2Ugb3RldnJvdQogICAgICAgIGlmICgoQnJvd3Nlci5uYW1lID09ICJGaXJlZm94IiB8fCBCcm93c2VyLm5hbWUgPT0gIkNocm9tZSIpICYmIGVsZW0udGFnTmFtZSAhPSAiSUZSQU1FIiAmJiBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgJiYgKGdldFN0eWxlKGVsZW0sICJvdmVyZmxvdyIpID09ICJhdXRvIiB8fCBnZXRTdHlsZShlbGVtLCAib3ZlcmZsb3ciKSA9PSAic2Nyb2xsIikgJiYgZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAiZmxleC1kaXJlY3Rpb24iKSA9PSAiY29sdW1uIikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbkFic29sdXRlID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBfZWxlbUEgPSBlbGVtOwogICAgICAgICAgICB3aGlsZShfZWxlbUEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChnZXRTdHlsZShfZWxlbUEsICJwb3NpdGlvbiIpID09ICJhYnNvbHV0ZSIgfHwgZ2V0U3R5bGUoX2VsZW1BLCAicG9zaXRpb24iKSA9PSAiZml4ZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGluQWJzb2x1dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VsZW1BID0gX2VsZW1BLnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghaW5BYnNvbHV0ZSkgLy8ga3Z1bGkgZGlhbG9ndW0KICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJoZWlnaHQiLCAiMTBweCIpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBGaXJlRm94IEJVRyBmaXgKICAgICAgICAvLyBwcm8gdm5vcmVuZSBlbGVtZW50eSwgY28gbWFqaSBieXQgZmxleCB0byBibGJuZSB1IEZGIG9ienZsYXN0IHUgZGlhbG9ndSwga2R5IG5ldWthenVqZSBzY3JvbGxiYXJ5IGEgcm96dGFobmUgdG8gcG9kbGUgb2JzYWh1CiAgICAgICAgaWYgKChCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giIHx8IEJyb3dzZXIubmFtZSA9PSAiQ2hyb21lIikgJiYgIWV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgIm1pbi13aWR0aCIpKSkKICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgIm1pbi13aWR0aCIsICIwIik7CiAgICAgICAgaWYgKChCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giIHx8IEJyb3dzZXIubmFtZSA9PSAiQ2hyb21lIikgJiYgIWV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgIm1pbi1oZWlnaHQiKSkpCiAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJtaW4taGVpZ2h0IiwgIjAiKTsKCiAgICAgICAgdGhpcy5kdW1wVGltZSgiYXV0b1NpemVFbGVtZW50KCkiKTsKCiAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vaWYgKGVsZW0ub2Zmc2V0SGVpZ2h0ID09IDQzMykKICAgICAgICAvL3sKICAgICAgICAvLyAgICBhbGVydCgiWCIpOwogICAgICAgIC8vfQogICAgCiAgICAgICAgLy9pZiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJfUGFnZUNvbnRyb2xDb250ZW50Q29udGFpbmVyIikpCiAgICAgICAgLy8gICAgZHVtcChlbGVtKTsKICAgICAgICAKICAgICAgICB0aGlzLmR1bXAoIlsgeCBdID09PT09PT09PT09PT09PT09PT09PT09PT09PSIsIHRoaXMua2V5RGVidWcpOwogICAgICAgIAogICAgICAgIC8vcmV0dXJuOwogICAgICAgIC8vaWYgKHRoaXMuZHVtcERhdGEgJiYgIXRoaXMuZHVtcERlYnVnUGFuZWxzICYmIG91dGVySFRNTChlbGVtKS5pbmRleE9mKCJEZWJ1Z1BhbmVsIikgIT0gLTEpCiAgICAgICAgLy8gICAgdGhpcy5kdW1wRGF0YSA9IGZhbHNlOwoKICAgICAgICBpZiAoIWVsZW0pCiAgICAgICAgICAgIHRocm93KCJUQXV0b1NpemUuYXV0b1NpemVFbGVtZW50KCk6IHRyeWluZyB0byBhdXRvc2l6ZSBub24gZXhpc3RpbmcgZWxlbWVudCAobWF5YmUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIERPTSkiKTsKCiAgICAgICAgaWYgKCFlbGVtLkF1dG9TaXplKQogICAgICAgIHsKICAgICAgICAgICAgLy9fdGhyb3coIlRBdXRvU2l6ZS5hdXRvU2l6ZUVsZW1lbnQoKTogdHJ5aW5nIHRvIGF1dG9zaXplIG5vbiBhdXRvc2l6YWJsZSBlbGVtZW50IC0gIitodG1sZW50aXRpZXMoZ2V0VGFnKGVsZW0pKSk7CiAgICAgICAgICAgIC8vcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLmR1bXBUaW1lU3RhcnQoImF1dG9TaXplRWxlbWVudCgpIik7CgogICAgICAgIHRoaXMudXNlUGFyZW50T3ZlcmZsb3cgPSBmYWxzZTsKICAgICAgICB0aGlzLnVzZUhpZGVFbGVtZW50ID0gdHJ1ZTsKICAgICAgICB0aGlzLnVzZU91dGxpbmUgPSBmYWxzZTsKICAgICAgICAKICAgICAgICAvLyBoYXMgYmVlbiBwYXJlbnQgZWxlbWVudCByZXNpemVkPwogICAgICAgIC8vdGhpcy5kdW1wKG91dGVySFRNTChlbGVtLCB0cnVlKSk7CiAgICAgICAgLy90aGlzLmR1bXAoZWxlbS5wYXJlbnRXaWR0aCk7CiAgICAgICAgLy90aGlzLmR1bXAoZWxlbS5wYXJlbnROb2RlLm9mZnNldFdpZHRoKTsKCiAgICAgICAgLy8gY2hlY2sgaWYgYW55IHBhcmVudCBub2RlIGhhcyBtYXgtd2lkdGggb3IgbWF4LWhlaWdodCBpbiBwZXJjZW50CiAgICAgICAgLyoKICAgICAgICBpZiAoZmFsc2UgJiYgQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcE5vZGUgPSBlbGVtOwogICAgICAgICAgICB3aGlsZShwTm9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heFdpZHRoID0gZ2V0U3R5bGUocE5vZGUsICJweE1heFdpZHRoIik7CiAgICAgICAgICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gZ2V0U3R5bGUocE5vZGUsICJweG1heC1oZWlnaHQiKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHBOb2RlLl9fYXV0b3NpemVNYXhXaWR0aCB8fCBtYXhXaWR0aCAmJiBtYXhXaWR0aC5pbmRleE9mKCIlIikgPiAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBOb2RlLl9fYXV0b3NpemVNYXhXaWR0aCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLl9fYXV0b3NpemVNYXhXaWR0aCA9IG1heFdpZHRoOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHZhciBfd2lkdGggPSBwTm9kZS5zdHlsZS53aWR0aDsKICAgICAgICAgICAgICAgICAgICB2YXIgX3BOb2RlID0gcE5vZGU7CiAgICAgICAgICAgICAgICAgICAgcE5vZGUuc3R5bGUud2lkdGggPSAiNDAwcHgiOwogICAgICAgICAgICAgICAgICAgIGNhbGwoZnVuY3Rpb24oKXtfcE5vZGUuc3R5bGUud2lkdGggPSBfd2lkdGh9LCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwTm9kZS5fX2F1dG9zaXplTWF4SGVpZ2h0IHx8IG1heEhlaWdodCAmJiBtYXhIZWlnaHQuaW5kZXhPZigiJSIpID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwTm9kZS5fX2F1dG9zaXplTWF4SGVpZ2h0KSAKICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuX19hdXRvc2l6ZU1heEhlaWdodCA9IG1heEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBwTm9kZS5zdHlsZS5oZWlnaHQgPSAiNDAwcHgiOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcChwTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHBOb2RlID0gcE5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIHZhciBwTm9kZSA9IGVsZW07CiAgICAgICAgdmFyIF9oaWRkZW4gPSBmYWxzZTsKICAgICAgICB3aGlsZShwTm9kZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwTm9kZS5faGlkZGVuIHx8IGdldFN0eWxlKHBOb2RlLCAiZGlzcGxheSIpID09ICJub25lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2hpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIlRBdXRvU2l6ZS5hdXRvU2l6ZUVsZW1lbnQoKSIpOwogICAgICAgICAgICAgICAgdGhpcy5kdW1wKGdldFRhZyhlbGVtKSk7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIkVsZW1lbnQgKG9yIHBhcmVudCBub2RlKSBpcyBoaWRkZW4uLi4gc2tpcHBpbmciKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBwTm9kZSA9IHBOb2RlLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBwYXJlbnROb2RlID0gZWxlbS5fYXV0b1NpemVQYXJlbnROb2RlIHx8IGVsZW0ucGFyZW50Tm9kZTsKICAgICAgICAKICAgICAgICAvL2R1bXAoImVsZW0iKTsKICAgICAgICBpZiAoIV9oaWRkZW4gJiYgKHBhcmVudE5vZGUgJiYgKGVsZW0ucGFyZW50V2lkdGggIT0gcGFyZW50Tm9kZS5vZmZzZXRXaWR0aCB8fCBlbGVtLnBhcmVudEhlaWdodCAhPSBwYXJlbnROb2RlLm9mZnNldEhlaWdodCB8fCBlbGVtLmZvcmNlUmVzaXplKSkpCiAgICAgICAgewogICAgICAgICAgICBlbGVtLmZvcmNlUmVzaXplID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3RoaXMuZHVtcFRpbWVTdGFydCgpOwogICAgICAgICAgICB0aGlzLnJlc2l6ZUNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLmR1bXAoIlsgIit0aGlzLnJlc2l6ZUNvdW50ZXIrIiBdID09PT09PT09PT09PT09PT09PT09PT09PT09PSIsIHRoaXMua2V5RGVidWcpOwogICAgICAgICAgICB0aGlzLmR1bXAoIlRBdXRvU2l6ZS5hdXRvU2l6ZUVsZW1lbnQoKSIpOwoKICAgICAgICAgICAgaWYgKHRoaXMua2V5RGVidWcgJiYgdGhpcy51c2VPdXRsaW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5rZXlEZWJ1Z0xhc3RFbGVtKQogICAgICAgICAgICAgICAgICAgIHRoaXMua2V5RGVidWdMYXN0RWxlbS5zdHlsZS5vdXRsaW5lID0gIiI7CiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLm91dGxpbmUgPSAiMnB4IGRvdHRlZCAjMDBGRjAwIjsKICAgICAgICAgICAgICAgIHRoaXMua2V5RGVidWdMYXN0RWxlbSA9IGVsZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGt2dWxpIFJpYmJvbiB6cnVzZW5vCiAgICAgICAgICAgIC8vaWYgKGVsZW0uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siKQogICAgICAgICAgICAvLyAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAKICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkaXNhYmxlIHNjcm9sbCBvbiBhbGwgcGFyZW50IGVsZW1lbnRzIChvdGhlcndpc2UgdGhlcmUgd2lsbCByZW1haWwgc2Nyb2xsYmFyIHdpZHRoIGFuZCBoZWlnaHQgc3BhY2UpCiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBzZXR0aW5nIG92ZXJmbG93OmhpZGRlbiBvciBkaXNwbGF5Om5vbmUgb24gYW55IHBhcmVudCBlbGVtZW50LCB0aGF0IGNvbnRhaW5zIEVNQkVEIGNhdXNlcyBGbGFzaCB0byByZWxvYWQgLSBtYXkgYmUgZml4ZWQgYnkgbW92aW5nIGVtYmVkcyB0byBib2R5IHRlbXBvcmFyaWx5CiAgICAgICAgICAgIC8vdmFyIGhpZGVQYXJlbnRMaXN0ID0gW107CiAgICAgICAgICAgIGlmICh0aGlzLnVzZVBhcmVudE92ZXJmbG93KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB3aGlsZShub2RlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qaWYgKG5vZGUuc3R5bGUgJiYgKG5vZGUuc3R5bGUub3ZlcmZsb3cgPT0gImF1dG8iIHx8IG5vZGUuc3R5bGUub3ZlcmZsb3cgPT0gInNjcm9sbCIpKSovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gZG9jdW1lbnQgJiYgbm9kZS50YWdOYW1lID09ICJESVYiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdmFsID0gbm9kZS5zdHlsZS5vdmVyZmxvdzsKICAgICAgICAgICAgICAgICAgICAgICAgLy9ub2RlLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgogICAgICAgICAgICAgICAgICAgICAgICAvL2hpZGVQYXJlbnRMaXN0LnB1c2goeyd3aWR0aCc6bm9kZS5zdHlsZS53aWR0aCwnaGVpZ2h0Jzpub2RlLnN0eWxlLmhlaWdodCwndmlzaWJpbGl0eSc6bm9kZS5zdHlsZS52aXNpYmlsaXR5fSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VIaWRlRWxlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiRmlyZWZveCIgfHwgQnJvd3Nlci5uYW1lID09ICJDaHJvbWUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVFbGVtZW50KG5vZGUpOyAvLyBuZWVkZWQgZHVlIHRvIEZsYXNoIHJlbG9hZCBidWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLl9hdXRvU2l6ZU9sZE92ZXJmbG93ID0gbm9kZS5zdHlsZS5vdmVyZmxvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0NsYXNzTmFtZShub2RlLCAiYXV0b2ZpbGx3aWR0aCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLl9hdXRvU2l6ZU9sZE92ZXJmbG93ID0gbm9kZS5zdHlsZS5vdmVyZmxvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ2xhc3NOYW1lKG5vZGUsICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbXMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIkVNQkVEIGZvdW5kOiAiK2VsZW1zLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBlbGVtc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkT2JqZWN0cy5wdXNoKHsnZWxlbSc6ZWxlbSwgJ3BhcmVudCc6ZWxlbS5wYXJlbnROb2RlLCAnbmV4dFNpYmxpbmcnOmVsZW0ubmV4dFNpYmxpbmd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxlbS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9ub2RlLnN0eWxlLndpZHRoID0gIjFweCI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9kZS5zdHlsZS5oZWlnaHQgPSAiMXB4IjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJBICIrdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL3RoaXMuZHVtcFRpbWVDb250aW51ZSgicGFyZW50IG92ZXJmbG93Iik7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5kdW1wT3V0bGluZUVsZW1lbnRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm91dGxpbmVBY3RpdmVFbGVtZW50KGVsZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5kdW1wKGdldFRhZyhlbGVtKSk7CiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICE9IGRvY3VtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoZ2V0VGFnKGVsZW0ucGFyZW50Tm9kZSkpOwogICAgICAgICAgICAgICAgdGhpcy5kdW1wKGVsZW0ucGFyZW50Tm9kZS5zdHlsZS53aWR0aCk7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoZWxlbS5wYXJlbnROb2RlLnN0eWxlLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkgJiYgcGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IGRvY3VtZW50KQogICAgICAgICAgICAgICAgdGhpcy5kdW1wKGdldFRhZyhlbGVtLnBhcmVudE5vZGUucGFyZW50Tm9kZSkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIjxodG1sPiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy92YXIgX2Rpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgICAgIC8vaWYgKGVsZW0udGFnTmFtZSAhPSAiT0JKRUNUIiAmJiBlbGVtLnRhZ05hbWUgIT0gIkVNQkVEIikgLy8gaGlkaW5nIGNhdXNlcyBGbGFzaCB0byByZWxvYWQKICAgICAgICAgICAgLy8gICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgLy97CiAgICAgICAgICAgIC8vICAgIGVsZW0uc3R5bGUud2lkdGggPSAnMXB4JzsKICAgICAgICAgICAgLy8gICAgZWxlbS5zdHlsZS5oZWlnaHQgPSAnMXB4JzsKICAgICAgICAgICAgLy99CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBuZXZlciBoaWRlIHVzaW5nIGRpc3BsYXk6bm9uZSAtIGl0IHJlbG9hZHMgRmxhc2ggaWYgYW55IEVNQkVEIG9yIE9CSkVDVCBpbnNpZGUKICAgICAgICAgICAgdmFyIF9vdmVyZmxvdyA9IGVsZW0uc3R5bGUub3ZlcmZsb3c7CiAgICAgICAgICAgIC8vdmFyIF9vdmVyZmxvdyA9IGdldFN0eWxlKGVsZW0sICJvdmVyZmxvdyIpOwogICAgICAgICAgICAvL2VsZW0uc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHNldHVwIG92ZXJmbG93IHRvIGhpZGRlbiBhbmQgYWZ0ZXIgYWxsIGlubmVyIHN0dWZmIHJlc2l6ZWQsIHNldCBpdCBiYWNrIHRvIG92ZXJmbG93IGl0IGhhcyBiZWVuCiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoZWxlbSwgdGhpcy5yZXNpemVkRWxlbWVudHMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlbGVtLl9vdmVyZmxvdyA9IGdldFN0eWxlKGVsZW0sICJvdmVyZmxvdyIpOwogICAgICAgICAgICAgICAgZWxlbS5fb3ZlcmZsb3dYID0gZ2V0U3R5bGUoZWxlbSwgIm92ZXJmbG93LXgiKTsKICAgICAgICAgICAgICAgIGVsZW0uX292ZXJmbG93WSA9IGdldFN0eWxlKGVsZW0sICJvdmVyZmxvdy15Iik7CiAgICAgICAgICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoZWxlbS5zdHlsZS5vdmVyZmxvdyk7CiAgICAgICAgICAgICAgICAvL2VsZW0uX292ZXJmbG93ID0gZWxlbS5zdHlsZS5vdmVyZmxvdzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmR1bXBPdmVyZmxvdyAmJiAhaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgICAgICAgICAgICAgdGhpcy5yZXNpemVkRWxlbWVudHMucHVzaChlbGVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAvKiAhISEhISEhISEhISBTTE9XICEhISEhISEhISEhISEhICAtIGsgY2VtdSBqc2VtIHRvIHBvdHJlYm92YWw/Pz8KICAgICAgICAgICAgdmFyIHN0eWxlV2lkdGggPSBnZXRTdHlsZShlbGVtLCAid2lkdGgiKTsKICAgICAgICAgICAgdmFyIHN0eWxlSGVpZ2h0ID0gZ2V0U3R5bGUoZWxlbSwgImhlaWdodCIpOwogICAgICAgICAgICAvL3RoaXMuZHVtcFRpbWVDb250aW51ZSgiWCIpOwogICAgICAgICAgICBpZiAoc3R5bGVXaWR0aCA9PSAiMTAwJSIpCiAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUoZWxlbSwgImF1dG93aWR0aCIpOwogICAgICAgICAgICBpZiAoc3R5bGVIZWlnaHQgPT0gIjEwMCUiKQogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKGVsZW0sICJhdXRvaGVpZ2h0Iik7CiAgICAgICAgICAgICovCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgX3dpZHRoID0gZWxlbS5zdHlsZS53aWR0aDsKICAgICAgICAgICAgdmFyIF9oZWlnaHQgPSBlbGVtLnN0eWxlLmhlaWdodDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcChlbGVtKTsKICAgICAgICAgICAgLy9kdW1wKF9oZWlnaHQpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gb24gRGlhbG9nIHdlIGhhdmUgaGVhZGVyLCBjb250ZW50W2F1dG9maWxsXSBhbmQgYnV0dG9ucyBkaXYgCiAgICAgICAgICAgIC8vIGlmIGRpYWxvZyBoYXMgbWF4V2lkdGggb3IgbWF4SGVpZ2h0IGFuZCB3ZSBzZXQgd2lkdGggYW5kIGhlaWdodCB0byAxcHgsIHRoYW4gaXQgc2hyaW5rcyB0byBtaW5pbXVtIHNpemUKICAgICAgICAgICAgdmFyIHBNYXhXaWR0aCA9IGdldFN0eWxlKHBhcmVudE5vZGUsICJtYXhXaWR0aCIpOwogICAgICAgICAgICB2YXIgcE1heEhlaWdodCA9IGdldFN0eWxlKHBhcmVudE5vZGUsICJtYXhIZWlnaHQiKTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJlbGVtLnBhcmVudE5vZGUgbWF4V2lkdGg6ICIrcE1heFdpZHRoKTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJlbGVtLnBhcmVudE5vZGUgbWF4SGVpZ2h0OiAiK3BNYXhIZWlnaHQpOwogICAgICAgICAgICBpZiAoZXh0cmFjdEZsb2F0KHBNYXhXaWR0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuc3R5bGUud2lkdGggPSBwYXJlbnROb2RlLm9mZnNldFdpZHRoKyJweCI7CiAgICAgICAgICAgICAgICAvLyBUT0RPIGNhbGwgcmV0dXJuIHRoZSBwcmV2IHZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGV4dHJhY3RGbG9hdChwTWF4SGVpZ2h0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQgPSBwYXJlbnROb2RlLm9mZnNldEhlaWdodCsicHgiOwogICAgICAgICAgICAgICAgLy8gVE9ETyBjYWxsIHJldHVybiB0aGUgcHJldiB2YWx1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2lmIChnZXRTdHlsZShwYXJlbnROb2RlLCAibWF4LXdpZHRoIikpCiAgICAgICAgICAgICAgICAvL2FsZXJ0KHBhcmVudE5vZGUpOwogICAgICAgICAgICBlbGVtLnN0eWxlLndpZHRoID0gJzFweCc7CiAgICAgICAgICAgIGVsZW0uc3R5bGUuaGVpZ2h0ID0gJzFweCc7CgogICAgICAgICAgICAvLyBUT0RPIFVOQ09NTUVOVAogICAgICAgICAgICAvL2VsZW0uc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5kdW1wVGltZUNvbnRpbnVlKCJoaWRlIik7CgogICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBkb2N1bWVudC5ib2R5ICYmIGdldFN0eWxlKGRvY3VtZW50LmJvZHksICJvdmVyZmxvdyIpICE9ICJoaWRkZW4iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJlbnROb2RlLnNjcm9sbFdpZHRoOwogICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gcGFyZW50Tm9kZS5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBwYXJlbnROb2RlLm9mZnNldEhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2R1bXAocGFyZW50Tm9kZSk7CgogICAgICAgICAgICAvLyBpZiBkaXYgd2l0aCBjbGVhcjpib3RoIGlzIG1pc3NpbmcsIHdlIG11c3QgY291bnQgbWF4IG9mIHNpYmxpbmcgaGVpZ2h0cwogICAgICAgICAgICAvL3RoaXMuZHVtcCgiUEg6ICIrZWxlbS5wYXJlbnROb2RlLnN0eWxlLmhlaWdodCk7CiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJGOiAiK2dldFN0eWxlKGVsZW0sICJmbG9hdCIpKTsKICAgICAgICAgICAgaWYgKCFwYXJlbnROb2RlLnN0eWxlLmhlaWdodCAmJiAoZ2V0U3R5bGUoZWxlbSwgImZsb2F0IikgPT0gImxlZnQiIHx8IGdldFN0eWxlKGVsZW0sICJmbG9hdCIpID09ICJyaWdodCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIkZsb2F0ZWQgZWxlbWVudDogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2libGluZ0hlaWdodCA9IGV4dHJhY3RGbG9hdChwYXJlbnROb2RlLmNoaWxkTm9kZXNbaV0ub2Zmc2V0SGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIkZsb2F0ZWQgZWxlbWVudCBzaWJsaW5nIGhlaWdodDogIitzaWJsaW5nSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHNpYmxpbmdIZWlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoaGVpZ2h0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vaWYgKGVsZW0ucGFyZW50Tm9kZS5fd2lkdGgpCiAgICAgICAgICAgIC8vICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIGVsZW0ucGFyZW50Tm9kZS5fd2lkdGgpOwogICAgICAgICAgICAvL2lmIChlbGVtLnBhcmVudE5vZGUuX2hlaWdodCkKICAgICAgICAgICAgLy8gICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBleHRyYWN0SW50KGVsZW0ucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQsIDApKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIEZPUk0gZWxlbWVudCBzaG93cyAzcHggb2Zmc2V0SGVpZ2h0LCBidXQgaGFzIHN0eWxlLmhlaWdodCAtIGZpeCBpdAogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoZWxlbS5wYXJlbnROb2RlLnN0eWxlLndpZHRoLmluZGV4T2YoIiUiKSA9PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAib3V0ZXJXaWR0aCIpLCAwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVsZW0ucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQuaW5kZXhPZigiJSIpID09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3RoaXMuZHVtcChlbGVtLnN0eWxlLmhlaWdodCk7CiAgICAgICAgICAgICAgICAvL3RoaXMuZHVtcChnZXRTdHlsZShlbGVtLCAib3V0ZXJIZWlnaHQiKSk7CiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgIm91dGVySGVpZ2h0IiksIDApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAvL3RoaXMuZHVtcFRpbWVDb250aW51ZSgiZ2V0dGluZyBwYXJlbnQgb2Zmc2V0IGhlaWdodCIpOwoKICAgICAgICAgICAgLy90aGlzLmR1bXBUaW1lQ29udGludWUoImdldHRpbmcgcGFyZW50IG9mZnNldCBzaXplIC0gKCIrX2R1bXAob3V0ZXJIVE1MKGVsZW0sIHRydWUpKSsiKSIpOwogICAgICAgICAgICAvL3RoaXMuZHVtcFRpbWVDb250aW51ZSgiZ2V0dGluZyBwYXJlbnQgb2Zmc2V0IHNpemUiKTsKCiAgICAgICAgICAgIHRoaXMuZHVtcCgicGFyZW50LndpZHRoPSIrd2lkdGgrIiwgIisicGFyZW50LmhlaWdodD0iK2hlaWdodCk7CiAgICAgICAgICAgIHRoaXMuZHVtcCgicGFyZW50V2lkdGg9IitlbGVtLnBhcmVudFdpZHRoKyIsICIrInBhcmVudEhlaWdodD0iK2VsZW0ucGFyZW50SGVpZ2h0KTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJwYXJlbnRXaWR0aFM9IitwYXJlbnROb2RlLnN0eWxlLndpZHRoKyIsICIrInBhcmVudEhlaWdodFM9IitwYXJlbnROb2RlLnN0eWxlLmhlaWdodCk7CiAgICAgICAgICAgIHRoaXMuZHVtcCgic2Nyb2xsTGVmdD0iK2VsZW0uc2Nyb2xsTGVmdCsiLCAiKyJzY3JvbGxUb3A9IitlbGVtLnNjcm9sbFRvcCk7CiAgICAgICAgICAgIHRoaXMuZHVtcCgicGFyZW50U2Nyb2xsTGVmdD0iK3BhcmVudE5vZGUuc2Nyb2xsTGVmdCsiLCAiKyJwYXJlbnRTY3JvbGxUb3A9IitwYXJlbnROb2RlLnNjcm9sbFRvcCk7CgogICAgICAgICAgICAvL3RoaXMuZHVtcCgieDEiKTsKICAgICAgICAgICAgZWxlbS5wYXJlbnRXaWR0aCA9IHdpZHRoOwogICAgICAgICAgICBlbGVtLnBhcmVudEhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJ4MiIpOwoKICAgICAgICAgICAgLy8gVEhJUyBJUyBTTE9XIC0gYmVjYXVzZSBnZXRTdHlsZSB3YWxrcyB0aHJvdWdoIGFsbCAuc3R5bGUgYW5kIGxvYWRlZCAuY3NzCiAgICAgICAgICAgIC8vIEJVVCB3ZSBuZWVkIHRvIGRlY3JlbWVudCBpZiB1c2luZyBwYWRkaW5nLCBib3JkZXIsIC4uLi4KICAgICAgICAgICAgLyoKICAgICAgICAgICAgd2lkdGggLT0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy1sZWZ0IiksIDApOwogICAgICAgICAgICB3aWR0aCAtPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJwYWRkaW5nLXJpZ2h0IiksIDApOwogICAgICAgICAgICB3aWR0aCAtPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJib3JkZXItbGVmdC13aWR0aCIpLCAwKTsKICAgICAgICAgICAgd2lkdGggLT0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAiYm9yZGVyLXJpZ2h0LXdpZHRoIiksIDApOwogICAgICAgICAgICBoZWlnaHQgLT0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy10b3AiKSwgMCk7CiAgICAgICAgICAgIGhlaWdodCAtPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJwYWRkaW5nLWJvdHRvbSIpLCAwKTsKICAgICAgICAgICAgaGVpZ2h0IC09IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgImJvcmRlci10b3Atd2lkdGgiKSwgMCk7CiAgICAgICAgICAgIGhlaWdodCAtPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJib3JkZXItYm90dG9tLXdpZHRoIiksIDApOwoKICAgICAgICAgICAgd2lkdGggLT0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLnBhcmVudE5vZGUsICJwYWRkaW5nLWxlZnQiKSwgMCk7CiAgICAgICAgICAgIHdpZHRoIC09IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAicGFkZGluZy1yaWdodCIpLCAwKTsKICAgICAgICAgICAgLy93aWR0aCAtPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0ucGFyZW50Tm9kZSwgImJvcmRlci1sZWZ0LXdpZHRoIiksIDApOwogICAgICAgICAgICAvL3dpZHRoIC09IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAiYm9yZGVyLXJpZ2h0LXdpZHRoIiksIDApOwogICAgICAgICAgICBoZWlnaHQgLT0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLnBhcmVudE5vZGUsICJwYWRkaW5nLXRvcCIpLCAwKTsKICAgICAgICAgICAgaGVpZ2h0IC09IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAicGFkZGluZy1ib3R0b20iKSwgMCk7CiAgICAgICAgICAgIC8vaGVpZ2h0IC09IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAiYm9yZGVyLXRvcC13aWR0aCIpLCAwKTsKICAgICAgICAgICAgLy9oZWlnaHQgLT0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLnBhcmVudE5vZGUsICJib3JkZXItYm90dG9tLXdpZHRoIiksIDApOwoKICAgICAgICAgICAgLy93aWR0aCArPSBleHRyYWN0SW50KGVsZW0ucGFyZW50Tm9kZS5zY3JvbGxMZWZ0LCAwKTsKICAgICAgICAgICAgLy93aWR0aCAtPSBleHRyYWN0SW50KGVsZW0uc2Nyb2xsTGVmdCwgMCk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgCiAgICAgICAgICAgIC8vdmFyIHdpZHRoRCA9IDA7CiAgICAgICAgICAgIC8vdmFyIGhlaWdodEQgPSAwOwogICAgICAgICAgICAKICAgICAgICAgICAgLy90aGlzLmR1bXAoIngyLjEiKTsKICAgICAgICAgICAgd2lkdGggPSBnZXRSZWxhdGl2ZVdpZHRoKGVsZW0sIHdpZHRoKTsKICAgICAgICAgICAgLy90aGlzLmR1bXAoIngyLjIiKTsKICAgICAgICAgICAgaGVpZ2h0ID0gZ2V0UmVsYXRpdmVIZWlnaHQoZWxlbSwgaGVpZ2h0KTsKICAgICAgICAgICAgLy90aGlzLmR1bXAoIngzIik7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3RoaXMuZHVtcFRpbWVDb250aW51ZSgiWCIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLyoKICAgICAgICAgICAgdmFyIGZvcm1FbGVtRGVmYXVsdEJvcmRlcldpZHRoID0gMjsgICAgICAgLy8gVEVYVEFSRUEgd2l0aG91dCBhbnkgYm9yZGVyIHNldCBoYXMgZGVmYXVsdCBib3JkZXIKICAgICAgICAgICAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoZWxlbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICB3aWR0aEQgKz0gZXh0cmFjdEludChzdHlsZS5wYWRkaW5nTGVmdCwgMCk7CiAgICAgICAgICAgIHdpZHRoRCArPSBleHRyYWN0SW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMCk7CiAgICAgICAgICAgIHdpZHRoRCArPSAodHlwZW9mKHN0eWxlLmJvcmRlckxlZnRXaWR0aCkgIT0gInVuZGVmaW5lZCIgPyBleHRyYWN0SW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMCkgOiAoZWxlbS50YWdOYW1lID09ICJURVhUQVJFQSIgPyBmb3JtRWxlbURlZmF1bHRCb3JkZXJXaWR0aCA6IDApKTsKICAgICAgICAgICAgd2lkdGhEICs9ICh0eXBlb2Yoc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCkgIT0gInVuZGVmaW5lZCIgPyBleHRyYWN0SW50KHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDApIDogKGVsZW0udGFnTmFtZSA9PSAiVEVYVEFSRUEiID8gZm9ybUVsZW1EZWZhdWx0Qm9yZGVyV2lkdGggOiAwKSk7CiAgICAgICAgICAgIGhlaWdodEQgKz0gZXh0cmFjdEludChzdHlsZS5wYWRkaW5nVG9wLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0SW50KHN0eWxlLnBhZGRpbmdCb3R0b20sIDApOwogICAgICAgICAgICBoZWlnaHREICs9ICh0eXBlb2Yoc3R5bGUuYm9yZGVyVG9wV2lkdGgpICE9ICJ1bmRlZmluZWQiID8gZXh0cmFjdEludChzdHlsZS5ib3JkZXJUb3BXaWR0aCwgMCkgOiAoZWxlbS50YWdOYW1lID09ICJURVhUQVJFQSIgPyBmb3JtRWxlbURlZmF1bHRCb3JkZXJXaWR0aCA6IDApKTsKICAgICAgICAgICAgaGVpZ2h0RCArPSAodHlwZW9mKHN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKSAhPSAidW5kZWZpbmVkIiA/IGV4dHJhY3RJbnQoc3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDApIDogKGVsZW0udGFnTmFtZSA9PSAiVEVYVEFSRUEiID8gZm9ybUVsZW1EZWZhdWx0Qm9yZGVyV2lkdGggOiAwKSk7CiAgICAgICAgICAgIHdpZHRoRCArPSBleHRyYWN0SW50KHN0eWxlLm1hcmdpbkxlZnQsIDApOwogICAgICAgICAgICB3aWR0aEQgKz0gZXh0cmFjdEludChzdHlsZS5tYXJnaW5SaWdodCwgMCk7CiAgICAgICAgICAgIGhlaWdodEQgKz0gZXh0cmFjdEludChzdHlsZS5tYXJnaW5Ub3AsIDApOwogICAgICAgICAgICBoZWlnaHREICs9IGV4dHJhY3RJbnQoc3R5bGUubWFyZ2luQm90dG9tLCAwKTsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgLy9kdW1wKHN0eWxlKTsKICAgICAgICAgICAgLy9kdW1wKHN0eWxlLmJvcmRlcik7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKiAgICAgICAgCiAgICAgICAgICAgIHZhciBzdHlsZVAgPSBnZXRTdHlsZShlbGVtLnBhcmVudE5vZGUpOwogICAgICAgICAgICB3aWR0aEQgKz0gZXh0cmFjdEludChzdHlsZVAucGFkZGluZ0xlZnQsIDApOwogICAgICAgICAgICB3aWR0aEQgKz0gZXh0cmFjdEludChzdHlsZVAucGFkZGluZ1JpZ2h0LCAwKTsKICAgICAgICAgICAgd2lkdGhEICs9IDIqZXh0cmFjdEludChzdHlsZVAuYm9yZGVyTGVmdFdpZHRoLCAwKTsgICAgLy8gbmVjaGFwdSBwcm9jIDJ4IGFsZSBmdW5ndWplIHRvLCBwb2t1ZCBtYSBwYXJlbnQgYm9yZGVyIGEganNtZSBhdXRvZmlsbAogICAgICAgICAgICB3aWR0aEQgKz0gMipleHRyYWN0SW50KHN0eWxlUC5ib3JkZXJSaWdodFdpZHRoLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0SW50KHN0eWxlUC5wYWRkaW5nVG9wLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0SW50KHN0eWxlUC5wYWRkaW5nQm90dG9tLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RCArPSAyKmV4dHJhY3RJbnQoc3R5bGVQLmJvcmRlclRvcFdpZHRoLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RCArPSAyKmV4dHJhY3RJbnQoc3R5bGVQLmJvcmRlckJvdHRvbVdpZHRoLCAwKTsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB3aWR0aERQID0gMDsKICAgICAgICAgICAgdmFyIGhlaWdodERQID0gMDsKCiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJ4NCIpOwogICAgICAgICAgICB2YXIgc3R5bGVQID0gZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShlbGVtLnBhcmVudE5vZGUsICJkaXJzQ29udGFpbmVyIikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1bXAoIj8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Iik7CiAgICAgICAgICAgICAgICBkdW1wKHN0eWxlUCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgICAgLy90aGlzLmR1bXAoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAicGFkZGluZ1RvcCIpKTsKICAgICAgICAgICAgLy90aGlzLmR1bXAoc3R5bGVQKTsKICAgICAgICAgICAgLy90aGlzLmR1bXAoc3R5bGVQKTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJwYXJlbnQgcGFkZGluZzogWyIrc3R5bGVQWyJwYWRkaW5nVG9wIl0rIl0gWyIrc3R5bGVQWyJwYWRkaW5nUmlnaHQiXSsiXSBbIitzdHlsZVBbInBhZGRpbmdCb3R0b20iXSsiXSBbIitzdHlsZVBbInBhZGRpbmdMZWZ0Il0rIl0iKTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJwYXJlbnQgYm9yZGVyOiBbIitzdHlsZVBbImJvcmRlclRvcFdpZHRoIl0rIl0gWyIrc3R5bGVQWyJib3JkZXJSaWdodFdpZHRoIl0rIl0gWyIrc3R5bGVQWyJib3JkZXJCb3R0b21XaWR0aCJdKyJdIFsiK3N0eWxlUFsiYm9yZGVyTGVmdFdpZHRoIl0rIl0iKTsKCiAgICAgICAgICAgIHdpZHRoRFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlUFsicGFkZGluZ0xlZnQiXSwgMCk7CiAgICAgICAgICAgIHdpZHRoRFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlUFsicGFkZGluZ1JpZ2h0Il0sIDApOwogICAgICAgICAgICB3aWR0aERQICs9IGV4dHJhY3RGbG9hdChzdHlsZVBbImJvcmRlckxlZnRXaWR0aCJdLCAwKTsKICAgICAgICAgICAgd2lkdGhEUCArPSBleHRyYWN0RmxvYXQoc3R5bGVQWyJib3JkZXJSaWdodFdpZHRoIl0sIDApOwogICAgICAgICAgICB3aWR0aERQICs9IGV4dHJhY3RGbG9hdChwYXJlbnROb2RlLnNjcm9sbExlZnQsIDApOwoKICAgICAgICAgICAgaGVpZ2h0RFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlUFsicGFkZGluZ1RvcCJdLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlUFsicGFkZGluZ0JvdHRvbSJdLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlUFsiYm9yZGVyVG9wV2lkdGgiXSwgMCk7CiAgICAgICAgICAgIGhlaWdodERQICs9IGV4dHJhY3RGbG9hdChzdHlsZVBbImJvcmRlckJvdHRvbVdpZHRoIl0sIDApOwogICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBkb2N1bWVudC5ib2R5KQogICAgICAgICAgICAgICAgaGVpZ2h0RFAgKz0gZXh0cmFjdEZsb2F0KHBhcmVudE5vZGUuc2Nyb2xsVG9wLCAwKTsKCiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJ4NSIpOwogICAgICAgICAgICAvLyBtYXJnaW4KICAgICAgICAgICAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoZWxlbSk7CiAgICAgICAgICAgIHRoaXMuZHVtcCgibWFyZ2luOiBbIitzdHlsZVsibWFyZ2luVG9wIl0rIl0gWyIrc3R5bGVbIm1hcmdpblJpZ2h0Il0rIl0gWyIrc3R5bGVbIm1hcmdpbkJvdHRvbSJdKyJdIFsiK3N0eWxlWyJtYXJnaW5MZWZ0Il0rIl0iKTsKICAgICAgICAgICAgd2lkdGhEUCArPSBleHRyYWN0RmxvYXQoc3R5bGVbIm1hcmdpbkxlZnQiXSwgMCk7CiAgICAgICAgICAgIHdpZHRoRFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlWyJtYXJnaW5SaWdodCJdLCAwKTsKICAgICAgICAgICAgaGVpZ2h0RFAgKz0gZXh0cmFjdEZsb2F0KHN0eWxlWyJtYXJnaW5Ub3AiXSwgMCk7CiAgICAgICAgICAgIGhlaWdodERQICs9IGV4dHJhY3RGbG9hdChzdHlsZVsibWFyZ2luQm90dG9tIl0sIDApOwoKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJ4NiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gISEhISEhISEhISEgWkFLT01FTlRPVkFOTyAtIHYgaW5kZXh1IHRvIGRhdmEgY2NhIDEwcHggbWV6ZXJ1IHZwcmF2byBhIGRvbGUKICAgICAgICAgICAgLy8gaWYgZmlyc3QgY2hpbGQgZWxlbWVudCBoYXMgdG9wIG1hcmdpbiwgdGhlIHdob2xlIGRpdiBkcmF3cyBmcm9tIHRoaXMgbWFyZ2luCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW0uY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlbGVtLmNoaWxkTm9kZXNbaV0uc3R5bGUgJiYgZWxlbS5jaGlsZE5vZGVzW2ldLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBtVG9wID0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLmNoaWxkTm9kZXNbaV0sICJtYXJnaW5Ub3AiKSwgMCk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGdldFN0eWxlKGVsZW0uY2hpbGROb2Rlc1tpXSwgIm1hcmdpblRvcCIpKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAobVRvcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcCgiZmlyc3QgY2hpbGQgZWxlbWVudCB0b3AgbWFyZ2luOiBbIittVG9wKyJdIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcChlbGVtLmNoaWxkTm9kZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHREUCArPSBtVG9wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbUxlZnQgPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0uY2hpbGROb2Rlc1tpXSwgIm1hcmdpbkxlZnQiKSwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1MZWZ0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKCJmaXJzdCBjaGlsZCBlbGVtZW50IGxlZnQgbWFyZ2luOiBbIittVG9wKyJdIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcChlbGVtLmNoaWxkTm9kZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aERQICs9IG1MZWZ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgLy93aWR0aERQICo9IDI7CiAgICAgICAgICAgIC8vaGVpZ2h0RFAgKj0gMjsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy9kdW1wKGV4dHJhY3RJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDApKTsKICAgICAgICAgICAgLy9kdW1wKGV4dHJhY3RJbnQoc3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAwKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLmR1bXAoImNvdW50ZWRXaWR0aD0iK3dpZHRoKTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJjb3VudGVkSGVpZ2h0PSIraGVpZ2h0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJ3aWR0aERlY3JlbWVudD0iK3dpZHRoRCk7CiAgICAgICAgICAgIC8vdGhpcy5kdW1wKCJoZWlnaHREZWNyZW1lbnQ9IitoZWlnaHREKTsKCiAgICAgICAgICAgIHRoaXMuZHVtcCgid2lkdGhQYXJlbnREZWNyZW1lbnQ9Iit3aWR0aERQKTsKICAgICAgICAgICAgdGhpcy5kdW1wKCJoZWlnaHRQYXJlbnREZWNyZW1lbnQ9IitoZWlnaHREUCk7CgogICAgICAgICAgICAvL3dpZHRoIC09IHdpZHRoRDsKICAgICAgICAgICAgLy9oZWlnaHQgLT0gaGVpZ2h0RDsKCiAgICAgICAgICAgIHdpZHRoIC09IHdpZHRoRFA7CiAgICAgICAgICAgIGhlaWdodCAtPSBoZWlnaHREUDsKCiAgICAgICAgICAgIC8vdGhpcy5kdW1wKGhlaWdodCsiIC0gIitlbGVtLmlkKyIvIitlbGVtLmNsYXNzTmFtZSk7CiAgICAgICAgICAgIC8vdGhpcy5kdW1wVGltZUNvbnRpbnVlKCJjb3VudCBzaXplIik7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbCIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGx3aWR0aCIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGxoZWlnaHQiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRydWUgfHwgcGFyZW50Tm9kZSAhPSBkb2N1bWVudC5ib2R5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzaWJsaW5ncyA9IGdldFNpYmxpbmdOb2RlcyhlbGVtKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoc2libGluZ3MpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwIDsgcyA8IHNpYmxpbmdzLmxlbmd0aCA7IHMrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtUyA9IHNpYmxpbmdzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbVMudGFnTmFtZSAmJiBlbGVtUy50YWdOYW1lICE9ICJJTlBVVCIgJiYgZWxlbVMudGFnTmFtZSAhPSAiU0NSSVBUIiAmJiAhaGFzQ2xhc3NOYW1lKGVsZW1TLCAiZGVidWctY29udGFpbmVyIikgJiYgIWhhc0NsYXNzTmFtZShlbGVtUywgImRlYnVnLXBhbmVsLWZsb2F0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGVsZW1TLnRhZ05hbWUgJiYgZWxlbVMudGFnTmFtZSAhPSAiSU5QVVQiICYmIGVsZW1TLnRhZ05hbWUgIT0gIlNDUklQVCIgJiYgZ2V0U3R5bGUoZWxlbVMsICJwb3NpdGlvbiIpICE9ICJhYnNvbHV0ZSIgJiYgZ2V0U3R5bGUoZWxlbVMsICJwb3NpdGlvbiIpICE9ICJzdGF0aWMiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoZ2V0VGFnKGVsZW1TKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVTID0gZ2V0U3R5bGUoZWxlbVMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHN0eWxlUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGdldFN0eWxlKGVsZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKG91dGVySFRNTChlbGVtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoIiEiK2VsZW0uc3R5bGUuY3NzRmxvYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHN0eWxlUy5jc3NGbG9hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoc3R5bGUuY3NzRmxvYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDbGFzc05hbWUoZWxlbVMsICJkZWJ1Z0F1dG9TaXplQ291bnRlciIpICYmIHN0eWxlU1sicG9zaXRpb24iXSAhPSAiYWJzb2x1dGUiICYmIHN0eWxlU1sicG9zaXRpb24iXSAhPSAicmVsYXRpdmUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoRCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0RCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmR1bXAoZWxlbVMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2lkdGggLT0gZXh0cmFjdEludChzdHlsZS5tYXJnaW5MZWZ0LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpZHRoIC09IGV4dHJhY3RJbnQoc3R5bGUubWFyZ2luUmlnaHQsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVNbImRpc3BsYXkiXSAhPSAibm9uZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoZ2V0VGFnKGVsZW1TKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5kdW1wKCItPS09LT0tPS09LT06IGZsb2F0PSIrc3R5bGVTWyJmbG9hdCJdKyIsIGNsZWFyPSIrc3R5bGVTWyJjbGVhciJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmR1bXAoc3R5bGVTWyJmbG9hdCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmR1bXAoc3R5bGVTWyJjc3NGbG9hdCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmR1bXAoc3R5bGVbImZsb2F0Il0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZHVtcChzdHlsZVsiY3NzRmxvYXQiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3R5bGVTWyJkaXNwbGF5Il0gPT0gInRhYmxlLWNlbGwiIHx8IHN0eWxlU1siZGlzcGxheSJdID09ICJpbmxpbmUtYmxvY2siIHx8IHN0eWxlU1siZmxvYXQiXSA9PSAibGVmdCIgfHwgc3R5bGVTWyJmbG9hdCJdID09ICJyaWdodCIgfHwgc3R5bGVbImZsb2F0Il0gPT0gImxlZnQiIHx8IHN0eWxlWyJmbG9hdCJdID09ICJyaWdodCIpICYmIChzdHlsZVNbImNsZWFyIl0gIT0gImxlZnQiICYmIHN0eWxlU1siY2xlYXIiXSAhPSAicmlnaHQiICYmIHN0eWxlU1siY2xlYXIiXSAhPSAiYm90aCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aEQgKz0gZXh0cmFjdEZsb2F0KGVsZW1TLm9mZnNldFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoRCArPSBleHRyYWN0RmxvYXQoc3R5bGVTWyJtYXJnaW5MZWZ0Il0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhEICs9IGV4dHJhY3RGbG9hdChzdHlsZVNbIm1hcmdpblJpZ2h0Il0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAod2lkdGhEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcCgiYXV0b2ZpbGwgc2libGluZyB3aWR0aERlY3JlbWVudD0iK3dpZHRoRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHREICs9IGV4dHJhY3RGbG9hdChlbGVtUy5vZmZzZXRIZWlnaHQsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0RmxvYXQoc3R5bGVTWyJtYXJnaW5Ub3AiXSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHREICs9IGV4dHJhY3RGbG9hdChzdHlsZVNbIm1hcmdpbkJvdHRvbSJdLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGhlaWdodEQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKCJhdXRvZmlsbCBzaWJsaW5nIG9mZnNldEhlaWdodD0iK2V4dHJhY3RGbG9hdChlbGVtUy5vZmZzZXRIZWlnaHQsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoImF1dG9maWxsIHNpYmxpbmcgbWFyZ2luVG9wPSIrZXh0cmFjdEZsb2F0KHN0eWxlU1sibWFyZ2luVG9wIl0sIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoImF1dG9maWxsIHNpYmxpbmcgbWFyZ2luQm90dG9tPSIrZXh0cmFjdEZsb2F0KHN0eWxlU1sibWFyZ2luQm90dG9tIl0sIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoImF1dG9maWxsIHNpYmxpbmcgaGVpZ2h0RGVjcmVtZW50PSIraGVpZ2h0RCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAod2lkdGhEIHx8IGhlaWdodEQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcy5kdW1wKGdldFRhZyhlbGVtUykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIndpZHRoPSIrd2lkdGgrIi0iK3dpZHRoRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IHdpZHRoRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbGhlaWdodCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKCJoZWlnaHQ9IitoZWlnaHQrIi0iK2hlaWdodEQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLT0gaGVpZ2h0RDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hlaWdodCAtPSBleHRyYWN0SW50KHN0eWxlLmJvcmRlclRvcFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hlaWdodCAtPSBleHRyYWN0SW50KHN0eWxlLmJvcmRlckJvdHRvbVdpZHRoLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoZXh0cmFjdEludChzdHlsZS5wYWRkaW5nTGVmdCwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChleHRyYWN0SW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMCkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKG91dGVySFRNTChlbGVtUywgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtUy5zdHlsZS5ib3JkZXJMZWZ0V2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChnZXRTdHlsZShlbGVtUywgImJvcmRlciIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoZ2V0U3R5bGUoZWxlbVMsICJib3JkZXItbGVmdC13aWR0aCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpZHRoIC09IGV4dHJhY3RJbnQoZWxlbVMuc3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hlaWdodCAtPSBleHRyYWN0SW50KGVsZW1TLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy93aWR0aCAtPSAxMDsgLy8gYm9yZGVyPyAKICAgICAgICAgICAgICAgIC8vaGVpZ2h0IC09IDEwOyAvLyBib3JkZXI/IAogICAgICAgICAgICAgICAgLy9lbGVtLnN0eWxlLm91dGxpbmUgPSAiMXB4IGRhc2hlZCAjMDBGRjAwIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2hlaWdodCAtPSAxMDsKICAgICAgICAgICAgLy90aGlzLmR1bXBUaW1lQ29udGludWUoImF1dG9maWxsIik7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5kdW1wSW5kZW50OwogICAgICAgICAgICBoZWlnaHQgLT0gdGhpcy5kdW1wSW5kZW50OwoKCiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIDApOwogICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDApOwogICAgICAgICAgICAKICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgZXh0cmFjdEZsb2F0KGdldFN0eWxlKGVsZW0sICJtaW4td2lkdGgiKSwgMCkpOwogICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGV4dHJhY3RGbG9hdChnZXRTdHlsZShlbGVtLCAibWluLWhlaWdodCIpLCAwKSk7CgogICAgICAgICAgICAvL2R1bXAoZ2V0U3R5bGUoZWxlbSwgIm1pbi13aWR0aCIpKTsKICAgICAgICAgICAgCgogICAgICAgICAgICAvL2lmIChoYXNDbGFzc05hbWUoZWxlbSwgIl9Db21wb25lbnQiKSkKICAgICAgICAgICAgLy97CiAgICAgICAgICAgIC8vICAgIHdpZHRoIC09IDEwOwogICAgICAgICAgICAvLyAgICBoZWlnaHQgLT0gMTA7CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAKICAgICAgICAgICAgLy92YXIgb3ZlcmZsb3cgPSBnZXRTdHlsZShlbGVtLCAib3ZlZmxvdyIpOwogICAgICAgICAgICAvL2lmIChvdmVyZmxvdyA9PSAiIiB8fCBvdmVyZmxvdyA9PSAidmlzaWJsZSIpCiAgICAgICAgICAgICAgICAvL2VsZW0uc3R5bGUub3ZlcmZsb3cgPSAiYXV0byI7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJ3N0eWxlV2lkdGg9JytzdHlsZVdpZHRoKTsKICAgICAgICAgICAgLy9kdW1wKCdzdHlsZUhlaWdodD0nK3N0eWxlSGVpZ2h0KTsKICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b3NpemUiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG93aWR0aCIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGwiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsd2lkdGgiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdldFRhZ05hbWUoZWxlbSkgIT0gImZvcm0iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZXh0cmFjdEZsb2F0KHdpZHRoLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gLTEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoZ2V0VGFnKGVsZW0ucGFyZW50Tm9kZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoIng6ICIrZWxlbS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSAmJiBwYXJlbnROb2RlLnNjcm9sbEhlaWdodCAmJiBnZXRTdHlsZShwYXJlbnROb2RlLCAib3ZlcmZsb3ciKSA9PSAiYXV0byIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcCgicGFyZW50IGhhcyB2ZXJ0aWNhbCBzY3JvbGxiYXIgLSB3aWR0aCA9ICIrd2lkdGgrIi0iK3RoaXMuc2Nyb2xsQmFyV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5zY3JvbGxCYXJXaWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BvcnRvdm5pbGlzdHkuY3ogbmEgV2luWFAgYSBGRiBwcmlkYXZhamkgMXB4IC0gbmVwb2RhcmlsbyBzZSB6amlzdGl0IHZlIFZNIHByb2MsIHRhbSB0byBmdW5ndWplLCB0b3RvIGplIHRlc3RvdmFjaSBwcm8gZml4CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAxNDY1ICYmIHR5cGVvZihhdXRvc2l6ZVhQRml4KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3NpemVYUEZpeCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCh3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpblhQIEZGIGJ1ZyBmaXggcG9CZWZvcmUvQWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvc0JlZm9yZSA9IGdldFBvc2l0aW9uKGVsZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAid2lkdGgiLCB3aWR0aCsncHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvc0FmdGVyID0gZ2V0UG9zaXRpb24oZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NCZWZvcmUueSAhPSBwb3NBZnRlci55KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3dlciBkb3duIHdpZHRoIGJ5IDFweAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJ3aWR0aCIsIHdpZHRoKydweCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIm5ld1dpZHRoOiAiK3dpZHRoKyIgLi4uICIrZWxlbS5zdHlsZS53aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgIndpZHRoIiwgImF1dG8iKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL3NldFN0eWxlKGVsZW0sICJvdXRlcldpZHRoIiwgd2lkdGgrJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy90aGlzLmR1bXAoImZvcm0gc3R5bGUgYXR0cmlidXRlOiAiK2VsZW0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpKTsKICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAiZGlzcGxheSIsICdibG9jaycpOwogICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJvdmVyZmxvdyIsICdoaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAid2lkdGgiLCB3aWR0aCsncHgnKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLmR1bXAoIm5ld1dpZHRoOiAiK3dpZHRoKyIgLi4uIFtmb3IgRk9STSBlbGVtZW50XSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKF93aWR0aCk7CiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLndpZHRoID0gX3dpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvc2l6ZSIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2hlaWdodCIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGwiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsaGVpZ2h0IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChnZXRUYWdOYW1lKGVsZW0pICE9ICJmb3JtIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBleHRyYWN0RmxvYXQoaGVpZ2h0LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA+IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChlbGVtLnBhcmVudE5vZGUuc2Nyb2xsV2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSAmJiBwYXJlbnROb2RlLnNjcm9sbFdpZHRoICYmIGdldFN0eWxlKHBhcmVudE5vZGUsICJvdmVyZmxvdyIpID09ICJhdXRvIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKCJwYXJlbnQgaGFzIGhvcml6b250YWwgc2Nyb2xsYmFyIC0gaGVpZ2h0ID0gIitoZWlnaHQrIi0iK3RoaXMuc2Nyb2xsQmFyV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC09IHRoaXMuc2Nyb2xsQmFyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJoZWlnaHQiLCBoZWlnaHQrJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcCgibmV3SGVpZ2h0OiAiK2hlaWdodCsiIC4uLiAiK2VsZW0uc3R5bGUuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAiaGVpZ2h0IiwgImF1dG8iKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL3NldFN0eWxlKGVsZW0sICJoZWlnaHQiLCBoZWlnaHQrJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgLy9zZXRTdHlsZShlbGVtLCAib3V0ZXJIZWlnaHQiLCBoZWlnaHQrJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImRpc3BsYXkiLCAnYmxvY2snKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGx3aWR0aCIpKQogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAib3ZlcmZsb3ciLCAnaGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImhlaWdodCIsIGhlaWdodCsncHgnKTsKCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKCJuZXdIZWlnaHQ6ICIraGVpZ2h0KyIgLi4uIFtmb3IgRk9STSBlbGVtZW50XSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUuaGVpZ2h0ID0gX2hlaWdodDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gIkZPUk0iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2FsZXJ0KDEpOwogICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgImJvcmRlcjoycHggc29saWQgI0ZGRkYwMCIpOwogICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5jc3NGbG9hdCA9ICJsZWZ0IjsKICAgICAgICAgICAgICAgIGR1bXAoZWxlbS5zdHlsZSk7CiAgICAgICAgICAgICAgICAvL2VsZW0uc3R5bGUuYm9yZGVyID0gIjJweCBzb2xpZCAjRkZGRjAwIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmR1bXAoZ2V0VGFnKGVsZW0pKTsKICAgICAgICAgICAgLy9pZiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJfRGlhbG9nQ29udGVudENvbnRhaW5lciIpKQogICAgICAgICAgICAvLyAgICBhbGVydChnZXRUYWcoZWxlbSkpOwogICAgICAgICAgICAvL2VsZW0uc3R5bGUud2lkdGggPSB3aWR0aCsncHgnOwogICAgICAgICAgICAvL2VsZW0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0KydweCc7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2lmIChlbGVtLnRhZ05hbWUgIT0gIk9CSkVDVCIgJiYgZWxlbS50YWdOYW1lICE9ICJFTUJFRCIpIC8vIGhpZGluZyBjYXVzZXMgRmxhc2ggdG8gcmVsb2FkCiAgICAgICAgICAgIC8vICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IF9kaXNwbGF5OwogICAgICAgICAgICAvL2VsZW0uc3R5bGUub3ZlcmZsb3cgPSBfb3ZlcmZsb3c7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2VsZW0uc3R5bGUub3ZlcmZsb3cgPSBfb3ZlcmZsb3c7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgLy90aGlzLmR1bXAoaGVpZ2h0KyIgLSAiK2VsZW0uaWQrIi8iK2VsZW0uY2xhc3NOYW1lKTsKICAgICAgICAgICAgLy90aGlzLmR1bXAocGFyZW50Tm9kZS50YWdOYW1lKTsKICAgICAgICAgICAgLy90aGlzLmR1bXAocGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy90aGlzLmR1bXAoImFmdGVyIGF1dG9zaXplOiIpOwogICAgICAgICAgICAvL3RoaXMuZHVtcChvdXRlckhUTUwoZWxlbSkpOwoKICAgICAgICAgICAgLy90aGlzLmR1bXBUaW1lQ29udGludWUoInNldCB3aWR0aCIpOwoKICAgICAgICAgICAgLy8gc2V0IGJhY2sgb2xkIG92ZXJmbG93CiAgICAgICAgICAgIGlmICh0aGlzLnVzZVBhcmVudE92ZXJmbG93KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB3aGlsZShub2RlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qaWYgKG5vZGUuc3R5bGUgJiYgKG5vZGUuc3R5bGUub3ZlcmZsb3cgPT0gImF1dG8iIHx8IG5vZGUuc3R5bGUub3ZlcmZsb3cgPT0gInNjcm9sbCIpKSovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gZG9jdW1lbnQgJiYgbm9kZS50YWdOYW1lID09ICJESVYiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdmFsID0gb3ZlcmZsb3dQYXJlbnRMaXN0LnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9kZS5zdHlsZS5vdmVyZmxvdyA9IHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZUhpZGVFbGVtZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJGaXJlZm94IiB8fCBCcm93c2VyLm5hbWUgPT0gIkNocm9tZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0VsZW1lbnQobm9kZSk7IC8vIG5lZWRlZCBkdWUgdG8gRmxhc2ggcmVsb2FkIGJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ2xhc3NOYW1lKG5vZGUsICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUub3ZlcmZsb3cgPSBub2RlLl9hdXRvU2l6ZU9sZE92ZXJmbG93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ2xhc3NOYW1lKG5vZGUsICJhdXRvZmlsbHdpZHRoIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5vdmVyZmxvdyA9IG5vZGUuX2F1dG9TaXplT2xkT3ZlcmZsb3c7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIHZhciBub2RlID0gZWxlbS5wYXJlbnROb2RlOwogICAgICAgICAgICB3aGlsZShub2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobm9kZS5fb3ZlcmZsb3cpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5vdmVyZmxvdyA9IG5vZGUuX292ZXJmbG93OwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQobm9kZS5fb3ZlcmZsb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5kdW1wVGltZUNvbnRpbnVlKCJiYWNrIG92ZXJmbG93Iik7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoZmFsc2UgJiYgdGhpcy5kdW1wRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG5vZGUxOwogICAgICAgICAgICAgICAgaWYgKGVsZW0uY2hpbGROb2Rlc1swXSAmJiBlbGVtLmNoaWxkTm9kZXNbMF0uY2xhc3NOYW1lID09ICJkZWJ1Z0F1dG9TaXplQ291bnRlciIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbm9kZTEgPSBlbGVtLmNoaWxkTm9kZXNbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbm9kZTEgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgICAgICBub2RlMS5jbGFzc05hbWUgPSAiZGVidWdBdXRvU2l6ZUNvdW50ZXIiOwogICAgICAgICAgICAgICAgICAgIG5vZGUxLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShub2RlMSwgIndpZHRoIiwgd2lkdGgrInB4Iik7CiAgICAgICAgICAgICAgICAgICAgbm9kZTEuc3R5bGUudGV4dEFsaWduID0gInJpZ2h0IjsKICAgICAgICAgICAgICAgICAgICBhcHBlbmRGaXJzdChlbGVtLCBub2RlMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG5vZGUyID0gY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgbm9kZTIuc3R5bGUuYmFja2dyb3VuZCA9ICIjMDAwMEZGIjsKICAgICAgICAgICAgICAgIG5vZGUyLnN0eWxlLmNvbG9yID0gIiNGRkZGRkYiOwogICAgICAgICAgICAgICAgbm9kZTIuc3R5bGUuZm9udFdlaWdodCA9ICJib2xkIjsKICAgICAgICAgICAgICAgIG5vZGUyLnN0eWxlLnBhZGRpbmcgPSAiMnB4IjsKICAgICAgICAgICAgICAgIG5vZGUyLnN0eWxlLm1hcmdpbkxlZnQgPSAiNHB4IjsKICAgICAgICAgICAgICAgIG5vZGUyLmlubmVySFRNTCA9IHRoaXMucmVzaXplQ291bnRlcjsKCiAgICAgICAgICAgICAgICBhcHBlbmRGaXJzdChub2RlMSwgbm9kZTIpOwogICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5vdXRsaW5lID0gJzJweCBkYXNoZWQgIzAwMDBGRic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgICAgLy90aGlzLmR1bXBUaW1lQ29udGludWUoImFkZGluZyBjb3VudGVyIik7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImZvcm0iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHNvIG11c3QgYmUgb3ZlcmZsb3c6aGlkZGVuIGluIGV4dGVybmFsIENTUwogICAgICAgICAgICAgICAgLy9hbGVydCgiZm9ybSIpOwogICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5tYXJnaW4gPSAiMHB4IjsKICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUucGFkZGluZyA9ICIwcHgiOwogICAgICAgICAgICAgICAgaWYgKCFoYXNDbGFzc05hbWUoZWxlbSwgImF1dG9maWxsd2lkdGgiKSkKICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcmVzaXplZCA9IHRydWU7CiAgICAgICAgICAgIC8vdGhpcy5kdW1wVGltZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhciByZXNpemVkID0gZmFsc2U7CgogICAgICAgIC8vIHRyb2NodSBiZXJsaWNrYSBwcm8gcG9tYWxlanNpIEZGIGEga29tcG9uZW50dSBFdmVudHNQYWdlQ29udHJvbCBwbyBwcmlkYW5pIG5vdmUgemFsb3preSAtIGFzaSB1ZGVsYXQgbGVwZSAtIG5lanNwaXMgc2UgbmV2b2xhIGF1dG9zaXplLCBrZHl6IHNlIHptZW5pIGRpc3BsYXk6bm9uZSBuYSBkaXNwbGF5OmJsb2NrCiAgICAgICAgaWYgKGZhbHNlICYmIChlbGVtLnN0eWxlLndpZHRoID09ICIxcHgiIHx8IGVsZW0uc3R5bGUuaGVpZ2h0ID09ICIxcHgiKSAmJiAoaGFzQ2xhc3NOYW1lKGVsZW0ucGFyZW50Tm9kZSwgImF1dG9zaXplIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0ucGFyZW50Tm9kZSwgImF1dG9maWxsIikpKSAvLyAhTk9UIGZvciBhdXRvaGVpZ2h0IGFuZCBhdXRvd2lkdGgKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZWxlbS5fX2F1dG9TaXplV3JvbmdSZXNpemVDb3VudGVyKQogICAgICAgICAgICAgICAgZWxlbS5fX2F1dG9TaXplV3JvbmdSZXNpemVDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZWxlbS5fX2F1dG9TaXplV3JvbmdSZXNpemVDb3VudGVyIDwgNSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9fdGhyb3coIlRBdXRvU2l6ZTo6YXV0b1NpemVFbGVtZW50KCkgLSBzb21ldGhpbmcgd2FzIHdyb25nIC0gMXB4IHdpZHRoL2hlaWdodCBvbiBlbGVtZW50ICIraHRtbGVudGl0aWVzKG91dGVySFRNTChlbGVtKSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgX2VsZW0gPSBlbGVtOwogICAgICAgICAgICAgICAgZWxlbS5fX2F1dG9TaXplV3JvbmdSZXNpemVDb3VudGVyKys7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbS5fX2F1dG9TaXplV3JvbmdSZXNpemVUaW1lcik7CiAgICAgICAgICAgICAgICBlbGVtLl9fYXV0b1NpemVXcm9uZ1Jlc2l6ZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLmZvcmNlUmVzaXplKF9lbGVtLnBhcmVudE5vZGUpO190aGlzLmZvcmNlUmVzaXplKF9lbGVtKTt9LCAxMDAwKTsKCiAgICAgICAgICAgICAgICByZXNpemVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbGVtLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiKQogICAgICAgICAgICAgICAgOyAvL190aHJvdygiVEF1dG9TaXplOjphdXRvU2l6ZUVsZW1lbnQoKSAtIHNvbWV0aGluZyB3YXMgd3JvbmcgYW5kIGNvdWxkIG5vdCByZXBhaXIgLSAxcHggd2lkdGgvaGVpZ2h0IG9uIGVsZW1lbnQgIitodG1sZW50aXRpZXMob3V0ZXJIVE1MKGVsZW0pKSk7CiAgICAgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgdGhpcy5kdW1wVGltZSgiYXV0b1NpemVFbGVtZW50KCkiKTsKCiAgICAgICAgLy9pZiAodGhpcy5kdW1wRGF0YSAmJiAhdGhpcy5kdW1wRGVidWdQYW5lbHMgJiYgb3V0ZXJIVE1MKGVsZW0pLmluZGV4T2YoIkRlYnVnUGFuZWwiKSAhPSAtMSkKICAgICAgICAvLyAgICB0aGlzLmR1bXBEYXRhID0gdHJ1ZTsKICAgICAgICAvKgogICAgICAgICAgICBpZiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJfRGlhbG9nQ29udGVudENvbnRhaW5lciIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbGVydChlbGVtLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgICAgICB2YXIgX2VsZW0gPSBlbGVtOwogICAgICAgICAgICAgICAgYWRkRXZlbnQoZWxlbSwgInJlc2l6ZSIsIGZ1bmN0aW9uKCl7aWYoZWxlbS5vZmZzZXRIZWlnaHQgPT0gNzExKSB2YXIgY2FsbD1nZXRGdW5jdGlvbkNhbGwoKTtmb3IodmFyIGkgPSAwIDsgaSA8IDMwIDsgaSsrKWFsZXJ0KGNhbGxbaV0pO30pOwogICAgICAgICAgICAgICAgYWxlcnQoZ2V0VGFnKGVsZW0pKTsKICAgICAgICAgICAgfQogICAgICAgICovCiAgICAgICAgLy9kdW1wKGdldFRhZyhlbGVtKSk7CiAgICAgICAgcmV0dXJuKHJlc2l6ZWQpOwogICAgfQp9CgpUQXV0b1NpemUucHJvdG90eXBlLmF1dG9TaXplTmV3RWxlbWVudHMgPSBmdW5jdGlvbihlbGVtcykKewogICAgLy8vU3RhcnQoKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgZWxlbSA9IGVsZW1zW2ldOwogICAgICAgIHRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5wdXNoKGVsZW0pOwogICAgfQogICAgCiAgICAvL3RoaXMuZHVtcFRpbWUoImF1dG9zaXplIG5ldyBlbGVtZW50cyAoZm91bmQ6ICIrZWxlbXMubGVuZ3RoKyIpIik7CiAgICBpZiAoIXRoaXMua2V5RGVidWcgJiYgIXRoaXMucmVzaXppbmdFbGVtZW50cykKICAgICAgICB0aGlzLl9yZXNpemVFbGVtZW50cygpOwp9CgoKVEF1dG9TaXplLnByb3RvdHlwZS5hdXRvU2l6ZU5ld0dyb3VwRWxlbWVudHMgPSBmdW5jdGlvbihlbGVtcykKewogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHRoaXMuZ3JvdXBFbGVtZW50c1RvUmVzaXplLnB1c2goZWxlbXNbaV0pOwogICAgfQoKICAgIGlmICghdGhpcy5rZXlEZWJ1ZyAmJiAhdGhpcy5yZXNpemluZ0VsZW1lbnRzKQogICAgICAgIHRoaXMuX3Jlc2l6ZUVsZW1lbnRzKCk7Cn0KCi8qClRBdXRvU2l6ZS5wcm90b3R5cGUuX29uVGltZXIgPSBmdW5jdGlvbigpCnsKICAgIC8vdGhpcy5kdW1wKCJUQXV0b1NpemUuX29uVGltZXIoKSAtICIrKG5ldyBEYXRlKCkudG9TdHJpbmcoKSkpOwogICAgLy9kdW1wKCdUJyk7CiAgICAvL3RoaXMuZHVtcFRpbWVTdGFydCgpOwogICAgCiAgICBpZiAoIXRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5sZW5ndGgpCiAgICB7CiAgICAgICAgdmFyIG5ld0ZvdW5kID0gdGhpcy5maW5kTmV3RWxlbWVudHMoKTsKICAgICAgICBpZiAobmV3Rm91bmQubGVuZ3RoKQogICAgICAgICAgICB0aGlzLmF1dG9TaXplTmV3RWxlbWVudHMobmV3Rm91bmQpOwogICAgCiAgICAgICAgdGhpcy50aW1lckNvdW50ZXIrKzsKICAgICAgICAvL2lmICh0aGlzLnRpbWVyQ291bnRlciA8IDIpCiAgICB9CiAgICBlbHNlCiAgICAgICAgdGhpcy5kdW1wKCJOb3RoaW5nIGRvbmUsIGJlY2F1c2UgdGhlcmUgaXMgIit0aGlzLmVsZW1lbnRzVG9SZXNpemUubGVuZ3RoKyIgZWxlbWVudHMgcmVtYWluaW5nIHRvIHJlc2l6ZSIpOwogICAgCiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgaWYgKCF0aGlzLmtleURlYnVnKQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5fb25UaW1lcigpfSwgdGhpcy50aW1lcik7CiAgICAvL3RoaXMuZHVtcFRpbWUoIlRPVEFMIFRJTUVSIFRJTUUiKTsKfQoqLwoKVEF1dG9TaXplLnByb3RvdHlwZS5fb25QYXJlbnROb2RlUmVzaXplID0gZnVuY3Rpb24oZWxlbSkKewogICAgLy8gRE8gTk9UIFJFTU9WRSAtIGp1c3QgYSBkdW1teSB0byByZWNvdW50IHNjcm9sbFdpZHRoIC8vIGVsc2UgdHJ5IHRvIG9wZW4gSW1hZ2UgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUKICAgIHZhciBkdW1teSA9IGVsZW0uc2Nyb2xsV2lkdGg7CiAgICB2YXIgZHVtbXkgPSBlbGVtLnNjcm9sbEhlaWdodDsKICAgIAogICAgLy9kdW1wKGdldFRhZyhlbGVtKSk7CiAgICAvL2R1bXAoZWxlbS5zY3JvbGxXaWR0aCk7CiAgICAvL2R1bXAoZWxlbS5zY3JvbGxIZWlnaHQpOwogICAgLy9pZiAodGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCkKICAgIC8vICAgIGR1bXAoIk5PVCIpOwogICAgCiAgICAKICAgIC8vaWYgKHRoaXMuaXNBdXRvU2l6ZUVsZW1lbnQoZWxlbSkpCiAgICAvL3sKICAgICAgICAvL3RoaXMuZHVtcCgiVEF1dG9TaXplLl9vblBhcmVudE5vZGVSZXNpemUoKSIpOwogICAgICAgIAogICAgICAgIC8vaWYgKGVsZW0uaWQgJiYgZWxlbS5pZC5pbmRleE9mKCJQcm9wZXJ0eUVkaXRvckNvbnRhaW5lciIpID09IDApCiAgICAgICAgICAgIC8vZHVtcChnZXRUYWcoZWxlbSkpOwogICAgICAgICAgICAvL2R1bXAoZWxlbS5zY3JvbGxIZWlnaHQpOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW0uYXV0b1NpemVFbGVtZW50cy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmVsZW1lbnRzVG9SZXNpemUucHVzaChlbGVtLmF1dG9TaXplRWxlbWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICAvL2lmIChlbGVtICYmIGVsZW0uaWQgJiYgZWxlbS5pZC5pbmRleE9mKCJQcm9wZXJ0eUVkaXRvckNvbnRhaW5lcl8iKSA9PSAwKQogICAgICAgIC8vICAgIGR1bXAoZWxlbS5zY3JvbGxIZWlnaHQpOwogICAgICAgIAogICAgICAgIC8vdGhpcy5kdW1wVGltZSgiVE9UQUwgT05SRVNJWkUgVElNRSIpOwogICAgICAgIGlmICghdGhpcy5rZXlEZWJ1ZyAmJiAhdGhpcy5yZXNpemluZ0VsZW1lbnRzKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLl9yZXNpemVFbGVtZW50cygpO30sIDEwMCk7CiAgICAgICAgICAgIC8vdGhpcy5fcmVzaXplRWxlbWVudHMoKTsKICAgICAgICB9CiAgICAvL30KfQoKVEF1dG9TaXplLnByb3RvdHlwZS5mb3JjZVJlc2l6ZSA9IGZ1bmN0aW9uKGVsZW0pCnsKICAgIGlmICh0aGlzLmZsZXgpCiAgICB7CiAgICAgICAgdGhpcy5hdXRvU2l6ZUVsZW1lbnQoZWxlbSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBpZiAoIXRoaXMuaW5pdFJlc2l6ZWQpCiAgICB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgX2VsZW0gPSBlbGVtOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5mb3JjZVJlc2l6ZShfZWxlbSl9LCAxMDApOwogICAgICAgIC8vZHVtcCgnYScpOwogICAgICAgIAogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgLy9kdW1wKCd4Jyk7CgogICAgaWYgKCF0aGlzLmlzQXV0b1NpemVFbGVtZW50KGVsZW0pKQogICAgewogICAgICAgIHRoaXMuZmluZE5ld0VsZW1lbnRzKCk7CiAgICB9CiAgICAKICAgIGVsZW0uc3R5bGUud2lkdGggPSAiMXB4IjsKICAgIGVsZW0uc3R5bGUuaGVpZ2h0ID0gIjFweCI7CiAgICAvL3RoaXMub25XaW5kb3dSZXNpemUoKTsKICAgIC8vcmV0dXJuOwogICAgCiAgICAvL2R1bXAoZWxlbSk7CiAgICAvL2R1bXAodGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCk7CiAgICBlbGVtLmZvcmNlUmVzaXplID0gdHJ1ZTsKICAgIHRoaXMuZWxlbWVudHNUb1Jlc2l6ZS5wdXNoKGVsZW0pOwogICAgCiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtLmF1dG9TaXplQ2hpbGRMaXN0Lmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgX2VsZW0gPSBlbGVtLmF1dG9TaXplQ2hpbGRMaXN0W2ldOwogICAgICAgIF9lbGVtLmZvcmNlUmVzaXplID0gdHJ1ZTsKICAgICAgICB0aGlzLmVsZW1lbnRzVG9SZXNpemUucHVzaChfZWxlbSk7CiAgICB9CiAgICAvL2R1bXAodGhpcy5lbGVtZW50c1RvUmVzaXplLmxlbmd0aCk7CiAgICAKICAgIGlmICghdGhpcy5rZXlEZWJ1ZyAmJiAhdGhpcy5yZXNpemluZ0VsZW1lbnRzKQogICAgICAgIHRoaXMuX3Jlc2l6ZUVsZW1lbnRzKCk7Cn0KClRBdXRvU2l6ZS5wcm90b3R5cGUuX29uU2libGluZ05vZGVSZXNpemUgPSBmdW5jdGlvbihlbGVtKQp7CiAgICBpZiAodGhpcy5yZXNpemluZ0VsZW1lbnRzKQogICAgICAgIHJldHVybjsKICAgIAogICAgaWYgKCFlbGVtLnRhZ05hbWUpCiAgICB7CiAgICAgICAgX3Rocm93KCJUQXV0b1NpemU6Ol9vblNpYmxpbmdOb2RlUmVzaXplKCkgLSBlbGVtIGlzIG5vdCB0YWcgYnV0ICIrZWxlbSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChnZXRTdHlsZShlbGVtLCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiIHx8IGdldFN0eWxlKGVsZW0sICJwb3NpdGlvbiIpID09ICJzdGF0aWMiKQogICAgICAgIHJldHVybjsKICAgIAogICAgLy9yZXR1cm47CiAgICB0aGlzLmR1bXAoIlRBdXRvU2l6ZS5fb25TaWJsaW5nTm9kZVJlc2l6ZSgpIik7CiAgICAvL2R1bXAoIlRBdXRvU2l6ZS5fb25TaWJsaW5nTm9kZVJlc2l6ZSgpIik7CiAgICAvL2R1bXAoZWxlbSk7CiAgICAKICAgIHZhciBsaXN0ID0gZ2V0U2libGluZ05vZGVzKGVsZW0pOwogICAgZm9yICh2YXIgbCA9IDAgOyBsIDwgbGlzdC5sZW5ndGggOyBsKyspCiAgICB7CiAgICAgICAgaWYgKGxpc3RbbF0udGFnTmFtZSAmJiAoaGFzQ2xhc3NOYW1lKGxpc3RbbF0sICJhdXRvZmlsbCIpIHx8IGhhc0NsYXNzTmFtZShsaXN0W2xdLCAiYXV0b2ZpbGx3aWR0aCIpIHx8IGhhc0NsYXNzTmFtZShsaXN0W2xdLCAiYXV0b2ZpbGxoZWlnaHQiKSkpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAobGlzdFtsXSk7CiAgICAgICAgICAgIGxpc3RbbF0uZm9yY2VSZXNpemUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVsZW1lbnRzVG9SZXNpemUucHVzaChsaXN0W2xdKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmICghdGhpcy5rZXlEZWJ1ZyAmJiAhdGhpcy5fcmVzaXppbmdFbGVtZW50cykKICAgICAgICB0aGlzLl9yZXNpemVFbGVtZW50cygpOwp9CgpUQXV0b1NpemUucHJvdG90eXBlLm91dGxpbmVBY3RpdmVFbGVtZW50ID0gZnVuY3Rpb24oZWxlbSkKewogICAgaWYgKGVsZW0pCiAgICB7CiAgICAgICAgaWYgKHRoaXMub3V0bGluZUVsZW1lbnQpCiAgICAgICAgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vdXRsaW5lRWxlbWVudFRpbWVyKTsKICAgICAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMub3V0bGluZUVsZW1lbnQsICJfQXV0b1NpemVEZWJ1Z091dGxpbmUiKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vdXRsaW5lRWxlbWVudCA9IGVsZW07CiAgICB9CiAgICAKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBpZiAoaGFzQ2xhc3NOYW1lKHRoaXMub3V0bGluZUVsZW1lbnQsICJfQXV0b1NpemVEZWJ1Z091dGxpbmUiKSkKICAgIHsKICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5vdXRsaW5lRWxlbWVudCwgIl9BdXRvU2l6ZURlYnVnT3V0bGluZSIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLm91dGxpbmVFbGVtZW50LCAiX0F1dG9TaXplRGVidWdPdXRsaW5lIik7CiAgICB9CgogICAgdGhpcy5vdXRsaW5lRWxlbWVudFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLm91dGxpbmVBY3RpdmVFbGVtZW50KG51bGwpfSwgNTAwKTsKfQoKd2luZG93LkF1dG9TaXplID0gbmV3IFRBdXRvU2l6ZSgpOw==Ll9BdXRvU2l6ZURlYnVnT3V0bGluZSB7DQogICAgb3V0bGluZTogMnB4IGRvdHRlZCAjRkYwMDAwICFpbXBvcnRhbnQ7DQogICAgYmFja2dyb3VuZDogI0ZGQUFBQSAhaW1wb3J0YW50Ow0KfQ0KDQovKg0KZm9ybSB7DQogICAgb3V0bGluZTogMXB4IHNvbGlkICMwMEZGMDAgIWltcG9ydGFudDsNCiAgICBtYXJnaW46IDBweCAhaW1wb3J0YW50OyANCiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDsgDQp9DQoqLw0KLyouYXV0b3NpemUgew0KICAgIHdpZHRoOiAxMDAlOw0KICAgIGhlaWdodDogMTAwJTsNCn0NCg0KLmF1dG93aWR0aCB7DQogICAgd2lkdGg6IDEwMCU7DQp9DQoNCi5hdXRvaGVpZ2h0IHsNCiAgICBoZWlnaHQ6IDEwMCU7DQp9DQoNCi5hdXRvZmlsbCB7DQogICAgd2lkdGg6IDEwMCU7DQogICAgaGVpZ2h0OiAxMDAlOw0KfQ0KKi8=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQXV0b1NpemUvQXV0b1NpemUuY2xhc3MucGhwIC0tLS0tLS0gDQoKY2xhc3MgVEF1dG9TaXplIGV4dGVuZHMgVE9iamVjdAp7CiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0SGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIGlmICghQUpBWCAmJiAhaGVhZEh0bWxBZGRlZChfX0NMQVNTX18sICRwYXJhbXMpKQogICAgICAgIHsKICAgICAgICAgICAgcGFyZW50OjpvbkdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgICAgICAgICBpZiAoJF9SRVFVRVNUWyJkZWJ1Z0F1dG9TaXplIl0pCiAgICAgICAgICAgICAgICBhZGRIZWFkSHRtbCgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPnZhciBkZWJ1Z0F1dG9TaXplPXRydWU7PC9zY3JpcHQ+Iix0cnVlKTsKICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0F1dG9TaXplL0F1dG9TaXplLmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOwogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPGxpbmsgaHJlZj0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvQXV0b1NpemUvQXV0b1NpemUuY3NzJyByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJyAvPiIsdHJ1ZSk7CiAgICAgICAgICAgIGFkZEV4dGVuZGluZ0hlYWRIdG1sKCRwYXJhbXMsIF9fQ0xBU1NfXyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG9uR2V0Q29udGVudCgmJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgICR0aGlzLT5nZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICBwYXJlbnQ6Om9uR2V0Q29udGVudCgkcGFyYW1zKTsKICAgIH0KfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvUHJvY2Vzcy9Qcm9jZXNzLmNsYXNzLnBocCAtLS0tLS0tIA0KCi8vIFRPRE8KY2xhc3MgVFByb2Nlc3MgZXh0ZW5kcyBUT2JqZWN0CnsKCXZhciAkaWQ7Cgl2YXIgJG5hbWU7Cgl2YXIgJHBhcmFtcyA9IGFycmF5KCk7Cgl2YXIgJE1hbmFnZXIgPSBOVUxMOwogICAgdmFyICRzZWNvbmRzQmVmb3JlVGltZW91dCA9IDE7CiAgICB2YXIgJGlnbm9yZWRTZXJpYWxpemVQcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgIHZhciAkcHJvZ3Jlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkKCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCXsKICAgICAgICBnbG9iYWwgJF9fc2NyaXB0U3RhcnRUaW1lOwogICAgICAgIAogICAgICAgICR0aGlzLT5zdGFydFRpbWUgPSAkX19zY3JpcHRTdGFydFRpbWU7CiAgICAgICAgCiAgICAgICAgLy8gY3JlYXRlIGluaXRpYWwgc2Vjb25kcyBiZWZvcmUgdGltZW91dAogICAgICAgIGlmIChnZXRNYXhFeGVjdXRpb25UaW1lKCkgPD0gNSkKICAgICAgICAgICAgJHRoaXMtPnNlY29uZHNCZWZvcmVUaW1lb3V0ID0gMTsKICAgICAgICBlbHNlIGlmIChnZXRNYXhFeGVjdXRpb25UaW1lKCkgPD0gMTApCiAgICAgICAgICAgICR0aGlzLT5zZWNvbmRzQmVmb3JlVGltZW91dCA9IDI7CiAgICAgICAgZWxzZSBpZiAoZ2V0TWF4RXhlY3V0aW9uVGltZSgpIDw9IDIwKQogICAgICAgICAgICAkdGhpcy0+c2Vjb25kc0JlZm9yZVRpbWVvdXQgPSA0OwogICAgICAgIGVsc2UgaWYgKGdldE1heEV4ZWN1dGlvblRpbWUoKSA8PSAzMCkKICAgICAgICAgICAgJHRoaXMtPnNlY29uZHNCZWZvcmVUaW1lb3V0ID0gODsKICAgICAgICBlbHNlIGlmIChnZXRNYXhFeGVjdXRpb25UaW1lKCkgPD0gNjApCiAgICAgICAgICAgICR0aGlzLT5zZWNvbmRzQmVmb3JlVGltZW91dCA9IDE2OwogICAgICAgIGVsc2UgaWYgKGdldE1heEV4ZWN1dGlvblRpbWUoKSA8PSAxMjApCiAgICAgICAgICAgICR0aGlzLT5zZWNvbmRzQmVmb3JlVGltZW91dCA9IDMyOwogICAgICAgIGVsc2UgaWYgKGdldE1heEV4ZWN1dGlvblRpbWUoKSA8PSAyNDApCiAgICAgICAgICAgICR0aGlzLT5zZWNvbmRzQmVmb3JlVGltZW91dCA9IDY0OwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHRoaXMtPnNlY29uZHNCZWZvcmVUaW1lb3V0ID0gMTI4OwoJfQogICAgCiAgICBmdW5jdGlvbiBfX3dha2V1cCgpCiAgICB7CiAgICAgICAgZ2xvYmFsICRfX3NjcmlwdFN0YXJ0VGltZTsKICAgICAgICAKICAgICAgICAkdGhpcy0+c3RhcnRUaW1lID0gJF9fc2NyaXB0U3RhcnRUaW1lOwogICAgICAgICR0aGlzLT5kZWJ1Z1Byb2dyZXNzVGV4dCA9ICIiOwogICAgfQoJCglmdW5jdGlvbiBfX2Rlc3RydWN0KCkKCXsKCX0KCQoJZnVuY3Rpb24gY3JlYXRlKCRwYXJhbXM9YXJyYXkoKSwgJGlkPSIiKQoJewogICAgICAgICRwYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgIAogICAgICAgICR0aGlzLT5wYXJhbXMgPSAkcGFyYW1zOwoJCQogICAgICAgICR0aGlzLT5pZCA9ICgkaWQgPyAkaWQgOiBVVUlEKCkpOwoKCQkkdXBkYXRlUmVjb3JkVmFsdWVzID0gYXJyYXkoKTsKCQkkdXBkYXRlUmVjb3JkVmFsdWVzWyJpZCJdID0gJHRoaXMtPmlkOwogICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbIm5hbWUiXSA9ICR0aGlzLT5uYW1lOwoJCSR1cGRhdGVSZWNvcmRWYWx1ZXNbIm1hbmFnZXIiXSA9ICR0aGlzLT5NYW5hZ2VyLT5uYW1lOwoJCSR1cGRhdGVSZWNvcmRWYWx1ZXNbImRhdGFTb3VyY2UiXSA9ICRwYXJhbXNbImRhdGFTb3VyY2UiXTsKCQkkdXBkYXRlUmVjb3JkVmFsdWVzWyJ0aW1lU3RhcnQiXSA9IG5vdygpOwogICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbIm1heEV4ZWN1dGlvblRpbWUiXSA9ICRwYXJhbXNbIm1heEV4ZWN1dGlvblRpbWUiXTsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJtZW1vcnlMaW1pdCJdID0gJHBhcmFtc1sibWVtb3J5TGltaXQiXTsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJzZWNvbmRzQmVmb3JlVGltZW91dCJdID0gJHBhcmFtc1sic2Vjb25kc0JlZm9yZVRpbWVvdXQiXTsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJtZW1vcnlCZWZvcmVUaW1lb3V0Il0gPSAkcGFyYW1zWyJtZW1vcnlCZWZvcmVUaW1lb3V0Il07CiAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlc1sicHJvZ3Jlc3MiXSA9IDA7CgkJCiAgICAgICAgZm9yZWFjaCgkdXBkYXRlUmVjb3JkVmFsdWVzIGFzICRrZXkgPT4gJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gTlVMTCkKICAgICAgICAgICAgICAgIHVuc2V0KCR1cGRhdGVSZWNvcmRWYWx1ZXNbJGtleV0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlVHlwZSA9PSAic3REYXRhYmFzZSIpCiAgICAgICAgewoJCSAgICAkVGFibGUgPSBnZXRUYWJsZSgicHJvY2Vzc2VzIik7CgkJICAgIAogICAgICAgICAgICAvLyBkdWUgdG8gU1FMaXRlIGNhbm5vdCB1c2UgUmF3CiAgICAgICAgICAgICRpbnNlcnRlZFJlY29yZFZhbHVlcyA9ICRUYWJsZS0+aW5zZXJ0UmVjb3JkKCR1cGRhdGVSZWNvcmRWYWx1ZXMpOwogICAgICAgICAgICAvLyRpbnNlcnRlZFJlY29yZFZhbHVlcyA9ICRUYWJsZS0+aW5zZXJ0UmF3UmVjb3JkKCR1cGRhdGVSZWNvcmRWYWx1ZXMpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRpbnNlcnRlZFJlY29yZFZhbHVlcyk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk1hbmFnZXItPnN0b3JhZ2VUeXBlID09ICJzdFNlc3Npb24iKQogICAgICAgIHsKICAgICAgICAgICAgLy8gVE9ETyAtIGlkIHNob3VsZCBiZSBuZXcgc2Vzc2lvbiBpZCEgc28gd2UgZG8gbm90IG5lZWQgdG8gY2xlYXIKICAgICAgICAgICAgCiAgICAgICAgICAgIF9zZXNzaW9uX3N0YXJ0KCk7CiAgICAgICAgICAgIC8vIGNsZWFuIHdob2xlIHNlc3Npb24KICAgICAgICAgICAgJF9TRVNTSU9OID0gYXJyYXkoKTsKICAgICAgICAgICAgJF9TRVNTSU9OWyJQcm9jZXNzTWFuYWdlciJdWyR0aGlzLT5pZF1bInJlY29yZCJdID0gJHVwZGF0ZVJlY29yZFZhbHVlczsKICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk1hbmFnZXItPnN0b3JhZ2VUeXBlID09ICJzdEZpbGUiKQogICAgICAgIHsKICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kdGhpcy0+aWQuIi5yZWNvcmQuY2FjaGUiLCBzZXJpYWxpemUoYXJyYXlfbWVyZ2UoJHRoaXMtPk1hbmFnZXItPmdldFJlY29yZCgkdGhpcy0+aWQpLCAkdXBkYXRlUmVjb3JkVmFsdWVzKSkpOwogICAgICAgIH0KCgkJJHRoaXMtPm1heEV4ZWN1dGlvblRpbWUgPSBfc3RydG90aW1lKCRwYXJhbXNbIm1heEV4ZWN1dGlvblRpbWUiXSk7CiAgICAgICAgJHRoaXMtPm1lbW9yeUxpbWl0ID0gdG9CeXRlcygkcGFyYW1zWyJtZW1vcnlMaW1pdCJdKTsKICAgICAgICAKICAgICAgICAkdGhpcy0+c2V0U3RhdHVzKCJwc0lkbGUiKTsKCQkKICAgICAgICBnbG9iYWwgJHByb2Nlc3NMb2dGaWxlTmFtZTsKICAgICAgICBpZiAoISR0aGlzLT5jdXN0b21Qcm9jZXNzTG9nICYmICRwcm9jZXNzTG9nRmlsZU5hbWUvKkBmaWxlX2V4aXN0cygkcHJvY2Vzc0xvZ0ZpbGVOYW1lKSovKQogICAgICAgIHsKICAgICAgICAgICAgJHBsZiA9IEBmb3BlbigkcHJvY2Vzc0xvZ0ZpbGVOYW1lLCAiYSsiKTsKICAgICAgICAgICAgaWYgKCRwbGYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGxmLCAiKFBTKSAtIi5kYXRlKCJZLW0tZCBIOmk6cyIpLiIgICAiLnN1YnN0cihzdHJfcmVwbGFjZSgiLyIsICIiLCBTRVJWRVJET01BSU4pLiIgICAgICAgICAgICAgICAgICAgICAgICIsIDAsIDMwKS5nZXRfY2xhc3MoJHRoaXMpLiJcbiIpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRwbGYpOwogICAgICAgICAgICB9ICAgICAgIAogICAgICAgIH0KCgkJcmV0dXJuKCR0aGlzLT5pZCk7Cgl9CgoJZnVuY3Rpb24gZmluaXNoKCkKCXsKICAgICAgICBmbG9jaygkdGhpcy0+ZmwsTE9DS19VTik7CiAgICAgICAgZmNsb3NlKCR0aGlzLT5mbCk7CiAgICAgICAgX3VubGluayhQUk9KRUNUUEFUSC4iY2FjaGUvbG9jay9wcm9jZXNzLSIuJHRoaXMtPmlkLiIubG9jayIpOwoKICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1sib25GaW5pc2giXSkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkcGFyYW1zOwogICAgICAgICAgICAkcGFyYW1zID0gJHRoaXMtPnBhcmFtczsKICAgICAgICAgICAgCiAgICAgICAgICAgIF9ldmFsKCR0aGlzLT5wYXJhbXNbIm9uRmluaXNoIl0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCJQcm9jZXNzOjpmaW5pc2goKSIpOwogICAgICAgIAogICAgICAgICR0aGlzLT5wcm9ncmVzcyA9IDEwMDsKICAgICAgICAkdGhpcy0+dGltZUVuZCA9IG5vdygpOwogICAgICAgICR0aGlzLT5zYXZlUHJvZ3Jlc3ModHJ1ZSk7CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzID0gYXJyYXkoKTsKCQkkdXBkYXRlUmVjb3JkVmFsdWVzWyJpZCJdID0gJHRoaXMtPmlkOwoJCSR1cGRhdGVSZWNvcmRWYWx1ZXNbInRpbWVFbmQiXSA9IG5vdygpOwoJCSR1cGRhdGVSZWNvcmRWYWx1ZXNbInByb2dyZXNzIl0gPSAxMDA7CiAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlc1sicHJvZ3Jlc3NUZXh0Il0gPSAkdGhpcy0+X3Byb2dyZXNzVGV4dDsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJyZXN1bWVVcmwiXSA9ICIiOwoJCQogICAgICAgIGlmICgkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVR5cGUgPT0gInN0RGF0YWJhc2UiKQogICAgICAgIHsKICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoInByb2Nlc3NlcyIpOwogICAgICAgICAgICAkVGFibGUtPnVwZGF0ZVJhd1JlY29yZCgkdXBkYXRlUmVjb3JkVmFsdWVzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk1hbmFnZXItPnN0b3JhZ2VUeXBlID09ICJzdFNlc3Npb24iKQogICAgICAgIHsKICAgICAgICAgICAgX3Nlc3Npb25fc3RhcnQoKTsKICAgICAgICAgICAgJF9TRVNTSU9OWyJQcm9jZXNzTWFuYWdlciJdWyR0aGlzLT5pZF1bInJlY29yZCJdID0gYXJyYXlfbWVyZ2UoJF9TRVNTSU9OWyJQcm9jZXNzTWFuYWdlciJdWyR0aGlzLT5pZF1bInJlY29yZCJdLCAkdXBkYXRlUmVjb3JkVmFsdWVzKTsKICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk1hbmFnZXItPnN0b3JhZ2VUeXBlID09ICJzdEZpbGUiKQogICAgICAgIHsKICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kdGhpcy0+aWQuIi5yZWNvcmQuY2FjaGUiLCBzZXJpYWxpemUoYXJyYXlfbWVyZ2UoJHRoaXMtPk1hbmFnZXItPmdldFJlY29yZCgkdGhpcy0+aWQpLCAkdXBkYXRlUmVjb3JkVmFsdWVzKSkpOwogICAgICAgIH0KICAgICAgICAqLwoJCQogICAgICAgICR0aGlzLT5zYXZlRm9yUmVzdW1lKCk7CgkJJHRoaXMtPnNldFN0YXR1cygicHNGaW5pc2hlZCIpOwoKICAgICAgICAvL2VjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+cGFyYW1zKTsKICAgICAgICAvLyBhbHdheXMgLSBvbiBzb21lIHNlcnZlcnMgcnVubmluZyBpbiBiYWNrZ3JvdW5kIGRvZXMgbm90IHdvcmsKICAgICAgICBnbG9iYWwgJHByb2Nlc3NMb2dGaWxlTmFtZTsKICAgICAgICBpZiAoISR0aGlzLT5jdXN0b21Qcm9jZXNzTG9nICYmICRwcm9jZXNzTG9nRmlsZU5hbWUgLypAZmlsZV9leGlzdHMoJHByb2Nlc3NMb2dGaWxlTmFtZSkqLykKICAgICAgICB7CiAgICAgICAgICAgICRwbGYgPSBAZm9wZW4oJHByb2Nlc3NMb2dGaWxlTmFtZSwgImErIik7CiAgICAgICAgICAgIGlmICgkcGxmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmd3JpdGUoJHBsZiwgIihQRSkgLSIuZGF0ZSgiWS1tLWQgSDppOnMiKS4iICAgIi5zdWJzdHIoc3RyX3JlcGxhY2UoIi8iLCAiIiwgU0VSVkVSRE9NQUlOKS4iICAgICAgICAgICAgICAgICAgICAgICAiLCAwLCAzMCkuZ2V0X2NsYXNzKCR0aGlzKS4iXG4iKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkcGxmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPk1hbmFnZXItPmNsZWFyUHJvY2VzcygkdGhpcy0+aWQpOwoKICAgICAgICBlY2hvICJGSU5JU0hFRCI7CiAgICAgICAgLy9pZiAoJHRoaXMtPnBhcmFtc1siZGVidWdQcm9jZXNzIl0gPT0gInRydWUiIHx8IHN0cnBvcygkX0NPT0tJRVsiUHJvY2Vzc2VzUEhQRGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSB8fCAhJHRoaXMtPnBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0pCiAgICAgICAgLy8gICAgZWNobyAiRklOSVNIRUQiOwoKCQlleGl0OwogICAgICAgIHJldHVybigkaW5zZXJ0ZWRSZWNvcmRWYWx1ZXNbImlkIl0pOwoJfQoKCWZ1bmN0aW9uIHNldFN0YXR1cygkc3RhdHVzKQoJewoJCSR0aGlzLT5zdGF0dXMgPSAkc3RhdHVzOwogICAgICAgIAogICAgICAgICR0aGlzLT5zYXZlUHJvZ3Jlc3MoKTsKCX0KCQoJZnVuY3Rpb24gc2h1dGRvd24oKQoJewoJCSRvdXRwdXRCdWZmZXIgPSBvYl9nZXRfY29udGVudHMoKTsKCgkJLy8gaW4gb3V0cHV0IGJ1ZmZlciBtYXkgYmUgRmF0YWwgRXJyb3IgKHRoaXMgaXMgb25seSB3YXkgdG8gY2F0Y2ggdGhpcyBlcnJvcikKCQlpZiAocHJlZ19tYXRjaF9hbGwoInw8Yj5GYXRhbCBlcnJvcjwvYj46KC4qPyk8YnIgLz58IiwgJG91dHB1dEJ1ZmZlciwgJGVsZW1lbnRzLCBQUkVHX1NFVF9PUkRFUikpCgkJewoJCQlmb3JlYWNoKCRlbGVtZW50cyBhcyAkZWxlbWVudCkKCQkJewoJCQkJJHRoaXMtPmVycm9yKCRlbGVtZW50WzBdKTsKCQkJfQoJCQkkdGhpcy0+cGF1c2UoKTsJCQkJCgkJfQoJCWlmIChwcmVnX21hdGNoX2FsbCgifDxiPldhcm5pbmc8L2I+OiguKj8pPGJyIC8+fCIsICRvdXRwdXRCdWZmZXIsICRlbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQoJCXsKCQkJZm9yZWFjaCgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJCXsKCQkJCSR0aGlzLT5lcnJvcigkZWxlbWVudFswXSk7CgkJCX0KCQl9CgkJaWYgKHByZWdfbWF0Y2hfYWxsKCJ8PGI+UGFyc2UgZXJyb3I8L2I+OiguKj8pPGJyIC8+fCIsICRvdXRwdXRCdWZmZXIsICRlbGVtZW50cywgUFJFR19TRVRfT1JERVIpKQoJCXsKCQkJZm9yZWFjaCgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJCXsKCQkJCSR0aGlzLT5lcnJvcigkZWxlbWVudFswXSk7CgkJCX0KCQl9Cgl9CiAgICAKICAgIGZ1bmN0aW9uIGdldEV4ZWN1dGlvblRpbWVQZXJjZW50KCRzZWNvbmRzQmVmb3JlVGltZW91dD1OVUxMKQogICAgewogICAgICAgIGlmICgkc2Vjb25kc0JlZm9yZVRpbWVvdXQgPT09IE5VTEwpCiAgICAgICAgICAgICRzZWNvbmRzQmVmb3JlVGltZW91dCA9ICR0aGlzLT5zZWNvbmRzQmVmb3JlVGltZW91dDsKICAgICAgICAKICAgICAgICBnbG9iYWwgJF9fc2NyaXB0U3RhcnRUaW1lOyAvLyBkZWZpbmVkIGluIGFqYXgubGliLnBocAogICAgICAgIGlmICghJF9fc2NyaXB0U3RhcnRUaW1lKQogICAgICAgICAgICAkX19zY3JpcHRTdGFydFRpbWUgPSBnZXRNaWNyb1RpbWUoKTsKCiAgICAgICAgaWYgKCRfU0VSVkVSWyJSRVFVRVNUX1RJTUUiXSkKICAgICAgICAgICAgJF9fc2NyaXB0U3RhcnRUaW1lID0gJF9TRVJWRVJbIlJFUVVFU1RfVElNRSJdOwoKICAgICAgICBpZiAoJHNlY29uZHNCZWZvcmVUaW1lb3V0ID4gZ2V0TWF4RXhlY3V0aW9uVGltZSgpKQogICAgICAgICAgICAkc2Vjb25kc0JlZm9yZVRpbWVvdXQgPSBnZXRNYXhFeGVjdXRpb25UaW1lKCktY2VpbChnZXRNYXhFeGVjdXRpb25UaW1lKCkvNSk7CgogICAgICAgICRwZXJjZW50ID0gKGdldE1pY3JvVGltZSgpLSRfX3NjcmlwdFN0YXJ0VGltZSkqMTAwLyhnZXRUaW1lTGltaXQoKS0kc2Vjb25kc0JlZm9yZVRpbWVvdXQpOwogICAgICAgIAogICAgICAgIHJldHVybigkcGVyY2VudCk7CiAgICB9CQogICAgCglmdW5jdGlvbiByZXN1bWVOZWVkZWQoJHNlY29uZHNCZWZvcmVUaW1lb3V0PU5VTEwsICRtZW1vcnlCZWZvcmVUaW1lb3V0PU5VTEwpCiAgICB7CiAgICAgICAgLy9lY2hvIHRpbWUoKTsgZXhpdDsKICAgICAgICBpZiAoJHNlY29uZHNCZWZvcmVUaW1lb3V0ID09PSBOVUxMKQogICAgICAgICAgICAkc2Vjb25kc0JlZm9yZVRpbWVvdXQgPSAkdGhpcy0+c2Vjb25kc0JlZm9yZVRpbWVvdXQ7CiAgICAgICAgaWYgKCRtZW1vcnlCZWZvcmVUaW1lb3V0ID09PSBOVUxMKQogICAgICAgICAgICAkbWVtb3J5QmVmb3JlVGltZW91dCA9ICR0aGlzLT5tZW1vcnlCZWZvcmVUaW1lb3V0OwogICAgICAgIAogICAgICAgIGdsb2JhbCAkX19zY3JpcHRTdGFydFRpbWU7IC8vIGRlZmluZWQgaW4gYWpheC5saWIucGhwCiAgICAgICAgaWYgKCEkX19zY3JpcHRTdGFydFRpbWUpCiAgICAgICAgICAgICRfX3NjcmlwdFN0YXJ0VGltZSA9IGdldE1pY3JvVGltZSgpOwogICAgICAgIGlmICgkX1NFUlZFUlsiUkVRVUVTVF9USU1FIl0pCiAgICAgICAgICAgICRfX3NjcmlwdFN0YXJ0VGltZSA9ICRfU0VSVkVSWyJSRVFVRVNUX1RJTUUiXTsKCiAgICAgICAgJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0ID0gZ2V0QXBhY2hlQ29ubmVjdGlvblRpbWVvdXQoKTsKICAgICAgICAvL3Zhcl9kdW1wKGdldEFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0KCkpOyBleGl0OwoKICAgICAgICBpZiAoJHNlY29uZHNCZWZvcmVUaW1lb3V0ID4gJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0KQogICAgICAgICAgICAkc2Vjb25kc0JlZm9yZVRpbWVvdXQgPSAkYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQtY2VpbCgkYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQvNSk7CiAgICAgICAgaWYgKCRzZWNvbmRzQmVmb3JlVGltZW91dCA+IGdldE1heEV4ZWN1dGlvblRpbWUoKSkKICAgICAgICAgICAgJHNlY29uZHNCZWZvcmVUaW1lb3V0ID0gZ2V0TWF4RXhlY3V0aW9uVGltZSgpLWNlaWwoZ2V0TWF4RXhlY3V0aW9uVGltZSgpLzUpOwoKICAgICAgICBpZiAoJG1lbW9yeUJlZm9yZVRpbWVvdXQgPiBnZXRNZW1vcnlMaW1pdCgpKQogICAgICAgICAgICAkbWVtb3J5QmVmb3JlVGltZW91dCA9IGdldE1lbW9yeUxpbWl0KCktY2VpbChnZXRNZW1vcnlMaW1pdCgpLzUpOwoKICAgICAgICAvL3Byb2Nlc3NNZXNzYWdlKCJhcGFjaGVDb25uZWN0aW9uVGltZW91dDogIi4kYXBhY2hlQ29ubmVjdGlvblRpbWVvdXQuIjxiciAvPiIpOwogICAgICAgIC8vcHJvY2Vzc01lc3NhZ2UoInRpbWVMaW1pdDogIi5nZXRUaW1lTGltaXQoKS4iPGJyIC8+Iik7CiAgICAgICAgCiAgICAgICAgLy8gVElNRQogICAgICAgIGdsb2JhbCAkX19sYXN0UmVzdW1lTmVlZGVkQ2FsbFRpbWU7CiAgICAgICAgZ2xvYmFsICRfX2F2ZXJhZ2VTY3JpcHRMb29wVGltZTsKICAgICAgICBnbG9iYWwgJF9fbWF4U2NyaXB0TG9vcFRpbWU7CiAgICAgICAgaWYgKEZBTFNFICYmICRfX2xhc3RSZXN1bWVOZWVkZWRDYWxsVGltZSkKICAgICAgICB7CiAgICAgICAgICAgICR0aW1lID0gZ2V0TWljcm9UaW1lKCktJF9fbGFzdFJlc3VtZU5lZWRlZENhbGxUaW1lOwogICAgICAgICAgICAvL3Byb2Nlc3NNZXNzYWdlKCI8Yj5jYWxsVGltZTogIi4kdGltZS4iPC9iPjxiciAvPiIpOwogICAgICAgICAgICAkX19sYXN0UmVzdW1lTmVlZGVkQ2FsbFRpbWUgPSBnZXRNaWNyb1RpbWUoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRfX21heFNjcmlwdExvb3BUaW1lID0gbWF4KCRfX21heFNjcmlwdExvb3BUaW1lLCAkdGltZSk7CiAgICAgICAgICAgICRfX2F2ZXJhZ2VTY3JpcHRMb29wVGltZSA9ICgkX19hdmVyYWdlU2NyaXB0TG9vcFRpbWUgKyAkdGltZSkvMjsKICAgICAgICAgICAgLy9wcm9jZXNzTWVzc2FnZSgiPGI+YXZlcmFnZSBjYWxsVGltZTogIi4kX19hdmVyYWdlU2NyaXB0TG9vcFRpbWUuIjwvYj48YnIgLz4iKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAkX19sYXN0UmVzdW1lTmVlZGVkQ2FsbFRpbWUgPSBnZXRNaWNyb1RpbWUoKTsKICAgICAgICAKICAgICAgICAvLyBNRU1PUlkKICAgICAgICBnbG9iYWwgJF9fbGFzdFJlc3VtZU5lZWRlZE1lbW9yeVVzYWdlOwogICAgICAgIGdsb2JhbCAkX19hdmVyYWdlU2NyaXB0TG9vcE1lbW9yeTsKICAgICAgICBnbG9iYWwgJF9fbWF4U2NyaXB0TG9vcE1lbW9yeTsKICAgICAgICBpZiAoJF9fbGFzdFJlc3VtZU5lZWRlZE1lbW9yeVVzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgJG1lbW9yeSA9IGdldE1lbW9yeVVzYWdlKHRydWUpLSRfX2xhc3RSZXN1bWVOZWVkZWRNZW1vcnlVc2FnZTsKICAgICAgICAgICAgLy9wcm9jZXNzTWVzc2FnZSgiPGI+bWVtb3J5VXNhZ2U6ICIuJG1lbW9yeS4iPC9iPjxiciAvPiIpOwogICAgICAgICAgICAkX19sYXN0UmVzdW1lTmVlZGVkTWVtb3J5VXNhZ2UgPSBnZXRNZW1vcnlVc2FnZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRfX21heFNjcmlwdExvb3BNZW1vcnkgPSBtYXgoJF9fbWF4U2NyaXB0TG9vcE1lbW9yeSwgJG1lbW9yeSk7CiAgICAgICAgICAgICRfX2F2ZXJhZ2VTY3JpcHRMb29wTWVtb3J5ID0gKCRfX2F2ZXJhZ2VTY3JpcHRMb29wTWVtb3J5ICsgJG1lbW9yeSkvMjsKICAgICAgICAgICAgLy9wcm9jZXNzTWVzc2FnZSgiPGI+YXZlcmFnZSBtZW1vcnlVc2FnZTogIi4kX19hdmVyYWdlU2NyaXB0TG9vcE1lbW9yeS4iPC9iPjxiciAvPiIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgICRfX2xhc3RSZXN1bWVOZWVkZWRNZW1vcnlVc2FnZSA9IGdldE1lbW9yeVVzYWdlKHRydWUpOwoKCiAgICAgICAgLy92YXJfZHVtcCgkX19hdmVyYWdlU2NyaXB0TG9vcE1lbW9yeSk7CiAgICAgICAgJHNlY29uZHNCZWZvcmVUaW1lb3V0ID0gbWF4KCRzZWNvbmRzQmVmb3JlVGltZW91dCwgJF9fYXZlcmFnZVNjcmlwdExvb3BUaW1lKTsKICAgICAgICAKICAgICAgICAKICAgICAgICAvLyRtZW1vcnlCZWZvcmVUaW1lb3V0ID0gbWF4KDEwKjEwMjQsICRfX2F2ZXJhZ2VTY3JpcHRMb29wTWVtb3J5KTsgLy8gMTBrQgogICAgICAgIC8vdmFyX2R1bXAoZ2V0TWVtb3J5TGltaXQoKS8xMCk7CiAgICAgICAgJG1lbW9yeUJlZm9yZVRpbWVvdXQgPSBtYXgoJG1lbW9yeUJlZm9yZVRpbWVvdXQsIGdldE1lbW9yeUxpbWl0KCkvMTArJF9SRVFVRVNUWyJzYXZlTWVtb3J5Il0qNCwgJF9fYXZlcmFnZVNjcmlwdExvb3BNZW1vcnkpOyAvLyAxNk1CPQogICAgICAgIC8vdmFyX2R1bXAocm91bmQoJG1lbW9yeUJlZm9yZVRpbWVvdXQvMTAyNC8xMDI0LCAyKSk7CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkX19zY3JpcHRTdGFydFRpbWUpOwogICAgICAgIC8vZXhpdDsKICAgICAgICAvL3Byb2Nlc3NNZXNzYWdlKCJyZXN1bWVOZWVkZWQ6ICIuZ2V0TWljcm9UaW1lKCkuIi0iLiRfX3NjcmlwdFN0YXJ0VGltZS4iID4gIi5nZXRUaW1lTGltaXQoKS4iLSIuJHNlY29uZHNCZWZvcmVUaW1lb3V0LiIgICAoIi4oZ2V0TWljcm9UaW1lKCktJF9fc2NyaXB0U3RhcnRUaW1lKS4iID4gIi4oZ2V0VGltZUxpbWl0KCktJHNlY29uZHNCZWZvcmVUaW1lb3V0KS4iKSAtIG1heF9leGVjdXRpb25fdGltZSA9ICIuZ2V0VGltZUxpbWl0KCkuIiAgTUVNT1JZOiAiLmdldE1lbW9yeVVzYWdlKHRydWUpLiI8YnIgLz4iKTsKICAgICAgICAvL2VjaG8gIj09PSI7CiAgICAgICAgLy92YXJfZHVtcCgkc2Vjb25kc0JlZm9yZVRpbWVvdXQpOwogICAgICAgIC8vdmFyX2R1bXAoJF9fYXZlcmFnZVNjcmlwdExvb3BUaW1lKTsKICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5zZWNvbmRzQmVmb3JlVGltZW91dCk7CiAgICAgICAgaWYgKGdldE1pY3JvVGltZSgpLSRfX3NjcmlwdFN0YXJ0VGltZSA+IGdldFRpbWVMaW1pdCgpLSRzZWNvbmRzQmVmb3JlVGltZW91dCB8fCAodGltZSgpLSR0aGlzLT5zdGFydFRpbWUpID4gJGFwYWNoZUNvbm5lY3Rpb25UaW1lb3V0LTEwIHx8IGdldE1lbW9yeVVzYWdlKHRydWUpID4gZ2V0TWVtb3J5TGltaXQoKS0kbWVtb3J5QmVmb3JlVGltZW91dCkKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcnVuKCkKCXsKICAgICAgICAvLyB3ZSBuZWVkIGEgbG9jayB0byBub3QgdG8gYmUgZXhlY3V0ZWQgYnkgbW9yZSByZXF1ZXN0cyBpbiB0aGUgc2FtZSB0aW1lCiAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoUFJPSkVDVFBBVEguImNhY2hlL2xvY2siKSkKICAgICAgICAgICAgX21rZGlyKFBST0pFQ1RQQVRILiJjYWNoZS9sb2NrIiwgMDc3Nyk7CiAgICAgICAgJHRoaXMtPmZsID0gZm9wZW4oUFJPSkVDVFBBVEguImNhY2hlL2xvY2svcHJvY2Vzcy0iLiR0aGlzLT5pZC4iLmxvY2siLCJ3KyIpOwogICAgICAgIGlmICgkdGhpcy0+ZmwgJiYgIWZsb2NrKCR0aGlzLT5mbCxMT0NLX0VYfExPQ0tfTkIpKQogICAgICAgIHsKICAgICAgICAgICAgLy9wcm9jZXNzRXJyb3IoIkxvY2tlZCAtIHRyeWluZyB0byBydW4gdGhlIHNhbWUgcHJvY2VzcyBtb3JlIHRoYW4gb25jZSIpOwogICAgICAgICAgICBmY2xvc2UoJHRoaXMtPmZsKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIC8vJHRoaXMtPnNsZWVwKDUpOwogICAgICAgIAogICAgICAgIC8vZWNobyAiUlVOIjsKICAgICAgICAvLyBzZXQgbG93ZXN0IHByaW9yaXR5CiAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+cHJpb3JpdHkpKQogICAgICAgICAgICBwcm9jX3ByaW9yaXR5KC0xKTsKCiAgCQkvLyRUYWJsZSA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKTsKCQkvLyRUYWJsZS0+aGlzdG9yeVR5cGUgPSAiaHROb25lIjsKCQkKCQkvL2lmICgkdGhpcy0+cGFyYW1zWyJtZXNzYWdlcyJdID09ICJ0cnVlIikKCQlzZXRQcm9jZXNzTWVzc2FnZUVuYWJsZWQodHJ1ZSk7CgkJLy9lbHNlCgkJLy8Jc2V0UHJvY2Vzc01lc3NhZ2VFbmFibGVkKGZhbHNlKTsKCgkJc2V0UHJvY2Vzc01lc3NhZ2VPdXRwdXQoJHRoaXMtPnBhcmFtc1sibWVzc2FnZXNPdXRwdXQiXSk7CgkJc2V0UHJvY2Vzc0RlYnVnTGV2ZWwoJHRoaXMtPnBhcmFtc1siZGVidWdMZXZlbCJdKTsKCQkKCQlpZ25vcmVfdXNlcl9hYm9ydChUUlVFKTsKCQkvL3NldFRpbWVvdXQoNjAqNjAqNDgpOyAvLyAyNGgKCQkvL3NldE1lbW9yeUxpbWl0KDEwMjQpOyAvLyAxR0IKCQkKICAgICAgICAvL3NldFRpbWVvdXQoMTApOwogICAgICAgIC8vc2V0X3RpbWVfbGltaXQoNSk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0aGlzLT5tYXhFeGVjdXRpb25UaW1lKQogICAgICAgICAgICBzZXRUaW1lb3V0KCR0aGlzLT5tYXhFeGVjdXRpb25UaW1lKTsKICAgICAgICBpZiAoJHRoaXMtPm1lbW9yeUxpbWl0KQogICAgICAgICAgICBzZXRNZW1vcnlMaW1pdCgkdGhpcy0+bWVtb3J5TGltaXQpOwogICAgICAgIAogICAgICAgICR0aGlzLT5tYXhUaW1lID0gZ2V0VGltZUxpbWl0KCk7CiAgICAgICAgJHRoaXMtPm1heE1lbW9yeSA9IGdldE1lbW9yeUxpbWl0KCk7CiAgICAgICAgJHRoaXMtPnRpbWVSZXN1bWUgPSBnZXRNaWNyb1RpbWUoKTsKCgkJaWYgKGdldFByb2Nlc3NNZXNzYWdlT3V0cHV0KCkgIT0gInBtb1NjcmVlbiIpCgkJewoJCQkvL3JlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGFycmF5KCYkdGhpcywgInNodXRkb3duIikpOwogICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgkdGhpcywgInNodXRkb3duIikpOwoJCX0gCgoJCSR0aGlzLT5zZXRTdGF0dXMoInBzUnVubmluZyIpOwogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgaWYgKCRfUkVRVUVTVFsicHJvY2Vzc1Jlc3VtZSJdID09ICJ0cnVlIikKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5yZXN1bWUoKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAgICAgCiAgICAgICAgJHRoaXMtPnJlc3VtZSgpOwogICAgICAgIC8vZWNobyAiRE9ORSI7Cgl9CgkKCWZ1bmN0aW9uIHBhdXNlKCkKCXsKCQkkdGhpcy0+c2V0U3RhdHVzKCJwc1BhdXNlZCIpOwoJfQoJCiAgICBmdW5jdGlvbiBvblNodXRkb3duKCkKICAgIHsKICAgICAgICBlY2hvICJvblNodXRkb3duIjsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcmVzdW1lKCkKICAgIHsKICAgICAgICBnbG9iYWwgJHByb2Nlc3NMb2dGaWxlTmFtZTsKICAgICAgICAvL3Zhcl9kdW1wKCRwcm9jZXNzTG9nRmlsZU5hbWUpO2V4aXQ7CiAgICAgICAgaWYgKCEkdGhpcy0+Y3VzdG9tUHJvY2Vzc0xvZyAmJiAkcHJvY2Vzc0xvZ0ZpbGVOYW1lIC8qQGZpbGVfZXhpc3RzKCRwcm9jZXNzTG9nRmlsZU5hbWUpKi8pCiAgICAgICAgewogICAgICAgICAgICAkcGxmID0gQGZvcGVuKCRwcm9jZXNzTG9nRmlsZU5hbWUsICJhKyIpOwogICAgICAgICAgICBpZiAoJHBsZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZndyaXRlKCRwbGYsICIoUEMpIC0iLmRhdGUoIlktbS1kIEg6aTpzIikuIiAgICIuc3Vic3RyKHN0cl9yZXBsYWNlKCIvIiwgIiIsIFNFUlZFUkRPTUFJTikuIiAgICAgICAgICAgICAgICAgICAgICAgIiwgMCwgMzApLmdldF9jbGFzcygkdGhpcykuIlxuIik7CiAgICAgICAgICAgICAgICBmY2xvc2UoJHBsZik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRTdGF0dXMoInBzUnVubmluZyIpOwogICAgICAgIAogICAgICAgICR0aGlzLT5zaWduYWwoKTsgICAgICAgIAogICAgICAgIC8vcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oYXJyYXkoJHRoaXMsICJvblNodXRkb3duIikpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNhdmVGb3JSZXN1bWUoKQogICAgewogICAgICAgICR0aGlzLT5kZWJ1Z1Byb2dyZXNzVGV4dCA9ICJzYXZlRm9yUmVzdW1lIjsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT5fcHJvZ3Jlc3NUZXh0KTsKCiAgICAgICAgJHRoaXMtPk1hbmFnZXItPnNhdmVQcm9jZXNzKCR0aGlzKTsKCiAgICAgICAgLy8kdXJsID0gJF9TRVJWRVJbIlNFUlZFUl9QUk9UT0NPTCJdLiI6Ly8iLiRfU0VSVkVSWyJTRVJWRVJfTkFNRSJdLigkX1NFUlZFUlsiU0VSVkVSX1BPUlQiXSAhPSAiODAiICYmICRfU0VSVkVSWyJTRVJWRVJfUE9SVCJdICE9ICI0NDMiID8gIjoiLiRfU0VSVkVSWyJTRVJWRVJfUE9SVCJdIDogIiIpLiRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdOwogICAgICAgIC8vJHVybCA9IGNsZWFuTGluayhQUk9KRUNUVVJMLiRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdKTsKICAgICAgICAvLyR1cmwgPSAkX1NFUlZFUlsiU0VSVkVSX1BST1RPQ09MIl0uIjovLyIuJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0uKCRfU0VSVkVSWyJTRVJWRVJfUE9SVCJdICE9ICI4MCIgJiYgJF9TRVJWRVJbIlNFUlZFUl9QT1JUIl0gIT0gIjQ0MyIgPyAiOiIuJF9TRVJWRVJbIlNFUlZFUl9QT1JUIl0gOiAiIikuJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl07CiAgICAgICAgJHVybCA9IFVSTDsKICAgICAgICAKICAgICAgICAvLyR1cmwgPSAiaHR0cDovLyIuJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0uJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl07CiAgICAgICAgaWYgKHN0cnBvcygkdXJsLCAiP3Byb2Nlc3NSZXN1bWU9dHJ1ZSIpID09PSBGQUxTRSkKICAgICAgICAgICAgJHVybCA9IHN0cl9yZXBsYWNlKCIucGhwPyIsICIucGhwP3Byb2Nlc3NSZXN1bWU9dHJ1ZSYiLCAkdXJsKTsKICAgICAgICAKICAgICAgICBpZiAoc3RycG9zKCR1cmwsICJzYXZlTWVtb3J5PSIpID09PSBGQUxTRSkKICAgICAgICAgICAgJHVybCAuPSAiJnNhdmVNZW1vcnk9Ii4kdGhpcy0+c2F2ZU1lbW9yeTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICR1cmwgPSBwcmVnX3JlcGxhY2UoInxzYXZlTWVtb3J5PVswLTldK3wiLCAic2F2ZU1lbW9yeT0iLiR0aGlzLT5zYXZlTWVtb3J5LCAkdXJsKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygkdXJsLCAicmFuZD0iKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICR1cmwgLj0gIiZyYW5kPSIudGltZSgpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHVybCA9IHByZWdfcmVwbGFjZSgifHJhbmQ9WzAtOV0rfCIsICJyYW5kPSIudGltZSgpLCAkdXJsKTsKCiAgICAgICAgJHByb2Nlc3NVcmwgPSAkdXJsOyAvLyJodHRwOi8vd3d3LnZpc3VhbC1waHAuY29tL3Rvb2xzL3Byb2Nlc3MucGhwP3VybD0iLnVybGVuY29kZSgkdXJsKTsKCiAgICAgICAgaWYgKCR0aGlzLT5sYXN0VGltZVVwZGF0ZSAhPSBub3coKSkKICAgICAgICB7CiAgICAgICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXMgPSBhcnJheSgpOwogICAgICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJpZCJdID0gJHRoaXMtPmlkOwogICAgICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJyZXN1bWVVcmwiXSA9ICRwcm9jZXNzVXJsOwogICAgICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJ0aW1lVXBkYXRlIl0gPSBub3coKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVR5cGUgPT0gInN0RGF0YWJhc2UiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGFibGUgPSBnZXRUYWJsZSgicHJvY2Vzc2VzIik7CiAgICAgICAgICAgICAgICAkVGFibGUtPnVwZGF0ZVJhd1JlY29yZCgkdXBkYXRlUmVjb3JkVmFsdWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVR5cGUgPT0gInN0U2Vzc2lvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9zZXNzaW9uX3N0YXJ0KCk7CiAgICAgICAgICAgICAgICAkX1NFU1NJT05bIlByb2Nlc3NNYW5hZ2VyIl1bJHRoaXMtPmlkXVsicmVjb3JkIl0gPSBhcnJheV9tZXJnZSgkX1NFU1NJT05bIlByb2Nlc3NNYW5hZ2VyIl1bJHRoaXMtPmlkXVsicmVjb3JkIl0sICR1cGRhdGVSZWNvcmRWYWx1ZXMpOwogICAgICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVR5cGUgPT0gInN0RmlsZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHRoaXMtPmlkLiIucmVjb3JkLmNhY2hlIiwgc2VyaWFsaXplKGFycmF5X21lcmdlKCR0aGlzLT5NYW5hZ2VyLT5nZXRSZWNvcmQoJHRoaXMtPmlkKSwgJHVwZGF0ZVJlY29yZFZhbHVlcykpKTsKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAkdGhpcy0+bGFzdFRpbWVVcGRhdGUgPSBub3coKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRwcm9jZXNzVXJsKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcmVzdW1lSW5CYWNrZ3JvdW5kKCkKICAgIHsKICAgICAgICAkdXJsID0gJHRoaXMtPnNhdmVGb3JSZXN1bWUoKTsKICAgICAgICAkdGhpcy0+cmVzdW1lVXJsID0gJHVybDsKICAgICAgICAKICAgICAgICAkdGhpcy0+c2F2ZVByb2dyZXNzKHRydWUpOyAgICAgICAgIAogICAgICAgIAogICAgICAgIGZsb2NrKCR0aGlzLT5mbCxMT0NLX1VOKTsKICAgICAgICBmY2xvc2UoJHRoaXMtPmZsKTsKICAgICAgICBfdW5saW5rKFBST0pFQ1RQQVRILiJjYWNoZS9sb2NrL3Byb2Nlc3MtIi4kdGhpcy0+aWQuIi5sb2NrIik7CiAgICAgICAgLy9wcm9jZXNzTWVzc2FnZSgiPGEgaHJlZj0nJHVybCc+UmVzdW1lPC9hPiIpOwogICAgICAgIAogICAgICAgIC8vIGFsd2F5cyAtIG9uIHNvbWUgc2VydmVycyBydW5uaW5nIGluIGJhY2tncm91bmQgaXMgZGlzYWJsZWQgLSB1c2VkIGluIFByb2Nlc3NNYW5hZ2VyLmNsYXNzLmpzCiAgICAgICAgLy9fZmlsZV9hcHBlbmRfY29udGVudHMoUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvdGVtcC9wcm9jZXNzLm91dCIsIGdldF9jbGFzcygkdGhpcykuIjogcnVuSW5CYWNrZ3JvdW5kOiAiLiR0aGlzLT5wYXJhbXNbInJ1bkluQmFja2dyb3VuZCJdLiJcclxuIik7CiAgICAgICAgCiAgICAgICAgLy8gRVJST1IgZW11bGF0aW9uCiAgICAgICAgLy9lY2hvICJhYmMiOwogICAgICAgIAogICAgICAgIGVjaG8gIjxodG1sPjxib2R5PiI7CiAgICAgICAgZWNobyAiPGEgaWQ9J3Jlc3VtZUxpbmsnIGNsYXNzPSdwcm9jZXNzUmVzdW1lTGluaycgb25jbGljaz0nY2xlYXJUaW1lb3V0KHRpdGxlVGltZXIpO2NsZWFyVGltZW91dChhdWRpb1RpbWVyKTtkb2N1bWVudC50aXRsZT10aXRsZVQ7JyBocmVmPSciLiR1cmwuIic+Q2xpY2sgaGVyZSB0byByZXN1bWUgdGhpcyBwcm9jZXNzPC9hPiI7CiAgICAgICAgLy9pZiAoJHRoaXMtPnBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0gPT09IGZhbHNlIHx8ICR0aGlzLT5wYXJhbXNbImRlYnVnUHJvY2VzcyJdIHx8IHN0cnBvcygkX0NPT0tJRVsiUHJvY2Vzc2VzUEhQRGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSkKICAgICAgICBpZiAoc3RycG9zKCR0aGlzLT5yZXN1bWVVcmwsICJkZWJ1Z1Byb2Nlc3M9dHJ1ZSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICR0aXRsZSA9ICJbIjsKICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8PSAxMDAgOyAkaSs9MjApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkaSA8PSAkdGhpcy0+cHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgJHRpdGxlIC49ICI9IjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkdGl0bGUgLj0gIn4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aXRsZSAuPSAiXSIuJHRoaXMtPnByb2dyZXNzLiIlIjsKCiAgICAgICAgICAgICR0aXRsZSA9ICJbIi4kdGhpcy0+cHJvZ3Jlc3MuIiVdIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vaWYgKCR0aGlzLT5wYXJhbXNbImRlYnVnUHJvY2VzcyJdIHx8IHN0cnBvcygkX0NPT0tJRVsiUHJvY2Vzc2VzUEhQRGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgLy9pZiAoc3RycG9zKCR0aGlzLT5yZXN1bWVVcmwsICJkZWJ1Z1Byb2Nlc3M9dHJ1ZSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVjaG8gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz4KICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVUaW1lciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdmFyIGF1ZGlvVGltZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHZhciBodG1sPWRvY3VtZW50LmJvZHkuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxicj4vZywgJycpOwogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxiciBcXC8+L2csICcnKTsKICAgICAgICAgICAgICAgICAgICBodG1sMiA9IGh0bWwuc3BsaXQoJzxhIGlkPVwicmVzdW1lTGlua1wiJyk7IAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gJyIuJHRpdGxlLiIgIi4kdGhpcy0+bmFtZS4iJzsgCiAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlVCA9IGRvY3VtZW50LnRpdGxlOwogICAgICAgICAgICAgICAgICAgIC8qYWxlcnQoaHRtbDJbMF0pO2FsZXJ0KGh0bWwyWzBdLmxlbmd0aCk7YWxlcnQoaHRtbDJbMV0pOyAqLwogICAgICAgICAgICAgICAgICAgIGlmIChodG1sMlswXS5sZW5ndGggPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bWVMaW5rJyk7IAogICAgICAgICAgICAgICAgICAgICAgICBhLnN0eWxlLmRpc3BsYXk9J25vbmUnOyAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdy5pZCA9ICd3YWl0JzsKICAgICAgICAgICAgICAgICAgICAgICAgdy5pbm5lckhUTUwgPSAnUGxlYXNlIHdhaXQuLi4nOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bWVMaW5rJyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dhaXQnKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnN0eWxlLmRpc3BsYXk9Jyc7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5zdHlsZS5kaXNwbGF5PSdub25lJzsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsPWEuaHJlZjsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnJlbW92ZUF0dHJpYnV0ZSgnaHJlZicpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJ0F1dG8gcmVzdW1pbmcuLi4nOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmPXVybDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdWRpbycpOwogICAgICAgICAgICAgICAgICAgICAgICBhdWRpby5zcmMgPSAnIi5QUk9KRUNUVVJMLiJjb3JlL2NsYXNzZXMvX25ldy9EZWJ1Zy9wYW5lbHMvUEhQL2ltZy9wcm9jZXNzLWVycm9yLm1wMyIuIic7CiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLmF1dG9wbGF5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLmxvb3AgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhdWRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVFID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRpdGxlRXJyb3IoKSAKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9ICchIEVSUk9SICEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGl0bGVUOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUUgPSAhdGl0bGVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCd0aXRsZUVycm9yKCknLCAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiZWVwRXJyb3IoKSAKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8ucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1RpbWVyID0gc2V0VGltZW91dCgnYmVlcEVycm9yKCknLCA1MDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZXBFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4iOwogICAgICAgICAgICAvL30KICAgICAgICAgICAgLy92YXJfZHVtcCgkX1NFU1NJT04pOwogICAgICAgICAgICAvL19zZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgLy9lY2hvICI8YnIgLz48YnIgLz5Qcm9jZXNzIFJlc3VtZSBVUkw6ICIuIjxhIGhyZWY9JyIuJHVybC4iJz5DbGljayBoZXJlIHRvIHJlc3VtZSB0aGlzIHByb2Nlc3M8L2E+IjsKICAgICAgICAgICAgLy9lY2hvICI8YSBocmVmPSciLiR1cmwuIiZyYW5kPSIudGltZSgpLiInPkNsaWNrIGhlcmUgdG8gcmVzdW1lIHRoaXMgcHJvY2VzczwvYT4iOwogICAgICAgICAgICAvL2VjaG8gIjxhIGhyZWY9JyIuJHVybC4iJz5DbGljayBoZXJlIHRvIHJlc3VtZSB0aGlzIHByb2Nlc3M8L2E+IjsKICAgICAgICAgICAgLy9lY2hvICJhYmMiOyBleGl0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdHJwb3MoJHRoaXMtPnJlc3VtZVVybCwgInJ1bkluQmFja2dyb3VuZD1mYWxzZSIpID09PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5kZWJ1Z1Byb2dyZXNzVGV4dCA9ICJydW5JbkJhY2tncm91bmQiOwogICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT5fcHJvZ3Jlc3NUZXh0KTsKCiAgICAgICAgICAgIGVjaG8gIjxociAvPkF1dG8gcnVubmluZyBpbiBiYWNrZ3JvdW5kLi4uIjsKICAgICAgICAgICAgLy9fZmlsZV9hcHBlbmRfY29udGVudHMoUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvdGVtcC9wcm9jZXNzLm91dCIsIGdldF9jbGFzcygkdGhpcykuIjogIi4kdXJsLiJcclxuIik7CiAgICAgICAgICAgIHJ1bkluQmFja2dyb3VuZCgkdXJsKTsKICAgICAgICB9CiAgICAgICAgZWNobyAiPC9ib2R5PjwvaHRtbD4iOwogICAgICAgICAgICAKICAgICAgICBleGl0OwogICAgfQoKCWZ1bmN0aW9uIHNsZWVwKCRzZWNvbmRzKQogICAgewogICAgICAgIHJldHVybihfc2xlZXAoJHNlY29uZHMpKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcHJvZ3Jlc3NQZXJjZW50KCR2YWx1ZSwgJHRvdGFsPU5VTEwpCgl7CgkJaWYgKCEkdmFsdWUpCgkJCSR2YWx1ZSA9IDA7CgkJZWxzZQoJCQkkdmFsdWUgPSAoaW50KSR2YWx1ZTsKCQkKCSAgICBpZiAoJHRvdGFsICE9PSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgJHZhbHVlID0gZmxvb3IoJHZhbHVlKjEwMC8kdG90YWwpOwogICAgICAgIH0KICAgIAoJCSR0aGlzLT5wcm9ncmVzcyA9ICR2YWx1ZTsKICAgICAgICAkdGhpcy0+c2F2ZVByb2dyZXNzKCk7Cgl9CgkKICAgIGZ1bmN0aW9uIGdldFByb2dyZXNzVGV4dCgpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5fcHJvZ3Jlc3NUZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQcm9ncmVzc1BlcmNlbnQoKQogICAgewogICAgICAgIHJldHVybigkdGhpcy0+cHJvZ3Jlc3MpOwogICAgfQogICAgCglmdW5jdGlvbiBwcm9ncmVzc1RleHQoJHZhbHVlKQoJewoJCSR0aGlzLT5fcHJvZ3Jlc3NUZXh0ID0gJHZhbHVlOwogICAgICAgICR0aGlzLT5zYXZlUHJvZ3Jlc3MoKTsKCX0KICAgIAogICAgZnVuY3Rpb24gc2F2ZVByb2dyZXNzKCRmb3JjZT1mYWxzZSkKICAgIHsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzID0gYXJyYXkoKTsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJpZCJdID0gJHRoaXMtPmlkOwogICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbInByb2dyZXNzIl0gPSAkdGhpcy0+cHJvZ3Jlc3M7CiAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlc1sicHJvZ3Jlc3NUZXh0Il0gPSAkdGhpcy0+X3Byb2dyZXNzVGV4dDsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJ0aW1lVXBkYXRlIl0gPSBub3coKTsKICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJzdGF0dXMiXSA9ICR0aGlzLT5zdGF0dXM7CiAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlc1sicmVzdW1lVXJsIl0gPSAkdGhpcy0+cmVzdW1lVXJsOwogICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbInRpbWVFbmQiXSA9ICR0aGlzLT50aW1lRW5kOwogICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbIm5hbWUiXSA9ICR0aGlzLT5uYW1lOwogICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbIm5leHRQcm9jZXNzIl0gPSAkdGhpcy0+bmV4dFByb2Nlc3M7CgogICAgICAgIGZvcmVhY2goJHVwZGF0ZVJlY29yZFZhbHVlcyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdmFsdWUgPT09IE5VTEwpCiAgICAgICAgICAgICAgICB1bnNldCgkdXBkYXRlUmVjb3JkVmFsdWVzWyRrZXldKTsKICAgICAgICB9CiAgICAgICAgCgogICAgICAgIC8vdmFyX2R1bXAoJHVwZGF0ZVJlY29yZFZhbHVlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCRmb3JjZSB8fCAhJHRoaXMtPnByb2dyZXNzVGltZW91dCB8fCAkdGhpcy0+X3Byb2dyZXNzVGltZSskdGhpcy0+cHJvZ3Jlc3NUaW1lb3V0IDwgdGltZSgpKQogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvICIxIjsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlVHlwZSA9PSAic3REYXRhYmFzZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUYWJsZSA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKTsKICAgICAgICAgICAgICAgICRUYWJsZS0+dXBkYXRlUmF3UmVjb3JkKCR1cGRhdGVSZWNvcmRWYWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlVHlwZSA9PSAic3RTZXNzaW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3Nlc3Npb25fc3RhcnQoKTsKICAgICAgICAgICAgICAgICRfU0VTU0lPTlsiUHJvY2Vzc01hbmFnZXIiXVskdGhpcy0+aWRdWyJyZWNvcmQiXSA9IGFycmF5X21lcmdlKCRfU0VTU0lPTlsiUHJvY2Vzc01hbmFnZXIiXVskdGhpcy0+aWRdWyJyZWNvcmQiXSwgJHVwZGF0ZVJlY29yZFZhbHVlcyk7CiAgICAgICAgICAgICAgICBfc2Vzc2lvbl93cml0ZV9jbG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlVHlwZSA9PSAic3RGaWxlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kdGhpcy0+aWQuIi5yZWNvcmQuY2FjaGUiLCBzZXJpYWxpemUoYXJyYXlfbWVyZ2UoJHRoaXMtPk1hbmFnZXItPmdldFJlY29yZCgkdGhpcy0+aWQpLCAkdXBkYXRlUmVjb3JkVmFsdWVzKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+X3Byb2dyZXNzVGltZSA9IHRpbWUoKTsKICAgICAgICB9CiAgICB9CgoJZnVuY3Rpb24gc2V0TmFtZSgkdmFsdWUpCgl7CgkJJHRoaXMtPm5hbWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPnNhdmVQcm9ncmVzcygpOyAgICAgICAgCgl9CgoJZnVuY3Rpb24gbWVzc2FnZSgkdmFsdWUpCgl7CiAgICAgICAgLy9wcm9jZXNzUHJvZ3Jlc3NUZXh0KCR2YWx1ZSk7CiAgICAgICAgLy9leGl0OwogICAgICAgIC8vIFRPRE8hISEhISEKICAgICAgICAKICAgICAgICAvL2lmIChpc19hcnJheSgkdmFsdWUpKQogICAgICAgIC8vewogICAgICAgIC8vICAgICR2YWx1ZSA9IHN0cl9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy99CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAkRGJMaW5rID0gZ2V0RGJMaW5rKCJwcm9jZXNzZXMiKTsKCQkkRGJMaW5rLT5xdWVyeSgiVVBEQVRFIGAiLmdldFRhYmxlKCJwcm9jZXNzZXMiKS0+c3FsTmFtZS4iYCBTRVQgYG1lc3NhZ2VzYD1DT05DQVQoYG1lc3NhZ2VzYCwnIi5yZWFsX2VzY2FwZV9zdHJpbmcoJHZhbHVlKS4iJykgV0hFUkUgaWQ9JyIuJHRoaXMtPmlkLiInIik7CiAgICAgICAgKi8KICAgICAgICAKCQkvLyR0aGlzLT5tZXNzYWdlcyAuPSAkdmFsdWUuIjxiciAvPiI7Cgl9CgoJZnVuY3Rpb24gZXJyb3IoJHZhbHVlKQoJewogICAgICAgIC8vIFRPRE8KICAgICAgICAvLyBpbiBhIGxvb3A/CiAgICAgICAgaWYgKCEkdGhpcy0+TWFuYWdlcikKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gIlRQcm9jZXNzOjplcnJvciAtIFByb2Nlc3MgaGFzIG5vIFByb2Nlc3NNYW5hZ2VyIjsKICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJpcG9zKCR2YWx1ZSwgIk15U1FMIHNlcnZlciBoYXMgZ29uZSBhd2F5IikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyAiRkFUQUwgRVJST1I6ICIuJHZhbHVlLiI8aHI+IjsKICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgLy8kZnVuY3Rpb25DYWxsID0gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgLy92YXJfZHVtcCgkZnVuY3Rpb25DYWxsKTsKICAgICAgICAvL2V4aXQ7CgogICAgICAgIGlmICgkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVR5cGUgPT0gInN0RmlsZSIpCiAgICAgICAgICAgIHJldHVybjsgLy8gemF0aW0ga3Z1bGkgRm9ycHNpCiAgICAgICAgCiAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlc1siaWQiXSA9ICR0aGlzLT5pZDsKCiAgICAgICAgLy8gamUgdG8gYmVybGlja2EsIE1FR0EgYmVybGlja2EuLi4gYXQgdG8gcHVzdGkgZGFsLCBhbGUgcG9yYWQgdHUgY2h5YmkgUHJvY2Vzc01hbmFnZXIKICAgICAgICBpZiAoJHRoaXMtPk1hbmFnZXIpCiAgICAgICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbImVycm9ycyJdID0gJHRoaXMtPk1hbmFnZXItPmdldEVycm9ycygkdGhpcy0+aWQpLiR2YWx1ZS4iPGJyIC8+PGJyIC8+IjsKICAgICAgICAKICAgICAgICBpZiAoJHRoaXMtPk1hbmFnZXItPnN0b3JhZ2VUeXBlID09ICJzdERhdGFiYXNlIikKICAgICAgICB7CiAgICAgICAgICAgICRUYWJsZSA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKTsKICAgICAgICAgICAgJFRhYmxlLT51cGRhdGVSYXdSZWNvcmQoJHVwZGF0ZVJlY29yZFZhbHVlcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlVHlwZSA9PSAic3RTZXNzaW9uIikKICAgICAgICB7CiAgICAgICAgICAgIF9zZXNzaW9uX3N0YXJ0KCk7CiAgICAgICAgICAgICRfU0VTU0lPTlsiUHJvY2Vzc01hbmFnZXIiXVskdGhpcy0+aWRdWyJyZWNvcmQiXSA9IGFycmF5X21lcmdlKCRfU0VTU0lPTlsiUHJvY2Vzc01hbmFnZXIiXVskdGhpcy0+aWRdWyJyZWNvcmQiXSwgJHVwZGF0ZVJlY29yZFZhbHVlcyk7CiAgICAgICAgICAgIF9zZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR0aGlzLT5NYW5hZ2VyLT5zdG9yYWdlVHlwZSA9PSAic3RGaWxlIikKICAgICAgICB7CiAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHRoaXMtPmlkLiIucmVjb3JkLmNhY2hlIiwgc2VyaWFsaXplKGFycmF5X21lcmdlKCR0aGlzLT5NYW5hZ2VyLT5nZXRSZWNvcmQoJHRoaXMtPmlkKSwgJHVwZGF0ZVJlY29yZFZhbHVlcykpKTsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE8hISEhCiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAkRGJMaW5rID0gZ2V0RGJMaW5rKCJwcm9jZXNzZXMiKTsKICAgICAgICAKICAgICAgICAkRGJMaW5rLT5xdWVyeSgiVVBEQVRFIGAiLmdldFRhYmxlKCJwcm9jZXNzZXMiKS0+c3FsTmFtZS4iYCBTRVQgYGVycm9yc2A9Q09OQ0FUKGBlcnJvcnNgLCciLnJlYWxfZXNjYXBlX3N0cmluZygkdmFsdWUpLiInKSBXSEVSRSBpZD0nIi4kdGhpcy0+aWQuIiciKTsKCQkKCQlpZiAoJHZhbHVlID09ICIiKQoJCQkkdmFsdWUgPSAiRU1QVFktRVJST1Igc29tZXRoaW5nIHdhcyB3cm9uZyI7CgkJCQoJCSovCiAgICAgICAgLy8kdGhpcy0+ZXJyb3JzIC49ICR2YWx1ZS4iPGJyIC8+IjsKCX0KCglmdW5jdGlvbiBnZXRTaWduYWwoKQoJewogICAgICAgIGlmIChJTlNUQUxMID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRydWUgfHwgJHRoaXMtPnN0b3JhZ2VUeXBlID09ICJzdERhdGFiYXNlIikKICAgICAgICB7CiAgICAgICAgICAgICRyZWNvcmQgPSBnZXRUYWJsZSgicHJvY2Vzc2VzIiktPmdldFJlY29yZCgiaWQ9Ii4kdGhpcy0+aWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdGhpcy0+c3RvcmFnZVR5cGUgPT0gInN0U2Vzc2lvbiIpCiAgICAgICAgewogICAgICAgICAgICBfc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICAkcmVjb3JkID0gJF9TRVNTSU9OWyJQcm9jZXNzTWFuYWdlciJdWyRwcm9jZXNzSWRdWyJyZWNvcmQiXTsKICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk1hbmFnZXItPnN0b3JhZ2VUeXBlID09ICJzdEZpbGUiKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9IHVuc2VyaWFsaXplKEBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+TWFuYWdlci0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHRoaXMtPmlkLiIucmVjb3JkLmNhY2hlIikpOwogICAgICAgIH0KCgkJcmV0dXJuKCRyZWNvcmRbInNpZ25hbCJdKTsKCX0KCglmdW5jdGlvbiBzaWduYWwoKQoJewoJCSRzaWduYWwgPSAkdGhpcy0+Z2V0U2lnbmFsKCk7CgkJaWYgKCRzaWduYWwgPT0gInBzU3RvcCIpCgkJewoJCQkkdGhpcy0+c2V0U3RhdHVzKCJwc1N0b3BwZWQiKTsKCQkJCiAgICAgICAgICAgIGV4aXQ7CgkJfQogICAgICAgIGlmICgkc2lnbmFsID09ICJwc1BhdXNlIikKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5zZXRTdGF0dXMoInBzUGF1c2VkIik7CiAgICAgICAgICAgICR0aGlzLT5zYXZlRm9yUmVzdW1lKCk7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQoJfQoKCWZ1bmN0aW9uIG1lbW9yeSgkdmFsdWUpCgl7CgkJLy9lY2hvICJVUERBVEUgYHByb2Nlc3Nlc2AgU0VUIGBlcnJvcnNgPUNPTkNBVChgZXJyb3JzYCwnIi5zdHJfcmVwbGFjZSgiJyIsICJcXCciLCAkdmFsdWUpLiInKSBXSEVSRSBpZD0nIi4kdGhpcy0+aWQuIiciOwoJCS8vZXhpdDsKCQkKCQkvLyREYkxpbmsgPSBnZXRVcGRhdGVEYkxpbmsoInByb2Nlc3NlcyIpOwoJCS8vJERiTGluay0+cXVlcnkoIlVQREFURSBgcHJvY2Vzc2VzYCBTRVQgYGVycm9yc2A9Q09OQ0FUKGBlcnJvcnNgLCciLnN0cl9yZXBsYWNlKCInIiwgIlxcJyIsICR2YWx1ZSkuIicpIFdIRVJFIGlkPSciLiR0aGlzLT5pZC4iJyIpOwoJCQoJCS8qJFRhYmxlID0gZ2V0VGFibGUoInByb2Nlc3NlcyIpOwoJCSRUYWJsZS0+Z2V0SGlkZGVuKCJpZD0iLiR0aGlzLT5pZCk7CgoJCSR1cGRhdGVSZWNvcmRWYWx1ZXMgPSBhcnJheSgpOwoJCSR1cGRhdGVSZWNvcmRWYWx1ZXNbImlkIl0gPSAkdGhpcy0+aWQ7CgkJJHVwZGF0ZVJlY29yZFZhbHVlc1siZXJyb3JzIl0gPSAkVGFibGUtPnJlY29yZHNbMF1bImVycm9ycyJdLiR2YWx1ZS4iPGJyIC8+XG4iOwoJCQoJCSRUYWJsZSA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKTsKCQkkVGFibGUtPnVwZGF0ZVJlY29yZCgkdXBkYXRlUmVjb3JkVmFsdWVzKTsKCQkqLwoJCQoJCWlmICgkdmFsdWUgPT0gIiIpCgkJCSR2YWx1ZSA9ICJFTVBUWS1FUlJPUiBzb21ldGhpbmcgd2FzIHdyb25nIjsKCQkJCgkJJG1lbW9yeVVzYWdlID0gZ2V0TWVtb3J5VXNhZ2UodHJ1ZSk7CgkJJHRoaXMtPm1lc3NhZ2VzIC49ICR2YWx1ZS4iICgiLnJvdW5kKCRtZW1vcnlVc2FnZS8xMDI0LzEwMjQsIDIpLiIgTUIsICIucm91bmQoJG1lbW9yeVVzYWdlLzEwMjQsIDIpLiIga0IsICIuJG1lbW9yeVVzYWdlLiIgYikgWyIuKCRtZW1vcnlVc2FnZS0kdGhpcy0+bGFzdE1lbW9yeVVzYWdlKS4iIGJdPGJyIC8+IjsKCgkJJHRoaXMtPmxhc3RNZW1vcnlVc2FnZSA9ICRtZW1vcnlVc2FnZTsKCgl9CgkKCWZ1bmN0aW9uIHNhdmVQcm9maWxlcigpCgl7CgkJCgl9CgkKCWZ1bmN0aW9uIGFkZFByb2ZpbGVySHRtbCgpCgl7CgkJCgl9CiAgICAKICAgIAp9CmZ1bmN0aW9uIHByb2Nlc3NQcm9ncmVzcygkdmFsdWUsICR0b3RhbD1OVUxMKQp7CiAgICBnbG9iYWwgJE1haW5Qcm9jZXNzOwogICAgaWYgKCRNYWluUHJvY2VzcykKICAgICAgICAkTWFpblByb2Nlc3MtPnByb2dyZXNzUGVyY2VudCgkdmFsdWUsICR0b3RhbCk7CiAgICAvL2Vsc2UKICAgIC8vICAgIHNob3dNZXNzYWdlKCJPYmplY3QgJ01haW5Qcm9jZXNzJyBub3QgZm91bmQiKTsKfQoKZnVuY3Rpb24gcHJvY2Vzc1Byb2dyZXNzQnlJbmRleCgkdmFsdWUsICR0b3RhbD1OVUxMKQp7CiAgICBnbG9iYWwgJE1haW5Qcm9jZXNzOwogICAgaWYgKCRNYWluUHJvY2VzcykKICAgICAgICAkTWFpblByb2Nlc3MtPnByb2dyZXNzUGVyY2VudChtaW4oJHZhbHVlKjEwMC8oJHRvdGFsID8gJHRvdGFsIDogJE1haW5Qcm9jZXNzLT5wcm9ncmVzc1RvdGFsKSwgOTkpKTsKICAgIC8vZWxzZQogICAgLy8gICAgc2hvd01lc3NhZ2UoIk9iamVjdCAnTWFpblByb2Nlc3MnIG5vdCBmb3VuZCIpOwp9CgpmdW5jdGlvbiBwcm9jZXNzUHJvZ3Jlc3NUZXh0KCRwcm9ncmVzc1RleHQpCnsKICAgIGdsb2JhbCAkTWFpblByb2Nlc3M7CiAgICAKICAgIGlmICgkX1JFUVVFU1RbImRlYnVnUHJvY2VzcyJdIHx8IHN0cnBvcygkX0NPT0tJRVsiUHJvY2Vzc2VzUEhQRGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSkKICAgIHsKICAgICAgICAkcHJvZ3Jlc3NUZXh0ID0gcHJlZ19yZXBsYWNlKCJ8IFxcW2RlYnVnOiBbXlxcXV0rXFxdfGltcyIsICIiLCAkcHJvZ3Jlc3NUZXh0KTsKICAgICAgICAkcHJvZ3Jlc3NUZXh0IC49ICIgW2RlYnVnOiAiLnJvdW5kKGdldFRpbWVVc2FnZSgpLCAyKS4icywgIi5yb3VuZChnZXRNZW1vcnlVc2FnZSh0cnVlKS8xMDI0LzEwMjQsIDIpLiJNQl0iOwogICAgICAgIC8vaWYgKCRNYWluUHJvY2Vzcy0+ZGVidWdQcm9ncmVzc1RleHQpCiAgICAgICAgLy8gICAgJHByb2dyZXNzVGV4dCAuPSAiWyIuJE1haW5Qcm9jZXNzLT5kZWJ1Z1Byb2dyZXNzVGV4dC4iXSI7CiAgICB9CiAgICAKICAgIGlmICgkTWFpblByb2Nlc3MpCiAgICAgICAgJE1haW5Qcm9jZXNzLT5wcm9ncmVzc1RleHQoJHByb2dyZXNzVGV4dCk7CiAgICAgICAgCiAgICAkX19wcm9jZXNzUHJvZ3Jlc3NUZXh0VGltZXIgPSB0aW1lKCk7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NTaWduYWwoKQp7CiAgICBnbG9iYWwgJE1haW5Qcm9jZXNzOwogICAgaWYgKCRNYWluUHJvY2VzcykKICAgICAgICAkTWFpblByb2Nlc3MtPnNpZ25hbCgpOwogICAgLy9lbHNlCiAgICAvLyAgICBzaG93TWVzc2FnZSgiT2JqZWN0ICdNYWluUHJvY2Vzcycgbm90IGZvdW5kIik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGaW5pc2goKQp7CiAgICBnbG9iYWwgJE1haW5Qcm9jZXNzOwogICAgaWYgKCRNYWluUHJvY2VzcykKICAgICAgICAkTWFpblByb2Nlc3MtPmZpbmlzaCgpOwp9CgokX19wcm9jZXNzTWVzc2FnZUVuYWJsZWQgPSB0cnVlOwpmdW5jdGlvbiBzZXRQcm9jZXNzTWVzc2FnZUVuYWJsZWQoJGVuYWJsZWQpCnsKICAgIGdsb2JhbCAkX19wcm9jZXNzTWVzc2FnZUVuYWJsZWQ7CiAgICAkX19wcm9jZXNzTWVzc2FnZUVuYWJsZWQgPSAkZW5hYmxlZDsKfQoKZnVuY3Rpb24gc2V0UHJvY2Vzc0Vycm9yRW5hYmxlZCgkZW5hYmxlZCkKewogICAgZ2xvYmFsICRfX3Byb2Nlc3NFcnJvckVuYWJsZWQ7CiAgICAkX19wcm9jZXNzRXJyb3JFbmFibGVkID0gJGVuYWJsZWQ7Cn0KCmZ1bmN0aW9uIHNldFByb2Nlc3NNZXNzYWdlT3V0cHV0KCRvdXRwdXQsICRuYW1lPSIiKQp7CiAgICBnbG9iYWwgJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQsICRfX3Byb2Nlc3NNZXNzYWdlRmlsZTsKICAgIAogICAgaWYgKCRvdXRwdXQgPT0gIiIpCiAgICAgICAgJG91dHB1dCA9ICJwbW9UYWJsZSI7CiAgICAKICAgIGlmICgkb3V0cHV0ID09ICJwbW9GaWxlIikKICAgIHsKICAgICAgICAkX19wcm9jZXNzTWVzc2FnZUZpbGUgPSAkbmFtZTsKICAgICAgICB1bmxpbmsoJG5hbWUpOwogICAgfQoKICAgICRfX3Byb2Nlc3NNZXNzYWdlT3V0cHV0ID0gJG91dHB1dDsKfQoKZnVuY3Rpb24gc2V0UHJvY2Vzc0RlYnVnTGV2ZWwoJGRlYnVnTGV2ZWwpCnsKICAgIGdsb2JhbCAkX19wcm9jZXNzRGVidWdMZXZlbDsKICAgIAogICAgaWYgKCRkZWJ1Z0xldmVsID09PSAiIikKICAgICAgICAkX19wcm9jZXNzRGVidWdMZXZlbCA9IDA7CiAgICBlbHNlCiAgICAgICAgJF9fcHJvY2Vzc0RlYnVnTGV2ZWwgPSAkZGVidWdMZXZlbDsKfQoKZnVuY3Rpb24gZ2V0UHJvY2Vzc0RlYnVnTGV2ZWwoKQp7CiAgICBnbG9iYWwgJF9fcHJvY2Vzc0RlYnVnTGV2ZWw7CgogICAgcmV0dXJuKCRfX3Byb2Nlc3NEZWJ1Z0xldmVsKTsKfQoKZnVuY3Rpb24gZ2V0UHJvY2Vzc01lc3NhZ2VPdXRwdXQoKQp7CiAgICBnbG9iYWwgJF9fcHJvY2Vzc01lc3NhZ2VPdXRwdXQ7CiAgICAKICAgIGlmICgkX19wcm9jZXNzTWVzc2FnZU91dHB1dCA9PSAiIikKICAgICAgICByZXR1cm4oInBtb1RhYmxlIik7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKCRfX3Byb2Nlc3NNZXNzYWdlT3V0cHV0KTsKfQo=ZnVuY3Rpb24gVFByb2Nlc3NNYW5hZ2VyKHBhcmFtcywgaWQpICAgCnsKICAgIGlmICghaWQpCiAgICAgICAgaWQgPSBVVUlEKCk7CiAgICAgICAgCiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUUHJvY2Vzc01hbmFnZXIsIFRPYmplY3QpOwoKdmFyIF9fcHJvY2Vzc01hbmFnZXJQcm9jZXNzTWFuYWdlcnMgPSB7fTsKVFByb2Nlc3NNYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIC8vYWxlcnQoMSk7CiAgICB0aGlzLnBhcmVudF9jcmVhdGUoKTsKICAgIGlmIChBSkFYRklMRU5BTUUgPT0gImluc3RhbGwucGhwIikKICAgICAgICB0aGlzLmVtcHR5VXJsID0gImluc3RhbGwucGhwP3Byb2Nlc3NFbXB0eVVybD10cnVlIjsKICAgIGVsc2UKICAgICAgICB0aGlzLmVtcHR5VXJsID0gUFJPSkVDVFVSTCsiY29yZS9jbGFzc2VzL19uZXcvUHJvY2Vzcy9jaGVja19zaW1wbGUucGhwIjsKICAgICAgICAKICAgIHRoaXMuZW1wdHlVcmxMb2FkZWQgPSBmYWxzZTsKICAgIAogICAgaWYgKF9fcHJvY2Vzc01hbmFnZXJQcm9jZXNzTWFuYWdlcnNbdGhpcy5wYXJhbXNbInByb2Nlc3NJZCJdXSkKICAgIHsKICAgICAgICBhbGVydCgiRVJST1I6IEFub3RoZXIgUHJvY2Vzc01hbmFnZXIgYWxyZWFkeSBydW5uaW5nIGZvciBwcm9jZXNzICciK3RoaXMucGFyYW1zWyJwcm9jZXNzSWQiXSsiJyEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBfX3Byb2Nlc3NNYW5hZ2VyUHJvY2Vzc01hbmFnZXJzW3RoaXMucGFyYW1zWyJwcm9jZXNzSWQiXV0gPSB0aGlzOwoKICAgIHRoaXMuaWZyYW1lID0gY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CiAgICAvL3RoaXMuaWZyYW1lLnN0eWxlLndpZHRoID0gIjMwMHB4IjsKICAgIC8vdGhpcy5pZnJhbWUuc3R5bGUuaGVpZ2h0ID0gIjEwMHB4IjsKICAgIHRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAvL3RoaXMuaWZyYW1lLnN0eWxlLmJvcmRlciA9ICIxcHggZGFzaGVkICNGRjAwMDAiOwogICAgLy90aGlzLmlmcmFtZS5zcmMgPSB0aGlzLnBhcmFtc1sidXJsIl07CiAgICAvL2FsZXJ0KDEpOwogICAgCiAgICB2YXIgcmVjb3JkID0gQUpBWC5nZXRPYmplY3RNZXRob2QoJ1Byb2Nlc3NNYW5hZ2VyJywgJ2dldFByb2Nlc3NJbmZvJywgeydwcm9jZXNzSWQnOnRoaXMucGFyYW1zWyJwcm9jZXNzSWQiXSwnc3RvcmFnZVR5cGUnOnRoaXMucGFyYW1zWyJzdG9yYWdlVHlwZSJdLCdzdG9yYWdlUGF0aCc6dGhpcy5wYXJhbXNbInN0b3JhZ2VQYXRoIl19KTsKICAgIC8vYWxlcnQocmVjb3JkWyJwcm9ncmVzcyJdKTsKICAgIGlmIChyZWNvcmRbInByb2dyZXNzIl0gIT0gMTAwKQogICAgewogICAgICAgIC8vYWxlcnQodGhpcy5wYXJhbXNbInVybCJdKTsKICAgICAgICAvL2R1bXAodGhpcy5wYXJhbXNbInVybCJdKTsKICAgICAgICAKICAgICAgICAvLyBNVVNUIGJlIGJlZm9yZSBzZXR0aW5nIHNyYwogICAgICAgIGdldEVsZW1lbnQodGhpcy5wYXJhbXNbImNvbnRhaW5lciJdKS5hcHBlbmRDaGlsZCh0aGlzLmlmcmFtZSk7CiAgICAgICAgdGhpcy5pZnJhbWUuc3JjID0gdGhpcy5lbXB0eVVybDsKCiAgICAgICAgLyoKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgLy93aW5kb3cub3Blbih0aGlzLnBhcmFtc1sidXJsIl0pOwogICAgICAgICAgICBfdGhpcy5pZnJhbWUuc3JjID0gX3RoaXMucGFyYW1zWyJ1cmwiXTsKICAgICAgICB9LCAxMDAwKTsKICAgICAgICAqLwogICAgfQogICAgCiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgYWRkRXZlbnQodGhpcy5pZnJhbWUsICJsb2FkIiwgZnVuY3Rpb24oKXtfdGhpcy5vbkxvYWQoKX0pOwogICAgYWRkRXZlbnQodGhpcy5pZnJhbWUsICJlcnJvciIsIGZ1bmN0aW9uKGUpe2FsZXJ0KCdlcnJvcicpO2R1bXAoZSl9KTsKfQoKVFByb2Nlc3NNYW5hZ2VyLnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbigpCnsKICAgIHZhciBib2R5ID0gdGhpcy5pZnJhbWUuY29udGVudERvY3VtZW50LmJvZHk7CgogICAgaWYgKCF0aGlzLmVtcHR5VXJsTG9hZGVkKQogICAgewogICAgICAgIGlmIChib2R5LmlubmVySFRNTCA9PSAiT0siKQogICAgICAgIHsKICAgICAgICAgICAgLy9hbGVydCgiZW1wdHkgbG9hZGVkIik7CiAgICAgICAgICAgIHRoaXMuZW1wdHlVcmxMb2FkZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmlmcmFtZS5zcmMgPSB0aGlzLnBhcmFtc1sidXJsIl07CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgX3Rocm93KCJUUHJvY2Vzc01hbmFnZXI6Om9uTG9hZCgpIC0gY2Fubm90IGxvYWQgZW1wdHkgVVJMICgiK3RoaXMuZW1wdHlVcmwrIikiKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vYWxlcnQodGhpcy5pZnJhbWUuc3JjKTsKICAgIC8vYWxlcnQoYm9keS5pbm5lckhUTUwpOwogICAgLy9hbGVydChib2R5LmlubmVySFRNTC5sZW5ndGgpOwogICAgCiAgICB2YXIgYUxpc3QgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIsIGJvZHkpOwogICAgLy9hbGVydChhTGlzdC5sZW5ndGgpOwogICAgdmFyIHN0b3AgPSBmYWxzZTsKICAgIGlmIChhTGlzdC5sZW5ndGgpCiAgICB7CiAgICAgICAgaWYgKGdldFByZXZTaWJsaW5nTm9kZXMoYUxpc3RbYUxpc3QubGVuZ3RoLTFdKS5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9hbGVydChzcmMpOwogICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zWyJkZWJ1Z1Byb2Nlc3MiXSkKICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lLnNyYyA9IGFMaXN0W2FMaXN0Lmxlbmd0aC0xXS5ocmVmOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGJvZHkuaW5uZXJIVE1MLmluZGV4T2YoIkZJTklTSEVEIikgPiAtMSkKICAgIHsKICAgICAgICAvL2FsZXJ0KCJGSU5JU0hFRCIpOwogICAgfQogICAgZWxzZSBpZiAoYm9keS5pbm5lckhUTUwgIT0gIiIpCiAgICB7CiAgICAgICAgc3RvcCA9IHRydWU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgX3Rocm93KCJUUHJvY2Vzc01hbmFnZXI6Om9uTG9hZCgpIC0gZW1wdHkgcmVzdWx0ICgiK3RoaXMuaWZyYW1lLnNyYysiKSIpOwogICAgICAgIHN0b3AgPSB0cnVlOwogICAgfQogICAgCiAgICBpZiAoc3RvcCkKICAgIHsKICAgICAgICB0aGlzLmlmcmFtZS5zdHlsZS53aWR0aCA9ICIzMDBweCI7CiAgICAgICAgdGhpcy5pZnJhbWUuc3R5bGUuaGVpZ2h0ID0gIjEwMHB4IjsKICAgICAgICB0aGlzLmlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgLy9hbGVydChib2R5LmlubmVySFRNTCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdGhpcy5pZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0KfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvUHJvY2Vzcy9Qcm9jZXNzTWFuYWdlci5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBUUHJvY2Vzc01hbmFnZXIgZXh0ZW5kcyBUT2JqZWN0CnsKCXZhciAkbmFtZT0iUHJvY2Vzc01hbmFnZXIiOwogICAgdmFyICRzdG9yYWdlVHlwZSA9ICJzdERhdGFiYXNlIjsgLy8gb3Igc2Vzc2lvbgoJCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgl7CiAgICAgICAgLy8kdGhpcy0+c3RvcmFnZVBhdGggPSBQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wLyI7CiAgICAgICAgLy8kdGhpcy0+c3RvcmFnZVBhdGggPSBQUk9KRUNUUEFUSC4iY2FjaGUvcHJvY2Vzcy8iOwogICAgICAgICR0aGlzLT5zdG9yYWdlUGF0aCA9IFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3Byb2Nlc3Nlcy8iOwoJfQoJCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIWhlYWRIdG1sQWRkZWQoX19DTEFTU19fLCAkcGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIHBhcmVudDo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L1Byb2Nlc3MvUHJvY2Vzc01hbmFnZXIuY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9ydW5VcmwoJHByb2Nlc3NJZCwgJHByb2Nlc3NVcmwsICRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAvL2VjaG8gZ2V0SmF2YVNjcmlwdEh0bWwoImFsZXJ0KCciLiRwcm9jZXNzSWQuIicpIik7CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIC8vaWYgKCRfUkVRVUVTVFsiZGVidWdQcm9jZXNzIl0gPT0gInRydWUiIHx8IHN0cnBvcygkX1NFUlZFUlsiSFRUUF9SRUZFUkVSIl0sICJkZWJ1Z1Byb2Nlc3M9dHJ1ZSIpICE9PSBGQUxTRSB8fCBzdHJwb3MoJF9DT09LSUVbIlByb2Nlc3Nlc1BIUERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSAhPT0gRkFMU0UgfHwgKCRwYXJhbXMgJiYgJHBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0gPT09IGZhbHNlKSkKICAgICAgICBnbG9iYWwgJGFqYXhWaWV3VHlwZTsKICAgICAgICBpZiAoc3RycG9zKCRwcm9jZXNzVXJsLCAiZGVidWdQcm9jZXNzPXRydWUiKSAhPT0gRkFMU0UgfHwgKCRhamF4Vmlld1R5cGUgPT0gInZ0UHJvY2VzcyIgJiYgc3RycG9zKCRwcm9jZXNzVXJsLCAicnVuSW5CYWNrZ3JvdW5kPWZhbHNlIikgIT09IEZBTFNFKSB8fCBzdHJwb3MoJF9DT09LSUVbIlByb2Nlc3Nlc1BIUERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICBlY2hvICI8YSBocmVmPSciLigkcHJvY2Vzc1VybCkuIicgdGFyZ2V0PSdfYmxhbmsnPkNsaWNrIHRvIHN0YXJ0IHByb2Nlc3M8L2E+IjsKICAgICAgICAgICAgJGV4ZWN1dGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3RycG9zKCRwcm9jZXNzVXJsLCAicnVuSW5CYWNrZ3JvdW5kPWZhbHNlIikgPT09IEZBTFNFKQogICAgICAgIC8vZWxzZSBpZiAoJHBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0gIT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAvLyBjYWxscyBpdHNlbGYgaW4gc2VwYXJhdGUgdGhyZWFkCiAgICAgICAgICAgICRjb250ZW50ID0gcnVuSW5CYWNrZ3JvdW5kKCRwcm9jZXNzVXJsLCA0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkY29udGVudCA9PT0gdHJ1ZSB8fCBzdHJwb3MoJGNvbnRlbnQsICJGSU5JU0hFRCIpICE9PSBGQUxTRSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGV4ZWN1dGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vIE9LIC0gdGhlIHNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IChubyByZXN1bHQgcmV0dXJuZWQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoJGNvbnRlbnQgIT09IE5VTEwgJiYgJGNvbnRlbnQgIT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiVFByb2Nlc3NNYW5hZ2VyOjpydW4oKSAtIFByb2Nlc3MgcmVzdWx0IGVycm9yOiAiLiRjb250ZW50LCBtdEVycm9yKTsKICAgICAgICAgICAgICAgIGVjaG8gIlByb2Nlc3MgcmVzdWx0IGVycm9yOjxociAvPiI7CiAgICAgICAgICAgICAgICB2YXJfZHVtcCgkY29udGVudCk7CiAgICAgICAgICAgICAgICBlY2hvICI8aHIgLz4iLiI8YSBocmVmPSciLigkdGhpcy0+cHJvY2Vzc1VybCkuIicgdGFyZ2V0PSdfYmxhbmsnPlByb2Nlc3MgVVJMPC9hPiI7CiAgICAgICAgICAgICAgICAkcHJvY2Vzc0lkID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXMpOwogICAgICAgIC8vdmFyX2R1bXAoJGV4ZWN1dGVkKTsKICAgICAgICAvL2R1bXAoJGV4ZWN1dGVkKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgaWYgKCEkZXhlY3V0ZWQgJiYgJGFqYXhWaWV3VHlwZSAhPSAidnRQcm9jZXNzIikKICAgICAgICB7CiAgICAgICAgICAgIC8vZWNobyAiMSI7ZXhpdDsKICAgICAgICAgICAgJHRoaXMtPmdldEhlYWRIdG1sKCk7CiAgICAgICAgICAgICR0aGlzLT5pbml0KCk7CiAgICAgICAgICAgIGlmIChpc1NpbXBsZUFycmF5KCRwYXJhbXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJGtleSA9PiAkdmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV1bInJ1bkluQmFja2dyb3VuZCJdID0gImZhbHNlIjsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXldWyJwcm9jZXNzSWQiXSA9ICRwcm9jZXNzSWQ7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XVsidXJsIl0gPSAkcHJvY2Vzc1VybDsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyRrZXldWyJjb250YWluZXIiXSA9ICR0aGlzLT5pZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRfcGFyYW1zID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRfcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSA9ICJmYWxzZSI7CiAgICAgICAgICAgICAgICAkX3BhcmFtc1sic3RvcmFnZVR5cGUiXSA9ICRwYXJhbXNbInN0b3JhZ2VUeXBlIl07CiAgICAgICAgICAgICAgICAkX3BhcmFtc1sic3RvcmFnZVBhdGgiXSA9ICRwYXJhbXNbInN0b3JhZ2VQYXRoIl07CiAgICAgICAgICAgICAgICAkX3BhcmFtc1sicHJvY2Vzc0lkIl0gPSAkcHJvY2Vzc0lkOwogICAgICAgICAgICAgICAgJF9wYXJhbXNbInVybCJdID0gJHByb2Nlc3NVcmw7CiAgICAgICAgICAgICAgICAkX3BhcmFtc1siY29udGFpbmVyIl0gPSAkdGhpcy0+aWQ7CiAgICAgICAgICAgICAgICAkX3BhcmFtc1siZGVidWdQcm9jZXNzIl0gPSAkcGFyYW1zWyJkZWJ1Z1Byb2Nlc3MiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJGpzIC49ICJ2YXIgUHJvY2Vzc01hbmFnZXIgPSBuZXcgVFByb2Nlc3NNYW5hZ2VyKCIuJHRoaXMtPmdldEpzUGFyYW1zKCRfcGFyYW1zKS4iLCAnIi4kdGhpcy0+aWQuIicpOyBcbiI7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgaWQ9JyIuJHRoaXMtPmlkLiInPjwvZGl2PiI7CiAgICAgICAgICAgIGVjaG8gJHRoaXMtPmdldEphdmFTY3JpcHRIdG1sKCRqcyk7CiAgICAgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKCRwcm9jZXNzSWQpOwogICAgfQoKCWZ1bmN0aW9uIHJ1bigkb2JqZWN0TmFtZSwgJHBhcmFtcz1hcnJheSgpLCAkX19GSUxFX189IiIpCgl7CiAgICAgICAgLy9pZiAoJHBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0gIT09IGZhbHNlKQogICAgICAgIC8vICAgICRwYXJhbXNbInJ1bkluQmFja2dyb3VuZCJdID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgJFByb2Nlc3MgPSBjcmVhdGVPYmplY3QoJG9iamVjdE5hbWUpOwoJCWlmICgkUHJvY2VzcykKCQl7CgkJCSRQcm9jZXNzLT5NYW5hZ2VyID0gJHRoaXM7CgkJCS8vdmFyX2R1bXAoMSk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgJHByb2Nlc3NJZCA9ICRQcm9jZXNzLT5jcmVhdGUoJHBhcmFtcyk7CgogICAgICAgICAgICAvL19zZXNzaW9uX3N0YXJ0KCk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJF9TRVNTSU9OKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY291bnQoJHBhcmFtcykgJiYgaXNTaW1wbGVBcnJheSgkcGFyYW1zKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJF9SRVFVRVNUWyJydW5JbkJhY2tncm91bmQiXSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV1bInJ1bkluQmFja2dyb3VuZCJdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWlzc2V0KCRwYXJhbXNbJGtleV1bInJ1bkluQmFja2dyb3VuZCJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1ska2V5XVsicnVuSW5CYWNrZ3JvdW5kIl0gPSB0cnVlOwogICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICghJHBhcmFtc1ska2V5XVsicnVuSW5CYWNrZ3JvdW5kIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV1bImNhdGNoRmF0YWxFcnJvcnMiXSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoISRwYXJhbXNbJGtleV1bImxhbmd1YWdlIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXNbJGtleV1bImxhbmd1YWdlIl0gPSBnZXRMYW5ndWFnZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJF9SRVFVRVNUWyJydW5JbkJhY2tncm91bmQiXSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc3NldCgkcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSkpCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1sicnVuSW5CYWNrZ3JvdW5kIl0gPSB0cnVlOwogICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSkKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJjYXRjaEZhdGFsRXJyb3JzIl0gPSBmYWxzZTsKCiAgICAgICAgICAgICAgICBpZiAoISRwYXJhbXNbImxhbmd1YWdlIl0pCiAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1sibGFuZ3VhZ2UiXSA9IGdldExhbmd1YWdlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8kdGhpcy0+cHJvY2Vzc1VybCA9IHBhcnNlTGluayhBSkFYRklMRU5BTUUuIj9pbmNsdWRlQ29yZT10cnVlJmFqYXhWaWV3VHlwZT12dFByb2Nlc3MmcmV0dXJuVHlwZT1ydFZhbHVlJnByb2Nlc3NJZD0iLiRwcm9jZXNzSWQuIiZzaWQ9Ii5zZXNzaW9uX2lkKCkuIiZjYXRjaEZhdGFsRXJyb3JzPSIuJHBhcmFtc1siY2F0Y2hGYXRhbEVycm9ycyJdLiImbGFuZ3VhZ2U9Ii4kcGFyYW1zWyJsYW5ndWFnZSJdLiImc2VydmVyVXJsPSIudXJsZW5jb2RlKFBST0pFQ1RVUkwpLiImIi5nZXRQYXJhbXNBc0xpbmsoJHBhcmFtc1siX0dFVCJdKSk7CiAgICAgICAgICAgIC8vJHRoaXMtPnByb2Nlc3NVcmwgPSBwYXJzZUxpbmsoUFJPSkVDVFVSTC4iYWpheC5waHA/aW5jbHVkZUNvcmU9dHJ1ZSZhamF4Vmlld1R5cGU9dnRQcm9jZXNzJnJldHVyblR5cGU9cnRWYWx1ZSZwcm9jZXNzSWQ9Ii4kcHJvY2Vzc0lkLiImc2lkPSIuc2Vzc2lvbl9pZCgpLiImY2F0Y2hGYXRhbEVycm9ycz0iLiRwYXJhbXNbImNhdGNoRmF0YWxFcnJvcnMiXS4iJmxhbmd1YWdlPSIuJHBhcmFtc1sibGFuZ3VhZ2UiXS4iJnNlcnZlclVybD0iLnVybGVuY29kZShQUk9KRUNUVVJMKS4iJiIuZ2V0UGFyYW1zQXNMaW5rKCRwYXJhbXNbIl9HRVQiXSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zKTtleGl0OwogICAgICAgICAgICBpZiAoJF9SRVFVRVNUWyJkZWJ1Z1Byb2Nlc3MiXSA9PSAidHJ1ZSIgfHwgc3RycG9zKCRfU0VSVkVSWyJIVFRQX1JFRkVSRVIiXSwgImRlYnVnUHJvY2Vzcz10cnVlIikgIT09IEZBTFNFIHx8IHN0cnBvcygkX0NPT0tJRVsiUHJvY2Vzc2VzUEhQRGVidWdQYW5lbCJdLCAiXCJ2aXNpYmxlXCI6dHJ1ZSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICRwYXJhbXNbIl9HRVQiXVsiZGVidWdQcm9jZXNzIl0gPSAidHJ1ZSI7CiAgICAgICAgICAgIGlmICgkcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICAkcGFyYW1zWyJfR0VUIl1bInJ1bkluQmFja2dyb3VuZCJdID0gImZhbHNlIjsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5wcm9jZXNzVXJsID0gcGFyc2VMaW5rKHN0cl9yZXBsYWNlKCJodHRwczovLyIsICJodHRwOi8vIiwgUFJPSkVDVFVSTCkuQUpBWEZJTEVOQU1FLiI/aW5jbHVkZUNvcmU9dHJ1ZSZhamF4Vmlld1R5cGU9dnRQcm9jZXNzJnJldHVyblR5cGU9cnRWYWx1ZSZwcm9jZXNzSWQ9Ii4kcHJvY2Vzc0lkLiImc2lkPSIuc2Vzc2lvbl9pZCgpLiImY2F0Y2hGYXRhbEVycm9ycz0iLiRwYXJhbXNbImNhdGNoRmF0YWxFcnJvcnMiXS4iJmxhbmd1YWdlPSIuJHBhcmFtc1sibGFuZ3VhZ2UiXS4iJnZwaHA9MiZzZXJ2ZXJVcmw9Ii51cmxlbmNvZGUoUFJPSkVDVFVSTCkuIiYiLmdldFBhcmFtc0FzTGluaygkcGFyYW1zWyJfR0VUIl0pKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIE1VU1QgQkUgQkVGT1JFIFJVTk5JTkcgSU4gQkFDS0dST1VORCEhISEKICAgICAgICAgICAgJHRoaXMtPnNhdmVQcm9jZXNzKCRQcm9jZXNzKTsKCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgICRwcm9jZXNzSWQgPSAkdGhpcy0+X3J1blVybCgkcHJvY2Vzc0lkLCAkdGhpcy0+cHJvY2Vzc1VybCwgJHBhcmFtcyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2V4aXQ7CgoJCQlyZXR1cm4oJHByb2Nlc3NJZCk7CgkJfQoJCWVsc2UKCQl7CgkJCWVjaG8gIlByb2Nlc3MgJyRvYmplY3ROYW1lJyBub3QgZm91bmQiOwoJCQlleGl0OwoJCX0KCX0KICAgIAogICAgZnVuY3Rpb24gY3JlYXRlKCRvYmplY3ROYW1lLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgLy8kcGFyYW1zWyJydW5JbkJhY2tncm91bmQiXSA9ICJmYWxzZSI7CiAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zKTsKICAgICAgICByZXR1cm4oJHRoaXMtPnJ1bigkb2JqZWN0TmFtZSwgJHBhcmFtcykpOwogICAgfQoKCWZ1bmN0aW9uIHN0YXJ0KCRwcm9jZXNzSWQpCgl7CiAgICAgICAgJFByb2Nlc3MgPSAkdGhpcy0+bG9hZFByb2Nlc3MoJHByb2Nlc3NJZCk7CiAgICAgICAgLy9lY2hvICJZIjtleGl0OwogICAgICAgIC8vdmFyX2R1bXAoJFByb2Nlc3MtPnBhcmFtcyk7CgogICAgICAgIGdsb2JhbCAkTWFpblByb2Nlc3M7CiAgICAgICAgJE1haW5Qcm9jZXNzID0gJFByb2Nlc3M7CiAgICAgICAgJFByb2Nlc3MtPk1hbmFnZXIgPSAkdGhpczsKICAgICAgICAkUHJvY2Vzcy0+cnVuKCk7Cgl9CgkKCWZ1bmN0aW9uIHNhdmVQcm9jZXNzKCRQcm9jZXNzKQoJewoJCS8vaWYgKGdldE9iamVjdCgiU2V0dGluZ3MiKS0+Y2FjaGVPYmplY3RzICE9ICJ0cnVlIikKCQkvL3sKCQkvLwlzaG93TWVzc2FnZSgiVG8gZW5hYmxlIFZpc3VhbENNUyBpbm5lciBwcm9jZXNzZXMgb2JqZWN0IGNhY2hlIG11c3QgYmUgZW5hYmxlZC4iLCBtdEVycm9yKTsKCQkvLwlyZXR1cm47CgkJLy99CgkJJHByb2Nlc3NJZCA9ICRQcm9jZXNzLT5pZDsKICAgICAgICAkY2FjaGVJZCA9ICRQcm9jZXNzLT5pZDsKCQkKCQkkUHJvY2Vzcy0+TWFuYWdlciA9IE5VTEw7CiAgICAgICAgCiAgICAgICAgJGlnbm9yZWRTZXJpYWxpemUgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJFByb2Nlc3MtPmlnbm9yZWRTZXJpYWxpemVQcm9wZXJ0aWVzIGFzICRuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgJGlnbm9yZWRTZXJpYWxpemVbJG5hbWVdID0gJFByb2Nlc3MtPiRuYW1lOwogICAgICAgICAgICAkUHJvY2Vzcy0+JG5hbWUgPSBOVUxMOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkbWVtb3J5ID0gZ2V0TWVtb3J5VXNhZ2UodHJ1ZSk7CiAgICAgICAgJGRhdGEgPSBzZXJpYWxpemUoJFByb2Nlc3MpOwogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnN0b3JhZ2VUeXBlKTsKICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5zdG9yYWdlUGF0aCk7CiAgICAgICAgLy92YXJfZHVtcCgkZGF0YSk7IGV4aXQ7CiAgICAgICAgaWYgKCR0aGlzLT5zdG9yYWdlVHlwZSA9PSAic3REYXRhYmFzZSIpCiAgICAgICAgewogICAgICAgICAgICAvL19maWxlX3B1dF9jb250ZW50cygkdGhpcy0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHByb2Nlc3NJZC4iLm9iamVjdC5jYWNoZSIsICRkYXRhLCBDSE1PRF9GSUxFX0RFRkFVTFQsIHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgJG1heCA9IDU7CiAgICAgICAgICAgIGZvciAoJGkgPSAxIDsgJGkgPD0gJG1heCA7ICRpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdGhpcy0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHByb2Nlc3NJZC4iLm9iamVjdC5jYWNoZSIsICRkYXRhLCBDSE1PRF9GSUxFX0RFRkFVTFQsIHRydWUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoX2ZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kcHJvY2Vzc0lkLiIub2JqZWN0LmNhY2hlIikgIT0gJGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpID09ICRtYXgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJQcm9jZXNzIGZpbGUgbm90IHNhdmVkLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8aHI+IjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoX2ZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kcHJvY2Vzc0lkLiIub2JqZWN0LmNhY2hlIikpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnN0b3JhZ2VQYXRoLiIvcHJvY2Vzcy4iLiRwcm9jZXNzSWQuIi5vYmplY3QuY2FjaGUiKSAhPSAkZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiUHJvY2VzcyBmaWxlIG5vdCBzYXZlZC4uLiI7CiAgICAgICAgICAgICAgICAvL3Nob3dNZXNzYWdlKCJQcm9jZXNzIGZpbGUgbm90IHNhdmVkLi4uIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAvLyR4MSA9ICRkYXRhOwogICAgICAgICAgICAgICAgLy8keDIgPSBfZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnN0b3JhZ2VQYXRoLiIvcHJvY2Vzcy4iLiRwcm9jZXNzSWQuIi5vYmplY3QuY2FjaGUiKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHgxKTsKICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR4Mik7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR4MSA9PSAkeDIpOwogICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgdmFyX2R1bXAoJGRhdGEpOwogICAgICAgICAgICAgICAgZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICB2YXJfZHVtcChfZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnN0b3JhZ2VQYXRoLiIvcHJvY2Vzcy4iLiRwcm9jZXNzSWQuIi5vYmplY3QuY2FjaGUiKSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZWNobyAiT0siOwogICAgICAgICAgICAvL2V4aXQ7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR0aGlzLT5zdG9yYWdlVHlwZSA9PSAic3RTZXNzaW9uIikKICAgICAgICB7CiAgICAgICAgICAgIF9zZXNzaW9uX3N0YXJ0KCk7CiAgICAgICAgICAgICRfU0VTU0lPTlsiUHJvY2Vzc01hbmFnZXIiXVskcHJvY2Vzc0lkXVsib2JqZWN0Il0gPSAkZGF0YTsKICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPnN0b3JhZ2VUeXBlID09ICJzdEZpbGUiKQogICAgICAgIHsKICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kcHJvY2Vzc0lkLiIub2JqZWN0LmNhY2hlIiwgJGRhdGEpOwogICAgICAgICAgICBpZiAoIV9maWxlX2dldF9jb250ZW50cygkdGhpcy0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHByb2Nlc3NJZC4iLm9iamVjdC5jYWNoZSIpICE9ICRkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiUHJvY2VzcyBmaWxlIG5vdCBzYXZlZC4uLiIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUHJvY2Vzcy0+c2F2ZU1lbW9yeSA9IGdldE1lbW9yeVVzYWdlKHRydWUpLSRtZW1vcnk7CiAgICAgICAgLy92YXJfZHVtcCgkUHJvY2Vzcy0+c2F2ZU1lbW9yeSk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkUHJvY2Vzcy0+aWdub3JlZFNlcmlhbGl6ZVByb3BlcnRpZXMgYXMgJG5hbWUpCiAgICAgICAgewogICAgICAgICAgICAkUHJvY2Vzcy0+JG5hbWUgPSAkaWdub3JlZFNlcmlhbGl6ZVskbmFtZV07CiAgICAgICAgfQoKICAgICAgICAvL3NhdmVUb0NhY2hlKCJwcm9jZXNzZXMiLCAiUHJvY2Vzcy4iLiRjYWNoZUlkLCAkUHJvY2VzcywgImZpbGUiLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgLy9lY2hvICIxIjsKICAgICAgICAvL2V4aXQ7CgkJCgkJJFByb2Nlc3MtPk1hbmFnZXIgPSAkdGhpczsKCX0KCQoJZnVuY3Rpb24gbG9hZFByb2Nlc3MoJHByb2Nlc3NJZCkKCXsKCQkkY2FjaGVJZCA9ICRwcm9jZXNzSWQ7CgkJCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoJHRoaXMtPnN0b3JhZ2VUeXBlID09ICJzdERhdGFiYXNlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlY29yZCA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKS0+Z2V0UmVjb3JkKCJpZD0iLiRwcm9jZXNzSWQpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8kUHJvY2VzcyA9IGdldE9iamVjdCgiQ2FjaGUiKS0+bG9hZE9iamVjdCgiUHJvY2Vzcy4iLiRjYWNoZUlkKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnN0b3JhZ2VQYXRoLiIvcHJvY2Vzcy4iLiRwcm9jZXNzSWQuIi5vYmplY3QuY2FjaGUiKSk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IDMgOyAkaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQcm9jZXNzID0gdW5zZXJpYWxpemUoQGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kcHJvY2Vzc0lkLiIub2JqZWN0LmNhY2hlIikpOwogICAgICAgICAgICAgICAgICAgIGlmICgkUHJvY2VzcykKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNsZWVwKDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICRQcm9jZXNzID0gdW5zZXJpYWxpemUoQGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kcHJvY2Vzc0lkLiIub2JqZWN0LmNhY2hlIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT5zdG9yYWdlVHlwZSA9PSAic3RTZXNzaW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3Nlc3Npb25fc3RhcnQoKTsKICAgICAgICAgICAgICAgICRyZWNvcmQgPSAkX1NFU1NJT05bIlByb2Nlc3NNYW5hZ2VyIl1bJHByb2Nlc3NJZF1bInJlY29yZCJdOwogICAgICAgICAgICAgICAgJFByb2Nlc3MgPSB1bnNlcmlhbGl6ZSgkX1NFU1NJT05bIlByb2Nlc3NNYW5hZ2VyIl1bJHByb2Nlc3NJZF1bIm9iamVjdCJdKTsKICAgICAgICAgICAgICAgIF9zZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPnN0b3JhZ2VUeXBlID09ICJzdEZpbGUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVjb3JkID0gdW5zZXJpYWxpemUoQGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdG9yYWdlUGF0aC4iL3Byb2Nlc3MuIi4kcHJvY2Vzc0lkLiIucmVjb3JkLmNhY2hlIikpOwogICAgICAgICAgICAgICAgJFByb2Nlc3MgPSB1bnNlcmlhbGl6ZShAZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnN0b3JhZ2VQYXRoLiIvcHJvY2Vzcy4iLiRwcm9jZXNzSWQuIi5vYmplY3QuY2FjaGUiKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2goRXhjZXB0aW9uICRlKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyAiVW5hYmxlIHRvIHVuc2VyaWFsaXplIHByb2Nlc3MiOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KCiAgICAgICAgLy92YXJfZHVtcCgkUHJvY2Vzcyk7CiAgICAgICAgaWYgKCRyZWNvcmRbIm1heEV4ZWN1dGlvblRpbWUiXSkKICAgICAgICAgICAgc2V0VGltZW91dCgoaW50KSRyZWNvcmRbIm1heEV4ZWN1dGlvblRpbWUiXSk7CiAgICAgICAgaWYgKCRyZWNvcmRbIm1lbW9yeUxpbWl0Il0pCiAgICAgICAgICAgIHNldE1lbW9yeUxpbWl0KChpbnQpJHJlY29yZFsibWVtb3J5TGltaXQiXSk7CiAgICAgICAgCgkJLy8kUHJvY2VzcyA9IGxvYWRGcm9tQ2FjaGUoInByb2Nlc3NlcyIsICJQcm9jZXNzLiIuJGNhY2hlSWQsICJmaWxlIiwgZmFsc2UsIHRydWUpOwoJCWlmICgkUHJvY2VzcykKCQl7CgkJCWlmICgkX1JFUVVFU1RbInBhcmFtcyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNTaW1wbGVBcnJheSgkUHJvY2Vzcy0+cGFyYW1zKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRQcm9jZXNzLT5wYXJhbXMgYXMgJGtleSA9PiAkdmFsKQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfUkVRVUVTVFsicGFyYW1zIl0gYXMgJHBhcmFtTmFtZSA9PiAkcGFyYW1WYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQcm9jZXNzLT5wYXJhbXNbJGtleV1bJHBhcmFtTmFtZV0gPSAkcGFyYW1WYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfUkVRVUVTVFsicGFyYW1zIl0gYXMgJHBhcmFtTmFtZSA9PiAkcGFyYW1WYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgJFByb2Nlc3MtPnBhcmFtc1skcGFyYW1OYW1lXSA9ICRwYXJhbVZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkUHJvY2Vzcy0+TWFuYWdlciA9ICR0aGlzOwoJCQoJCQlnbG9iYWwgJE1haW5Qcm9jZXNzOwoJCQkkTWFpblByb2Nlc3MgPSAkUHJvY2VzczsKCQl9CgkJZWxzZSAKCQl7CiAgICAgICAgICAgIC8vX2ZpbGVfYXBwZW5kX2NvbnRlbnRzKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAvcHJvY2Vzcy5vdXQiLCAiVFByb2Nlc3NNYW5hZ2VyOjpsb2FkUHJvY2VzcygpIGVycm9yXHJcbiIpOwoJCQlzaG93TWVzc2FnZSgiUHJvY2VzcyBpZCAnJHByb2Nlc3NJZCcgbm90IGZvdW5kLiIsIG10RXJyb3IpOwoJCQlleGl0OwoJCX0KCQlyZXR1cm4oJFByb2Nlc3MpOwoJfQogICAgCiAgICBmdW5jdGlvbiBjbGVhclByb2Nlc3MoJHByb2Nlc3NJZCkKICAgIHsKICAgICAgICAkY2FjaGVJZCA9ICRwcm9jZXNzSWQ7CiAgICAgICAgCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoJHRoaXMtPnN0b3JhZ2VUeXBlID09ICJzdERhdGFiYXNlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3VubGluaygkdGhpcy0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHByb2Nlc3NJZC4iLm9iamVjdC5jYWNoZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT5zdG9yYWdlVHlwZSA9PSAic3RTZXNzaW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3Nlc3Npb25fc3RhcnQoKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRfU0VTU0lPTlsiUHJvY2Vzc01hbmFnZXIiXVskcHJvY2Vzc0lkXVsib2JqZWN0Il0pOwogICAgICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkdGhpcy0+c3RvcmFnZVR5cGUgPT0gInN0RmlsZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF91bmxpbmsoJHRoaXMtPnN0b3JhZ2VQYXRoLiIvcHJvY2Vzcy4iLiRwcm9jZXNzSWQuIi5vYmplY3QuY2FjaGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaChFeGNlcHRpb24gJGUpCiAgICAgICAgewogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBydW5JbkJhY2tncm91bmQoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgICRwYXJhbXNbInJ1bkluQmFja2dyb3VuZCJdID0gInRydWUiOwogICAgICAgIAogICAgICAgIAogICAgICAgICR0aGlzLT5ydW4oc3RyX3JlcGxhY2UoIk1hbmFnZXIiLCAiIiwgJHRoaXMtPm5hbWUpLCAkcGFyYW1zKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gc3RhcnRQYXJlbnRUaHJlYWQoJHByb2Nlc3NJZCkKICAgIHsKICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHJ1bnMgYW5vdGhlciB0aHJlYWQsIGJ1dCBjYXRjaGVzIGl0J3Mgb3V0cHV0ICh0aGUgb25seSB3YXkgdG8gY2F0Y2ggZmF0YWwgZXJyb3JzKQogICAgICAgICRwYXJhbXMgPSAkX1JFUVVFU1Q7CiAgICAgICAgdW5zZXQoJHBhcmFtc1siY2F0Y2hGYXRhbEVycm9ycyJdKTsKCiAgICAgICAgJHVybFBhcmFtcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRuYW1lID0+ICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICR1cmxQYXJhbXNbXSA9ICRuYW1lLiI9Ii4kdmFsdWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR1cmwgPSBzdHJfcmVwbGFjZSgiaHR0cHM6Ly8iLCAiaHR0cDovLyIsIFBST0pFQ1RVUkwpLiIvIi5BSkFYRklMRU5BTUUuIj8iLmltcGxvZGUoIiYiLCAkdXJsUGFyYW1zKTsKICAgICAgICAKICAgICAgICAkYnVmZmVyID0gZG93bmxvYWQoJHVybCwgYXJyYXkoKSwgYXJyYXkoKSwgYXJyYXkoImxvZyI9PmZhbHNlKSk7CiAgICAgICAgCiAgICAgICAgLy8gcnVuIFVSTCBhbmQgd2FpdCBmb3IgcmVzdWx0CiAgICAgICAgLyoKICAgICAgICAkY3VybCA9IGN1cmxfaW5pdCgpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwgJHVybCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9IRUFERVIsMCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9OT0JPRFksMCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT1JCSURfUkVVU0UsMSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GUkVTSF9DT05ORUNULDEpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7CiAgICAgICAgJGJ1ZmZlciA9IGN1cmxfZXhlYygkY3VybCk7CiAgICAgICAgJGVycm9yID0gY3VybF9lcnJubygkY3VybCk7CiAgICAgICAgY3VybF9jbG9zZSgkY3VybCk7CiAgICAgICAgKi8KICAgICAgICAgICAgCiAgICAgICAgJGVycm9yTWVzc2FnZXMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGlmICgkYnVmZmVyICE9ICIiICYmICRidWZmZXIgIT0gIjEiKQogICAgICAgIHsKICAgICAgICAgICAgLy9maWxlX3B1dF9jb250ZW50cyhNQUlOUEFUSC4iY2FjaGUvZXJyb3IubG9nIiwgJGJ1ZmZlcik7CiAgICAgICAgICAgICRUYWJsZSA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbImlkIl0gPSAkcHJvY2Vzc0lkOwogICAgICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJzdGF0dXMiXSA9ICJwc1N0b3BwZWQiOwogICAgICAgICAgICAvLyR1cGRhdGVSZWNvcmRWYWx1ZXNbImVycm9ycyJdID0gaW1wbG9kZSgiPGJyIC8+IiwgJGVycm9yTWVzc2FnZXMpOwogICAgICAgICAgICAkdXBkYXRlUmVjb3JkVmFsdWVzWyJlcnJvcnMiXSA9ICRidWZmZXI7CiAgICAgICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbInRpbWVVcGRhdGUiXSA9IGRhdGUoIlktbS1kIEg6aTpzIiwgdGltZSgpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRUYWJsZS0+aGlzdG9yeVR5cGUgPSAiaHROb25lIjsKICAgICAgICAgICAgJFRhYmxlLT51cGRhdGVSZWNvcmQoJHVwZGF0ZVJlY29yZFZhbHVlcywgYXJyYXkoImlkIikpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoInByb2Nlc3NlcyIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJHVwZGF0ZVJlY29yZFZhbHVlc1siaWQiXSA9ICRwcm9jZXNzSWQ7CiAgICAgICAgICAgICR1cGRhdGVSZWNvcmRWYWx1ZXNbInN0YXR1cyJdID0gInBzRmluaXNoZWQiOwoKICAgICAgICAgICAgJFRhYmxlLT5oaXN0b3J5VHlwZSA9ICJodE5vbmUiOwogICAgICAgICAgICAkVGFibGUtPnVwZGF0ZVJlY29yZCgkdXBkYXRlUmVjb3JkVmFsdWVzLCBhcnJheSgiaWQiKSk7CiAgICAgICAgfQoKICAgICAgICBleGl0OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRSZWNvcmQoJHByb2Nlc3NJZCkKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHByb2Nlc3NJZCkpCiAgICAgICAgewogICAgICAgICAgICAkcGFyYW1zID0gJHByb2Nlc3NJZDsKICAgICAgICAgICAgCiAgICAgICAgICAgICRwcm9jZXNzSWQgPSAkcGFyYW1zWyJwcm9jZXNzSWQiXTsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbInN0b3JhZ2VUeXBlIl0pCiAgICAgICAgICAgICAgICAkdGhpcy0+c3RvcmFnZVR5cGUgPSAkcGFyYW1zWyJzdG9yYWdlVHlwZSJdOwogICAgICAgICAgICBpZiAoJHBhcmFtc1sic3RvcmFnZVBhdGgiXSkKICAgICAgICAgICAgICAgICR0aGlzLT5zdG9yYWdlUGF0aCA9ICRwYXJhbXNbInN0b3JhZ2VQYXRoIl07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+c3RvcmFnZVR5cGUgPT0gInN0RGF0YWJhc2UiKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9IGdldFRhYmxlKCJwcm9jZXNzZXMiKS0+Z2V0UmVjb3JkKCJpZD0iLiRwcm9jZXNzSWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdGhpcy0+c3RvcmFnZVR5cGUgPT0gInN0U2Vzc2lvbiIpCiAgICAgICAgewogICAgICAgICAgICBfc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICAkcmVjb3JkID0gJF9TRVNTSU9OWyJQcm9jZXNzTWFuYWdlciJdWyRwcm9jZXNzSWRdWyJyZWNvcmQiXTsKICAgICAgICAgICAgX3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHRoaXMtPnN0b3JhZ2VUeXBlID09ICJzdEZpbGUiKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9IHVuc2VyaWFsaXplKEBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+c3RvcmFnZVBhdGguIi9wcm9jZXNzLiIuJHByb2Nlc3NJZC4iLnJlY29yZC5jYWNoZSIpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJHJlY29yZCkpCiAgICAgICAgICAgICAgICAkcmVjb3JkID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRyZWNvcmQpOwogICAgfQoKICAgIAogICAgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3MoJHByb2Nlc3NJZCkKICAgIHsKICAgICAgICAkcmVjb3JkID0gJHRoaXMtPmdldFJlY29yZCgkcHJvY2Vzc0lkKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHJlY29yZFsicHJvZ3Jlc3MiXSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFByb2dyZXNzVGV4dCgkcHJvY2Vzc0lkKQogICAgewogICAgICAgICRyZWNvcmQgPSAkdGhpcy0+Z2V0UmVjb3JkKCRwcm9jZXNzSWQpOwogICAgICAgIAogICAgICAgIHJldHVybigkcmVjb3JkWyJwcm9ncmVzc1RleHQiXSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldEVycm9ycygkcHJvY2Vzc0lkKQogICAgewogICAgICAgICRyZWNvcmQgPSAkdGhpcy0+Z2V0UmVjb3JkKCRwcm9jZXNzSWQpOwogICAgICAgIAogICAgICAgIHJldHVybigkcmVjb3JkWyJlcnJvcnMiXSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0UHJvY2Vzc0luZm8oJHByb2Nlc3NJZCkKICAgIHsKICAgICAgICAkcmVjb3JkID0gJHRoaXMtPmdldFJlY29yZCgkcHJvY2Vzc0lkKTsKCiAgICAgICAgcmV0dXJuKCRyZWNvcmQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFNpZ25hbCgkcHJvY2Vzc0lkLCAkc2lnbmFsKQogICAgewogICAgICAgICRyZWNvcmQgPSAkdGhpcy0+Z2V0UmVjb3JkKCRwcm9jZXNzSWQpOwogICAgICAgIGlmICgkcmVjb3JkKQogICAgICAgIHsKICAgICAgICAgICAgZ2V0VGFibGUoInByb2Nlc3NlcyIpLT51cGRhdGVSYXdSZWNvcmQoYXJyYXkoImlkIj0+JHJlY29yZFsiaWQiXSwgInNpZ25hbCI9PiRzaWduYWwpKTsKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc3VtZSgkcHJvY2Vzc0lkKQogICAgewogICAgICAgICRyZWNvcmQgPSAkdGhpcy0+Z2V0UmVjb3JkKCRwcm9jZXNzSWQpOwogICAgICAgIGlmICgkcmVjb3JkWyJyZXN1bWVVcmwiXSkKICAgICAgICB7CiAgICAgICAgICAgIGdldFRhYmxlKCJwcm9jZXNzZXMiKS0+dXBkYXRlUmF3UmVjb3JkKGFycmF5KCJpZCI9PiRyZWNvcmRbImlkIl0sICJzaWduYWwiPT4iIiwgInN0YXR1cyI9PiJwc1J1bm5pbmciKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcHJvY2Vzc0lkID0gJHRoaXMtPl9ydW5VcmwoJHByb2Nlc3NJZCwgJHJlY29yZFsicmVzdW1lVXJsIl0pOwogICAgICAgICAgICByZXR1cm4oJHByb2Nlc3NJZCAhPSAiIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KfQoKLyoKaWYgKCRmaWxlTmFtZSA9PSAiYWpheC5waHAiICYmICRfUkVRVUVTVFsiYWpheFR5cGUiXSA9PSAicHJvY2Vzc01hbmFnZXIiKQp7CglpbmNsdWRlX29uY2UoInNob3cuaW5pLnBocCIpOwkKCQoJJFByb2Nlc3NNYW5hZ2VyID0gbmV3IFRQcm9jZXNzTWFuYWdlcigpOwoJZXhpdDsKfQoqLwoKZnVuY3Rpb24gVVVJRCgpCnsKICAgIGZ1bmN0aW9uIGdldEludGVnZXJCaXRzKHZhbCxzdGFydCxlbmQpCiAgICB7CiAgICAgICAgdmFyIGJhc2UxNiA9IHJldHVybkJhc2UodmFsLDE2KTsKICAgICAgICB2YXIgcXVhZEFycmF5ID0gbmV3IEFycmF5KCk7CiAgICAgICAgdmFyIHF1YWRTdHJpbmcgPSAnJzsKICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgZm9yKGk9MDtpPGJhc2UxNi5sZW5ndGg7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgcXVhZEFycmF5LnB1c2goYmFzZTE2LnN1YnN0cmluZyhpLGkrMSkpOyAgICAKICAgICAgICB9CiAgICAgICAgZm9yKGk9TWF0aC5mbG9vcihzdGFydC80KTtpPD1NYXRoLmZsb29yKGVuZC80KTtpKyspCiAgICAgICAgewogICAgICAgICAgICBpZighcXVhZEFycmF5W2ldIHx8IHF1YWRBcnJheVtpXSA9PSAnJykgCiAgICAgICAgICAgICAgICBxdWFkU3RyaW5nICs9ICcwJzsKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgIHF1YWRTdHJpbmcgKz0gcXVhZEFycmF5W2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcXVhZFN0cmluZzsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRJbnRlZ2VyQml0cyh2YWwsc3RhcnQsZW5kKQogICAgewogICAgICAgIHZhciBiYXNlMTYgPSByZXR1cm5CYXNlKHZhbCwxNik7CiAgICAgICAgdmFyIHF1YWRBcnJheSA9IG5ldyBBcnJheSgpOwogICAgICAgIHZhciBxdWFkU3RyaW5nID0gJyc7CiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIGZvcihpPTA7aTxiYXNlMTYubGVuZ3RoO2krKykKICAgICAgICB7CiAgICAgICAgICAgIHF1YWRBcnJheS5wdXNoKGJhc2UxNi5zdWJzdHJpbmcoaSxpKzEpKTsgICAgCiAgICAgICAgfQogICAgICAgIGZvcihpPU1hdGguZmxvb3Ioc3RhcnQvNCk7aTw9TWF0aC5mbG9vcihlbmQvNCk7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIXF1YWRBcnJheVtpXSB8fCBxdWFkQXJyYXlbaV0gPT0gJycpIAogICAgICAgICAgICAgICAgcXVhZFN0cmluZyArPSAnMCc7CiAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICBxdWFkU3RyaW5nICs9IHF1YWRBcnJheVtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHF1YWRTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gcmV0dXJuQmFzZShudW1iZXIsIGJhc2UpCiAgICB7CiAgICAgICAgdmFyIGNvbnZlcnQgPSBbJzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCcsJ0knLCdKJywnSycsJ0wnLCdNJywnTicsJ08nLCdQJywnUScsJ1InLCdTJywnVCcsJ1UnLCdWJywnVycsJ1gnLCdZJywnWiddOwogICAgICAgIGlmIChudW1iZXIgPCBiYXNlKSAKICAgICAgICAgICAgdmFyIG91dHB1dCA9IGNvbnZlcnRbbnVtYmVyXTsKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIE1TRCA9ICcnICsgTWF0aC5mbG9vcihudW1iZXIgLyBiYXNlKTsKICAgICAgICAgICAgdmFyIExTRCA9IG51bWJlciAtIE1TRCpiYXNlOwogICAgICAgICAgICBpZiAoTVNEID49IGJhc2UpIHZhciBvdXRwdXQgPSByZXR1cm5CYXNlKE1TRCxiYXNlKSArIGNvbnZlcnRbTFNEXTsKICAgICAgICAgICAgZWxzZSB2YXIgb3V0cHV0ID0gY29udmVydFtNU0RdICsgY29udmVydFtMU0RdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgfQoKICAgIGZ1bmN0aW9uIHJhbmQobWF4KQogICAgewogICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpOwogICAgfQoKICAgIHZhciBkZyA9IG5ldyBEYXRlKDE1ODIsIDEwLCAxNSwgMCwgMCwgMCwgMCk7CiAgICB2YXIgZGMgPSBuZXcgRGF0ZSgpOwogICAgdmFyIHQgPSBkYy5nZXRUaW1lKCkgLSBkZy5nZXRUaW1lKCk7CiAgICB2YXIgaCA9ICctJzsKICAgIHZhciB0bCA9IGdldEludGVnZXJCaXRzKHQsMCwzMSk7CiAgICB2YXIgdG0gPSBnZXRJbnRlZ2VyQml0cyh0LDMyLDQ3KTsKICAgIHZhciB0aHYgPSBnZXRJbnRlZ2VyQml0cyh0LDQ4LDU5KSArICcxJzsgLy8gdmVyc2lvbiAxLCBzZWN1cml0eSB2ZXJzaW9uIGlzIDIKICAgIHZhciBjc2FyID0gZ2V0SW50ZWdlckJpdHMocmFuZCg0MDk1KSwwLDcpOwogICAgdmFyIGNzbCA9IGdldEludGVnZXJCaXRzKHJhbmQoNDA5NSksMCw3KTsKCiAgICB2YXIgbiA9IGdldEludGVnZXJCaXRzKHJhbmQoODE5MSksMCw3KSArIAogICAgICAgICAgICBnZXRJbnRlZ2VyQml0cyhyYW5kKDgxOTEpLDgsMTUpICsgCiAgICAgICAgICAgIGdldEludGVnZXJCaXRzKHJhbmQoODE5MSksMCw3KSArIAogICAgICAgICAgICBnZXRJbnRlZ2VyQml0cyhyYW5kKDgxOTEpLDgsMTUpICsgCiAgICAgICAgICAgIGdldEludGVnZXJCaXRzKHJhbmQoODE5MSksMCwxNSk7IC8vIHRoaXMgbGFzdCBudW1iZXIgaXMgdHdvIG9jdGV0cyBsb25nCgogICAgdmFyIHJldCA9IHRsICsgaCArIHRtICsgaCArIHRodiArIGggKyBjc2FyICsgY3NsICsgaCArIG47CiAgICAKICAgIHJldHVybiByZXQudG9Mb3dlckNhc2UoKTsgCn0KCmZ1bmN0aW9uIGNyZWF0ZVVVSUQoKQp7CiAgICByZXR1cm4oVVVJRCgpKTsKfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvVVVJRC9VVUlELmNsYXNzLnBocCAtLS0tLS0tIA0KCmlmICghQUpBWCkKICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9VVUlEL1VVSUQuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7CgpjbGFzcyBUVVVJRCBleHRlbmRzIFRDb3JlT2JqZWN0CnsKICAgIAp9CgpmdW5jdGlvbiBVVUlEKCkKewogICAgJHJhd2lkID0gc3RydG91cHBlcihtZDUodW5pcWlkKHJhbmQoKSwgdHJ1ZSkpKTsKICAgICR3b3JraWQgPSAkcmF3aWQ7CgogICAgJGJ5dGUgPSBoZXhkZWMoIHN1YnN0cigkd29ya2lkLDEyLDIpICk7CiAgICAkYnl0ZSA9ICRieXRlICYgaGV4ZGVjKCIwZiIpOwogICAgJGJ5dGUgPSAkYnl0ZSB8IGhleGRlYygiNDAiKTsKICAgICR3b3JraWQgPSBzdWJzdHJfcmVwbGFjZSgkd29ya2lkLCBzdHJ0b3VwcGVyKGRlY2hleCgkYnl0ZSkpLCAxMiwgMik7CgogICAgJGJ5dGUgPSBoZXhkZWMoIHN1YnN0cigkd29ya2lkLDE2LDIpICk7CiAgICAkYnl0ZSA9ICRieXRlICYgaGV4ZGVjKCIzZiIpOwogICAgJGJ5dGUgPSAkYnl0ZSB8IGhleGRlYygiODAiKTsKICAgICR3b3JraWQgPSBzdWJzdHJfcmVwbGFjZSgkd29ya2lkLCBzdHJ0b3VwcGVyKGRlY2hleCgkYnl0ZSkpLCAxNiwgMik7CgogICAgJHJpZCA9IHN1YnN0cigkcmF3aWQsIDAsIDgpLiItIgogICAgICAgIC5zdWJzdHIoJHJhd2lkLCA4LCA0KS4iLSIKICAgICAgICAuc3Vic3RyKCRyYXdpZCwxMiwgNCkuIi0iCiAgICAgICAgLnN1YnN0cigkcmF3aWQsMTYsIDQpLiItIgogICAgICAgIC5zdWJzdHIoJHJhd2lkLDIwLDEyKTsKCiAgICAkd2lkID0gc3Vic3RyKCR3b3JraWQsIDAsIDgpLiItIgogICAgICAgIC5zdWJzdHIoJHdvcmtpZCwgOCwgNCkuIi0iCiAgICAgICAgLnN1YnN0cigkd29ya2lkLDEyLCA0KS4iLSIKICAgICAgICAuc3Vic3RyKCR3b3JraWQsMTYsIDQpLiItIgogICAgICAgIC5zdWJzdHIoJHdvcmtpZCwyMCwxMik7CgogICAgcmV0dXJuKHN0cnRvbG93ZXIoJHdpZCkpOwp9CgpmdW5jdGlvbiBjcmVhdGVVVUlEKCkKewogICAgZHVtcCgiY3JlYXRlVVVJRCgpIGlzIG5vdyBkZXByZWNhdGVkIik7CiAgICByZXR1cm4oVVVJRCgpKTsKfQoKZnVuY3Rpb24gaXNVVUlEKCRzdHIpCnsKICAgIGlmICghaXNfc3RyaW5nKCRzdHIpKQogICAgewogICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9ICAgIAoKICAgIC8vIHZyYWNpIHZhbGlkbmkgVVVJRCwgYWxlIG15U1FMIG5lYm8gUEhQIG5lZ2VuZXJ1amkgdmFsaWRuaSBVVUlELCB0YWt6ZSB0byBwYWsgdnJhY2kgRkFMU0UKICAgIC8vcmV0dXJuKHByZWdfbWF0Y2goIi9eWzAtOUEtRl17OH0tWzAtOUEtRl17NH0tNFswLTlBLUZdezN9LVs4OUFCXVswLTlBLUZdezN9LVswLTlBLUZdezEyfVwkL2kiLCAkc3RyKSk7CiAgICAKICAgIHJldHVybihwcmVnX21hdGNoKCIvXlswLTlBLUZdezh9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezEyfVwkL2kiLCAkc3RyKSk7CiAgICAKICAgIC8vcmV0dXJuKHN0cnBvcygkc3RyLCAiLSIpID09PSA4KTsKICAgIC8vIFRPRE8gYnkgcmVnZXhwIC0gdGhlIG9uZSBiZWxvdyBub3Qgd29ya2luZwogICAgLy9yZXR1cm4ocHJlZ19tYXRjaCgiLyhbMC05XXxbQS1GXXxbYS1mXSl7OH0tKFswLTldfFtBLUZdfFthLWZdKXs0fS0oWzAtOV18W0EtRl18W2EtZl0pezR9LShbMC05XXxbQS1GXXxbYS1mXSl7MTJ9L2kiLCAkc3RyKSk7Cn0KICAgIAogICAgCgo=ZnVuY3Rpb24gVENvbXBvbmVudChwYXJhbXMsIGlkKSAgIAp7CiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUQ29tcG9uZW50LCBUT2JqZWN0KTsKLy9hbGVydChUQ29tcG9uZW50KTsKClRDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgLy9hbGVydCgiVENvbXBvbmVudDo6Y3JlYXRlIik7CiAgICAvL2R1bXAodGhpcy5pZCk7CiAgICB0aGlzLmVsZW1lbnQgPSBnZXRFbGVtZW50KHRoaXMuaWQpOwogICAgdGhpcy5kaXNhYmxlZEV2ZW50cyA9IHt9OwogICAgCiAgICAvLyBUT0RPIC0gCiAgICBpZiAodGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudC5oYXNBdHRyaWJ1dGUoInJlcXVpcmVkIikpCiAgICB7CiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgicmVxdWlyZWQiKTsKICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJfcmVxdWlyZWQiLCAiIik7CiAgICB9CiAgICAKICAgIGlmICghdGhpcy5jb250YWluZXIpCiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmVsZW1lbnQ7CiAgICAvL2FsZXJ0KHRoaXMuaWQpOwogICAgLy9hbGVydCh0aGlzLmVsZW1lbnQpOwogICAgaWYgKHRoaXMuZWxlbWVudCkKICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmVsZW1lbnQubmFtZTsKCiAgICBpZiAodGhpcy5uYW1lICYmICF0aGlzLnBhcmFtc1sibmFtZSJdKQogICAgICAgIHRoaXMucGFyYW1zWyJuYW1lIl0gPSB0aGlzLm5hbWU7CgogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CiAgICB0aGlzLmFzc2lnbk9iamVjdFRvRWxlbWVudCgpOwogICAgCiAgICB0aGlzLmVsZW1lbnRzLnB1c2godGhpcy5lbGVtZW50IHx8IHRoaXMuY29udGFpbmVyKTsKICAgIAogICAgdGhpcy5saW5rZWRDb21wb25lbnRzID0gW107CgogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGlmICgodGhpcy5jb250YWluZXIgfHwgdGhpcy5lbGVtZW50KSAmJiAhdGhpcy5kZWZhdWx0RXZlbnRzRGlzYWJsZWQpCiAgICB7CiAgICAgICAgLy9kdW1wKHRoaXMuY29udGFpbmVyIHx8IHRoaXMuZWxlbWVudCk7CiAgICAgICAgLy8gZWxlbWVudCBtdXN0IGJlIGZpcnN0IC0gaXQgc3RvcmVzIHZhbHVlCiAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50IHx8IHRoaXMuY29udGFpbmVyLCAiY2hhbmdlIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uQ2hhbmdlKF90aGlzLmNvbnRhaW5lciA/IF90aGlzLmNvbnRhaW5lci52YWx1ZSA6IF90aGlzLmVsZW1lbnQudmFsdWUpfSk7CiAgICAgICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiRWRnZSIgJiYgdGhpcy5wYXJhbXNbImxpc3QiXSkgLy8gZm9yIGRhdGFsaXN0IG9ubHkKICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50IHx8IHRoaXMuY29udGFpbmVyLCAiaW5wdXQiLCBmdW5jdGlvbihlKXtfdGhpcy5fb25DaGFuZ2UoX3RoaXMuY29udGFpbmVyID8gX3RoaXMuY29udGFpbmVyLnZhbHVlIDogX3RoaXMuZWxlbWVudC52YWx1ZSl9KTsKICAgICAgICAKICAgICAgICBhZGRFdmVudCh0aGlzLmNvbnRhaW5lciB8fCB0aGlzLmVsZW1lbnQsICJjbGljayIsIGZ1bmN0aW9uKGUpe190aGlzLl9vbkNsaWNrKGUpfSk7CiAgICAgICAgYWRkRXZlbnQodGhpcy5jb250YWluZXIgfHwgdGhpcy5lbGVtZW50LCAiZGJsY2xpY2siLCBmdW5jdGlvbihlKXtfdGhpcy5fb25EYmxDbGljayhlKX0pOwogICAgICAgIGFkZEV2ZW50KHRoaXMuY29udGFpbmVyIHx8IHRoaXMuZWxlbWVudCwgInJjbGljayIsIGZ1bmN0aW9uKGUpe190aGlzLl9vblJDbGljayhlKTt9KTsKCiAgICAgICAvLyBkdW1wKHRoaXMuaWQpOwogICAgICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgCiAgICAgICAgYWRkRXZlbnQodGhpcy5jb250YWluZXIgfHwgdGhpcy5lbGVtZW50LCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uTW91c2VEb3duKGUpfSk7CiAgICAgICAgYWRkRXZlbnQodGhpcy5jb250YWluZXIgfHwgdGhpcy5lbGVtZW50LCAibW91c2V1cCIsIGZ1bmN0aW9uKGUpe190aGlzLl9vbk1vdXNlVXAoZSl9KTsKCiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkKICAgICAgICB7CiAgICAgICAgICAgIGFkZEV2ZW50KHRoaXMuZWxlbWVudCwgImtleWRvd24iLCBmdW5jdGlvbihlKXtfdGhpcy5fb25LZXlEb3duKGUpfSk7CiAgICAgICAgICAgIGFkZEV2ZW50KHRoaXMuZWxlbWVudCwgImtleXVwIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uS2V5VXAoZSl9KTsKICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAia2V5cHJlc3MiLCBmdW5jdGlvbihlKXtfdGhpcy5fb25LZXlQcmVzcyhlKX0pOwogICAgICAgICAgICAvL2FkZEV2ZW50KHRoaXMuZWxlbWVudCwgImNsaWNrIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uQ2xpY2soZSl9KTsKICAgICAgICAgICAgLy9hZGRFdmVudCh0aGlzLmVsZW1lbnQsICJkYmxjbGljayIsIGZ1bmN0aW9uKGUpe190aGlzLl9vbkRibENsaWNrKGUpfSk7CiAgICAgICAgICAgIC8vYWRkRXZlbnQodGhpcy5lbGVtZW50LCAicmNsaWNrIiwgZnVuY3Rpb24oZSl7X3RoaXMuNChlKX0pOwogICAgICAgICAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJwYXN0ZSIsIGZ1bmN0aW9uKGUpe190aGlzLl9vblBhc3RlKGUpfSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAia2V5dXAiLCBmdW5jdGlvbihlKXtfdGhpcy5fc2V0VmFsdWVUb0h0bWwoKX0pOwoKICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAiZm9jdXMiLCBmdW5jdGlvbihlKXtfdGhpcy5fb25Gb2N1cyhlKX0pOwogICAgICAgICAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJibHVyIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uQmx1cihlKX0pOwogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lcik7CiAgICBpZiAoIXRoaXMucGFyYW1zWyJvYmplY3RDbGFzc05hbWVzRGlzYWJsZWQiXSkKICAgIHsKICAgICAgICBpZiAodGhpcy5jb250YWluZXIpCiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgIl9Db21wb25lbnQiLCAwKTsKICAgICAgICBlbHNlIGlmICh0aGlzLmVsZW1lbnQpCiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmVsZW1lbnQsICJfQ29tcG9uZW50IiwgMCk7CiAgICB9CiAgICAvL2FkZENsYXNzTmFtZSh0aGlzLmVsZW1lbnQsICJfQ29tcG9uZW50Iik7CiAgICBpZiAodGhpcy5wYXJhbXNbImNoaWxkQ29tcG9uZW50Il0pCiAgICB7CiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgImNoaWxkQ29tcG9uZW50Iik7CiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiY2hpbGRDb21wb25lbnQiKTsKICAgIH0KICAgICAgICAKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICB0aGlzLmRlZmluZVByb3BlcnR5KCJmb3JtIiwgImdldCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgaWYgKHRoaXMuX19fZm9ybSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybih0aGlzLl9fX2Zvcm0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIGVsZW0gPSB0aGlzLmVsZW1lbnQgfHwgdGhpcy5jb250YWluZXI7CiAgICAgICAgdmFyIGVsZW0yID0gZWxlbTsKICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgd2hpbGUoZWxlbTIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbTIudGFnTmFtZSA9PSAiRk9STSIpCiAgICAgICAgICAgICAgICByZXR1cm4oZWxlbTIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGVsZW0yID0gZWxlbTIucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCJmb3JtIikpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oZ2V0RWxlbWVudCh0aGlzLmdldEF0dHJpYnV0ZSgiZm9ybSIpKSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLnBhcmFtc1siZm9ybSJdKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKGdldEVsZW1lbnQodGhpcy5wYXJhbXNbImZvcm0iXSkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4obnVsbCk7CiAgICB9KTsKICAgIHRoaXMuZGVmaW5lUHJvcGVydHkoImZvcm0iLCAic2V0IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIGR1bXAoImRlZmluZVByb3BlcnR5IC0gc2V0IC0gbm90IGltcGxlbWVudGVkIHlldCIpOwogICAgfSk7CiAgICAKICAgIGNhbGwoZnVuY3Rpb24oKXtfdGhpcy5vbkNyZWF0ZSgpfSwgdHJ1ZSk7CiAgICAKICAgIC8vIHZ5cG51dG8gdm9sYSBzZSB6IFRPYmplY3QuX2FmdGVyQ3JlYXRlCiAgICAvL2NhbGwoZnVuY3Rpb24oKXtfdGhpcy5hZnRlckNyZWF0ZSgpfSwgdHJ1ZSk7CiAgICAKICAgIGlmICh0aGlzLnBhcmFtc1siYXV0b2ZvY3VzIl0pCiAgICB7CiAgICAgICAgY2FsbChmdW5jdGlvbigpewogICAgICAgICAgICBfdGhpcy5lbGVtZW50LmZvY3VzKCk7IAogICAgICAgICAgICBpZiAoX3RoaXMuZWxlbWVudC50YWdOYW1lID09ICJJTlBVVCIpCiAgICAgICAgICAgICAgICBfdGhpcy5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDAsIF90aGlzLmVsZW1lbnQudmFsdWUubGVuZ3RoKTsKICAgICAgICB9LCB0cnVlKTsKICAgIH0KfQogICAgClRDb21wb25lbnQucHJvdG90eXBlLmlzQ2hpbGRDb21wb25lbnQgPSBmdW5jdGlvbigpCnsKICAgIHJldHVybigodGhpcy5lbGVtZW50ICYmIChoYXNDbGFzc05hbWUodGhpcy5lbGVtZW50LCAiY2hpbGRDb21wb25lbnQiKSB8fCBoYXNDbGFzc05hbWUodGhpcy5lbGVtZW50LCAiX0NoaWxkQ29tcG9uZW50IikpKSB8fCAodGhpcy5jb250YWluZXIgJiYgKGhhc0NsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgImNoaWxkQ29tcG9uZW50IikgfHwgaGFzQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiX0NoaWxkQ29tcG9uZW50IikpKSk7Cn0KCiAgICAKVENvbXBvbmVudC5wcm90b3R5cGUuYXNzaWduT2JqZWN0VG9FbGVtZW50ID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLnBhcmVudF9hc3NpZ25PYmplY3RUb0VsZW1lbnQoKTsKICAgIGlmICh0aGlzLmVsZW1lbnQpCiAgICAgICAgdGhpcy5lbGVtZW50Lm9iamVjdCA9IHRoaXM7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24oKQp7CiAgICBpZiAodGhpcy5lbGVtZW50KQogICAgewogICAgICAgIC8vZHVtcCgieCIpOwogICAgICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQudmFsdWUpOwogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZWxlbWVudC52YWx1ZTsKCiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lID09ICJJTlBVVCIgJiYgdHlwZW9mKHZhbHVlKSA9PSAic3RyaW5nIikKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoWldOTCwgImciKSwgIlxuIik7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybih2YWx1ZSk7CiAgICB9CiAgICAKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuaGFzVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgdmFyIHZhbHVlcyA9IGV4cGxvZGVMaXN0KHRoaXMuZ2V0VmFsdWUoKSk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhbHVlc1tpXSA9IHRvU3RyaW5nKHZhbHVlc1tpXSk7CiAgICB9CiAgICAKICAgIHJldHVybihpbl9hcnJheSh0b1N0cmluZyh2YWx1ZSksIHZhbHVlcykpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5nZXREaXNwbGF5VmFsdWUgPSBmdW5jdGlvbigpCnsKICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIAogICAgcmV0dXJuKHZhbHVlKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgLy9kdW1wKCJzZXRWYWx1ZSgiK3RoaXMuaWQrIik6Iit2YWx1ZSk7CiAgICAvL2R1bXAodGhpcy5lbGVtZW50KTsKICAgIGlmICh0aGlzLmVsZW1lbnQpCiAgICB7CiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lID09ICJJTlBVVCIgJiYgdHlwZW9mKHZhbHVlKSA9PSAic3RyaW5nIikKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cbi9nLCBaV05MKTsKICAgICAgICAgICAgCiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudC52YWx1ZSk7CiAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAvL3RoaXMub2xkVmFsdWUgPSB0aGlzLmVsZW1lbnQudmFsdWU7CiAgICAgICAgaWYgKCF0aGlzLl9vbGRWYWx1ZVNldCkKICAgICAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsgIC8vIG5lZWRlZCBmb3Igc2VsZWN0CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgLy9kdW1wKHRoaXMub2xkVmFsdWUpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PSAiSU5QVVQiIHx8IHRoaXMuZWxlbWVudC50YWdOYW1lID09ICJURVhUQVJFQSIpCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHZhbHVlOwogICAgICAgIGVsc2UgaWYgKCF0aGlzLl92YWx1ZVNldCkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgic2V0VmFsdWUoIit0aGlzLmlkKyIpOiIrdmFsdWUpOwogICAgICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50KTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB2YWx1ZTsKICAgICAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ZhbHVlU2V0ID0gZmFsc2U7CgogICAgICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpOwoKICAgICAgICB0aGlzLl9vbGRWYWx1ZVNldCA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgdmFyIGNoYW5nZWQgPSB0aGlzLmVsZW1lbnQudmFsdWUgIT0gdmFsdWU7CiAgICAgICAgaWYgKGNoYW5nZWQgfHwgdGhpcy5saW5rZWRDb21wb25lbnRzLmxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChjaGFuZ2VkKTsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpOwogICAgICAgIH0KICAgICAgICAqLwogICAgfQoKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuZ2V0UmF3VmFsdWUgPSBmdW5jdGlvbigpCnsKICAgIHJldHVybih0aGlzLmdldFZhbHVlKCkpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5zZXRWYWx1ZSgiIik7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmxpbmtDb21wb25lbnQgPSBmdW5jdGlvbihvYmplY3QpCnsKICAgIHRoaXMubGlua2VkQ29tcG9uZW50cy5wdXNoKG9iamVjdCk7CiAgICB0aGlzLm9sZFZhbHVlID0gIl9fTElOS19DT01QT05FTlRfRFVNTVlfXyI7CiAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLmdldFZhbHVlKCkpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5fb25DaGFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgLy9kdW1wKHRoaXMub25DaGFuZ2UpOwogICAgaWYgKCF0aGlzLmluVmFsdWVMaW5raW5nKQogICAgewogICAgICAgIHRoaXMuaW5WYWx1ZUxpbmtpbmcgPSB0cnVlOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMubGlua2VkQ29tcG9uZW50cy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgT2JqZWN0ID0gbnVsbDsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmxpbmtlZENvbXBvbmVudHNbaV0pID09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgT2JqZWN0ID0gZ2V0T2JqZWN0KHRoaXMubGlua2VkQ29tcG9uZW50c1tpXSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIE9iamVjdCA9IHRoaXMubGlua2VkQ29tcG9uZW50c1tpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChPYmplY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgICAgICAgICAgICAgIC8vZHVtcChPYmplY3QpOwogICAgICAgICAgICAgICAgLy9PYmplY3Quc2V0VmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0TGlua2VkQ29tcG9uZW50VmFsdWVUb09iamVjdChPYmplY3QsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIHRoaXMuaW5WYWx1ZUxpbmtpbmcgPSBmYWxzZTsKICAgIH0KCiAgICAvL2R1bXAodGhpcyk7CiAgICAvL2R1bXAodGhpcy5vbGRWYWx1ZSk7CiAgICAvL2R1bXAodGhpcy52YWx1ZSk7CiAgICAvL2R1bXAoIi0iKTsKICAgIC8vZHVtcCh0aGlzLm9sZFZhbHVlKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICBpZiAodGhpcy5vbGRWYWx1ZSAhPSB2YWx1ZSkKICAgIHsKICAgICAgICAvL2R1bXAodGhpcy5pZCk7CiAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAvL2R1bXAodGhpcy5pblZhbHVlTGlua2luZyk7CiAgICAgICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAgICAgaWYgKHRoaXMub25DaGFuZ2UpCiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpOwogICAgfQoKICAgIHRoaXMub2xkVmFsdWUgPSB2YWx1ZTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuc2V0TGlua2VkQ29tcG9uZW50VmFsdWVUb09iamVjdCA9IGZ1bmN0aW9uKE9iamVjdCwgdmFsdWUpCnsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICBPYmplY3Quc2V0TGlua2VkQ29tcG9uZW50VmFsdWVGcm9tT2JqZWN0KHRoaXMsIHZhbHVlKTsKfQogICAgClRDb21wb25lbnQucHJvdG90eXBlLnNldExpbmtlZENvbXBvbmVudFZhbHVlRnJvbU9iamVjdCA9IGZ1bmN0aW9uKE9iamVjdCwgdmFsdWUpCnsKICAgIGlmICghdGhpcy5pblZhbHVlTGlua2luZykKICAgIHsKICAgICAgICB0aGlzLmluVmFsdWVMaW5raW5nID0gdHJ1ZTsKICAgICAgICAvL2R1bXAodmFsdWUpOwogICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIHRoaXMuaW5WYWx1ZUxpbmtpbmcgPSBmYWxzZTsKICAgIH0KfQoKVENvbXBvbmVudC5wcm90b3R5cGUuc2V0UGFyYW0gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkKewogICAgdGhpcy5wYXJhbXNbbmFtZV0gPSB2YWx1ZTsKICAgIAogICAgdGhpcy5fb25TZXRQYXJhbShuYW1lLCB2YWx1ZSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLl9vblNldFBhcmFtID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpCnsKICAgIHRoaXMub25TZXRQYXJhbShuYW1lLCB2YWx1ZSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLm9uU2V0UGFyYW0gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkKewp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5vbkNoYW5nZSA9IGZ1bmN0aW9uKHZhbHVlKQp7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLl9vbkNsaWNrID0gZnVuY3Rpb24oZSkKewogICAgdGhpcy5vbkNsaWNrKGUpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oZSkKewp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5fb25EYmxDbGljayA9IGZ1bmN0aW9uKGUpCnsKICAgIHRoaXMub25EYmxDbGljayhlKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUub25EYmxDbGljayA9IGZ1bmN0aW9uKGUpCnsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuX29uUkNsaWNrID0gZnVuY3Rpb24oZSkKewogICAgZSA9IGdldEV2ZW50KGUpOwogICAgdGhpcy5vblJDbGljayhlKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUub25SQ2xpY2sgPSBmdW5jdGlvbihlKQp7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLl9vbkZvY3VzID0gZnVuY3Rpb24oZSkKewogICAgZSA9IGdldEV2ZW50KGUpOwogICAgdGhpcy5vbkZvY3VzKGUpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5vbkZvY3VzID0gZnVuY3Rpb24oZSkKewp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5fb25CbHVyID0gZnVuY3Rpb24oZSkKewogICAgZSA9IGdldEV2ZW50KGUpOwogICAgdGhpcy5vbkJsdXIoZSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLm9uQmx1ciA9IGZ1bmN0aW9uKGUpCnsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuX29uTW91c2VEb3duID0gZnVuY3Rpb24oZSkKewogICAgdGhpcy5vbk1vdXNlRG93bihlKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUub25Nb3VzZURvd24gPSBmdW5jdGlvbihlKQp7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLl9vbk1vdXNlVXAgPSBmdW5jdGlvbihlKQp7CiAgICB0aGlzLm9uTW91c2VVcChlKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUub25Nb3VzZVVwID0gZnVuY3Rpb24oZSkKewp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbigpCnsKICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIAogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gInN0cmluZyIpCiAgICAgICAgcmV0dXJuKHZhbHVlLnNwbGl0KCJ8IikpOwogICAgZWxzZQogICAgICAgIHJldHVybih2YWx1ZSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICIiOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5zZXRWaXNpYmxlID0gZnVuY3Rpb24odmlzaWJsZSkKewogICAgaWYgKHZpc2libGUpCiAgICAgICAgdGhpcy5zaG93KCk7CiAgICBlbHNlCiAgICAgICAgdGhpcy5oaWRlKCk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmdldFZpc2libGUgPSBmdW5jdGlvbigpCnsKICAgIHJldHVybih0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPSAibm9uZSIpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5nZXRFbmFibGVkID0gZnVuY3Rpb24oKQp7CiAgICByZXR1cm4oIXRoaXMuZWxlbWVudC5kaXNhYmxlZCk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLnNldEVuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKQp7CiAgICB0aGlzLmVsZW1lbnQuZGlzYWJsZWQgPSAhZW5hYmxlZDsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuZ2V0UmVhZE9ubHkgPSBmdW5jdGlvbigpCnsKICAgIHJldHVybih0aGlzLmVsZW1lbnQucmVhZE9ubHkpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5zZXRSZWFkT25seSA9IGZ1bmN0aW9uKHJlYWRvbmx5KQp7CiAgICB0aGlzLmVsZW1lbnQucmVhZE9ubHkgPSByZWFkb25seTsKfQoKClRDb21wb25lbnQucHJvdG90eXBlLl9vbktleURvd24gPSBmdW5jdGlvbihlKQp7CiAgICByZXR1cm4odGhpcy5vbktleURvd24oZSkpOwp9ClRDb21wb25lbnQucHJvdG90eXBlLl9vbktleVVwID0gZnVuY3Rpb24oZSkKewogICAgcmV0dXJuKHRoaXMub25LZXlVcChlKSk7Cn0KVENvbXBvbmVudC5wcm90b3R5cGUuX29uS2V5UHJlc3MgPSBmdW5jdGlvbihlKQp7CiAgICByZXR1cm4odGhpcy5vbktleVByZXNzKGUpKTsKfQpUQ29tcG9uZW50LnByb3RvdHlwZS5fb25DbGljayA9IGZ1bmN0aW9uKGUpCnsKICAgIHJldHVybih0aGlzLm9uQ2xpY2soZSkpOwp9ClRDb21wb25lbnQucHJvdG90eXBlLl9vbkRibENsaWNrID0gZnVuY3Rpb24oZSkKewogICAgcmV0dXJuKHRoaXMub25EYmxDbGljayhlKSk7Cn0KVENvbXBvbmVudC5wcm90b3R5cGUuX29uUkNsaWNrID0gZnVuY3Rpb24oZSkKewogICAgcmV0dXJuKHRoaXMub25SQ2xpY2soZSkpOwp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5vbktleURvd24gPSBmdW5jdGlvbihlKQp7Cn0KVENvbXBvbmVudC5wcm90b3R5cGUub25LZXlVcCA9IGZ1bmN0aW9uKGUpCnsKfQpUQ29tcG9uZW50LnByb3RvdHlwZS5vbktleVByZXNzID0gZnVuY3Rpb24oZSkKewp9ClRDb21wb25lbnQucHJvdG90eXBlLm9uQ2xpY2sgPSBmdW5jdGlvbihlKQp7Cn0KVENvbXBvbmVudC5wcm90b3R5cGUub25EYmxDbGljayA9IGZ1bmN0aW9uKGUpCnsKfQpUQ29tcG9uZW50LnByb3RvdHlwZS5vblJDbGljayA9IGZ1bmN0aW9uKGUpCnsKfQpUQ29tcG9uZW50LnByb3RvdHlwZS5vbkNyZWF0ZSA9IGZ1bmN0aW9uKCkKewp9ClRDb21wb25lbnQucHJvdG90eXBlLmFmdGVyQ3JlYXRlID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLm1lc3NhZ2VFbGVtZW50ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBoaWRlRWxlbWVudCh0aGlzLm1lc3NhZ2VFbGVtZW50KTsKCiAgICBpZiAodGhpcy5lbGVtZW50cyAmJiB0aGlzLmVsZW1lbnRzLmxlbmd0aCAmJiB0aGlzLmVsZW1lbnRzW3RoaXMuZWxlbWVudHMubGVuZ3RoLTFdICYmIHRoaXMuZWxlbWVudHNbdGhpcy5lbGVtZW50cy5sZW5ndGgtMV0ucGFyZW50Tm9kZSkKICAgICAgICBpbnNlcnRBZnRlcih0aGlzLmVsZW1lbnRzW3RoaXMuZWxlbWVudHMubGVuZ3RoLTFdLCB0aGlzLm1lc3NhZ2VFbGVtZW50KTsKICAgIGVsc2UgaWYgKHRoaXMuY29udGFpbmVyKQogICAgICAgIGluc2VydEFmdGVyKHRoaXMuY29udGFpbmVyLCB0aGlzLm1lc3NhZ2VFbGVtZW50KTsKfQoKLy8gdXNlZCBmb3IgQnJvd3NlckxvZ2dlcgpUQ29tcG9uZW50LnByb3RvdHlwZS5fc2V0VmFsdWVUb0h0bWwgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PSAiVEVYVEFSRUEiKQogICAgewogICAgICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIHRoaXMuZWxlbWVudCkgCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsU3RhcnQgPSB0aGlzLmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgIHZhciBzZWxFbmQgPSB0aGlzLmVsZW1lbnQuc2VsZWN0aW9uRW5kOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHZhbHVlOwogICAgICAgIAogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSBzZWxTdGFydDsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNlbGVjdGlvbkVuZCA9IHNlbEVuZDsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgeyAgCiAgICAgICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIGJlZm9yZSB2ZXJzaW9uIDkKICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAvL3ZhciByYW5nZSA9IHRoaXMuZWxlbWVudC5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICAgICAgLy9kdW1wKHJhbmdlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmICh0aGlzLmVsZW1lbnQudHlwZSAhPSAiY2hlY2tib3giICYmIHRoaXMuZWxlbWVudC50eXBlICE9ICJyYWRpbyIpCiAgICB7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudC52YWx1ZSk7CiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCB0aGlzLmVsZW1lbnQudmFsdWUpOwogICAgfQp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5fb25QYXN0ZSA9IGZ1bmN0aW9uKGUpCnsKICAgIGUgPSBnZXRFdmVudChlKTsKICAgIHRoaXMub25QYXN0ZShlKTsKfQpUQ29tcG9uZW50LnByb3RvdHlwZS5vblBhc3RlID0gZnVuY3Rpb24oZSkKewp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkKewogICAgLy9kdW1wKHZhbHVlKTsKICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIChuYW1lID09ICJ0eXBlIiB8fCBuYW1lID09ICJuYW1lIiB8fCBuYW1lID09ICJpZCIgfHwgbmFtZSA9PSAiZm9ybSIpKQogICAgewogICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICAgICAgICAvL2R1bXAoJ0EnKTsKICAgICAgICAvL2R1bXAodGhpcy5fZWxlbWVudCk7CiAgICB9CiAgICBlbHNlIGlmICh0aGlzLmVsZW1lbnQpCiAgICB7CiAgICAgICAgLy9kdW1wKCdCJyk7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9Cn0KClRDb21wb25lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUpCnsKICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIChuYW1lID09ICJ0eXBlIiB8fCBuYW1lID09ICJuYW1lIiB8fCBuYW1lID09ICJpZCIgfHwgbmFtZSA9PSAiZm9ybSIpKQogICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgZWxzZSBpZiAodGhpcy5lbGVtZW50KQogICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUpCnsKICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIChuYW1lID09ICJ0eXBlIiB8fCBuYW1lID09ICJuYW1lIiB8fCBuYW1lID09ICJpZCIgfHwgbmFtZSA9PSAiZm9ybSIpKQogICAgICAgIHJldHVybih0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKSk7CiAgICBlbHNlIGlmICh0aGlzLmVsZW1lbnQpCiAgICAgICAgcmV0dXJuKHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSkpOwogICAgZWxzZQogICAgICAgIHJldHVybigiIik7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKCkKewogICAgcmV0dXJuKHRoaXMuZnVsbFJlbG9hZCgpKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuZnVsbFJlbG9hZCA9IGZ1bmN0aW9uKHBhcmFtcykKewogICAgaWYgKHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IHt9OwogICAgLy8gZnVsbFJlbG9hZFBhcmFtcz8/Pz8/CiAgICAKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAKICAgIHZhciBfb2JqZWN0VHlwZSA9IGZpcnN0X3ZhbHVlKHRoaXMucGFyYW1zWyJmdWxsUmVsb2FkUGhwQ2xhc3NOYW1lIl0sIHRoaXMucGFyYW1zWyJwaHBDbGFzc05hbWUiXSkuc3Vic3RyaW5nKDEsIDEwMCk7CiAgICB2YXIgX3BhcmFtcyA9IGZpcnN0X3ZhbHVlKHRoaXMucGFyYW1zWyJmdWxsUmVsb2FkUGFyYW1zIl0sIHRoaXMucGFyYW1zKQogICAgCiAgICBmb3IgKHZhciBpIGluIHBhcmFtcykKICAgIHsKICAgICAgICBfcGFyYW1zW2ldID0gcGFyYW1zW2ldOwogICAgfQogICAgCiAgICAvLyBUT0RPIGVsZW1lbnQ/Pz8/CiAgICBkZWxldGUoX3BhcmFtc1siY29udGFpbmVyIl0pOwogICAgZGVsZXRlKF9wYXJhbXNbIl9fcGFyYW1zIl0pOwogICAgCiAgICAvL2R1bXAoX29iamVjdFR5cGUpOwogICAgLy9kdW1wKF9wYXJhbXMpOwogICAgLy9kdW1wKHRoaXMucGFyYW1zWyJmdWxsUmVsb2FkUGFyYW1zIl0pOwogICAgCiAgICBBSkFYLmdldExheW91dCgiQ29tcG9uZW50QUpBWFJlbG9hZCIsIHsib2JqZWN0VHlwZSI6X29iamVjdFR5cGUsICJwYXJhbXMiOl9wYXJhbXN9LCBmdW5jdGlvbihodG1sKXsKICAgIC8vQUpBWC5nZXRMYXlvdXQoIkNvbXBvbmVudEFKQVhSZWxvYWQiLCB7Im9iamVjdFR5cGUiOnRoaXMucGFyYW1zWyJwaHBDbGFzc05hbWUiXS5zdWJzdHJpbmcoMSwgMTAwKSwgInBhcmFtcyI6dGhpcy5wYXJhbXNbIl9fcGFyYW1zIl19LCBmdW5jdGlvbihodG1sKXsKICAgIC8vQUpBWC5nZXRPYmplY3RNZXRob2QodGhpcy5wYXJhbXNbInBocENsYXNzTmFtZSJdLCAiZ2V0Q29udGVudCIsIHRoaXMucGFyYW1zLCBmdW5jdGlvbihodG1sKXsKICAgICAgICAvL2R1bXAoX3RoaXMub2JqZWN0Q29udGFpbmVyKTsKICAgICAgICB2YXIgb2JqZWN0Q29udGFpbmVyID0gX3RoaXMub2JqZWN0Q29udGFpbmVyOwogICAgICAgIC8vZHVtcChvYmplY3RDb250YWluZXIpOwogICAgICAgIHZhciB0bXBPYmplY3RDb250YWluZXIgPSBudWxsOwogICAgICAgIC8vZHVtcChfdGhpcy5jb250YWluZXIpOwogICAgICAgIC8vZHVtcChfdGhpcy5lbGVtZW50KTsKICAgICAgICAKICAgICAgICAvLyBwb3V6aXRpIHRydWUga3Z1bGkgR3JpZCBhIGFkbWludSBwbyByZWxvYWR1IHphbG96a3kKICAgICAgICBpZiAodHJ1ZSB8fCAhb2JqZWN0Q29udGFpbmVyIHx8IChvYmplY3RDb250YWluZXIudGFnTmFtZSAhPSAiZGl2IiAmJiBvYmplY3RDb250YWluZXIudGFnTmFtZSAhPSAic3BhbiIpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wT2JqZWN0Q29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIHRtcE9iamVjdENvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CiAgICAgICAgICAgIGluc2VydEJlZm9yZSgoX3RoaXMuY29udGFpbmVyIHx8IF90aGlzLmVsZW1lbnQpLCB0bXBPYmplY3RDb250YWluZXIpOwogICAgICAgICAgICBvYmplY3RDb250YWluZXIgPSB0bXBPYmplY3RDb250YWluZXI7CgogICAgICAgIH0KICAgICAgICAvL2R1bXAodG1wT2JqZWN0Q29udGFpbmVyKTsKICAgICAgICAvL2R1bXAob2JqZWN0Q29udGFpbmVyKTsKICAgICAgICAvL3JldHVybjsKICAgICAgICBpZiAob2JqZWN0Q29udGFpbmVyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF9vYmplY3RDb250YWluZXIgPSBudWxsOwogICAgICAgICAgICBpZiAodG1wT2JqZWN0Q29udGFpbmVyKQogICAgICAgICAgICAgICAgX29iamVjdENvbnRhaW5lciA9IHRtcE9iamVjdENvbnRhaW5lcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgX29iamVjdENvbnRhaW5lciA9IG9iamVjdENvbnRhaW5lci5jbG9uZU5vZGUoZmFsc2UpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vYWRkQ2xhc3NOYW1lKF9vYmplY3RDb250YWluZXIsICJ4eHh4eHgiKTsKICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKG9iamVjdENvbnRhaW5lciwgX29iamVjdENvbnRhaW5lcik7CiAgICAgICAgICAgIC8vZHVtcChfb2JqZWN0Q29udGFpbmVyKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KF90aGlzKTsKCiAgICAgICAgICAgICAgICBzZXRIdG1sKF9vYmplY3RDb250YWluZXIsIGh0bWwpOwoKICAgICAgICAgICAgICAgIGlmICh0bXBPYmplY3RDb250YWluZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUodG1wT2JqZWN0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKHRtcE9iamVjdENvbnRhaW5lciwgdG1wT2JqZWN0Q29udGFpbmVyLmNoaWxkTm9kZXNbMF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKHRtcE9iamVjdENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAvL2Vsc2UKICAgICAgICAvL3sKICAgICAgICAvLyAgICBfdGhyb3coIlRDb21wb25lbnQ6OnJlbG9hZCAtIG1pc3Npbmcgb2JqZWN0Q29udGFpbmVyIGZvciBvYmplY3QgJyIrX3RoaXMuaWQrIiciKTsKICAgICAgICAvLyAgICBkdW1wKF90aGlzKTsKICAgICAgICAvL30KICAgICAgICAgICAgCiAgICAgICAgLy9kdW1wKGh0bWwpOwogICAgfSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLnNob3dFcnJvciA9IGZ1bmN0aW9uKGVycm9yKQp7CiAgICBpZiAodGhpcy5lbGVtZW50ICYmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PSAiSU5QVVQiIHx8IHRoaXMuZWxlbWVudC50YWdOYW1lID09ICJURVhUQVJFQSIpKQogICAgewogICAgICAgIHRoaXMuc2V0VmFsdWUoIiIpOwogICAgICAgIAogICAgICAgIGlmICh0eXBlb2YodGhpcy5lcnJvck9sZFBsYWNlaG9sZGVyKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZXJyb3JPbGRQbGFjZWhvbGRlciA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIik7CiAgICAgICAgICAgIGlmICghdGhpcy5lcnJvck9sZFBsYWNlaG9sZGVyKQogICAgICAgICAgICAgICAgdGhpcy5lcnJvck9sZFBsYWNlaG9sZGVyID0gIiI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAiZm9jdXMiLCBmdW5jdGlvbigpe190aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIsIF90aGlzLmVycm9yT2xkUGxhY2Vob2xkZXIpfSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIiwgZXJyb3IpOwogICAgfQp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlTmFtZSwgdmFsdWUpCnsKICAgIHNldFN0eWxlKHRoaXMuZWxlbWVudCB8fCB0aGlzLmNvbnRhaW5lciwgc3R5bGVOYW1lLCB2YWx1ZSk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24oc3R5bGVOYW1lKQp7CiAgICByZXR1cm4oZ2V0U3R5bGUodGhpcy5lbGVtZW50IHx8IHRoaXMuY29udGFpbmVyLCBzdHlsZU5hbWUpKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24oKQp7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLnNob3dNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSwgdHlwZSkKewogICAgdGhpcy5tZXNzYWdlRWxlbWVudC5pbm5lckhUTUwgPSBtZXNzYWdlOwoKICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLm1lc3NhZ2VFbGVtZW50LCAibXRFcnJvciIpOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMubWVzc2FnZUVsZW1lbnQsICJtdFdhcm5pbmciKTsKICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLm1lc3NhZ2VFbGVtZW50LCAibXROb3RpY2UiKTsKCiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5lbGVtZW50LCAibXRFcnJvciIpOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIm10V2FybmluZyIpOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIm10Tm90aWNlIik7CgogICAgYWRkQ2xhc3NOYW1lKHRoaXMubWVzc2FnZUVsZW1lbnQsICJfQ29tcG9uZW50TWVzc2FnZSIpOwogICAgYWRkQ2xhc3NOYW1lKHRoaXMubWVzc2FnZUVsZW1lbnQsIHR5cGUpOwogICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgdHlwZSk7CgogICAgc2hvd0VsZW1lbnQodGhpcy5tZXNzYWdlRWxlbWVudCk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmhpZGVNZXNzYWdlID0gZnVuY3Rpb24oKQp7CiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5lbGVtZW50LCAibXRFcnJvciIpOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIm10V2FybmluZyIpOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIm10Tm90aWNlIik7CgogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIm10RXJyb3IiKTsKICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmVsZW1lbnQsICJtdFdhcm5pbmciKTsKICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmVsZW1lbnQsICJtdE5vdGljZSIpOwoKICAgIHRoaXMubWVzc2FnZUVsZW1lbnQuaW5uZXJIVE1MID0gIiI7CgogICAgaGlkZUVsZW1lbnQodGhpcy5tZXNzYWdlRWxlbWVudCk7Cn0KClRDb21wb25lbnQucHJvdG90eXBlLmdldEV2ZW50TmFtZXMgPSBmdW5jdGlvbigpCnsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgZm9yICh2YXIgaSBpbiB0aGlzKQogICAgewogICAgICAgIGlmICh0eXBlb2YoaSkgPT0gInN0cmluZyIgJiYgdHlwZW9mKHRoaXNbaV0pID09ICJmdW5jdGlvbiIgJiYgaS5pbmRleE9mKCJvbiIpID09IDAgJiYgaVsyXS50b1VwcGVyQ2FzZSgpID09IGlbMl0pIC8vIGNhbWVsaXplZCBvbkFueXRoaW5nCiAgICAgICAgewogICAgICAgICAgICBuYW1lcy5wdXNoKGkpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKG5hbWVzKTsKfQoKVENvbXBvbmVudC5wcm90b3R5cGUuZGlzYWJsZUV2ZW50cyA9IGZ1bmN0aW9uKCkKewogICAgLy9kdW1wKCJESVNBQkxFIEVWRU5UUyIpOwogICAgLy9kdW1wKHRoaXMuaWQpOwogICAgdmFyIG5hbWVzID0gdGhpcy5nZXRFdmVudE5hbWVzKCk7CiAgICAKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG5hbWVzLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB0aGlzLmRpc2FibGVkRXZlbnRzW25hbWVzW2ldXSA9IHRoaXNbbmFtZXNbaV1dOwogICAgICAgIHRoaXNbbmFtZXNbaV1dID0gZnVuY3Rpb24oKXt9OwogICAgfQp9CgpUQ29tcG9uZW50LnByb3RvdHlwZS5lbmFibGVFdmVudHMgPSBmdW5jdGlvbigpCnsKICAgIC8vZHVtcCgiRU5BQkxFIEVWRU5UUyIpOwogICAgLy9kdW1wKHRoaXMuaWQpOwogICAgZm9yICh2YXIgaSBpbiB0aGlzLmRpc2FibGVkRXZlbnRzKQogICAgewogICAgICAgIHRoaXNbaV0gPSB0aGlzLmRpc2FibGVkRXZlbnRzW2ldOwogICAgfQogICAgCiAgICB0aGlzLmRpc2FibGVkRXZlbnRzID0ge307Cn0KCmZ1bmN0aW9uIGdldENvbXBvbmVudHNCeU5hbWUobmFtZSkKewogICAgdmFyIHJldCA9IFtdOwogICAgZm9yICh2YXIgaSBpbiBfb2JqZWN0cykKICAgIHsKICAgICAgICB2YXIgQ29tcG9uZW50ID0gX29iamVjdHNbaV07CiAgICAgICAgaWYgKENvbXBvbmVudC5lbGVtZW50ICYmIChDb21wb25lbnQuZWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSAmJiBDb21wb25lbnQuZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PSBuYW1lIHx8IENvbXBvbmVudC5wYXJhbXNbIm5hbWUiXSAmJiBDb21wb25lbnQucGFyYW1zWyJuYW1lIl0gPT0gbmFtZSkpCiAgICAgICAgICAgIHJldC5wdXNoKENvbXBvbmVudCk7CiAgICB9CiAgICAKICAgIHJldHVybihyZXQpOwp9Ll9Db21wb25lbnQgew0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICBtYXJnaW46IDBweDsNCn0NCg0KLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ29tcG9uZW50L0NvbXBvbmVudC5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBUQ29tcG9uZW50IGV4dGVuZHMgVE9iamVjdAp7CiAgICB2YXIgJGNvbnRleHRNZW51RW5hYmxlZCA9IGZhbHNlOwogICAgcHVibGljIHN0YXRpYyAkZmlsZUNvbXBvbmVudCA9IGZhbHNlOwogICAgcHVibGljIHN0YXRpYyAkcHJldmlldyA9IGZhbHNlOwogICAgcHVibGljIHN0YXRpYyAkaW5saW5lQ29tcG9uZW50VHlwZSA9ICIiOwoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX19pbXBsZW1lbnRzKCkKICAgIHsKICAgICAgICByZXR1cm4oYXJyYXkoKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvbkdldFByb3BlcnRpZXMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSggICAgICAgIAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249Q29tbW9uIiwKICAgICAgICAibmFtZT1pZCxjYXB0aW9uPWlkLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1WaXN1YWwiLAogICAgICAgICJuYW1lPXN0eWxlLGNhcHRpb249c3R5bGUsb2JqZWN0PVN0eWxlRWRpdCIsCiAgICAgICAgIm5hbWU9Y2xhc3MsY2FwdGlvbj1jbGFzcyxvYmplY3Q9VGV4dEVkaXQiLAoKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPURhdGEiLAogICAgICAgICJuYW1lPXZhbHVlLGNhcHRpb249VmFsdWUsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPUJlaGF2aW9yIiwKICAgICAgICAibmFtZT10cmFuc2xhdGUsY2FwdGlvbj1UcmFuc2xhdGUsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgIm5hbWU9b2JqZWN0Q2xhc3NOYW1lc0Rpc2FibGVkLGNhcHRpb249RGlzYWJsZSBPYmplY3QgQ2xhc3MgTmFtZXMsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCgogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249T2JqZWN0IiwKICAgICAgICAibmFtZT1jb250ZXh0TWVudSxjYXB0aW9uPUNvbnRleHQgTWVudSxvYmplY3Q9T2JqZWN0RWRpdCIsCgogICAgICAgIC8vInR5cGU9Z3JvdXAsY2FwdGlvbj1WaXN1YWwiLAogICAgICAgIC8vIm5hbWU9LGNhcHRpb249Q29udGV4dCBNZW51LG9iamVjdD1PYmplY3RFZGl0IiwKCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1QYXJzZXIscG9zaXRpb249bGFzdCIsCiAgICAgICAgIm5hbWU9YWN0aXZlLGNhcHRpb249QWN0aXZlLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJuYW1lPWNvbmRpdGlvbixjYXB0aW9uPUNvbmRpdGlvbixvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICJuYW1lPWpzQ29uZGl0aW9uLGNhcHRpb249SmF2YVNjcmlwdCBDb25kaXRpb24sb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAibmFtZT1wYXJzZU9yZGVyLGNhcHRpb249UGFyc2UgT3JkZXIsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18cG9GaXJzdHxwb0xhc3R8cG9GaW5hbCIsCiAgICAgICAgIm5hbWU9aWdub3JlZFBhcmFtcyxjYXB0aW9uPUlnbm9yZWQgUGFyYW1zLG9iamVjdD1MaXN0RWRpdCIsCiAgICAgICAgIm5hbWU9Y2hpbGRDb21wb25lbnQsY2FwdGlvbj1DaGlsZCBDb21wb25lbnQsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsIC8vIHNldFZhbHVlc0luRWxlbWVudCBpcyBub3QgY2FsbGVkIGZvciBjaGlsZCBjb21wb25lbnRzCiAgICAgICAgIm5hbWU9b2JqZWN0SWQsY2FwdGlvbj1PYmplY3QgSWQsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAibmFtZT1jb250ZW50T3V0cHV0LGNhcHRpb249Q29udGVudCBPdXRwdXQsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18Ym9keUh0bWxQcmVmaXh8Ym9keUh0bWxQb3N0Zml4fGhlYWRIdG1sIiwKCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1KYXZhU2NyaXB0IEV2ZW50cyxwb3NpdGlvbj1sYXN0IiwKICAgICAgICAibmFtZT1vbkNyZWF0ZSxjYXB0aW9uPW9uQ3JlYXRlLG9iamVjdD1Db2RlRWRpdCxzeW50YXg9amF2YXNjcmlwdCIsCiAgICAgICAgIm5hbWU9b25DaGFuZ2UsY2FwdGlvbj1vbkNoYW5nZSxvYmplY3Q9Q29kZUVkaXQsc3ludGF4PWphdmFzY3JpcHQiLAogICAgICAgICJuYW1lPW9uQ2xpY2ssY2FwdGlvbj1vbkNsaWNrLG9iamVjdD1Db2RlRWRpdCxzeW50YXg9amF2YXNjcmlwdCIsCiAgICAgICAgIm5hbWU9b25EYmxDbGljayxjYXB0aW9uPW9uRGJsQ2xpY2ssb2JqZWN0PUNvZGVFZGl0LHN5bnRheD1qYXZhc2NyaXB0IiwKICAgICAgICAibmFtZT1vblJDbGljayxjYXB0aW9uPW9uUkNsaWNrLG9iamVjdD1Db2RlRWRpdCxzeW50YXg9amF2YXNjcmlwdCIsCiAgICAgICAgIm5hbWU9b25Gb2N1cyxjYXB0aW9uPW9uRm9jdXMsb2JqZWN0PUNvZGVFZGl0LHN5bnRheD1qYXZhc2NyaXB0IiwKICAgICAgICAibmFtZT1vbkJsdXIsY2FwdGlvbj1vbkJsdXIsb2JqZWN0PUNvZGVFZGl0LHN5bnRheD1qYXZhc2NyaXB0IiwKICAgICAgICAibmFtZT1vbktleURvd24sY2FwdGlvbj1vbktleURvd24sb2JqZWN0PUNvZGVFZGl0LHN5bnRheD1qYXZhc2NyaXB0IiwKICAgICAgICAibmFtZT1vbktleVVwLGNhcHRpb249b25LZXlVcCxvYmplY3Q9Q29kZUVkaXQsc3ludGF4PWphdmFzY3JpcHQiLAogICAgICAgICJuYW1lPW9uS2V5UHJlc3MsY2FwdGlvbj1vbktleVByZXNzLG9iamVjdD1Db2RlRWRpdCxzeW50YXg9amF2YXNjcmlwdCIsCiAgICAgICAgKSk7ICAgICAgICAKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRHcm91cFByb3BlcnRpZXMoJGdyb3Vwcz1hcnJheSgpKQogICAgewogICAgICAgICRncm91cHMgPSBleHBsb2RlTGlzdCgkZ3JvdXBzKTsKICAgICAgICAKICAgICAgICAkX3Byb3BlcnRpZXMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgICRjbGFzc05hbWUgPSBnZXRfY2FsbGVkX2NsYXNzKCk7CiAgICAgICAgcmV0dXJuKGNhbGxfc3RhdGljX21ldGhvZCgkY2xhc3NOYW1lLCAiZ2V0UHJvcGVydGllcyIpKTsKCiAgICAgICAgLy8kcHJvcGVydGllcyA9IGV2YWwoInJldHVybigiLiRjbGFzc05hbWUuIjo6Z2V0UHJvcGVydGllcygpKTsiKTsgLy9jYWxsX3VzZXJfZnVuYyhhcnJheSgkY2xhc3NOYW1lLCAiZ2V0UHJvcGVydGllcyIpKTsKICAgICAgICAvLyRwcm9wZXJ0aWVzID0gc3RhdGljOjpnZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkcHJvcGVydGllcyBhcyAkcHJvcGVydHkpCiAgICAgICAgewogICAgICAgICAgICAkcHJvcGVydHkgPSBleHRyYWN0UGFyYW1zKCRwcm9wZXJ0eSk7CiAgICAgICAgICAgIC8vZHVtcCgkcHJvcGVydHkpOwogICAgICAgICAgICBpZiAoJHByb3BlcnR5WyJ0eXBlIl0gPT0gImdyb3VwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRwcm9wZXJ0eVsiY2FwdGlvbiJdLCAkZ3JvdXBzKSkKICAgICAgICAgICAgICAgICAgICAkaW5Hcm91cCA9IHRydWU7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgJGluR3JvdXAgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGluR3JvdXApCiAgICAgICAgICAgICAgICAkX3Byb3BlcnRpZXNbXSA9ICRwcm9wZXJ0eTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRfcHJvcGVydGllcyk7CiAgICB9ICAgIAogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpZWxkSW5mbygkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgcmV0dXJuKGFycmF5KAogICAgICAgICkpOwogICAgfQoKICAgIC8qCiAgICAvLyBwb3V6aXRvIHYgZ2V0SnNQYXJhbXMoKQogICAgZnVuY3Rpb24gZXh0cmFjdFBhcmFtcygkcGFyYW1zPWFycmF5KCksICRwYXJzZVNjcmlwdHM9dHJ1ZSkKICAgIHsKICAgICAgICAkcGFyYW1zID0gcGFyZW50OjpleHRyYWN0UGFyYW1zKCRwYXJhbXMsICRwYXJzZVNjcmlwdHMpOwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+dGFibGVOYW1lKQogICAgICAgICAgICAkcGFyYW1zWyJfdGFibGVOYW1lIl0gPSAkdGhpcy0+dGFibGVOYW1lOwogICAgICAgIGlmICgkdGhpcy0+RmllbGQpCiAgICAgICAgICAgICRwYXJhbXNbIl9maWVsZE5hbWUiXSA9ICR0aGlzLT5GaWVsZC0+bmFtZTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgfQogICAgKi8KICAgIAogICAgZnVuY3Rpb24gX193YWtldXAoKQogICAgewogICAgICAgICR0aGlzLT5vbkdldFZhbHVlQ2FsbGVkID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2FjaGUgPSBhcnJheSgpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRQcm9wZXJ0eSgkbmFtZSkKICAgIHsKICAgICAgICAkY2xhc3NOYW1lID0gZ2V0X2NsYXNzKCR0aGlzKTsKICAgICAgICAvLyRwcm9wZXJ0aWVzID0gJGNsYXNzTmFtZTo6Z2V0UHJvcGVydGllcygpOyAvLyB0aHJvd3MgZXJyb3Igb24gc29tZSBQSFBzCiAgICAgICAgJHByb3BlcnRpZXMgPSBfX2V2YWwoInJldHVybigiLiRjbGFzc05hbWUuIjo6Z2V0UHJvcGVydGllcygpKTsiKTsKICAgICAgICAvL3Zhcl9kdW1wKCRwcm9wZXJ0aWVzKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkcHJvcGVydGllcyBhcyAkcHJvcGVydHkpCiAgICAgICAgewogICAgICAgICAgICAkcHJvcGVydHkgPSBleHRyYWN0UGFyYW1zKCRwcm9wZXJ0eSk7CiAgICAgICAgICAgIC8vZHVtcCgkcHJvcGVydHlbIm5hbWUiXSk7CiAgICAgICAgICAgIC8vZHVtcCgkbmFtZSk7CiAgICAgICAgICAgIGlmICgkcHJvcGVydHlbIm5hbWUiXSA9PSAkbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybigkcHJvcGVydHkpOwogICAgICAgIH0KICAgIH0gICAKICAgIGZ1bmN0aW9uIGhhc1Byb3BlcnR5KCRuYW1lKQogICAgewogICAgICAgIC8vZHVtcCgkdGhpcy0+Z2V0UHJvcGVydHkoJG5hbWUpICE9PSBOVUxMKTsKICAgICAgICByZXR1cm4oJHRoaXMtPmdldFByb3BlcnR5KCRuYW1lKSAhPT0gTlVMTCk7CiAgICB9CiAgICAgICAgIAogICAgZnVuY3Rpb24gb25HZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCFBSkFYICYmICFoZWFkSHRtbEFkZGVkKF9fQ0xBU1NfXywgJHBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICBwYXJlbnQ6Om9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgICAgIFRUcmFuc2xhdG9yOjpvbkdldEhlYWRIdG1sKCk7CiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9Db21wb25lbnQvQ29tcG9uZW50LmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOwogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPGxpbmsgaHJlZj0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvQ29tcG9uZW50L0NvbXBvbmVudC5jbGFzcy5jc3MnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIC8+Iix0cnVlKTsKICAgICAgICAKICAgICAgICAgICAgYWRkRXh0ZW5kaW5nSGVhZEh0bWwoJHBhcmFtcywgX19DTEFTU19fKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Q29udGVudCgkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIiwgJHBhcmFtMT1OVUxMLCAkcGFyYW0yPU5VTEwsICRwYXJhbTM9TlVMTCkKICAgIHsKICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zLCBmYWxzZSk7CiAgICAgICAgaWYgKCRwYXJhbXNbImNvbmRpdGlvbiJdID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigiIik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybihwYXJlbnQ6OmdldENvbnRlbnQoJHBhcmFtcywgJHZhbHVlLCAkcGFyYW0xLCAkcGFyYW0yLCAkcGFyYW0zKSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25HZXRDb250ZW50KCYkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAKICAgICAgICAkdGhpcy0+aW5pdCgkcGFyYW1zKTsKCiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0gCiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0Q29udGV4dE1lbnVSQ2xpY2tFdmVudCgpCiAgICB7CiAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gaW5pdCgmJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIHBhcmVudDo6aW5pdCgkcGFyYW1zKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbImlkIl0pCiAgICAgICAgewogICAgICAgICAgICBpZiAob2JqZWN0RGVmaW5lZCgkcGFyYW1zWyJpZCJdKSAmJiAkdGhpcy0+aW5oZXJpdHMoIlRDb21wb25lbnQiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgiVENvbXBvbmVudDo6aW5pdCgpIC0gb2JqZWN0IHNob3VsZCBub3QgaGF2ZSB0aGUgc2FtZSBpZCAnIi4kcGFyYW1zWyJpZCJdLiInIGFzIGV4aXN0aW5nIG9iamVjdCB0eXBlLiBVc2luZyByYW5kb20gaWQuIiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgICAgIC8vJHBhcmFtc1siaWQiXSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJuYW1lIl0pCiAgICAgICAgICAgICR0aGlzLT5uYW1lID0gJHBhcmFtc1sibmFtZSJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJHRoaXMtPm5hbWUgPSAkdGhpcy0+aWQ7CiAgICAgICAgCiAgICAgICAgLy8kcGFyYW1zWyJuYW1lIl0gPSAkdGhpcy0+bmFtZTsKICAgICAgICAKICAgICAgICBnbG9iYWwgJF9fY29tcG9uZW50SWRQcmVmaXg7CiAgICAgICAgJHByZWZpeCA9ICRwYXJhbXNbImlkUHJlZml4Il07CiAgICAgICAgaWYgKCEkcHJlZml4KQogICAgICAgICAgICAkcHJlZml4ID0gZ2V0Q29tcG9uZW50SWRQcmVmaXgoKTsKICAgICAgICBpZiAoJHByZWZpeCAmJiBzdHJwb3MoJHRoaXMtPmlkLCAkcHJlZml4KSAhPT0gMCkKICAgICAgICAgICAgJHRoaXMtPmlkID0gKCRwYXJhbXNbImlkUHJlZml4Il0gPyAkcGFyYW1zWyJpZFByZWZpeCJdIDogZ2V0Q29tcG9uZW50SWRQcmVmaXgoKSkuIl8iLiR0aGlzLT5pZDsKICAgICAgICAKICAgICAgICAvLyBESUFMT0cgUFJFRklYID8/CiAgICAgICAgaWYgKCRwcmVmaXggJiYgc3RycG9zKCR0aGlzLT5uYW1lLCAkcHJlZml4KSA9PT0gMCkKICAgICAgICAgICAgJHRoaXMtPm5hbWUgPSBzdWJzdHIoJHRoaXMtPm5hbWUsIHN0cmxlbigkcHJlZml4KSsxKTsKICAgICAgICAKCiAgICAgICAgLy8gWyMjIHRvIG5vdCBwYXJzZSB0ZW1wbGF0ZSBmaWVsZHMgaWYgbmFtZSBpcyByZWNvcmRbbmFtZV0gLSB1c2VkIGluIGF0dHJpYnV0ZXMgYW5kIEpTIGNvbnN0cnVjdG9ycwogICAgICAgIC8vIG51dG5vIHZ5cmVzaXQgamluYWsgLSB2IGdldCBhdHRyaWJ1dGUgcGFyYW1zIGEgdiBnZXRKc0NvZGUgLi4uIAogICAgICAgIGlmIChGQUxTRSAmJiAhQURNSU4pCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+aWQgPSBzdHJfcmVwbGFjZSgiWyIsICJbIyMiLCAkdGhpcy0+aWQpOwogICAgICAgICAgICAkdGhpcy0+bmFtZSA9IHN0cl9yZXBsYWNlKCJbIiwgIlsjIyIsICR0aGlzLT5uYW1lKTsKICAgICAgICB9CgogICAgICAgIC8vJHBhcmFtc1siaWQiXSA9ICR0aGlzLT5pZDsKICAgIH0KICAgIAogICAgLy8gdXNlZCBpbiBkZWZhdWx0IHZ0RnVsbCBhZG1pbiB0ZW1wbGF0ZQogICAgZnVuY3Rpb24gZ2V0UGFyYW1zKCRyZWNvcmRWYWx1ZXM9YXJyYXkoKSkKICAgIHsKICAgICAgICByZXR1cm4oJHRoaXMtPm9uR2V0UGFyYW1zKCRwYXJhbXMpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldFBhcmFtcygkcmVjb3JkVmFsdWVzPWFycmF5KCkpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5wYXJhbXMpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRUZXN0UGFyYW1zKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAkcGFyYW1zID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHBhcmFtcyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0SnNQYXJhbXMoJHBhcmFtcykKICAgIHsKICAgICAgICAvL2R1bXAoJHRoaXMtPkZpZWxkKTsKICAgICAgICBpZiAoJHRoaXMtPkZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1sib2JqZWN0VGFibGVOYW1lIl0gPSAkdGhpcy0+dGFibGVOYW1lOwogICAgICAgICAgICAkcGFyYW1zWyJvYmplY3RGaWVsZE5hbWUiXSA9ICR0aGlzLT5GaWVsZC0+bmFtZTsKICAgICAgICB9CgogICAgICAgIHJldHVybihwYXJlbnQ6OmdldEpzUGFyYW1zKCRwYXJhbXMpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRUZXN0Q29udGVudCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5nZXRDb250ZW50KCR0aGlzLT5nZXRUZXN0UGFyYW1zKCRwYXJhbXMpKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHNldFBhcmFtcygkcGFyYW1zKQogICAgewogICAgICAgIHNob3dNZXNzYWdlKCJNZXRob2Qgc2V0UGFyYW1zKCkgaXMgbm93IGRlcHJlY2F0ZWQuIFVzZSBkaXJlY3RseSBwYXJhbXMgcHJvcGVydHkgb3IgY2FsbCBtZXRob2QgZ2V0Q29udGVudCgpIHdpdGggcGFyYW1zIiwgbXRXYXJuaW5nKTsKICAgICAgICAKICAgICAgICBpZiAob2JqZWN0RGVmaW5lZCgiVmlzdWFsUEhQMUNvbnZlcnRlciIpKQogICAgICAgICAgICAkdGhpcy0+cGFyYW1zID0gZ2V0T2JqZWN0KCJWaXN1YWxQSFAxQ29udmVydGVyIiktPmdldE9iamVjdFBhcmFtcygkcGFyYW1zLCAkdGhpcy0+Y29tcG9uZW50VHlwZU9sZCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkdGhpcy0+cGFyYW1zID0gJHBhcmFtczsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCR0aGlzLT5uYW1lICYmICEkdGhpcy0+cGFyYW1zWyJpZCJdKQogICAgICAgICAgICAkdGhpcy0+cGFyYW1zWyJpZCJdID0gJHRoaXMtPm5hbWU7CiAgICAgICAgICAgIAogICAgICAgIC8vZHVtcCgkdGhpcy0+cGFyYW1zKTsKICAgIH0KICAgIAogICAgLy9wdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzRmlsZUNvbXBvbmVudCgpCiAgICBmdW5jdGlvbiBpc0ZpbGVDb21wb25lbnQoKQogICAgewogICAgICAgIGlmIChpc3NldCgkdGhpcykpCiAgICAgICAgICAgICRjbGFzc05hbWUgPSBnZXRfY2xhc3MoJHRoaXMpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGNsYXNzTmFtZSA9IGdldF9jYWxsZWRfY2xhc3MoKTsKCiAgICAgICAgcmV0dXJuKGdldF9zdGF0aWNfdmFyaWFibGUoJGNsYXNzTmFtZSwgImZpbGVDb21wb25lbnQiKSk7CiAgICB9CiAgICAvKgogICAgZnVuY3Rpb24gb25HZXRDb250ZXh0TWVudSgkcGFyYW1zKQogICAgewogICAgICAgIGlmICgkcGFyYW1zWyJjb250ZXh0TWVudSJdKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwYXJhbXNbImNvbnRleHRNZW51Il0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkT2JqZWN0ID0gY3JlYXRlT2JqZWN0KCRwYXJhbXNbImNvbnRleHRNZW51Il1bIm9iamVjdCJdKTsKICAgICAgICAgICAgICAgICRodG1sIC49ICRPYmplY3QtPmdldENvbnRlbnQoJHBhcmFtc1siY29udGV4dE1lbnUiXVsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRPYmplY3QtPmlkKTsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICRjb250ZXh0TWVudUlkID0gJE9iamVjdC0+aWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkcGFyYW1zWyJjb250ZXh0TWVudSJdKSkKICAgICAgICAgICAgICAgICRjb250ZXh0TWVudUlkID0gJHBhcmFtc1siY29udGV4dE1lbnUiXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJGNvbnRleHRNZW51SWQpCiAgICAgICAgICAgICAgICAkcGFyYW1zWyJvblJDbGljayJdID0gImdldE9iamVjdChcIiIuJGNvbnRleHRNZW51SWQuIlwiKS5yb3dJbmRleCA9IHJvd0luZGV4OyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0KFwiIi4kY29udGV4dE1lbnVJZC4iXCIpLmNvbEluZGV4ID0gY29sSW5kZXg7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoXCIiLiRjb250ZXh0TWVudUlkLiJcIikudHIgPSB0cjsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdChcIiIuJGNvbnRleHRNZW51SWQuIlwiKS50ZCA9IHRkOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0KFwiIi4kY29udGV4dE1lbnVJZC4iXCIpLnRoID0gdGg7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoXCIiLiRjb250ZXh0TWVudUlkLiJcIikucm93Q291bnQgPSB0aGlzLmdldFJvd0NvdW50KCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoXCIiLiRjb250ZXh0TWVudUlkLiJcIikuY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoXCIiLiRjb250ZXh0TWVudUlkLiJcIikub2JqZWN0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0KFwiIi4kY29udGV4dE1lbnVJZC4iXCIpLkdyaWQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3QoXCIiLiRjb250ZXh0TWVudUlkLiJcIikuc2hvdygpOyAiLiRwYXJhbXNbIm9uUkNsaWNrIl07CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgKi8KICAgIAogICAgZnVuY3Rpb24gaXNNdWx0aXNlbGVjdENvbXBvbmVudCgpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5tdWx0aXNlbGVjdCB8fCAkdGhpcy0+cGFyYW1zWyJtdWx0aXNlbGVjdCJdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0xvb2t1cENvbXBvbmVudCgpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5faW1wbGVtZW50cygiTG9va3VwQ29tcG9uZW50IikpOwogICAgfQp9Cg==ZnVuY3Rpb24gVFRleHRFZGl0KHBhcmFtcywgaWQpICAgCnsKICAgIGlmICghaWQpCiAgICAgICAgaWQgPSBVVUlEKCk7CiAgICAgICAgCiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUVGV4dEVkaXQsIFRDb21wb25lbnQpOwoKVFRleHRFZGl0LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuX19vYmplY3RSZXBsYWNlRXZlbnRzID0gWyJvbkdldFZhbHVlRnJvbVBhdHRlcm4iLCAib25HZXRWYWx1ZUFzUGF0dGVybiJdOwogICAgCiAgICAvL2FsZXJ0KHRoaXMuaWQpOwogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CgogICAgdGhpcy5fcHJlZml4ID0gIiI7CiAgICB0aGlzLl9wb3N0Zml4ID0gIiI7CgogICAgaWYgKHRoaXMuaGFzUGF0dGVybigpKQogICAgewogICAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsOyAvLyBrdnVsaSBvbkNoYW5nZSwga2RlIGplICh0aGlzLmNvbnRhaW5lci52YWx1ZSB8fCB0aGlzLmVsZW1lbnQudmFsdWUpCiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0aGlzLl9lbGVtZW50LnRhZ05hbWUpOwogICAgICAgIGNvcHlFbGVtZW50UHJvcGVydGllcyh0aGlzLl9lbGVtZW50LCB0aGlzLmVsZW1lbnQsIFtdLCBbInR5cGUiLCJuYW1lIiwiaWQiXSk7CiAgICAgICAgCiAgICAgICAgaW5zZXJ0QmVmb3JlKHRoaXMuX2VsZW1lbnQsIHRoaXMuZWxlbWVudCk7CiAgICAgICAgCiAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIG1vdmUgaGlkZGVuIGlucHV0IG91dCAoZHVlIHRvIEJ1dHRvbkVkaXQsIC4uLiBDU1MgZWxlbSArIGVsZW0gc3R5bGluZykKICAgICAgICAvL3RoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9lbGVtZW50KTsKICAgICAgICAvL3RoaXMuZWxlbWVudC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpOwoKICAgICAgICAvL2R1bXAodGhpcy5fZWxlbWVudCk7CiAgICAgICAgLy9kdW1wKGlzRm9ybUVsZW1lbnQodGhpcy5fZWxlbWVudCkpOwogICAgICAgIGlmIChpc0Zvcm1FbGVtZW50KHRoaXMuX2VsZW1lbnQpKQogICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gY2hhbmdlQXR0cmlidXRlKHRoaXMuX2VsZW1lbnQsICJ0eXBlIiwgImhpZGRlbiIpOyAvLyBJRTgKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNldFN0eWxlKHRoaXMuX2VsZW1lbnQsICJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAKICAgICAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJwcmVmaXgiXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHRoaXMucGFyYW1zWyJwcmVmaXgiXSA9ICIiOwogICAgICAgIGlmICh0eXBlb2YodGhpcy5wYXJhbXNbInBvc3RmaXgiXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHRoaXMucGFyYW1zWyJwb3N0Zml4Il0gPSAiIjsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUgPT0gdGhpcy5fY2xhc3NOYW1lKSAvLyBjYWxsZWQgb25seSBpZiB0aGlzIGlzIGZpbmFsIG9iamVjdCBjbGFzcwogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVBc1BhdHRlcm4odGhpcy5fZWxlbWVudC52YWx1ZSk7CiAgICAgICAgICAgIHRoaXMuX29sZFZhbHVlU2V0ID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLl9lbGVtZW50LnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAiZm9jdXMiLCBmdW5jdGlvbihlKXtfdGhpcy5fb25QYXR0ZXJuRm9jdXMoZSl9KTsKICAgICAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJibHVyIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uUGF0dGVybkJsdXIoZSl9KTsKICAgIH0KICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgaWYgKHRoaXMucGFyYW1zWyJ0YWdOYW1lIl0pCiAgICB7CiAgICAgICAgdGhpcy5pbnB1dFRhZ05hbWUgPSB0aGlzLnBhcmFtc1sidGFnTmFtZSJdOwogICAgfQogICAgCiAgICBpZiAodGhpcy5pbnB1dFRhZ05hbWUgJiYgdGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0aGlzLmlucHV0VGFnTmFtZSkKICAgIHsKICAgICAgICB0aGlzLmVsZW1lbnRzLnB1c2godGhpcy5lbGVtZW50KTsKCiAgICAgICAgLy9hbGVydChvdXRlckhUTUwodGhpcy5lbGVtZW50KSk7CiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuZWxlbWVudDsKICAgICAgICB0aGlzLmVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHRoaXMuaW5wdXRUYWdOYW1lKTsKICAgICAgICBpZiAodGhpcy5pbnB1dFRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiaW5wdXQiKQogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQiKTsgLy8gbXVzdCB1c2Ugc2V0QXR0cmlidXRlIC0gSUU4CiAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50ID0gY2hhbmdlQXR0cmlidXRlKHRoaXMuZWxlbWVudCwgInR5cGUiLCAidGV4dCIpOwogICAgICAgIGlmICh0aGlzLmlucHV0VGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJidXR0b24iKQogICAgICAgICAgICAvL3RoaXMuZWxlbWVudCA9IGNoYW5nZUF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsICJ0eXBlIiwgImJ1dHRvbiIpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgImJ1dHRvbiIpOyAvLyBtdXN0IHVzZSBzZXRBdHRyaWJ1dGUgLSBJRTgKCiAgICAgICAgY29weUVsZW1lbnRQcm9wZXJ0aWVzKHRoaXMuX2VsZW1lbnQsIHRoaXMuZWxlbWVudCwgW10sIFsidHlwZSJdKTsKICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5lbGVtZW50LCAiX0NvbXBvbmVudFRhZ05hbWUiKTsKICAgICAgICAKICAgICAgICAvL3RoaXMuX2VsZW1lbnQuaWQgPSAiIjsKICAgICAgICB0aGlzLmVsZW1lbnQuaWQgPSAiIjsKICAgICAgICAvL2R1bXAoIj09PT0iKTsKICAgICAgICAvL2R1bXAodGhpcy5fZWxlbWVudCk7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgCiAgICAgICAgLy9hbGVydCh0aGlzLmVsZW1lbnQpOwogICAgICAgIC8vYWxlcnQodGhpcy5pbnB1dFRhZ05hbWUpOwogICAgICAgIC8vYWxlcnQodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gInRleHRhcmVhIikKICAgICAgICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX2VsZW1lbnQudmFsdWU7CiAgICAgICAgZWxzZSBpZiAodGhpcy5pbnB1dFRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiaW5wdXQiKQogICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLl9lbGVtZW50LnZhbHVlOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50LnZhbHVlID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IFpXU1A7CiAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuZWxlbWVudC52YWx1ZSB8fCBaV1NQOwogICAgICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50LnZhbHVlKTsKICAgICAgICB9CgogICAgICAgIAogICAgICAgIC8vYWxlcnQoJ3gnKTsKICAgICAgICAvL2R1bXAodGhpcy5pZCk7CiAgICAgICAgLy8vZHVtcCh0aGlzLl9lbGVtZW50KTsKICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50KTsKICAgICAgICBpbnNlcnRCZWZvcmUodGhpcy5fZWxlbWVudCwgdGhpcy5lbGVtZW50KTsKCiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gInRleHRhcmVhIikKICAgICAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9lbGVtZW50KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgCiAgICAgICAgLy90aGlzLmVsZW1lbnRzLnB1c2godGhpcy5lbGVtZW50KTsKCiAgICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lID09IHRoaXMuX2NsYXNzTmFtZSkgLy8gY2FsbGVkIG9ubHkgaWYgdGhpcyBpcyBmaW5hbCBvYmplY3QgY2xhc3MKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMub2xkVmFsdWUgPSB0aGlzLl9lbGVtZW50LnZhbHVlOwogICAgICAgICAgICB0aGlzLl9vbGRWYWx1ZVNldCA9IHRydWU7CiAgICAgICAgCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fZWxlbWVudC52YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgdGhpcy5lbGVtZW50cy5wdXNoKHRoaXMuZWxlbWVudCk7CiAgICAKICAgIC8vIHRvIFNUT1AgYWRkaW5nIGNsYXNzIG5hbWVzCiAgICAvL3RoaXMuaW5wdXRUYWdOYW1lID0gIm5vbmUiOwogICAgLy9kdW1wKHRoaXMuaW5wdXRUYWdOYW1lKTsKICAgIAogICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAia2V5ZG93biIsIGZ1bmN0aW9uKCl7X3RoaXMuX29uQ2hhbmdlS2V5RG93bigpfSk7CiAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJibHVyIiwgZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoX3RoaXMub25DaGFuZ2VLZXlEb3duVGltZXIpfSk7ICAgIAogICAgICAgIAogICAgaWYgKHRoaXMucGFyYW1zWyJsaXN0Il0pCiAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAia2V5dXAiLCBmdW5jdGlvbigpe190aGlzLl9vbkdldERhdGFMaXN0KCl9KTsKICAgIAoKICAgIC8vIGlmIGluc2lkZSA8YSBkaXNhYmxlIGEgY2xpY2sgcHJvcGFnYXRpb24KICAgIC8vIEJVVCBOT1QgaWYgVEFHIGlzIHNldCB0byBub24gaW5wdXQgZWxlbWVudCEKICAgIGlmICghdGhpcy5wYXJhbXNbInRhZ05hbWUiXSkKICAgIHsKICAgICAgICB2YXIgZWxlbSA9IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlOwogICAgICAgIHdoaWxlKGVsZW0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lID09ICJBIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAiY2xpY2siLCBmdW5jdGlvbihlKXtlLnN0b3AoKX0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHRoaXMucGFyYW1zWyJmaXhlZFByZWZpeCJdICYmIHRoaXMucGFyYW1zWyJwcmVmaXgiXSB8fCB0aGlzLnBhcmFtc1siZml4ZWRQb3N0Zml4Il0gJiYgdGhpcy5wYXJhbXNbInBvc3RmaXgiXSkKICAgIHsKICAgICAgICAvLyBtdXN0IGhhdmUgd2lkdGgKICAgICAgICBpZiAoIWdldFN0eWxlKHRoaXMuZWxlbWVudCwgIndpZHRoIikpCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm91dGVyV2lkdGgiKTsKCiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJmb2N1cyIsIGZ1bmN0aW9uKCl7X3RoaXMuX29uUHJlZml4Rm9jdXMoKX0pOwogICAgICAgIGFkZEV2ZW50KHRoaXMuZWxlbWVudCwgImJsdXIiLCBmdW5jdGlvbigpe190aGlzLl9vblByZWZpeEJsdXIoKX0pOwogICAgICAgIGFkZEV2ZW50KHRoaXMuZWxlbWVudCwgInJlc2l6ZSIsIGZ1bmN0aW9uKCl7X3RoaXMucmVzaXplRml4ZWRQcmVmaXhQb3N0Zml4U3BhbigpfSk7CiAgICAgICAgCiAgICB9CiAgICAKICAgIC8vIG11c3QgYmUgaW4gcmV2ZXJzZSBvcmRlcgogICAgaWYgKHRoaXMucGFyYW1zWyJmaXhlZFBvc3RmaXgiXSAmJiB0aGlzLnBhcmFtc1sicG9zdGZpeCJdKQogICAgewogICAgICAgIHRoaXMucG9zdGZpeFNwYW4gPSBjcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5jbGFzc05hbWUgPSB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lOwogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLnBvc3RmaXhTcGFuLCAiX1RleHRFZGl0Rml4ZWRQb3N0Zml4Iik7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5pbm5lckhUTUwgPSB0aGlzLnBhcmFtc1sicG9zdGZpeCJdWzBdIHx8IHRoaXMucGFyYW1zWyJwb3N0Zml4Il07CgogICAgICAgIGluc2VydEFmdGVyKHRoaXMuZWxlbWVudCwgdGhpcy5wb3N0Zml4U3Bhbik7CgogICAgICAgIGlmICghdGhpcy5maXhlZFBvc3RmaXhBbHdheXNWaXNpYmxlKQogICAgICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgCiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBhZGRFdmVudCh0aGlzLnBvc3RmaXhTcGFuLCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSl7ZSA9IGdldEV2ZW50KGUpOyBlLnN0b3AoKX0pOwogICAgfQogICAgCiAgICAvL2R1bXAodGhpcy5wYXJhbXNbInByZWZpeCJdKTsKICAgIGlmICh0aGlzLnBhcmFtc1siZml4ZWRQcmVmaXgiXSAmJiB0aGlzLnBhcmFtc1sicHJlZml4Il0pCiAgICB7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuID0gY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgIHRoaXMucHJlZml4U3Bhbi5jbGFzc05hbWUgPSB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lOwogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLnByZWZpeFNwYW4sICJfVGV4dEVkaXRGaXhlZFByZWZpeCIpOwogICAgICAgIHRoaXMucHJlZml4U3Bhbi5pbm5lckhUTUwgPSB0aGlzLnBhcmFtc1sicHJlZml4Il1bMF0gfHwgdGhpcy5wYXJhbXNbInByZWZpeCJdOwoKICAgICAgICBpbnNlcnRBZnRlcih0aGlzLmVsZW1lbnQsIHRoaXMucHJlZml4U3Bhbik7CgogICAgICAgIGlmICghdGhpcy5maXhlZFByZWZpeEFsd2F5c1Zpc2libGUpCiAgICAgICAgICAgIHRoaXMucHJlZml4U3Bhbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIAogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgYWRkRXZlbnQodGhpcy5wcmVmaXhTcGFuLCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSl7ZSA9IGdldEV2ZW50KGUpOyBlLnN0b3AoKX0pOwogICAgfQoKICAgIGlmICh0aGlzLnBhcmFtc1siZml4ZWRQcmVmaXgiXSAmJiB0aGlzLnBhcmFtc1sicHJlZml4Il0gfHwgdGhpcy5wYXJhbXNbImZpeGVkUG9zdGZpeCJdICYmIHRoaXMucGFyYW1zWyJwb3N0Zml4Il0pCiAgICB7CiAgICAgICAgaWYgKHRoaXMuZml4ZWRQcmVmaXhBbHdheXNWaXNpYmxlIHx8IHRoaXMuZml4ZWRQb3N0Zml4QWx3YXlzVmlzaWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgY2FsbChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgX3RoaXMuX29uUHJlZml4Rm9jdXMoKTsKICAgICAgICAgICAgICAgIF90aGlzLl9vblByZWZpeEJsdXIoKTsKICAgICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vdGhpcy5yZXNpemVGaXhlZFByZWZpeFBvc3RmaXhTcGFuKCk7CiAgICB9CiAgICAKICAgIGlmICgodGhpcy5wYXJhbXNbInByZWZpeCJdIHx8IHRoaXMucGFyYW1zWyJwb3N0Zml4Il0pICYmIHRoaXMucGFyYW1zWyJzZW5kUGF0dGVybiJdID09PSBmYWxzZSkKICAgIHsKICAgICAgICB0aGlzLmV4dGVuZE1ldGhvZCgiX29uQ2hhbmdlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudC52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUGF0dGVybih0aGlzLl9lbGVtZW50LnZhbHVlKTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy5lbGVtZW50LnZhbHVlKTsKICAgIH0gICAgCgogICAgaWYgKHRoaXMucGFyYW1zWyJhbGxvd2VkQ2hhcnMiXSB8fCB0aGlzLnBhcmFtc1siZGVuaWVkQ2hhcnMiXSkKICAgIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGFkZEV2ZW50KHdpbmRvdywgImtleXByZXNzIiwgZnVuY3Rpb24oZSl7X3RoaXMuX29uQWxsb3dlZERlbmllZENoYXJzS2V5UHJlc3MoZSl9KTsKICAgIH0KfQoKLyoKVFRleHRFZGl0LnByb3RvdHlwZS5hZnRlckNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJlbnRfYWZ0ZXJDcmVhdGUoKTsKICAgIAogICAgaWYgKHRoaXMuaW5wdXRUYWdOYW1lICYmICFpc0Zvcm1FbGVtZW50KHRoaXMuZWxlbWVudCkpCiAgICB7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9UZXh0RWRpdCIpOwogICAgICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmVsZW1lbnQsICJfQ29tcG9uZW50Iik7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9CdXR0b25FZGl0Iik7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9DdXJyZW5jeUVkaXQiKTsKICAgIH0KfQoqLwoKVFRleHRFZGl0LnByb3RvdHlwZS5fb25BbGxvd2VkRGVuaWVkQ2hhcnNLZXlQcmVzcyA9IGZ1bmN0aW9uKGUpCnsKICAgIGUgPSBnZXRLZXlFdmVudChlKTsKICAgIAogICAgaWYgKGUudGFyZ2V0ID09IHRoaXMuZWxlbWVudCAmJiBlLmtleSkKICAgIHsKICAgICAgICB2YXIgYyA9IGUua2V5OwogICAgICAgIGlmICh0aGlzLnBhcmFtc1siYWxsb3dlZENoYXJzIl0pCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRoaXMucGFyYW1zWyJhbGxvd2VkQ2hhcnMiXSwgImkiKTsKICAgICAgICAgICAgaWYgKCFjLm1hdGNoKHJlKSkKICAgICAgICAgICAgICAgIGUuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5wYXJhbXNbImRlbmllZENoYXJzIl0pCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRoaXMucGFyYW1zWyJkZW5pZWRDaGFycyJdLCAiaSIpOwogICAgICAgICAgICBpZiAoYy5tYXRjaChyZSkpCiAgICAgICAgICAgICAgICBlLnN0b3AoKTsKICAgICAgICB9CiAgICB9Cn0KCgpUVGV4dEVkaXQucHJvdG90eXBlLmhhc1BhdHRlcm4gPSBmdW5jdGlvbigpCnsKICAgIC8vZHVtcCh0aGlzLnBhcmFtc1siZXZlbnRzIl0pOwogICAgLy9kdW1wKHRoaXMucGFyYW1zWyJvbkdldFZhbHVlRnJvbVBhdHRlcm4iXSk7CiAgICAvL2R1bXAodHlwZW9mKHRoaXMucGFyYW1zWyJvbkdldFZhbHVlRnJvbVBhdHRlcm4iXSkgIT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mKHRoaXMucGFyYW1zWyJvbkdldFZhbHVlQXNQYXR0ZXJuIl0pICE9ICJ1bmRlZmluZWQiKTsKICAgIHJldHVybih0eXBlb2YodGhpcy5wYXJhbXNbInByZWZpeCJdKSAhPSAidW5kZWZpbmVkIiAmJiB0aGlzLnBhcmFtc1sicHJlZml4Il0gIT0gIiIgfHwgdHlwZW9mKHRoaXMucGFyYW1zWyJwb3N0Zml4Il0pICE9ICJ1bmRlZmluZWQiICYmIHRoaXMucGFyYW1zWyJwb3N0Zml4Il0gIT0gIiIgfHwgKHRoaXMucGFyYW1zWyJldmVudHMiXSAmJiAodHlwZW9mKHRoaXMucGFyYW1zWyJldmVudHMiXVsib25HZXRWYWx1ZUZyb21QYXR0ZXJuIl0pICE9ICJ1bmRlZmluZWQiIHx8IHR5cGVvZih0aGlzLnBhcmFtc1siZXZlbnRzIl1bIm9uR2V0VmFsdWVBc1BhdHRlcm4iXSkgIT0gInVuZGVmaW5lZCIpKSk7Cn0KClRUZXh0RWRpdC5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24oKQp7CiAgICBpZiAodHlwZW9mKHRoaXMuX2VsZW1lbnRQYWRkaW5nTGVmdCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1sZWZ0Iik7CiAgICBpZiAodHlwZW9mKHRoaXMuX2VsZW1lbnRQYWRkaW5nUmlnaHQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMuX2VsZW1lbnRQYWRkaW5nUmlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJwYWRkaW5nLXJpZ2h0Iik7CgogICAgdGhpcy5yZXNpemVGaXhlZFByZWZpeFBvc3RmaXhTcGFuKCk7CiAgICAKICAgIHRoaXMucGFyZW50X3JlZHJhdygpOwp9CgovKgpUVGV4dEVkaXQucHJvdG90eXBlLnJlc2l6ZUZpeGVkUHJlZml4UG9zdGZpeFNwYW4gPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLnByZWZpeFNwYW4pCiAgICB7CiAgICAgICAgdmFyIF9kaXNwbGF5ID0gdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUubWFyZ2luUmlnaHQgPSAiMHB4IjsKICAgICAgICAvL3RoaXMucHJlZml4U3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICAgLy90aGlzLnByZWZpeFNwYW4uc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCAjRkYwMDAwIjsKICAgICAgICAKICAgICAgICBpZiAoIXRoaXMuZml4ZWRQcmVmaXhBbHdheXNWaXNpYmxlKQogICAgICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUud2lkdGggPSAiYXV0byI7CgogICAgICAgIGlmICh0aGlzLmZvY3VzZWQgfHwgdGhpcy5maXhlZFByZWZpeEFsd2F5c1Zpc2libGUpCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9IGV4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50UGFkZGluZ0xlZnQpK2V4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLnByZWZpeFNwYW4sICJvdXRlcldpZHRoIikpKyJweCI7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9lbGVtZW50UGFkZGluZ0xlZnQ7CiAgICAgICAgICAgIAogICAgICAgIC8vdmFyIHBMID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBhZGRpbmctbGVmdCIpKTsKICAgICAgICAvL3ZhciBwUiA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJwYWRkaW5nLXJpZ2h0IikpOwogICAgICAgIHZhciB3RSA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJvdXRlcldpZHRoIikpOwogICAgICAgIHZhciBtRSA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tcmlnaHQiKSk7CiAgICAgICAgdmFyIHdTID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMucHJlZml4U3BhbiwgIm91dGVyV2lkdGgiKSk7CiAgICAgICAgdmFyIHdQTCA9IGV4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50UGFkZGluZ0xlZnQpOwogICAgICAgIC8vdmFyIGhFID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm91dGVySGVpZ2h0IikpOwogICAgICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gd1MrInB4IjsKICAgICAgICAvL3RoaXMucHJlZml4U3Bhbi5zdHlsZS53aWR0aCA9ICJhdXRvIjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUuaGVpZ2h0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAib3V0ZXJIZWlnaHQiKTsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUubGluZUhlaWdodCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm91dGVySGVpZ2h0Iik7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLnBhZGRpbmdUb3AgPSAiMHB4IjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUucGFkZGluZ0JvdHRvbSA9ICIwcHgiOwogICAgICAgIC8vdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmhlaWdodCA9IChoRSsyKSsicHgiOwogICAgICAgIC8vdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmxpbmVIZWlnaHQgPSAoaEUrMikrInB4IjsKICAgICAgICAvL3RoaXMucHJlZml4U3Bhbi5zdHlsZS5ib3JkZXIgPSAiMXB4IHNvbGlkICNGRjAwMDAiOwogICAgICAgIHRoaXMucHJlZml4U3Bhbi5zdHlsZS5wYWRkaW5nTGVmdCA9IHdQTCsicHgiOwogICAgICAgIHRoaXMucHJlZml4U3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gKC0xKSp3RSttRSsicHgiOwogICAgICAgIGlmICghdGhpcy5wb3N0Zml4U3BhbikKICAgICAgICB7CiAgICAgICAgICAgIC8vdGhpcy5wcmVmaXhTcGFuLnN0eWxlLm1hcmdpblJpZ2h0ID0gKHdFLXdTK3dQTCkrInB4IjsKICAgICAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLm1hcmdpblJpZ2h0ID0gKHdFLXdTKSsicHgiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2R1bXAod0UpOwogICAgICAgIC8vZHVtcCh3Uyk7CiAgICAgICAgLy9kdW1wKHdQTCk7CiAgICAgICAgICAgIAogICAgICAgIHRoaXMucHJlZml4U3Bhbi5zdHlsZS5kaXNwbGF5ID0gX2Rpc3BsYXk7CiAgICB9CiAgICBpZiAodGhpcy5wb3N0Zml4U3BhbikKICAgIHsKICAgICAgICB2YXIgX2Rpc3BsYXkgPSB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjBweCI7CiAgICAgICAgLy90aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgI0ZGMDAwMCI7CgogICAgICAgIGlmICghdGhpcy5maXhlZFBvc3RmaXhBbHdheXNWaXNpYmxlKQogICAgICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLndpZHRoID0gImF1dG8iOwoKICAgICAgICBpZiAodGhpcy5mb2N1c2VkIHx8IHRoaXMuZml4ZWRQb3N0Zml4QWx3YXlzVmlzaWJsZSkKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IGV4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0KStleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wb3N0Zml4U3BhbiwgIm91dGVyV2lkdGgiKSkrInB4IjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0OwoKICAgICAgICB2YXIgd0UgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAib3V0ZXJXaWR0aCIpKTsKICAgICAgICB2YXIgd1MgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wb3N0Zml4U3BhbiwgIm91dGVyV2lkdGgiKSk7CiAgICAgICAgaWYgKHRoaXMucHJlZml4U3BhbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB3UEwgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0KTsKICAgICAgICAgICAgdmFyIHdQTEwgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wcmVmaXhTcGFuLCAib3V0ZXJXaWR0aCIpKTsKICAgICAgICAgICAgdmFyIHdQTExMID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBhZGRpbmctbGVmdCIpKTsKICAgICAgICAgICAgLy9kdW1wKHdFKTsKICAgICAgICAgICAgLy9kdW1wKHdTKTsKICAgICAgICAgICAgLy9kdW1wKHdQTCk7CiAgICAgICAgICAgIC8vZHVtcCh3UExMKTsKICAgICAgICAgICAgLy9kdW1wKHdQTExMKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXIgd1BMID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBhZGRpbmctbGVmdCIpKTsKICAgICAgICAgICAgCiAgICAgICAgLy9pZiAodGhpcy5wcmVmaXhTcGFuKQogICAgICAgIC8vewogICAgICAgIC8vICAgIHZhciB3UFIgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdSaWdodCk7CiAgICAgICAgLy99CiAgICAgICAgLy9lbHNlCiAgICAgICAgICAgIHZhciB3UFIgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1yaWdodCIpKTsKICAgICAgICAgICAgdmFyIHdQUlIgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdSaWdodCk7CgogICAgICAgIAogICAgICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHdTKyJweCI7CiAgICAgICAgLy90aGlzLnBvc3RmaXhTcGFuLnN0eWxlLndpZHRoID0gImF1dG8iOwogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUuaGVpZ2h0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAib3V0ZXJIZWlnaHQiKTsKICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmxpbmVIZWlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJvdXRlckhlaWdodCIpOwogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUucGFkZGluZ1RvcCA9ICIwcHgiOwogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUucGFkZGluZ0JvdHRvbSA9ICIwcHgiOwogICAgICAgIGlmICh0aGlzLnByZWZpeFNwYW4pCiAgICAgICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUucGFkZGluZ1JpZ2h0ID0gd1BSUisicHgiOwoKICAgICAgICBpZiAodGhpcy5wcmVmaXhTcGFuKQogICAgICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLm1hcmdpbkxlZnQgPSAod0Utd1BMTEwtd1BSKzIqd1BSUikrInB4IjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUubWFyZ2luTGVmdCA9ICgtMSkqKHdTKSsicHgiOwoKICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmRpc3BsYXkgPSBfZGlzcGxheTsKICAgIH0KfQoqLwpUVGV4dEVkaXQucHJvdG90eXBlLnJlc2l6ZUZpeGVkUHJlZml4UG9zdGZpeFNwYW4gPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLnByZWZpeFNwYW4pCiAgICB7CiAgICAgICAgdmFyIF9kaXNwbGF5ID0gdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUubWFyZ2luUmlnaHQgPSAiMHB4IjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIC8vdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgI0ZGMDAwMCI7CiAgICAgICAgCiAgICAgICAgaWYgKCF0aGlzLmZpeGVkUHJlZml4QWx3YXlzVmlzaWJsZSkKICAgICAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLndpZHRoID0gImF1dG8iOwoKICAgICAgICBpZiAodGhpcy5mb2N1c2VkIHx8IHRoaXMuZml4ZWRQcmVmaXhBbHdheXNWaXNpYmxlKQogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0KStleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wcmVmaXhTcGFuLCAib3V0ZXJXaWR0aCIpKSsicHgiOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gdGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0OwogICAgICAgICAgICAKICAgICAgICAvL3ZhciBwTCA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJwYWRkaW5nLWxlZnQiKSk7CiAgICAgICAgLy92YXIgcFIgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1yaWdodCIpKTsKICAgICAgICB2YXIgd0UgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAib3V0ZXJXaWR0aCIpKTsKICAgICAgICB2YXIgbUUgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAibWFyZ2luLXJpZ2h0IikpOwogICAgICAgIHZhciB3UyA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLnByZWZpeFNwYW4sICJvdXRlcldpZHRoIikpOwogICAgICAgIHZhciB3UEwgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0KTsKICAgICAgICAvL3ZhciBoRSA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJvdXRlckhlaWdodCIpKTsKICAgICAgICAvL3RoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9IHdTKyJweCI7CiAgICAgICAgLy90aGlzLnByZWZpeFNwYW4uc3R5bGUud2lkdGggPSAiYXV0byI7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmhlaWdodCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm91dGVySGVpZ2h0Iik7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmxpbmVIZWlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJvdXRlckhlaWdodCIpOwogICAgICAgIHRoaXMucHJlZml4U3Bhbi5zdHlsZS5wYWRkaW5nVG9wID0gIjBweCI7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLnBhZGRpbmdCb3R0b20gPSAiMHB4IjsKICAgICAgICAvL3RoaXMucHJlZml4U3Bhbi5zdHlsZS5oZWlnaHQgPSAoaEUrMikrInB4IjsKICAgICAgICAvL3RoaXMucHJlZml4U3Bhbi5zdHlsZS5saW5lSGVpZ2h0ID0gKGhFKzIpKyJweCI7CiAgICAgICAgLy90aGlzLnByZWZpeFNwYW4uc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCAjRkYwMDAwIjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUucGFkZGluZ0xlZnQgPSB3UEwrInB4IjsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUubWFyZ2luTGVmdCA9ICgtMSkqd0UrbUUrInB4IjsKICAgICAgICAKICAgICAgICAvL2R1bXAod0UpOwogICAgICAgIC8vZHVtcCh3Uyk7CiAgICAgICAgLy9kdW1wKHdQTCk7CiAgICAgICAgICAgIAogICAgICAgIHRoaXMucHJlZml4U3Bhbi5zdHlsZS5kaXNwbGF5ID0gX2Rpc3BsYXk7CiAgICB9CiAgICBpZiAodGhpcy5wb3N0Zml4U3BhbikKICAgIHsKICAgICAgICB2YXIgX2Rpc3BsYXkgPSB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjBweCI7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICAgLy90aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgI0ZGMDAwMCI7CgogICAgICAgIGlmICghdGhpcy5maXhlZFBvc3RmaXhBbHdheXNWaXNpYmxlKQogICAgICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLndpZHRoID0gImF1dG8iOwoKICAgICAgICBpZiAodGhpcy5mb2N1c2VkIHx8IHRoaXMuZml4ZWRQb3N0Zml4QWx3YXlzVmlzaWJsZSkKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IGV4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0KStleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wb3N0Zml4U3BhbiwgIm91dGVyV2lkdGgiKSkrInB4IjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0OwoKICAgICAgICB2YXIgd0UgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAib3V0ZXJXaWR0aCIpKTsKICAgICAgICB2YXIgd1MgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wb3N0Zml4U3BhbiwgIm91dGVyV2lkdGgiKSk7CiAgICAgICAgaWYgKHRoaXMucHJlZml4U3BhbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB3UEwgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0KTsKICAgICAgICAgICAgdmFyIHdQTEwgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5wcmVmaXhTcGFuLCAib3V0ZXJXaWR0aCIpKTsKICAgICAgICAgICAgdmFyIHdQTExMID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBhZGRpbmctbGVmdCIpKTsKICAgICAgICAgICAgLy9kdW1wKHdFKTsKICAgICAgICAgICAgLy9kdW1wKHdTKTsKICAgICAgICAgICAgLy9kdW1wKHdQTCk7CiAgICAgICAgICAgIC8vZHVtcCh3UExMKTsKICAgICAgICAgICAgLy9kdW1wKHdQTExMKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXIgd1BMID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBhZGRpbmctbGVmdCIpKTsKICAgICAgICAgICAgCiAgICAgICAgLy9pZiAodGhpcy5wcmVmaXhTcGFuKQogICAgICAgIC8vewogICAgICAgIC8vICAgIHZhciB3UFIgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdSaWdodCk7CiAgICAgICAgLy99CiAgICAgICAgLy9lbHNlCiAgICAgICAgICAgIHZhciB3UFIgPSBleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1yaWdodCIpKTsKICAgICAgICAgICAgdmFyIHdQUlIgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdSaWdodCk7CgogICAgICAgIAogICAgICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHdTKyJweCI7CiAgICAgICAgLy90aGlzLnBvc3RmaXhTcGFuLnN0eWxlLndpZHRoID0gImF1dG8iOwogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUuaGVpZ2h0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAib3V0ZXJIZWlnaHQiKTsKICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmxpbmVIZWlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJvdXRlckhlaWdodCIpOwogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUucGFkZGluZ1RvcCA9ICIwcHgiOwogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUucGFkZGluZ0JvdHRvbSA9ICIwcHgiOwogICAgICAgIGlmICh0aGlzLnByZWZpeFNwYW4pCiAgICAgICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUucGFkZGluZ1JpZ2h0ID0gd1BSUisicHgiOwoKICAgICAgICAvL2lmICh0aGlzLnByZWZpeFNwYW4pCiAgICAgICAgLy8gICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gKHdFLXdQTExMLXdQUisyKndQUlIpKyJweCI7CiAgICAgICAgLy9lbHNlCiAgICAgICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUubWFyZ2luTGVmdCA9ICgtMSkqKHdTKSsicHgiOwoKICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLnN0eWxlLmRpc3BsYXkgPSBfZGlzcGxheTsKICAgIH0KfQpUVGV4dEVkaXQucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwoKICAgIGlmICh0eXBlb2YodmFsdWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHZhbHVlID0gIiI7CiAgICAKICAgIGlmICh0eXBlb2YodmFsdWUpID09ICJvYmplY3QiKQogICAgICAgIHZhbHVlID0gSlNPTi5lbmNvZGUodmFsdWUpOwogICAgCiAgICAvL2R1bXAoInNldFZhbHVlMjoiK3ZhbHVlKTsKICAgIC8vZHVtcCh0aGlzLmhhc1BhdHRlcm4oKSk7CiAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKCkpCiAgICB7CiAgICAgICAgaWYgKHRoaXMuZml4ZWRQcmVmaXhBbHdheXNWaXNpYmxlIHx8IHRoaXMuZml4ZWRQb3N0Zml4QWx3YXlzVmlzaWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5wYXJlbnRfc2V0VmFsdWUoX3ZhbHVlKTsKICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbVBhdHRlcm4odmFsdWUpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudC52YWx1ZSA9IF92YWx1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCItIik7CiAgICAgICAgICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZUFzUGF0dGVybih2YWx1ZSk7CiAgICAgICAgICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAgICAgICAgIHRoaXMucGFyZW50X3NldFZhbHVlKHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgdGhpcy5wYXJlbnRfc2V0VmFsdWUodmFsdWUpOwogICAgCiAgICAvKgogICAgaWYgKHRoaXMuaGFzUGF0dGVybigpKQogICAgewogICAgICAgIHRoaXMuX2VsZW1lbnQudmFsdWUgPSB0aGlzLmdldFZhbHVlQXNQYXR0ZXJuKHZhbHVlKTsKICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbVBhdHRlcm4odmFsdWUpOwogICAgfQogICAgKi8KfQoKVFRleHRFZGl0LnByb3RvdHlwZS5fb25DaGFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgLy9kdW1wKCIhISEhIit0aGlzLmlkKTsKICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lcik7CiAgICAvL2R1bXAodGhpcy5jb250YWluZXIudmFsdWUpOwogICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAvL2R1bXAodGhpcy5lbGVtZW50LnZhbHVlKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIC8vZHVtcCgxKTsKICAgIGlmICh0aGlzLmhhc1BhdHRlcm4oKS8qICYmICovKQogICAgewogICAgICAgIGlmICghdGhpcy5hdXRvUHJlZml4RGlzYWJsZWQgJiYgIXRoaXMuYXV0b1Bvc3RmaXhEaXNhYmxlZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLmdldFZhbHVlQXNQYXR0ZXJuKHZhbHVlKSk7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQudmFsdWUgPSB0aGlzLmdldFZhbHVlQXNQYXR0ZXJuKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudC52YWx1ZSA9IHZhbHVlOwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICB9CiAgICAKICAgIHRoaXMucGFyZW50X19vbkNoYW5nZSh2YWx1ZSk7CiAgICAvL3RoaXMub25DaGFuZ2UodGhpcy5nZXRWYWx1ZSgpKTsKICAgIC8vZHVtcCgiPz8iKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAvL2R1bXAodGhpcy5fZWxlbWVudC52YWx1ZSk7Cn0KClRUZXh0RWRpdC5wcm90b3R5cGUub25DaGFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkKewp9CiAgICAKVFRleHRFZGl0LnByb3RvdHlwZS5leHRyYWN0UHJlZml4ID0gZnVuY3Rpb24odmFsdWUsIHByZWZpeEZvcm1hdCkKewogICAgaWYgKHR5cGVvZihwcmVmaXhGb3JtYXQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHByZWZpeEZvcm1hdCA9IHRoaXMucGFyYW1zWyJwcmVmaXgiXTsKCiAgICBpZiAodHlwZW9mKHByZWZpeEZvcm1hdCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgcmV0dXJuKCIiKTsKICAgIAogICAgdmFsdWUgPSB2YWx1ZSsnJzsKCiAgICBpZiAodmFsdWUgPT0gIiIpCiAgICAgICAgcmV0dXJuKCIiKTsKICAgIAogICAgdmFyIHByZWZpeCA9ICIiOwogICAgdmFyIHByZWZpeGVzID0gZXhwbG9kZUxpc3QocHJlZml4Rm9ybWF0KTsKICAgIHByZWZpeGVzLnNvcnQoZnVuY3Rpb24oYSwgYil7IHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoOyB9KTsgICAgCiAgICAKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHByZWZpeGVzLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBpZiAocHJlZml4ZXNbaV0gIT0gIiIgJiYgdmFsdWUuc3Vic3RyaW5nKDAsIHByZWZpeGVzW2ldLmxlbmd0aCkgPT0gcHJlZml4ZXNbaV0pCiAgICAgICAgewogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1tpXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4ocHJlZml4KTsKfQogICAgClRUZXh0RWRpdC5wcm90b3R5cGUuZXh0cmFjdFBvc3RmaXggPSBmdW5jdGlvbih2YWx1ZSwgcG9zdGZpeEZvcm1hdCkKewogICAgaWYgKHR5cGVvZihwb3N0Zml4Rm9ybWF0KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwb3N0Zml4Rm9ybWF0ID0gdGhpcy5wYXJhbXNbInBvc3RmaXgiXTsKICAgIAogICAgaWYgKHR5cGVvZihwb3N0Zml4Rm9ybWF0KSA9PSAidW5kZWZpbmVkIikKICAgICAgICByZXR1cm4oIiIpOwoKICAgIC8vZHVtcChwb3N0Zml4Rm9ybWF0KTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICB2YWx1ZSA9IHZhbHVlKycnOwoKICAgIGlmICh2YWx1ZSA9PSAiIikKICAgICAgICByZXR1cm4oIiIpOwogICAgICAgIAogICAgdmFyIHBvc3RmaXggPSAiIjsKICAgIHZhciBwb3N0Zml4ZXMgPSBleHBsb2RlTGlzdChwb3N0Zml4Rm9ybWF0KTsKICAgIHBvc3RmaXhlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDsgfSk7ICAgIAoKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHBvc3RmaXhlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgaWYgKHBvc3RmaXhlc1tpXSAhPSAiIiAmJiB2YWx1ZS5zdWJzdHJpbmcodmFsdWUubGVuZ3RoLXBvc3RmaXhlc1tpXS5sZW5ndGgsIHZhbHVlLmxlbmd0aCkgPT0gcG9zdGZpeGVzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgcG9zdGZpeCA9IHBvc3RmaXhlc1tpXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvL2R1bXAocG9zdGZpeCk7CiAgICByZXR1cm4ocG9zdGZpeCk7Cn0KClRUZXh0RWRpdC5wcm90b3R5cGUub25HZXRWYWx1ZUZyb21QYXR0ZXJuID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIHJldHVybigiIik7Cn0KClRUZXh0RWRpdC5wcm90b3R5cGUub25HZXRWYWx1ZUFzUGF0dGVybiA9IGZ1bmN0aW9uKHZhbHVlKQp7CiAgICByZXR1cm4oIiIpOwp9CgpUVGV4dEVkaXQucHJvdG90eXBlLmdldFZhbHVlRnJvbVBhdHRlcm4gPSBmdW5jdGlvbih2YWx1ZSkKewogICAgLy9kdW1wKHZhbHVlKTsKICAgIHZhbHVlID0gdmFsdWUrJyc7CiAgICBpZiAodmFsdWUgIT0gIiIpCiAgICB7CiAgICAgICAgdmFyIHZhbHVlMiA9IHRoaXMub25HZXRWYWx1ZUZyb21QYXR0ZXJuKHZhbHVlKTsKICAgICAgICBpZiAodmFsdWUyICE9ICIiKQogICAgICAgICAgICByZXR1cm4odmFsdWUyKTsKICAgIH0KCiAgICB2YXIgcHJlZml4ID0gdGhpcy5leHRyYWN0UHJlZml4KHZhbHVlKTsKICAgIHZhciBwb3N0Zml4ID0gdGhpcy5leHRyYWN0UG9zdGZpeCh2YWx1ZSk7CiAgICAKICAgIGlmIChwcmVmaXgpCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCwgdmFsdWUubGVuZ3RoKTsKICAgIGlmIChwb3N0Zml4KQogICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aC1wb3N0Zml4Lmxlbmd0aCk7CgogICAgcmV0dXJuKHZhbHVlKTsKfQogICAgClRUZXh0RWRpdC5wcm90b3R5cGUuZ2V0VmFsdWVBc1BhdHRlcm4gPSBmdW5jdGlvbih2YWx1ZSkKewogICAgLy9kdW1wKHZhbHVlKTsKICAgIGlmICh2YWx1ZSAhPSAiIikKICAgIHsKICAgICAgICB2YXIgdmFsdWUyID0gdGhpcy5vbkdldFZhbHVlQXNQYXR0ZXJuKHRoaXMuZ2V0VmFsdWVGcm9tUGF0dGVybih2YWx1ZSkpOwogICAgICAgIGlmICh2YWx1ZTIgIT0gIiIpCiAgICAgICAgICAgIHJldHVybih2YWx1ZTIpOwogICAgfQoKICAgIC8vdmFyIHByZWZpeGVzID0gZXhwbG9kZUxpc3QodGhpcy5wYXJhbXNbInByZWZpeCJdKTsKICAgIC8vdmFyIHBvc3RmaXhlcyA9IGV4cGxvZGVMaXN0KHRoaXMucGFyYW1zWyJwb3N0Zml4Il0pOwoKICAgIHZhciBwcmVmaXhlcyA9IGV4cGxvZGVMaXN0KHRoaXMub25HZXRQcmVmaXgoZXh0cmFjdEZsb2F0KHZhbHVlKSkgfHwgdGhpcy5wYXJhbXNbInByZWZpeCJdKTsKICAgIHZhciBwb3N0Zml4ZXMgPSBleHBsb2RlTGlzdCh0aGlzLm9uR2V0UG9zdGZpeChleHRyYWN0RmxvYXQodmFsdWUpKSB8fCB0aGlzLnBhcmFtc1sicG9zdGZpeCJdKTsKCiAgICAvL2R1bXAocG9zdGZpeGVzKTsKICAgIHZhciBleGNsdWRlZFBhdHRlcm5WYWx1ZXMgPSBleHBsb2RlTGlzdCh0aGlzLnBhcmFtc1siZXhjbHVkZWRQYXR0ZXJuVmFsdWVzIl0pOwoKICAgIC8vYWxlcnQodmFsdWUpOwogICAgdmFyIF92YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUGF0dGVybih2YWx1ZSk7CiAgICAvL2FsZXJ0KF92YWx1ZSk7CiAgICB2YXIgZXhjbHVkZWQgPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGV4Y2x1ZGVkUGF0dGVyblZhbHVlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGV4Y2x1ZGVkUGF0dGVyblZhbHVlID0gZXhjbHVkZWRQYXR0ZXJuVmFsdWVzW2ldOwogICAgICAgIGlmIChleGNsdWRlZFBhdHRlcm5WYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChleGNsdWRlZFBhdHRlcm5WYWx1ZS50ZXN0KF92YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGV4Y2x1ZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV4Y2x1ZGVkUGF0dGVyblZhbHVlWzBdID09ICIvIiAmJiBleGNsdWRlZFBhdHRlcm5WYWx1ZVtleGNsdWRlZFBhdHRlcm5WYWx1ZS5sZW5ndGgtMV0gPT0gIi8iKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChleGNsdWRlZFBhdHRlcm5WYWx1ZS5zdWJzdHIoMSwgZXhjbHVkZWRQYXR0ZXJuVmFsdWUubGVuZ3RoLTIpKTsKICAgICAgICAgICAgLy9kdW1wKGV4Y2x1ZGVkUGF0dGVyblZhbHVlLnN1YnN0cigxLCBleGNsdWRlZFBhdHRlcm5WYWx1ZS5sZW5ndGgtMikpOwogICAgICAgICAgICAvL2R1bXAoX3ZhbHVlKTsKICAgICAgICAgICAgLy9kdW1wKHJlLnRlc3QoX3ZhbHVlKSk7CiAgICAgICAgICAgIGlmIChyZS50ZXN0KF92YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGV4Y2x1ZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKF92YWx1ZSA9PSBleGNsdWRlZFBhdHRlcm5WYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGV4Y2x1ZGVkID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvL2lmICghaW5fYXJyYXkoX3ZhbHVlLCBleGNsdWRlZFBhdHRlcm5WYWx1ZXMpKQogICAgaWYgKCFleGNsdWRlZCkKICAgIHsKICAgICAgICB2YXIgX3ByZWZpeCA9IHRoaXMuZXh0cmFjdFByZWZpeCh2YWx1ZSkgfHwgdGhpcy5fcHJlZml4IHx8ICghdGhpcy5wYXJhbXNbImZpeGVkUHJlZml4Il0gJiYgcHJlZml4ZXMubGVuZ3RoID8gcHJlZml4ZXNbMF0gOiAocHJlZml4ZXMubGVuZ3RoID09IDEgPyBwcmVmaXhlc1swXSA6ICIiKSk7CiAgICAgICAgdmFyIF9wb3N0Zml4ID0gdGhpcy5leHRyYWN0UG9zdGZpeCh2YWx1ZSkgfHwgdGhpcy5fcG9zdGZpeCB8fCAoIXRoaXMucGFyYW1zWyJmaXhlZFBvc3RmaXgiXSAmJiBwb3N0Zml4ZXMubGVuZ3RoID8gcG9zdGZpeGVzWzBdIDogKHBvc3RmaXhlcy5sZW5ndGggPT0gMSA/IHBvc3RmaXhlc1swXSA6ICIiKSk7CiAgICAgICAgaWYgKF92YWx1ZSAhPSAiIikKICAgICAgICB7CiAgICAgICAgICAgIF92YWx1ZSA9IF9wcmVmaXgrX3ZhbHVlOwogICAgICAgICAgICBfdmFsdWUgPSBfdmFsdWUrX3Bvc3RmaXg7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuKF92YWx1ZSk7Cn0KClRUZXh0RWRpdC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpCnsKICAgIHZhciBlbGVtID0gdGhpcy5lbGVtZW50OwogICAgCiAgICBpZiAodGhpcy5fZWxlbWVudCkKICAgICAgICBlbGVtID0gdGhpcy5fZWxlbWVudDsKCiAgICAvL2R1bXAoZWxlbSk7CiAgICAvL2R1bXAoZWxlbS52YWx1ZSk7CiAgICBpZiAodHlwZW9mKGVsZW0udmFsdWUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgIHZhciB2YWx1ZSA9IGVsZW0udmFsdWU7CiAgICAvL2Vsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKQogICAgLy8gICAgdmFyIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CiAgICBlbHNlIGlmIChlbGVtLmlubmVySFRNTCkKICAgICAgICB2YXIgdmFsdWUgPSBlbGVtLmlubmVySFRNTDsKICAgIGVsc2UKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICAKICAgIC8vZHVtcChlbGVtKTsKICAgIC8vZHVtcChlbGVtLmNoaWxkTm9kZXMubGVuZ3RoKTsKICAgIC8vZHVtcChvdXRlckhUTUwoZWxlbSkpOwogICAgLy9kdW1wKHRoaXMuaWQpOwogICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAgICAgCiAgICBpZiAoZWxlbS50YWdOYW1lID09ICJJTlBVVCIgJiYgdHlwZW9mKHZhbHVlKSA9PSAic3RyaW5nIikKICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChaV05MLCAiZyIpLCAiXG4iKTsKICAgIAogICAgcmV0dXJuKHZhbHVlKTsKfQoKVFRleHRFZGl0LnByb3RvdHlwZS5nZXRSYXdWYWx1ZSA9IGZ1bmN0aW9uKCkKewogICAgcmV0dXJuKHRoaXMuZ2V0VmFsdWVGcm9tUGF0dGVybih0aGlzLmdldFZhbHVlKCkpKTsKfQoKVFRleHRFZGl0LnByb3RvdHlwZS5fb25QYXR0ZXJuRm9jdXMgPSBmdW5jdGlvbihlKQp7CiAgICBpZiAodGhpcy5maXhlZFByZWZpeEFsd2F5c1Zpc2libGUgfHwgdGhpcy5maXhlZFBvc3RmaXhBbHdheXNWaXNpYmxlKQogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2VsZW1lbnQudmFsdWU7CiAgICBlbHNlCiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlOwoKICAgIC8vZHVtcCh0aGlzLl9wcmVmaXgpOwogICAgaWYgKCF0aGlzLl9wcmVmaXgpIC8vIGluaXRpYWwgcHJlZml4IGNvbXBvbmVudCB2YWx1ZSBhbmQgZW1wdHkgdmFsdWUgKGxpa2UgcGhvbmUgZWRpdCkKICAgICAgICB0aGlzLl9wcmVmaXggPSAoZXhwbG9kZUxpc3QodGhpcy5wYXJhbXNbInByZWZpeCJdKVswXSA9PSAiIiA/ICIiIDogdGhpcy5leHRyYWN0UHJlZml4KHZhbHVlKSk7CiAgICBpZiAoIXRoaXMuX3ByZWZpeCkKICAgICAgICB0aGlzLl9wb3N0Zml4ID0gKGV4cGxvZGVMaXN0KHRoaXMucGFyYW1zWyJwb3N0Zml4Il0pWzBdID09ICIiID8gIiIgOiB0aGlzLmV4dHJhY3RQb3N0Zml4KHZhbHVlKSk7CgogICAgaWYgKHRoaXMucGFyYW1zWyJmaXhlZFByZWZpeCJdKQogICAgICAgIHRoaXMucHJlZml4U3Bhbi5pbm5lckhUTUwgPSAodGhpcy5fcHJlZml4IHx8IGV4cGxvZGVMaXN0KHRoaXMucGFyYW1zWyJwcmVmaXgiXSlbMF0pOwogICAgaWYgKHRoaXMucGFyYW1zWyJmaXhlZFBvc3RmaXgiXSkKICAgICAgICB0aGlzLnBvc3RmaXhTcGFuLmlubmVySFRNTCA9ICh0aGlzLl9wb3N0Zml4IHx8IGV4cGxvZGVMaXN0KHRoaXMucGFyYW1zWyJwb3N0Zml4Il0pWzBdKTsKCiAgICAvL2R1bXAodGhpcy5fcG9zdGZpeCk7CiAgICB2YXIgX3ZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21QYXR0ZXJuKHZhbHVlKTsKICAgIAogICAgdGhpcy5lbGVtZW50LnZhbHVlID0gX3ZhbHVlOwp9CgpUVGV4dEVkaXQucHJvdG90eXBlLl9vblBhdHRlcm5CbHVyID0gZnVuY3Rpb24oZSkKewogICAgLy9kdW1wKHRoaXMuX3Bvc3RmaXgpOwogICAgdmFyIHZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlOwogICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKCiAgICAvL2R1bXAoIiEiKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAvL2R1bXAodmFsdWUpOwogICAgLy9hbGVydCh2YWx1ZSk7CiAgICBpZiAodGhpcy5fcHJlZml4ICYmICF0aGlzLmV4dHJhY3RQcmVmaXgodmFsdWUpKQogICAgICAgIHZhbHVlID0gdGhpcy5fcHJlZml4K3ZhbHVlOwogICAgaWYgKHRoaXMuX3Bvc3RmaXggJiYgIXRoaXMuZXh0cmFjdFBvc3RmaXgodmFsdWUpKQogICAgICAgIHZhbHVlID0gdmFsdWUrdGhpcy5fcG9zdGZpeDsKICAgICAgICAKICAgIHRoaXMuX3ByZWZpeCA9ICIiOwogICAgdGhpcy5fcG9zdGZpeCA9ICIiOwoKICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZUFzUGF0dGVybih2YWx1ZSk7CiAgICAKICAgIC8vIGNhdXNlZCBtdWx0aXBsZSBjYWxsaW5nCiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTsKfQoKVFRleHRFZGl0LnByb3RvdHlwZS5fb25DaGFuZ2VLZXlEb3duID0gZnVuY3Rpb24oKQp7CiAgICBjbGVhclRpbWVvdXQodGhpcy5vbkNoYW5nZUtleURvd25UaW1lcik7CiAgICAKICAgIGlmICh0eXBlb2YodGhpcy5wYXJhbXNbIm9uQ2hhbmdlS2V5RG93blRpbWVvdXQiXSkgIT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgLy9kdW1wKDEpOwogICAgICAgIHZhciB0aW1lb3V0ID0gZXh0cmFjdEZsb2F0KHRoaXMucGFyYW1zWyJvbkNoYW5nZUtleURvd25UaW1lb3V0Il0pOwogICAgICAgIGlmICh0aW1lb3V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUtleURvd25UaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5vbkNoYW5nZShfdGhpcy5nZXRWYWx1ZSgpKX0sIHRpbWVvdXQqMTAwMCk7CiAgICAgICAgfQogICAgfQoKICAgIAoKICAgIC8vaWYgKHRoaXMuaGFzUGF0dGVybigpKQogICAgLy8gICAgdGhpcy5fZWxlbWVudC52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVBc1BhdHRlcm4odmFsdWUpOwogICAgCiAgICAvL3RoaXMucGFyZW50X19vbkNoYW5nZSh2YWx1ZSk7CiAgICAvL3RoaXMub25DaGFuZ2UodGhpcy5nZXRWYWx1ZSgpKTsKfQoKVFRleHRFZGl0LnByb3RvdHlwZS5fb25QcmVmaXhGb2N1cyA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5lbGVtZW50LnBsYWNlaG9sZGVyID0gIiI7CiAgICB0aGlzLmZvY3VzZWQgPSB0cnVlOwogICAgaWYgKHRoaXMucHJlZml4U3BhbikKICAgIHsKICAgICAgICB0aGlzLnByZWZpeFNwYW4uc3R5bGUuZGlzcGxheSA9ICIiOwogICAgfQogICAgaWYgKHRoaXMucG9zdGZpeFNwYW4pCiAgICB7CiAgICAgICAgdGhpcy5wb3N0Zml4U3Bhbi5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICB9CiAgICBpZiAodGhpcy5wcmVmaXhTcGFuIHx8IHRoaXMucG9zdGZpeFNwYW4pCiAgICAgICAgdGhpcy5yZWRyYXcoKTsKfQoKVFRleHRFZGl0LnByb3RvdHlwZS5fb25QcmVmaXhCbHVyID0gZnVuY3Rpb24oKQp7CiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJwbGFjZWhvbGRlciJdKSAhPSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLmVsZW1lbnQucGxhY2Vob2xkZXIgPSB0aGlzLnBhcmFtc1sicGxhY2Vob2xkZXIiXTsKICAgIGVsc2UKICAgICAgICB0aGlzLmVsZW1lbnQucGxhY2Vob2xkZXIgPSAiIjsKICAgICAgICAKICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlOwogICAgaWYgKHRoaXMucHJlZml4U3BhbiAmJiAhdGhpcy5maXhlZFByZWZpeEFsd2F5c1Zpc2libGUpCiAgICB7CiAgICAgICAgdGhpcy5wcmVmaXhTcGFuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgLy90aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9lbGVtZW50UGFkZGluZ0xlZnQ7CiAgICB9CiAgICBpZiAodGhpcy5wb3N0Zml4U3BhbiAmJiAhdGhpcy5maXhlZFBvc3RmaXhBbHdheXNWaXNpYmxlKQogICAgewogICAgICAgIHRoaXMucG9zdGZpeFNwYW4uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAvL3RoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0OwogICAgfQogICAgaWYgKHRoaXMucHJlZml4U3BhbiB8fCB0aGlzLnBvc3RmaXhTcGFuKQogICAgICAgIHRoaXMucmVkcmF3KCk7Cn0KClRUZXh0RWRpdC5wcm90b3R5cGUuX29uR2V0RGF0YUxpc3QgPSBmdW5jdGlvbigpCnsKICAgIHZhciBkYXRhbGlzdCA9IGdldEVsZW1lbnQodGhpcy5wYXJhbXNbImxpc3QiXSk7CiAgICBpZiAoZGF0YWxpc3QpCiAgICB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMub25HZXREYXRhTGlzdFRpbWVyKTsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHRoaXMub25HZXREYXRhTGlzdFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgaXRlbXMgPSBfdGhpcy5vbkdldERhdGFMaXN0KF90aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICBpZiAodHlwZW9mKGl0ZW1zKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YWxpc3QuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBpdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbiA9IGNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBpdGVtc1tpXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGRhdGFsaXN0LmFwcGVuZENoaWxkKG9wdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCA1MDApOwogICAgfQp9CgpUVGV4dEVkaXQucHJvdG90eXBlLm9uR2V0RGF0YUxpc3QgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgCn0KClRUZXh0RWRpdC5wcm90b3R5cGUub25HZXRQcmVmaXggPSBmdW5jdGlvbih2YWx1ZSkKewp9CgpUVGV4dEVkaXQucHJvdG90eXBlLm9uR2V0UG9zdGZpeCA9IGZ1bmN0aW9uKHZhbHVlKQp7Cn0=Ll9UZXh0RWRpdCB7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICAgIC1vLWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAqYmVoYXZpb3I6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0Nyb3NzQnJvd3Nlci9ib3gtc2l6aW5nLmh0Yyk7IA0KICAgIA0KICAgIG1pbi1oZWlnaHQ6IDE2cHg7DQogICAgYm9yZGVyOiAxcHggc29saWQgIzcwNzA3MDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOw0KICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQp9DQoNCnNwYW4uX1RleHRFZGl0IHsNCiAgICBib3JkZXI6IDBweDsNCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCn0NCg0Kc3Bhbi5fVGV4dEVkaXQ6aG92ZXIgew0KICAgIGJvcmRlcjogMHB4Ow0KfQ0KDQouX1RleHRFZGl0Rml4ZWRQcmVmaXgsIC5fVGV4dEVkaXRGaXhlZFBvc3RmaXggew0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICAgIC1vLWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAqYmVoYXZpb3I6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0Nyb3NzQnJvd3Nlci9ib3gtc2l6aW5nLmh0Yyk7IA0KICAgIA0KICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCiAgICBsaW5lLWhlaWdodDogMTAwJTsNCn0NCg0KLl9Db21wb25lbnRUYWdOYW1lIHsNCiAgICAvKm9wYWNpdHk6IDAgIWltcG9ydGFudDsgUFJPQyBUTyBUVSBCWUxPPyAgdG90YWxuaSBjaHVqb3ZpbmEqLyANCg0KICAgIC8qIGplIHRvIHR1IGt2dWxpIFRleHRFZGl0LCBrZGUgamUgdmxhc3RuaSB0YWcgLSBuYXByLiBzcGFuIC0gcHJpIHBvdXppdGkgV2ViT3B0aW1pemVyIHNlIG5lamRyaXYgdWthemUgaW5wdXQgYSBwYWsgYXogc2UgemFtZW5pIHphIHNwYW4gKi8NCiAgICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7DQogICAgYm9yZGVyOiAwcHggIWltcG9ydGFudDsNCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50Ow0KICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7DQogICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7DQogICAgbWFyZ2luOiAwcHggIWltcG9ydGFudDsNCiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50Ow0KICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KICAgIA0KICAgIC8qDQogICAgYm9yZGVyOiAwcHg7DQogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7DQogICAgY29sb3I6IGluaGVyaXQ7DQogICAgcGFkZGluZzogMHB4Ow0KICAgIG1hcmdpbjogMHB4Ow0KICAgIHdpZHRoOiBhdXRvOw0KICAgIGhlaWdodDogYXV0bzsNCiAgICAqLw0KfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvVGV4dEVkaXQvVGV4dEVkaXQuY2xhc3MucGhwIC0tLS0tLS0gDQoNCmNsYXNzIFRUZXh0RWRpdCBleHRlbmRzIFRDb21wb25lbnQNCnsNCiAgICB2YXIgJGNvbnRleHRNZW51RW5hYmxlZCA9IHRydWU7DQoNCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9faW1wbGVtZW50cygpDQogICAgew0KICAgICAgICByZXR1cm4oYXJyYXkoIkZpZWxkQ29tcG9uZW50IikpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb25HZXRQcm9wZXJ0aWVzKCkNCiAgICB7DQogICAgICAgICRwcm9wZXJ0aWVzID0gcGFyZW50OjpvbkdldFByb3BlcnRpZXMoKTsgDQoNCiAgICAgICAgJHByb3BlcnRpZXMgPSBtZXJnZVByb3BlcnRpZXMoJHByb3BlcnRpZXMsIGFycmF5KCAgICAgICAgDQogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249Q29tbW9uLHBvc2l0aW9uPWxhc3QiLA0KICAgICAgICAibmFtZT1uYW1lLGNhcHRpb249TmFtZSxvYmplY3Q9VGV4dEVkaXQiLA0KICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPVZpc3VhbCxwb3NpdGlvbj1sYXN0IiwNCiAgICAgICAgIm5hbWU9d2lkdGgsY2FwdGlvbj1XaWR0aCxvYmplY3Q9VGV4dEVkaXQscG9zdGZpeD1weHwlIiwNCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1EYXRhIiwNCiAgICAgICAgIm5hbWU9cHJlZml4LGNhcHRpb249UHJlZml4LG9iamVjdD1MaXN0RWRpdCIsDQogICAgICAgICJuYW1lPXBvc3RmaXgsY2FwdGlvbj1Qb3N0Zml4LG9iamVjdD1MaXN0RWRpdCIsDQogICAgICAgICJuYW1lPWV4Y2x1ZGVkUGF0dGVyblZhbHVlcyxjYXB0aW9uPUV4Y2x1ZGVkIFBhdHRlcm4gVmFsdWVzLG9iamVjdD1MaXN0RWRpdCIsDQogICAgICAgICJuYW1lPWZpeGVkUHJlZml4LGNhcHRpb249Rml4ZWQgUHJlZml4LG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLA0KICAgICAgICAibmFtZT1maXhlZFBvc3RmaXgsY2FwdGlvbj1GaXhlZCBQb3N0Zml4LG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLA0KICAgICAgICAibmFtZT1zZW5kUGF0dGVybixjYXB0aW9uPVNlbmQgUGF0dGVybixvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwNCiAgICAgICAgIm5hbWU9YWxsb3dlZENoYXJzLGNhcHRpb249QWxsb3dlZCBDaGFyYWN0ZXJzLG9iamVjdD1UZXh0RWRpdCIsDQogICAgICAgICJuYW1lPWRlbmllZENoYXJzLGNhcHRpb249RGVuaWVkIENoYXJhY3RlcnMsb2JqZWN0PVRleHRFZGl0IiwNCiAgICAgICAgDQogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249RWxlbWVudCIsDQogICAgICAgICJuYW1lPXRhZ05hbWUsY2FwdGlvbj1UYWcsb2JqZWN0PVRleHRFZGl0IiwNCg0KICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPUJlaGF2aW9yLGFmdGVyPURhdGEiLA0KICAgICAgICAibmFtZT1yZWFkb25seSxjYXB0aW9uPVJlYWQgT25seSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwNCiAgICAgICAgIm5hbWU9bWF4bGVuZ3RoLGNhcHRpb249TWF4IExlbmd0aCxvYmplY3Q9U3BpbkVkaXQsbWluVmFsdWU9MCIsDQogICAgICAgICJuYW1lPXNpemUsY2FwdGlvbj1TaXplLG9iamVjdD1TcGluRWRpdCxtaW5WYWx1ZT0wIiwNCiAgICAgICAgIm5hbWU9b25DaGFuZ2VLZXlEb3duVGltZW91dCxjYXB0aW9uPW9uQ2hhbmdlIEtleSBEb3duIFRpbWVvdXQsb2JqZWN0PVNwaW5FZGl0LG1pblZhbHVlPTEscG9zdGZpeD1zIiwNCiAgICAgICAgIm5hbWU9dGl0bGUsY2FwdGlvbj1UaXRsZSxvYmplY3Q9VGV4dEVkaXQiLA0KDQogICAgICAgIC8vInR5cGU9Z3JvdXAsY2FwdGlvbj1IVE1MIDUiLA0KICAgICAgICAvLyJuYW1lPWRhdGFsaXN0VXJsLGNhcHRpb249RGF0YWxpc3QgVVJMLG9iamVjdD1UZXh0RWRpdCIsDQoNCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1KYXZhU2NyaXB0IEV2ZW50cyIsDQogICAgICAgICJuYW1lPW9uR2V0RGF0YUxpc3QsY2FwdGlvbj1vbkdldERhdGFMaXN0LG9iamVjdD1Db2RlRWRpdCIsDQogICAgICAgICJuYW1lPW9uR2V0UHJlZml4LGNhcHRpb249b25HZXRQcmVmaXgsb2JqZWN0PUNvZGVFZGl0IiwNCiAgICAgICAgIm5hbWU9b25HZXRQb3N0Zml4LGNhcHRpb249b25HZXRQb3N0Zml4LG9iamVjdD1Db2RlRWRpdCIsDQogICAgICAgICJuYW1lPW9uR2V0VmFsdWVGcm9tUGF0dGVybixjYXB0aW9uPW9uR2V0VmFsdWVGcm9tUGF0dGVybixvYmplY3Q9Q29kZUVkaXQiLA0KICAgICAgICAibmFtZT1vbkdldFZhbHVlQXNQYXR0ZXJuLGNhcHRpb249b25HZXRWYWx1ZUFzUGF0dGVybixvYmplY3Q9Q29kZUVkaXQiLA0KICAgICAgICApKTsgICAgICAgIA0KICAgICAgICANCiAgICAgICAgJHByb3BlcnRpZXMgPSBtZXJnZVByb3BlcnRpZXMoJHByb3BlcnRpZXMsIFRQcm9wZXJ0eUVkaXRvcjo6Z2V0SFRNTDVBdHRyaWJ1dGVzKCkpOw0KDQogICAgICAgIHJldHVybigkcHJvcGVydGllcyk7DQogICAgICAgIA0KICAgICAgICAvLyksIFRQcm9wZXJ0eUVkaXRvcjo6Z2V0Q1NTUHJvcGVydGllcygpKSk7ICAgICAgICANCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpZWxkSW5mbygkcGFyYW1zPWFycmF5KCkpDQogICAgew0KICAgICAgICByZXR1cm4oYXJyYXkoDQogICAgICAgICAgICAiZGF0YVR5cGUiID0+ICJWQVJDSEFSIiwNCiAgICAgICAgICAgICJkYXRhVHlwZVBhcmFtcyIgPT4gIjI1NSIsDQogICAgICAgICAgICAiZGVmYXVsdFZhbHVlIiA9PiAiIiwNCiAgICAgICAgKSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gb25HZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpDQogICAgew0KICAgICAgICBpZiAoIWhlYWRIdG1sQWRkZWQoX19DTEFTU19fLCAkcGFyYW1zKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcGFyZW50OjpvbkdldEhlYWRIdG1sKCRwYXJhbXMpOw0KICAgICAgICANCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9UZXh0RWRpdC9UZXh0RWRpdC5jbGFzcy5qcyc+PC9zY3JpcHQ+Iix0cnVlKTsNCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8bGluayBocmVmPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9UZXh0RWRpdC9UZXh0RWRpdC5jbGFzcy5jc3MnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIC8+Iix0cnVlKTsNCiAgICAgICAgICAgIGFkZEV4dGVuZGluZ0hlYWRIdG1sKCRwYXJhbXMsIF9fQ0xBU1NfXyk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBvbkdldENvbnRlbnQoJiRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPmdldEhlYWRIdG1sKCRwYXJhbXMpOw0KDQogICAgICAgICRwYXJhbXMgPSAkdGhpcy0+ZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsNCiAgICAgICAgLyoNCiAgICAgICAgaWYgKCR0aGlzLT5pbmhlcml0cygiU3BpbkVkaXQiKSkNCiAgICAgICAgew0KICAgICAgICAgICAgICAgIGVjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7DQogICAgICAgICAgICB2YXJfZHVtcCgkcGFyYW1zKTsNCiAgICAgICAgICAgIHZhcl9kdW1wKCR2YWx1ZSk7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9DQogICAgICAgICovDQogICAgICAgIC8vZHVtcCgkR0xPQkFMU1skcGFyYW1zWyJpZCJdXSk7DQogICAgICAgIC8vZHVtcCgkX0dFVCk7DQogICAgICAgIC8vZHVtcCgkX1BPU1QpOw0KICAgICAgICAvL2R1bXAoJHZhbHVlKTsNCiAgICAgICAgLy9kdW1wKCItLS0tLSIpOw0KICAgICAgICAvL2R1bXAoJHRoaXMtPmlkKTsNCiAgICAgICAgJHRoaXMtPmluaXQoJHBhcmFtcyk7DQogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsNCiAgICAgICAgDQogICAgICAgIC8vZHVtcCgkdGhpcy0+aWQpOw0KICAgICAgICAvL2R1bXAoJHBhcmFtcyk7DQogICAgICAgIC8vZHVtcCgkdmFsdWUpOw0KICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXMpOw0KICAgICAgICAvL2V4aXQ7DQogICAgICAgICRwYXJhbXNbImNvbnRhaW5lciJdID0gJHRoaXMtPmlkOw0KDQogICAgICAgIC8vZHVtcCgkdmFsdWUpOw0KICAgICAgICBpZiAodG9TdHJpbmcoJHZhbHVlKSA9PSAiIikgLy8ga3Z1bGkgKGJvb2wpImZhbHNlIg0KICAgICAgICAgICAgJHZhbHVlID0gJHBhcmFtc1sidmFsdWUiXTsNCiAgICAgICAgLy9kdW1wKCR0aGlzLT5pZCk7DQogICAgICAgIC8vZHVtcCgkdmFsdWUpOw0KICAgICAgICAvL2R1bXAoJHBhcmFtcyk7DQogICAgICAgIA0KICAgICAgICAkdmFsdWUgPSBoaWRlQ29tcG9uZW50cygkdmFsdWUpOw0KICAgICAgICANCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7DQogICAgICAgIC8vZHVtcCgkdGhpcy0+bmFtZSk7DQogICAgICAgIC8vZHVtcCgkdmFsdWUpOw0KICAgICAgICANCiAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpDQogICAgICAgICAgICAkdmFsdWUgPSBUSlNPTjo6ZW5jb2RlKCR2YWx1ZSk7DQogICAgICAgIA0KICAgICAgICAkaGFzRGF0YUxpc3QgPSAoJHBhcmFtc1siZGF0YWxpc3QiXSB8fCAkcGFyYW1zWyJkYXRhbGlzdFVybCJdIHx8ICRwYXJhbXNbIm9uR2V0RGF0YUxpc3QiXSk7DQogICAgICAgICRwYXJhbXNbImxpc3QiXSA9ICgkcGFyYW1zWyJsaXN0Il0gPyAkcGFyYW1zWyJsaXN0Il0gOiAoJGhhc0RhdGFMaXN0ID8gJHRoaXMtPmlkLiJEYXRhTGlzdCIgOiAiIikpOw0KICAgICAgICANCiAgICAgICAgaWYgKCEkcGFyYW1zWyJ0eXBlIl0vKiB8fCAkcGFyYW1zWyJ0eXBlIl0gPT0gImRhdGUiIHx8ICRwYXJhbXNbInR5cGUiXSA9PSAidGltZSIgfHwgJHBhcmFtc1sidHlwZSJdID09ICJkYXRldGltZSIqLykNCiAgICAgICAgICAgICRwYXJhbXNbInR5cGUiXSA9ICJ0ZXh0IjsNCiAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgLy9kdW1wKCR0aGlzLT5uYW1lKTsNCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7DQogICAgICAgICRqc1BhcmFtcyA9ICRwYXJhbXM7DQogICAgICAgIC8vJGh0bWwgLj0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0nX1RleHRFZGl0JyBuYW1lPSciLiR0aGlzLT5pZC4iJyBpZD0nIi4kdGhpcy0+aWQuIicgdmFsdWU9XCIiLnN0cl9yZXBsYWNlKCJcIiIsICImcXVvdDsiLCAkdmFsdWUpLiJcIiAgc3R5bGU9JyIuZ2V0Q1NTUGFyYW1zKCRwYXJhbXMpLiInIC8+IjsNCiAgICAgICAgLy9kdW1wKCR0aGlzLT5uYW1lKTsNCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7DQoNCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7DQogICAgICAgICRfdmFsdWUgPSAkdmFsdWU7DQogICAgICAgICRfdmFsdWUgPSB0b1N0cmluZygkX3ZhbHVlKTsNCiAgICAgICAgLy9kdW1wKCRfdmFsdWUpOw0KICAgICAgICAkX3ZhbHVlID0gX2h0bWxzcGVjaWFsY2hhcnMoJF92YWx1ZSk7DQogICAgICAgICRfdmFsdWUgPSBzdHJfcmVwbGFjZSgiJiMxMzsiLCBIWldOTCwgJF92YWx1ZSk7DQoNCiAgICAgICAgLy9kdW1wKCRfdmFsdWUpOw0KICAgICAgICAkYXR0clBhcmFtcyA9ICRwYXJhbXM7DQogICAgICAgICRhdHRyUGFyYW1zWyJjbGFzcyJdID0gIl9UZXh0RWRpdCAiLiRwYXJhbXNbImNsYXNzIl0uIiAiLigkcGFyYW1zWyJ0YWdOYW1lIl0gPyAiX0NvbXBvbmVudFRhZ05hbWUiIDogIiIpLiIgIjsNCiAgICAgICAgLy9pZiAoJHBhcmFtc1sidGFnTmFtZSJdKQ0KICAgICAgICAvLyAgICAkYXR0clBhcmFtc1siY2xhc3MiXSA9ICRwYXJhbXNbImNsYXNzIl0uIiAiOw0KICAgICAgICAvL2Vsc2UNCiAgICAgICAgLy8gICAgJGF0dHJQYXJhbXNbImNsYXNzIl0gPSAiX1RleHRFZGl0ICIuJHBhcmFtc1siY2xhc3MiXS4iICI7DQogICAgICAgICAgICANCiAgICAgICAgJGF0dHJQYXJhbXNbIm5hbWUiXSA9ICR0aGlzLT5uYW1lOw0KICAgICAgICAkYXR0clBhcmFtc1siaWQiXSA9ICR0aGlzLT5pZDsNCiAgICAgICAgJGF0dHJQYXJhbXNbInZhbHVlIl0gPSAkX3ZhbHVlOw0KICAgICAgICAkYXR0clBhcmFtc1sic3R5bGUiXSA9IGdldENTU1BhcmFtcygkcGFyYW1zKTsNCiAgICAgICAgJGF0dHJQYXJhbXNbImF0dHJpYnV0ZXMiXSA9ICRwYXJhbXNbImF0dHJpYnV0ZXMiXTsNCiAgICAgICAgDQogICAgICAgIC8vZHVtcCgkdGhpcy0+bmFtZSk7DQogICAgICAgIC8vZHVtcCgkdmFsdWUpOw0KICAgICAgICAvL2R1bXAoZ2V0QXR0cmlidXRlUGFyYW1zKCRhdHRyUGFyYW1zKSk7DQogICAgICAgIC8vaWYgKCR0aGlzLT5uYW1lID09ICJ2YWx1ZSIpDQogICAgICAgIC8vew0KICAgICAgICAvLyAgICBkdW1wKCR2YWx1ZSk7DQogICAgICAgIC8vICAgIGR1bXAoJGF0dHJQYXJhbXMpOw0KICAgICAgICAvLyAgICBkdW1wKGdldEF0dHJpYnV0ZVBhcmFtcygkYXR0clBhcmFtcykpOw0KICAgICAgICAvL30NCiAgICAgICAgDQogICAgICAgIC8vZHVtcCgkYXR0clBhcmFtcyk7DQogICAgICAgIC8vZHVtcCgkcGFyYW1zWyJ0YWdOYW1lIl0pOw0KICAgICAgICANCiAgICAgICAgLy9pZiAoJHBhcmFtc1sidGFnTmFtZSJdKQ0KICAgICAgICAvLyAgICAkaHRtbCAuPSAiPCIuJHBhcmFtc1sidGFnTmFtZSJdLiIgdHlwZT0nIi4kcGFyYW1zWyJ0eXBlIl0uIicgIi5nZXRBdHRyaWJ1dGVQYXJhbXMoJGF0dHJQYXJhbXMpLiIgPiIuJF92YWx1ZS4iPC8iLiRwYXJhbXNbInRhZ05hbWUiXS4iPiI7DQogICAgICAgIC8vZWxzZQ0KICAgICAgICAgICAgJGh0bWwgLj0gIjxpbnB1dCB0eXBlPSciLiRwYXJhbXNbInR5cGUiXS4iJyAiLmdldEF0dHJpYnV0ZVBhcmFtcygkYXR0clBhcmFtcykuIiAvPiI7DQoNCiAgICAgICAgLy9kdW1wKGh0bWxlbnRpdGllcygkaHRtbCkpOw0KICAgICAgICBpZiAoJGhhc0RhdGFMaXN0KQ0KICAgICAgICB7DQogICAgICAgICAgICAkaHRtbCAuPSAiPGRhdGFsaXN0IGlkPVwiIi4kdGhpcy0+aWQuIkRhdGFMaXN0Ii4iXCI+IjsgDQogICAgICAgICAgICBmb3JlYWNoKGV4cGxvZGVMaXN0KCRwYXJhbXNbImRhdGFsaXN0Il0pIGFzICRpdGVtKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRodG1sIC49ICI8b3B0aW9uIHZhbHVlPVwiIi5faHRtbGVudGl0aWVzKCRpdGVtKS4iXCIgLz4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGh0bWwgLj0gIjwvZGF0YWxpc3Q+IjsgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRqcyAuPSAidmFyICIuJHRoaXMtPmpzT2JqZWN0TmFtZS4iID0gbmV3ICIuJHRoaXMtPmpzQ2xhc3NOYW1lLiIoIi4kdGhpcy0+Z2V0SnNQYXJhbXMoJGpzUGFyYW1zKS4iLCAnIi4kdGhpcy0+aWQuIicpOyBcbiI7DQogICAgICAgIGlmICgkcGFyYW1zWyJvbkNsaWNrIl0pDQogICAgICAgIHsNCiAgICAgICAgICAgICRqcyAuPSAkdGhpcy0+anNPYmplY3ROYW1lLiIub25DbGljaz1mdW5jdGlvbigpeyIuJHBhcmFtc1sib25DbGljayJdLiJ9OyBcbiI7DQogICAgICAgIH0NCg0KICAgICAgICAkaHRtbCAuPSAkdGhpcy0+Z2V0SmF2YVNjcmlwdEh0bWwoJGpzKTsNCiAgICAgICAgcmV0dXJuKCRodG1sKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gZ2V0VGVzdFBhcmFtcygkcGFyYW1zPWFycmF5KCkpDQogICAgew0KICAgICAgICAkcGFyYW1zID0gYXJyYXlfbWVyZ2UoYXJyYXkoDQogICAgICAgICAgICAidmFsdWUiID0+ICJ2YWx1ZSIsDQogICAgICAgICksICRwYXJhbXMpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuKCRwYXJhbXMpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gVEJ1dHRvbkVkaXQocGFyYW1zLCBpZCkgICAKewogICAgaWYgKCFpZCkKICAgICAgICBpZCA9IFVVSUQoKTsKICAgICAgICAKICAgIHRoaXMuVEhJUyA9IHRoaXM7CiAgICB0aGlzLmlkID0gaWQ7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgIAogICAgdGhpcy5kdW1wRGF0YSA9IGZhbHNlOyAvLyBzZWUgYmVsb3cKICAgIHRoaXMuX2ZpeFZlcnRpY2FsQWxpZ25BbnRpTG9vcCA9IDA7CiAgICAKICAgIC8vZHVtcCgiISEhISEiKTsKICAgIC8vZHVtcCh0aGlzKTsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUQnV0dG9uRWRpdCwgVFRleHRFZGl0KTsKClRCdXR0b25FZGl0LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsKCiAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpbGluZSJdKQogICAgICAgIHRoaXMuaW5wdXRUYWdOYW1lID0gInRleHRhcmVhIjsKCiAgICB0aGlzLmlucHV0VGFnTmFtZSA9IHRoaXMuaW5wdXRUYWdOYW1lIHx8ICJpbnB1dCI7CiAgICB0aGlzLmJ1dHRvblRhZ05hbWUgPSB0aGlzLmJ1dHRvblRhZ05hbWUgfHwgImJ1dHRvbiI7CiAgICAKICAgIGlmICh0eXBlb2YodGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoKSA9PSAidW5kZWZpbmVkIikKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJhdXRvc2l6ZUJ1dHRvbldpZHRoIl0pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB0aGlzLmF1dG9zaXplQnV0dG9uV2lkdGggPSB0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b25XaWR0aCJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoID0gdHJ1ZTsKICAgIH0KICAgIAogICAgaWYgKHRoaXMucGFyYW1zWyJ0YWdOYW1lIl0pCiAgICB7CiAgICAgICAgLy90aGlzLmlucHV0VGFnTmFtZSA9IHRoaXMucGFyYW1zWyJ0YWdOYW1lIl07CiAgICAgICAgaWYgKHR5cGVvZih0aGlzLnBhcmFtc1siYnV0dG9uVmlzaWJsZSJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgdGhpcy5wYXJhbXNbImJ1dHRvblZpc2libGUiXSA9IGZhbHNlOwogICAgfQoKICAgIHRoaXMucGFyZW50X2NyZWF0ZSgpOwogICAgCiAgICAvL2R1bXAodGhpcy53aWR0aEZpeEVsZW1lbnQpOwogICAgCiAgICAvL3RoaXMuZHVtcChvdXRlckhUTUwodGhpcy5lbGVtZW50KSk7CiAgICAvL3RoaXMuY29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAvL2FkZENsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgIl9Db21wb25lbnQiKTsKCiAgICAvL3RoaXMuaW5wdXQgPSB0aGlzLmVsZW1lbnQ7CiAgICAvL3RoaXMuZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSB0cnVlOwogICAgLy9yZXR1cm47CiAgICAvL2R1bXAodGhpcy5lbGVtZW50KTsKICAgIGlmICh0aGlzLmlucHV0VGFnTmFtZSAhPSAibm9uZSIpCiAgICB7CiAgICAgICAgLyoKICAgICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0aGlzLmlucHV0VGFnTmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vYWxlcnQob3V0ZXJIVE1MKHRoaXMuZWxlbWVudCkpOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5lbGVtZW50OwogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHRoaXMuaW5wdXRUYWdOYW1lKTsKICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRUYWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImlucHV0IikKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dCIpOyAvLyBtdXN0IHVzZSBzZXRBdHRyaWJ1dGUgLSBJRTgKICAgICAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50ID0gY2hhbmdlQXR0cmlidXRlKHRoaXMuZWxlbWVudCwgInR5cGUiLCAidGV4dCIpOwogICAgICAgICAgICBpZiAodGhpcy5pbnB1dFRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiYnV0dG9uIikKICAgICAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50ID0gY2hhbmdlQXR0cmlidXRlKHRoaXMuZWxlbWVudCwgInR5cGUiLCAiYnV0dG9uIik7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgImJ1dHRvbiIpOyAvLyBtdXN0IHVzZSBzZXRBdHRyaWJ1dGUgLSBJRTgKICAgICAgICAgICAgY29weUVsZW1lbnRQcm9wZXJ0aWVzKHRoaXMuX2VsZW1lbnQsIHRoaXMuZWxlbWVudCwgW10sIFsidHlwZSJdKTsKICAgICAgICAgICAgLy9hbGVydCh0aGlzLmVsZW1lbnQpOwogICAgICAgICAgICAvL2FsZXJ0KHRoaXMuaW5wdXRUYWdOYW1lKTsKICAgICAgICAgICAgLy9hbGVydCh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gInRleHRhcmVhIikKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl9lbGVtZW50LnZhbHVlOwogICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlucHV0VGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJpbnB1dCIpCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLl9lbGVtZW50LnZhbHVlOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gWldTUDsKICAgICAgICAgICAgLy9hbGVydCgneCcpOwogICAgICAgICAgICBpbnNlcnRCZWZvcmUodGhpcy5fZWxlbWVudCwgdGhpcy5lbGVtZW50KTsKCiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJ0ZXh0YXJlYSIpCiAgICAgICAgICAgICAgICByZW1vdmVOb2RlKHRoaXMuX2VsZW1lbnQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKHRoaXMuZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgICovCiAgICAgICAgCiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9CdXR0b25FZGl0IiwgLTEpOwoKICAgICAgICB0aGlzLmJ1dHRvbiA9IGNyZWF0ZUVsZW1lbnQodGhpcy5idXR0b25UYWdOYW1lKTsKCiAgICAgICAgaWYgKHRoaXMuYnV0dG9uVGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJidXR0b24iKQogICAgICAgICAgICB0aGlzLmJ1dHRvbi5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiYnV0dG9uIik7IC8vIG11c3QgdXNlIHNldEF0dHJpYnV0ZSAtIElFOAogICAgICAgIGlmICh0aGlzLnBhcmFtc1siYnV0dG9uU3R5bGUiXSkKICAgICAgICAgICAgdGhpcy5idXR0b24uc2V0QXR0cmlidXRlKCJzdHlsZSIsIHRoaXMucGFyYW1zWyJidXR0b25TdHlsZSJdKTsKICAgICAgICBpZiAodGhpcy5wYXJhbXNbImJ1dHRvbkNsYXNzIl0pCiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgdGhpcy5wYXJhbXNbImJ1dHRvbkNsYXNzIl0pOwoKICAgICAgICAvL2R1bXAodGhpcy5idXR0b24pOwogICAgICAgIAogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgImJ1dHRvbiIpOwoKICAgICAgICBpbnNlcnRBZnRlcih0aGlzLmVsZW1lbnQsIHRoaXMuYnV0dG9uKTsKCiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgLy9pZiAoZXh0cmFjdEludChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tcmlnaHQiKSkpCiAgICAgICAgLy97CiAgICAgICAgLy99CiAgICAKICAgICAgICAvL3NldFN0eWxlKHRoaXMuYnV0dG9uLCAiZmxvYXQiLCBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJmbG9hdCIpKTsKCiAgICAgICAgaWYgKHRoaXMucGFyYW1zWyJidXR0b25Pbmx5Il0pCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQudHlwZSA9ICJoaWRkZW4iOwogICAgICAgICAgICB0aGlzLmJ1dHRvbi5jbGFzc05hbWUgPSAiIjsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiX0J1dHRvbiIpOwogICAgICAgIH0KCiAgICAgICAgLyogUFJPQz8gamUgdG8gbmVzbXlzbCAtIGtkeXogY2NoaSBuYXN0YXZpdCBzaXJrdSBuYXR2cmRvIHBvbW9jaSBDU1MsIHRhayBhdCB0byB0YWsgamUKICAgICAgICBpZiAoZXh0cmFjdEludChnZXRTdHlsZSh0aGlzLmJ1dHRvbiwgIndpZHRoIikpICYmICF0aGlzLmF1dG9zaXplQnV0dG9uV2lkdGgpIC8vIGRydWhhIHBvZG1pbmthIGt2dWxpIFNwaW5FZGl0CiAgICAgICAgewogICAgICAgICAgICB0aGlzLmF1dG9zaXplQnV0dG9uV2lkdGggPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICBpZiAoZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuYnV0dG9uLCAid2lkdGgiKSkgfHwgdGhpcy5wYXJhbXNbImJ1dHRvbk9ubHkiXSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gdGhhbmtzIHRvIDxzcGFuPiAtIHdlIGRvIG5vdCBuZWVkIHRvIHJlZml4IHRoZSBidXR0b24gcG9zaXRpb24KICAgICAgICBpZiAodGhpcy5wYXJhbXNbImJ1dHRvbkljb24iXSkKICAgICAgICAgICAgdGhpcy5idXR0b24uaW5uZXJIVE1MID0gIjxpbWcgc3JjPSciK3RoaXMucGFyYW1zWyJidXR0b25JY29uIl0rIicgLz4iOwogICAgICAgIGVsc2UgaWYgKHRoaXMucGFyYW1zWyJidXR0b25UZXh0Il0gJiYgdGhpcy5wYXJhbXNbImJ1dHRvblRleHQiXSAhPSAiLi4uIikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYnV0dG9uLmlubmVySFRNTCA9IHRoaXMucGFyYW1zWyJidXR0b25UZXh0Il07CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgImJ1dHRvblRleHQiKTsKICAgICAgICAgICAgdGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5idXR0b24uaW5uZXJIVE1MID0gIi4uLiI7CiAgICAgICAgICAgIAogICAgICAgIGlmICh0aGlzLnBhcmFtc1siYnV0dG9uVmlzaWJsZSJdID09PSBmYWxzZSkKICAgICAgICAgICAgdGhpcy5idXR0b24uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIAogICAgICAgIC8vc2V0U3R5bGUodGhpcy5idXR0b24sICJtYXJnaW4tcmlnaHQiLCAiMHB4Iik7CiAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKHRoaXMuYnV0dG9uKTsKICAgICAgICAgICAKICAgICAgICAvLyBtYXliZSBmaW5hbCBzb2x1dGlvbiBmb3IgYnV0dG9uIHBvc2l0aW9uaW5nCiAgICAgICAgaWYgKHRoaXMucGFyYW1zWyJhdXRvc2l6ZUJ1dHRvbiJdICE9PSBmYWxzZSAmJiAhdGhpcy5wYXJhbXNbImJ1dHRvbk9ubHkiXSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlLm1hcmdpbkxlZnQgPSAoKC0xKSp0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGgpKyJweCI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJlYWRvbmx5IikpOwogICAgICAgIC8vZHVtcCh0aGlzLnBhcmFtc1siZWRpdGFibGUiXSk7CiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWFkb25seSIpIHx8IHRoaXMucGFyYW1zWyJyZWFkb25seUVsZW1lbnQiXSkKICAgICAgICAgICAgYWRkRXZlbnQodGhpcy5idXR0b24sICJjbGljayIsIGZ1bmN0aW9uKGUpe2UgPSBnZXRNb3VzZUV2ZW50KGUpOyBlLnN0b3AoKTsgX3RoaXMub25CdXR0b25DbGljaygpO30pOwogICAgICAgIC8vYWRkRXZlbnQodGhpcy5idXR0b24sICJkYmxjbGljayIsIGZ1bmN0aW9uKGUpe2UgPSBnZXRNb3VzZUV2ZW50KGUpOyBlLnN0b3AoKTsgfSk7CiAgICAgICAgLy9kdW1wKCJ4Iik7CiAgICAgICAgLy9kdW1wKGVycm9yU3RhY2subGVuZ3RoKTsKICAgICAgICAvL2FkZEV2ZW50KHRoaXMuZWxlbWVudCwgIm1vdmUiLCBmdW5jdGlvbihlKXtfdGhpcy5fZml4VmVydGljYWxBbGlnbigpfSk7CiAgICB9CiAgICAgICAgCiAgICBpZiAoIXRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCkKICAgIHsKICAgICAgICAvLyB6cnXFoWVubywga2R5xb4gdcW+IGNoY2ksIHN0eWxvdmF0IHBvbW9jw60gQ1NTLCB0YWsgc2kgZG9zdHlsdWp1IGkgdG90bwogICAgICAgIC8vYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiYnV0dG9uVGV4dCIpOwogICAgfQoKICAgIC8qCiAgICB0aGlzLndpZHRoRml4RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy53aWR0aEZpeEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOwogICAgdGhpcy53aWR0aEZpeEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgdGhpcy53aWR0aEZpeEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjFweCI7CiAgICB0aGlzLndpZHRoRml4RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gIiNGRjAwMDAiOwoKICAgIGR1bXAodGhpcy5lbGVtZW50KTsKICAgIGR1bXAoZ2V0U3R5bGUodGhpcy5lbGVtZW50KSk7CiAgICBkdW1wKHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCk7CiAgICB0aGlzLndpZHRoRml4RWxlbWVudC5zdHlsZS53aWR0aCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIndpZHRoIik7CiAgICB0aGlzLndpZHRoRml4RWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm1pbi13aWR0aCIpOwogICAgdGhpcy53aWR0aEZpeEVsZW1lbnQuc3R5bGUubWF4d2lkdGggPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXgtd2lkdGgiKTsKICAgIHRoaXMud2lkdGhGaXhFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tbGVmdCIpOwogICAgdGhpcy53aWR0aEZpeEVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tcmlnaHQiKTsKICAgIGR1bXAodGhpcy53aWR0aEZpeEVsZW1lbnQpOwogICAgCiAgICBpbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCB0aGlzLndpZHRoRml4RWxlbWVudCk7CiAgICAqLwoKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIC8vZHVtcCh0aGlzLmNsYXNzTmFtZSk7CiAgICAvL2R1bXAodGhpcy5fY2xhc3NOYW1lKTsKCiAgICAvLyBjYWxsZWQgdG8gcmVkcmF3IGNvbWJvYm94IGFycm93IGlmIHByZWZpeGNvbXBvbmVudCBvbiBQaG9uZUVkaXQKICAgIC8vc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLnJlZHJhdygpfSwgNTAwKTsKfQoKVEJ1dHRvbkVkaXQucHJvdG90eXBlLmFmdGVyQ3JlYXRlID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLnBhcmVudF9hZnRlckNyZWF0ZSgpOwoKICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PSB0aGlzLl9jbGFzc05hbWUpIC8vIGNhbGxlZCBvbmx5IGlmIHRoaXMgaXMgZmluYWwgb2JqZWN0IGNsYXNzCiAgICB7CiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgIHRoaXMub25SZXNpemUoKTsKICAgIH0KCiAgICAvLyBuZWVkIHRvIGhhdmUgdGhpcyBldmVudCBmb3IgSUUgLSBzb21ldGltZXMgaXQgaXMgZmFzdGVyIHRoYW4gaW5pdGlhbGl6YXRpb24KICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJyZXNpemUiLCBmdW5jdGlvbihlKXtjYWxsKGZ1bmN0aW9uKCl7X3RoaXMub25SZXNpemUoKTt9LCB0cnVlKX0pOwp9CgpUQnV0dG9uRWRpdC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgdGhpcy5wYXJlbnRfc2V0VmFsdWUodmFsdWUpOwogICAgCiAgICBpZiAodGhpcy5pbnB1dFRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAiaW5wdXQiKQogICAgewogICAgICAgIGlmICh0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID09ICIiKSAgICAKICAgICAgICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IFpXU1A7CiAgICB9CiAgICAvL3RoaXMuX2ZpeFZlcnRpY2FsQWxpZ24oKTsKfQoKVEJ1dHRvbkVkaXQucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uKG9iaikKewogICAgLy9kdW1wKCJyZWRyYXciKTsKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIC8vZHVtcCh0aGlzLmJ1dHRvbik7CiAgICAKICAgIGlmICh0aGlzLnBhcmFtc1siYnV0dG9uT25seSJdKQogICAgICAgIHJldHVybjsKCiAgICAvL2R1bXAoIj8/Pz8/Iik7CiAgICAvLy9kdW1wKHRoaXMuX2VsZW1lbnRNYXJnaW5SaWdodCk7CiAgICAvL2R1bXAoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAibWFyZ2luLXJpZ2h0IikpOwogICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CgogICAgaWYgKHR5cGVvZih0aGlzLl9lbGVtZW50UGFkZGluZ0xlZnQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMuX2VsZW1lbnRQYWRkaW5nTGVmdCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBhZGRpbmctbGVmdCIpOwogICAgaWYgKHR5cGVvZih0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0KSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1yaWdodCIpOwogICAgaWYgKHR5cGVvZih0aGlzLl9lbGVtZW50TWFyZ2luTGVmdCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5fZWxlbWVudE1hcmdpbkxlZnQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tbGVmdCIpOwogICAgaWYgKHR5cGVvZih0aGlzLl9lbGVtZW50TWFyZ2luUmlnaHQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMuX2VsZW1lbnRNYXJnaW5SaWdodCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm1hcmdpbi1yaWdodCIpOwogICAgaWYgKHR5cGVvZih0aGlzLl9idXR0b25NYXJnaW5SaWdodCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5fYnV0dG9uTWFyZ2luUmlnaHQgPSBnZXRTdHlsZSh0aGlzLmJ1dHRvbiwgIm1hcmdpbi1yaWdodCIpOwoKICAgIC8vdGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1sZWZ0Iik7CiAgICAvL3RoaXMuX2VsZW1lbnRQYWRkaW5nUmlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJwYWRkaW5nLXJpZ2h0Iik7CiAgICAvL3RoaXMuX2VsZW1lbnRNYXJnaW5MZWZ0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAibWFyZ2luLWxlZnQiKTsKICAgIC8vdGhpcy5fZWxlbWVudE1hcmdpblJpZ2h0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAibWFyZ2luLXJpZ2h0Iik7CgogICAgLy9kdW1wKHRoaXMuX2VsZW1lbnRNYXJnaW5SaWdodCk7CgogICAgaWYgKHR5cGVvZihvYmopID09ICJ1bmRlZmluZWQiKQogICAgICAgIG9iaiA9IHRoaXMuYnV0dG9uOwoKICAgIC8vIG5ldyBzb2x1dGlvbiAtIG9uIGNyZWF0aW9uIHdlIG1hcmdpbmVkIHRoZSBlbGVtZW50IHRvIG1pbnVzIHdpZHRoIG9mIHRoaXMuZWxlbWVudCAtIHNvIHRoZSBlbGVtZW50IHdpbGwgbm90IGdvIHRvIG5ldyBsaW5lIGlmIDEwMCUgd2lkdGggb3Igbm8gcGxhY2UKICAgIGlmICh0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b24iXSA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChnZXRTdHlsZShvYmosICJkaXNwbGF5IikgPT0gIm5vbmUiKQogICAgICAgIHJldHVybjsKICAgIAogICAgaWYgKGdldFN0eWxlKHRoaXMuZWxlbWVudCwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIikKICAgIHsKICAgICAgICBvYmouc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgfQoKICAgIHZhciB3cyA9IHRoaXMuZWxlbWVudC5zdHlsZS53aGl0ZVNwYWNlOwogICAgdGhpcy5lbGVtZW50LnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKCiAgICB2YXIgd2lkdGggPSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGg7CiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodDsKCiAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2hpdGVTcGFjZSA9IHdzOwoKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIC8vZHVtcCh3aWR0aCk7CiAgICAvL2R1bXAoaGVpZ2h0KTsKCiAgICBpZiAod2lkdGggJiYgdGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoKQogICAgewogICAgICAgIC8vc2V0U3R5bGUob2JqLCAib3V0ZXJXaWR0aCIsIGhlaWdodCsicHgiKTsKICAgICAgICBvYmouc3R5bGUud2lkdGggPSBoZWlnaHQrInB4IjsKICAgIH0KICAgIC8vIHpwdXNvYnVqZSBwcmkgenZldHNlbmkgd2luZG93cyAxMjUlIG5ldXN0YWxlIHBvYmxpa2F2YW5pIG8gMXB4IHZlbGlrb3N0IHZldHNpIGEgbWVuc2kgLSB2IGFkbWludSBuYWhvcmUgcHJpIEFkbWluVXNlckVtdWxhdGlvbiAtIHZ5cmVzZW5vIHBvbW9jaSB0b2xlcmFuY2UgdSByZXNpemV0aW1lcmhvb2sKICAgIGlmIChoZWlnaHQpCiAgICB7CiAgICAgICAgLy9zZXRTdHlsZShvYmosICJvdXRlckhlaWdodCIsIGhlaWdodCsicHgiKTsKICAgICAgICBvYmouc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0KyJweCI7CiAgICB9CiAgICAKICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9IGV4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50UGFkZGluZ0xlZnQpKyJweCI7IC8vIG11bHRpbGFuZ3VhZ2UgZmllbGRzCiAgICB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gb2JqLm9mZnNldFdpZHRoK2V4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50UGFkZGluZ1JpZ2h0KSsicHgiOwogICAgCiAgICAvLyB2YXJpYW50YSBBCiAgICBvYmouc3R5bGUubWFyZ2luVG9wID0gIjBweCI7CiAgICBvYmouc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKnRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCkrInB4IjsKICAgIGlmIChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJwb3NpdGlvbiIpID09ICJhYnNvbHV0ZSIpCiAgICB7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgb2JqLnN0eWxlLnBvc2l0aW9uID0gIiI7IC8vIHJlbGF0aXZlCiAgICB9CgogICAgdmFyIHBvczEgPSBnZXRQb3NpdGlvbih0aGlzLmVsZW1lbnQsIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlKTsKICAgIHZhciBwb3MyID0gZ2V0UG9zaXRpb24ob2JqLCB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSk7CiAgICAKICAgIHZhciBvdmVyZmxvd1BhcmVudCA9IG51bGw7CiAgICB2YXIgZWxlbSA9IG9iai5wYXJlbnROb2RlOwogICAgd2hpbGUoZWxlbSAmJiBlbGVtLnRhZ05hbWUpCiAgICB7CiAgICAgICAgaWYgKGdldFN0eWxlKGVsZW0sICJvdmVyZmxvdyIpICE9ICJ2aXNpYmxlIikKICAgICAgICB7CiAgICAgICAgICAgIG92ZXJmbG93UGFyZW50ID0gZWxlbTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICB9CgogICAgLy9kdW1wKHBvczFbInkiXStNYXRoLmZsb29yKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQvMikgIT0gcG9zMlsieSJdK01hdGguZmxvb3Iob2JqLm9mZnNldEhlaWdodC8yKSk7CiAgICBpZiAocG9zMVsieSJdK01hdGguZmxvb3IodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodC8yKSAhPSBwb3MyWyJ5Il0rTWF0aC5mbG9vcihvYmoub2Zmc2V0SGVpZ2h0LzIpICYmICFvdmVyZmxvd1BhcmVudCkKICAgICAgICBvYmouc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgCiAgICAvLyBzb21ldGltZXMgaXQgaXMgZmxvYXQKICAgIG9iai5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqb2JqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLWV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tcmlnaHQiKSktZXh0cmFjdEZsb2F0KHRoaXMuX2J1dHRvbk1hcmdpblJpZ2h0KSkrInB4IjsKICAgIG9iai5zdHlsZS5tYXJnaW5SaWdodCA9IChleHRyYWN0RmxvYXQodGhpcy5fYnV0dG9uTWFyZ2luUmlnaHQpIHx8IGV4dHJhY3RGbG9hdCh0aGlzLl9lbGVtZW50TWFyZ2luUmlnaHQpKSsicHgiOwogICAgLy9kdW1wKCItLS0tLSIpOwogICAgLy9kdW1wKG9iai5pZCk7CiAgICAvL2R1bXAob2JqLmNsYXNzTmFtZSk7CiAgICAvL2R1bXAoZXh0cmFjdEZsb2F0KHRoaXMuX2J1dHRvbk1hcmdpblJpZ2h0KSk7CiAgICAvL2R1bXAoZXh0cmFjdEZsb2F0KHRoaXMuX2VsZW1lbnRNYXJnaW5SaWdodCkpOwogICAgCiAgICBpZiAoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiKQogICAgewogICAgICAgIG9iai5zdHlsZS5tYXJnaW5MZWZ0ID0gKGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tbGVmdCIpKSt0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGgrZXh0cmFjdEZsb2F0KG9iai5zdHlsZS5tYXJnaW5MZWZ0KSkrInB4IjsKICAgIH0KCiAgICAvLyB2YXJpYW50YSBCCiAgICAvKgogICAgdmFyIG92ZXJmbG93UGFyZW50ID0gbnVsbDsKICAgIHZhciBlbGVtID0gb2JqLnBhcmVudE5vZGU7CiAgICB3aGlsZShlbGVtICYmIGVsZW0udGFnTmFtZSkKICAgIHsKICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbSwgIm92ZXJmbG93IikgIT0gInZpc2libGUiKQogICAgICAgIHsKICAgICAgICAgICAgb3ZlcmZsb3dQYXJlbnQgPSBlbGVtOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTsKICAgIH0KCiAgICBvYmouc3R5bGUubWFyZ2luVG9wID0gIjBweCI7CiAgICBvYmouc3R5bGUubWFyZ2luTGVmdCA9ICIwcHgiOwogICAgb2JqLnN0eWxlLnBvc2l0aW9uID0gIiI7IC8vIHJlbGF0aXZlCgogICAgdmFyIHBvczEgPSBnZXRQb3NpdGlvbih0aGlzLmVsZW1lbnQsIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlKTsKICAgIHZhciBwb3MyID0gZ2V0UG9zaXRpb24ob2JqLCB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSk7CgogICAgb2JqLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIGlmIChvdmVyZmxvd1BhcmVudCAmJiBvdmVyZmxvd1BhcmVudC5zdHlsZS5wb3NpdGlvbiAhPSAicmVsYXRpdmUiICYmIG92ZXJmbG93UGFyZW50LnN0eWxlLnBvc2l0aW9uICE9ICJhYnNvbHV0ZSIpCiAgICAgICAgb3ZlcmZsb3dQYXJlbnQuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgICAgIAogICAgLy8gMiB2YXJpYW50eSBwb3ppY292YW5pIC0gcG9rdWQgYnkgcHJvc3RvciB6YSBpbnB1dGVtIC0gcG90b20gYnlsbyB0bGFjaXRrbyB2cHJhdm8uCiAgICAvLyBwb2t1ZCBuZWJ5bG8gbcOtc3RvIG9kc2tvxI1pbG8gZG9sxa8gYSBqZSBwb3TFmWViYSBzcG/EjcOtdGF0IAoKICAgIG9iai5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqb2JqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLWV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtYXJnaW4tcmlnaHQiKSktdGhpcy5fYnV0dG9uTWFyZ2luUmlnaHQpKyJweCI7CiAgICAqLwogICAgCiAgICAvLyB2YXJpYW50YSBDCiAgICAvLyBkYW0gbXUgbWFyZ2luLWxlZnQgaG5lZCBuYSB6YWNhdGt1IC0gYXQgc2UgbWkgdnJhdGkgcHJlcwogICAgLypvYmouc3R5bGUubWFyZ2luTGVmdCA9ICgtMSkqdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKyJweCI7Ki8KICAgIAogICAgdGhpcy5wYXJlbnRfcmVkcmF3KCk7CiAgICAvL2R1bXAoIngiKTsKICAgIC8vZHVtcChlcnJvclN0YWNrLmxlbmd0aCk7Cn0KICAgIApUQnV0dG9uRWRpdC5wcm90b3R5cGUub25SZXNpemUgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLmRyYXdlZCkKICAgICAgICByZXR1cm47CiAgICAKICAgIGlmICh0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b24iXSA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICB0aGlzLmR1bXAoIlRCdXR0b25FZGl0OjpvblJlc2l6ZSgpIik7CgogICAgLy8gbmVlZGVkIGZvciBPcGVyYQogICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiT3BlcmEiICYmIHRoaXMucmVzaXplZCkgICAKICAgICAgICByZXR1cm47CiAgICAKICAgIHRoaXMucmVzaXplZCA9IHRydWU7CiAgICAKICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PSAiVEVYVEFSRUEiKQogICAgewogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAic2Nyb2xsIjsKICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudmVydGljYWxBbGlnbiA9ICJ0b3AiOwogICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAidG9wIjsKCiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgIHZhciBoZWlnaHQgPSAxODsKCiAgICAgICAgaWYgKHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCkKICAgICAgICAgICAgdGhpcy5idXR0b24uc3R5bGUud2lkdGggPSBoZWlnaHQrInB4IjsKICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZS5oZWlnaHQgPSBoZWlnaHQrInB4IjsKCiAgICAgICAgdGhpcy5idXR0b24uc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKjIqdGhpcy5idXR0b24ub2Zmc2V0V2lkdGgpKyJweCI7CiAgICAgICAgCiAgICAgICAgLy8gR2Vja28gYW5kIFNhZmFyaSBwdXRzIGJ1dHRvbiBsaWtlIDJweCBtYXJnaW4gYmVsb3cgaW5wdXQsIHRoaXMgbWV0aG9kIGlzIHVuaXZlcnNhbCB0byBwbGFjZSBib3RoIHRvIHNhbWUgcG9zaXRpb24gOikpCiAgICAgICAgLy92YXIgdG9wTWFyZ2luID0gZ2V0UG9zaXRpb24odGhpcy5idXR0b24sIHRoaXMuYnV0dG9uLnBhcmVudE5vZGUpWyd5J10tZ2V0UG9zaXRpb24odGhpcy5lbGVtZW50LCB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSlbJ3knXTsKICAgIAogICAgICAgIGlmIChCcm93c2VyLm5hbWUgIT0gIkZpcmVmb3giKSAvLyBpZiBwYWRkaW5nIC0gbW92ZXMgYWxzbyB0aGUgc2Nyb2xsYmFyIC0gaGFzbid0IGJlZW4gZml4ZWQgc2luY2UgTmV0c2NhcGUgOi8KICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IChoZWlnaHQrNCkrInB4IjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL3RoaXMuZWxlbWVudC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gInRvcCI7CiAgICAgICAgLy90aGlzLmJ1dHRvbi5zdHlsZS52ZXJ0aWNhbEFsaWduID0gInRvcCI7CgogICAgICAgIC8qCiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0OwoKICAgICAgICBpZiAodGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoKQogICAgICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZS53aWR0aCA9IGhlaWdodCsicHgiOwogICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlLmhlaWdodCA9IGhlaWdodCsicHgiOwogICAgICAgIAogICAgICAgIHZhciBtYXJnaW5JbmMgPSAwOwogICAgICAgIAogICAgICAgIAogICAgICAgIGlmIChCcm93c2VyLm5hbWU9PSJPcGVyYSIpIC8vIDEwMCUgd2lkdGggZWxlbWVudAogICAgICAgIHsKICAgICAgICAgICAgLy92YXIgcG9zID0gZ2V0V2luZG93UG9zaXRpb24odGhpcy5lbGVtZW50KTsKICAgICAgICAgICAgLy9tYXJnaW5JbmMgPSBwb3NbIngiXSs3OwogICAgICAgICAgICAvLyBUT0RPIC0gemppc3RpdCBwcm9jIDcKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IChoZWlnaHQrMikrInB4IjsKICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vdmFyIF90aGlzID0gdGhpczsKICAgICAgICAvL3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5yZWRyYXcoKX0sIDIwMDAwKTsKICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgfQp9CgovKgpUQnV0dG9uRWRpdC5wcm90b3R5cGUuX2ZpeFZlcnRpY2FsQWxpZ24gPSBmdW5jdGlvbigpCnsKICAgIC8vIGRvIG5vdCBuZWVkIC0gdXNlZCB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlIG9uIGlucHV0IGVsZW1lbnQgOykKICAgIHJldHVybjsKICAgIGlmICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ICE9IHRoaXMuYnV0dG9uLm9mZnNldEhlaWdodCkKICAgIHsKICAgICAgICBpZiAodGhpcy5fZml4VmVydGljYWxBbGlnbkFudGlMb29wIDwgMTApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLm9uUmVzaXplKCk7CiAgICAgICAgICAgIHRoaXMuZHVtcCgiVEJ1dHRvbkVkaXQ6IGVsZW1lbnQgYW5kIGJ1dHRvbiBhcmUgbm90IHNhbWUgaGVpZ2h0LCBza2lwcGluZy4uLiIpOwogICAgICAgICAgICB0aGlzLl9maXhWZXJ0aWNhbEFsaWduQW50aUxvb3ArKzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuZHVtcCgiISEhISEhISEgVEJ1dHRvbkVkaXQ6IGVsZW1lbnQgYW5kIGJ1dHRvbiBhcmUgbm90IHNhbWUgaGVpZ2h0IHN0aWxsIGFmdGVyIDEwIGxvb3BzLCBleGl0aW5nLi4uIik7CiAgICB9CiAgICAKICAgIHRoaXMuX2ZpeFZlcnRpY2FsQWxpZ25BbnRpTG9vcCA9IDA7CiAgICAKICAgIC8vYWxlcnQodGhpcy5lbGVtZW50LmlkKTsKICAgIHRoaXMuZHVtcCgiVEJ1dHRvbkVkaXQ6Ol9maXhWZXJ0aWNhbEFsaWduKCkiKTsKICAgIC8vIGZpbmQgYW55IGltZyBlbGVtZW50cyBhbmQgc2V0IHRoZW0gdmVydGljYWwtYWxpZ24gKG1pZGRsZSBkb2VzIG5vdCB3b3JrLCB3ZSBuZWVkIHRvIGRvIGl0IGluIHBpeGVscykKICAgIC8vIFRPRE8gZG8gaXQgZm9yIGlucHV0IGNvbnRhaW5pbmcgbW9yZSBpbWcgZWxlbWVudHMgKGRvIGl0IGZvciB0aGUgb25lIGhpZ2hlc3QgPykKICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciLCB0aGlzLmVsZW1lbnQpOwogICAgdGhpcy5kdW1wKHRoaXMuZWxlbWVudC5pZCsiIGZvdW5kOiAiK2VsZW1zLmxlbmd0aCsiIGltYWdlcyIpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBlbGVtID0gZWxlbXNbaV07CiAgICAgICAgaWYgKGVsZW0uY29tcGxldGUgfHwgZWxlbS5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIgfHwgZWxlbS5yZWFkeVN0YXRlID09ICJsb2FkZWQiKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJ1dHRvblkgPSBnZXRQb3NpdGlvbih0aGlzLmJ1dHRvbiwgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpWyd5J107CiAgICAgICAgICAgIHZhciBlbGVtZW50WSA9IGdldFBvc2l0aW9uKHRoaXMuZWxlbWVudCwgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpWyd5J107CiAgICAgICAgICAgIHZhciBvZmZzZXRZID0gYnV0dG9uWS1lbGVtZW50WTsKICAgICAgICAgICAgaWYgKG9mZnNldFkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ24gPSAwOwogICAgICAgICAgICAgICAgdmFyIGluY3JlbWVudCA9IChvZmZzZXRZID4gMCA/IDEgOiAtMSk7CiAgICAgICAgICAgICAgICB2YXIgYW50aUxvb3AgPSAwOyAgICAgICAgICAgIAogICAgICAgICAgICAgICAgd2hpbGUoZ2V0UG9zaXRpb24odGhpcy5idXR0b24sIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlKVsneSddICE9IGdldFBvc2l0aW9uKHRoaXMuZWxlbWVudCwgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpWyd5J10pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS52ZXJ0aWNhbEFsaWduID0gdmVydGljYWxBbGlnbisicHgiOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gKz0gaW5jcmVtZW50OwogICAgICAgICAgICAgICAgICAgIGFudGlMb29wKys7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKGFudGlMb29wID4gMTAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdW1wKCIhISEhISEhISBUQnV0dG9uRWRpdDogdmVydGljYWwtYWxpZ24gcmVzaXplOiBpbiBhIGxvb3AsIHNraXBwaW5nLi4uIChpbWcub2Zmc2V0SGVpZ2h0PSIrZWxlbS5vZmZzZXRIZWlnaHQrIiAtICIrZWxlbS5zcmMrIikiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyB0cnkgaXQgYWdhaW4gb24gb3RoZXIgc2lkZSBpZiBub3Qgc2V0CiAgICAgICAgICAgICAgICBpZiAoZ2V0UG9zaXRpb24odGhpcy5idXR0b24sIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlKVsneSddICE9IGdldFBvc2l0aW9uKHRoaXMuZWxlbWVudCwgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpWyd5J10pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ24gPSAwOwogICAgICAgICAgICAgICAgICAgIHZhciBpbmNyZW1lbnQgPSAob2Zmc2V0WSA+IDAgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgICAgIHZhciBhbnRpTG9vcCA9IDA7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgd2hpbGUoZ2V0UG9zaXRpb24odGhpcy5idXR0b24sIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlKVsneSddICE9IGdldFBvc2l0aW9uKHRoaXMuZWxlbWVudCwgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpWyd5J10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSB2ZXJ0aWNhbEFsaWduKyJweCI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gKz0gaW5jcmVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICBhbnRpTG9vcCsrOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW50aUxvb3AgPiAxMDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVtcCgiISEhISEhISEgVEJ1dHRvbkVkaXQ6IHZlcnRpY2FsLWFsaWduIHJlc2l6ZTogaW4gYSBsb29wLCBza2lwcGluZy4uLiAoaW1nLm9mZnNldEhlaWdodD0iK2VsZW0ub2Zmc2V0SGVpZ2h0KyIgLSAiK2VsZW0uc3JjKyIpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkdW1wKGVsZW0uc3R5bGUudmVydGljYWxBbGlnbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmR1bXAoInZlcnRpY2FsLWFsaWduIHJlc2l6ZTogbm90aGluZyB0byBkbywgd2VsbCBwb3NpdGlvbmVkLi4uIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHVtcChvZmZzZXRZKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kdW1wKCJ2ZXJ0aWNhbC1hbGlnbiByZXNpemU6IGltYWdlIG5vdCB5ZXQgbG9hZGVkLCBjYWxsaW5nIGxhdGVyLi4uIik7CiAgICAgICAgICAgIHRoaXMuZHVtcChlbGVtLnJlYWR5U3RhdGUpOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgLy9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMuX2ZpeFZlcnRpY2FsQWxpZ24oKX0sIDEwMCk7CiAgICAgICAgICAgIGFkZEV2ZW50KGVsZW0sICJsb2FkIiwgZnVuY3Rpb24oKXtfdGhpcy5kdW1wKCJbXVtdW11bXVtdW11bXVtdW11bXVtdW11bXVtdW10gSU1BR0UgTE9BREVEIC0gQ0FMTElORyBfZml4VmVydGljYWxBbGlnbigpIik7IF90aGlzLl9maXhWZXJ0aWNhbEFsaWduKCl9KTsKICAgICAgICB9CiAgICAgICAgLy9lbGVtLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAoKC0xKSp2ZXJ0aWNhbEFsaWduKSsicHgiOwogICAgICAgIAogICAgICAgIGJyZWFrOwogICAgfQogICAgCn0KKi8KClRCdXR0b25FZGl0LnByb3RvdHlwZS5vbkJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKQp7Cn0KClRCdXR0b25FZGl0LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLnBhcmVudF9oaWRlKCk7CiAgICB0aGlzLmJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwp9CgpUQnV0dG9uRWRpdC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJlbnRfc2hvdygpOwogICAgdGhpcy5idXR0b24uc3R5bGUuZGlzcGxheSA9ICIiOwp9ClRCdXR0b25FZGl0LnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlTmFtZSwgdmFsdWUpCnsKICAgIGlmIChjYW1lbGl6ZShzdHlsZU5hbWUpID09ICJtYXJnaW5SaWdodCIpCiAgICAgICAgc2V0U3R5bGUodGhpcy5idXR0b24sIHN0eWxlTmFtZSwgdmFsdWUpOwogICAgZWxzZQogICAgICAgIHRoaXMucGFyZW50X3NldFN0eWxlKHN0eWxlTmFtZSwgdmFsdWUpOwp9CgoKCgoKCgoKCi8qIHBva3VzIG8gTXVsdGlCdXR0b25FZGl0ICovCi8qCmZ1bmN0aW9uIFRCdXR0b25FZGl0KHBhcmFtcywgaWQpICAgCnsKICAgIGlmICghaWQpCiAgICAgICAgaWQgPSBVVUlEKCk7CiAgICAgICAgCiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsgLy8gc2VlIGJlbG93CiAgICB0aGlzLl9maXhWZXJ0aWNhbEFsaWduQW50aUxvb3AgPSAwOwogICAgCiAgICAvL2R1bXAoIiEhISEhIik7CiAgICAvL2R1bXAodGhpcyk7CiAgICBhZGRPYmplY3QodGhpcyk7CiAgICB0aGlzLl9jcmVhdGUoKTsKfQoKZXh0ZW5kQ2xhc3MoVEJ1dHRvbkVkaXQsIFRUZXh0RWRpdCk7CgpUQnV0dG9uRWRpdC5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLmR1bXBEYXRhID0gZmFsc2U7CiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJidXR0b25zIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMucGFyYW1zWyJidXR0b25zIl0gPSBbXTsKCiAgICBpZiAodGhpcy5wYXJhbXNbImJ1dHRvbnMiXS5sZW5ndGgpCiAgICB7CiAgICAgICAgdGhpcy5idXR0b25UYWdOYW1lID0gImRpdiI7CiAgICAgICAgdGhpcy5wYXJhbXNbImF1dG9zaXplQnV0dG9uV2lkdGgiXSA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8vdGhpcy5wYXJhbXNbImJ1dHRvblZpc2libGUiXSA9IGZhbHNlOwogICAgfQogICAgCiAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpbGluZSJdKQogICAgICAgIHRoaXMuaW5wdXRUYWdOYW1lID0gInRleHRhcmVhIjsKCiAgICB0aGlzLmlucHV0VGFnTmFtZSA9IHRoaXMuaW5wdXRUYWdOYW1lIHx8ICJpbnB1dCI7CiAgICB0aGlzLmJ1dHRvblRhZ05hbWUgPSB0aGlzLmJ1dHRvblRhZ05hbWUgfHwgImJ1dHRvbiI7CiAgICAKICAgIGlmICh0eXBlb2YodGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoKSA9PSAidW5kZWZpbmVkIikKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJhdXRvc2l6ZUJ1dHRvbldpZHRoIl0pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB0aGlzLmF1dG9zaXplQnV0dG9uV2lkdGggPSB0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b25XaWR0aCJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoID0gdHJ1ZTsKICAgIH0KICAgIAogICAgaWYgKHRoaXMucGFyYW1zWyJ0YWdOYW1lIl0pCiAgICB7CiAgICAgICAgLy90aGlzLmlucHV0VGFnTmFtZSA9IHRoaXMucGFyYW1zWyJ0YWdOYW1lIl07CiAgICAgICAgaWYgKHR5cGVvZih0aGlzLnBhcmFtc1siYnV0dG9uVmlzaWJsZSJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgdGhpcy5wYXJhbXNbImJ1dHRvblZpc2libGUiXSA9IGZhbHNlOwogICAgfQoKICAgIHRoaXMucGFyZW50X2NyZWF0ZSgpOwogICAgCiAgICAvL2R1bXAodGhpcy53aWR0aEZpeEVsZW1lbnQpOwogICAgCiAgICAvL3RoaXMuZHVtcChvdXRlckhUTUwodGhpcy5lbGVtZW50KSk7CiAgICAvL3RoaXMuY29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAvL2FkZENsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgIl9Db21wb25lbnQiKTsKCiAgICAvL3RoaXMuaW5wdXQgPSB0aGlzLmVsZW1lbnQ7CiAgICAvL3RoaXMuZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSB0cnVlOwogICAgLy9yZXR1cm47CiAgICAvL2R1bXAodGhpcy5lbGVtZW50KTsKICAgIGlmICh0aGlzLmlucHV0VGFnTmFtZSAhPSAibm9uZSIpCiAgICB7CiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9CdXR0b25FZGl0IiwgLTEpOwoKICAgICAgICB0aGlzLmJ1dHRvbiA9IGNyZWF0ZUVsZW1lbnQodGhpcy5idXR0b25UYWdOYW1lKTsKCgogICAgICAgIGlmICh0aGlzLmJ1dHRvblRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiYnV0dG9uIikKICAgICAgICAgICAgdGhpcy5idXR0b24uc2V0QXR0cmlidXRlKCJ0eXBlIiwgImJ1dHRvbiIpOyAvLyBtdXN0IHVzZSBzZXRBdHRyaWJ1dGUgLSBJRTgKICAgICAgICBpZiAodGhpcy5wYXJhbXNbImJ1dHRvblN0eWxlIl0pCiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnNldEF0dHJpYnV0ZSgic3R5bGUiLCB0aGlzLnBhcmFtc1siYnV0dG9uU3R5bGUiXSk7CiAgICAgICAgCiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiYnV0dG9uIik7CiAgICAgICAgaW5zZXJ0QWZ0ZXIodGhpcy5lbGVtZW50LCB0aGlzLmJ1dHRvbik7CgogICAgICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQpOwogICAgICAgIC8vaWYgKGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAibWFyZ2luLXJpZ2h0IikpKQogICAgICAgIC8vewogICAgICAgIC8vfQogICAgCiAgICAgICAgLy9zZXRTdHlsZSh0aGlzLmJ1dHRvbiwgImZsb2F0IiwgZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAiZmxvYXQiKSk7CgogICAgICAgIGlmIChnZXRTdHlsZSh0aGlzLmJ1dHRvbiwgIndpZHRoIikgJiYgIXRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCkgLy8gZHJ1aGEgcG9kbWlua2Ega3Z1bGkgU3BpbkVkaXQKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF0aGlzLnBhcmFtc1siYnV0dG9ucyJdLmxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRoYW5rcyB0byA8c3Bhbj4gLSB3ZSBkbyBub3QgbmVlZCB0byByZWZpeCB0aGUgYnV0dG9uIHBvc2l0aW9uCiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtc1siYnV0dG9uSWNvbiJdKQogICAgICAgICAgICAgICAgdGhpcy5idXR0b24uaW5uZXJIVE1MID0gIjxpbWcgc3JjPSciK3RoaXMucGFyYW1zWyJidXR0b25JY29uIl0rIicgLz4iOwogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmFtc1siYnV0dG9uVGV4dCJdICYmIHRoaXMucGFyYW1zWyJidXR0b25UZXh0Il0gIT0gIi4uLiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uLmlubmVySFRNTCA9IHRoaXMucGFyYW1zWyJidXR0b25UZXh0Il07CiAgICAgICAgICAgICAgICB0aGlzLmF1dG9zaXplQnV0dG9uV2lkdGggPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbi5pbm5lckhUTUwgPSAiLi4uIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5wYXJhbXNbImJ1dHRvblZpc2libGUiXSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIAogICAgICAgICAgICAvL3NldFN0eWxlKHRoaXMuYnV0dG9uLCAibWFyZ2luLXJpZ2h0IiwgIjBweCIpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnB1c2godGhpcy5idXR0b24pOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbWF5YmUgZmluYWwgc29sdXRpb24gZm9yIGJ1dHRvbiBwb3NpdGlvbmluZwogICAgICAgICAgICBpZiAodGhpcy5wYXJhbXNbImF1dG9zaXplQnV0dG9uIl0gIT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKSsicHgiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgicmVhZG9ubHkiKSk7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLnBhcmFtc1siZWRpdGFibGUiXSk7CiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgicmVhZG9ubHkiKSB8fCB0aGlzLnBhcmFtc1sicmVhZG9ubHlFbGVtZW50Il0pCiAgICAgICAgICAgICAgICBhZGRFdmVudCh0aGlzLmJ1dHRvbiwgImNsaWNrIiwgZnVuY3Rpb24oZSl7ZSA9IGdldE1vdXNlRXZlbnQoZSk7IGUuc3RvcCgpOyBfdGhpcy5vbkJ1dHRvbkNsaWNrKCk7fSk7CiAgICAgICAgICAgIC8vYWRkRXZlbnQodGhpcy5idXR0b24sICJkYmxjbGljayIsIGZ1bmN0aW9uKGUpe2UgPSBnZXRNb3VzZUV2ZW50KGUpOyBlLnN0b3AoKTsgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYnV0dG9uLmlubmVySFRNTCA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLnBhcmFtc1siYnV0dG9ucyJdLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IGNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICAgICAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9IHRoaXMucGFyYW1zWyJidXR0b25zIl1baV1bInRleHQiXTsKICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKGJ1dHRvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAicmVzaXplIiwgZnVuY3Rpb24oZSl7X3RoaXMub25SZXNpemUoKX0pOwogICAgICAgIC8vYWRkRXZlbnQodGhpcy5lbGVtZW50LCAibW92ZSIsIGZ1bmN0aW9uKGUpe190aGlzLl9maXhWZXJ0aWNhbEFsaWduKCl9KTsKICAgIH0KICAgICAgICAKICAgIGlmICghdGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoKQogICAgewogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgImJ1dHRvblRleHQiKTsKICAgIH0KCiAgICAvL2R1bXAodGhpcy5pZCk7CiAgICAvL2R1bXAodGhpcy5jbGFzc05hbWUpOwogICAgLy9kdW1wKHRoaXMuX2NsYXNzTmFtZSk7CiAgICBpZiAodGhpcy5jbGFzc05hbWUgPT0gdGhpcy5fY2xhc3NOYW1lKSAvLyBjYWxsZWQgb25seSBpZiB0aGlzIGlzIGZpbmFsIG9iamVjdCBjbGFzcwogICAgewogICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB0aGlzLm9uUmVzaXplKCk7CiAgICB9Cn0KClRCdXR0b25FZGl0LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQp7CiAgICB0aGlzLnBhcmVudF9zZXRWYWx1ZSh2YWx1ZSk7CiAgICAKICAgIGlmICh0aGlzLmlucHV0VGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJpbnB1dCIpCiAgICB7CiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPT0gIiIpICAgIAogICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gWldTUDsKICAgIH0KICAgIC8vdGhpcy5fZml4VmVydGljYWxBbGlnbigpOwp9CgpUQnV0dG9uRWRpdC5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24ob2JqKQp7CiAgICBpZiAodHlwZW9mKHRoaXMuX2VsZW1lbnRQYWRkaW5nTGVmdCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAicGFkZGluZy1sZWZ0Iik7CiAgICBpZiAodHlwZW9mKHRoaXMuX2VsZW1lbnRQYWRkaW5nUmlnaHQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMuX2VsZW1lbnRQYWRkaW5nUmlnaHQgPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJwYWRkaW5nLXJpZ2h0Iik7CiAgICBpZiAodHlwZW9mKHRoaXMuX2VsZW1lbnRNYXJnaW5MZWZ0KSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLl9lbGVtZW50TWFyZ2luTGVmdCA9IGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm1hcmdpbi1sZWZ0Iik7CiAgICBpZiAodHlwZW9mKHRoaXMuX2VsZW1lbnRNYXJnaW5SaWdodCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5fZWxlbWVudE1hcmdpblJpZ2h0ID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAibWFyZ2luLXJpZ2h0Iik7CiAgICBpZiAodHlwZW9mKHRoaXMuX2J1dHRvbk1hcmdpblJpZ2h0KSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLl9idXR0b25NYXJnaW5SaWdodCA9IGdldFN0eWxlKHRoaXMuYnV0dG9uLCAibWFyZ2luLXJpZ2h0Iik7CgogICAgaWYgKHR5cGVvZihvYmopID09ICJ1bmRlZmluZWQiKQogICAgICAgIG9iaiA9IHRoaXMuYnV0dG9uOwoKICAgIC8vIG5ldyBzb2x1dGlvbiAtIG9uIGNyZWF0aW9uIHdlIG1hcmdpbmVkIHRoZSBlbGVtZW50IHRvIG1pbnVzIHdpZHRoIG9mIHRoaXMuZWxlbWVudCAtIHNvIHRoZSBlbGVtZW50IHdpbGwgbm90IGdvIHRvIG5ldyBsaW5lIGlmIDEwMCUgd2lkdGggb3Igbm8gcGxhY2UKICAgIGlmICh0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b24iXSA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChnZXRTdHlsZShvYmosICJkaXNwbGF5IikgPT0gIm5vbmUiKQogICAgICAgIHJldHVybjsKICAgIAogICAgdmFyIHdpZHRoID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoOwogICAgdmFyIGhlaWdodCA9IHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7CgogICAgaWYgKHdpZHRoICYmIHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCkKICAgICAgICBvYmouc3R5bGUud2lkdGggPSBoZWlnaHQrInB4IjsKICAgIGlmIChoZWlnaHQpCiAgICAgICAgb2JqLnN0eWxlLmhlaWdodCA9IGhlaWdodCsicHgiOwogICAgCiAgICB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSBleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdMZWZ0KSsicHgiOyAvLyBtdWx0aWxhbmd1YWdlIGZpZWxkcwogICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IG9iai5vZmZzZXRXaWR0aCtleHRyYWN0RmxvYXQodGhpcy5fZWxlbWVudFBhZGRpbmdSaWdodCkrInB4IjsKICAgIAogICAgLy8gdmFyaWFudGEgQQogICAgb2JqLnN0eWxlLm1hcmdpblRvcCA9ICIwcHgiOwogICAgb2JqLnN0eWxlLm1hcmdpbkxlZnQgPSAoKC0xKSp0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGgpKyJweCI7CiAgICAKICAgIG9iai5zdHlsZS5wb3NpdGlvbiA9ICIiOyAvLyByZWxhdGl2ZQoKICAgIHZhciBwb3MxID0gZ2V0UG9zaXRpb24odGhpcy5lbGVtZW50LCB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSk7CiAgICB2YXIgcG9zMiA9IGdldFBvc2l0aW9uKG9iaiwgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpOwogICAgCiAgICB2YXIgb3ZlcmZsb3dQYXJlbnQgPSBudWxsOwogICAgdmFyIGVsZW0gPSBvYmoucGFyZW50Tm9kZTsKICAgIHdoaWxlKGVsZW0gJiYgZWxlbS50YWdOYW1lKQogICAgewogICAgICAgIGlmIChnZXRTdHlsZShlbGVtLCAib3ZlcmZsb3ciKSAhPSAidmlzaWJsZSIpCiAgICAgICAgewogICAgICAgICAgICBvdmVyZmxvd1BhcmVudCA9IGVsZW07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlOwogICAgfQoKICAgIGlmIChwb3MxWyJ5Il0rTWF0aC5mbG9vcih0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0LzIpICE9IHBvczJbInkiXStNYXRoLmZsb29yKG9iai5vZmZzZXRIZWlnaHQvMikgJiYgIW92ZXJmbG93UGFyZW50KQogICAgICAgIG9iai5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAKICAgIC8vIHNvbWV0aW1lcyBpdCBpcyBmbG9hdAogICAgb2JqLnN0eWxlLm1hcmdpbkxlZnQgPSAoKC0xKSpvYmouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgtZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIm1hcmdpbi1yaWdodCIpKS1leHRyYWN0RmxvYXQodGhpcy5fYnV0dG9uTWFyZ2luUmlnaHQpKSsicHgiOwogICAgb2JqLnN0eWxlLm1hcmdpblJpZ2h0ID0gKGV4dHJhY3RGbG9hdCh0aGlzLl9idXR0b25NYXJnaW5SaWdodCkgfHwgZXh0cmFjdEZsb2F0KHRoaXMuX2VsZW1lbnRNYXJnaW5SaWdodCkpKyJweCI7CgogICAgLy8gdmFyaWFudGEgQgogICAgCiAgICAvLyB2YXJpYW50YSBDCiAgICAvLyBkYW0gbXUgbWFyZ2luLWxlZnQgaG5lZCBuYSB6YWNhdGt1IC0gYXQgc2UgbWkgdnJhdGkgcHJlcwogICAgCiAgICB0aGlzLnBhcmVudF9yZWRyYXcoKTsKCn0KICAgIApUQnV0dG9uRWRpdC5wcm90b3R5cGUub25SZXNpemUgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLmRyYXdlZCkKICAgICAgICByZXR1cm47CiAgICAKICAgIGlmICh0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b24iXSA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICB0aGlzLmR1bXAoIlRCdXR0b25FZGl0OjpvblJlc2l6ZSgpIik7CgogICAgLy8gbmVlZGVkIGZvciBPcGVyYQogICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiT3BlcmEiICYmIHRoaXMucmVzaXplZCkgICAKICAgICAgICByZXR1cm47CiAgICAKICAgIHRoaXMucmVzaXplZCA9IHRydWU7CiAgICAKICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PSAiVEVYVEFSRUEiKQogICAgewogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAic2Nyb2xsIjsKICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudmVydGljYWxBbGlnbiA9ICJ0b3AiOwogICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAidG9wIjsKCiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgIHZhciBoZWlnaHQgPSAxODsKCiAgICAgICAgaWYgKHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCkKICAgICAgICAgICAgdGhpcy5idXR0b24uc3R5bGUud2lkdGggPSBoZWlnaHQrInB4IjsKICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZS5oZWlnaHQgPSBoZWlnaHQrInB4IjsKCiAgICAgICAgdGhpcy5idXR0b24uc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKjIqdGhpcy5idXR0b24ub2Zmc2V0V2lkdGgpKyJweCI7CiAgICAgICAgCiAgICAgICAgLy8gR2Vja28gYW5kIFNhZmFyaSBwdXRzIGJ1dHRvbiBsaWtlIDJweCBtYXJnaW4gYmVsb3cgaW5wdXQsIHRoaXMgbWV0aG9kIGlzIHVuaXZlcnNhbCB0byBwbGFjZSBib3RoIHRvIHNhbWUgcG9zaXRpb24gOikpCiAgICAgICAgLy92YXIgdG9wTWFyZ2luID0gZ2V0UG9zaXRpb24odGhpcy5idXR0b24sIHRoaXMuYnV0dG9uLnBhcmVudE5vZGUpWyd5J10tZ2V0UG9zaXRpb24odGhpcy5lbGVtZW50LCB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSlbJ3knXTsKICAgIAogICAgICAgIGlmIChCcm93c2VyLm5hbWUgIT0gIkZpcmVmb3giKSAvLyBpZiBwYWRkaW5nIC0gbW92ZXMgYWxzbyB0aGUgc2Nyb2xsYmFyIC0gaGFzbid0IGJlZW4gZml4ZWQgc2luY2UgTmV0c2NhcGUgOi8KICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IChoZWlnaHQrNCkrInB4IjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL3RoaXMuZWxlbWVudC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gInRvcCI7CiAgICAgICAgLy90aGlzLmJ1dHRvbi5zdHlsZS52ZXJ0aWNhbEFsaWduID0gInRvcCI7CgogICAgICAgIAogICAgICAgIC8vdmFyIF90aGlzID0gdGhpczsKICAgICAgICAvL3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5yZWRyYXcoKX0sIDIwMDAwKTsKICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgfQp9CgpUQnV0dG9uRWRpdC5wcm90b3R5cGUub25CdXR0b25DbGljayA9IGZ1bmN0aW9uKCkKewp9CgpUQnV0dG9uRWRpdC5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJlbnRfaGlkZSgpOwogICAgdGhpcy5idXR0b24uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKfQoKVEJ1dHRvbkVkaXQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMucGFyZW50X3Nob3coKTsKICAgIHRoaXMuYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAiIjsKfQpUQnV0dG9uRWRpdC5wcm90b3R5cGUuc2V0U3R5bGUgPSBmdW5jdGlvbihzdHlsZU5hbWUsIHZhbHVlKQp7CiAgICBpZiAoY2FtZWxpemUoc3R5bGVOYW1lKSA9PSAibWFyZ2luUmlnaHQiKQogICAgICAgIHNldFN0eWxlKHRoaXMuYnV0dG9uLCBzdHlsZU5hbWUsIHZhbHVlKTsKICAgIGVsc2UKICAgICAgICB0aGlzLnBhcmVudF9zZXRTdHlsZShzdHlsZU5hbWUsIHZhbHVlKTsKfQoKKi8=Ll9CdXR0b25FZGl0IHsNCiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgLW8tYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAtaWUtYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICAgICpiZWhhdmlvcjp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvQ3Jvc3NCcm93c2VyL2JveC1zaXppbmcuaHRjKTsgDQogICAgDQogICAgbWluLWhlaWdodDogMTZweDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCAjNzA3MDcwOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7DQogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCiAgICBtYXJnaW46IDBweDsNCiAgICBvdXRsaW5lOiAwcHg7DQogICAgLypwYWRkaW5nOiAyMHB4OyovDQp9DQoNCi5fQnV0dG9uRWRpdCBpbWcgew0KICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IC8qIHdpbGwgYmUgcmVjb3VudGVkIGluIG9uUmVzaXplIGV2ZW50ICovDQp9DQoNCg0KLl9CdXR0b25FZGl0ICsgLmJ1dHRvbiB7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICAgIC1vLWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgLWllLWJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAqYmVoYXZpb3I6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0Nyb3NzQnJvd3Nlci9ib3gtc2l6aW5nLmh0Yyk7IA0KDQogICAgYm9yZGVyOiAxcHggc29saWQgIzcwNzA3MDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICNGMkYyRjIgNTAlLCAjQ0ZDRkNGIDUwJSk7DQogICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjRjJGMkYyIDUwJSwgI0NGQ0ZDRiA1MCUpOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNGMkYyRjIgNTAlLCAjQ0ZDRkNGIDUwJSk7DQogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjRjJGMkYyIDUwJSwgI0NGQ0ZDRiA1MCUpOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjRjJGMkYyIDUwJSwgI0NGQ0ZDRiA1MCUpOw0KICAgIGZpbHRlcjogIHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjRjJGMkYyJywgRW5kQ29sb3JTdHI9JyNDRkNGQ0YnKTsNCiAgICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyNGMkYyRjInLCBFbmRDb2xvclN0cj0nI0NGQ0ZDRicpIjsNCiAgICBtYXJnaW46IDBweDsNCiAgICAvKm1hcmdpbi1yaWdodDogMHB4ICFpbXBvcnRhbnQ7Ki8gLyogUFJPQz8gKi8NCiAgICBwYWRkaW5nOiAwcHg7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgLypwb3NpdGlvbjogYWJzb2x1dGU7Ki8NCn0NCg0KLl9CdXR0b25FZGl0ICsgZGl2LmJ1dHRvbg0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCn0NCg0KLl9CdXR0b25FZGl0ICsgLmJ1dHRvbiwgLl9CdXR0b25FZGl0ICsgLmJ1dHRvbiBidXR0b24gew0KICAgIG1pbi1oZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsNCiAgICBtaW4td2lkdGg6IGF1dG8gIWltcG9ydGFudDsNCn0NCg0KLl9CdXR0b25FZGl0ICsgLmJ1dHRvbi5idXR0b25UZXh0IHsNCiAgICBwYWRkaW5nLWxlZnQ6MTBweDsNCiAgICBwYWRkaW5nLXJpZ2h0OjEwcHg7DQp9DQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQnV0dG9uRWRpdC9CdXR0b25FZGl0LmNsYXNzLnBocCAtLS0tLS0tIA0KDQpjbGFzcyBUQnV0dG9uRWRpdCBleHRlbmRzIFRUZXh0RWRpdA0Kew0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb25HZXRQcm9wZXJ0aWVzKCkNCiAgICB7DQogICAgICAgIHJldHVybihtZXJnZVByb3BlcnRpZXMocGFyZW50OjpvbkdldFByb3BlcnRpZXMoKSwgYXJyYXkoICAgICAgICANCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1KYXZhU2NyaXB0IEV2ZW50cyIsDQogICAgICAgICJuYW1lPW9uQnV0dG9uQ2xpY2ssY2FwdGlvbj1vbkJ1dHRvbkNsaWNrLG9iamVjdD1Db2RlRWRpdCIsDQogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249RWxlbWVudCIsDQogICAgICAgICJuYW1lPWJ1dHRvblRleHQsY2FwdGlvbj1CdXR0b24gVGV4dCxvYmplY3Q9VGV4dEVkaXQiLA0KICAgICAgICAibmFtZT1idXR0b25JY29uLGNhcHRpb249QnV0dG9uIEljb24sb2JqZWN0PUZpbGVFZGl0IiwNCiAgICAgICAgIm5hbWU9YnV0dG9uVmlzaWJsZSxjYXB0aW9uPUJ1dHRvbiBWaXNpYmxlLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLA0KICAgICAgICAibmFtZT1idXR0b25TdHlsZSxjYXB0aW9uPUJ1dHRvbiBTdHlsZSxvYmplY3Q9U3R5bGVFZGl0IiwNCiAgICAgICAgIm5hbWU9YnV0dG9uQ2xhc3MsY2FwdGlvbj1CdXR0b24gQ2xhc3Msb2JqZWN0PVRleHRFZGl0IiwNCiAgICAgICAgIm5hbWU9YnV0dG9uT25seSxjYXB0aW9uPUJ1dHRvbiBPbmx5LG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLA0KICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPU11bHRpYnV0dG9uIiwNCiAgICAgICAgYXJyYXkoDQogICAgICAgICAgICAibmFtZSIgPT4gImJ1dHRvbnMiLA0KICAgICAgICAgICAgImNhcHRpb24iID0+ICJCdXR0b25zIiwNCiAgICAgICAgICAgICJvYmplY3QiID0+ICJHcmlkRWRpdCIsDQogICAgICAgICAgICAiZmllbGRzIiA9PiBhcnJheSgNCiAgICAgICAgICAgICAgICBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIgPT4gYXJyYXkoIm9iamVjdCI9PiJUZXh0RWRpdCIpLA0KICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAiaWNvbiIsDQogICAgICAgICAgICAgICAgICAgICJvYmplY3QiID0+IGFycmF5KCJvYmplY3QiPT4iRmlsZUVkaXQiKSwNCiAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgIGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gInN0eWxlIiwNCiAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIgPT4gYXJyYXkoIm9iamVjdCI9PiJTdHlsZUVkaXQiKSwNCiAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgIGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gImF1dG9zaXplIiwNCiAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIgPT4gYXJyYXkoIm9iamVjdCI9PiJDb21ib0JveCIsICJ2YWx1ZXM9fHRydWV8ZmFsc2UiKSwNCiAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgIGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gImF1dG9zaXplV2lkdGgiLA0KICAgICAgICAgICAgICAgICAgICAib2JqZWN0IiA9PiBhcnJheSgib2JqZWN0Ij0+IkNvbWJvQm94IiwgInZhbHVlcz18dHJ1ZXxmYWxzZSIpLA0KICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICApLA0KICAgICAgICApLA0KICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPVZpc3VhbCIsDQogICAgICAgICJuYW1lPWF1dG9zaXplQnV0dG9uLGNhcHRpb249QXV0b3NpemUgQnV0dG9uLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLA0KICAgICAgICAibmFtZT1hdXRvc2l6ZUJ1dHRvbldpZHRoLGNhcHRpb249QXV0b3NpemUgQnV0dG9uIFdpZHRoLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLA0KICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPUJlaGF2aW9yIiwNCiAgICAgICAgIm5hbWU9cmVhZG9ubHlFbGVtZW50LGNhcHRpb249RWxlbWVudCBSZWFkb25seSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwNCiAgICAgICAgKSkpOyAgICAgICAgDQogICAgfQ0KDQogICAgZnVuY3Rpb24gb25HZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpDQogICAgew0KICAgICAgICBpZiAoIWhlYWRIdG1sQWRkZWQoX19DTEFTU19fLCAkcGFyYW1zKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcGFyZW50OjpvbkdldEhlYWRIdG1sKCRwYXJhbXMpOw0KICAgICAgICANCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9CdXR0b25FZGl0L0J1dHRvbkVkaXQuY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7DQogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPGxpbmsgaHJlZj0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvQnV0dG9uRWRpdC9CdXR0b25FZGl0LmNsYXNzLmNzcycgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgLz4iLHRydWUpOw0KICAgICAgICAgICAgYWRkRXh0ZW5kaW5nSGVhZEh0bWwoJHBhcmFtcywgX19DTEFTU19fKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG9uR2V0Q29udGVudCgmJHBhcmFtcz1hcnJheSgpLCAkdmFsdWU9IiIpDQogICAgew0KICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsNCiAgICAgICAgJHRoaXMtPmdldEhlYWRIdG1sKCRwYXJhbXMpOw0KICAgICAgICANCiAgICAgICAgaWYgKCRwYXJhbXNbImJ1dHRvbkljb24iXSkNCiAgICAgICAgICAgICRwYXJhbXNbImJ1dHRvbkljb24iXSA9IGdldFVybEZyb21QYXRoKCRwYXJhbXNbImJ1dHRvbkljb24iXSk7DQogICAgICAgICAgICANCiAgICAgICAgaWYgKCRwYXJhbXNbInJlYWRvbmx5RWxlbWVudCJdID09PSB0cnVlKQ0KICAgICAgICAgICAgJHBhcmFtc1sicmVhZG9ubHkiXSA9IHRydWU7DQoNCiAgICAgICAgcmV0dXJuKHBhcmVudDo6b25HZXRDb250ZW50KCRwYXJhbXMsICR2YWx1ZSkpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gVENvbWJvQm94KHBhcmFtcywgaWQpICAgCnsKICAgIGlmICghaWQpCiAgICAgICAgaWQgPSBVVUlEKCk7CiAgICAgICAgCiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUQ29tYm9Cb3gsIFRCdXR0b25FZGl0KTsKClRDb21ib0JveC5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKQp7CiAgICAvL2R1bXAodGhpcy5pZCk7CiAgICAKICAgIC8vcmV0dXJuOwogICAgdGhpcy5fY2xlYXIoKTsKCiAgICB0aGlzLmtleVByZWZpeCA9ICIiOwogICAgCiAgICBpZiAodGhpcy5wYXJhbXNbImVkaXRhYmxlIl0pCiAgICB7CiAgICAgICAgdGhpcy5pbnB1dFRhZ05hbWUgPSAiZGl2IjsKICAgICAgICB0aGlzLmJ1dHRvblRhZ05hbWUgPSAiYnV0dG9uIjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0aGlzLmlucHV0VGFnTmFtZSA9ICJidXR0b24iOwogICAgICAgIHRoaXMuYnV0dG9uVGFnTmFtZSA9ICJidXR0b24iOwogICAgfQoKICAgIHRoaXMuc2VsZWN0ID0gZ2V0RWxlbWVudCh0aGlzLmlkKTsKICAgIGFkZENsYXNzTmFtZSh0aGlzLnNlbGVjdCwgIl9Db21ib0JveCIpOwogICAgdGhpcy5zZWxlY3Qub2JqZWN0ID0gdGhpczsKICAgIHZhciBfY2xhc3MgPSB0aGlzLnNlbGVjdC5jbGFzc05hbWU7CiAgICBpZiAodGhpcy5wYXJhbXNbImVkaXRhYmxlIl0pCiAgICAgICAgX2NsYXNzICs9ICIgZWRpdGFibGUiOwoKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIC8vZHVtcCh0aGlzLnBhcmFtcyk7CiAgICBpZiAodHlwZW9mKHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCkgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZih0aGlzLnBhcmFtc1siYXV0b3NpemVCdXR0b25XaWR0aCJdKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgdGhpcy5hdXRvc2l6ZUJ1dHRvbldpZHRoID0gdGhpcy5wYXJhbXNbImF1dG9zaXplQnV0dG9uV2lkdGgiXTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuYXV0b3NpemVCdXR0b25XaWR0aCA9IHRydWU7CiAgICB9CgogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CgogICAgdGhpcy5zZWxlY3QuY2xhc3NOYW1lID0gIiI7CgogICAgc2V0Q29udGVudEVkaXRhYmxlKHRoaXMuZWxlbWVudCwgZmFsc2UpOwogICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9Db21ib0JveCIpOwogICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiX0NvbWJvQm94QnV0dG9uIik7CiAgICBhZGRDbGFzc05hbWUodGhpcy5lbGVtZW50LCBfY2xhc3MpOwogICAgCiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJpZCIpOwogICAgCiAgICB0aGlzLmJ1dHRvbkltZyA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy5idXR0b25JbWcuaW5uZXJIVE1MID0gWldTUDsKICAgIHRoaXMuYnV0dG9uLmlubmVySFRNTCA9ICIiOwogICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5idXR0b25JbWcpOwoKICAgIGlmICghdGhpcy5wYXJhbXNbImxhYmVsUHJlZml4Il0pCiAgICAgICAgdGhpcy5wYXJhbXNbImxhYmVsUHJlZml4Il0gPSAiIjsKCiAgICB0aGlzLmVsZW1lbnQubmFtZSA9ICIiOwogICAKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBpZiAodGhpcy5wYXJhbXNbImVkaXRhYmxlIl0pCiAgICB7CiAgICAgICAgc2V0Q29udGVudEVkaXRhYmxlKHRoaXMuZWxlbWVudCwgdHJ1ZSk7CiAgICAgICAgCiAgICAgICAgLy9hZGRFdmVudCh0aGlzLmVsZW1lbnQsICJrZXl1cCIsIGZ1bmN0aW9uKGUpe190aGlzLm9uRWRpdGFibGVDaGFuZ2UoZSk7fSk7CiAgICAgICAgLy9hZGRFdmVudCh0aGlzLmVsZW1lbnQsICJjaGFuZ2UiLCBmdW5jdGlvbihlKXtfdGhpcy5vbkVkaXRhYmxlQ2hhbmdlKGUpO30pOwogICAgICAgIGFkZEV2ZW50KHRoaXMuZWxlbWVudCwgImJsdXIiLCBmdW5jdGlvbihlKXtfdGhpcy5vbkVkaXRhYmxlQ2hhbmdlKGUpO30pOwogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgdGhpcy5lZGl0YWJsZU9wdGlvbiA9IGdldEVsZW1lbnRCeUF0dHJpYnV0ZSgiZWRpdGFibGUiLCBudWxsLCB0aGlzLnNlbGVjdCk7CiAgICAgICAgLy9kdW1wKHRoaXMuZWRpdGFibGVPcHRpb24pOwogICAgICAgIGlmICghdGhpcy5lZGl0YWJsZU9wdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVPcHRpb24gPSBjcmVhdGVFbGVtZW50KCJvcHRpb24iKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Qub3B0aW9uc1t0aGlzLnNlbGVjdC5vcHRpb25zLmxlbmd0aF0gPSB0aGlzLmVkaXRhYmxlT3B0aW9uOwogICAgICAgIH0KICAgICAgICB0aGlzLmVkaXRhYmxlT3B0aW9uLl9oaWRkZW4gPSB0cnVlOwogICAgICAgIC8vdGhpcy5zZWxlY3QuYXBwZW5kQ2hpbGQodGhpcy5lZGl0YWJsZU9wdGlvbik7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJjbGljayIsIGZ1bmN0aW9uKGUpe2UgPSBnZXRNb3VzZUV2ZW50KGUpOyBlLnN0b3AoKTsgX3RoaXMub25CdXR0b25DbGljaygpOyByZXR1cm4gZmFsc2U7fSk7CiAgICB9CgogICAgaWYgKHRoaXMucGFyYW1zWyJlZGl0YWJsZSJdIHx8IHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdICYmIHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdEpvaW5WYWx1ZXMiXSkKICAgIHsKICAgICAgICB0aGlzLmVkaXRhYmxlT3B0aW9uID0gZ2V0RWxlbWVudEJ5QXR0cmlidXRlKCJlZGl0YWJsZSIsIG51bGwsIHRoaXMuc2VsZWN0KTsKICAgICAgICAvL2R1bXAodGhpcy5lZGl0YWJsZU9wdGlvbik7CiAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlT3B0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCJYIik7CiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVPcHRpb24gPSBjcmVhdGVFbGVtZW50KCJvcHRpb24iKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Qub3B0aW9uc1t0aGlzLnNlbGVjdC5vcHRpb25zLmxlbmd0aF0gPSB0aGlzLmVkaXRhYmxlT3B0aW9uOwogICAgICAgIH0KICAgICAgICB0aGlzLmVkaXRhYmxlT3B0aW9uLl9oaWRkZW4gPSB0cnVlOwogICAgfQogICAgCiAgICBhZGRFdmVudCh0aGlzLmVsZW1lbnQsICJmb2N1cyIsIGZ1bmN0aW9uKGUpe190aGlzLmZvY3VzZWQ9dHJ1ZX0pOwogICAgYWRkRXZlbnQodGhpcy5lbGVtZW50LCAiYmx1ciIsIGZ1bmN0aW9uKGUpe190aGlzLmZvY3VzZWQ9ZmFsc2V9KTsKICAgIGFkZEV2ZW50KHRoaXMuZWxlbWVudCwgImtleWRvd24iLCBmdW5jdGlvbihlKXtfdGhpcy5fb25FbGVtZW50S2V5RG93bihlKX0pOwoKICAgIGFkZEV2ZW50KHdpbmRvdywgImtleWRvd24iLCBmdW5jdGlvbihlKXtfdGhpcy5fb25LZXlEb3duKGUpO30pOwogICAgYWRkRXZlbnQod2luZG93LCAiY2xpY2siLCBmdW5jdGlvbihlKQogICAgewogICAgICAgIGUgPSBnZXRNb3VzZUV2ZW50KGUpOwogICAgICAgIHZhciBlbGVtID0gZS50YXJnZXQ7CiAgICAgICAgdmFyIGluc2lkZUVsZW0gPSBmYWxzZTsKICAgICAgICB3aGlsZShlbGVtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGVsZW0gPT0gX3RoaXMub3B0aW9uc0NvbnRhaW5lcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW5zaWRlRWxlbSA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFpbnNpZGVFbGVtICYmIF90aGlzLmV4cGFuZGVkKQogICAgICAgIHsKICAgICAgICAgICAgX3RoaXMuY29sbGFwc2UoKTsKICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgfQogICAgfSk7CiAgICBhZGRFdmVudCh3aW5kb3csICJrZXlwcmVzcyIsIGZ1bmN0aW9uKGUpe190aGlzLl9vbktleVByZXNzKGUpO30pOwogICAgCiAgICB0aGlzLm9wdGlvbnNDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KCJ1bCIpOwogICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLm9iamVjdCA9IHRoaXM7CiAgICBhZGRDbGFzc05hbWUodGhpcy5vcHRpb25zQ29udGFpbmVyLCAiX0NvbWJvQm94T3B0aW9ucyIpOwogICAgaW5zZXJ0QWZ0ZXIodGhpcy5idXR0b24sIHRoaXMub3B0aW9uc0NvbnRhaW5lcik7CiAgICBhZGRFdmVudCh0aGlzLm9wdGlvbnNDb250YWluZXIsICJyY2xpY2siLCBmdW5jdGlvbihlKXtfdGhpcy5fb25SQ2xpY2soZSl9KTsgLy8gZm9yIENvbnRleHRNZW51CiAgICAKICAgIC8vdGhpcy5vcHRpb25zQ29udGVudENvbnRhaW5lciA9IHRoaXMub3B0aW9uc0NvbnRhaW5lcjsKCiAgICAvL2R1bXAodGhpcy5wYXJhbXNbIm1vZGFsIl0pOwogICAgaWYgKHRoaXMucGFyYW1zWyJtb2RhbCJdKQogICAgewogICAgICAgIHRoaXMubW9kYWxCdXR0b25Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5tb2RhbEJ1dHRvbkNvbnRhaW5lciwgIl9Db21ib0JveE9wdGlvbnNNb2RhbEJ1dHRvbkNvbnRhaW5lciIpOwoKICAgICAgICB0aGlzLm1vZGFsQnV0dG9uID0gY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgICAgdGhpcy5tb2RhbEJ1dHRvbi5pbm5lckhUTUwgPSB0aGlzLnBhcmFtc1sibW9kYWxCdXR0b25UaXRsZSJdOwogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLm1vZGFsQnV0dG9uLCAiX0J1dHRvbiBfQ29tYm9Cb3hPcHRpb25zTW9kYWxCdXR0b24iKTsKICAgICAgICBhcHBlbmRMYXN0KHRoaXMubW9kYWxCdXR0b25Db250YWluZXIsIHRoaXMubW9kYWxCdXR0b24pOwogICAgICAgIAogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgYWRkRXZlbnQodGhpcy5tb2RhbEJ1dHRvbiwgImNsaWNrIiwgZnVuY3Rpb24oZSl7X3RoaXMuY29sbGFwc2UoKTt9KTsKICAgICAgICAKICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5vcHRpb25zQ29udGFpbmVyLCAiX0NvbWJvQm94T3B0aW9uc01vZGFsIik7CgogICAgICAgIHRoaXMuZWxlbWVudHMucHVzaCh0aGlzLm1vZGFsQnV0dG9uKTsKICAgICAgICB0aGlzLmVsZW1lbnRzLnB1c2godGhpcy5tb2RhbEJ1dHRvbkNvbnRhaW5lcik7CiAgICAgICAgCiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBhZGRFdmVudCh0aGlzLm9wdGlvbnNDb250YWluZXIsICJyZXNpemUiLCBmdW5jdGlvbigpe190aGlzLl9vbk1vZGFsQnV0dG9uUmVzaXplKCl9KTsKCiAgICAgICAgLy90aGlzLm9wdGlvbnNDb250ZW50Q29udGFpbmVyID0gdGhpcy5tb2RhbEJ1dHRvbkNvbnRhaW5lcjsKICAgIH0KCiAgICAvL2R1bXAodGhpcy5wYXJhbXNbIm1vZGFsIl0pOwogICAgLy9kdW1wKHRoaXMubW9kYWxCdXR0b24pOwoKCiAgICB0aGlzLmNyZWF0ZUZyb21IdG1sKHRoaXMuc2VsZWN0KTsKICAgIHRoaXMuZHJhdygpOwoKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAvL2FkZEV2ZW50KHRoaXMub3B0aW9uc0NvbnRhaW5lciwgIm1vdXNld2hlZWwiLCBmdW5jdGlvbihlKXtfdGhpcy5fb25Nb3VzZVdoZWVsKGUpO30pOwoKICAgIHRoaXMuZWxlbWVudHMgPSBbCiAgICAgICAgdGhpcy5lbGVtZW50LAogICAgICAgIHRoaXMuYnV0dG9uLAogICAgICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lciwKICAgICAgICB0aGlzLnNlbGVjdAogICAgXTsKCiAgICBpZiAodGhpcy5wYXJhbXNbImNoaWxkQ29tcG9uZW50Il0pCiAgICB7CiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuc2VsZWN0LCAiY2hpbGRDb21wb25lbnQiKTsKICAgIH0KCiAgICB0aGlzLmVsZW1lbnQuaWQgPSB0aGlzLnNlbGVjdC5pZDsKICAgIHRoaXMuc2VsZWN0LmlkID0gIiI7CiAgICAKCiAgICAvL3RoaXMuX3NldFZhbHVlKHRoaXMuc2VsZWN0LnZhbHVlKTsKICAgIC8vZHVtcCh0aGlzLm5hbWUpOwogICAgLy90aGlzLl9zZXRWYWx1ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgCiAgICAvL3RoaXMuc2VsZWN0LnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIC8vaWYgKHRoaXMuY2xhc3NOYW1lID09IHRoaXMuX2NsYXNzTmFtZSkgLy8gY2FsbGVkIG9ubHkgaWYgdGhpcyBpcyBmaW5hbCBvYmplY3QgY2xhc3MKICAgIC8vewogICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB0aGlzLm9uUmVzaXplKCk7CiAgICAvL30KICAgIAp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLm9uQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuZXhwYW5kQ29sbGFwc2UoKTsKfQoKVENvbWJvQm94LnByb3RvdHlwZS5mdWxsUmVsb2FkID0gZnVuY3Rpb24ocGFyYW1zKQp7CiAgICBkZWxldGUodGhpcy5wYXJhbXNbInZhbHVlcyJdKTsKICAgIGRlbGV0ZSh0aGlzLnBhcmFtc1sidGV4dHMiXSk7CiAgICBkZWxldGUodGhpcy5wYXJhbXNbImxhYmVscyJdKTsKICAgIGRlbGV0ZSh0aGlzLnBhcmFtc1siZGF0YSJdKTsKICAgIAogICAgdGhpcy5wYXJlbnRfZnVsbFJlbG9hZCgpOwp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLm9uRWRpdGFibGVDaGFuZ2UgPSBmdW5jdGlvbigpCnsKICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuc2VsZWN0LnZhbHVlOwogICAgCiAgICB2YXIgdmFsdWUgPSB0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQgfHwgdGhpcy5lbGVtZW50LmlubmVyVGV4dDsKICAgIC8vdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHZhbHVlOyAvLyBCbGJuZSB2ZSBGRiBwcmkgZWRpdGFjaQoKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICAgICAgdGhpcy5vcHRpb25zW2ldLm9iamVjdC5yZW1vdmVBdHRyaWJ1dGUoInNlbGVjdGVkIik7CiAgICAKICAgIGlmICh0eXBlb2YodmFsdWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHZhbHVlID0gIiI7CiAgICB0aGlzLmVkaXRhYmxlT3B0aW9uLnZhbHVlID0gdmFsdWU7CiAgICB0aGlzLmVkaXRhYmxlT3B0aW9uLmlubmVySFRNTCA9IHZhbHVlOwogICAgdGhpcy5zZWxlY3QudmFsdWUgPSB2YWx1ZTsKICAgIGlmICh2YWx1ZSAhPSAiIikKICAgICAgICB0aGlzLmVkaXRhYmxlT3B0aW9uLnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCAic2VsZWN0ZWQiKTsKCiAgICAvL2R1bXAodGhpcy5zZWxlY3QpOwogICAgLy90aGlzLmNyZWF0ZUZyb21IdG1sKHRoaXMuc2VsZWN0KTsKICAgIHRoaXMuZHJhd09wdGlvbnNDb250YWluZXIoKTsKICAgIAogICAgLy9kdW1wKG9sZFZhbHVlKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUgJiYgdGhpcy5vbkNoYW5nZSkKICAgIHsKICAgICAgICAvL2R1bXAodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICAvL2R1bXAodGhpcy5vbkNoYW5nZSk7CiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7CiAgICB9Cn0KClRDb21ib0JveC5wcm90b3R5cGUuY3JlYXRlRnJvbUh0bWwgPSBmdW5jdGlvbihzZWxlY3QpCnsKICAgIC8vZHVtcCgxKTsKCiAgICAvL3RoaXMub3B0aW9uc0NvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgIHRoaXMuY2xlYXJPcHRpb25zQ29udGFpbmVyKCk7CgogICAgdGhpcy5vcHRpb25zID0gW107CiAgICB0aGlzLmdyb3VwcyA9IFtdOwogICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIsIHNlbGVjdCk7CgogICAgLy8gbmFqaXQgdnNlY2hueSBzIGNsYXNzPSdoaWRkZW4nIGEgcG9rZHUgZXhpdHVqaSBwcmVkY2hvemksIHBhayBqZSBvZGVicmF0CiAgICAKICAgIHZhciBlZGl0YWJsZU9wdGlvbiA9IGdldEVsZW1lbnRCeUF0dHJpYnV0ZSgiZWRpdGFibGUiLCBudWxsLCB0aGlzLnNlbGVjdCk7CiAgICBpZiAoZWRpdGFibGVPcHRpb24pCiAgICB7CiAgICAgICAgLy9kdW1wKCJZIik7CiAgICAgICAgdGhpcy5lZGl0YWJsZU9wdGlvbiA9IGVkaXRhYmxlT3B0aW9uOwogICAgICAgIHRoaXMuZWRpdGFibGVPcHRpb24uX2hpZGRlbiA9IHRydWU7CiAgICB9CgogICAgLy92YXIgdmFsdWVzID0gW107CiAgICAKICAgIC8vZHVtcCh0aGlzLm5hbWUpOwogICAgdmFyIGVtcHR5VmFsdWVGb3VuZCA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBvcHRpb24gPSBlbGVtc1tpXTsKICAgICAgICBpZiAoIWhhc0NsYXNzTmFtZShvcHRpb24sICJzZXBhcmF0b3IiKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9wdGlvbi5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CiAgICAgICAgICAgIC8vZHVtcChvcHRpb24udmFsdWUpOwogICAgICAgICAgICBpZiAob3B0aW9uLnZhbHVlID09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAob3B0aW9uKTsKICAgICAgICAgICAgICAgIGVtcHR5VmFsdWVGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoSlNPTi5pc0pTT04odmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uZGVjb2RlKHZhbHVlKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVbInZhbHVlIl0pICE9ICJ1bmRlZmluZWQiICYmIHZhbHVlWyJ2YWx1ZSJdID09ICIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVtcHR5VmFsdWVGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vZHVtcChlbXB0eVZhbHVlRm91bmQpOyAgICAKICAgIGlmICghZW1wdHlWYWx1ZUZvdW5kLyogJiYgIXRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdKi8pCiAgICB7CiAgICAgICAgdmFyIG9wdGlvbiA9IGNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwogICAgICAgIG9wdGlvbi52YWx1ZSA9ICIiOwogICAgICAgIG9wdGlvbi5zZXRBdHRyaWJ1dGUoImRhdGEtbGFiZWwiLCB0aGlzLnBhcmFtc1sibnVsbExhYmVsIl0gfHwgIiIpOwogICAgICAgIG9wdGlvbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGV4dCIsIHRoaXMucGFyYW1zWyJudWxsVGV4dCJdIHx8ICIiKTsKICAgICAgICBvcHRpb24uX2hpZGRlbiA9IHRydWU7CiAgICAgICAgCiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7CiAgICAgICAgZWxlbXMucHVzaChvcHRpb24pOwogICAgfQoKICAgIHZhciBvcHRpb25zQ29udGFpbmVyOwogICAgdmFyIGxpRmlyc3QgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBvcHRpb24gPSBlbGVtc1tpXTsKICAgICAgICAKICAgICAgICBpZiAob3B0aW9uLnBhcmVudE5vZGUudGFnTmFtZSA9PSAiT1BUR1JPVVAiKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGdyb3VwID0gb3B0aW9uLnBhcmVudE5vZGU7CiAgICAgICAgICAgIG9wdGlvbnNDb250YWluZXIgPSBudWxsOwogICAgICAgICAgICBmb3IgKHZhciBnID0gMCA7IGcgPCB0aGlzLmdyb3Vwcy5sZW5ndGggOyBnKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3Vwc1tnXVsib2JqZWN0Il0gPT0gZ3JvdXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0NvbnRhaW5lciA9IHRoaXMuZ3JvdXBzW2ddWyJ1bCJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIW9wdGlvbnNDb250YWluZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGdyb3VwLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKICAgICAgICAgICAgICAgIHZhciBsaSA9IGNyZWF0ZUVsZW1lbnQoImxpIik7CiAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gbGFiZWw7CiAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUoc3BhbiwgImdyb3VwIik7CiAgICAgICAgICAgICAgICBsaS5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChsaSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB1bCA9IGNyZWF0ZUVsZW1lbnQoInVsIik7CiAgICAgICAgICAgICAgICBsaS5hcHBlbmRDaGlsZCh1bCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzLnB1c2goKHsnbGFiZWwnOmxhYmVsLCAnb2JqZWN0Jzpncm91cCwgJ3VsJzp1bH0pKTsKICAgICAgICAgICAgICAgIG9wdGlvbnNDb250YWluZXIgPSB1bDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSAwIDsgZyA8IHRoaXMuZ3JvdXBzLmxlbmd0aCA7IGcrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cHNbZ11bIm9iamVjdCJdID09IGdyb3VwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0NvbnRhaW5lciA9IHRoaXMuZ3JvdXBzW2ddWyJ1bCJdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG9wdGlvbnNDb250YWluZXIgPSB0aGlzLm9wdGlvbnNDb250YWluZXI7CiAgICAgICAgCiAgICAgICAgLy9pZiAoIW9wdGlvbi5faGlkZGVuKQogICAgICAgIGlmIChvcHRpb24gIT0gdGhpcy5lZGl0YWJsZU9wdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9wdGlvbi52YWx1ZTsKICAgICAgICAgICAgdmFyIGxhYmVsID0gaHRtbGVudGl0eV9kZWNvZGUob3B0aW9uLmdldEF0dHJpYnV0ZSgiZGF0YS1sYWJlbCIpIHx8IG9wdGlvbi5pbm5lckhUTUwpOwogICAgICAgICAgICB2YXIgdGV4dCA9IGh0bWxlbnRpdHlfZGVjb2RlKG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRhdGEtdGV4dCIpIHx8IG9wdGlvbi5pbm5lckhUTUwpOwogICAgICAgICAgICB2YXIgZGF0YSA9IGh0bWxlbnRpdHlfZGVjb2RlKG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRhdGEiKSB8fCAiIik7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGV4dCA9PSAiIikKICAgICAgICAgICAgICAgIHRleHQgPSAiJm5ic3A7IjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvL3ZhciB0ZXh0ID0gaHRtbGVudGl0eV9kZWNvZGUob3B0aW9uLmlubmVySFRNTCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAob3B0aW9uKTsKICAgICAgICAgICAgLy90aGlzLnZhbHVlcy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgLy90aGlzLnRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgIC8vYWxlcnQodGV4dCk7CiAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB0aGlzLnRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpOwogICAgICAgICAgICB0aGlzLmRhdGEucHVzaChkYXRhKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vaWYgKG9wdGlvbi5zZWxlY3RlZCkKICAgICAgICAgICAgLy97CiAgICAgICAgICAgIC8vICAgIHRoaXMuX3NldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgLy99CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWx1ZSBub3QgYWxyZWFkeSBpbiBleGlzdGluZyBsaXN0CiAgICAgICAgICAgIHZhciBsaUV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGlpID0gdGhpcy5vcHRpb25zLmxlbmd0aC0yIDsgaWkgPj0gMCA7IGlpLS0pIC8vIC0yIGJlY2F1c2UgdGhlIGxhc3Qgb25lIGlzIHRoaXMgaXRlbQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaWldLnZhbHVlID09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCIhISIpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAodGhpcy5vcHRpb25zW2lpXS5vYmplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0VmFsdWVzT25Ub3AiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlFeGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKHRoaXMub3B0aW9uc1tpaV0ub2JqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGxpY2UoaWksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdIHx8ICh2YWx1ZSAmJiAhbGlFeGlzdHMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGkgPSBjcmVhdGVFbGVtZW50KCJsaSIpOwogICAgICAgICAgICAgICAgbGkuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0VmFsdWVzT25Ub3AiXSAmJiBvcHRpb24uZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsaVRvcCA9IGdldEVsZW1lbnRCeUNsYXNzTmFtZSgidG9wIiwgb3B0aW9uc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxpVG9wKQogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBZnRlcihsaVRvcCwgbGkpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRmlyc3Qob3B0aW9uc0NvbnRhaW5lciwgbGkpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAobGlGaXJzdCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaVNlcGFyYXRvciA9IGNyZWF0ZUVsZW1lbnQoImxpIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShsaVNlcGFyYXRvciwgInNlcGFyYXRvciIpCiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEFmdGVyKGxpLCBsaVNlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxpRmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZChvcHRpb25zQ29udGFpbmVyLCBsaSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL29wdGlvbnNDb250YWluZXIuYXBwZW5kQ2hpbGQobGkpOwogICAgICAgICAgICAgICAgb3B0aW9uLmxpID0gbGk7CiAgICAgICAgICAgICAgICBsaS5vcHRpb24gPSBvcHRpb247CiAgICAgICAgICAgICAgICBsaS5jbGFzc05hbWUgPSBvcHRpb24uY2xhc3NOYW1lOwogICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRhdGEtc3R5bGUiKSkKICAgICAgICAgICAgICAgICAgICBsaS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGF0YS1zdHlsZSIpKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpb24uZ2V0QXR0cmlidXRlKCJkYXRhLWNsYXNzIikpCiAgICAgICAgICAgICAgICAgICAgbGkuc2V0QXR0cmlidXRlKCJjbGFzcyIsIG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRhdGEtY2xhc3MiKSk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmdldEF0dHJpYnV0ZSgiZGF0YSIpKQogICAgICAgICAgICAgICAgICAgIGxpLnNldEF0dHJpYnV0ZSgiZGF0YSIsIG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRhdGEiKSk7CiAgICAgICAgICAgICAgICAvL2lmIChvcHRpb24uX2hpZGRlbikKICAgICAgICAgICAgICAgIC8vICAgIGxpLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiZGlzcGxheTogbm9uZSIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIWhhc0NsYXNzTmFtZShvcHRpb24sICJzZXBhcmF0b3IiKSAmJiAhb3B0aW9uLl9oaWRkZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBjcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgICAgICAgICAgICAgYS5pbm5lckhUTUwgPSB0ZXh0OwogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Il0gJiYgb3B0aW9uLnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gVVVJRCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tib3ggPSBjcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveC5jbGFzc05hbWUgPSAiX0NoZWNrQm94IjsKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3gudHlwZSA9ICJjaGVja2JveCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94LmlkID0gaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEZpcnN0KGEsIGNoZWNrYm94KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDaGVja0JveCA9IG5ldyBUQ2hlY2tCb3goeyd2YWx1ZXMnOlsndHJ1ZSddfSwgaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrQm94Lm1vdmVUbyhhLCAiZmlyc3QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGxpLkNoZWNrQm94ID0gQ2hlY2tCb3g7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi5DaGVja0JveCA9IENoZWNrQm94OwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKG9wdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChvcHRpb24uY2hlY2tlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChvcHRpb24uc2VsZWN0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICBDaGVja0JveC5zZXRDaGVja2VkKG9wdGlvbi5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIikgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAob3B0aW9uLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAob3B0aW9uLnZhbHVlID09ICI2YzYzZDZjNC0zMmI5LTRiZjMtOTQ1Zi0xMmY3YmMwYjM3YjkiKQogICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZHVtcChvcHRpb24uZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZHVtcChDaGVja0JveC5nZXRDaGVja2VkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgY2xpY2tGbmMgPSBmdW5jdGlvbihlKXtlID0gZ2V0TW91c2VFdmVudChlKTsgaWYgKGUpeyBlLnN0b3AoKTsgLyplLnN0b3BQcm9wYWdhdGlvbigpOyovIGlmIChlLmdldFRhcmdldEJ5VGFnTmFtZSgnbGknKSkge190aGlzLnRvZ2dsZVZhbHVlKGUuZ2V0VGFyZ2V0QnlUYWdOYW1lKCdsaScpLl92YWx1ZSl9fX07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfQ2hlY2tCb3ggPSBDaGVja0JveDsKICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tCb3guYWRkRXZlbnQoIm9uQ2xpY2siLCAoZnVuY3Rpb24oX190aGlzLCBfX0NoZWNrQm94KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSl7ZT1nZXRNb3VzZUV2ZW50KGUpOyBpZihlKXsgZS5zdG9wKCk7IHZhciBsaT1fX0NoZWNrQm94LmVsZW1lbnQ7d2hpbGUobGkudGFnTmFtZSE9J0xJJyl7bGk9bGkucGFyZW50Tm9kZX0gOyBfX3RoaXMudG9nZ2xlVmFsdWUobGkuX3ZhbHVlKTt9fQogICAgICAgICAgICAgICAgICAgICAgICB9KShfdGhpcywgX0NoZWNrQm94KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2tCb3guYWRkRXZlbnQoIm9uQ2xpY2siLCBmdW5jdGlvbihlKXtlID0gZ2V0TW91c2VFdmVudChlKTsgaWYgKGUpeyBlLnN0b3AoKTsgdmFyIGxpPWUudGFyZ2V0O2R1bXAoZS50YXJnZXQpO3doaWxlKGxpLnRhZ05hbWUhPSdMSScpe2xpPWxpLnBhcmVudE5vZGV9IDsgX3RoaXMudG9nZ2xlVmFsdWUobGkuX3ZhbHVlKTt9fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudChsaSwgImNsaWNrIiwgZnVuY3Rpb24oZSl7ZSA9IGdldE1vdXNlRXZlbnQoZSk7IGlmIChlKXsgZS5zdG9wKCk7IC8qZS5zdG9wUHJvcGFnYXRpb24oKTsqLyBpZiAoZS5nZXRUYXJnZXRCeVRhZ05hbWUoJ2xpJykpIHtfdGhpcy50b2dnbGVWYWx1ZShlLmdldFRhcmdldEJ5VGFnTmFtZSgnbGknKS5fdmFsdWUpfX19KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQobGksICJjbGljayIsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGdldE1vdXNlRXZlbnQoZSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wKCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldFRhcmdldEJ5VGFnTmFtZSgnbGknKS5vcHRpb24gJiYgZS5nZXRUYXJnZXRCeVRhZ05hbWUoJ2xpJykub3B0aW9uLmRpc2FibGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRUYXJnZXRCeVRhZ05hbWUoJ2xpJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZShlLmdldFRhcmdldEJ5VGFnTmFtZSgnbGknKS5fdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3RoaXMucGFyYW1zWyJtb2RhbCJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jb2xsYXBzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5vcHRpb25zLnB1c2goeyd2YWx1ZSc6dmFsdWUsICdsYWJlbCc6bGFiZWwsICd0ZXh0Jzp0ZXh0LCAnZGF0YSc6ZGF0YSwgJ29iamVjdCc6b3B0aW9uLCAnbGknOmxpfSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vZHVtcCh0aGlzLnBhcmFtc1sibW9kYWwiXSk7CiAgICAvL2R1bXAodGhpcy5tb2RhbEJ1dHRvbik7CiAgICBpZiAodGhpcy5tb2RhbEJ1dHRvbikKICAgIHsKICAgICAgICBhcHBlbmRGaXJzdCh0aGlzLm9wdGlvbnNDb250YWluZXIsIHRoaXMubW9kYWxCdXR0b25Db250YWluZXIpOwogICAgfQoKICAgIC8vZHVtcCh0aGlzLm9wdGlvbnMpOwogICAgLy9kdW1wKHRoaXMuc2VsZWN0KTsKICAgIC8vZHVtcCh0aGlzLmdldFZhbHVlKCkpOwogICAgLy9kdW1wKHRoaXMuc2VsZWN0KTsKICAgIC8vZHVtcCh0aGlzLm9wdGlvbnNDb250YWluZXIpOwp9ICAgIAoKVENvbWJvQm94LnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24oKQp7CiAgICByZXR1cm4odGhpcy5vcHRpb25zKTsKfQogICAgClRDb21ib0JveC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5zZWxlY3Quc3R5bGUuZGlzcGxheSA9ICIiOwogICAgLy9hbGVydCh0aGlzLnNlbGVjdC5pbm5lckhUTUwuaW5kZXhPZigiJmx0OyIpKTsKICAgIC8vIHdpZHRoIGNoZWNrIC0ga3Z1bGkgUHJvcGVydHlFZGl0b3J1CiAgICB2YXIgaGFzSHRtbCA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5sYWJlbHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmICh0aGlzLmxhYmVsc1tpXS5pbmRleE9mKCI8IikgIT0gLTEgJiYgdGhpcy5sYWJlbHNbaV0uaW5kZXhPZigiPiIpICE9IC0xKQogICAgICAgIHsKICAgICAgICAgICAgaGFzSHRtbCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMudGV4dHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmICh0aGlzLnRleHRzW2ldLmluZGV4T2YoIjwiKSAhPSAtMSAmJiB0aGlzLnRleHRzW2ldLmluZGV4T2YoIj4iKSAhPSAtMSkKICAgICAgICB7CiAgICAgICAgICAgIGhhc0h0bWwgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vZHVtcCh0aGlzLnBhcmFtc1sibmFtZSJdKTsKICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQpOwogICAgLy9kdW1wKGdldFN0eWxlKHRoaXMuZWxlbWVudCwgIndpZHRoIikpOwogICAgLy9kdW1wKHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCk7CiAgICAKICAgIC8vIGtkeXogbWEgYWxlIHdpZHRoOjEwMCUsIHRhayB0byBnZXRTdHlsZSBuZXZyYXRpIC4uLiBudWxsIC8gdGVuaGxlIGtvZCBuYXN0YXZpIHNpcmt1IHBvZGxlIHZ5Y2hvemkgc2lya3kgc2VsZWN0dQogICAgLy9kdW1wKGdldFN0eWxlKHRoaXMuc2VsZWN0LCAid2lkdGgiKSkKICAgIC8vZHVtcChnZXRDb21wdXRlZENTU1ZhbHVlKHRoaXMuZWxlbWVudCwgIndpZHRoIikpOwogICAgCiAgICAvL2R1bXAoIiEhISIpOwogICAgLy9kdW1wKHRoaXMuaWQpOwogICAgLy9kdW1wKHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLm9mZnNldFdpZHRoKTsKICAgIC8vZHVtcCh0aGlzLnNlbGVjdC5vZmZzZXRXaWR0aCk7CiAgICAvL3ZhciBwYXJlbnRXaWR0aCA9IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLm9mZnNldFdpZHRoOwogICAgCiAgICBpZiAoIXRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdICYmICFoYXNIdG1sICYmICgoIWdldFN0eWxlKHRoaXMuZWxlbWVudCwgIndpZHRoIikgfHwgZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAid2lkdGgiKSA9PSAiYXV0byIpICYmICFnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJtaW4td2lkdGgiKSkpIC8vIGRvZXMgbm90IGNvbnRhaW4gaHRtbGVuY29kZWQgSFRNTAogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IHRoaXMuc2VsZWN0Lm9mZnNldFdpZHRoKyJweCI7CiAgICAgICAgCiAgICB0aGlzLnNlbGVjdC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgLy90aGlzLmVsZW1lbnQudGl0bGUgPSAiRFVNTVkiOwoKICAgIGlmICh0aGlzLmdldFZhbHVlKCkpCiAgICB7CiAgICAgICAgaWYgKHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5lbGVtZW50LCAiY2hlY2tlZCIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgInNlbGVjdGVkIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAic2VsZWN0ZWQiKTsKICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5idXR0b24sICJjaGVja2VkIik7CiAgICB9CgogICAgcmV0dXJuOwogICAgLyoKICAgIHZhciBzZWxlY3RXaWR0aCA9IGdldFN0eWxlKHRoaXMuc2VsZWN0LCAid2lkdGgiKTsKICAgIGR1bXAoc2VsZWN0V2lkdGgpOwogICAgaWYgKCFzZWxlY3RXaWR0aCB8fCAoc2VsZWN0V2lkdGggPT0gImF1dG8iICYmIHNlbGVjdFdpZHRoLmluZGV4T2YoIiUiKSA9PSAtMSkpCiAgICB7CiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5lbGVtZW50LmlubmVySFRNTDsKICAgICAgICAvLyBkZXRlcm1pbmUgd2lkdGggb2YgaW5wdXQgY29udGFpbmVyCiAgICAgICAgdmFyIG1heFdpZHRoID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1tpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSBvcHRpb24ubGFiZWw7CiAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBjc3NNYXhXaWR0aCA9IE1hdGgubWluKGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy5zZWxlY3QsICJtYXhXaWR0aCIpLCAwKSwgMTAwMCk7CiAgICAgICAgLy9kdW1wKGNzc01heFdpZHRoKTsKICAgICAgICAKICAgICAgICBzZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJvdXRlcldpZHRoIiwgTWF0aC5taW4oY3NzTWF4V2lkdGgsIG1heFdpZHRoKzQrdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCkrInB4Iik7CiAgICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IG9sZFZhbHVlOwogICAgfQogICAgKi8KICAgIC8vYWxlcnQobWF4V2lkdGgpOwp9CgovKgpUQ29tYm9Cb3gucHJvdG90eXBlLm9uQ2hhbmdlID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIGR1bXAoIm9uQ2hhbmdlIik7CiAgICBkdW1wRnVuY3Rpb25DYWxsKCk7Cn0KKi8KCgpUQ29tYm9Cb3gucHJvdG90eXBlLmRyYXdPcHRpb25zQ29udGFpbmVyID0gZnVuY3Rpb24oKQp7CiAgICAvL2R1bXAoImRyYXciKTsKICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcHRpb24iLCB0aGlzLnNlbGVjdCk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIG9wdGlvbiA9IGVsZW1zW2ldOwogICAgICAgIGlmIChvcHRpb24ubGkpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAodGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Il0pOwogICAgICAgICAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Il0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb24uQ2hlY2tCb3gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uQ2hlY2tCb3guc2V0Q2hlY2tlZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKG9wdGlvbi5saSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLkNoZWNrQm94LnNldENoZWNrZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc05hbWUob3B0aW9uLmxpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb24uZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShvcHRpb24ubGksICJzZWxlY3RlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzTmFtZShvcHRpb24ubGksICJzZWxlY3RlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAKfQoKVENvbWJvQm94LnByb3RvdHlwZS5jbGVhck9wdGlvbnNDb250YWluZXIgPSBmdW5jdGlvbigpCnsKICAgIHZhciBlbGVtcyA9IGdldENoaWxkRWxlbWVudHNCeVRhZ05hbWUoImxpIiwgdGhpcy5vcHRpb25zQ29udGFpbmVyKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICByZW1vdmVOb2RlKGVsZW1zW2ldKTsKfQoKVENvbWJvQm94LnByb3RvdHlwZS5wb3NpdGlvbk9wdGlvbnNDb250YWluZXIgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMub2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICB0aGlzLmV4cGFuZGVkID0gdHJ1ZTsKICAgIAogICAgLy8gbmVlZCB0byBwbGFjZSBlbGVtZW50CiAgICAvL3ZhciBvbGRQb3NpdGlvbiA9IHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbjsKICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gb2xkUG9zaXRpb247CiAgICAKCiAgICAvL3RoaXMuZWxlbWVudC5zdHlsZS5ib3JkZXJCb3R0b20gPSAiMXB4IHNvbGlkIHRyYW5zcGFyZW50IjsKICAgIC8vdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLmJvcmRlclRvcCA9ICIxcHggc29saWQgdHJhbnNwYXJlbnQiOwogICAgCiAgICAvL2R1bXAoZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAiaW5uZXJXaWR0aCIpKTsKICAgIC8vdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAid2lkdGgiKTsKICAgIAogICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKyJweCI7CiAgICAvL3RoaXMub3B0aW9uc0NvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMDsKICAgIC8vdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gZ2V0U3R5bGUodGhpcy4sIC5vZmZzZXRXaWR0aCsicHgiOwogICAgCiAgICAvLyB3b3JrcyBjcm9zcy1icm93c2VyCiAgICAvL3ZhciBwb3MgPSBnZXRXaW5kb3dQb3NpdGlvbih0aGlzLmVsZW1lbnQpOwogICAgCiAgICB2YXIgcG9zID0gZ2V0V2luZG93UG9zaXRpb24odGhpcy5lbGVtZW50KTsKICAgIHZhciBlbGVtID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGU7CiAgICAKICAgIAogICAgd2hpbGUoZmFsc2UgJiYgZWxlbSkgLy8genJ1c2VubyByZWxhdGl2ZSBza3J6IHBvc2l0aW9uOmZpeGVkLCBub3ZlIHBvIHNjcm9sbCBwYXJlbnR1IHpub3Z1IHZ5cG9jaXRhdCBwb3ppY2kgYWxhIEJ1YmJsZVBhbmVsPwogICAgewogICAgICAgIGlmIChnZXRTdHlsZShlbGVtLCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiKQogICAgICAgIHsKICAgICAgICAgICAgcG9zMiA9IGdldFdpbmRvd1Bvc2l0aW9uKGVsZW0pOwogICAgICAgICAgICAvL2R1bXAocG9zMik7CiAgICAgICAgICAgIHBvc1sieCJdIC09IHBvczJbIngiXTsKICAgICAgICAgICAgcG9zWyJ5Il0gLT0gcG9zMlsieSJdOwogICAgICAgICAgICAvL3Bvc1sieCJdICs9IHBvczJbIngiXTsKICAgICAgICAgICAgLy9wb3NbInkiXSArPSBwb3MyWyJ5Il07CiAgICAgICAgICAgIAogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoZWxlbS5zY3JvbGxMZWZ0KQogICAgICAgICAgICAgICAgcG9zWyJ4Il0gKz0gZWxlbS5zY3JvbGxMZWZ0OwogICAgICAgICAgICBpZiAoZWxlbS5zY3JvbGxUb3ApCiAgICAgICAgICAgICAgICBwb3NbInkiXSArPSBlbGVtLnNjcm9sbFRvcDsKICAgICAgICAgICAgKi8KICAgICAgICB9CiAgICAgICAgLyppZiAoZWxlbS5zY3JvbGxMZWZ0KQogICAgICAgICAgICBwb3NbIngiXSAtPSBlbGVtLnNjcm9sbExlZnQ7CiAgICAgICAgaWYgKGVsZW0uc2Nyb2xsVG9wKQogICAgICAgICAgICBwb3NbInkiXSAtPSBlbGVtLnNjcm9sbFRvcDsKICAgICAgICAqLwogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICB9CiAgICAKICAgIC8vIHpydXNlbm8ga3Z1bGkgc2hvcCBvYmplZG5hdmNlIC0gdiBhZG1pbnUgYnkgdG8gdmxpdiBtaXQgbmVtZWxvCiAgICAvLyB6cnVzZW5vIG5ha29uZWMgdXBsbmUsIGt2dWxpIHJhY2Vfc2lnbnVwLnBocAogICAgLy8gYnlsbyB0byBrdnVsaSBkaWFsb2d1IC0gY2drIHJlemVydmFjZSwgcHJlc3VudXRvIGRvIGdldFdpbmRvd1Bvc2l0aW9uCiAgICBpZiAoIUFETUlOKSAKICAgIHsKICAgICAgICAvL3Bvc1sieCJdICs9IGdldFNjcm9sbExlZnQoZG9jdW1lbnQpOwogICAgICAgIC8vcG9zWyJ5Il0gKz0gZ2V0U2Nyb2xsVG9wKGRvY3VtZW50KTsKICAgIH0KCiAgICAvLyBzaG93CiAgICB0aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUubGVmdCA9IHBvc1sieCJdKyJweCI7CiAgICB0aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUudG9wID0gcG9zWyJ5Il0rInB4IjsKCiAgICAvL2R1bXAoZ2V0U2Nyb2xsVG9wKGRvY3VtZW50KSk7CiAgICAvL2R1bXAodGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLmxlZnQpOwogICAgLy9kdW1wKHRoaXMub3B0aW9uc0NvbnRhaW5lci5zdHlsZS50b3ApOwoKICAgIC8vIGZpeCB2aXNpYmxlIGFyZWEgLSBidXQgb25seSBpZiBDb21ib0JveCBpcyB2aXNpYmxlIGl0c2VsZiAoZW5hYmxlcyBjbGFzc2ljIHNjcm9sbGluZykKICAgIC8vZHVtcChlbGVtZW50VmlzaWJsZSh0aGlzLmVsZW1lbnQpLCB0cnVlKTsKICAgIGlmIChlbGVtZW50VmlzaWJsZSh0aGlzLmVsZW1lbnQsIGZhbHNlKSkKICAgIHsKICAgICAgICB2YXIgd1NpemUgPSBCcm93c2VyLmdldFdpbmRvd1NpemUoKTsKICAgICAgICB2YXIgcG9zMiA9IGdldFdpbmRvd1Bvc2l0aW9uKHRoaXMuZWxlbWVudCk7CiAgICAgICAgaWYgKHBvczJbIngiXSt0aGlzLm9wdGlvbnNDb250YWluZXIub2Zmc2V0V2lkdGggPiB3U2l6ZVsid2lkdGgiXS0xMCkKICAgICAgICAgICAgcG9zWyJ4Il0gLT0gcG9zMlsieCJdLSh3U2l6ZVsid2lkdGgiXS10aGlzLm9wdGlvbnNDb250YWluZXIub2Zmc2V0V2lkdGgtMTApOwogICAgICAgIGlmIChwb3MyWyJ5Il0rdGhpcy5vcHRpb25zQ29udGFpbmVyLm9mZnNldEhlaWdodCA+IHdTaXplWyJoZWlnaHQiXS0xMCkKICAgICAgICAgICAgcG9zWyJ5Il0gLT0gcG9zMlsieSJdLSh3U2l6ZVsiaGVpZ2h0Il0tdGhpcy5vcHRpb25zQ29udGFpbmVyLm9mZnNldEhlaWdodC0xMCk7CiAgICAgICAgLy9kdW1wKHBvczJbInkiXSk7CiAgICAgICAgaWYgKHBvczJbIngiXSA8IDApCiAgICAgICAgICAgIHBvc1sieCJdICs9ICgtMSkqcG9zMlsieCJdKzEwOwogICAgICAgIGlmIChwb3MyWyJ5Il0gPCAwKQogICAgICAgICAgICBwb3NbInkiXSArPSAoLTEpKnBvczJbInkiXSsxMDsKICAgICAgICB0aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUubGVmdCA9IHBvc1sieCJdKyJweCI7CiAgICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLnRvcCA9IHBvc1sieSJdKyJweCI7CiAgICB9CiAgICAKICAgIC8vIHNjcm9sbCB0byBzZWxlY3RlZCB2YWx1ZSAKICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaSIsIHRoaXMub3B0aW9uc0NvbnRhaW5lcik7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspICAgICAgICAKICAgIHsKICAgICAgICB2YXIgbGkgPSBlbGVtc1tpXTsKICAgICAgICB2YXIgdGV4dCA9IGxpLnRleHRDb250ZW50IHx8IGxpLmlubmVyVGV4dDsKICAgICAgICAgICAgCiAgICAgICAgaWYgKGxpLl92YWx1ZSA9PSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHNjcm9sbFRvRWxlbWVudChsaSwgMCwgdGhpcy5vcHRpb25zQ29udGFpbmVyKTsKICAgICAgICAgICAgLy8gc2Nyb2xsIHRvIGNlbnRlcgogICAgICAgICAgICBzY3JvbGxCeSh0aGlzLm9wdGlvbnNDb250YWluZXIsIDAsICgtMSkqTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnNDb250YWluZXIub2Zmc2V0SGVpZ2h0LzIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgovKgpUQ29tYm9Cb3gucHJvdG90eXBlLnBvc2l0aW9uT3B0aW9uc0NvbnRhaW5lciA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIHRoaXMuZXhwYW5kZWQgPSB0cnVlOwogICAgCiAgICAvLyBuZWVkIHRvIHBsYWNlIGVsZW1lbnQKICAgIC8vdmFyIG9sZFBvc2l0aW9uID0gdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uOwogICAgLy90aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgLy90aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBvbGRQb3NpdGlvbjsKICAgIAoKICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLmJvcmRlckJvdHRvbSA9ICIxcHggc29saWQgdHJhbnNwYXJlbnQiOwogICAgLy90aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUuYm9yZGVyVG9wID0gIjFweCBzb2xpZCB0cmFuc3BhcmVudCI7CiAgICAKICAgIC8vZHVtcChnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJpbm5lcldpZHRoIikpOwogICAgLy90aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUubWluV2lkdGggPSBnZXRTdHlsZSh0aGlzLmVsZW1lbnQsICJ3aWR0aCIpOwogICAgCiAgICB0aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUubWluV2lkdGggPSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGgrInB4IjsKICAgIC8vdGhpcy5vcHRpb25zQ29udGFpbmVyLnNjcm9sbExlZnQgPSAwOwogICAgLy90aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUubWF4V2lkdGggPSBnZXRTdHlsZSh0aGlzLiwgLm9mZnNldFdpZHRoKyJweCI7CiAgICAKICAgIC8vIHdvcmtzIGNyb3NzLWJyb3dzZXIKICAgIC8vdmFyIHBvcyA9IGdldFdpbmRvd1Bvc2l0aW9uKHRoaXMuZWxlbWVudCk7CiAgICAKICAgIHZhciBwb3MgPSBnZXRXaW5kb3dQb3NpdGlvbih0aGlzLmVsZW1lbnQpOwogICAgdmFyIGVsZW0gPSB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZTsKICAgIAogICAgLy8gISEhISBzY3JvbGwgISEhISAvLwogICAgLy9kdW1wKHBvcyk7CiAgICAKICAgIHdoaWxlKGZhbHNlICYmIGVsZW0pIC8vIHpydXNlbm8gcmVsYXRpdmUgc2tyeiBwb3NpdGlvbjpmaXhlZCwgbm92ZSBwbyBzY3JvbGwgcGFyZW50dSB6bm92dSB2eXBvY2l0YXQgcG96aWNpIGFsYSBCdWJibGVQYW5lbD8KICAgIHsKICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbSwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIikKICAgICAgICB7CiAgICAgICAgICAgIHBvczIgPSBnZXRXaW5kb3dQb3NpdGlvbihlbGVtKTsKICAgICAgICAgICAgLy9kdW1wKHBvczIpOwogICAgICAgICAgICBwb3NbIngiXSAtPSBwb3MyWyJ4Il07CiAgICAgICAgICAgIHBvc1sieSJdIC09IHBvczJbInkiXTsKICAgICAgICAgICAgLy9wb3NbIngiXSArPSBwb3MyWyJ4Il07CiAgICAgICAgICAgIC8vcG9zWyJ5Il0gKz0gcG9zMlsieSJdOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTsKICAgIH0KICAgIAogICAgLy8genJ1c2VubyBrdnVsaSBzaG9wIG9iamVkbmF2Y2UgLSB2IGFkbWludSBieSB0byB2bGl2IG1pdCBuZW1lbG8KICAgIC8vcG9zWyJ4Il0gKz0gZ2V0U2Nyb2xsTGVmdChkb2N1bWVudCk7CiAgICAvL3Bvc1sieSJdICs9IGdldFNjcm9sbFRvcChkb2N1bWVudCk7CgogICAgLy8gc2hvdwogICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBwb3NbIngiXSsicHgiOwogICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLnRvcCA9IHBvc1sieSJdKyJweCI7CgogICAgLy9kdW1wKGdldFNjcm9sbFRvcChkb2N1bWVudCkpOwogICAgLy9kdW1wKHRoaXMub3B0aW9uc0NvbnRhaW5lci5zdHlsZS5sZWZ0KTsKICAgIC8vZHVtcCh0aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUudG9wKTsKCiAgICAvLyBmaXggdmlzaWJsZSBhcmVhIC0gYnV0IG9ubHkgaWYgQ29tYm9Cb3ggaXMgdmlzaWJsZSBpdHNlbGYgKGVuYWJsZXMgY2xhc3NpYyBzY3JvbGxpbmcpCiAgICAvL2R1bXAoZWxlbWVudFZpc2libGUodGhpcy5lbGVtZW50KSwgdHJ1ZSk7CiAgICBpZiAoZWxlbWVudFZpc2libGUodGhpcy5lbGVtZW50LCBmYWxzZSkpCiAgICB7CiAgICAgICAgdmFyIHdTaXplID0gQnJvd3Nlci5nZXRXaW5kb3dTaXplKCk7CiAgICAgICAgdmFyIHBvczIgPSBnZXRXaW5kb3dQb3NpdGlvbih0aGlzLmVsZW1lbnQpOwogICAgICAgIGlmIChwb3MyWyJ4Il0rdGhpcy5vcHRpb25zQ29udGFpbmVyLm9mZnNldFdpZHRoID4gd1NpemVbIndpZHRoIl0tMTApCiAgICAgICAgICAgIHBvc1sieCJdIC09IHBvczJbIngiXS0od1NpemVbIndpZHRoIl0tdGhpcy5vcHRpb25zQ29udGFpbmVyLm9mZnNldFdpZHRoLTEwKTsKICAgICAgICBpZiAocG9zMlsieSJdK3RoaXMub3B0aW9uc0NvbnRhaW5lci5vZmZzZXRIZWlnaHQgPiB3U2l6ZVsiaGVpZ2h0Il0tMTApCiAgICAgICAgICAgIHBvc1sieSJdIC09IHBvczJbInkiXS0od1NpemVbImhlaWdodCJdLXRoaXMub3B0aW9uc0NvbnRhaW5lci5vZmZzZXRIZWlnaHQtMTApOwogICAgICAgIC8vZHVtcChwb3MyWyJ5Il0pOwogICAgICAgIGlmIChwb3MyWyJ4Il0gPCAwKQogICAgICAgICAgICBwb3NbIngiXSArPSAoLTEpKnBvczJbIngiXSsxMDsKICAgICAgICBpZiAocG9zMlsieSJdIDwgMCkKICAgICAgICAgICAgcG9zWyJ5Il0gKz0gKC0xKSpwb3MyWyJ5Il0rMTA7CiAgICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBwb3NbIngiXSsicHgiOwogICAgICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lci5zdHlsZS50b3AgPSBwb3NbInkiXSsicHgiOwogICAgfQogICAgCiAgICAvLyBzY3JvbGwgdG8gc2VsZWN0ZWQgdmFsdWUgCiAgICB2YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgibGkiLCB0aGlzLm9wdGlvbnNDb250YWluZXIpOwogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKSAgICAgICAgCiAgICB7CiAgICAgICAgdmFyIGxpID0gZWxlbXNbaV07CiAgICAgICAgdmFyIHRleHQgPSBsaS50ZXh0Q29udGVudCB8fCBsaS5pbm5lclRleHQ7CiAgICAgICAgICAgIAogICAgICAgIGlmIChsaS5fdmFsdWUgPT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQobGksIHRoaXMub3B0aW9uc0NvbnRhaW5lcik7CiAgICAgICAgICAgIC8vIHNjcm9sbCB0byBjZW50ZXIKICAgICAgICAgICAgc2Nyb2xsQnkodGhpcy5vcHRpb25zQ29udGFpbmVyLCAwLCAoLTEpKk1hdGgucm91bmQodGhpcy5vcHRpb25zQ29udGFpbmVyLm9mZnNldEhlaWdodC8yKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoqLwoKVENvbWJvQm94LnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLnBhcmFtc1sibW9kYWwiXSkKICAgIHsKICAgICAgICB0aGlzLm1vZGFsX29uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZTsKICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24oKXt9OwogICAgICAgIHRoaXMubW9kYWxWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIH0KCiAgICB0aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICB0aGlzLnBvc2l0aW9uT3B0aW9uc0NvbnRhaW5lcigpOwoKICAgIHRoaXMub25Nb3ZlVGltZXIodHJ1ZSk7CiAgICAKICAgIGlmICh0aGlzLnBhcmFtc1sibW9kYWwiXSkKICAgIHsKICAgICAgICB0aGlzLl9vbk1vZGFsQnV0dG9uUmVzaXplKCk7CiAgICB9ICAgIAp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLm9uTW92ZVRpbWVyID0gZnVuY3Rpb24oaW5pdCkKewogICAgdmFyIHBvcyA9IGdldFdpbmRvd1Bvc2l0aW9uKHRoaXMuZWxlbWVudCk7CiAgICBpZiAoaW5pdCkKICAgIHsKICAgICAgICB0aGlzLm9wdGlvbnNDb250YWluZXJYID0gcG9zWyJ4Il07CiAgICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyWSA9IHBvc1sieSJdOwogICAgfQogICAgCiAgICBpZiAodGhpcy5vcHRpb25zQ29udGFpbmVyWCAhPSBwb3NbIngiXSB8fCB0aGlzLm9wdGlvbnNDb250YWluZXJZICE9IHBvc1sieSJdKQogICAgewogICAgICAgIHRoaXMucG9zaXRpb25PcHRpb25zQ29udGFpbmVyKCk7CiAgICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyWCA9IHBvc1sieCJdOwogICAgICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lclkgPSBwb3NbInkiXTsKICAgIH0KICAgIAogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHRoaXMubW92ZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLm9uTW92ZVRpbWVyKCl9LCAxMDApOwp9CgoKVENvbWJvQm94LnByb3RvdHlwZS5jb2xsYXBzZSA9IGZ1bmN0aW9uKCkKewogICAgY2xlYXJUaW1lb3V0KHRoaXMubW92ZVRpbWVyKTsKICAgIAogICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlOwoKICAgIC8vdGhpcy5lbGVtZW50LnN0eWxlLmJvcmRlckJvdHRvbSA9ICIiOwogICAgLy90aGlzLm9wdGlvbnNDb250YWluZXIuc3R5bGUuYm9yZGVyVG9wID0gIiI7CgogICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICB0aGlzLmtleVByZWZpeCA9ICIiOwogICAgCiAgICBpZiAodGhpcy5wYXJhbXNbIm1vZGFsIl0pCiAgICB7CiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMubW9kYWxfb25DaGFuZ2U7CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMubW9kYWxWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpCiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5nZXRWYWx1ZSgpKTsKICAgIH0KCn0KClRDb21ib0JveC5wcm90b3R5cGUuZXhwYW5kQ29sbGFwc2UgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgaWYgKHRoaXMuZXhwYW5kZWQpCiAgICAgICAgdGhpcy5jb2xsYXBzZSgpOwogICAgZWxzZQogICAgICAgIHRoaXMuZXhwYW5kKCk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuX29uRWxlbWVudEtleURvd24gPSBmdW5jdGlvbihlKQp7CiAgICBlID0gZ2V0S2V5RXZlbnQoZSk7CiAgICAKICAgIGlmICghdGhpcy5wYXJhbXNbImVkaXRhYmxlIl0gJiYgIXRoaXMuZXhwYW5kZWQgJiYgdGhpcy5mb2N1c2VkKQogICAgewogICAgICAgIGlmIChlLmtleUNvZGUgPT0gVktfVVAgfHwgZS5rZXlDb2RlID09IFZLX0RPV04gfHwgZS5rZXlDb2RlID09IFZLX1JJR0hUIHx8IGUua2V5Q29kZSA9PSBWS19TUEFDRSB8fCBlLmtleUNvZGUgPT0gVktfRU5URVIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmV4cGFuZCgpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuYmx1cigpOwogICAgICAgICAgICAKICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgfSAgICAgICAgCiAgICB9IAogICAgaWYgKHRoaXMucGFyYW1zWyJlZGl0YWJsZSJdICYmIHRoaXMuZm9jdXNlZCAmJiBlLmtleUNvZGUgPT0gVktfRU5URVIpCiAgICB7CiAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgdGhpcy5lbGVtZW50LmJsdXIoKTsKICAgICAgICAvL2R1bXAoJ0VOVEVSJyk7CiAgICB9CiAgICByZXR1cm4odHJ1ZSk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuX29uS2V5RG93biA9IGZ1bmN0aW9uKGUpCnsKICAgIGUgPSBnZXRLZXlFdmVudChlKTsKICAgIAogICAgLy9kdW1wKGUua2V5Q29kZSk7CiAgICBpZiAodGhpcy5leHBhbmRlZCkKICAgIHsKICAgICAgICBpZiAoZS5rZXlDb2RlID09IFZLX1VQIHx8IGUua2V5Q29kZSA9PSBWS19ET1dOKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VmFsdWUoKSA9PSB0aGlzLm9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBWS19VUCAmJiB0aGlzLm9wdGlvbnNbaS0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLm9wdGlvbnNbaS0xXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBWS19ET1dOICYmIHRoaXMub3B0aW9uc1tpKzFdKQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMub3B0aW9uc1tpKzFdLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZS5rZXlDb2RlID09IFZLX0VOVEVSKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb2xsYXBzZSgpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGlmIChlLmtleUNvZGUgPT0gVktfRVNDQVBFKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLm9sZFZhbHVlKTsKICAgICAgICAgICAgdGhpcy5jb2xsYXBzZSgpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGlmIChlLmtleUNvZGUgPT0gVktfVEFCKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb2xsYXBzZSgpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuKHRydWUpOwogICAgCiAgICAvKiAgICAKICAgIGlmIChlLmtleUNvZGUgPT0gVktfVEFCKQogICAgewogICAgICAgIHRoaXMuY29sbGFwc2UoKTsKICAgICAgICAKICAgICAgICB2YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZShbImlucHV0IiwiYnV0dG9uIiwidGV4dGFyZWEiLCJzZWxlY3QiXSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IHRoaXMuc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkdW1wKGkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxlbXNbaSsxXS5mb2N1czsKCiAgICAgICAgCiAgICAgICAgZS5zdG9wKCk7CiAgICB9CiAgICAqLwp9ICAgICAgICAKClRDb21ib0JveC5wcm90b3R5cGUuX29uS2V5UHJlc3MgPSBmdW5jdGlvbihlKQp7CiAgICBlID0gZ2V0S2V5RXZlbnQoZSk7CiAgICAKICAgIGlmICh0aGlzLmV4cGFuZGVkICYmIGUua2V5Q29kZSAhPSBWS19UQUIgJiYgIXRoaXMua2V5U2VsZWN0RGlzYWJsZWQpCiAgICB7CiAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgdGhpcy5rZXlQcmVmaXggKz0gS2V5Ym9hcmQuY2hhcjsKCiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpIiwgdGhpcy5vcHRpb25zQ29udGFpbmVyKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspICAgICAgICAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsaSA9IGVsZW1zW2ldOwogICAgICAgICAgICB2YXIgdGV4dCA9IGxpLnRleHRDb250ZW50IHx8IGxpLmlubmVyVGV4dDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCh0ZXh0KTsKICAgICAgICAgICAgLy9kdW1wKHRoaXMua2V5UHJlZml4KTsKICAgICAgICAgICAgaWYgKHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMua2V5UHJlZml4LnRvTG93ZXJDYXNlKCkpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobGkuX3ZhbHVlKTsKICAgICAgICAgICAgICAgIHNjcm9sbFRvRWxlbWVudChsaSwgdGhpcy5vcHRpb25zQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLl9jbGVhciA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5vcHRpb25zID0gW107CiAgICB0aGlzLnZhbHVlcyA9IFtdOwogICAgdGhpcy50ZXh0cyA9IFtdOwogICAgdGhpcy5sYWJlbHMgPSBbXTsKICAgIHRoaXMuZGF0YSA9IFtdOwp9CiAgICAKVENvbWJvQm94LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKG9wdGlvbnNPbmx5KQp7CiAgICBpZiAodHlwZW9mKG9wdGlvbnNPbmx5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBvcHRpb25zT25seSA9IGZhbHNlOwogICAgCiAgICB0aGlzLnNlbGVjdC5pbm5lckhUTUwgPSAiIjsKICAgIHRoaXMuY2xlYXJPcHRpb25zQ29udGFpbmVyKCk7CiAgICAKICAgIGlmICghb3B0aW9uc09ubHkpCiAgICAgICAgdGhpcy5zZXRWYWx1ZSgiIik7CiAgICAKICAgIHRoaXMuX2NsZWFyKCk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpCnsKICAgIHRoaXMuY2xlYXIoKTsKICAgIAogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgb3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgLy9kdW1wKG9wdGlvbnNbaV0pOwogICAgICAgIHRoaXMuYWRkT3B0aW9uKG9wdGlvbnNbaV0pOwogICAgfQp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLmFkZE9wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbiwgaW5kZXgpCnsKICAgIGlmIChvcHRpb24udGFnTmFtZSAmJiBvcHRpb24udGFnTmFtZSA9PSAiT1BUSU9OIikKICAgICAgICB0aGlzLnNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pOwogICAgZWxzZQogICAgewogICAgICAgIHZhciBfb3B0aW9uID0gY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgICAgX29wdGlvbi52YWx1ZSA9IG9wdGlvblsidmFsdWUiXTsKICAgICAgICBfb3B0aW9uLmlubmVySFRNTCA9ICh0eXBlb2Yob3B0aW9uWyJ0ZXh0Il0pICE9ICJ1bmRlZmluZWQiID8gb3B0aW9uWyJ0ZXh0Il0gOiBvcHRpb25bInZhbHVlIl0pOwogICAgICAgIF9vcHRpb24uc2V0QXR0cmlidXRlKCJkYXRhLXRleHQiLCAodHlwZW9mKG9wdGlvblsidGV4dCJdKSAhPSAidW5kZWZpbmVkIiA/IG9wdGlvblsidGV4dCJdIDogb3B0aW9uWyJ2YWx1ZSJdKSk7CiAgICAgICAgX29wdGlvbi5zZXRBdHRyaWJ1dGUoImRhdGEtbGFiZWwiLCAodHlwZW9mKG9wdGlvblsibGFiZWwiXSkgIT0gInVuZGVmaW5lZCIgPyBvcHRpb25bImxhYmVsIl0gOiBfb3B0aW9uLmlubmVySFRNTCkpOwogICAgICAgIF9vcHRpb24uZGF0YSA9ICh0eXBlb2Yob3B0aW9uWyJkYXRhIl0pICE9ICJ1bmRlZmluZWQiID8gb3B0aW9uWyJkYXRhIl0gOiBudWxsKTsKICAgICAgICBfb3B0aW9uLnNldEF0dHJpYnV0ZSgiZGF0YS1zdHlsZSIsICh0eXBlb2YodGhpcy5wYXJhbXNbIml0ZW1TdHlsZSJdKSAhPSAidW5kZWZpbmVkIiA/IHRoaXMucGFyYW1zWyJpdGVtU3R5bGUiXSA6ICIiKSk7CiAgICAgICAgCiAgICAgICAgdGhpcy5zZWxlY3QuYXBwZW5kQ2hpbGQoX29wdGlvbik7CiAgICB9CgogICAgLy9hbGVydCh0aGlzLnNlbGVjdC5pbm5lckhUTUwpOwogICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgdGhpcy5jcmVhdGVGcm9tSHRtbCh0aGlzLnNlbGVjdCk7CiAgICB0aGlzLmRyYXcoKTsKfQoKVENvbWJvQm94LnByb3RvdHlwZS5yZW1vdmVPcHRpb24gPSBmdW5jdGlvbihvcHRpb24pCnsKICAgIGlmIChvcHRpb24udGFnTmFtZSAmJiBvcHRpb24udGFnTmFtZSA9PSAiT1BUSU9OIikKICAgICAgICB0aGlzLnNlbGVjdC5yZW1vdmVDaGlsZChvcHRpb24pOwoKICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgIHRoaXMuY3JlYXRlRnJvbUh0bWwodGhpcy5zZWxlY3QpOwogICAgdGhpcy5kcmF3KCk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuZ2V0U2VsZWN0ZWRPcHRpb24gPSBmdW5jdGlvbigpCnsKICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRTZWxlY3RlZE9wdGlvbnMoKTsKICAgIHJldHVybihvcHRpb25zWzBdKTsKICAgIAogICAgLyoKICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbaV07CiAgICAgICAgaWYgKG9wdGlvblsidmFsdWUiXSA9PSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihvcHRpb24pOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKG51bGwpOwoqLwp9ICAgIAoKVENvbWJvQm94LnByb3RvdHlwZS5nZXRTZWxlY3RlZE9wdGlvbnMgPSBmdW5jdGlvbigpCnsKICAgIC8vdmFyIHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7CgogICAgdmFyIG9wdGlvbnMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1tpXTsKICAgICAgICBpZiAoKG9wdGlvbi5vYmplY3QuZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpIHx8IG9wdGlvbi5vYmplY3Quc2VsZWN0ZWQpICYmIG9wdGlvbi52YWx1ZSAhPSAiIiAmJiBvcHRpb24gIT0gdGhpcy5lZGl0YWJsZU9wdGlvbikKICAgICAgICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7CiAgICAgICAgLy9pZiAoaW5fYXJyYXkob3B0aW9uWyJ2YWx1ZSJdLCB2YWx1ZXMpKQogICAgICAgIC8vewogICAgICAgIC8vICAgIG9wdGlvbnMucHVzaChvcHRpb24pOwogICAgICAgIC8vfQogICAgfQogICAgCiAgICByZXR1cm4ob3B0aW9ucyk7Cn0gICAgCgpUQ29tYm9Cb3gucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHZhbHVlcyA9IFtdOwogICAgaWYgKHRoaXMucGFyYW1zWyJlZGl0YWJsZSJdICYmIHRoaXMuZWRpdGFibGVPcHRpb24gJiYgdGhpcy5lZGl0YWJsZU9wdGlvbi5zZWxlY3RlZCAmJiB0aGlzLmVkaXRhYmxlT3B0aW9uLnZhbHVlICE9ICIiKQogICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuZWRpdGFibGVPcHRpb24udmFsdWUpOwogICAgZWxzZQogICAgewogICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRTZWxlY3RlZE9wdGlvbnMoKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBvcHRpb25zLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlcy5wdXNoKG9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgIH0gICAgCiAgICB9CiAgICAKICAgIC8qICAgIAogICAgaWYgKHRoaXMuZWRpdGFibGVPcHRpb24gJiYgdGhpcy5lZGl0YWJsZU9wdGlvbi5zZWxlY3RlZCkKICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLmVkaXRhYmxlT3B0aW9uLnZhbHVlKTsKCiAgICAvL2R1bXAodGhpcyk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIC8vZHVtcCh0aGlzLm9wdGlvbnNbaV0ub2JqZWN0KTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zW2ldLm9iamVjdC5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIikpCiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMub3B0aW9uc1tpXS52YWx1ZSk7CiAgICB9CiAgICAvL2R1bXAodmFsdWVzKTsKICAgICovCiAgICAvL2R1bXAodmFsdWVzKTsKICAgIAogICAgaWYgKHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgIHJldHVybih2YWx1ZXMpOwogICAgZWxzZQogICAgICAgIHJldHVybihbdmFsdWVzWzBdXSk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpCnsKICAgIC8vZHVtcCgiZ2V0VmFsdWUoKSIpOwogICAgLy9kdW1wKHRoaXMuaWQpOwogICAgLyoKICAgIGlmICh0aGlzLnBhcmFtc1siZWRpdGFibGUiXSkKICAgIHsKICAgICAgICB2YWx1ZSA9IHRoaXMucGFyZW50X2dldFZhbHVlKCk7CiAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAvL2R1bXAoImdldFZhbHVlKCk6Iit2YWx1ZSk7CiAgICAgICAgcmV0dXJuKHZhbHVlKTsKICAgIH0KICAgICovCiAgICAKICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpOwogICAgLy9kdW1wKHZhbHVlcyk7CiAgICByZXR1cm4odmFsdWVzLmpvaW4odGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Sm9pblNlcGFyYXRvciJdIHx8ICJ8IikpOwp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIC8qCiAgICBkdW1wKCJzZXRWYWx1ZSgpOiIrdmFsdWUpOwogICAgLy9kdW1wKHZhbHVlKTsKICAgIGlmICh2YWx1ZSA9PSAiIikKICAgICAgICB2YXIgdmFsdWVzID0gWyIiXTsKICAgIGVsc2UgaWYgKHR5cGVvZih2YWx1ZSkgPT0gInN0cmluZyIpCiAgICAgICAgdmFyIHZhbHVlcyA9IHZhbHVlLnNwbGl0KCJ8Iik7CiAgICAvL2Vsc2UgaWYgKHR5cGVvZih2YWx1ZSkgPT0gImFycmF5IikKICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpCiAgICAgICAgdmFyIHZhbHVlcyA9IHZhbHVlOwogICAgZWxzZSAKICAgICAgICB2YXIgdmFsdWVzID0gW3ZhbHVlXTsKICAgICAgICAKICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIHRoaXMuX29sZFZhbHVlU2V0ID0gdHJ1ZTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1tpXTsKICAgICAgICBkdW1wKG9wdGlvbik7CiAgICAgICAgb3B0aW9uLm9iamVjdC5zZWxlY3RlZCA9IChvcHRpb24udmFsdWUgJiYgaW5fYXJyYXkob3B0aW9uLnZhbHVlLCB2YWx1ZXMpKTsKICAgICAgICBpZiAob3B0aW9uLm9iamVjdC5zZWxlY3RlZCkKICAgICAgICAgICAgb3B0aW9uLm9iamVjdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgInNlbGVjdGVkIik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBvcHRpb24ub2JqZWN0LnJlbW92ZUF0dHJpYnV0ZSgic2VsZWN0ZWQiKTsKICAgIH0KICAgIGR1bXAodGhpcy5zZWxlY3QpOwogICAgCiAgICB0aGlzLl9zZXRWYWx1ZSh2YWx1ZSk7CiAgICBkdW1wKHRoaXMuc2VsZWN0KTsKICAgICovCgogICAgLy9kdW1wKCJzZXRWYWx1ZSgpIik7CiAgICAvL2R1bXAodmFsdWUpOwoKICAgIGlmICh0aGlzLmVkaXRhYmxlT3B0aW9uICYmIHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdEpvaW5WYWx1ZXMiXSkKICAgICAgICB0aGlzLmVkaXRhYmxlT3B0aW9uLnZhbHVlID0gdmFsdWU7CgogICAgdGhpcy5fc2V0VmFsdWUodmFsdWUpOwoKICAgIGlmICh0aGlzLnBhcmFtc1siZWRpdGFibGUiXSkKICAgICAgICB0aGlzLm9uRWRpdGFibGVDaGFuZ2UoKTsKICAgIAogICAgdGhpcy5fdmFsdWVTZXQgPSB0cnVlOyAvLyBUQ29tcG9uZW50LnNldFZhbHVlKCkKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICB0aGlzLnBhcmVudF9zZXRWYWx1ZSh2YWx1ZSk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUudG9nZ2xlVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgLy9kdW1wKCJ0b2dnbGUiKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbaV07CiAgICAgICAgaWYgKG9wdGlvbiAhPSB0aGlzLmVkaXRhYmxlT3B0aW9uICYmIG9wdGlvbi52YWx1ZSA9PSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChvcHRpb24ub2JqZWN0KTsKICAgICAgICAgICAgaWYgKG9wdGlvbi5vYmplY3QuZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvcHRpb24ub2JqZWN0LnNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBvcHRpb24ub2JqZWN0LnJlbW92ZUF0dHJpYnV0ZSgic2VsZWN0ZWQiKTsKICAgICAgICAgICAgICAgIG9wdGlvbi5vYmplY3QuQ2hlY2tCb3guc2V0Q2hlY2tlZChmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvcHRpb24ub2JqZWN0LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG9wdGlvbi5vYmplY3Quc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsICJzZWxlY3RlZCIpOwogICAgICAgICAgICAgICAgb3B0aW9uLm9iamVjdC5DaGVja0JveC5zZXRDaGVja2VkKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZHVtcChvcHRpb24pOwogICAgICAgICAgICAvL2R1bXAob3B0aW9uLm9iamVjdCk7CiAgICAgICAgICAgIC8vZHVtcChvcHRpb24ub2JqZWN0LnNlbGVjdGVkKTsKICAgICAgICAgICAgLy9kdW1wKG9wdGlvbi5vYmplY3QuY2hlY2tib3gpOwogICAgICAgICAgICAvL2R1bXAob3B0aW9uLm9iamVjdC5jaGVja2JveC5jaGVja2VkKTsKICAgICAgICB9CiAgICB9CiAgICAvL2R1bXAodGhpcy5nZXRWYWx1ZSgpKTsKICAgIHRoaXMuX3NldFZhbHVlKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICB0aGlzLmRyYXdPcHRpb25zQ29udGFpbmVyKCk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuX3NldFZhbHVlID0gZnVuY3Rpb24odmFsdWUsIF9vcHRpb24pCnsKICAgIGlmICh2YWx1ZSA9PSAiIikgICAgCiAgICAgICAgdmFsdWVzID0gWyIiXTsKICAgIGVsc2UgaWYgKHR5cGVvZih2YWx1ZSkgPT0gInN0cmluZyIgJiYgdGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Il0pCiAgICAgICAgdmFyIHZhbHVlcyA9IHZhbHVlLnNwbGl0KHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdEpvaW5TZXBhcmF0b3IiXSB8fCAifCIpOwogICAgLy9lbHNlIGlmICh0eXBlb2YodmFsdWUpID09ICJhcnJheSIpCiAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KQogICAgICAgIHZhciB2YWx1ZXMgPSB2YWx1ZTsKICAgIGVsc2UgCiAgICAgICAgdmFyIHZhbHVlcyA9IFt2YWx1ZV07CgogICAgLy9kdW1wKHZhbHVlcyk7CiAgICB2YXIgX2VsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CiAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLnNlbGVjdDsKICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50OwogICAgCiAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gIiI7CiAgICB2YXIgdmFsdWVGb3VuZCA9IGZhbHNlOwogICAgLy9kdW1wKHRoaXMuaWQpOwogICAgLy9kdW1wKHZhbHVlKTsKICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgLy9kdW1wKHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdKTsKICAgIC8vZHVtcCh0aGlzLnBhcmFtc1sibXVsdGlzZWxlY3RKb2luU2VwYXJhdG9yIl0pOwogICAgLy9kdW1wKHRoaXMub3B0aW9ucyk7CiAgICB2YXIgbGFiZWxzMiA9IFtdOwogICAgdmFyIHZhbHVlczIgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1tpXTsKICAgICAgICAvL2lmICh0aGlzLnBhcmFtc1sibXVsdGlzZWxlY3QiXSkKICAgICAgICAvL3sKICAgICAgICBpZiAob3B0aW9uICE9IHRoaXMuZWRpdGFibGVPcHRpb24pCiAgICAgICAgewogICAgICAgICAgICBvcHRpb24ub2JqZWN0LnNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIG9wdGlvbi5vYmplY3QucmVtb3ZlQXR0cmlidXRlKCJzZWxlY3RlZCIpOwogICAgICAgIH0KICAgICAgICAvL30KICAgICAgICAgICAgCiAgICAgICAgaWYgKCFoYXNDbGFzc05hbWUob3B0aW9uLm9iamVjdCwgInNlcGFyYXRvciIpICYmIGluX2FycmF5KG9wdGlvblsidmFsdWUiXSwgdmFsdWVzKSB8fCAodmFsdWVzLmxlbmd0aCA9PSAwICYmIG9wdGlvbi52YWx1ZSA9PSAiIikgfHwgb3B0aW9uID09IF9vcHRpb24pCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoIi0iKTsKICAgICAgICAgICAgLy9kdW1wKHZhbHVlcyk7CiAgICAgICAgICAgIC8vZHVtcChvcHRpb24pOwogICAgICAgICAgICAvL2R1bXAodmFsdWVzMik7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkob3B0aW9uWyJ2YWx1ZSJdLCB2YWx1ZXMyKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKG9wdGlvbik7CiAgICAgICAgICAgICAgICB2YWx1ZXMyLnB1c2gob3B0aW9uWyJ2YWx1ZSJdKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25bImxhYmVsIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKG9wdGlvbik7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxzMi5wdXNoKG9wdGlvblsibGFiZWwiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IG9wdGlvblsibGFiZWwiXTsKICAgICAgICAgICAgICAgIHZhbHVlRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2lmICghdGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Il0pCiAgICAgICAgICAgICAgICAvLyAgICBicmVhazsKICAgICAgICAgICAgICAgIC8vZWxzZSAKICAgICAgICAgICAgICAgIGlmICh0cnVlIC8qb3B0aW9uWyJ2YWx1ZSJdKi8pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCI/Pz8iKTsKICAgICAgICAgICAgICAgICAgICBvcHRpb24ub2JqZWN0LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBvcHRpb24ub2JqZWN0LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCAic2VsZWN0ZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL2JyZWFrOwogICAgICAgICAgICAvL2R1bXAob3B0aW9uKTsKICAgICAgICB9CiAgICB9CgogICAgLy9kdW1wKHZhbHVlczIpOwogICAgLy9kdW1wKGxhYmVsczIpOwogICAgdmFyIF9sYWJlbCA9IGxhYmVsczIuam9pbigiLCAiKTsKICAgIGlmICh0aGlzLnBhcmFtc1sibWF4TGFiZWxTaXplIl0gJiYgX2xhYmVsLmxlbmd0aCA+IHRoaXMucGFyYW1zWyJtYXhMYWJlbFNpemUiXSkKICAgICAgICBfbGFiZWwgPSBfbGFiZWwuc3Vic3RyaW5nKDAsIHRoaXMucGFyYW1zWyJtYXhMYWJlbFNpemUiXSkrIi4uLigiK2xhYmVsczIubGVuZ3RoKyIpIjsKICAgIAogICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9ICh0aGlzLnBhcmFtc1sibGFiZWxQcmVmaXgiXSA/IHRoaXMucGFyYW1zWyJsYWJlbFByZWZpeCJdKyIgIiA6ICIiKStfbGFiZWw7CiAgICAKICAgIGlmICh0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID09ICIiICYmICF0aGlzLnBhcmFtc1siZWRpdGFibGUiXSkKICAgICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gIiZuYnNwOyI7CiAgICAgICAgCiAgICAvKgogICAgaWYgKHZhbHVlRm91bmQgfHwgdGhpcy5wYXJhbXNbImVkaXRhYmxlIl0pCiAgICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSB2YWx1ZTsKICAgICovCiAgICAKICAgIC8vZHVtcCgiISEhISIpOwogICAgLy9kdW1wKHZhbHVlKTsKICAgIC8vZHVtcCh0aGlzLnNlbGVjdCk7CiAgICAKICAgIC8vZHVtcCh0aGlzLmlkKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICBpZiAodGhpcy5wYXJhbXNbImVkaXRhYmxlIl0pCiAgICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHZhbHVlOwogICAgCiAgICBpZiAodGhpcy5lZGl0YWJsZU9wdGlvbiAmJiB0aGlzLnBhcmFtc1sibXVsdGlzZWxlY3QiXSAmJiB0aGlzLnBhcmFtc1sibXVsdGlzZWxlY3RKb2luVmFsdWVzIl0pCiAgICB7CiAgICAgICAgdGhpcy5lZGl0YWJsZU9wdGlvbi52YWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuZWRpdGFibGVPcHRpb24uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIC8vZHVtcCh0aGlzLmVkaXRhYmxlT3B0aW9uKTsKICAgIH0KCiAgICB0aGlzLmRyYXdPcHRpb25zQ29udGFpbmVyKCk7CiAgICAvL2R1bXAodGhpcy5vbGRWYWx1ZSk7CiAgICAvL2R1bXAodGhpcy5nZXRWYWx1ZSgpKTsKICAgIGlmICghdGhpcy5fX2NhbGxFdmVudEZpcnN0Q2FsbCkKICAgIHsKICAgICAgICB0aGlzLl9fY2FsbEV2ZW50Rmlyc3RDYWxsID0gdHJ1ZTsKICAgICAgICB0aGlzLm9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgfQogICAgZWxzZSBpZiAodGhpcy5nZXRWYWx1ZSgpICE9IHRoaXMub2xkVmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICB2YXIgZSA9IGNyZWF0ZUV2ZW50KCJjaGFuZ2UiKTsKICAgICAgICBlLnNldFRhcmdldCh0aGlzLnNlbGVjdCk7CiAgICAgICAgY2FsbEV2ZW50KHRoaXMuc2VsZWN0LCAiY2hhbmdlIiwgZSk7CiAgICAgICAgLy9kdW1wKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgLy9hbGVydCh0aGlzLm9uQ2hhbmdlKTsKICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSkKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldFZhbHVlKCkpOwogICAgfQp9CgovKgovLyBQUk9DIFRPIFRVIEJZTE8/Pz8ga3Z1bGkgSUUgPCAxMT8/Pz8/PyBuZXZpbS4uLiB6cnVzZW5vClRDb21ib0JveC5wcm90b3R5cGUuX29uTW91c2VXaGVlbCA9IGZ1bmN0aW9uKGUpCnsKICAgIGUgPSBnZXRNb3VzZUV2ZW50KGUpOwogICAgCiAgICB0aGlzLm9wdGlvbnNDb250YWluZXIuc2Nyb2xsVG9wIC09IGUud2hlZWxEZWx0YVk7CiAgICBlLnN0b3AoKTsKICAgIAogICAgLy9kdW1wKGUpOwogICAgLy9kdW1wKHRoaXMub3B0aW9uc0NvbnRhaW5lci5zY3JvbGxUb3ApOwogICAgLy9kdW1wKHRoaXMub3B0aW9uc0NvbnRhaW5lci5zY3JvbGxIZWlnaHQpOwogICAgLy9kdW1wKHRoaXMub3B0aW9uc0NvbnRhaW5lci5vZmZzZXRIZWlnaHQpOwogICAgCiAgICAvLyBkaXNhYmxlIHNjcm9sbCBwYWdlIGJvZHkgdXNpbmcgbW91c2Ugd2hlZWwKICAgIC8vaWYgKHRoaXMub3B0aW9uc0NvbnRhaW5lci5zY3JvbGxUb3AgPT0gMCAmJiBlLmRlbHRhWSA8IDAgfHwgdGhpcy5vcHRpb25zQ29udGFpbmVyLnNjcm9sbFRvcCA9PSB0aGlzLm9wdGlvbnNDb250YWluZXIuc2Nyb2xsSGVpZ2h0LTEgJiYgZS5kZWx0YVkgPiAwKQogICAgLy97CiAgICAvLyAgICBlLnN0b3AoKTsKICAgIC8vfQp9CiovCgpUQ29tYm9Cb3gucHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKCkKewogICAgaWYgKHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgewogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zW2ldOwogICAgICAgICAgICBpZiAob3B0aW9uLm9iamVjdCAmJiBvcHRpb24ub2JqZWN0LkNoZWNrQm94KQogICAgICAgICAgICAgICAgb3B0aW9uLm9iamVjdC5DaGVja0JveC5zZXRDaGVja2VkKHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9uLm9iamVjdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgIG9wdGlvbi5vYmplY3Quc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsICJzZWxlY3RlZCIpOyAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgIAogICAgICAgIAogICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5nZXRWYWx1ZSgpKTsKICAgIH0KfQoKVENvbWJvQm94LnByb3RvdHlwZS51bnNlbGVjdEFsbCA9IGZ1bmN0aW9uKCkKewogICAgaWYgKHRoaXMucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgewogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zW2ldOwogICAgICAgICAgICBpZiAob3B0aW9uLm9iamVjdCAmJiBvcHRpb24ub2JqZWN0LkNoZWNrQm94KQogICAgICAgICAgICAgICAgb3B0aW9uLm9iamVjdC5DaGVja0JveC5zZXRDaGVja2VkKGZhbHNlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG9wdGlvbi5vYmplY3Quc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgb3B0aW9uLm9iamVjdC5yZW1vdmVBdHRyaWJ1dGUoInNlbGVjdGVkIik7ICAgICAgICAgICAgICAgIAogICAgICAgIH0gICAgCgogICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5nZXRWYWx1ZSgpKTsKICAgIH0KfQoKVENvbWJvQm94LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkKewogICAgdGhpcy5zZWxlY3Quc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKfQoKVENvbWJvQm94LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lKQp7CiAgICB0aGlzLnNlbGVjdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Cn0KClRDb21ib0JveC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSkKewogICAgcmV0dXJuKHRoaXMuc2VsZWN0LmdldEF0dHJpYnV0ZShuYW1lKSk7ICAgIAp9ICAgCgpUQ29tYm9Cb3gucHJvdG90eXBlLmdldFZhbHVlQnlEYXRhID0gZnVuY3Rpb24oZGF0YSkKewogICAgdmFyIHZhbHVlID0gIiI7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT0gZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZXNbaV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKHZhbHVlKTsKfSAgIAoKVENvbWJvQm94LnByb3RvdHlwZS5nZXREYXRhQnlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQp7CiAgICB2YXIgZGF0YSA9ICIiOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy52YWx1ZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmICh0aGlzLnZhbHVlc1tpXSA9PSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGFbaV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKGRhdGEpOwp9ICAgCgpUQ29tYm9Cb3gucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbigpCnsKICAgIHZhciBkYXRhID0gdGhpcy5nZXREYXRhQnlWYWx1ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgCiAgICByZXR1cm4oZGF0YSk7Cn0gICAKClRDb21ib0JveC5wcm90b3R5cGUuc2V0VmFsdWVCeURhdGEgPSBmdW5jdGlvbihkYXRhKQp7CiAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aCA7IGkrKykKICAgICB7CiAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uZGF0YSA9PSBkYXRhKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLl9zZXRWYWx1ZSgiIiwgdGhpcy5vcHRpb25zW2ldKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9ICAgIAp9ICAgCgpUQ29tYm9Cb3gucHJvdG90eXBlLmdldE9wdGlvblZhbHVlcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHZhbHVlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aCA7IGkrKykKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHZhbHVlcy5wdXNoKHRoaXMub3B0aW9uc1tpXS52YWx1ZSk7CiAgICB9CiAgICAgCiAgICByZXR1cm4odmFsdWVzKTsKfQoKVENvbWJvQm94LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICB2YXIgdGV4dCA9ICIiOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zW2ldOwogICAgICAgIGlmIChvcHRpb24udmFsdWUgPT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0ZXh0ID0gb3B0aW9uLnRleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKHRleHQpOwp9CgpUQ29tYm9Cb3gucHJvdG90eXBlLl9vbk1vZGFsQnV0dG9uUmVzaXplID0gZnVuY3Rpb24oKQp7CiAgICAvL3ZhciBfbGkgPSBjcmVhdGVFbGVtZW50KCJsaSIpOwogICAgLy90aGlzLm9wdGlvbnNDb250YWluZXIuYXBwZW5kQ2hpbGQoX2xpKTsKICAgIC8vc2V0U3R5bGUodGhpcy5tb2RhbEJ1dHRvbkNvbnRhaW5lciwgImJvcmRlci1ib3R0b20iLCBnZXRTdHlsZSh0aGlzLm9wdGlvbnNDb250YWluZXIsICJib3JkZXIiKSk7CiAgICBzZXRTdHlsZSh0aGlzLm1vZGFsQnV0dG9uQ29udGFpbmVyLCAib3V0ZXJXaWR0aCIsIChleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5vcHRpb25zQ29udGFpbmVyLCAiaW5uZXJXaWR0aCIpKS1nZXRTY3JvbGxCYXJXaWR0aCh0aGlzLm9wdGlvbnNDb250YWluZXIpKSsicHgiKTsKICAgIC8vc2V0U3R5bGUodGhpcy5tb2RhbEJ1dHRvbkNvbnRhaW5lciwgIm1hcmdpblRvcCIsIChleHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5vcHRpb25zQ29udGFpbmVyLCAib3V0ZXJIZWlnaHQiKSktZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMubW9kYWxCdXR0b25Db250YWluZXIsICJvdXRlckhlaWdodCIpKSkrInB4Iik7CiAgICBzZXRTdHlsZSh0aGlzLm1vZGFsQnV0dG9uQ29udGFpbmVyLCAibWFyZ2luVG9wIiwgKGV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLm9wdGlvbnNDb250YWluZXIsICJvdXRlckhlaWdodCIpKS1leHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5tb2RhbEJ1dHRvbkNvbnRhaW5lciwgIm91dGVySGVpZ2h0IikpLWV4dHJhY3RGbG9hdChnZXRTdHlsZSh0aGlzLm9wdGlvbnNDb250YWluZXIsICJib3JkZXJCb3R0b21XaWR0aCIpKS1leHRyYWN0RmxvYXQoZ2V0U3R5bGUodGhpcy5vcHRpb25zQ29udGFpbmVyLCAiYm9yZGVyVG9wV2lkdGgiKSkpKyJweCIpOwogICAgc2V0U3R5bGUodGhpcy5vcHRpb25zQ29udGFpbmVyLCAicGFkZGluZ0JvdHRvbSIsICIiKTsKICAgIHNldFN0eWxlKHRoaXMub3B0aW9uc0NvbnRhaW5lciwgInBhZGRpbmdCb3R0b20iLCAoZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMub3B0aW9uc0NvbnRhaW5lciwgInBhZGRpbmdCb3R0b20iKSkrZXh0cmFjdEZsb2F0KGdldFN0eWxlKHRoaXMubW9kYWxCdXR0b25Db250YWluZXIsICJvdXRlckhlaWdodCIpKSkrInB4Iik7CiAgICAKICAgIC8vaWYgKHRoaXMuZmlsdGVyQ29udGFpbmVyLm5leHRTaWJsaW5nKQogICAgLy97CiAgICAvLyAgICBzZXRTdHlsZSh0aGlzLmZpbHRlckNvbnRhaW5lci5uZXh0U2libGluZywgIm1hcmdpbi10b3AiLCBnZXRTdHlsZSh0aGlzLmZpbHRlckNvbnRhaW5lciwgIm91dGVySGVpZ2h0IikpCiAgICAvL30KICAgIAogICAgLy9yZW1vdmVOb2RlKF9saSk7Cn0KLl9Db21ib0JveCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5OwogICAgYmFja2dyb3VuZDogI0ZGRkZGRjsKICAgIGNvbG9yOiAjMDAwMDAwOwogICAgcGFkZGluZzogMnB4OwogICAgbWFyZ2luOiAwcHg7CiAgICAvKndoaXRlLXNwYWNlOiBub3dyYXA7Ki8KICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiB7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5fQ29tYm9Cb3guZWRpdGFibGUgKyAuYnV0dG9uIHsKICAgIHBvaW50ZXItZXZlbnRzOiBpbml0aWFsOwp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbjpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiBkaXYgewogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1pbWcvZXhwYW5kLnBuZyk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsKICAgIHdpZHRoOiAxMDAlOwp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIHsKICAgIC8qcG9zaXRpb246IGFic29sdXRlOyovCiAgICBwb3NpdGlvbjogZml4ZWQ7ICAgIC8qIGZpeGVkICwgcHJvdG96ZSBwb2t1ZCBqc2VtIHYgR3JpZCwga3RlcnkgbWEgb3ZlcmZsb3c6YXV0byBhIHBvc2l0aW9uOnJlbGF0aXZlLCBwYWsganNvdSB2c2VjaG55IGFic29sdXRlIHNjcm9sbG92YXRlbG5lLCBhbGUgemRlIHRvIG5lcG90cmVidWppIC0gSkVOWkUhIGJsYm5lIHRvIHphc2UgdiBTYWZhcmkgKi8KICAgIG1hcmdpbjogMHB4OwogICAgcGFkZGluZzogMHB4OwogICAgei1pbmRleDogMTAwMDAwMDsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OwogICAgYmFja2dyb3VuZDogI0ZGRkZGRjsKICAgIG1pbi13aWR0aDogNDBweDsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgIG1heC13aWR0aDogNDAwcHg7Cn0KLl9Db21ib0JveCArIC5idXR0b24gKyB1bCAgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGkgewogICAgZGlzcGxheTogYmxvY2s7IAogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIGNsZWFyOiBib3RoOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIC8qd2hpdGUtc3BhY2U6IG5vd3JhcDsqLwp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIGxpIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwYWRkaW5nOiAycHg7CiAgICBtaW4taGVpZ2h0OiAxMHB4OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIHVsIHsKICAgIG1hcmdpbjogMHB4OwogICAgcGFkZGluZzogMHB4Owp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIHVsIGxpIHsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4Owp9CgouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIGxpIC5ncm91cCB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLl9Db21ib0JveCArIC5idXR0b24gKyB1bCBsaS5oaWRkZW4gewogICAgZGlzcGxheTogbm9uZTsKfQoKLl9Db21ib0JveCArIC5idXR0b24gKyB1bCBsaSBhOmhvdmVyLCAuX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIGxpIGEuaG92ZXIsIC5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGkuc2VsZWN0ZWQgPiBhIHsKICAgIGJhY2tncm91bmQ6ICMxQzdCRDc7CiAgICBjb2xvcjogI0ZGRkZGRjsKfQoKLl9PYmplY3RDb21ib0JveCBpbWcsIC5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGkgaW1nIHsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLl9Db21ib0JveCArIC5idXR0b24gKyB1bCBsaS5zZXBhcmF0b3IgewogICAgcGFkZGluZzogMHB4OwogICAgaGVpZ2h0OiAycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTsgCiAgICBtYXJnaW4tYm90dG9tOiAycHg7Cn0KCi8qCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGkgYSBpbnB1dCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgbWFyZ2luLXJpZ2h0OiA2cHg7Cn0KKi8KCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgLl9DaGVja0JveCArIC5idXR0b24gIHsKICAgIG1hcmdpbi1yaWdodDogNnB4Owp9CgouX0NvbWJvQm94T3B0aW9uc01vZGFsQnV0dG9uQ29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKfQouX0NvbWJvQm94T3B0aW9uc01vZGFsQnV0dG9uIHsKICAgIHdpZHRoOiAxMDAlOwp9Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ29tYm9Cb3gvQ29tYm9Cb3guY2xhc3MucGhwIC0tLS0tLS0gDQoKY2xhc3MgVENvbWJvQm94IGV4dGVuZHMgVEJ1dHRvbkVkaXQKewogICAgdmFyICRjb250ZXh0TWVudUVuYWJsZWQgPSB0cnVlOwoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb25HZXRQcm9wZXJ0aWVzKCkKICAgIHsKICAgICAgICByZXR1cm4obWVyZ2VQcm9wZXJ0aWVzKHBhcmVudDo6b25HZXRQcm9wZXJ0aWVzKCksIGFycmF5KCAgICAgICAgCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1EYXRhIiwKICAgICAgICAibmFtZT12YWx1ZXMsY2FwdGlvbj1WYWx1ZXMsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAibmFtZT10ZXh0cyxjYXB0aW9uPVRleHRzLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgIm5hbWU9bGFiZWxzLGNhcHRpb249TGFiZWxzLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgIm5hbWU9ZGF0YSxjYXB0aW9uPURhdGEsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAibmFtZT1sYWJlbFByZWZpeCxjYXB0aW9uPUxhYmVsIFByZWZpeCxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgIGFycmF5KAogICAgICAgICAgICAibmFtZSI9PiJncm91cHMiLAogICAgICAgICAgICAiY2FwdGlvbiI9PiJHcm91cHMiLAogICAgICAgICAgICAib2JqZWN0Ij0+IkdyaWRFZGl0IiwKICAgICAgICAgICAgImZpZWxkcyI9PmFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoIm5hbWUiPT4idmFsdWUiLCJvYmplY3QiPT5hcnJheSgib2JqZWN0Ij0+IlRleHRFZGl0IiwicGFyYW1zIj0+InN0eWxlPXdpZHRoOjEwMHB4IikpLAogICAgICAgICAgICAgICAgYXJyYXkoIm5hbWUiPT4ibmFtZSIsIm9iamVjdCI9PmFycmF5KCJvYmplY3QiPT4iVGV4dEVkaXQiLCJwYXJhbXMiPT4ic3R5bGU9d2lkdGg6MzAwcHgiKSkKICAgICAgICAgICAgKQogICAgICAgICksCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1CZWhhdmlvciIsCiAgICAgICAgIm5hbWU9ZWRpdGFibGUsY2FwdGlvbj1FZGl0YWJsZSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAibmFtZT11bmtub3duLGNhcHRpb249VW5rbm93biBWYWx1ZSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAibmFtZT1tdWx0aXNlbGVjdCxjYXB0aW9uPU11bHRpc2VsZWN0LG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJuYW1lPW11bHRpc2VsZWN0VmFsdWVzT25Ub3AsY2FwdGlvbj1NdWx0aXNlbGVjdCBWYWx1ZXMgb24gVG9wLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJuYW1lPW11bHRpc2VsZWN0Sm9pblZhbHVlcyxjYXB0aW9uPU11bHRpc2VsZWN0IEpvaW4gVmFsdWVzLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJuYW1lPW11bHRpc2VsZWN0Sm9pblNlcGFyYXRvcixjYXB0aW9uPU11bHRpc2VsZWN0IEpvaW4gU2VwYXJhdG9yLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgIm5hbWU9c29ydCxjYXB0aW9uPVNvcnQsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgIm5hbWU9bW9kYWwsY2FwdGlvbj1Nb2RhbCxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAibmFtZT1tb2RhbEJ1dHRvblRpdGxlLGNhcHRpb249TW9kYWwgQnV0dG9uIFRpdGxlLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1WaXN1YWwiLAogICAgICAgICJuYW1lPWl0ZW1TdHlsZSxjYXB0aW9uPUl0ZW0gU3R5bGUsb2JqZWN0PVN0eWxlRWRpdCIsCiAgICAgICAgIm5hbWU9bWF4TGFiZWxTaXplLGNhcHRpb249TWF4IExhYmVsIFNpemUsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPU9iamVjdCIsCiAgICAgICAgIm5hbWU9d3JhcHBlcixjYXB0aW9uPVdyYXBwZXIsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICApKSk7ICAgICAgICAKICAgICAgICAvLyksIFRQcm9wZXJ0eUVkaXRvcjo6Z2V0Q1NTUHJvcGVydGllcygpKSk7ICAgICAgICAKICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIWhlYWRIdG1sQWRkZWQoX19DTEFTU19fLCAkcGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIHBhcmVudDo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAgICAgLy9pZiAoJHBhcmFtc1sibXVsdGlzZWxlY3QiXSkKICAgICAgICAgICAgVENoZWNrQm94OjpvbkdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvQ29tYm9Cb3gvQ29tYm9Cb3guY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7CiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8bGluayBocmVmPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9Db21ib0JveC9Db21ib0JveC5jbGFzcy5jc3MnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIC8+Iix0cnVlKTsKICAgICAgICAgICAgYWRkRXh0ZW5kaW5nSGVhZEh0bWwoJHBhcmFtcywgX19DTEFTU19fKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgIGZ1bmN0aW9uIF9zb3J0KCRhLCAkYikKICAgIHsKICAgICAgICBpZiAoJGFbInRleHQiXSA+ICRiWyJ0ZXh0Il0pCiAgICAgICAgICAgIHJldHVybigxKTsKICAgICAgICBpZiAoJGFbInRleHQiXSA8ICRiWyJ0ZXh0Il0pCiAgICAgICAgICAgIHJldHVybigtMSk7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybigwKTsKICAgIH0KICAgICovCgogICAgZnVuY3Rpb24gb25HZXRDb250ZW50KCYkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikKICAgIHsKICAgICAgICAvKiAgICAgICAgCiAgICAgICAgaWYgKHRydWUpCiAgICAgICAgewogICAgICAgICRwYXJhbXMgPSBhcnJheSgKICAgICAgICAgICAgInVwZGF0ZURhdGEiID0+IHRydWUsCiAgICAgICAgICAgICJhY3Rpb25UeXBlIiA9PiAiYXRVbnBhY2tNb2R1bGUiLAogICAgICAgICAgICAicnVuSW5CYWNrZ3JvdW5kIiA9PiBmYWxzZSwKICAgICAgICAgICAgImluc3RhbGxGaWxlIiA9PiBQUk9KRUNUUEFUSC4iQ29yZS1ZLmluc3RhbGwiLAogICAgICAgICk7CiAgICAgICAgJF9SRVFVRVNUWyJkZWJ1Z1Byb2Nlc3MiXSA9IHRydWU7CgogICAgICAgIGdsb2JhbCAkcHJvY2Vzc0lkOwogICAgICAgICRNYW5hZ2VyID0gY3JlYXRlT2JqZWN0KCJQcm9jZXNzTWFuYWdlciIpOwogICAgICAgICRwcm9jZXNzSWQgPSAkTWFuYWdlci0+cnVuKCJJbnN0YWxsUHJvY2VzcyIsICRwYXJhbXMpOwogICAgICAgIHZhcl9kdW1wKCRwcm9jZXNzSWQpOwogICAgICAgIGV4aXQ7CiAgICAgICAgfQogICAgICAgICovCiAgICAgICAgLy9kdW1wKCR0aGlzLT5uYW1lKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgLy9zdGFydFByb2ZpbGUoIlRDb21ib0JveDo6Z2V0Q29udGVudCIsICRwYXJhbXMpOwogICAgICAgICR0aGlzLT5nZXRIZWFkSHRtbCgkcGFyYW1zKTsKCiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgIC8vaWYgKCRwYXJhbXNbImlkIl0gPT0gInZpZXdUeXBlIikKICAgICAgICAvL3sKICAgICAgICAvLyAgICBkdW1wKCRwYXJhbXMpOwogICAgICAgIC8vICAgIGR1bXAoJHZhbHVlKTsKICAgICAgICAvL30KICAgICAgICAkdGhpcy0+aW5pdCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICBpZiAoISRwYXJhbXNbImNsYXNzIl0pCiAgICAgICAgICAgICRwYXJhbXNbImNsYXNzIl0gPSAiVGV4dCI7CgogICAgICAgIGlmICh0b1N0cmluZygkdmFsdWUpID09ICIiICYmIHRvU3RyaW5nKCRwYXJhbXNbInZhbHVlIl0pKQogICAgICAgICAgICAkdmFsdWUgPSB0b1N0cmluZygkcGFyYW1zWyJ2YWx1ZSJdKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCR2YWx1ZSA9PSAiIiAmJiAkcGFyYW1zWyJkZWZhdWx0VmFsdWUiXSAhPT0gTlVMTCkKICAgICAgICAgICAgJHZhbHVlID0gdG9TdHJpbmcoJHBhcmFtc1siZGVmYXVsdFZhbHVlIl0pOwogICAgICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1sidHJhbnNsYXRlIl0gIT09IGZhbHNlKQogICAgICAgICAgICAkcGFyYW1zWyJ0cmFuc2xhdGUiXSA9IHRydWU7CiAgICAgICAgCiAgICAgICAgJHBhcmFtc1siY29udGFpbmVyIl0gPSAkdGhpcy0+aWQ7CgogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAkanNQYXJhbXMgPSAkcGFyYW1zOwoKICAgICAgICBpZiAoJHBhcmFtc1sibW9kYWwiXSAmJiAhJHBhcmFtc1sibW9kYWxCdXR0b25UaXRsZSJdKQogICAgICAgICAgICAkanNQYXJhbXNbIm1vZGFsQnV0dG9uVGl0bGUiXSA9ICJPSyI7CiAgICAgICAgCiAgICAgICAgaWYgKCEkcGFyYW1zWyJ3cmFwcGVyIl0pCiAgICAgICAgewogICAgICAgICAgICAkYXR0clBhcmFtcyA9ICRwYXJhbXM7CiAgICAgICAgICAgICRhdHRyUGFyYW1zWyJjbGFzcyJdID0gIl9Db21ib0JveCAiLiRwYXJhbXNbImNsYXNzIl07CiAgICAgICAgICAgICRhdHRyUGFyYW1zWyJuYW1lIl0gPSAkdGhpcy0+bmFtZS4oJHBhcmFtc1sibXVsdGlzZWxlY3QiXSAmJiAhJHBhcmFtc1siZWRpdGFibGUiXSA/ICJbXSIgOiAiIik7CiAgICAgICAgICAgICRhdHRyUGFyYW1zWyJpZCJdID0gJHRoaXMtPmlkOwogICAgICAgICAgICAkYXR0clBhcmFtc1sic3R5bGUiXSA9IGdldENTU1BhcmFtcygkcGFyYW1zKTsKICAgICAgICAgICAgJGF0dHJQYXJhbXNbIm11bHRpcGxlIl0gPSAoJHBhcmFtc1sibXVsdGlzZWxlY3QiXSA/ICJtdWx0aXBsZSIgOiAiIik7CiAgICAgICAgICAgIHVuc2V0KCRhdHRyUGFyYW1zWyJ2YWx1ZSJdKTsKCiAgICAgICAgICAgICRodG1sIC49ICI8c2VsZWN0ICIuZ2V0QXR0cmlidXRlUGFyYW1zKCRhdHRyUGFyYW1zKS4iPiI7CiAgICAgICAgICAgICRodG1sIC49ICR0aGlzLT5nZXRPcHRpb25zKCRwYXJhbXMsICR2YWx1ZSk7CiAgICAgICAgICAgICRodG1sIC49ICI8L3NlbGVjdD4iOwogICAgICAgIH0KICAgICAgICAvL2R1bXAoIj8iKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPnZhbHVlcyk7CiAgICAgICAgLy9kdW1wKCR0aGlzKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPm5hbWUpOwogICAgICAgIC8vZHVtcCgkdGhpcyk7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5qc0NsYXNzTmFtZSk7CiAgICAgICAgJGpzIC49ICJ2YXIgIi4kdGhpcy0+anNPYmplY3ROYW1lLiIgPSBuZXcgIi4kdGhpcy0+anNDbGFzc05hbWUuIigiLiR0aGlzLT5nZXRKc1BhcmFtcygkanNQYXJhbXMpLiIsICciLiR0aGlzLT5pZC4iJyk7IFxuIjsKICAgICAgICAKICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCR0aGlzLT5nZXRKYXZhU2NyaXB0SHRtbCgkanMpKSk7CiAgICAgICAgJGh0bWwgLj0gJHRoaXMtPmdldEphdmFTY3JpcHRIdG1sKCRqcyk7CiAgICAgICAgCiAgICAgICAgLy9zdG9wUHJvZmlsZSgiVENvbWJvQm94OjpnZXRDb250ZW50Iik7CiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0T3B0aW9ucygkcGFyYW1zLCAkdmFsdWUpCiAgICB7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5uYW1lKTsKICAgICAgICAvL2R1bXAoJHZhbHVlKTsKCiAgICAgICAgaWYgKCEkcGFyYW1zWyJtdWx0aXNlbGVjdEpvaW5TZXBhcmF0b3IiXSkKICAgICAgICAgICAgJHBhcmFtc1sibXVsdGlzZWxlY3RKb2luU2VwYXJhdG9yIl0gPSAifCI7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgaWYgKCgkcGFyYW1zWyJtdWx0aXNlbGVjdCJdIHx8ICRwYXJhbXNbIm11bHRpc2VsZWN0Sm9pblZhbHVlcyJdKSAmJiAhaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICAgICAgJHZhbHVlID0gZXhwbG9kZUxpc3QoJHZhbHVlLCAkcGFyYW1zWyJtdWx0aXNlbGVjdEpvaW5TZXBhcmF0b3IiXSk7CgogICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+bmFtZSk7CiAgICAgICAgLy9kdW1wKHN0cl9kdW1wKCR2YWx1ZSkpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAkdGhpcy0+dmFsdWVzID0gZXhwbG9kZUxpc3QoJHBhcmFtc1sidmFsdWVzIl0pOwogICAgICAgICR0aGlzLT50ZXh0cyA9ICgkcGFyYW1zWyJ0ZXh0cyJdID8gZXhwbG9kZUxpc3QoJHBhcmFtc1sidGV4dHMiXSkgOiAkdGhpcy0+dmFsdWVzKTsKICAgICAgICAkdGhpcy0+bGFiZWxzID0gKCRwYXJhbXNbImxhYmVscyJdID8gZXhwbG9kZUxpc3QoJHBhcmFtc1sibGFiZWxzIl0pIDogJHRoaXMtPnRleHRzKTsKICAgICAgICAkdGhpcy0+ZGF0YSA9ICgkcGFyYW1zWyJkYXRhIl0gPyBleHBsb2RlTGlzdCgkcGFyYW1zWyJkYXRhIl0pIDogJHRoaXMtPmRhdGEpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+dGV4dHMpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgkdGhpcy0+bmFtZSk7CiAgICAgICAgLy9kdW1wKCRwYXJhbXNbInRyYW5zbGF0ZSJdKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPnRleHRzKTsKICAgICAgICBpZiAoJHBhcmFtc1sidHJhbnNsYXRlIl0pCiAgICAgICAgewogICAgICAgICAgICBmb3IgKCRpID0gMCA7ICRpIDwgY291bnQoJHRoaXMtPnZhbHVlcykgOyAkaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+dGV4dHNbJGldID0gdHJhbnNsYXRlKCR0aGlzLT50ZXh0c1skaV0pOwogICAgICAgICAgICAgICAgJHRoaXMtPmxhYmVsc1skaV0gPSB0cmFuc2xhdGUoJHRoaXMtPmxhYmVsc1skaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZHVtcCgkdGhpcy0+dGV4dHMpOwogICAgICAgIC8vaWYgKCRwYXJhbXNbInNvcnQiXSAhPT0gZmFsc2UpCiAgICAgICAgaWYgKCRwYXJhbXNbInNvcnQiXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+dmFsdWVzWzBdID09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkZW1wdHlWYWx1ZSA9IGFycmF5X3NoaWZ0KCR0aGlzLT52YWx1ZXMpOwogICAgICAgICAgICAgICAgJGVtcHR5VGV4dCA9IGFycmF5X3NoaWZ0KCR0aGlzLT50ZXh0cyk7CiAgICAgICAgICAgICAgICAkZW1wdHlMYWJlbCA9IGFycmF5X3NoaWZ0KCR0aGlzLT5sYWJlbHMpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkZW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT50ZXh0cyBhcyAka2V5ID0+ICR0ZXh0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGV4dHNbJGtleV0gPSBzdHJpcF90YWdzKCR0ZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc29ydF9tdWx0aV9hcnJheSgzLCAkdGhpcy0+dmFsdWVzLCAkdGhpcy0+dGV4dHMsICR0aGlzLT5sYWJlbHMsICR0ZXh0cyk7CgogICAgICAgICAgICBpZiAoJGVtcHR5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWVzID0gYXJyYXlfbWVyZ2UoYXJyYXkoJGVtcHR5VmFsdWUpLCAkdGhpcy0+dmFsdWVzKTsKICAgICAgICAgICAgICAgICR0aGlzLT50ZXh0cyA9IGFycmF5X21lcmdlKGFycmF5KCRlbXB0eVRleHQpLCAkdGhpcy0+dGV4dHMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmxhYmVscyA9IGFycmF5X21lcmdlKGFycmF5KCRlbXB0eUxhYmVsKSwgJHRoaXMtPmxhYmVscyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHRoaXMtPnZhbHVlcyA9IGFycmF5X21lcmdlKGV4cGxvZGVMaXN0KCRwYXJhbXNbInZhbHVlc0JlZm9yZSJdKSwgJHRoaXMtPnZhbHVlcyk7CiAgICAgICAgJHRoaXMtPnRleHRzID0gYXJyYXlfbWVyZ2UoZXhwbG9kZUxpc3QoZmlyc3RfdmFsdWUoJHBhcmFtc1sidGV4dHNCZWZvcmUiXSwgJHBhcmFtc1sidmFsdWVzQmVmb3JlIl0pKSwgJHRoaXMtPnRleHRzKTsKICAgICAgICAkdGhpcy0+bGFiZWxzID0gYXJyYXlfbWVyZ2UoZXhwbG9kZUxpc3QoZmlyc3RfdmFsdWUoJHBhcmFtc1sibGFiZWxzQmVmb3JlIl0sICRwYXJhbXNbInRleHRzQmVmb3JlIl0sICRwYXJhbXNbInZhbHVlc0JlZm9yZSJdKSksICR0aGlzLT5sYWJlbHMpOwoKICAgICAgICAkdGhpcy0+dmFsdWVzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnZhbHVlcywgZXhwbG9kZUxpc3QoJHBhcmFtc1sidmFsdWVzQWZ0ZXIiXSkpOwogICAgICAgICR0aGlzLT50ZXh0cyA9IGFycmF5X21lcmdlKCR0aGlzLT50ZXh0cywgZXhwbG9kZUxpc3QoZmlyc3RfdmFsdWUoJHBhcmFtc1sidGV4dHNBZnRlciJdLCAkcGFyYW1zWyJ2YWx1ZXNBZnRlciJdKSkpOwogICAgICAgICR0aGlzLT5sYWJlbHMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bGFiZWxzLCBleHBsb2RlTGlzdChmaXJzdF92YWx1ZSgkcGFyYW1zWyJsYWJlbHNBZnRlciJdLCAkcGFyYW1zWyJ0ZXh0c0FmdGVyIl0sICRwYXJhbXNbInZhbHVlc0FmdGVyIl0pKSk7CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+bGFiZWxzKSAmJiAkdGhpcy0+bGFiZWxzWzBdID09ICIiKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPmxhYmVsc1swXSA9ICRwYXJhbXNbInBsYWNlaG9sZGVyIl07CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRfX3ZhbHVlID0gJHZhbHVlOwogICAgICAgIGlmICghJHBhcmFtc1sibXVsdGlzZWxlY3QiXSAmJiAhaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICAgICAgJF9fdmFsdWUgPSBhcnJheSgkdmFsdWUpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgkX192YWx1ZSk7CiAgICAgICAgJHRoaXMtPmdyb3VwcyA9ICgkcGFyYW1zWyJncm91cHMiXSA/IFRKU09OOjpkZWNvZGUoJHBhcmFtc1siZ3JvdXBzIl0sIGFycmF5KCkpIDogYXJyYXkoKSk7CiAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCR0aGlzLT52YWx1ZXMpIDsgJGkrKykKICAgICAgICB7CiAgICAgICAgICAgICRfdmFsdWUgPSAkdGhpcy0+dmFsdWVzWyRpXTsKICAgICAgICAgICAgJF90ZXh0ID0gJHRoaXMtPnRleHRzWyRpXTsKICAgICAgICAgICAgJF9sYWJlbCA9ICR0aGlzLT5sYWJlbHNbJGldOwogICAgICAgICAgICAkX2RhdGEgPSAkdGhpcy0+ZGF0YVskaV07CgogICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5ncm91cHMgYXMgJGdyb3VwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJGdyb3VwWyJ2YWx1ZSJdID09ICRfdmFsdWUgJiYgJGdyb3VwWyJuYW1lIl0gIT0gJGxhc3RHcm91cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGhhc0dyb3VwKQogICAgICAgICAgICAgICAgICAgICAgICAkaHRtbCAuPSAiPC9vcHRncm91cD4iOwogICAgICAgICAgICAgICAgICAgICRodG1sIC49ICI8b3B0Z3JvdXAgbGFiZWw9JyIuJGdyb3VwWyJuYW1lIl0uIic+IjsKICAgICAgICAgICAgICAgICAgICAkaGFzR3JvdXAgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICRsYXN0R3JvdXAgPSAkZ3JvdXBbIm5hbWUiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKF9pc19hcnJheSgkX2RhdGEpKQogICAgICAgICAgICAgICAgJF9kYXRhID0gVEpTT046OmVuY29kZSgkdGhpcy0+ZGF0YVskaV0pOwoKICAgICAgICAgICAgJGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAoQHN0cnBvcygkX3ZhbHVlLCAiIUhJRERFTiEiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJF92YWx1ZSA9IHN1YnN0cigkX3ZhbHVlLCBzdHJsZW4oIiFISURERU4hIikpOwogICAgICAgICAgICAgICAgJHRoaXMtPnZhbHVlc1skaV0gPSAkX3ZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHRvQm9vbCgkcGFyYW1zWyJtdWx0aXNlbGVjdFZhbHVlc09uVG9wIl0pKQogICAgICAgICAgICAgICAgICAgICR0b3AgPSB0cnVlOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy9kdW1wKCRfdmFsdWUpOwogICAgICAgICAgICBpZiAoJF90ZXh0ID09ICItLS0iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkaHRtbCAuPSAiPG9wdGlvbiBjbGFzcz0nc2VwYXJhdG9yJz4iOwogICAgICAgICAgICAgICAgJGh0bWwgLj0gIjwvb3B0aW9uPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoISRwYXJhbXNbIm11bHRpc2VsZWN0Il0gfHwgJF92YWx1ZSAhPSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2R1bXAoIiEhISEiKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkX192YWx1ZSk7CiAgICAgICAgICAgICAgICAvLyB2dWJlYyBuZXZpbSwgcHJvOWMgdG9obGUgdHUgbWFtLCBhbGUgdnlwYWRhIHRvLCB6ZSBqZSB0byBhYnkgbmFzZWwgYWxlc3BvbiBqZWRudSBob2Rub3R1LCBwb2t1ZCBzZSB6bWVuaSBtdWx0aXNlbGVjdCBuYSBjb2tvbGkgamluZWhvCiAgICAgICAgICAgICAgICBmb3JlYWNoKGV4cGxvZGVMaXN0KCRfX3ZhbHVlLCAkcGFyYW1zWyJtdWx0aXNlbGVjdEpvaW5TZXBhcmF0b3IiXSkgYXMgJHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaHRtbF9lbnRpdHlfZGVjb2RlKHRvU3RyaW5nKCRfdmFsdWUpKSA9PSB0b1N0cmluZygkdmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgiKioqIik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChodG1sX2VudGl0eV9kZWNvZGUodG9TdHJpbmcoJF92YWx1ZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHRvU3RyaW5nKCR2YWwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kdW1wKCIvLy8iKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdGhpcy0+aWQpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRzZWxlY3RlZCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vaWYgKCEkcGFyYW1zWyJtdWx0aXNlbGVjdCJdIHx8IHRvU3RyaW5nKCRfdmFsdWUpKQogICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgJGh0bWwgLj0gIjxvcHRpb24gdmFsdWU9JyIudG9TdHJpbmcoJF92YWx1ZSkuIicgIi4oJHNlbGVjdGVkID8gInNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIpLiIgZGF0YS1sYWJlbD0nIi5faHRtbGVudGl0aWVzKCRfbGFiZWwpLiInIGRhdGEtdGV4dD0nIi5faHRtbGVudGl0aWVzKCRfdGV4dCkuIicgZGF0YT0nIi5faHRtbGVudGl0aWVzKCRfZGF0YSkuIicgIi4oJGhpZGRlbiA/ICJjbGFzcz0naGlkZGVuJyAiIDogIiIpLiIgZGF0YS1zdHlsZT0nIi4kcGFyYW1zWyJpdGVtU3R5bGUiXS4iJz4iOwogICAgICAgICAgICAgICAgICAgIC8vJGh0bWwgLj0gX2h0bWxlbnRpdGllcygoJF90ZXh0ID8gJF90ZXh0IDogIiZuYnNwOyIpKTsKICAgICAgICAgICAgICAgICAgICAkaHRtbCAuPSBfaHRtbGVudGl0aWVzKHN0cmlwX3RhZ3MoJF90ZXh0KSk7CiAgICAgICAgICAgICAgICAgICAgJGh0bWwgLj0gIjwvb3B0aW9uPiI7CiAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGhhc0dyb3VwICYmICRpID09IGNvdW50KCR0aGlzLT52YWx1ZXMpLTEpCiAgICAgICAgICAgICAgICAkaHRtbCAuPSAiPC9vcHRncm91cD4iOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCRwYXJhbXNbIm11bHRpc2VsZWN0Il0pOwogICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+dmFsdWVzKTsKCiAgICAgICAgJF92YWx1ZXMgPSAkdGhpcy0+dmFsdWVzOwogICAgICAgIGZvcmVhY2goJF92YWx1ZXMgYXMgJGtleSA9PiAkX3ZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX3ZhbCkpCiAgICAgICAgICAgICAgICAkX3ZhbHVlc1ska2V5XSA9IFRKU09OOjplbmNvZGUoJF92YWwpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkbXVsdGlzZWxlY3RBbGxGb3VuZCA9IHRydWU7CiAgICAgICAgaWYgKCRwYXJhbXNbIm11bHRpc2VsZWN0Il0gfHwgJHBhcmFtc1sibXVsdGlzZWxlY3RKb2luVmFsdWVzIl0pCiAgICAgICAgewogICAgICAgICAgICAkX3ZhbHVlczIgPSBleHBsb2RlTGlzdCgkdmFsdWUsICRwYXJhbXNbIm11bHRpc2VsZWN0Sm9pblNlcGFyYXRvciJdKTsKICAgICAgICAgICAgZm9yZWFjaCgkX3ZhbHVlczIgYXMgJF92YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRfdmFsdWUpKQogICAgICAgICAgICAgICAgICAgICRfdmFsdWUgPSBUSlNPTjo6ZW5jb2RlKCRfdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkX3ZhbHVlLCAkX3ZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgJG11bHRpc2VsZWN0QWxsRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgICAgICAvLyBrdnVsaSB2YWx1ZT17cGhwOiAuLi4ufQogICAgICAgICAgICAkdmFsdWUgPSBpbXBsb2RlTGlzdCgkdmFsdWUsICRwYXJhbXNbIm11bHRpc2VsZWN0Sm9pblNlcGFyYXRvciJdKTsKICAgICAgICB9CiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy9kdW1wKCRfdmFsdWVzKTsKICAgICAgICAKICAgICAgICAvKgogICAgICAgIGlmICghJG11bHRpc2VsZWN0QWxsRm91bmQgJiYgJHBhcmFtc1sidW5rbm93biJdICE9PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgICRfdmFsdWUgPSBleHBsb2RlTGlzdCgkdmFsdWUpOwogICAgICAgICAgICBmb3JlYWNoKCRfdmFsdWUgYXMgJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGh0bWwgLj0gIjxvcHRpb24gdmFsdWU9JyIudG9TdHJpbmcoJF92YWwpLiInIHNlbGVjdGVkPSdzZWxlY3RlZCcgbGFiZWw9JyIuX2h0bWxlbnRpdGllcygkX3ZhbCkuIicgPiI7CiAgICAgICAgICAgICAgICAkaHRtbCAuPSBfaHRtbGVudGl0aWVzKCRfdmFsKTsKICAgICAgICAgICAgICAgICRodG1sIC49ICI8L29wdGlvbj4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtdWx0aXNlbGVjdEFsbEZvdW5kID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGR1bXAoJHRoaXMtPm5hbWUpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zWyJtdWx0aXNlbGVjdCJdKTsKICAgICAgICBkdW1wKCRtdWx0aXNlbGVjdEFsbEZvdW5kKTsKICAgICAgICBkdW1wKCR2YWx1ZSk7CiAgICAgICAgZHVtcCgkdGhpcy0+dmFsdWVzKTsKICAgICAgICBkdW1wKCRwYXJhbXNbInVua25vd24iXSk7CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICAkX3ZhbHVlID0gJHZhbHVlOwogICAgICAgIGlmIChpc19hcnJheSgkX3ZhbHVlKSkKICAgICAgICAgICAgJF92YWx1ZSA9IFRKU09OOjplbmNvZGUoJF92YWx1ZSk7CiAgICAgICAgICAgIAogICAgICAgIC8vZHVtcCgiISEhISEhISIpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+bmFtZSk7CiAgICAgICAgLy9kdW1wKCRtdWx0aXNlbGVjdEFsbEZvdW5kKTsKICAgICAgICAvL2R1bXAoJF92YWx1ZSk7CiAgICAgICAgLy9kdW1wKCRfdmFsdWVzKTsKICAgICAgICAvL2R1bXAoJHBhcmFtc1sidW5rbm93biJdKTsKICAgICAgICAvL2R1bXAoJHBhcmFtc1sibXVsdGlzZWxlY3QiXSk7CiAgICAgICAgLy9kdW1wKCRwYXJhbXNbIm11bHRpc2VsZWN0Sm9pblZhbHVlcyJdKTsKICAgICAgICAKICAgICAgICAvLyBkdWxleml0YSBwb2RtaW5rYSwga29udHJvbG92YXQgamVuIGplZG5vdGxpdmUgaG9kbm90eSAgICAgPT09ICAgIHN0cnBvcygkX3ZhbHVlLCAifCIpID09PSBGQUxTRQogICAgICAgIGlmICgoISRwYXJhbXNbIm11bHRpc2VsZWN0Il0gfHwgISRtdWx0aXNlbGVjdEFsbEZvdW5kKSAmJiAkX3ZhbHVlICYmIHN0cnBvcygkX3ZhbHVlLCAifCIpID09PSBGQUxTRSAmJiAhaW5fYXJyYXkoJF92YWx1ZSwgJF92YWx1ZXMpICYmICRwYXJhbXNbInVua25vd24iXSAhPT0gZmFsc2UgfHwgKCRwYXJhbXNbIm11bHRpc2VsZWN0Il0gJiYgJHBhcmFtc1sibXVsdGlzZWxlY3RKb2luVmFsdWVzIl0pKQogICAgICAgIHsKICAgICAgICAgICAgJGh0bWwgLj0gIjxvcHRpb24gdmFsdWU9JyIudG9TdHJpbmcoJF92YWx1ZSkuIicgc2VsZWN0ZWQ9J3NlbGVjdGVkJyAiLigkcGFyYW1zWyJ1bmtub3duIl0gPyAiIiA6ICJlZGl0YWJsZT0ndHJ1ZSciKS4iIGRhdGEtbGFiZWw9JyIuX2h0bWxlbnRpdGllcygkX3ZhbHVlKS4iJyBkYXRhLXN0eWxlPSciLiRwYXJhbXNbIml0ZW1TdHlsZSJdLiInPiI7CiAgICAgICAgICAgICRodG1sIC49IF9odG1sZW50aXRpZXMoJF92YWx1ZSk7CiAgICAgICAgICAgICRodG1sIC49ICI8L29wdGlvbj4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBvbkdldERCVmFsdWUoJiRiZWZvcmVSZWNvcmRWYWx1ZXMsICYkYWZ0ZXJSZWNvcmRWYWx1ZXMpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbIm11bHRpc2VsZWN0Il0pCiAgICAgICAgICAgICRiZWZvcmVSZWNvcmRWYWx1ZXNbJHRoaXMtPm5hbWVdID0gaW1wbG9kZUxpc3QoJGJlZm9yZVJlY29yZFZhbHVlc1skdGhpcy0+bmFtZV0pOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4ocGFyZW50OjpvbkdldERCVmFsdWUoJGJlZm9yZVJlY29yZFZhbHVlcywgJGFmdGVyUmVjb3JkVmFsdWVzKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0RGlzcGxheVZhbHVlKCRyZWNvcmRWYWx1ZXMpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmdldFZhbHVlKCRyZWNvcmRWYWx1ZXMpOwogICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgIC8vZHVtcCgkcmVjb3JkVmFsdWVzKTsKICAgICAgICAkdmFsdWVzID0gZXhwbG9kZUxpc3QoJHZhbHVlKTsKICAgICAgICAKICAgICAgICAKICAgICAgICAvL2R1bXAoJHRoaXMtPnBhcmFtcyk7CiAgICAgICAgJHRoaXMtPnBhcmFtcyA9ICR0aGlzLT5sb2FkUGFyYW1zKCR0aGlzLT5wYXJhbXMsICR2YWx1ZSk7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCR0aGlzLT5wYXJhbXNbInNlcGFyYXRvciJdKTsKICAgICAgICAkdGhpcy0+dmFsdWVzID0gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidmFsdWVzIl0pOwogICAgICAgICR0aGlzLT50ZXh0cyA9ICgkdGhpcy0+cGFyYW1zWyJ0ZXh0cyJdID8gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidGV4dHMiXSkgOiAkdGhpcy0+dmFsdWVzKTsKICAgICAgICAkdGhpcy0+bGFiZWxzID0gKCR0aGlzLT5wYXJhbXNbImxhYmVscyJdID8gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sibGFiZWxzIl0pIDogJHRoaXMtPnRleHRzKTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHRoaXMtPkZpZWxkLT5pZCk7CiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy9kdW1wKCRyZWNvcmRWYWx1ZXMpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+dmFsdWVzKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPnRleHRzKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPmxhYmVscyk7CiAgICAgICAgLy9kdW1wKCR2YWx1ZXMpOwogICAgICAgICRfdGV4dHMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAkZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCR0aGlzLT52YWx1ZXMpIDsgJGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKCR0aGlzLT52YWx1ZXNbJGldKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWx1ZXNbJGldID09ICR2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAodHJhbnNsYXRlKCIwICIpKTsKICAgICAgICAgICAgICAgICAgICAkX3RleHRzW10gPSAoJHRoaXMtPnBhcmFtc1sidHJhbnNsYXRlIl0gIT09IGZhbHNlIHx8IHN0cnBvcygkdGhpcy0+bGFiZWxzWyRpXSwgIl9UKCIpICE9PSBGQUxTRSA/IHRyYW5zbGF0ZSgkdGhpcy0+bGFiZWxzWyRpXSkgOiAkdGhpcy0+bGFiZWxzWyRpXSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJ4Iik7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXNbInRyYW5zbGF0ZSJdICE9PSBmYWxzZSB8fCBzdHJwb3MoJHRoaXMtPmxhYmVsc1skaV0sICJfVCgiKSAhPT0gRkFMU0UpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCh0cmFuc2xhdGUoJHRoaXMtPmxhYmVsc1skaV0pKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJF90ZXh0cyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISRmb3VuZCkKICAgICAgICAgICAgICAgICRfdGV4dHNbXSA9ICgkdGhpcy0+cGFyYW1zWyJ0cmFuc2xhdGUiXSAhPT0gZmFsc2UgPyB0cmFuc2xhdGUoJHZhbHVlKSA6ICR2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgkX3RleHRzKTsKCiAgICAgICAgLy9kdW1wKGltcGxvZGUoJHRoaXMtPnBhcmFtc1sic2VwYXJhdG9yIl0sICRfdGV4dHMpKTsKICAgICAgICByZXR1cm4oaW1wbG9kZSgkdGhpcy0+cGFyYW1zWyJzZXBhcmF0b3IiXSwgJF90ZXh0cykpOwogICAgfSAgICAKCiAgICBmdW5jdGlvbiBsb2FkUGFyYW1zKCRwYXJhbXMsICR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoISRwYXJhbXNbInNlcGFyYXRvciJdKQogICAgICAgICAgICAkcGFyYW1zWyJzZXBhcmF0b3IiXSA9ICIsICI7CgogICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRUZXN0UGFyYW1zKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAkcGFyYW1zID0gYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgICAgICJ2YWx1ZSIgPT4gInZhbHVlMSIsCiAgICAgICAgICAgICJ2YWx1ZXMiID0+ICJ8dmFsdWUxfHZhbHVlMnx2YWx1ZTN8dmFsdWU0IiwKICAgICAgICAgICAgInRleHRzIiA9PiAifHRleHQxfHRleHQyfHRleHQzfHRleHQ0IiwKICAgICAgICAgICAgImxhYmVscyIgPT4gInxsYWJlbCBmb3IgdGV4dDF8bGFiZWwgZm9yIHRleHQyfGxhYmVsIGZvciB0ZXh0M3xsYWJlbCBmb3IgdGV4dDQiLAogICAgICAgICksICRwYXJhbXMpOwogICAgICAgIAogICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgIH0KfQo=ZnVuY3Rpb24gVENoZWNrQm94KHBhcmFtcywgaWQpICAgCnsKICAgIGlmICghaWQpCiAgICAgICAgaWQgPSBVVUlEKCk7CiAgICAgICAgCiAgICB0aGlzLlRISVMgPSB0aGlzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAKICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsKICAgIGFkZE9iamVjdCh0aGlzKTsKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUQ2hlY2tCb3gsIFRDb21wb25lbnQpOwoKVENoZWNrQm94LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMucGFyZW50X2NyZWF0ZSgpOwogICAgCiAgICAvL2R1bXAodGhpcy5lbGVtZW50KTsKICAgIC8vZHVtcCh0aGlzLnBhcmFtc1sidmFsdWVzIl0pOwogICAgaWYgKHR5cGVvZih0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMucGFyYW1zWyJ2YWx1ZXMiXVsxXSA9ICIiOwogICAgCiAgICBpZiAodGhpcy5lbGVtZW50LmNoZWNrZWQpCiAgICAgICAgdmFsdWUgPSB0aGlzLnBhcmFtc1sidmFsdWVzIl1bMF07CiAgICBlbHNlCiAgICAgICAgdmFsdWUgPSB0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV07CiAgICAKICAgIHRoaXMuZWxlbWVudC5vYmplY3QgPSB0aGlzOwogICAgCiAgICAvL3RoaXMuY2hlY2tib3ggPSBjcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgdGhpcy5jaGVja2JveCA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIGNvcHlFbGVtZW50UHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHRoaXMuY2hlY2tib3gsIFsiY3NzIiwiYXR0ciJdLCBbInR5cGUiXSk7CiAgICAvLyBXSFkgVFlQRSBURVhUPz8/CiAgICAvL3RoaXMuY2hlY2tib3gudHlwZSA9ICd0ZXh0JzsKICAgIC8vdGhpcy5jaGVja2JveC50eXBlID0gJyc7CiAgICB0aGlzLmNoZWNrYm94LnNldEF0dHJpYnV0ZSgidHlwZSIsICIiKTsKICAgIC8vdGhpcy5jaGVja2JveCA9IGNoYW5nZUF0dHJpYnV0ZSh0aGlzLmNoZWNrYm94LCAidHlwZSIsICdjdXN0b20nKTsgLy8gSUUgRWRnZQogICAgdGhpcy5jaGVja2JveC5jbGFzc05hbWUgPSB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lOwogICAgCiAgICAvLyBQUk9DPz8/PyBjaGNpIG1pdCBuYXN0eWxvdmFuZSAqW3JlYWRvbmx5XSBwcnZreSwgY28gbWFqaSBieXQgcmVhZG9ubHkgYSBuZSBjaGVja2JveHkgamFrbyB2eWNob3ppCiAgICAvL3RoaXMuY2hlY2tib3guc2V0QXR0cmlidXRlKCJyZWFkb25seSIsICJyZWFkb25seSIpOwogICAgCiAgICB0aGlzLmNoZWNrYm94Lm5hbWUgPSAnJzsKICAgIHRoaXMuY2hlY2tib3gudmFsdWUgPSAnJzsKICAgIC8vdGhpcy5jaGVja2JveC52YWx1ZSA9IHZhbHVlOwogICAgdGhpcy5jaGVja2JveC5pZCA9ICcnOwogICAgdGhpcy5jaGVja2JveC5vYmplY3QgPSB0aGlzOwogICAgaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgdGhpcy5jaGVja2JveCk7CiAgICAKICAgIGlmICghdGhpcy5wYXJhbXNbImNoZWNrZWRDbGFzcyJdKQogICAgICAgIHRoaXMucGFyYW1zWyJjaGVja2VkQ2xhc3MiXSA9ICJjaGVja2VkIjsKICAgIGlmICghdGhpcy5wYXJhbXNbInVuY2hlY2tlZENsYXNzIl0pCiAgICAgICAgdGhpcy5wYXJhbXNbInVuY2hlY2tlZENsYXNzIl0gPSAidW5jaGVja2VkIjsKCiAgICBpZiAodGhpcy5wYXJhbXNbImRpc3BsYXkiXSA9PSAiYnV0dG9uIikgIC8vIFRPRE8gYWN0IGFzIGEgY2hlY2thYmxlIDxidXR0b24+PC9idXR0b24+CiAgICB7CiAgICAgICAgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy90aGlzLmJ1dHRvbiA9IGNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICAgICAgLy90aGlzLmJ1dHRvbi50eXBlID0gJ2J1dHRvbic7CiAgICAgICAgdGhpcy5idXR0b24gPSBjcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgdGhpcy5idXR0b24uY2xhc3NOYW1lID0gJ2J1dHRvbic7CiAgICAgICAgdGhpcy5idXR0b24ub2JqZWN0ID0gdGhpczsKICAgICAgICBpbnNlcnRBZnRlcih0aGlzLmNoZWNrYm94LCB0aGlzLmJ1dHRvbik7CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5uZXh0U2libGluZyAmJiB0aGlzLmVsZW1lbnQubmV4dFNpYmxpbmcudGFnTmFtZSA9PSAiTEFCRUwiKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuZWxlbWVudC5uZXh0U2libGluZzsKICAgICAgICAgICAgdGhpcy5idXR0b24uc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRoaXMubGFiZWwuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKTsKICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgdGhpcy5sYWJlbCk7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMucHVzaCh0aGlzLmxhYmVsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJhbXNbImxhYmVsRWxlbWVudCJdKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgY2FsbChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgX3RoaXMubGFiZWwgPSBnZXRFbGVtZW50KF90aGlzLnBhcmFtc1sibGFiZWxFbGVtZW50Il0pOwogICAgICAgICAgICAgICAgX3RoaXMuYnV0dG9uLnNldEF0dHJpYnV0ZSgidGl0bGUiLCBfdGhpcy5sYWJlbC5nZXRBdHRyaWJ1dGUoInRpdGxlIikpOwogICAgICAgICAgICAgICAgX3RoaXMuZWxlbWVudHMucHVzaChfdGhpcy5sYWJlbCk7CiAgICAgICAgICAgIH0sIHRydWUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBjYWxsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgibGFiZWwiKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbXNbaV0uZ2V0QXR0cmlidXRlKCJmb3IiKSA9PSBfdGhpcy5pZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmxhYmVsID0gZWxlbXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5lbGVtZW50LmNoZWNrZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUoX3RoaXMubGFiZWwsIF90aGlzLnBhcmFtc1siY2hlY2tlZENsYXNzIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZWxlbWVudHMucHVzaCh0aGlzLmxhYmVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICAgICAgX3RoaXMuX2RyYXcoKTsKICAgICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIAogICAgdGhpcy5lbGVtZW50cy5wdXNoKHRoaXMuZWxlbWVudCk7CiAgICB0aGlzLmVsZW1lbnRzLnB1c2godGhpcy5jaGVja2JveCk7CiAgICB0aGlzLmVsZW1lbnRzLnB1c2godGhpcy5idXR0b24pOwoKICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiIjsKICAgIGlmICh0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pCiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgdGhpcy5lbGVtZW50ID0gY2hhbmdlQXR0cmlidXRlKHRoaXMuZWxlbWVudCwgInR5cGUiLCAiaGlkZGVuIik7CiAgICAgICAgLy90aGlzLmVsZW1lbnQudHlwZSA9ICdoaWRkZW4nOwogICAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHZhbHVlOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfQogICAgCiAgICAvL2R1bXAodGhpcy5wYXJhbXMpOwogICAgLy9kdW1wKHRoaXMuY2hlY2tib3gpOwogICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAvL2R1bXAodGhpcy5lbGVtZW50Lm9iamVjdCk7CiAgICBpZiAoIXRoaXMucGFyYW1zWyJyZWFkb25seSJdKQogICAgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgIC8vIGNoZWNrYm94IGFscmVhZHkgaGFzIGV2ZW50IGZyb20gVENvbXBvbmVudCAtIHVwZGF0ZWQ6IGRvZXMgbm90IGhhdmUgOi8KICAgICAgICBhZGRFdmVudCh0aGlzLmNoZWNrYm94LCAiY2xpY2siLCBmdW5jdGlvbihlKXtlPWdldEV2ZW50KGUpO2Uuc3RvcCgpO190aGlzLl9vbkNsaWNrKCl9KTsKICAgICAgICAKICAgICAgICBhZGRFdmVudCh0aGlzLmJ1dHRvbiwgImNsaWNrIiwgZnVuY3Rpb24oZSl7ZT1nZXRFdmVudChlKTtlLnN0b3AoKTtfdGhpcy5fb25DbGljaygpfSk7CiAgICAgICAgLy9hZGRFdmVudCh0aGlzLmJ1dHRvbiwgImNsaWNrIiwgZnVuY3Rpb24oZSl7ZT1nZXRFdmVudChlKTtfdGhpcy5fb25DbGljaygpfSk7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudCk7CiAgICAgICAgLy9kdW1wKHRoaXMuY29udGFpbmVyKTsKICAgICAgICAKICAgICAgICBjYWxsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmIChfdGhpcy5sYWJlbCkKICAgICAgICAgICAgICAgIGFkZEV2ZW50KF90aGlzLmxhYmVsLCAiY2xpY2siLCBmdW5jdGlvbihlKXtlPWdldEV2ZW50KGUpO2lmIChlLnRhcmdldC50YWdOYW1lICE9ICJBIikge2Uuc3RvcCgpO190aGlzLl9vbkNsaWNrKCl9fSk7CiAgICAgICAgfSwgdHJ1ZSk7CiAgICB9CiAgICAKICAgIHRoaXMuX2RyYXcoKTsKfQoKVENoZWNrQm94LnByb3RvdHlwZS5fZHJhdyA9IGZ1bmN0aW9uKCkKewogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuY2hlY2tib3gsIHRoaXMucGFyYW1zWyJjaGVja2VkQ2xhc3MiXSk7CiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5jaGVja2JveCwgdGhpcy5wYXJhbXNbInVuY2hlY2tlZENsYXNzIl0pOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuY2hlY2tib3gsICJjaGVja2VkIik7CiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5jaGVja2JveCwgInVuY2hlY2tlZCIpOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCB0aGlzLnBhcmFtc1siY2hlY2tlZENsYXNzIl0pOwogICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCB0aGlzLnBhcmFtc1sidW5jaGVja2VkQ2xhc3MiXSk7CiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5idXR0b24sICJjaGVja2VkIik7CiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5idXR0b24sICJ1bmNoZWNrZWQiKTsKICAgIGlmICh0aGlzLmxhYmVsKQogICAgewogICAgICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmxhYmVsLCB0aGlzLnBhcmFtc1siY2hlY2tlZENsYXNzIl0pOwogICAgICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmxhYmVsLCB0aGlzLnBhcmFtc1sidW5jaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMubGFiZWwsICJjaGVja2VkIik7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMubGFiZWwsICJ1bmNoZWNrZWQiKTsKICAgIH0KICAgIC8vYWxlcnQodGhpcy5lbGVtZW50LnZhbHVlKTsKICAgIC8vYWxlcnQodGhpcy5wYXJhbXNbInZhbHVlcyJdWzBdKTsKICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQudmFsdWUpCiAgICAvL2R1bXAodGhpcy5wYXJhbXNbInZhbHVlcyJdKQogICAgaWYgKHRoaXMucGFyYW1zWyJ2YWx1ZXMiXVsxXSkKICAgIHsKICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50Lm5hbWUpOwogICAgICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQudmFsdWUpOwogICAgICAgIC8vZHVtcCh0aGlzLnBhcmFtc1sidmFsdWVzIl1bMF0pOwogICAgICAgIC8vZHVtcCh0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pOwogICAgICAgIGlmICh0aGlzLmVsZW1lbnQudmFsdWUgPT0gdGhpcy5wYXJhbXNbInZhbHVlcyJdWzBdKQogICAgICAgIHsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuY2hlY2tib3gsIHRoaXMucGFyYW1zWyJjaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgdGhpcy5wYXJhbXNbImNoZWNrZWRDbGFzcyJdKTsKICAgICAgICAgICAgaWYgKHRoaXMubGFiZWwpCiAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5sYWJlbCwgdGhpcy5wYXJhbXNbImNoZWNrZWRDbGFzcyJdKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuY2hlY2tib3gsIHRoaXMucGFyYW1zWyJ1bmNoZWNrZWRDbGFzcyJdKTsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCB0aGlzLnBhcmFtc1sidW5jaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsKQogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMubGFiZWwsIHRoaXMucGFyYW1zWyJ1bmNoZWNrZWRDbGFzcyJdKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7ICAgCiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC52YWx1ZSA9PSAiL2luc3RhbGwvIikKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQudmFsdWUpOwogICAgICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50LmNoZWNrZWQpOwogICAgICAgICAgICAvL2R1bXAodGhpcy5wYXJhbXNbImNoZWNrZWRDbGFzcyJdKTsKICAgICAgICAgICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY2hlY2tlZCkKICAgICAgICB7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmNoZWNrYm94LCB0aGlzLnBhcmFtc1siY2hlY2tlZENsYXNzIl0pOwogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5idXR0b24sIHRoaXMucGFyYW1zWyJjaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsKQogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMubGFiZWwsIHRoaXMucGFyYW1zWyJjaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmNoZWNrYm94LCB0aGlzLnBhcmFtc1sidW5jaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgdGhpcy5wYXJhbXNbInVuY2hlY2tlZENsYXNzIl0pOwogICAgICAgICAgICBpZiAodGhpcy5sYWJlbCkKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmxhYmVsLCB0aGlzLnBhcmFtc1sidW5jaGVja2VkQ2xhc3MiXSk7CiAgICAgICAgfQogICAgfQp9Ci8qClRDaGVja0JveC5wcm90b3R5cGUuX2RyYXcgPSBmdW5jdGlvbigpCnsKICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgImNoZWNrZWQiKTsKICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgInVuY2hlY2tlZCIpOwogICAgaWYgKHRoaXMubGFiZWwpCiAgICB7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMubGFiZWwsICJjaGVja2VkIik7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMubGFiZWwsICJ1bmNoZWNrZWQiKTsKICAgIH0KICAgIC8vYWxlcnQodGhpcy5lbGVtZW50LnZhbHVlKTsKICAgIC8vYWxlcnQodGhpcy5wYXJhbXNbInZhbHVlcyJdWzBdKTsKICAgIGlmICh0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pCiAgICB7CiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC52YWx1ZSA9PSB0aGlzLnBhcmFtc1sidmFsdWVzIl1bMF0pCiAgICAgICAgewogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5idXR0b24sICJjaGVja2VkIik7CiAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsKQogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMubGFiZWwsICJjaGVja2VkIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgInVuY2hlY2tlZCIpOwogICAgICAgICAgICBpZiAodGhpcy5sYWJlbCkKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmxhYmVsLCAidW5jaGVja2VkIik7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgeyAgIAogICAgICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQuY2hlY2tlZCk7CiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jaGVja2VkKQogICAgICAgIHsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiY2hlY2tlZCIpOwogICAgICAgICAgICBpZiAodGhpcy5sYWJlbCkKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmxhYmVsLCAiY2hlY2tlZCIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5idXR0b24sICJ1bmNoZWNrZWQiKTsKICAgICAgICAgICAgaWYgKHRoaXMubGFiZWwpCiAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5sYWJlbCwgInVuY2hlY2tlZCIpOwogICAgICAgIH0KICAgICAgICAvL2R1bXAodGhpcy5idXR0b24pOwogICAgfQp9CiovCgpUQ2hlY2tCb3gucHJvdG90eXBlLl9vbkNsaWNrID0gZnVuY3Rpb24ocmF3KQp7CiAgICAvL2R1bXAoIlRDaGVja0JveDo6X29uQ2xpY2soKSIpOwogICAgCiAgICBpZiAoIXJhdyAmJiAhdGhpcy5nZXRFbmFibGVkKCkpCiAgICAgICAgcmV0dXJuOwoKICAgIC8vZHVtcCgnY2xpY2snKTsKICAgIC8vZHVtcChnZXRGdW5jdGlvbkNhbGwoKSk7CiAgICBpZiAodGhpcy5wYXJhbXNbInZhbHVlcyJdWzFdKQogICAgewogICAgICAgIGlmICh0aGlzLmVsZW1lbnQudmFsdWUgPT0gdGhpcy5wYXJhbXNbInZhbHVlcyJdWzBdKQogICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV07CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLnBhcmFtc1sidmFsdWVzIl1bMF07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudC5jaGVja2VkKTsKICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNoZWNrZWQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2hlY2tlZCA9IGZhbHNlOyAvLyBGRgogICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jaGVja2VkID0gdHJ1ZTsgIC8vIEZGCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCAiY2hlY2tlZCIpOwogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQpOwogICAgdGhpcy5fZHJhdygpOwogICAgaWYgKCFyYXcpCiAgICB7CiAgICAgICAgdGhpcy5vbkNsaWNrKGNyZWF0ZUV2ZW50KCkpOyAgICAKICAgIH0KICAgIC8vZHVtcCh0aGlzLm9uQ2hhbmdlKTsKICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQuY2hlY2tlZCk7CiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAKICAgIGlmICghdGhpcy5fX2NhbGxFdmVudEZpcnN0Q2FsbCkKICAgICAgICB0aGlzLl9fY2FsbEV2ZW50Rmlyc3RDYWxsID0gdHJ1ZTsKICAgIGVsc2UKICAgICAgICBjYWxsRXZlbnQodGhpcy5jaGVja2JveCwgImNoYW5nZSIpOwp9CgpUQ2hlY2tCb3gucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIAogICAgdmFyIF92YWx1ZSA9IHZhbHVlOwogICAgaWYgKF92YWx1ZSA9PT0gdHJ1ZSkKICAgICAgICBfdmFsdWUgPSAidHJ1ZSI7CiAgICBpZiAoX3ZhbHVlID09PSBmYWxzZSkKICAgICAgICBfdmFsdWUgPSAiZmFsc2UiOwoKICAgIHZhciBfdmFsdWUyID0gdGhpcy5wYXJhbXNbInZhbHVlcyJdWzBdOwogICAgaWYgKF92YWx1ZTIgPT09IHRydWUpCiAgICAgICAgX3ZhbHVlMiA9ICJ0cnVlIjsKICAgIGlmIChfdmFsdWUyID09PSBmYWxzZSkKICAgICAgICBfdmFsdWUyID0gImZhbHNlIjsKCiAgICAvL2R1bXAodGhpcy5wYXJhbXNbInZhbHVlcyJdKTsKICAgIC8vaWYgKHR5cGVvZih0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pICE9ICJ1bmRlZmluZWQiKQogICAgaWYgKHRoaXMucGFyYW1zWyJ2YWx1ZXMiXVsxXSkKICAgIHsKICAgICAgICAvL2R1bXAoX3ZhbHVlKTsKICAgICAgICAvL2R1bXAoX3ZhbHVlMik7CiAgICAgICAgLy9kdW1wKHRoaXMucGFyYW1zWyJ2YWx1ZXMiXSk7CiAgICAgICAgLy9pZiAoX3ZhbHVlID09IF92YWx1ZTIpCiAgICAgICAgLy8gICAgdGhpcy5wYXJlbnRfc2V0VmFsdWUodGhpcy5wYXJhbXNbInZhbHVlcyJdWzFdKTsgIC8vIHNldCByZXZlcnNlCiAgICAgICAgLy9lbHNlCiAgICAgICAgLy8gICAgdGhpcy5wYXJlbnRfc2V0VmFsdWUodGhpcy5wYXJhbXNbInZhbHVlcyJdWzBdKTsgIC8vIHNldCByZXZlcnNlCgogICAgICAgIGlmIChfdmFsdWUgPT0gX3ZhbHVlMikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMucGFyZW50X3NldFZhbHVlKHRoaXMucGFyYW1zWyJ2YWx1ZXMiXVswXSk7CiAgICAgICAgICAgIC8vdGhpcy5lbGVtZW50LmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudF9zZXRWYWx1ZSh0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pOwogICAgICAgICAgICAvL3RoaXMuZWxlbWVudC5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvL3RoaXMuX29uQ2xpY2soKTsKICAgIH0KICAgIGVsc2UKICAgIHsgICAgCiAgICAgICAgLy9kdW1wKCItLS0tIik7CiAgICAgICAgLy9kdW1wKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgLy9kdW1wKF92YWx1ZSk7CiAgICAgICAgLy9kdW1wKF92YWx1ZTIpOwogICAgICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQuY2hlY2tlZCk7CiAgICAgICAgLy9kdW1wKF92YWx1ZSA9PSBfdmFsdWUyKTsKCiAgICAgICAgaWYgKF92YWx1ZSA9PSBfdmFsdWUyKQogICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2hlY2tlZCA9IHRydWU7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2hlY2tlZCA9IGZhbHNlOwoKICAgICAgICAvL2R1bXAodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICAvL2R1bXAodGhpcy5lbGVtZW50LmNoZWNrZWQpOwogICAgICAgIAogICAgICAgIC8vIGNhbGwgaXQgdHdpY2UgdG8gY2FsbCBldmVudHMsIGJ1dCBvbkNsaWNrIGRvZXMgYSByZXZlcnQKICAgICAgICAvL3RoaXMuX29uQ2xpY2soKTsKICAgICAgICAvL3RoaXMuX29uQ2xpY2soKTsKCiAgICAgICAgLy9kdW1wKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgLy9kdW1wKHRoaXMuZWxlbWVudC5jaGVja2VkKTsKICAgIH0KICAgIAogICAgdGhpcy5fZHJhdygpOwoKICAgIC8vZHVtcCh0aGlzLm9uQ2hhbmdlKTsKICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQuY2hlY2tlZCk7CiAgICBpZiAob2xkVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKQogICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5nZXRWYWx1ZSgpKTsKICAgIAogICAgaWYgKCF0aGlzLl9fY2FsbEV2ZW50Rmlyc3RDYWxsKQogICAgICAgIHRoaXMuX19jYWxsRXZlbnRGaXJzdENhbGwgPSB0cnVlOwogICAgZWxzZQogICAgICAgIGNhbGxFdmVudCh0aGlzLmNoZWNrYm94LCAiY2hhbmdlIik7CiAgICAgICAgCiAgICAvL2lmIChvbGRWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpCiAgICAvLyAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0VmFsdWUoKSk7Cn0KICAgIApUQ2hlY2tCb3gucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24oKQp7CiAgICBpZiAodGhpcy5wYXJhbXNbInZhbHVlcyJdWzFdKQogICAgewogICAgICAgIHJldHVybih0aGlzLmVsZW1lbnQudmFsdWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY2hlY2tlZCkgICAgCiAgICAgICAgICAgIHJldHVybih0aGlzLnBhcmFtc1sidmFsdWVzIl1bMF0pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKHRoaXMucGFyYW1zWyJ2YWx1ZXMiXVsxXSk7CiAgICB9Cn0KClRDaGVja0JveC5wcm90b3R5cGUuZ2V0Q2hlY2tlZFZhbHVlID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgX3ZhbHVlMiA9IHRoaXMucGFyYW1zWyJ2YWx1ZXMiXVswXTsKICAgIGlmIChfdmFsdWUyID09PSB0cnVlKQogICAgICAgIF92YWx1ZTIgPSAidHJ1ZSI7CiAgICBpZiAoX3ZhbHVlMiA9PT0gZmFsc2UpCiAgICAgICAgX3ZhbHVlMiA9ICJmYWxzZSI7CiAgICAgICAgCiAgICByZXR1cm4oX3ZhbHVlMik7Cn0KICAgIApUQ2hlY2tCb3gucHJvdG90eXBlLmdldENoZWNrZWQgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLnBhcmFtc1sidmFsdWVzIl1bMV0pCiAgICB7CiAgICAgICAgcmV0dXJuKHRoaXMuZWxlbWVudC52YWx1ZSA9PSB0aGlzLmdldENoZWNrZWRWYWx1ZSgpKTsKICAgIH0KICAgIGVsc2UKICAgICAgICByZXR1cm4odGhpcy5lbGVtZW50LmNoZWNrZWQpOwp9CgpUQ2hlY2tCb3gucHJvdG90eXBlLnNldENoZWNrZWQgPSBmdW5jdGlvbihjaGVja2VkKQp7CiAgICAvL2R1bXAoY2hlY2tlZCk7CiAgICAvL2R1bXAodGhpcy5lbGVtZW50LmNoZWNrZWQpOwogICAgLy9hbGVydChjaGVja2VkKTsKICAgIC8vaWYgKHRoaXMuZWxlbWVudC5jaGVja2VkICE9IGNoZWNrZWQpCiAgICBpZiAodGhpcy5nZXRDaGVja2VkKCkgIT0gY2hlY2tlZCAmJiB0aGlzLmdldEVuYWJsZWQoKSkKICAgIHsKICAgICAgICB0aGlzLl9vbkNsaWNrKHRydWUpOwogICAgfQp9CgovKgpUQ2hlY2tCb3gucHJvdG90eXBlLmdldExhYmVsID0gZnVuY3Rpb24oKQp7CiAgICBpZiAoIXRoaXMubGFiZWwpCiAgICB7CiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxhYmVsIik7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldLmdldEF0dHJpYnV0ZSgiZm9yIikgPT0gdGhpcy5pZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGVsZW1zW2ldOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvL2R1bXAodGhpcy5sYWJlbCk7CiAgICByZXR1cm4odGhpcy5sYWJlbCk7Cn0KKi8KClRDaGVja0JveC5wcm90b3R5cGUudG9nZ2xlVmFsdWUgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLmdldENoZWNrZWQoKSkKICAgICAgICB0aGlzLnNldENoZWNrZWQoZmFsc2UpOwogICAgZWxzZQogICAgICAgIHRoaXMuc2V0Q2hlY2tlZCh0cnVlKTsKfQogICAgClRDaGVja0JveC5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKGVuYWJsZWQpCnsKICAgIC8vZHVtcChlbmFibGVkKTsKICAgIHRoaXMucGFyZW50X3NldEVuYWJsZWQoZW5hYmxlZCk7CiAgICAKICAgIHRoaXMuY2hlY2tib3guZGlzYWJsZWQgPSAhZW5hYmxlZDsKICAgIGlmICh0aGlzLmNoZWNrYm94LmRpc2FibGVkKQogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmNoZWNrYm94LCAiZGlzYWJsZWQiKTsKICAgIGVsc2UKICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5jaGVja2JveCwgImRpc2FibGVkIik7CiAgICAKICAgIGlmICh0aGlzLmxhYmVsKSAgICAKICAgIHsKICAgICAgICBpZiAoIWVuYWJsZWQpCiAgICAgICAgICAgIHRoaXMubGFiZWwuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICIiKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMubGFiZWwucmVtb3ZlQXR0cmlidXRlKCJkaXNhYmxlZCIpOwogICAgfQp9CgpUQ2hlY2tCb3gucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbih0ZXh0KQp7CiAgICB2YXIgdG9SZW1vdmUgPSBbXTsKICAgICAgICAKICAgIHZhciBpc1RleHQgPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMubGFiZWwuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGlzVGV4dCkKICAgICAgICAgICAgdG9SZW1vdmUucHVzaCh0aGlzLmxhYmVsLmNoaWxkTm9kZXNbaV0pOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLmxhYmVsLmNoaWxkTm9kZXNbaV0gPT0gdGhpcy5lbGVtZW50KQogICAgICAgICAgICBpc1RleHQgPSB0cnVlOwogICAgfQogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdG9SZW1vdmUubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHJlbW92ZU5vZGUodG9SZW1vdmVbaV0pOwogICAgfQogICAgCiAgICB2YXIgZHVtbXkgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGR1bW15LmlubmVySFRNTCA9IHRleHQ7CiAgICB3aGlsZSAoZHVtbXkuY2hpbGROb2Rlcy5sZW5ndGgpCiAgICB7CiAgICAgICAgdGhpcy5sYWJlbC5hcHBlbmRDaGlsZChkdW1teS5jaGlsZE5vZGVzWzBdKTsKICAgIH0KfQoKVENoZWNrQm94LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgZHVtbXkgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAKICAgIHZhciBpc1RleHQgPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMubGFiZWwuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGlzVGV4dCkKICAgICAgICAgICAgZHVtbXkuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKHRoaXMubGFiZWwuY2hpbGROb2Rlc1tpXSkpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLmxhYmVsLmNoaWxkTm9kZXNbaV0gPT0gdGhpcy5lbGVtZW50KQogICAgICAgICAgICBpc1RleHQgPSB0cnVlOwogICAgfQoKICAgIHJldHVybihkdW1teS5pbm5lckhUTUwpOwp9CgpUQ2hlY2tCb3gucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuY2hlY2tib3guc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIHRoaXMuYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Cn0KClRDaGVja0JveC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5jaGVja2JveC5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICB0aGlzLmJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIiI7Cn0KLl9DaGVja0JveCB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgLW8tYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAqYmVoYXZpb3I6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0Nyb3NzQnJvd3Nlci9ib3gtc2l6aW5nLmh0Yyk7IAogICAgCiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICM3MDcwNzA7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIAogICAgZm9udC1zaXplOiAwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5fQ2hlY2tCb3ggKyAuYnV0dG9uIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIAogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1vLWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgKmJlaGF2aW9yOnVybChpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9Dcm9zc0Jyb3dzZXIvYm94LXNpemluZy5odGMpOyAKCiAgICBib3JkZXI6IDBweDsKICAgIGJhY2tncm91bmQ6ICMyNjU2QTA7CgogICAgbWFyZ2luOiAwcHg7CiAgICBwYWRkaW5nOiAwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgCiAgICBmb250LXNpemU6IDBweDsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4OwogICAgbWFyZ2luLWxlZnQ6IC0xNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4Owp9CgovKgouX0NoZWNrQm94ICsgLmJ1dHRvbiArIGxhYmVsIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgIC8qIHRvIGVuYWJsZSBzZXQgd2lkdGggKi8KLyoKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBtYXJnaW4tbGVmdDogNnB4Owp9CiovCgouX0NoZWNrQm94ICsgLmNoZWNrZWQgewogICAgLyogZG8gbm90IHVzZSBvcGFjaXR5IDEgLSBkaXNhYmxlZCBCRyBvbiBJRTggKi8KfQoKLl9DaGVja0JveCArIC51bmNoZWNrZWQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIAogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouX0NoZWNrQm94LmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKfQoKLl9DaGVja0JveExhYmVsIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKfQouX0NoZWNrQm94ICsgLmJ1dHRvbiArIGxhYmVsIGltZyB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ2hlY2tCb3gvQ2hlY2tCb3guY2xhc3MucGhwIC0tLS0tLS0gDQoKLy8gaHR0cDovL2Nzc2RlY2suY29tL2xhYnMvY3NzLWNoZWNrYm94LXN0eWxlcwpjbGFzcyBUQ2hlY2tCb3ggZXh0ZW5kcyBUQ29tcG9uZW50CnsKICAgIHZhciAkY29udGV4dE1lbnVFbmFibGVkID0gdHJ1ZTsKICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfX2ltcGxlbWVudHMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSgiRmllbGRDb21wb25lbnQiKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvbkdldFByb3BlcnRpZXMoKQogICAgewogICAgICAgIHJldHVybihtZXJnZVByb3BlcnRpZXMocGFyZW50OjpvbkdldFByb3BlcnRpZXMoKSwgYXJyYXkoICAgICAgICAKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPUNvbW1vbixwb3NpdGlvbj1sYXN0IiwKICAgICAgICAibmFtZT1uYW1lLGNhcHRpb249TmFtZSxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249RGF0YSIsCiAgICAgICAgIm5hbWU9dmFsdWVzLGNhcHRpb249VmFsdWVzLG9iamVjdD1MaXN0RWRpdCIsCiAgICAgICAgIm5hbWU9dGV4dHMsY2FwdGlvbj1UZXh0cyxvYmplY3Q9TGlzdEVkaXQiLAogICAgICAgICJuYW1lPXJlYWRvbmx5LGNhcHRpb249UmVhZCBPbmx5LG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249TGFiZWwiLAogICAgICAgICJuYW1lPWxhYmVsLGNhcHRpb249TGFiZWwgVGV4dCxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICJuYW1lPWxhYmVsQ2xhc3MsY2FwdGlvbj1MYWJlbCBDbGFzcyxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICJuYW1lPWxhYmVsU3R5bGUsY2FwdGlvbj1MYWJlbCBTdHlsZSxvYmplY3Q9U3R5bGVFZGl0IiwKICAgICAgICAibmFtZT1sYWJlbEVsZW1lbnQsY2FwdGlvbj1MYWJlbCBFbGVtZW50LG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgIm5hbWU9dGl0bGUsY2FwdGlvbj1UaXRsZSxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249QmVoYXZpb3IsYWZ0ZXI9RGF0YSIsCiAgICAgICAgIm5hbWU9cmVhZG9ubHksY2FwdGlvbj1SZWFkIE9ubHksb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgLy8idHlwZT1ncm91cCxjYXB0aW9uPURpc3BsYXkiLAogICAgICAgIC8vIm5hbWU9ZGlzcGxheSxjYXB0aW9uPURpc3BsYXksb2JqZWN0PUNvbWJvQm94LHZhbHVlcz1jbGFzc2ljfGJ1dHRvbiIsCiAgICAgICAgKSkpOyAgICAgICAgCiAgICAgICAgLy8pLCBUUHJvcGVydHlFZGl0b3I6OmdldENTU1Byb3BlcnRpZXMoKSkpOyAgICAgICAgCiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RmllbGRJbmZvKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICByZXR1cm4oYXJyYXkoCiAgICAgICAgICAgICJkYXRhVHlwZSIgPT4gIkVOVU0iLAogICAgICAgICAgICAiZGF0YVR5cGVQYXJhbXMiID0+ICIndHJ1ZScsJ2ZhbHNlJyIsCiAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiID0+ICJmYWxzZSIsCiAgICAgICAgKSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25HZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCFoZWFkSHRtbEFkZGVkKF9fQ0xBU1NfXywgJHBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICBwYXJlbnQ6Om9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9DaGVja0JveC9DaGVja0JveC5jbGFzcy5qcyc+PC9zY3JpcHQ+Iix0cnVlKTsKICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxsaW5rIGhyZWY9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0NoZWNrQm94L0NoZWNrQm94LmNsYXNzLmNzcycgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgLz4iLHRydWUpOwogICAgICAgICAgICBhZGRFeHRlbmRpbmdIZWFkSHRtbCgkcGFyYW1zLCBfX0NMQVNTX18pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldENvbnRlbnQoJiRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnR5cGUpCiAgICAgICAgICAgICR0aGlzLT50eXBlID0gImNoZWNrYm94IjsKICAgICAgICAKICAgICAgICAvL2R1bXAoIi0tLS0tIik7CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICR0aGlzLT5nZXRIZWFkSHRtbCgkcGFyYW1zKTsKCiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgICRwYXJhbXNbInZhbHVlcyJdID0gZXhwbG9kZUxpc3QoJHBhcmFtc1sidmFsdWVzIl0pOwoKICAgICAgICBpZiAoIWlzX2FycmF5KCR2YWx1ZSkgJiYgIXRvU3RyaW5nKCR2YWx1ZSkgJiYgJHBhcmFtc1sidmFsdWUiXSkKICAgICAgICAgICAgJHZhbHVlID0gJHBhcmFtc1sidmFsdWUiXTsKICAgICAgICAKICAgICAgICAvL2R1bXAoInh4eHgiKTsgICAgICAgIAogICAgICAgIC8vZHVtcCgkcGFyYW1zWyJuYW1lIl0pOwogICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zWyJ2YWx1ZSJdKTsKICAgICAgICBpZiAoY291bnQoJHBhcmFtc1sidmFsdWVzIl0pID09IDMgJiYgJHBhcmFtc1sidmFsdWVzIl1bMF0gPT0gIiIpCiAgICAgICAgewogICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJ2YWx1ZXMiXVswXSk7CiAgICAgICAgICAgICRwYXJhbXNbInZhbHVlcyJdID0gYXJyYXlfdmFsdWVzKCRwYXJhbXNbInZhbHVlcyJdKTsKICAgICAgICB9CgogICAgICAgICRwYXJhbXNbInRleHRzIl0gPSBleHBsb2RlTGlzdCgkcGFyYW1zWyJ0ZXh0cyJdKTsKICAgICAgICBpZiAoISRwYXJhbXNbInZhbHVlcyJdKQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1sidmFsdWVzIl0gPSBhcnJheSgidHJ1ZSIsImZhbHNlIik7CiAgICAgICAgICAgIGlmICghJHBhcmFtc1sidGV4dHMiXSkKICAgICAgICAgICAgICAgICRwYXJhbXNbInRleHRzIl0gPSBhcnJheSh0cmFuc2xhdGUoInRydWUiKSx0cmFuc2xhdGUoImZhbHNlIikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkcGFyYW1zWyJ2YWx1ZXMiXVswXSwgJHZhbHVlKSkKICAgICAgICAgICAgICAgICR2YWx1ZSA9ICRwYXJhbXNbInZhbHVlcyJdWzBdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkdmFsdWUgPSAiIjsKICAgICAgICB9CgogICAgICAgIC8vZHVtcCgkcGFyYW1zWyJ2YWx1ZXMiXSk7CiAgICAgICAgJHRoaXMtPmluaXQoJHBhcmFtcyk7CiAgICAgICAgJHBhcmFtc1siY29udGFpbmVyIl0gPSAkdGhpcy0+aWQ7CgogICAgICAgICRqc1BhcmFtcyA9ICRwYXJhbXM7CiAgICAgICAgLy8kanNQYXJhbXNbInZhbHVlIl0gPSAkdmFsdWU7CiAgICAgICAgaWYgKGNvdW50KCRwYXJhbXNbInZhbHVlcyJdKSA+IDEpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJHBhcmFtc1sidmFsdWVzIl0pOwogICAgICAgICAgICAvL2R1bXAoJHBhcmFtc1sidmFsdWVzIl1bMV0pOwogICAgICAgICAgICAkaHRtbCAuPSAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nIi4kdGhpcy0+bmFtZS4iJyB2YWx1ZT1cIiIuX2h0bWxzcGVjaWFsY2hhcnMoJHBhcmFtc1sidmFsdWVzIl1bMV0pLiJcIiAvPiI7CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvL2R1bXAodG9TdHJpbmcoJHZhbHVlKSk7CiAgICAgICAgLy9kdW1wKHRvU3RyaW5nKCRwYXJhbXNbInZhbHVlcyJdWzBdKSk7CiAgICAgICAgJGF0dHJQYXJhbXMgPSAkcGFyYW1zOwogICAgICAgICRhdHRyUGFyYW1zWyJjbGFzcyJdID0gIl9DaGVja0JveCAiLiRwYXJhbXNbImNsYXNzIl07CiAgICAgICAgJGF0dHJQYXJhbXNbIm5hbWUiXSA9ICR0aGlzLT5uYW1lOwogICAgICAgICRhdHRyUGFyYW1zWyJpZCJdID0gJHRoaXMtPmlkOwogICAgICAgICRhdHRyUGFyYW1zWyJ2YWx1ZSJdID0gJHBhcmFtc1sidmFsdWVzIl1bMF07CiAgICAgICAgaWYgKGlzX2FycmF5KCRhdHRyUGFyYW1zWyJ2YWx1ZSJdKSkKICAgICAgICAgICAgJGF0dHJQYXJhbXNbInZhbHVlIl0gPSBUSlNPTjo6ZW5jb2RlKCRhdHRyUGFyYW1zWyJ2YWx1ZSJdKTsKICAgICAgICAkYXR0clBhcmFtc1sidmFsdWUiXSA9IF9odG1sc3BlY2lhbGNoYXJzKCRhdHRyUGFyYW1zWyJ2YWx1ZSJdKTsKICAgICAgICAkYXR0clBhcmFtc1sic3R5bGUiXSA9IGdldENTU1BhcmFtcygkcGFyYW1zKTsKICAgICAgICAvL2R1bXAoIiEhIik7CiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy9kdW1wKHRvU3RyaW5nKCR2YWx1ZSkpOwogICAgICAgIC8vZHVtcCh0b1N0cmluZygkcGFyYW1zWyJ2YWx1ZXMiXVswXSkpOwogICAgICAgICRhdHRyUGFyYW1zWyJjaGVja2VkIl0gPSAodG9TdHJpbmcoJHZhbHVlKSA9PSB0b1N0cmluZygkcGFyYW1zWyJ2YWx1ZXMiXVswXSkgPyAiY2hlY2tlZCIgOiAiIik7CiAgICAgICAgLy9kdW1wKCRhdHRyUGFyYW1zWyJjaGVja2VkIl0pOwogICAgICAgICRhdHRyUGFyYW1zWyJhdHRyLmRhdGEiXSA9IHRvU3RyaW5nKCRwYXJhbXNbImRhdGEiXSk7CiAgICAgICAgJGF0dHJQYXJhbXNbInJlYWRvbmx5Il0gPSAodG9Cb29sKCRwYXJhbXNbInJlYWRvbmx5Il0pID8gInJlYWRvbmx5IiA6ICIiKTsKICAgICAgICAkYXR0clBhcmFtc1siYXR0ci5fdHlwZSJdID0gKCR0aGlzLT5pbmhlcml0cygiUmFkaW9CdXR0b24iKSA/ICJyYWRpbyIgOiAiIik7CgogICAgICAgIC8vZHVtcCgkYXR0clBhcmFtc1sidmFsdWUiXSk7CiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy9kdW1wKCRhdHRyUGFyYW1zWyJjaGVja2VkIl0pOwogICAgICAgIGlmICgkcGFyYW1zWyJsYWJlbCJdKQogICAgICAgICAgICAkaHRtbCAuPSAiPGxhYmVsIGZvcj0nIi4kdGhpcy0+aWQuIicgY2xhc3M9J18iLnN1YnN0cihnZXRfY2xhc3MoJHRoaXMpLCAxLCAxMDApLiJMYWJlbCAiLiRwYXJhbXNbImxhYmVsQ2xhc3MiXS4iICIuJGF0dHJQYXJhbXNbImNoZWNrZWQiXS4iJyBzdHlsZT0nIi4kcGFyYW1zWyJsYWJlbFN0eWxlIl0uIicgdGl0bGU9JyIuJHBhcmFtc1sidGl0bGUiXS4iJz4iOwogICAgICAgICRodG1sIC49ICI8aW5wdXQgdHlwZT0nIi4kdGhpcy0+dHlwZS4iJyAiLmdldEF0dHJpYnV0ZVBhcmFtcygkYXR0clBhcmFtcykuIiAvPiI7CiAgICAgICAgaWYgKCRwYXJhbXNbImxhYmVsIl0pCiAgICAgICAgICAgICRodG1sIC49ICRwYXJhbXNbImxhYmVsIl0uIjwvbGFiZWw+IjsKICAgICAgICAKICAgICAgICAvL2R1bXAoZ2V0QXR0cmlidXRlUGFyYW1zKCRhdHRyUGFyYW1zKSk7CiAgICAgICAgLy9pZiAoJHBhcmFtc1sibGFiZWwiXSkKICAgICAgICAvLyAgICAkaHRtbCAuPSAiPGxhYmVsIGZvcj0nIi4kdGhpcy0+aWQuIicgY2xhc3M9JyIuJHBhcmFtc1sibGFiZWxDbGFzcyJdLiInIHN0eWxlPSciLiRwYXJhbXNbImxhYmVsU3R5bGUiXS4iJyB0aXRsZT0nIi4kcGFyYW1zWyJ0aXRsZSJdLiInPiIuJHBhcmFtc1sibGFiZWwiXS4iPC9sYWJlbD4iOwogICAgICAgIAogICAgICAgICRqcyAuPSAidmFyICIuJHRoaXMtPmpzT2JqZWN0TmFtZS4iID0gbmV3ICIuJHRoaXMtPmpzQ2xhc3NOYW1lLiIoIi4kdGhpcy0+Z2V0SnNQYXJhbXMoJGpzUGFyYW1zKS4iLCAnIi4kdGhpcy0+aWQuIicpOyBcbiI7CiAgICAgICAgaWYgKCRwYXJhbXNbIm9uQ2xpY2siXSkKICAgICAgICB7CiAgICAgICAgICAgICRqcyAuPSAkdGhpcy0+anNPYmplY3ROYW1lLiIub25DbGljaz1mdW5jdGlvbigpeyIuJHBhcmFtc1sib25DbGljayJdLiJ9OyBcbiI7CiAgICAgICAgfQoKICAgICAgICAkaHRtbCAuPSAkdGhpcy0+Z2V0SmF2YVNjcmlwdEh0bWwoJGpzKTsKICAgICAgICByZXR1cm4oJGh0bWwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBvbkdldERCVmFsdWUoJGJlZm9yZVJlY29yZFZhbHVlcywgJGFmdGVyUmVjb3JkVmFsdWVzKQogICAgewogICAgICAgICR2YWx1ZSA9ICRiZWZvcmVSZWNvcmRWYWx1ZXNbJHRoaXMtPm5hbWVdOwoKICAgICAgICAkdmFsdWVzID0gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidmFsdWVzIl0pOwogICAgICAgIGlmIChjb3VudCgkdmFsdWVzKSA9PSAzICYmICR2YWx1ZXNbMF0gPT0gIiIpCiAgICAgICAgewogICAgICAgICAgICB1bnNldCgkdmFsdWVzWzBdKTsKICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5X3ZhbHVlcygkdmFsdWVzKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkdmFsdWVzKQogICAgICAgIHsKICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5KCJ0cnVlIiwiZmFsc2UiKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gdHJ1ZSB8fCAkdmFsdWUgPT0gIjEiKQogICAgICAgICAgICAkdmFsdWUgPSAkdmFsdWVzWzBdOwogICAgICAgIGlmICgkdmFsdWUgPT09IGZhbHNlIHx8ICR2YWx1ZSA9PSAiIiB8fCAkdmFsdWUgPT0gIjAiKQogICAgICAgICAgICAkdmFsdWUgPSAkdmFsdWVzWzFdOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldERpc3BsYXlWYWx1ZSgkcmVjb3JkVmFsdWVzKQogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5nZXRWYWx1ZSgkcmVjb3JkVmFsdWVzKTsKICAgICAgICAKICAgICAgICAkdGhpcy0+dmFsdWVzID0gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidmFsdWVzIl0pOwogICAgICAgICR0aGlzLT50ZXh0cyA9ICgkdGhpcy0+cGFyYW1zWyJ0ZXh0cyJdID8gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidGV4dHMiXSkgOiAkdGhpcy0+dmFsdWVzKTsKICAgICAgICBpZiAoISRwYXJhbXNbInZhbHVlcyJdKQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1sidmFsdWVzIl0gPSBhcnJheSgidHJ1ZSIsImZhbHNlIik7CiAgICAgICAgICAgIGlmICghJHBhcmFtc1sidGV4dHMiXSkKICAgICAgICAgICAgICAgICRwYXJhbXNbInRleHRzIl0gPSBhcnJheSh0cmFuc2xhdGUoInRydWUiKSx0cmFuc2xhdGUoImZhbHNlIikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkX3RleHRzID0gYXJyYXkoKTsKCiAgICAgICAgJGZvdW5kID0gZmFsc2U7CiAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCR0aGlzLT52YWx1ZXMpIDsgJGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+dmFsdWVzWyRpXSA9PSAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0ZXh0ID0gKCRwYXJhbXNbInRyYW5zbGF0ZSJdICE9PSBmYWxzZSA/IHRyYW5zbGF0ZSgkdGhpcy0+dGV4dHNbJGldKSA6ICR0aGlzLT50ZXh0c1skaV0pOwogICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJGZvdW5kKQogICAgICAgICAgICAkdGV4dCA9ICgkcGFyYW1zWyJ0cmFuc2xhdGUiXSAhPT0gZmFsc2UgPyB0cmFuc2xhdGUoJHZhbHVlKSA6ICR2YWx1ZSk7CgogICAgICAgIHJldHVybigkdGV4dCk7CiAgICB9ICAgIAp9Cgo=ZnVuY3Rpb24gVFRvb2xUaXAocGFyYW1zLCBpZCkgICAKewogICAgaWYgKCFpZCkKICAgICAgICBpZCA9IFVVSUQoKTsKICAgICAgICAKICAgIHRoaXMuVEhJUyA9IHRoaXM7CiAgICB0aGlzLmlkID0gaWQ7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgIAogICAgdGhpcy5kdW1wRGF0YSA9IGZhbHNlOwogICAgYWRkT2JqZWN0KHRoaXMpOwogICAgdGhpcy5fY3JlYXRlKCk7Cn0KCmV4dGVuZENsYXNzKFRUb29sVGlwLCBUT2JqZWN0KTsKClRUb29sVGlwLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMubW91c2VPdXRUaW1lciA9IG51bGw7CgogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CiAgICAKICAgIGlmICh0eXBlb2YodGhpcy5wYXJhbXNbImFsaWduIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMucGFyYW1zWyJhbGlnbiJdID0gImNlbnRlciI7CiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJ2YWxpZ24iXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhpcy5wYXJhbXNbInZhbGlnbiJdID0gIm91dGVyLWJvdHRvbSI7CiAgICAKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICBhZGRFdmVudCh3aW5kb3csICJtb3VzZW92ZXIiLCBmdW5jdGlvbihlKXtfdGhpcy5vbk1vdXNlT3ZlcihlKX0pOwogICAgYWRkRXZlbnQod2luZG93LCAibW91c2VvdXQiLCBmdW5jdGlvbihlKXtfdGhpcy5vbk1vdXNlT3V0KGUpfSk7CiAgICBhZGRFdmVudChkb2N1bWVudCwgInNjcm9sbCIsIGZ1bmN0aW9uKCl7X3RoaXMub25TY3JvbGwoKX0pOwogICAgCiAgICBpZiAoIXRoaXMucGFyYW1zWyJhdHRyaWJ1dGUiXSkKICAgICAgICB0aGlzLnBhcmFtc1siYXR0cmlidXRlIl0gPSAidGl0bGUiOwogICAgICAgIAogICAgdGhpcy5wYXJhbXNbImRpc2FibGVkVGFncyJdID0gZXhwbG9kZUxpc3QodGhpcy5wYXJhbXNbImRpc2FibGVkVGFncyJdKTsKCiAgICB0aGlzLmNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgLy9hZGRDbGFzc05hbWUodGhpcy5jb250YWluZXIsIHRoaXMucGFyYW1zWyJjbGFzcyJdKTsKICAgIHRoaXMuZGlzcGxheVZhbHVlID0gZ2V0U3R5bGUodGhpcy5jb250YWluZXIsICJkaXNwbGF5Iik7CiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgCiAgICBhcHBlbmRGaXJzdChkb2N1bWVudC5ib2R5LCB0aGlzLmNvbnRhaW5lcik7CiAgICAKICAgIC8vdmFyIGRpdiA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgLy9hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lciwgZGl2KTsKICAgIHRoaXMuY29udGVudENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwogICAgCiAgICAvKgogICAgdmFyIHRhYmxlID0gY3JlYXRlRWxlbWVudCgidGFibGUiKTsKICAgIHRhYmxlLmNlbGxQYWRkaW5nID0gMDsKICAgIHRhYmxlLmNlbGxTcGFjaW5nID0gMDsKICAgIHRhYmxlLmJvcmRlciA9IDA7CiAgICBhcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lciwgdGFibGUpOwoKICAgIHZhciB0ciA9IGNyZWF0ZUVsZW1lbnQoInRyIik7CiAgICBhcHBlbmRDaGlsZCh0YWJsZSwgdHIpOwogICAgCiAgICB2YXIgdGQgPSBjcmVhdGVFbGVtZW50KCJ0ZCIpOwogICAgYWRkQ2xhc3NOYW1lKHRkLCAiX1Rvb2xUaXBMZWZ0Iik7CiAgICB0ZC5pbm5lckhUTUwgPSBaV1NQOwogICAgYXBwZW5kQ2hpbGQodHIsIHRkKTsKICAgIAogICAgdmFyIHRkID0gY3JlYXRlRWxlbWVudCgidGQiKTsKICAgIGFwcGVuZENoaWxkKHRyLCB0ZCk7CiAgICAKICAgIHZhciBkaXYgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGFkZENsYXNzTmFtZShkaXYsICJfVG9vbFRpcFRvcCIpOwogICAgYXBwZW5kQ2hpbGQodGQsIGRpdik7CgogICAgdGhpcy5jb250ZW50Q29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBhZGRDbGFzc05hbWUodGhpcy5jb250ZW50Q29udGFpbmVyLCAiX1Rvb2xUaXBDb250ZW50Iik7CiAgICBhcHBlbmRDaGlsZCh0ZCwgdGhpcy5jb250ZW50Q29udGFpbmVyKTsKCiAgICB2YXIgZGl2ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBhZGRDbGFzc05hbWUoZGl2LCAiX1Rvb2xUaXBCb3R0b20iKTsKICAgIGFwcGVuZENoaWxkKHRkLCBkaXYpOwogICAgCiAgICB2YXIgdGQgPSBjcmVhdGVFbGVtZW50KCJ0ZCIpOwogICAgdGQuaW5uZXJIVE1MID0gWldTUDsKICAgIGFkZENsYXNzTmFtZSh0ZCwgIl9Ub29sVGlwUmlnaHQiKTsKICAgIGFwcGVuZENoaWxkKHRyLCB0ZCk7CiAgICAqLwogICAgCiAgICAvL2FkZEV2ZW50KHRoaXMuY29udGFpbmVyLCAibW91c2VvdmVyIiwgZnVuY3Rpb24oZSl7ZHVtcCgxKTtlPWdldEV2ZW50KGUpO2Uuc3RvcCgpfSk7CiAgICAKfQoKVFRvb2xUaXAucHJvdG90eXBlLm9uTW91c2VPdmVyID0gZnVuY3Rpb24oZSkKewogICAgZSA9IGdldE1vdXNlRXZlbnQoZSk7CiAgICB2YXIgZWxlbSA9IGUudGFyZ2V0OwogICAgLy9kdW1wKCItLS0tLSIpOwogICAgLy9kdW1wKGVsZW0pOwogICAgdmFyIF9lbGVtID0gZWxlbTsKICAgIHdoaWxlIChfZWxlbSkKICAgIHsKICAgICAgICBpZiAoX2VsZW0udGFnTmFtZSAmJiBfZWxlbS5oYXNBdHRyaWJ1dGUoInRvb2x0aXAtZGlzYWJsZWQiKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgX2VsZW0gPSBfZWxlbS5wYXJlbnROb2RlOwogICAgfQoKICAgIHdoaWxlKGVsZW0pCiAgICB7CiAgICAgICAgaWYgKGVsZW0udGFnTmFtZSAmJiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJfVG9vbFRpcCIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiX1Rvb2xUaXBUb3AiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgIl9Ub29sVGlwQm90dG9tIikgfHwgaGFzQ2xhc3NOYW1lKGVsZW0sICJfVG9vbFRpcExlZnQiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgIl9Ub29sVGlwUmlnaHQiKSkgLyogfHwgZWxlbSA9PSB0aGlzLmNvbnRhaW5lciAgLSBkbyBub3QgaGlkZSBvbiB0b29sdGlwIG1vdXNlIG1vdmUqLykKICAgICAgICB7CiAgICAgICAgICAgIC8vIHZ5cG51dG8ga3Z1bGkga2xhc2lja3ltIFRvb2x0aXB1bSB2IGFkbWluaXN0cmFjaSAtIHBva3VkIHRvIGplIG5la2RlIHBvdHJlYmEgLSB6YXBpbmF0IHBvbW9jaSBuZWNlaG8hCiAgICAgICAgICAgIC8vY2xlYXJUaW1lb3V0KHRoaXMubW91c2VPdXRUaW1lcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgoZWxlbS50YWdOYW1lICYmIChlbGVtLmdldEF0dHJpYnV0ZSh0aGlzLnBhcmFtc1siYXR0cmlidXRlIl0pIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJ0b29sdGlwLWNvbnRhaW5lciIpKSB8fCBlbGVtLl90aXRsZSkgJiYgZWxlbSAhPSB0aGlzLmNvbnRhaW5lcikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIAogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICB9CgogICAgaWYgKGVsZW0gPT0gZG9jdW1lbnQpCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgICAgIC8vZWxlbSA9IG51bGw7CiAgICB9CiAgICAKICAgIHZhciBpbkNvbnRhaW5lciA9IGZhbHNlOwogICAgdmFyIF9lbGVtID0gZWxlbTsKICAgIHdoaWxlIChfZWxlbSkKICAgIHsKICAgICAgICBpZiAoX2VsZW0gPT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgewogICAgICAgICAgICBpbkNvbnRhaW5lciA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBfZWxlbSA9IF9lbGVtLnBhcmVudE5vZGU7CiAgICB9CiAgICB2YXIgaW5PdmVyZmxvdyA9IGZhbHNlOwogICAgdmFyIF9lbGVtID0gZWxlbTsKICAgIHdoaWxlIChfZWxlbSkKICAgIHsKICAgICAgICBpZiAoX2VsZW0gIT0gZG9jdW1lbnQuYm9keSAmJiBnZXRTdHlsZShfZWxlbSwgIm92ZXJmbG93IikgPT0gImhpZGRlbiIpCiAgICAgICAgewogICAgICAgICAgICBpbk92ZXJmbG93ID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIF9lbGVtID0gX2VsZW0ucGFyZW50Tm9kZTsKICAgIH0KCiAgICB0aGlzLmluQ29udGFpbmVyID0gaW5Db250YWluZXI7CiAgICAvL2R1bXAoZWxlbSk7CiAgICAvL2R1bXAodGhpcy5jb250YWluZXIpOwogICAgLy9kdW1wKHRoaXMuaW5Db250YWluZXIpOwogICAgaWYgKGluQ29udGFpbmVyKQogICAgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlT3V0VGltZXIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgaWYgKGVsZW0gPT0gdGhpcy5jb250YWluZXIgfHwgZWxlbSA9PSBudWxsKQogICAgewogICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBpZiAoZWxlbSkKICAgIHsKICAgICAgICAvLyBtb3ZlIGNvbnRhaW5lciBhZnRlciBlbGVtZW50IC0gdG8gZGlzYWJsZSBoaWRpbmcgOmhvdmVyIGFic29sdXRlIHBvc2l0aW9uZWQgZWxlbWVudHMKICAgICAgICAvL2lmICghQURNSU4pCiAgICAgICAgICAgIC8vaW5zZXJ0QWZ0ZXIoZWxlbSwgdGhpcy5jb250YWluZXIpOwoKICAgICAgICAvLyBpZiBpbiBvdmVyZmxvdzogaGlkZGVuIC0gc2hvdyBpbiBib2R5CgogICAgICAgIC8vZHVtcChpbk92ZXJmbG93KTsKICAgICAgICBpZiAoaW5PdmVyZmxvdykKICAgICAgICAgICAgYXBwZW5kTGFzdChkb2N1bWVudC5ib2R5LCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBhcHBlbmRMYXN0KGVsZW0ucGFyZW50Tm9kZSwgdGhpcy5jb250YWluZXIpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgib3ZlciIpOwogICAgICAgIC8vdmFyIHBvcyA9IGdldFdpbmRvd1Bvc2l0aW9uKGVsZW0pOwogICAgICAgIAogICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAKICAgICAgICB2YXIgX2VsZW0gPSBlbGVtOwogICAgICAgIHdoaWxlKF9lbGVtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKF9lbGVtLmdldEF0dHJpYnV0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGdldFRhZyhfZWxlbSkpOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbXNbImFsaWduIl0pCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJhbGlnbiJdID0gX2VsZW0uZ2V0QXR0cmlidXRlKCJ0b29sdGlwLWFsaWduIik7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1sidmFsaWduIl0pCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJ2YWxpZ24iXSA9IF9lbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcC12YWxpZ24iKTsKICAgICAgICAgICAgICAgIGlmICghcGFyYW1zWyJzdHlsZSJdKQogICAgICAgICAgICAgICAgICAgIHBhcmFtc1sic3R5bGUiXSA9IF9lbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcC1zdHlsZSIpOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbXNbImNsYXNzIl0pCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJjbGFzcyJdID0gX2VsZW0uZ2V0QXR0cmlidXRlKCJ0b29sdGlwLWNsYXNzIik7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1siY29udGFpbmVyIl0pCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJjb250YWluZXIiXSA9IF9lbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcC1jb250YWluZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfZWxlbSA9IF9lbGVtLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIC8vZHVtcChwYXJhbXMpOwoKICAgICAgICBpZiAoIXBhcmFtc1siYWxpZ24iXSkKICAgICAgICAgICAgcGFyYW1zWyJhbGlnbiJdID0gdGhpcy5wYXJhbXNbImFsaWduIl07CiAgICAgICAgaWYgKCFwYXJhbXNbInZhbGlnbiJdKQogICAgICAgICAgICBwYXJhbXNbInZhbGlnbiJdID0gdGhpcy5wYXJhbXNbInZhbGlnbiJdOwogICAgICAgIGlmICghcGFyYW1zWyJzdHlsZSJdKQogICAgICAgICAgICBwYXJhbXNbInN0eWxlIl0gPSB0aGlzLnBhcmFtc1sic3R5bGUiXTsKICAgICAgICBpZiAoIXBhcmFtc1siY2xhc3MiXSkKICAgICAgICAgICAgcGFyYW1zWyJjbGFzcyJdID0gdGhpcy5wYXJhbXNbImNsYXNzIl07CiAgICAgICAgaWYgKCFwYXJhbXNbImNvbnRhaW5lciJdKQogICAgICAgICAgICBwYXJhbXNbImNvbnRhaW5lciJdID0gdGhpcy5wYXJhbXNbImNvbnRhaW5lciJdOwoKICAgICAgICAvL3ZhciBwb3MgPSBnZXRXaW5kb3dQb3NpdGlvbihlbGVtKTsKICAgICAgICB2YXIgaW5BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgIHZhciBlbGVtMiA9IGVsZW07CiAgICAgICAgd2hpbGUoZWxlbTIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbTIsInBvc2l0aW9uIikgPT0gImFic29sdXRlIiB8fCBnZXRTdHlsZShlbGVtMiwicG9zaXRpb24iKSA9PSAiZml4ZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbkFic29sdXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbGVtMiA9IGVsZW0yLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZHVtcChpbkFic29sdXRlKTsKICAgICAgICAvL3ZhciBwb3MgPSBnZXRXaW5kb3dQb3NpdGlvbihlbGVtKTsKICAgICAgICAvL2lmIChpbkFic29sdXRlKQogICAgICAgIC8vICAgIHZhciBwb3MgPSBnZXRQb3NpdGlvbihlbGVtKTsKICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgICAgICB2YXIgcG9zID0gZ2V0V2luZG93UG9zaXRpb24oZWxlbSk7CiAgICAgICAgICAgIC8vZHVtcChwb3MpOwogICAgICAgIC8vdmFyIHBvcyA9IGdldFBvc2l0aW9uKGVsZW0pOwogICAgICAgIC8vZHVtcChwYXJhbXMpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcjIgJiYgdGhpcy5jb250YWluZXIyUGFyZW50Tm9kZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiISEiKTsKICAgICAgICAgICAgYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIyUGFyZW50Tm9kZSwgdGhpcy5jb250YWluZXIyKTsKICAgICAgICAgICAgc2V0U3R5bGUodGhpcy5jb250YWluZXIyLCAiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgfQoKICAgICAgICAvLyBwdXZvZG5pIHRpdHVsZWsgamUgbnV0bmUgb2RzdHJhbml0LCBqaW5hayBzZSB1a2F6ZSBpIHZ5Y2hvemkgdGl0bGUKICAgICAgICB0aGlzLmNvbnRhaW5lcjIgPSBudWxsOwogICAgICAgIC8vZHVtcChwYXJhbXMpOwogICAgICAgIGlmIChwYXJhbXNbImNvbnRhaW5lciJdKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb250YWluZXIyID0gZ2V0RWxlbWVudChwYXJhbXNbImNvbnRhaW5lciJdKTsKICAgICAgICAgICAgLy9kdW1wKHBhcmFtc1siY29udGFpbmVyIl0pOwogICAgICAgICAgICAvL2R1bXAodGhpcy5jb250YWluZXIyKTsKICAgICAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lcjJQYXJlbnROb2RlID0gdGhpcy5jb250YWluZXIyLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRDb250YWluZXIsIHRoaXMuY29udGFpbmVyMik7CiAgICAgICAgICAgICAgICBzZXRTdHlsZSh0aGlzLmNvbnRhaW5lcjIsICJkaXNwbGF5IiwgImJsb2NrIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lICYmIGVsZW0uaGFzQXR0cmlidXRlKHRoaXMucGFyYW1zWyJhdHRyaWJ1dGUiXSkgJiYgIWluX2FycmF5KGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCB0aGlzLnBhcmFtc1siZGlzYWJsZWRUYWdzIl0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSB0cmltKGVsZW0uZ2V0QXR0cmlidXRlKHRoaXMucGFyYW1zWyJhdHRyaWJ1dGUiXSkpOwogICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5wYXJhbXNbImF0dHJpYnV0ZSJdKTsKICAgICAgICAgICAgICAgIGVsZW0uX3RpdGxlID0gdGl0bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gZWxlbS5fdGl0bGU7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3ZhciB0aXRsZSA9IGVsZW0udGl0bGU7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGl0bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRpdGxlID0gc3RyX3JlcGxhY2UoIjxicj4iLCAiXG4iLCB0aXRsZSk7CiAgICAgICAgICAgICAgICB0aXRsZSA9IHN0cl9yZXBsYWNlKCI8YnIgLz4iLCAiXG4iLCB0aXRsZSk7CiAgICAgICAgICAgICAgICB0aXRsZSA9IHN0cl9yZXBsYWNlKCJcXG4iLCAiXG4iLCB0aXRsZSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB3b3JkcyA9IHRpdGxlOwogICAgICAgICAgICAgICAgLy93b3JkcyA9IHN0cl9yZXBsYWNlKCIuIiwgIi4iLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cl9yZXBsYWNlKCIsIiwgIiAiLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cl9yZXBsYWNlKCI/IiwgIiAiLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cl9yZXBsYWNlKCIhIiwgIiAiLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cl9yZXBsYWNlKCJfIiwgIiAiLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHdvcmRzID0gc3RyX3JlcGxhY2UoIj4iLCAiICIsIHdvcmRzKTsgLy8gZm9yIGh0bWwgaW5zaWRlCiAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cl9yZXBsYWNlKCI8IiwgIiAiLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cl9yZXBsYWNlKCIvIiwgIiAiLCB3b3Jkcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRzLnNwbGl0KCIgIik7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB3b3Jkcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW2ldLmxlbmd0aCA+IDEwKQogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHN0cl9yZXBsYWNlKHdvcmRzW2ldLCBjaGFyV3JhcCh3b3Jkc1tpXSksIHRpdGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRpdGxlID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsIHRpdGxlKTsKICAgICAgICAgICAgICAgIHRoaXMuY29udGVudENvbnRhaW5lci5pbm5lckhUTUwgPSB0aXRsZTsKICAgICAgICAgICAgfSAgICAKICAgICAgICB9CiAgICAgICAgLy9kdW1wKHRpdGxlKTsKICAgICAgICAvL2R1bXAodGhpcy5jb250YWluZXIyKTsKICAgICAgICAvL2R1bXAocGFyYW1zKTsKICAgICAgICBpZiAodGl0bGUgfHwgdGhpcy5jb250YWluZXIyKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheVZhbHVlOwogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIHBhcmFtc1sic3R5bGUiXSk7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiIjsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiX1Rvb2xUaXAiKTsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAocGFyYW1zWyJjbGFzcyJdIHx8ICIiKSk7CiAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgxKTsKICAgICAgICAgICAgLy8gZG93biBjZW50ZXIKICAgICAgICAgICAgdmFyIHBvczIgPSB7fTsKICAgICAgICAgICAgaWYgKHBhcmFtc1siYWxpZ24iXSA9PSAibGVmdCIpCiAgICAgICAgICAgICAgICBwb3MyWyJ4Il0gPSBNYXRoLnJvdW5kKHBvc1sieCJdKTsKICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1zWyJhbGlnbiJdID09ICJyaWdodCIpCiAgICAgICAgICAgICAgICBwb3MyWyJ4Il0gPSBNYXRoLnJvdW5kKHBvc1sieCJdK2VsZW0ub2Zmc2V0V2lkdGgtdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGgpOwogICAgICAgICAgICBlbHNlIGlmIChwYXJhbXNbImFsaWduIl0gPT0gIm91dGVyLWxlZnQiKQogICAgICAgICAgICAgICAgcG9zMlsieCJdID0gTWF0aC5yb3VuZChwb3NbIngiXSktdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtc1siYWxpZ24iXSA9PSAib3V0ZXItcmlnaHQiKQogICAgICAgICAgICAgICAgcG9zMlsieCJdID0gTWF0aC5yb3VuZChwb3NbIngiXSkrZWxlbS5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcG9zMlsieCJdID0gTWF0aC5yb3VuZCgocG9zWyJ4Il0rZWxlbS5vZmZzZXRXaWR0aC8yKS10aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aC8yKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcChwYXJhbXNbInZhbGlnbiJdKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChwYXJhbXNbInZhbGlnbiJdID09ICJ0b3AiKQogICAgICAgICAgICAgICAgcG9zMlsieSJdID0gTWF0aC5yb3VuZChwb3NbInkiXSk7CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtc1sidmFsaWduIl0gPT0gImJvdHRvbSIpCiAgICAgICAgICAgICAgICBwb3MyWyJ5Il0gPSBNYXRoLnJvdW5kKHBvc1sieSJdK2VsZW0ub2Zmc2V0SGVpZ2h0LXRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtc1sidmFsaWduIl0gPT0gIm91dGVyLXRvcCIpCiAgICAgICAgICAgICAgICBwb3MyWyJ5Il0gPSBNYXRoLnJvdW5kKHBvc1sieSJdLXRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtc1sidmFsaWduIl0gPT0gIm91dGVyLWJvdHRvbSIpCiAgICAgICAgICAgICAgICBwb3MyWyJ5Il0gPSBNYXRoLnJvdW5kKHBvc1sieSJdK2VsZW0ub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcG9zMlsieSJdID0gTWF0aC5yb3VuZChwb3NbInkiXStlbGVtLm9mZnNldEhlaWdodC8yKS10aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQvMjsKCiAgICAgICAgICAgIC8vcG9zMlsieSJdID0gTWF0aC5yb3VuZCgocG9zWyJ5Il0rZWxlbS5vZmZzZXRIZWlnaHQpKTsKCiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBwb3MyWyJ4Il0rInB4IjsKICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gcG9zMlsieSJdKyJweCI7CgogICAgICAgICAgICAvL2R1bXAocG9zWyJ5Il0pOwogICAgICAgICAgICAvL2R1bXAocGFyYW1zWyJhbGlnbiJdKTsKICAgICAgICAgICAgLy9kdW1wKHBhcmFtc1sidmFsaWduIl0pOwogICAgICAgICAgICAvL2R1bXAodGhpcy5jb250YWluZXIpOwogICAgICAgICAgICAvLyBmaXggdmlzaWJsZSBhcmVhCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgd1NpemUgPSBCcm93c2VyLmdldFdpbmRvd1NpemUoKTsKICAgICAgICAgICAgd1NpemVbIid3aWR0aCJdICs9IGdldFNjcm9sbExlZnQoKTsKICAgICAgICAgICAgd1NpemVbImhlaWdodCJdICs9IGdldFNjcm9sbFRvcCgpOwogICAgICAgICAgICBpZiAocG9zMlsieCJdK3RoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoID4gd1NpemVbIndpZHRoIl0pCiAgICAgICAgICAgICAgICBwb3MyWyJ4Il0gPSBwb3MyWyJ4Il0tdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGgtZWxlbS5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgaWYgKHBvczJbInkiXSt0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQgPiB3U2l6ZVsiaGVpZ2h0Il0pCiAgICAgICAgICAgICAgICBwb3MyWyJ5Il0gPSBwb3MyWyJ5Il0tdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0LWVsZW0ub2Zmc2V0SGVpZ2h0OwoKICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9ICIwcHgiOyAvLyBpZiBhdCB0aGUgcmlnaHQgY29ybmVyIHRoZSBkaXYgdGFrZXMgd2lkdGggdG8gdGhlIHJlbWFpbmluZyBzcGFjZQogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSAiMHB4IjsKICAgICAgICAgICAgaWYgKHBvczJbIngiXSt0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aCA+PSB3U2l6ZVsid2lkdGgiXS0xMCkKICAgICAgICAgICAgICAgIHBvczJbIngiXSA9IHdTaXplWyJ3aWR0aCJdLXRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoLTEwOwogICAgICAgICAgICBpZiAocG9zMlsieSJdK3RoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodCA+PSB3U2l6ZVsiaGVpZ2h0Il0tMTApCiAgICAgICAgICAgICAgICBwb3MyWyJ5Il0gPSB3U2l6ZVsiaGVpZ2h0Il0tdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0LTEwOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHBvczJbIngiXSA8IDEwKQogICAgICAgICAgICAgICAgcG9zMlsieCJdID0gMTA7CiAgICAgICAgICAgIGlmIChwb3MyWyJ5Il0gPCAxMCkKICAgICAgICAgICAgICAgIHBvczJbInkiXSA9IDEwOwogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IHBvczJbIngiXSsicHgiOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBwb3MyWyJ5Il0rInB4IjsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMubGFzdEVsZW0gPSBlbGVtOwogICAgICAgICAgICAKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VPdXRUaW1lcik7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgICAgIC8vIGZvciBkZWJ1ZwogICAgICAgICAgICAvL2R1bXAodGl0bGUpOwogICAgICAgICAgICAvL3RoaXMub25Nb3VzZU92ZXIgPSBmdW5jdGlvbigpe307CiAgICAgICAgICAgIC8vdGhpcy5vbk1vdXNlT3V0ID0gZnVuY3Rpb24oKXt9OwogICAgICAgIH0KCiAgICB9Cn0KClRUb29sVGlwLnByb3RvdHlwZS5vbk1vdXNlT3V0ID0gZnVuY3Rpb24oZSkKewogICAgZSA9IGdldE1vdXNlRXZlbnQoZSk7CiAgICAKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICB2YXIgZWxlbSA9IGUudGFyZ2V0OwoKICAgIHZhciBpbkNvbnRhaW5lciA9IGZhbHNlOwogICAgdmFyIF9lbGVtID0gZWxlbTsKICAgIHdoaWxlIChfZWxlbSkKICAgIHsKICAgICAgICBpZiAoX2VsZW0gPT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgewogICAgICAgICAgICBpbkNvbnRhaW5lciA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBfZWxlbSA9IF9lbGVtLnBhcmVudE5vZGU7CiAgICB9CiAgICAKICAgIGlmICghdGhpcy5pbkNvbnRhaW5lciAmJiAhaW5Db250YWluZXIgJiYgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSAhPSAibm9uZSIpCiAgICB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VPdXRUaW1lcik7CiAgICAgICAgdGhpcy5tb3VzZU91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICBpZiAoKGVsZW0udGFnTmFtZSAmJiAoZWxlbS5oYXNBdHRyaWJ1dGUoX3RoaXMucGFyYW1zWyJhdHRyaWJ1dGUiXSkgfHwgZWxlbS5oYXNBdHRyaWJ1dGUoInRvb2x0aXAtY29udGFpbmVyIikpIHx8IGVsZW0uX3RpdGxlKSAmJiBlbGVtICE9IF90aGlzLmNvbnRhaW5lcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKCdvdXQnKTsKICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzTmFtZShfdGhpcy5jb250YWluZXIsIChlbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcC1jbGFzcyIpIHx8IF90aGlzLnBhcmFtc1siY2xhc3MiXSB8fCAiIikpOwogICAgICAgICAgICAgICAgX3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICBhcHBlbmRMYXN0KGRvY3VtZW50LmJvZHksIF90aGlzLmNvbnRhaW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAxMDApOwogICAgfQp9CgpUVG9vbFRpcC5wcm90b3R5cGUub25TY3JvbGwgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ICE9ICJub25lIikKICAgIHsKICAgICAgICAvL2R1bXAoJ3Njcm9sbCcpOwogICAgICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgKHRoaXMucGFyYW1zWyJjbGFzcyJdIHx8ICIiKSk7CiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0KfQ==Ll9Ub29sVGlwIHsNCiAgICAvKnBvc2l0aW9uOiBhYnNvbHV0ZTsqLw0KICAgIHBvc2l0aW9uOiBmaXhlZDsNCiAgICB6LWluZGV4OiAxMDAwMDAxOw0KICAgIC8qZGlzcGxheTogdGFibGUtY2VsbDsgKi8NCiAgICBmb250LXNpemU6IDEycHg7ICAgIA0KICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQogICAgZm9udC1zdHlsZTogbm9ybWFsOw0KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsNCn0NCg0KLl9Ub29sVGlwIHRhYmxlIHsNCiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KICAgIGVtcHR5LWNlbGxzOiBzaG93Ow0KICAgIHRhYmxlLWxheW91dDogZml4ZWQ7DQp9DQoNCi5fVG9vbFRpcCB0YWJsZSB0ZCB7DQogICAgcGFkZGluZzogMHB4Ow0KICAgIGJvcmRlcjogMHB4Ow0KfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvVG9vbFRpcC9Ub29sVGlwLmNsYXNzLnBocCAtLS0tLS0tIA0KDQpjbGFzcyBUVG9vbFRpcCBleHRlbmRzIFRDb21wb25lbnQNCnsNCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uR2V0UHJvcGVydGllcygpDQogICAgew0KICAgICAgICByZXR1cm4oYXJyYXlfbWVyZ2UocGFyZW50OjpvbkdldFByb3BlcnRpZXMoKSwgYXJyYXkoICAgICAgICANCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1IVE1MIiwNCiAgICAgICAgIm5hbWU9YXR0cmlidXRlLGNhcHRpb249QXR0cmlidXRlLG9iamVjdD1UZXh0RWRpdCIsDQogICAgICAgICJuYW1lPWFsaWduLGNhcHRpb249SG9yaXpvbnRhbCBBbGlnbixvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXxvdXRlci1sZWZ0fGxlZnR8Y2VudGVyfHJpZ2h0fG91dGVyLXJpZ2h0IiwNCiAgICAgICAgIm5hbWU9dmFsaWduLGNhcHRpb249VmVydGljYWwgQWxpZ24sb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18b3V0ZXItdG9wfHRvcHxjZW50ZXJ8Ym90dG9tfG91dGVyLWJvdHRvbSIsDQogICAgICAgICJuYW1lPWRpc2FibGVkVGFncyxjYXB0aW9uPURpc2FibGVkIFRhZ3Msb2JqZWN0PUxpc3RFZGl0IiwNCiAgICAgICAgKSkpOyAgICAgICAgDQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIG9uR2V0SGVhZEh0bWwoJHBhcmFtcz1hcnJheSgpKQ0KICAgIHsNCiAgICAgICAgaWYgKCFoZWFkSHRtbEFkZGVkKF9fQ0xBU1NfXywgJHBhcmFtcykpDQogICAgICAgIHsNCiAgICAgICAgICAgIHBhcmVudDo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsNCg0KICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L1Rvb2xUaXAvVG9vbFRpcC5jbGFzcy5qcyc+PC9zY3JpcHQ+Iix0cnVlKTsNCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8bGluayBocmVmPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9Ub29sVGlwL1Rvb2xUaXAuY2xhc3MuY3NzJyByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJyAvPiIsdHJ1ZSk7DQogICAgICAgICAgICBhZGRFeHRlbmRpbmdIZWFkSHRtbCgkcGFyYW1zLCBfX0NMQVNTX18pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gb25HZXRDb250ZW50KCYkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikNCiAgICB7DQogICAgICAgICR0aGlzLT5nZXRIZWFkSHRtbCgkcGFyYW1zKTsNCg0KICAgICAgICAkcGFyYW1zID0gJHRoaXMtPmV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7DQogICAgICAgIA0KICAgICAgICAkdGhpcy0+aW5pdCgkcGFyYW1zKTsNCg0KICAgICAgICAkanNQYXJhbXMgPSAkcGFyYW1zOw0KICAgICAgICAkanMgLj0gInZhciAiLiR0aGlzLT5qc09iamVjdE5hbWUuIiA9IG5ldyAiLiR0aGlzLT5qc0NsYXNzTmFtZS4iKCIuJHRoaXMtPmdldEpzUGFyYW1zKCRqc1BhcmFtcykuIiwgJyIuJHRoaXMtPmlkLiInKTsgXG4iOw0KICAgICAgICAkaHRtbCAuPSAkdGhpcy0+Z2V0SmF2YVNjcmlwdEh0bWwoJGpzKTsNCg0KICAgICAgICByZXR1cm4oJGh0bWwpOw0KICAgIH0NCn0NCg==ZnVuY3Rpb24gVE9iamVjdENvbWJvQm94KHBhcmFtcywgaWQpICAgDQp7DQogICAgaWYgKCFpZCkNCiAgICAgICAgaWQgPSBVVUlEKCk7DQogICAgICAgIA0KICAgIHRoaXMuVEhJUyA9IHRoaXM7DQogICAgdGhpcy5pZCA9IGlkOw0KICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOw0KICAgIA0KICAgIHRoaXMuZHVtcERhdGEgPSBmYWxzZTsNCiAgICBhZGRPYmplY3QodGhpcyk7DQogICAgdGhpcy5fY3JlYXRlKCk7DQp9DQoNCmV4dGVuZENsYXNzKFRPYmplY3RDb21ib0JveCwgVENvbWJvQm94KTsNCg0KVE9iamVjdENvbWJvQm94LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpDQp7DQogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7DQogICAgDQogICAgYWRkQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgIl9PYmplY3RDb21ib0JveCIpOw0KfQ0KDQo=Ll9PYmplY3RDb21ib0JveCB7DQp9DQoNCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvT2JqZWN0Q29tYm9Cb3gvT2JqZWN0Q29tYm9Cb3guY2xhc3MucGhwIC0tLS0tLS0gDQoKY2xhc3MgVE9iamVjdENvbWJvQm94IGV4dGVuZHMgVENvbWJvQm94CnsKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb25HZXRQcm9wZXJ0aWVzKCkKICAgIHsKICAgICAgICByZXR1cm4obWVyZ2VQcm9wZXJ0aWVzKHBhcmVudDo6b25HZXRQcm9wZXJ0aWVzKCksIGFycmF5KCAgICAgICAgCiAgICAgICAgInR5cGU9Z3JvdXAsY2FwdGlvbj1GaWx0ZXIiLAogICAgICAgICJuYW1lPW9iamVjdFR5cGUsY2FwdGlvbj1PYmplY3QgVHlwZSxvYmplY3Q9T2JqZWN0RWRpdCIsCiAgICAgICAgIm5hbWU9ZXh0ZW5kcyxjYXB0aW9uPUV4dGVuZHMsb2JqZWN0PU9iamVjdEVkaXQiLAogICAgICAgICJuYW1lPWltcGxlbWVudHMsY2FwdGlvbj1JbXBsZW1lbnRzLG9iamVjdD1PYmplY3RFZGl0IiwKICAgICAgICApKSk7ICAgICAgICAKICAgICAgICAvLyksIFRQcm9wZXJ0eUVkaXRvcjo6Z2V0Q1NTUHJvcGVydGllcygpKSk7ICAgICAgICAKICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIWhlYWRIdG1sQWRkZWQoX19DTEFTU19fLCAkcGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIHBhcmVudDo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L09iamVjdENvbWJvQm94L09iamVjdENvbWJvQm94LmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOwogICAgICAgICAgICAvL2FkZEhlYWRIdG1sKCI8bGluayBocmVmPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9PYmplY3RDb21ib0JveC9hZG1pbi5jc3MnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIC8+Iix0cnVlKTsKICAgICAgICAgICAgYWRkRXh0ZW5kaW5nSGVhZEh0bWwoJHBhcmFtcywgX19DTEFTU19fKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gb25HZXRDb250ZW50KCYkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwogICAgICAgICRwYXJhbXMgPSAkdGhpcy0+ZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsKCiAgICAgICAgaWYgKCRwYXJhbXNbIm9iamVjdFR5cGUiXSkKICAgICAgICAgICAgJG9iamVjdFR5cGVzID0gYXJyYXlfbWVyZ2UoZXhwbG9kZUxpc3QoJHBhcmFtc1sib2JqZWN0VHlwZSJdKSwgZXhwbG9kZUxpc3QoZ2V0T2JqZWN0VHlwZXMoJHBhcmFtc1sib2JqZWN0VHlwZSJdKSkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJG9iamVjdFR5cGVzID0gZXhwbG9kZUxpc3QoZ2V0T2JqZWN0VHlwZXMoJHBhcmFtc1siZXh0ZW5kcyJdKSk7CiAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbImltcGxlbWVudHMiXSkKICAgICAgICB7CiAgICAgICAgICAgICRfb2JqZWN0VHlwZXMgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRvYmplY3RUeXBlcyBhcyAkb2JqZWN0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkb2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdWRlbGF0IG5lamFrIGtvbmNlcGNuZQogICAgICAgICAgICAgICAgaWYgKCRvYmplY3RUeXBlICE9ICJYTUxTZWNFbmMiICYmICRvYmplY3RUeXBlICE9ICJYTUxTZWN1cml0eURTaWciICYmICRvYmplY3RUeXBlICE9ICJYTUxTZWN1cml0eUtleSIgJiYgJG9iamVjdFR5cGUgIT0gIldTQVNvYXAiICYmICRvYmplY3RUeXBlICE9ICJXU1NFU29hcCIgJiYgJG9iamVjdFR5cGUgIT0gIldTU0VTb2FwU2VydmVyIiAmJiAkb2JqZWN0VHlwZSAhPSAiRUVUU29hcENsaWVudCIgJiYgJG9iamVjdFR5cGUgIT0gIlBQTEFQSSIgJiYgJG9iamVjdFR5cGUgIT0gIkRvd25sb2FkUHJveHlTZXJ2ZXIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRpbXBsZW1lbnRzID0gX19ldmFsKCJyZXR1cm4oVCIuJG9iamVjdFR5cGUuIjo6X19pbXBsZW1lbnRzKCkpOyIpOwogICAgICAgICAgICAgICAgICAgICRpbXBsZW1lbnRzID0gZXhwbG9kZUxpc3QoJGltcGxlbWVudHMpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkcGFyYW1zWyJpbXBsZW1lbnRzIl0sICRpbXBsZW1lbnRzKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfb2JqZWN0VHlwZXNbXSA9ICRvYmplY3RUeXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkb2JqZWN0VHlwZXMgPSAkX29iamVjdFR5cGVzOwogICAgICAgIH0KICAgICAgICAvL2R1bXAoJG9iamVjdFR5cGVzKTsKICAgICAgICAKICAgICAgICAvKgogICAgICAgICRfb2JqZWN0VHlwZXMgPSBleHBsb2RlTGlzdChnZXRPYmplY3RUeXBlcygpKTsKICAgICAgICBpZiAoJHBhcmFtc1siZXh0ZW5kcyJdKQogICAgICAgIHsKICAgICAgICAgICAgJG9iamVjdFR5cGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCgkX29iamVjdFR5cGVzIGFzICRvYmplY3RUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoIlQiLiRwYXJhbXNbImV4dGVuZHMiXSwgY2xhc3NfcGFyZW50cygiVCIuJG9iamVjdFR5cGUpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkb2JqZWN0VHlwZXNbXSA9ICRvYmplY3RUeXBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgJG9iamVjdFR5cGVzID0gJF9vYmplY3RUeXBlczsKICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAkcGFyYW1zWyJ2YWx1ZXMiXSA9IGV4cGxvZGVMaXN0KCRwYXJhbXNbInZhbHVlcyJdKTsKICAgICAgICAkcGFyYW1zWyJ0ZXh0cyJdID0gZXhwbG9kZUxpc3QoJHBhcmFtc1sidGV4dHMiXSk7CgogICAgICAgIC8vIHpydXNlbm8gLSBwb2t1ZCBzaSB6YWRhbSBob2Rub3R5LCB0YWsgY2hjaSBqZW4gdHl0bwogICAgICAgIC8vICRwYXJhbXNbInZhbHVlcyJdID0gYXJyYXlfbWVyZ2UoYXJyYXkoIiIpLCRvYmplY3RUeXBlcyk7CgogICAgICAgIGlmICghJHBhcmFtc1sidmFsdWVzIl0pCiAgICAgICAgICAgICRwYXJhbXNbInZhbHVlcyJdID0gYXJyYXlfbWVyZ2UoYXJyYXkoIiIpLCRvYmplY3RUeXBlcyk7CgogICAgICAgIGZvcmVhY2goJHBhcmFtc1sidmFsdWVzIl0gYXMgJF92YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRpY29uID0gIiI7CiAgICAgICAgICAgICRvYmplY3RUeXBlID0gJF92YWx1ZTsKICAgICAgICAgICAgd2hpbGUoJG9iamVjdFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCgkb2JqZWN0VHlwZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoZGlybmFtZShnZXRPYmplY3RQYXRoKCRvYmplY3RUeXBlKSkuIi8iLiRvYmplY3RUeXBlLiIuY2xhc3MucG5nIik7CiAgICAgICAgICAgICAgICBpZiAoX2ZpbGVfZXhpc3RzKFBST0pFQ1RQQVRILmRpcm5hbWUoZ2V0T2JqZWN0UGF0aCgkb2JqZWN0VHlwZSkpLiIvIi4kb2JqZWN0VHlwZS4iLmNsYXNzLnBuZyIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRpY29uID0gZ2V0T2JqZWN0VXJsKCRvYmplY3RUeXBlKS4kb2JqZWN0VHlwZS4iLmNsYXNzLnBuZyI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRvYmplY3RUeXBlID0gc3Vic3RyKGdldF9wYXJlbnRfY2xhc3MoIlQiLiRvYmplY3RUeXBlKSwgMSwgMTAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcmFtc1sidGV4dHMiXVtdID0gIjxpbWcgc3JjPSciLiRpY29uLiInIC8+Ii4kX3ZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcGFyYW1zWyJzb3J0Il0gPSB0cnVlOwogICAgICAgIHJldHVybihwYXJlbnQ6Om9uR2V0Q29udGVudCgkcGFyYW1zLCAkdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRUZXN0UGFyYW1zKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICAkcGFyYW1zID0gYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgICAgICJ2YWx1ZSIgPT4gIlRleHRFZGl0IiwKICAgICAgICApLCAkcGFyYW1zKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHBhcmFtcyk7CiAgICB9Cn0KCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGJMaW5rL0RiTGluay5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBURGJMaW5rIGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvbkdldFByb3BlcnRpZXMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSggICAgICAgIAogICAgICAgICAgICAibmFtZT1pZCxjYXB0aW9uPWlkLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNsZWFyKCkKICAgIHsKICAgICAgICAkdGhpcy0+ZmllbGRzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWRkaXRpb25hbEZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmZpbHRlcnMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5zb3J0ID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+bGltaXQgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5vZmZzZXQgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5ncm91cGluZyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmhhdmluZyA9IGFycmF5KCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2hlY2soKQogICAgewogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gbmVnYXRlTG9naWNhbE9wZXJhdG9yKCRvcGVyYXRvcikKICAgIHsKICAgICAgICBpZiAoJG9wZXJhdG9yID09ICJBTkQiKQogICAgICAgICAgICAkb3BlcmF0b3IgPSAiT1IiOwogICAgICAgIGVsc2UgaWYgKCRvcGVyYXRvciA9PSAiT1IiKSAgICAgICAgICAgIAogICAgICAgICAgICAkb3BlcmF0b3IgPSAiQU5EIjsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKCRvcGVyYXRvcik7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG5lZ2F0ZU9wZXJhdG9yKCRvcGVyYXRvcikKICAgIHsKICAgICAgICBpZiAoJG9wZXJhdG9yID09ICI9IikKICAgICAgICAgICAgJG9wZXJhdG9yID0gIiE9IjsKICAgICAgICBlbHNlIGlmICgkb3BlcmF0b3IgPT0gIiE9IikKICAgICAgICAgICAgJG9wZXJhdG9yID0gIj0iOwogICAgICAgIGVsc2UgaWYgKCRvcGVyYXRvciA9PSAiPj0iKQogICAgICAgICAgICAkb3BlcmF0b3IgPSAiPCI7CiAgICAgICAgZWxzZSBpZiAoJG9wZXJhdG9yID09ICI8PSIpCiAgICAgICAgICAgICRvcGVyYXRvciA9ICI+IjsKICAgICAgICBlbHNlIGlmICgkb3BlcmF0b3IgPT0gIj4iKQogICAgICAgICAgICAkb3BlcmF0b3IgPSAiPD0iOwogICAgICAgIGVsc2UgaWYgKCRvcGVyYXRvciA9PSAiPCIpCiAgICAgICAgICAgICRvcGVyYXRvciA9ICI+PSI7CiAgICAgICAgZWxzZSBpZiAoJG9wZXJhdG9yID09ICJMSUtFIikKICAgICAgICAgICAgJG9wZXJhdG9yID0gIk5PVCBMSUtFIjsKICAgICAgICBlbHNlIGlmICgkb3BlcmF0b3IgPT0gIk5PVCBMSUtFIikKICAgICAgICAgICAgJG9wZXJhdG9yID0gIkxJS0UiOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4oJG9wZXJhdG9yKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRGaWVsZHMoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKQogICAgewogICAgICAgIGlmICgkcGFyYW1zWyJmaWVsZHMiXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChfaXNfYXJyYXkoJHBhcmFtc1siZmllbGRzIl0pKQogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbImZpZWxkcyJdKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuKGV4cGxvZGVMaXN0KCRwYXJhbXNbImZpZWxkcyJdKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGFycmF5KCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEFkZGl0aW9uYWxGaWVsZHMoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKQogICAgewogICAgICAgIGlmICgkcGFyYW1zWyJhZGRpdGlvbmFsRmllbGRzIl0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoX2lzX2FycmF5KCRwYXJhbXNbImFkZGl0aW9uYWxGaWVsZHMiXSkpCiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1siYWRkaXRpb25hbEZpZWxkcyJdKTsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4oZXhwbG9kZUxpc3QoJHBhcmFtc1siYWRkaXRpb25hbEZpZWxkcyJdKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGFycmF5KCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldExpbWl0KCR0YWJsZVBhcmFtcywgJHBhcmFtcykKICAgIHsKICAgICAgICBpZiAoJHBhcmFtc1sibGltaXQiXSkKICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbImxpbWl0Il0pOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRpdGVtc1BlclBhZ2UgPSAoVEpTT046OmlzSlNPTigkcGFyYW1zWyJpdGVtc1BlclBhZ2UiXSkgPyBUSlNPTjo6ZGVjb2RlKCRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdKSA6IGV4cGxvZGVMaXN0KCRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJGl0ZW1zUGVyUGFnZSk7CiAgICAgICAgICAgIC8vZHVtcCgoaW50KSRpdGVtc1BlclBhZ2VbbWluKChpbnQpJHBhcmFtc1sicGFnZSJdLCBjb3VudCgkaXRlbXNQZXJQYWdlKS0xKV0pOwogICAgICAgICAgICByZXR1cm4oKGludCkkaXRlbXNQZXJQYWdlW21pbigoaW50KSRwYXJhbXNbInBhZ2UiXSwgY291bnQoJGl0ZW1zUGVyUGFnZSktMSldKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldE9mZnNldCgkdGFibGVQYXJhbXMsICRwYXJhbXMpCiAgICB7CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIGlmIChnZXRWaWV3VHlwZSgkcGFyYW1zKSAhPSAidnRGdWxsIikKICAgICAgICB7CiAgICAgICAgICAgICRyZXQgPSAwOwogICAgICAgICAgICBpZiAoJHBhcmFtc1sicGFnZSJdICYmICRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyRyZXQgKz0gJHBhcmFtc1siaXRlbXNQZXJQYWdlIl0qJHBhcmFtc1sicGFnZSJdOwogICAgICAgICAgICAgICAgJGl0ZW1zUGVyUGFnZSA9IChUSlNPTjo6aXNKU09OKCRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdKSA/IFRKU09OOjpkZWNvZGUoJHBhcmFtc1siaXRlbXNQZXJQYWdlIl0pIDogZXhwbG9kZUxpc3QoJHBhcmFtc1siaXRlbXNQZXJQYWdlIl0pKTsKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwIDsgJGkgPCBjb3VudCgkaXRlbXNQZXJQYWdlKSA7ICRpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpIDwgY291bnQoJGl0ZW1zUGVyUGFnZSktMSkKICAgICAgICAgICAgICAgICAgICAgICAgJHJldCArPSAkaXRlbXNQZXJQYWdlWyRpXTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgKz0gKCRwYXJhbXNbInBhZ2UiXS0kaSkqJGl0ZW1zUGVyUGFnZVskaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkcGFyYW1zWyJiZWdpbiJdKQogICAgICAgICAgICAgICAgJHJldCArPSAkcGFyYW1zWyJiZWdpbiJdOwoKICAgICAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybigwKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0U29ydCgkdGFibGVQYXJhbXMsICRwYXJhbXMpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXROYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgJHNvcnQgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJvcmRlckJ5Il0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXNbIm9yZGVyQnkiXSkpCiAgICAgICAgICAgICAgICAkb3JkZXJCeSA9IGV4cGxvZGVMaXN0KHN0cl9yZXBsYWNlKCIsIiwgInwiLCAkcGFyYW1zWyJvcmRlckJ5Il0pKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJG9yZGVyQnkgPSAkcGFyYW1zWyJvcmRlckJ5Il07CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJG9yZGVyQnkpOwogICAgICAgICAgICBmb3JlYWNoKCRvcmRlckJ5IGFzICRvcmRlckJ5SXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG9yZGVyQnlJdGVtID0gZXhwbG9kZSgiICIsICRvcmRlckJ5SXRlbSk7CiAgICAgICAgICAgICAgICBpZiAoc3RydG91cHBlcigkb3JkZXJCeUl0ZW1bY291bnQoJG9yZGVyQnlJdGVtKS0xXSkgIT0gIkFTQyIgJiYgc3RydG91cHBlcigkb3JkZXJCeUl0ZW1bY291bnQoJG9yZGVyQnlJdGVtKS0xXSkgIT0gIkRFU0MiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkb3JkZXJCeUl0ZW1bMF0gPT0gIlJBTkQoKSIpCiAgICAgICAgICAgICAgICAgICAgICAgICRvcmRlckJ5SXRlbVtdID0gIiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAkb3JkZXJCeUl0ZW1bXSA9IGZpcnN0X3ZhbHVlKCRwYXJhbXNbIm9yZGVyQnlEaXJlY3Rpb24iXSwgIkFTQyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkb3JkZXJCeURpcmVjdGlvbiA9IGFycmF5X3BvcCgkb3JkZXJCeUl0ZW0pOwogICAgICAgICAgICAgICAgJG9yZGVyQnlGaWVsZCA9IGltcGxvZGUoIiAiLCAkb3JkZXJCeUl0ZW0pOwoKICAgICAgICAgICAgICAgIGlmIChvYmplY3RFeGlzdHMoIlRhYmxlcyIpICYmIG9iamVjdEV4aXN0cygiRmllbGRzIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEZpZWxkID0gZ2V0VGFibGUoJHRhYmxlTmFtZSktPmdldEZpZWxkKCRvcmRlckJ5RmllbGQpOwogICAgICAgICAgICAgICAgICAgIGlmICgkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJEZpZWxkLT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRGaWVsZC0+Y3J5cHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEZpZWxkLT5jcnlwdCAmJiAhZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT50YWJsZUNyeXB0RGlzYWJsZWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcmRlckJ5RmllbGQgPSBnZXRPYmplY3QoIlRhYmxlQ3J5cHQiKS0+Z2V0RGVjcnlwdEZuYygkb3JkZXJCeUZpZWxkLCAkRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRvcmRlckJ5RmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHN0cnRvdXBwZXIoJG9yZGVyQnlEaXJlY3Rpb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJG9yZGVyQnlJdGVtID0gYXJyYXkoJG9yZGVyQnlGaWVsZCwgc3RydG91cHBlcigkb3JkZXJCeURpcmVjdGlvbikpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRvcmRlckJ5SXRlbSk7CiAgICAgICAgICAgICAgICAkc29ydFtdID0gJG9yZGVyQnlJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJHNvcnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4oJHNvcnQpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRHcm91cGluZygkdGFibGVQYXJhbXMsICRwYXJhbXMpCiAgICB7CiAgICAgICAgJGdyb3VwaW5nID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siZ3JvdXBCeSJdKQogICAgICAgIHsKICAgICAgICAgICAgJGdyb3VwQnkgPSBleHBsb2RlTGlzdCgkcGFyYW1zWyJncm91cEJ5Il0pOwogICAgICAgICAgICBmb3JlYWNoKCRncm91cEJ5IGFzICRncm91cEJ5SXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGdyb3VwaW5nW10gPSAkZ3JvdXBCeUl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRncm91cGluZyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0SGF2aW5nKCR0YWJsZVBhcmFtcywgJHBhcmFtcykKICAgIHsKICAgICAgICAkaGF2aW5nID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siaGF2aW5nIl0pCiAgICAgICAgewogICAgICAgICAgICAkaGF2aW5nTCA9IGV4cGxvZGVMaXN0KCRwYXJhbXNbImhhdmluZyJdKTsKICAgICAgICAgICAgZm9yZWFjaCgkaGF2aW5nTCBhcyAkaGF2aW5nSXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGhhdmluZ1tdID0gJGhhdmluZ0l0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRoYXZpbmcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEZpbHRlcnMoJHRhYmxlUGFyYW1zLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgICAgICAgICAvL2dsb2JhbCAkeHh4eDI7IGlmICgkeHh4eDIpIHsgZWNobyAiWFhYWFgiOyB2YXJfZHVtcCgkbmFtZSk7IHZhcl9kdW1wKCRwYXJhbXMpOyB2YXJfZHVtcCgkdmFsdWUpOyB2YXJfZHVtcCgkYW5kRmlsdGVyKTt9CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIC8vaWYgKCRwYXJhbXNbImZpbHRlcl9pbmRleCJdKQogICAgICAgIC8vICAgIGR1bXAoJHBhcmFtcyk7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXROYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCR0YWJsZU5hbWUpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvL2lmICh0YWJsZUZpZWxkc0V4aXN0cygkdGFibGVOYW1lKSkKICAgICAgICAvLyAgICAkVGFibGUgPSBnZXRUYWJsZSgkdGFibGVOYW1lKTsKCiAgICAgICAgLy9pZiAoJHRhYmxlTmFtZSA9PSAic2hvcF9jYXRhbG9ndWVfc3RvY2siKQogICAgICAgIC8vewogICAgICAgICAvLyAgIGR1bXAoIlgiKTsKICAgICAgICAgLy8gICBkdW1wKCRwYXJhbXMpOwogICAgICAgIC8vfQogICAgICAgIAogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICBpZiAoJHBhcmFtc1siZmlsdGVycyJdICYmIF9pc19hcnJheSgkcGFyYW1zWyJmaWx0ZXJzIl0pKQogICAgICAgICAgICAkZmlsdGVycyA9ICRwYXJhbXNbImZpbHRlcnMiXTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkZmlsdGVycyA9IGFycmF5KAogICAgICAgICAgICAgICAgIkFORCIgPT4gYXJyYXkoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9nbG9iYWwgJHh4eHgyOyBpZiAoJHh4eHgyICYmICR0YWJsZVBhcmFtcyA9PSAic2hvcF9jYXRhbG9ndWVfc3RvY2siKSB7dmFyX2R1bXAoJHRhYmxlUGFyYW1zKTsgdmFyX2R1bXAoJHBhcmFtcyk7IGV4aXQ7IH0KICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKFRKU09OOjppc0pTT04oJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdKSkKICAgICAgICAgICAgICAgICRwYXJhbXNbImNvbXBvbmVudEZpbHRlcnMiXSA9IFRKU09OOjpkZWNvZGUoJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgieCIpOwogICAgICAgICAgICAvL2R1bXAoX19jb252ZXJ0Q29tcG9uZW50RmlsdGVycygkcGFyYW1zWyJjb21wb25lbnRGaWx0ZXJzIl0pKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zWyJjb21wb25lbnRGaWx0ZXJzIl0pOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gYnlsbyB0byBwb3RyZWJhIHBvdXplIGt2dWxpIGZpbHRydW0gbmEgZGV0YWlsIHRhYnVsa2FjaCAtIHByZXN1bnV0byBkbyB1ZGFsb3N0aSBiZXJvcmVHZXRSZWNvcmRzCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICh0cnVlIHx8IGlzRGV2ZWxvcGVyKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCgnQScpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXNbImNvbXBvbmVudEZpbHRlcnMiXSk7CiAgICAgICAgICAgICAgICAkcGFyYW1zWyJjb21wb25lbnRGaWx0ZXJzIl0gPSBfX2NvbnZlcnRDb21wb25lbnRGaWx0ZXJzKCRwYXJhbXNbImNvbXBvbmVudEZpbHRlcnMiXSk7CiAgICAgICAgICAgICAgICAvL2dsb2JhbCAkeHh4OwogICAgICAgICAgICAgICAgLy9pZiAoJHh4eCkgZHVtcCgnWCcpOwogICAgICAgICAgICAgICAgLy9pZiAoJHh4eCkgZHVtcCgkcGFyYW1zWyJjb21wb25lbnRGaWx0ZXJzIl0pOwogICAgICAgICAgICAgICAgLy9kdW1wKCdCJyk7CiAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAvLyBkdW1wKCRwYXJhbXNbImNvbXBvbmVudEZpbHRlcnMiXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcGFyYW1zID0gJHRoaXMtPmNvbnZlcnRDb21wb25lbnRGaWx0ZXJzKCRwYXJhbXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXJhbXNbImRpc3BsYXlUeXBlIl0gJiYgISRwYXJhbXNbImZpbHRlcl9kaXNwbGF5VHlwZSJdKQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1siZmlsdGVyX2Rpc3BsYXlUeXBlIl0gPSAkcGFyYW1zWyJkaXNwbGF5VHlwZSJdOwogICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJkaXNwbGF5VHlwZSJdKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcGFyYW1zWyJpZCJdICE9ICIiKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCR0YWJsZU5hbWUpOwogICAgICAgICAgICAvL2R1bXAodGFibGVGaWVsZHNFeGlzdHMoJHRhYmxlTmFtZSkpOwogICAgICAgICAgICAvL2R1bXAoJHBhcmFtc1sicmF3Il0pOwogICAgICAgICAgICBpZiAodGFibGVMb2FkZWQoJHRhYmxlTmFtZSkgJiYgZ2V0VGFibGUoJHRhYmxlTmFtZSktPnByaW1hcnlLZXlGaWVsZCAhPSAiaWQiKQogICAgICAgICAgICAgICAgJGZpbHRlcnNbIkFORCJdW10gPSBhcnJheShnZXRUYWJsZSgkdGFibGVOYW1lKS0+cHJpbWFyeUtleUZpZWxkLCI9IiwkcGFyYW1zWyJpZCJdKTsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGZpbHRlcnNbIkFORCJdW10gPSBhcnJheSgiaWQiLCI9IiwkcGFyYW1zWyJpZCJdKTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJ0aWQiXSAhPSAiIikKICAgICAgICB7CiAgICAgICAgICAgICRmaWx0ZXJzWyJBTkQiXVtdID0gYXJyYXkoInRpZCIsIj0iLCRwYXJhbXNbInRpZCJdKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcGFyYW1zWyJwYXJlbnQiXSAhPSAiIikKICAgICAgICB7CiAgICAgICAgICAgICRvcGVyYXRvciA9ICI9IjsKICAgICAgICAgICAgaWYgKHRhYmxlRmllbGRzRXhpc3RzKCR0YWJsZU5hbWUpICYmICEkcGFyYW1zWyJyYXciXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJENvbXBvbmVudCA9IGdldFRhYmxlKCR0YWJsZU5hbWUpLT5nZXRDb21wb25lbnQoInBhcmVudCIpOwogICAgICAgICAgICAgICAgaWYgKCRDb21wb25lbnQgJiYgJENvbXBvbmVudC0+aXNNdWx0aXNlbGVjdENvbXBvbmVudCgpKQogICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICJMSUtFIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZhbHMgPSBleHBsb2RlTGlzdCgkcGFyYW1zWyJwYXJlbnQiXSk7CiAgICAgICAgICAgICRfdmFscyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJHZhbHMgYXMgJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJF92YWxzW10gPSBhcnJheSgicGFyZW50Iiwkb3BlcmF0b3IsJHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICRmaWx0ZXJzWyJBTkQiXVtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAiT1IiID0+ICRfdmFscwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXJhbXNbIm1pZCJdICE9ICIiKQogICAgICAgIHsKICAgICAgICAgICAgJG9wZXJhdG9yID0gIj0iOwogICAgICAgICAgICBpZiAodGFibGVGaWVsZHNFeGlzdHMoJHRhYmxlTmFtZSkgJiYgISRwYXJhbXNbInJhdyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ29tcG9uZW50ID0gZ2V0VGFibGUoJHRhYmxlTmFtZSktPmdldENvbXBvbmVudCgibWlkIik7CiAgICAgICAgICAgICAgICBpZiAoJENvbXBvbmVudCAmJiAkQ29tcG9uZW50LT5pc011bHRpc2VsZWN0Q29tcG9uZW50KCkpCiAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gIkxJS0UiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdmFscyA9IGV4cGxvZGVMaXN0KCRwYXJhbXNbIm1pZCJdKTsKICAgICAgICAgICAgJF92YWxzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCgkdmFscyBhcyAkdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX3ZhbHNbXSA9IGFycmF5KCJtaWQiLCRvcGVyYXRvciwkdmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJGZpbHRlcnNbIkFORCJdW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICJPUiIgPT4gJF92YWxzCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAodGFibGVFeGlzdHMoJHRhYmxlTmFtZSkgJiYgISRwYXJhbXNbInJhdyJdKQogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvICR0YWJsZU5hbWU7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoJHRhYmxlTmFtZSk7CgogICAgICAgICAgICBpZiAoJHBhcmFtc1sibWFzdGVyRmllbGRWYWx1ZSJdICYmICRUYWJsZS0+ZGV0YWlsRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICI9IjsKICAgICAgICAgICAgICAgIGlmICh0YWJsZUZpZWxkc0V4aXN0cygkdGFibGVOYW1lKSAmJiAhJHBhcmFtc1sicmF3Il0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJENvbXBvbmVudCA9IGdldFRhYmxlKCR0YWJsZU5hbWUpLT5nZXRDb21wb25lbnQoJFRhYmxlLT5kZXRhaWxGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRDb21wb25lbnQgJiYgJENvbXBvbmVudC0+aXNNdWx0aXNlbGVjdENvbXBvbmVudCgpKQogICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAiTElLRSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR2YWxzID0gZXhwbG9kZUxpc3QoJHBhcmFtc1sibWFzdGVyRmllbGRWYWx1ZSJdKTsKICAgICAgICAgICAgICAgICRfdmFscyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCR2YWxzIGFzICR2YWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJF92YWxzW10gPSBhcnJheSgkVGFibGUtPmRldGFpbEZpZWxkLCRvcGVyYXRvciwkdmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGZpbHRlcnNbIkFORCJdW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAiT1IiID0+ICRfdmFscwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siY29udGVudEZpbHRlcnMiXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0YWJsZUV4aXN0cygkdGFibGVOYW1lKSAmJiAkVGFibGUgJiYgJFRhYmxlLT5oYXNGaWVsZCgibGFuZ3VhZ2UiKSAmJiAhaW5fYXJyYXkoImxhbmd1YWdlIiwgZXhwbG9kZUxpc3QoJHBhcmFtc1siaWdub3JlZENvbnRlbnRGaWx0ZXJzIl0pKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJENvbXBvbmVudCA9IGdldFRhYmxlKCR0YWJsZU5hbWUpLT5nZXRDb21wb25lbnQoImxhbmd1YWdlIik7CgogICAgICAgICAgICAgICAgZ2xvYmFsICRsYW5ndWFnZTsKICAgICAgICAgICAgICAgICRmaWx0ZXJzWyJBTkQiXVtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgIk9SIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoImxhbmd1YWdlIiwgIj0iLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCJsYW5ndWFnZSIsICI9IiwgImFsbCIpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgibGFuZ3VhZ2UiLCAiPSIsICJOVUxMIiksCiAgICAgICAgICAgICAgICAgICAgICAgICgkQ29tcG9uZW50LT5pc011bHRpc2VsZWN0Q29tcG9uZW50KCkgPyBhcnJheSgibGFuZ3VhZ2UiLCAiTElLRSIsICIlIi4kbGFuZ3VhZ2UuIiUiKSA6IGFycmF5KCJsYW5ndWFnZSIsICI9IiwgJGxhbmd1YWdlKSksCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmICgkdGFibGVOYW1lID09ICJjYXRlZ29yaWVzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfbG9nKCRDb21wb25lbnQtPmlzTXVsdGlzZWxlY3RDb21wb25lbnQoKSk7CiAgICAgICAgICAgICAgICAgICAgX2xvZygkQ29tcG9uZW50LT5wYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIF9sb2coJGZpbHRlcnNbIkFORCJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghQURNSU4gJiYgdGFibGVGaWVsZHNFeGlzdHMoJHRhYmxlTmFtZSkgJiYgJFRhYmxlICYmICRUYWJsZS0+aGFzRmllbGQoImRpc3BsYXlUeXBlIikgJiYgIWluX2FycmF5KCJkaXNwbGF5VHlwZSIsIGV4cGxvZGVMaXN0KCRwYXJhbXNbImlnbm9yZWRDb250ZW50RmlsdGVycyJdKSkgJiYgISRwYXJhbXNbImZpbHRlcl9kaXNwbGF5VHlwZSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyRmaWx0ZXJzWyJBTkQiXVtdID0gYXJyYXkoImRpc3BsYXlUeXBlIiwiPSIsImR0RGlzcGxheSIpOwoKICAgICAgICAgICAgICAgICRfZmlsdGVycyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAkX2ZpbHRlcnNbXSA9IGFycmF5KCJkaXNwbGF5VHlwZSIsIj0iLCJkdERpc3BsYXkiKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBpZiAoaXNBZG1pbmlzdHJhdG9yKCkpCiAgICAgICAgICAgICAgICAgICAgJF9maWx0ZXJzW10gPSBhcnJheSgiZGlzcGxheVR5cGUiLCI9IiwiZHREaXNwbGF5QWRtaW4iKTsKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJpZCJdKQogICAgICAgICAgICAgICAgICAgICRfZmlsdGVyc1tdID0gYXJyYXkoImRpc3BsYXlUeXBlIiwiPSIsImR0RGlzcGxheUZ1bGwiKTsKICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRmaWx0ZXJzWyJBTkQiXVtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgIk9SIiA9PiAkX2ZpbHRlcnMsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFRhYmxlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbInNlYXJjaCJdIHx8ICRwYXJhbXNbImZ1bGx0ZXh0Il0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJzZWFyY2giXSAmJiBzdHJsZW4oJHBhcmFtc1sic2VhcmNoIl0pIDwgMykKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJzZWFyY2giXSA9ICJfX1NFQVJDSF9TVFJJTkdfVE9PX1NIT1JUX18iOwogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImZ1bGx0ZXh0Il0gJiYgc3RybGVuKCRwYXJhbXNbImZ1bGx0ZXh0Il0pIDwgMykKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJmdWxsdGV4dCJdID0gIl9fRlVMTFRFWFRfU1RSSU5HX1RPT19TSE9SVF9fIjsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRmaWx0ZXIgPSBhcnJheSgiT1IiID0+IGFycmF5KCkpOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJzZWFyY2giXSAhPSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkc2VhcmNoRmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKGV4cGxvZGVMaXN0KCRwYXJhbXNbInNlYXJjaEZpZWxkcyJdKSBhcyAkc2VhcmNoRmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlLT5oYXNGaWVsZCgkc2VhcmNoRmllbGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlYXJjaEZpZWxkc1tdID0gJFRhYmxlLT5nZXRGaWVsZCgkc2VhcmNoRmllbGQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISRzZWFyY2hGaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgICRzZWFyY2hGaWVsZHMgPSAkVGFibGUtPmdldEZpZWxkcygpOwoKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRzZWFyY2hGaWVsZHMgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZC0+dGFibGVOYW1lID09ICRUYWJsZS0+bmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZC0+aXNWaXJ0dWFsKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZC0+c3FsVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJbIk9SIl1bXSA9IGFycmF5KCIoIi4kRmllbGQtPnNxbFZhbHVlLiIpIiwiTElLRSIsJHBhcmFtc1sic2VhcmNoIl0sICRGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkRmllbGQtPmlzVGV4dEZpZWxkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlclsiT1IiXVtdID0gYXJyYXkoJEZpZWxkLT5zcWxOYW1lLCJMSUtFIiwkcGFyYW1zWyJzZWFyY2giXSwgJEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkRmllbGQtPmNyeXB0ICYmICFnZXRPYmplY3QoIlNldHRpbmdzIiktPnRhYmxlQ3J5cHREaXNhYmxlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAkZmlsdGVyWyJPUiJdW10gPSBhcnJheSgkRmllbGQtPnNxbE5hbWUsIkxJS0UiLGdldE9iamVjdCgiVGFibGVDcnlwdCIpLT5lbmNyeXB0KCRwYXJhbXNbInNlYXJjaCJdLCAkRmllbGQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29tcG9uZW50ID0gJFRhYmxlLT5nZXRDb21wb25lbnQoJEZpZWxkLT5uYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjAyMiAtIHRlc3Rpbmcgb25seSBmb3IgYWRtaW4gbm93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRDb21wb25lbnQtPmlzTG9va3VwQ29tcG9uZW50KCkgJiYgdG9Cb29sKCRwYXJhbXNbImxvb2t1cFNlYXJjaCJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfRmllbGQgPSAkRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfVGFibGUgPSAkVGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX1RhYmxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF90YWJsZU5hbWUgPSAkVGFibGUtPm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX1RhYmxlLT5leHRlbmRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhYmxlU3FsTmFtZSA9IGdldFRhYmxlKCRfVGFibGUtPmV4dGVuZHMpLT5zcWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFibGVTcWxOYW1lID0gJF9UYWJsZS0+c3FsTmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfbG9va3VwUGFyYW1zID0gJF9GaWVsZC0+Z2V0Q29tcG9uZW50UGFyYW1zKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfbG9va3VwRmllbGROYW1lID0gJF9sb29rdXBQYXJhbXNbInRleHRGaWVsZCJdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfbG9va3VwUGFyYW1zWyJ0YWJsZSJdICYmICRfbG9va3VwUGFyYW1zWyJ2YWx1ZUZpZWxkIl0gJiYgJF9sb29rdXBQYXJhbXNbInRleHRGaWVsZCJdICYmIHN0cnBvcygkX2xvb2t1cFBhcmFtc1sidGV4dEZpZWxkIl0sICJbIikgPT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJEZpZWxkLT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9Mb29rdXBUYWJsZSA9IGdldFRhYmxlKCRfbG9va3VwUGFyYW1zWyJ0YWJsZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTG9va3VwRmllbGQgPSAkX0xvb2t1cFRhYmxlLT5nZXRGaWVsZCgkX2xvb2t1cEZpZWxkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX0xvb2t1cFZhbHVlRmllbGQgPSAkX0xvb2t1cFRhYmxlLT5nZXRGaWVsZCgkX2xvb2t1cFBhcmFtc1sidmFsdWVGaWVsZCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfTG9va3VwVGFibGUtPmV4dGVuZHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvb2t1cFRhYmxlU3FsTmFtZSA9IGdldFRhYmxlKCRfTG9va3VwVGFibGUtPmV4dGVuZHMpLT5zcWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJF9Mb29rdXBUYWJsZS0+c3FsTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va3VwVGFibGVTcWxOYW1lID0gJF9Mb29rdXBUYWJsZS0+c3FsTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va3VwVGFibGVTcWxOYW1lID0gJF9sb29rdXBQYXJhbXNbInRhYmxlIl07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9sb29rdXBGaWVsZFJlcGxhY2VtZW50ID0gIihTRUxFQ1QgIi4oJF9Mb29rdXBGaWVsZCA/ICRfTG9va3VwRmllbGQtPnNxbE5hbWUgOiAkX2xvb2t1cEZpZWxkTmFtZSkuIiBGUk9NICIuJGxvb2t1cFRhYmxlU3FsTmFtZS4iIFdIRVJFICIuJHRhYmxlU3FsTmFtZS4iLiIuKCRfRmllbGQgPyAkX0ZpZWxkLT5zcWxOYW1lIDogJF9maWVsZE5hbWUpLiI9Ii4kbG9va3VwVGFibGVTcWxOYW1lLiIuIi4oJF9Mb29rdXBWYWx1ZUZpZWxkID8gJF9Mb29rdXBWYWx1ZUZpZWxkLT5zcWxOYW1lIDogJF9sb29rdXBQYXJhbXNbInZhbHVlRmllbGQiXSkuIiBMSU1JVCAxKSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJF9sb29rdXBGaWVsZFJlcGxhY2VtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyWyJPUiJdW10gPSBhcnJheSgkX2xvb2t1cEZpZWxkUmVwbGFjZW1lbnQsIkxJS0UiLCRwYXJhbXNbInNlYXJjaCJdLCAkRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2hvd01lc3NhZ2UoImZpbHRlcl9sb29rdXBGaWVsZDo6cmVtb3RlRmllbGQgZXJyb3IiLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJEZpZWxkLT5pc051bWJlckZpZWxkKCkgJiYgcHJlZ19tYXRjaCgifF5bMC05XFwuXStcJHwiLCAkcGFyYW1zWyJzZWFyY2giXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlclsiT1IiXVtdID0gYXJyYXkoJEZpZWxkLT5zcWxOYW1lLCI9IiwkcGFyYW1zWyJzZWFyY2giXSwgJEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRGaWVsZC0+aXNWaXJ0dWFsKCkgJiYgJEZpZWxkLT50YWJsZU5hbWUgPT0gJFRhYmxlLT5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEZpZWxkLT5pc1RleHRGaWVsZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJbIk9SIl1bXSA9IGFycmF5KCRGaWVsZC0+c3FsTmFtZSwiTElLRSIsJHBhcmFtc1sic2VhcmNoIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJEZpZWxkLT5pc051bWJlckZpZWxkKCkgJiYgcHJlZ19tYXRjaCgifF5bMC05XFwuXStcJHwiLCAkcGFyYW1zWyJzZWFyY2giXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlclsiT1IiXVtdID0gYXJyYXkoJEZpZWxkLT5zcWxOYW1lLCI9IiwkcGFyYW1zWyJzZWFyY2giXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJmdWxsdGV4dCJdICE9ICIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRzZWFyY2hGaWVsZHMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goZXhwbG9kZUxpc3QoJHBhcmFtc1siZnVsbHRleHRGaWVsZHMiXSkgYXMgJHNlYXJjaEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUYWJsZS0+aGFzRmllbGQoJHNlYXJjaEZpZWxkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWFyY2hGaWVsZHNbXSA9ICRUYWJsZS0+Z2V0RmllbGQoJHNlYXJjaEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkc2VhcmNoRmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICAkc2VhcmNoRmllbGRzID0gJFRhYmxlLT5nZXRGaWVsZHMoKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJFRhYmxlLT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRzZWFyY2hGaWVsZHMgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXNbImZ1bGx0ZXh0Il0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRGaWVsZC0+aXNWaXJ0dWFsKCkgJiYgJEZpZWxkLT5pc1RleHRGaWVsZCgpICYmICRGaWVsZC0+ZnVsbHRleHQgJiYgJEZpZWxkLT50YWJsZU5hbWUgPT0gJFRhYmxlLT5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyWyJPUiJdW10gPSBhcnJheSgkRmllbGQtPnNxbE5hbWUsIkZVTExURVhUIiwkcGFyYW1zWyJmdWxsdGV4dCJdLCAkRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoJEZpZWxkLT5jcnlwdCAmJiAhZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT50YWJsZUNyeXB0RGlzYWJsZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICRmaWx0ZXJbIk9SIl1bXSA9IGFycmF5KCRGaWVsZC0+c3FsTmFtZSwiRlVMTFRFWFQiLGdldE9iamVjdCgiVGFibGVDcnlwdCIpLT5lbmNyeXB0KCRwYXJhbXNbImZ1bGx0ZXh0Il0sICRGaWVsZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCR0YWJsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCh0YWJsZUZpZWxkc0V4aXN0cygkdGFibGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRmaWx0ZXJzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGNvdW50KCRmaWx0ZXJbIk9SIl0pKQogICAgICAgICAgICAgICAgJGZpbHRlcnNbIkFORCJdW10gPSAkZmlsdGVyOwogICAgICAgIH0KCiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICRmaWx0ZXJGaWVsZHMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJG5hbWUpOwogICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgJF9maWVsZFRhYmxlTmFtZSA9ICIiOwogICAgICAgICAgICAkX2ZpZWxkTmFtZSA9ICIiOwogICAgICAgICAgICAkX3RhYmxlTmFtZSA9ICIiOwogICAgICAgICAgICAkX1RhYmxlID0gTlVMTDsKICAgICAgICAgICAgJF9GaWVsZCA9IE5VTEw7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBjaGFuZ2VkIHRvIGVuYWJsZSBPUiBpbiBmaWx0ZXJfbmFtZTF8bmFtZTIgPSB2YWx1ZXMKICAgICAgICAgICAgaWYgKHN0cnBvcygkbmFtZSwgImZpbHRlcl8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKCRuYW1lKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmIChpc19ib29sKCR2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gdG8gZW5hYmxlIEFORCBzZXBhcmF0ZSBmaWx0ZXJzCiAgICAgICAgICAgICAgICAkYW5kRmlsdGVyID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkYW5kRmlsdGVyW10gPSB0b1N0cmluZyhzdHJfcmVwbGFjZSgiX19SQVdWQUxVRV9fIiwgIiIsICR2YWx1ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsdWVbIkFORCJdKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhbmRGaWx0ZXIgPSBhcnJheV92YWx1ZXMoJHZhbHVlWyJBTkQiXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfZmllbGROYW1lID0gc3RyX3JlcGxhY2UoImZpbHRlcl8iLCAiIiwgJG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgaXNfYXJyYXkoJHBhcmFtc1siZmlsdGVyT3BlcmF0b3JfIi4kX2ZpZWxkTmFtZV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFuZEZpbHRlcltdID0gaW1wbG9kZSgifCIsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhbmRGaWx0ZXJbXSA9IGltcGxvZGVMaXN0KCR2YWx1ZSk7IC8vaW1wbG9kZSgifCIsICR2YWx1ZSk7ICAvLyBkb250IHVzZSBpbXBsb2RlTGlzdCAtIGl0IHJlbW92ZXMgZW1wdHkgaXRlbXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vJGFuZEZpbHRlcltdID0gJHZhbHVlOyAvL2ltcGxvZGUoInwiLCAkdmFsdWUpOyAgLy8gZG9udCB1c2UgaW1wbG9kZUxpc3QgLSBpdCByZW1vdmVzIGVtcHR5IGl0ZW1zCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9nbG9iYWwgJHh4eHgyOyBpZiAoJHh4eHgyICYmICRwYXJhbXNbImZpbHRlcl9vcHRpb25zIl0vKnN0cnBvcygkbmFtZSwgIm9wdGlvbnMiKSAhPT0gRkFMU0UqLykgeyBlY2hvICJYWFhYWCI7IHZhcl9kdW1wKCRuYW1lKTsgdmFyX2R1bXAoJHBhcmFtcyk7IHZhcl9kdW1wKCR2YWx1ZSk7IHZhcl9kdW1wKCRhbmRGaWx0ZXIpOyBleGl0O30KCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZHVtcCgkYW5kRmlsdGVyKTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRhbmRGaWx0ZXIgYXMgJHZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgIT09ICIiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kX2ZpZWxkTmFtZSA9IHN0cl9yZXBsYWNlKCJmaWx0ZXJfIiwgIiIsICRuYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRfZmllbGROYW1lcyA9IGV4cGxvZGVMaXN0KHN0cl9yZXBsYWNlKCJmaWx0ZXJfIiwgIiIsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9maWVsZE5hbWVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyc09SID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9maWVsZE5hbWVzIGFzICRfZmllbGROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfbG9va3VwRmllbGROYW1lID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9sb29rdXBGaWVsZFJlcGxhY2VtZW50ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRfZmllbGROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRfZmllbGROYW1lLCAiLiIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfZmllbGROYW1lID0gZXhwbG9kZSgiLiIsICRfZmllbGROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF90YWJsZU5hbWUgPSAkX2ZpZWxkTmFtZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9maWVsZE5hbWUgPSAkX2ZpZWxkTmFtZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRfZmllbGROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9maWVsZFRhYmxlTmFtZSA9ICRfdGFibGVOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJwb3MoJF9maWVsZE5hbWUsICI6OiIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfZmllbGROYW1lID0gZXhwbG9kZSgiOjoiLCAkX2ZpZWxkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfdGFibGVOYW1lID0gJHRhYmxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9sb29rdXBGaWVsZE5hbWUgPSAkX2ZpZWxkTmFtZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9maWVsZE5hbWUgPSAkX2ZpZWxkTmFtZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3RhYmxlTmFtZSA9ICR0YWJsZU5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCEkX3RhYmxlTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAkX3RhYmxlTmFtZSA9ICR0YWJsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlRmllbGRzRXhpc3RzKCRfdGFibGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfRmllbGQgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9UYWJsZSA9IGdldFRhYmxlKCRfdGFibGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfVGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX0ZpZWxkID0gJF9UYWJsZS0+Z2V0RmllbGQoJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBjYWxsIERiTGluayB0byBnZXQgU0VMRUNUIHF1ZXJ5IG9ubHkgLSB0aGlzIGFsc28gY2FuIHdvcmsgb25seSBvbiBTUUwgZGF0YXNldHMgKG9yIG1heWJlIGxhdGVyIHNvbWUgZW11bGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9sb29rdXBGaWVsZE5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfbG9va3VwUGFyYW1zID0gJF9GaWVsZC0+Z2V0Q29tcG9uZW50UGFyYW1zKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9sb29rdXBQYXJhbXNbInRhYmxlIl0gJiYgJF9sb29rdXBQYXJhbXNbInZhbHVlRmllbGQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX0xvb2t1cFRhYmxlID0gZ2V0VGFibGUoJF9sb29rdXBQYXJhbXNbInRhYmxlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfTG9va3VwRmllbGQgPSAkX0xvb2t1cFRhYmxlLT5nZXRGaWVsZCgkX2xvb2t1cEZpZWxkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9Mb29rdXBWYWx1ZUZpZWxkID0gJF9Mb29rdXBUYWJsZS0+Z2V0RmllbGQoJF9sb29rdXBQYXJhbXNbInZhbHVlRmllbGQiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfTG9va3VwVGFibGUtPmV4dGVuZHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rdXBUYWJsZVNxbE5hbWUgPSBnZXRUYWJsZSgkX0xvb2t1cFRhYmxlLT5leHRlbmRzKS0+c3FsTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkX0xvb2t1cFRhYmxlLT5zcWxOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va3VwVGFibGVTcWxOYW1lID0gJF9Mb29rdXBUYWJsZS0+c3FsTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rdXBUYWJsZVNxbE5hbWUgPSAkX2xvb2t1cFBhcmFtc1sidGFibGUiXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9sb29rdXBGaWVsZFJlcGxhY2VtZW50ID0gIihTRUxFQ1QgIi4oJF9Mb29rdXBGaWVsZCA/ICRfTG9va3VwRmllbGQtPnNxbE5hbWUgOiAkX2xvb2t1cEZpZWxkTmFtZSkuIiBGUk9NICIuJGxvb2t1cFRhYmxlU3FsTmFtZS4iIFdIRVJFICIuKCRfVGFibGUtPnNxbE5hbWUgPyAkX1RhYmxlLT5zcWxOYW1lIDogJF90YWJsZU5hbWUpLiIuIi4oJF9GaWVsZCA/ICRfRmllbGQtPnNxbE5hbWUgOiAkX2ZpZWxkTmFtZSkuIj0iLiRsb29rdXBUYWJsZVNxbE5hbWUuIi4iLigkX0xvb2t1cFZhbHVlRmllbGQgPyAkX0xvb2t1cFZhbHVlRmllbGQtPnNxbE5hbWUgOiAkX2xvb2t1cFBhcmFtc1sidmFsdWVGaWVsZCJdKS4iKSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoImZpbHRlcl9sb29rdXBGaWVsZDo6cmVtb3RlRmllbGQgZXJyb3IiLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1sicmF3Il0gfHwgIXRhYmxlRmllbGRzRXhpc3RzKCRfdGFibGVOYW1lKSB8fCAoJF9GaWVsZCAmJiAoJF9GaWVsZC0+ZGF0YVR5cGUgfHwgJF9GaWVsZC0+c3FsVmFsdWUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlcyA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxPcGVyYXRvciA9ICJPUiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2lzX2FycmF5KCR2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCJcXCYiLCAiW05PVF9SRUFMX0FORF0iLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoIlxcfCIsICJbTk9UX1JFQUxfT1JdIiwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCR2YWx1ZSwgIiYiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlcyA9IGV4cGxvZGUoIiYiLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsT3BlcmF0b3IgPSAiQU5EIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVzID0gZXhwbG9kZSgifCIsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkX2tleSA9PiAkX3ZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVzWyRfa2V5XSA9IHN0cl9yZXBsYWNlKCJbTk9UX1JFQUxfQU5EXSIsICImIiwgJHZhbHVlc1skX2tleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZXNbJF9rZXldID0gc3RyX3JlcGxhY2UoIltOT1RfUkVBTF9PUl0iLCAifCIsICR2YWx1ZXNbJF9rZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkdmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImZpbHRlckxvZ2ljYWxPcGVyYXRvcl8iLiRfZmllbGROYW1lXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxPcGVyYXRvciA9IHN0cnRvdXBwZXIoJHBhcmFtc1siZmlsdGVyTG9naWNhbE9wZXJhdG9yXyIuJF9maWVsZE5hbWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfZmlsdGVycyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpcnN0T3BlcmF0b3IgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIGZvciBkYXRlIGZpbHRlcl9kYXRlWzBdLCBmaWx0ZXJfZGF0ZVsxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTaW1wbGVBcnJheSgkdmFsdWVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgkdmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaChhcnJheV9rZXlzKCR2YWx1ZXMpIGFzICRrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heCA9IG1heCgkbWF4LCAka2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8ICRtYXggOyAkaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJHZhbHVlc1skaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVzWyRpXSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgkdmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkX3ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9fdmFsdWUgPSAkX3ZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX192YWx1ZSAhPSAiIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gJHRoaXMtPmV4dHJhY3RPcGVyYXRvcigkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCI9PSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRvcGVyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkb3BlcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siZmlsdGVyT3BlcmF0b3JfIi4kX2ZpZWxkTmFtZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICRwYXJhbXNbImZpbHRlck9wZXJhdG9yXyIuJF9maWVsZE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRvcGVyYXRvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gJG9wZXJhdG9yWyRpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJG9wZXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkb3BlcmF0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAkZmlyc3RPcGVyYXRvcjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJG9wZXJhdG9yICYmIHRhYmxlRmllbGRzRXhpc3RzKCR0YWJsZU5hbWUpICYmICEkcGFyYW1zWyJyYXciXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENvbXBvbmVudCA9IGdldFRhYmxlKCR0YWJsZU5hbWUpLT5nZXRDb21wb25lbnQoJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRDb21wb25lbnQgJiYgJENvbXBvbmVudC0+aXNNdWx0aXNlbGVjdENvbXBvbmVudCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICJNTElLRSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJG9wZXJhdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gIj0iOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3RPcGVyYXRvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaXJzdE9wZXJhdG9yID0gJG9wZXJhdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRmaXJzdE9wZXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRvcGVyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJF92YWx1ZSwgIioiKSAhPT0gRkFMU0UgfHwgc3RycG9zKCRfdmFsdWUsICIlIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfdmFsdWUgPSBzdHJfcmVwbGFjZSgiKiIsICIlIiwgJF92YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJpbShzdHJfcmVwbGFjZSgiJSIsICIiLCAkX3ZhbHVlKSkgPT0gIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09ICIhPSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gIk5PVCBMSUtFIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrdnVsaSBkaXNhYmxlZENvdW50cmllcyB1IGRvcHJhdnkganNlbSB0b3RvIG11c2VsIHpydXNpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsT3BlcmF0b3IgPSAiQU5EIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAiTElLRSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJG9wZXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3ZhbHVlID09ICJGSUxURVJfRU1QVFkiIHx8ICRfdmFsdWUgPT0gIk5VTEwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9GaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHRoaXMtPmdldERlZmF1bHRWYWx1ZSgkRmllbGQtPnBhcmFtcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfdmFsdWUgPSAkdGhpcy0+Z2V0RGVmYXVsdFZhbHVlKCRfRmllbGQtPnBhcmFtcyk7IC8vIDAgZm9yIElOVCwgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kX3ZhbHVlID0gIiI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfdmFsdWUgPSAiTlVMTCI7IC8vIGt2dWxpIGJhbm5lcnVtIGRhdGVTdGFydCAodWNobzI0LmN6KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF92YWx1ZSA9PSAiRklMVEVSX0FOWSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfdmFsdWUgPSAiIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAiIT0iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09ICIhPSIgfHwgJG9wZXJhdG9yID09ICJOT1QgTElLRSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbE9wZXJhdG9yID0gIkFORCI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfRmllbGQgJiYgISRwYXJhbXNbInJhdyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29tcG9uZW50ID0gZ2V0VGFibGUoJF90YWJsZU5hbWUpLT5nZXRDb21wb25lbnQoJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6bWVuZW5vIGF0IHRvIGRlbGEgdnpkeSAtIHByb3RvemUgcHJpIHphZGF2YW5pIGNvbXBvbmVudEZpbHRlcnMgbGlkaSBtdXpvdSBkYXQgIT0gbWlzdG8gTk9UIExJS0UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZ5dXppdmF0IHUgYXBwZW5kQ29uZGl0aW9ucyB1IHBvdWthenUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQ29tcG9uZW50ICYmICRDb21wb25lbnQtPmlzTXVsdGlzZWxlY3RDb21wb25lbnQoKSAvKiYmICEkcGFyYW1zWyJmaWx0ZXJPcGVyYXRvcl8iLiRfZmllbGROYW1lXSovICYmICR2YWx1ZSAhPSAiTlVMTCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkb3BlcmF0b3IgfHwgJG9wZXJhdG9yID09ICI9IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gIkxJS0UiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRvcGVyYXRvciA9PSAiIT0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gIk5PVCBMSUtFIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxPcGVyYXRvciA9ICJBTkQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJF9maWx0ZXJzW10gPSBhcnJheSgoJFRhYmxlLT5leHRlbmRzID8gKGdldFRhYmxlKCRUYWJsZS0+ZXh0ZW5kcyktPnNxbE5hbWUgPyBnZXRUYWJsZSgkVGFibGUtPmV4dGVuZHMpLT5zcWxOYW1lIDogJFRhYmxlLT5leHRlbmRzKSA6ICgkVGFibGUgPyAkVGFibGUtPnNxbE5hbWUgOiAkdGFibGVOYW1lKSkuIi4iLigkRmllbGQgPyAkRmllbGQtPnNxbE5hbWUgOiAkZmllbGROYW1lKSwkb3BlcmF0b3IsJF92YWx1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9GaWVsZCAmJiAhJHBhcmFtc1sicmF3Il0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDb21wb25lbnQgPSBnZXRUYWJsZSgkX3RhYmxlTmFtZSktPmdldENvbXBvbmVudCgkX2ZpZWxkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJENvbXBvbmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3ZhbHVlID0gJENvbXBvbmVudC0+Z2V0RmlsdGVyVmFsdWUoJF92YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgPT0gIkxJS0UiIHx8ICRvcGVyYXRvciA9PSAiTk9UIExJS0UiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF92YWx1ZSAmJiBzdHJwb3MoJF92YWx1ZSwgIiUiKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF92YWx1ZSA9ICIlIi4kX3ZhbHVlLiIlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9nbG9iYWwgJHh4eHgyOyBpZiAoJHh4eHgyKSB7IHZhcl9kdW1wKCRvcGVyYXRvcik7IGV4aXQ7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCR0YWJsZU5hbWUgPT0gInNob3BfY2F0YWxvZ3VlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRwYXJhbXMpO2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfbG9va3VwRmllbGRSZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfX2xlZnRTaWRlID0gJF9sb29rdXBGaWVsZFJlcGxhY2VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkX0ZpZWxkLT5zcWxWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfX2xlZnRTaWRlID0gJF9GaWVsZC0+c3FsVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9fbGVmdFNpZGUgPSAoJF9UYWJsZSAmJiAkX2ZpZWxkVGFibGVOYW1lID8gKGdldFRhYmxlKCRfZmllbGRUYWJsZU5hbWUpLT5zcWxOYW1lID8gZ2V0VGFibGUoJF9maWVsZFRhYmxlTmFtZSktPnNxbE5hbWUgOiAkX2ZpZWxkVGFibGVOYW1lKS4iLiIgOiAiIikuKCRfRmllbGQgPyAkX0ZpZWxkLT5zcWxOYW1lIDogJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImZpbHRlckZ1bmN0aW9uXyIuJF9maWVsZE5hbWVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfX2xlZnRTaWRlID0gJHBhcmFtc1siZmlsdGVyRnVuY3Rpb25fIi4kX2ZpZWxkTmFtZV0uIigiLiRfX2xlZnRTaWRlLiIpIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJF9fbGVmdFNpZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCItIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX192YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0Jvb2woJHBhcmFtc1siZmlsdGVyTmVnYXRlXyIuJF9maWVsZE5hbWVdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICR0aGlzLT5uZWdhdGVPcGVyYXRvcigkb3BlcmF0b3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTklLRFkhISEgbmVwb2RtaW5rb3ZhdCBobGVkYW0gdHJlYmEgcGFyZW50PScnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCRfdmFsdWUgIT09ICIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRvcGVyYXRvciA9PSAiTUxJS0UiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRvcGVyYXRvciA9ICJSRUdFWFAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgd29yayBvbiBuZWdhdGUgb3BlcmF0b3IgYW5kIG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJF9maWx0ZXJzW10gPSBhcnJheSgkX19sZWZ0U2lkZSwiPSIsJF92YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRfZmlsdGVyc1tdID0gYXJyYXkoJF9fbGVmdFNpZGUsIlJFR0VYUCIsIl4iLiRfdmFsdWUuInwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJF9maWx0ZXJzW10gPSBhcnJheSgkX19sZWZ0U2lkZSwiUkVHRVhQIiwifCIuJF92YWx1ZS4iXCQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJF9maWx0ZXJzW10gPSBhcnJheSgkX19sZWZ0U2lkZSwiTElLRSIsIiV8Ii4kX3ZhbHVlLiJ8JSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdmFsdWUgPT0gIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfdmFsdWUgPSAkdGhpcy0+Z2V0RGVmYXVsdFZhbHVlKCRfRmllbGQtPnBhcmFtcyk7IC8vIDAgZm9yIElOVCwgLi4uCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3ZhbHVlID09ICIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF92YWx1ZSA9ICJOVUxMIjsgLy8ga3Z1bGkgYmFubmVydW0gZGF0ZVN0YXJ0ICh1Y2hvMjQuY3opCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3ZhbHVlID09ICJOVUxMIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2ZpbHRlcnNbXSA9IGFycmF5KCRfX2xlZnRTaWRlLCI9IiwkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JFR0VYUCBpcyBleHRyZW1lbHkgc2xvdyAtIHVzZSBvbmx5IGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VVSUQoJF92YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfZmlsdGVyc1tdID0gYXJyYXkoJF9fbGVmdFNpZGUsIkxJS0UiLCIlIi4kX3ZhbHVlLiIlIiwgJF9GaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2ZpbHRlcnNbXSA9IGFycmF5KCRfX2xlZnRTaWRlLCJSRUdFWFAiLCIoXnxcXHwpIi4kX3ZhbHVlLiIoXFx8fFwkKSIsICRfRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9maWx0ZXJzW10gPSBhcnJheSgkX19sZWZ0U2lkZSwkb3BlcmF0b3IsJF92YWx1ZSwgJF9GaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGFycmF5KCRfX2xlZnRTaWRlLCRvcGVyYXRvciwkX3ZhbHVlKSk7ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNob3dNZXNzYWdlKCJURGJMaW5rOjpnZXRGaWx0ZXJzKCkgLSB2YWx1ZSBpcyBhcnJheSAiLnN0cl9kdW1wKCR2YWx1ZSksIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkX2ZpbHRlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmb3JjZSBpdCwgdXNlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJmaWx0ZXJMb2dpY2FsT3BlcmF0b3JfIi4kX2ZpZWxkTmFtZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsT3BlcmF0b3IgPSBzdHJ0b3VwcGVyKCRwYXJhbXNbImZpbHRlckxvZ2ljYWxPcGVyYXRvcl8iLiRfZmllbGROYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCgkX2ZpbHRlcnMpID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlcnMyID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9maWx0ZXJzIGFzICRfZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJGZpbHRlcnMyWyJPUiJdW10gPSAkX2ZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9Cb29sKCRwYXJhbXNbImZpbHRlck5lZ2F0ZV8iLiRfZmllbGROYW1lXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJzMlskdGhpcy0+bmVnYXRlTG9naWNhbE9wZXJhdG9yKCRsT3BlcmF0b3IpXVtdID0gJF9maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyczJbJGxPcGVyYXRvcl1bXSA9ICRfZmlsdGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZmlsdGVyczIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlcnNPUltdID0gJGZpbHRlcnMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRfZmlsdGVyc1swXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJzT1JbXSA9ICRfZmlsdGVyc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmICh0b0Jvb2woJHBhcmFtc1siZmlsdGVyTmVnYXRlXyIuJF9maWVsZE5hbWVdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGR1bXAoJGxPcGVyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICRsT3BlcmF0b3IgPSAkdGhpcy0+bmVnYXRlTG9naWNhbE9wZXJhdG9yKCRsT3BlcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkdW1wKCRsT3BlcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRmaWx0ZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KCRmaWx0ZXJzT1IpID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJzWyJBTkQiXVtdID0gJGZpbHRlcnNPUlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJPUjIgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkZmlsdGVyc09SIGFzICRmaWx0ZXJPUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9Cb29sKCRwYXJhbXNbImZpbHRlck5lZ2F0ZV8iLiRfZmllbGROYW1lXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJPUjJbJHRoaXMtPm5lZ2F0ZUxvZ2ljYWxPcGVyYXRvcigiT1IiKV1bXSA9ICRmaWx0ZXJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJPUjJbIk9SIl1bXSA9ICRmaWx0ZXJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGZpbHRlck9SMik7IGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkZmlsdGVyT1IyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJzWyJBTkQiXVtdID0gJGZpbHRlck9SMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZmlsdGVycyk7IGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2lmICgkbmFtZSA9PSAiZmlsdGVyX2Rpc2NvdW50VXNlckdyb3VwRGlzYWJsZWQiKQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgLy8gICAgZHVtcCgkbmFtZSk7CiAgICAgICAgICAgIC8vICAgIGR1bXAoJHZhbHVlKTsKICAgICAgICAgICAgLy8gICAgZHVtcCgkZmlsdGVycyk7CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgfSAgICAgCgogICAgICAgIC8vZHVtcCgkX2ZpZWxkTmFtZSk7CiAgICAgICAgLy9kdW1wKCRmaWx0ZXJzKTsKICAgICAgICAKICAgICAgICAvLyBUT0RPIHNlcGFyYXRlIGZ1bmN0aW9uIG9ubHkgZm9yIEZpbGVEYkxpbmtzCiAgICAgICAgaWYgKCRwYXJhbXNbImZpbHRlciJdICE9ICIiKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbHRlcnNbIkFORCJdW10gPSAiKCIuJHBhcmFtc1siZmlsdGVyIl0uIikiOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfYXJyYXkoJHBhcmFtc1siYWRkaXRpb25hbEZpbHRlcnMiXSkpCiAgICAgICAgewogICAgICAgICAgICAkZmlsdGVyc1siQU5EIl0gPSBhcnJheV9tZXJnZSgkZmlsdGVyc1siQU5EIl0sICRwYXJhbXNbImFkZGl0aW9uYWxGaWx0ZXJzIl0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2lmICgkVGFibGUtPm5hbWUgPT0gImd0eiIpCiAgICAgICAgLy8gICAgZHVtcCgkZmlsdGVycyk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRmaWx0ZXJzKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gY29udmVydENvbXBvbmVudEZpbHRlcnMoJHBhcmFtcykKICAgIHsKICAgICAgICBpZiAoIWlzU2ltcGxlQXJyYXkoJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiZmllbGQxIjoidmFsdWVzMSIsCiAgICAgICAgICAgICAgICAiZmllbGQyIjoidmFsdWVzMiIsCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvcmVhY2goJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR2YWwpKQogICAgICAgICAgICAgICAgICAgICR2YWwgPSBpbXBsb2RlTGlzdCgkdmFsKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCR2YWwgIT09ICIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJmaWx0ZXJfIi4ka2V5XSkKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1siZmlsdGVyXyIuJGtleV0gLj0gIiYiOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbImZpbHRlcl8iLiRrZXldIC49IHRvU3RyaW5nKCR2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7ImZpZWxkIjoiZmllbGQxIiwidmFsdWUiOiJ2YWx1ZXMxIn0sCiAgICAgICAgICAgICAgICB7ImZpZWxkIjoiZmllbGQyIiwidmFsdWUiOiJ2YWx1ZXMyIn0sCiAgICAgICAgICAgIF0gCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvcmVhY2goJHBhcmFtc1siY29tcG9uZW50RmlsdGVycyJdIGFzICRrZXkgPT4gJGZpbHRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRmaWx0ZXJbInZhbHVlIl0pKQogICAgICAgICAgICAgICAgICAgICRmaWx0ZXJbInZhbHVlIl0gPSBpbXBsb2RlTGlzdCgkZmlsdGVyWyJ2YWx1ZSJdKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRmaWx0ZXJbInZhbHVlIl0gIT09ICIiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJmaWx0ZXJfIi4kZmlsdGVyWyJmaWVsZCJdXSkKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1siZmlsdGVyXyIuJGZpbHRlclsiZmllbGQiXV0gLj0gIiYiOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbImZpbHRlcl8iLiRmaWx0ZXJbImZpZWxkIl1dIC49IHRvU3RyaW5nKCRmaWx0ZXJbInZhbHVlIl0pOwogICAgICAgICAgICAgICAgICAgIGlmICgkZmlsdGVyWyJvcGVyYXRvciJdKQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJmaWx0ZXJPcGVyYXRvcl8iLiRmaWx0ZXJbImZpZWxkIl1dID0gJGZpbHRlclsib3BlcmF0b3IiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgfSAgICAKICAgIAogICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRyYWN0T3BlcmF0b3IoJiR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgifDxbXj5dKz58IiwgJHZhbHVlKSkKICAgICAgICAgICAgICAgIHJldHVybigiIik7CgogICAgICAgICAgICAkb3BlcmF0b3JzID0gYXJyYXkoIj0iLCAiIT0iLCAiPj0iLCAiPD0iLCAiPiIsICI8Iik7IC8vIG9kIG5lamRlbHNpY2ggIQogICAgICAgICAgICBmb3JlYWNoKCRvcGVyYXRvcnMgYXMgJG9wZXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCR2YWx1ZSwgJG9wZXJhdG9yKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSBzdWJzdHIoJHZhbHVlLCBzdHJsZW4oJG9wZXJhdG9yKSwgc3RybGVuKCR2YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybigkb3BlcmF0b3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAKICAgIGZ1bmN0aW9uIGdldFJlYWxOYW1lKCRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKF9pc19hcnJheSgkcGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkcGFyYW1zWyJzcWxOYW1lIl0pCiAgICAgICAgICAgICAgICByZXR1cm4oJHBhcmFtc1sic3FsTmFtZSJdKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXNbIm5hbWUiXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXROYW1lKCRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKF9pc19hcnJheSgkcGFyYW1zKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigkcGFyYW1zWyJuYW1lIl0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybigkcGFyYW1zKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3QoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKQogICAgewogICAgICAgIHN0YXJ0UHJvZmlsZSgiVERiTGluazo6c2VsZWN0KCkiKTsKICAgICAgICAkdGhpcy0+ZXZlbnRzRGlzYWJsZWQgPSAkcGFyYW1zWyJyYXciXTsKICAgICAgICAKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldE5hbWUoJHRhYmxlUGFyYW1zKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICBpZiAoISRwYXJhbXNbInJhdyJdICYmIEZBTFNFICYmIG9iamVjdEV4aXN0cygiRXZlbnRzIikpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJHRhYmxlTmFtZSk7CiAgICAgICAgICAgIC8vZHVtcChnZXRPYmplY3QoIkV2ZW50cyIpLT5oYXNFdmVudHMoIm9uR2V0RGJMaW5rU2VsZWN0UGFyYW1zIikpOwogICAgICAgICAgICAkcGFyYW1zID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkdldERiTGlua1NlbGVjdFBhcmFtcyIsIGFycmF5KAogICAgICAgICAgICAgICAgIk9iamVjdCI9PiR0aGlzLAogICAgICAgICAgICAgICAgInBhcmFtcyI9PiRwYXJhbXMsCiAgICAgICAgICAgICAgICAidGFibGVOYW1lIj0+JHRhYmxlTmFtZSwKICAgICAgICAgICAgKSwgInBhcmFtcyIpOwogICAgICAgIH0KICAgICAgICAqLwoKICAgICAgICAkdGhpcy0+Y2xlYXIoKTsKICAgICAgICAKICAgICAgICAkZmllbGRzID0gJHRoaXMtPmdldEZpZWxkcygkdGFibGVQYXJhbXMsICRwYXJhbXMpOwogICAgICAgICRhZGRpdGlvbmFsRmllbGRzID0gJHRoaXMtPmdldEFkZGl0aW9uYWxGaWVsZHMoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAkZmlsdGVycyA9ICR0aGlzLT5nZXRGaWx0ZXJzKCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgJHNvcnQgPSAkdGhpcy0+Z2V0U29ydCgkdGFibGVQYXJhbXMsICRwYXJhbXMpOwogICAgICAgICRsaW1pdCA9ICR0aGlzLT5nZXRMaW1pdCgkdGFibGVQYXJhbXMsICRwYXJhbXMpOwogICAgICAgICRvZmZzZXQgPSAkdGhpcy0+Z2V0T2Zmc2V0KCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgJGdyb3VwaW5nID0gJHRoaXMtPmdldEdyb3VwaW5nKCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgJGhhdmluZyA9ICR0aGlzLT5nZXRIYXZpbmcoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAvL3Zhcl9kdW1wKCRoYXZpbmcpOwogICAgICAgIC8vdmFyX2R1bXAoJGdyb3VwaW5nKTsKICAgICAgICAvL2R1bXAoJHRhYmxlUGFyYW1zKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCRmaWx0ZXJzKTsKICAgICAgICAKICAgICAgICAvKiR0aGlzLT5maWVsZHMgPSAkdGhpcy0+Z2V0RmllbGRzKCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgJHRoaXMtPmFkZGl0aW9uYWxGaWVsZHMgPSAkdGhpcy0+Z2V0QWRkaXRpb25hbEZpZWxkcygkdGFibGVQYXJhbXMsICRwYXJhbXMpOwogICAgICAgICR0aGlzLT5maWx0ZXJzID0gJHRoaXMtPmdldEZpbHRlcnMoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAkdGhpcy0+c29ydCA9ICR0aGlzLT5nZXRTb3J0KCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgJHRoaXMtPmxpbWl0ID0gJHRoaXMtPmdldExpbWl0KCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgJHRoaXMtPm9mZnNldCA9ICR0aGlzLT5nZXRPZmZzZXQoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAkdGhpcy0+Z3JvdXBpbmcgPSAkdGhpcy0+Z2V0R3JvdXBpbmcoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsqLwogICAgICAgIAogICAgICAgICR0aGlzLT5maWVsZHMgPSAkZmllbGRzOwogICAgICAgICR0aGlzLT5hZGRpdGlvbmFsRmllbGRzID0gJGFkZGl0aW9uYWxGaWVsZHM7CiAgICAgICAgJHRoaXMtPmZpbHRlcnMgPSAkZmlsdGVyczsKICAgICAgICAkdGhpcy0+c29ydCA9ICRzb3J0OwogICAgICAgICR0aGlzLT5saW1pdCA9ICRsaW1pdDsKICAgICAgICAkdGhpcy0+b2Zmc2V0ID0gJG9mZnNldDsKICAgICAgICAkdGhpcy0+Z3JvdXBpbmcgPSAkZ3JvdXBpbmc7CiAgICAgICAgJHRoaXMtPmhhdmluZyA9ICRoYXZpbmc7CgogICAgICAgIC8vZHVtcCgib2Zmc2V0Iik7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5vZmZzZXQpOwogICAgICAgIHN0b3BQcm9maWxlKCJURGJMaW5rOjpzZWxlY3QoKSIpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hdGNoRmlsdGVycygkcmVjb3JkLCAkZmlsdGVycz1OVUxMLCAkb3BlcmF0b3I9IiIpCiAgICB7CiAgICAgICAgaWYgKCRmaWx0ZXJzID09PSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbHRlcnMgPSAkdGhpcy0+ZmlsdGVyc1siQU5EIl07CiAgICAgICAgICAgICRvcGVyYXRvciA9ICJBTkQiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2R1bXAoJGZpbHRlcnMpOwogICAgICAgICRtYXRjaCA9ICgkb3BlcmF0b3IgPT09ICJBTkQiKTsKICAgICAgICAvL3Zhcl9kdW1wKCRtYXRjaCk7CiAgICAgICAgZm9yZWFjaCgkZmlsdGVycyBhcyAkZmlsdGVyKQogICAgICAgIHsKICAgICAgICAgICAgJG9wZXJhdG9yMiA9ICIiOwogICAgICAgICAgICBpZiAoJGZpbHRlclsiQU5EIl0pCiAgICAgICAgICAgICAgICAkb3BlcmF0b3IyID0gIkFORCI7CiAgICAgICAgICAgIGVsc2UgaWYgKCRmaWx0ZXJbIk9SIl0pCiAgICAgICAgICAgICAgICAkb3BlcmF0b3IyID0gIk9SIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJG9wZXJhdG9yMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5tYXRjaEZpbHRlcnMoJHJlY29yZCwgJGZpbHRlclskb3BlcmF0b3IyXSwgJG9wZXJhdG9yMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoIj09PT09PSIpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRmaWx0ZXIpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRyZWNvcmRbJGZpbHRlclswXV0uJGZpbHRlclsxXS4kZmlsdGVyWzJdKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkdGhpcy0+bWF0Y2hGaWx0ZXIoJHJlY29yZFskZmlsdGVyWzBdXSwgJGZpbHRlclsxXSwgJGZpbHRlclsyXSkpOwogICAgICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5tYXRjaEZpbHRlcigkcmVjb3JkWyRmaWx0ZXJbMF1dLCAkZmlsdGVyWzFdLCAkZmlsdGVyWzJdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09ICJBTkQiKQogICAgICAgICAgICAgICAgJG1hdGNoID0gJG1hdGNoICYmICRyZXQ7CiAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgPT0gIk9SIikKICAgICAgICAgICAgICAgICRtYXRjaCA9ICRtYXRjaCB8fCAkcmV0OwogICAgICAgIH0gICAgCiAgICAgICAgCiAgICAgICAgLy9kdW1wKCRtYXRjaCk7CiAgICAgICAgcmV0dXJuKCRtYXRjaCk7CiAgICB9CgogICAgZnVuY3Rpb24gbWF0Y2hGaWx0ZXIoJHZhbHVlLCAkb3BlcmF0b3IsICRtYXRjaFZhbHVlKQogICAgewogICAgICAgIHN3aXRjaCgkb3BlcmF0b3IpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICI9IjoKICAgICAgICAgICAgICAgIHJldHVybigkdmFsdWUgPT0gJG1hdGNoVmFsdWUpOwogICAgICAgICAgICBjYXNlICIhPSI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlICE9ICRtYXRjaFZhbHVlKTsKICAgICAgICAgICAgY2FzZSAiPiI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlID4gJG1hdGNoVmFsdWUpOwogICAgICAgICAgICBjYXNlICI+PSI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlID49ICRtYXRjaFZhbHVlKTsKICAgICAgICAgICAgY2FzZSAiPCI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlIDwgJG1hdGNoVmFsdWUpOwogICAgICAgICAgICBjYXNlICI8PSI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlIDw9ICRtYXRjaFZhbHVlKTsKICAgICAgICAgICAgY2FzZSAiSVMgTlVMTCI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlID09IE5VTEwpOwogICAgICAgICAgICBjYXNlICJJUyBOT1QgTlVMTCI6CiAgICAgICAgICAgICAgICByZXR1cm4oJHZhbHVlICE9PSBOVUxMKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICB9CgogICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFNxbE5hbWUoJGZpZWxkTmFtZSkKICAgIHsKICAgICAgICAkZmllbGROYW1lID0gJHRoaXMtPmdldE5hbWUoJGZpZWxkTmFtZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRmaWVsZE5hbWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBudW1fcm93cygpCiAgICB7CiAgICAgICAgLy8gYmFjayBjb21wYXQgLSBUT0RPCiAgICAgICAgcmV0dXJuKCR0aGlzLT5yZWNvcmRDb3VudCgpKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gbmV4dF9yZWNvcmQoKQogICAgewogICAgICAgIC8vIGJhY2sgY29tcGF0IC0gVE9ETwogICAgICAgIHJldHVybigkdGhpcy0+bmV4dFJlY29yZCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlc2NhcGVTdHJpbmcoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4oJHN0cik7CiAgICB9Cn0KCiAgICAvKgogICAgZnVuY3Rpb24gX19jb252ZXJ0Q29tcG9uZW50RmlsdGVycygkYSwgJGxldmVsPTApCiAgICB7CiAgICAgICAgZ2xvYmFsICR4eHg7CiAgICAgICAgaWYgKCR4eHgpIGR1bXAoIi0tIik7CiAgICAgICAgaWYgKCR4eHgpIGR1bXAoJGEpOwoKICAgICAgICBpZiAoJGxldmVsID09IDApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzU2ltcGxlQXJyYXkoJGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkYiA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAkayA9IGFycmF5X2tleXMoJGEpOwogICAgICAgICAgICAgICAgaWYgKGlzVVVJRCgka1swXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkYSBhcyAka2V5ID0+ICR2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdmFsID0gX19tZXJnZUNvbXBvbmVudEZpbHRlcnMoJHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSAkdmFsWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2ltcGxlQXJyYXkoJHZhbCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWwzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbCBhcyAka2V5MiA9PiAkdmFsMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsM1tdID0gYXJyYXkoImZpZWxkIj0+JGtleTIsICJ2YWx1ZSI9PiR2YWwyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSAkdmFsMzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgJGJbXSA9ICR2YWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRhID0gJGI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkeHh4KSBkdW1wKCRhKTsKICAgICAgICBpZiAoJHh4eCkgZHVtcCgiPT0iKTsKICAgICAgICByZXR1cm4oJGEpOwogICAgICAgIAogICAgICAgIAogICAgICAgICRiID0gYXJyYXkoKTsKICAgICAgICAvL2R1bXAoIjo6OiIpOwogICAgICAgIC8vZHVtcCgkYSk7CiAgICAgICAgJGsgPSBhcnJheV9rZXlzKCRhKTsKICAgICAgICAvL2lmICgkbGV2ZWwgPT0gMCAmJiBpc1VVSUQoJGtbMF0pKQogICAgICAgIC8vICAgIGR1bXAoJGEpOwogICAgICAgIC8vICAgICRhID0gX19tZXJnZUNvbXBvbmVudEZpbHRlcnMoJGEpOwogICAgICAgIC8vZHVtcCgkYSk7CiAgICAgICAgZm9yZWFjaCgkYSBhcyAka2V5ID0+ICR2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJGxldmVsID09IDAgJiYgaXNVVUlEKCRrZXkpICYmIGlzX2FycmF5KCR2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdmFsID0gX19tZXJnZUNvbXBvbmVudEZpbHRlcnMoJHZhbCk7CiAgICAgICAgICAgICAgICAkYjEgPSBfX2NvbnZlcnRDb21wb25lbnRGaWx0ZXJzKCR2YWwsICRsZXZlbCsxKTsKICAgICAgICAgICAgICAgIGR1bXAoJGIxKTsKICAgICAgICAgICAgICAgICRiW10gPSAkdmFsOwogICAgICAgICAgICAgICAgZHVtcCgkYik7CiAgICAgICAgICAgICAgICAkYiA9IGFycmF5X21lcmdlKCRiLCAgX19jb252ZXJ0Q29tcG9uZW50RmlsdGVycygkdmFsLCAkbGV2ZWwrMSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCRsZXZlbCA+IDAgJiYgcHJlZ19tYXRjaCgifF5bMC05XStcJHwiLCAka2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGJbXSA9IF9fY29udmVydENvbXBvbmVudEZpbHRlcnMoJHZhbCwgJGxldmVsKzEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCRsZXZlbCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRiW10gPSBhcnJheSgiZmllbGQiPT4ka2V5LCAidmFsdWUiPT4kdmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIC8vIGxlYXZlIHVudG91Y2hlZAogICAgICAgICAgICAgICAgJGJbJGtleV0gPSAkdmFsOwogICAgICAgIH0KICAgICAgICAvL2R1bXAoIi0tIik7CiAgICAgICAgLy9kdW1wKCRiKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJGIpOwogICAgfQogICAgKi8KICAgIGZ1bmN0aW9uIF9fbWVyZ2VDb21wb25lbnRGaWx0ZXJzKCRhKQogICAgewogICAgICAgICRiID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICBmb3JlYWNoKCRhIGFzICRrZXkgPT4gJHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghaXNVVUlEKCRrZXkpICYmIGlzX2FycmF5KCR2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCR2YWwgYXMgJGtleTMgPT4gJHZhbDMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkYiBhcyAka2V5NCA9PiAkdmFsNCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbDQgYXMgJGtleTIgPT4gJHZhbDIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgka2V5MyA9PSAka2V5MikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm91bmQgPSB0cnVlOyAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KCR2YWwzLCBleHBsb2RlTGlzdCgkYlska2V5NF1bJGtleTJdKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYlska2V5NF1bJGtleTJdID0gZXhwbG9kZUxpc3QoJGJbJGtleTRdWyRrZXkyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiWyRrZXk0XVska2V5Ml1bXSA9ICR2YWwzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISRmb3VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgJGJbJGtleV1bJGtleTNdID0gJHZhbDM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJGJbJGtleV0gPSAkdmFsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGIpOwogICAgfSAgIAogICAgCgogICAgCgo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGJMaW5rL0ZpbGVEYkxpbmsuY2xhc3MucGhwIC0tLS0tLS0gDQoNCmNsYXNzIFRGaWxlRGJMaW5rIGV4dGVuZHMgVERiTGluaw0Kew0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb25HZXRQcm9wZXJ0aWVzKCkNCiAgICB7DQogICAgICAgIHJldHVybihhcnJheV9tZXJnZShwYXJlbnQ6Om9uR2V0UHJvcGVydGllcygpLCBhcnJheSggICAgICAgIA0KICAgICAgICAgICAgIm5hbWU9ZmlsZSxjYXB0aW9uPUZpbGUsb2JqZWN0PUZpbGVFZGl0IiwNCiAgICAgICAgKSkpOyAgICAgICAgDQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKCR0YWJsZU5hbWUpDQogICAgew0KICAgICAgICANCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gZHJvcFRhYmxlKCR0YWJsZU5hbWUpDQogICAgew0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFkZEZpZWxkKCR0YWJsZU5hbWUsICRmaWVsZE5hbWUsICRmaWVsZERlZmluaXRpb24pDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZU5hbWUuIiBBREQgQ09MVU1OICI7DQogICAgICAgICAgICAkc3FsIC49ICIiLiRmaWVsZE5hbWUuIiAiLiRmaWVsZERlZmluaXRpb247DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZXhlYygkc3FsKTsgICAgICAgIA0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGVsZXRlRmllbGQoJHRhYmxlTmFtZSwgJGZpZWxkTmFtZSkNCiAgICB7DQogICAgICAgIC8vICAhISEgU1FMSVRFIE5FVU1JLi4uIG51dG5vIG9iZWppdCBrb3BpaSB0YWJ1bGt5LCB2eXR2b3Jlbmkgbm92ZSBiZXogdG9ob3RvIHBvbGUgYSB6a29waXJvdmFuaW0gZGF0DQogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQ0KICAgICAgICB7DQogICAgICAgICAgICAkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlTmFtZS4iIERST1AgQ09MVU1OICIuJGZpZWxkTmFtZS4iIjsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgDQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbnNlcnRSZWNvcmQoJHRhYmxlTmFtZSwgJHJlY29yZCkNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQ0KICAgICAgICB7DQogICAgICAgICAgICAkbmFtZXMgPSBhcnJheSgpOw0KICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZCBhcyAkbmFtZSA9PiAkdmFsdWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJG5hbWVzW10gPSAiXCIiLiRuYW1lLiJcIiI7DQogICAgICAgICAgICAgICAgJHZhbHVlc1tdID0gJHZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJTlRPICIuJHRhYmxlTmFtZS4iICgiLmltcGxvZGUoIiwiLCAkbmFtZXMpLiIpIFZBTFVFUyAoIi5pbXBsb2RlKCIsIiwgJHZhbHVlcykuIikiOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICANCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVJlY29yZCgkdGFibGVOYW1lLCAkcmVjb3JkLCAkaWQpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZCBhcyAkbmFtZSA9PiAkdmFsdWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHZhbHVlc1tdID0gJG5hbWUuIj0iLiR2YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHNxbCA9ICJVUERBVEUgIi4kdGFibGVOYW1lLiIgU0VUICIuaW1wbG9kZSgiLCIsICR2YWx1ZXMpLiIgV0hFUkUgaWQ9JyIuJGlkLiInIjsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgDQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWxldGVSZWNvcmQoJHRhYmxlTmFtZSwgJGlkKQ0KICAgIHsNCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpDQogICAgICAgIHsNCiAgICAgICAgICAgICRzcWwgPSAiREVMRVRFIEZST00gIi4kdGFibGVOYW1lLiIgV0hFUkUgaWQ9JyIuJGlkLiInIjsNCg0KICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgDQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gc2VsZWN0KCR0YWJsZVBhcmFtcywgJHBhcmFtcykNCiAgICB7DQogICAgICAgIHBhcmVudDo6c2VsZWN0KCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7DQogICAgICAgIA0KICAgICAgICAkdGhpcy0+cmVjb3JkcyA9IGFycmF5KCk7DQogICAgICAgICR0aGlzLT5pbmRleCA9IDA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbmV4dFJlY29yZCgpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJHJlY29yZCA9ICR0aGlzLT5yZWNvcmRzWyR0aGlzLT5pbmRleF07DQogICAgICAgICAgICAkdGhpcy0+aW5kZXgrKzsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuKCRyZWNvcmQpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiByZWNvcmRDb3VudCgpDQogICAgew0KICAgICAgICAvLyBTUUxpdGUgZG9lcyBub3QgaGF2ZSByb3dDb3VudCgpDQogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQ0KICAgICAgICB7DQogICAgICAgICAgICAkY291bnQgPSBjb3VudCgkdGhpcy0+cmVjb3Jkcyk7DQogICAgICAgICAgICAvL2R1bXAoJGNvdW50KTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuKCRjb3VudCk7DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIHNvcnQoJGEsICRiLCAkaW5kZXg9MCkNCiAgICB7DQogICAgICAgIGlmICgkaW5kZXggPiBjb3VudCgkdGhpcy0+c29ydCktMSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuKDApOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkc29ydEl0ZW0gPSAkdGhpcy0+c29ydFskaW5kZXhdOw0KICAgICAgICAkbiA9ICRzb3J0SXRlbVswXTsNCiAgICAgICAgDQogICAgICAgIGlmICgkYVskbl0gPiAkYlskbl0pDQogICAgICAgICAgICAkcmV0ID0gMTsNCiAgICAgICAgZWxzZSBpZiAoJGFbJG5dIDwgJGJbJG5dKQ0KICAgICAgICAgICAgJHJldCA9IC0xOw0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+c29ydCgkYSwgJGIsICRpbmRleCsxKTsNCiAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgIGlmICgkc29ydEl0ZW1bMV0gPT0gIkRFU0MiKQ0KICAgICAgICAgICAgJHJldCA9ICgtMSkqJHJldDsNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4oJHJldCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc29ydFJlY29yZHMoKQ0KICAgIHsNCiAgICAgICAgaWYgKCR0aGlzLT5zb3J0KQ0KICAgICAgICB7DQogICAgICAgICAgICB1c29ydCgkdGhpcy0+cmVjb3JkcywgYXJyYXkoJHRoaXMsICJzb3J0IikpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4oJHRoaXMtPnJlY29yZHMpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdyb3VwUmVjb3JkcygpDQogICAgew0KICAgICAgICAkdGhpcy0+Z3JvdXBMaXN0ID0gYXJyYXkoKTsNCiAgICAgICAgaWYgKCR0aGlzLT5ncm91cGluZykNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+Z3JvdXBpbmcgYXMgJGdyb3VwQnlJdGVtKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICR0aGlzLT5ncm91cExpc3RbJGdyb3VwQnlJdGVtXSA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgJHJlY29yZHMgPSBhcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPnJlY29yZHMgYXMgJHJlY29yZCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJHJlY29yZFskZ3JvdXBCeUl0ZW1dLCAkdGhpcy0+Z3JvdXBMaXN0WyRncm91cEJ5SXRlbV0pKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z3JvdXBMaXN0WyRncm91cEJ5SXRlbV1bXSA9ICRyZWNvcmRbJGdyb3VwQnlJdGVtXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZWNvcmRzW10gPSAkcmVjb3JkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR0aGlzLT5yZWNvcmRzID0gJHJlY29yZHM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybigkdGhpcy0+cmVjb3Jkcyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbGltaXRSZWNvcmRzKCkNCiAgICB7DQogICAgICAgIC8vZHVtcCgkdGhpcy0+b2Zmc2V0KTsNCiAgICAgICAgLy9kdW1wKCR0aGlzLT5saW1pdCk7DQogICAgICAgIGlmICgkdGhpcy0+b2Zmc2V0IHx8ICR0aGlzLT5saW1pdCkNCiAgICAgICAgew0KICAgICAgICAgICAgJHJlY29yZHMgPSBhcnJheSgpOw0KICAgICAgICAgICAgZm9yICgkaSA9ICR0aGlzLT5vZmZzZXQgOyAkaSA8IGNvdW50KCR0aGlzLT5yZWNvcmRzKSAmJiAkaSA8ICR0aGlzLT5vZmZzZXQrJHRoaXMtPmxpbWl0IDsgJGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkcmVjb3Jkc1tdID0gJHRoaXMtPnJlY29yZHNbJGldOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRoaXMtPnJlY29yZHMgPSAkcmVjb3JkczsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9DQp9DQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGJMaW5rL1NRTERiTGluay5jbGFzcy5waHAgLS0tLS0tLSANCgokX19sYXN0U3FsUXVlcnkgPSAiIjsKZnVuY3Rpb24gZ2V0TGFzdFNxbFF1ZXJ5KCkKewogICAgZ2xvYmFsICRfX2xhc3RTcWxRdWVyeTsKICAgIHJldHVybigkX19sYXN0U3FsUXVlcnkpOwp9CgpjbGFzcyBUU1FMRGJMaW5rIGV4dGVuZHMgVERiTGluawp7CiAgICB2YXIgJGZ1bmN0aW9ucyA9IGFycmF5KCk7CiAgICB2YXIgJGlnbm9yZWRDYWNoZVByb3BlcnRpZXMgPSBhcnJheSgicXVlcmllcyIpOwogICAgdmFyICRkYXRhVHlwZXMgPSBhcnJheSgpOwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uR2V0UHJvcGVydGllcygpCiAgICB7CiAgICAgICAgcmV0dXJuKGFycmF5X21lcmdlKHBhcmVudDo6b25HZXRQcm9wZXJ0aWVzKCksIGFycmF5KCAgICAgICAgCiAgICAgICAgICAgICJuYW1lPWhvc3QsY2FwdGlvbj1Ib3N0LG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgICAgICJuYW1lPXBvcnQsY2FwdGlvbj1Qb3J0LG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgICAgICJuYW1lPWxvZ2luLGNhcHRpb249TG9naW4sb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAgICAgIm5hbWU9cGFzc3dvcmQsY2FwdGlvbj1QYXNzd29yZCxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICAgICAibmFtZT1kYXRhYmFzZSxjYXB0aW9uPURhdGFiYXNlLG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgKSkpOyAgICAgICAgCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFNRTCgkbWV0aG9kTmFtZSwgJHAxPSJVTkRFRklORUQiLCAkcDI9IlVOREVGSU5FRCIsICRwMz0iVU5ERUZJTkVEIiwgJHA0PSJVTkRFRklORUQiLCAkcDU9IlVOREVGSU5FRCIsICRwNj0iVU5ERUZJTkVEIiwgJHA3PSJVTkRFRklORUQiLCAkcDg9IlVOREVGSU5FRCIsICRwOT0iVU5ERUZJTkVEIiwgJHAxMD0iVU5ERUZJTkVEIiwgJHAxMT0iVU5ERUZJTkVEIiwgJHAxMj0iVU5ERUZJTkVEIiwgJHAxMz0iVU5ERUZJTkVEIiwgJHAxND0iVU5ERUZJTkVEIiwgJHAxNT0iVU5ERUZJTkVEIikKICAgIHsKICAgICAgICAvLyBORVZFUiBkdW1wKCkgaGVyZS4uLiBpZiBzeXN0ZW1fbG9nIGluc3RhbGxlZAogICAgICAgIAogICAgICAgICR0aGlzLT5xdWVyeVRvU3RyaW5nID0gdHJ1ZTsKICAgICAgICAkdGhpcy0+cXVlcnlTdHJpbmcgPSAiIjsKICAgICAgICAvL2R1bXAoJG1ldGhvZE5hbWUpOwogICAgICAgIC8vZHVtcCgkcDEpOwogICAgICAgIC8vZHVtcCgkcDIpOwogICAgICAgIAogICAgICAgIGlmICgkcDEgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoKTsKICAgICAgICBlbHNlIGlmICgkcDIgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxKTsKICAgICAgICBlbHNlIGlmICgkcDMgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIpOwogICAgICAgIGVsc2UgaWYgKCRwNCA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgkcDEsICRwMiwgJHAzKTsKICAgICAgICBlbHNlIGlmICgkcDUgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIsICRwMywgJHA0KTsKICAgICAgICBlbHNlIGlmICgkcDYgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUpOwogICAgICAgIGVsc2UgaWYgKCRwNyA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgkcDEsICRwMiwgJHAzLCAkcDQsICRwNSwgJHA2KTsKICAgICAgICBlbHNlIGlmICgkcDggPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3KTsKICAgICAgICBlbHNlIGlmICgkcDkgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3LCAkcDgpOwogICAgICAgIGVsc2UgaWYgKCRwMTAgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3LCAkcDgsICRwOSk7CiAgICAgICAgZWxzZSBpZiAoJHAxMSA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgkcDEsICRwMiwgJHAzLCAkcDQsICRwNSwgJHA2LCAkcDcsICRwOCwgJHA5LCAkcDEwKTsKICAgICAgICBlbHNlIGlmICgkcDEyID09PSAiVU5ERUZJTkVEIikKICAgICAgICAgICAgJHRoaXMtPiRtZXRob2ROYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTAsICRwMTEpOwogICAgICAgIGVsc2UgaWYgKCRwMTMgPT09ICJVTkRFRklORUQiKQogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoJHAxLCAkcDIsICRwMywgJHA0LCAkcDUsICRwNiwgJHA3LCAkcDgsICRwOSwgJHAxMCwgJHAxMSwgJHAxMik7CiAgICAgICAgZWxzZSBpZiAoJHAxNCA9PT0gIlVOREVGSU5FRCIpCiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgkcDEsICRwMiwgJHAzLCAkcDQsICRwNSwgJHA2LCAkcDcsICRwOCwgJHA5LCAkcDEwLCAkcDExLCAkcDEyLCAkcDEzKTsKICAgICAgICBlbHNlIGlmICgkcDE1ID09PSAiVU5ERUZJTkVEIikKICAgICAgICAgICAgJHRoaXMtPiRtZXRob2ROYW1lKCRwMSwgJHAyLCAkcDMsICRwNCwgJHA1LCAkcDYsICRwNywgJHA4LCAkcDksICRwMTAsICRwMTEsICRwMTIsICRwMTMsICRwMTQpOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgkcDEsICRwMiwgJHAzLCAkcDQsICRwNSwgJHA2LCAkcDcsICRwOCwgJHA5LCAkcDEwLCAkcDExLCAkcDEyLCAkcDEzLCAkcDE0LCAkcDE1KTsKICAgICAgICAgICAgCiAgICAgICAgJHRoaXMtPnF1ZXJ5VG9TdHJpbmcgPSBmYWxzZTsKCiAgICAgICAgcmV0dXJuKCR0aGlzLT5xdWVyeVN0cmluZyk7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVGFibGUoJHBhcmFtcywgJGZpZWxkcz1hcnJheSgpKQogICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXNbImluZGV4ZXMiXSk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zLCAiLCIsIGZhbHNlKTsKICAgICAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJGtleSA9PiAkZmllbGQpCiAgICAgICAgICAgICRmaWVsZHNbJGtleV0gPSBleHRyYWN0UGFyYW1zKCRmaWVsZCwgIiwiLCBmYWxzZSk7CiAgICAgICAgCiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTsKCiAgICAgICAgLy92YXJfZHVtcCgkZmllbGRzKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgLy92YXJfZHVtcCgkdGhpcyk7CiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gIkNSRUFURSAiLigkcGFyYW1zWyJ0ZW1wb3JhcnkiXSA/ICJURU1QT1JBUlkiIDogIiIpLiIgVEFCTEUgIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKS4iICgiOwogICAgICAgICAgICAkc3FsRmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZmllbGRzKTsKICAgICAgICAgICAgZm9yZWFjaCgkZmllbGRzIGFzICRmaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRmaWVsZFsiZGF0YVR5cGUiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgJGZpZWxkTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkZmllbGQpOwogICAgICAgICAgICAgICAgICAgICRmaWVsZERlZiA9ICR0aGlzLT5nZXRGaWVsZERlZmluaXRpb24oJGZpZWxkKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8kc3FsRmllbGRzW10gPSAkdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGROYW1lKS4iICIuJGZpZWxkRGVmWyJ0eXBlIl0uIiAiLiRmaWVsZERlZlsia2V5Il0uIiAiLiRmaWVsZERlZlsiY29uc3RyYWludCJdLiIgIi4kZmllbGREZWZbImRlZmF1bHQiXTsKICAgICAgICAgICAgICAgICAgICAkc3FsRmllbGRzW10gPSAkdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGROYW1lKS4iICIuJGZpZWxkRGVmWyJ0eXBlIl0uIiAiLiRmaWVsZERlZlsiY29uc3RyYWludCJdLiIgIi4kZmllbGREZWZbImV4dHJhIl0uIiAiLiRmaWVsZERlZlsiZGVmYXVsdCJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHNxbEZpZWxkcyk7CiAgICAgICAgICAgICRzcWwgLj0gaW1wbG9kZSgiLCIsICRzcWxGaWVsZHMpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGNvbnN0cmFpbnQgPSAkdGhpcy0+Z2V0Q3JlYXRlVGFibGVDb25zdHJhaW50KCRwYXJhbXMsICRmaWVsZHMpOwogICAgICAgICAgICBpZiAoJGNvbnN0cmFpbnQpCiAgICAgICAgICAgICAgICAkc3FsIC49ICIsICIuJGNvbnN0cmFpbnQ7CiAgICAgICAgICAgICRzcWwgLj0gIikiOwogICAgICAgICAgICAKICAgICAgICAgICAgJHNxbCAuPSAiICIuJHRoaXMtPmdldENyZWF0ZVRhYmxlUGFyYW1zKCRwYXJhbXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zKTsKICAgICAgICAgICAgLy9lY2hvICRzcWw7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgLy9lY2hvICIhISEiOwogICAgICAgICAgICAvL2VjaG8gJHNxbDsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlc3VsdCk7CiAgICAgICAgCiAgICAgICAgICAgIGlmICgkcmVzdWx0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJGZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0b0Jvb2woJGZpZWxkWyJpbmRleCJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFkZEluZGV4KCRwYXJhbXMsICRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBhZGRlZCBieSBDUkVBVEUgVEFCTEUKICAgICAgICAgICAgICAgICAgICAvL2lmICh0b0Jvb2woJGZpZWxkWyJwcmltYXJ5S2V5Il0pKQogICAgICAgICAgICAgICAgICAgIC8vICAgICR0aGlzLT5zZXRQcmltYXJ5S2V5KCRwYXJhbXMsICRmaWVsZFsibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9Cb29sKCRmaWVsZFsiZnVsbHRleHQiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hZGRGdWxsdGV4dEluZGV4KCRwYXJhbXMsICRmaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIHVzaW5nICRjb25zdHJhaW50CiAgICAgICAgICAgICAgICAvL2lmICgkcGFyYW1zWyJwcmltYXJ5S2V5cyJdKQogICAgICAgICAgICAgICAgLy8gICAgJHRoaXMtPnNldFByaW1hcnlLZXkoJHBhcmFtcywgJHBhcmFtc1sicHJpbWFyeUtleXMiXSk7CiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siaW5kZXhlcyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goZXh0cmFjdFBhcmFtcygkcGFyYW1zWyJpbmRleGVzIl0pIGFzICRpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFkZEluZGV4KCRwYXJhbXMsICRpbmRleFsiZmllbGRzIl0sICRpbmRleFsibmFtZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJmdWxsdGV4dEluZGV4ZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKGV4dHJhY3RQYXJhbXMoJHBhcmFtc1siZnVsbHRleHRJbmRleGVzIl0pIGFzICRpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFkZEluZGV4KCRwYXJhbXMsICRpbmRleFsiZmllbGRzIl0sICRpbmRleFsibmFtZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJ1bmlxdWVLZXlzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaChleHRyYWN0UGFyYW1zKCRwYXJhbXNbInVuaXF1ZUtleXMiXSkgYXMgJGluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YWRkSW5kZXgoJHBhcmFtcywgJGluZGV4WyJmaWVsZHMiXSwgJGluZGV4WyJuYW1lIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgJHByaW1hcnlLZXlzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRmaWVsZFsicHJpbWFyeUtleSJdKQogICAgICAgICAgICAgICAgICAgICAgICAkcHJpbWFyeUtleXNbXSA9ICRmaWVsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkcHJpbWFyeUtleXMpCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFByaW1hcnlLZXkoJHBhcmFtcywgJHByaW1hcnlLZXlzKTsKICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0Q3JlYXRlVGFibGVDb25zdHJhaW50KCRwYXJhbXMsICRmaWVsZHM9YXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoJHBhcmFtc1sicHJpbWFyeUtleXMiXSkKICAgICAgICAgICAgcmV0dXJuKCJDT05TVFJBSU5UIHBrIFBSSU1BUlkgS0VZICgiLmltcGxvZGUoIiwiLCAkcGFyYW1zWyJwcmltYXJ5S2V5cyJdKS4iKSIpOwogICAgCiAgICAgICAgJHByaW1hcnlLZXlzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRmaWVsZFsicHJpbWFyeUtleSJdKQogICAgICAgICAgICAgICAgJHByaW1hcnlLZXlzW10gPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJGZpZWxkKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcHJpbWFyeUtleXMpCiAgICAgICAgICAgIHJldHVybigiQ09OU1RSQUlOVCBwayBQUklNQVJZIEtFWSAoIi5pbXBsb2RlKCIsIiwgJHByaW1hcnlLZXlzKS4iKSIpOwoKICAgICAgICAvL3JldHVybigiREVGQVVMVCBDSEFSQUNURVIgU0VUPXV0ZjggQ09MTEFURT11dGY4X2dlbmVyYWxfY2kiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDcmVhdGVUYWJsZVBhcmFtcygkcGFyYW1zKQogICAgewogICAgICAgIHJldHVybigiIik7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGRyb3BUYWJsZSgkcGFyYW1zKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtcyk7CgogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHNxbCA9ICJEUk9QIFRBQkxFICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICAKCiAgICAgICAgICAgIHJldHVybigkcmVzdWx0KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdHJ1bmNhdGVUYWJsZSgkcGFyYW1zKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtcyk7CgogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0YWJsZU5hbWUgPT0gImV2ZW50cyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVjaG8gIlBBTklDISAtIG11c3Qgbm90IHRydW5jYXRlIGV2ZW50cyB0YWJsZS4gUGxlYXNlIHJlcG9ydCB0aGlzIHNpdHVhdGlvbiB0byBWaXN1YWwgUEhQ4oSiIHN1cHBvcnQuIjsKICAgICAgICAgICAgICAgIGVjaG8gZ2V0RnVuY3Rpb25DYWxsKCk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkc3FsID0gIkRFTEVURSBGUk9NICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICAKCiAgICAgICAgICAgIHJldHVybigkcmVzdWx0KTsKICAgICAgICB9CiAgICB9CiAgICAgICAgCiAgICBmdW5jdGlvbiByZW5hbWVUYWJsZSgkb2xkUGFyYW1zLCAkbmV3UGFyYW1zKQogICAgewogICAgICAgICRvbGRUYWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJG9sZFBhcmFtcyk7CiAgICAgICAgJG5ld1RhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkbmV3UGFyYW1zKTsKCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRoaXMtPmdldFNxbE5hbWUoJG9sZFRhYmxlTmFtZSkuIiBSRU5BTUUgVE8gIi4kdGhpcy0+Z2V0U3FsTmFtZSgkbmV3VGFibGVOYW1lKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZXhlYygkc3FsKTsgICAgICAgIAoKICAgICAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvcHRpbWl6ZVRhYmxlKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRzcWwgPSAiT1BUSU1JWkUgVEFCTEUgIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZXhlYygkc3FsKTsgICAgICAgIAoKICAgICAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgICAgIH0KICAgIH0gICAgCgogICAgZnVuY3Rpb24gZ2V0RmllbGREZWZpbml0aW9uKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHBhcmFtcywgIiIsIGZhbHNlKTsgIC8vIHBybyBrb252ZXJ6aSAidHJ1ZSIgIG5hIHRydWUKICAgICAgICAvLyRwYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRwYXJhbXMpOyAgLy8gdiBpbnN0YWxhdG9ydSB0byB2eXZvbGEge3BocDogLi4ufSAsIGtkeXogdXogYnVkdSBwb3RyZWJvdmF0LCB0YWsgYmV6IGV2YWwge3BocDogfQoKICAgICAgICAkZmllbGREZWZpbml0aW9uID0gYXJyYXkoKTsKCiAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsidHlwZSJdID0gJHBhcmFtc1siZGF0YVR5cGUiXTsKICAgICAgICBpZiAoJHBhcmFtc1siZGF0YVR5cGVQYXJhbXMiXSkKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsidHlwZSJdIC49ICIoIi4kcGFyYW1zWyJkYXRhVHlwZVBhcmFtcyJdLiIpIjsKICAgICAgICBpZiAodG9Cb29sKCRwYXJhbXNbInVuc2lnbmVkIl0pKQogICAgICAgICAgICAkZmllbGREZWZpbml0aW9uWyJ0eXBlIl0gLj0gIiBVTlNJR05FRCI7CiAgICAgICAgaWYgKHRvQm9vbCgkcGFyYW1zWyJ6ZXJvZmlsbCJdKSkKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsidHlwZSJdIC49ICIgWkVST0ZJTEwiOwogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9leGl0OwogICAgICAgIGlmICh0b0Jvb2woJHBhcmFtc1sicHJpbWFyeUtleSJdKSkKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsia2V5Il0gPSAiUFJJTUFSWSBLRVkiOwogICAgICAgICAgICAKICAgICAgICBpZiAodG9Cb29sKCRwYXJhbXNbIm51bGxWYWx1ZSJdKSkKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsiY29uc3RyYWludCJdID0gIk5VTEwiOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsiY29uc3RyYWludCJdID0gIk5PVCBOVUxMIjsKICAgICAgICAKICAgICAgICBpZiAodG9Cb29sKCRwYXJhbXNbImF1dG9pbmNyZW1lbnQiXSkpCiAgICAgICAgICAgICRmaWVsZERlZmluaXRpb25bImV4dHJhIl0gPSAiQVVUT19JTkNSRU1FTlQiOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsiZXh0cmEiXSA9ICIiOwoKICAgICAgICBpZiAoaXNfYXJyYXkoJHBhcmFtc1siZGVmYXVsdFZhbHVlIl0pKQogICAgICAgICAgICAkcGFyYW1zWyJkZWZhdWx0VmFsdWUiXSA9IFRKU09OOjplbmNvZGUoJHBhcmFtc1siZGVmYXVsdFZhbHVlIl0pOwogICAgICAgIAogICAgICAgIGlmIChzdHJwb3MoJHBhcmFtc1siZGVmYXVsdFZhbHVlIl0sICJ7cGhwIikgIT09IEZBTFNFIHx8IHN0cnBvcygkcGFyYW1zWyJkZWZhdWx0VmFsdWUiXSwgIntzcWwiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICRwYXJhbXNbImRlZmF1bHRWYWx1ZSJdID0gIiI7CiAgICAgICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJkZWZhdWx0VmFsdWUiXSA9PT0gdHJ1ZSkKICAgICAgICAgICAgJHBhcmFtc1siZGVmYXVsdFZhbHVlIl0gPSAidHJ1ZSI7CiAgICAgICAgaWYgKCRwYXJhbXNbImRlZmF1bHRWYWx1ZSJdID09PSBmYWxzZSkKICAgICAgICAgICAgJHBhcmFtc1siZGVmYXVsdFZhbHVlIl0gPSAiZmFsc2UiOwogICAgICAgIAogICAgICAgIGlmIChzdHJpcG9zKCRwYXJhbXNbImRhdGFUeXBlIl0sICJ0ZXh0IikgIT09IEZBTFNFIHx8IHN0cmlwb3MoJHBhcmFtc1siZGF0YVR5cGUiXSwgImJsb2IiKSAhPT0gRkFMU0UgfHwgKCEkcGFyYW1zWyJkZWZhdWx0VmFsdWUiXSAmJiAkZmllbGREZWZpbml0aW9uWyJjb25zdHJhaW50Il0gPT0gIk5VTEwiKSB8fCB0b0Jvb2woJHBhcmFtc1siYXV0b2luY3JlbWVudCJdKSkKICAgICAgICAgICAgJGZpZWxkRGVmaW5pdGlvblsiZGVmYXVsdCJdID0gIiI7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJGRlZmF1bHRWYWx1ZSA9ICRwYXJhbXNbImRlZmF1bHRWYWx1ZSJdOwogICAgICAgICAgICBpZiAoJGRlZmF1bHRWYWx1ZSA9PSAiIikKICAgICAgICAgICAgICAgICRkZWZhdWx0VmFsdWUgPSAkdGhpcy0+Z2V0RGVmYXVsdFZhbHVlKCRwYXJhbXMpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRmaWVsZERlZmluaXRpb25bImRlZmF1bHQiXSA9ICJERUZBVUxUICIuKCRkZWZhdWx0VmFsdWUgPT0gIk5VTEwiID8gIk5VTEwiIDogIiciLiRkZWZhdWx0VmFsdWUuIiciKTsgIC8vIFBvc3RncmVTUUwgbmVlZHMgJyBub3QgIgogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGZpZWxkRGVmaW5pdGlvbik7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKCRwYXJhbXMpCiAgICB7CiAgICAgICAgLy8gVE9ETyB1c2luZyAkRGJMaW5rLT5kYXRhVHlwZXMKICAgICAgICBpZiAoJHBhcmFtc1sibnVsbFZhbHVlIl0pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oIk5VTEwiKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaChzdHJ0b3VwcGVyKCRwYXJhbXNbImRhdGFUeXBlIl0pKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAiQ0hBUiI6CiAgICAgICAgICAgIGNhc2UgIkNIQVJBQ1RFUiI6CiAgICAgICAgICAgIGNhc2UgIlZBUkNIQVIiOgogICAgICAgICAgICBjYXNlICJMT05HVkFSQ0hBUiI6CiAgICAgICAgICAgIGNhc2UgIkNIQVJBQ1RFUiBWQVJZSU5HIjoKICAgICAgICAgICAgY2FzZSAiTE9ORyBDSEFSQUNURVIgVkFSWUlORyI6CiAgICAgICAgICAgIGNhc2UgIlNUUklORyI6CiAgICAgICAgICAgIGNhc2UgIlRFWFQiOgogICAgICAgICAgICBjYXNlICJUSU5ZVEVYVCI6CiAgICAgICAgICAgIGNhc2UgIk1FRElVTVRFWFQiOgogICAgICAgICAgICBjYXNlICJMT05HVEVYVCI6CiAgICAgICAgICAgIGNhc2UgIkJMT0IiOgogICAgICAgICAgICBjYXNlICJUSU5ZQkxPQiI6CiAgICAgICAgICAgIGNhc2UgIk1FRElVTUJMT0IiOgogICAgICAgICAgICBjYXNlICJMT05HQkxPQiI6CiAgICAgICAgICAgIGNhc2UgIkJJTkFSWSI6CiAgICAgICAgICAgIGNhc2UgIlZBUkJJTkFSWSI6CiAgICAgICAgICAgIGNhc2UgIkxPTkdWQVJCSU5BUlkiOgogICAgICAgICAgICBjYXNlICJDTE9CIjoKICAgICAgICAgICAgY2FzZSAiRU5VTSI6CiAgICAgICAgICAgIGNhc2UgIlNFVCI6CiAgICAgICAgICAgIGNhc2UgIkJZVEVBIjoKICAgICAgICAgICAgICAgIHJldHVybigiIik7CiAgICAgICAgICAgIGNhc2UgIkJJVCI6CiAgICAgICAgICAgIGNhc2UgIlRJTllJTlQiOgogICAgICAgICAgICBjYXNlICJTTUFMTElOVCI6CiAgICAgICAgICAgIGNhc2UgIk1FRElVTUlOVCI6CiAgICAgICAgICAgIGNhc2UgIkJJR0lOVCI6CiAgICAgICAgICAgIGNhc2UgIklOVCI6CiAgICAgICAgICAgIGNhc2UgIklOVEVHRVIiOgogICAgICAgICAgICBjYXNlICJGTE9BVCI6CiAgICAgICAgICAgIGNhc2UgIkRPVUJMRSI6CiAgICAgICAgICAgIGNhc2UgIkRPVUJMRSBQUkVDSVNJT04iOgogICAgICAgICAgICBjYXNlICJSRUFMIjoKICAgICAgICAgICAgY2FzZSAiTlVNRVJJQyI6CiAgICAgICAgICAgIGNhc2UgIkRFQ0lNQUwiOgogICAgICAgICAgICBjYXNlICJERUMiOgogICAgICAgICAgICBjYXNlICJUSU1FU1RBTVAiOgogICAgICAgICAgICBjYXNlICJCT09MIjoKICAgICAgICAgICAgY2FzZSAiQk9PTEVBTiI6CiAgICAgICAgICAgIGNhc2UgIllFQVIiOgogICAgICAgICAgICBjYXNlICJTRVJJQUwiOgogICAgICAgICAgICBjYXNlICJCSUdTRVJJQUwiOgogICAgICAgICAgICBjYXNlICJJTlRFUlZBTCI6CiAgICAgICAgICAgICAgICByZXR1cm4oIjAiKTsKICAgICAgICAgICAgY2FzZSAiREFURSI6CiAgICAgICAgICAgICAgICByZXR1cm4oIjAwMDAtMDAtMDAiKTsKICAgICAgICAgICAgY2FzZSAiVElNRSI6CiAgICAgICAgICAgICAgICByZXR1cm4oIjAwOjAwOjAwIik7CiAgICAgICAgICAgIGNhc2UgIkRBVEVUSU1FIjoKICAgICAgICAgICAgICAgIHJldHVybigiMDAwMC0wMC0wMCAwMDowMDowMCIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SW5kZXhMZW5ndGgoJHBhcmFtcykKICAgIHsKICAgICAgICBzd2l0Y2goc3RydG91cHBlcigkcGFyYW1zWyJkYXRhVHlwZSJdKSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgIlRJTllURVhUIjoKICAgICAgICAgICAgY2FzZSAiVEVYVCI6CiAgICAgICAgICAgIGNhc2UgIk1FRElVTVRFWFQiOgogICAgICAgICAgICBjYXNlICJMT05HVEVYVCI6CgogICAgICAgICAgICBjYXNlICJCSU5BUlkiOgogICAgICAgICAgICBjYXNlICJWQVJCSU5BUlkiOgogICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSAiVElOWUJMT0IiOgogICAgICAgICAgICBjYXNlICJNRURJVU1CTE9CIjoKICAgICAgICAgICAgY2FzZSAiQkxPQiI6CiAgICAgICAgICAgIGNhc2UgIkxPTkdCTE9CIjoKICAgICAgICAgICAgICAgIHJldHVybigiMjU1Iik7CiAgICAgICAgfQogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gYWRkRmllbGQoJHRhYmxlUGFyYW1zLCAkcGFyYW1zLCAkc2lsZW50PWZhbHNlKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKICAgICAgICAkZmllbGROYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCRwYXJhbXMpOwoKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRmaWVsZERlZiA9ICR0aGlzLT5nZXRGaWVsZERlZmluaXRpb24oJHBhcmFtcyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiBBREQgQ09MVU1OICI7CiAgICAgICAgICAgICRzcWwgLj0gJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkTmFtZSkuIiAiLiRmaWVsZERlZlsidHlwZSJdLiIgIi4kZmllbGREZWZbImtleSJdLiIgIi4kZmllbGREZWZbImNvbnN0cmFpbnQiXS4iICIuJGZpZWxkRGVmWyJleHRyYSJdLiIgIi4kZmllbGREZWZbImRlZmF1bHQiXTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwsIGZhbHNlLCAkc2lsZW50KTsgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgJHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHBhcmFtcywgIiIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKCRyZXN1bHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJpbmRleCJdKQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hZGRJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImZ1bGx0ZXh0Il0pCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFkZEZ1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gZHJvcEZpZWxkKCR0YWJsZVBhcmFtcywgJHBhcmFtcywgJHNpbGVudD1mYWxzZSkKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgJGZpZWxkTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTsKCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiBEUk9QIENPTFVNTiAiLiR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZE5hbWUpOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCwgZmFsc2UsICRzaWxlbnQpOyAgICAgICAgCiAgICAgICAgICAgIGlmICgkcmVzdWx0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gZXh0cmFjdFBhcmFtcygkcGFyYW1zLCAiIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImluZGV4Il0gJiYgJHRoaXMtPmhhc0luZGV4KCR0YWJsZVBhcmFtcywgJHBhcmFtcykpCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRyb3BJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImZ1bGx0ZXh0Il0gJiYgJHRoaXMtPmhhc0Z1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKSkKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHJvcEZ1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgZnVuY3Rpb24gZ2V0SW5kZXhEZWNsYXJhdGlvbigpCiAgICB7CgogICAgfQogICAgKi8KICAgIAogICAgZnVuY3Rpb24gZ2V0SW5kZXhOYW1lKCR0YWJsZVBhcmFtcywgJHBhcmFtcywgJG5hbWU9IiIpCiAgICB7CiAgICAgICAgJGZpZWxkcyA9ICR0aGlzLT5nZXRJbmRleEZpZWxkcygkdGFibGVQYXJhbXMsICRwYXJhbXMpOwoKICAgICAgICBpZiAoISRuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmllbGRzOwogICAgICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCIsIiwgIl8iLCAkbmFtZSk7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoImAiLCAiIiwgJG5hbWUpOwogICAgICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCIoIiwgIiIsICRuYW1lKTsKICAgICAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiKSIsICIiLCAkbmFtZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkbmFtZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldEluZGV4RmllbGRzKCR0YWJsZVBhcmFtcywgJHBhcmFtcykKICAgIHsKICAgICAgICAkZmllbGROYW1lcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRwYXJhbSkKICAgICAgICB7CiAgICAgICAgICAgICRpbmRleExlbmd0aCA9IDA7CiAgICAgICAgICAgIGlmIChfaXNfYXJyYXkoJHBhcmFtKSkKICAgICAgICAgICAgICAgICRpbmRleExlbmd0aCA9ICR0aGlzLT5nZXRJbmRleExlbmd0aCgkcGFyYW0pOwogICAgICAgICAgICAkZmllbGROYW1lc1tdID0gJHRoaXMtPmdldFNxbE5hbWUoJHRoaXMtPmdldFJlYWxOYW1lKCRwYXJhbSkpLigkaW5kZXhMZW5ndGggPyAiKCIuJGluZGV4TGVuZ3RoLiIpIiA6ICIiKTsKICAgICAgICB9CiAgICAgICAgJGZpZWxkcyA9IGltcGxvZGUoIiwiLCAkZmllbGROYW1lcyk7CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkZmllbGRzKTsKICAgICAgICByZXR1cm4oJGZpZWxkcyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zLCAkbmFtZT0iIikKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5oYXNJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lKSkKICAgICAgICB7CiAgICAgICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBhcmFtcykpCiAgICAgICAgICAgICAgICAkcGFyYW1zID0gZXhwbG9kZUxpc3QoJHBhcmFtcyk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFpc3NldCgkcGFyYW1zWzBdKSkKICAgICAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkcGFyYW1zKTsKCiAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPmdldEluZGV4TmFtZSgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lKTsKICAgICAgICAgICAgJGZpZWxkcyA9ICR0aGlzLT5nZXRJbmRleEZpZWxkcygkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpbmRleExlbmd0aCA9ICR0aGlzLT5nZXRJbmRleExlbmd0aCgkcGFyYW1zKTsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIElOREVYICIuJHRoaXMtPmdldFNxbE5hbWUoJG5hbWUpLiIgT04gIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKS4iKCIuJGZpZWxkcy4iKTsiOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkc3FsKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZXhlYygkc3FsKTsgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBkcm9wSW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zLCAkbmFtZT0iIikKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmhhc0luZGV4KCR0YWJsZVBhcmFtcywgJHBhcmFtcywgJG5hbWUpKQogICAgICAgIHsKICAgICAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkdGFibGVQYXJhbXMpOwoKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkcGFyYW1zKSkKICAgICAgICAgICAgICAgICRwYXJhbXMgPSBleHBsb2RlTGlzdCgkcGFyYW1zKTsKICAgICAgICAgICAgZWxzZSBpZiAoIWlzc2V0KCRwYXJhbXNbMF0pKQogICAgICAgICAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRwYXJhbXMpOwoKICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+Z2V0SW5kZXhOYW1lKCR0YWJsZVBhcmFtcywgJHBhcmFtcywgJG5hbWUpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiRFJPUCBJTkRFWCAiLiR0aGlzLT5nZXRTcWxOYW1lKCRuYW1lKS4iIE9OICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCwgdHJ1ZSwgdHJ1ZSk7ICAgICAgICAKCiAgICAgICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UHJpbWFyeUtleSgkdGFibGVQYXJhbXMsICRwYXJhbXMpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkdGFibGVQYXJhbXMpOwoKICAgICAgICBpZiAoaXNfc3RyaW5nKCRwYXJhbXMpKQogICAgICAgICAgICAkcGFyYW1zID0gZXhwbG9kZUxpc3QoJHBhcmFtcyk7CiAgICAgICAgZWxzZSBpZiAoIWlzc2V0KCRwYXJhbXNbMF0pKQogICAgICAgICAgICAkcGFyYW1zID0gYXJyYXkoJHBhcmFtcyk7CgogICAgICAgICRmaWVsZE5hbWVzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCRwYXJhbXMgYXMgJHBhcmFtKQogICAgICAgIHsKICAgICAgICAgICAgJGZpZWxkTmFtZXNbXSA9ICR0aGlzLT5nZXRTcWxOYW1lKCR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW0pKTsKICAgICAgICB9CiAgICAgICAgJGZpZWxkcyA9IGltcGxvZGUoIiwiLCAkZmllbGROYW1lcyk7CgogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIgQUREIFBSSU1BUlkgS0VZICgiLiRmaWVsZHMuIik7IjsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmVzdWx0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZHJvcFByaW1hcnlLZXkoJHRhYmxlUGFyYW1zKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiBEUk9QIFBSSU1BUlkgS0VZOyI7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZXhlYygkc3FsLCB0cnVlLCB0cnVlKTsgICAgICAgIAoKICAgICAgICAgICAgLy8gd2Ugd2FudCB0byByZXR1cm4gdHJ1ZSAodGhlIHByaW1hcnkga2V5IG1heSBub3QgZXhpc3QpCiAgICAgICAgICAgIHJldHVybih0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWRkRnVsbHRleHRJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lPSIiKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKICAgICAgICAvLyRmaWVsZE5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtcyk7CgogICAgICAgIGlmIChpc19zdHJpbmcoJHBhcmFtcykpCiAgICAgICAgICAgICRwYXJhbXMgPSBleHBsb2RlTGlzdCgkcGFyYW1zKTsKICAgICAgICBlbHNlIGlmICghaXNzZXQoJHBhcmFtc1swXSkpCiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkcGFyYW1zKTsKCiAgICAgICAgJGZpZWxkTmFtZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkcGFyYW0pCiAgICAgICAgewogICAgICAgICAgICAkaW5kZXhMZW5ndGggPSAwOwogICAgICAgICAgICAvL2lmIChfaXNfYXJyYXkoJHBhcmFtKSkKICAgICAgICAgICAgLy8gICAgJGluZGV4TGVuZ3RoID0gJHRoaXMtPmdldEluZGV4TGVuZ3RoKCRwYXJhbSk7CiAgICAgICAgICAgICRmaWVsZE5hbWVzW10gPSAkdGhpcy0+Z2V0U3FsTmFtZSgkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtKSkuKCRpbmRleExlbmd0aCA/ICIoIi4kaW5kZXhMZW5ndGguIikiIDogIiIpOwogICAgICAgIH0KICAgICAgICAkZmllbGRzID0gaW1wbG9kZSgiLCIsICRmaWVsZE5hbWVzKTsKCiAgICAgICAgaWYgKCEkbmFtZSkKICAgICAgICB7CiAgICAgICAgICAgICRuYW1lID0gImZ1bGx0ZXh0XyIuJGZpZWxkczsKICAgICAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiLCIsICJfIiwgJG5hbWUpOwogICAgICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCJgIiwgIiIsICRuYW1lKTsKICAgICAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiKCIsICIiLCAkbmFtZSk7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIikiLCAiIiwgJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gIkNSRUFURSBGVUxMVEVYVCBJTkRFWCAiLiRuYW1lLiIgT04gIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKS4iKCIuJGZpZWxkcy4iKTsiOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICAKCiAgICAgICAgICAgIHJldHVybigkcmVzdWx0KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZHJvcEZ1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgaWYgKGlzX3N0cmluZygkcGFyYW1zKSkKICAgICAgICAgICAgJG5hbWUgPSAkcGFyYW1zOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgICRuYW1lID0gImZ1bGx0ZXh0XyIuJHRoaXMtPmdldFJlYWxOYW1lKCRwYXJhbXMpOwoKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRzcWwgPSAiRFJPUCBJTkRFWCAiLiRuYW1lLiIgT04gIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwsIHRydWUsIHRydWUpOyAgICAgICAgCgogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFVuaXF1ZUtleSgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lPSIiKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgaWYgKGlzX3N0cmluZygkcGFyYW1zKSkKICAgICAgICAgICAgJHBhcmFtcyA9IGV4cGxvZGVMaXN0KCRwYXJhbXMpOwogICAgICAgIGVsc2UgaWYgKCFpc3NldCgkcGFyYW1zWzBdKSkKICAgICAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRwYXJhbXMpOwoKICAgICAgICAkZmllbGROYW1lcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRwYXJhbSkKICAgICAgICB7CiAgICAgICAgICAgICRmaWVsZE5hbWVzW10gPSAkdGhpcy0+Z2V0U3FsTmFtZSgkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtKSk7CiAgICAgICAgfQogICAgICAgICRmaWVsZHMgPSBpbXBsb2RlKCIsIiwgJGZpZWxkTmFtZXMpOwoKICAgICAgICBpZiAoISRuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgJG5hbWUgPSAidW5pcXVlXyIuJGZpZWxkczsKICAgICAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiLCIsICJfIiwgJG5hbWUpOwogICAgICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCJgIiwgIiIsICRuYW1lKTsKICAgICAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiKCIsICIiLCAkbmFtZSk7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoIikiLCAiIiwgJG5hbWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCRuYW1lKTsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRpbmRleExlbmd0aCA9ICR0aGlzLT5nZXRJbmRleExlbmd0aCgkcGFyYW1zKTsKICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVU5JUVVFIElOREVYICIuJG5hbWUuIiBPTiAiLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIoIi4kZmllbGRzLiIpOyI7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHNxbCk7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZXhlYygkc3FsKTsgICAgICAgIAogICAgICAgICAgICBpZiAoISRyZXN1bHQpCiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiYWRkVW5pcXVlS2V5KCciLiRmaWVsZHMuIicpOiAiLiR0aGlzLT5lcnJvciwgbXRFcnJvcik7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmVycm9yKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVzdWx0KTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAvKkFMVEVSIFRBQkxFICBgbWVtYmVyc2AgQUREIFVOSVFVRSAoCiAgICAgICAgICAgICAgICBgYmlydGhOdW1iZXJgCiAgICAgICAgICAgICAgICApOyAgICAgICAgCiAgICAgICAgICAgICovCiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBkcm9wVW5pcXVlS2V5KCR0YWJsZVBhcmFtcywgJHBhcmFtcykKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CgogICAgICAgIGlmIChpc19zdHJpbmcoJHBhcmFtcykpCiAgICAgICAgICAgICRuYW1lID0gJHBhcmFtczsKICAgICAgICBlbHNlIAogICAgICAgICAgICAkbmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTs7CgogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHNxbCA9ICJEUk9QIElOREVYICIuJG5hbWUuIiBPTiAiLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCwgdHJ1ZSwgdHJ1ZSk7ICAgICAgICAKCiAgICAgICAgICAgIHJldHVybih0cnVlKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNoZWNrRGF0YVR5cGUoJGRhdGFUeXBlLCAkZGF0YVR5cGVQYXJhbXMpCiAgICB7CiAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gcHJvY2Vzc0RlbGF5ZWRRdWVyaWVzKCR0YWJsZVBhcmFtcykKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CgogICAgICAgIC8vIGZvciBmaXJzdCByYXcgcXVlcmllcwogICAgICAgIGlmICghb2JqZWN0RGVmaW5lZCgiTG9jayIpKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgICRMb2NrID0gZ2V0T2JqZWN0KCJMb2NrIik7CiAgICAgICAgaWYgKCEkTG9jay0+bG9ja2VkKCJkZWxheWVkX3F1ZXJ5XyIuJHRhYmxlTmFtZSkgJiYgISRMb2NrLT5sb2NrZWQoImRlbGF5ZWRfcXVlcnlfcHJvY2Vzc18iLiR0YWJsZU5hbWUpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKFBST0pFQ1RQQVRILiJjYWNoZS9kZWxheWVkLyIuJHRhYmxlTmFtZSkpIC8vIHRvIG5vdCBkbyBnbG9iIGV2ZXJ5IGRiIHF1ZXJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRtYXhUaW1lID0gMjsKICAgICAgICAgICAgICAgIGlmICgkTG9jay0+bG9jaygiZGVsYXllZF9xdWVyeV9wcm9jZXNzXyIuJHRhYmxlTmFtZSwgMSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVzID0gX2dsb2IoUFJPSkVDVFBBVEguImNhY2hlL2RlbGF5ZWQvIi4kdGFibGVOYW1lLiIvKi5xdWVyeSIpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICBzb3J0KCRmaWxlcyk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZmlsZXMpOwogICAgICAgICAgICAgICAgICAgICR0aW1lU3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCRmaWxlcykgOyAkaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZmlsZXNbJGldOwogICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnkgPSBUSlNPTjo6ZGVjb2RlKF9maWxlX2dldF9jb250ZW50cygkZmlsZSksIGFycmF5KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGhvZCA9ICRxdWVyeVsibWV0aG9kIl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbWV0aG9kKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRxdWVyeVsibWV0aG9kIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiRtZXRob2QoJHF1ZXJ5WyJ0YWJsZVBhcmFtcyJdLCAkcXVlcnlbInJlY29yZCJdLCAkcXVlcnlbInBhcmFtcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHF1ZXJ5WyJtZXRob2QiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5sYXN0U3FsUXVlcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBfdW5saW5rKCRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pY3JvdGltZSh0cnVlKS0kdGltZVN0YXJ0ID4gJG1heFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoIk1BWCBUSU1FIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aW1lU3RhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChtaWNyb3RpbWUodHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChtaWNyb3RpbWUodHJ1ZSktJHRpbWVTdGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoIV9nbG9iKFBST0pFQ1RQQVRILiJjYWNoZS9kZWxheWVkLyIuJHRhYmxlTmFtZS4iLyoucXVlcnkiKSkKICAgICAgICAgICAgICAgICAgICAgICAgX3JtZGlyKFBST0pFQ1RQQVRILiJjYWNoZS9kZWxheWVkLyIuJHRhYmxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRMb2NrLT51bmxvY2soImRlbGF5ZWRfcXVlcnlfcHJvY2Vzc18iLiR0YWJsZU5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHByZVByb2Nlc3NEZWxheWVkUXVlcnkoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zLCAkbWV0aG9kTmFtZSkKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CgogICAgICAgIGlmICghb2JqZWN0RGVmaW5lZCgiTG9jayIpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgICRMb2NrID0gZ2V0T2JqZWN0KCJMb2NrIik7CiAgICAgICAgaWYgKCRwYXJhbXNbImxvY2siXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghJExvY2stPmxvY2soImRlbGF5ZWRfcXVlcnlfIi4kdGFibGVOYW1lLCAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGRlbGF5ZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZpbGVfZXhpc3RzKFBST0pFQ1RQQVRILiJjYWNoZS9kZWxheWVkLyIuJHRhYmxlTmFtZSkpCiAgICAgICAgICAgICRkZWxheWVkID0gdHJ1ZTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siZGVsYXllZCJdIHx8ICRkZWxheWVkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRMb2NrLT5sb2NrZWQoImRlbGF5ZWRfcXVlcnlfIi4kdGFibGVOYW1lKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGZpbGUgPSBQUk9KRUNUUEFUSC4iY2FjaGUvZGVsYXllZC8iLiR0YWJsZU5hbWUuIi8iLihtaWNyb3RpbWUodHJ1ZSkqMTAwMDApLiIucXVlcnkiOwoKICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXNbImRlbGF5ZWQiXSk7CiAgICAgICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJGZpbGUsIFRKU09OOjplbmNvZGUoYXJyYXkoInRhYmxlUGFyYW1zIj0+JHRhYmxlUGFyYW1zLCAibWV0aG9kIj0+JG1ldGhvZE5hbWUsICJyZWNvcmQiPT4kcmVjb3JkLCAicGFyYW1zIj0+JHBhcmFtcykpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5wcm9jZXNzRGVsYXllZFF1ZXJpZXMoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcG9zdFByb2Nlc3NEZWxheWVkUXVlcnkoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zLCAkbWV0aG9kTmFtZSkKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CgogICAgICAgIGlmICghb2JqZWN0RGVmaW5lZCgiTG9jayIpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgICRMb2NrID0gZ2V0T2JqZWN0KCJMb2NrIik7CgogICAgICAgIGlmICgkcGFyYW1zWyJsb2NrIl0pCiAgICAgICAgewogICAgICAgICAgICAkTG9jay0+dW5sb2NrKCJkZWxheWVkX3F1ZXJ5XyIuJHRhYmxlTmFtZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aGlzLT5wcm9jZXNzRGVsYXllZFF1ZXJpZXMoJHRhYmxlUGFyYW1zKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNlcnRSZWNvcmQoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5wcmVQcm9jZXNzRGVsYXllZFF1ZXJ5KCR0YWJsZVBhcmFtcywgJHJlY29yZCwgJHBhcmFtcywgImluc2VydFJlY29yZCIpKQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CgogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgLy8gISEhIHBva3VkIGplIHRhYnVsa2EgaW4gdXNlIC0gYmFkIC0gaGFzIGVueSBlcnJvciAtIGl0IGxvb3BzICBvbiBJTlNFUlQgREVMQVlFRCBJTlRPIC4uLiBhbmQgaXMgbm90IGtpbGxhYmxlCiAgICAgICAgJHBhcmFtc1siZGVsYXllZCJdID0gZmFsc2U7CgoKICAgICAgICAvL2lmICgkdGFibGVOYW1lID09ICJ1cmxfbG9nIikKICAgICAgICAvLyAgICByZXR1cm47CiAgICAgICAgCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkZmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZCBhcyAkZmllbGQgPT4gJHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlICE9PSBVTlNFVFZBTFVFKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRmaWVsZHNbXSA9ICR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlc1tdID0gKCR2YWx1ZSA9PT0gTlVMTCB8fCAkdmFsdWUgPT09ICJOVUxMIiA/ICJOVUxMIiA6ICInIi4kdGhpcy0+ZXNjYXBlU3RyaW5nKHRvU3RyaW5nKCR2YWx1ZSkpLiInIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vJHBhcmFtc1siZGVsYXllZCJdID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICAkc3FsID0gIklOU0VSVCAiLigkcGFyYW1zWyJsb3dQcmlvcml0eSJdID8gIkxPV19QUklPUklUWSAiIDogIiIpLigkcGFyYW1zWyJkZWxheWVkIl0gPyAiREVMQVlFRCAiIDogIiIpLiJJTlRPICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiAoIi5pbXBsb2RlKCIsIiwgJGZpZWxkcykuIikgVkFMVUVTICgiLmltcGxvZGUoIiwiLCAkdmFsdWVzKS4iKTsiOwogICAgICAgICAgICAvL2VjaG8gJHNxbDsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgCiAgICAgICAgICAgIC8vZHVtcCgkc3FsKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAkdGhpcy0+cG9zdFByb2Nlc3NEZWxheWVkUXVlcnkoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zLCAiaW5zZXJ0UmVjb3JkIik7CgogICAgICAgICAgICByZXR1cm4oJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHRyaWVkIHRvIHNhdmUgZGF0YSBiaWdnZXIgdGhhbiBtYXhfYWxsb3dlZF9wYWNrZXQsIGJ1dCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZSBhbmQgY2Fubm90IGJlIGNoYW5nZWQgYW5kIGFsc28gQ09OQ0FUKCkgZG9lcyBub3Qgd29yayBmb3IgZGF0YSBiaWdnZXIgdGhhbiB0aGlzIGxpbWl0CiAgICAgICAgLyoKICAgICAgICAgICAgJGRhdGEgPSBhcnJheSgpOwogICAgICAgICAgICAkZGF0YTIgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRyZWNvcmQgYXMgJGZpZWxkID0+ICR2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSAhPT0gVU5TRVRWQUxVRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZFsiaWQiXSAmJiAkdGhpcy0+bWF4QWxsb3dlZFBhY2tldFNpemUgJiYgc3RybGVuKHRvU3RyaW5nKCR2YWx1ZSkpID4gZmxvb3IoJHRoaXMtPm1heEFsbG93ZWRQYWNrZXRTaXplLzEwKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhWyR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCldID0gIicnIjsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEyWyRmaWVsZF0gPSB0b1N0cmluZygkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhWyR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCldID0gKCR2YWx1ZSA9PT0gTlVMTCA/ICJOVUxMIiA6ICInIi4kdGhpcy0+ZXNjYXBlU3RyaW5nKHRvU3RyaW5nKCR2YWx1ZSkpLiInIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNxbCA9ICJJTlNFUlQgSU5UTyAiLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIgKCIuaW1wbG9kZSgiLCIsIGFycmF5X2tleXMoJGRhdGEpKS4iKSBWQUxVRVMgKCIuaW1wbG9kZSgiLCIsICRkYXRhKS4iKTsiOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICAKCiAgICAgICAgICAgIGZvcmVhY2goJGRhdGEyIGFzICRmaWVsZCA9PiAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdoaWxlKCR2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUyID0gc3Vic3RyKCR2YWx1ZSwgMCwgZmxvb3IoJHRoaXMtPm1heEFsbG93ZWRQYWNrZXRTaXplLzEwKSk7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gc3Vic3RyKCR2YWx1ZSwgZmxvb3IoJHRoaXMtPm1heEFsbG93ZWRQYWNrZXRTaXplLzEwKSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHN0cmxlbigkdmFsdWUyKSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHN0cmxlbigkdmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5leGVjKCJTRVQgbWF4X2FsbG93ZWRfcGFja2V0PSIuKHN0cmxlbigkcmVjb3JkWyRmaWVsZF0pKjIpLiI7Iik7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIlNFVCBncm91cF9jb25jYXRfbWF4X2xlbj0iLihzdHJsZW4oJHJlY29yZFskZmllbGRdKSoyKS4iOyIpOwogICAgICAgICAgICAgICAgICAgICRzcWwyID0gIlVQREFURSAiLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIgU0VUICIuJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkKS4iPUNPTkNBVCgiLiR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCkuIiwgJyIuJHRoaXMtPmVzY2FwZVN0cmluZygkdmFsdWUyKS4iJykgV0hFUkUgaWQ9JyIuJHJlY29yZFsiaWQiXS4iJzsiOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5leGVjKCRzcWwyKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHNxbDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgKi8gICAgICAgIAogICAgfQogICAgCiAgICBmdW5jdGlvbiB1cGRhdGVSZWNvcmQoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5wcmVQcm9jZXNzRGVsYXllZFF1ZXJ5KCR0YWJsZVBhcmFtcywgJHJlY29yZCwgJHBhcmFtcywgInVwZGF0ZVJlY29yZCIpKQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CgogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkdmFsdWVzID0gYXJyYXkoKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3JkKTsKICAgICAgICAgICAgZm9yZWFjaCgkcmVjb3JkIGFzICRmaWVsZCA9PiAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgIT09IFVOU0VUVkFMVUUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gTlVMTCB8fCAkdmFsdWUgPT09ICJOVUxMIikKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlc1tdID0gJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkKS4iPSIuIk5VTEwiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9pc19hcnJheSgkdmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiVFNxbERiTGluayBQQU5JQyE6IHZhbHVlIGZvciAkZmllbGQgaXMgQXJyYXkhIjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVzW10gPSAkdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiI9Ii4iJyIuJHRoaXMtPmVzY2FwZVN0cmluZyh0b1N0cmluZygkdmFsdWUpKS4iJyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy92YXJfZHVtcCgkdmFsdWVzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vcGFyZW50OjpzZWxlY3QoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5jbGVhcigpOwogICAgICAgICAgICAkdGhpcy0+ZmlsdGVycyA9ICR0aGlzLT5nZXRGaWx0ZXJzKCR0YWJsZVBhcmFtcywgJHBhcmFtcyk7CiAgICAgICAgICAgICRmaWx0ZXJzID0gJHRoaXMtPmdldFNxbEZpbHRlcnMoKTsKICAgICAgICAgICAgLy8kZmlsdGVycyA9ICR0aGlzLT5nZXRTcWxGaWx0ZXJzKCIiLCAiIiwgJHBhcmFtc1sidGFibGVBbGlhcyJdKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZmlsdGVycyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkc3FsID0gIlVQREFURSAiLigkcGFyYW1zWyJsb3dQcmlvcml0eSJdID8gIkxPV19QUklPUklUWSAiIDogIiIpLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIgU0VUICIuaW1wbG9kZSgiLCIsICR2YWx1ZXMpLigkZmlsdGVycyA/ICIgV0hFUkUgIi4kZmlsdGVycyA6ICIiKTsKCiAgICAgICAgICAgIC8vaWYgKCR0YWJsZU5hbWUgPT0gImV2ZW50cyIpCiAgICAgICAgICAgIC8vICAgX2xvZygkc3FsKTsKICAgICAgICAgICAgLy9kdW1wKCRzcWwpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRzcWwpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICAKCiAgICAgICAgICAgICR0aGlzLT5wb3N0UHJvY2Vzc0RlbGF5ZWRRdWVyeSgkdGFibGVQYXJhbXMsICRyZWNvcmQsICRwYXJhbXMsICJ1cGRhdGVSZWNvcmQiKTsKCiAgICAgICAgICAgIHJldHVybigkcmVzdWx0KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVsZXRlUmVjb3JkKCR0YWJsZVBhcmFtcywgJHBhcmFtcykKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnByZVByb2Nlc3NEZWxheWVkUXVlcnkoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zLCAiZGVsZXRlUmVjb3JkIikpCiAgICAgICAgICAgIHJldHVybih0cnVlKTsKCiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkdGFibGVQYXJhbXMpOwoKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICR2YWx1ZXMgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRyZWNvcmQgYXMgJGZpZWxkID0+ICR2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHZhbHVlc1tdID0gJGZpZWxkLiI9Ii4iJyIuJHZhbHVlLiInIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgcGFyZW50OjpzZWxlY3QoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKTsKICAgICAgICAgICAgJGZpbHRlcnMgPSAkdGhpcy0+Z2V0U3FsRmlsdGVycygpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCEkZmlsdGVycyAmJiAkdGFibGVOYW1lID09ICJldmVudHMiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICJQQU5JQyEgLSBtdXN0IG5vdCBkZWxldGUgZnJvbSBldmVudHMgdGFibGUuIFBsZWFzZSByZXBvcnQgdGhpcyBzaXR1YXRpb24gdG8gVmlzdWFsIFBIUOKEoiBzdXBwb3J0Ljxocj4iOwogICAgICAgICAgICAgICAgdmFyX2R1bXAoJGZpbHRlcnMpOwogICAgICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vc2xlZXAoMTApOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8kc3FsID0gIkRFTEVURSBGUk9NICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiAiLigkZmlsdGVycyA/ICIgV0hFUkUgIi4kZmlsdGVycyA6ICIiKTsKICAgICAgICAgICAgJHNxbCA9ICJERUxFVEUgIi4oJHBhcmFtc1sibG93UHJpb3JpdHkiXSA/ICJMT1dfUFJJT1JJVFkgIiA6ICIiKS4oJHBhcmFtc1sicXVpY2siXSA/ICJRVUlDSyAiIDogIiIpLiJGUk9NICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiBXSEVSRSAiLiRmaWx0ZXJzOwogICAgICAgICAgICAKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5leGVjKCRzcWwpOyAgICAgICAgCgogICAgICAgICAgICAkdGhpcy0+cG9zdFByb2Nlc3NEZWxheWVkUXVlcnkoJHRhYmxlUGFyYW1zLCAkcmVjb3JkLCAkcGFyYW1zLCAiZGVsZXRlUmVjb3JkIik7CgogICAgICAgICAgICByZXR1cm4oJHJlc3VsdCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICBmdW5jdGlvbiBnZXRTcWxGaWVsZHMoJHRhYmxlUHJlZml4PSIiLCAkdGFibGVQYXJhbXM9TlVMTCkKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCR0YWJsZU5hbWUpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+YWRkaXRpb25hbEZpZWxkcyk7CiAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+ZmllbGRzKTsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmZpZWxkcykpCiAgICAgICAgewogICAgICAgICAgICAkZmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+ZmllbGRzIGFzICRmaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGZpZWxkc1tdID0gKCR0YWJsZVByZWZpeCAmJiBzdHJpcG9zKCRmaWVsZCwgIiBhcyAiKSA9PT0gRkFMU0UgPyAkdGFibGVQcmVmaXguIi4iIDogIiIpLiR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNxbCA9IGltcGxvZGUoIiwiLCAkZmllbGRzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY291bnQoJHRoaXMtPmFkZGl0aW9uYWxGaWVsZHMpKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCR0aGlzLT5hZGRpdGlvbmFsRmllbGRzKTsKICAgICAgICAgICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRfZmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+YWRkaXRpb25hbEZpZWxkcyBhcyAkZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHBvcyA9IHN0cmlwb3MoJGZpZWxkLCAiIGFzICIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJF9maWVsZE5hbWUgPSBzdWJzdHIoJGZpZWxkLCAkcG9zKzQsIDEwMDAwKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2lmICh0YWJsZUZpZWxkc0V4aXN0cygkdGFibGVOYW1lKSAmJiBnZXRUYWJsZSgkdGFibGVOYW1lKS0+aGFzRmllbGQoJF9maWVsZE5hbWUpKQogICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgIC8vICAgICRfZmllbGRzW10gPSAkX2ZpZWxkTmFtZTsKICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkZmllbGRzW10gPSBzdWJzdHIoJGZpZWxkLCAwLCAkcG9zKS4iIEFTICIuJHRoaXMtPmdldFNxbE5hbWUoJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkc3FsID0gIioiLigkZmllbGRzID8gIiwiLmltcGxvZGUoIiwiLCAkZmllbGRzKSA6ICIiKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAkc3FsID0gIioiOwogICAgICAgIAogICAgICAgIHJldHVybigkc3FsKTsKICAgIH0KICAgICovCgogICAgZnVuY3Rpb24gZ2V0U3FsRmllbGRzKCR0YWJsZVByZWZpeD0iIiwgJHRhYmxlUGFyYW1zPU5VTEwpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkdGFibGVQYXJhbXMpOwogICAgICAgIC8vZHVtcCgkdGFibGVOYW1lKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPmFkZGl0aW9uYWxGaWVsZHMpOwogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmZpZWxkcyk7CiAgICAgICAgaWYgKGNvdW50KCR0aGlzLT5maWVsZHMpKQogICAgICAgIHsKICAgICAgICAgICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPmZpZWxkcyBhcyAkZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWVsZHNbXSA9ICgkdGFibGVQcmVmaXggJiYgc3RyaXBvcygkZmllbGQsICIgYXMgIikgPT09IEZBTFNFID8gJHRhYmxlUHJlZml4LiIuIiA6ICIiKS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzcWwgPSBpbXBsb2RlKCIsIiwgJGZpZWxkcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgJHNxbCA9ICIqIjsKICAgICAgICAKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmFkZGl0aW9uYWxGaWVsZHMpKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCR0aGlzLT5hZGRpdGlvbmFsRmllbGRzKTsKICAgICAgICAgICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRfZmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+YWRkaXRpb25hbEZpZWxkcyBhcyAkZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHBvcyA9IHN0cmlwb3MoJGZpZWxkLCAiIGFzICIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJF9maWVsZE5hbWUgPSBzdWJzdHIoJGZpZWxkLCAkcG9zKzQsIDEwMDAwKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2lmICh0YWJsZUZpZWxkc0V4aXN0cygkdGFibGVOYW1lKSAmJiBnZXRUYWJsZSgkdGFibGVOYW1lKS0+aGFzRmllbGQoJF9maWVsZE5hbWUpKQogICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgIC8vICAgICRfZmllbGRzW10gPSAkX2ZpZWxkTmFtZTsKICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkZmllbGRzW10gPSBzdWJzdHIoJGZpZWxkLCAwLCAkcG9zKS4iIEFTICIuJHRoaXMtPmdldFNxbE5hbWUoJF9maWVsZE5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoJF9maWVsZHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWVsZHMyID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goZ2V0VGFibGUoJHRhYmxlTmFtZSktPmdldEZpZWxkcygkX2ZpZWxkTmFtZSkgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJEZpZWxkLT5zcWxOYW1lLCAkX2ZpZWxkcykgJiYgJEZpZWxkLT5kYXRhVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkczJbXSA9ICR0aGlzLT5nZXRTcWxOYW1lKCRGaWVsZC0+c3FsTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3FsID0gaW1wbG9kZSgiLCIsICRmaWVsZHMyKS4oJGZpZWxkcyA/ICIsIi5pbXBsb2RlKCIsIiwgJGZpZWxkcykgOiAiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJHNxbCA9ICIqIi4oJGZpZWxkcyA/ICIsIi5pbXBsb2RlKCIsIiwgJGZpZWxkcykgOiAiIik7CiAgICAgICAgICAgICovCiAgICAgICAgICAgICRzcWwgLj0gKCRmaWVsZHMgPyAiLCIuaW1wbG9kZSgiLCIsICRmaWVsZHMpIDogIiIpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHNxbCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3FsRmlsdGVycygkZmlsdGVycz1OVUxMLCAkb3BlcmF0b3I9IiIsICR0YWJsZU5hbWU9IiIpCiAgICB7CiAgICAgICAgCiAgICAgICAgaWYgKCRmaWx0ZXJzID09PSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbHRlcnMgPSAkdGhpcy0+ZmlsdGVyc1siQU5EIl07CiAgICAgICAgICAgICRvcGVyYXRvciA9ICJBTkQiOwogICAgICAgIH0KICAgICAgICAvL2R1bXAoJGZpbHRlcnMpOwogICAgICAgIC8vdmFyX2R1bXAoJGZpbHRlcnMpOwogICAgICAgIAogICAgICAgICRtYXRjaCA9ICgkb3BlcmF0b3IgPT09ICJBTkQiKTsKICAgICAgICAvL3Zhcl9kdW1wKCRtYXRjaCk7CiAgICAgICAgJHNxbCA9IGFycmF5KCk7CiAgICAgICAgLy9kdW1wKCRmaWx0ZXJzKTsKICAgICAgICBmb3JlYWNoKCRmaWx0ZXJzIGFzICRmaWx0ZXIpCiAgICAgICAgewogICAgICAgICAgICAkb3BlcmF0b3IyID0gIiI7CiAgICAgICAgICAgIGlmIChfaXNfYXJyYXkoJGZpbHRlcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsdGVyWyJBTkQiXSkKICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IyID0gIkFORCI7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkZmlsdGVyWyJPUiJdKQogICAgICAgICAgICAgICAgICAgICRvcGVyYXRvcjIgPSAiT1IiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCRvcGVyYXRvcjIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRzcWxbXSA9ICIgKCIuJHRoaXMtPmdldFNxbEZpbHRlcnMoJGZpbHRlclskb3BlcmF0b3IyXSwgJG9wZXJhdG9yMiwgJHRhYmxlTmFtZSkuIikgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChfaXNfYXJyYXkoJGZpbHRlcikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHNxbFtdID0gJHRoaXMtPmdldFNxbEZpbHRlcigkZmlsdGVyWzBdLCAkZmlsdGVyWzFdLCAkZmlsdGVyWzJdLCAkdGFibGVOYW1lLCAkZmlsdGVyWzNdKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGZpbHRlclswXSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRmaWx0ZXJbMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRzcWxbXSA9ICRmaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9ICAgIAogICAgICAgIAogICAgICAgIGZvcmVhY2goJHNxbCBhcyAka2V5ID0+ICR2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHZhbCA9PT0gIiIpCiAgICAgICAgICAgICAgICB1bnNldCgkc3FsWyRrZXldKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCRtYXRjaCk7CiAgICAgICAgLy9kdW1wKCItLS0iKTsKICAgICAgICAvL2R1bXAoJGZpbHRlcnMpOwogICAgICAgIC8vZHVtcChpbXBsb2RlKCIgIi4kb3BlcmF0b3IuIiAiLCAkc3FsKSk7CiAgICAgICAgaWYgKCRzcWwpCiAgICAgICAgICAgIHJldHVybihpbXBsb2RlKCIgIi4kb3BlcmF0b3IuIiAiLCAkc3FsKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oIiIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzU3FsRnVuY3Rpb24oJHZhbHVlKQogICAgewogICAgICAgIGlmIChzdHJwb3MoJHZhbHVlLCAiKCIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJHZhbHVlLCAiKSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPmZ1bmN0aW9ucyBhcyAkZnVuY3Rpb25OYW1lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2eWppbWthIHBybyBwcmVrbGFkeSBmaWVsZCh0YWJsZSkuZmllbGQ6YWN0aXZlIC4uLgogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJHZhbHVlLCAkZnVuY3Rpb25OYW1lLiIoIikgIT09IEZBTFNFICYmIHN0cmlwb3MoJHZhbHVlLCAiKS4iKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFNxbEZpbHRlcigkZmllbGQsICRvcGVyYXRvciwgJG1hdGNoVmFsdWUsICR0YWJsZU5hbWU9IiIsICRGaWVsZD1OVUxMKQogICAgewogICAgICAgIGlmICgkdGFibGVOYW1lKQogICAgICAgICAgICAkdGFibGVOYW1lID0gJHRhYmxlTmFtZS4iLiI7CiAgICAgICAgICAgIC8vJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIuIjsKICAgICAgICAKICAgICAgICAvL2R1bXAoJGZpZWxkKTsKICAgICAgICAvL2R1bXAoJG9wZXJhdG9yKTsKICAgICAgICAvL2R1bXAoJG1hdGNoVmFsdWUpOwogICAgICAgIC8vZHVtcCgkdGFibGVOYW1lKTsKICAgICAgICAKICAgICAgICAkbWF0Y2hWYWx1ZSA9ICR0aGlzLT5lc2NhcGVTdHJpbmcodG9TdHJpbmcoJG1hdGNoVmFsdWUpKTsKCiAgICAgICAgaWYgKCRvcGVyYXRvciA9PSAiTElLRSIgJiYgJG1hdGNoVmFsdWUgPT0gIk5VTEwiKQogICAgICAgICAgICAkb3BlcmF0b3IgPSAiPSI7CiAgICAgICAgCiAgICAgICAgc3dpdGNoKCRvcGVyYXRvcikKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgIj0iOgogICAgICAgICAgICBjYXNlICIhPSI6CiAgICAgICAgICAgIGNhc2UgIj4iOgogICAgICAgICAgICBjYXNlICI+PSI6CiAgICAgICAgICAgIGNhc2UgIjwiOgogICAgICAgICAgICBjYXNlICI8PSI6CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKCRtYXRjaFZhbHVlID09ICJOVUxMIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09ICIhPSIpCiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiKCIuJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIgSVMgTk9UIE5VTEwpIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiKCIuJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIgSVMgTlVMTCkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSAqLwogICAgICAgICAgICAgICAgaWYgKCRtYXRjaFZhbHVlID09ICJOVUxMIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJEZpZWxkICYmICRGaWVsZC0+aXNEYXRlVGltZUZpZWxkKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09ICIhPSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIigiLiR0YWJsZU5hbWUuJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkKS4iIElTIE5PVCBOVUxMKSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiKCIuJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIgSVMgTlVMTCkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgPT0gIiE9IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiKCIuJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIhPScnIEFORCAiLiR0YWJsZU5hbWUuJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkKS4iIElTIE5PVCBOVUxMKSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiKCIuJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiI9JycgT1IgIi4kdGFibGVOYW1lLiR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCkuIiBJUyBOVUxMKSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aXNTcWxGdW5jdGlvbigkbWF0Y2hWYWx1ZSkpIC8vIGZ1bmN0aW9uIE5PVygpLC4uLgogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiRvcGVyYXRvci4iIi4kbWF0Y2hWYWx1ZS4iIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAkdGFibGVOYW1lLiR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCkuJG9wZXJhdG9yLiInIi4kbWF0Y2hWYWx1ZS4iJyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiSVMiOgogICAgICAgICAgICBjYXNlICJJUyBOT1QiOgogICAgICAgICAgICAgICAgJHNxbCA9ICR0YWJsZU5hbWUuJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkKS4iICIuJG9wZXJhdG9yLiIgIi4iJyIuJG1hdGNoVmFsdWUuIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIkxJS0UiOgogICAgICAgICAgICAgICAgLy9kdW1wKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAvL2R1bXAoJG1hdGNoVmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKCRtYXRjaFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJG1hdGNoVmFsdWUsICIlIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIgIi4kb3BlcmF0b3IuIiAiLiInIi4kbWF0Y2hWYWx1ZS4iJyI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIgIi4kb3BlcmF0b3IuIiAiLiInJSIuJG1hdGNoVmFsdWUuIiUnIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkc3FsID0gJHRhYmxlTmFtZS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiI9JyIuJG1hdGNoVmFsdWUuIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAkc3FsID0gJHRoaXMtPmdldFNxbE5hbWUoJGZpZWxkKS4iICIuJG9wZXJhdG9yLiIgJyIuJG1hdGNoVmFsdWUuIiciOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RycG9zKCRzcWwsICJzeXN0ZW0iKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICBkdW1wKCRmaWVsZCk7CiAgICAgICAgICAgIGR1bXAoJG9wZXJhdG9yKTsKICAgICAgICAgICAgZHVtcCgkc3FsKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkc3FsKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgIH0KICAgICAgICAvL3Zhcl9kdW1wKCRzcWwpOwogICAgICAgIHJldHVybigkc3FsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTcWxMaW1pdCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5saW1pdCB8fCAkdGhpcy0+b2Zmc2V0KQogICAgICAgICAgICAkc3FsIC49ICJMSU1JVCAiLigkdGhpcy0+bGltaXQgPyAkdGhpcy0+bGltaXQgOiAxMDAwMDAwKS4iICI7CiAgICAgICAgaWYgKCR0aGlzLT5vZmZzZXQpCiAgICAgICAgICAgICRzcWwgLj0gIk9GRlNFVCAiLiR0aGlzLT5vZmZzZXQuIiAiOwogICAgICAgIAogICAgICAgIHJldHVybigkc3FsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTcWxTb3J0KCkKICAgIHsKICAgICAgICAkc29ydCA9IGFycmF5KCk7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5zb3J0KTsKICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5zb3J0KTsKICAgICAgICBmb3JlYWNoKCR0aGlzLT5zb3J0IGFzICRzb3J0SXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkc29ydEl0ZW1bMF0pCiAgICAgICAgICAgICAgICAkc29ydFtdID0gJHRoaXMtPmdldFNxbE5hbWUoJHNvcnRJdGVtWzBdKS4iICIuJHNvcnRJdGVtWzFdOwogICAgICAgICAgICAvLyRzb3J0W10gPSAkc29ydEl0ZW1bMF0uIiAiLiRzb3J0SXRlbVsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvdW50KCRzb3J0KSkKICAgICAgICAgICAgcmV0dXJuKCJPUkRFUiBCWSAiLmltcGxvZGUoIiwiLCAkc29ydCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0U3FsR3JvdXBpbmcoKQogICAgewogICAgICAgICRncm91cEJ5ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKGFycmF5X21lcmdlKCR0aGlzLT5ncm91cGluZywgJHRoaXMtPmFkZGl0aW9uYWxHcm91cGluZykgYXMgJGdyb3VwQnlJdGVtKQogICAgICAgIHsKICAgICAgICAgICAgJGdyb3VwQnlbXSA9ICR0aGlzLT5nZXRTcWxOYW1lKCRncm91cEJ5SXRlbSk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgiLS0tIik7CiAgICAgICAgLy9kdW1wKCRncm91cEJ5KTsKICAgICAgICAKICAgICAgICBpZiAoY291bnQoJGdyb3VwQnkpKQogICAgICAgICAgICByZXR1cm4oIkdST1VQIEJZICIuaW1wbG9kZSgiLCIsICRncm91cEJ5KSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oIiIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNxbEhhdmluZygpCiAgICB7CiAgICAgICAgJGhhdmluZyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaChhcnJheV9tZXJnZSgkdGhpcy0+aGF2aW5nLCAkdGhpcy0+YWRkaXRpb25hbEhhdmluZykgYXMgJGhhdmluZ0l0ZW0pCiAgICAgICAgewogICAgICAgICAgICAkaGF2aW5nW10gPSAkdGhpcy0+Z2V0U3FsTmFtZSgkaGF2aW5nSXRlbSk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgiLS0tIik7CiAgICAgICAgLy9kdW1wKCRncm91cEJ5KTsKICAgICAgICAKICAgICAgICBpZiAoY291bnQoJGhhdmluZykpCiAgICAgICAgICAgIHJldHVybigiSEFWSU5HICIuaW1wbG9kZSgiIEFORCAiLCAkaGF2aW5nKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oIiIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdCgkdGFibGVQYXJhbXMsICRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICBzdGFydFByb2ZpbGUoIlRTcWxEYkxpbms6OnNlbGVjdCgpIik7CiAgICAgICAgCiAgICAgICAgaWYgKCRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdID09PSAwIHx8ICRwYXJhbXNbIml0ZW1zUGVyUGFnZSJdID09PSAiMCIgfHwgJHBhcmFtc1sibGltaXQiXSA9PT0gMCB8fCAkcGFyYW1zWyJsaW1pdCJdID09PSAiMCIpCiAgICAgICAgICAgIHJldHVybihhcnJheSgpKTsKICAgICAgICAKICAgICAgICAkdGhpcy0+cHJvY2Vzc0RlbGF5ZWRRdWVyaWVzKCR0YWJsZVBhcmFtcyk7CgogICAgICAgIC8vIGt2dWxpIG11bHRpcGxlIGpvaW4gLSBqZSBwb3RyZWJhIHNlc2t1cGl0CiAgICAgICAgJHRoaXMtPmFkZGl0aW9uYWxHcm91cGluZyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmFkZGl0aW9uYWxIYXZpbmcgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKICAgICAgICAKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRzcWwgPSBhcnJheSgpOwogICAgICAgICAgICAkcGFyYW1zWyJmaWVsZHMiXSA9IGV4cGxvZGVMaXN0KCRwYXJhbXNbImZpZWxkcyJdKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkcGFyYW1zWyJ1bmlvbiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRwYXJhbXNbInVuaW9uIl0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbInVuaW9uIl0gPSBleHBsb2RlTGlzdCgkcGFyYW1zWyJ1bmlvbiJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkcGFyYW1zWyJ1bmlvbiJdWzBdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcGFyYW1zWyJ1bmlvbiJdIGFzICR0YWJsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR1W10gPSBhcnJheSgidGFibGUiID0+ICR0YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbInVuaW9uIl0gPSAkdTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zWyJ1bmlvbiJdKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgdW5pb24gc3RhdGVtZW50cyBtdXN0IGhhdmUgdGhlIHNhbWUgZmllbGRzCiAgICAgICAgICAgICAgICAkZmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHBhcmFtc1sidW5pb24iXSBhcyAka2V5ID0+ICR1bmlvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJ1bmlvbiJdWyRrZXldID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJ1bmlvbiJdWyRrZXldWyJvcmRlckJ5Il0pOwogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXNbInVuaW9uIl1bJGtleV1bIml0ZW1zUGVyUGFnZSJdKTsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJ1bmlvbiJdWyRrZXldWyJiZWdpbiJdKTsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJ1bmlvbiJdWyRrZXldWyJsaW1pdCJdKTsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJ1bmlvbiJdWyRrZXldWyJ1bmlvbiJdKTsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJ1bmlvbiJdWyRrZXldID0gYXJyYXlfbWVyZ2UoJHBhcmFtc1sidW5pb24iXVska2V5XSwgJHVuaW9uKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXNbInVuaW9uIl1bJGtleV0pOwogICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJ1bmlvbiJdWyRrZXldWyJmaWVsZHMiXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXNbInVuaW9uIl1bJGtleV1bImZpZWxkcyJdID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaChnZXRUYWJsZSgkdW5pb25bInRhYmxlIl0pLT5nZXRGaWVsZHMoKSBhcyAkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJEZpZWxkLT5pc1ZpcnR1YWwoKSAmJiAkRmllbGQtPnRhYmxlTmFtZSA9PSBnZXRUYWJsZSgkdW5pb25bInRhYmxlIl0pLT5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkRmllbGQyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZDItPm5hbWUgPT0gJEZpZWxkLT5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoIWluX2FycmF5KCRGaWVsZCwgJGZpZWxkcykgJiYgJEZpZWxkLT5kYXRhVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRmb3VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkc1tdID0gJEZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtc1sidW5pb24iXVska2V5XVsiZmllbGRzIl0pOwogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbInVuaW9uIl1bJGtleV1bImZpZWxkcyJdID0gZXhwbG9kZUxpc3QoJHBhcmFtc1sidW5pb24iXVska2V5XVsiZmllbGRzIl0pOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtc1sidW5pb24iXVska2V5XVsiZmllbGRzIl0pOyBleGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXNbInVuaW9uIl0pOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkRmllbGQtPm5hbWUpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRmaWVsZHMpOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkcGFyYW1zWyJ1bmlvbiJdIGFzICRrZXkgPT4gJHVuaW9uKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkdW5pb24pOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkRmllbGQtPm5hbWUgPT0gImlkIikKICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VGFibGUoJHVuaW9uWyJ0YWJsZSJdKS0+aGFzRmllbGQoJEZpZWxkLT5uYW1lKSAmJiAhZ2V0VGFibGUoJHVuaW9uWyJ0YWJsZSJdKS0+Z2V0RmllbGQoJEZpZWxkLT5uYW1lKS0+aXNWaXJ0dWFsKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc1sidW5pb24iXVska2V5XVsiZmllbGRzIl1bXSA9ICR0aGlzLT5nZXRTcWxOYW1lKCRGaWVsZC0+c3FsTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRUYWJsZSgkdW5pb25bInRhYmxlIl0pLT5oYXNGaWVsZCgkRmllbGQtPm5hbWUpICYmIGdldFRhYmxlKCR1bmlvblsidGFibGUiXSktPmdldEZpZWxkKCRGaWVsZC0+bmFtZSktPnNxbFZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXNbInVuaW9uIl1bJGtleV1bImZpZWxkcyJdW10gPSAiKCIuZ2V0VGFibGUoJHVuaW9uWyJ0YWJsZSJdKS0+Z2V0RmllbGQoJEZpZWxkLT5uYW1lKS0+c3FsVmFsdWUuIikgQVMgIi4kdGhpcy0+Z2V0U3FsTmFtZSgkRmllbGQtPnNxbE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXNbInVuaW9uIl1bJGtleV1bImZpZWxkcyJdW10gPSAiJycgQVMgIi4kdGhpcy0+Z2V0U3FsTmFtZSgkRmllbGQtPnNxbE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zWyJ1bmlvbiJdKTsKICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtc1sidW5pb24iXSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoJGZpZWxkcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRxdWVyeVBhcmFtcyA9ICRwYXJhbXNbInVuaW9uIl07CiAgICAgICAgICAgICAgICAvL2R1bXAoJHF1ZXJ5UGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRxdWVyeVBhcmFtcyA9IGFycmF5KCRwYXJhbXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcXVlcnlJbmRleCA9IDA7CiAgICAgICAgICAgIGZvcmVhY2goJHF1ZXJ5UGFyYW1zIGFzICR0YWJsZUluZGV4ID0+ICRfcGFyYW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1sidW5pb24iXSAvKmNvdW50KCRxdWVyeVBhcmFtcykgPiAxKi8pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICRfdGFibGVQYXJhbXMgPSBnZXRUYWJsZSgkX3BhcmFtc1sidGFibGUiXSktPnNxbFJlY29yZDsKICAgICAgICAgICAgICAgICAgICAkX3RhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkX3RhYmxlUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHRhYmxlUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkX3RhYmxlUGFyYW1zID0gJHRhYmxlUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICRfdGFibGVOYW1lID0gJHRhYmxlTmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJyZWNvcmRDb3VudCJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRwYXJhbXMyID0gJF9wYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtczJbIm9yZGVyQnkiXSk7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtczJbInJlY29yZENvdW50Il0pOwoKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMlsicHJlZml4Il0gPSAiU0VMRUNUIENPVU5UKCopIEFTIHJlY29yZENvdW50IEZST00gKCI7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtczJbInBvc3RmaXgiXSA9ICIpIEFTIHJjbnQiOwogICAgICAgICAgICAgICAgICAgIC8vZWNobyAiWSI7IGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFsbFJlY29yZHNDb3VudFByb2Nlc3NpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICRyZWNvcmRzID0gJHRoaXMtPnNlbGVjdCgkX3RhYmxlUGFyYW1zLCAkcGFyYW1zMik7CgogICAgICAgICAgICAgICAgICAgIHJldHVybigkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlY29yZENvdW50ID0gJHJlY29yZHNbMF1bImNudCJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgICAgICBpZiAoLyohJHBhcmFtc1sicXVlcnkiXSAmJiAqLyEkdGhpcy0+YWxsUmVjb3Jkc0NvdW50UHJvY2Vzc2luZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YWxsUmVjb3Jkc0NvdW50UHJvY2Vzc2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCRxdWVyeUluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hbGxSZWNvcmRzQ291bnQgPSAwOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siYWxsUmVjb3Jkc0NvdW50Il0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMiA9ICRfcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zMlsiYmVnaW4iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXMyWyJsaW1pdCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtczJbIml0ZW1zUGVyUGFnZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtczJbIm9yZGVyQnkiXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyRwYXJhbXMyWyJmaWVsZHMiXSA9ICJDT1VOVChESVNUSU5DVCAiLiRfdGFibGVOYW1lLiIuaWQpIEFTIGFsbFJlY29yZHNDb3VudCI7ICAgLy8gRElTVElOQ1Qga3Z1bGkgZG90YXp1bSwga2RlIGplIGdyb3VwIGJ5LCBjb3ogbWVuaSB2eXpuYW0gY291bnQoKQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXMyWyJmaWVsZHMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHBhcmFtczJbImZpZWxkcyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMlsiZmllbGRzIl0gPSAiMSBBUyBkdW1teSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfYXJyYXkoJHBhcmFtczJbImZpZWxkcyJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcGFyYW1zMlsiZmllbGRzIl0gYXMgJGtleSA9PiAkZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmaWVsZCA9PSAiKiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMlsiZmllbGRzIl1bJGtleV0gPSAiMSBBUyBkdW1teSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBhcmFtczJbImZpZWxkcyJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtczJbImZpZWxkcyJdID0gc3RyX3JlcGxhY2UoIioiLCAiMSBBUyBkdW1teSIsICRwYXJhbXMyWyJmaWVsZHMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICRhc0ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkcGFyYW1zMlsiZmllbGRzIl0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRwYXJhbXMyWyJmaWVsZHMiXSBhcyAkZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGZpZWxkLCAiIEFTICIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc0ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXNGb3VuZCB8fCBpc19zdHJpbmcoJHBhcmFtczJbImZpZWxkcyJdKSAmJiBzdHJpcG9zKCRwYXJhbXMyWyJmaWVsZHMiXSwgIiBBUyAiKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXMyWyJmaWVsZHMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMlsiZmllbGRzIl0gPSAiMSBBUyBkdW1teSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vdW5zZXQoJHBhcmFtczJbImZpZWxkcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kcGFyYW1zMlsiZmllbGRzIl0gPSAiMSBBUyBkdW1teSI7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMlsicHJlZml4Il0gPSAiU0VMRUNUIENPVU5UKCopIEFTIGFsbFJlY29yZHNDb3VudCBGUk9NICgiOwogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zMlsicG9zdGZpeCJdID0gIikgQVMgcmNudCI7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMyWyJhZGRpdGlvbmFsRmllbGRzIl0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkcyA9ICR0aGlzLT5zZWxlY3QoJF90YWJsZVBhcmFtcywgJHBhcmFtczIpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHJlY29yZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFsbFJlY29yZHNDb3VudCArPSAkcmVjb3Jkc1swXVsiYWxsUmVjb3Jkc0NvdW50Il07CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXZlbG9wZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgiLS0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAoJHRoaXMtPmdldE5hbWUoJF90YWJsZVBhcmFtc1sibmFtZSJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKCR0aGlzLT5hbGxSZWNvcmRzQ291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hbGxSZWNvcmRzQ291bnRQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJ1bmlvbiJdIC8qY291bnQoJHF1ZXJ5UGFyYW1zKSA+IDEqLykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkX3BhcmFtc1siZmllbGRzIl1bXSA9ICInIi4kX3BhcmFtc1sidGFibGUiXS4iJyBBUyByZWNvcmRUYWJsZU5hbWUiOwogICAgICAgICAgICAgICAgICAgICRfcGFyYW1zWyJ0YWJsZUFsaWFzIl0gPSAidCI7IC8vInQiLiR0YWJsZUluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoISRwYXJhbXNbImpvaW4iXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJqb2luIl0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY291bnQoJHBhcmFtc1siam9pbiJdKSA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJKT0lOIik7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXNbImpvaW4iXSk7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgdXNlIG11bHRpcGxlIGpvaW4ncyB3ZSBuZWVkIHRvIGdyb3VwIGJ5IG1haW4gdGFibGUgaWQKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoIiEhISEiKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtc1siZ3JvdXBCeSJdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRwYXJhbXNbImdyb3VwQnkiXSkKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFkZGl0aW9uYWxHcm91cGluZ1tdID0gImlkIjsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJHRoaXMtPmFkZGl0aW9uYWxHcm91cGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImpvaW5UYWJsZSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRwYXJhbXNbImpvaW4iXVtdID0gYXJyYXkoInRhYmxlIj0+JHBhcmFtc1siam9pblRhYmxlIl0sICJvbiI9PiRwYXJhbXNbImpvaW5PbiJdLCAiZmllbGRzIj0+JHBhcmFtc1siam9pbkZpZWxkcyJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGpvaW4gPSAiIjsKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJqb2luIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJmaWVsZHMiXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vJF9wYXJhbXNbImZpZWxkcyJdW10gPSAoJHRoaXMtPmdldFJlYWxOYW1lKCRfcGFyYW1zWyJ0YWJsZSJdKSA/ICR0aGlzLT5nZXRSZWFsTmFtZSgkX3BhcmFtc1sidGFibGUiXSkuIi4iIDogIiIpLiIqIjsKICAgICAgICAgICAgICAgICAgICAgICAgJF9wYXJhbXNbImZpZWxkcyJdW10gPSAoJHRhYmxlTmFtZSA/ICR0YWJsZU5hbWUuIi4iIDogIiIpLiIqIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRwYXJhbXNbImpvaW4iXSBhcyAkX2pvaW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGpvaW4gLj0gIkxFRlQgSk9JTiBgIi4kX2pvaW5bInRhYmxlIl0uImAgT04gKCIuJF9qb2luWyJvbiJdLiIpICI7CgogICAgICAgICAgICAgICAgICAgIGlmICghJF9qb2luWyJmaWVsZHMiXSAmJiAhJHBhcmFtc1siZmllbGRzIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVwaXNlIGlkIG5hICIiLCBwb2t1ZCB6YXpuYW0gbmVleGlzdHVqZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0RXhpc3RzKCJUYWJsZXMiKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9qb2luWyJmaWVsZHMiXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUgPSBnZXRUYWJsZSgkdGFibGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goZ2V0VGFibGUoJF9qb2luWyJ0YWJsZSJdKS0+Z2V0RmllbGRzKCkgYXMgJEpvaW5GaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRKb2luRmllbGQtPm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJFRhYmxlLT5oYXNGaWVsZCgkSm9pbkZpZWxkLT5uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkVGFibGUtPmdldEZpZWxkKCRKb2luRmllbGQtPm5hbWUpLT5maWVsZEV4dGVuZGluZ0ZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRKb2luRmllbGQtPmlzVmlydHVhbCgpICYmICEkSm9pbkZpZWxkLT5pc0NvbnRhaW5lcigpICYmICRKb2luRmllbGQtPmRhdGFUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbImpvaW5GaWVsZHNQcmVmaXgiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfam9pblsiZmllbGRzIl1bXSA9IGdldFRhYmxlKCRfam9pblsidGFibGUiXSktPm5hbWUuIi4iLiRKb2luRmllbGQtPm5hbWUuIiBBUyAiLiRwYXJhbXNbImpvaW5GaWVsZHNQcmVmaXgiXS4kSm9pbkZpZWxkLT5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoISRUYWJsZS0+aGFzRmllbGQoJEpvaW5GaWVsZC0+bmFtZSkgfHwgJFRhYmxlLT5nZXRGaWVsZCgkSm9pbkZpZWxkLT5uYW1lKS0+ZmllbGRFeHRlbmRpbmdGaWVsZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfam9pblsiZmllbGRzIl1bXSA9ICRKb2luRmllbGQtPm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9qb2luWyJmaWVsZHMiXSA9ICIqIjsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goZXhwbG9kZUxpc3QoJF9qb2luWyJmaWVsZHMiXSkgYXMgJGZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9wYXJhbXNbImZpZWxkcyJdW10gPSAoc3RycG9zKCRmaWVsZCwgIi4iKSA9PT0gRkFMU0UgJiYgc3RyaXBvcygkZmllbGQsICIgQVMgIikgPT09IEZBTFNFID8gJF9qb2luWyJ0YWJsZSJdLiIuIiA6ICIiKS4kZmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICRqb2luID0gIiI7CiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siam9pblRhYmxlIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGpvaW4gPSAiTEVGVCBKT0lOIGAiLiRwYXJhbXNbImpvaW5UYWJsZSJdLiJgIE9OICgiLiRwYXJhbXNbImpvaW5PbiJdLiIpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgcGFyZW50OjpzZWxlY3QoJF90YWJsZVBhcmFtcywgJF9wYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXNbInVuaW9uIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8kZmllbGRzID0gJHRoaXMtPmdldFNxbEZpZWxkcygidCIuJHRhYmxlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIG11c3QgcmVtb3ZlIGJlY2F1c2UgdGhlIG90aGVyIHRhYmxlcyBtYXkgbm90IGhhdmUgdGhlIHNhbWUgZmllbGRzIC8gT1IgVFJZIEZJTkQgd2hpY2ggZmllbGRzIHNob3VkIGJlICcnIEFTIGZpZWxkTmFtZQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hZGRpdGlvbmFsRmllbGRzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAkZmllbGRzID0gJHRoaXMtPmdldFNxbEZpZWxkcygidCIsICRfdGFibGVQYXJhbXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRmaWVsZHMgPSAkdGhpcy0+Z2V0U3FsRmllbGRzKCIiLCAkX3RhYmxlUGFyYW1zKTsKCiAgICAgICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgICAgICAvLyRmaWx0ZXJzID0gJHRoaXMtPmdldFNxbEZpbHRlcnMoIiIsICIiLCAkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtc1sidGFibGVBbGlhcyJdKSk7CiAgICAgICAgICAgICAgICAkZmlsdGVycyA9ICR0aGlzLT5nZXRTcWxGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICAvL2R1bXAoJGZpbHRlcnMpOwogICAgICAgICAgICAgICAgJHNvcnQgPSAkdGhpcy0+Z2V0U3FsU29ydCgpOwogICAgICAgICAgICAgICAgJGdyb3VwaW5nID0gJHRoaXMtPmdldFNxbEdyb3VwaW5nKCk7CiAgICAgICAgICAgICAgICAkaGF2aW5nID0gJHRoaXMtPmdldFNxbEhhdmluZygpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkaGF2aW5nKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkZ3JvdXBpbmcpOwogICAgICAgICAgICAgICAgJGxpbWl0ID0gJHRoaXMtPmdldFNxbExpbWl0KCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJqb2luIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcGFyYW1zWyJqb2luIl0gYXMgJF9qb2luKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoJHRhYmxlUGFyYW1zWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAkSm9pblRhYmxlID0gZ2V0VGFibGUoJF9qb2luWyJ0YWJsZSJdKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkVGFibGUtPmdldEZpZWxkcygpIGFzICRGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZC0+ZGF0YVR5cGUgJiYgJEpvaW5UYWJsZS0+aGFzRmllbGQoJEZpZWxkLT5uYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJGZpbHRlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJzID0gcHJlZ19yZXBsYWNlKCJ8KFteLl0/KShgIi4kRmllbGQtPnNxbE5hbWUuImApfGltcyIsICJcXDEiLiR0aGlzLT5nZXRTcWxOYW1lKCRfdGFibGVOYW1lKS4iLlxcMiIsICRmaWx0ZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRmaWx0ZXJzID0gcHJlZ19yZXBsYWNlKCJ8W15hLXpBLVowLTldKCIuJEZpZWxkLT5zcWxOYW1lLiIpW15hLXpBLVowLTldfGltcyIsICR0aGlzLT5nZXRTcWxOYW1lKCRfdGFibGVOYW1lKS4iLlxcMSIsICRmaWx0ZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyogICAgCiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siam9pblRhYmxlIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoJHRhYmxlUGFyYW1zWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICRKb2luVGFibGUgPSBnZXRUYWJsZSgkcGFyYW1zWyJqb2luVGFibGUiXSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkVGFibGUtPmdldEZpZWxkcygpIGFzICRGaWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRmllbGQtPmRhdGFUeXBlICYmICRKb2luVGFibGUtPmhhc0ZpZWxkKCRGaWVsZC0+bmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJzID0gcHJlZ19yZXBsYWNlKCJ8KFteLl0pKGAiLiRGaWVsZC0+c3FsTmFtZS4iYCl8aW1zIiwgIlxcMSIuJHRoaXMtPmdldFNxbE5hbWUoJF90YWJsZU5hbWUpLiIuXFwyIiwgJGZpbHRlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kZmlsdGVycyA9IHByZWdfcmVwbGFjZSgifFteYS16QS1aMC05XSgiLiRGaWVsZC0+c3FsTmFtZS4iKVteYS16QS1aMC05XXxpbXMiLCAkdGhpcy0+Z2V0U3FsTmFtZSgkX3RhYmxlTmFtZSkuIi5cXDEiLCAkZmlsdGVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJF9wYXJhbXNbInF1ZXJ5Il0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJF9zcWwgPSAkX3BhcmFtc1sicXVlcnkiXTsKICAgICAgICAgICAgICAgICAgICAkX3NxbCA9IHN0cmlfcmVwbGFjZSgiW0ZJTFRFUlNdIiwgKCRmaWx0ZXJzID8gIldIRVJFICIuJGZpbHRlcnMgOiAiIiksICRfc3FsKTsKICAgICAgICAgICAgICAgICAgICAkX3NxbCA9IHN0cmlfcmVwbGFjZSgiW0ZJTFRFUl0iLCAoJGZpbHRlcnMgPyAiV0hFUkUgIi4kZmlsdGVycyA6ICIiKSwgJF9zcWwpOwogICAgICAgICAgICAgICAgICAgICRfc3FsID0gc3RyaV9yZXBsYWNlKCJbR1JPVVBJTkddIiwgJGdyb3VwaW5nLCAkX3NxbCk7CiAgICAgICAgICAgICAgICAgICAgJF9zcWwgPSBzdHJpX3JlcGxhY2UoIltHUk9VUF0iLCAkZ3JvdXBpbmcsICRfc3FsKTsKICAgICAgICAgICAgICAgICAgICAkX3NxbCA9IHN0cmlfcmVwbGFjZSgiW0dST1VQQlldIiwgJGdyb3VwaW5nLCAkX3NxbCk7CiAgICAgICAgICAgICAgICAgICAgJF9zcWwgPSBzdHJpX3JlcGxhY2UoIltTT1JUXSIsICRzb3J0LCAkX3NxbCk7CiAgICAgICAgICAgICAgICAgICAgJF9zcWwgPSBzdHJpX3JlcGxhY2UoIltPUkRFUkJZXSIsICRzb3J0LCAkX3NxbCk7CiAgICAgICAgICAgICAgICAgICAgJF9zcWwgPSBzdHJpX3JlcGxhY2UoIltMSU1JVF0iLCAkbGltaXQsICRfc3FsKTsKICAgICAgICAgICAgICAgICAgICAkX3NxbCA9IHN0cmlfcmVwbGFjZSgiW0xJTUlUU10iLCAkbGltaXQsICRfc3FsKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2lmIChpc0RldmVsb3BlcigpKQogICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRfc3FsKTsKICAgICAgICAgICAgICAgICAgICAvLyAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRfc3FsID0gIlNFTEVDVCAiLiRmaWVsZHMuIiBGUk9NICIuJHRoaXMtPmdldFNxbE5hbWUoJF90YWJsZU5hbWUpLigkX3BhcmFtc1sidGFibGVBbGlhcyJdID8gIiBBUyAiLiR0aGlzLT5nZXRTcWxOYW1lKCRfcGFyYW1zWyJ0YWJsZUFsaWFzIl0pIDogIiIpLiIgIi4kam9pbi4iICIuKCRmaWx0ZXJzID8gIldIRVJFICIuJGZpbHRlcnMgOiAiIikuIiAiLiRncm91cGluZy4iICIuJGhhdmluZy4iICIuJHNvcnQuIiAiLiRsaW1pdDsKCiAgICAgICAgICAgICAgICAvL2lmICgkcGFyYW1zWyJqb2luVGFibGUiXSkKICAgICAgICAgICAgICAgIC8vICAgIGR1bXAoJF9zcWwpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRzcWwpOwogICAgICAgICAgICAgICAgaWYgKCEkcGFyYW1zWyJyYXciXSAmJiAhJHRoaXMtPnF1ZXJ5VG9TdHJpbmcgJiYgb2JqZWN0RXhpc3RzKCJFdmVudHMiKSAvKl9pc19hcnJheSgkdGFibGVQYXJhbXMpICYmICR0YWJsZVBhcmFtc1sibmFtZSJdICYmIHRhYmxlRmllbGRzRXhpc3RzKCR0YWJsZVBhcmFtc1sibmFtZSJdKSovKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkdGFibGVQYXJhbXNbIm5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRzcWwpOwogICAgICAgICAgICAgICAgICAgICRzcWxYID0gZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJvbkdldFNxbFF1ZXJ5IiwgYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICJzcWwiID0+ICRfc3FsLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmxlIiA9PiBnZXRUYWJsZShfaXNfYXJyYXkoJF90YWJsZVBhcmFtcyA/ICRfdGFibGVQYXJhbXNbIm5hbWUiXSA6ICRfdGFibGVQYXJhbXMpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbXMiID0+ICRfcGFyYW1zLCAKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyIgPT4gJGZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgImZpbHRlcnMiID0+ICRmaWx0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAic29ydCIgPT4gJHNvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICJncm91cGluZyIgPT4gJGdyb3VwaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAibGltaXQiID0+ICRsaW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgKSwgInNxbCIpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkc3FsWCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzcWxYKQogICAgICAgICAgICAgICAgICAgICAgICAkX3NxbCA9ICRzcWxYOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkc3FsWCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3FsW10gPSAkX3NxbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9nZXRPYmplY3QoIk1lbW9yeUNhY2hlIiktPnNhdmVPYmplY3QoJGNhY2hlSWQsICRyZWNvcmRzKTsKICAgICAgICAgICAgICAgICRxdWVyeUluZGV4Kys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzcWwgPSBpbXBsb2RlKCIgVU5JT04gIiwgJHNxbCk7CiAgICAgICAgICAgIC8vZHVtcCgkc3FsKTsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbInVuaW9uIl0gLypjb3VudCgkcXVlcnlQYXJhbXMpID4gMSovKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGFibGVQYXJhbXMgPSBnZXRUYWJsZSgkcGFyYW1zWyJ0YWJsZSJdKS0+c3FsUmVjb3JkOwogICAgICAgICAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkdGFibGVQYXJhbXMpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwYXJlbnQ6OnNlbGVjdCgkdGFibGVQYXJhbXMsICRwYXJhbXMpOwoKICAgICAgICAgICAgICAgICRzb3J0ID0gJHRoaXMtPmdldFNxbFNvcnQoKTsKICAgICAgICAgICAgICAgICRncm91cGluZyA9ICR0aGlzLT5nZXRTcWxHcm91cGluZygpOwogICAgICAgICAgICAgICAgJGxpbWl0ID0gJHRoaXMtPmdldFNxbExpbWl0KCk7CgogICAgICAgICAgICAgICAgJHNxbCA9ICJTRUxFQ1QgdS4qIEZST00gKCIuJHNxbC4iKSB1ICIuJGdyb3VwaW5nLiIgIi4kc29ydC4iICIuJGxpbWl0OwogICAgICAgICAgICAgICAgLy8kc3FsIC49ICIgIi4kZ3JvdXBpbmcuIiAiLiRzb3J0LiIgIi4kbGltaXQ7CiAgICAgICAgICAgICAgICAvL2VjaG8gJHNxbDsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkc3FsID0gJHBhcmFtc1sicHJlZml4Il0uJHNxbC4kcGFyYW1zWyJwb3N0Zml4Il07CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJHNxbCk7CiAgICAgICAgICAgICR0aW1lU3RhcnQgPSBnZXRNaWNyb1RpbWUoKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgkc3FsLCAkcGFyYW1zWyJyYXciXSk7CiAgICAgICAgICAgICR0aW1lRW5kID0gZ2V0TWljcm9UaW1lKCk7CiAgICAgICAgICAgIC8vZHVtcCgkcmVzdWx0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkcmVjb3JkcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGlmICgkcGFyYW1zWyJyZWNvcmRDb3VudCJdKQogICAgICAgICAgICAgICAgJHJlY29yZHNbXSA9IGFycmF5KCJyZWNvcmRDb3VudCI9PiR0aGlzLT5yZWNvcmRDb3VudCgpKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKCRyID0gMCA7ICRyIDwgJHRoaXMtPnJlY29yZENvdW50KCkgOyAkcisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZWNvcmRzW10gPSAkdGhpcy0+bmV4dFJlY29yZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZHVtcChjb3VudCgkcmVjb3JkcykpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+cXVlcnlUb1N0cmluZykKICAgICAgICAgICAgICAgICR0aGlzLT5hZnRlclNxbFF1ZXJ5KCRzcWwsICRyZWNvcmRzLCAoJHRpbWVFbmQtJHRpbWVTdGFydCkpOwogICAgICAgIH0KICAgICAgICAvL3N0b3BQcm9maWxlKCJUU3FsRGJMaW5rOjpzZWxlY3QiLCAkcGFyYW1zKTsKICAgICAgICAKICAgICAgICBpZiAoISR0aGlzLT5xdWVyeVRvU3RyaW5nKQogICAgICAgICAgICAkdGhpcy0+b25TZWxlY3QoJHBhcmFtcywgJHJlY29yZHMpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgiPyIpOwogICAgICAgIC8vZHVtcCgkdGhpcy0+Z2V0TmFtZSgkX3RhYmxlUGFyYW1zWyJuYW1lIl0pKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPmFsbFJlY29yZHNDb3VudCk7CgogICAgICAgIHN0b3BQcm9maWxlKCJUU3FsRGJMaW5rOjpzZWxlY3QoKSIpOwogICAgICAgIHJldHVybigkcmVjb3Jkcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uU3FsUXVlcnkoJHNxbCkKICAgIHsKICAgICAgICAkYWxsUmVjb3Jkc0NvdW50ID0gJHRoaXMtPmFsbFJlY29yZHNDb3VudDsKICAgICAgICAkbGFzdFNxbFF1ZXJ5ID0gJHRoaXMtPmxhc3RTcWxRdWVyeTsKICAgICAgICAgICAgLy9nbG9iYWwgJHh4eHg7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHNxbCk7CiAgICAgICAgICAgIC8vaWYgKCR4eHh4ID4gNDAwKQogICAgICAgICAgICAvLyAgICBleGl0OwogICAgICAgICAgICAvLyR4eHh4Kys7CiAgICAgICAgLy9lY2hvICRzcWw7CiAgICAgICAgLy9lY2hvICRzcWw7CiAgICAgICAgZ2xvYmFsICRfX2xhc3RTcWxRdWVyeTsKICAgICAgICAkX19sYXN0U3FsUXVlcnkgPSAkc3FsOwogICAgICAgIGlmICghJHRoaXMtPmV2ZW50c0Rpc2FibGVkICYmIG9iamVjdEV4aXN0cygiRXZlbnRzIikpCiAgICAgICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKGdldE9iamVjdCgiRXZlbnRzIiktPmdldEV2ZW50cygib25TcWxRdWVyeSIpKTsKICAgICAgICAgICAgJHNxbCA9IGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25TcWxRdWVyeSIsIGFycmF5KAogICAgICAgICAgICAgICAgInNxbCIgPT4gJHNxbCwgCiAgICAgICAgICAgICAgICAiT2JqZWN0IiA9PiAkdGhpcyksIAogICAgICAgICAgICAic3FsIik7CiAgICAgICAgfQogICAgICAgIC8vZWNobyAkc3FsOwoKICAgICAgICAkdGhpcy0+YWxsUmVjb3Jkc0NvdW50ID0gJGFsbFJlY29yZHNDb3VudDsKICAgICAgICAkdGhpcy0+bGFzdFNxbFF1ZXJ5ID0gJGxhc3RTcWxRdWVyeTsKICAgICAgICByZXR1cm4oJHNxbCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWZ0ZXJTcWxRdWVyeSgkc3FsLCAkcmVjb3JkcywgJHRpbWUpCiAgICB7CiAgICAgICAgJGFsbFJlY29yZHNDb3VudCA9ICR0aGlzLT5hbGxSZWNvcmRzQ291bnQ7CiAgICAgICAgJGxhc3RTcWxRdWVyeSA9ICR0aGlzLT5sYXN0U3FsUXVlcnk7CiAgICAgICAgLy92YXJfZHVtcCgkc3FsKTsgZXhpdDsKICAgICAgICBpZiAoISR0aGlzLT5ldmVudHNEaXNhYmxlZCAmJiBvYmplY3RFeGlzdHMoIkV2ZW50cyIpKQogICAgICAgIHsKICAgICAgICAgICAgZ2V0T2JqZWN0KCJFdmVudHMiKS0+cnVuRXZlbnRzKCJhZnRlclNxbFF1ZXJ5IiwgYXJyYXkoCiAgICAgICAgICAgICAgICAic3FsIiA9PiAkc3FsLCAKICAgICAgICAgICAgICAgICJyZWNvcmRzIiA9PiAkcmVjb3JkcywgCiAgICAgICAgICAgICAgICAidGltZSIgPT4gJHRpbWUsIAogICAgICAgICAgICAgICAgIk9iamVjdCIgPT4gJHRoaXMKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIC8vICAgICJPYmplY3QiID0+ICR0aGlzKSwgCiAgICAgICAgICAgIC8vInNxbCIpOwogICAgICAgIH0KICAgICAgICBnbG9iYWwgJF9DT05GSUc7CiAgICAgICAgaWYgKCRfQ09ORklHWyJzcWxMb2ciXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghJF9DT05GSUdbInNxbExvZ0ZpbGUiXSkKICAgICAgICAgICAgICAgICRfQ09ORklHWyJzcWxMb2dGaWxlIl0gPSBQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wL3NxbC5sb2ciOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghJF9DT05GSUdbInNxbExvZ0ZpbHRlciJdIHx8IHN0cnBvcygkc3FsLCAkX0NPTkZJR1sic3FsTG9nRmlsdGVyIl0pICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIF9maWxlX2FwcGVuZF9jb250ZW50cygkX0NPTkZJR1sic3FsTG9nRmlsZSJdLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIuZGF0ZSgiWS1tLWQgSDppOnMiKS4iXG4iLiRzcWwuIlxuLS0tLS0tLS0tXG4iLnN0cl9yZXBsYWNlKCI8YnIgLz4iLCAiIiwgaW1wbG9kZSgiXG4iLCBnZXRGdW5jdGlvbkNhbGwodHJ1ZSkpKS4iXG4iKTsKICAgICAgICB9CgogICAgICAgIAogICAgICAgICR0aGlzLT5hbGxSZWNvcmRzQ291bnQgPSAkYWxsUmVjb3Jkc0NvdW50OwogICAgICAgICR0aGlzLT5sYXN0U3FsUXVlcnkgPSAkbGFzdFNxbFF1ZXJ5OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uU2VsZWN0KCRwYXJhbXMsICRyZWNvcmRzKQogICAgewogICAgICAgICRhbGxSZWNvcmRzQ291bnQgPSAkdGhpcy0+YWxsUmVjb3Jkc0NvdW50OwogICAgICAgICRsYXN0U3FsUXVlcnkgPSAkdGhpcy0+bGFzdFNxbFF1ZXJ5OwogICAgICAgIGlmICghJHBhcmFtc1sicmF3Il0gJiYgb2JqZWN0RXhpc3RzKCJFdmVudHMiKSkKICAgICAgICB7CiAgICAgICAgICAgIGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25TZWxlY3QiLCBhcnJheSgic3FsIiA9PiAkdGhpcy0+bGFzdFNxbFF1ZXJ5LCAiT2JqZWN0IiA9PiAkdGhpcywgInBhcmFtcyIgPT4gJHBhcmFtcywgInJlY29yZHMiID0+ICRyZWNvcmRzKSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5hbGxSZWNvcmRzQ291bnQgPSAkYWxsUmVjb3Jkc0NvdW50OwogICAgICAgICR0aGlzLT5sYXN0U3FsUXVlcnkgPSAkbGFzdFNxbFF1ZXJ5OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXREYXRhVHlwZXMoJHR5cGVzPSJhbGwiKQogICAgewogICAgICAgIGlmICgkdHlwZXMgPT0gImFsbCIpCiAgICAgICAgICAgICR0eXBlcyA9IGFycmF5X2tleXMoJHRoaXMtPmRhdGFUeXBlcyk7CiAgICAgICAgICAgIAogICAgICAgIGlmICghX2lzX2FycmF5KCR0eXBlcykpCiAgICAgICAgICAgICR0eXBlcyA9IGFycmF5KCR0eXBlcyk7CiAgICAgICAgICAgIAogICAgICAgICRyZXQgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJHR5cGVzIGFzICR0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9IGFycmF5X21lcmdlKCRyZXQsICgkdGhpcy0+ZGF0YVR5cGVzWyR0eXBlXSA/ICR0aGlzLT5kYXRhVHlwZXNbJHR5cGVdIDogYXJyYXkoKSkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHJldCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RGF0YVR5cGVNYXhWYWx1ZSgkdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmRhdGFUeXBlTWF4VmFsdWVzWyR0eXBlXSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RGF0YVR5cGVJbmZvKCR0eXBlKQogICAgewogICAgICAgIHJldHVybigkdGhpcy0+ZGF0YVR5cGVJbmZvWyR0eXBlXSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFZlcnNpb24oKQogICAgewogICAgICAgIHJldHVybigiIik7CiAgICB9CiAgICAKfQoKLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGJMaW5rL015U1FMRGJMaW5rLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFRNeVNRTERiTGluayBleHRlbmRzIFRTUUxEYkxpbmsKewogICAgdmFyICRkYXRhVHlwZXMgPSBhcnJheSgKICAgICAgICAic3RyaW5nIiA9PiBhcnJheSgKICAgICAgICAgICAgIkNIQVIiLAogICAgICAgICAgICAiVkFSQ0hBUiIsCgogICAgICAgICAgICAiVElOWVRFWFQiLAogICAgICAgICAgICAiVEVYVCIsCiAgICAgICAgICAgICJNRURJVU1URVhUIiwKICAgICAgICAgICAgIkxPTkdURVhUIiwKCiAgICAgICAgICAgICJCSU5BUlkiLAogICAgICAgICAgICAiVkFSQklOQVJZIiwKICAgICAgICAgICAgCiAgICAgICAgICAgICJUSU5ZQkxPQiIsCiAgICAgICAgICAgICJNRURJVU1CTE9CIiwKICAgICAgICAgICAgIkJMT0IiLAogICAgICAgICAgICAiTE9OR0JMT0IiLAogICAgICAgICAgICAKICAgICAgICAgICAgIkVOVU0iLAogICAgICAgICAgICAiU0VUIiwKICAgICAgICApLAogICAgICAgICJudW1iZXIiID0+IGFycmF5KAogICAgICAgICAgICAiVElOWUlOVCIsCiAgICAgICAgICAgICJTTUFMTElOVCIsCiAgICAgICAgICAgICJNRURJVU1JTlQiLAogICAgICAgICAgICAiSU5UIiwKICAgICAgICAgICAgIkJJR0lOVCIsCiAgICAgICAgICAgIAogICAgICAgICAgICAiREVDSU1BTCIsCiAgICAgICAgICAgICJGTE9BVCIsCiAgICAgICAgICAgICJET1VCTEUiLAogICAgICAgICAgICAiUkVBTCIsCgogICAgICAgICAgICAiQklUIiwKICAgICAgICAgICAgIkJPT0xFQU4iLAogICAgICAgICAgICAiU0VSSUFMIiwKICAgICAgICApLAogICAgICAgICJkYXRldGltZSIgPT4gYXJyYXkoCiAgICAgICAgICAgICJEQVRFIiwKICAgICAgICAgICAgIkRBVEVUSU1FIiwKICAgICAgICAgICAgIlRJTUUiLAogICAgICAgICAgICAiVElNRVNUQU1QIiwKICAgICAgICAgICAgIllFQVIiLAogICAgICAgICksCiAgICAgICAgInNwYXRpYWwiID0+IGFycmF5KAogICAgICAgICAgICAiR0VPTUVUUlkiLAogICAgICAgICAgICAiUE9JTlQiLAogICAgICAgICAgICAiTElORVNUUklORyIsCiAgICAgICAgICAgICJQT0xZR09OIiwKICAgICAgICAgICAgIk1VTFRJUE9JTlQiLAogICAgICAgICAgICAiTVVMVElMSU5FU1RSSU5HIiwKICAgICAgICAgICAgIk1VTFRJUE9MWUdPTiIsCiAgICAgICAgICAgICJHRU9NRVRSWUNPTExFQ1RJT04iLAogICAgICAgICksCiAgICApOwogICAgCiAgICB2YXIgJGRhdGFUeXBlSW5mbyA9IGFycmF5KAogICAgICAgICJDSEFSIiA9PiAiMCB0byAyNTUgY2hhcmFjdGVycyIsCiAgICAgICAgIlZBUkNIQVIiID0+ICIwIHRvIDI1NSBjaGFyYWN0ZXJzICgyMTg0NCBmb3IgTXlTUUwgPj0gNS4wLjMpIiwKICAgICAgICAiVElOWVRFWFQiID0+ICIwIHRvIDI1NSBjaGFyYWN0ZXJzIiwKICAgICAgICAiVEVYVCIgPT4gIjAgdG8gNjU1MzUgY2hhcmFjdGVycyIsCiAgICAgICAgIk1FRElVTVRFWFQiID0+ICIwIHRvIDE2Nzc3MjE1IGNoYXJhY3RlcnMiLAogICAgICAgICJMT05HVEVYVCIgPT4gIjAgdG8gNDI5NDk2NzI5NSBjaGFyYWN0ZXJzIiwKICAgICAgICAiVElOWUlOVCIgPT4gIi0xMjggdG8gMTI3LCAwIHRvIDI1NSB1bnNpZ25lZCIsCiAgICAgICAgIlNNQUxMSU5UIiA9PiAiLTMyNzY4IHRvIDMyNzY3LCAwIHRvIDY1NTM1IHVuc2lnbmVkIiwKICAgICAgICAiTUVESVVNSU5UIiA9PiAiLTgzODg2MDggdG8gODM4ODYwNywgMCB0byAxNjc3NzIxNSB1bnNpZ25lZCIsCiAgICAgICAgIklOVCIgPT4gIiAtMjE0NzQ4MzY0OCB0byAyMTQ3NDgzNjQ3LCAwIHRvIDQyOTQ5NjcyOTUgdW5zaWduZWQiLAogICAgICAgICJCSUdJTlQiID0+ICItOTIyMzM3MjAzNjg1NDc3NTgwOCB0byA5MjIzMzcyMDM2ODU0Nzc1ODA3LCAwIHRvIDE4NDQ2NzQ0MDczNzA5NTUxNjE1IHVuc2lnbmVkIiwKICAgICk7CiAgICAKICAgIHZhciAkZGF0YVR5cGVNYXhWYWx1ZXMgPSBhcnJheSgKICAgICAgICAiQ0hBUiIgPT4gMjU1LAogICAgICAgICJWQVJDSEFSIiA9PiAyNTUsCiAgICAgICAgIlRJTllURVhUIiA9PiAyNTUsCiAgICAgICAgIlRFWFQiID0+IDY1NTM1LAogICAgICAgICJNRURJVU1URVhUIiA9PiAxNjc3NzIxNSwKICAgICAgICAiTE9OR1RFWFQiID0+IDQyOTQ5NjcyOTUsCiAgICAgICAgIlRJTllJTlQiID0+IGFycmF5KC0xMjgsMTI3KSwKICAgICAgICAiVElOWUlOVF9VTlNJR05FRCIgPT4gYXJyYXkoMCwyNTUpLAogICAgICAgICJTTUFMTElOVCIgPT4gYXJyYXkoLTMyNzY4LCAzMjc2NyksCiAgICAgICAgIlNNQUxMSU5UX1VOU0lHTkVEIiA9PiBhcnJheSgwLCA2NTUzNSksCiAgICAgICAgIk1FRElVTUlOVCIgPT4gYXJyYXkoLTgzODg2MDgsIDgzODg2MDcpLAogICAgICAgICJNRURJVU1JTlRfVU5TSUdORUQiID0+IGFycmF5KDAsIDE2Nzc3MjE1KSwKICAgICAgICAiSU5UIiA9PiBhcnJheSgtMjE0NzQ4MzY0OCwgMjE0NzQ4MzY0NyksCiAgICAgICAgIklOVF9VTlNJR05FRCIgPT4gYXJyYXkoMCwgNDI5NDk2NzI5NSksCiAgICAgICAgIkJJR0lOVCIgPT4gYXJyYXkoLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIDkyMjMzNzIwMzY4NTQ3NzU4MDcpLAogICAgICAgICJCSUdJTlRfVU5TSUdORUQiID0+IGFycmF5KDAsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwKICAgICk7CgogICAgdmFyICRxdWVyaWVzID0gYXJyYXkoKTsKICAgIHZhciAkREIgPSBOVUxMOwogICAgdmFyICRpZ25vcmVkQ2FjaGVQcm9wZXJ0aWVzID0gYXJyYXkoIkRCIik7CiAgICAKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+ZnVuY3Rpb25zID0gZXhwbG9kZUxpc3QoIkFTQ0lJfEJJTnxCSVRfTEVOR1RIfENIQVJfTEVOR1RIfENIQVJ8Q0hBUkFDVEVSX0xFTkdUSHxDT05DQVRfV1N8Q09OQ0FUfEVMVHxFWFBPUlRfU0VUfEZJRUxEfEZJTkRfSU5fU0VUfEZPUk1BVHxIRVh8SU5TRVJUfElOU1RSfExDQVNFfExFRlR8TEVOR1RIfExJS0V8TE9BRF9GSUxFfExPQ0FURXxMT1dFUnxMUEFEfExUUklNfE1BS0VfU0VUfE1JRHxOT1QgTElLRXxOT1QgUkVHRVhQfE9DVEVUX0xFTkdUSHxPUkR8UE9TSVRJT058UVVPVEV8UkVHRVhQfFJFUEVBVHxSRVBMQUNFfFJFVkVSU0V8UklHSFR8UkxJS0V8Tk9UIFJMSUtFfFJQQUR8UlRSSU18U09VTkRFWHxTT1VORFNfTElLRXxTUEFDRXxTVFJDTVB8U1VCU1RSfFNVQlNUUklOR19JTkRFWHxTVUJTVFJJTkd8VFJJTXxVQ0FTRXxVTkhFWHxVUFBFUnxBQlN8QUNPU3xBU0lOfEFUQU4yfEFUQU58Q0VJTHxDRUlMSU5HfENPTlZ8Q09TfENPVHxDUkMzMnxERUdSRUVTfERJVnxESVZJU0lPTnxFWFB8RkxPT1J8TE58TE9HfExPRzJ8TE9HMTB8TU9EfE9DVHxQSXxQT1d8UE9XRVJ8UkFESUFOU3xSQU5EfFJPVU5EfFNJR058U0lOfFNRUlR8VEFOfFRSVU5DQVRFfEZPUk1BVHxBRVNfREVDUllQVHxBRVNfRU5DUllQVHxDT01QUkVTU3xERUNPREV8REVTX0RFQ1JZUFR8REVTX0VOQ1JZUFR8RU5DT0RFfEVOQ1JZUFR8TUQ1fE9MRF9QQVNTV09SRHxQQVNTV09SRHxTSEExfFVOQ09NUFJFU1N8VU5DT01QUkVTU0VEX0xFTkdUSHxCRU5DSE1BUkt8Q0hBUlNFVHxDT0VSQ0lCSUxJVFl8Q09MTEFUSU9OfENPTk5FQ1RJT05fSUR8Q1VSUkVOVF9VU0VSfERBVEFCQVNFfEZPVU5EX1JPV1N8TEFTVF9JTlNFUlRfSUR8U0NIRU1BfFNFU1NJT05fVVNFUnxTWVNURU1fVVNFUnxVU0VSfFZFUlNJT058QUREREFURXxBRERUSU1FfENPTlZFUlRfVFp8Q1VSREFURXxDVVJSRU5UX0RBVEV8Q1VSUkVOVF9USU1FfENVUlJFTlRfIFRJTUVTVEFNUHxDVVJUSU1FfERBVEVfQUREfERBVEVfRk9STUFUfERBVEVfU1VCfERBVEV8REFURURJRkZ8REFZfERBWU5BTUV8REFZIE9GIE1PTlRIfERBWSBPRiBXRUVLfERBWSBPRiBZRUFSfEVYVFJBQ1R8RlJPTV9EQVlTfEZST01fVU5JWFRJTUV8R0VUX0ZPUk1BVHxIT1VSfExBU1RfREFZfExPQ0FMVElNRXxMT0NBTFRJTUVTVEFNUHxNQUtFREFURXxNQUtFVElNRXxNSUNST1NFQ09ORHxNSU5VVEV8TU9OVEh8TU9OVEhOQU1FfE5PV3xQRVJJT0RfQUREfFBFUklPRF9ESUZGfFFVQVJURVJ8U0VDX1RPX1RJTUV8U0VDT05EfFNUUl9UT19EQVRFfFNVQkRBVEV8U1VCVElNRXxTWVNEQVRFfFRJTUVfRk9STUFUfFRJTUVfVE9fU0VDfFRJTUV8VElNRURJRkZ8VElNRVNUQU1QfFRJTUVTVEFNUEFERHxUSU1FU1RBTVBESUZGfFRPX0RBWVN8VU5JWF9USU1FU1RBTVB8VVRDX0RBVEV8VVRDX1RJTUV8VVRDX1RJTUVTVEFNUHxXRUVLfFdFRUtEQVl8V0VFSyBPRiBZRUFSfFlFQVJ8WUVBUldFRUsiKTsKICAgICAgICAKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2hlY2soKQogICAgewogICAgICAgIHJldHVybihmdW5jdGlvbl9leGlzdHMoIm15c3FsaV9jb25uZWN0IikpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+REIpCiAgICAgICAgICAgIHJldHVybihteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCR0aGlzLT5EQiwgJHN0cikpOwoKICAgICAgICByZXR1cm4oJHN0cik7CiAgICB9CgogICAgZnVuY3Rpb24gb3BlbigkZGF0YWJhc2U9dHJ1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3IgPSAiIjsKICAgICAgICBpZiAoISR0aGlzLT5EQikKICAgICAgICB7CiAgICAgICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgICAgIC8vJHRoaXMtPkRCID0gbXlzcWxpX2Nvbm5lY3QoJHRoaXMtPmhvc3QsICR0aGlzLT5sb2dpbiwgJHRoaXMtPnBhc3N3b3JkLCAoJGRhdGFiYXNlID8gJHRoaXMtPmRhdGFiYXNlIDogIiIpLCAkdGhpcy0+cG9ydCA/ICR0aGlzLT5wb3J0IDogTlVMTCwgJHRoaXMtPnNvY2tldCA/ICR0aGlzLT5zb2NrZXQgOiBOVUxMKTsKICAgICAgICAgICAgJHRoaXMtPkRCID0gbXlzcWxpX2Nvbm5lY3QoJHRoaXMtPmhvc3QsICR0aGlzLT5sb2dpbiwgJHRoaXMtPnBhc3N3b3JkLCAkdGhpcy0+ZGF0YWJhc2UsICR0aGlzLT5wb3J0ID8gJHRoaXMtPnBvcnQgOiBOVUxMLCAkdGhpcy0+c29ja2V0ID8gJHRoaXMtPnNvY2tldCA6IE5VTEwpOwogICAgICAgICAgICAkZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+REIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15c3FsaV9xdWVyeSgkdGhpcy0+REIsICJTRVQgTkFNRVMgJ1VURjgnIENPTExBVEUgJ3V0ZjhfZ2VuZXJhbF9jaSciKTsKICAgICAgICAgICAgICAgICR0aGlzLT5yZXN1bHQgPSBteXNxbGlfcXVlcnkoJHRoaXMtPkRCLCAiU0hPVyBWQVJJQUJMRVMgV0hFUkUgdmFyaWFibGVfbmFtZT0nbWF4X2FsbG93ZWRfcGFja2V0JyIpOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHJlY29yZCA9ICR0aGlzLT5uZXh0UmVjb3JkKCk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1heEFsbG93ZWRQYWNrZXRTaXplID0gJHJlY29yZFsiVmFsdWUiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvck51bWJlciA9IG15c3FsaV9jb25uZWN0X2Vycm5vKCk7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmVycm9yTnVtYmVyID09IDIwMTMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIlRNeVNRTERiTGluaygiLiR0aGlzLT5uYW1lLiIpOiBDYW5ub3QgY29ubmVjdCB0byAnIi4kdGhpcy0+aG9zdC4iJyI7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yVHlwZSA9ICJob3N0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT5lcnJvck51bWJlciA9PSAxMDQ1KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJUTXlTUUxEYkxpbmsoIi4kdGhpcy0+bmFtZS4iKTogQWNjZXNzIGRlbmllZCBmb3IgJyIuJHRoaXMtPmxvZ2luLiInIjsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JUeXBlID0gImxvZ2luIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmlwb3MoJGVycm9yLCAic29jayIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IgPSAiVE15U1FMRGJMaW5rKCIuJHRoaXMtPm5hbWUuIik6IENhbid0IGNvbm5lY3QgdG8gbG9jYWwgTXlTUUwgc2VydmVyIHRocm91Z2ggc29ja2V0IjsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JUeXBlID0gImhvc3QiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJUTXlTUUxEYkxpbmsoIi4kdGhpcy0+bmFtZS4iKTogIyIuJHRoaXMtPmVycm9yLiI6ICIubXlzcWxpX2Nvbm5lY3RfZXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5uYW1lID09ICJkZWZhdWx0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICR0aGlzLT5lcnJvcjsgCiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgkdGhpcy0+ZXJyb3IsIG10V2FybmluZyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2VjaG8gIm15c3FsIG5vdCBjb25uZWN0ZWQiOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKCR0aGlzLT5EQik7CiAgICB9CiAgICAKICAgIC8qCiAgICBmdW5jdGlvbiBvcGVuKCRkYXRhYmFzZT10cnVlKQogICAgewogICAgICAgICR0aGlzLT5lcnJvciA9ICIiOwogICAgICAgIGlmICghJHRoaXMtPkRCKQogICAgICAgIHsKICAgICAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAgICAgJHRoaXMtPkRCID0gbXlzcWxpX2Nvbm5lY3QoJHRoaXMtPmhvc3QuKCR0aGlzLT5wb3J0ID8gIjoiLiR0aGlzLT5wb3J0IDogIiIpLCAkdGhpcy0+bG9naW4sICR0aGlzLT5wYXNzd29yZCwgdHJ1ZSk7IC8vIHRydWUgPSBuZXcgbGluawogICAgICAgICAgICAkZXJyb3IgPSBvYl9nZXRfY29udGVudHMoKTsKICAgICAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgICAgIGVjaG8gJGVycm9yOyBleGl0OwogICAgICAgICAgICBpZiAoJHRoaXMtPkRCKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRhdGFiYXNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghJGRhdGFiYXNlIHx8IEBteXNxbGlfc2VsZWN0X2RiKCR0aGlzLT5kYXRhYmFzZSwgJHRoaXMtPkRCKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15c3FsaV9xdWVyeSgiU0VUIE5BTUVTICdVVEY4JyBDT0xMQVRFICd1dGY4X2dlbmVyYWxfY2knIiwgJHRoaXMtPkRCKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk51bWJlciA9IG15c3FsaV9lcnJubygkdGhpcy0+REIpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JUeXBlID0gImRhdGFiYXNlIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5lcnJvck51bWJlciA9PSAxMDQ2IHx8ICR0aGlzLT5lcnJvck51bWJlciA9PSAxMDQ5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IgPSAiTXlTUUw6IENhbm5vdCBvcGVuIGRhdGFiYXNlICciLiR0aGlzLT5kYXRhYmFzZS4iJyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IgPSAiTXlTUUwgIyIuJHRoaXMtPmVycm9yTnVtYmVyLiI6ICIubXlzcWxpX2Vycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JOdW1iZXIgPSBteXNxbGlfZXJybm8oJHRoaXMtPkRCKTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXJyb3JOdW1iZXIgPT0gMjAxMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IgPSAiTXlTUUw6IENhbm5vdCBjb25uZWN0IHRvICciLiR0aGlzLT5ob3N0LiInIjsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JUeXBlID0gImhvc3QiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPmVycm9yTnVtYmVyID09IDEwNDUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIk15U1FMOiBBY2Nlc3MgZGVuaWVkIGZvciAnIi4kdGhpcy0+bG9naW4uIiciOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvclR5cGUgPSAibG9naW4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyaXBvcygkZXJyb3IsICJzb2NrIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJNeVNRTDogQ2FuJ3QgY29ubmVjdCB0byBsb2NhbCBNeVNRTCBzZXJ2ZXIgdGhyb3VnaCBzb2NrZXQiOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvclR5cGUgPSAiaG9zdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIk15U1FMICMiLiR0aGlzLT5lcnJvci4iOiAiLm15c3FsaV9lcnJvcigpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2VjaG8gIm15c3FsIG5vdCBjb25uZWN0ZWQiOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKCR0aGlzLT5EQik7CiAgICB9CiAgICAqLwogICAgCiAgICBmdW5jdGlvbiBjbG9zZSgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5EQikKICAgICAgICB7CiAgICAgICAgICAgICBteXNxbGlfY2xvc2UoJHRoaXMtPkRCKTsKICAgICAgICAgICAgICR0aGlzLT5EQiA9IE5VTEw7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRTcWxOYW1lKCRmaWVsZE5hbWUpCiAgICB7CiAgICAgICAgJGZpZWxkTmFtZSA9ICR0aGlzLT5nZXROYW1lKCRmaWVsZE5hbWUpOwogICAgICAgIAogICAgICAgICRmaWVsZE5hbWUgPSBzdHJfaXJlcGxhY2UoIiBhcyAiLCAiIEFTICIsICRmaWVsZE5hbWUpOwogICAgICAgIGlmIChzdHJwb3MoJGZpZWxkTmFtZSwgImAiKSAhPT0gRkFMU0UgfHwgc3RyaXBvcygkZmllbGROYW1lLCAiIEFTICIpICE9PSBGQUxTRSB8fCBzdHJpcG9zKCRmaWVsZE5hbWUsICIoIikgIT09IEZBTFNFIHx8IHN0cmlwb3MoJGZpZWxkTmFtZSwgIi4iKSAhPT0gRkFMU0UgfHwgc3RyaXBvcygkZmllbGROYW1lLCAiICIpICE9PSBGQUxTRSB8fCBzdHJpcG9zKCRmaWVsZE5hbWUsICIsIikgIT09IEZBTFNFIHx8IHN0cmlwb3MoJGZpZWxkTmFtZSwgIioiKSAhPT0gRkFMU0UgfHwgc3RyaXBvcygkZmllbGROYW1lLCAiPSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigkZmllbGROYW1lKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKCJgIi4kZmllbGROYW1lLiJgIik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldERhdGFiYXNlcygpCiAgICB7CiAgICAgICAgJHJldCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKGZhbHNlKSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5yZXN1bHQgPSBteXNxbGlfcXVlcnkoJHRoaXMtPkRCLCAiU0hPVyBEQVRBQkFTRVMiKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb3VudCA9IEBteXNxbGlfbnVtX3Jvd3MoJHRoaXMtPnJlc3VsdCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoJHIgPSAwIDsgJHIgPCAkY291bnQgOyAkcisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZWNvcmQgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCR0aGlzLT5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmVjb3JkWyJEYXRhYmFzZSJdICE9ICJpbmZvcm1hdGlvbl9zY2hlbWEiKQogICAgICAgICAgICAgICAgICAgICAgICAkcmV0W10gPSAkcmVjb3JkWyJEYXRhYmFzZSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0VGFibGVzKCkKICAgIHsKICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oZmFsc2UpKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnJlc3VsdCA9IG15c3FsaV9xdWVyeSgkdGhpcy0+REIsICJTSE9XIFRBQkxFUyBGUk9NIGAiLiR0aGlzLT5kYXRhYmFzZS4iYCIpOwogICAgICAgICAgICBpZiAoJHRoaXMtPnJlc3VsdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGNvdW50ID0gQG15c3FsaV9udW1fcm93cygkdGhpcy0+cmVzdWx0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZm9yICgkciA9IDAgOyAkciA8ICRjb3VudCA7ICRyKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHJlY29yZCA9IEBteXNxbGlfZmV0Y2hfcm93KCR0aGlzLT5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICRyZXRbXSA9ICRyZWNvcmRbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gZ2V0VGFibGVTaXplKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oZmFsc2UpKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnJlc3VsdCA9IG15c3FsaV9xdWVyeSgkdGhpcy0+REIsICJTRUxFQ1QgZGF0YV9sZW5ndGgraW5kZXhfbGVuZ3RoLWRhdGFfZnJlZSBBUyBzaXplIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLlRBQkxFUyBXSEVSRSB0YWJsZV9zY2hlbWE9JyIuJHRoaXMtPmRhdGFiYXNlLiInIEFORCB0YWJsZV9uYW1lPSciLiR0YWJsZU5hbWUuIiciKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZWNvcmQgPSBAbXlzcWxpX2ZldGNoX3JvdygkdGhpcy0+cmVzdWx0KTsKICAgICAgICAgICAgICAgIHJldHVybigkcmVjb3JkWzBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9ICAgIAoKICAgIGZ1bmN0aW9uIGdldFZlcnNpb24oKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCJ8WzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rfCIsIG15c3FsaV9nZXRfc2VydmVyX2luZm8oJHRoaXMtPkRCKSwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKTsKCiAgICAgICAgcmV0dXJuKCRtYXRjaGVzWzBdWzBdKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcXVlcnkoJHNxbCwgJHJhdz1mYWxzZSwgJHNpbGVudD1mYWxzZSkKICAgIHsKICAgICAgICBnbG9iYWwgJF9DT05GSUc7CiAgICAgICAgZm9yZWFjaChleHBsb2RlTGlzdCgkX0NPTkZJR1siZGlzYWJsZWRUYWJsZXMiXSkgYXMgJGRpc2FibGVkVGFibGVOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cmlwb3MoJHNxbCwgJGRpc2FibGVkVGFibGVOYW1lKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvL2lmIChzdHJpcG9zKCRzcWwsICJzeXN0ZW1fbG9nIikgIT09IEZBTFNFKQogICAgICAgIC8vICAgIHJldHVybjsKICAgICAgICAvL2lmIChzdHJpcG9zKCRzcWwsICJ1cmxfbG9nIikgIT09IEZBTFNFKQogICAgICAgIC8vICAgIHJldHVybjsKICAgICAgICAvL2lmIChzdHJpcG9zKCRzcWwsICJzdGF0c19sb2ciKSAhPT0gRkFMU0UpCiAgICAgICAgLy8gICAgcmV0dXJuOwogICAgICAgIAogICAgICAgIC8vaWYgKHN0cmlwb3MoJHNxbCwgImFkbWluX3VzZXJzIikgIT09IEZBTFNFICYmIHN0cmlwb3MoJHNxbCwgImxhbmd1YWdlIikgIT09IEZBTFNFICYmIHN0cmlwb3MoJHNxbCwgInNrIikgPT09IEZBTFNFKQogICAgICAgIC8vewogICAgICAgIC8vICAgIGVjaG8gJHNxbDsgZXhpdDsKICAgICAgICAvL30KCiAgICAgICAgJHRoaXMtPmVycm9yID0gIiI7CiAgICAgICAgLy9lY2hvICRzcWwuIjxocj4iOwogICAgICAgIAogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEkcmF3KQogICAgICAgICAgICAgICAgJHNxbCA9ICR0aGlzLT5vblNxbFF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPmxhc3RTcWxRdWVyeSA9ICRzcWw7CiAgICAgICAgICAgIC8vaWYgKHN0cnBvcygkc3FsLCAicmFjZXMiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCRzcWwsICJfbG9nIikgPT09IEZBTFNFKQogICAgICAgICAgICAgICAgLy9kdW1wKCRzcWwpOwogICAgICAgICAgICAvLyAgICBfbG9nKCRzcWwpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5xdWVyeVRvU3RyaW5nICYmICEkdGhpcy0+cXVlcnlUb1N0cmluZ0Rpc2FibGVkICYmIHN0cnBvcygkc3FsLCAiYGV2ZW50c2AiKSA9PT0gRkFMU0UpIC8vIFRPRE8gLSBmaXggbGF0ZXIgLSBtYXliZSBiZWNhdXNlIGZpbHRlckRldGFpbF8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5U3RyaW5nIC49ICRzcWw7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybih0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHNxbCk7CiAgICAgICAgICAgICR0aGlzLT5yZXN1bHQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5EQiwgJHNxbCk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnJlc3VsdCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+cXVlcmllc1tdID0gJHNxbDsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPnJlc3VsdCAmJiAhJHNpbGVudCkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRlID0gbXlzcWxpX2Vycm9yKCR0aGlzLT5EQik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChmYWxzZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICRlLiI8aHIgLz4iOwogICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCRzcWwpOwogICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCR0aGlzKTsKICAgICAgICAgICAgICAgICAgICBlY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoSU5TVEFMTFBST0NFU1MgIT09IHRydWUgfHwgc3RyaXBvcygkZSwgIkRhdGEgdHJ1bmNhdGVkIGZvciBjb2x1bW4iKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIlRNeVNRTERiTGluazogIi5faHRtbGVudGl0aWVzKCRlKS4iPGJyIC8+Ii5faHRtbGVudGl0aWVzKCRzcWwpOwogICAgICAgICAgICAgICAgLy9pZiAoc3RyaXBvcygkdGhpcy0+ZXJyb3IsICJEYXRhIHRydW5jYXRlZCBmb3IgY29sdW1uIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAvLyAgICAkdGhpcy0+ZXJyb3IgLj0gIjxocj4iLmdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0cnVlIC8qIGlzRGV2ZWxvcGVyKCkqLykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL2VjaG8gJGUuIjxocj4iOwogICAgICAgICAgICAgICAgICAgIC8vaWYgKCR0aGlzLT5xdWVyeVJldHJ5Q291bnRlciA+IDAgJiYgISR0aGlzLT5lcnJvcikKICAgICAgICAgICAgICAgICAgICAvLyAgICBlY2hvICJPSyI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGUsICJoYXMgZXhjZWVkZWQiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRlOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGUsICJNeVNRTCBzZXJ2ZXIgaGFzIGdvbmUgYXdheSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeVJldHJ5Q291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIlNsZWVwaW5nIC4uLiAiOwogICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMCo1MDApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cXVlcnlSZXRyeUNvdW50ZXIgPCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICIrIi5zdWJzdHIoJHNxbCwgMCwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigkdGhpcy0+cXVlcnkoJHNxbCwgJHJhdywgJHNpbGVudCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5lcnJvcik7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgkdGhpcy0+ZXJyb3IsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgLy9pZiAoRkFMU0UgJiYgc3RycG9zKCRzcWwsICJwcm9jZXNzZXMiKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAvL3Nob3dNZXNzYWdlKCR0aGlzLT5lcnJvci4iPGhyPiIuaW1wbG9kZSgiPGhyPiIsICR0aGlzLT5xdWVyaWVzKSwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgLy8kdGhpcy0+cmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+cXVlcnlSZXRyeUNvdW50ZXIgPSAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPnJlc3VsdCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGV4ZWMoJHNxbCwgJHJhdz1mYWxzZSwgJHNpbGVudD1mYWxzZSkKICAgIHsKICAgICAgICAkdGltZVN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cXVlcnkoJHNxbCwgJHJhdywgJHNpbGVudCk7CiAgICAgICAgJHRpbWVFbmQgPSBtaWNyb3RpbWUodHJ1ZSk7CgogICAgICAgICR0aGlzLT5hZnRlclNxbFF1ZXJ5KCRzcWwsIGFycmF5KCksICgkdGltZUVuZC0kdGltZVN0YXJ0KSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5leHRSZWNvcmQoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHRoaXMtPnJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmVjb3JkKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gYWZmZWN0ZWRSZWNvcmRzKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vJHJlY29yZCA9IG15c3FsX251bV9yb3dzKCR0aGlzLT5yZXN1bHQpOwogICAgICAgICAgICAkcmVjb3JkID0gQG15c3FsaV9hZmZlY3RlZF9yb3dzKCR0aGlzLT5EQik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmVjb3JkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsYXN0SWQoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9IEBteXNxbGlfaW5zZXJ0X2lkKCR0aGlzLT5yZXN1bHQpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJHJlY29yZCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb3JkQ291bnQoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJGNvdW50ID0gQG15c3FsaV9udW1fcm93cygkdGhpcy0+cmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRjb3VudCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHRhYmxlRXhpc3RzKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnIi4kdGFibGVOYW1lLiInOyI7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cXVlcnkoJHNxbCk7CgogICAgICAgICAgICByZXR1cm4oJHRoaXMtPnJlY29yZENvdW50KCkgPyB0cnVlIDogZmFsc2UpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmaWVsZEV4aXN0cygkdGFibGVQYXJhbXMsICRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgICAgICRmaWVsZE5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHBhcmFtcyk7CiAgICAgICAgICAgICRzcWwgPSAiU0hPVyBDT0xVTU5TIEZST00gYCIuJHRhYmxlTmFtZS4iYCBMSUtFICciLiRmaWVsZE5hbWUuIic7IjsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgkc3FsKTsKCiAgICAgICAgICAgIHJldHVybigkdGhpcy0+cmVjb3JkQ291bnQoKSA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNoYW5nZUZpZWxkKCR0YWJsZVBhcmFtcywgJG9sZFBhcmFtcywgJG5ld1BhcmFtcykKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgJG9sZEZpZWxkTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkb2xkUGFyYW1zKTsKICAgICAgICAkbmV3RmllbGROYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCRuZXdQYXJhbXMpOwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJGZpZWxkRGVmID0gJHRoaXMtPmdldEZpZWxkRGVmaW5pdGlvbigkbmV3UGFyYW1zKTsKCiAgICAgICAgICAgIGlmICgkb2xkRmllbGROYW1lID09ICRuZXdGaWVsZE5hbWUgJiYgISR0aGlzLT5maWVsZEV4aXN0cygkdGFibGVQYXJhbXMsICRuZXdQYXJhbXMpICYmICRmaWVsZERlZlsidHlwZSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJHRoaXMtPmFkZEZpZWxkKCR0YWJsZVBhcmFtcywgJG5ld1BhcmFtcykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL3Zhcl9kdW1wKCRuZXdQYXJhbXMpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRmaWVsZERlZik7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0b0Jvb2woJG5ld1BhcmFtc1sicHJpbWFyeUtleSJdKSkKICAgICAgICAgICAgICAgICR0aGlzLT5kcm9wUHJpbWFyeUtleSgkdGFibGVQYXJhbXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZU5hbWUpLiIgQ0hBTkdFIENPTFVNTiAiLiR0aGlzLT5nZXRTcWxOYW1lKCRvbGRGaWVsZE5hbWUpLiIgIi4kdGhpcy0+Z2V0U3FsTmFtZSgkbmV3RmllbGROYW1lKS4iICIuJGZpZWxkRGVmWyJ0eXBlIl0uIiAiLiRmaWVsZERlZlsia2V5Il0uIiAiLiRmaWVsZERlZlsiY29uc3RyYWludCJdLiIgIi4kZmllbGREZWZbImV4dHJhIl0uIiAiLiRmaWVsZERlZlsiZGVmYXVsdCJdOwogICAgICAgICAgICAvL2VjaG8gJHNxbC4iPGJyID4iOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4ZWMoJHNxbCk7ICAgICAgICAKCiAgICAgICAgICAgICRvbGRQYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRvbGRQYXJhbXMsICIiLCBmYWxzZSk7CiAgICAgICAgICAgICRuZXdQYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRuZXdQYXJhbXMsICIiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmICghJG9sZFBhcmFtc1siaW5kZXgiXSAmJiAkbmV3UGFyYW1zWyJpbmRleCJdKQogICAgICAgICAgICAgICAgJHRoaXMtPmFkZEluZGV4KCR0YWJsZVBhcmFtcywgJG5ld1BhcmFtcyk7CiAgICAgICAgICAgIGlmICgkb2xkUGFyYW1zWyJpbmRleCJdICYmICEkbmV3UGFyYW1zWyJpbmRleCJdKQogICAgICAgICAgICAgICAgJHRoaXMtPmRyb3BJbmRleCgkdGFibGVQYXJhbXMsICRuZXdQYXJhbXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gd2h5PyAtIHJlbW92ZWQgZHVlIHRvIFNob3AgbW9kdWxlIHVwZGF0ZSBvbiBzaG9wX29yZGVyX2l0ZW1zLCBkb24ndCBuZWVkIHRvIHJlY3JlYXRlIGluZGV4CiAgICAgICAgICAgIC8qaWYgKCRvbGRQYXJhbXNbImluZGV4Il0gJiYgJG5ld1BhcmFtc1siaW5kZXgiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmRyb3BJbmRleCgkdGFibGVQYXJhbXMsICRvbGRQYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmFkZEluZGV4KCR0YWJsZVBhcmFtcywgJG5ld1BhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmICghJG9sZFBhcmFtc1siZnVsbHRleHQiXSAmJiAkbmV3UGFyYW1zWyJmdWxsdGV4dCJdKQogICAgICAgICAgICAgICAgJHRoaXMtPmFkZEZ1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkbmV3UGFyYW1zKTsKICAgICAgICAgICAgaWYgKCRvbGRQYXJhbXNbImZ1bGx0ZXh0Il0gJiYgISRuZXdQYXJhbXNbImZ1bGx0ZXh0Il0pCiAgICAgICAgICAgICAgICAkdGhpcy0+ZHJvcEZ1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkbmV3UGFyYW1zKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHdoeT8KICAgICAgICAgICAgLyppZiAoJG9sZFBhcmFtc1siZnVsbHRleHQiXSAmJiAkbmV3UGFyYW1zWyJmdWxsdGV4dCJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZHJvcEZ1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkb2xkUGFyYW1zKTsKICAgICAgICAgICAgICAgICR0aGlzLT5hZGRGdWxsdGV4dEluZGV4KCR0YWJsZVBhcmFtcywgJG5ld1BhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmICghJG9sZFBhcmFtc1sidW5pcXVlIl0gJiYgJG5ld1BhcmFtc1sidW5pcXVlIl0pCiAgICAgICAgICAgICAgICAkdGhpcy0+YWRkVW5pcXVlS2V5KCR0YWJsZVBhcmFtcywgJG5ld1BhcmFtcyk7CiAgICAgICAgICAgIGlmICgkb2xkUGFyYW1zWyJ1bmlxdWUiXSAmJiAhJG5ld1BhcmFtc1sidW5pcXVlIl0pCiAgICAgICAgICAgICAgICAkdGhpcy0+ZHJvcFVuaXF1ZUtleSgkdGFibGVQYXJhbXMsICRuZXdQYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4oJHJlc3VsdCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFNxbEZpbHRlcigkZmllbGQsICRvcGVyYXRvciwgJG1hdGNoVmFsdWUsICR0YWJsZT0iIiwgJEZpZWxkPU5VTEwpCiAgICB7CiAgICAgICAgLy9lY2hvICIxIjsgZXhpdDsgZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIGlmICgkb3BlcmF0b3IgPT0gIkZVTExURVhUIikKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAvLyRzcWwgPSAiTUFUQ0goIi4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIpIEFHQUlOU1QgKCciLiRtYXRjaFZhbHVlLiInIElOIEJPT0xFQU4gTU9ERSkiOwogICAgICAgICAgICAvLyRzcWwgPSAiTUFUQ0goIi4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIpIEFHQUlOU1QgKCciLiRtYXRjaFZhbHVlLiInKSI7CiAgICAgICAgICAgIC8vZHVtcCgkZmllbGQpOwogICAgICAgICAgICAkc3FsID0gIihNQVRDSCgiLigkdGFibGUgPyAkdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGUpLiIuIiA6ICIiKS4kdGhpcy0+Z2V0U3FsTmFtZSgkZmllbGQpLiIpIEFHQUlOU1QgKCciLiRtYXRjaFZhbHVlLiInKSBPUiBMT0NBVEUoJyIuJG1hdGNoVmFsdWUuIicsICIuKCR0YWJsZSA/ICR0aGlzLT5nZXRTcWxOYW1lKCR0YWJsZSkuIi4iIDogIiIpLiR0aGlzLT5nZXRTcWxOYW1lKCRmaWVsZCkuIikpIjsKICAgICAgICAgICAgLy9kdW1wKCRzcWwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgICRzcWwgPSBwYXJlbnQ6OmdldFNxbEZpbHRlcigkZmllbGQsICRvcGVyYXRvciwgJG1hdGNoVmFsdWUsICR0YWJsZSwgJEZpZWxkKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKCRzcWwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYXNJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lPSIiKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKCiAgICAgICAgaWYgKGlzX3N0cmluZygkcGFyYW1zKSkKICAgICAgICAgICAgJHBhcmFtcyA9IGV4cGxvZGVMaXN0KCRwYXJhbXMpOwogICAgICAgIGVsc2UgaWYgKCFpc3NldCgkcGFyYW1zWzBdKSkKICAgICAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRwYXJhbXMpOwoKICAgICAgICAkbmFtZSA9ICR0aGlzLT5nZXRJbmRleE5hbWUoJHRhYmxlUGFyYW1zLCAkcGFyYW1zLCAkbmFtZSk7CgogICAgICAgIGlmICgkdGhpcy0+b3BlbigkdGFibGVOYW1lKSkKICAgICAgICB7CiAgICAgICAgICAgICRzcWwgPSAiU0hPVyBJTkRFWEVTIEZST00gIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKS4iIFdIRVJFIEtleV9uYW1lID0gJyIuJG5hbWUuIic7IjsKICAgICAgICAgICAgLy9lY2hvICRzcWw7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5xdWVyeVRvU3RyaW5nRGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAkdGhpcy0+cXVlcnkoJHNxbCk7CiAgICAgICAgICAgICR0aGlzLT5xdWVyeVRvU3RyaW5nRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXN1bHQgPSAoJHRoaXMtPnJlY29yZENvdW50KCkgPiAwKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhc0Z1bGx0ZXh0SW5kZXgoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKICAgICAgICAkZmllbGROYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCRwYXJhbXMpOwoKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oJHRhYmxlTmFtZSkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gIlNIT1cgSU5ERVhFUyBGUk9NICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSkuIiBXSEVSRSBLZXlfbmFtZSA9ICdmdWxsdGV4dF8iLiRmaWVsZE5hbWUuIic7IjsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5xdWVyeVRvU3RyaW5nRGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAkdGhpcy0+cXVlcnlUb1N0cmluZ0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcmVzdWx0ID0gKCR0aGlzLT5yZWNvcmRDb3VudCgpID4gMCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmVzdWx0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gY2hlY2tEYXRhVHlwZSgkZGF0YVR5cGUsICRkYXRhVHlwZVBhcmFtcykKICAgIHsKICAgICAgICBzd2l0Y2goc3RydG91cHBlcigkZGF0YVR5cGUpKQogICAgICAgIHsgICAKICAgICAgICAgICAgY2FzZSAiQ0hBUiI6IAogICAgICAgICAgICBjYXNlICJWQVJDSEFSIjogCiAgICAgICAgICAgICAgICBpZiAoISRkYXRhVHlwZVBhcmFtcyB8fCAhcGFyc2VJbnQoJGRhdGFUeXBlUGFyYW1zKSB8fCAkZGF0YVR5cGVQYXJhbXMgPiAkdGhpcy0+Z2V0RGF0YVR5cGVNYXhWYWx1ZSgkZGF0YVR5cGUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiRU5VTSI6CiAgICAgICAgICAgICAgICBpZiAoISRkYXRhVHlwZVBhcmFtcykKICAgICAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkZGF0YVR5cGVQYXJhbXMsICIsIikgIT09IEZBTFNFIHx8IHN0cnBvcygkZGF0YVR5cGVQYXJhbXMsICInIikgIT09IEZBTFNFKSAvLyBTUUwgZm9ybWF0ICd2YWwxJywndmFsMicKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWVzID0gZXhwbG9kZUxpc3QoJGRhdGFUeXBlUGFyYW1zLCAiLCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCgkdmFsdWVzKSA8PSAxKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goInxeJ1teJ10qJ1wkfCIsIHRyaW0oJHZhbHVlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgLy8gVmlzdWFsIFBIUCBmb3JtYXQgdmFsMXx2YWwyfHZhbDN8Li4uCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlcyA9IGV4cGxvZGVMaXN0KCRkYXRhVHlwZVBhcmFtcywgInwiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQoJHZhbHVlcykgPD0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVE9ETyBvdGhlciB0eXBlcwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGZ1bGx0ZXh0SW5kZXhTdXBwb3J0ZWQoJGRhdGFUeXBlKQogICAgewogICAgICAgICRkYXRhVHlwZXMgPSAkdGhpcy0+Z2V0RGF0YVR5cGVzKCJzdHJpbmciKTsKICAgICAgICAKICAgICAgICByZXR1cm4oaW5fYXJyYXkoJGRhdGFUeXBlLCAkZGF0YVR5cGVzKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFRhYmxlU3RydWN0dXJlKCR0YWJsZU5hbWUpCiAgICB7CiAgICAgICAgJHRhYmxlID0gYXJyYXkoKTsKICAgICAgICAkdGFibGVbIm5hbWUiXSA9ICR0YWJsZU5hbWU7CiAgICAgICAgCiAgICAgICAgJHRhYmxlWyJwcmltYXJ5S2V5cyJdID0gYXJyYXkoKTsKICAgICAgICAkdGFibGVbInVuaXF1ZUtleXMiXSA9IGFycmF5KCk7CiAgICAgICAgJHRhYmxlWyJpbmRleGVzIl0gPSBhcnJheSgpOwogICAgICAgICR0YWJsZVsiZnVsbHRleHRJbmRleGVzIl0gPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgiU0hPVyBJTkRFWCBGUk9NICIuJHRoaXMtPmdldFNxbE5hbWUoJHRhYmxlTmFtZSksIHRydWUpOwogICAgICAgICAgICBmb3IgKCRyID0gMCA7ICRyIDwgJHRoaXMtPnJlY29yZENvdW50KCkgOyAkcisrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVjb3JkID0gJHRoaXMtPm5leHRSZWNvcmQoKTsKICAgICAgICAgICAgICAgIGlmICgkcmVjb3JkWyJLZXlfbmFtZSJdID09ICJQUklNQVJZIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGFibGVbInByaW1hcnlLZXlzIl1bXSA9ICRyZWNvcmRbIkNvbHVtbl9uYW1lIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkcmVjb3JkWyJJbmRleF90eXBlIl0gPT0gIkZVTExURVhUIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIV9pc19hcnJheSgkdGFibGVbImZ1bGx0ZXh0SW5kZXhlcyJdWyRyZWNvcmRbIktleV9uYW1lIl1dKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YWJsZVsiZnVsbHRleHRJbmRleGVzIl1bJHJlY29yZFsiS2V5X25hbWUiXV0gPSBhcnJheSgibmFtZSIgPT4gJHJlY29yZFsiS2V5X25hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0YWJsZVsiZnVsbHRleHRJbmRleGVzIl1bJHJlY29yZFsiS2V5X25hbWUiXV1bImZpZWxkcyJdW10gPSAkcmVjb3JkWyJDb2x1bW5fbmFtZSJdLigkcmVjb3JkWyJTdWJfcGFydCJdID8gIigiLiRyZWNvcmRbIlN1Yl9wYXJ0Il0uIikiIDogIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHJlY29yZFsiTm9uX3VuaXF1ZSJdID09ICIxIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIV9pc19hcnJheSgkdGFibGVbImluZGV4ZXMiXVskcmVjb3JkWyJLZXlfbmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFibGVbImluZGV4ZXMiXVskcmVjb3JkWyJLZXlfbmFtZSJdXSA9IGFycmF5KCJuYW1lIiA9PiAkcmVjb3JkWyJLZXlfbmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRhYmxlWyJpbmRleGVzIl1bJHJlY29yZFsiS2V5X25hbWUiXV1bImZpZWxkcyJdW10gPSAkcmVjb3JkWyJDb2x1bW5fbmFtZSJdLigkcmVjb3JkWyJTdWJfcGFydCJdID8gIigiLiRyZWNvcmRbIlN1Yl9wYXJ0Il0uIikiIDogIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHJlY29yZFsiTm9uX3VuaXF1ZSJdID09ICIwIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIV9pc19hcnJheSgkdGFibGVbInVuaXF1ZUtleXMiXVskcmVjb3JkWyJLZXlfbmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFibGVbInVuaXF1ZUtleXMiXVskcmVjb3JkWyJLZXlfbmFtZSJdXSA9IGFycmF5KCJuYW1lIiA9PiAkcmVjb3JkWyJLZXlfbmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRhYmxlWyJ1bmlxdWVLZXlzIl1bJHJlY29yZFsiS2V5X25hbWUiXV1bImZpZWxkcyJdW10gPSAkcmVjb3JkWyJDb2x1bW5fbmFtZSJdLigkcmVjb3JkWyJTdWJfcGFydCJdID8gIigiLiRyZWNvcmRbIlN1Yl9wYXJ0Il0uIikiIDogIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAkdGFibGVbInVuaXF1ZUtleXMiXSA9IGFycmF5X3ZhbHVlcygkdGFibGVbInVuaXF1ZUtleXMiXSk7CiAgICAgICAgJHRhYmxlWyJpbmRleGVzIl0gPSBhcnJheV92YWx1ZXMoJHRhYmxlWyJpbmRleGVzIl0pOwogICAgICAgICR0YWJsZVsiZnVsbHRleHRJbmRleGVzIl0gPSBhcnJheV92YWx1ZXMoJHRhYmxlWyJmdWxsdGV4dEluZGV4ZXMiXSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCR0YWJsZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldEZpZWxkc1N0cnVjdHVyZSgkdGFibGVOYW1lKQogICAgewogICAgICAgICRmaWVsZHMgPSBhcnJheSgpOwogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgiREVTQ1JJQkUgIi4kdGhpcy0+Z2V0U3FsTmFtZSgkdGFibGVOYW1lKSwgdHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKCRyID0gMCA7ICRyIDwgJHRoaXMtPnJlY29yZENvdW50KCkgOyAkcisrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVjb3JkID0gJHRoaXMtPm5leHRSZWNvcmQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGZpZWxkID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRmaWVsZFsibmFtZSJdID0gJHJlY29yZFsiRmllbGQiXTsKICAgICAgICAgICAgICAgICRmaWVsZFsibnVsbFZhbHVlIl0gPSAoc3RydG9sb3dlcigkcmVjb3JkWyJOdWxsIl0pID09ICJ5ZXMiIHx8IHN0cnRvbG93ZXIoJHJlY29yZFsiTnVsbCJdKSA9PSAidHJ1ZSIgfHwgJHJlY29yZFsiTnVsbCJdID09ICIxIiA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICAkdHlwZSA9IGV4cGxvZGUoIigiLCBzdHJfcmVwbGFjZSgiKSIsICIiLCAkcmVjb3JkWyJUeXBlIl0pKTsKICAgICAgICAgICAgICAgICRmaWVsZFsiZGF0YVR5cGUiXSA9ICR0eXBlWzBdOwogICAgICAgICAgICAgICAgJHR5cGVbMV0gPSBleHBsb2RlKCIgIiwgJHR5cGVbMV0pOwogICAgICAgICAgICAgICAgJGZpZWxkWyJkYXRhVHlwZVBhcmFtcyJdID0gJHR5cGVbMV1bMF07CiAgICAgICAgICAgICAgICBpZiAoJHR5cGVbMV1bMV0gPT0gInVuc2lnbmVkIiB8fCAkdHlwZVsxXVsyXSA9PSAidW5zaWduZWQiKQogICAgICAgICAgICAgICAgICAgICRmaWVsZFsidW5zaWduZWQiXSA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoJHR5cGVbMV1bMV0gPT0gInplcm9maWxsIiB8fCAkdHlwZVsxXVsyXSA9PSAiemVyb2ZpbGwiKQogICAgICAgICAgICAgICAgICAgICRmaWVsZFsiemVyb2ZpbGwiXSA9IHRydWU7CiAgICAgICAgICAgICAgICAkZmllbGRbInByaW1hcnlLZXkiXSA9IChzdHJ0b2xvd2VyKCRyZWNvcmRbIktleSJdKSA9PSAicHJpIiA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICAkZmllbGRbImV4dHJhIl0gPSAkcmVjb3JkWyJFeHRyYSJdOwogICAgICAgICAgICAgICAgJGZpZWxkWyJhdXRvaW5jcmVtZW50Il0gPSAoc3RydG9sb3dlcigkcmVjb3JkWyJFeHRyYSJdKSA9PSAiYXV0b19pbmNyZW1lbnQiID8gdHJ1ZSA6IGZhbHNlKTsKICAgICAgICAgICAgICAgICRmaWVsZFsiZGVmYXVsdFZhbHVlIl0gPSAoJHJlY29yZFsiRGVmYXVsdCJdICE9ICJOVUxMIiA/ICRyZWNvcmRbIkRlZmF1bHQiXSA6ICIiKTsKCiAgICAgICAgICAgICAgICAkZmllbGRzWyRmaWVsZFsibmFtZSJdXSA9ICRmaWVsZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGZpZWxkcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFRhYmxlUGFyYW1zKCR0YWJsZU5hbWUpCiAgICB7CiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5nZXRUYWJsZVN0cnVjdHVyZSgkdGFibGVOYW1lKTsKICAgICAgICAkcGFyYW1zWyJmaWVsZHMiXSA9ICR0aGlzLT5nZXRGaWVsZHNTdHJ1Y3R1cmUoJHRhYmxlTmFtZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRwYXJhbXMpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gZ2V0Q3JlYXRlVGFibGVQYXJhbXMoJHBhcmFtcykKICAgIHsKICAgICAgICByZXR1cm4oIkVOR0lORT1NeUlTQU0gREVGQVVMVCBDSEFSU0VUPXV0ZjgiKTsKICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBmdW5jdGlvbiBnZXREYXRhVHlwZU1heFZhbHVlKCR0eXBlKQogICAgewogICAgICAgIGlmICgkdHlwZSA9PSAiVkFSQ0hBUiIgJiYgdmVyc2lvbl9jb21wYXJlKCR0aGlzLT5nZXRWZXJzaW9uKCksICI1LjMiKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigyMTg0NCk7IC8vIGZvciB1dGYtOCAtIGVsc2UgNjU1MzUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCR0aGlzLT5kYXRhVHlwZU1heFZhbHVlc1skdHlwZV0pOwogICAgfQoKfQoKLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGJMaW5rL1NRTGl0ZURiTGluay5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBUU1FMaXRlRGJMaW5rIGV4dGVuZHMgVFNRTERiTGluawp7CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uR2V0UHJvcGVydGllcygpCiAgICB7CiAgICAgICAgcmV0dXJuKGFycmF5X21lcmdlKHBhcmVudDo6b25HZXRQcm9wZXJ0aWVzKCksIGFycmF5KCAgICAgICAgCiAgICAgICAgICAgICJuYW1lPWZpbGUsY2FwdGlvbj1GaWxlLG9iamVjdD1GaWxlRWRpdCIsCiAgICAgICAgKSkpOyAgICAgICAgCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNoZWNrKCkKICAgIHsKICAgICAgICByZXR1cm4oY2xhc3NfZXhpc3RzKCJQRE8iKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3FsTmFtZSgkZmllbGROYW1lKQogICAgewogICAgICAgICRmaWVsZE5hbWUgPSAkdGhpcy0+Z2V0TmFtZSgkZmllbGROYW1lKTsKICAgICAgICAKICAgICAgICAkZmllbGROYW1lID0gc3RyX2lyZXBsYWNlKCIgYXMgIiwgIiBBUyAiLCAkZmllbGROYW1lKTsKICAgICAgICBpZiAoc3RycG9zKCRmaWVsZE5hbWUsICJgIikgIT09IEZBTFNFIHx8IHN0cmlwb3MoJGZpZWxkTmFtZSwgIiBBUyAiKSAhPT0gRkFMU0UgfHwgc3RyaXBvcygkZmllbGROYW1lLCAiKCIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybigkZmllbGROYW1lKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKCJgIi4kZmllbGROYW1lLiJgIik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZygkc3RyKQogICAgewogICAgICAgIGlmIChjbGFzc19leGlzdHMoIlNRTGl0ZTMiKSkKICAgICAgICAgICAgcmV0dXJuKFNRTGl0ZTM6OmVzY2FwZVN0cmluZygkc3RyKSk7CiAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25fZXhpc3RzKCJzcWxpdGVfZXNjYXBlX3N0cmluZyIpKQogICAgICAgICAgICByZXR1cm4oc3FsaXRlX2VzY2FwZV9zdHJpbmcoJHN0cikpOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRzdHIgPSByZWFsX2VzY2FwZV9zdHJpbmcoJHN0cik7CiAgICAgICAgICAgICRzdHIgPSBzdHJfcmVwbGFjZSgiXFxcIiIsICJcIlwiIiwgJHN0cik7IC8vIFNRTGl0ZTogIiA9PiAiIgogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKCRzdHIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0RmllbGREZWZpbml0aW9uKCRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKCRwYXJhbXNbImRhdGFUeXBlIl0gPT0gIkVOVU0iKQogICAgICAgIHsKICAgICAgICAgICAgJHBhcmFtc1siZGF0YVR5cGUiXSA9ICJWQVJDSEFSIjsKICAgICAgICAgICAgJHBhcmFtc1siZGF0YVR5cGVQYXJhbXMiXSA9ICIyNTUiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ocGFyZW50OjpnZXRGaWVsZERlZmluaXRpb24oJHBhcmFtcykpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wZW4oKQogICAgewogICAgICAgICR0aGlzLT5lcnJvciA9ICIiOwoKICAgICAgICBpZiAoISR0aGlzLT5EQikKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoUFJPSkVDVFBBVEguJHRoaXMtPmZpbGUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cyhQUk9KRUNUUEFUSC4kdGhpcy0+ZmlsZSwgIiIsIDA3NzcpOwogICAgICAgICAgICAgICAgICAgIF9jaG1vZChnZXRGaWxlUGF0aChQUk9KRUNUUEFUSC4kdGhpcy0+ZmlsZSksIDA3NzcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vJHRoaXMtPnJlcyA9IHNxbGl0ZV9vcGVuKCR0aGlzLT5maWxlKTsKICAgICAgICAgICAgICAgICR0aGlzLT5EQiA9IG5ldyBQRE8oInNxbGl0ZToiLlBST0pFQ1RQQVRILiR0aGlzLT5maWxlKTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+REIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkRCLT5zZXRBdHRyaWJ1dGUoUERPOjpBVFRSX0VSUk1PREUsIFBETzo6RVJSTU9ERV9FWENFUFRJT04pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRTUUxpdGVEYkxpbms6IG5vIGZpbGUgc3BlY2lmaWVkIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJHRoaXMtPkRCKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcXVlcnkoJHNxbCkKICAgIHsKICAgICAgICAvL19maWxlX2FwcGVuZF9jb250ZW50cyhQUk9KRUNUUEFUSC4ic3FsaXRlLmxvZyIsICRzcWwuIlxuIik7CiAgICAgICAgLy9lY2hvICRzcWw7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPmVycm9yID0gIiI7CiAgICAgICAgLy9maWxlX2FwcGVuZF9jb250ZW50cyhQUk9KRUNUUEFUSC4iX19TUUwub3V0IiwgJHNxbC4iXHJcbiIpOwogICAgICAgIC8vJHNxbCA9IHN0cl9yZXBsYWNlKCJTUUxfQ0FMQ19GT1VORF9ST1dTIiwgIiIsICRzcWwpOwogICAgICAgIC8vJHNxbCA9IHN0cl9yZXBsYWNlKCJGT1VORF9ST1dTKCkiLCAiTlVMTCIsICRzcWwpOwogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHNxbCA9ICR0aGlzLT5vblNxbFF1ZXJ5KCRzcWwpOwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8kc3FsID0gIlNFTEVDVCAqIEZST00gc3FsaXRlMSI7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVzdWx0ID0gJHRoaXMtPkRCLT5xdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgICR0aGlzLT5yZWNvcmRzID0gJHRoaXMtPnJlc3VsdC0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9BU1NPQyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5kZXggPSAwOwogICAgICAgICAgICAgICAgLy9lY2hvICRzcWw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goUERPRXhjZXB0aW9uICRlKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9lY2hvICRlLT5nZXRNZXNzYWdlKCkuIjxociAvPiI7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRzcWwpOwogICAgICAgICAgICAgICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yID0gIlRTUUxpdGVEYkxpbms6ICIuX2h0bWxlbnRpdGllcygkZS0+Z2V0TWVzc2FnZSgpKS4iPGJyIC8+Ii5faHRtbGVudGl0aWVzKCRzcWwpOwogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoJHRoaXMtPmVycm9yLCBtdEVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKCR0aGlzLT5yZXN1bHQpOwogICAgICAgIH0KICAgICAgICAKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZXhlYygkc3FsKQogICAgewogICAgICAgIC8vZWNobyAkc3FsOwogICAgICAgIC8vX2ZpbGVfYXBwZW5kX2NvbnRlbnRzKFBST0pFQ1RQQVRILiJzcWxpdGUubG9nIiwgJHNxbC4iXG4iKTsKICAgICAgICAkdGhpcy0+ZXJyb3IgPSAiIjsKCiAgICAgICAgaWYgKCR0aGlzLT5vcGVuKCkpCiAgICAgICAgewogICAgICAgICAgICAkc3FsID0gJHRoaXMtPm9uU3FsUXVlcnkoJHNxbCk7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVzdWx0ID0gJHRoaXMtPkRCLT5leGVjKCRzcWwpOwogICAgICAgICAgICAgICAgLy9lY2hvICRzcWw7IHZhcl9kdW1wKCR0aGlzLT5yZXN1bHQpO2VjaG8gIjxocj4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoKFBET0V4Y2VwdGlvbiAkZSkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZWNobyAkZS0+Z2V0TWVzc2FnZSgpLiI8aHIgLz4iOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkc3FsKTsKICAgICAgICAgICAgICAgIC8vZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICJUU1FMaXRlRGJMaW5rOiAiLiRlLT5nZXRNZXNzYWdlKCkuIjxiciAvPiIuJHNxbDsKICAgICAgICAgICAgICAgIC8vZWNobyAkdGhpcy0+ZXJyb3IuIjxociAvPiI7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgkdGhpcy0+ZXJyb3IsIG10RXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4oJHRoaXMtPnJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIAogICAgfQoKICAgIGZ1bmN0aW9uIG5leHRSZWNvcmQoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHJlY29yZCA9ICR0aGlzLT5yZWNvcmRzWyR0aGlzLT5pbmRleF07CiAgICAgICAgICAgICR0aGlzLT5pbmRleCsrOwogICAgICAgICAgICAvL2R1bXAoJHJlY29yZCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmVjb3JkKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcmVjb3JkQ291bnQoKQogICAgewogICAgICAgIC8vIFNRTGl0ZSBkb2VzIG5vdCBoYXZlIHJvd0NvdW50KCkKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRjb3VudCA9IGNvdW50KCR0aGlzLT5yZWNvcmRzKTsKICAgICAgICAgICAgLy9kdW1wKCRjb3VudCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkY291bnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRhYmxlRXhpc3RzKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHRhYmxlTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkcGFyYW1zKTsKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGNvdW50KCopIEFTIGNudCBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hFUkUgdHlwZT0ndGFibGUnIEFORCBuYW1lPSciLiR0YWJsZU5hbWUuIiciOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAkcmVjb3JkID0gJHRoaXMtPm5leHRSZWNvcmQoKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3JkKTsKICAgICAgICAgICAgcmV0dXJuKCRyZWNvcmRbImNudCJdID4gMCA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNoYW5nZUZpZWxkKCR0YWJsZVBhcmFtcywgJG9sZFBhcmFtcywgJG5ld1BhcmFtcykKICAgIHsKICAgICAgICAkdGFibGVOYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCR0YWJsZVBhcmFtcyk7CiAgICAgICAgJG5ld0ZpZWxkTmFtZSA9ICR0aGlzLT5nZXRSZWFsTmFtZSgkbmV3UGFyYW1zKTsKICAgICAgICAkb2xkRmllbGROYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCRvbGRQYXJhbXMpOwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+b3BlbigpKQogICAgICAgIHsKICAgICAgICAgICAgJHRtcFRhYmxlTmFtZSA9ICR0YWJsZU5hbWUubWQ1KFVVSUQoKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdG1wVGFibGVQYXJhbXMgPSAkdGFibGVQYXJhbXM7CiAgICAgICAgICAgICR0bXBUYWJsZVBhcmFtc1sic3FsTmFtZSJdID0gJHRtcFRhYmxlTmFtZTsKICAgICAgICAgICAgJHRtcFRhYmxlUGFyYW1zWyJ0ZW1wb3JhcnkiXSA9IHRydWU7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRtcFRhYmxlUGFyYW1zKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRmaWVsZHMgPSBhcnJheSgpOwogICAgICAgICAgICAkZmllbGROYW1lcyA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkVGFibGUgPSBnZXRUYWJsZSgkdGhpcy0+Z2V0TmFtZSgkdGFibGVQYXJhbXMpKTsKICAgICAgICAgICAgZm9yZWFjaCgkVGFibGUtPmdldEZpZWxkcygpIGFzICRGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZmllbGQpOwogICAgICAgICAgICAgICAgJGZpZWxkc1tdID0gJEZpZWxkLT5zcWxSZWNvcmQ7CiAgICAgICAgICAgICAgICAkZmllbGROYW1lc1tdID0gJHRoaXMtPmdldFJlYWxOYW1lKCRGaWVsZC0+c3FsUmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL3Zhcl9kdW1wKCRmaWVsZHMpOwogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIkJFR0lOIFRSQU5TQUNUSU9OIik7CiAgICAgICAgICAgICR0aGlzLT5jcmVhdGVUYWJsZSgkdG1wVGFibGVQYXJhbXMsICRmaWVsZHMpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmVycm9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlYygiUk9MTEJBQ0siKTsKICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIklOU0VSVCBJTlRPICIuJHRtcFRhYmxlTmFtZS4iIFNFTEVDVCAiLmltcGxvZGUoIiwiLCRmaWVsZE5hbWVzKS4iIEZST00gIi4kdGFibGVOYW1lKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lcnJvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIlJPTExCQUNLIik7CiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5kcm9wVGFibGUoJHRhYmxlTmFtZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leGVjKCJST0xMQkFDSyIpOwogICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRtcEZpZWxkcyA9ICRmaWVsZHM7CiAgICAgICAgICAgICR0bXBGaWVsZE5hbWVzID0gJGZpZWxkTmFtZXM7CiAgICAgICAgICAgIGZvcmVhY2goJGZpZWxkcyBhcyAka2V5ID0+ICRmaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5nZXRSZWFsTmFtZSgkZmllbGQpID09ICRvbGRGaWVsZE5hbWUpCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkZmllbGRzWyRrZXldID0gJG5ld1BhcmFtczsKICAgICAgICAgICAgICAgICAgICAkZmllbGROYW1lc1ska2V5XSA9ICRuZXdGaWVsZE5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5jcmVhdGVUYWJsZSgkdGFibGVQYXJhbXMsICRmaWVsZHMpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmVycm9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlYygiUk9MTEJBQ0siKTsKICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIklOU0VSVCBJTlRPICIuJHRhYmxlTmFtZS4iIFNFTEVDVCAiLmltcGxvZGUoIiwiLCR0bXBGaWVsZE5hbWVzKS4iIEZST00gIi4kdG1wVGFibGVOYW1lKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lcnJvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIlJPTExCQUNLIik7CiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5kcm9wVGFibGUoJHRtcFRhYmxlUGFyYW1zKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lcnJvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIlJPTExCQUNLIik7CiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5leGVjKCJDT01NSVQiKTsKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkcm9wRmllbGQoJHRhYmxlUGFyYW1zLCAkcGFyYW1zLCAkc2lsZW50PWZhbHNlKQogICAgewogICAgICAgICR0YWJsZU5hbWUgPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJHRhYmxlUGFyYW1zKTsKICAgICAgICAkZmllbGROYW1lID0gJHRoaXMtPmdldFJlYWxOYW1lKCRwYXJhbXMpOwoKICAgICAgICBpZiAoJHRoaXMtPm9wZW4oKSkKICAgICAgICB7CiAgICAgICAgICAgICR0bXBUYWJsZU5hbWUgPSAkdGFibGVOYW1lLm1kNShVVUlEKCkpOwogICAgICAgICAgICAKICAgICAgICAgICAgJHRtcFRhYmxlUGFyYW1zID0gJHRhYmxlUGFyYW1zOwogICAgICAgICAgICAkdG1wVGFibGVQYXJhbXNbInNxbE5hbWUiXSA9ICR0bXBUYWJsZU5hbWU7CiAgICAgICAgICAgICR0bXBUYWJsZVBhcmFtc1sidGVtcG9yYXJ5Il0gPSB0cnVlOwoKICAgICAgICAgICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRmaWVsZE5hbWVzID0gYXJyYXkoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRUYWJsZSA9IGdldFRhYmxlKCR0aGlzLT5nZXROYW1lKCR0YWJsZVBhcmFtcykpOwogICAgICAgICAgICBmb3JlYWNoKCRUYWJsZS0+Z2V0RmllbGRzKCkgYXMgJEZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkZmllbGRzW10gPSAkRmllbGQtPnNxbFJlY29yZDsKICAgICAgICAgICAgICAgICRmaWVsZE5hbWVzW10gPSAkdGhpcy0+Z2V0UmVhbE5hbWUoJEZpZWxkLT5zcWxSZWNvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+ZXhlYygiQkVHSU4gVFJBTlNBQ1RJT04iKTsKICAgICAgICAgICAgJHRoaXMtPmNyZWF0ZVRhYmxlKCR0bXBUYWJsZVBhcmFtcywgJGZpZWxkcyk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leGVjKCJST0xMQkFDSyIpOwogICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+ZXhlYygiSU5TRVJUIElOVE8gIi4kdG1wVGFibGVOYW1lLiIgU0VMRUNUICIuaW1wbG9kZSgiLCIsJGZpZWxkTmFtZXMpLiIgRlJPTSAiLiR0YWJsZU5hbWUpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmVycm9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlYygiUk9MTEJBQ0siKTsKICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmRyb3BUYWJsZSgkdGFibGVOYW1lKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lcnJvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIlJPTExCQUNLIik7CiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJGtleSA9PiAkZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+Z2V0UmVhbE5hbWUoJGZpZWxkKSA9PSAkZmllbGROYW1lKQogICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGZpZWxkc1ska2V5XSk7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGZpZWxkTmFtZXNbJGtleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Y3JlYXRlVGFibGUoJHRhYmxlUGFyYW1zLCAkZmllbGRzKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lcnJvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWMoIlJPTExCQUNLIik7CiAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5leGVjKCJJTlNFUlQgSU5UTyAiLiR0YWJsZU5hbWUuIiBTRUxFQ1QgIi5pbXBsb2RlKCIsIiwkZmllbGROYW1lcykuIiBGUk9NICIuJHRtcFRhYmxlTmFtZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leGVjKCJST0xMQkFDSyIpOwogICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+ZHJvcFRhYmxlKCR0bXBUYWJsZVBhcmFtcyk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXJyb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leGVjKCJST0xMQkFDSyIpOwogICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+ZXhlYygiQ09NTUlUIik7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldFByaW1hcnlLZXkoJHRhYmxlUGFyYW1zLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vIFRPRE8gLSBtdXN0IHJlY3JlYXRlIHRoZSB3aG9sZSB0YWJsZSAtIHNlZSBjaGFuZ2VGaWVsZAogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZHJvcFByaW1hcnlLZXkoJHRhYmxlUGFyYW1zKQogICAgewogICAgICAgIC8vIFRPRE8gLSBtdXN0IHJlY3JlYXRlIHRoZSB3aG9sZSB0YWJsZQogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gYWRkRnVsbHRleHRJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lPSIiKQogICAgewogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcm9wRnVsbHRleHRJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMpCiAgICB7CiAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBhZGRJbmRleCgkdGFibGVQYXJhbXMsICRwYXJhbXMsICRuYW1lPSIiKQogICAgewogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZHJvcEluZGV4KCR0YWJsZVBhcmFtcywgJHBhcmFtcywgJG5hbWU9IiIpCiAgICB7CiAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBfX3NsZWVwKCkKICAgIHsKICAgICAgICAkdmFycyA9IGFycmF5X2tleXMoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7CiAgICAgICAgYXJyYXlfZGVsZXRlKCR2YXJzLCAiREIiKTsKICAgICAgICBhcnJheV9kZWxldGUoJHZhcnMsICJyZXN1bHQiKTsKCiAgICAgICAgcmV0dXJuKCR2YXJzKTsKICAgIH0KICAgIAogICAgCn0KZnVuY3Rpb24gVFByb2dyZXNzKHBhcmFtcywgaWQpICAgDQp7DQogICAgaWYgKCFpZCkNCiAgICAgICAgaWQgPSAiUHJvZ3Jlc3MiOw0KICAgICAgICANCiAgICB0aGlzLlRISVMgPSB0aGlzOw0KICAgIHRoaXMuaWQgPSBpZDsNCiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsNCiAgICANCiAgICB0aGlzLmR1bXBEYXRhID0gZmFsc2U7DQogICAgLy9hbGVydCh0aGlzLmlkKTsNCiAgICBhZGRPYmplY3QodGhpcyk7DQogICAgdGhpcy5fY3JlYXRlKCk7DQp9DQoNCmV4dGVuZENsYXNzKFRQcm9ncmVzcywgVENvbXBvbmVudCk7DQoNClRQcm9ncmVzcy5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKQ0Kew0KICAgIHRoaXMuY29udGFpbmVyID0gZ2V0RWxlbWVudCh0aGlzLnBhcmFtc1siY29udGFpbmVyIl0pOw0KICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lcik7DQogICAgYWRkQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiX1Byb2dyZXNzIik7DQogICAgDQogICAgdGhpcy5wcm9ncmVzc0NvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIGFkZENsYXNzTmFtZSh0aGlzLnByb2dyZXNzQ29udGFpbmVyLCAiX1Byb2dyZXNzQmFyIik7DQogICAgDQogICAgdGhpcy50ZXh0Q29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgYWRkQ2xhc3NOYW1lKHRoaXMudGV4dENvbnRhaW5lciwgIl9Qcm9ncmVzc1RleHQiKTsNCg0KICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudGV4dENvbnRhaW5lcik7DQogICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wcm9ncmVzc0NvbnRhaW5lcik7DQoNCiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJwcmVmaXgiXSkgPT0gInVuZGVmaW5lZCIpDQogICAgICAgIHRoaXMucGFyYW1zWyJwcmVmaXgiXSA9ICIiOw0KICAgIGlmICh0eXBlb2YodGhpcy5wYXJhbXNbInBvc3RmaXgiXSkgPT0gInVuZGVmaW5lZCIpDQogICAgICAgIHRoaXMucGFyYW1zWyJwb3N0Zml4Il0gPSAiIjsNCiAgICANCiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJjYXB0aW9uIl0pICE9ICJ1bmRlZmluZWQiKQ0KICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLnBhcmFtc1siY2FwdGlvbiJdOw0KDQogICAgaWYgKHR5cGVvZih0aGlzLnBhcmFtc1siY29sb3IiXSkgIT0gInVuZGVmaW5lZCIpDQogICAgew0KICAgICAgICB0aGlzLnByb2dyZXNzQ29udGFpbmVyLnN0eWxlLmJhY2tncm91bmQgPSB0aGlzLnBhcmFtc1siY29sb3IiXTsNCiAgICAgICAgdGhpcy5wcm9ncmVzc0NvbnRhaW5lci5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMucGFyYW1zWyJjb2xvciJdOw0KICAgIH0NCiAgICANCiAgICAvL2R1bXAodGhpcy5wYXJhbXNbInZhbHVlIl0pOw0KICAgIC8vZHVtcCh0aGlzLmNhcHRpb24pOw0KICAgIHRoaXMuc2V0VmFsdWUoZXh0cmFjdEludCh0aGlzLnBhcmFtc1sidmFsdWUiXSksIHRoaXMuY2FwdGlvbik7DQogICAgLy9kdW1wKHRoaXMucGFyYW1zKTsNCg0KICAgIHZhciBfdGhpcyA9IHRoaXM7DQogICAgYWRkRXZlbnQodGhpcy5jb250YWluZXIsICJyZXNpemUiLCBmdW5jdGlvbigpe190aGlzLmRyYXcoKX0pOw0KfQ0KDQpUUHJvZ3Jlc3MucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUsIGNhcHRpb24pDQp7DQogICAgdmFsdWUgPSBleHRyYWN0SW50KHZhbHVlLCAwKTsNCiAgICANCiAgICB0aGlzLmR1bXAoInNldFZhbHVlKCIrdmFsdWUrIikiKTsNCiAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQogICAgdGhpcy5jYXB0aW9uID0gKHR5cGVvZihjYXB0aW9uKSAhPSAidW5kZWZpbmVkIiA/IGNhcHRpb24gOiBudWxsKTsNCiAgICANCiAgICB0aGlzLmRyYXcoKTsNCn0NCg0KVFByb2dyZXNzLnByb3RvdHlwZS5zZXRWYWx1ZUJ5SW5kZXggPSBmdW5jdGlvbihpbmRleCwgdG90YWwsIGNhcHRpb24pDQp7DQogICAgdmFyIHZhbHVlID0gKGluZGV4KzEpKjEwMC90b3RhbDsNCiAgICANCiAgICB0aGlzLnNldFZhbHVlKHZhbHVlLCBjYXB0aW9uKTsNCn0NCg0KVFByb2dyZXNzLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uKCkNCnsNCiAgICByZXR1cm4odGhpcy52YWx1ZSk7DQp9DQoNClRQcm9ncmVzcy5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkNCnsNCiAgICB2YXIgd2lkdGggPSBleHRyYWN0SW50KGdldFN0eWxlKHRoaXMuY29udGFpbmVyLCAiaW5uZXJXaWR0aCIpLCAwKTsNCiAgICB2YXIgaGVpZ2h0ID0gZXh0cmFjdEludChnZXRTdHlsZSh0aGlzLmNvbnRhaW5lciwgImlubmVySGVpZ2h0IiksIDApDQogICAgLy9kdW1wKHdpZHRoKTsNCiAgICAvL2FsZXJ0KCJ3aWR0aD0iK3dpZHRoKTsNCiAgICANCiAgICAvL2R1bXAodGhpcy5wYXJhbXMpOw0KICAgIHZhciBtaW5WYWx1ZSA9IGV4dHJhY3RGbG9hdCh0aGlzLnBhcmFtc1sibWluVmFsdWUiXSkgfHwgMDsNCiAgICB2YXIgbWF4VmFsdWUgPSBleHRyYWN0RmxvYXQodGhpcy5wYXJhbXNbIm1heFZhbHVlIl0pIHx8IDEwMDsNCiAgICANCiAgICB2YXIgX3ZhbHVlID0gdGhpcy52YWx1ZS1taW5WYWx1ZTsNCiAgICB2YXIgX21heFZhbHVlID0gbWF4VmFsdWUtbWluVmFsdWU7DQogICAgdmFyIF9wZXJjZW50ID0gTWF0aC5taW4oTWF0aC5yb3VuZCgxMDAqX3ZhbHVlL21heFZhbHVlKSwgMTAwKTsNCiAgICAvL2R1bXAobWluVmFsdWUpOw0KICAgIC8vZHVtcChtYXhWYWx1ZSk7DQogICAgLy9kdW1wKF92YWx1ZSk7DQogICAgLy9kdW1wKF9tYXhWYWx1ZSk7DQogICAgLy9kdW1wKF9wZXJjZW50KTsNCiAgICANCiAgICAvL3ZhciByZWxXaWR0aCA9IE1hdGgucm91bmQod2lkdGgqdGhpcy52YWx1ZS8xMDApOw0KICAgIHZhciByZWxXaWR0aCA9IE1hdGgucm91bmQod2lkdGgqX3BlcmNlbnQvMTAwKTsNCiAgICBpZiAoaXNOYU4ocmVsV2lkdGgpKQ0KICAgICAgICByZWxXaWR0aCA9IDA7DQogICAgDQogICAgc2V0U3R5bGUodGhpcy5wcm9ncmVzc0NvbnRhaW5lciwgImRpc3BsYXkiLCAocmVsV2lkdGggPyAiIiA6ICJub25lIikpOw0KICAgICAgICANCiAgICBzZXRTdHlsZSh0aGlzLnByb2dyZXNzQ29udGFpbmVyLCAib3V0ZXJXaWR0aCIsIHJlbFdpZHRoKyJweCIpOw0KICAgIHNldFN0eWxlKHRoaXMucHJvZ3Jlc3NDb250YWluZXIsICJvdXRlckhlaWdodCIsIGhlaWdodCsicHgiKTsNCiAgICAvL2FsZXJ0KHJlbFdpZHRoKTsNCiAgICANCiAgICBpZiAodGhpcy5jYXB0aW9uID09IG51bGwpDQogICAgICAgIC8vdmFyIGNhcHRpb24gPSB0aGlzLnRleHRDb250YWluZXIuaW5uZXJIVE1MID0gdGhpcy5wYXJhbXNbInByZWZpeCJdK3RoaXMudmFsdWUrIiUiK3RoaXMucGFyYW1zWyJwb3N0Zml4Il07DQogICAgICAgIHZhciBjYXB0aW9uID0gdGhpcy50ZXh0Q29udGFpbmVyLmlubmVySFRNTCA9IHRoaXMucGFyYW1zWyJwcmVmaXgiXStfcGVyY2VudCsiJSIrdGhpcy5wYXJhbXNbInBvc3RmaXgiXTsNCiAgICBlbHNlDQogICAgICAgIHZhciBjYXB0aW9uID0gdGhpcy50ZXh0Q29udGFpbmVyLmlubmVySFRNTCA9IHRoaXMuY2FwdGlvbjsNCiAgICAgICAgDQogICAgLy9kdW1wKHRoaXMuY2FwdGlvbik7DQogICAgdGhpcy50ZXh0Q29udGFpbmVyLmlubmVySFRNTCA9ICIiOw0KICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGNhcHRpb24ubGVuZ3RoIDsgaSsrKQ0KICAgIHsNCiAgICAgICAgdGhpcy50ZXh0Q29udGFpbmVyLmlubmVySFRNTCArPSAiPHNwYW4+IitjYXB0aW9uW2ldKyI8L3NwYW4+IjsNCiAgICB9DQogICAgdGhpcy50ZXh0Q29udGFpbmVyLmlubmVySFRNTDsNCiAgICANCiAgICB2YXIgdFdpZHRoID0gdGhpcy50ZXh0Q29udGFpbmVyLm9mZnNldFdpZHRoOw0KICAgIHZhciB0SGVpZ2h0ID0gdGhpcy50ZXh0Q29udGFpbmVyLm9mZnNldEhlaWdodDsNCg0KICAgIHZhciB0Y1dpZHRoID0gMDsNCiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLnRleHRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspDQogICAgew0KICAgICAgICB2YXIgY1dpZHRoID0gdGhpcy50ZXh0Q29udGFpbmVyLmNoaWxkTm9kZXNbaV0ub2Zmc2V0V2lkdGg7Ow0KICAgICAgICBpZiAocmVsV2lkdGgtY1dpZHRoIDwgKHdpZHRoLzItdFdpZHRoLzIrdGNXaWR0aCkpDQogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy50ZXh0Q29udGFpbmVyLmNoaWxkTm9kZXNbaV0sICJfUHJvZ3Jlc3NUZXh0MCIpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy50ZXh0Q29udGFpbmVyLmNoaWxkTm9kZXNbaV0sICJfUHJvZ3Jlc3NUZXh0MTAwIik7DQogICAgICAgIA0KICAgICAgICB0Y1dpZHRoICs9IGNXaWR0aDsNCiAgICAgICAgLy9kdW1wKHRjV2lkdGgpOw0KICAgIH0NCiAgICANCiAgICAvKg0KICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLnRleHRDb250YWluZXIsICJfUHJvZ3Jlc3NUZXh0MCIpOw0KICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLnRleHRDb250YWluZXIsICJfUHJvZ3Jlc3NUZXh0NTAiKTsNCiAgICByZW1vdmVDbGFzc05hbWUodGhpcy50ZXh0Q29udGFpbmVyLCAiX1Byb2dyZXNzVGV4dDEwMCIpOw0KICAgIGlmIChyZWxXaWR0aCA8ICh3aWR0aC8yLXRXaWR0aC8yKSkNCiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMudGV4dENvbnRhaW5lciwgIl9Qcm9ncmVzc1RleHQwIik7DQogICAgZWxzZSBpZiAocmVsV2lkdGggPiAod2lkdGgvMit0V2lkdGgvMikpDQogICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLnRleHRDb250YWluZXIsICJfUHJvZ3Jlc3NUZXh0MTAwIik7DQogICAgZWxzZQ0KICAgICAgICBhZGRDbGFzc05hbWUodGhpcy50ZXh0Q29udGFpbmVyLCAiX1Byb2dyZXNzVGV4dDUwIik7DQogICAgKi8NCiAgICANCiAgICB0aGlzLnRleHRDb250YWluZXIuc3R5bGUubWFyZ2luTGVmdCA9IE1hdGgucm91bmQod2lkdGgvMi10V2lkdGgvMikrInB4IjsNCiAgICB0aGlzLnRleHRDb250YWluZXIuc3R5bGUubWFyZ2luVG9wID0gTWF0aC5yb3VuZChoZWlnaHQvMi10SGVpZ2h0LzIpKyJweCI7ICAgIA0KfQ==Ll9Qcm9ncmVzcyB7DQogICAgYm9yZGVyOiAxcHggc29saWQgI0NEQ0FCQjsNCiAgICBiYWNrZ3JvdW5kOiAjRUVFRUVFOw0KICAgIHdpZHRoOiAyMDBweDsgDQogICAgaGVpZ2h0OiAyNHB4Ow0KfQ0KDQouX1Byb2dyZXNzQmFyIHsNCiAgICBiYWNrZ3JvdW5kOiAjMjIyMkZGOw0KfQ0KDQouX1Byb2dyZXNzVGV4dCB7DQogICAgLypmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LXNpemU6IDEycHg7Ki8NCiAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQp9DQoNCi5fUHJvZ3Jlc3NUZXh0MCB7DQogICAgY29sb3I6ICMwMDAwMDA7DQp9DQoNCi5fUHJvZ3Jlc3NUZXh0NTAgew0KICAgIGNvbG9yOiAjODg4ODg4Ow0KfQ0KDQouX1Byb2dyZXNzVGV4dDEwMCB7DQogICAgY29sb3I6ICNGRkZGRkY7DQp9DQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvUHJvZ3Jlc3MvUHJvZ3Jlc3MuY2xhc3MucGhwIC0tLS0tLS0gDQoNCmNsYXNzIFRQcm9ncmVzcyBleHRlbmRzIFRDb21wb25lbnQNCnsNCiAgICAvLyBUT0RPIC0gYWRkIHByb3BlcnRpZXMgZm9yIEhUTUxBUkVBIGRpYWxvZyAtIHNob3VsZCBiZSByZWFkZWQgYnkgQUpBWCAtIGNvbnZlcnQgUEhQIHRvIEpTDQogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgIHsNCiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgpOw0KICAgICAgICANCiAgICB9DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvbkdldFByb3BlcnRpZXMoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuKG1lcmdlUHJvcGVydGllcyhwYXJlbnQ6Om9uR2V0UHJvcGVydGllcygpLCBhcnJheSggICAgICAgIA0KICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPURhdGEiLA0KICAgICAgICAibmFtZT1wcmVmaXgsY2FwdGlvbj1QcmVmaXgsb2JqZWN0PUxpc3RFZGl0IiwNCiAgICAgICAgIm5hbWU9cG9zdGZpeCxjYXB0aW9uPVBvc3RmaXgsb2JqZWN0PUxpc3RFZGl0IiwNCiAgICAgICAgIm5hbWU9Y2FwdGlvbixjYXB0aW9uPUNhcHRpb24sb2JqZWN0PVRleHRFZGl0IiwNCiAgICAgICAgIm5hbWU9bWluVmFsdWUsY2FwdGlvbj1NaW4gVmFsdWUsb2JqZWN0PVRleHRFZGl0IiwNCiAgICAgICAgIm5hbWU9bWF4VmFsdWUsY2FwdGlvbj1NYXggVmFsdWUsb2JqZWN0PVRleHRFZGl0IiwNCiAgICAgICAgIm5hbWU9Y29sb3IsY2FwdGlvbj1Db2xvcixvYmplY3Q9Q29sb3JFZGl0IiwNCiAgICAgICAgDQogICAgICAgICkpKTsgICAgICAgIA0KICAgICAgICAvLyksIFRQcm9wZXJ0eUVkaXRvcjo6Z2V0Q1NTUHJvcGVydGllcygpKSk7ICAgICAgICANCiAgICB9DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfX2ltcGxlbWVudHMoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuKGFycmF5KCJGaWVsZENvbXBvbmVudCIpKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkNCiAgICB7DQogICAgICAgIGlmICghaGVhZEh0bWxBZGRlZChfX0NMQVNTX18sICRwYXJhbXMpKQ0KICAgICAgICB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgIHBhcmVudDo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsNCg0KICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L1Byb2dyZXNzL1Byb2dyZXNzLmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOw0KICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxsaW5rIGhyZWY9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L1Byb2dyZXNzL1Byb2dyZXNzLmNsYXNzLmNzcycgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgLz4iLHRydWUpOw0KICAgICAgICAgICAgYWRkRXh0ZW5kaW5nSGVhZEh0bWwoJHBhcmFtcywgX19DTEFTU19fKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG9uR2V0Q29udGVudCgmJHBhcmFtcz1hcnJheSgpLCAkdmFsdWU9MCkNCiAgICB7DQogICAgICAgICR0aGlzLT5nZXRIZWFkSHRtbCgkcGFyYW1zKTsNCg0KICAgICAgICAkcGFyYW1zID0gJHRoaXMtPmV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7DQogICAgICAgIA0KICAgICAgICAkdGhpcy0+aW5pdCgkcGFyYW1zKTsNCiAgICAgICAgDQogICAgICAgICRqc05hbWUgPSAiUGFuZWxfIi5tZDUoJHRoaXMtPmlkKTsNCg0KICAgICAgICBpZiAoISRwYXJhbXNbImNvbnRhaW5lciJdKQ0KICAgICAgICB7DQogICAgICAgICAgICAkY29udGFpbmVySWQgPSAiUHJvZ3Jlc3NDb250YWluZXJfIi4kdGhpcy0+aWQ7DQogICAgICAgICAgICAvL2R1bXAoaHRtbGVudGl0aWVzKCI8ZGl2IGlkPSckY29udGFpbmVySWQnIHN0eWxlPSciLmdldENTU1BhcmFtcygkcGFyYW1zKS4iJz48L2Rpdj4iKSk7DQogICAgICAgICAgICAkaHRtbCAuPSAiPGRpdiBpZD0nJGNvbnRhaW5lcklkJyBzdHlsZT0nIi5nZXRDU1NQYXJhbXMoJHBhcmFtcykuIicgY2xhc3M9JyIuJHBhcmFtc1siY2xhc3MiXS4iJz48L2Rpdj4iOw0KICAgICAgICAgICAgJHBhcmFtc1siY29udGFpbmVyIl0gPSAkY29udGFpbmVySWQ7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJHBhcmFtc1sidmFsdWUiXSA9PSAiIikNCiAgICAgICAgICAgICRwYXJhbXNbInZhbHVlIl0gPSAkdmFsdWU7DQogICAgICAgIA0KICAgICAgICAkanNQYXJhbXMgPSAkcGFyYW1zOw0KICAgICAgICANCiAgICAgICAgJGpzIC49ICIgICB2YXIgUHJvZ3Jlc3MgPSBuZXcgVFByb2dyZXNzKCIuJHRoaXMtPmdldEpzUGFyYW1zKCRqc1BhcmFtcykuIiwgJyIuJHRoaXMtPmlkLiInKTsgXG4iOw0KICAgICAgICAvLyRqcyAuPSAiICAgUHJvZ3Jlc3Muc2V0VmFsdWUoIi4kdmFsdWUuIik7IFxuIjsNCiAgICAgICAgICAgIA0KICAgICAgICAkaHRtbCAuPSAkdGhpcy0+Z2V0SmF2YVNjcmlwdEh0bWwoJGpzKTsNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4oJGh0bWwpOw0KICAgIH0NCn0NCg0KDQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRG93bmxvYWRQcm9jZXNzL0Rvd25sb2FkUHJvY2Vzcy5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBURG93bmxvYWRQcm9jZXNzIGV4dGVuZHMgVFByb2Nlc3MKewogICAgdmFyICRuYW1lID0gIkRvd25sb2FkUHJvY2VzcyI7CiAgICAKICAgIHZhciAkbGVuZ3RoID0gYXJyYXkoKTsKICAgIHZhciAkaGVhZGVycyA9IGFycmF5KCk7CiAgICB2YXIgJHVybHMgPSBhcnJheSgpOwogICAgdmFyICRmaWxlcyA9IGFycmF5KCk7CiAgICB2YXIgJHByb2dyZXNzSW5kZXggPSAwOwogICAgdmFyICRieXRlcyA9IGFycmF5KCk7CiAgICB2YXIgJG9mZnNldCA9IGFycmF5KCk7CiAgICB2YXIgJHRvdGFsT2Zmc2V0ID0gMDsKICAgIHZhciAkdG90YWxMZW5ndGggPSAwOwogICAgCiAgICAvKgogICAgZnVuY3Rpb24gcnVuKCkKICAgIHsKICAgICAgICBwYXJlbnQ6OnJ1bigpOwogICAgICAgIAogICAgICAgIC8vIFRPRE8KICAgICAgICAkdGhpcy0+cmVzdW1lKCk7CgogICAgICAgIHByb2Nlc3NQcm9ncmVzcygxMDApOwogICAgICAgIHBhcmVudDo6ZmluaXNoKCk7CiAgICB9CiAgICAqLwogICAgCiAgICBmdW5jdGlvbiByZXN1bWUoKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJHRoaXMtPnBhcmFtc1sidXJsIl0pKQogICAgICAgICAgICAkdGhpcy0+cGFyYW1zWyJ1cmwiXSA9IGFycmF5KCR0aGlzLT5wYXJhbXNbInVybCJdKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCR0aGlzLT5wYXJhbXNbImZpbGUiXSkpCiAgICAgICAgICAgICR0aGlzLT5wYXJhbXNbImZpbGUiXSA9IGFycmF5KCR0aGlzLT5wYXJhbXNbImZpbGUiXSk7CiAgICAgICAgCiAgICAgICAgLy8gISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCiAgICAgICAgLy8gcG9rdWQgYnVkZSBibGJub3V0IHN0YWhvdmFuaSAtIGJ1ZGUgcG90cmViYSBtZXJpdCBpIGNhcyBzdGFob3ZhbmksIHpwcnVtZXJvdmF0IGEgZG8gcmVzdW1lTmVlZGVkIHpvaGxlZG5pdCB0ZW50byBjYXMKICAgICAgICAvLyBwcmlsaXMgdmVsa3kgYnVmZmVyIGplIG5hIHNrb2R1LCBwcm90b3plIG11emUgZG9qaXQgayB0aW1lb3V0IGJlaGVtIG5hY2l0YW5pIHUgcG9tYWxlaG8gc3BvamVuaQoKICAgICAgICAkdGhpcy0+c2lnbmFsKCk7CgogICAgICAgIC8vJHRoaXMtPmJ1ZmZlclNpemUgPSAxMDI0KjEwMjQ7CiAgICAgICAgLy8kdGhpcy0+YnVmZmVyU2l6ZSA9IDEyOCoxMDI0OyAvLzEwMjQqMTAyNDsgLy8gMU1CCiAgICAgICAgJHRoaXMtPmJ1ZmZlclNpemUgPSAyKjEwMjQqMTAyNDsgIC8vIDJNQgogICAgICAgIC8vJHRoaXMtPmJ1ZmZlclNpemUgPSAzOwogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnBhcmFtc1sidXJsIl0pOwogICAgICAgIC8vZXhpdDsKICAgICAgICBmb3IoJGkgPSAkdGhpcy0+cHJvZ3Jlc3NJbmRleCA7ICRpIDwgY291bnQoJHRoaXMtPnBhcmFtc1sidXJsIl0pIDsgJGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmhlYWRlcnNMb2FkZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnBhcmFtc1sidXJsIl0pOyBleGl0OwogICAgICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+cGFyYW1zWyJ1cmwiXSBhcyAka2V5ID0+ICR1cmwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+dXJsc1ska2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQoIkRvd25sb2FkaW5nIGZpbGUgaW5mbyBmb3IgZmlsZSAjIi4oJGtleSsxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT51cmxzWyRrZXldID0gJHVybDsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhlYWRlcnNbJGtleV0gPSBkb3dubG9hZCgkdXJsLCBhcnJheSgpLCBhcnJheSgpLCBhcnJheSgiaGVhZGVyc09ubHkiPT50cnVlLCJoZWFkZXJzQXNBcnJheSI9PnRydWUsImxvZyI9PmZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmhlYWRlcnNbJGtleV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJURG93bmxvYWRQcm9jZXNzIC0gY2Fubm90IGRvd25sb2FkIGZpbGUgaGVhZGVycyBmb3IgIi4kdXJsLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5oZWFkZXJzKTsgZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxlbmd0aFska2V5XSA9ICR0aGlzLT5oZWFkZXJzWyRrZXldWyJDb250ZW50LUxlbmd0aCJdOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dG90YWxMZW5ndGggKz0gKGludCkkdGhpcy0+bGVuZ3RoWyRrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGltZSA9IHRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm9mZnNldFska2V5XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ieXRlc1ska2V5XSA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5sZW5ndGhbJGtleV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJvY2Vzc0Vycm9yKCJVbmFibGUgdG8gZG93bmxvYWQgZmlsZSBpbmZvIGZyb20gJyIuJHVybC4iJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiVW5hYmxlIHRvIGRvd25sb2FkIGZpbGUgaW5mbyBmcm9tICciLiR1cmwuIic8YnIgLz4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZXNbJGtleV0gPSAkdGhpcy0+cGFyYW1zWyJmaWxlIl1bJGtleV0gPyAkdGhpcy0+cGFyYW1zWyJmaWxlIl1bJGtleV0gOiBQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wLyIuYmFzZW5hbWUoJHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vJHRoaXMtPnRvRmlsZU5hbWUgPSAoJHRoaXMtPnBhcmFtc1siZmlsZSJdID8gJHRoaXMtPnBhcmFtc1siZmlsZSJdIDogUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvdGVtcC8iLmJhc2VuYW1lKCR0aGlzLT5wYXJhbXNbInVybCJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmhlYWRlcnNbJGtleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5sZW5ndGhbJGtleV0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+cmVzdW1lTmVlZGVkKCkpOyBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bWVOZWVkZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJBIjsgZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZXN1bWVJbkJhY2tncm91bmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5oZWFkZXJzTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vZWNobyAiQiI7IGV4aXQ7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVzdW1lSW5CYWNrZ3JvdW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+aGVhZGVycyk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+bGVuZ3RoKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dXJsc1skdGhpcy0+cHJvZ3Jlc3NJbmRleF0pOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkYnl0ZXNSZWFkZWQgPSAwOwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+b2Zmc2V0WyR0aGlzLT5wcm9ncmVzc0luZGV4XSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJHRoaXMtPmZpbGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdKQogICAgICAgICAgICAgICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSwgIiIsIDA3NzcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGYgPSBmb3BlbigkdGhpcy0+ZmlsZXNbJHRoaXMtPnByb2dyZXNzSW5kZXhdLCAiYSIpOwogICAgICAgICAgICAgICAgLy9lY2hvICR0aGlzLT5maWxlc1skdGhpcy0+cHJvZ3Jlc3NJbmRleF07IGV4aXQ7CiAgICAgICAgICAgICAgICBpZiAoISRmKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVjaG8gIkRvd25sb2FkUHJvY2VzcyAtIGNhbm5vdCBjcmVhdGUgZmlsZSI7IAogICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vJHh4ID0gMDsKICAgICAgICAgICAgICAgIC8vZWNobyAieCI7IGV4aXQ7CiAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vJGJ1ZmZlciA9IGRvd25sb2FkKCJodHRwOi8vY29yZTIudmlzdWFsLXBocC5jb20vc2NyaXB0cy5waHA/dGlkPWRvd25sb2FkJm9mZnNldD0iLiR0aGlzLT5wYXJhbXNbIm9mZnNldCJdLiImbGVuZ3RoPSIuJHRoaXMtPnBhcmFtc1sibGVuZ3RoIl0pOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPm9mZnNldFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICRyZWFkRnJvbSA9ICR0aGlzLT5vZmZzZXRbJHRoaXMtPnByb2dyZXNzSW5kZXhdOwogICAgICAgICAgICAgICAgICAgICRyZWFkVG8gPSAoJHRoaXMtPm9mZnNldFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0rJHRoaXMtPmJ1ZmZlclNpemUtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZWFkVG8gPj0gJHRoaXMtPmxlbmd0aFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0tMSkKICAgICAgICAgICAgICAgICAgICAgICAgJHJlYWRUbyA9ICR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy9lY2hvICR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdLiIgLyAiLiRyZWFkRnJvbS4iLSIuJHJlYWRUbzsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT51cmxzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChhcnJheSgicmFuZ2UiPT4kcmVhZEZyb20uIi0iLiRyZWFkVG8pKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdKTsgZXhpdDsKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyID0gZG93bmxvYWQoJHRoaXMtPnVybHNbJHRoaXMtPnByb2dyZXNzSW5kZXhdLCBhcnJheSgpLCBhcnJheSgpLCBhcnJheSgicmFuZ2UiPT4kcmVhZEZyb20uIi0iLiRyZWFkVG8sImxvZyI9PmZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgLy9fZmlsZV9hcHBlbmRfY29udGVudHMoUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvdGVtcC9Eb3dubG9hZFByb2Nlc3Mub3V0IiwgZGF0ZSgiWS1tLWQgSDppOnMiKS4iOiAiLiJyYW5nZT0iLiRyZWFkRnJvbS4iLSIuJHJlYWRUby4iXG4iKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGFycmF5KCJyYW5nZSI9PiRyZWFkRnJvbS4iLSIuJHJlYWRUbykpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgLy9lY2hvICRidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oJGJ1ZmZlcikgIT0gKCRyZWFkVG8tJHJlYWRGcm9tKzEpKSAgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoImJ1ZmZlciBkaWZmZXJlbnQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiQnVmZmVyIGRpZmZlcmVudCI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCR0aGlzLT51cmxzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIlJhbmdlOiAiOyAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHJlYWRGcm9tLiItIi4kcmVhZFRvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoc3RybGVuKCRidWZmZXIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoKCRyZWFkVG8tJHJlYWRGcm9tKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCRyZWFkRnJvbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxociAvPiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ5dGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSArPSBzdHJsZW4oJGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUoKSA+ICR0aGlzLT50aW1lKzEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3NQcm9ncmVzcygkdGhpcy0+dG90YWxPZmZzZXQqMTAwLyR0aGlzLT50b3RhbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3VuZCgkdGhpcy0+Ynl0ZXNbJHRoaXMtPnByb2dyZXNzSW5kZXhdLzIvMTAyNCkgPj0gMTAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQocm91bmQoJHRoaXMtPmJ5dGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XS8yLzEwMjQvMTAyNCwgMikuIk1CL3MgKCIucm91bmQoJHRoaXMtPm9mZnNldFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0vMTAyNC8xMDI0KS4iTUIgIi50cmFuc2xhdGUoIm9mIikuIiAiLmNlaWwoJHRoaXMtPmxlbmd0aFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0vMTAyNC8xMDI0KS4iTUIpIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQocm91bmQoJHRoaXMtPmJ5dGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XS8yLzEwMjQpLiJrQi9zICgiLnJvdW5kKCR0aGlzLT5vZmZzZXRbJHRoaXMtPnByb2dyZXNzSW5kZXhdLzEwMjQvMTAyNCkuIk1CICIudHJhbnNsYXRlKCJvZiIpLiIgIi5jZWlsKCR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdLzEwMjQvMTAyNCkuIk1CKSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ5dGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSA9ICR0aGlzLT5ieXRlc1skdGhpcy0+cHJvZ3Jlc3NJbmRleF0vMjsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRpbWUgPSB0aW1lKCktMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKCR0aGlzLT50b3RhbE9mZnNldCoxMDAvJHRoaXMtPnRvdGFsTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAvLyRidWZmZXIgPSBkb3dubG9hZCgiaHR0cDovL3d3dy5zZXpuYW0uY3oiLCBhcnJheSgpLCBhcnJheSgpLCBhcnJheSgpKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRidWZmZXIpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRyZXQgPSBmd3JpdGUoJGYsICRidWZmZXIpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmV0ID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJURG93bmxvYWRQcm9jZXNzIC0gdW5hYmxlIHRvIHdyaXRlIGRhdGEgLSByZXR1cm5lZCBGQUxTRSIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRyZXQgIT0gc3RybGVuKCRkYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJURG93bmxvYWRQcm9jZXNzIC0gdW5hYmxlIHRvIHdyaXRlIGRhdGEgLSB3cml0dGVuIGxlc3MgdGhhbiBleHBlY3RlZCIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5vZmZzZXRbJHRoaXMtPnByb2dyZXNzSW5kZXhdICs9IHN0cmxlbigkYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAvL19maWxlX2FwcGVuZF9jb250ZW50cyhQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wL0Rvd25sb2FkUHJvY2Vzcy5vdXQiLCAicmVhZGVkPSIuc3RybGVuKCRidWZmZXIpLiJcbiIpOwogICAgICAgICAgICAgICAgICAgIC8vX2ZpbGVfYXBwZW5kX2NvbnRlbnRzKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAvRG93bmxvYWRQcm9jZXNzLm91dCIsICJuZXh0T2Zmc2V0PSIuJHRoaXMtPm9mZnNldFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0uIlxuIik7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRvdGFsT2Zmc2V0ICs9IHN0cmxlbigkYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3NQcm9ncmVzc1RleHQoJHJlYWRGcm9tLiItIi4kcmVhZFRvLiIvIi5zdHJsZW4oJGJ1ZmZlcikpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoJHh4ID09IDMpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5ieXRlc1skdGhpcy0+cHJvZ3Jlc3NJbmRleF0gPT0gJHRoaXMtPmxlbmd0aFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBpZiAoKCRyZWFkVG8pID49ICR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT51cmxzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChhcnJheSgicmFuZ2UiPT4kcmVhZEZyb20uIi0iLiRyZWFkVG8pKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5ieXRlc1skdGhpcy0+cHJvZ3Jlc3NJbmRleF0pOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zbGVlcCgwLjUpOwogICAgICAgICAgICAgICAgICAgIC8vJHRoaXMtPnNsZWVwKDAuMik7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvYyB0cnVlPyAKICAgICAgICAgICAgICAgICAgICBpZiAoLyp0cnVlIHx8ICovJHRoaXMtPnJlc3VtZU5lZWRlZCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVzdW1lSW5CYWNrZ3JvdW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyR4eCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmNsb3NlKCRmKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9wcm9jZXNzUHJvZ3Jlc3NUZXh0KCJEb3dubG9hZCBmaW5pc2hlZDogPGEgaHJlZj0nIi5nZXRVcmxGcm9tUGF0aCgkdGhpcy0+dG9GaWxlTmFtZSkuIic+Ii5iYXNlbmFtZSgkdGhpcy0+dG9GaWxlTmFtZSkuIjwvYT4iKTsKICAgICAgICAgICAgICAgIGlmIChfZmlsZXNpemUoJHRoaXMtPmZpbGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSkgIT0gJHRoaXMtPmxlbmd0aFskdGhpcy0+cHJvZ3Jlc3NJbmRleF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkRvd25sb2FkUHJvY2VzczogZG93bmxvYWRlZCBmaWxlIHNpemUgb2YgJyIuJHRoaXMtPmZpbGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XS4iJyBkb2VzIG5vdCBtYXRjaCAoIi5fZmlsZXNpemUoJHRoaXMtPmZpbGVzWyR0aGlzLT5wcm9ncmVzc0luZGV4XSkuIiAhPSAiLiR0aGlzLT5sZW5ndGhbJHRoaXMtPnByb2dyZXNzSW5kZXhdLiIpIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQoIkZpbGUgbm90IGZvdW5kIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5wcm9ncmVzc0luZGV4Kys7CiAgICAgICAgfQoKICAgICAgICAvL2VjaG8gIkZJTklTSD8/PyI7IGV4aXQ7CiAgICAgICAgCiAgICAgICAgcHJvY2Vzc1Byb2dyZXNzVGV4dCh0cmFuc2xhdGUoIkRvd25sb2FkIGZpbmlzaGVkIikpOwogICAgICAgIHByb2Nlc3NQcm9ncmVzcygxMDApOwogICAgICAgIAogICAgICAgICR0aGlzLT5maW5pc2goKTsKICAgIH0KfQoKCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSW5zdGFsbFByb2Nlc3MvSW5zdGFsbFByb2Nlc3MuY2xhc3MucGhwIC0tLS0tLS0gDQoKZGVmaW5lKCJFTVBUWV9QUk9KRUNUX01PRFVMRV9QQUNLQUdFIiwgIjYxMzA3NjBiLTg4NWYtNDczOC1hZWIzLWJjZTA5OThmOTNlMiIpOwpkZWZpbmUoIk1VTFRJTEFOR1VBR0VfTU9EVUxFX1BBQ0tBR0UiLCAiMmM4OWQ0YTUtYWQ2Yy00Zjg5LWEzYmQtMTcyY2MyNjFhOGRiIik7CmRlZmluZSgiQ09SRV9NT0RVTEVfUEFDS0FHRSIsICIxYzFkYjIzZi1iNWM1LTQwY2QtYjJjMi02N2E5MGM0YWQ3YzAiKTsKY2xhc3MgVEluc3RhbGxQcm9jZXNzIGV4dGVuZHMgVFByb2Nlc3MKewogICAgdmFyICRuYW1lID0gIkluc3RhbGxQcm9jZXNzIjsKICAgIHZhciAkaW5zdGFsbEZpbGVJbmRleCA9IDA7CiAgICB2YXIgJGlnbm9yZWRTZXJpYWxpemVQcm9wZXJ0aWVzID0gYXJyYXkoIkRiTGluayIpOwogICAgdmFyICRkZWZhdWx0SWdub3JlZEZpbGVzID0gYXJyYXkoCiAgICAgICAgIi9fX3RtcC8iLAogICAgICAgICIvY2FjaGUvIiwKICAgICAgICAiL2ltZy8iLAogICAgICAgICIvaW5zdGFsbC8iLAogICAgICAgICIvaW5zdGFsbC5waHAiLAogICAgICAgICIvcmVwb3NpdG9yeS9wcm9jZXNzZXMvIiwKICAgICAgICAiL3JlcG9zaXRvcnkvc3lzdGVtX2xvZy8iLAogICAgICAgICIvcmVwb3NpdG9yeS9icm93c2VyX2xvZy8iLAogICAgICAgICIvLndlbGwta25vd24vIiwKICAgICk7CiAgICAKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICAgICAgJHRoaXMtPnByb2dyZXNzVGltZW91dCA9IDE7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFZlcnNpb24oKQogICAgewogICAgICAgICRNb2R1bGUgPSBnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0TW9kdWxlQnlOYW1lKCJJbnN0YWxsUHJvY2VzcyIpOwoKICAgICAgICByZXR1cm4oJE1vZHVsZS0+dmVyc2lvbik7CiAgICB9CgogICAgLyoKICAgIGZ1bmN0aW9uIHJ1bigpCiAgICB7CiAgICAgICAgcGFyZW50OjpydW4oKTsKICAgICAgICAKICAgICAgICAvLyBUT0RPCiAgICAgICAgJHRoaXMtPnJlc3VtZSgpOwogICAgICAgIAogICAgICAgIHByb2Nlc3NQcm9ncmVzcygxMDApOwogICAgICAgIHBhcmVudDo6ZmluaXNoKCk7CiAgICB9CiAgICAqLwogICAgCiAgICBmdW5jdGlvbiByZXN1bWUoKQogICAgewogICAgICAgIC8vZ2xvYmFsICRfX3NjcmlwdFN0YXJ0VGltZTsKICAgICAgICAvL2VjaG8gZGF0ZSgiWS1tLWQgSDppOnMiLCAkX19zY3JpcHRTdGFydFRpbWUpLiI8YnI+IjsKICAgICAgICAvL2VjaG8gZGF0ZSgiWS1tLWQgSDppOnMiKS4iPGJyPiI7CiAgICAgICAgLy9lY2hvIDE7CiAgICAgICAgLy9leGl0OwogICAgICAgIHBhcmVudDo6cmVzdW1lKCk7CiAgICAgICAgCiAgICAgICAgLy9wcm9jZXNzTWVzc2FnZSgiUmVzdW1pbmcuLi4iKTsKICAgICAgICAvL19maWxlX2FwcGVuZF9jb250ZW50cyhQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wL3Byb2Nlc3Mub3V0IiwgZ2V0X2NsYXNzKCR0aGlzKS4iOiByZXN1bWUoKSIuIlxyXG4iKTsKICAgICAgICAkdGhpcy0+c2lnbmFsKCk7CiAgICAgICAgCiAgICAgICAgaWYgKCFkZWZpbmVkKCJfUFJPSkVDVFBBVEgiKSkKICAgICAgICAgICAgZGVmaW5lKCJfUFJPSkVDVFBBVEgiLCBQUk9KRUNUUEFUSCk7CiAgICAgICAgICAgIAogICAgICAgIGRlZmluZSgiSU5TVEFMTFBST0NFU1MiLCB0cnVlKTsgLy8gZm9yIG9uQ2hhbmdlIGV2ZW50IHRvIG5vdCB1cGRhdGUgTW9kdWxlIHZlcnNpb24gdXBkYXRlcwogICAgICAgIGlmICghZGVmaW5lZCgiSU5TVEFMTFBST0NFU1NWRVJTSU9OIikpCiAgICAgICAgICAgIGRlZmluZSgiSU5TVEFMTFBST0NFU1NWRVJTSU9OIiwgZ2V0T2JqZWN0KCJJbnN0YWxsUHJvY2VzcyIpLT5nZXRWZXJzaW9uKCkpOwoKICAgICAgICAvL2dsb2JhbCAkX0ZJTEVfRk9SQ0VfRlRQOwogICAgICAgIGlmICgkX0ZJTEVfRk9SQ0VfRlRQID09PSBOVUxMKQogICAgICAgICAgICAkX0ZJTEVfRk9SQ0VfRlRQID0gdHJ1ZTsgLy8gZHVlIHRvIC5waHAgZmlsZXMKICAgICAgICBpZiAoJF9ESVJfRk9SQ0VfRlRQID09PSBOVUxMKQogICAgICAgICAgICAkX0RJUl9GT1JDRV9GVFAgPSB0cnVlOyAvLyBkdWUgdG8gLnBocCBmaWxlcwogICAgICAgIAogICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0VW5wYWNrUHJvamVjdCIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RycG9zKERPTUFJTiwgImNvcmUyLiIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICJDYW5ub3QgaW5zdGFsbCBhbnl0aGluZyBvbiBDT1JFMiB3ZWIiOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkdGhpcy0+cGFyYW1zWyJpbnN0YWxsRmlsZSJdKSkKICAgICAgICAgICAgICAgICR0aGlzLT5wYXJhbXNbImluc3RhbGxGaWxlIl0gPSBhcnJheSgkdGhpcy0+cGFyYW1zWyJpbnN0YWxsRmlsZSJdKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5yZXN1bWVVbnBhY2tQcm9qZWN0KCk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0UGFja1Byb2plY3QiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcyhET01BSU4sICJjb3JlMi4iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiQ2Fubm90IHBhY2sgQ09SRTIgd2ViIjsKICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5yZXN1bWVQYWNrUHJvamVjdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFBhY2tNb2R1bGUiKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnJlc3VtZVBhY2tNb2R1bGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRVbnBhY2tNb2R1bGUiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEZBTFNFICYmIHN0cnBvcyhET01BSU4sICJjb3JlMi4iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiQ2Fubm90IGluc3RhbGwgYW55dGhpbmcgb24gQ09SRTIgd2ViIjsKICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnBhcmFtc1siaW5zdGFsbEZpbGUiXSk7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJHRoaXMtPnBhcmFtc1siaW5zdGFsbEZpbGUiXSkpCiAgICAgICAgICAgICAgICAkdGhpcy0+cGFyYW1zWyJpbnN0YWxsRmlsZSJdID0gYXJyYXkoJHRoaXMtPnBhcmFtc1siaW5zdGFsbEZpbGUiXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+cGFyYW1zWyJwYXRoIl0gPSBQUk9KRUNUUEFUSDsKICAgICAgICAgICAgJHRoaXMtPnBhcmFtc1siaW5zdGFsbE1ldGhvZCJdID0gImZ0cCI7IC8vIGplIHRvIGplc3RlIHZ1YmVjIHBvdHJlYmE/IAogICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5wYXJhbXNbImluc3RhbGxGaWxlIl0pOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+cmVzdW1lVW5wYWNrUHJvamVjdCgpOyAvLyAhISBwcm9qZWN0IGlzIE9LIGhlcmUKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRSZW1vdmVNb2R1bGUiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cnBvcyhET01BSU4sICJjb3JlMi4iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiQ2Fubm90IHVuaW5zdGFsbCBhbnl0aGluZyBvbiBDT1JFMiB3ZWIiOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPnJlc3VtZVJlbW92ZU1vZHVsZSgpOyAvLyAhISBwcm9qZWN0IGlzIE9LIGhlcmUKICAgICAgICB9ICAgCiAgICAgICAgCiAgICAgICAgLy9lY2hvICJGRiI7CiAgICAgICAgJHRoaXMtPmZpbmlzaCgpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiByZWFkTGVuZ3RoKCRmKQogICAgewogICAgICAgICRsZW5ndGggPSAiIjsKICAgICAgICAkeCA9IDA7CiAgICAgICAgd2hpbGUodHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRzID0gZnJlYWQoJGYsIDEpOwogICAgICAgICAgICAvKgogICAgICAgICAgICBpZigkdGhpcy0+dG9rZW5bIm5hbWUiXSA9PSAiL2NvcmUvY2xhc3Nlcy9fbmV3L0luc3RhbGwvaW5zdGFsbC5waHAiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXJfZHVtcCgkcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKCRzID09ICJ8IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJGxlbmd0aCAuPSAkczsKICAgICAgICAKICAgICAgICAgICAgJHgrKzsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkeCA+IDIwMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiVEluc3RhbGxQcm9jZXNzOjpyZWFkTGVuZ3RoKCkgbG9vcC4iOwogICAgICAgICAgICAgICAgLy9lY2hvIGdldEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgICAgICAgICAgJHRoaXMtPm9uUmVhZExlbmd0aExvb3AoKTsKICAgICAgICAgICAgICAgIGVjaG8gIjxocj4iOwogICAgICAgICAgICAgICAgdmFyX2R1bXAoJHRoaXMtPmluc3RhbGxGaWxlKTsKICAgICAgICAgICAgICAgIHZhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICB2YXJfZHVtcChmdGVsbCgkZikpOwogICAgICAgICAgICAgICAgdmFyX2R1bXAoJGxlbmd0aCk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRsZW5ndGgyID0gJGxlbmd0aDsKICAgICAgICBzZXR0eXBlKCRsZW5ndGgyLCAiaW50ZWdlciIpOwogICAgICAgIGlmIChzdHJsZW4oJGxlbmd0aCkgIT0gc3RybGVuKCRsZW5ndGgyKSkKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gInJlYWRMZW5ndGgoKSBOT1QgQSBOVU1CRVIhIjsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRsZW5ndGgyKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcmVhZEFycmF5KCRmLCAkbGVuZ3RoKQogICAgewogICAgICAgIGlmICgkbGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgJHNEYXRhID0gZnJlYWQoJGYsICRsZW5ndGgpOwogICAgICAgICAgICAkdGhpcy0+bGFzdFRva2VuUyA9ICRzRGF0YTsKICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+anNvbkRlY29kZSgkc0RhdGEpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKEZBTFNFICYmICFpc19hcnJheSgkZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVjaG8gIkNPVUxEIE5PVCBSRUFEIFRPS0VOOjxiciAvPiI7CiAgICAgICAgICAgICAgICB2YXJfZHVtcCgkc0RhdGEpOwogICAgICAgICAgICAgICAgZWNobyAiPGhyIC8+IjsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgICRkYXRhID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJGRhdGEpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiByZWFkSW5mbygkZikKICAgIHsKICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnJlYWRMZW5ndGgoJGYpOwogICAgICAgICRpbmZvID0gJHRoaXMtPnJlYWRBcnJheSgkZiwgJGxlbmd0aCk7CgogICAgICAgIHJldHVybigkaW5mbyk7CiAgICB9CgogICAgZnVuY3Rpb24gb25SZWFkTGVuZ3RoTG9vcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5iYWNrdXBGaWxlTmFtZSAmJiBfZmlsZV9leGlzdHMoJHRoaXMtPmJhY2t1cEZpbGVOYW1lLiIuYmFja3VwIikpCiAgICAgICAgewogICAgICAgICAgICBfcmVuYW1lKCR0aGlzLT5iYWNrdXBGaWxlTmFtZS4iLmJhY2t1cCIsICR0aGlzLT5iYWNrdXBGaWxlTmFtZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlc3VtZVVucGFja1Byb2plY3QoKSAvLyBzdGVqbmUgcHJvIG1vZHVsIGkgcHJvamVrdAogICAgewogICAgICAgIC8vdmFyX2R1bXAoIi0tLS0tLS0tLXJlc3VtZS0tLS0tLS0tLSIpOwogICAgICAgIGlmICghJHRoaXMtPmluc3RhbGxGaWxlcykKICAgICAgICB7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnBhcmFtc1siaW5zdGFsbEZpbGUiXSk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+cGFyYW1zWyJpbnN0YWxsRmlsZSJdIGFzICRrZXkgPT4gJGZpbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWxlID0gZmluZEZpbGUoJGZpbGUpOwogICAgICAgICAgICAgICAgaWYgKCRmaWxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbnN0YWxsRmlsZXNbXSA9ICRmaWxlOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT50b3RhbExlbmd0aCArPSBfZmlsZXNpemUoJGZpbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT50b3RhbEluZGV4ID0gMDsKICAgICAgICAgICAgJHRoaXMtPmluZGV4ID0gMDsKICAgICAgICAgICAgJHRoaXMtPnBhdGggPSBjbGVhbkxpbmsoJHRoaXMtPnBhcmFtc1sicGF0aCJdLiIvIik7CiAgICAgICAgICAgIC8vcHJvY2Vzc0Vycm9yKCIhIiskdGhpcy0+dG90YWxMZW5ndGgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKCRpID0gJHRoaXMtPmluc3RhbGxGaWxlSW5kZXggOyAkaSA8IGNvdW50KCR0aGlzLT5pbnN0YWxsRmlsZXMpIDsgJGkrKykKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5pbnN0YWxsRmlsZSA9ICR0aGlzLT5pbnN0YWxsRmlsZXNbJHRoaXMtPmluc3RhbGxGaWxlSW5kZXhdOwogICAgICAgICAgICAkdGhpcy0+bGVuZ3RoID0gX2ZpbGVzaXplKCR0aGlzLT5pbnN0YWxsRmlsZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkZiA9IGZvcGVuKCR0aGlzLT5pbnN0YWxsRmlsZSwgInIiKTsKICAgICAgICAgICAgZnNlZWsoJGYsICR0aGlzLT5pbmRleCwgU0VFS19TRVQpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+aGVhZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IGZyZWFkKCRmLCA1MCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5kZXggPSAwOwogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGNvbnRlbnQsICJGaWxlIG5vdCBmb3VuZCIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmc2VlaygkZiwgJHRoaXMtPmluZGV4LCBTRUVLX1NFVCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR0aGlzLT5oZWFkZXIgPSAkdGhpcy0+cmVhZEluZm8oJGYpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+aGVhZGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRVbnBhY2tNb2R1bGUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PbGRNb2R1bGUgPSBnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0TW9kdWxlKCR0aGlzLT5oZWFkZXJbImlkIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkSW5zdGFsbFZlcnNpb24gPSBjcmVhdGVPYmplY3QoIlZlcnNpb24iKTsKICAgICAgICAgICAgICAgICRJbnN0YWxsVmVyc2lvbi0+c2V0VmFsdWUoSU5TVEFMTFBST0NFU1NWRVJTSU9OKTsKICAgICAgICAgICAgICAgICRGaWxlVmVyc2lvbiA9IGNyZWF0ZU9iamVjdCgiVmVyc2lvbiIpOwogICAgICAgICAgICAgICAgJEZpbGVWZXJzaW9uLT5zZXRWYWx1ZSgkdGhpcy0+aGVhZGVyWyJpbnN0YWxsVmVyc2lvbiJdKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5oZWFkZXJbImlkIl0gIT0gQ09SRV9NT0RVTEVfUEFDS0FHRSAmJiAkSW5zdGFsbFZlcnNpb24tPmFzTnVtYmVyKCkgPiAwICYmICRGaWxlVmVyc2lvbi0+YXNOdW1iZXIoKSA+ICRJbnN0YWxsVmVyc2lvbi0+YXNOdW1iZXIoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICJJbnN0YWxsIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIG5ld2VyIHZlcnNpb24gb2YgaW5zdGFsbGVyLiBQbGVhc2UgdXBkYXRlIENvcmUgbW9kdWxlIGZpcnN0IjsKICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvL2VjaG8gIngiOyBleGl0OwogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGlmICghJHRoaXMtPmhlYWRlclsibGFuZ3VhZ2UiXSAmJiBJTlNUQUxMICE9PSB0cnVlICYmICEkdGhpcy0+cHJlVXBkYXRlc0V4ZWN1dGVkIC8qJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja01vZHVsZSIqLykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbGVkIHRvIGVuYWJsZSBnZXREZWZhdWx0RGJMaW5rKCkKICAgICAgICAgICAgICAgICR0aGlzLT5nZXREYkxpbmsoKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmdldERiTGluaygpKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZ2V0RGVmYXVsdERiTGluaygpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJG1vZHVsZVBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHRoaXMtPmhlYWRlclsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgJE9sZFZlcnNpb24gPSBjcmVhdGVPYmplY3QoIlZlcnNpb24iKTsKICAgICAgICAgICAgICAgICRWZXJzaW9uID0gY3JlYXRlT2JqZWN0KCJWZXJzaW9uIik7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk9sZE1vZHVsZSkKICAgICAgICAgICAgICAgICAgICAkT2xkVmVyc2lvbi0+c2V0VmFsdWUoJHRoaXMtPk9sZE1vZHVsZS0+dmVyc2lvbik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvcmVhY2goJG1vZHVsZVBhcmFtc1sidXBkYXRlcyJdIGFzICRtb2R1bGVQYXJhbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdID09ICJwcmUtaW5zdGFsbCIgfHwgKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdID09ICJwcmUtbW92ZSIgJiYgJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja1Byb2plY3QiKSB8fCAkdGhpcy0+T2xkTW9kdWxlICYmICRtb2R1bGVQYXJhbVsidmVyc2lvbiJdID09ICJwcmUtdXBkYXRlIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdID09ICJ1cGRhdGUiKQogICAgICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk9sZE1vZHVsZSAmJiBzdHJwb3MoJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0sICIuIikgIT09IEZBTFNFICYmIHN0cnBvcygkbW9kdWxlUGFyYW1bInZlcnNpb24iXSwgIjpiZWZvcmUiKSAhPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkVmVyc2lvbi0+c2V0VmFsdWUoc3RyX3JlcGxhY2UoIjpiZWZvcmUiLCAiIiwgJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRWZXJzaW9uLT5hc051bWJlcigpID4gJE9sZFZlcnNpb24tPmFzTnVtYmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPk9sZE1vZHVsZSAmJiBzdHJwb3MoJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0sICJ1cGRhdGUiKSAhPT0gRkFMU0UgJiYgc3RycG9zKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdLCAiOmJlZm9yZSIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRkb0luc3RhbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoJGRvSW5zdGFsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ydW5VcGRhdGVzKCRtb2R1bGVQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJlVXBkYXRlc0V4ZWN1dGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgIC8vJHRoaXMtPk9sZE1vZHVsZSA9IGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRNb2R1bGUoJHRoaXMtPmhlYWRlclsiaWQiXSk7CiAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgd2hpbGUodHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+dG9rZW4pCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRva2VuID0gJHRoaXMtPnJlYWRJbmZvKCRmKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkdGhpcy0+dG9rZW4pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJCYWQgVG9rZW46IGZpbGUgaW5kZXggIi4kdGhpcy0+aW5kZXguIiBcIiIuJHRoaXMtPmxhc3RUb2tlblMuIlwiIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQoJHRoaXMtPnRva2VuWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKCR0aGlzLT50b3RhbEluZGV4KjEwMC8kdGhpcy0+dG90YWxMZW5ndGgpOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50b2tlblsidHlwZSJdID09ICJlbmQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmhlYWRlclsiY29tYmluZWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkdGhpcy0+dG9rZW5bInR5cGUiXSA9PSAiZW5kY29tYmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPnRva2VuWyJ0eXBlIl0gPT0gImRpciIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGRpck5hbWUgPSAkdGhpcy0+cGF0aC4kdGhpcy0+dG9rZW5bIm5hbWUiXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRkaXJOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgX21rZGlyKCRkaXJOYW1lLCAoaW50KSR0aGlzLT50b2tlblsibW9kIl0pOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgX2NobW9kKCRkaXJOYW1lLCAoaW50KSR0aGlzLT50b2tlblsibW9kIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPnRva2VuWyJ0eXBlIl0gPT0gImZpbGUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZmlsZVNpemUgPT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCR0aGlzLT5wYXJhbXNbImluc3RhbGxNZXRob2QiXSA9PSAiZnRwIikgLy8gZm9yIGRlYnVnCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICR0aGlzLT5maWxlTmFtZSA9ICR0aGlzLT5wYXRoLiJfX3RtcC8iLmJhc2VuYW1lKCR0aGlzLT50b2tlblsibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImluc3RhbGxNZXRob2QiXSA9PSAiZnRwIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlTmFtZSA9IGNsZWFuTGluaygkdGhpcy0+cGF0aC4kdGhpcy0+dG9rZW5bIm5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT5wYXJhbXNbImluc3RhbGxNZXRob2QiXSA9PSAiY29weSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZU5hbWUgPSBjbGVhbkxpbmsoJHRoaXMtPnBhdGguJHRoaXMtPnRva2VuWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIkZBVEFMIC0gbm8gaW5zdGFsVHlwZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2lmICghZmlsZV9leGlzdHMoZGlybmFtZSgkdGhpcy0+ZmlsZU5hbWUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgX21rZGlyKGRpcm5hbWUoJHRoaXMtPmZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG91Y2goJHRoaXMtPmZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQHVubGluaygkdGhpcy0+ZmlsZU5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3VwIE9MRAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2ZpbGVfZXhpc3RzKCR0aGlzLT5maWxlTmFtZSkgJiYgKHN0cnRvbG93ZXIoZ2V0RmlsZUV4dCgkdGhpcy0+ZmlsZU5hbWUpKSA9PSAicGhwIiB8fCBzdHJ0b2xvd2VyKGdldEZpbGVFeHQoJHRoaXMtPmZpbGVOYW1lKSkgPT0gImpzIiB8fCBzdHJ0b2xvd2VyKGdldEZpbGVFeHQoJHRoaXMtPmZpbGVOYW1lKSkgPT0gImNzcyIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YmFja3VwRmlsZU5hbWUgPSAkdGhpcy0+ZmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVuYW1lKCR0aGlzLT5iYWNrdXBGaWxlTmFtZSwgJHRoaXMtPmJhY2t1cEZpbGVOYW1lLiIuYmFja3VwIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb3B5CiAgICAgICAgICAgICAgICAgICAgICAgIC8vX2ZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlTmFtZSwgIiIsIChnZXRGaWxlRXh0KCR0aGlzLT5maWxlTmFtZSkgPT0gInBocCIgPyBDSE1PRF9QSFAgOiBDSE1PRF9XUklURSkpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIlhYWFgiOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NsZWFyc3RhdGNhY2hlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZmlsZV9leGlzdHMoJHRoaXMtPmZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIF91bmxpbmsoJHRoaXMtPmZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGVhcnN0YXRjYWNoZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGZpbGVfZXhpc3RzKCR0aGlzLT5maWxlTmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGVOYW1lLCAiIiwgQ0hNT0RfV1JJVEUpOwogICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2xlYXJzdGF0Y2FjaGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChmaWxlX2V4aXN0cygkdGhpcy0+ZmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoJHRoaXMtPmZpbGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9nbG9iYWwgJF9GSUxFRVhJU1RTX0ZPUkNFX0ZUUCwgJF9DT05GSUc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRfRklMRUVYSVNUU19GT1JDRV9GVFApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkX0NPTkZJRyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIi0tLSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5maWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGdldFN5bUxpbmtGaWxlKCR0aGlzLT5maWxlTmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChfZmlsZV9leGlzdHMoJHRoaXMtPmZpbGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGZpbGVfZXhpc3RzKCR0aGlzLT5maWxlTmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJJbnN0YWxsUHJvY2VzczogVW5hYmxlIHRvIHdyaXRlIGZpbGUgIi4kdGhpcy0+ZmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiVW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgIi4kdGhpcy0+ZmlsZU5hbWUsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JlbmFtZSgkdGhpcy0+YmFja3VwRmlsZU5hbWUuIi5iYWNrdXAiLCAkdGhpcy0+YmFja3VwRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gdG8gc2hvdyBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoJHRoaXMtPnRvdGFsSW5kZXgqMTAwLyR0aGlzLT50b3RhbExlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgIGlmICh0cnVlIHx8IHN0cmxlbigkdGhpcy0+dG9rZW5bInNpemUiXSkgPiAxMDI0KjEwMjQqNTEyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZmID0gZm9wZW4oJHRoaXMtPmZpbGVOYW1lLCAiYSIpOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSgkdGhpcy0+ZmlsZVNpemUgIT0gJHRoaXMtPnRva2VuWyJzaXplIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiISI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoJHRoaXMtPnRvdGFsSW5kZXgqMTAwLyR0aGlzLT50b3RhbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+cmVhZExlbmd0aCgkZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRsZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gZnJlYWQoJGYsICRsZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aGVhZGVyWyJjb21wcmVzc2lvbiJdID09ICJneiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gZ3p1bmNvbXByZXNzKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZndyaXRlKCRmZiwgJGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZVNpemUgKz0gc3RybGVuKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNsZWVwKDAuMDAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bWVOZWVkZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW5kZXggPSBmdGVsbCgkZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkZmYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YTIgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoJHRoaXMtPmZpbGVTaXplICE9ICR0aGlzLT50b2tlblsic2l6ZSJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnJlYWRMZW5ndGgoJGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gZnJlYWQoJGYsICRsZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aGVhZGVyWyJjb21wcmVzc2lvbiJdID09ICJneiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gZ3p1bmNvbXByZXNzKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGF0YTIgLj0gJGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVTaXplICs9IHN0cmxlbigkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlTmFtZSwgJGRhdGEyLCBDSE1PRF9XUklURSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJGZpbGVFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChfZmlsZXNpemUoJHRoaXMtPmZpbGVOYW1lKSAhPSAkdGhpcy0+dG9rZW5bInNpemUiXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJCQUQgRklMRVNJWkU6ICIuX2ZpbGVzaXplKCR0aGlzLT5maWxlTmFtZSkuIiAhPSAiLiR0aGlzLT50b2tlblsic2l6ZSJdLiIgLSAiLiR0aGlzLT5maWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnRva2VuWyJjaGVja3N1bSJdICYmIG1kNV9maWxlKCR0aGlzLT5maWxlTmFtZSkgIT0gJHRoaXMtPnRva2VuWyJjaGVja3N1bSJdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIkJBRCBDSEVDS1NVTTogIi4kdGhpcy0+ZmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZUVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRmaWxlRXJyb3IpICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+YmFja3VwRmlsZU5hbWUgJiYgX2ZpbGVfZXhpc3RzKCR0aGlzLT5iYWNrdXBGaWxlTmFtZS4iLmJhY2t1cCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVuYW1lKCR0aGlzLT5iYWNrdXBGaWxlTmFtZS4iLmJhY2t1cCIsICR0aGlzLT5iYWNrdXBGaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEZpbGVFeHQoJHRoaXMtPmZpbGVOYW1lKSA9PSAicGhwIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NobW9kKCR0aGlzLT5maWxlTmFtZSwgQ0hNT0RfUEhQKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoQ0hNT0RfUEhQKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2htb2QoJHRoaXMtPmZpbGVOYW1lLCAoaW50KSR0aGlzLT50b2tlblsibW9kIl0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vX21rZGlyKCR0aGlzLT5wYXRoLiR0aGlzLT50b2tlblsibmFtZSJdLCAkdGhpcy0+dG9rZW5bIm1vZCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5iYWNrdXBGaWxlTmFtZSAmJiBfZmlsZV9leGlzdHMoJHRoaXMtPmJhY2t1cEZpbGVOYW1lLiIuYmFja3VwIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF91bmxpbmsoJHRoaXMtPmJhY2t1cEZpbGVOYW1lLiIuYmFja3VwIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YmFja3VwRmlsZU5hbWUgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCR0aGlzLT50b2tlblsidHlwZSJdID09ICJ0YWJsZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dG9rZW4pOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuWyJwYXJhbXMiXVsidmlydHVhbCJdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT50YWJsZXNbInRhYmxlcyJdICYmICR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRVbnBhY2tNb2R1bGUiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImVtcHR5UHJvamVjdCJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJFUlJPUiAjMDAwMSI7ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGFibGVzWyJ0YWJsZXMiXSA9IGdldFRhYmxlKCJ0YWJsZXMiKS0+c3FsUmVjb3JkOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGFibGVzWyJ0YWJsZXMiXVsiZmllbGRzIl0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKGdldFRhYmxlKCJ0YWJsZXMiKS0+Z2V0RmllbGRzKCkgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGFibGVzWyJ0YWJsZXMiXVsiZmllbGRzIl1bJEZpZWxkLT5uYW1lXSA9ICRGaWVsZC0+cGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl0gJiYgJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja01vZHVsZSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siZW1wdHlQcm9qZWN0Il0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIkVSUk9SICMwMDAyIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZXNbInRhYmxlX2ZpZWxkcyJdID0gZ2V0VGFibGUoInRhYmxlX2ZpZWxkcyIpLT5zcWxSZWNvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZXNbInRhYmxlX2ZpZWxkcyJdWyJmaWVsZHMiXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goZ2V0VGFibGUoInRhYmxlX2ZpZWxkcyIpLT5nZXRGaWVsZHMoKSBhcyAkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZXNbInRhYmxlX2ZpZWxkcyJdWyJmaWVsZHMiXVskRmllbGQtPm5hbWVdID0gJEZpZWxkLT5wYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9jb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKG1pY3JvdGltZSh0cnVlKSk7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzVGV4dCh0cmFuc2xhdGUoIlRhYmxlIikuIiAiLiR0aGlzLT50b2tlblsibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoJHRoaXMtPnRvdGFsSW5kZXgqMTAwLyR0aGlzLT50b3RhbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcChtaWNyb3RpbWUodHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJF9TRVNTSU9OKTsKICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoJHRoaXMtPnRva2VuWyJuYW1lIl0gPT0gImNtc190ZW1wbGF0ZXMiKQogICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICAgICAgJERiTGluayA9ICR0aGlzLT5nZXREYkxpbmsoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja01vZHVsZSIgJiYgdGFibGVFeGlzdHMoJHRoaXMtPnRva2VuWyJuYW1lIl0pICYmICEkdGhpcy0+dG9rZW5bInBhcmFtcyJdWyJ2aXJ0dWFsIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgbWlzc2luZyBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoJHRoaXMtPnRva2VuWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT50b2tlblsiZmllbGRzIl0gYXMgJGZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZpZWxkWyJuYW1lIl0pICAvLyBhcnJheSgxKSAiZGVmYXVsdFZhbHVlcyIgPT4gLi4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQodHJhbnNsYXRlKCJUYWJsZSIpLiIgIi4kdGhpcy0+dG9rZW5bIm5hbWUiXS4iICgiLiRmaWVsZFsibmFtZSJdLiIpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkVGFibGUtPmhhc0ZpZWxkKCRmaWVsZFsibmFtZSJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInBhcmFtcyJdWyJ0eXBlIl0gIT0gInR0TGlzdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUYWJsZSgidGFibGVfZmllbGRzIiktPmdldFJlY29yZCgiaWQ9Ii4kZmllbGRbImlkIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhYmxlKCJ0YWJsZV9maWVsZHMiKS0+dXBkYXRlUmVjb3JkKCRmaWVsZCwgYXJyYXkoImlkIiksIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZ2V0VGFibGUoInRhYmxlX2ZpZWxkcyIpLT5pbnNlcnRSZWNvcmQoJGZpZWxkLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkcmV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZShzdHJfZHVtcCgkZmllbGQpLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICREYkxpbmstPmluc2VydFJlY29yZCgkdGhpcy0+dGFibGVzWyJ0YWJsZV9maWVsZHMiXSwgJGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50b2tlblsicGFyYW1zIl1bInR5cGUiXSAhPSAidHRMaXN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkID0gJFRhYmxlLT5nZXRGaWVsZCgkZmllbGRbIm5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9Cb29sKCRGaWVsZC0+bW9kaWZpZWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGZpZWxkIGFzICRfa2V5ID0+ICRfdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJF92YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRbJF9rZXldID0gVEpTT046OmVuY29kZSgkX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGUoInRhYmxlX2ZpZWxkcyIpLT51cGRhdGVSZWNvcmQoJGZpZWxkLCBhcnJheSgiaWQiKSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAkRGJMaW5rLT51cGRhdGVSZWNvcmQoJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl0sICRmaWVsZCwgYXJyYXkoImZpbHRlcl9pZCIgPT4gJGZpZWxkWyJpZCJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQodHJhbnNsYXRlKCJUYWJsZSIpLiIgIi4kdGhpcy0+dG9rZW5bIm5hbWUiXSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gIT0gImF0VW5wYWNrTW9kdWxlIiB8fCAhdGFibGVFeGlzdHMoJHRoaXMtPnRva2VuWyJuYW1lIl0pKSAvLyBtb2R1bGUgdGFibGUgYWxyZWFkeSBleGlzdHMKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGVFeGlzdHMoJHRoaXMtPnRva2VuWyJuYW1lIl0pICYmICEkdGhpcy0+dG9rZW5bInBhcmFtcyJdWyJ2aXJ0dWFsIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+T2xkTW9kdWxlICYmICREYkxpbmstPnRhYmxlRXhpc3RzKCR0aGlzLT50b2tlblsicGFyYW1zIl0pKSAvLyB2emR5LCBrZHl6IGNoY2kgcmVpbnN0YWxsIHByb2pla3R1IG9kIHpub3Z1Li4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICIxIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluay0+ZHJvcFRhYmxlKCR0aGlzLT50b2tlblsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnRva2VuWyJwYXJhbXMiXVsidHlwZSJdID09ICJ0dExpc3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYkxpbmstPmNyZWF0ZVRhYmxlKCR0aGlzLT50b2tlblsicGFyYW1zIl0sIGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgibmFtZSIgPT4gIm5hbWUiLCAiZGF0YVR5cGUiID0+ICJ2YXJjaGFyIiwgImRhdGFUeXBlUGFyYW1zIiA9PiAiMjU1IiwgInByaW1hcnlLZXkiID0+IHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgibmFtZSIgPT4gInZhbHVlIiwgImRhdGFUeXBlIiA9PiAibG9uZ3RleHQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoIm5hbWUiID0+ICJwYXJlbnQiLCAiZGF0YVR5cGUiID0+ICJjaGFyIiwgImRhdGFUeXBlUGFyYW1zIiA9PiAiMzYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIjIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlIGlmICghJHRoaXMtPk9sZE1vZHVsZSAmJiAhJERiTGluay0+dGFibGVFeGlzdHMoJHRoaXMtPnRva2VuWyJwYXJhbXMiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvKiEkdGhpcy0+T2xkTW9kdWxlICYmICovISREYkxpbmstPnRhYmxlRXhpc3RzKCR0aGlzLT50b2tlblsicGFyYW1zIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiMyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dG9rZW5bInBhcmFtcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlblsiZmllbGRzIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlblsibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnRva2VuWyJwYXJhbXMiXVsiZXh0ZW5kcyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+dG9rZW5bImZpZWxkcyJdIGFzICRmaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkRGJMaW5rLT5maWVsZEV4aXN0cygkdGhpcy0+dG9rZW5bInBhcmFtcyJdWyJleHRlbmRzIl0sICRmaWVsZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluay0+YWRkRmllbGQoJHRoaXMtPnRva2VuWyJwYXJhbXMiXVsiZXh0ZW5kcyJdLCAkZmllbGQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkRGJMaW5rLT5jcmVhdGVUYWJsZSgkdGhpcy0+dG9rZW5bInBhcmFtcyJdLCAkdGhpcy0+dG9rZW5bImZpZWxkcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkFMU0UgJiYgJERiTGluay0+ZXJyb3IpIC8vIFNRTGl0ZSAtPiBjcmVhdGUgaW5kZXggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkRGJMaW5rLT5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI9PSBEQkxJTksgQ1JFQVRFIFRBQkxFIEVSUk9SID09IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfZHVtcCgkdGhpcy0+dG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gRE8gQUxXQVlTIC0gYnV0IG9uY2Ugb25seSAtIHRoZSBmaXJzdCBvbmUgY29udGFpbnMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsibmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZXNbJHRoaXMtPnRva2VuWyJuYW1lIl1dID0gJHRoaXMtPnRva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVjb3JkSW5kZXhbJHRoaXMtPnRva2VuWyJuYW1lIl1dID0gMDsKCiAgICAgICAgICAgICAgICAgICAgLy9pZiAoISR0aGlzLT50b2tlblsiZXh0ZXJuIl0gJiYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSAhPSAiYXRVbnBhY2tNb2R1bGUiIHx8ICF0YWJsZUV4aXN0cygkdGhpcy0+dG9rZW5bIm5hbWUiXSkpKSAvLyBtb2R1bGUgdGFibGUgYWxyZWFkeSBleGlzdHMKICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT50b2tlblsiZXh0ZXJuIl0pCiAgICAgICAgICAgICAgICAgICAgeyAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gIT0gImF0VW5wYWNrUHJvamVjdCIgfHwgJHRoaXMtPnBhcmFtc1siZW1wdHlQcm9qZWN0Il0pICYmICR0aGlzLT50b2tlblsibmFtZSJdICE9ICJ0YWJsZXMiICYmICR0aGlzLT50b2tlblsibmFtZSJdICE9ICJ0YWJsZV9maWVsZHMiICYmICR0aGlzLT50b2tlblsibmFtZSJdICE9ICJtb2R1bGVzIiAmJiAkdGhpcy0+dG9rZW5bIm5hbWUiXSAhPSAiaGVscCIpIC8vIHdpbGwgd2UgaW5zZXJ0ZWQgYnkgcmVjb3JkcwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkdGhpcy0+dG9rZW5bIm5hbWUiXSA9PSAiY21zX3RlbXBsYXRlcyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZCA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT50b2tlblsicGFyYW1zIl0gYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kdmFsdWUgPSBUSlNPTjo6ZW5jb2RlKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5qc29uRW5jb2RlKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gInRydWUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAiZmFsc2UiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkWyRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBtaXNzaW5nIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja01vZHVsZSIgJiYgISR0aGlzLT5wYXJhbXNbImVtcHR5UHJvamVjdCJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4RGVmYXVsdFZhbHVlcyA9IFRKU09OOjpkZWNvZGUoJHRoaXMtPnRva2VuWyJwYXJhbXMiXVsiZGVmYXVsdFZhbHVlcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR4RGVmYXVsdFZhbHVlcyBhcyAkeE5hbWUgPT4gJHhWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJHJlY29yZFskeE5hbWVdKSAmJiBnZXRUYWJsZSgidGFibGVzIiktPmhhc0ZpZWxkKCR4TmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWNvcmRbJHhOYW1lXSA9IHRvU3RyaW5nKCR4VmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZyBmaXggLSBtaXNzaW5nIHBvc2l0aW9uICcnIGluc3RlYWQgb2YgMCBvciBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZFsicG9zaXRpb24iXSA9IChpbnQpJHJlY29yZFsicG9zaXRpb24iXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvbGRSZWNvcmRzID0gJERiTGluay0+c2VsZWN0KCR0aGlzLT50YWJsZXNbInRhYmxlcyJdLCBhcnJheSgiZmlsdGVyX2lkIiA9PiAkcmVjb3JkWyJpZCJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG9sZFJlY29yZHNbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b0Jvb2woJG9sZFJlY29yZHNbMF1bIm1vZGlmaWVkIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGJMaW5rLT51cGRhdGVSZWNvcmQoJHRoaXMtPnRhYmxlc1sidGFibGVzIl0sICRyZWNvcmQsIGFycmF5KCJmaWx0ZXJfaWQiID0+ICRyZWNvcmRbImlkIl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGJMaW5rLT5pbnNlcnRSZWNvcmQoJHRoaXMtPnRhYmxlc1sidGFibGVzIl0sICRyZWNvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERiTGluay0+ZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKCREYkxpbmstPmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gJERiTGluay0+ZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICI9PSBEQkxJTksgSU5TRVJUIFRBQkxFIFJFQ09SRCBFUlJPUiA9PSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW96bmEgdXogdG8gdHUgYnl0IG5lbXVzaS4uLiB1cGRhdGVSZWNvcmQgdSB0YWJsZV9maWVsZHMgc2Ugdm9sYSBkcml2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50b2tlblsicGFyYW1zIl1bInR5cGUiXSAhPSAidHRMaXN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT50b2tlblsiZmllbGRzIl0gYXMgJGZpZWxkUGFyYW1zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmaWVsZFBhcmFtcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZCA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRmaWVsZFBhcmFtcyBhcyAkbmFtZSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc19hcnJheSgkdmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyR2YWx1ZSA9IFRKU09OOjplbmNvZGUoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmpzb25FbmNvZGUoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAidHJ1ZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICJmYWxzZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlblsiZmllbGRzIl1bJG5hbWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09PSAiIiAmJiAkdGhpcy0+dGFibGVzWyJ0YWJsZV9maWVsZHMiXVsiZmllbGRzIl1bJG5hbWVdWyJudWxsVmFsdWUiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCR2YWx1ZSA9PT0gTlVMTCB8fCAkdmFsdWUgPT09ICIiKSAmJiAhJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl1bImZpZWxkcyJdWyRuYW1lXVsibnVsbFZhbHVlIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyR2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl1bImZpZWxkcyJdWyRuYW1lXVsiZGVmYXVsdFZhbHVlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl1bImZpZWxkcyJdWyRuYW1lXVsiZGVmYXVsdFZhbHVlIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZFskbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImVtcHR5UHJvamVjdCJdIHx8ICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0VW5wYWNrTW9kdWxlIiAmJiAhZ2V0T2JqZWN0KCJNb2R1bGVzIiktPmdldE1vZHVsZShNVUxUSUxBTkdVQUdFX01PRFVMRV9QQUNLQUdFKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZWNvcmRbInRhYmxlTmFtZSJdICE9ICJ0cmFuc2xhdG9ycyIgJiYgJHJlY29yZFsidGFibGVOYW1lIl0gIT0gInRyYW5zbGF0aW9ucyIgJiYgJHJlY29yZFsidGFibGVOYW1lIl0gIT0gInRyYW5zbGF0aW9uX2l0ZW1zIiAmJiAkcmVjb3JkWyJuYW1lIl0gPT0gImxhbmd1YWdlIiAmJiAhdG9Cb29sKCRyZWNvcmRbInN5c3RlbSJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZFsidmlzaWJsZSJdID0gImZhbHNlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9sZFJlY29yZHMgPSAkRGJMaW5rLT5zZWxlY3QoJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl0sIGFycmF5KCJmaWx0ZXJfaWQiID0+ICRyZWNvcmRbImlkIl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkb2xkUmVjb3Jkc1swXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRvbGRSZWNvcmRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvQm9vbCgkb2xkUmVjb3Jkc1swXVsibW9kaWZpZWQiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRyZWNvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGJMaW5rLT51cGRhdGVSZWNvcmQoJHRoaXMtPnRhYmxlc1sidGFibGVfZmllbGRzIl0sICRyZWNvcmQsIGFycmF5KCJmaWx0ZXJfaWQiID0+ICRyZWNvcmRbImlkIl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluay0+aW5zZXJ0UmVjb3JkKCR0aGlzLT50YWJsZXNbInRhYmxlX2ZpZWxkcyJdLCAkcmVjb3JkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERiTGluay0+ZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKCREYkxpbmstPmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gJERiTGluay0+ZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICI9PSBEQkxJTksgSU5TRVJUIFRBQkxFX0ZJRUxEUyBSRUNPUkQgRVJST1IgPT0iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gImVtcHR5IGZpZWxkIHBhcmFtIC4uLiIuJHRoaXMtPnRva2VuWyJuYW1lIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkFMU0UgJiYgJERiTGluay0+ZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcigiSW5zZXJ0IHRhYmxlIGVycm9yOiAiLiREYkxpbmstPmVycm9yKS4iPGhyIC8+Ii5zdHJfZHVtcCgkdGhpcy0+dG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJERiTGluayk7CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHRoaXMtPnRva2VuWyJ0eXBlIl0gPT0gInJlY29yZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSAhPSAiYXRVbnBhY2tNb2R1bGUiIHx8ICR0aGlzLT50b2tlblsidGFibGUiXSA9PSAibW9kdWxlcyIgfHwgJHRoaXMtPnBhcmFtc1sidXBkYXRlRGF0YSJdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV0gJiYgJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja01vZHVsZSIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJlbXB0eVByb2plY3QiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJFUlJPUiAjMDAwMyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dID0gZ2V0VGFibGUoJHRoaXMtPnRva2VuWyJ0YWJsZSJdKS0+c3FsUmVjb3JkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUgPSBnZXRUYWJsZSgkdGhpcy0+dG9rZW5bInRhYmxlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRUYWJsZS0+Z2V0RmllbGRzKCkgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXVskRmllbGQtPm5hbWVdID0gJEZpZWxkLT5wYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUYWJsZSAnIi4kdGhpcy0+dG9rZW5bInRhYmxlIl0uIicgbm90IGZvdW5kIiwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT50b2tlblsidGFibGUiXS4iICgiLigkdGhpcy0+cmVjb3JkSW5kZXhbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSsxKS4iIG9mICIuJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJyZWNvcmRzIl0uIikiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9fc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyRzZXMgPSBzZXJpYWxpemUoJF9TRVNTSU9OKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy91bnNldCgkX1NFU1NJT05bIlByb2Nlc3NNYW5hZ2VyIl1bJHRoaXMtPmlkXVsibWVzc2FnZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdW5zZXQoJF9TRVNTSU9OWyJQcm9jZXNzTWFuYWdlciJdWyR0aGlzLT5pZF1bImVycm9ycyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9fc2Vzc2lvbl93cml0ZV9jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT50b2tlblsidGFibGUiXS4iICgiLigkdGhpcy0+cmVjb3JkSW5kZXhbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSsxKS4iIG9mICIuJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJyZWNvcmRzIl0uIikgLSBzZXNzaW9uOiIuc3RybGVuKCRzZXMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT50b2tlblsidGFibGUiXS4iICgiLigkdGhpcy0+cmVjb3JkSW5kZXhbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSsxKS4iIG9mICIuJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJyZWNvcmRzIl0uIikiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzVGV4dCgiVGFibGUgRGF0YSAiLiR0aGlzLT50b2tlblsidGFibGUiXS4iICgiLigkdGhpcy0+cmVjb3JkSW5kZXhbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSsxKS4oJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJyZWNvcmRzIl0gPyAiICIudHJhbnNsYXRlKCJvZiIpLiIgIi4kdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV1bInJlY29yZHMiXSA6ICIiKS4iKSIpOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoJHRoaXMtPnRvdGFsSW5kZXgqMTAwLyR0aGlzLT50b3RhbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICREYkxpbmsgPSAkdGhpcy0+Z2V0RGJMaW5rKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRva2VuWyJ0YWJsZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50YWJsZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dGFibGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdIGFzICRmaWVsZE5hbWUgPT4gJHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWVsZHMgPSAkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV1bImZpZWxkcyJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkZmllbGRzIGFzICRmaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZpZWxkWyJuYW1lIl0gPT0gJGZpZWxkTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGZvdW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT50b2tlblsidmFsdWVzIl1bJGZpZWxkTmFtZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJvY2Vzc0Vycm9yKCJGaWVsZCBub3QgZm91bmQ6ICIuJHRoaXMtPnRva2VuWyJ0YWJsZSJdLiI6OiIuJGZpZWxkTmFtZS4iPGJyIC8+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoJGZpZWxkTmFtZSA9PSAiaW5zdGFsbERhdGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV1bImZpZWxkcyJdWyJudWxsVmFsdWUiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gIiIgJiYgJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXVskZmllbGROYW1lXVsibnVsbFZhbHVlIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gTlVMTCAmJiAhJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXVskZmllbGROYW1lXVsibnVsbFZhbHVlIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXVskZmllbGROYW1lXVsiZGVmYXVsdFZhbHVlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXVskZmllbGROYW1lXVsiZGVmYXVsdFZhbHVlIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyRmaWVsZE5hbWVdID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBub3QgcmVjb3JkIGFscmVhZHkgZXhpc3RzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgcHJpbWFyeSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgJHByaW1hcnlLZXkgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50YWJsZXNbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXVsicGFyYW1zIl1bInR5cGUiXSA9PSAidHRMaXN0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW1hcnlLZXkgPSAibmFtZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT50YWJsZXNbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXVsiZmllbGRzIl0gYXMgJF9maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9maWVsZFsicHJpbWFyeUtleSJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW1hcnlLZXkgPSAkX2ZpZWxkWyJuYW1lIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHByaW1hcnlLZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbWFyeUtleSA9ICJpZCI7CgogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoYXJyYXkoImZpbHRlcl8iLiRwcmltYXJ5S2V5ID0+ICR0aGlzLT50b2tlblsidmFsdWVzIl1bJHByaW1hcnlLZXldKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChpc3NldCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJkZWZhdWx0VmFsdWVzIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJkZWZhdWx0VmFsdWVzIl0gPSBUSlNPTjo6ZW5jb2RlKCR0aGlzLT50b2tlblsidmFsdWVzIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRvbGRSZWNvcmRzID0gJERiTGluay0+c2VsZWN0KCR0aGlzLT50YWJsZXNbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSwgYXJyYXkoImZpbHRlcl8iLiRwcmltYXJ5S2V5ID0+ICR0aGlzLT50b2tlblsidmFsdWVzIl1bJHByaW1hcnlLZXldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkb2xkUmVjb3Jkc1swXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkb2xkUmVjb3Jkc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZG9VcGRhdGUgPSAhdG9Cb29sKCRvbGRSZWNvcmRzWzBdWyJtb2RpZmllZCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRkb1VwZGF0ZSAmJiBpc3NldCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJkZWZhdWx0VmFsdWVzIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50b2tlblsidmFsdWVzIl0gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW1hcnlLZXkgPT4gJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXVskcHJpbWFyeUtleV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0VmFsdWVzIiA9PiAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJkZWZhdWx0VmFsdWVzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZG9VcGRhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRvVXBkYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoJHRoaXMtPnRva2VuWyJ0YWJsZSJdID09ICJ0YWJsZV9maWVsZHMiIHx8ICR0aGlzLT50b2tlblsidGFibGUiXSA9PSAiYWRtaW5fbWVudSIpICYmICR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRVbnBhY2tNb2R1bGUiICYmICEkdGhpcy0+cGFyYW1zWyJlbXB0eVByb2plY3QiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInRhYmxlIl0gPT0gImFkbWluX21lbnUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXVsicG9zaXRpb24iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT50b2tlblsidmFsdWVzIl0gYXMgJGZpZWxkTmFtZSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgPT09ICIiICYmICR0aGlzLT50YWJsZXNbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXVsiZmllbGRzIl1bJGZpZWxkTmFtZV1bIm51bGxWYWx1ZSJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09PSBOVUxMICYmICEkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV1bImZpZWxkcyJdWyRmaWVsZE5hbWVdWyJudWxsVmFsdWUiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnRhYmxlc1skdGhpcy0+dG9rZW5bInRhYmxlIl1dWyJmaWVsZHMiXVskZmllbGROYW1lXVsiZGVmYXVsdFZhbHVlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV1bImZpZWxkcyJdWyRmaWVsZE5hbWVdWyJkZWZhdWx0VmFsdWUiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXVskZmllbGROYW1lXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYWJsZSgkdGhpcy0+dG9rZW5bInRhYmxlIl0pLT51cGRhdGVSZWNvcmQoJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXSwgYXJyYXkoJHByaW1hcnlLZXkpLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluay0+dXBkYXRlUmVjb3JkKCR0aGlzLT50YWJsZXNbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSwgJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXSwgYXJyYXkoImZpbHRlcl8iLiRwcmltYXJ5S2V5ID0+ICR0aGlzLT50b2tlblsidmFsdWVzIl1bJHByaW1hcnlLZXldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCR0aGlzLT50b2tlblsidGFibGUiXSA9PSAidGFibGVfZmllbGRzIiB8fCAkdGhpcy0+dG9rZW5bInRhYmxlIl0gPT0gImFkbWluX21lbnUiKSAmJiAkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0VW5wYWNrTW9kdWxlIiAmJiAhJHRoaXMtPnBhcmFtc1siZW1wdHlQcm9qZWN0Il0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50b2tlblsidGFibGUiXSA9PSAiYWRtaW5fbWVudSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJwb3NpdGlvbiJdID0gIiI7IC8vIHRvIGF1dG9pbmNyZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzRXJyb3IoJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzRXJyb3IoSU5TVEFMTFBST0NFU1MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhYmxlKCR0aGlzLT50b2tlblsidGFibGUiXSktPmluc2VydFJlY29yZCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT50b2tlblsidGFibGUiXSA9PSAidGltZXJfc2NyaXB0cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJuZXh0RXhlY3V0ZSJdID0gIk5VTEwiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJsYXN0RXhlY3V0ZWQiXSA9ICJOVUxMIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXVsibGFzdEZpbmlzaGVkIl0gPSAiTlVMTCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYkxpbmstPmluc2VydFJlY29yZCgkdGhpcy0+dGFibGVzWyR0aGlzLT50b2tlblsidGFibGUiXV0sICR0aGlzLT50b2tlblsidmFsdWVzIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0VW5wYWNrTW9kdWxlIiAmJiAhJHRoaXMtPnBhcmFtc1siZW1wdHlQcm9qZWN0Il0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kaW5nIG5ldyBmaWVsZCB0byB0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInRhYmxlIl0gPT0gInRhYmxlX2ZpZWxkcyIgJiYgJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXVsidGFibGVOYW1lIl0gIT0gInNldHRpbmdzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRYVGFibGUgPSBnZXRUYWJsZSgkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJ0YWJsZU5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4UmVjb3JkcyA9ICRYVGFibGUtPmdldFJlY29yZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkeFJlY29yZHMgYXMgJHhSZWNvcmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkeFJlY29yZFsiZGVmYXVsdFZhbHVlcyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4RGVmYXVsdFZhbHVlcyA9IFRKU09OOjpkZWNvZGUoJHhSZWNvcmRbImRlZmF1bHRWYWx1ZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJ0YWJsZU5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHhEZWZhdWx0VmFsdWVzWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHhEZWZhdWx0VmFsdWVzWyR0aGlzLT50b2tlblsidmFsdWVzIl1bIm5hbWUiXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCR0aGlzLT50b2tlblsidmFsdWVzIl1bIm5hbWUiXSA9PSAic2VvVXJsIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXJfZHVtcCgkeERlZmF1bHRWYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkeERlZmF1bHRWYWx1ZXNbJHRoaXMtPnRva2VuWyJ2YWx1ZXMiXVsibmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGFycmF5KCJpZCI9PiR4UmVjb3JkWyJpZCJdLCAkdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJuYW1lIl09PnRvU3RyaW5nKCR4RGVmYXVsdFZhbHVlc1skdGhpcy0+dG9rZW5bInZhbHVlcyJdWyJuYW1lIl1dKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkWFRhYmxlLT51cGRhdGVSYXdSZWNvcmQoYXJyYXkoImlkIj0+JHhSZWNvcmRbImlkIl0sICR0aGlzLT50b2tlblsidmFsdWVzIl1bIm5hbWUiXT0+dG9TdHJpbmcoJHhEZWZhdWx0VmFsdWVzWyR0aGlzLT50b2tlblsidmFsdWVzIl1bIm5hbWUiXV0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJFhUYWJsZS0+Z2V0UmVjb3JkKCJpZD0iLiR4UmVjb3JkWyJpZCJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGJMaW5rLT5lcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICREYkxpbmstPmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICI9PSBEQkxJTksgSU5TRVJUIFJFQ09SRCBFUlJPUiA9PSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKCJJbnNlcnQgcmVjb3JkIGVycm9yOiAiLiREYkxpbmstPmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVjb3JkSW5kZXhbJHRoaXMtPnRva2VuWyJ0YWJsZSJdXSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkdGhpcy0+aW5kZXggPSBmdGVsbCgkZik7CiAgICAgICAgICAgICAgICAkdGhpcy0+dG90YWxJbmRleCA9ICR0aGlzLT5fdG90YWxJbmRleCskdGhpcy0+aW5kZXg7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzcygkdGhpcy0+dG90YWxJbmRleCoxMDAvJHRoaXMtPnRvdGFsTGVuZ3RoKTsKICAgICAgICAgICAgICAgICR0aGlzLT50b2tlbiA9IE5VTEw7ICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cmVzdW1lTmVlZGVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISR0aGlzLT5oZWFkZXJbImxhbmd1YWdlIl0gfHwgc3RycG9zKCR0aGlzLT5oZWFkZXJbIm5hbWUiXSwgIkxhbmd1YWdlUGFjayIpICE9PSBGQUxTRSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG1vZHVsZVBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoJHRoaXMtPmhlYWRlclsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgaWYgKElOU1RBTEwgIT09IHRydWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGUoIm1vZHVsZXMiKS0+dXBkYXRlUmF3UmVjb3JkKGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAiaWQiPT4kbW9kdWxlUGFyYW1zWyJpZCJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24iPT4kbW9kdWxlUGFyYW1zWyJ2ZXJzaW9uIl0sIAogICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbERhdGUiPT5ub3coKQogICAgICAgICAgICAgICAgICAgICkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy9fbG9nKCIhISEhISIpOwogICAgICAgICAgICAvL19sb2coJHRoaXMtPnBhcmFtc1siaW5zdGFsbERlcGVuZGVuY2VzIl0pOwogICAgICAgICAgICBpZiAodG9Cb29sKCR0aGlzLT5wYXJhbXNbImluc3RhbGxEZXBlbmRlbmNlcyJdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGRlcGVuZHMgPSBUSlNPTjo6ZGVjb2RlKCRtb2R1bGVQYXJhbXNbImRlcGVuZHMiXSwgYXJyYXkoKSk7CiAgICAgICAgICAgICAgICAvL19sb2coJG1vZHVsZVBhcmFtc1siZGVwZW5kcyJdKTsKICAgICAgICAgICAgICAgIC8vX2xvZygkZGVwZW5kcyk7CiAgICAgICAgICAgICAgICAkbW9kdWxlc1RvSW5zdGFsbCA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRkZXBlbmRzIGFzICRfZGVwZW5kcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkZGVwZW5kc01vZHVsZUlkID0gJF9kZXBlbmRzWyJtb2R1bGUiXTsKICAgICAgICAgICAgICAgICAgICAvL19sb2coJGRlcGVuZHNNb2R1bGVJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRkZXBlbmRzTW9kdWxlSWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFRhYmxlKCJtb2R1bGVzIiktPmdldFJhd1JlY29yZCgiaWQ9Ii4kZGVwZW5kc01vZHVsZUlkKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZHVsZXNUb0luc3RhbGxbXSA9ICRkZXBlbmRzTW9kdWxlSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9fbG9nKCRtb2R1bGVzVG9JbnN0YWxsKTsKICAgICAgICAgICAgICAgIGlmICgkbW9kdWxlc1RvSW5zdGFsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkbGFuZ3VhZ2VzID0gYXJyYXlfbWVyZ2UoYXJyYXkoIiIpLCBnZXRPYmplY3QoIlRyYW5zbGF0b3JzIiktPmdldExhbmd1YWdlcygpKTsKICAgICAgICAgICAgICAgICAgICAkX3BhcmFtcyA9IGFycmF5KCJ1cmwiPT5hcnJheSgpLCJmaWxlIj0+YXJyYXkoKSk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkbW9kdWxlc1RvSW5zdGFsbCBhcyAkX21vZHVsZUlkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkbGFuZ3VhZ2VzIGFzICRfbGFuZ3VhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfcGFyYW1zWyJ1cmwiXVtdID0gImh0dHA6Ly93d3cudmlzdWFsLXBocC5jb20vc2NyaXB0cy5waHA/dGlkPWluc3RhbGxfZG93bmxvYWQmbW9kdWxlSWQ9Ii4kX21vZHVsZUlkLiImbGFuZz0iLiRfbGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3BhcmFtc1siZmlsZSJdW10gPSBQUk9KRUNUUEFUSC4iaW5zdGFsbC8iLiRfbW9kdWxlSWQuKCRfbGFuZ3VhZ2UgPyAiLiIuJF9sYW5ndWFnZSA6ICIiKS4iLmRvd25sb2FkZWQuaW5zdGFsbCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRfcGFyYW1zWyJvbkZpbmlzaCJdID0gIlwkcGFyYW1zID0gYXJyYXkoJ3VwZGF0ZURhdGEnPT50cnVlLCdhY3Rpb25UeXBlJz0+J2F0VW5wYWNrTW9kdWxlJywnaW5zdGFsbERlcGVuZGVuY2VzJz0+J3RydWUnLCdpbnN0YWxsRmlsZSc9PmV4cGxvZGVMaXN0KCciLmltcGxvZGVMaXN0KCRfcGFyYW1zWyJmaWxlIl0pLiInKSk7XCRNYW5hZ2VyID0gY3JlYXRlT2JqZWN0KCdQcm9jZXNzTWFuYWdlcicpO1wkcHJvY2Vzc0lkID0gXCRNYW5hZ2VyLT5ydW4oJ0luc3RhbGxQcm9jZXNzJywgXCRwYXJhbXMpOyI7CgogICAgICAgICAgICAgICAgICAgIC8vX2xvZygkX3BhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgJE1hbmFnZXIgPSBjcmVhdGVPYmplY3QoIlByb2Nlc3NNYW5hZ2VyIik7CiAgICAgICAgICAgICAgICAgICAgJHByb2Nlc3NJZCA9ICRNYW5hZ2VyLT5ydW4oIkRvd25sb2FkUHJvY2VzcyIsICRfcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAvL19sb2coJHByb2Nlc3NJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGVsc2UgaWYgKCRtb2R1bGVQYXJhbXNbImxhbmd1YWdlIl0gfHwgJG1vZHVsZVBhcmFtc1sibmFtZSJdID09ICJDb3JlIiB8fCAkbW9kdWxlUGFyYW1zWyJuYW1lIl0gPT0gIldlYiIgfHwgJG1vZHVsZVBhcmFtc1sibmFtZSJdID09ICJBZG1pbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZ1bmd1amUgb2ssIGFsZSBuZWtkZSBzZSB6YXNlIHByZXBpc3VqZQogICAgICAgICAgICAgICAgLy8kcmVjb3JkcyA9ICREYkxpbmstPnNlbGVjdCgkdGhpcy0+dGFibGVzWyJtb2R1bGVzIl0pOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICAkRGJMaW5rLT51cGRhdGVSZWNvcmQoJHRoaXMtPnRhYmxlc1sibW9kdWxlcyJdLCBhcnJheSgKICAgICAgICAgICAgICAgICAgICAiaWQiPT4kbW9kdWxlUGFyYW1zWyJpZCJdLCAKICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbERhdGUiPT5ub3coKQogICAgICAgICAgICAgICAgKSwgYXJyYXkoImZpbHRlcl9pZCIgPT4gJG1vZHVsZVBhcmFtc1siaWQiXSkpOwogICAgICAgICAgICAgICAgLy8kcmVjb3JkcyA9ICREYkxpbmstPnNlbGVjdCgkdGhpcy0+dGFibGVzWyJtb2R1bGVzIl0pOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRtb2R1bGVQYXJhbXNbIm5hbWUiXSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCREYkxpbmstPmxhc3RTcWxRdWVyeSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+aGVhZGVyWyJsYW5ndWFnZSJdICYmICEkdGhpcy0+cG9zdFVwZGF0ZXNFeGVjdXRlZCAvKiR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRVbnBhY2tNb2R1bGUiKi8pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB0byBlbmFibGUgZ2V0RGVmYXVsdERiTGluaygpCiAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0RGJMaW5rKCk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5nZXREYkxpbmsoKSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGdldERlZmF1bHREYkxpbmsoKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRtb2R1bGVQYXJhbXMgPSBleHRyYWN0UGFyYW1zKCR0aGlzLT5oZWFkZXJbInBhcmFtcyJdKTsKICAgICAgICAgICAgICAgICRPbGRWZXJzaW9uID0gY3JlYXRlT2JqZWN0KCJWZXJzaW9uIik7CiAgICAgICAgICAgICAgICAkVmVyc2lvbiA9IGNyZWF0ZU9iamVjdCgiVmVyc2lvbiIpOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5PbGRNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgJE9sZFZlcnNpb24tPnNldFZhbHVlKCR0aGlzLT5PbGRNb2R1bGUtPnZlcnNpb24pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5pbnN0YWxsRmlsZXMpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkbW9kdWxlUGFyYW1zWyJ1cGRhdGVzIl0pOwogICAgICAgICAgICAgICAgLy9lY2hvICI8aHIgLz4iOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkbW9kdWxlUGFyYW1zWyJ1cGRhdGVzIl0pOwogICAgICAgICAgICAgICAgLy9fbG9nKCIhIik7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRtb2R1bGVQYXJhbXNbInVwZGF0ZXMiXSBhcyAkbW9kdWxlUGFyYW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9fbG9nKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdKTsKICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5PbGRNb2R1bGUgJiYgJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0gPT0gInVwZGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0gPT0gInVuaW5zdGFsbCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvKklOU1RBTEwgIT09IHRydWUgfHwgKi8kbW9kdWxlUGFyYW1bInZlcnNpb24iXSA9PSAiaW5zdGFsbCIpIC8vIG5ldmltIHByb2MgdGFtIGJ5bCBJTlNUQUxMPz8/PwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+T2xkTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRvSW5zdGFsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdID09ICJtb3ZlIiAmJiAkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0VW5wYWNrUHJvamVjdCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RycG9zKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdLCAiLiIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0sICI6YmVmb3JlIikgPT09IEZBTFNFICYmIHN0cnBvcygkbW9kdWxlUGFyYW1bInZlcnNpb24iXSwgIjphZnRlciIpID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT5zZXRWYWx1ZSgkbW9kdWxlUGFyYW1bInZlcnNpb24iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVmVyc2lvbi0+YXNOdW1iZXIoKSA+ICRPbGRWZXJzaW9uLT5hc051bWJlcigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRvSW5zdGFsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnBvcygkbW9kdWxlUGFyYW1bInZlcnNpb24iXSwgInVwZGF0ZSIpICE9PSBGQUxTRSAmJiBzdHJwb3MoJG1vZHVsZVBhcmFtWyJ2ZXJzaW9uIl0sICI6YmVmb3JlIikgPT09IEZBTFNFICYmIHN0cnBvcygkbW9kdWxlUGFyYW1bInZlcnNpb24iXSwgIjphZnRlciIpID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT5zZXRWYWx1ZSgkbW9kdWxlUGFyYW1bInZlcnNpb24iXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVmVyc2lvbi0+YXNOdW1iZXIoKSA+ICRPbGRWZXJzaW9uLT5hc051bWJlcigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRvSW5zdGFsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnBvcygkbW9kdWxlUGFyYW1bInZlcnNpb24iXSwgIi4iKSAhPT0gRkFMU0UgJiYgc3RycG9zKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdLCAiOmFmdGVyIikgIT09IEZBTFNFKQogICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9fbG9nKCJ4Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT5zZXRWYWx1ZShzdHJfcmVwbGFjZSgiOmFmdGVyIiwgIiIsICRtb2R1bGVQYXJhbVsidmVyc2lvbiJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vX2xvZygkVmVyc2lvbi0+YXNOdW1iZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vX2xvZygkT2xkVmVyc2lvbi0+YXNOdW1iZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVmVyc2lvbi0+YXNOdW1iZXIoKSA+ICRPbGRWZXJzaW9uLT5hc051bWJlcigpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZG9JbnN0YWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX2xvZygiRVhFQ1VUSU5HIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RycG9zKCRtb2R1bGVQYXJhbVsidmVyc2lvbiJdLCAidXBkYXRlIikgIT09IEZBTFNFICYmIHN0cnBvcygkbW9kdWxlUGFyYW1bInZlcnNpb24iXSwgIjphZnRlciIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRkb0luc3RhbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCRkb0luc3RhbGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRtb2R1bGVQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ydW5VcGRhdGVzKCRtb2R1bGVQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkdGhpcy0+cG9zdFVwZGF0ZXNFeGVjdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAvLyR0aGlzLT5PbGRNb2R1bGUgPSBnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0TW9kdWxlKCR0aGlzLT5oZWFkZXJbImlkIl0pOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+aW5zdGFsbEZpbGVJbmRleCsrOwogICAgICAgICAgICAkdGhpcy0+X3RvdGFsSW5kZXggKz0gJHRoaXMtPmxlbmd0aDsgLy9mdGVsbCgkZik7CiAgICAgICAgICAgICR0aGlzLT5pbmRleCA9IDA7CiAgICAgICAgICAgICR0aGlzLT5oZWFkZXIgPSBOVUxMOwogICAgICAgICAgICAkdGhpcy0+dG9rZW4gPSBOVUxMOwogICAgICAgICAgICAkdGhpcy0+cHJlVXBkYXRlc0V4ZWN1dGVkID0gZmFsc2U7CiAgICAgICAgICAgICR0aGlzLT5wb3N0VXBkYXRlc0V4ZWN1dGVkID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICBmY2xvc2UoJGYpOwoKICAgICAgICAgICAgaWYgKElOU1RBTEwgIT09IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdldE9iamVjdCgiQ2FjaGUiKS0+Y2xlYXIoKTsKICAgICAgICAgICAgICAgIGdldE9iamVjdCgiU3R5bGVzIiktPmNsZWFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChJTlNUQUxMICE9PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnZXRPYmplY3QoIkV2ZW50cyIpLT5ydW5FdmVudHMoImFmdGVyTW9kdWxlVXBkYXRlIiwgYXJyYXkoImlkIj0+JG1vZHVsZVBhcmFtc1siaWQiXSwgInBhcmFtcyI9PiRtb2R1bGVQYXJhbXMpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQF9ybWRpcihfUFJPSkVDVFBBVEguImNhY2hlIiwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJHRoaXMtPmluc3RhbGxGaWxlSW5kZXggPCBjb3VudCgkdGhpcy0+aW5zdGFsbEZpbGVzKS0xKQogICAgICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOyAvLyB0byByZWxvYWQgVGFibGVzLCBGaWVsZHMsIC4uLgogICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIHByb2Nlc3NQcm9ncmVzcygxMDApOwogICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQodHJhbnNsYXRlKCJGaW5pc2hlZCIpKTsKCiAgICAgICAgaWYgKElOU1RBTEwgIT09IHRydWUgJiYgJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFVucGFja01vZHVsZSIgJiYgISR0aGlzLT5wYXJhbXNbImVtcHR5UHJvamVjdCJdIC8qJHRoaXMtPmhlYWRlclsiaWQiXSAhPSBFTVBUWV9QUk9KRUNUX01PRFVMRV9QQUNLQUdFKi8pCiAgICAgICAgewogICAgICAgICAgICBnZXRPYmplY3QoIlNldHRpbmdzIiktPnNldFZhbHVlKCJ1cGRhdGVzQXZhaWxhYmxlIiwgIiIpOwogICAgICAgICAgICBpZiAob2JqZWN0RGVmaW5lZCgiSHRtbENhY2hlIikpCiAgICAgICAgICAgICAgICBnZXRPYmplY3QoIkh0bWxDYWNoZSIpLT5jbGVhcigpOwogICAgICAgIH0KCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHJ1blVwZGF0ZXMoJG1vZHVsZVBhcmFtKQogICAgewogICAgICAgIGlmIChfaXNfYXJyYXkoJG1vZHVsZVBhcmFtWyJkYXRhIl0pKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkbW9kdWxlUGFyYW1bImRhdGEiXSBhcyAkZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKElOU1RBTEwgPT09IHRydWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERiTGluayA9ICR0aGlzLT5nZXREYkxpbmsoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGRhdGFbImFjdGlvblR5cGUiXSA9PSAiYXRJbnNlcnQiKQogICAgICAgICAgICAgICAgICAgICAgICAkRGJMaW5rLT5pbnNlcnRSZWNvcmQoJHRoaXMtPnRhYmxlc1skZGF0YVsidGFibGUiXV0sICRkYXRhWyJyZWNvcmQiXSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJGRhdGFbImFjdGlvblR5cGUiXSA9PSAiYXRVcGRhdGUiKQogICAgICAgICAgICAgICAgICAgICAgICAkRGJMaW5rLT51cGRhdGVSZWNvcmQoJHRoaXMtPnRhYmxlc1skZGF0YVsidGFibGUiXV0sICRkYXRhWyJyZWNvcmQiXSwgYXJyYXkoImZpbHRlcl9pZCI9PiRkYXRhWyJyZWNvcmQiXVsiaWQiXSkpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRkYXRhWyJhY3Rpb25UeXBlIl0gPT0gImF0RGVsZXRlIikKICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluay0+ZGVsZXRlUmVjb3JkKCR0aGlzLT50YWJsZXNbJGRhdGFbInRhYmxlIl1dLCBhcnJheSgiZmlsdGVyX2lkIj0+JGRhdGFbInJlY29yZCJdWyJpZCJdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFRhYmxlID0gZ2V0VGFibGUoJGRhdGFbInRhYmxlIl0pOwogICAgICAgICAgICAgICAgICAgIGlmICgkVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRUYWJsZS0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJG1vZHVsZVBhcmFtWyJkYXRhIl1bInJlY29yZCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGF0YVsiYWN0aW9uVHlwZSJdID09ICJhdEluc2VydCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgUkFXIC0gd2UgbWF5IGluc2VydCBhIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUtPmluc2VydFJlY29yZCgkZGF0YVsicmVjb3JkIl0sIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJGRhdGFbImFjdGlvblR5cGUiXSA9PSAiYXRVcGRhdGUiKSAKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRkYXRhWyJyZWNvcmQiXVsiaWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkID0gJFRhYmxlLT5nZXRSZWNvcmQoImlkPSIuJGRhdGFbInJlY29yZCJdWyJpZCJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRkYXRhWyJyZWNvcmQiXSBhcyAkZmllbGROYW1lID0+ICRmaWVsZFZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkWyRmaWVsZE5hbWVdID0gJGZpZWxkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlLT51cGRhdGVSZWNvcmQoJHJlY29yZCwgYXJyYXkoKSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW5zdGFsbFByb2Nlc3M6OnVwZGF0ZSAtIG5vIHJlY29yZCBpZCIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRkYXRhWyJhY3Rpb25UeXBlIl0gPT0gImF0RGVsZXRlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYWJsZS0+ZGVsZXRlUmVjb3JkKCRkYXRhWyJyZWNvcmQiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRUYWJsZS0+bGFzdFNxbFF1ZXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRtb2R1bGVQYXJhbVsiY29kZSJdKQogICAgICAgIHsKICAgICAgICAgICAgLy9fbG9nKCRtb2R1bGVQYXJhbVsiY29kZSJdKTsKICAgICAgICAgICAgLy9vYl9zdGFydCgpOwogICAgICAgICAgICAvL2dsb2JhbCAkYWFhOwogICAgICAgICAgICAvLyRhYWEgPSB0cnVlOwogICAgICAgICAgICAvLyRtb2R1bGVQYXJhbVsiY29kZSJdID0gJ3Zhcl9kdW1wKGdldFRhYmxlKCJsYXlvdXRzIiktPmdldFJlY29yZCgiaWQ9Yjg1ZjA2NWUtNjlhMy00ZTMwLWEyOTItOWNmY2UxYTMwNzJkIikpO2V4aXQ7JzsKICAgICAgICAgICAgLy8kbW9kdWxlUGFyYW1bImNvZGUiXSA9ICd2YXJfZHVtcCgxKTsgZXhpdDsnOwogICAgICAgICAgICAvL2VjaG8gJG1vZHVsZVBhcmFtWyJjb2RlIl07CiAgICAgICAgICAgIC8vJHJldCA9IF9fZXZhbCgkbW9kdWxlUGFyYW1bImNvZGUiXSwgSU5TVEFMTEVSID09PSB0cnVlKTsKICAgICAgICAgICAgJHJldCA9IF9fZXZhbCgkbW9kdWxlUGFyYW1bImNvZGUiXSk7CiAgICAgICAgICAgIC8vX2xvZygkcmV0KTsKICAgICAgICAgICAgLy8kY29udGVudCA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICAvL29iX2VuZF9jbGVhbigpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgZWNobyAkY29udGVudDsKICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgIlBhcnNlIGVycm9yIikgIT09IEZBTFNFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgkY29udGVudC4iPGhyIC8+Ii4kY29kZSwgbXRFcnJvcik7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIAogICAgfQoKICAgIGZ1bmN0aW9uIGdldERiTGluaygpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+RGJMaW5rKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRVbnBhY2tNb2R1bGUiIHx8ICR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRSZW1vdmVNb2R1bGUiKQogICAgICAgICAgICAgICAgJHRoaXMtPkRiTGluayA9IGdldERlZmF1bHREYkxpbmsoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+RGJMaW5rID0gY3JlYXRlT2JqZWN0KCR0aGlzLT5wYXJhbXNbImRhdGFiYXNlVHlwZSJdLiJEYkxpbmsiKTsKICAgICAgICAgICAgICAgICR0aGlzLT5EYkxpbmstPm5hbWUgPSAiZGVmYXVsdCI7CiAgICAgICAgICAgICAgICAkdGhpcy0+RGJMaW5rLT5ob3N0ID0gJHRoaXMtPnBhcmFtc1sic3FsSG9zdCJdOwogICAgICAgICAgICAgICAgJHRoaXMtPkRiTGluay0+bG9naW4gPSAkdGhpcy0+cGFyYW1zWyJzcWxMb2dpbiJdOwogICAgICAgICAgICAgICAgJHRoaXMtPkRiTGluay0+cGFzc3dvcmQgPSAkdGhpcy0+cGFyYW1zWyJzcWxQYXNzd29yZCJdOwogICAgICAgICAgICAgICAgJHRoaXMtPkRiTGluay0+ZGF0YWJhc2UgPSAkdGhpcy0+cGFyYW1zWyJzcWxEYXRhYmFzZSJdOwogICAgICAgICAgICAgICAgJHRoaXMtPkRiTGluay0+ZmlsZSA9ICR0aGlzLT5wYXJhbXNbImRiUGF0aCJdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGdsb2JhbCAkRGVmYXVsdERiTGluazsKICAgICAgICAkRGVmYXVsdERiTGluayA9ICR0aGlzLT5EYkxpbms7CiAgICAgICAgCiAgICAgICAgaWYgKCR0aGlzLT5EYkxpbmstPmxvZ2luID09ICIiICYmICR0aGlzLT5EYkxpbmstPmZpbGUgPT0gIiIgJiYgJHRoaXMtPkRiTGluay0+ZGlyID09ICIiKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyAiVEluc3RhbGxQcm9jZXNzOjpnZXREYkxpbmsoKSAtIFBBTklDIjsKICAgICAgICAgICAgdmFyX2R1bXAoJHRoaXMtPkRiTGluayk7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkdGhpcy0+RGJMaW5rKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcmVzdW1lUGFja1Byb2plY3QoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmluc3RhbGxGaWxlKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnN0ZXBzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAiUHJvamVjdERpcmVjdG9yeUxpc3QiID0+ICJHZW5lcmF0aW5nIGRpcmVjdG9yeSBsaXN0IiwKICAgICAgICAgICAgICAgICJGaWxlTGlzdCIgPT4gIkdlbmVyYXRpbmcgZmlsZSBsaXN0IiwKICAgICAgICAgICAgICAgICJQcm9qZWN0SGVhZGVyIiA9PiAiR2VuZXJhdGluZyBpbnN0YWxsIGZpbGUgaGVhZGVyIiwKICAgICAgICAgICAgICAgICJGaWxlcyIgPT4gIlBhY2tpbmcgZmlsZXMiLAogICAgICAgICAgICAgICAgIlByb2plY3RHZW5lcmF0ZURhdGFiYXNlU3RydWN0dXJlIiA9PiAiR2VuZXJhdGluZyBkYXRhYmFzZSBzdHJ1Y3R1cmUiLAogICAgICAgICAgICAgICAgIkRhdGFiYXNlU3RydWN0dXJlIiA9PiAiUGFja2luZyBkYXRhYmFzZSBzdHJ1Y3R1cmUiLAogICAgICAgICAgICAgICAgIkRhdGFiYXNlRGF0YSIgPT4gIlBhY2tpbmcgZGF0YWJhc2UgZGF0YSIsCiAgICAgICAgICAgICAgICAiRW5kIiA9PiAiRmluaXNoaW5nIGZpbGUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJHRoaXMtPmZpbGVMaXN0RmlsZSA9IFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAvaW5zdGFsbC5maWxlbGlzdCI7CiAgICAgICAgICAgIC8vJHRoaXMtPmluc3RhbGxGaWxlID0gUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvdGVtcC8iLnN0cl9yZXBsYWNlKCIgIiwgIl8iLCByZXBsYWNlQWNjZW50Q2hhcnMoZ2V0T2JqZWN0KCJTZXR0aW5ncyIpLT5zaXRlVGl0bGUpKS4iLmluc3RhbGwiOwogICAgICAgICAgICBpZiAoISR0aGlzLT5wYXJhbXNbImluc3RhbGxGaWxlIl0pCiAgICAgICAgICAgICAgICAkdGhpcy0+aW5zdGFsbEZpbGUgPSBQUk9KRUNUUEFUSC4iaW5zdGFsbC8iLnRvRmlsZU5hbWUodHJhbnNsYXRlKGdldE9iamVjdCgiU2V0dGluZ3MiKS0+c2l0ZVRpdGxlKSkuIi5pbnN0YWxsIjsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5jb21waWxlZEZpbGVzW10gPSAkdGhpcy0+aW5zdGFsbEZpbGU7CiAgICAgICAgICAgIAogICAgICAgICAgICBAX3VubGluaygkdGhpcy0+ZmlsZUxpc3RGaWxlKTsKICAgICAgICAgICAgQF91bmxpbmsoJHRoaXMtPmluc3RhbGxGaWxlKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+aW5zdGFsbEZpbGUpOyBleGl0OwogICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmluc3RhbGxGaWxlLCAiIiwgQ0hNT0RfV1JJVEUpOwogICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoZGlybmFtZSgkdGhpcy0+aW5zdGFsbEZpbGUpLiIvLmh0YWNjZXNzIiwgIlJlbW92ZUhhbmRsZXIgLmluc3RhbGxcbkFkZFR5cGUgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSAgLmluc3RhbGxcbiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5zdGVwID0gYXJyYXlfc2hpZnQoYXJyYXlfa2V5cygkdGhpcy0+c3RlcHMpKTsKICAgICAgICAgICAgJHRoaXMtPnN0ZXBJbmRleCA9IDA7CiAgICAgICAgICAgICR0aGlzLT5kaXJzID0gYXJyYXkoKTsKICAgICAgICAgICAgJHRoaXMtPmZpbGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgJHRoaXMtPmZpbGVJbmRleCA9IDA7CiAgICAgICAgICAgICR0aGlzLT5maWxlQ29udGVudEluZGV4ID0gMDsKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgaWYgKCEkdGhpcy0+c3RlcENvdW50KQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnN0ZXBDb3VudCA9IGNvdW50KCR0aGlzLT5zdGVwcyk7CiAgICAgICAgICAgICR0aGlzLT5zdGVwSW5kZXggPSAwOyAgICAgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgd2hpbGUoJHRoaXMtPnN0ZXBzKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnN0ZXBJbmRleCA9ICR0aGlzLT5zdGVwQ291bnQtY291bnQoJHRoaXMtPnN0ZXBzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQoJHRoaXMtPnN0ZXBzWyR0aGlzLT5zdGVwXSk7CiAgICAgICAgICAgICRtZXRob2ROYW1lID0gInJlc3VtZVBhY2siLiR0aGlzLT5zdGVwOwogICAgICAgICAgICAkdGhpcy0+JG1ldGhvZE5hbWUoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGFycmF5X3NoaWZ0KCR0aGlzLT5zdGVwcyk7CiAgICAgICAgICAgICR0aGlzLT5zdGVwID0gYXJyYXlfc2hpZnQoYXJyYXlfa2V5cygkdGhpcy0+c3RlcHMpKTsKICAgICAgICAgICAgLy8kdGhpcy0+c3RlcEluZGV4Kys7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnN0ZXBzKTsKICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOwogICAgICAgIH0KICAgICAgICAvL3Byb2Nlc3NQcm9ncmVzcygxMDApOwogICAgICAgIC8vcHJvY2Vzc1Byb2dyZXNzVGV4dCgiRmluaXNoZWQiKTsKICAgICAgICAKICAgIH0gICAgCiAgICAKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tQcm9qZWN0SGVhZGVyKCkKICAgIHsKICAgICAgICAkaGVhZGVyUGFyYW1zID0gYXJyYXkoCiAgICAgICAgICAgICJ1cGRhdGVzIiA9PiBhcnJheSgpLAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaChnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0TW9kdWxlcygpIGFzICRNb2R1bGUpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCRNb2R1bGUtPnVwZGF0ZXMgYXMgJHVwZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCR1cGRhdGVbInZlcnNpb24iXSA9PSAibW92ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGhlYWRlclBhcmFtc1sidXBkYXRlcyJdW10gPSAkdXBkYXRlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZmlsZXNpemUoJHRoaXMtPmluc3RhbGxGaWxlKSkKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gIkZJTEUgTk9UIEVNUFRZLi4uIEFMUkVBRFkgUlVOTklORz8iOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KICAgICAgICAkZiA9IGZvcGVuKCR0aGlzLT5pbnN0YWxsRmlsZSwgImErIik7CiAgICAgICAgJGluZm8gPSBhcnJheSgKICAgICAgICAgICAgInR5cGUiID0+ICJoZWFkZXIiLAogICAgICAgICAgICAiaW5zdGFsbFZlcnNpb24iID0+IElOU1RBTExQUk9DRVNTVkVSU0lPTiwKICAgICAgICAgICAgIm5hbWUiID0+IGdldE9iamVjdCgiU2V0dGluZ3MiKS0+c2l0ZVRpdGxlLAogICAgICAgICAgICAiY29tcHJlc3Npb24iID0+ICR0aGlzLT5wYXJhbXNbImNvbXByZXNzaW9uIl0sCiAgICAgICAgICAgICJwYXJhbXMiID0+ICRoZWFkZXJQYXJhbXMsCiAgICAgICAgKTsKICAgICAgICAvLyRzSW5mbyA9IFRKU09OOjplbmNvZGUoJGluZm8pOwogICAgICAgICRzSW5mbyA9ICR0aGlzLT5qc29uRW5jb2RlKCRpbmZvKTsKICAgICAgICAkdGhpcy0+ZndyaXRlKCRmLCBzdHJsZW4oJHNJbmZvKS4ifCIpOwogICAgICAgICR0aGlzLT5md3JpdGUoJGYsICRzSW5mbyk7CiAgICAgICAgZmNsb3NlKCRmKTsKCiAgICAgICAgJHRoaXMtPnN0ZXBQcm9ncmVzcyA9IDEwMDsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoKDEwMC8kdGhpcy0+c3RlcENvdW50KSokdGhpcy0+c3RlcEluZGV4ICsgKDEwMC8kdGhpcy0+c3RlcENvdW50KS8xMDAqJHRoaXMtPnN0ZXBQcm9ncmVzcyk7CiAgICB9CgogICAgZnVuY3Rpb24gb25HbG9iKCRkaXIpCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+c3RlcHNbJHRoaXMtPnN0ZXBdLiIgKCIuJGRpci4iKSIpOwogICAgICAgIC8vZXhpdDsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT5zdGVwc1skdGhpcy0+c3RlcF0uIiAoIi5zdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgIi8iLCAkZGlyKS4iKSIpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiByZXN1bWVQYWNrUHJvamVjdERpcmVjdG9yeUxpc3QoKQogICAgewogICAgICAgICRkaXJzID0gX2dsb2IoUFJPSkVDVFBBVEguIioiLCBHTE9CX0RJUlMsIGFycmF5KCR0aGlzLCAib25HbG9iIikpOwogICAgICAgICR0aGlzLT5kaXJzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCRkaXJzIGFzICRkaXIpCiAgICAgICAgewogICAgICAgICAgICAvL3Zhcl9kdW1wKCRkaXIpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKGNsZWFuTGluayhQUk9KRUNUUEFUSC4iL2NhY2hlIikpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gbmVzbWkgYnl0IC8gbmEga29uY2kgLi4gL2NhY2hlLwogICAgICAgICAgICBpZiAoc3RycG9zKCRkaXIsIGNsZWFuTGluayhQUk9KRUNUUEFUSC4iL2NhY2hlIikpICE9PSAwICYmIAogICAgICAgICAgICAgICAgc3RycG9zKCRkaXIsIGNsZWFuTGluayhQUk9KRUNUUEFUSC4iL19fdG1wIikpICE9PSAwICYmIAogICAgICAgICAgICAgICAgc3RycG9zKCRkaXIsIGNsZWFuTGluayhQUk9KRUNUUEFUSC4iL2NvbmZpZyIpKSAhPT0gMCAmJiAKICAgICAgICAgICAgICAgIHN0cnBvcygkZGlyLCBjbGVhbkxpbmsoUFJPSkVDVFBBVEguIi9pbWciKSkgIT09IDAgJiYgCiAgICAgICAgICAgICAgICBzdHJwb3MoJGRpciwgY2xlYW5MaW5rKFBST0pFQ1RQQVRILiIvcmVwb3NpdG9yeS90ZW1wIikpICE9PSAwICYmIAogICAgICAgICAgICAgICAgc3RycG9zKCRkaXIsIGNsZWFuTGluayhQUk9KRUNUUEFUSC4iL3JlcG9zaXRvcnkvdGVzdCIpKSAhPT0gMCAmJiAKICAgICAgICAgICAgICAgIHN0cnBvcygkZGlyLCBjbGVhbkxpbmsoUFJPSkVDVFBBVEguIi9jb3JlL2NsYXNzZXMvX25ldy9JbnN0YWxsL19fdG1wIikpICE9PSAwICYmIAogICAgICAgICAgICAgICAgc3RycG9zKCRkaXIsIGNsZWFuTGluayhQUk9KRUNUUEFUSC4iL2luc3RhbGwiKSkgIT09IDAgJiYgCiAgICAgICAgICAgICAgICBzdHJwb3MoJGRpciwgY2xlYW5MaW5rKFBST0pFQ1RQQVRILiIvYmFja3VwIikpICE9PSAwICYmIAogICAgICAgICAgICAgICAgISR0aGlzLT5pc0lnbm9yZWRGaWxlKCRkaXIpCiAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmRpcnNbXSA9ICRkaXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAvLyB2YXJfZHVtcCgkdGhpcy0+ZGlycyk7CiAgICAgICAgLy9leGl0OwogICAgICAgIAogICAgICAgICRmaWxlcyA9IF9nbG9iKFBST0pFQ1RQQVRILiIqIiwgR0xPQl9GSUxFUyk7CiAgICAgICAgJHRoaXMtPmZpbGVzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vaWYgKGJhc2VuYW1lKCRmaWxlKSAhPSAiaW5zdGFsbC5waHAiICYmIHN0cnBvcyhnZXRGaWxlTmFtZSgkZmlsZSksICJfYW50aWFsaWFzIikgPT09IEZBTFNFICYmICFpc19saW5rKCRmaWxlKSAmJiBnZXRGaWxlRXh0KCRmaWxlKSAhPSAiaW5zdGFsbCIpCiAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSWdub3JlZEZpbGUoJGZpbGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZXNbXSA9ICRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0aGlzLT5zdGVwUHJvZ3Jlc3MgPSAxMDA7CiAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKCgxMDAvJHRoaXMtPnN0ZXBDb3VudCkqJHRoaXMtPnN0ZXBJbmRleCArICgxMDAvJHRoaXMtPnN0ZXBDb3VudCkvMTAwKiR0aGlzLT5zdGVwUHJvZ3Jlc3MpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBpc0lnbm9yZWRGaWxlKCRmaWxlKQogICAgewogICAgICAgIGlmIChzdHJwb3MoZ2V0RmlsZU5hbWUoJGZpbGUpLCAiX2FudGlhbGlhcyIpICE9PSBGQUxTRSB8fCBpc19saW5rKCRmaWxlKSB8fCBnZXRGaWxlRXh0KCRmaWxlKSA9PSAiaW5zdGFsbCIgfHwgc3RycG9zKGdldEZpbGVOYW1lKCRmaWxlKSwgIl9fIikgPT09IDAgfHwgc3RycG9zKGJhc2VuYW1lKCRmaWxlKSwgIi5kZWJ1Zy5qc29uIikgIT09IEZBTFNFIHx8IAogICAgICAgICAgICAkZmlsZSA9PSBQUk9KRUNUUEFUSC4iY2FjaGUiIHx8ICRmaWxlID09IFBST0pFQ1RQQVRILiJpbWciIHx8ICRmaWxlID09IFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L3RlbXAiKQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgCiAgICAgICAgaWYgKCFpc19hcnJheSgkdGhpcy0+aWdub3JlZEZpbGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5pZ25vcmVkRmlsZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZGVmYXVsdElnbm9yZWRGaWxlcywgZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1siaWdub3JlZEZpbGVzIl0pKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+aWdub3JlZEZpbGVzIGFzICRpZ25vcmVkRmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdHJwb3Moc3RyX3JlcGxhY2UoUFJPSkVDVFBBVEgsICIvIiwgJGZpbGUpLCAkaWdub3JlZEZpbGUpID09PSAwIHx8IHN0cnBvcyhzdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgIi8iLCAkZmlsZSkuIi8iLCAkaWdub3JlZEZpbGUpID09PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KCiAgICAKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tGaWxlTGlzdCgpCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+ZGlycyk7CiAgICAgICAgLy9leGl0OwoKICAgICAgICB3aGlsZSgkdGhpcy0+ZGlycykKICAgICAgICB7CiAgICAgICAgICAgICRkaXIgPSAkdGhpcy0+ZGlyc1swXTsKICAgICAgICAgICAgJHRoaXMtPmZpbGVzW10gPSAkZGlyOwogICAgICAgICAgICAKICAgICAgICAgICAgJGZpbGVzID0gX2dsb2IoJGRpci4iLyoiLCBHTE9CX0ZJTEVTKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZGlyKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkZmlsZXMpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRkaXIuIi8qIik7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGZpbGVzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoJGkgPSAkdGhpcy0+ZmlsZUluZGV4IDsgJGkgPCBjb3VudCgkZmlsZXMpIDsgJGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGZpbGUgPSAkZmlsZXNbJGldOwogICAgICAgICAgICAgICAgLy9lY2hvICRmaWxlLiIgLSAiOwogICAgICAgICAgICAgICAgLy9lY2hvIGlzX2xpbmsoJGZpbGUpLiI8YnIgLz4iOwogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+aXNJZ25vcmVkRmlsZSgkZmlsZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVzW10gPSAkZmlsZTsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZUluZGV4ID0gJGkrMTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cmVzdW1lTmVlZGVkKCkpCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFycmF5X3NoaWZ0KCR0aGlzLT5kaXJzKTsKICAgICAgICAgICAgJHRoaXMtPmZpbGVJbmRleCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvL2V4aXQ7CgogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmZpbGVzKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgJHRoaXMtPnN0ZXBQcm9ncmVzcyA9IDEwMDsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoKDEwMC8kdGhpcy0+c3RlcENvdW50KSokdGhpcy0+c3RlcEluZGV4ICsgKDEwMC8kdGhpcy0+c3RlcENvdW50KS8xMDAqJHRoaXMtPnN0ZXBQcm9ncmVzcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tGaWxlcygpCiAgICB7CiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgLy9lY2hvICI8aHI+IjsKICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5maWxlcyk7CiAgICAgICAgLy9leGl0OwogICAgICAgIC8vcmV0dXJuOwogICAgICAgIC8vJHggPSAwOwogICAgICAgICRmID0gZm9wZW4oJHRoaXMtPmluc3RhbGxGaWxlLCAiYSsiKTsKICAgICAgICB3aGlsZSgkdGhpcy0+ZmlsZUluZGV4IDwgY291bnQoJHRoaXMtPmZpbGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlID0gJHRoaXMtPmZpbGVzWyR0aGlzLT5maWxlSW5kZXhdOwogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVsYXRpdmVGaWxlID0gc3RyX3JlcGxhY2UoUFJPSkVDVFBBVEgsICIvIiwgJGZpbGUpOwogICAgICAgICAgICAgICAgLy9pZiAoJHggJSAxMDAgPT0gMCkKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT5zdGVwc1skdGhpcy0+c3RlcF0uIiAiLiRyZWxhdGl2ZUZpbGUpOwogICAgICAgICAgICAgICAgLy8keCsrOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5maWxlQ29udGVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkZmlsZSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkaW5mbyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJkaXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICRyZWxhdGl2ZUZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kIiA9PiBnZXRtb2QoJGZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc19maWxlKCRmaWxlKSkgLy8gd2UgZG8gbm90IHdhbnQgdG8gYWRkIHN5bWxpbmtzCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcGhwRmlsZUNvbnRlbnQgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgJGpzRmlsZUNvbnRlbnQgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEZpbGVFeHQoJGZpbGUpID09ICJwaHAiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGhwRmlsZUNvbnRlbnQgPSBfZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBocEZpbGVDb250ZW50ID0gcHJlZ19yZXBsYWNlKCJ8PFxcPyhbIFxcdFxcclxcbl0pfGltcyIsICJcXDEiLCAkcGhwRmlsZUNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVDb250ZW50VG90YWwgPSBzdHJsZW4oJHBocEZpbGVDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRGaWxlRXh0KCRmaWxlKSA9PSAianMiICYmICR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRQYWNrTW9kdWxlIiAmJiBzdHJwb3MoJGZpbGUsICIuY2xhc3MuanMiKSAhPT0gRkFMU0UgJiYgb2JqZWN0RGVmaW5lZCgiSmF2YVNjcmlwdENvbXBpbGVyIikvKiAmJiBvYmplY3REZWZpbmVkKHN0cl9yZXBsYWNlKCIuY2xhc3MuanMiLCAiIiwgYmFzZW5hbWUoJGZpbGUpKSkqLykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGpzRmlsZUNvbnRlbnQgPSBfZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkanNGaWxlQ29udGVudCwgIi8qIENPTVBJTEVfRElTQUJMRUQgKi8iKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGpzRmlsZUNvbnRlbnQgPSBnZXRPYmplY3QoIkphdmFTY3JpcHRDb21waWxlciIpLT5jb21waWxlKCRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlQ29udGVudFRvdGFsID0gc3RybGVuKCRqc0ZpbGVDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJGpzRmlsZUNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVDb250ZW50VG90YWwgPSBfZmlsZXNpemUoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkaW5mbyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAkcmVsYXRpdmVGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiID0+ICR0aGlzLT5maWxlQ29udGVudFRvdGFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZCIgPT4gZ2V0bW9kKCRmaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEZpbGVFeHQoJGZpbGUpID09ICJwaHAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bImNoZWNrc3VtIl0gPSBtZDUoJHBocEZpbGVDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ2V0RmlsZUV4dCgkZmlsZSkgPT0gImpzIiAmJiAkanNGaWxlQ29udGVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWyJjaGVja3N1bSJdID0gbWQ1KCRqc0ZpbGVDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bImNoZWNrc3VtIl0gPSBtZDVfZmlsZSgkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vJHNJbmZvID0gVEpTT046OmVuY29kZSgkaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgJHNJbmZvID0gJHRoaXMtPmpzb25FbmNvZGUoJGluZm8pOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsIHN0cmxlbigkc0luZm8pLiJ8Iik7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgJHNJbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChpc19maWxlKCRmaWxlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RmlsZUV4dCgkZmlsZSkgPT0gInBocCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyID0gJHBocEZpbGVDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siY29tcHJlc3Npb24iXSA9PSAiZ3oiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNCdWZmZXIgPSBnemNvbXByZXNzKCRidWZmZXIsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc0J1ZmZlciA9ICRidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsIHN0cmxlbigkc0J1ZmZlcikuInwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgJHNCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRGaWxlRXh0KCRmaWxlKSA9PSAianMiICYmICRqc0ZpbGVDb250ZW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciA9ICRqc0ZpbGVDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siY29tcHJlc3Npb24iXSA9PSAiZ3oiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNCdWZmZXIgPSBnemNvbXByZXNzKCRidWZmZXIsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc0J1ZmZlciA9ICRidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsIHN0cmxlbigkc0J1ZmZlcikuInwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgJHNCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkZmYgPSBmb3BlbigkZmlsZSwgInJiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGZzZWVrKCRmZiwgJHRoaXMtPmZpbGVDb250ZW50SW5kZXgsIFNFRUtfU0VUKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlclNpemUgPSAxMDAqMTAyNDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIWZlb2YoJGZmKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciA9IGZyZWFkKCRmZiwgJGJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kdGhpcy0+ZndyaXRlKCRmLCAkYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJjb21wcmVzc2lvbiJdID09ICJneiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNCdWZmZXIgPSBnemNvbXByZXNzKCRidWZmZXIsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzQnVmZmVyID0gJGJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsIHN0cmxlbigkc0J1ZmZlcikuInwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsICRzQnVmZmVyKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT5zdGVwc1skdGhpcy0+c3RlcF0uIiAiLiRyZWxhdGl2ZUZpbGUuIiAoIi5yb3VuZCgkdGhpcy0+ZmlsZUNvbnRlbnRJbmRleC8xMDI0KS4ia0IgIi50cmFuc2xhdGUoIm9mIikuIiAiLnJvdW5kKCR0aGlzLT5maWxlQ29udGVudFRvdGFsLzEwMjQpLiJrQikiKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZUNvbnRlbnRJbmRleCArPSBzdHJsZW4oJGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5maWxlQ29udGVudEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRidWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bWVOZWVkZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZXN1bWVJbkJhY2tncm91bmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJHRoaXMtPnNsZWVwKDAuMDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNsZWVwKDAuMDAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZmKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZUNvbnRlbnRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+ZmlsZUluZGV4Kys7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+c3RlcFByb2dyZXNzID0gJHRoaXMtPmZpbGVJbmRleCoxMDAvY291bnQoJHRoaXMtPmZpbGVzKTsKICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKCgxMDAvJHRoaXMtPnN0ZXBDb3VudCkqJHRoaXMtPnN0ZXBJbmRleCArICgxMDAvJHRoaXMtPnN0ZXBDb3VudCkvMTAwKiR0aGlzLT5zdGVwUHJvZ3Jlc3MpOwogICAgICAgIH0KICAgICAgICBmY2xvc2UoJGYpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gcmVzdW1lUGFja1Byb2plY3RHZW5lcmF0ZURhdGFiYXNlU3RydWN0dXJlKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siZGF0YWJhc2UiXSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPnBhcmFtc1siZGF0YWJhc2UiXSBhcyAkdGFibGVOYW1lID0+ICRwYXJhbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZXNbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICJUYWJsZSIgPT4gJHRhYmxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gJHRhYmxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAic3RydWN0IiA9PiAkcGFyYW1zWyJzdHJ1Y3QiXSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSIgPT4gJHBhcmFtc1siZGF0YSJdLAogICAgICAgICAgICAgICAgICAgICJwYXJhbXMiID0+IGFycmF5KCksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICRfdGFibGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaChnZXRPYmplY3QoIlRhYmxlcyIpLT5nZXRUYWJsZXMoKSBhcyAkVGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUtPmdldERiTGluaygpID09IGdldERlZmF1bHREYkxpbmsoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGFibGVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmxlIiA9PiAkVGFibGUtPm5hbWUsIC8vJFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gJFRhYmxlLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAic3RydWN0IiA9PiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIgPT4gISRUYWJsZS0+dmlydHVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtcyIgPT4gYXJyYXkoKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRfdGFibGVzW10gPSAkVGFibGUtPm5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJHRhYmxlcyA9IGdldERlZmF1bHREYkxpbmsoKS0+Z2V0VGFibGVzKCk7CiAgICAgICAgICAgIGZvcmVhY2goJHRhYmxlcyBhcyAkdGFibGVOYW1lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KCR0YWJsZU5hbWUsICRfdGFibGVzKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGFibGVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmxlIiA9PiAkdGFibGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gJHRhYmxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVybiIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdCIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbXMiID0+IGFycmF5KCksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAkdGhpcy0+c3RlcFByb2dyZXNzID0gMTAwOwogICAgICAgIHByb2Nlc3NQcm9ncmVzcygoMTAwLyR0aGlzLT5zdGVwQ291bnQpKiR0aGlzLT5zdGVwSW5kZXggKyAoMTAwLyR0aGlzLT5zdGVwQ291bnQpLzEwMCokdGhpcy0+c3RlcFByb2dyZXNzKTsKICAgIH0gICAgCiAgICAKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tEYXRhYmFzZVN0cnVjdHVyZSgpCiAgICB7CiAgICAgICAgLy9lY2hvICIxIjsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgJGYgPSBmb3BlbigkdGhpcy0+aW5zdGFsbEZpbGUsICJhKyIpOwoKICAgICAgICAkaSA9IDA7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+dGFibGVzIGFzICRrZXkgPT4gJF90YWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJF90YWJsZSk7CiAgICAgICAgICAgIGlmICghJF90YWJsZVsic3RydWN0dXJlUHJvY2Vzc2VkIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZWNobyAiWzFdIjsKICAgICAgICAgICAgICAgIC8vZWNobyBnZXRNZW1vcnlVc2FnZSgpLiI8YnIgLz4iOwogICAgICAgICAgICAgICAgJF90YWJsZVsicGFyYW1zIl0gPSBleHRyYWN0UGFyYW1zKCRfdGFibGVbInBhcmFtcyJdLCIsIik7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1vZHVsZS0+bGFuZ3VhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJF90YWJsZVsic3RydWN0Il0gPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgJFRhYmxlID0gKHRhYmxlRXhpc3RzKCRfdGFibGVbIm5hbWUiXSkgPyBnZXRUYWJsZSgkX3RhYmxlWyJuYW1lIl0pIDogTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkVGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICRfdGFibGVbImRhdGEiXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRfdGFibGVbIm5hbWUiXSA9PSAibGF5b3V0cyIgfHwgJF90YWJsZVsibmFtZSJdID09ICJ0ZW1wbGF0ZXMiIHx8ICRfdGFibGVbIm5hbWUiXSA9PSAidHJhbnNsYXRpb25faXRlbXMiIHx8ICRfdGFibGVbIm5hbWUiXSA9PSAiaGVscCIpCiAgICAgICAgICAgICAgICAgICAgICAgICRfdGFibGVbInBhcmFtcyJdWyJmaWx0ZXJfbGFuZ3VhZ2UiXSA9ICR0aGlzLT5Nb2R1bGUtPmxhbmd1YWdlOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRfdGFibGVbIm5hbWUiXSAhPSAidHJhbnNsYXRpb25zIiAmJiAkX3RhYmxlWyJuYW1lIl0gIT0gInRyYW5zbGF0b3JzIikKICAgICAgICAgICAgICAgICAgICAgICAgJF90YWJsZVsiZGF0YSJdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICgkX3RhYmxlWyJuYW1lIl0gPT0gIm1vZHVsZXMiKQogICAgICAgICAgICAgICAgICAgICAgICAkX3RhYmxlWyJkYXRhIl0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1ska2V5XSA9ICRfdGFibGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0UGFja01vZHVsZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfdGFibGVbIm5hbWUiXSA9PSAibGF5b3V0cyIgfHwgJF90YWJsZVsibmFtZSJdID09ICJ0ZW1wbGF0ZXMiIHx8ICRfdGFibGVbIm5hbWUiXSA9PSAidHJhbnNsYXRpb25faXRlbXMiIHx8ICRfdGFibGVbIm5hbWUiXSA9PSAiaGVscCIpCiAgICAgICAgICAgICAgICAgICAgICAgICRfdGFibGVbInBhcmFtcyJdWyJmaWx0ZXJfbGFuZ3VhZ2UiXSA9ICJOVUxMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJF90YWJsZVsiZXh0ZXJuIl0gfHwgJF90YWJsZVsiYWxpYXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkaW5mbyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIgPT4gInRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICRfdGFibGVbIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVybiIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgeyAgICAKICAgICAgICAgICAgICAgICAgICAvLyRUYWJsZSA9IGdldFRhYmxlKCRfdGFibGVbIm5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgJGluZm8gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJ0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAkX3RhYmxlWyJuYW1lIl0sIC8vJFRhYmxlLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkaW5mb1siX3BhcmFtcyJdID0gZXh0cmFjdFBhcmFtcygkX3RhYmxlWyJwYXJhbXMiXSwiLCIpOwogICAgICAgICAgICAgICAgJGluZm9bIl9kYXRhIl0gPSAkX3RhYmxlWyJkYXRhIl07CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZWNobyAiWzExXSI7CiAgICAgICAgICAgICAgICBpZiAoJF90YWJsZVsiZGF0YSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJFRhYmxlLT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRpbmZvWyJfcGFyYW1zIl0pOwogICAgICAgICAgICAgICAgICAgIGlmICgkX3RhYmxlWyJleHRlcm4iXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZWNvcmRzID0gZ2V0RGVmYXVsdERiTGluaygpLT5zZWxlY3QoJF90YWJsZVsibmFtZSJdLCBhcnJheV9tZXJnZShhcnJheSgiZmllbGRzIj0+IkNPVU5UKCopIGFzIGNudCIpLCAkaW5mb1siX3BhcmFtcyJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWyJyZWNvcmRzIl0gPSAkcmVjb3Jkc1swXVsiY250Il07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEkX3RhYmxlWyJhbGlhcyJdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJbIi4kX3RhYmxlWyJuYW1lIl0uIl0iOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVFeGlzdHMoJF90YWJsZVsibmFtZSJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWyJyZWNvcmRzIl0gPSBnZXRUYWJsZSgkX3RhYmxlWyJuYW1lIl0pLT5nZXRSZWNvcmRDb3VudCgkaW5mb1siX3BhcmFtcyJdLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bInJlY29yZHMiXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZ2V0RGVmYXVsdERiTGluaygpLT5sYXN0U3FsUXVlcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRpbmZvWyJfcGFyYW1zIl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAkaW5mb1sicmVjb3JkcyJdID0gMDsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2VjaG8gIlsyXSI7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGF0YWJhc2VEYXRhVG90YWwgKz0gJGluZm9bInJlY29yZHMiXTsKCiAgICAgICAgICAgICAgICBpZiAoJF90YWJsZVsic3RydWN0Il0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzVGV4dCgiUGFja2luZyBkYXRhYmFzZSBzdHJ1Y3R1cmUgb2YgIi4kX3RhYmxlWyJuYW1lIl0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJF90YWJsZVsiZXh0ZXJuIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWyJwYXJhbXMiXSA9IGdldERlZmF1bHREYkxpbmsoKS0+Z2V0VGFibGVTdHJ1Y3R1cmUoJF90YWJsZVsibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bImZpZWxkcyJdID0gZ2V0RGVmYXVsdERiTGluaygpLT5nZXRGaWVsZHNTdHJ1Y3R1cmUoJF90YWJsZVsibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkaW5mb1siZmllbGRzIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhYmxlRXhpc3RzKCRfdGFibGVbIm5hbWUiXSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUgPSBnZXRUYWJsZSgkX3RhYmxlWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldE9iamVjdCgiVGFibGVzIiktPmlzQWxpYXNUYWJsZSgkX3RhYmxlWyJuYW1lIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhYmxlUGFyYW1zID0gZXh0cmFjdFBhcmFtcyhnZXRPYmplY3QoIlRhYmxlcyIpLT5hbGlhc1JlY29yZHNbJF90YWJsZVsibmFtZSJdXSwgIiIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhYmxlUGFyYW1zID0gZXh0cmFjdFBhcmFtcygkVGFibGUtPnNxbFJlY29yZCwgIiIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkVGFibGUtPnNxbFJlY29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bInBhcmFtcyJdID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaChnZXRUYWJsZSgidGFibGVzIiktPmdldEZpZWxkcygpIGFzICRGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkRmllbGQtPmF1dG9DcmVhdGVkICYmICEkRmllbGQtPmlzVmlydHVhbCgpICYmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0UGFja1Byb2plY3QiIHx8ICEkRmllbGQtPm1vZHVsZSAmJiAhZ2V0VGFibGUoInRhYmxlcyIpLT5nZXRGaWVsZCgkRmllbGQtPnBhcmVudCktPm1vZHVsZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bInBhcmFtcyJdWyRGaWVsZC0+bmFtZV0gPSAkdGFibGVQYXJhbXNbJEZpZWxkLT5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bInBhcmFtcyJdWyJkZWZhdWx0VmFsdWVzIl0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKGdldFRhYmxlKCJ0YWJsZXMiKS0+Z2V0RmllbGRzKCkgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRGaWVsZC0+aXNWaXJ0dWFsKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bInBhcmFtcyJdWyJkZWZhdWx0VmFsdWVzIl1bJEZpZWxkLT5uYW1lXSA9ICR0YWJsZVBhcmFtc1skRmllbGQtPm5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICB1bnNldCgkaW5mb1sicGFyYW1zIl1bImRlZmF1bHRWYWx1ZXMiXVsiZGVmYXVsdFZhbHVlcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bInBhcmFtcyJdWyJkZWZhdWx0VmFsdWVzIl0gPSBUSlNPTjo6ZW5jb2RlKCRpbmZvWyJwYXJhbXMiXVsiZGVmYXVsdFZhbHVlcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWyJmaWVsZHMiXSA9IGFycmF5KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKGdldE9iamVjdCgiVGFibGVzIiktPnJlY29yZHNbJF90YWJsZVsibmFtZSJdXSkgJiYgZ2V0T2JqZWN0KCJUYWJsZXMiKS0+cmVjb3Jkc1skX3RhYmxlWyJuYW1lIl1dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IC8vdmFyX2R1bXAoJGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRUYWJsZS0+dHlwZSA9PSAidHROb3JtYWwiIHx8ICRUYWJsZS0+dHlwZSA9PSAidHRGaWVsZEV4dGVuZGluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJFRhYmxlLT5nZXRGaWVsZHMoKSBhcyAkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkRmllbGQtPmF1dG9DcmVhdGVkICYmICgkdGhpcy0+cGFyYW1zWyJhY3Rpb25UeXBlIl0gPT0gImF0UGFja1Byb2plY3QiIHx8ICEkRmllbGQtPm1vZHVsZSAmJiAoISRGaWVsZC0+cGFyZW50IHx8ICEkVGFibGUtPmdldEZpZWxkKCRGaWVsZC0+cGFyZW50KS0+bW9kdWxlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRQYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRGaWVsZC0+c3FsUmVjb3JkLCAiIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRmaWVsZFBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyIC8+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kaW5mb1siZmllbGRzIl1bXSA9ICRmaWVsZFBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHphYnJhbmkgdmxvemVuaSBwb2xpLCBrdGVyZSBuZWpzb3UgcHJvIHRlbnRvIG1vZHVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfZmllbGRQYXJhbXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKGdldFRhYmxlKCJ0YWJsZV9maWVsZHMiKS0+Z2V0RmllbGRzKCkgYXMgJF9GaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkX0ZpZWxkLT5hdXRvQ3JlYXRlZCAmJiAhJF9GaWVsZC0+aXNWaXJ0dWFsKCkgJiYgKCR0aGlzLT5wYXJhbXNbImFjdGlvblR5cGUiXSA9PSAiYXRQYWNrUHJvamVjdCIgfHwgISRfRmllbGQtPm1vZHVsZSAmJiAoISRfRmllbGQtPnBhcmVudCB8fCAhZ2V0VGFibGUoInRhYmxlX2ZpZWxkcyIpLT5nZXRGaWVsZCgkX0ZpZWxkLT5wYXJlbnQpLT5tb2R1bGUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2ZpZWxkUGFyYW1zWyRfRmllbGQtPm5hbWVdID0gJGZpZWxkUGFyYW1zWyRfRmllbGQtPm5hbWVdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlLT5uYW1lID09ICJ0YWJsZV9maWVsZHMiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCRfRmllbGQtPm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCRfRmllbGQtPm1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJF9maWVsZFBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5mb1siZmllbGRzIl1bJEZpZWxkLT5uYW1lXSA9ICRfZmllbGRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkVGFibGUtPmdldEZpZWxkcygpIGFzICRGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRQYXJhbXMgPSBleHRyYWN0UGFyYW1zKCRGaWVsZC0+c3FsUmVjb3JkLCAiIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkZmllbGRQYXJhbXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bImZpZWxkcyJdWyRGaWVsZC0+bmFtZV1bImRlZmF1bHRWYWx1ZXMiXSA9ICRmaWVsZFBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGluZm9bImZpZWxkcyJdWyRGaWVsZC0+bmFtZV1bImRlZmF1bHRWYWx1ZXMiXVsiZGVmYXVsdFZhbHVlcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bImZpZWxkcyJdWyRGaWVsZC0+bmFtZV1bImRlZmF1bHRWYWx1ZXMiXSA9IFRKU09OOjplbmNvZGUoJGluZm9bImZpZWxkcyJdWyRGaWVsZC0+bmFtZV1bImRlZmF1bHRWYWx1ZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVGFibGUtPm5hbWUgPT0gInRhYmxlX2ZpZWxkcyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRUYWJsZS0+dHlwZSA9PSAidHRMaXN0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bImZpZWxkcyJdW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhVHlwZSIgPT4gInZhcmNoYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhVHlwZVBhcmFtcyIgPT4gIjI1NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4IiA9PiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5mb1siZmllbGRzIl1bXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAidmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhVHlwZSIgPT4gInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcigiQkFEIFRhYmxlLnR5cGU6ICIuJFRhYmxlLT50eXBlLiIgZm9yICciLiRfdGFibGVbIm5hbWUiXS4iJyIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiWCI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICB9ICAgCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICBpZiAoJGluZm9bIm5hbWUiXSA9PSAiY21zX2xheW91dHMiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXJfZHVtcCgkX3RhYmxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRpbmZvKTsKICAgICAgICAgICAgICAgICAgICAkc0luZm8gPSAkdGhpcy0+anNvbkVuY29kZSgkaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgc3RybGVuKCRzSW5mbykuInwiKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZndyaXRlKCRmLCAkc0luZm8pOwoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RlcFByb2dyZXNzID0gJGkqMTAwL2NvdW50KCR0aGlzLT50YWJsZXMpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzcygoMTAwLyR0aGlzLT5zdGVwQ291bnQpKiR0aGlzLT5zdGVwSW5kZXggKyAoMTAwLyR0aGlzLT5zdGVwQ291bnQpLzEwMCokdGhpcy0+c3RlcFByb2dyZXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZWNobyAiWzNdIjsKICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZUluZm9bXSA9ICRpbmZvOwogICAgICAgICAgICAgICAgJGkrKzsKCiAgICAgICAgICAgICAgICAvL2VjaG8gZ2V0TWVtb3J5VXNhZ2UoKS4iPGJyIC8+IjsKICAgICAgICAgICAgICAgICR0aGlzLT50YWJsZXNbJGtleV1bInN0cnVjdHVyZVByb2Nlc3NlZCJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vcHJvY2Vzc1Byb2dyZXNzVGV4dCgkaW5mb1sibmFtZSJdKTsKICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vaWYgKCR0aGlzLT5yZXN1bWVOZWVkZWQoMTApKSAvLyBwcm9jIDEwPyBrdnVsaSBwaXBuaS5jeiBzIG1heF9leGVjdXRpb25fdGltZSAsIGtkZSBqZSAxMCBwb3RyZWJhIHNuaXppdAogICAgICAgICAgICAgICAgLy9pZiAoJHRoaXMtPnJlc3VtZU5lZWRlZCgxMCwgNSoxMDI0KjEwMjQpKQogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXN1bWVOZWVkZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZXN1bWVJbkJhY2tncm91bmQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnRhYmxlSW5mbyk7CiAgICAgICAgLy9leGl0OwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gcmVzdW1lUGFja0RhdGFiYXNlRGF0YSgpCiAgICB7CiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgJHN0ZXAgPSAxMDA7CiAgICAgICAgJGYgPSBmb3BlbigkdGhpcy0+aW5zdGFsbEZpbGUsICJhKyIpOwogICAgICAgIAogICAgICAgIGZvciAoJGkgPSAwIDsgJGkgPCBjb3VudCgkdGhpcy0+dGFibGVJbmZvKSA7ICRpKyspCiAgICAgICAgewogICAgICAgICAgICAkdGFibGVJbmZvID0gJHRoaXMtPnRhYmxlSW5mb1skaV07CiAgICAgICAgICAgIGlmICghJHRhYmxlSW5mb1siX2ZpbmlzaGVkIl0gJiYgJHRhYmxlSW5mb1siX2RhdGEiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGFibGVJbmZvKTsKICAgICAgICAgICAgICAgIC8vZWNobyAkdGFibGVJbmZvWyJuYW1lIl0uIjxiciAvPiI7CiAgICAgICAgICAgICAgICAvL2VjaG8gZ2V0TWVtb3J5VXNhZ2UodHJ1ZSkuIjxiciAvPiI7CiAgICAgICAgICAgICAgICAvL2VjaG8gZ2V0TWVtb3J5VXNhZ2UodHJ1ZSkuIjxiciAvPiI7CiAgICAgICAgICAgICAgICBpZiAodGFibGVFeGlzdHMoJHRhYmxlSW5mb1sibmFtZSJdKSkKICAgICAgICAgICAgICAgICAgICAkVGFibGUgPSBnZXRUYWJsZSgkdGFibGVJbmZvWyJuYW1lIl0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5yZWNvcmRDb3VudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0YWJsZUluZm8pOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRhYmxlSW5mb1siX3BhcmFtcyJdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRhYmxlSW5mb1siZXh0ZXJuIl0gfHwgJFRhYmxlLT50eXBlID09ICJ0dExpc3QiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZHMgPSBnZXREZWZhdWx0RGJMaW5rKCktPnNlbGVjdCgkdGFibGVJbmZvWyJuYW1lIl0sIGFycmF5X21lcmdlKGFycmF5KCJmaWVsZHMiPT4iQ09VTlQoKikgYXMgY250IiksICR0YWJsZUluZm9bIl9wYXJhbXMiXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVjb3JkQ291bnQgPSAkcmVjb3Jkc1swXVsiY250Il07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCR0YWJsZUluZm9bImFsaWFzIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkcyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZWNvcmRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhYmxlRXhpc3RzKCR0YWJsZUluZm9bIm5hbWUiXSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlY29yZENvdW50ID0gJFRhYmxlLT5nZXRSZWNvcmRDb3VudCgkdGFibGVJbmZvWyJfcGFyYW1zIl0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVjb3JkQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5yZWNvcmRDb3VudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZWNobyAkdGhpcy0+cmVjb3JkQ291bnQuIjxiciAvPiI7CiAgICAgICAgICAgICAgICAvL2VjaG8gZ2V0TWVtb3J5VXNhZ2UodHJ1ZSkuIjxiciAvPiI7CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZWNvcmRDb3VudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzVGV4dCgkdGhpcy0+c3RlcHNbJHRoaXMtPnN0ZXBdLiIgIi4kVGFibGUtPm5hbWUuIiAoIi4oJHRoaXMtPnJlY29yZEluZGV4KzEpLiIgIi50cmFuc2xhdGUoIm9mIikuIiAiLiR0aGlzLT5yZWNvcmRDb3VudC4iIHJlY29yZHMpIik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRhYmxlSW5mb1siZXh0ZXJuIl0gfHwgJFRhYmxlLT50eXBlID09ICJ0dExpc3QiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkcyA9IGdldERlZmF1bHREYkxpbmsoKS0+c2VsZWN0KCR0YWJsZUluZm9bIm5hbWUiXSwgYXJyYXlfbWVyZ2UoJHRhYmxlSW5mb1siX3BhcmFtcyJdLCBhcnJheSgiYmVnaW4iPT4kdGhpcy0+cmVjb3JkSW5kZXgsICJsaW1pdCI9PiRzdGVwLCAicmF3IiA9PiB0cnVlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnTGFzdFNxbFF1ZXJ5ID0gZ2V0RGVmYXVsdERiTGluaygpLT5sYXN0U3FsUXVlcnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVjb3JkcyA9ICRUYWJsZS0+Z2V0UmVjb3JkcyhhcnJheV9tZXJnZSgkdGFibGVJbmZvWyJfcGFyYW1zIl0sIGFycmF5KCJiZWdpbiI9PiR0aGlzLT5yZWNvcmRJbmRleCwgImxpbWl0Ij0+JHN0ZXAsICJyYXciID0+IHRydWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWdMYXN0U3FsUXVlcnkgPSAkVGFibGUtPmxhc3RTcWxRdWVyeTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCRUYWJsZS0+bmFtZSA9PSAiZXZlbnRzIiAmJiAkcmVjb3Jkc1swXVsibW9kdWxlIl0gPT0gIjRlMDE3YWJmLWY3YmMtNGI3OC04NTU5LTI4MTg2MmUxZTI0ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXJfZHVtcChhcnJheV9tZXJnZSgkdGFibGVJbmZvWyJfcGFyYW1zIl0sIGFycmF5KCJiZWdpbiI9PiR0aGlzLT5yZWNvcmRJbmRleCwgImxpbWl0Ij0+JHN0ZXAsICJyYXciID0+IHRydWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRyZWNvcmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICRwcm9jZXNzZWRSZWNvcmRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkVGFibGUtPm5hbWUgPT0gImV2ZW50cyIgJiYgJHJlY29yZHNbMF1bIm1vZHVsZSJdID09ICI0ZTAxN2FiZi1mN2JjLTRiNzgtODU1OS0yODE4NjJlMWUyNGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVjaG8gInx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZHMgYXMgJHJlY29yZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGFibGVJbmZvWyJuYW1lIl0gPT0gInRyYW5zbGF0aW9uX2l0ZW1zIiAmJiAkcmVjb3JkWyJsYW5ndWFnZSJdID09ICJzayIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHRoaXMtPm1vZHVsZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCR0aGlzLT5jb21waWxlTGFuZ3VhZ2VzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfZHVtcCgkdGhpcy0+cGFyYW1zWyJsYW5ndWFnZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfZHVtcCgkdGhpcy0+cGFyYW1zWyJsYW5ndWFnZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHRhYmxlSW5mb1siX3BhcmFtcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfZHVtcCgkcmVjb3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoJFRhYmxlLT5uYW1lID09ICJldmVudHMiICYmICRyZWNvcmRbIm1vZHVsZSJdID09ICI0ZTAxN2FiZi1mN2JjLTRiNzgtODU1OS0yODE4NjJlMWUyNGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlY29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPm1vZHVsZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5tb2R1bGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbk1vZHVsZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZFsibW9kdWxlIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5tb2R1bGVzIGFzICRNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkTW9kdWxlLT5pZCA9PSAkcmVjb3JkWyJtb2R1bGUiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5Nb2R1bGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlLT5uYW1lID09ICJldmVudHMiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9kdW1wKCR0YWJsZUluZm9bIl9wYXJhbXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHJlY29yZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFBhY2tQcm9qZWN0IiB8fCAhJHJlY29yZFsibW9kdWxlIl0gfHwgJGluTW9kdWxlcyB8fCAhJHRoaXMtPm1vZHVsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga3Z1bGkga29tcGlsYWNpIHphbG96ZWsgZG8gbmFzdGF2ZW5pIChwb2t1ZCB2aWNlIG1vZHVsdSBzZGlsaSBzdGVqbm91IHphbG96a3UpIC0gYWxlIGZhY2hhIHRvIGkgcHJvIGppbmUgdGFidWxreSAtIHRhYmxlIGZpZWxkcz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3JlY29yZHMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVGFibGUtPnRyZWVLZXlGaWVsZCAmJiAkVGFibGUtPnRyZWVQYXJlbnRGaWVsZCAmJiAkcmVjb3JkWyJtb2R1bGUiXSAmJiAkcmVjb3JkWyRUYWJsZS0+dHJlZVBhcmVudEZpZWxkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlY29yZDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWNvcmQyID0gJHJlY29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFudGlMb29wID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoJHJlY29yZDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfcmVjb3Jkc1tdID0gJHJlY29yZDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRyZWNvcmQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcmVjb3JkMlskVGFibGUtPnRyZWVQYXJlbnRGaWVsZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY29yZDIgPSAkVGFibGUtPmdldFJlY29yZCgiZmlsdGVyXyIuJFRhYmxlLT50cmVlS2V5RmllbGQuIj0iLiRyZWNvcmQyWyRUYWJsZS0+dHJlZVBhcmVudEZpZWxkXS4iLGZpbHRlcl8iLiRUYWJsZS0+ZGV0YWlsRmllbGQuIj0iLiRyZWNvcmQyWyRUYWJsZS0+ZGV0YWlsRmllbGRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZDJbIm1vZHVsZSJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFudGlMb29wKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFudGlMb29wID4gMTAwKSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJMT09QIEdFVFRJTkcgUEFSRU5UIFRSRUUgUkVDT1JEPGJyPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHJlY29yZDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3JlY29yZHNbXSA9ICRyZWNvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnTGFzdFNxbFJlY29yZHMgPSAkX3JlY29yZHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoJFRhYmxlLT5uYW1lID09ICJldmVudHMiICYmICRfcmVjb3Jkc1swXVsibW9kdWxlIl0gPT0gIjRlMDE3YWJmLWY3YmMtNGI3OC04NTU5LTI4MTg2MmUxZTI0ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZWNobyAiLS0tLS0tLS0tLS0tLSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyX2R1bXAoJF9yZWNvcmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX3JlY29yZHMgYXMgJHJlY29yZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfcmVjb3JkID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YWJsZUluZm9bImV4dGVybiJdIHx8ICR0YWJsZUluZm9bImFsaWFzIl0gfHwgJFRhYmxlLT50eXBlID09ICJ0dExpc3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3JlY29yZCA9ICRyZWNvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRUYWJsZS0+Z2V0RmllbGRzKCkgYXMgJEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJEZpZWxkLT5hdXRvQ3JlYXRlZCAmJiAhJEZpZWxkLT5pc1ZpcnR1YWwoKSAmJiAoJHRoaXMtPnBhcmFtc1siYWN0aW9uVHlwZSJdID09ICJhdFBhY2tQcm9qZWN0IiB8fCAhJEZpZWxkLT5tb2R1bGUgJiYgKCEkRmllbGQtPnBhcmVudCB8fCAhJFRhYmxlLT5nZXRGaWVsZCgkRmllbGQtPnBhcmVudCktPm1vZHVsZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9yZWNvcmRbJEZpZWxkLT5uYW1lXSA9ICRyZWNvcmRbJEZpZWxkLT5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlLT5oYXNGaWVsZCgiZGVmYXVsdFZhbHVlcyIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfcmVjb3JkWyJkZWZhdWx0VmFsdWVzIl0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJFRhYmxlLT5nZXRGaWVsZHMoKSBhcyAkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRGaWVsZC0+aXNWaXJ0dWFsKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3JlY29yZFsiZGVmYXVsdFZhbHVlcyJdWyRGaWVsZC0+bmFtZV0gPSAkcmVjb3JkWyRGaWVsZC0+bmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9yZWNvcmRbImRlZmF1bHRWYWx1ZXMiXSA9IFRKU09OOjplbmNvZGUoJF9yZWNvcmRbImRlZmF1bHRWYWx1ZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGNvdW50KCRfcmVjb3JkcykgPiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyX2R1bXAoJF9yZWNvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluZm8gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiA9PiAicmVjb3JkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZSIgPT4gKCR0YWJsZUluZm9bImV4dGVybiJdID8gJHRhYmxlSW5mb1sibmFtZSJdIDogJFRhYmxlLT5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMiID0+ICRfcmVjb3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRzSW5mbyA9IFRKU09OOjplbmNvZGUoJGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc0luZm8gPSAkdGhpcy0+anNvbkVuY29kZSgkaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsIHN0cmxlbigkc0luZm8pLiJ8Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsICRzSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoJF9yZWNvcmRbImlkIl0gPT0gIjA4NjE2NzMyLTExMWQtNDFkYS1iOTk0LWE0MjQxM2NkMTQ4MSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyX2R1bXAoJHNJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCRUYWJsZS0+bmFtZSA9PSAiZXZlbnRzIiAmJiAkX3JlY29yZHNbMF1bIm1vZHVsZSJdID09ICI0ZTAxN2FiZi1mN2JjLTRiNzgtODU1OS0yODE4NjJlMWUyNGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhcl9kdW1wKCRzSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNldCgkaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRzSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGNvdW50KCRfcmVjb3JkcykgPiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhYmFzZURhdGFJbmRleCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb2Nlc3NlZFJlY29yZHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCRUYWJsZS0+bmFtZSA9PSAiZXZlbnRzIiAmJiAkX3JlY29yZHNbMF1bIm1vZHVsZSJdID09ICI0ZTAxN2FiZi1mN2JjLTRiNzgtODU1OS0yODE4NjJlMWUyNGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5yZXN1bWVOZWVkZWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnJlc3VtZU5lZWRlZCgpKSAvLyAxMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCRUYWJsZS0+bmFtZSA9PSAiZXZlbnRzIiAmJiAkX3JlY29yZHNbMF1bIm1vZHVsZSJdID09ICI0ZTAxN2FiZi1mN2JjLTRiNzgtODU1OS0yODE4NjJlMWUyNGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiQSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkVGFibGUtPm5hbWUgPT0gImV2ZW50cyIgJiYgJF9yZWNvcmRzWzBdWyJtb2R1bGUiXSA9PSAiNGUwMTdhYmYtZjdiYy00Yjc4LTg1NTktMjgxODYyZTFlMjRlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBlY2hvICJZIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQoKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZ2V0TWVtb3J5VXNhZ2UodHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVjb3JkSW5kZXggKz0gJHByb2Nlc3NlZFJlY29yZHM7IC8vY291bnQoJHJlY29yZHMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZWNvcmRJbmRleCA+PSAkdGhpcy0+cmVjb3JkQ291bnQtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlY29yZEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZWNvcmRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zbGVlcCgwLjAwMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnJlc3VtZU5lZWRlZCgpKSAvLyAxMAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RlcFByb2dyZXNzID0gJHRoaXMtPmRhdGFiYXNlRGF0YUluZGV4KjEwMC8kdGhpcy0+ZGF0YWJhc2VEYXRhVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzcygoMTAwLyR0aGlzLT5zdGVwQ291bnQpKiR0aGlzLT5zdGVwSW5kZXggKyAoMTAwLyR0aGlzLT5zdGVwQ291bnQpLzEwMCokdGhpcy0+c3RlcFByb2dyZXNzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9lY2hvIGdldE1lbW9yeVVzYWdlKHRydWUpLiI8aHIgLz4iOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+dGFibGVJbmZvWyRpXVsiX2ZpbmlzaGVkIl0gPSB0cnVlOwogICAgICAgIH0KICAgICAgICBmY2xvc2UoJGYpOwogICAgICAgIC8vZWNobyAiWFhYWFhYWFhYWFhYWFhYWFhYIjsKICAgICAgICAvL2V4aXQ7CiAgICB9ICAgIAoKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tFbmQoKQogICAgewogICAgICAgICRmID0gZm9wZW4oJHRoaXMtPmluc3RhbGxGaWxlLCAiYSsiKTsKCiAgICAgICAgJGluZm8gPSBhcnJheSgKICAgICAgICAgICAgInR5cGUiID0+ICJlbmQiLAogICAgICAgICAgICApOwoKICAgICAgICAkc0luZm8gPSAkdGhpcy0+anNvbkVuY29kZSgkaW5mbyk7CiAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgc3RybGVuKCRzSW5mbykuInwiKTsKICAgICAgICAkdGhpcy0+ZndyaXRlKCRmLCAkc0luZm8pOwoKCiAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbImNvbWJpbmVkIl0gJiYgIWNvdW50KCR0aGlzLT5jb21waWxlTGFuZ3VhZ2VzKSkKICAgICAgICB7CiAgICAgICAgICAgICRpbmZvID0gYXJyYXkoCiAgICAgICAgICAgICAgICAidHlwZSIgPT4gImVuZGNvbWJpbmVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRzSW5mbyA9ICR0aGlzLT5qc29uRW5jb2RlKCRpbmZvKTsKICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgc3RybGVuKCRzSW5mbykuInwiKTsKICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgJHNJbmZvKTsKICAgICAgICB9CgogICAgICAgIGZjbG9zZSgkZik7CiAgICAgICAgCiAgICAgICAgaWYgKC8qKCR0aGlzLT5wYXJhbXNbImNvbWJpbmVkIl0gJiYgIWNvdW50KCR0aGlzLT5jb21waWxlTGFuZ3VhZ2VzKSkgfHwgKi8hY291bnQoJHRoaXMtPmNvbXBpbGVMYW5ndWFnZXMpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5Nb2R1bGUtPmlkKQogICAgICAgICAgICAgICAgZ2V0VGFibGUoIm1vZHVsZXMiKS0+dXBkYXRlUmF3UmVjb3JkKGFycmF5KCJpZCI9PiR0aGlzLT5Nb2R1bGUtPmlkLCAiY29tcGlsZURhdGUiPT5ub3coKSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKDEwMCk7CiAgICAgICAgICAgICRwcm9ncmVzc1RleHQgPSB0cmFuc2xhdGUoIkZpbmlzaGVkIikuIi48YnI+IjsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+Y29tcGlsZWRGaWxlcyBhcyAkY29tcGlsZWRGaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcHJvZ3Jlc3NUZXh0IC49IHRyYW5zbGF0ZSgiRG93bmxvYWQiKS4iIDxhIGhyZWY9JyIuZ2V0VXJsRnJvbVBhdGgoJGNvbXBpbGVkRmlsZSkuIic+Ii5iYXNlbmFtZSgkY29tcGlsZWRGaWxlKS4iPC9hPjxicj4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQoJHByb2dyZXNzVGV4dCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRTdWJNb2R1bGVzKCRNb2R1bGUpCiAgICB7CiAgICAgICAgJHRoaXMtPm1vZHVsZXNbXSA9ICRNb2R1bGU7CiAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT5tb2R1bGVzIGFzICRfbW9kdWxlKQogICAgICAgIHsKICAgICAgICAgICAgJFN1Yk1vZHVsZSA9IGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRNb2R1bGUoJF9tb2R1bGVbIm1vZHVsZSJdKTsKICAgICAgICAgICAgaWYgKCEkU3ViTW9kdWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICJTdWJtb2R1bGUgaW4gJyIuJE1vZHVsZS0+bmFtZS4iJyBub3QgZm91bmQiOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+Z2V0U3ViTW9kdWxlcygkU3ViTW9kdWxlKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldERlcGVuZGVudE1vZHVsZXMoJE1vZHVsZSkKICAgIHsKICAgICAgICBmb3JlYWNoKCRNb2R1bGUtPmRlcGVuZHMgYXMgJF9tb2R1bGUpCiAgICAgICAgewogICAgICAgICAgICAkU3ViTW9kdWxlID0gZ2V0T2JqZWN0KCJNb2R1bGVzIiktPmdldE1vZHVsZSgkX21vZHVsZVsibW9kdWxlIl0pOwogICAgICAgICAgICAkdGhpcy0+bW9kdWxlc1tdID0gJFN1Yk1vZHVsZTsKICAgICAgICAgICAgaWYgKCEkU3ViTW9kdWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICJEZXBlbmRlbnQgc3VibW9kdWxlIGluICciLiRNb2R1bGUtPm5hbWUuIicgbm90IGZvdW5kIjsKICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmdldERlcGVuZGVudE1vZHVsZXMoJFN1Yk1vZHVsZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tNb2R1bGUoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPk1vZHVsZSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5zdGVwcyA9IGFycmF5KAogICAgICAgICAgICAgICAgLy8iZGlyZWN0b3J5bGlzdCIgPT4gIkdlbmVyYXRpbmcgZGlyZWN0b3J5IGxpc3QiLAogICAgICAgICAgICAgICAgIkZpbGVMaXN0IiA9PiAiR2VuZXJhdGluZyBmaWxlIGxpc3QiLAogICAgICAgICAgICAgICAgIk1vZHVsZUhlYWRlciIgPT4gIkdlbmVyYXRpbmcgaW5zdGFsbCBmaWxlIGhlYWRlciIsCiAgICAgICAgICAgICAgICAiRmlsZXMiID0+ICJQYWNraW5nIGZpbGVzIiwKICAgICAgICAgICAgICAgICJNb2R1bGVHZW5lcmF0ZURhdGFiYXNlU3RydWN0dXJlIiA9PiAiR2VuZXJhdGluZyBkYXRhYmFzZSBzdHJ1Y3R1cmUiLAogICAgICAgICAgICAgICAgIkRhdGFiYXNlU3RydWN0dXJlIiA9PiAiUGFja2luZyBkYXRhYmFzZSBzdHJ1Y3R1cmUiLAogICAgICAgICAgICAgICAgIkRhdGFiYXNlRGF0YSIgPT4gIlBhY2tpbmcgZGF0YWJhc2UgZGF0YSIsCiAgICAgICAgICAgICAgICAiTW9kdWxlSW5mbyIgPT4gIlBhY2tpbmcgbW9kdWxlIGluZm8iLAogICAgICAgICAgICAgICAgIkVuZCIgPT4gIkZpbmlzaGluZyBmaWxlIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICR0aGlzLT5Nb2R1bGUgPSBnZXRPYmplY3QoIk1vZHVsZXMiKS0+Z2V0TW9kdWxlKCR0aGlzLT5wYXJhbXNbIm1vZHVsZUlkIl0pOwogICAgICAgICAgICBpZiAoJHRoaXMtPk1vZHVsZS0+bGFuZ3VhZ2UpCiAgICAgICAgICAgICAgICAkdGhpcy0+TW9kdWxlLT5sYW5ndWFnZVBhY2sgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+Y29tcGlsZUxhbmd1YWdlcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vJHRoaXMtPnBhcmFtc1sibGFuZ3VhZ2VzIl0gPSBhcnJheSgiY3MiKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnBhcmFtcyk7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1sibGFuZ3VhZ2VzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+TW9kdWxlLT5sYW5ndWFnZVBhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUxhbmd1YWdlcyA9ICR0aGlzLT5wYXJhbXNbImxhbmd1YWdlcyJdOyAKICAgICAgICAgICAgICAgICAgICAgICAgLy8kdGhpcy0+Y29tcGlsZUxhbmd1YWdlcyA9IGFycmF5KCIiLCAiZW4iLCAiY3MiLCAic2siLCAic3YiLCAicnUiKTsgLy8gdGVtcG9yYXJ5IC0gYXQgbmVrb21waWx1anUgdnNlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPnBhcmFtc1sibGFuZ3VhZ2VzIl0pOyBleGl0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlTGFuZ3VhZ2VzID0gJHRoaXMtPnBhcmFtc1sibGFuZ3VhZ2VzIl07IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlTGFuZ3VhZ2VzID0gYXJyYXkoIiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUxhbmd1YWdlID0gYXJyYXlfc2hpZnQoJHRoaXMtPmNvbXBpbGVMYW5ndWFnZXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPmRpcnMgPSBhcnJheSgpOwogICAgICAgICAgICAkdGhpcy0+ZmlsZXMgPSBhcnJheSgpOwoKICAgICAgICAgICAgJHRoaXMtPmdldFN1Yk1vZHVsZXMoJHRoaXMtPk1vZHVsZSk7CgogICAgICAgICAgICAkbW9kdWxlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPm1vZHVsZXMgYXMgJE1vZHVsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCEkbW9kdWxlc1skTW9kdWxlLT5pZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJG1vZHVsZXNbJE1vZHVsZS0+aWRdID0gJE1vZHVsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+bW9kdWxlcyA9ICRtb2R1bGVzOwogICAgICAgICAgICB1bnNldCgkbW9kdWxlcyk7CgogICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5tb2R1bGVzIGFzICRNb2R1bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRfZmlsZXMgPSBleHBsb2RlTGlzdCgkTW9kdWxlLT5maWxlcyk7CiAgICAgICAgICAgICAgICBpZiAoJE1vZHVsZS0+b25HZXRGaWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkX2ZpbGVzMiA9IF9fZXZhbCgkTW9kdWxlLT5vbkdldEZpbGVzKTsKICAgICAgICAgICAgICAgICAgICAkX2ZpbGVzID0gX2FycmF5X21lcmdlKCRfZmlsZXMsICRfZmlsZXMyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvcmVhY2goJF9maWxlcyBhcyAkcmVsYXRpdmVGaWxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHJlbGF0aXZlRmlsZSwgUFJPSkVDVFBBVEgpID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgJGFic29sdXRlRmlsZSA9IGNsZWFuTGluayhQUk9KRUNUUEFUSC4kcmVsYXRpdmVGaWxlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRhYnNvbHV0ZUZpbGUgPSBjbGVhbkxpbmsoJHJlbGF0aXZlRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGFic29sdXRlRmlsZSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGlyc1tdID0gJGFic29sdXRlRmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRpcnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZGlycywgX2dsb2IoJGFic29sdXRlRmlsZS4iLyoiLCBHTE9CX0RJUlMsIHRydWUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVzW10gPSAkYWJzb2x1dGVGaWxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT50YWJsZXMgYXMgJF90YWJsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoX2ZpbGVfZXhpc3RzKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5L2xheW91dC9hZG1pbi9pY29ucy8iLiRfdGFibGVbInRhYmxlTmFtZSJdLiIucG5nIikpCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlc1tdID0gUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvbGF5b3V0L2FkbWluL2ljb25zLyIuJF90YWJsZVsidGFibGVOYW1lIl0uIi5wbmciOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkcmVjb3JkcyA9IGdldFRhYmxlKCJhZG1pbl9tZW51IiktPmdldFJlY29yZHMoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHJlY29yZHMgYXMgJHJlY29yZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZFsibW9kdWxlIl0gPT0gJE1vZHVsZS0+aWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJlY29yZFsiaWNvbiJdICYmIF9maWxlX2V4aXN0cyhQUk9KRUNUUEFUSC4kcmVjb3JkWyJpY29uIl0pICYmICFpbl9hcnJheShQUk9KRUNUUEFUSC4kcmVjb3JkWyJpY29uIl0sICR0aGlzLT5maWxlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlc1tdID0gUFJPSkVDVFBBVEguJHJlY29yZFsiaWNvbiJdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGljb25GaWxlID0gJHJlY29yZFsibmFtZSJdLiIucG5nIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpY29uRmlsZSA9IF9zdHJ0b2xvd2VyKCRpY29uRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaWNvbkZpbGUgPSBzdHJfcmVwbGFjZSgiICIsICJfIiwgJGljb25GaWxlKTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGljb25GaWxlID0gZmluZEZpbGUoJGljb25GaWxlLCBhcnJheSgiL3JlcG9zaXRvcnkvbGF5b3V0L2FkbWluL2ljb25zLyIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpY29uRmlsZSAmJiAhaW5fYXJyYXkoJGljb25GaWxlLCAkdGhpcy0+ZmlsZXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlc1tdID0gJGljb25GaWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+ZGlycyk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmZpbGVzKTsKICAgICAgICAgICAgLy9leGl0OwogICAgICAgIAogICAgICAgICAgICAkdGhpcy0+ZmlsZUxpc3RGaWxlID0gUFJPSkVDVFBBVEguInJlcG9zaXRvcnkvdGVtcC9pbnN0YWxsLmZpbGVsaXN0IjsKICAgICAgICAgICAgLy8kdGhpcy0+aW5zdGFsbEZpbGUgPSBQUk9KRUNUUEFUSC4icmVwb3NpdG9yeS90ZW1wLyIuJHRoaXMtPk1vZHVsZS0+bmFtZS4iLiIuJHRoaXMtPk1vZHVsZS0+dmVyc2lvbi4iLiIuKGNvdW50KCR0aGlzLT5Nb2R1bGUtPm1vZHVsZXMpID8gInBhY2thZ2UiIDogIm1vZHVsZSIpLiIuaW5zdGFsbCI7CiAgICAgICAgICAgIGlmICgkdGhpcy0+Y29tcGlsZUxhbmd1YWdlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5wYXJhbXNbImNvbWJpbmVkIl0pCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmluc3RhbGxGaWxlID0gUFJPSkVDVFBBVEguImluc3RhbGwvIi4kdGhpcy0+TW9kdWxlLT5nZXRGaWxlTmFtZSgpLiIuIi4kdGhpcy0+Y29tcGlsZUxhbmd1YWdlLiIubW9kdWxlLmluc3RhbGwiOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbnN0YWxsRmlsZSA9IFBST0pFQ1RQQVRILiJpbnN0YWxsLyIuJHRoaXMtPk1vZHVsZS0+Z2V0RmlsZU5hbWUoKS4iLm1vZHVsZS5pbnN0YWxsIjsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR0aGlzLT5Nb2R1bGUtPmxhbmd1YWdlID0gJHRoaXMtPmNvbXBpbGVMYW5ndWFnZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkdGhpcy0+aW5zdGFsbEZpbGUgPSBQUk9KRUNUUEFUSC4iaW5zdGFsbC8iLiR0aGlzLT5Nb2R1bGUtPmdldEZpbGVOYW1lKCkuIi5tb2R1bGUuaW5zdGFsbCI7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5wYXJhbXNbImNvbWJpbmVkIl0gfHwgIWNvdW50KCR0aGlzLT5jb21waWxlZEZpbGVzKSkKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlZEZpbGVzW10gPSAkdGhpcy0+aW5zdGFsbEZpbGU7CgogICAgICAgICAgICBpZiAoJHRoaXMtPk1vZHVsZS0+bGFuZ3VhZ2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5zdGVwc1siRmlsZUxpc3QiXSk7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+c3RlcHNbIkZpbGVzIl0pOwogICAgICAgICAgICAgICAgLy91bnNldCgkdGhpcy0+c3RlcHNbIkRhdGFiYXNlU3RydWN0dXJlIl0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBAX3VubGluaygkdGhpcy0+ZmlsZUxpc3RGaWxlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghJHRoaXMtPnBhcmFtc1siY29tYmluZWQiXSB8fCAhJHRoaXMtPmNvbXBpbGVMYW5ndWFnZSkKICAgICAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdGhpcy0+aW5zdGFsbEZpbGUsICIiLCBDSE1PRF9XUklURSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgX2ZpbGVfcHV0X2NvbnRlbnRzKGRpcm5hbWUoJHRoaXMtPmluc3RhbGxGaWxlKS4iLy5odGFjY2VzcyIsICJSZW1vdmVIYW5kbGVyIC5pbnN0YWxsXG5BZGRUeXBlICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0gIC5pbnN0YWxsXG4iKTsKCiAgICAgICAgICAgICR0aGlzLT5zdGVwID0gYXJyYXlfc2hpZnQoYXJyYXlfa2V5cygkdGhpcy0+c3RlcHMpKTsKICAgICAgICAgICAgJHRoaXMtPnN0ZXBJbmRleCA9IDA7CiAgICAgICAgICAgICR0aGlzLT5maWxlSW5kZXggPSAwOwogICAgICAgICAgICAkdGhpcy0+ZmlsZUNvbnRlbnRJbmRleCA9IDA7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoISR0aGlzLT5zdGVwQ291bnQpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+c3RlcENvdW50ID0gY291bnQoJHRoaXMtPnN0ZXBzKTsKICAgICAgICAgICAgJHRoaXMtPnN0ZXBJbmRleCA9IDA7ICAgICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICB3aGlsZSgkdGhpcy0+c3RlcHMpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+c3RlcEluZGV4ID0gJHRoaXMtPnN0ZXBDb3VudC1jb3VudCgkdGhpcy0+c3RlcHMpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9wcm9jZXNzUHJvZ3Jlc3NUZXh0KCR0aGlzLT5zdGVwc1skdGhpcy0+c3RlcF0pOwogICAgICAgICAgICAkbWV0aG9kTmFtZSA9ICJyZXN1bWVQYWNrIi4kdGhpcy0+c3RlcDsKICAgICAgICAgICAgLy9nbG9iYWwgJF9fc2NyaXB0U3RhcnRUaW1lOwogICAgICAgICAgICAvL2VjaG8gZGF0ZSgiWS1tLWQgSDppOnMiKS4iOiAiLiRtZXRob2ROYW1lLiI8YnI+Ii4kdGhpcy0+aW5zdGFsbEZpbGUuIiAoIi4kdGhpcy0+Y29tcGlsZUxhbmd1YWdlLiIpIi4iPGJyPiI7CiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgpOwogICAgICAgICAgICAvL2VjaG8gZGF0ZSgiWS1tLWQgSDppOnMiKS4iPGhyPiI7CiAgICAgICAgICAgIAogICAgICAgICAgICBhcnJheV9zaGlmdCgkdGhpcy0+c3RlcHMpOwogICAgICAgICAgICAkdGhpcy0+c3RlcCA9IGFycmF5X3NoaWZ0KGFycmF5X2tleXMoJHRoaXMtPnN0ZXBzKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJHRoaXMtPnN0ZXBzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKERPTUFJTiwgImNvcmUyLnZpc3VhbC1waHAuY29tIikgIT09IEZBTFNFIHx8ICR0aGlzLT5yZXN1bWVOZWVkZWQoKSkKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVzdW1lSW5CYWNrZ3JvdW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8kdGhpcy0+c3RlcEluZGV4Kys7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y29tcGlsZUxhbmd1YWdlcykpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+TW9kdWxlID0gTlVMTDsKICAgICAgICAgICAgJHRoaXMtPnJlc3VtZUluQmFja2dyb3VuZCgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgCiAgICB9ICAgIAogICAgCiAgICBmdW5jdGlvbiByZXN1bWVQYWNrTW9kdWxlSGVhZGVyKCkKICAgIHsKICAgICAgICAkZiA9IGZvcGVuKCR0aGlzLT5pbnN0YWxsRmlsZSwgImErIik7CiAgICAgICAgJGRlc2NyaXB0aW9uID0gYXJyYXkoKTsKICAgICAgICAkdGl0bGUgPSBhcnJheSgpOwogICAgICAgIGlmICh0cnVlIHx8ICEkdGhpcy0+TW9kdWxlLT5sYW5ndWFnZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vJHJlY29yZHMgPSBnZXRUYWJsZSgiaGVscCIpLT5nZXRSZWNvcmRzKCJmaWx0ZXJfbW9kdWxlPSIuJHRoaXMtPk1vZHVsZS0+aWQuIixmaWx0ZXJfdHlwZT10ZXh0fG9iamVjdCIpOwogICAgICAgICAgICAvL2ZvcmVhY2goJHJlY29yZHMgYXMgJHJlY29yZCkKICAgICAgICAgICAgLy97CiAgICAgICAgICAgIC8vICAgICRkZXNjcmlwdGlvblskcmVjb3JkWyJsYW5ndWFnZSJdXSA9ICRyZWNvcmRbInRleHQiXTsKICAgICAgICAgICAgLy99CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3JlYWNoKGdldE9iamVjdCgiVHJhbnNsYXRvcnMiKS0+Z2V0TGFuZ3VhZ2VzKCkgYXMgJGxhbmd1YWdlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2lmIChnZXRUYWJsZSgidHJhbnNsYXRpb25faXRlbXMiKS0+Z2V0UmVjb3JkKCJmaWx0ZXJfdGV4dD0iLiR0aGlzLT5Nb2R1bGUtPm5hbWUuIixmaWx0ZXJfbGFuZ3VhZ2U9Ii4kbGFuZ3VhZ2UpKQogICAgICAgICAgICAgICAgICAgICR0aXRsZVskbGFuZ3VhZ2VdID0gdHJhbnNsYXRlKCR0aGlzLT5Nb2R1bGUtPm5hbWUsICRsYW5ndWFnZSk7CiAgICAgICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChnZXRUYWJsZSgidHJhbnNsYXRpb25faXRlbXMiKS0+Z2V0UmVjb3JkKCJmaWx0ZXJfdGV4dD0iLiR0aGlzLT5Nb2R1bGUtPm5hbWUuIkRlc2NyaXB0aW9uLGZpbHRlcl9sYW5ndWFnZT0iLiRsYW5ndWFnZSkpCiAgICAgICAgICAgICAgICAgICAgJGRlc2NyaXB0aW9uWyRsYW5ndWFnZV0gPSB0cmFuc2xhdGUoJHRoaXMtPk1vZHVsZS0+bmFtZS4iRGVzY3JpcHRpb24iLCAkbGFuZ3VhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRpbmZvID0gYXJyYXkoCiAgICAgICAgICAgICJ0eXBlIiA9PiAiaGVhZGVyIiwKICAgICAgICAgICAgImluc3RhbGxWZXJzaW9uIiA9PiBJTlNUQUxMUFJPQ0VTU1ZFUlNJT04sCiAgICAgICAgICAgICJ2ZXJzaW9uIiA9PiAkdGhpcy0+TW9kdWxlLT52ZXJzaW9uLAogICAgICAgICAgICAibmFtZSIgPT4gJHRoaXMtPk1vZHVsZS0+bmFtZSwKICAgICAgICAgICAgImlkIiA9PiAkdGhpcy0+TW9kdWxlLT5pZCwKICAgICAgICAgICAgImNvbXByZXNzaW9uIiA9PiAkdGhpcy0+cGFyYW1zWyJjb21wcmVzc2lvbiJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iID0+ICRkZXNjcmlwdGlvbiwKICAgICAgICAgICAgInRpdGxlIiA9PiAkdGl0bGUsCiAgICAgICAgICAgICJsYW5ndWFnZSIgPT4gJHRoaXMtPk1vZHVsZS0+bGFuZ3VhZ2UsCiAgICAgICAgICAgICJwYXJhbXMiID0+ICR0aGlzLT5Nb2R1bGUtPnBhcmFtcywKICAgICAgICAgICAgImNvbWJpbmVkIiA9PiB0b0Jvb2woJHRoaXMtPnBhcmFtc1siY29tYmluZWQiXSksCiAgICAgICAgICAgICJsYW5ndWFnZVBhY2siID0+ICR0aGlzLT5Nb2R1bGUtPmxhbmd1YWdlUGFjaywKICAgICAgICApOwoKICAgICAgICBpZiAoJHRoaXMtPk1vZHVsZS0+bGFuZ3VhZ2UpCiAgICAgICAgICAgIHVuc2V0KCRpbmZvWyJwYXJhbXMiXVsibW9kdWxlcyJdKTsKICAgICAgICAKICAgICAgICAkdXBkYXRlcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+bW9kdWxlcyBhcyAkTW9kdWxlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT51cGRhdGVzIGFzICR1cGRhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR1cGRhdGVzW10gPSAkdXBkYXRlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRpbmZvWyJwYXJhbXMiXVsidXBkYXRlcyJdID0gJHVwZGF0ZXM7CgogICAgICAgIC8vJHNJbmZvID0gVEpTT046OmVuY29kZSgkaW5mbyk7CiAgICAgICAgJHNJbmZvID0gJHRoaXMtPmpzb25FbmNvZGUoJGluZm8pOwogICAgICAgICR0aGlzLT5md3JpdGUoJGYsIHN0cmxlbigkc0luZm8pLiJ8Iik7CiAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgJHNJbmZvKTsKICAgICAgICBmY2xvc2UoJGYpOwoKICAgICAgICAkdGhpcy0+c3RlcFByb2dyZXNzID0gMTAwOwogICAgICAgIHByb2Nlc3NQcm9ncmVzcygoMTAwLyR0aGlzLT5zdGVwQ291bnQpKiR0aGlzLT5zdGVwSW5kZXggKyAoMTAwLyR0aGlzLT5zdGVwQ291bnQpLzEwMCokdGhpcy0+c3RlcFByb2dyZXNzKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXN1bWVQYWNrTW9kdWxlR2VuZXJhdGVEYXRhYmFzZVN0cnVjdHVyZSgpCiAgICB7CiAgICAgICAgJHRoaXMtPnRhYmxlcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+bW9kdWxlcyBhcyAkTW9kdWxlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT50YWJsZXMgYXMgJF90YWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRhYmxlID0gKHRhYmxlRXhpc3RzKCRfdGFibGVbInRhYmxlTmFtZSJdKSA/IGdldFRhYmxlKCRfdGFibGVbInRhYmxlTmFtZSJdKSA6IE5VTEwpOwogICAgICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgLy8iVGFibGUiID0+ICRUYWJsZSA/ICRUYWJsZS0+bmFtZSA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICRfdGFibGVbInRhYmxlTmFtZSJdLAogICAgICAgICAgICAgICAgICAgICJzdHJ1Y3QiID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImV4dGVybiIgPT4gJFRhYmxlID8gZmFsc2UgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJkYXRhIiA9PiAoISRUYWJsZSB8fCAkVGFibGUtPmdldERiTGluaygpID09IGdldERlZmF1bHREYkxpbmsoKSA/ICRfdGFibGVbImRhdGEiXSA6IGZhbHNlKSwKICAgICAgICAgICAgICAgICAgICAicGFyYW1zIiA9PiBleHRyYWN0UGFyYW1zKCRfdGFibGVbInBhcmFtcyJdKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT5kYXRhIGFzICRfZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRhYmxlID0gKHRhYmxlRXhpc3RzKCRfZGF0YVsidGFibGVOYW1lIl0pID8gZ2V0VGFibGUoJF9kYXRhWyJ0YWJsZU5hbWUiXSkgOiBOVUxMKTsKICAgICAgICAgICAgICAgIGlmICghJFRhYmxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVjaG8gIlRhYmxlICciLiRfZGF0YVsidGFibGVOYW1lIl0uIicgbm90IGZvdW5kIjsKICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRUYWJsZS0+Z2V0RGJMaW5rKCkgPT0gZ2V0RGVmYXVsdERiTGluaygpICYmICEkVGFibGUtPnZpcnR1YWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIlRhYmxlIiA9PiAkVGFibGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAkVGFibGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3QiID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtcyIgPT4gJF9kYXRhWyJwYXJhbXMiXSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBmb3JlYWNoKGdldE9iamVjdCgiVGFibGVzIiktPmdldFRhYmxlcygpIGFzICRUYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGV0byBwb2RtaW5jZSBuZXJvenVtaW0gKHV6IGFzaSBhbm8gLSBwb2t1ZCBqZGUgbyBlbXB0eXBhY2thZ2UsIG5lc21pIGJ5dCB0YWJsZV9maWVsZHMsIGppbmFrIHZzZSkKICAgICAgICAgICAgICAgIGlmICgkVGFibGUtPm5hbWUgIT0gInRhYmxlcyIgJiYgKCEkdGhpcy0+cGFyYW1zWyJlbXB0eVByb2plY3QiXSAvKiR0aGlzLT5Nb2R1bGUtPmlkICE9IEVNUFRZX1BST0pFQ1RfTU9EVUxFX1BBQ0tBR0UqLyB8fCAkVGFibGUtPm5hbWUgIT0gInRhYmxlX2ZpZWxkcyIpKQogICAgICAgICAgICAgICAgLy9pZiAoJFRhYmxlLT5uYW1lICE9ICJ0YWJsZXMiICYmICRUYWJsZS0+bmFtZSAhPSAidGFibGVfZmllbGRzIiAmJiAkVGFibGUtPmhhc0ZpZWxkKCJtb2R1bGUiKSAmJiAkTW9kdWxlLT5pZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlLT5oYXNGaWVsZCgibW9kdWxlIikgJiYgJE1vZHVsZS0+aWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGFibGVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIlRhYmxlIiA9PiAkVGFibGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gJFRhYmxlLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdCIgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbXMiID0+ICJmaWx0ZXJfbW9kdWxlPSIuJE1vZHVsZS0+aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPnRhYmxlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAvLyJUYWJsZSIgPT4gInRhYmxlX2ZpZWxkcyIsCiAgICAgICAgICAgICAgICAibmFtZSIgPT4gInRhYmxlX2ZpZWxkcyIsCiAgICAgICAgICAgICAgICAic3RydWN0IiA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICJkYXRhIiA9PiB0cnVlLAogICAgICAgICAgICAgICAgInBhcmFtcyIgPT4gImZpbHRlcl9tb2R1bGU9Ii4kTW9kdWxlLT5pZC4iLGZpbHRlcl90YWJsZU5hbWU9c2V0dGluZ3MiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+dGFibGVzKTsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgJHRoaXMtPnN0ZXBQcm9ncmVzcyA9IDEwMDsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoKDEwMC8kdGhpcy0+c3RlcENvdW50KSokdGhpcy0+c3RlcEluZGV4ICsgKDEwMC8kdGhpcy0+c3RlcENvdW50KS8xMDAqJHRoaXMtPnN0ZXBQcm9ncmVzcyk7CiAgICB9ICAgIAoKICAgIGZ1bmN0aW9uIHJlc3VtZVBhY2tNb2R1bGVJbmZvKCkKICAgIHsKICAgICAgICAkZiA9IGZvcGVuKCR0aGlzLT5pbnN0YWxsRmlsZSwgImErIik7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+bW9kdWxlcyBhcyAkTW9kdWxlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEkdGhpcy0+TW9kdWxlLT5sYW5ndWFnZSB8fCAkTW9kdWxlID09ICR0aGlzLT5Nb2R1bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpbmZvID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJyZWNvcmQiLAogICAgICAgICAgICAgICAgICAgICJ0YWJsZSIgPT4gIm1vZHVsZXMiLAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMiID0+ICRNb2R1bGUtPnNxbFJlY29yZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyRzSW5mbyA9IFRKU09OOjplbmNvZGUoJGluZm8pOwogICAgICAgICAgICAgICAgJHNJbmZvID0gJHRoaXMtPmpzb25FbmNvZGUoJGluZm8pOwogICAgICAgICAgICAgICAgJHRoaXMtPmZ3cml0ZSgkZiwgc3RybGVuKCRzSW5mbykuInwiKTsKICAgICAgICAgICAgICAgICR0aGlzLT5md3JpdGUoJGYsICRzSW5mbyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZjbG9zZSgkZik7CgogICAgICAgICR0aGlzLT5zdGVwUHJvZ3Jlc3MgPSAxMDA7CiAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKCgxMDAvJHRoaXMtPnN0ZXBDb3VudCkqJHRoaXMtPnN0ZXBJbmRleCArICgxMDAvJHRoaXMtPnN0ZXBDb3VudCkvMTAwKiR0aGlzLT5zdGVwUHJvZ3Jlc3MpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24ganNvbkVuY29kZSgkc3RyKQogICAgewogICAgICAgICRqc29uID0gVEpTT046OmVuY29kZSgkc3RyLCBOVUxMLCB0cnVlKTsKICAgICAgICAKICAgICAgICBpZiAoVEpTT046OmRlY29kZSgkanNvbiwgTlVMTCwgdHJ1ZSkgPT09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICAvLyBlbmNvZGUgYmluYXJ5CiAgICAgICAgICAgICRqc29uID0gImJhc2U2NDoiLmJhc2U2NF9lbmNvZGUoc2VyaWFsaXplKCRzdHIpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vc2hvd01lc3NhZ2UoIkJhZCBlbmNvZGVkIEpTT046ICIuJGpzb24sIG10RXJyb3IpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJGpzb24pOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBqc29uRGVjb2RlKCRzdHIpCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkc3RyKTsKICAgICAgICBpZiAoc3RycG9zKCRzdHIsICJiYXNlNjQ6IikgPT09IDApCiAgICAgICAgewogICAgICAgICAgICAkcmV0ID0gdW5zZXJpYWxpemUoYmFzZTY0X2RlY29kZShzdWJzdHIoJHN0ciwgc3RybGVuKCJiYXNlNjQ6IiksIHN0cmxlbigkc3RyKSkpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9IFRKU09OOjpkZWNvZGUoJHN0cik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIAogICAgLyoKICAgIGZ1bmN0aW9uIGdldFN1Yk1vZHVsZXMoJE1vZHVsZSkKICAgIHsKICAgICAgICAkbW9kdWxlcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT5tb2R1bGVzIGFzICRtb2R1bGVJbmZvKQogICAgICAgIHsKICAgICAgICAgICAgJE1vZHVsZSA9IGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRNb2R1bGUoJG1vZHVsZUluZm9bImlkIl0pOwogICAgICAgICAgICAkbW9kdWxlc1tdID0gJE1vZHVsZTsKICAgICAgICAgICAgJG1vZHVsZXMgPSBhcnJheV9tZXJnZSgkbW9kdWxlcywgJHRoaXMtPmdldFN1Yk1vZHVsZXMoJE1vZHVsZSkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oJG1vZHVsZXMpOwogICAgfQogICAgKi8KICAgIAogICAgZnVuY3Rpb24gcmVzdW1lUmVtb3ZlTW9kdWxlKCkKICAgIHsKICAgICAgICAvL2VjaG8gIjEiOwogICAgICAgIGlmICghJHRoaXMtPk1vZHVsZSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5zdGVwcyA9IGFycmF5KAogICAgICAgICAgICAgICAgIkZpbGVMaXN0IiA9PiAiR2VuZXJhdGluZyBmaWxlIGxpc3QiLAogICAgICAgICAgICAgICAgIkZpbGVzIiA9PiAiUmVtb3ZpbmcgZmlsZXMiLAogICAgICAgICAgICAgICAgIkRhdGFiYXNlIiA9PiAiUmVtb3ZpbmcgZGF0YWJhc2UiLAogICAgICAgICAgICAgICAgIk1vZHVsZUluZm8iID0+ICJSZW1vdmluZyBtb2R1bGUgaW5mbyIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkdGhpcy0+ZGlycyA9IGFycmF5KCk7CiAgICAgICAgICAgICR0aGlzLT5maWxlcyA9IGFycmF5KCk7CgogICAgICAgICAgICAkdGhpcy0+TW9kdWxlID0gZ2V0T2JqZWN0KCJNb2R1bGVzIiktPmdldE1vZHVsZSgkdGhpcy0+cGFyYW1zWyJtb2R1bGVJZCJdKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5Nb2R1bGUtPm5hbWUgPT0gIkNvcmUiIHx8ICR0aGlzLT5Nb2R1bGUtPm5hbWUgPT0gIkFkbWluIiB8fCAkdGhpcy0+TW9kdWxlLT5uYW1lID09ICJXZWIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlY2hvICJQQU5JQyEgQ2Fubm90IHVuaW5zdGFsbCBjb3JlLCBhZG1pbiBvciB3ZWIgbW9kdWxlISI7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+Z2V0U3ViTW9kdWxlcygkdGhpcy0+TW9kdWxlKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+TW9kdWxlLT5sYW5ndWFnZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPnN0ZXBzWyJGaWxlTGlzdCJdKTsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5zdGVwc1siRmlsZXMiXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vJHRoaXMtPm1vZHVsZXNbXSA9ICR0aGlzLT5Nb2R1bGU7CiAgICAgICAgICAgIC8vJHRoaXMtPm1vZHVsZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bW9kdWxlcywgJHRoaXMtPmdldFN1Yk1vZHVsZXMoJHRoaXMtPk1vZHVsZSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAvLyR0aGlzLT5nZXRTdWJNb2R1bGVzKCR0aGlzLT5Nb2R1bGUpOwogICAgICAgICAgICAKICAgICAgICAgICAgJG1vZHVsZXMgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5tb2R1bGVzIGFzICRNb2R1bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghJG1vZHVsZXNbJE1vZHVsZS0+aWRdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRtb2R1bGVzWyRNb2R1bGUtPmlkXSA9ICRNb2R1bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPm1vZHVsZXMgPSAkbW9kdWxlczsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPm1vZHVsZXMpOwogICAgICAgICAgICAvL3Vuc2V0KCRtb2R1bGVzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJyZW1vdmVGaWxlcyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5tb2R1bGVzIGFzICRNb2R1bGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkTW9kdWxlLT5maWxlcyBhcyAkcmVsYXRpdmVGaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFic29sdXRlRmlsZSA9IGNsZWFuTGluayhQUk9KRUNUUEFUSC4kcmVsYXRpdmVGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkYWJzb2x1dGVGaWxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRpcnNbXSA9ICRhYnNvbHV0ZUZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGlycyA9IGFycmF5X21lcmdlKCR0aGlzLT5kaXJzLCBfZ2xvYigkYWJzb2x1dGVGaWxlLiIvKiIsIEdMT0JfRElSUywgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVzW10gPSAkYWJzb2x1dGVGaWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmRpcnMpOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5maWxlcyk7CiAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPnN0ZXAgPSBhcnJheV9zaGlmdChhcnJheV9rZXlzKCR0aGlzLT5zdGVwcykpOwogICAgICAgICAgICAkdGhpcy0+c3RlcEluZGV4ID0gMDsKICAgICAgICAgICAgJHRoaXMtPmZpbGVJbmRleCA9IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghJHRoaXMtPnN0ZXBDb3VudCkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5zdGVwQ291bnQgPSBjb3VudCgkdGhpcy0+c3RlcHMpOwogICAgICAgICAgICAkdGhpcy0+c3RlcEluZGV4ID0gMDsgICAgICAgICAgICAKICAgICAgICB9CgogICAgICAgIHdoaWxlKCR0aGlzLT5zdGVwcykKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5zdGVwSW5kZXggPSAkdGhpcy0+c3RlcENvdW50LWNvdW50KCR0aGlzLT5zdGVwcyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3Byb2Nlc3NQcm9ncmVzc1RleHQoJHRoaXMtPnN0ZXBzWyR0aGlzLT5zdGVwXSk7CiAgICAgICAgICAgICRtZXRob2ROYW1lID0gInJlc3VtZVJlbW92ZSIuJHRoaXMtPnN0ZXA7CiAgICAgICAgICAgICR0aGlzLT4kbWV0aG9kTmFtZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgYXJyYXlfc2hpZnQoJHRoaXMtPnN0ZXBzKTsKICAgICAgICAgICAgJHRoaXMtPnN0ZXAgPSBhcnJheV9zaGlmdChhcnJheV9rZXlzKCR0aGlzLT5zdGVwcykpOwogICAgICAgICAgICAvLyR0aGlzLT5zdGVwSW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKDEwMCk7CiAgICAgICAgcHJvY2Vzc1Byb2dyZXNzVGV4dCh0cmFuc2xhdGUoIkZpbmlzaGVkIikpOwogICAgICAgIAogICAgICAgICR0aGlzLT5maW5pc2goKTsKICAgIH0gICAgCgogICAgZnVuY3Rpb24gcmVzdW1lUmVtb3ZlRmlsZUxpc3QoKQogICAgewogICAgICAgIC8vZWNobyAiMiI7CiAgICAgICAgaWYgKCR0aGlzLT5wYXJhbXNbInJlbW92ZUZpbGVzIl0pCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSgkdGhpcy0+ZGlycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGRpciA9ICR0aGlzLT5kaXJzWzBdOwogICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVzW10gPSAkZGlyOwoKICAgICAgICAgICAgICAgICRmaWxlcyA9IF9nbG9iKCRkaXIuIi8qIiwgR0xPQl9GSUxFUyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAkdGhpcy0+ZmlsZUluZGV4IDsgJGkgPCBjb3VudCgkZmlsZXMpIDsgJGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRmaWxlc1skaV07CgogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlc1tdID0gJGZpbGU7CgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlSW5kZXggPSAkaSsxOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cmVzdW1lTmVlZGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZXN1bWVJbkJhY2tncm91bmQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhcnJheV9zaGlmdCgkdGhpcy0+ZGlycyk7CgogICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVJbmRleCA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgLSBzbyBsYXN0IHdpbGwgYmUgdGhlIHRvcCBoaWVhcmNoeSBkaXJlY3RvcmllcyBhbmQgYWxzbyBmaWxlcyB3aWxsIGJlIHJlbW92ZWQgZmlyc3QKICAgICAgICAgICAgJHRoaXMtPmZpbGVzID0gYXJyYXlfcmV2ZXJzZSgkdGhpcy0+ZmlsZXMpOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnN0ZXBQcm9ncmVzcyA9IDEwMDsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoKDEwMC8kdGhpcy0+c3RlcENvdW50KSokdGhpcy0+c3RlcEluZGV4ICsgKDEwMC8kdGhpcy0+c3RlcENvdW50KS8xMDAqJHRoaXMtPnN0ZXBQcm9ncmVzcyk7CiAgICAgICAgCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHJlc3VtZVJlbW92ZUZpbGVzKCkKICAgIHsKICAgICAgICAvL2VjaG8gIjMiOwogICAgICAgIGlmICgkdGhpcy0+cGFyYW1zWyJyZW1vdmVGaWxlcyJdKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUoJHRoaXMtPmZpbGVJbmRleCA8IGNvdW50KCR0aGlzLT5maWxlcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWxlID0gJHRoaXMtPmZpbGVzWyR0aGlzLT5maWxlSW5kZXhdOwogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcmVsYXRpdmVGaWxlID0gc3RyX3JlcGxhY2UoUFJPSkVDVFBBVEgsICIvIiwgJGZpbGUpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9ncmVzc1RleHQoJHRoaXMtPnN0ZXBzWyR0aGlzLT5zdGVwXS4iICIuJHJlbGF0aXZlRmlsZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChpc19maWxlKCRmaWxlKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAkZmlsZS4iPGJyIC8+IjsKICAgICAgICAgICAgICAgICAgICAgICAgX3VubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZpbGUpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJbRElSXSAiLiRmaWxlLiI8YnIgLz4iOwogICAgICAgICAgICAgICAgICAgICAgICBfcm1kaXIoJGZpbGUsIHRydWUsIHRydWUpOyAvLyByZWN1cnNpdmUsIGFzIGEgJ3BvamlzdGthJyA6RAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR0aGlzLT5maWxlSW5kZXgrKzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHRoaXMtPnN0ZXBQcm9ncmVzcyA9ICR0aGlzLT5maWxlSW5kZXgqMTAwL2NvdW50KCR0aGlzLT5maWxlcyk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoKDEwMC8kdGhpcy0+c3RlcENvdW50KSokdGhpcy0+c3RlcEluZGV4ICsgKDEwMC8kdGhpcy0+c3RlcENvdW50KS8xMDAqJHRoaXMtPnN0ZXBQcm9ncmVzcyk7CiAgICAgICAgICAgIH0gICAgCiAgICAgICAgfQogICAgfSAgICAgIAogICAgCiAgICBmdW5jdGlvbiByZXN1bWVSZW1vdmVEYXRhYmFzZSgpCiAgICB7CiAgICAgICAgLy9lY2hvICI0IjsKICAgICAgICAkdGhpcy0+dGFibGVzID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICBpZiAoJHRoaXMtPnBhcmFtc1sicmVtb3ZlRGF0YSJdKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+bW9kdWxlcyBhcyAkTW9kdWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5Nb2R1bGUtPmxhbmd1YWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJE1vZHVsZS0+dGFibGVzIGFzICRfdGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCI/Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJF90YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYWJsZSA9ICh0YWJsZUV4aXN0cygkX3RhYmxlWyJ0YWJsZU5hbWUiXSkgPyBnZXRUYWJsZSgkX3RhYmxlWyJ0YWJsZU5hbWUiXSkgOiBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkVGFibGUpIC8vIGV4dGVybiB0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIkRST1AiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdGFibGVbInRhYmxlTmFtZSJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHREYkxpbmsoKS0+ZHJvcFRhYmxlKCRfdGFibGVbInRhYmxlTmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiTWlzc2luZyBleHRlcm4gdGFibGUgbmFtZSIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIlRhYmxlICciLiRfdGFibGVbInRhYmxlTmFtZSJdLiInIG5vdCBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJFRhYmxlLT5nZXREYkxpbmsoKSA9PSBnZXREZWZhdWx0RGJMaW5rKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVGFibGUtPm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJEUk9QIGJ5IHJlY29yZCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluayA9ICRUYWJsZS0+Z2V0RGJMaW5rKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERiTGluay0+ZHJvcFRhYmxlKCRUYWJsZS0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJ4MSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGUoInRhYmxlX2ZpZWxkcyIpLT5kZWxldGVSYXdSZWNvcmRzKGFycmF5KCJmaWx0ZXJfdGFibGVOYW1lIj0+JFRhYmxlLT5uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvIGdldFRhYmxlKCJ0YWJsZV9maWVsZHMiKS0+bGFzdFNxbFF1ZXJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyBnZXRUYWJsZSgidGFibGVfZmllbGRzIiktPmdldERiTGluaygpLT5sYXN0U3FsUXVlcnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJ4MiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRhYmxlKCJ0YWJsZXMiKS0+Z2V0UmVjb3JkKGFycmF5KCJpZCI9PiRUYWJsZS0+aWQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGUoInRhYmxlcyIpLT5kZWxldGVSYXdSZWNvcmQoYXJyYXkoImlkIj0+JFRhYmxlLT5pZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiISEhIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIk1pc3NpbmcgdGFibGUgbmFtZSIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJE1vZHVsZS0+ZGF0YSBhcyAkX2RhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUgPSAodGFibGVFeGlzdHMoJF9kYXRhWyJ0YWJsZU5hbWUiXSkgPyBnZXRUYWJsZSgkX2RhdGFbInRhYmxlTmFtZSJdKSA6IE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRUYWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJUYWJsZSAnIi4kX2RhdGFbInRhYmxlTmFtZSJdLiInIG5vdCBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUYWJsZS0+Z2V0RGJMaW5rKCkgPT0gZ2V0RGVmYXVsdERiTGluaygpICYmICEkVGFibGUtPnZpcnR1YWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAkVGFibGUtPm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRfZGF0YVsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlLT5kZWxldGVSYXdSZWNvcmRzKCRfZGF0YVsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgaWYgKCRUYWJsZS0+bmFtZSAhPSAidGFibGVzIiAmJiAkVGFibGUtPm5hbWUgIT0gInRhYmxlX2ZpZWxkcyIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUtPmRlbGV0ZVJhd1JlY29yZHMoImZpbHRlcl9tb2R1bGU9Ii4kTW9kdWxlLT5pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKCRNb2R1bGUtPmlkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaChnZXRPYmplY3QoIlRhYmxlcyIpLT5nZXRUYWJsZXMoKSBhcyAkVGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJFRhYmxlLT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVGFibGUtPmhhc0ZpZWxkKCJtb2R1bGUiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFibGUtPmRlbGV0ZVJlY29yZHMoImZpbHRlcl9tb2R1bGU9Ii4kTW9kdWxlLT5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcmVjb3JkIG5vdCBkZWxldGVkIGR1ZSB0byBvbkRlbGV0ZSBldmVudHMsIGZvcmNlIHRvIGRlbGV0ZSBpdCBhZ2FpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYWJsZS0+ZGVsZXRlUmF3UmVjb3JkcygiZmlsdGVyX21vZHVsZT0iLiRNb2R1bGUtPmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiTWlzc2luZyBtb2R1bGUgaWQiLCBtdEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy92YXJfZHVtcChhcnJheSgiaWQiID0+ICRNb2R1bGUtPmlkKSk7CiAgICAgICAgICAgICAgICAvL2dldFRhYmxlKCJtb2R1bGVzIiktPmRlbGV0ZVJlY29yZChhcnJheSgiaWQiID0+ICRNb2R1bGUtPmlkKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5Nb2R1bGUtPmxhbmd1YWdlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKGdldE9iamVjdCgiVGFibGVzIiktPmdldFRhYmxlcygpIGFzICRUYWJsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJFRhYmxlLT5uYW1lID09ICJsYXlvdXRzIiB8fCAkVGFibGUtPm5hbWUgPT0gInRlbXBsYXRlcyIgfHwgJFRhYmxlLT5uYW1lID09ICJ0cmFuc2xhdGlvbl9pdGVtcyIgfHwgJFRhYmxlLT5uYW1lID09ICJoZWxwIiB8fCAkVGFibGUtPm5hbWUgPT0gInRyYW5zbGF0b3JzIikKICAgICAgICAgICAgICAgICAgICAgICAgJFRhYmxlLT5kZWxldGVSYXdSZWNvcmRzKCJmaWx0ZXJfbGFuZ3VhZ2U9Ii4kdGhpcy0+TW9kdWxlLT5sYW5ndWFnZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPnN0ZXBQcm9ncmVzcyA9IDEwMDsKICAgICAgICBwcm9jZXNzUHJvZ3Jlc3MoKDEwMC8kdGhpcy0+c3RlcENvdW50KSokdGhpcy0+c3RlcEluZGV4ICsgKDEwMC8kdGhpcy0+c3RlcENvdW50KS8xMDAqJHRoaXMtPnN0ZXBQcm9ncmVzcyk7CiAgICB9ICAgIAoKICAgIGZ1bmN0aW9uIHJlc3VtZVJlbW92ZU1vZHVsZUluZm8oKQogICAgewogICAgICAgIC8vZWNobyAiNSI7CiAgICAgICAgaWYgKCR0aGlzLT5Nb2R1bGUtPmxhbmd1YWdlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5Nb2R1bGUtPmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0VGFibGUoIm1vZHVsZXMiKS0+cmVjb3JkRXhpc3RzKGFycmF5KCJpZCIgPT4gJHRoaXMtPk1vZHVsZS0+aWQpKSkKICAgICAgICAgICAgICAgICAgICBnZXRUYWJsZSgibW9kdWxlcyIpLT5kZWxldGVSYXdSZWNvcmQoYXJyYXkoImlkIiA9PiAkdGhpcy0+TW9kdWxlLT5pZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJNaXNzaW5nIG1vZHVsZSBpZCIsIG10RXJyb3IpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5tb2R1bGVzIGFzICRNb2R1bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB0byBlbmFibGUgZ2V0RGVmYXVsdERiTGluaygpCiAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0RGJMaW5rKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRNb2R1bGUtPmlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRtb2R1bGVQYXJhbXNVcGRhdGVzID0gZXh0cmFjdFBhcmFtcygkTW9kdWxlLT51cGRhdGVzKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRtb2R1bGVQYXJhbXNVcGRhdGVzIGFzICRtb2R1bGVQYXJhbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbW9kdWxlUGFyYW1bInZlcnNpb24iXSA9PSAidW5pbnN0YWxsIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJ1blVwZGF0ZXMoJG1vZHVsZVBhcmFtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRhYmxlKCJtb2R1bGVzIiktPnJlY29yZEV4aXN0cyhhcnJheSgiaWQiID0+ICRNb2R1bGUtPmlkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhYmxlKCJtb2R1bGVzIiktPmRlbGV0ZVJhd1JlY29yZChhcnJheSgiaWQiID0+ICRNb2R1bGUtPmlkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIk1pc3NpbmcgbW9kdWxlIGlkIiwgbXRFcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcHJvY2Vzc1Byb2dyZXNzKDEwMCk7CgogICAgICAgIC8vIG5la2R5IHZ5aG9kaSBjaHlidSwgdGFrIHRvIGRhdmFtIGF6IHphIDEwMCUKICAgICAgICBpZiAoSU5TVEFMTCAhPT0gdHJ1ZSkKICAgICAgICAgICAgZ2V0T2JqZWN0KCJDYWNoZSIpLT5jbGVhcigpOwogICAgICAgIAogICAgICAgIEBfcm1kaXIoX1BST0pFQ1RQQVRILiJjYWNoZSIsIHRydWUsIHRydWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRGaWxlSGVhZGVyKCRmaWxlTmFtZSkKICAgIHsKICAgICAgICBpZiAoZmlsZXNpemUoJGZpbGVOYW1lKSkKICAgICAgICB7CiAgICAgICAgICAgICRmID0gZm9wZW4oJGZpbGVOYW1lLCAiciIpOwogICAgICAgICAgICAkaGVhZGVyID0gJHRoaXMtPnJlYWRJbmZvKCRmKTsKICAgICAgICAgICAgZmNsb3NlKCRmKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuKCRoZWFkZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEZpbGVUb2tlbnMoJGZpbGVOYW1lKQogICAgewogICAgICAgICR0b2tlbnMgPSBhcnJheSgpOwoKICAgICAgICAkZiA9IGZvcGVuKCRmaWxlTmFtZSwgInIiKTsKICAgICAgICB3aGlsZSghZmVvZigkZikpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+dG9rZW4gPSAkdGhpcy0+cmVhZEluZm8oJGYpOwogICAgICAgICAgICAkdG9rZW5zW10gPSAkdGhpcy0+dG9rZW47CiAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInR5cGUiXSA9PSAiZmlsZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5maWxlU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSgkdGhpcy0+ZmlsZVNpemUgIT0gJHRoaXMtPnRva2VuWyJzaXplIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGxlbmd0aCA9ICR0aGlzLT5yZWFkTGVuZ3RoKCRmKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAkc0J1ZmZlciA9IGZyZWFkKCRmLCAkbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRzQnVmZmVyID0gIiI7CgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5maWxlU2l6ZSArPSBzdHJsZW4oJHNCdWZmZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInR5cGUiXSA9PSAiZW5kIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZmNsb3NlKCRmKTsKICAgICAgICByZXR1cm4oJHRva2Vucyk7CiAgICB9CgogICAgZnVuY3Rpb24gZndyaXRlKCRmLCAkZGF0YSkKICAgIHsKICAgICAgICAvKgogICAgICAgIGlmIChzdHJwb3MoJGRhdGEsICI1Nzc5ZmM5Yy01NjkzLTRhM2MtOTk2My0iLiJjMWI5MzE5MTZjYTQiKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICB2YXJfZHVtcCgkZGF0YSk7CiAgICAgICAgICAgIHZhcl9kdW1wKCR0aGlzLT5kZWJ1Z0xhc3RTcWxRdWVyeSk7CiAgICAgICAgICAgIHZhcl9kdW1wKCR0aGlzLT5kZWJ1Z0xhc3RTcWxSZWNvcmRzKTsKICAgICAgICAgICAgZWNobyBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICAkcmV0ID0gZndyaXRlKCRmLCAkZGF0YSk7CiAgICAgICAgaWYgKCRyZXQgPT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRJbnN0YWxsUHJvY2VzcyAtIHVuYWJsZSB0byB3cml0ZSBkYXRhIC0gcmV0dXJuZWQgRkFMU0UiLCBtdEVycm9yKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHJldCAhPSBzdHJsZW4oJGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRJbnN0YWxsUHJvY2VzcyAtIHVuYWJsZSB0byB3cml0ZSBkYXRhIC0gd3JpdHRlbiBsZXNzIHRoYW4gZXhwZWN0ZWQiLCBtdEVycm9yKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaXRJbnN0YWxsRmlsZSgkY29tYmluZWRGaWxlTmFtZSkKICAgIHsKICAgICAgICAkaGVhZGVyID0gJHRoaXMtPmdldEZpbGVIZWFkZXIoJGNvbWJpbmVkRmlsZU5hbWUpOwogICAgICAgIC8vdmFyX2R1bXAoJGhlYWRlcik7CiAgICAgICAgJGZpbGVzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJGhlYWRlclsiY29tYmluZWQiXSkKICAgICAgICB7CiAgICAgICAgICAgICRmID0gZm9wZW4oJGNvbWJpbmVkRmlsZU5hbWUsICJyIik7CiAgICAgICAgICAgICRwYXRoID0gZmluZEZpbGUoIi9yZXBvc2l0b3J5L3RlbXAvIikuIi8iOwogICAgICAgICAgICB3aGlsZSghZmVvZigkZikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT50b2tlbiA9ICR0aGlzLT5yZWFkSW5mbygkZik7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnRva2VuWyJ0eXBlIl0gPT0gImhlYWRlciIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRva2VuWyJjb21iaW5lZCJdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVOYW1lID0gJHBhdGguVE1vZHVsZTo6Z2V0RmlsZU5hbWUoJHRoaXMtPnRva2VuWyJuYW1lIl0pLiItIi4kdGhpcy0+dG9rZW5bInZlcnNpb24iXS4oJHRoaXMtPnRva2VuWyJsYW5ndWFnZSJdID8gIi4iLiR0aGlzLT50b2tlblsibGFuZ3VhZ2UiXSA6ICIiKS4iLm1vZHVsZS5pbnN0YWxsIjsKICAgICAgICAgICAgICAgICAgICAkZmYgPSBmb3BlbigkZmlsZU5hbWUsICJ3Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRzSW5mbyA9ICR0aGlzLT5qc29uRW5jb2RlKCR0aGlzLT50b2tlbik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIEBmd3JpdGUoJGZmLCBzdHJsZW4oJHNJbmZvKS4ifCIpOwogICAgICAgICAgICAgICAgQGZ3cml0ZSgkZmYsICRzSW5mbyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInR5cGUiXSA9PSAiZmlsZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSgkdGhpcy0+ZmlsZVNpemUgIT0gJHRoaXMtPnRva2VuWyJzaXplIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnJlYWRMZW5ndGgoJGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc0J1ZmZlciA9IGZyZWFkKCRmLCAkbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNCdWZmZXIgPSAiIjsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmZiwgc3RybGVuKCRzQnVmZmVyKS4ifCIpOwogICAgICAgICAgICAgICAgICAgICAgICBmd3JpdGUoJGZmLCAkc0J1ZmZlcik7CgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZVNpemUgKz0gc3RybGVuKCRzQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dG9rZW5bInR5cGUiXSA9PSAiZW5kIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZmKTsKICAgICAgICAgICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlTmFtZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnRva2VuWyJ0eXBlIl0gPT0gImVuZGNvbWJpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGZjbG9zZSgkZik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkZmlsZXMpOwogICAgfQp9Cgo=PD8NCiRwb3NpdGlvbiA9IGlzc2V0KCRfR0VUWydwb3NpdGlvbiddKSA/ICRfR0VUWydwb3NpdGlvbiddIDogJ3RvcCc7DQokY29sb3JzID0gJF9HRVRbJ2NvbG9ycyddOw0KDQpmb3JlYWNoKCRjb2xvcnMgYXMgJGtleSA9PiAkdmFsdWUpDQp7DQogICAgJGNvbG9yc1ska2V5XSA9IGV4cGxvZGUoIiAiLCAkdmFsdWUpOw0KICAgIGlmICgkY29sb3JzWyRrZXldWzBdWzBdICE9PSAiIyIpDQogICAgICAgICRjb2xvcnNbJGtleV1bMF0gPSAiIyIuJGNvbG9yc1ska2V5XVswXTsNCn0NCg0KaWYgKCRwb3NpdGlvbiA9PSAiYm90dG9tIikNCnsNCiAgICAkX2NvbG9ycyA9IGFycmF5X3JldmVyc2UoJGNvbG9ycyk7DQogICAgJGNvbG9ycyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCgkX2NvbG9ycyBhcyAka2V5ID0+ICR2YWx1ZSkNCiAgICB7DQogICAgICAgICRjb2xvcnNbJGtleV1bMF0gPSAkX2NvbG9yc1ska2V5XVswXTsNCiAgICAgICAgJGNvbG9yc1ska2V5XVsxXSA9ICRfY29sb3JzW2NvdW50KCRfY29sb3JzKS0xLSRrZXldWzFdOw0KICAgIH0NCn0NCmZvcmVhY2goJGNvbG9ycyBhcyAka2V5ID0+ICR2YWx1ZSkNCnsNCiAgICBpZiAoISRjb2xvcnNbJGtleV1bMV0pDQogICAgew0KICAgICAgICBpZiAoJGtleSA9PSAwKQ0KICAgICAgICAgICAgJGNvbG9yc1ska2V5XVsxXSA9ICIwJSI7DQogICAgICAgIGVsc2UgaWYgKCRrZXkgPT0gY291bnQoJGNvbG9ycyktMSkNCiAgICAgICAgICAgICRjb2xvcnNbJGtleV1bMV0gPSAiMTAwJSI7DQogICAgICAgIGVsc2UgDQogICAgICAgICAgICAkY29sb3JzWyRrZXldWzFdID0gcm91bmQoJGtleSooMTAwL2NvdW50KCRjb2xvcnMpLTEpKS4iJSI7DQogICAgfQ0KfQ0KDQpoZWFkZXIoJ0NvbnRlbnQtdHlwZTogaW1hZ2Uvc3ZnK3htbDsgY2hhcnNldD11dGYtOCcpOw0KDQplY2hvICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuIjsNCmVjaG8gIjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZlcnNpb249XCIxLjFcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+DQogICAgPGRlZnM+DQogICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cImxpbmVhci1ncmFkaWVudFwiIHgxPVwiMCVcIiB5MT1cIjAlXCIgeDI9XCIwJVwiIHkyPVwiMTAwJVwiPiI7DQpmb3JlYWNoKCRjb2xvcnMgYXMgJGNvbG9yKSAgICAgICAgDQp7DQogICAgZWNobyAiPHN0b3Agb2Zmc2V0PVwiIi4kY29sb3JbMV0uIlwiIHN0b3AtY29sb3I9XCIiLiRjb2xvclswXS4iXCIgc3RvcC1vcGFjaXR5PVwiMVwiLz4iOw0KfQ0KZWNobyAiICAgICAgIDwvbGluZWFyR3JhZGllbnQ+DQogICAgPC9kZWZzPg0KICAgIDxyZWN0IHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBmaWxsPVwidXJsKCNsaW5lYXItZ3JhZGllbnQpXCIvPg0KPC9zdmc+IjsNCj8+Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvQ1NTM0NvbnZlcnRlci9DU1MzQ29udmVydGVyLmNsYXNzLnBocCAtLS0tLS0tIA0KCi8vIFRPRE8gLSBGTEVYIC4uLiBodHRwczovL2Nzcy10cmlja3MuY29tL3VzaW5nLWZsZXhib3gvCmNsYXNzIFRDU1MzQ29udmVydGVyIGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgdmFyICRzdGFtcCA9ICJcbkNTUzM7XG4iOwogICAgdmFyICRzdGFtcFJlZ0V4cCA9ICJbXlxuXVteQ11bXlNdW15TXVteM11bXjtdW15cbl0iOwogICAgCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgpOwogICAgICAgIAogICAgICAgIC8vIE5FRUQgVE8gVVNFIFRISVMgaGVyZSBhcyB2YXJpYWJsZSAoYW5kIG5vdCBkaXJlY3RseSkgRFVFIFRPIGluc3RhbGwucGhwIGNvbXBpbGVyCiAgICAgICAgJHRoaXMtPnVybCA9IGdldFVybEZyb21QYXRoKF9fRklMRV9fLCB0cnVlKTsKICAgIAogICAgICAgIGlmIChGQUxTRSkgLy8ganVzdCBhIGR1bW15IGZvciBpbnN0YWxsLnBocCBjb21waWxlciB0byBhZGQgdGhpcyBmaWxlCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9DU1MzQ29udmVydGVyL2xpbmVhci1ncmFkaWVudC5waHAnPjwvc2NyaXB0PiIsdHJ1ZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNvbnZlcnQoJGNzcywgJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIC8vcmV0dXJuKCRjc3MpOwogICAgICAgIC8vZWNobyBzdWJzdHIoJGNzcywgMCwgMTAwKS4iPGJyIC8+IjsKICAgICAgICAvL2R1bXAoJGNzcyk7CiAgICAgICAgJGNzcyA9IHN0cl9yZXBsYWNlKCJcciIsICIiLCAkY3NzKTsKICAgICAgICAkY3NzID0gc3RyX3JlcGxhY2UoIn0iLCAiXG59XG4iLCAkY3NzKTsKICAgICAgICAkY3NzID0gc3RyX3JlcGxhY2UoWldTUCwgIiIsICRjc3MpOwogICAgICAgICRjc3MgPSBzdHJfcmVwbGFjZShaV05MLCAiIiwgJGNzcyk7CiAgICAgICAgJGNzcyA9IHByZWdfcmVwbGFjZSgifC9cXCooLio/KVxcKi98aW1zIiwgIlxuXG4iLCAkY3NzKTsKICAgICAgICAkY3NzID0gcHJlZ19yZXBsYWNlKCJ8Ly8oLio/KVxuL3xpbXMiLCAiXG4iLCAkY3NzKTsKICAgICAgICAkY3NzID0gcHJlZ19yZXBsYWNlKCJ8W1xuXHQgXSt7fGltcyIsICJ7IiwgJGNzcyk7CgogICAgICAgIC8vIElFIDExIGJ1ZyBmaXggLSAhISEgbmVzbWltICEhISByb3pob2RpIHRvIHVwbG5lIHZzZWNobnkgcHJvaGxpemVjZQogICAgICAgIC8vJGNzcyA9IHByZWdfcmVwbGFjZSgifGZsZXg6ICoxO3xpbXMiLCAiZmxleDogMSAwIGF1dG87IiwgJGNzcyk7CiAgICAgICAgLy8kY3NzID0gcHJlZ19yZXBsYWNlKCJ8ZmxleDogKjA7fGltcyIsICJmbGV4OiAwIDEgYXV0bzsiLCAkY3NzKTsKCiAgICAgICAgLy9kdW1wKCRjc3MpOwoKICAgICAgICAvL2VjaG8gJGNzczsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgLy8ga29udmVydHVqZSBhIHphcGlzdWplIGRvIHNvdWJvcnUgc2UgaWhuZWQgcG8gdWxvemVuaQogICAgICAgICRfY3NzID0gJGNzczsKICAgICAgICAKICAgICAgICAvLyBleHRyYWN0IGFsbCBAaW1wb3J0CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8QGltcG9ydFteO10rO3xpbXMiLCAkX2NzcywgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyRjc3NYIC49ICRtYXRjaFswXS4iXG4iOwogICAgICAgICAgICAgICAgJF9jc3MgPSBzdHJfcmVwbGFjZSgkbWF0Y2hbMF0sICIiLCAkX2Nzcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJF9jc3MgPSBzdHJpX3JlcGxhY2UoIkBtZWRpYSIsICLCsG1lZGlhIiwgJF9jc3MpOyAvLyBtZWRpYSBjb250YWlucyBvdGhlciBydWxlcwogICAgICAgICRfY3NzID0gcHJlZ19yZXBsYWNlKCJ8KFthLXpBLVpcXC1dKzopfGltcyIsICLLh1xcMSIsICRfY3NzKTsgLy8gZHVlIHRvIHN0cl9yZXBsYWNlIHdoZW4gLW1vei0qIGFscmVhZHkgZXhpc3RzCgogICAgICAgICRwYXJ0cyA9ICR0aGlzLT5wYXJzZSgkX2Nzcyk7CiAgICAgICAgLy9kdW1wKCRwYXJ0cyk7CgogICAgICAgIGZvciAoJGkgPSAwIDsgJGkgPCBjb3VudCgkcGFydHMpIDsgJGkrKykKICAgICAgICB7CiAgICAgICAgICAgICRwYXJ0ID0gJHBhcnRzWyRpXTsKICAgICAgICAgICAgJHBhcnRzMiA9IGFycmF5KCk7CiAgICAgICAgICAgICR0aGlzLT5jb252ZXJ0Q29sb3IoJHBhcnRzWyRpXSwgJHBhcnRzMik7CiAgICAgICAgICAgICR0aGlzLT5jb252ZXJ0TGluZWFyR3JhZGllbnQoJHBhcnRzWyRpXSwgJHBhcnRzMik7CiAgICAgICAgICAgICR0aGlzLT5jb252ZXJ0QXNwZWN0UmF0aW8oJHBhcnRzWyRpXSwgJHBhcnRzMik7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+Y29udmVydFNpbXBsZVByb3BlcnRpZXMoYXJyYXkoCiAgICAgICAgICAgICAgICAiYm94LXNoYWRvdyIsIAogICAgICAgICAgICAgICAgInRleHQtc2hhZG93IiwgCiAgICAgICAgICAgICAgICAidXNlci1zZWxlY3QiLCAKICAgICAgICAgICAgICAgICJib3gtc2l6aW5nIiwgCiAgICAgICAgICAgICAgICAib3ZlcmZsb3cteCIsIAogICAgICAgICAgICAgICAgIm92ZXJmbG93LXkiLCAKICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLXNpemUiLAogICAgICAgICAgICAgICAgImNvbHVtbi1jb3VudCIsCiAgICAgICAgICAgICAgICAiY29sdW1uLWdhcCIsCiAgICAgICAgICAgICAgICAidHJhbnNpdGlvbiIsCiAgICAgICAgICAgICAgICAidHJhbnNmb3JtIiwKICAgICAgICAgICAgICAgICJmaWx0ZXIiLAogICAgICAgICAgICAgICAgIm9yZGVyIiwKICAgICAgICAgICAgICAgICJjb2x1bW5zIiwKICAgICAgICAgICAgICAgICJmbGV4LWRpcmVjdGlvbiIsCiAgICAgICAgICAgICAgICApLCAkcGFydHNbJGldLCAkcGFydHMyKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5jb252ZXJ0U2ltcGxlUHJvcGVydGllczIoYXJyYXkoCiAgICAgICAgICAgICAgICAiZ2FwIiA9PiAiZ3JpZC1nYXAiLCAKICAgICAgICAgICAgICAgICksICRwYXJ0c1skaV0sICRwYXJ0czIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICR0aGlzLT5jb252ZXJ0U2ltcGxlUHJvcGVydHlWYWx1ZXMoYXJyYXkoCiAgICAgICAgICAgICAgICBhcnJheSgiZmxleCIsIGFycmF5KCItd2Via2l0LWJveCIsICItbW96LWJveCIsICItbXMtZmxleGJveCIpKSwgCiAgICAgICAgICAgICAgICApLCAkcGFydHNbJGldLCAkcGFydHMyKTsKCiAgICAgICAgICAgIGZvcmVhY2goJHBhcnRzMiBhcyAkcGFydDIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRwYXJ0c1skaV1bIm90aGVyIl0gLj0gaW1wbG9kZSgiLCAiLCAkcGFydDJbInJ1bGVzIl0pLiIge1xuIi4kcGFydDJbImNzcyJdLiJ9XG4iOwogICAgICAgICAgICAgICAgLy9hcnJheV9zcGxpY2UoJHBhcnRzLCAkaSsxLCAwLCBhcnJheSgkcGFydDIpKTsKICAgICAgICAgICAgICAgIC8vJGkrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy99CiAgICAgICAgLy9leGl0OwogICAgICAgIAogICAgICAgICRhbGxGb3VuZCA9IHRydWU7CiAgICAgICAgLy9kdW1wKCRjc3MpOwoKICAgICAgICBmb3JlYWNoKCRwYXJ0cyBhcyAka2V5ID0+ICRwYXJ0KQogICAgICAgIHsKICAgICAgICAgICAgZm9yKCRrZXkyID0gMCA7ICRrZXkyIDwgY291bnQoJHBhcnRbInJ1bGVzIl0pIDsgJGtleTIrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJ1bGUgPSAkcGFydFsicnVsZXMiXVska2V5Ml07CiAgICAgICAgICAgICAgICAvLyBleHBhbmQgT1IgcnVsZXMgCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoIi9cXHxbXj1dL2lzIiwgJHJ1bGUsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoaXNEZXZlbG9wZXIoKSkKICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnRzMiA9IGV4cGxvZGUoIiAiLCAkcnVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHBhcnRzMiBhcyAka2V5MyA9PiAkcGFydDMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0czJbJGtleTNdID0gZXhwbG9kZUxpc3QoJHBhcnQzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJ1bGUpOyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFydFsicnVsZXMiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcnRzMik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRoaXMtPmdldE9yUnVsZVBhcnRzKCRwYXJ0czIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICI8aHI+IjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICRrZXkyOwogICAgICAgICAgICAgICAgICAgICAgICAkcGFydFsicnVsZXMiXVska2V5Ml0gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkcGFydFsicnVsZXMiXSA9IGFycmF5X21lcmdlKCRwYXJ0WyJydWxlcyJdLCAkdGhpcy0+Z2V0T3JSdWxlUGFydHMoJHBhcnRzMikpOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRwYXJ0WyJydWxlcyJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAkcnVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICI8aHI+IjsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gIjxocj4iOwogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRydWxlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWNobyAiPGhyPiI7CiAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGNsZWFyIGVtcHR5CiAgICAgICAgICAgICRfcnVsZXMgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRwYXJ0WyJydWxlcyJdIGFzICRydWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHJ1bGUpCiAgICAgICAgICAgICAgICAgICAgJF9ydWxlc1tdID0gJHJ1bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnRbInJ1bGVzIl0gPSAkX3J1bGVzOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgICRydWxlcyA9ICRwYXJ0WyJydWxlcyJdOwogICAgICAgICAgICBmb3JlYWNoKCRwYXJ0WyJydWxlcyJdIGFzICRrZXkyID0+ICRydWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmNvbnZlcnRSdWxlcygkcnVsZSwgJHBhcnRbImNzcyJdKTsKICAgICAgICAgICAgICAgIGlmICgkcmV0WyJydWxlIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHJ1bGVzWyRrZXkyXSA9ICRyZXRbInJ1bGUiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkcmV0WyJydWxlcyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRydWxlc1ska2V5Ml0pOwogICAgICAgICAgICAgICAgICAgICRydWxlcyA9IGFycmF5X21lcmdlKCRydWxlcywgJHJldFsicnVsZXMiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHJldFsib3RoZXIiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkcGFydHNbJGtleV1bIm90aGVyIl0gLj0gJHJldFsib3RoZXIiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkcGFydHNbJGtleV1bInJ1bGVzIl0gPSAkcnVsZXM7CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgkcGFydHMpOwogICAgICAgIAogICAgICAgICRyZXBsYWNlZCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcGFydHMgYXMgJHBhcnQpCiAgICAgICAgewogICAgICAgICAgICAvLyBGaXJlZm94IGJ1Z2ZpeCAtIG9uIG5lc3RlZCBmbGV4IGl0IG92ZXJmbG93cyB0aGUgcGFyZW50IGNvbnRlbnQgLSBkb2VzIG5vdCBzaG93IHNjcm9sbGJhcgogICAgICAgICAgICAvLyBieSBidWd6aWxsYSAxMDQzNTIwIHdlIG5lZWQgdG8gYWRkIG1pbi13aWR0aDogMDsgb3IgbWluLWhlaWdodDogMDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHVwZGF0ZTogc29tZXRpbWVzIG1pbi13aWR0aDogMCBkb2VzIG5vdCB3b3JrIGJ1dCBtaW4td2lkdGg6IDEgZml4ZWQgaXQuLi4gZ3JycnIKICAgICAgICAgICAgLy8gb24gdXBkYXRlIHNlZSBhbHNvIEF1dG9TaXplIGNsYXNzCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgifGZsZXg6ICoxO3xpbXMiLCAkcGFydFsiY3NzIl0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goInxtaW4td2lkdGg6fGltcyIsICRwYXJ0WyJjc3MiXSkpCiAgICAgICAgICAgICAgICAgICAgJHBhcnRbImNzcyJdID0gIm1pbi13aWR0aDogMDtcbiIuJHBhcnRbImNzcyJdOwogICAgICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCJ8bWluLWhlaWdodDp8aW1zIiwgJHBhcnRbImNzcyJdKSkKICAgICAgICAgICAgICAgICAgICAkcGFydFsiY3NzIl0gPSAibWluLWhlaWdodDogMDtcbiIuJHBhcnRbImNzcyJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJHBhcnQpOwogICAgICAgICAgICAkY3NzWCA9IGltcGxvZGUoIiwgIiwgJHBhcnRbInJ1bGVzIl0pLiIge1xuIi4kcGFydFsiY3NzIl0uIn1cbiI7CiAgICAgICAgICAgICRjc3NYIC49ICRwYXJ0WyJvdGhlciJdOwogICAgICAgICAgICAKICAgICAgICAgICAgJGNzc1ggPSBzdHJfcmVwbGFjZSgiy4ciLCAiIiwgJGNzc1gpOwogICAgICAgICAgICAkcGFydFsic3JjIl0gPSBzdHJfcmVwbGFjZSgiy4ciLCAiIiwgJHBhcnRbInNyYyJdKTsKCiAgICAgICAgICAgIC8vJGNzcyA9IHN0cl9yZXBsYWNlKCRwYXJ0WyJzcmMiXSwgJGNzc1gsICRjc3MpOwogICAgICAgICAgICBpZiAoIWluX2FycmF5KCRwYXJ0WyJzcmMiXSwgJHJlcGxhY2VkKSAmJiBzdHJwb3MoJGNzcywgJHBhcnRbInNyYyJdKSA9PT0gRkFMU0UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRhbGxGb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy9kdW1wKCJOT0siKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcnQpOwogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcGFydFsic3JjIl0pOwogICAgICAgICAgICAgICAgLy9lY2hvICRjc3M7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAvL3Nob3dNZXNzYWdlKCJDU1MzQ29udmVydGVyOiBjYW5ub3QgY29udmVydCAiLiRjc3NYLCBtdEVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCgiT0siKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkY3NzWCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXBsYWNlZFtdID0gJHBhcnRbInNyYyJdOwogICAgICAgICAgICAkY3NzID0gc3RyX3JlcGxhY2UoJHBhcnRbInNyYyJdLCAkY3NzWCwgJGNzcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRhbGxGb3VuZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vZWNobyAkY3NzOyBleGl0OwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgLy8gY29udmVydCBWaXN1YWwgUEhQIHNwZWNpYWwgSEVYIGFscGhhIGZvcm1hdCAjUlJHR0JCL0EgdG8gQ1NTIHJnYmEoKQogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifCgjWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdKS8oWzAtOVxcLl0rKXxpbXMiLCAkY3NzLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb2xvciA9IGhleFRvRGVjQ29sb3IoJG1hdGNoWzFdKTsKICAgICAgICAgICAgICAgICRjc3MgPSBzdHJfcmVwbGFjZSgkbWF0Y2hbMF0sICJyZ2JhKCIuJGNvbG9yWyJyIl0uIiwiLiRjb2xvclsiZyJdLiIsIi4kY29sb3JbImIiXS4iLCIuJG1hdGNoWzJdLiIpIiwgJGNzcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gY29udmVydCBHb29nbGUgZm9udC13ZWlnaHQKICAgICAgICAvLyAhISEhIERPIE5PVCBDT05WRVJUIEZPUiBQREYgUFJJTlRTICEhISEKICAgICAgICBpZiAoJHBhcmFtc1siZm9udFdlaWdodCJdICE9PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgICRmb250V2VpZ2h0cyA9IGFycmF5KAogICAgICAgICAgICAgICAgInRoaW4iID0+ICIxMDAiLAogICAgICAgICAgICAgICAgImV4dHJhbGlnaHQiID0+ICIyMDAiLAogICAgICAgICAgICAgICAgImxpZ2h0IiA9PiAiMzAwIiwKICAgICAgICAgICAgICAgICJyZWd1bGFyIiA9PiAiNDAwIiwKICAgICAgICAgICAgICAgICJtZWRpdW0iID0+ICI1MDAiLAogICAgICAgICAgICAgICAgInNlbWlib2xkIiA9PiAiNjAwIiwKICAgICAgICAgICAgICAgICJib2xkIiA9PiAiNzAwIiwKICAgICAgICAgICAgICAgICJleHRyYWJvbGQiID0+ICI4MDAiLAogICAgICAgICAgICAgICAgImJsYWNrIiA9PiAiOTAwIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KGZvbnQtd2VpZ2h0OiAqKShbXjtdKyk7fGltcyIsICRjc3MsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkZm9udFdlaWdodHNbc3RydG9sb3dlcigkbWF0Y2hbMl0pXSB8fCAkZm9udFdlaWdodHNbc3RyX3JlcGxhY2UoIi0iLCAiIiwgc3RydG9sb3dlcigkbWF0Y2hbMl0pKV0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkY3NzID0gc3RyX3JlcGxhY2UoJG1hdGNoWzBdLCAkbWF0Y2hbMV0uZmlyc3RfdmFsdWUoJGZvbnRXZWlnaHRzW3N0cnRvbG93ZXIoJG1hdGNoWzJdKV0sICRmb250V2VpZ2h0c1tzdHJfcmVwbGFjZSgiLSIsICIiLCBzdHJ0b2xvd2VyKCRtYXRjaFsyXSkpXSkuIjsiLCAkY3NzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vZ2xvYmFsICR4eDsKICAgICAgICAvLyR4eCsrOwogICAgICAgIC8vaWYgKCR4eCA9PSA0KQogICAgICAgIC8vewogICAgICAgIC8vdmFyX2R1bXAoJHBhcnRzKTsKICAgICAgICAvL3Zhcl9kdW1wKCRjc3NYKTsKICAgICAgICAvL2VjaG8gJGNzczsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgLy99CiAgICAgICAgLyoKICAgICAgICBmb3JlYWNoKCRwYXJ0czIgYXMgJHBhcnQpCiAgICAgICAgewogICAgICAgICAgICAkY3NzWCAuPSBpbXBsb2RlKCIsICIsICRwYXJ0WyJydWxlcyJdKS4iIHtcbiIuJHBhcnRbImNzcyJdLiJ9XG4iOwogICAgICAgIH0KICAgICAgICAqLwoKICAgICAgICAKICAgICAgICByZXR1cm4oJGNzcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHBhcnNlKCRjc3MpCiAgICB7CiAgICAgICAgLy9kdW1wKCRjc3MpOwogICAgICAgICRwQ1NTID0gYXJyYXkoKTsKICAgICAgICAvLyBAIGt2dWxpIEBtZWRpYSBwcmludCB7IHJ1bGVzICAuLi4uIH0KICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgifChcJFtee33CsF0rKXsoW159XSspfXxpcyIsICJcbiIuJGNzcy4iXG4iLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIC8vaWYgKHByZWdfbWF0Y2hfYWxsKCJ8KFwkW2EtekEtWjAtOS46LV8sIF0rKXsoW159XSspfXxpbXMiLCAiXG4iLiRjc3MuIlxuIiwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICAvL2lmIChwcmVnX21hdGNoX2FsbCgifFxuKChbYS16QS1aMC05Lis6LT5cXFtcXF1cIic9XywgXSspeyhbXn1dKyl9KXxtIiwgIlxuIi4kY3NzLiJcbiIsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgCiAgICAgICAgLy8gy4cgYSB8IG11c2ltIG5lY2hhdCEhISEgcHJvdG96ZSBqZSBwcmlkYW4gc2tyeiBwYXJzZXIKICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInxcbigoW2EtekEtWjAtOVxcLlxcK1xcKjo+I1x0XFxbXFxdXCInPV8sIFxcLcuHXFx8XSspeyhbXn1dKyl9KXxtcyIsICJcbiIuJGNzcy4iXG4iLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCRtYXRjaGVzKTsKICAgICAgICAgICAgZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRtYXRjaFsyXSA9IGV4cGxvZGUoIiwiLCAkbWF0Y2hbMl0pOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkbWF0Y2hbMl0gYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgJG1hdGNoWzJdWyRrZXldID0gdHJpbSgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHBDU1NbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICJydWxlcyIgPT4gJG1hdGNoWzJdLAogICAgICAgICAgICAgICAgICAgICJjc3MiID0+ICRtYXRjaFszXSwKICAgICAgICAgICAgICAgICAgICAic3JjIiA9PiAkbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgkcENTUyk7CiAgICAgICAgcmV0dXJuKCRwQ1NTKTsKICAgIH0KCgogICAgZnVuY3Rpb24gY29udmVydENvbG9yKCYkY3NzLCAmJGNzczIpCiAgICB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCJ8cmdiXCgoW14sXSspLChbXixdKyksKFteXCldKylcKXxpbXMiLCAkY3NzWyJjc3MiXSwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkaGV4ID0gZGVjVG9IZXhDb2xvcihhcnJheSgiciI9PnRyaW0oJG1hdGNoWzFdKSwgImciPT50cmltKCRtYXRjaFsyXSksICJiIj0+dHJpbSgkbWF0Y2hbM10pKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRjc3NbImNzcyJdID0gc3RyX3JlcGxhY2UoJG1hdGNoWzBdLCAkaGV4LCAkY3NzWyJjc3MiXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNvbnZlcnRMaW5lYXJHcmFkaWVudCgmJGNzcywgJiRjc3MyKSAgICAKICAgIHsKICAgICAgICAkcmVwbGFjZW1lbnRzID0gYXJyYXkoKTsKICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoWyBcdF0qKcuHYmFja2dyb3VuZDogKmxpbmVhci1ncmFkaWVudFwoKFteXCldKylcKShbXjtdKik7fGltcyIsICRjc3NbImNzcyJdLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRfcGFyYW1zID0gZXhwbG9kZSgiLCIsICRtYXRjaFsyXSk7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRjb2xvcnMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkX3BhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGtleSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJwb3NpdGlvbiJdID0gdHJpbSgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zWyJjb2xvcnMiXVtdID0gdHJpbSgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkY29sb3JzW10gPSBleHBsb2RlKCIgIiwgdHJpbSgkdmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkX2NzcyA9ICIiOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIElFIDUuNS04CiAgICAgICAgICAgICAgICAkX2NzcyAuPSAkbWF0Y2hbMV0uImZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9Ii4kY29sb3JzWzBdWzBdLiIsIGVuZENvbG9yU3RyPSIuJGNvbG9yc1tjb3VudCgkY29sb3JzKS0xXVswXS4iLCBHcmFkaWVudFR5cGU9Ii4oJHBhcmFtc1sicG9zaXRpb24iXSA9PSAibGVmdCIgfHwgJHBhcmFtc1sicG9zaXRpb24iXSA9PSAicmlnaHQiID8gIjEiIDogIjAiKS4iKTtcbiI7CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgLy8gU2FmYXJpIDUuMSwgQ2hyb21lIDEwKyAKICAgICAgICAgICAgICAgICRfY3NzIC49ICRtYXRjaFsxXS4iYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoIi4kbWF0Y2hbMl0uIikiLiRtYXRjaFszXS4iO1xuIjsKICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggMy42KwogICAgICAgICAgICAgICAgJF9jc3MgLj0gJG1hdGNoWzFdLiJiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCgiLiRtYXRjaFsyXS4iKSIuJG1hdGNoWzNdLiI7XG4iOwogICAgICAgICAgICAgICAgLy8gT3BlcmEgMTEuMTArCiAgICAgICAgICAgICAgICAkX2NzcyAuPSAkbWF0Y2hbMV0uImJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCgiLiRtYXRjaFsyXS4iKSIuJG1hdGNoWzNdLiI7XG4iOwogICAgICAgICAgICAgICAgLy8gSUUgMTAKICAgICAgICAgICAgICAgICRfY3NzIC49ICRtYXRjaFsxXS4iYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCgiLiRtYXRjaFsyXS4iKSIuJG1hdGNoWzNdLiI7XG4iOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQKICAgICAgICAgICAgICAgICRfY3NzIC49ICRtYXRjaFswXS4iO1xuIjsKCiAgICAgICAgICAgICAgICAkY3NzWyJjc3MiXSA9IHN0cl9yZXBsYWNlKCRtYXRjaFswXSwgJF9jc3MsICRjc3NbImNzcyJdKTsKICAgICAgICAgICAgICAgIC8vJGNzczJbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgIC8vInJ1bGVzIiA9PiAkY3NzWyJydWxlcyJdLAogICAgICAgICAgICAgICAgICAgIC8vImNzcyIgPT4gJF9jc3MsCiAgICAgICAgICAgICAgICAvLyk7CgogICAgICAgICAgICAgICAgLy8gSUUgOS0xMAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICRfY3NzID0gYXJyYXkoInJ1bGVzIiA9PiBhcnJheSgpKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJGNzc1sicnVsZXMiXSBhcyAkcnVsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyRfY3NzWyJydWxlcyJdW10gPSAiOnJvb3QgIi4kcnVsZTsKICAgICAgICAgICAgICAgICAgICAkX2Nzc1sicnVsZXMiXVtdID0gImh0bWwuZ3RlLWllOSAiLiRydWxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvdW50KCRjb2xvcnMpID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkX2Nzc1siY3NzIl0gID0gJG1hdGNoWzFdLiJmaWx0ZXI6IG5vbmU7XG4iOwogICAgICAgICAgICAgICAgICAgICRfY3NzWyJjc3MiXSAuPSAkbWF0Y2hbMV0uImJhY2tncm91bmQ6IHVybCgiLiR0aGlzLT51cmwuImxpbmVhci1ncmFkaWVudC5waHA/Ii5nZXRQYXJhbXNBc0xpbmsoJHBhcmFtcykuIik7XG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJF9jc3NbImNzcyJdIC49ICRtYXRjaFsxXS4iYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCgiLiRtYXRjaFsyXS4iKTtcbiI7CiAgICAgICAgICAgICAgICAkY3NzMltdID0gJF9jc3M7CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnZlcnRBc3BlY3RSYXRpbygmJGNzcywgJiRjc3MyKSAgICAKICAgIHsKICAgICAgICAvLyBjaHJvbWUsIEZGLCBvcGVyYSwgSUUgPj0gOAogICAgICAgIAogICAgICAgICRyZXBsYWNlbWVudHMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbIFx0XSopy4dyYXRpbzogKihbXlxuO10rKXxpbXMiLCAkY3NzWyJjc3MiXSwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkbWF0Y2hbMl07CiAgICAgICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiXCIiLCAiIiwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCInIiwgIiIsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgiICIsICIiLCAkdmFsdWUpOwoKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHZhbHVlLCAiOiIpICE9PSBGQUxTRSB8fCBzdHJwb3MoJHZhbHVlLCAiLyIpICE9PSBGQUxTRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSBldmFsUGhwKCJyZXR1cm4oIi5zdHJfcmVwbGFjZSgiOiIsICIvIiwgJHZhbHVlKS4iKTsiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJF9jc3MgPSBhcnJheSgicnVsZXMiID0+IGFycmF5KCkpOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkY3NzWyJydWxlcyJdIGFzICRydWxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRfY3NzWyJydWxlcyJdW10gPSAkcnVsZS4iOmJlZm9yZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkX2Nzc1siY3NzIl0gLj0gImNvbnRlbnQ6IFwiXCI7XG4iOwogICAgICAgICAgICAgICAgJF9jc3NbImNzcyJdIC49ICJmbG9hdDogbGVmdDtcbiI7CiAgICAgICAgICAgICAgICAkX2Nzc1siY3NzIl0gLj0gInBhZGRpbmctYm90dG9tOiAiLihyb3VuZCgxMDAvJHZhbHVlLCA2KSkuIiU7XG4iOwogICAgICAgICAgICAgICAgJGNzczJbXSA9ICRfY3NzOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkX2NzcyA9IGFycmF5KCJydWxlcyIgPT4gYXJyYXkoKSk7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRjc3NbInJ1bGVzIl0gYXMgJHJ1bGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJF9jc3NbInJ1bGVzIl1bXSA9ICRydWxlLiI6YWZ0ZXIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJF9jc3NbImNzcyJdIC49ICJjb250ZW50OiBcIlwiO1xuIjsKICAgICAgICAgICAgICAgICRfY3NzWyJjc3MiXSAuPSAiZGlzcGxheTogdGFibGU7XG4iOwogICAgICAgICAgICAgICAgJF9jc3NbImNzcyJdIC49ICJjbGVhcjogYm90aDtcbiI7CiAgICAgICAgICAgICAgICAkY3NzMltdID0gJF9jc3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNvbnZlcnRTaW1wbGVQcm9wZXJ0aWVzKCRwcm9wZXJ0aWVzLCAmJGNzcywgJiRjc3MyKSAgICAKICAgIHsKICAgICAgICBmb3JlYWNoKCRwcm9wZXJ0aWVzIGFzICRwcm9wZXJ0eSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbIFx0XSopy4ciLiRwcm9wZXJ0eS4iOiAqKFteO10rKTt8aW1zIiwgJGNzc1siY3NzIl0sICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRfY3NzID0gIiI7CiAgICAgICAgICAgICAgICAgICAgJF9jc3MgLj0gJG1hdGNoWzFdLiItbW96LSIuJHByb3BlcnR5LiI6ICIuJG1hdGNoWzJdLiI7XG4iOwogICAgICAgICAgICAgICAgICAgICRfY3NzIC49ICRtYXRjaFsxXS4iLXdlYmtpdC0iLiRwcm9wZXJ0eS4iOiAiLiRtYXRjaFsyXS4iO1xuIjsKICAgICAgICAgICAgICAgICAgICAkX2NzcyAuPSAkbWF0Y2hbMV0uIi1tcy0iLiRwcm9wZXJ0eS4iOiAiLiRtYXRjaFsyXS4iO1xuIjsKICAgICAgICAgICAgICAgICAgICAkX2NzcyAuPSAkbWF0Y2hbMV0uJHByb3BlcnR5LiI6ICIuJG1hdGNoWzJdLiI7XG4iOwoKICAgICAgICAgICAgICAgICAgICAkY3NzWyJjc3MiXSA9IHN0cl9yZXBsYWNlKCRtYXRjaFswXSwgJF9jc3MsICRjc3NbImNzcyJdKTsKICAgICAgICAgICAgICAgICAgICAvLyRjc3MyW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAvLyAgICAicnVsZXMiID0+ICRjc3NbInJ1bGVzIl0sCiAgICAgICAgICAgICAgICAgICAgLy8gICAgImNzcyIgPT4gJF9jc3MsCiAgICAgICAgICAgICAgICAgICAgLy8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBjb252ZXJ0U2ltcGxlUHJvcGVydGllczIoJHByb3BlcnRpZXMsICYkY3NzLCAmJGNzczIpICAgIAogICAgewogICAgICAgIGZvcmVhY2goJHByb3BlcnRpZXMgYXMgJHByb3BlcnR5ID0+ICRyZXBsYWNlbWVudCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbIFx0XSopy4ciLiRwcm9wZXJ0eS4iOiAqKFteO10rKTt8aW1zIiwgJGNzc1siY3NzIl0sICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRfY3NzID0gIiI7CiAgICAgICAgICAgICAgICAgICAgJF9jc3MgLj0gJG1hdGNoWzFdLiRyZXBsYWNlbWVudC4iOiAiLiRtYXRjaFsyXS4iO1xuIjsKICAgICAgICAgICAgICAgICAgICAkX2NzcyAuPSAkbWF0Y2hbMV0uJHByb3BlcnR5LiI6ICIuJG1hdGNoWzJdLiI7XG4iOwoKICAgICAgICAgICAgICAgICAgICAkY3NzWyJjc3MiXSA9IHN0cl9yZXBsYWNlKCRtYXRjaFswXSwgJF9jc3MsICRjc3NbImNzcyJdKTsKICAgICAgICAgICAgICAgICAgICAvLyRjc3MyW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAvLyAgICAicnVsZXMiID0+ICRjc3NbInJ1bGVzIl0sCiAgICAgICAgICAgICAgICAgICAgLy8gICAgImNzcyIgPT4gJF9jc3MsCiAgICAgICAgICAgICAgICAgICAgLy8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBjb252ZXJ0U2ltcGxlUHJvcGVydHlWYWx1ZXMoJHZhbHVlcywgJiRjc3MsICYkY3NzMikgICAgCiAgICB7CiAgICAgICAgZm9yZWFjaCgkdmFsdWVzIGFzICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJHZhbHVlKSkKICAgICAgICAgICAgICAgICR2YWx1ZSA9IGFycmF5KCR2YWx1ZSwgYXJyYXkoKSk7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgifChbIFx0XSopy4coW146XSspOiAqIi4kdmFsdWVbMF0uIjt8aW1zIiwgJGNzc1siY3NzIl0sICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRfY3NzID0gIiI7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkdmFsdWVbMV0gYXMgJHZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgJF9jc3MgLj0gJG1hdGNoWzFdLiRtYXRjaFsyXS4iOiAiLiR2YWwuIjtcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRfY3NzIC49ICRtYXRjaFsxXS4kbWF0Y2hbMl0uIjogLW1vei0iLiR2YWx1ZVswXS4iO1xuIjsKICAgICAgICAgICAgICAgICAgICAkX2NzcyAuPSAkbWF0Y2hbMV0uJG1hdGNoWzJdLiI6IC13ZWJraXQtIi4kdmFsdWVbMF0uIjtcbiI7CiAgICAgICAgICAgICAgICAgICAgJF9jc3MgLj0gJG1hdGNoWzFdLiRtYXRjaFsyXS4iOiAtbXMtIi4kdmFsdWVbMF0uIjtcbiI7CiAgICAgICAgICAgICAgICAgICAgJF9jc3MgLj0gJG1hdGNoWzFdLiRtYXRjaFsyXS4iOiAiLiR2YWx1ZVswXS4iO1xuIjsKCiAgICAgICAgICAgICAgICAgICAgJGNzc1siY3NzIl0gPSBzdHJfcmVwbGFjZSgkbWF0Y2hbMF0sICRfY3NzLCAkY3NzWyJjc3MiXSk7CiAgICAgICAgICAgICAgICAgICAgLy8kY3NzMltdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgLy8gICAgInJ1bGVzIiA9PiAkY3NzWyJydWxlcyJdLAogICAgICAgICAgICAgICAgICAgIC8vICAgICJjc3MiID0+ICRfY3NzLAogICAgICAgICAgICAgICAgICAgIC8vKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRPclJ1bGVQYXJ0cygkcGFydHMpCiAgICB7CiAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPT0gMSkKICAgICAgICAgICAgcmV0dXJuKCRwYXJ0c1swXSk7CiAgICAgICAgCiAgICAgICAgJHJldCA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgJG1haW5QYXJ0cyA9IGFycmF5X3NoaWZ0KCRwYXJ0cyk7CiAgICAgICAgJHN1YlBhcnRzID0gJHRoaXMtPmdldE9yUnVsZVBhcnRzKCRwYXJ0cyk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkbWFpblBhcnRzIGFzICRtYWluUGFydCkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJHN1YlBhcnRzIGFzICRzdWJQYXJ0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmV0W10gPSAkbWFpblBhcnQuIiAiLiRzdWJQYXJ0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZXhwYW5kUnVsZXMoJHJ1bGUsICRjc3MpCiAgICB7CgogICAgfQogICAgCiAgICBmdW5jdGlvbiBjb252ZXJ0UnVsZXMoJHJ1bGUsICRjc3MpCiAgICB7CiAgICAgICAgJHJldCA9IGFycmF5KCJydWxlcyI9PmFycmF5KCksICJwYXJ0cyI9PmFycmF5KCksICJydWxlIj0+JHJ1bGUpOwogICAgICAgIAogICAgICAgIC8vIGNvbnZlcnQgcnVsZXMgc3RhcnRpbmcgd2l0aCBudW1iZXJzIHRvIFxbSEVYXVtTUEFDRV0uLi4KICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoW1xcLiNdKShbMC05XSl8aXMiLCAkcnVsZSwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcnVsZSA9IHN0cl9yZXBsYWNlKCRtYXRjaFswXSwgJG1hdGNoWzFdLiJcXCIuc3RyVG9IZXgoJG1hdGNoWzJdKS4iICIsICRydWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmV0WyJydWxlIl0gPSAkcnVsZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gYWxsIG11c3QgYmUgYXMgc2VwYXJhdGUgcnVsZXMKICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoInwoLio/KTo6cGxhY2Vob2xkZXIoLio/KXxpcyIsICRydWxlLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpKQogICAgICAgIHsKICAgICAgICAgICAgJHJldFsib3RoZXIiXSAuPSAkbWF0Y2hlc1swXVsxXS4iOi1tb3otcGxhY2Vob2xkZXIiLiRtYXRjaGVzWzBdWzJdLiIgeyBcbiIuJGNzcy4iXG59XG4iOwogICAgICAgICAgICAkcmV0WyJvdGhlciJdIC49ICRtYXRjaGVzWzBdWzFdLiI6Oi1tb3otcGxhY2Vob2xkZXIiLiRtYXRjaGVzWzBdWzJdLiIgeyBcbiIuJGNzcy4iXG59XG4iOwogICAgICAgICAgICAkcmV0WyJvdGhlciJdIC49ICRtYXRjaGVzWzBdWzFdLiI6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIiLiRtYXRjaGVzWzBdWzJdLiIgeyBcbiIuJGNzcy4iXG59XG4iOwogICAgICAgICAgICAkcmV0WyJvdGhlciJdIC49ICRtYXRjaGVzWzBdWzFdLiI6LW1zLWlucHV0LXBsYWNlaG9sZGVyIi4kbWF0Y2hlc1swXVsyXS4iIHsgXG4iLiRjc3MuIlxufVxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBjb252ZXJ0RnJvbUZpbGUoJHBhcmFtcykKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHBhcmFtcykpCiAgICAgICAgICAgICRmaWxlID0gJHBhcmFtc1siZmlsZSJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGZpbGUgPSAkcGFyYW1zOwogICAgICAgIAogICAgICAgICRjc3MgPSBfZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICAgICAgICRjc3MgPSBwYXJzZVBIUCgkY3NzKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPmNvbnZlcnQoJGNzcykpOwogICAgfQp9ICAKLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSW1hZ2UvSW1hZ2UuY2xhc3MucGhwIC0tLS0tLS0gDQoKY2xhc3MgVEltYWdlIGV4dGVuZHMgVENvbXBvbmVudCAKewogICAgdmFyICRsYXllcnMgPSBhcnJheSgpOwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uR2V0UHJvcGVydGllcygpCiAgICB7CiAgICAgICAgJHByb3BlcnRpZXMgPSBwYXJlbnQ6Om9uR2V0UHJvcGVydGllcygpOwoKICAgICAgICAkcHJvcGVydGllcyA9IG1lcmdlUHJvcGVydGllcygkcHJvcGVydGllcywgYXJyYXkoCiAgICAgICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249SW1hZ2UiLAogICAgICAgICAgICAibmFtZT10eXBlLGNhcHRpb249VHlwZSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXxqcGd8cG5nfGdpZiIsCiAgICAgICAgICAgICJuYW1lPXJlc2l6ZUFuaW1hdGVkR2lmLGNhcHRpb249UmVzaXplIEFuaW1hdGVkIEdpZixvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAgICAgIm5hbWU9cXVhbGl0eSxjYXB0aW9uPVF1YWxpdHksb2JqZWN0PVRleHRFZGl0LHBvc3RmaXg9JSIsCiAgICAgICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249VGVtcGxhdGVzIiwKICAgICAgICAgICAgIm5hbWU9ZmllbGQsY2FwdGlvbj1GaWVsZCxvYmplY3Q9VGV4dEVkaXQscHJlZml4PVsscG9zdGZpeD0uZ2V0UGF0aCgpXSIsCiAgICAgICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249RGF0YSIsCiAgICAgICAgICAgICJuYW1lPXZhbHVlLGNhcHRpb249SW1hZ2Usb2JqZWN0PUZpbGVFZGl0IiwKICAgICAgICAgICAgIm5hbWU9YWpheExvYWQsY2FwdGlvbj1BSkFYIExvYWQsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgICAgICJuYW1lPWRlZmF1bHRJbWFnZSxjYXB0aW9uPURlZmF1bHQgSW1hZ2Usb2JqZWN0PUZpbGVFZGl0IiwKICAgICAgICAgICAgIm5hbWU9ZGVmYXVsdEltYWdlRWZmZWN0cyxjYXB0aW9uPUVtcHR5IEltYWdlIEVmZmVjdHMsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgICAgICJuYW1lPWVtcHR5SW1hZ2UsY2FwdGlvbj1FbXB0eSBJbWFnZSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAgICAgIm5hbWU9ZW1wdHlJbWFnZUJhY2tncm91bmRDb2xvcixjYXB0aW9uPUVtcHR5IEltYWdlIEJhY2tncm91bmQgQ29sb3Isb2JqZWN0PUNvbG9yRWRpdCIsCiAgICAgICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249QmVoYXZpb3IiLAogICAgICAgICAgICAibmFtZT1hbHQsY2FwdGlvbj1BbHQsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAgICAgIm5hbWU9dGl0bGUsY2FwdGlvbj1UaXRsZSxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICJuYW1lIiA9PiAiYXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAiY2FwdGlvbiIgPT4gIkF0dHJpYnV0ZXMiLAogICAgICAgICAgICAgICAgIm9iamVjdCIgPT4gIkdyaWRFZGl0IiwKICAgICAgICAgICAgICAgICJmaWVsZHMiID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgIGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IiA9PiBhcnJheSgib2JqZWN0Ij0+IlRleHRFZGl0IiwicGFyYW1zIj0+YXJyYXkoKSksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICJ2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QiID0+IGFycmF5KCJvYmplY3QiPT4iVGV4dEVkaXQiLCJwYXJhbXMiPT5hcnJheSgpKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApKTsKICAgICAgICAKICAgICAgICAkcHJvcGVydGllcyA9IG1lcmdlUHJvcGVydGllcygkcHJvcGVydGllcywgCiAgICAgICAgICAgIFRJbWFnZVJlc2l6ZTo6b25HZXRQcm9wZXJ0aWVzKCkKICAgICAgICApOwoKICAgICAgICAkcHJvcGVydGllcyA9IG1lcmdlUHJvcGVydGllcygkcHJvcGVydGllcywgYXJyYXkoCiAgICAgICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249RWZmZWN0cyIsCiAgICAgICAgICAgIGFycmF5KAogICAgICAgICAgICAgICAgIm5hbWUiID0+ICJlZmZlY3RzIiwKICAgICAgICAgICAgICAgICJjYXB0aW9uIiA9PiAiRWZmZWN0cyIsCiAgICAgICAgICAgICAgICAib2JqZWN0IiA9PiAiR3JpZEVkaXQiLAogICAgICAgICAgICAgICAgImZpZWxkcyIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIgPT4gYXJyYXkoIm9iamVjdCI9PiJPYmplY3RFZGl0IiwicGFyYW1zIj0+YXJyYXkoImV4dGVuZHMiPT4iSW1hZ2VFZmZlY3QiKSksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICJuZXdMYXllciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QiID0+IGFycmF5KCJvYmplY3QiPT4iQ2hlY2tCb3giKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgLy8ibmFtZT1lZmZlY3RzLGNhcHRpb249RWZmZWN0cyxvYmplY3Q9T2JqZWN0RWRpdCxjbGFzc05hbWU9VEltYWdlRWZmZWN0IiwKICAgICAgICAgICAgIm5hbWU9Z3JvdXAsY2FwdGlvbj1Db250ZW50IEVmZmVjdCIsCiAgICAgICAgICAgICJuYW1lPWNvbnRlbnRFZmZlY3QsY2FwdGlvbj1Db250ZW50IEVmZmVjdCxvYmplY3Q9T2JqZWN0RWRpdCxleHRlbmRzPUltYWdlQ29udGVudEVmZmVjdCIsCiAgICAgICAgKSk7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKFRJbWFnZVJlc2l6ZTo6Z2V0UHJvcGVydGllcygpKTsKICAgICAgICAvKgogICAgICAgICRfb2JqZWN0VHlwZXMgPSBleHBsb2RlTGlzdChnZXRPYmplY3RUeXBlcygpKTsKICAgICAgICAkb2JqZWN0VHlwZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJF9vYmplY3RUeXBlcyBhcyAkb2JqZWN0VHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgiVEltYWdlRWZmZWN0IiwgY2xhc3NfcGFyZW50cygiVCIuJG9iamVjdFR5cGUpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG9iamVjdFR5cGVzW10gPSAkb2JqZWN0VHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3JlYWNoKCRvYmplY3RUeXBlcyBhcyAkb2JqZWN0VHlwZSkKICAgICAgICB7CiAgICAgICAgICAgICRwcm9wZXJ0aWVzID0gYXJyYXlfbWVyZ2UoJHByb3BlcnRpZXMsIGdldE9iamVjdCgkb2JqZWN0VHlwZSktPmdldFByb3BlcnRpZXMoKSk7CiAgICAgICAgfQogICAgICAgICovCiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRwcm9wZXJ0aWVzKTsKICAgICAgICAKICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldENvbnRlbnQoJiRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiKQogICAgewogICAgICAgIC8vcmV0dXJuKCJYIik7CiAgICAgICAgLy9zdGFydFByb2ZpbGUoIlRJbWFnZTo6b25HZXRDb250ZW50IC0gZXh0cmFjdFBhcmFtcyIpOwogICAgICAgIC8vJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgIC8vc3RvcFByb2ZpbGUoIlRJbWFnZTo6b25HZXRDb250ZW50IC0gZXh0cmFjdFBhcmFtcyIpOwogICAgICAgIC8vc3RhcnRQcm9maWxlKCJUSW1hZ2U6Om9uR2V0Q29udGVudCAtIGdldEhlYWRIdG1sIik7CiAgICAgICAgJHRoaXMtPmdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgICAgIC8vc3RvcFByb2ZpbGUoIlRJbWFnZTo6b25HZXRDb250ZW50IC0gZ2V0SGVhZEh0bWwiKTsKICAgICAgICAvL3N0YXJ0UHJvZmlsZSgiVEltYWdlOjpvbkdldENvbnRlbnQgLSBpbml0Iik7CiAgICAgICAgJHRoaXMtPmluaXQoJHBhcmFtcyk7CiAgICAgICAgLy9zdG9wUHJvZmlsZSgiVEltYWdlOjpvbkdldENvbnRlbnQgLSBpbml0Iik7CiAgICAgICAgCiAgICAgICAgaWYgKCEkdmFsdWUgJiYgJHBhcmFtc1sidmFsdWUiXSkKICAgICAgICAgICAgJHZhbHVlID0gJHBhcmFtc1sidmFsdWUiXTsKICAgICAgICBpZiAoISR2YWx1ZSAmJiAkcGFyYW1zWyJmaWxlIl0pCiAgICAgICAgICAgICR2YWx1ZSA9ICRwYXJhbXNbImZpbGUiXTsKICAgICAgICBpZiAoISR2YWx1ZSAmJiAkcGFyYW1zWyJmaWVsZCJdKQogICAgICAgICAgICAkdmFsdWUgPSAkcGFyYW1zWyJmaWVsZCJdOyAgICAvLyB1c2VkIHByZWZpeD1bIGFuZCBwb3N0Zml4PS5nZXRQYXRoKCldCiAgICAgICAgCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgaWYgKCEkcGFyYW1zWyJyZXNpemVNZXRob2QiXSkKICAgICAgICAgICAgJHBhcmFtc1sicmVzaXplTWV0aG9kIl0gPSAic2NhbGUiOwoKICAgICAgICAkcGFyYW1zWyJleHRlcm4iXSA9IHRydWU7CiAgICAgICAgJHVybCA9ICR0aGlzLT5nZXRVcmwoJHBhcmFtcywgJHZhbHVlKTsKICAgICAgICAvL2R1bXAoJHVybCk7CiAgICAgICAgCiAgICAgICAgJGNzc1BhcmFtcyA9ICRwYXJhbXM7CiAgICAgICAgaWYgKChzdHJwb3MoJGNzc1BhcmFtc1sid2lkdGgiXSwgIm1tIikgPT09IEZBTFNFICYmIHN0cnBvcygkY3NzUGFyYW1zWyJoZWlnaHQiXSwgIm1tIikgPT09IEZBTFNFKSkKICAgICAgICB7CiAgICAgICAgICAgIHVuc2V0KCRjc3NQYXJhbXNbIndpZHRoIl0pOwogICAgICAgICAgICB1bnNldCgkY3NzUGFyYW1zWyJoZWlnaHQiXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCRwYXJhbXNbInJlc2l6ZU1ldGhvZCJdID09ICJzY2FsZSIgJiYgKCRjc3NQYXJhbXNbIndpZHRoIl0gfHwgJGNzc1BhcmFtc1siaGVpZ2h0Il0pKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBnZXRQYXRoRnJvbVVybCgkdXJsKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRzaXplID0gZ2V0aW1hZ2VzaXplKCRmaWxlKTsKICAgICAgICAgICAgJGltYWdlV2lkdGggPSAkc2l6ZVswXTsKICAgICAgICAgICAgJGltYWdlSGVpZ2h0ID0gJHNpemVbMV07CiAgICAgICAgICAgICRyZXNpemVXaWR0aCA9IGV4dHJhY3RGbG9hdCgkY3NzUGFyYW1zWyJ3aWR0aCJdKTsKICAgICAgICAgICAgJHJlc2l6ZUhlaWdodCA9IGV4dHJhY3RGbG9hdCgkY3NzUGFyYW1zWyJoZWlnaHQiXSk7CiAgICAgICAgICAgICRpbWFnZUFzcGVjdFJhdGlvID0gJGltYWdlV2lkdGgvJGltYWdlSGVpZ2h0OwogICAgICAgICAgICAkZW5sYXJnZSA9IHRvQm9vbCgkY3NzUGFyYW1zWyJyZXNpemVTbWFsbCJdKTsKCiAgICAgICAgICAgIGlmICgkcmVzaXplV2lkdGggIT09IDAgJiYgJHJlc2l6ZUhlaWdodCAhPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCRpbWFnZVdpZHRoLyRyZXNpemVXaWR0aCA+PSAkaW1hZ2VIZWlnaHQvJHJlc2l6ZUhlaWdodCkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHcgPSAkcmVzaXplV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgJGggPSBmbG9vcigkcmVzaXplV2lkdGgvJGltYWdlQXNwZWN0UmF0aW8pOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGggPSAkcmVzaXplSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICR3ID0gZmxvb3IoJHJlc2l6ZUhlaWdodCokaW1hZ2VBc3BlY3RSYXRpbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHJlc2l6ZUhlaWdodCA9PT0gMCAmJiAoJGVubGFyZ2UgfHwgJGltYWdlV2lkdGggPiAkcmVzaXplV2lkdGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR3ID0gJHJlc2l6ZVdpZHRoOwogICAgICAgICAgICAgICAgICAgICRoID0gZmxvb3IoJHJlc2l6ZVdpZHRoLyRpbWFnZUFzcGVjdFJhdGlvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRyZXNpemVXaWR0aCA9PT0gMCAmJiAoJGVubGFyZ2UgfHwgJGltYWdlSGVpZ2h0ID4gJHJlc2l6ZUhlaWdodCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHcgPSBmbG9vcigkcmVzaXplSGVpZ2h0KiRpbWFnZUFzcGVjdFJhdGlvKTsKICAgICAgICAgICAgICAgICAgICAkaCA9ICRyZXNpemVIZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjc3NQYXJhbXNbIndpZHRoIl0gPSAkdy4ibW0iOwogICAgICAgICAgICAkY3NzUGFyYW1zWyJoZWlnaHQiXSA9ICRoLiJtbSI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgaWYgKCEkcGFyYW1zWyJ0aXRsZSJdKQogICAgICAgICAgICAkcGFyYW1zWyJ0aXRsZSJdID0gJHBhcmFtc1siYWx0Il07CiAgICAgICAgaWYgKCEkcGFyYW1zWyJhbHQiXSkKICAgICAgICAgICAgJHBhcmFtc1siYWx0Il0gPSAkcGFyYW1zWyJ0aXRsZSJdOwogICAgICAgICovCiAgICAgICAgCiAgICAgICAgLy8gc29tZXRoaW5nIHdhcyB3cm9uZz8gCiAgICAgICAgaWYgKCRjc3NQYXJhbXNbIndpZHRoIl0gPT0gIjBtbSIgfHwgJGNzc1BhcmFtc1siaGVpZ2h0Il0gPT0gIjBtbSIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNEZXZlbG9wZXIoKSkKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2U6OmdldENvbnRlbnQoKSAtIHdpZGh0IG9yIGhlaWdodCBpcyAwbW0iLCBtdFdhcm5pbmcpOwogICAgICAgICAgICAKICAgICAgICAgICAgdW5zZXQoJGNzc1BhcmFtc1sid2lkdGgiXSk7CiAgICAgICAgICAgIHVuc2V0KCRjc3NQYXJhbXNbImhlaWdodCJdKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJGNzc1BhcmFtcyk7IGV4aXQ7CiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIC8vZHVtcCgkdXJsKTsKICAgICAgICBpZiAoJHVybCkKICAgICAgICB7CiAgICAgICAgICAgICRodG1sIC49ICI8aW1nIHNyYz0nIi4kdXJsLiInIGFsdD0nIi4kcGFyYW1zWyJhbHQiXS4iJyB0aXRsZT0nIi4kcGFyYW1zWyJ0aXRsZSJdLiInIHN0eWxlPSciLmdldENTU1BhcmFtcygkY3NzUGFyYW1zKS4iJyBjbGFzcz0nIi4kcGFyYW1zWyJjbGFzcyJdLiInIGlkPSciLiR0aGlzLT5pZC4iJyAiLmdldEF0dHJpYnV0ZVBhcmFtcyhhcnJheSgiYXR0cmlidXRlcyI9PiRwYXJhbXNbImF0dHJpYnV0ZXMiXSkpLiIgLz4iOwogICAgICAgIAogICAgICAgICAgICBpZiAoJHBhcmFtc1siY29udGVudEVmZmVjdCJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ29udGVudEVmZmVjdCA9IGdldE9iamVjdCgkcGFyYW1zWyJjb250ZW50RWZmZWN0Il1bIm9iamVjdCJdKTsKICAgICAgICAgICAgICAgICRjb250ZW50RWZmZWN0UGFyYW1zID0gJHBhcmFtc1siY29udGVudEVmZmVjdCJdWyJwYXJhbXMiXTsKICAgICAgICAgICAgICAgIGdsb2JhbCAkRGF0YVNldDsKICAgICAgICAgICAgICAgIC8vZHVtcCgkRGF0YVNldCk7CiAgICAgICAgICAgICAgICAvL2lmICghJGNvbnRlbnRFZmZlY3RQYXJhbXNbImRhdGFTZXQiXSAmJiAkRGF0YVNldCkKICAgICAgICAgICAgICAgIC8vICAgICRjb250ZW50RWZmZWN0UGFyYW1zWyJkYXRhU2V0Il0gPSAkRGF0YVNldDsKCiAgICAgICAgICAgICAgICBpZiAoJENvbnRlbnRFZmZlY3QpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRFZmZlY3QtPkRhdGFTZXQgPSAkRGF0YVNldDsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJENvbnRlbnRFZmZlY3QpOwogICAgICAgICAgICAgICAgICAgICRodG1sID0gJENvbnRlbnRFZmZlY3QtPmdldENvbnRlbnQoJGNvbnRlbnRFZmZlY3RQYXJhbXMsICRodG1sKTsKICAgICAgICAgICAgICAgICAgICAvL2VjaG8gJGh0bWw7CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9CgogICAgZnVuY3Rpb24gb25HZXREaXNwbGF5VmFsdWUoJHJlY29yZFZhbHVlcz1hcnJheSgpKQogICAgewogICAgICAgIHJldHVybigkdGhpcy0+Z2V0Q29udGVudCgkdGhpcy0+cGFyYW1zKSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFBhdGgoJHBhcmFtcz1hcnJheSgpLCAkdmFsdWU9IiIpCiAgICB7CiAgICAgICAgJHVybCA9ICR0aGlzLT5nZXRVcmwoJHBhcmFtcywgJHZhbHVlKTsKICAgICAgICAkcGF0aCA9IGdldFBhdGhGcm9tVXJsKCR1cmwpOwogICAgICAgIAogICAgICAgIHJldHVybigkcGF0aCk7CiAgICB9CgoJZnVuY3Rpb24gZ2V0VXJsKCRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiKQogICAgewogICAgICAgICR0UyA9IGdldE1pY3JvdGltZSgpOwogICAgICAgIC8vIHRvIGRlYnVnIGluIENTUyBzZWUgdGhlIC5jc3Mgc291cmNlIGZvciBiYWNrZ3JvdW5kOiB1cmwoVkFSX0RVTVBfREVCVUdfU1RSSU5HKS4uLgogICAgICAgIHN0YXJ0UHJvZmlsZSgiVEltYWdlOjpnZXRVcmwiKTsKICAgICAgICBpZiAoc3RycG9zKCR2YWx1ZSwgImh0dHA6Ly8iKSA9PT0gMCB8fCBzdHJwb3MoJHZhbHVlLCAiaHR0cHM6Ly8iKSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHN0b3BQcm9maWxlKCJUSW1hZ2U6OmdldFVybCIpOwogICAgICAgICAgICByZXR1cm4oJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgIGlmICghJHZhbHVlICYmICRwYXJhbXNbImZpbGUiXSkKICAgICAgICAgICAgJHZhbHVlID0gJHBhcmFtc1siZmlsZSJdOwogICAgICAgIGlmICghJHZhbHVlICYmICRwYXJhbXNbInZhbHVlIl0pCiAgICAgICAgICAgICR2YWx1ZSA9ICRwYXJhbXNbInZhbHVlIl07CiAgICAgICAgCiAgICAgICAgJHZhbHVlID0gX2h0bWxfZW50aXR5X2RlY29kZSgkdmFsdWUpOwogICAgCiAgICAgICAgJHZhbHVlID0gcGFyc2VQSFAoJHZhbHVlKTsKCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgJF92YWx1ZSA9ICR2YWx1ZTsKICAgICAgICAKICAgICAgICAkcGFyYW1zMiA9ICRwYXJhbXM7CiAgICAgICAgdW5zZXQoJHBhcmFtczJbIl9fZXh0cmFjdGVkIl0pOwogICAgICAgIHVuc2V0KCRwYXJhbXMyWyJfX3BhcmFtcyJdKTsKICAgICAgICAvL3Vuc2V0KCRwYXJhbXMyWyJ0aXRsZSJdKTsKICAgICAgICB1bnNldCgkcGFyYW1zMlsicGhwQ2xhc3NOYW1lIl0pOwogICAgICAgIC8vZHVtcCgkcGFyYW1zMik7CiAgICAgICAgCiAgICAgICAgLy8gYmFjayBjb21wYXQgdjEKICAgICAgICAkdXJsUGFyYW1zID0gJHBhcmFtczI7CiAgICAgICAgaWYgKCR1cmxQYXJhbXNbInJlc2l6ZVdpZHRoIl0pCiAgICAgICAgICAgICR1cmxQYXJhbXNbIndpZHRoIl0gPSAkdXJsUGFyYW1zWyJyZXNpemVXaWR0aCJdOwogICAgICAgIGlmICgkdXJsUGFyYW1zWyJyZXNpemVIZWlnaHQiXSkKICAgICAgICAgICAgJHVybFBhcmFtc1siaGVpZ2h0Il0gPSAkdXJsUGFyYW1zWyJyZXNpemVIZWlnaHQiXTsKICAgICAgICAKICAgICAgICAkdXJsUGFyYW1zWyJ3aWR0aCJdID0gc3RyX3JlcGxhY2UoInB4IiwgIiIsICR1cmxQYXJhbXNbIndpZHRoIl0pOwogICAgICAgICR1cmxQYXJhbXNbImhlaWdodCJdID0gc3RyX3JlcGxhY2UoInB4IiwgIiIsICR1cmxQYXJhbXNbImhlaWdodCJdKTsKICAgICAgICAkdXJsUGFyYW1zWyJjb2xvciJdID0gc3RyX3JlcGxhY2UoIiMiLCAiIiwgJHVybFBhcmFtc1siY29sb3IiXSk7CiAgICAgICAgJHVybFBhcmFtc1sicm90YXRlIl0gPSBzdHJfcmVwbGFjZSgiwrAiLCAiIiwgJHVybFBhcmFtc1sicm90YXRlIl0pOwogICAgICAgIGlmICghJHVybFBhcmFtc1sicXVhbGl0eSJdKQogICAgICAgICAgICAkdXJsUGFyYW1zWyJxdWFsaXR5Il0gPSA3NTsKICAgICAgICAKICAgICAgICBpZiAoISR1cmxQYXJhbXNbInJlc2l6ZSJdKQogICAgICAgICAgICAkdXJsUGFyYW1zWyJyZXNpemUiXSA9ICJzY2FsZSI7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCR2YWx1ZSk7CiAgICAgICAgLy9kdW1wKCR1cmxQYXJhbXMpOwogICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICBpZiAoJHBhcmFtc1siZnJvbUZpbGVOYW1lIl0pCiAgICAgICAgICAgICRmcm9tRmlsZU5hbWUgPSBmaW5kRmlsZSgkcGFyYW1zWyJmcm9tRmlsZU5hbWUiXSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkZnJvbUZpbGVOYW1lID0gZmluZEZpbGUoJHZhbHVlKTsKCiAgICAgICAgaWYgKCghX2ZpbGVfZXhpc3RzKCRmcm9tRmlsZU5hbWUpIHx8ICFpc19maWxlKCRmcm9tRmlsZU5hbWUpKSAmJiAhJHBhcmFtc1siZGVmYXVsdEltYWdlIl0gJiYgISRwYXJhbXNbImVtcHR5SW1hZ2UiXSkKICAgICAgICB7CiAgICAgICAgICAgIC8vc2hvd01lc3NhZ2UoIlRJbWFnZTo6b3BlbigpIC0gbm90IGEgZmlsZSAnIi4kZnJvbUZpbGVOYW1lLiInIiwgbXRFcnJvcik7CiAgICAgICAgICAgIAogICAgICAgICAgICBzdG9wUHJvZmlsZSgiVEltYWdlOjpnZXRVcmwiKTsKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgICAgICB9CgogICAgICAgIGlmIChUSW1hZ2U6OmlzQW5pbWF0ZWRHaWYoJGZyb21GaWxlTmFtZSkgJiYgISRwYXJhbXNbInJlc2l6ZUFuaW1hdGVkR2lmIl0pCiAgICAgICAgICAgIHJldHVybihnZXRVcmxGcm9tUGF0aCgkZnJvbUZpbGVOYW1lKSk7CiAgICAgICAgICAgIAogICAgICAgIGlmICghJGZyb21GaWxlTmFtZSAmJiAkcGFyYW1zWyJkZWZhdWx0SW1hZ2UiXSkKICAgICAgICAgICAgJGZyb21GaWxlTmFtZSA9IGZpbmRGaWxlKCRwYXJhbXNbImRlZmF1bHRJbWFnZSJdKTsKCiAgICAgICAgLyoKICAgICAgICBpZiAoISRmcm9tRmlsZU5hbWUgJiYgJHBhcmFtc1siZW1wdHlJbWFnZSJdICYmICEkdXJsUGFyYW1zWyJ3aWR0aCJdKQogICAgICAgICAgICAkdXJsUGFyYW1zWyJ3aWR0aCJdID0gIjEiOwogICAgICAgIGlmICghJGZyb21GaWxlTmFtZSAmJiAkcGFyYW1zWyJlbXB0eUltYWdlIl0gJiYgISR1cmxQYXJhbXNbImhlaWdodCJdKQogICAgICAgICAgICAkdXJsUGFyYW1zWyJoZWlnaHQiXSA9ICIxIjsKICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAvL2R1bXAoJGZyb21GaWxlTmFtZSk7CiAgICAgICAgCiAgICAgICAgaWYgKCEkdXJsUGFyYW1zWyJ0eXBlIl0gJiYgJHZhbHVlKQogICAgICAgICAgICAkdXJsUGFyYW1zWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKGdldEZpbGVFeHQoJGZyb21GaWxlTmFtZSkpOwogICAgICAgIGlmICghJHVybFBhcmFtc1sidHlwZSJdICYmICRwYXJhbXNbImRlZmF1bHRJbWFnZSJdKQogICAgICAgICAgICAkdXJsUGFyYW1zWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKGdldEZpbGVFeHQoJHBhcmFtc1siZGVmYXVsdEltYWdlIl0pKTsKICAgICAgICBpZiAoISR1cmxQYXJhbXNbInR5cGUiXSkKICAgICAgICAgICAgJHVybFBhcmFtc1sidHlwZSJdID0gImpwZyI7CiAgICAgICAgCiAgICAgICAgJHVybFBhcmFtc1siZmlsZW10aW1lIl0gPSBfZmlsZW10aW1lKCRmcm9tRmlsZU5hbWUpOwoKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy8kdG9GaWxlTmFtZSA9IGdldEZpbGVQYXRoKCRmcm9tRmlsZU5hbWUpLiJfYW50aWFsaWFzXyIuZ2V0RmlsZU5hbWUoJGZyb21GaWxlTmFtZSkuIl8iLm1kNShzZXJpYWxpemUoJHVybFBhcmFtcykpLiIuIi4kdXJsUGFyYW1zWyJ0eXBlIl07CiAgICAgICAgLy9kdW1wKCR1cmxQYXJhbXMpOwogICAgICAgIAogICAgICAgIGlmICgkcGFyYW1zWyJ0b0ZpbGVOYW1lIl0pCiAgICAgICAgICAgICR0b0ZpbGVOYW1lID0gJHBhcmFtc1sidG9GaWxlTmFtZSJdOyAgICAKICAgICAgICBlbHNlCiAgICAgICAgICAgICR0b0ZpbGVOYW1lID0gUFJPSkVDVFBBVEguImltZy8iLiJfYW50aWFsaWFzXyIuZ2V0RmlsZU5hbWUoJGZyb21GaWxlTmFtZSkuIl8iLm1kNShzZXJpYWxpemUoJHVybFBhcmFtcykpLiIuIi4kdXJsUGFyYW1zWyJ0eXBlIl07CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCR0b0ZpbGVOYW1lKTsKCiAgICAgICAgLy9yZXR1cm4oImR1bW15LnBuZyIpOwogICAgICAgIC8vZHVtcCgkZnJvbUZpbGVOYW1lKTsKICAgICAgICAvL2R1bXAoJHRvRmlsZU5hbWUpOwogICAgICAgIC8qCiAgICAgICAgaWYoc3RycG9zKCR2YWx1ZSwgImxvZ28iKSAhPT0gRkFMU0UpCiAgICAgICAgewogICAgICAgICAgICB2YXJfZHVtcCgkdG9GaWxlTmFtZSk7CiAgICAgICAgICAgIHZhcl9kdW1wKF9maWxlX2V4aXN0cygkdG9GaWxlTmFtZSkpOwogICAgICAgICAgICBlY2hvICR2YWx1ZTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAvL3Zhcl9kdW1wKCR0b0ZpbGVOYW1lKTsKICAgICAgICAvLyR4VGltZVN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogICAgICAgIAogICAgICAgIGdsb2JhbCAkX19pbWFnZUVmZmVjdE1vZGlmeVBhcmFtczsKICAgICAgICBpZiAoISRfX2ltYWdlRWZmZWN0TW9kaWZ5UGFyYW1zKQogICAgICAgIHsKICAgICAgICAgICAgJF9faW1hZ2VFZmZlY3RNb2RpZnlQYXJhbXMgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKGdldE9iamVjdCgiTW9kdWxlcyIpLT5nZXRPYmplY3RUeXBlcygiSW1hZ2VFZmZlY3QiKSBhcyAkb2JqZWN0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG1haW5QYXJhbXMgPSBnZXRfc3RhdGljX3ZhcmlhYmxlKCJUIi4kb2JqZWN0VHlwZSwgIm1haW5QYXJhbXMiKTsKICAgICAgICAgICAgICAgIGlmICghJG1haW5QYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgJG1haW5QYXJhbXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgJF9faW1hZ2VFZmZlY3RNb2RpZnlQYXJhbXMgPSBhcnJheV9tZXJnZSgkX19pbWFnZUVmZmVjdE1vZGlmeVBhcmFtcywgJG1haW5QYXJhbXMpOwoKICAgICAgICAgICAgICAgICRfX2ltYWdlRWZmZWN0TW9kaWZ5UGFyYW1zID0gY2FsbF9zdGF0aWNfbWV0aG9kKCJUIi4kb2JqZWN0VHlwZSwgImdldE1vZGlmeVBhcmFtcyIsICRfX2ltYWdlRWZmZWN0TW9kaWZ5UGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZG9Nb2RpZnkgPSBmYWxzZTsKICAgICAgICBmb3JlYWNoKCRfX2ltYWdlRWZmZWN0TW9kaWZ5UGFyYW1zIGFzICRfX2ltYWdlRWZmZWN0TW9kaWZ5UGFyYW0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skX19pbWFnZUVmZmVjdE1vZGlmeVBhcmFtXSkpCiAgICAgICAgICAgICAgICAkZG9Nb2RpZnkgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siZWZmZWN0cyJdKQogICAgICAgICAgICAkZG9Nb2RpZnkgPSB0cnVlOwogICAgICAgIAogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvL2R1bXAoJGRvTW9kaWZ5KTsKICAgICAgICAgICAgCiAgICAgICAgLy9kdW1wKCRfX2ltYWdlRWZmZWN0TW9kaWZ5UGFyYW1zKTsKICAgICAgICAKICAgICAgICAvL2lmICgkcGFyYW1zWyJlbXB0eUltYWdlIl0pCiAgICAgICAgLy8gICAkZG9Nb2RpZnkgPSB0cnVlOwoKICAgICAgICAvL2R1bXAoJGRvTW9kaWZ5KTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHBhcmFtczIpOwogICAgICAgIC8vZHVtcCgiPGltZyBzcmM9JyIuZ2V0VXJsRnJvbVBhdGgoJGZyb21GaWxlTmFtZSkuIicgLz4iKTsKICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCRkb01vZGlmeSk7IGV4aXQ7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXMyKTsgZXhpdDsKCiAgICAgICAgLy9kdW1wKCRwYXJhbXMyKTsKICAgICAgICAvL2R1bXAoIlgiKTsKICAgICAgICAvL2R1bXAoJGZyb21GaWxlTmFtZSk7CiAgICAgICAgCiAgICAgICAgJGRlYnVnUHJvY2Vzc01ldGhvZCA9ICIiOwogICAgICAgIGlmICghJHBhcmFtczIgJiYgX2ZpbGVfZXhpc3RzKCRmcm9tRmlsZU5hbWUpICYmIF9maWxlc2l6ZSgkZnJvbUZpbGVOYW1lKSkKICAgICAgICB7CiAgICAgICAgICAgICRkZWJ1Z1Byb2Nlc3NNZXRob2QgPSAiQSI7CiAgICAgICAgICAgIC8vZHVtcCgiQSIpOwogICAgICAgICAgICAkdXJsID0gZ2V0VXJsRnJvbVBhdGgoJGZyb21GaWxlTmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEkZG9Nb2RpZnkpCiAgICAgICAgewogICAgICAgICAgICAkZGVidWdQcm9jZXNzTWV0aG9kID0gIkIiOwogICAgICAgICAgICAvL2R1bXAoIkIiKTsKICAgICAgICAgICAgJHVybCA9IGdldFVybEZyb21QYXRoKCRmcm9tRmlsZU5hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghdG9Cb29sKCRfUkVRVUVTVFsiZGVidWdJbWFnZSJdKSAmJiAhdG9Cb29sKCRwYXJhbXNbImRlYnVnSW1hZ2UiXSAmJiBzdHJwb3MoJF9DT09LSUVbIkltYWdlc1BIUERlYnVnUGFuZWwiXSwgIlwidmlzaWJsZVwiOnRydWUiKSA9PT0gRkFMU0UpICYmIF9maWxlX2V4aXN0cygkZnJvbUZpbGVOYW1lKSAmJiBfZmlsZV9leGlzdHMoJHRvRmlsZU5hbWUpICYmIF9maWxlc2l6ZSgkdG9GaWxlTmFtZSkpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoIkMiKTsKICAgICAgICAgICAgJGRlYnVnUHJvY2Vzc01ldGhvZCA9ICJDIjsKICAgICAgICAgICAgLy9kdW1wKG1pY3JvdGltZSh0cnVlKS0keFRpbWVTdGFydCk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoImV4aXN0cyIpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICR1cmwgPSBnZXRVcmxGcm9tUGF0aCgkdG9GaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoIjEiKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkdXJsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJGZyb21GaWxlTmFtZSB8fCAkcGFyYW1zWyJlbXB0eUltYWdlIl0pCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoIkQiKTsKICAgICAgICAgICAgLy9kdW1wKCR0b0ZpbGVOYW1lKTsKICAgICAgICAgICAgLy9kdW1wKCRmcm9tRmlsZU5hbWUpOwogICAgICAgICAgICAvL2R1bXAoX2ZpbGVfZXhpc3RzKCR0b0ZpbGVOYW1lKSk7CiAgICAgICAgICAgIC8vZHVtcChmaWxlc2l6ZSgkdG9GaWxlTmFtZSkpOwogICAgICAgICAgICBpZiAoIXRvQm9vbCgkX1JFUVVFU1RbImRlYnVnSW1hZ2UiXSkgJiYgIXRvQm9vbCgkcGFyYW1zWyJkZWJ1Z0ltYWdlIl0pICYmICRwYXJhbXNbImFqYXhMb2FkIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRkZWJ1Z1Byb2Nlc3NNZXRob2QgPSAiRCI7CgogICAgICAgICAgICAgICAgJHBhcmFtc1siYWpheFZpZXdUeXBlIl0gPSAidnRPYmplY3QiOwogICAgICAgICAgICAgICAgJHBhcmFtc1sibWV0aG9kTmFtZSJdID0gImdldEFKQVhDb250ZW50IjsKICAgICAgICAgICAgICAgICRwYXJhbXNbIm9iamVjdE5hbWUiXSA9IHN1YnN0cihnZXRfY2xhc3MoJHRoaXMpLCAxKTsKICAgICAgICAgICAgICAgICRwYXJhbXNbInJldHVyblR5cGUiXSA9ICJydFJldHVyblZhbHVlIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHBhcmFtc1siZnJvbUZpbGVOYW1lIl0gPSBzdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgIi8iLCAkZnJvbUZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICRwYXJhbXNbInRvRmlsZU5hbWUiXSA9IHN0cl9yZXBsYWNlKFBST0pFQ1RQQVRILCAiLyIsICR0b0ZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXNbIl9fcGFyYW1zIl0pOwogICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtc1siX19leHRyYWN0ZWQiXSk7CiAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJhamF4TG9hZCJdKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXNbIl90ZW1wbGF0ZVJlY29yZElkIl0pOwogICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtc1siY29uZGl0aW9uIl0pOwogICAgICAgICAgICAgICAgdW5zZXQoJHBhcmFtc1siZmllbGQiXSk7CiAgICAgICAgICAgICAgICB1bnNldCgkcGFyYW1zWyJ2YWx1ZSJdKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJhbXNbImRlZmF1bHRJbWFnZSJdKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHVybCA9IGltcGxvZGVMaW5rKGFycmF5KCJmaWxlIj0+ImFqYXgucGhwIiwgInBhcmFtcyI9PiRwYXJhbXMpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9lY2hvICR1cmw7IGV4aXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoX2ZpbGVfZXhpc3RzKCRmcm9tRmlsZU5hbWUpIHx8ICRwYXJhbXNbImVtcHR5SW1hZ2UiXSkgLy8gcHJvYyAkdmFsdWU/IHBhayBuZWZ1bmd1amUgZGVmYXVsdEltYWdlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRkZWJ1Z1Byb2Nlc3NNZXRob2QgPSAiRSI7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRmcm9tRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoJGZyb21GaWxlTmFtZSkgJiYgJHBhcmFtc1siZW1wdHlJbWFnZSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgkdXJsUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y3JlYXRlKCR1cmxQYXJhbXNbIndpZHRoIl0sICR1cmxQYXJhbXNbImhlaWdodCJdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtc1siZW1wdHlJbWFnZUJhY2tncm91bmRDb2xvciJdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxheWVyc1swXS0+ZmlsbCgkcGFyYW1zWyJlbXB0eUltYWdlQmFja2dyb3VuZENvbG9yIl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9maWxlX2V4aXN0cygkZnJvbUZpbGVOYW1lKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RmlsZUV4dCgkZnJvbUZpbGVOYW1lKSA9PSAicGhwIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2U6Om9wZW4oKSAtIG5vdCBpbWFnZSAnIi4kZnJvbUZpbGVOYW1lLiInIiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoISR0aGlzLT5vcGVuKCRmcm9tRmlsZU5hbWUsICR1cmxQYXJhbXNbIndpZHRoIl0sICR1cmxQYXJhbXNbImhlaWdodCJdKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2U6Om9wZW4oKSAtIGNhbm5vdCBvcGVuIGltYWdlICciLiRmcm9tRmlsZU5hbWUuIiciLCBtdFdhcm5pbmcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oIiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJvY2Vzc1BhcmFtcygkdXJsUGFyYW1zKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgiISIpOwogICAgICAgICAgICAgICAgLy9kdW1wKCR0b0ZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoZ2V0VXJsRnJvbVBhdGgoJHRvRmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgIGlmICghX2ZpbGVfZXhpc3RzKFBST0pFQ1RQQVRILiJpbWciKSkKICAgICAgICAgICAgICAgICAgICBfbWtkaXIoUFJPSkVDVFBBVEguImltZyIsIENITU9EX1dSSVRFKTsKICAgICAgICAgICAgICAgIF9maWxlX3B1dF9jb250ZW50cygkdG9GaWxlTmFtZSwgIiIpOwogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2F2ZSgkdG9GaWxlTmFtZSwgJHVybFBhcmFtcykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX3VubGluaygkdG9GaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRJbWFnZTogQ2Fubm90IHNhdmUgZmlsZSAnIi4kdG9GaWxlTmFtZS4iJyIsIG10V2FybmluZyk7CiAgICAgICAgICAgICAgICAgICAgJHRvRmlsZU5hbWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gZnJlZSBtZW1vcnkKICAgICAgICAgICAgICAgICR0aGlzLT5jbGVhcigpOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHRvRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgJHVybCA9IGdldFVybEZyb21QYXRoKCR0b0ZpbGVOYW1lLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCR1cmwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgiVEltYWdlOjpnZXRVcmwoKSAtIGZpbGUgJyIuJF92YWx1ZS4iJyBub3QgZm91bmQiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgc3RvcFByb2ZpbGUoIlRJbWFnZTo6Z2V0VXJsIiwgYXJyYXkoInZhbHVlIj0+JHZhbHVlLCJwYXJhbXMiPT4kcGFyYW1zKSk7CgogICAgICAgIC8vZHVtcCgkZGVidWdQcm9jZXNzTWV0aG9kKTsKICAgICAgICAvL2R1bXAocm91bmQoZ2V0TWljcm90aW1lKCktJHRTLCAzKSk7CiAgICAgICAgLy9kdW1wKCR1cmwpOwogICAgICAgIHJldHVybigkdXJsKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0QUpBWENvbnRlbnQoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIHVuc2V0KCRwYXJhbXNbImFqYXhMb2FkIl0pOwogICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7IGV4aXQ7CiAgICAgICAgaWYgKCRwYXJhbXNbImZyb21GaWxlTmFtZSJdICYmICRwYXJhbXNbInRvRmlsZU5hbWUiXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChnZXRGaWxlRXh0KCRwYXJhbXNbImZyb21GaWxlTmFtZSJdKSA9PSAicGhwIiB8fCBnZXRGaWxlRXh0KCRwYXJhbXNbInRvRmlsZU5hbWUiXSkgPT0gInBocCIpCiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRwYXJhbXNbImZyb21GaWxlTmFtZSJdID0gUFJPSkVDVFBBVEguJHBhcmFtc1siZnJvbUZpbGVOYW1lIl07CiAgICAgICAgICAgICRwYXJhbXNbInRvRmlsZU5hbWUiXSA9IFBST0pFQ1RQQVRILiRwYXJhbXNbInRvRmlsZU5hbWUiXTsKICAgICAgICAgICAgCiAgICAgICAgICAgICR1cmwgPSAkdGhpcy0+Z2V0VXJsKCRwYXJhbXMpOwogICAgICAgIC8vZWNobyAiQSI7IGV4aXQ7CiAgICAgICAgCiAgICAgICAgICAgIHNlbmRGaWxlKCRwYXJhbXNbInRvRmlsZU5hbWUiXSk7CiAgICAgICAgfQoKICAgICAgICBleGl0OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBfX2NhbGwoJG5hbWUsICRhcmd1bWVudHMpCiAgICB7CiAgICAgICAgJG9iamVjdFR5cGVzID0gZ2V0T2JqZWN0VHlwZXMoIkltYWdlRWZmZWN0Iik7CiAgICAgICAgJHhSZXQgPSBudWxsOyAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkb2JqZWN0VHlwZXMgYXMgJG9iamVjdFR5cGUpCiAgICAgICAgewogICAgICAgICAgICAkT2JqZWN0ID0gZ2V0T2JqZWN0KCRvYmplY3RUeXBlKTsKICAgICAgICAgICAgJHJldCA9IGNhbGxfdXNlcl9mdW5jKGFycmF5KCRPYmplY3QsICRuYW1lKSwgJHRoaXMtPmxheWVyc1swXSwgJGFyZ3VtZW50c1swXSwgJGFyZ3VtZW50c1sxXSwgJGFyZ3VtZW50c1syXSwgJGFyZ3VtZW50c1szXSwgJGFyZ3VtZW50c1s0XSwgJGFyZ3VtZW50c1s1XSwgJGFyZ3VtZW50c1s2XSwgJGFyZ3VtZW50c1s3XSwgJGFyZ3VtZW50c1s4XSwgJGFyZ3VtZW50c1s5XSk7CiAgICAgICAgICAgIGlmICgkcmV0ICE9PSBOVUxMKQogICAgICAgICAgICAgICAgJHhSZXQgPSAkcmV0OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBleHRlbmRpbmcgb2JqZWN0CiAgICAgICAgaWYgKCR4UmV0ID09PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9IHBhcmVudDo6X19jYWxsKCRuYW1lLCAkYXJndW1lbnRzKTsKICAgICAgICB9CgogICAgICAgIC8vIGxheWVyIG1ldGhvZAogICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLT5sYXllcnNbMF0sICRuYW1lKSkKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoYXJyYXkoJHRoaXMtPmxheWVyc1swXSwgJG5hbWUpLCAkYXJndW1lbnRzWzBdLCAkYXJndW1lbnRzWzFdLCAkYXJndW1lbnRzWzJdLCAkYXJndW1lbnRzWzNdLCAkYXJndW1lbnRzWzRdLCAkYXJndW1lbnRzWzVdLCAkYXJndW1lbnRzWzZdLCAkYXJndW1lbnRzWzddLCAkYXJndW1lbnRzWzhdLCAkYXJndW1lbnRzWzldKTsKCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9fY2FsbFN0YXRpYygkbmFtZSwgJGFyZ3VtZW50cykKICAgIHsKICAgICAgICAkb2JqZWN0VHlwZXMgPSBnZXRPYmplY3RUeXBlcygiSW1hZ2VFZmZlY3QiKTsKICAgICAgICAkeFJldCA9IG51bGw7ICAgICAgICAKICAgICAgICBmb3JlYWNoKCRvYmplY3RUeXBlcyBhcyAkb2JqZWN0VHlwZSkKICAgICAgICB7CiAgICAgICAgICAgICRPYmplY3QgPSBnZXRPYmplY3QoJG9iamVjdFR5cGUpOwogICAgICAgICAgICAkcmV0ID0gY2FsbF9zdGF0aWNfbWV0aG9kKCJUIi4kb2JqZWN0VHlwZSwgJG5hbWUsICRhcmd1bWVudHNbMF0sICRhcmd1bWVudHNbMV0sICRhcmd1bWVudHNbMl0sICRhcmd1bWVudHNbM10sICRhcmd1bWVudHNbNF0sICRhcmd1bWVudHNbNV0sICRhcmd1bWVudHNbNl0sICRhcmd1bWVudHNbN10sICRhcmd1bWVudHNbOF0sICRhcmd1bWVudHNbOV0sICRhcmd1bWVudHNbMTBdKTsKICAgICAgICAgICAgaWYgKCRyZXQgIT09IE5VTEwpCiAgICAgICAgICAgICAgICAkeFJldCA9ICRyZXQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIAogICAgZnVuY3Rpb24gbG9hZCgkZmlsZSwgJHdpZHRoPTAsICRoZWlnaHQ9MCkKICAgIHsKICAgICAgICByZXR1cm4oJHRoaXMtPm9wZW4oJGZpbGUsICR3aWR0aCwgJGhlaWdodCkpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBvcGVuKCRmaWxlLCAkd2lkdGg9MCwgJGhlaWdodD0wKQogICAgewogICAgICAgICRmaWxlID0gZmluZEZpbGUoJGZpbGUpOwogICAgICAgIAogICAgICAgICR0aGlzLT5jbGVhcigpOwogICAgICAgIAogICAgICAgIHJldHVybigkdGhpcy0+YWRkTGF5ZXIoJGZpbGUsICR3aWR0aCwgJGhlaWdodCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lcmdlTGF5ZXJzKCkKICAgIHsKICAgICAgICBmb3IgKCRpID0gMSA7ICRpIDwgY291bnQoJHRoaXMtPmxheWVycykgOyAkaSsrKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPmxheWVyc1swXS0+YWRkTGF5ZXIoJHRoaXMtPmxheWVyc1skaV0pOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gc2F2ZSgkZmlsZSwgJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIC8vIFRPRE8gLSBtZXJnZSBhbGwgbGF5ZXJzCiAgICAgICAgJGhhc0Vycm9ycyA9IGZhbHNlOwogICAgICAgIGZvcmVhY2goJHRoaXMtPmxheWVycyBhcyAkTGF5ZXIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJExheWVyLT5lcnJvcnMpCiAgICAgICAgICAgICAgICAkaGFzRXJyb3JzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFfZmlsZV9leGlzdHMoZ2V0RmlsZVBhdGgoJGZpbGUpKSkKICAgICAgICAgICAgX21rZGlyKGdldEZpbGVQYXRoKCRmaWxlKSk7CgogICAgICAgIGlmICghJGhhc0Vycm9ycykKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5tZXJnZUxheWVycygpOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKCR0aGlzLT5sYXllcnNbMF0tPnNhdmUoJGZpbGUsICRwYXJhbXMpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9lY2hvICJYIjsgZXhpdDsKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RGF0YVVybCgkdHlwZT0icG5nIikKICAgIHsKICAgICAgICAkdGhpcy0+bWVyZ2VMYXllcnMoKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHRoaXMtPmxheWVyc1swXS0+Z2V0RGF0YVVybCgkdHlwZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZSgkd2lkdGgsICRoZWlnaHQsICR0eXBlPSJwbmciKQogICAgewogICAgICAgICR0aGlzLT5jbGVhcigpOwogICAgICAgICR0aGlzLT50eXBlID0gInBuZyI7CiAgICAgICAgJHRoaXMtPmFkZEVtcHR5TGF5ZXIoJHdpZHRoLCAkaGVpZ2h0LCAkdHlwZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNsb3NlKCkKICAgIHsKICAgICAgICAkdGhpcy0+Y2xlYXIoKTsKICAgIH0KICAgIAoJZnVuY3Rpb24gY2xlYXIoKQoJewogICAgICAgICR0aGlzLT5sb3dNZW1vcnkgPSBmYWxzZTsKCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+bGF5ZXJzIGFzICRMYXllcikKICAgICAgICB7CiAgICAgICAgICAgICRMYXllci0+Y2xvc2UoKTsKICAgICAgICAgICAgLy9kZWxldGVPYmplY3QoJExheWVyKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmxheWVycyA9IGFycmF5KCk7Cgl9CgkKICAgIGZ1bmN0aW9uIGFkZExheWVyKCRmaWxlLCAkd2lkdGg9MCwgJGhlaWdodD0wKQogICAgewogICAgICAgICRMYXllciA9IGNyZWF0ZU9iamVjdCgiSW1hZ2VMYXllciIpOwogICAgICAgIGlmICgkZmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkTGF5ZXItPmxvYWQoJGZpbGUsICR3aWR0aCwgJGhlaWdodCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5sYXllcnNbXSA9ICRMYXllcjsKICAgICAgICAgICAgICAgIHJldHVybigkTGF5ZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEkd2lkdGggfHwgISRoZWlnaHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR3aWR0aCA9ICR0aGlzLT5sYXllcnNbMF0tPndpZHRoOwogICAgICAgICAgICAgICAgJGhlaWdodCA9ICR0aGlzLT5sYXllcnNbMF0tPmhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5ZXItPmNyZWF0ZSgkd2lkdGgsICRoZWlnaHQpOwogICAgICAgICAgICAkdGhpcy0+bGF5ZXJzW10gPSAkTGF5ZXI7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4oJExheWVyKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWRkRW1wdHlMYXllcigkd2lkdGgsICRoZWlnaHQsICR0eXBlPSJwbmciKQogICAgewogICAgICAgICRMYXllciA9IGNyZWF0ZU9iamVjdCgiSW1hZ2VMYXllciIpOwogICAgICAgICRMYXllci0+Y3JlYXRlKCR3aWR0aCwgJGhlaWdodCk7CiAgICAgICAgJExheWVyLT50eXBlID0gJHR5cGU7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPmxheWVyc1tdID0gJExheWVyOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRXaWR0aCgpCiAgICB7CiAgICAgICAgcmV0dXJuKCR0aGlzLT5sYXllcnNbMF0tPndpZHRoKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SGVpZ2h0KCkKICAgIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmxheWVyc1swXS0+aGVpZ2h0KTsKICAgIH0KCglmdW5jdGlvbiBwcm9jZXNzUGFyYW1zKCRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKCEkcGFyYW1zWyJlZmZlY3RzIl0pCiAgICAgICAgICAgICRwYXJhbXNbImVmZmVjdHMiXSA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgJG9iamVjdFR5cGVzID0gZ2V0T2JqZWN0VHlwZXMoIkltYWdlRWZmZWN0Iik7CiAgICAgICAgLyoKICAgICAgICAkX29iamVjdFR5cGVzID0gZ2V0T2JqZWN0VHlwZXMoKTsKICAgICAgICAkb2JqZWN0VHlwZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2goJF9vYmplY3RUeXBlcyBhcyAkb2JqZWN0VHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgiVEltYWdlRWZmZWN0IiwgY2xhc3NfcGFyZW50cygiVCIuJG9iamVjdFR5cGUpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG9iamVjdFR5cGVzW10gPSAkb2JqZWN0VHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vaWYgKCRwYXJhbXNbIndhdGVybWFya0ltYWdlIl0pCiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJG9iamVjdFR5cGVzKTsKICAgICAgICBmb3JlYWNoKCRvYmplY3RUeXBlcyBhcyAkb2JqZWN0VHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKGFycmF5KCJUIi4kb2JqZWN0VHlwZSwgInByb2Nlc3NQYXJhbXMiKSwgJHRoaXMtPmxheWVyc1swXSwgJHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvcmVhY2goJHBhcmFtc1siZWZmZWN0cyJdIGFzICRlZmZlY3QpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJGVmZmVjdFsib2JqZWN0Il1bIm9iamVjdCJdLCAkb2JqZWN0VHlwZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYyhhcnJheSgiVCIuJGVmZmVjdFsib2JqZWN0Il1bIm9iamVjdCJdLCAicHJvY2Vzc1BhcmFtcyIpLCAkdGhpcy0+bGF5ZXJzWzBdLCAkZWZmZWN0WyJvYmplY3QiXVsicGFyYW1zIl0pOwogICAgICAgICAgICAgICAgLy9kdW1wKCRlZmZlY3RbIm9iamVjdCJdWyJwYXJhbXMiXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRJbWFnZSAtIG9iamVjdCAnIi4kZWZmZWN0WyJvYmplY3QiXVsib2JqZWN0Il0uIicgbm90IGZvdW5kIiwgbXRXYXJuaW5nKTsKICAgICAgICB9CiAgICAgICAgCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG91dHB1dCgkdHlwZT0icG5nIiwgJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIGlmICgkdGhpcy0+bGF5ZXJzWzBdKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPm1lcmdlTGF5ZXJzKCk7CiAgICAgICAgICAgIHJldHVybigkdGhpcy0+bGF5ZXJzWzBdLT5vdXRwdXQoJHR5cGUsICRwYXJhbXMpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBzaG93TWVzc2FnZSgiVEltYWdlOjpvdXRwdXQoKSAtIG5vIGxheWVycyBsb2FkZWQiLCBtdFdhcm5pbmcpOwogICAgfQogICAgICAgIAogICAgZnVuY3Rpb24gZ2V0SW1hZ2VEYXRhKCR0eXBlPSJwbmciLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5sYXllcnNbMF0pCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+bWVyZ2VMYXllcnMoKTsKICAgICAgICAgICAgcmV0dXJuKCR0aGlzLT5sYXllcnNbMF0tPmdldEltYWdlRGF0YSgkdHlwZSwgJHBhcmFtcykpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2U6OmdldEltYWdlRGF0YSgpIC0gbm8gbGF5ZXJzIGxvYWRlZCIsIG10V2FybmluZyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0R0RJbmZvKCkKICAgIHsKICAgICAgICAkZ2RfaW5mbyA9IChmdW5jdGlvbl9leGlzdHMoJ2dkX2luZm8nKSA/IGdkX2luZm8oKSA6ICR0aGlzLT5fZ2RfaW5mbygpKTsKICAgICAgICAKICAgICAgICBpZiAoJGdkX2luZm9bIkdEIFZlcnNpb24iXSA9PSAiIikKICAgICAgICB7CiAgICAgICAgICAgIGNtc190cmlnZ2VyX2Vycm9yKCdUaGVyZSBpcyBubyBHRCBMaWJyYXJ5IGluc3RhbGxlZC4gSW1hZ2Ugd2lsbCBub3QgYmUgbW9kaWZpZWQuJywgRV9VU0VSX0VSUk9SKTsKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcHJlZ19tYXRjaCgiL1xBW1xEXSooW1xkK1wuXSopW1xEXSpcWi8iLCAkZ2RfaW5mb1snR0QgVmVyc2lvbiddLCAkbWF0Y2hlcyk7CiAgICAgICAgbGlzdCgkdGhpcy0+X2dkX3ZlcnNpb25fc3RyaW5nLCAkdGhpcy0+X2dkX3ZlcnNpb25fbnVtYmVyKSA9ICRtYXRjaGVzOwogICAgICAgICR0aGlzLT5fZ2RfdmVyc2lvbiA9IHN1YnN0cigkdGhpcy0+X2dkX3ZlcnNpb25fbnVtYmVyLCAwLCBzdHJwb3MoJHRoaXMtPl9nZF92ZXJzaW9uX251bWJlciwgJy4nKSk7CiAgICAgICAgaWYgKCR0aGlzLT5fZ2RfdmVyc2lvbiA+PSAyKSAKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5pbWFnZUNyZWF0ZUZ1bmN0aW9uID0gJ2ltYWdlY3JlYXRldHJ1ZWNvbG9yJzsKICAgICAgICAgICAgJHRoaXMtPnJlc2l6ZUZ1bmN0aW9uID0gJ2ltYWdlY29weXJlc2FtcGxlZCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmltYWdlQ3JlYXRlRnVuY3Rpb24gPSAnaW1hZ2VjcmVhdGUnOwogICAgICAgICAgICAkdGhpcy0+cmVzaXplRnVuY3Rpb24gPSAnaW1hZ2Vjb3B5cmVzaXplZCc7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+X2dkX3R0ZiA9ICRnZF9pbmZvWydGcmVlVHlwZSBTdXBwb3J0J107CiAgICAgICAgJHRoaXMtPl9nZF9wcyA9ICRnZF9pbmZvWydUMUxpYiBTdXBwb3J0J107CiAgICAgICAgLy92YXJfZHVtcCgkZ2RfaW5mbyk7CiAgICAgICAgaWYgKCRnZF9pbmZvWydHSUYgUmVhZCBTdXBwb3J0J10pIHsKICAgICAgICAgICAgJHRoaXMtPmltYWdlVHlwZXNbMV1bJ3N1cHBvcnRlZCddID0gMTsKICAgICAgICAgICAgaWYgKCRnZF9pbmZvWydHSUYgQ3JlYXRlIFN1cHBvcnQnXSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmltYWdlVHlwZXNbMV1bJ3N1cHBvcnRlZCddID0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGdkX2luZm9bJ0pQRyBTdXBwb3J0J10gfHwgJGdkX2luZm9bJ0pQRUcgU3VwcG9ydCddIC8qIFBIUCA1LjMueCAqLykgewogICAgICAgICAgICAkdGhpcy0+aW1hZ2VUeXBlc1syXVsnc3VwcG9ydGVkJ10gPSAyOwogICAgICAgIH0KICAgICAgICBpZiAoJGdkX2luZm9bJ1BORyBTdXBwb3J0J10pIHsKICAgICAgICAgICAgJHRoaXMtPmltYWdlVHlwZXNbM11bJ3N1cHBvcnRlZCddID0gMjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIGUtdmlzaW9uIC0gbW92ZWQgZnJvbSBjb25zdHJ1Y3RvcgoJLyoKICAgIGZ1bmN0aW9uIG9wZW4oKSAKCXsKCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkkYXJnYyA9IGZ1bmNfbnVtX2FyZ3MoKTsKCiAgICAgICAgLy9nZXQgR0QgaW5mb3JtYXRpb24uIHNlZSB3aGF0IHR5cGVzIHdlIGNhbiBoYW5kbGUKICAgICAgICAkdGhpcy0+Z2V0R0RJbmZvKCk7CgoJCS8vbG9hZCBvciBjcmVhdGUgbWFpbiBpbWFnZQoJCWlmICgkYXJnYyA9PSAwKSB7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCWlmICgkdGhpcy0+X2FkZEltYWdlKCRhcmdjLCAkYXJncykpIAoJCQl7CgkJCQlmb3JlYWNoICgkdGhpcy0+bGF5ZXJzWydvcGVyYXRvciddIGFzICRrZXkgPT4gJHZhbHVlKSAKCQkJCXsKCQkJCSAgICAvL3Zhcl9kdW1wKCRrZXkpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlKTsKICAgICAgICAgICAgICAgIAkkdGhpcy0+bGF5ZXJzWydtYWluJ11bJGtleV0gPSAkdmFsdWU7CgkJCQl9CgkJCQkkdGhpcy0+bGF5ZXJzWydtYWluJ11bJ291dHB1dF90eXBlJ10gPSAkdGhpcy0+bGF5ZXJzWydtYWluJ11bJ3R5cGUnXTsKCgkJCQkvLyBlLXZpc2lvbgoJCQkJJHRoaXMtPmxheWVyc1snbWFpbiddWydmaWxlbmFtZSddID0gJGFyZ3NbMF07CgoJCQkJdW5zZXQoJHRoaXMtPmxheWVyc1snb3BlcmF0b3InXSk7CgkJCX0gCgkJCWVsc2UgCgkJCXsKCQkJCS8vZWNobyAkdGhpcy0+X2Vycm9yX3ByZWZpeCAuICdObyBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBmb3VuZC4nOwoJCQkJLy9jbXNfdHJpZ2dlcl9lcnJvcigkdGhpcy0+X2Vycm9yX3ByZWZpeCAuICdObyBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBmb3VuZC4nLCBFX1VTRVJfRVJST1IpOwoKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KICAgICovCgoJZnVuY3Rpb24gZ2V0U2VydmVyRmVhdHVyZXMoKSAKICAgIHsKCQkkZmVhdHVyZXMgPSBhcnJheSgpOwoJCSRmZWF0dXJlc1snZ2RfdmVyc2lvbiddID0gJHRoaXMtPl9nZF92ZXJzaW9uX251bWJlcjsKCQkkZmVhdHVyZXNbJ2dpZiddID0gJHRoaXMtPmltYWdlVHlwZXNbMV1bJ3N1cHBvcnRlZCddOwoJCSRmZWF0dXJlc1snanBnJ10gPSAkdGhpcy0+aW1hZ2VUeXBlc1syXVsnc3VwcG9ydGVkJ107CiAgICAgICAgJGZlYXR1cmVzWydqcGVnJ10gPSAkdGhpcy0+aW1hZ2VUeXBlc1syXVsnc3VwcG9ydGVkJ107CgkJJGZlYXR1cmVzWydwbmcnXSA9ICR0aGlzLT5pbWFnZVR5cGVzWzNdWydzdXBwb3J0ZWQnXTsKCQkkZmVhdHVyZXNbJ3R0ZiddID0gJHRoaXMtPl9nZF90dGY7CgoJCXJldHVybiAkZmVhdHVyZXM7Cgl9CgoJZnVuY3Rpb24gbmV3SW1hZ2UoKSAKICAgIHsKCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkkYXJnYyA9IGZ1bmNfbnVtX2FyZ3MoKTsKCiAgICAgICAgLy9nZXQgR0QgaW5mb3JtYXRpb24uIHNlZSB3aGF0IHR5cGVzIHdlIGNhbiBoYW5kbGUKICAgICAgICAkdGhpcy0+Z2V0R0RJbmZvKCk7CgoJCWlmICgkdGhpcy0+X2FkZEltYWdlKCRhcmdjLCAkYXJncykpIAogICAgICAgIHsKCQkJZm9yZWFjaCAoJHRoaXMtPmxheWVyc1snb3BlcmF0b3InXSBhcyAka2V5ID0+ICR2YWx1ZSkgCiAgICAgICAgICAgIHsKCQkJCSR0aGlzLT5sYXllcnNbJ21haW4nXVska2V5XSA9ICR2YWx1ZTsKCQkJfQoJCQkkdGhpcy0+bGF5ZXJzWydtYWluJ11bJ291dHB1dF90eXBlJ10gPSAkdGhpcy0+bGF5ZXJzWydtYWluJ11bJ3R5cGUnXTsKCQkJdW5zZXQoJHRoaXMtPmxheWVyc1snb3BlcmF0b3InXSk7CgkJCXJldHVybiB0cnVlOwoJCX0gCiAgICAgICAgZWxzZSAKICAgICAgICB7CgkJCWNtc190cmlnZ2VyX2Vycm9yKCR0aGlzLT5fZXJyb3JfcHJlZml4IC4gJ05vIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIGZvdW5kLicsIEVfVVNFUl9FUlJPUik7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBfZ2RfaW5mbygpIAogICAgewoJCSRhcnJheSA9IGFycmF5KAogICAgICAgIAkiR0QgVmVyc2lvbiIgPT4gIiIsCgkJCSJGcmVlVHlwZSBTdXBwb3J0IiA9PiBmYWxzZSwKCQkJIkZyZWVUeXBlIExpbmthZ2UiID0+ICIiLAoJCQkiVDFMaWIgU3VwcG9ydCIgPT4gZmFsc2UsCgkJCSJHSUYgUmVhZCBTdXBwb3J0IiA9PiBmYWxzZSwKCQkJIkdJRiBDcmVhdGUgU3VwcG9ydCIgPT4gZmFsc2UsCgkJCSJKUEcgU3VwcG9ydCIgPT4gZmFsc2UsCgkJCSJQTkcgU3VwcG9ydCIgPT4gZmFsc2UsCgkJCSJXQk1QIFN1cHBvcnQiID0+IGZhbHNlLAoJCQkiWEJNIFN1cHBvcnQiID0+IGZhbHNlCgkJKTsKCgkJJGdpZl9zdXBwb3J0ID0gMDsKCQlvYl9zdGFydCgpOwoJCWV2YWwoInBocGluZm8oKTsiKTsKCQkkaW5mbyA9IG9iX2dldF9jb250ZW50cygpOwoJCW9iX2VuZF9jbGVhbigpOwoKCQlmb3JlYWNoKGV4cGxvZGUoIlxuIiwgJGluZm8pIGFzICRsaW5lKSB7CgkJCWlmKHN0cnBvcygkbGluZSwgIkdEIFZlcnNpb24iKSAhPT0gZmFsc2UpCgkJCQkkYXJyYXlbIkdEIFZlcnNpb24iXSA9IHRyaW0oc3RyX3JlcGxhY2UoIkdEIFZlcnNpb24iLCAiIiwgc3RyaXBfdGFncygkbGluZSkpKTsKCQkJaWYoc3RycG9zKCRsaW5lLCAiRnJlZVR5cGUgU3VwcG9ydCIpICE9PSBmYWxzZSkKCQkJCSRhcnJheVsiRnJlZVR5cGUgU3VwcG9ydCJdID0gdHJpbShzdHJfcmVwbGFjZSgiRnJlZVR5cGUgU3VwcG9ydCIsICIiLCBzdHJpcF90YWdzKCRsaW5lKSkpOwoJCQlpZihzdHJwb3MoJGxpbmUsICJGcmVlVHlwZSBMaW5rYWdlIikgIT09IGZhbHNlKQoJCQkJJGFycmF5WyJGcmVlVHlwZSBMaW5rYWdlIl0gPSB0cmltKHN0cl9yZXBsYWNlKCJGcmVlVHlwZSBMaW5rYWdlIiwgIiIsIHN0cmlwX3RhZ3MoJGxpbmUpKSk7CgkJCWlmKHN0cnBvcygkbGluZSwgIlQxTGliIFN1cHBvcnQiKSAhPT0gZmFsc2UpCgkJCQkkYXJyYXlbIlQxTGliIFN1cHBvcnQiXSA9IHRyaW0oc3RyX3JlcGxhY2UoIlQxTGliIFN1cHBvcnQiLCAiIiwgc3RyaXBfdGFncygkbGluZSkpKTsKCQkJaWYoc3RycG9zKCRsaW5lLCAiR0lGIFJlYWQgU3VwcG9ydCIpICE9PSBmYWxzZSkKCQkJCSRhcnJheVsiR0lGIFJlYWQgU3VwcG9ydCJdID0gdHJpbShzdHJfcmVwbGFjZSgiR0lGIFJlYWQgU3VwcG9ydCIsICIiLCBzdHJpcF90YWdzKCRsaW5lKSkpOwoJCQlpZihzdHJwb3MoJGxpbmUsICJHSUYgQ3JlYXRlIFN1cHBvcnQiKSAhPT0gZmFsc2UpCgkJCQkkYXJyYXlbIkdJRiBDcmVhdGUgU3VwcG9ydCJdID0gdHJpbShzdHJfcmVwbGFjZSgiR0lGIENyZWF0ZSBTdXBwb3J0IiwgIiIsIHN0cmlwX3RhZ3MoJGxpbmUpKSk7CgkJCWlmKHN0cnBvcygkbGluZSwgIkdJRiBTdXBwb3J0IikgIT09IGZhbHNlKQoJCQkJJGdpZl9zdXBwb3J0ID0gdHJpbShzdHJfcmVwbGFjZSgiR0lGIFN1cHBvcnQiLCAiIiwgc3RyaXBfdGFncygkbGluZSkpKTsKCQkJaWYoc3RycG9zKCRsaW5lLCAiSlBHIFN1cHBvcnQiKSAhPT0gZmFsc2UpCgkJCQkkYXJyYXlbIkpQRyBTdXBwb3J0Il0gPSB0cmltKHN0cl9yZXBsYWNlKCJKUEcgU3VwcG9ydCIsICIiLCBzdHJpcF90YWdzKCRsaW5lKSkpOwoJCQlpZihzdHJwb3MoJGxpbmUsICJQTkcgU3VwcG9ydCIpICE9PSBmYWxzZSkKCQkJCSRhcnJheVsiUE5HIFN1cHBvcnQiXSA9IHRyaW0oc3RyX3JlcGxhY2UoIlBORyBTdXBwb3J0IiwgIiIsIHN0cmlwX3RhZ3MoJGxpbmUpKSk7CgkJCWlmKHN0cnBvcygkbGluZSwgIldCTVAgU3VwcG9ydCIpICE9PSBmYWxzZSkKCQkJCSRhcnJheVsiV0JNUCBTdXBwb3J0Il0gPSB0cmltKHN0cl9yZXBsYWNlKCJXQk1QIFN1cHBvcnQiLCAiIiwgc3RyaXBfdGFncygkbGluZSkpKTsKCQkJaWYoc3RycG9zKCRsaW5lLCAiWEJNIFN1cHBvcnQiKSAhPT0gZmFsc2UpCgkJCQkkYXJyYXlbIlhCTSBTdXBwb3J0Il0gPSB0cmltKHN0cl9yZXBsYWNlKCJYQk0gU3VwcG9ydCIsICIiLCBzdHJpcF90YWdzKCRsaW5lKSkpOwoJCX0KCgkJaWYoJGdpZl9zdXBwb3J0ID09PSAiZW5hYmxlZCIpIHsKCQkJJGFycmF5WyJHSUYgUmVhZCBTdXBwb3J0Il0gPSB0cnVlOwoJCQkkYXJyYXlbIkdJRiBDcmVhdGUgU3VwcG9ydCJdID0gdHJ1ZTsKCQl9CgoJCWlmKCRhcnJheVsiRnJlZVR5cGUgU3VwcG9ydCJdID09PSAiZW5hYmxlZCIpIHsKCQkJJGFycmF5WyJGcmVlVHlwZSBTdXBwb3J0Il0gPSB0cnVlOwoJCX0KCiAgICAgICAgaWYoJGFycmF5WyJUMUxpYiBTdXBwb3J0Il0gPT09ICJlbmFibGVkIikgewogICAgICAgICAgICAkYXJyYXlbIlQxTGliIFN1cHBvcnQiXSA9IHRydWU7CiAgICAgICAgfQoKCQlpZigkYXJyYXlbIkdJRiBSZWFkIFN1cHBvcnQiXSA9PT0gImVuYWJsZWQiKSB7CgkJCSRhcnJheVsiR0lGIFJlYWQgU3VwcG9ydCJdID0gdHJ1ZTsKCQl9CgoJCWlmKCRhcnJheVsiR0lGIENyZWF0ZSBTdXBwb3J0Il0gPT09ICJlbmFibGVkIikgewoJCQkkYXJyYXlbIkdJRiBDcmVhdGUgU3VwcG9ydCJdID0gdHJ1ZTsKCQl9CgoJCWlmKCRhcnJheVsiSlBHIFN1cHBvcnQiXSA9PT0gImVuYWJsZWQiKSB7CgkJCSRhcnJheVsiSlBHIFN1cHBvcnQiXSA9IHRydWU7CgkJfQoKCQlpZigkYXJyYXlbIlBORyBTdXBwb3J0Il0gPT09ICJlbmFibGVkIikgewoJCQkkYXJyYXlbIlBORyBTdXBwb3J0Il0gPSB0cnVlOwoJCX0KCgkJaWYoJGFycmF5WyJXQk1QIFN1cHBvcnQiXSA9PT0gImVuYWJsZWQiKSB7CgkJCSRhcnJheVsiV0JNUCBTdXBwb3J0Il0gPSB0cnVlOwoJCX0KCgkJaWYoJGFycmF5WyJYQk0gU3VwcG9ydCJdID09PSAiZW5hYmxlZCIpIHsKCQkJJGFycmF5WyJYQk0gU3VwcG9ydCJdID0gdHJ1ZTsKCQl9CgoJCXJldHVybiAkYXJyYXk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbmZvKCRmaWxlTmFtZSkKICAgIHsKICAgICAgICAkZmlsZU5hbWUgPSBmaW5kRmlsZSgkZmlsZU5hbWUpOwogICAgICAgIGlmICgkZmlsZU5hbWUpCiAgICAgICAgewogICAgICAgICAgICAkc2l6ZSA9IGdldGltYWdlc2l6ZSgkZmlsZU5hbWUpOwogICAgICAgIAogICAgICAgICAgICAkaW5mbyA9IGFycmF5KAogICAgICAgICAgICAgICAgIndpZHRoIiA9PiAkc2l6ZVswXSwKICAgICAgICAgICAgICAgICJoZWlnaHQiID0+ICRzaXplWzFdLAogICAgICAgICAgICAgICAgInNpemUiID0+IGZpbGVzaXplKCRmaWxlTmFtZSksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybigkaW5mbyk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBbmltYXRlZEdpZigkZmlsZU5hbWUpCiAgICB7CiAgICAgICAgJGZpbGVOYW1lID0gZmluZEZpbGUoJGZpbGVOYW1lKTsKICAgICAgICBpZiAoJGZpbGVOYW1lICYmIHN0cnRvbG93ZXIoZ2V0RmlsZUV4dCgkZmlsZU5hbWUpKSA9PSAiZ2lmIikKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlY29udGVudHMgPSBfZmlsZV9nZXRfY29udGVudHMoJGZpbGVOYW1lKTsKCiAgICAgICAgICAgICRzdHJfbG9jPTA7CiAgICAgICAgICAgICRjb3VudD0wOwogICAgICAgICAgICB3aGlsZSAoJGNvdW50IDwgMikgLy8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gY29udGludWluZyBhZnRlciB3ZSBmaW5kIGEgMm5kIGZyYW1lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR3aGVyZTE9c3RycG9zKCRmaWxlY29udGVudHMsIlx4MDBceDIxXHhGOVx4MDQiLCRzdHJfbG9jKTsKICAgICAgICAgICAgICAgIGlmICgkd2hlcmUxID09PSBGQUxTRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkc3RyX2xvYz0kd2hlcmUxKzE7CiAgICAgICAgICAgICAgICAgICAgJHdoZXJlMj1zdHJwb3MoJGZpbGVjb250ZW50cywiXHgwMFx4MkMiLCRzdHJfbG9jKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHdoZXJlMiA9PT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR3aGVyZTErOCA9PSAkd2hlcmUyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkc3RyX2xvYz0kd2hlcmUyKzE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNvdW50ID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOwoKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBjaGVja01lbW9yeVVzYWdlKCR3aWR0aCwgJGhlaWdodCwgJHR5cGU9ImpwZyIpCiAgICB7CiAgICAgICAgJG1lbW9yeU5lZWRlZCA9IDEuMipnZXRJbWFnZU1lbW9yeVVzYWdlKCR3aWR0aCwgJGhlaWdodCwgKCR0eXBlID09ICJwbmciID8gNCA6IDMpKTsKICAgICAgICAkbWVtb3J5QXZhaWxhYmxlID0gZ2V0TWVtb3J5TGltaXQoKS1nZXRNZW1vcnlVc2FnZSh0cnVlKTsKICAgICAgICAKICAgICAgICBpZiAoJG1lbW9yeU5lZWRlZCA+ICRtZW1vcnlBdmFpbGFibGUpCiAgICAgICAgewogICAgICAgICAgICAvLyB0cnkgdG8gZXhwYW5kIG1lbW9yeSBsaW1pdAogICAgICAgICAgICBpZiAoIXNldE1lbW9yeUxpbWl0KGdldE1lbW9yeUxpbWl0KCkrJG1lbW9yeU5lZWRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2U6IGluc3VmZmljaWVudCBtZW1vcnkgLSBuZWVkZWQgIi5yb3VuZCgkbWVtb3J5TmVlZGVkLzEwMjQvMTAyNCwgMikuIk1CLCBhdmFpbGFibGU6ICIucm91bmQoJG1lbW9yeUF2YWlsYWJsZS8xMDI0LzEwMjQsIDIpLiJNQi8iLnJvdW5kKGdldE1lbW9yeUxpbWl0KCkvMTAyNC8xMDI0LCAyKS4iTUIiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3Nob3dNZXNzYWdlKCJUSW1hZ2U6IGluc3VmZmljaWVudCBtZW1vcnksIGJ1dCBleHBhbmRlZCBtZW1vcnkgbGltaXQgc3VjY2VzZnVseSB0byAiLnJvdW5kKGdldE1lbW9yeUxpbWl0KCkvMTAyNC8xMDI0LCAyKS4iTUIiLCBtdFdhcm5pbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAp9CiAKaWYoIWZ1bmN0aW9uX2V4aXN0cygnaW1hZ2Vjb252b2x1dGlvbicpKQp7CiAgICBmdW5jdGlvbiBpbWFnZWNvbnZvbHV0aW9uKCRzcmMsICRmaWx0ZXIsICRmaWx0ZXJfZGl2LCAkb2Zmc2V0KQogICAgewogICAgICAgIGlmICgkc3JjPT1OVUxMKSAKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgIAogICAgICAgICRzeCA9IGltYWdlc3goJHNyYyk7CiAgICAgICAgJHN5ID0gaW1hZ2VzeSgkc3JjKTsKICAgICAgICAkc3JjYmFjayA9IEltYWdlQ3JlYXRlVHJ1ZUNvbG9yICgkc3gsICRzeSk7CiAgICAgICAgSW1hZ2VDb3B5KCRzcmNiYWNrLCAkc3JjLDAsMCwwLDAsJHN4LCRzeSk7CiAgICAgICAKICAgICAgICBpZigkc3JjYmFjaz09TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAgICAKICAgICAgICBmb3IgKCR5PTA7ICR5PCRzeTsgKyskeSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcigkeD0wOyAkeDwkc3g7ICsrJHgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRuZXdfciA9ICRuZXdfZyA9ICRuZXdfYiA9IDA7CiAgICAgICAgICAgICAgICAkYWxwaGEgPSBpbWFnZWNvbG9yYXQoJHNyY2JhY2ssICRweGxbMF0sICRweGxbMV0pOwogICAgICAgICAgICAgICAgJG5ld19hID0gJGFscGhhID4+IDI0OwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoJGo9MDsgJGo8MzsgKyskaikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHl2ID0gbWluKG1heCgkeSAtIDEgKyAkaiwgMCksICRzeSAtIDEpOwogICAgICAgICAgICAgICAgICAgIGZvciAoJGk9MDsgJGk8MzsgKyskaSkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcHhsID0gYXJyYXkobWluKG1heCgkeCAtIDEgKyAkaSwgMCksICRzeCAtIDEpLCAkeXYpOwogICAgICAgICAgICAgICAgICAgICAgICAkcmdiID0gaW1hZ2Vjb2xvcmF0KCRzcmNiYWNrLCAkcHhsWzBdLCAkcHhsWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld19yICs9ICgoJHJnYiA+PiAxNikgJiAweEZGKSAqICRmaWx0ZXJbJGpdWyRpXTsKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld19nICs9ICgoJHJnYiA+PiA4KSAmIDB4RkYpICogJGZpbHRlclskal1bJGldOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV3X2IgKz0gKCRyZ2IgJiAweEZGKSAqICRmaWx0ZXJbJGpdWyRpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJG5ld19yID0gKCRuZXdfci8kZmlsdGVyX2RpdikrJG9mZnNldDsKICAgICAgICAgICAgICAgICRuZXdfZyA9ICgkbmV3X2cvJGZpbHRlcl9kaXYpKyRvZmZzZXQ7CiAgICAgICAgICAgICAgICAkbmV3X2IgPSAoJG5ld19iLyRmaWx0ZXJfZGl2KSskb2Zmc2V0OwoKICAgICAgICAgICAgICAgICRuZXdfciA9ICgkbmV3X3IgPiAyNTUpPyAyNTUgOiAoKCRuZXdfciA8IDApPyAwOiRuZXdfcik7CiAgICAgICAgICAgICAgICAkbmV3X2cgPSAoJG5ld19nID4gMjU1KT8gMjU1IDogKCgkbmV3X2cgPCAwKT8gMDokbmV3X2cpOwogICAgICAgICAgICAgICAgJG5ld19iID0gKCRuZXdfYiA+IDI1NSk/IDI1NSA6ICgoJG5ld19iIDwgMCk/IDA6JG5ld19iKTsKCiAgICAgICAgICAgICAgICAkbmV3X3B4bCA9IEltYWdlQ29sb3JBbGxvY2F0ZUFscGhhKCRzcmMsIChpbnQpJG5ld19yLCAoaW50KSRuZXdfZywgKGludCkkbmV3X2IsICRuZXdfYSk7CiAgICAgICAgICAgICAgICBpZiAoJG5ld19weGwgPT0gLTEpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRuZXdfcHhsID0gSW1hZ2VDb2xvckNsb3Nlc3RBbHBoYSgkc3JjLCAoaW50KSRuZXdfciwgKGludCkkbmV3X2csIChpbnQpJG5ld19iLCAkbmV3X2EpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgkeSA+PSAwKSAmJiAoJHkgPCAkc3kpKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbWFnZXNldHBpeGVsKCRzcmMsICR4LCAkeSwgJG5ld19weGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGltYWdlZGVzdHJveSgkc3JjYmFjayk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKfQoKLyoqIE5hxI10ZW7DrSBvYnLDoXprdSB6IGlrb255LCBwb2t1ZCBuZW7DrSBrIGRpc3BvemljaSBwb8W+YWRvdmFuw70gcm96bcSbciBpa29ueSwgdGFrIHNlIG5hIG7Em2ogcMWZZXZlZGUgbmVqdsSbdMWhw60gaWtvbmEKKiBAcGFyYW0gc3RyaW5nIG7DoXpldiBzb3Vib3J1CiogQHBhcmFtIGludCBwb8W+YWRvdmFuw6EgxaHDrcWZa2EgaWtvbnkKKiBAcGFyYW0gaW50IHBvxb5hZG92YW7DoSB2w73FoWthIGlrb255CiogQHJldHVybiByZXNvdXJjZSBwbG5vYmFyZXZuw70gb2Jyw6F6ZWsgcyBpa29ub3UgcG/FvmFkb3ZhbsO9Y2ggcm96bcSbcsWvIG5lYm8gZmFsc2UgdiBwxZnDrXBhZMSbIGNoeWJ5CiogQGNvcHlyaWdodCBKYWt1YiBWcsOhbmEsIGh0dHA6Ly9waHAudnJhbmEuY3ovCiovCgpmdW5jdGlvbiBfX3NvcnRJY29JY29uc0J5U2l6ZSgkYSwgJGIpCnsKICAgIGlmICgkYVsid2lkdGgiXSA+ICRiWyJ3aWR0aCJdKSAgICAKICAgICAgICByZXR1cm4oMSk7CiAgICBlbHNlIGlmICgkYVsid2lkdGgiXSA8ICRiWyJ3aWR0aCJdKQogICAgICAgIHJldHVybigtMSk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCRhWyJpYml0Y291bnQiXSA+ICRiWyJpYml0Y291bnQiXSkKICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgIGVsc2UgaWYgKCRhWyJpYml0Y291bnQiXSA8ICRiWyJpYml0Y291bnQiXSkKICAgICAgICAgICAgcmV0dXJuKC0xKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybigwKTsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0SW1hZ2VNZW1vcnlVc2FnZSgkd2lkdGgsICRoZWlnaHQsICRieXRlcz0zKQp7CiAgICAkdHdlYWtGYWN0b3IgPSAxLjg7IC8vIDEuNSAtIDEuOAogICAgCiAgICAkbWVtb3J5ID0gJHdpZHRoKiRoZWlnaHQqJGJ5dGVzKiR0d2Vha0ZhY3RvcjsKICAgIAogICAgcmV0dXJuKCRtZW1vcnkpOwp9CgpmdW5jdGlvbiBpbWFnZWNyZWF0ZWZyb21pY28oJGZpbGVuYW1lLCAkd2lkdGgsICRoZWlnaHQpIAp7CiAgICBzZXR0eXBlKCR3aWR0aCwgImludGVnZXIiKTsKICAgIHNldHR5cGUoJGhlaWdodCwgImludGVnZXIiKTsKICAgIAogICAgJGZpbGUgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwogICAgaWYgKCEkZmlsZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRkYXRhID0gdW5wYWNrKCJ2Y291bnQiLCBzdWJzdHIoJGZpbGUsIDQsIDIpKTsKICAgICRyZWFkID0gYXJyYXkoKTsKCiAgICAkaWNvbnMgPSBhcnJheSgpOwogICAgZm9yICgkaT0wOyAkaSA8ICRkYXRhWyJjb3VudCJdOyAkaSsrKSAKICAgIHsKICAgICAgICAkaWNvbiA9IHVucGFjaygiQ3dpZHRoL0NoZWlnaHQvQ2NvbG9ycy9DcmVzZXJ2ZWQvdnBsYW5lcy92Yml0Y291bnQvVmxlbmd0aC9Wb2Zmc2V0Iiwgc3Vic3RyKCRmaWxlLCA2KyRpKjE2LCAxNikpOwogICAgICAgIGlmICgkaWNvbiAmJiAoJGljb24yID0gdW5wYWNrKCJ2aWJpdGNvdW50L1Zjb21wcmVzc2lvbiIsIHN1YnN0cigkZmlsZSwgJGljb25bIm9mZnNldCJdICsgMTQsIDYpKSkpIAogICAgICAgICAgICAkaWNvbnNbXSA9ICRpY29uICsgJGljb24yOwogICAgfQogICAgCiAgICB1c29ydCgkaWNvbnMsICJfX3NvcnRJY29JY29uc0J5U2l6ZSIpOwoKICAgIC8vIGZpbmQgc2l6ZQogICAgLy9kdW1wKCRpY29ucyk7CiAgICBmb3IoJGkgPSAwIDsgJGkgPCBjb3VudCgkaWNvbnMpIDsgJGkrKykKICAgIHsKICAgICAgICBpZiAoJGljb25zWyRpXVsid2lkdGgiXSA+PSAkd2lkdGggJiYgJGljb25zWyRpXVsiaGVpZ2h0Il0gPj0gJGhlaWdodCkKICAgICAgICB7CiAgICAgICAgICAgICRyZWFkID0gJGljb25zWyRpXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIGxhc3QgaWNvbiwgdXNlIGl0IC0gYnV0IHRoZSBpbWFnZSB3aWxsIGJlIHNtb290aGVkCiAgICAgICAgaWYgKCRpID09IGNvdW50KCRpY29ucyktMSkKICAgICAgICB7CiAgICAgICAgICAgICRyZWFkID0gJGljb25zWyRpXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gZmluZCBiZXN0IGJpdGNvdW50CiAgICBmb3IoJGkgPSAwIDsgJGkgPCBjb3VudCgkaWNvbnMpIDsgJGkrKykKICAgIHsKICAgICAgICBpZiAoJGljb25zWyRpXVsid2lkdGgiXSA9PSAkcmVhZFsid2lkdGgiXSAmJiAkaWNvbnNbJGldWyJoZWlnaHQiXSA9PSAkcmVhZFsiaGVpZ2h0Il0pCiAgICAgICAgewogICAgICAgICAgICAkcmVhZCA9ICRpY29uc1skaV07CiAgICAgICAgfQogICAgfQoKICAgIC8vdmFyX2R1bXAoJHJlYWRbIndpZHRoIl0pOwogICAgLy92YXJfZHVtcCgkcmVhZFsiaGVpZ2h0Il0pOwogICAgLy92YXJfZHVtcCgkcmVhZFsiaWJpdGNvdW50Il0pOwogICAgLy9leGl0OwogICAgLy9kdW1wKCRyZWFkKTsKICAgICRpbSA9IGljb25fcmVhZChzdWJzdHIoJGZpbGUsICRyZWFkWyJvZmZzZXQiXSArIDQwLCAkcmVhZFsibGVuZ3RoIl0pLCAkcmVhZFsid2lkdGgiXSwgJHJlYWRbImhlaWdodCJdLCAkcmVhZFsiaWJpdGNvdW50Il0sICRyZWFkWyJjb21wcmVzc2lvbiJdKTsKICAgIC8vZHVtcCgkaW0pOwogICAgaWYgKCRyZWFkWyJ3aWR0aCJdID09ICR3aWR0aCAmJiAkcmVhZFsiaGVpZ2h0Il0gPT0gJGhlaWdodCkgewogICAgICAgIHJldHVybiAkaW07CiAgICB9CiAgICAkaW0yID0gaW1hZ2VjcmVhdGV0cnVlY29sb3IoJHdpZHRoLCAkaGVpZ2h0KTsKICAgIGltYWdlY29weXJlc2FtcGxlZCgkaW0yLCAkaW0sIDAsIDAsIDAsIDAsICR3aWR0aCwgJGhlaWdodCwgaW1hZ2VzeCgkaW0pLCBpbWFnZXN5KCRpbSkpOwogICAgcmV0dXJuICRpbTI7Cn0KCi8qKiBOYcSNdGVuw60gb2JyYXpvdsO9Y2ggZGF0IGlrb255CiogQHBhcmFtIHN0cmluZyBvYnJhem92w6EgZGF0YQoqIEBwYXJhbSBpbnQgxaHDrcWZa2Egb2Jyw6F6a3UKKiBAcGFyYW0gaW50IHbDvcWha2Egb2Jyw6F6a3UKKiBAcGFyYW0gaW50IHBvxI1ldCBiaXTFryBuYSBwaXhlbAoqIEBwYXJhbSBpbnQga29tcHJlc2UgZGF0IC0gaWdub3J1amUgc2UKKiBAcmV0dXJuIHJlc291cmNlIHBsbm9iYXJldm7DvSBvYnLDoXplayBzIGlrb25vdQoqIEBjb3B5cmlnaHQgSmFrdWIgVnLDoW5hLCBodHRwOi8vcGhwLnZyYW5hLmN6LwoqLwpmdW5jdGlvbiBpY29uX3JlYWQoJGZpbGUsICR3aWR0aCwgJGhlaWdodCwgJGJpdGNvdW50LCAkY29tcHJlc3Npb24gPSAwKSB7CiAgICAkaW0gPSBpbWFnZWNyZWF0ZXRydWVjb2xvcigkd2lkdGgsICRoZWlnaHQpOwogICAgaWYgKCRiaXRjb3VudCA9PSAzMikKICAgIHsKICAgICAgICBpbWFnZWFscGhhYmxlbmRpbmcoJGltLCBmYWxzZSk7CiAgICAgICAgaW1hZ2VzYXZlYWxwaGEoJGltLCB0cnVlKTsKICAgICAgICAkdHJhbnNwYXJlbnQgPSBpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYSgkaW0sIDI1NSwgMjU1LCAyNTUsIDEyNyk7CiAgICAgICAgaW1hZ2VmaWxsZWRyZWN0YW5nbGUoJGltLCAwLCAwLCAkd2lkdGgtMSwgJGhlaWdodC0xLCAkdHJhbnNwYXJlbnQpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGltYWdlZmlsbGVkcmVjdGFuZ2xlKCRpbSwgMCwgMCwgJHdpZHRoLTEsICRoZWlnaHQtMSwgaW1hZ2Vjb2xvcmFsbG9jYXRlKCRpbSwgMjU1LCAyNTUsIDI1NSkpOwogICAgfQogICAgaWYgKCRiaXRjb3VudCA8PSA4KSB7CiAgICAgICAgJGNvbG9ycyA9IGFycmF5KCk7CiAgICAgICAgZm9yICgkaT0wOyAkaSA8IHBvdygyLCAkYml0Y291bnQpOyAkaSsrKSB7CiAgICAgICAgICAgICRjb2xvciA9IHVucGFjaygiQ2JsdWUvQ2dyZWVuL0NyZWQiLCBzdWJzdHIoJGZpbGUsIDQqJGksIDMpKTsKICAgICAgICAgICAgJGNvbG9yc1tdID0gaW1hZ2Vjb2xvcmFsbG9jYXRlKCRpbSwgJGNvbG9yWyJyZWQiXSwgJGNvbG9yWyJncmVlbiJdLCAkY29sb3JbImJsdWUiXSk7CiAgICAgICAgfQogICAgICAgICRmaWxlID0gc3Vic3RyKCRmaWxlLCA0KnBvdygyLCAkYml0Y291bnQpKTsKICAgIH0KICAgIGZvciAoJHk9MDsgJHkgPCAkaGVpZ2h0OyAkeSsrKSB7CiAgICAgICAgZm9yICgkeD0wOyAkeCA8ICR3aWR0aDsgJHgrKykgewogICAgICAgICAgICAkb2Zmc2V0ID0gMzIqJHkqY2VpbCgkd2lkdGgqJGJpdGNvdW50LzMyKSArICR4KiRiaXRjb3VudDsKICAgICAgICAgICAgJHRyYW5zID0gb3JkKCRmaWxlWzQqJGhlaWdodCpjZWlsKCR3aWR0aCokYml0Y291bnQvMzIpICsgNCokeSpjZWlsKCR3aWR0aC8zMikgKyBmbG9vcigkeC84KV0pICYgKDEgPDwgKDcgLSAkeCAlIDgpKTsKICAgICAgICAgICAgaWYgKCRiaXRjb3VudCA8PSA4KSB7CiAgICAgICAgICAgICAgICAkYnl0ZSA9IG9yZCgkZmlsZVtmbG9vcigkb2Zmc2V0LzgpXSk7CiAgICAgICAgICAgICAgICAkY29sb3IgPSAkY29sb3JzWyRieXRlID4+ICg4IC0gJGJpdGNvdW50IC0gJG9mZnNldCAlIDgpICYgKHBvdygyLCAkYml0Y291bnQpIC0gMSldOwogICAgICAgICAgICB9IGVsc2VpZiAoJGJpdGNvdW50ID09IDE2KSB7CiAgICAgICAgICAgICAgICAkY29sb3JzID0gdW5wYWNrKCJuYmdyIiwgc3Vic3RyKCRmaWxlLCAkb2Zmc2V0LzgsIDIpKTsKICAgICAgICAgICAgICAgICRjb2xvciA9IGltYWdlY29sb3JhbGxvY2F0ZSgkaW0sIHJvdW5kKDI1NS8zMSAqICgkY29sb3JzWyJiZ3IiXSAmIDMxKSksIHJvdW5kKDI1NS82MyAqICgoJGNvbG9yc1siYmdyIl0gPj4gNSkgJiA2MykpLCByb3VuZCgyNTUvMzEgKiAoJGNvbG9yc1siYmdyIl0gPj4gMTEpKSk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkYml0Y291bnQgPT0gMzIpIHsKICAgICAgICAgICAgICAgIC8vZHVtcCh1bnBhY2soIkNibHVlL0NncmVlbi9DcmVkL0NhbHBoYSIsIHN1YnN0cigkZmlsZSwgJG9mZnNldC84LCA0KSkpOwogICAgICAgICAgICAgICAgJGNvbG9ycyA9IHVucGFjaygiQ2JsdWUvQ2dyZWVuL0NyZWQvQ2FscGhhIiwgc3Vic3RyKCRmaWxlLCAkb2Zmc2V0LzgsIDQpKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkY29sb3JzWyJhbHBoYSJdKTsKICAgICAgICAgICAgICAgICRjb2xvciA9IGltYWdlY29sb3JhbGxvY2F0ZWFscGhhKCRpbSwgJGNvbG9yc1sicmVkIl0sICRjb2xvcnNbImdyZWVuIl0sICRjb2xvcnNbImJsdWUiXSwgMTI3LWZsb29yKCRjb2xvcnNbImFscGhhIl0vMikpOyAvLyAwLTI1NSA9PiAwLTEyNwogICAgICAgICAgICAgICAgLy8kY29sb3IgPSBpbWFnZWNvbG9yYWxsb2NhdGUoJGltLCAyNTUgLSAkY29sb3JzWyJhbHBoYSJdICsgcm91bmQoJGNvbG9yc1sicmVkIl0gKiAkY29sb3JzWyJhbHBoYSJdIC8gMjU1KSwgMjU1IC0gJGNvbG9yc1siYWxwaGEiXSArIHJvdW5kKCRjb2xvcnNbImdyZWVuIl0gKiAkY29sb3JzWyJhbHBoYSJdIC8gMjU1KSwgMjU1IC0gJGNvbG9yc1siYWxwaGEiXSArIHJvdW5kKCRjb2xvcnNbImJsdWUiXSAqICRjb2xvcnNbImFscGhhIl0gLyAyNTUpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjb2xvcnMgPSB1bnBhY2soIkNibHVlL0NncmVlbi9DcmVkIiwgc3Vic3RyKCRmaWxlLCAkb2Zmc2V0LzgsIDMpKTsKICAgICAgICAgICAgICAgICRjb2xvciA9IGltYWdlY29sb3JhbGxvY2F0ZSgkaW0sICRjb2xvcnNbInJlZCJdLCAkY29sb3JzWyJncmVlbiJdLCAkY29sb3JzWyJibHVlIl0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJHRyYW5zKSB7IC8vICRiYWNrZ3JvdW5kWzBdIF4gJGNvbG9yc1sicmVkIl0gcHJvaGzDrcW+ZcSNZSBuZXBvdcW+w612YWrDrQogICAgICAgICAgICAgICAgaW1hZ2VzZXRwaXhlbCgkaW0sICR4LCAkaGVpZ2h0IC0gJHkgLSAxLCAkY29sb3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRpbTsKfQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSW1hZ2UvSW1hZ2VMYXllci5jbGFzcy5waHAgLS0tLS0tLSANCgppZiAoIWZ1bmN0aW9uX2V4aXN0cygiaW1hZ2V3ZWJwIikpCnsKICAgIGZ1bmN0aW9uIGltYWdld2VicCgkaW1hZ2UsICRmaWxlPW51bGwsICRxdWFsaXR5PS0xKQogICAgewogICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2VMYXllciAtIGltYWdld2VicCgpIG5vdCBzdXBwb3J0ZWQgb24gc2VydmVyIiwgbXRXYXJuaW5nKTsKICAgICAgICAKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCJpbWFnZWNyZWF0ZWZyb213ZWJwIikpCnsKICAgIGZ1bmN0aW9uIGltYWdlY3JlYXRlZnJvbXdlYnAoJGZpbGUpCiAgICB7CiAgICAgICAgc2hvd01lc3NhZ2UoIlRJbWFnZUxheWVyIC0gaW1hZ2VjcmVhdGVmcm9td2VicCgpIG5vdCBzdXBwb3J0ZWQgb24gc2VydmVyIiwgbXRXYXJuaW5nKTsKICAgICAgICAKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9Cn0KCmNsYXNzIFRJbWFnZUxheWVyIGV4dGVuZHMgVENvcmVPYmplY3QKewogICAgdmFyICRpbWFnZSA9IE5VTEw7CiAgICB2YXIgJGVycm9ycyA9IGFycmF5KCk7CiAgICAKICAgIHZhciAkaW1hZ2VUeXBlcyA9IGFycmF5KAogICAgICAgIDEgPT4gIkdJRiIsIAogICAgICAgIDIgPT4gIkpQRyIsIAogICAgICAgIDMgPT4gIlBORyIsIAogICAgICAgIDQgPT4gIlNXRiIsIAogICAgICAgIDUgPT4gIlBTRCIsIAogICAgICAgIDYgPT4gIkJNUCIsIAogICAgICAgIDcgPT4gIlRJRkYiLCAvLyhvcmRlbiBkZSBieXRlcyBpbnRlbCksIAogICAgICAgIDggPT4gIlRJRkYiLCAvLyhvcmRlbiBkZSBieXRlcyBtb3Rvcm9sYSksIAogICAgICAgIDkgPT4gIkpQQyIsIAogICAgICAgIDEwID0+ICJKUDIiLCAKICAgICAgICAxMSA9PiAiSlBYIiwgCiAgICAgICAgMTIgPT4gIkpCMiIsIAogICAgICAgIDEzID0+ICJTV0MiLCAKICAgICAgICAxNCA9PiAiSUZGIiwgCiAgICAgICAgMTUgPT4gIldCTVAiLCAKICAgICAgICAxNiA9PiAiWEJNIiwKICAgICk7CgogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gX19kZXN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmNsb3NlKCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNsb3NlKCkKICAgIHsKICAgICAgICBpZiAoaXNfcmVzb3VyY2UoJHRoaXMtPmltYWdlKSkKICAgICAgICAgICAgaW1hZ2VkZXN0cm95KCR0aGlzLT5pbWFnZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZCgkZmlsZSwgJHdpZHRoPTAsICRoZWlnaHQ9MCkKICAgIHsKICAgICAgICAkdGhpcy0+dHlwZSA9IHN0cnRvbG93ZXIoZ2V0RmlsZUV4dCgkZmlsZSkpOwogICAgICAgICR0aGlzLT5maWxlID0gJGZpbGU7CiAgICAgICAgJHRoaXMtPmltYWdlID0gRkFMU0U7CiAgICAgICAgaWYgKCR0aGlzLT50eXBlID09ICJpY28iKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPndpZHRoID0gZmlyc3RfdmFsdWUoJHdpZHRoLCAxMDI0KTsKICAgICAgICAgICAgJHRoaXMtPmhlaWdodCA9IGZpcnN0X3ZhbHVlKCRoZWlnaHQsIDEwMjQpOwogICAgICAgICAgICAkc2l6ZSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR0aGlzLT50eXBlID09ICJ3ZWJwIikKICAgICAgICB7CiAgICAgICAgICAgICRpbWcgPSBpbWFnZWNyZWF0ZWZyb213ZWJwKCRmaWxlKTsKCiAgICAgICAgICAgICR0aGlzLT53aWR0aCA9IGltYWdlc3goJGltZyk7CiAgICAgICAgICAgICR0aGlzLT5oZWlnaHQgPSBpbWFnZXN5KCRpbWcpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkc2l6ZSA9IGdldGltYWdlc2l6ZSgkZmlsZSwgJHRoaXMtPmltYWdlSW5mbyk7CiAgICAgICAgICAgIC8vJGV4aWYgPSBAZXhpZl9yZWFkX2RhdGEoJGZpbGUpOwogICAgICAgICAgICAkdGhpcy0+d2lkdGggPSAkc2l6ZVswXTsKICAgICAgICAgICAgJHRoaXMtPmhlaWdodCA9ICRzaXplWzFdOwogICAgICAgICAgICAvLyR0aGlzLT50eXBlID0gZmlyc3RfdmFsdWUoc3RydG9sb3dlcigkdGhpcy0+aW1hZ2VUeXBlc1skc2l6ZVsyXV0pLCAkdGhpcy0+dHlwZSk7CiAgICAgICAgICAgICR0aGlzLT50eXBlID0gKCRzaXplID8gc3RydG9sb3dlcigkdGhpcy0+aW1hZ2VUeXBlc1skc2l6ZVsyXV0pIDogIiIpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoISRzaXplKQogICAgICAgIHsKICAgICAgICAgICAgLy8genJ1c2VubyBrdnVsaSBJbWFnZU1hZ2ljayAuLi4gYWJ5IHNsbyBuYWNpc3QgaSBQREYsIHZpZGVvLCAuLi4KICAgICAgICAgICAgLy9zaG93TWVzc2FnZSgiVEltYWdlTGF5ZXI6OmxvYWQoKSAtIENhbm5vdCBnZXQgc2l6ZSBmb3IgaW1hZ2UgJyIuJGZpbGUuIiciLCBtdEVycm9yKTsKICAgICAgICAgICAgLy9yZXR1cm4oZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgaWYgKEZBTFNFICYmICRzaXplWyIwIl0qJHNpemVbIjEiXSozID4gMTAyNCoxMDI0KjEwKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXJfZHVtcCgkc2l6ZSk7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJUSW1hZ2VMYXllcjo6bG9hZCgpIC0gSW1hZ2UgJyIuJGZpbGUuIicgaXMgdG9vIGJpZyAiLnJvdW5kKF9maWxlc2l6ZSgkZmlsZSkvMTAyNC8xMDI0LCAyKS4iTUIiLCBtdEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKFRJbWFnZTo6Y2hlY2tNZW1vcnlVc2FnZSgkdGhpcy0+d2lkdGgsICR0aGlzLT5oZWlnaHQsICR0aGlzLT50eXBlKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgkdGhpcy0+dHlwZSk7CiAgICAgICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZ2lmIjoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltYWdlID0gaW1hZ2VjcmVhdGVmcm9tZ2lmKCRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAianBnIjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJqcGVnIjoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltYWdlID0gaW1hZ2VjcmVhdGVmcm9tanBlZygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgInBuZyI6CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbWFnZSA9IGltYWdlY3JlYXRlZnJvbXBuZygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIndlYnAiOgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1hZ2UgPSBpbWFnZWNyZWF0ZWZyb213ZWJwKCRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaWNvIjoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltYWdlID0gaW1hZ2VjcmVhdGVmcm9taWNvKCRmaWxlLCAkdGhpcy0+d2lkdGgsICR0aGlzLT5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkdGhpcy0+aW1hZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIlRJbWFnZUxheWVyOjpvcGVuKCkgLSB1bnN1cHBvcnRlZCBpbWFnZSB0eXBlICciLiR0aGlzLT50eXBlLiInIGZvciBmaWxlICIuJGZpbGUsIG10V2FybmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHRocm93IGZhdGFsIGVycm9yCiAgICAgICAgICAgICAgICAvLyR0aGlzLT5pbWFnZSA9IGltYWdlY3JlYXRlZnJvbXN0cmluZyhmaWxlX2dldF9jb250ZW50cygkZmlsZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiAkZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlcnJvciA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKCiAgICAgICAgICAgIGlmICgkZXJyb3IpCiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiVEltYWdlTGF5ZXI6Om9wZW4oKSAtIHVuc3VwcG9ydGVkIGltYWdlIHR5cGUgZm9yIGZpbGUgIi4kZmlsZSwgbXRXYXJuaW5nKTsKCiAgICAgICAgICAgIC8vIHBob3RvcyBmcm9tIG1vYmlsZSBwaG9uZXMgZml4CiAgICAgICAgICAgIGlmIChmYWxzZSAmJiAhZW1wdHkoJGV4aWZbJ09yaWVudGF0aW9uJ10pKSAvLyBtb3ZlZCB0byBJbWFnZVVwbG9hZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2goJGV4aWZbJ09yaWVudGF0aW9uJ10pIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltYWdlID0gaW1hZ2Vyb3RhdGUoJHRoaXMtPmltYWdlLDkwLDApOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2lkdGggPSAkc2l6ZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhlaWdodCA9ICRzaXplWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbWFnZSA9IGltYWdlcm90YXRlKCR0aGlzLT5pbWFnZSwxODAsMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltYWdlID0gaW1hZ2Vyb3RhdGUoJHRoaXMtPmltYWdlLC05MCwwKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndpZHRoID0gJHNpemVbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oZWlnaHQgPSAkc2l6ZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuKCR0aGlzLT5pbWFnZSAhPT0gRkFMU0UpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHNhdmUoJGZpbGUsICRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+aW1hZ2UpCiAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgCiAgICAgICAgJHR5cGUgPSBnZXRGaWxlRXh0KCRmaWxlKTsKICAgICAgICAvL3Zhcl9kdW1wKCRmaWxlKTsgZXhpdDsKICAgICAgICBpZiAoISR0aGlzLT5lcnJvcnMpCiAgICAgICAgewogICAgICAgICAgICAkaW1hZ2UgPSAkdGhpcy0+Z2V0SW1hZ2VEYXRhKCR0eXBlLCAkcGFyYW1zKTsKICAgICAgICAgICAgaWYgKCRpbWFnZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3VubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICBfZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRpbWFnZSk7CgogICAgICAgICAgICAgICAgJHNpemUgPSBnZXRJbWFnZVNpemUoJGZpbGUpOwogICAgICAgICAgICAgICAgJHRoaXMtPndpZHRoID0gJHNpemVbMF07CiAgICAgICAgICAgICAgICAkdGhpcy0+aGVpZ2h0ID0gJHNpemVbMV07CiAgICAgICAgCiAgICAgICAgICAgIC8qCiAgICAgICAgaWYgKHRydWUpICAgICAgICAKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAicG5nIikKICAgICAgICAgICAgICAgIGltYWdlc2F2ZWFscGhhKCR0aGlzLT5pbWFnZSwgdHJ1ZSk7CgogICAgICAgICAgICAkaW1hZ2UgPSBpbWFnZWNyZWF0ZXRydWVjb2xvcigkdGhpcy0+d2lkdGgsICR0aGlzLT5oZWlnaHQpOwogICAgICAgICAgICBpbWFnZWNvcHkoJGltYWdlLCAkdGhpcy0+aW1hZ2UsIDAsIDAsIDAsIDAsICR0aGlzLT53aWR0aCwgJHRoaXMtPmhlaWdodCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpbWFnZWRlc3Ryb3koJHRoaXMtPmltYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmltYWdlID0gJGltYWdlOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRyZXQgPSBfZmlsZV9leGlzdHMoJGZpbGUpICYmIF9maWxlc2l6ZSgkZmlsZSk7CiAgICAgICAgLyoKICAgICAgICBpZiAoJHJldCAmJiAhX2ZpbGVzaXplKCRmaWxlKSkKICAgICAgICB7CiAgICAgICAgICAgIF91bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAkcmV0ID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgICovCiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRyZXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZSgkd2lkdGgsICRoZWlnaHQpCiAgICB7CiAgICAgICAgJHRoaXMtPmltYWdlID0gaW1hZ2VjcmVhdGV0cnVlY29sb3IoJHdpZHRoLCAkaGVpZ2h0KTsKICAgICAgICBpbWFnZWFscGhhYmxlbmRpbmcoJHRoaXMtPmltYWdlLCBmYWxzZSk7CiAgICAgICAgaW1hZ2VzYXZlYWxwaGEoJHRoaXMtPmltYWdlLCB0cnVlKTsKICAgICAgICAkdHJhbnNwYXJlbnQgPSBpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYSgkdGhpcy0+aW1hZ2UsIDI1NSwgMjU1LCAyNTUsIDEyNyk7CiAgICAgICAgaW1hZ2VmaWxsZWRyZWN0YW5nbGUoJHRoaXMtPmltYWdlLCAwLCAwLCAkd2lkdGgsICRoZWlnaHQsICR0cmFuc3BhcmVudCk7CgogICAgICAgICR0aGlzLT53aWR0aCA9ICR3aWR0aDsKICAgICAgICAkdGhpcy0+aGVpZ2h0ID0gJGhlaWdodDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SW1hZ2VEYXRhKCR0eXBlLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+aW1hZ2UpCiAgICAgICAgICAgIHJldHVybihudWxsKTsKCiAgICAgICAgaWYgKCEkcGFyYW1zWyJxdWFsaXR5Il0pCiAgICAgICAgICAgICRwYXJhbXNbInF1YWxpdHkiXSA9IDk1OwogICAgICAgIAogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgJHR5cGUgPSBzdHJ0b2xvd2VyKCR0eXBlKTsKICAgICAgICBzd2l0Y2goJHR5cGUpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICJnaWYiOgogICAgICAgICAgICAgICAgJHJldCA9IGltYWdlZ2lmKCR0aGlzLT5pbWFnZSwgTlVMTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAianBnIjoKICAgICAgICAgICAgY2FzZSAianBlZyI6CiAgICAgICAgICAgICAgICAkcmV0ID0gaW1hZ2VqcGVnKCR0aGlzLT5pbWFnZSwgTlVMTCwgJHBhcmFtc1sicXVhbGl0eSJdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJwbmciOgogICAgICAgICAgICAgICAgaW1hZ2VzYXZlYWxwaGEoJHRoaXMtPmltYWdlLCB0cnVlKTsKICAgICAgICAgICAgICAgICRyZXQgPSBpbWFnZXBuZygkdGhpcy0+aW1hZ2UsIE5VTEwsIHJvdW5kKCRwYXJhbXNbInF1YWxpdHkiXSo5LzEwMCksICRwYXJhbXNbImZpbHRlcnMiXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAid2VicCI6CiAgICAgICAgICAgICAgICBpbWFnZXNhdmVhbHBoYSgkdGhpcy0+aW1hZ2UsIHRydWUpOwogICAgICAgICAgICAgICAgJHJldCA9IGltYWdld2VicCgkdGhpcy0+aW1hZ2UsIE5VTEwsIHJvdW5kKCRwYXJhbXNbInF1YWxpdHkiXSo5LzEwMCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgICRpbWFnZSA9IG9iX2dldF9jb250ZW50cygpOwogICAgICAgIG9iX2VuZF9jbGVhbigpOwogICAgICAgIC8vdmFyX2R1bXAoaW1hZ2VqcGVnKCR0aGlzLT5pbWFnZSwgIiIsICRwYXJhbXNbInF1YWxpdHkiXSkpOwogICAgICAgIC8vZXhpdDsKICAgICAgICBpZiAoISRyZXQpCiAgICAgICAgewogICAgICAgICAgICBzaG93TWVzc2FnZSgiVEltYWdlTGF5ZXI6OmdldEltYWdlRGF0YSgpIC0gY2Fubm90IGdlbmVyYXRlIGltYWdlICgnIi4kdHlwZS4iJykgLSAiLnN0cl9kdW1wKGVycm9yX2dldF9sYXN0KCkpLCBtdEVycm9yKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRpbWFnZSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG91dHB1dCgkdHlwZT0icG5nIiwgJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmltYWdlKQogICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgIAogICAgICAgICRpbWFnZSA9ICR0aGlzLT5nZXRJbWFnZURhdGEoJHR5cGUsICRwYXJhbXMpOwogICAgICAgIGlmICgkcGFyYW1zWyJoZWFkZXJzIl0gIT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LWxlbmd0aDogIi5zdHJsZW4oJGltYWdlKSk7ICAgICAgICAKICAgICAgICAgICAgaWYgKCR0eXBlID09ICJwbmciKQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IGltYWdlL3BuZyIpOyAgICAgICAgCiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAianBnIiB8fCAkdHlwZSA9PSAianBlZyIpCiAgICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogaW1hZ2UvanBlZyIpOyAgICAgICAgCiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAiZ2lmIikKICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC10eXBlOiBpbWFnZS9naWYiKTsgICAgICAgIAogICAgICAgICAgICBpZiAoJHR5cGUgPT0gIndlYnAiKQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IGltYWdlL3dlYnAiKTsgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAkaW1hZ2UgPSAkdGhpcy0+Z2V0SW1hZ2VEYXRhKCR0eXBlLCAkcGFyYW1zKTsKICAgICAgICBpZiAoJHBhcmFtc1siZXhpdCJdICE9PSBmYWxzZSkKICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOwoKICAgICAgICBlY2hvICRpbWFnZTsKICAgICAgICAKICAgICAgICBpZiAoJHBhcmFtc1siZXhpdCJdICE9PSBmYWxzZSkKICAgICAgICAgICAgZXhpdDsKICAgIH0KCiAgICBmdW5jdGlvbiBfX2NhbGwoJG5hbWUsICRhcmd1bWVudHMpCiAgICB7CiAgICAgICAgJG9iamVjdFR5cGVzID0gZ2V0T2JqZWN0VHlwZXMoIkltYWdlRWZmZWN0Iik7CiAgICAgICAgZm9yZWFjaCgkb2JqZWN0VHlwZXMgYXMgJG9iamVjdFR5cGUpCiAgICAgICAgewogICAgICAgICAgICAkT2JqZWN0ID0gZ2V0T2JqZWN0KCRvYmplY3RUeXBlKTsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoYXJyYXkoJE9iamVjdCwgJG5hbWUpLCAkdGhpcywgJGFyZ3VtZW50c1swXSwgJGFyZ3VtZW50c1sxXSwgJGFyZ3VtZW50c1syXSwgJGFyZ3VtZW50c1szXSwgJGFyZ3VtZW50c1s0XSwgJGFyZ3VtZW50c1s1XSwgJGFyZ3VtZW50c1s2XSwgJGFyZ3VtZW50c1s3XSwgJGFyZ3VtZW50c1s4XSwgJGFyZ3VtZW50c1s5XSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZExheWVyKCRMYXllciwgJHg9MCwgJHk9MCkKICAgIHsKICAgICAgICBpbWFnZWFscGhhYmxlbmRpbmcoJHRoaXMtPmltYWdlLCB0cnVlKTsKICAgICAgICBpbWFnZXNhdmVhbHBoYSgkdGhpcy0+aW1hZ2UsIGZhbHNlKTsKICAgICAgICBpbWFnZWNvcHlyZXNhbXBsZWQoJHRoaXMtPmltYWdlLCAkTGF5ZXItPmltYWdlLCAkeCwgJHksIDAsIDAsICRMYXllci0+d2lkdGgsICRMYXllci0+aGVpZ2h0LCAkTGF5ZXItPndpZHRoLCAkTGF5ZXItPmhlaWdodCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFBpeGVsKCRMYXllciwgJHgsICR5KQogICAgewogICAgICAgICRjaSA9IGltYWdlY29sb3JhdCgkTGF5ZXItPmltYWdlLCAkeCwgJHkpOwogICAgICAgICRjID0gaW1hZ2Vjb2xvcnNmb3JpbmRleCgkTGF5ZXItPmltYWdlLCAkY2kpOwoKICAgICAgICByZXR1cm4oYXJyYXkoCiAgICAgICAgICAgICJyIiA9PiAkY1sicmVkIl0sCiAgICAgICAgICAgICJnIiA9PiAkY1siZ3JlZW4iXSwKICAgICAgICAgICAgImIiID0+ICRjWyJibHVlIl0sCiAgICAgICAgICAgICJhIiA9PiAkY1siYWxwaGEiXSwKICAgICAgICApKTsKICAgICAgICAKICAgICAgICAvLyBPTEQKICAgICAgICAkYyA9IGltYWdlY29sb3JhdCgkTGF5ZXItPmltYWdlLCAkeCwgJHkpOwogICAgICAgIHJldHVybihhcnJheSgKICAgICAgICAgICAgInIiID0+ICRjID4+IDE2ICYgMHhGRiwKICAgICAgICAgICAgImciID0+ICRjID4+IDggJiAweEZGLAogICAgICAgICAgICAiYiIgPT4gJGMgJiAweEZGLAogICAgICAgICAgICAiYSIgPT4gJGMgPj4gMjQgJiAweDdGLAogICAgICAgICkpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBzZXRQaXhlbCgkTGF5ZXIsICR4LCAkeSwgJGNvbG9yKQogICAgewogICAgICAgICRjID0gaW1hZ2Vjb2xvcmFsbG9jYXRlYWxwaGEoJExheWVyLT5pbWFnZSwgJGNvbG9yWyJyIl0sICRjb2xvclsiZyJdLCAkY29sb3JbImIiXSwgJGNvbG9yWyJhIl0pOwogICAgICAgIGltYWdlc2V0cGl4ZWwoJExheWVyLT5pbWFnZSwgJHgsICR5LCAkYyk7CiAgICB9CgogICAgZnVuY3Rpb24gZmlsbCgkY29sb3IsICR4PTAsICR5PTAsICR3aWR0aD1OVUxMLCAkaGVpZ2h0PU5VTEwpCiAgICB7CiAgICAgICAgaWYgKCEkd2lkdGgpCiAgICAgICAgICAgICR3aWR0aCA9ICR0aGlzLT53aWR0aDsKICAgICAgICBpZiAoISRoZWlnaHQpCiAgICAgICAgICAgICRoZWlnaHQgPSAkdGhpcy0+aGVpZ2h0OwogICAgICAgIAogICAgICAgICRjb2xvciA9IHBhcnNlQ29sb3IoJGNvbG9yKTsKICAgICAgICAvL2R1bXAoJGNvbG9yKTsKICAgICAgICAKICAgICAgICAvLyRjb2xvciA9IGltYWdlY29sb3JhbGxvY2F0ZWFscGhhKCR0aGlzLT5pbWFnZSwgJGNvbG9yWyJyIl0sICRjb2xvclsiZyJdLCAkY29sb3JbImIiXSwgMTI3KTsKICAgICAgICAkY29sb3IgPSBpbWFnZWNvbG9yYWxsb2NhdGUoJHRoaXMtPmltYWdlLCAkY29sb3JbInIiXSwgJGNvbG9yWyJnIl0sICRjb2xvclsiYiJdKTsKICAgICAgICBpbWFnZWZpbGxlZHJlY3RhbmdsZSgkdGhpcy0+aW1hZ2UsICR4LCAkeSwgJHgrJHdpZHRoLCAkeSskaGVpZ2h0LCAkY29sb3IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldERhdGFVcmwoJHR5cGU9InBuZyIpIAogICAgeyAgCiAgICAgICAgJG1pbWUgPSAiaW1hZ2UvIi4kdHlwZTsKICAgICAgICAkaW1hZ2UgPSAkdGhpcy0+Z2V0SW1hZ2VEYXRhKCR0eXBlKTsKICAgICAgICAKICAgICAgICAkdXJsID0gJ2RhdGE6Jy4kbWltZS4nO2Jhc2U2NCwnLmJhc2U2NF9lbmNvZGUoJGltYWdlKTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHVybCk7CiAgICAgICAgcmV0dXJuKCR1cmwpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRCYWNrZ3JvdW5kQ29sb3IoJExheWVyPU5VTEwpCiAgICB7CiAgICAgICAgaWYgKCEkTGF5ZXIpCiAgICAgICAgICAgICRMYXllciA9ICR0aGlzOwogICAgCiAgICAgICAgICAgIC8vICB4IC4uLi4geCAuLi4uIHgKICAgICAgICAgICAgLy8gIC4gICAgICAgICAgICAgLiAKICAgICAgICAgICAgLy8gIC4gICAgICAgICAgICAgLiAKICAgICAgICAgICAgLy8gIHggICAgICAgICAgICAgeCAKICAgICAgICAgICAgLy8gIC4gICAgICAgICAgICAgLiAKICAgICAgICAgICAgLy8gIC4gICAgICAgICAgICAgLiAKICAgICAgICAgICAgLy8gIHggLi4uLiB4IC4uLi4geAoKICAgICAgICAkY29sb3JzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJExheWVyLT53aWR0aCAmJiAkTGF5ZXItPmhlaWdodCkKICAgICAgICB7CiAgICAgICAgICAgICRjb2xvcnNbXSA9IFRJbWFnZUxheWVyOjpnZXRQaXhlbCgkTGF5ZXIsIDAsIDApOwogICAgICAgICAgICAkY29sb3JzW10gPSBUSW1hZ2VMYXllcjo6Z2V0UGl4ZWwoJExheWVyLCBjZWlsKCRMYXllci0+d2lkdGgvMiktMSwgMCk7CiAgICAgICAgICAgICRjb2xvcnNbXSA9IFRJbWFnZUxheWVyOjpnZXRQaXhlbCgkTGF5ZXIsICRMYXllci0+d2lkdGgtMSwgMCk7CiAgICAgICAgICAgICRjb2xvcnNbXSA9IFRJbWFnZUxheWVyOjpnZXRQaXhlbCgkTGF5ZXIsIDAsIGNlaWwoJExheWVyLT5oZWlnaHQvMiktMSk7CiAgICAgICAgICAgICRjb2xvcnNbXSA9IFRJbWFnZUxheWVyOjpnZXRQaXhlbCgkTGF5ZXIsICRMYXllci0+d2lkdGgtMSwgY2VpbCgkTGF5ZXItPmhlaWdodC8yKS0xKTsKICAgICAgICAgICAgJGNvbG9yc1tdID0gVEltYWdlTGF5ZXI6OmdldFBpeGVsKCRMYXllciwgMCwgJExheWVyLT5oZWlnaHQtMSk7CiAgICAgICAgICAgICRjb2xvcnNbXSA9IFRJbWFnZUxheWVyOjpnZXRQaXhlbCgkTGF5ZXIsIGNlaWwoJExheWVyLT53aWR0aC8yKS0xLCAkTGF5ZXItPmhlaWdodC0xKTsKICAgICAgICAgICAgJGNvbG9yc1tdID0gVEltYWdlTGF5ZXI6OmdldFBpeGVsKCRMYXllciwgJExheWVyLT53aWR0aC0xLCAkTGF5ZXItPmhlaWdodC0xKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oYXJyYXkoKSk7CiAgICAgICAgCiAgICAgICAgJG1vc3RDb2xvciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkY29sb3JzIGFzICRjb2xvcikKICAgICAgICB7CiAgICAgICAgICAgICRtb3N0Q29sb3JbaW1wbG9kZUxpc3QoJGNvbG9yKV0rKzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXNvcnQoJG1vc3RDb2xvcik7CiAgICAgICAgJG1vc3RDb2xvciA9IGFycmF5X2tleXMoJG1vc3RDb2xvcik7CiAgICAgICAgJG1vc3RDb2xvciA9ICRtb3N0Q29sb3JbY291bnQoJG1vc3RDb2xvciktMV07CiAgICAgICAgJG1vc3RDb2xvciA9IGV4cGxvZGVMaXN0KCRtb3N0Q29sb3IpOwogICAgICAgIAogICAgICAgICRiZ0NvbG9yID0gYXJyYXkoInIiPT4kbW9zdENvbG9yWzBdLCAiZyI9PiRtb3N0Q29sb3JbMV0sICJiIj0+JG1vc3RDb2xvclsyXSwgImEiPT4kbW9zdENvbG9yWzNdKTsKCiAgICAgICAgcmV0dXJuKCRiZ0NvbG9yKTsKICAgIH0KfSAgCg==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSW1hZ2UvSW1hZ2VFZmZlY3QuY2xhc3MucGhwIC0tLS0tLS0gDQoNCmNsYXNzIFRJbWFnZUVmZmVjdCBleHRlbmRzIFRDb3JlT2JqZWN0DQp7DQogICAgcHVibGljIHN0YXRpYyAkbWFpblBhcmFtcyA9IGFycmF5KCk7DQoNCiAgICBmdW5jdGlvbiBvblByb2Nlc3MoJEltYWdlLCAkcGFyYW1zKQ0KICAgIHsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gX19jYWxsKCRuYW1lLCAkYXJndW1lbnRzKQ0KICAgIHsNCiAgICAgICAgLy8gZG8gbm90aGluZyBpZiBtZXRob2QgZG9lcyBub3QgZXhpc3QNCiAgICB9DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzUGFyYW1zKCRMYXllciwgJHBhcmFtcykNCiAgICB7DQogICAgfQ0KICAgIA0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZml4UGFyYW1zKCRwYXJhbXMsICRwcmVmaXgpDQogICAgew0KICAgICAgICAkX3BhcmFtcyA9IGFycmF5KCk7DQoNCiAgICAgICAgZm9yZWFjaCgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoc3RycG9zKCRrZXksICRwcmVmaXgpID09PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRrZXkgPSBzdWJzdHIoJGtleSwgc3RybGVuKCRwcmVmaXgpLCAxMDAwKTsNCiAgICAgICAgICAgICAgICAka2V5WzBdID0gc3RydG9sb3dlcigka2V5WzBdKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkX3BhcmFtc1ska2V5XSA9ICR2YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKCRfcGFyYW1zKQ0KICAgICAgICAgICAgcmV0dXJuKCRfcGFyYW1zKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuKCRwYXJhbXMpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TW9kaWZ5UGFyYW1zKCRwYXJhbXMpDQogICAgew0KICAgIA0KICAgICAgICByZXR1cm4oJHBhcmFtcyk7DQogICAgfQ0KfSAgDQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvSW1hZ2UvZWZmZWN0cy9JbWFnZVJlc2l6ZS5jbGFzcy5waHAgLS0tLS0tLSANCgpjbGFzcyBUSW1hZ2VSZXNpemUgZXh0ZW5kcyBUSW1hZ2VFZmZlY3QKewogICAgcHVibGljIHN0YXRpYyAkbWFpblBhcmFtcyA9IGFycmF5KCJ3aWR0aCIsICJoZWlnaHQiLCAiY3JvcFdpZHRoIiwgImNyb3BIZWlnaHQiLCAicmVzaXplV2lkdGgiLCAicmVzaXplSGVpZ2h0Iik7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvbkdldFByb3BlcnRpZXMoKQogICAgewogICAgICAgIHJldHVybihhcnJheSggICAgICAgIAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249UmVzaXplIiwKICAgICAgICAibmFtZT13aWR0aCxjYXB0aW9uPVdpZHRoLG9iamVjdD1UZXh0RWRpdCxwb3N0Zml4PXB4fG1tIiwKICAgICAgICAibmFtZT1oZWlnaHQsY2FwdGlvbj1IZWlnaHQsb2JqZWN0PVRleHRFZGl0LHBvc3RmaXg9cHh8bW0iLAogICAgICAgICJuYW1lPXJlc2l6ZU1ldGhvZCxjYXB0aW9uPU1ldGhvZCxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXNjYWxlfHN0cmV0Y2h8Y3JvcHxjb250YWluIiwgCiAgICAgICAgIm5hbWU9cmVzaXplU21hbGwsY2FwdGlvbj1SZXNpemUgU21hbGwgSW1hZ2VzLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJuYW1lPWRwaSxjYXB0aW9uPURQSSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXw3MnwxNTB8MzAwIiwKICAgICAgICAibmFtZT1jcm9wUG9zaXRpb24sY2FwdGlvbj1Dcm9wIFBvc2l0aW9uLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fGxlZnQtdG9wfGNlbnRlci10b3B8cmlnaHQtdG9wfGxlZnQtY2VudGVyfGNlbnRlci1jZW50ZXJ8cmlnaHQtY2VudGVyfGxlZnQtYm90dG9tfGNlbnRlci1ib3R0b218cmlnaHQtYm90dG9tIiwKICAgICAgICApKTsgICAgICAgIAogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzc1BhcmFtcygkTGF5ZXIsICRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKCFpc3NldCgkcGFyYW1zWyJyZXNpemVTbWFsbCJdKSkKICAgICAgICAgICAgJHBhcmFtc1sicmVzaXplU21hbGwiXSA9IGZhbHNlOwogICAgICAgIAogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvLyBmaXJzdCBjcm9wCiAgICAgICAgaWYgKCRwYXJhbXNbImNyb3BXaWR0aCJdICYmICRwYXJhbXNbImNyb3BIZWlnaHQiXSkgLy8gZG8gbm90IGNoZWNrIGNyb3BYIGFuZCBjcm9wWSAtIG1heSBiZSB6ZXJvIQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICAgICAvL2R1bXAoIjEiKTsKICAgICAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgICAgICAkY3JvcFggPSBleHRyYWN0SW50KCRwYXJhbXNbImNyb3BYIl0pOwogICAgICAgICAgICAkY3JvcFkgPSBleHRyYWN0SW50KCRwYXJhbXNbImNyb3BZIl0pOwogICAgICAgICAgICAkY3JvcFcgPSBleHRyYWN0SW50KCRwYXJhbXNbImNyb3BXaWR0aCJdKTsKICAgICAgICAgICAgJGNyb3BIID0gZXh0cmFjdEludCgkcGFyYW1zWyJjcm9wSGVpZ2h0Il0pOwogICAgICAgICAgICAKICAgICAgICAgICAgVEltYWdlUmVzaXplOjpfcmVzaXplKCRMYXllciwgJGNyb3BXLCAkY3JvcEgsIDAsIDAsICRjcm9wWCwgJGNyb3BZLCAkY3JvcFcsICRjcm9wSCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyB0b3RvIGpzZW0gcG91emlsIHV6IG5ldmltIHByb2MsIGFsZSBwcmVzdGFsIHBvcmFkbmUgZnVuZ292YXQgQ3JvcEltYWdlRWRpdCwgdGFremUgc3ByYXZuZSBqZSBrb2QgbmFob3JlIC0gdml6IGh0dHA6Ly9jb3JlMi52aXN1YWwtcGhwLmNvbS9tYXJrZXQucGhwP2xhbmd1YWdlPWNzJnN0eWxlPW1hcmtldCZpZD04NWM4NjlhMC01MjgyLTRjNDctYTViNS0zNTdkMWY2MTk4MzEgCiAgICAgICAgICAgIC8vVEltYWdlUmVzaXplOjpfcmVzaXplKCRMYXllciwgJGNyb3BXLCAkY3JvcEgsIDAsIDAsICRjcm9wWCwgJGNyb3BZKTsKICAgICAgICB9CgogICAgICAgIC8vIHRoZW4gcmVzaXplCiAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zKTsKICAgICAgICBpZiAoJHBhcmFtc1sid2lkdGgiXSB8fCAkcGFyYW1zWyJoZWlnaHQiXSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiMiIpOwogICAgICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgIC8vZHVtcCgkcGFyYW1zWyJyZXNpemVTbWFsbCJdKTsKICAgICAgICAgICAgVEltYWdlUmVzaXplOjpyZXNpemUoJExheWVyLCAkcGFyYW1zWyJ3aWR0aCJdLCAkcGFyYW1zWyJoZWlnaHQiXSwgZmlyc3RfdmFsdWUoJHBhcmFtc1sicmVzaXplTWV0aG9kIl0sICRwYXJhbXNbInJlc2l6ZSJdKSwgJHBhcmFtc1sicmVzaXplU21hbGwiXSwgJHBhcmFtc1siY3JvcFBvc2l0aW9uIl0sICRwYXJhbXNbImRwaSJdKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzaXplKCRMYXllciwgJHJlc2l6ZVdpZHRoLCAkcmVzaXplSGVpZ2h0LCAkcmVzaXplTWV0aG9kPSJzY2FsZSIsICRlbmxhcmdlPXRydWUsICRjcm9wUG9zaXRpb249ImNlbnRlci1jZW50ZXIiLCAkZHBpPTApCiAgICB7CiAgICAgICAgCiAgICAgICAgaWYgKCEkcmVzaXplTWV0aG9kKQogICAgICAgICAgICAkcmVzaXplTWV0aG9kID0gInNjYWxlIjsKICAgICAgICAKICAgICAgICAvL2R1bXAoMik7CiAgICAgICAgLy9kdW1wKCRMYXllcik7CiAgICAgICAgLy92YXJfZHVtcCgkcmVzaXplV2lkdGgpOwogICAgICAgIC8vdmFyX2R1bXAoJHJlc2l6ZUhlaWdodCk7CiAgICAgICAgLy92YXJfZHVtcCgkcmVzaXplTWV0aG9kKTsKCiAgICAgICAgaWYgKCEkY3JvcFBvc2l0aW9uKQogICAgICAgICAgICAkY3JvcFBvc2l0aW9uID0gImNlbnRlci1jZW50ZXIiOwogICAgICAgIAogICAgICAgIGlmIChzdHJwb3MoJHJlc2l6ZVdpZHRoLCAiJSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXNpemVXaWR0aCA9ICRMYXllci0+d2lkdGgqKChpbnQpc3RyX3JlcGxhY2UoIiUiLCAiIiwgJHJlc2l6ZVdpZHRoKS8xMDApOwogICAgICAgIH0KICAgICAgICBpZiAoc3RycG9zKCRyZXNpemVIZWlnaHQsICIlIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgJHJlc2l6ZUhlaWdodCA9ICRMYXllci0+aGVpZ2h0KigoaW50KXN0cl9yZXBsYWNlKCIlIiwgIiIsICRyZXNpemVIZWlnaHQpLzEwMCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIDcyIGRwaSAuLi4gMQogICAgICAgIAogICAgICAgIC8vJGRwaVJhdGlvID0gMjsKICAgICAgICAKICAgICAgICAkaW1hZ2VXaWR0aCA9ICRMYXllci0+d2lkdGg7CiAgICAgICAgJGltYWdlSGVpZ2h0ID0gJExheWVyLT5oZWlnaHQ7CgogICAgICAgIC8vdmFyX2R1bXAoJHJlc2l6ZVdpZHRoKTsKICAgICAgICBpZiAoc3RycG9zKCRyZXNpemVXaWR0aCwgIm1tIikgIT09IEZBTFNFKQogICAgICAgIHsKICAgICAgICAgICAgJHJlc2l6ZVdpZHRoID0gKChpbnQpc3RyX3JlcGxhY2UoIm1tIiwgIiIsICRyZXNpemVXaWR0aCkqMy43Nzk1Mjc1NTkwNTUxMSk7CiAgICAgICAgICAgIC8vJGltYWdlV2lkdGggPSAkaW1hZ2VXaWR0aCozLjc3OTUyNzU1OTA1NTExOwogICAgICAgIH0KICAgICAgICBpZiAoc3RycG9zKCRyZXNpemVIZWlnaHQsICJtbSIpICE9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgICRyZXNpemVIZWlnaHQgPSAoKGludClzdHJfcmVwbGFjZSgibW0iLCAiIiwgJHJlc2l6ZUhlaWdodCkqMy43Nzk1Mjc1NTkwNTUxMSk7CiAgICAgICAgICAgIC8vJGltYWdlSGVpZ2h0ID0gJGltYWdlSGVpZ2h0KjMuNzc5NTI3NTU5MDU1MTE7CiAgICAgICAgfQoKICAgICAgICAvL3Zhcl9kdW1wKCRyZXNpemVXaWR0aCk7CiAgICAgICAgLy9leGl0OwogICAgICAgIAogICAgICAgIGlmICgkcmVzaXplV2lkdGggPT0gIioiIHx8ICRyZXNpemVXaWR0aCA9PSAiIikKICAgICAgICAgICAgJHJlc2l6ZVdpZHRoID0gMDsKICAgICAgICBpZiAoJHJlc2l6ZUhlaWdodCA9PSAiKiIgfHwgJHJlc2l6ZUhlaWdodCA9PSAiIikKICAgICAgICAgICAgJHJlc2l6ZUhlaWdodCA9IDA7CiAgICAgICAgCiAgICAgICAgaWYgKCRkcGkpCiAgICAgICAgewogICAgICAgICAgICAkcmVzaXplV2lkdGggPSAoJHJlc2l6ZVdpZHRoKiRkcGkvNzIpOwogICAgICAgICAgICAkcmVzaXplSGVpZ2h0ID0gKCRyZXNpemVIZWlnaHQqJGRwaS83Mik7CiAgICAgICAgfQoKICAgICAgICAvL2R1bXAoJHJlc2l6ZVdpZHRoKTsKICAgICAgICAvL2R1bXAoJHJlc2l6ZUhlaWdodCk7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCItIik7CiAgICAgICAgLy9kdW1wKCRyZXNpemVXaWR0aCk7CiAgICAgICAgLy9kdW1wKCRyZXNpemVIZWlnaHQpOwogICAgICAgICRyZXNpemVXaWR0aCA9IGV4dHJhY3RJbnQoJHJlc2l6ZVdpZHRoKTsKICAgICAgICAkcmVzaXplSGVpZ2h0ID0gZXh0cmFjdEludCgkcmVzaXplSGVpZ2h0KTsKICAgICAgICAKICAgICAgICBzZXR0eXBlKCRyZXNpemVXaWR0aCwgImludGVnZXIiKTsKICAgICAgICBzZXR0eXBlKCRyZXNpemVIZWlnaHQsICJpbnRlZ2VyIik7CiAgICAgICAgLy9kdW1wKCRyZXNpemVXaWR0aCk7CiAgICAgICAgLy9kdW1wKCRyZXNpemVIZWlnaHQpOwogICAgICAgIAogICAgICAgIGlmICgkcmVzaXplV2lkdGggPT0gMCB8fCAkcmVzaXplSGVpZ2h0ID09IDApCiAgICAgICAgICAgICRyZXNpemVNZXRob2QgPSAic2NhbGUiOwogICAgICAgIGlmICghJHJlc2l6ZU1ldGhvZCkKICAgICAgICAgICAgJHJlc2l6ZU1ldGhvZCA9ICJzY2FsZSI7CgogICAgICAgIGlmICgkcmVzaXplTWV0aG9kID09ICJzdHJldGNoIikKICAgICAgICB7CiAgICAgICAgICAgIFRJbWFnZVJlc2l6ZTo6X3Jlc2l6ZSgkTGF5ZXIsICRyZXNpemVXaWR0aCwgJHJlc2l6ZUhlaWdodCwgMCwgMCwgMCwgMCwgJGltYWdlV2lkdGgsICRpbWFnZUhlaWdodCk7ICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgkcmVzaXplTWV0aG9kID09ICJzY2FsZSIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoJHJlc2l6ZVdpZHRoICE9PSAwICYmICRyZXNpemVIZWlnaHQgIT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghJGVubGFyZ2UgJiYgJGltYWdlV2lkdGggPCAkcmVzaXplV2lkdGggJiYgJGltYWdlSGVpZ2h0IDwgJHJlc2l6ZUhlaWdodCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkd2lkdGggPSAkaW1hZ2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICAkaGVpZ2h0ID0gJGltYWdlSGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRpbWFnZUFzcGVjdFJhdGlvID0gJGltYWdlV2lkdGgvJGltYWdlSGVpZ2h0OwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGltYWdlV2lkdGgvJHJlc2l6ZVdpZHRoID49ICRpbWFnZUhlaWdodC8kcmVzaXplSGVpZ2h0KSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR3ID0gJHJlc2l6ZVdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAkaCA9IGZsb29yKCRyZXNpemVXaWR0aC8kaW1hZ2VBc3BlY3RSYXRpbyk7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGggPSAkcmVzaXplSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAkdyA9IGZsb29yKCRyZXNpemVIZWlnaHQqJGltYWdlQXNwZWN0UmF0aW8pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHdpZHRoID0gJHc7CiAgICAgICAgICAgICAgICAgICAgJGhlaWdodCA9ICRoOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIC8vZXhpdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL2R1bXAoJHdpZHRoKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgkaGVpZ2h0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gTkVaVkVUU1VKRSEhISEhCiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkZW5sYXJnZSk7CiAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVzaXplV2lkdGgpOwogICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlc2l6ZUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBUSW1hZ2VSZXNpemU6Ol9yZXNpemUoJExheWVyLCAkd2lkdGgsICRoZWlnaHQsIDAsIDAsIDAsIDAsICRpbWFnZVdpZHRoLCAkaW1hZ2VIZWlnaHQpOyAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGltYWdlQXNwZWN0UmF0aW8gPSAkaW1hZ2VXaWR0aC8kaW1hZ2VIZWlnaHQ7CiAgICAgICAgICAgICAgICBpZiAoJHJlc2l6ZUhlaWdodCA9PT0gMCAmJiAoJGVubGFyZ2UgfHwgJGltYWdlV2lkdGggPiAkcmVzaXplV2lkdGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR3aWR0aCA9ICRyZXNpemVXaWR0aDsKICAgICAgICAgICAgICAgICAgICAkaGVpZ2h0ID0gZmxvb3IoJHJlc2l6ZVdpZHRoLyRpbWFnZUFzcGVjdFJhdGlvKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBUSW1hZ2VSZXNpemU6Ol9yZXNpemUoJExheWVyLCAkd2lkdGgsICRoZWlnaHQsIDAsIDAsIDAsIDAsICRpbWFnZVdpZHRoLCAkaW1hZ2VIZWlnaHQpOyAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoJHJlc2l6ZVdpZHRoID09PSAwICYmICgkZW5sYXJnZSB8fCAkaW1hZ2VIZWlnaHQgPiAkcmVzaXplSGVpZ2h0KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkd2lkdGggPSBmbG9vcigkcmVzaXplSGVpZ2h0KiRpbWFnZUFzcGVjdFJhdGlvKTsKICAgICAgICAgICAgICAgICAgICAkaGVpZ2h0ID0gJHJlc2l6ZUhlaWdodDsKCiAgICAgICAgICAgICAgICAgICAgVEltYWdlUmVzaXplOjpfcmVzaXplKCRMYXllciwgJHdpZHRoLCAkaGVpZ2h0LCAwLCAwLCAwLCAwLCAkaW1hZ2VXaWR0aCwgJGltYWdlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJHJlc2l6ZU1ldGhvZCA9PSAiY3JvcCIpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoJHJlc2l6ZVdpZHRoKTsKICAgICAgICAgICAgLy9kdW1wKCRyZXNpemVIZWlnaHQpOwogICAgICAgICAgICAvL2R1bXAoJGVubGFyZ2UpOwogICAgICAgICAgICBpZiAoISRlbmxhcmdlICYmICRpbWFnZVdpZHRoIDwgJHJlc2l6ZVdpZHRoICYmICRpbWFnZUhlaWdodCA8ICRyZXNpemVIZWlnaHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpbWFnZUFzcGVjdFJhdGlvID0gJGltYWdlV2lkdGgvJGltYWdlSGVpZ2h0OwoKICAgICAgICAgICAgICAgICR3aWR0aCA9ICRyZXNpemVXaWR0aDsKICAgICAgICAgICAgICAgICRoZWlnaHQgPSAkcmVzaXplSGVpZ2h0OwogICAgICAgICAgICAgICAgaWYgKCEkd2lkdGgpCiAgICAgICAgICAgICAgICAgICAgJHdpZHRoID0gJGltYWdlV2lkdGg7CiAgICAgICAgICAgICAgICBpZiAoISRoZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgJGhlaWdodCA9ICRpbWFnZUhlaWdodDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRpbWFnZVdpZHRoLyR3aWR0aCA+PSAkaW1hZ2VIZWlnaHQvJGhlaWdodCkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHcgPSBmbG9vcigkaGVpZ2h0ICogJGltYWdlQXNwZWN0UmF0aW8pOwogICAgICAgICAgICAgICAgICAgICRoID0gJGhlaWdodDsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR3ID0gJHdpZHRoOwogICAgICAgICAgICAgICAgICAgICRoID0gZmxvb3IoJHdpZHRoIC8gJGltYWdlQXNwZWN0UmF0aW8pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vZHVtcCgkTGF5ZXIpOwogICAgICAgICAgICAgICAgLy9kdW1wKCRoKTsKICAgICAgICAgICAgICAgIFRJbWFnZVJlc2l6ZTo6X3Jlc2l6ZSgkTGF5ZXIsICR3LCAkaCk7ICAgCiAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKCRMYXllcik7CiAgICAgICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgICAgICAvLyRMYXllci0+b3V0cHV0KCJwbmciKTsKCiAgICAgICAgICAgICAgICAkcG9zID0gZXhwbG9kZSgiLSIsICRjcm9wUG9zaXRpb24pOwoKICAgICAgICAgICAgICAgIGlmICgkcG9zWzBdID09ICJsZWZ0IikKICAgICAgICAgICAgICAgICAgICAkeCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoJHBvc1swXSA9PSAiY2VudGVyIikKICAgICAgICAgICAgICAgICAgICAkeCA9ICR3LzItJHdpZHRoLzI7CiAgICAgICAgICAgICAgICBpZiAoJHBvc1swXSA9PSAicmlnaHQiKQogICAgICAgICAgICAgICAgICAgICR4ID0gJGgtJHdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJHBvc1sxXSA9PSAidG9wIikKICAgICAgICAgICAgICAgICAgICAkeSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoJHBvc1sxXSA9PSAiY2VudGVyIikKICAgICAgICAgICAgICAgICAgICAkeSA9ICRoLzItJGhlaWdodC8yOwogICAgICAgICAgICAgICAgaWYgKCRwb3NbMV0gPT0gImJvdHRvbSIpCiAgICAgICAgICAgICAgICAgICAgJHkgPSAkaC0kaGVpZ2h0OwoKICAgICAgICAgICAgICAgIGlmICgkd2lkdGggPD0gMSkgICAgCiAgICAgICAgICAgICAgICAgICAgJHdpZHRoID0gMTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICgkaGVpZ2h0IDw9IDEpICAgIAogICAgICAgICAgICAgICAgICAgICRoZWlnaHQgPSAxOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgVEltYWdlUmVzaXplOjpfcmVzaXplKCRMYXllciwgJHdpZHRoLCAkaGVpZ2h0LCAwLCAwLCAkeCwgJHksICR3aWR0aCwgJGhlaWdodCk7ICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRyZXNpemVNZXRob2QgPT0gImNvbnRhaW4iKQogICAgICAgIHsKICAgICAgICAgICAgJGltYWdlQXNwZWN0UmF0aW8gPSAkaW1hZ2VXaWR0aC8kaW1hZ2VIZWlnaHQ7CgogICAgICAgICAgICBpZiAoJGltYWdlV2lkdGgvJHJlc2l6ZVdpZHRoID49ICRpbWFnZUhlaWdodC8kcmVzaXplSGVpZ2h0KSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHcgPSAkcmVzaXplV2lkdGg7CiAgICAgICAgICAgICAgICAkaCA9IGZsb29yKCRyZXNpemVXaWR0aC8kaW1hZ2VBc3BlY3RSYXRpbyk7CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRoID0gJHJlc2l6ZUhlaWdodDsKICAgICAgICAgICAgICAgICR3ID0gZmxvb3IoJHJlc2l6ZUhlaWdodCokaW1hZ2VBc3BlY3RSYXRpbyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR3aWR0aCA9ICR3OwogICAgICAgICAgICAkaGVpZ2h0ID0gJGg7CiAgICAgICAgICAgIAogICAgICAgICAgICBUSW1hZ2VSZXNpemU6Ol9yZXNpemUoJExheWVyLCAkd2lkdGgsICRoZWlnaHQsIDAsIDAsIDAsIDAsICRpbWFnZVdpZHRoLCAkaW1hZ2VIZWlnaHQpOyAgIAogICAgICAgICAgICAKICAgICAgICAgICAgJHggPSBmbG9vcigkcmVzaXplV2lkdGgvMiAtICR3aWR0aC8yKTsKICAgICAgICAgICAgJHkgPSBmbG9vcigkcmVzaXplSGVpZ2h0LzIgLSAkaGVpZ2h0LzIpOwogICAgICAgICAgICAKICAgICAgICAgICAgVEltYWdlUmVzaXplOjpfcmVzaXplKCRMYXllciwgJHJlc2l6ZVdpZHRoLCAkcmVzaXplSGVpZ2h0LCAkeCwgJHksIDAsIDAsIC0xLCAtMSk7ICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfcmVzaXplKCRMYXllciwgJHdpZHRoLCAkaGVpZ2h0LCAkZHN0WD0wLCAkZHN0WT0wLCAkc3JjWD0wLCAkc3JjWT0wLCAkc3JjVz0wLCAkc3JjSD0wKQogICAgewogICAgICAgIGlmICgkc3JjVyA9PSAwKQogICAgICAgICAgICAkc3JjVyA9ICRMYXllci0+d2lkdGg7CiAgICAgICAgaWYgKCRzcmNIID09IDApCiAgICAgICAgICAgICRzcmNIID0gJExheWVyLT5oZWlnaHQ7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCRkc3RYLiIgIi4kZHN0WS4iICIuJHNyY1guIiAiLiRzcmNZLiIgIi4kd2lkdGguIiAiLiRoZWlnaHQuIiAiLiRzcmNXLiIgIi4kc3JjSCk7CiAgICAgICAgLy9lY2hvICR3aWR0aC4iICIuJGhlaWdodC4iICIuJGRzdFguIiAiLiRkc3RZLiIgIi4kc3JjWC4iICIuJHNyY1kuIiAiLiRzcmNXLiIgIi4kc3JjSDsKICAgICAgICAvL2V4aXQ7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCR3aWR0aCk7CiAgICAgICAgLy9kdW1wKCRoZWlnaHQpOwogICAgICAgIHNldHR5cGUoJHdpZHRoLCAiaW50ZWdlciIpOwogICAgICAgIHNldHR5cGUoJGhlaWdodCwgImludGVnZXIiKTsKICAgICAgICBzZXR0eXBlKCRkc3RYLCAiaW50ZWdlciIpOwogICAgICAgIHNldHR5cGUoJGRzdFksICJpbnRlZ2VyIik7CiAgICAgICAgc2V0dHlwZSgkc3JjWCwgImludGVnZXIiKTsKICAgICAgICBzZXR0eXBlKCRzcmNZLCAiaW50ZWdlciIpOwogICAgICAgIHNldHR5cGUoJHNyY1csICJpbnRlZ2VyIik7CiAgICAgICAgc2V0dHlwZSgkc3JjSCwgImludGVnZXIiKTsKICAgICAgICAKICAgICAgICBpZiAoJHdpZHRoID4gMCAmJiAkaGVpZ2h0ID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChUSW1hZ2U6OmNoZWNrTWVtb3J5VXNhZ2UoJHdpZHRoLCAkaGVpZ2h0LCAkTGF5ZXItPnR5cGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2goJExheWVyLT50eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgInBuZyI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAid2VicCI6CiAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZSA9IGltYWdlY3JlYXRldHJ1ZWNvbG9yKCR3aWR0aCwgJGhlaWdodCk7IAogICAgICAgICAgICAgICAgICAgICAgICBpbWFnZWFscGhhYmxlbmRpbmcoJGltYWdlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlc2F2ZWFscGhhKCRpbWFnZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0cmFuc3BhcmVudCA9IGltYWdlY29sb3JhbGxvY2F0ZWFscGhhKCRpbWFnZSwgMjU1LCAyNTUsIDI1NSwgMTI3KTsKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VmaWxsZWRyZWN0YW5nbGUoJGltYWdlLCAwLCAwLCAkd2lkdGgsICRoZWlnaHQsICR0cmFuc3BhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkc3JjVyA+IDAgJiYgJHNyY0ggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vjb3B5cmVzYW1wbGVkKCRpbWFnZSwgJExheWVyLT5pbWFnZSwgJGRzdFgsICRkc3RZLCAkc3JjWCwgJHNyY1ksICR3aWR0aCwgJGhlaWdodCwgJHNyY1csICRzcmNIKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vjb3B5KCRpbWFnZSwgJExheWVyLT5pbWFnZSwgJGRzdFgsICRkc3RZLCAkc3JjWCwgJHNyY1ksICRMYXllci0+d2lkdGgsICRMYXllci0+aGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXllci0+d2lkdGggPSAkd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXllci0+aGVpZ2h0ID0gJGhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VkZXN0cm95KCRMYXllci0+aW1hZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAkTGF5ZXItPmltYWdlID0gJGltYWdlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJqcGciOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImpwZWciOgogICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9kdW1wKGdldE1lbW9yeVVzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2UgPSBpbWFnZWNyZWF0ZXRydWVjb2xvcigkd2lkdGgsICRoZWlnaHQpOyAKICAgICAgICAgICAgICAgICAgICAgICAgJGJhY2tncm91bmQgPSBpbWFnZWNvbG9yYWxsb2NhdGUoJGltYWdlLCAyNTUsIDI1NSwgMjU1KTsKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VmaWxsZWRyZWN0YW5nbGUoJGltYWdlLCAwLCAwLCAkd2lkdGgsICRoZWlnaHQsICRiYWNrZ3JvdW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcmNXID4gMCAmJiAkc3JjSCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZWNvcHlyZXNhbXBsZWQoJGltYWdlLCAkTGF5ZXItPmltYWdlLCAkZHN0WCwgJGRzdFksICRzcmNYLCAkc3JjWSwgJHdpZHRoLCAkaGVpZ2h0LCAkc3JjVywgJHNyY0gpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZWNvcHkoJGltYWdlLCAkTGF5ZXItPmltYWdlLCAkZHN0WCwgJGRzdFksICRzcmNYLCAkc3JjWSwgJExheWVyLT53aWR0aCwgJExheWVyLT5oZWlnaHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJExheWVyLT53aWR0aCA9ICR3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgJExheWVyLT5oZWlnaHQgPSAkaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBpbWFnZWRlc3Ryb3koJExheWVyLT5pbWFnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXllci0+aW1hZ2UgPSAkaW1hZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgImdpZiI6CiAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZSA9IGltYWdlY3JlYXRldHJ1ZWNvbG9yKCR3aWR0aCwgJGhlaWdodCk7IAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNyY1cgPiAwICYmICRzcmNIID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlY29weXJlc2FtcGxlZCgkaW1hZ2UsICRMYXllci0+aW1hZ2UsICRkc3RYLCAkZHN0WSwgJHNyY1gsICRzcmNZLCAkd2lkdGgsICRoZWlnaHQsICRzcmNXLCAkc3JjSCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlY29weSgkaW1hZ2UsICRMYXllci0+aW1hZ2UsICRkc3RYLCAkZHN0WSwgJHNyY1gsICRzcmNZLCAkTGF5ZXItPndpZHRoLCAkTGF5ZXItPmhlaWdodCk7CgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5ZXItPndpZHRoID0gJHdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAkTGF5ZXItPmhlaWdodCA9ICRoZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlZGVzdHJveSgkTGF5ZXItPmltYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJExheWVyLT5pbWFnZSA9ICRpbWFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgJExheWVyLT5lcnJvcnNbXSA9ICJJbnN1ZmZpY2llbnQgbWVtb3J5IjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBzaG93TWVzc2FnZSgiVEltYWdlUmVzaXplOjpfcmVzaXplKCkgLSBpbnZhbGlkIGRpbWVuc2lvbnMiKTsKICAgIH0KfSAgCgo=ZnVuY3Rpb24gVExvYWRpbmdBbmltYXRpb24oKQp7CiAgICB0aGlzLmlkID0gIkxvYWRpbmdBbmltYXRpb24iOwogICAgCiAgICBhZGRPYmplY3QodGhpcyk7CiAgICAKICAgIHRoaXMuX2NyZWF0ZSgpOwp9CgpleHRlbmRDbGFzcyhUTG9hZGluZ0FuaW1hdGlvbiwgVE9iamVjdCk7CgpUTG9hZGluZ0FuaW1hdGlvbi5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKQp7CiAgICAvKgogICAgdGhpcy5jb250YWluZXIgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGFkZENsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgIl9Mb2FkaW5nQW5pbWF0aW9uIik7CiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgCiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgYWRkRXZlbnQod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCl7YXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgX3RoaXMuY29udGFpbmVyKX0pOwogICAgKi8KICAgIAogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7Cn0KClRMb2FkaW5nQW5pbWF0aW9uLnByb3RvdHlwZS5fZ2V0RWxlbWVudCA9IGZ1bmN0aW9uKGVsZW0pCnsKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gInN0cmluZyIpCiAgICAgICAgZWxlbSA9IGdldEVsZW1lbnQoZWxlbSk7CiAgICAKICAgIGlmIChlbGVtLnRhZ05hbWUpCiAgICAgICAgcmV0dXJuKGVsZW0pOwogICAgZWxzZSAvLyBpcyBPYmplY3QKICAgICAgICByZXR1cm4oZWxlbS5jb250YWluZXIgPyBlbGVtLmNvbnRhaW5lciA6IGVsZW0uZWxlbWVudCk7Cn0KClRMb2FkaW5nQW5pbWF0aW9uLnByb3RvdHlwZS5fZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24oZWxlbSkKewogICAgaWYgKCFlbGVtLmxvYWRpbmdBbmltYXRpb25Db250YWluZXIpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGFkZENsYXNzTmFtZShjb250YWluZXIsICJfTG9hZGluZ0FuaW1hdGlvbiIpOwogICAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIHZhciBsYWJlbCA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGFkZENsYXNzTmFtZShsYWJlbCwgIl9Mb2FkaW5nQW5pbWF0aW9uTGFiZWwiKTsKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiZWwpOwogICAgICAgIAogICAgICAgIGVsZW0ubG9hZGluZ0FuaW1hdGlvbkNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgIH0KICAgIAogICAgcmV0dXJuKGVsZW0ubG9hZGluZ0FuaW1hdGlvbkNvbnRhaW5lcik7Cn0KClRMb2FkaW5nQW5pbWF0aW9uLnByb3RvdHlwZS5fZ2V0TGFzdEVsZW1lbnQgPSBmdW5jdGlvbihlbGVtKQp7CiAgICBpZiAoZWxlbS50YWdOYW1lKQogICAgICAgIHJldHVybihlbGVtKTsKICAgIGVsc2UgLy8gaXMgT2JqZWN0CiAgICB7CiAgICAgICAgaWYgKGVsZW0uZWxlbWVudHMgJiYgZWxlbS5lbGVtZW50cy5sZW5ndGgpIC8vIE9iamVjdCBjb250YWluaW5nIG1vcmUgdGhhbiBvbmUgZWxlbWVudAogICAgICAgICAgICByZXR1cm4oZWxlbS5lbGVtZW50c1tlbGVtLmVsZW1lbnRzLmxlbmd0aC0xXSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oZWxlbS5jb250YWluZXIpOwogICAgfQp9CgpUTG9hZGluZ0FuaW1hdGlvbi5wcm90b3R5cGUuX3Jlc2l6ZSA9IGZ1bmN0aW9uKGVsZW0pCnsKICAgIHZhciBfZWxlbSA9IHRoaXMuX2dldEVsZW1lbnQoZWxlbSk7CiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZ2V0Q29udGFpbmVyKF9lbGVtKTsKICAgIHZhciBsYWJlbCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdOwoKICAgIC8vaWYgKGdldFN0eWxlKGVsZW0sICJkaXNwbGF5IikgPT0gImZsZXgiKQogICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAvL2Vsc2UKICAgIC8vICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgICAgICAgCiAgICBjb250YWluZXIuc3R5bGUudmVydGljYWxBbGlnbiA9IGdldFN0eWxlKGVsZW0sICJ2ZXJ0aWNhbC1hbGlnbiIpOwogICAgY29udGFpbmVyLnN0eWxlLmxpbmVIZWlnaHQgPSBlbGVtLm9mZnNldEhlaWdodCsicHgiOwogICAgbGFiZWwuc3R5bGUubGluZUhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0KyJweCI7CgogICAgaWYgKGVsZW0ucGFyZW50Tm9kZSAmJiAoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAiZGlzcGxheSIpICE9ICJmbGV4IiB8fCBnZXRTdHlsZShlbGVtLnBhcmVudE5vZGUsICJmbGV4LWRpcmVjdGlvbiIpICE9ICJyb3ciKSkKICAgIHsKICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCAiZGlzcGxheSIpICE9ICJmbGV4IikKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1hcmdpblRvcCA9ICItIitlbGVtLm9mZnNldEhlaWdodCsicHgiOwogICAgfQogICAgZWxzZQogICAgICAgIGNvbnRhaW5lci5zdHlsZS5tYXJnaW5MZWZ0ID0gIi0iK2VsZW0ub2Zmc2V0V2lkdGgrInB4IjsKCiAgICBzZXRTdHlsZShjb250YWluZXIsICJvdXRlcldpZHRoIiwgZWxlbS5vZmZzZXRXaWR0aCk7CiAgICBzZXRTdHlsZShjb250YWluZXIsICJvdXRlckhlaWdodCIsIGVsZW0ub2Zmc2V0SGVpZ2h0KTsKICAgIAogICAgLy9kdW1wKGNvbnRhaW5lcik7Cn0KICAgIApUTG9hZGluZ0FuaW1hdGlvbi5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGVsZW0sIGxhYmVsLCBfaW5zZXJ0QWZ0ZXIpCnsKICAgIGlmICh0eXBlb2YobGFiZWwpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGxhYmVsID0gIiI7CgogICAgaWYgKHR5cGVvZihlbGVtKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBlbGVtID0gZG9jdW1lbnQuYm9keTsKICAgIAogICAgc2V0Q3Vyc29yKCJ3YWl0Iik7CiAgICAKICAgIC8vdGhpcy5sYXN0RWxlbWVudCA9IGVsZW07CiAgICB2YXIgX2VsZW0gPSB0aGlzLl9nZXRFbGVtZW50KGVsZW0pOwogICAgdGhpcy5sYXN0RWxlbSA9IGVsZW07CiAgICBpZiAodHlwZW9mKF9pbnNlcnRBZnRlcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgX2luc2VydEFmdGVyID0gX2VsZW07CgogICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2dldENvbnRhaW5lcihfZWxlbSk7CiAgICBjb250YWluZXIuY2hpbGROb2Rlc1swXS5pbm5lckhUTUwgPSBsYWJlbDsKICAgIGluc2VydEFmdGVyKF9pbnNlcnRBZnRlciwgY29udGFpbmVyKTsKICAgIAogICAgaWYgKGVsZW0gPT0gZG9jdW1lbnQuYm9keSkKICAgIHsKICAgICAgICBhZGRDbGFzc05hbWUoY29udGFpbmVyLCAiX0xvYWRpbmdBbmltYXRpb25Cb2R5Iik7CiAgICB9CiAgICAKICAgIGlmICghX2VsZW0uX19sb2FkaW5nQW5pbWF0aW9uUmVzaXplRXZlbnQgJiYgKGhhc0NsYXNzTmFtZShfZWxlbSwgImF1dG9zaXplIikgfHwgaGFzQ2xhc3NOYW1lKF9lbGVtLCAiYXV0b2ZpbGwiKSB8fCBoYXNDbGFzc05hbWUoX2VsZW0sICJhdXRvaGVpZ2h0IikgfHwgaGFzQ2xhc3NOYW1lKF9lbGVtLCAiYXV0b3dpZHRoIikpKQogICAgewogICAgICAgIC8vIGFkZCByZXNpemUgZXZlbnQKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGFkZEV2ZW50KF9lbGVtLCAicmVzaXplIiwgZnVuY3Rpb24oKXtfdGhpcy5fcmVzaXplKF9lbGVtKX0pOwogICAgICAgIF9lbGVtLl9fbG9hZGluZ0FuaW1hdGlvblJlc2l6ZUV2ZW50ID0gdHJ1ZTsKICAgIH0KICAgIAogICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIHRoaXMuX3Jlc2l6ZShfZWxlbSk7Cn0KClRMb2FkaW5nQW5pbWF0aW9uLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oZWxlbSkKewogICAgaWYgKHR5cGVvZihlbGVtKSA9PSAidW5kZWZpbmVkIikKICAgIHsKICAgICAgICBpZiAodGhpcy5sYXN0RWxlbSkKICAgICAgICAgICAgZWxlbSA9IHRoaXMubGFzdEVsZW07CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuYm9keTsKICAgIH0KICAgIHRoaXMubGFzdEVsZW0gPSBudWxsOyAgICAKICAgIHNldEN1cnNvcigiIik7CgogICAgdmFyIF9lbGVtID0gdGhpcy5fZ2V0RWxlbWVudChlbGVtKTsKICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9nZXRDb250YWluZXIoX2VsZW0pOwogICAgCiAgICAvLyBuZWVkIHRvIG1vdmUgYmFjayAob3V0IG9mIGRpYWxvZyksIG9yIHRoZSBvYmplY3Qgd2lsbCBiZSBkZWxldGVkIG9uIGRpYWxvZyBjbG9zZSAgICAKICAgIC8vYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgdGhpcy5jb250YWluZXIpOwogICAgCiAgICBpZiAoZWxlbSA9PSBkb2N1bWVudC5ib2R5KQogICAgewogICAgICAgIHJlbW92ZUNsYXNzTmFtZShjb250YWluZXIsICJfTG9hZGluZ0FuaW1hdGlvbkJvZHkiKTsKICAgIH0KICAgIAogICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Cn0KCmZ1bmN0aW9uIHNob3dMb2FkaW5nQW5pbWF0aW9uKGVsZW0sIGxhYmVsKQp7CiAgICAvL2R1bXAoJ3Nob3cnKTsKICAgIGdldE9iamVjdCgiTG9hZGluZ0FuaW1hdGlvbiIpLnNob3coZWxlbSwgbGFiZWwpOwp9CgpmdW5jdGlvbiBoaWRlTG9hZGluZ0FuaW1hdGlvbihlbGVtKQp7CiAgICAvL2R1bXAoJ2hpZGUnKTsKICAgIGdldE9iamVjdCgiTG9hZGluZ0FuaW1hdGlvbiIpLmhpZGUoZWxlbSk7Cn0KCmlmICghd2luZG93LkxvYWRpbmdBbmltYXRpb24pCiAgICBMb2FkaW5nQW5pbWF0aW9uID0gbmV3IFRMb2FkaW5nQW5pbWF0aW9uKCk7CgovL2R1bXBKU1RpbWUoIngxIik7Ll9Mb2FkaW5nQW5pbWF0aW9uIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOw0KICAgIG9wYWNpdHk6IDAuNzsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1pbWcvbG9hZGluZy5naWYpOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCg0KLl9Mb2FkaW5nQW5pbWF0aW9uTGFiZWwgew0KICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICBjb2xvcjogIzAwMDAwMDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgZGlzcGxheTogYmxvY2s7DQogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCiAgICBwYWRkaW5nLXRvcDogMnB4Ow0KfSANCg0KLl9Mb2FkaW5nQW5pbWF0aW9uQm9keSB7DQogICAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7DQogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsNCiAgICB0b3A6IDBweCAhaW1wb3J0YW50Ow0KICAgIGxlZnQ6IDBweCAhaW1wb3J0YW50Ow0KICAgIG1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7DQogICAgei1pbmRleDogMTAwMDAwMDAwMCAhaW1wb3J0YW50Ow0KfQ==Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvTG9hZGluZ0FuaW1hdGlvbi9Mb2FkaW5nQW5pbWF0aW9uLmNsYXNzLnBocCAtLS0tLS0tIA0KDQpjbGFzcyBUTG9hZGluZ0FuaW1hdGlvbiBleHRlbmRzIFRPYmplY3QNCnsNCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBvbkdldEhlYWRIdG1sKCRwYXJhbXM9YXJyYXkoKSkNCiAgICB7DQogICAgICAgIGlmICghaGVhZEh0bWxBZGRlZChfX0NMQVNTX18sICRwYXJhbXMpKQ0KICAgICAgICB7DQogICAgICAgICAgICBhZGRIZWFkSHRtbCgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naW5zdGFsbC5waHA/aW5jbHVkZT0vY29yZS9jbGFzc2VzL19uZXcvTG9hZGluZ0FuaW1hdGlvbi9Mb2FkaW5nQW5pbWF0aW9uLmNsYXNzLmpzJz48L3NjcmlwdD4iLHRydWUpOw0KICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxsaW5rIGhyZWY9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L0xvYWRpbmdBbmltYXRpb24vTG9hZGluZ0FuaW1hdGlvbi5jbGFzcy5jc3MnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIC8+Iix0cnVlKTsNCiAgICAgICAgICAgIGFkZEV4dGVuZGluZ0hlYWRIdG1sKCRwYXJhbXMsIF9fQ0xBU1NfXyk7DQogICAgICAgICAgICAvL3BhcmVudDo6Z2V0SGVhZEh0bWwoJHBhcmFtcyk7DQogICAgICAgIH0NCiAgICB9DQp9ZnVuY3Rpb24gVFRyZWUocGFyYW1zLCBpZCkgICAKewogICAgaWYgKCFpZCkKICAgICAgICBpZCA9IFVVSUQoKTsKICAgIAogICAgdGhpcy5USElTID0gdGhpczsKICAgIHRoaXMuaWQgPSBpZDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICAgCiAgICB0aGlzLmR1bXBEYXRhID0gZmFsc2U7CiAgICBhZGRPYmplY3QodGhpcyk7CiAgICB0aGlzLl9jcmVhdGUoKTsKfQoKZXh0ZW5kQ2xhc3MoVFRyZWUsIFRDb21wb25lbnQpOwoKVFRyZWUucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy50cmVlQ2xhc3MgPSBUVHJlZTsKICAgIHRoaXMudHJlZUl0ZW1DbGFzcyA9IFRUcmVlSXRlbTsKICAgIHRoaXMucmVkcmF3TGluZXNUaW1lciA9IG51bGw7CgogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgCiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJ1bnNlbGVjdCJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLnBhcmFtc1sidW5zZWxlY3QiXSA9IHRydWU7CiAgICAKICAgIC8vYWxlcnQoIlRUcmVlOjpjcmVhdGUiKTsKICAgIC8vYWxlcnQodGhpcy5wYXJlbnRfY3JlYXRlKCkpOwogICAgdGhpcy5jb250YWluZXIgPSBnZXRFbGVtZW50KHRoaXMucGFyYW1zWyJjb250YWluZXIiXSk7CiAgICAvL2R1bXAoIngiKTsKICAgIC8vZHVtcCh0aGlzLmNvbnRhaW5lcik7CgogICAgdGhpcy5wYXJlbnRfY3JlYXRlKCk7CiAgICAvL2FsZXJ0KCJwYXJlbnQ/Iik7CiAgICAKICAgIGlmICh0eXBlb2YodGhpcy5wYXJhbXNbInNvcnRCeSJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLnBhcmFtc1sic29ydEJ5Il0gPSAidmFsdWUiOwoKICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgLy9hbGVydChvdXRlckhUTUwodGhpcy5jb250YWluZXIpKTsKICAgIHRoaXMudmFsdWVFbGVtZW50ID0gZ2V0RWxlbWVudCh0aGlzLmlkKTsKCiAgICAvL2R1bXAodGhpcy5wYXJhbXMpOwogICAgLy9hbGVydCh0aGlzLmNvbnRhaW5lcik7CiAgICBhZGRDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJfVHJlZSIsIDApOwoKICAgIHRoaXMuVG9wSXRlbSA9IG5ldyB0aGlzLnRyZWVJdGVtQ2xhc3Moe30sICcnLCB0aGlzKTsKICAgIHRoaXMuY29udGFpbmVyLlRyZWVJdGVtID0gdGhpcy5Ub3BJdGVtOwogICAgCiAgICB0aGlzLmNyZWF0ZUZyb21IdG1sKHRoaXMuY29udGFpbmVyLCB0aGlzLlRvcEl0ZW0pOwoKICAgIHRoaXMucmVkcmF3TGluZXMoKTsKICAgIAogICAgdGhpcy5fc2VsZWN0SXRlbXMoKTsKICAgIAogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGFkZEV2ZW50KHRoaXMuY29udGFpbmVyLCAicmNsaWNrIiwgZnVuY3Rpb24oKXtfdGhpcy5vblJDbGljaygpfSk7CiAgICAKICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5wYXJhbXNbInZhbHVlIl0pCiAgICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gdGhpcy5wYXJhbXNbInZhbHVlIl07CiAgICAvL2R1bXAodGhpcy5lbGVtZW50LnZhbHVlKTsKICAgIC8vZHVtcCh0aGlzLmdldFZhbHVlKCkpOwogICAgLy9kdW1wKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICBpZiAodGhpcy5wYXJhbXNbImFqYXhMb2FkIl0gJiYgIXRoaXMubG9hZGVkICYmICF0aGlzLmZpcnN0TG9hZGVkKQogICAgewogICAgICAgIGlmICghdGhpcy5wYXJlbnRDcmVhdGVMb2FkRGlzYWJsZWQpCiAgICAgICAgICAgIHRoaXMubG9hZCh0aGlzLmdldFZhbHVlKCksIGZ1bmN0aW9uKCl7X3RoaXMuZmlyc3RMb2FkZWQgPSB0cnVlfSk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgdGhpcy5maXJzdExvYWRlZCA9IHRydWU7Cn0KClRUcmVlLnByb3RvdHlwZS5jcmVhdGVGcm9tSHRtbCA9IGZ1bmN0aW9uKHVsLCBQYXJlbnRJdGVtKQp7CiAgICB0aGlzLm9uQmVmb3JlQ3JlYXRlRnJvbUh0bWwodWwsIFBhcmVudEl0ZW0pOwoKICAgIC8vZHVtcCgiISIpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdWwuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGxpID0gdWwuY2hpbGROb2Rlc1tpXTsKICAgICAgICBpZiAobGkudGFnTmFtZSA9PSAiTEkiKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKCI/Iik7CiAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IG5ldyB0aGlzLnRyZWVJdGVtQ2xhc3Moeydjb250YWluZXInOmxpfSwgJycsIHRoaXMpOwogICAgICAgICAgICAvL2R1bXAoInYiKTsKICAgICAgICAgICAgLy9kdW1wKFRyZWVJdGVtLnZhbHVlKTsKICAgICAgICAgICAgVHJlZUl0ZW0uUGFyZW50SXRlbSA9IFBhcmVudEl0ZW07CiAgICAgICAgICAgIFBhcmVudEl0ZW0uaXRlbXMucHVzaChUcmVlSXRlbSk7CiAgICAgICAgICAgIHRoaXMuX2FkZEl0ZW0oVHJlZUl0ZW0pOwogICAgICAgIAogICAgICAgICAgICAvL2FsZXJ0KG91dGVySFRNTChsaSkpOwogICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGxpLmNoaWxkTm9kZXMubGVuZ3RoIDsgaWkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF91bCA9IGxpLmNoaWxkTm9kZXNbaWldOwogICAgICAgICAgICAgICAgaWYgKF91bC50YWdOYW1lID09ICJVTCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHJlZUl0ZW0uc3ViSXRlbXNDb250YWluZXIgPSBfdWw7CgogICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRnJvbUh0bWwoX3VsLCBUcmVlSXRlbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFUcmVlSXRlbS5leHBhbmRlZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUcmVlSXRlbS5zdWJJdGVtc0NvbnRhaW5lcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVJdGVtLnN1Ykl0ZW1zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICB0aGlzLmxvYWRlZCA9IChnZXRFbGVtZW50QnlUYWdOYW1lKCJsaSIsIHRoaXMuY29udGFpbmVyKSA/IHRydWUgOiBmYWxzZSk7CiAgICAvL2R1bXAodGhpcy5nZXRBbGxJdGVtcygpLmxlbmd0aCk7CiAgICAvL2R1bXAodGhpcy5sb2FkZWQpOwp9CgpUVHJlZS5wcm90b3R5cGUub25CZWZvcmVDcmVhdGVGcm9tSHRtbCA9IGZ1bmN0aW9uKHVsLCBQYXJlbnRJdGVtKQp7Cn0KClRUcmVlLnByb3RvdHlwZS5fYWRkSXRlbSA9IGZ1bmN0aW9uKFRyZWVJdGVtKQp7CiAgICAvL2R1bXAoVHJlZUl0ZW0uaWQpOwogICAgdGhpcy5pdGVtcy5wdXNoKFRyZWVJdGVtKTsKICAgIC8vZHVtcCgieCIpOwp9CgpUVHJlZS5wcm90b3R5cGUucmVkcmF3TGluZXMgPSBmdW5jdGlvbigpCnsKICAgIC8vZHVtcCh0aGlzLml0ZW1zLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICB0aGlzLml0ZW1zW2ldLmRyYXdMaW5lcyh0cnVlKTsKCiAgICAvKgogICAgaWYgKCF0aGlzLnJlZHJhd2luZExpbmVzKQogICAgewogICAgICAgIHRoaXMucmVkcmF3aW5kTGluZXMgPSB0cnVlOwogICAgICAgIAogICAgICAgIGR1bXAodGhpcy5pdGVtcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB0aGlzLml0ZW1zW2ldLmRyYXdMaW5lcyh0cnVlKTsKCiAgICAgICAgdGhpcy5yZWRyYXdpbmRMaW5lcyA9IGZhbHNlOwogICAgfQogICAgKi8KICAgIC8qCiAgICAKICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZHJhd0xpbmVzVGltZXIpOwogICAgCiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdGhpcy5yZWRyYXdMaW5lc1RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgIF90aGlzLl9yZWRyYXdMaW5lcygpOwogICAgfSwgMTApOwogICAgKi8KfQovKgpUVHJlZS5wcm90b3R5cGUuX3JlZHJhd0xpbmVzID0gZnVuY3Rpb24oKQp7CiAgICBkdW1wKHRoaXMuaXRlbXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHRoaXMuaXRlbXNbaV0uZHJhd0xpbmVzKHRydWUpOwp9CiovCgpUVHJlZS5wcm90b3R5cGUuX29uQ2hhbmdlID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIHRoaXMuX3NlbGVjdEl0ZW1zKCk7ICAgIAoKICAgIHRoaXMucGFyZW50X19vbkNoYW5nZSh2YWx1ZSk7Cn0KClRUcmVlLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQp7CiAgICB0aGlzLnBhcmVudF9zZXRWYWx1ZSh2YWx1ZSk7CiAgICAKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICB0aGlzLl9zZWxlY3RJdGVtcyh0cnVlKTsKfQoKVFRyZWUucHJvdG90eXBlLl9zZWxlY3RJdGVtcyA9IGZ1bmN0aW9uKGZvcmNlKQp7CiAgICBpZiAoIXRoaXMubG9hZGVkICYmICFmb3JjZSkKICAgICAgICByZXR1cm47CiAgICAKICAgIC8vZHVtcCgxKTsKICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgLy9kdW1wKHZhbHVlKTsKICAgIHZhciB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgifCIpOwogICAgaWYgKCF2YWx1ZXMubGVuZ3RoKQogICAgICAgIHZhbHVlcyA9IFsiIl07CgogICAgLy9kdW1wKHZhbHVlcyk7CiAgICBmb3IgKHZhciB2ID0gMCA7IHYgPCB2YWx1ZXMubGVuZ3RoIDsgdisrKSAgICAKICAgIHsKICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbdl07CiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRBbGxJdGVtcygpOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGl0ZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgICAgICBpZiAoVHJlZUl0ZW0uZ2V0VmFsdWUoKSA9PSB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIEl0ZW0gPSBUcmVlSXRlbS5QYXJlbnRJdGVtOwogICAgICAgICAgICAgICAgd2hpbGUoSXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBJdGVtLmV4cGFuZCgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgSXRlbSA9IEl0ZW0uUGFyZW50SXRlbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEFsbEl0ZW1zKCk7CiAgICAvL2R1bXAoaXRlbXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGl0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgVHJlZUl0ZW0gPSBpdGVtc1tpXTsKICAgICAgICBpZiAoIWluX2FycmF5KFRyZWVJdGVtLmdldFZhbHVlKCksIHZhbHVlcykpCiAgICAgICAgICAgIFRyZWVJdGVtLl91bnNlbGVjdCgpOwogICAgfQogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgIGlmIChpbl9hcnJheShUcmVlSXRlbS5nZXRWYWx1ZSgpLCB2YWx1ZXMpKQogICAgICAgICAgICBUcmVlSXRlbS5fc2VsZWN0KCk7CiAgICB9Cn0KClRUcmVlLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oSXRlbSkKewp9CgpUVHJlZS5wcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oKQp7CiAgICBpZiAodGhpcy5wYXJhbXNbIm11bHRpc2VsZWN0Il0pCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgVHJlZUl0ZW0gPSB0aGlzLml0ZW1zW2ldOwogICAgICAgICAgICAvL2R1bXAoVHJlZUl0ZW0uaWQpOwogICAgICAgICAgICBUcmVlSXRlbS5zZWxlY3QoKTsKICAgICAgICB9CiAgICB9CiAgICAvL2FsZXJ0KDEpOwp9CgpUVHJlZS5wcm90b3R5cGUudW5zZWxlY3RBbGwgPSBmdW5jdGlvbigpCnsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBUcmVlSXRlbSA9IHRoaXMuaXRlbXNbaV07CiAgICAgICAgVHJlZUl0ZW0udW5zZWxlY3QoKTsKICAgIH0KICAgIAogICAgdGhpcy5zZXRWYWx1ZSgiIik7Cn0KClRUcmVlLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24odmFsdWUsIGFzeW5jKQp7CiAgICAvL2R1bXAoIkwiKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICBpZiAodHJ1ZSB8fCAhdGhpcy5sb2FkaW5nKQogICAgewogICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMuZmlyc3RMb2FkZWQpCiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7CgogICAgICAgIHRoaXMuX2xvYWQodmFsdWUsIGFzeW5jKTsKICAgICAgICAvL3RoaXMuc2V0VmFsdWUodmFsdWUpOwogICAgfQogICAgZWxzZQogICAgICAgIHRocm93KCJUVHJlZTo6bG9hZCgpIC0gYWxyZWFkeSBsb2FkaW5nIik7Cn0KClRUcmVlLnByb3RvdHlwZS5fbG9hZCA9IGZ1bmN0aW9uKHZhbHVlLCBhc3luYykKewogICAgdmFyIF9vbGRWYWx1ZSA9ICh0aGlzLmZpcnN0TG9hZGVkID8gdGhpcy5nZXRWYWx1ZSgpIDogdmFsdWUpOyAvLyBmaXJzdCBsb2FkIGFqYXhDYWxsCiAgICBpZiAoIXRoaXMubG9hZFBhcmVudEl0ZW1Db250YWluZXIpCiAgICAgICAgdGhpcy5sb2FkUGFyZW50SXRlbUNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwogICAgCiAgICB2YXIgcGFyYW1zID0gY2xvbmUodGhpcy5wYXJhbXMpOwogICAgZGVsZXRlIHBhcmFtc1siX19wYXJhbXMiXTsKICAgIGlmICh0eXBlb2YodmFsdWUpID09ICJvYmplY3QiKQogICAgewogICAgICAgIGZvciAodmFyIGkgaW4gdmFsdWUpCiAgICAgICAgICAgIHBhcmFtc1tpXSA9IHZhbHVlW2ldOwogICAgfQogICAgcGFyYW1zWyJ2YWx1ZSJdID0gdmFsdWU7CiAgICAvL2RlbGV0ZShwYXJhbXNbIm1heExldmVsIl0pOwogICAgCiAgICAvLyBwcm9jPz8/CiAgICAvL3BhcmFtc1sibWF4TGV2ZWwiXSA9IDE7CiAgICAKICAgIC8vZHVtcCh0aGlzLnBhcmFtcyk7CiAgICAKICAgIGlmIChhc3luYykKICAgIHsKICAgICAgICAvL2R1bXAoJ3gxJyk7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBzaG93TG9hZGluZ0FuaW1hdGlvbih0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgdGhpcy5jYWxsUEhQTWV0aG9kKCJnZXRBSkFYQ29udGVudCIsIHBhcmFtcywgInJ0UmV0dXJuVmFsdWUiLCBmdW5jdGlvbihodG1sKXsKICAgICAgICAgICAgdmFyIGR1bW15ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBmaW5kaW5nIGVsZW1lbnRzIGJ5IGlkCiAgICAgICAgICAgIGR1bW15LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHVtbXkpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9kdW1wKGh0bWwpOwogICAgICAgICAgICBzZXRIdG1sKGR1bW15LCBodG1sKTsKICAgICAgICAgICAgdmFyIHVsID0gZ2V0RWxlbWVudEJ5VGFnTmFtZSgidWwiLCBkdW1teSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUZyb21IdG1sKHVsLCAoX3RoaXMubG9hZFBhcmVudEl0ZW0gPyBfdGhpcy5sb2FkUGFyZW50SXRlbSA6IF90aGlzLlRvcEl0ZW0pKTsKCiAgICAgICAgICAgICAgICB3aGlsZSh1bC5jaGlsZE5vZGVzLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAodWwuY2hpbGROb2Rlc1swXS5pbm5lckhUTUwpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmxvYWRQYXJlbnRJdGVtQ29udGFpbmVyLmFwcGVuZENoaWxkKHVsLmNoaWxkTm9kZXNbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoX3RoaXMucGFyYW1zWyJzb3J0Il0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcChfdGhpcy5wYXJhbXNbInNvcnRCeSJdKTsKICAgICAgICAgICAgICAgIF90aGlzLnNvcnQoX3RoaXMucGFyYW1zWyJzb3J0QnkiXSwgKF90aGlzLmxvYWRQYXJlbnRJdGVtID8gX3RoaXMubG9hZFBhcmVudEl0ZW0gOiBfdGhpcy5Ub3BJdGVtKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vX3RoaXMuY3JlYXRlRnJvbUh0bWwoX3RoaXMuY29udGFpbmVyLCBfdGhpcy5Ub3BJdGVtKTsKICAgICAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFBST0M/Pz8gdGltIHNpIHNtYXp1IHB1dm9kbmkgaG9kbm90eQogICAgICAgICAgICAvL190aGlzLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgLy9fdGhpcy5zZXRWYWx1ZShfb2xkVmFsdWUgfHwgdmFsdWUpOyAvLyBmaXJzdCBjYWxsIGlzIHdpdGggdmFsdWUsIG90aGVyIGlzIG9ubHkgbG9hZGVkIGFmdGVyIGV4cGFuZAogICAgICAgICAgICAvL2R1bXAoIlgiKTsgCiAgICAgICAgICAgIC8vZHVtcChfdGhpcy5maXJzdExvYWRlZCk7CiAgICAgICAgICAgIC8vZHVtcChfb2xkVmFsdWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gcG9kbWlua2Ega3Z1bGkgQ29tcGlsZVByb2plY3REaWFsb2csIGtkZSBjaGNpIG1pdCBvZHNrcnRudXRlIGEgbmF2aXMgc2UgdG8gcGFrIHZvbGEgeC1rcmF0CiAgICAgICAgICAgIC8vIG9iZWNuZSBhbmkgbmV2aW0sIHByb2MgdHUgdm9sYW0gc2V0VmFsdWUoKQogICAgICAgICAgICBpZiAoX29sZFZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZShfb2xkVmFsdWUpOyAvLyBmaXJzdCBjYWxsIGlzIHdpdGggdmFsdWUsIG90aGVyIGlzIG9ubHkgbG9hZGVkIGFmdGVyIGV4cGFuZAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBfdGhpcy5yZWRyYXdMaW5lcygpOwogICAgICAgICAgICAvL2R1bXAoMik7CiAgICAgICAgICAgIC8vaWYgKHZhbHVlLmluZGV4T2YoInwiKSA9PSAtMSkKICAgICAgICAgICAgLy8gICAgcmV0dXJuOwogICAgICAgICAgICBoaWRlTG9hZGluZ0FuaW1hdGlvbihfdGhpcy5jb250YWluZXIpOwogICAgICAgICAgICAvL2lmICh1bCkKICAgICAgICAgICAgLy8gICAgX3RoaXMuX3NlbGVjdEl0ZW1zKCk7IC8vIHZvbGFubyB2IHNldFZhbHVlKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBuZWRhdmF0LCBwb2t1ZCBqZW5vbSBleHBhbmR1anUgLSBwcmVzdW51dG8gZG8gbG9hZAogICAgICAgICAgICAvL190aGlzLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihhc3luYykgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGFzeW5jKTsKICAgICAgICAgICAgICAgIGFzeW5jKGh0bWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgIH0pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vZHVtcCgneDInKTsKICAgICAgICB2YXIgaHRtbCA9IHRoaXMuY2FsbFBIUE1ldGhvZCgiZ2V0QUpBWENvbnRlbnQiLCBwYXJhbXMsICJydFJldHVyblZhbHVlIik7CiAgICAgICAgCiAgICAgICAgdmFyIGR1bW15ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgLy8gdG8gZW5hYmxlIGZpbmRpbmcgZWxlbWVudHMgYnkgaWQKICAgICAgICBkdW1teS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHVtbXkpOwoKICAgICAgICBzZXRIdG1sKGR1bW15LCBodG1sKTsKCiAgICAgICAgdmFyIHVsID0gZ2V0RWxlbWVudEJ5VGFnTmFtZSgidWwiLCBkdW1teSk7CiAgICAgICAgd2hpbGUodWwuY2hpbGROb2Rlcy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmxvYWRQYXJlbnRJdGVtQ29udGFpbmVyLmFwcGVuZENoaWxkKHVsLmNoaWxkTm9kZXNbMF0pOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgLy90aGlzLmNyZWF0ZUZyb21IdG1sKHRoaXMuY29udGFpbmVyLCB0aGlzLlRvcEl0ZW0pOwogICAgICAgIHRoaXMuY3JlYXRlRnJvbUh0bWwodGhpcy5sb2FkUGFyZW50SXRlbUNvbnRhaW5lciwgdGhpcy5sb2FkUGFyZW50SXRlbUNvbnRhaW5lci5UcmVlSXRlbSk7CiAgICAgICAgdGhpcy5yZWRyYXdMaW5lcygpOwogICAgICAgIGhpZGVMb2FkaW5nQW5pbWF0aW9uKHRoaXMuY29udGFpbmVyKTsKICAgICAgICAKICAgICAgICAvL2R1bXAodmFsdWUpOwogICAgICAgIC8vdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgLy90aGlzLnNldFZhbHVlKF9vbGRWYWx1ZSB8fCB2YWx1ZSk7IC8vIGZpcnN0IGNhbGwgaXMgd2l0aCB2YWx1ZSwgb3RoZXIgaXMgb25seSBsb2FkZWQgYWZ0ZXIgZXhwYW5kCiAgICAgICAgdGhpcy5zZXRWYWx1ZShfb2xkVmFsdWUpOyAvLyBmaXJzdCBjYWxsIGlzIHdpdGggdmFsdWUsIG90aGVyIGlzIG9ubHkgbG9hZGVkIGFmdGVyIGV4cGFuZAoKICAgICAgICAvL3RoaXMuX3NlbGVjNHRJdGVtcygpOyAvLyB2b2xhbm8gdiBzZXRWYWx1ZSgpCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB9Cn0KClRUcmVlLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24ob3JkZXJCeSwgUGFyZW50SXRlbSkKewogICAgaWYgKHR5cGVvZihQYXJlbnRJdGVtKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBQYXJlbnRJdGVtID0gdGhpcy5Ub3BJdGVtOwogICAgaWYgKHR5cGVvZihvcmRlckJ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBvcmRlckJ5ID0gInZhbHVlIjsKICAgIGlmICh0eXBlb2Yob3JkZXJCeSkgPT0gInN0cmluZyIpCiAgICAgICAgb3JkZXJCeSA9IFtvcmRlckJ5XTsKICAgIAogICAgdmFyIF9vcmRlckJ5ID0gb3JkZXJCeTsKICAgIC8vZHVtcCh0aGlzLml0ZW1zKTsKICAgIC8vZHVtcChQYXJlbnRJdGVtLml0ZW1zKTsKICAgIFBhcmVudEl0ZW0uaXRlbXMuc29ydChmdW5jdGlvbihhLCBiKXsKICAgICAgICBmdW5jdGlvbiBfc29ydChhLCBiKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKF9vcmRlckJ5KTsKICAgICAgICAgICAgaWYgKGEuZGF0YSAmJiB0eXBlb2YoYS5kYXRhW19vcmRlckJ5WzBdXSkgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhRGF0YSA9IGEuZGF0YVtfb3JkZXJCeVswXV07CiAgICAgICAgICAgICAgICB2YXIgYkRhdGEgPSBiLmRhdGFbX29yZGVyQnlbMF1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFEYXRhID0gYVtfb3JkZXJCeVswXV07CiAgICAgICAgICAgICAgICB2YXIgYkRhdGEgPSBiW19vcmRlckJ5WzBdXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0eXBlb2YoYURhdGEpID09ICJzdHJpbmciIHx8IHR5cGVvZihiRGF0YSkgPT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFEYXRhID0gYURhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGJEYXRhID0gYkRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGFEYXRhID4gYkRhdGEpICAgIAogICAgICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICBpZiAoYURhdGEgPCBiRGF0YSkgICAgCiAgICAgICAgICAgICAgICByZXR1cm4oLTEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSBfb3JkZXJCeS5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKF9vcmRlckJ5Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICByZXQgPSBfc29ydChhLCBiKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXQgPSAwOwoKICAgICAgICAgICAgICAgIF9vcmRlckJ5LnVuc2hpZnQodmFsKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybihyZXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybihfc29ydChhLCBiKSk7CiAgICB9KTsKICAgIAogICAgdmFyIGNvbnRhaW5lciA9IChQYXJlbnRJdGVtID09IHRoaXMuVG9wSXRlbSA/IHRoaXMuY29udGFpbmVyIDogUGFyZW50SXRlbS5zdWJJdGVtc0NvbnRhaW5lcik7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBQYXJlbnRJdGVtLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoUGFyZW50SXRlbS5pdGVtc1tpXS5jb250YWluZXIpOwogICAgfQogICAgLy9kdW1wKHRoaXMuaXRlbXMpOwp9CgpUVHJlZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuX2NsZWFyKCk7CiAgICB0aGlzLnNldFZhbHVlKCIiKTsKfQoKVFRyZWUucHJvdG90eXBlLl9jbGVhciA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJhbXNbImJlZ2luIl0gPSAwOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy5Ub3BJdGVtLml0ZW1zID0gW107CiAgICB0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgIHRoaXMubG9hZFBhcmVudEl0ZW1Db250YWluZXIgPSBudWxsOwogICAgdGhpcy5sb2FkUGFyZW50SXRlbSA9IG51bGw7Cn0KClRUcmVlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihhc3luYykKewogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgdGhpcy5fY2xlYXIoKTsKICAgIHRoaXMucGFyYW1zWyJwYXJlbnQiXSA9ICJOVUxMIjsgLy8gVE9ETyAtIG9yIHJvb3QgZmlsdGVyCiAgICAvL3RoaXMucGFyYW1zWyJtYXhMZXZlbCJdID0gMTsKICAgIHRoaXMucGFyYW1zWyJ2YWx1ZSJdID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgLy9kdW1wKHRoaXMucGFyYW1zKTsKICAgIAogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHZhciBhc3luYzIgPSBmdW5jdGlvbigpewogICAgICAgIGlmICh0eXBlb2YoYXN5bmMpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIGFzeW5jKCk7CgogICAgICAgIC8vZHVtcCgiVHJlZS5yZWxvYWQiKTsKICAgICAgICAvL2R1bXAodmFsdWUpOwogICAgICAgIF90aGlzLnNldFZhbHVlKHZhbHVlKTsKICAgIH0KICAgIAogICAgdGhpcy5fbG9hZCh2YWx1ZSwgYXN5bmMyKTsKfQoKVFRyZWUucHJvdG90eXBlLmdldEFsbEl0ZW1zID0gZnVuY3Rpb24oUGFyZW50SXRlbSkKewogICAgaWYgKHR5cGVvZihQYXJlbnRJdGVtKSA9PSAidW5kZWZpbmVkIikKICAgICAgICByZXR1cm4odGhpcy5pdGVtcyk7CiAgICAgICAgCiAgICB2YXIgaXRlbXMgPSBbXTsKICAgIC8vaXRlbXMgPSBpdGVtcy5jb25jYXQoUGFyZW50SXRlbS5pdGVtcyk7CiAgICAvL2l0ZW1zID0gUGFyZW50SXRlbS5pdGVtczsKICAgIC8vZHVtcChQYXJlbnRJdGVtLnZhbHVlKTsKICAgIC8vZHVtcChQYXJlbnRJdGVtLml0ZW1zLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBQYXJlbnRJdGVtLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBpdGVtcy5wdXNoKFBhcmVudEl0ZW0uaXRlbXNbaV0pOwogICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHRoaXMuZ2V0QWxsSXRlbXMoUGFyZW50SXRlbS5pdGVtc1tpXSkpOwogICAgfQogICAgLy9kdW1wKGl0ZW1zLmxlbmd0aCk7CiAgICAKICAgIC8vaXRlbXMgPSBhcnJheV91bmlxdWUoaXRlbXMpOwogICAgCiAgICByZXR1cm4oaXRlbXMpOwp9CgpUVHJlZS5wcm90b3R5cGUuZ2V0SXRlbUJ5VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkKewogICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRBbGxJdGVtcygpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgIGlmIChUcmVlSXRlbS52YWx1ZSA9PSB2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuKFRyZWVJdGVtKTsKICAgIH0KICAgIAogICAgcmV0dXJuKG51bGwpOwp9CgpUVHJlZS5wcm90b3R5cGUuZ2V0SXRlbUJ5SWQgPSBmdW5jdGlvbihpZCkKewogICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRBbGxJdGVtcygpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgIGlmIChUcmVlSXRlbS5pZCA9PSBpZCkKICAgICAgICAgICAgcmV0dXJuKFRyZWVJdGVtKTsKICAgIH0KICAgIAogICAgcmV0dXJuKG51bGwpOwp9CgpUVHJlZS5wcm90b3R5cGUuZ2V0U2VsZWN0ZWRJdGVtcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHNpdGVtcyA9IFtdOwogICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRBbGxJdGVtcygpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgIGlmIChUcmVlSXRlbS5zZWxlY3RlZCkKICAgICAgICAgICAgc2l0ZW1zLnB1c2goVHJlZUl0ZW0pOwogICAgfQogICAgCiAgICByZXR1cm4oc2l0ZW1zKTsKfQoKVFRyZWUucHJvdG90eXBlLmdldFNlbGVjdGVkSXRlbSA9IGZ1bmN0aW9uKCkKewogICAgLy9kdW1wKCJ4Iik7CiAgICAvL2R1bXAodGhpcy5pdGVtcy5sZW5ndGgpOwogICAgdmFyIHNpdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgc2l0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICAvL2R1bXAoc2l0ZW1zW2ldLnZhbHVlKTsKICAgIH0KICAgIAogICAgcmV0dXJuKHNpdGVtc1swXSk7Cn0KClRUcmVlLnByb3RvdHlwZS5nZXRVbnNlbGVjdGVkSXRlbXMgPSBmdW5jdGlvbigpCnsKICAgIHZhciBzaXRlbXMgPSBbXTsKICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0QWxsSXRlbXMoKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGl0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgVHJlZUl0ZW0gPSBpdGVtc1tpXTsKICAgICAgICBpZiAoIVRyZWVJdGVtLnNlbGVjdGVkKQogICAgICAgICAgICBzaXRlbXMucHVzaChUcmVlSXRlbSk7CiAgICB9CiAgICAKICAgIHJldHVybihzaXRlbXMpOwp9CgpUVHJlZS5wcm90b3R5cGUuY29sbGFwc2VBbGwgPSBmdW5jdGlvbigpCnsKICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0QWxsSXRlbXMoKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGl0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgVHJlZUl0ZW0gPSBpdGVtc1tpXTsKICAgICAgICBUcmVlSXRlbS5jb2xsYXBzZSgpOwogICAgfQp9CgovKgpUVHJlZS5wcm90b3R5cGUudXBkYXRlVmFsdWVzID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgc2l0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7CiAgICB2YXIgdmFsdWUgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHNpdGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFsdWUucHVzaChzaXRlbXNbaV0udmFsdWUpOwogICAgfQogICAgCiAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB2YWx1ZS5qb2luKCJ8Iik7Cn0KKi8=ZnVuY3Rpb24gVFRyZWVJdGVtKHBhcmFtcywgaWQsIFRyZWUpICAgCnsKICAgIGlmICghaWQpCiAgICAgICAgaWQgPSBVVUlEKCk7CgogICAgdGhpcy5USElTID0gdGhpczsKICAgIHRoaXMuaWQgPSBpZDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICAgCiAgICB0aGlzLml0ZW1zID0gW107CiAgICB0aGlzLlBhcmVudEl0ZW0gPSBudWxsOwogICAgdGhpcy5UcmVlID0gVHJlZTsKICAgIHRoaXMubGlua0NvbnRhaW5lciA9IG51bGw7CgogICAgdGhpcy5kdW1wRGF0YSA9IGZhbHNlOwogICAgYWRkT2JqZWN0KHRoaXMpOwogICAgdGhpcy5fY3JlYXRlKCk7Cn0KCmV4dGVuZENsYXNzKFRUcmVlSXRlbSwgVE9iamVjdCk7CgpUVHJlZUl0ZW0ucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlOwogICAgdGhpcy5kYXRhID0ge307CiAgICB0aGlzLnZMaW5lTWFyZ2luID0gMTA7CiAgICAvL3RoaXMuUGFyZW50Q29tcG9uZW50ID0gdGhpcy5UcmVlOwogICAgCiAgICB0aGlzLmNvbnRhaW5lciA9IGdldEVsZW1lbnQodGhpcy5wYXJhbXNbImNvbnRhaW5lciJdKTsKICAgIC8vdGhpcy5kdW1wKHRoaXMucGFyYW1zWyJjb250YWluZXIiXSk7CiAgICAvL3RoaXMuZHVtcCh0aGlzLmNvbnRhaW5lcik7CiAgICBpZiAoIXRoaXMuY29udGFpbmVyKQogICAgewogICAgICAgIHRoaXMuY29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgibGkiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL2lmICh0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzWzBdICYmIHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXNbMF0udGFnTmFtZSA9PSAiQSIpCiAgICAgICAgLy8gICAgdGhpcy5saW5rQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIuY2hpbGROb2Rlc1swXTsKICAgIH0KICAgIHRoaXMuY29udGFpbmVyLlRyZWVJdGVtID0gdGhpczsKCiAgICBpZiAodHlwZW9mKHRoaXMucGFyYW1zWyJhdXRvY3JlYXRlIl0pID09ICJ1bmRlZmluZWQiIHx8IHRoaXMucGFyYW1zWyJhdXRvY3JlYXRlIl0pCiAgICB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udGFpbmVyLmdldEF0dHJpYnV0ZSgiX3ZhbHVlIik7CiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5jb250YWluZXIuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOwogICAgICAgIHRoaXMubGFiZWxFbGVtZW50ID0gZ2V0Q2hpbGRFbGVtZW50QnlUYWdOYW1lKCJhIiwgdGhpcy5jb250YWluZXIpOwogICAgICAgIGlmICh0aGlzLmxhYmVsRWxlbWVudCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmICghaGFzQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiZGlzYWJsZWQiKSkKICAgICAgICAgICAgICAgIGFkZEV2ZW50KHRoaXMubGFiZWxFbGVtZW50LCAiY2xpY2siLCBmdW5jdGlvbihlKXtfdGhpcy5fb25DbGljayhlKX0pOwogICAgICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy5sYWJlbEVsZW1lbnQuaW5uZXJIVE1MOwogICAgICAgICAgICBpZiAoIXRoaXMudGV4dCkKICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMubGFiZWw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoImRhdGEiKSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uZGVjb2RlKHRoaXMuY29udGFpbmVyLmdldEF0dHJpYnV0ZSgiZGF0YSIpKTsKICAgICAgICAgICAgLy9kdW1wKHRoaXMuZGF0YSk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRDaGlsZEVsZW1lbnRCeVRhZ05hbWUoImEiLCB0aGlzLmNvbnRhaW5lcikpIC8vIG5vdCByb290IGl0ZW0KICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBnZXRWYWx1ZXNJbkVsZW1lbnQoZ2V0Q2hpbGRFbGVtZW50QnlUYWdOYW1lKCJhIiwgdGhpcy5jb250YWluZXIpKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChKU09OLmlzSlNPTih2YWx1ZXNbaV0pKQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IEpTT04uZGVjb2RlKHZhbHVlc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeU5vZGVUeXBlKENPTU1FTlRfTk9ERSwgZ2V0Q2hpbGRFbGVtZW50QnlUYWdOYW1lKCJhIiwgdGhpcy5jb250YWluZXIpKTsKICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBlbGVtcy5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZWxlbXNbaWldLm5vZGVWYWx1ZS5pbmRleE9mKCJoaWRkZW46IikgPT0gMCkKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGVsZW1zW2lpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiwgZ2V0Q2hpbGRFbGVtZW50QnlUYWdOYW1lKCJhIiwgdGhpcy5jb250YWluZXIpKTsKICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBlbGVtcy5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShlbGVtc1tpaV0pOwoKICAgICAgICAgICAgaWYgKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHsiZGF0YSI6dGhpcy5kYXRhfTsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGFycmF5X21lcmdlKHRoaXMuZGF0YSwgdmFsdWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIGlmICh0aGlzLlRyZWUucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jaGVja0JveCA9IGdldEVsZW1lbnRCeVRhZ05hbWUoImlucHV0IiwgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGVja0JveCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGVja0JveC5pZCA9IFVVSUQoKTsKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmNoZWNrQm94LCAiX0NoZWNrQm94Iik7CiAgICAgICAgICAgICAgICB2YXIgX3BhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgX3BhcmFtc1sidmFsdWVzIl0gPSBbJ3RydWUnXTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLlRyZWUucGFyYW1zWyJjaGVja2VkQ2xhc3MiXSkKICAgICAgICAgICAgICAgICAgICBfcGFyYW1zWyJjaGVja2VkQ2xhc3MiXSA9IHRoaXMuVHJlZS5wYXJhbXNbImNoZWNrZWRDbGFzcyJdOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuVHJlZS5wYXJhbXNbInVuY2hlY2tlZENsYXNzIl0pCiAgICAgICAgICAgICAgICAgICAgX3BhcmFtc1sidW5jaGVja2VkQ2xhc3MiXSA9IHRoaXMuVHJlZS5wYXJhbXNbInVuY2hlY2tlZENsYXNzIl07CiAgICAgICAgICAgICAgICB0aGlzLkNoZWNrQm94ID0gbmV3IFRDaGVja0JveChfcGFyYW1zLCB0aGlzLmNoZWNrQm94LmlkKTsKICAgICAgICAgICAgICAgIHRoaXMuQ2hlY2tCb3guVHJlZUl0ZW0gPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuVHJlZS5wYXJhbXNbInNlbGVjdExlYXZlc09ubHkiXSAmJiBoYXNDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJleHBhbmRhYmxlIikgfHwgaGFzQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiZGlzYWJsZWQiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLkNoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAvL3RoaXMuQ2hlY2tCb3guc2V0VmFsdWUodGhpcy5jaGVja0JveC5jaGVja2VkKTsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICBhZGRFdmVudCh0aGlzLkNoZWNrQm94LmJ1dHRvbiwgImNsaWNrIiwgZnVuY3Rpb24oZSl7LypkdW1wKGUpOyovZSA9IGdldE1vdXNlRXZlbnQoZSk7IGUuc3RvcCgpOyAvKmUuc3RvcFByb3BhZ2F0aW9uKCk7Ki8gX3RoaXMuX3RvZ2dsZVZhbHVlKCk7fSk7CiAgICAgICAgICAgICAgICBhZGRFdmVudCh0aGlzLkNoZWNrQm94LmNoZWNrYm94LCAiY2xpY2siLCBmdW5jdGlvbihlKXsvKmR1bXAoZSk7Ki9lID0gZ2V0TW91c2VFdmVudChlKTsgZS5zdG9wKCk7IC8qZS5zdG9wUHJvcGFnYXRpb24oKTsqLyBfdGhpcy5fdG9nZ2xlVmFsdWUoKTt9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsRWxlbWVudCkKICAgICAgICAgICAgICAgICAgICBhZGRFdmVudCh0aGlzLmxhYmVsRWxlbWVudCwgImNsaWNrIiwgZnVuY3Rpb24oZSl7LypkdW1wKGUpOyovZSA9IGdldE1vdXNlRXZlbnQoZSk7IGUuc3RvcCgpOyAvKmUuc3RvcFByb3BhZ2F0aW9uKCk7Ki8gX3RoaXMudG9nZ2xlVmFsdWUoKTt9KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9pZiAoIXRoaXMuY2hlY2tCb3hFdmVudCkKICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgLy8gICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICAgIC8vICAgIGFkZEV2ZW50KHRoaXMuY2hlY2tCb3gsICJjbGljayIsIGZ1bmN0aW9uKGUpe3JldHVybihfdGhpcy5fb25DaGVja0JveENsaWNrKGUsIHRydWUpKX0pOwogICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJzZWxlY3RlZCIpOwogICAgICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIC8vYWRkRXZlbnQodGhpcy5jb250YWluZXIsICJjbGljayIsIGZ1bmN0aW9uKGUpe3JldHVybihfdGhpcy5fb25DbGljayhlKSl9KTsKCiAgICAgICAgaWYgKHRoaXMuVHJlZS5wYXJhbXNbInR5cGUiXSAhPSAiaG9yaXpvbnRhbCIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJ1dHRvbiA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICB0aGlzLmJ1dHRvbi5jbGFzc05hbWUgPSAiX1RyZWVCdXR0b24iOwogICAgICAgICAgICBhZGRFdmVudCh0aGlzLmJ1dHRvbiwgImNsaWNrIiwgZnVuY3Rpb24oZSl7ZT1nZXRFdmVudChlKTtlLnN0b3AoKTtfdGhpcy5leHBhbmRDb2xsYXBzZSh0cnVlKX0pOwogICAgICAgICAgICBhcHBlbmRGaXJzdCh0aGlzLmNvbnRhaW5lciwgdGhpcy5idXR0b24pOwogICAgICAgICAgICAvL2R1bXAodGhpcy5idXR0b24pOwoKICAgICAgICAgICAgLy92YXIgd2lkdGggPSAxMDsKICAgICAgICAgICAgdGhpcy5oTGluZSA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICB0aGlzLmhMaW5lLmNsYXNzTmFtZSA9ICJfVHJlZUxpbmUgX1RyZWVITGluZSI7CiAgICAgICAgICAgIC8vdGhpcy5oTGluZS5zdHlsZS53aWR0aCA9IHdpZHRoKyJweCI7CiAgICAgICAgICAgIC8vdGhpcy5oTGluZS5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqd2lkdGgpKyJweCI7CiAgICAgICAgICAgIGFwcGVuZEZpcnN0KHRoaXMuY29udGFpbmVyLCB0aGlzLmhMaW5lKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMudkxpbmVzID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIHRoaXMudkxpbmVzLmNsYXNzTmFtZSA9ICJfVHJlZUxpbmUgX1RyZWVWTGluZXMiOwogICAgICAgICAgICBhcHBlbmRGaXJzdCh0aGlzLmNvbnRhaW5lciwgdGhpcy52TGluZXMpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3ZhciBoZWlnaHQgPSAxMDsKICAgICAgICAvKgogICAgICAgIHRoaXMudkxpbmUgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICB0aGlzLnZMaW5lLmNsYXNzTmFtZSA9ICJ0cmVlVkxpbmUiOwogICAgICAgIC8vdGhpcy52TGluZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQrInB4IjsKICAgICAgICAvL3RoaXMudkxpbmUuc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKndpZHRoKSsicHgiOwogICAgICAgIGFwcGVuZEZpcnN0KHRoaXMuY29udGFpbmVyLCB0aGlzLnZMaW5lKTsKICAgICAgICAqLwogICAgICAgIC8vdGhpcy5jb250YWluZXIuc3R5bGUuYmFja2dyb3VuZCA9ICIjRkYwMDAwIjsKICAgICAgICAvL3ZhciBjbGVhckRpdiA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIC8vY2xlYXJEaXYuc3R5bGUuY2xlYXIgPSAiYm90aCI7CiAgICAgICAgLy9hcHBlbmRMYXN0KHRoaXMuY29udGFpbmVyLCBjbGVhckRpdik7CgogICAgICAgIGlmIChoYXNDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJleHBhbmRlZCIpKQogICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gdHJ1ZTsKCiAgICAgICAgLy8gcHJvYyBtdXNpbSA/IC8vIHZ5cG51dG8gcGFrIHRvIHZvbGEgbmVrb2xpa3JhdCBjZWxlIHByZWtyZXNsZW5pIChwb2RsZSBwb2N0dSBwb2xvemVrKSBhIHRydmEgdG8KICAgICAgICAvL3RoaXMuZHJhd0xpbmVzKCk7CiAgICB9Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCkKewogICAgaWYgKHRoaXMudGV4dCkKICAgICAgICByZXR1cm4odGhpcy50ZXh0KTsKICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgZWxlbSA9IGdldENoaWxkRWxlbWVudEJ5VGFnTmFtZSgiYSIsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoZWxlbSkKICAgICAgICAgICAgcmV0dXJuKHN0cmlwX3RhZ3MoZWxlbS5pbm5lckhUTUwpKTsKICAgIH0KfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uKCkKewogICAgaWYgKHR5cGVvZih0aGlzLnZhbHVlKSAhPSAidW5kZWZpbmVkIiAmJiB0aGlzLnZhbHVlICE9PSBudWxsKQogICAgewogICAgICAgIHJldHVybih0aGlzLnZhbHVlKTsKICAgIH0KICAgICAgICAKICAgIHJldHVybigiIik7Cn0KCi8qClRUcmVlSXRlbS5wcm90b3R5cGUuX29uQ2xpY2sgPSBmdW5jdGlvbihlKQp7CiAgICAvL2R1bXAoIlRUcmVlSXRlbTo6X29uQ2xpY2soKSIpOwogICAgZSA9IGdldE1vdXNlRXZlbnQoZSk7CiAgICAvL2FsZXJ0KHRoaXMuY29udGFpbmVyLmlubmVySFRNTCk7CgogICAgdmFyIHBvcyA9IGdldFdpbmRvd1Bvc2l0aW9uKHRoaXMuY29udGFpbmVyKTsKICAgIC8vdGhpcy5kdW1wKE1vdXNlLngpOwogICAgLy90aGlzLmR1bXAocG9zWyd4J10pOwogICAgLy90aGlzLmR1bXAoZ2V0U3R5bGUodGhpcy5jb250YWluZXIsICJwYWRkaW5nTGVmdCIpKTsKICAgIGlmIChNb3VzZS54IDwgcG9zWyd4J10rZXh0cmFjdEludChnZXRTdHlsZSh0aGlzLmNvbnRhaW5lciwgInBhZGRpbmdMZWZ0IikpKQogICAgewogICAgICAgIC8vYWxlcnQoJ2V4cGFuZCcpOwogICAgICAgIHRoaXMuZXhwYW5kQ29sbGFwc2UodHJ1ZSk7CiAgICAgICAgaWYgKGUpCiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHRoaXMuVHJlZS5wYXJhbXNbInNlbGVjdExlYXZlc09ubHkiXSAmJiBoYXNDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJleHBhbmRhYmxlIikpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmV4cGFuZENvbGxhcHNlKHRydWUpOwogICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF0aGlzLlRyZWUucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3QoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICB9CiAgICAgICAgaWYgKGUpCiAgICAgICAgICAgIGUuc3RvcCgpOwogICAgICAgICAgICAKICAgICAgICB0aGlzLlRyZWUub25DbGljayh0aGlzKTsKICAgIH0KICAgIAoKICAgIHJldHVybih0cnVlKTsKfQoqLwoKVFRyZWVJdGVtLnByb3RvdHlwZS5fb25DbGljayA9IGZ1bmN0aW9uKGUpCnsKICAgIGUgPSBnZXRNb3VzZUV2ZW50KGUpOwoKICAgIGlmICh0aGlzLlRyZWUucGFyYW1zWyJzZWxlY3RMZWF2ZXNPbmx5Il0gJiYgaGFzQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiZXhwYW5kYWJsZSIpKQogICAgewogICAgICAgIHRoaXMuZXhwYW5kQ29sbGFwc2UodHJ1ZSk7CiAgICAgICAgaWYgKGUpCiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KCiAgICBpZiAoIXRoaXMuVHJlZS5wYXJhbXNbIm11bHRpc2VsZWN0Il0gKQogICAgewogICAgICAgIHRoaXMuc2VsZWN0KCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICB9CgogICAgLyoKICAgIGlmIChlKQogICAgICAgIGUuc3RvcCgpOwogICAgICAgIAogICAgdGhpcy5UcmVlLm9uQ2xpY2sodGhpcyk7CiAgICAqLwogICAgCiAgICByZXR1cm4odHJ1ZSk7Cn0KCgpUVHJlZUl0ZW0ucHJvdG90eXBlLm9uQ2xpY2sgPSBmdW5jdGlvbigpCnsKICAgIHJldHVybih0cnVlKTsKfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5fb25DaGVja0JveENsaWNrID0gZnVuY3Rpb24oZSwgc3RvcCkKewogICAgLyoKICAgIGUgPSBnZXRNb3VzZUV2ZW50KGUpOwogICAgaWYgKGUgJiYgc3RvcCkKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgLy8gbm8gc3RvcCgpIG9yIGNoZWNraW5nIHdpbGwgZmFpbAogICAgCiAgICAvLyBzd2FwcGVkIHZhbHVlcyAtIGJlY2F1c2UgaW4gdGhpcyBtb21lbnQgdGhlIHN0YXRlcyBvZiBjaGVja2JveCBoYXMgbm90IGJlZW4gYWxyZWFkeSBjaGFuZ2VkCiAgICB2YXIgdmFsdWVzID0gdGhpcy5UcmVlLmdldFZhbHVlcygpOwogICAgYXJyYXlfcmVtb3ZlKHZhbHVlcywgdGhpcy52YWx1ZSk7CiAgICAvL2lmICghdGhpcy5jaGVja0JveC5jaGVja2VkKSAvLyBub3QgY2hlY2tlZCB5ZXQgLSB3aWxsIGJlIGNoZWNrZWQgYWZ0ZXIgZXZlbnQgY2FsbAogICAgaWYgKHRoaXMuY2hlY2tCb3guY2hlY2tlZCkKICAgIHsKICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLnZhbHVlKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgIH0KICAgIAogICAgdGhpcy5UcmVlLmVsZW1lbnQudmFsdWUgPSB2YWx1ZXMuam9pbigifCIpOwogICAgcmV0dXJuKHRydWUpOwogICAgKi8KfQoKVFRyZWVJdGVtLnByb3RvdHlwZS50b2dnbGVWYWx1ZSA9IGZ1bmN0aW9uKCkKewogICAgLy9kdW1wKCJUVHJlZUl0ZW06OnRvZ2dsZVZhbHVlKCkiKTsKICAgIGlmICh0aGlzLkNoZWNrQm94LmdldENoZWNrZWQoKSkKICAgIHsKICAgICAgICB0aGlzLkNoZWNrQm94LnNldENoZWNrZWQoZmFsc2UpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRoaXMuQ2hlY2tCb3guc2V0Q2hlY2tlZCh0cnVlKTsKICAgIH0KCiAgICB0aGlzLl90b2dnbGVWYWx1ZSgpOwogICAgcmV0dXJuKHRydWUpOwp9CgpUVHJlZUl0ZW0ucHJvdG90eXBlLl90b2dnbGVWYWx1ZSA9IGZ1bmN0aW9uKCkKewogICAgLy9kdW1wKCJUVHJlZUl0ZW06Ol90b2dnbGVWYWx1ZSgpIik7CiAgICB2YXIgdmFsdWVzID0gdGhpcy5UcmVlLmdldFZhbHVlcygpOwogICAgaWYgKHRoaXMuQ2hlY2tCb3guZ2V0Q2hlY2tlZCgpKQogICAgewogICAgICAgIHZhbHVlcyA9IGFycmF5X3JlbW92ZSh2YWx1ZXMsIHRoaXMudmFsdWUpOwogICAgICAgIHZhbHVlcy5wdXNoKHRoaXMudmFsdWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhbHVlcyA9IGFycmF5X3JlbW92ZSh2YWx1ZXMsIHRoaXMudmFsdWUpOwogICAgfQoKICAgIGZvciAodmFyIGkgPSB2YWx1ZXMubGVuZ3RoLTEgOyBpID49IDAgIDsgaS0tKQogICAgewogICAgICAgIGlmICh2YWx1ZXNbaV0gPT0gIiIpCiAgICAgICAgICAgIHZhbHVlcyA9IGFycmF5X3JlbW92ZSh2YWx1ZXMsICIiKTsKICAgIH0KCiAgICB0aGlzLlRyZWUuZWxlbWVudC52YWx1ZSA9IHZhbHVlcy5qb2luKCJ8Iik7CiAgICAvL2R1bXAodGhpcy5UcmVlLmVsZW1lbnQudmFsdWUpOwogICAgdGhpcy5UcmVlLl9vbkNoYW5nZSh0aGlzLlRyZWUuZ2V0VmFsdWUoKSk7CgogICAgCiAgICByZXR1cm4odHJ1ZSk7Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUub25DaGVja0JveENsaWNrID0gZnVuY3Rpb24oKQp7CiAgICByZXR1cm4odHJ1ZSk7Cn0KCgpUVHJlZUl0ZW0ucHJvdG90eXBlLmV4cGFuZENvbGxhcHNlID0gZnVuY3Rpb24oYXN5bmMpCnsKICAgIGlmICh0aGlzLmV4cGFuZGVkKQogICAgICAgIHRoaXMuY29sbGFwc2UoYXN5bmMpOwogICAgZWxzZQogICAgICAgIHRoaXMuZXhwYW5kKGFzeW5jKTsKfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbihhc3luYykKewogICAgaWYgKHR5cGVvZihhc3luYykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgYXN5bmMgPSBmdW5jdGlvbigpe307CiAgICAKICAgIC8vZHVtcCgiISEhISEhISIpOwogICAgLy9zZXRTY3JvbGxUb3AodGhpcy5UcmVlLlRvcEl0ZW0uVHJlZS5jb250YWluZXIsIDIwMCk7CiAgICAvL2R1bXAodGhpcy5UcmVlLlRvcEl0ZW0uVHJlZS5jb250YWluZXIpOyAgICAKICAgIC8vZHVtcCgxKTsgICAgCiAgICAvL2R1bXAodGhpcy5pdGVtcyk7CiAgICAvL2R1bXAoZ2V0U2Nyb2xsVG9wKTsKICAgIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsTGVmdCh0aGlzLlRyZWUuY29udGFpbmVyKTsKICAgIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGxUb3AodGhpcy5UcmVlLlRvcEl0ZW0uVHJlZS5jb250YWluZXIpOwogICAgLy9kdW1wKHRoaXMuVHJlZS5pZCk7CiAgICAvL2R1bXAoc2Nyb2xsVG9wKTsKICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgLy9hbGVydCgiISIpOwogICAgLy9kdW1wKHRoaXMuVHJlZS5jb250YWluZXIpOwogICAgaWYgKC8qaGFzQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiZXhwYW5kYWJsZSIpICYmICovdGhpcy5pdGVtcy5sZW5ndGggPT0gMCAmJiAhdGhpcy5sb2FkZWQpCiAgICB7CiAgICAgICAgLy9kdW1wKCdleHBhbmQnKTsKICAgICAgICAvL2R1bXAodGhpcy52YWx1ZSk7CiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlOwogICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLlRyZWUucGFyYW1zOwogICAgICAgIHBhcmFtc1sicGFyZW50Il0gPSB0aGlzLnZhbHVlIHx8ICJOVUxMIjsKCiAgICAgICAgc2hvd0xvYWRpbmdBbmltYXRpb24odGhpcy5UcmVlKTsKICAgICAgICAvL3ZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIHVsID0gY3JlYXRlRWxlbWVudCgidWwiKTsKICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh1bCk7CiAgICAgICAgdGhpcy5zdWJJdGVtc0NvbnRhaW5lciA9IHVsOwogICAgICAgIHVsLlRyZWVJdGVtID0gdGhpczsKICAgICAgICB0aGlzLlRyZWUubG9hZFBhcmVudEl0ZW1Db250YWluZXIgPSB1bDsKICAgICAgICB0aGlzLlRyZWUubG9hZFBhcmVudEl0ZW0gPSB0aGlzOwogICAgICAgIHRoaXMuVHJlZS5wYXJhbXNbImJlZ2luIl0gPSAwOwogICAgICAgIHZhciB0b3BJdGVtSWQgPSB0aGlzLlRyZWUucGFyYW1zWyJ0b3BJdGVtSWQiXTsKICAgICAgICB0aGlzLlRyZWUucGFyYW1zWyJ0b3BJdGVtSWQiXSA9IHRoaXMudmFsdWU7CiAgICAgICAgLy9kdW1wKHRoaXMudmFsdWUpOwogICAgICAgIC8vZHVtcChhc3luYyk7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgX2FzeW5jID0gYXN5bmM7CgogICAgICAgIGlmICh0eXBlb2YoYXN5bmMpICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIGFzeW5jID0gZnVuY3Rpb24oKXt9OwoKICAgICAgICBfYXN5bmMgPSBmdW5jdGlvbigpewogICAgICAgICAgICAvL2R1bXAoX3RoaXMuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgaWYgKF90aGlzLml0ZW1zLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKF90aGlzLmNvbnRhaW5lciwgImV4cGFuZGFibGUiKTsKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShfdGhpcy5jb250YWluZXIsICJleHBhbmRlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKF90aGlzLmNvbnRhaW5lciwgImV4cGFuZGFibGUiKTsKICAgICAgICAgICAgICAgIC8vcmVtb3ZlQ2xhc3NOYW1lKF90aGlzLmNvbnRhaW5lciwgImV4cGFuZGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChzY3JvbGxUb3AgfHwgc2Nyb2xsTGVmdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0U2Nyb2xsTGVmdChfdGhpcy5UcmVlLmNvbnRhaW5lciwgc2Nyb2xsTGVmdCk7CiAgICAgICAgICAgICAgICBzZXRTY3JvbGxUb3AoX3RoaXMuVHJlZS5jb250YWluZXIsIHNjcm9sbFRvcCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIF90aGlzLmV4cGFuZGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmIChfdGhpcy5zdWJJdGVtc0NvbnRhaW5lcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKF90aGlzLlRyZWUucGFyYW1zWyJ0eXBlIl0gPT0gImhvcml6b250YWwiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGVuZExhc3QoX3RoaXMuVHJlZS5jb250YWluZXIsIF90aGlzLnN1Ykl0ZW1zQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBfdGhpcy5kcmF3TGluZXMoKTsKCiAgICAgICAgICAgIGFzeW5jKCk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcChfYXN5bmMpOwogICAgICAgIHRoaXMuVHJlZS5fbG9hZCh0aGlzLnZhbHVlLCBfYXN5bmMpOwogICAgICAgIHRoaXMuVHJlZS5wYXJhbXNbInRvcEl0ZW1JZCJdID0gdG9wSXRlbUlkOwogICAgICAgIC8qCiAgICAgICAgY2FsbChmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgaHRtbCA9IF90aGlzLlRyZWUuY2FsbFBIUE1ldGhvZCgiZ2V0QUpBWENvbnRlbnQiLCBwYXJhbXMpOwogICAgICAgICAgICBhcHBlbmRIdG1sKF90aGlzLmNvbnRhaW5lciwgaHRtbCk7CiAgICAgICAgICAgIF90aGlzLlRyZWUuY3JlYXRlRnJvbUh0bWwoZ2V0RWxlbWVudEJ5VGFnTmFtZSgidWwiLCBfdGhpcy5jb250YWluZXIpLCBfdGhpcyk7CiAgICAgICAgICAgIGhpZGVMb2FkaW5nQW5pbWF0aW9uKF90aGlzLlRyZWUpOwogICAgICAgICAgICAvL2R1bXAoX3RoaXMuaXRlbXMpOwogICAgICAgIH0sIGFzeW5jKTsgICAgICAgIAogICAgICAgICovCiAgICAgICAgLy9kdW1wKCdmaW5pc2hlZCcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgImV4cGFuZGVkIik7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmIChzY3JvbGxUb3AgfHwgc2Nyb2xsTGVmdCkKICAgICAgICB7CiAgICAgICAgICAgIHNldFNjcm9sbExlZnQodGhpcy5UcmVlLmNvbnRhaW5lciwgc2Nyb2xsTGVmdCk7CiAgICAgICAgICAgIHNldFNjcm9sbFRvcCh0aGlzLlRyZWUuY29udGFpbmVyLCBzY3JvbGxUb3ApOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5leHBhbmRlZCA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMuc3ViSXRlbXNDb250YWluZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnN1Ykl0ZW1zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXk9Jyc7CgogICAgICAgICAgICBpZiAodGhpcy5UcmVlLnBhcmFtc1sidHlwZSJdID09ICJob3Jpem9udGFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYXBwZW5kTGFzdCh0aGlzLlRyZWUuY29udGFpbmVyLCB0aGlzLnN1Ykl0ZW1zQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLmRyYXdMaW5lcygpOwogICAgICAgIGFzeW5jKCk7CiAgICB9CgogICAgLyoKICAgIGlmIChoYXNDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJleHBhbmRhYmxlIikpCiAgICB7CiAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiZXhwYW5kZWQiKTsKICAgICAgICBpZiAodGhpcy5zdWJJdGVtc0NvbnRhaW5lcikKICAgICAgICAgICAgdGhpcy5zdWJJdGVtc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5PSdibG9jayc7CiAgICAgICAgdGhpcy5leHBhbmRlZCA9IHRydWU7CiAgICAgICAgCiAgICAgICAgLy8gcHJvYyBtdXNpbSBjZWx5IHN0cm9tPyAvLyB2eXBudXRvIHBhayB0byB2b2xhIG5la29saWtyYXQgY2VsZSBwcmVrcmVzbGVuaSAocG9kbGUgcG9jdHUgcG9sb3playkgYSB0cnZhIHRvCiAgICAgICAgLy90aGlzLlRyZWUucmVkcmF3TGluZXMoKTsKICAgICAgICAKICAgICAgICAvL3RoaXMuZHVtcCgic3ViaXRlbXM6ICIrdGhpcy5pdGVtcy5sZW5ndGgpOwogICAgICAgIC8vZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgLy8gICAgdGhpcy5pdGVtc1tpXS5kcmF3TGluZXMoKTsKICAgICAgICAKICAgICAgICAKICAgIH0KICAgICovCiAgICAvL2R1bXAoImV4cGFuZCIpOwp9CgpUVHJlZUl0ZW0ucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKGFzeW5jKQp7CiAgICB0aGlzLmNsZWFyKGZhbHNlLCBhc3luYyk7CiAgICAvLyBjbGVhciBjYWxscyBleHBhbmQgdG8gcmVsb2FkIGNoaWxkIGl0ZW1zCiAgICAKICAgIC8vdGhpcy5UcmVlLnBhcmFtc1sicGFyZW50Il0gPSB0aGlzLmdldFZhbHVlKCk7CiAgICAvL3RoaXMuVHJlZS5sb2FkKHRoaXMuZ2V0VmFsdWUoKSwgYXN5bmMpOwp9CgpUVHJlZUl0ZW0ucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oc3ViLCBhc3luYykKewogICAgLy9kdW1wKCdBJyk7CiAgICB0aGlzLmNvbGxhcHNlKCk7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgVHJlZUl0ZW0gPSB0aGlzLml0ZW1zW2ldOwoKICAgICAgICBUcmVlSXRlbS5jbGVhcih0cnVlKTsKICAgICAgICBkZWxldGUoVHJlZUl0ZW0pOwogICAgfQogICAgdGhpcy5pdGVtcyA9IFtdOwoKICAgIGlmICghc3ViLyogJiYgaGFzQ2xhc3NOYW1lKHRoaXMuY29udGFpbmVyLCAiZXhwYW5kYWJsZSIpKi8pCiAgICB7CiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLnN1Ykl0ZW1zQ29udGFpbmVyKTsKICAgICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsKICAgICAgICAKICAgICAgICAvL2R1bXAoMSk7CiAgICAgICAgdGhpcy5leHBhbmQoYXN5bmMpOyAgICAKICAgIH0KCiAgICBpZiAoIXN1YikKICAgICAgICB0aGlzLmRyYXdMaW5lcygpOwogICAgLy90aGlzLlRyZWUucmVkcmF3TGluZXMoKTsKfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5jb2xsYXBzZSA9IGZ1bmN0aW9uKCkKewogICAgaWYgKCF0aGlzLlBhcmVudEl0ZW0pCiAgICAgICAgcmV0dXJuOwogICAgCiAgICByZW1vdmVDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJleHBhbmRlZCIpOwogICAgLy9kdW1wKHRoaXMuY29udGFpbmVyKTsKICAgIC8vZHVtcCh0aGlzLnN1Ykl0ZW1zQ29udGFpbmVyKTsKICAgIGlmICh0aGlzLnN1Ykl0ZW1zQ29udGFpbmVyKQogICAgICAgIHRoaXMuc3ViSXRlbXNDb250YWluZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgICAvL2R1bXAodGhpcy5zdWJJdGVtc0NvbnRhaW5lcik7CiAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7CgogICAgdGhpcy5UcmVlLnJlZHJhd0xpbmVzKCk7CiAgICAvL3RoaXMuZHJhd0xpbmVzKCk7CiAgICAKICAgIC8qCiAgICB2YXIgSXRlbSA9IHRoaXMuUGFyZW50SXRlbTsKICAgIHdoaWxlIChJdGVtKQogICAgewogICAgICAgIEl0ZW0uZHJhd0xpbmVzKCk7CiAgICAgICAgSXRlbSA9IEl0ZW0uUGFyZW50SXRlbTsKICAgIH0KICAgICovCn0KClRUcmVlSXRlbS5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oKQp7CiAgICBpZiAodGhpcy5jaGVja0JveCkKICAgIHsKICAgICAgICB0aGlzLl9zZWxlY3QoKTsKICAgICAgICB0aGlzLl9vbkNoZWNrQm94Q2xpY2sobnVsbCwgZmFsc2UpOwogICAgICAgIAogICAgICAgIHRoaXMuVHJlZS5fb25DaGFuZ2UodGhpcy5UcmVlLmdldFZhbHVlKCkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vZHVtcCgnQScpOwogICAgICAgIC8vZHVtcCgxKTsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBoYXNDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJzZWxlY3RlZCIpOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMuVHJlZS5pdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5UcmVlLnBhcmFtc1sidW5zZWxlY3QiXSB8fCB0aGlzLlRyZWUuaXRlbXNbaV0gIT0gdGhpcykKICAgICAgICAgICAgICAgIHRoaXMuVHJlZS5pdGVtc1tpXS5fdW5zZWxlY3QoKTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIGlmICghc2VsZWN0ZWQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9zZWxlY3QoKTsKICAgICAgICAgICAgdGhpcy5UcmVlLnZhbHVlRWxlbWVudC52YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIC8vZHVtcCh0aGlzLlRyZWUub25DaGFuZ2UpOwogICAgICAgICAgICB0aGlzLlRyZWUuX29uQ2hhbmdlKHRoaXMuVHJlZS5nZXRWYWx1ZSgpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5UcmVlLnBhcmFtc1sidW5zZWxlY3QiXSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuVHJlZS52YWx1ZUVsZW1lbnQudmFsdWUgPSAiIjsKICAgICAgICAgICAgdGhpcy5UcmVlLl9vbkNoYW5nZSh0aGlzLlRyZWUuZ2V0VmFsdWUoKSk7CiAgICAgICAgfQogICAgICAgIC8vZHVtcCgnQicpOwogICAgfQogICAgICAgIAp9CgpUVHJlZUl0ZW0ucHJvdG90eXBlLl9zZWxlY3QgPSBmdW5jdGlvbigpCnsKICAgIC8vaWYgKHRoaXMuc2VsZWN0ZWQpCiAgICAvLyAgICByZXR1cm47CiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIC8vZHVtcCh0aGlzLmNoZWNrQm94KTsKICAgIGlmICh0aGlzLkNoZWNrQm94KQogICAgICAgIHRoaXMuQ2hlY2tCb3guc2V0Q2hlY2tlZCh0cnVlKTsKICAgIGVsc2UKICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJzZWxlY3RlZCIpOwogICAgICAgIAogICAgdmFyIFRyZWVJdGVtID0gdGhpcy5QYXJlbnRJdGVtOwogICAgLy9kdW1wKDEpOwogICAgd2hpbGUoVHJlZUl0ZW0pCiAgICB7CiAgICAgICAgYWRkQ2xhc3NOYW1lKFRyZWVJdGVtLmNvbnRhaW5lciwgIl9UcmVlSXRlbUNoaWxkU2VsZWN0ZWQiKTsKICAgICAgICAKICAgICAgICBUcmVlSXRlbSA9IFRyZWVJdGVtLlBhcmVudEl0ZW07CiAgICAgICAgLy9kdW1wKDIpOwogICAgfQoKICAgIGlmICh0aGlzLlRyZWUucGFyYW1zWyJ0eXBlIl0gPT0gImhvcml6b250YWwiKQogICAgewogICAgICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+IDAgfHwgdGhpcy5sb2FkZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcGFyZW50SXRlbXMgPSB0aGlzLmdldEFsbFBhcmVudEl0ZW1zKCk7CiAgICAgICAgICAgIHZhciBpdGVtcyA9IHRoaXMuVHJlZS5nZXRBbGxJdGVtcygpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBpdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IHBhcmVudEl0ZW1zLmxlbmd0aCA7IGlpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFRyZWVJdGVtID09IHBhcmVudEl0ZW1zW2lpXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkKICAgICAgICAgICAgICAgICAgICBUcmVlSXRlbS5jb2xsYXBzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgLy90aGlzLnNlbGVjdCgpOwogICAgICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgLy90aGlzLlRyZWUudmFsdWVFbGVtZW50LnZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgdGhpcy5leHBhbmQoKTsKICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICAvL2R1bXAodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKDIpOwogICAgICAgICAgICAvL2R1bXAodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgdGhpcy5UcmVlLnZhbHVlRWxlbWVudC52YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIC8vdGhpcy5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIAogICAgLy92YXIgX3RoaXMgPSB0aGlzO+KAjGNhbGwoZnVuY3Rpb24oKXvigIwgICAgX3RoaXMuY29sbGFwc2VBbGwoKTvigIzigIwgICAgaWYgKF90aGlzLmdldFZhbHVlKCkp4oCMICAgIHvigIwgICAgICAgIF90aGlzLmdldEl0ZW1CeVZhbHVlKF90aGlzLmdldFZhbHVlKCkpLmV4cGFuZCgpO+KAjCAgICB94oCMICAgIC8qc2hvcENhc2hSZWdpc3RlckxvYWRQcm9kdWN0cygpOyov4oCMfSwgdHJ1ZSk74oCMCiAgICAKICAgIAogICAgLy90aGlzLlRyZWUudXBkYXRlVmFsdWVzKCk7Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUudW5zZWxlY3QgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuX3Vuc2VsZWN0KCk7Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUuX3Vuc2VsZWN0ID0gZnVuY3Rpb24oKQp7CiAgICAvL2R1bXAoInVuc2VsZWN0Iik7CiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIAogICAgaWYgKHRoaXMuQ2hlY2tCb3gpCiAgICAgICAgdGhpcy5DaGVja0JveC5zZXRDaGVja2VkKGZhbHNlKTsKICAgIGVsc2UKICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJzZWxlY3RlZCIpOwoKICAgIHZhciBUcmVlSXRlbSA9IHRoaXMuUGFyZW50SXRlbTsKICAgIHdoaWxlKFRyZWVJdGVtKQogICAgewogICAgICAgIHJlbW92ZUNsYXNzTmFtZShUcmVlSXRlbS5jb250YWluZXIsICJfVHJlZUl0ZW1DaGlsZFNlbGVjdGVkIik7CiAgICAgICAgVHJlZUl0ZW0gPSBUcmVlSXRlbS5QYXJlbnRJdGVtOwogICAgfQoKICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTsKfQoKCi8qClRUcmVlSXRlbS5wcm90b3R5cGUuZHJhd0xpbmVzID0gZnVuY3Rpb24oKQp7CiAgICBkdW1wKHRoaXMubGFiZWxFbGVtZW50KTsKICAgIHZhciB1bCA9IGdldEVsZW1lbnRCeVRhZ05hbWUoInVsIiwgdGhpcy5jb250YWluZXIpOwogICAgaWYgKHVsKQogICAgewogICAgICAgIC8vIG5lZWQgdG8gaGlkZSBjaGlsZCBub2RlCiAgICAgICAgdmFyIG9sZERpc3BsYXkgPSB1bC5zdHlsZS5kaXNwbGF5OwogICAgICAgIHVsLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgdmFyIGxpSGVpZ2h0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0OwogICAgICAgIHVsLnN0eWxlLmRpc3BsYXkgPSBvbGREaXNwbGF5OwogICAgfQogICAgZWxzZQogICAgICAgIHZhciBsaUhlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDsKICAgIAogICAgLy9hbGVydChsaUhlaWdodCk7CiAgICBkdW1wKGxpSGVpZ2h0KTsKICAgIGlmIChoYXNDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJleHBhbmRhYmxlIikpCiAgICB7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiY29sbGFwc2VCdXR0b24iKTsKICAgICAgICByZW1vdmVDbGFzc05hbWUodGhpcy5idXR0b24sICJleHBhbmRCdXR0b24iKTsKICAgICAgICBpZiAodGhpcy5leHBhbmRlZCkKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiY29sbGFwc2VCdXR0b24iKTsKICAgICAgICBlbHNlIAogICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5idXR0b24sICJleHBhbmRCdXR0b24iKTsKICAgICAgICAgICAgCiAgICAgICAgLy90aGlzLmJ1dHRvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqTWF0aC5yb3VuZChNYXRoLmFicyhleHRyYWN0SW50KGdldFN0eWxlKHRoaXMudkxpbmUsICJtYXJnaW4tbGVmdCIpKSktdGhpcy5idXR0b24ub2Zmc2V0V2lkdGgtdGhpcy5idXR0b24ub2Zmc2V0V2lkdGgvMikpKyJweCI7CiAgICB9CiAgICB0aGlzLmJ1dHRvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqTWF0aC5yb3VuZChleHRyYWN0SW50KGdldFN0eWxlKHRoaXMuY29udGFpbmVyLCAicGFkZGluZy1sZWZ0IikpLU1hdGguYWJzKGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy52TGluZSwgIm1hcmdpbi1sZWZ0IikpKSt0aGlzLmJ1dHRvbi5vZmZzZXRXaWR0aC8yKzEpKSsicHgiOwogICAgdGhpcy5idXR0b24uc3R5bGUubWFyZ2luVG9wID0gTWF0aC5yb3VuZChsaUhlaWdodC8yLXRoaXMuYnV0dG9uLm9mZnNldFdpZHRoLzIpKyJweCI7CiAgICAKICAgIC8vdGhpcy5kdW1wKHRoaXMuY29udGFpbmVyKTsKICAgIHZhciB3aWR0aCA9IE1hdGguYWJzKGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy52TGluZSwgIm1hcmdpbi1sZWZ0IikpKTsKICAgIHRoaXMuaExpbmUuc3R5bGUud2lkdGggPSB3aWR0aCsicHgiOwogICAgdGhpcy5oTGluZS5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqd2lkdGgpKyJweCI7CgogICAgdmFyIG1hcmdpblRvcCA9IDA7CiAgICB2YXIgcHJldlNpYmxpbmcgPSBnZXRQcmV2U2libGluZyh0aGlzLmNvbnRhaW5lciwgImxpIik7CiAgICB3aGlsZShwcmV2U2libGluZykKICAgIHsKICAgICAgICBkdW1wKHByZXZTaWJsaW5nKTsKICAgICAgICBkdW1wKHByZXZTaWJsaW5nLnN0eWxlLmRpc3BsYXkpOwogICAgICAgIGlmIChwcmV2U2libGluZy5zdHlsZS5kaXNwbGF5ICE9ICJub25lIikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIAogICAgICAgIHByZXZTaWJsaW5nID0gZ2V0UHJldlNpYmxpbmcocHJldlNpYmxpbmcsICJsaSIpOwogICAgfQogICAgZHVtcChwcmV2U2libGluZyk7CiAgICAKICAgIGlmICghcHJldlNpYmxpbmcgJiYgdGhpcy5QYXJlbnRJdGVtID09IHRoaXMuVHJlZS5Ub3BJdGVtKSAvLyBmaXJzdCBhbmQgdG9wIGxldmVsIG9ubHkKICAgIHsKICAgICAgICAvL21hcmdpblRvcCA9IGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy5oTGluZSwgIm1hcmdpbi10b3AiKSk7CiAgICAgICAgbWFyZ2luVG9wID0gTWF0aC5yb3VuZChsaUhlaWdodC8yKTsKICAgIH0KICAgIGR1bXAobWFyZ2luVG9wKTsKICAgIHRoaXMuaExpbmUuc3R5bGUubWFyZ2luVG9wID0gTWF0aC5yb3VuZChsaUhlaWdodC8yKSsicHgiOwogICAgdGhpcy52TGluZS5zdHlsZS5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3ArInB4IjsgICAgICAgIAogICAgCiAgICB2YXIgaGVpZ2h0ID0gMDsKICAgIAogICAgLy9pZiAoIWdldFByZXZTaWJsaW5nKHRoaXMuY29udGFpbmVyLCAibGkiKSkKICAgIC8vaWYgKHByZXZTaWJsaW5nKQogICAgLy97CiAgICAgICAgaGVpZ2h0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0LW1hcmdpblRvcDsKICAgICAgICB2YXIgbmV4dFNpYmxpbmdzID0gZ2V0TmV4dFNpYmxpbmdOb2Rlcyh0aGlzLmNvbnRhaW5lciwgImxpIik7CiAgICAgICAgZm9yICh2YXIgaSA9IG5leHRTaWJsaW5ncy5sZW5ndGgtMSA7IGkgPj0gMCA7IGktLSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChuZXh0U2libGluZ3NbaV0uc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFycmF5X3JlbW92ZShuZXh0U2libGluZ3MsIG5leHRTaWJsaW5nc1tpXSk7CiAgICAgICAgICAgICAgICAvL2RlbGV0ZShuZXh0U2libGluZ3NbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGR1bXAobmV4dFNpYmxpbmdzKTsKICAgICAgICAKICAgICAgICBpZiAobmV4dFNpYmxpbmdzLmxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG5leHRTaWJsaW5ncy5sZW5ndGgtMSA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaGVpZ2h0ICs9IGV4dHJhY3RJbnQobmV4dFNpYmxpbmdzW2ldLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGVpZ2h0ICs9IGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy5oTGluZSwgIm1hcmdpbi10b3AiKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgICAgIGhlaWdodCA9IGV4dHJhY3RJbnQoZ2V0U3R5bGUodGhpcy5oTGluZSwgIm1hcmdpbi10b3AiKSk7CiAgICAvL30KICAgIAogICAgdGhpcy52TGluZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQrInB4IjsKICAgIC8vZHVtcCh0aGlzLmxhYmVsRWxlbWVudCk7CiAgICAvL2R1bXAodGhpcy52YWx1ZXMpOwogICAgZHVtcChoZWlnaHQpOwogICAgZHVtcCgiRSIpOwp9CiovCgpUVHJlZUl0ZW0ucHJvdG90eXBlLmdldFZMaW5lcyA9IGZ1bmN0aW9uKGhlaWdodCwgZmlsbCkKewogICAgaWYgKHR5cGVvZihmaWxsKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBmaWxsID0gZmFsc2U7CiAgICAKICAgIHZhciB2TGluZXMgPSBbXTsKICAgIC8vZHVtcCh0aGlzLmNvbnRlbnQuaW5uZXJIVE1MKTsKICAgIGlmICh0aGlzLlBhcmVudEl0ZW0pCiAgICB7CiAgICAgICAgaWYgKHRoaXMuUGFyZW50SXRlbSAhPSB0aGlzLlRyZWUuVG9wSXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZMaW5lcyA9IHRoaXMuUGFyZW50SXRlbS5nZXRWTGluZXMoaGVpZ2h0LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIGJ1dHRvbk9mZnNldCA9IE1hdGguZmxvb3IodGhpcy5idXR0b24ub2Zmc2V0SGVpZ2h0LzIpOwogICAgICAgIHZhciBtYXJnaW5Ub3AgPSAwOwogICAgICAgIHZhciBfaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIGlmIChmaWxsKSAvLyBhbGwgcHJldiBsaW5lcwogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmdldE5leHRTaWJsaW5nKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9oZWlnaHQgPSAwOyAvLyBjYW5ub3Qgc2V0IDAgLSBvciB3aWxsIGJlIGludmlzaWJsZSBhbmQgZXZlcnl0aGluZyBnb2VzIGxlZnQKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIC8vIHRoZSBsYXN0IC8gY3VycmVudCBsaW5lCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZ2V0UHJldlNpYmxpbmcoKSAmJiAhdGhpcy5nZXROZXh0U2libGluZygpICYmICF0aGlzLlBhcmVudEl0ZW0uZXhwYW5kZWQpCiAgICAgICAgICAgICAgICBfaGVpZ2h0ID0gMTsKICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuZ2V0UHJldlNpYmxpbmcoKSAmJiAhdGhpcy5QYXJlbnRJdGVtLmV4cGFuZGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtYXJnaW5Ub3AgPSB0aGlzLnZMaW5lTWFyZ2luK2J1dHRvbk9mZnNldDsKICAgICAgICAgICAgICAgIF9oZWlnaHQgLT0gbWFyZ2luVG9wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmdldE5leHRTaWJsaW5nKCkpCiAgICAgICAgICAgICAgICBfaGVpZ2h0ID0gdGhpcy52TGluZU1hcmdpbitidXR0b25PZmZzZXQ7CiAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciB2TGluZSA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIHZMaW5lLmNsYXNzTmFtZSA9ICJfVHJlZUxpbmUgX1RyZWVWTGluZSI7CiAgICAgICAgLy92TGluZS5zdHlsZS53aWR0aCA9IHRoaXMudkxpbmVNYXJnaW4rInB4IjsKICAgICAgICB2TGluZS5zdHlsZS5oZWlnaHQgPSBfaGVpZ2h0KyJweCI7CiAgICAgICAgdkxpbmUuc3R5bGUubWFyZ2luVG9wID0gbWFyZ2luVG9wKyJweCI7CiAgICAgICAgdkxpbmVzLnB1c2godkxpbmUpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLmV4cGFuZGVkICYmICFmaWxsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZMaW5lID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIHZMaW5lLmNsYXNzTmFtZSA9ICJfVHJlZUxpbmUgX1RyZWVWTGluZSI7CiAgICAgICAgICAgIC8vdkxpbmUuc3R5bGUud2lkdGggPSB0aGlzLnZMaW5lTWFyZ2luKyJweCI7CiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCkKICAgICAgICAgICAgICAgIHZMaW5lLnN0eWxlLmhlaWdodCA9IChoZWlnaHQtdGhpcy52TGluZU1hcmdpbi1idXR0b25PZmZzZXQpKyJweCI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZMaW5lLnN0eWxlLmhlaWdodCA9ICIwcHgiOwogICAgICAgICAgICB2TGluZS5zdHlsZS5tYXJnaW5Ub3AgPSAodGhpcy52TGluZU1hcmdpbitidXR0b25PZmZzZXQpKyJweCI7CiAgICAgICAgICAgIHZMaW5lcy5wdXNoKHZMaW5lKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4odkxpbmVzKTsKfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5kcmF3TGluZXMgPSBmdW5jdGlvbihzZWxmT25seSkKewogICAgaWYgKHRoaXMuVHJlZS5wYXJhbXNbInR5cGUiXSA9PSAiaG9yaXpvbnRhbCIpCiAgICAgICAgcmV0dXJuOwoKICAgIC8vcmV0dXJuOwogICAgaWYgKHR5cGVvZihzZWxmKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBzZWxmT25seSA9IGZhbHNlOwogICAgICAgIAogICAgdmFyIHVsID0gZ2V0RWxlbWVudEJ5VGFnTmFtZSgidWwiLCB0aGlzLmNvbnRhaW5lcik7CiAgICBpZiAodWwpCiAgICB7CiAgICAgICAgLy8gbmVlZCB0byBoaWRlIGNoaWxkIG5vZGUKICAgICAgICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsVG9wKHRoaXMuVHJlZS5jb250YWluZXIpOwogICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsTGVmdCh0aGlzLlRyZWUuY29udGFpbmVyKTsKICAgICAgICB2YXIgb2xkRGlzcGxheSA9IHVsLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgdWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICB2YXIgbGlIZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7CiAgICAgICAgdWwuc3R5bGUuZGlzcGxheSA9IG9sZERpc3BsYXk7CiAgICAgICAgc2V0U2Nyb2xsVG9wKHRoaXMuVHJlZS5jb250YWluZXIsIHNjcm9sbFRvcCk7CiAgICAgICAgc2V0U2Nyb2xsTGVmdCh0aGlzLlRyZWUuY29udGFpbmVyLCBzY3JvbGxMZWZ0KTsKICAgIH0KICAgIGVsc2UKICAgICAgICB2YXIgbGlIZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7CiAgICAgICAgCiAgICB0aGlzLnZMaW5lTWFyZ2luID0gTWF0aC5mbG9vcihsaUhlaWdodC8yLXRoaXMuYnV0dG9uLm9mZnNldEhlaWdodC8yKTsKCiAgICBpZiAoIXRoaXMuZHJhd2luZykKICAgIHsKICAgICAgICB0aGlzLmRyYXdpbmcgPSB0cnVlOwogICAgICAgIHRoaXMudkxpbmVzLmlubmVySFRNTCA9ICIiOwoKICAgICAgICB2YXIgaGVpZ2h0ID0gbGlIZWlnaHQ7CiAgICAgICAgdmFyIHZMaW5lcyA9IHRoaXMuZ2V0VkxpbmVzKGhlaWdodCk7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKHRoaXMuY29udGVudC5pbm5lckhUTUwpOwogICAgICAgIC8vZHVtcCh0aGlzLlBhcmVudEl0ZW0gIT0gbnVsbCk7CiAgICAgICAgLy9kdW1wKHZMaW5lcyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdkxpbmVzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudkxpbmVzLmFwcGVuZENoaWxkKHZMaW5lc1tpXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgImNvbGxhcHNlQnV0dG9uIik7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiZXhwYW5kQnV0dG9uIik7CiAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiX1RyZWVDb2xsYXBzZUJ1dHRvbiIpOwogICAgICAgIHJlbW92ZUNsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgIl9UcmVlRXhwYW5kQnV0dG9uIik7CiAgICAgICAgaWYgKGhhc0NsYXNzTmFtZSh0aGlzLmNvbnRhaW5lciwgImV4cGFuZGFibGUiKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmV4cGFuZGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUodGhpcy5idXR0b24sICJjb2xsYXBzZUJ1dHRvbiIpOwogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiX1RyZWVDb2xsYXBzZUJ1dHRvbiIpOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZSh0aGlzLmJ1dHRvbiwgImV4cGFuZEJ1dHRvbiIpOwogICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHRoaXMuYnV0dG9uLCAiX1RyZWVFeHBhbmRCdXR0b24iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdGhpcy5idXR0b24uc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKk1hdGgucm91bmQoTWF0aC5hYnMoZXh0cmFjdEludChnZXRTdHlsZSh0aGlzLnZMaW5lLCAibWFyZ2luLWxlZnQiKSkpLXRoaXMuYnV0dG9uLm9mZnNldFdpZHRoLXRoaXMuYnV0dG9uLm9mZnNldFdpZHRoLzIpKSsicHgiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgYnV0dG9uT2Zmc2V0ID0gTWF0aC5mbG9vcih0aGlzLmJ1dHRvbi5vZmZzZXRIZWlnaHQvMik7CiAgICAgICAgdmFyIHZMaW5lV2lkdGggPSAodkxpbmVzLmxlbmd0aCA/IHZMaW5lc1swXS5vZmZzZXRXaWR0aCA6IDApOwogICAgICAgIHZhciB3aWR0aCA9IHZMaW5lV2lkdGg7CiAgICAgICAgdmFyIG1hcmdpbiA9IHZMaW5lV2lkdGggKyAodGhpcy5leHBhbmRlZCA/IHZMaW5lV2lkdGggOiAwKTsKICAgICAgICB0aGlzLmhMaW5lLnN0eWxlLndpZHRoID0gd2lkdGgrInB4IjsKICAgICAgICB0aGlzLmhMaW5lLnN0eWxlLm1hcmdpbkxlZnQgPSAoKC0xKSptYXJnaW4pKyJweCI7CiAgICAgICAgdGhpcy5oTGluZS5zdHlsZS5tYXJnaW5Ub3AgPSAodGhpcy52TGluZU1hcmdpbitidXR0b25PZmZzZXQpKyJweCI7CgogICAgICAgIC8vdGhpcy5idXR0b24uc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKih2TGluZVdpZHRoK2J1dHRvbk9mZnNldCkpKyJweCI7CiAgICAgICAgLy90aGlzLmJ1dHRvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gKCgtMSkqKCh0aGlzLmV4cGFuZGVkID8gdkxpbmVXaWR0aCA6IDApK2J1dHRvbk9mZnNldCkpKyJweCI7CiAgICAgICAgdGhpcy5idXR0b24uc3R5bGUubWFyZ2luTGVmdCA9ICgoLTEpKigodGhpcy5leHBhbmRlZCA/IDAgOiAwKStidXR0b25PZmZzZXQpKSsicHgiOwogICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlLm1hcmdpblRvcCA9ICh0aGlzLnZMaW5lTWFyZ2luKSsicHgiOwoKICAgICAgICAvLyAhISEhIQogICAgICAgIC8vdGhpcy5jb250ZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAoKC0xKSoodkxpbmVXaWR0aC1idXR0b25PZmZzZXQpKSsicHgiOwoKICAgICAgICBpZiAoIXNlbGZPbmx5KQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IHRoaXMuaXRlbXNbaV07CiAgICAgICAgICAgICAgICBUcmVlSXRlbS5kcmF3TGluZXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIHRoaXMuZHJhd2luZyA9IGZhbHNlOwogICAgfQogICAgCiAgICAvL3NldFN0eWxlKHRoaXMuY29udGVudCwgIm91dGVyV2lkdGgiLCB0aGlzLnRkLm9mZnNldFdpZHRoLXRoaXMudkxpbmVzLm9mZnNldFdpZHRoKTsKICAgIGlmIChmYWxzZSAmJiAhdGhpcy50ZC5wYXJlbnROb2RlLnN0eWxlKQogICAgewogICAgICAgIHNldFN0eWxlKHRoaXMudGQucGFyZW50Tm9kZSwgIm91dGVySGVpZ2h0IiwgdGhpcy50ZC5vZmZzZXRIZWlnaHQrInB4Iik7CiAgICAgICAgc2V0U3R5bGUodGhpcy5jb250ZW50LCAib3V0ZXJIZWlnaHQiLCB0aGlzLnRkLm9mZnNldEhlaWdodCsicHgiKTsKICAgIH0KfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKQp7CiAgICBoaWRlRWxlbWVudCh0aGlzLmNvbnRhaW5lcik7CiAgICAKICAgIHRoaXMuVHJlZS5yZWRyYXdMaW5lcygpOwp9CgpUVHJlZUl0ZW0ucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpCnsKICAgIHNob3dFbGVtZW50KHRoaXMuY29udGFpbmVyKTsKICAgIAogICAgdGhpcy5UcmVlLnJlZHJhd0xpbmVzKCk7Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUuZ2V0UHJldlNpYmxpbmcgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLlBhcmVudEl0ZW0pCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5QYXJlbnRJdGVtLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IHRoaXMuUGFyZW50SXRlbS5pdGVtc1tpXTsKICAgICAgICAgICAgaWYgKFRyZWVJdGVtID09IHRoaXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybih0aGlzLlBhcmVudEl0ZW0uaXRlbXNbaS0xXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUuZ2V0TmV4dFNpYmxpbmcgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLlBhcmVudEl0ZW0pCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGhpcy5QYXJlbnRJdGVtLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IHRoaXMuUGFyZW50SXRlbS5pdGVtc1tpXTsKICAgICAgICAgICAgaWYgKFRyZWVJdGVtID09IHRoaXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybih0aGlzLlBhcmVudEl0ZW0uaXRlbXNbaSsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KClRUcmVlSXRlbS5wcm90b3R5cGUuZ2V0QWxsQ2hpbGRJdGVtcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIGl0ZW1zID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBpdGVtcy5wdXNoKHRoaXMuaXRlbXNbaV0pOwogICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHRoaXMuaXRlbXNbaV0uZ2V0QWxsQ2hpbGRJdGVtcygpKTsKICAgIH0KICAgIAogICAgcmV0dXJuKGl0ZW1zKTsKfQoKVFRyZWVJdGVtLnByb3RvdHlwZS5nZXRBbGxQYXJlbnRJdGVtcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIGl0ZW1zID0gW107CiAgICAKICAgIHZhciBUcmVlSXRlbSA9IHRoaXM7CiAgICB3aGlsZSh0cnVlKQogICAgewogICAgICAgIFRyZWVJdGVtID0gVHJlZUl0ZW0uUGFyZW50SXRlbTsKICAgICAgICAKICAgICAgICBpZiAoIVRyZWVJdGVtIHx8IFRyZWVJdGVtID09IHRoaXMuVHJlZS5Ub3BJdGVtKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgaXRlbXMucHVzaChUcmVlSXRlbSk7CiAgICB9CgogICAgcmV0dXJuKGl0ZW1zKTsKfQ==LyogLS0tLS0tIGRlZmF1bHQgLS0tLS0tLSAqLwouX1RyZWUgewogICAgbWFyZ2luOiAwcHg7CiAgICBwYWRkaW5nOiAwcHg7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmctbGVmdDogMTBweDsKfQoKLl9UcmVlIHVsIHsKICAgIHBhZGRpbmc6IDBweDsKICAgIG1hcmdpbjogMHB4Owp9CgouX1RyZWUgdWwgewogICAgYm9yZGVyOiAwcHg7Cn0KCi5fVHJlZSBsaSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgY3Vyc29yOiBwb2ludGVyOyAgICAKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouX1RyZWUgbGkgKiB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgouX1RyZWUgbGkuZXhwYW5kYWJsZSB7Cn0KCi5fVHJlZSBsaS5kaXNhYmxlZCBhLCAuX1RyZWUgbGkuZGlzYWJsZWQgLl9UcmVlQnV0dG9uIHsKICAgIG9wYWNpdHk6IDAuNTsKfQoKLl9UcmVlIGEgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouX1RyZWUgLnNlbGVjdGVkID4gYSB7CiAgICBiYWNrZ3JvdW5kOiAjMEQ1Mzg2OwogICAgY29sb3I6ICNGRkZGRkY7Cn0KCi5fVHJlZSBsaTpob3ZlciwgLl9UcmVlIGxpLmhvdmVyLCAuX1RyZWUgbGkuYWN0aXZlIHsKfQoKLyoKLl9UcmVlIC50cmVlSExpbmUgewogICAgYm9yZGVyLXRvcDogMXB4IGRvdHRlZCAjOTk5OTk5OwogICAgaGVpZ2h0OiAxcHg7CiAgICBmbG9hdDogbGVmdDsKICAgIG1hcmdpbi10b3A6IDlweDsKfQoKLl9UcmVlIC50cmVlVkxpbmUgewogICAgYm9yZGVyLWxlZnQ6IDFweCBkb3R0ZWQgIzk5OTk5OTsKICAgIGZsb2F0OiBsZWZ0OwogICAgd2lkdGg6IDFweDsKICAgIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQoKLl9UcmVlIC5leHBhbmRCdXR0b24gewogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1pbWcvcGx1cy5wbmcpOyAKICAgIHdpZHRoOiA5cHg7CiAgICBoZWlnaHQ6IDlweDsKICAgIGZsb2F0OiBsZWZ0OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouX1RyZWUgLmNvbGxhcHNlQnV0dG9uIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9aW1nL21pbnVzLnBuZyk7IAogICAgd2lkdGg6IDlweDsKICAgIGhlaWdodDogOXB4OwogICAgZmxvYXQ6IGxlZnQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5fVHJlZSAubm9CdXR0b24gewogICAgd2lkdGg6IDlweDsKICAgIGhlaWdodDogOXB4OwogICAgZmxvYXQ6IGxlZnQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KKi8KCi5fVHJlZSAuX1RyZWVMaW5lIHsKfQoKLl9UcmVlIC5fVHJlZUhMaW5lIHsKICAgIGJvcmRlci10b3A6IDFweCBkb3R0ZWQgIzk5OTk5OTsKICAgIGhlaWdodDogMXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIG1hcmdpbi10b3A6IDlweDsKfQoKLl9UcmVlIC5fVHJlZVZMaW5lcyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouX1RyZWUgLl9UcmVlVkxpbmUgewogICAgYm9yZGVyLWxlZnQ6IDFweCBkb3R0ZWQgIzk5OTk5OTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICB3aWR0aDogMTVweDsKfQoKLl9UcmVlIC5fVHJlZUJ1dHRvbiB7CiAgICB3aWR0aDogOXB4OwogICAgaGVpZ2h0OiA5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7Cn0KCi5fVHJlZSAuX1RyZWVFeHBhbmRCdXR0b24gewogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1pbWcvcGx1cy5wbmcpOyAKfQoKLl9UcmVlIC5fVHJlZUNvbGxhcHNlQnV0dG9uIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9aW1nL21pbnVzLnBuZyk7IAp9CgouX1RyZWUgLmV4cGFuZGFibGUgLl9UcmVlRXhwYW5kQ29sbGFwc2VCdXR0b24gewogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1pbWcvcGx1cy5wbmcpOyAKfQoKLl9UcmVlIC5leHBhbmRhYmxlLmV4cGFuZGVkIC5fVHJlZUV4cGFuZENvbGxhcHNlQnV0dG9uIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9aW1nL21pbnVzLnBuZyk7IAp9CgouX1RyZWUgewp9CgouX1RyZWUgbGkgaW1nIHsKICAgIG1hcmdpbi1yaWdodDogMnB4Owp9CgouX1RyZWUgbGkgaW5wdXRbdHlwZT1jaGVja2JveF0gewogICAgbWFyZ2luLXJpZ2h0OiAycHg7Cn0KCi5fVHJlZSAuX0NoZWNrQm94ICsgLmJ1dHRvbiB7CiAgICBtYXJnaW4tcmlnaHQ6IDZweDsKfQo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvVHJlZS9UcmVlLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFRUcmVlIGV4dGVuZHMgVENvbXBvbmVudAp7CiAgICB2YXIgJGNvbnRleHRNZW51RW5hYmxlZCA9IHRydWU7CgogICAgdmFyICRpdGVtcyA9IGFycmF5KCk7CiAgICB2YXIgJFRvcEl0ZW0gPSBOVUxMOwogICAgCiAgICB2YXIgJHRyZWVJdGVtQ2xhc3NOYW1lID0gIlRUcmVlSXRlbSI7CiAgICAvKnZhciAkanNDbGFzc05hbWUgPSAiVFRyZWUiOyovCiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX19pbXBsZW1lbnRzKCkKICAgIHsKICAgICAgICByZXR1cm4oYXJyYXkoIkZpZWxkQ29tcG9uZW50IikpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uR2V0UHJvcGVydGllcygpCiAgICB7CiAgICAgICAgcmV0dXJuKG1lcmdlUHJvcGVydGllcyhwYXJlbnQ6Om9uR2V0UHJvcGVydGllcygpLCBhcnJheSggICAgICAgIAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249VmlzdWFsLHBvc2l0aW9uPWZpcnN0IiwKICAgICAgICAibmFtZT13aWR0aCxjYXB0aW9uPVdpZHRoLG9iamVjdD1UZXh0RWRpdCxwb3N0Zml4PXB4fCUiLAogICAgICAgICJuYW1lPWhlaWdodCxjYXB0aW9uPUhlaWdodCxvYmplY3Q9VGV4dEVkaXQscG9zdGZpeD1weHwlIiwKICAgICAgICAibmFtZT10eXBlLGNhcHRpb249VHlwZSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx2ZXJ0aWNhbHxob3Jpem9udGFsIiwKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPURhdGEsYWZ0ZXI9Q29tbW9uIiwKICAgICAgICAibmFtZT1vYmplY3QsY2FwdGlvbj1PYmplY3Qsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAibmFtZT1kYXRhU2V0LGNhcHRpb249RGF0YVNldCxvYmplY3Q9T2JqZWN0RWRpdCIsCiAgICAgICAgIm5hbWU9dG9wSXRlbUlkLGNhcHRpb249VG9wIEl0ZW0gSUQsb2JqZWN0PVRleHRFZGl0IiwKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPUJlaGF2aW9yLGFmdGVyPURhdGEiLAogICAgICAgICJuYW1lPW11bHRpc2VsZWN0LGNhcHRpb249TXVsdGlzZWxlY3Qsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgIm5hbWU9dW5zZWxlY3QsY2FwdGlvbj1VbnNlbGVjdCxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAibmFtZT1zZWxlY3RMZWF2ZXNPbmx5LGNhcHRpb249T25seSBMZWF2ZXMgU2VsZWN0YWJsZSxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPURpc3BsYXkiLAogICAgICAgICJuYW1lPW1heExldmVsLGNhcHRpb249TWF4IExldmVsLG9iamVjdD1TcGluRWRpdCIsCiAgICAgICAgIm5hbWU9c29ydCxjYXB0aW9uPVNvcnQsb2JqZWN0PUNvbWJvQm94LHZhbHVlcz18dHJ1ZXxmYWxzZSIsCiAgICAgICAgLy8ibmFtZT1wYXJlbnRTZWxlY3RlZCxjYXB0aW9uPVBhcmVudCBJdGVtcyBTZWxlY3RlZCxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPUphdmFTY3JpcHQiLAogICAgICAgICJuYW1lPW9uQmVmb3JlQ3JlYXRlRnJvbUh0bWwsY2FwdGlvbj1vbkJlZm9yZUNyZWF0ZUZyb21IdG1sLG9iamVjdD1Db2RlRWRpdCIsCiAgICAgICAgLy8idHlwZT1ncm91cCxjYXB0aW9uPURhdGEiLAogICAgICAgIC8vIm5hbWU9dmFsdWUsY2FwdGlvbj1WYWx1ZSxvYmplY3Q9VGV4dEVkaXQiLAogICAgICAgICkpKTsgICAgICAgIAogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RmllbGRJbmZvKCRwYXJhbXM9YXJyYXkoKSkKICAgIHsKICAgICAgICByZXR1cm4oYXJyYXkoCiAgICAgICAgICAgICJkYXRhVHlwZSIgPT4gIlZBUkNIQVIiLAogICAgICAgICAgICAiZGF0YVR5cGVQYXJhbXMiID0+ICIyNTUiLAogICAgICAgICAgICAiZGVmYXVsdFZhbHVlIiA9PiAiIiwKICAgICAgICApKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkdHJlZUl0ZW1DbGFzc05hbWUpOwogICAgICAgIAogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKICAgICAgICAKICAgICAgICAkVHJlZUl0ZW0gPSBuZXcgJHRoaXMtPnRyZWVJdGVtQ2xhc3NOYW1lOwogICAgICAgICRUcmVlSXRlbS0+dmFsdWVzID0gYXJyYXkoKTsKICAgICAgICAkVHJlZUl0ZW0tPmlkID0gIiI7IC8vID0gLypjcmVhdGVVVUlEKCkqLwogICAgICAgICRUcmVlSXRlbS0+cGFyZW50ID0gIiI7CiAgICAgICAgJFRyZWVJdGVtLT5Db250YWluZXIgPSAkdGhpczsKICAgICAgICAkVHJlZUl0ZW0tPmxldmVsID0gLTE7CgogICAgICAgIC8vJHRoaXMtPml0ZW1zWyIiXSA9ICRUcmVlSXRlbTsKICAgICAgICAkdGhpcy0+VG9wSXRlbSA9ICRUcmVlSXRlbTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gb25HZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCFoZWFkSHRtbEFkZGVkKF9fQ0xBU1NfXywgJHBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICBwYXJlbnQ6Om9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgICAgIFRDaGVja0JveDo6b25HZXRIZWFkSHRtbCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L1RyZWUvVHJlZS5jbGFzcy5qcyc+PC9zY3JpcHQ+Iix0cnVlKTsKICAgICAgICAgICAgYWRkSGVhZEh0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9J2luc3RhbGwucGhwP2luY2x1ZGU9L2NvcmUvY2xhc3Nlcy9fbmV3L1RyZWUvVHJlZUl0ZW0uY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7CiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8bGluayBocmVmPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9UcmVlL1RyZWUuY2xhc3MuY3NzJyByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJyAvPiIsdHJ1ZSk7CiAgICAgICAgICAgIGFkZEV4dGVuZGluZ0hlYWRIdG1sKCRwYXJhbXMsIF9fQ0xBU1NfXyk7CiAgICAgICAgICAgIFRMb2FkaW5nQW5pbWF0aW9uOjpvbkdldEhlYWRIdG1sKCRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvbkdldENvbnRlbnQoJiRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiKQogICAgewogICAgICAgICRwYXJhbXMgPSAkdGhpcy0+ZXh0cmFjdFBhcmFtcygkcGFyYW1zKTsKICAgICAgICAkdGhpcy0+Z2V0SGVhZEh0bWwoJHBhcmFtcyk7CgogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAKICAgICAgICBpZiAoIXRvU3RyaW5nKCR2YWx1ZSkpCiAgICAgICAgICAgICR2YWx1ZSA9ICRwYXJhbXNbInZhbHVlIl07CiAgICAgICAgCiAgICAgICAgJHZhbHVlcyA9ICR2YWx1ZTsKICAgICAgICBpZiAoIWlzX2FycmF5KCR2YWx1ZXMpKQogICAgICAgICAgICAkdmFsdWVzID0gZXhwbG9kZSgifCIsICR2YWx1ZXMpOwogICAgICAgICRwYXJhbXNbInZhbHVlcyJdID0gJHZhbHVlczsKICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXMpOwogICAgICAgIAogICAgICAgICR0aGlzLT5pbml0KCRwYXJhbXMpOwogICAgICAgIAogICAgICAgIGlmICghJHBhcmFtc1siY29udGFpbmVyIl0pCiAgICAgICAgewogICAgICAgICAgICAkY29udGFpbmVySWQgPSAiVHJlZUNvbnRhaW5lcl8iLiR0aGlzLT5pZDsKICAgICAgICAgICAgJHBhcmFtc1siY29udGFpbmVyIl0gPSAkY29udGFpbmVySWQ7CiAgICAgICAgfQogICAgICAgIGlmICghJHBhcmFtc1siY2xhc3MiXSkKICAgICAgICAgICAgJHBhcmFtc1siY2xhc3MiXSA9ICJUcmVlIjsKCiAgICAgICAgaWYgKCRwYXJhbXNbIm9iamVjdCJdKQogICAgICAgICAgICAkVHJlZSA9IGdldE9iamVjdCgkcGFyYW1zWyJvYmplY3QiXSk7CiAgICAgICAgZWxzZSBpZiAoJHBhcmFtc1siZGF0YVNldCJdKQogICAgICAgIHsKICAgICAgICAgICAgJERhdGFTZXQgPSBnZXRPYmplY3QoJHBhcmFtc1siZGF0YVNldCJdKTsKICAgICAgICAgICAgJHRoaXMtPmdlbmVyYXRlRnJvbUFycmF5KCREYXRhU2V0LT5yZWNvcmRzLCAiaWQiLCAicGFyZW50Iik7CiAgICAgICAgICAgICRUcmVlID0gJHRoaXM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgJFRyZWUgPSAkdGhpczsKICAgICAgICAgICAgCiAgICAgICAgJGpzUGFyYW1zID0gJHBhcmFtczsKICAgICAgICAvL3Zhcl9kdW1wKCRqc1BhcmFtcyk7CiAgICAgICAgLy9kdW1wKGdldEpzUGFyYW1zKCRqc1BhcmFtcykpOwogICAgICAgIAogICAgICAgICR0aGlzLT5Ub3BJdGVtID0gJFRyZWUtPlRvcEl0ZW07CiAgICAgICAgJHRoaXMtPlRvcEl0ZW0tPmlkID0gJHBhcmFtc1sidG9wSXRlbUlkIl07CiAgICAgICAgCgogICAgICAgIC8vZHVtcCgkVHJlZSk7CiAgICAgICAgaWYgKCRUcmVlKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGNvdW50KCRUcmVlLT5Ub3BJdGVtLT5pdGVtcykpOwogICAgICAgICAgICAkaHRtbCAuPSAkdGhpcy0+Z2V0VHJlZUh0bWwoJHBhcmFtcywgJFRyZWUtPlRvcEl0ZW0sIHRydWUpOwogICAgICAgICAgICAvL2R1bXAoaW1wbG9kZSgifCIsICR2YWx1ZXMpKTsKICAgICAgICAgICAgJGh0bWwgLj0gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9JyIuJHRoaXMtPm5hbWUuIicgaWQ9JyIuJHRoaXMtPmlkLiInIHZhbHVlPSciLmltcGxvZGUoInwiLCAkdmFsdWVzKS4iJyBjbGFzcz0nIi4oJHBhcmFtc1siY2hpbGRDb21wb25lbnQiXSA/ICJjaGlsZENvbXBvbmVudCIgOiAiIikuIicgLz4iOwogICAgICAgICAgICAvL2R1bXAoJGh0bWwpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGpzIC49ICJ2YXIgIi4kdGhpcy0+anNPYmplY3ROYW1lLiIgPSBuZXcgIi4kdGhpcy0+anNDbGFzc05hbWUuIigiLiR0aGlzLT5nZXRKc1BhcmFtcygkanNQYXJhbXMpLiIsICciLiR0aGlzLT5pZC4iJyk7IFxuIjsKCiAgICAgICAgICAgICRodG1sIC49ICR0aGlzLT5nZXRKYXZhU2NyaXB0SHRtbCgkanMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0VHJlZUh0bWwoJHBhcmFtcz1hcnJheSgpLCAkUGFyZW50VHJlZUl0ZW0sICR1c2VTdHlsZT1mYWxzZSkKICAgIHsKICAgICAgICAvL2lmICgkdXNlU3R5bGUpCiAgICAgICAgLy8gICAgZHVtcCgkcGFyYW1zWyJzdHlsZSJdKTsKICAgICAgICAvL2R1bXAoJHBhcmFtcyk7CiAgICAgICAgLy9kdW1wKCRQYXJlbnRUcmVlSXRlbSA9PSAkdGhpcy0+VG9wSXRlbSk7CiAgICAgICAgLy9kdW1wKCR0aGlzLT5Ub3BJdGVtICE9IE5VTEwpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zWyJtYXhMZXZlbCJdKTsKICAgICAgICAvL2R1bXAoJFBhcmVudFRyZWVJdGVtLT5nZXRUcmVlTGV2ZWwoKSk7CiAgICAgICAgaWYgKCRwYXJhbXNbIm1heExldmVsIl0gIT0gIiIgJiYgJFBhcmVudFRyZWVJdGVtLT5nZXRUcmVlTGV2ZWwoKSA+PSAkcGFyYW1zWyJtYXhMZXZlbCJdKQogICAgICAgICAgICByZXR1cm4oIiIpOwogICAgICAgICAgICAKICAgICAgICAkaHRtbCAuPSAiPHVsIGNsYXNzPSciLigkUGFyZW50VHJlZUl0ZW0gPT0gJHRoaXMtPlRvcEl0ZW0gPyAkcGFyYW1zWyJjbGFzcyJdIDogIiIpLiInIGlkPSciLigkcGFyYW1zWyJjb250YWluZXIiXSA/ICRwYXJhbXNbImNvbnRhaW5lciJdIDogJHRoaXMtPmlkKS4iJyAiLigkdXNlU3R5bGUgPyAic3R5bGU9JyIuZ2V0Q1NTUGFyYW1zKCRwYXJhbXMpLiInIiA6ICIiKS4iPlxuIjsKICAgICAgICBmb3JlYWNoKCRQYXJlbnRUcmVlSXRlbS0+aXRlbXMgYXMgJFRyZWVJdGVtKQogICAgICAgIHsKICAgICAgICAgICAgJGh0bWwgLj0gJHRoaXMtPm9uR2V0SXRlbUh0bWwoJFRyZWVJdGVtLCAkcGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgJGh0bWwgLj0gIjwvdWw+XG4iOwoKICAgICAgICAvLyBjbGVhbiBlbXB0eSBsaW5rcwogICAgICAgICRodG1sID0gc3RyX3JlcGxhY2UoImhyZWY9XCJcIiIsICIiLCAkaHRtbCk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gb25HZXRJdGVtVGV4dEh0bWwoJFRyZWVJdGVtLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKHN0cnBvcygkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1sibmFtZSJdLCAiPGEiKSA9PT0gRkFMU0UpCiAgICAgICAgICAgICRodG1sIC49ICI8YT4iOwogICAgICAgIAogICAgICAgICRodG1sIC49ICRUcmVlSXRlbS0+cmVjb3JkVmFsdWVzWyJuYW1lIl07CgogICAgICAgIGlmIChzdHJwb3MoJFRyZWVJdGVtLT5yZWNvcmRWYWx1ZXNbIm5hbWUiXSwgIjxhIikgPT09IEZBTFNFKQogICAgICAgICAgICAkaHRtbCAuPSAiPC9hPiI7CgogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0SXRlbUh0bWwoJFRyZWVJdGVtLCAkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCEkcGFyYW1zWyJ2YWx1ZXMiXSkKICAgICAgICAgICAgJHBhcmFtc1sidmFsdWVzIl0gPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1sibmFtZSJdKTsKICAgICAgICAvL2R1bXAoJHBhcmFtc1sibXVsdGlzZWxlY3QiXSk7CiAgICAgICAgLy8kaHRtbCAuPSAiPGxpIGNsYXNzPSciLihjb3VudCgkVHJlZUl0ZW0tPml0ZW1zKSB8fCAkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siX2hhc0NoaWxkSXRlbXMiXSA/ICJleHBhbmRhYmxlIiA6ICIiKS4oY291bnQoJFRyZWVJdGVtLT5pdGVtcykgPyAiIGV4cGFuZGVkIiA6ICIiKS4oaW5fYXJyYXkoJFRyZWVJdGVtLT5yZWNvcmRWYWx1ZXNbImlkIl0sICRwYXJhbXNbInZhbHVlcyJdKSA/ICIgc2VsZWN0ZWQiIDogIiIpLiInICI7CiAgICAgICAgLy9kdW1wKCRUcmVlSXRlbS0+cmVjb3JkVmFsdWVzKTsKICAgICAgICAkaHRtbCAuPSAiPGxpIGNsYXNzPSciLihjb3VudCgkVHJlZUl0ZW0tPml0ZW1zKSB8fCAkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siX2hhc0NoaWxkSXRlbXMiXSA/ICJleHBhbmRhYmxlIiA6ICIiKS4oKCRwYXJhbXNbIm1heExldmVsIl0gPT0gIiIgfHwgJFRyZWVJdGVtLT5nZXRUcmVlTGV2ZWwoKSA8ICRwYXJhbXNbIm1heExldmVsIl0pICYmIGNvdW50KCRUcmVlSXRlbS0+aXRlbXMpID8gIiBleHBhbmRlZCIgOiAiIikuKGluX2FycmF5KCRUcmVlSXRlbS0+cmVjb3JkVmFsdWVzWyJpZCJdLCAkcGFyYW1zWyJ2YWx1ZXMiXSkgPyAiIHNlbGVjdGVkIiA6ICIiKS4oJFRyZWVJdGVtLT5yZWNvcmRWYWx1ZXNbIl9kaXNhYmxlZCJdID8gIiBkaXNhYmxlZCIgOiAiIikuIicgIjsgICAgLy8gREFUQQogICAgICAgIC8vIHBva3VkIGplIHByYXpkbmEgaG9kbm90YSwgdGFrIHNpIHRhbSBJRS9FZGdlIGRvcGxuaSAxIC0gb21nCiAgICAgICAgJGh0bWwgLj0gIl92YWx1ZT0nIi4kVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siaWQiXS4iJyAiOwogICAgICAgIGlmICgkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siZGF0YSJdKQogICAgICAgICAgICAkaHRtbCAuPSAiZGF0YT0nIi5faHRtbGVudGl0aWVzKFRKU09OOjplbmNvZGUoJFRyZWVJdGVtLT5yZWNvcmRWYWx1ZXNbImRhdGEiXSkpLiInICI7CiAgICAgICAgLyokaHRtbCAuPSAidGl0bGU9JyIuJFRyZWVJdGVtLT5yZWNvcmRWYWx1ZXNbIm5hbWUiXS4iJyAiOyovCiAgICAgICAgJGh0bWwgLj0gIj4iOwogICAgICAgIGlmICgkcGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgICAgICAkaHRtbCAuPSAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyB2YWx1ZT0nIi4kVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siaWQiXS4iJyAiLihpbl9hcnJheSgkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siaWQiXSwgJHBhcmFtc1sidmFsdWVzIl0pID8gImNoZWNrZWQ9J2NoZWNrZWQnIiA6ICIiKS4iIC8+IjsKICAgICAgICAkaHRtbCAuPSAkdGhpcy0+b25HZXRJdGVtVGV4dEh0bWwoJFRyZWVJdGVtLCAkcGFyYW1zKTsKICAgICAgICBpZiAoY291bnQoJFRyZWVJdGVtLT5pdGVtcykpCiAgICAgICAgewogICAgICAgICAgICAkcGFyYW1zMiA9ICRwYXJhbXM7CiAgICAgICAgICAgICRwYXJhbXMyWyJ2aXNpYmxlQ2xhc3MiXSA9ICRwYXJhbXNbInZpc2libGVDbGFzcyJdOwogICAgICAgICAgICAkcGFyYW1zMlsiaGlkZGVuQ2xhc3MiXSA9ICRwYXJhbXNbImhpZGRlbkNsYXNzIl07CiAgICAgICAgICAgIGlmICgkcGFyYW1zWyJ2aXNpYmxlQ2xhc3MiXSAmJiAkcGFyYW1zWyJoaWRkZW5DbGFzcyJdKQogICAgICAgICAgICAgICAgJHBhcmFtczJbImNsYXNzIl0gLj0gIiAiLiRwYXJhbXNbInZpc2libGVDbGFzcyJdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkcGFyYW1zMlsiZGlzcGxheSJdID0gIm5vbmUiOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRodG1sIC49ICR0aGlzLT5nZXRUcmVlSHRtbCgkcGFyYW1zMiwgJFRyZWVJdGVtKTsKICAgICAgICB9CiAgICAgICAgJGh0bWwgLj0gIjwvbGk+XG4iOwogICAgICAgIAogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9ICAgIAoKCiAgICBmdW5jdGlvbiBfc29ydEZ1bmN0aW9uKCRJdGVtMSwgJEl0ZW0yKQogICAgewogICAgICAgIGlmICgkSXRlbTEtPnZhbHVlc1skdGhpcy0+c29ydEJ5RmllbGRdID4gJEl0ZW0yLT52YWx1ZXNbJHRoaXMtPnNvcnRCeUZpZWxkXSkKICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgIGVsc2UgaWYgKCRJdGVtMS0+dmFsdWVzWyR0aGlzLT5zb3J0QnlGaWVsZF0gPCAkSXRlbTItPnZhbHVlc1skdGhpcy0+c29ydEJ5RmllbGRdKQogICAgICAgICAgICByZXR1cm4oLTEpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKDApOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBzb3J0QnkoJGZpZWxkTmFtZSwgJFBhcmVudEl0ZW09TlVMTCkKICAgIHsKICAgICAgICAkdGhpcy0+c29ydEJ5RmllbGQgPSAkZmllbGROYW1lOwogICAgICAgIAogICAgICAgIGlmICghJFBhcmVudEl0ZW0pCiAgICAgICAgICAgICRQYXJlbnRJdGVtID0gJHRoaXMtPlRvcEl0ZW07CiAgICAgICAgICAgIAogICAgICAgIHVzb3J0KCRQYXJlbnRJdGVtLT5pdGVtcywgYXJyYXkoJHRoaXMsICJfc29ydEZ1bmN0aW9uIikpOwogICAgICAgIGZvcmVhY2goJFBhcmVudEl0ZW0tPml0ZW1zIGFzICRJdGVtKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnNvcnRCeSgkZmllbGROYW1lLCAkSXRlbSk7CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgCiAgICBmdW5jdGlvbiBhZGRJdGVtc0Zyb21BcnJheSgkcmVjb3JkcywgJGlkRmllbGROYW1lLCAkcGFyZW50RmllbGROYW1lLCAkcGFyZW50KQogICAgewogICAgICAgIGdsb2JhbCAkX190cmVlQWRkSXRlbXNGcm9tQXJyYXlMb29wOwogICAgICAgIAogICAgICAgIGlmICghaXNfYXJyYXkoJHBhcmVudCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoLyokcGFyZW50ID09ICIiIHx8ICovJHBhcmVudCA9PSAkdGhpcy0+VG9wSXRlbS0+aWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmb3JSb290ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+VG9wSXRlbS0+aWQpCiAgICAgICAgICAgICAgICAgICAgJHBhcmVudCA9IGFycmF5KCRwYXJlbnQpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRwYXJlbnQgPSBhcnJheSgkdGhpcy0+VG9wSXRlbS0+aWQsIE5VTEwsICIiLCAwLCAiMCIpOyAvLyBub3Qgc3RyaWN0IAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRwYXJlbnQgPSBhcnJheSgkcGFyZW50KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9pZiAoJHBhcmVudCAhPSAiIikKICAgICAgICAvLyAgICRfX3RyZWVBZGRJdGVtc0Zyb21BcnJheUxvb3ArKzsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHJlY29yZHMpOwogICAgICAgIGZvcmVhY2goJHJlY29yZHMgYXMgJGtleSA9PiAkcmVjb3JkVmFsdWVzKQogICAgICAgIHsKICAgICAgICAgICAgLy8gdSBGaWxlQ2xvdWQgVHJlZSBjaGNpIG1pdCBwcmF6ZG5vdSBpZCB1IGhvbWUKICAgICAgICAgICAgaWYgKCEkdGhpcy0+VG9wSXRlbS0+aWQgJiYgISRyZWNvcmRWYWx1ZXNbJGlkRmllbGROYW1lXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlY29yZFZhbHVlc1skaWRGaWVsZE5hbWVdID0gVVVJRCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2lmICgkX190cmVlQWRkSXRlbXNGcm9tQXJyYXlMb29wID4gMTAwMCkgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICAvL3Nob3dNZXNzYWdlKCJUVHJlZTo6YWRkSXRlbXNGcm9tQXJyYXkoKSBsb29wLCBza2lwcGluZy4uLiIsIG10RXJyb3IpOwogICAgICAgICAgICAgICAgLy9leGl0OyByZXR1cm47CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAKICAgICAgICAgICAgLy9kdW1wKCRwYXJlbnQpOwogICAgICAgICAgICAvL2R1bXAoJHJlY29yZFZhbHVlc1skcGFyZW50RmllbGROYW1lXSk7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkcmVjb3JkVmFsdWVzWyRwYXJlbnRGaWVsZE5hbWVdLCAkcGFyZW50LCB0cnVlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGlzUm9vdEl0ZW0gPSAkZm9yUm9vdC8qICYmICgkcmVjb3JkVmFsdWVzWyRwYXJlbnRGaWVsZE5hbWVdID09ICIiIHx8ICRyZWNvcmRWYWx1ZXNbJHBhcmVudEZpZWxkTmFtZV0gPT0gIjAiIHx8ICRyZWNvcmRWYWx1ZXNbJHBhcmVudEZpZWxkTmFtZV0gPT0gMCkqLzsKICAgICAgICAgICAgICAgIC8vZHVtcCgkaXNSb290SXRlbSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRUcmVlSXRlbSA9IG5ldyAkdGhpcy0+dHJlZUl0ZW1DbGFzc05hbWU7CiAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPnZhbHVlcyA9ICRyZWNvcmRWYWx1ZXM7CiAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPnJlY29yZFZhbHVlcyA9ICRyZWNvcmRWYWx1ZXM7CiAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPmlkID0gJHJlY29yZFZhbHVlc1skaWRGaWVsZE5hbWVdOwogICAgICAgICAgICAgICAgLy8kVHJlZUl0ZW0tPnBhcmVudCA9ICgkaXNSb290SXRlbSA/ICIiIDogJHJlY29yZFZhbHVlc1skcGFyZW50RmllbGROYW1lXSk7CiAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPnBhcmVudCA9ICRyZWNvcmRWYWx1ZXNbJHBhcmVudEZpZWxkTmFtZV07CiAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPkNvbnRhaW5lciA9ICR0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPml0ZW1zWyRUcmVlSXRlbS0+aWRdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHUgRmlsZUNsb3VkIFRyZWUgY2hjaSBtaXQgcHJhemRub3UgaWQgdSBob21lCiAgICAgICAgICAgICAgICAgICAgLy9pZiAoJFRyZWVJdGVtLT5pZCA9PSAiIikKICAgICAgICAgICAgICAgICAgICAvLyAgICAkVHJlZUl0ZW0tPmlkID0gVVVJRCgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPm9uTG9hZCgkcmVjb3JkVmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCRpc1Jvb3RJdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAkUGFyZW50SXRlbSA9ICR0aGlzLT5Ub3BJdGVtOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmVudEl0ZW0gPSAkdGhpcy0+Z2V0SXRlbUJ5SWQoJFRyZWVJdGVtLT5wYXJlbnQpOwoKICAgICAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPmxldmVsID0gJFBhcmVudEl0ZW0tPmxldmVsKzE7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJlbnRJdGVtKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlY29yZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2V4aXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAkUGFyZW50SXRlbS0+aXRlbXNbXSA9ICRUcmVlSXRlbTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRyZWVJdGVtLT5QYXJlbnRJdGVtID0gJFBhcmVudEl0ZW07CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdG8gYWxsSXRlbXMKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPml0ZW1zWyRUcmVlSXRlbS0+aWRdID0gJFRyZWVJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCRUcmVlSXRlbS0+aWQpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YWRkSXRlbXNGcm9tQXJyYXkoJHJlY29yZHMsICRpZEZpZWxkTmFtZSwgJHBhcmVudEZpZWxkTmFtZSwgJFRyZWVJdGVtLT5pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRyZWNvcmRzWyRrZXldKTsKICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgCiAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgLy8gICAgc2hvd01lc3NhZ2UoIlRUcmVlOiBwYXJlbnQgbm90IGZvdW5kIiwgbXRXYXJuaW5nKTsKICAgICAgICAgICAgICAgICAgICAvLyAgICBkdW1wKCRyZWNvcmRWYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChGQUxTRSAmJiBpc0RldmVsb3BlcigpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfZHVtcCgkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1sibmFtZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9leGl0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPml0ZW1zWyRUcmVlSXRlbS0+aWRdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJJdGVtICIuJFRyZWVJdGVtLT5pZC4iICgiLiRUcmVlSXRlbS0+cmVjb3JkVmFsdWVzWyJuYW1lIl0uIikgYWxyZWFkeSBsb2FkZWQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2R1bXAoJHJlY29yZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAieCI7IGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9pZiAoJHBhcmVudCA9PSAiIikKICAgICAgICAvLyAgICAkX190cmVlQWRkSXRlbXNGcm9tQXJyYXlMb29wID0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBnZW5lcmF0ZUZyb21BcnJheSgkcmVjb3JkcywgJGlkRmllbGROYW1lPSJpZCIsICRwYXJlbnRGaWVsZE5hbWU9InBhcmVudCIsICRjbGVhcj10cnVlKQogICAgewogICAgICAgIGlmICgkY2xlYXIpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+Y2xlYXIoKTsKICAgICAgICB9CgogICAgICAgIC8vJFRyZWVJdGVtID0gbmV3ICR0aGlzLT50cmVlSXRlbUNsYXNzTmFtZTsKICAgICAgICAvLyRUcmVlSXRlbS0+dmFsdWVzID0gYXJyYXkoKTsKICAgICAgICAvLyRUcmVlSXRlbS0+aWQ7IC8vID0gLypjcmVhdGVVVUlEKCkqLwogICAgICAgIC8vJFRyZWVJdGVtLT5pZCA9ICIiOwogICAgICAgIC8vJFRyZWVJdGVtLT5wYXJlbnQgPSAiIjsKICAgICAgICAvLyRUcmVlSXRlbS0+Q29udGFpbmVyID0gJHRoaXM7CiAgICAgICAgLy8kVHJlZUl0ZW0tPmxldmVsID0gLTE7CgogICAgICAgIC8vJHRoaXMtPml0ZW1zWyRUcmVlSXRlbS0+aWRdID0gJFRyZWVJdGVtOwogICAgICAgIC8vJHRoaXMtPlRvcEl0ZW0gPSAkVHJlZUl0ZW07CiAgICAgICAgLy9kdW1wKCRyZWNvcmRzKTsKICAgICAgICAvL3Zhcl9kdW1wKCRyZWNvcmRzKTsKICAgICAgICAvL2R1bXAoJHRoaXMtPlRvcEl0ZW0tPmlkKTsKICAgICAgICAvL2R1bXAoJHBhcmVudEZpZWxkTmFtZSk7CiAgICAgICAgLy9kdW1wKCRyZWNvcmRzKTsKICAgICAgICAkdGhpcy0+YWRkSXRlbXNGcm9tQXJyYXkoJHJlY29yZHMsICRpZEZpZWxkTmFtZSwgJHBhcmVudEZpZWxkTmFtZSwgJHRoaXMtPlRvcEl0ZW0tPmlkKTsgICAgICAgICAgICAKICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5pZCk7CiAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgLy9kdW1wKGNvdW50KCR0aGlzLT5Ub3BJdGVtLT5pdGVtcykpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRJdGVtQnlJZCgkaWQpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pdGVtc1skaWRdKQogICAgICAgICAgICByZXR1cm4oJHRoaXMtPml0ZW1zWyRpZF0pOwoKICAgICAgICAvL2lmICgkdGhpcy0+VG9wSXRlbS0+aWQgPT0gJGlkKQogICAgICAgIC8vICAgIHJldHVybigkdGhpcy0+VG9wSXRlbSk7CgogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SXRlbUJ5VGlkKCR0aWQpCiAgICB7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+aXRlbXMgYXMgJEl0ZW0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoJEl0ZW0tPnZhbHVlc1sidGlkIl0gPT0gJHRpZCkgICAgCiAgICAgICAgICAgICAgICByZXR1cm4oJEl0ZW0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2lmICgkdGhpcy0+VG9wSXRlbS0+dmFsdWVzWyJ0aWQiXSA9PSAkdGlkKQogICAgICAgIC8vICAgIHJldHVybigkdGhpcy0+VG9wSXRlbSk7CgogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRBbGxJdGVtcygpCiAgICB7CiAgICAgICAgLy9kdW1wKGNvdW50KCR0aGlzLT5pdGVtcykpOwogICAgICAgICRpdGVtcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+aXRlbXMgYXMgJFRyZWVJdGVtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRUcmVlSXRlbS0+aWQgIT0gIiIpIC8vIGV4Y2x1ZGUgdG9wIGl0ZW0KICAgICAgICAgICAgICAgICRpdGVtc1skVHJlZUl0ZW0tPmlkXSA9ICRUcmVlSXRlbTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRpdGVtcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZW0oKQogICAgewogICAgICAgICRUcmVlSXRlbSA9IG5ldyAkdGhpcy0+dHJlZUl0ZW1DbGFzc05hbWU7CiAgICAgICAgJFRyZWVJdGVtLT52YWx1ZXMgPSBhcnJheSgpOwogICAgICAgICRUcmVlSXRlbS0+aWQgPSBVVUlEKCk7CiAgICAgICAgJFRyZWVJdGVtLT5Db250YWluZXIgPSAkdGhpczsKICAgICAgICAKICAgICAgICAkdGhpcy0+aXRlbXNbJFRyZWVJdGVtLT5pZF0gPSAkVHJlZUl0ZW07CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRUcmVlSXRlbSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldEl0ZW1CeVZhbHVlKCRuYW1lLCAkdmFsdWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+aXRlbXMgYXMgJFRyZWVJdGVtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRUcmVlSXRlbS0+dmFsdWVzWyRuYW1lXSA9PSAkdmFsdWUpCiAgICAgICAgICAgICAgICByZXR1cm4oJFRyZWVJdGVtKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9pZiAoJHRoaXMtPlRvcEl0ZW0tPnZhbHVlc1skbmFtZV0gPT0gJHZhbHVlKQogICAgICAgIC8vICAgIHJldHVybigkdGhpcy0+VG9wSXRlbSk7CgogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2V0SXRlbUJ5TmFtZSgkbmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoKCR0aGlzLT5pdGVtcyBhcyAkVHJlZUl0ZW0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoJFRyZWVJdGVtLT5uYW1lID09ICRuYW1lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4oJFRyZWVJdGVtKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9pZiAoJHRoaXMtPlRvcEl0ZW0tPm5hbWUgPT0gJG5hbWUpCiAgICAgICAgLy8gICAgcmV0dXJuKCR0aGlzLT5Ub3BJdGVtKTsKICAgICAgICAKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGdldFRlc3RQYXJhbXMoJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgICRwYXJhbXMgPSBhcnJheV9tZXJnZShhcnJheSgKICAgICAgICAgICAgIm9iamVjdCIgPT4gIk1lbnUiLAogICAgICAgICAgICAic3R5bGUiID0+ICJ3aWR0aDoyMDBweDtoZWlnaHQ6MzAwcHg7IiwKICAgICAgICApLCAkcGFyYW1zKTsKICAgICAgICAKICAgICAgICByZXR1cm4oJHBhcmFtcyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uR2V0REJWYWx1ZSgkYmVmb3JlUmVjb3JkVmFsdWVzPWFycmF5KCksICYkYWZ0ZXJSZWNvcmRWYWx1ZXM9YXJyYXkoKSwgJGFjdGlvblR5cGU9IiIpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJGJlZm9yZVJlY29yZFZhbHVlc1skdGhpcy0+bmFtZV07CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkdmFsdWUpOwogICAgICAgIC8vZXhpdDsKICAgICAgICBpZiAoX2lzX2FycmF5KCR2YWx1ZSkpCiAgICAgICAgICAgICR2YWx1ZSA9IGltcGxvZGUoInwiLCAkdmFsdWUpOwogICAgICAgIAogICAgICAgIHJldHVybigkdmFsdWUpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBvbkdldERpc3BsYXlWYWx1ZSgkcmVjb3JkVmFsdWVzKQogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5nZXRWYWx1ZSgkcmVjb3JkVmFsdWVzKTsKICAgICAgICAkdmFsdWVzID0gZXhwbG9kZUxpc3QoJHZhbHVlKTsKICAgICAgICAKICAgICAgICAkdGhpcy0+dmFsdWVzID0gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidmFsdWVzIl0pOwogICAgICAgICR0aGlzLT50ZXh0cyA9ICgkdGhpcy0+cGFyYW1zWyJ0ZXh0cyJdID8gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sidGV4dHMiXSkgOiAkdGhpcy0+dmFsdWVzKTsKICAgICAgICAkdGhpcy0+bGFiZWxzID0gKCR0aGlzLT5wYXJhbXNbImxhYmVscyJdID8gZXhwbG9kZUxpc3QoJHRoaXMtPnBhcmFtc1sibGFiZWxzIl0pIDogJHRoaXMtPnRleHRzKTsKICAgICAgICAKICAgICAgICAkX3RleHRzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCR2YWx1ZXMgYXMgJHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgJGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAoJGkgPSAwIDsgJGkgPCBjb3VudCgkdGhpcy0+dmFsdWVzKSA7ICRpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dmFsdWVzWyRpXSA9PSAkdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJF90ZXh0c1tdID0gKCRwYXJhbXNbInRyYW5zbGF0ZSJdID8gdHJhbnNsYXRlKCR0aGlzLT50ZXh0c1skaV0pIDogJHRoaXMtPnRleHRzWyRpXSk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISRmb3VuZCkKICAgICAgICAgICAgICAgICRfdGV4dHNbXSA9ICgkcGFyYW1zWyJ0cmFuc2xhdGUiXSA/IHRyYW5zbGF0ZSgkdmFsdWUpIDogJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuKGltcGxvZGUoIiwgIiwgJF90ZXh0cykpOwogICAgfSAgICAKICAgIAogICAgZnVuY3Rpb24gY2xlYXIoKQogICAgewogICAgICAgICR0aGlzLT5Ub3BJdGVtLT5pdGVtcyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPml0ZW1zID0gYXJyYXkoKTsKICAgIH0gICAgCiAgICAKICAgIGZ1bmN0aW9uIHRvQXJyYXkoJHZhcmlhYmxlTmFtZT0iIikKICAgIHsKICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCR0aGlzLT5Ub3BJdGVtLT5pdGVtcyBhcyAkVHJlZUl0ZW0pCiAgICAgICAgewogICAgICAgICAgICAkcmV0W10gPSAkVHJlZUl0ZW0tPmFzQXJyYXkoJHZhcmlhYmxlTmFtZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZnJvbUFycmF5KCRhcnJheSwgJGlkVmFyaWFibGVOYW1lPSIiLCAkUGFyZW50SXRlbT1OVUxMKQogICAgewogICAgICAgIGlmICghJFBhcmVudEl0ZW0pCiAgICAgICAgICAgICRQYXJlbnRJdGVtID0gJHRoaXMtPlRvcEl0ZW07CiAgICAgICAgCiAgICAgICAgaWYgKCFpc19hcnJheSgkYXJyYXkpKQogICAgICAgICAgICAkYXJyYXkgPSBhcnJheSgpOwogICAgICAgICAgICAKICAgICAgICBmb3JlYWNoKCRhcnJheSBhcyAkaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgICRUcmVlSXRlbSA9ICR0aGlzLT5jcmVhdGVJdGVtKCk7CiAgICAgICAgICAgICRUcmVlSXRlbS0+dmFsdWVzID0gJGl0ZW07CiAgICAgICAgICAgICRUcmVlSXRlbS0+bmFtZSA9ICRpdGVtWyJuYW1lIl07CiAgICAgICAgICAgIGlmICgkaWRWYXJpYWJsZU5hbWUpCiAgICAgICAgICAgICAgICAkVHJlZUl0ZW0tPmlkID0gJGl0ZW1bJGlkVmFyaWFibGVOYW1lXTsKCiAgICAgICAgICAgICRQYXJlbnRJdGVtLT5hZGRDaGlsZCgkVHJlZUl0ZW0pOwogICAgICAgICAgICAKICAgICAgICAgICAgJHRoaXMtPmZyb21BcnJheSgkaXRlbVsiaXRlbXMiXSwgJGlkVmFyaWFibGVOYW1lLCAkVHJlZUl0ZW0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKCR0aGlzLT5Ub3BJdGVtLT5pdGVtcyBhcyAkVHJlZUl0ZW0pCiAgICAgICAgewogICAgICAgICAgICAkcmV0W10gPSAkVHJlZUl0ZW0tPmFzQXJyYXkoJHZhcmlhYmxlTmFtZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybigkcmV0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRMZWFmTGlzdCgkb25seVZhbHVlRmllbGROYW1lPSIiKQogICAgewogICAgICAgIHJldHVybigkdGhpcy0+VG9wSXRlbS0+Z2V0TGVhZkxpc3QoJG9ubHlWYWx1ZUZpZWxkTmFtZSkpOwogICAgfQogICAgCn07CgoKLy8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvVHJlZS9UcmVlSXRlbS5jbGFzcy5waHAgLS0tLS0tLSANCg0KY2xhc3MgVFRyZWVJdGVtIGV4dGVuZHMgVE9iamVjdA0Kew0KICAgIHZhciAkaWQ7DQogICAgdmFyICRwYXJlbnQ7DQogICAgdmFyICR2YWx1ZXM7DQogICAgdmFyICRsZXZlbCA9IE5VTEw7DQogICAgDQogICAgdmFyICRpdGVtcyA9IGFycmF5KCk7DQogICAgdmFyICRQYXJlbnRJdGVtID0gTlVMTDsNCiAgICB2YXIgJENvbnRhaW5lcjsNCg0KICAgIGZ1bmN0aW9uIG9uTG9hZCgkcGFyYW1zID0gYXJyYXkoKSkNCiAgICB7DQogICAgICAgIA0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBjbGVhcigpDQogICAgew0KICAgICAgICAvLyR0aGlzLT5pdGVtcyA9IGFycmF5KCk7DQogICAgICAgIA0KICAgICAgICAvL3JldHVybjsNCiAgICAgICAgDQogICAgICAgIC8vIGplIHR1IGJsYmUgY2VsZWogc3Ryb20gLSBtdWx0aW1lZGlhIG1hIHBydm5pIHBvbG96a3UgbXVsdGltZWRpYSBhIHBvdG9tIGRydWhvdSBrZXl0b2hvbXVsdGltZWRpYT1OVUxMDQogICAgICAgIC8vIHByb3RvIHNlIHRvIGN5a2xpDQogICAgICAgIA0KICAgICAgICAvL2VjaG8gJHRoaXMtPnRhYmxlTmFtZS4iPGJyIC8+IjsNCiAgICAgICAgLy9mb3JlYWNoKCR0aGlzLT5nZXRDaGlsZEl0ZW1zKCkgYXMgJGtleSA9PiAkSXRlbSkNCiAgICAgICAgLy97DQogICAgICAgIC8vICAgIGVjaG8gJGtleS4iID0gIjsNCiAgICAgICAgLy8gICAgZWNobyAkSXRlbS0+dGFibGVOYW1lLiI8YnIgLz4iOw0KICAgICAgICAvL30NCiAgICAgICAgLy9lY2hvICJDbGVhcmluZzogIjsNCiAgICAgICAgLy9leGl0Ow0KICAgICAgICANCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+Z2V0Q2hpbGRJdGVtcygpIGFzICRrZXkgPT4gJEl0ZW0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgkSXRlbSA9PSAkdGhpcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiRmF0YWwgRXJyb3I6IFRUcmVlSXRlbS0+Y2xlYXIoKSAtIHRyeWluZyB0byBjbGVhciBpdHNlbGYgLSByZWZlcmVuY2luZyBzZWxmIGFzIGNoaWxkIGl0ZW0iKTsNCiAgICAgICAgICAgICAgICBleGl0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoJEl0ZW0pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJEl0ZW0tPmNsZWFyKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGhpcy0+aXRlbXNbJGtleV0gPSBOVUxMOw0KICAgICAgICB9DQogICAgICAgIC8vcHJvY2Vzc01lc3NhZ2UoIkNsZWFyaW5nIEl0ZW0gIi4kdGhpcy0+dGFibGVOYW1lKTsNCiAgICAgICAgJHRoaXMtPlRvcEl0ZW0gPSBOVUxMOw0KICAgICAgICAkdGhpcy0+Q29udGFpbmVyLT5pdGVtc1skdGhpcy0+aWRdID0gTlVMTDsNCiAgICAgICAgdW5zZXQoJHRoaXMtPkNvbnRhaW5lci0+aXRlbXNbJHRoaXMtPmlkXSk7DQogICAgICAgIA0KICAgICAgICAkdGhpcy0+Q29udGFpbmVyID0gTlVMTDsNCiAgICAgICAgJHRoaXMtPml0ZW1zID0gYXJyYXkoKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gZ2V0UmVjb3JkVmFsdWUoJG5hbWUpDQogICAgew0KICAgICAgICByZXR1cm4oJHRoaXMtPnZhbHVlc1skbmFtZV0pOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBnZXRDaGlsZEl0ZW1zKCkNCiAgICB7DQogICAgICAgIHJldHVybigkdGhpcy0+aXRlbXMpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBnZXRBbGxDaGlsZEl0ZW1zKCkNCiAgICB7DQogICAgICAgICRjaGlsZEl0ZW1zID0gJHRoaXMtPml0ZW1zOw0KICAgICAgICBmb3JlYWNoKCR0aGlzLT5pdGVtcyBhcyAkSXRlbSkNCiAgICAgICAgew0KICAgICAgICAgICAgJGNoaWxkSXRlbXMgPSBhcnJheV9tZXJnZSgkY2hpbGRJdGVtcywgJEl0ZW0tPmdldEFsbENoaWxkSXRlbXMoKSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybigkY2hpbGRJdGVtcyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0UGFyZW50SXRlbXMoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuKCR0aGlzLT5nZXRQYXJlbnRMaXN0KCkpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFBhcmVudExpc3QoJG9ubHlWYWx1ZUZpZWxkTmFtZT0iIikNCiAgICB7DQogICAgICAgICRsaXN0ID0gYXJyYXkoKTsNCiAgICAgICAgDQogICAgICAgICRQYXJlbnRJdGVtID0gJHRoaXMtPlBhcmVudEl0ZW07DQogICAgICAgIHdoaWxlKCRQYXJlbnRJdGVtLT5pZCAhPSAiIikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCRvbmx5VmFsdWVGaWVsZE5hbWUgIT0gIiIpDQogICAgICAgICAgICAgICAgJGxpc3RbXSA9ICRQYXJlbnRJdGVtLT52YWx1ZXNbJG9ubHlWYWx1ZUZpZWxkTmFtZV07DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgJGxpc3RbXSA9ICRQYXJlbnRJdGVtOw0KDQogICAgICAgICAgICAkUGFyZW50SXRlbSA9ICRQYXJlbnRJdGVtLT5QYXJlbnRJdGVtOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4oJGxpc3QpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBnZXRDaGlsZExpc3QoJG9ubHlWYWx1ZUZpZWxkTmFtZT0iIikNCiAgICB7DQogICAgICAgICRsaXN0ID0gYXJyYXkoKTsNCiAgICAgICAgDQogICAgICAgIGZvcmVhY2goJHRoaXMtPml0ZW1zIGFzICRDaGlsZEl0ZW0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgkb25seVZhbHVlRmllbGROYW1lICE9ICIiKQ0KICAgICAgICAgICAgICAgICRsaXN0W10gPSAkQ2hpbGRJdGVtLT52YWx1ZXNbJG9ubHlWYWx1ZUZpZWxkTmFtZV07DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgJGxpc3RbXSA9ICRDaGlsZEl0ZW07DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAkbGlzdCA9IGFycmF5X21lcmdlKCRsaXN0LCAkQ2hpbGRJdGVtLT5nZXRDaGlsZExpc3QoJG9ubHlWYWx1ZUZpZWxkTmFtZSkpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4oJGxpc3QpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBnZXRUcmVlTGV2ZWwoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuKGNvdW50KCR0aGlzLT5nZXRQYXJlbnRMaXN0KCkpKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gYWRkQ2hpbGQoJEl0ZW0pDQogICAgew0KICAgICAgICBpZiAoJEl0ZW0gPT0gJHRoaXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNob3dNZXNzYWdlKCJGYXRhbCBlcnJvcjogVFRyZWVJdGVtKCk6IHRyeWluZyB0byBhZGQgc2VsZiBhcyBjaGlsZCBpdGVtLiIsIG10RXJyb3IpOw0KICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIA0KICAgICAgICB7DQogICAgICAgICAgICAkSXRlbS0+cGFyZW50ID0gJHRoaXMtPmlkOw0KICAgICAgICAgICAgJEl0ZW0tPlBhcmVudEl0ZW0gPSAkdGhpczsNCiAgICAgICAgICAgICRJdGVtLT5Db250YWluZXIgPSAkdGhpcy0+Q29udGFpbmVyOw0KDQogICAgICAgICAgICBpZiAoJEl0ZW0tPmlkKQ0KICAgICAgICAgICAgICAgICR0aGlzLT5pdGVtc1skSXRlbS0+aWRdID0gJEl0ZW07DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgJHRoaXMtPml0ZW1zW10gPSAkSXRlbTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBhZGRDaGlsZEZpcnN0KCRJdGVtKQ0KICAgIHsNCiAgICAgICAgaWYgKCRJdGVtID09ICR0aGlzKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaG93TWVzc2FnZSgiRmF0YWwgZXJyb3I6IFRUcmVlSXRlbSgpOiB0cnlpbmcgdG8gYWRkIHNlbGYgYXMgY2hpbGQgaXRlbS4iLCBtdEVycm9yKTsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSANCiAgICAgICAgew0KICAgICAgICAgICAgJEl0ZW0tPnBhcmVudCA9ICR0aGlzLT5pZDsNCiAgICAgICAgICAgICRJdGVtLT5QYXJlbnRJdGVtID0gJHRoaXM7DQogICAgICAgICAgICAkSXRlbS0+Q29udGFpbmVyID0gJHRoaXMtPkNvbnRhaW5lcjsNCg0KICAgICAgICAgICAgJGl0ZW1zID0gJHRoaXMtPml0ZW1zOw0KICAgICAgICAgICAgJHRoaXMtPml0ZW1zID0gYXJyYXkoKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCRJdGVtLT5pZCkNCiAgICAgICAgICAgICAgICAkdGhpcy0+aXRlbXNbJEl0ZW0tPmlkXSA9ICRJdGVtOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICR0aGlzLT5pdGVtc1tdID0gJEl0ZW07DQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcmVhY2goJGl0ZW1zIGFzICRJdGVtKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICgkSXRlbS0+aWQpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5pdGVtc1skSXRlbS0+aWRdID0gJEl0ZW07DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aXRlbXNbXSA9ICRJdGVtOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRTaWJsaW5nSXRlbXMoKQ0KICAgIHsNCiAgICAgICAgJHNpYmxpbmdJdGVtcyA9IGFycmF5KCk7DQogICAgICAgIA0KICAgICAgICAkUGFyZW50SXRlbSA9ICR0aGlzLT5QYXJlbnRJdGVtOw0KICAgICAgICBpZiAoJFBhcmVudEl0ZW0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2goJFBhcmVudEl0ZW0tPmdldENoaWxkSXRlbXMoKSBhcyAkQ2hpbGRJdGVtKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICgkQ2hpbGRJdGVtLT5pZCAhPSAkdGhpcy0+aWQpDQogICAgICAgICAgICAgICAgICAgICRzaWJsaW5nSXRlbXNbXSA9ICRDaGlsZEl0ZW07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybigkc2libGluZ0l0ZW1zKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gZ2V0UHJldlNpYmxpbmcoKQ0KICAgIHsNCiAgICAgICAgJFBhcmVudEl0ZW0gPSAkdGhpcy0+UGFyZW50SXRlbTsNCiAgICAgICAgaWYgKCRQYXJlbnRJdGVtKQ0KICAgICAgICB7DQogICAgICAgICAgICAkY2hpbGRyZW4gPSAkUGFyZW50SXRlbS0+Z2V0Q2hpbGRJdGVtcygpOw0KICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCRjaGlsZHJlbikgOyAkaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRDaGlsZEl0ZW0gPSAkY2hpbGRyZW5bJGldOw0KICAgICAgICAgICAgICAgIGlmICgkQ2hpbGRJdGVtLT5pZCA9PSAkdGhpcy0+aWQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4oJGNoaWxkcmVuWyRpLTFdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybihOVUxMKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXROZXh0U2libGluZygpDQogICAgew0KICAgICAgICAvL3Zhcl9kdW1wKCR0aGlzLT5QYXJlbnRJdGVtKTsNCiAgICAgICAgJFBhcmVudEl0ZW0gPSAkdGhpcy0+UGFyZW50SXRlbTsNCiAgICAgICAgaWYgKCRQYXJlbnRJdGVtKQ0KICAgICAgICB7DQogICAgICAgICAgICAkY2hpbGRyZW4gPSAkUGFyZW50SXRlbS0+Z2V0Q2hpbGRJdGVtcygpOw0KICAgICAgICAgICAgZm9yICgkaSA9IDAgOyAkaSA8IGNvdW50KCRjaGlsZHJlbikgOyAkaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRDaGlsZEl0ZW0gPSAkY2hpbGRyZW5bJGldOw0KICAgICAgICAgICAgICAgIGlmICgkQ2hpbGRJdGVtLT5pZCA9PSAkdGhpcy0+aWQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4oJGNoaWxkcmVuWyRpKzFdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybihOVUxMKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtKCkNCiAgICB7DQogICAgICAgIHJldHVybigkdGhpcy0+UGFyZW50SXRlbSk7DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIGluc2VydEJlZm9yZSgkSXRlbSkNCiAgICB7DQogICAgICAgICRpdGVtcyA9IGFycmF5KCk7DQogICAgICAgIGZvcmVhY2goJHRoaXMtPlBhcmVudEl0ZW0tPml0ZW1zIGFzICRTaWJsaW5nSXRlbSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCRTaWJsaW5nSXRlbS0+aWQgPT0gJHRoaXMtPmlkKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRpdGVtc1skSXRlbS0+aWRdID0gJEl0ZW07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRpdGVtc1skU2libGluZ0l0ZW0tPmlkXSA9ICRTaWJsaW5nSXRlbTsNCiAgICAgICAgfQ0KICAgICAgICAkdGhpcy0+UGFyZW50SXRlbS0+aXRlbXMgPSAkaXRlbXM7DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIGluc2VydEFmdGVyKCRJdGVtKQ0KICAgIHsNCiAgICAgICAgJGl0ZW1zID0gYXJyYXkoKTsNCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+UGFyZW50SXRlbS0+aXRlbXMgYXMgJFNpYmxpbmdJdGVtKQ0KICAgICAgICB7DQogICAgICAgICAgICAkaXRlbXNbJFNpYmxpbmdJdGVtLT5pZF0gPSAkU2libGluZ0l0ZW07DQogICAgICAgICAgICBpZiAoJFNpYmxpbmdJdGVtLT5pZCA9PSAkdGhpcy0+aWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGl0ZW1zWyRJdGVtLT5pZF0gPSAkSXRlbTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQogICAgICAgICR0aGlzLT5QYXJlbnRJdGVtLT5pdGVtcyA9ICRpdGVtczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRJdGVtQnlOYW1lKCRuYW1lKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+Z2V0U2libGluZ0l0ZW1zKCkgYXMgJFNpYmxpbmdJdGVtKQ0KICAgICAgICB7DQogICAgICAgICAgICAvL2R1bXAoJFNpYmxpbmdJdGVtLT5uYW1lKTsNCiAgICAgICAgICAgIGlmICgkU2libGluZ0l0ZW0tPm5hbWUgPT0gJG5hbWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuKCRTaWJsaW5nSXRlbSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKE5VTEwpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiByZW1vdmUoJEl0ZW0pDQogICAgew0KICAgICAgICB1bnNldCgkdGhpcy0+aXRlbXNbJEl0ZW0tPmlkXSk7DQogICAgICAgIHVuc2V0KCR0aGlzLT5Db250YWluZXItPml0ZW1zWyRJdGVtLT5pZF0pOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBnZXRVcmwoKQ0KICAgIHsNCiAgICAgICAgLy8gZHVtbXkNCiAgICB9DQogICAgZnVuY3Rpb24gZ2V0TmFtZSgpDQogICAgew0KICAgICAgICAvLyBkdW1teQ0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBhc0FycmF5KCR2YXJpYWJsZU5hbWU9IiIpDQogICAgew0KICAgICAgICBpZiAoISR2YXJpYWJsZU5hbWUpDQogICAgICAgICAgICAkdmFyaWFibGVOYW1lID0gInZhbHVlcyI7DQogICAgICAgICAgICANCiAgICAgICAgJHJldCA9ICR0aGlzLT4kdmFyaWFibGVOYW1lOw0KICAgICAgICAkcmV0WyJpdGVtcyJdID0gYXJyYXkoKTsNCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+aXRlbXMgYXMgJFRyZWVJdGVtKQ0KICAgICAgICAgICAgJHJldFsiaXRlbXMiXVtdID0gJFRyZWVJdGVtLT5hc0FycmF5KCR2YXJpYWJsZU5hbWUpOw0KDQogICAgICAgIHJldHVybigkcmV0KTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gZ2V0TGVhZkxpc3QoJG9ubHlWYWx1ZUZpZWxkTmFtZT0iIikNCiAgICB7DQogICAgICAgICRsaXN0ID0gYXJyYXkoKTsNCiAgICAgICAgDQogICAgICAgIGZvcmVhY2goJHRoaXMtPml0ZW1zIGFzICRDaGlsZEl0ZW0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICghY291bnQoJENoaWxkSXRlbS0+aXRlbXMpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICgkb25seVZhbHVlRmllbGROYW1lICE9ICIiKQ0KICAgICAgICAgICAgICAgICAgICAkbGlzdFtdID0gJENoaWxkSXRlbS0+dmFsdWVzWyRvbmx5VmFsdWVGaWVsZE5hbWVdOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgJGxpc3RbXSA9ICRDaGlsZEl0ZW07DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgICRsaXN0ID0gYXJyYXlfbWVyZ2UoJGxpc3QsICRDaGlsZEl0ZW0tPmdldExlYWZMaXN0KCRvbmx5VmFsdWVGaWVsZE5hbWUpKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuKCRsaXN0KTsNCiAgICB9DQp9OyAgDQo=ZnVuY3Rpb24gVERpcmVjdG9yeVRyZWUocGFyYW1zLCBpZCkgICAKewogICAgaWYgKCFpZCkKICAgICAgICBpZCA9IFVVSUQoKTsKICAgIAogICAgdGhpcy5USElTID0gdGhpczsKICAgIHRoaXMuaWQgPSBpZDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICAgCiAgICB0aGlzLmR1bXBEYXRhID0gZmFsc2U7CiAgICBhZGRPYmplY3QodGhpcyk7CiAgICB0aGlzLl9jcmVhdGUoKTsKfQoKZXh0ZW5kQ2xhc3MoVERpcmVjdG9yeVRyZWUsIFRUcmVlKTsKClREaXJlY3RvcnlUcmVlLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMucGFyYW1zWyJsaW1pdCJdID0gMTA7CgogICAgaWYgKHR5cGVvZih0aGlzLnBhcmFtc1sic29ydEJ5Il0pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMucGFyYW1zWyJzb3J0QnkiXSA9IFsidHlwZSIsInZhbHVlIl07CiAgICAKICAgIHRoaXMucGFyZW50Q3JlYXRlTG9hZERpc2FibGVkID0gdHJ1ZTsKICAgIHRoaXMucGFyZW50X2NyZWF0ZSgpOwogICAgCiAgICBhZGRDbGFzc05hbWUodGhpcy5jb250YWluZXIsICJfRGlyZWN0b3J5VHJlZSIpOwogICAgCiAgICAvL2R1bXAodGhpcy5wYXJhbXMpOwogICAgaWYgKHRoaXMucGFyYW1zWyJhamF4TG9hZCJdKQogICAgewogICAgICAgIC8vZHVtcCgnbG9hZGluZy4uLicpOwogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgLy9kdW1wKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgCiAgICAgICAgLy9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMubG9hZCgiLyIpfSwgMTAwKTsgLy8gbmVkcnppIGhvZG5vdHUhISEKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMubG9hZChfdGhpcy5nZXRWYWx1ZSgpKX0sIDEwMCk7CiAgICAgICAgLy90aGlzLmxvYWQoKTsKICAgIH0KfQoKVERpcmVjdG9yeVRyZWUucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpCnsKICAgIC8vZHVtcCgiRFQ6Iit2YWx1ZSk7CiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIHRoaXMucGFyZW50X3NldFZhbHVlKHZhbHVlKTsKfQoKVERpcmVjdG9yeVRyZWUucHJvdG90eXBlLl9zZWxlY3RJdGVtcyA9IGZ1bmN0aW9uKCkKewogICAgLy9kdW1wKCJzZWxlY3QiKTsKICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIC8vZHVtcCh2YWx1ZSk7CiAgICB2YXIgdmFsdWVzID0gdmFsdWUuc3BsaXQoInwiKTsKICAgIGZvciAodmFyIHYgPSAwIDsgdiA8IHZhbHVlcy5sZW5ndGggOyB2KyspICAgIAogICAgewogICAgICAgIHZhciBwYXRoID0gdmFsdWVzW3ZdOwogICAgICAgIC8vZHVtcChwYXRoKTsKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgiLyIpOwogICAgICAgIGlmIChwYXRoWzBdID09ICIiKQogICAgICAgICAgICBwYXRoLnNoaWZ0KCk7CiAgICAgICAgaWYgKHBhdGhbcGF0aC5sZW5ndGgtMV0gPT0gIiIpCiAgICAgICAgICAgIHBhdGgucG9wKCk7CiAgICAgICAgLy9kdW1wKHZhbHVlcyk7CiAgICAgICAgLy9kdW1wKHRoaXMuaXRlbXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBwID0gMCA7IHAgPCBwYXRoLmxlbmd0aCA7IHArKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWwgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAgOyBqIDw9IHAgOyBqKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCArPSAiLyI7CiAgICAgICAgICAgICAgICB2YWwgKz0gcGF0aFtqXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9kdW1wKCIhICIrdmFsKTsKICAgICAgICAgICAgLy9kdW1wKFBhcmVudEl0ZW0uaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRBbGxJdGVtcygpOwogICAgICAgICAgICB2YXIgZG9CcmVhayA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBpdGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgICAgICAgICAgLy9kdW1wKFRyZWVJdGVtLnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChUcmVlSXRlbS52YWx1ZSA9PSB2YWwgfHwgVHJlZUl0ZW0udmFsdWUgPT0gdmFsKyIvIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAocCA8IHBhdGgubGVuZ3RoLTEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoImV4cGFuZDoiK1RyZWVJdGVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUl0ZW0uZXhwYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEFsbEl0ZW1zKCk7CiAgICAgICAgLy9kdW1wKHZhbHVlcyk7CiAgICAvL2R1bXAoaXRlbXMpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgaXRlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBUcmVlSXRlbSA9IGl0ZW1zW2ldOwogICAgICAgIC8vZHVtcChUcmVlSXRlbS52YWx1ZSk7CiAgICAgICAgaWYgKGluX2FycmF5KFRyZWVJdGVtLnZhbHVlLCB2YWx1ZXMpIHx8IGluX2FycmF5KFRyZWVJdGVtLnZhbHVlKyIvIiwgdmFsdWVzKSB8fCBUcmVlSXRlbS52YWx1ZSAmJiBpbl9hcnJheShUcmVlSXRlbS52YWx1ZS5zdWJzdHIoMCwgVHJlZUl0ZW0udmFsdWUubGVuZ3RoLTEpLCB2YWx1ZXMpKQogICAgICAgICAgICBUcmVlSXRlbS5fc2VsZWN0KCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBUcmVlSXRlbS5fdW5zZWxlY3QoKTsKICAgIH0KfQoKLyoKVERpcmVjdG9yeVRyZWUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5wYXJlbnRfcmVsb2FkKCk7CiAgICB0aGlzLl9zZWxlY3RJdGVtcygpOwp9CiovCgpURGlyZWN0b3J5VHJlZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24oYXN5bmMpCnsKICAgIC8vdGhpcy5jbGVhcigpOwogICAgdGhpcy5wYXJhbXNbInBhcmVudCJdID0gIiI7CiAgICAKICAgIC8vdGhpcy5sb2FkKCIvIiwgYXN5bmMpOwogICAgdGhpcy5wYXJlbnRfcmVsb2FkKGFzeW5jKTsKfQoKVERpcmVjdG9yeVRyZWUucHJvdG90eXBlLl9sb2FkID0gZnVuY3Rpb24oZGlyLCBhc3luYykKewogICAgdmFyIHBhcmFtcyA9IHt9OwogICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICB0aGlzLnBhcmFtc1siZGlyZWN0b3J5Il0gPSBkaXI7CiAgICAvL3BhcmFtc1sidmFsdWVzIl0gPSB0aGlzLmdldFZhbHVlKCk7CiAgICAvL3BhcmFtc1sidmFsdWUiXSA9IGZpcnN0X3ZhbHVlKGltcGxvZGVMaXN0KHRoaXMuZ2V0VmFsdWUoKSksIHRoaXMucGFyYW1zWyJ2YWx1ZSJdKTsKICAgIC8vZHVtcCh0aGlzLmVsZW1lbnQpOwogICAgLy9kdW1wKGRpcik7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdmFyIGZ1bmMyID0gZnVuY3Rpb24oaHRtbCl7CiAgICAgICAgLy9kdW1wKF90aGlzLnBhcmFtc1sibGltaXQiXSk7CiAgICAgICAgLy9kdW1wKGh0bWwpOwogICAgICAgIGlmIChfdGhpcy5wYXJhbXNbImxpbWl0Il0gJiYgaHRtbC5pbmRleE9mKCJsaSIpICE9IC0xKQogICAgICAgIHsKICAgICAgICAgICAgX3RoaXMucGFyYW1zWyJiZWdpbiJdICs9IF90aGlzLnBhcmFtc1sibGltaXQiXTsKICAgICAgICAgICAgX3RoaXMuX2xvYWQoZGlyLCBhc3luYyk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0eXBlb2YoYXN5bmMpID09ICJmdW5jdGlvbiIpCiAgICAgICAgewogICAgICAgICAgICBhc3luYyhodG1sKTsKICAgICAgICAgICAgLy9fdGhpcy5zZXRWYWx1ZShkaXIpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIHRoaXMucGFyZW50X19sb2FkKGRpciwgZnVuYzIpOwp9Cgo=Ly8gLS0tLS0tLSAvY29yZS9jbGFzc2VzL19uZXcvRGlyZWN0b3J5VHJlZS9EaXJlY3RvcnlUcmVlLmNsYXNzLnBocCAtLS0tLS0tIA0KCmNsYXNzIFREaXJlY3RvcnlUcmVlIGV4dGVuZHMgVFRyZWUKewogICAgdmFyICRqc0NsYXNzTmFtZSA9ICJURGlyZWN0b3J5VHJlZSI7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvbkdldFByb3BlcnRpZXMoKQogICAgewogICAgICAgIHJldHVybihtZXJnZVByb3BlcnRpZXMocGFyZW50OjpvbkdldFByb3BlcnRpZXMoKSwgYXJyYXkoICAgICAgICAKICAgICAgICAidHlwZT1ncm91cCxjYXB0aW9uPURhdGEiLAogICAgICAgICJuYW1lPWRpcnMsY2FwdGlvbj1EaXJlY3RvcmllcyxvYmplY3Q9Q29tYm9Cb3gsdmFsdWVzPXx0cnVlfGZhbHNlIiwKICAgICAgICAibmFtZT1maWxlcyxjYXB0aW9uPUZpbGVzLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgIGFycmF5KAogICAgICAgICAgICAibmFtZSIgPT4gImljb25zIiwKICAgICAgICAgICAgImNhcHRpb24iID0+ICJJY29ucyIsCiAgICAgICAgICAgICJvYmplY3QiID0+ICJHcmlkRWRpdCIsCiAgICAgICAgICAgICJmaWVsZHMiID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICJleHQiLAogICAgICAgICAgICAgICAgICAgICJvYmplY3QiID0+IGFycmF5KCJvYmplY3QiPT4iVGV4dEVkaXQiLCJwYXJhbXMiPT4ic3R5bGU9d2lkdGg6NjBweCIpLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIGFycmF5KAogICAgICAgICAgICAgICAgICAgICJuYW1lIiA9PiAiaWNvbiIsCiAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIgPT4gYXJyYXkoIm9iamVjdCI9PiJGaWxlRWRpdCIpLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApLAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249QmVoYXZpb3IiLAogICAgICAgICJuYW1lPWFqYXhMb2FkLGNhcHRpb249TG9hZCBJdGVtcyBieSBBSkFYLG9iamVjdD1Db21ib0JveCx2YWx1ZXM9fHRydWV8ZmFsc2UiLAogICAgICAgICJ0eXBlPWdyb3VwLGNhcHRpb249RmlsZXN5c3RlbSIsCiAgICAgICAgIm5hbWU9cm9vdERpcmVjdG9yeSxjYXB0aW9uPVJvb3QgRGlyZWN0b3J5LG9iamVjdD1UZXh0RWRpdCIsCiAgICAgICAgLy8nbmFtZT1pY29ucyxjYXB0aW9uPUljb25zLG9iamVjdD1HcmlkRWRpdCxmaWVsZHM9W3sibmFtZSI6ImV4dCIsIm9iamVjdCI6eyJvYmplY3QiOiJUZXh0RWRpdCIsInBhcmFtcyI6eyJzdHlsZSI6IndpZHRoOjYwcHgifX19LHsibmFtZSI6Imljb24iLCJvYmplY3QiOnsib2JqZWN0IjoiRmlsZUVkaXQiLCJwYXJhbXMiOnt9fX1dJywKICAgICAgICApKSk7ICAgICAgICAKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpZWxkSW5mbygkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgcmV0dXJuKGFycmF5KAogICAgICAgICAgICAiZGF0YVR5cGUiID0+ICJWQVJDSEFSIiwKICAgICAgICAgICAgImRhdGFUeXBlUGFyYW1zIiA9PiAiMjU1IiwKICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSIgPT4gIiIsCiAgICAgICAgKSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25HZXRIZWFkSHRtbCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCFoZWFkSHRtbEFkZGVkKF9fQ0xBU1NfXywgJHBhcmFtcykpCiAgICAgICAgewogICAgICAgICAgICBwYXJlbnQ6Om9uR2V0SGVhZEh0bWwoJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgICAgIGFkZEhlYWRIdG1sKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdpbnN0YWxsLnBocD9pbmNsdWRlPS9jb3JlL2NsYXNzZXMvX25ldy9EaXJlY3RvcnlUcmVlL0RpcmVjdG9yeVRyZWUuY2xhc3MuanMnPjwvc2NyaXB0PiIsdHJ1ZSk7CiAgICAgICAgICAgIGFkZEV4dGVuZGluZ0hlYWRIdG1sKCRwYXJhbXMsIF9fQ0xBU1NfXyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG9uR2V0Q29udGVudCgmJHBhcmFtcz1hcnJheSgpLCAkdmFsdWU9IiIpCiAgICB7CiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMpOwogICAgICAgIAogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAkcGFyYW1zWyJpY29ucyJdID0gYXJyYXlfYXNzb2MoJHBhcmFtc1siaWNvbnMiXSwgImV4dCIpOwogICAgICAgIAogICAgICAgIGlmICghJHZhbHVlKQogICAgICAgICAgICAkdmFsdWUgPSAkcGFyYW1zWyJ2YWx1ZSJdOwoKICAgICAgICBpZiAoJHZhbHVlW3N0cmxlbigkdmFsdWUpLTFdID09ICIvIiAmJiBzdHJsZW4oJHZhbHVlKSA+IDEpCiAgICAgICAgICAgICR2YWx1ZSA9IHN1YnN0cigkdmFsdWUsIDAsIHN0cmxlbigkdmFsdWUpLTEpOwogICAgICAgIAogICAgICAgIC8vJFRyZWUgPSBjcmVhdGVPYmplY3QoIlRyZWUiKTsKICAgICAgICAvL3JldHVybjsKICAgICAgICBpZiAoISRwYXJhbXNbImFqYXhMb2FkIl0pCiAgICAgICAgewogICAgICAgICAgICAkcmVjb3JkcyA9ICR0aGlzLT5nZXRUcmVlUmVjb3JkcygkcGFyYW1zLCAkdmFsdWUpOwogICAgICAgICAgICAkdGhpcy0+Z2VuZXJhdGVGcm9tQXJyYXkoJHJlY29yZHMsICJpZCIsICJwYXJlbnQiKTsKICAgICAgICB9CiAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgCiAgICAgICAgJHBhcmFtc1sib2JqZWN0Il0gPSAkdGhpczsKICAgICAgICAKICAgICAgICByZXR1cm4ocGFyZW50OjpvbkdldENvbnRlbnQoJHBhcmFtcywgJHZhbHVlKSk7CiAgICB9IAogICAgCiAgICBmdW5jdGlvbiBnZXRBSkFYQ29udGVudCgkcGFyYW1zPWFycmF5KCkpCiAgICB7CiAgICAgICAgLy92YXJfZHVtcCgkcGFyYW1zKTsKICAgICAgICAkcGFyYW1zID0gJHRoaXMtPmV4dHJhY3RQYXJhbXMoJHBhcmFtcyk7CgogICAgICAgIC8vJHJlY29yZHMgPSAkdGhpcy0+Z2V0VHJlZVJlY29yZHMoJHBhcmFtcywgIiIsICRwYXJhbXNbInBhcmVudCJdKTsKICAgICAgICAkcmVjb3JkcyA9ICR0aGlzLT5nZXRUcmVlUmVjb3JkcygkcGFyYW1zLCAkcGFyYW1zWyJ2YWx1ZSJdLCAkcGFyYW1zWyJwYXJlbnQiXSk7CiAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgLy9leGl0OwogICAgICAgIGZvcmVhY2goJHJlY29yZHMgYXMgJGtleSA9PiAkcmVjb3JkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRyZWNvcmRbInBhcmVudCJdID09ICRwYXJhbXNbInBhcmVudCJdKQogICAgICAgICAgICAgICAgJHJlY29yZHNbJGtleV1bInBhcmVudCJdID0gIiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgJHRoaXMtPmdlbmVyYXRlRnJvbUFycmF5KCRyZWNvcmRzLCAiaWQiLCAicGFyZW50Iik7CiAgICAgICAgJHBhcmFtc1sib2JqZWN0Il0gPSAkdGhpczsKICAgICAgICAkcGFyYW1zWyJjbGFzcyJdID0gIiI7CiAgICAgICAgdW5zZXRDc3NQYXJhbXMoJHBhcmFtcyk7CgogICAgICAgIC8vZXhpdDsKICAgICAgICAkaHRtbCAuPSAkdGhpcy0+Z2V0VHJlZUh0bWwoJHBhcmFtcywgJHRoaXMtPlRvcEl0ZW0pOwogICAgICAgIAogICAgICAgIHJldHVybigkaHRtbCk7CiAgICB9IAoKICAgIGZ1bmN0aW9uIG9uR2V0SXRlbVRleHRIdG1sKCRUcmVlSXRlbSwgJHBhcmFtcz1hcnJheSgpKQogICAgewogICAgICAgIGlmICghJHBhcmFtc1siaWNvbldpZHRoIl0pCiAgICAgICAgICAgICRwYXJhbXNbImljb25XaWR0aCJdID0gIjE2IjsKICAgICAgICBpZiAoISRwYXJhbXNbImljb25IZWlnaHQiXSkKICAgICAgICAgICAgJHBhcmFtc1siaWNvbkhlaWdodCJdID0gIjE2IjsKICAgICAgICAKICAgICAgICAkaWNvbiA9ICRUcmVlSXRlbS0+cmVjb3JkVmFsdWVzWyJpY29uIl07CiAgICAgICAgLy9kdW1wKCRpY29uKTsKICAgICAgICAvL2R1bXAoJHBhcmFtc1siaWNvbnMiXSk7CiAgICAgICAgaWYgKCRpY29uKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbImljb25zIl1bJGljb25dKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkaWNvbiA9ICRwYXJhbXNbImljb25zIl1bJGljb25dWyJpY29uIl07CiAgICAgICAgICAgICAgICAkaWNvblBhdGggPSAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkcGFyYW1zWyJpY29ucyJdWyIqIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRpY29uID0gJHBhcmFtc1siaWNvbnMiXVsiKiJdWyJpY29uIl07CiAgICAgICAgICAgICAgICAkaWNvblBhdGggPSAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIAogICAgICAgICAgICAgICAgJGljb25QYXRoID0gUFJPSkVDVFBBVEguImNvcmUvY2xhc3Nlcy9fbmV3L0ZpbGVJY29ucy8iOwogICAgICAgICAgICAgICAgaWYgKCFnZXRGaWxlRXh0KCRpY29uKSkKICAgICAgICAgICAgICAgICAgICAkaWNvbiAuPSAiLnBuZyI7CiAgICAgICAgICAgICAgICBpZiAoIV9maWxlX2V4aXN0cygkaWNvblBhdGguJGljb24pKQogICAgICAgICAgICAgICAgICAgICRpY29uID0gImZpbGUucG5nIjsKICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8kaWNvbiA9ICRpY29uUGF0aC4kaWNvbjsKICAgICAgICAgICAgICAgIC8vZHVtcCgkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siaWQiXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvL2R1bXAoJGljb24pOwogICAgICAgICAgICBpZiAoJGljb24gJiYgKHN0cnBvcygkaWNvbiwgImh0dHA6Ly8iKSA9PT0gMCB8fCBzdHJwb3MoJGljb24sICJodHRwczovLyIpID09PSAwIHx8IF9maWxlX2V4aXN0cygkaWNvbikpKQogICAgICAgICAgICAgICAgLy8kaHRtbCAuPSAiPGltZyBzcmM9JyIuZ2V0T2JqZWN0KCJJbWFnZSIpLT5nZXRVcmwoIndpZHRoPSIuJHBhcmFtc1siaWNvbldpZHRoIl0uIixoZWlnaHQ9Ii4kcGFyYW1zWyJpY29uSGVpZ2h0Il0uIiIsICRpY29uKS4iJyAvPiI7CiAgICAgICAgICAgICAgICAkaHRtbCAuPSAiPGltZyBzcmM9JyIuZ2V0VXJsRnJvbVBhdGgoJGljb24pLiInIHN0eWxlPSd3aWR0aDoiLiRwYXJhbXNbImljb25XaWR0aCJdLiI7aGVpZ2h0OiIuJHBhcmFtc1siaWNvbkhlaWdodCJdLiI7JyAvPiI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRodG1sIC49ICI8aW1nIHNyYz0nIi5nZXRPYmplY3QoIkZpbGVUeXBlSW1hZ2UiKS0+Z2V0VXJsKCJ3aWR0aD0iLiRwYXJhbXNbImljb25XaWR0aCJdLiIsaGVpZ2h0PSIuJHBhcmFtc1siaWNvbkhlaWdodCJdLiIiLCAkVHJlZUl0ZW0tPnJlY29yZFZhbHVlc1siaWQiXSkuIicgLz4iOwogICAgICAgICAgICAgICAgLy8kaHRtbCAuPSAiPGltZyBzcmM9JyIuZ2V0T2JqZWN0KCJGaWxlVHlwZUltYWdlIiktPmdldFVybCgid2lkdGg9Ii4kcGFyYW1zWyJpY29uV2lkdGgiXS4iLGhlaWdodD0iLiRwYXJhbXNbImljb25IZWlnaHQiXS4iIiwgJGljb24pLiInIC8+IjsKICAgICAgICAgICAgLy8kaHRtbCAuPSAiPGltZyBzcmM9JyIuZ2V0T2JqZWN0KCJJbWFnZSIpLT5nZXRVcmwoIndpZHRoPSIuJHBhcmFtc1siaWNvbldpZHRoIl0uIixoZWlnaHQ9Ii4kcGFyYW1zWyJpY29uSGVpZ2h0Il0uIiIsICRpY29uUGF0aC4kaWNvbikuIicgLz4iOwogICAgICAgIH0KCiAgICAgICAgJGh0bWwgLj0gIjxhPiIuJFRyZWVJdGVtLT5yZWNvcmRWYWx1ZXNbIm5hbWUiXS4iPC9hPiI7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKCRodG1sKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRUcmVlUmVjb3JkcygkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIiwgJF9wYXJlbnREaXI9IiIpCiAgICB7CiAgICAgICAgLy9jbGVhclN0YXRDYWNoZSgpOwogICAgICAgIHN0YXJ0UHJvZmlsZSgiVERpcmVjdG9yeVRyZWU6OmdldFRyZWVSZWNvcmRzIik7CiAgICAgICAgJHBhcmFtcyA9ICR0aGlzLT5leHRyYWN0UGFyYW1zKCRwYXJhbXMpOwoKICAgICAgICBpZiAoISRwYXJhbXNbInJvb3REaXJlY3RvcnkiXSkKICAgICAgICB7CiAgICAgICAgICAgICRiYXNlUGF0aCA9IGZpbmRGaWxlKGdldE9iamVjdCgiRXZlbnRzIiktPnJ1bkV2ZW50cygib25HZXRSb290RGlyZWN0b3J5IiwgYXJyYXkoKSkpOwogICAgICAgICAgICBpZiAoISRiYXNlUGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGJhc2VQYXRoID0gUFJPSkVDVFBBVEg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHBhcmFtc1sicm9vdERpcmVjdG9yeSJdWzBdID09ICIvIikKICAgICAgICAgICAgJGJhc2VQYXRoID0gY2xlYW5MaW5rKFBST0pFQ1RQQVRILiRwYXJhbXNbInJvb3REaXJlY3RvcnkiXSk7CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgJGJhc2VQYXRoID0gY2xlYW5MaW5rKFBST0pFQ1RQQVRILiJyZXBvc2l0b3J5LyIuJHBhcmFtc1sicm9vdERpcmVjdG9yeSJdKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCRfcGFyZW50RGlyKQogICAgICAgICAgICAkcmVhbFBhdGggPSBjbGVhbkxpbmsoUFJPSkVDVFBBVEguIi8iLiRfcGFyZW50RGlyKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRyZWFsUGF0aCA9IGNsZWFuTGluaygkYmFzZVBhdGguIi8iLiRfcGFyZW50RGlyKTsKCiAgICAgICAgJHZhbHVlcyA9IGV4cGxvZGVMaXN0KCR2YWx1ZSk7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKCRwYXJhbXMpOwogICAgICAgIGlmICghaXNzZXQoJHBhcmFtc1siZGlycyJdKSkKICAgICAgICAgICAgJHBhcmFtc1siZGlycyJdID0gdHJ1ZTsKICAgICAgICBpZiAoIWlzc2V0KCRwYXJhbXNbImZpbGVzIl0pKQogICAgICAgICAgICAkcGFyYW1zWyJmaWxlcyJdID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAvL2R1bXAoJHBhcmFtc1siZmlsZXMiXSk7CiAgICAgICAgJHJlY29yZHMgPSBhcnJheSgpOwogICAgICAgIC8vZHVtcCgkcGFyYW1zKTsKICAgICAgICAvL2R1bXAoKCRwYXJhbXNbImRpcnMiXSA/IEdMT0JfRElSUyA6IDApfCgkcGFyYW1zWyJmaWxlcyJdID8gR0xPQl9GSUxFUyA6IDApKTsKICAgICAgICAvLyRfZmlsZXMgPSBhcnJheSgpOwogICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7CiAgICAgICAgJF9maWxlcyA9IF9nbG9iKCRyZWFsUGF0aC4iLyoiLCAoJHBhcmFtc1siZGlycyJdID8gR0xPQl9ESVJTIDogMCl8KCRwYXJhbXNbImZpbGVzIl0gPyBHTE9CX0ZJTEVTIDogMCksIGZhbHNlLCAkcGFyYW1zWyJsaW1pdCJdLCAkcGFyYW1zWyJiZWdpbiJdKTsKCiAgICAgICAgJGRpcnMgPSBhcnJheSgpOwogICAgICAgICRmaWxlcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkX2ZpbGVzIGFzICRmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgJHJlbGF0aXZlRmlsZSA9IGNsZWFuTGluayhzdHJfcmVwbGFjZShQUk9KRUNUUEFUSCwgIi8iLCAkZmlsZSkpOwogICAgICAgICAgICAvLyRyZWxhdGl2ZUZpbGUgPSBjbGVhbkxpbmsoc3RyX3JlcGxhY2UoJGJhc2VQYXRoLCAiLyIsICRmaWxlKSk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJGJhc2VQYXRoKTsKICAgICAgICAgICAgLy92YXJfZHVtcCgkcmVsYXRpdmVGaWxlKTsKICAgICAgICAgICAgaWYgKGlzX2RpcigkZmlsZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghaXNIaWRkZW5GaWxlKCRmaWxlKSkKICAgICAgICAgICAgICAgICAgICAkZGlyc1tdID0gJHJlbGF0aXZlRmlsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vdmFyX2R1bXAoJHJlbGF0aXZlRmlsZSk7CiAgICAgICAgICAgICAgICBpZiAoIWlzSGlkZGVuRmlsZSgkcmVsYXRpdmVGaWxlKSkKICAgICAgICAgICAgICAgICAgICAkZmlsZXNbXSA9ICRyZWxhdGl2ZUZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy92YXJfZHVtcCgkZGlycyk7CiAgICAgICAgLy92YXJfZHVtcCgkZmlsZXMpOwogICAgICAgIC8vZXhpdDsKICAgICAgICAKICAgICAgICBmb3JlYWNoKCRkaXJzIGFzICRmaWxlTmFtZSkKICAgICAgICB7CiAgICAgICAgICAgICRoYXNDaGlsZHJlbiA9IGZhbHNlOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gdmVyeSBTTE9XISEhIQogICAgICAgICAgICAvL2lmICgkcGFyYW1zWyJmaWxlcyJdICYmIGhhc0ZpbGVzKFBST0pFQ1RQQVRILiRmaWxlTmFtZSkgfHwgJHBhcmFtc1siZGlycyJdICYmIGhhc0RpcnMoUFJPSkVDVFBBVEguJGZpbGVOYW1lKSkKICAgICAgICAgICAgLy8gICAgJGhhc0NoaWxkcmVuID0gdHJ1ZTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRfZGlyID0gQG9wZW5kaXIoUFJPSkVDVFBBVEguJGZpbGVOYW1lKTsKICAgICAgICAgICAgd2hpbGUoJF9maWxlID0gQHJlYWRkaXIoJF9kaXIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJF9maWxlICE9ICIuIiAmJiAkX2ZpbGUgIT0gIi4uIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL2lmICgkcGFyYW1zWyJmaWxlcyJdIHx8ICgkcGFyYW1zWyJkaXJzIl0gJiYgaXNfZGlyKCRiYXNlUGF0aC4kZmlsZU5hbWUuIi8iLiRfZmlsZSkpKQogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1zWyJmaWxlcyJdIHx8ICgkcGFyYW1zWyJkaXJzIl0gJiYgaXNfZGlyKFBST0pFQ1RQQVRILiRmaWxlTmFtZS4iLyIuJF9maWxlKSkpCiAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkaGFzQ2hpbGRyZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2VjaG8gJF9maWxlLiI8YnIgLz4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBjbG9zZWRpcigkX2Rpcik7CgogICAgICAgICAgICAvL3Zhcl9kdW1wKCRwYXJhbXNbInZhbHVlIl0pOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCR2YWx1ZXMpOwogICAgICAgICAgICAvL2V4aXQ7CiAgICAgICAgICAgIC8vZHVtcCgkdmFsdWVzKTsKICAgICAgICAgICAgJHZhbHVlcyA9IGV4cGxvZGVMaXN0KCRwYXJhbXNbInZhbHVlcyJdKTsKICAgICAgICAgICAgJHNlbGVjdCA9ICgkcGFyYW1zWyJkZWZhdWx0U2VsZWN0ZWQiXSA/IHRydWUgOiBpbl9hcnJheSgkZmlsZU5hbWUsICR2YWx1ZXMpKTsKICAgICAgICAgICAgLy9lY2hvICIhISEiOwogICAgICAgICAgICAvL3Zhcl9kdW1wKCRmaWxlTmFtZSk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHBhcmFtcyk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHZhbHVlcyk7CiAgICAgICAgICAgIC8vdmFyX2R1bXAoJHNlbGVjdCk7CiAgICAgICAgICAgICRyZWNvcmRzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAiaWQiID0+ICRmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAicGFyZW50IiA9PiAkX3BhcmVudERpciwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiID0+ICRmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gYmFzZW5hbWUoJGZpbGVOYW1lKSwKICAgICAgICAgICAgICAgICAgICAiX2hhc0NoaWxkSXRlbXMiID0+ICRoYXNDaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAiX3NlbGVjdGVkIiA9PiAkc2VsZWN0LAogICAgICAgICAgICAgICAgICAgICJpY29uIiA9PiAiZGlyZWN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAiZGF0YSIgPT4gYXJyYXkoInR5cGUiPT4iZGlyZWN0b3J5IiksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBjaGVjayBpZiBzb21lIHZhbHVlIGlzIGluIHRoaXMgZGlyZWN0b3J5CiAgICAgICAgICAgICRsb2FkU3ViRGlyID0gZmFsc2U7CiAgICAgICAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgIT0gJGZpbGVOYW1lICYmIHN0cnBvcygkdmFsdWUsICRmaWxlTmFtZSkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGxvYWRTdWJEaXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoJGxvYWRTdWJEaXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZWNvcmRzID0gYXJyYXlfbWVyZ2UoJHJlY29yZHMsICR0aGlzLT5nZXRUcmVlUmVjb3JkcygkcGFyYW1zLCAkdmFsdWVzLCAkZmlsZU5hbWUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgICAgLy9leGl0OwogICAgICAgIAogICAgICAgIC8vdmFyX2R1bXAoJGZpbGVzKTsKICAgICAgICBmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZU5hbWUpCiAgICAgICAgewogICAgICAgICAgICAvLyRmaWxlSWNvbiA9IGdldEZpbGVUeXBlSWNvbigkZmlsZU5hbWUsIDE2KTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRzZWxlY3QgPSAoJHBhcmFtc1siZGVmYXVsdFNlbGVjdGVkIl0gPyB0cnVlIDogaW5fYXJyYXkoJGZpbGVOYW1lLCAkdmFsdWVzKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcmVjb3Jkc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgImlkIiA9PiAkZmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgInBhcmVudCIgPT4gJF9wYXJlbnREaXIsCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA9PiAkZmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+IGJhc2VuYW1lKCRmaWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgIl9oYXNDaGlsZEl0ZW1zIiA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiX3NlbGVjdGVkIiA9PiAkc2VsZWN0LAogICAgICAgICAgICAgICAgICAgICJpY29uIiA9PiBnZXRGaWxlRXh0KCRmaWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgImRhdGEiID0+IGFycmF5KCJ0eXBlIj0+ImZpbGUiKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAgICAgLy92YXJfZHVtcCgkcmVjb3Jkcyk7CiAgICAKICAgICAgICBzdG9wUHJvZmlsZSgiVERpcmVjdG9yeVRyZWU6OmdldFRyZWVSZWNvcmRzIik7CiAgICAgICAgcmV0dXJuKCRyZWNvcmRzKTsKICAgIH0KfTsKCg==PGgxPkJldGEgVGVzdGluZyA8L2gxPg0KPHA+DQogICAgIEUtVklTSU9OIEludGVybmF0aW9uYWwsIHMuci5vLiBpbnZpdGVzIHlvdSB0byB0YWtlIHBhcnQgaW4gaXRzIGJldGEgdGVzdGluZyBvZiBWaXN1YWwgUEhQ4oSiIGFuZCBpdCdzIG1vZHVsZXMuDQo8L3A+DQo8aDM+V2hhdCBpcyBhIGJldGEgdmVyc2lvbj88L2gzPg0KPHA+DQogICAgIEEgcHJvZHVjdCdzIGJldGEgaXMgYW4gb2ZmaWNpYWxseSByZWxlYXNlZCB2ZXJzaW9uIG9mIGEgcHJvZHVjdCB3aGljaCBpbmNsdWRlcyBtb3N0IG9mIHRoZSBwcm9kdWN0J3MgZnVuY3Rpb25hbGl0eS4gVGhlIGJldGEgdmVyc2lvbiBpcyBpbnRlbmRlZCBmb3IgZXh0ZXJuYWwgdGVzdGluZyBvZiB0aGUgcHJvZHVjdCBpbiBvcmRlciB0byBpZGVudGlmeSBjb25maWd1cmF0aW9ucyB0aGF0IGNhdXNlIHByb2JsZW1zLCBhcyB3ZWxsIGFzIGNvbGxlY3QgcmVxdWlyZW1lbnRzIGFuZCBzdWdnZXN0aW9ucyBmcm9tIHVzZXJzLg0KPC9wPg0KPHA+DQogICAgIEJlZm9yZSBpdHMgb2ZmaWNpYWwgcmVsZWFzZSwgYSBiZXRhIHZlcnNpb24gdW5kZXJnb2VzIGEgZnVsbCBjeWNsZSBvZiBpbnRlcm5hbCB0ZXN0aW5nLCBhZnRlciB3aGljaCB0aGUgYXBwbGljYXRpb24gaXMgc3VmZmljaWVudGx5IHN0YWJsZSBpbiB0aGUgbWFqb3JpdHkgb2YgY29tcHV0aW5nIGVudmlyb25tZW50cy4NCjwvcD4NCjxwPg0KPC9wPg0KPHVsPg0KPC91bD4NCjxwPg0KICAgICBQbGVhc2Ugbm90ZSB0aGF0IGEgYmV0YSB2ZXJzaW9uIGlzIDxiPk5PVDwvYj4gdGhlIGZpbmFsIHZlcnNpb24gb2YgdGhlIHByb2R1Y3QgYW5kIHRoZXJlZm9yZSB0aGUgZGV2ZWxvcGVyIGRvZXMgbm90IGd1YXJhbnRlZSBhbiBhYnNlbmNlIG9mIGVycm9ycyB0aGF0IG1heSBkaXNydXB0IHRoZSBjb21wdXRlcidzIG9wZXJhdGlvbiBhbmQvb3IgcmVzdWx0IGluIGRhdGEgbG9zcy4NCjwvcD4NCjxwPg0KICAgICBDb25zZXF1ZW50bHksIGJldGEgdGVzdGVycyB1c2UgdGhlIGJldGEgdmVyc2lvbiBhdCB0aGVpciBvd24gcmlzayBhbmQgRS1WSVNJT04gSW50ZXJuYXRpb25hbCwgcy5yLm8uIGJlYXJzIG5vIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgY29uc2VxdWVuY2VzIGFyaXNpbmcgb3V0IG9mIHRoZSB1c2Ugb2YgdGhlIGJldGEgdmVyc2lvbi4NCjwvcD4NCjxoMz5QYXJ0aWNpcGF0aW5nIGluIGJldGEgdGVzdGluZyBlbmFibGVzIHlvdSB0bzo8L2gzPg0KPHVsPg0KICAgIDxsaT5iZSBhbW9uZyB0aGUgZmlyc3QgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiBwcm9kdWN0czwvbGk+DQogICAgPGxpPmhlbHAgdXMgaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB0aGUgcHJvZHVjdHMgYmVpbmcgdGVzdGVkPC9saT4NCiAgICA8bGk+cHJvdmlkZSB5b3VyIHN1Z2dlc3Rpb25zIG9uIHBvc3NpYmxlIHdheXMgb2YgaW1wcm92aW5nIHRoZSBwcm9kdWN0PC9saT4NCiAgICA8bGk+ZnJlZSB0ZWNobmljYWwgc3VwcG9ydDwvbGk+DQogICAgPGxpPmNvbGxhYm9yYXRlIGRpcmVjdGx5IHdpdGggZGV2ZWxvcGVycyBhbmQgb3RoZXIgYmV0YSB0ZXN0ZXJzIHVzaW5nIGRlZGljYXRlZCBzZWN0aW9ucyBvZiBvdXIgPGEgaHJlZj0iaHR0cDovL2JldGEudmlzdWFsLXBocC5jb20iIHRhcmdldD0iX2JsYW5rIj5mb3J1bTwvYT48L2xpPg0KPC91bD4NCjxoMz5XaGVuIHRha2luZyBwYXJ0IGluIHRoZSBiZXRhIHRlc3RpbmcgaXQgaXMgbmVjZXNzYXJ5IHRvOjwvaDM+DQo8dWw+DQogICAgPGxpPmRvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBwcm9kdWN0IHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0ZXN0aW5nPC9saT4NCiAgICA8bGk+c3BlbmQgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIG9uIGZhbWlsaWFyaXppbmcgeW91cnNlbGYgd2l0aCB0aGUgcHJvZHVjdCBhbmQgdGVzdGluZyBpdDwvbGk+DQogICAgPGxpPnByZXBhcmUgYW5kIHNlbmQgb3V0IGJ1ZyByZXBvcnRzIG9uIGFueSBlcnJvcnMgZm91bmQ8L2xpPg0KICAgIDxsaT5wcm92aWRlIHN1Z2dlc3Rpb25zIG9uIHdheXMgdG8gaW1wcm92ZSB0aGUgcHJvZHVjdCBiZWluZyB0ZXN0ZWQ7IGFuZDwvbGk+DQogICAgPGxpPnJlcG9ydCBvbiBjb21wYXRpYmlsaXR5IGlzc3VlcyAoc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8geW91ciBjb25maWd1cmF0aW9uKTwvbGk+DQo8L3VsPg0KPGgzPlJlcG9ydGluZyBwcm9ibGVtczo8L2gzPg0KPHVsPg0KICAgIDxsaT5UbyByZXBvcnQgYW4gZXJyb3IsIHBsZWFzZSBwcm92aWRlIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHdheXMgaW4gd2hpY2ggaXQgbWFuaWZlc3RzIGl0c2VsZiBvbiB5b3VyIHN5c3RlbSwgdGhlIHN0ZXBzIHdoaWNoIGxlYWQgdXAgdG8gdGhlIGVycm9yIGFuZCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGhhcmR3YXJlIHVzZWQgZm9yIHRlc3RpbmcuIFNlbmQgeW91ciBkZXNjcmlwdGlvbiB0byB0aGUgZW1haWwgYWRkcmVzcyBzcGVjaWZpZWQgb24gdGhpcyBwYWdlLCBvciB1c2Ugc3BlY2lhbGl6ZWQgcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGZvciBidWcgcmVwb3N0aW5nPC9saT4NCiAgICA8bGk+WW91IGNhbiBhbHNvIHJlcG9ydCBwcm9ibGVtcyBhbmQgZ2V0IHlvdXIgcXVlc3Rpb25zIGFuc3dlcmVkIGluIG91ciA8YSBocmVmPSJodHRwOi8vYmV0YS52aXN1YWwtcGhwLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmZvcnVtPC9hPi48L2xpPg0KICAgIDxsaT5Zb3UgY2FuIGFsc28gdXNlIHRoaXMgcHJvY2VkdXJlIHRvIHByb3ZpZGUgeW91ciBzdWdnZXN0aW9ucyBvbiBpbXByb3ZpbmcgdGhlIHByb2R1Y3QuPC9saT4NCjwvdWw+DQo8cD4NCiAgICAgSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyByZWdhcmRpbmcgdGhlJm5ic3A7RS1WSVNJT04gSW50ZXJuYXRpb25hbCwgcy5yLm8uJm5ic3A7YmV0YSB0ZXN0aW5nIHByb2dyYW0sIHBsZWFzZSB3cml0ZSB0byA8YSBocmVmPSJtYWlsdG86YmV0YUB2aXN1YWwtcGhwLmNvbSI+YmV0YUB2aXN1YWwtcGhwLmNvbTwvYT4NCjwvcD4=PGgxPkJldGEgVGVzdG92w6Fuw608L2gxPg0KPHA+DQogICAgIEUtVklTSU9OIEludGVybmF0aW9uYWwsIHMuci5vLiBWw6FzIHp2ZSBrIMO6xI1hc3RpIG5hIGJldGEgdGVzdG92w6Fuw60gcHJvZ3JhbXUgVmlzdWFsIFBIUOKEoiBhIGplaG8gbW9kdWzFry4NCjwvcD4NCjxoMz5DbyBqZSBiZXRhIHZlcnplPzwvaDM+DQo8cD4NCiAgICBCZXRhIHZlcnplIGplIG9maWNpw6FsbsSbIHV2b2xuxJtuw6EgdmVyemUgcHJvZHVrdHUsIGt0ZXLDoSB6YWhybnVqZSB2xJt0xaFpbnUgeiBmaW7DoWxuw61jaCBmdW5rY8OtIHByb2dyYW11LiBCZXRhIHZlcnplIGplIHVyxI1lbmEgcHJvIGV4dGVybsOtIHRlc3RvdsOhbsOtIHByb2R1a3R1IHMgY8OtbGVtIG9kaGFsaXQga29uZmlndXJhY2UsIGt0ZXLDqSB6cMWvc29idWrDrSBwcm9ibMOpbXksIHN0ZWpuxJsgamFrbyBzYsOtcmF0IHBvxb5hZGF2a3kgYSBuw6F2cmh5IHXFvml2YXRlbMWvLg0KPC9wPg0KPHA+DQogICAgUMWZZWQgb2ZpY2nDoWxuw61tIHZ5ZMOhbsOtbSwgYmV0YSB2ZXJ6ZSBwcm9jaMOhesOtIGNlbMO9IGN5a2x1cyBpbnRlcm7DrWhvIHRlc3RvdsOhbsOtLCBuYSBqZWhvxb4ga29uY2kgamUgcHJvZ3JhbSBkb3N0YXRlxI1uxJsgc3RhYmlsbsOtIHZlIHbEm3TFoWluxJsgcG/EjcOtdGHEjW92w71jaCBzeXN0w6ltZWNoLg0KPC9wPg0KPHA+DQo8L3A+DQo8dWw+DQo8L3VsPg0KPHA+DQogICAgVmV6bcSbdGUgcHJvc8OtbSBuYSB2xJtkb23DrSwgxb5lIGJldGEgdmVyemUgPGI+TkVOw408L2I+IGtvbmXEjW7DoSB2ZXJ6ZSBwcm9kdWt0dSBhIHByb3RvIHbDvXZvasOhxZkgbmV6YXJ1xI11amUgYWJzZW5jaSBjaHliLCBrdGVyw6kgbW9ob3UgbmFydcWhaXQgxI1pbm5vc3QgcG/EjcOtdGHEjWUgYSAvIG5lYm8gdsOpc3Qga2UgenRyw6F0xJsgZGF0Lg0KPC9wPg0KPHA+DQogICAgViBkxa9zbGVka3UgdG9obyBiZXRhIHRlc3RlxZlpIHBvdcW+w612YWrDrSBiZXRhIHZlcnppIG5hIHN2w6kgdmxhc3Ruw60gcml6aWtvIGEgRS1WSVNJT04gSW50ZXJuYXRpb25hbCwgcy5yLm8uIG5lbmVzZSDFvsOhZG5vdSBvZHBvdsSbZG5vc3QgemEgamFrw6lrb2xpIGTFr3NsZWRreSB2eXBsw712YWrDrWPDrSB6IHBvdcW+aXTDrSBiZXRhIHZlcnplLg0KPC9wPg0KPGgzPsOaxI1hc3QgdiBiZXRhIHRlc3RvdsOhbsOtIHVtb8W+xYh1amU6PC9oMz4NCjx1bD4NCiAgICA8bGk+YsO9dCBtZXppIHBydm7DrW1pLCBrdGXFmcOtIHrDrXNrYWrDrSBwxZnDrXN0dXAgayBuZWpub3bEm2rFocOtbSB2ZXJ6w61tIHByb2R1a3TFrzwvbGk+DQogICAgPGxpPnBvbW9jaSBuw6FtIHpsZXDFoWl0IGt2YWxpdHUgdGVzdG92YW7DvWNoIHByb2R1a3TFrzwvbGk+DQogICAgPGxpPnBvc2t5dG5vdXQgbsOhbSBWYcWhZSBuw6F2cmh5IG5hIG1vxb5uw6kgemRva29uYWxlbsOtIHByb2R1a3R1PC9saT4NCiAgICA8bGk+YmV6cGxhdG5vdSB0ZWNobmlja291IHBvZHBvcnU8L2xpPg0KICAgIDxsaT5zcG9sdXByYWNvdmF0IHDFmcOtbW8gcyB2w712b2rDocWZaSBhIGRhbMWhw61taSBiZXRhIHRlc3RlcnkgcG91xb5pdMOtbSBzcGVjaWFsaXpvdmFuw6kgc2VrY2UgbmHFoWVobyA8YSBocmVmPSJodHRwOi8vYmV0YS52aXN1YWwtcGhwLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmZvcmE8L2E+PC9saT4NCjwvdWw+DQo8aDM+w5rEjWFzdCB2IGJldGEgdGVzdG92w6Fuw60gdnnFvmFkdWplOjwvaDM+DQo8dWw+DQogICAgPGxpPnN0w6Fobm91dCBhIG5haW5zdGFsb3ZhdCBwcm9kdWt0LCBqZWhvxb4gdmVyemUgamUgdXLEjWVuw6EgayB0ZXN0b3bDoW7DrTwvbGk+DQogICAgPGxpPnN0csOhdml0IHVyxI1pdG91IGRvYnUgbmEgc2V6bsOhbWVuw60gc2UgcyBwcm9kdWt0ZW0gYSBqZWhvIHprb3XFoWVuw61tPC9saT4NCiAgICA8bGk+cMWZaXByYXZpdCBhIG9kZXNsYXQgaGzDocWhZW7DrSBvIGpha8O9Y2hrb2xpIG5hbGV6ZW7DvWNoIGNoeWLDoWNoPC9saT4NCiAgICA8bGk+cG9za3l0bm91dCBuw6F2cmh5IG5hIHpwxa9zb2J5LCBqYWsgemxlcMWhaXQgdGVzdG92YW7DvSBwcm9kdWt0PC9saT4NCiAgICA8bGk+b2Rlc2xhdCBobMOhxaFlbsOtIG8gcHJvYmzDqW1lY2ggcyBrb21wYXRpYmlsaXRvdSwga3RlcsOpIHNvdXZpc8OtIHMgVmHFocOtIHNwZWNpZmlja291IGtvbmZpZ3VyYWPDrTwvbGk+DQo8L3VsPg0KPGgzPkhsw6HFoWVuw60gcHJvYmzDqW3Frzo8L2gzPg0KPHVsPg0KICAgIDxsaT5DaGNldGUtbGkgbmFobMOhc2l0IGNoeWJ1LCB1dmXEj3RlIHBvZHJvYm7DvSBwb3BpcywgamFrw71tIHpwxa9zb2JlbSBzZSBwcm9qZXZ1amUgdmUgVmHFoWVtIHN5c3TDqW11LCBrcm9reSwga3RlcsOpIHZlZG91IGHFviBrIGNoeWLEmyBhIHZsYXN0bm9zdGkgaGFyZHdhcnUgYSBzb2Z0d2FydSBwb3XFvml0w6lobyBrIHRlc3RvdsOhbsOtLiBQb8WhbGV0ZSBzdsWvaiBwb3BpcyBuYSBlLW1haWxvdm91IGFkcmVzdSB1dmVkZW5vdSBuYSB0w6l0byBzdHLDoW5jZSwgbmVibyB2eXXFvmlqdGUgaW50ZXJuw60gZnVua2NlIHByb2R1a3R1IHBybyBobMOhxaFlbsOtIGNoeWIuPC9saT4NCiAgICA8bGk+TcWvxb5ldGUgdGFrw6kgbmFobMOhc2l0IHByb2Jsw6lteSBhIHrDrXNrYXQgb2Rwb3bEm2RpIG5hIGRvdGF6eSBuYSBuYcWhZW0gPGEgaHJlZj0iaHR0cDovL2JldGEudmlzdWFsLXBocC5jb20iIHRhcmdldD0iX2JsYW5rIj5mb3J1PC9hPi48L2xpPg0KICAgIDxsaT5UdXRvIHByb2NlZHVydSBtxa/FvmV0ZSBwb3XFvsOtdCB0YWvDqSBwcm8gc3bDqSBuw6F2cmh5IG5hIHpsZXDFoWVuw60gcHJvZHVrdHUuPC9saT4NCjwvdWw+DQo8cD4NCiAgICBNw6F0ZS1saSBqYWvDqWtvbGkgZG90YXp5IHTDvWthasOtY8OtIHNlIHByb2dyYW11IGJldGEgdGVzdG92w6Fuw60gcHJvZHVrdMWvLCBuYXBpxaF0ZSBwcm9zw61tIG5hIDxhIGhyZWY9Im1haWx0bzpiZXRhQHZpc3VhbC1waHAuY29tIj5iZXRhQHZpc3VhbC1waHAuY29tPC9hPg0KPC9wPg==PGgxPkJldGEgVGVzdG92YW5pZTwvaDE+DQo8cD4NCiAgICAgRS1WSVNJT04gSW50ZXJuYXRpb25hbCwgcy5yLm8uIFbDoXMgcG96w712YSBrIMO6xI1hc3RpIG5hIGJldGEgdGVzdG92YW5pZSBwcm9ncmFtdSBWaXN1YWwgUEhQ4oSiIGEgamVobyBtb2R1bG92Lg0KPC9wPg0KPGgzPsSMbyBqZSBiZXRhIHZlcnppYT88L2gzPg0KPHA+DQogICAgQmV0YSB2ZXJ6aWEgamUgb2ZpY2nDoWxuZSB1dm/Evm5lbsOhIHZlcnppYSBwcm9kdWt0dSwga3RvcsOhIHphaMWVxYhhIHbDpMSNxaFpbnUgeiBmaW7DoWxueWNoIGZ1bmtjacOtIHByb2dyYW11LiBCZXRhIHZlcnppYSBqZSB1csSNZW7DoSBwcmUgZXh0ZXJuw6kgdGVzdG92YW5pZSBwcm9kdWt0dSBzIGNpZcS+b20gb2RoYWxpxaUga29uZmlndXLDoWNpZSwga3RvcsOpIHNww7Rzb2J1asO6IHByb2Jsw6lteSwgcm92bmFrbyBha28gemJpZXJhxaUgcG/FvmlhZGF2a3kgYSBuw6F2cmh5IHXFvsOtdmF0ZcS+b3YuDQo8L3A+DQo8cD4NCiAgICBQcmVkIG9maWNpw6FsbnltIHZ5ZGFuw61tLCBiZXRhIHZlcnppYSBwcmVjaMOhZHphIGNlbMO9IGN5a2x1cyBpbnRlcm7DqWhvIHRlc3RvdmFuaWEsIG5hIGt0b3LDqWhvIGtvbmNpIGplIHByb2dyYW0gZG9zdGF0b8SNbmUgc3RhYmlsbsO9IHZvIHbDpMSNxaFpbmUgcG/EjcOtdGHEjW92w71jaCBzeXN0w6ltb2NoLg0KPC9wPg0KPHA+DQo8L3A+DQo8dWw+DQo8L3VsPg0KPHA+DQogICAgVmV6bWl0ZSBwcm9zw61tIG5hIHZlZG9taWUsIMW+ZSBiZXRhIHZlcnppYSA8Yj5OSUUgSkU8L2I+IGtvbmXEjW7DoSB2ZXJ6aWEgcHJvZHVrdHUgYSBwcmV0byBhdXRvciBuZXphcnXEjXVqZSBhYnNlbmNpdSBjaMO9Yiwga3RvcsOpIG3DtMW+dSBuYXJ1xaFpxaUgxI1pbm5vc8WlIHBvxI3DrXRhxI1hIGEgLyBhbGVibyB2aWVzxaUgayBzdHJhdGUgZMOhdC4NCjwvcD4NCjxwPg0KICAgIFYgZMO0c2xlZGt1IHRvaG8gYmV0YSB0ZXN0ZXJpIHBvdcW+w612YWrDuiBiZXRhIHZlcnppdSBuYSBzdm9qZSB2bGFzdG7DqSByaXppa28gYSBFLVZJU0lPTiBJbnRlcm5hdGlvbmFsLCBzcm8gbmVuZXNpZSDFvmlhZG51IHpvZHBvdmVkbm9zxaUgemEgYWvDqWtvxL52ZWsgZMO0c2xlZGt5IHZ5cGzDvXZhasO6Y2UgeiBwb3XFvml0aWEgYmV0YSB2ZXJ6aWUuDQo8L3A+DQo8aDM+w5rEjWFzxaUgdiBiZXRhIHRlc3RvdmFuaWUgdW1vxb7FiHVqZTo8L2gzPg0KPHVsPg0KICAgPGxpPmJ5xaUgbWVkemkgcHJ2w71taSwga3RvcsOtIHrDrXNrYWrDuiBwcsOtc3R1cCBrIG5ham5vdsWhw61tIHZlcnppw6FtIHByb2R1a3RvdjwvbGk+DQogICA8bGk+cG9tw7RjxaUgbsOhbSB6bGVwxaFpxaUga3ZhbGl0dSB0ZXN0b3ZhbsO9Y2ggcHJvZHVrdG92PC9saT4NCiAgIDxsaT5wb3NreXRuw7rFpSBuw6FtIFZhxaFlIG7DoXZyaHkgbmEgbW/Fvm7DqSB6bGVwxaFlbmlhIHByb2R1a3R1PC9saT4NCiAgIDxsaT5iZXpwbGF0bsO6IHRlY2huaWNrw7ogcG9kcG9ydTwvbGk+DQogICA8bGk+c3BvbHVwcmFjb3ZhxaUgcHJpYW1vIHMgdsO9dm9qw6FybWkgYSDEj2FsxaHDrW1pIGJldGEgdGVzdGVyeSBwb3XFvml0w61tIG9kYm9ybmVqIHNla2NpZSBuw6HFoWhvIDxhIGhyZWY9Imh0dHA6Ly9iZXRhLnZpc3VhbC1waHAuY29tIiB0YXJnZXQ9Il9ibGFuayI+Zm9yYTwvYT48L2xpPg0KPC91bD4NCjxoMz7DmsSNYXPFpSB2IGJldGEgdGVzdG92YW5pYSB2ecW+YWR1amU6PC9oMz4NCjx1bD4NCiAgIDxsaT5zdGlhaG51xaUgYSBuYWluxaF0YWxvdmHFpSBwcm9kdWt0LCBrdG9yw6lobyB2ZXJ6aWEgamUgdXLEjWVuw6EgbmEgdGVzdG92YW5pZTwvbGk+DQogICA8bGk+c3Ryw6F2acWlIHVyxI1pdMO6IGRvYnUgbmEgem96bsOhbWVuaWUgc2EgcyBwcm9kdWt0b20gYSBqZWhvIHNrw7rFoWFuw61tPC9saT4NCiAgIDxsaT5wcmlwcmF2acWlIGEgb2Rvc2xhxaUgaGzDoXNlbmllIG8gYWvDvWNoa2/EvnZlayBuw6FqZGVuw71jaCBjaHliw6FjaDwvbGk+DQogICA8bGk+cG9za3l0bsO6xaUgbsOhdnJoeSBuYSBzcMO0c29ieSwgYWtvIHpsZXDFoWnFpSB0ZXN0b3ZhbsO9IHByb2R1a3Q8L2xpPg0KICAgPGxpPm9kb3NsYcWlIGhsw6FzZW5pZSBvIHByb2Jsw6ltb2NoIHMga29tcGF0aWJpbGl0b3UsIGt0b3LDqSBzw7p2aXNpYSBzIFZhxaFvdSDFoXBlY2lmaWNrb3Uga29uZmlndXLDoWNpb3U8L2xpPg0KPC91bD4NCjxoMz5IbMOhc2VuaWUgcHJvYmzDqW1vdjo8L2gzPg0KPHVsPg0KICAgPGxpPkFrIGNoY2V0ZSBuYWhsw6FzacWlIGNoeWJ1LCB1dmXEj3RlIHBvZHJvYm7DvSBvcGlzLCBha8O9bSBzcMO0c29ib20gc2EgcHJlamF2dWplIHZvIFZhxaFvbSBzeXN0w6ltZSwga3Jva3ksIGt0b3LDqSB2ZWTDuiBhxb4gayBjaHliZSBhIHZsYXN0bm9zdGkgaGFyZHbDqXJ1IGEgc29mdHbDqXJ1IHBvdcW+aXTDqWhvIG5hIHRlc3RvdmFuaWUuIFBvxaFsaXRlIHN2b2ogcG9waXMgbmEgZS1tYWlsb3bDuiBhZHJlc3UgdXZlZGVuw7ogbmEgdGVqdG8gc3Ryw6Fua2UsIGFsZWJvIHZ5dcW+aXRlIGludGVybsOpIGZ1bmtjaWUgcHJvZHVrdHUgcHJlIGhsw6FzZW5pZSBjaMO9Yi48L2xpPg0KICAgPGxpPk3DtMW+ZXRlIHRpZcW+IG5haGzDoXNpxaUgcHJvYmzDqW15IGEgesOtc2thxaUgb2Rwb3ZlZGUgbmEgb3TDoXpreSBuYSBuYcWhb20gPGEgaHJlZj0iaHR0cDovL2JldGEudmlzdWFsLXBocC5jb20iIHRhcmdldD0iX2JsYW5rIj5mw7NyZTwvYT4uPC9saT4NCiAgIDxsaT5Uw7p0byBwcm9jZWTDunJ1IG3DtMW+ZXRlIHBvdcW+acWlIGFqIHByZSBzdm9qZSBuw6F2cmh5IG5hIHpsZXDFoWVuaWUgcHJvZHVrdHUuPC9saT4NCjwvdWw+DQo8cD4NCiAgICBBayBtw6F0ZSBha8Opa2/EvnZlayBvdMOhemt5IHTDvWthasO6Y2Ugc2EgcHJvZ3JhbXUgYmV0YSB0ZXN0b3ZhbmlhIHByb2R1a3RvdiwgbmFww63FoXRlIHByb3PDrW0gbmEgPGEgaHJlZj0ibWFpbHRvOmJldGFAdmlzdWFsLXBocC5jb20iPmJldGFAdmlzdWFsLXBocC5jb208L2E+DQo8L3A+dmFyIF9fSmF2YVNjcmlwdFRpbWVTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLzEwMDA7CmZ1bmN0aW9uIGR1bXBKU1RpbWUobmFtZSkKewogICAgYWxlcnQobmFtZSsiOiAiK3JvdW5kKG1pY3JvdGltZSgpLV9fSmF2YVNjcmlwdFRpbWVTdGFydCwgNCkrInMiKTsKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBzdHJpbmcgQkFTRTY0Cgp2YXIgQmFzZTY0ID0gewogICAgLy8gcHJpdmF0ZSBwcm9wZXJ0eQogICAgX2tleVN0ciA6ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIsCgogICAgLy8gcHVibGljIG1ldGhvZCBmb3IgZW5jb2RpbmcKICAgIGVuY29kZSA6IGZ1bmN0aW9uIChpbnB1dCkgewogICAgICAgIHZhciBvdXRwdXQgPSAiIjsKICAgICAgICB2YXIgY2hyMSwgY2hyMiwgY2hyMywgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDsKICAgICAgICB2YXIgaSA9IDA7CgogICAgICAgIGlucHV0ID0gQmFzZTY0Ll91dGY4X2VuY29kZShpbnB1dCk7CgogICAgICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7CgogICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspOwogICAgICAgICAgICBjaHIyID0gaW5wdXQuY2hhckNvZGVBdChpKyspOwogICAgICAgICAgICBjaHIzID0gaW5wdXQuY2hhckNvZGVBdChpKyspOwoKICAgICAgICAgICAgZW5jMSA9IGNocjEgPj4gMjsKICAgICAgICAgICAgZW5jMiA9ICgoY2hyMSAmIDMpIDw8IDQpIHwgKGNocjIgPj4gNCk7CiAgICAgICAgICAgIGVuYzMgPSAoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KTsKICAgICAgICAgICAgZW5jNCA9IGNocjMgJiA2MzsKCiAgICAgICAgICAgIGlmIChpc05hTihjaHIyKSkgewogICAgICAgICAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDsKICAgICAgICAgICAgfSBlbHNlIGlmIChpc05hTihjaHIzKSkgewogICAgICAgICAgICAgICAgZW5jNCA9IDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKwogICAgICAgICAgICB0aGlzLl9rZXlTdHIuY2hhckF0KGVuYzEpICsgdGhpcy5fa2V5U3RyLmNoYXJBdChlbmMyKSArCiAgICAgICAgICAgIHRoaXMuX2tleVN0ci5jaGFyQXQoZW5jMykgKyB0aGlzLl9rZXlTdHIuY2hhckF0KGVuYzQpOwoKICAgICAgICB9CgogICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICB9LAoKICAgIC8vIHB1YmxpYyBtZXRob2QgZm9yIGRlY29kaW5nCiAgICBkZWNvZGUgOiBmdW5jdGlvbiAoaW5wdXQpIHsKICAgICAgICB2YXIgb3V0cHV0ID0gIiI7CiAgICAgICAgdmFyIGNocjEsIGNocjIsIGNocjM7CiAgICAgICAgdmFyIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7CiAgICAgICAgdmFyIGkgPSAwOwoKICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XCtcL1w9XS9nLCAiIik7CgogICAgICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7CgogICAgICAgICAgICBlbmMxID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpOwogICAgICAgICAgICBlbmMyID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpOwogICAgICAgICAgICBlbmMzID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpOwogICAgICAgICAgICBlbmM0ID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpOwoKICAgICAgICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7CiAgICAgICAgICAgIGNocjIgPSAoKGVuYzIgJiAxNSkgPDwgNCkgfCAoZW5jMyA+PiAyKTsKICAgICAgICAgICAgY2hyMyA9ICgoZW5jMyAmIDMpIDw8IDYpIHwgZW5jNDsKCiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMSk7CgogICAgICAgICAgICBpZiAoZW5jMyAhPSA2NCkgewogICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaHIyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW5jNCAhPSA2NCkgewogICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaHIzKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIG91dHB1dCA9IEJhc2U2NC5fdXRmOF9kZWNvZGUob3V0cHV0KTsKCiAgICAgICAgcmV0dXJuIG91dHB1dDsKCiAgICB9LAoKICAgIC8vIHByaXZhdGUgbWV0aG9kIGZvciBVVEYtOCBlbmNvZGluZwogICAgX3V0ZjhfZW5jb2RlIDogZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cclxuL2csIlxuIik7CiAgICAgICAgdmFyIHV0ZnRleHQgPSAiIjsKCiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBzdHJpbmcubGVuZ3RoOyBuKyspIHsKCiAgICAgICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQobik7CgogICAgICAgICAgICBpZiAoYyA8IDEyOCkgewogICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoKGMgPiAxMjcpICYmIChjIDwgMjA0OCkpIHsKICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiA2KSB8IDE5Mik7CiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiA2MykgfCAxMjgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjID4+IDEyKSB8IDIyNCk7CiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjID4+IDYpICYgNjMpIHwgMTI4KTsKICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIC8vZHVtcCh1dGZ0ZXh0KTsKICAgICAgICByZXR1cm4gdXRmdGV4dDsKICAgIH0sCgogICAgLy8gcHJpdmF0ZSBtZXRob2QgZm9yIFVURi04IGRlY29kaW5nCiAgICBfdXRmOF9kZWNvZGUgOiBmdW5jdGlvbiAodXRmdGV4dCkgewogICAgICAgIHZhciBzdHJpbmcgPSAiIjsKICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgdmFyIGMgPSBjMSA9IGMyID0gMDsKCiAgICAgICAgd2hpbGUgKCBpIDwgdXRmdGV4dC5sZW5ndGggKSB7CgogICAgICAgICAgICBjID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkpOwoKICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHsKICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoKGMgPiAxOTEpICYmIChjIDwgMjI0KSkgewogICAgICAgICAgICAgICAgYzIgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsxKTsKICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7CiAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjMiA9IHV0ZnRleHQuY2hhckNvZGVBdChpKzEpOwogICAgICAgICAgICAgICAgYzMgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsyKTsKICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDE1KSA8PCAxMikgfCAoKGMyICYgNjMpIDw8IDYpIHwgKGMzICYgNjMpKTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHJpbmc7CiAgICB9Cgp9OwoKZnVuY3Rpb24gYmFzZTY0X2VuY29kZSh2YWx1ZSkKewogICAgcmV0dXJuKEJhc2U2NC5lbmNvZGUodmFsdWUpKTsKfQoKZnVuY3Rpb24gYmFzZTY0X2RlY29kZSh2YWx1ZSkKewogICAgcmV0dXJuKEJhc2U2NC5kZWNvZGUodmFsdWUpKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gY29va2llcwoKZnVuY3Rpb24gY3JlYXRlQ29va2llKG5hbWUsdmFsdWUsc2Vjb25kcykgCnsKICAgIC8vYWxlcnQoZG9jdW1lbnQuY29va2llKTsKICAgIGlmIChzZWNvbmRzKSAKICAgIHsKICAgICAgICBpZiAod2luZG93LlREYXRlVGltZSAmJiBzZWNvbmRzIGluc3RhbmNlb2YgVERhdGVUaW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGV4cGlyZXMgPSAiOyBleHBpcmVzPSIrc2Vjb25kcy50b0dNVFN0cmluZygpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSsoc2Vjb25kcyoxMDAwKSk7CiAgICAgICAgICAgIHZhciBleHBpcmVzID0gIjsgZXhwaXJlcz0iK2RhdGUudG9HTVRTdHJpbmcoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIAogICAgICAgIHZhciBleHBpcmVzID0gIiI7CiAgICAgICAgCiAgICBpZiAodHlwZW9mKGNvb2tpZURvbWFpbikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgY29va2llRG9tYWluID0gIiI7CiAgICAKICAgIC8vZG9jdW1lbnQuZG9tYWluID0gY29va2llRG9tYWluOwogICAgLy9kdW1wKGRvY3VtZW50LmRvbWFpbik7CiAgICAKICAgIC8vYWxlcnQoZG9jdW1lbnQuY29va2llKTsKICAgIC8vZHVtcChuYW1lKyI9IitlbmNvZGVVUklDb21wb25lbnQodmFsdWUpK2V4cGlyZXMrIjsgcGF0aD0vIik7CiAgICAvL3ZhciBkb21haW4gPSBjb29raWVEb21haW47CiAgICAgICAgCiAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lKyI9IitlbmNvZGVVUklDb21wb25lbnQodmFsdWUpK2V4cGlyZXMrKGNvb2tpZURvbWFpbiA/ICI7ZG9tYWluPSIrY29va2llRG9tYWluIDogIiIpKyI7cGF0aD0vIjsKfTsKCmZ1bmN0aW9uIHJlYWRDb29raWUobmFtZSkgewogICAgdmFyIG5hbWVFUSA9IG5hbWUgKyAiPSI7CiAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgIGZvcih2YXIgaT0wO2kgPCBjYS5sZW5ndGg7aSsrKSB7CiAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCk9PScgJykgYyA9IGMuc3Vic3RyaW5nKDEsYy5sZW5ndGgpOwogICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PSAwKSByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsYy5sZW5ndGgpKTsKICAgIH0KICAgIHJldHVybiBudWxsOwp9OwoKZnVuY3Rpb24gZXJhc2VDb29raWUobmFtZSkgewogICAgY3JlYXRlQ29va2llKG5hbWUsIiIsLTEpOwp9OwoKZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHsKICAgIHJldHVybihyZWFkQ29va2llKG5hbWUpKTsKfTsKCmZ1bmN0aW9uIHNldENvb2tpZShuYW1lLHZhbHVlLHNlY29uZHMpIAp7CiAgICBjcmVhdGVDb29raWUobmFtZSx2YWx1ZSxzZWNvbmRzKTsKfTsKCmZ1bmN0aW9uIGRlbGV0ZUNvb2tpZShuYW1lKSB7CiAgICBlcmFzZUNvb2tpZShuYW1lKTsKfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIHN0cmluZwoKU3RyaW5nLnByb3RvdHlwZS50cmltID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7Cn07ClN0cmluZy5wcm90b3R5cGUubHRyaW0gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15ccysvLCIiKTsKfTsKU3RyaW5nLnByb3RvdHlwZS5ydHJpbSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXHMrJC8sIiIpOwp9OwoKLypmdW5jdGlvbiB0cmltKHN0cikKewogICAgcmV0dXJuKHN0ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIikpOwp9OyovCgpmdW5jdGlvbiB0cmltKHN0cmluZ1RvVHJpbSkgCnsKICAgIHJldHVybiBuZXcgU3RyaW5nKHN0cmluZ1RvVHJpbSkucmVwbGFjZSgvXlxzK3xccyskL2csIiIpOwp9OwpmdW5jdGlvbiBsdHJpbShzdHJpbmdUb1RyaW0pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nKHN0cmluZ1RvVHJpbSkucmVwbGFjZSgvXlxzKy8sIiIpOwp9OwpmdW5jdGlvbiBydHJpbShzdHJpbmdUb1RyaW0pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nKHN0cmluZ1RvVHJpbSkucmVwbGFjZSgvXHMrJC8sIiIpOwp9OwoKZnVuY3Rpb24gdXJsZW5jb2RlKHN0cmluZykgCnsKICAgIHRyeSAKICAgIHsKICAgICAgICBzdHJpbmcgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKTsKICAgICAgICAKICAgIH0KICAgIGNhdGNoKGUpCiAgICB7CiAgICAgICAgc3RyaW5nID0gZXNjYXBlKHN0cmluZyk7CiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAiJTJCIik7CiAgICB9CiAgICAKICAgIHJldHVybihzdHJpbmcpOwp9OwogCmZ1bmN0aW9uIHVybGRlY29kZShzdHJpbmcpIAp7CiAgICB0cnkgCiAgICB7CiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJpbmcpOwogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICByZXR1cm4gdW5lc2NhcGUoc3RyaW5nKTsKICAgIH0KfTsKCmZ1bmN0aW9uIF91dGY4X2VuY29kZShzdHJpbmcpIAp7CiAgICBzdHJpbmcgPSBuZXcgU3RyaW5nKHN0cmluZyk7CiAgICAKICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cclxuL2csIlxuIik7CiAgICB2YXIgdXRmdGV4dCA9ICIiOwoKICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7CgogICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQobik7CgogICAgICAgIGlmIChjIDwgMTI4KSB7CiAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZigoYyA+IDEyNykgJiYgKGMgPCAyMDQ4KSkgewogICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpOwogICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiA2MykgfCAxMjgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjID4+IDEyKSB8IDIyNCk7CiAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpOwogICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiA2MykgfCAxMjgpOwogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIHV0ZnRleHQ7Cn07CiAKZnVuY3Rpb24gX3V0ZjhfZGVjb2RlKHV0ZnRleHQpIAp7CiAgICB1dGZ0ZXh0ID0gbmV3IFN0cmluZyh1dGZ0ZXh0KTsKCiAgICB2YXIgc3RyaW5nID0gIiI7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgYyA9IGMxID0gYzIgPSAwOwoKICAgIHdoaWxlICggaSA8IHV0ZnRleHQubGVuZ3RoICkgewoKICAgICAgICBjID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkpOwoKICAgICAgICBpZiAoYyA8IDEyOCkgewogICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKChjID4gMTkxKSAmJiAoYyA8IDIyNCkpIHsKICAgICAgICAgICAgYzIgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsxKTsKICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMzEpIDw8IDYpIHwgKGMyICYgNjMpKTsKICAgICAgICAgICAgaSArPSAyOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYzIgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsxKTsKICAgICAgICAgICAgYzMgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsyKTsKICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpOwogICAgICAgICAgICBpICs9IDM7CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gc3RyaW5nOwp9OwoKZnVuY3Rpb24gdXJsRW5jb2RlKHN0cmluZykgCnsKICAgIHJldHVybiB1cmxlbmNvZGUoc3RyaW5nKTsKfTsKZnVuY3Rpb24gdXJsRGVjb2RlKHN0cmluZykgCnsKICAgIHJldHVybiB1cmxkZWNvZGUoc3RyaW5nKTsKfTsKCmZ1bmN0aW9uIGNsZWFuTGluayhsaW5rKQp7CiAgICAgICAgbGluayA9IGxpbmsucmVwbGFjZSgiLy8iLCAiLyIpOwogICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2UoIi8vIiwgIi8iKTsKICAgICAgICBsaW5rID0gbGluay5yZXBsYWNlKCIvLyIsICIvIik7CiAgICAgICAgbGluayA9IGxpbmsucmVwbGFjZSgiLy8iLCAiLyIpOwogICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2UoIi8vIiwgIi8iKTsKICAgICAgICBsaW5rID0gbGluay5yZXBsYWNlKCIvLyIsICIvIik7CiAgICAgICAgbGluayA9IGxpbmsucmVwbGFjZSgiLy8iLCAiLyIpOwogICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2UoIi8vIiwgIi8iKTsKICAgICAgICBsaW5rID0gbGluay5yZXBsYWNlKCIvLyIsICIvIik7CiAgICAgICAgbGluayA9IGxpbmsucmVwbGFjZSgiOi8iLCAiOi8vIik7CiAgICAgICAgbGluayA9IGxpbmsucmVwbGFjZSgiL2h0dHA6IiwgImh0dHA6Iik7CiAgICAgICAgbGluayA9IGxpbmsucmVwbGFjZSgiL2h0dHBzOiIsICJodHRwczoiKTsKICAgIAogICAgcmV0dXJuKGxpbmspOwp9OwpmdW5jdGlvbiBzdHJfcmVwbGFjZShzZWFyY2gsIHJlcGxhY2UsIHN1YmplY3QpCnsKICAgIHN1YmplY3QgPSBuZXcgU3RyaW5nKHN1YmplY3QpOwogICAgCiAgICByZXR1cm4oc3ViamVjdC5zcGxpdChzZWFyY2gpLmpvaW4ocmVwbGFjZSkpOwoKICAgIC8vc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1xcL2csICJcXFxcIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cWy9nLCAiXFxbIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cXS9nLCAiXFxdIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cKC9nLCAiXFwoIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cKS9nLCAiXFwpIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cLi9nLCAiXFwuIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cKi9nLCAiXFwqIik7CiAgICAvL3NlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cPy9nLCAiXFw/Iik7CiAgICAKICAgIC8vZHVtcChzZWFyY2gpOwogICAgLy9zdWJqZWN0ID0gc3ViamVjdC5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoLCAiZyIpLCByZXBsYWNlKTsKICAgIAogICAgLy9yZXR1cm4oc3ViamVjdCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW1iZXIsIHRob3VzYW5kU2VwYXJhdG9yLCBmbG9hdFNlcGFyYXRvciwgbnVsbEZsb2F0UmVwbGFjZW1lbnQpCnsKICAgIGlmICghdHlwZW9mKG51bGxGbG9hdFJlcGxhY2VtZW50KSAhPSAibnVtYmVyIikKICAgICAgICBudWxsRmxvYXRSZXBsYWNlbWVudCA9IDA7CgogICAgaWYgKGlzTmFOKE1hdGguYWJzKG51bWJlcikpKQogICAgICAgIHJldHVybigiMCIpOwogICAgCiAgICBpZiAodHlwZW9mKHRob3VzYW5kU2VwYXJhdG9yKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aG91c2FuZFNlcGFyYXRvciA9ICIuIjsKICAgIGlmICh0eXBlb2YoZmxvYXRTZXBhcmF0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGZsb2F0U2VwYXJhdG9yID0gIiwiOwogICAgaWYgKHR5cGVvZihudWxsRmxvYXRSZXBsYWNlbWVudCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgbnVsbEZsb2F0UmVwbGFjZW1lbnQgPSAiIjsKCiAgICB2YXIgbiA9IG51bWJlcjsKICAgIHZhciBjID0gMTA7IC8vIHBvY2V0IHBldm55Y2ggZmxvYXQgY2lzbGljCiAgICB2YXIgZCA9IGZsb2F0U2VwYXJhdG9yOwogICAgdmFyIHQgPSB0aG91c2FuZFNlcGFyYXRvcjsKICAgIHZhciBzID0gbiA8IDAgPyAiLSIgOiAiIjsKICAgIHZhciBpID0gcGFyc2VJbnQobiA9IE1hdGguYWJzKCtuIHx8IDApLnRvRml4ZWQoYykpICsgIiI7CiAgICB2YXIgaiA9IChqID0gaS5sZW5ndGgpID4gMyA/IGogJSAzIDogMDsKICAgIAogICAgdmFyIG91dCA9IHMgKyAoaiA/IGkuc3Vic3RyKDAsIGopICsgdCA6ICIiKSArIGkuc3Vic3RyKGopLnJlcGxhY2UoLyhcZHszfSkoPz1cZCkvZywgIiQxIiArIHQpCiAgICArIChjID8gZCArIE1hdGguYWJzKG4gLSBpKS50b0ZpeGVkKGMpLnNsaWNlKDIpIDogIiIpOwogICAgCiAgICB2YXIgZmkgPSBvdXQuaW5kZXhPZihmbG9hdFNlcGFyYXRvcik7CiAgICBpZiAoZmkgPiAtMSkKICAgIHsKICAgICAgICB3aGlsZShvdXRbb3V0Lmxlbmd0aC0xXSA9PSAiMCIpCiAgICAgICAgICAgIG91dCA9IG91dC5zdWJzdHIoMCwgb3V0Lmxlbmd0aC0xKTsKICAgICAgICAgICAgCiAgICAgICAgd2hpbGUob3V0Lmxlbmd0aCA8IGZpKzErbnVsbEZsb2F0UmVwbGFjZW1lbnQpCiAgICAgICAgICAgIG91dCArPSAiMCI7CiAgICB9CiAgICBpZiAob3V0LmluZGV4T2YoZmxvYXRTZXBhcmF0b3IpID09IG91dC5sZW5ndGgtMSkKICAgICAgICBvdXQgPSBvdXQuc3Vic3RyKDAsIG91dC5sZW5ndGgtMSk7CiAgICAKICAgIC8vb3V0ID0gb3V0LnJlcGxhY2UoZmxvYXRTZXBhcmF0b3IrIjAwIiwgbnVsbEZsb2F0UmVwbGFjZW1lbnQpOwogICAgCiAgICByZXR1cm4ob3V0KTsKfQoKLyoKZnVuY3Rpb24gc3RydG90aW1lKHN0ciwgbm93KSAKeyAgCiAgICAvLyBDb252ZXJ0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIGFuZCB0aW1lIHRvIGEgdGltZXN0YW1wICAgIAogICAgLy8gICAKICAgIC8vIHZlcnNpb246IDkwMi4yNTE2ICAKICAgIC8vIGRpc2N1c3MgYXQ6IGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL3N0cnRvdGltZSAgCiAgICAvLyArICAgb3JpZ2luYWwgYnk6IENhaW8gQXJpZWRlIChodHRwOi8vY2Fpb2FyaWVkZS5jb20pICAKICAgIC8vICsgICBpbXByb3ZlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2tldmluLnZhbnpvbm5ldmVsZC5uZXQpICAKICAgIC8vICsgICAgICBpbnB1dCBieTogRGF2aWQgIAogICAgLy8gKyAgIGltcHJvdmVkIGJ5OiBDYWlvIEFyaWVkZSAoaHR0cDovL2NhaW9hcmllZGUuY29tKSAgCiAgICAvLyAlICAgICAgICBub3RlIDE6IEV4YW1wbGVzIGFsbCBoYXZlIGEgZml4ZWQgdGltZXN0YW1wIHRvIHByZXZlbnQgdGVzdHMgdG8gZmFpbCBiZWNhdXNlIG9mIHZhcmlhYmxlIHRpbWUoem9uZXMpICAKICAgIC8vICogICAgIGV4YW1wbGUgMTogc3RydG90aW1lKCcrMSBkYXknLCAxMTI5NjMzMjAwKTsgIAogICAgLy8gKiAgICAgcmV0dXJucyAxOiAxMTI5NzE5NjAwICAKICAgIC8vICogICAgIGV4YW1wbGUgMjogc3RydG90aW1lKCcrMSB3ZWVrIDIgZGF5cyA0IGhvdXJzIDIgc2Vjb25kcycsIDExMjk2MzMyMDApOyAgCiAgICAvLyAqICAgICByZXR1cm5zIDI6IDExMzA0MjUyMDIgIAogICAgLy8gKiAgICAgZXhhbXBsZSAzOiBzdHJ0b3RpbWUoJ2xhc3QgbW9udGgnLCAxMTI5NjMzMjAwKTsgIAogICAgLy8gKiAgICAgcmV0dXJucyAzOiAxMTI3MDQxMjAwICAKICAgIC8vICogICAgIGV4YW1wbGUgNDogc3RydG90aW1lKCcyMDA5LTA1LTA0IDA4OjMwOjAwJyk7ICAKICAgIC8vICogICAgIHJldHVybnMgNDogMTI0MTQxODYwMCAgCiAgICB2YXIgaSwgbWF0Y2gsIHMsIHN0clRtcCA9ICcnLCBwYXJzZSA9ICcnOyAgCiAgCiAgICBzdHJUbXAgPSBzdHI7ICAKICAgIHN0clRtcCA9IHN0clRtcC5yZXBsYWNlKC9cc3syLH18XlxzfFxzJC9nLCAnICcpOyAvLyB1bmVjZXNzYXJ5IHNwYWNlcyAgCiAgICBzdHJUbXAgPSBzdHJUbXAucmVwbGFjZSgvW1x0XHJcbl0vZywgJycpOyAvLyB1bmVjZXNzYXJ5IGNoYXJzICAKICAgIC8vZHVtcChzdHJUbXApOwogICAgCiAgICAvL2FsZXJ0KERhdGUucGFyc2Uoc3RyVG1wKS50b1N0cmluZygpKTsKICAgIGlmIChzdHJUbXAgPT0gJ25vdycpIHsgIAogICAgICAgIHJldHVybiAobmV3IERhdGUoKSkuZ2V0VGltZSgpOyAgCiAgICB9IGVsc2UgaWYgKCFpc05hTihwYXJzZSA9IERhdGUucGFyc2Uoc3RyVG1wKSkpIHsgIAogICAgICAgIHJldHVybiBwYXJzZS8xMDAwOyAgCiAgICB9IGVsc2UgaWYgKG5vdykgeyAgCiAgICAgICAgbm93ID0gbmV3IERhdGUobm93KTsgIAogICAgfSBlbHNlIHsgIAogICAgICAgIG5vdyA9IG5ldyBEYXRlKCk7ICAKICAgIH0gIAogIAogICAgc3RyVG1wID0gc3RyVG1wLnRvTG93ZXJDYXNlKCk7ICAKICAgIC8vYWxlcnQoMSk7CiAgICB2YXIgcHJvY2VzcyA9IGZ1bmN0aW9uIChtKSB7ICAKICAgICAgICB2YXIgYWdvID0gKG1bMl0gJiYgbVsyXSA9PSAnYWdvJyk7ICAKICAgICAgICB2YXIgbnVtID0gKG51bSA9IG1bMF0gPT0gJ2xhc3QnID8gLTEgOiAxKSAqIChhZ28gPyAtMSA6IDEpOyAgCiAgCiAgICAgICAgc3dpdGNoIChtWzBdKSB7ICAKICAgICAgICAgICAgY2FzZSAnbGFzdCc6ICAKICAgICAgICAgICAgY2FzZSAnbmV4dCc6ICAKICAgICAgICAgICAgICAgIHN3aXRjaCAobVsxXS5zdWJzdHJpbmcoMCwgMykpIHsgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3llYSc6ICAKICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldEZ1bGxZZWFyKG5vdy5nZXRGdWxsWWVhcigpICsgbnVtKTsgIAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vbic6ICAKICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldE1vbnRoKG5vdy5nZXRNb250aCgpICsgbnVtKTsgIAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dlZSc6ICAKICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldERhdGUobm93LmdldERhdGUoKSArIChudW0gKiA3KSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXknOiAgCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdy5zZXREYXRlKG5vdy5nZXREYXRlKCkgKyBudW0pOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaG91JzogIAogICAgICAgICAgICAgICAgICAgICAgICBub3cuc2V0SG91cnMobm93LmdldEhvdXJzKCkgKyBudW0pOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWluJzogIAogICAgICAgICAgICAgICAgICAgICAgICBub3cuc2V0TWludXRlcyhub3cuZ2V0TWludXRlcygpICsgbnVtKTsgIAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlYyc6ICAKICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldFNlY29uZHMobm93LmdldFNlY29uZHMoKSArIG51bSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoZGF5ID0gX19pc19kYXlbbVsxXS5zdWJzdHJpbmcoMCwgMyldKSAhPSAndW5kZWZpbmVkJykgeyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGRheSAtIG5vdy5nZXREYXkoKTsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPT0gMCkgeyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9IDcgKiBudW07ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDApIHsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtWzBdID09ICdsYXN0JykgZGlmZiAtPSA3OyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1bMF0gPT0gJ25leHQnKSBkaWZmICs9IDc7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAogIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldERhdGUobm93LmdldERhdGUoKSArIGRpZmYpOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0gIAogICAgICAgICAgICAgICAgfSAgCiAgCiAgICAgICAgICAgICAgICBicmVhazsgIAogIAogICAgICAgICAgICBkZWZhdWx0OiAgCiAgICAgICAgICAgICAgICBpZiAoL1xkKy8udGVzdChtWzBdKSkgeyAgCiAgICAgICAgICAgICAgICAgICAgbnVtICo9IHBhcnNlSW50KG1bMF0pOyAgCiAgCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtWzFdLnN1YnN0cmluZygwLCAzKSkgeyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3llYSc6ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdy5zZXRGdWxsWWVhcihub3cuZ2V0RnVsbFllYXIoKSArIG51bSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vbic6ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdy5zZXRNb250aChub3cuZ2V0TW9udGgoKSArIG51bSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dlZSc6ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdy5zZXREYXRlKG5vdy5nZXREYXRlKCkgKyAobnVtICogNykpOyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXknOiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cuc2V0RGF0ZShub3cuZ2V0RGF0ZSgpICsgbnVtKTsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaG91JzogIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldEhvdXJzKG5vdy5nZXRIb3VycygpICsgbnVtKTsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWluJzogIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93LnNldE1pbnV0ZXMobm93LmdldE1pbnV0ZXMoKSArIG51bSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlYyc6ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdy5zZXRTZWNvbmRzKG5vdy5nZXRTZWNvbmRzKCkgKyBudW0pOyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICAgICAgICAgIH0gIAogICAgICAgICAgICAgICAgfSBlbHNlIHsgIAogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIAogICAgICAgICAgICAgICAgfSAgCiAgCiAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgIH0gIAogIAogICAgICAgIHJldHVybiB0cnVlOyAgCiAgICB9ICAKICAKICAgIHZhciBfX2lzID0gIAogICAgeyAgCiAgICAgICAgZGF5OiAgCiAgICAgICAgeyAgCiAgICAgICAgICAgICdzdW4nOiAwLCAgCiAgICAgICAgICAgICdtb24nOiAxLCAgCiAgICAgICAgICAgICd0dWUnOiAyLCAgCiAgICAgICAgICAgICd3ZWQnOiAzLCAgCiAgICAgICAgICAgICd0aHUnOiA0LCAgCiAgICAgICAgICAgICdmcmknOiA1LCAgCiAgICAgICAgICAgICdzYXQnOiA2ICAKICAgICAgICB9LCAgCiAgICAgICAgbW9uOiAgCiAgICAgICAgeyAgCiAgICAgICAgICAgICdqYW4nOiAwLCAgCiAgICAgICAgICAgICdmZWInOiAxLCAgCiAgICAgICAgICAgICdtYXInOiAyLCAgCiAgICAgICAgICAgICdhcHInOiAzLCAgCiAgICAgICAgICAgICdtYXknOiA0LCAgCiAgICAgICAgICAgICdqdW4nOiA1LCAgCiAgICAgICAgICAgICdqdWwnOiA2LCAgCiAgICAgICAgICAgICdhdWcnOiA3LCAgCiAgICAgICAgICAgICdzZXAnOiA4LCAgCiAgICAgICAgICAgICdvY3QnOiA5LCAgCiAgICAgICAgICAgICdub3YnOiAxMCwgIAogICAgICAgICAgICAnZGVjJzogMTEgIAogICAgICAgIH0gIAogICAgfSAgCiAgCiAgICBtYXRjaCA9IHN0clRtcC5tYXRjaCgvXihcZHsxLDJ9XC5cZHsxLDJ9XC5cZHsyLDR9KShcc1xkezEsMn06XGR7MSwyfSg6XGR7MSwyfSk/KT8kLyk7ICAKICAgIC8vYWxlcnQobWF0Y2gpOwogICAgaWYgKG1hdGNoICE9IG51bGwpIHsgIAogICAgICAgIGlmICghbWF0Y2hbMl0pIHsgIAogICAgICAgICAgICBtYXRjaFsyXSA9ICcwMDowMDowMCc7ICAKICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaFszXSkgeyAgCiAgICAgICAgICAgIG1hdGNoWzJdICs9ICc6MDAnOyAgCiAgICAgICAgfSAgCiAgCiAgICAgICAgcyA9IG1hdGNoWzFdLnNwbGl0KC9cLi9nKTsgIAogIAogICAgICAgIGZvciAoaSBpbiBfX2lzLm1vbikgeyAgCiAgICAgICAgICAgIGlmIChfX2lzLm1vbltpXSA9PSBzWzFdIC0gMSkgeyAgCiAgICAgICAgICAgICAgICBzWzFdID0gaTsgIAogICAgICAgICAgICB9ICAKICAgICAgICB9ICAKICAgICAgICAvL2FsZXJ0KHNbMF0gKyAnICcgKyBzWzFdICsgJyAnICsgc1syXSArICcgJyArIG1hdGNoWzJdKTsKICAgICAgICByZXR1cm4gc3RydG90aW1lKHNbMF0gKyAnICcgKyBzWzFdICsgJyAnICsgc1syXSArICcgJyArIG1hdGNoWzJdKTsgIAogICAgfSAgCgogICAgbWF0Y2ggPSBzdHJUbXAubWF0Y2goL14oXGR7Miw0fS1cZHsyfS1cZHsyfSkoXHNcZHsxLDJ9OlxkezEsMn0oOlxkezEsMn0pPyk/JC8pOyAgCiAgICBpZiAobWF0Y2ggIT0gbnVsbCkgeyAgCiAgICAgICAgaWYgKCFtYXRjaFsyXSkgeyAgCiAgICAgICAgICAgIG1hdGNoWzJdID0gJzAwOjAwOjAwJzsgIAogICAgICAgIH0gZWxzZSBpZiAoIW1hdGNoWzNdKSB7ICAKICAgICAgICAgICAgbWF0Y2hbMl0gKz0gJzowMCc7ICAKICAgICAgICB9ICAKICAKICAgICAgICBzID0gbWF0Y2hbMV0uc3BsaXQoLy0vZyk7ICAKICAKICAgICAgICBmb3IgKGkgaW4gX19pcy5tb24pIHsgIAogICAgICAgICAgICBpZiAoX19pcy5tb25baV0gPT0gc1sxXSAtIDEpIHsgIAogICAgICAgICAgICAgICAgc1sxXSA9IGk7ICAKICAgICAgICAgICAgfSAgCiAgICAgICAgfSAgCiAgCiAgICAgICAgcmV0dXJuIHN0cnRvdGltZShzWzJdICsgJyAnICsgc1sxXSArICcgJyArIHNbMF0gKyAnICcgKyBtYXRjaFsyXSk7ICAKICAgIH0gIAogIAogICAgdmFyIHJlZ2V4ID0gJyhbKy1dP1xcZCtcXHMnICAKICAgICsgJyh5ZWFycz98bW9udGhzP3x3ZWVrcz98ZGF5cz98aG91cnM/fG1pbnxtaW51dGVzP3xzZWN8c2Vjb25kcz8nICAKICAgICsgJ3xzdW5cLj98c3VuZGF5fG1vblwuP3xtb25kYXl8dHVlXC4/fHR1ZXNkYXl8d2VkXC4/fHdlZG5lc2RheScgIAogICAgKyAnfHRodVwuP3x0aHVyc2RheXxmcmlcLj98ZnJpZGF5fHNhdFwuP3xzYXR1cmRheSknICAKICAgICsgJ3wobGFzdHxuZXh0KVxccycgIAogICAgKyAnKHllYXJzP3xtb250aHM/fHdlZWtzP3xkYXlzP3xob3Vycz98bWlufG1pbnV0ZXM/fHNlY3xzZWNvbmRzPycgIAogICAgKyAnfHN1blwuP3xzdW5kYXl8bW9uXC4/fG1vbmRheXx0dWVcLj98dHVlc2RheXx3ZWRcLj98d2VkbmVzZGF5JyAgCiAgICArICd8dGh1XC4/fHRodXJzZGF5fGZyaVwuP3xmcmlkYXl8c2F0XC4/fHNhdHVyZGF5KSknICAKICAgICsgJyhcXHNhZ28pPyc7ICAKICAKICAgIG1hdGNoID0gc3RyVG1wLm1hdGNoKG5ldyBSZWdFeHAocmVnZXgsICdnJykpOyAgCiAgCiAgICBpZiAobWF0Y2ggPT0gbnVsbCkgeyAgCiAgICAgICAgcmV0dXJuIGZhbHNlOyAgCiAgICB9ICAKICAKICAgIGZvciAoaSBpbiBtYXRjaCkgeyAgCiAgICAgICAgaWYgKCFwcm9jZXNzKG1hdGNoW2ldLnNwbGl0KCcgJykpKSB7ICAKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgCiAgICAgICAgfSAgCiAgICB9ICAKICAKICAgIHJldHVybiAobm93KTsgIAp9ICAKKi8KCi8vIGxpa2UgaW5kZXggb2YgYnV0IGNvdW50cyBvY2N1cmVuY2VzIG9mIHN1YnN0cmluZyBpbiBhIHN0cmluZwpTdHJpbmcucHJvdG90eXBlLmNvdW50T2YgPSBmdW5jdGlvbihzdWJzdHIsIGxhc3RJbmRleCkKewogICAgaWYgKCFsYXN0SW5kZXgpCiAgICAgICAgbGFzdEluZGV4ID0gMDsKCiAgICB2YXIgY291bnQgPSAwOwogICAgd2hpbGUgKGxhc3RJbmRleCAhPSAtMSkKICAgIHsKICAgICAgICBsYXN0SW5kZXggPSB0aGlzLmluZGV4T2Yoc3Vic3RyLCBsYXN0SW5kZXgpOwoKICAgICAgICBpZiAobGFzdEluZGV4ICE9IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgbGFzdEluZGV4Kys7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oY291bnQpOwp9CgppZighU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQpIAp7CiAgICBTdHJpbmcucHJvdG90eXBlLnJlcGVhdCA9IGZ1bmN0aW9uKG4pIAogICAgewogICAgICAgIHZhciBzPXRoaXMudG9TdHJpbmcoKSwgcmV0PScnOwogICAgICAgIHdoaWxlKCAobi0tKSA+IDApIHJldCs9czsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KfQppZighU3RyaW5nLnByb3RvdHlwZS5pbmRlbnQpIAp7CiAgICBTdHJpbmcucHJvdG90eXBlLmluZGVudCA9IGZ1bmN0aW9uKGxldmVsLCBkb250SW5kZW50Rmlyc3QsIGluZGVudENoYXIpIAogICAgewogICAgICAgIGluZGVudENoYXIgPSBpbmRlbnRDaGFyIHx8ICJcdCI7CiAgICAgICAgZG9udEluZGVudEZpcnN0ID0gTnVtYmVyKGRvbnRJbmRlbnRGaXJzdCl8fDA7CiAgICAgICAgdmFyIHMgPSB0aGlzLnRvU3RyaW5nKCk7CiAgICAgICAgcyA9IHMuc3BsaXQoL14vbSk7CiAgICAgICAgZm9yKHZhciBpPWRvbnRJbmRlbnRGaXJzdCwgbD1zLmxlbmd0aDsgaTxsOyBpKyspCiAgICAgICAgICAgIHNbaV0gPSBpbmRlbnRDaGFyLnJlcGVhdChsZXZlbCkgKyBzW2ldOwogICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgfQp9OwoKCmZ1bmN0aW9uIHJvdW5kKG51bSwgZGVjKQp7CiAgICByZXR1cm4oTWF0aC5yb3VuZChudW0qTWF0aC5wb3coMTAsZGVjKSkvTWF0aC5wb3coMTAsZGVjKSk7Cn0KCmZ1bmN0aW9uIGZsb29yKG51bSwgZGVjKQp7CiAgICByZXR1cm4oTWF0aC5mbG9vcihudW0qTWF0aC5wb3coMTAsZGVjKSkvTWF0aC5wb3coMTAsZGVjKSk7Cn0KCmZ1bmN0aW9uIGNlaWwobnVtLCBkZWMpCnsKICAgIHJldHVybihNYXRoLmNlaWwobnVtKk1hdGgucG93KDEwLGRlYykpL01hdGgucG93KDEwLGRlYykpOwp9CgovKgovLyBoYWQgdG8gcmVtb3ZlIGR1ZSB0byBXZWJPcHRpbWl6ZXIgYW5kIE1pbmlmaWVyIG1vZHVsZQovLyBmaXggYmFkIGltcGxlbWVudGVkIHNwbGl0KCkgbWV0aG9kIC0gYmFkIGlmIHNlcGFyYXRvciBub3QgaW5zaWRlIHN0cmluZyBvciBpcyBlbXB0eSBzdHJpbmcKU3RyaW5nLnByb3RvdHlwZS5fc3BsaXQgPSBTdHJpbmcucHJvdG90eXBlLnNwbGl0OwpTdHJpbmcucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24oc2VwYXJhdG9yKSB7CiAgICBpZiAodHlwZW9mKHNlcGFyYXRvcikgPT0gInN0cmluZyIpIC8vIG1heSBiZSBhbHNvIG9iamVjdCBpZiBSZWdFeHAKICAgIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuKFtdKTsKICAgICAgICAvL2lmIChzZXBhcmF0b3IgPT0gIltTRVBBUkFUT1JdIikKICAgICAgICAvLyAgICBhbGVydCh0aGlzICsgIiAiICsgc2VwYXJhdG9yICsgIiB8ICIgKyB0aGlzLmluZGV4T2Yoc2VwYXJhdG9yKSk7CiAgICAgICAgaWYgKHRoaXMuaW5kZXhPZihzZXBhcmF0b3IpID09IC0xKQogICAgICAgICAgICByZXR1cm4oW3RoaXMudG9TdHJpbmcoKV0pOwogICAgfQogICAgcmV0dXJuIHRoaXMuX3NwbGl0KHNlcGFyYXRvcik7Cn0KKi8KCmZ1bmN0aW9uIGV4dHJhY3RJbnQoc3RyLCBkZWZhdWx0VmFsdWUpCnsKICAgIHZhciB2YWx1ZSA9IGV4dHJhY3RGbG9hdChzdHIsIGRlZmF1bHRWYWx1ZSk7CiAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpOwogICAgCiAgICByZXR1cm4odmFsdWUpOwp9CgpmdW5jdGlvbiBleHRyYWN0RmxvYXQoc3RyLCBkZWZhdWx0VmFsdWUpCnsKICAgIGlmICh0eXBlb2Yoc3RyKSA9PSAibnVtYmVyIikKICAgICAgICByZXR1cm4oc3RyKTsKICAgIAogICAgaWYgKHR5cGVvZihzdHIpICE9ICJzdHJpbmciKQogICAgICAgIHN0ciA9ICIiOwogICAgICAgIAogICAgaWYgKHR5cGVvZihkZWZhdWx0VmFsdWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGRlZmF1bHRWYWx1ZSA9IDA7CiAgICAKICAgIC8vdmFyIG51bSA9IHN0ci5tYXRjaCgvKFxcK3wtfFwufFxkKS9nKTsKICAgIHZhciBudW0gPSBzdHIubWF0Y2goLygtfFwufFxkKS9nKTsKICAgIGlmIChudW0pCiAgICB7CiAgICAgICAgdmFyIF9udW0gPSAiIjsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBudW0ubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICBfbnVtICs9IG51bVtpXTsKICAgICAgICAKICAgICAgICBpZiAoIV9udW0ubGVuZ3RoKQogICAgICAgICAgICBfbnVtID0gZGVmYXVsdFZhbHVlOwogICAgfQogICAgZWxzZQogICAgICAgIF9udW0gPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgCiAgICByZXR1cm4ocGFyc2VGbG9hdChfbnVtKSk7Cn0KCmZ1bmN0aW9uIGV4dHJhY3RIZXgoc3RyLCBkZWZhdWx0VmFsdWUpCnsKICAgIGlmICh0eXBlb2Yoc3RyKSA9PSAibnVtYmVyIikKICAgICAgICByZXR1cm4oc3RyKTsKICAgIAogICAgaWYgKHR5cGVvZihzdHIpICE9ICJzdHJpbmciKQogICAgICAgIHN0ciA9ICIiOwogICAgCiAgICB2YXIgbnVtID0gc3RyLm1hdGNoKC8oXFwrfC18XGR8YXxifGN8ZHxlfGZ8QXxCfEN8RHxFfEYpL2cpOwogICAgaWYgKG51bSkKICAgIHsKICAgICAgICB2YXIgX251bSA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG51bS5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIF9udW0gKz0gbnVtW2ldOwogICAgICAgIAogICAgICAgIGlmICghX251bS5sZW5ndGgpCiAgICAgICAgICAgIF9udW0gPSBkZWZhdWx0VmFsdWU7CiAgICB9CiAgICBlbHNlCiAgICAgICAgX251bSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgICAKICAgIHJldHVybihfbnVtKTsKfQoKCi8vIGh5cGhlLW5hdGVkLXRleHQgdG8gY2FtZWxJemVkVGV4dApmdW5jdGlvbiBjYW1lbGl6ZShzdHIpIAp7CiAgICByZXQgPSBzdHIucmVwbGFjZSgvLSsoLik/L2csIGZ1bmN0aW9uKG1hdGNoLCBjaHIpIAogICAgewogICAgICAgIHJldHVybiBjaHIgPyBjaHIudG9VcHBlckNhc2UoKSA6ICcnOwogICAgfSk7CgogICAgcmV0ID0gcmV0LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpK3JldC5zdWJzdHJpbmcoMSwgMTAwMCk7CiAgICAKICAgIHJldHVybihyZXQpOwp9CgovLyBjYW1lbEl6ZWRUZXh0IHRvIGh5cGhlbi1hdGVkLXRleHQKZnVuY3Rpb24gaHlwaGVuYXRlKHN0cikgCnsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgZnVuY3Rpb24oYSwgYiwgYykKICAgIHsKICAgICAgICByZXR1cm4gYiArICItIiArIGMudG9Mb3dlckNhc2UoKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBodG1sZW50aXRpZXMoaHRtbCkKewogICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgCiAgICByZXR1cm4oaHRtbCk7Cn0KCmZ1bmN0aW9uIGh0bWxlbnRpdHlfZGVjb2RlKGh0bWwpCnsKICAgIGlmICh0eXBlb2YoaHRtbCkgIT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiICYmIEJyb3dzZXIudmVyc2lvbiA8PSA4KSAgLy8gSUUgOCBkb2VzIG5vdCBrbm93ICZhcG9zOwogICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8mYW1wO2Fwb3M7L2csICImYXBvczsiKTsKICAgICAgICAKICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8mbHQ7L2csICI8IikucmVwbGFjZSgvJmd0Oy9nLCAiPiIpLnJlcGxhY2UoLyZuYnNwOy9nLCAiICIpLnJlcGxhY2UoLyZxdW90Oy9nLCAiXCIiKS5yZXBsYWNlKC8mYXBvczsvZywgIiciKTsKICAgIAogICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyZhbXA7L2csICImIik7CiAgICB9CiAgICByZXR1cm4oaHRtbCk7Cn0KCgoKZnVuY3Rpb24gc3RydG9oZXgoc3RyKQp7CiAgICB2YXIgaGV4ID0gJyc7CiAgICBmb3IgKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krKykgCiAgICB7CiAgICAgICAgaGV4ICs9ICcnK3N0ci5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KTsKICAgIH0KICAgIHJldHVybiBoZXg7Cn0KCmZ1bmN0aW9uIGludHRvaGV4KHZhbHVlKQp7CiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7Cn0KCmZ1bmN0aW9uIGhleHRvaW50KHZhbHVlKQp7CiAgICByZXR1cm4gcGFyc2VJbnQoZXh0cmFjdEhleCh2YWx1ZSksIDE2KTsKfQoKZnVuY3Rpb24gZGVjMmhleCh2YWx1ZSwgc2l6ZSkKewogICAgdmFsdWUgPSBleHRyYWN0SW50KHZhbHVlLCAwKTsKICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoMTYpOwogICAgaWYgKHNpemUpICAgIAogICAgewogICAgICAgIHdoaWxlKHZhbHVlLmxlbmd0aCA8IHNpemUpCiAgICAgICAgICAgIHZhbHVlID0gIjAiK3ZhbHVlOwogICAgfQogICAgdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwoKICAgIHJldHVybih2YWx1ZSk7Cn0KICAgIApmdW5jdGlvbiByZ2JDb2xvcjJIZXgoY29sb3IpCnsKICAgIGlmIChjb2xvciAmJiBjb2xvci5pbmRleE9mKCJyZ2IoIikgIT0gLTEpCiAgICB7CiAgICAgICAgdmFyIG1hdGNoZXMgPSBjb2xvci5tYXRjaCgvcmdiXChbXlwpXStcKS9nKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBtYXRjaGVzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfY29sb3IgPSBtYXRjaGVzW2ldOwogICAgICAgICAgICBfY29sb3IgPSBfY29sb3IucmVwbGFjZSgicmdiKCIsICIiKTsKICAgICAgICAgICAgX2NvbG9yID0gX2NvbG9yLnJlcGxhY2UoIikiLCAiIik7CiAgICAgICAgICAgIF9jb2xvciA9IF9jb2xvci5yZXBsYWNlKC8gL2csICIiKTsKICAgICAgICAgICAgX2NvbG9yID0gX2NvbG9yLnNwbGl0KCIsIik7CiAgICAgICAgICAgIF9jb2xvciA9ICIjIitkZWMyaGV4KF9jb2xvclswXSwgMikrZGVjMmhleChfY29sb3JbMV0sIDIpK2RlYzJoZXgoX2NvbG9yWzJdLCAyKTsKCiAgICAgICAgICAgIGNvbG9yID0gY29sb3IucmVwbGFjZShtYXRjaGVzW2ldLCBfY29sb3IpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybihjb2xvcik7Cn0KCgpSZWdFeHAucHJvdG90eXBlLmV4ZWNBbGwgPSBmdW5jdGlvbihzdHJpbmcpIAp7CiAgICB2YXIgbWF0Y2ggPSBudWxsOwogICAgdmFyIG1hdGNoZXMgPSBuZXcgQXJyYXkoKTsKICAgIHdoaWxlIChtYXRjaCA9IHRoaXMuZXhlYyhzdHJpbmcpKSB7CiAgICAgICAgdmFyIG1hdGNoQXJyYXkgPSBbXTsKICAgICAgICBmb3IgKGkgaW4gbWF0Y2gpIHsKICAgICAgICAgICAgaWYgKHBhcnNlSW50KGkpID09IGkpIHsKICAgICAgICAgICAgICAgIG1hdGNoQXJyYXkucHVzaChtYXRjaFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoQXJyYXkpOwogICAgfQogICAgcmV0dXJuIG1hdGNoZXM7Cn0KCmZ1bmN0aW9uIGV4dHJhY3RCb29sKHN0cikKewogICAgaWYgKHN0ciA9PSAidHJ1ZSIgfHwgc3RyID09ICIxIikKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAKICAgIHJldHVybihmYWxzZSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGFycmF5CgpmdW5jdGlvbiBnZXRBcnJheVZhbHVlQnlOYW1lKG5hbWUsIGEpCnsKICAgIGlmICghbmFtZSkKICAgICAgICByZXR1cm4oIiIpOwoKICAgIHZhciBfbmFtZSA9IG5hbWU7CiAgICAKICAgIG5hbWUgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCBuYW1lKTsKICAgIG5hbWUgPSBuYW1lLnNwbGl0KCJbIik7CgogICAgaWYgKG5hbWUubGVuZ3RoID09IDEpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihhKSA9PSAib2JqZWN0IiB8fCBhIGluc3RhbmNlb2YgQXJyYXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oYVtuYW1lWzBdXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgIH0KICAgICAgICAKICAgIF9uYW1lID0gbmFtZS5zaGlmdCgpOwogICAgZm9yICh2YXIgaSA9IDEgOyBpIDwgbmFtZS5sZW5ndGggOyBpKyspCiAgICAgICAgbmFtZVtpXSArPSAiXSI7CiAgICBuYW1lID0gbmFtZS5qb2luKCJbIik7CiAgICAKICAgIHJldHVybihnZXRBcnJheVZhbHVlQnlOYW1lKG5hbWUsIGFbX25hbWVdKSk7Cn0KCmZ1bmN0aW9uIGV4dHJhY3RQYXJhbXMocGFyYW1zLCBzZXBhcmF0b3IsIG9wZXJhdG9yLCBhc0FycmF5KQp7CiAgICBpZiAodHlwZW9mKHNlcGFyYXRvcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgc2VwYXJhdG9yID0gIiwiOwogICAgaWYgKHR5cGVvZihvcGVyYXRvcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgb3BlcmF0b3IgPSAiPSI7CiAgICBpZiAodHlwZW9mKGFzQXJyYXkpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGFzQXJyYXkgPSBmYWxzZTsKICAgIAogICAgdmFyIGxpbmVzID0gcGFyYW1zLnNwbGl0KHNlcGFyYXRvcik7CiAgICB2YXIgcGFyYW1zID0gbmV3IE9iamVjdDsKICAgIGZvciAodmFyIGwgPSAwIDsgbCA8IGxpbmVzLmxlbmd0aCA7IGwrKykKICAgIHsKICAgICAgICB2YXIgbGluZSA9IHRyaW0obGluZXNbbF0pOwogICAgICAgIHZhciBlcXVhbFBvcyA9IGxpbmUuaW5kZXhPZihvcGVyYXRvcik7CiAgICAgICAgaWYgKGVxdWFsUG9zID4gLTEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmFtZSA9IHRyaW0obGluZS5zdWJzdHJpbmcoMCwgZXF1YWxQb3MpKTsKICAgICAgICAgICAgdmFyIHZhbHVlID0gdHJpbShsaW5lLnN1YnN0cmluZyhlcXVhbFBvcysxLCBsaW5lLmxlbmd0aCkpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGFzQXJyYXkgJiYgbmFtZS5pbmRleE9mKCJbIikgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF9uYW1lID0gc3RyX3JlcGxhY2UoIl0iLCAiIiwgbmFtZSk7CiAgICAgICAgICAgICAgICBfbmFtZSA9IF9uYW1lLnNwbGl0KCJbIik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBfcGFyYW1zID0gcGFyYW1zOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX25hbWUubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IF9uYW1lLmxlbmd0aC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtc1tfbmFtZVtpXV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihfcGFyYW1zW19uYW1lW2ldXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1zW19uYW1lW2ldXSA9IHt9OwoKICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtcyA9IF9wYXJhbXNbX25hbWVbaV1dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwYXJhbXNbbmFtZV0gPSB2YWx1ZTsgICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcChwYXJhbXMpOwogICAgcmV0dXJuKHBhcmFtcyk7Cn07CgpmdW5jdGlvbiBpbXBsb2RlUGFyYW1zKHBhcmFtcywgc2VwYXJhdG9yLCBvcGVyYXRvcikKewogICAgaWYgKHR5cGVvZihzZXBhcmF0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHNlcGFyYXRvciA9ICIsIjsKICAgIGlmICh0eXBlb2Yob3BlcmF0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgIG9wZXJhdG9yID0gIj0iOwogICAgCiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGZvciAodmFyIGkgaW4gcGFyYW1zKQogICAgewogICAgICAgIGlmICh0eXBlb2YocGFyYW1zW2ldKSA9PSAib2JqZWN0IiB8fCBwYXJhbXNbaV0gaW5zdGFuY2VvZiBBcnJheSkKICAgICAgICAgICAgOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbGluZXMucHVzaChpK29wZXJhdG9yK3BhcmFtc1tpXSk7CiAgICB9CiAgICAKICAgIHJldHVybihsaW5lcy5qb2luKHNlcGFyYXRvcikpOwp9OwoKLy8gISEgZG8gbm90IGV4dGVuZCBBcnJheSAtIGl0IGJyZWFrcyBmb3JlYWNoIGVudW1lcmF0aW9uCmZ1bmN0aW9uIGFycmF5X2NvbnRhaW5zKGEsIG9iaikKewogICAgcmV0dXJuKGEuaW5kZXhPZihvYmopICE9IC0xKTsKfQpmdW5jdGlvbiBpbl9hcnJheShvYmosIGEpCnsKICAgIHJldHVybihhLmluZGV4T2Yob2JqKSAhPSAtMSk7Cn0KCmZ1bmN0aW9uIGFycmF5X2tleXMob2JqZWN0KQp7CiAgICB2YXIgX2tleXMgPSBbXTsKICAgIGZvciAodmFyIGkgaW4gb2JqZWN0KQogICAgewogICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoaSkgJiYgdHlwZW9mKG9iamVjdFtpXSkgIT0gImZ1bmN0aW9uIikKICAgICAgICB7CiAgICAgICAgICAgIF9rZXlzLnB1c2goaSk7CiAgICAgICAgfSAgICAgICAgCiAgICB9CiAgICAKICAgIHJldHVybihfa2V5cyk7Cn0KCmZ1bmN0aW9uIGFycmF5X21lcmdlKGExLCBhMikKewogICAgaWYgKGExIGluc3RhbmNlb2YgQXJyYXkgJiYgYTIgaW5zdGFuY2VvZiBBcnJheSkKICAgIHsKICAgICAgICB2YXIgYSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGExLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgYS5wdXNoKGExW2ldKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBhMi5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIGEucHVzaChhMltpXSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIGEgPSBjb2xsZWN0KGExLCBhMik7CiAgICB9CiAgICAKICAgIHJldHVybihhKTsKfQoKaWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikKewogIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oZWx0IC8qLCBmcm9tKi8pCiAgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoID4+PiAwOwoKICAgIHZhciBmcm9tID0gTnVtYmVyKGFyZ3VtZW50c1sxXSkgfHwgMDsKICAgIGZyb20gPSAoZnJvbSA8IDApCiAgICAgICAgID8gTWF0aC5jZWlsKGZyb20pCiAgICAgICAgIDogTWF0aC5mbG9vcihmcm9tKTsKICAgIGlmIChmcm9tIDwgMCkKICAgICAgZnJvbSArPSBsZW47CgogICAgZm9yICg7IGZyb20gPCBsZW47IGZyb20rKykKICAgIHsKICAgICAgaWYgKGZyb20gaW4gdGhpcyAmJgogICAgICAgICAgdGhpc1tmcm9tXSA9PT0gZWx0KQogICAgICAgIHJldHVybiBmcm9tOwogICAgfQogICAgcmV0dXJuIC0xOwogIH07Cn0KCi8vICEhIGRvIG5vdCBleHRlbmQgQXJyYXkgLSBpdCBicmVha3MgZm9yZWFjaCBlbnVtZXJhdGlvbgovKgpmdW5jdGlvbiBhcnJheV9yZW1vdmUoYSwgaXRlbSkKewogICAgdmFyIGluZGV4OwogICAgd2hpbGUoKGluZGV4ID0gYS5pbmRleE9mKGl0ZW0pKSA+IC0xKQogICAgICAgIGEuc3BsaWNlKGluZGV4LCAxKTsKICAgIAogICAgcmV0dXJuKGEpOwp9CiovCgovLyAhISBkbyBub3QgZXh0ZW5kIEFycmF5IC0gaXQgYnJlYWtzIGZvcmVhY2ggZW51bWVyYXRpb24KZnVuY3Rpb24gYXJyYXlfbGVuZ3RoKGEsIGVtcHR5KQp7CiAgICBpZiAodHlwZW9mKGVtcHR5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBlbXB0eSA9IGZhbHNlOwoKICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkpCiAgICAgICAgcmV0dXJuKGEubGVuZ3RoKTsKICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgZm9yICh2YXIgaSBpbiBhKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFlbXB0eSB8fCBhW2ldICE9PSAiIikKICAgICAgICAgICAgICAgIGMrKzsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIHJldHVybihjKTsKICAgIH0KfQoKZnVuY3Rpb24gaXNfYXJyYXkoYSkKewogICAgcmV0dXJuKGEgaW5zdGFuY2VvZiBBcnJheSB8fCB0eXBlb2YoYSkgPT0gIm9iamVjdCIpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyB2aXN1YWwKCmZ1bmN0aW9uIGdldFBvc2l0aW9uKG9iamVjdCwgcmVsYXRpdmVUb09iamVjdCwgcmVsYXRpdmVUb0NsYXNzTmFtZSwgd2luZG93UG9zaXRpb24pCnsKICAgIHJlbGF0aXZlVG9PYmplY3QgPSBnZXRFbGVtZW50KHJlbGF0aXZlVG9PYmplY3QpOwogICAgCiAgICAvL2R1bXAob2JqZWN0KTsKICAgIGlmIChvYmplY3QgPT0gZG9jdW1lbnQuYm9keSkKICAgICAgICByZXR1cm4oezA6MCwgMTowLCAieCI6MCwgInkiOjB9KTsKICAgIAogICAgdmFyIHBvc1ggPSAwOwogICAgdmFyIHBvc1kgPSAwOwoKICAgIHZhciBpbkFic29sdXRlID0gZmFsc2U7CiAgICB2YXIgaW5BYnNvbHV0ZUZpcnN0ID0gdHJ1ZTsKICAgIHZhciBvYmogPSBvYmplY3Q7CiAgICB3aGlsZShvYmopICAgIAogICAgewogICAgICAgIC8vaWYgKGdldFN0eWxlKG9iaiwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIikKICAgICAgICBpZiAob2JqLnN0eWxlICYmIG9iai5zdHlsZS5wb3NpdGlvbiA9PSAiYWJzb2x1dGUiICYmICFyZWxhdGl2ZVRvT2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgLy9pZiAoaW5BYnNvbHV0ZUZpcnN0KQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgLy8gICAgaW5BYnNvbHV0ZUZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICBpbkFic29sdXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvL30KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGU7CiAgICB9CiAgICAKICAgIC8vZHVtcChvYmopOwogICAgLy9pZiAoZ2V0U3R5bGUob2JqLCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiIHx8IGdldFN0eWxlKG9iaiwgInBvc2l0aW9uIikgPT0gImZpeGVkIikKICAgIC8vaWYgKG9iai5zdHlsZS5wb3NpdGlvbiA9PSAiYWJzb2x1dGUiIHx8IG9iai5zdHlsZS5wb3NpdGlvbiA9PSAiZml4ZWQiKQoKICAgIC8qCiAgICBpZiAob2JqLnN0eWxlLnBvc2l0aW9uID09ICJhYnNvbHV0ZSIpCiAgICB7CiAgICAgICAgdmFyIHN0eWxlID0gZ2V0U3R5bGUob2JqKTsKICAgICAgICBwb3NYID0gTWF0aC5mbG9vcihleHRyYWN0RmxvYXQoc3R5bGVbImxlZnQiXSwgMCkpOwogICAgICAgIHBvc1kgPSBNYXRoLmZsb29yKGV4dHJhY3RGbG9hdChzdHlsZVsidG9wIl0sIDApKTsKICAgIH0KICAgIGVsc2UgaWYgKGdldFN0eWxlKG9iaiwgInBvc2l0aW9uIikgPT0gImZpeGVkIikKICAgIHsKICAgICAgICB2YXIgc3R5bGUgPSBnZXRTdHlsZShvYmopOwogICAgICAgIHBvc1ggPSBNYXRoLmZsb29yKGV4dHJhY3RGbG9hdChzdHlsZVsibGVmdCJdLCAwKSk7CiAgICAgICAgcG9zWSA9IE1hdGguZmxvb3IoZXh0cmFjdEZsb2F0KHN0eWxlWyJ0b3AiXSwgMCkpOwogICAgfQogICAgKi8KICAgIHZhciBvYmogPSBvYmplY3Q7CiAgICAvLyB2eXBudXRvIHNrcnogb2JqZWt0eSwgY28ganNvdSBwb3NpdGlvbiBhYnNvbHV0ZSwgYWxlIHByaXRvbSBqc291IHYgbmVqYWtlbSByZWxhdGl2ZSBlbGVtZW50dSAtIGplbiBhYnkgcHJla3J5bHkgb2JsYXN0IHRhbSB0byBwb3RvbSBibGJuZQogICAgLyppZiAoZmFsc2UgJiYgKGdldFN0eWxlKG9iaiwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIiB8fCBnZXRTdHlsZShvYmosICJwb3NpdGlvbiIpID09ICJmaXhlZCIpKQogICAgewogICAgICAgIHZhciBzdHlsZSA9IGdldFN0eWxlKG9iaik7CiAgICAgICAgcG9zWCA9IE1hdGguZmxvb3IoZXh0cmFjdEZsb2F0KHN0eWxlWyJsZWZ0Il0sIDApKTsKICAgICAgICBwb3NZID0gTWF0aC5mbG9vcihleHRyYWN0RmxvYXQoc3R5bGVbInRvcCJdLCAwKSk7CiAgICAgICAgLy9pZiAoIXBvc1ggJiYgIXBvc1kpCiAgICAgICAgLy97CiAgICAgICAgICAgIHBvc1ggKz0gTWF0aC5mbG9vcihleHRyYWN0RmxvYXQoc3R5bGVbIm1hcmdpbkxlZnQiXSwgMCkpOwogICAgICAgICAgICBwb3NZICs9IE1hdGguZmxvb3IoZXh0cmFjdEZsb2F0KHN0eWxlWyJtYXJnaW5Ub3AiXSwgMCkpOwoKICAgICAgICAgICAgaWYgKHdpbmRvd1Bvc2l0aW9uICYmIG9iai5vZmZzZXRQYXJlbnQgJiYgKGdldFN0eWxlKG9iaiwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIiB8fCBnZXRTdHlsZShvYmosICJwb3NpdGlvbiIpID09ICJmaXhlZCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcG9zMiA9IGdldFBvc2l0aW9uKG9iai5vZmZzZXRQYXJlbnQsIHJlbGF0aXZlVG9PYmplY3QsIHJlbGF0aXZlVG9DbGFzc05hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwb3NYICs9IHBvczJbIngiXTsKICAgICAgICAgICAgICAgIHBvc1kgKz0gcG9zMlsieSJdOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgb2JqID0gb2JqZWN0LnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB3aGlsZShvYmopCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcG9zWCAtPSBleHRyYWN0RmxvYXQob2JqLnNjcm9sbExlZnQsIDApOwogICAgICAgICAgICAgICAgICAgIHBvc1kgLT0gZXh0cmFjdEZsb2F0KG9iai5zY3JvbGxUb3AsIDApOwoKICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgLy99CiAgICB9Ki8KICAgIGlmICgoZ2V0U3R5bGUob2JqLCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiIHx8IGdldFN0eWxlKG9iaiwgInBvc2l0aW9uIikgPT0gImZpeGVkIikgJiYgb2JqLnBhcmVudE5vZGUgPT0gZG9jdW1lbnQuYm9keSkgLy8genJ1c2VubyBrdnVsaSBDb21ib0JveCBvcHRpb25zLCBrdGVyZSBqc291IHYgZGlhbG9ndSBhIHRlbiBqZSB0YWt5IGZpeGVkCiAgICB7CiAgICAgICAgdmFyIHN0eWxlID0gZ2V0U3R5bGUob2JqKTsKICAgICAgICBwb3NYID0gTWF0aC5mbG9vcihleHRyYWN0RmxvYXQoc3R5bGVbImxlZnQiXSwgMCkpOwogICAgICAgIHBvc1kgPSBNYXRoLmZsb29yKGV4dHJhY3RGbG9hdChzdHlsZVsidG9wIl0sIDApKTsKICAgICAgICAKICAgICAgICBwb3NYICs9IE1hdGguZmxvb3IoZXh0cmFjdEZsb2F0KHN0eWxlWyJtYXJnaW5MZWZ0Il0sIDApKTsKICAgICAgICBwb3NZICs9IE1hdGguZmxvb3IoZXh0cmFjdEZsb2F0KHN0eWxlWyJtYXJnaW5Ub3AiXSwgMCkpOwogICAgICAgIAogICAgICAgIGlmICh3aW5kb3dQb3NpdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHBvc1ggLT0gZXh0cmFjdEZsb2F0KG9iai5wYXJlbnROb2RlLnNjcm9sbExlZnQsIDApOwogICAgICAgICAgICBwb3NZIC09IGV4dHJhY3RGbG9hdChvYmoucGFyZW50Tm9kZS5zY3JvbGxUb3AsIDApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAob2JqLm9mZnNldFBhcmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlKG9iaikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKG9iaik7CiAgICAgICAgICAgICAgICAvL2R1bXAob2JqLm9mZnNldFRvcCk7CiAgICAgICAgICAgICAgICBwb3NYICs9IGV4dHJhY3RGbG9hdChNYXRoLm1heCgwLCBvYmoub2Zmc2V0TGVmdCksIDApOwogICAgICAgICAgICAgICAgcG9zWSArPSBleHRyYWN0RmxvYXQoTWF0aC5tYXgoMCwgb2JqLm9mZnNldFRvcCksIDApOwoKICAgICAgICAgICAgICAgIC8vcG9zWCAtPSBvYmoucGFyZW50Tm9kZS5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgLy9wb3NZIC09IG9iai5wYXJlbnROb2RlLnNjcm9sbFRvcDsKCiAgICAgICAgICAgICAgICBvYmogPSBvYmoub2Zmc2V0UGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgLy8gb2xkZXIgYnJvd3NlcnMKICAgICAgICB7CiAgICAgICAgICAgIHBvc1ggPSBleHRyYWN0RmxvYXQob2JqZWN0LngsIDApOwogICAgICAgICAgICBwb3NZID0gZXh0cmFjdEZsb2F0KG9iamVjdC55LCAwKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHdpbmRvd1Bvc2l0aW9uID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9iaiA9IG9iamVjdC5wYXJlbnROb2RlOwogICAgICAgICAgICB3aGlsZShvYmopCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBvc1ggLT0gZXh0cmFjdEZsb2F0KG9iai5zY3JvbGxMZWZ0LCAwKTsKICAgICAgICAgICAgICAgIHBvc1kgLT0gZXh0cmFjdEZsb2F0KG9iai5zY3JvbGxUb3AsIDApOwoKICAgICAgICAgICAgICAgIG9iaiA9IG9iai5wYXJlbnROb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL2R1bXAocG9zWCsiICIrcG9zWSk7CiAgICAgICAgLy8gd2hlbiBub3Qgc2V0IHBvc2l0aW9uIHJlbGF0aXZlIHRvIG9iamVjdCB0aGF0IGhhcyBtYXJnaW5MZWZ0IG9yIG1hcmdpblRvcCBtaW51cyB2YWx1ZXMsIHRoZSBPcGVyYSBkb2VzIG5vdCBjYWxjdWxhdGUgcG9zaXRpb25zCiAgICAgICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiT3BlcmEiICYmIHBvc1ggPT0gMCAmJiBwb3NZID09IDApCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAob2JqZWN0KTsKICAgICAgICAgICAgLy9kdW1wKCJvcGVyYSIpOwogICAgICAgICAgICB2YXIgX3Bvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZShvYmplY3QsJycpLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgX21hcmdpbkxlZnQgPSBnZXRDb21wdXRlZFN0eWxlKG9iamVjdCwnJykubWFyZ2luTGVmdDsKICAgICAgICAgICAgdmFyIF9tYXJnaW5Ub3AgPSBnZXRDb21wdXRlZFN0eWxlKG9iamVjdCwnJykubWFyZ2luVG9wOwoKICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gb2JqZWN0LnN0eWxlLm1hcmdpbkxlZnQ7CiAgICAgICAgICAgIHZhciBtYXJnaW5MZWZ0ID0gb2JqZWN0LnN0eWxlLm1hcmdpbkxlZnQ7CiAgICAgICAgICAgIHZhciBtYXJnaW5Ub3AgPSBvYmplY3Quc3R5bGUubWFyZ2luVG9wOwoKICAgICAgICAgICAgLy9kdW1wKCItLS0iKTsKICAgICAgICAgICAgLy9kdW1wKG9iamVjdCk7CiAgICAgICAgICAgIGlmIChfcG9zaXRpb24gPT0gInN0YXRpYyIgJiYgKF9tYXJnaW5MZWZ0IHx8IF9tYXJnaW5Ub3ApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoMSk7CiAgICAgICAgICAgICAgICAvL29iamVjdC5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgICAgICAgICAgICAgICAvLyBhd2Vzb21lIGJ1ZyBmaXgsIC4uLiByZW1vdmUgbWFyZ2lucyBhbmQgY2FsY3VsYXRlIHBvc2l0aW9uIC0gT3BlcmEgd2lsbCByZXR1cm4gcmlnaHQgcG9zaXRpb24gKHRoZSBvZmZzZXRMZWZ0IGFuZCBvZmZzZXRUb3AgcHJvcGVydGllcyBhcmUgd2VsbCBjYWxjdWxhdGVkIHVzaW5nIG9sZCBtYXJnaW4gdmFsdWUpCiAgICAgICAgICAgICAgICBvYmplY3Quc3R5bGUubWFyZ2luTGVmdCA9ICIiOyAvLyBjYW5ub3QgYmUgemVybwogICAgICAgICAgICAgICAgb2JqZWN0LnN0eWxlLm1hcmdpblRvcCA9ICIiOwogICAgICAgICAgICAgICAgLy9kdW1wKG9iamVjdCk7CiAgICAgICAgICAgICAgICAvL2R1bXAoZ2V0UG9zaXRpb25TbG93KG9iamVjdCwgZG9jdW1lbnQpKTsKICAgICAgICAgICAgICAgIC8vcmV0dXJuKCk7CiAgICAgICAgICAgICAgICAvLyBjb3VudCBwb3NpdGlvbiB3aGVyZSBpdCBpcyB3aXRob3V0IG1hcmdpbnMKICAgICAgICAgICAgICAgIHZhciBwb3MgPSBnZXRQb3NpdGlvbihvYmplY3QsIHJlbGF0aXZlVG9PYmplY3QsIHJlbGF0aXZlVG9DbGFzc05hbWUsIHdpbmRvd1Bvc2l0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChwb3NbIngiXSA9PSAwICYmIHBvc1sieSJdID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZHVtcCgiISEhISEhISEhISEgLSBaRVJPIGluIE9QRVJBIik7CiAgICAgICAgICAgICAgICAgICAgZHVtcChvYmplY3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBjb3VudCBwb3NpdGlvbiB3aGVyZSBpdCBzaG91bGQgYmUgd2l0aCBtYXJnaW5zCiAgICAgICAgICAgICAgICAvL3Bvc1swXSA9IHBvc1sieCJdID0gcG9zWzBdLWV4dHJhY3RJbnQoX21hcmdpbkxlZnQpOwogICAgICAgICAgICAgICAgLy9wb3NbMV0gPSBwb3NbInkiXSA9IHBvc1sxXS1leHRyYWN0SW50KF9tYXJnaW5Ub3ApOwoKICAgICAgICAgICAgICAgIC8vb2JqZWN0LnN0eWxlLnBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgICAgICAgICAgICBvYmplY3Quc3R5bGUubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7CiAgICAgICAgICAgICAgICBvYmplY3Quc3R5bGUubWFyZ2luVG9wID0gbWFyZ2luVG9wOwoKICAgICAgICAgICAgICAgIHJldHVybihwb3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZHVtcChnZXRDb21wdXRlZFN0eWxlKG9iamVjdCwnJykpOwogICAgICAgICAgICAvL2R1bXAob2JqZWN0LnN0eWxlLnBvc2l0aW9uKTsKICAgICAgICAgICAgLy9kdW1wKG9iamVjdC5sZWZ0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHJlbGF0aXZlVG9DbGFzc05hbWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgb2JqID0gb2JqZWN0OwogICAgICAgICAgICB3aGlsZShvYmopCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChoYXNDbGFzc05hbWUob2JqLCByZWxhdGl2ZVRvQ2xhc3NOYW1lKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvT2JqZWN0ID0gb2JqOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHJlbGF0aXZlVG9PYmplY3QpCiAgICAgICAgewogICAgICAgICAgICBwb3MgPSBnZXRQb3NpdGlvbihyZWxhdGl2ZVRvT2JqZWN0KTsKICAgICAgICAgICAgLy9kdW1wKHBvc1kpOwogICAgICAgICAgICAvL2R1bXAocG9zWyJ5Il0pOwogICAgICAgICAgICBwb3NYIC09IGV4dHJhY3RGbG9hdChwb3NbJ3gnXSwgMCk7CiAgICAgICAgICAgIHBvc1kgLT0gZXh0cmFjdEZsb2F0KHBvc1sneSddLCAwKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vaWYgKHBvc1ggPT0gMCAmJiBwb3NZID09IDApCiAgICAvLyAgICBkdW1wKG9iamVjdCk7CiAgICAKICAgIC8vZHVtcChwb3NYKyIgIitwb3NZKTsKICAgIAogICAgcmV0dXJuIHsgMDpwb3NYLCAxOnBvc1ksICd4Jzpwb3NYLCAneSc6cG9zWSB9Owp9CgpmdW5jdGlvbiBnZXRXaW5kb3dQb3NpdGlvbihlbGVtKQp7CiAgICB2YXIgcG9zID0gZ2V0UG9zaXRpb24oZWxlbSwgbnVsbCwgbnVsbCwgdHJ1ZSk7CiAgICAKICAgIHZhciBpbkZpeGVkID0gZmFsc2U7CiAgICB2YXIgb2JqID0gZWxlbTsKICAgIHdoaWxlIChvYmogPSBvYmoucGFyZW50Tm9kZSkKICAgIHsKICAgICAgICBpZiAoZ2V0U3R5bGUob2JqLCAicG9zaXRpb24iKSA9PSAiZml4ZWQiKQogICAgICAgICAgICBpbkZpeGVkID0gdHJ1ZTsKICAgIH0KICAgIAogICAgaWYgKGluRml4ZWQpIC8vIGt2dWxpIENvbWJvQm94IG9wdGlvbnMsIGt0ZXJlIGpzb3UgdiBkaWFsb2d1IGEgdGVuIGplIHRha3kgZml4ZWQKICAgIHsKICAgICAgICBwb3NbIngiXSArPSBnZXRTY3JvbGxMZWZ0KGRvY3VtZW50KTsKICAgICAgICBwb3NbInkiXSArPSBnZXRTY3JvbGxUb3AoZG9jdW1lbnQpOwogICAgfSAgICAKICAgIAogICAgcmV0dXJuKHBvcyk7Cn0KCmZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtKQp7CiAgICBpZiAodHlwZW9mKGVsZW0pID09ICJ1bmRlZmluZWQiKQogICAgICAgIGVsZW0gPSBkb2N1bWVudC5ib2R5OwogICAgICAgIAogICAgcmV0dXJuKGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBlbGVtLm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93KTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gaW50ZXJuZXQKCmZ1bmN0aW9uIHJlZGlyZWN0KHVybCwgcG9zdFBhcmFtcywgdGFyZ2V0KQp7CiAgICBpZiAodHlwZW9mKHBvc3RQYXJhbXMpID09ICJzdHJpbmciKQogICAgewogICAgICAgIHRhcmdldCA9IHBvc3RQYXJhbXM7CiAgICAgICAgcG9zdFBhcmFtcyA9IHt9OwogICAgfQogICAgaWYgKHR5cGVvZih0YXJnZXQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRhcmdldCA9ICIiOwogICAgCiAgICAvL2FsZXJ0KHVybCk7CiAgICAvL2FsZXJ0KHBvc3RQYXJhbXMpOwogICAgLy9hbGVydCh0eXBlb2YocG9zdFBhcmFtcykpOwogICAgaWYgKHBvc3RQYXJhbXMgJiYgdHlwZW9mKHBvc3RQYXJhbXMpICE9ICJvYmplY3QiICYmIHBvc3RQYXJhbXMgIT0gIiIpCiAgICB7CiAgICAgICAgLy8gZXhwbG9kZQogICAgICAgIHZhciBwYXJhbXMgPSBwb3N0UGFyYW1zLnNwbGl0KCImIik7CiAgICAgICAgdmFyIHBvc3RQYXJhbXMgPSBuZXcgT2JqZWN0OwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHBhcmFtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07CiAgICAgICAgICAgIHBhcmFtID0gcGFyYW0uc3BsaXQoIj0iKTsKICAgICAgICAgICAgcG9zdFBhcmFtc1twYXJhbVswXV0gPSBwYXJhbVsxXTsKICAgICAgICB9CiAgICAgICAgLy9hbGVydChwb3N0UGFyYW1zKTsKICAgIH0KICAgIAogICAgaWYgKHBvc3RQYXJhbXMpCiAgICB7CiAgICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIik7CiAgICAgICAgZm9ybS5hY3Rpb24gPSB1cmw7CiAgICAgICAgZm9ybS5tZXRob2QgPSAicG9zdCI7CiAgICAgICAgZm9ybS50YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgZm9ybS5lbmNvZGluZyA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKICAgIAogICAgICAgIGZvciAodmFyIG5hbWUgaW4gcG9zdFBhcmFtcykKICAgICAgICB7CiAgICAgICAgICAgIC8vYWxlcnQobmFtZSk7CiAgICAgICAgICAgIC8vYWxlcnQocG9zdFBhcmFtc1tuYW1lXSk7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ICAgCiAgICAgICAgICAgIGlucHV0LnR5cGUgPSAiaGlkZGVuIjsKICAgICAgICAgICAgaW5wdXQubmFtZSA9IG5hbWU7CiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gcG9zdFBhcmFtc1tuYW1lXTsKICAgICAgICAKICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIGZvcm0pOyAgICAKICAgICAgICBmb3JtLnN1Ym1pdCgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICh0YXJnZXQpCiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgdGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmPXVybDsKICAgIH0KfQoKZnVuY3Rpb24gaGFzVmVydGljYWxTY3JvbGxCYXIoZWxlbSkgCnsKICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiB8fCBCcm93c2VyLm5hbWUgPT0gIkVkZ2UiKQogICAgICAgIHJldHVybihlbGVtLnNjcm9sbEhlaWdodC0xID4gZWxlbS5jbGllbnRIZWlnaHQpOyAgICAKICAgIGVsc2UKICAgICAgICByZXR1cm4oZWxlbS5zY3JvbGxIZWlnaHQgPiBlbGVtLmNsaWVudEhlaWdodCk7ICAgIAp9CgpmdW5jdGlvbiBoYXNIb3Jpem9udGFsU2Nyb2xsQmFyKGVsZW0pIAp7CiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgfHwgQnJvd3Nlci5uYW1lID09ICJFZGdlIikKICAgICAgICByZXR1cm4oZWxlbS5zY3JvbGxXaWR0aC0xID4gZWxlbS5jbGllbnRXaWR0aCk7ICAgIAogICAgZWxzZQogICAgICAgIHJldHVybihlbGVtLnNjcm9sbFdpZHRoID4gZWxlbS5jbGllbnRXaWR0aCk7ICAgIAp9CgpmdW5jdGlvbiBnZXRTY3JvbGxCYXJXaWR0aChlbGVtKSAKewogICAgaWYgKCFlbGVtKQogICAgICAgIHJldHVybihnZXRTY3JvbGxiYXJTaXplKCkpOwogICAgZWxzZQogICAgICAgIHJldHVybihoYXNWZXJ0aWNhbFNjcm9sbEJhcihlbGVtKSA/IGdldFNjcm9sbGJhclNpemUoKSA6IDApOyAgICAKfQoKZnVuY3Rpb24gZ2V0U2Nyb2xsQmFySGVpZ2h0KGVsZW0pIAp7CiAgICBpZiAoIWVsZW0pCiAgICAgICAgcmV0dXJuKGdldFNjcm9sbGJhclNpemUoKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGhhc0hvcml6b250YWxTY3JvbGxCYXIoZWxlbSkgPyBnZXRTY3JvbGxiYXJTaXplKCkgOiAwKTsgICAgCn0KCmZ1bmN0aW9uIGdldFNjcm9sbGJhclNpemUoKSAKewogICAgaWYgKCF3aW5kb3cuX19zY3JvbGxiYXJTaXplKQogICAgewogICAgICAgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIG91dGVyLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICBvdXRlci5zdHlsZS53aWR0aCA9ICIxMDBweCI7CiAgICAgICAgb3V0ZXIuc3R5bGUubXNPdmVyZmxvd1N0eWxlID0gInNjcm9sbGJhciI7IC8vIG5lZWRlZCBmb3IgV2luSlMgYXBwcwoKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTsKCiAgICAgICAgdmFyIHdpZHRoTm9TY3JvbGwgPSBvdXRlci5vZmZzZXRXaWR0aDsKICAgICAgICAvLyBmb3JjZSBzY3JvbGxiYXJzCiAgICAgICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIjsKCiAgICAgICAgLy8gYWRkIGlubmVyZGl2CiAgICAgICAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgaW5uZXIuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpOyAgICAgICAgCgogICAgICAgIHZhciB3aWR0aFdpdGhTY3JvbGwgPSBpbm5lci5vZmZzZXRXaWR0aDsKCiAgICAgICAgLy8gcmVtb3ZlIGRpdnMKICAgICAgICBvdXRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG91dGVyKTsKICAgICAgICB3aW5kb3cuX19zY3JvbGxiYXJTaXplID0gd2lkdGhOb1Njcm9sbCAtIHdpZHRoV2l0aFNjcm9sbDsKICAgIH0KICAgIAogICAgcmV0dXJuKHdpbmRvdy5fX3Njcm9sbGJhclNpemUpOwp9CgpmdW5jdGlvbiBnZXRTY3JvbGxYKGVsZW0pCnsKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgZWxlbSA9IHdpbmRvdzsKCiAgICBpZiAoZWxlbSA9PSB3aW5kb3cpCiAgICB7CiAgICAgICAgdmFyIHggPSAod2luZG93LnBhZ2VYT2Zmc2V0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgID8gd2luZG93LnBhZ2VYT2Zmc2V0CiAgICAgICAgICAgIDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgeCA9IGVsZW0uc2Nyb2xsTGVmdDsKICAgIH0KICAgIAogICAgcmV0dXJuKHgpOwp9CgpmdW5jdGlvbiBnZXRTY3JvbGxZKGVsZW0pCnsKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgZWxlbSA9IHdpbmRvdzsKCiAgICBpZiAoZWxlbSA9PSB3aW5kb3cpCiAgICB7CiAgICAgICAgdmFyIHkgPSAod2luZG93LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgID8gd2luZG93LnBhZ2VZT2Zmc2V0CiAgICAgICAgICAgIDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wOyAgICAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgeSA9IGVsZW0uc2Nyb2xsVG9wOwogICAgfQoKICAgIHJldHVybih5KTsKfQoKZnVuY3Rpb24gemVyb0ZpbGwoc3RyLCBsZW5ndGgpIAp7CiAgICByZXR1cm4oY2hhckZpbGwoc3RyLCAiMCIsICgtMSkqbGVuZ3RoKSk7Cn0KCmZ1bmN0aW9uIGNoYXJGaWxsKHN0ciwgY2hyLCBsZW5ndGgpIAp7CiAgICBzdHIgPSBuZXcgU3RyaW5nKHN0cik7CiAgICBjaGFyMiA9ICJcMSI7CiAgICAKICAgIHdoaWxlKHN0ci5sZW5ndGggPCBNYXRoLmFicyhsZW5ndGgpKQogICAgewogICAgICAgIGlmIChsZW5ndGggPCAwKQogICAgICAgICAgICBzdHIgPSBjaGFyMitzdHI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzdHIgPSBzdHIrY2hhcjI7CiAgICB9CiAgICAKICAgIHN0ciA9IHN0cl9yZXBsYWNlKGNoYXIyLCBjaHIsIHN0cik7CiAgICAKICAgIHJldHVybihzdHIpOwp9CgoKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gYWRkaXRpb25hbAoKLy8gZHVtbXkgQnJvd3NlciBvYmplY3QgZm9yIElFIGluaXQKdmFyIEJyb3dzZXIgPSB7CiAgICBuYW1lOiAoL21zaWUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSA/ICJFeHBsb3JlciIgOiAiIiksCiAgICB2ZXJzaW9uOiAoL21zaWUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSA/IHBhcnNlRmxvYXQoKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvLiooPzpydnxpZSlbXC86IF0oLis/KShbIFwpO118JCkvKSB8fCBbXSlbMV0pIDogMTAwKQp9OwoKdmFyIEVMRU1FTlRfTk9ERSA9IDE7CnZhciBBVFRSSUJVVEVfTk9ERSA9IDI7CnZhciBURVhUX05PREUgPSAzOwp2YXIgQ0RBVEFfU0VDVElPTl9OT0RFID0gNDsKdmFyIEVOVElUWV9SRUZFUkVOQ0VfTk9ERSA9IDU7CnZhciBFTlRJVFlfTk9ERSA9IDY7CnZhciBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgPSA3Owp2YXIgQ09NTUVOVF9OT0RFID0gODsKdmFyIERPQ1VNRU5UX05PREUgPSA5Owp2YXIgRE9DVU1FTlRfVFlQRV9OT0RFID0gMTA7CnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7CnZhciBOT1RBVElPTl9OT0RFID0gMTI7Cgp2YXIgVktfTEJVVFRPTiA9IDE7IC8vTGVmdCBtb3VzZSBidXR0b24KdmFyIFZLX1JCVVRUT04gPSAyOyAvL1JpZ2h0IG1vdXNlIGJ1dHRvbgp2YXIgVktfQ0FOQ0VMID0gMzsgLy9Db250cm9sLWJyZWFrIHByb2Nlc3NpbmcKdmFyIFZLX01CVVRUT04gPSA0OyAvL01pZGRsZSBtb3VzZSBidXR0b24gb24gYSB0aHJlZS1idXR0b24gbW91c2UKdmFyIFZLX0JBQ0sgPSA4OyAvL0JBQ0tTUEFDRSBrZXkKdmFyIFZLX1RBQiA9IDk7IC8vVEFCIGtleQp2YXIgVktfQ0xFQVIgPSAxMjsgLy9DTEVBUiBrZXkKdmFyIFZLX1JFVFVSTiA9IDEzOyAvL0VOVEVSIGtleQp2YXIgVktfRU5URVIgPSAxMzsgLy9FTlRFUiBrZXkKdmFyIFZLX1NISUZUID0gMTY7IC8vU0hJRlQga2V5CnZhciBWS19DT05UUk9MID0gMTc7IC8vQ1RSTCBrZXkKdmFyIFZLX0NUUkwgPSAxNzsgLy9DVFJMIGtleQp2YXIgVktfTUVOVSA9IDE4OyAvL0FMVCBrZXkKdmFyIFZLX0FMVCA9IDE4OyAvL0FMVCBrZXkKdmFyIFZLX1BBVVNFID0gMTk7IC8vUEFVU0Uga2V5CnZhciBWS19DQVBJVEFMID0gMjA7IC8vQ0FQUyBMT0NLIGtleQp2YXIgVktfRVNDQVBFID0gVktfRVNDID0gMjc7IC8vRVNDIGtleQp2YXIgVktfU1BBQ0UgPSAzMjsgLy9TUEFDRUJBUgp2YXIgVktfUFJJT1IgPSAzMzsgLy9QQUdFIFVQIGtleQp2YXIgVktfTkVYVCA9IDM0OyAvL1BBR0UgRE9XTiBrZXkKdmFyIFZLX1BHVVAgPSAzMzsgLy9QQUdFIFVQIGtleQp2YXIgVktfUEdET1dOID0gMzQ7IC8vUEFHRSBET1dOIGtleQp2YXIgVktfRU5EID0gMzU7IC8vRU5EIGtleQp2YXIgVktfSE9NRSA9IDM2OyAvL0hPTUUga2V5CnZhciBWS19MRUZUID0gMzc7IC8vTEVGVCBBUlJPVyBrZXkKdmFyIFZLX1VQID0gMzg7IC8vVVAgQVJST1cga2V5CnZhciBWS19SSUdIVCA9IDM5OyAvL1JJR0hUIEFSUk9XIGtleQp2YXIgVktfRE9XTiA9IDQwOyAvL0RPV04gQVJST1cga2V5CnZhciBWS19TRUxFQ1QgPSA0MTsgLy9TRUxFQ1Qga2V5CnZhciBWS19FWEVDVVRFID0gNDM7IC8vRVhFQ1VURSBrZXkKdmFyIFZLX1NOQVBTSE9UID0gNDQ7IC8vUFJJTlQgU0NSRUVOIGtleQp2YXIgVktfSU5TRVJUID0gNDU7IC8vSU5TIGtleQp2YXIgVktfREVMRVRFID0gNDY7IC8vREVMIGtleQp2YXIgVktfSEVMUCA9IDQ3OyAvL0hFTFAga2V5CnZhciBWS19MV0lOID0gOTE7IC8vTGVmdCBXaW5kb3dzIGtleSBvbiBhIE1pY3Jvc29mdCBOYXR1cmFsIEtleWJvYXJkCnZhciBWS19SV0lOID0gOTI7IC8vUmlnaHQgV2luZG93cyBrZXkgb24gYSBNaWNyb3NvZnQgTmF0dXJhbCBLZXlib2FyZAp2YXIgVktfQVBQUyA9IDkzOyAvL0FwcGxpY2F0aW9ucyBrZXkgb24gYSBNaWNyb3NvZnQgTmF0dXJhbCBLZXlib2FyZAp2YXIgVktfTlVNUEFEMCA9IDk2OyAvL051bWVyaWMga2V5cGFkIDAga2V5CnZhciBWS19OVU1QQUQxID0gOTc7IC8vTnVtZXJpYyBrZXlwYWQgMSBrZXkKdmFyIFZLX05VTVBBRDIgPSA5ODsgLy9OdW1lcmljIGtleXBhZCAyIGtleQp2YXIgVktfTlVNUEFEMyA9IDk5OyAvL051bWVyaWMga2V5cGFkIDMga2V5CnZhciBWS19OVU1QQUQ0ID0gMTAwOyAvL051bWVyaWMga2V5cGFkIDQga2V5CnZhciBWS19OVU1QQUQ1ID0gMTAxOyAvL051bWVyaWMga2V5cGFkIDUga2V5CnZhciBWS19OVU1QQUQ2ID0gMTAyOyAvL051bWVyaWMga2V5cGFkIDYga2V5CnZhciBWS19OVU1QQUQ3ID0gMTAzOyAvL051bWVyaWMga2V5cGFkIDcga2V5CnZhciBWS19OVU1QQUQ4ID0gMTA0OyAvL051bWVyaWMga2V5cGFkIDgga2V5CnZhciBWS19OVU1QQUQ5ID0gMTA1OyAvL051bWVyaWMga2V5cGFkIDkga2V5CnZhciBWS19NVUxUSVBMWSA9IDEwNjsgLy9NdWx0aXBseSBrZXkKdmFyIFZLX0FERCA9IDEwNzsgLy9BZGQga2V5CnZhciBWS19TRVBBUkFUT1IgPSAxMDg7IC8vU2VwYXJhdG9yIGtleQp2YXIgVktfU1VCVFJBQ1QgPSAxMDk7IC8vU3VidHJhY3Qga2V5CnZhciBWS19ERUNJTUFMID0gMTEwOyAvL0RlY2ltYWwga2V5CnZhciBWS19ESVZJREUgPSAxMTE7IC8vRGl2aWRlIGtleQp2YXIgVktfRjEgPSAxMTI7IC8vRjEga2V5CnZhciBWS19GMiA9IDExMzsgLy9GMiBrZXkKdmFyIFZLX0YzID0gMTE0OyAvL0YzIGtleQp2YXIgVktfRjQgPSAxMTU7IC8vRjQga2V5CnZhciBWS19GNSA9IDExNjsgLy9GNSBrZXkKdmFyIFZLX0Y2ID0gMTE3OyAvL0Y2IGtleQp2YXIgVktfRjcgPSAxMTg7IC8vRjcga2V5CnZhciBWS19GOCA9IDExOTsgLy9GOCBrZXkKdmFyIFZLX0Y5ID0gMTIwOyAvL0Y5IGtleQp2YXIgVktfRjEwID0gMTIxOyAvL0YxMCBrZXkKdmFyIFZLX0YxMSA9IDEyMjsgLy9GMTEga2V5CnZhciBWS19GMTIgPSAxMjM7IC8vRjEyIGtleQp2YXIgVktfRjEzID0gMTI0OyAvL0YxMyBrZXkKdmFyIFZLX0YxNCA9IDEyNTsgLy9GMTQga2V5CnZhciBWS19GMTUgPSAxMjY7IC8vRjE1IGtleQp2YXIgVktfRjE2ID0gMTI3OyAvL0YxNiBrZXkKdmFyIFZLX0YxNyA9IDEyODsgLy9GMTcga2V5CnZhciBWS19GMTggPSAxMjk7IC8vRjE4IGtleQp2YXIgVktfRjE5ID0gMTMwOyAvL0YxOSBrZXkKdmFyIFZLX0YyMCA9IDEzMTsgLy9GMjAga2V5CnZhciBWS19GMjEgPSAxMzI7IC8vRjIxIGtleQp2YXIgVktfRjIyID0gMTMzOyAvL0YyMiBrZXkKdmFyIFZLX0YyMyA9IDEzNDsgLy9GMjMga2V5CnZhciBWS19GMjQgPSAxMzU7IC8vRjI0IGtleQp2YXIgVktfTlVNTE9DSyA9IDE0NDsgLy9OVU0gTE9DSyBrZXkKdmFyIFZLX1NDUk9MTCA9IDE0NTsgLy9TQ1JPTEwgTE9DSyBrZXkKdmFyIFZLX0xTSElGVCA9IDE2MDsgLy9MZWZ0IFNISUZUCnZhciBWS19SU0hJRlQgPSAxNjE7IC8vUmlnaHQgU0hJRlQKdmFyIFZLX0xDT05UUk9MID0gMTYyOyAvL0xlZnQgQ1RSTAp2YXIgVktfUkNPTlRST0wgPSAxNjM7IC8vUmlnaHQgQ1RSTAp2YXIgVktfTE1FTlUgPSAxNjQ7IC8vTGVmdCBBTFQKdmFyIFZLX1JNRU5VID0gMTY1OyAvL1JpZ2h0IEFMVAp2YXIgVktfUEFDS0VUID0gMjMxOyAvL1VzZWQgdG8gcGFzcyBVbmljb2RlIGNoYXJhY3RlcnMgYXMgaWYgdGhleSB3ZXJlIGtleXN0cm9rZXMuIElmIFZLX1BBQ0tFVCBpcyB1c2VkIHdpdGggU2VuZElucHV0LCB0aGVuIHRoZSBVbmljb2RlIGNoYXJhY3RlciB0byBiZSBkZWxpdmVyZWQgc2hvdWxkIGJlIHBsYWNlZCBpbnRvIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBzY2FuIGNvZGUuIElmIGEga2V5Ym9hcmQgbWVzc2FnZSBpcyByZW1vdmVkIGZyb20gdGhlIG1lc3NhZ2UgcXVldWUgYW5kIHRoZSB2aXJ0dWFsIGtleSBpcyBWS19QQUNLRVQsIHRoZW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHdpbGwgYmUgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGxwYXJhbS4KdmFyIFZLX0FUVE4gPSAyNDY7IC8vQVRUTiBrZXkKdmFyIFZLX0NSU0VMID0gMjQ3OyAvL0NSU0VMIGtleQp2YXIgVktfRVhTRUwgPSAyNDg7IC8vRVhTRUwga2V5CnZhciBWS19FUkVPRiA9IDI0OTsgLy9FcmFzZSBFT0Yga2V5CnZhciBWS19QTEFZID0gMjUwOyAvL1BMQVkga2V5CnZhciBWS19aT09NID0gMjUxOyAvL1pPT00ga2V5CnZhciBWS19OT05BTUUgPSAyNTI7IC8vUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKdmFyIFZLX1BBMSA9IDI1MzsgLy9QQTEga2V5CnZhciBWS19PRU1fQ0xFQVIgPSAyNTQ7IC8vQ0xFQVIga2V5CnZhciBWS19LRVlMT0NLID0gMzg3NDsgLy9LZXkgdXNlZCB0byBsb2NrIGRldmljZQp2YXIgVktfT0VNX1NDUk9MTCA9IDE0NTsgLy9Ob25lCnZhciBWS19PRU1fMSA9IDE4NjsgLy8iOzoiIGZvciBVUwp2YXIgVktfT0VNX1BMVVMgPSAxODc7IC8vIisiIGFueSBjb3VudHJ5L3JlZ2lvbgp2YXIgVktfT0VNX0NPTU1BID0gMTg4OyAvLyIsIiBhbnkgY291bnRyeS9yZWdpb24KdmFyIFZLX09FTV9NSU5VUyA9IDE4OTsgLy8iLSIgYW55IGNvdW50cnkvcmVnaW9uCnZhciBWS19PRU1fUEVSSU9EID0gMTkwOyAvLyIuIiBhbnkgY291bnRyeS9yZWdpb24KdmFyIFZLX09FTV8yID0gMTkxOyAvLyIvPyIgZm9yIFVTCnZhciBWS19PRU1fMyA9IDE5MjsgLy8iYH4iIGZvciBVUwp2YXIgVktfT0VNXzQgPSAyMTk7IC8vIlt7IiBmb3IgVVMKdmFyIFZLX09FTV81ID0gMjIwOyAvLyJcfCIgZm9yIFVTCnZhciBWS19PRU1fNiA9IDIyMTsgLy8iXX0iIGZvciBVUwp2YXIgVktfT0VNXzcgPSAyMjI7IC8vIiciIiBmb3IgVVMKdmFyIFZLX09FTV84ID0gMjIzOyAvL05vbmUKdmFyIFZLX09FTV9BWCA9IDIyNTsgLy9BWCBrZXkgb24gSmFwYW5lc2UgQVgga2V5Ym9hcmQKdmFyIFZLX09FTV8xMDIgPSAyMjY7IC8vIjw+IiBvciAiXHwiIG9uIFJUIDEwMi1rZXkga2V5Ym9hcmQKCgoKdmFyIFZLXzAgPSA0ODsKdmFyIFZLXzEgPSA0OTsKdmFyIFZLXzIgPSA1MDsKdmFyIFZLXzMgPSA1MTsKdmFyIFZLXzQgPSA1MjsKdmFyIFZLXzUgPSA1MzsKdmFyIFZLXzYgPSA1NDsKdmFyIFZLXzcgPSA1NTsKdmFyIFZLXzggPSA1NjsKdmFyIFZLXzkgPSA1NzsKCnZhciBWS19BID0gNjU7CnZhciBWS19CID0gNjY7CnZhciBWS19DID0gNjc7CnZhciBWS19EID0gNjg7CnZhciBWS19FID0gNjk7CnZhciBWS19GID0gNzA7CnZhciBWS19HID0gNzE7CnZhciBWS19IID0gNzI7CnZhciBWS19JID0gNzM7CnZhciBWS19KID0gNzQ7CnZhciBWS19LID0gNzU7CnZhciBWS19MID0gNzY7CnZhciBWS19NID0gNzc7CnZhciBWS19OID0gNzg7CnZhciBWS19PID0gNzk7CnZhciBWS19QID0gODA7CnZhciBWS19RID0gODE7CnZhciBWS19SID0gODI7CnZhciBWS19TID0gODM7CnZhciBWS19UID0gODQ7CnZhciBWS19VID0gODU7CnZhciBWS19WID0gODY7CnZhciBWS19XID0gODc7CnZhciBWS19YID0gODg7CnZhciBWS19ZID0gODk7CnZhciBWS19aID0gOTA7Cgp2YXIgWkVST19XSURUSF9TUEFDRSA9IFpXU1AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MjAwYik7Ci8vdmFyIFpFUk9fV0lEVEhfTkVXX0xJTkUgPSBaV05MID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweDIwMjgpOyAvLyBjYW5ub3QgdXNlIC0gYWN0cyBhcyByZWFsIG5ldyBsaW5lCnZhciBaRVJPX1dJRFRIX05FV19MSU5FID0gWldOTCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgyMDBjKTsKLy92YXIgTk9ORV9CUkVBS0lOR19TUEFDRSA9IE5CU1AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4QzJBMCk7CnZhciBOT05FX0JSRUFLSU5HX1NQQUNFID0gTkJTUCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMEEwKTsKdmFyIE5PTkVfQlJFQUtJTkdfU1BBQ0VfQVNDSUkgPSBOQlNQQSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRik7CgovLyB6YXRpbSBuaWtkZSBuZXBvdXppdmFtIC4uLiBteXNsZW5vIGsgdnl1eml0aSB2IEh0bWxBcmVhCnZhciBCTE9DS19FTEVNRU5UX1RBR19OQU1FUyA9IFsiYWRkcmVzcyIsImFydGljbGUiLCJhc2lkZSIsImJsb2NrcXVvdGUiLCJjYW52YXMiLCJkZCIsImRpdiIsImRsIiwiZmllbGRzZXQiLCJmaWdjYXB0aW9uIiwiZmlndXJlIiwiZm9vdGVyIiwiZm9ybSIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWRlciIsImhncm91cCIsImhyIiwibGkiLCJtYWluIiwibmF2Iiwibm9zY3JpcHQiLCJvbCIsIm91dHB1dCIsInAiLCJwcmUiLCJzZWN0aW9uIiwidGFibGUiLCJ0Zm9vdCIsInVsIiwidmlkZW8iXTsKdmFyIElOTElORV9FTEVNRU5UX1RBR19OQU1FUyA9IFsiYSIsImIiLCJiaWciLCJpIiwic21hbGwiLCJ0dCIsImFiYnIiLCJhY3JvbnltIiwiY2l0ZSIsImNvZGUiLCJkZm4iLCJlbSIsImtiZCIsInN0cm9uZyIsInNhbXAiLCJ0aW1lIiwidmFyIiwiYmRvIiwiaW1nIiwibWFwIiwib2JqZWN0IiwicSIsInNjcmlwdCIsInNwYW4iLCJzdWIiLCJzdXAiLCJidXR0b24iLCJpbnB1dCIsImxhYmVsIiwic2VsZWN0IiwidGV4dGFyZWEiXTsKdmFyIEZPUk1fRUxFTUVOVF9UQUdfTkFNRVMgPSBbImlucHV0Iiwic2VsZWN0IiwidGV4dGFyZWEiXTsKCmZ1bmN0aW9uIGdldEVsZW1lbnQoaWQsIGRvY3VtZW50MikKewogICAgaWYgKHR5cGVvZihkb2N1bWVudDIpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGRvY3VtZW50MiA9IGRvY3VtZW50OwogICAgLy8vZHVtcChkb2N1bWVudDIpOwoKICAgIGlmICghaWQpCiAgICAgICAgcmV0dXJuKG51bGwpOwogICAgICAgIAogICAgLy9pZiAoaWQgJiYgaWQubm9kZVR5cGUgJiYgaWQubm9kZVR5cGUgPT0gRUxFTUVOVF9OT0RFKQogICAgLy8gICAgcmV0dXJuKGlkKTsKICAgICAgICAKICAgIC8vaWYgKHR5cGVvZihpZCkgPT0gIm9iamVjdCIgJiYgaWQudGFnTmFtZSkKICAgIGlmIChpZCA9PSAid2luZG93IiB8fCBpZCA9PSB3aW5kb3cpCiAgICAgICAgcmV0dXJuKHdpbmRvdyk7CiAgICBlbHNlIGlmIChpZCA9PSAiZG9jdW1lbnQiIHx8IGlkID09IGRvY3VtZW50KQogICAgICAgIHJldHVybihkb2N1bWVudDIpOwogICAgZWxzZSBpZiAoaWQgJiYgaWQudGFnTmFtZSkgIC8vIEVNQkVEIGlzIGZ1bmN0aW9uIGluIEZGISEhIQogICAgICAgIHJldHVybihpZCk7CiAgICBlbHNlIGlmICh0eXBlb2YoaWQpID09ICJvYmplY3QiICYmIGlkLl9leHRlbmRzICYmIGlkLl9leHRlbmRzKCJDb21wb25lbnQiKSkKICAgICAgICByZXR1cm4oaWQuZWxlbWVudCB8fCBpZC5jb250YWluZXIpOwogICAgZWxzZSBpZiAodHlwZW9mKGlkKSA9PSAic3RyaW5nIikKICAgIHsKICAgICAgICBpZiAoaWRbMF0gPT0gIi4iKQogICAgICAgICAgICByZXR1cm4oZ2V0RWxlbWVudEJ5Q2xhc3NOYW1lKGlkLnN1YnN0cigxLDEwMDApLCBkb2N1bWVudDIpKTsKCiAgICAgICAgaWYgKGlkWzBdID09ICIjIikKICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHIoMSwgMTAwMCk7CiAgICAgICAgICAgIAogICAgICAgIGlmICghZG9jdW1lbnQyKQogICAgICAgIHsKICAgICAgICAgICAgX3Rocm93KCJnZXRFbGVtZW50KCIraWQrIikgLSBkb2N1bWVudDIgbm90IGRlZmluZWQiKTsKICAgICAgICAgICAgcmV0dXJuKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlKGRvY3VtZW50MiAmJiAhZG9jdW1lbnQyLmdldEVsZW1lbnRCeUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkb2N1bWVudDIgPSBkb2N1bWVudDIucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZG9jdW1lbnQyKQogICAgICAgICAgICAgICAgcmV0dXJuKGRvY3VtZW50Mi5nZXRFbGVtZW50QnlJZChpZCkpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLy9fdGhyb3coImdldEVsZW1lbnQoIitpZCsiKSAtIGJhZCBwYXJhbWV0ZXIiKTsKfQoKZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBkb2MpCnsKICAgIGlmICh0eXBlb2YoZG9jKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBkb2MgPSBkb2N1bWVudDsKICAgIAogICAgaWYgKHR5cGVvZih0eXBlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBfdGhyb3coImNyZWF0ZUVsZW1lbnQoKTogbm8gdGFnTmFtZSBzcGVjaWZpZWQiKTsKCiAgICAvL2FsZXJ0KHR5cGUpOwogICAgaWYgKHR5cGUuaW5kZXhPZigiPCIpICE9IC0xICYmIHR5cGUuaW5kZXhPZigiPiIpICE9IC0xKQogICAgewogICAgICAgIHZhciBkdW1teSA9IGNyZWF0ZUVsZW1lbnQoImRpdiIsIGRvYyk7CiAgICAgICAgc2V0SHRtbChkdW1teSwgdHlwZSk7CgogICAgICAgIHJldHVybihkdW1teS5jaGlsZE5vZGVzWzBdKTsKICAgIH0KICAgIGlmICh0eXBlID09ICIjdGV4dCIpCiAgICAgICAgcmV0dXJuKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpOwogICAgZWxzZQogICAgewogICAgICAgIGlmIChmYWxzZSAmJiB0eXBlID09ICJidXR0b24iICYmIEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiICYmIEJyb3dzZXIudmVyc2lvbiA8PSA4KQogICAgICAgIHsKICAgICAgICAgICAgLy8gY3JlYXRlIHVzaW5nIGlubmVySFRNTCA9ICI8YnV0dG9uPjwvYnV0dG9uPiI7CiAgICAgICAgICAgIHZhciBlbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7CiAgICAgICAgICAgIC8vYWxlcnQoZWxlbSk7CiAgICAgICAgICAgIC8vYWxlcnQoZWxlbS50YWdOYW1lKTsKICAgICAgICAgICAgcmV0dXJuKGVsZW0pOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgcmV0dXJuKGRvYy5jcmVhdGVFbGVtZW50KHR5cGUpKTsKICAgIH0KfQoKZnVuY3Rpb24gYWRkQ2xhc3NOYW1lKGVsZW0sIGNsYXNzTmFtZSwgcG9zaXRpb24pCnsKICAgIC8vIG11c3Qgbm90IHJlbW92ZSBjbGFzc05hbWUhIG9yIGFueSBJRSAuaHRjIHdpbGwgc3RvcCBsb2FkaW5nCiAgICBlbGVtID0gZ2V0RWxlbWVudChlbGVtKTsKICAgIAogICAgaWYgKGVsZW0gJiYgY2xhc3NOYW1lICYmICFoYXNDbGFzc05hbWUoZWxlbSwgY2xhc3NOYW1lKSkKICAgIHsKICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IGVsZW0uY2xhc3NOYW1lLnNwbGl0KCIgIik7CiAgICAgICAgaWYgKHR5cGVvZihwb3NpdGlvbikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHBvc2l0aW9uID0gY2xhc3NOYW1lcy5sZW5ndGg7CiAgICAgICAgICAgIC8vcG9zaXRpb24gPSAwOwogICAgICAgIC8vZHVtcChwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gPSBNYXRoLm1pbihNYXRoLm1heCgwLCBwb3NpdGlvbiksIGNsYXNzTmFtZXMubGVuZ3RoKTsKICAgICAgICAvL2R1bXAoY2xhc3NOYW1lcyk7CiAgICAgICAgY2xhc3NOYW1lcy5zcGxpY2UocG9zaXRpb24sMCxjbGFzc05hbWUpOwogICAgICAgIC8vZHVtcChjbGFzc05hbWVzKTsKICAgICAgICBlbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuam9pbigiICIpOwogICAgICAgIAogICAgICAgIC8vZWxlbS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZXMuam9pbigiICIpKTsKICAgICAgICAvL2VsZW0uc2V0QXR0cmlidXRlKCJjbGFzcyIsIGNsYXNzTmFtZXMuam9pbigiICIpKTsKICAgICAgICAvL2R1bXAocG9zaXRpb24pOwogICAgICAgIC8vZHVtcChlbGVtLmNsYXNzTmFtZSk7CiAgICAgICAgLy9lbGVtLmNsYXNzTmFtZSArPSAiICIrY2xhc3NOYW1lOwogICAgfQp9OwoKZnVuY3Rpb24gcmVtb3ZlQ2xhc3NOYW1lKGVsZW0sIGNsYXNzTmFtZSkKewogICAgZWxlbSA9IGdldEVsZW1lbnQoZWxlbSk7CgogICAgaWYgKGVsZW0gJiYgY2xhc3NOYW1lKQogICAgewogICAgICAgIHZhciBjbGFzc05hbWVzID0gZWxlbS5jbGFzc05hbWUuc3BsaXQoIiAiKTsKICAgICAgICB2YXIgX2NsYXNzTmFtZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpPTAgOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoY2xhc3NOYW1lc1tpXSAmJiBjbGFzc05hbWVzW2ldICE9IGNsYXNzTmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NsYXNzTmFtZXMucHVzaChjbGFzc05hbWVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbGVtLmNsYXNzTmFtZSA9IF9jbGFzc05hbWVzLmpvaW4oIiAiKTsKICAgICAgICAKICAgICAgICBpZiAodHJpbShlbGVtLmNsYXNzTmFtZSkgPT0gIiIpCiAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpOwogICAgfQp9OwoKZnVuY3Rpb24gaGFzQ2xhc3NOYW1lKGVsZW0sIGNsYXNzTmFtZSkKewogICAgaWYgKCFjbGFzc05hbWUpCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIAogICAgdmFyIGNsYXNzTmFtZSA9IHN0cl9yZXBsYWNlKCIuIiwgIiIsIGNsYXNzTmFtZSk7CiAgICBlbGVtID0gZ2V0RWxlbWVudChlbGVtKTsKICAgIGlmIChlbGVtKQogICAgewogICAgICAgIHZhciBfY2xhc3NOYW1lID0gIiAiK2VsZW0uY2xhc3NOYW1lKyIgIjsKICAgICAgICBpZiAoX2NsYXNzTmFtZS5pbmRleE9mKCIgIitjbGFzc05hbWUrIiAiKSA+IC0xKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybihmYWxzZSk7Cn07CgpmdW5jdGlvbiB0b2dnbGVDbGFzc05hbWUoZWxlbSwgY2xhc3NOYW1lLCBlbmFibGVkKQp7CiAgICBlbGVtID0gZ2V0RWxlbWVudChlbGVtKTsKCiAgICBpZiAoZWxlbSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGVuYWJsZWQpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShlbGVtLCBjbGFzc05hbWUpKQogICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKGVsZW0sIGNsYXNzTmFtZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShlbGVtLCBjbGFzc05hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgICAgIC8vZHVtcChlbmFibGVkKTsKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUoZWxlbSwgY2xhc3NOYW1lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NOYW1lKGVsZW0sIGNsYXNzTmFtZSk7CiAgICAgICAgfQogICAgfQp9OwoKZnVuY3Rpb24gdG9nZ2xlQXR0cmlidXRlKGVsZW0sIGF0dHJpYnV0ZSwgdmFsdWUsIGVuYWJsZWQpCnsKICAgIGVsZW0gPSBnZXRFbGVtZW50KGVsZW0pOwoKICAgIGlmIChlbGVtKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZW5hYmxlZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkKICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgICAgICAvL2R1bXAoZW5hYmxlZCk7CiAgICAgICAgICAgIGlmIChlbmFibGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhdHRyaWJ1dGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgfQp9OwoKZnVuY3Rpb24gZ2V0RWxlbWVudHMobGlzdCwgcGFyZW50Tm9kZSkKewogICAgaWYgKHR5cGVvZihsaXN0KSAhPSAib2JqZWN0IikKICAgIHsKICAgICAgICBsaXN0ID0gbGlzdC5zcGxpdCgifCIpOwogICAgfQogICAgCiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxpc3QubGVuZ3RoIDsgaSsrKSAgICAKICAgIHsKICAgICAgICB2YXIgaXRlbSA9IGxpc3RbaV07CiAgICAgICAgaWYgKGl0ZW1bMF0gPT0gIi4iKQogICAgICAgIHsKICAgICAgICAgICAgZWxlbXMgPSBlbGVtcy5jb25jYXQoZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpdGVtLnN1YnN0cmluZygxLCAxMDAwKSwgcGFyZW50Tm9kZSkpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXRlbVswXSA9PSAiIyIpCiAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5zdWJzdHJpbmcoMSwgMTAwMCk7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZWxlbSA9IGdldEVsZW1lbnQoaXRlbSwgcGFyZW50Tm9kZSk7CiAgICAgICAgICAgIGlmIChlbGVtKQogICAgICAgICAgICAgICAgZWxlbXMucHVzaChlbGVtKQogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKGVsZW1zKTsKfQoKZnVuY3Rpb24gZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSwgcGFyZW50Tm9kZSkKewogICAgaWYgKHR5cGVvZih0YWdOYW1lKSA9PSAic3RyaW5nIikKICAgICAgICB2YXIgdGFnTmFtZXMgPSBbdGFnTmFtZV07CiAgICBlbHNlCiAgICAgICAgdmFyIHRhZ05hbWVzID0gdGFnTmFtZTsKICAgICAgICAKICAgIHZhciBlbGVtcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgdGFnTmFtZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIC8vZHVtcChfZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZXNbaV0sIHBhcmVudE5vZGUpKTsKICAgICAgICB2YXIgZWxlbXMyID0gX2dldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWVzW2ldLCBwYXJlbnROb2RlKTsKICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGVsZW1zMi5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICBlbGVtcy5wdXNoKGVsZW1zMltpaV0pOwogICAgICAgIC8vZHVtcCgiLS0tLSIpOwogICAgICAgIC8vZHVtcChlbGVtcyk7CiAgICB9CiAgICAKICAgIHJldHVybihlbGVtcyk7Cn0KCmZ1bmN0aW9uIF9nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lLCBwYXJlbnROb2RlKQp7CiAgICB0YWdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOwogICAgCiAgICBpZiAoIXBhcmVudE5vZGUpCiAgICAgICAgLy9wYXJlbnROb2RlID0gZG9jdW1lbnQuYm9keTsKICAgICAgICBwYXJlbnROb2RlID0gZG9jdW1lbnQ7CgogICAgaWYgKGRvY3VtZW50LmFsbCkgLy8gVE9ETyBmb3IgYXJyYXkKICAgIHsKICAgICAgICBpZiAodGFnTmFtZSA9PSAiKiIgJiYgcGFyZW50Tm9kZSA9PSBkb2N1bWVudC5ib2R5KQogICAgICAgICAgICByZXR1cm4oZG9jdW1lbnQuYWxsKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWxlbXMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBwYXJlbnROb2RlLmNoaWxkTm9kZXNbaV07CiAgICAgICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lID09IHRhZ05hbWUpCiAgICAgICAgICAgICAgICAgICAgZWxlbXMucHVzaChlbGVtKTsKICAgICAgICAgICAgICAgIHZhciBzdWJFbGVtcyA9IF9nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lLCBlbGVtKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwIDsgaiA8IHN1YkVsZW1zLmxlbmd0aCA7IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbGVtcy5wdXNoKHN1YkVsZW1zW2pdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4oZWxlbXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL2FsZXJ0KHRhZ05hbWUrIiAiK3BhcmVudE5vZGUrIiAiK3BhcmVudE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkubGVuZ3RoKTsKICAgICAgICByZXR1cm4ocGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSk7CiAgICB9Cn0KCi8vIHBva3VkIHBvdXppdmFtIHYgb25DbGljayAtIHBhayB0aGlzIGplIHRyZWJhIDxhPiBhIHZvbGEgc2UgYXV0b21hdGlja3kgbmF0aXZuaSBmdW5rY2UgLSBwb3RyZWJhIHBvdXppdCB3aW5kb3cuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgpCmZ1bmN0aW9uIGdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lLCBwYXJlbnROb2RlKQp7CiAgICBpZiAodHlwZW9mKHBhcmVudE5vZGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmVudE5vZGUgPSBkb2N1bWVudDsKICAgIAogICAgaWYgKHR5cGVvZihjbGFzc05hbWUpID09ICJzdHJpbmciKQogICAgICAgIHZhciBjbGFzc05hbWVzID0gW2NsYXNzTmFtZV07CiAgICBlbHNlCiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBjbGFzc05hbWU7CiAgICAgICAgCiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBjbGFzc05hbWUgPSBzdHJfcmVwbGFjZSgiLiIsICIiLCBjbGFzc05hbWVzW2ldKTsKICAgICAgICB2YXIgZWxlbXMyID0gX2dldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lLCBwYXJlbnROb2RlKTsKICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGVsZW1zMi5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICBlbGVtcy5wdXNoKGVsZW1zMltpaV0pOwogICAgfQogICAgCiAgICByZXR1cm4oZWxlbXMpOwp9CgpmdW5jdGlvbiBfZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUsIHBhcmVudE5vZGUpCnsKICAgIGlmICghcGFyZW50Tm9kZSkKICAgICAgICBwYXJlbnROb2RlID0gZG9jdW1lbnQ7CgogICAgaWYgKHBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkKICAgICAgICByZXR1cm4ocGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSkpOwogICAgZWxzZSAvLyBJRSA8PSA4CiAgICAgICAgcmV0dXJuKHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLicrY2xhc3NOYW1lKSk7CiAgICAKICAgIAp9CgppZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpIAp7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIAogICAgewogICAgICAgIHZhciBkb2MgPSBkb2N1bWVudCwKICAgICAgICBoZWFkID0gZG9jLmRvY3VtZW50RWxlbWVudC5maXJzdENoaWxkLAogICAgICAgIHN0eWxlVGFnID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ1NUWUxFJyk7CiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZVRhZyk7CiAgICAgICAgZG9jLl9fcXNhZWxzID0gW107CiAKICAgICAgICBzdHlsZVRhZy5zdHlsZVNoZWV0LmNzc1RleHQgPSBzZWxlY3RvciArICJ7eDpleHByZXNzaW9uKGRvY3VtZW50Ll9fcXNhZWxzLnB1c2godGhpcykpfSI7CiAgICAgICAgd2luZG93LnNjcm9sbEJ5KDAsIDApOwogCiAgICAgICAgcmV0dXJuIGRvYy5fX3FzYWVsczsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0RWxlbWVudEJ5QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBwYXJlbnROb2RlKQp7CiAgICB2YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBwYXJlbnROb2RlKTsKICAgIAogICAgcmV0dXJuKGVsZW1zWzBdKTsKfQoKZnVuY3Rpb24gZ2V0RWxlbWVudHNCeUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgcGFyZW50Tm9kZSkKewogICAgaWYgKHR5cGVvZihhdHRyaWJ1dGVWYWx1ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBudWxsOwogICAgaWYgKCFwYXJlbnROb2RlKQogICAgICAgIHBhcmVudE5vZGUgPSBkb2N1bWVudDsKCiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKQogICAgewogICAgICAgIHZhciBfZWxlbXMgPSBwYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1snK2F0dHJpYnV0ZU5hbWUrJ10nKTsKICAgICAgICAvL2R1bXAoX2VsZW1zKTsKICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IF9lbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChfZWxlbXNbaV0uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID09IGF0dHJpYnV0ZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIGVsZW1zLnB1c2goX2VsZW1zW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGVsZW1zID0gX2VsZW1zOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHBhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgbm9kZSA9IHBhcmVudE5vZGUuY2hpbGROb2Rlc1tpXTsKICAgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmIChhdHRyaWJ1dGVWYWx1ZT09bnVsbCB8fCBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA9PSBhdHRyaWJ1dGVWYWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWxlbXMucHVzaChub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsZW1zID0gZWxlbXMuY29uY2F0KGVsZW1zLCBnZXRFbGVtZW50c0J5QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBub2RlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4oZWxlbXMpOwp9CgoKZnVuY3Rpb24gZ2V0RWxlbWVudHNCeU5vZGVUeXBlKG5vZGVUeXBlLCBwYXJlbnROb2RlKQp7CiAgICBpZiAoIXBhcmVudE5vZGUpCiAgICAgICAgcGFyZW50Tm9kZSA9IGRvY3VtZW50OwoKICAgIHZhciByZXQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHBhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIG5vZGUgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXNbaV07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gbm9kZVR5cGUpCiAgICAgICAgICAgIHJldC5wdXNoKG5vZGUpOwogICAgICAgIGVsc2UgaWYgKG5vZGUuY2hpbGROb2RlcykKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldC5jb25jYXQoZ2V0RWxlbWVudHNCeU5vZGVUeXBlKG5vZGVUeXBlLCBub2RlKSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4ocmV0KTsKfQoKZnVuY3Rpb24gZ2V0Q2hpbGRFbGVtZW50cyhwYXJlbnROb2RlKQp7CiAgICB2YXIgcmV0ID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBwYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBub2RlID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldOwogICAgICAgIHJldC5wdXNoKG5vZGUpOwogICAgfQogICAgCiAgICByZXR1cm4ocmV0KTsKfQoKZnVuY3Rpb24gZ2V0QWxsQ2hpbGRFbGVtZW50cyhwYXJlbnROb2RlKQp7CiAgICB2YXIgZWxlbXMgPSBnZXRDaGlsZEVsZW1lbnRzKHBhcmVudE5vZGUpOwogICAgdmFyIHJldCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHJldC5wdXNoKGVsZW1zW2ldKTsKICAgICAgICB2YXIgZWxlbXMyID0gZ2V0Q2hpbGRFbGVtZW50cyhlbGVtc1tpXSk7CiAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBlbGVtczIubGVuZ3RoIDsgaWkrKykKICAgICAgICAgICAgcmV0LnB1c2goZWxlbXMyW2lpXSk7CiAgICB9CgogICAgcmV0dXJuKHJldCk7Cn0KCmZ1bmN0aW9uIGdldENoaWxkRWxlbWVudHNCeU5vZGVUeXBlKG5vZGVUeXBlLCBwYXJlbnROb2RlKQp7CiAgICB2YXIgcmV0ID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBwYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBub2RlID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IG5vZGVUeXBlKQogICAgICAgICAgICByZXQucHVzaChub2RlKTsKICAgIH0KICAgIAogICAgcmV0dXJuKHJldCk7Cn0KCmZ1bmN0aW9uIGdldEVsZW1lbnRCeVRhZ05hbWUodGFnTmFtZSwgcGFyZW50Tm9kZSkKewogICAgcmV0dXJuKGdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUpWzBdKTsKfQoKZnVuY3Rpb24gZ2V0Q2hpbGRFbGVtZW50QnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUpCnsKICAgIHJldHVybihnZXRDaGlsZEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUpWzBdKTsKfQoKZnVuY3Rpb24gZ2V0UGFyZW50RWxlbWVudEJ5VGFnTmFtZSh0YWdOYW1lcywgbm9kZSkKewogICAgaWYgKCEodGFnTmFtZXMgaW5zdGFuY2VvZiBBcnJheSkpCiAgICAgICAgdGFnTmFtZXMgPSBbdGFnTmFtZXNdOwogICAgCiAgICBpZiAoIW5vZGUudGFnTmFtZSkKICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgCiAgICB3aGlsZShub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUgIT0gIkJPRFkiICYmICFpbl9hcnJheShub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwgdGFnTmFtZXMpKQogICAgewogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUgJiYgbm9kZS50YWdOYW1lID09ICJCT0RZIikKICAgICAgICBub2RlID0gbnVsbDsKICAgIAogICAgcmV0dXJuKG5vZGUpOwp9CgpmdW5jdGlvbiBnZXRQYXJlbnRFbGVtZW50QnlDbGFzc05hbWUoY2xhc3NOYW1lcywgbm9kZSkKewogICAgaWYgKCEoY2xhc3NOYW1lcyBpbnN0YW5jZW9mIEFycmF5KSkKICAgICAgICBjbGFzc05hbWVzID0gW2NsYXNzTmFtZXNdOwogICAgCiAgICBpZiAoIW5vZGUudGFnTmFtZSkKICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgCiAgICB3aGlsZShub2RlICYmIG5vZGUudGFnTmFtZSAhPSAiQk9EWSIpCiAgICB7CiAgICAgICAgLy9kdW1wKG5vZGUpOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShub2RlLCBjbGFzc05hbWVzW2ldKSkKICAgICAgICAgICAgICAgIHJldHVybihub2RlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgIH0KCiAgICBpZiAobm9kZSAmJiBub2RlLnRhZ05hbWUgPT0gIkJPRFkiKQogICAgICAgIG5vZGUgPSBudWxsOwogICAgCiAgICByZXR1cm4obm9kZSk7Cn0KCmZ1bmN0aW9uIGdldEVsZW1lbnRCeUNsYXNzTmFtZShjbGFzc05hbWUsIHBhcmVudE5vZGUpCnsKICAgIHJldHVybihnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSwgcGFyZW50Tm9kZSlbMF0pOwp9CgpmdW5jdGlvbiBnZXRTaWJsaW5nTm9kZXMobm9kZSkKewogICAgdmFyIGVsZW1zPVtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBub2RlUyA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldOwogICAgICAgIGlmIChub2RlICE9IG5vZGVTKQogICAgICAgICAgICBlbGVtcy5wdXNoKG5vZGVTKTsKICAgIH0KICAgIHJldHVybihlbGVtcyk7Cn0KCi8vIHdvcmtzIGxpa2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUsIGJ1dCBmaW5kcyBhbHNvIGR5bmFtaWNhbHkgYWRkZWQgZWxlbWVudHMKZnVuY3Rpb24gZmluZEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUpCnsKICAgIHZhciBlbGVtcyA9IFtdOwogICAgCiAgICBpZiAoIXBhcmVudE5vZGUpCiAgICAgICAgcGFyZW50Tm9kZSA9IGRvY3VtZW50LmJvZHk7CiAgICAKICAgIGlmIChwYXJlbnROb2RlKSAgICAKICAgIHsKICAgICAgICAvL2R1bXAocGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChwYXJlbnROb2RlLmNoaWxkTm9kZXNbaV0udGFnTmFtZSk7CiAgICAgICAgICAgIGlmICh0YWdOYW1lID09ICIqIiB8fCAocGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldLnRhZ05hbWUgJiYgcGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlbGVtcy5wdXNoKHBhcmVudE5vZGUuY2hpbGROb2Rlc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN1YkVsZW1zID0gZmluZEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUuY2hpbGROb2Rlc1tpXSk7CiAgICAgICAgICAgIGZvciAodmFyIHMgPSAwIDsgcyA8IHN1YkVsZW1zLmxlbmd0aCA7IHMrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWxlbXMucHVzaChzdWJFbGVtc1tzXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybihlbGVtcyk7Cn0KCgpmdW5jdGlvbiBnZXRQcmV2U2libGluZ05vZGVzKG5vZGUsIHRhZ05hbWUpCnsKICAgIGlmICh0eXBlb2YodGFnTmFtZSkgPT0gInN0cmluZyIpCiAgICAgICAgdGFnTmFtZXMgPSBbdGFnTmFtZV07CiAgICBlbHNlIGlmICh0eXBlb2YodGFnTmFtZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGFnTmFtZXMgPSBbIiJdOwogICAgZWxzZQogICAgICAgIHRhZ05hbWVzID0gdGFnTmFtZTsKICAgIAogICAgdmFyIG5vZGVzID0gW107CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSkKICAgIHsKICAgICAgICB2YXIgbGlzdCA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgICAgIAogICAgICAgIHZhciBwcmV2ID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IGxpc3QubGVuZ3RoLTEgOyBpID49IDAgOyBpLS0pCiAgICAgICAgewogICAgICAgICAgICB2YXIgbGlzdG5vZGUgPSBsaXN0W2ldOwogICAgICAgICAgICBpZiAocHJldikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAgOyB0IDwgdGFnTmFtZXMubGVuZ3RoIDsgdCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWdOYW1lID0gdGFnTmFtZXNbdF07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gIiIgfHwgKHRhZ05hbWUgPT0gIioiICYmIGxpc3Rub2RlLnRhZ05hbWUpIHx8IChsaXN0bm9kZS50YWdOYW1lICYmIHRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSBsaXN0bm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKQogICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGxpc3Rub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3Rub2RlID09IG5vZGUpCiAgICAgICAgICAgICAgICBwcmV2ID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuKG5vZGVzKTsKfQoKZnVuY3Rpb24gZ2V0TmV4dFNpYmxpbmdOb2Rlcyhub2RlLCB0YWdOYW1lKQp7CiAgICBpZiAodHlwZW9mKHRhZ05hbWUpID09ICJzdHJpbmciKQogICAgICAgIHRhZ05hbWVzID0gW3RhZ05hbWVdOwogICAgZWxzZSBpZiAodHlwZW9mKHRhZ05hbWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRhZ05hbWVzID0gWyIiXTsKICAgIGVsc2UKICAgICAgICB0YWdOYW1lcyA9IHRhZ05hbWU7CgogICAgdmFyIG5vZGVzID0gW107CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSkKICAgIHsKICAgICAgICB2YXIgbGlzdCA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgICAgIAogICAgICAgIHZhciBuZXh0ID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbGlzdC5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgbGlzdG5vZGUgPSBsaXN0W2ldOwogICAgICAgICAgICBpZiAobmV4dCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAgOyB0IDwgdGFnTmFtZXMubGVuZ3RoIDsgdCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWdOYW1lID0gdGFnTmFtZXNbdF07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gIiIgfHwgKHRhZ05hbWUgPT0gIioiICYmIGxpc3Rub2RlLnRhZ05hbWUpIHx8IChsaXN0bm9kZS50YWdOYW1lICYmIHRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSBsaXN0bm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKQogICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGxpc3Rub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3Rub2RlID09IG5vZGUpCiAgICAgICAgICAgICAgICBuZXh0ID0gdHJ1ZTsKICAgICAgICB9CiAgICB9ICAgICAgICAKICAgIHJldHVybihub2Rlcyk7Cn0KCmZ1bmN0aW9uIGdldFNpYmxpbmdOb2Rlcyhub2RlLCB0YWdOYW1lKQp7CiAgICBpZiAodHlwZW9mKHRhZ05hbWUpID09ICJzdHJpbmciKQogICAgICAgIHRhZ05hbWVzID0gW3RhZ05hbWVdOwogICAgZWxzZSBpZiAodHlwZW9mKHRhZ05hbWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRhZ05hbWVzID0gWyIiXTsKICAgIGVsc2UKICAgICAgICB0YWdOYW1lcyA9IHRhZ05hbWU7CgogICAgdmFyIGxpc3QgPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2RlczsKICAgIAogICAgdmFyIG5vZGVzID0gW107CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBsaXN0Lmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgbGlzdG5vZGUgPSBsaXN0W2ldOwogICAgICAgIGlmIChsaXN0bm9kZSAhPSBub2RlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAgOyB0IDwgdGFnTmFtZXMubGVuZ3RoIDsgdCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdGFnTmFtZSA9IHRhZ05hbWVzW3RdOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gIiIgfHwgdGFnTmFtZSA9PSAiKiIgJiYgbGlzdG5vZGUudGFnTmFtZSB8fCAobGlzdG5vZGUudGFnTmFtZSAmJiB0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gbGlzdG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkKICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGxpc3Rub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL25vZGVzLnB1c2gobGlzdG5vZGUpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKG5vZGVzKTsKfQoKZnVuY3Rpb24gZ2V0UHJldlNpYmxpbmcobm9kZSwgdGFnTmFtZSkKewogICAgaWYgKHR5cGVvZih0YWdOYW1lKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0YWdOYW1lID0gIiI7CiAgICAKICAgIC8vZHVtcChub2RlKTsKICAgIHZhciBub2RlcyA9IGdldFByZXZTaWJsaW5nTm9kZXMobm9kZSwgdGFnTmFtZSk7CiAgICAvL2R1bXAobm9kZXMubGVuZ3RoKTsKICAgIC8vZHVtcChub2Rlcyk7CiAgICAvL2R1bXAobm9kZXNbMF0pOwogICAgcmV0dXJuKG5vZGVzWzBdKTsKfQoKZnVuY3Rpb24gZ2V0TmV4dFNpYmxpbmcobm9kZSwgdGFnTmFtZSkKewogICAgaWYgKHR5cGVvZih0YWdOYW1lKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0YWdOYW1lID0gIiI7CgogICAgdmFyIG5vZGVzID0gZ2V0TmV4dFNpYmxpbmdOb2Rlcyhub2RlLCB0YWdOYW1lKTsKICAgIHJldHVybihub2Rlc1swXSk7Cn0KCmZ1bmN0aW9uIGdldE5vZGVMZW5ndGgobm9kZSkKewogICAgdmFyIGh0bWwgPSBvdXRlckhUTUwobm9kZSk7CiAgICBpZiAoIWh0bWwpCiAgICAgICAgaHRtbCA9ICIiOwogICAgLy9kdW1wKGh0bWxlbnRpdGllcyhodG1sKSk7CiAgICAvL2R1bXAoaHRtbC5sZW5ndGgpOwogICAgLy9odG1sID0gaHRtbC5yZXBsYWNlKC8mW147XSs7L2csICJFIik7CiAgICAvL2R1bXAoaHRtbC5sZW5ndGgpOwogICAgCiAgICByZXR1cm4oaHRtbC5sZW5ndGgpOwp9CgpmdW5jdGlvbiBnZXRQYXJlbnROb2Rlcyhub2RlKQp7CiAgICB2YXIgbGlzdCA9IFtdOwogICAgCiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgd2hpbGUobm9kZSkKICAgIHsKICAgICAgICBsaXN0LnB1c2gobm9kZSk7CiAgICAgICAgCiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgIH0KICAgIAogICAgcmV0dXJuKGxpc3QpOwp9CgpmdW5jdGlvbiBnZXRDaGlsZE5vZGVzKG5vZGUsIGxldmVsLCB0aGlzTGV2ZWwpCnsKICAgIGlmICh0eXBlb2YobGV2ZWwpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGxldmVsID0gMDsKICAgIGlmICh0eXBlb2YodGhpc0xldmVsKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzTGV2ZWwgPSAwOwogICAgCiAgICB2YXIgbGlzdCA9IFtdOwogICAgCiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBfbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tpXTsKICAgICAgICBsaXN0LnB1c2goX25vZGUpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzTGV2ZWwgPCBsZXZlbCB8fCBsZXZlbCA9PSAtMSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZExpc3QgPSBnZXRDaGlsZE5vZGVzKF9ub2RlLCBsZXZlbCwgdGhpc0xldmVsKzEpOwogICAgICAgICAgICBmb3IgKHZhciBjID0gMCA7IGMgPCBjaGlsZExpc3QubGVuZ3RoIDsgYysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsaXN0LnB1c2goY2hpbGRMaXN0W2NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKGxpc3QpOwp9CiAgICAKICAgIC8vIGNhbGxpbmcgZm9ybS5zdWJtaXQoKSBkb2VzIG5vdCBmaXJlIG9uc3VibWl0IGV2ZW50IChvbmx5IHVzaW5nIHN1Ym1pdCBidXR0b24pISBuZWVkZWQgdGhpcyBmdW5jdGlvbgpmdW5jdGlvbiBzdWJtaXRGb3JtKGZvcm1JZCwgdmFsdWVzT25seSkKewogICAgaWYgKHR5cGVvZih2YWx1ZXNPbmx5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICB2YWx1ZXNPbmx5ID0gZmFsc2U7CgogICAgdmFyIGZvcm0gPSBnZXRFbGVtZW50KGZvcm1JZCk7CgogICAgaWYgKGZvcm0pCiAgICB7CiAgICAgICAgaWYgKGZvcm0ubWV0aG9kID09ICJnZXQiICYmIHZhbHVlc09ubHkpCiAgICAgICAgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGZvcm0uYWN0aW9uICsgIj8iICsgZ2V0UGFyYW1zQXNMaW5rKGdldFZhbHVlc0luRWxlbWVudChmb3JtKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vaWYgKGZvcm0ub25zdWJtaXQpCiAgICAgICAgdmFyIHJldCA9IHRydWU7CiAgICAgICAgdHJ5IAogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZvcm0ub25zdWJtaXQpCiAgICAgICAgICAgICAgICByZXQgPSByZXQgJiYgZm9ybS5vbnN1Ym1pdCgpOwogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICB9CgogICAgICAgIGlmIChyZXQpCiAgICAgICAgewogICAgICAgICAgICB0cnkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBmb3IgSUUKICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmZpcmVFdmVudCgnb25zdWJtaXQnLGV2dCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBmb3IgZmlyZWZveCArIG90aGVycwogICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpOwogICAgICAgICAgICAgICAgICAgIGV2dC5pbml0RXZlbnQoInN1Ym1pdCIsIHRydWUsIHRydWUgKTsgLy8gZXZlbnQgdHlwZSxidWJibGluZyxjYW5jZWxhYmxlCiAgICAgICAgICAgICAgICAgICAgZm9ybS5kaXNwYXRjaEV2ZW50KGV2dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZHVtcChldnQpOwogICAgICAgICAgICAgICAgLy9kdW1wKHJldCk7CiAgICAgICAgICAgICAgICByZXQgPSByZXQgJiYgIWV2dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9kdW1wKHJldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgCiAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTsKICAgIH0KfTsKCmZ1bmN0aW9uIGlzU2ltcGxlQXJyYXkoYSkKewogICAgaWYgKCFpc19hcnJheShhKSkKICAgICAgICByZXR1cm4oZmFsc2UpOwoKICAgIHZhciByZXQgPSB0cnVlOwogICAgZm9yICh2YXIgaSBpbiBhKQogICAgewogICAgICAgIGlmICghaS5tYXRjaCgvXlswLTldKyQvKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybihyZXQpOwp9CgpmdW5jdGlvbiBpc0Fzc29jQXJyYXkoYSkKewogICAgcmV0dXJuKGlzX2FycmF5KGEpICYmICFpc1NpbXBsZUFycmF5KGEpKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1ENSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmZ1bmN0aW9uIGFycmF5KG4pIHsKICBmb3IoaT0wO2k8bjtpKyspIHRoaXNbaV09MDsKICB0aGlzLmxlbmd0aD1uOwp9CgovKiBTb21lIGJhc2ljIGxvZ2ljYWwgZnVuY3Rpb25zIGhhZCB0byBiZSByZXdyaXR0ZW4gYmVjYXVzZSBvZiBhIGJ1ZyBpbgogKiBKYXZhc2NyaXB0Li4gSnVzdCB0cnkgdG8gY29tcHV0ZSAweGZmZmZmZmZmID4+IDQgd2l0aCBpdC4uCiAqIE9mIGNvdXJzZSwgdGhlc2UgZnVuY3Rpb25zIGFyZSBzbG93ZXIgdGhhbiB0aGUgb3JpZ2luYWwgd291bGQgYmUsIGJ1dAogKiBhdCBsZWFzdCwgdGhleSB3b3JrIQogKi8KCmZ1bmN0aW9uIGludGVnZXIobikgeyByZXR1cm4gbiUoMHhmZmZmZmZmZisxKTsgfQoKZnVuY3Rpb24gc2hyKGEsYikgewogIGE9aW50ZWdlcihhKTsKICBiPWludGVnZXIoYik7CiAgaWYgKGEtMHg4MDAwMDAwMD49MCkgewogICAgYT1hJTB4ODAwMDAwMDA7CiAgICBhPj49YjsKICAgIGErPTB4NDAwMDAwMDA+PihiLTEpOwogIH0gZWxzZQogICAgYT4+PWI7CiAgcmV0dXJuIGE7Cn0KCmZ1bmN0aW9uIHNobDEoYSkgewogIGE9YSUweDgwMDAwMDAwOwogIGlmIChhJjB4NDAwMDAwMDA9PTB4NDAwMDAwMDApCiAgewogICAgYS09MHg0MDAwMDAwMDsKICAgIGEqPTI7CiAgICBhKz0weDgwMDAwMDAwOwogIH0gZWxzZQogICAgYSo9MjsKICByZXR1cm4gYTsKfQoKZnVuY3Rpb24gc2hsKGEsYikgewogIGE9aW50ZWdlcihhKTsKICBiPWludGVnZXIoYik7CiAgZm9yICh2YXIgaT0wO2k8YjtpKyspIGE9c2hsMShhKTsKICByZXR1cm4gYTsKfQoKZnVuY3Rpb24gYW5kKGEsYikgewogIGE9aW50ZWdlcihhKTsKICBiPWludGVnZXIoYik7CiAgdmFyIHQxPShhLTB4ODAwMDAwMDApOwogIHZhciB0Mj0oYi0weDgwMDAwMDAwKTsKICBpZiAodDE+PTApCiAgICBpZiAodDI+PTApCiAgICAgIHJldHVybiAoKHQxJnQyKSsweDgwMDAwMDAwKTsKICAgIGVsc2UKICAgICAgcmV0dXJuICh0MSZiKTsKICBlbHNlCiAgICBpZiAodDI+PTApCiAgICAgIHJldHVybiAoYSZ0Mik7CiAgICBlbHNlCiAgICAgIHJldHVybiAoYSZiKTsKfQoKZnVuY3Rpb24gb3IoYSxiKSB7CiAgYT1pbnRlZ2VyKGEpOwogIGI9aW50ZWdlcihiKTsKICB2YXIgdDE9KGEtMHg4MDAwMDAwMCk7CiAgdmFyIHQyPShiLTB4ODAwMDAwMDApOwogIGlmICh0MT49MCkKICAgIGlmICh0Mj49MCkKICAgICAgcmV0dXJuICgodDF8dDIpKzB4ODAwMDAwMDApOwogICAgZWxzZQogICAgICByZXR1cm4gKCh0MXxiKSsweDgwMDAwMDAwKTsKICBlbHNlCiAgICBpZiAodDI+PTApCiAgICAgIHJldHVybiAoKGF8dDIpKzB4ODAwMDAwMDApOwogICAgZWxzZQogICAgICByZXR1cm4gKGF8Yik7Cn0KCmZ1bmN0aW9uIHhvcihhLGIpIHsKICBhPWludGVnZXIoYSk7CiAgYj1pbnRlZ2VyKGIpOwogIHZhciB0MT0oYS0weDgwMDAwMDAwKTsKICB2YXIgdDI9KGItMHg4MDAwMDAwMCk7CiAgaWYgKHQxPj0wKQogICAgaWYgKHQyPj0wKQogICAgICByZXR1cm4gKHQxXnQyKTsKICAgIGVsc2UKICAgICAgcmV0dXJuICgodDFeYikrMHg4MDAwMDAwMCk7CiAgZWxzZQogICAgaWYgKHQyPj0wKQogICAgICByZXR1cm4gKChhXnQyKSsweDgwMDAwMDAwKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIChhXmIpOwp9CgpmdW5jdGlvbiBub3QoYSkgewogIGE9aW50ZWdlcihhKTsKICByZXR1cm4gKDB4ZmZmZmZmZmYtYSk7Cn0KCi8qIEhlcmUgYmVnaW4gdGhlIHJlYWwgYWxnb3JpdGhtICovCgogICAgdmFyIHN0YXRlID0gbmV3IGFycmF5KDQpOwogICAgdmFyIGNvdW50ID0gbmV3IGFycmF5KDIpOwogICAgY291bnRbMF0gPSAwOwogICAgY291bnRbMV0gPSAwOwogICAgdmFyIGJ1ZmZlciA9IG5ldyBhcnJheSg2NCk7CiAgICB2YXIgdHJhbnNmb3JtQnVmZmVyID0gbmV3IGFycmF5KDE2KTsKICAgIHZhciBkaWdlc3RCaXRzID0gbmV3IGFycmF5KDE2KTsKCiAgICB2YXIgUzExID0gNzsKICAgIHZhciBTMTIgPSAxMjsKICAgIHZhciBTMTMgPSAxNzsKICAgIHZhciBTMTQgPSAyMjsKICAgIHZhciBTMjEgPSA1OwogICAgdmFyIFMyMiA9IDk7CiAgICB2YXIgUzIzID0gMTQ7CiAgICB2YXIgUzI0ID0gMjA7CiAgICB2YXIgUzMxID0gNDsKICAgIHZhciBTMzIgPSAxMTsKICAgIHZhciBTMzMgPSAxNjsKICAgIHZhciBTMzQgPSAyMzsKICAgIHZhciBTNDEgPSA2OwogICAgdmFyIFM0MiA9IDEwOwogICAgdmFyIFM0MyA9IDE1OwogICAgdmFyIFM0NCA9IDIxOwoKICAgIGZ1bmN0aW9uIEYoeCx5LHopIHsKICAgIHJldHVybiBvcihhbmQoeCx5KSxhbmQobm90KHgpLHopKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHKHgseSx6KSB7CiAgICByZXR1cm4gb3IoYW5kKHgseiksYW5kKHksbm90KHopKSk7CiAgICB9CgogICAgZnVuY3Rpb24gSCh4LHkseikgewogICAgcmV0dXJuIHhvcih4b3IoeCx5KSx6KTsKICAgIH0KCiAgICBmdW5jdGlvbiBJKHgseSx6KSB7CiAgICByZXR1cm4geG9yKHkgLG9yKHggLCBub3QoeikpKTsKICAgIH0KCiAgICBmdW5jdGlvbiByb3RhdGVMZWZ0KGEsbikgewogICAgcmV0dXJuIG9yKHNobChhLCBuKSwoc2hyKGEsKDMyIC0gbikpKSk7CiAgICB9CgogICAgZnVuY3Rpb24gRkYoYSxiLGMsZCx4LHMsYWMpIHsKICAgICAgICBhID0gYStGKGIsIGMsIGQpICsgeCArIGFjOwogICAgYSA9IHJvdGF0ZUxlZnQoYSwgcyk7CiAgICBhID0gYStiOwogICAgcmV0dXJuIGE7CiAgICB9CgogICAgZnVuY3Rpb24gR0coYSxiLGMsZCx4LHMsYWMpIHsKICAgIGEgPSBhK0coYiwgYywgZCkgK3ggKyBhYzsKICAgIGEgPSByb3RhdGVMZWZ0KGEsIHMpOwogICAgYSA9IGErYjsKICAgIHJldHVybiBhOwogICAgfQoKICAgIGZ1bmN0aW9uIEhIKGEsYixjLGQseCxzLGFjKSB7CiAgICBhID0gYStIKGIsIGMsIGQpICsgeCArIGFjOwogICAgYSA9IHJvdGF0ZUxlZnQoYSwgcyk7CiAgICBhID0gYStiOwogICAgcmV0dXJuIGE7CiAgICB9CgogICAgZnVuY3Rpb24gSUkoYSxiLGMsZCx4LHMsYWMpIHsKICAgIGEgPSBhK0koYiwgYywgZCkgKyB4ICsgYWM7CiAgICBhID0gcm90YXRlTGVmdChhLCBzKTsKICAgIGEgPSBhK2I7CiAgICByZXR1cm4gYTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0oYnVmLG9mZnNldCkgewogICAgdmFyIGE9MCwgYj0wLCBjPTAsIGQ9MDsKICAgIHZhciB4ID0gdHJhbnNmb3JtQnVmZmVyOwoKICAgIGEgPSBzdGF0ZVswXTsKICAgIGIgPSBzdGF0ZVsxXTsKICAgIGMgPSBzdGF0ZVsyXTsKICAgIGQgPSBzdGF0ZVszXTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgIHhbaV0gPSBhbmQoYnVmW2kqNCtvZmZzZXRdLDB4ZmYpOwogICAgICAgIGZvciAoaiA9IDE7IGogPCA0OyBqKyspIHsKICAgICAgICB4W2ldKz1zaGwoYW5kKGJ1ZltpKjQraitvZmZzZXRdICwweGZmKSwgaiAqIDgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBSb3VuZCAxICovCiAgICBhID0gRkYgKCBhLCBiLCBjLCBkLCB4WyAwXSwgUzExLCAweGQ3NmFhNDc4KTsgLyogMSAqLwogICAgZCA9IEZGICggZCwgYSwgYiwgYywgeFsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7IC8qIDIgKi8KICAgIGMgPSBGRiAoIGMsIGQsIGEsIGIsIHhbIDJdLCBTMTMsIDB4MjQyMDcwZGIpOyAvKiAzICovCiAgICBiID0gRkYgKCBiLCBjLCBkLCBhLCB4WyAzXSwgUzE0LCAweGMxYmRjZWVlKTsgLyogNCAqLwogICAgYSA9IEZGICggYSwgYiwgYywgZCwgeFsgNF0sIFMxMSwgMHhmNTdjMGZhZik7IC8qIDUgKi8KICAgIGQgPSBGRiAoIGQsIGEsIGIsIGMsIHhbIDVdLCBTMTIsIDB4NDc4N2M2MmEpOyAvKiA2ICovCiAgICBjID0gRkYgKCBjLCBkLCBhLCBiLCB4WyA2XSwgUzEzLCAweGE4MzA0NjEzKTsgLyogNyAqLwogICAgYiA9IEZGICggYiwgYywgZCwgYSwgeFsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7IC8qIDggKi8KICAgIGEgPSBGRiAoIGEsIGIsIGMsIGQsIHhbIDhdLCBTMTEsIDB4Njk4MDk4ZDgpOyAvKiA5ICovCiAgICBkID0gRkYgKCBkLCBhLCBiLCBjLCB4WyA5XSwgUzEyLCAweDhiNDRmN2FmKTsgLyogMTAgKi8KICAgIGMgPSBGRiAoIGMsIGQsIGEsIGIsIHhbMTBdLCBTMTMsIDB4ZmZmZjViYjEpOyAvKiAxMSAqLwogICAgYiA9IEZGICggYiwgYywgZCwgYSwgeFsxMV0sIFMxNCwgMHg4OTVjZDdiZSk7IC8qIDEyICovCiAgICBhID0gRkYgKCBhLCBiLCBjLCBkLCB4WzEyXSwgUzExLCAweDZiOTAxMTIyKTsgLyogMTMgKi8KICAgIGQgPSBGRiAoIGQsIGEsIGIsIGMsIHhbMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpOyAvKiAxNCAqLwogICAgYyA9IEZGICggYywgZCwgYSwgYiwgeFsxNF0sIFMxMywgMHhhNjc5NDM4ZSk7IC8qIDE1ICovCiAgICBiID0gRkYgKCBiLCBjLCBkLCBhLCB4WzE1XSwgUzE0LCAweDQ5YjQwODIxKTsgLyogMTYgKi8KCiAgICAvKiBSb3VuZCAyICovCiAgICBhID0gR0cgKCBhLCBiLCBjLCBkLCB4WyAxXSwgUzIxLCAweGY2MWUyNTYyKTsgLyogMTcgKi8KICAgIGQgPSBHRyAoIGQsIGEsIGIsIGMsIHhbIDZdLCBTMjIsIDB4YzA0MGIzNDApOyAvKiAxOCAqLwogICAgYyA9IEdHICggYywgZCwgYSwgYiwgeFsxMV0sIFMyMywgMHgyNjVlNWE1MSk7IC8qIDE5ICovCiAgICBiID0gR0cgKCBiLCBjLCBkLCBhLCB4WyAwXSwgUzI0LCAweGU5YjZjN2FhKTsgLyogMjAgKi8KICAgIGEgPSBHRyAoIGEsIGIsIGMsIGQsIHhbIDVdLCBTMjEsIDB4ZDYyZjEwNWQpOyAvKiAyMSAqLwogICAgZCA9IEdHICggZCwgYSwgYiwgYywgeFsxMF0sIFMyMiwgIDB4MjQ0MTQ1Myk7IC8qIDIyICovCiAgICBjID0gR0cgKCBjLCBkLCBhLCBiLCB4WzE1XSwgUzIzLCAweGQ4YTFlNjgxKTsgLyogMjMgKi8KICAgIGIgPSBHRyAoIGIsIGMsIGQsIGEsIHhbIDRdLCBTMjQsIDB4ZTdkM2ZiYzgpOyAvKiAyNCAqLwogICAgYSA9IEdHICggYSwgYiwgYywgZCwgeFsgOV0sIFMyMSwgMHgyMWUxY2RlNik7IC8qIDI1ICovCiAgICBkID0gR0cgKCBkLCBhLCBiLCBjLCB4WzE0XSwgUzIyLCAweGMzMzcwN2Q2KTsgLyogMjYgKi8KICAgIGMgPSBHRyAoIGMsIGQsIGEsIGIsIHhbIDNdLCBTMjMsIDB4ZjRkNTBkODcpOyAvKiAyNyAqLwogICAgYiA9IEdHICggYiwgYywgZCwgYSwgeFsgOF0sIFMyNCwgMHg0NTVhMTRlZCk7IC8qIDI4ICovCiAgICBhID0gR0cgKCBhLCBiLCBjLCBkLCB4WzEzXSwgUzIxLCAweGE5ZTNlOTA1KTsgLyogMjkgKi8KICAgIGQgPSBHRyAoIGQsIGEsIGIsIGMsIHhbIDJdLCBTMjIsIDB4ZmNlZmEzZjgpOyAvKiAzMCAqLwogICAgYyA9IEdHICggYywgZCwgYSwgYiwgeFsgN10sIFMyMywgMHg2NzZmMDJkOSk7IC8qIDMxICovCiAgICBiID0gR0cgKCBiLCBjLCBkLCBhLCB4WzEyXSwgUzI0LCAweDhkMmE0YzhhKTsgLyogMzIgKi8KCiAgICAvKiBSb3VuZCAzICovCiAgICBhID0gSEggKCBhLCBiLCBjLCBkLCB4WyA1XSwgUzMxLCAweGZmZmEzOTQyKTsgLyogMzMgKi8KICAgIGQgPSBISCAoIGQsIGEsIGIsIGMsIHhbIDhdLCBTMzIsIDB4ODc3MWY2ODEpOyAvKiAzNCAqLwogICAgYyA9IEhIICggYywgZCwgYSwgYiwgeFsxMV0sIFMzMywgMHg2ZDlkNjEyMik7IC8qIDM1ICovCiAgICBiID0gSEggKCBiLCBjLCBkLCBhLCB4WzE0XSwgUzM0LCAweGZkZTUzODBjKTsgLyogMzYgKi8KICAgIGEgPSBISCAoIGEsIGIsIGMsIGQsIHhbIDFdLCBTMzEsIDB4YTRiZWVhNDQpOyAvKiAzNyAqLwogICAgZCA9IEhIICggZCwgYSwgYiwgYywgeFsgNF0sIFMzMiwgMHg0YmRlY2ZhOSk7IC8qIDM4ICovCiAgICBjID0gSEggKCBjLCBkLCBhLCBiLCB4WyA3XSwgUzMzLCAweGY2YmI0YjYwKTsgLyogMzkgKi8KICAgIGIgPSBISCAoIGIsIGMsIGQsIGEsIHhbMTBdLCBTMzQsIDB4YmViZmJjNzApOyAvKiA0MCAqLwogICAgYSA9IEhIICggYSwgYiwgYywgZCwgeFsxM10sIFMzMSwgMHgyODliN2VjNik7IC8qIDQxICovCiAgICBkID0gSEggKCBkLCBhLCBiLCBjLCB4WyAwXSwgUzMyLCAweGVhYTEyN2ZhKTsgLyogNDIgKi8KICAgIGMgPSBISCAoIGMsIGQsIGEsIGIsIHhbIDNdLCBTMzMsIDB4ZDRlZjMwODUpOyAvKiA0MyAqLwogICAgYiA9IEhIICggYiwgYywgZCwgYSwgeFsgNl0sIFMzNCwgIDB4NDg4MWQwNSk7IC8qIDQ0ICovCiAgICBhID0gSEggKCBhLCBiLCBjLCBkLCB4WyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTsgLyogNDUgKi8KICAgIGQgPSBISCAoIGQsIGEsIGIsIGMsIHhbMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpOyAvKiA0NiAqLwogICAgYyA9IEhIICggYywgZCwgYSwgYiwgeFsxNV0sIFMzMywgMHgxZmEyN2NmOCk7IC8qIDQ3ICovCiAgICBiID0gSEggKCBiLCBjLCBkLCBhLCB4WyAyXSwgUzM0LCAweGM0YWM1NjY1KTsgLyogNDggKi8KCiAgICAvKiBSb3VuZCA0ICovCiAgICBhID0gSUkgKCBhLCBiLCBjLCBkLCB4WyAwXSwgUzQxLCAweGY0MjkyMjQ0KTsgLyogNDkgKi8KICAgIGQgPSBJSSAoIGQsIGEsIGIsIGMsIHhbIDddLCBTNDIsIDB4NDMyYWZmOTcpOyAvKiA1MCAqLwogICAgYyA9IElJICggYywgZCwgYSwgYiwgeFsxNF0sIFM0MywgMHhhYjk0MjNhNyk7IC8qIDUxICovCiAgICBiID0gSUkgKCBiLCBjLCBkLCBhLCB4WyA1XSwgUzQ0LCAweGZjOTNhMDM5KTsgLyogNTIgKi8KICAgIGEgPSBJSSAoIGEsIGIsIGMsIGQsIHhbMTJdLCBTNDEsIDB4NjU1YjU5YzMpOyAvKiA1MyAqLwogICAgZCA9IElJICggZCwgYSwgYiwgYywgeFsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7IC8qIDU0ICovCiAgICBjID0gSUkgKCBjLCBkLCBhLCBiLCB4WzEwXSwgUzQzLCAweGZmZWZmNDdkKTsgLyogNTUgKi8KICAgIGIgPSBJSSAoIGIsIGMsIGQsIGEsIHhbIDFdLCBTNDQsIDB4ODU4NDVkZDEpOyAvKiA1NiAqLwogICAgYSA9IElJICggYSwgYiwgYywgZCwgeFsgOF0sIFM0MSwgMHg2ZmE4N2U0Zik7IC8qIDU3ICovCiAgICBkID0gSUkgKCBkLCBhLCBiLCBjLCB4WzE1XSwgUzQyLCAweGZlMmNlNmUwKTsgLyogNTggKi8KICAgIGMgPSBJSSAoIGMsIGQsIGEsIGIsIHhbIDZdLCBTNDMsIDB4YTMwMTQzMTQpOyAvKiA1OSAqLwogICAgYiA9IElJICggYiwgYywgZCwgYSwgeFsxM10sIFM0NCwgMHg0ZTA4MTFhMSk7IC8qIDYwICovCiAgICBhID0gSUkgKCBhLCBiLCBjLCBkLCB4WyA0XSwgUzQxLCAweGY3NTM3ZTgyKTsgLyogNjEgKi8KICAgIGQgPSBJSSAoIGQsIGEsIGIsIGMsIHhbMTFdLCBTNDIsIDB4YmQzYWYyMzUpOyAvKiA2MiAqLwogICAgYyA9IElJICggYywgZCwgYSwgYiwgeFsgMl0sIFM0MywgMHgyYWQ3ZDJiYik7IC8qIDYzICovCiAgICBiID0gSUkgKCBiLCBjLCBkLCBhLCB4WyA5XSwgUzQ0LCAweGViODZkMzkxKTsgLyogNjQgKi8KCiAgICBzdGF0ZVswXSArPWE7CiAgICBzdGF0ZVsxXSArPWI7CiAgICBzdGF0ZVsyXSArPWM7CiAgICBzdGF0ZVszXSArPWQ7CgogICAgfQoKICAgIGZ1bmN0aW9uIGluaXQoKSB7CiAgICBjb3VudFswXT1jb3VudFsxXSA9IDA7CiAgICBzdGF0ZVswXSA9IDB4Njc0NTIzMDE7CiAgICBzdGF0ZVsxXSA9IDB4ZWZjZGFiODk7CiAgICBzdGF0ZVsyXSA9IDB4OThiYWRjZmU7CiAgICBzdGF0ZVszXSA9IDB4MTAzMjU0NzY7CiAgICBmb3IgKGkgPSAwOyBpIDwgZGlnZXN0Qml0cy5sZW5ndGg7IGkrKykKICAgICAgICBkaWdlc3RCaXRzW2ldID0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoYikgewogICAgdmFyIGluZGV4LGk7CgogICAgaW5kZXggPSBhbmQoc2hyKGNvdW50WzBdLDMpICwgMHgzZik7CiAgICBpZiAoY291bnRbMF08MHhmZmZmZmZmZi03KQogICAgICBjb3VudFswXSArPSA4OwogICAgICAgIGVsc2UgewogICAgICBjb3VudFsxXSsrOwogICAgICBjb3VudFswXS09MHhmZmZmZmZmZisxOwogICAgICAgICAgY291bnRbMF0rPTg7CiAgICAgICAgfQogICAgYnVmZmVyW2luZGV4XSA9IGFuZChiLDB4ZmYpOwogICAgaWYgKGluZGV4ICA+PSA2MykgewogICAgICAgIHRyYW5zZm9ybShidWZmZXIsIDApOwogICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHsKICAgIHZhciBiaXRzID0gbmV3IGFycmF5KDgpOwogICAgdmFyICAgIHBhZGRpbmc7CiAgICB2YXIgICAgaT0wLCBpbmRleD0wLCBwYWRMZW49MDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgYml0c1tpXSA9IGFuZChzaHIoY291bnRbMF0sKGkgKiA4KSksIDB4ZmYpOwogICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICBiaXRzW2krNF09YW5kKHNocihjb3VudFsxXSwoaSAqIDgpKSwgMHhmZik7CiAgICB9CiAgICBpbmRleCA9IGFuZChzaHIoY291bnRbMF0sIDMpICwweDNmKTsKICAgIHBhZExlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgxMjAgLSBpbmRleCk7CiAgICBwYWRkaW5nID0gbmV3IGFycmF5KDY0KTsKICAgIHBhZGRpbmdbMF0gPSAweDgwOwogICAgICAgIGZvciAoaT0wO2k8cGFkTGVuO2krKykKICAgICAgdXBkYXRlKHBhZGRpbmdbaV0pOwogICAgICAgIGZvciAoaT0wO2k8ODtpKyspCiAgICAgIHVwZGF0ZShiaXRzW2ldKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewogICAgICAgIGRpZ2VzdEJpdHNbaSo0K2pdID0gYW5kKHNocihzdGF0ZVtpXSwgKGogKiA4KSkgLCAweGZmKTsKICAgICAgICB9CiAgICB9CiAgICB9CgovKiBFbmQgb2YgdGhlIE1ENSBhbGdvcml0aG0gKi8KCmZ1bmN0aW9uIGhleGEobikgewogdmFyIGhleGFfaCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKIHZhciBoZXhhX2M9IiI7CiB2YXIgaGV4YV9tPW47CiBmb3IgKGhleGFfaT0wO2hleGFfaTw4O2hleGFfaSsrKSB7CiAgIGhleGFfYz1oZXhhX2guY2hhckF0KE1hdGguYWJzKGhleGFfbSklMTYpK2hleGFfYzsKICAgaGV4YV9tPU1hdGguZmxvb3IoaGV4YV9tLzE2KTsKIH0KIHJldHVybiBoZXhhX2M7Cn0KCgp2YXIgYXNjaWk9IjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxIiArCiAgICAgICAgICAiICFcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIisKICAgICAgICAgICJbXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IjsKCmZ1bmN0aW9uIG1kNShlbnRyZWUpCnsKIHZhciBsLHMsayxrYSxrYixrYyxrZDsKCiBpbml0KCk7CiBmb3IgKGs9MDtrPGVudHJlZS5sZW5ndGg7aysrKSB7CiAgIGw9ZW50cmVlLmNoYXJBdChrKTsKICAgdXBkYXRlKGFzY2lpLmxhc3RJbmRleE9mKGwpKTsKIH0KIGZpbmlzaCgpOwoga2E9a2I9a2M9a2Q9MDsKIGZvciAoaT0wO2k8NDtpKyspIGthKz1zaGwoZGlnZXN0Qml0c1sxNS1pXSwgKGkqOCkpOwogZm9yIChpPTQ7aTw4O2krKykga2IrPXNobChkaWdlc3RCaXRzWzE1LWldLCAoKGktNCkqOCkpOwogZm9yIChpPTg7aTwxMjtpKyspIGtjKz1zaGwoZGlnZXN0Qml0c1sxNS1pXSwgKChpLTgpKjgpKTsKIGZvciAoaT0xMjtpPDE2O2krKykga2QrPXNobChkaWdlc3RCaXRzWzE1LWldLCAoKGktMTIpKjgpKTsKIHM9aGV4YShrZCkraGV4YShrYykraGV4YShrYikraGV4YShrYSk7CiByZXR1cm4gczsKfQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUQ1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoKLy8gaGVscCBmb3IgTWFzdGVyIERldmVsb3BlciB3aG8gaXMgYWxzbyBvbmx5IGEgaHVtYW4sIGFuZCBhbHNvIGEgbGl0dGxlIGJpdCBvbGQgYW5kIHNvIGNhbm5vdCByZW1lbWJlciBldmVyeXRoaW5nIDpECgovLyBjbG9zdXJlIGNhbGwgLSBiZWNhdXNlIHdlIGFyZSBpbiBmb3IgbG9vcAp2YXIgX2FyZzEgPSBhcmcxOwp2YXIgX2FyZzIgPSBhcmcyOwphZGRFdmVudChhLCAiY2xpY2siLCAoZnVuY3Rpb24oX19hcmcxLCBfX2FyZzIpIHsKICAgIHJldHVybiBmdW5jdGlvbigpe2NhbGxNZXRob2QoX19hcmcxLCBfX2FyZzIpfQp9KShfYXJnMSwgX2FyZzIpKTsKKi8KCnZhciBtdEVycm9yID0gIm10RXJyb3IiOwp2YXIgbXRXYXJuaW5nID0gIm10V2FybmluZyI7CnZhciBtdE5vdGljZSA9ICJtdE5vdGljZSI7Cgp2YXIgZXJyb3JTdGFjayA9IFtdOwppZiAoYWxsSnNMb2FkZWQgPT09IHRydWUpCnsKICAgIC8vYWxlcnQoIkVSUk9SISBsb2FkaW5nIGFsbC5qcyB0d2ljZSAtIHNlZSBpZiBub3QgbWFuaXB1bGF0aW5nIG9yIGFjY2Vzc2luZyB0b3AgSFRNTEVsZW1lbnQgaW4gSUUgLSBmb3IgZXhhbXBsZSBkdW1waW5nIGluIEF1dG9TaXplIik7CiAgICB0aHJvdygiRVJST1IhIGxvYWRpbmcgJ2Z1bmN0aW9ucy5jb3JlLmpzJyB0d2ljZSAtIHNlZSBpZiBub3QgbWFuaXB1bGF0aW5nIG9yIGFjY2Vzc2luZyB0b3AgSFRNTEVsZW1lbnQgaW4gSUUgLSBmb3IgZXhhbXBsZSBkdW1waW5nIGluIEF1dG9TaXplIik7CiAgICAvL3JldHVybjsKfQp2YXIgYWxsSnNMb2FkZWQgPSB0cnVlOwoKaWYgKCF3aW5kb3dbInN0YXJ0UHJvZmlsZXIiXSkKewogICAgLy9hbGVydCgxKTsKICAgIHdpbmRvd1siX19wcm9maWxlclN0YWNrIl0gPSBbXTsgCiAgICBmdW5jdGlvbiBzdGFydFByb2ZpbGVyKG5hbWUpCiAgICB7CiAgICAgICAgaWYgKCF3aW5kb3dbIl9fcHJvZmlsZXJTdGFjayJdKQogICAgICAgICAgICB3aW5kb3dbIl9fcHJvZmlsZXJTdGFjayJdID0gW107CiAgICAgICAgd2luZG93WyJfX3Byb2ZpbGVyU3RhY2siXS5wdXNoKHsnbmFtZSc6bmFtZSwndHlwZSc6J3N0YXJ0JywndGltZVN0YXJ0JzpuZXcgRGF0ZSgpLmdldFRpbWUoKX0pOwogICAgfQogICAgZnVuY3Rpb24gc3RvcFByb2ZpbGVyKG5hbWUpCiAgICB7CiAgICAgICAgd2luZG93WyJfX3Byb2ZpbGVyU3RhY2siXS5wdXNoKHsnbmFtZSc6bmFtZSwndHlwZSc6J2VuZCcsJ3RpbWVFbmQnOm5ldyBEYXRlKCkuZ2V0VGltZSgpfSk7CiAgICB9CiAgICBzdGFydFByb2ZpbGVyKCdoZWFkJyk7Cn0KCnZhciBfX2luaXREdW1wU3RhY2sgPSBbXTsKZnVuY3Rpb24gZHVtcCh4KQp7CiAgICBfX2luaXREdW1wU3RhY2sucHVzaCh4KTsKfQoKZnVuY3Rpb24gZHVtcEhleCh4KQp7CiAgICBfX2luaXREdW1wU3RhY2sucHVzaCh4KTsKfQoKZnVuY3Rpb24gZHVtcEZ1bmN0aW9uQ2FsbCgpCnsKICAgIHZhciBhbnRpTG9vcCA9IHt9OwogICAgZXJyb3IgPSAiIjsKICAgIAogICAgdmFyIGNhbGxlciA9IGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyOwogICAgZHVtcCgiZnVuY3Rpb25DYWxsOiIpOwogICAgd2hpbGUoY2FsbGVyKQogICAgewogICAgICAgIGR1bXAoY2FsbGVyKTsKICAgICAgICAvL2R1bXAoY2FsbGVyLmFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyKTsKICAgICAgICAKICAgICAgICBjYWxsZXIgPSBjYWxsZXIuY2FsbGVyOwogICAgfQp9CgpmdW5jdGlvbiByYW5kb20obWluLCBtYXgpIHsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOwp9Ci8qCnZhciByZXBsYWNlZEZ1bmN0aW9ucyA9IFtdOwpmdW5jdGlvbiByZXBsYWNlRnVuY3Rpb24oZnVuYywgZnVuYzIpCnsKICAgIHJlcGxhY2VkRnVuY3Rpb25zLnB1c2goeydzb3VyY2VGdW5jJzpmdW5jLCdyZXBsYWNlZEZ1bmMnOmZ1bmMyfSk7CiAgICAvL2Z1bmMgPSBmdW5jMjsKICAgIAogICAgcmV0dXJuKGZ1bmMyKTsKfQpmdW5jdGlvbiBnZXRTb3VyY2VGdW5jdGlvbihmdW5jKQp7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCByZXBsYWNlZEZ1bmN0aW9ucy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGl0ZW0gPSByZXBsYWNlZEZ1bmN0aW9uc1tpXTsKICAgICAgICBpZiAoaXRlbVsicmVwbGFjZWRGdW5jIl0gPT0gZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIF9mbmMgPSBnZXRTb3VyY2VGdW5jdGlvbihpdGVtWyJzb3VyY2VGdW5jIl0pOwogICAgICAgICAgICByZXR1cm4oX2ZuYyB8fCBpdGVtWyJzb3VyY2VGdW5jIl0pOwogICAgICAgIH0KICAgIH0KfQoqLwoKdmFyIHJlcGxhY2VkRnVuY3Rpb25zID0ge307CmZ1bmN0aW9uIHJlcGxhY2VGdW5jdGlvbihmdW5jLCBmdW5jMikKewogICAgcmVwbGFjZWRGdW5jdGlvbnNbZnVuYzJdID0gZnVuYzsKICAgIHJldHVybihmdW5jMik7Cn0KZnVuY3Rpb24gZ2V0U291cmNlRnVuY3Rpb24oZnVuYykKewogICAgcmV0dXJuKHJlcGxhY2VkRnVuY3Rpb25zW2Z1bmNdIHx8IGZ1bmMpOwp9CgpmdW5jdGlvbiBfdGhyb3coZSwgY2FsbFN0YWNrKQp7CiAgICB0aHJvdyhlKTsKfQoKZnVuY3Rpb24gX3dhcm5pbmcoZSwgY2FsbFN0YWNrKQp7CiAgICBlcnJvclN0YWNrLnB1c2goeydsYW5ndWFnZSc6J2phdmFzY3JpcHQnLCd0eXBlJzonZXJyb3InLCdkYXRhJzplLCAncGFnZSc6JycsICdsaW5lJzonJywgJ2NoYXInOicnfSk7CiAgICBpZiAod2luZG93LmdldE9iamVjdCAmJiBnZXRPYmplY3QoIk1lc3NhZ2VzRGVidWdQYW5lbCIpKQogICAgewogICAgICAgIGdldE9iamVjdCgiTWVzc2FnZXNEZWJ1Z1BhbmVsIikuc2hvd0Vycm9ycygpOwogICAgfQp9CgoKLyoKQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGl0ZW0pIAp7CiAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkKICAgICAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7Cn0KKi8KCnZhciByZXNpemVFdmVudEhvb2tFbGVtZW50cyA9IFtdOwp2YXIgcmVzaXplRXZlbnRIb29rVGltZW91dDsKdmFyIHNob3dFdmVudEhvb2tFbGVtZW50cyA9IFtdOwp2YXIgc2hvd0V2ZW50SG9va1RpbWVvdXQ7CnZhciBoaWRlRXZlbnRIb29rRWxlbWVudHMgPSBbXTsKdmFyIGhpZGVFdmVudEhvb2tUaW1lb3V0Owp2YXIgbW92ZUV2ZW50SG9va0VsZW1lbnRzID0gW107CnZhciBtb3ZlRXZlbnRIb29rVGltZW91dDsKCi8vb25jZU9ubHlFdmVudHMgPSBbXTsKdmFyIGRpID0gMDsKdmFyIF9fZ2xvYmFsRXZlbnRzID0ge307CgovLyBmaXJlZCBhbHdheXMgYmVmb3JlIGFueSBldmVudHMKZnVuY3Rpb24gYWRkR2xvYmFsRXZlbnQoZXZlbnQsIGZ1bmMpCnsKICAgIGlmICh0eXBlb2YoX19nbG9iYWxFdmVudHNbZXZlbnRdKSA9PSAidW5kZWZpbmVkIikKICAgIHsKICAgICAgICBfX2dsb2JhbEV2ZW50c1tldmVudF0gPSBbXTsKICAgICAgICAvLyBkdW1teSBldmVudAogICAgICAgIGFkZEV2ZW50KHdpbmRvdywgZXZlbnQsIGZ1bmN0aW9uKCl7cmV0dXJuKHRydWUpfSwgZmFsc2UsIGZhbHNlKTsKICAgIH0KICAgICAgICAKICAgIF9fZ2xvYmFsRXZlbnRzW2V2ZW50XS5wdXNoKGZ1bmMpOwp9CgpmdW5jdGlvbiBydW5HbG9iYWxFdmVudHMoZXZlbnQsIGUpCnsKICAgIHZhciByZXQgPSB0cnVlOwogICAgLy9kdW1wKHJldCk7CiAgICBpZiAodHlwZW9mKF9fZ2xvYmFsRXZlbnRzW2V2ZW50XSkgIT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX19nbG9iYWxFdmVudHNbZXZlbnRdLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfcmV0ID0gX19nbG9iYWxFdmVudHNbZXZlbnRdW2ldKGUpOwogICAgICAgICAgICByZXQgPSByZXQgJiYgKF9yZXQgPT09IHRydWUgfHwgX3JldCA9PT0gbnVsbCB8fCB0eXBlb2YoX3JldCkgPT0gInVuZGVmaW5lZCIgPyB0cnVlIDogZmFsc2UpOwogICAgICAgIH0KICAgIH0KICAgIC8vYWxlcnQocmV0KTsKICAgIHJldHVybihyZXQpOwp9Cgp2YXIgX19rZXlEb3duS2V5Ym9yZEluZGV4ZXMgPSBbXTsKdmFyIF9fZWxlbWVudEV2ZW50cyA9IHt9OyAvLyBkdWUgdG8gSUU4IHdlIGNhbm5vdCB1c2UgZWxlbS5fZXZlbnRzIC0gdGhlIGFycmF5IGlzIGJlaW5nIGV4cG9ydGVkIGFzIHN0cmluZyBhdHRyaWJ1dGUKdmFyIF9fZXZlbnRJZHMgPSAwOwp2YXIgX19sYXN0Q2xpY2tFdmVudCA9IG51bGw7CnZhciBfX2RibENsaWNrVGltZW91dCA9IDUwMDsKZnVuY3Rpb24gYWRkRXZlbnQoZWxlbSwgZXZlbnQsIGZ1bmMsIG9uY2VPbmx5LCBjYWxsR2xvYmFsRXZlbnRzKQp7CiAgICBpZiAodHlwZW9mKGNhbGxHbG9iYWxFdmVudHMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGNhbGxHbG9iYWxFdmVudHMgPSB0cnVlOwogICAgCiAgICAvL2lmIChldmVudCA9PSAic2Nyb2xsIikKICAgIC8vewogICAgLy8gICAgZHVtcChlbGVtKTsKICAgIC8vICAgIGR1bXAoZnVuYyk7CiAgICAvL30KICAgIAogICAgLy9pZiAoZXZlbnQgIT0gInJlc2l6ZSIgJiYgZXZlbnQgIT0gImxvYWQiICYmIGV2ZW50ICE9ICJjbGljayIgJiYgZXZlbnQgIT0gIm1vdXNlZG93biIpCiAgICAgLy8gICByZXR1cm47CiAgICAKICAgIC8vIHNwYXRuZSBzZSB0byBsYWRpISEhIGFsZSBvZGNoeXRuZSBjaHlidQogICAgLyoKICAgIHZhciBfX2Z1bmMgPSBmdW5jOwogICAgZnVuYyA9IHJlcGxhY2VGdW5jdGlvbihmdW5jLCBmdW5jdGlvbihlKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgLy9pZiAoZXZlbnQgPT0gImNsaWNrIikKICAgICAgICAgICAgLy8gICAgZHVtcChnZXRTb3VyY2VGdW5jdGlvbihfX2Z1bmMpKTsKICAgICAgICAgICAgX19mdW5jKGUpOwogICAgICAgIH0KICAgICAgICBjYXRjaChfX1gpCiAgICAgICAgewogICAgICAgICAgICBfdGhyb3coX19YLCBlKTsKICAgICAgICB9CiAgICB9KTsKICAgICovCiAgICAKICAgIAogICAgLy9hbGVydChmdW5jKTsKICAgIC8vaWYgKGV2ZW50ID09ICJjbGljayIpCiAgICAvLyAgICByZXR1cm47CiAgICAvKgogICAgaWYgKGV2ZW50ID09ICJsb2FkIikKICAgIHsKICAgICAgICBhbGVydChlbGVtKTsKICAgICAgICBhbGVydChmdW5jKTsKICAgICAgICBkaSsrOwogICAgICAgIGlmIChkaSA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICovCiAgICAvL2FsZXJ0KGV2ZW50KTsKICAgIC8vcmV0dXJuOwogICAgLy9hbGVydChlbGVtKTsKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gInN0cmluZyIpCiAgICAgICAgZWxlbSA9IGdldEVsZW1lbnQoZWxlbSk7CiAgICAgICAgCiAgICAvL2R1bXAoZWxlbSk7CiAgICBpZiAoIWVsZW0pCiAgICB7CiAgICAgICAgX3Rocm93KCdhZGRFdmVudCgpOiBlbGVtIGlzIG51bGwnKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gIm9iamVjdCIgJiYgZWxlbS5USElTKQogICAgICAgIHJldHVybihlbGVtLmFkZEV2ZW50KGV2ZW50LCBmdW5jLCBvbmNlT25seSkpOwoKICAgIGlmICh0eXBlb2Yob25jZU9ubHkpID09ICJ1bmRlZmluZWQiKQogICAgICAgIG9uY2VPbmx5ID0gZmFsc2U7CgogICAgaWYgKG9uY2VPbmx5KQogICAgewogICAgICAgIGlmICghZWxlbS5vbmNlT25seUV2ZW50cykKICAgICAgICAgICAgZWxlbS5vbmNlT25seUV2ZW50cyA9IFtdOwogICAgICAgICAgICAKICAgICAgICB2YXIgaGFzaCA9IGZ1bmMudG9TdHJpbmcoKTsKICAgICAgICBpZiAoaW5fYXJyYXkoaGFzaCwgZWxlbS5vbmNlT25seUV2ZW50cykpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVsZW0ub25jZU9ubHlFdmVudHMucHVzaChoYXNoKTsKICAgIH0KICAgIGlmICghZWxlbSkKICAgICAgICB0aHJvdygiYWRkRXZlbnQoIitlbGVtKyIsJyIrZXZlbnQrIicsIitmdW5jKyIpOiBlbGVtIG5vdCBmb3VuZCIpOwoKICAgIGlmIChlbGVtLmNsYXNzTmFtZSAmJiBlbGVtLmluaGVyaXRzKSAvLyBWaXN1YWxQSFAgb2JqZWN0CiAgICB7CiAgICAgICAgcmV0dXJuKGVsZW0uYWRkRXZlbnQoZXZlbnQsIGZ1bmMpKTsKICAgIH0KICAgIAogICAgaWYgKCFlbGVtLl9ldmVudElkKQogICAgewogICAgICAgIF9fZXZlbnRJZHMrKzsKICAgICAgICBlbGVtLl9ldmVudElkID0gX19ldmVudElkczsKICAgIH0KICAgIAogICAgaWYgKCFfX2VsZW1lbnRFdmVudHNbZWxlbS5fZXZlbnRJZF0pCiAgICAgICAgX19lbGVtZW50RXZlbnRzW2VsZW0uX2V2ZW50SWRdID0gW107CiAgICAKICAgIHZhciBfZXZlbnQgPSB7J25hbWUnOmV2ZW50LCAnZnVuY3Rpb24nOmZ1bmN9OwogICAgCgogICAgLy8gY2hlY2sgaWYgbm90IGluc2lkZSBpZnJhbWUKICAgIHZhciBfZWxlbSA9IGVsZW07CiAgICB3aGlsZShfZWxlbSkKICAgIHsKICAgICAgICBpZiAoX2VsZW0udGFnTmFtZSAmJiBfZWxlbS50YWdOYW1lID09ICJJRlJBTUUiKQogICAgICAgIHsKICAgICAgICAgICAgX2V2ZW50WyJpZnJhbWUiXSA9IF9lbGVtOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgX2VsZW0gPSBfZWxlbS5wYXJlbnROb2RlOwogICAgfSAKICAgIC8vaWYgKF9ldmVudFsiaWZyYW1lIl0pCiAgICAgICAgLy9hbGVydChfZXZlbnRbImlmcmFtZSJdKTsKICAgIAogICAgLy9pZiAoZWxlbS5fZXZlbnRzKQogICAgLy97CiAgICAgICAgX19lbGVtZW50RXZlbnRzW2VsZW0uX2V2ZW50SWRdLnB1c2goX2V2ZW50KTsKICAgICAgICAvL2VsZW0uX2V2ZW50cy5wdXNoKF9ldmVudCk7CiAgICAvL30KICAgIAogICAgaWYgKGlzVG91Y2hEZXZpY2UoKSkKICAgIHsKICAgICAgICB2YXIgdG91Y2hSZXBsYWNlbWVudHMgPSB7J21vdXNlZG93bic6J3RvdWNoc3RhcnQnLCdtb3VzZXVwJzondG91Y2hlbmQnLCdtb3VzZW1vdmUnOid0b3VjaG1vdmUnfTsKICAgICAgICAKICAgICAgICAvLyBvbiBzb21lIGRldmljZXMgdGhlcmUgYXJlIGJvdGgsIHRvdWNoIHNjcmVlbiBhbmQgYXZhaWxhYmlsaXR5IG9mIHVzaW5nIG1vdXNlIC0gc28gZG8gbm90IHJlcGxhY2UsIGJ1dCBkdXBsaWNhdGUKICAgICAgICB2YXIgZXZlbnQyID0gdG91Y2hSZXBsYWNlbWVudHNbZXZlbnRdOwogICAgICAgIGlmIChldmVudDIpCiAgICAgICAgewogICAgICAgICAgICBhZGRFdmVudChlbGVtLCBldmVudDIsIGZ1bmMsIG9uY2VPbmx5LCBjYWxsR2xvYmFsRXZlbnRzKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICBmb3IgKHZhciBpIGluIHRvdWNoUmVwbGFjZW1lbnRzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGkgPT0gZXZlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGV2ZW50ID0gdG91Y2hSZXBsYWNlbWVudHNbaV07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAqLwogICAgfQoKICAgIC8qCiAgICBpZiAoZXZlbnQgPT0gImxvYWQiICYmIEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiKQogICAgewogICAgICAgIHZhciBfZnVuYyA9IGZ1bmM7CiAgICAgICAgdmFyIF9lbGVtID0gZWxlbTsKICAgICAgICBpZiAoZWxlbS50YWdOYW1lICYmIGVsZW0udGFnTmFtZSA9PSAiSUZSQU1FIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIElFIGlzIGlkaW90IGFuZCBjYWxscyBvbkxvYWQgZm9yIGVtcHR5IHBhZ2UKICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChfZWxlbS5nZXRBdHRyaWJ1dGUoInNyYyIpICE9ICIiICYmIF9lbGVtLmdldEF0dHJpYnV0ZSgic3JjIikgIT0gImFib3V0OmJsYW5rIikKICAgICAgICAgICAgICAgICAgICBfZnVuYyhlKTsKICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0KICAgICovCgogICAgaWYgKGV2ZW50ID09ICJkb3VibGVjbGljayIpCiAgICAgICAgZXZlbnQgPSAiZGJsY2xpY2siOwoKICAgIGZ1bmN0aW9uIHJlc2l6ZVRpbWVySG9vayhlbGVtLCBmdW5jKQogICAgewogICAgICAgIC8vIGpkZSBvIGJlcmxpY2t1LCBtdXNpIGJ5dCBuZWpha3kgZHV2b2QsIHByb2Mgc2UgdGFtIG1vaG90YSArLSAxcHggbmVibyB2aWNlLCBhbGUgbmVsaXRhIHRvIGphayBnYW1lc2EKICAgICAgICB2YXIgbG9vcExpbWl0ID0gMTA7CiAgICAgICAgdmFyIGxvb3BUaW1lb3V0ID0gMzA7IAogICAgICAgIAogICAgICAgIGNsZWFyVGltZW91dChyZXNpemVFdmVudEhvb2tUaW1lb3V0KTsKICAgICAgICAvL3JldHVybjsKICAgICAgICBpZiAoZWxlbSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIG5hIHprb3Vza3UgdG9sZXJhbmNlIDNweAogICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50cy5wdXNoKHsnb2JqZWN0JzplbGVtLCAnd2lkdGgnOmVsZW0ub2Zmc2V0V2lkdGgsICdoZWlnaHQnOmVsZW0ub2Zmc2V0SGVpZ2h0LCAnc2Nyb2xsV2lkdGgnOmVsZW0uc2Nyb2xsV2lkdGgsICdzY3JvbGxIZWlnaHQnOmVsZW0uc2Nyb2xsSGVpZ2h0LCAnZnVuY3Rpb24nOmZ1bmMsICd0b2xlcmFuY2UnOjAsICd3aWR0aExvb3AnOltdLCAnaGVpZ2h0TG9vcCc6W10sICdsb29wTGFzdFRpbWUnOnRpbWUoKX0pOyAgLy8gdG9sZXJhbmNlIGZvciBzY3JlZW5zIHdpdGggMTI1JSB6b29tIGZvciB0b28gaGlnaHQgcmVzb2x1dGlvbnMgLSBUT0RPIC0gbGVhcm4gYW5kIGlmIHR3aWNlIGRpZmZlcmVuY2Ugb25seSAxcHggdXAgYW5kIGRvd24sIHNldCB0b2xlcmFuY2UgdG8gb2JqZWN0CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7ICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10ub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbFdpZHRoID0gcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLnNjcm9sbFdpZHRoOwogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxIZWlnaHQgPSByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10uc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3dpZHRoJ10gLSB3aWR0aCkgPiByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsndG9sZXJhbmNlJ10gfHwgCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHQnXSAtIGhlaWdodCkgPiByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsndG9sZXJhbmNlJ10gfHwgCiAgICAgICAgICAgICAgICAgICAgICAgICgocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLnN0eWxlICYmIChnZXRTdHlsZShyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10sICJvdmVyZmxvdyIpID09ICJhdXRvIiB8fCBnZXRTdHlsZShyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10sICJvdmVyZmxvd1giKSA9PSAiYXV0byIgfHwgZ2V0U3R5bGUocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLCAib3ZlcmZsb3dZIikgPT0gImF1dG8iKSkgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnc2Nyb2xsV2lkdGgnXSAtIHNjcm9sbFdpZHRoKSA+IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd0b2xlcmFuY2UnXSB8fCAKICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3Njcm9sbEhlaWdodCddIC0gc2Nyb2xsSGVpZ2h0KSA+IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd0b2xlcmFuY2UnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIGlmIChyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnd2lkdGgnXSAhPSByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10ub2Zmc2V0V2lkdGggfHwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHQnXSAhPSByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10ub2Zmc2V0SGVpZ2h0IHx8IAogICAgICAgICAgICAgICAgICAgICAgICAoKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5zdHlsZSAmJiAoZ2V0U3R5bGUocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLCAib3ZlcmZsb3ciKSA9PSAiYXV0byIgfHwgZ2V0U3R5bGUocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLCAib3ZlcmZsb3dYIikgPT0gImF1dG8iIHx8IGdldFN0eWxlKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSwgIm92ZXJmbG93WSIpID09ICJhdXRvIikpICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3Njcm9sbFdpZHRoJ10gIT0gcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLnNjcm9sbFdpZHRoIHx8IAogICAgICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnc2Nyb2xsSGVpZ2h0J10gIT0gcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLnNjcm9sbEhlaWdodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIGlmIChyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnd2lkdGgnXSAhPSByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10ub2Zmc2V0V2lkdGggfHwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHQnXSAhPSByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10ub2Zmc2V0SGVpZ2h0IHx8IAogICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvdmVyZmxvdyddICE9IGdldFN0eWxlKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSwgIm92ZXJmbG93IikgfHwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydzY3JvbGxXaWR0aCddICE9IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5zY3JvbGxXaWR0aCB8fCAKICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3Njcm9sbEhlaWdodCddICE9IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5zY3JvbGxIZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoTG9vcEZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHRMb29wRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnbG9vcExhc3RUaW1lJ10rbG9vcFRpbWVvdXQgPCB0aW1lKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3dpZHRoTG9vcCddLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3dpZHRoTG9vcCddLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHRMb29wJ10ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnaGVpZ2h0TG9vcCddLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnbG9vcExhc3RUaW1lJ10gPSB0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnd2lkdGhMb29wJ10ubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHRMb29wJ10ubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnd2lkdGhMb29wJ10ubGVuZ3RoICYmIGlpIDwgbG9vcExpbWl0IDsgaWkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd3aWR0aExvb3AnXVtpaV0gPT0gd2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhMb29wRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHRMb29wJ10ubGVuZ3RoICYmIGlpIDwgbG9vcExpbWl0IDsgaWkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHRMb29wJ11baWldID09IHdpZHRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodExvb3BGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd3aWR0aExvb3AnXS5wdXNoKHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ2hlaWdodExvb3AnXS5wdXNoKGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3dpZHRoTG9vcCddLmxlbmd0aCA+IGxvb3BMaW1pdCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3dpZHRoTG9vcCddLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHRMb29wJ10ubGVuZ3RoID4gbG9vcExpbWl0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnaGVpZ2h0TG9vcCddLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd3aWR0aCddID0gd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydoZWlnaHQnXSA9IGhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3Njcm9sbFdpZHRoJ10gPSBzY3JvbGxXaWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplRXZlbnRIb29rRWxlbWVudHNbaV1bJ3Njcm9sbEhlaWdodCddID0gc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aExvb3BGb3VuZCAmJiAhaGVpZ2h0TG9vcEZvdW5kKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnZnVuY3Rpb24nXShyZXNpemVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlc2l6ZUV2ZW50SG9va1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmVzaXplVGltZXJIb29rKCk7fSwgMTAwKTsKICAgICAgICAvL3Jlc2l6ZUV2ZW50SG9va1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmVzaXplVGltZXJIb29rKCk7fSwgMjAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBtb3ZlVGltZXJIb29rKGVsZW0sIGZ1bmMpCiAgICB7CiAgICAgICAgY2xlYXJUaW1lb3V0KG1vdmVFdmVudEhvb2tUaW1lb3V0KTsKICAgICAgICBpZiAoZWxlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwb3MgPSBnZXRXaW5kb3dQb3NpdGlvbihlbGVtKTsKICAgICAgICAgICAgbW92ZUV2ZW50SG9va0VsZW1lbnRzLnB1c2goeydvYmplY3QnOmVsZW0sICd4Jzpwb3NbIngiXSwgJ3knOnBvc1sieSJdLCAnZnVuY3Rpb24nOmZ1bmN9KTsKICAgICAgICAgICAgLy9tb3ZlRXZlbnRIb29rRWxlbWVudHMucHVzaCh7J29iamVjdCc6ZWxlbSwgJ3gnOmVsZW0ub2Zmc2V0TGVmdCwgJ3knOmVsZW0ub2Zmc2V0VG9wLCAnZnVuY3Rpb24nOmZ1bmN9KTsKICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbW92ZUV2ZW50SG9va0VsZW1lbnRzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChtb3ZlRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcG9zID0gZ2V0V2luZG93UG9zaXRpb24obW92ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSk7CiAgICAgICAgICAgICAgICBpZiAobW92ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd4J10gIT0gcG9zWyJ4Il0gfHwgCiAgICAgICAgICAgICAgICAgICAgbW92ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd5J10gIT0gcG9zWyJ5Il0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW92ZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd4J10gPSBwb3NbIngiXTsKICAgICAgICAgICAgICAgICAgICBtb3ZlRXZlbnRIb29rRWxlbWVudHNbaV1bJ3knXSA9IHBvc1sieSJdOwogICAgICAgICAgICAgICAgICAgIC8vbW92ZUV2ZW50SG9va0VsZW1lbnRzW2ldWydmdW5jdGlvbiddKG1vdmVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcChtb3ZlRXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddKTsKICAgICAgICAgICAgICAgICAgICAvL3JldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBtb3ZlRXZlbnRIb29rVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXttb3ZlVGltZXJIb29rKCk7fSwgMTAwKTsKICAgIH0KICAgIAogICAgCiAgICBmdW5jdGlvbiBzaG93VGltZXJIb29rKGVsZW0sIGZ1bmMpCiAgICB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHNob3dFdmVudEhvb2tUaW1lb3V0KTsKICAgICAgICBpZiAoZWxlbSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChlbGVtZW50VmlzaWJsZShlbGVtKSk7CiAgICAgICAgICAgIHNob3dFdmVudEhvb2tFbGVtZW50cy5wdXNoKHsnb2JqZWN0JzplbGVtLCAndmlzaWJsZSc6ZWxlbWVudFZpc2libGUoZWxlbSksICdmdW5jdGlvbic6ZnVuYywgJ2ZpcnN0Jzp0cnVlfSk7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHNob3dFdmVudEhvb2tFbGVtZW50cy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAodGltZSgpLCB0cnVlKTsKICAgICAgICAgICAgLy9kdW1wKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10sIHRydWUpOwogICAgICAgICAgICAvL2R1bXAoZWxlbWVudFZpc2libGUoc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSkpOwogICAgICAgICAgICBpZiAoc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKCJzaG93Iik7CiAgICAgICAgICAgICAgICAvL2R1bXAoc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmxlJ10pOwogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW1lbnRWaXNpYmxlKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pKTsKICAgICAgICAgICAgICAgIHZhciB2aXNpYmxlID0gZWxlbWVudFZpc2libGUoc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSk7CiAgICAgICAgICAgICAgICAvL2R1bXAodmlzaWJsZSk7CiAgICAgICAgICAgICAgICBpZiAoKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnZmlyc3QnXSB8fCAhc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmxlJ10pICYmIHZpc2libGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydmaXJzdCddID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydmdW5jdGlvbiddKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmxlJ10gPSB2aXNpYmxlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNob3dFdmVudEhvb2tUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe3Nob3dUaW1lckhvb2soKTt9LCA1MDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVUaW1lckhvb2soZWxlbSwgZnVuYykKICAgIHsKICAgICAgICBjbGVhclRpbWVvdXQoaGlkZUV2ZW50SG9va1RpbWVvdXQpOwogICAgICAgIGlmIChlbGVtKQogICAgICAgIHsKICAgICAgICAgICAgaGlkZUV2ZW50SG9va0VsZW1lbnRzLnB1c2goeydvYmplY3QnOmVsZW0sICd2aXNpYmxlJzplbGVtZW50VmlzaWJsZShlbGVtLCB0cnVlKSwgJ2Z1bmN0aW9uJzpmdW5jfSk7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGhpZGVFdmVudEhvb2tFbGVtZW50cy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoaGlkZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKCJoaWRlIik7CiAgICAgICAgICAgICAgICAvL2R1bXAoaGlkZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmxlJ10pOwogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW1lbnRWaXNpYmxlKGhpZGVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pKTsKICAgICAgICAgICAgICAgIHZhciB2aXNpYmxlID0gZWxlbWVudFZpc2libGUoaGlkZUV2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoaGlkZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmxlJ10gJiYgIXZpc2libGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJ5Iik7CiAgICAgICAgICAgICAgICAgICAgaGlkZUV2ZW50SG9va0VsZW1lbnRzW2ldWydmdW5jdGlvbiddKGhpZGVFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGlkZUV2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmxlJ10gPSB2aXNpYmxlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGhpZGVFdmVudEhvb2tUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe2hpZGVUaW1lckhvb2soKTt9LCA1MDApOwogICAgfQoKICAgIAogICAgLyoKICAgIGZ1bmN0aW9uIHNob3dUaW1lckhvb2soZWxlbSwgZnVuYykKICAgIHsKICAgICAgICBjbGVhclRpbWVvdXQoc2hvd0V2ZW50SG9va1RpbWVvdXQpOwogICAgICAgIGlmIChlbGVtKQogICAgICAgIHsKICAgICAgICAgICAgc2hvd0V2ZW50SG9va0VsZW1lbnRzLnB1c2goeydvYmplY3QnOmVsZW0sICdkaXNwbGF5JzplbGVtLnN0eWxlLmRpc3BsYXksICd2aXNpYmlsaXR5JzplbGVtLnN0eWxlLnZpc2liaWxpdHksICdmdW5jdGlvbic6ZnVuY30pOwogICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBzaG93RXZlbnRIb29rRWxlbWVudHMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzaG93RXZlbnRIb29rRWxlbWVudHNbaV1bJ2Rpc3BsYXknXSAhPSBzaG93RXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLnN0eWxlLmRpc3BsYXkgJiYgc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5zdHlsZS5kaXNwbGF5ICE9ICJub25lIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXZlbnRIb29rRWxlbWVudHNbaV1bJ2Z1bmN0aW9uJ10oc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXSk7CiAgICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydkaXNwbGF5J10gPSBzaG93RXZlbnRIb29rRWxlbWVudHNbaV1bJ29iamVjdCddLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWyd2aXNpYmlsaXR5J10gIT0gc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5zdHlsZS52aXNpYmlsaXR5ICYmIHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10uc3R5bGUudmlzaWJpbGl0eSA9PSAidmlzaWJsZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydmdW5jdGlvbiddKHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsnb2JqZWN0J10pOwogICAgICAgICAgICAgICAgICAgIHNob3dFdmVudEhvb2tFbGVtZW50c1tpXVsndmlzaWJpbGl0eSddID0gc2hvd0V2ZW50SG9va0VsZW1lbnRzW2ldWydvYmplY3QnXS5zdHlsZS52aXNpYmlsaXR5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNob3dFdmVudEhvb2tUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe3Nob3dUaW1lckhvb2soKTt9LCAxMDApOwogICAgfQogICAgKi8KCiAgICAvKgogICAgZnVuY3Rpb24gYXR0cmlidXRlQ2hhbmdlSG9vayhlKQogICAgewogICAgfQogICAgKi8KICAgICAgICAKICAgIGlmIChldmVudCA9PSAibW91c2Vtb3ZlIiB8fCBldmVudCA9PSAibW91c2V1cCIgfHwgZXZlbnQgPT0gIm1vdXNlZG93biIgfHwgZXZlbnQgPT0gImtleWRvd24iIHx8IGV2ZW50ID09ICJrZXl1cCIgfHwgZXZlbnQgPT0gImtleXByZXNzIiB8fCBldmVudCA9PSAiY2xpY2siKQogICAgewogICAgICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBlbGVtID09IHdpbmRvdykKICAgICAgICAgICAgZWxlbSA9IGRvY3VtZW50OyAvLyBJRSAKICAgIH0KICAgIGlmIChldmVudCA9PSAicmVzaXplIikKICAgIHsKICAgICAgICBpZiAoLyplbGVtICE9IGRvY3VtZW50LmJvZHkgJiYgKi8gZWxlbSAhPSBkb2N1bWVudCAmJiBlbGVtICE9IHdpbmRvdykgLy8gbm9uIElFIHN1cHBvcnQgb25seSBib2R5LCBmcmFtZXNldCwgZG9jdW1lbnQgYW5kIHdpbmRvdywgbmVlZCB0byBzaW11bGF0ZSBpdAogICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgdmFyIF9lbGVtID0gZWxlbTsKICAgICAgICAgICAgdmFyIF9mdW5jID0gZnVuYzsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe3Jlc2l6ZVRpbWVySG9vayhfZWxlbSwgX2Z1bmMpfSwgMTAwKTsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgdHJ5IAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNpemVUaW1lckhvb2soZWxlbSwgZnVuYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZXZlbnQgPT0gInNob3ciKQogICAgewogICAgICAgIC8vIG93biBWaXN1YWxQSFAgZXZlbnQKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2hvd1RpbWVySG9vayhlbGVtLCBmdW5jKX0sIDUwMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGV2ZW50ID09ICJoaWRlIikKICAgIHsKICAgICAgICAvLyBvd24gVmlzdWFsUEhQIGV2ZW50CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe2hpZGVUaW1lckhvb2soZWxlbSwgZnVuYyl9LCA1MDApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChldmVudCA9PSAibW92ZSIpCiAgICB7CiAgICAgICAgLy8gb3duIFZpc3VhbFBIUCBldmVudAogICAgICAgIG1vdmVUaW1lckhvb2soZWxlbSwgZnVuYyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGV2ZW50ID09ICJzY3JvbGx0byIpCiAgICB7CiAgICAgICAgLy8gb3duIFZpc3VhbFBIUCBldmVudAogICAgICAgIHNjcm9sbFRvVGltZXJIb29rKGVsZW0sIGZ1bmMpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgaWYgKGV2ZW50ID09ICJjaGFuZ2UiICYmIHdpbmRvdy5Db21wb25lbnRWYWx1ZVJlbWVtYmVyKQogICAgewogICAgICAgIC8vZHVtcCgiISIpOwogICAgICAgIC8vaWYgKGUpCiAgICAgICAgLy8gICAgZHVtcChlKTsKICAgIH0KICAgICovCiAgICAKICAgIAogICAgCiAgICAvKgogICAgaWYgKGV2ZW50LmluZGV4T2YoIkRPTSIpID4gLTEgJiYgdHlwZW9mKE11dGF0aW9uRXZlbnQpID09ICJ1bmRlZmluZWQiKQogICAgewogICAgfQogICAgKi8KICAgIC8qCiAgICBpZiAoZXZlbnQgPT0gImF0dHJpYnV0ZUNoYW5nZSIpCiAgICB7CiAgICAgICAgLy9hbGVydChlbGVtKTsKICAgICAgICBhZGRFdmVudChkb2N1bWVudCwgIkRPTVN1YnRyZWVNb2RpZmllZCIsIGZ1bmN0aW9uKGUpe2F0dHJpYnV0ZUNoYW5nZUhvb2soZSl9KTsKICAgIH0KICAgIGlmIChldmVudCA9PSAiRE9NU3VidHJlZUF0dHJpYnV0ZU1vZGlmaWVkIikKICAgIHsKICAgICAgICAvL2FsZXJ0KGVsZW0pOwogICAgICAgIGFkZEV2ZW50KGVsZW0sICJET01TdWJ0cmVlTW9kaWZpZWQiLCBmdW5jdGlvbihlKXthdHRyaWJ1dGVDaGFuZ2VIb29rKGUpfSk7CiAgICB9CiAgICAqLwogICAgCiAgICB2YXIgZnVuYzIgPSBmdW5jOwogICAgLy9hbGVydChldmVudCArICIgIiArIGV2ZW50LmluZGV4T2YoIm1vdXNlIikpOwogICAgLy8gdG91Y2ggZGV2aWNlcyBkbyBub3QgZmlyZSBvbiB0b3VjaG1vdmUgYXMgbW91c2UKICAgIC8vaWYgKGV2ZW50LmluZGV4T2YoIm1vdXNlIikgPT0gMCAmJiBldmVudCAhPSAibW91c2Vtb3ZlIiB8fCBldmVudC5pbmRleE9mKCJ0b3VjaCIpID09IDAgJiYgZXZlbnQgIT0gInRvdWNobW92ZSIpCiAgICBpZiAoZXZlbnQgPT0gImtleWRvd24iIHx8IGV2ZW50ID09ICJrZXl1cCIpCiAgICB7CiAgICAgICAgdmFyIF9fa2V5RG93bktleWJvcmRJbmRleCA9IF9fa2V5RG93bktleWJvcmRJbmRleGVzLmxlbmd0aDsKICAgICAgICBfX2tleURvd25LZXlib3JkSW5kZXhlc1tfX2tleURvd25LZXlib3JkSW5kZXhlcy5sZW5ndGhdID0gLTE7IC8vS2V5Ym9hcmQuY2hhbmdlSW5kZXg7CiAgICAgICAgZnVuYzIgPSBmdW5jdGlvbihlKXsKICAgICAgICAgICAgLy9kdW1wKF9fa2V5RG93bktleWJvcmRJbmRleGVzKTsKICAgICAgICAgICAgLy9kdW1wKF9fa2V5RG93bktleWJvcmRJbmRleCk7CiAgICAgICAgICAgIC8vZHVtcChLZXlib2FyZC5jaGFuZ2VJbmRleCk7CiAgICAgICAgICAgIHZhciBjYWxsID0gKF9fa2V5RG93bktleWJvcmRJbmRleGVzW19fa2V5RG93bktleWJvcmRJbmRleF0gIT0gS2V5Ym9hcmQuY2hhbmdlSW5kZXgpOyAKICAgICAgICAgICAgX19rZXlEb3duS2V5Ym9yZEluZGV4ZXNbX19rZXlEb3duS2V5Ym9yZEluZGV4XSA9IEtleWJvYXJkLmNoYW5nZUluZGV4OyAKICAgICAgICAgICAgLy92YXIgY2FsbCA9IHRydWU7CiAgICAgICAgICAgIGlmIChjYWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmdW5jKGUpCiAgICAgICAgICAgIH07IAogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgZWxzZSBpZiAoLypldmVudC5pbmRleE9mKCJtb3VzZSIpID09IDAgfHwgKi9ldmVudC5pbmRleE9mKCJ0b3VjaCIpID09IDApCiAgICB7CiAgICAgICAgZnVuYzIgPSBmdW5jdGlvbihlKXtNb3VzZS5vbk1vdXNlTW92ZShlKTsgZnVuYyhlKTt9OwogICAgfQogICAgZWxzZSBpZiAoZXZlbnQgPT0gInNjcm9sbCIpCiAgICB7CiAgICAgICAgZWxlbS5fX2xhc3RTY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsWChlbGVtKTsKICAgICAgICBlbGVtLl9fbGFzdFNjcm9sbFRvcCA9IGdldFNjcm9sbFkoZWxlbSk7CiAgICAgICAgdmFyIF9lbGVtID0gZWxlbTsKICAgICAgICBmdW5jMiA9IGZ1bmN0aW9uKGUpewogICAgICAgICAgICBlID0gZ2V0TW91c2VFdmVudChlKTsKICAgICAgICAgICAgZS5kZWx0YVggPSBnZXRTY3JvbGxYKF9lbGVtKS1fZWxlbS5fX2xhc3RTY3JvbGxMZWZ0OwogICAgICAgICAgICBlLmRlbHRhWSA9IGdldFNjcm9sbFkoX2VsZW0pLV9lbGVtLl9fbGFzdFNjcm9sbFRvcDsKICAgICAgICAgICAgCiAgICAgICAgICAgIF9lbGVtLl9fbGFzdFNjcm9sbExlZnQgPSBnZXRTY3JvbGxYKF9lbGVtKTsKICAgICAgICAgICAgX2VsZW0uX19sYXN0U2Nyb2xsVG9wID0gZ2V0U2Nyb2xsWShfZWxlbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZS5kZWx0YVggPT0gMCkKICAgICAgICAgICAgICAgIGUuZGVsdGFYID0gZWxlbS5fX2xhc3REZWx0YVg7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVsZW0uX19sYXN0RGVsdGFYID0gZS5kZWx0YVg7CgogICAgICAgICAgICBpZiAoZS5kZWx0YVkgPT0gMCkKICAgICAgICAgICAgICAgIGUuZGVsdGFZID0gZWxlbS5fX2xhc3REZWx0YVk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVsZW0uX19sYXN0RGVsdGFZID0gZS5kZWx0YVk7CgogICAgICAgICAgICBmdW5jKGUpOwogICAgICAgIH07CiAgICB9CiAgICBlbHNlIGlmIChldmVudCA9PSAiY2xpY2siKQogICAgewogICAgICAgIC8vIG5lZnVuZ3VqZSBwYWsga2xpa2FuaSBuYSBjaGVja2JveAogICAgICAgIC8vZnVuYzIgPSBmdW5jdGlvbihlKXtpZiAocnVuR2xvYmFsRXZlbnRzKCJjbGljayIsIGUpKSB7IHJldHVybihmdW5jKGUpKTt9IGVsc2Uge2Uuc3RvcCgpOyByZXR1cm4gZmFsc2U7fX07CiAgICAgICAgLy9ldmVudCA9ICJtb3VzZWRvd24iOwoKICAgICAgICBmdW5jMiA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZSA9IGdldE1vdXNlRXZlbnQoZSk7CgogICAgICAgICAgICAvLyBCVUcgRklYIC0gcG9rdWQgamUgdGV4dGFyZWEgbmVibyBpbnB1dCB2IGRpdnUgcyBkcmFnZ2FibGUsIHBhayBuZWpkZSBrbGlrbm91dCBhIG96bmFjaXQgdGV4dCAtIHN0YWNpIHprdXNpdDogPGRpdiBkcmFnZ2FibGU9J3RydWUnPjx0ZXh0YXJlYSBkcmFnZ2FibGU9J2ZhbHNlJz4xMjM0NTwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlPWdldEV2ZW50KGUpOyAKICAgICAgICAgICAgICAgIHZhciBlbGVtPWUudGFyZ2V0OyAKICAgICAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgJiYgKGVsZW0udGFnTmFtZSA9PSAiSU5QVVQiICYmIGVsZW0udHlwZSA9PSAidGV4dCIgfHwgZWxlbS50YWdOYW1lID09ICJURVhUQVJFQSIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHdoaWxlKGVsZW0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtLl9kcmFnZ2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmRyYWdnYWJsZT10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtPWVsZW0ucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZ1bmMoZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHRyeSB0byBvbW1pdCBkb3VibGUgY2xpY2sgZXZlbnQgb24gb25EYmxDbGljawogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIV9fbGFzdENsaWNrVGFyZ2V0KQogICAgICAgICAgICAgICAgX19sYXN0Q2xpY2tUYXJnZXQgPSBlLnRhcmdldDsKICAgICAgICAgICAgaWYgKCFfX2xhc3RDbGlja1RhcmdldC5fX2xhc3RDbGlja1RpbWUpCiAgICAgICAgICAgICAgICBfX2xhc3RDbGlja1RhcmdldC5fX2xhc3RDbGlja1RpbWUgPSBtaWNyb3RpbWUoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIS5fX2xhc3RDbGlja1RpbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuX19sYXN0Q2xpY2tUaW1lID0gbWljcm90aW1lKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChfX2xhc3RDbGlja0V2ZW50ICYmIF9fbGFzdENsaWNrRXZlbnQuX19sYXN0Q2xpY2tUaW1lK19fZGJsQ2xpY2tUaW1lb3V0ID4gbWljcm90aW1lKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZHVtcCgnZGJsY2xpY2sgcHJldmVudCcpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfX2xhc3RDbGlja0V2ZW50ID0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFjYWxsR2xvYmFsRXZlbnRzIHx8IHJ1bkdsb2JhbEV2ZW50cygiY2xpY2siLCBlKSkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlLmJ1dHRvbktleUNvZGUgPT0gVktfTEJVVFRPTikgCiAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgIC8vIG9tbWl0IGRvdWJsZWNsaWNrCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRydWUgfHwgZG9jdW1lbnQuYWxsKSAvLyBFeHBsb3JlciBhbmQgQ2hyb21lIGZpcmVzIG9uY2xpY2sgYWZ0ZXIgc2VsZWN0aW5nIHRhYmxlIGNlbGxzCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoIi0tLS0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHdpbmRvdy5fX21vdXNlRG93blRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQod2luZG93Ll9fbW91c2VEb3duVGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yod2luZG93Ll9fbW91c2VEb3duVGFyZ2V0KSA9PSAidW5kZWZpbmVkIiAvKiBtb2JpbGUgKi8gfHwgd2luZG93Ll9fbW91c2VEb3duVGFyZ2V0ID09IGUudGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZ1bmMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2luZG93ID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgdGFyZ2V0Lm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAod2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfX21vdXNlVXBSYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX19tb3VzZVVwUmFuZ2UgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAod2luZG93Ll9fbW91c2VEb3duUmFuZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICBkdW1wKF9fbW91c2VVcFJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuX19tb3VzZURvd25SYW5nZSB8fCAhX19tb3VzZVVwUmFuZ2UgfHwgd2luZG93Ll9fbW91c2VEb3duUmFuZ2Uuc3RhcnRDb250YWluZXIgPT0gX19tb3VzZVVwUmFuZ2Uuc3RhcnRDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oZnVuYyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGZ1bmMoZSkpOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wKCk7IAogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAKICAgICAgICAvL2Z1bmMyID0gZnVuY3Rpb24oZSl7YWxlcnQoZnVuYyl9OwogICAgICAgIAogICAgICAgIC8vaWYgKGVsZW0udGFnTmFtZSA9PSAiSU5QVVQiICYmIGVsZW0udHlwZSA9PSAiQ0hFQ0tCT1giKQogICAgICAgICAgICAvL2V2ZW50ID0gIm1vdXNldXAiOwogICAgICAgIC8vZWxzZQogICAgICAgICAgLy8gIGV2ZW50ID0gImNsaWNrIjsKICAgICAgICAvKgogICAgICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gIklOUFVUIiAmJiBlbGVtLnR5cGUgPT0gIkNIRUNLQk9YIikKICAgICAgICAgICAgZXZlbnQgPSAiY2xpY2siOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZ1bmMzID0gZnVuYzI7CiAgICAgICAgICAgIGZ1bmMyID0gZnVuY3Rpb24oZSl7ZT1nZXRNb3VzZUV2ZW50KGUpO2R1bXAoZS50YXJnZXQpO2R1bXAod2luZG93WyJfX2V2ZW50c0xhc3RNb3VzZURvd25UYXJnZXQiXSk7aWYgKGUudGFyZ2V0ID09IHdpbmRvd1siX19ldmVudHNMYXN0TW91c2VEb3duVGFyZ2V0Il0pe3JldHVybihmdW5jMyhlKSk7fSBlbHNlIHtyZXR1cm4oZmFsc2UpO30gfTsKICAgICAgICAgICAgZXZlbnQgPSAibW91c2V1cCI7CgogICAgICAgICAgICBhZGRFdmVudChlbGVtLCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSl7ZSA9IGdldE1vdXNlRXZlbnQoZSk7IHdpbmRvd1siX19ldmVudHNMYXN0TW91c2VEb3duVGFyZ2V0Il09ZS50YXJnZXQ7fSk7CiAgICAgICAgfQogICAgICAgICovCiAgICB9CiAgICBlbHNlIGlmIChldmVudCA9PSAicmNsaWNrIikKICAgIHsKICAgICAgICAvL2Z1bmMyID0gZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKGUud2hpY2ggPT0gMykgZnVuYyhlKTsgcmV0dXJuIHRydWU7fTsKICAgICAgICAvL2V2ZW50ID0gIm1vdXNlZG93biI7CiAgICAgICAgLy9mdW5jMiA9IGZ1bmN0aW9uKGUpe2lmICghY2FsbEdsb2JhbEV2ZW50cyB8fCBydW5HbG9iYWxFdmVudHMoInJjbGljayIsIGUpKSB7IGU9Z2V0TW91c2VFdmVudChlKTsgZS5zdG9wKCk7IGZ1bmMoZSk7IHJldHVybiBmYWxzZTsgfSBlbHNlIHtlLnN0b3AoKTsgcmV0dXJuIGZhbHNlO319OwogICAgICAgIAogICAgICAgIC8vIENUUkwgZW5hYmxlcyBkZWZhdWx0IGJyb3dzZXIgbWVudQogICAgICAgIGZ1bmMyID0gZnVuY3Rpb24oZSl7IAogICAgICAgICAgICBpZiAoIUFETUlOIHx8IEtleWJvYXJkLmN0cmwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBLZXlib2FyZC5jdHJsPWZhbHNlOwogICAgICAgICAgICAgICAgfSwxMDApOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGlmICghY2FsbEdsb2JhbEV2ZW50cyB8fCBydW5HbG9iYWxFdmVudHMoInJjbGljayIsIGUpKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIGU9Z2V0TW91c2VFdmVudChlKTsgCiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IAogICAgICAgICAgICAgICAgcmV0dXJuKGZ1bmMoZSkpOyAKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wKCk7IAogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBldmVudCA9ICJjb250ZXh0bWVudSI7CiAgICB9CiAgICBlbHNlIGlmIChldmVudCA9PSAibW91c2Vkb3duIikKICAgIHsKICAgICAgICAvLyBCVUcgRklYIC0gcG9rdWQgamUgdGV4dGFyZWEgbmVibyBpbnB1dCB2IGRpdnUgcyBkcmFnZ2FibGUsIHBhayBuZWpkZSBrbGlrbm91dCBhIG96bmFjaXQgdGV4dCAtIHN0YWNpIHprdXNpdDogPGRpdiBkcmFnZ2FibGU9J3RydWUnPjx0ZXh0YXJlYSBkcmFnZ2FibGU9J2ZhbHNlJz4xMjM0NTwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgIGZ1bmMyID0gZnVuY3Rpb24oZSl7IAogICAgICAgICAgICAgICAgZT1nZXRFdmVudChlKTsgCiAgICAgICAgICAgICAgICB3aW5kb3cuX19tb3VzZURvd25UYXJnZXQgPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtPWUudGFyZ2V0OyAKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lICYmIChlbGVtLnRhZ05hbWUgPT0gIklOUFVUIiB8fCBlbGVtLnRhZ05hbWUgPT0gIlRFWFRBUkVBIikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShlbGVtKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtLmRyYWdnYWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmRyYWdnYWJsZT1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLl9kcmFnZ2FibGU9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLl9kcmFnZ2FibGVGb2N1c0VsZW1lbnQ9ZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbT1lbGVtLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgcmV0dXJuKGZ1bmMoZSkpOwogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChldmVudCA9PSAiZHJhZ292ZXIiKQogICAgewogICAgICAgIGZ1bmMyID0gZnVuY3Rpb24oZSl7aWYgKCFjYWxsR2xvYmFsRXZlbnRzIHx8IHJ1bkdsb2JhbEV2ZW50cygiZHJhZ292ZXIiLCBlKSkgeyByZXR1cm4oZnVuYyhlKSk7fSBlbHNlIHtyZXR1cm4gZmFsc2U7fX07IC8vIGRvIG5vdCB1c2UgZS5zdG9wKCk7LCBpdCBhbGxvd3MgZHJvcCBpbnRvIG9iamVjdAogICAgfQogICAgZWxzZSAvLyBvdGhlciBldmVudHMKICAgIHsKICAgICAgICBmdW5jMiA9IGZ1bmN0aW9uKGUpe2lmICghY2FsbEdsb2JhbEV2ZW50cyB8fCBydW5HbG9iYWxFdmVudHMoZXZlbnQsIGUpKSB7IHJldHVybihmdW5jKGUpKTt9IGVsc2Uge3JldHVybiBmYWxzZTt9fTsKICAgIH0KICAgIAogICAgaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikgLy9ydW4gb25sb2FkIGluIERPTTIgYnJvd3NlcnMKICAgIHsKICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZ1bmMyLCBmYWxzZSk7CiAgICB9CiAgICBlbHNlIGlmIChlbGVtLmF0dGFjaEV2ZW50KSAvL3J1biBvbmxvYWQgaW4gSUU1LjUrCiAgICB7CiAgICAgICAgZWxlbS5hdHRhY2hFdmVudCgib24iK2V2ZW50LCBmdW5jMik7CiAgICB9CiAgICAKICAgIGlmICghZWxlbS5fX2V2ZW50cyB8fCB0eXBlb2YoZWxlbS5fX2V2ZW50cykgIT0gIm9iamVjdCIpCiAgICAgICAgZWxlbS5fX2V2ZW50cyA9IHt9OwogICAgaWYgKCFlbGVtLl9fZXZlbnRzW2V2ZW50XSkKICAgICAgICBlbGVtLl9fZXZlbnRzW2V2ZW50XSA9IFtdOwogICAgCiAgICBlbGVtLl9fZXZlbnRzW2V2ZW50XS5wdXNoKGZ1bmMyKTsKICAgICAgICAKICAgIHJldHVybih0cnVlKTsKfQoKZnVuY3Rpb24gY2FsbEV2ZW50KGVsZW0sIGV2ZW50LCBlKQp7CiAgICBpZiAodHlwZW9mKGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGUgPSBjcmVhdGVFdmVudCgpOwogICAgLy9kdW1wKGUpOwogICAgLy9kdW1wKGVsZW0pOwogICAgLy9kdW1wKGVsZW0uX19ldmVudHMpOwogICAgaWYgKGVsZW0uX19ldmVudHMgJiYgZWxlbS5fX2V2ZW50c1tldmVudF0pCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbS5fX2V2ZW50c1tldmVudF0ubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGVsZW0uX19ldmVudHNbZXZlbnRdW2ldKTsKICAgICAgICAgICAgZWxlbS5fX2V2ZW50c1tldmVudF1baV0oZSk7CiAgICAgICAgfQogICAgfQp9CgppZiAoZG9jdW1lbnQuYWxsKQp7CiAgICBhZGRFdmVudCh3aW5kb3csICJtb3VzZWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgZSA9IGdldEV2ZW50KGUpOwogICAgICAgIHZhciB3aW5kb3cgPSBlLnRhcmdldC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93OwogICAgICAgIHdpbmRvdy5fX21vdXNlRG93blRhcmdldCA9IGUudGFyZ2V0OwogICAgICAgIC8qCiAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAvL2R1bXAoc2VsKTsKICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50KQogICAgICAgICAgICB3aW5kb3cuX19tb3VzZURvd25SYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgd2luZG93Ll9fbW91c2VEb3duUmFuZ2UgPSBudWxsOwogICAgICAgIGR1bXAod2luZG93Ll9fbW91c2VEb3duUmFuZ2UpCiAgICAgICAgKi8KICAgICAgICAKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9KTsKfQoKLy9hZGRFdmVudChkb2N1bWVudCwgImNsaWNrIiwgZnVuY3Rpb24oKXtkdW1wKCdjbGljaycpfSk7Ci8vYWRkRXZlbnQoZG9jdW1lbnQsICJkYmxjbGljayIsIGZ1bmN0aW9uKCl7ZHVtcCgnZGJsY2xpY2snKX0pOwovL2FkZEV2ZW50KGRvY3VtZW50LCAicmNsaWNrIiwgZnVuY3Rpb24oKXtkdW1wKCdyY2xpY2snKX0pOwoKCnZhciBfX2lmcmFtZXMgPSBbXTsKCmZ1bmN0aW9uIGlmcmFtZUNoZWNrVGltZXIoKQp7CiAgICAvLyB3aGVuIG1vdmluZyBwYW5lbHMgd2l0aCBpZnJhbWVzIC0gc29tZSBicm93c2VycyB3aWxsIHJlZnJlc2ggaXQncyBjb250ZW50LCBjbyB3ZSBuZWVkIHRvIHJlY2FsbCBpdCBhZ2FpbiAgICAKICAgIGZvciAodmFyIGkgPSBfX2lmcmFtZXMubGVuZ3RoLTEgOyBpID49IDAgIDsgaS0tKQogICAgewogICAgICAgIHZhciBpZnJhbWUgPSBfX2lmcmFtZXNbaV07CiAgICAgICAgaWYgKGlmcmFtZSAmJiBpZnJhbWUuY29udGVudERvY3VtZW50ICYmICFpZnJhbWUuY29udGVudERvY3VtZW50Ll9faWZyYW1lRXZlbnRzKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKGlmcmFtZSk7CiAgICAgICAgICAgIF9faWZyYW1lcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgIGFkZElmcmFtZShpZnJhbWUpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgc2V0VGltZW91dChmdW5jdGlvbigpe2lmcmFtZUNoZWNrVGltZXIoKX0sIDEwMDApOwp9CmlmcmFtZUNoZWNrVGltZXIoKTsKCmZ1bmN0aW9uIGFkZElmcmFtZShpZnJhbWUpCnsKICAgIC8vcmV0dXJuOwogICAgLy9kdW1wKGlmcmFtZSk7CiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIGlmICghaW5fYXJyYXkoaWZyYW1lLCBfX2lmcmFtZXMpICYmIGlmcmFtZS5zcmMuaW5kZXhPZihQUk9KRUNUVVJMKSA9PT0gMCAmJiAhaGFzQ2xhc3NOYW1lKGlmcmFtZSwgIm5vRXZlbnRzIikpCiAgICB7CiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgX19pZnJhbWVzLnB1c2goaWZyYW1lKTsKICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50Ll9faWZyYW1lRXZlbnRzID0gdHJ1ZTsKICAgICAgICAKICAgICAgICB2YXIgX3dpbmRvdyA9IHdpbmRvdzsKCiAgICAgICAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIC8vcnVuIG9ubG9hZCBpbiBET00yIGJyb3dzZXJzCiAgICAgICAgewogICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbihlKXtLZXlib2FyZC5vbktleShlLCAiZG93biIpfSwgZmFsc2UpOwogICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgZnVuY3Rpb24oZSl7S2V5Ym9hcmQub25LZXkoZSwgInVwIil9LCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSAvL3J1biBvbmxvYWQgaW4gSUU1LjUrCiAgICAgICAgewogICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmF0dGFjaEV2ZW50KCJvbmtleWRvd24iLCBmdW5jdGlvbihlKXtLZXlib2FyZC5vbktleShlLCAiZG93biIpfSk7CiAgICAgICAgICAgIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ua2V5dXAiLCBmdW5jdGlvbihlKXtLZXlib2FyZC5vbktleShlLCAidXAiKX0pOwogICAgICAgIH0KCiAgICAgICAgYWRkRXZlbnQoaWZyYW1lLmNvbnRlbnRXaW5kb3csICJtb3VzZW1vdmUiLCBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZ1bmNEZXNjID0gImlmcmFtZUV2ZW50X21vdXNlbW92ZSI7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBfX2VsZW1lbnRFdmVudHNbX3dpbmRvdy5fZXZlbnRJZF0ubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBfX2VsZW1lbnRFdmVudHNbX3dpbmRvdy5fZXZlbnRJZF1baV07CiAgICAgICAgICAgICAgICB2YXIgVEhJUyA9IGdldFNvdXJjZUZ1bmN0aW9uKGV2ZW50WyJmdW5jdGlvbiJdKSAmJiBnZXRTb3VyY2VGdW5jdGlvbihldmVudFsiZnVuY3Rpb24iXSkudG9TdHJpbmcoKS5pbmRleE9mKGZ1bmNEZXNjKSA+IC0xOwogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbklmcmFtZUV2ZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQuX3Rocm93KCJpZnJhbWUgZXZlbnQgbG9vcCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRISVMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgOyAvL1RPRE8gX3Rocm93KCJhZGRJZnJhbWUoKSAtIGV2ZW50IGlmcmFtZSB0byBtYWluIHdpbmRvdyBwcm9wYWdhdGlvbiB0cmllcyB0byBjYWxsIHNlbGYgKCIrZnVuY0Rlc2MrIikhIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChldmVudFsibmFtZSJdID09ICJtb3VzZW1vdmUiICYmICFldmVudFsiaWZyYW1lIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmluSWZyYW1lRXZlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGV2ZW50WyJmdW5jdGlvbiJdKGUpOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbklmcmFtZUV2ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmYWxzZSwgZmFsc2UpOwogICAgICAgIAogICAgICAgIGFkZEV2ZW50KGlmcmFtZS5jb250ZW50V2luZG93LCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmdW5jRGVzYyA9ICJpZnJhbWVFdmVudF9tb3VzZWRvd24iOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX19lbGVtZW50RXZlbnRzW193aW5kb3cuX2V2ZW50SWRdLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gX19lbGVtZW50RXZlbnRzW193aW5kb3cuX2V2ZW50SWRdW2ldOwogICAgICAgICAgICAgICAgdmFyIFRISVMgPSBnZXRTb3VyY2VGdW5jdGlvbihldmVudFsiZnVuY3Rpb24iXSkgJiYgZ2V0U291cmNlRnVuY3Rpb24oZXZlbnRbImZ1bmN0aW9uIl0pLnRvU3RyaW5nKCkuaW5kZXhPZihmdW5jRGVzYykgPiAtMTsKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5JZnJhbWVFdmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50Ll90aHJvdygiaWZyYW1lIGV2ZW50IGxvb3AiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChUSElTKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIDsgLy9UT0RPIF90aHJvdygiYWRkSWZyYW1lKCkgLSBldmVudCBpZnJhbWUgdG8gbWFpbiB3aW5kb3cgcHJvcGFnYXRpb24gdHJpZXMgdG8gY2FsbCBzZWxmICgiK2Z1bmNEZXNjKyIpISIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnRbIm5hbWUiXSA9PSAibW91c2Vkb3duIiAmJiAhZXZlbnRbImlmcmFtZSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbklmcmFtZUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBldmVudFsiZnVuY3Rpb24iXShlKTsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW5JZnJhbWVFdmVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICBhZGRFdmVudChpZnJhbWUuY29udGVudFdpbmRvdywgIm1vdXNldXAiLCBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZ1bmNEZXNjID0gImlmcmFtZUV2ZW50X21vdXNldXAiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX19lbGVtZW50RXZlbnRzW193aW5kb3cuX2V2ZW50SWRdLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gX19lbGVtZW50RXZlbnRzW193aW5kb3cuX2V2ZW50SWRdW2ldOwogICAgICAgICAgICAgICAgdmFyIFRISVMgPSBnZXRTb3VyY2VGdW5jdGlvbihldmVudFsiZnVuY3Rpb24iXSkgJiYgZ2V0U291cmNlRnVuY3Rpb24oZXZlbnRbImZ1bmN0aW9uIl0pLnRvU3RyaW5nKCkuaW5kZXhPZihmdW5jRGVzYykgPiAtMTsKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5JZnJhbWVFdmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50Ll90aHJvdygiaWZyYW1lIGV2ZW50IGxvb3AiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChUSElTKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIDsgLy9UT0RPIF90aHJvdygiYWRkSWZyYW1lKCkgLSBldmVudCBpZnJhbWUgdG8gbWFpbiB3aW5kb3cgcHJvcGFnYXRpb24gdHJpZXMgdG8gY2FsbCBzZWxmICgiK2Z1bmNEZXNjKyIpISIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnRbIm5hbWUiXSA9PSAibW91c2V1cCIgJiYgIWV2ZW50WyJpZnJhbWUiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW5JZnJhbWVFdmVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZXZlbnRbImZ1bmN0aW9uIl0oZSk7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmluSWZyYW1lRXZlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgCiAgICAgICAgYWRkRXZlbnQoaWZyYW1lLmNvbnRlbnRXaW5kb3csICJwYXN0ZSIsIGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZnVuY0Rlc2MgPSAiaWZyYW1lRXZlbnRfcGFzdGUiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX19lbGVtZW50RXZlbnRzW193aW5kb3cuX2V2ZW50SWRdLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gX19lbGVtZW50RXZlbnRzW193aW5kb3cuX2V2ZW50SWRdW2ldOwogICAgICAgICAgICAgICAgdmFyIFRISVMgPSBnZXRTb3VyY2VGdW5jdGlvbihldmVudFsiZnVuY3Rpb24iXSkgJiYgZ2V0U291cmNlRnVuY3Rpb24oZXZlbnRbImZ1bmN0aW9uIl0pLnRvU3RyaW5nKCkuaW5kZXhPZihmdW5jRGVzYykgPiAtMTsKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5JZnJhbWVFdmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50Ll90aHJvdygiaWZyYW1lIGV2ZW50IGxvb3AiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChUSElTKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIDsgLy9UT0RPIF90aHJvdygiYWRkSWZyYW1lKCkgLSBldmVudCBpZnJhbWUgdG8gbWFpbiB3aW5kb3cgcHJvcGFnYXRpb24gdHJpZXMgdG8gY2FsbCBzZWxmICgiK2Z1bmNEZXNjKyIpISIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnRbIm5hbWUiXSA9PSAicGFzdGUiICYmICFldmVudFsiaWZyYW1lIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmluSWZyYW1lRXZlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGV2ZW50WyJmdW5jdGlvbiJdKGUpOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbklmcmFtZUV2ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmYWxzZSwgZmFsc2UpOwogICAgICAgIC8vIHpwdXNvYnVqZSB2ZWxrZSB6cG9tYWxlbmkgcHJpIHBzYW5pIGRvIEh0bWxBcmVhLCBwcm90b3plIHRvIHZvbGEgVFBhbmVsLm9uS2V5RG93biBhIFVwCiAgICAgICAgLyoKICAgICAgICBhZGRFdmVudChpZnJhbWUuY29udGVudFdpbmRvdywgImtleXVwIiwgZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmdW5jRGVzYyA9ICJpZnJhbWVFdmVudF9rZXl1cCI7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBfX2VsZW1lbnRFdmVudHNbX3dpbmRvdy5fZXZlbnRJZF0ubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBfX2VsZW1lbnRFdmVudHNbX3dpbmRvdy5fZXZlbnRJZF1baV07CiAgICAgICAgICAgICAgICB2YXIgVEhJUyA9IGdldFNvdXJjZUZ1bmN0aW9uKGV2ZW50WyJmdW5jdGlvbiJdKSAmJiBnZXRTb3VyY2VGdW5jdGlvbihldmVudFsiZnVuY3Rpb24iXSkudG9TdHJpbmcoKS5pbmRleE9mKGZ1bmNEZXNjKSA+IC0xOwogICAgICAgICAgICAgICAgaWYgKFRISVMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgOyAvL1RPRE8gX3Rocm93KCJhZGRJZnJhbWUoKSAtIGV2ZW50IGlmcmFtZSB0byBtYWluIHdpbmRvdyBwcm9wYWdhdGlvbiB0cmllcyB0byBjYWxsIHNlbGYgKCIrZnVuY0Rlc2MrIikhIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChldmVudFsibmFtZSJdID09ICJrZXl1cCIgJiYgIWV2ZW50WyJpZnJhbWUiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBldmVudFsiZnVuY3Rpb24iXShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgYWRkRXZlbnQoaWZyYW1lLmNvbnRlbnRXaW5kb3csICJrZXlkb3duIiwgZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmdW5jRGVzYyA9ICJpZnJhbWVFdmVudF9rZXlkb3duIjsKCiAgICAgICAgICAgIC8vZHVtcCgiLS0tIik7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IF9fZWxlbWVudEV2ZW50c1tfd2luZG93Ll9ldmVudElkXS5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBldmVudCA9IF9fZWxlbWVudEV2ZW50c1tfd2luZG93Ll9ldmVudElkXVtpXTsKICAgICAgICAgICAgICAgIHZhciBUSElTID0gZ2V0U291cmNlRnVuY3Rpb24oZXZlbnRbImZ1bmN0aW9uIl0pICYmIGdldFNvdXJjZUZ1bmN0aW9uKGV2ZW50WyJmdW5jdGlvbiJdKS50b1N0cmluZygpLmluZGV4T2YoZnVuY0Rlc2MpID4gLTE7CiAgICAgICAgICAgICAgICBpZiAoVEhJUykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICA7IC8vVE9ETyBfdGhyb3coImFkZElmcmFtZSgpIC0gZXZlbnQgaWZyYW1lIHRvIG1haW4gd2luZG93IHByb3BhZ2F0aW9uIHRyaWVzIHRvIGNhbGwgc2VsZiAoIitmdW5jRGVzYysiKSEiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50WyJuYW1lIl0gPT0gImtleWRvd24iICYmICFldmVudFsiaWZyYW1lIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGdldFNvdXJjZUZ1bmN0aW9uKGV2ZW50WyJmdW5jdGlvbiJdKSk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnRbImZ1bmN0aW9uIl0oZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmYWxzZSwgZmFsc2UpOwogICAgICAgICovCiAgICAgICAgCiAgICAgICAgLy9kdW1wKGlmcmFtZSk7CiAgICAgICAgLyoKICAgICAgICB2YXIgX2lmcmFtZSA9IGlmcmFtZTsKICAgICAgICBmdW5jdGlvbiBpZnJhbWVMb2FkZWQoKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIC8vcnVuIG9ubG9hZCBpbiBET00yIGJyb3dzZXJzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9pZnJhbWUuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbihlKXtLZXlib2FyZC5vbktleShlLCAiZG93biIpfSwgZmFsc2UpOwogICAgICAgICAgICAgICAgX2lmcmFtZS5jb250ZW50RG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCBmdW5jdGlvbihlKXtLZXlib2FyZC5vbktleShlLCAidXAiKX0sIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgLy9ydW4gb25sb2FkIGluIElFNS41KwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfaWZyYW1lLmNvbnRlbnREb2N1bWVudC5hdHRhY2hFdmVudCgib25rZXlkb3duIiwgZnVuY3Rpb24oZSl7S2V5Ym9hcmQub25LZXkoZSwgImRvd24iKX0pOwogICAgICAgICAgICAgICAgX2lmcmFtZS5jb250ZW50RG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ua2V5dXAiLCBmdW5jdGlvbihlKXtLZXlib2FyZC5vbktleShlLCAidXAiKX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGR1bXAoJ2FkZGV2ZW50KGxvYWQpJyk7CiAgICAgICAgYWRkRXZlbnQoaWZyYW1lLCAibG9hZCIsIGZ1bmN0aW9uKCl7ZHVtcCgnbG9hZGVkJyk7aWZyYW1lTG9hZGVkKCk7cmV0dXJuKHRydWUpO30pOwogICAgICAgICovCiAgICB9CiAgICAvKiogLS0tLS0tLS0tLS0tLS0tIFRPRE8gQUxMIEFWQUlMQUJMRSBFVkVOVFMgLS0tLS0tLS0tLS0tLS0tLS0gIC0gdXNlIGNsb3N1cmUgKi8KICAgIAp9CgpmdW5jdGlvbiBnZXRJZnJhbWUoZWxlbSkKewogICAgdmFyIHBhcmVudCA9IGVsZW07CiAgICB3aGlsZShwYXJlbnQpCiAgICB7CiAgICAgICAgdmFyIF9wYXJlbnROb2RlID0gbnVsbDsKICAgICAgICB0cnkgCiAgICAgICAgewogICAgICAgICAgICBfcGFyZW50Tm9kZSA9IHBhcmVudC5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICAgICAgX3BhcmVudE5vZGUgPSBudWxsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIV9wYXJlbnROb2RlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX19pZnJhbWVzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKF9faWZyYW1lc1tpXS5jb250ZW50RG9jdW1lbnQgPT0gcGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybihfX2lmcmFtZXNbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhcmVudCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7CiAgICB9CiAgICByZXR1cm4obnVsbCk7Cn0KCi8qCnZhciBmbmMgPSBmdW5jdGlvbihldmVudCwgZnVuYykKewogICAgYWxlcnQodGhpcy5hdHRhY2hFdmVudCk7CiAgICBpZiAodGhpcy5hZGRFdmVudExpc3RlbmVyKSAvL3J1biBvbmxvYWQgaW4gRE9NMiBicm93c2VycwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZnVuYywgZmFsc2UpOwogICAgZWxzZSBpZiAodGhpcy5hdHRhY2hFdmVudCkgLy9ydW4gb25sb2FkIGluIElFNS41KwogICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoIm9uIitldmVudCwgZnVuYyk7Cn07CkRPTUVsZW1lbnQuZXh0ZW5kKCJhZGRFdmVudCIsIGZuYyk7CndpbmRvdy5hZGRFdmVudCA9IGZuYzsKCmRvY3VtZW50Ll9nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lOwpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGZ1bmN0aW9uKHRhZ05hbWUpCnsKICAgIGlmICh0YWdOYW1lPT0iKiIgJiYgZG9jdW1lbnQuYWxsKSAvLyBJRSBkb2VzIG5vdCBrbm93ICoKICAgICAgICByZXR1cm4oZG9jdW1lbnQuYWxsKTsKICAgIGVsc2UgaWYgKGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5VGFnTmFtZSkKICAgICAgICByZXR1cm4oZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpKTsKfQoqLwoKCgoKZnVuY3Rpb24gZ2V0U3R5bGVWYWx1ZShzdHlsZSwgc3R5bGVOYW1lKQp7CiAgICB2YXIgcHJvcCA9IGNhbWVsaXplKHN0eWxlTmFtZSk7CiAgICAKICAgIC8vZHVtcCgiWFhYWFhYWFhYWFggIitwcm9wKTsKICAgIC8vZHVtcChzdHlsZVtwcm9wXSk7CiAgICAvL2R1bXAoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSk7CiAgICAvL2R1bXAoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSk7CiAgICAKICAgIAogICAgdmFyIHZhbHVlID0gIiI7CiAgICBpZiAoc3R5bGUpCiAgICB7CiAgICAgICAgdmFyIHZhbHVlID0gc3R5bGVbcHJvcF07CiAgICAgICAgaWYgKCF2YWx1ZSAmJiBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKQogICAgICAgICAgICB2YWx1ZSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcCk7CiAgICB9CiAgICByZXR1cm4odmFsdWUpOwp9CiAgCmZ1bmN0aW9uIGdldFJhd1N0eWxlKGVsZW0sIHN0eWxlTmFtZSkKewogICAgcmV0dXJuKF9nZXRTdHlsZShlbGVtLCBzdHlsZU5hbWUsIHRydWUpKTsKfQoKZnVuY3Rpb24gZ2V0U3R5bGUoZWxlbSwgc3R5bGVOYW1lLCByYXcpCnsKICAgIGlmICh0eXBlb2YocmF3KSA9PSAidW5kZWZpbmVkIikKICAgICAgICByYXcgPSBmYWxzZTsKICAgIGlmICh0eXBlb2Yoc3R5bGVOYW1lKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBzdHlsZU5hbWUgPSAiIjsKCiAgICAvLyBrIGNlbXU/CiAgICBpZiAocmF3ICYmIChzdHlsZU5hbWUgPT0gImZsb2F0IiB8fCBzdHlsZU5hbWUgPT0gImNsZWFyIiB8fCBjYW1lbGl6ZShzdHlsZU5hbWUpID09ICJ2ZXJ0aWNhbEFsaWduIikpCiAgICB7CiAgICAgICAgdmFyIG9sZERpc3BsYXkgPSBnZXRTdHlsZShlbGVtLnBhcmVudE5vZGUsICJkaXNwbGF5Iik7CiAgICAgICAgaWYgKG9sZERpc3BsYXkgPT0gImZsZXgiIHx8IG9sZERpc3BsYXkgPT0gImlubGluZS1mbGV4IikKICAgICAgICB7CiAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgICAgICAgdmFyIHJldCA9IGdldFN0eWxlKGVsZW0sIHN0eWxlTmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9IG9sZERpc3BsYXk7CiAgICAgICAgICAgIHJldHVybihyZXQpOwogICAgICAgIH0gICAgICAgIAogICAgfQogICAgdmFyIHJldCA9IF9nZXRTdHlsZShlbGVtLCBzdHlsZU5hbWUpOwogICAgLy9pZiAoc3R5bGVOYW1lKQogICAgLy97CiAgICAvLyAgICBjb25zb2xlLmxvZyhzdHlsZU5hbWUrIjogIityZXQrIiAvICIrX2dldFN0eWxlMihlbGVtLCBzdHlsZU5hbWUpKTsKICAgIC8vfQogICAgCiAgICBpZiAoc3R5bGVOYW1lKQogICAgewogICAgICAgIC8vIEZpcmVGb3ggYW5kIElFIGZpeAogICAgICAgIGlmICghcmV0ICYmIHN0eWxlTmFtZSA9PSAiYm9yZGVyLWNvbG9yIikKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IF9nZXRTdHlsZShlbGVtLCAiYm9yZGVyLWxlZnQtY29sb3IiKTsKICAgICAgICB9CgogICAgICAgIGlmICghcmV0KQogICAgICAgIHsKICAgICAgICAgICAgLy8gRkYgYW5kIElFIGRvIG5vdCByZXR1cm4gcGFkZGluZywgYnV0IHJldHVybnMgcGFkZGluZy1sZWZ0LCB0b3AsIC4uLgogICAgICAgICAgICB2YXIgcmV0MiA9IF9nZXRTdHlsZShlbGVtLCBzdHlsZU5hbWUrIi1sZWZ0Iik7CiAgICAgICAgICAgIGlmIChyZXQyKQogICAgICAgICAgICAgICAgcmV0ID0gcmV0MjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybihyZXQpOwp9CiAgCmFkZFN0eWxlKCIuZ2V0U3R5bGVXaWR0aEZpeCB7d2lkdGg6MTAwMDBweDt9IC5nZXRTdHlsZUhlaWdodEZpeCB7aGVpZ2h0OjEwMDAwcHg7fSIpOwogIAovLyB0byBnZXQgd2lkdGggYXMgZGVmaW5lZCBpbiBleHRlcm5hbCBjc3MKZnVuY3Rpb24gZ2V0Q29tcHV0ZWRDU1NWYWx1ZShlbGVtLCBwcm9wZXJ0eSkgCnsKICAgIHZhciByZXNvbHZlZFZhbCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pW3Byb3BlcnR5XTsKICAgIC8vZG9lcyB0aGlzIHJldHVybiBhIHBpeGVsIGJhc2VkIHZhbHVlPwogICAgaWYgKChwcm9wZXJ0eSA9PSAid2lkdGgiIHx8IHByb3BlcnR5ID09ICJoZWlnaHQiKSAmJiAvcHgvLnRlc3QocmVzb2x2ZWRWYWwpKSAKICAgIHsKICAgICAgICB2YXIgX2VsZW0gPSBlbGVtOwogICAgICAgIGlmICgoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgfHwgQnJvd3Nlci5uYW1lID09ICJFZGdlIikgJiYgZWxlbS5wYXJlbnROb2RlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGllRWxlbSA9IGNsb25lTm9kZShlbGVtKTsKICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKGVsZW0sIGllRWxlbSk7CiAgICAgICAgICAgIF9lbGVtID0gaWVFbGVtOwogICAgICAgIH0KICAgICAgICB2YXIgX2Rpc3BsYXkgPSBfZWxlbS5zdHlsZS5kaXNwbGF5OwogICAgICAgIF9lbGVtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgdmFyIGNvbXB1dGVkVmFsID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoX2VsZW0pW3Byb3BlcnR5XTsKICAgICAgICBfZWxlbS5zdHlsZS5kaXNwbGF5ID0gX2Rpc3BsYXk7CiAgICAgICAgCiAgICAgICAgaWYgKGllRWxlbSkKICAgICAgICAgICAgcmVtb3ZlTm9kZShpZUVsZW0pOwogICAgICAgICAgIAogICAgICAgIHJldHVybiBjb21wdXRlZFZhbDsKICAgIH0gCiAgICBlbHNlIAogICAgewogICAgICAgIHJldHVybiByZXNvbHZlZFZhbDsKICAgIH0KfQogIAogIC8vIGsgY2VtdSBqZSByYXc/Ci8qCmZ1bmN0aW9uIF9nZXRTdHlsZTIoZWxlbSwgc3R5bGVOYW1lLCByYXcpCnsKICAgIGlmICh0eXBlb2YocmF3KSA9PSAidW5kZWZpbmVkIikKICAgICAgICByYXcgPSBmYWxzZTsKICAgIGlmICh0eXBlb2Yoc3R5bGVOYW1lKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBzdHlsZU5hbWUgPSAiIjsKCiAgICB2YXIgZ2V0RnVsbFN0eWxlID0gZmFsc2U7CiAgICBpZiAoIXN0eWxlTmFtZSkKICAgICAgICBnZXRGdWxsU3R5bGUgPSB0cnVlOwogICAgICAgIAogICAgaWYgKCFlbGVtKQogICAgewogICAgICAgIF90aHJvdygiZ2V0U3R5bGUoKTogZWxlbSBpcyB1bmRlZmluZWQiKTsKICAgICAgICByZXR1cm4obnVsbCk7CiAgICB9CiAgICBpZiAoIWVsZW0uc3R5bGUpCiAgICB7CiAgICAgICAgaWYgKGdldEZ1bGxTdHlsZSkKICAgICAgICAgICAgcmV0dXJuKHt9KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybigiIik7CiAgICB9CgogICAgaWYgKHN0eWxlTmFtZSA9PSAib3V0ZXJXaWR0aCIpCiAgICAgICAgcmV0dXJuKGVsZW0ub2Zmc2V0V2lkdGgrInB4Iik7CiAgICBpZiAoc3R5bGVOYW1lID09ICJvdXRlckhlaWdodCIpCiAgICAgICAgcmV0dXJuKGVsZW0ub2Zmc2V0SGVpZ2h0KyJweCIpOwogICAgaWYgKHN0eWxlTmFtZSA9PSAib3V0ZXJNaW5XaWR0aCIpCiAgICB7CiAgICAgICAgdmFyIHZhbHVlID0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAibWluLXdpZHRoIikpOwogICAgICAgIHZhbHVlICs9IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgImJvcmRlci1sZWZ0LXdpZHRoIikpOwogICAgICAgIHZhbHVlICs9IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgImJvcmRlci1yaWdodC13aWR0aCIpKTsKICAgICAgICB2YWx1ZSArPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJwYWRkaW5nLWxlZnQiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy1yaWdodCIpKTsKICAgICAgICByZXR1cm4odmFsdWUrInB4Iik7CiAgICB9CiAgICBpZiAoc3R5bGVOYW1lID09ICJvdXRlck1pbkhlaWdodCIpCiAgICB7CiAgICAgICAgdmFyIHZhbHVlID0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAibWluLWhlaWdodCIpKTsKICAgICAgICB2YWx1ZSArPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJib3JkZXItdG9wLXdpZHRoIikpOwogICAgICAgIHZhbHVlICs9IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgImJvcmRlci1ib3R0b20td2lkdGgiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy10b3AiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy1ib3R0b20iKSk7CiAgICAgICAgcmV0dXJuKHZhbHVlKyJweCIpOwogICAgfSAKICAgIGlmIChzdHlsZU5hbWUgPT0gImlubmVyV2lkdGgiKQogICAgewogICAgICAgIHZhbHVlID0gZ2V0UmVsYXRpdmVXaWR0aChlbGVtLCBlbGVtLm9mZnNldFdpZHRoKTsKICAgICAgICByZXR1cm4odmFsdWUrInB4Iik7CiAgICB9CiAgICBlbHNlIGlmIChzdHlsZU5hbWUgPT0gImlubmVySGVpZ2h0IikgICAgICAgICAgICAKICAgIHsKICAgICAgICB2YWx1ZSA9IGdldFJlbGF0aXZlSGVpZ2h0KGVsZW0sIGVsZW0ub2Zmc2V0SGVpZ2h0KTsKICAgICAgICByZXR1cm4odmFsdWUrInB4Iik7CiAgICB9CiAgICAvL2NvbnNvbGUubG9nKHJhdyk7CiAgICAKICAgIGlmICghcmF3KQogICAgewogICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkgLy8gSFRNTDUKICAgICAgICB7CiAgICAgICAgICAgIGlmIChnZXRGdWxsU3R5bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKTsKICAgICAgICAgICAgICAgIHZhciBfc3R5bGUyID0ge307CiAgICAgICAgICAgICAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJPcGVyYSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBfc3R5bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUyW2ldID0gX3N0eWxlW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBfc3R5bGUubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNOYW1lID0gX3N0eWxlW2ldOyAKICAgICAgICAgICAgICAgICAgICAgICAgY05hbWUgPSBjYW1lbGl6ZShjTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjTmFtZSA9PSAiZmxvYXQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY05hbWUgPSAiY3NzRmxvYXQiOwogICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUyW2NhbWVsaXplKF9zdHlsZVtpXSldID0gX3N0eWxlW2NOYW1lXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIV9zdHlsZTJbImZsb2F0Il0gJiYgX3N0eWxlMlsiY3NzRmxvYXQiXSkKICAgICAgICAgICAgICAgICAgICBfc3R5bGUyWyJmbG9hdCJdID0gX3N0eWxlMlsiY3NzRmxvYXQiXTsgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybihfc3R5bGUyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzdHlsZU5hbWUgPT0gImZsb2F0IikKICAgICAgICAgICAgICAgICAgICBzdHlsZU5hbWUgPSAiY3NzRmxvYXQiOwoKICAgICAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9pZiAoZWxlbS5zdHlsZVsic3R5bGVOYW1lIl0pCiAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4oZ2V0U3R5bGVWYWx1ZShlbGVtLnN0eWxlLCBzdHlsZU5hbWUpKTsKCiAgICAgICAgICAgICAgICB2YXIgX3N0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBnZXRTdHlsZVZhbHVlKF9zdHlsZSwgc3R5bGVOYW1lKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGZhbHNlICYmIHZhbHVlICE9ICJhdXRvIiAmJiBzdHlsZU5hbWUgPT0gIndpZHRoIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUoZWxlbSwgImdldFN0eWxlV2lkdGhGaXgiKTsKICAgICAgICAgICAgICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9zdHlsZTIgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUyID0gZ2V0U3R5bGVWYWx1ZShfc3R5bGUyLCBzdHlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGR1bXAoIi0iKTsKICAgICAgICAgICAgICAgICAgICBkdW1wKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBkdW1wKHZhbHVlMik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMiA9PSAiMTAwMDBweCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImF1dG8iOwogICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzTmFtZShlbGVtLCAiZ2V0U3R5bGVXaWR0aEZpeCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4odmFsdWUpOwogICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlbGVtLmN1cnJlbnRTdHlsZSkgLy8gSUUgPD0gOAogICAgICAgIHsKICAgICAgICAgICAgaWYgKGdldEZ1bGxTdHlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF9zdHlsZSA9IGVsZW0uY3VycmVudFN0eWxlOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybihfc3R5bGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHN0eWxlTmFtZSA9PSAiZmxvYXQiKQogICAgICAgICAgICAgICAgICAgIHN0eWxlTmFtZSA9ICJjc3NGbG9hdCI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVsZW0uY3VycmVudFN0eWxlW3N0eWxlTmFtZV07CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybih2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9kdW1wKCJnZXRTdHlsZShyYXcpID8/Iik7CiAgICB9Cn0gICAgCiovCgpmdW5jdGlvbiBfZ2V0U3R5bGUoZWxlbSwgc3R5bGVOYW1lLCByYXcpCnsKICAgIGlmICh0eXBlb2YocmF3KSA9PSAidW5kZWZpbmVkIikKICAgICAgICByYXcgPSBmYWxzZTsKICAgIGlmICh0eXBlb2Yoc3R5bGVOYW1lKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBzdHlsZU5hbWUgPSAiIjsKICAgICAgICAKICAgIGlmICghZWxlbSkKICAgIHsKICAgICAgICBfdGhyb3coImdldFN0eWxlKCk6IGVsZW0gaXMgdW5kZWZpbmVkIik7CiAgICAgICAgcmV0dXJuKG51bGwpOwogICAgfQogICAgCiAgICBpZiAoc3R5bGVOYW1lID09ICJvdXRlcldpZHRoIikKICAgICAgICByZXR1cm4oZWxlbS5vZmZzZXRXaWR0aCsicHgiKTsKICAgIGlmIChzdHlsZU5hbWUgPT0gIm91dGVySGVpZ2h0IikKICAgICAgICByZXR1cm4oZWxlbS5vZmZzZXRIZWlnaHQrInB4Iik7CiAgICBpZiAoc3R5bGVOYW1lID09ICJvdXRlck1pbldpZHRoIikKICAgIHsKICAgICAgICB2YXIgdmFsdWUgPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJtaW4td2lkdGgiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAiYm9yZGVyLWxlZnQtd2lkdGgiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAiYm9yZGVyLXJpZ2h0LXdpZHRoIikpOwogICAgICAgIHZhbHVlICs9IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgInBhZGRpbmctbGVmdCIpKTsKICAgICAgICB2YWx1ZSArPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJwYWRkaW5nLXJpZ2h0IikpOwogICAgICAgIHJldHVybih2YWx1ZSsicHgiKTsKICAgIH0KICAgIGlmIChzdHlsZU5hbWUgPT0gIm91dGVyTWluSGVpZ2h0IikKICAgIHsKICAgICAgICAvL2R1bXAoZ2V0U3R5bGUoZWxlbSwgIm1pbi1oZWlnaHQiKSk7CiAgICAgICAgLy9kdW1wKGdldFN0eWxlKGVsZW0sICJib3JkZXItdG9wLXdpZHRoIikpOwogICAgICAgIC8vZHVtcChnZXRTdHlsZShlbGVtLCAiYm9yZGVyLWJvdHRvbS13aWR0aCIpKTsKICAgICAgICAvL2R1bXAoZ2V0U3R5bGUoZWxlbSwgInBhZGRpbmctdG9wIikpOwogICAgICAgIC8vZHVtcChnZXRTdHlsZShlbGVtLCAicGFkZGluZy1ib3R0b20iKSk7CiAgICAgICAgdmFyIHZhbHVlID0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAibWluLWhlaWdodCIpKTsKICAgICAgICB2YWx1ZSArPSBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJib3JkZXItdG9wLXdpZHRoIikpOwogICAgICAgIHZhbHVlICs9IGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgImJvcmRlci1ib3R0b20td2lkdGgiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy10b3AiKSk7CiAgICAgICAgdmFsdWUgKz0gZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAicGFkZGluZy1ib3R0b20iKSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuKHZhbHVlKyJweCIpOwogICAgfQogICAgaWYgKHN0eWxlTmFtZSA9PSAicHhNYXhXaWR0aCIpCiAgICB7CiAgICAgICAgdmFyIHZhbHVlID0gZ2V0U3R5bGUoZWxlbSwgIm1heC13aWR0aCIpOwogICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCIlIikgPiAtMSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB3U2l6ZSA9IEJyb3dzZXIuZ2V0V2luZG93U2l6ZSgpOwogICAgICAgICAgICB2YWx1ZSA9IGV4dHJhY3RGbG9hdCgxMDAqZXh0cmFjdEZsb2F0KHZhbHVlKS93U2l6ZVsidyJdKTsKICAgICAgICB9CiAgICAgICAgdmFsdWUgPSBleHRyYWN0RmxvYXQodmFsdWUpOwoKICAgICAgICByZXR1cm4odmFsdWUrInB4Iik7CiAgICB9CiAgICBpZiAoc3R5bGVOYW1lID09ICJweE1heEhlaWdodCIpCiAgICB7CiAgICAgICAgdmFyIHZhbHVlID0gZ2V0U3R5bGUoZWxlbSwgIm1heC1oZWlnaHQiKTsKICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiJSIpID4gLTEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgd1NpemUgPSBCcm93c2VyLmdldFdpbmRvd1NpemUoKTsKICAgICAgICAgICAgdmFsdWUgPSBleHRyYWN0RmxvYXQoMTAwKmV4dHJhY3RGbG9hdCh2YWx1ZSkvd1NpemVbImgiXSk7CiAgICAgICAgfQogICAgICAgIHZhbHVlID0gZXh0cmFjdEZsb2F0KHZhbHVlKTsKCiAgICAgICAgcmV0dXJuKHZhbHVlKyJweCIpOwogICAgfQoKICAgIHZhciBnZXRGdWxsU3R5bGUgPSBmYWxzZTsKICAgIHZhciBfc3R5bGVzID0gW107CiAgICBpZiAoIXN0eWxlTmFtZSkKICAgICAgICBnZXRGdWxsU3R5bGUgPSB0cnVlOwogICAgICAgIAogICAgaWYgKHN0eWxlTmFtZSA9PSAid2lkdGgiKQogICAgewogICAgICAgIC8vZ2V0RnVsbFN0eWxlID0gdHJ1ZTsKICAgICAgICAvL3JhdyA9IHRydWU7CiAgICB9CiAgICAgICAgCiAgICBpZiAoIWVsZW0uc3R5bGUpCiAgICB7CiAgICAgICAgaWYgKGdldEZ1bGxTdHlsZSkKICAgICAgICAgICAgcmV0dXJuKHt9KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybigiIik7CiAgICB9CgogICAgaWYgKCFyYXcgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUpICAvLyBmYXN0IEhUTUw1IG9wdGltaXplZCB2ZXJzaW9uCiAgICB7CiAgICAgICAgaWYgKGdldEZ1bGxTdHlsZSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX3N0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShlbGVtLCAiZGlyc0NvbnRhaW5lciIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGR1bXAoIiEhISEhISEhISEiKTsKICAgICAgICAgICAgICAgICAgICBkdW1wKGdldFRhZyhlbGVtKSk7CiAgICAgICAgICAgICAgICAgICAgZHVtcChzdHlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGR1bXAoZ2V0RnVsbFN0eWxlKTsKICAgICAgICAgICAgICAgICAgICBkdW1wKF9zdHlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgLy8gdGhyb3dzIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgLy9fc3R5bGVbImZsb2F0Il0gPSBfc3R5bGUuY3NzRmxvYXQ7ICAvL0ZGCiAgICAgICAgICAgICAgICAvL2R1bXAoX3N0eWxlKTsKICAgICAgICAgICAgICAgIHZhciBfc3R5bGUyID0ge307CiAgICAgICAgICAgICAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJPcGVyYSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBfc3R5bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUyW2ldID0gX3N0eWxlW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBfc3R5bGUubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNOYW1lID0gY2FtZWxpemUoX3N0eWxlW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNOYW1lID09ICJmbG9hdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjTmFtZSA9ICJjc3NGbG9hdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIF9zdHlsZTJbY2FtZWxpemUoX3N0eWxlW2ldKV0gPSBfc3R5bGVbY05hbWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghX3N0eWxlMlsiZmxvYXQiXSAmJiBfc3R5bGUyWyJjc3NGbG9hdCJdKQogICAgICAgICAgICAgICAgICAgIF9zdHlsZTJbImZsb2F0Il0gPSBfc3R5bGUyWyJjc3NGbG9hdCJdOyAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBkb2JyeSBuYXBhZCwgamFrIGRvc3RhdCAlIGkgZG8gcGxuZWhvIHZ5cGlzdSwgYWxlIHplcmUgdG8gcHJvY2Vzb3IgLSB2eXJlc2l0IG5hIHByaXN0ZSwgcHM6IGtkeSBidWRlIHByaXN0ZT8gOkQKICAgICAgICAgICAgICAgIC8vX3N0eWxlMlsid2lkdGgiXSA9IF9nZXRTdHlsZShlbGVtLCAid2lkdGgiKTsKICAgICAgICAgICAgICAgIC8vX3N0eWxlMlsiaGVpZ2h0Il0gPSBfZ2V0U3R5bGUoZWxlbSwgImhlaWdodCIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKGhhc0NsYXNzTmFtZShlbGVtLCAiZGlyc0NvbnRhaW5lciIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGR1bXAoX3N0eWxlMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuKF9zdHlsZTIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vYWxlcnQoIndpbmRvdy5nZXRDb21wdXRlZFN0eWxlIG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCFyYXcgJiYgZWxlbS5jdXJyZW50U3R5bGUpICAvLyBvbGQgSUUgPD0gOAogICAgewogICAgICAgIC8vZHVtcCgiaGFzIHdpbmRvdy5jdXJyZW50U3R5bGUiKTsKICAgICAgICBpZiAoZ2V0RnVsbFN0eWxlKQogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfc3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZTsKICAgICAgICAgICAgICAgIHJldHVybihfc3R5bGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vYWxlcnQoIndpbmRvdy5nZXRDb21wdXRlZFN0eWxlIG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgLy9kdW1wKDEpOwogICAgdmFyIHZhbHVlID0gbnVsbDsKICAgIHRyeQogICAgewogICAgICAgIGlmIChnZXRGdWxsU3R5bGUpCiAgICAgICAgewogICAgICAgICAgICBfc3R5bGVzLnB1c2goZWxlbS5zdHlsZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgICAgICBpZiAoc3R5bGVOYW1lID09ICJpbm5lcldpZHRoIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRSZWxhdGl2ZVdpZHRoKGVsZW0sIGVsZW0ub2Zmc2V0V2lkdGgsIHRydWUpKyJweCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVOYW1lID09ICJpbm5lckhlaWdodCIpICAgICAgICAgICAgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0UmVsYXRpdmVIZWlnaHQoZWxlbSwgZWxlbS5vZmZzZXRIZWlnaHQsIHRydWUpKyJweCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXJhdyAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkgLy8gZmFzdCBIVE1MNSBvcHRpbWl6ZWQgdmVyc2lvbgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHVtaSB2cmFjZXQgdiAlLCB0YWsgamFrIGplIHYgQ1NTCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGdldENvbXB1dGVkQ1NTVmFsdWUoZWxlbSwgc3R5bGVOYW1lKSk7CgogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlTmFtZSAhPSAid2lkdGgiICYmIHN0eWxlTmFtZSAhPSAiaGVpZ2h0IikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihnZXRTdHlsZVZhbHVlKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpLCBzdHlsZU5hbWUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4oZ2V0Q29tcHV0ZWRDU1NWYWx1ZShlbGVtLCBzdHlsZU5hbWUpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZU5hbWUgPT0gIndpZHRoIiAmJiBlbGVtLnN0eWxlLndpZHRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGVsZW0uc3R5bGUud2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVOYW1lID09ICJoZWlnaHQiICYmIGVsZW0uc3R5bGUuaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGVsZW0uc3R5bGUuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBpdCByZXR1cm5zIGluIHBpeGVscyBmcm9tIGdldENvbXB1dGVkU3R5bGUoKSAtIHdlIG5lZWQgdG8gcGFyc2UgQ1NTIC0gc2VlIGJlbG93CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAvLyBnZXRDb21wdXRlZFN0eWxlIGNvbnZlcnRzIHdpZHRoOmF1dG8gdG8gcGl4ZWxzCiAgICAgICAgICAgICAgICAgICAgdmFyIF9zdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGdldFN0eWxlVmFsdWUoX3N0eWxlLCBzdHlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZU5hbWUgPT0gIndpZHRoIiAmJiB2YWx1ZSAhPSAiYXV0byIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3dpZHRoID0gZWxlbS5zdHlsZS53aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS53aWR0aCA9ICJhdXRvIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gImF1dG8iOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N0eWxlMiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUyID0gZ2V0U3R5bGVWYWx1ZShfc3R5bGUyLCBzdHlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLndpZHRoID0gX3dpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gdmFsdWUyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oImF1dG8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4oZ2V0U3R5bGVWYWx1ZShfc3R5bGUsIHN0eWxlTmFtZSkpOwogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghcmF3ICYmIGVsZW0uY3VycmVudFN0eWxlKSAvLyBvbGQgSUUgPD0gOCAgICAgIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybihnZXRTdHlsZVZhbHVlKGVsZW0uY3VycmVudFN0eWxlLCBzdHlsZU5hbWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFyYXcpCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRTdHlsZVZhbHVlKGVsZW0uc3R5bGUsIHN0eWxlTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vaWYgKGVsZW0uaWQgPT0gIlN0YXJ0UGFuZWwiKQogICAgICAgICAgICAvLyAgICBkdW1wKCI/Iit2YWx1ZSk7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9pZiAoZWxlbS5pZCA9PSAiU3RhcnRQYW5lbCIpCiAgICAgICAgICAgICAgICAvLyAgICBkdW1wKCIhIit2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4odmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL2R1bXAoZWxlbS5jbGFzc05hbWUpOwogICAgICAgIC8vIGVsc2Ugc2VhcmNoIGluIGV4dGVybmFsIENTUwogICAgICAgIC8vaWYgKGVsZW0uaWQgPT0gIlN0YXJ0UGFuZWwiKQogICAgICAgIC8vICAgIGR1bXAoIlggIitlbGVtLmNsYXNzTmFtZSsiICIrZWxlbS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpOwogICAgICAgIGlmICgoIXZhbHVlIHx8IGdldEZ1bGxTdHlsZSkgJiYgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uaWQpKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSB0cmltKGVsZW0uY2xhc3NOYW1lKS5zcGxpdCgiICIpOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG5hbWVzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKCIuIitjbGFzc05hbWVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZWxlbS5pZCkKICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goIiMiK2VsZW0uaWQpOwogICAgICAgICAgICBlbHNlIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX2VsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHdoaWxlKF9lbGVtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChfZWxlbS5pZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goIi8jIitfZWxlbS5pZCsiLioiK2VsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpKyIkLyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBfZWxlbSA9IF9lbGVtLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgICAgIC8vZHVtcChuYW1lcyk7CiAgICAgICAgICAgIC8vaWYgKGVsZW0uaWQgPT0gIlN0YXJ0UGFuZWwiKQogICAgICAgICAgICAvLyAgICBkdW1wKCI/IituYW1lcy5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKHZhciBjID0gMCA7IGMgPCBuYW1lcy5sZW5ndGggOyBjKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbmFtZXNbY107CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMCA7IHMgPCBkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggOyBzKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlU2hlZXQgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1tzXTsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHN0eWxlU2hlZXQuY3NzUnVsZXMgfHwgc3R5bGVTaGVldC5ydWxlcyB8fCBzdHlsZVNoZWV0LmltcG9ydHMgLyogSUUgPD0gOCovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoZWxlbS5pZCA9PSAiU3RhcnRQYW5lbCIpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGR1bXAoIiEiK3J1bGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCA7IHIgPCBydWxlcy5sZW5ndGggOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydWxlID0gcnVsZXNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnNlbGVjdG9yVGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JUZXh0ID0gcnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoc2VsZWN0b3JUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoLTIpLCAiaSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciByZSA9IG5ldyBSZWdFeHAoIiNpYzVkOThiNGU0OTg1YmQyMzE3NjkzNTA1ODZhNDQyZjAgbWVudSQiLCAiaSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAocmUudGVzdCgibWVudSNpYzVkOThiNGU0OTg1YmQyMzE3NjkzNTA1ODZhNDQyZjAgbWVudSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aC0yKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChzZWxlY3RvclRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSByZS50ZXN0KHNlbGVjdG9yVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChtYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gKHNlbGVjdG9yVGV4dCA9PSBuYW1lIHx8IHNlbGVjdG9yVGV4dCA9PSBlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKStuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBydWxlLnN0eWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShzdHlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEZ1bGxTdHlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGVzLnB1c2goc3R5bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGdldFN0eWxlVmFsdWUoc3R5bGUsIHN0eWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZS5wYXJlbnRSdWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoKGUpCiAgICB7CiAgICAgICAgdGhyb3coZSk7CiAgICB9CiAgICAKICAgIGlmIChnZXRGdWxsU3R5bGUpCiAgICB7CiAgICAgICAgLy9kdW1wKDEpOwogICAgICAgIHZhciBfc3R5bGUgPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gX3N0eWxlcy5sZW5ndGgtMSA7IGkgPj0gMCA7IGktLSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdHlsZSA9IF9zdHlsZXNbaV07CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gIlRFWFRBUkVBIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVtcChzdHlsZS5ib3JkZXIpOwogICAgICAgICAgICAgICAgZHVtcChzdHlsZS5ib3JkZXJMZWZ0KTsKICAgICAgICAgICAgICAgIGR1bXAoc3R5bGUuYm9yZGVyTGVmdFdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgLy9kdW1wKHN0eWxlLCBmYWxzZSwgMSk7CiAgICAgICAgICAgIC8vZm9yICh2YXIgaiBpbiBzdHlsZSkKICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAvL2R1bXAoaik7CiAgICAgICAgICAgICAgICAvL2R1bXAodHlwZW9mKHN0eWxlW2pdKSk7CiAgICAgICAgICAgIC8vICAgIGlmIChzdHlsZVtqXSAmJiAodHlwZW9mKHN0eWxlW2pdKSA9PSAic3RyaW5nIiAvKiBhbGwgKi8gfHwgdHlwZW9mKHN0eWxlW2pdKSA9PSAibnVtYmVyIikgLyogU2FmYXJpLCBDaHJvbWUgKi8gKQogICAgICAgICAgICAvLyAgICAgICAgX3N0eWxlW2pdID0gc3R5bGVbal07CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICAvL2JyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yICh2YXIgaiBpbiBzdHlsZSkgIC8vIElFLCBHZWNrbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoaik7CiAgICAgICAgICAgICAgICAvL2R1bXAodHlwZW9mKHN0eWxlW2pdKSk7CiAgICAgICAgICAgICAgICBpZiAoaiAhPSAic2VsZWN0aW9uRGlyZWN0aW9uIiAmJiBqICE9ICJzZWxlY3Rpb25TdGFydCIgJiYgaiAhPSAic2VsZWN0aW9uRW5kIikgLy8gR2Vja28gZml4CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlW2pdICYmICh0eXBlb2Yoc3R5bGVbal0pID09ICJzdHJpbmciIHx8IHR5cGVvZihzdHlsZVtqXSkgPT0gIm51bWJlciIgfHwgdHlwZW9mKHN0eWxlW2pdKSA9PSAiYm9vbGVhbiIpKQogICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGVbal0gPSBzdHlsZVtqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mKHN0eWxlKSAhPSAidW5kZWZpbmVkIiAmJiBzdHlsZS5sZW5ndGgpIC8vIENocm9tZSwgU2FmYXJpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCgiISEhISIrc3R5bGUubGVuZ3RoKQogICAgICAgICAgICAgICAgLy9kdW1wKF9zdHlsZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoIiEhISEiKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwIDsgaiA8IHN0eWxlLmxlbmd0aCA7IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHN0eWxlW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGVbY2FtZWxpemUoc3R5bGVbal0pXSA9IHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZHVtcChfc3R5bGUpOwogICAgICAgICAgICAgICAgLy9kdW1wKCIhISEhIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9kdW1wKF9zdHlsZSk7CiAgICAgICAgLyppZiAoZWxlbS50YWdOYW1lID09ICJURVhUQVJFQSIpCiAgICAgICAgewogICAgICAgICAgICBkdW1wKF9zdHlsZS5ib3JkZXIpOwogICAgICAgICAgICBkdW1wKF9zdHlsZS5ib3JkZXJMZWZ0KTsKICAgICAgICAgICAgZHVtcChfc3R5bGUuYm9yZGVyTGVmdFdpZHRoKTsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICByZXR1cm4oX3N0eWxlKTsKICAgIH0KICAgIGVsc2UKICAgICAgICByZXR1cm4odmFsdWUpOwp9CgpmdW5jdGlvbiBjb252ZXJ0Q1NTM1N0eWxlKHN0eWxlTmFtZSkKewogICAgc3R5bGVOYW1lID0gY2FtZWxpemUoc3R5bGVOYW1lKTsKICAgIGlmIChzdHlsZU5hbWUgPT0gInVzZXJTZWxlY3QiKQogICAgewogICAgICAgIC8vIFRPRE8gLSBhZGQgZmxleCwgZmxleC1kaXJlY3Rpb24gYW5kIG90aGVyIGJhY2sgY29tcGF0IENTUzMgcnVsZXMgYW5kIGNvbnZlcnQgdmFsdWVzIGRpc3BsYXk6IGZsZXggdG8gLS1tb3otZmxleC4uLgogICAgICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giKQogICAgICAgICAgICBzdHlsZU5hbWUgPSAibW96VXNlclNlbGVjdCI7CiAgICAgICAgZWxzZSBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgfHwgQnJvd3Nlci5uYW1lID09ICJFZGdlIikKICAgICAgICAgICAgc3R5bGVOYW1lID0gIm1zVXNlclNlbGVjdCI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzdHlsZU5hbWUgPSAid2Via2l0VXNlclNlbGVjdCI7CiAgICB9CiAgICByZXR1cm4oc3R5bGVOYW1lKTsKfQoKZnVuY3Rpb24gc2V0U3R5bGUoZWxlbSwgc3R5bGVOYW1lLCB2YWx1ZSkKewogICAgLy9zdHlsZU5hbWUgPSBjYW1lbGl6ZShzdHlsZU5hbWUpOwogICAgc3R5bGVOYW1lID0gY29udmVydENTUzNTdHlsZShzdHlsZU5hbWUpOwogICAgCiAgICAvL3ZhciBlbGVtWCA9IGVsZW07CiAgICBlbGVtID0gZ2V0RWxlbWVudChlbGVtKTsKICAgIGlmICghZWxlbSkKICAgIHsKICAgICAgICBfdGhyb3coInNldFN0eWxlKCk6IGVsZW0gbm90IGZvdW5kIik7CiAgICB9CiAgICAKICAgIC8qCiAgICBpZiAoIWVsZW0gfHwgIWVsZW0udGFnTmFtZSkKICAgIHsKICAgICAgICBhbGVydChlbGVtWCk7CiAgICAgICAgYWxlcnQodHlwZW9mKGVsZW1YKSk7CiAgICAgICAgYWxlcnQoZWxlbVgudGFnTmFtZSk7CiAgICB9CiAgICAqLwogICAgICAgIAogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gInN0cmluZyIgJiYgdmFsdWUuaW5kZXhPZiAmJiAodmFsdWUuaW5kZXhPZigiKz0iKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCItPSIpICE9IC0xKSkKICAgIHsKICAgICAgICB2YWx1ZUEgPSBleHRyYWN0RmxvYXQodmFsdWUsIDApOwogICAgICAgIHZhbHVlWCA9IGV4dHJhY3RGbG9hdChnZXRTdHlsZShlbGVtLCBzdHlsZU5hbWUpKTsKICAgICAgICAKICAgICAgICB2YWx1ZVggKz0gdmFsdWVBOwogICAgICAgIAogICAgICAgIHZhbHVlID0gdmFsdWVYKyJweCI7CiAgICB9CiAgICAKICAgIC8vIFRFWFRBUkVBIC0gRkYgc2V0cyBib3JkZXIgaW5zaWRlIGFuZCBsb3dlcnMgc2l6ZSBpbnNpZGUgLSBJRSBkb2VzIGl0IGxpa2UgRElWIC0gaXQncyBvawogICAgaWYgKHN0eWxlTmFtZSA9PSAib3V0ZXJXaWR0aCIpCiAgICB7CiAgICAgICAgLy9kdW1wKHZhbHVlKTsKICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbSwgImJveC1zaXppbmciKSAhPSAiYm9yZGVyLWJveCIpCiAgICAgICAgICAgIHZhbHVlID0gZ2V0UmVsYXRpdmVXaWR0aChlbGVtLCBleHRyYWN0RmxvYXQodmFsdWUsIDApKSsicHgiOwogICAgICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAgICAgc3R5bGVOYW1lID0gIndpZHRoIjsKICAgIH0KICAgIGlmIChzdHlsZU5hbWUgPT0gIm91dGVySGVpZ2h0IikKICAgIHsKICAgICAgICAvL2R1bXAodmFsdWUpOwogICAgICAgIGlmIChnZXRTdHlsZShlbGVtLCAiYm94LXNpemluZyIpICE9ICJib3JkZXItYm94IikKICAgICAgICAgICAgdmFsdWUgPSBnZXRSZWxhdGl2ZUhlaWdodChlbGVtLCBleHRyYWN0RmxvYXQodmFsdWUsIDApKSsicHgiOwogICAgICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAgICAgc3R5bGVOYW1lID0gImhlaWdodCI7CiAgICB9CiAgICAKICAgIGlmICgoc3R5bGVOYW1lID09ICJ3aWR0aCIgfHwgc3R5bGVOYW1lID09ICJoZWlnaHQiKSAmJiB0eXBlb2YoInZhbHVlIikgIT0gInVuZGVmaW5lZCIgJiYgdmFsdWUuaW5kZXhPZiAmJiAKICAgICAgICAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gInRleHRhcmVhIiB8fCAKICAgICAgICAgZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gInNlbGVjdCIgfHwgCiAgICAgICAgIGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJpbnB1dCIgfHwKICAgICAgICAgZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImJ1dHRvbiIpICYmCiAgICAgICAgICFkb2N1bWVudC5hbGwgJiYgdmFsdWUuaW5kZXhPZigiJSIpID09IC0xICYmIHZhbHVlICE9ICJhdXRvIikKICAgIHsKICAgICAgICB2YXIgc3R5bGUgPSBnZXRTdHlsZShlbGVtKTsKICAgICAgICB2YWx1ZSA9IGV4dHJhY3RJbnQodmFsdWUsIDApOwogICAgICAgIGlmIChzdHlsZU5hbWUgPT0gIndpZHRoIikKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlICs9IGV4dHJhY3RGbG9hdChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDApOwogICAgICAgICAgICB2YWx1ZSArPSBleHRyYWN0RmxvYXQoc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCwgMCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHlsZU5hbWUgPT0gImhlaWdodCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSArPSBleHRyYWN0RmxvYXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgsIDApOwogICAgICAgICAgICB2YWx1ZSArPSBleHRyYWN0RmxvYXQoc3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDApOwogICAgICAgIH0KICAgICAgICB2YWx1ZSArPSAicHgiOwogICAgfQogICAgCiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDw9IDggJiYgdHlwZW9mKCJ2YWx1ZSIpICE9ICJ1bmRlZmluZWQiICYmIHZhbHVlLmluZGV4T2YgJiYgdmFsdWUuaW5kZXhPZigiIWltcG9ydGFudCIpID4gLTEpCiAgICB7CiAgICAgICAgdmFsdWUgPSB0cmltKHZhbHVlLnJlcGxhY2UoIiFpbXBvcnRhbnQiLCAiIikpOwogICAgfQogICAgCiAgICAvL2lmIChlbGVtLnRhZ05hbWUgPT0gIkZPUk0iICYmIGVsZW0uc3R5bGUudGFnTmFtZSkgLy8gaWYgdGhlcmUgaXMgc29tZSA8aW5wdXQgbmFtZT0nc3R5bGUnPiwgZWxlbS5zdHlsZSBpcyBvdmVycmlkZW4gYnkgdGhpcyBpbnB1dCBlbGVtZW50CiAgICB2YXIgaW5wdXRFbGVtcyA9IFtdOwogICAgdmFyIGlucHV0UHJldlNpYmxpbmdzID0gW107CiAgICB2YXIgaW5wdXRQYXJlbnROb2RlcyA9IFtdOwogICAgCiAgICAvKgogICAgLy8gZml4ZWQgYnkgcmVwbGFjaW5nIG5hbWU9InN0eWxlIiBieSBuYW1lPSJfX19zdHlsZSIKICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gIkZPUk0iKSAvLyBpZiB0aGVyZSBpcyBzb21lIDxpbnB1dCBuYW1lPSdzdHlsZSc+LCBlbGVtLnN0eWxlIGlzIG92ZXJyaWRlbiBieSB0aGlzIGlucHV0IGVsZW1lbnQKICAgIHsKICAgICAgICAvL2FsZXJ0KGVsZW0uc3R5bGUpOwogICAgICAgIC8vIGNoZWNrIGlmIG5vdCBvdmVyd3JpdHRlbiAuc3R5bGUgYXR0cmlidXRlIGJ5IDxpbnB1dCBuYW1lPSdzdHlsZSc+CiAgICAgICAgaW5wdXRFbGVtcyA9IGdldEVsZW1lbnRzQnlBdHRyaWJ1dGUoIm5hbWUiLCAic3R5bGUiLCBlbGVtKTsKICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGlucHV0RWxlbXMubGVuZ3RoIDsgaWkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlucHV0UHJldlNpYmxpbmdzLnB1c2goZ2V0UHJldlNpYmxpbmcoaW5wdXRFbGVtc1tpaV0pKTsKICAgICAgICAgICAgaW5wdXRQYXJlbnROb2Rlcy5wdXNoKGlucHV0RWxlbXNbaWldLnBhcmVudE5vZGUpOwogICAgICAgICAgICAKICAgICAgICAgICAgcmVtb3ZlTm9kZShpbnB1dEVsZW1zW2lpXSk7CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgLy9hbGVydChlbGVtLnN0eWxlKTsKICAgIH0KICAgICovCiAgICAKICAgIGlmIChzdHlsZU5hbWUgPT0gImZsb2F0IikKICAgICAgICBzdHlsZU5hbWUgPSAiY3NzRmxvYXQiOwogICAgICAgIAogICAgLy9hbGVydChzdHlsZU5hbWUrIjogIit2YWx1ZSk7CiAgICAKICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gIkZPUk0iICYmIGVsZW0uaW5uZXJIVE1MLmluZGV4T2YoIiBuYW1lPVwic3R5bGVcIiIpID4gLTEpCiAgICB7CiAgICAgICAgX3Rocm93KCJzZXRTdHlsZSgpOiBGT1JNIGVsZW1lbnRzIGNvbnRhaW5zIGlucHV0IHdpdGggbmFtZT0nc3R5bGUnIik7CiAgICB9CiAgICAKICAgIC8vZHVtcCh0eXBlb2YoZWxlbS5zdHlsZSkpOwogICAgZWxlbS5zdHlsZVtzdHlsZU5hbWVdID0gdmFsdWU7CgogICAgLyoKICAgIGlmIChpbnB1dEVsZW1zLmxlbmd0aCkKICAgIHsKICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGlucHV0RWxlbXMubGVuZ3RoIDsgaWkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpbnB1dFByZXZTaWJsaW5nc1tpaV0pCiAgICAgICAgICAgICAgICBpbnNlcnRBZnRlcihpbnB1dFByZXZTaWJsaW5nc1tpaV0sIGlucHV0RWxlbXNbaWldKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYXBwZW5kRmlyc3QoaW5wdXRQYXJlbnROb2Rlc1tpaV0sIGlucHV0RWxlbXNbaWldKTsKICAgICAgICB9CiAgICB9CiAgICAqLwogICAgCiAgICAvL2R1bXAodmFsdWUpOwogICAgLy9kdW1wKGVsZW0uc3R5bGVbc3R5bGVOYW1lXSk7Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uTmFtZShmdW5jKQp7CiAgICBzdGFydFByb2ZpbGVyKCJnZXRGdW5jdGlvbk5hbWUoKSIpOwoKICAgIHZhciByZXQgPSBmdW5jLm5hbWU7CiAgICBpZiAoIXJldCkKICAgIHsKICAgICAgICAvLyBJRSAtIHRyeSB0byBwYXJzZSBzdHJpbmcgZHVtcCBvZiBmdW5jdGlvbgogICAgICAgIHZhciBtYXRjaCA9IGZ1bmMudG9TdHJpbmcoKS5tYXRjaCgvXmZ1bmN0aW9uIChbXihdKykvKTsKICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pCiAgICAgICAgewogICAgICAgICAgICByZXQgPSBtYXRjaFsxXTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmICghcmV0KQogICAgewogICAgICAgIC8vIElFIDw9IDggLSBmcm9tIGxvYWRTY3JpcHQoKSAgICB3aW5kb3dbJ2Z1bmNOYW1lJ10gPSBmdW5jdGlvbihhcmdzKQogICAgICAgIC8vaWYgKEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiICYmIEJyb3dzZXIudmVyc2lvbiA8PSA4KSAvLyAhISEhIGRvIG5vdCB1c2UgQnJvd3NlciBoZXJlIC0gbm90IGluaXRpYWxpemVkIHdoaWxlIGNhbGxpbmcgYWR2IGRlYnVnIGZ1bmN0aW9uIG1vZGlmaWVyIChzZWUgYmVsb3cpCiAgICAgICAgaWYgKHR5cGVvZihCcm93c2VyKSAhPSAidW5kZWZpbmVkIiAmJiBCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOCB8fCB0eXBlb2YoQnJvd3NlcikgPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuYWxsLyogJiYgQnJvd3Nlci52ZXJzaW9uIDw9IDgqLykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gd2luZG93KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2FsZXJ0KGkpOwogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gInByb3RvdHlwZSIgJiYgd2luZG93W2ldICYmIHdpbmRvd1tpXS50b1N0cmluZyAmJiBmdW5jLnRvU3RyaW5nICYmIHdpbmRvd1tpXS50b1N0cmluZygpID09IGZ1bmMudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAoIXJldCkKICAgIHsKICAgICAgICAvLyBsYXN0IHBvc2liaWxpdHkKICAgICAgICByZXQgPSBleHRlbmRlZEZ1bmN0aW9uc1tmdW5jLnRvU3RyaW5nKCldOwogICAgfSAgICAKICAgIAogICAgc3RvcFByb2ZpbGVyKCJnZXRGdW5jdGlvbk5hbWUoKSIpOwogICAgcmV0dXJuKHJldCk7CiAgICAvL3JldHVybigiIik7Cn0KCi8vIHNvbWUgYnJvd3NlcnMgKG9wZXJhLCBjaHJvbWUpIGRvZXMgbm90IGFsbG93IG1vZGlmeSBleC4gRXZlbnQgb2JqZWN0LCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdlIGNsb25lIGl0IGFzIG1vZGlmaWFibGUgT2JqZWN0CmZ1bmN0aW9uIGNsb25lT2JqZWN0KG8pCnsKICAgIHZhciBvYmogPSB7fTsKICAgIGZvciAodmFyIGkgaW4gbykKICAgIHsKICAgICAgICBvYmpbaV0gPSBvW2ldOwogICAgfQogICAgCiAgICByZXR1cm4ob2JqKTsKfQoKZnVuY3Rpb24gY2xvbmVQcm90b3R5cGUobykKewogICAgZnVuY3Rpb24gQ2xvbmVGYWN0b3J5KCl7fTsKICAgIENsb25lRmFjdG9yeS5wcm90b3R5cGUgPSBvOwoKICAgIHJldHVybiBuZXcgQ2xvbmVGYWN0b3J5KCk7Cn0KICAgIApmdW5jdGlvbiBjbG9uZU9iamVjdFByb3RvdHlwZShvLCBjbGFzc2VzKQp7CiAgICB2YXIgcCA9IGNsb25lUHJvdG90eXBlKG8pOwogICAgCiAgICBmb3IgKHZhciBpIGluIHApCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihwW2ldKSA9PSAiZnVuY3Rpb24iICYmIG8uX2NvbXBpbGVkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBwYXJlbnRDbGFzc05hbWUgPSAnJzsKICAgICAgICAgICAgZm9yICh2YXIgaWkgaW4gY2xhc3NlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRDbGFzc05hbWUpCiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2xhc3NOYW1lID0gaWk7CiAgICAgICAgICAgICAgICBpZiAoaS5pbmRleE9mKGlpKyJfIikgPT09IDAgfHwgaS5pbmRleE9mKCJwYXJlbnRfIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZm91bmQpCiAgICAgICAgICAgICAgICBwW3BhcmVudENsYXNzTmFtZSsiXyIraV0gPSBwW2ldOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4ocCk7Cn0KCiAgICAvKgpmdW5jdGlvbiBjbG9uZVByb3RvdHlwZShvLCBjaGlsZENsYXNzLCBwYXJlbnRDbGFzc2VzKQp7CiAgICBmdW5jdGlvbiBDbG9uZUZhY3RvcnkoKXt9OwogICAgQ2xvbmVGYWN0b3J5LnByb3RvdHlwZSA9IG87CgogICAgLy9yZXR1cm4gbmV3IENsb25lRmFjdG9yeSgpOwoKICAgIHZhciBwID0gbmV3IENsb25lRmFjdG9yeSgpOwogICAgCiAgICBpZiAoY2hpbGRDbGFzcyAmJiAhby5fY29tcGlsZWQpCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSBpbiBwKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZihwW2ldKSA9PSAnZnVuY3Rpb24nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzUHJlZml4ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoaS5pbmRleE9mKCJwYXJlbnRfIikgPT09IDApCiAgICAgICAgICAgICAgICAgICAgaGFzUHJlZml4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWk8cGFyZW50Q2xhc3Nlcy5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpLmluZGV4T2YocGFyZW50Q2xhc3Nlc1tpaV0rIl8iKSA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJlZml4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghaGFzUHJlZml4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vaWYgKGkuaW5kZXhPZigiY3JlYXRlIikgIT0gLTEpCiAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgLy8gICAgZHVtcChpKTsKICAgICAgICAgICAgICAgICAgICAvLyAgICBkdW1wKG9baV0pOwogICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgIC8vcFtjaGlsZENsYXNzKyJfIitpXSA9IHBbaV07CiAgICAgICAgICAgICAgICAgICAgcFtwYXJlbnRDbGFzc2VzWzBdKyJfIitpXSA9IHBbaV07CiAgICAgICAgICAgICAgICAgICAgcFsicGFyZW50XyIraV0gPSBwW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHA7Cn0KKi8KCi8vX19leHRlbmRDbGFzc0V2YWxzID0gIiI7CgpmdW5jdGlvbiBleHRlbmRDbGFzcyhjaGlsZENsYXNzLCBwYXJlbnRDbGFzcykKewogICAgLy9kdW1wKGNoaWxkQ2xhc3MpOwogICAgc3RhcnRQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKSIpOwogICAgc3RhcnRQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKToxIik7CiAgICBpZiAodHlwZW9mKGNoaWxkQ2xhc3MpID09ICJzdHJpbmciICYmICF3aW5kb3dbZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpXSkKICAgIHsKICAgICAgICB2YXIgY29kZSA9IHBhcmVudENsYXNzLnRvU3RyaW5nKCkucmVwbGFjZShuZXcgUmVnRXhwKCJmdW5jdGlvbiAiK2dldEZ1bmN0aW9uTmFtZShwYXJlbnRDbGFzcyksICJnIiksICJmdW5jdGlvbiAiK2NoaWxkQ2xhc3MpOwogICAgICAgIGNvZGUgKz0gIjsgd2luZG93WyciK2NoaWxkQ2xhc3MrIiddPSIrY2hpbGRDbGFzcysiOyI7CiAgICAgICAgLy9jb2RlICs9ICJhbGVydChvYmopOyI7CiAgICAgICAgc3RhcnRQcm9maWxlcigiZXZhbCIpOwogICAgICAgIHN0YXJ0UHJvZmlsZXIoImV4dGVuZENsYXNzKCk6OmV2YWwtMSIpOwogICAgICAgIHdpbmRvdy5ldmFsKGNvZGUpOwogICAgICAgIHN0b3BQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKTo6ZXZhbC0xIik7CiAgICAgICAgc3RvcFByb2ZpbGVyKCJldmFsIik7CiAgICAgICAgY2hpbGRDbGFzcyA9IHdpbmRvd1tjaGlsZENsYXNzXTsKICAgICAgICAvL2FsZXJ0KGNvZGUpOwogICAgICAgIC8vYWxlcnQoZXZhbCgiY2hpbGRDbGFzcyIpKTsKICAgICAgICAvL2FsZXJ0KGNoaWxkQ2xhc3MpOwogICAgICAgIC8vYWxlcnQodHlwZW9mKGNoaWxkQ2xhc3MpKTsKICAgICAgICAvL2FsZXJ0KGdldEZ1bmN0aW9uTmFtZShwYXJlbnRDbGFzcykpOwogICAgICAgIC8vYWxlcnQod2luZG93W2dldEZ1bmN0aW9uTmFtZShwYXJlbnRDbGFzcyldKTsKICAgICAgICAvL2FsZXJ0KHBhcmVudENsYXNzLnRvU3RyaW5nKCkpOwogICAgfQogICAgCiAgICB2YXIgY2hpbGRDbGFzc05hbWUgPSBnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcyk7CiAgICB2YXIgcGFyZW50Q2xhc3NOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHBhcmVudENsYXNzKTsKCiAgICAvLyBpZiBhZGRlZCBhbm90aGVyIHNpbWlsYXIgcHJvcGVydGllcywgc2VlIGlmIGNvbmRpdGlvbiBiZWxvdyBhbmQgYWRkIGl0IHRvbwogICAgY2hpbGRDbGFzcy5wcm90b3R5cGUucGFyZW50Q2xhc3NOYW1lID0gcGFyZW50Q2xhc3NOYW1lOwogICAgY2hpbGRDbGFzcy5wcm90b3R5cGUuaW5oZXJpdHMgPSBwYXJlbnRDbGFzcy5wcm90b3R5cGUuaW5oZXJpdHMgfHwgW107CiAgICBjaGlsZENsYXNzLnByb3RvdHlwZS5pbmhlcml0cyA9IFtdLmNvbmNhdChwYXJlbnRDbGFzc05hbWUsIGNoaWxkQ2xhc3MucHJvdG90eXBlLmluaGVyaXRzKTsKICAgIAogICAgcGFyZW50Q2xhc3MucHJvdG90eXBlLl9jbGFzc05hbWUgPSBwYXJlbnRDbGFzc05hbWU7CiAgICAKICAgIC8vIHVzZWQgaW4gbG9vcCB0byBkaXNhYmxlIHBhcmVudF9wYXJlbnRfY3JlYXRlKCkgb3IgVENvbXBvbmVudF9UT2JqZWN0X2NyZWF0ZSgpIG9yIFRDb21wb25lbnRfcGFyZW50Xy4uLigpCiAgICB2YXIgcHJlZml4SXRlbXMgPSBwYXJlbnRDbGFzcy5wcm90b3R5cGUuaW5oZXJpdHMgfHwgW107CiAgICBwcmVmaXhJdGVtcyA9IFtdLmNvbmNhdCgicGFyZW50IiwgcGFyZW50Q2xhc3NOYW1lLCBwcmVmaXhJdGVtcyk7CiAgICAvL2FsZXJ0KHByZWZpeEl0ZW1zKTsKCiAgICBzdG9wUHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MSIpOwogICAgc3RhcnRQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKToyIik7CiAgICBmb3IgKHZhciBpIGluIHBhcmVudENsYXNzLnByb3RvdHlwZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHBhcmVudENsYXNzLnByb3RvdHlwZVtpXSkgPT0gImZ1bmN0aW9uIikKICAgICAgICB7CiAgICAgICAgICAgIHN0YXJ0UHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MmEiKTsKICAgICAgICAgICAgdmFyIGZuY0JvZHkgPSBwYXJlbnRDbGFzcy5wcm90b3R5cGVbaV0udG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIGZuY05hbWUgPSBpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9pZiAoY2hpbGRDbGFzc05hbWUgPT0gIlREaXJlY3RvcnlUcmVlIikKICAgICAgICAgICAgLy8gICAgYWxlcnQoZm5jTmFtZSk7CgogICAgICAgICAgICAvLyBvbW1pdCBwYXJlbnRfcGFyZW50X2NyZWF0ZSgpIG9yIFRDb21wb25lbnRfVE9iamVjdF9jcmVhdGUoKSBvciBUQ29tcG9uZW50X3BhcmVudF8uLi4oKQogICAgICAgICAgICB2YXIgcHJlZml4Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBwID0gMCA7IHAgPCBwcmVmaXhJdGVtcy5sZW5ndGggOyBwKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vaWYgKGkuaW5kZXhPZihwcmVmaXhJdGVtc1twXSsiXyIpID4gLTEpCiAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgIC8vICAgIHByZWZpeENvdW50Kys7CiAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgIHByZWZpeENvdW50ICs9IGkuY291bnRPZihwcmVmaXhJdGVtc1twXSsiXyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vYWxlcnQocHJlZml4Q291bnQpOwogICAgICAgICAgICAvL2lmIChjaGlsZENsYXNzTmFtZSA9PSAiVERpcmVjdG9yeVRyZWUiKQogICAgICAgICAgICAvLyAgICBhbGVydChmbmNOYW1lKyI6ICIrcHJlZml4Q291bnQpOwogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAocHJlZml4Q291bnQgPCAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmbmNCb2R5ID0gZm5jQm9keS5yZXBsYWNlKC90aGlzXC5wYXJlbnRfL2csICJ0aGlzLiIrcGFyZW50Q2xhc3MucHJvdG90eXBlLnBhcmVudENsYXNzTmFtZSsiXyIpOwogICAgICAgICAgICAgICAgZm5jQm9keSA9IGZuY0JvZHkucmVwbGFjZSgvdGhpc1wuX2NsYXNzTmFtZS9nLCAiXCIiK3BhcmVudENsYXNzTmFtZSsiXCIiKTsKCiAgICAgICAgICAgICAgICAvL3ZhciBqcyA9IGdldEZ1bmN0aW9uTmFtZShjaGlsZENsYXNzKSsiLnByb3RvdHlwZVsnIitmbmNOYW1lKyInXSA9ICIrZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpKyIucHJvdG90eXBlWyciK2dldEZ1bmN0aW9uTmFtZShwYXJlbnRDbGFzcykrIl8iK2ZuY05hbWUrIiddID0gIitnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcykrIi5wcm90b3R5cGVbJ3BhcmVudF8iK2ZuY05hbWUrIiddID0gIitmbmNCb2R5OwogICAgICAgICAgICAgICAgdmFyIGpzID0gZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpKyIucHJvdG90eXBlWyciK2dldEZ1bmN0aW9uTmFtZShwYXJlbnRDbGFzcykrIl8iK2ZuY05hbWUrIiddID0gIitnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcykrIi5wcm90b3R5cGVbJ3BhcmVudF8iK2ZuY05hbWUrIiddID0gIitmbmNCb2R5OwogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGpzID0gIiI7CiAgICAgICAgICAgIC8vaWYgKGZuY0JvZHkuaW5kZXhPZigidGhpcy5fY2xhc3NOYW1lIikgIT0gLTEpCiAgICAgICAgICAgIC8vICAgIGFsZXJ0KGZuY0JvZHkpOwoKICAgICAgICAgICAgZm5jQm9keSA9IGZuY0JvZHkucmVwbGFjZSgvey8sICJ7XG52YXIgZXh0ZW5kQ2xhc3NEdW1teSA9IFwiIitjaGlsZENsYXNzTmFtZSsiLiIrZm5jTmFtZSsiXCI7Iik7IC8vIGplbm9tIGFieWNoIHZlZGVsIHByaSBhbGVydChmdW5jdGlvbiBib2R5KQogICAgICAgICAgICAvL2ZuY0JvZHkgPSAidmFyIGV4dGVuZENsYXNzRHVtbXkgPSBcIiIrY2hpbGRDbGFzc05hbWUrIi4iK2ZuY05hbWUrIlwiO1xuIitmbmNCb2R5CiAgICAgICAgICAgIC8vZm5jQm9keSA9ICIvKiAiK2NoaWxkQ2xhc3NOYW1lKyIuIitmbmNOYW1lKyIgKi9cbiIrZm5jQm9keQoKICAgICAgICAgICAgc3RvcFByb2ZpbGVyKCJleHRlbmRDbGFzcygpOjJhIik7CgogICAgICAgICAgICBzdGFydFByb2ZpbGVyKCJleHRlbmRDbGFzcygpOjJiIik7CgogICAgICAgICAgICBpZiAocHJlZml4Q291bnQgPT0gMSB8fCBwcmVmaXhDb3VudCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmbmNCb2R5ID0gZm5jQm9keS5yZXBsYWNlKC90aGlzXC5wYXJlbnRfL2csICJ0aGlzLiIrcGFyZW50Q2xhc3MucHJvdG90eXBlLnBhcmVudENsYXNzTmFtZSsiXyIpOwogICAgICAgICAgICAgICAgZm5jQm9keSA9IGZuY0JvZHkucmVwbGFjZSgvdGhpc1wuX2NsYXNzTmFtZS9nLCAiXCIiK3BhcmVudENsYXNzTmFtZSsiXCIiKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHBhcmVudENsYXNzLnByb3RvdHlwZS5fY29tcGlsZWQgJiYgcHJlZml4Q291bnQgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL2pzID0gY2hpbGRDbGFzc05hbWUrIi5wcm90b3R5cGVbJyIrZm5jTmFtZSsiJ10gPSAiK2NoaWxkQ2xhc3NOYW1lKyIucHJvdG90eXBlWydwYXJlbnRfIitmbmNOYW1lKyInXSA9ICIrZm5jQm9keTsKICAgICAgICAgICAgICAgICAgICBqcyA9IGNoaWxkQ2xhc3NOYW1lKyIucHJvdG90eXBlWyciK2ZuY05hbWUrIiddID0gIitjaGlsZENsYXNzTmFtZSsiLnByb3RvdHlwZVsncGFyZW50XyIrZm5jTmFtZSsiJ10gPSAiK2NoaWxkQ2xhc3NOYW1lKyIucHJvdG90eXBlWyciK2NoaWxkQ2xhc3NOYW1lKyJfIitmbmNOYW1lKyInXSA9ICIrZm5jQm9keTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeENvdW50ID09IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9mbmNCb2R5ID0gZm5jQm9keS5yZXBsYWNlKC90aGlzXC5wYXJlbnRfL2csICJ0aGlzLiIrcGFyZW50Q2xhc3MucHJvdG90eXBlLnBhcmVudENsYXNzTmFtZSsiXyIpOwogICAgICAgICAgICAgICAgICAgIC8vZm5jQm9keSA9IGZuY0JvZHkucmVwbGFjZSgvdGhpc1wuX2NsYXNzTmFtZS9nLCAiXCIiK3BhcmVudENsYXNzTmFtZSsiXCIiKTsKCiAgICAgICAgICAgICAgICAgICAgLy9qcyA9IGdldEZ1bmN0aW9uTmFtZShjaGlsZENsYXNzKSsiLnByb3RvdHlwZVsnIitnZXRGdW5jdGlvbk5hbWUocGFyZW50Q2xhc3MpKyJfIitmbmNOYW1lKyInXSA9ICIrZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpKyIucHJvdG90eXBlWydwYXJlbnRfIitmbmNOYW1lKyInXSA9ICIrZm5jQm9keTsKICAgICAgICAgICAgICAgICAgICBqcyA9IGNoaWxkQ2xhc3NOYW1lKyIucHJvdG90eXBlWyciK2ZuY05hbWUrIiddID0gIitmbmNCb2R5OwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoanMpOwogICAgICAgICAgICAgICAgICAgIC8vanMgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeENvdW50ID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpID09ICJURGlyZWN0b3J5VHJlZSIpIGFsZXJ0KHBhcmVudENsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpID09ICJURGlyZWN0b3J5VHJlZSIpIGFsZXJ0KGZuY0JvZHkpOwogICAgICAgICAgICAgICAgICAgIC8vZm5jQm9keSA9IGZuY0JvZHkucmVwbGFjZSgvdGhpc1wucGFyZW50Xy9nLCAidGhpcy4iK3BhcmVudENsYXNzLnByb3RvdHlwZS5wYXJlbnRDbGFzc05hbWUrIl8iKTsKICAgICAgICAgICAgICAgICAgICAvL2ZuY0JvZHkgPSBmbmNCb2R5LnJlcGxhY2UoL3RoaXNcLl9jbGFzc05hbWUvZywgIlwiIitwYXJlbnRDbGFzc05hbWUrIlwiIik7CgogICAgICAgICAgICAgICAgICAgIC8vanMgPSBnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcykrIi5wcm90b3R5cGVbJyIrZ2V0RnVuY3Rpb25OYW1lKHBhcmVudENsYXNzKSsiXyIrZm5jTmFtZSsiJ10gPSAiK2dldEZ1bmN0aW9uTmFtZShjaGlsZENsYXNzKSsiLnByb3RvdHlwZVsncGFyZW50XyIrZm5jTmFtZSsiJ10gPSAiK2ZuY0JvZHk7CiAgICAgICAgICAgICAgICAgICAganMgPSBjaGlsZENsYXNzTmFtZSsiLnByb3RvdHlwZVsnIitmbmNOYW1lKyInXSA9ICIrY2hpbGRDbGFzc05hbWUrIi5wcm90b3R5cGVbJyIrcGFyZW50Q2xhc3NOYW1lKyJfIitmbmNOYW1lKyInXSA9ICIrY2hpbGRDbGFzc05hbWUrIi5wcm90b3R5cGVbJ3BhcmVudF8iK2ZuY05hbWUrIiddID0gIitmbmNCb2R5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0b3BQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKToyYiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9hbGVydChmbmNOYW1lKTsKICAgICAgICAgICAgLy9pZiAocGFyZW50Q2xhc3MucHJvdG90eXBlLl9jb21waWxlZCAmJiBmbmNOYW1lLmluZGV4T2YoImFzc2lnbk9iamVjdFRvRWxlbWVudCIpID4gLTEpCiAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgLy9hbGVydChmbmNOYW1lKTsKICAgICAgICAgICAgICAgIC8vYWxlcnQoanMpOwogICAgICAgICAgICAvL30KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChqcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnRQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKToyYyIpOwogICAgICAgICAgICAgICAgLy9pZiAoY2hpbGRDbGFzc05hbWUgPT0gIlREaXJlY3RvcnlUcmVlIi8qICYmIGZuY05hbWUuaW5kZXhPZigiY3JlYXRlIikgIT0gLTEqLykKICAgICAgICAgICAgICAgIC8vICAgIGFsZXJ0KGpzKTsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vaWYgKGdldEZ1bmN0aW9uTmFtZShjaGlsZENsYXNzKSA9PSAiVFBhbmVsIikKICAgICAgICAgICAgICAgICAgICAvLyAgICBhbGVydChqcyk7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpID09ICJUTG9hZGluZ0FuaW1hdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgLy8gICAgYWxlcnQoanMpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2lmIChnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcykgPT0gIlRUcmVlIikgYWxlcnQoanMpOwogICAgICAgICAgICAgICAgICAgIHN0YXJ0UHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MmMxIik7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChldmFsKTsKICAgICAgICAgICAgICAgICAgICBzdGFydFByb2ZpbGVyKCJldmFsIik7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKTo6ZXZhbC0yIik7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGpzKTsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZXZhbChqcyk7CiAgICAgICAgICAgICAgICAgICAgc3RvcFByb2ZpbGVyKCJleHRlbmRDbGFzcygpOjpldmFsLTIiKTsKICAgICAgICAgICAgICAgICAgICBzdG9wUHJvZmlsZXIoImV2YWwiKTsKICAgICAgICAgICAgICAgICAgICAvL19fZXh0ZW5kQ2xhc3NFdmFscyA9IF9fZXh0ZW5kQ2xhc3NFdmFscyArIGpzKyJcblxuIjsKICAgICAgICAgICAgICAgICAgICBzdG9wUHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MmMxIik7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcykpOwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KHdpbmRvd1tnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcyldKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KHdpbmRvd1tnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcyldLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChmbmNOYW1lKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KHdpbmRvd1tnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcyldLnByb3RvdHlwZVsicGFyZW50XyIrZm5jTmFtZV0pOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHN0YXJ0UHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MmMyIik7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAoZHVtcFN0YWNrKQogICAgICAgICAgICAgICAgICAgIC8vICAgIGR1bXAod2luZG93W2NoaWxkQ2xhc3NOYW1lXS5wcm90b3R5cGVbZm5jTmFtZV0udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeENvdW50ID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRnVuY3Rpb25zW3dpbmRvd1tjaGlsZENsYXNzTmFtZV0ucHJvdG90eXBlW2ZuY05hbWVdLnRvU3RyaW5nKCldID0gY2hpbGRDbGFzc05hbWUrIi4iK2ZuY05hbWU7ICAKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmVmaXhDb3VudCA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEZ1bmN0aW9uc1t3aW5kb3dbY2hpbGRDbGFzc05hbWVdLnByb3RvdHlwZVtmbmNOYW1lXS50b1N0cmluZygpXSA9IGV4dGVuZGVkRnVuY3Rpb25zW3dpbmRvd1tjaGlsZENsYXNzTmFtZV0ucHJvdG90eXBlWyJwYXJlbnRfIitmbmNOYW1lXS50b1N0cmluZygpXSA9IGNoaWxkQ2xhc3NOYW1lKyIucGFyZW50XyIrZm5jTmFtZTsgIAogICAgICAgICAgICAgICAgICAgIHN0b3BQcm9maWxlcigiZXh0ZW5kQ2xhc3MoKToyYzIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygpOwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoImV4dGVuZENsYXNzKCkgZXJyb3I6ICIrZSsiXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIranMpOwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoImV4dGVuZENsYXNzKCkgZXJyb3I6ICIrZSsiXG5cbiIranMpOwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoY2hpbGRDbGFzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2lmIChjaGlsZENsYXNzTmFtZSA9PSAiVERpcmVjdG9yeVRyZWUiLyogJiYgZm5jTmFtZS5pbmRleE9mKCJjcmVhdGUiKSAhPSAtMSovKQogICAgICAgICAgICAgICAgLy8gICAgYWxlcnQoY2hpbGRDbGFzcy5wcm90b3R5cGUuY3JlYXRlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9jaGlsZENsYXNzLnByb3RvdHlwZVtpXSA9IHBhcmVudENsYXNzLnByb3RvdHlwZVtpXTsKICAgICAgICAgICAgICAgIGV4dGVuZGVkRnVuY3Rpb25zW3dpbmRvd1tnZXRGdW5jdGlvbk5hbWUoY2hpbGRDbGFzcyldLnByb3RvdHlwZVtmbmNOYW1lXS50b1N0cmluZygpXSA9IGdldEZ1bmN0aW9uTmFtZShjaGlsZENsYXNzKSsiLiIrZm5jTmFtZTsgIAogICAgICAgICAgICAgICAgc3RvcFByb2ZpbGVyKCJleHRlbmRDbGFzcygpOjJjIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaSAhPSAicGFyZW50Q2xhc3NOYW1lIiAmJiBpICE9ICJpbmhlcml0cyIpCiAgICAgICAgewogICAgICAgICAgICBjaGlsZENsYXNzLnByb3RvdHlwZVtpXSA9IHBhcmVudENsYXNzLnByb3RvdHlwZVtpXTsKICAgICAgICB9CgogICAgICAgIC8vY2hpbGRDbGFzcy5wcm90b3R5cGVbInBhcmVudF8iK2ldID0gcGFyZW50Q2xhc3MucHJvdG90eXBlW2ldOyAvLyB0byBlbmFibGUgY2FsbCBwYXJlbnQ6Om1ldGhvZAogICAgfQogICAgY2hpbGRDbGFzcy5wcm90b3R5cGUuX2NsYXNzTmFtZSA9IGNoaWxkQ2xhc3NOYW1lOwogICAgY2hpbGRDbGFzcy5wcm90b3R5cGUuX2NvbXBpbGVkID0gZmFsc2U7CiAgICBzdG9wUHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MiIpOwoKICAgIHN0YXJ0UHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MyIpOwogICAgLy9pZiAoZ2V0RnVuY3Rpb25OYW1lKGNoaWxkQ2xhc3MpID09ICJURGlyZWN0b3J5VHJlZSIpIGFsZXJ0KCJmaW5pc2hlZCIpOwogICAgLy9jaGlsZENsYXNzLnByb3RvdHlwZS5USElTID0gcGFyZW50Q2xhc3M7CiAgICAKICAgIC8vIHRyeSB0byBmaW5kIHNjcmlwdCBVUkwKICAgIGlmIChfX2xvYWRTY3JpcHRVcmwpIC8vIHNldCB1cCBieSBsb2FkU2NyaXB0KCkKICAgIHsKICAgICAgICB2YXIgdXJsID0gX19sb2FkU2NyaXB0VXJsOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOyAKICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tzY3JpcHRzLmxlbmd0aC0xXTsgCgogICAgICAgIHZhciB1cmwgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCdzcmMnLCAyKTsKICAgIH0KICAgIGlmICh1cmwpCiAgICB7CiAgICAgICAgY2hpbGRDbGFzcy5wcm90b3R5cGUuc2NyaXB0VXJsID0gdXJsOwogICAgICAgIHVybCA9IHVybC5zcGxpdCgiLyIpOwogICAgICAgIHVybC5zcGxpY2UodXJsLmxlbmd0aC0xKTsKICAgICAgICBjaGlsZENsYXNzLnByb3RvdHlwZS5zY3JpcHRQYXRoID0gdXJsLmpvaW4oIi8iKSsiLyI7CiAgICB9CiAgICBlbHNlCiAgICAgICAgX3Rocm93KCdleHRlbmRDbGFzczogY2hpbGRDbGFzcy5wcm90b3R5cGUuc2NyaXB0UGF0aCBub3QgZm91bmQnKTsKCiAgICBzdG9wUHJvZmlsZXIoImV4dGVuZENsYXNzKCk6MyIpOwogICAgc3RvcFByb2ZpbGVyKCJleHRlbmRDbGFzcygpIik7Cn0KCnZhciBleHRlbmRGdW5jdGlvbkNvdW50ZXIgPSAxOwp2YXIgZXh0ZW5kZWRGdW5jdGlvbnMgPSB7fTsKZnVuY3Rpb24gZXh0ZW5kRnVuY3Rpb24oZnVuYywgcmVwbGFjZUZ1bmMpCnsKICAgIHZhciBmbmNJID0gZ2V0RnVuY3Rpb25JbmZvKGZ1bmMpOwogICAgdmFyIG5hbWUgPSBmbmNJWyJuYW1lIl0sIGZ1bmNCID0gZm5jSVsiYm9keSJdLCBmdW5jQSA9IGZuY0lbImFyZ3MiXTsKCiAgICBpZiAoIW5hbWUpCiAgICAgICAgdGhyb3coJ2V4dGVuZEZ1bmN0aW9uOiBuYW1lIG5vdCBmb3VuZCcpOwogICAgCiAgICB2YXIgZm5jSVIgPSBnZXRGdW5jdGlvbkluZm8ocmVwbGFjZUZ1bmMpOwogICAgdmFyIHJlcGxhY2VGdW5jQiA9IGZuY0lSWyJib2R5Il07CiAgICByZXBsYWNlRnVuY0IgPSByZXBsYWNlRnVuY0IucmVwbGFjZSgvcGFyZW50XCgvZywgbmFtZSsiXyIrZXh0ZW5kRnVuY3Rpb25Db3VudGVyKyIoIik7CiAgICByZXBsYWNlRnVuY0IgPSByZXBsYWNlRnVuY0IucmVwbGFjZSgvXChhdXRvXCkvZywgIigiK2Z1bmNBKyIpIik7CgogICAgLy92YXIgcmVwbGFjZUZ1bmNTID0gcmVwbGFjZUZ1bmMudG9TdHJpbmcoKTsKICAgIC8vdmFyIHJlcGxhY2VGdW5jQlAgPSByZXBsYWNlRnVuY1Muc2VhcmNoKC8oeykvKTsKICAgIC8vcmVwbGFjZUZ1bmNTID0gcmVwbGFjZUZ1bmNTLnN1YnN0cihyZXBsYWNlRnVuY0JQKzEsIHJlcGxhY2VGdW5jUy5sZW5ndGgtcmVwbGFjZUZ1bmNCUC0yKTsKICAgIC8vcmVwbGFjZUZ1bmNTID0gcmVwbGFjZUZ1bmNTLnJlcGxhY2UoL3BhcmVudFwoL2csIG5hbWUrIl8iK2V4dGVuZEZ1bmN0aW9uQ291bnRlcisiKCIpOwogICAgLy9yZXBsYWNlRnVuY1MgPSByZXBsYWNlRnVuY1MucmVwbGFjZSgvXChhdXRvXCkvZywgIigiK2Z1bmNBKyIpIik7CiAgICAKICAgIHZhciBmdW5jWCA9ICIiOwogICAgZnVuY1ggKz0gbmFtZSsiID0gZnVuY3Rpb24oIitmdW5jQSsiKSB7XG4iOwogICAgLy9mdW5jWCArPSAiZnVuY3Rpb24gIituYW1lKyIoIitmdW5jQSsiKSB7XG4iOwogICAgZnVuY1ggKz0gIiAgIGZ1bmN0aW9uICIrbmFtZSsiXyIrZXh0ZW5kRnVuY3Rpb25Db3VudGVyKyIoIitmdW5jQSsiKSB7XG4iOwogICAgZnVuY1ggKz0gIiAgICIrZnVuY0IrIlxuIjsKICAgIGZ1bmNYICs9ICIgICB9XG4iOwogICAgaWYgKHJlcGxhY2VGdW5jQi5pbmRleE9mKG5hbWUrIl8iK2V4dGVuZEZ1bmN0aW9uQ291bnRlcisiKCIrZnVuY0ErIik7IikgPT0gLTEpCiAgICAgICAgZnVuY1ggKz0gIiAgICIrbmFtZSsiXyIrZXh0ZW5kRnVuY3Rpb25Db3VudGVyKyIoIitmdW5jQSsiKTsgXG4iOwogICAgZnVuY1ggKz0gIiAgICIrcmVwbGFjZUZ1bmNCOwogICAgZnVuY1ggKz0gIn1cbiI7CiAgICAKICAgIC8vYWxlcnQoZnVuY1gpOwogICAgdHJ5IAogICAgewogICAgICAgIHN0YXJ0UHJvZmlsZXIoImV2YWwiKTsKICAgICAgICBzdGFydFByb2ZpbGVyKCJleHRlbmRGdW5jdGlvbigpOjpldmFsIik7CiAgICAgICAgd2luZG93LmV2YWwoZnVuY1gpOwogICAgICAgIHN0b3BQcm9maWxlcigiZXh0ZW5kRnVuY3Rpb24oKTo6ZXZhbCIpOwogICAgICAgIHN0b3BQcm9maWxlcigiZXZhbCIpOwogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICB0aHJvdygiZXh0ZW5kRnVuY3Rpb246ICIrZSsiXG5cbiIrZnVuY1gpOwogICAgfQogICAgCiAgICBleHRlbmRlZEZ1bmN0aW9uc1t3aW5kb3dbbmFtZV0udG9TdHJpbmcoKV0gPSBuYW1lOwogICAgCiAgICAvL2R1bXAobmFtZSk7CiAgICAvL2R1bXAoc2V0SHRtbCk7CiAgICAKICAgIGV4dGVuZEZ1bmN0aW9uQ291bnRlcisrOwp9CgpmdW5jdGlvbiBmdW5jdGlvbkRlZmluZWQoZnVuYykKewogICAgdmFyIGZ1bmNJID0gZ2V0RnVuY3Rpb25JbmZvKGZ1bmMpOwogICAgCiAgICByZXR1cm4odHJpbShmdW5jSVsiYm9keSJdKSAhPSAiIik7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCByZXBsYWNlRnVuYykKewogICAgZXh0ZW5kTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgcmVwbGFjZUZ1bmMsICJyZXBsYWNlIik7Cn0KCmZ1bmN0aW9uIGV4dGVuZE1ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIHJlcGxhY2VGdW5jLCBwb3NpdGlvbikKewogICAgc3RhcnRQcm9maWxlcigiZXh0ZW5kTWV0aG9kKCkiKTsKCiAgICBpZiAodHlwZW9mKHBvc2l0aW9uKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwb3NpdGlvbiA9ICJhZnRlciI7CiAgICAgICAgCiAgICAvL2FsZXJ0KHR5cGVvZihvYmplY3QpKTsKICAgIC8vYWxlcnQob2JqZWN0LmlkKTsKICAgIC8vZHVtcChvYmplY3QuaWQpOwogICAgdmFyIG9iamVjdE5hbWUgPSAiIjsKICAgIGlmICh0eXBlb2Yob2JqZWN0KSA9PSAic3RyaW5nIikKICAgIHsKICAgICAgICBvYmplY3ROYW1lID0gb2JqZWN0OwogICAgICAgIG9iamVjdCA9IHdpbmRvd1tvYmplY3RdOwogICAgICAgIC8vYWxlcnQob2JqZWN0ICsgdHlwZW9mKG9iamVjdCkpOwogICAgfQogICAgCiAgICBpZiAodHlwZW9mKG9iamVjdCkgIT0gIm9iamVjdCIgfHwgKCFvYmplY3QuaWQgJiYgIW9iamVjdE5hbWUpKQogICAgewogICAgICAgIF90aHJvdygiZXh0ZW5kTWV0aG9kKCk6IG9iamVjdCBtdXN0IGJlIGRlcml2ZWQgZnJvbSBUT2JqZWN0Iik7CiAgICAgICAgLy9kdW1wKG9iamVjdCk7CiAgICAgICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCgogICAgLy9hbGVydCgxKTsKICAgIHZhciBuYW1lID0gbWV0aG9kTmFtZTsKCiAgICBpZiAodHlwZW9mKG9iamVjdFttZXRob2ROYW1lXSkgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgX3Rocm93KCJleHRlbmRNZXRob2QoKSAtIG1ldGhvZCAnIittZXRob2ROYW1lKyInIG9uIG9iamVjdCAiK29iamVjdC5jbGFzc05hbWUrIiMiK29iamVjdC5pZCsiIGlzIHVuZGVmaW5lZCIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAoKICAgIHZhciBmbmNJID0gZ2V0RnVuY3Rpb25JbmZvKG9iamVjdFttZXRob2ROYW1lXSk7CiAgICB2YXIgZnVuY0IgPSBmbmNJWyJib2R5Il0sIGZ1bmNBID0gZm5jSVsiYXJncyJdOwogICAgaWYgKHR5cGVvZihyZXBsYWNlRnVuYykgPT0gInN0cmluZyIpCiAgICB7CiAgICAgICAgdmFyIHJlcGxhY2VGdW5jQiA9IHJlcGxhY2VGdW5jOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBmbmNJUiA9IGdldEZ1bmN0aW9uSW5mbyhyZXBsYWNlRnVuYyk7CiAgICAgICAgLy9kdW1wKHJlcGxhY2VGdW5jKTsKICAgICAgICAvL2R1bXAoZm5jSVIpOwogICAgICAgIHZhciByZXBsYWNlRnVuY0IgPSBmbmNJUlsiYm9keSJdOwogICAgfQoKICAgIGlmICghb2JqZWN0TmFtZSkKICAgICAgICBmdW5jTyA9ICJnZXRPYmplY3QoJyIrb2JqZWN0LmlkKyInKSI7CiAgICBlbHNlCiAgICB7CiAgICAgICAgZnVuY08gPSAid2luZG93WyciK29iamVjdE5hbWUrIiddIjsKICAgIH0KICAgIAogICAgdmFyIGZ1bmNYID0gIiI7CiAgICBpZiAoZnVuY08pCiAgICB7CiAgICAgICAgZnVuY1ggKz0gZnVuY08rIi4iK25hbWUrIiA9IGZ1bmN0aW9uKCIrZnVuY0ErIikge1xuIjsKICAgICAgICBpZiAocG9zaXRpb24gPT0gImFmdGVyIikKICAgICAgICAgICAgZnVuY1ggKz0gIiAgICIrZnVuY0IrIlxuIjsKICAgICAgICBmdW5jWCArPSAiICAgIityZXBsYWNlRnVuY0IrIlxuIjsKICAgICAgICBpZiAocG9zaXRpb24gPT0gImJlZm9yZSIpCiAgICAgICAgICAgIGZ1bmNYICs9ICIgICAiK2Z1bmNCKyJcbiI7CiAgICAgICAgZnVuY1ggKz0gIn1cbiI7CiAgICB9CiAgICAKICAgIHN0YXJ0UHJvZmlsZXIoImV2YWwiKTsKICAgIHN0YXJ0UHJvZmlsZXIoImV4dGVuZE1ldGhvZCgpOjpldmFsIik7CiAgICB3aW5kb3cuZXZhbChmdW5jWCk7CiAgICBzdG9wUHJvZmlsZXIoImV4dGVuZE1ldGhvZCgpOjpldmFsIik7CiAgICBzdG9wUHJvZmlsZXIoImV2YWwiKTsKCiAgICBzdG9wUHJvZmlsZXIoImV4dGVuZE1ldGhvZCgpIik7Cn0KCi8qCmZ1bmN0aW9uIGdldE9mZnNldFdpZHRoKGVsZW0pCnsKICAgIGlmIChkb2N1bWVudC5hbGwpCiAgICB7CiAgICAgICAgcmV0dXJuIChlbGVtLm9mZnNldFdpZHRoICsgZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAiYm9yZGVyLWxlZnQtd2lkdGgiKSwgMCkgKyBleHRyYWN0SW50KGdldFN0eWxlKGVsZW0sICJib3JkZXItcmlnaHQtd2lkdGgiKSwgMCkpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybiBlbGVtLm9mZnNldFdpZHRoOwp9CgpmdW5jdGlvbiBnZXRPZmZzZXRIZWlnaHQoZWxlbSkKewogICAgaWYgKGRvY3VtZW50LmFsbCkKICAgIHsKICAgICAgICByZXR1cm4gKGVsZW0ub2Zmc2V0SGVpZ2h0ICsgZXh0cmFjdEludChnZXRTdHlsZShlbGVtLCAiYm9yZGVyLXRvcC13aWR0aCIpLCAwKSArIGV4dHJhY3RJbnQoZ2V0U3R5bGUoZWxlbSwgImJvcmRlci1ib3R0b20td2lkdGgiKSwgMCkpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybiBlbGVtLm9mZnNldEhlaWdodDsKfQoqLwoKZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KHN0eWxlKQp7CiAgICBpZiAodHlwZW9mKHN0eWxlKSA9PSAic3RyaW5nIiAmJiBzdHlsZS5pbmRleE9mKCJodHRwIikgPT0gMCkKICAgIHsKICAgICAgICAvL2FsZXJ0KHN0eWxlKTsKICAgICAgICB2YXIgZWxlbSA9IGNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgICAgICBlbGVtLmhyZWYgPSBzdHlsZTsKICAgICAgICBlbGVtLnJlbCA9ICJzdHlsZXNoZWV0IjsKICAgICAgICBlbGVtLnR5cGUgPSAidGV4dC9jc3MiOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBlbGVtID0gY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICBlbGVtLnR5cGUgPSAidGV4dC9jc3MiOwogICAgICAgIGVsZW0ubWVkaWEgPSAiYWxsIjsKICAgICAgICAKICAgICAgICBpZihlbGVtLnN0eWxlU2hlZXQpCiAgICAgICAgeyAvLyBJRQogICAgICAgICAgICBlbGVtLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHN0eWxlOwogICAgICAgIH0gCiAgICAgICAgZWxzZSAKICAgICAgICB7IC8vIFczQwogICAgICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNyZWF0ZVRleHROb2RlKHN0eWxlKSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oZWxlbSk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQpCnsKICAgIHJldHVybihkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7Cn0KCnZhciBfX2llQWZ0ZXJFbGVtID0gbnVsbDsKZnVuY3Rpb24gYWRkU3R5bGUoc3R5bGUsIGRvYywgYWZ0ZXJFbGVtKQp7CiAgICBpZiAodHlwZW9mKGRvYykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgZG9jID0gZG9jdW1lbnQ7CiAgICAKICAgIGlmICghZG9jKQogICAgICAgIF90aHJvdygiYWRkU3R5bGUoKSAtIGRvY3VtZW50IG5vdCBmb3VuZCIpOwogICAgCiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDw9IDEwKSAvLyB0aGV5IHNhaWQgdGhlcmUgaXMgbm8gbGltaXQgaW4gSUUxMCAtIHRoZXkgbGllZCEgaXQgd29ya3Mgb25seSBmb3IgaHRtbCBzb3VyY2UgZWxlbWVudHMsIGJ1dCBpbnNlcnRpbmcgc3RpbGwgbWVldHMgbGltaXRzCiAgICB7CiAgICAgICAgLy9kdW1wKCJhZGRTdHlsZSgpOiBkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg6ICIrZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTsKICAgICAgICAKICAgICAgICAvLyBjYW5ub3QgdXNlIGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQgLSB0aHJvd3MgZXJyb3IgTm90IGVub3VnaCBzdG9yYWdlIGlzIGF2YWlsYWJsZSB0byBjb21wbGV0ZSB0aGlzIG9wZXJhdGlvbi4gKElFIGhhcyBsaW1pdCBvZiAzMSBzdHlsZXNoZWV0cyA6RCA6RCBvbWcgd2h5PyBkbyB3ZSBoYXZlIGFsbCAxNmtCIFJBTSBhbmQgMjg2IHByb2Nlc3NvcnM/KQogICAgICAgIGlmICh0eXBlb2Yoc3R5bGUpID09ICJvYmplY3QiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFkb2Muc3R5bGVTaGVldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgZG9jLmNyZWF0ZVN0eWxlU2hlZXQoc3R5bGUuaHJlZikKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZG9jLnN0eWxlU2hlZXRzW2RvYy5zdHlsZVNoZWV0cy5sZW5ndGgtMV0uYWRkSW1wb3J0KHN0eWxlLmhyZWYpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3R5bGUuaW5kZXhPZigiaHR0cDovLyIpID09IDAgfHwgc3R5bGUuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PSAwIHx8IChzdHlsZS5pbmRleE9mKCIvIikgPT0gMCAmJiBzdHlsZS5pbmRleE9mKCIvKiIpICE9IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWRvYy5zdHlsZVNoZWV0cy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgZG9jLmNyZWF0ZVN0eWxlU2hlZXQoc3R5bGUuaHJlZikKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJFbGVtKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2llQWZ0ZXJFbGVtKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2llQWZ0ZXJFbGVtID0gY3JlYXRlU3R5bGVFbGVtZW50KCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZShhZnRlckVsZW0sIF9faWVBZnRlckVsZW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF9faWVBZnRlckVsZW0uc3R5bGVTaGVldC5hZGRJbXBvcnQoc3R5bGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5zdHlsZVNoZWV0c1tkb2Muc3R5bGVTaGVldHMubGVuZ3RoLTFdLmFkZEltcG9ydChzdHlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhZ2FpbiBhIGxpbWl0YXRpb24gb2YgbWF4IDMxIHN0eWxlc2hlZXRzCiAgICAgICAgICAgICAgICBpZiAoIWRvYy5oZWFkLl9fc3R5bGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKDApOwogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9jc3MiKTsKICAgICAgICAgICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbGVtKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGRvYy5oZWFkLl9fc3R5bGUgPSBlbGVtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICAgICAgLy9kdW1wKGRvYy5zdHlsZVNoZWV0cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBkb2MuaGVhZC5fX3N0eWxlOwogICAgICAgICAgICAgICAgaWYgKGVsZW0uc3R5bGVTaGVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlU2hlZXQuY3NzVGV4dCArPSAiXG4iK3N0eWxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coJ0lFIENTUyAzMSBmaWxlcy80MDk2IHJ1bGVzIGxpbWl0IHJlYWNoZWQuLi4gKCcrZG9jLnN0eWxlU2hlZXRzLmxlbmd0aCsnKScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZHVtcCgyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy92YXIgZWxlbSA9IGNyZWF0ZVN0eWxlRWxlbWVudChzdHlsZSk7CiAgICAgICAgICAgICAgICAvL2RvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGVsZW0pOwogICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZG9jdW1lbnQuc3R5bGVTaGVldHNbZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoLTFdLmFkZEltcG9ydCh1cmwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICh0eXBlb2Yoc3R5bGUpID09ICJvYmplY3QiKQogICAgICAgIHsKICAgICAgICAgICAgZWxlbSA9IHN0eWxlOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3R5bGUuaW5kZXhPZigiaHR0cDovLyIpID09IDAgfHwgc3R5bGUuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PSAwIHx8IChzdHlsZS5pbmRleE9mKCIvIikgPT0gMCAmJiBzdHlsZS5pbmRleE9mKCIvKiIpICE9IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IGNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgICAgICAgICAgICAgIGVsZW0ucmVsID0gInN0eWxlc2hlZXQiOwogICAgICAgICAgICAgICAgZWxlbS50eXBlID0gInRleHQvY3NzIjsKICAgICAgICAgICAgICAgIGVsZW0uaHJlZiA9IHN0eWxlOwogICAgICAgICAgICAgICAgZWxlbS5tZWRpYSA9ICJzY3JlZW4iOyAvLyBJRSBuZWVkZWQKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZhciBlbGVtID0gY3JlYXRlU3R5bGVFbGVtZW50KHN0eWxlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChlbGVtKTsKICAgICAgICBpZiAoYWZ0ZXJFbGVtKQogICAgICAgICAgICBpbnNlcnRBZnRlcihhZnRlckVsZW0sIGVsZW0pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWxlbSk7CiAgICB9CiAgICAKICAgIHJldHVybihlbGVtKTsKfQoKZnVuY3Rpb24gZ2V0VGFnKG5vZGUsIGluZGV4KQp7CiAgICBpZiAodHlwZW9mKGluZGV4KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBpbmRleCA9IDA7CiAgICAKICAgIGlmICh0eXBlb2Yobm9kZSkgPT0gInN0cmluZyIpCiAgICB7CiAgICAgICAgd2hpbGUobm9kZVtpbmRleF0gIT0gIjwiICYmIGluZGV4IDwgbm9kZS5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICBpbmRleCsrOyAgICAKICAgICAgICB9CiAgICAKICAgICAgICB2YXIgZW5kID0gaW5kZXgrMTsKICAgICAgICB3aGlsZShub2RlW2VuZF0gIT0gIj4iICYmIGVuZCA8IG5vZGUubGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgZW5kKys7CiAgICAgICAgfQogICAgICAgIHJldHVybihub2RlLnN1YnN0cmluZyhpbmRleCwgZW5kKzEpKTsKICAgIH0KICAgIGVsc2UKICAgICAgICByZXR1cm4oZ2V0VGFnKG91dGVySFRNTChub2RlKSkpOwp9CgpmdW5jdGlvbiBnZXRUYWdOYW1lKG5vZGUsIHN0YXJ0SW5kZXgpCnsKICAgIGlmICh0eXBlb2Yobm9kZSkgPT0gInN0cmluZyIpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihzdGFydEluZGV4KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7CiAgICAKICAgICAgICB2YXIgaSA9IHN0YXJ0SW5kZXgrMTsKICAgICAgICB3aGlsZShub2RlW2ldICE9ICIgIiAmJiBub2RlW2ldICE9ICI+IikKICAgICAgICB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAKICAgICAgICByZXR1cm4obm9kZS5zdWJzdHJpbmcoc3RhcnRJbmRleCsxLCBpKSk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKCn0KCnZhciBzaW5nbGVUYWdOYW1lcyA9IFsiYnIiLCAiaHIiLCAiaW1nIiwgImlucHV0IiwgIm1ldGEiLCAiYXJlYSIsICJiYXNlIiwgImJhc2Vmb250IiwgImxpbmsiXTsKdmFyIGZvcm1UYWdOYW1lcyA9IFsiaW5wdXQiLCAidGV4dGFyZWEiLCAiYnV0dG9uIiwgInNlbGVjdCJdOwoKZnVuY3Rpb24gaW5uZXJIVE1MKG5vZGUsIHN0YXJ0SW5kZXgpCnsKICAgIGlmICh0eXBlb2Yobm9kZSkgPT0gInN0cmluZyIpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihzdGFydEluZGV4KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7CgogICAgICAgIHZhciB0YWdOYW1lID0gZ2V0VGFnTmFtZShub2RlLCBzdGFydEluZGV4KTsKICAgICAgICAvL2R1bXAoIiEiK3RhZ05hbWUpOwogICAgICAgIGlmIChpbl9hcnJheSh0YWdOYW1lLCBzaW5nbGVUYWdOYW1lcykpCiAgICAgICAgICAgIHJldHVybigiIik7CiAgICAgICAgCiAgICAgICAgdmFyIHN0YXJ0ID0gc3RhcnRJbmRleCtnZXRUYWcobm9kZSwgc3RhcnRJbmRleCkubGVuZ3RoOwogICAgICAgIHZhciBpbmRleCA9IHN0YXJ0OwogICAgICAgIC8vZHVtcChpbmRleCk7CiAgICAgICAgdmFyIGNudCA9IDA7CiAgICAgICAgd2hpbGUodHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiLS06ICIrbm9kZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4KzQpKTsKICAgICAgICAgICAgaWYgKG5vZGUuaW5kZXhPZigiPCIrdGFnTmFtZSwgaW5kZXgpID09PSBpbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vZGUuaW5kZXhPZigiPC8iK3RhZ05hbWUsIGluZGV4KSA9PT0gaW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjbnQgPT0gMCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4obm9kZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgY250LS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgIGlmIChpbmRleCA9PSBub2RlLmxlbmd0aCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oIiIpOwogICAgfQogICAgCiAgICByZXR1cm4obm9kZS5pbm5lckhUTUwpOwp9CgpmdW5jdGlvbiBvdXRlckhUTUwobm9kZSwgc3RhcnRJbmRleCkKewogICAgaWYgKHR5cGVvZihub2RlKSA9PSAic3RyaW5nIikKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHN0YXJ0SW5kZXgpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBzdGFydEluZGV4ID0gMDsKCiAgICAgICAgdmFyIHJldCA9IGdldFRhZyhub2RlLCBzdGFydEluZGV4KTsKICAgICAgICByZXQgKz0gaW5uZXJIVE1MKG5vZGUsIHN0YXJ0SW5kZXgpOwogICAgICAgIHJldCArPSAiPC8iK2dldFRhZ05hbWUobm9kZSwgc3RhcnRJbmRleCkrIj4iOwogICAgICAgICAgICAKICAgICAgICByZXR1cm4ocmV0KTsKICAgIH0KICAgIAogICAgaWYgKG5vZGUgLyogJiYgbm9kZS50YWdOYW1lKi8pCiAgICB7CiAgICAgICAgaWYgKHRydWUgfHwgbm9kZS50YWdOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIElFLCBDaHJvbWUgdGFrZSB0aGUgaW50ZXJuYWwgbWV0aG9kIG90aGVyd2lzZSBidWlsZCBvbmUKICAgICAgICAgICAgICAgIHZhciByZXQgPSAvKm5vZGUub3V0ZXJIVE1MIHx8ICovICgKICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obil7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGg7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSBkb2N1bWVudCkKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCggbi5jbG9uZU5vZGUodHJ1ZSkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXYuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJvdXRlckhUTUwobm9kZSk6IG5vZGUgaXMgZG9jdW1lbnQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oIiIpOwogICAgICAgICAgICAgICAgICB9KShub2RlKTsKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4ocmV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdygib3V0ZXJIVE1MKG5vZGUpOiBlcnJvciIpOwogICAgICAgICAgICAgICAgLy9yZXR1cm4oIiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSBURVhUX05PREUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4obm9kZS50ZXh0Q29udGVudCk7CiAgICAgICAgfQogICAgICAgICovCiAgICB9CiAgICByZXR1cm4oIiIpOwp9OwoKCgpmdW5jdGlvbiBjcmVhdGVFdmVudChuYW1lKQp7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgZS5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7CgogICAgLy8gdG8gYWRkIGN1c3RvbSBtZXRob2RzCiAgICBlID0gZ2V0RXZlbnQoZSk7CiAgICAKICAgIHJldHVybihlKTsKfQoKZnVuY3Rpb24gY3JlYXRlTW91c2VFdmVudChuYW1lKQp7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7CiAgICBlLmluaXRNb3VzZUV2ZW50KG5hbWUsIHRydWUsIHRydWUpOwogICAgCiAgICAvLyB0byBhZGQgY3VzdG9tIG1ldGhvZHMKICAgIGUgPSBnZXRFdmVudChlKTsKCiAgICByZXR1cm4oZSk7Cn0KCmZ1bmN0aW9uIGdldEV2ZW50KGUpCnsKICAgIGUgPSBlID8gZSA6IHdpbmRvdy5ldmVudDsKICAgIGlmIChlKQogICAgewogICAgICAgIGUudGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50OwogICAgICAgIAogICAgICAgIGlmICghZS5wcmV2ZW50RGVmYXVsdCkgLy8gSUUgPCA5CiAgICAgICAgewogICAgICAgICAgICB2YXIgX2UgPSBlOwogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBfZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgX2UuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghZS5fcHJldmVudERlZmF1bHQpIC8vIElFIDExIGFuZCBjdXN0b20gY3JlYXRlZCBldmVudHMKICAgICAgICB7CiAgICAgICAgICAgIGUuX3ByZXZlbnREZWZhdWx0ID0gZS5wcmV2ZW50RGVmYXVsdDsKCiAgICAgICAgICAgIHZhciBfZSA9IGU7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIF9lLl9wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgX2UuX2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCFlLmlzRGVmYXVsdFByZXZlbnRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfZSA9IGU7CiAgICAgICAgICAgIGUuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4oX2UuX2RlZmF1bHRQcmV2ZW50ZWQpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCFlLnN0b3BQcm9wYWdhdGlvbikgLy8gSUUgPCA5CiAgICAgICAgewogICAgICAgICAgICB2YXIgX2UgPSBlOwogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgX2UuY2FuY2VsQnViYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIHZhciBfZSA9IGU7CgogICAgICAgIGUuc3RvcCA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIF9lLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBfZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KCiAgICAgICAgZS5nZXRUYXJnZXRCeVRhZ05hbWUgPSBmdW5jdGlvbih0YWdOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRhcmdldCA9IF9lLnRhcmdldDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHdoaWxlKHRhcmdldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZSAmJiB0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZ05hbWUudG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4odGFyZ2V0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybihudWxsKTsKICAgICAgICB9OwoKICAgICAgICBlLmdldFRhcmdldCA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihfZS5fdGFyZ2V0IHx8IF9lLnRhcmdldCB8fCBfZS5zcmNFbGVtZW50KTsKICAgICAgICB9OwoKICAgICAgICBlLnNldFRhcmdldCA9IGZ1bmN0aW9uKGVsZW0pCiAgICAgICAgewogICAgICAgICAgICBfZS5fdGFyZ2V0ID0gZWxlbTsKICAgICAgICB9OwogICAgfQogICAgCiAgICByZXR1cm4oZSk7Cn0KCmZ1bmN0aW9uIGdldEtleUV2ZW50KGUpCnsKICAgIGUgPSBnZXRFdmVudChlKTsKICAgIGlmIChlKQogICAgewogICAgICAgIGlmICghZS5rZXlDb2RlKQogICAgICAgICAgICBlLmtleUNvZGUgPSBlLndoaWNoOwogICAgICAgICAgICAKICAgICAgICBpZiAoIWUua2V5Q29kZSAmJiBlLmNoYXJDb2RlKQogICAgICAgIHsKICAgICAgICAgICAgZS5rZXlDb2RlID0gZS5jaGFyQ29kZTsKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA+PSA5NyAmJiBlLmtleUNvZGUgPD0gMTIyKQogICAgICAgICAgICAgICAgZS5rZXlDb2RlIC09IDMyOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybihlKTsKfQoKZnVuY3Rpb24gZ2V0TW91c2VFdmVudChlKQp7CiAgICBlID0gZ2V0RXZlbnQoZSk7CiAgICAKICAgIGlmIChlKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZS53aGljaCkgPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mKGUuYnV0dG9uKSAhPSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5hbGwpIC8vIElFIDw9IDgKICAgICAgICB7CiAgICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PSAxKSAvLyBMRUZUCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUud2hpY2ggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDIpICAvLyBSSUdIVAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlLndoaWNoID0gMzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlLmJ1dHRvbiA9PSA0KSAvLyBNSURETEUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS53aGljaCA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOCAmJiBlLmJ1dHRvbiA9PSAwKSB8fCBlLndoaWNoID09IDEpCiAgICAgICAgICAgIGUuYnV0dG9uS2V5Q29kZSA9IFZLX0xCVVRUT047CiAgICAgICAgZWxzZSBpZiAoZS53aGljaCA9PSAzKQogICAgICAgICAgICBlLmJ1dHRvbktleUNvZGUgPSBWS19SQlVUVE9OOwogICAgICAgIGVsc2UgaWYgKGUud2hpY2ggPT0gMikKICAgICAgICAgICAgZS5idXR0b25LZXlDb2RlID0gVktfTUJVVFRPTjsKICAgIH0KICAgIHJldHVybihlKTsKfQoKZnVuY3Rpb24gaXNVVUlEKHN0cikKewogICAgaWYgKHR5cGVvZihzdHIpICE9ICJzdHJpbmciKQogICAgewogICAgICAgIHJldHVybihmYWxzZSk7CiAgICB9ICAgIAoKICAgIHJldHVybihzdHIubWF0Y2goL15bMC05QS1GXXs4fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXsxMn0kL2kpKTsKfQoKCmZ1bmN0aW9uIGluc2VydEFmdGVyKG5vZGUsIG5ld05vZGUpCnsKICAgIHRyeQogICAgewogICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKQogICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIG5vZGUubmV4dFNpYmxpbmcpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpOwogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICBfdGhyb3coJ2luc2VydEFmdGVyKCk6ICcrZSk7CiAgICAgICAgLy9kdW1wKG5vZGUucGFyZW50Tm9kZSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEZ1bmN0aW9uQ2FsbCgpCnsKICAgIGVycm9yID0gIiI7CiAgICAKICAgIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKICAgIHZhciByZXQgPSBbXTsKICAgIHZhciBhbnRpTG9vcCA9IDA7CiAgICB3aGlsZShjYWxsZXIpCiAgICB7CiAgICAgICAgcmV0LnB1c2goY2FsbGVyKTsKICAgICAgICAvL2R1bXAoY2FsbGVyLmFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyKTsKICAgICAgICAKICAgICAgICBjYWxsZXIgPSBjYWxsZXIuY2FsbGVyOwogICAgICAgIAogICAgICAgIGFudGlMb29wKys7CiAgICAgICAgaWYgKGFudGlMb29wID4gMTAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0LnB1c2goImxvb3AiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4ocmV0KTsKfQoKZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKG5vZGUsIG5ld05vZGUpCnsKICAgIGlmICh0eXBlb2Yobm9kZSkgPT0gInN0cmluZyIgJiYgbm9kZSkKICAgICAgICBub2RlID0gZ2V0RWxlbWVudChub2RlKTsKCiAgICBpZiAodHlwZW9mKG5ld05vZGUpID09ICJzdHJpbmciICYmIG5ld05vZGUpCiAgICAgICAgbmV3Tm9kZSA9IGdldEVsZW1lbnQobmV3Tm9kZSk7CgogICAgdHJ5CiAgICB7CiAgICAgICAgbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCBub2RlKTsKICAgIH0KICAgIGNhdGNoKGUpCiAgICB7CiAgICAgICAgX3Rocm93KCdpbnNlcnRCZWZvcmUoKTogJytlKTsKICAgIH0KfQoKZnVuY3Rpb24gYXBwZW5kRmlyc3Qobm9kZSwgbmV3Tm9kZSkKewogICAgaWYgKHR5cGVvZihub2RlKSA9PSAic3RyaW5nIiAmJiBub2RlKQogICAgICAgIG5vZGUgPSBnZXRFbGVtZW50KG5vZGUpOwoKICAgIGlmICh0eXBlb2YobmV3Tm9kZSkgPT0gInN0cmluZyIgJiYgbmV3Tm9kZSkKICAgICAgICBuZXdOb2RlID0gZ2V0RWxlbWVudChuZXdOb2RlKTsKCiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDw9IDggJiYgbm9kZSA9PSBkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICJjb21wbGV0ZSIpCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe2FwcGVuZEZpcnN0KG5vZGUsIG5ld05vZGUpfSwgMTAwKTsKICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBrdnVsaSBJRQogICAgICAgIGlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmIG5ld05vZGUgPT0gbm9kZS5jaGlsZE5vZGVzWzBdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIGlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoKQogICAgICAgICAgICBub2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCBub2RlLmNoaWxkTm9kZXNbMF0pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTsKICAgIH0KfQoKZnVuY3Rpb24gYXBwZW5kTGFzdChub2RlLCBuZXdOb2RlKQp7CiAgICBpZiAodHlwZW9mKG5vZGUpID09ICJzdHJpbmciICYmIG5vZGUpCiAgICAgICAgbm9kZSA9IGdldEVsZW1lbnQobm9kZSk7CgogICAgaWYgKHR5cGVvZihuZXdOb2RlKSA9PSAic3RyaW5nIiAmJiBuZXdOb2RlKQogICAgICAgIG5ld05vZGUgPSBnZXRFbGVtZW50KG5ld05vZGUpOwoKICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOCAmJiBub2RlID09IGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImNvbXBsZXRlIikKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YXBwZW5kTGFzdChub2RlLCBuZXdOb2RlKX0sIDEwMCk7CiAgICBlbHNlCiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTsKfQoKdmFyIGFwcGVuZENoaWxkID0gYXBwZW5kTGFzdDsKCmZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkKewogICAgaWYgKHR5cGVvZihub2RlKSA9PSAic3RyaW5nIiAmJiBub2RlKQogICAgICAgIG5vZGUgPSBnZXRFbGVtZW50KG5vZGUpOwoKICAgIG9uUmVtb3ZlTm9kZShub2RlKTsKICAgIAogICAgdmFyIHByZXZTaWJsaW5nID0gZ2V0UHJldlNpYmxpbmcobm9kZSk7CiAgICB2YXIgbmV4dFNpYmxpbmcgPSBnZXROZXh0U2libGluZyhub2RlKTsKCiAgICBpZiAobm9kZS5wYXJlbnROb2RlKQogICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgIAogICAgaWYgKHByZXZTaWJsaW5nICYmIHByZXZTaWJsaW5nLm5vZGVUeXBlID09IFRFWFRfTk9ERSAmJiBwcmV2U2libGluZy5ub2RlVmFsdWUgJiYgcHJldlNpYmxpbmcubm9kZVZhbHVlICE9IFpXU1AgJiYgbmV4dFNpYmxpbmcgJiYgbmV4dFNpYmxpbmcubm9kZVR5cGUgPT0gVEVYVF9OT0RFICYmIG5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBuZXh0U2libGluZy5ub2RlVmFsdWUgIT0gWldTUCkKICAgIHsKICAgICAgICBwcmV2U2libGluZy5ub2RlVmFsdWUgKz0gbmV4dFNpYmxpbmcubm9kZVZhbHVlOwogICAgICAgIHJlbW92ZU5vZGUobmV4dFNpYmxpbmcpOwogICAgfQoKICAgIHJldHVybihub2RlKTsKfQoKZnVuY3Rpb24gb25SZW1vdmVOb2RlKG5vZGUpCnsKfQogICAgCmZ1bmN0aW9uIHJlcGxhY2VOb2RlKG5vZGUsIG5ld05vZGUpCnsKICAgIGlmICh0eXBlb2Yobm9kZSkgPT0gInN0cmluZyIgJiYgbm9kZSkKICAgICAgICBub2RlID0gZ2V0RWxlbWVudChub2RlKTsKCiAgICBpZiAodHlwZW9mKG5ld05vZGUpID09ICJzdHJpbmciICYmIG5ld05vZGUpCiAgICAgICAgbmV3Tm9kZSA9IGdldEVsZW1lbnQobmV3Tm9kZSk7CgogICAgb25SZXBsYWNlTm9kZShub2RlLCBuZXdOb2RlKTsKICAgIAogICAgaW5zZXJ0QmVmb3JlKG5vZGUsIG5ld05vZGUpOwogICAgcmVtb3ZlTm9kZShub2RlKTsKCiAgICByZXR1cm4obmV3Tm9kZSk7Cn0KCmZ1bmN0aW9uIG9uUmVwbGFjZU5vZGUobm9kZSwgbmV3Tm9kZSkKewp9CgoKLyoKdmFyIE9HSEFNX1NQQUNFX01BUksgPSBPR1NNID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweDE2ODApOwp2YXIgRU5fUVVBRCA9IEVOUUQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MjAwMCk7CnZhciBFTV9RVUFEID0gRU1RRCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgyMDAxKTsKdmFyIEVOX1NQQUNFID0gRU5TUCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgyMDAyKTsKdmFyIEVNX1NQQUNFID0gRU1TUCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgyMDAzKTsKKi8KLy8gbmVmdW5ndWplIC0gem9icmF6dWplIHBvdXplIDEgc3BhY2UKLypVKzAwMDkgICAgICAgICBDb21tb24gICAgIE90aGVyLCBjb250cm9sICAgICBIVCwgSG9yaXpvbnRhbCBUYWIKVSswMDBBICAgICAgICAgQ29tbW9uICAgICBPdGhlciwgY29udHJvbCAgICAgTEYsIExpbmUgZmVlZApVKzAwMEIgICAgICAgICBDb21tb24gICAgIE90aGVyLCBjb250cm9sICAgICBWVCwgVmVydGljYWwgVGFiClUrMDAwQyAgICAgICAgIENvbW1vbiAgICAgT3RoZXIsIGNvbnRyb2wgICAgIEZGLCBGb3JtIGZlZWQKVSswMDBEICAgICAgICAgQ29tbW9uICAgICBPdGhlciwgY29udHJvbCAgICAgQ1IsIENhcnJpYWdlIHJldHVybgoqLwovKgpVKzAwMjAgICAgIHNwYWNlICAgICBDb21tb24gICAgIFNlcGFyYXRvciwgc3BhY2UgICAgIApVKzAwODUgICAgICAgICBDb21tb24gICAgIE90aGVyLCBjb250cm9sICAgICBORUwsIE5leHQgbGluZQpVKzAwQTAgICAgIG5vLWJyZWFrIHNwYWNlICAgICBDb21tb24gICAgIFNlcGFyYXRvciwgc3BhY2UgICAgIApVKzE2ODAgICAgIG9naGFtIHNwYWNlIG1hcmsgICAgIE9naGFtICAgICBTZXBhcmF0b3IsIHNwYWNlICAgICAKVSsxODBFICAgICBtb25nb2xpYW4gdm93ZWwgc2VwYXJhdG9yICAgICBNb25nb2xpYW4gICAgIFNlcGFyYXRvciwgc3BhY2UgICAgIApVKzIwMDAgICAgIGVuIHF1YWQgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAgICAgClUrMjAwMSAgICAgZW0gcXVhZCAgICAgQ29tbW9uICAgICBTZXBhcmF0b3IsIHNwYWNlICAgICAKVSsyMDAyICAgICBlbiBzcGFjZSAgICAgQ29tbW9uICAgICBTZXBhcmF0b3IsIHNwYWNlICAgICAKVSsyMDAzICAgICBlbSBzcGFjZSAgICAgQ29tbW9uICAgICBTZXBhcmF0b3IsIHNwYWNlICAgICAKVSsyMDA0ICAgICB0aHJlZS1wZXItZW0gc3BhY2UgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAgICAgClUrMjAwNSAgICAgZm91ci1wZXItZW0gc3BhY2UgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAgICAgClUrMjAwNiAgICAgc2l4LXBlci1lbSBzcGFjZSAgICAgQ29tbW9uICAgICBTZXBhcmF0b3IsIHNwYWNlICAgICAKVSsyMDA3ICAgICBmaWd1cmUgc3BhY2UgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAgICAgClUrMjAwOCAgICAgcHVuY3R1YXRpb24gc3BhY2UgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAgICAgClUrMjAwOSAgICAgdGhpbiBzcGFjZSAgICAgQ29tbW9uICAgICBTZXBhcmF0b3IsIHNwYWNlICAgICAKVSsyMDBBICAgICBoYWlyIHNwYWNlICAgICBDb21tb24gICAgIFNlcGFyYXRvciwgc3BhY2UgICAgIApVKzIwMjggICAgIGxpbmUgc2VwYXJhdG9yICAgICBDb21tb24gICAgIFNlcGFyYXRvciwgbGluZSAgICAgClUrMjAyOSAgICAgcGFyYWdyYXBoIHNlcGFyYXRvciAgICAgQ29tbW9uICAgICBTZXBhcmF0b3IsIHBhcmFncmFwaCAgICAgClUrMjAyRiAgICAgbmFycm93IG5vLWJyZWFrIHNwYWNlICAgICBDb21tb24gICAgIFNlcGFyYXRvciwgc3BhY2UgICAgIApVKzIwNUYgICAgIG1lZGl1bSBtYXRoZW1hdGljYWwgc3BhY2UgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAgICAgClUrMzAwMCAgICAgaWRlb2dyYXBoaWMgc3BhY2UgICAgIENvbW1vbiAgICAgU2VwYXJhdG9yLCBzcGFjZSAKKi8KCmZ1bmN0aW9uIGV2YWx1YXRlWFBhdGgoeHBhdGhFeHByZXNzaW9uLCBjb250ZXh0Tm9kZSwgbmFtZXNwYWNlUmVzb2x2ZXIsIHJlc3VsdFR5cGUsIHJlc3VsdCkKewogICAgaWYgKGRvY3VtZW50LmV2YWx1YXRlKQogICAgewogICAgICAgIGlmICh0eXBlb2YoY29udGV4dE5vZGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBjb250ZXh0Tm9kZSA9IGRvY3VtZW50OwoKICAgICAgICBpZiAodHlwZW9mKG5hbWVzcGFjZVJlc29sdmVyKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgbmFtZXNwYWNlUmVzb2x2ZXIgPSBudWxsOwogICAgICAgIGlmICh0eXBlb2YocmVzdWx0VHlwZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBYUGF0aFJlc3VsdC5BTllfVFlQRTsKICAgICAgICBpZiAodHlwZW9mKHJlc3VsdCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7CiAgICAgICAgCiAgICAgICAgdmFyIHJldCA9IGRvY3VtZW50LmV2YWx1YXRlKHhwYXRoRXhwcmVzc2lvbiwgY29udGV4dE5vZGUsIG5hbWVzcGFjZVJlc29sdmVyLCByZXN1bHRUeXBlLCByZXN1bHQpOwogICAgICAgIHJldHVybihyZXQpOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNlbGVjdE5vZGVzKQogICAgewogICAgICAgIC8vIGZpeGVkIHVzaW5nIHhwYXRoLmpzCiAgICAgICAgLyogCiAgICAgICAgZHVtcCgiISBJRSAhISEhISIpOwogICAgICAgIGlmICh0eXBlb2YoY29udGV4dE5vZGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBjb250ZXh0Tm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCiAgICAgICAgY29udGV4dE5vZGUuc2V0UHJvcGVydHkoIlNlbGVjdGlvbkxhbmd1YWdlIiwiWFBhdGgiKTsKICAgICAgICB2YXIgcmV0ID0gY29udGV4dE5vZGUuc2VsZWN0Tm9kZXMoeHBhdGhFeHByZXNzaW9uKTsKICAgICAgICByZXR1cm4ocmV0KTsKICAgICAgICAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGR1bXAoIiEgTk9URk9VTkQgISEhISEiKTsKICAgICAgICAvL3Rocm93KCJldmFsdWF0ZVhQYXRoKCkgdW5zdXBwb3J0ZWQiKTsKICAgICAgICByZXR1cm4obnVsbCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGdldE5vZGVzQnlYUGF0aCh4cGF0aEV4cHJlc3Npb24sIGNvbnRleHROb2RlKQp7CiAgICB2YXIgbm9kZXNTbmFwc2hvdCA9IGV2YWx1YXRlWFBhdGgoeHBhdGhFeHByZXNzaW9uLCBjb250ZXh0Tm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwgKTsgIAogICAgLy9kdW1wKG5vZGVzU25hcHNob3QpOwogICAgdmFyIGxpc3QgPSBbXTsKICAgIGZvciAoIHZhciBpPTAgOyBpIDwgbm9kZXNTbmFwc2hvdC5zbmFwc2hvdExlbmd0aDsgaSsrICkgIAogICAgeyAgCiAgICAgICAgbGlzdC5wdXNoKG5vZGVzU25hcHNob3Quc25hcHNob3RJdGVtKGkpKTsKICAgIH0KICAgIAogICAgcmV0dXJuKGxpc3QpOwp9Cgp2YXIgX19pc1RvdWNoRGV2aWNlID0gbnVsbDsKZnVuY3Rpb24gaXNUb3VjaERldmljZSgpIAp7CiAgICBpZiAoX19pc1RvdWNoRGV2aWNlID09IG51bGwpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQoIlRvdWNoRXZlbnQiKSkKICAgICAgICAgICAgICAgIF9faXNUb3VjaERldmljZSA9IHRydWU7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9faXNUb3VjaERldmljZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICAgICAgX19pc1RvdWNoRGV2aWNlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vY29uc29sZS5sb2coImlzVG91Y2hEZXZpY2UoKTogIitfX2lzVG91Y2hEZXZpY2UpOwogICAgfQoKICAgIHJldHVybihfX2lzVG91Y2hEZXZpY2UpOwogICAgCiAgICAvL3JldHVybiAhISgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpID8gMSA6IDA7Cn0KCgoKCnZhciBfX2xvYWRTY3JpcHRVcmwgPSBudWxsOwoKZnVuY3Rpb24gbG9hZFNjcmlwdCh1cmwsIHRpbWVvdXQpCnsKICAgIHN0YXJ0UHJvZmlsZXIoImxvYWRTY3JpcHQoKSIpOwogICAgCiAgICBpZiAodGltZW91dCkKICAgIHsKICAgICAgICB2YXIgX3VybCA9IHVybDsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X2xvYWRTY3JpcHQoX3VybCl9LCB0aW1lb3V0KTsKICAgIH0KICAgIGVsc2UKICAgICAgICBfbG9hZFNjcmlwdCh1cmwpOwoKICAgIHN0b3BQcm9maWxlcigibG9hZFNjcmlwdCgpIik7Cn0KCmZ1bmN0aW9uIF9sb2FkU2NyaXB0KHVybCkKewogICAgLy9pZiAodXJsWzBdID09ICIvIikKICAgIC8vICAgIHVybCA9IGNsZWFuTGluayhQUk9KRUNUVVJMK3VybCk7CiAgICAKICAgIC8vYWxlcnQodXJsKTsKICAgIHZhciBqcyA9IEFKQVgub3Blbih1cmwpOyAgICAKICAgIGlmIChqcy5pbmRleE9mKCI8IikgPT0gMCkKICAgIHsKICAgICAgICBfdGhyb3coImxvYWRTY3JpcHQoJyIrdXJsKyInKSAtIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiBKYXZhU2NyaXB0Iik7CiAgICAgICAgCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvL2FsZXJ0KGpzKTsKICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOCkKICAgIHsKICAgICAgICAvLyBmdW5jdGlvbiBmdW5jTmFtZShhcmdzKSBpcyBub3QgZXZhbHVhdGVkIC0gbmVlZCB0byBjaGFuZ2UgaXQgdG8gZnVuY05hbWU9ZnVuY3Rpb24oYXJncykKICAgICAgICAKICAgICAgICBqcyA9IGpzLnJlcGxhY2UoL2Z1bmN0aW9uIChbXlwoXSspXCgoW15cKV0qKVwpL2csICJ3aW5kb3dbJyQxJ10gPSBmdW5jdGlvbigkMikiKTsKICAgICAgICAvL2FsZXJ0KGpzKTsKICAgIH0KICAgIAogICAgdHJ5CiAgICB7ICAgIAogICAgICAgIF9fbG9hZFNjcmlwdFVybCA9IHVybDsKICAgICAgICBfZXZhbChqcywgMCwgdHJ1ZSk7CiAgICAgICAgLy93aW5kb3cuZXZhbChqcyk7CiAgICAgICAgX19sb2FkU2NyaXB0VXJsID0gIiI7CiAgICAgICAgb25TY3JpcHRMb2FkZWQoeyd0YXJnZXQnOnsnc3JjJzp1cmx9fSk7CiAgICB9CiAgICBjYXRjaChlKQogICAgewogICAgICAgIF90aHJvdygibG9hZFNjcmlwdCgnIit1cmwrIicpIGVycm9yOiAiK2UpOwogICAgfQogICAgLy9ldmFsKGpzKTsKfQoKZnVuY3Rpb24gX2V2YWwoanMsIHRpbWVvdXQsIHRocm93VG9QYXJlbnQpCnsKICAgIGlmICh0eXBlb2YodGhyb3dUb1BhcmVudCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgdGhyb3dUb1BhcmVudCA9IGZhbHNlOwoKICAgIHN0YXJ0UHJvZmlsZXIoIl9ldmFsKCkiKTsKICAgIGlmICh0eXBlb2YodGltZW91dCkgIT0gInVuZGVmaW5lZCIgJiYgdGltZW91dCkKICAgIHsKICAgICAgICB2YXIgX2pzID0ganM7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe3dpbmRvdy5ldmFsKF9qcyl9LCB0aW1lb3V0KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBmaXggZm9yIEdvb2dsZU1hcHMgYW5kIG90aGVyIEFKQVggbG9hZGVkIGxpYnJhcmllcyAtIHRoYXQgdXNlcyBkb2N1bWVudC53cml0ZQogICAgICAgIHZhciBfZHdyaXRlID0gZG9jdW1lbnQud3JpdGU7CiAgICAgICAgZG9jdW1lbnQud3JpdGUgPSBmdW5jdGlvbihodG1sKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGR1bW15ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIGR1bW15LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIGFwcGVuZENoaWxkKGRvY3VtZW50LmhlYWQsIGR1bW15KTsKICAgICAgICAgICAgc2V0SHRtbChkdW1teSwgaHRtbCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2FsZXJ0KGh0bWwpOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy9hbGVydChqcyk7CiAgICAgICAgLy9hbGVydCh3aW5kb3cuZ29vZ2xlKTsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuZXhlY1NjcmlwdCkgLy8gSUUKICAgICAgICAgICAgICAgIHdpbmRvdy5leGVjU2NyaXB0KGpzKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3dpbmRvdy5ldmFsKGpzKTsKICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5ldmFsLmNhbGwod2luZG93LGpzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbigpOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICAgICAgLy9hbGVydChlKyIgaW4gIitqcyk7CiAgICAgICAgICAgIGlmICh0aHJvd1RvUGFyZW50KQogICAgICAgICAgICAgICAgdGhyb3coZSsiIGluICIranMpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfdGhyb3coZSsiIGluICIranMpOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQud3JpdGUgPSBfZHdyaXRlOwogICAgfQogICAgc3RvcFByb2ZpbGVyKCJfZXZhbCgpIik7Cn0KCmZ1bmN0aW9uIG9uSHRtbENoYW5nZShlbGVtKQp7Cn0KCmlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPCAxMCkKewogICAgZG9jdW1lbnQuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdIRUFEJylbMF07Cn0KCnZhciBfX2xvYWRlZFN0eWxlcyA9IFtdOwpmdW5jdGlvbiBfb25IZWFkTG9hZGVkKCkKewogICAgLy8gZ2V0IGxvYWRlZCBzdHlsZXMKICAgIHZhciBsaW5rcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZG9jdW1lbnQuaGVhZC5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmhlYWQuY2hpbGROb2Rlc1tpXTsKICAgICAgICBpZiAoZWxlbS50YWdOYW1lICYmIGVsZW0udGFnTmFtZSA9PSAiTElOSyIvKiAmJiBlbGVtLmhyZWYgJiYgZWxlbS50eXBlID09ICJ0ZXh0L2NzcyIqLykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIpKQogICAgICAgICAgICAgICAgX19sb2FkZWRTdHlsZXMucHVzaCh0b0Fic29sdXRlVXJsKGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIikuc3BsaXQoIj8iKVswXSkpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDwgMTApCiAgICB7CiAgICAgICAgX19maXhJRVN0eWxlcygpOwogICAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzQUpBWEZvcm1zKCkKewogICAgdmFyIGZvcm1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGZvcm1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgX2Zvcm0gPSBmb3Jtc1tpXTsKICAgICAgICBpZiAoX2Zvcm0uZ2V0QXR0cmlidXRlKCJhamF4dGFyZ2V0IikgJiYgIV9mb3JtLl9fYWpheFRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIF9mb3JtLl9fYWpheFRhcmdldCA9IHRydWU7CiAgICAgICAgICAgIHZhciBoaWRkZW4gPSBjcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgICAgICBoaWRkZW4udHlwZSA9ICJoaWRkZW4iOwogICAgICAgICAgICBoaWRkZW4ubmFtZSA9ICJhamF4Vmlld1R5cGUiOwogICAgICAgICAgICBoaWRkZW4udmFsdWUgPSAidnRCb2R5IjsKICAgICAgICAgICAgX2Zvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuKTsKICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgICAgIGhpZGRlbi50eXBlID0gImhpZGRlbiI7CiAgICAgICAgICAgIGhpZGRlbi5uYW1lID0gInJldHVyblR5cGUiOwogICAgICAgICAgICBoaWRkZW4udmFsdWUgPSAicnRIdG1sIjsKICAgICAgICAgICAgX2Zvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuKTsKICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgICAgIGhpZGRlbi50eXBlID0gImhpZGRlbiI7CiAgICAgICAgICAgIGhpZGRlbi5uYW1lID0gImZvcm1BamF4VGFyZ2V0IjsKICAgICAgICAgICAgaGlkZGVuLnZhbHVlID0gX2Zvcm0uZ2V0QXR0cmlidXRlKCJhamF4dGFyZ2V0Iik7CiAgICAgICAgICAgIF9mb3JtLmFwcGVuZENoaWxkKGhpZGRlbik7CiAgICAgICAgICAgIAogICAgICAgICAgICBhZGRFdmVudChfZm9ybSwgInN1Ym1pdCIsIChmdW5jdGlvbihfX2Zvcm0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBpZiAoIV9fZm9ybS5fX2FqYXhUYXJnZXRTdWJtaXRpbmcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2Zvcm0uX19hamF4VGFyZ2V0U3VibWl0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBnZXRFdmVudChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEFKQVguc3VibWl0Rm9ybShfX2Zvcm0sIGZ1bmN0aW9uKGh0bWwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKF9fZm9ybS5nZXRBdHRyaWJ1dGUoImFqYXh0YXJnZXQiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRIdG1sKGdldEVsZW1lbnQoX19mb3JtLmdldEF0dHJpYnV0ZSgiYWpheHRhcmdldCIpKSwgaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBfX2Zvcm0uX19hamF4VGFyZ2V0U3VibWl0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKF9mb3JtKSk7CiAgICAgICAgfQogICAgfQp9CmFkZEV2ZW50KHdpbmRvdywgImxvYWQiLCBmdW5jdGlvbigpewogICAgLy9kdW1wKCJsb2FkIik7CiAgICBwcm9jZXNzQUpBWEZvcm1zKCk7Cn0pOwoKZnVuY3Rpb24gb25IZWFkTG9hZGVkKCkKewogICAgX29uSGVhZExvYWRlZCgpOwp9CgpmdW5jdGlvbiBfX2FkZElFU3R5bGUoaHJlZiwgZWxlbSkKewogICAgaWYgKGVsZW0pCiAgICAgICAgdmFyIHN0eWxlU2hlZXQgPSBlbGVtLnN0eWxlU2hlZXQ7CiAgICBlbHNlCiAgICAgICAgdmFyIHN0eWxlU2hlZXQgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1tkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgtMV07CiAgICAgICAgCiAgICBpZiAodHlwZW9mKHN0eWxlU2hlZXQuaW1wb3J0cykgIT0gInVuZGVmaW5lZCIgJiYgc3R5bGVTaGVldC5pbXBvcnRzLmxlbmd0aCA9PSAzMSkKICAgIHsKICAgICAgICBkdW1wKCJfX2FkZElFU3R5bGUoKSAtIGxpbWl0IHJlYWNoZWQgbW92aW5nIHRvIGFub3RoZXIgbGluayBlbGVtZW50IC0gVE9ETyIpOwogICAgfQoKICAgIHN0eWxlU2hlZXQuYWRkSW1wb3J0KGhyZWYpOwp9Cgp2YXIgX19sYXN0QUpBWFN0eWxlQmVmb3JlRWxlbWVudDsKdmFyIF9fZmlyc3RBSkFYU3R5bGVBZnRlckVsZW1lbnQ7CmZ1bmN0aW9uIF9fZml4SUVTdHlsZXMoKQp7CiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDwgMTApCiAgICB7CiAgICAgICAgLy9kdW1wKCJfZml4SUVTdHlsZXMoKS4uLiIpOwogICAgICAgIHZhciBfbGlua3MgPSBbXTsKICAgICAgICB2YXIgX3N0eWxlcyA9IFtdOwogICAgICAgIAogICAgICAgIHZhciBsaW5rc0JlZm9yZSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGRvY3VtZW50LmhlYWQuY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmhlYWQuY2hpbGROb2Rlc1tpXTsKICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT0gQ09NTUVOVF9OT0RFICYmIGVsZW0ubm9kZVZhbHVlLmluZGV4T2YoIkFKQVggaW5jbHVkZSIpID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9fZmlyc3RBSkFYU3R5bGVBZnRlckVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoIiIpOwogICAgICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShfX2ZpcnN0QUpBWFN0eWxlQWZ0ZXJFbGVtZW50LCBlbGVtKTsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZSAmJiBlbGVtLnRhZ05hbWUgPT0gIkxJTksiICYmIGVsZW0uaHJlZiAmJiBlbGVtLnJlbCA9PSAic3R5bGVzaGVldCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCgiYmVmb3JlOiAiK2VsZW0uaHJlZik7CiAgICAgICAgICAgICAgICBsaW5rc0JlZm9yZS5wdXNoKGVsZW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBsaW5rc0FmdGVyID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IGkrMSA7IGkgPCBkb2N1bWVudC5oZWFkLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW0gPSBkb2N1bWVudC5oZWFkLmNoaWxkTm9kZXNbaV07CiAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgJiYgZWxlbS50YWdOYW1lID09ICJMSU5LIiAmJiBlbGVtLmhyZWYgJiYgZWxlbS5yZWwgPT0gInN0eWxlc2hlZXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoImFmdGVyOiAiK2VsZW0uaHJlZik7CiAgICAgICAgICAgICAgICBpZiAoIV9fbGFzdEFKQVhTdHlsZUJlZm9yZUVsZW1lbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX19sYXN0QUpBWFN0eWxlQmVmb3JlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudCgiIik7CiAgICAgICAgICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShfX2xhc3RBSkFYU3R5bGVCZWZvcmVFbGVtZW50LCBlbGVtKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsaW5rc0FmdGVyLnB1c2goZWxlbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGNyZWF0ZSBlbXB0eSA8c3R5bGU+IHRhZyBhbmQgcHV0IGl0IGJlZm9yZSBmaXJzdCBsaW5rCiAgICAgICAgaWYgKGxpbmtzQmVmb3JlLmxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGFydCA9IDMxLTY7IC8vIC0xMCBtYWtlcyBicm9ibGVtLCAtMjAgYmlnZ2VyIHByb2JsZW0KCiAgICAgICAgICAgIC8vZHVtcCgiX19maXhJRVN0eWxlcygpOiBkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggQkVGT1JFOiAiK2RvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQgOyBpIDwgbGlua3NCZWZvcmUubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGxpbmtzQmVmb3JlW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQgOyBpIDwgbGlua3NCZWZvcmUubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfX2FkZElFU3R5bGUobGlua3NCZWZvcmVbaV0uaHJlZiwgX19sYXN0QUpBWFN0eWxlQmVmb3JlRWxlbWVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxpbmtzQWZ0ZXIubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGxpbmtzQWZ0ZXJbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxpbmtzQWZ0ZXIubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfX2FkZElFU3R5bGUobGlua3NBZnRlcltpXS5ocmVmLCBfX2ZpcnN0QUpBWFN0eWxlQWZ0ZXJFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy9kdW1wKCJfX2ZpeElFU3R5bGVzKCk6IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCBBRlRFUjogIitkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gdG9BYnNvbHV0ZVVybCh1cmwpCnsKICAgIGlmICh1cmwuaW5kZXhPZihQUk9KRUNUVVJMKSA9PSAtMSAmJiB1cmwuaW5kZXhPZigiOiIpID09IC0xKQogICAgICAgIHVybCA9IGNsZWFuTGluayhQUk9KRUNUVVJMK3VybCk7CiAgICAgICAgCiAgICByZXR1cm4odXJsKTsgICAgCn0KCmZ1bmN0aW9uIHRvUmVsYXRpdmVVcmwodXJsKQp7CiAgICB1cmwgPSBzdHJfcmVwbGFjZShQUk9KRUNUVVJMLCAiLyIsIHVybCk7CiAgICAKICAgIHJldHVybih1cmwpOwp9Cgp2YXIgX19sb2FkZWRVcmxzID0gW107CmZ1bmN0aW9uIHNldEh0bWwoZWxlbSwgaHRtbCwgdGltZW91dCkKewogICAgLy9kdW1wKGh0bWwpOwogICAgZWxlbSA9IGdldEVsZW1lbnQoZWxlbSk7CiAgICAKICAgIC8vIGRlbGV0ZSBhbGwgb2JqZWN0cwogICAgLy9kdW1wKGVsZW0pOwogICAgdmFyIG9iamVjdHMgPSBmaW5kT2JqZWN0cyhlbGVtKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG9iamVjdHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKG9iamVjdHNbaV0uaWQpOwogICAgICAgICAgICBkZWxldGVPYmplY3Qob2JqZWN0c1tpXSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKQogICAgICAgIHsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgCiAgICAvL3JldHVybjsKICAgIHZhciBsb2FkZWRVcmxzID0gW107CiAgICB2YXIgbG9hZGVkU2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxvYWRlZFNjcmlwdHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmIChsb2FkZWRTY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSgic3JjIikgJiYgIWxvYWRlZFNjcmlwdHNbaV0uaGFzQXR0cmlidXRlKCJyZXBlYXQiKSkKICAgICAgICB7CiAgICAgICAgICAgIGxvYWRlZFVybHMucHVzaCh0b0Fic29sdXRlVXJsKGxvYWRlZFNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlKCJzcmMiKS5zcGxpdCgiPyIpWzBdKSk7CiAgICAgICAgICAgIC8vZHVtcChsb2FkZWRTY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSgicmVwZWF0IikpOwogICAgICAgICAgICAvL2xvYWRlZFVybHMucHVzaCh0b0Fic29sdXRlVXJsKGxvYWRlZFNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlKCJzcmMiKSk7CiAgICAgICAgfQogICAgfQogICAgLy9kdW1wKGxvYWRlZFVybHMpOwogICAgICAgIC8qCiAgICAgICAgdmFyIGxvYWRlZExpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBsb2FkZWRMaW5rcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAobG9hZGVkTGlua3NbaV0uaHJlZikKICAgICAgICAgICAgICAgIGxvYWRlZFVybHMucHVzaChsb2FkZWRMaW5rc1tpXS5ocmVmKTsKICAgICAgICB9CiAgICAgICAgKi8KICAgIC8vIG5lZWQgZm9yIElFPDEwIC0gTElNSVQgb2YgMzEgc3R5bGVzaGVldHMKICAgIC8vIFRPRE8KICAgIC8vIGhuZWQgcG8gbmFjdGVuaSBzdHJhbmt5IHpqaXN0aXQgdnNlY2hueSBzdHlseSBhIHBva3VkIGplIGppY2ggdmljIGphayAzMSwgdGFrIGltcG9ydGVtIGRvcGxuaXQgdHkgcHJlc2FodWppY2kKICAgIC8vIHVsb3ppdCBkbyBsb2FkZWRVcmxzCiAgICAvLyBwcmkgZGFsc2ltIG5hY3Rlbmkgem5vdnUga29udHJvbGEgbW5venN0dmkgYSBwcmVzYWh1amljaSB6YXNlIGRvcGxuaXQgCiAgICAvLyBwYWsgdXogc2UgbXVzaSBuYWNpc3QgaSBzaXBreSB1IFNwaW5FZGl0IHYgZWRpdG9ydSB2IGRpdiBkaWFsb2d1CiAgICAKICAgIC8vIGEgbmFzbGVkbmUgdWRlbGF0IHNwb2pvdmFuaSBDU1MgYSBKUyBkbyBqZWRub2hvIHZlbGtlaG8gc291Ym9ydQogICAgLy8gYSkgYnVkIGplbm9tIHR5IHBvdXppdmFuZSwgYWxlIHRhbSBkb3NhaG51IGJyem8gJF9HRVQgc2l6ZSBsaW1pdAogICAgLy8gYikgdnNlY2hueSBpbnN0YWxvdmFuZSA9PiB2em5pa25lIHN1cGVyIHZlbGt5IHNvdWJvciwgYWxlIG5lbXVzaW0gbnV0bmUgY2h0aXQgdnNlY2hueSEgID0+IHUga29tcG9uZW50eSBuYXN0YXZlbmksIHpkYSBrb21waWxvdmF0IGNpIG5lCiAgICAvLyBjKSB1IEFKQVggcGFrIHV6IG5ldmtsYWRhdCAhISBuZWJvIHBhcnNvdmF0IHRlbiB2ZWxreSBzdHlsIGEgcG9kbGUga29tZW50YXJ1IHBvem5hdCwga3RlcnkgdXogdGFtIGplCiAgICAKICAgIC8qCiAgICBpZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDwgMTApCiAgICB7CiAgICAgICAgdmFyIHN0eWxlcyA9IFtdOwogICAgICAgIHZhciBsb2FkZWRMaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaW5rJyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbG9hZGVkTGlua3MubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGxvYWRlZExpbmtzW2ldLmhyZWYgJiYgbG9hZGVkTGlua3NbaV0udHlwZSA9PSAidGV4dC9jc3MiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsb2FkZWRTdHlsZXMucHVzaChsb2FkZWRMaW5rc1tpXS5ocmVmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbG9hZGVkU3R5bGVzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhbHJlYWR5TG9hZGVkID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAodmFyIGlpID0gMCA7IGlpIDwgbG9hZGVkVXJscy5sZW5ndGggOyBpaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobG9hZGVkVXJsc1tpaV0gPT0gbG9hZGVkU3R5bGVzW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgnc2V0SFRNTCgpIC0gYWxyZWFkeSBsb2FkZWQ6ICcrc2NyaXB0c1tpXS5zcmMpOwogICAgICAgICAgICAgICAgICAgIGFscmVhZHlMb2FkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYWxyZWFkeUxvYWRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKCJzZXRIVE1MKCkgLSBsb2FkaW5nIG5ldzogIitzY3JpcHRzW2ldLnNyYyk7CiAgICAgICAgICAgICAgICBhZGRTdHlsZShzcmNbMV0sIHRpbWVvdXQpOwogICAgICAgICAgICAgICAgX19sb2FkZWRVcmxzLnB1c2goc3JjWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0gICAgICAgIAogICAgfQogICAgKi8KCiAgICBlbGVtLmlubmVySFRNTCA9ICIiOwoKICAgIC8vIHNlYXJjaCB3aGVyZSB0byBpbnNlcnQgc3R5bGVzIC0gYWZ0ZXIgPCEtLSBBSkFYIElOQ0xVREUgLS0+CiAgICB2YXIgZWxlbXNTID0gZ2V0RWxlbWVudHNCeU5vZGVUeXBlKENPTU1FTlRfTk9ERSwgZG9jdW1lbnQuaGVhZCk7CiAgICB2YXIgZWxlbVMgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXNTLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBpZiAoZWxlbXNTW2ldLm5vZGVWYWx1ZS5pbmRleE9mKCJBSkFYIGluY2x1ZGUiKSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgZWxlbVMgPSBlbGVtc1NbaV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvL2FsZXJ0KDIpOwogICAgaWYgKHRydWUgLypCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPCAxMCovKQogICAgewogICAgICAgIC8vZHVtcChfX2xvYWRlZFN0eWxlcyk7CiAgICAgICAgdmFyIGxpbmtzID0gaHRtbC5tYXRjaCgvPGxpbmsoW14+XSspXC8+L2cpOwogICAgICAgIGlmIChsaW5rcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxpbmtzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGxpbmsgPSBsaW5rc1tpXTsKICAgICAgICAgICAgICAgIC8vdmFyIHNjcmlwdCA9ICI8c2NyaXB0IHNyYz1cImFhYWFhXCI+IjsKICAgICAgICAgICAgICAgIC8vYWxlcnQoc2NyaXB0KTsKICAgICAgICAgICAgICAgIHZhciByZWwgPSBsaW5rLm1hdGNoKC9yZWw9WyInXShbXiInXSspWyInXS8pOwogICAgICAgICAgICAgICAgdmFyIGhyZWYgPSBsaW5rLm1hdGNoKC9ocmVmPVsiJ10oW14iJ10rKVsiJ10vKTsKICAgICAgICAgICAgICAgIC8vYWxlcnQoc3JjKTsKICAgICAgICAgICAgICAgIGlmIChyZWwgJiYgcmVsWzFdID09ICJzdHlsZXNoZWV0IiAmJiBocmVmICYmIGhyZWZbMV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFscmVhZHlMb2FkZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB2YXIgX3VybCA9IHRvQWJzb2x1dGVVcmwoaHJlZlsxXS5zcGxpdCgiPyIpWzBdKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IF9fbG9hZGVkU3R5bGVzLmxlbmd0aCA7IGlpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoX19sb2FkZWRTdHlsZXNbaWldKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKF91cmwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19sb2FkZWRTdHlsZXNbaWldID09IF91cmwvKmhyZWZbMV0uc3BsaXQoIj8iKVswXSovKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJ3NldEhUTUwoKSAtIHN0eWxlIGFscmVhZHkgbG9hZGVkOiAnK2hyZWZbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvL2R1bXAoX3VybCsiIC0gIithbHJlYWR5TG9hZGVkKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlMb2FkZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoaHJlZlsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgnc2V0SFRNTCgpIC0gTE9BRElORyBTVFlMRTogJytocmVmWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3R5bGUoaHJlZlsxXSwgZG9jdW1lbnQsIGVsZW1TKTsKICAgICAgICAgICAgICAgICAgICAgICAgX19sb2FkZWRTdHlsZXMucHVzaChfdXJsLypocmVmWzFdLnNwbGl0KCI/IilbMF0qLyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZHVtcChsaW5rKTsKICAgICAgICAgICAgICAgICAgICAvL2h0bWwgPSBodG1sLnJlcGxhY2UobmV3IFJlZ0V4cChsaW5rLCAiZyIpLCAiIik7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHN0cl9yZXBsYWNlKGxpbmssICIiLCBodG1sKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcChodG1sKTsKICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwoKICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOSkKICAgIHsKICAgICAgICB2YXIgc3R5bGVzID0gaHRtbC5tYXRjaCgvPHN0eWxlKFtePl0rKT5bXjxdKzxcL3N0eWxlPi9nKTsKICAgICAgICBpZiAoc3R5bGVzKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgc3R5bGVzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gc3R5bGVzW2ldOwogICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBzdHlsZS5tYXRjaCgvPihbXjxdKyk8XC9zdHlsZT4vKTsKICAgICAgICAgICAgICAgIC8vZHVtcChjb250ZW50WzFdKTsKICAgICAgICAgICAgICAgIGFkZFN0eWxlKGNvbnRlbnRbMV0sIGRvY3VtZW50LCBlbGVtUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaHRtbCA9IHN0cl9yZXBsYWNlKHN0eWxlLCAiIiwgaHRtbCk7CiAgICAgICAgICAgIC8vaHRtbCA9IGh0bWwucmVwbGFjZShuZXcgUmVnRXhwKHN0eWxlLCAiZyIpLCAiIik7CiAgICAgICAgfQogICAgfQogICAgCiAgICAKICAgIC8vIE9wZXJhIHJ1bnMgPHNjcmlwdD4gdGFncyBpbWVkaWF0ZWx5IGJlZm9yZSBleHRlcm5hbCBzY3JpcHRzIDxzY3JpcHQgc3JjPScnPiBhcmUgbG9hZGVkCiAgICAvLyB3ZSBuZWVkIHRvIGV4dHJhY3QgdGhlbSwgZG93bmxvYWQgYW5kIGV4ZWN1dGUgYmVmb3JlIGFkZGluZyBodG1sIHRvIERPTQogICAgdmFyIHNjcmlwdHMgPSBodG1sLm1hdGNoKC88c2NyaXB0KFtePl0rKT5bXjxdKjxcL3NjcmlwdD4vZyk7CiAgICAvL2R1bXAoc2NyaXB0cyk7CiAgICBpZiAoc2NyaXB0cykKICAgIHsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBzY3JpcHRzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBzY3JpcHRzW2ldOwogICAgICAgICAgICAvL3ZhciBzY3JpcHQgPSAiPHNjcmlwdCBzcmM9XCJhYWFhYVwiPiI7CiAgICAgICAgICAgIC8vYWxlcnQoc2NyaXB0KTsKICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5tYXRjaCgvc3JjPVsiJ10oW14iJ10rKVsiJ10vKTsKICAgICAgICAgICAgaWYgKHNyYyAmJiBzcmNbMV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhbHJlYWR5TG9hZGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB2YXIgX3VybCA9IHRvQWJzb2x1dGVVcmwoc3JjWzFdLnNwbGl0KCI/IilbMF0pOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBsb2FkZWRVcmxzLmxlbmd0aCA7IGlpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZFVybHNbaWldID09IF91cmwvKnNyY1sxXS5zcGxpdCgiPyIpWzBdKi8pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoJ3NldEhUTUwoKSAtIGFscmVhZHkgbG9hZGVkIDE6ICcrc3JjWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGxvYWRlZFVybHMpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBfX2xvYWRlZFVybHMubGVuZ3RoIDsgaWkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoX19sb2FkZWRVcmxzW2lpXSA9PSBfdXJsLypzcmNbMV0uc3BsaXQoIj8iKVswXSovKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCdzZXRIVE1MKCkgLSBhbHJlYWR5IGxvYWRlZCAyOiAnK3NyY1sxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcChfX2xvYWRlZFVybHMpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TG9hZGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoc2NyaXB0c1tpXS5zcmMpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgic2V0SFRNTCgpIC0gbG9hZGluZyBuZXc6ICIrc3JjWzFdKTsKICAgICAgICAgICAgICAgICAgICBsb2FkU2NyaXB0KHNyY1sxXSwgdGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgX19sb2FkZWRVcmxzLnB1c2goX3VybC8qc3JjWzFdLnNwbGl0KCI/IilbMF0qLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJzZXRIVE1MKCkgLSBBTFJFQURZIExPQURFRDogIitzcmNbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodHJ1ZSB8fCBCcm93c2VyLm5hbWUgPT0gIk9wZXJhIikgLy8gT3BlcmEgZXhlY3V0ZWQgc2NyaXB0cyBhbHNvIGFmdGVyIHNldHRpbmcgaW5uZXJIVE1MIChJRSwgYW5kIG90aGVyIGRvZXNuO3QpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChzY3JpcHQpCiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHN0cl9yZXBsYWNlKHNjcmlwdCwgIiIsIGh0bWwpOwogICAgICAgICAgICAgICAgICAgIC8vaHRtbCA9IGh0bWwucmVwbGFjZShuZXcgUmVnRXhwKHNjcmlwdCwgImciKSwgIiIpOwogICAgICAgICAgICAgICAgICAgIC8vaHRtbCA9IGh0bWwucmVwbGFjZShuZXcgUmVnRXhwKHNjcmlwdCwgImciKSwgIiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfS8vYWxlcnQoIiEiKTsKICAgIC8vYWxlcnQoc2NyaXB0cyk7CiAgICAvL2R1bXAoIngiKTsKICAgIC8vZHVtcChlcnJvclN0YWNrLmxlbmd0aCk7CiAgICAvL2R1bXAoaHRtbCk7CiAgICAKICAgIC8vYWxlcnQoMyk7CiAgICB2YXIgdGFnTmFtZSA9ICJkaXYiOwogICAgaWYgKGh0bWwuaW5kZXhPZigiPHRkIikgPT09IDApCiAgICAgICAgdGFnTmFtZSA9ICJ0ciI7CiAgICAKICAgIHZhciBlbGVtTyA9IGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CiAgICBlbGVtTy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKICAgIC8vICEhISBPcGVyYSBleGVjdXRlcyBpbnNlcnRlZCBzY3JpcHRzIGlmIHRoZXkgYXJlIGluIGRvY3VtZW50IERPTSwgc28gd2UgbmVlZCB0byBhcHBlbmQgaW50byBET00gQUZURVIgaW5uZXJIVE1MCiAgICAvLyBhbHNvIGFmdGVyIGV4ZWN1dGluZyBpbm5lciBzY3JpcHRzIGl0IG11c3QgYmUgYWNjZXNzaWJsZSBpbiBET00gZm9yIGdldEVsZW1lbnRCeUlkKCkgZnVuY3Rpb24KICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICAgIGFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIGVsZW1PKTsKCiAgICAvL2h0bWwgPSBzdHJfcmVwbGFjZSgiIHZhbHVlPVwiIiwgIiB2YWx1ZSQ9XCIiLCBodG1sKTsKICAgIC8vaHRtbCA9IHN0cl9yZXBsYWNlKCIgdmFsdWU9JyIsICIgdmFsdWUkPSciLCBodG1sKTsKICAgIC8vZHVtcChodG1sKTsKICAgIC8vcmV0dXJuOwogICAgaWYgKGh0bWwuaW5kZXhPZigiPHNjcmlwdCIpID09PSAwKQogICAgewogICAgICAgIGVsZW1PLmlubmVySFRNTCA9ICI8Yj5EVU1NWTwvYj4iK2h0bWwrIiI7ICAgLy8gRFVNTVkgRk9SIElFIDw9OCAod2hlbiB0aGVyZSBhcmUgb25seSA8c2NyaXB0PiB0YWdzLCBub3RoaW5nIGlzIGluc2VydGVkKQogICAgICAgIHZhciBkZWMgPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGVsZW1PLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgdmFyIGRlYyA9IDA7CiAgICB9CiAgICAvL2R1bXAob3V0ZXJIVE1MKGVsZW1PKSk7CiAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgIC8vYWxlcnQob3V0ZXJIVE1MKGVsZW1PKSk7CiAgICAKICAgIC8vZHVtcChlcnJvclN0YWNrLmxlbmd0aCk7CiAgICBpZiAoZWxlbVMpCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSA9IGRlYyA7IGkgPCBlbGVtTy5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfZWxlbSA9IGVsZW1PLmNoaWxkTm9kZXNbaV07CiAgICAgICAgICAgIGlmIChfZWxlbS50YWdOYW1lICYmIF9lbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAibGluayIvKiAmJiBfZWxlbS5yZWwgJiYgX2VsZW0ucmVsLnRvTG93ZXJDYXNlKCkgPT0gInN0eWxlc2hlZXQiKi8pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZShlbGVtUywgX2VsZW0pOwogICAgICAgICAgICAgICAgaS0tOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vZHVtcChlcnJvclN0YWNrLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gZWxlbU8uY2hpbGROb2Rlcy5sZW5ndGgtMSA7IGkgPj0gZGVjIDsgaS0tKQogICAgewogICAgICAgIHZhciBfZWxlbSA9IGVsZW1PLmNoaWxkTm9kZXNbaV07CiAgICAgICAgCiAgICAgICAgaWYgKF9lbGVtKSAvLyBPcGVyYSBtaXNzZXMgc29tZSBlbGVtZW50cz8/PwogICAgICAgICAgICBhcHBlbmRGaXJzdChlbGVtLCBfZWxlbSk7CiAgICB9CiAgICBlbGVtTy5pbm5lckhUTUwgPSAiIjsKICAgIHJlbW92ZU5vZGUoZWxlbU8pOwogICAgCiAgICAvL2R1bXAoaHRtbCk7CiAgICAvL2R1bXAoZXJyb3JTdGFjay5sZW5ndGgpOwogICAgLy9kdW1wKGVsZW0pOwogICAgLy9hbGVydChvdXRlckhUTUwoZWxlbSkpOwogICAgLy9hbGVydChlbGVtLmNoaWxkTm9kZXNbMF0pOwogICAgLy9pZiAoZWxlbU8ucGFyZW50Tm9kZSkKICAgIC8vICAgIGVsZW1PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbU8pOwogICAgCiAgICAvLyBtb3ZlZCB1cAogICAgLyoKICAgIHZhciBzY3JpcHRzID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgICAvL2FsZXJ0KGVsZW0uaW5uZXJIVE1MKTsKICAgIC8vYWxlcnQoc2NyaXB0cy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgc2NyaXB0cy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgLy9hbGVydChzY3JpcHRzW2ldLnNyYyk7CiAgICAgICAgaWYgKHNjcmlwdHNbaV0uc3JjKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYWxyZWFkeSBsb2FkZWQ/ICAvLyB3ZSBtdXN0IG5vdCBsb2FkIGl0IG1vcmUgdGhlIG9uZSB0aW1lCiAgICAgICAgICAgIC8vYWxlcnQoc2NyaXB0c1tpXS5zcmMpOwogICAgICAgICAgICB2YXIgYWxyZWFkeUxvYWRlZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGxvYWRlZFVybHMubGVuZ3RoIDsgaWkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGxvYWRlZFVybHNbaWldID09IHNjcmlwdHNbaV0uc3JjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgnc2V0SFRNTCgpIC0gYWxyZWFkeSBsb2FkZWQ6ICcrc2NyaXB0c1tpXS5zcmMpOwogICAgICAgICAgICAgICAgICAgIGFscmVhZHlMb2FkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYWxyZWFkeUxvYWRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9hbGVydChzY3JpcHRzW2ldLnNyYyk7CiAgICAgICAgICAgICAgICAvL2R1bXAoInNldEhUTUwoKSAtIGxvYWRpbmcgbmV3OiAiK3NjcmlwdHNbaV0uc3JjKTsKICAgICAgICAgICAgICAgIGxvYWRTY3JpcHQoc2NyaXB0c1tpXS5zcmMsIHRpbWVvdXQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAqCiAgICAvKgogICAgdmFyIGxpbmtzID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGluaycpOwogICAgLy9hbGVydChsaW5rcy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbGlua3MubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIC8vYWxlcnQoc2NyaXB0c1tpXS5zcmMpOwogICAgICAgIGlmIChsaW5rc1tpXS5ocmVmKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYWxyZWFkeSBsb2FkZWQ/ICAvLyB3ZSBtdXN0IG5vdCBsb2FkIGl0IG1vcmUgdGhlIG9uZSB0aW1lCiAgICAgICAgICAgIC8vYWxlcnQoc2NyaXB0c1tpXS5zcmMpOwogICAgICAgICAgICB2YXIgYWxyZWFkeUxvYWRlZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IGxvYWRlZFVybHMubGVuZ3RoIDsgaWkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGxvYWRlZFVybHNbaWldID09IGxpbmtzW2ldLmhyZWYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZHVtcCgnc2V0SFRNTCgpIC0gYWxyZWFkeSBsb2FkZWQ6ICcrbGlua3NbaV0uaHJlZik7CiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFhbHJlYWR5TG9hZGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2FsZXJ0KGxpbmtzW2ldLmhyZWYpOwogICAgICAgICAgICAgICAgdmFyIGxpbmsgPSBjcmVhdGVFbGVtZW50KCJsaW5rIik7CiAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICJzdHlsZXNoZWV0IjsKICAgICAgICAgICAgICAgIGxpbmsudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBsaW5rc1tpXS5ocmVmOwogICAgICAgICAgICAgICAgLy9saW5rLm1lZGlhID0gbGlua3NbaV0ubWVkaWE7CiAgICAgICAgICAgICAgICBsaW5rLm1lZGlhID0gInNjcmVlbiI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQobGluayk7CiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAgICAgICAgICAgICAvL2xpbmtzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobGlua3NbaV0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2FsZXJ0KG91dGVySFRNTChsaW5rKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGR1bXAoInNldEhUTUwoKSAtIGxvYWRpbmcgbmV3OiAiK2xpbmtzW2ldLmhyZWYpOwogICAgICAgICAgICAgICAgLy9sb2FkU2NyaXB0KHNjcmlwdHNbaV0uc3JjKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIGkgPSBsaW5rcy5sZW5ndGgtMSA7IGkgPj0gMCAgOyBpLS0pCiAgICB7CiAgICAgICAgLy9saW5rc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGxpbmtzW2ldKTsKICAgIH0KICAgICovCiAgICAKICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgLy9hbGVydCg0KTsKICAgIGlmIChCcm93c2VyLm5hbWUgIT0gIk9wZXJhIikgLy8gT3BlcmEgZXhlY3V0ZWQgc2NyaXB0cyBzZWxmCiAgICB7CiAgICAgICAgdmFyIHNjcmlwdHMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JywgZWxlbSk7CiAgICAgICAgLy9hbGVydChzY3JpcHRzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgaT0wIDsgaSA8IHNjcmlwdHMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbXVzdCByZXBsYWNlIGZ1bmN0aW9uIGZ1bmN0aW9uTmFtZShmdW5jdGlvblBhcmFtcykgdG8gd2luZG93WydmdW5jdGlvbk5hbWUnXSA9IGZ1bmN0aW9uIChmdW5jdGlvblBhcmFtcykKICAgICAgICAgICAgdmFyIGpzID0gc2NyaXB0c1tpXS5pbm5lckhUTUw7CiAgICAgICAgICAgIGlmKGpzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCJzZXRIdG1sKCk6IEV2YWwgSmF2YVNjcmlwdDogIitqcyk7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChqcyk7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCh0aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICBfZXZhbChqcywgdGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGVycm9yU3RhY2subGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5ldmFsKGpzKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KDEpOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGNhdGNoKGUpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIF90aHJvdyhlKyIgaW4gIitqcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vZHVtcChlcnJvclN0YWNrLmxlbmd0aCk7CiAgICAvL2FsZXJ0KCdkb25lJyk7CiAgICBwcm9jZXNzQUpBWEZvcm1zKCk7CiAgICBvbkh0bWxDaGFuZ2UoZWxlbSk7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VIdG1sKGVsZW0sIGh0bWwsIHRpbWVvdXQpCnsKICAgIHZhciBkdW1teSA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaW5zZXJ0QmVmb3JlKGVsZW0sIGR1bW15KTsKICAgIAogICAgcmVtb3ZlTm9kZShlbGVtKTsgLy8gdG8gZGVsZXRlIGFsbCBvYmplY3RzIGluc2lkZQoKICAgIC8vIHRvIGNyZWF0ZSBhbGwgbmV3IG9iamVjdHMKICAgIHNldEh0bWwoZHVtbXksIGh0bWwsIHRpbWVvdXQpOwoKICAgIHdoaWxlKGR1bW15LmNoaWxkTm9kZXMubGVuZ3RoKQogICAgewogICAgICAgIGluc2VydEJlZm9yZShkdW1teSwgZHVtbXkuY2hpbGROb2Rlc1swXSk7CiAgICB9CiAgICByZW1vdmVOb2RlKGR1bW15KTsKCiAgICAvKgogICAgdmFyIGR1bW15ID0gY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBzZXRIdG1sKGR1bW15LCBodG1sLCB0aW1lb3V0KTsKICAgIAogICAgZWxlbSA9IGdldEVsZW1lbnQoZWxlbSk7CiAgICB3aGlsZShkdW1teS5jaGlsZE5vZGVzLmxlbmd0aCkKICAgIHsKICAgICAgICBpbnNlcnRCZWZvcmUoZWxlbSwgZHVtbXkuY2hpbGROb2Rlc1swXSk7CiAgICB9CiAgICAKICAgIC8vIGRvIG5vdCBjYWxsIHJlbW92ZU5vZGUgLSBpdCByZW1vdmVzIGFsc28gdGhlIG9iamVjdAogICAgZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pOwogICAgLy9yZW1vdmVOb2RlKGVsZW0pOwogICAgcmVtb3ZlTm9kZShkdW1teSk7CiAgICAqLwp9CiAgICAKZnVuY3Rpb24gYXBwZW5kSHRtbChlbGVtLCBodG1sKQp7CiAgICB2YXIgZHVtbXkgPSBjcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGR1bW15LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGR1bW15KTsKICAgIHNldEh0bWwoZHVtbXksIGh0bWwpOwogICAgCiAgICAvL2ZvciAodmFyIGkgPSBkdW1teS5jaGlsZE5vZGVzLmxlbmd0aC0xIDsgaSA+PSAwIDsgaS0tKQogICAgLy8gICAgZWxlbS5hcHBlbmRDaGlsZChkdW1teS5jaGlsZE5vZGVzW2ldKTsKICAgIHdoaWxlKGR1bW15LmNoaWxkTm9kZXMubGVuZ3RoKQogICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoZHVtbXkuY2hpbGROb2Rlc1swXSk7CiAgICAgICAgCiAgICByZW1vdmVOb2RlKGR1bW15KTsKfQogICAgCmZ1bmN0aW9uIGdldFJlbGF0aXZlV2lkdGgoZWxlbSwgdmFsdWUsIGlnbm9yZUJveFNpemluZykKewogICAgaWYgKHR5cGVvZihpZ25vcmVCb3hTaXppbmcpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGlnbm9yZUJveFNpemluZyA9IGZhbHNlOwogICAgCiAgICB2YXIgZm9ybUVsZW1EZWZhdWx0Qm9yZGVyV2lkdGggPSAyOyAgICAgICAvLyBURVhUQVJFQSB3aXRob3V0IGFueSBib3JkZXIgc2V0IGhhcyBkZWZhdWx0IGJvcmRlcgoKICAgIHZhciB3aWR0aEQgPSAwOwogICAgCiAgICAvL3ZhciBzdHlsZSA9IGdldFN0eWxlKGVsZW0pOwogICAgLy8gbnV0bmUga3Z1bGkgQ2hyb21lIChhIElFIHYgYXV0b3NpemUgcm9vdCBwb2xvemt5IHYgYm9keSkKICAgIHZhciBzdHlsZSA9IGdldFN0eWxlKGVsZW0pOyAvL3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOyAgCiAgICAKICAgIC8vZHVtcChlbGVtLnRhZ05hbWUpOwogICAgLy9kdW1wKGdldFN0eWxlKGVsZW0sICJib3gtc2l6aW5nIikpOwogICAgLy9kdW1wKHN0eWxlLnBhZGRpbmdMZWZ0KTsKICAgIGlmICghaW5fYXJyYXkoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCksIGZvcm1UYWdOYW1lcykgJiYgKGlnbm9yZUJveFNpemluZyB8fCBnZXRTdHlsZShlbGVtLCAiYm94LXNpemluZyIpICE9ICJib3JkZXItYm94IikpCiAgICB7CiAgICAgICAgd2lkdGhEICs9IGV4dHJhY3RGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCwgMCk7CiAgICAgICAgd2lkdGhEICs9IGV4dHJhY3RGbG9hdChzdHlsZS5wYWRkaW5nUmlnaHQsIDApOwogICAgICAgIHdpZHRoRCArPSAodHlwZW9mKHN0eWxlLmJvcmRlckxlZnRXaWR0aCkgIT0gInVuZGVmaW5lZCIgPyBleHRyYWN0RmxvYXQoc3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAwKSA6IChlbGVtLnRhZ05hbWUgPT0gIlRFWFRBUkVBIiA/IGZvcm1FbGVtRGVmYXVsdEJvcmRlcldpZHRoIDogMCkpOwogICAgICAgIHdpZHRoRCArPSAodHlwZW9mKHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpICE9ICJ1bmRlZmluZWQiID8gZXh0cmFjdEZsb2F0KHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDApIDogKGVsZW0udGFnTmFtZSA9PSAiVEVYVEFSRUEiID8gZm9ybUVsZW1EZWZhdWx0Qm9yZGVyV2lkdGggOiAwKSk7CiAgICB9CiAgICAKICAgIC8vZHVtcChlbGVtKTsKICAgIC8vZHVtcCh3aWR0aEQpOwogICAgLyoKICAgIGlmIChzdHlsZS5wb3NpdGlvbiA9PSAic3RhdGljIikgLy8gcHJvcGVydHkgZWRpdG9yIENvbG9yRWRpdCBjb2xvckJveAogICAgewogICAgICAgIHdpZHRoRCArPSBleHRyYWN0SW50KHN0eWxlLm1hcmdpbkxlZnQsIDApOwogICAgICAgIHdpZHRoRCArPSBleHRyYWN0SW50KHN0eWxlLm1hcmdpblJpZ2h0LCAwKTsKICAgIH0KICAgICovCiAgICAKICAgIHJldHVybih2YWx1ZS13aWR0aEQpOwp9CgpmdW5jdGlvbiBnZXRSZWxhdGl2ZUhlaWdodChlbGVtLCB2YWx1ZSkKewogICAgdmFyIGZvcm1FbGVtRGVmYXVsdEJvcmRlcldpZHRoID0gMjsgICAgICAgLy8gVEVYVEFSRUEgd2l0aG91dCBhbnkgYm9yZGVyIHNldCBoYXMgZGVmYXVsdCBib3JkZXIKCiAgICB2YXIgaGVpZ2h0RCA9IDA7CiAgICAvL3ZhciBzdHlsZSA9IGdldFN0eWxlKGVsZW0pOwogICAgLy8gbnV0bmUga3Z1bGkgQ2hyb21lIChhIElFIHYgYXV0b3NpemUgcm9vdCBwb2xvemt5IHYgYm9keSkKICAgIHZhciBzdHlsZSA9IGdldFN0eWxlKGVsZW0pOyAvL3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOyAgCiAgICAKICAgIGlmICghaW5fYXJyYXkoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCksIGZvcm1UYWdOYW1lcykpCiAgICB7CiAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0RmxvYXQoc3R5bGUucGFkZGluZ1RvcCwgMCk7CiAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0RmxvYXQoc3R5bGUucGFkZGluZ0JvdHRvbSwgMCk7CiAgICAgICAgaGVpZ2h0RCArPSAodHlwZW9mKHN0eWxlLmJvcmRlclRvcFdpZHRoKSAhPSAidW5kZWZpbmVkIiA/IGV4dHJhY3RGbG9hdChzdHlsZS5ib3JkZXJUb3BXaWR0aCwgMCkgOiAoZWxlbS50YWdOYW1lID09ICJURVhUQVJFQSIgPyBmb3JtRWxlbURlZmF1bHRCb3JkZXJXaWR0aCA6IDApKTsKICAgICAgICBoZWlnaHREICs9ICh0eXBlb2Yoc3R5bGUuYm9yZGVyQm90dG9tV2lkdGgpICE9ICJ1bmRlZmluZWQiID8gZXh0cmFjdEZsb2F0KHN0eWxlLmJvcmRlckJvdHRvbVdpZHRoLCAwKSA6IChlbGVtLnRhZ05hbWUgPT0gIlRFWFRBUkVBIiA/IGZvcm1FbGVtRGVmYXVsdEJvcmRlcldpZHRoIDogMCkpOwogICAgfQogICAgCiAgICAvKgogICAgaWYgKEJyb3dzZXIubmFtZSAhPSAiRmlyZWZveCIpCiAgICB7CiAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0SW50KHN0eWxlLm1hcmdpblRvcCwgMCk7CiAgICAgICAgaGVpZ2h0RCArPSBleHRyYWN0SW50KHN0eWxlLm1hcmdpbkJvdHRvbSwgMCk7CiAgICB9CiAgICAqLwogICAgCiAgICByZXR1cm4odmFsdWUtaGVpZ2h0RCk7Cn0KCmZ1bmN0aW9uIHRpbWUoKQp7CiAgICByZXR1cm4gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKS8xMDAwKTsKfQoKZnVuY3Rpb24gbWljcm90aW1lKCkKewogICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpLzEwMDA7Cn0KCi8qCmZ1bmN0aW9uIGRpcm5hbWUoZmlsZSkKewogICAgaWYgKHR5cGVvZihmaWxlKSAhPSAic3RyaW5nIikKICAgICAgICByZXR1cm4oIiIpOwogICAgCiAgICB2YXIgZmlsZSA9IGZpbGUucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgIGZpbGUgPSBmaWxlLnNwbGl0KCIvIik7CiAgICAKICAgIGZpbGUucG9wKCk7CiAgICByZXR1cm4oZmlsZS5qb2luKCIvIikpOwp9CgpmdW5jdGlvbiBiYXNlbmFtZShmaWxlKQp7CiAgICBpZiAodHlwZW9mKGZpbGUpICE9ICJzdHJpbmciKQogICAgICAgIHJldHVybigiIik7CiAgICAKICAgIHZhciBmaWxlID0gZmlsZS5yZXBsYWNlKC9cXC9nLCAiLyIpOwogICAgZmlsZSA9IGZpbGUuc3BsaXQoIi8iKTsKICAgIAogICAgcmV0dXJuKGZpbGVbZmlsZS5sZW5ndGgtMV0pOwp9CiovCgpmdW5jdGlvbiBnZXRGaWxlTmFtZShmaWxlKQp7CiAgICBpZiAodHlwZW9mKGZpbGUpICE9ICJzdHJpbmciKQogICAgICAgIHJldHVybigiIik7CiAgICAKICAgIHZhciBmaWxlID0gYmFzZW5hbWUoZmlsZSk7CiAgICB2YXIgbmFtZSA9IGZpbGU7CiAgICBpZiAoZmlsZS5pbmRleE9mKCIuIikgPiAtMSkKICAgIHsKICAgICAgICBuYW1lID0gZmlsZS5zcGxpdCgiLiIpOwogICAgICAgIG5hbWUucG9wKCk7CiAgICAgICAgbmFtZSA9IG5hbWUuam9pbigiLiIpOwogICAgfQogICAgCiAgICByZXR1cm4obmFtZSk7Cn0KCmZ1bmN0aW9uIGdldEZpbGVFeHQoZmlsZSkKewogICAgaWYgKHR5cGVvZihmaWxlKSAhPSAic3RyaW5nIikKICAgICAgICByZXR1cm4oIiIpOwogICAgCiAgICB2YXIgZmlsZSA9IGJhc2VuYW1lKGZpbGUpOwogICAgdmFyIGV4dCA9ICIiOwogICAgaWYgKGZpbGUuaW5kZXhPZigiLiIpID4gLTEpCiAgICB7CiAgICAgICAgZXh0ID0gZmlsZS5zcGxpdCgiLiIpOwogICAgICAgIGV4dCA9IGV4dC5wb3AoKTsKICAgIH0KICAgIAogICAgcmV0dXJuKGV4dCk7Cn0KCmZ1bmN0aW9uIF9nZXRQYXJhbXNBc0xpbmsocGFyYW0sIGtleSwgaW5BcnJheSkKewogICAgaWYgKHBhcmFtID09IG51bGwpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICB2YXIgX3BhcmFtcyA9IG5ldyBBcnJheSgpOwogICAgLy9kdW1wKHBhcmFtKTsKICAgIGlmICh0eXBlb2YocGFyYW0pID09ICJvYmplY3QiICYmICFwYXJhbS50YWdOYW1lKQogICAgewogICAgICAgIGlmICh0eXBlb2YocGFyYW0ubGVuZ3RoKSA9PSAibnVtYmVyIikKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwIDsgaiA8IHBhcmFtLmxlbmd0aCA7IGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3BhcmFtcyA9IF9wYXJhbXMuY29uY2F0KF9nZXRQYXJhbXNBc0xpbmsocGFyYW1bal0sIGtleSsiWyIraisiXSIsIHRydWUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBqIGluIHBhcmFtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2lmICh0eXBlb2YocGFyYW1bal0pICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICBfcGFyYW1zID0gX3BhcmFtcy5jb25jYXQoX2dldFBhcmFtc0FzTGluayhwYXJhbVtqXSwga2V5KyJbIitqKyJdIiwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YocGFyYW0pICE9ICJmdW5jdGlvbiIpCiAgICB7CiAgICAgICAgdmFyIF92YWx1ZSA9ICIiOwogICAgICAgIGlmICh0eXBlb2YocGFyYW0pID09ICJib29sZWFuIikKICAgICAgICAgICAgX3ZhbHVlID0gKHBhcmFtID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgZWxzZS8qIGlmIChwYXJhbSkqLyAgLy9rdnVsaSBBSkFYIHYgZXNob3B1IHNob3Bfb3JkZXIgcG90cmVidWp1IHByZWRhdmF0IGkgcHJhemRuZQogICAgICAgICAgICBfdmFsdWUgPSBwYXJhbTsKICAgICAgICAKICAgICAgICBpZih0cnVlIC8qX3ZhbHVlIHx8IGluQXJyYXkqLykKICAgICAgICB7CiAgICAgICAgICAgIC8vYWxlcnQoX3ZhbHVlKTsKICAgICAgICAgICAgLy9fcGFyYW1zLnB1c2godXJsZW5jb2RlKGtleSkrIj0iK3VybGVuY29kZShfdmFsdWUpKTsKICAgICAgICAgICAgX3BhcmFtcy5wdXNoKGtleSsiPSIrdXJsZW5jb2RlKF92YWx1ZSkpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZihwYXJhbSkgPT0gImZ1bmN0aW9uIikKICAgIHsKICAgICAgICBfcGFyYW1zLnB1c2goa2V5KyI9Iit1cmxlbmNvZGUoZ2V0RnVuY3Rpb25JbmZvKHBhcmFtKVsiYm9keSJdKSk7CiAgICB9CiAgICAgICAgCiAgICByZXR1cm4oX3BhcmFtcyk7Cn0KICAgIApmdW5jdGlvbiBnZXRQYXJhbXNBc0xpbmsocGFyYW1zKQp7CiAgICAvL2R1bXAocGFyYW1zKTsKICAgIAogICAgaWYgKHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IHt9OwogICAgCiAgICB2YXIgX3BhcmFtcyA9IFtdOwogICAgZm9yICh2YXIgcGFyYW1OYW1lIGluIHBhcmFtcykKICAgIHsKICAgICAgICB2YXIgX3BhcmFtcyA9IF9wYXJhbXMuY29uY2F0KF9nZXRQYXJhbXNBc0xpbmsocGFyYW1zW3BhcmFtTmFtZV0sIHBhcmFtTmFtZSwgZmFsc2UpKTsKICAgIH0KCiAgICByZXR1cm4oc3RyX3JlcGxhY2UoIisiLCAiJTIwIiwgX3BhcmFtcy5qb2luKCImIikpKTsKfTsKCmZ1bmN0aW9uIF9nZXRQYXJhbXNBc0Zvcm0ocGFyYW0sIGtleSwgaW5BcnJheSkKewogICAgaWYgKHBhcmFtID09IG51bGwpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICB2YXIgX3BhcmFtcyA9IG5ldyBBcnJheSgpOwogICAgaWYgKHR5cGVvZihwYXJhbSkgPT0gIm9iamVjdCIgJiYgIXBhcmFtLnRhZ05hbWUpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihwYXJhbS5sZW5ndGgpID09ICJudW1iZXIiKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAgOyBqIDwgcGFyYW0ubGVuZ3RoIDsgaisrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfcGFyYW1zID0gX3BhcmFtcy5jb25jYXQoX2dldFBhcmFtc0FzRm9ybShwYXJhbVtqXSwga2V5KyJbIitqKyJdIiwgdHJ1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGogaW4gcGFyYW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YocGFyYW1bal0pICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX3BhcmFtcyA9IF9wYXJhbXMuY29uY2F0KF9nZXRQYXJhbXNBc0Zvcm0ocGFyYW1bal0sIGtleSsiWyIraisiXSIsIGZhbHNlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZihwYXJhbSkgIT0gImZ1bmN0aW9uIikKICAgIHsKICAgICAgICB2YXIgX3ZhbHVlID0gIiI7CiAgICAgICAgaWYgKHR5cGVvZihwYXJhbSkgPT0gImJvb2xlYW4iKQogICAgICAgICAgICBfdmFsdWUgPSAocGFyYW0gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICBlbHNlLyogaWYgKHBhcmFtKSovICAvL2t2dWxpIEFKQVggdiBlc2hvcHUgc2hvcF9vcmRlciBwb3RyZWJ1anUgcHJlZGF2YXQgaSBwcmF6ZG5lCiAgICAgICAgICAgIF92YWx1ZSA9IHBhcmFtOwogICAgICAgIAogICAgICAgIGlmKHRydWUgLypfdmFsdWUgfHwgaW5BcnJheSovKQogICAgICAgIHsKICAgICAgICAgICAgLy9hbGVydChfdmFsdWUpOwogICAgICAgICAgICB2YXIgZWxlbSA9IGNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgICAgIGVsZW0udHlwZSA9ICJoaWRkZW4iOwogICAgICAgICAgICBlbGVtLm5hbWUgPSBrZXk7CiAgICAgICAgICAgIGVsZW0udmFsdWUgPSBfdmFsdWU7CgogICAgICAgICAgICBfcGFyYW1zLnB1c2goZWxlbSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuKF9wYXJhbXMpOwp9CgpmdW5jdGlvbiBnZXRQYXJhbXNBc0Zvcm0ocGFyYW1zKQp7CiAgICBpZiAodHlwZW9mKHBhcmFtcykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgcGFyYW1zID0ge307CiAgICAKICAgIHZhciBfcGFyYW1zID0gW107CiAgICBmb3IgKHZhciBwYXJhbU5hbWUgaW4gcGFyYW1zKQogICAgewogICAgICAgIHZhciBfcGFyYW1zID0gX3BhcmFtcy5jb25jYXQoX2dldFBhcmFtc0FzRm9ybShwYXJhbXNbcGFyYW1OYW1lXSwgcGFyYW1OYW1lLCBmYWxzZSkpOwogICAgfQogICAgcmV0dXJuKF9wYXJhbXMpOwp9OwoKLy9hbGVydChnZXRQYXJhbXNBc0xpbmsoeydhJzonMScsJ2InOicxJywnYyc6JzEnfSkpOwovL2FsZXJ0KGdldFBhcmFtc0FzTGluayh7J2EnOlsxLDIsM10sJ2InOnsxOjEwLDI6MjAsMzozMH0sJ2MnOlt7MTAwOjF9LHsyMDA6Mn0sezMwMDozfV19KSk7CgovLyB0aGlzIGhpZGVzIGVsZW1lbnQgbm90IHVzaW5nIG92ZXJmbG93IG9yIGRpc3BsYXkgLSB0aGlzIGZpeGVzIGEgRkYgYnVnIG5vdCBzb2x2ZWQgZnJvbSAyMDAxISB5ZWFoCmZ1bmN0aW9uIGhpZGVFbGVtZW50KGVsZW0pCnsKICAgIGVsZW0gPSBnZXRFbGVtZW50KGVsZW0pOwogICAgCiAgICBpZiAodHlwZW9mKGVsZW0uX2hpZGVPbGREaXNwbGF5KSA9PSAidW5kZWZpbmVkIikKICAgIHsKICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbSwgImRpc3BsYXkiKSA9PSAibm9uZSIpCiAgICAgICAgewogICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAiZGlzcGxheSIsICIiKTsKICAgICAgICAgICAgZWxlbS5faGlkZU9sZERpc3BsYXkgPSBnZXRTdHlsZShlbGVtLCAiZGlzcGxheSIpOwogICAgICAgICAgICBzZXRTdHlsZShlbGVtLCAiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICBpZiAoZWxlbS5faGlkZU9sZERpc3BsYXkgPT0gIm5vbmUiKQogICAgICAgICAgICAgICAgZWxlbS5faGlkZU9sZERpc3BsYXkgPSAiYmxvY2siOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9lbGVtLl9oaWRlT2xkRGlzcGxheSA9ICJibG9jayI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGdldFN0eWxlKGVsZW0sICJkaXNwbGF5IikgPT0gImZsZXgiKQogICAgICAgICAgICBlbGVtLl9oaWRlT2xkRGlzcGxheSA9ICJmbGV4IjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVsZW0uX2hpZGVPbGREaXNwbGF5ID0gIiI7CiAgICB9CgogICAgaWYgKGVsZW0udGFnTmFtZSA9PSAiSUZSQU1FIikKICAgICAgICBlbGVtLl9oaWRlT2xkRmxleCA9IGVsZW0uc3R5bGUuZmxleDsKICAgIAogICAgaWYgKGdldFN0eWxlKGVsZW0sICJwb3NpdGlvbiIpID09ICJhYnNvbHV0ZSIgfHwgZ2V0U3R5bGUoZWxlbSwgInBvc2l0aW9uIikgPT0gImZpeGVkIiB8fCBlbGVtLnRhZ05hbWUgPT0gIklGUkFNRSIpCiAgICB7CiAgICAgICAgaWYgKCFlbGVtLl9oaWRkZW4pCiAgICAgICAgewogICAgICAgICAgICBlbGVtLl9oaWRkZW4gPSB0cnVlOwoKICAgICAgICAgICAgZWxlbS5faGlkZU9sZFdpZHRoID0gZWxlbS5zdHlsZS53aWR0aDsKICAgICAgICAgICAgZWxlbS5faGlkZU9sZEhlaWdodCA9IGVsZW0uc3R5bGUuaGVpZ2h0OwogICAgICAgICAgICBlbGVtLl9oaWRlT2xkVmlzaWJpbGl0eSA9IGVsZW0uc3R5bGUudmlzaWJpbGl0eTsKICAgICAgICAgICAgZWxlbS5faGlkZU9sZE92ZXJmbG93ID0gZWxlbS5zdHlsZS5vdmVyZmxvdzsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgvKihCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giIHx8IEJyb3dzZXIubmFtZSA9PSAiQ2hyb21lIikgJiYqLyBlbGVtLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIjxlbWJlZCAiKSAhPSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKDEpOwogICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgIndpZHRoIiwgIjBweCIpOwogICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImhlaWdodCIsICIwcHgiKTsKICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJvdmVyZmxvdyIsICJoaWRkZW4gIWltcG9ydGFudCIpOwoKICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImZsZXgiLCAiIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsZW0uX2hpZGVPbGRXaWR0aDIgPSBlbGVtLnN0eWxlLndpZHRoOwogICAgICAgICAgICBlbGVtLl9oaWRlT2xkSGVpZ2h0MiA9IGVsZW0uc3R5bGUuaGVpZ2h0OwogICAgICAgICAgICBlbGVtLl9oaWRlT2xkVmlzaWJpbGl0eTIgPSBlbGVtLnN0eWxlLnZpc2liaWxpdHk7CiAgICAgICAgICAgIGVsZW0uX2hpZGVPbGRPdmVyZmxvdzIgPSBlbGVtLnN0eWxlLm92ZXJmbG93OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL2VsZW0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBzZXRTdHlsZShlbGVtLCAiZGlzcGxheSIsICJub25lIik7CiAgICB9CiAgICAvL2R1bXAoImhpZGVFbGVtZW50Iik7CiAgICAvL2R1bXAoZWxlbSk7Cn0KCmZ1bmN0aW9uIHNob3dFbGVtZW50KGVsZW0pCnsKICAgIGVsZW0gPSBnZXRFbGVtZW50KGVsZW0pOwogICAgLy9kdW1wKGVsZW0pOwoKICAgIGlmICh0eXBlb2YoZWxlbS5faGlkZU9sZERpc3BsYXkpID09ICJ1bmRlZmluZWQiKQogICAgewogICAgICAgIGlmIChnZXRTdHlsZShlbGVtLCAiZGlzcGxheSIpID09ICJub25lIikKICAgICAgICB7CiAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJkaXNwbGF5IiwgIiIpOwogICAgICAgICAgICBlbGVtLl9oaWRlT2xkRGlzcGxheSA9IGdldFN0eWxlKGVsZW0sICJkaXNwbGF5Iik7CiAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChlbGVtLl9oaWRlT2xkRGlzcGxheSA9PSAibm9uZSIpCiAgICAgICAgICAgICAgICBlbGVtLl9oaWRlT2xkRGlzcGxheSA9ICJibG9jayI7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2VsZW0uX2hpZGVPbGREaXNwbGF5ID0gImJsb2NrIjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbGVtLl9oaWRlT2xkRGlzcGxheSA9ICIiOwogICAgfQogICAgCiAgICBpZiAoZ2V0U3R5bGUoZWxlbSwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIiB8fCBnZXRTdHlsZShlbGVtLCAicG9zaXRpb24iKSA9PSAiZml4ZWQiIHx8IGVsZW0udGFnTmFtZSA9PSAiSUZSQU1FIikKICAgIHsKICAgICAgICAvL2R1bXAoZWxlbS5pZCk7CiAgICAgICAgLy9kdW1wKGdldFN0eWxlKGVsZW0sICJkaXNwbGF5IikpOwogICAgICAgIGlmIChnZXRTdHlsZShlbGVtLCAiZGlzcGxheSIpID09ICJub25lIikKICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImRpc3BsYXkiLCBlbGVtLl9oaWRlT2xkRGlzcGxheSk7IC8vIHJlc2V0IGFuZCBsYXRlciB1c2UgdmlzaWJpbGl0eSBtZXRob2QKICAgICAgICBpZiAoZ2V0U3R5bGUoZWxlbSwgInZpc2liaWxpdHkiKSA9PSAiaGlkZGVuIikKICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOyAvLyByZXNldCBhbmQgbGF0ZXIgdXNlIHZpc2liaWxpdHkgbWV0aG9kCiAgICAgICAgCiAgICAgICAgaWYgKGVsZW0uX2hpZGRlbikKICAgICAgICB7CiAgICAgICAgICAgIGVsZW0uX2hpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAvL2lmIChCcm93c2VyLm5hbWUgPT0gIk9wZXJhIiB8fCBCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOCkgLy8gYnVnZ3k6IENvdWxkIG5vdCBnZXQgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkuIEludmFsaWQgYXJndW1lbnQKICAgICAgICAgICAgLy9hbGVydChlbGVtLnN0eWxlLndpZHRoLmluZGV4T2YoIjBweCIpKTsKICAgICAgICAgICAgLy9kdW1wKGVsZW0udGFnTmFtZSk7CiAgICAgICAgICAgIC8vZHVtcCgyKTsKICAgICAgICAgICAgLy9kdW1wKGdldFRhZyhlbGVtKSk7CiAgICAgICAgICAgIGlmIChlbGVtLnN0eWxlLndpZHRoID09IGVsZW0uX2hpZGVPbGRXaWR0aDIpIC8vIG5vdGhpbmcgY2hhbmdlZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAoZWxlbS5faGlkZU9sZFdpZHRoKTsKICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUud2lkdGggPSBlbGVtLl9oaWRlT2xkV2lkdGg7CiAgICAgICAgICAgICAgICAvL2VsZW0uc3R5bGUud2lkdGggPSAiNTBweCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVsZW0uc3R5bGUuaGVpZ2h0ID09IGVsZW0uX2hpZGVPbGRIZWlnaHQyKSAvLyBub3RoaW5nIGNoYW5nZWQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW0uX2hpZGVPbGRIZWlnaHQpOwogICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5oZWlnaHQgPSBlbGVtLl9oaWRlT2xkSGVpZ2h0OwogICAgICAgICAgICAgICAgLy9lbGVtLnN0eWxlLmhlaWd0aCA9ICIxMHB4IjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2R1bXAoMyk7CiAgICAgICAgICAgIC8vZHVtcChnZXRUYWcoZWxlbSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKC8qKEJyb3dzZXIubmFtZSA9PSAiRmlyZWZveCIgfHwgQnJvd3Nlci5uYW1lID09ICJDaHJvbWUiKSAmJiovIGVsZW0uaW5uZXJIVE1MLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiPGVtYmVkICIpICE9IC0xKSAvLyBkbyB0aGlzIE9OTFkgaWYgc29tZSBFTUJFRCBpbnNpZGUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0U3R5bGUoZWxlbSwgImRpc3BsYXkiLCAiIik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vaWYgKGVsZW0uc3R5bGUudmlzaWJpbGl0eSA9PSBlbGVtLl9oaWRlT2xkVmlzaWJpbGl0eTIpIC8vIG5vdGhpbmcgY2hhbmdlZAogICAgICAgICAgICAgICAgLy8gICAgZWxlbS5zdHlsZS52aXNpYmlsaXR5ID0gZWxlbS5faGlkZU9sZFZpc2liaWxpdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZWxlbS5zdHlsZS5vdmVyZmxvdyA9PSBlbGVtLl9oaWRlT2xkT3ZlcmZsb3cyKTsgLy8gbm90aGluZyBjaGFuZ2VkCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy90cnkKICAgICAgICAgICAgICAgICAgICAvL3sKICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGVsZW0uX2hpZGVPbGRPdmVyZmxvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUub3ZlcmZsb3cgPSBlbGVtLl9oaWRlT2xkT3ZlcmZsb3c7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sICJ2aXNpYmlsaXR5IiwgInZpc2libGUiKTsKICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAvL2NhdGNoKGUpCiAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgLy8gICAgOwogICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZHVtcChlbGVtLnN0eWxlLndpZHRoKTsKICAgICAgICAgICAgLy9kdW1wKGVsZW0uc3R5bGUuaGVpZ2h0KTsKICAgICAgICAgICAgLy9lbGVtLnN0eWxlLndpZHRoID0gIjMwMHB4IjsKICAgICAgICAgICAgLy9lbGVtLnN0eWxlLmhlaWdodCA9ICIzMDBweCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGdldFN0eWxlKGVsZW0sICJkaXNwbGF5IikgPT0gIm5vbmUiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGVsZW0uc3R5bGUuZGlzcGxheSA9PSAiIikgLy8gc2V0IHVzaW5nIENTUwogICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gZWxlbS5faGlkZU9sZERpc3BsYXk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzZXRTdHlsZShlbGVtLCAiZGlzcGxheSIsIGVsZW0uX2hpZGVPbGREaXNwbGF5IHx8ICIiKTsKICAgICAgICAvL2VsZW0uc3R5bGUuZGlzcGxheSA9ICIiOwogICAgfQogICAgCiAgICBpZiAoZWxlbS50YWdOYW1lID09ICJJRlJBTUUiKQogICAgICAgIGVsZW0uc3R5bGUuZmxleCA9IGVsZW0uX2hpZGVPbGRGbGV4OwogICAgICAgICAgICAgICAgCiAgICBpZiAoaGFzQ2xhc3NOYW1lKGVsZW0sICJhdXRvc2l6ZSIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2ZpbGwiKSB8fCBoYXNDbGFzc05hbWUoZWxlbSwgImF1dG93aWR0aCIpIHx8IGhhc0NsYXNzTmFtZShlbGVtLCAiYXV0b2hlaWdodCIpKQogICAgewogICAgICAgIGlmIChnZXRPYmplY3QoIkF1dG9TaXplIikpCiAgICAgICAgICAgIGdldE9iamVjdCgiQXV0b1NpemUiKS5mb3JjZVJlc2l6ZShlbGVtKTsKICAgIH0KCiAgICAvL2R1bXAoInNob3dFbGVtZW50Iik7CiAgICAvL2R1bXAoZWxlbSk7Cn0KCi8qCmZ1bmN0aW9uIGdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lLCByb290KQp7CiAgICByb290ID0gcm9vdCB8fCBkb2N1bWVudDsKICAgIAogICAgaWYgKHJvb3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkKICAgIHsKICAgICAgICB2YXIgZWxlbXMgPSBbXTsKICAgICAgICB2YXIgX2VsZW1zID0gcm9vdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgX2VsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgZWxlbXMucHVzaChfZWxlbXNbaV0pOwogICAgICAgIAogICAgICAgIHJldHVybihlbGVtcyk7CiAgICB9CgogICAgLy8gYXQgbGVhc3QgdHJ5IHdpdGggcXVlcnlTZWxlY3RvciAoSUU4IHN0YW5kYXJkcyBtb2RlKQogICAgLy8gYWJvdXQgNXggcXVpY2tlciB0aGFuIGJlbG93CiAgICBpZiAocm9vdC5xdWVyeVNlbGVjdG9yQWxsKSAKICAgIHsKICAgICAgICB0YWdOYW1lID0gdGFnTmFtZSB8fCAiIjsKICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUgKyAnLicgKyBjbGFzc05hbWUpOwogICAgfQogICAgCiAgICAvLyBhbmQgZm9yIG90aGVycy4uLiBJRTctLCBJRTggKHF1aXJrcyBtb2RlKSwgRmlyZWZveCAyLSwgU2FmYXJpIDMuMS0sIE9wZXJhIDktCiAgICAKICAgIHZhciB0YWdOYW1lID0gdGFnTmFtZSB8fCAnKicsIF90YWdzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSwgX25vZGVMaXN0ID0gW107CiAgICBmb3IgKHZhciBpID0gMCwgX3RhZzsgX3RhZyA9IF90YWdzW2krK107KSAKICAgIHsKICAgICAgICBpZiAoaGFzQ2xhc3NOYW1lKF90YWcsIGNsYXNzTmFtZSkpIAogICAgICAgIHsKICAgICAgICAgICAgX25vZGVMaXN0LnB1c2goX3RhZyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9ub2RlTGlzdDsKICAgICAgICAKfQoqLwoKCndpbmRvdy5fb25SZXNpemUgPSBmdW5jdGlvbigpCnsKICAgIGlmKCB0eXBlb2YoIHdpbmRvdy5pbm5lcldpZHRoICkgPT0gJ251bWJlcicgKSAKICAgIHsKICAgICAgICAvL05vbi1JRQogICAgICAgIHdpbmRvdy53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgICAgIHdpbmRvdy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CiAgICB9IAogICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKSAKICAgIHsKICAgICAgICAvL0lFIDYrIGluICdzdGFuZGFyZHMgY29tcGxpYW50IG1vZGUnCiAgICAgICAgd2luZG93LndpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOwogICAgICAgIHdpbmRvdy5oZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgfSAKICAgIGVsc2UgaWYgKGRvY3VtZW50LmJvZHkgJiYgKCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIHx8IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0ICkgKSAKICAgIHsKICAgICAgICAvL0lFIDQgY29tcGF0aWJsZQogICAgICAgIHdpbmRvdy53aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7CiAgICAgICAgd2luZG93LmhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OwogICAgfQogICAgCiAgICAvL2R1bXAodGhpcy53aWR0aCsiICIrdGhpcy5oZWlnaHQpOwp9Cgp3aW5kb3cuX29uUmVzaXplKCk7CmFkZEV2ZW50KHdpbmRvdywgInJlc2l6ZSIsIGZ1bmN0aW9uKCl7d2luZG93Ll9vblJlc2l6ZSgpfSk7Cgp2YXIgX0dFVCA9IHt9Owp2YXIgX2cgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKX2cgPSBfZy5zcGxpdCgvXD8vKVsxXTsKX2cgPSBfZyA/IF9nLnNwbGl0KC8jLylbMF0gOiAiIjsKX2cgPSBfZyA/IF9nLnNwbGl0KC8mLykgOiBbXTsKZm9yICh2YXIgaSA9IDAgOyBpIDwgX2cubGVuZ3RoIDsgaSsrKQp7CiAgICB2YXIgX2dBID0gX2dbaV0uc3Vic3RyaW5nKDAsIF9nW2ldLmluZGV4T2YoIj0iKSk7CiAgICB2YXIgX2dCID0gX2dbaV0uc3Vic3RyaW5nKF9nW2ldLmluZGV4T2YoIj0iKSsxLCBfZ1tpXS5sZW5ndGgpOwogICAgX0dFVFtfZ0FdID0gX0dFVFtfZ0JdOwp9CgpmdW5jdGlvbiBnZXRGb3JtVmFsdWVzQXNBcnJheShwYXJlbnROb2RlKQp7CiAgICB2YXIgcGFyYW1zID0ge307CiAgICB2YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIsIHBhcmVudE5vZGUpOwogICAgCiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGVsZW0gPSBlbGVtc1tpXTsKICAgICAgICBpZiAoZWxlbS50YWdOYW1lICYmIGVsZW0ubmFtZSAmJiBlbGVtLnZhbHVlICE9ICIiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikgPT0gImNoZWNrYm94IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGVsZW0uY2hlY2tlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5uYW1lLmluZGV4T2YoIltdIikgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBzdHJfcmVwbGFjZSgiW10iLCAiIiwgZWxlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihwYXJhbXNba2V5XSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tleV0ucHVzaChlbGVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbZWxlbS5uYW1lXSA9IGVsZW0udmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSA9PSAicmFkaW8iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZWxlbS5jaGVja2VkKQogICAgICAgICAgICAgICAgICAgIHBhcmFtc1tlbGVtLm5hbWVdID0gZWxlbS52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbGVtLnRhZ05hbWUgPT0gIlNFTEVDVCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoIm11bHRpcGxlIikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIsIGVsZW0pOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHN0cl9yZXBsYWNlKCJbXSIsICIiLCBlbGVtLm5hbWUpOwogICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAwIDsgbyA8IG9wdGlvbnMubGVuZ3RoIDsgbysrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zW29dOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1trZXldLnB1c2gob3B0aW9uLnZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwYXJhbXNbZWxlbS5uYW1lXSA9IGVsZW0udmFsdWU7CiAgICAgICAgfSAgICAKICAgIH0KICAgIAogICAgcmV0dXJuKHBhcmFtcyk7Cn0KCi8qCnZhciBsb2FkaW5nU3R5bGVDcmVhdGVkID0gZmFsc2U7CmZ1bmN0aW9uIHNob3dMb2FkaW5nKGVsZW0pCnsKICAgIGlmICghbG9hZGluZ1N0eWxlQ3JlYXRlZCkKICAgIHsKICAgICAgICBhZGRTdHlsZSgiYm9keS5sb2FkaW5nLCBib2R5LmxvYWRpbmcgKiB7IGN1cnNvcjogd2FpdCAhaW1wb3J0YW50OyB9Iik7CiAgICAgICAgbG9hZGluZ1N0eWxlQ3JlYXRlZCA9IHRydWU7CiAgICB9CiAgICAKICAgIGFkZENsYXNzTmFtZShkb2N1bWVudC5ib2R5LCAibG9hZGluZyIpOwogICAgLy9kb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICJ3YWl0ICFpbXBvcnRhbnQiOwp9CgpmdW5jdGlvbiBoaWRlTG9hZGluZyhlbGVtKQp7CiAgICAvL2RvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gIiI7CiAgICByZW1vdmVDbGFzc05hbWUoZG9jdW1lbnQuYm9keSwgImxvYWRpbmciKTsKfQoqLwoKZnVuY3Rpb24gZ2V0RnVuY3Rpb25JbmZvKGZ1bmMpCnsKICAgIHZhciBmdW5jTiA9IGdldEZ1bmN0aW9uTmFtZShmdW5jKTsKICAgIHZhciBjbGFzc04gPSBmdW5jLnByb3RvdHlwZSAmJiBnZXRGdW5jdGlvbk5hbWUoZnVuYy5wcm90b3R5cGUuY29uc3RydWN0b3IpOwoKICAgIGlmIChjbGFzc04gPT0gZnVuY04pCiAgICAgICAgY2xhc3NOID0gIiI7CiAgICBpZiAoZnVuY04gJiYgZnVuY04uaW5kZXhPZigiLiIpID4gLTEpCiAgICB7CiAgICAgICAgZnVuY04gPSBmdW5jTi5zcGxpdCgiLiIpOwogICAgICAgIGNsYXNzTiA9IGZ1bmNOWzBdOwogICAgICAgIGZ1bmNOID0gZnVuY05bMV07CgogICAgICAgIGlmICghY2xhc3NOICYmIGZ1bmNOWzBdID09ICJUIikKICAgICAgICB7CiAgICAgICAgICAgIGNsYXNzTiA9IGZ1bmNOOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgZnVuY1MgPSBmdW5jLnRvU3RyaW5nKCk7CiAgICB2YXIgZnVuY00gPSBmdW5jUy5tYXRjaCgvXCgoW15cKV0qKVwpL2cpOwogICAgaWYgKGZ1bmNNKQogICAgewogICAgICAgIHZhciBmdW5jQSA9IGZ1bmNNWzBdOwogICAgICAgIGZ1bmNBID0gZnVuY0Euc3Vic3RyKDEsIGZ1bmNBLmxlbmd0aC0yKTsKICAgICAgICB2YXIgZnVuY0JQID0gZnVuY1Muc2VhcmNoKC8oeykvKTsKICAgICAgICB2YXIgZnVuY0IgPSBmdW5jUy5zdWJzdHIoZnVuY0JQKzEsIGZ1bmNTLmxlbmd0aC1mdW5jQlAtMik7CgogICAgICAgIC8vIGF1dG8gb3V0ZGVudAogICAgICAgIHZhciBvdXRkZW50ID0gMDsKICAgICAgICB2YXIgb3V0ZGVudEkgPSAwOwogICAgICAgIHdoaWxlKHRydWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZnVuY0Jbb3V0ZGVudEldID09ICJcbiIgfHwgZnVuY0Jbb3V0ZGVudEldID09ICJcciIpIC8vIG5ldyBsaW5lIG1heSBiZSBmaXJzdAogICAgICAgICAgICAgICAgOwogICAgICAgICAgICBlbHNlIGlmIChmdW5jQltvdXRkZW50SV0gPT0gIiAiKQogICAgICAgICAgICAgICAgb3V0ZGVudCsrOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBvdXRkZW50SSsrOwogICAgICAgIH0KICAgICAgICB2YXIgb3V0ZGVudFMgPSAiICIucmVwZWF0KG91dGRlbnQpOwoKICAgICAgICBmdW5jQiA9IGZ1bmNCLnJlcGxhY2UoL1xyL2csICIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoIlxuIitvdXRkZW50UywgImciKSwgIlxuIik7CiAgICAgICAgCiAgICAgICAgaWYgKGZ1bmNCWzBdID09ICJcbiIpCiAgICAgICAgICAgIGZ1bmNCID0gZnVuY0Iuc3Vic3RyaW5nKDEsIGZ1bmNCLmxlbmd0aCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9hbGVydCgiLS0tIik7CiAgICAgICAgLy9hbGVydCh0eXBlb2YoZnVuYykpOwogICAgICAgIC8vYWxlcnQoZnVuYy5wcm90b3R5cGUuY29uc3RydWN0b3IpOwogICAgICAgIC8vYWxlcnQoZnVuYyk7CiAgICB9CiAgICAgICAgCiAgICByZXR1cm4oeyduYW1lJzpmdW5jTiwgJ2FyZ3MnOmZ1bmNBLCAnYm9keSc6IGZ1bmNCLCAnY2xhc3MnOmNsYXNzTiwgJ2FsbCc6ZnVuY1N9KTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2YXIgY2F0Y2hlZEVycm9yUHJlZml4ID0gIlhYWCBFcnJvcjogIjsKdmFyIF9fb25FcnJvckNvdW50ZXIgPSAwOwp2YXIgX19hZnRlckVycm9yRnVuY3Rpb25zID0gW107CmlmICh0cnVlKQp7CndpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24oZGVzYyxwYWdlLGxpbmUsY2hyKQp7CiAgICBfX29uRXJyb3JDb3VudGVyKys7CiAgICAKICAgIC8vIHBva3VkIG5lbmkgemFrb21lbnRvdmFuZSwgbmVmdW5ndWplIGFkdmFuY2VkIGphdmFzY3JpcHQgZGVidWdnZXIKICAgIC8vaWYgKHBhZ2UgPT0gLTIpCiAgICAvLyAgICByZXR1cm47CiAgICAvL2lmIChkZXNjLmluZGV4T2YoImRlYnVnLXBhbmVsLWZsb2F0LWl0ZW0iKSA+IC0xKSAvLyBkaXNhYmxlIGxvb3AgYW5kIGJyb3dzZXIgY3Jhc2gKICAgIC8vICAgIHJldHVybjsKICAgIAogICAgCiAgICAvL2Vsc2UKICAgIC8vICAgIGFsZXJ0KGRlc2MpOwogICAgLy92YXIgY2FsbGVyID0gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXI7CiAgICAvL2FsZXJ0KGFyZ3VtZW50cyk7CiAgICAvL2FsZXJ0KGFyZ3VtZW50cy5jYWxsZWUpOwogICAgLy9hbGVydChhcmd1bWVudHMuY2FsbGVlLmNhbGxlZSk7CiAgICAvL2FsZXJ0KGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyKTsKICAgIC8vYWxlcnQoY2F0Y2hlZEVycm9yUHJlZml4KTsKICAgIC8vYWxlcnQoZGVzYy5pbmRleE9mKGNhdGNoZWRFcnJvclByZWZpeCkpOwogICAgaWYgKGRlc2MuaW5kZXhPZihjYXRjaGVkRXJyb3JQcmVmaXgpID09IC0xKQogICAgewogICAgICAgIC8vZHVtcChkZXNjKTsKICAgICAgICB2YXIgZnVuY3Rpb25DYWxsID0gIiI7CiAgICAgICAgdmFyIHVybFBhcmFtcyA9IGV4cGxvZGVMaW5rKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICBpZiAodXJsUGFyYW1zWyJwYXJhbXMiXVsiZHVtcEZ1bmN0aW9uQ2FsbCJdID09ICJ0cnVlIiB8fCB1cmxQYXJhbXNbInBhcmFtcyJdWyJkZWJ1Z0Z1bmN0aW9uQ2FsbCJdID09ICJ0cnVlIikKICAgICAgICAgICAgZnVuY3Rpb25DYWxsID0gZ2V0RnVuY3Rpb25DYWxsKCk7CgogICAgICAgIGVycm9yU3RhY2sucHVzaCh7J2xhbmd1YWdlJzonamF2YXNjcmlwdCcsJ3R5cGUnOidlcnJvcicsJ2RhdGEnOmRlc2MsICdwYWdlJzpwYWdlLCAnbGluZSc6bGluZSwgJ2NoYXInOmNociwgJ2Z1bmN0aW9uQ2FsbCc6ZnVuY3Rpb25DYWxsfSk7CiAgICAgICAgaWYgKHdpbmRvdy5nZXRPYmplY3QgJiYgZ2V0T2JqZWN0KCJKYXZhU2NyaXB0RGVidWdQYW5lbCIpKQogICAgICAgIHsKICAgICAgICAgICAgLy9hbGVydChkZXNjKTsKICAgICAgICAgICAgLy9mb3IgKHZhciBpIGluIGdldE9iamVjdCgiSmF2YVNjcmlwdERlYnVnUGFuZWwiKSkKICAgICAgICAgICAgLy8gICAgYWxlcnQoaSk7CiAgICAgICAgICAgIC8vYWxlcnQoZGVzYyk7CiAgICAgICAgICAgIGdldE9iamVjdCgiTWVzc2FnZXNEZWJ1Z1BhbmVsIikuc2hvd0Vycm9ycygpOwogICAgICAgICAgICAvL3Rocm93KGRlc2MpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwYWdlICE9IC0yKQogICAgICAgIHsKICAgICAgICAgICAgLy9hbGVydCgiISEhISIrZGVzYyk7CiAgICAgICAgICAgIF90aHJvdyhkZXNjLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IF9fYWZ0ZXJFcnJvckZ1bmN0aW9ucy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBfX2FmdGVyRXJyb3JGdW5jdGlvbnNbaV0oZGVzYyk7CiAgICAgICAgfQogICAgfQp9Owp9CnZhciBfdGhyb3dJbmRleCA9IDA7CmZ1bmN0aW9uIF90aHJvdyhlLCBjYWxsU3RhY2spCnsKICAgIC8vYWxlcnQoIj8/PyIrZSk7CgogICAgaWYgKHR5cGVvZihjYWxsU3RhY2spID09ICJ1bmRlZmluZWQiKQogICAgICAgIGNhbGxTdGFjayA9IGZhbHNlOwogICAgCiAgICAvL2FsZXJ0KCIyIituZXcgU3RyaW5nKGUpKTsKICAgIGlmIChuZXcgU3RyaW5nKGUpLmluZGV4T2YoY2F0Y2hlZEVycm9yUHJlZml4KSA9PSAwKQogICAgewogICAgICAgIC8vZHVtcChjYWxsU3RhY2spOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgZXJyb3IgPSAiIjsKICAgIC8vZXJyb3IgKz0gIjxkaXYgY2xhc3M9J2RlYnVnLXBhbmVsLWZsb2F0LWl0ZW0tZXJyb3InPiIrZSsiPC9kaXY+IjsKICAgIGVycm9yICs9IGU7CiAgICB2YXIgbWF4ID0gMTA7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgYW50aUxvb3AgPSB7fTsKCiAgICBpZiAoY2FsbFN0YWNrKQogICAgewogICAgICAgIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKICAgICAgICBjYWxsZXIgPSBnZXRTb3VyY2VGdW5jdGlvbihjYWxsZXIpOwoKICAgICAgICAvLyBmcm9tIGV2ZW50CiAgICAgICAgaWYgKHR5cGVvZihjYWxsU3RhY2spID09ICJvYmplY3QiKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGUgPSBjYWxsU3RhY2s7CiAgICAgICAgICAgIGVycm9yICs9ICI8ZGl2IGNsYXNzPSdkZWJ1Zy1wYW5lbC1mbG9hdC1pdGVtLWVycm9yJz5FdmVudDogIitlLnR5cGUrIjxiciAvPlRhcmdldDogIitodG1sZW50aXRpZXMob3V0ZXJIVE1MKGUudGFyZ2V0KSkrIjwvZGl2PiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vZHVtcChlKTsKICAgICAgICAvL2R1bXAoZ2V0U291cmNlRnVuY3Rpb24oY2FsbGVyKSk7CiAgICAgICAgLy8gICAgZHVtcChjYWxsZXIpOwogICAgICAgIC8vICAgIGR1bXAoY2FsbGVyLmFyZ3VtZW50cyk7CiAgICAgICAgLy8gICAgZHVtcChjYWxsZXIuYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgLy8gICAgZHVtcChjYWxsZXIuYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIpOwoKICAgICAgICAvL2FsZXJ0KGNhbGxlcik7CiAgICAgICAgd2hpbGUoY2FsbGVyKQogICAgICAgIHsKICAgICAgICAgICAgLy92YXIgZnVuY3Rpb25OYW1lID0gZ2V0RnVuY3Rpb25OYW1lKGNhbGxlcik7CiAgICAgICAgICAgIC8vdmFyIGNsYXNzTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShjYWxsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgIHZhciBmbmNJID0gZ2V0RnVuY3Rpb25JbmZvKGNhbGxlcik7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBmbmNJWyJjbGFzcyJdLCBmdW5jdGlvbk5hbWUgPSBmbmNJWyJuYW1lIl0sIGZ1bmNCID0gZm5jSVsiYm9keSJdLCBmdW5jQSA9IGZuY0lbImFyZ3MiXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gZnVuY3Rpb25OYW1lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiW2NvbnN0cnVjdG9yXSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChhbnRpTG9vcFtjbGFzc05hbWUrIi4iK2Z1bmN0aW9uTmFtZV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gIjxkaXYgY2xhc3M9J2RlYnVnLXBhbmVsLWZsb2F0LWl0ZW0tZXJyb3IgZXhwYW5kYWJsZSc+TG9vcCBlcnJvcjogaSBoYXZlIGJlZW4gYWxyZWFkeSBpbiAiK2NsYXNzTmFtZSsiLiIrZnVuY3Rpb25OYW1lKyI8L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYW50aUxvb3BbY2xhc3NOYW1lKyIuIitmdW5jdGlvbk5hbWVdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy9hbGVydCgiY2xhc3NOYW1lOiAiK2NsYXNzTmFtZSsiXG5mdW5jdGlvbk5hbWU6ICIrZnVuY3Rpb25OYW1lKyJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iK2NhbGxlcik7CiAgICAgICAgICAgIGVycm9yICs9ICI8YSBjbGFzcz0nZXhwYW5kYWJsZScgb25jbGljaz0ndmFyIGVsZW09Z2V0RWxlbWVudChcImVycm9yU3RhY2tGdW5jdGlvbkJvZHlfIitfdGhyb3dJbmRleCsiXCIpO2lmKGVsZW0uc3R5bGUuZGlzcGxheT09XCJub25lXCIpe2VsZW0uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7dGhpcy5jbGFzc05hbWU9XCJleHBhbmRhYmxlIGV4cGFuZGVkXCI7fWVsc2V7ZWxlbS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO3RoaXMuY2xhc3NOYW1lPVwiZXhwYW5kYWJsZVwifTtyZXR1cm4gZmFsc2U7Jz4iKyhjbGFzc05hbWUgPyBjbGFzc05hbWUrIi4iIDogIiIpK2Z1bmN0aW9uTmFtZSsiKCIrZnVuY0ErIik8L2E+IjsKICAgICAgICAgICAgZXJyb3IgKz0gIjxkaXYgaWQ9J2Vycm9yU3RhY2tGdW5jdGlvbkJvZHlfIitfdGhyb3dJbmRleCsiJyBzdHlsZT0nZGlzcGxheTpub25lOycgY2xhc3M9J2Z1bmN0aW9uU291cmNlJz4iK2Z1bmNCLnJlcGxhY2UoL1xcbi9nLCAiPGJyIC8+IikucmVwbGFjZSgvIC9nLCAiJm5ic3A7IikrIjwvZGl2PjxiciAvPiI7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2FsZXJ0KGNsYXNzTmFtZSk7CiAgICAgICAgICAgIC8vaWYgKG9iamVjdC5jbGFzc05hbWUpCiAgICAgICAgICAgIC8vICAgIGJyZWFrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNhbGxlciA9IGNhbGxlci5jYWxsZXI7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpID09IG1heCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9hbGVydCgnX3Rocm93KCkgaW5maW5pdGUgbG9vcCAtIG1vcmUgdGhhbiAnK21heCsnIGxvb3BzJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgX3Rocm93SW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgLy9hbGVydChlcnJvcik7CiAgICB9CiAgICAvL2Vycm9yU3RhY2sucHVzaCh7J2Rlc2NyaXB0aW9uJzplcnJvciwgJ3BhZ2UnOnBhZ2UsICdsaW5lJzpsaW5lLCAnY2hhcic6Y2hyfSk7CiAgICAvL2lmICh3aW5kb3cuZ2V0T2JqZWN0KQogICAgLy8gICAgZ2V0T2JqZWN0KCJKYXZhU2NyaXB0RGVidWdQYW5lbCIpLnNob3dFcnJvcnMoKTsKICAgIC8vYWxlcnQoZXJyb3IpOwogICAgd2luZG93Lm9uZXJyb3IoZXJyb3IsIC0yKTsKICAgIAogICAgLy9hbGVydCgiMSIrY2F0Y2hlZEVycm9yUHJlZml4K2UpOwogICAgLy9kdW1wKGUpOwogICAgZS5tZXNzYWdlID0gY2F0Y2hlZEVycm9yUHJlZml4K2UubWVzc2FnZTsKICAgIC8vYWxlcnQoZ2V0RnVuY3Rpb25DYWxsKClbMl0pOwogICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAvL2NvbnNvbGUubG9nKGVycm9yKTsKICAgIC8vYWxlcnQoZXJyb3IpOwogICAgLy9pZiAoQnJvd3Nlci5uYW1lID09ICJGaXJlRm94IikKICAgICAgICAvL2NvbnNvbGUubG9nKGVycm9yKTsKICAgIC8vZWxzZQoKICAgIGlmIChBSkFYRklMRU5BTUUgPT0gImluc3RhbGwucGhwIikKICAgICAgICBlcnJvciArPSBnZXRGdW5jdGlvbkNhbGwoKTsKICAgICAgICAKICAgIGlmICgoQnJvd3Nlci5uYW1lICE9ICJFeHBsb3JlciIgfHwgQnJvd3Nlci52ZXJzaW9uID49IDkpICYmIGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikKICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKCiAgICAvL2lmIChCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giKQogICAgLy8gICAgYWxlcnQoZXJyb3IpOwogICAgLy9lbHNlCiAgICAvLyAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgIC8vdGhyb3coZSk7Cn07Cgp2YXIgX19leHRlbmRlZEphdmFTY3JpcHRFcnJvckNhdGNoT2JqZWN0cyA9IFtdOwpmdW5jdGlvbiBfX2V4dGVuZGVkSmF2YVNjcmlwdEVycm9yQ2F0Y2goT2JqZWN0KQp7CiAgICBzdGFydFByb2ZpbGVyKCJfX2V4dGVuZGVkSmF2YVNjcmlwdEVycm9yQ2F0Y2giKTsKICAgIGlmIChPYmplY3QpCiAgICB7CiAgICAgICAgb2JqID0gb2JqZWN0OwogICAgfQogICAgZWxzZQogICAgICAgIG9iaiA9IHdpbmRvdzsKICAgICAgICAKICAgIGZ1bmN0aW9uIF9fYWxyZWFkeUV4dGVuZGVkKGZ1bmN0aW9uTmFtZSwgb2JqLCBjbGFzc05hbWUpCiAgICB7CiAgICAgICAgaWYgKGNsYXNzTmFtZSkKICAgICAgICAgICAgcmV0dXJuKGV4dGVuZGVkRnVuY3Rpb25zW29ialtjbGFzc05hbWVdLnByb3RvdHlwZS50b1N0cmluZygpXSA9PSBmdW5jdGlvbk5hbWUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGV4dGVuZGVkRnVuY3Rpb25zW29ialtmdW5jdGlvbk5hbWVdXSA/IGV4dGVuZGVkRnVuY3Rpb25zW29ialtmdW5jdGlvbk5hbWVdLnRvU3RyaW5nKCldID09IGZ1bmN0aW9uTmFtZSA6IGZhbHNlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gX19leHRlbmRGdW5jdGlvbihmdW5jdGlvbk5hbWUsIGZ1bmNBLCBmdW5jQiwgb2JqLCBjbGFzc05hbWUpCiAgICB7CiAgICAgICAgaWYgKCFmdW5jQiB8fCBmdW5jQi5pbmRleE9mKCJfdGhyb3coX19lKTsiKSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOy8vYWxlcnQoZnVuY3Rpb25OYW1lKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIGZ1bmNYID0gIiI7CiAgICAgICAgaWYgKGNsYXNzTmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIGZ1bmNYICs9IGNsYXNzTmFtZSsiLnByb3RvdHlwZS4iK2Z1bmN0aW9uTmFtZSsiID0gZnVuY3Rpb24oIitmdW5jQSsiKSB7XG4iOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgeyAgICAKICAgICAgICAgICAgZnVuY1ggKz0gZnVuY3Rpb25OYW1lKyIgPSBmdW5jdGlvbigiK2Z1bmNBKyIpIHtcbiI7CiAgICAgICAgfQogICAgICAgIGZ1bmNYICs9ICIgICB0cnkgeyBcbiI7CiAgICAgICAgZnVuY1ggKz0gIiAgICAgICIrZnVuY0IrIlxuIjsKICAgICAgICBmdW5jWCArPSAiICAgfSBcbiI7CiAgICAgICAgZnVuY1ggKz0gIiAgIGNhdGNoKF9fZSkgeyBcbiI7CiAgICAgICAgZnVuY1ggKz0gIiAgICAgIF90aHJvdyhfX2UpOyBcbiI7CiAgICAgICAgZnVuY1ggKz0gIiAgIH1cbiI7CiAgICAgICAgZnVuY1ggKz0gIn1cbiI7CiAgICAgICAgCiAgICAgICAgLy9hbGVydChmdW5jWCk7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB3aW5kb3cuZXZhbChmdW5jWCk7CiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgZnVuY3Rpb24gbmFtZSwgYmVjYXVzZSBub3QgaXQgYmVjb21lcyBhbm9ueW1vdXMgLSBmb3IgZXh0ZW5kRnVuY3Rpb24KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2NsYXNzTmFtZV0ucHJvdG90eXBlW2Z1bmN0aW9uTmFtZV0udG9TdHJpbmcoKV0gPSBmdW5jdGlvbk5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2Z1bmN0aW9uTmFtZV0udG9TdHJpbmcoKV0gPSBmdW5jdGlvbk5hbWU7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGUpCiAgICAgICAgewogICAgICAgICAgICBhbGVydCgiQWR2YW5jZWQgRXJyb3IgRGVidWdnZXI6ICIrZSsiXG5cbiIrZnVuY1gpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gZmluZCBhbGwgZnVuY3Rpb25zIGFuZCBhZGQgdHJ5IGNhdGNoCiAgICBmb3IgKHZhciBpIGluIG9iaikKICAgIHsKICAgICAgICBpZiAodHlwZW9mKG9ialtpXSkgPT0gImZ1bmN0aW9uIiAmJiAKICAgICAgICAgICAgaSAhPSAiX3Rocm93IiAmJiAKICAgICAgICAgICAgb2JqW2ldICE9IHdpbmRvdy5vbmVycm9yICYmIAogICAgICAgICAgICBvYmpbaV0gIT0gZ2V0RnVuY3Rpb25JbmZvICYmIAogICAgICAgICAgICBvYmpbaV0gIT0gZ2V0RnVuY3Rpb25OYW1lICYmIAogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVE9ETyAtIHJlbW92ZQogICAgICAgICAgICAvL2dldEZ1bmN0aW9uTmFtZShvYmpbaV0pICE9ICJHcmlkIiAmJiAKICAgICAgICAgICAgCiAgICAgICAgICAgIG9ialtpXSAhPSBfX2V4dGVuZGVkSmF2YVNjcmlwdEVycm9yQ2F0Y2ggCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIC8vaWYgKGkuaW5kZXhPZigiVCIpID09IDApCiAgICAgICAgICAgIC8vICAgIGFsZXJ0KGkpOwogICAgICAgICAgICB2YXIgZnVuYyA9IG9ialtpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vdmFyIGZ1bmN0aW9uTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShmdW5jKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBmdW5jSSA9IGdldEZ1bmN0aW9uSW5mbyhmdW5jKTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGZ1bmNJWyJuYW1lIl07CiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBmdW5jSVsiY2xhc3MiXTsKICAgICAgICAgICAgdmFyIGZ1bmNTID0gZnVuY0lbImFsbCJdLCBmdW5jQSA9IGZ1bmNJWyJhcmdzIl0sIGZ1bmNCID0gZnVuY0lbImJvZHkiXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUgJiYgIV9fYWxyZWFkeUV4dGVuZGVkKGZ1bmN0aW9uTmFtZSwgb2JqLCBjbGFzc05hbWUpICYmIGZ1bmNTLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSA9PSAtMSAmJiBmdW5jUy5pbmRleE9mKCJURGVidWciKSAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY1ggPSAiIjsKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUuaW5kZXhPZigiVCIpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnY2xhc3MnKTsKICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbW9kaWZ5IGNvbnN0cnVjdG9yLCBvciBhbGwgcHJvdG90eXBlcyB3aWxsIGJlIGxvc3QKICAgICAgICAgICAgICAgICAgICAvL19fZXh0ZW5kRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCBmdW5jQSwgZnVuY0IpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3dbZnVuY3Rpb25OYW1lXSAmJiB3aW5kb3dbZnVuY3Rpb25OYW1lXS5wcm90b3R5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19leHRlbmRlZEphdmFTY3JpcHRFcnJvckNhdGNoT2JqZWN0cy5pbmRleE9mKGZ1bmN0aW9uTmFtZSkgPT09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaSBpbiB3aW5kb3dbZnVuY3Rpb25OYW1lXS5wcm90b3R5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih3aW5kb3dbZnVuY3Rpb25OYW1lXS5wcm90b3R5cGVbaWldKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChmdW5jdGlvbk5hbWUrIi4iK2lpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9mdW5jSSA9IGdldEZ1bmN0aW9uSW5mbyh3aW5kb3dbZnVuY3Rpb25OYW1lXS5wcm90b3R5cGVbaWldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRlbmRGdW5jdGlvbihpaSwgX2Z1bmNJWyJhcmdzIl0sIF9mdW5jSVsiYm9keSJdLCBvYmosIGZ1bmN0aW9uTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRlbmRlZEphdmFTY3JpcHRFcnJvckNhdGNoT2JqZWN0cy5wdXNoKGZ1bmN0aW9uTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX19leHRlbmRGdW5jdGlvbihmdW5jdGlvbk5hbWUsIGZ1bmNBLCBmdW5jQiwgb2JqKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9hbGVydChpKyI6ICIrd2luZG93W2ldKTsKICAgICAgICB9CiAgICB9CiAgICBzdG9wUHJvZmlsZXIoIl9fZXh0ZW5kZWRKYXZhU2NyaXB0RXJyb3JDYXRjaCIpOwp9Cgp2YXIgcHJvZmlsZXJTdGFjayA9IFtdOwp2YXIgcHJvZmlsZXJTdGFja0xldmVsID0gMDsKCmZ1bmN0aW9uIF9fZXh0ZW5kZWRKYXZhU2NyaXB0UHJvZmlsZXJDYXRjaChPYmplY3QpCnsKICAgIHN0YXJ0UHJvZmlsZXIoIl9fZXh0ZW5kZWRKYXZhU2NyaXB0UHJvZmlsZXJDYXRjaCIpOwogICAgaWYgKE9iamVjdCkKICAgIHsKICAgICAgICBvYmogPSBvYmplY3Q7CiAgICB9CiAgICBlbHNlCiAgICAgICAgb2JqID0gd2luZG93OwogICAgICAgIAogICAgZnVuY3Rpb24gX19hbHJlYWR5RXh0ZW5kZWQoZnVuY3Rpb25OYW1lLCBvYmosIGNsYXNzTmFtZSkKICAgIHsKICAgICAgICBpZiAoY2xhc3NOYW1lKQogICAgICAgICAgICByZXR1cm4oZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2NsYXNzTmFtZV0ucHJvdG90eXBlLnRvU3RyaW5nKCldID09IGZ1bmN0aW9uTmFtZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4oZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2Z1bmN0aW9uTmFtZV1dID8gZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2Z1bmN0aW9uTmFtZV0udG9TdHJpbmcoKV0gPT0gZnVuY3Rpb25OYW1lIDogZmFsc2UpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBfX2V4dGVuZEZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgZnVuY0EsIGZ1bmNCLCBvYmosIGNsYXNzTmFtZSkKICAgIHsKICAgICAgICBpZiAoZnVuY0IuaW5kZXhPZigidmFyIHByb2ZpbGVyU3RhY2tJbmRleCIpID4gLTEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47Ly9hbGVydChmdW5jdGlvbk5hbWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgZnVuY1ggPSAiIjsKICAgICAgICBpZiAoY2xhc3NOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgZnVuY1ggKz0gY2xhc3NOYW1lKyIucHJvdG90eXBlLiIrZnVuY3Rpb25OYW1lKyIgPSBmdW5jdGlvbigiK2Z1bmNBKyIpIHtcbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7ICAgIAogICAgICAgICAgICBmdW5jWCArPSBmdW5jdGlvbk5hbWUrIiA9IGZ1bmN0aW9uKCIrZnVuY0ErIikge1xuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICBmdW5jQkwgPSBmdW5jQi5zcGxpdCgvXG4vZyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZnVuY0JMLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoZnVuY0JMW2ldLmluZGV4T2YoImlmICgiKSAhPSAtMSB8fCBmdW5jQkxbaV0uaW5kZXhPZigiZm9yICgiKSAhPSAtMSkgJiYgZnVuY0JMW2ldW2Z1bmNCTFtpXS5sZW5ndGgtMV0gIT0gInsiICYmIGZ1bmNCTFtpXVtmdW5jQkxbaV0ubGVuZ3RoLTFdICE9ICImIiAmJiBmdW5jQkxbaV1bZnVuY0JMW2ldLmxlbmd0aC0xXSAhPSAifCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFsZXJ0KGZ1bmNCTFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICBmdW5jWCArPSAiICAgdmFyIHByb2ZpbGVyU3RhY2tJbmRleCA9IHByb2ZpbGVyU3RhY2subGVuZ3RoOyBwcm9maWxlclN0YWNrLnB1c2goeydmdW5jJzoiKyhjbGFzc05hbWUgPyBjbGFzc05hbWUrIi5wcm90b3R5cGUuIiA6ICIiKStmdW5jdGlvbk5hbWUrIiwndGltZVN0YXJ0JzpuZXcgRGF0ZSgpLmdldFRpbWUoKS8xMDAwLCdsZXZlbCc6cHJvZmlsZXJTdGFja0xldmVsfSk7IHByb2ZpbGVyU3RhY2tMZXZlbCsrOyBcbiI7CiAgICAgICAgLy9mdW5jWCArPSAiICAgdmFyIHByb2ZpbGVyU3RhY2tJbmRleCA9IHByb2ZpbGVyU3RhY2subGVuZ3RoOyBwcm9maWxlclN0YWNrLnB1c2goeyduYW1lJzoiKyhjbGFzc05hbWUgPyBjbGFzc05hbWUrIi4iIDogIiIpK2Z1bmN0aW9uTmFtZSsiLCd0aW1lU3RhcnQnOm5ldyBEYXRlKCkuZ2V0VGltZSgpLzEwMDB9KTsgcHJvZmlsZXJTdGFja0xldmVsKys7IFxuIjsKICAgICAgICBmdW5jQkwgPSBmdW5jQi5zcGxpdCgvXG4vZyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZnVuY0JMLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoZnVuY0JMW2ldLmluZGV4T2YoInJldHVybigiKSAhPSAtMSB8fCBmdW5jQkxbaV0uaW5kZXhPZigicmV0dXJuICIpICE9IC0xKSAmJiBmdW5jQkxbaV0uaW5kZXhPZigiaWYgKCIpID09IC0xICYmIGZ1bmNCTFtpXS5pbmRleE9mKCJmb3IgKCIpID09IC0xICYmIGZ1bmNCTFtpXVtmdW5jQkxbaV0ubGVuZ3RoLTFdID09ICI7IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9hbGVydChmdW5jQkxbaV0pOwogICAgICAgICAgICAgICAgZnVuY1ggKz0gInsgcHJvZmlsZXJTdGFja1twcm9maWxlclN0YWNrSW5kZXhdWyd0aW1lRW5kJ10gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS8xMDAwOyBwcm9maWxlclN0YWNrTGV2ZWwtLTsgIitmdW5jQkxbaV0rIiB9XG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZ1bmNYICs9IGZ1bmNCTFtpXSsiXG4iOwogICAgICAgIH0KICAgICAgICBmdW5jWCArPSAicHJvZmlsZXJTdGFja1twcm9maWxlclN0YWNrSW5kZXhdWyd0aW1lRW5kJ10gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS8xMDAwOyBwcm9maWxlclN0YWNrTGV2ZWwtLTsgXG4iOwogICAgICAgIGZ1bmNYICs9ICJ9XG4iOwogICAgICAgIAogICAgICAgIAogICAgICAgIC8qCiAgICAgICAgdmFyIGJyYWNrZXRDb3VudCA9IDA7CiAgICAgICAgdmFyIGluU3RhdGVtZW50ID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZnVuY0IubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGluU3RhdGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGZ1bmNCLnN1YnN0cmluZyhpLCBpKzIpID09ICJpZiIgfHwgZnVuY0Iuc3Vic3RyaW5nKGksIGkrMykgPT0gImZvciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluU3RhdGVtZW50ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY0JYICs9IGZ1bmNCW2ldOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgICAgIC8vZnVuY1ggKz0gIiAgIHByb2ZpbGVyU3RhY2sucHVzaCh7J25hbWUnOiIrKGNsYXNzTmFtZSA/IGNsYXNzTmFtZSsiLiIgOiAiIikrZnVuY3Rpb25OYW1lKyIsJ3RpbWVTdGFydCc6bmV3IERhdGUoKS5nZXRUaW1lKCkvMTAwMH0pOyBcbiI7CiAgICAgICAgLy9mdW5jWCArPSAiICAgIitmdW5jQisiXG4iOwogICAgICAgIC8vZnVuY1ggKz0gIn1cbiI7CiAgICAgICAgLyoKICAgICAgICBmdW5jWCArPSAiICAgdHJ5IHsgXG4iOwogICAgICAgIGZ1bmNYICs9ICIgICAgICAiK2Z1bmNCKyJcbiI7CiAgICAgICAgZnVuY1ggKz0gIiAgIH0gXG4iOwogICAgICAgIGZ1bmNYICs9ICIgICBjYXRjaChlKSB7IFxuIjsKICAgICAgICBmdW5jWCArPSAiICAgICAgX3Rocm93KGUpOyBcbiI7CiAgICAgICAgZnVuY1ggKz0gIiAgIH1cbiI7CiAgICAgICAgZnVuY1ggKz0gIn1cbiI7CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIC8vYWxlcnQoZnVuY1gpOwogICAgICAgICAgICB3aW5kb3cuZXZhbChmdW5jWCk7CiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgZnVuY3Rpb24gbmFtZSwgYmVjYXVzZSBub3QgaXQgYmVjb21lcyBhbm9ueW1vdXMgLSBmb3IgZXh0ZW5kRnVuY3Rpb24KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2NsYXNzTmFtZV0ucHJvdG90eXBlW2Z1bmN0aW9uTmFtZV0udG9TdHJpbmcoKV0gPSBmdW5jdGlvbk5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZXh0ZW5kZWRGdW5jdGlvbnNbb2JqW2Z1bmN0aW9uTmFtZV0udG9TdHJpbmcoKV0gPSBmdW5jdGlvbk5hbWU7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGUpCiAgICAgICAgewogICAgICAgICAgICBhbGVydCgiQWR2YW5jZWQgUHJvZmlsZXIgRGVidWdnZXI6ICIrZSsiXG5cbiIrZnVuY1gpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gZmluZCBhbGwgZnVuY3Rpb25zIGFuZCBhZGQgdHJ5IGNhdGNoCiAgICBmb3IgKHZhciBpIGluIG9iaikKICAgIHsKICAgICAgICBpZiAodHlwZW9mKG9ialtpXSkgPT0gImZ1bmN0aW9uIiAmJiAKICAgICAgICAgICAgaSAhPSAiX3Rocm93IiAmJiAKICAgICAgICAgICAgb2JqW2ldICE9IHdpbmRvdy5vbmVycm9yICYmIAogICAgICAgICAgICBvYmpbaV0gIT0gZ2V0RnVuY3Rpb25JbmZvICYmIAogICAgICAgICAgICBvYmpbaV0gIT0gZ2V0RnVuY3Rpb25OYW1lICYmIAogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVE9ETyAtIHJlbW92ZQogICAgICAgICAgICBnZXRGdW5jdGlvbk5hbWUob2JqW2ldKSAhPSAiR3JpZCIgJiYgCiAgICAgICAgICAgIAogICAgICAgICAgICBvYmpbaV0gIT0gX19leHRlbmRlZEphdmFTY3JpcHRFcnJvckNhdGNoIAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAvL2lmIChpLmluZGV4T2YoIlQiKSA9PSAwKQogICAgICAgICAgICAvLyAgICBhbGVydChpKTsKICAgICAgICAgICAgdmFyIGZ1bmMgPSBvYmpbaV07CiAgICAgICAgICAgIAogICAgICAgICAgICAvL3ZhciBmdW5jdGlvbk5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZnVuYyk7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZnVuY0kgPSBnZXRGdW5jdGlvbkluZm8oZnVuYyk7CiAgICAgICAgICAgIHZhciBmdW5jdGlvbk5hbWUgPSBmdW5jSVsibmFtZSJdOwogICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gZnVuY0lbImNsYXNzIl07CiAgICAgICAgICAgIHZhciBmdW5jUyA9IGZ1bmNJWyJhbGwiXSwgZnVuY0EgPSBmdW5jSVsiYXJncyJdLCBmdW5jQiA9IGZ1bmNJWyJib2R5Il07CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZnVuY3Rpb25OYW1lICYmICFfX2FscmVhZHlFeHRlbmRlZChmdW5jdGlvbk5hbWUsIG9iaiwgY2xhc3NOYW1lKSAmJiBmdW5jUy5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIikgPT0gLTEgJiYgCiAgICAgICAgICAgICAgICBmdW5jUy5pbmRleE9mKCJURGVidWciKSAhPSAwICYmIGNsYXNzTmFtZS5pbmRleE9mKCJURGVidWciKSAhPSAwICYmIGZ1bmN0aW9uTmFtZSAhPSAidGltZSIgJiYgCiAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUgIT0gIkRhdGUiICYmIGNsYXNzTmFtZSAhPSAiRGF0ZSIgJiYgCiAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUgIT0gIk1hdGgiICYmIGNsYXNzTmFtZSAhPSAiTWF0aCIgJiYKICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSAhPSAiZ2V0RXZlbnQiICYmIGZ1bmN0aW9uTmFtZSAhPSAiZ2V0TW91c2VFdmVudCIgJiYgZnVuY3Rpb25OYW1lICE9ICJnZXRLZXlFdmVudCIgJiYKICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZ1bmNYID0gIiI7CiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25OYW1lLmluZGV4T2YoIlQiKSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ2NsYXNzJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IG1vZGlmeSBjb25zdHJ1Y3Rvciwgb3IgYWxsIHByb3RvdHlwZXMgd2lsbCBiZSBsb3N0CiAgICAgICAgICAgICAgICAgICAgLy9fX2V4dGVuZEZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgZnVuY0EsIGZ1bmNCKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaSBpbiB3aW5kb3dbZnVuY3Rpb25OYW1lXS5wcm90b3R5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHdpbmRvd1tmdW5jdGlvbk5hbWVdLnByb3RvdHlwZVtpaV0pID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoZnVuY3Rpb25OYW1lKyIuIitpaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2Z1bmNJID0gZ2V0RnVuY3Rpb25JbmZvKHdpbmRvd1tmdW5jdGlvbk5hbWVdLnByb3RvdHlwZVtpaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChmdW5jdGlvbk5hbWUrIi4iK19mdW5jSVsiYWxsIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRlbmRGdW5jdGlvbihpaSwgX2Z1bmNJWyJhcmdzIl0sIF9mdW5jSVsiYm9keSJdLCBvYmosIGZ1bmN0aW9uTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX19leHRlbmRGdW5jdGlvbihmdW5jdGlvbk5hbWUsIGZ1bmNBLCBmdW5jQiwgb2JqKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9hbGVydChpKyI6ICIrd2luZG93W2ldKTsKICAgICAgICB9CiAgICB9CiAgICBzdG9wUHJvZmlsZXIoIl9fZXh0ZW5kZWRKYXZhU2NyaXB0UHJvZmlsZXJDYXRjaCIpOwp9CgovL2FkZEV2ZW50KHdpbmRvdywgImNoYW5nZSIsIGZ1bmN0aW9uKCl7YWxlcnQoJ3gnKX0pOwovKndpbmRvdy5vbmNoYW5nZSA9IGZ1bmN0aW9uKGUpewogICAgICAgIHZhbHVlID0gdmFsOwogICAgfSk7CiovCgovL0hUTUxTY3JpcHRFbGVtZW50LnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbigpe2FsZXJ0KCchISEnKX07CgpmdW5jdGlvbiBvblNjcmlwdExvYWRlZChlKQp7Cn0KCi8vIFRPRE8gLSBkbyBpdCBhbHNvIHdpdGggY2xhc3NlcyBhbmQgbWV0aG9kcwp2YXIgX19jb29raWUgPSBnZXRDb29raWUoIlByb2ZpbGVySmF2YVNjcmlwdERlYnVnUGFuZWwiKTsKaWYgKC8qZmFsc2UgJiYgKi9fX2Nvb2tpZSAmJiBfX2Nvb2tpZS5pbmRleE9mKCJcInZpc2libGVcIjp0cnVlIikgIT0gLTEpCnsKICAgIGV4dGVuZEZ1bmN0aW9uKG9uU2NyaXB0TG9hZGVkLCBmdW5jdGlvbihlKSAKICAgIHsKICAgICAgICBlID0gZ2V0RXZlbnQoZSk7IAogICAgICAgIAogICAgICAgIC8vIHdhdGNoIGZvciBuZXcgZGVmaW5lZCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKICAgICAgICAvL2R1bXAoZS50YXJnZXQuc3JjKTsKICAgICAgICBfX2V4dGVuZGVkSmF2YVNjcmlwdFByb2ZpbGVyQ2F0Y2goKTsKICAgIH0pOwp9Cgp2YXIgX19jb29raWUgPSBnZXRDb29raWUoIkRlYnVnRXJyb3JKYXZhU2NyaXB0RGVidWdQYW5lbCIpOwovL2FsZXJ0KF9fY29va2llKTsKaWYgKF9fY29va2llICYmIF9fY29va2llLmluZGV4T2YoIlwidmlzaWJsZVwiOnRydWUiKSAhPSAtMSkKewogICAgLy9hbGVydCgxKTsKICAgIGV4dGVuZEZ1bmN0aW9uKG9uU2NyaXB0TG9hZGVkLCBmdW5jdGlvbihlKSAKICAgIHsKICAgICAgICBlID0gZ2V0RXZlbnQoZSk7IAogICAgICAgIAogICAgICAgIC8vIHdhdGNoIGZvciBuZXcgZGVmaW5lZCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKICAgICAgICAvL2FsZXJ0KGUudGFyZ2V0LnNyYyk7CiAgICAgICAgLy9kdW1wKGUudGFyZ2V0LnNyYyk7CiAgICAgICAgX19leHRlbmRlZEphdmFTY3JpcHRFcnJvckNhdGNoKCk7CiAgICB9KTsKICAgIAogICAgLyoKICAgIHhfYWRkRXZlbnQgPSBhZGRFdmVudDsKICAgIGFkZEV2ZW50ID0gZnVuY3Rpb24oZWxlbSwgZXZlbnQsIGZ1bmMsIG9uY2VPbmx5KQogICAgewogICAgICAgIHZhciBfZnVuYyA9IGZ1bmM7CiAgICAgICAgdmFyIGZ1bmMyID0gZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBfZnVuYyhlKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoKF9fZSkgewogICAgICAgICAgICAgICAgX3Rocm93KF9fZSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB4X2FkZEV2ZW50KGVsZW0sIGV2ZW50LCBmdW5jMiwgb25jZU9ubHkpOwogICAgICAgIC8vYWxlcnQoZnVuYyk7CiAgICAgICAgLy9hbGVydChmdW5jMik7CiAgICB9CiAgICAqLwogICAgLy9hbGVydChhZGRFdmVudCk7Cn0KCi8vYWxlcnQoJ2RvbmUnKTsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKgpkdW1wKGV4dGVuZGVkRnVuY3Rpb25zKTsKZHVtcCgxMCk7CmR1bXAoMTAuMik7CmR1bXAoImhhbGxvIHdvcmxkIik7CmR1bXAoWzEwLDIwLDMwLDQwLDUwXSk7CmR1bXAoeydBJzoxMCwnQic6MjAsJ0MnOjMwLCdEJzo0MCwnRSc6NTB9KTsKZHVtcCh3aW5kb3cpOwpkdW1wKEFKQVgpOwpkdW1wKEJyb3dzZXIpOwpkdW1wKGRvY3VtZW50LmJvZHkuY2hpbGROb2Rlc1swXSk7Cgp4eHguY2FsbCgpOwoqLwoKCgpmdW5jdGlvbiBnZXRJbmxpbmVTdHlsZShlbGVtKQp7CiAgICB2YXIgdmFsdWVzID0ge307CiAgICAvL3ZhciBjc3MgPSBlbGVtLnN0eWxlLmNzc1RleHQ7IC8vICEhISEgbmVwb3V6aXQgLSBDaHJvbWUgeiBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0IHVkZWxhIHJlcGVhdCBuby1yZXBlYXQsIHogY2VudGVyIGJvdHRvbSBwYWsgNTAlIDEwMCUKICAgIHZhciBjc3MgPSBlbGVtLmdldEF0dHJpYnV0ZSgic3R5bGUiKTsKICAgIGlmIChjc3MpCiAgICB7CiAgICAgICAgY3NzID0gY3NzLnNwbGl0KCI7Iik7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgY3NzLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjc3NJdGVtID0gY3NzW2ldLnNwbGl0KCI6Iik7CiAgICAgICAgICAgIHZhciBuYW1lID0gdHJpbShjc3NJdGVtLnNoaWZ0KCkpOyAgICAgLy8gbWF5IGV4aXN0IGJhY2tncm91bmQ6dXJsKGh0dHA6Ly8vKQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0cmltKGNzc0l0ZW0uam9pbigiOiIpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCJ1cmwoIikgPT09IDAgJiYgdmFsdWUuaW5kZXhPZigidXJsKFwiIikgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL3VybFwoL2csICJ1cmwoXCIiKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXCkvZywgIlwiKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB2YWx1ZSA9IHJnYkNvbG9yMkhleCh2YWx1ZSk7CiAgICAgICAgICAgIGlmIChuYW1lICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybih2YWx1ZXMpOwp9CgpmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzKGVsZW0pCnsKICAgIHZhciBhdHRyaWJ1dGVzID0ge307CiAgICAvL2R1bXAoZWxlbSk7CiAgICBpZiAoZWxlbS5hdHRyaWJ1dGVzKQogICAgewogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW0uYXR0cmlidXRlcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXR0ciA9IGVsZW0uYXR0cmlidXRlcy5pdGVtKGkpOwogICAgICAgICAgICAvL2R1bXAoYXR0cik7CiAgICAgICAgICAgIGlmIChCcm93c2VyLm5hbWUgPT0gIkV4cGxvcmVyIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gOCkgLy8gSUU8PTggaGFzIGFsbCB2YXJpYWJsZXMgYXMgYXR0cmlidXRlcyAtIHdlIG11c3Qgb21taXQgdGhlbSBvciBpdCB3aWxsIGNvbnZlcnQgYXJyYXkgdG8gc3RyaW5nLi4uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCh0eXBlb2YoYXR0cikpOwogICAgICAgICAgICAgICAgLy8gbmV2aW0sIHByb2MgYnlsYSB0YXRvIHBvZG1pbmthCiAgICAgICAgICAgICAgICAvL2lmICh0eXBlb2YoYXR0cikgPT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vaWYgKHR5cGVvZihhdHRyKSA9PSAib2JqZWN0IiAmJiB0eXBlb2YoYXR0ci5ub2RlVmFsdWUpID09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgLy8gbmVjaGF0IGkgb2JqZWt0eQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbYXR0ci5ub2RlTmFtZV0gPSBhdHRyLm5vZGVWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgYXR0cmlidXRlc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcChhdHRyaWJ1dGVzKTsKICAgIHJldHVybihhdHRyaWJ1dGVzKTsKfQoKZnVuY3Rpb24gY29weUVsZW1lbnRQcm9wZXJ0aWVzKGZyb20sIHRvLCB0eXBlLCBpZ25vcmVkKQp7CiAgICBpZiAoIXR5cGUpCiAgICAgICAgdHlwZSA9IFtdOwogICAgaWYgKCFpZ25vcmVkKQogICAgICAgIGlnbm9yZWQgPSBbXTsKICAgICAgICAKICAgIGlmIChpbl9hcnJheSgiY3NzIiwgdHlwZSkgfHwgdHlwZS5sZW5ndGggPT0gMCkKICAgIHsKICAgICAgICB2YXIgY3NzID0gZ2V0SW5saW5lU3R5bGUoZnJvbSk7CiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjc3MpCiAgICAgICAgewogICAgICAgICAgICAvL2FsZXJ0KG5hbWUrIjogIitjc3NbbmFtZV0pOwoKICAgICAgICAgICAgc2V0U3R5bGUodG8sIG5hbWUsIGNzc1tuYW1lXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyByZW1vdmVkIGR1ZSB0byBjc3NGbG9hdAogICAgICAgICAgICAvL3RvLnN0eWxlW2NhbWVsaXplKG5hbWUpXSA9IGNzc1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoX19lbGVtZW50RXZlbnRzW2Zyb20uX2V2ZW50SWRdICYmIChpbl9hcnJheSgiZXZlbnRzIiwgdHlwZSkgfHwgdHlwZS5sZW5ndGggPT0gMCkpCiAgICB7CiAgICAgICAgLy9kdW1wKF9fZWxlbWVudEV2ZW50cyk7CiAgICAgICAgLy9kdW1wKGZyb20pOwogICAgICAgIC8vZHVtcChfX2VsZW1lbnRFdmVudHNbZnJvbS5fZXZlbnRJZF0ubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBfX2VsZW1lbnRFdmVudHNbZnJvbS5fZXZlbnRJZF0ubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGV2ZW50ID0gX19lbGVtZW50RXZlbnRzW2Zyb20uX2V2ZW50SWRdW2ldOwogICAgICAgICAgICAvL2R1bXAoZXZlbnQpOwogICAgICAgICAgICBhZGRFdmVudCh0bywgZXZlbnRbIm5hbWUiXSwgZXZlbnRbImZ1bmN0aW9uIl0pOwogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcCgiISEhISEhISEhISEiKTsKICAgIC8vZHVtcCh0eXBlLmxlbmd0aCk7CiAgICBpZiAoaW5fYXJyYXkoImF0dHJpYnV0ZXMiLCB0eXBlKSB8fCBpbl9hcnJheSgiYXR0ciIsIHR5cGUpIHx8IHR5cGUubGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKGZyb20pOwogICAgICAgIGZvciAodmFyIG5hbWUgaW4gYXR0cmlidXRlcykKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChuYW1lKTsKICAgICAgICAgICAgLy9kdW1wKGF0dHJpYnV0ZXNbbmFtZV0pOwogICAgICAgICAgICBpZiAoIWluX2FycmF5KG5hbWUsIGlnbm9yZWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAiY2xhc3MiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEF1dG9TaXplCiAgICAgICAgICAgICAgICAgICAgdG8uc2V0QXR0cmlidXRlKCJjbGFzcyIsICIiKTsKICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUodG8sIGF0dHJpYnV0ZXNbbmFtZV0pOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcChhdHRyaWJ1dGVzW25hbWVdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL3RvLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGVzW25hbWVdKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGF0dHJpYnV0ZXNbbmFtZV0pID09ICJvYmplY3QiKQogICAgICAgICAgICAgICAgICAgICAgICB0b1tuYW1lXSA9IGF0dHJpYnV0ZXNbbmFtZV07CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB0by5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlc1tuYW1lXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGNhbGwoZnVuYywgYXN5bmMpCnsKICAgIGlmICh0eXBlb2YoYXN5bmMpID09ICJ1bmRlZmluZWQiIHx8IGFzeW5jID09PSBmYWxzZSkKICAgIHsKICAgICAgICBmdW5jKCk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YoYXN5bmMpID09ICJmdW5jdGlvbiIpCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMoKTthc3luYygpO30sMTAwKTsKICAgIGVsc2UKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZnVuYygpO30sMTAwKTsKfQoKZnVuY3Rpb24gY2xvbmVOb2RlKG5vZGUsIGNoaWxkSXRlbXMpCnsKICAgIGlmICh0eXBlb2YoY2hpbGRJdGVtcykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgY2hpbGRJdGVtcyA9IHRydWU7CiAgICAgICAgCiAgICByZXR1cm4obm9kZS5jbG9uZU5vZGUoY2hpbGRJdGVtcykpOwp9CgpmdW5jdGlvbiBfYW5pbWF0ZUlzQXR0cmlidXRlKG5hbWUpCnsKICAgIHN3aXRjaChuYW1lKQogICAgewogICAgICAgIGNhc2UgInNjcm9sbExlZnQiOgogICAgICAgIGNhc2UgInNjcm9sbFJpZ2h0IjoKICAgICAgICAgICAgcmV0dXJuKHRydWUpOwogICAgfQogICAgCiAgICByZXR1cm4oZmFsc2UpOwp9CiAgICAKdmFyIF9fYW5pbWF0ZVNwZWVkID0gMzA7CmZ1bmN0aW9uIGFuaW1hdGUoZWxlbSwgcHJvcGVydGllcywgdGltZSwgdHJhbnNpdGlvbiwgb25GaW5pc2gpCnsKICAgIGVsZW0gPSBnZXRFbGVtZW50KGVsZW0pOwogICAgaWYgKCFlbGVtKQogICAgewogICAgICAgIF90aHJvdygnYW5pbWF0ZSgpOiBlbGVtIG5vdCBmb3VuZCcpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uRnVuY3Rpb24odHJhbnNpdGlvbikKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHRyYW5zaXRpb24pID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHJldHVybih0cmFuc2l0aW9uKTsKICAgICAgICAKICAgICAgICBpZiAodHJhbnNpdGlvbiA9PSAibGluZWFyIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgIHJldHVybih4KTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgaWYgKHRyYW5zaXRpb24gPT0gImV4cCIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgICAvL3JldHVybihNYXRoLmV4cCh4LTIqTWF0aC5FKS9NYXRoLkUpOwogICAgICAgICAgICAgICAgcmV0dXJuKHgqeCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIGlmICh0cmFuc2l0aW9uID09ICJzcXJ0IikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgIHJldHVybihNYXRoLnNxcnQoeCkpOwogICAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICBpZiAodHJhbnNpdGlvbiA9PSAic2luIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgIHJldHVybigoTWF0aC5zaW4oKE1hdGguUEkqeCktTWF0aC5QSS8yKS8yKSswLjUpOwogICAgICAgICAgICAgICAgLy9yZXR1cm4oKC1NYXRoLmNvcyh4Kk1hdGguUEkpLzIpKzAuNSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIGlmICh0cmFuc2l0aW9uID09ICJhc2luIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgIHJldHVybigoTWF0aC5hc2luKDIqeC0xKStNYXRoLlBJLzIpL01hdGguUEkpOwogICAgICAgICAgICAgICAgLy9yZXR1cm4oKC1NYXRoLmNvcyh4Kk1hdGguUEkpLzIpKzAuNSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQogICAgCiAgICAvL2R1bXAoZWxlbSk7CiAgICBpZiAodHlwZW9mKHRyYW5zaXRpb24pID09ICJ1bmRlZmluZWQiIHx8IHRyYW5zaXRpb24gPT09IG51bGwpCiAgICAgICAgdHJhbnNpdGlvbiA9ICJzaW4iOwogICAgaWYgKHR5cGVvZihvbkZpbmlzaCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgb25GaW5pc2ggPSBudWxsOwogICAgaWYgKHR5cGVvZih0aW1lKSA9PSAidW5kZWZpbmVkIiB8fCB0aW1lID09PSBudWxsKQogICAgICAgIHRpbWUgPSAxMDAwOwogICAgaWYgKHRpbWUgPCBfX2FuaW1hdGVTcGVlZCkKICAgICAgICB0aW1lID0gX19hbmltYXRlU3BlZWQ7CiAgICAKICAgIGZvciAodmFyIGkgaW4gcHJvcGVydGllcykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHByb3BlcnRpZXNbaV0gIT0gIm9iamVjdCIpKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gcHJvcGVydGllc1tpXTsKICAgICAgICAgICAgcHJvcGVydGllc1tpXSA9IHt9OwogICAgICAgICAgICBwcm9wZXJ0aWVzW2ldWyJ2YWx1ZSJdID0gdmFsdWU7CiAgICAgICAgfQogICAgICAgIGlmIChfYW5pbWF0ZUlzQXR0cmlidXRlKGkpKQogICAgICAgICAgICBwcm9wZXJ0aWVzW2ldWyJ2YWx1ZUZyb20iXSA9IGV4dHJhY3RGbG9hdChlbGVtW2ldKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHByb3BlcnRpZXNbaV1bInZhbHVlRnJvbSJdID0gZXh0cmFjdEZsb2F0KGdldFN0eWxlKGVsZW0sIGkpKTsKICAgICAgICAvL2R1bXAoZ2V0U3R5bGUoZWxlbSwgaSkpOwogICAgICAgIHZhciB2YWx1ZVRvID0gcHJvcGVydGllc1tpXVsidmFsdWUiXTsKICAgICAgICBpZiAodHlwZW9mKHZhbHVlVG8pID09ICJzdHJpbmciKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZhbHVlVG8uaW5kZXhPZigiKz0iKSB8fCB2YWx1ZVRvLmluZGV4T2YoIi09IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBwcm9wZXJ0aWVzW2ldWyJ2YWx1ZUZyb20iXStleHRyYWN0RmxvYXQodmFsdWVUbyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJvcGVydGllc1tpXVsidmFsdWVUbyJdID0gZXh0cmFjdEZsb2F0KHZhbHVlVG8pOwogICAgICAgICAgICAKICAgICAgICBkZWxldGUocHJvcGVydGllc1tpXVsidmFsdWUiXSk7CiAgICAgICAgaWYgKHR5cGVvZihwcm9wZXJ0aWVzW2ldWyJ0cmFuc2l0aW9uIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBwcm9wZXJ0aWVzW2ldWyJ0cmFuc2l0aW9uIl0gPSB0cmFuc2l0aW9uIHx8ICJsaW5lYXIiOwoKICAgICAgICAKICAgICAgICBwcm9wZXJ0aWVzW2ldWyJ0cmFuc2l0aW9uRm5jIl0gPSBnZXRUcmFuc2l0aW9uRnVuY3Rpb24ocHJvcGVydGllc1tpXVsidHJhbnNpdGlvbiJdKTsKCiAgICAgICAgcHJvcGVydGllc1tpXVsiaW5kZXgiXSA9IDA7CiAgICAgICAgCiAgICAgICAgcHJvcGVydGllc1tpXVsidGltZVN0ZXAiXSA9IF9fYW5pbWF0ZVNwZWVkOyAvLyBtYXggb25jZSBwZXIgMTAwbXMKICAgICAgICBwcm9wZXJ0aWVzW2ldWyJ0b3RhbCJdID0gdGltZS9wcm9wZXJ0aWVzW2ldWyJ0aW1lU3RlcCJdOyAvLyBtYXggb25jZSBwZXIgMTAwbXMKICAgICAgICAvL2R1bXAocHJvcGVydGllc1tpXVsidG90YWwiXSk7CiAgICAgICAgcHJvcGVydGllc1tpXVsidmFsdWVSYW5nZSJdID0gKHByb3BlcnRpZXNbaV1bInZhbHVlVG8iXS1wcm9wZXJ0aWVzW2ldWyJ2YWx1ZUZyb20iXSk7CiAgICAgICAgCiAgICAgICAgcHJvcGVydGllc1tpXVsiZmluaXNoZWQiXSA9IGZhbHNlOwogICAgfQoKICAgIC8vZHVtcChwcm9wZXJ0aWVzKTsKICAgIHZhciBhbmltYXRpb24gPSB7J2VsZW0nOmVsZW0sICdwcm9wZXJ0aWVzJzpwcm9wZXJ0aWVzLCAndGltZW91dCc6X19hbmltYXRlU3BlZWQsICd0aW1lJzp0aW1lLCAndHJhbnNpdGlvbic6dHJhbnNpdGlvbiwgJ29uRmluaXNoJzpvbkZpbmlzaH07CiAgICBfYW5pbWF0ZShhbmltYXRpb24pOwp9CgpmdW5jdGlvbiBfYW5pbWF0ZShhbmltYXRpb24pCnsKICAgIHZhciBlbGVtID0gYW5pbWF0aW9uWyJlbGVtIl07CgogICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiQ2hyb21lIiAmJiBCcm93c2VyLnZlcnNpb24gPj0gMjYgfHwgCiAgICAgICAgQnJvd3Nlci5uYW1lID09ICJGaXJlZm94IiAmJiBCcm93c2VyLnZlcnNpb24gPj0gMTYgfHwgCiAgICAgICAgQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uID49IDEwIHx8IAogICAgICAgIEJyb3dzZXIubmFtZSA9PSAiT3BlcmEiICYmIEJyb3dzZXIudmVyc2lvbiA+PSAxMiB8fCAKICAgICAgICBCcm93c2VyLm5hbWUgPT0gIlNhZmFyaSIgJiYgQnJvd3Nlci52ZXJzaW9uID49IDYKICAgICkKICAgIHsKICAgICAgICBzZXRTdHlsZShlbGVtLCAidHJhbnNpdGlvbiIsICJub25lIik7CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSBpbiBhbmltYXRpb25bInByb3BlcnRpZXMiXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YoaSkgPT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJ2YWx1ZUZyb20iXTsKICAgICAgICAgICAgICAgIGlmIChpLmluZGV4T2YoInNjcm9sbCIpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgIT0gIm9wYWNpdHkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSkrInB4IjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCBpLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoaSk7CiAgICAgICAgICAgICAgICAvL2R1bXAodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNldFN0eWxlKGVsZW0sICJ0cmFuc2l0aW9uLXByb3BlcnR5IiwgImFsbCIpOwogICAgICAgIHNldFN0eWxlKGVsZW0sICJ0cmFuc2l0aW9uLWR1cmF0aW9uIiwgYW5pbWF0aW9uWyJ0aW1lIl0rIm1zIik7CiAgICAgICAgdmFyIHRyYW5zaXRpb25GbmMgPSBhbmltYXRpb25bInRyYW5zaXRpb24iXTsKICAgICAgICBpZiAodHJhbnNpdGlvbkZuYyA9PSAiZXhwIikKICAgICAgICAgICAgdHJhbnNpdGlvbkZuYyA9ICJlYXNlLWluIjsKICAgICAgICBpZiAodHJhbnNpdGlvbkZuYyA9PSAic3FydCIpCiAgICAgICAgICAgIHRyYW5zaXRpb25GbmMgPSAiZWFzZS1vdXQiOwogICAgICAgIGlmICh0cmFuc2l0aW9uRm5jID09ICJzaW4iKQogICAgICAgICAgICB0cmFuc2l0aW9uRm5jID0gImVhc2UiOwogICAgICAgIGlmICh0cmFuc2l0aW9uRm5jID09ICJhc2luIikKICAgICAgICAgICAgdHJhbnNpdGlvbkZuYyA9ICJlYXNlLWluLW91dCI7CiAgICAgICAgLy8gb3IgYW5vdGhlciBDU1MzIGZ1bmN0aW9uCiAgICAgICAgCiAgICAgICAgLy9kdW1wKHRyYW5zaXRpb25GbmMpOwoKICAgICAgICBzZXRTdHlsZShlbGVtLCAidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24iLCB0cmFuc2l0aW9uRm5jKTsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBpIGluIGFuaW1hdGlvblsicHJvcGVydGllcyJdKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZihpKSA9PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gYW5pbWF0aW9uWyJwcm9wZXJ0aWVzIl1baV1bInZhbHVlVG8iXTsKICAgICAgICAgICAgICAgIGlmIChpLmluZGV4T2YoInNjcm9sbCIpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgIT0gIm9wYWNpdHkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSkrInB4IjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRTdHlsZShlbGVtLCBpLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIF9lbGVtID0gZWxlbTsKICAgICAgICB2YXIgX29uRmluaXNoID0gYW5pbWF0aW9uWyJvbkZpbmlzaCJdOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0U3R5bGUoX2VsZW0sICJ0cmFuc2l0aW9uIiwgIm5vbmUiKTsKICAgICAgICAgICAgaWYgKF9vbkZpbmlzaCkKICAgICAgICAgICAgICAgIF9vbkZpbmlzaCgpOwogICAgICAgIH0sIGFuaW1hdGlvblsidGltZSJdKTsgICAgICAgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBpIGluIGFuaW1hdGlvblsicHJvcGVydGllcyJdKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZihpKSA9PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb25bInByb3BlcnRpZXMiXVtpXVsiZmluaXNoZWQiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9ICgxL01hdGguYWJzKGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJ0b3RhbCJdKSkqYW5pbWF0aW9uWyJwcm9wZXJ0aWVzIl1baV1bImluZGV4Il07ICAvLyA8MCwxPgogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gYW5pbWF0aW9uWyJwcm9wZXJ0aWVzIl1baV1bInRyYW5zaXRpb25GbmMiXSh4KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJpbmRleCJdIDwgYW5pbWF0aW9uWyJwcm9wZXJ0aWVzIl1baV1bInRvdGFsIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJ2YWx1ZVJhbmdlIl0gPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhbmltYXRpb25bInByb3BlcnRpZXMiXVtpXVsidmFsdWVGcm9tIl0gKyB5Kk1hdGguYWJzKGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJ2YWx1ZVJhbmdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJ2YWx1ZUZyb20iXSAtIHkqTWF0aC5hYnMoYW5pbWF0aW9uWyJwcm9wZXJ0aWVzIl1baV1bInZhbHVlUmFuZ2UiXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblsicHJvcGVydGllcyJdW2ldWyJmaW5pc2hlZCJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYW5pbWF0aW9uWyJwcm9wZXJ0aWVzIl1baV1bInZhbHVlVG8iXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgieD0iK3gpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgieT0iK3kpOwogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgidmFsdWU9Iit2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkuaW5kZXhPZigic2Nyb2xsIikgPT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgIT0gIm9wYWNpdHkiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKSsicHgiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vZHVtcCgiYW5pbWF0ZSgpOiAiK2krIiAiK3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoX2FuaW1hdGVJc0F0dHJpYnV0ZShpKSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVtpXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKGVsZW0sIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25bInByb3BlcnRpZXMiXVtpXVsiaW5kZXgiXSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vdmFyIGluY3JlbWVudCA9IHkKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vc2V0U3R5bGUoZWxlbSwgaSwgZXh0cmFjdEZsb2F0KGdldFN0eWxlKGVsZW0sIGkpKSthbmltYXRpb25bInN0ZXAiXSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChhbmltYXRpb25bInByb3BlcnRpZXMiXVtpXVsiaW5kZXgiXSA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYW5pbWF0aW9uWyJzdGVwIl0gPCAwICYmIGV4dHJhY3RGbG9hdChnZXRTdHlsZShlbGVtLCBpKSkgPiBhbmltYXRpb25bInByb3BlcnRpZXMiXVtpXSkKICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIWZpbmlzaGVkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF9hbmltYXRpb24gPSBhbmltYXRpb247CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfYW5pbWF0ZShfYW5pbWF0aW9uKX0sIGFuaW1hdGlvblsidGltZW91dCJdKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGFuaW1hdGlvblsib25GaW5pc2giXSkKICAgICAgICAgICAgICAgIGFuaW1hdGlvblsib25GaW5pc2giXSgpOwogICAgICAgIH0gICAgICAgIAogICAgfQp9CgpmdW5jdGlvbiBoZWxwKHBhcmFtcykKewogICAgaWYgKHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IHt9OwogICAgCiAgICBpZiAodHlwZW9mKHBhcmFtc1sidGFibGVOYW1lIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtc1sidGFibGVOYW1lIl0gPSB0YWJsZU5hbWU7CiAgICBpZiAodHlwZW9mKHBhcmFtc1sibGF5b3V0TmFtZSJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbImxheW91dE5hbWUiXSA9IGxheW91dE5hbWU7CgogICAgaWYgKHBhcmFtc1siZWxlbWVudCJdKQogICAgewogICAgICAgIHZhciBlbGVtID0gZ2V0RWxlbWVudChwYXJhbXNbImVsZW1lbnQiXSk7CiAgICAgICAgdmFyIGVsZW1lbnRJZCA9IFtdOwogICAgICAgIHdoaWxlKGVsZW0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbS5pZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWxlbWVudElkLnB1c2goZWxlbS5pZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgdmFyIGVsZW0gPSBnZXRFbGVtZW50KHBhcmFtc1siZWxlbWVudCJdKTsKICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgd2hpbGUoZWxlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBPYmplY3QgPSBmaW5kT2JqZWN0KGVsZW0pOwogICAgICAgICAgICBpZiAoT2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnBhcmFtc1siaGVscCJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gT2JqZWN0LnBhcmFtc1siaGVscCJdKQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBPYmplY3QucGFyYW1zWyJoZWxwIl1baV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2R1bXAocGFyYW1zKTsKCiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IE9iamVjdC5jb250YWluZXIgfHwgT2JqZWN0LmVsZW1lbnQ7CiAgICAgICAgICAgICAgICBpZiAoZWxlbSkKICAgICAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpID4gMTAwKSAvLyBhbnRpbG9vcAogICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgIH0KCiAgICAgICAgaWYgKGVsZW1lbnRJZC5sZW5ndGgpCiAgICAgICAgICAgIHBhcmFtc1siZWxlbWVudElkIl0gPSBlbGVtZW50SWQuam9pbigifCIpOwogICAgICAgIAogICAgICAgIHZhciBlbGVtZW50Q2xhc3MgPSBbXTsKICAgICAgICB2YXIgZWxlbSA9IGdldEVsZW1lbnQocGFyYW1zWyJlbGVtZW50Il0pOwogICAgICAgIHdoaWxlKGVsZW0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbS5jbGFzc05hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gZWxlbS5jbGFzc05hbWUuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGNsYXNzZXMubGVuZ3RoIDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzW2ldLmluZGV4T2YoImF1dG8iKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Q2xhc3MucHVzaChjbGFzc2VzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVsZW1lbnRDbGFzcy5sZW5ndGgpCiAgICAgICAgICAgIHBhcmFtc1siZWxlbWVudENsYXNzIl0gPSBlbGVtZW50Q2xhc3Muam9pbigifCIpOwoKICAgICAgICBkZWxldGUocGFyYW1zWyJlbGVtZW50Il0pOwogICAgfQogICAgCiAgICB2YXIgdXJsID0gUFJPSkVDVFVSTCsiaW5kZXgucGhwP3RvcD10cnVlJnN0eWxlPWhlbHAmIitnZXRQYXJhbXNBc0xpbmsocGFyYW1zKTsKICAgIHdpbmRvdy5vcGVuKHVybCwgJ19oZWxwJywgJ3dpZHRoPTEwMDAsaGVpZ2h0PTgwMCxtZW51YmFyPXllcyxyZXNpemFibGU9eWVzJyk7Cn0KCi8qCmZ1bmN0aW9uIGdldFZhbHVlc0luRWxlbWVudChjb250YWluZXIsIGVtcHR5LCBza2lwRWxlbWVudHNJbkNsYXNzLCBjaGlsZE9ubHkpCnsKICAgIGZ1bmN0aW9uIF9fY2xlYXJFbXB0eShhLCBlbXB0eSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGEpID09ICJvYmplY3QiKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoYVtpXSA9PSAiXG4iKQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZShhW2ldKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFbaV0gPT0gIiIgJiYgIWVtcHR5KQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZShhW2ldKTsKICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYVtpXSA9IF9fY2xlYXJFbXB0eShhW2ldLCBlbXB0eSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpaSBpbiBhKQogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIWZvdW5kKQogICAgICAgICAgICAgICAgcmV0dXJuKCIiKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBBcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MCA7IGkgPCBhLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGFbaV0gPT0gIlxuIikKICAgICAgICAgICAgICAgICAgICBkZWxldGUoYVtpXSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChhW2ldID09ICIiICYmICFlbXB0eSkKICAgICAgICAgICAgICAgICAgICBkZWxldGUoYVtpXSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYVtpXSA9IF9fY2xlYXJFbXB0eShhW2ldLCBlbXB0eSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFhLmxlbmd0aCkKICAgICAgICAgICAgICAgIHJldHVybigiIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuKGEpOwoKICAgICAgICByZXR1cm4oYSk7CiAgICB9CgogICAgY29udGFpbmVyID0gZ2V0RWxlbWVudChjb250YWluZXIpOwogICAgCiAgICBpZiAodHlwZW9mKGVtcHR5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBlbXB0eSA9IGZhbHNlOwogICAgaWYgKHR5cGVvZihjaGlsZE9ubHkpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGNoaWxkT25seSA9IGZhbHNlOwogICAgaWYgKHR5cGVvZihza2lwRWxlbWVudHNJbkNsYXNzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBza2lwRWxlbWVudHNJbkNsYXNzID0gIiI7CgogICAgaWYgKGNoaWxkT25seSkKICAgICAgICB2YXIgZWxlbXMgPSBnZXRDaGlsZEVsZW1lbnRzQnlUYWdOYW1lKFsiaW5wdXQiLCJzZWxlY3QiLCJ0ZXh0YXJlYSJdLCBjb250YWluZXIpOwogICAgZWxzZQogICAgICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKFsiaW5wdXQiLCJzZWxlY3QiLCJ0ZXh0YXJlYSJdLCBjb250YWluZXIpOwogICAgCiAgICB2YXIgdmFsdWVzID0ge307CiAgICAvL2R1bXAoZW1wdHkpOwogICAgLy9kdW1wKGVsZW1zKTsKICAgIC8vZHVtcCgiPT09PSIpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIC8vZHVtcChlbGVtcyk7CiAgICAgICAgaWYgKGVsZW1zW2ldLnRhZ05hbWUgPT0gIlNFTEVDVCIgJiYgZWxlbXNbaV0ubXVsdGlwbGUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIF92YWx1ZXMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBlbGVtc1tpXS5vcHRpb25zLmxlbmd0aCA7IGlpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5vcHRpb25zW2lpXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoZWxlbXNbaV0ub3B0aW9uc1tpaV0uZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKTsKICAgICAgICAgICAgICAgIGlmIChlbGVtc1tpXS5vcHRpb25zW2lpXS5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIikgJiYgKGVtcHR5IHx8IGVsZW1zW2ldLm9wdGlvbnNbaWldLnZhbHVlKSkKICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLnB1c2goZWxlbXNbaV0ub3B0aW9uc1tpaV0udmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZWxlbXNbaV0uX192YWx1ZSA9IF92YWx1ZXMuam9pbigifCIpOwogICAgICAgICAgICBlbGVtc1tpXS5fX3ZhbHVlID0gKF92YWx1ZXMubGVuZ3RoID8gX3ZhbHVlcyA6ICIiKTsKICAgICAgICAgICAgZWxlbXNbaV0uX19uYW1lID0gc3RyX3JlcGxhY2UoIltdIiwgIiIsIGVsZW1zW2ldLm5hbWUpOwogICAgICAgICAgICAvL2R1bXAoZWxlbXNbaV0udmFsdWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2lmIChlbGVtc1tpXS5vYmplY3QgJiYgIWhhc0NsYXNzTmFtZShlbGVtc1tpXSwgImNoaWxkQ29tcG9uZW50IikgJiYgIWhhc0NsYXNzTmFtZShlbGVtc1tpXSwgIl9DaGlsZENvbXBvbmVudCIpKQogICAgICAgIC8vewogICAgICAgIC8vICAgIHZhbHVlc1tlbGVtc1tpXS5uYW1lXSA9IGVsZW1zW2ldLm9iamVjdC5nZXRWYWx1ZSgpOwogICAgICAgIC8vICAgIGlmICghdmFsdWVzW2VsZW1zW2ldLm5hbWVdICYmICFlbXB0eSkKICAgICAgICAvLyAgICAgICAgZGVsZXRlKHZhbHVlc1tlbGVtc1tpXS5uYW1lXSk7CiAgICAgICAgLy99CiAgICAgICAgLy9lbHNlCiAgICAgICAgLy8gICAgdmFsdWVzW2VsZW1zW2ldLm5hbWVdID0gZWxlbXNbaV0udmFsdWU7CiAgICAgICAgCiAgICAgICAgaWYgKGVtcHR5IHx8IGVsZW1zW2ldLl9fdmFsdWUgfHwgZWxlbXNbaV0udmFsdWUgfHwgKGVsZW1zW2ldLm9iamVjdCAmJiAoZWxlbXNbaV0ub2JqZWN0LmdldFZhbHVlIHx8IGVsZW1zW2ldLm9iamVjdC5nZXRWYWx1ZXMpKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXQgPSB0cnVlOwogICAgICAgICAgICBpZiAoc2tpcEVsZW1lbnRzSW5DbGFzcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF9lbGVtID0gZWxlbXNbaV07CiAgICAgICAgICAgICAgICB3aGlsZShfZWxlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ2xhc3NOYW1lKF9lbGVtLCBza2lwRWxlbWVudHNJbkNsYXNzKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VsZW0gPSBfZWxlbS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZWxlbXNbaV0udGFnTmFtZSA9PSAiSU5QVVQiICYmIChlbGVtc1tpXS50eXBlID09ICJjaGVja2JveCIgfHwgZWxlbXNbaV0udHlwZSA9PSAicmFkaW8iKSAmJiAhZWxlbXNbaV0uY2hlY2tlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW1zW2ldLm5hbWUpOwogICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbGVtc1tpXS5uYW1lICYmIHJldCAmJiByZXQgIT0gIlxuIiAmJiAhaGFzQ2xhc3NOYW1lKGVsZW1zW2ldLCAiY2hpbGRDb21wb25lbnQiKSAmJiAhaGFzQ2xhc3NOYW1lKGVsZW1zW2ldLCAiX0NoaWxkQ29tcG9uZW50IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5uYW1lKTsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5fX3ZhbHVlIHx8IGVsZW1zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgIHZhciBlbGVtTmFtZSA9IGVsZW1zW2ldLl9fbmFtZSB8fCBlbGVtc1tpXS5uYW1lOwogICAgICAgICAgICAgICAgLy9pZiAoZWxlbU5hbWUuaW5kZXhPZigiWyIpICE9PSAtMSkKICAgICAgICAgICAgICAgIHZhciBlbGVtVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGVsZW1zW2ldLm9iamVjdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbXNbaV0ub2JqZWN0LmdldFZhbHVlcyAmJiBlbGVtc1tpXS5vYmplY3QucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSBlbGVtc1tpXS5vYmplY3QuZ2V0VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbXNbaV0ub2JqZWN0LmdldFZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSBlbGVtc1tpXS5vYmplY3QuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSAoZWxlbXNbaV0uX192YWx1ZSB8fCBlbGVtc1tpXS52YWx1ZSk7CgogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW1zW2ldKTsKICAgICAgICAgICAgICAgIC8vZHVtcCh0eXBlb2YoZWxlbXNbaV0ub2JqZWN0KSk7CiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUuaW5kZXhPZigiWyIpID4gMCkgLy8gdG8gbm90IHNwbGl0IEpTT04gW2FycmF5XQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lUGFydHMgPSBlbGVtTmFtZS5zcGxpdCgiWyIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gdmFsdWVzOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwIDsgcCA8IG5hbWVQYXJ0cy5sZW5ndGggOyBwKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcnQgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCBuYW1lUGFydHNbcF0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAobmFtZVBhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAobmFtZVBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbmFtZVBhcnRzLmxlbmd0aC0xKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVBhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydFtuYW1lUGFydF0gPSBlbGVtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJ0LnB1c2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnB1c2goZWxlbVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgiISIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHBhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXBhcnRbbmFtZVBhcnRdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyX3JlcGxhY2UoIl0iLCAiIiwgbmFtZVBhcnRzW3ArMV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRbbmFtZVBhcnRdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydFtuYW1lUGFydF0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydFtuYW1lUGFydF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tlbGVtTmFtZV0gPSBlbGVtVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9kdW1wKCI/Iik7CiAgICAgICAgICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgaWYgKGNoaWxkT25seSkKICAgICAgICB2YXIgZWxlbXMgPSBnZXRDaGlsZEVsZW1lbnRzQnlOb2RlVHlwZShDT01NRU5UX05PREUsIGNvbnRhaW5lcik7CiAgICBlbHNlCiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeU5vZGVUeXBlKENPTU1FTlRfTk9ERSwgY29udGFpbmVyKTsKICAgIC8vZHVtcChjb250YWluZXIpOwogICAgLy9kdW1wKGVsZW1zKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBpZiAoZWxlbXNbaV0ubm9kZVZhbHVlICYmIGVsZW1zW2ldLm5vZGVWYWx1ZS5pbmRleE9mKCJoaWRkZW46IikgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5ub2RlVmFsdWUuc3Vic3RyaW5nKDcsIDEwMDAwMCkpOwogICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBKU09OLmRlY29kZShlbGVtc1tpXS5ub2RlVmFsdWUuc3Vic3RyaW5nKDcsIDEwMDAwMCkpOwogICAgICAgICAgICAvL2R1bXAocHJvcGVydHkpOwogICAgICAgICAgICAvL2FsZXJ0KHByb3BlcnR5KTsKICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcm9wZXJ0eSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKG5hbWUpOwogICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiWyIpICE9PSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgiWyIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gdmFsdWVzOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwIDsgcCA8IG5hbWVQYXJ0cy5sZW5ndGggOyBwKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcnQgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCBuYW1lUGFydHNbcF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBuYW1lUGFydHMubGVuZ3RoLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lUGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0W25hbWVQYXJ0XSA9IHByb3BlcnR5W25hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQucHVzaChwcm9wZXJ0eVtuYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YocGFydFtuYW1lUGFydF0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyX3JlcGxhY2UoIl0iLCAiIiwgbmFtZVBhcnRzW3ArMV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRbbmFtZVBhcnRdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydFtuYW1lUGFydF0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydFtuYW1lUGFydF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tuYW1lXSA9IHByb3BlcnR5W25hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAgICAKCiAgICAKICAgIHZhbHVlcyA9IF9fY2xlYXJFbXB0eSh2YWx1ZXMsIGVtcHR5KTsKCiAgICAvL2R1bXAoIkdWSUUiKTsKICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgLy8gVE9ETyBwb21vY2kgb2JqZWt0dQogICAgLy92YXIgb2JqZWN0cyA9IGdldE9iamVjdHNJbk5vZGUodGhpcy5jb250YWluZXIpOwogICAgcmV0dXJuKHZhbHVlcyk7Cn0KKi8KCi8vIG5ldyB2ZXJzaW9uIC0gZ2V0cyB2YWx1ZXMgaW4gb3JkZXIgYXMgdGhleSBhcmUgaW4gSFRNTApmdW5jdGlvbiBnZXRWYWx1ZXNJbkVsZW1lbnQoY29udGFpbmVyLCBlbXB0eSwgc2tpcEVsZW1lbnRzSW5DbGFzcywgY2hpbGRPbmx5KQp7CiAgICBmdW5jdGlvbiBfX2NsZWFyRW1wdHkoYSwgZW1wdHkpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihhKSA9PSAib2JqZWN0IikKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGFbaV0gPT0gIlxuIikKICAgICAgICAgICAgICAgICAgICBkZWxldGUoYVtpXSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChhW2ldID09ICIiICYmICFlbXB0eSkKICAgICAgICAgICAgICAgICAgICBkZWxldGUoYVtpXSk7CiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFbaV0gPSBfX2NsZWFyRW1wdHkoYVtpXSwgZW1wdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yICh2YXIgaWkgaW4gYSkKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFmb3VuZCkKICAgICAgICAgICAgICAgIHJldHVybih7fSk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhIGluc3RhbmNlb2YgQXJyYXkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpPTAgOyBpIDwgYS5sZW5ndGggOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChhW2ldID09ICJcbiIpCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlKGFbaV0pOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoYVtpXSA9PSAiIiAmJiAhZW1wdHkpCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlKGFbaV0pOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFbaV0gPSBfX2NsZWFyRW1wdHkoYVtpXSwgZW1wdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYS5sZW5ndGgpCiAgICAgICAgICAgICAgICByZXR1cm4oIiIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybihhKTsKCiAgICAgICAgcmV0dXJuKGEpOwogICAgfQoKICAgIGNvbnRhaW5lciA9IGdldEVsZW1lbnQoY29udGFpbmVyKTsKICAgIAogICAgaWYgKHR5cGVvZihlbXB0eSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgZW1wdHkgPSBmYWxzZTsKICAgIGlmICh0eXBlb2YoY2hpbGRPbmx5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICBjaGlsZE9ubHkgPSBmYWxzZTsKICAgIGlmICh0eXBlb2Yoc2tpcEVsZW1lbnRzSW5DbGFzcykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgc2tpcEVsZW1lbnRzSW5DbGFzcyA9ICIiOwoKICAgIGlmIChjaGlsZE9ubHkpCiAgICAgICAgdmFyIGVsZW1zID0gZ2V0Q2hpbGRFbGVtZW50c0J5VGFnTmFtZSgiKiIsIGNvbnRhaW5lcik7CiAgICBlbHNlCiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiLCBjb250YWluZXIpOwogICAgCiAgICB2YXIgdmFsdWVzID0ge307CiAgICAvL2R1bXAoZW1wdHkpOwogICAgLy9kdW1wKGVsZW1zKTsKICAgIC8vZHVtcCgiPT09PSIpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIC8vZHVtcChlbGVtcyk7CiAgICAgICAgaWYgKGVsZW1zW2ldLnRhZ05hbWUgPT0gIlNFTEVDVCIgJiYgZWxlbXNbaV0ubXVsdGlwbGUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIF92YWx1ZXMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwIDsgaWkgPCBlbGVtc1tpXS5vcHRpb25zLmxlbmd0aCA7IGlpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5vcHRpb25zW2lpXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoZWxlbXNbaV0ub3B0aW9uc1tpaV0uZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKTsKICAgICAgICAgICAgICAgIGlmIChlbGVtc1tpXS5vcHRpb25zW2lpXS5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIikgJiYgKGVtcHR5IHx8IGVsZW1zW2ldLm9wdGlvbnNbaWldLnZhbHVlKSkKICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLnB1c2goZWxlbXNbaV0ub3B0aW9uc1tpaV0udmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZWxlbXNbaV0uX192YWx1ZSA9IF92YWx1ZXMuam9pbigifCIpOwogICAgICAgICAgICBlbGVtc1tpXS5fX3ZhbHVlID0gKF92YWx1ZXMubGVuZ3RoID8gX3ZhbHVlcyA6ICIiKTsKICAgICAgICAgICAgZWxlbXNbaV0uX19uYW1lID0gc3RyX3JlcGxhY2UoIltdIiwgIiIsIGVsZW1zW2ldLm5hbWUpOwogICAgICAgICAgICAvL2R1bXAoZWxlbXNbaV0udmFsdWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL2lmIChlbGVtc1tpXS5vYmplY3QgJiYgIWhhc0NsYXNzTmFtZShlbGVtc1tpXSwgImNoaWxkQ29tcG9uZW50IikgJiYgIWhhc0NsYXNzTmFtZShlbGVtc1tpXSwgIl9DaGlsZENvbXBvbmVudCIpKQogICAgICAgIC8vewogICAgICAgIC8vICAgIHZhbHVlc1tlbGVtc1tpXS5uYW1lXSA9IGVsZW1zW2ldLm9iamVjdC5nZXRWYWx1ZSgpOwogICAgICAgIC8vICAgIGlmICghdmFsdWVzW2VsZW1zW2ldLm5hbWVdICYmICFlbXB0eSkKICAgICAgICAvLyAgICAgICAgZGVsZXRlKHZhbHVlc1tlbGVtc1tpXS5uYW1lXSk7CiAgICAgICAgLy99CiAgICAgICAgLy9lbHNlCiAgICAgICAgLy8gICAgdmFsdWVzW2VsZW1zW2ldLm5hbWVdID0gZWxlbXNbaV0udmFsdWU7CiAgICAgICAgCiAgICAgICAgaWYgKGVtcHR5IHx8IGVsZW1zW2ldLl9fdmFsdWUgfHwgZWxlbXNbaV0udmFsdWUgfHwgKGVsZW1zW2ldLm9iamVjdCAmJiAoZWxlbXNbaV0ub2JqZWN0LmdldFZhbHVlIHx8IGVsZW1zW2ldLm9iamVjdC5nZXRWYWx1ZXMpKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXQgPSB0cnVlOwogICAgICAgICAgICBpZiAoc2tpcEVsZW1lbnRzSW5DbGFzcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF9lbGVtID0gZWxlbXNbaV07CiAgICAgICAgICAgICAgICB3aGlsZShfZWxlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ2xhc3NOYW1lKF9lbGVtLCBza2lwRWxlbWVudHNJbkNsYXNzKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VsZW0gPSBfZWxlbS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZWxlbXNbaV0udGFnTmFtZSA9PSAiSU5QVVQiICYmIChlbGVtc1tpXS50eXBlID09ICJjaGVja2JveCIgfHwgZWxlbXNbaV0udHlwZSA9PSAicmFkaW8iKSAmJiAhZWxlbXNbaV0uY2hlY2tlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW1zW2ldLm5hbWUpOwogICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbGVtc1tpXS5uYW1lICYmIHJldCAmJiByZXQgIT0gIlxuIiAmJiAhaGFzQ2xhc3NOYW1lKGVsZW1zW2ldLCAiY2hpbGRDb21wb25lbnQiKSAmJiAhaGFzQ2xhc3NOYW1lKGVsZW1zW2ldLCAiX0NoaWxkQ29tcG9uZW50IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5uYW1lKTsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5fX3ZhbHVlIHx8IGVsZW1zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgIHZhciBlbGVtTmFtZSA9IGVsZW1zW2ldLl9fbmFtZSB8fCBlbGVtc1tpXS5uYW1lOwogICAgICAgICAgICAgICAgLy9pZiAoZWxlbU5hbWUuaW5kZXhPZigiWyIpICE9PSAtMSkKICAgICAgICAgICAgICAgIHZhciBlbGVtVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGVsZW1zW2ldLm9iamVjdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbXNbaV0ub2JqZWN0LmdldFZhbHVlcyAmJiBlbGVtc1tpXS5vYmplY3QucGFyYW1zWyJtdWx0aXNlbGVjdCJdKQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSBlbGVtc1tpXS5vYmplY3QuZ2V0VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbXNbaV0ub2JqZWN0LmdldFZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSBlbGVtc1tpXS5vYmplY3QuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBlbGVtVmFsdWUgPSAoZWxlbXNbaV0uX192YWx1ZSB8fCBlbGVtc1tpXS52YWx1ZSk7CgogICAgICAgICAgICAgICAgLy9kdW1wKGVsZW1zW2ldKTsKICAgICAgICAgICAgICAgIC8vZHVtcCh0eXBlb2YoZWxlbXNbaV0ub2JqZWN0KSk7CiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUuaW5kZXhPZigiWyIpID4gMCkgLy8gdG8gbm90IHNwbGl0IEpTT04gW2FycmF5XQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lUGFydHMgPSBlbGVtTmFtZS5zcGxpdCgiWyIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gdmFsdWVzOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwIDsgcCA8IG5hbWVQYXJ0cy5sZW5ndGggOyBwKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcnQgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCBuYW1lUGFydHNbcF0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAobmFtZVBhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAobmFtZVBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbmFtZVBhcnRzLmxlbmd0aC0xKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVBhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydFtuYW1lUGFydF0gPSBlbGVtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJ0LnB1c2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnB1c2goZWxlbVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgiISIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKHBhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXBhcnRbbmFtZVBhcnRdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyX3JlcGxhY2UoIl0iLCAiIiwgbmFtZVBhcnRzW3ArMV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRbbmFtZVBhcnRdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydFtuYW1lUGFydF0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydFtuYW1lUGFydF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tlbGVtTmFtZV0gPSBlbGVtVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9kdW1wKCI/Iik7CiAgICAgICAgICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgICAgIH0KICAgIH0KICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgaWYgKGNoaWxkT25seSkKICAgICAgICB2YXIgZWxlbXMgPSBnZXRDaGlsZEVsZW1lbnRzQnlOb2RlVHlwZShDT01NRU5UX05PREUsIGNvbnRhaW5lcik7CiAgICBlbHNlCiAgICAgICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeU5vZGVUeXBlKENPTU1FTlRfTk9ERSwgY29udGFpbmVyKTsKICAgIC8vZHVtcChjb250YWluZXIpOwogICAgLy9kdW1wKGVsZW1zKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICBpZiAoZWxlbXNbaV0ubm9kZVZhbHVlICYmIGVsZW1zW2ldLm5vZGVWYWx1ZS5pbmRleE9mKCJoaWRkZW46IikgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXS5ub2RlVmFsdWUuc3Vic3RyaW5nKDcsIDEwMDAwMCkpOwogICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBKU09OLmRlY29kZShlbGVtc1tpXS5ub2RlVmFsdWUuc3Vic3RyaW5nKDcsIDEwMDAwMCkpOwogICAgICAgICAgICAvL2R1bXAocHJvcGVydHkpOwogICAgICAgICAgICAvL2FsZXJ0KHByb3BlcnR5KTsKICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcm9wZXJ0eSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKG5hbWUpOwogICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiWyIpICE9PSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgiWyIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gdmFsdWVzOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwIDsgcCA8IG5hbWVQYXJ0cy5sZW5ndGggOyBwKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcnQgPSBzdHJfcmVwbGFjZSgiXSIsICIiLCBuYW1lUGFydHNbcF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBuYW1lUGFydHMubGVuZ3RoLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lUGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0W25hbWVQYXJ0XSA9IHByb3BlcnR5W25hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQucHVzaChwcm9wZXJ0eVtuYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YocGFydFtuYW1lUGFydF0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyX3JlcGxhY2UoIl0iLCAiIiwgbmFtZVBhcnRzW3ArMV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRbbmFtZVBhcnRdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydFtuYW1lUGFydF0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydFtuYW1lUGFydF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tuYW1lXSA9IHByb3BlcnR5W25hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAgICAKCiAgICAvL2R1bXAoIkdWSUUiKTsKICAgIC8vZHVtcCh2YWx1ZXMpOwogICAgCiAgICB2YWx1ZXMgPSBfX2NsZWFyRW1wdHkodmFsdWVzLCBlbXB0eSk7CgogICAgLy9kdW1wKHZhbHVlcyk7CiAgICAKICAgIC8vIFRPRE8gcG9tb2NpIG9iamVrdHUKICAgIC8vdmFyIG9iamVjdHMgPSBnZXRPYmplY3RzSW5Ob2RlKHRoaXMuY29udGFpbmVyKTsKICAgIHJldHVybih2YWx1ZXMpOwp9CgoKZnVuY3Rpb24gc2V0VmFsdWVzSW5FbGVtZW50KGNvbnRhaW5lciwgdmFsdWVzLCBQYXJlbnRPYmplY3QsIHdpdGhpbk5hbWVzKQp7CiAgICB2YXIgZWxlbXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZShbImlucHV0Iiwic2VsZWN0IiwidGV4dGFyZWEiXSwgY29udGFpbmVyKTsKICAgIC8vZHVtcChlbGVtcyk7CiAgICAvL2R1bXAodmFsdWVzKTsKICAgIHZhciBmb3VuZCA9IFtdOwogICAgaWYgKHZhbHVlcykKICAgIHsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoZWxlbXNbaV0ubmFtZSA9PSAiX19fc3R5bGUiICYmIHZhbHVlcyAmJiB2YWx1ZXNbInN0eWxlIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNsb25lT2JqZWN0KHZhbHVlcyk7CiAgICAgICAgICAgICAgICB2YWx1ZXNbIl9fX3N0eWxlIl0gPSB2YWx1ZXNbInN0eWxlIl07CiAgICAgICAgICAgICAgICBkZWxldGUodmFsdWVzWyJzdHlsZSJdKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldLm5hbWUgPT0gIl9fX3N1Ym1pdCIgJiYgdmFsdWVzICYmIHZhbHVlc1sic3VibWl0Il0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNsb25lT2JqZWN0KHZhbHVlcyk7CiAgICAgICAgICAgICAgICB2YWx1ZXNbIl9fX3N1Ym1pdCJdID0gdmFsdWVzWyJzdWJtaXQiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSh2YWx1ZXNbInN1Ym1pdCJdKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAgICAgCiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgLy9kdW1wKGVsZW1zW2ldKTsKICAgICAgICB2YXIgT2JqZWN0ID0gbnVsbDsKICAgICAgICBpZiAoZWxlbXNbaV0uaWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoUGFyZW50T2JqZWN0KQogICAgICAgICAgICAgICAgdmFyIE9iamVjdCA9IFBhcmVudE9iamVjdC5nZXRPYmplY3QoZWxlbXNbaV0uaWQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2YXIgT2JqZWN0ID0gZ2V0T2JqZWN0KGVsZW1zW2ldLmlkKTsKICAgICAgICB9CiAgICAgICAgLy9kdW1wKDEpOwogICAgICAgIC8vZHVtcChPYmplY3QpOwogICAgICAgIC8vZHVtcChPYmplY3QuUGFyZW50Q29tcG9uZW50KTsKICAgICAgICBpZiAoT2JqZWN0ICYmICh0eXBlb2Yod2l0aGluTmFtZXMpICE9ICJ1bmRlZmluZWQiICYmIGluX2FycmF5KGVsZW1zW2ldLmlkLCB3aXRoaW5OYW1lcykgfHwgUGFyZW50T2JqZWN0ICYmIHR5cGVvZih3aXRoaW5OYW1lcykgIT0gInVuZGVmaW5lZCIgJiYgaW5fYXJyYXkoc3RyX3JlcGxhY2UoUGFyZW50T2JqZWN0LmlkKyJfIiwgIiIsIGVsZW1zW2ldLmlkKSwgd2l0aGluTmFtZXMpKSkKICAgICAgICAgICAgT2JqZWN0ID0gbnVsbDsKICAgICAgICBpZiAoT2JqZWN0ICYmIE9iamVjdC5QYXJlbnRDb21wb25lbnQpCiAgICAgICAgICAgIE9iamVjdCA9IG51bGw7CiAgICAgICAgCiAgICAgICAgLy9kdW1wKDIpOwogICAgICAgIC8vZHVtcCh0eXBlb2Yod2l0aGluTmFtZXMpKTsKICAgICAgICAvL2R1bXAodHlwZW9mKHZhbHVlc1tlbGVtc1tpXS5uYW1lXSkpOwogICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB0eXBlb2Yod2l0aGluTmFtZXMpICE9ICJ1bmRlZmluZWQiIHx8ICh2YWx1ZXMgJiYgZWxlbXNbaV0ubmFtZSAmJiAodHlwZW9mKHZhbHVlc1tlbGVtc1tpXS5uYW1lXSkgIT0gInVuZGVmaW5lZCIpIHx8IHR5cGVvZih2YWx1ZXNbc3RyX3JlcGxhY2UoIltdIiwgIiIsIGVsZW1zW2ldLm5hbWUpXSkgIT0gInVuZGVmaW5lZCIpKQogICAgICAgIHsKICAgICAgICAgICAgLy9kdW1wKDMpOwogICAgICAgICAgICB2YXIgdmFsdWUgPSAodmFsdWVzID09IG51bGwgPyAiIiA6ICghZWxlbXNbaV0ubmFtZSB8fCAodHlwZW9mKHZhbHVlc1tlbGVtc1tpXS5uYW1lXSkgPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mKHZhbHVlc1tzdHJfcmVwbGFjZSgiW10iLCAiIiwgZWxlbXNbaV0ubmFtZSldKSA9PSAidW5kZWZpbmVkIikgPyAiIiA6ICh2YWx1ZXNbZWxlbXNbaV0ubmFtZV0gfHwgdmFsdWVzW3N0cl9yZXBsYWNlKCJbXSIsICIiLCBlbGVtc1tpXS5uYW1lKV0pKSk7CiAgICAgICAgICAgIGlmIChPYmplY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcCg0KTsKICAgICAgICAgICAgICAgIC8vZHVtcChPYmplY3QpOwogICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucGFyYW1zWyJjaGlsZENvbXBvbmVudCJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vZHVtcCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZHVtcCg1KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghaGFzQ2xhc3NOYW1lKGVsZW1zW2ldLCAiY2hpbGRDb21wb25lbnQiKSAmJiAhaGFzQ2xhc3NOYW1lKGVsZW1zW2ldLCAiX0NoaWxkQ29tcG9uZW50IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vZHVtcChlbGVtc1tpXSk7CiAgICAgICAgICAgICAgICAvL2R1bXAoNik7CiAgICAgICAgICAgICAgICBlbGVtc1tpXS52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgLy9kdW1wKDcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy9kdW1wKCdFJyk7CgogICAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJlbWFpbmluZyBieSBvYmplY3QKICAgIC8qCiAgICBmb3IgKHZhciBpIGluIHZhbHVlcykKICAgIHsKICAgICAgICBpZiAoIWFycmF5X2NvbnRhaW5zKGZvdW5kLCBpKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChQYXJlbnRPYmplY3QpCiAgICAgICAgICAgICAgICB2YXIgT2JqZWN0ID0gUGFyZW50T2JqZWN0LmdldE9iamVjdChlbGVtc1tpXS5pZCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZhciBPYmplY3QgPSBnZXRPYmplY3QoZWxlbXNbaV0uaWQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKE9iamVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgT2JqZWN0LnNldFZhbHVlKHZhbHVlc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAqLwp9CgpmdW5jdGlvbiBnZXRBcnJheUxlYWZWYWx1ZXMoYSkKewogICAgdmFyIHZhbHVlcyA9IHt9OwogICAgZm9yKHZhciBpIGluIGEpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihhW2ldKSA9PSAib2JqZWN0IikKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlcyA9IGFycmF5X21lcmdlKHZhbHVlcywgZ2V0QXJyYXlMZWFmVmFsdWVzKGFbaV0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YWx1ZXNbaV0gPSBhW2ldOwogICAgfQogICAgCiAgICByZXR1cm4odmFsdWVzKTsKfQoKLy8gY2hyb21lIC0gaHRtbAovLyBmZiAtIGh0bWwKLy8gaWUgLSBodG1sCi8vIGVkZ2UgLSBib2R5Ci8vIHNhZmFyaSAtIGJvZHkKLy8gb3BlcmEgLSA/Pz8KZnVuY3Rpb24gZ2V0U2Nyb2xsRWxlbWVudChlbGVtKQp7CiAgICBpZiAoZWxlbS5kb2N1bWVudCkgLy8gd2luZG93IG9iamVjdAogICAgICAgIGVsZW0gPSBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsgLy8gSFRNTCB0YWcKCiAgICBpZiAoKEJyb3dzZXIubmFtZSA9PSAiQ2hyb21lIiB8fCBCcm93c2VyLm5hbWUgPT0gIkZpcmVmb3giIHx8IEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiIHx8IEJyb3dzZXIubmFtZSA9PSAiT3BlcmEiKSAmJiBlbGVtLnRhZ05hbWUgPT0gIkJPRFkiKQogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICAKICAgIHJldHVybihlbGVtKTsKfQoKZnVuY3Rpb24gc2V0U2Nyb2xsVG9wKGVsZW0sIG9mZnNldCkKewogICAgZ2V0U2Nyb2xsRWxlbWVudChlbGVtKS5zY3JvbGxUb3AgPSBvZmZzZXQ7Cn0KZnVuY3Rpb24gc2V0U2Nyb2xsTGVmdChlbGVtLCBvZmZzZXQpCnsKICAgIGdldFNjcm9sbEVsZW1lbnQoZWxlbSkuc2Nyb2xsTGVmdCA9IG9mZnNldDsKfQoKZnVuY3Rpb24gc2Nyb2xsVG9BbmNob3IobmFtZSkKewogICAgdmFyIF9uYW1lID0gbmFtZTsKICAgIGNhbGwoZnVuY3Rpb24oKXsKICAgICAgICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7ICAgICAgICAgICAgICAgLy9TYXZlIGRvd24gdGhlIFVSTCB3aXRob3V0IGhhc2guCiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAiIyIrX25hbWU7ICAgICAgICAgICAgICAgICAvL0dvIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4KICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCxudWxsLHVybCk7ICAgLy9Eb24ndCBsaWtlIGhhc2hlcy4gQ2hhbmdpbmcgaXQgYmFjay4KICAgIH0sIHRydWUpOwp9CgoKZnVuY3Rpb24gc2Nyb2xsVG9FbGVtZW50KGVsZW0sIG9mZnNldCwgcGFyZW50Tm9kZSwgX3dpbmRvdywgX29mZnNldCkKewogICAgLy8vZHVtcCgiISIpOwogICAgCiAgICBlbGVtID0gZ2V0RWxlbWVudChlbGVtKTsKICAgIC8vZHVtcChlbGVtKTsKICAgIGlmICh0eXBlb2Yob2Zmc2V0KSA9PSAidW5kZWZpbmVkIiB8fCAhb2Zmc2V0KQogICAgICAgIG9mZnNldCA9IDA7CgogICAgb2Zmc2V0ID0gZXh0cmFjdEZsb2F0KG9mZnNldCk7CiAgICAvL2R1bXAob2Zmc2V0KTsKICAgIAogICAgaWYgKHR5cGVvZihwYXJlbnROb2RlKSA9PSAidW5kZWZpbmVkIiB8fCAhcGFyZW50Tm9kZSkKICAgICAgICBwYXJlbnROb2RlID0gZG9jdW1lbnQuYm9keTsKICAgICAgICAKICAgIGlmICh0eXBlb2YoX3dpbmRvdykgPT0gInVuZGVmaW5lZCIgfHwgIV93aW5kb3cpCiAgICAgICAgX3dpbmRvdyA9IHdpbmRvdzsKCiAgICBpZiAodHlwZW9mKF9vZmZzZXQpID09ICJ1bmRlZmluZWQiIHx8ICFfb2Zmc2V0KQogICAgICAgIF9vZmZzZXQgPSAwOwoKICAgIHZhciBwb3MgPSBnZXRQb3NpdGlvbihlbGVtLCBwYXJlbnROb2RlKTsKICAgIHZhciB4ID0gcG9zWyJ4Il07CiAgICB2YXIgeSA9IHBvc1sieSJdOwogICAgCiAgICB2YXIgc3R5bGUgPSBnZXRTdHlsZShlbGVtKTsKICAgIHkgKz0gZXh0cmFjdEludChzdHlsZVsicnkiXSwgMCk7CiAgICAKICAgIHZhciBzY3JvbGxUb3AgPSB5LSghX3dpbmRvdy5mcmFtZUVsZW1lbnQgPyBvZmZzZXQgOiAwKStfb2Zmc2V0OwogICAgc2V0U2Nyb2xsVG9wKHBhcmVudE5vZGUsIHNjcm9sbFRvcCk7CiAgICAKICAgIC8vZHVtcChzY3JvbGxUb3ApOwogICAgLy9kdW1wKHBhcmVudE5vZGUpOwogICAgLy9kdW1wKHNjcm9sbE5vZGUuc2Nyb2xsVG9wKTsKICAgIAogICAgLy8gQlVHIEZJWCAtIDxodG1sPiBoZWlnaHQgaXMgMTZweCBtb3JlIHRoYW4gPGJvZHk+IGhlaWdodCAtIGJvdGggaGF2ZSBtYXJnaW4gYW5kIHBhZGRpbmcgMHB4OwogICAgLy8genJ1c2VubyB2ZXN0aXJuYSAtIG9iaiBrcmVkaXR1IC0gYXogcHJpamR1IG5hIHRvLCBrZGUgdG8gYnlsbyBwb3RyZWJhIC0gemRva3VtZW50b3ZhdAogICAgLy9pZiAocGFyZW50Tm9kZS5wYXJlbnROb2RlLm9mZnNldEhlaWdodC1wYXJlbnROb2RlLm9mZnNldEhlaWdodCA9PSBwYXJlbnROb2RlLnNjcm9sbFRvcCkKICAgIC8vICAgIHNldFNjcm9sbFRvcChwYXJlbnROb2RlLCAwKTsKCgogICAgICAgIC8vc2Nyb2xsTm9kZS5zY3JvbGxUb3AgPSAwOwogICAgICAgIAogICAgLy9pZiAocGFyZW50Tm9kZS50YWdOYW1lID09ICJCT0RZIiAmJiBwYXJlbnROb2RlLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0ID4gcGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQpCiAgICAvLyAgICBwYXJlbnROb2RlLnNjcm9sbFRvcCA9IDA7CiAgICAKICAgIGlmIChfd2luZG93LmZyYW1lRWxlbWVudCAmJiBfd2luZG93LnBhcmVudCAhPSBfd2luZG93KQogICAgewoKICAgICAgICAvLyBnZXQgcG9zaXRpb24gYWdhaW4KICAgICAgICB2YXIgcG9zMiA9IGdldFBvc2l0aW9uKGVsZW0sIHBhcmVudE5vZGUpOwogICAgICAgIC8vZHVtcChwb3MyWyJ5Il0pOwoKICAgICAgICBzY3JvbGxUb0VsZW1lbnQoX3dpbmRvdy5mcmFtZUVsZW1lbnQsIG9mZnNldCwgX3dpbmRvdy5wYXJlbnQuZG9jdW1lbnQuYm9keSwgX3dpbmRvdy5wYXJlbnQsIHBvczJbInkiXSk7CiAgICB9Cn0KCmZ1bmN0aW9uIHNjcm9sbEJ5KGVsZW0sIHgsIHkpCnsKICAgIGVsZW0uc2Nyb2xsTGVmdCA9IGVsZW0uc2Nyb2xsTGVmdCt4OwogICAgZWxlbS5zY3JvbGxUb3AgPSBlbGVtLnNjcm9sbFRvcCt5Owp9ICAgICAgIAoKZnVuY3Rpb24gZ2V0U2Nyb2xsVG9wKGVsZW0pCnsKICAgIGlmICh0eXBlb2YoZWxlbSkgPT0gInVuZGVmaW5lZCIgfHwgZWxlbSA9PSBkb2N1bWVudCB8fCBlbGVtID09IGRvY3VtZW50LmJvZHkgfHwgZWxlbSA9PSB3aW5kb3cpCiAgICB7CiAgICAgICAgcmV0dXJuKHdpbmRvdy5zY3JvbGxZIHx8IHdpbmRvdy5wYWdlWU9mZnNldCB8fCAodHlwZW9mKHdpbmRvdy5zY3JvbGxUb3ApID09ICJmdW5jdGlvbiIgPyB3aW5kb3cuc2Nyb2xsVG9wKCkgOiAwKSk7CiAgICB9CgogICAgZWxlbSA9IGdldFNjcm9sbEVsZW1lbnQoZWxlbSk7CiAgICAKICAgIC8vZHVtcCgiISIpOwogICAgLy9kdW1wKGVsZW0pOwogICAgLy8gQ2hyb21lIGJ1ZyBmaXgKICAgIHZhciBoZWlnaHQgPSBlbGVtLnN0eWxlLmhlaWdodDsKICAgIC8vZHVtcChoZWlnaHQpOwogICAgc2V0U3R5bGUoZWxlbSwgIm91dGVySGVpZ2h0IiwgZWxlbS5vZmZzZXRIZWlnaHQrInB4Iik7CiAgICAvL2R1bXAoZWxlbS5vZmZzZXRIZWlnaHQrInB4Iik7CiAgICB2YXIgdmFsID0gZWxlbS5zY3JvbGxUb3A7CiAgICAvL2R1bXAodmFsKTsKICAgIGVsZW0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgCiAgICByZXR1cm4odmFsKTsKfQoKZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdChlbGVtKQp7CiAgICBpZiAodHlwZW9mKGVsZW0pID09ICJ1bmRlZmluZWQiIHx8IGVsZW0gPT0gZG9jdW1lbnQgfHwgZWxlbSA9PSBkb2N1bWVudC5ib2R5IHx8IGVsZW0gPT0gd2luZG93KQogICAgewogICAgICAgIHJldHVybih3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cucGFnZVhPZmZzZXQgfHwgKHR5cGVvZih3aW5kb3cuc2Nyb2xsTGVmdCkgPT0gImZ1bmN0aW9uIiA/IHdpbmRvdy5zY3JvbGxMZWZ0KCkgOiAwKSk7CiAgICB9CgogICAgZWxlbSA9IGdldFNjcm9sbEVsZW1lbnQoZWxlbSk7CiAgICAKICAgIC8vIENocm9tZSBidWcgZml4CiAgICB2YXIgd2lkdGggPSBlbGVtLnN0eWxlLndpZHRoOwogICAgc2V0U3R5bGUoZWxlbSwgIm91dGVyV2lkdGgiLCBlbGVtLm9mZnNldFdpZHRoKyJweCIpOwogICAgdmFyIHZhbCA9IGVsZW0uc2Nyb2xsTGVmdDsKICAgIGVsZW0uc3R5bGUud2lkdGggPSB3aWR0aDsKICAgIAogICAgcmV0dXJuKHZhbCk7Cn0KCgoKZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkgCnsKICAgIGlmICh0eXBlb2YocGF0aCkgIT0gInN0cmluZyIpCiAgICAgICAgcmV0dXJuKCIiKTsKCiAgICByZXR1cm4ocGF0aC5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSggLy4qXC8vLCAiIikpOwp9CiAgICAgCmZ1bmN0aW9uIGRpcm5hbWUocGF0aCkgCnsKICAgIGlmICh0eXBlb2YocGF0aCkgIT0gInN0cmluZyIpCiAgICAgICAgcmV0dXJuKCIiKTsKCiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpOwp9CgoKZnVuY3Rpb24gc3ByaW50ZihvYmopIAp7CiAgICB2YXIgdXNlQXJndW1lbnRzID0gZmFsc2U7CiAgICB2YXIgX2FyZ3VtZW50cyA9IGFyZ3VtZW50czsKICAgIHZhciBpID0gLTE7CiAgICB2YXIgc3RyID0gX2FyZ3VtZW50c1swXTsKICAgIHZhciBvYmogPSBfYXJndW1lbnRzWzFdOwogICAgCiAgICB1c2VBcmd1bWVudHMgPSB0cnVlOwogICAgLy9pZiAodHlwZW9mIG9iaiA9PSAiYXJyYXkiKSAKICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkgCiAgICAgICAgdXNlQXJndW1lbnRzID0gZmFsc2U7CiAgICAKICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSB8fCB1c2VBcmd1bWVudHMpIAogICAgewogICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvXCVzL2csCiAgICAgICAgICAgIGZ1bmN0aW9uIChhLCBiKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgaWYgKHVzZUFyZ3VtZW50cykgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbaSsxXTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgX2FyZ3VtZW50c1tpKzFdID09ICdzdHJpbmcnKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzW2krMV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInNwcmludGYoKTogQXJndW1lbnRzIGVsZW1lbnQgaXMgYW4gaW52YWxpZCB0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2ldOwogICAgICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFtee31dKil9L2csCiAgICAgICAgICAgIGZ1bmN0aW9uIChhLCBiKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHIgPSBvYmpbYl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiByID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgciA9PT0gJ251bWJlcicgPyByIDogYTsKICAgICAgICAgICAgfSk7CiAgICB9Cn07CgoKZnVuY3Rpb24gY2xvbmUoc3JjKSAKewogICAgZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykgCiAgICB7CiAgICAgICAgdmFyIG5hbWUsIHMsIGksIGVtcHR5ID0ge307CiAgICAgICAgZm9yIChuYW1lIGluIHNvdXJjZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gInNvdXJjZSIKICAgICAgICAgICAgLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4gICBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsCiAgICAgICAgICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlCiAgICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CiAgICAgICAgICAgIGlmKCEobmFtZSBpbiBkZXN0KSB8fCAoZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlc3Q7CiAgICB9CgogICAgaWYoIXNyYyB8fCB0eXBlb2Ygc3JjICE9ICJvYmplY3QiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSAiW29iamVjdCBGdW5jdGlvbl0iKQogICAgewogICAgICAgIC8vIG51bGwsIHVuZGVmaW5lZCwgYW55IG5vbi1vYmplY3QsIG9yIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJuIHNyYzsgIC8vIGFueXRoaW5nCiAgICB9CiAgICBpZiAoc3JjLm5vZGVUeXBlICYmICJjbG9uZU5vZGUiIGluIHNyYykKICAgIHsKICAgICAgICAvLyBET00gTm9kZQogICAgICAgIHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlCiAgICB9CiAgICBpZihzcmMgaW5zdGFuY2VvZiBEYXRlKQogICAgewogICAgICAgIC8vIERhdGUKICAgICAgICByZXR1cm4gbmV3IERhdGUoc3JjLmdldFRpbWUoKSk7ICAvLyBEYXRlCiAgICB9CiAgICBpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApCiAgICB7CiAgICAgICAgLy8gUmVnRXhwCiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgICAvLyBSZWdFeHAKICAgIH0KICAgIHZhciByLCBpLCBsOwogICAgaWYoc3JjIGluc3RhbmNlb2YgQXJyYXkpCiAgICB7CiAgICAgICAgLy8gYXJyYXkKICAgICAgICByID0gW107CiAgICAgICAgZm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKGkgaW4gc3JjKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByLnB1c2goY2xvbmUoc3JjW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gd2UgZG9uJ3QgY2xvbmUgZnVuY3Rpb25zIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCiAgICAgICAgLy8gICAgfWVsc2UgaWYoZC5pc0Z1bmN0aW9uKHNyYykpewogICAgICAgIC8vICAgICAgLy8gZnVuY3Rpb24KICAgICAgICAvLyAgICAgIHIgPSBmdW5jdGlvbigpeyByZXR1cm4gc3JjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2VuZXJpYyBvYmplY3RzCiAgICAgICAgciA9IHNyYy5jb25zdHJ1Y3RvciA/IG5ldyBzcmMuY29uc3RydWN0b3IoKSA6IHt9OwogICAgfQogICAgcmV0dXJuIG1peGluKHIsIHNyYywgY2xvbmUpOwp9CgpmdW5jdGlvbiBnZXRDaGlsZEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUsIGVsZW0pCnsKICAgIGlmICh0eXBlb2YodGFnTmFtZSkgPT0gInN0cmluZyIpCiAgICAgICAgdmFyIHRhZ05hbWVzID0gW3RhZ05hbWVdOwogICAgZWxzZQogICAgICAgIHZhciB0YWdOYW1lcyA9IHRhZ05hbWU7CiAgICAgICAgCiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIGZvciAodmFyIHQgPSAwIDsgdCA8IHRhZ05hbWVzLmxlbmd0aCA7IHQrKykKICAgIHsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtLmNoaWxkTm9kZXNbaV07CiAgICAgICAgCiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgJiYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZ05hbWVzW3RdLnRvTG93ZXJDYXNlKCkgfHwgdGFnTmFtZXNbdF0gPT0gIioiKSkgICAgCiAgICAgICAgICAgICAgICBlbGVtcy5wdXNoKGVsZW1lbnQpOyAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuKGVsZW1zKTsKfQoKZnVuY3Rpb24gZ2V0Q2hpbGRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSwgZWxlbSkKewogICAgaWYgKHR5cGVvZihjbGFzc05hbWUpID09ICJzdHJpbmciKQogICAgICAgIHZhciBjbGFzc05hbWVzID0gW2NsYXNzTmFtZV07CiAgICBlbHNlCiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBjbGFzc05hbWU7CiAgICAgICAgCiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIGZvciAodmFyIHQgPSAwIDsgdCA8IGNsYXNzTmFtZXMubGVuZ3RoIDsgdCsrKQogICAgewogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW0uY2hpbGROb2Rlcy5sZW5ndGggOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWxlbWVudCA9IGVsZW0uY2hpbGROb2Rlc1tpXTsKICAgICAgICAKICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NOYW1lICYmIChoYXNDbGFzc05hbWUoZWxlbWVudCwgY2xhc3NOYW1lc1t0XSkgfHwgY2xhc3NOYW1lc1t0XSA9PSAiKiIpKSAgICAKICAgICAgICAgICAgICAgIGVsZW1zLnB1c2goZWxlbWVudCk7ICAgICAgICAKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4oZWxlbXMpOwp9CgpmdW5jdGlvbiBnZXRDaGlsZE5vZGVzKGVsZW0pCnsKICAgIHZhciBlbGVtcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKykKICAgICAgICBlbGVtcy5wdXNoKGVsZW0uY2hpbGROb2Rlc1tpXSk7CiAgICAgICAgCiAgICByZXR1cm4oZWxlbXMpOwp9CgpmdW5jdGlvbiBoYXNQYXJlbnROb2RlKGVsZW0sIHBhcmVudE5vZGUpCnsKICAgIGlmICh0eXBlb2YocGFyZW50Tm9kZSkgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgcmV0dXJuKGVsZW0ucGFyZW50Tm9kZSAhPSBudWxsKTsKICAgIH0KICAgIAogICAgd2hpbGUoZWxlbSkKICAgIHsKICAgICAgICBpZiAoZWxlbSA9PSBwYXJlbnROb2RlIHx8IGVsZW0ucGFyZW50Tm9kZSA9PSBwYXJlbnROb2RlKQogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICB9Cn0KCmZ1bmN0aW9uIGV4cGxvZGVMaXN0KHN0ciwgc2VwYXJhdG9yKQp7CiAgICBpZiAodHlwZW9mKHNlcGFyYXRvcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgc2VwYXJhdG9yID0gInwiOwoKICAgIGlmIChzdHIgaW5zdGFuY2VvZiBBcnJheSB8fCB0eXBlb2Yoc3RyKSA9PSAib2JqZWN0IikKICAgICAgICByZXR1cm4oc3RyKTsKICAgIGVsc2UgaWYgKHR5cGVvZihzdHIpID09ICJ1bmRlZmluZWQiIHx8ICFzdHIpCiAgICAgICAgcmV0dXJuKFtdKTsKICAgIGVsc2UgaWYgKHN0cikKICAgICAgICByZXR1cm4obmV3IFN0cmluZyhzdHIpLnNwbGl0KHNlcGFyYXRvcikpOwogICAgZWxzZQogICAgICAgIHJldHVybihbXSk7Cn0KCmZ1bmN0aW9uIGltcGxvZGVMaXN0KGxpc3QsIHNlcGFyYXRvcikKewogICAgaWYgKHR5cGVvZihzZXBhcmF0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHNlcGFyYXRvciA9ICJ8IjsKCiAgICBpZiAobGlzdCBpbnN0YW5jZW9mIEFycmF5KQogICAgICAgIHJldHVybihsaXN0LmpvaW4oc2VwYXJhdG9yKSk7CiAgICAgICAgCiAgICByZXR1cm4obGlzdCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZExpc3QobGlzdCwgdmFsdWUsIHNlcGFyYXRvcikKewogICAgaWYgKHR5cGVvZihzZXBhcmF0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHNlcGFyYXRvciA9ICJ8IjsKCiAgICBsaXN0ID0gZXhwbG9kZUxpc3QobGlzdCwgc2VwYXJhdG9yKTsKICAgIGxpc3QgPSBhcnJheV9tZXJnZShsaXN0LCBleHBsb2RlTGlzdCh2YWx1ZSwgc2VwYXJhdG9yKSk7CiAgICBsaXN0ID0gYXJyYXlfdW5pcXVlKGxpc3QpOwogICAgCiAgICByZXR1cm4oaW1wbG9kZUxpc3QobGlzdCwgc2VwYXJhdG9yKSk7Cn0KCmZ1bmN0aW9uIHJlbW92ZUxpc3QobGlzdCwgdmFsdWUsIHNlcGFyYXRvcikKewogICAgaWYgKHR5cGVvZihzZXBhcmF0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHNlcGFyYXRvciA9ICJ8IjsKCiAgICBsaXN0ID0gZXhwbG9kZUxpc3QobGlzdCk7CiAgICBhcnJheV9kZWxldGUobGlzdCwgdmFsdWUpOwogICAgCiAgICByZXR1cm4obGlzdCk7Cn0KCmZ1bmN0aW9uIGFycmF5X2RlbGV0ZShhLCB2YWx1ZSkKewogICAgaWYgKGlzU2ltcGxlQXJyYXkoYSkpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGEubGVuZ3RoIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGFbaV0gIT09IHZhbHVlKQogICAgICAgICAgICAgICAgcmV0LnB1c2goYVtpXSk7ICAgIAogICAgICAgIH0KCiAgICAgICAgYSA9IHJldDsKICAgICAgICByZXR1cm4ocmV0KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgZm9yICh2YXIgaSBpbiBhKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGFbaV0gIT09IHZhbHVlKQogICAgICAgICAgICAgICAgcmV0W2ldID0gYVtpXTsgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGEgPSByZXQ7CiAgICAgICAgcmV0dXJuKHJldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGFycmF5X3JlbW92ZShhLCB2YWx1ZSkKewogICAgcmV0dXJuKGFycmF5X2RlbGV0ZShhLCB2YWx1ZSkpOwp9CgpmdW5jdGlvbiBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSAoc3RyaW5nLCBxdW90ZV9zdHlsZSkgCnsKICAgIHZhciBvcHRUZW1wID0gMCwKICAgIGkgPSAwLAogICAgbm9xdW90ZXMgPSBmYWxzZTsKICAgIGlmICh0eXBlb2YgcXVvdGVfc3R5bGUgPT09ICd1bmRlZmluZWQnKSAKICAgIHsKICAgICAgICBxdW90ZV9zdHlsZSA9IDI7CiAgICB9CiAgICBzdHJpbmcgPSBzdHJpbmcudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csICc8JykucmVwbGFjZSgvJmd0Oy9nLCAnPicpOwogICAgdmFyIE9QVFMgPSB7CiAgICAgICAgJ0VOVF9OT1FVT1RFUyc6IDAsCiAgICAgICAgJ0VOVF9IVE1MX1FVT1RFX1NJTkdMRSc6IDEsCiAgICAgICAgJ0VOVF9IVE1MX1FVT1RFX0RPVUJMRSc6IDIsCiAgICAgICAgJ0VOVF9DT01QQVQnOiAyLAogICAgICAgICdFTlRfUVVPVEVTJzogMywKICAgICAgICAnRU5UX0lHTk9SRSc6IDQKICAgIH07CiAgICBpZiAocXVvdGVfc3R5bGUgPT09IDApIAogICAgewogICAgICAgIG5vcXVvdGVzID0gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlb2YgcXVvdGVfc3R5bGUgIT09ICdudW1iZXInKSAKICAgIHsgCiAgICAgICAgLy8gQWxsb3cgZm9yIGEgc2luZ2xlIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmcgZmxhZ3MKICAgICAgICBxdW90ZV9zdHlsZSA9IFtdLmNvbmNhdChxdW90ZV9zdHlsZSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHF1b3RlX3N0eWxlLmxlbmd0aDsgaSsrKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5nIGlucHV0IHRvIGJpdHdpc2UgZS5nLiAnUEFUSElORk9fRVhURU5TSU9OJyBiZWNvbWVzIDQKICAgICAgICAgICAgaWYgKE9QVFNbcXVvdGVfc3R5bGVbaV1dID09PSAwKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbm9xdW90ZXMgPSB0cnVlOwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIGlmIChPUFRTW3F1b3RlX3N0eWxlW2ldXSkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wdFRlbXAgPSBvcHRUZW1wIHwgT1BUU1txdW90ZV9zdHlsZVtpXV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcXVvdGVfc3R5bGUgPSBvcHRUZW1wOwogICAgfQogICAgaWYgKHF1b3RlX3N0eWxlICYgT1BUUy5FTlRfSFRNTF9RVU9URV9TSU5HTEUpIAogICAgewogICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8mIzAqMzk7L2csICInIik7IC8vIFBIUCBkb2Vzbid0IGN1cnJlbnRseSBlc2NhcGUgaWYgbW9yZSB0aGFuIG9uZSAwLCBidXQgaXQgc2hvdWxkCiAgICAgICAgLy8gc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyZhcG9zO3wmI3gwKjI3Oy9nLCAiJyIpOyAvLyBUaGlzIHdvdWxkIGFsc28gYmUgdXNlZnVsIGhlcmUsIGJ1dCBub3QgYSBwYXJ0IG9mIFBIUAogICAgfQogICAgaWYgKCFub3F1b3RlcykgCiAgICB7CiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyZxdW90Oy9nLCAnIicpOwogICAgfQogICAgLy8gUHV0IHRoaXMgaW4gbGFzdCBwbGFjZSB0byBhdm9pZCBlc2NhcGUgYmVpbmcgZG91YmxlLWRlY29kZWQKICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8mYW1wOy9nLCAnJicpOwoKICAgIHJldHVybiBzdHJpbmc7Cn0KCgpmdW5jdGlvbiBzZXRDdXJzb3IoY3Vyc29yLCBkb2MpCnsKICAgIGlmICghZG9jKQogICAgICAgIGRvYyA9IGRvY3VtZW50OwogICAgCiAgICByZWxlYXNlQ3Vyc29yKGRvYyk7CiAgICB2YXIgc3R5bGUgPSBjcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgc3R5bGUudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgICBzdHlsZS5pbm5lckhUTUwgPSAiYm9keSwgYm9keSAqIHsgY3Vyc29yOiIrY3Vyc29yKyIgIWltcG9ydGFudDsgfSI7CiAgICAKICAgIC8vYXBwZW5kRmlyc3QoZG9jLmJvZHksIHN0eWxlKTsKICAgIGFwcGVuZEZpcnN0KGRvYy5oZWFkLCBzdHlsZSk7CiAgICBkb2MuZ2xvYmFsQ3Vyc29yQ1NTID0gc3R5bGU7Cn0KCmZ1bmN0aW9uIHJlbGVhc2VDdXJzb3IoZG9jKQp7CiAgICBpZiAoIWRvYykKICAgICAgICBkb2MgPSBkb2N1bWVudDsKCiAgICBpZiAoZG9jLmdsb2JhbEN1cnNvckNTUykKICAgICAgICByZW1vdmVOb2RlKGRvYy5nbG9iYWxDdXJzb3JDU1MpOwogICAgICAgIAogICAgZG9jLmdsb2JhbEN1cnNvckNTUyA9IG51bGw7Cn0KCmZ1bmN0aW9uIGdldEVsZW1lbnRGcm9tUG9pbnQoeCwgeSkKewogICAgdmFyIGVsZW0gPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgCiAgICByZXR1cm4oZWxlbSk7Cn0KICAgIAovLyBmaW5kcyBhbGwgZWxlbWVudHMgaW5jbHVkaW5nIGVsZW1lbnRzIHVuZGVyIGFic29sdXRlbHkgcG9zaXRpb25lZApmdW5jdGlvbiBnZXRFbGVtZW50c0Zyb21Qb2ludCh4LCB5KQp7CiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIAogICAgdmFyIGVsZW0gPSBnZXRFbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgaWYgKGVsZW0pCiAgICB7CiAgICAgICAgZWxlbXMucHVzaChlbGVtKTsKICAgICAgICB3aGlsZSh0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGdldFN0eWxlKGVsZW0sICJwb3NpdGlvbiIpID09ICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVsZW0uX29sZERpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsZW1zID0gZWxlbXMuY29uY2F0KGdldEVsZW1lbnRzRnJvbVBvaW50KHgsIHkpKTsKICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IGVsZW0uX29sZERpc3BsYXk7CiAgICAgICAgICAgICAgICBkZWxldGUoZWxlbS5fb2xkRGlzcGxheSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudE5vZGUgPT0gZG9jdW1lbnQuYm9keSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oZWxlbXMpOwp9CgpmdW5jdGlvbiBnZXRBbGxFbGVtZW50c0Zyb21Qb2ludCh4LCB5KQp7CiAgICB2YXIgZWxlbXMgPSBbXTsKICAgIHZhciBfZWxlbXMgPSBnZXRFbGVtZW50c0Zyb21Qb2ludCh4LCB5KTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IF9lbGVtcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGVsZW0gPSBfZWxlbXNbaV07CiAgICAgICAgd2hpbGUgKGVsZW0gIT0gZG9jdW1lbnQuYm9keSkKICAgICAgICB7CiAgICAgICAgICAgIGVsZW1zLnB1c2goZWxlbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4oZWxlbXMpOwp9CgpmdW5jdGlvbiBjb25jYXQoKSAKewogICAgdmFyIHR5cGUgPSAiIjsKICAgIGZvcih2YXIgaSA9IDAgOyBpIDwgYXJndW1lbnRzLmxlbmd0aCA7IGkrKykgCiAgICB7CiAgICAgICAgaWYgKHR5cGUgJiYgdHlwZW9mKGFyZ3VtZW50c1tpXSkgIT0gdHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93KCJjb25jYXQoKTogYXJndW1lbnRzIG11c3QgYmUgdGhlIHNhbWUgdHlwZSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHR5cGUgPSB0eXBlb2YoYXJndW1lbnRzW2ldKTsKICAgIH0KCiAgICBpZiAodHlwZW9mKGFyZ3VtZW50c1swXSkgPT0gIm9iamVjdCIpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IHt9OwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggOyBpKyspIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKCiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gYXJnKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGFyZy5oYXNPd25Qcm9wZXJ0eShwKSkgCiAgICAgICAgICAgICAgICAgICAgcmV0W3BdID0gYXJnW3BdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy9lbHNlIGlmICh0eXBlb2YoYXJndW1lbnRzWzBdKSA9PSAiYXJyYXkiKQogICAgZWxzZSBpZiAoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgQXJyYXkpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggOyBpKyspIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgcmV0ID0gcmV0LmNvbmNhdChhcmcpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgcmV0ID0gIiI7CiAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgYXJndW1lbnRzLmxlbmd0aCA7IGkrKykgCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICByZXQgKz0gYXJnOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKHJldCk7Cn0KCmZ1bmN0aW9uIGdldEJvdW5kc1JlY3QoZWxlbSwgcmVsYXRpdmVUbykKewogICAgdmFyIHBvcyA9IGdldFBvc2l0aW9uKGVsZW0sIHJlbGF0aXZlVG8pOwogICAgCiAgICByZXR1cm4oewogICAgICAgICJ4IjogcG9zWyJ4Il0sCiAgICAgICAgInkiOiBwb3NbInkiXSwKICAgICAgICAidyI6IGVsZW0ub2Zmc2V0V2lkdGgsCiAgICAgICAgImgiOiBlbGVtLm9mZnNldEhlaWdodAogICAgfSk7Cn0KCmFkZEV2ZW50KHdpbmRvdywgImxvYWQiLCBmdW5jdGlvbigpewogICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpOwogICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZWxlbXMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIC8vZHVtcCgiISIrZWxlbXNbaV0pOwogICAgICAgIC8vZHVtcCgiISIrZWxlbXNbaV0uc3JjKTsKICAgICAgICBhZGRJZnJhbWUoZWxlbXNbaV0pOwogICAgfQp9KTsKCmZ1bmN0aW9uIGNvdW50KG9iaikKewogICAgLy9pZiAodHlwZW9mKG9iaikgPT0gImFycmF5IikKICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkKICAgIHsKICAgICAgICByZXR1cm4ob2JqLmxlbmd0aCk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2Yob2JqKSA9PSAib2JqZWN0IikKICAgIHsKICAgICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgCiAgICAgICAgewogICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIAogICAgICAgICAgICAgICAgc2l6ZSsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4oc2l6ZSk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgX3Rocm93KCdjb3VudCgpIC0gbm90IGFuIGFycmF5Jyk7ICAgIAp9CgpmdW5jdGlvbiBjaGFyV3JhcCh0ZXh0KQp7CiAgICBmdW5jdGlvbiBfd3JhcCh0ZXh0KQogICAgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0ZXh0Lmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgcmV0ICs9IHRleHRbaV0rWldTUDsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKHJldCk7CiAgICB9CiAgICAKICAgIGlmICh0eXBlb2YodGV4dCkgPT0gInN0cmluZyIpICAgIAogICAgICAgIHJldHVybihfd3JhcCh0ZXh0KSk7CiAgICBlbHNlIGlmICh0eXBlb2YodGV4dCkgPT0gIm9iamVjdCIgJiYgdGV4dC50YWdOYW1lKQogICAgewogICAgICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlOb2RlVHlwZShURVhUX05PREUsIHRleHQpOwogICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGVsZW1zW2ldLm5vZGVWYWx1ZSA9IF93cmFwKGVsZW1zW2ldLm5vZGVWYWx1ZSk7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGltYWdlTG9hZGVkKGVsZW0pCnsKICAgIC8vIER1cmluZyB0aGUgb25sb2FkIGV2ZW50LCBJRSBjb3JyZWN0bHkgaWRlbnRpZmllcyBhbnkgaW1hZ2VzIHRoYXQKICAgIC8vIHdlcmVu4oCZdCBkb3dubG9hZGVkIGFzIG5vdCBjb21wbGV0ZS4gT3RoZXJzIHNob3VsZCB0b28uIEdlY2tvLWJhc2VkCiAgICAvLyBicm93c2VycyBhY3QgbGlrZSBOUzQgaW4gdGhhdCB0aGV5IHJlcG9ydCB0aGlzIGluY29ycmVjdGx5LgogICAgaWYgKCFpbWcuY29tcGxldGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gSG93ZXZlciwgdGhleSBkbyBoYXZlIHR3byB2ZXJ5IHVzZWZ1bCBwcm9wZXJ0aWVzOiBuYXR1cmFsV2lkdGggYW5kCiAgICAvLyBuYXR1cmFsSGVpZ2h0LiBUaGVzZSBnaXZlIHRoZSB0cnVlIHNpemUgb2YgdGhlIGltYWdlLiBJZiBpdCBmYWlsZWQKICAgIC8vIHRvIGxvYWQsIGVpdGhlciBvZiB0aGVzZSBzaG91bGQgYmUgemVyby4KCiAgICBpZiAodHlwZW9mIGltZy5uYXR1cmFsV2lkdGggIT09ICJ1bmRlZmluZWQiICYmIGltZy5uYXR1cmFsV2lkdGggPT09IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gTm8gb3RoZXIgd2F5IG9mIGNoZWNraW5nOiBhc3N1bWUgaXTigJlzIG9rLgogICAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gZ2V0SW1hZ2VXaWR0aChlbGVtKQp7CiAgICByZXR1cm4oZWxlbS5uYXR1cmFsV2lkdGggfHwgZWxlbS5vZmZzZXRXaWR0aCk7Cn0KZnVuY3Rpb24gZ2V0SW1hZ2VIZWlnaHQoZWxlbSkKewogICAgcmV0dXJuKGVsZW0ubmF0dXJhbEhlaWdodCB8fCBlbGVtLm9mZnNldEhlaWdodCk7Cn0KZnVuY3Rpb24gc2V0Q29udGVudEVkaXRhYmxlKGVsZW0sIGVkaXRhYmxlKQp7CiAgICBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9IGVkaXRhYmxlOwoKICAgIGlmICghZWxlbS5fY29udGVudEVkaXRhYmxlRXZlbnRzKQogICAgewogICAgICAgIGVsZW0uX2NvbnRlbnRFZGl0YWJsZUV2ZW50cyA9IHRydWU7CiAgICAgICAgdmFyIF9lbGVtID0gZWxlbTsKICAgICAgICBhZGRFdmVudChlbGVtLCAiZm9jdXMiLCBmdW5jdGlvbigpewogICAgICAgICAgICBpZiAoX2VsZW0uY29udGVudEVkaXRhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX19lbGVtID0gX2VsZW07CiAgICAgICAgICAgICAgICB3aGlsZShfX2VsZW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKF9fZWxlbS5kcmFnZ2FibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2VsZW0uX2RyYWdnYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZWxlbS5kcmFnZ2FibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgX19lbGVtID0gX19lbGVtLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBhZGRFdmVudChlbGVtLCAiYmx1ciIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmIChfZWxlbS5jb250ZW50RWRpdGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfX2VsZW0gPSBfZWxlbTsKICAgICAgICAgICAgICAgIHdoaWxlKF9fZWxlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoX19lbGVtLl9kcmFnZ2FibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2VsZW0uX2RyYWdnYWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2VsZW0uZHJhZ2dhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgX19lbGVtID0gX19lbGVtLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KfQoKaWYgKGRvY3VtZW50LmFsbCkKewogICAgdmFyIF9faWVWZXJzaW9uID0gcGFyc2VGbG9hdCgobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8uKig/OnJ2fGllKVtcLzogXSguKz8pKFsgXCk7XXwkKS8pIHx8IFtdKVsxXSk7CiAgICAKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc05hbWUgPSAiaWUgaWUiK19faWVWZXJzaW9uOwogICAgZm9yICh2YXIgaSA9IDExIDsgaSA+PSA2IDsgaS0tKQogICAgewogICAgICAgIGlmIChfX2llVmVyc2lvbiA8IGkpCiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc05hbWUgKz0gIiBsdC1pZSIraTsKICAgICAgICBpZiAoX19pZVZlcnNpb24gPD0gaSkKICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTmFtZSArPSAiIGx0ZS1pZSIraTsKICAgICAgICBpZiAoX19pZVZlcnNpb24gPiBpKQogICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lICs9ICIgZ3QtaWUiK2k7CiAgICAgICAgaWYgKF9faWVWZXJzaW9uID49IGkpCiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc05hbWUgKz0gIiBndGUtaWUiK2k7CiAgICB9Cn0KCndpbmRvdy5yZXNpemUgPSBmdW5jdGlvbigpCnsKaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgICBlLmluaXRFdmVudCgncmVzaXplJywgdHJ1ZSwgZmFsc2UpOwogICAgZG9jdW1lbnQuYm9keS5kaXNwYXRjaEV2ZW50KGUpOwoKfSBlbHNlIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCkgewogICAgZG9jdW1lbnQuYm9keS5maXJlRXZlbnQoJ29ucmVzaXplJyk7Cn0gICAgCn0KCmZ1bmN0aW9uIHN0cmlwX3RhZ3MoaW5wdXQsIGFsbG93ZWQpIAp7CiAgICBhbGxvd2VkID0gKCgoYWxsb3dlZCB8fCAiIikgKyAiIikudG9Mb3dlckNhc2UoKS5tYXRjaCgvPFthLXpdW2EtejAtOV0qPi9nKSB8fCBbXSkuam9pbignJyk7IC8vIG1ha2luZyBzdXJlIHRoZSBhbGxvd2VkIGFyZyBpcyBhIHN0cmluZyBjb250YWluaW5nIG9ubHkgdGFncyBpbiBsb3dlcmNhc2UgKDxhPjxiPjxjPikKICAgIHZhciB0YWdzID0gLzxcLz8oW2Etel1bYS16MC05XSopXGJbXj5dKj4vZ2ksCiAgICBjb21tZW50c0FuZFBocFRhZ3MgPSAvPCEtLVtcc1xTXSo/LS0+fDxcPyg/OnBocCk/W1xzXFNdKj9cPz4vZ2k7CiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShjb21tZW50c0FuZFBocFRhZ3MsICcnKS5yZXBsYWNlKHRhZ3MsIGZ1bmN0aW9uICgkMCwgJDEpIHsKICAgICAgICByZXR1cm4gYWxsb3dlZC5pbmRleE9mKCc8JyArICQxLnRvTG93ZXJDYXNlKCkgKyAnPicpID4gLTEgPyAkMCA6ICcnOwogICAgfSk7Cn0KCi8vIGNhbGxpbmcgZm9ybS5zdWJtaXQoKSBkb2VzIG5vdCBmaXJlIG9uU3VibWl0IGV2ZW50cyAtIHdlIGZpeCBpdCBieSBjYWxsaW5nIHN1Ym1pdCBidXR0b24gY2xpY2soKTsKSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5fc3VibWl0ID0gSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ7CkhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUuc3VibWl0ID0gZnVuY3Rpb24oKSAKewogICAgLy9kdW1wKHRoaXMub25zdWJtaXQpOwogICAgLy9kdW1wKHRoaXMuZ2V0QXR0cmlidXRlKCJvbnN1Ym1pdCIpKTsKICAgIGlmICh0aGlzLm9uc3VibWl0IHx8IHRoaXMuZ2V0QXR0cmlidXRlKCJvbnN1Ym1pdCIpKQogICAgewogICAgICAgIGlmICghdGhpcy5fc3VibWl0QnV0dG9uKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fc3VibWl0QnV0dG9uID0gY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKICAgICAgICAgICAgdGhpcy5fc3VibWl0QnV0dG9uLnR5cGUgPSAic3VibWl0IjsKICAgICAgICAgICAgdGhpcy5fc3VibWl0QnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5fc3VibWl0QnV0dG9uKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc3VibWl0QnV0dG9uLmNsaWNrKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9hbGVydCh0aGlzLl9zdWJtaXQpOwogICAgICAgIHRoaXMuX3N1Ym1pdCgpOwogICAgfQp9CgpmdW5jdGlvbiBleHBsb2RlTGluayhsaW5rKQp7CiAgICBmdW5jdGlvbiBfdXJsZGVjb2RlUGFyYW1zKHBhcmFtKQogICAgewogICAgICAgIGlmIChwYXJhbSA9PSBudWxsKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgCiAgICAgICAgdmFyIF9wYXJhbXMgPSB7fTsKICAgICAgICBpZiAodHlwZW9mKHBhcmFtKSA9PSAib2JqZWN0IikKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YocGFyYW0ubGVuZ3RoKSA9PSAibnVtYmVyIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAgOyBqIDwgcGFyYW0ubGVuZ3RoIDsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIF9wYXJhbXNbal0gPSBfdXJsZGVjb2RlUGFyYW1zKHBhcmFtW2pdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGogaW4gcGFyYW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9pZiAodHlwZW9mKHBhcmFtW2pdKSAhPSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1zW2pdID0gX3VybGRlY29kZVBhcmFtcyhwYXJhbVtqXSk7CiAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICB9ICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YocGFyYW0pID09ICJzdHJpbmciKQogICAgICAgIHsKICAgICAgICAgICAgX3BhcmFtcyA9IHVybGRlY29kZShwYXJhbSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIF9wYXJhbXMgPSBwYXJhbTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIHJldHVybihfcGFyYW1zKTsKICAgIH0KCiAgICB2YXIgbGlua0luZm8gPSB7fTsKICAgIGxpbmtJbmZvWyJwYXJhbXMiXSA9IHt9OwogICAgCiAgICB2YXIgbGlua0FBID0gbGluay5zcGxpdCgiIyIpOwogICAgaWYgKGxpbmtBQVsxXSkKICAgIHsKICAgICAgICBsaW5rSW5mb1siYW5jaG9yIl0gPSBsaW5rQUFbMV07CiAgICB9CgogICAgdmFyIGxpbmtBID0gbGlua0FBWzBdLnNwbGl0KCI/Iik7CiAgICBpZiAobGlua0FbMV0pCiAgICB7CiAgICAgICAgdmFyIGxpbmtCID0gbGlua0FbMV0uc3BsaXQoIiMiKTsKICAgICAgICBsaW5rSW5mb1sicGFyYW1zIl0gPSBleHRyYWN0UGFyYW1zKGxpbmtCWzBdLCAiJiIsICI9IiwgdHJ1ZSk7CiAgICAgICAgbGlua0luZm9bInBhcmFtcyJdID0gX3VybGRlY29kZVBhcmFtcyhsaW5rSW5mb1sicGFyYW1zIl0pOwogICAgICAgIC8qCiAgICAgICAgZm9yICh2YXIgaSBpbiBsaW5rSW5mb1sicGFyYW1zIl0pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGxpbmtJbmZvWyJwYXJhbXMiXVtpXSkgPT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICBsaW5rSW5mb1sicGFyYW1zIl1baV0gPSBfdXJsZGVjb2RlKGxpbmtJbmZvWyJwYXJhbXMiXVtpXSk7CiAgICAgICAgfQogICAgICAgICovCiAgICAgICAgCiAgICAgICAgaWYgKGxpbmtCWzBdKQogICAgICAgICAgICBsaW5rSW5mb1sic3BhcmFtcyJdID0gbGlua0JbMF07CiAgICAgICAgaWYgKGxpbmtCWzFdKQogICAgICAgICAgICBsaW5rSW5mb1siYW5jaG9yIl0gPSBsaW5rQlsxXTsKICAgIH0KCiAgICBpZiAobGlua0FbMF0pCiAgICB7CiAgICAgICAgaWYgKGxpbmtBWzBdLmluZGV4T2YoIjoiKSAhPT0gLTEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbGlua1AgPSBsaW5rQVswXS5zcGxpdCgiOiIpOwogICAgICAgICAgICBsaW5rSW5mb1sicHJvdG9jb2wiXSA9IGxpbmtQWzBdOwogICAgICAgICAgICBpZiAobGlua0FbMF0uaW5kZXhPZigibWFpbHRvOiIpICE9IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsaW5rSW5mb1sidmFsdWUiXSA9IGxpbmtBWzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmtQWzFdLmluZGV4T2YoIi8vIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5rWCA9IGxpbmtQWzFdLnN1YnN0cmluZygyLCBsaW5rUFsxXS5sZW5ndGgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBsaW5rSW5mb1siZG9tYWluIl0gPSBsaW5rWFswXTsKICAgICAgICAgICAgICAgIGxpbmtYLnNoaWZ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsaW5rSW5mb1sidmFsdWUiXSA9IGxpbmtQWzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsaW5rWCA9IGxpbmtBWzBdLnNwbGl0KCIvIik7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAobGlua1gpCiAgICB7CiAgICAgICAgaWYgKGxpbmtBWzBdW2xpbmtBWzBdLmxlbmd0aC0xXSAhPSAiLyIpCiAgICAgICAgewogICAgICAgICAgICAvL2lmIChsaW5rWFtsaW5rWC5sZW5ndGgtMV1bMF0gPT0gIiMiKQogICAgICAgICAgICAvLyAgICBsaW5rSW5mb1siYW5jaG9yIl0gPSBsaW5rWFtsaW5rWC5sZW5ndGgtMV0uc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgaWYgKGxpbmtYW2xpbmtYLmxlbmd0aC0xXS5pbmRleE9mKCIuIikgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGlua0luZm9bImZpbGUiXSA9IGxpbmtYW2xpbmtYLmxlbmd0aC0xXTsKICAgICAgICAgICAgICAgIGxpbmtYLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxpbmtJbmZvWyJwYXRoIl0gPSAobGlua1gubGVuZ3RoIHx8IGxpbmtJbmZvWyJkb21haW4iXSA/IGNsZWFuTGluaygiLyIrbGlua1guam9pbigiLyIpKyIvIikgOiAiIik7CiAgICB9CgogICAgcmV0dXJuKGxpbmtJbmZvKTsKfQoKZnVuY3Rpb24gaW1wbG9kZUxpbmsobGlua0luZm8pCnsKICAgIGlmICghaXNfYXJyYXkobGlua0luZm8pKQogICAgewogICAgICAgIF90aHJvdygiaW1wbG9kZUxpbmsoJyIrbGlua0luZm8rIicpIC0gbm90IGFuIGFycmF5Iik7CiAgICB9CiAgICAKICAgIGlmICghbGlua0luZm9bInByb3RvY29sIl0gJiYgd2luZG93LlBST1RPQ09MKQogICAgICAgIGxpbmtJbmZvWyJwcm90b2NvbCJdID0gUFJPVE9DT0w7CiAgICBpZiAoIWxpbmtJbmZvWyJmaWxlIl0pCiAgICAgICAgbGlua0luZm9bImZpbGUiXSA9ICIiOwogICAgCiAgICBsaW5rID0gIiI7CiAgICBpZiAobGlua0luZm9bInZhbHVlIl0pCiAgICB7CiAgICAgICAgbGluayA9IGxpbmtJbmZvWyJwcm90b2NvbCJdKyI6IitsaW5rSW5mb1sidmFsdWUiXTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAobGlua0luZm9bImRvbWFpbiJdKQogICAgICAgIHsKICAgICAgICAgICAgbGluayA9IGxpbmtJbmZvWyJwcm90b2NvbCJdKyI6Ly8iK2xpbmtJbmZvWyJkb21haW4iXSsiLyI7CiAgICAgICAgfQoKICAgICAgICBsaW5rICs9IGxpbmtJbmZvWyJwYXRoIl0rbGlua0luZm9bImZpbGUiXTsKCiAgICAgICAgaWYgKGxpbmtJbmZvWyJwYXJhbXMiXSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gbGlua0luZm9bInBhcmFtcyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaW5rSW5mb1sicGFyYW1zIl1bbmFtZV07CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKGlzX2Jvb2woJHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkbGlua0luZm9bInBhcmFtcyJdWyRuYW1lXSA9ICgkdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgbGluayArPSAiPyIrZ2V0UGFyYW1zQXNMaW5rKGxpbmtJbmZvWyJwYXJhbXMiXSk7CiAgICAgICAgICAgIC8vbGluayArPSAiPyIraW1wbG9kZVBhcmFtcyhsaW5rSW5mb1sicGFyYW1zIl0sICImIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxpbmtJbmZvWyJzcGFyYW1zIl0pCiAgICAgICAgewogICAgICAgICAgICBsaW5rICs9ICI/IitsaW5rSW5mb1sic3BhcmFtcyJdOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAobGlua0luZm9bImFuY2hvciJdKQogICAgICAgIHsKICAgICAgICAgICAgbGluayArPSAiIyIrbGlua0luZm9bImFuY2hvciJdOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuKGNsZWFuTGluayhsaW5rKSk7Cn0KCmZ1bmN0aW9uIGNvbGxlY3QoKSAKewogICAgdmFyIG89e307CiAgICBmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKSB7CiAgICAgIHZhciBhcmc9YXJndW1lbnRzW2ldOwogICAgICBpZih0eXBlb2YgYXJnICE9ICJvYmplY3QiKSBjb250aW51ZTsKICAgICAgZm9yKHZhciBwIGluIGFyZykgewogICAgICAgIGlmKGFyZy5oYXNPd25Qcm9wZXJ0eShwKSkgb1twXSA9IGFyZ1twXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG87Cn0KCmZ1bmN0aW9uIGdldFVybChwYXJhbXMpCnsKICAgIHJldHVybihnZXRDdXJyZW50VXJsKHBhcmFtcykpOwp9CgpmdW5jdGlvbiBnZXRDdXJyZW50VXJsKHBhcmFtcykKewogICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoKICAgIGlmIChwYXJhbXMpCiAgICAgICAgdXJsID0gZXh0ZW5kVXJsKHVybCwgcGFyYW1zKTsKICAgIAogICAgcmV0dXJuKHVybCk7Cn0KCmZ1bmN0aW9uIGV4dGVuZFVybCh1cmwsIHBhcmFtcykKewogICAgaWYgKHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IHt9OwogICAgCiAgICAvL2R1bXAodXJsKTsKICAgIHZhciBsaW5rSW5mbyA9IGV4cGxvZGVMaW5rKHVybCk7CiAgICAvL2R1bXAoIi0tLS0tLS0tLS0tLS0tLSIpOwogICAgLy9kdW1wKGxpbmtJbmZvWyJwYXJhbXMiXSk7CiAgICAvL2R1bXAocGFyYW1zKTsKICAgIGxpbmtJbmZvWyJwYXJhbXMiXSA9IGNvbGxlY3QobGlua0luZm9bInBhcmFtcyJdLGNvbmNhdChwYXJhbXMpKTsKICAgIC8vZHVtcChsaW5rSW5mb1sicGFyYW1zIl0pOwogICAgCiAgICByZXR1cm4oaW1wbG9kZUxpbmsobGlua0luZm8pKTsKfQoKdmFyIF9fcHJpbnQgPSB3aW5kb3cucHJpbnQ7CnZhciBfX3ByaW50SWZyYW1lID0gbnVsbDsKdmFyIF9fcHJpbnRGb3JtID0gbnVsbDsKd2luZG93LnByaW50ID0gZnVuY3Rpb24odXJsKQp7CiAgICBpZiAodHlwZW9mKHVybCkgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgLy8ga3Z1bGkgSUUgISEsIGppbmFrIHN0YWNpIF9fcHJpbnQoKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGZvY3VzKCk7CiAgICAgICAgICAgIF9fcHJpbnQoKTsKICAgICAgICB9LCAxMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChfX3ByaW50SWZyYW1lKQogICAgewogICAgICAgIHJlbW92ZU5vZGUoX19wcmludElmcmFtZSk7CiAgICAgICAgX19wcmludElmcmFtZSA9IG51bGw7CiAgICB9CiAgICBpZiAoX19wcmludEZvcm0pCiAgICB7CiAgICAgICAgcmVtb3ZlTm9kZShfX3ByaW50Rm9ybSk7CiAgICAgICAgX19wcmludEZvcm0gPSBudWxsOwogICAgfQoKICAgIGlmICghX19wcmludElmcmFtZSkKICAgIHsKICAgICAgICBfX3ByaW50SWZyYW1lID0gY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CiAgICAgICAgX19wcmludElmcmFtZS5uYW1lID0gIl9fcHJpbnRJZnJhbWUiOwogICAgICAgIF9fcHJpbnRJZnJhbWUuc3R5bGUud2lkdGggPSAiMXB4IjsKICAgICAgICBfX3ByaW50SWZyYW1lLnN0eWxlLmJvcmRlciA9ICIwcHgiOwogICAgICAgIF9fcHJpbnRJZnJhbWUuc3R5bGUubWFyZ2luVG9wID0gIi0xMHB4IjsKICAgICAgICBfX3ByaW50SWZyYW1lLnN0eWxlLmhlaWdodCA9ICIxcHgiOwogICAgICAgIF9fcHJpbnRJZnJhbWUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIF9fcHJpbnRJZnJhbWUuc3R5bGUuekluZGV4ID0gIi0xIjsKICAgICAgICBhcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBfX3ByaW50SWZyYW1lKTsKICAgIH0KICAgIAogICAgaWYgKCFfX3ByaW50Rm9ybSkKICAgIHsKICAgICAgICBfX3ByaW50Rm9ybSA9IGNyZWF0ZUVsZW1lbnQoImZvcm0iKTsKICAgICAgICBfX3ByaW50Rm9ybS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIF9fcHJpbnRGb3JtLm1ldGhvZCA9ICJwb3N0IjsKICAgICAgICBfX3ByaW50Rm9ybS50YXJnZXQgPSAiX19wcmludElmcmFtZSI7CiAgICAgICAgYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgX19wcmludEZvcm0pOwogICAgfQoKICAgIGlmICh1cmwgPT09IHRydWUpCiAgICAgICAgdXJsID0gZ2V0Q3VycmVudFVybCh7InN0eWxlIjoicHJpbnQiLCAibm9SZWRpcmVjdCI6InRydWUifSk7CiAgICBlbHNlIGlmICh0eXBlb2YodXJsKSA9PSAib2JqZWN0IikKICAgIHsKICAgICAgICBpZiAoIXVybFsic3R5bGUiXSkKICAgICAgICAgICAgdXJsWyJzdHlsZSJdID0gInByaW50IjsKICAgICAgICBpZiAodHlwZW9mKHVybFsibm9SZWRpcmVjdCJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgdXJsWyJub1JlZGlyZWN0Il0gPSAidHJ1ZSI7CiAgICAgICAgICAgIAogICAgICAgIC8vYWxlcnQodXJsWyJodG1sIl0pOwogICAgICAgIGlmICh1cmxbImh0bWwiXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh1cmxbImh0bWwiXS5pbmRleE9mKCJiYXNlNjQ6IikgIT0gMCkKICAgICAgICAgICAgICAgIHVybFsiaHRtbCJdID0gYmFzZTY0X2VuY29kZSh1cmxbImh0bWwiXSk7CgogICAgICAgICAgICB1cmxbInJhbmQiXSA9IFVVSUQoKTsKCiAgICAgICAgICAgIHZhciBlbGVtcyA9IGdldFBhcmFtc0FzRm9ybSh1cmwpOwoKICAgICAgICAgICAgX19wcmludEZvcm0uYWN0aW9uID0gUFJPSkVDVFVSTCsicHJpbnQucGhwIjsKICAgICAgICAgICAgX19wcmludEZvcm0uaW5uZXJIVE1MID0gIiI7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX19wcmludEZvcm0uYXBwZW5kQ2hpbGQoZWxlbXNbaV0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBfX3ByaW50Rm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy9lbHNlIGlmICh1cmxbImNvbHMiXSAmJiB1cmxbInJvd3MiXSkKICAgICAgICAgICAgdXJsID0gUFJPSkVDVFVSTCsicHJpbnQucGhwPyIrZ2V0UGFyYW1zQXNMaW5rKHVybCk7CiAgICAgICAgLy9lbHNlCiAgICAgICAgLy8gICAgdXJsID0gUFJPSkVDVFVSTCsiaW5kZXgucGhwPyIrZ2V0UGFyYW1zQXNMaW5rKHVybCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHVybC5pbmRleE9mKCI/IikgPiAtMSkKICAgICAgICAgICAgdXJsICs9ICImc3R5bGU9cHJpbnQmbm9SZWRpcmVjdD10cnVlIjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVybCArPSAiP3N0eWxlPXByaW50Jm5vUmVkaXJlY3Q9dHJ1ZSI7CiAgICB9CiAgICAKICAgIC8vX19wcmludElmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtfX3ByaW50SWZyYW1lLmNvbnRlbnREb2N1bWVudC5leGVjQ29tbWFuZCgicHJpbnQiLCB0cnVlLCBudWxsKTsgfTsKICAgIC8vIE5ldyBDaHJvbWUgNzcrLCBGRiwgZXRjLiBkb2VzIG5vdCBhbGxvdyBQREYncyB0aGlzLnByaW50KCkgLi4uIAogICAgX19wcmludElmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtfX3ByaW50SWZyYW1lLmNvbnRlbnRXaW5kb3cucHJpbnQoKTsgfTsKICAgIC8vX19wcmludElmcmFtZS5zdHlsZS53aWR0aCA9ICI0MDBweCI7CiAgICAvL19fcHJpbnRJZnJhbWUuc3R5bGUuaGVpZ2h0ID0gIjQwMHB4IjsKICAgIC8vX19wcmludElmcmFtZS5zdHlsZS56SW5kZXggPSAiMTAwMCI7CiAgICBfX3ByaW50SWZyYW1lLnNyYyA9IHVybDsKfQoKZnVuY3Rpb24gY2hhbmdlVGFnTmFtZShlbGVtLCB0YWdOYW1lKQp7CiAgICB2YXIgZWxlbTIgPSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwogICAgCiAgICBpZiAoZWxlbTIudGFnTmFtZSAhPSAiSU5QVVQiKQogICAgewogICAgICAgIHdoaWxlKGVsZW0uY2hpbGROb2Rlcy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICBlbGVtMi5hcHBlbmRDaGlsZChlbGVtLmNoaWxkTm9kZXNbMF0pOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZm9yICh2YXIgaT0wIDsgaSA8IGVsZW0uYXR0cmlidXRlcy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSBlbGVtLmF0dHJpYnV0ZXNbaV0ubmFtZTsKICAgICAgICBlbGVtMi5zZXRBdHRyaWJ1dGUobmFtZSwgZWxlbS5hdHRyaWJ1dGVzW2ldLnZhbHVlKTsKICAgIH0KICAgIAogICAgaW5zZXJ0QmVmb3JlKGVsZW0sIGVsZW0yKTsKICAgIHJlbW92ZU5vZGUoZWxlbSk7CiAgICAKICAgIHJldHVybihlbGVtMik7Cn0KCmZ1bmN0aW9uIGlzRGV2ZWxvcGVyKCkKewogICAgLy9yZXR1cm4oZ2V0T2JqZWN0KCJEZWJ1ZyIpICE9IG51bGwpOwogICAgcmV0dXJuKHdpbmRvdy5kZXZlbG9wZXIgPT0gdHJ1ZSk7Cn0KCmZ1bmN0aW9uIGlzQWRtaW5pc3RyYXRvcigpCnsKICAgIHJldHVybih3aW5kb3cuYWRtaW5pc3RyYXRvciA9PSB0cnVlKTsKfQoKZnVuY3Rpb24gY2hhbmdlQXR0cmlidXRlKGVsZW0sIG5hbWUsIHZhbHVlKQp7CiAgICAvL2R1bXAoQnJvd3Nlci5uYW1lKTsKICAgIC8vZHVtcChCcm93c2VyLnZlcnNpb24pOwogICAgaWYgKEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiICYmIEJyb3dzZXIudmVyc2lvbiA8PSA4ICYmIChlbGVtLnRhZ05hbWUgPT0gIklOUFVUIiB8fCBlbGVtLnRhZ05hbWUgPT0gIkJVVFRPTiIpICYmIG5hbWUgPT0gInR5cGUiKQogICAgewogICAgICAgIHZhciBlbGVtMiA9IGNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgIGNvcHlFbGVtZW50UHJvcGVydGllcyhlbGVtLCBlbGVtMiwgW10sIFsidHlwZSJdKTsKICAgICAgICAvL2R1bXAoZWxlbTIpOwogICAgICAgIGVsZW0yW25hbWVdID0gdmFsdWU7CiAgICAgICAgLy9lbGVtMi5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICAgIAogICAgICAgIGluc2VydEJlZm9yZShlbGVtLCBlbGVtMik7CiAgICAgICAgcmVtb3ZlTm9kZShlbGVtKTsKICAgICAgICAKICAgICAgICBlbGVtID0gZWxlbTI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9lbGVtLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgaWYgKG5hbWUgPT0gImNsYXNzIikKICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlbGVtW25hbWVdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9kdW1wKG5hbWUpOwogICAgICAgICAgICAgICAgLy9kdW1wKGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4oZWxlbSk7Cn0KCgpmdW5jdGlvbiBmaXhJRVN0eWxlTGltaXQoKQp7CiAgICAvL2FsZXJ0KGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCk7CiAgICB2YXIgc3R5bGVTaGVldHMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIsIGRvY3VtZW50LmhlYWQpOwogICAgdmFyIGhyZWZzID0gW107CiAgICBmb3IgKHZhciBpID0gc3R5bGVTaGVldHMubGVuZ3RoLTEgOyBpID49IDAgOyBpLS0pCiAgICB7CiAgICAgICAgaWYgKGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA+PSAzMCkgIC8vIG5lZWQgMiBtb3JlIChpbmRleCAyOSBhbmQgMzApIC4uLiBzZWUgYWRkU3R5bGUoKSAtIHRoZXJlIHdpbGwgdGhleSBiZSBjcmVhdGVkCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3R5bGVTaGVldHNbaV0ucmVsID09ICJzdHlsZXNoZWV0IiAmJiBzdHlsZVNoZWV0c1tpXS5ocmVmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBocmVmcy5wdXNoKHN0eWxlU2hlZXRzW2ldLmhyZWYpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzdHlsZVNoZWV0c1tpXSk7CiAgICAgICAgICAgICAgICAvL2lmIChocmVmcy5sZW5ndGggPT0gMTApCiAgICAgICAgICAgICAgICAvLyAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgLy9hbGVydChocmVmcyk7CiAgICAvL2FsZXJ0KGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCk7CgogICAgZm9yICh2YXIgaWkgPSBocmVmcy5sZW5ndGgtMSA7IGlpPj0wIDsgaWktLSkKICAgIHsKICAgICAgICBhZGRTdHlsZShocmVmc1tpaV0pOwogICAgfQp9CgppZiAoQnJvd3Nlci5uYW1lID09ICJFeHBsb3JlciIgJiYgQnJvd3Nlci52ZXJzaW9uIDw9IDkpCnsKICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKXtmaXhJRVN0eWxlTGltaXQoKTt9KTsKICAgIGVsc2UKICAgICAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25sb2FkIiwgZnVuY3Rpb24oKXtmaXhJRVN0eWxlTGltaXQoKTt9KTsKfQoKZnVuY3Rpb24gbm93KF9kYXRlLCBfdGltZSkKewogICAgaWYgKHR5cGVvZihfZGF0ZSkgPT0gInVuZGVmaW5lZCIpICAgIAogICAgICAgIF9kYXRlID0gdHJ1ZTsKCiAgICBpZiAodHlwZW9mKF90aW1lKSA9PSAidW5kZWZpbmVkIikgICAgCiAgICAgICAgX3RpbWUgPSB0cnVlOwogICAgICAgIAogICAgcmV0dXJuKGRhdGUoKF9kYXRlID8gIlktbS1kICIgOiAiIikrKF90aW1lID8gIkg6aTpzIiA6ICIiKSwgdGltZSgpKSk7Cn0KCmZ1bmN0aW9uIF9zdHJ0b3RpbWUoc3RyLCBub3csIGNoZWNrKQp7CiAgICBpZiAodHlwZW9mKG5vdykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgbm93ID0gbnVsbDsKICAgIGlmICh0eXBlb2YoY2hlY2spID09ICJ1bmRlZmluZWQiKQogICAgICAgIGNoZWNrID0gZmFsc2U7CiAgICAgICAgCgogICAgaWYgKHR5cGVvZihzdHIpID09ICJudW1iZXIiIHx8IHR5cGVvZihzdHIpID09ICJ1bmRlZmluZWQiIHx8IHN0ciA9PT0gbnVsbCkKICAgICAgICByZXR1cm4oc3RyKTsKICAgIAogICAgaWYgKHR5cGVvZihzdHIpICE9ICJzdHJpbmciKQogICAgewogICAgICAgIHRocm93KCJfc3RydG90aW1lKCkgLSBmaXJzdCBhcmd1bWVudCBpcyBub3Qgc3RyaW5nOiAiLnN0cik7CgogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KCiAgICAvLyBuYSBXaW5kb3dzIHBsYXRmb3JtZSB0byBmdW5ndWplIHNrdmVsZQogICAgaWYgKHN0ciA9PSAiMDAwMC0wMC0wMCIgfHwgc3RyID09ICIwMDAwLTAwLTAwIDAwOjAwOjAwIiB8fCBzdHIgPT0gIiIpCiAgICAgICAgcmV0dXJuKDApOwogICAgCiAgICBpZiAoc3RyLm1hdGNoKC9eWzAtOV1bMC05XT86WzAtOV1bMC05XT86WzAtOV1bMC05XT8kLykpCiAgICB7CiAgICAgICAgcmV0dXJuKHN0cnRvdGltZShkYXRlKCJZLW0tZCIpKyIgIitzdHIpKTsKICAgIH0KCiAgICBpZiAoIWNoZWNrICYmICFzdHIubWF0Y2goL15bMC05XVswLTldWzAtOV1bMC05XS1bMC05XVswLTldLVswLTldWzAtOV0gWzAtOV1bMC05XTpbMC05XVswLTldOlswLTldWzAtOV0kLykpIC8vIGlzU3FsRGF0ZUZvcm1hdAogICAgewogICAgICAgIGlmIChzdHIubWF0Y2goL15bMC05XSskLykpIC8vIGRvbnQgdXNlIC4KICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihleHRyYWN0RmxvYXQoc3RyKSk7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtcyA9IHN0ci5tYXRjaCgvKFswLTlcLl0rKSAqbXMvKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihleHRyYWN0RmxvYXQoZWxlbXNbMV0vMTAwMCkpOwogICAgICAgIH0KICAgICAgICBpZiAoZWxlbXMgPSBzdHIubWF0Y2goLyhbMC05XC5dKykgKmQoKGF5KT9zKT8vKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihleHRyYWN0RmxvYXQoZWxlbXNbMV0qNjAqNjAqMjQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVsZW1zID0gc3RyLm1hdGNoKC8oWzAtOVwuXSspICpoKChvdXIpP3MpPy8pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKGV4dHJhY3RGbG9hdChlbGVtc1sxXSo2MCo2MCkpOwogICAgICAgIH0KICAgICAgICBpZiAoZWxlbXMgPSBzdHIubWF0Y2goLyhbMC05XC5dKykgKm1vbigodGgpP3MpPy8pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKGV4dHJhY3RGbG9hdChlbGVtc1sxXSo2MCo2MCoyNCozMCkpOwogICAgICAgIH0KICAgICAgICBpZiAoZWxlbXMgPSBzdHIubWF0Y2goLyhbMC05XC5dKykgKm0oKChpbik/dXRlKT9zKT8vKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybihleHRyYWN0RmxvYXQoZWxlbXNbMV0qNjApKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVsZW1zID0gc3RyLm1hdGNoKC8oWzAtOVwuXSspICpzKCgoZWMpP29uZCk/cyk/LykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4oZXh0cmFjdEZsb2F0KGVsZW1zWzFdKSk7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtcyA9IHN0ci5tYXRjaCgvKFswLTlcXC5dKykgKnkoKGVhcik/P3MpPy8pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKGV4dHJhY3RGbG9hdChlbGVtc1sxXSo2MCo2MCoyNCozNjUpKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmIChzdHIuaW5kZXhPZigiOiIpID09PSAtMSkKICAgICAgICBzdHIgKz0gIiAwMDowMDowMCI7CiAgICAKICAgIC8vdmFyX2R1bXAoJHN0cik7CiAgICB2YXIgdGltZSA9IHN0cnRvdGltZShzdHIsIG5vdyk7CiAgICAvL3Zhcl9kdW1wKCR0aW1lKTsKICAgIC8vdmFyX2R1bXAoZGF0ZSgiZC5tLlkiLCAkdGltZSkpOwogICAgLy9leGl0OwogICAgLy92YXJfZHVtcCgkdGltZSk7CiAgICAvL2V4aXQ7CiAgICAvLyR0aW1lID0gTlVMTDsKICAgIAogICAgLyoKICAgIC8vIFRPRE8gLSBzdHJ0b3RpbWVmKCkgLi4uIAogICAgaWYgKCR0aW1lID09PSBOVUxMIHx8ICR0aW1lID09PSAwIHx8ICR0aW1lID09PSAtMSB8fCAkdGltZSA9PT0gRkFMU0UgfHwgZGF0ZSgiWS1tLWQiLCAkdGltZSkgPT0gIjE5NzAtMDEtMDEiKSAvLyBsb2NhbGUgc3RydG90aW1lIG5vdCBzdXBwb3J0ZWQKICAgIHsKICAgICAgICAkdGltZSA9IGdldE9iamVjdCgiVHJhbnNsYXRvciIpLT5nZXRUaW1lU3RhbXAoJHN0cik7CiAgICAgICAgLy92YXJfZHVtcCgkdGltZSk7CiAgICB9CiAgICAqLwogICAgCiAgICBpZiAoY2hlY2spCiAgICAgICAgcmV0dXJuKCEodGltZSA9PT0gbnVsbCB8fCB0aW1lID09PSAwIHx8IHRpbWUgPT09IC0xIHx8IHRpbWUgPT09IGZhbHNlIHx8IGRhdGUoIlktbS1kIiwgdGltZSkgPT0gIjE5NzAtMDEtMDEiKSk7CgogICAgcmV0dXJuKHRpbWUpOwp9CgoKKGZ1bmN0aW9uKCkgewogICAgdmFyIGhpZGRlbiA9ICJoaWRkZW4iOwogICAgd2luZG93LmZvY3VzZWQgPSB0cnVlOwogICAgCiAgICAvLyBTdGFuZGFyZHM6CiAgICBpZiAoaGlkZGVuIGluIGRvY3VtZW50KQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLCBvbmNoYW5nZSk7CiAgICBlbHNlIGlmICgoaGlkZGVuID0gIm1vekhpZGRlbiIpIGluIGRvY3VtZW50KQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1venZpc2liaWxpdHljaGFuZ2UiLCBvbmNoYW5nZSk7CiAgICBlbHNlIGlmICgoaGlkZGVuID0gIndlYmtpdEhpZGRlbiIpIGluIGRvY3VtZW50KQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdHZpc2liaWxpdHljaGFuZ2UiLCBvbmNoYW5nZSk7CiAgICBlbHNlIGlmICgoaGlkZGVuID0gIm1zSGlkZGVuIikgaW4gZG9jdW1lbnQpCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibXN2aXNpYmlsaXR5Y2hhbmdlIiwgb25jaGFuZ2UpOwogICAgLy8gSUUgOSBhbmQgbG93ZXI6CiAgICBlbHNlIGlmICgnb25mb2N1c2luJyBpbiBkb2N1bWVudCkKICAgICAgICBkb2N1bWVudC5vbmZvY3VzaW4gPSBkb2N1bWVudC5vbmZvY3Vzb3V0ID0gb25jaGFuZ2U7CiAgICAvLyBBbGwgb3RoZXJzOgogICAgZWxzZQogICAgICAgIHdpbmRvdy5vbnBhZ2VzaG93ID0gd2luZG93Lm9ucGFnZWhpZGUgCiAgICAgICAgICAgID0gd2luZG93Lm9uZm9jdXMgPSB3aW5kb3cub25ibHVyID0gb25jaGFuZ2U7CgogICAgZnVuY3Rpb24gb25jaGFuZ2UgKGV2dCkgewogICAgICAgIC8vdmFyIHYgPSAndmlzaWJsZScsIGggPSAnaGlkZGVuJywKICAgICAgICB2YXIgdiA9IHRydWUsIGggPSBmYWxzZSwKICAgICAgICAgICAgZXZ0TWFwID0geyAKICAgICAgICAgICAgICAgIGZvY3VzOnYsIGZvY3VzaW46diwgcGFnZXNob3c6diwgYmx1cjpoLCBmb2N1c291dDpoLCBwYWdlaGlkZTpoIAogICAgICAgICAgICB9OwoKICAgICAgICBldnQgPSBldnQgfHwgd2luZG93LmV2ZW50OwogICAgICAgIGlmIChldnQudHlwZSBpbiBldnRNYXApCiAgICAgICAgICAgIHdpbmRvdy5mb2N1c2VkID0gZXZ0TWFwW2V2dC50eXBlXTsKICAgICAgICAgICAgLy9kb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IGV2dE1hcFtldnQudHlwZV07CiAgICAgICAgZWxzZSAgICAgICAgCiAgICAgICAgICAgIHdpbmRvdy5mb2N1c2VkID0gdGhpc1toaWRkZW5dID8gZmFsc2UgOiB0cnVlOwogICAgICAgICAgICAvL2RvY3VtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpc1toaWRkZW5dID8gImhpZGRlbiIgOiAidmlzaWJsZSI7CiAgICB9Cn0pKCk7CgovLyBIVE1MIDUKLy9hbGVydChuYXZpZ2F0b3IuYXBwTmFtZSk7CmlmICgvTVNJRSAvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IC9ydjoxMS4wL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkKewogICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoZWFkZXInKTsKICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmF2Jyk7CiAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTsKICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXJ0aWNsZScpOwogICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhc2lkZScpOwogICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb290ZXInKTsKICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaGdyb3VwJyk7CiAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21haW4nKTsKICAgICAgCiAgICAgIGFkZFN0eWxlKCJhIGltZyB7Ym9yZGVyOjBweDt9IGhlYWRlciwgbmF2LCBzZWN0aW9uLCBhcnRpY2xlLCBhc2lkZSwgZm9vdGVyLCBoZ3JvdXAsIG1haW4ge2Rpc3BsYXk6YmxvY2s7fSIpOwp9CgpmdW5jdGlvbiBhcnJheV91bmlxdWUoYSkgCnsKICAgIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbihwLCBjKSB7CiAgICAgICAgaWYgKHAuaW5kZXhPZihjKSA8IDApIHAucHVzaChjKTsKICAgICAgICByZXR1cm4gcDsKICAgIH0sIFtdKTsKfQoKLyoKZnVuY3Rpb24gZWxlbWVudFZpc2libGUoZWxlbSwgZnVsbFZpc2libGUpIAp7CiAgICBpZiAoZWxlbS50YWdOYW1lID09ICJIVE1MIikKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIAogICAgdmFyIHBhcmVudFJlY3QgPSBlbGVtLnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgcmVjdCA9IGFyZ3VtZW50c1syXSB8fCBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgCiAgICByZXR1cm4gKAogICAgICAgICAgICAoIGZ1bGxWaXNpYmxlID8gcmVjdC50b3AgICAgPj0gcGFyZW50UmVjdC50b3AgICAgOiByZWN0LmJvdHRvbSA+IHBhcmVudFJlY3QudG9wICkgJiYKICAgICAgICAgICAgKCBmdWxsVmlzaWJsZSA/IHJlY3QubGVmdCAgID49IHBhcmVudFJlY3QubGVmdCAgIDogcmVjdC5yaWdodCAgPiBwYXJlbnRSZWN0LmxlZnQgKSAmJgogICAgICAgICAgICAoIGZ1bGxWaXNpYmxlID8gcmVjdC5ib3R0b20gPD0gcGFyZW50UmVjdC5ib3R0b20gOiByZWN0LnRvcCAgICA8IHBhcmVudFJlY3QuYm90dG9tICkgJiYKICAgICAgICAgICAgKCBmdWxsVmlzaWJsZSA/IHJlY3QucmlnaHQgIDw9IHBhcmVudFJlY3QucmlnaHQgIDogcmVjdC5sZWZ0ICAgPCBwYXJlbnRSZWN0LnJpZ2h0ICkgJiYKICAgICAgICAgICAgZWxlbWVudFZpc2libGUoZWxlbS5wYXJlbnROb2RlLCBmdWxsVmlzaWJsZSwgcmVjdCkKICAgICk7Cn07CiovCgpmdW5jdGlvbiBlbGVtZW50VmlzaWJsZShlbGVtLCBmdWxsKSAKewogICAgaWYgKHR5cGVvZihmdWxsKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBmdWxsID0gZmFsc2U7CiAgICAKICAgIHZhciB2aXNpYmxlID0gdHJ1ZTsKICAgIHZhciBfZWxlbSA9IGVsZW07CiAgICB3aGlsZShfZWxlbSAmJiBfZWxlbS5zdHlsZSkKICAgIHsKICAgICAgICBpZiAoZ2V0U3R5bGUoX2VsZW0sICJkaXNwbGF5IikgPT0gIm5vbmUiIHx8IGdldFN0eWxlKF9lbGVtLCAidmlzaWJpbGl0eSIpID09ICJoaWRkZW4iIHx8IF9lbGVtLm9mZnNldFdpZHRoID09IDAgJiYgX2VsZW0ub2Zmc2V0SGVpZ2h0ID09IDApCiAgICAgICAgewogICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBfZWxlbSA9IF9lbGVtLnBhcmVudE5vZGU7CiAgICB9CiAgICAKICAgIGlmICghdmlzaWJsZSB8fCB0eXBlb2YoZnVsbCkgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgcmV0dXJuKHZpc2libGUpOwogICAgfQoKICAgIC8vIGlzIGRpc3BsYXkgYXJlYSB2aXNpYmxlPwogICAgdmFyIHdTaXplID0gQnJvd3Nlci5nZXRXaW5kb3dTaXplKCk7CiAgICB2YXIgcG9zID0gZ2V0V2luZG93UG9zaXRpb24oZWxlbSk7CiAgICB2YXIgdyA9IGVsZW0ub2Zmc2V0V2lkdGg7CiAgICB2YXIgaCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwogICAgCiAgICAvL2R1bXAoIioiKTsKICAgIC8vZHVtcChwb3MueCk7CiAgICAvL2R1bXAodyk7CiAgICAvL2R1bXAoaCk7CiAgICAKICAgIGlmIChmdWxsKQogICAgewogICAgICAgIGlmIChwb3MueCA+PSAwICYmIHBvcy54K3cgPCB3U2l6ZS53aWR0aCAmJiBwb3MueSA+PSAwICYmIHBvcy55K3cgPCB3U2l6ZS5oZWlnaHQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vZHVtcChwb3MueCsiIDwgIit3U2l6ZS53aWR0aCk7CiAgICAgICAgLy9kdW1wKHBvcy54K3crIiA+PSAwIik7CiAgICAgICAgLy9kdW1wKHBvcy55KyIgPCAiK3dTaXplLmhlaWdodCk7CiAgICAgICAgLy9kdW1wKHBvcy55K2grIiA+PSAwIik7CiAgICAgICAgaWYgKChwb3MueCA8IHdTaXplLndpZHRoICYmIHBvcy54K3cgPj0gMCkgJiYgKHBvcy55IDwgd1NpemUuaGVpZ2h0ICYmIHBvcy55K2ggPj0gMCkpCiAgICAgICAgewogICAgICAgICAgICAvL2R1bXAodHJ1ZSk7CiAgICAgICAgICAgIHJldHVybih0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuKGZhbHNlKTsKfQoKLyoKdmFyIGR1bXBUaW1lU3RhY2sgPSBbXTsKdmFyIGR1bXBUaW1lVG90YWxTdGFjayA9IFtdOwpmdW5jdGlvbiBkdW1wVGltZVN0YXJ0KHRleHQpCnsKICAgIHZhciB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAKICAgIGlmICh0ZXh0KQogICAgICAgIGFkZER1bXAoIjxzcGFuIHN0eWxlPSdjb2xvcjpkYXJrZ3JlZW47Zm9udC13ZWlnaHQ6Ym9sZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO21hcmdpbi1sZWZ0OiIrKGR1bXBUaW1lU3RhY2subGVuZ3RoKjIwKSsicHg7Jz5zdGFydDogIit0ZXh0KyI8L3NwYW4+Iik7CgogICAgZHVtcFRpbWVTdGFjay5wdXNoKHRpbWUpOwp9CgpmdW5jdGlvbiBkdW1wVGltZUNvbnRpbnVlKHRleHQpCnsKICAgIHZhciB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkdW1wVGltZVN0YWNrLnBvcCgpOwogICAgYWRkRHVtcCgiPHNwYW4gc3R5bGU9J2NvbG9yOmRhcmtncmF5O2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLWxlZnQ6IisoZHVtcFRpbWVTdGFjay5sZW5ndGgqMjApKyJweDsnPmNvbnRpbnVlOiAiKyh0ZXh0ID8gIigiK3RleHQrIikiIDogIiIpKyI6ICIrKHRpbWUvMTAwMCkrIiBzPC9zcGFuPiIrIiBbc3RhY2s6ICIrZHVtcFRpbWVTdGFjay5sZW5ndGgrIl0iKTsKICAgIAogICAgZHVtcFRpbWVTdGFydCgpOwp9CgpmdW5jdGlvbiBkdW1wVGltZSh0ZXh0KQp7CiAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gZHVtcFRpbWVTdGFjay5wb3AoKTsKICAgIGFkZER1bXAoIjxzcGFuIHN0eWxlPSdjb2xvcjpkYXJrZ3JlZW47Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW4tbGVmdDoiKyhkdW1wVGltZVN0YWNrLmxlbmd0aCoyMCkrInB4Oyc+ZmluaXNoOiAiKyh0ZXh0ID8gIigiK3RleHQrIikiIDogIiIpKyI6ICIrKHRpbWUvMTAwMCkrIiBzPC9zcGFuPiIrIiBbc3RhY2s6ICIrZHVtcFRpbWVTdGFjay5sZW5ndGgrIl0iKTsKfQoqLwoKaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUgJykgPiAwIHx8IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQvJykgPiAwIHx8IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UvJykgPiAwKSAvLyBhbGwgSUUgYW5kIEVkZ2UKewogICAgYWRkRXZlbnQod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgaWVIVE1MNUZvcm1zRml4KCk7CiAgICB9KTsKfQoKLy8gVE9ETyAtIGFsc28gY2FsbCBpbiBzZXRBdHRyaWJ1dGUgdG8gZGV0ZWN0IGlmIGNoYW5nZWQgZHluYW1pY2FseQpmdW5jdGlvbiBpZUhUTUw1Rm9ybXNGaXgoKQp7CiAgICAvL2R1bXAoJ2ZpeCcpOwogICAgdmFyIGVsZW1zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGVsZW1zLmxlbmd0aCA7IGkrKykKICAgIHsKICAgICAgICB2YXIgZm9ybSA9IGVsZW1zW2ldOwogICAgICAgIGlmICghZm9ybS5pZUhUTUw1Rm9ybXNGaXhlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfZm9ybSA9IGZvcm07CiAgICAgICAgICAgIGFkZEV2ZW50KGZvcm0sICJzdWJtaXQiLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIC8vZHVtcCgnZml4Jyk7CiAgICAgICAgICAgICAgICBlID0gZ2V0RXZlbnQoZSk7CiAgICAgICAgICAgICAgICBpZiAoX2Zvcm0uaWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5pZUhUTUw1Rm9ybXNGaXhFbGVtcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKFsiaW5wdXQiLCJ0ZXh0YXJlYSIsInNlbGVjdCJdKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBlbGVtcy5sZW5ndGggOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IGVsZW1zW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoImZvcm0iKSA9PSBfZm9ybS5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0yID0gZWxlbS5jbG9uZU5vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0yLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm9ybS5hcHBlbmRDaGlsZChlbGVtMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm9ybS5pZUhUTUw1Rm9ybXNGaXhFbGVtcy5wdXNoKGVsZW0yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gIlRFWFRBUkVBIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtMi52YWx1ZSA9IGVsZW0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnc3VibWl0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2Uuc3RvcCgpOwogICAgICAgICAgICAgICAgLy9yZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIGlmIChfZm9ybS5pZUhUTUw1Rm9ybXNGaXhFbGVtcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IF9mb3JtLmllSFRNTDVGb3Jtc0ZpeEVsZW1zLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zvcm0ucmVtb3ZlQ2hpbGQoX2Zvcm0uaWVIVE1MNUZvcm1zRml4RWxlbXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgMjAwMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3JtLmllSFRNTDVGb3Jtc0ZpeGVkID0gdHJ1ZTsKICAgIH0KfQoKZnVuY3Rpb24gYXBwZW5kTGluayhsaW5rLCBwYXJhbXMpCnsKICAgIHZhciBsaW5rSW5mbyA9IGV4cGxvZGVMaW5rKGxpbmspOwogICAgLy9kdW1wKGxpbmtJbmZvWyJwYXJhbXMiXSk7CiAgICBsaW5rSW5mb1sicGFyYW1zIl0gPSBhcnJheV9tZXJnZShsaW5rSW5mb1sicGFyYW1zIl0sIHBhcmFtcyk7CiAgICBmb3IgKHZhciBpIGluIHBhcmFtcykKICAgIHsKICAgICAgICBpZiAocGFyYW1zW2ldID09ICIiKQogICAgICAgICAgICBkZWxldGUobGlua0luZm9bInBhcmFtcyJdW2ldKTsKICAgIH0KICAgIAogICAgcmV0dXJuKGltcGxvZGVMaW5rKGxpbmtJbmZvKSk7Cn0KCmZ1bmN0aW9uIGlzRm9ybUVsZW1lbnQoZWxlbSkKewogICAgdmFyIHRhZ05hbWUgPSBlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IEZPUk1fRUxFTUVOVF9UQUdfTkFNRVMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIGlmICh0YWdOYW1lID09IEZPUk1fRUxFTUVOVF9UQUdfTkFNRVNbaV0pCiAgICAgICAgICAgIHJldHVybih0cnVlKTsKICAgIH0KICAgIAogICAgcmV0dXJuKGZhbHNlKTsKfQoKZnVuY3Rpb24gX2FsZXJ0KG1lc3NhZ2UsIGNhbGxiYWNrKQp7CiAgICBpZiAodHlwZW9mKGNhbGxiYWNrKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCl7cmV0dXJuKHRydWUpfTsKICAgIAogICAgdmFyIERpYWxvZyA9IGNyZWF0ZU9iamVjdCgiRGlhbG9nIiwgeyJsYXlvdXQiOiJBbGVydERpYWxvZyIsIm1vZGFsIjp0cnVlLCJkZXN0cm95Ijp0cnVlLCJtZXNzYWdlIjptZXNzYWdlfSk7CiAgICBEaWFsb2cub25PayA9IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuKGNhbGxiYWNrKCkpOwogICAgfTsKfQoKZnVuY3Rpb24gX2NvbmZpcm0obWVzc2FnZSwgY2FsbGJhY2spCnsKICAgIGlmICh0eXBlb2YoY2FsbGJhY2spID09ICJ1bmRlZmluZWQiKQogICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oKXtyZXR1cm4odHJ1ZSl9OwogICAgCiAgICB2YXIgRGlhbG9nID0gY3JlYXRlT2JqZWN0KCJEaWFsb2ciLCB7ImxheW91dCI6IkNvbmZpcm1EaWFsb2ciLCJtb2RhbCI6dHJ1ZSwiZGVzdHJveSI6dHJ1ZSwibWVzc2FnZSI6bWVzc2FnZX0pOwogICAgRGlhbG9nLm9uT2sgPSBmdW5jdGlvbigpewogICAgICAgIHJldHVybihjYWxsYmFjaygpKTsKICAgIH07Cn0KCi8vIGRhdGFsaXN0IGJhY2tjb21wYXQKZnVuY3Rpb24gaXNEYXRhTGlzdFN1cHBvcnRlZCgpCnsKICAgIHJldHVybighKEJyb3dzZXIubmFtZSA9PSAiRXhwbG9yZXIiICYmIEJyb3dzZXIudmVyc2lvbiA8PSA5IHx8IEJyb3dzZXIubmFtZSA9PSAiU2FmYXJpIiAmJiBCcm93c2VyLnZlcnNpb24gPD0gMTIpKTsKfQoKZnVuY3Rpb24gZGF0YUxpc3RFbXVsYXRpb24oKQp7CiAgICBhZGRTdHlsZSgiZGF0YWxpc3Qge2Rpc3BsYXk6bm9uZTtiYWNrZ3JvdW5kOiNGRkZGRkY7cG9zaXRpb246YWJzb2x1dGU7bWF4LWhlaWdodDozMDBweDtvdmVyZmxvdy15OmF1dG87IH0gZGF0YWxpc3QgZGl2IHtkaXNwbGF5OiBibG9jaztjb2xvcjojMDAwMDAwO2N1cnNvcjpwb2ludGVyO21pbi1oZWlnaHQ6MS4yZW07cGFkZGluZzowcHggMnB4IDFweDt9IGRhdGFsaXN0IGRpdjpob3ZlciB7Y29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kOiM2NjY2RkZ9Iik7CiAgICAKICAgIHZhciBkYXRhbGlzdHMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiZGF0YWxpc3QiKTsKICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGRhdGFsaXN0cy5sZW5ndGggOyBpKyspCiAgICB7CiAgICAgICAgdmFyIGRhdGFsaXN0ID0gZGF0YWxpc3RzW2ldOwogICAgICAgIGlmICghZGF0YWxpc3QuX19lbXVsYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIGRhdGFsaXN0Ll9fZW11bGF0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWRhdGFsaXN0Ll9faW5wdXQpCiAgICAgICAgewogICAgICAgICAgICBkYXRhbGlzdC5fX2lucHV0ID0gZ2V0RWxlbWVudEJ5QXR0cmlidXRlKCJsaXN0IiwgZGF0YWxpc3QuaWQpOwogICAgICAgICAgICBkYXRhbGlzdC5fX2lucHV0LnNldEF0dHJpYnV0ZSgiYXV0b2NvbXBsZXRlIiwgIm9mZiIpOwogICAgICAgICAgICBkYXRhbGlzdC5fX2lucHV0Ll9fZGF0YWxpc3QgPSBkYXRhbGlzdDsKICAgICAgICAgICAgYWRkRXZlbnQoZGF0YWxpc3QuX19pbnB1dCwgImtleXVwIiwgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICBlID0gZ2V0RXZlbnQoZSk7IAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzaG93RWxlbWVudChlLnRhcmdldC5fX2RhdGFsaXN0KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBvcHRpb25zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIsIGRhdGFsaXN0KTsKICAgICAgICBmb3IgKHZhciBpaSA9IDAgOyBpaSA8IG9wdGlvbnMubGVuZ3RoIDsgaWkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zW2lpXTsKICAgICAgICAgICAgdmFyIGRpdiA9IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICBkaXYuX19kYXRhbGlzdCA9IGRhdGFsaXN0OwogICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gb3B0aW9uLmlubmVySFRNTDsKICAgICAgICAgICAgYWRkRXZlbnQoZGl2LCAiY2xpY2siLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGUgPSBnZXRFdmVudChlKTsgCiAgICAgICAgICAgICAgICBlLnN0b3AoKTsgCiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZS50YXJnZXQ7IAogICAgICAgICAgICAgICAgaWYgKGRpdi5fX2RhdGFsaXN0Ll9faW5wdXQub2JqZWN0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRpdi5fX2RhdGFsaXN0Ll9faW5wdXQub2JqZWN0LnNldFZhbHVlKGRpdi5pbm5lckhUTUwpOyAvLyB0byBjYWxsIG9uQ2hhbmdlIGluIFNhZmFyaQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRpdi5fX2RhdGFsaXN0Ll9faW5wdXQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIGRpdi5pbm5lckhUTUwpOwogICAgICAgICAgICAgICAgICAgIGRpdi5fX2RhdGFsaXN0Ll9faW5wdXQudmFsdWUgPSBkaXYuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGlkZUVsZW1lbnQoZGl2Ll9fZGF0YWxpc3QpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGluc2VydEJlZm9yZShvcHRpb24sIGRpdik7CiAgICAgICAgICAgIHJlbW92ZU5vZGUob3B0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtkYXRhTGlzdEVtdWxhdGlvbigpfSwgMTAwMCk7Cn0KCnNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgIGlmICghaXNEYXRhTGlzdFN1cHBvcnRlZCgpKQogICAgewogICAgICAgIGRhdGFMaXN0RW11bGF0aW9uKCk7CgogICAgICAgIGFkZEV2ZW50KHdpbmRvdywgImNsaWNrIiwgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIHZhciBkYXRhbGlzdHMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiZGF0YWxpc3QiKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgZGF0YWxpc3RzLmxlbmd0aCA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRhdGFsaXN0ID0gZGF0YWxpc3RzW2ldOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaGlkZUVsZW1lbnQoZGF0YWxpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cn0sIDEwMDApOwoKZnVuY3Rpb24gc2V0VXJsKHVybCwgdGl0bGUsIG9iamVjdCkKewogICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG9iamVjdCwgdGl0bGUsIHVybCk7Cn0KCmZ1bmN0aW9uIGZpcnN0X3ZhbHVlKHYxLCB2MiwgdjMsIHY0LCB2NSkKewogICAgaWYgKHR5cGVvZih2MSkgIT0gInVuZGVmaW5lZCIgJiYgdjEgIT09IG51bGwgJiYgdjEpCiAgICB7CiAgICAgICAgcmV0dXJuKHYxKTsKICAgIH0KICAgIGlmICh0eXBlb2YodjIpICE9ICJ1bmRlZmluZWQiICYmIHYyICE9PSBudWxsICYmIHYyKQogICAgewogICAgICAgIHJldHVybih2Mik7CiAgICB9CiAgICBpZiAodHlwZW9mKHYzKSAhPSAidW5kZWZpbmVkIiAmJiB2MyAhPT0gbnVsbCAmJiB2MykKICAgIHsKICAgICAgICByZXR1cm4odjMpOwogICAgfQogICAgaWYgKHR5cGVvZih2NCkgIT0gInVuZGVmaW5lZCIgJiYgdjQgIT09IG51bGwgJiYgdjQpCiAgICB7CiAgICAgICAgcmV0dXJuKHY0KTsKICAgIH0KICAgIGlmICh0eXBlb2YodjUpICE9ICJ1bmRlZmluZWQiICYmIHY1ICE9PSBudWxsICYmIHY1KQogICAgewogICAgICAgIHJldHVybih2NSk7CiAgICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHJpYnV0ZShlbGVtLCBuYW1lLCB2YWx1ZSkKewogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUobmFtZSwgIiIpOwogICAgZWxzZQogICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKfQoKZnVuY3Rpb24gYWRkQXR0cmlidXRlKGVsZW0sIG5hbWUpCnsKICAgIHNldEF0dHJpYnV0ZShlbGVtLCBuYW1lKTsKfQoKZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlKGVsZW0sIG5hbWUpCnsKICAgIHNldEF0dHJpYnV0ZShlbGVtLCBuYW1lKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKGVsZW0sIG5hbWUpCnsKICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwp9CgphZGRFdmVudCh3aW5kb3csICJsb2FkIiwgZnVuY3Rpb24oKXsKICAgIGlmICghZ2V0Q29va2llKCJkaWQiKSkKICAgIHsKICAgICAgICBzZXRDb29raWUoImRpZCIsIFVVSUQoKSwgNjAqNjAqMjQqMzY1KTsKICAgIH0KfSk7CgovL3dpbmRvdy5hbGVydDIgPSB3aW5kb3cuYWxlcnQ7Ci8vd2luZG93LmFsZXJ0ID0gZnVuY3Rpb24odGV4dCl7d2luZG93LmFsZXJ0Mih0ZXh0K2dldEZ1bmN0aW9uQ2FsbCgpKX0=ZnVuY3Rpb24gVEFKQVgoKQp7CiAgICB0aGlzLnhtbEh0dHBSZXF1ZXN0cyA9IHt9OwogICAgdGhpcy54bWxIdHRwUmVxdWVzdElkID0gMDsKICAgIHRoaXMudGltZW91dCA9IDA7CiAgICB0aGlzLmRpc2FibGVkRWxlbWVudHMgPSBbXTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRYTUxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKGlkKQp7CiAgICAvL2R1bXAoaWQpOwogICAgaWYgKHR5cGVvZihpZCkgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnhtbEh0dHBSZXF1ZXN0cykKICAgICAgICAgICAgaWQgPSBpOwogICAgfQogICAgCiAgICB2YXIgWE1MSHR0cCA9IHRoaXMueG1sSHR0cFJlcXVlc3RzW2lkXTsKICAgIC8vZHVtcChYTUxIdHRwKTsKICAgIAogICAgcmV0dXJuKFhNTEh0dHApOwp9CgpUQUpBWC5wcm90b3R5cGUuY3JlYXRlWE1MSHR0cFJlcXVlc3QgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMueG1sSHR0cFJlcXVlc3RJZCsrOwoKICAgIHZhciBYTUxIdHRwID0gKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA/IG5ldyBYTUxIdHRwUmVxdWVzdCgpIDogbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikpOyAgICAKICAgIFhNTEh0dHAuaWQgPSB0aGlzLnhtbEh0dHBSZXF1ZXN0SWQ7CiAgICB0aGlzLnhtbEh0dHBSZXF1ZXN0c1t0aGlzLnhtbEh0dHBSZXF1ZXN0SWRdID0gWE1MSHR0cDsKICAgIAogICAgcmV0dXJuKFhNTEh0dHApOwp9CgpUQUpBWC5wcm90b3R5cGUuZGVzdHJveVhNTEh0dHBSZXF1ZXN0ID0gZnVuY3Rpb24oaWQpCnsKICAgIC8vZHVtcChpZCk7CiAgICAKICAgIGlmICh0aGlzLnhtbEh0dHBSZXF1ZXN0c1tpZF0pCiAgICB7CiAgICAgICAgZGVsZXRlKHRoaXMueG1sSHR0cFJlcXVlc3RzW2lkXSk7CiAgICB9CiAgICAKICAgIC8vZHVtcCh0aGlzLnhtbEh0dHBSZXF1ZXN0cyk7Cn0KClRBSkFYLnByb3RvdHlwZS5maXhVcmwgPSBmdW5jdGlvbih1cmwpCnsKICAgIC8vIEphdmFTY3JpcHQgZG9lcyBub3QgYWxsb3cgdG8gb3BlbiBvdGhlciBzaXRlcyBkdWUgdG8gc2VjdXJpdHkgcmVhc29ucwogICAgLy9kdW1wKCJBOiIrdXJsKTsKICAgIGlmICh1cmwuaW5kZXhPZignZmlsZTonKSAhPSAwICYmIHR5cGVvZihQUk9KRUNUVVJMKSAhPSAidW5kZWZpbmVkIiAmJiB1cmwuaW5kZXhPZihQUk9KRUNUVVJMKSAhPSAwICYmIHVybC5pbmRleE9mKCIvIikgIT0gMCAmJiAodXJsLmluZGV4T2YoJ2h0dHA6JykgPT0gMCB8fCB1cmwuaW5kZXhPZignaHR0cHM6JykgPT0gMCB8fCB1cmwuaW5kZXhPZignLy8nKSA9PSAwKSkKICAgIHsKICAgICAgICB1cmwgPSBQUk9KRUNUVVJMKyJkb3dubG9hZC5waHA/dXJsPWJhc2U2NDoiK2Jhc2U2NF9lbmNvZGUodXJsKTsKICAgIH0KICAgIC8vZHVtcCgiQjoiK3VybCk7CgogICAgLy8gc29tZSBzZXJ2ZXJzIGlnbm9yZSBfUkVRVUVTVCBzdXBlcmdsb2JhbCBwYXJhbWV0ZXJzCiAgICB1cmwgPSBzdHJfcmVwbGFjZSgiP19SRVFVRVNUIiwgIj9fX19SRVFVRVNUIiwgdXJsKTsKICAgIHVybCA9IHN0cl9yZXBsYWNlKCImX1JFUVVFU1QiLCAiJl9fX1JFUVVFU1QiLCB1cmwpOwogICAgCiAgICB2YXIgbGlua0luZm8gPSBleHBsb2RlTGluayh1cmwpOwogICAgaWYgKHdpbmRvdy5QRVJTSVNURU5UUEFSQU1TKQogICAgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gUEVSU0lTVEVOVFBBUkFNUykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbGlua0luZm9bInBhcmFtcyJdW25hbWVdKQogICAgICAgICAgICAgICAgbGlua0luZm9bInBhcmFtcyJdW25hbWVdID0gUEVSU0lTVEVOVFBBUkFNU1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICAvL2R1bXAoaW1wbG9kZUxpbmsobGlua0luZm8pKTsKICAgIAogICAgCiAgICByZXR1cm4odXJsKTsKfQoKVEFKQVgucHJvdG90eXBlLmJlZm9yZUxvYWQgPSBmdW5jdGlvbih1cmwpCnsKfQoKVEFKQVgucHJvdG90eXBlLm9uTG9hZCA9IGZ1bmN0aW9uKHVybCwgaHRtbCwgdGltZSkKewogICAgLy9kdW1wKHVybCk7CiAgICAvL2R1bXAodGhpcyk7Cn0KClRBSkFYLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24odXJsLCBodG1sLCB0aW1lKQp7Cn0KClRBSkFYLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oaWQsIF90aW1lb3V0KQp7CiAgICByZXR1cm4odGhpcy5hYm9ydChpZCwgX3RpbWVvdXQpKTsKfQoKVEFKQVgucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24oaWQsIF90aW1lb3V0KQp7CiAgICB2YXIgWE1MSHR0cCA9IHRoaXMuZ2V0WE1MSHR0cFJlcXVlc3QoaWQpOwogICAgaWYgKFhNTEh0dHApCiAgICB7CiAgICAgICAgaWYgKF90aW1lb3V0KQogICAgICAgICAgICBkdW1wKCJUQUpBWDo6YWJvcnQoKSAtIFJlcXVlc3QgJyIrWE1MSHR0cC51cmwrIicgYWJvcnRlZCBieSB0aW1lb3V0ICIrX3RpbWVvdXQrIm1zIik7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9fdGhyb3coIlRBSkFYOjphYm9ydCgpIC0gUmVxdWVzdCAnIitYTUxIdHRwLnVybCsiJyBhYm9ydGVkIik7CiAgICAgICAgICAgIC8vZHVtcEZ1bmN0aW9uQ2FsbCgpOwogICAgICAgIH0KICAgICAgICAvL2R1bXAoWE1MSHR0cCk7CiAgICAgICAgWE1MSHR0cC5hYm9ydCgpOwogICAgICAgIHRoaXMuZGVzdHJveVhNTEh0dHBSZXF1ZXN0KGlkKTsKICAgIH0KfQoKVEFKQVgucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbih1cmwsIGFzeW5jLCBzaW1wbGUpCnsKICAgIGlmICh0eXBlb2Yod2luZG93LmFqYXhEaXNhYmxlZCkgIT0gInVuZGVmaW5lZCIgJiYgd2luZG93LmFqYXhEaXNhYmxlZCAmJiB1cmwuaW5kZXhPZigiYWpheC5waHAiKSA+IC0xKQogICAgICAgIHJldHVybjsKICAgIGlmICghQUpBWEZJTEVOQU1FKQogICAgICAgIHJldHVybjsKICAgIAogICAgLy9hbGVydCh1cmwpOwogICAgLy9kdW1wKHVybCk7CiAgICAvL3dpbmRvdy5fQUpBWCA9IHRydWU7CiAgICAKICAgIGlmICh0eXBlb2Yoc2ltcGxlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBzaW1wbGUgPSBmYWxzZTsKCiAgICB2YXIgdGltZVN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBpZiAoIXNpbXBsZSkKICAgICAgICB1cmwgPSB0aGlzLmZpeFVybCh1cmwpOwoKICAgIGlmICghYXN5bmMpCiAgICAgICAgYXN5bmMgPSBmYWxzZTsKICAgIAogICAgLy9kdW1wKHVybCk7CiAgICAvL2R1bXAoc2ltcGxlKTsKICAgIC8vdmFyIFhNTEh0dHBSZXF1ZXN0ID0gKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCA/IG5ldyBYTUxIdHRwUmVxdWVzdCgpIDogbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikpOyAgICAKICAgIHZhciBYTUxIdHRwID0gdGhpcy5jcmVhdGVYTUxIdHRwUmVxdWVzdCgpOwogICAgLy9kdW1wRnVuY3Rpb25DYWxsKCk7CiAgICAvL3RoaXMuWE1MSHR0cFJlcXVlc3QucHVzaChYTUxIdHRwUmVxdWVzdCk7CgogICAgLy9hbGVydCh1cmwpOwogICAgLy9hbGVydCh1cmwuaW5kZXhPZigiLmpzIikpOwogICAgLy9hbGVydChkZWJ1Zyk7CiAgICAvKgogICAgaWYgKHR5cGVvZihkZWJ1ZykgIT0gInVuZGVmaW5lZCIgJiYgZGVidWcgPT0gJ2RiZ0FKQVgnICYmIHVybC5pbmRleE9mKCIuanMiKSA9PSAtMSkKICAgIHsKICAgICAgICAvL2FsZXJ0KCd4Jyk7CiAgICAgICAgLy93aW5kb3cub3Blbih1cmwrKHVybC5pbmRleE9mKCI/IikgPT0gLTEgPyAiPyIgOiAiJiIpKydkZWJ1Z0FKQVg9dHJ1ZScpOwogICAgICAgIHdpbmRvdy5vcGVuKHVybCk7CiAgICB9CiAgICAqLwogICAgICAgIAogICAgdmFyIGh0bWwgPSBudWxsOwogICAgLyoKICAgIGlmICh0eXBlb2YoYXN5bmMpID09ICJzdHJpbmciKQogICAgewogICAgICAgIFhNTEh0dHBSZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoWE1MSHR0cFJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IFhNTEh0dHBSZXF1ZXN0LnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJ0FKQVggRXJyb3I6JykgPT0gMCkKICAgICAgICAgICAgICAgIHsgICAgCiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChodG1sKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gdHJpbShodG1sKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTG9hZCh1cmwsIGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhc3luYykudmFsdWUgPSBodG1sOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBYTUxIdHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpOwogICAgICAgIFhNTEh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7CiAgICB9CiAgICBpZiAodHlwZW9mKGFzeW5jKSA9PSAiZnVuY3Rpb24iKQogICAgewogICAgICAgIFhNTEh0dHBSZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoWE1MSHR0cFJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IFhNTEh0dHBSZXF1ZXN0LnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJ0FKQVggRXJyb3I6JykgPT0gMCkKICAgICAgICAgICAgICAgIHsgICAgCiAgICAgICAgICAgICAgICAgICAgYWxlcnQoaHRtbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHRyaW0oaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkxvYWQodXJsLCBodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgYXN5bmMoaHRtbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFhNTEh0dHBSZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CiAgICAgICAgWE1MSHR0cFJlcXVlc3Quc2VuZChudWxsKTsKICAgIH0KICAgICovCiAgICAKICAgIGlmICh0aGlzLnRpbWVvdXQpCiAgICB7CiAgICAgICAgLy9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WE1MSHR0cFJlcXVlc3QuYWJvcnQoKX0sIHRoaXMudGltZW91dCk7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgX3htbEh0dHBSZXF1ZXN0SWQgPSBYTUxIdHRwLmlkOwogICAgICAgIHZhciBfdGltZW91dCA9IHRoaXMudGltZW91dDsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMuYWJvcnQoX3htbEh0dHBSZXF1ZXN0SWQsIF90aW1lb3V0KX0sIHRoaXMudGltZW91dCk7CiAgICB9CiAgICAKICAgIC8vZHVtcCh0aGlzLmJlZm9yZUxvYWQpOwogICAgaWYgKCFzaW1wbGUpCiAgICAgICAgdGhpcy5iZWZvcmVMb2FkKHVybCk7CiAgICAKICAgIHZhciBsaW5rSW5mbyA9IGV4cGxvZGVMaW5rKHVybCk7CiAgICB0aGlzLmRpc2FibGVFbGVtZW50cyhsaW5rSW5mb1sicGFyYW1zIl0pOwoKICAgIHRyeQogICAgewogICAgICAgIFhNTEh0dHAudXJsID0gdXJsOwogICAgICAgIGlmICgodHlwZW9mKGFzeW5jKSA9PSAic3RyaW5nIiB8fCB0eXBlb2YoYXN5bmMpID09ICJvYmplY3QiKSAmJiBhc3luYyB8fCB0eXBlb2YoYXN5bmMpID09ICJmdW5jdGlvbiIpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBYTUxIdHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwLnJlYWR5U3RhdGUgPT0gNCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IFhNTEh0dHAucmVzcG9uc2VUZXh0OwoKICAgICAgICAgICAgICAgICAgICBfdGhpcy5kZXN0cm95WE1MSHR0cFJlcXVlc3QoWE1MSHR0cC5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWwuaW5kZXhPZignQUpBWCBFcnJvcjonKSA9PSAwKQogICAgICAgICAgICAgICAgICAgIHsgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIF90aHJvdyhodG1sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhNTEh0dHAuc3RhdHVzID09IDIwMCB8fCAoWE1MSHR0cC5zdGF0dXMgPT0gNTAwICYmIFhNTEh0dHAucmVzcG9uc2VUZXh0KSB8fCBYTUxIdHRwLnN0YXR1cyA9PSA0MDQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwLnN0YXR1cyA9PSA0MDQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Rocm93KCJUQUpBWC5vcGVuKCciK1hNTEh0dHAudXJsKyInKSAtIDQwNCBOb3QgRm91bmQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW1wbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Mb2FkKHVybCwgaHRtbCwgbmV3IERhdGUoKS5nZXRUaW1lKCktdGltZVN0YXJ0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gdHJpbShodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFzeW5jKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jKGh0bWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihhc3luYykgPT0gInN0cmluZyIgfHwgdHlwZW9mKGFzeW5jKSA9PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RWxlbWVudChhc3luYykudGFnTmFtZSA9PSAiSU5QVVQiIHx8IGdldEVsZW1lbnQoYXN5bmMpLnRhZ05hbWUgPT0gIlNFTEVDVCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQoYXN5bmMpLnZhbHVlID0gaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEh0bWwoZ2V0RWxlbWVudChhc3luYyksIGh0bWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF90aGlzLmVuYWJsZUVsZW1lbnRzKGxpbmtJbmZvWyJwYXJhbXMiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICgvKnVybC5sZW5ndGgrZG9jdW1lbnQuY29va2llLmxlbmd0aCA+IDEwMjQgJiYgKi91cmwuaW5kZXhPZigiPyIpID4gLTEgJiYgdXJsLmluZGV4T2YoIiYiKSA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfdXJsID0gdXJsLnN1YnN0cmluZygwLCB1cmwuaW5kZXhPZigiPyIpKTsKICAgICAgICAgICAgICAgIF9wYXJhbXMgPSB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKCI/IikrMSwgdXJsLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgWE1MSHR0cC5vcGVuKCdQT1NUJywgX3VybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBYTUxIdHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gY2F1c2VzIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgLy9YTUxIdHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LWxlbmd0aCIsIF9wYXJhbXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIC8vWE1MSHR0cFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcigiQ29ubmVjdGlvbiIsICJjbG9zZSIpOyAgICAgICAgICAgIAogICAgICAgICAgICAgICAgWE1MSHR0cC5zZW5kKF9wYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgWE1MSHR0cC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpOwogICAgICAgICAgICAgICAgWE1MSHR0cC5zZW5kKG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCh1cmwpOwogICAgICAgICAgICBpZiAoLyp1cmwubGVuZ3RoK2RvY3VtZW50LmNvb2tpZS5sZW5ndGggPiAxMDI0ICYmICovIHVybC5pbmRleE9mKCI/IikgPiAtMSAmJiB1cmwuaW5kZXhPZigiJiIpID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF91cmwgPSB1cmwuc3Vic3RyaW5nKDAsIHVybC5pbmRleE9mKCI/IikpOwogICAgICAgICAgICAgICAgX3BhcmFtcyA9IHVybC5zdWJzdHJpbmcodXJsLmluZGV4T2YoIj8iKSsxLCB1cmwubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICBYTUxIdHRwLm9wZW4oJ1BPU1QnLCBfdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBYTUxIdHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKTsKCiAgICAgICAgICAgICAgICAvLyBjYXVzZXMgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAvL1hNTEh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgX3BhcmFtcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgLy9YTUxIdHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIik7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBYTUxIdHRwLnNlbmQoX3BhcmFtcyk7CiAgICAgICAgICAgICAgICAvL2R1bXAoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2R1bXAodXJsKTsKICAgICAgICAgICAgICAgIFhNTEh0dHAub3BlbignR0VUJywgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBYTUxIdHRwLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsKICAgICAgICAgICAgICAgIC8vZHVtcCgyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihYTUxIdHRwLnN0YXR1cyA9PSAyMDAgfHwgKFhNTEh0dHAuc3RhdHVzID09IDUwMCAmJiBYTUxIdHRwLnJlc3BvbnNlVGV4dCkgfHwgWE1MSHR0cC5zdGF0dXMgPT0gNDA0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IFhNTEh0dHAucmVzcG9uc2VUZXh0OwoKICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwLnN0YXR1cyA9PSA0MDQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX3Rocm93KCJUQUpBWC5vcGVuKCciK1hNTEh0dHAudXJsKyInKSAtIDQwNCBOb3QgRm91bmQiKTsKICAgICAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3ZhciBoZWFkZXJzID0gWE1MSHR0cFJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgICAgICAgICAgICAvL2FsZXJ0KGhlYWRlcnMpOwogICAgICAgICAgICAgICAgLy9kdW1wKDMpOwogICAgICAgICAgICAgICAgLy9hbGVydCh1cmwpOwogICAgICAgICAgICAgICAgLy9hbGVydChodG1sKTsKICAgICAgICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJ0FKQVggRXJyb3I6JykgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfdGhyb3coaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW1wbGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gdHJpbShodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkKHVybCwgaHRtbCwgbmV3IERhdGUoKS5nZXRUaW1lKCktdGltZVN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNEZXZlbG9wZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3coJ1RBSkFYOjpvcGVuKCk6IG5vIHNlcnZlciByZXNwb25zZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGVzdHJveVhNTEh0dHBSZXF1ZXN0KFhNTEh0dHAuaWQpOwogICAgICAgICAgICB0aGlzLmVuYWJsZUVsZW1lbnRzKGxpbmtJbmZvWyJwYXJhbXMiXSk7CiAgICAgICAgfQogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICAvL2FsZXJ0KDEpOwogICAgICAgIC8vdGhpcy5vbkVycm9yKHVybCwgaHRtbCwgbmV3IERhdGUoKS5nZXRUaW1lKCktdGltZVN0YXJ0KTsKICAgICAgICAvL2FsZXJ0KHVybCk7CiAgICAgICAgX3Rocm93KGUpOwogICAgICAgIHRoaXMuZW5hYmxlRWxlbWVudHMobGlua0luZm9bInBhcmFtcyJdKTsKICAgIH0KICAgIAogICAgaWYgKHR5cGVvZihhc3luYykgPT0gInN0cmluZyIgJiYgYXN5bmMgfHwgdHlwZW9mKGFzeW5jKSA9PSAiZnVuY3Rpb24iKQogICAgewogICAgICAgIHJldHVybihYTUxIdHRwLmlkKTsKICAgIH0KICAgIGVsc2UgICAgCiAgICAgICAgcmV0dXJuKGh0bWwpOwp9OwoKVEFKQVgucHJvdG90eXBlLm9wZW5JbkJhY2tncm91bmQgPSBmdW5jdGlvbih1cmwsIGZ1bmN0aW9uTmFtZSkKewogICAgdXJsID0gdGhpcy5maXhVcmwodXJsKTsKICAgIAogICAgaWYgKHR5cGVvZihmdW5jdGlvbk5hbWUpID09ICJ1bmRlZmluZWQiKQogICAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uKCl7fTsKCiAgICByZXR1cm4odGhpcy5vcGVuKHVybCwgZnVuY3Rpb25OYW1lKSk7CgogICAgLyoKICAgIHZhciBYTUxIdHRwUmVxdWVzdCA9ICAod2luZG93LlhNTEh0dHBSZXF1ZXN0ID8gbmV3IFhNTEh0dHBSZXF1ZXN0KCkgOiBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKSk7ICAgIAoKICAgIFhNTEh0dHBSZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7ICAvLyBkdWUgdG8gSUUgbXVzdCBiZSBiZWZvcmUgb25yZWFkeXN0YXRlY2hhbmdlCiAgICBYTUxIdHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIAogICAgewogICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdC5yZWFkeVN0YXRlID09IDQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0ID0gWE1MSHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAvL2FsZXJ0KHVybCk7CiAgICAgICAgICAgIC8vYWxlcnQocmV0KTsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2luZG93W2Z1bmN0aW9uTmFtZV0ocmV0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvL1hNTEh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsgCiAgICBYTUxIdHRwUmVxdWVzdC5zZW5kKG51bGwpOwogICAgKi8KfTsKClRBSkFYLnByb3RvdHlwZS5nZXRXZWJDb250ZW50ID0gZnVuY3Rpb24obGF5b3V0TmFtZSwgcGFyYW1zLCBhc3luYykKewogICAgaWYgKHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IHt9OwogICAgICAgIAogICAgcGFyYW1zWyJzdHlsZSJdID0gImRlZmF1bHQiOwogICAgCiAgICByZXR1cm4odGhpcy5nZXRDb250ZW50KGxheW91dE5hbWUsIHBhcmFtcywgYXN5bmMpKTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRDb250ZW50ID0gZnVuY3Rpb24odGFibGVOYW1lLCBwYXJhbXMsIGFzeW5jKQp7CiAgICB2YXIgdXJsID0gUFJPSkVDVFVSTCtBSkFYRklMRU5BTUU7CiAgICAKICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKICAgICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0KCk7CgogICAgcGFyYW1zWyd0YWJsZU5hbWUnXSA9IHRhYmxlTmFtZTsKICAgIHBhcmFtc1snYWpheFZpZXdUeXBlJ10gPSAidnRUYWJsZSI7CiAgICBwYXJhbXNbJ0FETUlOJ10gPSBBRE1JTjsKICAgIHBhcmFtc1sncmFuZCddID0gdGltZSgpOwogICAgCiAgICBpZiAodHlwZW9mKHBhcmFtc1snZnVuY3Rpb25OYW1lJ10pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtc1snZnVuY3Rpb25OYW1lJ10gPSAiZ2V0Q29udGVudCI7CiAgICAgICAgCiAgICBwYXJhbXNbJ3JldHVyblR5cGUnXSA9ICJydFZhbHVlIjsKICAgIGlmIChzdHlsZSAmJiB0eXBlb2YocGFyYW1zWydzdHlsZSddKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbJ3N0eWxlJ10gPSBzdHlsZTsKICAgIGlmIChsYW5ndWFnZSAmJiB0eXBlb2YocGFyYW1zWydsYW5ndWFnZSddKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbJ2xhbmd1YWdlJ10gPSBsYW5ndWFnZTsKICAgIGlmIChzaWQpCiAgICAgICAgcGFyYW1zWydzaWQnXSA9IHNpZDsKCiAgICB1cmwgPSB1cmwrIj8iK2dldFBhcmFtc0FzTGluayhwYXJhbXMpOwogICAgdmFyIGNvbnRlbnQgPSB0aGlzLm9wZW4odXJsLCBhc3luYyk7CiAgICByZXR1cm4oY29udGVudCk7Cn07CgpUQUpBWC5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKHBhcmFtcywgYXN5bmMpCnsKICAgIHZhciB1cmwgPSBQUk9KRUNUVVJMK0FKQVhGSUxFTkFNRTsKICAgIAogICAgaWYgKHBhcmFtcyA9PSBudWxsKQogICAgICAgIHBhcmFtcyA9IG5ldyBPYmplY3QoKTsKCiAgICBpZiAoc2lkKQogICAgICAgIHBhcmFtc1snc2lkJ10gPSBzaWQ7CiAgICBpZiAoc3R5bGUgJiYgdHlwZW9mKHBhcmFtc1snc3R5bGUnXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgcGFyYW1zWydzdHlsZSddID0gc3R5bGU7CiAgICBpZiAodHlwZW9mKEFETUlOKSAhPSAidW5kZWZpbmVkIiAmJiBBRE1JTiAmJiB0eXBlb2YocGFyYW1zWydBRE1JTiddKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbJ0FETUlOJ10gPSBBRE1JTjsKICAgIGlmIChsYW5ndWFnZSAmJiB0eXBlb2YocGFyYW1zWydsYW5ndWFnZSddKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbJ2xhbmd1YWdlJ10gPSBsYW5ndWFnZTsKCiAgICBwYXJhbXNbJ3JhbmQnXSA9IHRpbWUoKTsKICAgIC8vZHVtcChwYXJhbXMpOwogICAgLy9hbGVydChnZXRQYXJhbXNBc0xpbmsocGFyYW1zKSk7CgogICAgLy8gYXZvaWQgZmlyZXdhbGwgdG8gc3RvcCB0aGUgcmVxdWVzdAogICAgLy9kdW1wKHBhcmFtcyk7CiAgICBmb3IgKHZhciBpIGluIHBhcmFtcykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHBhcmFtc1tpXSkgPT0gInN0cmluZyIgJiYgcGFyYW1zW2ldLmluZGV4T2YoIjwiKSAhPSAtMSAmJiBwYXJhbXNbaV0uaW5kZXhPZigiPiIpICE9IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcGFyYW1zW2ldID0gImJhc2U2NDoiK2Jhc2U2NF9lbmNvZGUocGFyYW1zW2ldKTsKICAgICAgICB9CiAgICB9CiAgICAvL2R1bXAocGFyYW1zKTsKICAgIC8vZHVtcChnZXRQYXJhbXNBc0xpbmsocGFyYW1zKSk7CiAgICB1cmwgPSB1cmwrIj8iK2dldFBhcmFtc0FzTGluayhwYXJhbXMpOwogICAgLy93aW5kb3cub3Blbih1cmwpOwogICAgLy9kdW1wKHVybCk7CiAgICAvL2FsZXJ0KHVybCk7CiAgICAvL3dpbmRvdy5vcGVuKHVybCk7CiAgICB2YXIgY29udGVudCA9IHRoaXMub3Blbih1cmwsIGFzeW5jKTsKICAgIAogICAgcmV0dXJuKGNvbnRlbnQpOwp9OwoKVEFKQVgucHJvdG90eXBlLmdldFdlYkxheW91dCA9IGZ1bmN0aW9uKGxheW91dE5hbWUsIHBhcmFtcywgYXN5bmMpCnsKICAgIGlmICh0eXBlb2YocGFyYW1zKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXMgPSB7fTsKICAgICAgICAKICAgIHBhcmFtc1sic3R5bGUiXSA9ICJkZWZhdWx0IjsKICAgIAogICAgcmV0dXJuKHRoaXMuZ2V0TGF5b3V0KGxheW91dE5hbWUsIHBhcmFtcywgYXN5bmMpKTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRMYXlvdXQgPSBmdW5jdGlvbihsYXlvdXROYW1lLCBwYXJhbXMsIGFzeW5jKQp7CiAgICByZXR1cm4odGhpcy5nZXRMYXlvdXRDb250ZW50KGxheW91dE5hbWUsIHBhcmFtcywgYXN5bmMpKTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRMYXlvdXRDb250ZW50ID0gZnVuY3Rpb24obGF5b3V0TmFtZSwgcGFyYW1zLCBhc3luYykKewogICAgdmFyIHVybCA9IFBST0pFQ1RVUkwrQUpBWEZJTEVOQU1FOwoKICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKICAgICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0KCk7CiAgICAKICAgIHBhcmFtc1snYWpheFZpZXdUeXBlJ10gPSAidnRMYXlvdXQiOwogICAgcGFyYW1zWydsYXlvdXROYW1lJ10gPSBsYXlvdXROYW1lOwogICAgaWYgKHN0eWxlICYmIHR5cGVvZihwYXJhbXNbJ3N0eWxlJ10pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtc1snc3R5bGUnXSA9IHN0eWxlOwogICAgaWYgKGxhbmd1YWdlICYmIHR5cGVvZihwYXJhbXNbJ2xhbmd1YWdlJ10pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtc1snbGFuZ3VhZ2UnXSA9IGxhbmd1YWdlOwogICAgaWYgKCFwYXJhbXNbJ3JldHVyblR5cGUnXSkKICAgICAgICBwYXJhbXNbJ3JldHVyblR5cGUnXSA9ICJydEhUTUwiOwogICAgaWYgKHNpZCkKICAgICAgICBwYXJhbXNbJ3NpZCddID0gc2lkOwogICAgICAgICAgICAKICAgIHBhcmFtc1sncmFuZCddID0gdGltZSgpOwogICAgLy9kdW1wKHBhcmFtcyk7CiAgICB1cmwgPSB1cmwrIj8iK2dldFBhcmFtc0FzTGluayhwYXJhbXMpOwogICAgLy93aW5kb3cub3Blbih1cmwpOwogICAgLy9hbGVydCh1cmwpOwogICAgCiAgICByZXR1cm4odGhpcy5vcGVuKHVybCwgYXN5bmMpKTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRPYmplY3RNZXRob2QgPSBmdW5jdGlvbihvYmplY3ROYW1lLCBtZXRob2ROYW1lLCBwYXJhbXMsIGFzeW5jKQp7CiAgICB2YXIgdXJsID0gUFJPSkVDVFVSTCtBSkFYRklMRU5BTUU7CgogICAgaWYgKHR5cGVvZihhc3luYykgPT0gInVuZGVmaW5lZCIpCiAgICB7CiAgICAgICAgdmFyIGFzeW5jRnVuYyA9IGZhbHNlOyAgICAgICAgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIGFzeW5jRnVuYyA9IGZ1bmN0aW9uKHJlc3VsdCl7CiAgICAgICAgICAgIGlmIChpc0pTT04ocmVzdWx0KSkKICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04uZGVjb2RlKHJlc3VsdCk7CiAgICAgICAgICAgIGFzeW5jKHJlc3VsdCk7CiAgICAgICAgfTsKICAgIH0KICAgIAogICAgaWYgKHBhcmFtcyA9PSBudWxsIHx8IHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IG5ldyBPYmplY3QoKTsKICAgIGVsc2UgaWYgKGlzU2ltcGxlQXJyYXkocGFyYW1zKSkKICAgICAgICBwYXJhbXMgPSB7J21ldGhvZFBhcmFtcyc6IHBhcmFtc307CiAgICAKICAgIHBhcmFtc1snYWpheFZpZXdUeXBlJ10gPSAidnRPYmplY3QiOwogICAgcGFyYW1zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lOwogICAgcGFyYW1zWydtZXRob2ROYW1lJ10gPSBtZXRob2ROYW1lOwogICAgaWYgKHN0eWxlICYmIHR5cGVvZihwYXJhbXNbJ3N0eWxlJ10pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtc1snc3R5bGUnXSA9IHN0eWxlOwogICAgaWYgKGxhbmd1YWdlICYmIHR5cGVvZihwYXJhbXNbJ2xhbmd1YWdlJ10pID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtc1snbGFuZ3VhZ2UnXSA9IGxhbmd1YWdlOwogICAgaWYgKCFwYXJhbXNbJ3JldHVyblR5cGUnXSkKICAgICAgICBwYXJhbXNbJ3JldHVyblR5cGUnXSA9ICJydFJldHVyblZhbHVlIjsKICAgIGlmIChzaWQpCiAgICAgICAgcGFyYW1zWydzaWQnXSA9IHNpZDsKICAgICAgICAKICAgIHBhcmFtc1sncmFuZCddID0gdGltZSgpOwoKICAgIC8vZHVtcChwYXJhbXMpOwogICAgdXJsID0gdXJsKyI/IitnZXRQYXJhbXNBc0xpbmsocGFyYW1zKTsKICAgIC8vZHVtcCh1cmwpOwogICAgLy9hbGVydCh1cmwpOwogICAgCiAgICB2YXIgcmV0ID0gdGhpcy5vcGVuKHVybCwgYXN5bmNGdW5jKTsKICAgIAogICAgLy8gbm90IGFzeW5jCiAgICBpZiAoaXNKU09OKHJldCkpCiAgICAgICAgcmV0ID0gSlNPTi5kZWNvZGUocmV0KTsKICAgIAogICAgcmV0dXJuKHJldCk7Cn0KClRBSkFYLnByb3RvdHlwZS5nZXRSZWNvcmRzID0gZnVuY3Rpb24odGFibGVOYW1lLCBwYXJhbXMsIGFzeW5jRnVuY3Rpb24pCnsKICAgIHZhciB1cmwgPSBQUk9KRUNUVVJMK0FKQVhGSUxFTkFNRTsKCiAgICBpZiAodHlwZW9mKGFzeW5jKSA9PSAidW5kZWZpbmVkIikKICAgIHsKICAgICAgICB2YXIgYXN5bmNGdW5jID0gZmFsc2U7ICAgICAgICAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgYXN5bmNGdW5jID0gZnVuY3Rpb24ocmVzdWx0KXsKICAgICAgICAgICAgaWYgKGlzSlNPTihyZXN1bHQpKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5kZWNvZGUocmVzdWx0KTsKICAgICAgICAgICAgYXN5bmMocmVzdWx0KTsKICAgICAgICB9OwogICAgfQogICAgCiAgICBpZiAocGFyYW1zID09IG51bGwpCiAgICAgICAgcGFyYW1zID0gbmV3IE9iamVjdCgpOwogICAgCiAgICBwYXJhbXNbJ2FqYXhWaWV3VHlwZSddID0gInZ0VGFibGUiOwogICAgcGFyYW1zWyd0YWJsZU5hbWUnXSA9IHRhYmxlTmFtZTsKICAgIGlmIChzdHlsZSAmJiB0eXBlb2YocGFyYW1zWydzdHlsZSddKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbJ3N0eWxlJ10gPSBzdHlsZTsKICAgIGlmIChsYW5ndWFnZSAmJiB0eXBlb2YocGFyYW1zWydsYW5ndWFnZSddKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBwYXJhbXNbJ2xhbmd1YWdlJ10gPSBsYW5ndWFnZTsKICAgIGlmICghcGFyYW1zWydyZXR1cm5UeXBlJ10pCiAgICAgICAgcGFyYW1zWydyZXR1cm5UeXBlJ10gPSAicnRSZXR1cm5WYWx1ZSI7CiAgICBpZiAoc2lkKQogICAgICAgIHBhcmFtc1snc2lkJ10gPSBzaWQ7CiAgICAgICAgCiAgICBwYXJhbXNbJ3JhbmQnXSA9IHRpbWUoKTsKCiAgICB1cmwgPSB1cmwrIj8iK2dldFBhcmFtc0FzTGluayhwYXJhbXMpOwogICAgLy9hbGVydCh1cmwpOwogICAgCiAgICB2YXIgcmV0ID0gdGhpcy5vcGVuKHVybCwgYXN5bmNGdW5jKTsKICAgIAogICAgLy8gbm90IGFzeW5jCiAgICAvL2R1bXAocmV0KTsKICAgIC8vZHVtcChpc0pTT04ocmV0KSk7CiAgICBpZiAoaXNKU09OKHJldCkpCiAgICAgICAgcmV0ID0gSlNPTi5kZWNvZGUocmV0KTsKICAgIC8vZHVtcChyZXQpOwogICAgCiAgICByZXR1cm4ocmV0KTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRSZWNvcmQgPSBmdW5jdGlvbih0YWJsZU5hbWUsIHBhcmFtcywgYXN5bmNGdW5jdGlvbikKewogICAgdmFyIHJlY29yZHMgPSB0aGlzLmdldFJlY29yZHModGFibGVOYW1lLCBwYXJhbXMsIGZ1bmN0aW9uKHJlY29yZHMpewogICAgICAgIHZhciByZWNvcmQgPSByZWNvcmRzWzBdOwogICAgICAgIGFzeW5jRnVuY3Rpb24ocmVjb3JkKTsKICAgIH0pOwoKICAgIHZhciByZWNvcmQgPSByZWNvcmRzWzBdOwogICAgCiAgICByZXR1cm4ocmVjb3JkKTsKfTsKClRBSkFYLnByb3RvdHlwZS5nZXRSZWNvcmRDb3VudCA9IGZ1bmN0aW9uKHRhYmxlTmFtZSwgcGFyYW1zLCBhc3luY0Z1bmN0aW9uKQp7CiAgICBwYXJhbXMgPSBjbG9uZShwYXJhbXMpOwogICAgCiAgICBwYXJhbXNbImZpZWxkcyJdID0gIkNPVU5UKGlkKSBBUyBfX2NudCI7CgogICAgdmFyIHJlY29yZCA9IHRoaXMuZ2V0UmVjb3JkKHRhYmxlTmFtZSwgcGFyYW1zLCBmdW5jdGlvbihyZWNvcmQpewogICAgICAgIHZhciByZWNvcmRDb3VudCA9IHJlY29yZFsiX19jbnQiXTsKICAgICAgICBhc3luY0Z1bmN0aW9uKHJlY29yZENvdW50KQogICAgfSk7CiAgICAKICAgIHZhciByZWNvcmRDb3VudCA9IHJlY29yZFsiX19jbnQiXTsKCiAgICByZXR1cm4ocmVjb3JkQ291bnQpOwp9OwoKVEFKQVgucHJvdG90eXBlLmluc2VydFJlY29yZCA9IGZ1bmN0aW9uKHRhYmxlTmFtZSwgcmVjb3JkLCBhc3luY0Z1bmN0aW9uKQp7CiAgICByZXR1cm4odGhpcy5fY2hhbmdlUmVjb3JkKHRhYmxlTmFtZSwgcmVjb3JkLCBhc3luY0Z1bmN0aW9uLCAiYXRJbnNlcnQiKSk7Cn0KVEFKQVgucHJvdG90eXBlLnVwZGF0ZVJlY29yZCA9IGZ1bmN0aW9uKHRhYmxlTmFtZSwgcmVjb3JkLCBhc3luY0Z1bmN0aW9uKQp7CiAgICByZXR1cm4odGhpcy5fY2hhbmdlUmVjb3JkKHRhYmxlTmFtZSwgcmVjb3JkLCBhc3luY0Z1bmN0aW9uLCAiYXRVcGRhdGUiKSk7Cn0KVEFKQVgucHJvdG90eXBlLmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHRhYmxlTmFtZSwgcmVjb3JkLCBhc3luY0Z1bmN0aW9uKQp7CiAgICByZXR1cm4odGhpcy5fY2hhbmdlUmVjb3JkKHRhYmxlTmFtZSwgcmVjb3JkLCBhc3luY0Z1bmN0aW9uLCAiYXREZWxldGUiKSk7Cn0KVEFKQVgucHJvdG90eXBlLl9jaGFuZ2VSZWNvcmQgPSBmdW5jdGlvbih0YWJsZU5hbWUsIHJlY29yZCwgYXN5bmNGdW5jdGlvbiwgYWN0aW9uVHlwZSkKewogICAgdmFyIHVybCA9IFBST0pFQ1RVUkwrQUpBWEZJTEVOQU1FOwoKICAgIGlmICh0eXBlb2YoYXN5bmMpID09ICJ1bmRlZmluZWQiKQogICAgewogICAgICAgIHZhciBhc3luY0Z1bmMgPSBmYWxzZTsgICAgICAgIAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBhc3luY0Z1bmMgPSBmdW5jdGlvbihyZXN1bHQpewogICAgICAgICAgICBpZiAoaXNKU09OKHJlc3VsdCkpCiAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLmRlY29kZShyZXN1bHQpOwogICAgICAgICAgICBhc3luYyhyZXN1bHQpOwogICAgICAgIH07CiAgICB9CiAgICAKICAgIGlmIChyZWNvcmQgPT0gbnVsbCkKICAgIHsKICAgICAgICBfdGhyb3coJ1RBSkFYOjpfY2hhbmdlUmVjb3JkIC0gbm8gcmVjb3JkJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICB2YXIgcGFyYW1zID0ge307CiAgICBwYXJhbXNbJ3JlY29yZCddID0gcmVjb3JkOwogICAgcGFyYW1zWydhamF4Vmlld1R5cGUnXSA9ICJ2dFRhYmxlIjsKICAgIHBhcmFtc1sndGFibGVOYW1lJ10gPSB0YWJsZU5hbWU7CiAgICBwYXJhbXNbJ2FjdGlvblR5cGUnXSA9IGFjdGlvblR5cGU7CiAgICBpZiAoc3R5bGUgJiYgdHlwZW9mKHBhcmFtc1snc3R5bGUnXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgcGFyYW1zWydzdHlsZSddID0gc3R5bGU7CiAgICBpZiAobGFuZ3VhZ2UgJiYgdHlwZW9mKHBhcmFtc1snbGFuZ3VhZ2UnXSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgcGFyYW1zWydsYW5ndWFnZSddID0gbGFuZ3VhZ2U7CiAgICBpZiAoIXBhcmFtc1sncmV0dXJuVHlwZSddKQogICAgICAgIHBhcmFtc1sncmV0dXJuVHlwZSddID0gInJ0UmV0dXJuVmFsdWUiOwogICAgaWYgKHNpZCkKICAgICAgICBwYXJhbXNbJ3NpZCddID0gc2lkOwogICAgICAgIAogICAgcGFyYW1zWydyYW5kJ10gPSB0aW1lKCk7CgogICAgdXJsID0gdXJsKyI/IitnZXRQYXJhbXNBc0xpbmsocGFyYW1zKTsKICAgIC8vYWxlcnQodXJsKTsKICAgIAogICAgdmFyIHJldCA9IHRoaXMub3Blbih1cmwsIGFzeW5jRnVuYyk7CiAgICAKICAgIC8vIG5vdCBhc3luYwogICAgLy9kdW1wKHJldCk7CiAgICAvL2R1bXAoaXNKU09OKHJldCkpOwogICAgaWYgKGlzSlNPTihyZXQpKQogICAgICAgIHJldCA9IEpTT04uZGVjb2RlKHJldCk7CiAgICAvL2R1bXAocmV0KTsKICAgIAogICAgcmV0dXJuKHJldCk7Cn0KCgovLyBuZXcgbWV0aG9kIHVzaW5nIEZvcm1EYXRhIC0gcHJldmlvdXMgdmVyc2lvbiBoYWQgcHJvYmxlbXMgc2VuZGluZyBiaWcgZmlsZXMgPjEyOE1CIC8gYnV0IElFMTArIG9ubHkKVEFKQVgucHJvdG90eXBlLnN1Ym1pdEZvcm0gPSBmdW5jdGlvbihmb3JtLCBvbkZpbmlzaCwgb25Qcm9ncmVzcykKewogICAgLy8gY29yZSBtZXRob2QgLSBpZiB5b3Ugd2FudCBzaW1wbHkgc3VibWl0IGZvcm0gdXNpbmcgQUpBWCwgYWRkIGFqYXg9J2NvbnRhaW5lcicgYXR0cmlidXRlIG9yIGNhbGwgRm9ybS5hamF4U3VibWl0KGZvcm0sIGNvbnRhaW5lcikKICAgIAogICAgaWYgKHR5cGVvZihvblByb2dyZXNzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICBvblByb2dyZXNzID0gZnVuY3Rpb24oKXt9OwogICAgCiAgICBmb3JtID0gZ2V0RWxlbWVudChmb3JtKTsKICAgIAogICAgaWYgKHR5cGVvZihvbkZpbmlzaCkgIT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mKG9uRmluaXNoKSAhPSAiZnVuY3Rpb24iKQogICAgewogICAgICAgIHZhciBfZWxlbSA9IGdldEVsZW1lbnQob25GaW5pc2gpOwogICAgICAgIG9uRmluaXNoID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICBzZXRIdG1sKF9lbGVtLCBodG1sKTsKICAgICAgICB9OwogICAgfQogICAgCiAgICBpZiAoIWZvcm0uYWN0aW9uKSAKICAgIHsgCiAgICAgICAgcmV0dXJuOyAKICAgIH0KICAgIAogICAgdmFyIG9SZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgIGZvcm0ub1JlcSA9IG9SZXE7CiAgICBvUmVxLm9ubG9hZCA9IGZ1bmN0aW9uKGUpewogICAgICAgIC8vZHVtcChvUmVxLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgb25GaW5pc2gob1JlcS5yZXNwb25zZVRleHQpOwogICAgfTsKICAgIG9SZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihlKXsgCiAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkgCiAgICAgICAgewogICAgICAgICAgICB2YXIgcGVyY2VudENvbXBsZXRlID0gKGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDA7CiAgICAgICAgICAgIG9uUHJvZ3Jlc3MoTWF0aC5jZWlsKHBlcmNlbnRDb21wbGV0ZSkpOwogICAgICAgICAgICAvL2R1bXAocGVyY2VudENvbXBsZXRlKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmIChmb3JtLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09PSAicG9zdCIpIAogICAgewogICAgICAgIG9SZXEub3BlbigicG9zdCIsIGZvcm0uYWN0aW9uKTsKICAgICAgICBvUmVxLnNlbmQobmV3IEZvcm1EYXRhKGZvcm0pKTsKICAgIH0gCiAgICBlbHNlIAogICAgewogICAgICAgIHZhciBvRmllbGQsIHNGaWVsZFR5cGUsIG5GaWxlLCBzU2VhcmNoID0gIiI7CiAgICAgICAgZm9yICh2YXIgbkl0ZW0gPSAwOyBuSXRlbSA8IGZvcm0uZWxlbWVudHMubGVuZ3RoOyBuSXRlbSsrKSAKICAgICAgICB7CiAgICAgICAgICAgIG9GaWVsZCA9IGZvcm0uZWxlbWVudHNbbkl0ZW1dOwogICAgICAgICAgICBpZiAoIW9GaWVsZC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBjb250aW51ZTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc0ZpZWxkVHlwZSA9IG9GaWVsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiSU5QVVQiID8KICAgICAgICAgICAgICAgIG9GaWVsZC5nZXRBdHRyaWJ1dGUoInR5cGUiKS50b1VwcGVyQ2FzZSgpIDogIlRFWFQiOwogICAgICAgICAgICBpZiAoc0ZpZWxkVHlwZSA9PT0gIkZJTEUiKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChuRmlsZSA9IDA7IG5GaWxlIDwgb0ZpZWxkLmZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBzU2VhcmNoICs9ICImIiArIGVzY2FwZShvRmllbGQubmFtZSkgKyAiPSIgKyBlc2NhcGUob0ZpZWxkLmZpbGVzW25GaWxlKytdLm5hbWUpKTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSBpZiAoKHNGaWVsZFR5cGUgIT09ICJSQURJTyIgJiYgc0ZpZWxkVHlwZSAhPT0gIkNIRUNLQk9YIikgfHwgb0ZpZWxkLmNoZWNrZWQpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzU2VhcmNoICs9ICImIiArIGVzY2FwZShvRmllbGQubmFtZSkgKyAiPSIgKyBlc2NhcGUob0ZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvUmVxLm9wZW4oImdldCIsIGZvcm0uYWN0aW9uLnJlcGxhY2UoLyg/Olw/LiopPyQvLCBzU2VhcmNoLnJlcGxhY2UoL14mLywgIj8iKSksIHRydWUpOwogICAgICAgIG9SZXEuc2VuZChudWxsKTsKICAgIH0KICAgIAogICAgcmV0dXJuKHRydWUpOwp9CgpUQUpBWC5wcm90b3R5cGUuYWJvcnRTdWJtaXRGb3JtID0gZnVuY3Rpb24oZm9ybSkKewogICAgaWYgKGZvcm0ub1JlcSkKICAgIHsKICAgICAgICBmb3JtLm9SZXEuYWJvcnQoKTsKICAgIH0KfQoKVEFKQVgucHJvdG90eXBlLmFkZERpc2FibGVkRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW0sIHBhcmFtcykKewogICAgaWYgKHR5cGVvZihwYXJhbXMpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHBhcmFtcyA9IHt9OwogICAgCiAgICAvL2R1bXAoIiEhISEhISEhIik7CiAgICAvL2R1bXAoZWxlbSk7CiAgICB0aGlzLmRpc2FibGVkRWxlbWVudHMucHVzaCh7ImVsZW0iOmVsZW0sICJwYXJhbXMiOnBhcmFtcywgImNvdW50IjowfSk7CiAgICAKICAgIC8vZHVtcCh0aGlzLmRpc2FibGVkRWxlbWVudHMpOwp9CgpUQUpBWC5wcm90b3R5cGUuZGlzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24ocGFyYW1zKQp7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLmRpc2FibGVkRWxlbWVudHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBlbGVtID0gdGhpcy5kaXNhYmxlZEVsZW1lbnRzW2ldWyJlbGVtIl07CiAgICAgICAgdmFyIGVsZW1QID0gdGhpcy5kaXNhYmxlZEVsZW1lbnRzW2ldWyJwYXJhbXMiXTsKCiAgICAgICAgdmFyIGNvbmRpdGlvbkFjdGl2ZSA9IHRydWU7CiAgICAgICAgaWYgKHR5cGVvZihlbGVtUCkgPT0gImZ1bmN0aW9uIikKICAgICAgICB7CiAgICAgICAgICAgIGNvbmRpdGlvbkFjdGl2ZSA9IGNvbmRpdGlvbkFjdGl2ZSAmJiBlbGVtUChwYXJhbXMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICBmb3IgKHZhciBpaSBpbiBwYXJhbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaWldLmluZGV4T2YoIioiKSA+IC0xKQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbkFjdGl2ZSA9IGNvbmRpdGlvbkFjdGl2ZSAmJiAKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmRpdGlvbkFjdGl2ZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiLS0tLS0tLS0gZGlzYWJsZSIpOwogICAgICAgICAgICAvL2R1bXAocGFyYW1zKTsKICAgICAgICAgICAgLy9kdW1wKGVsZW0pOwogICAgICAgICAgICB0aGlzLmRpc2FibGVkRWxlbWVudHNbaV1bImNvdW50Il0rKzsKCiAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgICAgIH0KICAgIH0KfQoKVEFKQVgucHJvdG90eXBlLmVuYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24ocGFyYW1zKQp7CiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCB0aGlzLmRpc2FibGVkRWxlbWVudHMubGVuZ3RoIDsgaSsrKQogICAgewogICAgICAgIHZhciBlbGVtID0gdGhpcy5kaXNhYmxlZEVsZW1lbnRzW2ldWyJlbGVtIl07CiAgICAgICAgdmFyIGVsZW1QID0gdGhpcy5kaXNhYmxlZEVsZW1lbnRzW2ldWyJwYXJhbXMiXTsKCiAgICAgICAgdmFyIGNvbmRpdGlvbkFjdGl2ZSA9IHRydWU7CiAgICAgICAgaWYgKHR5cGVvZihlbGVtUCkgPT0gImZ1bmN0aW9uIikKICAgICAgICB7CiAgICAgICAgICAgIGNvbmRpdGlvbkFjdGl2ZSA9IGNvbmRpdGlvbkFjdGl2ZSAmJiBlbGVtUChwYXJhbXMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICBmb3IgKHZhciBpaSBpbiBwYXJhbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaWldLmluZGV4T2YoIioiKSA+IC0xKQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbkFjdGl2ZSA9IGNvbmRpdGlvbkFjdGl2ZSAmJiAKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmRpdGlvbkFjdGl2ZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vZHVtcCgiPT09PT09PT0gZW5hYmxlIik7CiAgICAgICAgICAgIC8vZHVtcChwYXJhbXMpOwogICAgICAgICAgICAvL2R1bXAoZWxlbSk7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRFbGVtZW50c1tpXVsiY291bnQiXS0tOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWRFbGVtZW50c1tpXVsiY291bnQiXSA8PSAwKQogICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7CiAgICAgICAgfQogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmluYXJ5IGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qClRBSkFYLnByb3RvdHlwZS5zdWJtaXRGb3JtID0gZnVuY3Rpb24oZm9ybSwgb25GaW5pc2gsIG9uUHJvZ3Jlc3MpCnsKICAgIGlmICh3aW5kb3cuRmlsZVJlYWRlcikKICAgIHsKICAgICAgICAvL2R1bXBGdW5jdGlvbkNhbGwoKTsgZHVtcCgiLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgICAgIHZhciBBSkFYU3VibWl0ID0gbmV3IFRBSkFYU3VibWl0OwogICAgICAgIEFKQVhTdWJtaXQub25GaW5pc2ggPSBvbkZpbmlzaDsKICAgICAgICBBSkFYU3VibWl0Lm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzOwogICAgICAgIEFKQVhTdWJtaXQuc3VibWl0KGZvcm0pOwoKICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuKGZhbHNlKTsKfQoKaWYgKCFYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUuc2VuZEFzQmluYXJ5KSAKewogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmRBc0JpbmFyeSA9IGZ1bmN0aW9uKHNEYXRhKSAKICAgIHsKICAgICAgICB2YXIgbkJ5dGVzID0gc0RhdGEubGVuZ3RoLCB1aThEYXRhID0gbmV3IFVpbnQ4QXJyYXkobkJ5dGVzKTsKICAgICAgICBmb3IgKHZhciBuSWR4ID0gMDsgbklkeCA8IG5CeXRlczsgbklkeCsrKSAKICAgICAgICB7CiAgICAgICAgICAgIHVpOERhdGFbbklkeF0gPSBzRGF0YS5jaGFyQ29kZUF0KG5JZHgpICYgMHhmZjsKICAgICAgICB9CiAgICAgICAgLy8gc2VuZCBhcyBBcnJheUJ1ZmZlclZpZXcuLi4gCiAgICAgICAgdGhpcy5zZW5kKHVpOERhdGEpOwogICAgICAgIC8vIC4uLm9yIGFzIEFycmF5QnVmZmVyIChsZWdhY3kpLi4uOiB0aGlzLnNlbmQodWk4RGF0YS5idWZmZXIpOyAKICAgIH07Cn0KCmZ1bmN0aW9uIFRBSkFYU3VibWl0KCkKewp9CgpUQUpBWFN1Ym1pdC5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24oKSAKewogICAgLy8gdGhpcyEgaXMgYSBYTUxIdHRwUmVxdWVzdCBvYmplY3QKICAgIGlmICh0aGlzLkFKQVhTdWJtaXQub25GaW5pc2gpCiAgICAgICAgdGhpcy5BSkFYU3VibWl0Lm9uRmluaXNoKHRoaXMucmVzcG9uc2VUZXh0KTsKfSAgICAKClRBSkFYU3VibWl0LnByb3RvdHlwZS5vbkZpbmlzaCA9IGZ1bmN0aW9uKHJlc3VsdCkgCnsKICAgIC8vZHVtcChyZXN1bHQpOwp9ICAgIAoKVEFKQVhTdWJtaXQucHJvdG90eXBlLl9vblByb2dyZXNzID0gZnVuY3Rpb24oZSkgCnsKICAgIGUgPSBnZXRFdmVudChlKTsKICAgIHZhciBwZXJjZW50ID0gcGFyc2VJbnQoZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwKTsgICAgCgogICAgLy8gdGhpcyEgaXMgYSBYTUxIdHRwUmVxdWVzdC51cGxvYWQgb2JqZWN0CiAgICBpZiAodGhpcy5BSkFYU3VibWl0Lm9uUHJvZ3Jlc3MpCiAgICAgICAgdGhpcy5BSkFYU3VibWl0Lm9uUHJvZ3Jlc3MocGVyY2VudCwgZS5sb2FkZWQsIGUudG90YWwpOwp9ICAgIAoKVEFKQVhTdWJtaXQucHJvdG90eXBlLm9uUHJvZ3Jlc3MgPSBmdW5jdGlvbihwZXJjZW50LCBieXRlc0xvYWRlZCwgYnl0ZXNUb3RhbCkgCnsKICAgIC8vZHVtcChwZXJjZW50KTsKfSAgICAKClRBSkFYU3VibWl0LnByb3RvdHlwZS5zdWJtaXREYXRhID0gZnVuY3Rpb24ob0RhdGEpIAp7CiAgICBhbGVydChvRGF0YS5zZWdtZW50cy5sZW5ndGgpOwogICAgLy9hbGVydChvRGF0YS5zZWdtZW50cy5qb2luKCIiKSk7CiAgICAvLyB0aGUgQUpBWCByZXF1ZXN0Li4uIAogICAgdmFyIG9BamF4UmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICBvQWpheFJlcS5BSkFYU3VibWl0ID0gb0RhdGE7CiAgICBvQWpheFJlcS51cGxvYWQuQUpBWFN1Ym1pdCA9IG9EYXRhOwogICAgb0FqYXhSZXEuc3VibWl0dGVkRGF0YSA9IG9EYXRhOwogICAgb0FqYXhSZXEub25sb2FkID0gb0RhdGEuX29uRmluaXNoOwogICAgb0FqYXhSZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBvRGF0YS5fb25Qcm9ncmVzczsKICAgIC8vYWxlcnQob0RhdGEudGVjaG5pcXVlKTsKICAgIGlmIChvRGF0YS50ZWNobmlxdWUgPT09IDApIAogICAgewogICAgICAgIC8vIG1ldGhvZCBpcyBHRVQgCiAgICAgICAgb0FqYXhSZXEub3BlbigiZ2V0Iiwgb0RhdGEucmVjZWl2ZXIucmVwbGFjZSgvKD86XD8uKik/JC8sIG9EYXRhLnNlZ21lbnRzLmxlbmd0aCA+IDAgPyAiPyIgKyBvRGF0YS5zZWdtZW50cy5qb2luKCImIikgOiAiIiksIHRydWUpOwogICAgICAgIG9BamF4UmVxLnNlbmQobnVsbCk7CiAgICB9IAogICAgZWxzZSAKICAgIHsKICAgICAgICAvLyBtZXRob2QgaXMgUE9TVCAKICAgICAgICBvQWpheFJlcS5vcGVuKCJwb3N0Iiwgb0RhdGEucmVjZWl2ZXIsIHRydWUpOwogICAgICAgIGlmIChvRGF0YS50ZWNobmlxdWUgPT09IDMpIAogICAgICAgIHsKICAgICAgICAgICAgLy8gZW5jdHlwZSBpcyBtdWx0aXBhcnQvZm9ybS1kYXRhIAogICAgICAgICAgICB2YXIgc0JvdW5kYXJ5ID0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKyBEYXRlLm5vdygpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgb0FqYXhSZXEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgIm11bHRpcGFydFwvZm9ybS1kYXRhOyBib3VuZGFyeT0iICsgc0JvdW5kYXJ5KTsKICAgICAgICAgICAgLy9hbGVydCgxKTsKICAgICAgICAgICAgb0FqYXhSZXEuc2VuZEFzQmluYXJ5KCItLSIgKyBzQm91bmRhcnkgKyAiXHJcbiIgKyBvRGF0YS5zZWdtZW50cy5qb2luKCItLSIgKyBzQm91bmRhcnkgKyAiXHJcbiIpICsgIi0tIiArIHNCb3VuZGFyeSArICItLVxyXG4iKTsKICAgICAgICAgICAgLy9hbGVydCgyKTsKICAgICAgICB9IAogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICAvLyBlbmN0eXBlIGlzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvciB0ZXh0L3BsYWluIAogICAgICAgICAgICBvQWpheFJlcS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBvRGF0YS5jb250ZW50VHlwZSk7CiAgICAgICAgICAgIG9BamF4UmVxLnNlbmQob0RhdGEuc2VnbWVudHMuam9pbihvRGF0YS50ZWNobmlxdWUgPT09IDIgPyAiXHJcbiIgOiAiJiIpKTsKICAgICAgICB9CiAgICB9Cn0gICAgCgpUQUpBWFN1Ym1pdC5wcm90b3R5cGUucHJvY2Vzc1N0YXR1cyA9IGZ1bmN0aW9uKG9EYXRhKSAKewogICAgLy9kdW1wKCJzdGF0dXMiKTsKICAgIC8vZHVtcChvRGF0YS5zdGF0dXMpOwogICAgLy9hbGVydChvRGF0YS5zdGF0dXMpOwogICAgaWYgKG9EYXRhLnN0YXR1cyA+IDApIAogICAgeyAKICAgICAgICByZXR1cm47IAogICAgfQogICAgLy8gdGhlIGZvcm0gaXMgbm93IHRvdGFsbHkgc2VyaWFsaXplZCEgZG8gc29tZXRoaW5nIGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSBzZXJ2ZXIuLi4gCiAgICAvLyBkb1NvbWV0aGluZyhvRGF0YSk7IAogICAgLy8gY29uc29sZS5sb2coIkFKQVhTdWJtaXQgLSBUaGUgZm9ybSBpcyBub3cgc2VyaWFsaXplZC4gU3VibWl0dGluZy4uLiIpOyAKICAgIC8vb0RhdGEuc3VibWl0RGF0YShvRGF0YSk7CgogICAgdmFyIF9vRGF0YSA9IG9EYXRhOwogICAgY2FsbChmdW5jdGlvbigpe29EYXRhLnN1Ym1pdERhdGEob0RhdGEpO30sIHRydWUpOyAvLyB0byBub3QgYmxvY2sgbWFpbiB0aHJlYWQgZm9yIGJpZyBmaWxlcwp9ICAKClRBSkFYU3VibWl0LnByb3RvdHlwZS5wdXNoU2VnbWVudCA9IGZ1bmN0aW9uKG9GUkV2dCkgCnsKICAgIC8vIHRoaXMhIGlzIEZpbGVSZWFkZXIgb2JqZWN0IAogICAgCiAgICAvLyBJRQogICAgaWYgKHR5cGVvZihvRlJFdnQudGFyZ2V0LnJlc3VsdCkgPT0gIm9iamVjdCIgJiYgb0ZSRXZ0LnRhcmdldC5yZXN1bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikKICAgIHsKICAgICAgICB2YXIKICAgICAgICAgICAgYmluYXJ5U3RyaW5nID0gJycsCiAgICAgICAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkob0ZSRXZ0LnRhcmdldC5yZXN1bHQpLAogICAgICAgICAgICBsZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICAgICAgICAgIAogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIAogICAgICAgIHsKICAgICAgICAgICAgYmluYXJ5U3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pOwogICAgICAgIH0KICAgICAgICAvL2FsZXJ0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQxNkFycmF5KG9GUkV2dC50YXJnZXQucmVzdWx0KSkpOwogICAgICAgIHRoaXMub3duZXIuc2VnbWVudHNbdGhpcy5zZWdtZW50SWR4XSArPSBiaW5hcnlTdHJpbmcgKyAiXHJcbiI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdGhpcy5vd25lci5zZWdtZW50c1t0aGlzLnNlZ21lbnRJZHhdICs9IG9GUkV2dC50YXJnZXQucmVzdWx0ICsgIlxyXG4iOwogICAgfQogICAgdGhpcy5vd25lci5zdGF0dXMtLTsKICAgIHRoaXMub3duZXIucHJvY2Vzc1N0YXR1cyh0aGlzLm93bmVyKTsKfQoKVEFKQVhTdWJtaXQucHJvdG90eXBlLnBsYWluRXNjYXBlID0gZnVuY3Rpb24oc1RleHQpIAp7CiAgICAvLyBob3cgc2hvdWxkIEkgdHJlYXQgYSB0ZXh0L3BsYWluIGZvcm0gZW5jb2Rpbmc/IHdoYXQgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQ/IHRoaXMgaXMgd2hhdCBJIHN1cHBvc2UuLi46IAogICAgLy8gIjRcM1w3IC0gRWluc3RlaW4gc2FpZCBFPW1jMiIgLS0tLT4gIjRcXDNcXDdcIC1cIEVpbnN0ZWluXCBzYWlkXCBFXD1tYzIiIAogICAgcmV0dXJuIHNUZXh0LnJlcGxhY2UoL1tcc1w9XFxdL2csICJcXCQmIik7Cn0KClRBSkFYU3VibWl0LnByb3RvdHlwZS5zdWJtaXQgPSBmdW5jdGlvbihvVGFyZ2V0KSAKewogICAgdmFyIG5GaWxlLCBzRmllbGRUeXBlLCBvRmllbGQsIG9TZWdtUmVxLCBvRmlsZSwgYklzUG9zdCA9IG9UYXJnZXQubWV0aG9kLnRvTG93ZXJDYXNlKCkgPT09ICJwb3N0IjsKICAgIC8vIGNvbnNvbGUubG9nKCJBSkFYU3VibWl0IC0gU2VyaWFsaXppbmcgZm9ybS4uLiIpOyAKICAgIHRoaXMuY29udGVudFR5cGUgPSBiSXNQb3N0ICYmIG9UYXJnZXQuZW5jdHlwZSA/IG9UYXJnZXQuZW5jdHlwZSA6ICJhcHBsaWNhdGlvblwveC13d3ctZm9ybS11cmxlbmNvZGVkIjsKICAgIHRoaXMudGVjaG5pcXVlID0gYklzUG9zdCA/IHRoaXMuY29udGVudFR5cGUgPT09ICJtdWx0aXBhcnRcL2Zvcm0tZGF0YSIgPyAzIDogdGhpcy5jb250ZW50VHlwZSA9PT0gInRleHRcL3BsYWluIiA/IDIgOiAxIDogMDsKICAgIHRoaXMucmVjZWl2ZXIgPSBvVGFyZ2V0LmFjdGlvbjsKICAgIHRoaXMuc3RhdHVzID0gMDsKICAgIHRoaXMuc2VnbWVudHMgPSBbXTsKICAgIHZhciBmRmlsdGVyID0gdGhpcy50ZWNobmlxdWUgPT09IDIgPyB0aGlzLnBsYWluRXNjYXBlIDogZXNjYXBlOwogICAgLy92YXIgZkZpbHRlciA9IHRoaXMudGVjaG5pcXVlID09PSAyID8gdGhpcy5wbGFpbkVzY2FwZSA6IGVuY29kZVVSSUNvbXBvbmVudDsgLyogZHVlIHRvIFVURjgKICAgIAogICAgZm9yICh2YXIgbkl0ZW0gPSAwOyBuSXRlbSA8IG9UYXJnZXQuZWxlbWVudHMubGVuZ3RoOyBuSXRlbSsrKSAKICAgIHsKICAgICAgICBvRmllbGQgPSBvVGFyZ2V0LmVsZW1lbnRzW25JdGVtXTsKICAgICAgICBpZiAoIW9GaWVsZC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkgCiAgICAgICAgeyAKICAgICAgICAgICAgY29udGludWU7IAogICAgICAgIH0KICAgICAgICBzRmllbGRUeXBlID0gb0ZpZWxkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICJJTlBVVCIgPyBvRmllbGQuZ2V0QXR0cmlidXRlKCJ0eXBlIikudG9VcHBlckNhc2UoKSA6ICJURVhUIjsKICAgICAgICBpZiAoc0ZpZWxkVHlwZSA9PT0gIkZJTEUiICYmIG9GaWVsZC5maWxlcy5sZW5ndGggPiAwKSAKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnRlY2huaXF1ZSA9PT0gMykgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgaXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YQogICAgICAgICAgICAgICAgZm9yIChuRmlsZSA9IDA7IG5GaWxlIDwgb0ZpZWxkLmZpbGVzLmxlbmd0aDsgbkZpbGUrKykgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb0ZpbGUgPSBvRmllbGQuZmlsZXNbbkZpbGVdOwogICAgICAgICAgICAgICAgICAgIG9TZWdtUmVxID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICAvLyAoY3VzdG9tIHByb3BlcnRpZXM6KSAKICAgICAgICAgICAgICAgICAgICBvU2VnbVJlcS5zZWdtZW50SWR4ID0gdGhpcy5zZWdtZW50cy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgb1NlZ21SZXEub3duZXIgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIC8vIChlbmQgb2YgY3VzdG9tIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgb1NlZ21SZXEub25sb2FkID0gdGhpcy5wdXNoU2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KG9GaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudHMucHVzaCgiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIF91dGY4X2VuY29kZShvRmllbGQubmFtZSkgKyAiXCI7IGZpbGVuYW1lPVwiIisgX3V0ZjhfZW5jb2RlKG9GaWxlLm5hbWUpICsgIlwiXHJcbkNvbnRlbnQtVHlwZTogIiArIG9GaWxlLnR5cGUgKyAiXHJcblxyXG4iKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuc2VnbWVudHMucHVzaCgiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIG9GaWVsZC5uYW1lICsgIlwiOyBmaWxlbmFtZT1cIiIrIGVzY2FwZVRvTWltZShvRmlsZS5uYW1lLCAicXVvdGVkLXByaW50YWJsZSIsICJVVEYtOCIpICsgIlwiXHJcbkNvbnRlbnQtVHlwZTogIiArIG9GaWxlLnR5cGUgKyAiXHJcblxyXG4iKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuc2VnbWVudHMucHVzaCgiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIG9GaWVsZC5uYW1lICsgIlwiOyBmaWxlbmFtZT1cIiIrIG9GaWxlLm5hbWUgKyAiXCJcclxuQ29udGVudC1UeXBlOiAiICsgb0ZpbGUudHlwZSArIjsgY2hhcnNldD1VVEYtOCIrICJcclxuXHJcbiIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9TZWdtUmVxLnJlYWRBc0JpbmFyeVN0cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgb1NlZ21SZXEucmVhZEFzQmluYXJ5U3RyaW5nKG9GaWxlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvU2VnbVJlcS5yZWFkQXNBcnJheUJ1ZmZlcikgLy8gSUUKICAgICAgICAgICAgICAgICAgICAgICAgb1NlZ21SZXEucmVhZEFzQXJyYXlCdWZmZXIob0ZpbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBlbmN0eXBlIGlzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvciB0ZXh0L3BsYWluIG9yIG1ldGhvZCBpcyBHRVQ6IGZpbGVzIHdpbGwgbm90IGJlIHNlbnQhIAogICAgICAgICAgICAgICAgZm9yIChuRmlsZSA9IDA7IG5GaWxlIDwgb0ZpZWxkLmZpbGVzLmxlbmd0aDsgdGhpcy5zZWdtZW50cy5wdXNoKGZGaWx0ZXIob0ZpZWxkLm5hbWUpICsgIj0iICsgZkZpbHRlcihvRmllbGQuZmlsZXNbbkZpbGUrK10ubmFtZSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gCiAgICAgICAgZWxzZSBpZiAoKHNGaWVsZFR5cGUgIT09ICJSQURJTyIgJiYgc0ZpZWxkVHlwZSAhPT0gIkNIRUNLQk9YIikgfHwgb0ZpZWxkLmNoZWNrZWQpIAogICAgICAgIHsKICAgICAgICAgICAgLy8gZmllbGQgdHlwZSBpcyBub3QgRklMRSBvciBpcyBGSUxFIGJ1dCBpcyBlbXB0eSAKICAgICAgICAgICAgdGhpcy5zZWdtZW50cy5wdXNoKAogICAgICAgICAgICAgICAgdGhpcy50ZWNobmlxdWUgPT09IDMgPyAvLyBlbmN0eXBlIGlzIG11bHRpcGFydC9mb3JtLWRhdGEKICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIG9GaWVsZC5uYW1lICsgIlwiXHJcblxyXG4iICsgb0ZpZWxkLnZhbHVlICsgIlxyXG4iCiAgICAgICAgICAgICAgICA6ICAvLyBlbmN0eXBlIGlzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvciB0ZXh0L3BsYWluIG9yIG1ldGhvZCBpcyBHRVQgCiAgICAgICAgICAgICAgICAgICAgZkZpbHRlcihvRmllbGQubmFtZSkgKyAiPSIgKyBmRmlsdGVyKG9GaWVsZC52YWx1ZSkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLnByb2Nlc3NTdGF0dXModGhpcyk7Cn0gICAgCiovCnZhciBBSkFYID0gbmV3IFRBSkFYKCk7Cg==ZnVuY3Rpb24gVEJyb3dzZXIoKQp7CiAgICB0aGlzLm1vYmlsZSA9IGZhbHNlOwogICAgdGhpcy5jcmVhdGUoKTsKfQoKVEJyb3dzZXIucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgCnsKICAgIHRoaXMubmFtZSA9IHRoaXMuc2VhcmNoU3RyaW5nKHRoaXMuZGF0YUJyb3dzZXIpIHx8ICIiOwogICAgdGhpcy5mdWxsVmVyc2lvbiA9IHRoaXMuc2VhcmNoVmVyc2lvbihuYXZpZ2F0b3IudXNlckFnZW50KQogICAgICAgICAgICB8fCB0aGlzLnNlYXJjaFZlcnNpb24obmF2aWdhdG9yLmFwcFZlcnNpb24pCiAgICAgICAgICAgIHx8ICJhbiB1bmtub3duIHZlcnNpb24iOwogICAgdGhpcy52ZXJzaW9uID0gZXh0cmFjdEludCh0aGlzLmZ1bGxWZXJzaW9uKTsKICAgIHRoaXMub3MgPSB0aGlzLnNlYXJjaFN0cmluZyh0aGlzLmRhdGFPUykgfHwgIiI7CiAgICAKICAgIC8vIElFIDExCiAgICBpZiAoISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50XC83XC4vKSkKICAgICAgICB0aGlzLm5hbWUgPSAiRXhwbG9yZXIiOwogICAgICAgIAogICAgdGhpcy5zZXRIdG1sQnJvd3NlckNsYXNzZXMoKTsKICAgIAogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5zYXZlKCl9LCAxMDAwKTsKICAgIAogICAgYWRkRXZlbnQoIndpbmRvdyIsICJyZXNpemUiLCBmdW5jdGlvbigpe190aGlzLnNhdmUoKX0pOwp9CgpUQnJvd3Nlci5wcm90b3R5cGUuZ2V0V2luZG93U2l6ZSA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHdpZHRoID0gMDsKICAgIHZhciBoZWlnaHQgPSAwOwogICAgCiAgICBpZiAodHlwZW9mKHdpbmRvdy5pbm5lcldpZHRoKSA9PSAnbnVtYmVyJykgCiAgICB7CiAgICAgICAgLy9Ob24tSUUKICAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKICAgIH0gCiAgICBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSkgCiAgICB7CiAgICAgICAgLy9JRSA2KyBpbiAnc3RhbmRhcmRzIGNvbXBsaWFudCBtb2RlJwogICAgICAgIHdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOwogICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICB9IAogICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSAmJiAoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkpIAogICAgewogICAgICAgIC8vSUUgNCBjb21wYXRpYmxlCiAgICAgICAgd2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOwogICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OwogICAgfQogICAgCiAgICByZXR1cm4oezA6d2lkdGgsJ3dpZHRoJzp3aWR0aCwndyc6d2lkdGgsMTpoZWlnaHQsJ2hlaWdodCc6aGVpZ2h0LCdoJzpoZWlnaHR9KTsKfQoKVEJyb3dzZXIucHJvdG90eXBlLnNlYXJjaFN0cmluZyA9IGZ1bmN0aW9uKGRhdGEpCnsKICAgIGZvciAodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKykgICAgCiAgICB7CiAgICAgICAgdmFyIGRhdGFTdHJpbmcgPSBkYXRhW2ldLnN0cmluZzsKICAgICAgICB2YXIgZGF0YVByb3AgPSBkYXRhW2ldLnByb3A7CiAgICAgICAgdGhpcy52ZXJzaW9uU2VhcmNoU3RyaW5nID0gZGF0YVtpXS52ZXJzaW9uU2VhcmNoIHx8IGRhdGFbaV0uaWRlbnRpdHk7CiAgICAgICAgaWYgKGRhdGFTdHJpbmcpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRhdGFTdHJpbmcuaW5kZXhPZihkYXRhW2ldLnN1YlN0cmluZykgIT0gLTEpCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVtpXS5pZGVudGl0eTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YVByb3ApCiAgICAgICAgICAgIHJldHVybiBkYXRhW2ldLmlkZW50aXR5OwogICAgfQp9CgpUQnJvd3Nlci5wcm90b3R5cGUuc2VhcmNoVmVyc2lvbiA9IGZ1bmN0aW9uKGRhdGFTdHJpbmcpCnsKICAgIGlmICh0aGlzLm5hbWUgPT0gIkV4cGxvcmVyIikKICAgIHsKICAgICAgICByZXR1cm4ocGFyc2VGbG9hdCgobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8uKig/OnJ2fGllKVtcLzogXSguKz8pKFsgXCk7XXwkKS8pIHx8IFtdKVsxXSkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBpbmRleCA9IGRhdGFTdHJpbmcuaW5kZXhPZih0aGlzLnZlcnNpb25TZWFyY2hTdHJpbmcpOwogICAgICAgIGlmIChpbmRleCA9PSAtMSkgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChkYXRhU3RyaW5nLnN1YnN0cmluZyhpbmRleCt0aGlzLnZlcnNpb25TZWFyY2hTdHJpbmcubGVuZ3RoKzEpKTsKICAgIH0KfQpUQnJvd3Nlci5wcm90b3R5cGUuZGF0YUJyb3dzZXIgPSBbCiAgICB7CiAgICAgICAgc3RyaW5nOiBuYXZpZ2F0b3IudmVuZG9yLAogICAgICAgIHN1YlN0cmluZzogIkFwcGxlIiwKICAgICAgICBpZGVudGl0eTogIlNhZmFyaSIsCiAgICAgICAgdmVyc2lvblNlYXJjaDogIlZlcnNpb24iCiAgICB9LAogICAgewogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnVzZXJBZ2VudCwKICAgICAgICBzdWJTdHJpbmc6ICJFZGdlIiwKICAgICAgICBpZGVudGl0eTogIkVkZ2UiLAogICAgfSwKICAgIHsKICAgICAgICBzdHJpbmc6IG5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgc3ViU3RyaW5nOiAiTVNJRSIsCiAgICAgICAgaWRlbnRpdHk6ICJFeHBsb3JlciIsCiAgICAgICAgdmVyc2lvblNlYXJjaDogIk1TSUUiCiAgICB9LAogICAgewogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnVzZXJBZ2VudCwKICAgICAgICBzdWJTdHJpbmc6ICJDaHJvbWUiLAogICAgICAgIGlkZW50aXR5OiAiQ2hyb21lIgogICAgfSwKICAgIHsgICAKICAgICAgICBzdHJpbmc6IG5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgc3ViU3RyaW5nOiAiT21uaVdlYiIsCiAgICAgICAgdmVyc2lvblNlYXJjaDogIk9tbmlXZWIvIiwKICAgICAgICBpZGVudGl0eTogIk9tbmlXZWIiCiAgICB9LAogICAgewogICAgICAgIHByb3A6IHdpbmRvdy5vcGVyYSwKICAgICAgICBpZGVudGl0eTogIk9wZXJhIiwKICAgICAgICB2ZXJzaW9uU2VhcmNoOiAiVmVyc2lvbiIKICAgIH0sCiAgICB7CiAgICAgICAgc3RyaW5nOiBuYXZpZ2F0b3IudmVuZG9yLAogICAgICAgIHN1YlN0cmluZzogImlDYWIiLAogICAgICAgIGlkZW50aXR5OiAiaUNhYiIKICAgIH0sCiAgICB7CiAgICAgICAgc3RyaW5nOiBuYXZpZ2F0b3IudmVuZG9yLAogICAgICAgIHN1YlN0cmluZzogIktERSIsCiAgICAgICAgaWRlbnRpdHk6ICJLb25xdWVyb3IiCiAgICB9LAogICAgewogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnVzZXJBZ2VudCwKICAgICAgICBzdWJTdHJpbmc6ICJGaXJlZm94IiwKICAgICAgICBpZGVudGl0eTogIkZpcmVmb3giCiAgICB9LAogICAgewogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnZlbmRvciwKICAgICAgICBzdWJTdHJpbmc6ICJDYW1pbm8iLAogICAgICAgIGlkZW50aXR5OiAiQ2FtaW5vIgogICAgfSwKICAgIHsgICAgICAgIC8vIGZvciBuZXdlciBOZXRzY2FwZXMgKDYrKQogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnVzZXJBZ2VudCwKICAgICAgICBzdWJTdHJpbmc6ICJOZXRzY2FwZSIsCiAgICAgICAgaWRlbnRpdHk6ICJOZXRzY2FwZSIKICAgIH0sCiAgICB7CiAgICAgICAgc3RyaW5nOiBuYXZpZ2F0b3IudXNlckFnZW50LAogICAgICAgIHN1YlN0cmluZzogIkdlY2tvIiwKICAgICAgICBpZGVudGl0eTogIk1vemlsbGEiLAogICAgICAgIHZlcnNpb25TZWFyY2g6ICJydiIKICAgIH0KICAgIC8qCiAgICB7ICAgICAgICAgLy8gZm9yIG9sZGVyIE5ldHNjYXBlcyAoNC0pCiAgICAgICAgc3RyaW5nOiBuYXZpZ2F0b3IudXNlckFnZW50LAogICAgICAgIHN1YlN0cmluZzogIk1vemlsbGEiLAogICAgICAgIGlkZW50aXR5OiAiTmV0c2NhcGUiLAogICAgICAgIHZlcnNpb25TZWFyY2g6ICJNb3ppbGxhIgogICAgfQogICAgKi8KXTsKICAgIApUQnJvd3Nlci5wcm90b3R5cGUuZGF0YU9TID0gWwogICAgewogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnBsYXRmb3JtLAogICAgICAgIHN1YlN0cmluZzogIldpbiIsCiAgICAgICAgaWRlbnRpdHk6ICJXaW5kb3dzIgogICAgfSwKICAgIHsKICAgICAgICBzdHJpbmc6IG5hdmlnYXRvci5wbGF0Zm9ybSwKICAgICAgICBzdWJTdHJpbmc6ICJPUyBYIiwKICAgICAgICBpZGVudGl0eTogIk9TIFgiCiAgICB9LAogICAgewogICAgICAgIHN0cmluZzogbmF2aWdhdG9yLnBsYXRmb3JtLAogICAgICAgIHN1YlN0cmluZzogIk1hYyIsCiAgICAgICAgaWRlbnRpdHk6ICJNYWMiCiAgICB9LAogICAgLyoKICAgIHsKICAgICAgICAgICBzdHJpbmc6IG5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgICAgc3ViU3RyaW5nOiAiaVBob25lIiwKICAgICAgICAgICBpZGVudGl0eTogImlQaG9uZS9pUG9kIgogICAgfSwKICAgICovCiAgICB7CiAgICAgICAgc3RyaW5nOiBuYXZpZ2F0b3IucGxhdGZvcm0sCiAgICAgICAgc3ViU3RyaW5nOiAiTGludXgiLAogICAgICAgIGlkZW50aXR5OiAiTGludXgiCiAgICB9Cl07CgpUQnJvd3Nlci5wcm90b3R5cGUuaGFzRmxhc2ggPSBmdW5jdGlvbigpIAp7CiAgICBpZiAobmF2aWdhdG9yLnBsdWdpbnMgJiYgbmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoICYmIG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dhdmUgRmxhc2gnXSkgCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IAogICAgZWxzZSBpZiAobmF2aWdhdG9yLm1pbWVUeXBlcyAmJiBuYXZpZ2F0b3IubWltZVR5cGVzLmxlbmd0aCkgCiAgICB7CiAgICAgICAgdmFyIG1pbWVUeXBlID0gbmF2aWdhdG9yLm1pbWVUeXBlc1snYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnXTsKICAgICAgICByZXR1cm4gbWltZVR5cGUgJiYgbWltZVR5cGUuZW5hYmxlZFBsdWdpbjsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgdHJ5IAogICAgICAgIHsKICAgICAgICAgICAgdmFyIGF4ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ1Nob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoJyk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gCiAgICAgICAgY2F0Y2ggKGUpIAogICAgICAgIHsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpUQnJvd3Nlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHNpemUgPSB0aGlzLmdldFdpbmRvd1NpemUoKTsKICAgIGlmIChKU09OKQogICAgewogICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAibmFtZSI6dGhpcy5uYW1lLAogICAgICAgICAgICAidmVyc2lvbiI6dGhpcy52ZXJzaW9uLAogICAgICAgICAgICAib3MiOnRoaXMub3MsCiAgICAgICAgICAgICJ3aWR0aCI6c2l6ZVsid2lkdGgiXSwKICAgICAgICAgICAgImhlaWdodCI6c2l6ZVsiaGVpZ2h0Il0KICAgICAgICB9OwogICAgICAgIAogICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YVtpXSkKICAgICAgICAgICAgICAgIGRlbGV0ZShkYXRhW2ldKTsKICAgICAgICB9CiAgICAgICAgc2V0Q29va2llKCJCcm93c2VyIiwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpOwogICAgfQogICAgLy9kdW1wKDEpOwogICAgaWYgKCFnZXRDb29raWUoIkJyb3dzZXIiKSkKICAgIHsKICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0byBzZXNzaW9uIHZpYSBBSkFYCiAgICB9Cn0KClRCcm93c2VyLnByb3RvdHlwZS5zZXRIdG1sQnJvd3NlckNsYXNzZXMgPSBmdW5jdGlvbigpCnsKICAgIGlmICh0aGlzLm5hbWUgPT0gIkV4cGxvcmVyIikKICAgIHsKICAgICAgICBhZGRDbGFzc05hbWUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAiaWUiKTsKICAgICAgICBhZGRDbGFzc05hbWUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAiaWUtIit0aGlzLnZlcnNpb24pOwogICAgICAgIGZvciAodmFyIGkgPSA2OyBpIDwgdGhpcy52ZXJzaW9uOyArK2kpIAogICAgICAgIHsKICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgImllLWd0LSIraSk7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJpZS1ndGUtIisoaSsxKSk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAxMTsgaSA+IHRoaXMudmVyc2lvbjsgLS1pKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZENsYXNzTmFtZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJpZS1sdC0iK2kpOwogICAgICAgICAgICBhZGRDbGFzc05hbWUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAiaWUtbHRlLSIrKGktMSkpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBhZGRDbGFzc05hbWUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLm5hbWUudG9Mb3dlckNhc2UoKSk7Cn0KCgpCcm93c2VyID0gbmV3IFRCcm93c2VyKCk7Cg==aHRtbCwgYm9keSB7DQogICAgYmFja2dyb3VuZDogIzJGNDg4QjsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIFNhbnMtc2VyaWY7DQogICAgZm9udC1zaXplOiAxMnB4Ow0KICAgIHdpZHRoOiAxMDAlOw0KICAgIGhlaWdodDogMTAwJTsNCg0KICAgIG1hcmdpbjogMHB4Ow0KICAgIHBhZGRpbmc6IDBweDsNCg0KICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudChib3R0b20sIHJnYig0Nyw3MSwxMzkpIDAlLCByZ2IoMjAsMTE5LDE4NikgNTAlLCByZ2IoMzgsODcsMTYwKSAxMDAlKTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoYm90dG9tLCByZ2IoNDcsNzEsMTM5KSAwJSwgcmdiKDIwLDExOSwxODYpIDUwJSwgcmdiKDM4LDg3LDE2MCkgMTAwJSk7DQogICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoYm90dG9tLCByZ2IoNDcsNzEsMTM5KSAwJSwgcmdiKDIwLDExOSwxODYpIDUwJSwgcmdiKDM4LDg3LDE2MCkgMTAwJSk7DQogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoYm90dG9tLCByZ2IoNDcsNzEsMTM5KSAwJSwgcmdiKDIwLDExOSwxODYpIDUwJSwgcmdiKDM4LDg3LDE2MCkgMTAwJSk7DQogICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudChib3R0b20sIHJnYig0Nyw3MSwxMzkpIDAlLCByZ2IoMjAsMTE5LDE4NikgNTAlLCByZ2IoMzgsODcsMTYwKSAxMDAlKTsNCg0KICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQoDQogICAgICAgIGxpbmVhciwNCiAgICAgICAgbGVmdCBib3R0b20sDQogICAgICAgIGxlZnQgdG9wLA0KICAgICAgICBjb2xvci1zdG9wKDAsIHJnYig0Nyw3MSwxMzkpKSwNCiAgICAgICAgY29sb3Itc3RvcCgwLjUsIHJnYigyMCwxMTksMTg2KSksDQogICAgICAgIGNvbG9yLXN0b3AoMSwgcmdiKDM4LDg3LDE2MCkpDQogICAgKTsgICAgDQp9DQoNCmEgew0KICAgIGNvbG9yOiAjRkZGRkZGOyAgICANCiAgICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjBweDsNCn0NCg0KaDIgew0KICAgIGZvbnQtc2l6ZTogMTZweDsNCn0NCg0KZm9ybSB7DQogICAgbWFyZ2luOiAwcHg7DQogICAgcGFkZGluZzogMHB4Ow0KfQ0KDQoubG9nby1jaXJjbGUgew0KICAgIHdpZHRoOiAzMDBweDsNCiAgICAvKmhlaWdodDogMzUlOyovDQogICAgaGVpZ2h0OiAzMDBweDsNCiAgICBtYXJnaW4tbGVmdDogYXV0bzsNCiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87DQogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1jb3JlL2NsYXNzZXMvX25ldy9JbnN0YWxsL3Zpc3VhbHBocDItbG9nby1jaXJjbGUucG5nKTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBib3R0b207DQp9DQoNCi5sb2dvLXRleHQgew0KICAgIHdpZHRoOiAzMDBweDsNCiAgICAvKmhlaWdodDogMTUlOyovIA0KICAgIGhlaWdodDogMTUwcHg7DQogICAgbWFyZ2luLWxlZnQ6IGF1dG87DQogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOw0KICAgIG1hcmdpbi10b3A6IC02MHB4Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKGluc3RhbGwucGhwP2luY2x1ZGU9Y29yZS9jbGFzc2VzL19uZXcvSW5zdGFsbC92aXN1YWxwaHAtbm9sb2dvLnBuZyk7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgYm90dG9tOw0KfQ0KDQoubG9nby12ZXJzaW9uIHsNCiAgICB3aWR0aDogMjgwcHg7DQogICAgaGVpZ2h0OiAxMHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCiAgICBtYXJnaW4tdG9wOiAtMTZweDsNCiAgICBjb2xvcjogI0ZGRkZGRjsNCiAgICBmb250LXNpemU6IDEwcHg7DQogICAgdGV4dC1hbGlnbjogcmlnaHQ7DQp9DQoNCi5sYW5ndWFnZSB7DQogICAgd2lkdGg6IDgwMHB4Ow0KICAgIGhlaWdodDogNTAlOw0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgbWFyZ2luLXRvcDogODBweDsNCn0NCg0KLmluc3RhbGwtdHlwZSB7DQogICAgd2lkdGg6IDgwMHB4Ow0KICAgIGhlaWdodDogNTAlOw0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgbWFyZ2luLXRvcDogODBweDsNCiAgICBjb2xvcjogd2hpdGU7DQp9DQoNCi5jb250ZW50IHsNCiAgICB3aWR0aDogODAwcHg7DQogICAgLypoZWlnaHQ6IDUwJTsqLw0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgbWFyZ2luLXRvcDogODBweDsNCiAgICBjb2xvcjogd2hpdGU7DQp9DQoNCi5ldWxhLCAuY29uZmlnIHsNCiAgICB3aWR0aDogODAwcHg7DQogICAgLypoZWlnaHQ6IDYwJTsqLw0KICAgIGhlaWdodDogMzAwcHg7DQogICAgbWFyZ2luLWxlZnQ6IGF1dG87DQogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQogICAgY29sb3I6IHdoaXRlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIHBhZGRpbmc6IDEwcHg7DQogICAgYm9yZGVyOiAxcHggc29saWQgI0ZGRkZGRjsNCiAgICBib3JkZXItcmFkaXVzOiA0cHg7DQogICAgbWFyZ2luLWJvdHRvbTogMjBweDsNCn0NCg0KLmNvbmZpZyB7DQogICAgaGVpZ2h0OiAxNTBweDsNCn0NCg0KDQoNCnVsLmluc3RhbGwtdHlwZSB7DQogICAgbGlzdC1zdHlsZTogbm9uZTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgIHdpZHRoOiA1MDBweDsNCiAgICANCn0NCg0KdWwuaW5zdGFsbC10eXBlIGxpIHsNCiAgICBwYWRkaW5nOiAycHg7DQogICAgY2xlYXI6IGJvdGg7DQogICAgbWFyZ2luLWJvdHRvbTogMTBweDsNCiAgICAvKmhlaWdodDogMTEwcHg7Ki8NCiAgICBjdXJzb3I6IHBvaW50ZXI7DQp9DQoNCnVsLmluc3RhbGwtdHlwZSBsaTpob3ZlciB7DQogICAgYm9yZGVyOiAycHggc29saWQgI0RERERERDsNCiAgICBiYWNrZ3JvdW5kOiAjMDg1QjlBOw0KICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICBwYWRkaW5nOiAwcHg7DQp9DQoNCnVsLmluc3RhbGwtdHlwZSBsaSBoMiB7DQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIG1hcmdpbi10b3A6IDZweDsNCiAgICBtYXJnaW4tYm90dG9tOiA4cHg7DQp9DQoNCnVsLmluc3RhbGwtdHlwZSBsaSBpbWcgew0KICAgIGJvcmRlcjogNHB4IHNvbGlkICNDOEM4Qzg7ICAgIA0KICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICBiYWNrZ3JvdW5kOiAjMDg1QjlBOw0KICAgIHBhZGRpbmc6IDVweDsNCiAgICBtYXJnaW46IDVweDsNCiAgICBmbG9hdDogbGVmdDsNCn0NCg0KLmJvZHkgew0KICAgIHdpZHRoOiAxMDAwcHg7DQogICAgbWFyZ2luLXRvcDogNDBweDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCAjQUNBQ0FDOw0KICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7DQogICAgbWFyZ2luLWxlZnQ6IGF1dG87DQogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOw0KICAgIC1tb3otYm94LXNoYWRvdzogICAgMHB4IDBweCA1cHggM3B4ICNEREREREQ7DQogICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDVweCAzcHggI0RERERERDsNCiAgICBib3gtc2hhZG93OiAgICAgICAgIDBweCAwcHggNXB4IDNweCAjREREREREOw0KICAgIG1pbi1oZWlnaHQ6IDYwMHB4Ow0KICAgIC8vYm9yZGVyLXJhZGl1czoxMHB4Ow0KfQ0KDQoudG9wIHsNCiAgICBoZWlnaHQ6IDEwMHB4Ow0KICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDQ0NDOw0KICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7DQp9DQoNCi5sZWZ0IHsNCiAgICBjb2xvcjogI0ZGRkZGRjsNCiAgICB3aWR0aDogMjAwcHg7DQogICAgZmxvYXQ6IGxlZnQ7DQogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0M2QzZDNjsNCiAgICBiYWNrZ3JvdW5kOiAjRUFFQUVBOw0KICAgIHBhZGRpbmc6IDEwcHg7DQogICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1jb3JlL2NsYXNzZXMvX25ldy9JbnN0YWxsL2xlZnQucG5nKTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KICAgIA0KfQ0KDQpsYWJlbCB7DQogICAgd2lkdGg6IDMwMHB4Ow0KICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KICAgIGNsZWFyOiBib3RoOw0KICAgIG1hcmdpbi1yaWdodDogMzBweDsNCn0NCg0KaW5wdXQgew0KICAgIGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7DQogICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KICAgIHBhZGRpbmc6IDZweCAxMHB4IDZweCAxMHB4Ow0KfQ0KDQouc3RhdHVzLW9rIHsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOnVybChpbnN0YWxsLnBocD9pbmNsdWRlPWNvcmUvY2xhc3Nlcy9fbmV3L0luc3RhbGwvb2sucG5nKTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KDQouc3RhdHVzLWVycm9yIHsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOnVybChpbnN0YWxsLnBocD9pbmNsdWRlPWNvcmUvY2xhc3Nlcy9fbmV3L0luc3RhbGwvZXJyb3IucG5nKTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KDQouc3RhdHVzLWljb24gew0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICB3aWR0aDogMzJweDsNCiAgICBoZWlnaHQ6IDMycHg7DQogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCiAgICBtYXJnaW4tbGVmdDogMTBweDsNCn0NCg0KI2NoZWNrU3RhdHVzIHsNCiAgICBwYWRkaW5nOiAxMHB4Ow0KICAgIGhlaWdodDogNDBweDsNCn0gDQoNCmxhYmVsIHsNCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgLypmbG9hdDogbGVmdDsqLw0KICAgIHdpZHRoOiAxMjBweDsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KfQ0KDQojaW5zdGFsbE1ldGhvZEZ0cCwgI2luc3RhbGxNZXRob2RTUUwsICNpbnN0YWxsRGV2ZWxvcGVyQWNjb3VudCB7DQogICAgd2lkdGg6IDQwMHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQouX1Rvb2xUaXAgew0KICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7DQogICAgY29sb3I6ICNGRkZGRkY7DQogICAgLypoZWlnaHQ6IDM2cHg7Ki8NCn0NCg0KDQovKg0KLmxvZ28gew0KICAgIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KICAgIG1hcmdpbi10b3A6IDEwcHg7DQogICAgcG9zaXRpb246IGFic29sdXRlOw0KfQ0KKi8NCg0KLyoNCmJ1dHRvbiB7DQogICAgYm9yZGVyOiAxcHggc29saWQgIzJENTNBRjsNCiAgICBwYWRkaW5nOiA1cHggMjBweCA1cHggMjBweDsNCiAgICBjb2xvcjogI0ZGRkZGRjsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LXNpemU6IDEycHg7IA0KICAgIA0KICAgIC1tb3otYm94LXNoYWRvdzppbnNldCAwcHggMXB4IDBweCAwcHggI2ZmZmZmZjsNCiAgICAtd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMHB4IDFweCAwcHggMHB4ICNmZmZmZmY7DQogICAgYm94LXNoYWRvdzppbnNldCAwcHggMXB4IDBweCAwcHggI2ZmZmZmZjsNCg0KICAgIGJhY2tncm91bmQ6LXdlYmtpdC1ncmFkaWVudCggbGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMC4wNSwgIzYwOTBERCksIGNvbG9yLXN0b3AoMSwgIzREN0NENikgKTsNCiAgICBiYWNrZ3JvdW5kOi1tb3otbGluZWFyLWdyYWRpZW50KCBjZW50ZXIgdG9wLCAjNjA5MEREIDUlLCAjNEQ3Q0Q2IDEwMCUgKTsNCiAgICBmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyM2MDkwREQnLCBlbmRDb2xvcnN0cj0nIzREN0NENicpOw0KICAgIGJhY2tncm91bmQtY29sb3I6IzREN0NENjsNCiAgICAtbW96LWJvcmRlci1yYWRpdXM6M3B4Ow0KICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7DQogICAgYm9yZGVyLXJhZGl1czozcHg7DQogICAgICAgDQp9DQoNCmJ1dHRvbjpob3ZlciB7DQogICAgYmFja2dyb3VuZDotd2Via2l0LWdyYWRpZW50KCBsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCgwLjA1LCAjNjA5MEREKSwgY29sb3Itc3RvcCgxLCAjNEQ3Q0Q2KSApOw0KICAgIGJhY2tncm91bmQ6LW1vei1saW5lYXItZ3JhZGllbnQoIGNlbnRlciB0b3AsICM2MDkwREQgNSUsICM0RDdDRDYgMTAwJSApOw0KICAgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzYwOTBERCcsIGVuZENvbG9yc3RyPScjNEQ3Q0Q2Jyk7DQogICAgYmFja2dyb3VuZC1jb2xvcjojNjA5MEREOw0KDQogICAgYm9yZGVyOjFweCBzb2xpZCAjNEQ3Q0Q2Ow0KICAgIA0KfQ0KDQoqLw0KDQovKg0KLl9Db21ib0JveCB7DQogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgICBmb250LXNpemU6IDE0cHg7DQogICAgcGFkZGluZzogNHB4IDIwcHggNHB4IDIwcHg7DQogICAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTgsIDE5OCwgMTk4KTsNCiAgICAvL2hlaWdodDogNTBweDsNCiAgICBiYWNrZ3JvdW5kOiByZ2IoMjQ4LCAyNDgsIDI0OCk7IA0KICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KGNlbnRlciB0b3AgLCByZ2IoMjQ4LCAyNDgsIDI0OCksIHJnYigyMzYsIDIzNiwgMjM2KSk7DQogICAgYm94LXNoYWRvdzogICAgICAgICAwcHggMHB4IDVweCAzcHggIzU1NTU1NTsNCiAgICANCiAgICB3aWR0aDogMjAwcHg7DQogICAgY29sb3I6ICM0NDQ0NDQ7DQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uIHsNCiAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgYm9yZGVyOiAwcHg7DQogICAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50Ow0KICAgIGJvcmRlcjogMXB4IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7DQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgew0KICAgIG1hcmdpbi10b3A6IC0yOHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiAwcHg7DQogICAgZm9udC1zaXplOiAxNHB4Ow0KICAgIHdpZHRoOiAxMjBweDsNCiAgICANCiAgICAvL3BhZGRpbmc6IDRweCAyMHB4IDRweCAyMHB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTk4LCAxOTgsIDE5OCk7DQogICAgLy93aWR0aDogMzAwcHg7DQogICAgLy9oZWlnaHQ6IDUwcHg7DQogICAgYmFja2dyb3VuZDogcmdiKDI0OCwgMjQ4LCAyNDgpOyANCiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudChjZW50ZXIgdG9wICwgcmdiKDI0OCwgMjQ4LCAyNDgpLCByZ2IoMjM2LCAyMzYsIDIzNikpOw0KICAgIGJveC1zaGFkb3c6ICAgICAgICAgMHB4IDBweCA1cHggM3B4ICM1NTU1NTU7DQogICAgDQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGkgYSB7DQogICAgcGFkZGluZzogNHB4Ow0KfQ0KKi8NCg0KDQouX1Byb2dyZXNzIHsNCiAgICBwYWRkaW5nOiA0cHg7DQogICAgYmFja2dyb3VuZDogIzAwMDAwMDsNCiAgICBoZWlnaHQ6IDMycHg7DQogICAgbWFyZ2luLXRvcDogMnB4Ow0KDQogICAgd2lkdGg6IDYwMHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCg0KICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTk4LCAxOTgsIDE5OCk7DQogICAgYmFja2dyb3VuZDogIzAwMDAwMDsgDQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KGNlbnRlciB0b3AgLCAjMDAwMDAwLCAjNDQ0NDQ0KTsNCiAgICBib3gtc2hhZG93OiAwcHggMHB4IDVweCAzcHggIzU1NTU1NTsNCiAgICANCn0NCg0KLl9Qcm9ncmVzcyAuX1Byb2dyZXNzQmFyIHsNCiAgICBwYWRkaW5nOiAycHg7DQogICAgYmFja2dyb3VuZDp1cmwoaW5zdGFsbC5waHA/aW5jbHVkZT1jb3JlL2NsYXNzZXMvX25ldy9JbnN0YWxsL3Byb2dyZXNzLmdpZik7DQogICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KfQ0KDQouX1Byb2dyZXNzIC5fUHJvZ3Jlc3NUZXh0IHsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LXNpemU6IDIwcHg7DQp9DQoNCi5fUHJvZ3Jlc3MgLl9Qcm9ncmVzc1RleHQwIHsNCiAgICBjb2xvcjogI0ZGRkZGRjsNCn0NCi5fUHJvZ3Jlc3MgLl9Qcm9ncmVzc1RleHQ1MCB7DQogICAgY29sb3I6ICNGRkZGRkY7DQp9DQouX1Byb2dyZXNzIC5fUHJvZ3Jlc3NUZXh0MTAwIHsNCiAgICBjb2xvcjogI0ZGRkZGRjsNCn0NCg0KI1Byb2Nlc3NQcm9ncmVzc1RleHQgew0KICAgIHBhZGRpbmc6IDE2cHg7DQogICAgZm9udC1zaXplOiAyMHB4Ow0KfQ0KDQojUHJvY2Vzc1Byb2dyZXNzRXJyb3JzIHsNCiAgICBoZWlnaHQ6IDEwMHB4Ow0KICAgIHBhZGRpbmc6IDIwcHg7DQogICAgb3ZlcmZsb3c6IGF1dG87DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLl9Db21ib0JveCB7DQogICAgYm9yZGVyOiAxcHggc29saWQge3BocDokU1RZTEVbImJvcmRlckNvbG9yIl19Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsgIA0KICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsIHtwaHA6JFNUWUxFWyJiYXJCZ0NvbG9yRnJvbSJdfSwge3BocDokU1RZTEVbImJhckJnQ29sb3JUbyJdfSk7DQogICAgY29sb3I6IHtwaHA6JFNUWUxFWyJ0ZXh0Q29sb3IiXX07DQogICAgcGFkZGluZzogNnB4Ow0KICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uIHsNCiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudCAhaW1wb3J0YW50Ow0KICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7DQogICAgZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7DQp9DQogICAgDQouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIHsNCiAgICBib3JkZXI6IDFweCBzb2xpZCB7cGhwOiRTVFlMRVsiYm9yZGVyQ29sb3IiXX07DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgI0ZGRkZGRiwgI0NDQ0NDQyk7DQogICAgYm9yZGVyLXJhZGl1czogM3B4OyAgDQoNCiAgICBtYXgtd2lkdGg6IDQwMHB4Ow0KfQ0KDQouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIGxpIHsNCiAgICBwYWRkaW5nOiAycHg7DQogICAgY29sb3I6IHtwaHA6JFNUWUxFWyJ0ZXh0Q29sb3IiXX07DQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGkgYSB7DQogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7DQogICAgcGFkZGluZzogNHB4Ow0KICAgIGNvbG9yOiAjMDAwMDAwOyAgDQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgbGk6aG92ZXIgYSwgLl9Db21ib0JveCArIC5idXR0b24gKyB1bCBsaTpob3ZlciBhDQp7ICAgIA0KICAgIGJvcmRlcjogMXB4IHNvbGlkIHtwaHA6JFNUWUxFWyJob3ZlckJvcmRlckNvbG9yIl19Ow0KICAgIGJvcmRlci1yYWRpdXM6IDJweDsNCiAgICBjb2xvcjoge3BocDokU1RZTEVbImhvdmVyVGV4dENvbG9yIl19Ow0KICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsIHtwaHA6JFNUWUxFWyJob3ZlckJnQ29sb3JGcm9tIl19LCB7cGhwOiRTVFlMRVsiaG92ZXJCZ0NvbG9yVG8iXX0pOw0KfQ0KDQouX0NvbWJvQm94ICsgLmJ1dHRvbiArIHVsIGxpLnNlbGVjdGVkIGEgew0KICAgIGJvcmRlcjogMXB4IHNvbGlkIHtwaHA6JFNUWUxFWyJhY3RpdmVCb3JkZXJDb2xvciJdfTsNCiAgICBib3JkZXItcmFkaXVzOiAycHg7DQogICAgY29sb3I6IHtwaHA6JFNUWUxFWyJhY3RpdmVUZXh0Q29sb3IiXX07DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwge3BocDokU1RZTEVbImFjdGl2ZUJnQ29sb3JGcm9tIl19LCB7cGhwOiRTVFlMRVsiYWN0aXZlQmdDb2xvclRvIl19KTsNCn0NCg0KLl9Db21ib0JveDpob3ZlciB7DQogICAgYm9yZGVyOiAxcHggc29saWQge3BocDokU1RZTEVbImhvdmVyQm9yZGVyQ29sb3IiXX07DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwge3BocDokU1RZTEVbImhvdmVyQmdDb2xvckZyb20iXX0sIHtwaHA6JFNUWUxFWyJob3ZlckJnQ29sb3JUbyJdfSk7DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLl9CdXR0b24gew0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgcGFkZGluZzogOHB4IDIwcHg7DQogICAgDQogICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KLl9CdXR0b24sIC5fQ29tYm9Cb3gvKiwgLl9Db21ib0JveCArIC5idXR0b24gKyB1bCAqLyB7DQogICAgY29sb3I6IHtwaHA6JFNUWUxFWyJidXR0b25UZXh0Q29sb3IiXX07DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwge3BocDokU1RZTEVbImJ1dHRvbkJnQ29sb3JGcm9tIl19LCB7cGhwOiRTVFlMRVsiYnV0dG9uQmdDb2xvclRvIl19KTsNCiAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgYm9yZGVyOiAxcHggc29saWQge3BocDokU1RZTEVbImJ1dHRvbkJvcmRlckNvbG9yIl19Ow0KICAgIA0KICAgIGJveC1zaGFkb3c6IDBweCAxcHggNXB4IHJnYmEoMDAwLDAwMCwwMDAsMC45KSwgaW5zZXQgMHB4IDBweCAycHggcmdiYSgyNTUsMjU1LDI1NSwwLjUpOw0KICAgIHRleHQtc2hhZG93OiAwcHggLTFweCAwcHggcmdiYSgwMDAsMDAwLDAwMCwwKSwgMHB4IDFweCAwcHggcmdiYSgyNTUsMjU1LDI1NSwwKTsNCn0NCg0KLl9CdXR0b246aG92ZXIsIC5fQ29tYm9Cb3g6aG92ZXIgew0KICAgIGNvbG9yOiB7cGhwOiRTVFlMRVsiYnV0dG9uSG92ZXJUZXh0Q29sb3IiXX07DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwge3BocDokU1RZTEVbImJ1dHRvbkhvdmVyQmdDb2xvckZyb20iXX0sIHtwaHA6JFNUWUxFWyJidXR0b25Ib3ZlckJnQ29sb3JUbyJdfSk7DQogICAgYm9yZGVyOiAxcHggc29saWQge3BocDokU1RZTEVbImJ1dHRvbkhvdmVyQm9yZGVyQ29sb3IiXX07DQp9DQoNCi5fQ29tYm9Cb3gsIC5fVGV4dEVkaXQgew0KICAgIGJvcmRlcjogMnB4IHNvbGlkICMzMjRCNUE7DQogICAgYm94LXNoYWRvdzogMHB4IDFweCAxcHggcmdiYSgyNTUsMjU1LDI1NSwwLjkpLCBpbnNldCAwcHggMHB4IDJweCByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7DQp9DQoNCi5fQ29tYm9Cb3ggKyAuYnV0dG9uICsgdWwgew0KICAgIGJvcmRlcjogMnB4IHNvbGlkICMzMjRCNUE7DQogICAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICAgIGJveC1zaGFkb3c6IDBweCAxcHggMXB4IHJnYmEoMjU1LDI1NSwyNTUsMC45KSwgaW5zZXQgMHB4IDBweCAycHggcmdiYSgyNTUsMjU1LDI1NSwwLjUpOw0KfQ0KDQouX0NvbWJvQm94OmhvdmVyIHsNCiAgICBib3JkZXI6IDJweCBzb2xpZCAjMzI0QjVBOw0KICAgIGJveC1zaGFkb3c6IDBweCAxcHggMXB4IHJnYmEoMjU1LDI1NSwyNTUsMC45KSwgaW5zZXQgMHB4IDBweCAycHggcmdiYSgyNTUsMjU1LDI1NSwwLjUpOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi5fVG9vbFRpcCB7DQogICAgbWF4LXdpZHRoOiAzMDBweDsNCiAgICB3aGl0ZS1zcGFjZTogd3JhcDsgICAgDQogICAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgICBiYWNrZ3JvdW5kOiAjMDAwMDAwOw0KICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgIHBhZGRpbmc6IDRweDsNCn0NCiAgICANCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLl9UZXh0RWRpdCB7DQogICAgcGFkZGluZzogNHB4Ow0KICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7DQogICAgLy9oZWlnaHQ6IDMycHg7DQogICAgbWFyZ2luLXRvcDogMnB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDJweDsNCg0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICAvKmJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTgsIDE5OCwgMTk4KTsqLw0KICAgIGJvcmRlci13aWR0aDogMXB4Ow0KICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7IA0KICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AgLCAjRUVFRUVFLCAjRkZGRkZGKTsNCiAgICBib3gtc2hhZG93OiAwcHggMHB4IDVweCAxcHggIzU1NTU1NTsNCiAgICBjb2xvcjogIzMzMzMzMzsNCiAgICB3aWR0aDogMTUwcHg7DQp9DQoNCi5fVHJlZSB7DQogICAgYmFja2dyb3VuZDogI0ZGRkZGRjsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTk4LCAxOTgsIDE5OCk7DQogICAgYm9yZGVyLXJhZGl1czogM3B4Ow0KICAgIHBhZGRpbmc6IDRweDsNCiAgICBjb2xvcjogIzAwMDAwMDsNCn0NCiAgICANCi5fVHJlZSBhIHsNCiAgICBjb2xvcjogIzAwMDAwMDsNCiAgICBmb250LXdlaWdodDogbm9ybWFsOw0KfQ0KICAgIA0KI2NvbnRpbnVlIHsNCiAgICBtYXJnaW4tdG9wOiA0MHB4Ow0KfQ0KDQojc3FsRGF0YWJhc2VTZWxlY3Qgew0KICAgIHdpZHRoOiAxNTBweDsNCiAgICBoZWlnaHQ6IDMwcHg7DQogICAgcGFkZGluZzogMnB4Ow0KfQ==iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAgAElEQVR4nO19d3wd1Zn2c86UW3V11Ztly1WW3CTbuOKAA6bEqSS0JEAgBfjgY50luyHLJiRxyreQzSaQEBaWliWUEIhjisGwYOPYGGPhbmNL7rIsyZJ1JV3dMjPnnP1jZu6dW9RFybf7+jeeo7lnzsx5y3Pe854yEv6XhkUbNmygZWVllSUlJV+86aabul555ZXQaMqjY/Vi/xPohRdeoM8999y0NWvWrN61a9dKj8fTM9oy/1cAw6B169bVvvTSSz9vamq6ori4uGnKlCmj0n4AkMbixf5/pz/84Q+yYRjz33///cemTJlyHiFEq6ur+/dVq1btGW3ZfwsWQNMOOe1Q0/525h017d+/X167du35e/bs+bdly5bNvuWWW+D3+yNVVVWHxqJ8eSwKGUNyMi4b49OZa5+5ddhpw3Et/YDjPCg98sgj5+7evXv1ihUr5n/nO99BQ0MDwuFwzOfztY6gfhn0UQvAZqCTuekana7dcpb7nYy1BWAfHICWlk4XUga98sor6rp16xa8+uqrj3/hC18Yf+utt4JSiubmZhiG0VNcXNw+2srbFf8oKBucqI6ziuyCcAogHWKcWm6kHZrjrKVdS7cWbN26Vf7d73537pYtW1ZfeeWV42+44QZQSsE5R1dXFyRJCl1zzTXGWDDiwxaAE0rSme1O+zubENKhJ5sF2Od05seQFIAznS4I47vf/e7czs7O7y1btmzBt771LbjdbhiGAcYYent7uaqqo/Z+bPqwBODU9mxM9zrSKYIghMgEcBMCLzXPHkKJSkBkYb0/EcIQQhgciAkhogIkIgRiXIgYMi0ggqQAInAIhBAScblck3bv3v3byy+/fP4dd9wBVVXBGAMAcM7R29vLKaVnx4oxH7QAnLiefniRZLzXeZ1Q6pcpyVcIL5NlpZzKSr6kevOhuL1EcalEcaugMkAoBQTAGQczuDBihtDjMaFHI0yLdjBdazcYbzUEPc04DwkhwtbzbIuIICmQsKIo5bquf/eyyy6ba3k7MIwk0nDOEY1GuSRJ4bFi0AcpACfMOLXbPvxICkEF4JVleZxbxixFouWS218qFVQVIrdchb9YRk4JhTtAheoHFC8gyQC1ujGcA9wA0fsALQwSDXGlt9VAd6shuptjrPN4qxGP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bi4NCiogDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUNCiogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQoqIA0KKiBTZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC50eHQ+DQoqIA0KKiBAY2F0ZWdvcnkgIEpTY3JpcHQgDQoqIEBwYWNrYWdlICAgYm94LXNpemluZy1wb2x5ZmlsbA0KKiBAYXV0aG9yICAgIENocmlzdGlhbiBTY2hlcHAgU2NoYWVmZXIgPHNjaGFlcHBAZ214LmRlPiA8aHR0cDovL3R3aXR0ZXIuY29tL2RlclNjaGVwcD4NCiogQGNvcHlyaWdodCAyMDEyIENocmlzdGlhbiBTY2hlcHAgU2NoYWVmZXINCiogQGxpY2Vuc2UgICBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGVzc2VyLmh0bWwgVGhlIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRSwgVmVyc2lvbiAzLjANCiogQGxpbmsgICAgICBodHRwOi8vZ2l0aHViLmNvbS9TY2hlcHAvYm94LXNpemluZy1wb2x5ZmlsbCANCioNCiogUFJFRkFDRToNCioNCiogVGhpcyBib3gtc2l6aW5nIHBvbHlmaWxsIGlzIGJhc2VkIG9uIHByZXZpb3VzIHdvcmsgZG9uZSBieSBFcmlrIEFydmlkc3NvbiwgDQoqIHdoaWNoIGhlIHB1Ymxpc2hlZCBpbiAyMDAyIG9uIGh0dHA6Ly93ZWJmeC5lYWUubmV0L2RodG1sL2JveHNpemluZy9ib3hzaXppbmcuaHRtbC4NCioNCiogVVNBR0U6DQoqICAgICANCiogQWRkIHRoZSBiZWhhdmlvci9IVEMgYWZ0ZXIgZXZlcnkgYGJveC1zaXppbmc6IGJvcmRlci1ib3g7YCB0aGF0IHlvdSBhc3NpZ246DQoqIA0KKiBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KKiAqYmVoYXZpb3I6IHVybCgvc2NyaXB0cy9ib3hzaXppbmcuaHRjKTtgDQoqIA0KKiBQcmVmaXggdGhlIGBiZWhhdmlvcmAgcHJvcGVydHkgd2l0aCBhIHN0YXIsIGxpa2Ugc2VlbiBhYm92ZSwgc28gaXQgd2lsbCBvbmx5IGJlIHNlZW4gYnkgDQoqIElFNiAmIElFNywgbm90IGJ5IElFOCsgd2hvIGFscmVhZHkgaW1wbGVtZW50IGJveC1zaXppbmcuDQoqDQoqIFRoZSBVUkwgdG8gdGhlIEhUQyBmaWxlIG11c3QgYmUgcmVsYXRpdmUgdG8geW91ciBIVE1MKCEpIGRvY3VtZW50LCBub3QgcmVsYXRpdmUgdG8geW91ciBDU1MuDQoqIFRoYXQncyB3aHkgSSdkIGFkdmlzZSB5b3UgdG8gdXNlIGFic29sdXRlIHBhdGhzIGxpa2UgaW4gdGhlIGV4YW1wbGUuDQoqDQoqLw0KPGNvbXBvbmVudCBsaWdodFdlaWdodD0idHJ1ZSI+DQo8YXR0YWNoIGV2ZW50PSJvbnByb3BlcnR5Y2hhbmdlIiBvbmV2ZW50PSJjaGVja1Byb3BlcnR5Q2hhbmdlKCkiIC8+DQo8YXR0YWNoIGV2ZW50PSJvbmRldGFjaCIgb25ldmVudD0icmVzdG9yZSgpIiAvPg0KPGF0dGFjaCBldmVudD0ib25yZXNpemUiIGZvcj0id2luZG93IiBvbmV2ZW50PSJ1cGRhdGUoKSIgLz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi8vPCFbQ0RBVEFbDQoNCi8vYWxlcnQoJ2JveC1zaXppbmcuaHRjJyk7DQp2YXIgdmlld3BvcnR3aWR0aCA9ICh0eXBlb2Ygd2luZG93LmlubmVyV2lkdGggIT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IGVsZW1lbnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTsNCg0KLy8gU2hvcnRjdXQgZm9yIHRoZSBkb2N1bWVudCBvYmplY3QNCnZhciBkb2MgPSBlbGVtZW50LmRvY3VtZW50Ow0KDQovLyBCdWZmZXIgZm9yIG11bHRpcGxlIHJlc2l6ZSBldmVudHMNCnZhciByZXNpemV0aW1lb3V0ID0gbnVsbDsNCg0KLy8gRG9uJ3QgYXBwbHkgYm94LXNpemluZyB0byBjZXJ0YWluIGVsZW1lbnRzDQp2YXIgYXBwbHkgPSBmYWxzZTsNCnN3aXRjaChlbGVtZW50Lm5vZGVOYW1lKXsNCiAgICBjYXNlICcjY29tbWVudCc6DQogICAgY2FzZSAnSFRNTCc6DQogICAgY2FzZSAnSEVBRCc6DQogICAgY2FzZSAnVElUTEUnOg0KICAgIGNhc2UgJ1NDUklQVCc6DQogICAgY2FzZSAnU1RZTEUnOg0KICAgIGNhc2UgJ0xJTksnOg0KICAgIGNhc2UgJ01FVEEnOg0KICAgIGJyZWFrOw0KICAgICAgICAgICAgDQogICAgZGVmYXVsdDoNCiAgICAgICAgYXBwbHkgPSB0cnVlOw0KICAgIGJyZWFrOw0KfQ0KDQovKg0KKiB1cGRhdGUgZ2V0cyBjYWxsZWQgZHVyaW5nIHJlc2l6ZSBldmVudHMsIHRoZW4gd2FpdHMgdW50aWwgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgcmVzaXplIGV2ZW50cywgYW5kIGZpbmFsbHkgdHJpZ2dlcnMgYSByZWNhbGN1bGF0aW9uDQoqLw0KZnVuY3Rpb24gdXBkYXRlKCl7DQogICAgaWYocmVzaXpldGltZW91dCAhPT0gbnVsbCl7DQogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVzaXpldGltZW91dCk7DQogICAgfQ0KICAgIHJlc2l6ZXRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICByZXN0b3JlKCk7DQogICAgICAgIGluaXQoKTsNCiAgICAgICAgcmVzaXpldGltZW91dCA9IG51bGw7DQogICAgfSwxMDApOw0KfQ0KDQovKg0KKiByZXN0b3JlIGdldHMgY2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIGlzIGJlaW5nIGRldGFjaGVkIChzZWUgZXZlbnQgYmluZGluZyBhdCB0aGUgdG9wKSwNCiogcmVzZXRzIGV2ZXJ5dGhpbmcgbGlrZSBpdCB3YXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiZWhhdmlvcg0KKi8NCmZ1bmN0aW9uIHJlc3RvcmUoKXsNCiAgICBpZihhcHBseSl7DQogICAgICAgIGVsZW1lbnQucnVudGltZVN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgid2lkdGgiKTsNCiAgICAgICAgZWxlbWVudC5ydW50aW1lU3R5bGUucmVtb3ZlQXR0cmlidXRlKCJoZWlnaHQiKTsNCiAgICB9DQp9DQoNCi8qDQoqIGluaXQgZ2V0cyBjYWxsZWQgb25jZSBhdCB0aGUgc3RhcnQgYW5kIHRoZW4gbmV2ZXIgYWdhaW4sIA0KKiB0cmlnZ2VycyBib3gtc2l6aW5nIGNhbGN1bGF0aW9ucyBhbmQgdXBkYXRlcyB3aWR0aCBhbmQgaGVpZ2h0DQoqLw0KZnVuY3Rpb24gaW5pdCgpew0KICAgIGlmKGFwcGx5KXsNCiAgICAgICAgdXBkYXRlQm9yZGVyQm94V2lkdGgoKTsNCiAgICAgICAgdXBkYXRlQm9yZGVyQm94SGVpZ2h0KCk7DQogICAgfQ0KfQ0KDQovKg0KKiBjaGVja1Byb3BlcnR5Q2hhbmdlIGdldHMgY2FsbGVkIGFzIHNvb24gYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSBjaGFuZ2VzIA0KKiAoc2VlIGV2ZW50IGJpbmRpbmcgYXQgdGhlIHRvcCksIGl0IHRoZW4gY2hlY2tzIGlmIGFueSBwcm9wZXJ0eSBpbmZsdWVuY2luZyBpdHMgDQoqIGRpbWVuc2lvbnMgd2FzIGNoYW5nZWQgYW5kIGlmIHllcyByZWNhbGN1bGF0ZXMgd2lkdGggYW5kIGhlaWdodCANCiovDQpmdW5jdGlvbiBjaGVja1Byb3BlcnR5Q2hhbmdlKCl7DQogICAgaWYoYXBwbHkpew0KICAgICAgICB2YXIgcG4gPSBldmVudC5wcm9wZXJ0eU5hbWU7DQogICAgICAgIGlmKHBuID09PSAic3R5bGUuYm94U2l6aW5nIiAmJiBlbGVtZW50LnN0eWxlLmJveFNpemluZyA9PT0gIiIpew0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVBdHRyaWJ1dGUoImJveFNpemluZyIpOw0KICAgICAgICAgICAgZWxlbWVudC5ydW50aW1lU3R5bGUucmVtb3ZlQXR0cmlidXRlKCJib3hTaXppbmciKTsNCiAgICAgICAgICAgIGVsZW1lbnQucnVudGltZVN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgid2lkdGgiKTsNCiAgICAgICAgICAgIGVsZW1lbnQucnVudGltZVN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0Iik7DQogICAgICAgIH0NCiAgICAgICAgc3dpdGNoIChwbil7DQogICAgICAgICAgICBjYXNlICJzdHlsZS53aWR0aCI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5ib3JkZXJMZWZ0V2lkdGgiOg0KICAgICAgICAgICAgY2FzZSAic3R5bGUuYm9yZGVyTGVmdFN0eWxlIjoNCiAgICAgICAgICAgIGNhc2UgInN0eWxlLmJvcmRlclJpZ2h0V2lkdGgiOg0KICAgICAgICAgICAgY2FzZSAic3R5bGUuYm9yZGVyUmlnaHRTdHlsZSI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5wYWRkaW5nTGVmdCI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5wYWRkaW5nUmlnaHQiOg0KICAgICAgICAgICAgICAgIC8vYWxlcnQoMik7DQogICAgICAgICAgICAgICAgdXBkYXRlQm9yZGVyQm94V2lkdGgoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICANCiAgICAgICAgICAgIGNhc2UgInN0eWxlLmhlaWdodCI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5ib3JkZXJUb3BXaWR0aCI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5ib3JkZXJUb3BTdHlsZSI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5ib3JkZXJCb3R0b21TdHlsZSI6DQogICAgICAgICAgICBjYXNlICJzdHlsZS5wYWRkaW5nVG9wIjoNCiAgICAgICAgICAgIGNhc2UgInN0eWxlLnBhZGRpbmdCb3R0b20iOg0KICAgICAgICAgICAgICAgIHVwZGF0ZUJvcmRlckJveEhlaWdodCgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIA0KICAgICAgICAgICAgY2FzZSAiY2xhc3NOYW1lIjoNCiAgICAgICAgICAgIGNhc2UgInN0eWxlLmJveFNpemluZyI6DQogICAgICAgICAgICAgICAgdXBkYXRlQm9yZGVyQm94V2lkdGgoKTsNCiAgICAgICAgICAgICAgICB1cGRhdGVCb3JkZXJCb3hIZWlnaHQoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQovKiANCiAqIEhlbHBlciBmdW5jdGlvbiwgdGFrZW4gZnJvbSBEZWFuIEVkd2FyZCdzIElFNyBmcmFtZXdvcmssDQogKiBhZGRlZCBieSBTY2hlcHAgb24gMTIuMDYuMjAxMC4NCiAqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9pZTctanMvDQogKg0KICogQWxsb3dzIHVzIHRvIGNvbnZlcnQgZnJvbSByZWxhdGl2ZSB0byBwaXhlbC12YWx1ZXMuDQogKi8NCmZ1bmN0aW9uIGdldFBpeGVsVmFsdWUodmFsdWUpew0KICAgIHZhciBQSVhFTCA9IC9eXGQrKHB4KT8kL2k7DQogICAgaWYgKFBJWEVMLnRlc3QodmFsdWUpKSByZXR1cm4gcGFyc2VJbnQodmFsdWUpOw0KICAgIHZhciBzdHlsZSA9IGVsZW1lbnQuc3R5bGUubGVmdDsNCiAgICB2YXIgcnVudGltZVN0eWxlID0gZWxlbWVudC5ydW50aW1lU3R5bGUubGVmdDsNCiAgICBlbGVtZW50LnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxlbWVudC5jdXJyZW50U3R5bGUubGVmdDsNCiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSB2YWx1ZSB8fCAwOw0KICAgIHZhbHVlID0gcGFyc2VJbnQoZWxlbWVudC5zdHlsZS5waXhlbExlZnQpOw0KICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IHN0eWxlOw0KICAgIGVsZW1lbnQucnVudGltZVN0eWxlLmxlZnQgPSBydW50aW1lU3R5bGU7DQogICAgDQogICAgcmV0dXJuIHZhbHVlOw0KfQ0KDQpmdW5jdGlvbiBnZXRQaXhlbFdpZHRoKG9iamVjdCwgdmFsdWUpew0KICAgIC8vIEZvciBQaXhlbCBWYWx1ZXMNCiAgICB2YXIgUElYRUwgPSAvXlxkKyhweCk/JC9pOw0KICAgIGlmIChQSVhFTC50ZXN0KHZhbHVlKSkgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTsNCiAgICANCiAgICAvLyBGb3IgUGVyY2VudGFnZSBWYWx1ZXMNCiAgICB2YXIgUEVSQ0VOVCA9IC9eW1xkXC5dKyUkL2k7DQogICAgaWYgKFBFUkNFTlQudGVzdCh2YWx1ZSkpew0KICAgICAgICB0cnl7DQogICAgICAgICAgICBwYXJlbnRXaWR0aCA9IGdldFBpeGVsV2lkdGgob2JqZWN0LnBhcmVudEVsZW1lbnQsKG9iamVjdC5wYXJlbnRFbGVtZW50LmN1cnJlbnRTdHlsZS53aWR0aCAhPSAiYXV0byIgPyBvYmplY3QucGFyZW50RWxlbWVudC5jdXJyZW50U3R5bGUud2lkdGggOiAiMTAwJSIpKTsNCiAgICAgICAgICAgIHZhbHVlID0gKHBhcnNlRmxvYXQodmFsdWUpIC8gMTAwKSAqIHBhcmVudFdpZHRoOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGUpew0KICAgICAgICAgICAgdmFsdWUgPSAocGFyc2VGbG9hdCh2YWx1ZSkgLyAxMDApICogZWxlbWVudC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTsNCiAgICB9DQogICAgDQogICAgLy8gRm9yIEVNIFZhbHVlcw0KICAgIHZhciBzdHlsZSA9IG9iamVjdC5zdHlsZS5sZWZ0Ow0KICAgIHZhciBydW50aW1lU3R5bGUgPSBvYmplY3QucnVudGltZVN0eWxlLmxlZnQ7DQogICAgb2JqZWN0LnJ1bnRpbWVTdHlsZS5sZWZ0ID0gb2JqZWN0LmN1cnJlbnRTdHlsZS5sZWZ0Ow0KICAgIG9iamVjdC5zdHlsZS5sZWZ0ID0gdmFsdWUgfHwgMDsNCiAgICB2YWx1ZSA9IHBhcnNlSW50KG9iamVjdC5zdHlsZS5waXhlbExlZnQpOw0KICAgIG9iamVjdC5zdHlsZS5sZWZ0ID0gc3R5bGU7DQogICAgb2JqZWN0LnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnVudGltZVN0eWxlOw0KICAgIA0KICAgIHJldHVybiB2YWx1ZTsNCn0NCg0KZnVuY3Rpb24gZ2V0UGl4ZWxIZWlnaHQob2JqZWN0LCB2YWx1ZSl7DQogICAgLy8gRm9yIFBpeGVsIFZhbHVlcw0KICAgIHZhciBQSVhFTCA9IC9eXGQrKHB4KT8kL2k7DQogICAgaWYgKFBJWEVMLnRlc3QodmFsdWUpKSByZXR1cm4gcGFyc2VJbnQodmFsdWUpOw0KICAgIA0KICAgIC8vIEZvciBQZXJjZW50YWdlIFZhbHVlcw0KICAgIHZhciBQRVJDRU5UID0gL15bXGRcLl0rJSQvaTsNCiAgICBpZiAoUEVSQ0VOVC50ZXN0KHZhbHVlKSl7DQogICAgICAgIHRyeXsNCiAgICAgICAgICAgIGlmKG9iamVjdC5wYXJlbnRFbGVtZW50LmN1cnJlbnRTdHlsZS5oZWlnaHQgIT0gImF1dG8iKXsNCiAgICAgICAgICAgICAgICBzd2l0Y2gob2JqZWN0LnBhcmVudEVsZW1lbnQubm9kZU5hbWUpew0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SGVpZ2h0ID0gZ2V0UGl4ZWxIZWlnaHQob2JqZWN0LnBhcmVudEVsZW1lbnQsb2JqZWN0LnBhcmVudEVsZW1lbnQuY3VycmVudFN0eWxlLmhlaWdodCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihwYXJlbnRIZWlnaHQgIT09ICJhdXRvIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAocGFyc2VGbG9hdCh2YWx1ZSkgLyAxMDApICogcGFyZW50SGVpZ2h0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiYXV0byI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnSFRNTCc6DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRIZWlnaHQgPSBlbGVtZW50LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihwYXJlbnRIZWlnaHQgIT09ICJhdXRvIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAocGFyc2VGbG9hdCh2YWx1ZSkgLyAxMDApICogcGFyZW50SGVpZ2h0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiYXV0byI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZih2YWx1ZSAhPT0gImF1dG8iKSB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhbHVlID0gImF1dG8iOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGUpew0KICAgICAgICAgICAgdmFsdWUgPSAiYXV0byI7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIH0NCiAgICANCiAgICAvLyBGb3IgRU0gVmFsdWVzDQogICAgdmFyIHN0eWxlID0gb2JqZWN0LnN0eWxlLmxlZnQ7DQogICAgdmFyIHJ1bnRpbWVTdHlsZSA9IG9iamVjdC5ydW50aW1lU3R5bGUubGVmdDsNCiAgICBvYmplY3QucnVudGltZVN0eWxlLmxlZnQgPSBvYmplY3QuY3VycmVudFN0eWxlLmxlZnQ7DQogICAgb2JqZWN0LnN0eWxlLmxlZnQgPSB2YWx1ZSB8fCAwOw0KICAgIHZhbHVlID0gcGFyc2VJbnQob2JqZWN0LnN0eWxlLnBpeGVsTGVmdCk7DQogICAgb2JqZWN0LnN0eWxlLmxlZnQgPSBzdHlsZTsNCiAgICBvYmplY3QucnVudGltZVN0eWxlLmxlZnQgPSBydW50aW1lU3R5bGU7DQogICAgDQogICAgcmV0dXJuIHZhbHVlOw0KfQ0KDQoNCi8qDQogKiBnZXRCb3JkZXJXaWR0aCAmIGZyaWVuZHMNCiAqIEJvcmRlciB3aWR0aCBnZXR0ZXJzDQogKi8NCmZ1bmN0aW9uIGdldEJvcmRlcldpZHRoKHNTaWRlKXsNCiAgICBpZihlbGVtZW50LmN1cnJlbnRTdHlsZVsiYm9yZGVyIiArIHNTaWRlICsgIlN0eWxlIl0gPT0gIm5vbmUiKXsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KICAgIHZhciBuID0gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LmN1cnJlbnRTdHlsZVsiYm9yZGVyIiArIHNTaWRlICsgIldpZHRoIl0pOw0KICAgIHJldHVybiBuIHx8IDA7DQp9DQpmdW5jdGlvbiBnZXRCb3JkZXJMZWZ0V2lkdGgoKSB7IHJldHVybiBnZXRCb3JkZXJXaWR0aCgiTGVmdCIpOyB9DQpmdW5jdGlvbiBnZXRCb3JkZXJSaWdodFdpZHRoKCkgeyByZXR1cm4gZ2V0Qm9yZGVyV2lkdGgoIlJpZ2h0Iik7IH0NCmZ1bmN0aW9uIGdldEJvcmRlclRvcFdpZHRoKCkgeyByZXR1cm4gZ2V0Qm9yZGVyV2lkdGgoIlRvcCIpOyB9DQpmdW5jdGlvbiBnZXRCb3JkZXJCb3R0b21XaWR0aCgpIHsgcmV0dXJuIGdldEJvcmRlcldpZHRoKCJCb3R0b20iKTsgfQ0KDQoNCi8qDQogKiBnZXRQYWRkaW5nICYgZnJpZW5kcw0KICogUGFkZGluZyB3aWR0aCBnZXR0ZXJzDQogKi8NCmZ1bmN0aW9uIGdldFBhZGRpbmcoc1NpZGUpIHsNCiAgICB2YXIgbiA9IGdldFBpeGVsVmFsdWUoZWxlbWVudC5jdXJyZW50U3R5bGVbInBhZGRpbmciICsgc1NpZGVdKTsNCiAgICByZXR1cm4gbiB8fCAwOw0KfQ0KZnVuY3Rpb24gZ2V0UGFkZGluZ0xlZnQoKSB7IHJldHVybiBnZXRQYWRkaW5nKCJMZWZ0Iik7IH0NCmZ1bmN0aW9uIGdldFBhZGRpbmdSaWdodCgpIHsgcmV0dXJuIGdldFBhZGRpbmcoIlJpZ2h0Iik7IH0NCmZ1bmN0aW9uIGdldFBhZGRpbmdUb3AoKSB7IHJldHVybiBnZXRQYWRkaW5nKCJUb3AiKTsgfQ0KZnVuY3Rpb24gZ2V0UGFkZGluZ0JvdHRvbSgpIHsgcmV0dXJuIGdldFBhZGRpbmcoIkJvdHRvbSIpOyB9DQoNCg0KDQovKg0KICogZ2V0Qm94U2l6aW5nDQogKiBHZXQgdGhlIGJveC1zaXppbmcgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQNCiAqLw0KZnVuY3Rpb24gZ2V0Qm94U2l6aW5nKCl7DQogICAgdmFyIHMgPSBlbGVtZW50LnN0eWxlOw0KICAgIHZhciBjcyA9IGVsZW1lbnQuY3VycmVudFN0eWxlDQogICAgaWYodHlwZW9mIHMuYm94U2l6aW5nICE9ICJ1bmRlZmluZWQiICYmIHMuYm94U2l6aW5nICE9ICIiKXsNCiAgICAgICAgcmV0dXJuIHMuYm94U2l6aW5nOw0KICAgIH0NCiAgICBpZih0eXBlb2Ygc1siYm94LXNpemluZyJdICE9ICJ1bmRlZmluZWQiICYmIHNbImJveC1zaXppbmciXSAhPSAiIil7DQogICAgICAgIHJldHVybiBzWyJib3gtc2l6aW5nIl07DQogICAgfQ0KICAgIGlmKHR5cGVvZiBjcy5ib3hTaXppbmcgIT0gInVuZGVmaW5lZCIgJiYgY3MuYm94U2l6aW5nICE9ICIiKXsNCiAgICAgICAgcmV0dXJuIGNzLmJveFNpemluZzsNCiAgICB9DQogICAgaWYodHlwZW9mIGNzWyJib3gtc2l6aW5nIl0gIT0gInVuZGVmaW5lZCIgJiYgY3NbImJveC1zaXppbmciXSAhPSAiIil7DQogICAgICAgIHJldHVybiBjc1siYm94LXNpemluZyJdOw0KICAgIH0NCiAgICByZXR1cm4gZ2V0RG9jdW1lbnRCb3hTaXppbmcoKTsNCn0NCg0KDQovKg0KICogZ2V0RG9jdW1lbnRCb3hTaXppbmcNCiAqIEdldCB0aGUgZGVmYXVsdCBkb2N1bWVudCBib3ggc2l6aW5nIChjaGVjayBmb3IgcXVpcmtzIG1vZGUpDQogKi8NCmZ1bmN0aW9uIGdldERvY3VtZW50Qm94U2l6aW5nKCl7DQogICAgaWYoZG9jLmNvbXBhdE1vZGUgPT09IG51bGwgfHwgZG9jLmNvbXBhdE1vZGUgPT09ICJCYWNrQ29tcGF0Iil7DQogICAgICAgIHJldHVybiAiYm9yZGVyLWJveCI7DQogICAgfQ0KICAgIHJldHVybiAiY29udGVudC1ib3giDQp9DQoNCg0KLyoNCiAqIHNldEJvcmRlckJveFdpZHRoICYgZnJpZW5kcw0KICogV2lkdGggYW5kIGhlaWdodCBzZXR0ZXJzDQogKi8NCmZ1bmN0aW9uIHNldEJvcmRlckJveFdpZHRoKG4pew0KICAgIGVsZW1lbnQucnVudGltZVN0eWxlLndpZHRoID0gTWF0aC5tYXgoMCwgbiAtIGdldEJvcmRlckxlZnRXaWR0aCgpIC0NCiAgICAgICAgZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpIC0gZ2V0Qm9yZGVyUmlnaHRXaWR0aCgpKSArICJweCI7DQp9DQpmdW5jdGlvbiBzZXRCb3JkZXJCb3hIZWlnaHQobil7DQogICAgZWxlbWVudC5ydW50aW1lU3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgbiAtIGdldEJvcmRlclRvcFdpZHRoKCkgLQ0KICAgICAgICBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCkgLSBnZXRCb3JkZXJCb3R0b21XaWR0aCgpKSArICJweCI7DQp9DQpmdW5jdGlvbiBzZXRDb250ZW50Qm94V2lkdGgobil7DQogICAgZWxlbWVudC5ydW50aW1lU3R5bGUud2lkdGggPSBNYXRoLm1heCgwLCBuICsgZ2V0Qm9yZGVyTGVmdFdpZHRoKCkgKw0KICAgICAgICBnZXRQYWRkaW5nTGVmdCgpICsgZ2V0UGFkZGluZ1JpZ2h0KCkgKyBnZXRCb3JkZXJSaWdodFdpZHRoKCkpICsgInB4IjsNCn0NCmZ1bmN0aW9uIHNldENvbnRlbnRCb3hIZWlnaHQobil7DQogICAgZWxlbWVudC5ydW50aW1lU3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgbiArIGdldEJvcmRlclRvcFdpZHRoKCkgKw0KICAgICAgICBnZXRQYWRkaW5nVG9wKCkgKyBnZXRQYWRkaW5nQm90dG9tKCkgKyBnZXRCb3JkZXJCb3R0b21XaWR0aCgpKSArICJweCI7DQp9DQoNCg0KLyoNCiAqIHVwZGF0ZUJvcmRlckJveFdpZHRoICYgdXBkYXRlQm9yZGVyQm94SGVpZ2h0DQogKiANCiAqLw0KZnVuY3Rpb24gdXBkYXRlQm9yZGVyQm94V2lkdGgoKSB7DQogICAgaWYoZ2V0RG9jdW1lbnRCb3hTaXppbmcoKSA9PSBnZXRCb3hTaXppbmcoKSl7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgdmFyIGNzdyA9IGVsZW1lbnQuY3VycmVudFN0eWxlLndpZHRoOw0KICAgIGlmKGNzdyAhPSAiYXV0byIpew0KICAgICAgICBjc3cgPSBnZXRQaXhlbFdpZHRoKGVsZW1lbnQsY3N3KTsNCiAgICAgICAgaWYoZ2V0Qm94U2l6aW5nKCkgPT0gImJvcmRlci1ib3giKXsNCiAgICAgICAgICAgIHNldEJvcmRlckJveFdpZHRoKHBhcnNlSW50KGNzdykpOw0KICAgICAgICB9DQogICAgICAgIGVsc2V7DQogICAgICAgICAgICBzZXRDb250ZW50Qm94V2lkdGgocGFyc2VJbnQoY3N3KSk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHVwZGF0ZUJvcmRlckJveEhlaWdodCgpIHsNCiAgICBpZihnZXREb2N1bWVudEJveFNpemluZygpID09IGdldEJveFNpemluZygpKXsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICB2YXIgY3NoID0gZWxlbWVudC5jdXJyZW50U3R5bGUuaGVpZ2h0Ow0KICAgIGlmKGNzaCAhPSAiYXV0byIpew0KICAgICAgICBjc2ggPSBnZXRQaXhlbEhlaWdodChlbGVtZW50LGNzaCk7DQogICAgICAgIGlmKGNzaCAhPT0gImF1dG8iKXsNCiAgICAgICAgICAgIGlmKGdldEJveFNpemluZygpID09ICJib3JkZXItYm94Iil7DQogICAgICAgICAgICAgICAgc2V0Qm9yZGVyQm94SGVpZ2h0KHBhcnNlSW50KGNzaCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZXsNCiAgICAgICAgICAgICAgICBzZXRDb250ZW50Qm94SGVpZ2h0KHBhcnNlSW50KGNzaCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIFJ1biB0aGUgY2FsY3VsYXRpb25zDQppbml0KCk7DQoNCi8vXV0+DQo8L3NjcmlwdD4NCjwvY29tcG9uZW50Pg==iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFCAYAAACXU8ZrAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO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