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

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PD9waHANCi8vaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2p..

Decoded Output download

?>b'<?php
//header(\'Content-Type: application/json\');
include (\'../include/config.php\');
include (\'../include/function.php\');


if(isset($_GET["Type"])) $Type = strval($_GET["Type"]);
if(isset($_GET["KhaznaID"])) $KhaznaID = strval($_GET["KhaznaID"]);

if (strval($_GET["Type"]) == \'Khazna\') {
if(isset($KhaznaID)){
    if($KhaznaID != 0){
$sql = "
SELECT *,
(SELECT TOP (1) [CurrencyID] FROM Khazna WHERE [ID] = KhaznaUsers.[KhaznaID]) AS CurrencyID
FROM KhaznaUsers WHERE [KhaznaID] = \'".$KhaznaID."\' AND [UserID] = \'".$NewUSERID."\'";
$ItemString = sqlsrv_query($conn,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
$fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
$result = array();
if (sqlsrv_has_rows($ItemString)) {
$result[] = $fetch;
print json_encode($fetch);
}else{
    $err[] = \'&#1594;&#1610;&#1585; &#1605;&#1587;&#1605;&#1608;&#1581; &#1604;&#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605; &#1576;&#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1607;&#1584;&#1607; &#1575;&#1604;&#1582;&#1586;&#1610;&#1606;&#1577;\';
     echo json_encode(array("status"=>false,"err"=>$err));
}
sqlsrv_free_stmt($ItemString);
sqlsrv_close($conn);
    }
}
}else if (strval($_GET["Type"]) == \'Bank\') {
if(isset($_GET["BankID"])) $BankID = strval($_GET["BankID"]);
if(isset($BankID)){
    if($BankID != 0){
        $sql = "SELECT * FROM BankUsers WHERE [BankID] = \'".$BankID."\' AND [UserID] = \'".$NewUSERID."\'";
        $StoreListString = sqlsrv_query($conn1,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
        $result = array();
        if (sqlsrv_has_rows($StoreListString)) {
        if($fetch = sqlsrv_fetch_array($StoreListString, SQLSRV_FETCH_ASSOC)) {
$sql1 = "SELECT * FROM BankAccounts WHERE [BankID] = \'".$BankID."\'";
$BankACC = sqlsrv_query($conn2,$sql1) or die(print_r(sqlsrv_errors(),true));
if (sqlsrv_has_rows($BankACC)) {
while ($fetchT = sqlsrv_fetch_array($BankACC,SQLSRV_FETCH_ASSOC)){
$result[] = $fetchT;
        }
echo json_encode(array(\'data\' => $result));
    }
 }
        }else{
            $err[] = \'&#1594;&#1610;&#1585; &#1605;&#1587;&#1605;&#1608;&#1581; &#1604;&#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605; &#1576;&#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1607;&#1584;&#1575; &#1575;&#1604;&#1576;&#1606;&#1603;\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
sqlsrv_free_stmt($StoreListString);
sqlsrv_close($conn1);
sqlsrv_close($conn2);
    }
}
}else if (strval($_GET["Type"]) == \'GetClientName\') {
$sql1 = "SELECT * FROM Clients WHERE [Status] = \'True\' ORDER BY CAST([IDV] AS int) ASC";
$ClientsA = sqlsrv_query($conn3,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
if (sqlsrv_has_rows($ClientsA)) {
while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
$result[] = $fetchT;
}
echo json_encode(array(\'data\' => $result));
}
sqlsrv_free_stmt($ClientsA);
sqlsrv_close($conn3);
}else if (strval($_GET["Type"]) == \'GetMandobName\') {
$sql1 = "SELECT * FROM Mandob ORDER BY [ID] ASC";
$ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
if (sqlsrv_has_rows($ClientsA)) {
while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
$result[] = $fetchT;
}
echo json_encode(array(\'data\' => $result));
    }
sqlsrv_free_stmt($ClientsA);
sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetKhaznaName\') {
    $sql1 = "SELECT * FROM Khazna WHERE [KhaznaStatus] = \'True\' AND [BranchID] = \'" . $NewBranchID . "\' ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn5,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn5);
}else if (strval($_GET["Type"]) == \'GetCurrencyIDName\') {
    $sql1 = "SELECT * FROM Currency  ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn6,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn6);
}else if (strval($_GET["Type"]) == \'GetBankIDName\') {
    $sql1 = "SELECT * FROM Bank WHERE [BankStatus] = \'True\' ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn7,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn7);
}else if (strval($_GET["Type"]) == \'GetStoreIDName\') {
    $sql1 = "SELECT * FROM Stores WHERE [StoreStatus] = \'True\' AND [BranchID] = \'" . $NewBranchID . "\' ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn8,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn8);
}else if (strval($_GET["Type"]) == \'GetStoreUsers\') {
    if(isset($_GET["StoreID"])) $StoreID = strval($_GET["StoreID"]);
    $sql = "SELECT * FROM StoreUsers WHERE [StoreID] = \'".$StoreID."\' AND [UserID] = \'".$NewUSERID."\'";
    $ItemString = sqlsrv_query($conn9,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1594;&#1610;&#1585; &#1605;&#1587;&#1605;&#1608;&#1581; &#1604;&#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605; &#1576;&#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1582;&#1586;&#1606;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn9);
}else if (strval($_GET["Type"]) == \'GetInvoiceIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [ID] + 1 AS [ID] FROM Invoices WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [ID] DESC),1) AS ID";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetBranchID\') {
    $sql1 = "SELECT * FROM Branch WHERE [Status] = \'True\' ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn11,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $result = array();
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn11);
 }else if (strval($_GET["Type"]) == \'GetUsersID\') {
    if(isset($_GET["BranchID"])) $BranchIDS = strval($_GET["BranchID"]);
    $msg =\'\';
    $msg =\'<option value="0">&#1575;&#1582;&#1578;&#1585; &#1575;&#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605; ....</option>\';
    
    $sql = "
SELECT Users.UserName,Users.Status,Users.ID
FROM BranchUsers LEFT OUTER JOIN
Users ON BranchUsers.UserID = Users.ID
WHERE Users.[Status] = \'True\'
AND BranchUsers.[BranchID] = \'".$BranchIDS."\'
ORDER BY Users.[IDV] ASC";
    $BranchListString = sqlsrv_query($conn12,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($BranchListString)) {
    while($fetch = sqlsrv_fetch_array($BranchListString, SQLSRV_FETCH_ASSOC)) {
        $msg .=\'<option value=\' . $fetch["ID"] . \'>\' . $fetch["UserName"] . \'</option>\';
    }
    }else{$msg .="No Users Were Found!";
    }
    
    echo $msg;
    sqlsrv_free_stmt($BranchListString);
    sqlsrv_close($conn12);
 }else if (strval($_GET["Type"]) == \'CheckLoginValue\') {
    if(isset($_GET[\'BranchNameID\'])) $BranchNameID = pesticide($_GET[\'BranchNameID\']);
    if(isset($_GET[\'UserID\'])) $UserID = pesticide($_GET[\'UserID\']);
    if(isset($_GET[\'Password\'])) $Password = pesticide($_GET[\'Password\']);
    if(isset($_GET[\'Remember\'])) $Remember = pesticide($_GET[\'Remember\']);
    $time = time();

    $sql1 = "
SELECT BranchUsers.ID,BranchUsers.UserID,BranchUsers.BranchID,
Users.UserName,Users.AccountName,Users.Password,Users.Status, 
Users.Userleval,Users.LastLogin,Users.ShowPriceListInInvoice, 
Users.LoginFrom,Users.InvoiceLimitedDisccount,Users.InvoiceLimitedStatus,Users.InvoicePaymeninfo,
Users.ItemsCreditInvoice,Users.SerialNumberValue,Users.InvoicePriceEdit,Users.UserCanDiscount, 
Users.DateEdite,Users.IDV,Branch.BrancheName
FROM BranchUsers LEFT OUTER JOIN
Branch ON BranchUsers.BranchID = Branch.ID LEFT OUTER JOIN
Users ON BranchUsers.UserID = Users.ID 
WHERE BranchUsers.[UserID] = \'".$UserID."\' 
AND BranchUsers.[BranchID] = \'".$BranchNameID."\'
AND Users.[Password] = \'".$Password."\'";
    $ClientsA = sqlsrv_query($conn13,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    $UserlevalN = $fetchT[\'Userleval\'];
    if (sqlsrv_has_rows($ClientsA)) {
       		$_SESSION[\'LoggedStatus\'] = \'True\';
			$_SESSION[\'BranchID\'] = $BranchNameID;
			$_SESSION[\'UserID\'] = $UserID;
			$_SESSION[\'LevalID\'] = $UserlevalN;			

			if ($Remember == true){
			setcookie(\'UserID\', $UserID, $time + 60 * 60 * 24 * 30);
			setcookie(\'BranchID\', $BranchNameID, $time + 60 * 60 * 24 * 30);
        }
        $err[] = \'\';
        echo json_encode(array("status"=>true,"err"=>$err));
  }else{
    unset($_SESSION[\'LoggedStatus\']);
    unset($_SESSION[\'UserID\']);
    unset($_SESSION[\'BranchID\']);
    unset($_SESSION[\'LevalID\']);
    setcookie(\'UserID\',\'\');
    setcookie(\'BranchID\',\'\');
    session_destroy();
 
     $err[] = \'&#1603;&#1604;&#1605;&#1577; &#1575;&#1604;&#1605;&#1585;&#1608;&#1585; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;&#1577;\';
     echo json_encode(array("status"=>false,"err"=>$err));
}
sqlsrv_free_stmt($ClientsA);
sqlsrv_close($conn13);
}else if (strval($_GET["Type"]) == \'GetPriceNameValue\') {
    $sql1 = "SELECT * FROM PriceList WHERE [PriceStatus] = \'True\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn14,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn14);
}else if (strval($_GET["Type"]) == \'GetItemUintName\') {
    if(isset($_GET[\'ItemCode\'])) $ItemCode = pesticide($_GET[\'ItemCode\']);
    $sql1 = "
DECLARE @ItemCode as nvarchar(max) = \'".$ItemCode."\';
SELECT * FROM Units WHERE 
([IDV] IN (SELECT Units FROM Item WHERE [ItemCode] = @ItemCode)
OR [IDV] IN  (SELECT Add_Units FROM Item WHERE [ItemCode] = @ItemCode))";
    $ClientsA = sqlsrv_query($conn15,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn15);
}else if (strval($_GET["Type"]) == \'GetItemCode\') {
    if(isset($_GET[\'ItemID\'])) $ItemID = pesticide($_GET[\'ItemID\']);
    $sql = "SELECT [ITemCode] FROM Item WHERE [ID] = \'".$ItemID."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetClientInfo\') {
    if(isset($_GET[\'ClientID\'])) $ClientID = pesticide($_GET[\'ClientID\']);
    $sql = "SELECT * FROM Clients WHERE [ID] = \'".$ClientID."\'";
    $ItemString = sqlsrv_query($conn17,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn17);
}else if (strval($_GET["Type"]) == \'GetPrice\') {
    if(isset($_GET[\'ItemCode\'])) $ItemCode = pesticide($_GET[\'ItemCode\']);
    if(isset($_GET[\'PriceID\'])) $PriceID = pesticide($_GET[\'PriceID\']);
    if(isset($_GET[\'UnitsID\'])) $UnitsID = pesticide($_GET[\'UnitsID\']);
    if(isset($_GET[\'InvoiceDateValue\'])) $InvoiceDateValue = hackedlog(pesticide($_GET[\'InvoiceDateValue\']));
    if(isset($_GET[\'ClientID\'])) $ClientID = pesticide($_GET[\'ClientID\']);

$sql = "
SET NOCOUNT ON
DECLARE @ItemCode as nvarchar(max) = \'".$ItemCode."\';
DECLARE @DefalutePirce as int = \'".intval($PriceID)."\';
DECLARE @ClientID as int = \'".intval($ClientID)."\';
DECLARE @UintID as int = (CASE WHEN \'".intval($UnitsID)."\' = 0 THEN (SELECT TOP (1) [Units] FROM Item WHERE [ItemCode] = @ItemCode) ELSE \'".intval($UnitsID)."\' END);
DEclare @DateTime as date = \'".$InvoiceDateValue."\';
;
SELECT \'True\' AS status,
ISNULL((CASE WHEN @ClientID != 0 THEN
(CASE WHEN ISNULL((SELECT TOP (1) ISNULL([ItemPrice],0) AS ItemPrice FROM ClientsItem WHERE [ClientID] = @ClientID AND [ItemID] = Item.[ID] AND [ItemPrice] IS NOT NULL),0) !=0 THEN
(SELECT TOP (1) ISNULL([ItemPrice],0) AS ItemPrice FROM ClientsItem WHERE [ClientID] = @ClientID AND [ItemID] = Item.[ID] AND [ItemPrice] IS NOT NULL)
ELSE
(CASE WHEN (SELECT TOP (1) Clients.[HowToPayValue] FROM Clients WHERE Clients.[ID] = @ClientID) = \'True\' THEN
(CASE WHEN ISNULL(Item.[ItemType],\'False\') != \'True\' THEN
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceAmount] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceAmount] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'False\') AS Decimal(38,2)),0)
ELSE
ISNULL(CAST((SELECT TOP (1) ITP.[PriceAmount] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
END)
WHEN ISNULL(Item.[ItemType],\'False\') = \'True\' THEN
(SELECT TOP (1)
(CASE WHEN ItemBandel.[PriceOneID] = @DefalutePirce THEN ItemBandel.[Price]
WHEN ItemBandel.[PriceTwoID] = @DefalutePirce THEN ItemBandel.[ItemPriceTwo]
WHEN ItemBandel.[PriceThreeID] = @DefalutePirce THEN ItemBandel.[ItemPriceThree] END)
FROM ItemBandel WHERE ItemBandel.[ITemCode] = @ItemCode)
END)
WHEN (SELECT TOP (1) Clients.[HowToPayValue] FROM Clients WHERE Clients.[ID] = @ClientID) = \'False\' THEN
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL((CASE WHEN ISNULL((SELECT TOP (1) [ItemPrice] FROM ItemNewPriceClientItem ITF WHERE ITF.[ClientID] = @ClientID AND ITF.[ItemID] = Item.[ID] AND FORMAT(@DateTime, \'yyyy/MM/dd\') BETWEEN ITF.[StartDate] AND ITF.[EndDate] AND ITF.[Status] = \'False\'),0) != 0 THEN
ISNULL((SELECT TOP (1) [ItemPrice] FROM ItemNewPriceClientItem WHERE [ClientID] = @ClientID AND [ItemID] = Item.[ID] AND FORMAT(@DateTime, \'yyyy/MM/dd\') BETWEEN [StartDate] AND [EndDate] AND [Status] = \'False\'),0)
ELSE
ISNULL((SELECT TOP (1) INVI.[ItemPrice] FROM Invoice_Item INVI WHERE INVI.[ItemID] = Item.[ID] AND INVI.[IsBonous] = \'False\' AND INVI.[ClientID] = @ClientID AND INVI.[ItemPrice] IS NOT NULL ORDER BY INVI.[ID] DESC),0)
END),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL((CASE WHEN ISNULL((SELECT TOP (1) ITC.[ItemPrice] FROM ItemNewPriceClientItem ITC WHERE ITC.[ClientID] = @ClientID AND ITC.[ItemID] = Item.[ID] AND FORMAT(@DateTime, \'yyyy/MM/dd\') BETWEEN ITC.[StartDate] AND ITC.[EndDate] AND ITC.[Status] = \'False\'),0) != 0 THEN
(SELECT TOP (1) (ITCM.[ItemPrice] / (SELECT TOP (1) ISNULL(ITO.[Add_Units_Count],1) FROM Item ITO WHERE ITO.[ID] = Item.[ID]))
FROM ItemNewPriceClientItem ITCM WHERE ITCM.[ClientID] = @ClientID AND ITCM.[ItemID] = Item.[ID] AND FORMAT(@DateTime, \'yyyy/MM/dd\') BETWEEN ITCM.[StartDate] AND ITCM.[EndDate] AND ITCM.[Status] = \'False\')
ELSE (SELECT TOP (1) [ItemPriceU] FROM Invoice_Item WHERE [ItemID] = Item.[ID] AND [IsBonous] = \'False\' AND [ClientID] = @ClientID AND [ItemPrice] IS NOT NULL ORDER BY [ID] DESC) END),0)
END)
END)
END)
WHEN @ClientID = 0 THEN
(CASE WHEN ISNULL(Item.[ItemType],\'False\') = \'False\' THEN
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceAmount] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceAmount] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'False\') AS Decimal(38,2)),0)
ELSE
ISNULL(CAST((SELECT TOP (1) ITP.[PriceAmount] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
END)

WHEN ISNULL(Item.[ItemType],\'False\') = \'True\' THEN
(SELECT TOP (1)
(CASE WHEN ItemBandel.[PriceOneID] = @DefalutePirce THEN ItemBandel.[Price]
WHEN ItemBandel.[PriceTwoID] = @DefalutePirce THEN ItemBandel.[ItemPriceTwo]
WHEN ItemBandel.[PriceThreeID] = @DefalutePirce THEN ItemBandel.[ItemPriceThree] END)
FROM ItemBandel WHERE ItemBandel.[ITemCode] = @ItemCode)
END)
END),0) AS Price,


ISNULL((CASE WHEN @ClientID != 0 THEN
(CASE WHEN ISNULL((SELECT TOP (1) ISNULL([ItemPrice],0) AS ItemPrice FROM ClientsItem WHERE [ClientID] = @ClientID AND [ItemID] = Item.[ID] AND [ItemPrice] IS NOT NULL),0) !=0 THEN 0
ELSE
(CASE WHEN (SELECT TOP (1) Clients.[HowToPayValue] FROM Clients WHERE Clients.[ID] = @ClientID) = \'True\' THEN 0
ELSE
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceLimited] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceLimited] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'False\') AS Decimal(38,2)),0)
ELSE
ISNULL(CAST((SELECT TOP (1) ITP.[PriceLimited] FROM Item_Price ITP
WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
END)
END)
END)
WHEN @ClientID = 0 THEN
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceLimited] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceLimited] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'False\') AS Decimal(38,2)),0)
ELSE
ISNULL(CAST((SELECT TOP (1) ITP.[PriceLimited] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
END)END),0) AS PriceLimited,

ISNULL((CASE WHEN @ClientID != 0 THEN
(CASE WHEN ISNULL((SELECT TOP (1) ISNULL([ItemPrice],0) AS ItemPrice FROM ClientsItem WHERE [ClientID] = @ClientID AND [ItemID] = Item.[ID] AND [ItemPrice] IS NOT NULL),0) !=0 THEN 0
ELSE
(CASE WHEN (SELECT TOP (1) Clients.[HowToPayValue] FROM Clients WHERE Clients.[ID] = @ClientID) = \'True\' THEN 0
ELSE
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceMax] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceMax] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'False\') AS Decimal(38,2)),0)
ELSE
ISNULL(CAST((SELECT TOP (1) ITP.[PriceMax] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
END)
END)
END)
WHEN @ClientID = 0 THEN
(CASE WHEN @UintID = Item.[Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceMax] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
WHEN @UintID = Item.[Add_Units] THEN
ISNULL(CAST((SELECT TOP (1) ITP.[PriceMax] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'False\') AS Decimal(38,2)),0)
ELSE
ISNULL(CAST((SELECT TOP (1) ITP.[PriceMax] FROM Item_Price ITP WHERE ITP.[PriceID] = @DefalutePirce AND ITP.[ITemCode] = Item.[ITemCode] AND ITP.[Type] = \'True\') AS Decimal(38,2)),0)
END) END),0) AS PriceMax 
FROM Item WHERE [ITemCode] = @ItemCode";
//echo \'<script type="text/javascript">alert(\' . $sql . \');  </script>\';
$ItemString = sqlsrv_query($conn18,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
$fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
$result = array();
if (sqlsrv_has_rows($ItemString)) {
$result[] = $fetch;
print json_encode($fetch);
}else{
    $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1589;&#1606;&#1601; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581; &#1576;&#1585;&#1580;&#1575;&#1569; &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1603;&#1608;&#1583; &#1575;&#1604;&#1589;&#1606;&#1601;\';
     echo json_encode(array("status"=>false,"err"=>$err));
}
sqlsrv_free_stmt($ItemString);
sqlsrv_close($conn18);
}else if (strval($_GET["Type"]) == \'ItemLastPay\') {
    if(isset($_GET["ItemID"])) $ItemID = strval($_GET["ItemID"]);
    if(isset($_GET["UintID"])) $UintID = strval($_GET["UintID"]);
    $sql = "
DEclare @ItemID as int = \'".$ItemID."\';
DEclare @UintsID as int = \'".$UintID."\';
WITH RETS AS (
SELECT
ISNULL((CASE WHEN (SELECT TOP (1) ISNULL([PayAmount],0) AS PayAmount FROM Store_Entery WHERE [ItemID] = @ItemID AND [UintsID] = (SELECT TOP (1) [Units] FROM Item WHERE [ID] = @ItemID)
AND [IsBonous] = \'False\' AND ([Type] = \'Pay\') AND [PayAmount] IS NOT NULL ORDER BY [ID] DESC) != 0 THEN
(SELECT TOP (1) ISNULL([PayAmount],0) AS PayAmount FROM Store_Entery WHERE [ItemID] = @ItemID AND [UintsID] = (SELECT TOP (1) [Units] FROM Item WHERE [ID] = @ItemID)
AND [IsBonous] = \'False\' AND ([Type] = \'Pay\') AND [PayAmount] IS NOT NULL ORDER BY [ID] DESC)
ELSE
(SELECT TOP (1) ISNULL([PayAmount],0) AS PayAmount FROM Store_Entery WHERE [ItemID] = @ItemID AND [UintsID] = (SELECT TOP (1) [Units] FROM Item WHERE [ID] = @ItemID)
AND [IsBonous] = \'False\' AND ([Type] = \'Begin\') AND [PayAmount] IS NOT NULL ORDER BY [ID] DESC)END),0) AS [PayAmountA],
ISNULL((CASE WHEN (SELECT TOP (1) ISNULL([PayAmount],0) AS PayAmount FROM Store_Entery WHERE [ItemID] = @ItemID AND [UintsID] = (SELECT TOP (1) [Add_Units] FROM Item WHERE [ID] = @ItemID)
AND [IsBonous] = \'False\' AND ([Type] = \'Pay\') AND [PayAmount] IS NOT NULL ORDER BY [ID] DESC) != 0 THEN
(SELECT TOP (1) ISNULL([PayAmount],0) AS PayAmount FROM Store_Entery WHERE [ItemID] = @ItemID AND [UintsID] = (SELECT TOP (1) [Add_Units] FROM Item WHERE [ID] = @ItemID)
AND [IsBonous] = \'False\' AND ([Type] = \'Pay\') AND [PayAmount] IS NOT NULL ORDER BY [ID] DESC)
ELSE
(SELECT TOP (1) ISNULL([PayAmount],0) AS PayAmount FROM Store_Entery WHERE [ItemID] = @ItemID AND [UintsID] = (SELECT TOP (1) [Add_Units] FROM Item WHERE [ID] = @ItemID)
AND [IsBonous] = \'False\' AND ([Type] = \'Begin\') AND [PayAmount] IS NOT NULL ORDER BY [ID] DESC) END),0) AS [PayAmountB],

(SELECT TOP (1) [Units] FROM Item WHERE [ID] = @ItemID) AS Units,
(SELECT TOP (1) [Add_Units] FROM Item WHERE [ID] = @ItemID) AS Add_Units,
(SELECT TOP (1) (CASE WHEN ISNULL([Add_Units_Count],0) = 0 THEN 1 ELSE ISNULL([Add_Units_Count],0) END) FROM Item WHERE [ID] = @ItemID) AS Add_Units_Count)
SELECT \'True\' AS status,(CASE WHEN @UintsID = Units THEN PayAmountA
WHEN @UintsID = Add_Units THEN (CASE WHEN PayAmountB = 0 THEN PayAmountA / Add_Units_Count WHEN PayAmountB != 0 THEN PayAmountB END) END) AS PriceAmount FROM RETS";
    $ItemString = sqlsrv_query($conn19,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \' \';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn19);
}else if (strval($_GET["Type"]) == \'GetItemStore\') {
    if(isset($_GET[\'StoreID\'])) $StoreID = pesticide($_GET[\'StoreID\']);
    if(isset($_GET[\'ItemID\'])) $ItemID = pesticide($_GET[\'ItemID\']);
    if(isset($_GET[\'UnitsID\'])) $UnitsID = pesticide($_GET[\'UnitsID\']);
    if(isset($_GET[\'InvoiceDateValue\'])) $InvoiceDateValue = pesticide($_GET[\'InvoiceDateValue\']);

    $sql = "
SET NOCOUNT ON 
Declare @ID As int = \'".$ItemID."\';
DECLARE @StoreID AS int = \'".$StoreID."\';
DEclare @DateTime as date = \'".$InvoiceDateValue."\';
Declare @UnitsS as int = \'".$UnitsID."\';
Declare @Add_Units_CountS as int = (SELECT (CASE WHEN ISNULL([Add_Units_Count],0) != 0 THEN ISNULL([Add_Units_Count],0) ELSE 1 END) FROM Item WHERE ID = @ID);
IF OBJECT_ID(\'tempdb..#Temp\') IS NOT NULL DROP Table #Temp;
;
SELECT * INTO #Temp FROM Store_Entery
WHERE [ItemID] = @ID
AND [StoreID] = @StoreID
AND [Date] <= FORMAT(@DateTime, \'yyyy/MM/dd\')
;
WITH RETS AS (
SELECT
ISNULL((SELECT TOP (1) [Units] FROM Item WHERE ID = @ID),0) AS Units,
ISNULL((SELECT TOP (1) [Add_Units] FROM Item WHERE ID = @ID),0) AS Add_Units,
ISNULL((Case When ISNULL((SELECT TOP (1) [Add_Units] FROM Item WHERE ID = @ID),0) != 0 THEN
((CAST(SUM(ISNULL(Plus,0)) AS INT) + CAST(SUM(ISNULL(PlusT,0)) AS INT)) -
(CAST(SUM(ISNULL(Mins,0)) AS INT) + CAST(SUM(ISNULL(MinsT,0)) AS INT))) / Cast(@Add_Units_CountS AS int)
ELSE
((SUM(ISNULL(Plus,0)) + SUM(ISNULL(PlusT,0))) - (SUM(ISNULL(Mins,0)) + SUM(ISNULL(MinsT,0))))END),0) As SUMTOTALOne,
ISNULL((Case When ISNULL((SELECT TOP (1) [Add_Units] FROM Item WHERE ID = @ID),0) != 0 THEN
(((SUM(Cast(ISNULL(Plus,0) AS decimal(18,2))) + SUM(Cast(ISNULL(PlusT,0) AS decimal(18,2)))) -
((SUM(Cast(ISNULL(Mins,0) AS decimal(18,2)))) + SUM(Cast(ISNULL(MinsT,0) AS decimal(18,2)))))) % @Add_Units_CountS End),0) As SUMTOTALTow
FROM #Temp
)
SELECT \'True\' AS status,
(CASE WHEN RETS.[SUMTOTALOne] = 0 AND RETS.[SUMTOTALTow] != 0 THEN RETS.[SUMTOTALTow] WHEN RETS.[SUMTOTALTow] = 0 AND RETS.[SUMTOTALOne] != 0 THEN RETS.[SUMTOTALOne] ELSE 0 END) AS StoreCredite
FROM RETS";
    $ItemString = sqlsrv_query($conn20,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn20);
}else if (strval($_GET["Type"]) == \'GetItemInfo\') {
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    $sql = "
SELECT *,\'True\' AS status,
ISNULL(ItemType,\'False\') AS ItemType,
(CASE WHEN ISNULL([Add_Units_Count],0) != 0 THEN ISNULL([Add_Units_Count],0) ELSE 1 END) AS Add_Units_CountA
FROM Item WHERE [ITemCode] = \'".$ITemCode."\';";
    $ItemString = sqlsrv_query($conn21,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn21);
}else if (strval($_GET["Type"]) == \'GetDiscountName\') {
    $sql1 = "SELECT * FROM DiscountAddType ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn22,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn22);
}else if (strval($_GET["Type"]) == \'GetItemValue\') {
    $sql1 = "SELECT * FROM Item WHERE [AccountType] = \'3\' AND [Item_Status] = \'True\' ORDER BY [ITemCode] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetAccountsValue\') {
    $sql1 = "SELECT * FROM AccountsDefinition WHERE [AccountType] = \'3\' ORDER BY [AccountCodeValue],[AccountLevalValue] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetAccountCode\') {
    if(isset($_GET[\'AccountCode\'])) $AccountCode = pesticide($_GET[\'AccountCode\']);
    $sql1 = "SELECT * FROM AccountsDefinition WHERE [AccountCodeValue] = \'".$AccountCode."\' AND [AccountType] = \'3\'";
    $ClientAAsA = sqlsrv_query($conn24,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581; &#1576;&#1585;&#1580;&#1575;&#1569; &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576;\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn24);
}else if (strval($_GET["Type"]) == \'GetAccountID\') {
    if(isset($_GET[\'ItemID\'])) $ItemID = pesticide($_GET[\'ItemID\']);
    $sql1 = "SELECT * FROM AccountsDefinition WHERE [ID] = \'".$ItemID."\'";
    $ClientAAsA = sqlsrv_query($conn25,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581; &#1576;&#1585;&#1580;&#1575;&#1569; &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576;\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn25);
}else if (strval($_GET["Type"]) == \'GetInvoiceIDDaily\') {
    if(isset($_GET[\'Date\'])) $Date = pesticide($_GET[\'Date\']);
    $sql1 = "
Declare @InvoiceDateValue as date = \'" . $Date . "\';
SELECT (SELECT FORMAT(@InvoiceDateValue, \'yyyy\') + FORMAT(@InvoiceDateValue, \'MM\') + FORMAT(@InvoiceDateValue, \'dd\') + \'-\' +
CAST((CASE WHEN (SELECT COUNT([IDDaily]) FROM Invoices WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\')) = 0 THEN \'1\'
ELSE (SELECT COUNT([IDDaily]) + 1 AS [IDDaily] FROM Invoices WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\'))
END) AS varchar(max))) AS Date";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}else if (strval($_GET["Type"]) == \'CurrencySarf\') {
    if(isset($_GET[\'CurrencyID\'])) $CurrencyID = pesticide($_GET[\'CurrencyID\']);
    $sql1 = "SELECT TOP (1) [CurrencyExchange] FROM Currency WHERE [ID] = \'" . $CurrencyID . "\'";
    $ClientAAsA = sqlsrv_query($conn27,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581; &#1576;&#1585;&#1580;&#1575;&#1569; &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576;\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn27);
}else if (strval($_GET["Type"]) == \'GetAccountName\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [SalesAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID 
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT [ID],[AccountNameValue],[AccountType],(SELECT TOP (1) [SalesLocalAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\') AS [SalesLocalAccount]
FROM #Results ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn28,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn28);
}else if (strval($_GET["Type"]) == \'GetPOIDS\') {
    $sql1 = "
;WITH RETS AS (
SELECT Clients.ClientName,SPO.IDV,SPO.DateTime,SPO.ID,SPO.Status,SPO.BranchID,SPO.ClientID,
(CAST(SPO.IDV as varchar(max)) + space(1) +  \'|\' + space(1) + CAST(SPO.DateTime as varchar(max)) + space(1) + \'|\' + space(1) + Clients.ClientName) AS Info,
ISNULL(SPO.TotalItemValue,0) AS QtyTotal,
(SELECT (ISNULL(SUM(Invoice_Item.[Quantity]),0) + ISNULL(SUM(Invoice_Item.[SubQuantity]),0)) FROM Invoice_Item WHERE Invoice_Item.[ClientPOIDItemV] = SPO.[ID]) AS TotalQty
FROM SPO LEFT OUTER JOIN
Clients ON SPO.ClientID = Clients.ID
WHERE SPO.[BranchID] = \'".$NewBranchID."\')
SELECT * FROM RETS
WHERE (RETS.QtyTotal > RETS.TotalQty)
AND Status = 0
ORDER BY RETS.[IDV] ASC";
    $ClientsA = sqlsrv_query($conn29,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn29);
}else if (strval($_GET["Type"]) == \'GetCarName\') {
    $sql1 = "SELECT * FROM Cars ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetCostCenterName\') {
    $sql1 = "SELECT * FROM CostCenter ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn);
}else if (strval($_GET["Type"]) == \'GetClientCredite\') {
    if(isset($_GET[\'ClientID\'])) $ClientID = pesticide($_GET[\'ClientID\']);
    $sql = "SELECT SUM(ISNULL(Plus, 0) - ISNULL(Mins, 0)) AS TotalPlus FROM Clients_Entery WHERE [ClientID] = \'".$ClientID."\'";
    $ItemString = sqlsrv_query($conn31,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn31);
}else if (strval($_GET["Type"]) == \'GetGoToClientInvoices\') {
    if(isset($_GET[\'InvoiceID\'])) $InvoiceID = pesticide($_GET[\'InvoiceID\']);
    $sql = "SELECT ISNULL(GotoClientAccount, 0) AS GotoClientAccount FROM Invoices WHERE [InvoiceID] = \'".$InvoiceID."\'";
    $ItemString = sqlsrv_query($conn32,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);
}else if (strval($_GET["Type"]) == \'SaveItemG\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemName\'])) $ITemName = pesticide($_GET[\'ITemName\']);

        $sql123 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
DEclare @ItemID as int = 0;
DEclare @BranchID as int = \'".$NewBranchID."\';
DEclare @ItemName as nvarchar(max) = \'" . $ITemName . "\';
Declare @ItemCode AS nvarchar(MAX) = 0;
DEclare @status as nvarchar(max) = \'true\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM Item WHERE [Item_Name] = @ItemName) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM Item WHERE [Item_Name] = @ItemName AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN
INSERT INTO Item(
[ITemCode],[Item_Name],[HaveFather],[Item_NameEN],[Barcode],[BarCodeAddUnits],[PartNo],[Addtion_Code],[Order_Limited],[ItemSize],[Units],[Add_Units],[Add_Units_Count],
[Sales_Tax],[Item_Status],[IS_Store],[IS_Tax],[Item_Country],[Item_Where],[Additon_Item],[Item_Desc],[ReferenceValue],[AccountType],[AccountLevalValue],
[SerialNumberValue],[MaxBouns],[SectionsID],[ItemCost],[PriceOneID],[PriceTwoID],[ItemTypeNew]
)VALUES(
((CASE WHEN (SELECT TOP (1) Cast([ITemCode] as decimal(38,00)) + 1 AS ITemCode FROM Item WHERE [AccountType] = \'1\' AND [ITemCode] IS NOT NULL AND [ItemType] IS NULL ORDER BY [ID] DESC) IS NOT NULL THEN
CAST(\'00\' AS nvarchar(max)) + CAST((SELECT TOP (1) Cast([ITemCode] as decimal(38,00)) + 1 FROM Item WHERE [AccountType] = \'1\' AND [ITemCode] IS NOT NULL AND [ItemType] IS NULL ORDER BY [ID] DESC) AS nvarchar(max))

WHEN  (SELECT TOP (1) Cast([ITemCode] as decimal(38,00)) + 1 AS ITemCode FROM Item WHERE [AccountType] = \'1\' AND [ITemCode] IS NOT NULL AND [ItemType] IS NULL ORDER BY [ID] DESC) IS NULL THEN
CAST(\'00\' AS nvarchar(max)) + CAST((SELECT ISNULL([CategoryIDStartup],0) FROM CompanyInfo WHERE [BranchID] = @BranchID) AS nvarchar(max))
END)),
@ItemName,\'0\',\'\',\'\',\'\',\'\',\'\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'True\',\'True\',\'False\',\'\',\'0\',\'0\',\'\',\'\',\'1\',\'1\',\'False\',\'0\',\'0\',\'0\',\'0\',\'0\',\'True\')
SET @ItemID = (SELECT @@Identity);
SELECT @ItemCode = [ItemCode] FROM Item WHERE [ID] = @ItemID
END ELSE IF @CTID != 0 BEGIN
UPDATE Item SET [Item_Name] = @ItemName WHERE [ID] = @CTID
SELECT @ItemCode = [ItemCode],@ItemID = [ID] FROM Item WHERE [ID] = @CTID
END
END
;
SELECT @ItemCode AS ItemCode,@ItemID AS ItemID,@status AS status";
    $ItemString = sqlsrv_query($conn32,$sql123,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ItemString)) {
    print json_encode($fetch);
    }else{
        $err[] = \'&#1575;&#1587;&#1605; &#1575;&#1604;&#1605;&#1580;&#1605;&#1608;&#1593;&#1607; &#1605;&#1603;&#1585;&#1585;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);
}else if (strval($_GET["Type"]) == \'GetDateItemCT\') {
    $sql1 = "SELECT * FROM Item WHERE [Item_Status] = \'True\' AND [AccountType] = \'1\' AND [ItemType] IS NULL ORDER BY CAST([ITemCode] AS int) ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetDateItemCTSub\') {
    if(isset($_GET[\'HaveFather\'])) $HaveFather = pesticide($_GET[\'HaveFather\']);

    $sql1 = "SELECT * FROM Item WHERE [AccountType] = \'2\' AND [HaveFather] = \'" . $HaveFather . "\' AND [ItemType] IS NULL ORDER BY CAST([ITemCode] AS Varchar(max)) ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveItemGSub\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'HaveFather\'])) $HaveFather = pesticide($_GET[\'HaveFather\']);
    if(isset($_GET[\'ITemName\'])) $ITemName = pesticide($_GET[\'ITemName\']);

        $sql123 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
Declare @ItemCode AS nvarchar(MAX) = 0;
Declare @HaveFather AS nvarchar(MAX) = \'" . $HaveFather . "\';
DEclare @status AS nvarchar(max) = \'true\';
DEclare @BranchID AS int = \'".$NewBranchID."\';
DEclare @ItemName AS nvarchar(max) = \'" . $ITemName . "\';
DEclare @ItemID AS int = 0;

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM Item WHERE [Item_Name] = @ItemName) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM Item WHERE [Item_Name] = @ItemName AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN
IF ISNULL((SELECT TOP (1) Cast(ISNULL([ITemCode],0) as decimal(38,00)) + 1 AS ITemCode 
FROM Item WHERE [HaveFather] = @HaveFather AND [ItemType] IS NULL),0) != \'0\' BEGIN
;
SELECT TOP (1) @ItemCode = Cast([ITemCode] as decimal(38,00)) + 1
FROM Item WHERE [HaveFather] = @HaveFather AND [ItemType] IS NULL 
ORDER BY [ID] DESC
;
END
ELSE IF ISNULL((SELECT TOP (1) Cast(ISNULL([ITemCode],0) as decimal(38,00)) + 1 AS ITemCode 
FROM Item WHERE [HaveFather] = @HaveFather AND [ItemType] IS NULL),0) = \'0\' BEGIN
;
SELECT @ItemCode = SUBSTRING(@HaveFather, 3, LEN(@HaveFather) -2) + \'00\' + ISNULL([CategoryIDStartup],1)
FROM CompanyInfo WHERE [BranchID] = @BranchID
END
;

INSERT INTO Item(
[ITemCode],[Item_Name],[HaveFather],[Item_NameEN],[Barcode],[BarCodeAddUnits],[PartNo],[Addtion_Code],[Order_Limited],[ItemSize],[Units],[Add_Units],[Add_Units_Count],
[Sales_Tax],[Item_Status],[IS_Store],[IS_Tax],[Item_Country],[Item_Where],[Additon_Item],[Item_Desc],[ReferenceValue],[AccountType],[AccountLevalValue],
[SerialNumberValue],[MaxBouns],[SectionsID],[ItemCost],[PriceOneID],[PriceTwoID],[ItemTypeNew]
)VALUES(
(\'00\' + @ItemCode),@ItemName,
@HaveFather,\'\',\'\',\'\',\'\',\'\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'True\',\'True\',\'False\',\'\',\'0\',\'0\',\'\',\'\',\'2\',\'2\',\'False\',\'0\',\'0\',\'0\',\'0\',\'0\',\'True\')
SET @ItemID = (SELECT @@Identity);
SELECT @ItemCode = [ItemCode] FROM Item WHERE [ID] = @ItemID
END ELSE IF @CTID != 0 BEGIN
UPDATE Item SET [Item_Name] = @ItemName WHERE [ID] = @CTID
SELECT @ItemCode = [ItemCode],@ItemID = [ID] FROM Item WHERE [ID] = @CTID
END
END

SELECT @ItemCode AS ItemCode,@ItemID AS ItemID,@status AS status";
    $ItemString = sqlsrv_query($conn32,$sql123,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ItemString)) {
    print json_encode($fetch);
    }else{
        $err[] = \'&#1575;&#1587;&#1605; &#1575;&#1604;&#1605;&#1580;&#1605;&#1608;&#1593;&#1607; &#1605;&#1603;&#1585;&#1585;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);
}else if (strval($_GET["Type"]) == \'RemoveItemCT\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($LineID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';
DECLARE @Count AS INT = 0;
DECLARE @AccountType AS INT = (SELECT TOP (1) [AccountType] FROM Item WHERE [ID] = @ID);

IF @AccountType != 3 BEGIN
With #results As (Select ID,HaveFather,ITemCode FROM Item WHERE ID = @ID
UNION ALL
SELECT T.ID,T.HaveFather,T.ITemCode FROM Item T INNER JOIN #Results R On R.ITemCode = T.HaveFather)
SELECT @Count = Count(ID) FROM #Results;

IF ISNULL(@Count,0) > 1 BEGIN
SET @status = \'HaveSub\';
END ELSE IF ISNULL(@Count,0) < 1 BEGIN
SET @status = \'trues\';
END
END

IF @AccountType = 3 BEGIN
IF Exists(SELECT [ItemID] FROM Store_Entery WHERE [ItemID] = @ID) BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT [ItemID] FROM Store_Entery WHERE [ItemID] = @ID) BEGIN
SET @status = \'trues\';
END
END

IF @status = \'trues\' BEGIN;
DELETE FROM Item WHERE [ID] = @ID;
DELETE FROM Item_Price WHERE [ITemCode] = (SELECT TOP (1) [ITemCode] FROM Item WHERE [ID] = @ID);
DELETE FROM ItemBar WHERE [ITemCode] = (SELECT TOP (1) [ITemCode] FROM Item WHERE [ID] = @ID);
END

SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetDateItems\') {
    if(isset($_GET[\'HaveFather\'])) $HaveFather = pesticide($_GET[\'HaveFather\']);

    $sql1 = "
SELECT *,
ISNULL((SELECT TOP (1) \'True\' AS Status FROM Store_Entery WHERE [ItemID] = Item.[ID]),\'False\') AS StatusA
FROM Item WHERE [AccountType] = \'3\' AND [HaveFather] = \'" . $HaveFather . "\' AND [ItemType] IS NULL ORDER BY CAST([ITemCode] AS Varchar(max)) ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetUintsNameValue\') {
    $sql1 = "SELECT * FROM Units ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveItems\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'HaveFather\'])) $HaveFather = pesticide($_GET[\'HaveFather\']);
    if(isset($_GET[\'ITemName\'])) $ITemName = pesticide($_GET[\'ITemName\']);
    if(isset($_GET[\'Units\'])) $Units = pesticide($_GET[\'Units\']);
    if(isset($_GET[\'Add_Units\'])) $Add_Units = pesticide($_GET[\'Add_Units\']);
    if(isset($_GET[\'Add_Units_Count\'])) $Add_Units_Count = pesticide($_GET[\'Add_Units_Count\']);
    if(isset($_GET[\'Order_Limited\'])) $Order_Limited = pesticide($_GET[\'Order_Limited\']);
    if(isset($_GET[\'Barcode\'])) $Barcode = pesticide($_GET[\'Barcode\']);
    if(isset($_GET[\'BarCodeAddUnits\'])) $BarCodeAddUnits = pesticide($_GET[\'BarCodeAddUnits\']);
    if(isset($_GET[\'IS_Store\'])) $IS_Store = pesticide($_GET[\'IS_Store\']);
    if(isset($_GET[\'SerialNumberValue\'])) $SerialNumberValue = pesticide($_GET[\'SerialNumberValue\']);
    if(isset($_GET[\'ItemStatus\'])) $ItemStatus = pesticide($_GET[\'ItemStatus\']);
    
    $sql1 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
Declare @ItemCode AS nvarchar(MAX) = 0;
Declare @HaveFather AS nvarchar(MAX) = \'" . $HaveFather . "\';
DEclare @status AS nvarchar(max) = \'true\';
DEclare @BranchID AS int = \'" . $NewBranchID . "\';
DEclare @ItemName AS nvarchar(max) = \'" . $ITemName . "\';
DEclare @ItemID AS int = 0;
Declare @First AS bit = \'False\';
DEclare @Units AS int = \'" . $Units . "\';
DEclare @Add_Units AS int = \'" . $Add_Units . "\';
DEclare @Add_Units_Count AS decimal(18,2) = \'" . $Add_Units_Count . "\';
DEclare @Order_Limited AS decimal(18,2) = \'" . $Order_Limited . "\';
DEclare @Barcode AS nvarchar(max) = \'" . $Barcode . "\';
DEclare @BarCodeAddUnits AS nvarchar(max) = \'" . $BarCodeAddUnits . "\';
DEclare @IS_Store AS bit = \'" . $IS_Store . "\';
DEclare @SerialNumberValue AS bit = \'" . $SerialNumberValue . "\';
DEclare @ItemStatus AS bit = \'" . $ItemStatus . "\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM Item WHERE [Item_Name] = @ItemName) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM Item WHERE [Item_Name] = @ItemName AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN

IF ISNULL((SELECT TOP (1) 
SUBSTRING(CAST([ITemCode] as nvarchar(max)),CAST(len(@HaveFather + \'00\') AS bigint),CAST(len(@HaveFather + \'00\') AS bigint)) + 1 AS ITemCode 
FROM Item WHERE [HaveFather] = @HaveFather),0) != \'0\' BEGIN
;
SET @First = \'False\';
SELECT TOP (1) @ItemCode = 

(CASE WHEN (SELECT COUNT([ID]) FROM Item WHERE [HaveFather] = @HaveFather) <= 10 THEN 
SUBSTRING(CAST([ITemCode] as nvarchar(max)),CAST(len(@HaveFather + \'00\') AS bigint),CAST(len(@HaveFather + \'00\') AS bigint)) + 1
ELSE
SUBSTRING(CAST([ITemCode] as nvarchar(max)),CAST(len(@HaveFather + \'0\') AS bigint),CAST(len(@HaveFather + \'0\') AS bigint)) + 1
END)

FROM Item WHERE [HaveFather] = @HaveFather
ORDER BY CAST([ITemCode] AS bigint) DESC
;
END
ELSE IF ISNULL((SELECT TOP (1) SUBSTRING (CAST([ITemCode] as nvarchar(max)),CAST(len(@HaveFather + \'00\') AS bigint),CAST(len(@HaveFather + \'00\') AS bigint)) + 1 AS ITemCode 
FROM Item WHERE [HaveFather] = @HaveFather),0) = \'0\' BEGIN
;
SET @First = \'True\';
SELECT @ItemCode = ISNULL([CategoryIDStartup],1) FROM CompanyInfo WHERE [BranchID] = @BranchID
END
;
INSERT INTO Item(
[ITemCode],[Item_Name],[HaveFather],[Item_NameEN],[Barcode],[BarCodeAddUnits],[PartNo],[Addtion_Code],[Order_Limited],[ItemSize],[Units],[Add_Units],[Add_Units_Count],
[Sales_Tax],[Item_Status],[IS_Store],[IS_Tax],[Item_Country],[Item_Where],[Additon_Item],[Item_Desc],[ReferenceValue],[AccountType],[AccountLevalValue],
[SerialNumberValue],[MaxBouns],[SectionsID],[ItemCost],[PriceOneID],[PriceTwoID],[BatronID],[ExpireDate],[ItemHaveNoTax],[UintThreeID],[UintThreeCount],
[BarcodeTherd],[ItemLength],[ItemWidth],[ItemHeight],[ItemTime],[VendorID],[SeasionID],[CTID],[MOFID],[ColorID],[SizeID],[TimeDeleverd],
[CanDividing],[ItemHaveSubItemValue],[CarKMV]
)VALUES(
(@HaveFather + (CASE WHEN @ItemCode <= 10 THEN (CASE WHEN @First = \'True\' THEN \'00\' 
WHEN @First = \'False\' THEN 
(CASE WHEN @ItemCode < 10 THEN \'00\' ELSE \'0\' END)END) + @ItemCode ELSE \'0\' + @ItemCode END)),
@ItemName,@HaveFather,\'\',@Barcode,@BarCodeAddUnits,\'\',\'\',\'0\',@Order_Limited,@Units,@Add_Units,@Add_Units_Count,
\'0\',@ItemStatus,@IS_Store,\'False\',\'\',\'0\',\'0\',\'\',\'\',\'3\',\'3\',@SerialNumberValue,\'0\',
\'0\',\'0\',\'0\',\'0\',\'\',\'False\',\'False\',\'0\',\'0\',\'\',\'0\',\'0\',\'0\',\'False\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'True\',\'False\',\'0\')
SET @ItemID = (SELECT @@Identity);
SELECT @ItemCode = [ItemCode] FROM Item WHERE [ID] = @ItemID

END ELSE IF @CTID != 0 BEGIN

UPDATE Item SET
[Item_Name] = @ItemName,
[Units] = @Units,
[Add_Units] = @Add_Units,
[Add_Units_Count] = @Add_Units_Count,
[Order_Limited] = @Order_Limited,
[Barcode] = @Barcode,
[BarCodeAddUnits] = @BarCodeAddUnits,
[IS_Store] = @IS_Store,
[SerialNumberValue] = @SerialNumberValue,
[SectionsID] = \'0\',
[PriceOneID] = \'0\',
[PriceTwoID] = \'0\',
[BatronID] = \'\',
[ExpireDate] = \'False\',
[ItemHaveNoTax] = \'False\',
[UintThreeID] = \'0\',
[UintThreeCount] = \'0\',
[BarcodeTherd] = \'\',
[ItemLength] = \'0\',
[ItemWidth] = \'0\',
[ItemHeight] = \'0\',
[ItemTime] = \'False\',
[TimeDeleverd] = \'0\',
[CanDividing] = \'True\',
[ItemHaveSubItemValue] = \'False\',
[Item_Status] = @ItemStatus
WHERE [ID] = @CTID

UPDATE Item SET [Item_Name] = @ItemName WHERE [ID] = @CTID
SELECT @ItemCode = [ItemCode],@ItemID = [ID] FROM Item WHERE [ID] = @CTID
END
END
SELECT @ItemCode AS ItemCode,@ItemID AS ItemID,@status AS status";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetPriceNameValue\') {
    $sql1 = "SELECT * FROM PriceList WHERE [PriceStatus] = \'True\' ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetItemPriceA\') {
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    $sql1 = "
SELECT ISNULL(ID,0) AS ID,
ISNULL(PriceAmount,0) AS PriceAmount,
ISNULL(PriceLimited,0) AS PriceLimited,
ISNULL(PriceForUser,0) AS PriceForUser,
ISNULL(PriceID,0) AS PriceID,
ISNULL(PriceMax,0) AS PriceMax
FROM Item_Price WHERE [ITemCode] = \'" . $ITemCode . "\'
AND [Type] = \'True\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetItemPriceB\') {
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    $sql1 = "
SELECT ISNULL(ID,0) AS ID,
ISNULL(PriceAmount,0) AS PriceAmount,
ISNULL(PriceLimited,0) AS PriceLimited,
ISNULL(PriceForUser,0) AS PriceForUser,
ISNULL(PriceID,0) AS PriceID,
ISNULL(PriceMax,0) AS PriceMax
FROM Item_Price WHERE [ITemCode] = \'" . $ITemCode . "\'
AND [Type] = \'False\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveItemPriceA\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    if(isset($_GET[\'UintOne\'])) $UintOne = pesticide($_GET[\'UintOne\']);
    if(isset($_GET[\'UintTwo\'])) $UintTwo = pesticide($_GET[\'UintTwo\']);
    if(isset($_GET[\'PriceID\'])) $PriceID = pesticide($_GET[\'PriceID\']);
    if(isset($_GET[\'PriceAmount\'])) $PriceAmount = pesticide($_GET[\'PriceAmount\']);
    if(isset($_GET[\'PriceLimited\'])) $PriceLimited = pesticide($_GET[\'PriceLimited\']);
    if(isset($_GET[\'PriceMax\'])) $PriceMax = pesticide($_GET[\'PriceMax\']);
    if(isset($_GET[\'PriceForUser\'])) $PriceForUser = pesticide($_GET[\'PriceForUser\']);

    $sql1 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
Declare @ITemCode AS nvarchar(MAX) = \'" . $ITemCode . "\';
DEclare @status AS nvarchar(max) = \'true\';
DEclare @ItemID AS int = \'0\';
DEclare @UintOne AS int = \'" . $UintOne . "\';
DEclare @UintTwo AS int = \'" . $UintTwo . "\';
DEclare @PriceID AS int = \'" . $PriceID . "\';
DEclare @PriceAmount AS decimal(18,2) = \'" . $PriceAmount . "\';
DEclare @PriceLimited AS decimal(18,2) = \'" . $PriceLimited . "\';
DEclare @PriceMax AS decimal(18,2) = \'" . $PriceMax . "\';
DEclare @PriceForUser AS decimal(18,2) = \'" . $PriceForUser . "\';

IF @CTID = 0 BEGIN
INSERT INTO Item_Price(
[ITemCode],[PriceID],[PriceAmount],[PriceLimited],[PriceMax],[UintsID],[Type],[PriceForUser]
)VALUES(
@ITemCode,@PriceID,@PriceAmount,@PriceLimited,@PriceMax,@UintOne,\'True\',@PriceForUser)

SET @ItemID = (SELECT @@Identity);
END ELSE IF @CTID != 0 BEGIN

UPDATE Item_Price SET 
[PriceAmount] = @PriceAmount,
[PriceLimited] = @PriceLimited,
[PriceMax] = @PriceMax,
[PriceForUser] = @PriceForUser,
[PriceID] = @PriceID,
[UintsID] = @UintOne
WHERE [ID] = @CTID

SET @ItemID = @CTID
END
SELECT @ItemID AS ItemID,@status AS status";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveItemPriceB\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    if(isset($_GET[\'UintOne\'])) $UintOne = pesticide($_GET[\'UintOne\']);
    if(isset($_GET[\'UintTwo\'])) $UintTwo = pesticide($_GET[\'UintTwo\']);
    if(isset($_GET[\'PriceID\'])) $PriceID = pesticide($_GET[\'PriceID\']);
    if(isset($_GET[\'PriceAmount\'])) $PriceAmount = pesticide($_GET[\'PriceAmount\']);
    if(isset($_GET[\'PriceLimited\'])) $PriceLimited = pesticide($_GET[\'PriceLimited\']);
    if(isset($_GET[\'PriceMax\'])) $PriceMax = pesticide($_GET[\'PriceMax\']);
    if(isset($_GET[\'PriceForUser\'])) $PriceForUser = pesticide($_GET[\'PriceForUser\']);

    $sql1 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
Declare @ITemCode AS nvarchar(MAX) = \'" . $ITemCode . "\';
DEclare @status AS nvarchar(max) = \'true\';
DEclare @ItemID AS int = \'0\';
DEclare @UintOne AS int = \'" . $UintOne . "\';
DEclare @UintTwo AS int = \'" . $UintTwo . "\';
DEclare @PriceID AS int = \'" . $PriceID . "\';
DEclare @PriceAmount AS decimal(18,2) = \'" . $PriceAmount . "\';
DEclare @PriceLimited AS decimal(18,2) = \'" . $PriceLimited . "\';
DEclare @PriceMax AS decimal(18,2) = \'" . $PriceMax . "\';
DEclare @PriceForUser AS decimal(18,2) = \'" . $PriceForUser . "\';

IF @CTID = 0 BEGIN
INSERT INTO Item_Price(
[ITemCode],[PriceID],[PriceAmount],[PriceLimited],[PriceMax],[UintsID],[Type],[PriceForUser]
)VALUES(
@ITemCode,@PriceID,@PriceAmount,@PriceLimited,@PriceMax,@UintTwo,\'False\',@PriceForUser)

SET @ItemID = (SELECT @@Identity);
END ELSE IF @CTID != 0 BEGIN

UPDATE Item_Price SET 
[PriceAmount] = @PriceAmount,
[PriceLimited] = @PriceLimited,
[PriceMax] = @PriceMax,
[PriceForUser] = @PriceForUser,
[PriceID] = @PriceID,
[UintsID] = @UintTwo
WHERE [ID] = @CTID

SET @ItemID = @CTID
END
SELECT @ItemID AS ItemID,@status AS status";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'RemoveItemPriceAB\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($LineID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';
DELETE FROM Item_Price WHERE [ID] = @ID;
SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetBarCodeA\') {
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    $sql1 = "SELECT * FROM ItemBar WHERE [ITemCode] = \'" . $ITemCode . "\' AND [Type] = \'One\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetBarCodeB\') {
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    $sql1 = "SELECT * FROM ItemBar WHERE [ITemCode] = \'" . $ITemCode . "\' AND [Type] = \'Two\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveBarCodeA\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    if(isset($_GET[\'NewCode\'])) $NewCode = pesticide($_GET[\'NewCode\']);

    $sql1 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
Declare @ITemCode AS nvarchar(MAX) = \'" . $ITemCode . "\';
DEclare @NewCode AS nvarchar(MAX) = \'" . $NewCode . "\';
DEclare @status AS nvarchar(max) = \'true\';
DEclare @ItemID AS int = \'0\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM ItemBar WHERE [NewCode] = @NewCode) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM ItemBar WHERE [NewCode] = @NewCode AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN
INSERT INTO ItemBar([ITemCode],[NewCode],[Type])VALUES(@ITemCode,@NewCode,\'One\')
SET @ItemID = (SELECT @@Identity);
END ELSE IF @CTID != 0 BEGIN
UPDATE ItemBar SET [NewCode] = @NewCode WHERE [ID] = @CTID
SET @ItemID = @CTID
END
END
SELECT @ItemID AS ItemID,@status AS status";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveBarCodeB\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemCode\'])) $ITemCode = pesticide($_GET[\'ITemCode\']);
    if(isset($_GET[\'NewCode\'])) $NewCode = pesticide($_GET[\'NewCode\']);

    $sql1 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
Declare @ITemCode AS nvarchar(MAX) = \'" . $ITemCode . "\';
DEclare @NewCode AS nvarchar(MAX) = \'" . $NewCode . "\';
DEclare @status AS nvarchar(max) = \'true\';
DEclare @ItemID AS int = \'0\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM ItemBar WHERE [NewCode] = @NewCode) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM ItemBar WHERE [NewCode] = @NewCode AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN
INSERT INTO ItemBar([ITemCode],[NewCode],[Type])VALUES(@ITemCode,@NewCode,\'Two\')

SET @ItemID = (SELECT @@Identity);
END ELSE IF @CTID != 0 BEGIN
UPDATE ItemBar SET [NewCode] = @NewCode WHERE [ID] = @CTID
SET @ItemID = @CTID
END
END
SELECT @ItemID AS ItemID,@status AS status";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'RemoveItemBarCodeAB\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($LineID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';
DELETE FROM ItemBar WHERE [ID] = @ID;
SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetUoIDV\') {
    $sql1 = "SELECT [IDV] + 1 AS [IDV] FROM Units ORDER BY [IDV] DESC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SaveUint\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemName\'])) $ITemName = pesticide($_GET[\'ITemName\']);

        $sql123 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
DEclare @ItemID as int = 0;
DEclare @BranchID as int = \'".$NewBranchID."\';
DEclare @ItemName as nvarchar(max) = \'" . $ITemName . "\';
Declare @ItemCode AS nvarchar(MAX) = 0;
DEclare @status as nvarchar(max) = \'true\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM Units WHERE [Unit_Name] = @ItemName) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM Units WHERE [Unit_Name] = @ItemName AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN

INSERT INTO Units([IDV],[Unit_Name]
)VALUES(
(SELECT (CASE WHEN
(SELECT COUNT(IDV) FROM Units) > 0 THEN 
(SELECT TOP 1 [IDV] + 1 FROM Units ORDER BY [IDV] DESC) 
ELSE 1 END) AS [IDV] FROM CompanyInfo WHERE [BranchID] = @BranchID),@ItemName)

SET @ItemID = (SELECT @@Identity);
SELECT TOP (1) @ItemCode = [IDV] FROM Units WHERE [ID] = @ItemID
END ELSE IF @CTID != 0 BEGIN
UPDATE Units SET [Unit_Name] = @ItemName WHERE [ID] = @CTID
SELECT @ItemCode = [IDV],@ItemID = [ID] FROM Units WHERE [ID] = @CTID
END
END
;
SELECT @ItemCode AS ItemCode,@ItemID AS ItemID,@status AS status";
    $ItemString = sqlsrv_query($conn32,$sql123,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ItemString)) {
    print json_encode($fetch);
    }else{
        $err[] = \'&#1575;&#1587;&#1605; &#1575;&#1604;&#1605;&#1580;&#1605;&#1608;&#1593;&#1607; &#1605;&#1603;&#1585;&#1585;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);
}else if (strval($_GET["Type"]) == \'RemoveUint\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($LineID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF Exists(SELECT [ItemID] FROM Item WHERE [Units] = @ID) BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT [ItemID] FROM Item WHERE [Units] = @ID) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN;
DELETE FROM Units WHERE [IDV] = @ID;
END

SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetPriceListValue\') {
    $sql1 = "SELECT * FROM PriceList ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'SavePriceList\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemName\'])) $ITemName = pesticide($_GET[\'ITemName\']);

        $sql123 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
DEclare @ItemID as int = 0;
DEclare @BranchID as int = \'".$NewBranchID."\';
DEclare @ItemName as nvarchar(max) = \'" . $ITemName . "\';
Declare @ItemCode AS nvarchar(MAX) = 0;
DEclare @status as nvarchar(max) = \'true\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM PriceList WHERE [PriceName] = @ItemName) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM PriceList WHERE [PriceName] = @ItemName AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN

INSERT INTO PriceList([IDV],[PriceName]
)VALUES(
(SELECT (CASE WHEN
(SELECT COUNT(IDV) FROM PriceList) > 0 THEN 
(SELECT TOP 1 [IDV] + 1 FROM PriceList ORDER BY [IDV] DESC) 
ELSE 1 END) AS [IDV] FROM CompanyInfo WHERE [BranchID] = @BranchID),@ItemName)

SET @ItemID = (SELECT @@Identity);
SELECT TOP (1) @ItemCode = [IDV] FROM PriceList WHERE [ID] = @ItemID
END ELSE IF @CTID != 0 BEGIN
UPDATE PriceList SET [PriceName] = @ItemName WHERE [ID] = @CTID
SELECT @ItemCode = [IDV],@ItemID = [ID] FROM PriceList WHERE [ID] = @CTID
END
END
;
SELECT @ItemCode AS ItemCode,@ItemID AS ItemID,@status AS status";
    $ItemString = sqlsrv_query($conn32,$sql123,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ItemString)) {
    print json_encode($fetch);
    }else{
        $err[] = \'&#1575;&#1587;&#1605; &#1575;&#1604;&#1605;&#1580;&#1605;&#1608;&#1593;&#1607; &#1605;&#1603;&#1585;&#1585;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);
}else if (strval($_GET["Type"]) == \'RemovePriceL\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($LineID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF Exists(SELECT * FROM Clients WHERE [PriceID] = @ID) BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT * FROM Clients WHERE [PriceID] = @ID) BEGIN
SET @status = \'trues\';
END

IF Exists(SELECT * FROM Item_Price WHERE [PriceID] = @ID) BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT * FROM Item_Price WHERE [PriceID] = @ID) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN;
DELETE FROM PriceList WHERE [IDV] = @ID;
END

SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetClientIDV\') {
    $sql1 = "SELECT [IDV] + 1 AS [IDV] FROM Clients ORDER BY [IDV] DESC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetAreaName\') {
    $sql1 = "SELECT * FROM Area ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetClientCTName\') {
    $sql1 = "SELECT * FROM ClientCategory ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetClientAccName\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [ClientAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID 
UNION ALL 
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT [ID],[AccountNameValue],[AccountType],(SELECT TOP (1) [ClientLocalAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\') AS [ClientLocalAccount]
FROM #Results ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetClientsTypeName\') {
    $sql1 = "SELECT * FROM ClientsType ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetVendorNameValue\') {
    $sql1 = "SELECT * FROM Vandor WHERE [VandorStatus] = \'True\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'RemoveClientItemLine\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

        $sql = "
DEclare @LineID as int = \'" . $LineID . "\';
DELETE FROM ClientsItem WHERE [ID] = @LineID
SELECT \'True\' AS Status";
    $ItemString = sqlsrv_query($conn32,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);

}else if (strval($_GET["Type"]) == \'RemoveClient\') {
    if(isset($_GET[\'ClientID\'])) $ClientID = pesticide($_GET[\'ClientID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($ClientID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF Exists(SELECT TOP (1) * FROM Clients_Entery WHERE [ClientID] = @ID AND [Type] != \'ClientBegin\') BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT TOP (1) * FROM Clients_Entery WHERE [ClientID] = @ID AND [Type] != \'ClientBegin\') BEGIN
SET @status = \'trues\';
END

if @status = \'trues\' BEGIN
IF Exists(SELECT TOP (1) * FROM Kest WHERE [ClientID] = @ID) BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT TOP (1) * FROM Kest WHERE [ClientID] = @ID) BEGIN
SET @status = \'trues\';
END
END

IF @status = \'trues\' BEGIN;
DELETE FROM Clients_Entery WHERE [ClientID] =  @ID;
DELETE FROM Clients_EIT WHERE [ClientID] =  @ID;
DELETE FROM ClientBegin WHERE [ClientID] =  @ID;
DELETE FROM ClientsItem WHERE [ClientID] =  @ID;
DELETE FROM VAC WHERE [ClientID] = @ID;
DELETE FROM Clients WHERE [ID] =  @ID;
END

SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetVendorAccName\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [VendorAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID 
UNION ALL 
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT [ID],[AccountNameValue],[AccountType],
(SELECT TOP (1) [VendorLocalAccountID] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\') AS [VendorLocalAccountID]
FROM #Results ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetVendorCTName\') {
    $sql1 = "SELECT * FROM VandorCategory ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetVendorIDV\') {
    $sql1 = "SELECT [IDV] + 1 AS [IDV] FROM Vandor ORDER BY [IDV] DESC";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'RemoveVendor\') {
    if(isset($_GET[\'VendorID\'])) $VendorID = pesticide($_GET[\'VendorID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($VendorID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF Exists(SELECT TOP (1) * FROM Vandor_Entery WHERE [VandorID] = @ID AND [Type] != \'VendorBegin\') BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT TOP (1) * FROM Vandor_Entery WHERE [VandorID] = @ID AND [Type] != \'VendorBegin\') BEGIN
SET @status = \'trues\';
END


IF @status = \'trues\' BEGIN;
DELETE FROM Vandor_Entery WHERE [VandorID] = @ID;
DELETE FROM Vandor_EIT WHERE [VandorID] = @ID;
DELETE FROM VendorBegin WHERE [VendorID] = @ID;
DELETE FROM Vandor WHERE [ID] = @ID;
END

SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetVendorCode\') {
    if(isset($_GET[\'VendorIDV\'])) $VendorIDV = pesticide($_GET[\'VendorIDV\']);

    $sql = "SELECT [ID] FROM Vandor WHERE [IDV] = \'".$VendorIDV."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1605;&#1608;&#1585;&#1583; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetContractorsID\') {
    if(isset($_GET[\'ContractorsID\'])) $ContractorsID = pesticide($_GET[\'ContractorsID\']);

    $sql = "SELECT * FROM Contractors WHERE [ID] = \'".$ContractorsID."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1605;&#1602;&#1575;&#1608;&#1604; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetVendorID\') {
    if(isset($_GET[\'VendorID\'])) $VendorID = pesticide($_GET[\'VendorID\']);

    $sql = "SELECT * FROM Vandor WHERE [ID] = \'".$VendorID."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1605;&#1608;&#1585;&#1583; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetVendorBegin\') {
    $sql1 = "SELECT *,ISNULL(CrunSarf,1) AS CrunSarfA,FORMAT(DateTime, \'yyyy/MM/dd\') AS DateTimeA,(SELECT TOP (1) [IDV] FROM Vandor WHERE [ID] = VendorBegin.[VendorID]) AS VendorIDV FROM VendorBegin WHERE [BranchID] = \'".$NewBranchID."\'";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetClientBegin\') {
    $sql1 = "SELECT *,ISNULL(CrunSarf,1) AS CrunSarfA,FORMAT(DateTime, \'yyyy/MM/dd\') AS DateTimeA,(SELECT TOP (1) [IDV] FROM Clients WHERE [ID] = ClientBegin.[ClientID]) AS ClientIDV FROM ClientBegin WHERE [BranchID] = \'".$NewBranchID."\'";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetClientCode\') {
    if(isset($_GET[\'ClientIDV\'])) $ClientIDV = pesticide($_GET[\'ClientIDV\']);

    $sql = "SELECT [ID] FROM Clients WHERE [IDV] = \'".$ClientIDV."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetClientID\') {
    if(isset($_GET[\'ClientID\'])) $ClientID = pesticide($_GET[\'ClientID\']);

    $sql = "SELECT [IDV] FROM Clients WHERE [ID] = \'".$ClientID."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetKhaznaBegin\') {
    $sql1 = "SELECT *,ISNULL(CrunSarf,1) AS CrunSarfA,[DateTime] AS DateTimeA FROM KhaznaBegin WHERE [BranchID] = \'".$NewBranchID."\'";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetBankBegin\') {
    $sql1 = "
SELECT *,ISNULL(CrunSarf,1) AS CrunSarfA,
FORMAT(DateTime,\'yyyy/MM/dd\') AS DateTimeA 
FROM BankBegin WHERE [BranchID] = \'".$NewBranchID."\'";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'BankACC\') {
    if(isset($_GET[\'BankACCID\'])) $BankACCID = pesticide($_GET[\'BankACCID\']);

    $sql1 = "SELECT * FROM BankAccounts WHERE [ID] = \'".$BankACCID."\'";
    $ItemString = sqlsrv_query($conn16,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1576;&#1606;&#1603; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetBankACC\') {
    if(isset($_GET["BankID"])) $BankID = strval($_GET["BankID"]);
 
$sql1 = "SELECT * FROM BankAccounts WHERE [BankID] = \'".$BankID."\'";
$BankACC = sqlsrv_query($conn2,$sql1) or die(print_r(sqlsrv_errors(),true));
if (sqlsrv_has_rows($BankACC)) {
while ($fetchT = sqlsrv_fetch_array($BankACC,SQLSRV_FETCH_ASSOC)){
$result[] = $fetchT;
}
echo json_encode(array(\'data\' => $result));
}
sqlsrv_free_stmt($BankACC);
 sqlsrv_close($conn2);
}else if (strval($_GET["Type"]) == \'GetAccountBegin\') {
    $sql1 = "
SELECT
(SELECT TOP (1) [AccountCodeValue] FROM AccountsDefinition WHERE [ID] = Accounts_Entery.[AccountID]) AS AccountCode,
[ID],[AccountID],
ISNULL([Plus],0) AS Plus,
ISNULL([Mins],0) AS Mins,
ISNULL([TypeDesc],\'\') AS InfoText
FROM Accounts_Entery WHERE [BranchID] = \'" . $NewBranchID . "\'
AND [AccountBegin] IS NOT NULL ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetCompanyInfo\') {
    $sql1 = "
SET NOCOUNT ON
IF OBJECT_ID(\'tempdb..#TemporaryTable\') IS NOT NULL DROP Table #TemporaryTable;
SELECT * INTO #TemporaryTable FROM CompanyInfo WHERE [BranchID] = \'" . $NewBranchID . "\'
ALTER TABLE #TemporaryTable DROP COLUMN CompanyLogo
SELECT *,FORMAT(ISNULL(BeginDateTime,GETDATE()), \'yyyy/MM/dd\') AS BeginDateTimeA FROM #TemporaryTable";
    $ItemString = sqlsrv_query($conn16,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetAccountCodeA\') {
    if(isset($_GET[\'AccountCode\'])) $AccountCode = pesticide($_GET[\'AccountCode\']);

    $sql = "SELECT [ID] FROM AccountsDefinition WHERE [AccountCodeValue] = \'".$AccountCode."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetAccountIDA\') {
    if(isset($_GET[\'AccountID\'])) $AccountID = pesticide($_GET[\'AccountID\']);

    $sql = "SELECT [AccountCodeValue] FROM AccountsDefinition WHERE [ID] = \'".$AccountID."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'ReloadBeginValueButton\') {
    if(isset($_GET[\'DateTimeValue\'])) $DateTimeValue = pesticide($_GET[\'DateTimeValue\']);

    $sql = "
SET NOCOUNT ON 
Declare @BranchID as int = \'" . $NewBranchID . "\';
Declare @DefaluteCurrency as int = \'" . $DefaluteCurrency . "\';
Declare @DateTimeA as date = \'" . $DateTimeValue . "\';
DELETE FROM Accounts_Entery WHERE [Type] = \'ClientBegin\' AND [BranchID] = @BranchID
DELETE FROM Accounts_Entery WHERE [Type] = \'VendorBegin\' AND [BranchID] = @BranchID
DELETE FROM Accounts_Entery WHERE [Type] = \'BankBegin\' AND [BranchID] = @BranchID
DELETE FROM Accounts_Entery WHERE [Type] = \'KhaznaBegin\' AND [BranchID] = @BranchID
DELETE FROM Accounts_Entery WHERE [Type] = \'ChecksINBegin\' AND [BranchID] = @BranchID
DELETE FROM Accounts_Entery WHERE [Type] = \'ChecksOutBegin\' AND [BranchID] = @BranchID
DELETE FROM Accounts_Entery WHERE [Type] = \'ItemBegin\' AND [BranchID] = @BranchID
;
DELETE FROM Accounts_Entery WHERE [ID] IN (SELECT [Accounts_EnteryID] FROM ClientBegin)
DELETE FROM Accounts_Entery WHERE [ID] IN (SELECT [Accounts_EnteryID] FROM VendorBegin)
DELETE FROM Accounts_Entery WHERE [ID] IN (SELECT [Accounts_EnteryID] FROM BankBegin)
DELETE FROM Accounts_Entery WHERE [ID] IN (SELECT [Accounts_EnteryID] FROM KhaznaBegin)
;
Declare @ClientBeginPlus as decimal = (SELECT SUM(ISNULL([ClientBeginTotal],0)) FROM ClientBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\');
IF @ClientBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [ClientAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ClientBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([ClientBeginTotal],0)) FROM ClientBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @ClientBeginMins as decimal = (SELECT SUM(ISNULL([ClientBeginTotal],0)) FROM ClientBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\');
IF @ClientBeginMins > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Mins],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [ClientAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ClientBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([ClientBeginTotal],0)) FROM ClientBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @VendorBeginPlus as decimal = (SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM VendorBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\');
IF @VendorBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [VendorAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'VendorBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM VendorBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @VendorBeginMins as decimal = (SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM VendorBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\');
IF @VendorBeginMins > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Mins],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [VendorAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'VendorBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM VendorBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @ContractorsBeginPlus as decimal = (SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM ContractorsBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\');
IF @ContractorsBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [ContractorsAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ContractorsBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM ContractorsBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @ContractorsBeginMins as decimal = (SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM ContractorsBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\');
IF @ContractorsBeginMins > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Mins],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [ContractorsAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ContractorsBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([VendorBeginTotal],0)) FROM ContractorsBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @BankBeginPlus as decimal = (SELECT SUM(ISNULL([BankBeginTotal],0)) FROM BankBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\');
IF @BankBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [BankMoneyAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'BankBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([BankBeginTotal],0)) FROM BankBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @BankBeginMins as decimal = (SELECT SUM(ISNULL([BankBeginTotal],0)) FROM BankBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\');
IF @BankBeginMins > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Mins],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [BankMoneyAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'BankBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([BankBeginTotal],0)) FROM BankBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @KhaznaBeginPlus as decimal = (SELECT SUM(ISNULL([KhaznaBeginTotal],0)) FROM KhaznaBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\');
IF @KhaznaBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [KhaznaAccountID] FROM KhaznaAccounts WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'KhaznaBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([KhaznaBeginTotal],0)) FROM KhaznaBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'True\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @KhaznaBeginMins as decimal = (SELECT SUM(ISNULL([KhaznaBeginTotal],0)) FROM KhaznaBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\');
IF @BankBeginMins > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Mins],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [KhaznaAccountID] FROM KhaznaAccounts WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'KhaznaBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([KhaznaBeginTotal],0)) FROM KhaznaBegin WHERE [BranchID] = @BranchID AND [TypeValue] = \'False\'),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @ChecksINBeginPlus as decimal = (SELECT SUM(ISNULL([ChecksTotalValue],0)) FROM ChecksINBeginItem WHERE [BranchID] = @BranchID);
IF @ChecksINBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [KhaznaChecksINAccountID] FROM KhaznaAccounts WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ChecksINBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([ChecksTotalValue],0)) FROM ChecksINBeginItem WHERE [BranchID] = @BranchID),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @ChecksOutBeginPlus as decimal = (SELECT SUM(ISNULL([ChecksTotalValue],0)) FROM CheckOutBeginItem WHERE [BranchID] = @BranchID);
IF @ChecksOutBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Mins],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [CheckOutAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ChecksOutBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([ChecksTotalValue],0)) FROM CheckOutBeginItem WHERE [BranchID] = @BranchID),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')
;
Declare @ItemBeginPlus as decimal = (SELECT SUM(ISNULL([Price_BayTotal],0)) FROM Begin_Items WHERE [BranchID] = @BranchID);
IF @ItemBeginPlus > 0
INSERT INTO Accounts_Entery([AccountID],[Type],[TypeDesc],[TypeID],[Plus],[Data],[Time],[BranchID],[CurrencyID],[AccountBegin]
)VALUES(
(SELECT TOP (1) [StoreAccount] FROM BranchAccount WHERE [BranchID] = @BranchID ORDER BY [ID] ASC),
\'ItemBegin\',\'&#1585;&#1589;&#1610;&#1583; &#1571;&#1608;&#1604; &#1605;&#1583;&#1577;\',\'0\',
(SELECT SUM(ISNULL([Price_BayTotal],0)) FROM Begin_Items WHERE [BranchID] = @BranchID),
FORMAT(@DateTimeA, \'yyyy/MM/dd\'),FORMAT(GETDATE(), \'hh:mm:ss tt\'),@BranchID,
@DefaluteCurrency,\'AccountBegin\')";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'SaveCompanyInfo\') {
    if(isset($_GET[\'AccountCode\'])) $AccountCode = pesticide($_GET[\'AccountCode\']);

    $sql = "SELECT [ID] FROM AccountsDefinition WHERE [AccountCodeValue] = \'".$AccountCode."\'";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'&#1603;&#1608;&#1583; &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetItemBeginIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM BegStore WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'CheckItemHaveBeginStore\') {
    if(isset($_GET[\'StoreID\'])) $StoreID = pesticide($_GET[\'StoreID\']);
    if(isset($_GET[\'ItemID\'])) $ItemID = pesticide($_GET[\'ItemID\']);
    if(isset($_GET[\'UintsID\'])) $UintsID = pesticide($_GET[\'UintsID\']);

    $sql = "SELECT ISNULL((SELECT TOP (1) CAST(\'True\' AS bit) AS status FROM Begin_Items WHERE [ItemID] = \'".$ItemID."\' AND [StoreID] = \'".$StoreID."\'),CAST(\'False\' AS bit)) AS status";
    $ItemString = sqlsrv_query($conn16,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'GetItemValueBegin\') {
    $sql1 = "
SELECT *,
(CASE WHEN \'" . $ClothingValue . "\' = \'True\' THEN
(SELECT TOP (1) ISNULL(SS.[CostPriceOne],0) FROM Item SS WHERE SS.[ITemCode] = Item.[HaveFather]) ELSE ISNULL([CostPriceOne],0)END) AS CostPriceOneS
FROM Item WHERE [AccountType] = \'3\' AND [Item_Status] = \'True\' AND [IS_Store] = \'True\' ORDER BY [ITemCode] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetItemValueNotINBegin\') {
    if(isset($_GET[\'StoreID\'])) $StoreID = pesticide($_GET[\'StoreID\']);
    $sql1 = "
SELECT *,
(CASE WHEN \'" . $ClothingValue . "\' = \'True\' THEN
(SELECT TOP (1) ISNULL(SS.[CostPriceOne],0) FROM Item SS WHERE SS.[ITemCode] = Item.[HaveFather]) ELSE ISNULL([CostPriceOne],0)END) AS CostPriceOneS
FROM Item WHERE [AccountType] = \'3\' AND [Item_Status] = \'True\' AND [IS_Store] = \'True\'
AND [ID] NOT IN (SELECT [ItemID] FROM Begin_Items WHERE [StoreID] = \'" . $StoreID . "\')
ORDER BY [ITemCode] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetItemCTValueNotINBegin\') {
    if(isset($_GET[\'StoreID\'])) $StoreID = pesticide($_GET[\'StoreID\']);
    if(isset($_GET[\'ITemCode001\'])) $ITemCode001 = pesticide($_GET[\'ITemCode001\']);
    $sql1 = "
DECLARE @ID INT;SELECT @ID = \'" . $ITemCode001 . "\';
WITH RET AS(SELECT * FROM Item R WHERE ID = @ID UNION ALL SELECT T.* FROM Item T INNER JOIN RET G ON T.HaveFather = G.ITemCode)
SELECT *,
(CASE WHEN \'" . $ClothingValue . "\' = \'True\' THEN
(SELECT TOP (1) ISNULL(SS.[CostPriceOne],0) FROM Item SS WHERE SS.[ITemCode] = Item.[HaveFather]) ELSE ISNULL([CostPriceOne],0)END) AS CostPriceOneS
FROM Item WHERE [AccountType] = \'3\' AND [Item_Status] = \'True\' AND [IS_Store] = \'True\'
AND Item.[ID] NOT IN (SELECT [ItemID] FROM Begin_Items WHERE [StoreID] = \'" . $StoreID . "\')
AND Item.[ID] IN (SELECT [ID] FROM RET)
ORDER BY [ITemCode] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'CheckUserLeval\') {
    if(isset($_GET[\'Column\'])) $Column = strval(pesticide($_GET[\'Column\']));
    
    $sql550 = "
SELECT
CAST(".$Column." AS bit) AS Value
FROM UserLeval WHERE [ID] = \'" . $NewUserLeval . "\'";
//echo \'<script type="text/javascript">alert(\' . $sql550. \');  </script>\';
    $ItemStringA = sqlsrv_query($conn50,$sql550,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetchTT = sqlsrv_fetch_array($ItemStringA,SQLSRV_FETCH_ASSOC);
    $resultAA = array();
    if (sqlsrv_has_rows($ItemStringA)) {
    $resultAA[] = $fetchTT;
    print json_encode($fetchTT);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemStringA);
    sqlsrv_close($conn16);
}else if (strval($_GET["Type"]) == \'CheckINBeginIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM ChecksINBeginN WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetClientBankID\') {
    $sql1 = "SELECT * FROM ChecksBank ORDER BY [IDV] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetAccountType\') {
    $SQLString = \'\';
    if ($ContractorsValue == true){
        $SQLString = \'\';
    }else{
        $SQLString = \' WHERE [ID] != 3\';
    }

    $sql1 = "SELECT * FROM CheckINType ".$SQLString." ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetContractorsName\') {
    $sql1 = "SELECT * FROM Contractors WHERE [VandorStatus] = \'True\' ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'CheckIfChecksDuplicated\') {
    if(isset($_GET[\'CheckCode\'])) $CheckCode = pesticide($_GET[\'CheckCode\']);
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql = "
Declare @LineID as int = \'" . intval($LineID) . "\';
Declare @CheckCode as nvarchar(max) = \'" . ($CheckCode) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF @LineID = 0 BEGIN
IF Exists(SELECT * FROM ChecksINBeginItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM ChecksINBeginItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN
IF Exists(SELECT * FROM ChecksINItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM ChecksINItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'trues\';
END
END
END ELSE IF @LineID != 0 BEGIN

IF Exists(SELECT * FROM ChecksINBeginItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM ChecksINBeginItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN
IF Exists(SELECT * FROM ChecksINItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM ChecksINItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'trues\';
END
END

END
SELECT @status AS status";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'CheckOutBeginIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM CheckOutBeginN WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetAccountTypeA\') {
    $SQLString = \'\';
    if ($ContractorsValue == true){
        $SQLString = \'\';
    }else{
        $SQLString = \' WHERE [ID] != 3\';
    }

    $sql1 = "
SET NOCOUNT ON 
IF OBJECT_ID(\'tempdb..#InvoiceTEMP\') IS NOT NULL DROP Table #InvoiceTEMP;
SELECT 
(CASE WHEN [ID] = 1 THEN 2
WHEN [ID] = 2 THEN 1
WHEN [ID] = 3 THEN 3
WHEN [ID] = 4 THEN 4 END) AS Sort,*
INTO #InvoiceTEMP FROM CheckINType 
SELECT * FROM #InvoiceTEMP ".$SQLString." ORDER BY [Sort] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'CheckIfChecksOutDuplicated\') {
    if(isset($_GET[\'CheckCode\'])) $CheckCode = pesticide($_GET[\'CheckCode\']);
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql = "
Declare @LineID as int = \'" . intval($LineID) . "\';
Declare @CheckCode as nvarchar(max) = \'" . ($CheckCode) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF @LineID = 0 BEGIN
IF Exists(SELECT * FROM CheckOutBeginItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM CheckOutBeginItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN
IF Exists(SELECT * FROM CheckOutItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM CheckOutItem WHERE [ChecksCodeValue] = @CheckCode) BEGIN
SET @status = \'trues\';
END
END
END ELSE IF @LineID != 0 BEGIN

IF Exists(SELECT * FROM CheckOutBeginItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM CheckOutBeginItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN
IF Exists(SELECT * FROM CheckOutItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'Duplicated\';
END ELSE IF NOT Exists(SELECT * FROM CheckOutItem WHERE [ChecksCodeValue] = @CheckCode AND [ID] != @LineID) BEGIN
SET @status = \'trues\';
END
END

END
SELECT @status AS status";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetMandobIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Mandob ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetItemBandelIDV\') {
    $sql = "SELECT \'0000\' + CAST( ISNULL((SELECT TOP (1) [ITemCode] + 1 AS [ITemCode] FROM ItemBandel ORDER BY [ITemCode] DESC),CAST(\'100001\' AS Varchar(max))) AS Varchar(max)) AS ITemCode";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetBranchIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Branch ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetKhaznaIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Khazna ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetStoreIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Stores ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetCurrencyIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Currency ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetCostCenterFatherNames\') {
    $sql1 = "SELECT * FROM CostCenter WHERE [AccountType] != \'3\' ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetCostIDV\') {
    if(isset($_GET[\'AccountsTypeValue\'])) $AccountsTypeValue = pesticide($_GET[\'AccountsTypeValue\']);
    if(isset($_GET[\'FirstCatgoryValue\'])) $FirstCatgoryValue = pesticide($_GET[\'FirstCatgoryValue\']);

    $sql = "
Declare @AccountTypeID as int = \'".$AccountsTypeValue."\'; 
Declare @AccountID as int = \'".$FirstCatgoryValue."\'; 

SELECT 
(CASE
WHEN @AccountTypeID = 1 THEN \'00\' + CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM CostCenter WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [AccountCodeValue] DESC),\'001\')) AS varchar(max))
WHEN @AccountTypeID != 1 THEN \'00\' +

CAST(
(SELECT ISNULL(
(SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM CostCenter WHERE [HaveFather] = @AccountID ORDER BY [AccountCodeValue] DESC),
CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + \'001\' AS AccountCodeValue FROM CostCenter WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),\'001\') ) AS varchar(max))
)) AS varchar(max))
END) AS AccountID,

(CASE
WHEN @AccountTypeID = 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM CostCenter WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [ID] DESC),\'1\'))
WHEN @AccountTypeID != 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM CostCenter WHERE [HaveFather] = @AccountID ORDER BY [ID] DESC),

(SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM CostCenter WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),1))
))
END) AS AccountLeval";
//echo \'<script type="text/javascript">alert(\' . $sql . \');  </script>\';
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetCostCenterNames\') {
    $sql1 = "SELECT * FROM CostCenter ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetClientGroupIDV\') {
    if(isset($_GET[\'AccountsTypeValue\'])) $AccountsTypeValue = pesticide($_GET[\'AccountsTypeValue\']);
    if(isset($_GET[\'FirstCatgoryValue\'])) $FirstCatgoryValue = pesticide($_GET[\'FirstCatgoryValue\']);

    $sql = "
Declare @AccountTypeID as int = \'".$AccountsTypeValue."\'; 
Declare @AccountID as int = \'".$FirstCatgoryValue."\'; 

SELECT 
(CASE
WHEN @AccountTypeID = 1 THEN \'00\' + CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM ClientCategory WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [AccountCodeValue] DESC),\'001\')) AS varchar(max))
WHEN @AccountTypeID != 1 THEN \'00\' +

CAST(
(SELECT ISNULL(
(SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM ClientCategory WHERE [HaveFather] = @AccountID ORDER BY [AccountCodeValue] DESC),
CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + \'001\' AS AccountCodeValue FROM ClientCategory WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),\'001\') ) AS varchar(max))
)) AS varchar(max))
END) AS AccountID,

(CASE
WHEN @AccountTypeID = 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM ClientCategory WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [ID] DESC),\'1\'))
WHEN @AccountTypeID != 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM ClientCategory WHERE [HaveFather] = @AccountID ORDER BY [ID] DESC),

(SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM ClientCategory WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),1))
))
END) AS AccountLeval";
//echo \'<script type="text/javascript">alert(\' . $sql . \');  </script>\';
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetClientCategoryFatherNames\') {
    $sql1 = "SELECT * FROM ClientCategory WHERE [AccountType] != \'3\' ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetVendorGroupIDV\') {
    if(isset($_GET[\'AccountsTypeValue\'])) $AccountsTypeValue = pesticide($_GET[\'AccountsTypeValue\']);
    if(isset($_GET[\'FirstCatgoryValue\'])) $FirstCatgoryValue = pesticide($_GET[\'FirstCatgoryValue\']);

    $sql = "
Declare @AccountTypeID as int = \'".$AccountsTypeValue."\'; 
Declare @AccountID as int = \'".$FirstCatgoryValue."\'; 

SELECT 
(CASE
WHEN @AccountTypeID = 1 THEN \'00\' + CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM VandorCategory WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [AccountCodeValue] DESC),\'001\')) AS varchar(max))
WHEN @AccountTypeID != 1 THEN \'00\' +

CAST(
(SELECT ISNULL(
(SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM VandorCategory WHERE [HaveFather] = @AccountID ORDER BY [AccountCodeValue] DESC),
CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + \'001\' AS AccountCodeValue FROM VandorCategory WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),\'001\') ) AS varchar(max))
)

) AS varchar(max))
END) AS AccountID,

(CASE
WHEN @AccountTypeID = 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM VandorCategory WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [ID] DESC),\'1\'))
WHEN @AccountTypeID != 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM VandorCategory WHERE [HaveFather] = @AccountID ORDER BY [ID] DESC),

(SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM VandorCategory WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),1))
))
END) AS AccountLeval";
//echo \'<script type="text/javascript">alert(\' . $sql . \');  </script>\';
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetVendorCategoryFatherNames\') {
    $sql1 = "SELECT * FROM VandorCategory WHERE [AccountType] != \'3\' ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetAreaIDV\') {
    if(isset($_GET[\'AccountsTypeValue\'])) $AccountsTypeValue = pesticide($_GET[\'AccountsTypeValue\']);
    if(isset($_GET[\'FirstCatgoryValue\'])) $FirstCatgoryValue = pesticide($_GET[\'FirstCatgoryValue\']);

    $sql = "
Declare @AccountTypeID as int = \'".$AccountsTypeValue."\'; 
Declare @AccountID as int = \'".$FirstCatgoryValue."\'; 

SELECT 
(CASE
WHEN @AccountTypeID = 1 THEN \'00\' + CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM Area WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [AccountCodeValue] DESC),\'001\')) AS varchar(max))
WHEN @AccountTypeID != 1 THEN \'00\' +

CAST(
(SELECT ISNULL(
(SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM Area WHERE [HaveFather] = @AccountID ORDER BY [AccountCodeValue] DESC),
CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + \'001\' AS AccountCodeValue FROM Area WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),\'001\') ) AS varchar(max))
)

) AS varchar(max))
END) AS AccountID,

(CASE
WHEN @AccountTypeID = 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM Area WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [ID] DESC),\'1\'))
WHEN @AccountTypeID != 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM Area WHERE [HaveFather] = @AccountID ORDER BY [ID] DESC),

(SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM Area WHERE [ID] = @AccountID ORDER BY [AccountCodeValue] DESC),1))
))
END) AS AccountLeval";
//echo \'<script type="text/javascript">alert(\' . $sql . \');  </script>\';
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetAreaFatherNames\') {
    $sql1 = "SELECT * FROM Area WHERE [AccountType] != \'3\' ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetChecksBankIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM ChecksBank ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetDiscountAddIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM DiscountAddType ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetBankIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Bank ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GETAccountsType\') {
    $sql1 = "SELECT * FROM AccountsType ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetAccountingFatherNames\') {
    $sql1 = "SELECT * FROM AccountsDefinition WHERE [AccountType] != \'3\' ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetAccountingIDV\') {
    if(isset($_GET[\'AccountsTypeValue\'])) $AccountsTypeValue = pesticide($_GET[\'AccountsTypeValue\']);
    if(isset($_GET[\'FirstCatgoryValue\'])) $FirstCatgoryValue = pesticide($_GET[\'FirstCatgoryValue\']);

    $sql = "
Declare @AccountTypeID as int = \'".$AccountsTypeValue."\'; 
Declare @AccountID as nvarchar(max) = \'".$FirstCatgoryValue."\'; 

SELECT 
(CASE
WHEN @AccountTypeID = 1 THEN CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM AccountsDefinition WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [AccountCodeValue] DESC),\'001\')) AS varchar(max))
WHEN @AccountTypeID != 1 THEN
CAST(
(SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + 1 AS AccountCodeValue FROM AccountsDefinition WHERE [HaveFather] = @AccountID ORDER BY [AccountCodeValue] DESC),
CAST((SELECT ISNULL((SELECT TOP (1) [AccountCodeValue] + \'01\' AS AccountCodeValue FROM AccountsDefinition WHERE [AccountCodeValue] = @AccountID ORDER BY [AccountCodeValue] DESC),\'01\') ) AS varchar(max))
)) AS varchar(max))
END) AS AccountID,

(CASE
WHEN @AccountTypeID = 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM AccountsDefinition WHERE [AccountType] = \'1\' AND [AccountCodeValue] IS NOT NULL ORDER BY [ID] DESC),\'1\'))
WHEN @AccountTypeID != 1 THEN (SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM AccountsDefinition WHERE [HaveFather] = @AccountID ORDER BY [ID] DESC),
(SELECT ISNULL((SELECT TOP (1) [AccountLevalValue] + 1 AS AccountCodeValue FROM AccountsDefinition WHERE [AccountCodeValue] = @AccountID ORDER BY [AccountCodeValue] DESC),1))
))
END) AS AccountLeval";
//echo \'<script type="text/javascript">alert(\' . $sql . \');  </script>\';
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetMasrofatAmomiaAccountValue\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [MasrofatAmomiaAccount] FROM BranchAccount WHERE [BranchID] = \'" . $NewBranchID . "\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT * FROM #Results WHERE [AccountType] = \'3\';";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetMortabatWAgorAccountValue\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [TaminEmealAccount] FROM BranchAccount WHERE [BranchID] = \'" . $NewBranchID . "\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT * FROM #Results WHERE [AccountType] = \'3\';";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetPartnersAccountValue\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [TaminWorkAccount] FROM BranchAccount WHERE [BranchID] = \'" . $NewBranchID . "\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT * FROM #Results WHERE [AccountType] = \'3\';";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'GetRaFoFFValue\') {
    $sql1 = "SELECT * FROM RaFoFF ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn4,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn4);
}else if (strval($_GET["Type"]) == \'SaveRaf\') {
    if(isset($_GET[\'ID\'])) $ID = pesticide($_GET[\'ID\']);
    if(isset($_GET[\'ITemName\'])) $ITemName = pesticide($_GET[\'ITemName\']);

        $sql123 = "
SET NOCOUNT ON
DEclare @CTID as int = \'" . intval($ID) . "\';
DEclare @ItemID as int = 0;
DEclare @BranchID as int = \'".$NewBranchID."\';
DEclare @ItemName as nvarchar(max) = \'" . $ITemName . "\';
Declare @ItemCode AS nvarchar(MAX) = 0;
DEclare @status as nvarchar(max) = \'true\';

IF @CTID = 0 BEGIN
IF Exists(SELECT * FROM RaFoFF WHERE [RaFName] = @ItemName) BEGIN
SET @status = \'false\';
END
END ELSE IF @CTID != 0 BEGIN
IF Exists(SELECT * FROM RaFoFF WHERE [RaFName] = @ItemName AND [ID] != @CTID) BEGIN
SET @status = \'false\';
END
END

IF @status = \'true\' BEGIN
IF @CTID = 0 BEGIN

INSERT INTO RaFoFF([IDV],[RaFName]
)VALUES(
(\'000\' + CAST(
(SELECT (CASE WHEN
(SELECT COUNT(IDV) FROM RaFoFF) > 0 THEN 
(SELECT TOP 1 [IDV] + 1 FROM RaFoFF ORDER BY [IDV] DESC) 
ELSE 1 END) AS [IDV] FROM CompanyInfo WHERE [BranchID] = @BranchID) AS varchar(max))),@ItemName)

SET @ItemID = (SELECT @@Identity);
SELECT TOP (1) @ItemCode = [IDV] FROM RaFoFF WHERE [ID] = @ItemID
END ELSE IF @CTID != 0 BEGIN
UPDATE RaFoFF SET [RaFName] = @ItemName WHERE [ID] = @CTID
SELECT @ItemCode = [IDV],@ItemID = [ID] FROM RaFoFF WHERE [ID] = @CTID
END
END
;
SELECT @ItemCode AS ItemCode,@ItemID AS ItemID,@status AS status";
    $ItemString = sqlsrv_query($conn32,$sql123,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ItemString)) {
    print json_encode($fetch);
    }else{
        $err[] = \'&#1575;&#1587;&#1605; &#1575;&#1604;&#1585;&#1601; &#1605;&#1603;&#1585;&#1585;\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn32);
}else if (strval($_GET["Type"]) == \'RemoveRaf\') {
    if(isset($_GET[\'LineID\'])) $LineID = pesticide($_GET[\'LineID\']);

    $sql1 = "
SET NOCOUNT ON
DECLARE @ID INT;SELECT @ID = \'" . intval($LineID) . "\';
DEclare @status AS nvarchar(max) = \'trues\';

IF Exists(SELECT [ItemID] FROM Item WHERE [Item_Where] = @ID) BEGIN
SET @status = \'HaveMove\';
END ELSE IF NOT Exists(SELECT [ItemID] FROM Item WHERE [Item_Where] = @ID) BEGIN
SET @status = \'trues\';
END

IF @status = \'trues\' BEGIN;
DELETE FROM RaFoFF WHERE [IDV] = @ID;
END

SELECT @status as StatusA";
    $ClientsA = sqlsrv_query($conn30,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientsA)) {
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn30);
}else if (strval($_GET["Type"]) == \'GetUsersIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM Users ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetLevalNameID\') {
    $sql10 = "SELECT * FROM UserLeval ORDER BY [ID] ASC";
    $UserLeval = sqlsrv_query($conn40,$sql10,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($UserLeval)) {
    while ($fetchZA = sqlsrv_fetch_array($UserLeval,SQLSRV_FETCH_ASSOC)){
    $resultA[] = $fetchZA;
    }
    echo json_encode(array(\'data\' => $resultA));
    }
    sqlsrv_free_stmt($UserLeval);
    sqlsrv_close($conn40);
}else if (strval($_GET["Type"]) == \'AzenSType\') {
    $sql10 = "SELECT * FROM AzonType ORDER BY [ID] ASC";
    $UserLeval = sqlsrv_query($conn40,$sql10,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($UserLeval)) {
    while ($fetchZA = sqlsrv_fetch_array($UserLeval,SQLSRV_FETCH_ASSOC)){
    $resultA[] = $fetchZA;
    }
    echo json_encode(array(\'data\' => $resultA));
    }
    sqlsrv_free_stmt($UserLeval);
    sqlsrv_close($conn40);
}else if (strval($_GET["Type"]) == \'GetRefundInvoiceIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [ID] + 1 AS [ID] FROM RefandedInvoice WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [ID] DESC),1) AS ID";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetInvoicesName\') {
    $sql10 = "
WITH RETS AS(
SELECT Invoices.InvoiceID,CAST(Invoices.ID AS Varchar) AS ID,
(CASE WHEN Invoices.ClientID = 0 THEN \'&#1605;&#1576;&#1610;&#1593;&#1575;&#1578; &#1606;&#1602;&#1583;&#1610;&#1577;\' ELSE Clients.ClientName END) AS ClientNameS,
(CASE WHEN Clients.ClientName IS NULL THEN CAST(Invoices.ID AS Varchar(MAX)) + \'-|-\' + \'&#1605;&#1576;&#1610;&#1593;&#1575;&#1578; &#1606;&#1602;&#1583;&#1610;&#1577;\' + \'-|-\' + 
CAST(Invoices.InvoiceData AS Varchar(MAX)) ELSE CAST(Invoices.ID AS Varchar(MAX)) + \'-|-\' + Clients.ClientName + \'-|-\' + 
CAST(Invoices.InvoiceData AS Varchar(MAX)) END) AS Info
FROM Invoices LEFT OUTER JOIN
Users ON Invoices.UserID = Users.ID LEFT OUTER JOIN
Clients ON Invoices.ClientID = Clients.ID
WHERE Invoices.[BranchID] = \'" . $NewBranchID . "\')
SELECT * FROM RETS ORDER BY CAST([ID] AS INT) DESC";
    $UserLeval = sqlsrv_query($conn40,$sql10,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($UserLeval)) {
    while ($fetchZA = sqlsrv_fetch_array($UserLeval,SQLSRV_FETCH_ASSOC)){
    $resultA[] = $fetchZA;
    }
    echo json_encode(array(\'data\' => $resultA));
    }
    sqlsrv_free_stmt($UserLeval);
    sqlsrv_close($conn40);
}else if (strval($_GET["Type"]) == \'GetRefundAccountName\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [SalesRefundAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID 
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT [ID],[AccountNameValue],[AccountType],(SELECT TOP (1) [SalesRefundAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\') AS [SalesLocalAccount]
FROM #Results ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn28,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn28);
}else if (strval($_GET["Type"]) == \'GetInvoiceRefundIDDaily\') {
    if(isset($_GET[\'Date\'])) $Date = pesticide($_GET[\'Date\']);
    $sql1 = "
Declare @InvoiceDateValue as date = \'" . $Date . "\';
SELECT (SELECT FORMAT(@InvoiceDateValue, \'yyyy\') + FORMAT(@InvoiceDateValue, \'MM\') + FORMAT(@InvoiceDateValue, \'dd\') + \'-\' +
CAST((CASE WHEN (SELECT COUNT([IDDaily]) FROM RefandedInvoice WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\')) = 0 THEN \'1\'
ELSE (SELECT COUNT([IDDaily]) + 1 AS [IDDaily] FROM RefandedInvoice WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\'))
END) AS varchar(max))) AS Date";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}else if (strval($_GET["Type"]) == \'GetPaymentInvoiceIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [ID] + 1 AS [ID] FROM VInvoices WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [ID] DESC),1) AS ID";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetPaymentAccountName\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [PaymentCostAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID 
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT [ID],[AccountNameValue],[AccountType],(SELECT TOP (1) [PaymentCostLocalAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\') AS [PaymentCostLocalAccount]
FROM #Results ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn28,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn28);
}else if (strval($_GET["Type"]) == \'GetInvoicePaymentIDDaily\') {
    if(isset($_GET[\'Date\'])) $Date = pesticide($_GET[\'Date\']);
    $sql1 = "
Declare @InvoiceDateValue as date = \'" . $Date . "\';
SELECT (SELECT FORMAT(@InvoiceDateValue, \'yyyy\') + FORMAT(@InvoiceDateValue, \'MM\') + FORMAT(@InvoiceDateValue, \'dd\') + \'-\' +
CAST((CASE WHEN (SELECT COUNT([IDDaily]) FROM VInvoices WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\')) = 0 THEN \'1\'
ELSE (SELECT COUNT([IDDaily]) + 1 AS [IDDaily] FROM VInvoices WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\'))
END) AS varchar(max))) AS Date";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}else if (strval($_GET["Type"]) == \'GetLastPayPrice\') {
    if(isset($_GET[\'ItemID\'])) $ItemID = pesticide($_GET[\'ItemID\']);
    if(isset($_GET[\'UnitsID\'])) $UnitsID = pesticide($_GET[\'UnitsID\']);

    $sql1 = "
DECLARE @ItemID AS int = \'".$ItemID."\';
DECLARE @UinteID AS int = \'".$UnitsID."\';
DECLARE @UinteOneID AS int = (SELECT TOP (1) [Units] FROM Item WHERE [ID] = @ItemID);
DECLARE @UinteTwoID AS int = (SELECT TOP (1) [Add_Units] FROM Item WHERE [ID] = @ItemID);
DECLARE @Value AS Decimal(18,2) = 0;

IF @UinteID = @UinteOneID BEGIN
SELECT TOP (1) @Value = [PayAmount] FROM Store_Entery WHERE [ItemID] = @ItemID AND [IsBonous] = \'False\' AND [UintsID] = @UinteID AND ([Type] = \'Pay\' OR [Type] = \'Begin\') ORDER BY [ID] DESC
END ELSE IF @UinteID = @UinteTwoID BEGIN
SELECT TOP (1) @Value = [PayAmountS] FROM Store_Entery WHERE [ItemID] = @ItemID AND [IsBonous] = \'False\' AND [UintsID] = @UinteID AND ([Type] = \'Pay\' OR [Type] = \'Begin\') ORDER BY [ID] DESC
END ELSE BEGIN
SELECT TOP (1) @Value = [PayAmount] FROM Store_Entery WHERE [ItemID] = @ItemID AND [IsBonous] = \'False\' AND [UintsID] = @UinteID AND ([Type] = \'Pay\' OR [Type] = \'Begin\') ORDER BY [ID] DESC
END 

SELECT @Value AS Value";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}else if (strval($_GET["Type"]) == \'GetPaymentRefundInvoiceIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [ID] + 1 AS [ID] FROM VandorRefandInvoice WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [ID] DESC),1) AS ID";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetInvoicePaymentRefundIDDaily\') {
    if(isset($_GET[\'Date\'])) $Date = pesticide($_GET[\'Date\']);
    $sql1 = "
Declare @InvoiceDateValue as date = \'" . $Date . "\';
SELECT (SELECT FORMAT(@InvoiceDateValue, \'yyyy\') + FORMAT(@InvoiceDateValue, \'MM\') + FORMAT(@InvoiceDateValue, \'dd\') + \'-\' +
CAST((CASE WHEN (SELECT COUNT([IDDaily]) FROM VandorRefandInvoice WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\')) = 0 THEN \'1\'
ELSE (SELECT COUNT([IDDaily]) + 1 AS [IDDaily] FROM VandorRefandInvoice WHERE [BranchID] = \'" . $NewBranchID . "\' AND [InvoiceData] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\'))
END) AS varchar(max))) AS Date";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}else if (strval($_GET["Type"]) == \'GetPaymentRefundAccountName\') {
    $sql1 = "
DECLARE @ID INT;SELECT @ID = (SELECT [PaymentCostRefundAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\');
With #results AS (SELECT [ID],[HaveFather],[AccountCodeValue],[AccountNameValue],[AccountType] FROM AccountsDefinition WHERE ID = @ID 
UNION ALL
SELECT T.[ID],T.[HaveFather],T.[AccountCodeValue],T.[AccountNameValue],T.[AccountType] FROM AccountsDefinition T INNER JOIN #Results R ON R.[AccountCodeValue] = T.[HaveFather])
SELECT [ID],[AccountNameValue],[AccountType],(SELECT TOP (1) [PaymentCostRefundAccount] FROM BranchAccount WHERE [BranchID] = \'".$NewBranchID."\') AS [PaymentCostLocalAccount]
FROM #Results ORDER BY [AccountCodeValue] ASC";
    $ClientsA = sqlsrv_query($conn28,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
        }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn28);
}else if (strval($_GET["Type"]) == \'GetInvoicesRefundName\') {
    $sql10 = "
SELECT VInvoices.InvoiceID,CAST(VInvoices.ID AS Varchar) AS ID,
(CASE WHEN Vandor.VandorName IS NULL THEN CAST(VInvoices.ID AS Varchar(MAX)) + \'-|-\' + \'&#1605;&#1588;&#1578;&#1585;&#1610;&#1575;&#1578; &#1606;&#1602;&#1583;&#1610;&#1577;\' + \'-|-\' + 
CAST(VInvoices.InvoiceData AS Varchar(MAX)) ELSE CAST(VInvoices.ID AS Varchar(MAX)) + \'-|-\' + Vandor.VandorName + \'-|-\' + 
CAST(VInvoices.InvoiceData AS Varchar(MAX)) END) AS Info
FROM VInvoices LEFT OUTER JOIN
Users ON VInvoices.UserID = Users.ID LEFT OUTER JOIN
Vandor ON VInvoices.VandorID = Vandor.ID 
WHERE VInvoices.[BranchID] = \'" . $NewBranchID . "\'
ORDER BY VInvoices.[ID] DESC";
    $UserLeval = sqlsrv_query($conn40,$sql10,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($UserLeval)) {
    while ($fetchZA = sqlsrv_fetch_array($UserLeval,SQLSRV_FETCH_ASSOC)){
    $resultA[] = $fetchZA;
    }
    echo json_encode(array(\'data\' => $resultA));
    }
    sqlsrv_free_stmt($UserLeval);
    sqlsrv_close($conn40);
}else if (strval($_GET["Type"]) == \'GetVendorPOIDS\') {
    $sql1 = "
;WITH RETS AS (
SELECT Vandor.VandorName,VendorPO.IDV,VendorPO.DataTime,VendorPO.ID,
VendorPO.Status,VendorPO.BranchID,VendorPO.VendorID,
(CAST(VendorPO.IDV as varchar(max)) + space(1) +  \'|\' + space(1) + CAST(VendorPO.DataTime as varchar(max)) + space(1) + \'|\' + space(1) + Vandor.VandorName) AS Info
FROM VendorPO LEFT OUTER JOIN
Vandor ON VendorPO.VendorID = Vandor.ID
WHERE VendorPO.[BranchID] = \'".$NewBranchID."\')
SELECT * FROM RETS
WHERE Status = 0
ORDER BY RETS.[IDV] ASC";
    $ClientsA = sqlsrv_query($conn29,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn29);
}else if (strval($_GET["Type"]) == \'GetKhaznaAccountType\') {
    $SQLString = \'\';
    if ($ContractorsValue == true){
        $SQLString = \'\';
    }else{
        $SQLString = \' WHERE [ID] != 3\';
    }

    $sql1 = "SELECT * FROM KhaznaSarfType ".$SQLString." ORDER BY [ID] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetKhaznaSarfIDV\') {
    $sql = "SELECT ISNULL((SELECT TOP (1) [IDV] + 1 AS [IDV] FROM AzenSarfKhazna WHERE [BranchID] = \'" . $NewBranchID . "\' ORDER BY [IDV] DESC),1) AS IDV";
    $ItemString = sqlsrv_query($conn10,$sql,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ItemString,SQLSRV_FETCH_ASSOC);
    $result = array();
    if (sqlsrv_has_rows($ItemString)) {
    $result[] = $fetch;
    print json_encode($fetch);
    }else{
        $err[] = \'\';
         echo json_encode(array("status"=>false,"err"=>$err));
    }
    sqlsrv_free_stmt($ItemString);
    sqlsrv_close($conn10);
}else if (strval($_GET["Type"]) == \'GetBankAccountName\') {
    if(isset($_GET[\'CurrencyID\'])) $CurrencyID = pesticide($_GET[\'CurrencyID\']);
    $sql1 = "
SELECT BankAccounts.ID,BankAccounts.BankID,BankAccounts.AccountNumber,
Bank.BankStatus,BankAccounts.[CurrencyID],
(Bank.BankeName + \' - \' + BankAccounts.AccountNumber) AS BankeName
FROM BankAccounts LEFT OUTER JOIN
Bank ON BankAccounts.BankID = Bank.ID
WHERE Bank.[BankStatus] = \'True\'
AND BankAccounts.[CurrencyID] = \'". $CurrencyID ."\'
ORDER BY BankAccounts.[ID] ASC";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetCheckAccountName\') {
    if(isset($_GET[\'CurrencyID\'])) $CurrencyID = pesticide($_GET[\'CurrencyID\']);
    $sql1 = "
;WITH RETS AS (
SELECT A.ID,A.DataTime,A.BankID,
CAST(A.ChecksEndDateTime AS Varchar(max)) AS ChecksEndDateTime,
A.Total AS TotalOrginal,
CAST((ISNULL(A.Total,0) - ISNULL((SELECT ISNULL(SUM(CAST(BS.TotalValue AS decimal(18,6))),0) FROM KSItem BS WHERE BS.[CheckID] = A.[ID]),0)) AS Varchar(max)) AS Total,
CAST(A.[ChecksCodeValue] AS Varchar(max)) AS ChecksCodeValue,
CAST(A.[ChecksCodeValue] AS Varchar(max)) + \' - \' +
(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT (CASE WHEN SS.[Type] = \'Vendor\' THEN (SELECT TOP 1 [VandorName] FROM Vandor WHERE SS.[TypeID] = Vandor.[ID])
WHEN SS.[Type] = \'Contractors\' THEN (SELECT TOP 1 [VandorName] FROM Contractors WHERE SS.[TypeID] = Contractors.[ID])
WHEN SS.[Type] = \'Client\' THEN (SELECT TOP 1 [ClientName] FROM Clients WHERE SS.[TypeID] = Clients.[ID])
WHEN SS.[Type] = \'Expensescash\' THEN (SELECT TOP 1 [AccountNameValue] FROM AccountsDefinition WHERE SS.[TypeID] = AccountsDefinition.[ID])
WHEN SS.[Type] = \'Other\' THEN (SELECT TOP 1 [AccountNameValue] FROM AccountsDefinition WHERE SS.[TypeID] = AccountsDefinition.[ID])END) AS Names
FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID])
ELSE (SELECT (CASE WHEN SS.[Type] = \'Vendor\' THEN (SELECT TOP 1 [VandorName] FROM Vandor WHERE SS.[TypeID] = Vandor.[ID])
WHEN SS.[Type] = \'Contractors\' THEN (SELECT TOP 1 [VandorName] FROM Contractors WHERE SS.[TypeID] = Contractors.[ID])
WHEN SS.[Type] = \'Client\' THEN (SELECT TOP 1 [ClientName] FROM Clients WHERE SS.[TypeID] = Clients.[ID])
WHEN SS.[Type] = \'Expensescash\' THEN (SELECT TOP 1 [AccountNameValue] FROM AccountsDefinition WHERE SS.[TypeID] = AccountsDefinition.[ID])
WHEN SS.[Type] = \'Other\' THEN (SELECT TOP 1 [AccountNameValue] FROM AccountsDefinition WHERE SS.[TypeID] = AccountsDefinition.[ID])END) AS Names
FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID])END) AS [Name],

(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT (CASE WHEN SS.[Type] = \'Client\' THEN \'&#1593;&#1605;&#1604;&#1575;&#1569;\'
WHEN SS.[Type] = \'Contractors\' THEN \'&#1605;&#1602;&#1575;&#1608;&#1604;&#1610;&#1606;\'
WHEN SS.[Type] = \'Vendor\' THEN \'&#1605;&#1608;&#1585;&#1583;&#1610;&#1606;\'
WHEN SS.[Type] = \'Other\' THEN \'&#1581;&#1587;&#1575;&#1576;&#1575;&#1578; &#1571;&#1582;&#1585;&#1609;\' END) AS N
FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID])
ELSE 
(SELECT (CASE WHEN SS.[Type] = \'Client\' THEN \'&#1593;&#1605;&#1604;&#1575;&#1569;\'
WHEN SS.[Type] = \'Contractors\' THEN \'&#1605;&#1602;&#1575;&#1608;&#1604;&#1610;&#1606;\'
WHEN SS.[Type] = \'Vendor\' THEN \'&#1605;&#1608;&#1585;&#1583;&#1610;&#1606;\'
WHEN SS.[Type] = \'Other\' THEN \'&#1581;&#1587;&#1575;&#1576;&#1575;&#1578; &#1571;&#1582;&#1585;&#1609;\' END) AS N
FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID])END) AS SSType,

(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT SS.[Type] FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID])
ELSE (SELECT SS.[Type] FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID])END) AS [SType],
(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT SS.[ChecksType] FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID])
ELSE
(SELECT SS.[ChecksType] FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID])END) AS [ChecksType],
(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT SS.[IDV] FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID])
ELSE
(SELECT SS.[IDV] FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID])END) AS [IDV],

(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT SS.[NewCode] FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID] AND SS.[BranchID] = A.[BranchID])
ELSE
(SELECT SS.[NewCode] FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID] AND SS.[BranchID] = A.[BranchID])END) AS [NewCode],
(CASE WHEN A.[Type] = \'CheckOutID\' THEN
(SELECT [Name] FROM ChecksBank WHERE [ID] = (SELECT SS.[BankID] FROM CheckOutItem SS WHERE A.[IDO] = SS.[ID]))
ELSE
(SELECT [Name] FROM ChecksBank WHERE [ID] = (SELECT SS.[BankID] FROM CheckOutBeginItem SS WHERE A.[IDO] = SS.[ID]))
END) AS [BankeName],
(SELECT ISNULL(SUM(CAST(BS.TotalValue AS decimal(18,2))),0) FROM KSItem BS WHERE BS.[CheckID] = A.[ID]) AS TotalCheck
FROM Checks_Entery A 
WHERE A.[ID] NOT IN (SELECT ISNULL([ValueID],0) FROM CheckOutSdaadItem WHERE [GoToValue] = \'2\')
AND A.[ID] NOT IN (SELECT ISNULL([CheckID],0) FROM CheckOutRefundItem)
AND (A.[Type] = \'CheckOutID\' OR A.[Type] = \'ChecksOutBegin\')
AND A.[BranchID] = \'" . $NewBranchID . "\')
SELECT * FROM RETS WHERE TotalOrginal > TotalCheck";
    $ClientsA = sqlsrv_query($conn23,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    if (sqlsrv_has_rows($ClientsA)) {
    while ($fetchT = sqlsrv_fetch_array($ClientsA,SQLSRV_FETCH_ASSOC)){
    $result[] = $fetchT;
    }
    echo json_encode(array(\'data\' => $result));
    }
    sqlsrv_free_stmt($ClientsA);
    sqlsrv_close($conn23);
}else if (strval($_GET["Type"]) == \'GetKhaznaSarfIDDaily\') {
    if(isset($_GET[\'Date\'])) $Date = pesticide($_GET[\'Date\']);
    $sql1 = "
Declare @InvoiceDateValue as date = \'" . $Date . "\';
SELECT (SELECT FORMAT(@InvoiceDateValue, \'yyyy\') + FORMAT(@InvoiceDateValue, \'MM\') + FORMAT(@InvoiceDateValue, \'dd\') + \'-\' +
CAST((CASE WHEN (SELECT COUNT([IDDaily]) FROM AzenSarfKhazna WHERE [BranchID] = \'" . $NewBranchID . "\' AND [DataTime] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\')) = 0 THEN \'1\'
ELSE (SELECT COUNT([IDDaily]) + 1 AS [IDDaily] FROM AzenSarfKhazna WHERE [BranchID] = \'" . $NewBranchID . "\' AND [DataTime] = FORMAT(@InvoiceDateValue, \'yyyy/MM/dd\'))
END) AS varchar(max))) AS Date";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $result[] = $fetch;
        print json_encode($fetch);
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}else if (strval($_GET["Type"]) == \'CheckKhaznaBranch\') {
    if(isset($_GET[\'KhaznaIDA\'])) $KhaznaIDA = pesticide($_GET[\'KhaznaIDA\']);
    $sql1 = "SELECT TOP (1) * FROM KhaznaAccounts WHERE [KhaznaID] = \'" . $KhaznaIDA . "\' AND [BranchID] = \'" . $NewBranchID . "\'";
    $ClientAAsA = sqlsrv_query($conn26,$sql1,array(),array("Scrollable"=>SQLSRV_CURSOR_FORWARD,"QueryTimeout"=>0)) or die(print_r(sqlsrv_errors(),true));
    $fetch = sqlsrv_fetch_array($ClientAAsA,SQLSRV_FETCH_ASSOC);
    if (sqlsrv_has_rows($ClientAAsA)) {
        $err[] = \'\';
        echo json_encode(array("status"=>true,"err"=>$err));
        }else{
            $err[] = \'\';
             echo json_encode(array("status"=>false,"err"=>$err));
        }
    sqlsrv_free_stmt($ClientAAsA);
    sqlsrv_close($conn26);
}






?>'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCi8vaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCmluY2x1ZGUgKCcuLi9pbmNsdWRlL2NvbmZpZy5waHAnKTsNCmluY2x1ZGUgKCcuLi9pbmNsdWRlL2Z1bmN0aW9uLnBocCcpOw0KDQoNCmlmKGlzc2V0KCRfR0VUWyJUeXBlIl0pKSAkVHlwZSA9IHN0cnZhbCgkX0dFVFsiVHlwZSJdKTsNCmlmKGlzc2V0KCRfR0VUWyJLaGF6bmFJRCJdKSkgJEtoYXpuYUlEID0gc3RydmFsKCRfR0VUWyJLaGF6bmFJRCJdKTsNCg0KaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnS2hhem5hJykgew0KaWYoaXNzZXQoJEtoYXpuYUlEKSl7DQogICAgaWYoJEtoYXpuYUlEICE9IDApew0KJHNxbCA9ICINClNFTEVDVCAqLA0KKFNFTEVDVCBUT1AgKDEpIFtDdXJyZW5jeUlEXSBGUk9NIEtoYXpuYSBXSEVSRSBbSURdID0gS2hhem5hVXNlcnMuW0toYXpuYUlEXSkgQVMgQ3VycmVuY3lJRA0KRlJPTSBLaGF6bmFVc2VycyBXSEVSRSBbS2hhem5hSURdID0gJyIuJEtoYXpuYUlELiInIEFORCBbVXNlcklEXSA9ICciLiROZXdVU0VSSUQuIiciOw0KJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4sJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KJHJlc3VsdCA9IGFycmF5KCk7DQppZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KJHJlc3VsdFtdID0gJGZldGNoOw0KcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCn1lbHNlew0KICAgICRlcnJbXSA9ICcmIzE1OTQ7JiMxNjEwOyYjMTU4NTsgJiMxNjA1OyYjMTU4NzsmIzE2MDU7JiMxNjA4OyYjMTU4MTsgJiMxNjA0OyYjMTYwNDsmIzE2MDU7JiMxNTg3OyYjMTU3ODsmIzE1ODI7JiMxNTgzOyYjMTYwNTsgJiMxNTc2OyYjMTU3NTsmIzE2MDQ7JiMxNTc4OyYjMTU5MzsmIzE1NzU7JiMxNjA1OyYjMTYwNDsgJiMxNjA1OyYjMTU5MzsgJiMxNjA3OyYjMTU4NDsmIzE2MDc7ICYjMTU3NTsmIzE2MDQ7JiMxNTgyOyYjMTU4NjsmIzE2MTA7JiMxNjA2OyYjMTU3NzsnOw0KICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KfQ0Kc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQpzcWxzcnZfY2xvc2UoJGNvbm4pOw0KICAgIH0NCn0NCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0JhbmsnKSB7DQppZihpc3NldCgkX0dFVFsiQmFua0lEIl0pKSAkQmFua0lEID0gc3RydmFsKCRfR0VUWyJCYW5rSUQiXSk7DQppZihpc3NldCgkQmFua0lEKSl7DQogICAgaWYoJEJhbmtJRCAhPSAwKXsNCiAgICAgICAgJHNxbCA9ICJTRUxFQ1QgKiBGUk9NIEJhbmtVc2VycyBXSEVSRSBbQmFua0lEXSA9ICciLiRCYW5rSUQuIicgQU5EIFtVc2VySURdID0gJyIuJE5ld1VTRVJJRC4iJyI7DQogICAgICAgICRTdG9yZUxpc3RTdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgICAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRTdG9yZUxpc3RTdHJpbmcpKSB7DQogICAgICAgIGlmKCRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkU3RvcmVMaXN0U3RyaW5nLCBTUUxTUlZfRkVUQ0hfQVNTT0MpKSB7DQokc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEJhbmtBY2NvdW50cyBXSEVSRSBbQmFua0lEXSA9ICciLiRCYW5rSUQuIiciOw0KJEJhbmtBQ0MgPSBzcWxzcnZfcXVlcnkoJGNvbm4yLCRzcWwxKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KaWYgKHNxbHNydl9oYXNfcm93cygkQmFua0FDQykpIHsNCndoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRCYW5rQUNDLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICAgICAgfQ0KZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE2MDU7JiMxNTg3OyYjMTYwNTsmIzE2MDg7JiMxNTgxOyAmIzE2MDQ7JiMxNjA0OyYjMTYwNTsmIzE1ODc7JiMxNTc4OyYjMTU4MjsmIzE1ODM7JiMxNjA1OyAmIzE1NzY7JiMxNTc1OyYjMTYwNDsmIzE1Nzg7JiMxNTkzOyYjMTU3NTsmIzE2MDU7JiMxNjA0OyAmIzE2MDU7JiMxNTkzOyAmIzE2MDc7JiMxNTg0OyYjMTU3NTsgJiMxNTc1OyYjMTYwNDsmIzE1NzY7JiMxNjA2OyYjMTYwMzsnOw0KICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgICAgIH0NCnNxbHNydl9mcmVlX3N0bXQoJFN0b3JlTGlzdFN0cmluZyk7DQpzcWxzcnZfY2xvc2UoJGNvbm4xKTsNCnNxbHNydl9jbG9zZSgkY29ubjIpOw0KICAgIH0NCn0NCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudE5hbWUnKSB7DQokc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIENsaWVudHMgV0hFUkUgW1N0YXR1c10gPSAnVHJ1ZScgT1JERVIgQlkgQ0FTVChbSURWXSBBUyBpbnQpIEFTQyI7DQokQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQp3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQokcmVzdWx0W10gPSAkZmV0Y2hUOw0KfQ0KZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KfQ0Kc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0Kc3Fsc3J2X2Nsb3NlKCRjb25uMyk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRNYW5kb2JOYW1lJykgew0KJHNxbDEgPSAiU0VMRUNUICogRlJPTSBNYW5kb2IgT1JERVIgQlkgW0lEXSBBU0MiOw0KJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCmlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0Kd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KJHJlc3VsdFtdID0gJGZldGNoVDsNCn0NCmVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQpzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQpzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEtoYXpuYU5hbWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBLaGF6bmEgV0hFUkUgW0toYXpuYVN0YXR1c10gPSAnVHJ1ZScgQU5EIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIE9SREVSIEJZIFtJRFZdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNSwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjUpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q3VycmVuY3lJRE5hbWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBDdXJyZW5jeSAgT1JERVIgQlkgW0lEXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjYsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm42KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEJhbmtJRE5hbWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBCYW5rIFdIRVJFIFtCYW5rU3RhdHVzXSA9ICdUcnVlJyBPUkRFUiBCWSBbSURWXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjcsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm43KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFN0b3JlSUROYW1lJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gU3RvcmVzIFdIRVJFIFtTdG9yZVN0YXR1c10gPSAnVHJ1ZScgQU5EIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIE9SREVSIEJZIFtJRFZdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uOCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjgpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0U3RvcmVVc2VycycpIHsNCiAgICBpZihpc3NldCgkX0dFVFsiU3RvcmVJRCJdKSkgJFN0b3JlSUQgPSBzdHJ2YWwoJF9HRVRbIlN0b3JlSUQiXSk7DQogICAgJHNxbCA9ICJTRUxFQ1QgKiBGUk9NIFN0b3JlVXNlcnMgV0hFUkUgW1N0b3JlSURdID0gJyIuJFN0b3JlSUQuIicgQU5EIFtVc2VySURdID0gJyIuJE5ld1VTRVJJRC4iJyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm45LCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE2MDU7JiMxNTg3OyYjMTYwNTsmIzE2MDg7JiMxNTgxOyAmIzE2MDQ7JiMxNjA0OyYjMTYwNTsmIzE1ODc7JiMxNTc4OyYjMTU4MjsmIzE1ODM7JiMxNjA1OyAmIzE1NzY7JiMxNTc1OyYjMTYwNDsmIzE1Nzg7JiMxNTkzOyYjMTU3NTsmIzE2MDU7JiMxNjA0OyAmIzE2MDU7JiMxNTkzOyAmIzE2MDc7JiMxNTg0OyYjMTU3NTsgJiMxNTc1OyYjMTYwNDsmIzE2MDU7JiMxNTgyOyYjMTU4NjsmIzE2MDY7JzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjkpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SW52b2ljZUlEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJRF0gKyAxIEFTIFtJRF0gRlJPTSBJbnZvaWNlcyBXSEVSRSBbQnJhbmNoSURdID0gJyIgLiAkTmV3QnJhbmNoSUQgLiAiJyBPUkRFUiBCWSBbSURdIERFU0MpLDEpIEFTIElEIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRCcmFuY2hJRCcpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEJyYW5jaCBXSEVSRSBbU3RhdHVzXSA9ICdUcnVlJyBPUkRFUiBCWSBbSURWXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjExLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTEpOw0KIH1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFVzZXJzSUQnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbIkJyYW5jaElEIl0pKSAkQnJhbmNoSURTID0gc3RydmFsKCRfR0VUWyJCcmFuY2hJRCJdKTsNCiAgICAkbXNnID0nJzsNCiAgICAkbXNnID0nPG9wdGlvbiB2YWx1ZT0iMCI+JiMxNTc1OyYjMTU4MjsmIzE1Nzg7JiMxNTg1OyAmIzE1NzU7JiMxNjA0OyYjMTYwNTsmIzE1ODc7JiMxNTc4OyYjMTU4MjsmIzE1ODM7JiMxNjA1OyAuLi4uPC9vcHRpb24+JzsNCiAgICANCiAgICAkc3FsID0gIg0KU0VMRUNUIFVzZXJzLlVzZXJOYW1lLFVzZXJzLlN0YXR1cyxVc2Vycy5JRA0KRlJPTSBCcmFuY2hVc2VycyBMRUZUIE9VVEVSIEpPSU4NClVzZXJzIE9OIEJyYW5jaFVzZXJzLlVzZXJJRCA9IFVzZXJzLklEDQpXSEVSRSBVc2Vycy5bU3RhdHVzXSA9ICdUcnVlJw0KQU5EIEJyYW5jaFVzZXJzLltCcmFuY2hJRF0gPSAnIi4kQnJhbmNoSURTLiInDQpPUkRFUiBCWSBVc2Vycy5bSURWXSBBU0MiOw0KICAgICRCcmFuY2hMaXN0U3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTIsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRCcmFuY2hMaXN0U3RyaW5nKSkgew0KICAgIHdoaWxlKCRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQnJhbmNoTGlzdFN0cmluZywgU1FMU1JWX0ZFVENIX0FTU09DKSkgew0KICAgICAgICAkbXNnIC49JzxvcHRpb24gdmFsdWU9JyAuICRmZXRjaFsiSUQiXSAuICc+JyAuICRmZXRjaFsiVXNlck5hbWUiXSAuICc8L29wdGlvbj4nOw0KICAgIH0NCiAgICB9ZWxzZXskbXNnIC49Ik5vIFVzZXJzIFdlcmUgRm91bmQhIjsNCiAgICB9DQogICAgDQogICAgZWNobyAkbXNnOw0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEJyYW5jaExpc3RTdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEyKTsNCiB9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdDaGVja0xvZ2luVmFsdWUnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0JyYW5jaE5hbWVJRCddKSkgJEJyYW5jaE5hbWVJRCA9IHBlc3RpY2lkZSgkX0dFVFsnQnJhbmNoTmFtZUlEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydVc2VySUQnXSkpICRVc2VySUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1VzZXJJRCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnUGFzc3dvcmQnXSkpICRQYXNzd29yZCA9IHBlc3RpY2lkZSgkX0dFVFsnUGFzc3dvcmQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1JlbWVtYmVyJ10pKSAkUmVtZW1iZXIgPSBwZXN0aWNpZGUoJF9HRVRbJ1JlbWVtYmVyJ10pOw0KICAgICR0aW1lID0gdGltZSgpOw0KDQogICAgJHNxbDEgPSAiDQpTRUxFQ1QgQnJhbmNoVXNlcnMuSUQsQnJhbmNoVXNlcnMuVXNlcklELEJyYW5jaFVzZXJzLkJyYW5jaElELA0KVXNlcnMuVXNlck5hbWUsVXNlcnMuQWNjb3VudE5hbWUsVXNlcnMuUGFzc3dvcmQsVXNlcnMuU3RhdHVzLCANClVzZXJzLlVzZXJsZXZhbCxVc2Vycy5MYXN0TG9naW4sVXNlcnMuU2hvd1ByaWNlTGlzdEluSW52b2ljZSwgDQpVc2Vycy5Mb2dpbkZyb20sVXNlcnMuSW52b2ljZUxpbWl0ZWREaXNjY291bnQsVXNlcnMuSW52b2ljZUxpbWl0ZWRTdGF0dXMsVXNlcnMuSW52b2ljZVBheW1lbmluZm8sDQpVc2Vycy5JdGVtc0NyZWRpdEludm9pY2UsVXNlcnMuU2VyaWFsTnVtYmVyVmFsdWUsVXNlcnMuSW52b2ljZVByaWNlRWRpdCxVc2Vycy5Vc2VyQ2FuRGlzY291bnQsIA0KVXNlcnMuRGF0ZUVkaXRlLFVzZXJzLklEVixCcmFuY2guQnJhbmNoZU5hbWUNCkZST00gQnJhbmNoVXNlcnMgTEVGVCBPVVRFUiBKT0lODQpCcmFuY2ggT04gQnJhbmNoVXNlcnMuQnJhbmNoSUQgPSBCcmFuY2guSUQgTEVGVCBPVVRFUiBKT0lODQpVc2VycyBPTiBCcmFuY2hVc2Vycy5Vc2VySUQgPSBVc2Vycy5JRCANCldIRVJFIEJyYW5jaFVzZXJzLltVc2VySURdID0gJyIuJFVzZXJJRC4iJyANCkFORCBCcmFuY2hVc2Vycy5bQnJhbmNoSURdID0gJyIuJEJyYW5jaE5hbWVJRC4iJw0KQU5EIFVzZXJzLltQYXNzd29yZF0gPSAnIi4kUGFzc3dvcmQuIiciOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjEzLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJFVzZXJsZXZhbE4gPSAkZmV0Y2hUWydVc2VybGV2YWwnXTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICAgICAJCSRfU0VTU0lPTlsnTG9nZ2VkU3RhdHVzJ10gPSAnVHJ1ZSc7DQoJCQkkX1NFU1NJT05bJ0JyYW5jaElEJ10gPSAkQnJhbmNoTmFtZUlEOw0KCQkJJF9TRVNTSU9OWydVc2VySUQnXSA9ICRVc2VySUQ7DQoJCQkkX1NFU1NJT05bJ0xldmFsSUQnXSA9ICRVc2VybGV2YWxOOwkJCQ0KDQoJCQlpZiAoJFJlbWVtYmVyID09IHRydWUpew0KCQkJc2V0Y29va2llKCdVc2VySUQnLCAkVXNlcklELCAkdGltZSArIDYwICogNjAgKiAyNCAqIDMwKTsNCgkJCXNldGNvb2tpZSgnQnJhbmNoSUQnLCAkQnJhbmNoTmFtZUlELCAkdGltZSArIDYwICogNjAgKiAyNCAqIDMwKTsNCiAgICAgICAgfQ0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+dHJ1ZSwiZXJyIj0+JGVycikpOw0KICB9ZWxzZXsNCiAgICB1bnNldCgkX1NFU1NJT05bJ0xvZ2dlZFN0YXR1cyddKTsNCiAgICB1bnNldCgkX1NFU1NJT05bJ1VzZXJJRCddKTsNCiAgICB1bnNldCgkX1NFU1NJT05bJ0JyYW5jaElEJ10pOw0KICAgIHVuc2V0KCRfU0VTU0lPTlsnTGV2YWxJRCddKTsNCiAgICBzZXRjb29raWUoJ1VzZXJJRCcsJycpOw0KICAgIHNldGNvb2tpZSgnQnJhbmNoSUQnLCcnKTsNCiAgICBzZXNzaW9uX2Rlc3Ryb3koKTsNCiANCiAgICAgJGVycltdID0gJyYjMTYwMzsmIzE2MDQ7JiMxNjA1OyYjMTU3NzsgJiMxNTc1OyYjMTYwNDsmIzE2MDU7JiMxNTg1OyYjMTYwODsmIzE1ODU7ICYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE1ODk7JiMxNTgxOyYjMTYxMDsmIzE1ODE7JiMxNTc3Oyc7DQogICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQp9DQpzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQpzcWxzcnZfY2xvc2UoJGNvbm4xMyk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRQcmljZU5hbWVWYWx1ZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIFByaWNlTGlzdCBXSEVSRSBbUHJpY2VTdGF0dXNdID0gJ1RydWUnIE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4xNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE0KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEl0ZW1VaW50TmFtZScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSXRlbUNvZGUnXSkpICRJdGVtQ29kZSA9IHBlc3RpY2lkZSgkX0dFVFsnSXRlbUNvZGUnXSk7DQogICAgJHNxbDEgPSAiDQpERUNMQVJFIEBJdGVtQ29kZSBhcyBudmFyY2hhcihtYXgpID0gJyIuJEl0ZW1Db2RlLiInOw0KU0VMRUNUICogRlJPTSBVbml0cyBXSEVSRSANCihbSURWXSBJTiAoU0VMRUNUIFVuaXRzIEZST00gSXRlbSBXSEVSRSBbSXRlbUNvZGVdID0gQEl0ZW1Db2RlKQ0KT1IgW0lEVl0gSU4gIChTRUxFQ1QgQWRkX1VuaXRzIEZST00gSXRlbSBXSEVSRSBbSXRlbUNvZGVdID0gQEl0ZW1Db2RlKSkiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjE1LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xNSk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRJdGVtQ29kZScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSXRlbUlEJ10pKSAkSXRlbUlEID0gcGVzdGljaWRlKCRfR0VUWydJdGVtSUQnXSk7DQogICAgJHNxbCA9ICJTRUxFQ1QgW0lUZW1Db2RlXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9ICciLiRJdGVtSUQuIiciOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTYsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudEluZm8nKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0NsaWVudElEJ10pKSAkQ2xpZW50SUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0NsaWVudElEJ10pOw0KICAgICRzcWwgPSAiU0VMRUNUICogRlJPTSBDbGllbnRzIFdIRVJFIFtJRF0gPSAnIi4kQ2xpZW50SUQuIiciOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTcsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE3KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFByaWNlJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydJdGVtQ29kZSddKSkgJEl0ZW1Db2RlID0gcGVzdGljaWRlKCRfR0VUWydJdGVtQ29kZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnUHJpY2VJRCddKSkgJFByaWNlSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1ByaWNlSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1VuaXRzSUQnXSkpICRVbml0c0lEID0gcGVzdGljaWRlKCRfR0VUWydVbml0c0lEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJbnZvaWNlRGF0ZVZhbHVlJ10pKSAkSW52b2ljZURhdGVWYWx1ZSA9IGhhY2tlZGxvZyhwZXN0aWNpZGUoJF9HRVRbJ0ludm9pY2VEYXRlVmFsdWUnXSkpOw0KICAgIGlmKGlzc2V0KCRfR0VUWydDbGllbnRJRCddKSkgJENsaWVudElEID0gcGVzdGljaWRlKCRfR0VUWydDbGllbnRJRCddKTsNCg0KJHNxbCA9ICINClNFVCBOT0NPVU5UIE9ODQpERUNMQVJFIEBJdGVtQ29kZSBhcyBudmFyY2hhcihtYXgpID0gJyIuJEl0ZW1Db2RlLiInOw0KREVDTEFSRSBARGVmYWx1dGVQaXJjZSBhcyBpbnQgPSAnIi5pbnR2YWwoJFByaWNlSUQpLiInOw0KREVDTEFSRSBAQ2xpZW50SUQgYXMgaW50ID0gJyIuaW50dmFsKCRDbGllbnRJRCkuIic7DQpERUNMQVJFIEBVaW50SUQgYXMgaW50ID0gKENBU0UgV0hFTiAnIi5pbnR2YWwoJFVuaXRzSUQpLiInID0gMCBUSEVOIChTRUxFQ1QgVE9QICgxKSBbVW5pdHNdIEZST00gSXRlbSBXSEVSRSBbSXRlbUNvZGVdID0gQEl0ZW1Db2RlKSBFTFNFICciLmludHZhbCgkVW5pdHNJRCkuIicgRU5EKTsNCkRFY2xhcmUgQERhdGVUaW1lIGFzIGRhdGUgPSAnIi4kSW52b2ljZURhdGVWYWx1ZS4iJzsNCjsNClNFTEVDVCAnVHJ1ZScgQVMgc3RhdHVzLA0KSVNOVUxMKChDQVNFIFdIRU4gQENsaWVudElEICE9IDAgVEhFTg0KKENBU0UgV0hFTiBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIElTTlVMTChbSXRlbVByaWNlXSwwKSBBUyBJdGVtUHJpY2UgRlJPTSBDbGllbnRzSXRlbSBXSEVSRSBbQ2xpZW50SURdID0gQENsaWVudElEIEFORCBbSXRlbUlEXSA9IEl0ZW0uW0lEXSBBTkQgW0l0ZW1QcmljZV0gSVMgTk9UIE5VTEwpLDApICE9MCBUSEVODQooU0VMRUNUIFRPUCAoMSkgSVNOVUxMKFtJdGVtUHJpY2VdLDApIEFTIEl0ZW1QcmljZSBGUk9NIENsaWVudHNJdGVtIFdIRVJFIFtDbGllbnRJRF0gPSBAQ2xpZW50SUQgQU5EIFtJdGVtSURdID0gSXRlbS5bSURdIEFORCBbSXRlbVByaWNlXSBJUyBOT1QgTlVMTCkNCkVMU0UNCihDQVNFIFdIRU4gKFNFTEVDVCBUT1AgKDEpIENsaWVudHMuW0hvd1RvUGF5VmFsdWVdIEZST00gQ2xpZW50cyBXSEVSRSBDbGllbnRzLltJRF0gPSBAQ2xpZW50SUQpID0gJ1RydWUnIFRIRU4NCihDQVNFIFdIRU4gSVNOVUxMKEl0ZW0uW0l0ZW1UeXBlXSwnRmFsc2UnKSAhPSAnVHJ1ZScgVEhFTg0KKENBU0UgV0hFTiBAVWludElEID0gSXRlbS5bVW5pdHNdIFRIRU4NCklTTlVMTChDQVNUKChTRUxFQ1QgVE9QICgxKSBJVFAuW1ByaWNlQW1vdW50XSBGUk9NIEl0ZW1fUHJpY2UgSVRQDQpXSEVSRSBJVFAuW1ByaWNlSURdID0gQERlZmFsdXRlUGlyY2UgQU5EIElUUC5bSVRlbUNvZGVdID0gSXRlbS5bSVRlbUNvZGVdIEFORCBJVFAuW1R5cGVdID0gJ1RydWUnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KV0hFTiBAVWludElEID0gSXRlbS5bQWRkX1VuaXRzXSBUSEVODQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZUFtb3VudF0gRlJPTSBJdGVtX1ByaWNlIElUUA0KV0hFUkUgSVRQLltQcmljZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIEFORCBJVFAuW0lUZW1Db2RlXSA9IEl0ZW0uW0lUZW1Db2RlXSBBTkQgSVRQLltUeXBlXSA9ICdGYWxzZScpIEFTIERlY2ltYWwoMzgsMikpLDApDQpFTFNFDQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZUFtb3VudF0gRlJPTSBJdGVtX1ByaWNlIElUUA0KV0hFUkUgSVRQLltQcmljZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIEFORCBJVFAuW0lUZW1Db2RlXSA9IEl0ZW0uW0lUZW1Db2RlXSBBTkQgSVRQLltUeXBlXSA9ICdUcnVlJykgQVMgRGVjaW1hbCgzOCwyKSksMCkNCkVORCkNCldIRU4gSVNOVUxMKEl0ZW0uW0l0ZW1UeXBlXSwnRmFsc2UnKSA9ICdUcnVlJyBUSEVODQooU0VMRUNUIFRPUCAoMSkNCihDQVNFIFdIRU4gSXRlbUJhbmRlbC5bUHJpY2VPbmVJRF0gPSBARGVmYWx1dGVQaXJjZSBUSEVOIEl0ZW1CYW5kZWwuW1ByaWNlXQ0KV0hFTiBJdGVtQmFuZGVsLltQcmljZVR3b0lEXSA9IEBEZWZhbHV0ZVBpcmNlIFRIRU4gSXRlbUJhbmRlbC5bSXRlbVByaWNlVHdvXQ0KV0hFTiBJdGVtQmFuZGVsLltQcmljZVRocmVlSURdID0gQERlZmFsdXRlUGlyY2UgVEhFTiBJdGVtQmFuZGVsLltJdGVtUHJpY2VUaHJlZV0gRU5EKQ0KRlJPTSBJdGVtQmFuZGVsIFdIRVJFIEl0ZW1CYW5kZWwuW0lUZW1Db2RlXSA9IEBJdGVtQ29kZSkNCkVORCkNCldIRU4gKFNFTEVDVCBUT1AgKDEpIENsaWVudHMuW0hvd1RvUGF5VmFsdWVdIEZST00gQ2xpZW50cyBXSEVSRSBDbGllbnRzLltJRF0gPSBAQ2xpZW50SUQpID0gJ0ZhbHNlJyBUSEVODQooQ0FTRSBXSEVOIEBVaW50SUQgPSBJdGVtLltVbml0c10gVEhFTg0KSVNOVUxMKChDQVNFIFdIRU4gSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSXRlbVByaWNlXSBGUk9NIEl0ZW1OZXdQcmljZUNsaWVudEl0ZW0gSVRGIFdIRVJFIElURi5bQ2xpZW50SURdID0gQENsaWVudElEIEFORCBJVEYuW0l0ZW1JRF0gPSBJdGVtLltJRF0gQU5EIEZPUk1BVChARGF0ZVRpbWUsICd5eXl5L01NL2RkJykgQkVUV0VFTiBJVEYuW1N0YXJ0RGF0ZV0gQU5EIElURi5bRW5kRGF0ZV0gQU5EIElURi5bU3RhdHVzXSA9ICdGYWxzZScpLDApICE9IDAgVEhFTg0KSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSXRlbVByaWNlXSBGUk9NIEl0ZW1OZXdQcmljZUNsaWVudEl0ZW0gV0hFUkUgW0NsaWVudElEXSA9IEBDbGllbnRJRCBBTkQgW0l0ZW1JRF0gPSBJdGVtLltJRF0gQU5EIEZPUk1BVChARGF0ZVRpbWUsICd5eXl5L01NL2RkJykgQkVUV0VFTiBbU3RhcnREYXRlXSBBTkQgW0VuZERhdGVdIEFORCBbU3RhdHVzXSA9ICdGYWxzZScpLDApDQpFTFNFDQpJU05VTEwoKFNFTEVDVCBUT1AgKDEpIElOVkkuW0l0ZW1QcmljZV0gRlJPTSBJbnZvaWNlX0l0ZW0gSU5WSSBXSEVSRSBJTlZJLltJdGVtSURdID0gSXRlbS5bSURdIEFORCBJTlZJLltJc0Jvbm91c10gPSAnRmFsc2UnIEFORCBJTlZJLltDbGllbnRJRF0gPSBAQ2xpZW50SUQgQU5EIElOVkkuW0l0ZW1QcmljZV0gSVMgTk9UIE5VTEwgT1JERVIgQlkgSU5WSS5bSURdIERFU0MpLDApDQpFTkQpLDApDQpXSEVOIEBVaW50SUQgPSBJdGVtLltBZGRfVW5pdHNdIFRIRU4NCklTTlVMTCgoQ0FTRSBXSEVOIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgSVRDLltJdGVtUHJpY2VdIEZST00gSXRlbU5ld1ByaWNlQ2xpZW50SXRlbSBJVEMgV0hFUkUgSVRDLltDbGllbnRJRF0gPSBAQ2xpZW50SUQgQU5EIElUQy5bSXRlbUlEXSA9IEl0ZW0uW0lEXSBBTkQgRk9STUFUKEBEYXRlVGltZSwgJ3l5eXkvTU0vZGQnKSBCRVRXRUVOIElUQy5bU3RhcnREYXRlXSBBTkQgSVRDLltFbmREYXRlXSBBTkQgSVRDLltTdGF0dXNdID0gJ0ZhbHNlJyksMCkgIT0gMCBUSEVODQooU0VMRUNUIFRPUCAoMSkgKElUQ00uW0l0ZW1QcmljZV0gLyAoU0VMRUNUIFRPUCAoMSkgSVNOVUxMKElUTy5bQWRkX1VuaXRzX0NvdW50XSwxKSBGUk9NIEl0ZW0gSVRPIFdIRVJFIElUTy5bSURdID0gSXRlbS5bSURdKSkNCkZST00gSXRlbU5ld1ByaWNlQ2xpZW50SXRlbSBJVENNIFdIRVJFIElUQ00uW0NsaWVudElEXSA9IEBDbGllbnRJRCBBTkQgSVRDTS5bSXRlbUlEXSA9IEl0ZW0uW0lEXSBBTkQgRk9STUFUKEBEYXRlVGltZSwgJ3l5eXkvTU0vZGQnKSBCRVRXRUVOIElUQ00uW1N0YXJ0RGF0ZV0gQU5EIElUQ00uW0VuZERhdGVdIEFORCBJVENNLltTdGF0dXNdID0gJ0ZhbHNlJykNCkVMU0UgKFNFTEVDVCBUT1AgKDEpIFtJdGVtUHJpY2VVXSBGUk9NIEludm9pY2VfSXRlbSBXSEVSRSBbSXRlbUlEXSA9IEl0ZW0uW0lEXSBBTkQgW0lzQm9ub3VzXSA9ICdGYWxzZScgQU5EIFtDbGllbnRJRF0gPSBAQ2xpZW50SUQgQU5EIFtJdGVtUHJpY2VdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtJRF0gREVTQykgRU5EKSwwKQ0KRU5EKQ0KRU5EKQ0KRU5EKQ0KV0hFTiBAQ2xpZW50SUQgPSAwIFRIRU4NCihDQVNFIFdIRU4gSVNOVUxMKEl0ZW0uW0l0ZW1UeXBlXSwnRmFsc2UnKSA9ICdGYWxzZScgVEhFTg0KKENBU0UgV0hFTiBAVWludElEID0gSXRlbS5bVW5pdHNdIFRIRU4NCklTTlVMTChDQVNUKChTRUxFQ1QgVE9QICgxKSBJVFAuW1ByaWNlQW1vdW50XSBGUk9NIEl0ZW1fUHJpY2UgSVRQDQpXSEVSRSBJVFAuW1ByaWNlSURdID0gQERlZmFsdXRlUGlyY2UgQU5EIElUUC5bSVRlbUNvZGVdID0gSXRlbS5bSVRlbUNvZGVdIEFORCBJVFAuW1R5cGVdID0gJ1RydWUnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KV0hFTiBAVWludElEID0gSXRlbS5bQWRkX1VuaXRzXSBUSEVODQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZUFtb3VudF0gRlJPTSBJdGVtX1ByaWNlIElUUA0KV0hFUkUgSVRQLltQcmljZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIEFORCBJVFAuW0lUZW1Db2RlXSA9IEl0ZW0uW0lUZW1Db2RlXSBBTkQgSVRQLltUeXBlXSA9ICdGYWxzZScpIEFTIERlY2ltYWwoMzgsMikpLDApDQpFTFNFDQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZUFtb3VudF0gRlJPTSBJdGVtX1ByaWNlIElUUA0KV0hFUkUgSVRQLltQcmljZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIEFORCBJVFAuW0lUZW1Db2RlXSA9IEl0ZW0uW0lUZW1Db2RlXSBBTkQgSVRQLltUeXBlXSA9ICdUcnVlJykgQVMgRGVjaW1hbCgzOCwyKSksMCkNCkVORCkNCg0KV0hFTiBJU05VTEwoSXRlbS5bSXRlbVR5cGVdLCdGYWxzZScpID0gJ1RydWUnIFRIRU4NCihTRUxFQ1QgVE9QICgxKQ0KKENBU0UgV0hFTiBJdGVtQmFuZGVsLltQcmljZU9uZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIFRIRU4gSXRlbUJhbmRlbC5bUHJpY2VdDQpXSEVOIEl0ZW1CYW5kZWwuW1ByaWNlVHdvSURdID0gQERlZmFsdXRlUGlyY2UgVEhFTiBJdGVtQmFuZGVsLltJdGVtUHJpY2VUd29dDQpXSEVOIEl0ZW1CYW5kZWwuW1ByaWNlVGhyZWVJRF0gPSBARGVmYWx1dGVQaXJjZSBUSEVOIEl0ZW1CYW5kZWwuW0l0ZW1QcmljZVRocmVlXSBFTkQpDQpGUk9NIEl0ZW1CYW5kZWwgV0hFUkUgSXRlbUJhbmRlbC5bSVRlbUNvZGVdID0gQEl0ZW1Db2RlKQ0KRU5EKQ0KRU5EKSwwKSBBUyBQcmljZSwNCg0KDQpJU05VTEwoKENBU0UgV0hFTiBAQ2xpZW50SUQgIT0gMCBUSEVODQooQ0FTRSBXSEVOIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgSVNOVUxMKFtJdGVtUHJpY2VdLDApIEFTIEl0ZW1QcmljZSBGUk9NIENsaWVudHNJdGVtIFdIRVJFIFtDbGllbnRJRF0gPSBAQ2xpZW50SUQgQU5EIFtJdGVtSURdID0gSXRlbS5bSURdIEFORCBbSXRlbVByaWNlXSBJUyBOT1QgTlVMTCksMCkgIT0wIFRIRU4gMA0KRUxTRQ0KKENBU0UgV0hFTiAoU0VMRUNUIFRPUCAoMSkgQ2xpZW50cy5bSG93VG9QYXlWYWx1ZV0gRlJPTSBDbGllbnRzIFdIRVJFIENsaWVudHMuW0lEXSA9IEBDbGllbnRJRCkgPSAnVHJ1ZScgVEhFTiAwDQpFTFNFDQooQ0FTRSBXSEVOIEBVaW50SUQgPSBJdGVtLltVbml0c10gVEhFTg0KSVNOVUxMKENBU1QoKFNFTEVDVCBUT1AgKDEpIElUUC5bUHJpY2VMaW1pdGVkXSBGUk9NIEl0ZW1fUHJpY2UgSVRQDQpXSEVSRSBJVFAuW1ByaWNlSURdID0gQERlZmFsdXRlUGlyY2UgQU5EIElUUC5bSVRlbUNvZGVdID0gSXRlbS5bSVRlbUNvZGVdIEFORCBJVFAuW1R5cGVdID0gJ1RydWUnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KV0hFTiBAVWludElEID0gSXRlbS5bQWRkX1VuaXRzXSBUSEVODQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZUxpbWl0ZWRdIEZST00gSXRlbV9QcmljZSBJVFANCldIRVJFIElUUC5bUHJpY2VJRF0gPSBARGVmYWx1dGVQaXJjZSBBTkQgSVRQLltJVGVtQ29kZV0gPSBJdGVtLltJVGVtQ29kZV0gQU5EIElUUC5bVHlwZV0gPSAnRmFsc2UnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KRUxTRQ0KSVNOVUxMKENBU1QoKFNFTEVDVCBUT1AgKDEpIElUUC5bUHJpY2VMaW1pdGVkXSBGUk9NIEl0ZW1fUHJpY2UgSVRQDQpXSEVSRSBJVFAuW1ByaWNlSURdID0gQERlZmFsdXRlUGlyY2UgQU5EIElUUC5bSVRlbUNvZGVdID0gSXRlbS5bSVRlbUNvZGVdIEFORCBJVFAuW1R5cGVdID0gJ1RydWUnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KRU5EKQ0KRU5EKQ0KRU5EKQ0KV0hFTiBAQ2xpZW50SUQgPSAwIFRIRU4NCihDQVNFIFdIRU4gQFVpbnRJRCA9IEl0ZW0uW1VuaXRzXSBUSEVODQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZUxpbWl0ZWRdIEZST00gSXRlbV9QcmljZSBJVFAgV0hFUkUgSVRQLltQcmljZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIEFORCBJVFAuW0lUZW1Db2RlXSA9IEl0ZW0uW0lUZW1Db2RlXSBBTkQgSVRQLltUeXBlXSA9ICdUcnVlJykgQVMgRGVjaW1hbCgzOCwyKSksMCkNCldIRU4gQFVpbnRJRCA9IEl0ZW0uW0FkZF9Vbml0c10gVEhFTg0KSVNOVUxMKENBU1QoKFNFTEVDVCBUT1AgKDEpIElUUC5bUHJpY2VMaW1pdGVkXSBGUk9NIEl0ZW1fUHJpY2UgSVRQIFdIRVJFIElUUC5bUHJpY2VJRF0gPSBARGVmYWx1dGVQaXJjZSBBTkQgSVRQLltJVGVtQ29kZV0gPSBJdGVtLltJVGVtQ29kZV0gQU5EIElUUC5bVHlwZV0gPSAnRmFsc2UnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KRUxTRQ0KSVNOVUxMKENBU1QoKFNFTEVDVCBUT1AgKDEpIElUUC5bUHJpY2VMaW1pdGVkXSBGUk9NIEl0ZW1fUHJpY2UgSVRQIFdIRVJFIElUUC5bUHJpY2VJRF0gPSBARGVmYWx1dGVQaXJjZSBBTkQgSVRQLltJVGVtQ29kZV0gPSBJdGVtLltJVGVtQ29kZV0gQU5EIElUUC5bVHlwZV0gPSAnVHJ1ZScpIEFTIERlY2ltYWwoMzgsMikpLDApDQpFTkQpRU5EKSwwKSBBUyBQcmljZUxpbWl0ZWQsDQoNCklTTlVMTCgoQ0FTRSBXSEVOIEBDbGllbnRJRCAhPSAwIFRIRU4NCihDQVNFIFdIRU4gSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBJU05VTEwoW0l0ZW1QcmljZV0sMCkgQVMgSXRlbVByaWNlIEZST00gQ2xpZW50c0l0ZW0gV0hFUkUgW0NsaWVudElEXSA9IEBDbGllbnRJRCBBTkQgW0l0ZW1JRF0gPSBJdGVtLltJRF0gQU5EIFtJdGVtUHJpY2VdIElTIE5PVCBOVUxMKSwwKSAhPTAgVEhFTiAwDQpFTFNFDQooQ0FTRSBXSEVOIChTRUxFQ1QgVE9QICgxKSBDbGllbnRzLltIb3dUb1BheVZhbHVlXSBGUk9NIENsaWVudHMgV0hFUkUgQ2xpZW50cy5bSURdID0gQENsaWVudElEKSA9ICdUcnVlJyBUSEVOIDANCkVMU0UNCihDQVNFIFdIRU4gQFVpbnRJRCA9IEl0ZW0uW1VuaXRzXSBUSEVODQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZU1heF0gRlJPTSBJdGVtX1ByaWNlIElUUCBXSEVSRSBJVFAuW1ByaWNlSURdID0gQERlZmFsdXRlUGlyY2UgQU5EIElUUC5bSVRlbUNvZGVdID0gSXRlbS5bSVRlbUNvZGVdIEFORCBJVFAuW1R5cGVdID0gJ1RydWUnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KV0hFTiBAVWludElEID0gSXRlbS5bQWRkX1VuaXRzXSBUSEVODQpJU05VTEwoQ0FTVCgoU0VMRUNUIFRPUCAoMSkgSVRQLltQcmljZU1heF0gRlJPTSBJdGVtX1ByaWNlIElUUCBXSEVSRSBJVFAuW1ByaWNlSURdID0gQERlZmFsdXRlUGlyY2UgQU5EIElUUC5bSVRlbUNvZGVdID0gSXRlbS5bSVRlbUNvZGVdIEFORCBJVFAuW1R5cGVdID0gJ0ZhbHNlJykgQVMgRGVjaW1hbCgzOCwyKSksMCkNCkVMU0UNCklTTlVMTChDQVNUKChTRUxFQ1QgVE9QICgxKSBJVFAuW1ByaWNlTWF4XSBGUk9NIEl0ZW1fUHJpY2UgSVRQIFdIRVJFIElUUC5bUHJpY2VJRF0gPSBARGVmYWx1dGVQaXJjZSBBTkQgSVRQLltJVGVtQ29kZV0gPSBJdGVtLltJVGVtQ29kZV0gQU5EIElUUC5bVHlwZV0gPSAnVHJ1ZScpIEFTIERlY2ltYWwoMzgsMikpLDApDQpFTkQpDQpFTkQpDQpFTkQpDQpXSEVOIEBDbGllbnRJRCA9IDAgVEhFTg0KKENBU0UgV0hFTiBAVWludElEID0gSXRlbS5bVW5pdHNdIFRIRU4NCklTTlVMTChDQVNUKChTRUxFQ1QgVE9QICgxKSBJVFAuW1ByaWNlTWF4XSBGUk9NIEl0ZW1fUHJpY2UgSVRQIFdIRVJFIElUUC5bUHJpY2VJRF0gPSBARGVmYWx1dGVQaXJjZSBBTkQgSVRQLltJVGVtQ29kZV0gPSBJdGVtLltJVGVtQ29kZV0gQU5EIElUUC5bVHlwZV0gPSAnVHJ1ZScpIEFTIERlY2ltYWwoMzgsMikpLDApDQpXSEVOIEBVaW50SUQgPSBJdGVtLltBZGRfVW5pdHNdIFRIRU4NCklTTlVMTChDQVNUKChTRUxFQ1QgVE9QICgxKSBJVFAuW1ByaWNlTWF4XSBGUk9NIEl0ZW1fUHJpY2UgSVRQIFdIRVJFIElUUC5bUHJpY2VJRF0gPSBARGVmYWx1dGVQaXJjZSBBTkQgSVRQLltJVGVtQ29kZV0gPSBJdGVtLltJVGVtQ29kZV0gQU5EIElUUC5bVHlwZV0gPSAnRmFsc2UnKSBBUyBEZWNpbWFsKDM4LDIpKSwwKQ0KRUxTRQ0KSVNOVUxMKENBU1QoKFNFTEVDVCBUT1AgKDEpIElUUC5bUHJpY2VNYXhdIEZST00gSXRlbV9QcmljZSBJVFAgV0hFUkUgSVRQLltQcmljZUlEXSA9IEBEZWZhbHV0ZVBpcmNlIEFORCBJVFAuW0lUZW1Db2RlXSA9IEl0ZW0uW0lUZW1Db2RlXSBBTkQgSVRQLltUeXBlXSA9ICdUcnVlJykgQVMgRGVjaW1hbCgzOCwyKSksMCkNCkVORCkgRU5EKSwwKSBBUyBQcmljZU1heCANCkZST00gSXRlbSBXSEVSRSBbSVRlbUNvZGVdID0gQEl0ZW1Db2RlIjsNCi8vZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KCcgLiAkc3FsIC4gJyk7ICA8L3NjcmlwdD4nOw0KJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xOCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQokcmVzdWx0ID0gYXJyYXkoKTsNCmlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQokcmVzdWx0W10gPSAkZmV0Y2g7DQpwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KfWVsc2V7DQogICAgJGVycltdID0gJyYjMTYwMzsmIzE2MDg7JiMxNTgzOyAmIzE1NzU7JiMxNjA0OyYjMTU4OTsmIzE2MDY7JiMxNjAxOyAmIzE1OTQ7JiMxNjEwOyYjMTU4NTsgJiMxNTg5OyYjMTU4MTsmIzE2MTA7JiMxNTgxOyAmIzE1NzY7JiMxNTg1OyYjMTU4MDsmIzE1NzU7JiMxNTY5OyAmIzE1NzU7JiMxNjA0OyYjMTU3ODsmIzE1NzE7JiMxNjAzOyYjMTU4MzsgJiMxNjA1OyYjMTYwNjsgJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNTg5OyYjMTYwNjsmIzE2MDE7JzsNCiAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCn0NCnNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0Kc3Fsc3J2X2Nsb3NlKCRjb25uMTgpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnSXRlbUxhc3RQYXknKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbIkl0ZW1JRCJdKSkgJEl0ZW1JRCA9IHN0cnZhbCgkX0dFVFsiSXRlbUlEIl0pOw0KICAgIGlmKGlzc2V0KCRfR0VUWyJVaW50SUQiXSkpICRVaW50SUQgPSBzdHJ2YWwoJF9HRVRbIlVpbnRJRCJdKTsNCiAgICAkc3FsID0gIg0KREVjbGFyZSBASXRlbUlEIGFzIGludCA9ICciLiRJdGVtSUQuIic7DQpERWNsYXJlIEBVaW50c0lEIGFzIGludCA9ICciLiRVaW50SUQuIic7DQpXSVRIIFJFVFMgQVMgKA0KU0VMRUNUDQpJU05VTEwoKENBU0UgV0hFTiAoU0VMRUNUIFRPUCAoMSkgSVNOVUxMKFtQYXlBbW91bnRdLDApIEFTIFBheUFtb3VudCBGUk9NIFN0b3JlX0VudGVyeSBXSEVSRSBbSXRlbUlEXSA9IEBJdGVtSUQgQU5EIFtVaW50c0lEXSA9IChTRUxFQ1QgVE9QICgxKSBbVW5pdHNdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQEl0ZW1JRCkNCkFORCBbSXNCb25vdXNdID0gJ0ZhbHNlJyBBTkQgKFtUeXBlXSA9ICdQYXknKSBBTkQgW1BheUFtb3VudF0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0lEXSBERVNDKSAhPSAwIFRIRU4NCihTRUxFQ1QgVE9QICgxKSBJU05VTEwoW1BheUFtb3VudF0sMCkgQVMgUGF5QW1vdW50IEZST00gU3RvcmVfRW50ZXJ5IFdIRVJFIFtJdGVtSURdID0gQEl0ZW1JRCBBTkQgW1VpbnRzSURdID0gKFNFTEVDVCBUT1AgKDEpIFtVbml0c10gRlJPTSBJdGVtIFdIRVJFIFtJRF0gPSBASXRlbUlEKQ0KQU5EIFtJc0Jvbm91c10gPSAnRmFsc2UnIEFORCAoW1R5cGVdID0gJ1BheScpIEFORCBbUGF5QW1vdW50XSBJUyBOT1QgTlVMTCBPUkRFUiBCWSBbSURdIERFU0MpDQpFTFNFDQooU0VMRUNUIFRPUCAoMSkgSVNOVUxMKFtQYXlBbW91bnRdLDApIEFTIFBheUFtb3VudCBGUk9NIFN0b3JlX0VudGVyeSBXSEVSRSBbSXRlbUlEXSA9IEBJdGVtSUQgQU5EIFtVaW50c0lEXSA9IChTRUxFQ1QgVE9QICgxKSBbVW5pdHNdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQEl0ZW1JRCkNCkFORCBbSXNCb25vdXNdID0gJ0ZhbHNlJyBBTkQgKFtUeXBlXSA9ICdCZWdpbicpIEFORCBbUGF5QW1vdW50XSBJUyBOT1QgTlVMTCBPUkRFUiBCWSBbSURdIERFU0MpRU5EKSwwKSBBUyBbUGF5QW1vdW50QV0sDQpJU05VTEwoKENBU0UgV0hFTiAoU0VMRUNUIFRPUCAoMSkgSVNOVUxMKFtQYXlBbW91bnRdLDApIEFTIFBheUFtb3VudCBGUk9NIFN0b3JlX0VudGVyeSBXSEVSRSBbSXRlbUlEXSA9IEBJdGVtSUQgQU5EIFtVaW50c0lEXSA9IChTRUxFQ1QgVE9QICgxKSBbQWRkX1VuaXRzXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJdGVtSUQpDQpBTkQgW0lzQm9ub3VzXSA9ICdGYWxzZScgQU5EIChbVHlwZV0gPSAnUGF5JykgQU5EIFtQYXlBbW91bnRdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtJRF0gREVTQykgIT0gMCBUSEVODQooU0VMRUNUIFRPUCAoMSkgSVNOVUxMKFtQYXlBbW91bnRdLDApIEFTIFBheUFtb3VudCBGUk9NIFN0b3JlX0VudGVyeSBXSEVSRSBbSXRlbUlEXSA9IEBJdGVtSUQgQU5EIFtVaW50c0lEXSA9IChTRUxFQ1QgVE9QICgxKSBbQWRkX1VuaXRzXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJdGVtSUQpDQpBTkQgW0lzQm9ub3VzXSA9ICdGYWxzZScgQU5EIChbVHlwZV0gPSAnUGF5JykgQU5EIFtQYXlBbW91bnRdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtJRF0gREVTQykNCkVMU0UNCihTRUxFQ1QgVE9QICgxKSBJU05VTEwoW1BheUFtb3VudF0sMCkgQVMgUGF5QW1vdW50IEZST00gU3RvcmVfRW50ZXJ5IFdIRVJFIFtJdGVtSURdID0gQEl0ZW1JRCBBTkQgW1VpbnRzSURdID0gKFNFTEVDVCBUT1AgKDEpIFtBZGRfVW5pdHNdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQEl0ZW1JRCkNCkFORCBbSXNCb25vdXNdID0gJ0ZhbHNlJyBBTkQgKFtUeXBlXSA9ICdCZWdpbicpIEFORCBbUGF5QW1vdW50XSBJUyBOT1QgTlVMTCBPUkRFUiBCWSBbSURdIERFU0MpIEVORCksMCkgQVMgW1BheUFtb3VudEJdLA0KDQooU0VMRUNUIFRPUCAoMSkgW1VuaXRzXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJdGVtSUQpIEFTIFVuaXRzLA0KKFNFTEVDVCBUT1AgKDEpIFtBZGRfVW5pdHNdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQEl0ZW1JRCkgQVMgQWRkX1VuaXRzLA0KKFNFTEVDVCBUT1AgKDEpIChDQVNFIFdIRU4gSVNOVUxMKFtBZGRfVW5pdHNfQ291bnRdLDApID0gMCBUSEVOIDEgRUxTRSBJU05VTEwoW0FkZF9Vbml0c19Db3VudF0sMCkgRU5EKSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJdGVtSUQpIEFTIEFkZF9Vbml0c19Db3VudCkNClNFTEVDVCAnVHJ1ZScgQVMgc3RhdHVzLChDQVNFIFdIRU4gQFVpbnRzSUQgPSBVbml0cyBUSEVOIFBheUFtb3VudEENCldIRU4gQFVpbnRzSUQgPSBBZGRfVW5pdHMgVEhFTiAoQ0FTRSBXSEVOIFBheUFtb3VudEIgPSAwIFRIRU4gUGF5QW1vdW50QSAvIEFkZF9Vbml0c19Db3VudCBXSEVOIFBheUFtb3VudEIgIT0gMCBUSEVOIFBheUFtb3VudEIgRU5EKSBFTkQpIEFTIFByaWNlQW1vdW50IEZST00gUkVUUyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xOSwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcgJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE5KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEl0ZW1TdG9yZScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnU3RvcmVJRCddKSkgJFN0b3JlSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1N0b3JlSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0l0ZW1JRCddKSkgJEl0ZW1JRCA9IHBlc3RpY2lkZSgkX0dFVFsnSXRlbUlEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydVbml0c0lEJ10pKSAkVW5pdHNJRCA9IHBlc3RpY2lkZSgkX0dFVFsnVW5pdHNJRCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnSW52b2ljZURhdGVWYWx1ZSddKSkgJEludm9pY2VEYXRlVmFsdWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0ludm9pY2VEYXRlVmFsdWUnXSk7DQoNCiAgICAkc3FsID0gIg0KU0VUIE5PQ09VTlQgT04gDQpEZWNsYXJlIEBJRCBBcyBpbnQgPSAnIi4kSXRlbUlELiInOw0KREVDTEFSRSBAU3RvcmVJRCBBUyBpbnQgPSAnIi4kU3RvcmVJRC4iJzsNCkRFY2xhcmUgQERhdGVUaW1lIGFzIGRhdGUgPSAnIi4kSW52b2ljZURhdGVWYWx1ZS4iJzsNCkRlY2xhcmUgQFVuaXRzUyBhcyBpbnQgPSAnIi4kVW5pdHNJRC4iJzsNCkRlY2xhcmUgQEFkZF9Vbml0c19Db3VudFMgYXMgaW50ID0gKFNFTEVDVCAoQ0FTRSBXSEVOIElTTlVMTChbQWRkX1VuaXRzX0NvdW50XSwwKSAhPSAwIFRIRU4gSVNOVUxMKFtBZGRfVW5pdHNfQ291bnRdLDApIEVMU0UgMSBFTkQpIEZST00gSXRlbSBXSEVSRSBJRCA9IEBJRCk7DQpJRiBPQkpFQ1RfSUQoJ3RlbXBkYi4uI1RlbXAnKSBJUyBOT1QgTlVMTCBEUk9QIFRhYmxlICNUZW1wOw0KOw0KU0VMRUNUICogSU5UTyAjVGVtcCBGUk9NIFN0b3JlX0VudGVyeQ0KV0hFUkUgW0l0ZW1JRF0gPSBASUQNCkFORCBbU3RvcmVJRF0gPSBAU3RvcmVJRA0KQU5EIFtEYXRlXSA8PSBGT1JNQVQoQERhdGVUaW1lLCAneXl5eS9NTS9kZCcpDQo7DQpXSVRIIFJFVFMgQVMgKA0KU0VMRUNUDQpJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtVbml0c10gRlJPTSBJdGVtIFdIRVJFIElEID0gQElEKSwwKSBBUyBVbml0cywNCklTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FkZF9Vbml0c10gRlJPTSBJdGVtIFdIRVJFIElEID0gQElEKSwwKSBBUyBBZGRfVW5pdHMsDQpJU05VTEwoKENhc2UgV2hlbiBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBZGRfVW5pdHNdIEZST00gSXRlbSBXSEVSRSBJRCA9IEBJRCksMCkgIT0gMCBUSEVODQooKENBU1QoU1VNKElTTlVMTChQbHVzLDApKSBBUyBJTlQpICsgQ0FTVChTVU0oSVNOVUxMKFBsdXNULDApKSBBUyBJTlQpKSAtDQooQ0FTVChTVU0oSVNOVUxMKE1pbnMsMCkpIEFTIElOVCkgKyBDQVNUKFNVTShJU05VTEwoTWluc1QsMCkpIEFTIElOVCkpKSAvIENhc3QoQEFkZF9Vbml0c19Db3VudFMgQVMgaW50KQ0KRUxTRQ0KKChTVU0oSVNOVUxMKFBsdXMsMCkpICsgU1VNKElTTlVMTChQbHVzVCwwKSkpIC0gKFNVTShJU05VTEwoTWlucywwKSkgKyBTVU0oSVNOVUxMKE1pbnNULDApKSkpRU5EKSwwKSBBcyBTVU1UT1RBTE9uZSwNCklTTlVMTCgoQ2FzZSBXaGVuIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FkZF9Vbml0c10gRlJPTSBJdGVtIFdIRVJFIElEID0gQElEKSwwKSAhPSAwIFRIRU4NCigoKFNVTShDYXN0KElTTlVMTChQbHVzLDApIEFTIGRlY2ltYWwoMTgsMikpKSArIFNVTShDYXN0KElTTlVMTChQbHVzVCwwKSBBUyBkZWNpbWFsKDE4LDIpKSkpIC0NCigoU1VNKENhc3QoSVNOVUxMKE1pbnMsMCkgQVMgZGVjaW1hbCgxOCwyKSkpKSArIFNVTShDYXN0KElTTlVMTChNaW5zVCwwKSBBUyBkZWNpbWFsKDE4LDIpKSkpKSkgJSBAQWRkX1VuaXRzX0NvdW50UyBFbmQpLDApIEFzIFNVTVRPVEFMVG93DQpGUk9NICNUZW1wDQopDQpTRUxFQ1QgJ1RydWUnIEFTIHN0YXR1cywNCihDQVNFIFdIRU4gUkVUUy5bU1VNVE9UQUxPbmVdID0gMCBBTkQgUkVUUy5bU1VNVE9UQUxUb3ddICE9IDAgVEhFTiBSRVRTLltTVU1UT1RBTFRvd10gV0hFTiBSRVRTLltTVU1UT1RBTFRvd10gPSAwIEFORCBSRVRTLltTVU1UT1RBTE9uZV0gIT0gMCBUSEVOIFJFVFMuW1NVTVRPVEFMT25lXSBFTFNFIDAgRU5EKSBBUyBTdG9yZUNyZWRpdGUNCkZST00gUkVUUyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4yMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SXRlbUluZm8nKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lUZW1Db2RlJ10pKSAkSVRlbUNvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0lUZW1Db2RlJ10pOw0KICAgICRzcWwgPSAiDQpTRUxFQ1QgKiwnVHJ1ZScgQVMgc3RhdHVzLA0KSVNOVUxMKEl0ZW1UeXBlLCdGYWxzZScpIEFTIEl0ZW1UeXBlLA0KKENBU0UgV0hFTiBJU05VTEwoW0FkZF9Vbml0c19Db3VudF0sMCkgIT0gMCBUSEVOIElTTlVMTChbQWRkX1VuaXRzX0NvdW50XSwwKSBFTFNFIDEgRU5EKSBBUyBBZGRfVW5pdHNfQ291bnRBDQpGUk9NIEl0ZW0gV0hFUkUgW0lUZW1Db2RlXSA9ICciLiRJVGVtQ29kZS4iJzsiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjEsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjIxKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldERpc2NvdW50TmFtZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIERpc2NvdW50QWRkVHlwZSBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjIsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjIyKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEl0ZW1WYWx1ZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEl0ZW0gV0hFUkUgW0FjY291bnRUeXBlXSA9ICczJyBBTkQgW0l0ZW1fU3RhdHVzXSA9ICdUcnVlJyBPUkRFUiBCWSBbSVRlbUNvZGVdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjMsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yMyk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRBY2NvdW50c1ZhbHVlJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtBY2NvdW50VHlwZV0gPSAnMycgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdLFtBY2NvdW50TGV2YWxWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yMywkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjIzKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRDb2RlJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydBY2NvdW50Q29kZSddKSkgJEFjY291bnRDb2RlID0gcGVzdGljaWRlKCRfR0VUWydBY2NvdW50Q29kZSddKTsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbQWNjb3VudENvZGVWYWx1ZV0gPSAnIi4kQWNjb3VudENvZGUuIicgQU5EIFtBY2NvdW50VHlwZV0gPSAnMyciOw0KICAgICRDbGllbnRBQXNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRBQXNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50QUFzQSkpIHsNCiAgICAgICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgICAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICRlcnJbXSA9ICcmIzE2MDM7JiMxNjA4OyYjMTU4MzsgJiMxNTc1OyYjMTYwNDsmIzE1ODE7JiMxNTg3OyYjMTU3NTsmIzE1NzY7ICYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE1ODk7JiMxNTgxOyYjMTYxMDsmIzE1ODE7ICYjMTU3NjsmIzE1ODU7JiMxNTgwOyYjMTU3NTsmIzE1Njk7ICYjMTU3NTsmIzE2MDQ7JiMxNTc4OyYjMTU3MTsmIzE2MDM7JiMxNTgzOyAmIzE2MDU7JiMxNjA2OyAmIzE2MDM7JiMxNjA4OyYjMTU4MzsgJiMxNTc1OyYjMTYwNDsmIzE1ODE7JiMxNTg3OyYjMTU3NTsmIzE1NzY7JzsNCiAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50QUFzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0QWNjb3VudElEJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydJdGVtSUQnXSkpICRJdGVtSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0l0ZW1JRCddKTsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbSURdID0gJyIuJEl0ZW1JRC4iJyI7DQogICAgJENsaWVudEFBc0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yNSwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudEFBc0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRBQXNBKSkgew0KICAgICAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyYjMTYwMzsmIzE2MDg7JiMxNTgzOyAmIzE1NzU7JiMxNjA0OyYjMTU4MTsmIzE1ODc7JiMxNTc1OyYjMTU3NjsgJiMxNTk0OyYjMTYxMDsmIzE1ODU7ICYjMTU4OTsmIzE1ODE7JiMxNjEwOyYjMTU4MTsgJiMxNTc2OyYjMTU4NTsmIzE1ODA7JiMxNTc1OyYjMTU2OTsgJiMxNTc1OyYjMTYwNDsmIzE1Nzg7JiMxNTcxOyYjMTYwMzsmIzE1ODM7ICYjMTYwNTsmIzE2MDY7ICYjMTYwMzsmIzE2MDg7JiMxNTgzOyAmIzE1NzU7JiMxNjA0OyYjMTU4MTsmIzE1ODc7JiMxNTc1OyYjMTU3NjsnOw0KICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRBQXNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yNSk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRJbnZvaWNlSUREYWlseScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnRGF0ZSddKSkgJERhdGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0RhdGUnXSk7DQogICAgJHNxbDEgPSAiDQpEZWNsYXJlIEBJbnZvaWNlRGF0ZVZhbHVlIGFzIGRhdGUgPSAnIiAuICREYXRlIC4gIic7DQpTRUxFQ1QgKFNFTEVDVCBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5JykgKyBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICdNTScpICsgRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAnZGQnKSArICctJyArDQpDQVNUKChDQVNFIFdIRU4gKFNFTEVDVCBDT1VOVChbSUREYWlseV0pIEZST00gSW52b2ljZXMgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgQU5EIFtJbnZvaWNlRGF0YV0gPSBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5L01NL2RkJykpID0gMCBUSEVOICcxJw0KRUxTRSAoU0VMRUNUIENPVU5UKFtJRERhaWx5XSkgKyAxIEFTIFtJRERhaWx5XSBGUk9NIEludm9pY2VzIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIEFORCBbSW52b2ljZURhdGFdID0gRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAneXl5eS9NTS9kZCcpKQ0KRU5EKSBBUyB2YXJjaGFyKG1heCkpKSBBUyBEYXRlIjsNCiAgICAkQ2xpZW50QUFzQSA9IHNxbHNydl9xdWVyeSgkY29ubjI2LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50QUFzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudEFBc0EpKSB7DQogICAgICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICAgICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50QUFzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnQ3VycmVuY3lTYXJmJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydDdXJyZW5jeUlEJ10pKSAkQ3VycmVuY3lJRCA9IHBlc3RpY2lkZSgkX0dFVFsnQ3VycmVuY3lJRCddKTsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgVE9QICgxKSBbQ3VycmVuY3lFeGNoYW5nZV0gRlJPTSBDdXJyZW5jeSBXSEVSRSBbSURdID0gJyIgLiAkQ3VycmVuY3lJRCAuICInIjsNCiAgICAkQ2xpZW50QUFzQSA9IHNxbHNydl9xdWVyeSgkY29ubjI3LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50QUFzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudEFBc0EpKSB7DQogICAgICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICAgICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkZXJyW10gPSAnJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNTgxOyYjMTU4NzsmIzE1NzU7JiMxNTc2OyAmIzE1OTQ7JiMxNjEwOyYjMTU4NTsgJiMxNTg5OyYjMTU4MTsmIzE2MTA7JiMxNTgxOyAmIzE1NzY7JiMxNTg1OyYjMTU4MDsmIzE1NzU7JiMxNTY5OyAmIzE1NzU7JiMxNjA0OyYjMTU3ODsmIzE1NzE7JiMxNjAzOyYjMTU4MzsgJiMxNjA1OyYjMTYwNjsgJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNTgxOyYjMTU4NzsmIzE1NzU7JiMxNTc2Oyc7DQogICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudEFBc0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjI3KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnROYW1lJykgew0KICAgICRzcWwxID0gIg0KREVDTEFSRSBASUQgSU5UO1NFTEVDVCBASUQgPSAoU0VMRUNUIFtTYWxlc0FjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQgDQpVTklPTiBBTEwNClNFTEVDVCBULltJRF0sVC5bSGF2ZUZhdGhlcl0sVC5bQWNjb3VudENvZGVWYWx1ZV0sVC5bQWNjb3VudE5hbWVWYWx1ZV0sVC5bQWNjb3VudFR5cGVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFQgSU5ORVIgSk9JTiAjUmVzdWx0cyBSIE9OIFIuW0FjY291bnRDb2RlVmFsdWVdID0gVC5bSGF2ZUZhdGhlcl0pDQpTRUxFQ1QgW0lEXSxbQWNjb3VudE5hbWVWYWx1ZV0sW0FjY291bnRUeXBlXSwoU0VMRUNUIFRPUCAoMSkgW1NhbGVzTG9jYWxBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9ICciLiROZXdCcmFuY2hJRC4iJykgQVMgW1NhbGVzTG9jYWxBY2NvdW50XQ0KRlJPTSAjUmVzdWx0cyBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yOCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjI4KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFBPSURTJykgew0KICAgICRzcWwxID0gIg0KO1dJVEggUkVUUyBBUyAoDQpTRUxFQ1QgQ2xpZW50cy5DbGllbnROYW1lLFNQTy5JRFYsU1BPLkRhdGVUaW1lLFNQTy5JRCxTUE8uU3RhdHVzLFNQTy5CcmFuY2hJRCxTUE8uQ2xpZW50SUQsDQooQ0FTVChTUE8uSURWIGFzIHZhcmNoYXIobWF4KSkgKyBzcGFjZSgxKSArICAnfCcgKyBzcGFjZSgxKSArIENBU1QoU1BPLkRhdGVUaW1lIGFzIHZhcmNoYXIobWF4KSkgKyBzcGFjZSgxKSArICd8JyArIHNwYWNlKDEpICsgQ2xpZW50cy5DbGllbnROYW1lKSBBUyBJbmZvLA0KSVNOVUxMKFNQTy5Ub3RhbEl0ZW1WYWx1ZSwwKSBBUyBRdHlUb3RhbCwNCihTRUxFQ1QgKElTTlVMTChTVU0oSW52b2ljZV9JdGVtLltRdWFudGl0eV0pLDApICsgSVNOVUxMKFNVTShJbnZvaWNlX0l0ZW0uW1N1YlF1YW50aXR5XSksMCkpIEZST00gSW52b2ljZV9JdGVtIFdIRVJFIEludm9pY2VfSXRlbS5bQ2xpZW50UE9JREl0ZW1WXSA9IFNQTy5bSURdKSBBUyBUb3RhbFF0eQ0KRlJPTSBTUE8gTEVGVCBPVVRFUiBKT0lODQpDbGllbnRzIE9OIFNQTy5DbGllbnRJRCA9IENsaWVudHMuSUQNCldIRVJFIFNQTy5bQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKQ0KU0VMRUNUICogRlJPTSBSRVRTDQpXSEVSRSAoUkVUUy5RdHlUb3RhbCA+IFJFVFMuVG90YWxRdHkpDQpBTkQgU3RhdHVzID0gMA0KT1JERVIgQlkgUkVUUy5bSURWXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjI5LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yOSk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDYXJOYW1lJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQ2FycyBPUkRFUiBCWSBbSURWXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q29zdENlbnRlck5hbWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBDb3N0Q2VudGVyIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubiwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubik7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDbGllbnRDcmVkaXRlJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydDbGllbnRJRCddKSkgJENsaWVudElEID0gcGVzdGljaWRlKCRfR0VUWydDbGllbnRJRCddKTsNCiAgICAkc3FsID0gIlNFTEVDVCBTVU0oSVNOVUxMKFBsdXMsIDApIC0gSVNOVUxMKE1pbnMsIDApKSBBUyBUb3RhbFBsdXMgRlJPTSBDbGllbnRzX0VudGVyeSBXSEVSRSBbQ2xpZW50SURdID0gJyIuJENsaWVudElELiInIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjMxLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMSk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRHb1RvQ2xpZW50SW52b2ljZXMnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0ludm9pY2VJRCddKSkgJEludm9pY2VJRCA9IHBlc3RpY2lkZSgkX0dFVFsnSW52b2ljZUlEJ10pOw0KICAgICRzcWwgPSAiU0VMRUNUIElTTlVMTChHb3RvQ2xpZW50QWNjb3VudCwgMCkgQVMgR290b0NsaWVudEFjY291bnQgRlJPTSBJbnZvaWNlcyBXSEVSRSBbSW52b2ljZUlEXSA9ICciLiRJbnZvaWNlSUQuIiciOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzIsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMyKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1NhdmVJdGVtRycpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSUQnXSkpICRJRCA9IHBlc3RpY2lkZSgkX0dFVFsnSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lUZW1OYW1lJ10pKSAkSVRlbU5hbWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0lUZW1OYW1lJ10pOw0KDQogICAgICAgICRzcWwxMjMgPSAiDQpTRVQgTk9DT1VOVCBPTg0KREVjbGFyZSBAQ1RJRCBhcyBpbnQgPSAnIiAuIGludHZhbCgkSUQpIC4gIic7DQpERWNsYXJlIEBJdGVtSUQgYXMgaW50ID0gMDsNCkRFY2xhcmUgQEJyYW5jaElEIGFzIGludCA9ICciLiROZXdCcmFuY2hJRC4iJzsNCkRFY2xhcmUgQEl0ZW1OYW1lIGFzIG52YXJjaGFyKG1heCkgPSAnIiAuICRJVGVtTmFtZSAuICInOw0KRGVjbGFyZSBASXRlbUNvZGUgQVMgbnZhcmNoYXIoTUFYKSA9IDA7DQpERWNsYXJlIEBzdGF0dXMgYXMgbnZhcmNoYXIobWF4KSA9ICd0cnVlJzsNCg0KSUYgQENUSUQgPSAwIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBJdGVtIFdIRVJFIFtJdGVtX05hbWVdID0gQEl0ZW1OYW1lKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnZmFsc2UnOw0KRU5EDQpFTkQgRUxTRSBJRiBAQ1RJRCAhPSAwIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBJdGVtIFdIRVJFIFtJdGVtX05hbWVdID0gQEl0ZW1OYW1lIEFORCBbSURdICE9IEBDVElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnZmFsc2UnOw0KRU5EDQpFTkQNCg0KSUYgQHN0YXR1cyA9ICd0cnVlJyBCRUdJTg0KSUYgQENUSUQgPSAwIEJFR0lODQpJTlNFUlQgSU5UTyBJdGVtKA0KW0lUZW1Db2RlXSxbSXRlbV9OYW1lXSxbSGF2ZUZhdGhlcl0sW0l0ZW1fTmFtZUVOXSxbQmFyY29kZV0sW0JhckNvZGVBZGRVbml0c10sW1BhcnROb10sW0FkZHRpb25fQ29kZV0sW09yZGVyX0xpbWl0ZWRdLFtJdGVtU2l6ZV0sW1VuaXRzXSxbQWRkX1VuaXRzXSxbQWRkX1VuaXRzX0NvdW50XSwNCltTYWxlc19UYXhdLFtJdGVtX1N0YXR1c10sW0lTX1N0b3JlXSxbSVNfVGF4XSxbSXRlbV9Db3VudHJ5XSxbSXRlbV9XaGVyZV0sW0FkZGl0b25fSXRlbV0sW0l0ZW1fRGVzY10sW1JlZmVyZW5jZVZhbHVlXSxbQWNjb3VudFR5cGVdLFtBY2NvdW50TGV2YWxWYWx1ZV0sDQpbU2VyaWFsTnVtYmVyVmFsdWVdLFtNYXhCb3Vuc10sW1NlY3Rpb25zSURdLFtJdGVtQ29zdF0sW1ByaWNlT25lSURdLFtQcmljZVR3b0lEXSxbSXRlbVR5cGVOZXddDQopVkFMVUVTKA0KKChDQVNFIFdIRU4gKFNFTEVDVCBUT1AgKDEpIENhc3QoW0lUZW1Db2RlXSBhcyBkZWNpbWFsKDM4LDAwKSkgKyAxIEFTIElUZW1Db2RlIEZST00gSXRlbSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbSVRlbUNvZGVdIElTIE5PVCBOVUxMIEFORCBbSXRlbVR5cGVdIElTIE5VTEwgT1JERVIgQlkgW0lEXSBERVNDKSBJUyBOT1QgTlVMTCBUSEVODQpDQVNUKCcwMCcgQVMgbnZhcmNoYXIobWF4KSkgKyBDQVNUKChTRUxFQ1QgVE9QICgxKSBDYXN0KFtJVGVtQ29kZV0gYXMgZGVjaW1hbCgzOCwwMCkpICsgMSBGUk9NIEl0ZW0gV0hFUkUgW0FjY291bnRUeXBlXSA9ICcxJyBBTkQgW0lUZW1Db2RlXSBJUyBOT1QgTlVMTCBBTkQgW0l0ZW1UeXBlXSBJUyBOVUxMIE9SREVSIEJZIFtJRF0gREVTQykgQVMgbnZhcmNoYXIobWF4KSkNCg0KV0hFTiAgKFNFTEVDVCBUT1AgKDEpIENhc3QoW0lUZW1Db2RlXSBhcyBkZWNpbWFsKDM4LDAwKSkgKyAxIEFTIElUZW1Db2RlIEZST00gSXRlbSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbSVRlbUNvZGVdIElTIE5PVCBOVUxMIEFORCBbSXRlbVR5cGVdIElTIE5VTEwgT1JERVIgQlkgW0lEXSBERVNDKSBJUyBOVUxMIFRIRU4NCkNBU1QoJzAwJyBBUyBudmFyY2hhcihtYXgpKSArIENBU1QoKFNFTEVDVCBJU05VTEwoW0NhdGVnb3J5SURTdGFydHVwXSwwKSBGUk9NIENvbXBhbnlJbmZvIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQpIEFTIG52YXJjaGFyKG1heCkpDQpFTkQpKSwNCkBJdGVtTmFtZSwnMCcsJycsJycsJycsJycsJycsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJ1RydWUnLCdUcnVlJywnRmFsc2UnLCcnLCcwJywnMCcsJycsJycsJzEnLCcxJywnRmFsc2UnLCcwJywnMCcsJzAnLCcwJywnMCcsJ1RydWUnKQ0KU0VUIEBJdGVtSUQgPSAoU0VMRUNUIEBASWRlbnRpdHkpOw0KU0VMRUNUIEBJdGVtQ29kZSA9IFtJdGVtQ29kZV0gRlJPTSBJdGVtIFdIRVJFIFtJRF0gPSBASXRlbUlEDQpFTkQgRUxTRSBJRiBAQ1RJRCAhPSAwIEJFR0lODQpVUERBVEUgSXRlbSBTRVQgW0l0ZW1fTmFtZV0gPSBASXRlbU5hbWUgV0hFUkUgW0lEXSA9IEBDVElEDQpTRUxFQ1QgQEl0ZW1Db2RlID0gW0l0ZW1Db2RlXSxASXRlbUlEID0gW0lEXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBDVElEDQpFTkQNCkVORA0KOw0KU0VMRUNUIEBJdGVtQ29kZSBBUyBJdGVtQ29kZSxASXRlbUlEIEFTIEl0ZW1JRCxAc3RhdHVzIEFTIHN0YXR1cyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMiwkc3FsMTIzLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTU3NTsmIzE1ODc7JiMxNjA1OyAmIzE1NzU7JiMxNjA0OyYjMTYwNTsmIzE1ODA7JiMxNjA1OyYjMTYwODsmIzE1OTM7JiMxNjA3OyAmIzE2MDU7JiMxNjAzOyYjMTU4NTsmIzE1ODU7JzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMyKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldERhdGVJdGVtQ1QnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBJdGVtIFdIRVJFIFtJdGVtX1N0YXR1c10gPSAnVHJ1ZScgQU5EIFtBY2NvdW50VHlwZV0gPSAnMScgQU5EIFtJdGVtVHlwZV0gSVMgTlVMTCBPUkRFUiBCWSBDQVNUKFtJVGVtQ29kZV0gQVMgaW50KSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0RGF0ZUl0ZW1DVFN1YicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSGF2ZUZhdGhlciddKSkgJEhhdmVGYXRoZXIgPSBwZXN0aWNpZGUoJF9HRVRbJ0hhdmVGYXRoZXInXSk7DQoNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEl0ZW0gV0hFUkUgW0FjY291bnRUeXBlXSA9ICcyJyBBTkQgW0hhdmVGYXRoZXJdID0gJyIgLiAkSGF2ZUZhdGhlciAuICInIEFORCBbSXRlbVR5cGVdIElTIE5VTEwgT1JERVIgQlkgQ0FTVChbSVRlbUNvZGVdIEFTIFZhcmNoYXIobWF4KSkgQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1NhdmVJdGVtR1N1YicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSUQnXSkpICRJRCA9IHBlc3RpY2lkZSgkX0dFVFsnSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0hhdmVGYXRoZXInXSkpICRIYXZlRmF0aGVyID0gcGVzdGljaWRlKCRfR0VUWydIYXZlRmF0aGVyJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJVGVtTmFtZSddKSkgJElUZW1OYW1lID0gcGVzdGljaWRlKCRfR0VUWydJVGVtTmFtZSddKTsNCg0KICAgICAgICAkc3FsMTIzID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFY2xhcmUgQENUSUQgYXMgaW50ID0gJyIgLiBpbnR2YWwoJElEKSAuICInOw0KRGVjbGFyZSBASXRlbUNvZGUgQVMgbnZhcmNoYXIoTUFYKSA9IDA7DQpEZWNsYXJlIEBIYXZlRmF0aGVyIEFTIG52YXJjaGFyKE1BWCkgPSAnIiAuICRIYXZlRmF0aGVyIC4gIic7DQpERWNsYXJlIEBzdGF0dXMgQVMgbnZhcmNoYXIobWF4KSA9ICd0cnVlJzsNCkRFY2xhcmUgQEJyYW5jaElEIEFTIGludCA9ICciLiROZXdCcmFuY2hJRC4iJzsNCkRFY2xhcmUgQEl0ZW1OYW1lIEFTIG52YXJjaGFyKG1heCkgPSAnIiAuICRJVGVtTmFtZSAuICInOw0KREVjbGFyZSBASXRlbUlEIEFTIGludCA9IDA7DQoNCklGIEBDVElEID0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gSXRlbSBXSEVSRSBbSXRlbV9OYW1lXSA9IEBJdGVtTmFtZSkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EIEVMU0UgSUYgQENUSUQgIT0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gSXRlbSBXSEVSRSBbSXRlbV9OYW1lXSA9IEBJdGVtTmFtZSBBTkQgW0lEXSAhPSBAQ1RJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZScgQkVHSU4NCklGIEBDVElEID0gMCBCRUdJTg0KSUYgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBDYXN0KElTTlVMTChbSVRlbUNvZGVdLDApIGFzIGRlY2ltYWwoMzgsMDApKSArIDEgQVMgSVRlbUNvZGUgDQpGUk9NIEl0ZW0gV0hFUkUgW0hhdmVGYXRoZXJdID0gQEhhdmVGYXRoZXIgQU5EIFtJdGVtVHlwZV0gSVMgTlVMTCksMCkgIT0gJzAnIEJFR0lODQo7DQpTRUxFQ1QgVE9QICgxKSBASXRlbUNvZGUgPSBDYXN0KFtJVGVtQ29kZV0gYXMgZGVjaW1hbCgzOCwwMCkpICsgMQ0KRlJPTSBJdGVtIFdIRVJFIFtIYXZlRmF0aGVyXSA9IEBIYXZlRmF0aGVyIEFORCBbSXRlbVR5cGVdIElTIE5VTEwgDQpPUkRFUiBCWSBbSURdIERFU0MNCjsNCkVORA0KRUxTRSBJRiBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIENhc3QoSVNOVUxMKFtJVGVtQ29kZV0sMCkgYXMgZGVjaW1hbCgzOCwwMCkpICsgMSBBUyBJVGVtQ29kZSANCkZST00gSXRlbSBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBASGF2ZUZhdGhlciBBTkQgW0l0ZW1UeXBlXSBJUyBOVUxMKSwwKSA9ICcwJyBCRUdJTg0KOw0KU0VMRUNUIEBJdGVtQ29kZSA9IFNVQlNUUklORyhASGF2ZUZhdGhlciwgMywgTEVOKEBIYXZlRmF0aGVyKSAtMikgKyAnMDAnICsgSVNOVUxMKFtDYXRlZ29yeUlEU3RhcnR1cF0sMSkNCkZST00gQ29tcGFueUluZm8gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRA0KRU5EDQo7DQoNCklOU0VSVCBJTlRPIEl0ZW0oDQpbSVRlbUNvZGVdLFtJdGVtX05hbWVdLFtIYXZlRmF0aGVyXSxbSXRlbV9OYW1lRU5dLFtCYXJjb2RlXSxbQmFyQ29kZUFkZFVuaXRzXSxbUGFydE5vXSxbQWRkdGlvbl9Db2RlXSxbT3JkZXJfTGltaXRlZF0sW0l0ZW1TaXplXSxbVW5pdHNdLFtBZGRfVW5pdHNdLFtBZGRfVW5pdHNfQ291bnRdLA0KW1NhbGVzX1RheF0sW0l0ZW1fU3RhdHVzXSxbSVNfU3RvcmVdLFtJU19UYXhdLFtJdGVtX0NvdW50cnldLFtJdGVtX1doZXJlXSxbQWRkaXRvbl9JdGVtXSxbSXRlbV9EZXNjXSxbUmVmZXJlbmNlVmFsdWVdLFtBY2NvdW50VHlwZV0sW0FjY291bnRMZXZhbFZhbHVlXSwNCltTZXJpYWxOdW1iZXJWYWx1ZV0sW01heEJvdW5zXSxbU2VjdGlvbnNJRF0sW0l0ZW1Db3N0XSxbUHJpY2VPbmVJRF0sW1ByaWNlVHdvSURdLFtJdGVtVHlwZU5ld10NCilWQUxVRVMoDQooJzAwJyArIEBJdGVtQ29kZSksQEl0ZW1OYW1lLA0KQEhhdmVGYXRoZXIsJycsJycsJycsJycsJycsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJ1RydWUnLCdUcnVlJywnRmFsc2UnLCcnLCcwJywnMCcsJycsJycsJzInLCcyJywnRmFsc2UnLCcwJywnMCcsJzAnLCcwJywnMCcsJ1RydWUnKQ0KU0VUIEBJdGVtSUQgPSAoU0VMRUNUIEBASWRlbnRpdHkpOw0KU0VMRUNUIEBJdGVtQ29kZSA9IFtJdGVtQ29kZV0gRlJPTSBJdGVtIFdIRVJFIFtJRF0gPSBASXRlbUlEDQpFTkQgRUxTRSBJRiBAQ1RJRCAhPSAwIEJFR0lODQpVUERBVEUgSXRlbSBTRVQgW0l0ZW1fTmFtZV0gPSBASXRlbU5hbWUgV0hFUkUgW0lEXSA9IEBDVElEDQpTRUxFQ1QgQEl0ZW1Db2RlID0gW0l0ZW1Db2RlXSxASXRlbUlEID0gW0lEXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBDVElEDQpFTkQNCkVORA0KDQpTRUxFQ1QgQEl0ZW1Db2RlIEFTIEl0ZW1Db2RlLEBJdGVtSUQgQVMgSXRlbUlELEBzdGF0dXMgQVMgc3RhdHVzIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjMyLCRzcWwxMjMsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJiMxNTc1OyYjMTU4NzsmIzE2MDU7ICYjMTU3NTsmIzE2MDQ7JiMxNjA1OyYjMTU4MDsmIzE2MDU7JiMxNjA4OyYjMTU5MzsmIzE2MDc7ICYjMTYwNTsmIzE2MDM7JiMxNTg1OyYjMTU4NTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzIpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnUmVtb3ZlSXRlbUNUJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydMaW5lSUQnXSkpICRMaW5lSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0xpbmVJRCddKTsNCg0KICAgICRzcWwxID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFQ0xBUkUgQElEIElOVDtTRUxFQ1QgQElEID0gJyIgLiBpbnR2YWwoJExpbmVJRCkgLiAiJzsNCkRFY2xhcmUgQHN0YXR1cyBBUyBudmFyY2hhcihtYXgpID0gJ3RydWVzJzsNCkRFQ0xBUkUgQENvdW50IEFTIElOVCA9IDA7DQpERUNMQVJFIEBBY2NvdW50VHlwZSBBUyBJTlQgPSAoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRUeXBlXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJRCk7DQoNCklGIEBBY2NvdW50VHlwZSAhPSAzIEJFR0lODQpXaXRoICNyZXN1bHRzIEFzIChTZWxlY3QgSUQsSGF2ZUZhdGhlcixJVGVtQ29kZSBGUk9NIEl0ZW0gV0hFUkUgSUQgPSBASUQNClVOSU9OIEFMTA0KU0VMRUNUIFQuSUQsVC5IYXZlRmF0aGVyLFQuSVRlbUNvZGUgRlJPTSBJdGVtIFQgSU5ORVIgSk9JTiAjUmVzdWx0cyBSIE9uIFIuSVRlbUNvZGUgPSBULkhhdmVGYXRoZXIpDQpTRUxFQ1QgQENvdW50ID0gQ291bnQoSUQpIEZST00gI1Jlc3VsdHM7DQoNCklGIElTTlVMTChAQ291bnQsMCkgPiAxIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdIYXZlU3ViJzsNCkVORCBFTFNFIElGIElTTlVMTChAQ291bnQsMCkgPCAxIEJFR0lODQpTRVQgQHN0YXR1cyA9ICd0cnVlcyc7DQpFTkQNCkVORA0KDQpJRiBAQWNjb3VudFR5cGUgPSAzIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUIFtJdGVtSURdIEZST00gU3RvcmVfRW50ZXJ5IFdIRVJFIFtJdGVtSURdID0gQElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnSGF2ZU1vdmUnOw0KRU5EIEVMU0UgSUYgTk9UIEV4aXN0cyhTRUxFQ1QgW0l0ZW1JRF0gRlJPTSBTdG9yZV9FbnRlcnkgV0hFUkUgW0l0ZW1JRF0gPSBASUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICd0cnVlcyc7DQpFTkQNCkVORA0KDQpJRiBAc3RhdHVzID0gJ3RydWVzJyBCRUdJTjsNCkRFTEVURSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJRDsNCkRFTEVURSBGUk9NIEl0ZW1fUHJpY2UgV0hFUkUgW0lUZW1Db2RlXSA9IChTRUxFQ1QgVE9QICgxKSBbSVRlbUNvZGVdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQElEKTsNCkRFTEVURSBGUk9NIEl0ZW1CYXIgV0hFUkUgW0lUZW1Db2RlXSA9IChTRUxFQ1QgVE9QICgxKSBbSVRlbUNvZGVdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQElEKTsNCkVORA0KDQpTRUxFQ1QgQHN0YXR1cyBhcyBTdGF0dXNBIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0RGF0ZUl0ZW1zJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydIYXZlRmF0aGVyJ10pKSAkSGF2ZUZhdGhlciA9IHBlc3RpY2lkZSgkX0dFVFsnSGF2ZUZhdGhlciddKTsNCg0KICAgICRzcWwxID0gIg0KU0VMRUNUICosDQpJU05VTEwoKFNFTEVDVCBUT1AgKDEpICdUcnVlJyBBUyBTdGF0dXMgRlJPTSBTdG9yZV9FbnRlcnkgV0hFUkUgW0l0ZW1JRF0gPSBJdGVtLltJRF0pLCdGYWxzZScpIEFTIFN0YXR1c0ENCkZST00gSXRlbSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzMnIEFORCBbSGF2ZUZhdGhlcl0gPSAnIiAuICRIYXZlRmF0aGVyIC4gIicgQU5EIFtJdGVtVHlwZV0gSVMgTlVMTCBPUkRFUiBCWSBDQVNUKFtJVGVtQ29kZV0gQVMgVmFyY2hhcihtYXgpKSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0VWludHNOYW1lVmFsdWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBVbml0cyBPUkRFUiBCWSBbSURWXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnU2F2ZUl0ZW1zJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydJRCddKSkgJElEID0gcGVzdGljaWRlKCRfR0VUWydJRCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnSGF2ZUZhdGhlciddKSkgJEhhdmVGYXRoZXIgPSBwZXN0aWNpZGUoJF9HRVRbJ0hhdmVGYXRoZXInXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lUZW1OYW1lJ10pKSAkSVRlbU5hbWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0lUZW1OYW1lJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydVbml0cyddKSkgJFVuaXRzID0gcGVzdGljaWRlKCRfR0VUWydVbml0cyddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnQWRkX1VuaXRzJ10pKSAkQWRkX1VuaXRzID0gcGVzdGljaWRlKCRfR0VUWydBZGRfVW5pdHMnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0FkZF9Vbml0c19Db3VudCddKSkgJEFkZF9Vbml0c19Db3VudCA9IHBlc3RpY2lkZSgkX0dFVFsnQWRkX1VuaXRzX0NvdW50J10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydPcmRlcl9MaW1pdGVkJ10pKSAkT3JkZXJfTGltaXRlZCA9IHBlc3RpY2lkZSgkX0dFVFsnT3JkZXJfTGltaXRlZCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnQmFyY29kZSddKSkgJEJhcmNvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0JhcmNvZGUnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0JhckNvZGVBZGRVbml0cyddKSkgJEJhckNvZGVBZGRVbml0cyA9IHBlc3RpY2lkZSgkX0dFVFsnQmFyQ29kZUFkZFVuaXRzJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJU19TdG9yZSddKSkgJElTX1N0b3JlID0gcGVzdGljaWRlKCRfR0VUWydJU19TdG9yZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnU2VyaWFsTnVtYmVyVmFsdWUnXSkpICRTZXJpYWxOdW1iZXJWYWx1ZSA9IHBlc3RpY2lkZSgkX0dFVFsnU2VyaWFsTnVtYmVyVmFsdWUnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0l0ZW1TdGF0dXMnXSkpICRJdGVtU3RhdHVzID0gcGVzdGljaWRlKCRfR0VUWydJdGVtU3RhdHVzJ10pOw0KICAgIA0KICAgICRzcWwxID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFY2xhcmUgQENUSUQgYXMgaW50ID0gJyIgLiBpbnR2YWwoJElEKSAuICInOw0KRGVjbGFyZSBASXRlbUNvZGUgQVMgbnZhcmNoYXIoTUFYKSA9IDA7DQpEZWNsYXJlIEBIYXZlRmF0aGVyIEFTIG52YXJjaGFyKE1BWCkgPSAnIiAuICRIYXZlRmF0aGVyIC4gIic7DQpERWNsYXJlIEBzdGF0dXMgQVMgbnZhcmNoYXIobWF4KSA9ICd0cnVlJzsNCkRFY2xhcmUgQEJyYW5jaElEIEFTIGludCA9ICciIC4gJE5ld0JyYW5jaElEIC4gIic7DQpERWNsYXJlIEBJdGVtTmFtZSBBUyBudmFyY2hhcihtYXgpID0gJyIgLiAkSVRlbU5hbWUgLiAiJzsNCkRFY2xhcmUgQEl0ZW1JRCBBUyBpbnQgPSAwOw0KRGVjbGFyZSBARmlyc3QgQVMgYml0ID0gJ0ZhbHNlJzsNCkRFY2xhcmUgQFVuaXRzIEFTIGludCA9ICciIC4gJFVuaXRzIC4gIic7DQpERWNsYXJlIEBBZGRfVW5pdHMgQVMgaW50ID0gJyIgLiAkQWRkX1VuaXRzIC4gIic7DQpERWNsYXJlIEBBZGRfVW5pdHNfQ291bnQgQVMgZGVjaW1hbCgxOCwyKSA9ICciIC4gJEFkZF9Vbml0c19Db3VudCAuICInOw0KREVjbGFyZSBAT3JkZXJfTGltaXRlZCBBUyBkZWNpbWFsKDE4LDIpID0gJyIgLiAkT3JkZXJfTGltaXRlZCAuICInOw0KREVjbGFyZSBAQmFyY29kZSBBUyBudmFyY2hhcihtYXgpID0gJyIgLiAkQmFyY29kZSAuICInOw0KREVjbGFyZSBAQmFyQ29kZUFkZFVuaXRzIEFTIG52YXJjaGFyKG1heCkgPSAnIiAuICRCYXJDb2RlQWRkVW5pdHMgLiAiJzsNCkRFY2xhcmUgQElTX1N0b3JlIEFTIGJpdCA9ICciIC4gJElTX1N0b3JlIC4gIic7DQpERWNsYXJlIEBTZXJpYWxOdW1iZXJWYWx1ZSBBUyBiaXQgPSAnIiAuICRTZXJpYWxOdW1iZXJWYWx1ZSAuICInOw0KREVjbGFyZSBASXRlbVN0YXR1cyBBUyBiaXQgPSAnIiAuICRJdGVtU3RhdHVzIC4gIic7DQoNCklGIEBDVElEID0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gSXRlbSBXSEVSRSBbSXRlbV9OYW1lXSA9IEBJdGVtTmFtZSkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EIEVMU0UgSUYgQENUSUQgIT0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gSXRlbSBXSEVSRSBbSXRlbV9OYW1lXSA9IEBJdGVtTmFtZSBBTkQgW0lEXSAhPSBAQ1RJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZScgQkVHSU4NCklGIEBDVElEID0gMCBCRUdJTg0KDQpJRiBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIA0KU1VCU1RSSU5HKENBU1QoW0lUZW1Db2RlXSBhcyBudmFyY2hhcihtYXgpKSxDQVNUKGxlbihASGF2ZUZhdGhlciArICcwMCcpIEFTIGJpZ2ludCksQ0FTVChsZW4oQEhhdmVGYXRoZXIgKyAnMDAnKSBBUyBiaWdpbnQpKSArIDEgQVMgSVRlbUNvZGUgDQpGUk9NIEl0ZW0gV0hFUkUgW0hhdmVGYXRoZXJdID0gQEhhdmVGYXRoZXIpLDApICE9ICcwJyBCRUdJTg0KOw0KU0VUIEBGaXJzdCA9ICdGYWxzZSc7DQpTRUxFQ1QgVE9QICgxKSBASXRlbUNvZGUgPSANCg0KKENBU0UgV0hFTiAoU0VMRUNUIENPVU5UKFtJRF0pIEZST00gSXRlbSBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBASGF2ZUZhdGhlcikgPD0gMTAgVEhFTiANClNVQlNUUklORyhDQVNUKFtJVGVtQ29kZV0gYXMgbnZhcmNoYXIobWF4KSksQ0FTVChsZW4oQEhhdmVGYXRoZXIgKyAnMDAnKSBBUyBiaWdpbnQpLENBU1QobGVuKEBIYXZlRmF0aGVyICsgJzAwJykgQVMgYmlnaW50KSkgKyAxDQpFTFNFDQpTVUJTVFJJTkcoQ0FTVChbSVRlbUNvZGVdIGFzIG52YXJjaGFyKG1heCkpLENBU1QobGVuKEBIYXZlRmF0aGVyICsgJzAnKSBBUyBiaWdpbnQpLENBU1QobGVuKEBIYXZlRmF0aGVyICsgJzAnKSBBUyBiaWdpbnQpKSArIDENCkVORCkNCg0KRlJPTSBJdGVtIFdIRVJFIFtIYXZlRmF0aGVyXSA9IEBIYXZlRmF0aGVyDQpPUkRFUiBCWSBDQVNUKFtJVGVtQ29kZV0gQVMgYmlnaW50KSBERVNDDQo7DQpFTkQNCkVMU0UgSUYgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBTVUJTVFJJTkcgKENBU1QoW0lUZW1Db2RlXSBhcyBudmFyY2hhcihtYXgpKSxDQVNUKGxlbihASGF2ZUZhdGhlciArICcwMCcpIEFTIGJpZ2ludCksQ0FTVChsZW4oQEhhdmVGYXRoZXIgKyAnMDAnKSBBUyBiaWdpbnQpKSArIDEgQVMgSVRlbUNvZGUgDQpGUk9NIEl0ZW0gV0hFUkUgW0hhdmVGYXRoZXJdID0gQEhhdmVGYXRoZXIpLDApID0gJzAnIEJFR0lODQo7DQpTRVQgQEZpcnN0ID0gJ1RydWUnOw0KU0VMRUNUIEBJdGVtQ29kZSA9IElTTlVMTChbQ2F0ZWdvcnlJRFN0YXJ0dXBdLDEpIEZST00gQ29tcGFueUluZm8gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRA0KRU5EDQo7DQpJTlNFUlQgSU5UTyBJdGVtKA0KW0lUZW1Db2RlXSxbSXRlbV9OYW1lXSxbSGF2ZUZhdGhlcl0sW0l0ZW1fTmFtZUVOXSxbQmFyY29kZV0sW0JhckNvZGVBZGRVbml0c10sW1BhcnROb10sW0FkZHRpb25fQ29kZV0sW09yZGVyX0xpbWl0ZWRdLFtJdGVtU2l6ZV0sW1VuaXRzXSxbQWRkX1VuaXRzXSxbQWRkX1VuaXRzX0NvdW50XSwNCltTYWxlc19UYXhdLFtJdGVtX1N0YXR1c10sW0lTX1N0b3JlXSxbSVNfVGF4XSxbSXRlbV9Db3VudHJ5XSxbSXRlbV9XaGVyZV0sW0FkZGl0b25fSXRlbV0sW0l0ZW1fRGVzY10sW1JlZmVyZW5jZVZhbHVlXSxbQWNjb3VudFR5cGVdLFtBY2NvdW50TGV2YWxWYWx1ZV0sDQpbU2VyaWFsTnVtYmVyVmFsdWVdLFtNYXhCb3Vuc10sW1NlY3Rpb25zSURdLFtJdGVtQ29zdF0sW1ByaWNlT25lSURdLFtQcmljZVR3b0lEXSxbQmF0cm9uSURdLFtFeHBpcmVEYXRlXSxbSXRlbUhhdmVOb1RheF0sW1VpbnRUaHJlZUlEXSxbVWludFRocmVlQ291bnRdLA0KW0JhcmNvZGVUaGVyZF0sW0l0ZW1MZW5ndGhdLFtJdGVtV2lkdGhdLFtJdGVtSGVpZ2h0XSxbSXRlbVRpbWVdLFtWZW5kb3JJRF0sW1NlYXNpb25JRF0sW0NUSURdLFtNT0ZJRF0sW0NvbG9ySURdLFtTaXplSURdLFtUaW1lRGVsZXZlcmRdLA0KW0NhbkRpdmlkaW5nXSxbSXRlbUhhdmVTdWJJdGVtVmFsdWVdLFtDYXJLTVZdDQopVkFMVUVTKA0KKEBIYXZlRmF0aGVyICsgKENBU0UgV0hFTiBASXRlbUNvZGUgPD0gMTAgVEhFTiAoQ0FTRSBXSEVOIEBGaXJzdCA9ICdUcnVlJyBUSEVOICcwMCcgDQpXSEVOIEBGaXJzdCA9ICdGYWxzZScgVEhFTiANCihDQVNFIFdIRU4gQEl0ZW1Db2RlIDwgMTAgVEhFTiAnMDAnIEVMU0UgJzAnIEVORClFTkQpICsgQEl0ZW1Db2RlIEVMU0UgJzAnICsgQEl0ZW1Db2RlIEVORCkpLA0KQEl0ZW1OYW1lLEBIYXZlRmF0aGVyLCcnLEBCYXJjb2RlLEBCYXJDb2RlQWRkVW5pdHMsJycsJycsJzAnLEBPcmRlcl9MaW1pdGVkLEBVbml0cyxAQWRkX1VuaXRzLEBBZGRfVW5pdHNfQ291bnQsDQonMCcsQEl0ZW1TdGF0dXMsQElTX1N0b3JlLCdGYWxzZScsJycsJzAnLCcwJywnJywnJywnMycsJzMnLEBTZXJpYWxOdW1iZXJWYWx1ZSwnMCcsDQonMCcsJzAnLCcwJywnMCcsJycsJ0ZhbHNlJywnRmFsc2UnLCcwJywnMCcsJycsJzAnLCcwJywnMCcsJ0ZhbHNlJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJ1RydWUnLCdGYWxzZScsJzAnKQ0KU0VUIEBJdGVtSUQgPSAoU0VMRUNUIEBASWRlbnRpdHkpOw0KU0VMRUNUIEBJdGVtQ29kZSA9IFtJdGVtQ29kZV0gRlJPTSBJdGVtIFdIRVJFIFtJRF0gPSBASXRlbUlEDQoNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NCg0KVVBEQVRFIEl0ZW0gU0VUDQpbSXRlbV9OYW1lXSA9IEBJdGVtTmFtZSwNCltVbml0c10gPSBAVW5pdHMsDQpbQWRkX1VuaXRzXSA9IEBBZGRfVW5pdHMsDQpbQWRkX1VuaXRzX0NvdW50XSA9IEBBZGRfVW5pdHNfQ291bnQsDQpbT3JkZXJfTGltaXRlZF0gPSBAT3JkZXJfTGltaXRlZCwNCltCYXJjb2RlXSA9IEBCYXJjb2RlLA0KW0JhckNvZGVBZGRVbml0c10gPSBAQmFyQ29kZUFkZFVuaXRzLA0KW0lTX1N0b3JlXSA9IEBJU19TdG9yZSwNCltTZXJpYWxOdW1iZXJWYWx1ZV0gPSBAU2VyaWFsTnVtYmVyVmFsdWUsDQpbU2VjdGlvbnNJRF0gPSAnMCcsDQpbUHJpY2VPbmVJRF0gPSAnMCcsDQpbUHJpY2VUd29JRF0gPSAnMCcsDQpbQmF0cm9uSURdID0gJycsDQpbRXhwaXJlRGF0ZV0gPSAnRmFsc2UnLA0KW0l0ZW1IYXZlTm9UYXhdID0gJ0ZhbHNlJywNCltVaW50VGhyZWVJRF0gPSAnMCcsDQpbVWludFRocmVlQ291bnRdID0gJzAnLA0KW0JhcmNvZGVUaGVyZF0gPSAnJywNCltJdGVtTGVuZ3RoXSA9ICcwJywNCltJdGVtV2lkdGhdID0gJzAnLA0KW0l0ZW1IZWlnaHRdID0gJzAnLA0KW0l0ZW1UaW1lXSA9ICdGYWxzZScsDQpbVGltZURlbGV2ZXJkXSA9ICcwJywNCltDYW5EaXZpZGluZ10gPSAnVHJ1ZScsDQpbSXRlbUhhdmVTdWJJdGVtVmFsdWVdID0gJ0ZhbHNlJywNCltJdGVtX1N0YXR1c10gPSBASXRlbVN0YXR1cw0KV0hFUkUgW0lEXSA9IEBDVElEDQoNClVQREFURSBJdGVtIFNFVCBbSXRlbV9OYW1lXSA9IEBJdGVtTmFtZSBXSEVSRSBbSURdID0gQENUSUQNClNFTEVDVCBASXRlbUNvZGUgPSBbSXRlbUNvZGVdLEBJdGVtSUQgPSBbSURdIEZST00gSXRlbSBXSEVSRSBbSURdID0gQENUSUQNCkVORA0KRU5EDQpTRUxFQ1QgQEl0ZW1Db2RlIEFTIEl0ZW1Db2RlLEBJdGVtSUQgQVMgSXRlbUlELEBzdGF0dXMgQVMgc3RhdHVzIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRQcmljZU5hbWVWYWx1ZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIFByaWNlTGlzdCBXSEVSRSBbUHJpY2VTdGF0dXNdID0gJ1RydWUnIE9SREVSIEJZIFtJRFZdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRJdGVtUHJpY2VBJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydJVGVtQ29kZSddKSkgJElUZW1Db2RlID0gcGVzdGljaWRlKCRfR0VUWydJVGVtQ29kZSddKTsNCiAgICAkc3FsMSA9ICINClNFTEVDVCBJU05VTEwoSUQsMCkgQVMgSUQsDQpJU05VTEwoUHJpY2VBbW91bnQsMCkgQVMgUHJpY2VBbW91bnQsDQpJU05VTEwoUHJpY2VMaW1pdGVkLDApIEFTIFByaWNlTGltaXRlZCwNCklTTlVMTChQcmljZUZvclVzZXIsMCkgQVMgUHJpY2VGb3JVc2VyLA0KSVNOVUxMKFByaWNlSUQsMCkgQVMgUHJpY2VJRCwNCklTTlVMTChQcmljZU1heCwwKSBBUyBQcmljZU1heA0KRlJPTSBJdGVtX1ByaWNlIFdIRVJFIFtJVGVtQ29kZV0gPSAnIiAuICRJVGVtQ29kZSAuICInDQpBTkQgW1R5cGVdID0gJ1RydWUnIE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEl0ZW1QcmljZUInKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lUZW1Db2RlJ10pKSAkSVRlbUNvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0lUZW1Db2RlJ10pOw0KICAgICRzcWwxID0gIg0KU0VMRUNUIElTTlVMTChJRCwwKSBBUyBJRCwNCklTTlVMTChQcmljZUFtb3VudCwwKSBBUyBQcmljZUFtb3VudCwNCklTTlVMTChQcmljZUxpbWl0ZWQsMCkgQVMgUHJpY2VMaW1pdGVkLA0KSVNOVUxMKFByaWNlRm9yVXNlciwwKSBBUyBQcmljZUZvclVzZXIsDQpJU05VTEwoUHJpY2VJRCwwKSBBUyBQcmljZUlELA0KSVNOVUxMKFByaWNlTWF4LDApIEFTIFByaWNlTWF4DQpGUk9NIEl0ZW1fUHJpY2UgV0hFUkUgW0lUZW1Db2RlXSA9ICciIC4gJElUZW1Db2RlIC4gIicNCkFORCBbVHlwZV0gPSAnRmFsc2UnIE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1NhdmVJdGVtUHJpY2VBJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydJRCddKSkgJElEID0gcGVzdGljaWRlKCRfR0VUWydJRCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnSVRlbUNvZGUnXSkpICRJVGVtQ29kZSA9IHBlc3RpY2lkZSgkX0dFVFsnSVRlbUNvZGUnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1VpbnRPbmUnXSkpICRVaW50T25lID0gcGVzdGljaWRlKCRfR0VUWydVaW50T25lJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydVaW50VHdvJ10pKSAkVWludFR3byA9IHBlc3RpY2lkZSgkX0dFVFsnVWludFR3byddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnUHJpY2VJRCddKSkgJFByaWNlSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1ByaWNlSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1ByaWNlQW1vdW50J10pKSAkUHJpY2VBbW91bnQgPSBwZXN0aWNpZGUoJF9HRVRbJ1ByaWNlQW1vdW50J10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydQcmljZUxpbWl0ZWQnXSkpICRQcmljZUxpbWl0ZWQgPSBwZXN0aWNpZGUoJF9HRVRbJ1ByaWNlTGltaXRlZCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnUHJpY2VNYXgnXSkpICRQcmljZU1heCA9IHBlc3RpY2lkZSgkX0dFVFsnUHJpY2VNYXgnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1ByaWNlRm9yVXNlciddKSkgJFByaWNlRm9yVXNlciA9IHBlc3RpY2lkZSgkX0dFVFsnUHJpY2VGb3JVc2VyJ10pOw0KDQogICAgJHNxbDEgPSAiDQpTRVQgTk9DT1VOVCBPTg0KREVjbGFyZSBAQ1RJRCBhcyBpbnQgPSAnIiAuIGludHZhbCgkSUQpIC4gIic7DQpEZWNsYXJlIEBJVGVtQ29kZSBBUyBudmFyY2hhcihNQVgpID0gJyIgLiAkSVRlbUNvZGUgLiAiJzsNCkRFY2xhcmUgQHN0YXR1cyBBUyBudmFyY2hhcihtYXgpID0gJ3RydWUnOw0KREVjbGFyZSBASXRlbUlEIEFTIGludCA9ICcwJzsNCkRFY2xhcmUgQFVpbnRPbmUgQVMgaW50ID0gJyIgLiAkVWludE9uZSAuICInOw0KREVjbGFyZSBAVWludFR3byBBUyBpbnQgPSAnIiAuICRVaW50VHdvIC4gIic7DQpERWNsYXJlIEBQcmljZUlEIEFTIGludCA9ICciIC4gJFByaWNlSUQgLiAiJzsNCkRFY2xhcmUgQFByaWNlQW1vdW50IEFTIGRlY2ltYWwoMTgsMikgPSAnIiAuICRQcmljZUFtb3VudCAuICInOw0KREVjbGFyZSBAUHJpY2VMaW1pdGVkIEFTIGRlY2ltYWwoMTgsMikgPSAnIiAuICRQcmljZUxpbWl0ZWQgLiAiJzsNCkRFY2xhcmUgQFByaWNlTWF4IEFTIGRlY2ltYWwoMTgsMikgPSAnIiAuICRQcmljZU1heCAuICInOw0KREVjbGFyZSBAUHJpY2VGb3JVc2VyIEFTIGRlY2ltYWwoMTgsMikgPSAnIiAuICRQcmljZUZvclVzZXIgLiAiJzsNCg0KSUYgQENUSUQgPSAwIEJFR0lODQpJTlNFUlQgSU5UTyBJdGVtX1ByaWNlKA0KW0lUZW1Db2RlXSxbUHJpY2VJRF0sW1ByaWNlQW1vdW50XSxbUHJpY2VMaW1pdGVkXSxbUHJpY2VNYXhdLFtVaW50c0lEXSxbVHlwZV0sW1ByaWNlRm9yVXNlcl0NCilWQUxVRVMoDQpASVRlbUNvZGUsQFByaWNlSUQsQFByaWNlQW1vdW50LEBQcmljZUxpbWl0ZWQsQFByaWNlTWF4LEBVaW50T25lLCdUcnVlJyxAUHJpY2VGb3JVc2VyKQ0KDQpTRVQgQEl0ZW1JRCA9IChTRUxFQ1QgQEBJZGVudGl0eSk7DQpFTkQgRUxTRSBJRiBAQ1RJRCAhPSAwIEJFR0lODQoNClVQREFURSBJdGVtX1ByaWNlIFNFVCANCltQcmljZUFtb3VudF0gPSBAUHJpY2VBbW91bnQsDQpbUHJpY2VMaW1pdGVkXSA9IEBQcmljZUxpbWl0ZWQsDQpbUHJpY2VNYXhdID0gQFByaWNlTWF4LA0KW1ByaWNlRm9yVXNlcl0gPSBAUHJpY2VGb3JVc2VyLA0KW1ByaWNlSURdID0gQFByaWNlSUQsDQpbVWludHNJRF0gPSBAVWludE9uZQ0KV0hFUkUgW0lEXSA9IEBDVElEDQoNClNFVCBASXRlbUlEID0gQENUSUQNCkVORA0KU0VMRUNUIEBJdGVtSUQgQVMgSXRlbUlELEBzdGF0dXMgQVMgc3RhdHVzIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdTYXZlSXRlbVByaWNlQicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSUQnXSkpICRJRCA9IHBlc3RpY2lkZSgkX0dFVFsnSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lUZW1Db2RlJ10pKSAkSVRlbUNvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0lUZW1Db2RlJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydVaW50T25lJ10pKSAkVWludE9uZSA9IHBlc3RpY2lkZSgkX0dFVFsnVWludE9uZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnVWludFR3byddKSkgJFVpbnRUd28gPSBwZXN0aWNpZGUoJF9HRVRbJ1VpbnRUd28nXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1ByaWNlSUQnXSkpICRQcmljZUlEID0gcGVzdGljaWRlKCRfR0VUWydQcmljZUlEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydQcmljZUFtb3VudCddKSkgJFByaWNlQW1vdW50ID0gcGVzdGljaWRlKCRfR0VUWydQcmljZUFtb3VudCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnUHJpY2VMaW1pdGVkJ10pKSAkUHJpY2VMaW1pdGVkID0gcGVzdGljaWRlKCRfR0VUWydQcmljZUxpbWl0ZWQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1ByaWNlTWF4J10pKSAkUHJpY2VNYXggPSBwZXN0aWNpZGUoJF9HRVRbJ1ByaWNlTWF4J10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydQcmljZUZvclVzZXInXSkpICRQcmljZUZvclVzZXIgPSBwZXN0aWNpZGUoJF9HRVRbJ1ByaWNlRm9yVXNlciddKTsNCg0KICAgICRzcWwxID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFY2xhcmUgQENUSUQgYXMgaW50ID0gJyIgLiBpbnR2YWwoJElEKSAuICInOw0KRGVjbGFyZSBASVRlbUNvZGUgQVMgbnZhcmNoYXIoTUFYKSA9ICciIC4gJElUZW1Db2RlIC4gIic7DQpERWNsYXJlIEBzdGF0dXMgQVMgbnZhcmNoYXIobWF4KSA9ICd0cnVlJzsNCkRFY2xhcmUgQEl0ZW1JRCBBUyBpbnQgPSAnMCc7DQpERWNsYXJlIEBVaW50T25lIEFTIGludCA9ICciIC4gJFVpbnRPbmUgLiAiJzsNCkRFY2xhcmUgQFVpbnRUd28gQVMgaW50ID0gJyIgLiAkVWludFR3byAuICInOw0KREVjbGFyZSBAUHJpY2VJRCBBUyBpbnQgPSAnIiAuICRQcmljZUlEIC4gIic7DQpERWNsYXJlIEBQcmljZUFtb3VudCBBUyBkZWNpbWFsKDE4LDIpID0gJyIgLiAkUHJpY2VBbW91bnQgLiAiJzsNCkRFY2xhcmUgQFByaWNlTGltaXRlZCBBUyBkZWNpbWFsKDE4LDIpID0gJyIgLiAkUHJpY2VMaW1pdGVkIC4gIic7DQpERWNsYXJlIEBQcmljZU1heCBBUyBkZWNpbWFsKDE4LDIpID0gJyIgLiAkUHJpY2VNYXggLiAiJzsNCkRFY2xhcmUgQFByaWNlRm9yVXNlciBBUyBkZWNpbWFsKDE4LDIpID0gJyIgLiAkUHJpY2VGb3JVc2VyIC4gIic7DQoNCklGIEBDVElEID0gMCBCRUdJTg0KSU5TRVJUIElOVE8gSXRlbV9QcmljZSgNCltJVGVtQ29kZV0sW1ByaWNlSURdLFtQcmljZUFtb3VudF0sW1ByaWNlTGltaXRlZF0sW1ByaWNlTWF4XSxbVWludHNJRF0sW1R5cGVdLFtQcmljZUZvclVzZXJdDQopVkFMVUVTKA0KQElUZW1Db2RlLEBQcmljZUlELEBQcmljZUFtb3VudCxAUHJpY2VMaW1pdGVkLEBQcmljZU1heCxAVWludFR3bywnRmFsc2UnLEBQcmljZUZvclVzZXIpDQoNClNFVCBASXRlbUlEID0gKFNFTEVDVCBAQElkZW50aXR5KTsNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NCg0KVVBEQVRFIEl0ZW1fUHJpY2UgU0VUIA0KW1ByaWNlQW1vdW50XSA9IEBQcmljZUFtb3VudCwNCltQcmljZUxpbWl0ZWRdID0gQFByaWNlTGltaXRlZCwNCltQcmljZU1heF0gPSBAUHJpY2VNYXgsDQpbUHJpY2VGb3JVc2VyXSA9IEBQcmljZUZvclVzZXIsDQpbUHJpY2VJRF0gPSBAUHJpY2VJRCwNCltVaW50c0lEXSA9IEBVaW50VHdvDQpXSEVSRSBbSURdID0gQENUSUQNCg0KU0VUIEBJdGVtSUQgPSBAQ1RJRA0KRU5EDQpTRUxFQ1QgQEl0ZW1JRCBBUyBJdGVtSUQsQHN0YXR1cyBBUyBzdGF0dXMiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICAgICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1JlbW92ZUl0ZW1QcmljZUFCJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydMaW5lSUQnXSkpICRMaW5lSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0xpbmVJRCddKTsNCg0KICAgICRzcWwxID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFQ0xBUkUgQElEIElOVDtTRUxFQ1QgQElEID0gJyIgLiBpbnR2YWwoJExpbmVJRCkgLiAiJzsNCkRFY2xhcmUgQHN0YXR1cyBBUyBudmFyY2hhcihtYXgpID0gJ3RydWVzJzsNCkRFTEVURSBGUk9NIEl0ZW1fUHJpY2UgV0hFUkUgW0lEXSA9IEBJRDsNClNFTEVDVCBAc3RhdHVzIGFzIFN0YXR1c0EiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRCYXJDb2RlQScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSVRlbUNvZGUnXSkpICRJVGVtQ29kZSA9IHBlc3RpY2lkZSgkX0dFVFsnSVRlbUNvZGUnXSk7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBJdGVtQmFyIFdIRVJFIFtJVGVtQ29kZV0gPSAnIiAuICRJVGVtQ29kZSAuICInIEFORCBbVHlwZV0gPSAnT25lJyBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRCYXJDb2RlQicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSVRlbUNvZGUnXSkpICRJVGVtQ29kZSA9IHBlc3RpY2lkZSgkX0dFVFsnSVRlbUNvZGUnXSk7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBJdGVtQmFyIFdIRVJFIFtJVGVtQ29kZV0gPSAnIiAuICRJVGVtQ29kZSAuICInIEFORCBbVHlwZV0gPSAnVHdvJyBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdTYXZlQmFyQ29kZUEnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lEJ10pKSAkSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0lEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJVGVtQ29kZSddKSkgJElUZW1Db2RlID0gcGVzdGljaWRlKCRfR0VUWydJVGVtQ29kZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnTmV3Q29kZSddKSkgJE5ld0NvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ05ld0NvZGUnXSk7DQoNCiAgICAkc3FsMSA9ICINClNFVCBOT0NPVU5UIE9ODQpERWNsYXJlIEBDVElEIGFzIGludCA9ICciIC4gaW50dmFsKCRJRCkgLiAiJzsNCkRlY2xhcmUgQElUZW1Db2RlIEFTIG52YXJjaGFyKE1BWCkgPSAnIiAuICRJVGVtQ29kZSAuICInOw0KREVjbGFyZSBATmV3Q29kZSBBUyBudmFyY2hhcihNQVgpID0gJyIgLiAkTmV3Q29kZSAuICInOw0KREVjbGFyZSBAc3RhdHVzIEFTIG52YXJjaGFyKG1heCkgPSAndHJ1ZSc7DQpERWNsYXJlIEBJdGVtSUQgQVMgaW50ID0gJzAnOw0KDQpJRiBAQ1RJRCA9IDAgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIEl0ZW1CYXIgV0hFUkUgW05ld0NvZGVdID0gQE5ld0NvZGUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdmYWxzZSc7DQpFTkQNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIEl0ZW1CYXIgV0hFUkUgW05ld0NvZGVdID0gQE5ld0NvZGUgQU5EIFtJRF0gIT0gQENUSUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdmYWxzZSc7DQpFTkQNCkVORA0KDQpJRiBAc3RhdHVzID0gJ3RydWUnIEJFR0lODQpJRiBAQ1RJRCA9IDAgQkVHSU4NCklOU0VSVCBJTlRPIEl0ZW1CYXIoW0lUZW1Db2RlXSxbTmV3Q29kZV0sW1R5cGVdKVZBTFVFUyhASVRlbUNvZGUsQE5ld0NvZGUsJ09uZScpDQpTRVQgQEl0ZW1JRCA9IChTRUxFQ1QgQEBJZGVudGl0eSk7DQpFTkQgRUxTRSBJRiBAQ1RJRCAhPSAwIEJFR0lODQpVUERBVEUgSXRlbUJhciBTRVQgW05ld0NvZGVdID0gQE5ld0NvZGUgV0hFUkUgW0lEXSA9IEBDVElEDQpTRVQgQEl0ZW1JRCA9IEBDVElEDQpFTkQNCkVORA0KU0VMRUNUIEBJdGVtSUQgQVMgSXRlbUlELEBzdGF0dXMgQVMgc3RhdHVzIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdTYXZlQmFyQ29kZUInKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lEJ10pKSAkSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0lEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJVGVtQ29kZSddKSkgJElUZW1Db2RlID0gcGVzdGljaWRlKCRfR0VUWydJVGVtQ29kZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnTmV3Q29kZSddKSkgJE5ld0NvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ05ld0NvZGUnXSk7DQoNCiAgICAkc3FsMSA9ICINClNFVCBOT0NPVU5UIE9ODQpERWNsYXJlIEBDVElEIGFzIGludCA9ICciIC4gaW50dmFsKCRJRCkgLiAiJzsNCkRlY2xhcmUgQElUZW1Db2RlIEFTIG52YXJjaGFyKE1BWCkgPSAnIiAuICRJVGVtQ29kZSAuICInOw0KREVjbGFyZSBATmV3Q29kZSBBUyBudmFyY2hhcihNQVgpID0gJyIgLiAkTmV3Q29kZSAuICInOw0KREVjbGFyZSBAc3RhdHVzIEFTIG52YXJjaGFyKG1heCkgPSAndHJ1ZSc7DQpERWNsYXJlIEBJdGVtSUQgQVMgaW50ID0gJzAnOw0KDQpJRiBAQ1RJRCA9IDAgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIEl0ZW1CYXIgV0hFUkUgW05ld0NvZGVdID0gQE5ld0NvZGUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdmYWxzZSc7DQpFTkQNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIEl0ZW1CYXIgV0hFUkUgW05ld0NvZGVdID0gQE5ld0NvZGUgQU5EIFtJRF0gIT0gQENUSUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdmYWxzZSc7DQpFTkQNCkVORA0KDQpJRiBAc3RhdHVzID0gJ3RydWUnIEJFR0lODQpJRiBAQ1RJRCA9IDAgQkVHSU4NCklOU0VSVCBJTlRPIEl0ZW1CYXIoW0lUZW1Db2RlXSxbTmV3Q29kZV0sW1R5cGVdKVZBTFVFUyhASVRlbUNvZGUsQE5ld0NvZGUsJ1R3bycpDQoNClNFVCBASXRlbUlEID0gKFNFTEVDVCBAQElkZW50aXR5KTsNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NClVQREFURSBJdGVtQmFyIFNFVCBbTmV3Q29kZV0gPSBATmV3Q29kZSBXSEVSRSBbSURdID0gQENUSUQNClNFVCBASXRlbUlEID0gQENUSUQNCkVORA0KRU5EDQpTRUxFQ1QgQEl0ZW1JRCBBUyBJdGVtSUQsQHN0YXR1cyBBUyBzdGF0dXMiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICAgICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1JlbW92ZUl0ZW1CYXJDb2RlQUInKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0xpbmVJRCddKSkgJExpbmVJRCA9IHBlc3RpY2lkZSgkX0dFVFsnTGluZUlEJ10pOw0KDQogICAgJHNxbDEgPSAiDQpTRVQgTk9DT1VOVCBPTg0KREVDTEFSRSBASUQgSU5UO1NFTEVDVCBASUQgPSAnIiAuIGludHZhbCgkTGluZUlEKSAuICInOw0KREVjbGFyZSBAc3RhdHVzIEFTIG52YXJjaGFyKG1heCkgPSAndHJ1ZXMnOw0KREVMRVRFIEZST00gSXRlbUJhciBXSEVSRSBbSURdID0gQElEOw0KU0VMRUNUIEBzdGF0dXMgYXMgU3RhdHVzQSI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFVvSURWJykgew0KICAgICRzcWwxID0gIlNFTEVDVCBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBVbml0cyBPUkRFUiBCWSBbSURWXSBERVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnU2F2ZVVpbnQnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lEJ10pKSAkSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0lEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJVGVtTmFtZSddKSkgJElUZW1OYW1lID0gcGVzdGljaWRlKCRfR0VUWydJVGVtTmFtZSddKTsNCg0KICAgICAgICAkc3FsMTIzID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFY2xhcmUgQENUSUQgYXMgaW50ID0gJyIgLiBpbnR2YWwoJElEKSAuICInOw0KREVjbGFyZSBASXRlbUlEIGFzIGludCA9IDA7DQpERWNsYXJlIEBCcmFuY2hJRCBhcyBpbnQgPSAnIi4kTmV3QnJhbmNoSUQuIic7DQpERWNsYXJlIEBJdGVtTmFtZSBhcyBudmFyY2hhcihtYXgpID0gJyIgLiAkSVRlbU5hbWUgLiAiJzsNCkRlY2xhcmUgQEl0ZW1Db2RlIEFTIG52YXJjaGFyKE1BWCkgPSAwOw0KREVjbGFyZSBAc3RhdHVzIGFzIG52YXJjaGFyKG1heCkgPSAndHJ1ZSc7DQoNCklGIEBDVElEID0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gVW5pdHMgV0hFUkUgW1VuaXRfTmFtZV0gPSBASXRlbU5hbWUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdmYWxzZSc7DQpFTkQNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIFVuaXRzIFdIRVJFIFtVbml0X05hbWVdID0gQEl0ZW1OYW1lIEFORCBbSURdICE9IEBDVElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnZmFsc2UnOw0KRU5EDQpFTkQNCg0KSUYgQHN0YXR1cyA9ICd0cnVlJyBCRUdJTg0KSUYgQENUSUQgPSAwIEJFR0lODQoNCklOU0VSVCBJTlRPIFVuaXRzKFtJRFZdLFtVbml0X05hbWVdDQopVkFMVUVTKA0KKFNFTEVDVCAoQ0FTRSBXSEVODQooU0VMRUNUIENPVU5UKElEVikgRlJPTSBVbml0cykgPiAwIFRIRU4gDQooU0VMRUNUIFRPUCAxIFtJRFZdICsgMSBGUk9NIFVuaXRzIE9SREVSIEJZIFtJRFZdIERFU0MpIA0KRUxTRSAxIEVORCkgQVMgW0lEVl0gRlJPTSBDb21wYW55SW5mbyBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEKSxASXRlbU5hbWUpDQoNClNFVCBASXRlbUlEID0gKFNFTEVDVCBAQElkZW50aXR5KTsNClNFTEVDVCBUT1AgKDEpIEBJdGVtQ29kZSA9IFtJRFZdIEZST00gVW5pdHMgV0hFUkUgW0lEXSA9IEBJdGVtSUQNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NClVQREFURSBVbml0cyBTRVQgW1VuaXRfTmFtZV0gPSBASXRlbU5hbWUgV0hFUkUgW0lEXSA9IEBDVElEDQpTRUxFQ1QgQEl0ZW1Db2RlID0gW0lEVl0sQEl0ZW1JRCA9IFtJRF0gRlJPTSBVbml0cyBXSEVSRSBbSURdID0gQENUSUQNCkVORA0KRU5EDQo7DQpTRUxFQ1QgQEl0ZW1Db2RlIEFTIEl0ZW1Db2RlLEBJdGVtSUQgQVMgSXRlbUlELEBzdGF0dXMgQVMgc3RhdHVzIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjMyLCRzcWwxMjMsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJiMxNTc1OyYjMTU4NzsmIzE2MDU7ICYjMTU3NTsmIzE2MDQ7JiMxNjA1OyYjMTU4MDsmIzE2MDU7JiMxNjA4OyYjMTU5MzsmIzE2MDc7ICYjMTYwNTsmIzE2MDM7JiMxNTg1OyYjMTU4NTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzIpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnUmVtb3ZlVWludCcpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnTGluZUlEJ10pKSAkTGluZUlEID0gcGVzdGljaWRlKCRfR0VUWydMaW5lSUQnXSk7DQoNCiAgICAkc3FsMSA9ICINClNFVCBOT0NPVU5UIE9ODQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9ICciIC4gaW50dmFsKCRMaW5lSUQpIC4gIic7DQpERWNsYXJlIEBzdGF0dXMgQVMgbnZhcmNoYXIobWF4KSA9ICd0cnVlcyc7DQoNCklGIEV4aXN0cyhTRUxFQ1QgW0l0ZW1JRF0gRlJPTSBJdGVtIFdIRVJFIFtVbml0c10gPSBASUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdIYXZlTW92ZSc7DQpFTkQgRUxTRSBJRiBOT1QgRXhpc3RzKFNFTEVDVCBbSXRlbUlEXSBGUk9NIEl0ZW0gV0hFUkUgW1VuaXRzXSA9IEBJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ3RydWVzJzsNCkVORA0KDQpJRiBAc3RhdHVzID0gJ3RydWVzJyBCRUdJTjsNCkRFTEVURSBGUk9NIFVuaXRzIFdIRVJFIFtJRFZdID0gQElEOw0KRU5EDQoNClNFTEVDVCBAc3RhdHVzIGFzIFN0YXR1c0EiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRQcmljZUxpc3RWYWx1ZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIFByaWNlTGlzdCBPUkRFUiBCWSBbSURWXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnU2F2ZVByaWNlTGlzdCcpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnSUQnXSkpICRJRCA9IHBlc3RpY2lkZSgkX0dFVFsnSUQnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lUZW1OYW1lJ10pKSAkSVRlbU5hbWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0lUZW1OYW1lJ10pOw0KDQogICAgICAgICRzcWwxMjMgPSAiDQpTRVQgTk9DT1VOVCBPTg0KREVjbGFyZSBAQ1RJRCBhcyBpbnQgPSAnIiAuIGludHZhbCgkSUQpIC4gIic7DQpERWNsYXJlIEBJdGVtSUQgYXMgaW50ID0gMDsNCkRFY2xhcmUgQEJyYW5jaElEIGFzIGludCA9ICciLiROZXdCcmFuY2hJRC4iJzsNCkRFY2xhcmUgQEl0ZW1OYW1lIGFzIG52YXJjaGFyKG1heCkgPSAnIiAuICRJVGVtTmFtZSAuICInOw0KRGVjbGFyZSBASXRlbUNvZGUgQVMgbnZhcmNoYXIoTUFYKSA9IDA7DQpERWNsYXJlIEBzdGF0dXMgYXMgbnZhcmNoYXIobWF4KSA9ICd0cnVlJzsNCg0KSUYgQENUSUQgPSAwIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBQcmljZUxpc3QgV0hFUkUgW1ByaWNlTmFtZV0gPSBASXRlbU5hbWUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdmYWxzZSc7DQpFTkQNCkVORCBFTFNFIElGIEBDVElEICE9IDAgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIFByaWNlTGlzdCBXSEVSRSBbUHJpY2VOYW1lXSA9IEBJdGVtTmFtZSBBTkQgW0lEXSAhPSBAQ1RJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZScgQkVHSU4NCklGIEBDVElEID0gMCBCRUdJTg0KDQpJTlNFUlQgSU5UTyBQcmljZUxpc3QoW0lEVl0sW1ByaWNlTmFtZV0NCilWQUxVRVMoDQooU0VMRUNUIChDQVNFIFdIRU4NCihTRUxFQ1QgQ09VTlQoSURWKSBGUk9NIFByaWNlTGlzdCkgPiAwIFRIRU4gDQooU0VMRUNUIFRPUCAxIFtJRFZdICsgMSBGUk9NIFByaWNlTGlzdCBPUkRFUiBCWSBbSURWXSBERVNDKSANCkVMU0UgMSBFTkQpIEFTIFtJRFZdIEZST00gQ29tcGFueUluZm8gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCksQEl0ZW1OYW1lKQ0KDQpTRVQgQEl0ZW1JRCA9IChTRUxFQ1QgQEBJZGVudGl0eSk7DQpTRUxFQ1QgVE9QICgxKSBASXRlbUNvZGUgPSBbSURWXSBGUk9NIFByaWNlTGlzdCBXSEVSRSBbSURdID0gQEl0ZW1JRA0KRU5EIEVMU0UgSUYgQENUSUQgIT0gMCBCRUdJTg0KVVBEQVRFIFByaWNlTGlzdCBTRVQgW1ByaWNlTmFtZV0gPSBASXRlbU5hbWUgV0hFUkUgW0lEXSA9IEBDVElEDQpTRUxFQ1QgQEl0ZW1Db2RlID0gW0lEVl0sQEl0ZW1JRCA9IFtJRF0gRlJPTSBQcmljZUxpc3QgV0hFUkUgW0lEXSA9IEBDVElEDQpFTkQNCkVORA0KOw0KU0VMRUNUIEBJdGVtQ29kZSBBUyBJdGVtQ29kZSxASXRlbUlEIEFTIEl0ZW1JRCxAc3RhdHVzIEFTIHN0YXR1cyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMiwkc3FsMTIzLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTU3NTsmIzE1ODc7JiMxNjA1OyAmIzE1NzU7JiMxNjA0OyYjMTYwNTsmIzE1ODA7JiMxNjA1OyYjMTYwODsmIzE1OTM7JiMxNjA3OyAmIzE2MDU7JiMxNjAzOyYjMTU4NTsmIzE1ODU7JzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMyKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1JlbW92ZVByaWNlTCcpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnTGluZUlEJ10pKSAkTGluZUlEID0gcGVzdGljaWRlKCRfR0VUWydMaW5lSUQnXSk7DQoNCiAgICAkc3FsMSA9ICINClNFVCBOT0NPVU5UIE9ODQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9ICciIC4gaW50dmFsKCRMaW5lSUQpIC4gIic7DQpERWNsYXJlIEBzdGF0dXMgQVMgbnZhcmNoYXIobWF4KSA9ICd0cnVlcyc7DQoNCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIENsaWVudHMgV0hFUkUgW1ByaWNlSURdID0gQElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnSGF2ZU1vdmUnOw0KRU5EIEVMU0UgSUYgTk9UIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIENsaWVudHMgV0hFUkUgW1ByaWNlSURdID0gQElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQoNCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIEl0ZW1fUHJpY2UgV0hFUkUgW1ByaWNlSURdID0gQElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnSGF2ZU1vdmUnOw0KRU5EIEVMU0UgSUYgTk9UIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIEl0ZW1fUHJpY2UgV0hFUkUgW1ByaWNlSURdID0gQElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZXMnIEJFR0lOOw0KREVMRVRFIEZST00gUHJpY2VMaXN0IFdIRVJFIFtJRFZdID0gQElEOw0KRU5EDQoNClNFTEVDVCBAc3RhdHVzIGFzIFN0YXR1c0EiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjMwLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDbGllbnRJRFYnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUIFtJRFZdICsgMSBBUyBbSURWXSBGUk9NIENsaWVudHMgT1JERVIgQlkgW0lEVl0gREVTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFyZWFOYW1lJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQXJlYSBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q2xpZW50Q1ROYW1lJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQ2xpZW50Q2F0ZWdvcnkgT1JERVIgQlkgW0lEXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudEFjY05hbWUnKSB7DQogICAgJHNxbDEgPSAiDQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9IChTRUxFQ1QgW0NsaWVudEFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQgDQpVTklPTiBBTEwgDQpTRUxFQ1QgVC5bSURdLFQuW0hhdmVGYXRoZXJdLFQuW0FjY291bnRDb2RlVmFsdWVdLFQuW0FjY291bnROYW1lVmFsdWVdLFQuW0FjY291bnRUeXBlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBUIElOTkVSIEpPSU4gI1Jlc3VsdHMgUiBPTiBSLltBY2NvdW50Q29kZVZhbHVlXSA9IFQuW0hhdmVGYXRoZXJdKQ0KU0VMRUNUIFtJRF0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0sKFNFTEVDVCBUT1AgKDEpIFtDbGllbnRMb2NhbEFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKSBBUyBbQ2xpZW50TG9jYWxBY2NvdW50XQ0KRlJPTSAjUmVzdWx0cyBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudHNUeXBlTmFtZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIENsaWVudHNUeXBlIE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uNCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRWZW5kb3JOYW1lVmFsdWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBWYW5kb3IgV0hFUkUgW1ZhbmRvclN0YXR1c10gPSAnVHJ1ZScgT1JERVIgQlkgW0lEXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1JlbW92ZUNsaWVudEl0ZW1MaW5lJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydMaW5lSUQnXSkpICRMaW5lSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0xpbmVJRCddKTsNCg0KICAgICAgICAkc3FsID0gIg0KREVjbGFyZSBATGluZUlEIGFzIGludCA9ICciIC4gJExpbmVJRCAuICInOw0KREVMRVRFIEZST00gQ2xpZW50c0l0ZW0gV0hFUkUgW0lEXSA9IEBMaW5lSUQNClNFTEVDVCAnVHJ1ZScgQVMgU3RhdHVzIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjMyLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4zMik7DQoNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1JlbW92ZUNsaWVudCcpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQ2xpZW50SUQnXSkpICRDbGllbnRJRCA9IHBlc3RpY2lkZSgkX0dFVFsnQ2xpZW50SUQnXSk7DQoNCiAgICAkc3FsMSA9ICINClNFVCBOT0NPVU5UIE9ODQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9ICciIC4gaW50dmFsKCRDbGllbnRJRCkgLiAiJzsNCkRFY2xhcmUgQHN0YXR1cyBBUyBudmFyY2hhcihtYXgpID0gJ3RydWVzJzsNCg0KSUYgRXhpc3RzKFNFTEVDVCBUT1AgKDEpICogRlJPTSBDbGllbnRzX0VudGVyeSBXSEVSRSBbQ2xpZW50SURdID0gQElEIEFORCBbVHlwZV0gIT0gJ0NsaWVudEJlZ2luJykgQkVHSU4NClNFVCBAc3RhdHVzID0gJ0hhdmVNb3ZlJzsNCkVORCBFTFNFIElGIE5PVCBFeGlzdHMoU0VMRUNUIFRPUCAoMSkgKiBGUk9NIENsaWVudHNfRW50ZXJ5IFdIRVJFIFtDbGllbnRJRF0gPSBASUQgQU5EIFtUeXBlXSAhPSAnQ2xpZW50QmVnaW4nKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQoNCmlmIEBzdGF0dXMgPSAndHJ1ZXMnIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUIFRPUCAoMSkgKiBGUk9NIEtlc3QgV0hFUkUgW0NsaWVudElEXSA9IEBJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ0hhdmVNb3ZlJzsNCkVORCBFTFNFIElGIE5PVCBFeGlzdHMoU0VMRUNUIFRPUCAoMSkgKiBGUk9NIEtlc3QgV0hFUkUgW0NsaWVudElEXSA9IEBJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ3RydWVzJzsNCkVORA0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZXMnIEJFR0lOOw0KREVMRVRFIEZST00gQ2xpZW50c19FbnRlcnkgV0hFUkUgW0NsaWVudElEXSA9ICBASUQ7DQpERUxFVEUgRlJPTSBDbGllbnRzX0VJVCBXSEVSRSBbQ2xpZW50SURdID0gIEBJRDsNCkRFTEVURSBGUk9NIENsaWVudEJlZ2luIFdIRVJFIFtDbGllbnRJRF0gPSAgQElEOw0KREVMRVRFIEZST00gQ2xpZW50c0l0ZW0gV0hFUkUgW0NsaWVudElEXSA9ICBASUQ7DQpERUxFVEUgRlJPTSBWQUMgV0hFUkUgW0NsaWVudElEXSA9IEBJRDsNCkRFTEVURSBGUk9NIENsaWVudHMgV0hFUkUgW0lEXSA9ICBASUQ7DQpFTkQNCg0KU0VMRUNUIEBzdGF0dXMgYXMgU3RhdHVzQSI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFZlbmRvckFjY05hbWUnKSB7DQogICAgJHNxbDEgPSAiDQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9IChTRUxFQ1QgW1ZlbmRvckFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQgDQpVTklPTiBBTEwgDQpTRUxFQ1QgVC5bSURdLFQuW0hhdmVGYXRoZXJdLFQuW0FjY291bnRDb2RlVmFsdWVdLFQuW0FjY291bnROYW1lVmFsdWVdLFQuW0FjY291bnRUeXBlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBUIElOTkVSIEpPSU4gI1Jlc3VsdHMgUiBPTiBSLltBY2NvdW50Q29kZVZhbHVlXSA9IFQuW0hhdmVGYXRoZXJdKQ0KU0VMRUNUIFtJRF0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0sDQooU0VMRUNUIFRPUCAoMSkgW1ZlbmRvckxvY2FsQWNjb3VudElEXSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9ICciLiROZXdCcmFuY2hJRC4iJykgQVMgW1ZlbmRvckxvY2FsQWNjb3VudElEXQ0KRlJPTSAjUmVzdWx0cyBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFZlbmRvckNUTmFtZScpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIFZhbmRvckNhdGVnb3J5IE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uNCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRWZW5kb3JJRFYnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUIFtJRFZdICsgMSBBUyBbSURWXSBGUk9NIFZhbmRvciBPUkRFUiBCWSBbSURWXSBERVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnUmVtb3ZlVmVuZG9yJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydWZW5kb3JJRCddKSkgJFZlbmRvcklEID0gcGVzdGljaWRlKCRfR0VUWydWZW5kb3JJRCddKTsNCg0KICAgICRzcWwxID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFQ0xBUkUgQElEIElOVDtTRUxFQ1QgQElEID0gJyIgLiBpbnR2YWwoJFZlbmRvcklEKSAuICInOw0KREVjbGFyZSBAc3RhdHVzIEFTIG52YXJjaGFyKG1heCkgPSAndHJ1ZXMnOw0KDQpJRiBFeGlzdHMoU0VMRUNUIFRPUCAoMSkgKiBGUk9NIFZhbmRvcl9FbnRlcnkgV0hFUkUgW1ZhbmRvcklEXSA9IEBJRCBBTkQgW1R5cGVdICE9ICdWZW5kb3JCZWdpbicpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdIYXZlTW92ZSc7DQpFTkQgRUxTRSBJRiBOT1QgRXhpc3RzKFNFTEVDVCBUT1AgKDEpICogRlJPTSBWYW5kb3JfRW50ZXJ5IFdIRVJFIFtWYW5kb3JJRF0gPSBASUQgQU5EIFtUeXBlXSAhPSAnVmVuZG9yQmVnaW4nKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQoNCg0KSUYgQHN0YXR1cyA9ICd0cnVlcycgQkVHSU47DQpERUxFVEUgRlJPTSBWYW5kb3JfRW50ZXJ5IFdIRVJFIFtWYW5kb3JJRF0gPSBASUQ7DQpERUxFVEUgRlJPTSBWYW5kb3JfRUlUIFdIRVJFIFtWYW5kb3JJRF0gPSBASUQ7DQpERUxFVEUgRlJPTSBWZW5kb3JCZWdpbiBXSEVSRSBbVmVuZG9ySURdID0gQElEOw0KREVMRVRFIEZST00gVmFuZG9yIFdIRVJFIFtJRF0gPSBASUQ7DQpFTkQNCg0KU0VMRUNUIEBzdGF0dXMgYXMgU3RhdHVzQSI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMzAsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjMwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFZlbmRvckNvZGUnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1ZlbmRvcklEViddKSkgJFZlbmRvcklEViA9IHBlc3RpY2lkZSgkX0dFVFsnVmVuZG9ySURWJ10pOw0KDQogICAgJHNxbCA9ICJTRUxFQ1QgW0lEXSBGUk9NIFZhbmRvciBXSEVSRSBbSURWXSA9ICciLiRWZW5kb3JJRFYuIiciOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTYsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNjA1OyYjMTYwODsmIzE1ODU7JiMxNTgzOyAmIzE1OTQ7JiMxNjEwOyYjMTU4NTsgJiMxNTg5OyYjMTU4MTsmIzE2MTA7JiMxNTgxOyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xNik7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDb250cmFjdG9yc0lEJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydDb250cmFjdG9yc0lEJ10pKSAkQ29udHJhY3RvcnNJRCA9IHBlc3RpY2lkZSgkX0dFVFsnQ29udHJhY3RvcnNJRCddKTsNCg0KICAgICRzcWwgPSAiU0VMRUNUICogRlJPTSBDb250cmFjdG9ycyBXSEVSRSBbSURdID0gJyIuJENvbnRyYWN0b3JzSUQuIiciOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTYsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNjA1OyYjMTYwMjsmIzE1NzU7JiMxNjA4OyYjMTYwNDsgJiMxNTk0OyYjMTYxMDsmIzE1ODU7ICYjMTU4OTsmIzE1ODE7JiMxNjEwOyYjMTU4MTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0VmVuZG9ySUQnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1ZlbmRvcklEJ10pKSAkVmVuZG9ySUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1ZlbmRvcklEJ10pOw0KDQogICAgJHNxbCA9ICJTRUxFQ1QgKiBGUk9NIFZhbmRvciBXSEVSRSBbSURdID0gJyIuJFZlbmRvcklELiInIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjE2LCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTYwMzsmIzE2MDg7JiMxNTgzOyAmIzE1NzU7JiMxNjA0OyYjMTYwNTsmIzE2MDg7JiMxNTg1OyYjMTU4MzsgJiMxNTk0OyYjMTYxMDsmIzE1ODU7ICYjMTU4OTsmIzE1ODE7JiMxNjEwOyYjMTU4MTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0VmVuZG9yQmVnaW4nKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICosSVNOVUxMKENydW5TYXJmLDEpIEFTIENydW5TYXJmQSxGT1JNQVQoRGF0ZVRpbWUsICd5eXl5L01NL2RkJykgQVMgRGF0ZVRpbWVBLChTRUxFQ1QgVE9QICgxKSBbSURWXSBGUk9NIFZhbmRvciBXSEVSRSBbSURdID0gVmVuZG9yQmVnaW4uW1ZlbmRvcklEXSkgQVMgVmVuZG9ySURWIEZST00gVmVuZG9yQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9ICciLiROZXdCcmFuY2hJRC4iJyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q2xpZW50QmVnaW4nKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICosSVNOVUxMKENydW5TYXJmLDEpIEFTIENydW5TYXJmQSxGT1JNQVQoRGF0ZVRpbWUsICd5eXl5L01NL2RkJykgQVMgRGF0ZVRpbWVBLChTRUxFQ1QgVE9QICgxKSBbSURWXSBGUk9NIENsaWVudHMgV0hFUkUgW0lEXSA9IENsaWVudEJlZ2luLltDbGllbnRJRF0pIEFTIENsaWVudElEViBGUk9NIENsaWVudEJlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSAnIi4kTmV3QnJhbmNoSUQuIiciOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudENvZGUnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0NsaWVudElEViddKSkgJENsaWVudElEViA9IHBlc3RpY2lkZSgkX0dFVFsnQ2xpZW50SURWJ10pOw0KDQogICAgJHNxbCA9ICJTRUxFQ1QgW0lEXSBGUk9NIENsaWVudHMgV0hFUkUgW0lEVl0gPSAnIi4kQ2xpZW50SURWLiInIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjE2LCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTYwMzsmIzE2MDg7JiMxNTgzOyAmIzE1NzU7JiMxNjA0OyYjMTU5MzsmIzE2MDU7JiMxNjEwOyYjMTYwNDsgJiMxNTk0OyYjMTYxMDsmIzE1ODU7ICYjMTU4OTsmIzE1ODE7JiMxNjEwOyYjMTU4MTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q2xpZW50SUQnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0NsaWVudElEJ10pKSAkQ2xpZW50SUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0NsaWVudElEJ10pOw0KDQogICAgJHNxbCA9ICJTRUxFQ1QgW0lEVl0gRlJPTSBDbGllbnRzIFdIRVJFIFtJRF0gPSAnIi4kQ2xpZW50SUQuIiciOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTYsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNTkzOyYjMTYwNTsmIzE2MTA7JiMxNjA0OyAmIzE1OTQ7JiMxNjEwOyYjMTU4NTsgJiMxNTg5OyYjMTU4MTsmIzE2MTA7JiMxNTgxOyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xNik7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRLaGF6bmFCZWdpbicpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKixJU05VTEwoQ3J1blNhcmYsMSkgQVMgQ3J1blNhcmZBLFtEYXRlVGltZV0gQVMgRGF0ZVRpbWVBIEZST00gS2hhem5hQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9ICciLiROZXdCcmFuY2hJRC4iJyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0QmFua0JlZ2luJykgew0KICAgICRzcWwxID0gIg0KU0VMRUNUICosSVNOVUxMKENydW5TYXJmLDEpIEFTIENydW5TYXJmQSwNCkZPUk1BVChEYXRlVGltZSwneXl5eS9NTS9kZCcpIEFTIERhdGVUaW1lQSANCkZST00gQmFua0JlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSAnIi4kTmV3QnJhbmNoSUQuIiciOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnQmFua0FDQycpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQmFua0FDQ0lEJ10pKSAkQmFua0FDQ0lEID0gcGVzdGljaWRlKCRfR0VUWydCYW5rQUNDSUQnXSk7DQoNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEJhbmtBY2NvdW50cyBXSEVSRSBbSURdID0gJyIuJEJhbmtBQ0NJRC4iJyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xNiwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJiMxNjAzOyYjMTYwODsmIzE1ODM7ICYjMTU3NTsmIzE2MDQ7JiMxNTc2OyYjMTYwNjsmIzE2MDM7ICYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE1ODk7JiMxNTgxOyYjMTYxMDsmIzE1ODE7JzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEJhbmtBQ0MnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbIkJhbmtJRCJdKSkgJEJhbmtJRCA9IHN0cnZhbCgkX0dFVFsiQmFua0lEIl0pOw0KIA0KJHNxbDEgPSAiU0VMRUNUICogRlJPTSBCYW5rQWNjb3VudHMgV0hFUkUgW0JhbmtJRF0gPSAnIi4kQmFua0lELiInIjsNCiRCYW5rQUNDID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMiwkc3FsMSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCmlmIChzcWxzcnZfaGFzX3Jvd3MoJEJhbmtBQ0MpKSB7DQp3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQmFua0FDQyxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiRyZXN1bHRbXSA9ICRmZXRjaFQ7DQp9DQplY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQp9DQpzcWxzcnZfZnJlZV9zdG10KCRCYW5rQUNDKTsNCiBzcWxzcnZfY2xvc2UoJGNvbm4yKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRCZWdpbicpIHsNCiAgICAkc3FsMSA9ICINClNFTEVDVA0KKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50Q29kZVZhbHVlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbSURdID0gQWNjb3VudHNfRW50ZXJ5LltBY2NvdW50SURdKSBBUyBBY2NvdW50Q29kZSwNCltJRF0sW0FjY291bnRJRF0sDQpJU05VTEwoW1BsdXNdLDApIEFTIFBsdXMsDQpJU05VTEwoW01pbnNdLDApIEFTIE1pbnMsDQpJU05VTEwoW1R5cGVEZXNjXSwnJykgQVMgSW5mb1RleHQNCkZST00gQWNjb3VudHNfRW50ZXJ5IFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInDQpBTkQgW0FjY291bnRCZWdpbl0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0lEXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q29tcGFueUluZm8nKSB7DQogICAgJHNxbDEgPSAiDQpTRVQgTk9DT1VOVCBPTg0KSUYgT0JKRUNUX0lEKCd0ZW1wZGIuLiNUZW1wb3JhcnlUYWJsZScpIElTIE5PVCBOVUxMIERST1AgVGFibGUgI1RlbXBvcmFyeVRhYmxlOw0KU0VMRUNUICogSU5UTyAjVGVtcG9yYXJ5VGFibGUgRlJPTSBDb21wYW55SW5mbyBXSEVSRSBbQnJhbmNoSURdID0gJyIgLiAkTmV3QnJhbmNoSUQgLiAiJw0KQUxURVIgVEFCTEUgI1RlbXBvcmFyeVRhYmxlIERST1AgQ09MVU1OIENvbXBhbnlMb2dvDQpTRUxFQ1QgKixGT1JNQVQoSVNOVUxMKEJlZ2luRGF0ZVRpbWUsR0VUREFURSgpKSwgJ3l5eXkvTU0vZGQnKSBBUyBCZWdpbkRhdGVUaW1lQSBGUk9NICNUZW1wb3JhcnlUYWJsZSI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xNiwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRDb2RlQScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQWNjb3VudENvZGUnXSkpICRBY2NvdW50Q29kZSA9IHBlc3RpY2lkZSgkX0dFVFsnQWNjb3VudENvZGUnXSk7DQoNCiAgICAkc3FsID0gIlNFTEVDVCBbSURdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtBY2NvdW50Q29kZVZhbHVlXSA9ICciLiRBY2NvdW50Q29kZS4iJyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xNiwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcmIzE2MDM7JiMxNjA4OyYjMTU4MzsgJiMxNTc1OyYjMTYwNDsmIzE1ODE7JiMxNTg3OyYjMTU3NTsmIzE1NzY7ICYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE1ODk7JiMxNTgxOyYjMTYxMDsmIzE1ODE7JzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRJREEnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0FjY291bnRJRCddKSkgJEFjY291bnRJRCA9IHBlc3RpY2lkZSgkX0dFVFsnQWNjb3VudElEJ10pOw0KDQogICAgJHNxbCA9ICJTRUxFQ1QgW0FjY291bnRDb2RlVmFsdWVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtJRF0gPSAnIi4kQWNjb3VudElELiInIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjE2LCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTYwMzsmIzE2MDg7JiMxNTgzOyAmIzE1NzU7JiMxNjA0OyYjMTU4MTsmIzE1ODc7JiMxNTc1OyYjMTU3NjsgJiMxNTk0OyYjMTYxMDsmIzE1ODU7ICYjMTU4OTsmIzE1ODE7JiMxNjEwOyYjMTU4MTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnUmVsb2FkQmVnaW5WYWx1ZUJ1dHRvbicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnRGF0ZVRpbWVWYWx1ZSddKSkgJERhdGVUaW1lVmFsdWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0RhdGVUaW1lVmFsdWUnXSk7DQoNCiAgICAkc3FsID0gIg0KU0VUIE5PQ09VTlQgT04gDQpEZWNsYXJlIEBCcmFuY2hJRCBhcyBpbnQgPSAnIiAuICROZXdCcmFuY2hJRCAuICInOw0KRGVjbGFyZSBARGVmYWx1dGVDdXJyZW5jeSBhcyBpbnQgPSAnIiAuICREZWZhbHV0ZUN1cnJlbmN5IC4gIic7DQpEZWNsYXJlIEBEYXRlVGltZUEgYXMgZGF0ZSA9ICciIC4gJERhdGVUaW1lVmFsdWUgLiAiJzsNCkRFTEVURSBGUk9NIEFjY291bnRzX0VudGVyeSBXSEVSRSBbVHlwZV0gPSAnQ2xpZW50QmVnaW4nIEFORCBbQnJhbmNoSURdID0gQEJyYW5jaElEDQpERUxFVEUgRlJPTSBBY2NvdW50c19FbnRlcnkgV0hFUkUgW1R5cGVdID0gJ1ZlbmRvckJlZ2luJyBBTkQgW0JyYW5jaElEXSA9IEBCcmFuY2hJRA0KREVMRVRFIEZST00gQWNjb3VudHNfRW50ZXJ5IFdIRVJFIFtUeXBlXSA9ICdCYW5rQmVnaW4nIEFORCBbQnJhbmNoSURdID0gQEJyYW5jaElEDQpERUxFVEUgRlJPTSBBY2NvdW50c19FbnRlcnkgV0hFUkUgW1R5cGVdID0gJ0toYXpuYUJlZ2luJyBBTkQgW0JyYW5jaElEXSA9IEBCcmFuY2hJRA0KREVMRVRFIEZST00gQWNjb3VudHNfRW50ZXJ5IFdIRVJFIFtUeXBlXSA9ICdDaGVja3NJTkJlZ2luJyBBTkQgW0JyYW5jaElEXSA9IEBCcmFuY2hJRA0KREVMRVRFIEZST00gQWNjb3VudHNfRW50ZXJ5IFdIRVJFIFtUeXBlXSA9ICdDaGVja3NPdXRCZWdpbicgQU5EIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQNCkRFTEVURSBGUk9NIEFjY291bnRzX0VudGVyeSBXSEVSRSBbVHlwZV0gPSAnSXRlbUJlZ2luJyBBTkQgW0JyYW5jaElEXSA9IEBCcmFuY2hJRA0KOw0KREVMRVRFIEZST00gQWNjb3VudHNfRW50ZXJ5IFdIRVJFIFtJRF0gSU4gKFNFTEVDVCBbQWNjb3VudHNfRW50ZXJ5SURdIEZST00gQ2xpZW50QmVnaW4pDQpERUxFVEUgRlJPTSBBY2NvdW50c19FbnRlcnkgV0hFUkUgW0lEXSBJTiAoU0VMRUNUIFtBY2NvdW50c19FbnRlcnlJRF0gRlJPTSBWZW5kb3JCZWdpbikNCkRFTEVURSBGUk9NIEFjY291bnRzX0VudGVyeSBXSEVSRSBbSURdIElOIChTRUxFQ1QgW0FjY291bnRzX0VudGVyeUlEXSBGUk9NIEJhbmtCZWdpbikNCkRFTEVURSBGUk9NIEFjY291bnRzX0VudGVyeSBXSEVSRSBbSURdIElOIChTRUxFQ1QgW0FjY291bnRzX0VudGVyeUlEXSBGUk9NIEtoYXpuYUJlZ2luKQ0KOw0KRGVjbGFyZSBAQ2xpZW50QmVnaW5QbHVzIGFzIGRlY2ltYWwgPSAoU0VMRUNUIFNVTShJU05VTEwoW0NsaWVudEJlZ2luVG90YWxdLDApKSBGUk9NIENsaWVudEJlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgQU5EIFtUeXBlVmFsdWVdID0gJ1RydWUnKTsNCklGIEBDbGllbnRCZWdpblBsdXMgPiAwDQpJTlNFUlQgSU5UTyBBY2NvdW50c19FbnRlcnkoW0FjY291bnRJRF0sW1R5cGVdLFtUeXBlRGVzY10sW1R5cGVJRF0sW1BsdXNdLFtEYXRhXSxbVGltZV0sW0JyYW5jaElEXSxbQ3VycmVuY3lJRF0sW0FjY291bnRCZWdpbl0NCilWQUxVRVMoDQooU0VMRUNUIFRPUCAoMSkgW0NsaWVudEFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIE9SREVSIEJZIFtJRF0gQVNDKSwNCidDbGllbnRCZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtDbGllbnRCZWdpblRvdGFsXSwwKSkgRlJPTSBDbGllbnRCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdUcnVlJyksDQpGT1JNQVQoQERhdGVUaW1lQSwgJ3l5eXkvTU0vZGQnKSxGT1JNQVQoR0VUREFURSgpLCAnaGg6bW06c3MgdHQnKSxAQnJhbmNoSUQsDQpARGVmYWx1dGVDdXJyZW5jeSwnQWNjb3VudEJlZ2luJykNCjsNCkRlY2xhcmUgQENsaWVudEJlZ2luTWlucyBhcyBkZWNpbWFsID0gKFNFTEVDVCBTVU0oSVNOVUxMKFtDbGllbnRCZWdpblRvdGFsXSwwKSkgRlJPTSBDbGllbnRCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdGYWxzZScpOw0KSUYgQENsaWVudEJlZ2luTWlucyA+IDANCklOU0VSVCBJTlRPIEFjY291bnRzX0VudGVyeShbQWNjb3VudElEXSxbVHlwZV0sW1R5cGVEZXNjXSxbVHlwZUlEXSxbTWluc10sW0RhdGFdLFtUaW1lXSxbQnJhbmNoSURdLFtDdXJyZW5jeUlEXSxbQWNjb3VudEJlZ2luXQ0KKVZBTFVFUygNCihTRUxFQ1QgVE9QICgxKSBbQ2xpZW50QWNjb3VudF0gRlJPTSBCcmFuY2hBY2NvdW50IFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgT1JERVIgQlkgW0lEXSBBU0MpLA0KJ0NsaWVudEJlZ2luJywnJiMxNTg1OyYjMTU4OTsmIzE2MTA7JiMxNTgzOyAmIzE1NzE7JiMxNjA4OyYjMTYwNDsgJiMxNjA1OyYjMTU4MzsmIzE1Nzc7JywnMCcsDQooU0VMRUNUIFNVTShJU05VTEwoW0NsaWVudEJlZ2luVG90YWxdLDApKSBGUk9NIENsaWVudEJlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgQU5EIFtUeXBlVmFsdWVdID0gJ0ZhbHNlJyksDQpGT1JNQVQoQERhdGVUaW1lQSwgJ3l5eXkvTU0vZGQnKSxGT1JNQVQoR0VUREFURSgpLCAnaGg6bW06c3MgdHQnKSxAQnJhbmNoSUQsDQpARGVmYWx1dGVDdXJyZW5jeSwnQWNjb3VudEJlZ2luJykNCjsNCkRlY2xhcmUgQFZlbmRvckJlZ2luUGx1cyBhcyBkZWNpbWFsID0gKFNFTEVDVCBTVU0oSVNOVUxMKFtWZW5kb3JCZWdpblRvdGFsXSwwKSkgRlJPTSBWZW5kb3JCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdUcnVlJyk7DQpJRiBAVmVuZG9yQmVnaW5QbHVzID4gMA0KSU5TRVJUIElOVE8gQWNjb3VudHNfRW50ZXJ5KFtBY2NvdW50SURdLFtUeXBlXSxbVHlwZURlc2NdLFtUeXBlSURdLFtQbHVzXSxbRGF0YV0sW1RpbWVdLFtCcmFuY2hJRF0sW0N1cnJlbmN5SURdLFtBY2NvdW50QmVnaW5dDQopVkFMVUVTKA0KKFNFTEVDVCBUT1AgKDEpIFtWZW5kb3JBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBPUkRFUiBCWSBbSURdIEFTQyksDQonVmVuZG9yQmVnaW4nLCcmIzE1ODU7JiMxNTg5OyYjMTYxMDsmIzE1ODM7ICYjMTU3MTsmIzE2MDg7JiMxNjA0OyAmIzE2MDU7JiMxNTgzOyYjMTU3NzsnLCcwJywNCihTRUxFQ1QgU1VNKElTTlVMTChbVmVuZG9yQmVnaW5Ub3RhbF0sMCkpIEZST00gVmVuZG9yQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBBTkQgW1R5cGVWYWx1ZV0gPSAnVHJ1ZScpLA0KRk9STUFUKEBEYXRlVGltZUEsICd5eXl5L01NL2RkJyksRk9STUFUKEdFVERBVEUoKSwgJ2hoOm1tOnNzIHR0JyksQEJyYW5jaElELA0KQERlZmFsdXRlQ3VycmVuY3ksJ0FjY291bnRCZWdpbicpDQo7DQpEZWNsYXJlIEBWZW5kb3JCZWdpbk1pbnMgYXMgZGVjaW1hbCA9IChTRUxFQ1QgU1VNKElTTlVMTChbVmVuZG9yQmVnaW5Ub3RhbF0sMCkpIEZST00gVmVuZG9yQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBBTkQgW1R5cGVWYWx1ZV0gPSAnRmFsc2UnKTsNCklGIEBWZW5kb3JCZWdpbk1pbnMgPiAwDQpJTlNFUlQgSU5UTyBBY2NvdW50c19FbnRlcnkoW0FjY291bnRJRF0sW1R5cGVdLFtUeXBlRGVzY10sW1R5cGVJRF0sW01pbnNdLFtEYXRhXSxbVGltZV0sW0JyYW5jaElEXSxbQ3VycmVuY3lJRF0sW0FjY291bnRCZWdpbl0NCilWQUxVRVMoDQooU0VMRUNUIFRPUCAoMSkgW1ZlbmRvckFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIE9SREVSIEJZIFtJRF0gQVNDKSwNCidWZW5kb3JCZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtWZW5kb3JCZWdpblRvdGFsXSwwKSkgRlJPTSBWZW5kb3JCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdGYWxzZScpLA0KRk9STUFUKEBEYXRlVGltZUEsICd5eXl5L01NL2RkJyksRk9STUFUKEdFVERBVEUoKSwgJ2hoOm1tOnNzIHR0JyksQEJyYW5jaElELA0KQERlZmFsdXRlQ3VycmVuY3ksJ0FjY291bnRCZWdpbicpDQo7DQpEZWNsYXJlIEBDb250cmFjdG9yc0JlZ2luUGx1cyBhcyBkZWNpbWFsID0gKFNFTEVDVCBTVU0oSVNOVUxMKFtWZW5kb3JCZWdpblRvdGFsXSwwKSkgRlJPTSBDb250cmFjdG9yc0JlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgQU5EIFtUeXBlVmFsdWVdID0gJ1RydWUnKTsNCklGIEBDb250cmFjdG9yc0JlZ2luUGx1cyA+IDANCklOU0VSVCBJTlRPIEFjY291bnRzX0VudGVyeShbQWNjb3VudElEXSxbVHlwZV0sW1R5cGVEZXNjXSxbVHlwZUlEXSxbUGx1c10sW0RhdGFdLFtUaW1lXSxbQnJhbmNoSURdLFtDdXJyZW5jeUlEXSxbQWNjb3VudEJlZ2luXQ0KKVZBTFVFUygNCihTRUxFQ1QgVE9QICgxKSBbQ29udHJhY3RvcnNBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBPUkRFUiBCWSBbSURdIEFTQyksDQonQ29udHJhY3RvcnNCZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtWZW5kb3JCZWdpblRvdGFsXSwwKSkgRlJPTSBDb250cmFjdG9yc0JlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgQU5EIFtUeXBlVmFsdWVdID0gJ1RydWUnKSwNCkZPUk1BVChARGF0ZVRpbWVBLCAneXl5eS9NTS9kZCcpLEZPUk1BVChHRVREQVRFKCksICdoaDptbTpzcyB0dCcpLEBCcmFuY2hJRCwNCkBEZWZhbHV0ZUN1cnJlbmN5LCdBY2NvdW50QmVnaW4nKQ0KOw0KRGVjbGFyZSBAQ29udHJhY3RvcnNCZWdpbk1pbnMgYXMgZGVjaW1hbCA9IChTRUxFQ1QgU1VNKElTTlVMTChbVmVuZG9yQmVnaW5Ub3RhbF0sMCkpIEZST00gQ29udHJhY3RvcnNCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdGYWxzZScpOw0KSUYgQENvbnRyYWN0b3JzQmVnaW5NaW5zID4gMA0KSU5TRVJUIElOVE8gQWNjb3VudHNfRW50ZXJ5KFtBY2NvdW50SURdLFtUeXBlXSxbVHlwZURlc2NdLFtUeXBlSURdLFtNaW5zXSxbRGF0YV0sW1RpbWVdLFtCcmFuY2hJRF0sW0N1cnJlbmN5SURdLFtBY2NvdW50QmVnaW5dDQopVkFMVUVTKA0KKFNFTEVDVCBUT1AgKDEpIFtDb250cmFjdG9yc0FjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIE9SREVSIEJZIFtJRF0gQVNDKSwNCidDb250cmFjdG9yc0JlZ2luJywnJiMxNTg1OyYjMTU4OTsmIzE2MTA7JiMxNTgzOyAmIzE1NzE7JiMxNjA4OyYjMTYwNDsgJiMxNjA1OyYjMTU4MzsmIzE1Nzc7JywnMCcsDQooU0VMRUNUIFNVTShJU05VTEwoW1ZlbmRvckJlZ2luVG90YWxdLDApKSBGUk9NIENvbnRyYWN0b3JzQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBBTkQgW1R5cGVWYWx1ZV0gPSAnRmFsc2UnKSwNCkZPUk1BVChARGF0ZVRpbWVBLCAneXl5eS9NTS9kZCcpLEZPUk1BVChHRVREQVRFKCksICdoaDptbTpzcyB0dCcpLEBCcmFuY2hJRCwNCkBEZWZhbHV0ZUN1cnJlbmN5LCdBY2NvdW50QmVnaW4nKQ0KOw0KRGVjbGFyZSBAQmFua0JlZ2luUGx1cyBhcyBkZWNpbWFsID0gKFNFTEVDVCBTVU0oSVNOVUxMKFtCYW5rQmVnaW5Ub3RhbF0sMCkpIEZST00gQmFua0JlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgQU5EIFtUeXBlVmFsdWVdID0gJ1RydWUnKTsNCklGIEBCYW5rQmVnaW5QbHVzID4gMA0KSU5TRVJUIElOVE8gQWNjb3VudHNfRW50ZXJ5KFtBY2NvdW50SURdLFtUeXBlXSxbVHlwZURlc2NdLFtUeXBlSURdLFtQbHVzXSxbRGF0YV0sW1RpbWVdLFtCcmFuY2hJRF0sW0N1cnJlbmN5SURdLFtBY2NvdW50QmVnaW5dDQopVkFMVUVTKA0KKFNFTEVDVCBUT1AgKDEpIFtCYW5rTW9uZXlBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBPUkRFUiBCWSBbSURdIEFTQyksDQonQmFua0JlZ2luJywnJiMxNTg1OyYjMTU4OTsmIzE2MTA7JiMxNTgzOyAmIzE1NzE7JiMxNjA4OyYjMTYwNDsgJiMxNjA1OyYjMTU4MzsmIzE1Nzc7JywnMCcsDQooU0VMRUNUIFNVTShJU05VTEwoW0JhbmtCZWdpblRvdGFsXSwwKSkgRlJPTSBCYW5rQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBBTkQgW1R5cGVWYWx1ZV0gPSAnVHJ1ZScpLA0KRk9STUFUKEBEYXRlVGltZUEsICd5eXl5L01NL2RkJyksRk9STUFUKEdFVERBVEUoKSwgJ2hoOm1tOnNzIHR0JyksQEJyYW5jaElELA0KQERlZmFsdXRlQ3VycmVuY3ksJ0FjY291bnRCZWdpbicpDQo7DQpEZWNsYXJlIEBCYW5rQmVnaW5NaW5zIGFzIGRlY2ltYWwgPSAoU0VMRUNUIFNVTShJU05VTEwoW0JhbmtCZWdpblRvdGFsXSwwKSkgRlJPTSBCYW5rQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBBTkQgW1R5cGVWYWx1ZV0gPSAnRmFsc2UnKTsNCklGIEBCYW5rQmVnaW5NaW5zID4gMA0KSU5TRVJUIElOVE8gQWNjb3VudHNfRW50ZXJ5KFtBY2NvdW50SURdLFtUeXBlXSxbVHlwZURlc2NdLFtUeXBlSURdLFtNaW5zXSxbRGF0YV0sW1RpbWVdLFtCcmFuY2hJRF0sW0N1cnJlbmN5SURdLFtBY2NvdW50QmVnaW5dDQopVkFMVUVTKA0KKFNFTEVDVCBUT1AgKDEpIFtCYW5rTW9uZXlBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBPUkRFUiBCWSBbSURdIEFTQyksDQonQmFua0JlZ2luJywnJiMxNTg1OyYjMTU4OTsmIzE2MTA7JiMxNTgzOyAmIzE1NzE7JiMxNjA4OyYjMTYwNDsgJiMxNjA1OyYjMTU4MzsmIzE1Nzc7JywnMCcsDQooU0VMRUNUIFNVTShJU05VTEwoW0JhbmtCZWdpblRvdGFsXSwwKSkgRlJPTSBCYW5rQmVnaW4gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBBTkQgW1R5cGVWYWx1ZV0gPSAnRmFsc2UnKSwNCkZPUk1BVChARGF0ZVRpbWVBLCAneXl5eS9NTS9kZCcpLEZPUk1BVChHRVREQVRFKCksICdoaDptbTpzcyB0dCcpLEBCcmFuY2hJRCwNCkBEZWZhbHV0ZUN1cnJlbmN5LCdBY2NvdW50QmVnaW4nKQ0KOw0KRGVjbGFyZSBAS2hhem5hQmVnaW5QbHVzIGFzIGRlY2ltYWwgPSAoU0VMRUNUIFNVTShJU05VTEwoW0toYXpuYUJlZ2luVG90YWxdLDApKSBGUk9NIEtoYXpuYUJlZ2luIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgQU5EIFtUeXBlVmFsdWVdID0gJ1RydWUnKTsNCklGIEBLaGF6bmFCZWdpblBsdXMgPiAwDQpJTlNFUlQgSU5UTyBBY2NvdW50c19FbnRlcnkoW0FjY291bnRJRF0sW1R5cGVdLFtUeXBlRGVzY10sW1R5cGVJRF0sW1BsdXNdLFtEYXRhXSxbVGltZV0sW0JyYW5jaElEXSxbQ3VycmVuY3lJRF0sW0FjY291bnRCZWdpbl0NCilWQUxVRVMoDQooU0VMRUNUIFRPUCAoMSkgW0toYXpuYUFjY291bnRJRF0gRlJPTSBLaGF6bmFBY2NvdW50cyBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIE9SREVSIEJZIFtJRF0gQVNDKSwNCidLaGF6bmFCZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtLaGF6bmFCZWdpblRvdGFsXSwwKSkgRlJPTSBLaGF6bmFCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdUcnVlJyksDQpGT1JNQVQoQERhdGVUaW1lQSwgJ3l5eXkvTU0vZGQnKSxGT1JNQVQoR0VUREFURSgpLCAnaGg6bW06c3MgdHQnKSxAQnJhbmNoSUQsDQpARGVmYWx1dGVDdXJyZW5jeSwnQWNjb3VudEJlZ2luJykNCjsNCkRlY2xhcmUgQEtoYXpuYUJlZ2luTWlucyBhcyBkZWNpbWFsID0gKFNFTEVDVCBTVU0oSVNOVUxMKFtLaGF6bmFCZWdpblRvdGFsXSwwKSkgRlJPTSBLaGF6bmFCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdGYWxzZScpOw0KSUYgQEJhbmtCZWdpbk1pbnMgPiAwDQpJTlNFUlQgSU5UTyBBY2NvdW50c19FbnRlcnkoW0FjY291bnRJRF0sW1R5cGVdLFtUeXBlRGVzY10sW1R5cGVJRF0sW01pbnNdLFtEYXRhXSxbVGltZV0sW0JyYW5jaElEXSxbQ3VycmVuY3lJRF0sW0FjY291bnRCZWdpbl0NCilWQUxVRVMoDQooU0VMRUNUIFRPUCAoMSkgW0toYXpuYUFjY291bnRJRF0gRlJPTSBLaGF6bmFBY2NvdW50cyBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIE9SREVSIEJZIFtJRF0gQVNDKSwNCidLaGF6bmFCZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtLaGF6bmFCZWdpblRvdGFsXSwwKSkgRlJPTSBLaGF6bmFCZWdpbiBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEIEFORCBbVHlwZVZhbHVlXSA9ICdGYWxzZScpLA0KRk9STUFUKEBEYXRlVGltZUEsICd5eXl5L01NL2RkJyksRk9STUFUKEdFVERBVEUoKSwgJ2hoOm1tOnNzIHR0JyksQEJyYW5jaElELA0KQERlZmFsdXRlQ3VycmVuY3ksJ0FjY291bnRCZWdpbicpDQo7DQpEZWNsYXJlIEBDaGVja3NJTkJlZ2luUGx1cyBhcyBkZWNpbWFsID0gKFNFTEVDVCBTVU0oSVNOVUxMKFtDaGVja3NUb3RhbFZhbHVlXSwwKSkgRlJPTSBDaGVja3NJTkJlZ2luSXRlbSBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEKTsNCklGIEBDaGVja3NJTkJlZ2luUGx1cyA+IDANCklOU0VSVCBJTlRPIEFjY291bnRzX0VudGVyeShbQWNjb3VudElEXSxbVHlwZV0sW1R5cGVEZXNjXSxbVHlwZUlEXSxbUGx1c10sW0RhdGFdLFtUaW1lXSxbQnJhbmNoSURdLFtDdXJyZW5jeUlEXSxbQWNjb3VudEJlZ2luXQ0KKVZBTFVFUygNCihTRUxFQ1QgVE9QICgxKSBbS2hhem5hQ2hlY2tzSU5BY2NvdW50SURdIEZST00gS2hhem5hQWNjb3VudHMgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBPUkRFUiBCWSBbSURdIEFTQyksDQonQ2hlY2tzSU5CZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtDaGVja3NUb3RhbFZhbHVlXSwwKSkgRlJPTSBDaGVja3NJTkJlZ2luSXRlbSBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEKSwNCkZPUk1BVChARGF0ZVRpbWVBLCAneXl5eS9NTS9kZCcpLEZPUk1BVChHRVREQVRFKCksICdoaDptbTpzcyB0dCcpLEBCcmFuY2hJRCwNCkBEZWZhbHV0ZUN1cnJlbmN5LCdBY2NvdW50QmVnaW4nKQ0KOw0KRGVjbGFyZSBAQ2hlY2tzT3V0QmVnaW5QbHVzIGFzIGRlY2ltYWwgPSAoU0VMRUNUIFNVTShJU05VTEwoW0NoZWNrc1RvdGFsVmFsdWVdLDApKSBGUk9NIENoZWNrT3V0QmVnaW5JdGVtIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQpOw0KSUYgQENoZWNrc091dEJlZ2luUGx1cyA+IDANCklOU0VSVCBJTlRPIEFjY291bnRzX0VudGVyeShbQWNjb3VudElEXSxbVHlwZV0sW1R5cGVEZXNjXSxbVHlwZUlEXSxbTWluc10sW0RhdGFdLFtUaW1lXSxbQnJhbmNoSURdLFtDdXJyZW5jeUlEXSxbQWNjb3VudEJlZ2luXQ0KKVZBTFVFUygNCihTRUxFQ1QgVE9QICgxKSBbQ2hlY2tPdXRBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCBPUkRFUiBCWSBbSURdIEFTQyksDQonQ2hlY2tzT3V0QmVnaW4nLCcmIzE1ODU7JiMxNTg5OyYjMTYxMDsmIzE1ODM7ICYjMTU3MTsmIzE2MDg7JiMxNjA0OyAmIzE2MDU7JiMxNTgzOyYjMTU3NzsnLCcwJywNCihTRUxFQ1QgU1VNKElTTlVMTChbQ2hlY2tzVG90YWxWYWx1ZV0sMCkpIEZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCksDQpGT1JNQVQoQERhdGVUaW1lQSwgJ3l5eXkvTU0vZGQnKSxGT1JNQVQoR0VUREFURSgpLCAnaGg6bW06c3MgdHQnKSxAQnJhbmNoSUQsDQpARGVmYWx1dGVDdXJyZW5jeSwnQWNjb3VudEJlZ2luJykNCjsNCkRlY2xhcmUgQEl0ZW1CZWdpblBsdXMgYXMgZGVjaW1hbCA9IChTRUxFQ1QgU1VNKElTTlVMTChbUHJpY2VfQmF5VG90YWxdLDApKSBGUk9NIEJlZ2luX0l0ZW1zIFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQpOw0KSUYgQEl0ZW1CZWdpblBsdXMgPiAwDQpJTlNFUlQgSU5UTyBBY2NvdW50c19FbnRlcnkoW0FjY291bnRJRF0sW1R5cGVdLFtUeXBlRGVzY10sW1R5cGVJRF0sW1BsdXNdLFtEYXRhXSxbVGltZV0sW0JyYW5jaElEXSxbQ3VycmVuY3lJRF0sW0FjY291bnRCZWdpbl0NCilWQUxVRVMoDQooU0VMRUNUIFRPUCAoMSkgW1N0b3JlQWNjb3VudF0gRlJPTSBCcmFuY2hBY2NvdW50IFdIRVJFIFtCcmFuY2hJRF0gPSBAQnJhbmNoSUQgT1JERVIgQlkgW0lEXSBBU0MpLA0KJ0l0ZW1CZWdpbicsJyYjMTU4NTsmIzE1ODk7JiMxNjEwOyYjMTU4MzsgJiMxNTcxOyYjMTYwODsmIzE2MDQ7ICYjMTYwNTsmIzE1ODM7JiMxNTc3OycsJzAnLA0KKFNFTEVDVCBTVU0oSVNOVUxMKFtQcmljZV9CYXlUb3RhbF0sMCkpIEZST00gQmVnaW5fSXRlbXMgV0hFUkUgW0JyYW5jaElEXSA9IEBCcmFuY2hJRCksDQpGT1JNQVQoQERhdGVUaW1lQSwgJ3l5eXkvTU0vZGQnKSxGT1JNQVQoR0VUREFURSgpLCAnaGg6bW06c3MgdHQnKSxAQnJhbmNoSUQsDQpARGVmYWx1dGVDdXJyZW5jeSwnQWNjb3VudEJlZ2luJykiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTYsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1NhdmVDb21wYW55SW5mbycpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQWNjb3VudENvZGUnXSkpICRBY2NvdW50Q29kZSA9IHBlc3RpY2lkZSgkX0dFVFsnQWNjb3VudENvZGUnXSk7DQoNCiAgICAkc3FsID0gIlNFTEVDVCBbSURdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtBY2NvdW50Q29kZVZhbHVlXSA9ICciLiRBY2NvdW50Q29kZS4iJyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xNiwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcmIzE2MDM7JiMxNjA4OyYjMTU4MzsgJiMxNTc1OyYjMTYwNDsmIzE1ODE7JiMxNTg3OyYjMTU3NTsmIzE1NzY7ICYjMTU5NDsmIzE2MTA7JiMxNTg1OyAmIzE1ODk7JiMxNTgxOyYjMTYxMDsmIzE1ODE7JzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjE2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEl0ZW1CZWdpbklEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJRFZdICsgMSBBUyBbSURWXSBGUk9NIEJlZ1N0b3JlIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIE9SREVSIEJZIFtJRFZdIERFU0MpLDEpIEFTIElEViI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnQ2hlY2tJdGVtSGF2ZUJlZ2luU3RvcmUnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ1N0b3JlSUQnXSkpICRTdG9yZUlEID0gcGVzdGljaWRlKCRfR0VUWydTdG9yZUlEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJdGVtSUQnXSkpICRJdGVtSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0l0ZW1JRCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnVWludHNJRCddKSkgJFVpbnRzSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1VpbnRzSUQnXSk7DQoNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIENBU1QoJ1RydWUnIEFTIGJpdCkgQVMgc3RhdHVzIEZST00gQmVnaW5fSXRlbXMgV0hFUkUgW0l0ZW1JRF0gPSAnIi4kSXRlbUlELiInIEFORCBbU3RvcmVJRF0gPSAnIi4kU3RvcmVJRC4iJyksQ0FTVCgnRmFsc2UnIEFTIGJpdCkpIEFTIHN0YXR1cyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xNiwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SXRlbVZhbHVlQmVnaW4nKSB7DQogICAgJHNxbDEgPSAiDQpTRUxFQ1QgKiwNCihDQVNFIFdIRU4gJyIgLiAkQ2xvdGhpbmdWYWx1ZSAuICInID0gJ1RydWUnIFRIRU4NCihTRUxFQ1QgVE9QICgxKSBJU05VTEwoU1MuW0Nvc3RQcmljZU9uZV0sMCkgRlJPTSBJdGVtIFNTIFdIRVJFIFNTLltJVGVtQ29kZV0gPSBJdGVtLltIYXZlRmF0aGVyXSkgRUxTRSBJU05VTEwoW0Nvc3RQcmljZU9uZV0sMClFTkQpIEFTIENvc3RQcmljZU9uZVMNCkZST00gSXRlbSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzMnIEFORCBbSXRlbV9TdGF0dXNdID0gJ1RydWUnIEFORCBbSVNfU3RvcmVdID0gJ1RydWUnIE9SREVSIEJZIFtJVGVtQ29kZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yMywkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjMpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SXRlbVZhbHVlTm90SU5CZWdpbicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnU3RvcmVJRCddKSkgJFN0b3JlSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ1N0b3JlSUQnXSk7DQogICAgJHNxbDEgPSAiDQpTRUxFQ1QgKiwNCihDQVNFIFdIRU4gJyIgLiAkQ2xvdGhpbmdWYWx1ZSAuICInID0gJ1RydWUnIFRIRU4NCihTRUxFQ1QgVE9QICgxKSBJU05VTEwoU1MuW0Nvc3RQcmljZU9uZV0sMCkgRlJPTSBJdGVtIFNTIFdIRVJFIFNTLltJVGVtQ29kZV0gPSBJdGVtLltIYXZlRmF0aGVyXSkgRUxTRSBJU05VTEwoW0Nvc3RQcmljZU9uZV0sMClFTkQpIEFTIENvc3RQcmljZU9uZVMNCkZST00gSXRlbSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzMnIEFORCBbSXRlbV9TdGF0dXNdID0gJ1RydWUnIEFORCBbSVNfU3RvcmVdID0gJ1RydWUnDQpBTkQgW0lEXSBOT1QgSU4gKFNFTEVDVCBbSXRlbUlEXSBGUk9NIEJlZ2luX0l0ZW1zIFdIRVJFIFtTdG9yZUlEXSA9ICciIC4gJFN0b3JlSUQgLiAiJykNCk9SREVSIEJZIFtJVGVtQ29kZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yMywkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjMpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SXRlbUNUVmFsdWVOb3RJTkJlZ2luJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydTdG9yZUlEJ10pKSAkU3RvcmVJRCA9IHBlc3RpY2lkZSgkX0dFVFsnU3RvcmVJRCddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnSVRlbUNvZGUwMDEnXSkpICRJVGVtQ29kZTAwMSA9IHBlc3RpY2lkZSgkX0dFVFsnSVRlbUNvZGUwMDEnXSk7DQogICAgJHNxbDEgPSAiDQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9ICciIC4gJElUZW1Db2RlMDAxIC4gIic7DQpXSVRIIFJFVCBBUyhTRUxFQ1QgKiBGUk9NIEl0ZW0gUiBXSEVSRSBJRCA9IEBJRCBVTklPTiBBTEwgU0VMRUNUIFQuKiBGUk9NIEl0ZW0gVCBJTk5FUiBKT0lOIFJFVCBHIE9OIFQuSGF2ZUZhdGhlciA9IEcuSVRlbUNvZGUpDQpTRUxFQ1QgKiwNCihDQVNFIFdIRU4gJyIgLiAkQ2xvdGhpbmdWYWx1ZSAuICInID0gJ1RydWUnIFRIRU4NCihTRUxFQ1QgVE9QICgxKSBJU05VTEwoU1MuW0Nvc3RQcmljZU9uZV0sMCkgRlJPTSBJdGVtIFNTIFdIRVJFIFNTLltJVGVtQ29kZV0gPSBJdGVtLltIYXZlRmF0aGVyXSkgRUxTRSBJU05VTEwoW0Nvc3RQcmljZU9uZV0sMClFTkQpIEFTIENvc3RQcmljZU9uZVMNCkZST00gSXRlbSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzMnIEFORCBbSXRlbV9TdGF0dXNdID0gJ1RydWUnIEFORCBbSVNfU3RvcmVdID0gJ1RydWUnDQpBTkQgSXRlbS5bSURdIE5PVCBJTiAoU0VMRUNUIFtJdGVtSURdIEZST00gQmVnaW5fSXRlbXMgV0hFUkUgW1N0b3JlSURdID0gJyIgLiAkU3RvcmVJRCAuICInKQ0KQU5EIEl0ZW0uW0lEXSBJTiAoU0VMRUNUIFtJRF0gRlJPTSBSRVQpDQpPUkRFUiBCWSBbSVRlbUNvZGVdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjMsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjIzKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0NoZWNrVXNlckxldmFsJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydDb2x1bW4nXSkpICRDb2x1bW4gPSBzdHJ2YWwocGVzdGljaWRlKCRfR0VUWydDb2x1bW4nXSkpOw0KICAgIA0KICAgICRzcWw1NTAgPSAiDQpTRUxFQ1QNCkNBU1QoIi4kQ29sdW1uLiIgQVMgYml0KSBBUyBWYWx1ZQ0KRlJPTSBVc2VyTGV2YWwgV0hFUkUgW0lEXSA9ICciIC4gJE5ld1VzZXJMZXZhbCAuICInIjsNCi8vZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KCcgLiAkc3FsNTUwLiAnKTsgIDwvc2NyaXB0Pic7DQogICAgJEl0ZW1TdHJpbmdBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNTAsJHNxbDU1MCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2hUVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZ0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0QUEgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmdBKSkgew0KICAgICRyZXN1bHRBQVtdID0gJGZldGNoVFQ7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoVFQpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmdBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xNik7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdDaGVja0lOQmVnaW5JRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBDaGVja3NJTkJlZ2luTiBXSEVSRSBbQnJhbmNoSURdID0gJyIgLiAkTmV3QnJhbmNoSUQgLiAiJyBPUkRFUiBCWSBbSURWXSBERVNDKSwxKSBBUyBJRFYiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudEJhbmtJRCcpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIENoZWNrc0JhbmsgT1JERVIgQlkgW0lEVl0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yMywkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjMpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0QWNjb3VudFR5cGUnKSB7DQogICAgJFNRTFN0cmluZyA9ICcnOw0KICAgIGlmICgkQ29udHJhY3RvcnNWYWx1ZSA9PSB0cnVlKXsNCiAgICAgICAgJFNRTFN0cmluZyA9ICcnOw0KICAgIH1lbHNlew0KICAgICAgICAkU1FMU3RyaW5nID0gJyBXSEVSRSBbSURdICE9IDMnOw0KICAgIH0NCg0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQ2hlY2tJTlR5cGUgIi4kU1FMU3RyaW5nLiIgT1JERVIgQlkgW0lEXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjIzLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yMyk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDb250cmFjdG9yc05hbWUnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBDb250cmFjdG9ycyBXSEVSRSBbVmFuZG9yU3RhdHVzXSA9ICdUcnVlJyBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uNCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdDaGVja0lmQ2hlY2tzRHVwbGljYXRlZCcpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQ2hlY2tDb2RlJ10pKSAkQ2hlY2tDb2RlID0gcGVzdGljaWRlKCRfR0VUWydDaGVja0NvZGUnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0xpbmVJRCddKSkgJExpbmVJRCA9IHBlc3RpY2lkZSgkX0dFVFsnTGluZUlEJ10pOw0KDQogICAgJHNxbCA9ICINCkRlY2xhcmUgQExpbmVJRCBhcyBpbnQgPSAnIiAuIGludHZhbCgkTGluZUlEKSAuICInOw0KRGVjbGFyZSBAQ2hlY2tDb2RlIGFzIG52YXJjaGFyKG1heCkgPSAnIiAuICgkQ2hlY2tDb2RlKSAuICInOw0KREVjbGFyZSBAc3RhdHVzIEFTIG52YXJjaGFyKG1heCkgPSAndHJ1ZXMnOw0KDQpJRiBATGluZUlEID0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gQ2hlY2tzSU5CZWdpbkl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnRHVwbGljYXRlZCc7DQpFTkQgRUxTRSBJRiBOT1QgRXhpc3RzKFNFTEVDVCAqIEZST00gQ2hlY2tzSU5CZWdpbkl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZXMnIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja3NJTkl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnRHVwbGljYXRlZCc7DQpFTkQgRUxTRSBJRiBOT1QgRXhpc3RzKFNFTEVDVCAqIEZST00gQ2hlY2tzSU5JdGVtIFdIRVJFIFtDaGVja3NDb2RlVmFsdWVdID0gQENoZWNrQ29kZSkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ3RydWVzJzsNCkVORA0KRU5EDQpFTkQgRUxTRSBJRiBATGluZUlEICE9IDAgQkVHSU4NCg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gQ2hlY2tzSU5CZWdpbkl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlIEFORCBbSURdICE9IEBMaW5lSUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdEdXBsaWNhdGVkJzsNCkVORCBFTFNFIElGIE5PVCBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja3NJTkJlZ2luSXRlbSBXSEVSRSBbQ2hlY2tzQ29kZVZhbHVlXSA9IEBDaGVja0NvZGUgQU5EIFtJRF0gIT0gQExpbmVJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ3RydWVzJzsNCkVORA0KDQpJRiBAc3RhdHVzID0gJ3RydWVzJyBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gQ2hlY2tzSU5JdGVtIFdIRVJFIFtDaGVja3NDb2RlVmFsdWVdID0gQENoZWNrQ29kZSBBTkQgW0lEXSAhPSBATGluZUlEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnRHVwbGljYXRlZCc7DQpFTkQgRUxTRSBJRiBOT1QgRXhpc3RzKFNFTEVDVCAqIEZST00gQ2hlY2tzSU5JdGVtIFdIRVJFIFtDaGVja3NDb2RlVmFsdWVdID0gQENoZWNrQ29kZSBBTkQgW0lEXSAhPSBATGluZUlEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQpFTkQNCg0KRU5EDQpTRUxFQ1QgQHN0YXR1cyBBUyBzdGF0dXMiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0NoZWNrT3V0QmVnaW5JRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBDaGVja091dEJlZ2luTiBXSEVSRSBbQnJhbmNoSURdID0gJyIgLiAkTmV3QnJhbmNoSUQgLiAiJyBPUkRFUiBCWSBbSURWXSBERVNDKSwxKSBBUyBJRFYiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRUeXBlQScpIHsNCiAgICAkU1FMU3RyaW5nID0gJyc7DQogICAgaWYgKCRDb250cmFjdG9yc1ZhbHVlID09IHRydWUpew0KICAgICAgICAkU1FMU3RyaW5nID0gJyc7DQogICAgfWVsc2V7DQogICAgICAgICRTUUxTdHJpbmcgPSAnIFdIRVJFIFtJRF0gIT0gMyc7DQogICAgfQ0KDQogICAgJHNxbDEgPSAiDQpTRVQgTk9DT1VOVCBPTiANCklGIE9CSkVDVF9JRCgndGVtcGRiLi4jSW52b2ljZVRFTVAnKSBJUyBOT1QgTlVMTCBEUk9QIFRhYmxlICNJbnZvaWNlVEVNUDsNClNFTEVDVCANCihDQVNFIFdIRU4gW0lEXSA9IDEgVEhFTiAyDQpXSEVOIFtJRF0gPSAyIFRIRU4gMQ0KV0hFTiBbSURdID0gMyBUSEVOIDMNCldIRU4gW0lEXSA9IDQgVEhFTiA0IEVORCkgQVMgU29ydCwqDQpJTlRPICNJbnZvaWNlVEVNUCBGUk9NIENoZWNrSU5UeXBlIA0KU0VMRUNUICogRlJPTSAjSW52b2ljZVRFTVAgIi4kU1FMU3RyaW5nLiIgT1JERVIgQlkgW1NvcnRdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjMsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjIzKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0NoZWNrSWZDaGVja3NPdXREdXBsaWNhdGVkJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydDaGVja0NvZGUnXSkpICRDaGVja0NvZGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0NoZWNrQ29kZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnTGluZUlEJ10pKSAkTGluZUlEID0gcGVzdGljaWRlKCRfR0VUWydMaW5lSUQnXSk7DQoNCiAgICAkc3FsID0gIg0KRGVjbGFyZSBATGluZUlEIGFzIGludCA9ICciIC4gaW50dmFsKCRMaW5lSUQpIC4gIic7DQpEZWNsYXJlIEBDaGVja0NvZGUgYXMgbnZhcmNoYXIobWF4KSA9ICciIC4gKCRDaGVja0NvZGUpIC4gIic7DQpERWNsYXJlIEBzdGF0dXMgQVMgbnZhcmNoYXIobWF4KSA9ICd0cnVlcyc7DQoNCklGIEBMaW5lSUQgPSAwIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja091dEJlZ2luSXRlbSBXSEVSRSBbQ2hlY2tzQ29kZVZhbHVlXSA9IEBDaGVja0NvZGUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdEdXBsaWNhdGVkJzsNCkVORCBFTFNFIElGIE5PVCBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja091dEJlZ2luSXRlbSBXSEVSRSBbQ2hlY2tzQ29kZVZhbHVlXSA9IEBDaGVja0NvZGUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICd0cnVlcyc7DQpFTkQNCg0KSUYgQHN0YXR1cyA9ICd0cnVlcycgQkVHSU4NCklGIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIENoZWNrT3V0SXRlbSBXSEVSRSBbQ2hlY2tzQ29kZVZhbHVlXSA9IEBDaGVja0NvZGUpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdEdXBsaWNhdGVkJzsNCkVORCBFTFNFIElGIE5PVCBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja091dEl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQpFTkQNCkVORCBFTFNFIElGIEBMaW5lSUQgIT0gMCBCRUdJTg0KDQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja091dEJlZ2luSXRlbSBXSEVSRSBbQ2hlY2tzQ29kZVZhbHVlXSA9IEBDaGVja0NvZGUgQU5EIFtJRF0gIT0gQExpbmVJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ0R1cGxpY2F0ZWQnOw0KRU5EIEVMU0UgSUYgTk9UIEV4aXN0cyhTRUxFQ1QgKiBGUk9NIENoZWNrT3V0QmVnaW5JdGVtIFdIRVJFIFtDaGVja3NDb2RlVmFsdWVdID0gQENoZWNrQ29kZSBBTkQgW0lEXSAhPSBATGluZUlEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAndHJ1ZXMnOw0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZXMnIEJFR0lODQpJRiBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja091dEl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlIEFORCBbSURdICE9IEBMaW5lSUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICdEdXBsaWNhdGVkJzsNCkVORCBFTFNFIElGIE5PVCBFeGlzdHMoU0VMRUNUICogRlJPTSBDaGVja091dEl0ZW0gV0hFUkUgW0NoZWNrc0NvZGVWYWx1ZV0gPSBAQ2hlY2tDb2RlIEFORCBbSURdICE9IEBMaW5lSUQpIEJFR0lODQpTRVQgQHN0YXR1cyA9ICd0cnVlcyc7DQpFTkQNCkVORA0KDQpFTkQNClNFTEVDVCBAc3RhdHVzIEFTIHN0YXR1cyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0TWFuZG9iSURWJykgew0KICAgICRzcWwgPSAiU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0lEVl0gKyAxIEFTIFtJRFZdIEZST00gTWFuZG9iIE9SREVSIEJZIFtJRFZdIERFU0MpLDEpIEFTIElEViI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SXRlbUJhbmRlbElEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCAnMDAwMCcgKyBDQVNUKCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJVGVtQ29kZV0gKyAxIEFTIFtJVGVtQ29kZV0gRlJPTSBJdGVtQmFuZGVsIE9SREVSIEJZIFtJVGVtQ29kZV0gREVTQyksQ0FTVCgnMTAwMDAxJyBBUyBWYXJjaGFyKG1heCkpKSBBUyBWYXJjaGFyKG1heCkpIEFTIElUZW1Db2RlIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRCcmFuY2hJRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBCcmFuY2ggT1JERVIgQlkgW0lEVl0gREVTQyksMSkgQVMgSURWIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRLaGF6bmFJRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBLaGF6bmEgT1JERVIgQlkgW0lEVl0gREVTQyksMSkgQVMgSURWIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRTdG9yZUlEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJRFZdICsgMSBBUyBbSURWXSBGUk9NIFN0b3JlcyBPUkRFUiBCWSBbSURWXSBERVNDKSwxKSBBUyBJRFYiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEN1cnJlbmN5SURWJykgew0KICAgICRzcWwgPSAiU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0lEVl0gKyAxIEFTIFtJRFZdIEZST00gQ3VycmVuY3kgT1JERVIgQlkgW0lEVl0gREVTQyksMSkgQVMgSURWIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDb3N0Q2VudGVyRmF0aGVyTmFtZXMnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBDb3N0Q2VudGVyIFdIRVJFIFtBY2NvdW50VHlwZV0gIT0gJzMnIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q29zdElEVicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQWNjb3VudHNUeXBlVmFsdWUnXSkpICRBY2NvdW50c1R5cGVWYWx1ZSA9IHBlc3RpY2lkZSgkX0dFVFsnQWNjb3VudHNUeXBlVmFsdWUnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0ZpcnN0Q2F0Z29yeVZhbHVlJ10pKSAkRmlyc3RDYXRnb3J5VmFsdWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0ZpcnN0Q2F0Z29yeVZhbHVlJ10pOw0KDQogICAgJHNxbCA9ICINCkRlY2xhcmUgQEFjY291bnRUeXBlSUQgYXMgaW50ID0gJyIuJEFjY291bnRzVHlwZVZhbHVlLiInOyANCkRlY2xhcmUgQEFjY291bnRJRCBhcyBpbnQgPSAnIi4kRmlyc3RDYXRnb3J5VmFsdWUuIic7IA0KDQpTRUxFQ1QgDQooQ0FTRQ0KV0hFTiBAQWNjb3VudFR5cGVJRCA9IDEgVEhFTiAnMDAnICsgQ0FTVCgoU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQ29zdENlbnRlciBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbQWNjb3VudENvZGVWYWx1ZV0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLCcwMDEnKSkgQVMgdmFyY2hhcihtYXgpKQ0KV0hFTiBAQWNjb3VudFR5cGVJRCAhPSAxIFRIRU4gJzAwJyArDQoNCkNBU1QoDQooU0VMRUNUIElTTlVMTCgNCihTRUxFQ1QgVE9QICgxKSBbQWNjb3VudENvZGVWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBDb3N0Q2VudGVyIFdIRVJFIFtIYXZlRmF0aGVyXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLA0KQ0FTVCgoU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgJzAwMScgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIENvc3RDZW50ZXIgV0hFUkUgW0lEXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLCcwMDEnKSApIEFTIHZhcmNoYXIobWF4KSkNCikpIEFTIHZhcmNoYXIobWF4KSkNCkVORCkgQVMgQWNjb3VudElELA0KDQooQ0FTRQ0KV0hFTiBAQWNjb3VudFR5cGVJRCA9IDEgVEhFTiAoU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRMZXZhbFZhbHVlXSArIDEgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIENvc3RDZW50ZXIgV0hFUkUgW0FjY291bnRUeXBlXSA9ICcxJyBBTkQgW0FjY291bnRDb2RlVmFsdWVdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtJRF0gREVTQyksJzEnKSkNCldIRU4gQEFjY291bnRUeXBlSUQgIT0gMSBUSEVOIChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQ29zdENlbnRlciBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtJRF0gREVTQyksDQoNCihTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQ29zdENlbnRlciBXSEVSRSBbSURdID0gQEFjY291bnRJRCBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gREVTQyksMSkpDQopKQ0KRU5EKSBBUyBBY2NvdW50TGV2YWwiOw0KLy9lY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+YWxlcnQoJyAuICRzcWwgLiAnKTsgIDwvc2NyaXB0Pic7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q29zdENlbnRlck5hbWVzJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQ29zdENlbnRlciBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldENsaWVudEdyb3VwSURWJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydBY2NvdW50c1R5cGVWYWx1ZSddKSkgJEFjY291bnRzVHlwZVZhbHVlID0gcGVzdGljaWRlKCRfR0VUWydBY2NvdW50c1R5cGVWYWx1ZSddKTsNCiAgICBpZihpc3NldCgkX0dFVFsnRmlyc3RDYXRnb3J5VmFsdWUnXSkpICRGaXJzdENhdGdvcnlWYWx1ZSA9IHBlc3RpY2lkZSgkX0dFVFsnRmlyc3RDYXRnb3J5VmFsdWUnXSk7DQoNCiAgICAkc3FsID0gIg0KRGVjbGFyZSBAQWNjb3VudFR5cGVJRCBhcyBpbnQgPSAnIi4kQWNjb3VudHNUeXBlVmFsdWUuIic7IA0KRGVjbGFyZSBAQWNjb3VudElEIGFzIGludCA9ICciLiRGaXJzdENhdGdvcnlWYWx1ZS4iJzsgDQoNClNFTEVDVCANCihDQVNFDQpXSEVOIEBBY2NvdW50VHlwZUlEID0gMSBUSEVOICcwMCcgKyBDQVNUKChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudENvZGVWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBDbGllbnRDYXRlZ29yeSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbQWNjb3VudENvZGVWYWx1ZV0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLCcwMDEnKSkgQVMgdmFyY2hhcihtYXgpKQ0KV0hFTiBAQWNjb3VudFR5cGVJRCAhPSAxIFRIRU4gJzAwJyArDQoNCkNBU1QoDQooU0VMRUNUIElTTlVMTCgNCihTRUxFQ1QgVE9QICgxKSBbQWNjb3VudENvZGVWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBDbGllbnRDYXRlZ29yeSBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwNCkNBU1QoKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50Q29kZVZhbHVlXSArICcwMDEnIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBDbGllbnRDYXRlZ29yeSBXSEVSRSBbSURdID0gQEFjY291bnRJRCBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gREVTQyksJzAwMScpICkgQVMgdmFyY2hhcihtYXgpKQ0KKSkgQVMgdmFyY2hhcihtYXgpKQ0KRU5EKSBBUyBBY2NvdW50SUQsDQoNCihDQVNFDQpXSEVOIEBBY2NvdW50VHlwZUlEID0gMSBUSEVOIChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQ2xpZW50Q2F0ZWdvcnkgV0hFUkUgW0FjY291bnRUeXBlXSA9ICcxJyBBTkQgW0FjY291bnRDb2RlVmFsdWVdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtJRF0gREVTQyksJzEnKSkNCldIRU4gQEFjY291bnRUeXBlSUQgIT0gMSBUSEVOIChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQ2xpZW50Q2F0ZWdvcnkgV0hFUkUgW0hhdmVGYXRoZXJdID0gQEFjY291bnRJRCBPUkRFUiBCWSBbSURdIERFU0MpLA0KDQooU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRMZXZhbFZhbHVlXSArIDEgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIENsaWVudENhdGVnb3J5IFdIRVJFIFtJRF0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwxKSkNCikpDQpFTkQpIEFTIEFjY291bnRMZXZhbCI7DQovL2VjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5hbGVydCgnIC4gJHNxbCAuICcpOyAgPC9zY3JpcHQ+JzsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRDbGllbnRDYXRlZ29yeUZhdGhlck5hbWVzJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQ2xpZW50Q2F0ZWdvcnkgV0hFUkUgW0FjY291bnRUeXBlXSAhPSAnMycgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uNCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRWZW5kb3JHcm91cElEVicpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQWNjb3VudHNUeXBlVmFsdWUnXSkpICRBY2NvdW50c1R5cGVWYWx1ZSA9IHBlc3RpY2lkZSgkX0dFVFsnQWNjb3VudHNUeXBlVmFsdWUnXSk7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0ZpcnN0Q2F0Z29yeVZhbHVlJ10pKSAkRmlyc3RDYXRnb3J5VmFsdWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0ZpcnN0Q2F0Z29yeVZhbHVlJ10pOw0KDQogICAgJHNxbCA9ICINCkRlY2xhcmUgQEFjY291bnRUeXBlSUQgYXMgaW50ID0gJyIuJEFjY291bnRzVHlwZVZhbHVlLiInOyANCkRlY2xhcmUgQEFjY291bnRJRCBhcyBpbnQgPSAnIi4kRmlyc3RDYXRnb3J5VmFsdWUuIic7IA0KDQpTRUxFQ1QgDQooQ0FTRQ0KV0hFTiBAQWNjb3VudFR5cGVJRCA9IDEgVEhFTiAnMDAnICsgQ0FTVCgoU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gVmFuZG9yQ2F0ZWdvcnkgV0hFUkUgW0FjY291bnRUeXBlXSA9ICcxJyBBTkQgW0FjY291bnRDb2RlVmFsdWVdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwnMDAxJykpIEFTIHZhcmNoYXIobWF4KSkNCldIRU4gQEFjY291bnRUeXBlSUQgIT0gMSBUSEVOICcwMCcgKw0KDQpDQVNUKA0KKFNFTEVDVCBJU05VTEwoDQooU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gVmFuZG9yQ2F0ZWdvcnkgV0hFUkUgW0hhdmVGYXRoZXJdID0gQEFjY291bnRJRCBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gREVTQyksDQpDQVNUKChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudENvZGVWYWx1ZV0gKyAnMDAxJyBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gVmFuZG9yQ2F0ZWdvcnkgV0hFUkUgW0lEXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLCcwMDEnKSApIEFTIHZhcmNoYXIobWF4KSkNCikNCg0KKSBBUyB2YXJjaGFyKG1heCkpDQpFTkQpIEFTIEFjY291bnRJRCwNCg0KKENBU0UNCldIRU4gQEFjY291bnRUeXBlSUQgPSAxIFRIRU4gKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50TGV2YWxWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBWYW5kb3JDYXRlZ29yeSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbQWNjb3VudENvZGVWYWx1ZV0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0lEXSBERVNDKSwnMScpKQ0KV0hFTiBAQWNjb3VudFR5cGVJRCAhPSAxIFRIRU4gKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50TGV2YWxWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBWYW5kb3JDYXRlZ29yeSBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtJRF0gREVTQyksDQoNCihTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gVmFuZG9yQ2F0ZWdvcnkgV0hFUkUgW0lEXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLDEpKQ0KKSkNCkVORCkgQVMgQWNjb3VudExldmFsIjsNCi8vZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KCcgLiAkc3FsIC4gJyk7ICA8L3NjcmlwdD4nOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFZlbmRvckNhdGVnb3J5RmF0aGVyTmFtZXMnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBWYW5kb3JDYXRlZ29yeSBXSEVSRSBbQWNjb3VudFR5cGVdICE9ICczJyBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFyZWFJRFYnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0FjY291bnRzVHlwZVZhbHVlJ10pKSAkQWNjb3VudHNUeXBlVmFsdWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0FjY291bnRzVHlwZVZhbHVlJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydGaXJzdENhdGdvcnlWYWx1ZSddKSkgJEZpcnN0Q2F0Z29yeVZhbHVlID0gcGVzdGljaWRlKCRfR0VUWydGaXJzdENhdGdvcnlWYWx1ZSddKTsNCg0KICAgICRzcWwgPSAiDQpEZWNsYXJlIEBBY2NvdW50VHlwZUlEIGFzIGludCA9ICciLiRBY2NvdW50c1R5cGVWYWx1ZS4iJzsgDQpEZWNsYXJlIEBBY2NvdW50SUQgYXMgaW50ID0gJyIuJEZpcnN0Q2F0Z29yeVZhbHVlLiInOyANCg0KU0VMRUNUIA0KKENBU0UNCldIRU4gQEFjY291bnRUeXBlSUQgPSAxIFRIRU4gJzAwJyArIENBU1QoKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50Q29kZVZhbHVlXSArIDEgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIEFyZWEgV0hFUkUgW0FjY291bnRUeXBlXSA9ICcxJyBBTkQgW0FjY291bnRDb2RlVmFsdWVdIElTIE5PVCBOVUxMIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwnMDAxJykpIEFTIHZhcmNoYXIobWF4KSkNCldIRU4gQEFjY291bnRUeXBlSUQgIT0gMSBUSEVOICcwMCcgKw0KDQpDQVNUKA0KKFNFTEVDVCBJU05VTEwoDQooU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQXJlYSBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwNCkNBU1QoKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50Q29kZVZhbHVlXSArICcwMDEnIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBBcmVhIFdIRVJFIFtJRF0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwnMDAxJykgKSBBUyB2YXJjaGFyKG1heCkpDQopDQoNCikgQVMgdmFyY2hhcihtYXgpKQ0KRU5EKSBBUyBBY2NvdW50SUQsDQoNCihDQVNFDQpXSEVOIEBBY2NvdW50VHlwZUlEID0gMSBUSEVOIChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQXJlYSBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbQWNjb3VudENvZGVWYWx1ZV0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0lEXSBERVNDKSwnMScpKQ0KV0hFTiBAQWNjb3VudFR5cGVJRCAhPSAxIFRIRU4gKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50TGV2YWxWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBBcmVhIFdIRVJFIFtIYXZlRmF0aGVyXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0lEXSBERVNDKSwNCg0KKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50TGV2YWxWYWx1ZV0gKyAxIEFTIEFjY291bnRDb2RlVmFsdWUgRlJPTSBBcmVhIFdIRVJFIFtJRF0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwxKSkNCikpDQpFTkQpIEFTIEFjY291bnRMZXZhbCI7DQovL2VjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5hbGVydCgnIC4gJHNxbCAuICcpOyAgPC9zY3JpcHQ+JzsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRBcmVhRmF0aGVyTmFtZXMnKSB7DQogICAgJHNxbDEgPSAiU0VMRUNUICogRlJPTSBBcmVhIFdIRVJFIFtBY2NvdW50VHlwZV0gIT0gJzMnIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q2hlY2tzQmFua0lEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJRFZdICsgMSBBUyBbSURWXSBGUk9NIENoZWNrc0JhbmsgT1JERVIgQlkgW0lEVl0gREVTQyksMSkgQVMgSURWIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXREaXNjb3VudEFkZElEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJRFZdICsgMSBBUyBbSURWXSBGUk9NIERpc2NvdW50QWRkVHlwZSBPUkRFUiBCWSBbSURWXSBERVNDKSwxKSBBUyBJRFYiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEJhbmtJRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBCYW5rIE9SREVSIEJZIFtJRFZdIERFU0MpLDEpIEFTIElEViI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR0VUQWNjb3VudHNUeXBlJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gQWNjb3VudHNUeXBlIE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRpbmdGYXRoZXJOYW1lcycpIHsNCiAgICAkc3FsMSA9ICJTRUxFQ1QgKiBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbQWNjb3VudFR5cGVdICE9ICczJyBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEFjY291bnRpbmdJRFYnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0FjY291bnRzVHlwZVZhbHVlJ10pKSAkQWNjb3VudHNUeXBlVmFsdWUgPSBwZXN0aWNpZGUoJF9HRVRbJ0FjY291bnRzVHlwZVZhbHVlJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydGaXJzdENhdGdvcnlWYWx1ZSddKSkgJEZpcnN0Q2F0Z29yeVZhbHVlID0gcGVzdGljaWRlKCRfR0VUWydGaXJzdENhdGdvcnlWYWx1ZSddKTsNCg0KICAgICRzcWwgPSAiDQpEZWNsYXJlIEBBY2NvdW50VHlwZUlEIGFzIGludCA9ICciLiRBY2NvdW50c1R5cGVWYWx1ZS4iJzsgDQpEZWNsYXJlIEBBY2NvdW50SUQgYXMgbnZhcmNoYXIobWF4KSA9ICciLiRGaXJzdENhdGdvcnlWYWx1ZS4iJzsgDQoNClNFTEVDVCANCihDQVNFDQpXSEVOIEBBY2NvdW50VHlwZUlEID0gMSBUSEVOIENBU1QoKFNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtBY2NvdW50Q29kZVZhbHVlXSArIDEgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzEnIEFORCBbQWNjb3VudENvZGVWYWx1ZV0gSVMgTk9UIE5VTEwgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLCcwMDEnKSkgQVMgdmFyY2hhcihtYXgpKQ0KV0hFTiBAQWNjb3VudFR5cGVJRCAhPSAxIFRIRU4NCkNBU1QoDQooU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtIYXZlRmF0aGVyXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLA0KQ0FTVCgoU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRDb2RlVmFsdWVdICsgJzAxJyBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtBY2NvdW50Q29kZVZhbHVlXSA9IEBBY2NvdW50SUQgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIERFU0MpLCcwMScpICkgQVMgdmFyY2hhcihtYXgpKQ0KKSkgQVMgdmFyY2hhcihtYXgpKQ0KRU5EKSBBUyBBY2NvdW50SUQsDQoNCihDQVNFDQpXSEVOIEBBY2NvdW50VHlwZUlEID0gMSBUSEVOIChTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbQWNjb3VudExldmFsVmFsdWVdICsgMSBBUyBBY2NvdW50Q29kZVZhbHVlIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFtBY2NvdW50VHlwZV0gPSAnMScgQU5EIFtBY2NvdW50Q29kZVZhbHVlXSBJUyBOT1QgTlVMTCBPUkRFUiBCWSBbSURdIERFU0MpLCcxJykpDQpXSEVOIEBBY2NvdW50VHlwZUlEICE9IDEgVEhFTiAoU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRMZXZhbFZhbHVlXSArIDEgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbSGF2ZUZhdGhlcl0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtJRF0gREVTQyksDQooU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0FjY291bnRMZXZhbFZhbHVlXSArIDEgQVMgQWNjb3VudENvZGVWYWx1ZSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBbQWNjb3VudENvZGVWYWx1ZV0gPSBAQWNjb3VudElEIE9SREVSIEJZIFtBY2NvdW50Q29kZVZhbHVlXSBERVNDKSwxKSkNCikpDQpFTkQpIEFTIEFjY291bnRMZXZhbCI7DQovL2VjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5hbGVydCgnIC4gJHNxbCAuICcpOyAgPC9zY3JpcHQ+JzsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRNYXNyb2ZhdEFtb21pYUFjY291bnRWYWx1ZScpIHsNCiAgICAkc3FsMSA9ICINCkRFQ0xBUkUgQElEIElOVDtTRUxFQ1QgQElEID0gKFNFTEVDVCBbTWFzcm9mYXRBbW9taWFBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicpOw0KV2l0aCAjcmVzdWx0cyBBUyAoU0VMRUNUIFtJRF0sW0hhdmVGYXRoZXJdLFtBY2NvdW50Q29kZVZhbHVlXSxbQWNjb3VudE5hbWVWYWx1ZV0sW0FjY291bnRUeXBlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBJRCA9IEBJRA0KVU5JT04gQUxMDQpTRUxFQ1QgVC5bSURdLFQuW0hhdmVGYXRoZXJdLFQuW0FjY291bnRDb2RlVmFsdWVdLFQuW0FjY291bnROYW1lVmFsdWVdLFQuW0FjY291bnRUeXBlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBUIElOTkVSIEpPSU4gI1Jlc3VsdHMgUiBPTiBSLltBY2NvdW50Q29kZVZhbHVlXSA9IFQuW0hhdmVGYXRoZXJdKQ0KU0VMRUNUICogRlJPTSAjUmVzdWx0cyBXSEVSRSBbQWNjb3VudFR5cGVdID0gJzMnOyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uNCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uNCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRNb3J0YWJhdFdBZ29yQWNjb3VudFZhbHVlJykgew0KICAgICRzcWwxID0gIg0KREVDTEFSRSBASUQgSU5UO1NFTEVDVCBASUQgPSAoU0VMRUNUIFtUYW1pbkVtZWFsQWNjb3VudF0gRlJPTSBCcmFuY2hBY2NvdW50IFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQNClVOSU9OIEFMTA0KU0VMRUNUIFQuW0lEXSxULltIYXZlRmF0aGVyXSxULltBY2NvdW50Q29kZVZhbHVlXSxULltBY2NvdW50TmFtZVZhbHVlXSxULltBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gVCBJTk5FUiBKT0lOICNSZXN1bHRzIFIgT04gUi5bQWNjb3VudENvZGVWYWx1ZV0gPSBULltIYXZlRmF0aGVyXSkNClNFTEVDVCAqIEZST00gI1Jlc3VsdHMgV0hFUkUgW0FjY291bnRUeXBlXSA9ICczJzsiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjQsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0UGFydG5lcnNBY2NvdW50VmFsdWUnKSB7DQogICAgJHNxbDEgPSAiDQpERUNMQVJFIEBJRCBJTlQ7U0VMRUNUIEBJRCA9IChTRUxFQ1QgW1RhbWluV29ya0FjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIgLiAkTmV3QnJhbmNoSUQgLiAiJyk7DQpXaXRoICNyZXN1bHRzIEFTIChTRUxFQ1QgW0lEXSxbSGF2ZUZhdGhlcl0sW0FjY291bnRDb2RlVmFsdWVdLFtBY2NvdW50TmFtZVZhbHVlXSxbQWNjb3VudFR5cGVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIElEID0gQElEDQpVTklPTiBBTEwNClNFTEVDVCBULltJRF0sVC5bSGF2ZUZhdGhlcl0sVC5bQWNjb3VudENvZGVWYWx1ZV0sVC5bQWNjb3VudE5hbWVWYWx1ZV0sVC5bQWNjb3VudFR5cGVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFQgSU5ORVIgSk9JTiAjUmVzdWx0cyBSIE9OIFIuW0FjY291bnRDb2RlVmFsdWVdID0gVC5bSGF2ZUZhdGhlcl0pDQpTRUxFQ1QgKiBGUk9NICNSZXN1bHRzIFdIRVJFIFtBY2NvdW50VHlwZV0gPSAnMyc7IjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFJhRm9GRlZhbHVlJykgew0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gUmFGb0ZGIE9SREVSIEJZIFtJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm40LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ1NhdmVSYWYnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0lEJ10pKSAkSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0lEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydJVGVtTmFtZSddKSkgJElUZW1OYW1lID0gcGVzdGljaWRlKCRfR0VUWydJVGVtTmFtZSddKTsNCg0KICAgICAgICAkc3FsMTIzID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFY2xhcmUgQENUSUQgYXMgaW50ID0gJyIgLiBpbnR2YWwoJElEKSAuICInOw0KREVjbGFyZSBASXRlbUlEIGFzIGludCA9IDA7DQpERWNsYXJlIEBCcmFuY2hJRCBhcyBpbnQgPSAnIi4kTmV3QnJhbmNoSUQuIic7DQpERWNsYXJlIEBJdGVtTmFtZSBhcyBudmFyY2hhcihtYXgpID0gJyIgLiAkSVRlbU5hbWUgLiAiJzsNCkRlY2xhcmUgQEl0ZW1Db2RlIEFTIG52YXJjaGFyKE1BWCkgPSAwOw0KREVjbGFyZSBAc3RhdHVzIGFzIG52YXJjaGFyKG1heCkgPSAndHJ1ZSc7DQoNCklGIEBDVElEID0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gUmFGb0ZGIFdIRVJFIFtSYUZOYW1lXSA9IEBJdGVtTmFtZSkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EIEVMU0UgSUYgQENUSUQgIT0gMCBCRUdJTg0KSUYgRXhpc3RzKFNFTEVDVCAqIEZST00gUmFGb0ZGIFdIRVJFIFtSYUZOYW1lXSA9IEBJdGVtTmFtZSBBTkQgW0lEXSAhPSBAQ1RJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ2ZhbHNlJzsNCkVORA0KRU5EDQoNCklGIEBzdGF0dXMgPSAndHJ1ZScgQkVHSU4NCklGIEBDVElEID0gMCBCRUdJTg0KDQpJTlNFUlQgSU5UTyBSYUZvRkYoW0lEVl0sW1JhRk5hbWVdDQopVkFMVUVTKA0KKCcwMDAnICsgQ0FTVCgNCihTRUxFQ1QgKENBU0UgV0hFTg0KKFNFTEVDVCBDT1VOVChJRFYpIEZST00gUmFGb0ZGKSA+IDAgVEhFTiANCihTRUxFQ1QgVE9QIDEgW0lEVl0gKyAxIEZST00gUmFGb0ZGIE9SREVSIEJZIFtJRFZdIERFU0MpIA0KRUxTRSAxIEVORCkgQVMgW0lEVl0gRlJPTSBDb21wYW55SW5mbyBXSEVSRSBbQnJhbmNoSURdID0gQEJyYW5jaElEKSBBUyB2YXJjaGFyKG1heCkpKSxASXRlbU5hbWUpDQoNClNFVCBASXRlbUlEID0gKFNFTEVDVCBAQElkZW50aXR5KTsNClNFTEVDVCBUT1AgKDEpIEBJdGVtQ29kZSA9IFtJRFZdIEZST00gUmFGb0ZGIFdIRVJFIFtJRF0gPSBASXRlbUlEDQpFTkQgRUxTRSBJRiBAQ1RJRCAhPSAwIEJFR0lODQpVUERBVEUgUmFGb0ZGIFNFVCBbUmFGTmFtZV0gPSBASXRlbU5hbWUgV0hFUkUgW0lEXSA9IEBDVElEDQpTRUxFQ1QgQEl0ZW1Db2RlID0gW0lEVl0sQEl0ZW1JRCA9IFtJRF0gRlJPTSBSYUZvRkYgV0hFUkUgW0lEXSA9IEBDVElEDQpFTkQNCkVORA0KOw0KU0VMRUNUIEBJdGVtQ29kZSBBUyBJdGVtQ29kZSxASXRlbUlEIEFTIEl0ZW1JRCxAc3RhdHVzIEFTIHN0YXR1cyI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMiwkc3FsMTIzLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyYjMTU3NTsmIzE1ODc7JiMxNjA1OyAmIzE1NzU7JiMxNjA0OyYjMTU4NTsmIzE2MDE7ICYjMTYwNTsmIzE2MDM7JiMxNTg1OyYjMTU4NTsnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzIpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnUmVtb3ZlUmFmJykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydMaW5lSUQnXSkpICRMaW5lSUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0xpbmVJRCddKTsNCg0KICAgICRzcWwxID0gIg0KU0VUIE5PQ09VTlQgT04NCkRFQ0xBUkUgQElEIElOVDtTRUxFQ1QgQElEID0gJyIgLiBpbnR2YWwoJExpbmVJRCkgLiAiJzsNCkRFY2xhcmUgQHN0YXR1cyBBUyBudmFyY2hhcihtYXgpID0gJ3RydWVzJzsNCg0KSUYgRXhpc3RzKFNFTEVDVCBbSXRlbUlEXSBGUk9NIEl0ZW0gV0hFUkUgW0l0ZW1fV2hlcmVdID0gQElEKSBCRUdJTg0KU0VUIEBzdGF0dXMgPSAnSGF2ZU1vdmUnOw0KRU5EIEVMU0UgSUYgTk9UIEV4aXN0cyhTRUxFQ1QgW0l0ZW1JRF0gRlJPTSBJdGVtIFdIRVJFIFtJdGVtX1doZXJlXSA9IEBJRCkgQkVHSU4NClNFVCBAc3RhdHVzID0gJ3RydWVzJzsNCkVORA0KDQpJRiBAc3RhdHVzID0gJ3RydWVzJyBCRUdJTjsNCkRFTEVURSBGUk9NIFJhRm9GRiBXSEVSRSBbSURWXSA9IEBJRDsNCkVORA0KDQpTRUxFQ1QgQHN0YXR1cyBhcyBTdGF0dXNBIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4zMCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMzApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0VXNlcnNJRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURWXSArIDEgQVMgW0lEVl0gRlJPTSBVc2VycyBPUkRFUiBCWSBbSURWXSBERVNDKSwxKSBBUyBJRFYiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldExldmFsTmFtZUlEJykgew0KICAgICRzcWwxMCA9ICJTRUxFQ1QgKiBGUk9NIFVzZXJMZXZhbCBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJFVzZXJMZXZhbCA9IHNxbHNydl9xdWVyeSgkY29ubjQwLCRzcWwxMCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRVc2VyTGV2YWwpKSB7DQogICAgd2hpbGUgKCRmZXRjaFpBID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRVc2VyTGV2YWwsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdEFbXSA9ICRmZXRjaFpBOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0QSkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRVc2VyTGV2YWwpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0F6ZW5TVHlwZScpIHsNCiAgICAkc3FsMTAgPSAiU0VMRUNUICogRlJPTSBBem9uVHlwZSBPUkRFUiBCWSBbSURdIEFTQyI7DQogICAgJFVzZXJMZXZhbCA9IHNxbHNydl9xdWVyeSgkY29ubjQwLCRzcWwxMCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRVc2VyTGV2YWwpKSB7DQogICAgd2hpbGUgKCRmZXRjaFpBID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRVc2VyTGV2YWwsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdEFbXSA9ICRmZXRjaFpBOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0QSkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRVc2VyTGV2YWwpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFJlZnVuZEludm9pY2VJRFYnKSB7DQogICAgJHNxbCA9ICJTRUxFQ1QgSVNOVUxMKChTRUxFQ1QgVE9QICgxKSBbSURdICsgMSBBUyBbSURdIEZST00gUmVmYW5kZWRJbnZvaWNlIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIE9SREVSIEJZIFtJRF0gREVTQyksMSkgQVMgSUQiOw0KICAgICRJdGVtU3RyaW5nID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMTAsJHNxbCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJEl0ZW1TdHJpbmcsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRJdGVtU3RyaW5nKSkgew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgIH1lbHNlew0KICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJEl0ZW1TdHJpbmcpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjEwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEludm9pY2VzTmFtZScpIHsNCiAgICAkc3FsMTAgPSAiDQpXSVRIIFJFVFMgQVMoDQpTRUxFQ1QgSW52b2ljZXMuSW52b2ljZUlELENBU1QoSW52b2ljZXMuSUQgQVMgVmFyY2hhcikgQVMgSUQsDQooQ0FTRSBXSEVOIEludm9pY2VzLkNsaWVudElEID0gMCBUSEVOICcmIzE2MDU7JiMxNTc2OyYjMTYxMDsmIzE1OTM7JiMxNTc1OyYjMTU3ODsgJiMxNjA2OyYjMTYwMjsmIzE1ODM7JiMxNjEwOyYjMTU3NzsnIEVMU0UgQ2xpZW50cy5DbGllbnROYW1lIEVORCkgQVMgQ2xpZW50TmFtZVMsDQooQ0FTRSBXSEVOIENsaWVudHMuQ2xpZW50TmFtZSBJUyBOVUxMIFRIRU4gQ0FTVChJbnZvaWNlcy5JRCBBUyBWYXJjaGFyKE1BWCkpICsgJy18LScgKyAnJiMxNjA1OyYjMTU3NjsmIzE2MTA7JiMxNTkzOyYjMTU3NTsmIzE1Nzg7ICYjMTYwNjsmIzE2MDI7JiMxNTgzOyYjMTYxMDsmIzE1Nzc7JyArICctfC0nICsgDQpDQVNUKEludm9pY2VzLkludm9pY2VEYXRhIEFTIFZhcmNoYXIoTUFYKSkgRUxTRSBDQVNUKEludm9pY2VzLklEIEFTIFZhcmNoYXIoTUFYKSkgKyAnLXwtJyArIENsaWVudHMuQ2xpZW50TmFtZSArICctfC0nICsgDQpDQVNUKEludm9pY2VzLkludm9pY2VEYXRhIEFTIFZhcmNoYXIoTUFYKSkgRU5EKSBBUyBJbmZvDQpGUk9NIEludm9pY2VzIExFRlQgT1VURVIgSk9JTg0KVXNlcnMgT04gSW52b2ljZXMuVXNlcklEID0gVXNlcnMuSUQgTEVGVCBPVVRFUiBKT0lODQpDbGllbnRzIE9OIEludm9pY2VzLkNsaWVudElEID0gQ2xpZW50cy5JRA0KV0hFUkUgSW52b2ljZXMuW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicpDQpTRUxFQ1QgKiBGUk9NIFJFVFMgT1JERVIgQlkgQ0FTVChbSURdIEFTIElOVCkgREVTQyI7DQogICAgJFVzZXJMZXZhbCA9IHNxbHNydl9xdWVyeSgkY29ubjQwLCRzcWwxMCxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRVc2VyTGV2YWwpKSB7DQogICAgd2hpbGUgKCRmZXRjaFpBID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRVc2VyTGV2YWwsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdEFbXSA9ICRmZXRjaFpBOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0QSkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRVc2VyTGV2YWwpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjQwKTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFJlZnVuZEFjY291bnROYW1lJykgew0KICAgICRzcWwxID0gIg0KREVDTEFSRSBASUQgSU5UO1NFTEVDVCBASUQgPSAoU0VMRUNUIFtTYWxlc1JlZnVuZEFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQgDQpVTklPTiBBTEwNClNFTEVDVCBULltJRF0sVC5bSGF2ZUZhdGhlcl0sVC5bQWNjb3VudENvZGVWYWx1ZV0sVC5bQWNjb3VudE5hbWVWYWx1ZV0sVC5bQWNjb3VudFR5cGVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFQgSU5ORVIgSk9JTiAjUmVzdWx0cyBSIE9OIFIuW0FjY291bnRDb2RlVmFsdWVdID0gVC5bSGF2ZUZhdGhlcl0pDQpTRUxFQ1QgW0lEXSxbQWNjb3VudE5hbWVWYWx1ZV0sW0FjY291bnRUeXBlXSwoU0VMRUNUIFRPUCAoMSkgW1NhbGVzUmVmdW5kQWNjb3VudF0gRlJPTSBCcmFuY2hBY2NvdW50IFdIRVJFIFtCcmFuY2hJRF0gPSAnIi4kTmV3QnJhbmNoSUQuIicpIEFTIFtTYWxlc0xvY2FsQWNjb3VudF0NCkZST00gI1Jlc3VsdHMgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjgsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yOCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRJbnZvaWNlUmVmdW5kSUREYWlseScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnRGF0ZSddKSkgJERhdGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0RhdGUnXSk7DQogICAgJHNxbDEgPSAiDQpEZWNsYXJlIEBJbnZvaWNlRGF0ZVZhbHVlIGFzIGRhdGUgPSAnIiAuICREYXRlIC4gIic7DQpTRUxFQ1QgKFNFTEVDVCBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5JykgKyBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICdNTScpICsgRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAnZGQnKSArICctJyArDQpDQVNUKChDQVNFIFdIRU4gKFNFTEVDVCBDT1VOVChbSUREYWlseV0pIEZST00gUmVmYW5kZWRJbnZvaWNlIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIEFORCBbSW52b2ljZURhdGFdID0gRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAneXl5eS9NTS9kZCcpKSA9IDAgVEhFTiAnMScNCkVMU0UgKFNFTEVDVCBDT1VOVChbSUREYWlseV0pICsgMSBBUyBbSUREYWlseV0gRlJPTSBSZWZhbmRlZEludm9pY2UgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgQU5EIFtJbnZvaWNlRGF0YV0gPSBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5L01NL2RkJykpDQpFTkQpIEFTIHZhcmNoYXIobWF4KSkpIEFTIERhdGUiOw0KICAgICRDbGllbnRBQXNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjYsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRBQXNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50QUFzQSkpIHsNCiAgICAgICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgICAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRBQXNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yNik7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRQYXltZW50SW52b2ljZUlEVicpIHsNCiAgICAkc3FsID0gIlNFTEVDVCBJU05VTEwoKFNFTEVDVCBUT1AgKDEpIFtJRF0gKyAxIEFTIFtJRF0gRlJPTSBWSW52b2ljZXMgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgT1JERVIgQlkgW0lEXSBERVNDKSwxKSBBUyBJRCI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0UGF5bWVudEFjY291bnROYW1lJykgew0KICAgICRzcWwxID0gIg0KREVDTEFSRSBASUQgSU5UO1NFTEVDVCBASUQgPSAoU0VMRUNUIFtQYXltZW50Q29zdEFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQgDQpVTklPTiBBTEwNClNFTEVDVCBULltJRF0sVC5bSGF2ZUZhdGhlcl0sVC5bQWNjb3VudENvZGVWYWx1ZV0sVC5bQWNjb3VudE5hbWVWYWx1ZV0sVC5bQWNjb3VudFR5cGVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFQgSU5ORVIgSk9JTiAjUmVzdWx0cyBSIE9OIFIuW0FjY291bnRDb2RlVmFsdWVdID0gVC5bSGF2ZUZhdGhlcl0pDQpTRUxFQ1QgW0lEXSxbQWNjb3VudE5hbWVWYWx1ZV0sW0FjY291bnRUeXBlXSwoU0VMRUNUIFRPUCAoMSkgW1BheW1lbnRDb3N0TG9jYWxBY2NvdW50XSBGUk9NIEJyYW5jaEFjY291bnQgV0hFUkUgW0JyYW5jaElEXSA9ICciLiROZXdCcmFuY2hJRC4iJykgQVMgW1BheW1lbnRDb3N0TG9jYWxBY2NvdW50XQ0KRlJPTSAjUmVzdWx0cyBPUkRFUiBCWSBbQWNjb3VudENvZGVWYWx1ZV0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yOCwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50c0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjI4KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldEludm9pY2VQYXltZW50SUREYWlseScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnRGF0ZSddKSkgJERhdGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0RhdGUnXSk7DQogICAgJHNxbDEgPSAiDQpEZWNsYXJlIEBJbnZvaWNlRGF0ZVZhbHVlIGFzIGRhdGUgPSAnIiAuICREYXRlIC4gIic7DQpTRUxFQ1QgKFNFTEVDVCBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5JykgKyBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICdNTScpICsgRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAnZGQnKSArICctJyArDQpDQVNUKChDQVNFIFdIRU4gKFNFTEVDVCBDT1VOVChbSUREYWlseV0pIEZST00gVkludm9pY2VzIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIEFORCBbSW52b2ljZURhdGFdID0gRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAneXl5eS9NTS9kZCcpKSA9IDAgVEhFTiAnMScNCkVMU0UgKFNFTEVDVCBDT1VOVChbSUREYWlseV0pICsgMSBBUyBbSUREYWlseV0gRlJPTSBWSW52b2ljZXMgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgQU5EIFtJbnZvaWNlRGF0YV0gPSBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5L01NL2RkJykpDQpFTkQpIEFTIHZhcmNoYXIobWF4KSkpIEFTIERhdGUiOw0KICAgICRDbGllbnRBQXNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjYsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRBQXNBLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50QUFzQSkpIHsNCiAgICAgICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgICAgICBwcmludCBqc29uX2VuY29kZSgkZmV0Y2gpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyI9PmZhbHNlLCJlcnIiPT4kZXJyKSk7DQogICAgICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRBQXNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yNik7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRMYXN0UGF5UHJpY2UnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0l0ZW1JRCddKSkgJEl0ZW1JRCA9IHBlc3RpY2lkZSgkX0dFVFsnSXRlbUlEJ10pOw0KICAgIGlmKGlzc2V0KCRfR0VUWydVbml0c0lEJ10pKSAkVW5pdHNJRCA9IHBlc3RpY2lkZSgkX0dFVFsnVW5pdHNJRCddKTsNCg0KICAgICRzcWwxID0gIg0KREVDTEFSRSBASXRlbUlEIEFTIGludCA9ICciLiRJdGVtSUQuIic7DQpERUNMQVJFIEBVaW50ZUlEIEFTIGludCA9ICciLiRVbml0c0lELiInOw0KREVDTEFSRSBAVWludGVPbmVJRCBBUyBpbnQgPSAoU0VMRUNUIFRPUCAoMSkgW1VuaXRzXSBGUk9NIEl0ZW0gV0hFUkUgW0lEXSA9IEBJdGVtSUQpOw0KREVDTEFSRSBAVWludGVUd29JRCBBUyBpbnQgPSAoU0VMRUNUIFRPUCAoMSkgW0FkZF9Vbml0c10gRlJPTSBJdGVtIFdIRVJFIFtJRF0gPSBASXRlbUlEKTsNCkRFQ0xBUkUgQFZhbHVlIEFTIERlY2ltYWwoMTgsMikgPSAwOw0KDQpJRiBAVWludGVJRCA9IEBVaW50ZU9uZUlEIEJFR0lODQpTRUxFQ1QgVE9QICgxKSBAVmFsdWUgPSBbUGF5QW1vdW50XSBGUk9NIFN0b3JlX0VudGVyeSBXSEVSRSBbSXRlbUlEXSA9IEBJdGVtSUQgQU5EIFtJc0Jvbm91c10gPSAnRmFsc2UnIEFORCBbVWludHNJRF0gPSBAVWludGVJRCBBTkQgKFtUeXBlXSA9ICdQYXknIE9SIFtUeXBlXSA9ICdCZWdpbicpIE9SREVSIEJZIFtJRF0gREVTQw0KRU5EIEVMU0UgSUYgQFVpbnRlSUQgPSBAVWludGVUd29JRCBCRUdJTg0KU0VMRUNUIFRPUCAoMSkgQFZhbHVlID0gW1BheUFtb3VudFNdIEZST00gU3RvcmVfRW50ZXJ5IFdIRVJFIFtJdGVtSURdID0gQEl0ZW1JRCBBTkQgW0lzQm9ub3VzXSA9ICdGYWxzZScgQU5EIFtVaW50c0lEXSA9IEBVaW50ZUlEIEFORCAoW1R5cGVdID0gJ1BheScgT1IgW1R5cGVdID0gJ0JlZ2luJykgT1JERVIgQlkgW0lEXSBERVNDDQpFTkQgRUxTRSBCRUdJTg0KU0VMRUNUIFRPUCAoMSkgQFZhbHVlID0gW1BheUFtb3VudF0gRlJPTSBTdG9yZV9FbnRlcnkgV0hFUkUgW0l0ZW1JRF0gPSBASXRlbUlEIEFORCBbSXNCb25vdXNdID0gJ0ZhbHNlJyBBTkQgW1VpbnRzSURdID0gQFVpbnRlSUQgQU5EIChbVHlwZV0gPSAnUGF5JyBPUiBbVHlwZV0gPSAnQmVnaW4nKSBPUkRFUiBCWSBbSURdIERFU0MNCkVORCANCg0KU0VMRUNUIEBWYWx1ZSBBUyBWYWx1ZSI7DQogICAgJENsaWVudEFBc0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yNiwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICAkZmV0Y2ggPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudEFBc0EsU1FMU1JWX0ZFVENIX0FTU09DKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRBQXNBKSkgew0KICAgICAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudEFBc0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjI2KTsNCn1lbHNlIGlmIChzdHJ2YWwoJF9HRVRbIlR5cGUiXSkgPT0gJ0dldFBheW1lbnRSZWZ1bmRJbnZvaWNlSURWJykgew0KICAgICRzcWwgPSAiU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0lEXSArIDEgQVMgW0lEXSBGUk9NIFZhbmRvclJlZmFuZEludm9pY2UgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgT1JERVIgQlkgW0lEXSBERVNDKSwxKSBBUyBJRCI7DQogICAgJEl0ZW1TdHJpbmcgPSBzcWxzcnZfcXVlcnkoJGNvbm4xMCwkc3FsLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkSXRlbVN0cmluZyxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJEl0ZW1TdHJpbmcpKSB7DQogICAgJHJlc3VsdFtdID0gJGZldGNoOw0KICAgIHByaW50IGpzb25fZW5jb2RlKCRmZXRjaCk7DQogICAgfWVsc2V7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkSXRlbVN0cmluZyk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMTApOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0SW52b2ljZVBheW1lbnRSZWZ1bmRJRERhaWx5Jykgew0KICAgIGlmKGlzc2V0KCRfR0VUWydEYXRlJ10pKSAkRGF0ZSA9IHBlc3RpY2lkZSgkX0dFVFsnRGF0ZSddKTsNCiAgICAkc3FsMSA9ICINCkRlY2xhcmUgQEludm9pY2VEYXRlVmFsdWUgYXMgZGF0ZSA9ICciIC4gJERhdGUgLiAiJzsNClNFTEVDVCAoU0VMRUNUIEZPUk1BVChASW52b2ljZURhdGVWYWx1ZSwgJ3l5eXknKSArIEZPUk1BVChASW52b2ljZURhdGVWYWx1ZSwgJ01NJykgKyBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICdkZCcpICsgJy0nICsNCkNBU1QoKENBU0UgV0hFTiAoU0VMRUNUIENPVU5UKFtJRERhaWx5XSkgRlJPTSBWYW5kb3JSZWZhbmRJbnZvaWNlIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIEFORCBbSW52b2ljZURhdGFdID0gRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAneXl5eS9NTS9kZCcpKSA9IDAgVEhFTiAnMScNCkVMU0UgKFNFTEVDVCBDT1VOVChbSUREYWlseV0pICsgMSBBUyBbSUREYWlseV0gRlJPTSBWYW5kb3JSZWZhbmRJbnZvaWNlIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIEFORCBbSW52b2ljZURhdGFdID0gRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAneXl5eS9NTS9kZCcpKQ0KRU5EKSBBUyB2YXJjaGFyKG1heCkpKSBBUyBEYXRlIjsNCiAgICAkQ2xpZW50QUFzQSA9IHNxbHNydl9xdWVyeSgkY29ubjI2LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50QUFzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudEFBc0EpKSB7DQogICAgICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICAgICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50QUFzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0UGF5bWVudFJlZnVuZEFjY291bnROYW1lJykgew0KICAgICRzcWwxID0gIg0KREVDTEFSRSBASUQgSU5UO1NFTEVDVCBASUQgPSAoU0VMRUNUIFtQYXltZW50Q29zdFJlZnVuZEFjY291bnRdIEZST00gQnJhbmNoQWNjb3VudCBXSEVSRSBbQnJhbmNoSURdID0gJyIuJE5ld0JyYW5jaElELiInKTsNCldpdGggI3Jlc3VsdHMgQVMgKFNFTEVDVCBbSURdLFtIYXZlRmF0aGVyXSxbQWNjb3VudENvZGVWYWx1ZV0sW0FjY291bnROYW1lVmFsdWVdLFtBY2NvdW50VHlwZV0gRlJPTSBBY2NvdW50c0RlZmluaXRpb24gV0hFUkUgSUQgPSBASUQgDQpVTklPTiBBTEwNClNFTEVDVCBULltJRF0sVC5bSGF2ZUZhdGhlcl0sVC5bQWNjb3VudENvZGVWYWx1ZV0sVC5bQWNjb3VudE5hbWVWYWx1ZV0sVC5bQWNjb3VudFR5cGVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFQgSU5ORVIgSk9JTiAjUmVzdWx0cyBSIE9OIFIuW0FjY291bnRDb2RlVmFsdWVdID0gVC5bSGF2ZUZhdGhlcl0pDQpTRUxFQ1QgW0lEXSxbQWNjb3VudE5hbWVWYWx1ZV0sW0FjY291bnRUeXBlXSwoU0VMRUNUIFRPUCAoMSkgW1BheW1lbnRDb3N0UmVmdW5kQWNjb3VudF0gRlJPTSBCcmFuY2hBY2NvdW50IFdIRVJFIFtCcmFuY2hJRF0gPSAnIi4kTmV3QnJhbmNoSUQuIicpIEFTIFtQYXltZW50Q29zdExvY2FsQWNjb3VudF0NCkZST00gI1Jlc3VsdHMgT1JERVIgQlkgW0FjY291bnRDb2RlVmFsdWVdIEFTQyI7DQogICAgJENsaWVudHNBID0gc3Fsc3J2X3F1ZXJ5KCRjb25uMjgsJHNxbDEsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkQ2xpZW50c0EpKSB7DQogICAgd2hpbGUgKCRmZXRjaFQgPSBzcWxzcnZfZmV0Y2hfYXJyYXkoJENsaWVudHNBLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRbXSA9ICRmZXRjaFQ7DQogICAgfQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2RhdGEnID0+ICRyZXN1bHQpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yOCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRJbnZvaWNlc1JlZnVuZE5hbWUnKSB7DQogICAgJHNxbDEwID0gIg0KU0VMRUNUIFZJbnZvaWNlcy5JbnZvaWNlSUQsQ0FTVChWSW52b2ljZXMuSUQgQVMgVmFyY2hhcikgQVMgSUQsDQooQ0FTRSBXSEVOIFZhbmRvci5WYW5kb3JOYW1lIElTIE5VTEwgVEhFTiBDQVNUKFZJbnZvaWNlcy5JRCBBUyBWYXJjaGFyKE1BWCkpICsgJy18LScgKyAnJiMxNjA1OyYjMTU4ODsmIzE1Nzg7JiMxNTg1OyYjMTYxMDsmIzE1NzU7JiMxNTc4OyAmIzE2MDY7JiMxNjAyOyYjMTU4MzsmIzE2MTA7JiMxNTc3OycgKyAnLXwtJyArIA0KQ0FTVChWSW52b2ljZXMuSW52b2ljZURhdGEgQVMgVmFyY2hhcihNQVgpKSBFTFNFIENBU1QoVkludm9pY2VzLklEIEFTIFZhcmNoYXIoTUFYKSkgKyAnLXwtJyArIFZhbmRvci5WYW5kb3JOYW1lICsgJy18LScgKyANCkNBU1QoVkludm9pY2VzLkludm9pY2VEYXRhIEFTIFZhcmNoYXIoTUFYKSkgRU5EKSBBUyBJbmZvDQpGUk9NIFZJbnZvaWNlcyBMRUZUIE9VVEVSIEpPSU4NClVzZXJzIE9OIFZJbnZvaWNlcy5Vc2VySUQgPSBVc2Vycy5JRCBMRUZUIE9VVEVSIEpPSU4NClZhbmRvciBPTiBWSW52b2ljZXMuVmFuZG9ySUQgPSBWYW5kb3IuSUQgDQpXSEVSRSBWSW52b2ljZXMuW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicNCk9SREVSIEJZIFZJbnZvaWNlcy5bSURdIERFU0MiOw0KICAgICRVc2VyTGV2YWwgPSBzcWxzcnZfcXVlcnkoJGNvbm40MCwkc3FsMTAsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkVXNlckxldmFsKSkgew0KICAgIHdoaWxlICgkZmV0Y2haQSA9IHNxbHNydl9mZXRjaF9hcnJheSgkVXNlckxldmFsLFNRTFNSVl9GRVRDSF9BU1NPQykpew0KICAgICRyZXN1bHRBW10gPSAkZmV0Y2haQTsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdEEpKTsNCiAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkVXNlckxldmFsKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm40MCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRWZW5kb3JQT0lEUycpIHsNCiAgICAkc3FsMSA9ICINCjtXSVRIIFJFVFMgQVMgKA0KU0VMRUNUIFZhbmRvci5WYW5kb3JOYW1lLFZlbmRvclBPLklEVixWZW5kb3JQTy5EYXRhVGltZSxWZW5kb3JQTy5JRCwNClZlbmRvclBPLlN0YXR1cyxWZW5kb3JQTy5CcmFuY2hJRCxWZW5kb3JQTy5WZW5kb3JJRCwNCihDQVNUKFZlbmRvclBPLklEViBhcyB2YXJjaGFyKG1heCkpICsgc3BhY2UoMSkgKyAgJ3wnICsgc3BhY2UoMSkgKyBDQVNUKFZlbmRvclBPLkRhdGFUaW1lIGFzIHZhcmNoYXIobWF4KSkgKyBzcGFjZSgxKSArICd8JyArIHNwYWNlKDEpICsgVmFuZG9yLlZhbmRvck5hbWUpIEFTIEluZm8NCkZST00gVmVuZG9yUE8gTEVGVCBPVVRFUiBKT0lODQpWYW5kb3IgT04gVmVuZG9yUE8uVmVuZG9ySUQgPSBWYW5kb3IuSUQNCldIRVJFIFZlbmRvclBPLltCcmFuY2hJRF0gPSAnIi4kTmV3QnJhbmNoSUQuIicpDQpTRUxFQ1QgKiBGUk9NIFJFVFMNCldIRVJFIFN0YXR1cyA9IDANCk9SREVSIEJZIFJFVFMuW0lEVl0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yOSwkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjkpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0S2hhem5hQWNjb3VudFR5cGUnKSB7DQogICAgJFNRTFN0cmluZyA9ICcnOw0KICAgIGlmICgkQ29udHJhY3RvcnNWYWx1ZSA9PSB0cnVlKXsNCiAgICAgICAgJFNRTFN0cmluZyA9ICcnOw0KICAgIH1lbHNlew0KICAgICAgICAkU1FMU3RyaW5nID0gJyBXSEVSRSBbSURdICE9IDMnOw0KICAgIH0NCg0KICAgICRzcWwxID0gIlNFTEVDVCAqIEZST00gS2hhem5hU2FyZlR5cGUgIi4kU1FMU3RyaW5nLiIgT1JERVIgQlkgW0lEXSBBU0MiOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjIzLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yMyk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRLaGF6bmFTYXJmSURWJykgew0KICAgICRzcWwgPSAiU0VMRUNUIElTTlVMTCgoU0VMRUNUIFRPUCAoMSkgW0lEVl0gKyAxIEFTIFtJRFZdIEZST00gQXplblNhcmZLaGF6bmEgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgT1JERVIgQlkgW0lEVl0gREVTQyksMSkgQVMgSURWIjsNCiAgICAkSXRlbVN0cmluZyA9IHNxbHNydl9xdWVyeSgkY29ubjEwLCRzcWwsYXJyYXkoKSxhcnJheSgiU2Nyb2xsYWJsZSI9PlNRTFNSVl9DVVJTT1JfRk9SV0FSRCwiUXVlcnlUaW1lb3V0Ij0+MCkpIG9yIGRpZShwcmludF9yKHNxbHNydl9lcnJvcnMoKSx0cnVlKSk7DQogICAgJGZldGNoID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRJdGVtU3RyaW5nLFNRTFNSVl9GRVRDSF9BU1NPQyk7DQogICAgJHJlc3VsdCA9IGFycmF5KCk7DQogICAgaWYgKHNxbHNydl9oYXNfcm93cygkSXRlbVN0cmluZykpIHsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2g7DQogICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRJdGVtU3RyaW5nKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4xMCk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRCYW5rQWNjb3VudE5hbWUnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0N1cnJlbmN5SUQnXSkpICRDdXJyZW5jeUlEID0gcGVzdGljaWRlKCRfR0VUWydDdXJyZW5jeUlEJ10pOw0KICAgICRzcWwxID0gIg0KU0VMRUNUIEJhbmtBY2NvdW50cy5JRCxCYW5rQWNjb3VudHMuQmFua0lELEJhbmtBY2NvdW50cy5BY2NvdW50TnVtYmVyLA0KQmFuay5CYW5rU3RhdHVzLEJhbmtBY2NvdW50cy5bQ3VycmVuY3lJRF0sDQooQmFuay5CYW5rZU5hbWUgKyAnIC0gJyArIEJhbmtBY2NvdW50cy5BY2NvdW50TnVtYmVyKSBBUyBCYW5rZU5hbWUNCkZST00gQmFua0FjY291bnRzIExFRlQgT1VURVIgSk9JTg0KQmFuayBPTiBCYW5rQWNjb3VudHMuQmFua0lEID0gQmFuay5JRA0KV0hFUkUgQmFuay5bQmFua1N0YXR1c10gPSAnVHJ1ZScNCkFORCBCYW5rQWNjb3VudHMuW0N1cnJlbmN5SURdID0gJyIuICRDdXJyZW5jeUlEIC4iJw0KT1JERVIgQlkgQmFua0FjY291bnRzLltJRF0gQVNDIjsNCiAgICAkQ2xpZW50c0EgPSBzcWxzcnZfcXVlcnkoJGNvbm4yMywkc3FsMSxhcnJheSgpLGFycmF5KCJTY3JvbGxhYmxlIj0+U1FMU1JWX0NVUlNPUl9GT1JXQVJELCJRdWVyeVRpbWVvdXQiPT4wKSkgb3IgZGllKHByaW50X3Ioc3Fsc3J2X2Vycm9ycygpLHRydWUpKTsNCiAgICBpZiAoc3Fsc3J2X2hhc19yb3dzKCRDbGllbnRzQSkpIHsNCiAgICB3aGlsZSAoJGZldGNoVCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50c0EsU1FMU1JWX0ZFVENIX0FTU09DKSl7DQogICAgJHJlc3VsdFtdID0gJGZldGNoVDsNCiAgICB9DQogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZGF0YScgPT4gJHJlc3VsdCkpOw0KICAgIH0NCiAgICBzcWxzcnZfZnJlZV9zdG10KCRDbGllbnRzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjMpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnR2V0Q2hlY2tBY2NvdW50TmFtZScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnQ3VycmVuY3lJRCddKSkgJEN1cnJlbmN5SUQgPSBwZXN0aWNpZGUoJF9HRVRbJ0N1cnJlbmN5SUQnXSk7DQogICAgJHNxbDEgPSAiDQo7V0lUSCBSRVRTIEFTICgNClNFTEVDVCBBLklELEEuRGF0YVRpbWUsQS5CYW5rSUQsDQpDQVNUKEEuQ2hlY2tzRW5kRGF0ZVRpbWUgQVMgVmFyY2hhcihtYXgpKSBBUyBDaGVja3NFbmREYXRlVGltZSwNCkEuVG90YWwgQVMgVG90YWxPcmdpbmFsLA0KQ0FTVCgoSVNOVUxMKEEuVG90YWwsMCkgLSBJU05VTEwoKFNFTEVDVCBJU05VTEwoU1VNKENBU1QoQlMuVG90YWxWYWx1ZSBBUyBkZWNpbWFsKDE4LDYpKSksMCkgRlJPTSBLU0l0ZW0gQlMgV0hFUkUgQlMuW0NoZWNrSURdID0gQS5bSURdKSwwKSkgQVMgVmFyY2hhcihtYXgpKSBBUyBUb3RhbCwNCkNBU1QoQS5bQ2hlY2tzQ29kZVZhbHVlXSBBUyBWYXJjaGFyKG1heCkpIEFTIENoZWNrc0NvZGVWYWx1ZSwNCkNBU1QoQS5bQ2hlY2tzQ29kZVZhbHVlXSBBUyBWYXJjaGFyKG1heCkpICsgJyAtICcgKw0KKENBU0UgV0hFTiBBLltUeXBlXSA9ICdDaGVja091dElEJyBUSEVODQooU0VMRUNUIChDQVNFIFdIRU4gU1MuW1R5cGVdID0gJ1ZlbmRvcicgVEhFTiAoU0VMRUNUIFRPUCAxIFtWYW5kb3JOYW1lXSBGUk9NIFZhbmRvciBXSEVSRSBTUy5bVHlwZUlEXSA9IFZhbmRvci5bSURdKQ0KV0hFTiBTUy5bVHlwZV0gPSAnQ29udHJhY3RvcnMnIFRIRU4gKFNFTEVDVCBUT1AgMSBbVmFuZG9yTmFtZV0gRlJPTSBDb250cmFjdG9ycyBXSEVSRSBTUy5bVHlwZUlEXSA9IENvbnRyYWN0b3JzLltJRF0pDQpXSEVOIFNTLltUeXBlXSA9ICdDbGllbnQnIFRIRU4gKFNFTEVDVCBUT1AgMSBbQ2xpZW50TmFtZV0gRlJPTSBDbGllbnRzIFdIRVJFIFNTLltUeXBlSURdID0gQ2xpZW50cy5bSURdKQ0KV0hFTiBTUy5bVHlwZV0gPSAnRXhwZW5zZXNjYXNoJyBUSEVOIChTRUxFQ1QgVE9QIDEgW0FjY291bnROYW1lVmFsdWVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFNTLltUeXBlSURdID0gQWNjb3VudHNEZWZpbml0aW9uLltJRF0pDQpXSEVOIFNTLltUeXBlXSA9ICdPdGhlcicgVEhFTiAoU0VMRUNUIFRPUCAxIFtBY2NvdW50TmFtZVZhbHVlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBTUy5bVHlwZUlEXSA9IEFjY291bnRzRGVmaW5pdGlvbi5bSURdKUVORCkgQVMgTmFtZXMNCkZST00gQ2hlY2tPdXRJdGVtIFNTIFdIRVJFIEEuW0lET10gPSBTUy5bSURdKQ0KRUxTRSAoU0VMRUNUIChDQVNFIFdIRU4gU1MuW1R5cGVdID0gJ1ZlbmRvcicgVEhFTiAoU0VMRUNUIFRPUCAxIFtWYW5kb3JOYW1lXSBGUk9NIFZhbmRvciBXSEVSRSBTUy5bVHlwZUlEXSA9IFZhbmRvci5bSURdKQ0KV0hFTiBTUy5bVHlwZV0gPSAnQ29udHJhY3RvcnMnIFRIRU4gKFNFTEVDVCBUT1AgMSBbVmFuZG9yTmFtZV0gRlJPTSBDb250cmFjdG9ycyBXSEVSRSBTUy5bVHlwZUlEXSA9IENvbnRyYWN0b3JzLltJRF0pDQpXSEVOIFNTLltUeXBlXSA9ICdDbGllbnQnIFRIRU4gKFNFTEVDVCBUT1AgMSBbQ2xpZW50TmFtZV0gRlJPTSBDbGllbnRzIFdIRVJFIFNTLltUeXBlSURdID0gQ2xpZW50cy5bSURdKQ0KV0hFTiBTUy5bVHlwZV0gPSAnRXhwZW5zZXNjYXNoJyBUSEVOIChTRUxFQ1QgVE9QIDEgW0FjY291bnROYW1lVmFsdWVdIEZST00gQWNjb3VudHNEZWZpbml0aW9uIFdIRVJFIFNTLltUeXBlSURdID0gQWNjb3VudHNEZWZpbml0aW9uLltJRF0pDQpXSEVOIFNTLltUeXBlXSA9ICdPdGhlcicgVEhFTiAoU0VMRUNUIFRPUCAxIFtBY2NvdW50TmFtZVZhbHVlXSBGUk9NIEFjY291bnRzRGVmaW5pdGlvbiBXSEVSRSBTUy5bVHlwZUlEXSA9IEFjY291bnRzRGVmaW5pdGlvbi5bSURdKUVORCkgQVMgTmFtZXMNCkZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pRU5EKSBBUyBbTmFtZV0sDQoNCihDQVNFIFdIRU4gQS5bVHlwZV0gPSAnQ2hlY2tPdXRJRCcgVEhFTg0KKFNFTEVDVCAoQ0FTRSBXSEVOIFNTLltUeXBlXSA9ICdDbGllbnQnIFRIRU4gJyYjMTU5MzsmIzE2MDU7JiMxNjA0OyYjMTU3NTsmIzE1Njk7Jw0KV0hFTiBTUy5bVHlwZV0gPSAnQ29udHJhY3RvcnMnIFRIRU4gJyYjMTYwNTsmIzE2MDI7JiMxNTc1OyYjMTYwODsmIzE2MDQ7JiMxNjEwOyYjMTYwNjsnDQpXSEVOIFNTLltUeXBlXSA9ICdWZW5kb3InIFRIRU4gJyYjMTYwNTsmIzE2MDg7JiMxNTg1OyYjMTU4MzsmIzE2MTA7JiMxNjA2OycNCldIRU4gU1MuW1R5cGVdID0gJ090aGVyJyBUSEVOICcmIzE1ODE7JiMxNTg3OyYjMTU3NTsmIzE1NzY7JiMxNTc1OyYjMTU3ODsgJiMxNTcxOyYjMTU4MjsmIzE1ODU7JiMxNjA5OycgRU5EKSBBUyBODQpGUk9NIENoZWNrT3V0SXRlbSBTUyBXSEVSRSBBLltJRE9dID0gU1MuW0lEXSkNCkVMU0UgDQooU0VMRUNUIChDQVNFIFdIRU4gU1MuW1R5cGVdID0gJ0NsaWVudCcgVEhFTiAnJiMxNTkzOyYjMTYwNTsmIzE2MDQ7JiMxNTc1OyYjMTU2OTsnDQpXSEVOIFNTLltUeXBlXSA9ICdDb250cmFjdG9ycycgVEhFTiAnJiMxNjA1OyYjMTYwMjsmIzE1NzU7JiMxNjA4OyYjMTYwNDsmIzE2MTA7JiMxNjA2OycNCldIRU4gU1MuW1R5cGVdID0gJ1ZlbmRvcicgVEhFTiAnJiMxNjA1OyYjMTYwODsmIzE1ODU7JiMxNTgzOyYjMTYxMDsmIzE2MDY7Jw0KV0hFTiBTUy5bVHlwZV0gPSAnT3RoZXInIFRIRU4gJyYjMTU4MTsmIzE1ODc7JiMxNTc1OyYjMTU3NjsmIzE1NzU7JiMxNTc4OyAmIzE1NzE7JiMxNTgyOyYjMTU4NTsmIzE2MDk7JyBFTkQpIEFTIE4NCkZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pRU5EKSBBUyBTU1R5cGUsDQoNCihDQVNFIFdIRU4gQS5bVHlwZV0gPSAnQ2hlY2tPdXRJRCcgVEhFTg0KKFNFTEVDVCBTUy5bVHlwZV0gRlJPTSBDaGVja091dEl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pDQpFTFNFIChTRUxFQ1QgU1MuW1R5cGVdIEZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pRU5EKSBBUyBbU1R5cGVdLA0KKENBU0UgV0hFTiBBLltUeXBlXSA9ICdDaGVja091dElEJyBUSEVODQooU0VMRUNUIFNTLltDaGVja3NUeXBlXSBGUk9NIENoZWNrT3V0SXRlbSBTUyBXSEVSRSBBLltJRE9dID0gU1MuW0lEXSkNCkVMU0UNCihTRUxFQ1QgU1MuW0NoZWNrc1R5cGVdIEZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pRU5EKSBBUyBbQ2hlY2tzVHlwZV0sDQooQ0FTRSBXSEVOIEEuW1R5cGVdID0gJ0NoZWNrT3V0SUQnIFRIRU4NCihTRUxFQ1QgU1MuW0lEVl0gRlJPTSBDaGVja091dEl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pDQpFTFNFDQooU0VMRUNUIFNTLltJRFZdIEZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0pRU5EKSBBUyBbSURWXSwNCg0KKENBU0UgV0hFTiBBLltUeXBlXSA9ICdDaGVja091dElEJyBUSEVODQooU0VMRUNUIFNTLltOZXdDb2RlXSBGUk9NIENoZWNrT3V0SXRlbSBTUyBXSEVSRSBBLltJRE9dID0gU1MuW0lEXSBBTkQgU1MuW0JyYW5jaElEXSA9IEEuW0JyYW5jaElEXSkNCkVMU0UNCihTRUxFQ1QgU1MuW05ld0NvZGVdIEZST00gQ2hlY2tPdXRCZWdpbkl0ZW0gU1MgV0hFUkUgQS5bSURPXSA9IFNTLltJRF0gQU5EIFNTLltCcmFuY2hJRF0gPSBBLltCcmFuY2hJRF0pRU5EKSBBUyBbTmV3Q29kZV0sDQooQ0FTRSBXSEVOIEEuW1R5cGVdID0gJ0NoZWNrT3V0SUQnIFRIRU4NCihTRUxFQ1QgW05hbWVdIEZST00gQ2hlY2tzQmFuayBXSEVSRSBbSURdID0gKFNFTEVDVCBTUy5bQmFua0lEXSBGUk9NIENoZWNrT3V0SXRlbSBTUyBXSEVSRSBBLltJRE9dID0gU1MuW0lEXSkpDQpFTFNFDQooU0VMRUNUIFtOYW1lXSBGUk9NIENoZWNrc0JhbmsgV0hFUkUgW0lEXSA9IChTRUxFQ1QgU1MuW0JhbmtJRF0gRlJPTSBDaGVja091dEJlZ2luSXRlbSBTUyBXSEVSRSBBLltJRE9dID0gU1MuW0lEXSkpDQpFTkQpIEFTIFtCYW5rZU5hbWVdLA0KKFNFTEVDVCBJU05VTEwoU1VNKENBU1QoQlMuVG90YWxWYWx1ZSBBUyBkZWNpbWFsKDE4LDIpKSksMCkgRlJPTSBLU0l0ZW0gQlMgV0hFUkUgQlMuW0NoZWNrSURdID0gQS5bSURdKSBBUyBUb3RhbENoZWNrDQpGUk9NIENoZWNrc19FbnRlcnkgQSANCldIRVJFIEEuW0lEXSBOT1QgSU4gKFNFTEVDVCBJU05VTEwoW1ZhbHVlSURdLDApIEZST00gQ2hlY2tPdXRTZGFhZEl0ZW0gV0hFUkUgW0dvVG9WYWx1ZV0gPSAnMicpDQpBTkQgQS5bSURdIE5PVCBJTiAoU0VMRUNUIElTTlVMTChbQ2hlY2tJRF0sMCkgRlJPTSBDaGVja091dFJlZnVuZEl0ZW0pDQpBTkQgKEEuW1R5cGVdID0gJ0NoZWNrT3V0SUQnIE9SIEEuW1R5cGVdID0gJ0NoZWNrc091dEJlZ2luJykNCkFORCBBLltCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInKQ0KU0VMRUNUICogRlJPTSBSRVRTIFdIRVJFIFRvdGFsT3JnaW5hbCA+IFRvdGFsQ2hlY2siOw0KICAgICRDbGllbnRzQSA9IHNxbHNydl9xdWVyeSgkY29ubjIzLCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudHNBKSkgew0KICAgIHdoaWxlICgkZmV0Y2hUID0gc3Fsc3J2X2ZldGNoX2FycmF5KCRDbGllbnRzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpKXsNCiAgICAkcmVzdWx0W10gPSAkZmV0Y2hUOw0KICAgIH0NCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdkYXRhJyA9PiAkcmVzdWx0KSk7DQogICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudHNBKTsNCiAgICBzcWxzcnZfY2xvc2UoJGNvbm4yMyk7DQp9ZWxzZSBpZiAoc3RydmFsKCRfR0VUWyJUeXBlIl0pID09ICdHZXRLaGF6bmFTYXJmSUREYWlseScpIHsNCiAgICBpZihpc3NldCgkX0dFVFsnRGF0ZSddKSkgJERhdGUgPSBwZXN0aWNpZGUoJF9HRVRbJ0RhdGUnXSk7DQogICAgJHNxbDEgPSAiDQpEZWNsYXJlIEBJbnZvaWNlRGF0ZVZhbHVlIGFzIGRhdGUgPSAnIiAuICREYXRlIC4gIic7DQpTRUxFQ1QgKFNFTEVDVCBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5JykgKyBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICdNTScpICsgRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAnZGQnKSArICctJyArDQpDQVNUKChDQVNFIFdIRU4gKFNFTEVDVCBDT1VOVChbSUREYWlseV0pIEZST00gQXplblNhcmZLaGF6bmEgV0hFUkUgW0JyYW5jaElEXSA9ICciIC4gJE5ld0JyYW5jaElEIC4gIicgQU5EIFtEYXRhVGltZV0gPSBGT1JNQVQoQEludm9pY2VEYXRlVmFsdWUsICd5eXl5L01NL2RkJykpID0gMCBUSEVOICcxJw0KRUxTRSAoU0VMRUNUIENPVU5UKFtJRERhaWx5XSkgKyAxIEFTIFtJRERhaWx5XSBGUk9NIEF6ZW5TYXJmS2hhem5hIFdIRVJFIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIEFORCBbRGF0YVRpbWVdID0gRk9STUFUKEBJbnZvaWNlRGF0ZVZhbHVlLCAneXl5eS9NTS9kZCcpKQ0KRU5EKSBBUyB2YXJjaGFyKG1heCkpKSBBUyBEYXRlIjsNCiAgICAkQ2xpZW50QUFzQSA9IHNxbHNydl9xdWVyeSgkY29ubjI2LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50QUFzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudEFBc0EpKSB7DQogICAgICAgICRyZXN1bHRbXSA9ICRmZXRjaDsNCiAgICAgICAgcHJpbnQganNvbl9lbmNvZGUoJGZldGNoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkZXJyW10gPSAnJzsNCiAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT5mYWxzZSwiZXJyIj0+JGVycikpOw0KICAgICAgICB9DQogICAgc3Fsc3J2X2ZyZWVfc3RtdCgkQ2xpZW50QUFzQSk7DQogICAgc3Fsc3J2X2Nsb3NlKCRjb25uMjYpOw0KfWVsc2UgaWYgKHN0cnZhbCgkX0dFVFsiVHlwZSJdKSA9PSAnQ2hlY2tLaGF6bmFCcmFuY2gnKSB7DQogICAgaWYoaXNzZXQoJF9HRVRbJ0toYXpuYUlEQSddKSkgJEtoYXpuYUlEQSA9IHBlc3RpY2lkZSgkX0dFVFsnS2hhem5hSURBJ10pOw0KICAgICRzcWwxID0gIlNFTEVDVCBUT1AgKDEpICogRlJPTSBLaGF6bmFBY2NvdW50cyBXSEVSRSBbS2hhem5hSURdID0gJyIgLiAkS2hhem5hSURBIC4gIicgQU5EIFtCcmFuY2hJRF0gPSAnIiAuICROZXdCcmFuY2hJRCAuICInIjsNCiAgICAkQ2xpZW50QUFzQSA9IHNxbHNydl9xdWVyeSgkY29ubjI2LCRzcWwxLGFycmF5KCksYXJyYXkoIlNjcm9sbGFibGUiPT5TUUxTUlZfQ1VSU09SX0ZPUldBUkQsIlF1ZXJ5VGltZW91dCI9PjApKSBvciBkaWUocHJpbnRfcihzcWxzcnZfZXJyb3JzKCksdHJ1ZSkpOw0KICAgICRmZXRjaCA9IHNxbHNydl9mZXRjaF9hcnJheSgkQ2xpZW50QUFzQSxTUUxTUlZfRkVUQ0hfQVNTT0MpOw0KICAgIGlmIChzcWxzcnZfaGFzX3Jvd3MoJENsaWVudEFBc0EpKSB7DQogICAgICAgICRlcnJbXSA9ICcnOw0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiPT50cnVlLCJlcnIiPT4kZXJyKSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGVycltdID0gJyc7DQogICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIj0+ZmFsc2UsImVyciI9PiRlcnIpKTsNCiAgICAgICAgfQ0KICAgIHNxbHNydl9mcmVlX3N0bXQoJENsaWVudEFBc0EpOw0KICAgIHNxbHNydl9jbG9zZSgkY29ubjI2KTsNCn0NCg0KDQoNCg0KDQoNCj8+")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 9c07ed0062fbe15c2863666530c82c31
Eval Count 1
Decode Time 318 ms