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("PD9waHAgDQppZiAoaXNzZXQoJF9HRVRbJ2xpc3Rhcl9saW5rcyddKSkgew..
Decoded Output download
?>b'<?php
if (isset($_GET[\'listar_links\'])) {
require_once("controles/conexao.php");
header(\'Content-Type: application/json; charset=utf-8\');
// Recebe os dados da requisio
$dados_requisicao = $_GET;
$colunas = [
0 => \'ID\',
1 => \'logo\',
2 => \'nome_link\',
3 => \'Sinopse\',
4 => \'nome\'
];
// Query para contar o nmero de registros
$query_count = "SELECT COUNT(l.id_link) AS qnt_link
FROM link l
INNER JOIN categoria c ON c.id = l.id_categoria
WHERE (c.nome like \'%CANAIS |%\' OR c.nome like \'%CANAIS @%\' OR c.nome like \'%24 H%\')";
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$query_count .= " AND (nome_link LIKE :nome_link)";
}
$query_count = $conexao2->prepare($query_count);
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$valor_pesq = "%" . $dados_requisicao[\'search\'][\'value\'] . "%";
$query_count->bindValue(\':nome_link\', $valor_pesq);
}
$query_count->execute();
$result_count = $query_count->fetch(PDO::FETCH_ASSOC);
$inicio = (int)$dados_requisicao[\'start\'];
$quantidade = (int)$dados_requisicao[\'length\'];
// Query para listar os registros com paginao
$list_query = "SELECT l.*, c.nome as nome
FROM link l
INNER JOIN categoria c ON c.id = l.id_categoria
WHERE (c.nome like \'%CANAIS |%\' OR c.nome like \'%CANAIS @%\' OR c.nome like \'%24 H%\')";
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$list_query .= " AND (nome_link LIKE :nome_link) ";
}
$list_query .= " ORDER BY " . $colunas[$dados_requisicao[\'order\'][0][\'column\']] . " " . $dados_requisicao[\'order\'][0][\'dir\'] . " LIMIT :quantidade OFFSET :inicio";
$list_query = $conexao2->prepare($list_query);
$list_query->bindValue(\':inicio\', $inicio, PDO::PARAM_INT);
$list_query->bindValue(\':quantidade\', $quantidade, PDO::PARAM_INT);
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$valor_pesq = "%" . $dados_requisicao[\'search\'][\'value\'] . "%";
$list_query->bindValue(\':nome_link\', $valor_pesq);
}
// Executa a consulta
$list_query->execute();
// Prepara os dados para o formato JSON
$dados = [];
while ($row = $list_query->fetch(PDO::FETCH_ASSOC)) {
// Registros para tabela com Child rows
$registros_com_childs_rows = [
"ID" => $row[\'id_link\'],
"Logo" => \'<img src=\'.\'"\'.$row[\'logo\'].\'"\'.\'style="text-align:center; vertical-align:middle; width:45px; height:45px;" />\',
"Titulo" => $row[\'nome_link\'],
"Sinopse" => $row[\'sinopse\'],
"Categoria" => $row[\'nome\'],
"Link" => $row[\'link_link\'],
"Exc" => \'<button class="btn btn-outline-danger" onclick="removerConfirma(\'."\'".$row[\'id_link\']."\'".\',\'."\'".$row[\'nome_link\']."\'".\')"><i class="far fa-trash-alt"></i></button>\',
"Alt" => \'<td><button class="btn btn-outline-secondary" onclick="editarConfirma(\'."\'".$row[\'id_link\']."\'".\',\'."\'".$row[\'nome_link\']."\'".\',\'."\'".$row[\'logo\']."\'".\',\'."\'".$row[\'link_link\']."\'".\',\'."\'".$row[\'id_categoria\']."\'".\')"><i class="fas fa-edit"></i></button>\'
];
$dados[] = $registros_com_childs_rows;
}
$resultado = [
"draw" => intval($dados_requisicao[\'draw\']),
"recordsTotal" => intval($result_count[\'qnt_link\']),
"recordsFiltered" => intval($result_count[\'qnt_link\']),
"data" => $dados
];
echo json_encode($resultado);
exit();
}
?>
<?php
session_start();
require_once("controles/usuarios.php");
require_once("controles/links.php");
require_once("controles/categorias.php");
//include \'pagination.class.php\';
if (checarUsuario()) {
require_once("cabecalho.php");
if($_SESSION[\'admin\']){
}
//$links = listarlinks();
$categorias = listarCategoriastipo("live");
?>
<style id="checkme">
.page-2content {
padding-left: 240px !important;
padding-right: 240px !important;
}
</style>
<div id="conteudo-painel" class="container">
<table id="data_table" class="display overflow-auto table" style="width: 100%;">
<thead class="table-dark">
<tr><!--<th></th> descomentar para usar childs -->
<th class=\'nomecol\' style="width: 5%" scope="col" >#</th>
<th class=\'nomecol\' style="width: 5%" scope="col" >Logo</th>
<th class=\'nomecol\' style="width: 20%" scope="col" >Ttulo</th>
<th class=\'nomecol\' style="width: 20%" scope="col" >Categoria</th>
<th class=\'nomecol\' scope="col" >Link</th>
<th class=\'nomecol\' style="width: 5%" scope="col">Exc</th>
<th class=\'nomecol\' style="width: 5%" scope="col">Alt</th>
</tr>
</thead>
</table>
</div>
</div>
</main>
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/2.0.7/css/dataTables.dataTables.css">
<script src="//cdn.datatables.net/2.0.7/js/dataTables.js"></script>
<style type="text/css">
.overflow-auto {
overflow: auto !important;
}
</style>
<script >
document.addEventListener("DOMContentLoaded", function() {
// Funo para adicionar a classe \'overflow-auto\' div \'dt-layout-cell\'
function addOverflowAuto() {
var wrapper = document.getElementById("data_table_wrapper");
if (wrapper) {
var layoutCell = wrapper.querySelector(".dt-layout-table");
var dt_control = wrapper.querySelector(".dt-control");
if (layoutCell) {
layoutCell.classList.add("overflow-auto");
//console.log("Classe \'overflow-auto\' adicionada div com a classe \'dt-layout-cell\'");
}if (dt_control) {
dt_control.classList.remove("dt-ordering-desc");
//console.log("Classe \'dt-ordering-desc\' removida da td com a classe \'dt-control\'");
}
}
}
// Cria um MutationObserver para observar as mudanas no DOM
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
// Verifica se houve uma mudana no elemento com o id \'data_table_wrapper\'
if (mutation.target.id === "data_table_wrapper") {
addOverflowAuto(); // Adiciona a classe \'overflow-auto\'
//dt_search();
}
});
});
// Configura o MutationObserver para observar mudanas no DOM
observer.observe(document.body, { childList: true, subtree: true });
// Verifica e adiciona a classe \'overflow-auto\' imediatamente aps o DOM ser carregado
addOverflowAuto();
});
$(document).ready(function() {
function dt_search() {
$(\'#dt-search-0\').addClass(\'col col-md-6 dt-input float-left form-control form-row\').attr(\'placeholder\', \'Pesquisar...\');
$(\'.dt-search\').addClass(\'form-row d-block\');
var labelElement = document.querySelector(\'label[for="dt-search-0"]\');
if (labelElement) {
labelElement.remove();
}
// Seleciona todos os elementos com a classe \'.dt-search\'
var dtSearchElements = document.querySelectorAll(\'.dt-search\');
const novo_canal = document.getElementById(\'novo_canal\');
if (!novo_canal) {
// Itera sobre cada elemento encontrado
dtSearchElements.forEach(function(dtSearchElement) {
// Seleciona o input dentro de cada elemento \'.dt-search\'
var inputElement = dtSearchElement.querySelector(\'input\');
// Adiciona a classe \'form-row\' ao input
if (inputElement) {
inputElement.classList.add(\'form-row\');
// Cria o elemento <i> com os atributos especificados
var novoElemento = document.createElement(\'i\');
novoElemento.innerHTML = \' Novo\';
novoElemento.className = \'btn btn-outline-info col col-md-2 fa-user-plus fas float-right text-dark\';
novoElemento.setAttribute(\'aria-hidden\', \'true\');
novoElemento.setAttribute(\'id\', \'novo_canal\');
novoElemento.setAttribute(\'onclick\', "$(\'#cadastro\').modal()");
// Insere o novo elemento aps o input
inputElement.parentNode.insertBefore(novoElemento, inputElement.nextSibling);
}
});
}
}
var table = $(\'#data_table\').DataTable({
ajax: \'?listar_links\',
processing: true,
serverSide: true,
language: {
url: \'//cdn.datatables.net/plug-ins/1.10.13/i18n/Portuguese-Brasil.json\'
},
search: {
searchPlaceholder: "Pesquisar..." // Placeholder para o campo de pesquisa
},
layout: {
topStart: null,
bottom: \'paging\',
bottomStart: "info",
bottomEnd: null
},
columns: [
{
data: "ID",
className: "text-center"
}, // ID
{
orderable: false,
data: "Logo",
className: "text-center"
}, // URL
{
//orderable: false,
data: "Titulo",
className: "text-center"
},
{
//orderable: false,
data: "Categoria",
className: "text-center"
},
{
orderable: false,
data: "Link",
className: "text-center"
},
{
orderable: false,
data: "Exc",
className: "text-center acao"
},
{
orderable: false,
data: "Alt",
className: "text-center acao"
}, // Logo URL
/*{ orderable: false,
data: null, // Aes (nenhuma data associada)
render: function(data, type, row) {
botao_editar = \'<a id="\' + row.id + \'" class="btn btn-info btn-sm">EDITAR</a>\';
botao_excluir = \'<a class="btn btn-danger btn-sm">Excluir</a>\';
return botao_editar + botao_excluir;
}
}*/
],
order: [[2, \'asc\']],
drawCallback: function() {
// Callback chamado aps cada desenho da tabela (inclusive inicializao)
dt_search();
}
});
});
// Adiciona a classe \'form-control\' ao campo de pesquisa
</script>
<!-- page-content" -->
</div>
<!-- Cadastro Inicio -->
<div class="modal fade" id="cadastro" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Adicionar Contedo</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" style="max-height:460px; overflow-y:auto;">
<form id="cadastro-form">
<div class="container">
<div class="form-group">
<label>Nome:</label>
<input type="text" class="form-control" name="nome" placeholder="Nome do Link" required autofocus>
</div>
<div class="form-group">
<label>Logo:</label>
<input type="text" class="form-control" name="logo" placeholder="Link da Imagem" required autofocus>
</div>
<div class="form-group">
<label>Url:</label>
<input type="text" class="form-control" name="link" placeholder="Url do Link" required autofocus>
</div>
<div class="form-group">
<input type="hidden" class="form-control" name="sinopse" placeholder="Sinopse do Contedo" required autofocus>
</div>
<div class="form-group">
<label>Categora:</label>
<div class="ml-0 row">
<select class="selectpicker" title="Categoria" name="categoria" required autofocus>
<?php if ($categorias) {
foreach($categorias as $categoria) {?>
<option value="<?= $categoria[\'id\']?>" > <?= $categoria[\'nome\']?> </option>
<?php } } ?>
</select>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="submit" form="cadastro-form" class="btn btn-primary">Adicionar</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
</div>
</div>
</div>
</div>
<!-- Cadastro Fim-->
<!-- Remove Inicio -->
<div class="modal fade" id="remover" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Tem certeza?</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
<span aria-hidden="true">×</span>
</button>
</div>
<div id="remover-conteudo" class="modal-body"></div>
</div>
</div>
</div>
<!-- Remove Fim-->
<!-- Edita Inicio -->
<div class="modal fade" id="editar" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Editar Contedo</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" style="max-height:460px; overflow-y:auto;">
<form id="editar-form">
<div class="container">
<input type="hidden" name="id" id="idE">
<div class="form-group">
<label>Nome:</label>
<input type="text" class="form-control" id="nomeE" name="nome" placeholder="Nome do Link" required autofocus>
</div>
<div class="form-group">
<label>Logo:</label>
<input type="text" class="form-control" id="logoE" name="logo" placeholder="Link da Imagem" required autofocus>
</div>
<div class="form-group">
<label>Url:</label>
<input type="text" class="form-control" id="linkE" name="link" placeholder="Url do Link" required autofocus>
</div>
<div class="form-group">
<label>Categora:</label>
<div class="ml-0 row">
<select class="selectpicker" title="Categora" id="categoriaE" name="categoria" required autofocus>
<?php if ($categorias) {
foreach($categorias as $categoria) {?>
<option value="<?= $categoria[\'id\']?>" > <?= $categoria[\'nome\']?> </option>
<?php } } ?>
</select>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="submit" form="editar-form" class="btn btn-primary">Editar</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
</div>
</div>
</div>
</div>
<!-- Edita Fim-->
</body>
<script>
function removerConfirma(id,nome) {
$(\'#remover-conteudo\').html(\'<div class="alert alert-danger" role="alert"><strong> Remover </strong>\' + nome + \'?</div><button type="button" class="btn btn-secondary float-right" style="margin-left:10px" data-dismiss="modal">Fechar</button><button onclick="remover(\' + id + \')" type="submit" class="btn btn-danger float-right">Remover</button>\');
$(\'#remover\').modal();
}
function editarConfirma(id,nome, logo, link, categoria) {
$(\'#idE\').val(id);
$(\'#nomeE\').val(nome);
$(\'#logoE\').val(logo);
$(\'#linkE\').val(link);
if (categoria !== "") {
$(\'#categoriaE\').val(categoria);
$(\'#categoriaE\').selectpicker(\'render\');
}
$(\'#editar\').modal();
}
function remover(id) {
$.ajax({
type: "POST",
url: "controles/remover-link.php",
data: {id: id},
success: function(data) {
$("#remover").modal(\'hide\');
data_table = $(\'#data_table\').DataTable();
var pagina_atual = data_table.page(); // Armazena a pgina atual
// Atualiza a tabela
data_table.draw();
// Restaura a pgina aps a atualizao
data_table.page(pagina_atual).draw(\'page\');
}
});
}
$( "#cadastro-form" ).submit(function( event ) {
$.ajax({
type: "POST",
url: "controles/adicionar-link.php",
data: $("#cadastro-form").serialize(),
success: function(data) {
$("#cadastro").modal(\'hide\');
data_table = $(\'#data_table\').DataTable();
var pagina_atual = data_table.page(); // Armazena a pgina atual
// Atualiza a tabela
data_table.draw();
// Restaura a pgina aps a atualizao
data_table.page(pagina_atual).draw(\'page\');
},
error: function (data) {
resultado(data.responseText);
}
});
event.preventDefault();
});
$( "#editar-form" ).submit(function( event ) {
$.ajax({
type: "POST",
url: "controles/editar-link.php",
data: $("#editar-form").serialize(),
success: function(data) {
$("#editar").modal(\'hide\');
data_table = $(\'#data_table\').DataTable();
var pagina_atual = data_table.page(); // Armazena a pgina atual
// Atualiza a tabela
data_table.draw();
// Restaura a pgina aps a atualizao
data_table.page(pagina_atual).draw(\'page\');
},
error: function (data) {
resultado(data.responseText);
}
});
event.preventDefault();
});
speed_to_top = 1000;
$(\'#totop\').click(function () {
$(\'body,html\').animate({
scrollTop: 0
}, speed_to_top);
return false;
});
$(\'#totop\').hide();
$(window).scroll(function () {
if ($(this).scrollTop() > 50) {
$(\'#totop\').fadeIn();
} else {
$(\'#totop\').fadeOut();
}
});
</script>
<?php
require_once("comum.php");
require_once("alerta.php");
?>
</html>
<?php
} else {
header("Location: login");
die();
}
?>'
Did this file decode correctly?
Original Code
<?php @eval("?>".base64_decode("PD9waHAgDQppZiAoaXNzZXQoJF9HRVRbJ2xpc3Rhcl9saW5rcyddKSkgew0KICAgIHJlcXVpcmVfb25jZSgiY29udHJvbGVzL2NvbmV4YW8ucGhwIik7DQogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsNCg0KICAgIC8vIFJlY2ViZSBvcyBkYWRvcyBkYSByZXF1aXNpw6fDo28NCiAgICAkZGFkb3NfcmVxdWlzaWNhbyA9ICRfR0VUOw0KICAgICRjb2x1bmFzID0gWw0KICAgICAgICAgICAgMCA9PiAnSUQnLA0KICAgICAgICAgICAgMSA9PiAnbG9nbycsDQogICAgICAgICAgICAyID0+ICdub21lX2xpbmsnLA0KICAgICAgICAgICAgMyA9PiAnU2lub3BzZScsDQogICAgICAgICAgICA0ID0+ICdub21lJw0KICAgICAgICBdOw0KICAgIC8vIFF1ZXJ5IHBhcmEgY29udGFyIG8gbsO6bWVybyBkZSByZWdpc3Ryb3MNCiAgICAkcXVlcnlfY291bnQgPSAiU0VMRUNUIENPVU5UKGwuaWRfbGluaykgQVMgcW50X2xpbmsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBsaW5rIGwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBjYXRlZ29yaWEgYyBPTiBjLmlkID0gbC5pZF9jYXRlZ29yaWENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAoYy5ub21lIGxpa2UgJyVDQU5BSVMgfCUnIE9SIGMubm9tZSBsaWtlICclQ0FOQUlTIEAlJyBPUiBjLm5vbWUgbGlrZSAnJTI0IEglJykiOw0KICAgIGlmICghZW1wdHkoJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddKSkgew0KICAgICAgICAkcXVlcnlfY291bnQgLj0gIiBBTkQgKG5vbWVfbGluayBMSUtFIDpub21lX2xpbmspIjsNCiAgICB9DQoNCiAgICAkcXVlcnlfY291bnQgPSAkY29uZXhhbzItPnByZXBhcmUoJHF1ZXJ5X2NvdW50KTsNCiAgICBpZiAoIWVtcHR5KCRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSkpIHsNCiAgICAgICAgJHZhbG9yX3Blc3EgPSAiJSIgLiAkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10gLiAiJSI7DQogICAgICAgICRxdWVyeV9jb3VudC0+YmluZFZhbHVlKCc6bm9tZV9saW5rJywgJHZhbG9yX3Blc3EpOw0KICAgIH0NCiAgICAkcXVlcnlfY291bnQtPmV4ZWN1dGUoKTsNCiAgICAkcmVzdWx0X2NvdW50ID0gJHF1ZXJ5X2NvdW50LT5mZXRjaChQRE86OkZFVENIX0FTU09DKTsNCg0KICAgICRpbmljaW8gPSAoaW50KSRkYWRvc19yZXF1aXNpY2FvWydzdGFydCddOw0KICAgICRxdWFudGlkYWRlID0gKGludCkkZGFkb3NfcmVxdWlzaWNhb1snbGVuZ3RoJ107DQoNCiAgICAvLyBRdWVyeSBwYXJhIGxpc3RhciBvcyByZWdpc3Ryb3MgY29tIHBhZ2luYcOnw6NvDQogICAgJGxpc3RfcXVlcnkgPSAiU0VMRUNUIGwuKiwgYy5ub21lIGFzIG5vbWUgDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGxpbmsgbCAgDQogICAgICAgICAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGNhdGVnb3JpYSBjIE9OIGMuaWQgPSBsLmlkX2NhdGVnb3JpYSANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIChjLm5vbWUgbGlrZSAnJUNBTkFJUyB8JScgT1IgYy5ub21lIGxpa2UgJyVDQU5BSVMgQCUnIE9SIGMubm9tZSBsaWtlICclMjQgSCUnKSI7DQoNCiAgICBpZiAoIWVtcHR5KCRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSkpIHsNCiAgICAgICAgJGxpc3RfcXVlcnkgLj0gIiBBTkQgKG5vbWVfbGluayBMSUtFIDpub21lX2xpbmspICI7DQogICAgfQ0KDQogICAgJGxpc3RfcXVlcnkgLj0gIiBPUkRFUiBCWSAiIC4gJGNvbHVuYXNbJGRhZG9zX3JlcXVpc2ljYW9bJ29yZGVyJ11bMF1bJ2NvbHVtbiddXSAuICIgIiAuICRkYWRvc19yZXF1aXNpY2FvWydvcmRlciddWzBdWydkaXInXSAuICIgTElNSVQgOnF1YW50aWRhZGUgT0ZGU0VUIDppbmljaW8iOw0KDQogICAgJGxpc3RfcXVlcnkgPSAkY29uZXhhbzItPnByZXBhcmUoJGxpc3RfcXVlcnkpOw0KICAgICRsaXN0X3F1ZXJ5LT5iaW5kVmFsdWUoJzppbmljaW8nLCAkaW5pY2lvLCBQRE86OlBBUkFNX0lOVCk7DQogICAgJGxpc3RfcXVlcnktPmJpbmRWYWx1ZSgnOnF1YW50aWRhZGUnLCAkcXVhbnRpZGFkZSwgUERPOjpQQVJBTV9JTlQpOw0KDQogICAgaWYgKCFlbXB0eSgkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICR2YWxvcl9wZXNxID0gIiUiIC4gJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddIC4gIiUiOw0KICAgICAgICAkbGlzdF9xdWVyeS0+YmluZFZhbHVlKCc6bm9tZV9saW5rJywgJHZhbG9yX3Blc3EpOw0KICAgIH0NCg0KICAgIC8vIEV4ZWN1dGEgYSBjb25zdWx0YQ0KICAgICRsaXN0X3F1ZXJ5LT5leGVjdXRlKCk7DQoNCiAgICAvLyBQcmVwYXJhIG9zIGRhZG9zIHBhcmEgbyBmb3JtYXRvIEpTT04NCiAgICAkZGFkb3MgPSBbXTsNCiAgICB3aGlsZSAoJHJvdyA9ICRsaXN0X3F1ZXJ5LT5mZXRjaChQRE86OkZFVENIX0FTU09DKSkgew0KICAgICAgICAvLyBSZWdpc3Ryb3MgcGFyYSB0YWJlbGEgY29tIENoaWxkIHJvd3MNCiAgICAgICAgJHJlZ2lzdHJvc19jb21fY2hpbGRzX3Jvd3MgPSBbDQogICAgICAgICAgICAiSUQiICAgICAgID0+ICRyb3dbJ2lkX2xpbmsnXSwNCiAgICAgICAgICAgICJMb2dvIiAgICAgID0+ICc8aW1nIHNyYz0nLiciJy4kcm93Wydsb2dvJ10uJyInLidzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgd2lkdGg6NDVweDsgaGVpZ2h0OjQ1cHg7IiAvPicsDQogICAgICAgICAgICAiVGl0dWxvIiA9PiAkcm93Wydub21lX2xpbmsnXSwNCiAgICAgICAgICAgICJTaW5vcHNlIiA9PiAkcm93WydzaW5vcHNlJ10sDQogICAgICAgICAgICAiQ2F0ZWdvcmlhIiA9PiAkcm93Wydub21lJ10sDQogICAgICAgICAgICAiTGluayIgICAgICA9PiAkcm93WydsaW5rX2xpbmsnXSwNCiAgICAgICAgICAgICJFeGMiICAgICAgPT4gJzxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZS1kYW5nZXIiIG9uY2xpY2s9InJlbW92ZXJDb25maXJtYSgnLiInIi4kcm93WydpZF9saW5rJ10uIiciLicsJy4iJyIuJHJvd1snbm9tZV9saW5rJ10uIiciLicpIj48aSBjbGFzcz0iZmFyIGZhLXRyYXNoLWFsdCI+PC9pPjwvYnV0dG9uPicsDQogICAgICAgICAgICAiQWx0IiAgICAgID0+ICc8dGQ+PGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSIgb25jbGljaz0iZWRpdGFyQ29uZmlybWEoJy4iJyIuJHJvd1snaWRfbGluayddLiInIi4nLCcuIiciLiRyb3dbJ25vbWVfbGluayddLiInIi4nLCcuIiciLiRyb3dbJ2xvZ28nXS4iJyIuJywnLiInIi4kcm93WydsaW5rX2xpbmsnXS4iJyIuJywnLiInIi4kcm93WydpZF9jYXRlZ29yaWEnXS4iJyIuJykiPjxpIGNsYXNzPSJmYXMgZmEtZWRpdCI+PC9pPjwvYnV0dG9uPicNCiAgICAgICAgXTsNCiAgICAgICAgJGRhZG9zW10gPSAkcmVnaXN0cm9zX2NvbV9jaGlsZHNfcm93czsNCiAgICB9DQoNCiAgICAkcmVzdWx0YWRvID0gWw0KICAgICAgICAiZHJhdyIgICAgICAgICAgICA9PiBpbnR2YWwoJGRhZG9zX3JlcXVpc2ljYW9bJ2RyYXcnXSksDQogICAgICAgICJyZWNvcmRzVG90YWwiICAgID0+IGludHZhbCgkcmVzdWx0X2NvdW50WydxbnRfbGluayddKSwNCiAgICAgICAgInJlY29yZHNGaWx0ZXJlZCIgPT4gaW50dmFsKCRyZXN1bHRfY291bnRbJ3FudF9saW5rJ10pLA0KICAgICAgICAiZGF0YSIgICAgICAgICAgICA9PiAkZGFkb3MNCiAgICBdOw0KDQogICAgZWNobyBqc29uX2VuY29kZSgkcmVzdWx0YWRvKTsNCiAgICBleGl0KCk7DQp9DQogPz4NCg0KPD9waHANCiAgICBzZXNzaW9uX3N0YXJ0KCk7DQogICAgcmVxdWlyZV9vbmNlKCJjb250cm9sZXMvdXN1YXJpb3MucGhwIik7DQogICAgcmVxdWlyZV9vbmNlKCJjb250cm9sZXMvbGlua3MucGhwIik7DQogICAgcmVxdWlyZV9vbmNlKCJjb250cm9sZXMvY2F0ZWdvcmlhcy5waHAiKTsNCiAgICAvL2luY2x1ZGUgJ3BhZ2luYXRpb24uY2xhc3MucGhwJzsNCiAgICBpZiAoY2hlY2FyVXN1YXJpbygpKSB7DQogICAgICAgIHJlcXVpcmVfb25jZSgiY2FiZWNhbGhvLnBocCIpOw0KICAgICAgICBpZigkX1NFU1NJT05bJ2FkbWluJ10pew0KICAgICAgICB9DQogICAgICAgIC8vJGxpbmtzID0gbGlzdGFybGlua3MoKTsNCiAgICAgICAgJGNhdGVnb3JpYXMgPSBsaXN0YXJDYXRlZ29yaWFzdGlwbygibGl2ZSIpOw0KDQoNCj8+DQogICAgICAgICAgICA8c3R5bGUgaWQ9ImNoZWNrbWUiPg0KICAgICAgICAgICAgICAgIC5wYWdlLTJjb250ZW50IHsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAyNDBweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNDBweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDwvc3R5bGU+DQogICAgICAgICAgICA8ZGl2IGlkPSJjb250ZXVkby1wYWluZWwiIGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAgICAgICAgIDx0YWJsZSBpZD0iZGF0YV90YWJsZSIgY2xhc3M9ImRpc3BsYXkgb3ZlcmZsb3ctYXV0byB0YWJsZSIgc3R5bGU9IndpZHRoOiAxMDAlOyI+DQogICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9InRhYmxlLWRhcmsiPg0KICAgICAgICAgICAgICAgICAgICA8dHI+PCEtLTx0aD48L3RoPiBkZXNjb21lbnRhciBwYXJhIHVzYXIgY2hpbGRzIC0tPg0KICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCIgPiM8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDUlIiBzY29wZT0iY29sIiA+TG9nbzwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHN0eWxlPSJ3aWR0aDogMjAlIiBzY29wZT0iY29sIiA+VMOtdHVsbzwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHN0eWxlPSJ3aWR0aDogMjAlIiBzY29wZT0iY29sIiA+Q2F0ZWdvcmlhPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc2NvcGU9ImNvbCIgPkxpbms8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDUlIiBzY29wZT0iY29sIj5FeGM8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDUlIiBzY29wZT0iY29sIj5BbHQ8L3RoPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgPC90aGVhZD4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvbWFpbj4NCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii8vY2RuLmRhdGF0YWJsZXMubmV0LzIuMC43L2Nzcy9kYXRhVGFibGVzLmRhdGFUYWJsZXMuY3NzIj4NCjxzY3JpcHQgc3JjPSIvL2Nkbi5kYXRhdGFibGVzLm5ldC8yLjAuNy9qcy9kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogICAgLm92ZXJmbG93LWF1dG8gew0KICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KPHNjcmlwdCA+DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgIC8vIEZ1bsOnw6NvIHBhcmEgYWRpY2lvbmFyIGEgY2xhc3NlICdvdmVyZmxvdy1hdXRvJyDDoCBkaXYgJ2R0LWxheW91dC1jZWxsJw0KICAgIGZ1bmN0aW9uIGFkZE92ZXJmbG93QXV0bygpIHsNCiAgICAgICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGF0YV90YWJsZV93cmFwcGVyIik7DQogICAgICAgIGlmICh3cmFwcGVyKSB7DQogICAgICAgICAgICB2YXIgbGF5b3V0Q2VsbCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcigiLmR0LWxheW91dC10YWJsZSIpOw0KICAgICAgICAgICAgdmFyIGR0X2NvbnRyb2wgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoIi5kdC1jb250cm9sIik7DQogICAgICAgICAgICBpZiAobGF5b3V0Q2VsbCkgew0KICAgICAgICAgICAgICAgIGxheW91dENlbGwuY2xhc3NMaXN0LmFkZCgib3ZlcmZsb3ctYXV0byIpOw0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIkNsYXNzZSAnb3ZlcmZsb3ctYXV0bycgYWRpY2lvbmFkYSDDoCBkaXYgY29tIGEgY2xhc3NlICdkdC1sYXlvdXQtY2VsbCciKTsNCiAgICAgICAgICAgIH1pZiAoZHRfY29udHJvbCkgew0KICAgICAgICAgICAgICAgIGR0X2NvbnRyb2wuY2xhc3NMaXN0LnJlbW92ZSgiZHQtb3JkZXJpbmctZGVzYyIpOw0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIkNsYXNzZSAnZHQtb3JkZXJpbmctZGVzYycgcmVtb3ZpZGEgZGEgdGQgY29tIGEgY2xhc3NlICdkdC1jb250cm9sJyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICAvLyBDcmlhIHVtIE11dGF0aW9uT2JzZXJ2ZXIgcGFyYSBvYnNlcnZhciBhcyBtdWRhbsOnYXMgbm8gRE9NDQogICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obXV0YXRpb25zKSB7DQogICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG11dGF0aW9uKSB7DQogICAgICAgICAgICAvLyBWZXJpZmljYSBzZSBob3V2ZSB1bWEgbXVkYW7Dp2Egbm8gZWxlbWVudG8gY29tIG8gaWQgJ2RhdGFfdGFibGVfd3JhcHBlcicNCiAgICAgICAgICAgIGlmIChtdXRhdGlvbi50YXJnZXQuaWQgPT09ICJkYXRhX3RhYmxlX3dyYXBwZXIiKSB7DQogICAgICAgICAgICAgICAgYWRkT3ZlcmZsb3dBdXRvKCk7IC8vIEFkaWNpb25hIGEgY2xhc3NlICdvdmVyZmxvdy1hdXRvJw0KICAgICAgICAgICAgICAgIC8vZHRfc2VhcmNoKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgLy8gQ29uZmlndXJhIG8gTXV0YXRpb25PYnNlcnZlciBwYXJhIG9ic2VydmFyIG11ZGFuw6dhcyBubyBET00NCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KDQogICAgLy8gVmVyaWZpY2EgZSBhZGljaW9uYSBhIGNsYXNzZSAnb3ZlcmZsb3ctYXV0bycgaW1lZGlhdGFtZW50ZSBhcMOzcyBvIERPTSBzZXIgY2FycmVnYWRvDQogICAgYWRkT3ZlcmZsb3dBdXRvKCk7DQp9KTsNCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgew0KICAgIGZ1bmN0aW9uIGR0X3NlYXJjaCgpIHsNCiAgICAgICAgJCgnI2R0LXNlYXJjaC0wJykuYWRkQ2xhc3MoJ2NvbCBjb2wtbWQtNiBkdC1pbnB1dCBmbG9hdC1sZWZ0IGZvcm0tY29udHJvbCBmb3JtLXJvdycpLmF0dHIoJ3BsYWNlaG9sZGVyJywgJ1Blc3F1aXNhci4uLicpOw0KICAgICAgICAkKCcuZHQtc2VhcmNoJykuYWRkQ2xhc3MoJ2Zvcm0tcm93IGQtYmxvY2snKTsNCiAgICAgICAgdmFyIGxhYmVsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj0iZHQtc2VhcmNoLTAiXScpOw0KICAgICAgICBpZiAobGFiZWxFbGVtZW50KSB7DQogICAgICAgICAgICBsYWJlbEVsZW1lbnQucmVtb3ZlKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBTZWxlY2lvbmEgdG9kb3Mgb3MgZWxlbWVudG9zIGNvbSBhIGNsYXNzZSAnLmR0LXNlYXJjaCcNCiAgICAgICAgdmFyIGR0U2VhcmNoRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHQtc2VhcmNoJyk7DQogICAgICAgIGNvbnN0IG5vdm9fY2FuYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm92b19jYW5hbCcpOw0KDQogICAgICAgIGlmICghbm92b19jYW5hbCkgew0KDQogICAgICAgICAgICAvLyBJdGVyYSBzb2JyZSBjYWRhIGVsZW1lbnRvIGVuY29udHJhZG8NCiAgICAgICAgICAgIGR0U2VhcmNoRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihkdFNlYXJjaEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAvLyBTZWxlY2lvbmEgbyBpbnB1dCBkZW50cm8gZGUgY2FkYSBlbGVtZW50byAnLmR0LXNlYXJjaCcNCiAgICAgICAgICAgICAgICB2YXIgaW5wdXRFbGVtZW50ID0gZHRTZWFyY2hFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7DQoNCiAgICAgICAgICAgICAgICAvLyBBZGljaW9uYSBhIGNsYXNzZSAnZm9ybS1yb3cnIGFvIGlucHV0DQogICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9ybS1yb3cnKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBDcmlhIG8gZWxlbWVudG8gPGk+IGNvbSBvcyBhdHJpYnV0b3MgZXNwZWNpZmljYWRvcw0KICAgICAgICAgICAgICAgICAgICB2YXIgbm92b0VsZW1lbnRvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpOw0KICAgICAgICAgICAgICAgICAgICBub3ZvRWxlbWVudG8uaW5uZXJIVE1MID0gJyBOb3ZvJzsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLmNsYXNzTmFtZSA9ICdidG4gYnRuLW91dGxpbmUtaW5mbyBjb2wgY29sLW1kLTIgZmEtdXNlci1wbHVzIGZhcyBmbG9hdC1yaWdodCB0ZXh0LWRhcmsnOw0KICAgICAgICAgICAgICAgICAgICBub3ZvRWxlbWVudG8uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7DQogICAgICAgICAgICAgICAgICAgIG5vdm9FbGVtZW50by5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25vdm9fY2FuYWwnKTsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLnNldEF0dHJpYnV0ZSgnb25jbGljaycsICIkKCcjY2FkYXN0cm8nKS5tb2RhbCgpIik7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJlIG8gbm92byBlbGVtZW50byBhcMOzcyBvIGlucHV0DQogICAgICAgICAgICAgICAgICAgIGlucHV0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub3ZvRWxlbWVudG8sIGlucHV0RWxlbWVudC5uZXh0U2libGluZyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHRhYmxlID0gJCgnI2RhdGFfdGFibGUnKS5EYXRhVGFibGUoew0KICAgICAgICBhamF4OiAnP2xpc3Rhcl9saW5rcycsDQogICAgICAgIHByb2Nlc3Npbmc6IHRydWUsDQogICAgICAgIHNlcnZlclNpZGU6IHRydWUsDQogICAgICAgIGxhbmd1YWdlOiB7DQogICAgICAgIHVybDogJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuMTMvaTE4bi9Qb3J0dWd1ZXNlLUJyYXNpbC5qc29uJw0KICAgIH0sDQogICAgICAgIHNlYXJjaDogew0KICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogIlBlc3F1aXNhci4uLiIgLy8gUGxhY2Vob2xkZXIgcGFyYSBvIGNhbXBvIGRlIHBlc3F1aXNhDQogICAgICAgIH0sICAgICAgICANCiAgICBsYXlvdXQ6IHsNCiAgICAgICAgdG9wU3RhcnQ6IG51bGwsDQogICAgICAgIGJvdHRvbTogJ3BhZ2luZycsDQogICAgICAgIGJvdHRvbVN0YXJ0OiAiaW5mbyIsDQogICAgICAgIGJvdHRvbUVuZDogbnVsbA0KICAgIH0sDQogICAgICAgIGNvbHVtbnM6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBkYXRhOiAiSUQiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwgLy8gSUQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJMb2dvIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sIC8vIFVSTA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkYXRhOiAiVGl0dWxvIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy9vcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJDYXRlZ29yaWEiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJMaW5rIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkYXRhOiAiRXhjIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciBhY2FvIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJBbHQiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIGFjYW8iDQogICAgICAgICAgICB9LCAvLyBMb2dvIFVSTA0KICAgICAgICAgICAgLyp7IG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICBkYXRhOiBudWxsLCAvLyBBw6fDtWVzIChuZW5odW1hIGRhdGEgYXNzb2NpYWRhKQ0KICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsNCiAgICAgICAgICAgICAgYm90YW9fZWRpdGFyID0gJzxhIGlkPSInICsgcm93LmlkICsgJyIgY2xhc3M9ImJ0biBidG4taW5mbyBidG4tc20iPkVESVRBUjwvYT4nOw0KICAgICAgICAgICAgICBib3Rhb19leGNsdWlyID0gJzxhIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4tc20iPkV4Y2x1aXI8L2E+JzsNCiAgICAgICAgICAgIHJldHVybiBib3Rhb19lZGl0YXIgKyBib3Rhb19leGNsdWlyOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSovDQogICAgICAgIF0sDQogICAgb3JkZXI6IFtbMiwgJ2FzYyddXSwNCiAgICBkcmF3Q2FsbGJhY2s6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgLy8gQ2FsbGJhY2sgY2hhbWFkbyBhcMOzcyBjYWRhIGRlc2VuaG8gZGEgdGFiZWxhIChpbmNsdXNpdmUgaW5pY2lhbGl6YcOnw6NvKQ0KICAgICAgICAgICAgZHRfc2VhcmNoKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICB9KTsNCiAvLyBBZGljaW9uYSBhIGNsYXNzZSAnZm9ybS1jb250cm9sJyBhbyBjYW1wbyBkZSBwZXNxdWlzYQ0KDQo8L3NjcmlwdD4NCiAgICA8IS0tIHBhZ2UtY29udGVudCIgLS0+DQo8L2Rpdj4NCjwhLS0gQ2FkYXN0cm8gSW5pY2lvIC0tPg0KPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNhZGFzdHJvIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDYWRhc3RyYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkFkaWNpb25hciBDb250ZcO6ZG88L2g1Pg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkZlY2hhciI+DQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBzdHlsZT0ibWF4LWhlaWdodDo0NjBweDsgb3ZlcmZsb3cteTphdXRvOyI+DQogICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImNhZGFzdHJvLWZvcm0iPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vbWU6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0ibm9tZSIgcGxhY2Vob2xkZXI9Ik5vbWUgZG8gTGluayIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TG9nbzo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJsb2dvIiBwbGFjZWhvbGRlcj0iTGluayBkYSBJbWFnZW0iIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlVybDo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJsaW5rIiBwbGFjZWhvbGRlcj0iVXJsIGRvIExpbmsiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0ic2lub3BzZSIgcGxhY2Vob2xkZXI9IlNpbm9wc2UgZG8gQ29udGXDumRvIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DYXRlZ29yw61hOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWwtMCByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJzZWxlY3RwaWNrZXIiIHRpdGxlPSJDYXRlZ29yaWEiIG5hbWU9ImNhdGVnb3JpYSIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRjYXRlZ29yaWFzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkY2F0ZWdvcmlhcyBhcyAkY2F0ZWdvcmlhKSB7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD89ICRjYXRlZ29yaWFbJ2lkJ10/PiIgPiA8Pz0gJGNhdGVnb3JpYVsnbm9tZSddPz4gPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPg0KCQkJCTxidXR0b24gdHlwZT0ic3VibWl0IiBmb3JtPSJjYWRhc3Ryby1mb3JtIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5BZGljaW9uYXI8L2J1dHRvbj4NCgkJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5GZWNoYXI8L2J1dHRvbj4NCgkJCTwvZGl2PiAgICAgICAgICAgIA0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KPCEtLSBDYWRhc3RybyBGaW0tLT4NCjwhLS0gUmVtb3ZlIEluaWNpbyAtLT4NCjxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJyZW1vdmVyIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDYWRhc3RyYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPlRlbSBjZXJ0ZXphPzwvaDU+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iRmVjaGFyIj4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgaWQ9InJlbW92ZXItY29udGV1ZG8iIGNsYXNzPSJtb2RhbC1ib2R5Ij48L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQo8L2Rpdj4NCjwhLS0gUmVtb3ZlIEZpbS0tPg0KPCEtLSBFZGl0YSBJbmljaW8gLS0+DQo8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZWRpdGFyIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDYWRhc3RyYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkVkaXRhciBDb250ZcO6ZG88L2g1Pg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkZlY2hhciI+DQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBzdHlsZT0ibWF4LWhlaWdodDo0NjBweDsgb3ZlcmZsb3cteTphdXRvOyI+DQogICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImVkaXRhci1mb3JtIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImlkIiBpZD0iaWRFIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Ob21lOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJub21lRSIgbmFtZT0ibm9tZSIgcGxhY2Vob2xkZXI9Ik5vbWUgZG8gTGluayIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TG9nbzo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0ibG9nb0UiIG5hbWU9ImxvZ28iIHBsYWNlaG9sZGVyPSJMaW5rIGRhIEltYWdlbSIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VXJsOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJsaW5rRSIgbmFtZT0ibGluayIgcGxhY2Vob2xkZXI9IlVybCBkbyBMaW5rIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DYXRlZ29yw61hOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWwtMCByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJzZWxlY3RwaWNrZXIiIHRpdGxlPSJDYXRlZ29yw61hIiBpZD0iY2F0ZWdvcmlhRSIgbmFtZT0iY2F0ZWdvcmlhIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCAgaWYgKCRjYXRlZ29yaWFzKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGNhdGVnb3JpYXMgYXMgJGNhdGVnb3JpYSkgez8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/PSAkY2F0ZWdvcmlhWydpZCddPz4iID4gPD89ICRjYXRlZ29yaWFbJ25vbWUnXT8+IDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDwvZGl2Pg0KCQkJPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4NCgkJCQk8YnV0dG9uIHR5cGU9InN1Ym1pdCIgZm9ybT0iZWRpdGFyLWZvcm0iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkVkaXRhcjwvYnV0dG9uPg0KCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkZlY2hhcjwvYnV0dG9uPg0KCQkJPC9kaXY+ICAgICAgICAgICAgDQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KPC9kaXY+DQo8IS0tIEVkaXRhIEZpbS0tPg0KPC9ib2R5Pg0KPHNjcmlwdD4NCiAgICBmdW5jdGlvbiByZW1vdmVyQ29uZmlybWEoaWQsbm9tZSkgew0KICAgICAgICAkKCcjcmVtb3Zlci1jb250ZXVkbycpLmh0bWwoJzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRhbmdlciIgcm9sZT0iYWxlcnQiPjxzdHJvbmc+IFJlbW92ZXIgPC9zdHJvbmc+JyArIG5vbWUgKyAnPzwvZGl2PjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgZmxvYXQtcmlnaHQiIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5GZWNoYXI8L2J1dHRvbj48YnV0dG9uIG9uY2xpY2s9InJlbW92ZXIoJyArIGlkICsgJykiIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGZsb2F0LXJpZ2h0Ij5SZW1vdmVyPC9idXR0b24+Jyk7DQogICAgICAgICQoJyNyZW1vdmVyJykubW9kYWwoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gZWRpdGFyQ29uZmlybWEoaWQsbm9tZSwgbG9nbywgbGluaywgY2F0ZWdvcmlhKSB7DQogICAgICAgICQoJyNpZEUnKS52YWwoaWQpOw0KICAgICAgICAkKCcjbm9tZUUnKS52YWwobm9tZSk7DQogICAgICAgICQoJyNsb2dvRScpLnZhbChsb2dvKTsNCiAgICAgICAgJCgnI2xpbmtFJykudmFsKGxpbmspOw0KICAgICAgICBpZiAoY2F0ZWdvcmlhICE9PSAiIikgew0KICAgICAgICAgICQoJyNjYXRlZ29yaWFFJykudmFsKGNhdGVnb3JpYSk7DQogICAgICAgICAgJCgnI2NhdGVnb3JpYUUnKS5zZWxlY3RwaWNrZXIoJ3JlbmRlcicpOw0KICAgICAgICB9DQogICAgICAgICQoJyNlZGl0YXInKS5tb2RhbCgpOw0KICAgIH0NCiAgICBmdW5jdGlvbiByZW1vdmVyKGlkKSB7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgICAgICB1cmw6ICJjb250cm9sZXMvcmVtb3Zlci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiB7aWQ6IGlkfSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAkKCIjcmVtb3ZlciIpLm1vZGFsKCdoaWRlJyk7DQogICAgICAgICAgICAgICAgZGF0YV90YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYWdpbmFfYXR1YWwgPSBkYXRhX3RhYmxlLnBhZ2UoKTsgLy8gQXJtYXplbmEgYSBww6FnaW5hIGF0dWFsDQogICAgICAgICAgICAgICAgICAgIC8vIEF0dWFsaXphIGEgdGFiZWxhDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUuZHJhdygpOw0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXVyYSBhIHDDoWdpbmEgYXDDs3MgYSBhdHVhbGl6YcOnw6NvDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUucGFnZShwYWdpbmFfYXR1YWwpLmRyYXcoJ3BhZ2UnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KICAgICQoICIjY2FkYXN0cm8tZm9ybSIgKS5zdWJtaXQoZnVuY3Rpb24oIGV2ZW50ICkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL2FkaWNpb25hci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiAkKCIjY2FkYXN0cm8tZm9ybSIpLnNlcmlhbGl6ZSgpLA0KICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICAgICAgICAgICQoIiNjYWRhc3RybyIpLm1vZGFsKCdoaWRlJyk7DQogICAgICAgICAgICAgICAgZGF0YV90YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYWdpbmFfYXR1YWwgPSBkYXRhX3RhYmxlLnBhZ2UoKTsgLy8gQXJtYXplbmEgYSBww6FnaW5hIGF0dWFsDQogICAgICAgICAgICAgICAgICAgIC8vIEF0dWFsaXphIGEgdGFiZWxhDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUuZHJhdygpOw0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXVyYSBhIHDDoWdpbmEgYXDDs3MgYSBhdHVhbGl6YcOnw6NvDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUucGFnZShwYWdpbmFfYXR1YWwpLmRyYXcoJ3BhZ2UnKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHsNCiAgICAgICAgICAgICAgcmVzdWx0YWRvKGRhdGEucmVzcG9uc2VUZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgfSk7DQogICAgJCggIiNlZGl0YXItZm9ybSIgKS5zdWJtaXQoZnVuY3Rpb24oIGV2ZW50ICkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL2VkaXRhci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiAkKCIjZWRpdGFyLWZvcm0iKS5zZXJpYWxpemUoKSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAkKCIjZWRpdGFyIikubW9kYWwoJ2hpZGUnKTsNCiAgICAgICAgICAgICAgICBkYXRhX3RhYmxlID0gJCgnI2RhdGFfdGFibGUnKS5EYXRhVGFibGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2luYV9hdHVhbCA9IGRhdGFfdGFibGUucGFnZSgpOyAvLyBBcm1hemVuYSBhIHDDoWdpbmEgYXR1YWwNCiAgICAgICAgICAgICAgICAgICAgLy8gQXR1YWxpemEgYSB0YWJlbGENCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5kcmF3KCk7DQogICAgICAgICAgICAgICAgICAgIC8vIFJlc3RhdXJhIGEgcMOhZ2luYSBhcMOzcyBhIGF0dWFsaXphw6fDo28NCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5wYWdlKHBhZ2luYV9hdHVhbCkuZHJhdygncGFnZScpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkgew0KICAgICAgICAgICAgICByZXN1bHRhZG8oZGF0YS5yZXNwb25zZVRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICB9KTsNCiAgICBzcGVlZF90b190b3AgPSAxMDAwOyAgIA0KICAgICQoJyN0b3RvcCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgJCgnYm9keSxodG1sJykuYW5pbWF0ZSh7DQogICAgICAgICAgICBzY3JvbGxUb3A6IDANCiAgICAgICAgfSwgc3BlZWRfdG9fdG9wKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0pOw0KICAgICQoJyN0b3RvcCcpLmhpZGUoKTsNCiAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKCQodGhpcykuc2Nyb2xsVG9wKCkgPiA1MCkgew0KICAgICAgICAgICAgJCgnI3RvdG9wJykuZmFkZUluKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkKCcjdG90b3AnKS5mYWRlT3V0KCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KPC9zY3JpcHQ+DQo8P3BocCANCiAgICByZXF1aXJlX29uY2UoImNvbXVtLnBocCIpOw0KICAgIHJlcXVpcmVfb25jZSgiYWxlcnRhLnBocCIpOyANCj8+DQo8L2h0bWw+DQo8P3BocCANCn0gZWxzZSB7DQogICAgaGVhZGVyKCJMb2NhdGlvbjogbG9naW4iKTsNCiAgICBkaWUoKTsNCn0NCj8+"));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program
Function Calls
base64_decode | 1 |
Stats
MD5 | 8eb6d5b700c9de9e619440c1fab8823a |
Eval Count | 1 |
Decode Time | 347 ms |