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("PD9waHANCg0KbmFtZXNwYWNlIEFwcFxDb250cm9sbGVyczsNCg0KdXNlIEF..
Decoded Output download
?>b'<?php
namespace App\Controllers;
use App\Models\HistoryModel;
use App\Models\KeysModel;
use App\Models\UserModel;
use Config\Services;
class Keys extends BaseController
{
protected $userModel, $model, $user,$userId;
public function __construct()
{
$this->userModel = new UserModel();
$this->user = $this->userModel->getUser();
$this->model = new KeysModel();
$this->time = new \CodeIgniter\I18n\Time;
$this->userId=session()->get( \'userid\');
/* ------- Game ------- */
$this->game_list = [
\'PUBG\' => \'Mobile Legends\',
];
$this->duration = [
1 => \'1 Hours — $10/Device\',
5 => \'5 Hours — $20/Device\',
24 => \'1 Days — $40/Device\',
72 => \'3 Days — $100/Device\',
168 => \'7 Days — $170/Device\',
336 => \'14 Days — $300/Device\',
720 => \'30 Days — $500/Device\',
1440 => \'60 Days — $800/Device\',
];
$this->price = [
1 => 10,
5 => 20,
24 => 40,
72 => 100,
168 => 170,
336 => 300,
720 => 500,
1440 => 800,
];
}
public function index()
{
$model = $this->model;
$user = $this->user;
if ($user->level != 1) {
$keys = $model->where(\'registrator\', $user->username)
->findAll();
} else {
$keys = $model->select(\'user_key\')->findAll() ;
}
$data = [
\'title\' => \'Keys\',
\'user\' => $user,
\'keylist\' => $keys,
\'time\' => $this->time,
];
return view(\'Keys/list\', $data);
}
public function download_all_Keys(){
$model = $this->model;
$user = $this->user;
$keys = $model->select(\'user_key\')->findAll();
$data=\'\';
for($i=0;$i<count($keys);$i++){
$data.=$keys[$i][\'user_key\']."\n";
}
write_file(\'Newkeys.txt\', $data);
$this->downloadFile(\'Newkeys.txt\');
}
public function download_new_Keys(){
$this->downloadFile(\'new.txt\');
}
function downloadFile($yourFile){
// $yourFile = "newName.txt";
$file = @fopen($yourFile, "rb");
header(\'Content-Description: File Transfer\');
header(\'Content-Type: application/octet-stream\');
header(\'Content-Disposition: attachment; filename=Allkeys.txt\');
header(\'Expires: 0\');
header(\'Cache-Control: must-revalidate\');
header(\'Pragma: public\');
header(\'Content-Length: \' . filesize($yourFile));
while (!feof($file)) {
print(@fread($file, 1024 * 8));
ob_flush();
flush();
}
}
public function expired_delete(){
$model=$this->model;
$data=$model->where(\'expired_date <\', date(\'Y-m-d H:i:s\'))->delete();
return redirect()->back()->with(\'msgSuccess\', \'success\');
}
public function all_delete(){
echo date(\'Y-m-d H:i:s\');
$model=$this->model;
$data=$model->emptyTable(\'keys_code\');
return redirect()->back()->with(\'msgSuccess\', \'success\');
}
public function one_delete(){
$model=$this->model;
$keys = $this->request->getGet(\'userkey\');
$data=$model->where(\'user_key\', $keys)->delete();
print_r($data);
return redirect()->back()->with(\'msgSuccess\', \'success\');
}
//delete wasted keys
public function unused_delete(){
echo date(\'Y-m-d H:i:s\');
$model=$this->model;
$data=$model->where(\'expired_date =\'.null)->delete();
return redirect()->back()->with(\'msgSuccess\', \'success\');
}
public function api_get_keys()
{
// ? API for DataTable Keys
$model = $this->model;
return $model->API_getKeys();
}
public function api_key_reset()
{
sleep(1);
$model = $this->model;
$keys = $this->request->getGet(\'userkey\');
$reset = $this->request->getGet(\'reset\');
$db_key = $model->getKeys($keys);
$rules = [];
if ($db_key) {
$total = $db_key->devices ? explode(\',\', $db_key->devices) : [];
$rules = [\'devices_total\' => count($total), \'devices_max\' => (int) $db_key->max_devices];
$user = $this->user;
if ($db_key->devices and $reset) {
if ($user->level == 1 or $db_key->registrator == $user->username) {
$model->set(\'devices\', NULL)
->where(\'user_key\', $keys)
->update();
$rules = [\'reset\' => true, \'devices_total\' => 0, \'devices_max\' => $db_key->max_devices];
}
} else {
}
}
$data = [
\'registered\' => $db_key ? true : false,
\'keys\' => $keys,
];
$real_response = array_merge($data, $rules);
return $this->response->setJSON($real_response);
}
public function edit_key($key = false)
{
if ($this->request->getPost()) return $this->edit_key_action();
$msgDanger = "The user key no longer exists.";
if ($key) {
$dKey = $this->model->getKeys($key, \'id_keys\');
$user = $this->user;
if ($dKey) {
if ($user->level == 1 or $dKey->registrator == $user->username) {
$validation = Services::validation();
$data = [
\'title\' => \'Key\',
\'user\' => $user,
\'key\' => $dKey,
\'game_list\' => $this->game_list,
\'time\' => $this->time,
\'key_info\' => getDevice($dKey->devices),
\'messages\' => setMessage(\'Please carefuly edit information\'),
\'validation\' => $validation,
];
return view(\'Keys/key_edit\', $data);
} else {
$msgDanger = "Restricted to this user key.";
}
}
}
return redirect()->to(\'keys\')->with(\'msgDanger\', $msgDanger);
}
private function edit_key_action()
{
$keys = $this->request->getPost(\'id_keys\');
$user = $this->user;
$dKey = $this->model->getKeys($keys, \'id_keys\');
$game = implode(",", array_keys($this->game_list));
if (!$dKey) {
$msgDanger = "The user key no longer exists~";
} else {
if ($user->level == 1 or $dKey->registrator == $user->username) {
$form_reseller = [
\'status\' => [
\'label\' => \'status\',
\'rules\' => \'required|integer|in_list[0,1]\',
\'erros\' => [
\'integer\' => \'Invalid {field}.\',
\'in_list\' => \'Choose between list.\'
]
]
];
$form_admin = [
\'id_keys\' => [
\'label\' => \'keys\',
\'rules\' => \'required|is_not_unique[keys_code.id_keys]|numeric\',
\'errors\' => [
\'is_not_unique\' => \'Invalid keys.\'
],
],
\'game\' => [
\'label\' => \'Games\',
\'rules\' => "required|alpha_numeric_space|in_list[$game]",
\'errors\' => [
\'alpha_numeric_space\' => \'Invalid characters.\'
],
],
\'user_key\' => [
\'label\' => \'User keys\',
\'rules\' => "required|is_unique[keys_code.user_key,user_key,$dKey->user_key]|alpha_numeric",
\'errors\' => [
\'is_unique\' => \'{field} has been taken.\'
],
],
\'duration\' => [
\'label\' => \'duration\',
\'rules\' => \'required|numeric|greater_than_equal_to[1]\',
\'errors\' => [
\'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
\'numeric\' => \'Invalid hours {field}.\'
]
],
\'max_devices\' => [
\'label\' => \'devices\',
\'rules\' => \'required|numeric|greater_than_equal_to[1]\',
\'errors\' => [
\'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
\'numeric\' => \'Invalid max of {field}.\'
]
],
\'registrator\' => [
\'label\' => \'registrator\',
\'rules\' => \'permit_empty|alpha_numeric_space|min_length[4]\'
],
\'expired_date\' => [
\'label\' => \'expired\',
\'rules\' => \'permit_empty|valid_date[Y-m-d H:i:s]\',
\'errors\' => [
\'valid_date\' => \'Invalid {field} date.\',
]
],
\'devices\' => [
\'label\' => \'device list\',
\'rules\' => \'permit_empty\'
]
];
if ($user->level == 1) {
// Admin full rules.
$form_rules = array_merge($form_reseller, $form_admin);
$devices = $this->request->getPost(\'devices\');
$max_devices = $this->request->getPost(\'max_devices\');
$data_saves = [
\'game\' => $this->request->getPost(\'game\'),
\'user_key\' => $this->request->getPost(\'user_key\'),
\'duration\' => $this->request->getPost(\'duration\'),
\'max_devices\' => $max_devices,
\'status\' => $this->request->getPost(\'status\'),
\'registrator\' => $this->request->getPost(\'registrator\'),
\'expired_date\' => $this->request->getPost(\'expired_date\') ?: NULL,
\'devices\' => setDevice($devices, $max_devices),
];
} else {
// Reseller just status rules, you can set manually later.
$form_rules = $form_reseller;
$data_saves = [\'status\' => $this->request->getPost(\'status\')];
}
if (!$this->validate($form_rules)) {
return redirect()->back()->withInput()->with(\'msgDanger\', \'Failed! Please check the error\');
} else {
// * Data Updates
$this->model->update($dKey->id_keys, $data_saves);
return redirect()->back()->with(\'msgSuccess\', \'User key successfuly updated!\');
}
} else {
$msgDanger = "Restricted to this user key~";
}
}
return redirect()->to(\'keys\')->with(\'msgDanger\', $msgDanger);
}
public function generate()
{
if ($this->request->getPost())
return $this->generate_action();
$user = $this->user;
$validation = Services::validation();
$message = setMessage("<i class=\'bi bi-wallet\'></i> Total Saldo $$user->saldo");
if ($user->saldo <= 0) {
$message = setMessage("Please top up to your beloved admin.", \'warning\');
}
$data = [
\'title\' => \'Generate\',
\'user\' => $user,
\'time\' => $this->time,
\'game\' => $this->game_list,
\'duration\' => $this->duration,
\'price\' => json_encode($this->price),
\'messages\' => $message,
\'validation\' => $validation,
];
return view(\'Keys/generate\', $data);
}
private function generate_action()
{
$user = $this->user;
$game = $this->request->getPost(\'game\');
$maxd = $this->request->getPost(\'max_devices\');
$drtn = $this->request->getPost(\'duration\');
$twst = $this->request->getPost(\'custominput\');
$cuslicense = $this->request->getPost(\'cuslicense\');
$getPrice = getPrice($this->price, $drtn, $maxd);
$loopcount = $this->request->getPost(\'loopcount\');
if ($loopcount == "1"){
$loopcount = 6;
}
else if ($loopcount == "2"){
$loopcount = 11;
}
else if ($loopcount == "3"){
$loopcount = 51;
}
else if ($loopcount == "4"){
$loopcount = 101;
}
else if ($loopcount == "5"){
$loopcount = 2;
}
$game_list = implode(",", array_keys($this->game_list));
$form_rules = [
\'game\' => [
\'label\' => \'Games\',
\'rules\' => "required|alpha_numeric_space|in_list[$game_list]",
\'errors\' => [
\'alpha_numeric_space\' => \'Invalid characters.\'
],
],
\'duration\' => [
\'label\' => \'duration\',
\'rules\' => \'required|numeric|greater_than_equal_to[1]\',
\'errors\' => [
\'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
\'numeric\' => \'Invalid hours {field}.\'
]
],
\'max_devices\' => [
\'label\' => \'devices\',
\'rules\' => \'required|numeric|greater_than_equal_to[1]\',
\'errors\' => [
\'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
\'numeric\' => \'Invalid max of {field}.\'
]
],
];
$validation = Services::validation();
$reduceCheck = ($user->saldo - $getPrice);
// dd($reduceCheck);
if ($reduceCheck < 0) {
$validation->setError(\'duration\', \'Insufficient balance\');
return redirect()->back()->withInput()->with(\'msgWarning\', \'Please top up to your beloved admin.\');
} else {
if (!$this->validate($form_rules)) {
return redirect()->back()->withInput()->with(\'msgDanger\', \'Failed! Please check the error\');
} else {
//================================================//
//for($i = 1; $i < $loopcount; $i++) {
//}
// echo "$license <br>BHATIA<br>";
//================================================//
$msg = "Successfuly Generated.";
$data=\'\';
// * reseller reduce saldo
for($i=1;$i<$loopcount;$i++){
$license = $drtn. \'x\'. $user->username.\'x\'. random_string(\'alnum\', 5);
$model = $this->model;
if ($twst == "custom") {
if (strlen($cuslicense) > 3 && strlen($cuslicense) < 20){
$findKey = $model
->getKeysGame([\'user_key\' => $cuslicense, \'game\' => $game]);
if ($findKey) {
return redirect()->back()->with(\'msgDanger\', \'Key already exists!!\');
} else {
$license = $cuslicense;
}
} else {
return redirect()->back()->with(\'msgDanger\', \'Custom Key is too Short/Long\');
}
}
$data_response = [
\'game\' => $game,
\'user_key\' => $license,
\'duration\' => $drtn,
\'max_devices\' => $maxd,
\'registrator\' => $user->username,
\'test\' => $twst,
];
$data.=$license."\n";
$idKeys = $this->model->insert($data_response);
}
write_file(\'new.txt\', $data);///
// $this->downloadFile(\'new.txt\');
$this->userModel->update(session(\'userid\'), [\'saldo\' => $reduceCheck]);
$history = new HistoryModel();
$history->insert([
\'keys_id\' => $idKeys,
\'user_do\' => $user->username,
\'info\' => "$game|" . substr($license, 0, 5) . "|$drtn|$maxd"
]);
$other_response = [
\'fees\' => $getPrice
];
session()->setFlashdata(array_merge($data_response, $other_response));
return redirect()->back()->with(\'msgSuccess\', $msg);
}
}
}
}
'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCg0KbmFtZXNwYWNlIEFwcFxDb250cm9sbGVyczsNCg0KdXNlIEFwcFxNb2RlbHNcSGlzdG9yeU1vZGVsOw0KdXNlIEFwcFxNb2RlbHNcS2V5c01vZGVsOw0KdXNlIEFwcFxNb2RlbHNcVXNlck1vZGVsOw0KdXNlIENvbmZpZ1xTZXJ2aWNlczsNCg0KY2xhc3MgS2V5cyBleHRlbmRzIEJhc2VDb250cm9sbGVyDQp7DQogICAgcHJvdGVjdGVkICR1c2VyTW9kZWwsICRtb2RlbCwgJHVzZXIsJHVzZXJJZDsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgICAgICAkdGhpcy0+dXNlck1vZGVsID0gbmV3IFVzZXJNb2RlbCgpOw0KICAgICAgICAkdGhpcy0+dXNlciA9ICR0aGlzLT51c2VyTW9kZWwtPmdldFVzZXIoKTsNCiAgICAgICAgJHRoaXMtPm1vZGVsID0gbmV3IEtleXNNb2RlbCgpOw0KICAgICAgICAkdGhpcy0+dGltZSA9IG5ldyBcQ29kZUlnbml0ZXJcSTE4blxUaW1lOw0KDQogICAgICR0aGlzLT51c2VySWQ9c2Vzc2lvbigpLT5nZXQoICd1c2VyaWQnKTsNCiAgICAgICAgLyogLS0tLS0tLSBHYW1lIC0tLS0tLS0gKi8NCiAgICAgICAgJHRoaXMtPmdhbWVfbGlzdCA9IFsNCiAgICAgICAgICAgICdQVUJHJyA9PiAnTW9iaWxlIExlZ2VuZHMnLA0KICAgICAgICBdOw0KDQogICAgICAgICAkdGhpcy0+ZHVyYXRpb24gPSBbDQogICAgICAgICAgICAxID0+ICcxIEhvdXJzICZtZGFzaDsgJDEwL0RldmljZScsDQogICAgICAgICAgICA1ID0+ICc1IEhvdXJzICZtZGFzaDsgJDIwL0RldmljZScsDQogICAgICAgICAgICAyNCA9PiAnMSBEYXlzICZtZGFzaDsgJDQwL0RldmljZScsDQogICAgICAgICAgICA3MiA9PiAnMyBEYXlzICZtZGFzaDsgJDEwMC9EZXZpY2UnLA0KICAgICAgICAgICAgMTY4ID0+ICc3IERheXMgJm1kYXNoOyAkMTcwL0RldmljZScsDQogICAgICAgICAgICAzMzYgPT4gJzE0IERheXMgJm1kYXNoOyAkMzAwL0RldmljZScsDQogICAgICAgICAgICA3MjAgPT4gJzMwIERheXMgJm1kYXNoOyAkNTAwL0RldmljZScsDQogICAgICAgICAgICAxNDQwID0+ICc2MCBEYXlzICZtZGFzaDsgJDgwMC9EZXZpY2UnLA0KICAgICAgICBdOw0KDQogICAgICAgICR0aGlzLT5wcmljZSA9IFsNCiAgICAgICAgICAgIDEgPT4gMTAsDQogICAgICAgICAgICA1ID0+IDIwLA0KICAgICAgICAgICAgMjQgPT4gNDAsDQogICAgICAgICAgICA3MiA9PiAxMDAsDQogICAgICAgICAgICAxNjggPT4gMTcwLA0KICAgICAgICAgICAgMzM2ID0+IDMwMCwNCiAgICAgICAgICAgIDcyMCA9PiA1MDAsDQogICAgICAgICAgICAxNDQwID0+IDgwMCwNCiAgICAgICAgXTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5kZXgoKQ0KICAgIHsNCiAgICAgICAgJG1vZGVsID0gJHRoaXMtPm1vZGVsOw0KICAgICAgICAkdXNlciA9ICR0aGlzLT51c2VyOw0KDQogICAgICAgIGlmICgkdXNlci0+bGV2ZWwgIT0gMSkgew0KICAgICAgICAgICAgJGtleXMgPSAkbW9kZWwtPndoZXJlKCdyZWdpc3RyYXRvcicsICR1c2VyLT51c2VybmFtZSkNCiAgICAgICAgICAgICAgICAtPmZpbmRBbGwoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRrZXlzID0gJG1vZGVsLT5zZWxlY3QoJ3VzZXJfa2V5JyktPmZpbmRBbGwoKSA7DQogICAgICAgIH0NCiAgICAgICAgJGRhdGEgPSBbDQogICAgICAgICAgICAndGl0bGUnID0+ICdLZXlzJywNCiAgICAgICAgICAgICd1c2VyJyA9PiAkdXNlciwNCiAgICAgICAgICAgICdrZXlsaXN0JyA9PiAka2V5cywNCiAgICAgICAgICAgICd0aW1lJyA9PiAkdGhpcy0+dGltZSwNCiAgICAgICAgXTsNCiAgICAgICAgcmV0dXJuIHZpZXcoJ0tleXMvbGlzdCcsICRkYXRhKTsNCiAgICB9DQogICAgDQpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWRfYWxsX0tleXMoKXsNCiAgICAkbW9kZWwgPSAkdGhpcy0+bW9kZWw7DQogICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAka2V5cyA9ICRtb2RlbC0+c2VsZWN0KCd1c2VyX2tleScpLT5maW5kQWxsKCk7DQogICAgJGRhdGE9Jyc7DQogICAgZm9yKCRpPTA7JGk8Y291bnQoJGtleXMpOyRpKyspew0KICAgICAgICAkZGF0YS49JGtleXNbJGldWyd1c2VyX2tleSddLiJcbiI7DQogICAgfQ0KICAgIHdyaXRlX2ZpbGUoJ05ld2tleXMudHh0JywgJGRhdGEpOw0KICAgICR0aGlzLT5kb3dubG9hZEZpbGUoJ05ld2tleXMudHh0Jyk7DQp9DQoNCiAgIA0KcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkX25ld19LZXlzKCl7DQogICAgJHRoaXMtPmRvd25sb2FkRmlsZSgnbmV3LnR4dCcpOw0KfQ0KDQogICAgZnVuY3Rpb24gZG93bmxvYWRGaWxlKCR5b3VyRmlsZSl7DQogICAgICAgIC8vICR5b3VyRmlsZSA9ICJuZXdOYW1lLnR4dCI7DQogICAgICAgICRmaWxlID0gQGZvcGVuKCR5b3VyRmlsZSwgInJiIik7DQoNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7DQogICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1BbGxrZXlzLnR4dCcpOw0KICAgICAgICBoZWFkZXIoJ0V4cGlyZXM6IDAnKTsNCiAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUnKTsNCiAgICAgICAgaGVhZGVyKCdQcmFnbWE6IHB1YmxpYycpOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gZmlsZXNpemUoJHlvdXJGaWxlKSk7DQogICAgICAgIHdoaWxlICghZmVvZigkZmlsZSkpIHsNCiAgICAgICAgICAgIHByaW50KEBmcmVhZCgkZmlsZSwgMTAyNCAqIDgpKTsNCiAgICAgICAgICAgIG9iX2ZsdXNoKCk7DQogICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQp9DQpwdWJsaWMgZnVuY3Rpb24gZXhwaXJlZF9kZWxldGUoKXsNCiAgICAkbW9kZWw9JHRoaXMtPm1vZGVsOw0KICAgICRkYXRhPSRtb2RlbC0+d2hlcmUoJ2V4cGlyZWRfZGF0ZSA8JywgIGRhdGUoJ1ktbS1kIEg6aTpzJykpLT5kZWxldGUoKTsNCg0KICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGgoJ21zZ1N1Y2Nlc3MnLCAnc3VjY2VzcycpOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gYWxsX2RlbGV0ZSgpew0KICAgIGVjaG8gIGRhdGUoJ1ktbS1kIEg6aTpzJyk7DQogICAgJG1vZGVsPSR0aGlzLT5tb2RlbDsNCiAgICAkZGF0YT0kbW9kZWwtPmVtcHR5VGFibGUoJ2tleXNfY29kZScpOw0KDQogICAgcmV0dXJuIHJlZGlyZWN0KCktPmJhY2soKS0+d2l0aCgnbXNnU3VjY2VzcycsICdzdWNjZXNzJyk7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBvbmVfZGVsZXRlKCl7DQogICAgDQogICAgJG1vZGVsPSR0aGlzLT5tb2RlbDsNCiAgICAka2V5cyA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRHZXQoJ3VzZXJrZXknKTsNCiAgICAkZGF0YT0kbW9kZWwtPndoZXJlKCd1c2VyX2tleScsICRrZXlzKS0+ZGVsZXRlKCk7DQpwcmludF9yKCRkYXRhKTsNCg0KICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGgoJ21zZ1N1Y2Nlc3MnLCAnc3VjY2VzcycpOw0KfQ0KLy9kZWxldGUgd2FzdGVkIGtleXMNCnB1YmxpYyBmdW5jdGlvbiB1bnVzZWRfZGVsZXRlKCl7DQogICAgZWNobyAgZGF0ZSgnWS1tLWQgSDppOnMnKTsNCiAgICAkbW9kZWw9JHRoaXMtPm1vZGVsOw0KICAgICRkYXRhPSRtb2RlbC0+d2hlcmUoJ2V4cGlyZWRfZGF0ZSA9Jy5udWxsKS0+ZGVsZXRlKCk7DQoNCiAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoKCdtc2dTdWNjZXNzJywgJ3N1Y2Nlc3MnKTsNCiAgICANCn0NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBpX2dldF9rZXlzKCkNCiAgICB7DQogICAgICAgIC8vID8gQVBJIGZvciBEYXRhVGFibGUgS2V5cw0KICAgICAgICAkbW9kZWwgPSAkdGhpcy0+bW9kZWw7DQogICAgICAgIHJldHVybiAkbW9kZWwtPkFQSV9nZXRLZXlzKCk7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGFwaV9rZXlfcmVzZXQoKQ0KICAgIHsNCiAgICAgICAgc2xlZXAoMSk7DQogICAgICAgICRtb2RlbCA9ICR0aGlzLT5tb2RlbDsNCiAgICAgICAgJGtleXMgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0R2V0KCd1c2Vya2V5Jyk7DQogICAgICAgICRyZXNldCA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRHZXQoJ3Jlc2V0Jyk7DQogICAgICAgICRkYl9rZXkgPSAkbW9kZWwtPmdldEtleXMoJGtleXMpOw0KDQogICAgICAgICRydWxlcyA9IFtdOw0KICAgICAgICBpZiAoJGRiX2tleSkgew0KICAgICAgICAgICAgJHRvdGFsID0gJGRiX2tleS0+ZGV2aWNlcyA/IGV4cGxvZGUoJywnLCAkZGJfa2V5LT5kZXZpY2VzKSA6IFtdOw0KICAgICAgICAgICAgJHJ1bGVzID0gWydkZXZpY2VzX3RvdGFsJyA9PiBjb3VudCgkdG90YWwpLCAnZGV2aWNlc19tYXgnID0+IChpbnQpICRkYl9rZXktPm1heF9kZXZpY2VzXTsNCiAgICAgICAgICAgICR1c2VyID0gJHRoaXMtPnVzZXI7DQogICAgICAgICAgICBpZiAoJGRiX2tleS0+ZGV2aWNlcyBhbmQgJHJlc2V0KSB7DQogICAgICAgICAgICAgICAgaWYgKCR1c2VyLT5sZXZlbCA9PSAxIG9yICRkYl9rZXktPnJlZ2lzdHJhdG9yID09ICR1c2VyLT51c2VybmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAkbW9kZWwtPnNldCgnZGV2aWNlcycsIE5VTEwpDQogICAgICAgICAgICAgICAgICAgICAgICAtPndoZXJlKCd1c2VyX2tleScsICRrZXlzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLT51cGRhdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgJHJ1bGVzID0gWydyZXNldCcgPT4gdHJ1ZSwgJ2RldmljZXNfdG90YWwnID0+IDAsICdkZXZpY2VzX21heCcgPT4gJGRiX2tleS0+bWF4X2RldmljZXNdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkZGF0YSA9IFsNCiAgICAgICAgICAgICdyZWdpc3RlcmVkJyA9PiAkZGJfa2V5ID8gdHJ1ZSA6IGZhbHNlLA0KICAgICAgICAgICAgJ2tleXMnID0+ICRrZXlzLA0KICAgICAgICBdOw0KDQogICAgICAgICRyZWFsX3Jlc3BvbnNlID0gYXJyYXlfbWVyZ2UoJGRhdGEsICRydWxlcyk7DQogICAgICAgIHJldHVybiAkdGhpcy0+cmVzcG9uc2UtPnNldEpTT04oJHJlYWxfcmVzcG9uc2UpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBlZGl0X2tleSgka2V5ID0gZmFsc2UpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoKSkgcmV0dXJuICR0aGlzLT5lZGl0X2tleV9hY3Rpb24oKTsNCiAgICAgICAgJG1zZ0RhbmdlciA9ICJUaGUgdXNlciBrZXkgbm8gbG9uZ2VyIGV4aXN0cy4iOw0KICAgICAgICBpZiAoJGtleSkgew0KICAgICAgICAgICAgJGRLZXkgPSAkdGhpcy0+bW9kZWwtPmdldEtleXMoJGtleSwgJ2lkX2tleXMnKTsNCiAgICAgICAgICAgICR1c2VyID0gJHRoaXMtPnVzZXI7DQogICAgICAgICAgICBpZiAoJGRLZXkpIHsNCiAgICAgICAgICAgICAgICBpZiAoJHVzZXItPmxldmVsID09IDEgb3IgJGRLZXktPnJlZ2lzdHJhdG9yID09ICR1c2VyLT51c2VybmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAkdmFsaWRhdGlvbiA9IFNlcnZpY2VzOjp2YWxpZGF0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgICRkYXRhID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAnS2V5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkdXNlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXknID0+ICRkS2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2dhbWVfbGlzdCcgPT4gJHRoaXMtPmdhbWVfbGlzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lJyA9PiAkdGhpcy0+dGltZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXlfaW5mbycgPT4gZ2V0RGV2aWNlKCRkS2V5LT5kZXZpY2VzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlcycgPT4gc2V0TWVzc2FnZSgnUGxlYXNlIGNhcmVmdWx5IGVkaXQgaW5mb3JtYXRpb24nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICd2YWxpZGF0aW9uJyA9PiAkdmFsaWRhdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcoJ0tleXMva2V5X2VkaXQnLCAkZGF0YSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG1zZ0RhbmdlciA9ICJSZXN0cmljdGVkIHRvIHRoaXMgdXNlciBrZXkuIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPnRvKCdrZXlzJyktPndpdGgoJ21zZ0RhbmdlcicsICRtc2dEYW5nZXIpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gZWRpdF9rZXlfYWN0aW9uKCkNCiAgICB7DQogICAgICAgICRrZXlzID0gJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoJ2lkX2tleXMnKTsNCiAgICAgICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAgICAgJGRLZXkgPSAkdGhpcy0+bW9kZWwtPmdldEtleXMoJGtleXMsICdpZF9rZXlzJyk7DQogICAgICAgICRnYW1lID0gaW1wbG9kZSgiLCIsIGFycmF5X2tleXMoJHRoaXMtPmdhbWVfbGlzdCkpOw0KDQogICAgICAgIGlmICghJGRLZXkpIHsNCiAgICAgICAgICAgICRtc2dEYW5nZXIgPSAiVGhlIHVzZXIga2V5IG5vIGxvbmdlciBleGlzdHN+IjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICgkdXNlci0+bGV2ZWwgPT0gMSBvciAkZEtleS0+cmVnaXN0cmF0b3IgPT0gJHVzZXItPnVzZXJuYW1lKSB7DQogICAgICAgICAgICAgICAgJGZvcm1fcmVzZWxsZXIgPSBbDQogICAgICAgICAgICAgICAgICAgICdzdGF0dXMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ3N0YXR1cycsDQogICAgICAgICAgICAgICAgICAgICAgICAncnVsZXMnID0+ICdyZXF1aXJlZHxpbnRlZ2VyfGluX2xpc3RbMCwxXScsDQogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3MnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW50ZWdlcicgPT4gJ0ludmFsaWQge2ZpZWxkfS4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbl9saXN0JyA9PiAnQ2hvb3NlIGJldHdlZW4gbGlzdC4nDQogICAgICAgICAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgICAgICRmb3JtX2FkbWluID0gWw0KICAgICAgICAgICAgICAgICAgICAnaWRfa2V5cycgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAna2V5cycsDQogICAgICAgICAgICAgICAgICAgICAgICAncnVsZXMnID0+ICdyZXF1aXJlZHxpc19ub3RfdW5pcXVlW2tleXNfY29kZS5pZF9rZXlzXXxudW1lcmljJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfbm90X3VuaXF1ZScgPT4gJ0ludmFsaWQga2V5cy4nDQogICAgICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAnZ2FtZScgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnR2FtZXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAicmVxdWlyZWR8YWxwaGFfbnVtZXJpY19zcGFjZXxpbl9saXN0WyRnYW1lXSIsDQogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3JzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscGhhX251bWVyaWNfc3BhY2UnID0+ICdJbnZhbGlkIGNoYXJhY3RlcnMuJw0KICAgICAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgJ3VzZXJfa2V5JyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdVc2VyIGtleXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAicmVxdWlyZWR8aXNfdW5pcXVlW2tleXNfY29kZS51c2VyX2tleSx1c2VyX2tleSwkZEtleS0+dXNlcl9rZXldfGFscGhhX251bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9ycycgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc191bmlxdWUnID0+ICd7ZmllbGR9IGhhcyBiZWVuIHRha2VuLicNCiAgICAgICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgICdkdXJhdGlvbicgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnZHVyYXRpb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAncmVxdWlyZWR8bnVtZXJpY3xncmVhdGVyX3RoYW5fZXF1YWxfdG9bMV0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9ycycgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncmVhdGVyX3RoYW5fZXF1YWxfdG8nID0+ICdNaW5pbXVtIHtmaWVsZH0gaXMgaW52YWxpZC4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1lcmljJyA9PiAnSW52YWxpZCBob3VycyB7ZmllbGR9LicNCiAgICAgICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgJ21heF9kZXZpY2VzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdkZXZpY2VzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3JlcXVpcmVkfG51bWVyaWN8Z3JlYXRlcl90aGFuX2VxdWFsX3RvWzFdJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlcl90aGFuX2VxdWFsX3RvJyA9PiAnTWluaW11bSB7ZmllbGR9IGlzIGludmFsaWQuJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYycgPT4gJ0ludmFsaWQgbWF4IG9mIHtmaWVsZH0uJw0KICAgICAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAncmVnaXN0cmF0b3InID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ3JlZ2lzdHJhdG9yJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3Blcm1pdF9lbXB0eXxhbHBoYV9udW1lcmljX3NwYWNlfG1pbl9sZW5ndGhbNF0nDQogICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgICdleHBpcmVkX2RhdGUnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ2V4cGlyZWQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAncGVybWl0X2VtcHR5fHZhbGlkX2RhdGVbWS1tLWQgSDppOnNdJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWRfZGF0ZScgPT4gJ0ludmFsaWQge2ZpZWxkfSBkYXRlLicsDQogICAgICAgICAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgICdkZXZpY2VzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdkZXZpY2UgbGlzdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAncnVsZXMnID0+ICdwZXJtaXRfZW1wdHknDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgaWYgKCR1c2VyLT5sZXZlbCA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIEFkbWluIGZ1bGwgcnVsZXMuDQogICAgICAgICAgICAgICAgICAgICRmb3JtX3J1bGVzID0gYXJyYXlfbWVyZ2UoJGZvcm1fcmVzZWxsZXIsICRmb3JtX2FkbWluKTsNCiAgICAgICAgICAgICAgICAgICAgJGRldmljZXMgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZGV2aWNlcycpOw0KICAgICAgICAgICAgICAgICAgICAkbWF4X2RldmljZXMgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnbWF4X2RldmljZXMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAkZGF0YV9zYXZlcyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdnYW1lJyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZ2FtZScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJfa2V5JyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgndXNlcl9rZXknKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdkdXJhdGlvbicgPT4gJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoJ2R1cmF0aW9uJyksDQogICAgICAgICAgICAgICAgICAgICAgICAnbWF4X2RldmljZXMnID0+ICRtYXhfZGV2aWNlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnID0+ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdzdGF0dXMnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWdpc3RyYXRvcicgPT4gJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoJ3JlZ2lzdHJhdG9yJyksDQogICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlZF9kYXRlJyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZXhwaXJlZF9kYXRlJykgPzogTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICdkZXZpY2VzJyA9PiBzZXREZXZpY2UoJGRldmljZXMsICRtYXhfZGV2aWNlcyksDQogICAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZWxsZXIganVzdCBzdGF0dXMgcnVsZXMsIHlvdSBjYW4gc2V0IG1hbnVhbGx5IGxhdGVyLg0KICAgICAgICAgICAgICAgICAgICAkZm9ybV9ydWxlcyA9ICRmb3JtX3Jlc2VsbGVyOw0KICAgICAgICAgICAgICAgICAgICAkZGF0YV9zYXZlcyA9IFsnc3RhdHVzJyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnc3RhdHVzJyldOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlKCRmb3JtX3J1bGVzKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoSW5wdXQoKS0+d2l0aCgnbXNnRGFuZ2VyJywgJ0ZhaWxlZCEgUGxlYXNlIGNoZWNrIHRoZSBlcnJvcicpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vICogRGF0YSBVcGRhdGVzDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tb2RlbC0+dXBkYXRlKCRkS2V5LT5pZF9rZXlzLCAkZGF0YV9zYXZlcyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGgoJ21zZ1N1Y2Nlc3MnLCAnVXNlciBrZXkgc3VjY2Vzc2Z1bHkgdXBkYXRlZCEnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRtc2dEYW5nZXIgPSAiUmVzdHJpY3RlZCB0byB0aGlzIHVzZXIga2V5fiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPnRvKCdrZXlzJyktPndpdGgoJ21zZ0RhbmdlcicsICRtc2dEYW5nZXIpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZSgpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoKSkNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2VuZXJhdGVfYWN0aW9uKCk7DQoNCiAgICAgICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAgICAgJHZhbGlkYXRpb24gPSBTZXJ2aWNlczo6dmFsaWRhdGlvbigpOw0KDQogICAgICAgICRtZXNzYWdlID0gc2V0TWVzc2FnZSgiPGkgY2xhc3M9J2JpIGJpLXdhbGxldCc+PC9pPiBUb3RhbCBTYWxkbyAkJHVzZXItPnNhbGRvIik7DQogICAgICAgIGlmICgkdXNlci0+c2FsZG8gPD0gMCkgew0KICAgICAgICAgICAgJG1lc3NhZ2UgPSBzZXRNZXNzYWdlKCJQbGVhc2UgdG9wIHVwIHRvIHlvdXIgYmVsb3ZlZCBhZG1pbi4iLCAnd2FybmluZycpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGRhdGEgPSBbDQogICAgICAgICAgICAndGl0bGUnID0+ICdHZW5lcmF0ZScsDQogICAgICAgICAgICAndXNlcicgPT4gJHVzZXIsDQogICAgICAgICAgICAndGltZScgPT4gJHRoaXMtPnRpbWUsDQogICAgICAgICAgICAnZ2FtZScgPT4gJHRoaXMtPmdhbWVfbGlzdCwNCiAgICAgICAgICAgICdkdXJhdGlvbicgPT4gJHRoaXMtPmR1cmF0aW9uLA0KICAgICAgICAgICAgJ3ByaWNlJyA9PiBqc29uX2VuY29kZSgkdGhpcy0+cHJpY2UpLA0KICAgICAgICAgICAgJ21lc3NhZ2VzJyA9PiAkbWVzc2FnZSwNCiAgICAgICAgICAgICd2YWxpZGF0aW9uJyA9PiAkdmFsaWRhdGlvbiwNCiAgICAgICAgXTsNCiAgICAgICAgcmV0dXJuIHZpZXcoJ0tleXMvZ2VuZXJhdGUnLCAkZGF0YSk7DQogICAgfQ0KICAgIA0KDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZW5lcmF0ZV9hY3Rpb24oKQ0KICAgIHsNCiAgICANCiAgICAgICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAgICAgJGdhbWUgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZ2FtZScpOw0KICAgICAgICAkbWF4ZCA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdtYXhfZGV2aWNlcycpOw0KICAgICAgICAkZHJ0biA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdkdXJhdGlvbicpOw0KICAgICAgICAkdHdzdCA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdjdXN0b21pbnB1dCcpOw0KICAgICAgICAkY3VzbGljZW5zZSA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdjdXNsaWNlbnNlJyk7DQogICAgICAgICRnZXRQcmljZSA9IGdldFByaWNlKCR0aGlzLT5wcmljZSwgJGRydG4sICRtYXhkKTsNCiAgICAgICAgJGxvb3Bjb3VudCA9ICAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnbG9vcGNvdW50Jyk7DQogICAgICAgIA0KICAgICAgICBpZiAoJGxvb3Bjb3VudCA9PSAiMSIpew0KICAgICAgICAkbG9vcGNvdW50ID0gNjsNCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGVsc2UgaWYgKCRsb29wY291bnQgPT0gIjIiKXsNCiAgICAgICAgJGxvb3Bjb3VudCA9IDExOw0KICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZWxzZSBpZiAoJGxvb3Bjb3VudCA9PSAiMyIpew0KICAgICAgICAkbG9vcGNvdW50ID0gNTE7DQogIA0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCRsb29wY291bnQgPT0gIjQiKXsNCiAgICAgICAgJGxvb3Bjb3VudCA9IDEwMTsNCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoJGxvb3Bjb3VudCA9PSAiNSIpew0KICAgICAgICAkbG9vcGNvdW50ID0gMjsNCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICANCiAgICAgICANCiAgICAgIA0KDQogICAgICAgICAgJGdhbWVfbGlzdCA9IGltcGxvZGUoIiwiLCBhcnJheV9rZXlzKCR0aGlzLT5nYW1lX2xpc3QpKTsNCiAgICAgICAgICAkZm9ybV9ydWxlcyA9IFsNCiAgICAgICAgICAgICAgJ2dhbWUnID0+IFsNCiAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ0dhbWVzJywNCiAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gInJlcXVpcmVkfGFscGhhX251bWVyaWNfc3BhY2V8aW5fbGlzdFskZ2FtZV9saXN0XSIsDQogICAgICAgICAgICAgICAgICAnZXJyb3JzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgJ2FscGhhX251bWVyaWNfc3BhY2UnID0+ICdJbnZhbGlkIGNoYXJhY3RlcnMuJw0KICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgJ2R1cmF0aW9uJyA9PiBbDQogICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnZHVyYXRpb24nLA0KICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3JlcXVpcmVkfG51bWVyaWN8Z3JlYXRlcl90aGFuX2VxdWFsX3RvWzFdJywNCiAgICAgICAgICAgICAgICAnZXJyb3JzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICdncmVhdGVyX3RoYW5fZXF1YWxfdG8nID0+ICdNaW5pbXVtIHtmaWVsZH0gaXMgaW52YWxpZC4nLA0KICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYycgPT4gJ0ludmFsaWQgaG91cnMge2ZpZWxkfS4nDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgJ21heF9kZXZpY2VzJyA9PiBbDQogICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdkZXZpY2VzJywNCiAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3JlcXVpcmVkfG51bWVyaWN8Z3JlYXRlcl90aGFuX2VxdWFsX3RvWzFdJywNCiAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlcl90aGFuX2VxdWFsX3RvJyA9PiAnTWluaW11bSB7ZmllbGR9IGlzIGludmFsaWQuJywNCiAgICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYycgPT4gJ0ludmFsaWQgbWF4IG9mIHtmaWVsZH0uJw0KICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICBdLA0KICAgICAgICAgIF07DQoNCiAgICAgICAgICAkdmFsaWRhdGlvbiA9IFNlcnZpY2VzOjp2YWxpZGF0aW9uKCk7DQogICAgICAgICAgJHJlZHVjZUNoZWNrID0gKCR1c2VyLT5zYWxkbyAtICRnZXRQcmljZSk7DQogICAgICAgICAgLy8gZGQoJHJlZHVjZUNoZWNrKTsNCiAgICAgICAgICBpZiAoJHJlZHVjZUNoZWNrIDwgMCkgew0KICAgICAgICAgICAgICAkdmFsaWRhdGlvbi0+c2V0RXJyb3IoJ2R1cmF0aW9uJywgJ0luc3VmZmljaWVudCBiYWxhbmNlJyk7DQogICAgICAgICAgICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGhJbnB1dCgpLT53aXRoKCdtc2dXYXJuaW5nJywgJ1BsZWFzZSB0b3AgdXAgdG8geW91ciBiZWxvdmVkIGFkbWluLicpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlKCRmb3JtX3J1bGVzKSkgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPmJhY2soKS0+d2l0aElucHV0KCktPndpdGgoJ21zZ0RhbmdlcicsICdGYWlsZWQhIFBsZWFzZSBjaGVjayB0aGUgZXJyb3InKTsNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgIA0KICAgICAgICAgICAgICAgIC8vZm9yKCRpID0gMTsgJGkgPCAkbG9vcGNvdW50OyAkaSsrKSB7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIC8vfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICANCiAgICAgICAgICAgICAgICAgICAvLyBlY2hvICIkbGljZW5zZSAgPGJyPkJIQVRJQTxicj4iOw0KICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8NCiAgICAgICAgICAgICAgICAgIA0KICAgDQogICAgICAgICAgICAgICAgICAgICAgJG1zZyA9ICJTdWNjZXNzZnVseSBHZW5lcmF0ZWQuIjsNCg0KICAgICAgICAgICAgICAgICAgDQoNCg0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAkZGF0YT0nJzsNCg0KICAgICAgICAgICAgICAgICAvLyAqIHJlc2VsbGVyIHJlZHVjZSBzYWxkbw0KICAgICAgICAgICAgICAgICBmb3IoJGk9MTskaTwkbG9vcGNvdW50OyRpKyspew0KICAgICAgICAgICAgICAkbGljZW5zZSA9ICRkcnRuLiAneCcuICR1c2VyLT51c2VybmFtZS4neCcuIHJhbmRvbV9zdHJpbmcoJ2FsbnVtJywgNSk7DQogICAgICAgICAgICAgICAgICAgICAgICRtb2RlbCA9ICR0aGlzLT5tb2RlbDsNCg0KaWYgKCR0d3N0ID09ICJjdXN0b20iKSB7DQppZiAoc3RybGVuKCRjdXNsaWNlbnNlKSA+IDMgJiYgc3RybGVuKCRjdXNsaWNlbnNlKSA8IDIwKXsNCiAgICAgICAgICAgICAgICAkZmluZEtleSA9ICRtb2RlbA0KICAgICAgICAgICAgICAgICAgICAtPmdldEtleXNHYW1lKFsndXNlcl9rZXknID0+ICRjdXNsaWNlbnNlLCAnZ2FtZScgPT4gJGdhbWVdKTsNCmlmICgkZmluZEtleSkgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPmJhY2soKS0+d2l0aCgnbXNnRGFuZ2VyJywgJ0tleSBhbHJlYWR5IGV4aXN0cyEhJyk7DQp9IGVsc2Ugew0KJGxpY2Vuc2UgPSAkY3VzbGljZW5zZTsNCn0NCn0gZWxzZSB7DQogICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoKCdtc2dEYW5nZXInLCAnQ3VzdG9tIEtleSBpcyB0b28gU2hvcnQvTG9uZycpOw0KfQ0KDQoNCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgJGRhdGFfcmVzcG9uc2UgPSBbDQogICAgICAgICAgICAgICAgICAgICAgJ2dhbWUnID0+ICRnYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2tleScgPT4gJGxpY2Vuc2UsDQogICAgICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyA9PiAkZHJ0biwNCiAgICAgICAgICAgICAgICAgICAgICAnbWF4X2RldmljZXMnID0+ICRtYXhkLA0KICAgICAgICAgICAgICAgICAgICAgICdyZWdpc3RyYXRvcicgPT4gJHVzZXItPnVzZXJuYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICd0ZXN0JyA9PiAkdHdzdCwNCiAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgICAgICRkYXRhLj0kbGljZW5zZS4iXG4iOw0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAkaWRLZXlzID0gJHRoaXMtPm1vZGVsLT5pbnNlcnQoJGRhdGFfcmVzcG9uc2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB3cml0ZV9maWxlKCduZXcudHh0JywgJGRhdGEpOy8vLw0KICAgICAgICAgICAgICAgIC8vICR0aGlzLT5kb3dubG9hZEZpbGUoJ25ldy50eHQnKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICR0aGlzLT51c2VyTW9kZWwtPnVwZGF0ZShzZXNzaW9uKCd1c2VyaWQnKSwgWydzYWxkbycgPT4gJHJlZHVjZUNoZWNrXSk7DQoNCiAgICAgICAgICAgICAgICAgICRoaXN0b3J5ID0gbmV3IEhpc3RvcnlNb2RlbCgpOw0KICAgICAgICAgICAgICAgICAgJGhpc3RvcnktPmluc2VydChbDQogICAgICAgICAgICAgICAgICAgICAgJ2tleXNfaWQnID0+ICRpZEtleXMsDQogICAgICAgICAgICAgICAgICAgICAgJ3VzZXJfZG8nID0+ICR1c2VyLT51c2VybmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAnaW5mbycgPT4gIiRnYW1lfCIgLiBzdWJzdHIoJGxpY2Vuc2UsIDAsIDUpIC4gInwkZHJ0bnwkbWF4ZCINCiAgICAgICAgICAgICAgICAgIF0pOw0KDQogICAgICAgICAgICAgICAgICAkb3RoZXJfcmVzcG9uc2UgPSBbDQogICAgICAgICAgICAgICAgICAgICAgJ2ZlZXMnID0+ICRnZXRQcmljZQ0KICAgICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgICAgc2Vzc2lvbigpLT5zZXRGbGFzaGRhdGEoYXJyYXlfbWVyZ2UoJGRhdGFfcmVzcG9uc2UsICRvdGhlcl9yZXNwb25zZSkpOw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoKCdtc2dTdWNjZXNzJywgJG1zZyk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgIH0NCiANCn0NCg==")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | a473b3701d51c6fb527d783b88eb1500 |
Eval Count | 1 |
Decode Time | 76 ms |