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 /* Copyright (c) Nicsoft LLC */ eval( '?>' . base64_decode('PD9waHANCg0KaWYgKGZpbGVf..
Decoded Output download
?>b'<?php
if (file_exists ( \'../../../../../config.php\' )) {
include_once \'../../../../../config.php\';
include_once \'../../../../../inc/auth_header.php\';
include_once \'../../../../../classes/Database.php\';
include_once \'../../SessionManager.php\';
include_once \'../../WorkflowAPI.php\';
}
if(!session_id())
session_start();
$sm = new SessionManager();
$job_controls = "";
$job_timeline = "";
$job_task_mamangment = "";
$job_content = "";
$active_task_id = -1;
$active_task_master_id = -1;
$_SESSION[\'_workflow_debug\'] = true;
if (isset ( $_POST [\'request\'] ) && $_POST [\'request\'] != \'\') {
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_LOADER\'] = true;
$wapi = new WorkflowAPI();
switch ($_POST [\'request\']) {
case \'load-new-job\' :
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_NEW_JOB\'] = true;
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_EXISTING_JOB\'] = false;
$workflow_job_id = isset ( $_POST [\'workflow_job_id\'] ) ? $_POST [\'workflow_job_id\'] : \'\';
$formboss_job_name = isset ( $_POST [\'job_name\'] ) ? $_POST [\'job_name\'] : \'\';
if($workflow_job_id == \'\' || $formboss_job_name == \'\')
return;
$sql = "SELECT workflow_data FROM fb_workflow_jobs WHERE id = ?";
$params = array ($workflow_job_id);
$result = Database::pdo_procedure_params ( $sql, $params, 0 );
$workflow_data = json_decode(base64_decode($result[1][0][\'workflow_data\']));
$current_stage_name = \'\';
foreach($workflow_data->stages as $stage_name => $stage_data){
if(count($stage_data->parents) == 0){
$current_stage_name = $stage_name;
break;
}
}
if($current_stage_name == \'\')
return \'ERROR|This job contains no start stage.\';
$task_data = new stdClass();
$active_task = array();
$active_task[\'task_master_id\'] = \'\';
$active_task[\'id\'] = \'\';
$active_task[\'workflow_job_id\'] = $workflow_job_id;
$task_data->current_stage = $current_stage_name;
$task_data->active_task = $active_task;
$job_controls = load_job_controls($task_data_faux = array(\'\', $task_data));
$job_content = load_job_data(-1, $formboss_job_name, $workflow_job_id, \'\');
break;
case \'load-existing-job\' :
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_NEW_JOB\'] = false;
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_EXISTING_JOB\'] = true;
$workflow_job_id = isset ( $_POST [\'workflow_job_id\'] ) ? $_POST [\'workflow_job_id\'] : \'\';
$formboss_job_name = isset ( $_POST [\'job_name\'] ) ? $_POST [\'job_name\'] : \'\';
$task_master_id = isset ( $_POST [\'task_master_id\'] ) ? $_POST [\'task_master_id\'] : \'\';
$active_task_id = isset ( $_POST [\'active_task_id\'] ) ? $_POST [\'active_task_id\'] : \'\';
if($workflow_job_id == \'\' || $formboss_job_name == \'\')
return;
$task_data = has_task_access($workflow_job_id, $formboss_job_name, $task_master_id, $active_task_id);
if($task_data[0]){
$task = $task_data[1];
$sql = "UPDATE fb_workflow_active_tasks SET task_locked = 1 WHERE task_master_id = ?";
$params = array ((int)$task->active_task[\'task_master_id\']);
$result = Database::pdo_procedure_params ($sql, $params, 1);
$active_task_master_id = (int)$task->active_task[\'task_master_id\'];
if($sm->job_already_open($active_task_master_id)){
echo \'ERROR|Job/Task Already Open.\';
return;
}
$sm->add_workflow_task($active_task_master_id);
$_SESSION[\'FB_WORKFLOW\'][\'active_task_master_id\'] = $task->active_task[\'task_master_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_id\'] = $task->active_task[\'id\'];
$_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\'] = $task->active_task[\'formboss_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_job_id\'] = $task->active_task[\'workflow_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_stage_name\'] = $task->active_task[\'workflow_stage_name\'];
$_SESSION[\'FB_WORKFLOW\'][\'task_master_id\'] = $task->active_task[\'task_master_id\'];
$job_controls = load_job_controls($task_data);
$timeline_access_test = $wapi->has_timeline_access($task->active_task[\'formboss_job_name\'], $task->active_task[\'workflow_stage_name\'], $task->active_task[\'task_master_id\'], $task->active_task[\'id\']);
if($timeline_access_test[0] == true){
$job_timeline = load_job_timeline($task->active_task[\'task_master_id\'], $workflow_job_id, $task_data);
}
$job_task_mamangment = load_job_task_management($task->active_task[\'task_master_id\'], $workflow_job_id, $task_data);
$job_content = load_job_data($task->active_task[\'task_master_id\'], $task->active_task[\'formboss_job_name\'], $task->active_task[\'workflow_job_id\'], $task->stage->stage_target, $task->active_task[\'workflow_stage_name\']);
} else {
echo "ERROR|{$task_data[1]}";
return;
}
break;
case \'load-archived-job\' :
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_NEW_JOB\'] = false;
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_EXISTING_JOB\'] = true;
$workflow_job_id = isset ( $_POST [\'workflow_job_id\'] ) ? $_POST [\'workflow_job_id\'] : \'\';
$formboss_job_name = isset ( $_POST [\'job_name\'] ) ? $_POST [\'job_name\'] : \'\';
$task_master_id = isset ( $_POST [\'task_master_id\'] ) ? $_POST [\'task_master_id\'] : \'\';
$active_task_id = isset ( $_POST [\'active_task_id\'] ) ? $_POST [\'active_task_id\'] : \'\';
if($workflow_job_id == \'\' || $formboss_job_name == \'\')
return;
$task_data = has_archived_task_access($workflow_job_id, $formboss_job_name, $task_master_id, $active_task_id);
if($task_data[0]){
$active_task_master_id = $task_master_id;
$task = $task_data[1];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_master_id\'] = $task->active_task[\'task_master_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_id\'] = $task->active_task[\'id\'];
$_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\'] = $task->active_task[\'formboss_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_job_id\'] = $task->active_task[\'workflow_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_stage_name\'] = $task->active_task[\'workflow_stage_name\'];
$_SESSION[\'FB_WORKFLOW\'][\'task_master_id\'] = $task->active_task[\'task_master_id\'];
$job_controls = load_job_controls($task_data);
$timeline_access_test = $wapi->has_timeline_access($task->active_task[\'formboss_job_name\'], $task->active_task[\'workflow_stage_name\'], $task->active_task[\'task_master_id\'], $task->active_task[\'id\']);
if($timeline_access_test[0] == true){
$job_timeline = load_job_timeline($task->active_task[\'task_master_id\'], $workflow_job_id, $task_data);
}
$job_task_mamangment = load_job_task_management($task->active_task[\'task_master_id\'], $workflow_job_id, $task_data);
$job_content = load_job_data($task->active_task[\'task_master_id\'], $task->active_task[\'formboss_job_name\'], $task->active_task[\'workflow_job_id\'], $task->stage->stage_target, $task->active_task[\'workflow_stage_name\']);
} else {
echo "ERROR|{$task_data[1]}";
return;
}
break;
case \'load-job-timeline\' :
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_NEW_JOB\'] = false;
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_EXISTING_JOB\'] = true;
$formboss_job_name = isset ( $_POST [\'formboss_job_name\'] ) ? $_POST [\'formboss_job_name\'] : \'\';
$workflow_stage_name = isset ( $_POST [\'workflow_stage_name\'] ) ? $_POST [\'workflow_stage_name\'] : \'\';
$workflow_job_id = isset ( $_POST [\'workflow_job_id\'] ) ? $_POST [\'workflow_job_id\'] : \'\';
$task_master_id = isset ( $_POST [\'task_master_id\'] ) ? $_POST [\'task_master_id\'] : \'\';
$active_task_id = isset ( $_POST [\'active_task_id\'] ) ? $_POST [\'active_task_id\'] : \'\';
$load_most_recent = isset ( $_POST [\'load_most_recent\'] ) ? $_POST [\'load_most_recent\'] : \'\';
if($workflow_job_id == \'\' || $workflow_stage_name == \'\')
return;
if($load_most_recent == \'true\'){
$task_data = has_task_access($workflow_job_id, $formboss_job_name, $task_master_id, $active_task_id);
$timeline_load = \'false\';
} else {
$task_data = has_timeline_task_access($formboss_job_name, $workflow_stage_name, $workflow_job_id, $task_master_id, $active_task_id);
$timeline_load = \'true\';
}
if($task_data[0]){
$active_task_master_id = (int)$task_master_id;
$task = $task_data[1];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_master_id\'] = $task->active_task[\'task_master_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_id\'] = $task->active_task[\'id\'];
$_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\'] = $task->active_task[\'formboss_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_job_id\'] = $task->active_task[\'workflow_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_stage_name\'] = $task->active_task[\'workflow_stage_name\'];
$_SESSION[\'FB_WORKFLOW\'][\'task_master_id\'] = $task->active_task[\'task_master_id\'];
$job_controls = load_job_controls($task_data, $timeline_load);
$job_timeline = load_job_timeline($task->active_task[\'task_master_id\'], $workflow_job_id, $task_data);
$job_task_mamangment = load_job_task_management($task->active_task[\'task_master_id\'], $workflow_job_id, $task_data);
$job_content = load_job_data_timeline($task->active_task[\'workflow_data\'],
$task->active_task[\'task_master_id\'],
$task->active_task[\'id\'],
$task->active_task[\'formboss_job_name\'],
$task->active_task[\'workflow_job_id\'],
$task->stage->stage_target,
$task->active_task[\'workflow_stage_name\']);
} else {
if($task_data[1] != ""){
echo $task_data[1];
} else {
echo \'ERROR|You do not have access to this resource.\';
}
die;
}
break;
case \'load-job-timeline-print-view\' :
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_NEW_JOB\'] = false;
$_SESSION[\'FB_WORKFLOW\'][\'IS_FORMBOSS_WORKFLOW_EXISTING_JOB\'] = true;
$formboss_job_name = isset ( $_POST [\'formboss_job_name\'] ) ? $_POST [\'formboss_job_name\'] : \'\';
$workflow_stage_name = isset ( $_POST [\'workflow_stage_name\'] ) ? $_POST [\'workflow_stage_name\'] : \'\';
$workflow_job_id = isset ( $_POST [\'workflow_job_id\'] ) ? $_POST [\'workflow_job_id\'] : \'\';
$task_master_id = isset ( $_POST [\'task_master_id\'] ) ? $_POST [\'task_master_id\'] : \'\';
$active_task_id = isset ( $_POST [\'active_task_id\'] ) ? $_POST [\'active_task_id\'] : \'\';
$load_most_recent = isset ( $_POST [\'load_most_recent\'] ) ? $_POST [\'load_most_recent\'] : \'\';
$load_location = isset ( $_POST [\'load_location\'] ) ? $_POST [\'load_location\'] : \'inline\';
$print_type = isset($_POST[\'print_type\']) ? $_POST[\'print_type\'] : \'print_all\';
if($workflow_job_id == \'\' || $workflow_stage_name == \'\')
return;
if($load_most_recent == \'true\'){
$task_data = has_task_access($workflow_job_id, $formboss_job_name, $task_master_id, $active_task_id);
$timeline_load = \'false\';
} else {
$task_data = has_timeline_task_access($formboss_job_name, $workflow_stage_name, $workflow_job_id, $task_master_id, $active_task_id);
$timeline_load = \'true\';
}
if($task_data[0]){
$active_task_master_id = (int)$task_master_id;
$task = $task_data[1];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_master_id\'] = $task->active_task[\'task_master_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'active_task_id\'] = $task->active_task[\'id\'];
$_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\'] = $task->active_task[\'formboss_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_job_id\'] = $task->active_task[\'workflow_job_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'workflow_stage_name\'] = $task->active_task[\'workflow_stage_name\'];
$_SESSION[\'FB_WORKFLOW\'][\'task_master_id\'] = $task->active_task[\'task_master_id\'];
$job_controls = \'\';
$job_timeline = \'\';
$job_task_mamangment = \'\';
$job_content = load_job_data_timeline($task->active_task[\'workflow_data\'],
$task->active_task[\'task_master_id\'],
$task->active_task[\'id\'],
$task->active_task[\'formboss_job_name\'],
$task->active_task[\'workflow_job_id\'],
$task->stage->stage_target,
$task->active_task[\'workflow_stage_name\'],
$load_location,
$print_type);
} else {
echo \'ERROR|You do not have access to this resource.\';
die;
}
break;
}
}
function has_task_access($workflow_job_id, $formboss_job_name, $task_master_id, $active_task_id){
$sql = "SELECT fb_workflow_active_tasks.id AS id
, fb_workflow_task_master.task_originator_user_id
, fb_workflow_active_tasks.workflow_stage_name
, fb_workflow_active_tasks.workflow_stage_to_load
, fb_workflow_active_tasks.task_master_id
, fb_workflow_active_tasks.task_user_id
, fb_workflow_jobs.formboss_job_id
, fb_workflow_jobs.formboss_job_name
, fb_workflow_jobs.id AS workflow_job_id
, fb_workflow_jobs.workflow_data
, fb_jobs.job_name
FROM
fb_workflow_active_tasks
INNER JOIN fb_workflow_jobs
ON fb_workflow_active_tasks.workflow_job_id = fb_workflow_jobs.id
INNER JOIN fb_workflow_task_master
ON fb_workflow_active_tasks.task_master_id = fb_workflow_task_master.id
INNER JOIN fb_jobs
ON fb_workflow_jobs.formboss_job_id = fb_jobs.id
WHERE fb_jobs.job_name = ? AND fb_workflow_active_tasks.task_master_id = ? AND fb_workflow_active_tasks.id = ? AND fb_workflow_task_master.workflow_complete = 0
ORDER BY id DESC LIMIT 1";
$params = array ($formboss_job_name, $task_master_id, $active_task_id);
$active_tasks = Database::pdo_procedure_params ( $sql, $params, 0 );
if(!$active_tasks){
echo \'No pending tasks\';
}
if($active_tasks[1][0][\'id\'] == \'\'){
unset($active_tasks[1][0]);
return array(false, "ERROR|This stage cannot be loaded as the workflow is already complete.");
}
$pending_tasks = array();
$sql = "SELECT fb_admin.user_name, fb_workflow_groups.group_name FROM fb_admin
INNER JOIN fb_workflow_groups ON fb_workflow_groups.id = fb_admin.workflow_group_id
WHERE fb_admin.user_id = ?";
$params = array ($_SESSION[\'fb_user_id\']);
$users_and_groups = Database::pdo_procedure_params ( $sql, $params, 0 );
$associations = array($users_and_groups[1][0][\'user_name\'], $users_and_groups[1][0][\'group_name\']);
foreach($active_tasks[1] as $active_task){
$workflow_data = json_decode(base64_decode($active_task[\'workflow_data\']));
$found = false; $next_stage = null; $current_stage = null;
if(isset($active_task[\'workflow_stage_to_load\']) && $active_task[\'workflow_stage_to_load\'] != \'\'){
foreach($workflow_data->stages as $key => $stage){
if($key == $active_task[\'workflow_stage_to_load\']){
$next_stage = $stage;
$current_stage = $active_task[\'workflow_stage_to_load\'];
}
}
} else {
foreach($workflow_data->stages as $key => $stage){
if($found){
$next_stage = $stage;
$current_stage = $key;
break;
}
if($key == $active_task[\'workflow_stage_name\']){
$found = true;
$next_stage = $stage;
$current_stage = $key;
}
}
}
if($next_stage != null){
foreach($next_stage->users as $user){
if(!isset($user->name)){
foreach($associations as $u){
if(trim($next_stage->users->name) == $u){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task;
$task_tmp->stage = $next_stage;
$task_tmp->current_stage = $current_stage;
$task_tmp->matching_user = $next_stage->users;
$pending_tasks[] = $task_tmp;
}
}
break;
} else {
foreach($associations as $u){
if(trim($user->name) == $u){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task;
$task_tmp->stage = $next_stage;
$task_tmp->current_stage = $current_stage;
$task_tmp->matching_user = $user;
$pending_tasks[] = $task_tmp;
}
}
}
}
}
}
if(count($pending_tasks) == 0){
return array(false, "Warning: Cannot load this task because the task has become corrupted, or the task workflow is already complete.
In the case of the former, this usually means a bad Stage Override has been set, which can happen if the job parameters have been changed since creation.");
} else if(count($pending_tasks) == 1) {
if($pending_tasks == \'\'){
return array(false, \'Warning: Cannot load this task because the task has become corrupted, or the workflow is already complete.\');
} else {
return array(true, $pending_tasks[0]);
}
}
}
function has_archived_task_access($workflow_job_id, $formboss_job_name, $task_master_id, $active_task_id){
$sql = "SELECT fb_workflow_active_tasks.id AS id
, fb_workflow_task_master.task_originator_user_id
, fb_workflow_active_tasks.workflow_stage_name
, fb_workflow_active_tasks.workflow_stage_to_load
, fb_workflow_active_tasks.task_master_id
, fb_workflow_active_tasks.task_user_id
, fb_workflow_jobs.formboss_job_id
, fb_workflow_jobs.formboss_job_name
, fb_workflow_jobs.id AS workflow_job_id
, fb_workflow_jobs.workflow_data
, fb_jobs.job_name
FROM
fb_workflow_active_tasks
INNER JOIN fb_workflow_jobs
ON fb_workflow_active_tasks.workflow_job_id = fb_workflow_jobs.id
INNER JOIN fb_workflow_task_master
ON fb_workflow_active_tasks.task_master_id = fb_workflow_task_master.id
INNER JOIN fb_jobs
ON fb_workflow_jobs.formboss_job_id = fb_jobs.id
WHERE fb_jobs.job_name = ? AND fb_workflow_active_tasks.task_master_id = ?
AND fb_workflow_active_tasks.id = ?
AND fb_workflow_task_master.workflow_complete = 1
ORDER BY id DESC LIMIT 1";
$params = array ($formboss_job_name, $task_master_id, $active_task_id);
$active_tasks = Database::pdo_procedure_params ( $sql, $params, 0 );
if(!$active_tasks){
echo \'No pending tasks\';
}
if($active_tasks[1][0][\'id\'] == \'\'){
unset($active_tasks[1][0]);
}
$archived_tasks = array();
$sql = "SELECT fb_admin.user_name, fb_workflow_groups.group_name FROM fb_admin
INNER JOIN fb_workflow_groups ON fb_workflow_groups.id = fb_admin.workflow_group_id
WHERE fb_admin.user_id = ?";
$params = array ($_SESSION[\'fb_user_id\']);
$users_and_groups = Database::pdo_procedure_params ( $sql, $params, 0 );
$associations = array($users_and_groups[1][0][\'user_name\'], $users_and_groups[1][0][\'group_name\']);
foreach($active_tasks[1] as $active_task){
$workflow_data = json_decode(base64_decode($active_task[\'workflow_data\']));
$last_stage = null;
$current_stage = \'\';
foreach($workflow_data->stages as $key => $stage){
$last_stage = $stage;
$current_stage = $key;
}
if($last_stage != null){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task;
$task_tmp->stage = $last_stage;
$task_tmp->current_stage = $current_stage;
$archived_tasks[] = $task_tmp;
}
}
if(count($archived_tasks) == 0){
return array(false, "Warning: Cannot load this task because the task has become corrupted, or the task workflow is already complete.
In the case of the former, this usually means a bad Stage Override has been set, which can happen if the job parameters have been changed since creation.");
} else if(count($archived_tasks) == 1) {
if($archived_tasks == \'\'){
return array(false, \'Warning: Cannot load this task because the task has become corrupted, or the workflow is already complete.\');
} else {
return array(true, $archived_tasks[0]);
}
}
}
function has_timeline_task_access($formboss_job_name, $workflow_stage_name, $workflow_job_id, $task_master_id, $active_task_id){
$sql = "SELECT fb_workflow_active_tasks.id AS id
, fb_workflow_task_master.task_originator_user_id
, fb_workflow_active_tasks.workflow_stage_name
, fb_workflow_active_tasks.workflow_stage_to_load
, fb_workflow_active_tasks.task_master_id
, fb_workflow_active_tasks.task_user_id
, fb_workflow_jobs.formboss_job_id
, fb_workflow_jobs.formboss_job_name
, fb_workflow_jobs.id AS workflow_job_id
, fb_workflow_jobs.workflow_data
, fb_jobs.job_name
FROM
fb_workflow_active_tasks
INNER JOIN fb_workflow_jobs
ON fb_workflow_active_tasks.workflow_job_id = fb_workflow_jobs.id
INNER JOIN fb_workflow_task_master
ON fb_workflow_active_tasks.task_master_id = fb_workflow_task_master.id
INNER JOIN fb_jobs
ON fb_workflow_jobs.formboss_job_id = fb_jobs.id
WHERE fb_jobs.job_name = ? AND fb_workflow_active_tasks.task_master_id = ? AND fb_workflow_active_tasks.id = ?";
$params = array ($formboss_job_name, $task_master_id, $active_task_id);
$active_task = Database::pdo_procedure_params ( $sql, $params, 0 );
if(!$active_task){
echo \'No pending tasks\';
}
$sql = "SELECT fb_admin.user_name, fb_workflow_groups.group_name FROM fb_admin
INNER JOIN fb_workflow_groups ON fb_workflow_groups.id = fb_admin.workflow_group_id
WHERE fb_admin.user_id = ?";
$params = array ($_SESSION[\'fb_user_id\']);
$users_and_groups = Database::pdo_procedure_params ( $sql, $params, 0 );
$associations = array($users_and_groups[1][0][\'user_name\'], $users_and_groups[1][0][\'group_name\']);
$workflow_data = json_decode(base64_decode($active_task[1][0][\'workflow_data\']));
$stage = $workflow_data->stages->$workflow_stage_name;
$pending_task = \'\';
foreach($stage->users as $user){
if(!isset($user->name)){
if(trim($user->name) == \'[Task Originator]\'){
if($active_task[1][0][\'task_originator_user_id\'] == $_SESSION[\'fb_user_id\'] && (int)$user->timeline_access == 1){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task[1][0];
$task_tmp->stage = $stage;
$task_tmp->current_stage = $workflow_stage_name;
$task_tmp->matching_user = $user;
$pending_task = $task_tmp;
}
} else {
foreach($associations as $u){
if(trim($user->name) == $u){
if(trim($user->timeline_access) == 1){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task[1][0];
$task_tmp->stage = $stage;
$task_tmp->current_stage = $workflow_stage_name;
$task_tmp->matching_user = $user;
$pending_task = $task_tmp;
}
}
}
}
} else {
if(trim($user->name) == \'[Task Originator]\'){
if($active_task[1][0][\'task_originator_user_id\'] == $_SESSION[\'fb_user_id\'] && (int)$user->timeline_access == 1){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task[1][0];
$task_tmp->stage = $stage;
$task_tmp->current_stage = $workflow_stage_name;
$task_tmp->matching_user = $user;
$pending_task = $task_tmp;
}
} else {
foreach($associations as $u){
if(trim($user->name) == $u){
if(trim($user->timeline_access) == 1){
$task_tmp = new stdClass();
$task_tmp->active_task = $active_task[1][0];
$task_tmp->stage = $stage;
$task_tmp->current_stage = $workflow_stage_name;
$task_tmp->matching_user = $user;
$pending_task = $task_tmp;
}
}
}
}
}
}
return array($pending_task != \'\' ? true : false, $pending_task);
}
function load_job_controls($task_data = \'\', $timeline_load = \'false\'){
if($task_data == \'\')
return;
$task = $task_data[1];
$html = "";
$html .= <<<EOF
<div class="job-viewer-task-controls-wrapper">
<input type="hidden" name="current_task_master_id" value="{$task->active_task[\'task_master_id\']}" />
<input type="hidden" name="current_active_task_id" value="{$task->active_task[\'id\']}" />
<input type="hidden" name="current_stage_name" value="{$task->current_stage}" />
<input type="hidden" name="workflow_job_id" value="{$task->active_task[\'workflow_job_id\']}" />
<input type="hidden" name="timeline_load" value="{$timeline_load}" />
</div>
EOF;
return $html;
}
function load_job_task_management($task_master_id, $workflow_job_id, $task_data){
if($task_master_id == 0)
return \'\';
$task_data = $task_data[1];
$sql = "SELECT id, comment FROM fb_workflow_active_tasks WHERE task_master_id = ? ORDER BY id DESC";
$params = array ($task_master_id);
$comments = Database::pdo_procedure_params ( $sql, $params, 0 );
$comment_index = 0;
$has_overflow_html = false;
$existing_comments_html = "<div class=\"comments-html-wrapper\">";
foreach($comments[1] as $comment){
if($comment_index == 0){
$existing_comments_html = "<div class=\"workflow-stage-comment-most-recent-header\">Stage Comments</div>";
$existing_comments_html .= "<div class=\"workflow-stage-comment-most-recent\">{$comment[\'comment\']}</div>";
$existing_comments_html .= "<div class=\"workflow-stage-commens-overflow\">";
$has_overflow_html = true;
$comment_index++;
} else {
$existing_comments_html .= "<div class=\"workflow-stage-comment-most-recent\">{$comment[\'comment\']}</div>";
}
}
if($has_overflow_html){
$existing_comments_html .= "</div>";
}
$existing_comments_html .= "</div>";
$add_comments_html = <<<EOF
<textarea class="task-management-comment" style="width:100%;" onkeyup=""></textarea>
EOF;
$stage_select = "";
if(isset($task_data->matching_user) && $task_data->matching_user->name != \'\' && (int)$task_data->matching_user->can_change_stages == 1){
$sql = "SELECT workflow_data, formboss_job_name FROM fb_workflow_jobs WHERE id = ?";
$params = array ($workflow_job_id);
$workflow_data = Database::pdo_procedure_params ( $sql, $params, 0 );
$workflow_data = json_decode(base64_decode($workflow_data[1][0][\'workflow_data\']));
$stage_select_option = "<option value\"\">--SELECT A STAGE--</option>";
foreach($workflow_data->stages as $name => $stage){
if($name != (string)$task_data->current_stage){
$stage_select_option .= "<option value=\"{$name}\">{$stage->name}</option>";
} else {
break;
}
}
$stage_select .= <<<EOT
<select class="task-management-stage-select" name="">
{$stage_select_option}
</select>
EOT;
}
$cancel_workflow = "";
if(isset($task_data->matching_user) && $task_data->matching_user->name != \'\' && (int)$task_data->matching_user->can_cancel_workflow == 1){
$formboss_job_name = $task_data->active_task[\'formboss_job_name\'];
$workflow_stage_name = $task_data->active_task[\'workflow_stage_name\'];
$task_master_id = $task_data->active_task[\'task_master_id\'];
$active_task_id = $task_data->active_task[\'id\'];
$cancel_workflow .= <<<EOT
<input type="button" name="" onclick="query_workflow_cancel(event, this, \'{$formboss_job_name}\', \'{$workflow_stage_name}\', {$task_master_id}, {$active_task_id}, true);" value="Cancel This Worfklow Task" />
EOT;
}
$html = <<<EOF
<div class="task-management-wrapper">
<div class="task-management-header">Task Management</div>
<div class="task-management-wrapper-padding">
{$existing_comments_html}
{$add_comments_html}
{$stage_select}
{$cancel_workflow}
</div>
</div>
EOF;
return $html;
}
function load_job_timeline($task_master_id, $workflow_job_id, $task_data){
if($task_master_id == 0)
return \'\';
$sql = "SELECT workflow_data, formboss_job_name FROM fb_workflow_jobs WHERE id = ?";
$params = array ($workflow_job_id);
$workflow_data = Database::pdo_procedure_params ( $sql, $params, 0 );
$formboss_job_name = $workflow_data[1][0][\'formboss_job_name\'];
$workflow_data = json_decode(base64_decode($workflow_data[1][0][\'workflow_data\']));
$stages = array();
foreach($workflow_data->stages as $stage_name => $stage_data){
$stages["{$stage_name}"] = $stage_data;
}
$sql = "SELECT fb_workflow_active_tasks.*,
fb_workflow_task_master.workflow_complete
FROM fb_workflow_active_tasks
INNER JOIN fb_workflow_task_master ON fb_workflow_active_tasks.task_master_id = fb_workflow_task_master.id
WHERE task_master_id = ?
ORDER BY fb_workflow_active_tasks.id DESC";
$params = array ($task_master_id);
$task_history = Database::pdo_procedure_params ( $sql, $params, 0 );
$task_item_html = "";
$count = 0;
$most_recent_task_id = -1;
foreach($task_history[1] as $task){
$stage_display_name = $stages["{$task[\'workflow_stage_name\']}"]->name;
$date = new DateTime($task[\'ts\']);
$task_date = date_format($date, \'m/d/Y\');
if($most_recent_task_id == -1){
$most_recent_task_id = $task[\'id\'];
}
if($count == 0 && $task["workflow_complete"] == 0){
$use_code = true;
if($use_code){
$task_item_html .= <<<EOF
<div class="task-timeline-item" onclick="query_right_timline_job_loader(event, \'{$formboss_job_name}\', \'{$task[\'workflow_stage_name\']}\', {$task[\'workflow_job_id\']}, {$task[\'task_master_id\']}, {$task[\'id\']}, \'true\');">
<div class="task-timeline-item-arrow">>></div>
<span class="task-timeline-name">Most Recent Task</span><br>
<span class="task-timeline-date">{$task_date}</span>
</div>
EOF;
}
$count++;
}
$task_item_html .= <<<EOF
<div class="task-timeline-item" onclick="query_right_timline_job_loader(event, \'{$formboss_job_name}\', \'{$task[\'workflow_stage_name\']}\', {$task[\'workflow_job_id\']}, {$task[\'task_master_id\']}, {$task[\'id\']}, \'false\');">
<div class="task-timeline-item-arrow">>></div>
<span class="task-timeline-name">{$stage_display_name}</span><br>
<span class="task-timeline-date">{$task_date}</span>
</div>
EOF;
}
$print_timeline_html = <<<EOT
<input type="button" value="Print Timeline" onclick="query_right_timeline_print_timeline(event, \'{$formboss_job_name}\', \'{$task[\'workflow_stage_name\']}\', {$task[\'workflow_job_id\']}, {$task[\'task_master_id\']}, {$most_recent_task_id}, \'print_all\');" />
EOT;
$html = <<<EOF
<div class="task-timeline-wrapper">
<div class="task-timeline-header">Job Timeline</div>
<div class="task-timeline-wrapper-padding">
{$task_item_html}
{$print_timeline_html}
</div>
</div>
EOF;
return $html;
}
function load_job_data($task_master_id,
$formboss_job_name,
$workflow_job_id,
$stage_target = \'\',
$current_stage_name = \'\'){
$sql = "SELECT job_xml FROM fb_jobs WHERE job_name = ?";
$params = array ($formboss_job_name);
$result = Database::pdo_procedure_params ( $sql, $params, 0 );
if(!$result)
return;
$xml = $result[1][0][\'job_xml\'];
if(substr($xml, 0, 23) == \'PD94bWwgdmVyc2lvbj0iMS4\'){
$xml = base64_decode($xml);
}
$formboss_job = simplexml_load_string($xml);
$sql = "SELECT workflow_data FROM fb_workflow_jobs WHERE id = ?";
$params = array ($workflow_job_id);
$result = Database::pdo_procedure_params ( $sql, $params, 0 );
if(!$result)
return;
$workflow = json_decode(base64_decode($result[1][0][\'workflow_data\']));
if($stage_target == \'\'){
foreach($workflow->stages as $key => $stage){
$current_stage_name = $key;
$item_to_load = $workflow->stages->$key->stage_target;
break;
}
} else {
$item_to_load = $stage_target;
}
if(substr_count($item_to_load, \'.php\') == 1){
$dim = \'500,500\';
foreach($formboss_job->page as $page){
if((string)$page->name == $item_to_load){
$dim = $page->dim;
break;
}
}
$dims = explode(\',\', $dim);
if($_SESSION[\'_workflow_debug\']){
$dims[0] = $dims[0] + 450;
$dims[1] = $dims[1] + 650;
}
$job_content = \'<iframe class="fb-workflow-iframe" id="" name="" src="../output/forms/\'.$formboss_job_name.\'/\'.$item_to_load.\'" width="\'.$dims[0].\'" height="\'.$dims[1].\'" frameborder="0" scrolling="no" ALLOWTRANSPARENCY="true"></iframe>\';
if(isset($_SESSION[\'fb_user_id\'])){
$_SESSION[\'FB_WORKFLOW\'][\'task_user_id\'] = $_SESSION[\'fb_user_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'formboss_user_id\'] = $_SESSION[\'fb_user_id\'];
} else {
$_SESSION[\'FB_WORKFLOW\'][\'task_user_id\'] = \'\';
$_SESSION[\'FB_WORKFLOW\'][\'formboss_user_id\'] = NULL;
}
if(!isset($_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\']))
$_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\'] = -1;
$_SESSION[\'FB_WORKFLOW\'][\'workflow_job_id\'] = $workflow_job_id;
$_SESSION[\'FB_WORKFLOW\'][\'workflow_stage_name\'] = $current_stage_name;
} else {
}
return $job_content;
}
function load_job_data_timeline($workflow_data,
$task_master_id,
$active_task_id,
$formboss_job_name,
$workflow_job_id,
$stage_target = \'\',
$current_stage_name = \'\',
$load_location = \'inline\',
$print_type = \'\'){
$sql = "SELECT job_xml FROM fb_jobs WHERE job_name = ?";
$params = array ($formboss_job_name);
$result = Database::pdo_procedure_params ( $sql, $params, 0 );
if(!$result)
return;
$xml = $result[1][0][\'job_xml\'];
if(substr($xml, 0, 23) == \'PD94bWwgdmVyc2lvbj0iMS4\'){
$xml = base64_decode($xml);
}
$formboss_job = simplexml_load_string($xml);
if($workflow_data == \'\')
return;
$workflow = json_decode(base64_decode($workflow_data));
if($stage_target == \'\'){
foreach($workflow->stages as $key => $stage){
$current_stage_name = $key;
$item_to_load = $workflow->stages->$key->stage_target;
break;
}
} else {
$item_to_load = $stage_target;
}
if(substr_count($item_to_load, \'.php\') == 1){
$dim = \'500,500\';
foreach($formboss_job->page as $page){
if((string)$page->name == $item_to_load){
$dim = $page->dim;
break;
}
}
$dims = explode(\',\', $dim);
$output_path = \'../output/forms/\';
$render_submit_button_code = "";
if($load_location == \'stand_alone\'){
$output_path = \'../../../../../../output/forms/\';
$render_submit_button_code = "?fb-workflow-print-view=true";
}
if($print_type != \'\'){
$render_submit_button_code = "?fb-workflow-print-view=true";
}
if ($_SESSION[\'_workflow_debug\']) {
$dims[0] = $dims[0] + 450;
$dims[1] = $dims[1] + 650;
}
$job_content = \'<iframe class="fb-workflow-iframe timeline-item" id="" name="fb-iframe-JobTitle" src="\'.$output_path.$formboss_job_name.\'/\'.$item_to_load.$render_submit_button_code.\'" width="\'.$dims[0].\'" height="\'.$dims[1].\'" frameborder="0" scrolling="no" ALLOWTRANSPARENCY="true"></iframe>\';
if(isset($_SESSION[\'fb_user_id\'])){
$_SESSION[\'FB_WORKFLOW\'][\'task_user_id\'] = $_SESSION[\'fb_user_id\'];
$_SESSION[\'FB_WORKFLOW\'][\'formboss_user_id\'] = $_SESSION[\'fb_user_id\'];
} else {
$_SESSION[\'FB_WORKFLOW\'][\'task_user_id\'] = \'\';
$_SESSION[\'FB_WORKFLOW\'][\'formboss_user_id\'] = NULL;
}
if(!isset($_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\']))
$_SESSION[\'FB_WORKFLOW\'][\'formboss_job_id\'] = -1;
$_SESSION[\'FB_WORKFLOW\'][\'workflow_job_id\'] = $workflow_job_id;
$_SESSION[\'FB_WORKFLOW\'][\'workflow_stage_name\'] = $current_stage_name;
} else {
}
return $job_content;
}
if(isset($_POST[\'request\']) && $_POST[\'request\'] == \'load-job-timeline-print-view\'){
$html = <<<EOF
{$job_content}
EOF;
} else {
$html = <<<EOF
{$job_timeline}
{$job_task_mamangment}
<div class="job-viewer-header">
<div class="job-viewer-title">{$formboss_job_name}</div>
<div class="job-viewer-controls">
{$job_controls}
<div class="job-viewer-controls-close-button" onclick="query_right_job_loader_close(event, this, {$active_task_master_id}, true)">Close Window</div>
</div>
</div>
<div class="job-viewer-content">{$job_content}</div>
<div class="job-viewer-footer"> </div>
EOF;
}
echo $html;
?>'
Did this file decode correctly?
Original Code
<?php /* Copyright (c) Nicsoft LLC */ eval( '?>' . base64_decode('PD9waHANCg0KaWYgKGZpbGVfZXhpc3RzICggJy4uLy4uLy4uLy4uLy4uL2NvbmZpZy5waHAnICkpIHsNCglpbmNsdWRlX29uY2UgJy4uLy4uLy4uLy4uLy4uL2NvbmZpZy5waHAnOw0KCWluY2x1ZGVfb25jZSAnLi4vLi4vLi4vLi4vLi4vaW5jL2F1dGhfaGVhZGVyLnBocCc7DQoJaW5jbHVkZV9vbmNlICcuLi8uLi8uLi8uLi8uLi9jbGFzc2VzL0RhdGFiYXNlLnBocCc7DQoJaW5jbHVkZV9vbmNlICcuLi8uLi9TZXNzaW9uTWFuYWdlci5waHAnOw0KCWluY2x1ZGVfb25jZSAnLi4vLi4vV29ya2Zsb3dBUEkucGhwJzsNCn0NCg0KaWYoIXNlc3Npb25faWQoKSkgDQoJc2Vzc2lvbl9zdGFydCgpOw0KCQ0KDQokc20gPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTsNCgkNCg0KJGpvYl9jb250cm9scyA9ICIiOw0KJGpvYl90aW1lbGluZSA9ICIiOw0KJGpvYl90YXNrX21hbWFuZ21lbnQgPSAiIjsgDQokam9iX2NvbnRlbnQgPSAiIjsNCg0KDQokYWN0aXZlX3Rhc2tfaWQgPSAtMTsNCiRhY3RpdmVfdGFza19tYXN0ZXJfaWQgPSAtMTsNCg0KJF9TRVNTSU9OWydfd29ya2Zsb3dfZGVidWcnXSA9IHRydWU7DQoNCg0KDQppZiAoaXNzZXQgKCAkX1BPU1QgWydyZXF1ZXN0J10gKSAmJiAkX1BPU1QgWydyZXF1ZXN0J10gIT0gJycpIHsNCgkNCgkNCgkNCgkNCgkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ0lTX0ZPUk1CT1NTX1dPUktGTE9XX0xPQURFUiddID0gdHJ1ZTsNCgkNCgkkd2FwaSA9IG5ldyBXb3JrZmxvd0FQSSgpOw0KCQ0KCXN3aXRjaCAoJF9QT1NUIFsncmVxdWVzdCddKSB7DQoNCgkJY2FzZSAnbG9hZC1uZXctam9iJyA6DQoJCQkNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnSVNfRk9STUJPU1NfV09SS0ZMT1dfTkVXX0pPQiddID0gdHJ1ZTsNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnSVNfRk9STUJPU1NfV09SS0ZMT1dfRVhJU1RJTkdfSk9CJ10gPSBmYWxzZTsNCgkJCQ0KCQkJDQoJCQkkd29ya2Zsb3dfam9iX2lkID0gaXNzZXQgKCAkX1BPU1QgWyd3b3JrZmxvd19qb2JfaWQnXSApID8gJF9QT1NUIFsnd29ya2Zsb3dfam9iX2lkJ10gOiAnJzsNCgkJCSRmb3JtYm9zc19qb2JfbmFtZSA9IGlzc2V0ICggJF9QT1NUIFsnam9iX25hbWUnXSApID8gJF9QT1NUIFsnam9iX25hbWUnXSA6ICcnOw0KCQkJDQoJCQkNCgkJCWlmKCR3b3JrZmxvd19qb2JfaWQgPT0gJycgfHwgJGZvcm1ib3NzX2pvYl9uYW1lID09ICcnKQ0KCQkJCXJldHVybjsNCgkJCQkNCgkJCQkNCgkJCQ0KCQkJJHNxbCA9ICJTRUxFQ1Qgd29ya2Zsb3dfZGF0YSBGUk9NIGZiX3dvcmtmbG93X2pvYnMgV0hFUkUgaWQgPSA/IjsgDQoJCQkkcGFyYW1zID0gYXJyYXkgKCR3b3JrZmxvd19qb2JfaWQpOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkJCQ0KCQkJDQoJCQkkd29ya2Zsb3dfZGF0YSA9IGpzb25fZGVjb2RlKGJhc2U2NF9kZWNvZGUoJHJlc3VsdFsxXVswXVsnd29ya2Zsb3dfZGF0YSddKSk7DQoJCQkNCgkJCSRjdXJyZW50X3N0YWdlX25hbWUgPSAnJzsNCgkJCQ0KCQkJDQoJCQlmb3JlYWNoKCR3b3JrZmxvd19kYXRhLT5zdGFnZXMgYXMgJHN0YWdlX25hbWUgPT4gJHN0YWdlX2RhdGEpew0KCQkJCWlmKGNvdW50KCRzdGFnZV9kYXRhLT5wYXJlbnRzKSA9PSAwKXsNCgkJCQkJJGN1cnJlbnRfc3RhZ2VfbmFtZSA9ICRzdGFnZV9uYW1lOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWlmKCRjdXJyZW50X3N0YWdlX25hbWUgPT0gJycpDQoJCQkJcmV0dXJuICdFUlJPUnxUaGlzIGpvYiBjb250YWlucyBubyBzdGFydCBzdGFnZS4nOw0KCQkJDQoJCQkJDQoJCQkNCgkNCgkJCSR0YXNrX2RhdGEgPSBuZXcgc3RkQ2xhc3MoKTsNCgkJCQ0KCQkJJGFjdGl2ZV90YXNrID0gYXJyYXkoKTsNCgkJCSRhY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXSA9ICcnOw0KCQkJJGFjdGl2ZV90YXNrWydpZCddID0gJyc7DQoJCQkkYWN0aXZlX3Rhc2tbJ3dvcmtmbG93X2pvYl9pZCddID0gJHdvcmtmbG93X2pvYl9pZDsNCgkJCQ0KCQkJJHRhc2tfZGF0YS0+Y3VycmVudF9zdGFnZSA9ICRjdXJyZW50X3N0YWdlX25hbWU7DQoJCQkkdGFza19kYXRhLT5hY3RpdmVfdGFzayA9ICRhY3RpdmVfdGFzazsNCgkJCQ0KCQkJJGpvYl9jb250cm9scyA9IGxvYWRfam9iX2NvbnRyb2xzKCR0YXNrX2RhdGFfZmF1eCA9IGFycmF5KCcnLCAkdGFza19kYXRhKSk7DQoJCQkNCgkJCSRqb2JfY29udGVudCA9IGxvYWRfam9iX2RhdGEoLTEsICRmb3JtYm9zc19qb2JfbmFtZSwgJHdvcmtmbG93X2pvYl9pZCwgJycpOyANCgkJCQ0KCQkJYnJlYWs7DQoJCQkNCgkJY2FzZSAnbG9hZC1leGlzdGluZy1qb2InIDoNCgkJCQ0KCQkJDQoJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ0lTX0ZPUk1CT1NTX1dPUktGTE9XX05FV19KT0InXSA9IGZhbHNlOw0KCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydJU19GT1JNQk9TU19XT1JLRkxPV19FWElTVElOR19KT0InXSA9IHRydWU7DQoJCQkNCgkJCQ0KCQkJJHdvcmtmbG93X2pvYl9pZCA9IGlzc2V0ICggJF9QT1NUIFsnd29ya2Zsb3dfam9iX2lkJ10gKSA/ICRfUE9TVCBbJ3dvcmtmbG93X2pvYl9pZCddIDogJyc7DQoJCQkkZm9ybWJvc3Nfam9iX25hbWUgPSBpc3NldCAoICRfUE9TVCBbJ2pvYl9uYW1lJ10gKSA/ICRfUE9TVCBbJ2pvYl9uYW1lJ10gOiAnJzsNCgkJCSR0YXNrX21hc3Rlcl9pZCA9IGlzc2V0ICggJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSApID8gJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSA6ICcnOw0KCQkJJGFjdGl2ZV90YXNrX2lkID0gaXNzZXQgKCAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddICkgPyAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddIDogJyc7DQoJCQkNCgkJCWlmKCR3b3JrZmxvd19qb2JfaWQgPT0gJycgfHwgJGZvcm1ib3NzX2pvYl9uYW1lID09ICcnKQ0KCQkJCXJldHVybjsNCgkJCQ0KCQkJDQoJCQkkdGFza19kYXRhID0gaGFzX3Rhc2tfYWNjZXNzKCR3b3JrZmxvd19qb2JfaWQsICRmb3JtYm9zc19qb2JfbmFtZSwgJHRhc2tfbWFzdGVyX2lkLCAkYWN0aXZlX3Rhc2tfaWQpOw0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQlpZigkdGFza19kYXRhWzBdKXsNCgkJCQkNCgkJCQkkdGFzayA9ICR0YXNrX2RhdGFbMV07IA0KCQkJCQ0KCQkJCQ0KCQkJCSRzcWwgPSAiVVBEQVRFIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcyBTRVQgdGFza19sb2NrZWQgPSAxIFdIRVJFIHRhc2tfbWFzdGVyX2lkID0gPyI7DQoJCQkJJHBhcmFtcyA9IGFycmF5ICgoaW50KSR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXSk7DQoJCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoJHNxbCwgJHBhcmFtcywgMSk7DQoJCQkJDQoJCQkJDQoJCQkJJGFjdGl2ZV90YXNrX21hc3Rlcl9pZCA9IChpbnQpJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddOw0KCQkJCQ0KCQkJCQ0KCQkJCWlmKCRzbS0+am9iX2FscmVhZHlfb3BlbigkYWN0aXZlX3Rhc2tfbWFzdGVyX2lkKSl7CQkJCQ0KCQkJCQllY2hvICdFUlJPUnxKb2IvVGFzayBBbHJlYWR5IE9wZW4uJzsNCgkJCQkJcmV0dXJuOwkJCQkJDQoJCQkJfQ0KCQkJCQkJCQkJDQoJCQkJDQoJCQkJJHNtLT5hZGRfd29ya2Zsb3dfdGFzaygkYWN0aXZlX3Rhc2tfbWFzdGVyX2lkKTsNCgkJCQkNCgkJCQkNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2FjdGl2ZV90YXNrX21hc3Rlcl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddOw0KCQkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnYWN0aXZlX3Rhc2tfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX2pvYl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWydmb3JtYm9zc19qb2JfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X2pvYl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19qb2JfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X3N0YWdlX25hbWUnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snd29ya2Zsb3dfc3RhZ2VfbmFtZSddOw0KCQkJCQ0KCQkJCQ0KCQkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsndGFza19tYXN0ZXJfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXTsNCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQkkam9iX2NvbnRyb2xzID0gbG9hZF9qb2JfY29udHJvbHMoJHRhc2tfZGF0YSk7DQoJCQkJDQoJCQkJDQoJCQkJJHRpbWVsaW5lX2FjY2Vzc190ZXN0ID0gJHdhcGktPmhhc190aW1lbGluZV9hY2Nlc3MoJHRhc2stPmFjdGl2ZV90YXNrWydmb3JtYm9zc19qb2JfbmFtZSddLCAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSwgJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddLCAkdGFzay0+YWN0aXZlX3Rhc2tbJ2lkJ10pOw0KCQkJCQ0KCQkJCWlmKCR0aW1lbGluZV9hY2Nlc3NfdGVzdFswXSA9PSB0cnVlKXsNCgkJCQkJDQoJCQkJCSRqb2JfdGltZWxpbmUgPSBsb2FkX2pvYl90aW1lbGluZSgkdGFzay0+YWN0aXZlX3Rhc2tbJ3Rhc2tfbWFzdGVyX2lkJ10sICR3b3JrZmxvd19qb2JfaWQsICR0YXNrX2RhdGEpOw0KCQkJCQkNCgkJCQl9DQoJCQkJDQoJCQkJDQoJCQkJJGpvYl90YXNrX21hbWFuZ21lbnQgPSBsb2FkX2pvYl90YXNrX21hbmFnZW1lbnQoJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddLCAkd29ya2Zsb3dfam9iX2lkLCAkdGFza19kYXRhKTsNCgkJCQkNCgkJCQkkam9iX2NvbnRlbnQgPSBsb2FkX2pvYl9kYXRhKCR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXSwgJHRhc2stPmFjdGl2ZV90YXNrWydmb3JtYm9zc19qb2JfbmFtZSddLCAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X2pvYl9pZCddLCAkdGFzay0+c3RhZ2UtPnN0YWdlX3RhcmdldCwgJHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19zdGFnZV9uYW1lJ10pOw0KCQkJCQ0KCQkJCQ0KCQkJfSBlbHNlIHsNCgkJCQkNCgkJCQkNCgkJCQllY2hvICJFUlJPUnx7JHRhc2tfZGF0YVsxXX0iOw0KCQkJCQlyZXR1cm47CQkNCgkJCQkNCgkJCX0NCgkJCQ0KCQkJYnJlYWs7DQoJCQkNCgkJY2FzZSAnbG9hZC1hcmNoaXZlZC1qb2InIDoNCgkJCQ0KCQkJDQoJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ0lTX0ZPUk1CT1NTX1dPUktGTE9XX05FV19KT0InXSA9IGZhbHNlOw0KCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydJU19GT1JNQk9TU19XT1JLRkxPV19FWElTVElOR19KT0InXSA9IHRydWU7DQoJCQkNCgkJCQ0KCQkJJHdvcmtmbG93X2pvYl9pZCA9IGlzc2V0ICggJF9QT1NUIFsnd29ya2Zsb3dfam9iX2lkJ10gKSA/ICRfUE9TVCBbJ3dvcmtmbG93X2pvYl9pZCddIDogJyc7DQoJCQkkZm9ybWJvc3Nfam9iX25hbWUgPSBpc3NldCAoICRfUE9TVCBbJ2pvYl9uYW1lJ10gKSA/ICRfUE9TVCBbJ2pvYl9uYW1lJ10gOiAnJzsNCgkJCSR0YXNrX21hc3Rlcl9pZCA9IGlzc2V0ICggJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSApID8gJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSA6ICcnOw0KCQkJJGFjdGl2ZV90YXNrX2lkID0gaXNzZXQgKCAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddICkgPyAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddIDogJyc7DQoJCQkNCgkJCWlmKCR3b3JrZmxvd19qb2JfaWQgPT0gJycgfHwgJGZvcm1ib3NzX2pvYl9uYW1lID09ICcnKQ0KCQkJCXJldHVybjsNCgkJCQ0KCQkJDQoJCQkkdGFza19kYXRhID0gaGFzX2FyY2hpdmVkX3Rhc2tfYWNjZXNzKCR3b3JrZmxvd19qb2JfaWQsICRmb3JtYm9zc19qb2JfbmFtZSwgJHRhc2tfbWFzdGVyX2lkLCAkYWN0aXZlX3Rhc2tfaWQpOw0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQlpZigkdGFza19kYXRhWzBdKXsNCg0KCQkJCQ0KCQkJCSRhY3RpdmVfdGFza19tYXN0ZXJfaWQgPSAkdGFza19tYXN0ZXJfaWQ7DQoJCQkJDQoJCQkJJHRhc2sgPSAkdGFza19kYXRhWzFdOyANCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2FjdGl2ZV90YXNrX21hc3Rlcl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddOw0KCQkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnYWN0aXZlX3Rhc2tfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX2pvYl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWydmb3JtYm9zc19qb2JfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X2pvYl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19qb2JfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X3N0YWdlX25hbWUnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snd29ya2Zsb3dfc3RhZ2VfbmFtZSddOw0KCQkJCQ0KCQkJCQ0KCQkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsndGFza19tYXN0ZXJfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXTsNCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQkkam9iX2NvbnRyb2xzID0gbG9hZF9qb2JfY29udHJvbHMoJHRhc2tfZGF0YSk7DQoJCQkJDQoJCQkJJHRpbWVsaW5lX2FjY2Vzc190ZXN0ID0gJHdhcGktPmhhc190aW1lbGluZV9hY2Nlc3MoJHRhc2stPmFjdGl2ZV90YXNrWydmb3JtYm9zc19qb2JfbmFtZSddLCAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSwgJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddLCAkdGFzay0+YWN0aXZlX3Rhc2tbJ2lkJ10pOw0KCQkJCQ0KCQkJCWlmKCR0aW1lbGluZV9hY2Nlc3NfdGVzdFswXSA9PSB0cnVlKXsNCgkJCQkNCgkJCQkJJGpvYl90aW1lbGluZSA9IGxvYWRfam9iX3RpbWVsaW5lKCR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXSwgJHdvcmtmbG93X2pvYl9pZCwgJHRhc2tfZGF0YSk7DQoJCQkJCQ0KCQkJCX0NCgkJCQkNCgkJCQkkam9iX3Rhc2tfbWFtYW5nbWVudCA9IGxvYWRfam9iX3Rhc2tfbWFuYWdlbWVudCgkdGFzay0+YWN0aXZlX3Rhc2tbJ3Rhc2tfbWFzdGVyX2lkJ10sICR3b3JrZmxvd19qb2JfaWQsICR0YXNrX2RhdGEpOw0KCQkJCQ0KCQkJCSRqb2JfY29udGVudCA9IGxvYWRfam9iX2RhdGEoJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddLCAkdGFzay0+YWN0aXZlX3Rhc2tbJ2Zvcm1ib3NzX2pvYl9uYW1lJ10sICR0YXNrLT5hY3RpdmVfdGFza1snd29ya2Zsb3dfam9iX2lkJ10sICR0YXNrLT5zdGFnZS0+c3RhZ2VfdGFyZ2V0LCAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSk7DQoJCQkJDQoJCQkJDQoJCQl9IGVsc2Ugew0KCQkJCQ0KCQkJCQ0KCQkJCWVjaG8gIkVSUk9SfHskdGFza19kYXRhWzFdfSI7DQoJCQkJCXJldHVybjsJCQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJCQlicmVhazsNCgkJCQ0KCQkJDQoJCWNhc2UgJ2xvYWQtam9iLXRpbWVsaW5lJyA6DQoJCQkNCgkJCQ0KCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydJU19GT1JNQk9TU19XT1JLRkxPV19ORVdfSk9CJ10gPSBmYWxzZTsNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnSVNfRk9STUJPU1NfV09SS0ZMT1dfRVhJU1RJTkdfSk9CJ10gPSB0cnVlOw0KCQkJDQoJCQkNCgkJCSRmb3JtYm9zc19qb2JfbmFtZSA9IGlzc2V0ICggJF9QT1NUIFsnZm9ybWJvc3Nfam9iX25hbWUnXSApID8gJF9QT1NUIFsnZm9ybWJvc3Nfam9iX25hbWUnXSA6ICcnOw0KCQkJJHdvcmtmbG93X3N0YWdlX25hbWUgPSBpc3NldCAoICRfUE9TVCBbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSApID8gJF9QT1NUIFsnd29ya2Zsb3dfc3RhZ2VfbmFtZSddIDogJyc7DQoJCQkkd29ya2Zsb3dfam9iX2lkID0gaXNzZXQgKCAkX1BPU1QgWyd3b3JrZmxvd19qb2JfaWQnXSApID8gJF9QT1NUIFsnd29ya2Zsb3dfam9iX2lkJ10gOiAnJzsNCgkJCSR0YXNrX21hc3Rlcl9pZCA9IGlzc2V0ICggJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSApID8gJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSA6ICcnOw0KCQkJJGFjdGl2ZV90YXNrX2lkID0gaXNzZXQgKCAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddICkgPyAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddIDogJyc7DQoJCQkkbG9hZF9tb3N0X3JlY2VudCA9IGlzc2V0ICggJF9QT1NUIFsnbG9hZF9tb3N0X3JlY2VudCddICkgPyAkX1BPU1QgWydsb2FkX21vc3RfcmVjZW50J10gOiAnJzsNCgkJCQ0KCQkJaWYoJHdvcmtmbG93X2pvYl9pZCA9PSAnJyB8fCAkd29ya2Zsb3dfc3RhZ2VfbmFtZSA9PSAnJykNCgkJCQlyZXR1cm47DQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJaWYoJGxvYWRfbW9zdF9yZWNlbnQgPT0gJ3RydWUnKXsNCgkJCQkkdGFza19kYXRhID0gaGFzX3Rhc2tfYWNjZXNzKCR3b3JrZmxvd19qb2JfaWQsICRmb3JtYm9zc19qb2JfbmFtZSwgJHRhc2tfbWFzdGVyX2lkLCAkYWN0aXZlX3Rhc2tfaWQpOw0KCQkJCSR0aW1lbGluZV9sb2FkID0gJ2ZhbHNlJzsNCgkJCX0gZWxzZSB7DQoJCQkJDQoJCQkJJHRhc2tfZGF0YSA9IGhhc190aW1lbGluZV90YXNrX2FjY2VzcygkZm9ybWJvc3Nfam9iX25hbWUsICR3b3JrZmxvd19zdGFnZV9uYW1lLCAkd29ya2Zsb3dfam9iX2lkLCAkdGFza19tYXN0ZXJfaWQsICRhY3RpdmVfdGFza19pZCk7DQoJCQkJJHRpbWVsaW5lX2xvYWQgPSAndHJ1ZSc7DQoJCQl9DQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJaWYoJHRhc2tfZGF0YVswXSl7DQoNCgkJCQkNCgkJCQkkYWN0aXZlX3Rhc2tfbWFzdGVyX2lkID0gKGludCkkdGFza19tYXN0ZXJfaWQ7DQoJCQkJDQoJCQkJJHRhc2sgPSAkdGFza19kYXRhWzFdOyANCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2FjdGl2ZV90YXNrX21hc3Rlcl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddOw0KCQkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnYWN0aXZlX3Rhc2tfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX2pvYl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWydmb3JtYm9zc19qb2JfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X2pvYl9pZCddID0gJHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19qb2JfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X3N0YWdlX25hbWUnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snd29ya2Zsb3dfc3RhZ2VfbmFtZSddOw0KCQkJCQ0KCQkJCQ0KCQkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsndGFza19tYXN0ZXJfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXTsNCgkJCQkNCgkJCQkNCgkJCQkkam9iX2NvbnRyb2xzID0gbG9hZF9qb2JfY29udHJvbHMoJHRhc2tfZGF0YSwgJHRpbWVsaW5lX2xvYWQpOw0KCQkJCQ0KCQkJCSRqb2JfdGltZWxpbmUgPSBsb2FkX2pvYl90aW1lbGluZSgkdGFzay0+YWN0aXZlX3Rhc2tbJ3Rhc2tfbWFzdGVyX2lkJ10sICR3b3JrZmxvd19qb2JfaWQsICR0YXNrX2RhdGEpOw0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCSRqb2JfdGFza19tYW1hbmdtZW50ID0gbG9hZF9qb2JfdGFza19tYW5hZ2VtZW50KCR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXSwgJHdvcmtmbG93X2pvYl9pZCwgJHRhc2tfZGF0YSk7DQoJCQkJDQoJCQkJJGpvYl9jb250ZW50ID0gbG9hZF9qb2JfZGF0YV90aW1lbGluZSgkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X2RhdGEnXSwgDQoJCQkJCQkJCQkJCQkJICAkdGFzay0+YWN0aXZlX3Rhc2tbJ3Rhc2tfbWFzdGVyX2lkJ10sIA0KCQkJCQkJCQkJCQkJCSAgJHRhc2stPmFjdGl2ZV90YXNrWydpZCddLCANCgkJCQkJCQkJCQkJCQkgICR0YXNrLT5hY3RpdmVfdGFza1snZm9ybWJvc3Nfam9iX25hbWUnXSwgDQoJCQkJCQkJCQkJCQkJICAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X2pvYl9pZCddLCANCgkJCQkJCQkJCQkJCQkgICR0YXNrLT5zdGFnZS0+c3RhZ2VfdGFyZ2V0LCANCgkJCQkJCQkJCQkJCQkgICR0YXNrLT5hY3RpdmVfdGFza1snd29ya2Zsb3dfc3RhZ2VfbmFtZSddKTsNCgkJCQkNCgkJCQkNCgkJCX0gZWxzZSB7DQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJaWYoJHRhc2tfZGF0YVsxXSAhPSAiIil7DQoJCQkJCWVjaG8gJHRhc2tfZGF0YVsxXTsNCgkJCQl9IGVsc2Ugew0KCQkJCQllY2hvICdFUlJPUnxZb3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuJzsNCgkJCQl9DQoJCQkJZGllOw0KCQkJfQ0KDQoJCQlicmVhazsNCgkJCQ0KCQkNCgkJDQoJCQ0KCQljYXNlICdsb2FkLWpvYi10aW1lbGluZS1wcmludC12aWV3JyA6DQoJCQkNCgkJCQ0KCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydJU19GT1JNQk9TU19XT1JLRkxPV19ORVdfSk9CJ10gPSBmYWxzZTsNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnSVNfRk9STUJPU1NfV09SS0ZMT1dfRVhJU1RJTkdfSk9CJ10gPSB0cnVlOw0KCQkJDQoJCQkNCgkJCSRmb3JtYm9zc19qb2JfbmFtZSA9IGlzc2V0ICggJF9QT1NUIFsnZm9ybWJvc3Nfam9iX25hbWUnXSApID8gJF9QT1NUIFsnZm9ybWJvc3Nfam9iX25hbWUnXSA6ICcnOw0KCQkJJHdvcmtmbG93X3N0YWdlX25hbWUgPSBpc3NldCAoICRfUE9TVCBbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSApID8gJF9QT1NUIFsnd29ya2Zsb3dfc3RhZ2VfbmFtZSddIDogJyc7DQoJCQkkd29ya2Zsb3dfam9iX2lkID0gaXNzZXQgKCAkX1BPU1QgWyd3b3JrZmxvd19qb2JfaWQnXSApID8gJF9QT1NUIFsnd29ya2Zsb3dfam9iX2lkJ10gOiAnJzsNCgkJCSR0YXNrX21hc3Rlcl9pZCA9IGlzc2V0ICggJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSApID8gJF9QT1NUIFsndGFza19tYXN0ZXJfaWQnXSA6ICcnOw0KCQkJJGFjdGl2ZV90YXNrX2lkID0gaXNzZXQgKCAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddICkgPyAkX1BPU1QgWydhY3RpdmVfdGFza19pZCddIDogJyc7DQoJCQkkbG9hZF9tb3N0X3JlY2VudCA9IGlzc2V0ICggJF9QT1NUIFsnbG9hZF9tb3N0X3JlY2VudCddICkgPyAkX1BPU1QgWydsb2FkX21vc3RfcmVjZW50J10gOiAnJzsNCgkJCQ0KCQkJDQoJCQkkbG9hZF9sb2NhdGlvbiA9IGlzc2V0ICggJF9QT1NUIFsnbG9hZF9sb2NhdGlvbiddICkgPyAkX1BPU1QgWydsb2FkX2xvY2F0aW9uJ10gOiAnaW5saW5lJzsgDQoNCgkJCSRwcmludF90eXBlID0gaXNzZXQoJF9QT1NUWydwcmludF90eXBlJ10pID8gJF9QT1NUWydwcmludF90eXBlJ10gOiAncHJpbnRfYWxsJzsgDQoJCQkNCgkJCWlmKCR3b3JrZmxvd19qb2JfaWQgPT0gJycgfHwgJHdvcmtmbG93X3N0YWdlX25hbWUgPT0gJycpDQoJCQkJcmV0dXJuOw0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCWlmKCRsb2FkX21vc3RfcmVjZW50ID09ICd0cnVlJyl7DQoJCQkJJHRhc2tfZGF0YSA9IGhhc190YXNrX2FjY2Vzcygkd29ya2Zsb3dfam9iX2lkLCAkZm9ybWJvc3Nfam9iX25hbWUsICR0YXNrX21hc3Rlcl9pZCwgJGFjdGl2ZV90YXNrX2lkKTsNCgkJCQkkdGltZWxpbmVfbG9hZCA9ICdmYWxzZSc7DQoJCQl9IGVsc2Ugew0KCQkJCSR0YXNrX2RhdGEgPSBoYXNfdGltZWxpbmVfdGFza19hY2Nlc3MoJGZvcm1ib3NzX2pvYl9uYW1lLCAkd29ya2Zsb3dfc3RhZ2VfbmFtZSwgJHdvcmtmbG93X2pvYl9pZCwgJHRhc2tfbWFzdGVyX2lkLCAkYWN0aXZlX3Rhc2tfaWQpOw0KCQkJCSR0aW1lbGluZV9sb2FkID0gJ3RydWUnOw0KCQkJfQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCWlmKCR0YXNrX2RhdGFbMF0pew0KDQoJCQkJDQoJCQkJJGFjdGl2ZV90YXNrX21hc3Rlcl9pZCA9IChpbnQpJHRhc2tfbWFzdGVyX2lkOw0KCQkJCQ0KCQkJCSR0YXNrID0gJHRhc2tfZGF0YVsxXTsgDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJDQoJCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydhY3RpdmVfdGFza19tYXN0ZXJfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1sndGFza19tYXN0ZXJfaWQnXTsNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2FjdGl2ZV90YXNrX2lkJ10gPSAkdGFzay0+YWN0aXZlX3Rhc2tbJ2lkJ107DQoJCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydmb3JtYm9zc19qb2JfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snZm9ybWJvc3Nfam9iX2lkJ107DQoJCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWyd3b3JrZmxvd19qb2JfaWQnXSA9ICR0YXNrLT5hY3RpdmVfdGFza1snd29ya2Zsb3dfam9iX2lkJ107DQoJCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWyd3b3JrZmxvd19zdGFnZV9uYW1lJ10gPSAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXTsNCgkJCQkNCgkJCQkNCgkJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3Rhc2tfbWFzdGVyX2lkJ10gPSAkdGFzay0+YWN0aXZlX3Rhc2tbJ3Rhc2tfbWFzdGVyX2lkJ107DQoJCQkJDQoJCQkJDQoJCQkJJGpvYl9jb250cm9scyA9ICcnOw0KCQkJCQ0KCQkJCSRqb2JfdGltZWxpbmUgPSAnJzsNCgkJCQkNCgkJCQkkam9iX3Rhc2tfbWFtYW5nbWVudCA9ICcnOw0KCQkJCQ0KCQkJCSRqb2JfY29udGVudCA9IGxvYWRfam9iX2RhdGFfdGltZWxpbmUoJHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19kYXRhJ10sIA0KCQkJCQkJCQkJCQkJCSAgJHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddLCANCgkJCQkJCQkJCQkJCQkgICR0YXNrLT5hY3RpdmVfdGFza1snaWQnXSwgDQoJCQkJCQkJCQkJCQkJICAkdGFzay0+YWN0aXZlX3Rhc2tbJ2Zvcm1ib3NzX2pvYl9uYW1lJ10sIA0KCQkJCQkJCQkJCQkJCSAgJHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19qb2JfaWQnXSwgDQoJCQkJCQkJCQkJCQkJICAkdGFzay0+c3RhZ2UtPnN0YWdlX3RhcmdldCwgDQoJCQkJCQkJCQkJCQkJICAkdGFzay0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSwNCgkJCQkJCQkJCQkJCQkgICRsb2FkX2xvY2F0aW9uLA0KCQkJCQkJCQkJCQkJCSAgJHByaW50X3R5cGUpOw0KCQkJCQ0KCQkJCQ0KCQkJfSBlbHNlIHsNCgkJCQkNCgkJCQllY2hvICdFUlJPUnxZb3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuJzsNCgkJCQlkaWU7DQoJCQl9DQoNCgkJCWJyZWFrOw0KCQkNCgl9DQoJDQoJDQoJDQoJDQoJDQoJDQoJDQp9DQoNCg0KZnVuY3Rpb24gaGFzX3Rhc2tfYWNjZXNzKCR3b3JrZmxvd19qb2JfaWQsICRmb3JtYm9zc19qb2JfbmFtZSwgJHRhc2tfbWFzdGVyX2lkLCAkYWN0aXZlX3Rhc2tfaWQpew0KCQ0KCQ0KCSRzcWwgPSAiU0VMRUNUIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcy5pZCBBUyBpZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X3Rhc2tfbWFzdGVyLnRhc2tfb3JpZ2luYXRvcl91c2VyX2lkDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLndvcmtmbG93X3N0YWdlX25hbWUNCgkJCSAgICAgLCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3Mud29ya2Zsb3dfc3RhZ2VfdG9fbG9hZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcy50YXNrX21hc3Rlcl9pZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcy50YXNrX3VzZXJfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19qb2JzLmZvcm1ib3NzX2pvYl9pZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X2pvYnMuZm9ybWJvc3Nfam9iX25hbWUNCgkJCSAgICAgLCBmYl93b3JrZmxvd19qb2JzLmlkIEFTIHdvcmtmbG93X2pvYl9pZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X2pvYnMud29ya2Zsb3dfZGF0YQ0KCQkJICAgICAsIGZiX2pvYnMuam9iX25hbWUNCgkJCUZST00NCgkJCSAgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzDQoJCQlJTk5FUiBKT0lOIGZiX3dvcmtmbG93X2pvYnMNCgkJCU9OIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcy53b3JrZmxvd19qb2JfaWQgPSBmYl93b3JrZmxvd19qb2JzLmlkDQoJCQlJTk5FUiBKT0lOIGZiX3dvcmtmbG93X3Rhc2tfbWFzdGVyDQoJCQlPTiBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MudGFza19tYXN0ZXJfaWQgPSBmYl93b3JrZmxvd190YXNrX21hc3Rlci5pZA0KCQkJSU5ORVIgSk9JTiBmYl9qb2JzDQoJCQlPTiBmYl93b3JrZmxvd19qb2JzLmZvcm1ib3NzX2pvYl9pZCA9IGZiX2pvYnMuaWQNCgkJCVdIRVJFIGZiX2pvYnMuam9iX25hbWUgPSA/IEFORCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MudGFza19tYXN0ZXJfaWQgPSA/IEFORCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MuaWQgPSA/IEFORCBmYl93b3JrZmxvd190YXNrX21hc3Rlci53b3JrZmxvd19jb21wbGV0ZSA9IDANCgkJCU9SREVSIEJZIGlkIERFU0MgTElNSVQgMSI7IA0KCQ0KCQ0KCSRwYXJhbXMgPSBhcnJheSAoJGZvcm1ib3NzX2pvYl9uYW1lLCAkdGFza19tYXN0ZXJfaWQsICRhY3RpdmVfdGFza19pZCk7DQoJJGFjdGl2ZV90YXNrcyA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkNCglpZighJGFjdGl2ZV90YXNrcyl7DQoJCWVjaG8gJ05vIHBlbmRpbmcgdGFza3MnOw0KCX0NCgkNCgkNCglpZigkYWN0aXZlX3Rhc2tzWzFdWzBdWydpZCddID09ICcnKXsNCgkJDQoJCXVuc2V0KCRhY3RpdmVfdGFza3NbMV1bMF0pOw0KCQkNCgkJDQoJCQ0KCQkNCgkJcmV0dXJuIGFycmF5KGZhbHNlLCAiRVJST1J8VGhpcyBzdGFnZSBjYW5ub3QgYmUgbG9hZGVkIGFzIHRoZSB3b3JrZmxvdyBpcyBhbHJlYWR5IGNvbXBsZXRlLiIpOw0KCX0NCgkNCgkNCgkNCgkNCgkkcGVuZGluZ190YXNrcyA9IGFycmF5KCk7DQoJDQoJDQoJDQoJJHNxbCA9ICJTRUxFQ1QgZmJfYWRtaW4udXNlcl9uYW1lLCBmYl93b3JrZmxvd19ncm91cHMuZ3JvdXBfbmFtZSBGUk9NIGZiX2FkbWluDQoJCQlJTk5FUiBKT0lOIGZiX3dvcmtmbG93X2dyb3VwcyBPTiBmYl93b3JrZmxvd19ncm91cHMuaWQgPSBmYl9hZG1pbi53b3JrZmxvd19ncm91cF9pZA0KCQkJV0hFUkUgZmJfYWRtaW4udXNlcl9pZCA9ID8iOw0KCSRwYXJhbXMgPSBhcnJheSAoJF9TRVNTSU9OWydmYl91c2VyX2lkJ10pOw0KCQ0KCSR1c2Vyc19hbmRfZ3JvdXBzID0gRGF0YWJhc2U6OnBkb19wcm9jZWR1cmVfcGFyYW1zICggJHNxbCwgJHBhcmFtcywgMCApOw0KCQ0KDQoJDQoJJGFzc29jaWF0aW9ucyA9IGFycmF5KCR1c2Vyc19hbmRfZ3JvdXBzWzFdWzBdWyd1c2VyX25hbWUnXSwgJHVzZXJzX2FuZF9ncm91cHNbMV1bMF1bJ2dyb3VwX25hbWUnXSk7DQoJDQoJZm9yZWFjaCgkYWN0aXZlX3Rhc2tzWzFdIGFzICRhY3RpdmVfdGFzayl7DQoJCQ0KCQkNCgkJJHdvcmtmbG93X2RhdGEgPSBqc29uX2RlY29kZShiYXNlNjRfZGVjb2RlKCRhY3RpdmVfdGFza1snd29ya2Zsb3dfZGF0YSddKSk7DQoJCQ0KCQkNCgkJJGZvdW5kID0gZmFsc2U7ICRuZXh0X3N0YWdlID0gbnVsbDsgJGN1cnJlbnRfc3RhZ2UgPSBudWxsOw0KCQkNCgkJDQoJCQ0KCQlpZihpc3NldCgkYWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX3RvX2xvYWQnXSkgJiYgJGFjdGl2ZV90YXNrWyd3b3JrZmxvd19zdGFnZV90b19sb2FkJ10gIT0gJycpew0KCQkJDQoJCQlmb3JlYWNoKCR3b3JrZmxvd19kYXRhLT5zdGFnZXMgYXMgJGtleSA9PiAkc3RhZ2Upew0KCQkJCQ0KCQkJCWlmKCRrZXkgPT0gJGFjdGl2ZV90YXNrWyd3b3JrZmxvd19zdGFnZV90b19sb2FkJ10pew0KCQkJCQkNCgkJCQkJJG5leHRfc3RhZ2UgPSAkc3RhZ2U7DQoJCQkJCSRjdXJyZW50X3N0YWdlID0gJGFjdGl2ZV90YXNrWyd3b3JrZmxvd19zdGFnZV90b19sb2FkJ107DQoJCQkJCQ0KCQkJCX0NCgkJCQkNCgkJCX0NCgkJCQ0KCQl9IGVsc2UgeyANCgkJDQoJCQlmb3JlYWNoKCR3b3JrZmxvd19kYXRhLT5zdGFnZXMgYXMgJGtleSA9PiAkc3RhZ2Upew0KCQkJCWlmKCRmb3VuZCl7DQoJCQkJCSRuZXh0X3N0YWdlID0gJHN0YWdlOw0KCQkJCQkkY3VycmVudF9zdGFnZSA9ICRrZXk7IA0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQkJaWYoJGtleSA9PSAkYWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXSl7DQoJCQkJCSRmb3VuZCA9IHRydWU7DQoNCgkJCQkJJG5leHRfc3RhZ2UgPSAkc3RhZ2U7DQoJCQkJCSRjdXJyZW50X3N0YWdlID0gJGtleTsgDQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCX0NCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKCRuZXh0X3N0YWdlICE9IG51bGwpew0KCQkJDQoJCQkNCg0KCQkJZm9yZWFjaCgkbmV4dF9zdGFnZS0+dXNlcnMgYXMgJHVzZXIpew0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCQ0KCQkJCWlmKCFpc3NldCgkdXNlci0+bmFtZSkpew0KDQoJCQkJCWZvcmVhY2goJGFzc29jaWF0aW9ucyBhcyAkdSl7DQoJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJaWYodHJpbSgkbmV4dF9zdGFnZS0+dXNlcnMtPm5hbWUpID09ICR1KXsNCgkJCQkJCQkNCgkJCQkJCQkNCgkJCQkJCQkkdGFza190bXAgPSBuZXcgc3RkQ2xhc3MoKTsNCgkJCQkJCQkkdGFza190bXAtPmFjdGl2ZV90YXNrID0gJGFjdGl2ZV90YXNrOyANCgkJCQkJCQkkdGFza190bXAtPnN0YWdlID0gJG5leHRfc3RhZ2U7DQoJCQkJCQkJJHRhc2tfdG1wLT5jdXJyZW50X3N0YWdlID0gJGN1cnJlbnRfc3RhZ2U7DQoJCQkJCQkJJHRhc2tfdG1wLT5tYXRjaGluZ191c2VyID0gJG5leHRfc3RhZ2UtPnVzZXJzOyANCg0KCQkJCQkJCSRwZW5kaW5nX3Rhc2tzW10gPSAkdGFza190bXA7DQoNCgkJCQkJCX0NCgkJCQkJDQoJCQkJCX0NCg0KCQkJCQlicmVhazsgDQoNCgkJCQl9IGVsc2Ugew0KCQkJCQ0KCQkJCQkNCgkJCQkJZm9yZWFjaCgkYXNzb2NpYXRpb25zIGFzICR1KXsNCgkJCQkJCQ0KCQkJCQkJDQoJCQkJCQlpZih0cmltKCR1c2VyLT5uYW1lKSA9PSAkdSl7DQoJCQkJCQkJDQoJCQkJCQkJDQoJCQkJCQkJJHRhc2tfdG1wID0gbmV3IHN0ZENsYXNzKCk7DQoJCQkJCQkJJHRhc2tfdG1wLT5hY3RpdmVfdGFzayA9ICRhY3RpdmVfdGFzazsgDQoJCQkJCQkJJHRhc2tfdG1wLT5zdGFnZSA9ICRuZXh0X3N0YWdlOw0KCQkJCQkJCSR0YXNrX3RtcC0+Y3VycmVudF9zdGFnZSA9ICRjdXJyZW50X3N0YWdlOw0KCQkJCQkJCSR0YXNrX3RtcC0+bWF0Y2hpbmdfdXNlciA9ICR1c2VyOyANCg0KCQkJCQkJCSRwZW5kaW5nX3Rhc2tzW10gPSAkdGFza190bXA7DQoJCQkJCQkJDQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJfQ0KCQkJCQkNCgkJCQl9DQoJCQkJDQoJCQl9DQoJCQkNCgkJfQ0KCQkNCgkJDQoJfQ0KCQ0KCQ0KCQ0KCWlmKGNvdW50KCRwZW5kaW5nX3Rhc2tzKSA9PSAwKXsNCgkJDQoJCXJldHVybiBhcnJheShmYWxzZSwgIldhcm5pbmc6IENhbm5vdCBsb2FkIHRoaXMgdGFzayBiZWNhdXNlIHRoZSB0YXNrIGhhcyBiZWNvbWUgY29ycnVwdGVkLCBvciB0aGUgdGFzayB3b3JrZmxvdyBpcyBhbHJlYWR5IGNvbXBsZXRlLlxuXG5JbiB0aGUgY2FzZSBvZiB0aGUgZm9ybWVyLCB0aGlzIHVzdWFsbHkgbWVhbnMgYSBiYWQgU3RhZ2UgT3ZlcnJpZGUgaGFzIGJlZW4gc2V0LCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBqb2IgcGFyYW1ldGVycyBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBjcmVhdGlvbi4iKTsNCgkJDQoJfSBlbHNlIGlmKGNvdW50KCRwZW5kaW5nX3Rhc2tzKSA9PSAxKSB7DQoJCQ0KCQlpZigkcGVuZGluZ190YXNrcyA9PSAnJyl7DQoJCQkNCgkJCXJldHVybiBhcnJheShmYWxzZSwgJ1dhcm5pbmc6IENhbm5vdCBsb2FkIHRoaXMgdGFzayBiZWNhdXNlIHRoZSB0YXNrIGhhcyBiZWNvbWUgY29ycnVwdGVkLCBvciB0aGUgd29ya2Zsb3cgaXMgYWxyZWFkeSBjb21wbGV0ZS4nKTsNCgkJCQ0KCQl9IGVsc2Ugew0KCQkJDQoJCQkNCgkJCXJldHVybiBhcnJheSh0cnVlLCAkcGVuZGluZ190YXNrc1swXSk7DQoJCQ0KCQl9DQoJCQ0KCX0NCgkNCn0NCg0KDQoNCmZ1bmN0aW9uIGhhc19hcmNoaXZlZF90YXNrX2FjY2Vzcygkd29ya2Zsb3dfam9iX2lkLCAkZm9ybWJvc3Nfam9iX25hbWUsICR0YXNrX21hc3Rlcl9pZCwgJGFjdGl2ZV90YXNrX2lkKXsNCgkNCgkNCgkkc3FsID0gIlNFTEVDVCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MuaWQgQVMgaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd190YXNrX21hc3Rlci50YXNrX29yaWdpbmF0b3JfdXNlcl9pZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcy53b3JrZmxvd19zdGFnZV9uYW1lDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLndvcmtmbG93X3N0YWdlX3RvX2xvYWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MudGFza19tYXN0ZXJfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MudGFza191c2VyX2lkDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfam9icy5mb3JtYm9zc19qb2JfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19qb2JzLmZvcm1ib3NzX2pvYl9uYW1lDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfam9icy5pZCBBUyB3b3JrZmxvd19qb2JfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19qb2JzLndvcmtmbG93X2RhdGENCgkJCSAgICAgLCBmYl9qb2JzLmpvYl9uYW1lDQoJCQlGUk9NDQoJCQkgIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcw0KCQkJSU5ORVIgSk9JTiBmYl93b3JrZmxvd19qb2JzDQoJCQlPTiBmYl93b3JrZmxvd19hY3RpdmVfdGFza3Mud29ya2Zsb3dfam9iX2lkID0gZmJfd29ya2Zsb3dfam9icy5pZA0KCQkJSU5ORVIgSk9JTiBmYl93b3JrZmxvd190YXNrX21hc3Rlcg0KCQkJT04gZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLnRhc2tfbWFzdGVyX2lkID0gZmJfd29ya2Zsb3dfdGFza19tYXN0ZXIuaWQNCgkJCUlOTkVSIEpPSU4gZmJfam9icw0KCQkJT04gZmJfd29ya2Zsb3dfam9icy5mb3JtYm9zc19qb2JfaWQgPSBmYl9qb2JzLmlkDQoJCQlXSEVSRSBmYl9qb2JzLmpvYl9uYW1lID0gPyBBTkQgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLnRhc2tfbWFzdGVyX2lkID0gPyANCgkJCUFORCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MuaWQgPSA/IA0KCQkJQU5EIGZiX3dvcmtmbG93X3Rhc2tfbWFzdGVyLndvcmtmbG93X2NvbXBsZXRlID0gMQ0KCQkJT1JERVIgQlkgaWQgREVTQyBMSU1JVCAxIjsgDQoJDQoJDQoJJHBhcmFtcyA9IGFycmF5ICgkZm9ybWJvc3Nfam9iX25hbWUsICR0YXNrX21hc3Rlcl9pZCwgJGFjdGl2ZV90YXNrX2lkKTsNCgkkYWN0aXZlX3Rhc2tzID0gRGF0YWJhc2U6OnBkb19wcm9jZWR1cmVfcGFyYW1zICggJHNxbCwgJHBhcmFtcywgMCApOw0KCQ0KCWlmKCEkYWN0aXZlX3Rhc2tzKXsNCgkJZWNobyAnTm8gcGVuZGluZyB0YXNrcyc7DQoJfQ0KCQ0KCQ0KCWlmKCRhY3RpdmVfdGFza3NbMV1bMF1bJ2lkJ10gPT0gJycpew0KCQl1bnNldCgkYWN0aXZlX3Rhc2tzWzFdWzBdKTsNCgl9DQoJDQoJDQoJDQoJDQoJJGFyY2hpdmVkX3Rhc2tzID0gYXJyYXkoKTsNCgkNCgkNCgkNCgkkc3FsID0gIlNFTEVDVCBmYl9hZG1pbi51c2VyX25hbWUsIGZiX3dvcmtmbG93X2dyb3Vwcy5ncm91cF9uYW1lIEZST00gZmJfYWRtaW4NCgkJCUlOTkVSIEpPSU4gZmJfd29ya2Zsb3dfZ3JvdXBzIE9OIGZiX3dvcmtmbG93X2dyb3Vwcy5pZCA9IGZiX2FkbWluLndvcmtmbG93X2dyb3VwX2lkDQoJCQlXSEVSRSBmYl9hZG1pbi51c2VyX2lkID0gPyI7DQoJJHBhcmFtcyA9IGFycmF5ICgkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXSk7DQoJDQoJJHVzZXJzX2FuZF9ncm91cHMgPSBEYXRhYmFzZTo6cGRvX3Byb2NlZHVyZV9wYXJhbXMgKCAkc3FsLCAkcGFyYW1zLCAwICk7DQoJDQoNCgkNCgkkYXNzb2NpYXRpb25zID0gYXJyYXkoJHVzZXJzX2FuZF9ncm91cHNbMV1bMF1bJ3VzZXJfbmFtZSddLCAkdXNlcnNfYW5kX2dyb3Vwc1sxXVswXVsnZ3JvdXBfbmFtZSddKTsNCgkNCgkNCglmb3JlYWNoKCRhY3RpdmVfdGFza3NbMV0gYXMgJGFjdGl2ZV90YXNrKXsNCgkJDQoJCQ0KCQkkd29ya2Zsb3dfZGF0YSA9IGpzb25fZGVjb2RlKGJhc2U2NF9kZWNvZGUoJGFjdGl2ZV90YXNrWyd3b3JrZmxvd19kYXRhJ10pKTsNCgkJDQoJCQ0KCQkkbGFzdF9zdGFnZSA9IG51bGw7IA0KCQkkY3VycmVudF9zdGFnZSA9ICcnOw0KCQkNCgkJZm9yZWFjaCgkd29ya2Zsb3dfZGF0YS0+c3RhZ2VzIGFzICRrZXkgPT4gJHN0YWdlKXsNCgkJCSRsYXN0X3N0YWdlID0gJHN0YWdlOw0KCQkJJGN1cnJlbnRfc3RhZ2UgPSAka2V5OyANCgkJfQ0KCQkNCgkJDQoJCWlmKCRsYXN0X3N0YWdlICE9IG51bGwpew0KCQkJDQoJCQkNCgkJCSR0YXNrX3RtcCA9IG5ldyBzdGRDbGFzcygpOw0KCQkJJHRhc2tfdG1wLT5hY3RpdmVfdGFzayA9ICRhY3RpdmVfdGFzazsgDQoJCQkkdGFza190bXAtPnN0YWdlID0gJGxhc3Rfc3RhZ2U7DQoJCQkkdGFza190bXAtPmN1cnJlbnRfc3RhZ2UgPSAkY3VycmVudF9zdGFnZTsNCgkJCQ0KCQkJJGFyY2hpdmVkX3Rhc2tzW10gPSAkdGFza190bXA7DQoJCQkJCQkJDQoJCQkJCQkJDQoJCX0NCgkJDQoJCQ0KCX0NCgkNCgkNCgkNCglpZihjb3VudCgkYXJjaGl2ZWRfdGFza3MpID09IDApew0KCQkNCgkJcmV0dXJuIGFycmF5KGZhbHNlLCAiV2FybmluZzogQ2Fubm90IGxvYWQgdGhpcyB0YXNrIGJlY2F1c2UgdGhlIHRhc2sgaGFzIGJlY29tZSBjb3JydXB0ZWQsIG9yIHRoZSB0YXNrIHdvcmtmbG93IGlzIGFscmVhZHkgY29tcGxldGUuXG5cbkluIHRoZSBjYXNlIG9mIHRoZSBmb3JtZXIsIHRoaXMgdXN1YWxseSBtZWFucyBhIGJhZCBTdGFnZSBPdmVycmlkZSBoYXMgYmVlbiBzZXQsIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIGpvYiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGNyZWF0aW9uLiIpOw0KCQkNCgl9IGVsc2UgaWYoY291bnQoJGFyY2hpdmVkX3Rhc2tzKSA9PSAxKSB7DQoJCQ0KCQlpZigkYXJjaGl2ZWRfdGFza3MgPT0gJycpew0KCQkJDQoJCQlyZXR1cm4gYXJyYXkoZmFsc2UsICdXYXJuaW5nOiBDYW5ub3QgbG9hZCB0aGlzIHRhc2sgYmVjYXVzZSB0aGUgdGFzayBoYXMgYmVjb21lIGNvcnJ1cHRlZCwgb3IgdGhlIHdvcmtmbG93IGlzIGFscmVhZHkgY29tcGxldGUuJyk7DQoJCQkNCgkJfSBlbHNlIHsNCgkJCQ0KCQkJDQoJCQlyZXR1cm4gYXJyYXkodHJ1ZSwgJGFyY2hpdmVkX3Rhc2tzWzBdKTsNCgkJDQoJCX0NCgkJDQoJfQ0KCQ0KfQ0KDQoNCg0KZnVuY3Rpb24gaGFzX3RpbWVsaW5lX3Rhc2tfYWNjZXNzKCRmb3JtYm9zc19qb2JfbmFtZSwgJHdvcmtmbG93X3N0YWdlX25hbWUsICR3b3JrZmxvd19qb2JfaWQsICR0YXNrX21hc3Rlcl9pZCwgJGFjdGl2ZV90YXNrX2lkKXsNCgkNCgkNCgkkc3FsID0gIlNFTEVDVCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MuaWQgQVMgaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd190YXNrX21hc3Rlci50YXNrX29yaWdpbmF0b3JfdXNlcl9pZA0KCQkJICAgICAsIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcy53b3JrZmxvd19zdGFnZV9uYW1lDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLndvcmtmbG93X3N0YWdlX3RvX2xvYWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MudGFza19tYXN0ZXJfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MudGFza191c2VyX2lkDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfam9icy5mb3JtYm9zc19qb2JfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19qb2JzLmZvcm1ib3NzX2pvYl9uYW1lDQoJCQkgICAgICwgZmJfd29ya2Zsb3dfam9icy5pZCBBUyB3b3JrZmxvd19qb2JfaWQNCgkJCSAgICAgLCBmYl93b3JrZmxvd19qb2JzLndvcmtmbG93X2RhdGENCgkJCSAgICAgLCBmYl9qb2JzLmpvYl9uYW1lDQoJCQlGUk9NDQoJCQkgIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcw0KCQkJSU5ORVIgSk9JTiBmYl93b3JrZmxvd19qb2JzDQoJCQlPTiBmYl93b3JrZmxvd19hY3RpdmVfdGFza3Mud29ya2Zsb3dfam9iX2lkID0gZmJfd29ya2Zsb3dfam9icy5pZA0KCQkJSU5ORVIgSk9JTiBmYl93b3JrZmxvd190YXNrX21hc3Rlcg0KCQkJT04gZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLnRhc2tfbWFzdGVyX2lkID0gZmJfd29ya2Zsb3dfdGFza19tYXN0ZXIuaWQNCgkJCUlOTkVSIEpPSU4gZmJfam9icw0KCQkJT04gZmJfd29ya2Zsb3dfam9icy5mb3JtYm9zc19qb2JfaWQgPSBmYl9qb2JzLmlkDQoJCQlXSEVSRSBmYl9qb2JzLmpvYl9uYW1lID0gPyBBTkQgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLnRhc2tfbWFzdGVyX2lkID0gPyBBTkQgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLmlkID0gPyI7IA0KCQ0KCQ0KCSRwYXJhbXMgPSBhcnJheSAoJGZvcm1ib3NzX2pvYl9uYW1lLCAkdGFza19tYXN0ZXJfaWQsICRhY3RpdmVfdGFza19pZCk7DQoJJGFjdGl2ZV90YXNrID0gRGF0YWJhc2U6OnBkb19wcm9jZWR1cmVfcGFyYW1zICggJHNxbCwgJHBhcmFtcywgMCApOw0KCQ0KCWlmKCEkYWN0aXZlX3Rhc2spew0KCQllY2hvICdObyBwZW5kaW5nIHRhc2tzJzsNCgl9DQoJDQoJDQoJDQoJDQoJJHNxbCA9ICJTRUxFQ1QgZmJfYWRtaW4udXNlcl9uYW1lLCBmYl93b3JrZmxvd19ncm91cHMuZ3JvdXBfbmFtZSBGUk9NIGZiX2FkbWluDQoJCQlJTk5FUiBKT0lOIGZiX3dvcmtmbG93X2dyb3VwcyBPTiBmYl93b3JrZmxvd19ncm91cHMuaWQgPSBmYl9hZG1pbi53b3JrZmxvd19ncm91cF9pZA0KCQkJV0hFUkUgZmJfYWRtaW4udXNlcl9pZCA9ID8iOw0KCSRwYXJhbXMgPSBhcnJheSAoJF9TRVNTSU9OWydmYl91c2VyX2lkJ10pOw0KCQ0KCSR1c2Vyc19hbmRfZ3JvdXBzID0gRGF0YWJhc2U6OnBkb19wcm9jZWR1cmVfcGFyYW1zICggJHNxbCwgJHBhcmFtcywgMCApOw0KCQ0KDQoJDQoJJGFzc29jaWF0aW9ucyA9IGFycmF5KCR1c2Vyc19hbmRfZ3JvdXBzWzFdWzBdWyd1c2VyX25hbWUnXSwgJHVzZXJzX2FuZF9ncm91cHNbMV1bMF1bJ2dyb3VwX25hbWUnXSk7DQoJDQoNCgkNCgkkd29ya2Zsb3dfZGF0YSA9IGpzb25fZGVjb2RlKGJhc2U2NF9kZWNvZGUoJGFjdGl2ZV90YXNrWzFdWzBdWyd3b3JrZmxvd19kYXRhJ10pKTsNCgkNCgkkc3RhZ2UgPSAkd29ya2Zsb3dfZGF0YS0+c3RhZ2VzLT4kd29ya2Zsb3dfc3RhZ2VfbmFtZTsNCg0KCSRwZW5kaW5nX3Rhc2sgPSAnJzsNCgkNCgkNCg0KCWZvcmVhY2goJHN0YWdlLT51c2VycyBhcyAkdXNlcil7DQoJCQ0KCQkNCgkJaWYoIWlzc2V0KCR1c2VyLT5uYW1lKSl7DQoNCgkJCQ0KCQkJaWYodHJpbSgkdXNlci0+bmFtZSkgPT0gJ1tUYXNrIE9yaWdpbmF0b3JdJyl7DQoJCQkJCQ0KCQkJCWlmKCRhY3RpdmVfdGFza1sxXVswXVsndGFza19vcmlnaW5hdG9yX3VzZXJfaWQnXSA9PSAkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXSAmJiAoaW50KSR1c2VyLT50aW1lbGluZV9hY2Nlc3MgPT0gMSl7DQoJCQkJCQkNCgkJCQkJDQoJCQkJCSR0YXNrX3RtcCA9IG5ldyBzdGRDbGFzcygpOw0KCQkJCQkkdGFza190bXAtPmFjdGl2ZV90YXNrID0gJGFjdGl2ZV90YXNrWzFdWzBdOyANCgkJCQkJJHRhc2tfdG1wLT5zdGFnZSA9ICRzdGFnZTsNCgkJCQkJJHRhc2tfdG1wLT5jdXJyZW50X3N0YWdlID0gJHdvcmtmbG93X3N0YWdlX25hbWU7DQoJCQkJCSR0YXNrX3RtcC0+bWF0Y2hpbmdfdXNlciA9ICR1c2VyOyANCg0KCQkJCQkkcGVuZGluZ190YXNrID0gJHRhc2tfdG1wOw0KCQkJCQkJDQoJCQkJfQ0KCQkJCQkNCgkJCX0gZWxzZSB7DQoJCQkJDQoJCQkJZm9yZWFjaCgkYXNzb2NpYXRpb25zIGFzICR1KXsNCgkJCQkJDQoJCQkJCQ0KCQkJCQlpZih0cmltKCR1c2VyLT5uYW1lKSA9PSAkdSl7DQoJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJaWYodHJpbSgkdXNlci0+dGltZWxpbmVfYWNjZXNzKSA9PSAxKXsNCgkJCQkJCQ0KCQkJCQkJCQ0KCQkJCQkJCSR0YXNrX3RtcCA9IG5ldyBzdGRDbGFzcygpOw0KCQkJCQkJCSR0YXNrX3RtcC0+YWN0aXZlX3Rhc2sgPSAkYWN0aXZlX3Rhc2tbMV1bMF07IA0KCQkJCQkJCSR0YXNrX3RtcC0+c3RhZ2UgPSAkc3RhZ2U7DQoJCQkJCQkJJHRhc2tfdG1wLT5jdXJyZW50X3N0YWdlID0gJHdvcmtmbG93X3N0YWdlX25hbWU7DQoJCQkJCQkJJHRhc2tfdG1wLT5tYXRjaGluZ191c2VyID0gJHVzZXI7IA0KCQkJCQkJCQ0KCQkJCQkJCSRwZW5kaW5nX3Rhc2sgPSAkdGFza190bXA7DQoJCQkJCQkJDQoJCQkJCQl9DQoJDQoJCQkJCX0NCgkJCQkJDQoJCQkJfQ0KCQkJDQoJCQl9CQkJCQkNCg0KCQl9IGVsc2Ugew0KCQkNCgkJCQ0KCQkJaWYodHJpbSgkdXNlci0+bmFtZSkgPT0gJ1tUYXNrIE9yaWdpbmF0b3JdJyl7DQoJCQkJCQ0KCQkJCWlmKCRhY3RpdmVfdGFza1sxXVswXVsndGFza19vcmlnaW5hdG9yX3VzZXJfaWQnXSA9PSAkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXSAmJiAoaW50KSR1c2VyLT50aW1lbGluZV9hY2Nlc3MgPT0gMSl7DQoJCQkJCQkNCgkJCQkJDQoJCQkJCSR0YXNrX3RtcCA9IG5ldyBzdGRDbGFzcygpOw0KCQkJCQkkdGFza190bXAtPmFjdGl2ZV90YXNrID0gJGFjdGl2ZV90YXNrWzFdWzBdOyANCgkJCQkJJHRhc2tfdG1wLT5zdGFnZSA9ICRzdGFnZTsNCgkJCQkJJHRhc2tfdG1wLT5jdXJyZW50X3N0YWdlID0gJHdvcmtmbG93X3N0YWdlX25hbWU7DQoJCQkJCSR0YXNrX3RtcC0+bWF0Y2hpbmdfdXNlciA9ICR1c2VyOyANCg0KCQkJCQkkcGVuZGluZ190YXNrID0gJHRhc2tfdG1wOw0KCQkJCQkJDQoJCQkJfQ0KCQkJCQkNCgkJCX0gZWxzZSB7DQoJCQkJDQoJCQkJZm9yZWFjaCgkYXNzb2NpYXRpb25zIGFzICR1KXsNCgkJCQkJDQoJCQkJCQ0KCQkJCQlpZih0cmltKCR1c2VyLT5uYW1lKSA9PSAkdSl7DQoJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJaWYodHJpbSgkdXNlci0+dGltZWxpbmVfYWNjZXNzKSA9PSAxKXsNCgkJCQkJCQ0KCQkJCQkJCQ0KCQkJCQkJCSR0YXNrX3RtcCA9IG5ldyBzdGRDbGFzcygpOw0KCQkJCQkJCSR0YXNrX3RtcC0+YWN0aXZlX3Rhc2sgPSAkYWN0aXZlX3Rhc2tbMV1bMF07IA0KCQkJCQkJCSR0YXNrX3RtcC0+c3RhZ2UgPSAkc3RhZ2U7DQoJCQkJCQkJJHRhc2tfdG1wLT5jdXJyZW50X3N0YWdlID0gJHdvcmtmbG93X3N0YWdlX25hbWU7DQoJCQkJCQkJJHRhc2tfdG1wLT5tYXRjaGluZ191c2VyID0gJHVzZXI7IA0KCQkNCgkJCQkJCQkkcGVuZGluZ190YXNrID0gJHRhc2tfdG1wOw0KCQkJCQkJCQ0KCQkJCQkJfQ0KCQkJCQkJDQoJCQkJCX0NCgkJCQkJDQoJCQkJfQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJCX0NCgkJDQoJfQ0KCQ0KCQ0KCQ0KCXJldHVybiBhcnJheSgkcGVuZGluZ190YXNrICE9ICcnID8gdHJ1ZSA6IGZhbHNlLCAkcGVuZGluZ190YXNrKTsNCgkNCn0NCg0KDQpmdW5jdGlvbiBsb2FkX2pvYl9jb250cm9scygkdGFza19kYXRhID0gJycsICR0aW1lbGluZV9sb2FkID0gJ2ZhbHNlJyl7DQoJDQoJaWYoJHRhc2tfZGF0YSA9PSAnJykNCgkJcmV0dXJuOw0KCQ0KCSR0YXNrID0gJHRhc2tfZGF0YVsxXTsgDQoJDQoJJGh0bWwgPSAiIjsNCgkNCiRodG1sIC49IDw8PEVPRg0KPGRpdiBjbGFzcz0iam9iLXZpZXdlci10YXNrLWNvbnRyb2xzLXdyYXBwZXIiPg0KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImN1cnJlbnRfdGFza19tYXN0ZXJfaWQiIHZhbHVlPSJ7JHRhc2stPmFjdGl2ZV90YXNrWyd0YXNrX21hc3Rlcl9pZCddfSIgLz4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjdXJyZW50X2FjdGl2ZV90YXNrX2lkIiB2YWx1ZT0ieyR0YXNrLT5hY3RpdmVfdGFza1snaWQnXX0iIC8+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY3VycmVudF9zdGFnZV9uYW1lIiB2YWx1ZT0ieyR0YXNrLT5jdXJyZW50X3N0YWdlfSIgLz4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ3b3JrZmxvd19qb2JfaWQiIHZhbHVlPSJ7JHRhc2stPmFjdGl2ZV90YXNrWyd3b3JrZmxvd19qb2JfaWQnXX0iIC8+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGltZWxpbmVfbG9hZCIgdmFsdWU9InskdGltZWxpbmVfbG9hZH0iIC8+DQo8L2Rpdj4JCQ0KRU9GOw0KCQ0KCQ0KCXJldHVybiAkaHRtbDsNCn0NCg0KDQoNCmZ1bmN0aW9uIGxvYWRfam9iX3Rhc2tfbWFuYWdlbWVudCgkdGFza19tYXN0ZXJfaWQsICR3b3JrZmxvd19qb2JfaWQsICR0YXNrX2RhdGEpew0KCQ0KCWlmKCR0YXNrX21hc3Rlcl9pZCA9PSAwKQ0KCQlyZXR1cm4gJyc7DQoJCQ0KCSR0YXNrX2RhdGEgPSAkdGFza19kYXRhWzFdOyANCgkNCgkNCgkNCgkNCgkNCgkNCgkkc3FsID0gIlNFTEVDVCBpZCwgY29tbWVudCBGUk9NIGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrcyBXSEVSRSB0YXNrX21hc3Rlcl9pZCA9ID8gT1JERVIgQlkgaWQgREVTQyI7DQoJJHBhcmFtcyA9IGFycmF5ICgkdGFza19tYXN0ZXJfaWQpOw0KCSRjb21tZW50cyA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkNCgkkY29tbWVudF9pbmRleCA9IDA7DQoJJGhhc19vdmVyZmxvd19odG1sID0gZmFsc2U7DQoJDQoJJGV4aXN0aW5nX2NvbW1lbnRzX2h0bWwgPSAiPGRpdiBjbGFzcz1cImNvbW1lbnRzLWh0bWwtd3JhcHBlclwiPiI7DQoJDQoJZm9yZWFjaCgkY29tbWVudHNbMV0gYXMgJGNvbW1lbnQpew0KCQkNCgkJDQoJCWlmKCRjb21tZW50X2luZGV4ID09IDApew0KCQkJDQoJCQkkZXhpc3RpbmdfY29tbWVudHNfaHRtbCA9ICI8ZGl2IGNsYXNzPVwid29ya2Zsb3ctc3RhZ2UtY29tbWVudC1tb3N0LXJlY2VudC1oZWFkZXJcIj5TdGFnZSBDb21tZW50czwvZGl2PiI7DQoNCgkJCSRleGlzdGluZ19jb21tZW50c19odG1sIC49ICI8ZGl2IGNsYXNzPVwid29ya2Zsb3ctc3RhZ2UtY29tbWVudC1tb3N0LXJlY2VudFwiPnskY29tbWVudFsnY29tbWVudCddfTwvZGl2PiI7DQoJCQkNCgkJCQ0KCQkJJGV4aXN0aW5nX2NvbW1lbnRzX2h0bWwgLj0gIjxkaXYgY2xhc3M9XCJ3b3JrZmxvdy1zdGFnZS1jb21tZW5zLW92ZXJmbG93XCI+IjsNCgkJCQ0KCQkJJGhhc19vdmVyZmxvd19odG1sID0gdHJ1ZTsNCgkJCQ0KCQkJJGNvbW1lbnRfaW5kZXgrKzsNCgkJCQ0KCQl9IGVsc2Ugew0KCQkJDQoJCQkkZXhpc3RpbmdfY29tbWVudHNfaHRtbCAuPSAiPGRpdiBjbGFzcz1cIndvcmtmbG93LXN0YWdlLWNvbW1lbnQtbW9zdC1yZWNlbnRcIj57JGNvbW1lbnRbJ2NvbW1lbnQnXX08L2Rpdj4iOw0KCQkJDQoJCX0NCgkJDQoJfQ0KCQ0KCWlmKCRoYXNfb3ZlcmZsb3dfaHRtbCl7DQoJCQ0KCQkkZXhpc3RpbmdfY29tbWVudHNfaHRtbCAuPSAiPC9kaXY+IjsgDQoJCQ0KCX0NCgkNCgkkZXhpc3RpbmdfY29tbWVudHNfaHRtbCAuPSAiPC9kaXY+IjsNCgkNCgkJDQoJDQoJDQoJDQoJJGFkZF9jb21tZW50c19odG1sID0gPDw8RU9GDQo8dGV4dGFyZWEgY2xhc3M9InRhc2stbWFuYWdlbWVudC1jb21tZW50IiBzdHlsZT0id2lkdGg6MTAwJTsiIG9ua2V5dXA9IiI+PC90ZXh0YXJlYT4NCgkNCkVPRjsNCg0KCSRzdGFnZV9zZWxlY3QgPSAiIjsNCgkNCglpZihpc3NldCgkdGFza19kYXRhLT5tYXRjaGluZ191c2VyKSAmJiAkdGFza19kYXRhLT5tYXRjaGluZ191c2VyLT5uYW1lICE9ICcnICYmIChpbnQpJHRhc2tfZGF0YS0+bWF0Y2hpbmdfdXNlci0+Y2FuX2NoYW5nZV9zdGFnZXMgPT0gMSl7DQoJCQ0KCQkNCgkJDQoJCQ0KCQkkc3FsID0gIlNFTEVDVCB3b3JrZmxvd19kYXRhLCBmb3JtYm9zc19qb2JfbmFtZSBGUk9NIGZiX3dvcmtmbG93X2pvYnMgV0hFUkUgaWQgPSA/IjsNCgkJJHBhcmFtcyA9IGFycmF5ICgkd29ya2Zsb3dfam9iX2lkKTsNCgkJJHdvcmtmbG93X2RhdGEgPSBEYXRhYmFzZTo6cGRvX3Byb2NlZHVyZV9wYXJhbXMgKCAkc3FsLCAkcGFyYW1zLCAwICk7DQoJCSR3b3JrZmxvd19kYXRhID0ganNvbl9kZWNvZGUoYmFzZTY0X2RlY29kZSgkd29ya2Zsb3dfZGF0YVsxXVswXVsnd29ya2Zsb3dfZGF0YSddKSk7DQoJCQ0KCQkkc3RhZ2Vfc2VsZWN0X29wdGlvbiA9ICI8b3B0aW9uIHZhbHVlXCJcIj4tLVNFTEVDVCBBIFNUQUdFLS08L29wdGlvbj4iOw0KCQkNCgkJDQoJCWZvcmVhY2goJHdvcmtmbG93X2RhdGEtPnN0YWdlcyBhcyAkbmFtZSA9PiAkc3RhZ2Upew0KCQkJDQoJCQlpZigkbmFtZSAhPSAoc3RyaW5nKSR0YXNrX2RhdGEtPmN1cnJlbnRfc3RhZ2Upew0KCQkJCQ0KCQkJCSRzdGFnZV9zZWxlY3Rfb3B0aW9uIC49ICI8b3B0aW9uIHZhbHVlPVwieyRuYW1lfVwiPnskc3RhZ2UtPm5hbWV9PC9vcHRpb24+IjsNCgkJCQkNCgkJCX0gZWxzZSB7DQoJCQkJDQoJCQkJYnJlYWs7IA0KCQkJCQ0KCQkJfQ0KCQkJDQoJCX0NCgkNCgkJDQoJCQ0KCQkkc3RhZ2Vfc2VsZWN0IC49IDw8PEVPVA0KPHNlbGVjdCBjbGFzcz0idGFzay1tYW5hZ2VtZW50LXN0YWdlLXNlbGVjdCIgbmFtZT0iIj4NCgl7JHN0YWdlX3NlbGVjdF9vcHRpb259DQo8L3NlbGVjdD4NCkVPVDsNCgkJDQoJfSANCgkNCgkNCgkNCgkNCgkNCgkNCgkNCgkkY2FuY2VsX3dvcmtmbG93ID0gIiI7DQoJDQoJaWYoaXNzZXQoJHRhc2tfZGF0YS0+bWF0Y2hpbmdfdXNlcikgJiYgJHRhc2tfZGF0YS0+bWF0Y2hpbmdfdXNlci0+bmFtZSAhPSAnJyAmJiAoaW50KSR0YXNrX2RhdGEtPm1hdGNoaW5nX3VzZXItPmNhbl9jYW5jZWxfd29ya2Zsb3cgPT0gMSl7DQoJCQ0KCQkNCgkJJGZvcm1ib3NzX2pvYl9uYW1lID0gJHRhc2tfZGF0YS0+YWN0aXZlX3Rhc2tbJ2Zvcm1ib3NzX2pvYl9uYW1lJ107DQoJCSR3b3JrZmxvd19zdGFnZV9uYW1lID0gJHRhc2tfZGF0YS0+YWN0aXZlX3Rhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXTsNCgkJJHRhc2tfbWFzdGVyX2lkID0gJHRhc2tfZGF0YS0+YWN0aXZlX3Rhc2tbJ3Rhc2tfbWFzdGVyX2lkJ107IA0KCQkkYWN0aXZlX3Rhc2tfaWQgPSAkdGFza19kYXRhLT5hY3RpdmVfdGFza1snaWQnXTsNCgkJDQoJCQ0KCQkkY2FuY2VsX3dvcmtmbG93IC49IDw8PEVPVA0KPGlucHV0IHR5cGU9ImJ1dHRvbiIgbmFtZT0iIiBvbmNsaWNrPSJxdWVyeV93b3JrZmxvd19jYW5jZWwoZXZlbnQsIHRoaXMsICd7JGZvcm1ib3NzX2pvYl9uYW1lfScsICd7JHdvcmtmbG93X3N0YWdlX25hbWV9JywgeyR0YXNrX21hc3Rlcl9pZH0sIHskYWN0aXZlX3Rhc2tfaWR9LCB0cnVlKTsiIHZhbHVlPSJDYW5jZWwgVGhpcyBXb3Jma2xvdyBUYXNrIiAvPg0KRU9UOw0KCQkNCgl9IA0KDQoJDQoJDQoJJGh0bWwgPSA8PDxFT0YNCjxkaXYgY2xhc3M9InRhc2stbWFuYWdlbWVudC13cmFwcGVyIj4NCgk8ZGl2IGNsYXNzPSJ0YXNrLW1hbmFnZW1lbnQtaGVhZGVyIj5UYXNrIE1hbmFnZW1lbnQ8L2Rpdj4NCgk8ZGl2IGNsYXNzPSJ0YXNrLW1hbmFnZW1lbnQtd3JhcHBlci1wYWRkaW5nIj4NCgkJeyRleGlzdGluZ19jb21tZW50c19odG1sfQ0KCQl7JGFkZF9jb21tZW50c19odG1sfQ0KCQl7JHN0YWdlX3NlbGVjdH0NCgkJeyRjYW5jZWxfd29ya2Zsb3d9DQoJPC9kaXY+DQo8L2Rpdj4NCg0KRU9GOw0KCQ0KCXJldHVybiAkaHRtbDsNCgkNCn0NCg0KDQoNCmZ1bmN0aW9uIGxvYWRfam9iX3RpbWVsaW5lKCR0YXNrX21hc3Rlcl9pZCwgJHdvcmtmbG93X2pvYl9pZCwgJHRhc2tfZGF0YSl7DQoJDQoJaWYoJHRhc2tfbWFzdGVyX2lkID09IDApDQoJCXJldHVybiAnJzsNCgkJDQoJDQoJJHNxbCA9ICJTRUxFQ1Qgd29ya2Zsb3dfZGF0YSwgZm9ybWJvc3Nfam9iX25hbWUgRlJPTSBmYl93b3JrZmxvd19qb2JzIFdIRVJFIGlkID0gPyI7DQoJJHBhcmFtcyA9IGFycmF5ICgkd29ya2Zsb3dfam9iX2lkKTsNCgkkd29ya2Zsb3dfZGF0YSA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkNCgkkZm9ybWJvc3Nfam9iX25hbWUgPSAkd29ya2Zsb3dfZGF0YVsxXVswXVsnZm9ybWJvc3Nfam9iX25hbWUnXTsNCgkkd29ya2Zsb3dfZGF0YSA9IGpzb25fZGVjb2RlKGJhc2U2NF9kZWNvZGUoJHdvcmtmbG93X2RhdGFbMV1bMF1bJ3dvcmtmbG93X2RhdGEnXSkpOw0KCQ0KCQ0KCQ0KCSRzdGFnZXMgPSBhcnJheSgpOw0KCQ0KCWZvcmVhY2goJHdvcmtmbG93X2RhdGEtPnN0YWdlcyBhcyAkc3RhZ2VfbmFtZSA9PiAkc3RhZ2VfZGF0YSl7CQkNCgkJJHN0YWdlc1sieyRzdGFnZV9uYW1lfSJdID0gJHN0YWdlX2RhdGE7DQoJfQ0KCQ0KCQkNCgkNCgkkc3FsID0gIlNFTEVDVCBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MuKiwNCgkJCWZiX3dvcmtmbG93X3Rhc2tfbWFzdGVyLndvcmtmbG93X2NvbXBsZXRlIA0KCQkJRlJPTSBmYl93b3JrZmxvd19hY3RpdmVfdGFza3MNCgkJCUlOTkVSIEpPSU4gZmJfd29ya2Zsb3dfdGFza19tYXN0ZXIgT04gZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLnRhc2tfbWFzdGVyX2lkID0gZmJfd29ya2Zsb3dfdGFza19tYXN0ZXIuaWQNCgkJCVdIRVJFIHRhc2tfbWFzdGVyX2lkID0gPw0KCQkJT1JERVIgQlkgZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tzLmlkIERFU0MiOw0KCSRwYXJhbXMgPSBhcnJheSAoJHRhc2tfbWFzdGVyX2lkKTsNCgkkdGFza19oaXN0b3J5ID0gRGF0YWJhc2U6OnBkb19wcm9jZWR1cmVfcGFyYW1zICggJHNxbCwgJHBhcmFtcywgMCApOw0KCQ0KCQ0KCSR0YXNrX2l0ZW1faHRtbCA9ICIiOw0KDQoNCgkNCgkkY291bnQgPSAwOyANCgkNCgkNCgkNCgkkbW9zdF9yZWNlbnRfdGFza19pZCA9IC0xOw0KCQ0KCWZvcmVhY2goJHRhc2tfaGlzdG9yeVsxXSBhcyAkdGFzayl7DQoJCQ0KCQkkc3RhZ2VfZGlzcGxheV9uYW1lID0gJHN0YWdlc1sieyR0YXNrWyd3b3JrZmxvd19zdGFnZV9uYW1lJ119Il0tPm5hbWU7DQoJCQ0KCQkkZGF0ZSA9IG5ldyBEYXRlVGltZSgkdGFza1sndHMnXSk7DQoJCSR0YXNrX2RhdGUgPSBkYXRlX2Zvcm1hdCgkZGF0ZSwgJ20vZC9ZJyk7IA0KCQkNCgkJDQoJCQ0KCQkNCg0KCQkNCgkJDQoJCQ0KCQkNCgkJaWYoJG1vc3RfcmVjZW50X3Rhc2tfaWQgPT0gLTEpew0KCQkJJG1vc3RfcmVjZW50X3Rhc2tfaWQgPSAkdGFza1snaWQnXTsNCgkJfQ0KCQkJDQoJCWlmKCRjb3VudCA9PSAwICYmICR0YXNrWyJ3b3JrZmxvd19jb21wbGV0ZSJdID09IDApew0KCQkJDQoJCQkkdXNlX2NvZGUgPSB0cnVlOw0KCQkJDQoJCQlpZigkdXNlX2NvZGUpew0KCQkJDQoJCQkkdGFza19pdGVtX2h0bWwgLj0gPDw8RU9GDQoJCTxkaXYgY2xhc3M9InRhc2stdGltZWxpbmUtaXRlbSIgb25jbGljaz0icXVlcnlfcmlnaHRfdGltbGluZV9qb2JfbG9hZGVyKGV2ZW50LCAneyRmb3JtYm9zc19qb2JfbmFtZX0nLCAneyR0YXNrWyd3b3JrZmxvd19zdGFnZV9uYW1lJ119JywgeyR0YXNrWyd3b3JrZmxvd19qb2JfaWQnXX0sIHskdGFza1sndGFza19tYXN0ZXJfaWQnXX0sIHskdGFza1snaWQnXX0sICd0cnVlJyk7Ij4NCgkJCTxkaXYgY2xhc3M9InRhc2stdGltZWxpbmUtaXRlbS1hcnJvdyI+Jmd0OyZndDs8L2Rpdj4NCgkJCTxzcGFuIGNsYXNzPSJ0YXNrLXRpbWVsaW5lLW5hbWUiPk1vc3QgUmVjZW50IFRhc2s8L3NwYW4+PGJyPg0KCQkJPHNwYW4gY2xhc3M9InRhc2stdGltZWxpbmUtZGF0ZSI+eyR0YXNrX2RhdGV9PC9zcGFuPg0KCQk8L2Rpdj4NCkVPRjsNCgkJCX0NCgkJCQ0KCQkJJGNvdW50Kys7DQoJCX0NCgkJDQoJCSR0YXNrX2l0ZW1faHRtbCAuPSA8PDxFT0YNCgkJPGRpdiBjbGFzcz0idGFzay10aW1lbGluZS1pdGVtIiBvbmNsaWNrPSJxdWVyeV9yaWdodF90aW1saW5lX2pvYl9sb2FkZXIoZXZlbnQsICd7JGZvcm1ib3NzX2pvYl9uYW1lfScsICd7JHRhc2tbJ3dvcmtmbG93X3N0YWdlX25hbWUnXX0nLCB7JHRhc2tbJ3dvcmtmbG93X2pvYl9pZCddfSwgeyR0YXNrWyd0YXNrX21hc3Rlcl9pZCddfSwgeyR0YXNrWydpZCddfSwgJ2ZhbHNlJyk7Ij4NCgkJCTxkaXYgY2xhc3M9InRhc2stdGltZWxpbmUtaXRlbS1hcnJvdyI+Jmd0OyZndDs8L2Rpdj4NCgkJCTxzcGFuIGNsYXNzPSJ0YXNrLXRpbWVsaW5lLW5hbWUiPnskc3RhZ2VfZGlzcGxheV9uYW1lfTwvc3Bhbj48YnI+DQoJCQk8c3BhbiBjbGFzcz0idGFzay10aW1lbGluZS1kYXRlIj57JHRhc2tfZGF0ZX08L3NwYW4+DQoJCTwvZGl2Pg0KRU9GOw0KCX0NCgkNCgkNCgkNCgkNCgkkcHJpbnRfdGltZWxpbmVfaHRtbCA9IDw8PEVPVA0KPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlByaW50IFRpbWVsaW5lIiBvbmNsaWNrPSJxdWVyeV9yaWdodF90aW1lbGluZV9wcmludF90aW1lbGluZShldmVudCwgJ3skZm9ybWJvc3Nfam9iX25hbWV9JywgJ3skdGFza1snd29ya2Zsb3dfc3RhZ2VfbmFtZSddfScsIHskdGFza1snd29ya2Zsb3dfam9iX2lkJ119LCB7JHRhc2tbJ3Rhc2tfbWFzdGVyX2lkJ119LCB7JG1vc3RfcmVjZW50X3Rhc2tfaWR9LCAncHJpbnRfYWxsJyk7IiAvPgkNCkVPVDsNCg0KCQ0KCSRodG1sID0gPDw8RU9GDQo8ZGl2IGNsYXNzPSJ0YXNrLXRpbWVsaW5lLXdyYXBwZXIiPg0KCTxkaXYgY2xhc3M9InRhc2stdGltZWxpbmUtaGVhZGVyIj5Kb2IgVGltZWxpbmU8L2Rpdj4NCgk8ZGl2IGNsYXNzPSJ0YXNrLXRpbWVsaW5lLXdyYXBwZXItcGFkZGluZyI+DQoJCXskdGFza19pdGVtX2h0bWx9DQoJCXskcHJpbnRfdGltZWxpbmVfaHRtbH0NCgk8L2Rpdj4NCjwvZGl2Pg0KDQpFT0Y7DQoNCglyZXR1cm4gJGh0bWw7DQoJDQp9DQoNCg0KDQpmdW5jdGlvbiBsb2FkX2pvYl9kYXRhKCR0YXNrX21hc3Rlcl9pZCwNCgkJCQkJICAgJGZvcm1ib3NzX2pvYl9uYW1lLCANCgkJCQkJICAgJHdvcmtmbG93X2pvYl9pZCwgDQoJCQkJCSAgICRzdGFnZV90YXJnZXQgPSAnJywgDQoJCQkJCSAgICRjdXJyZW50X3N0YWdlX25hbWUgPSAnJyl7DQoJDQoJDQoJJHNxbCA9ICJTRUxFQ1Qgam9iX3htbCBGUk9NIGZiX2pvYnMgV0hFUkUgam9iX25hbWUgPSA/IjsNCgkkcGFyYW1zID0gYXJyYXkgKCRmb3JtYm9zc19qb2JfbmFtZSk7DQoJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkNCglpZighJHJlc3VsdCkNCgkJcmV0dXJuOw0KCQ0KCSR4bWwgPSAkcmVzdWx0WzFdWzBdWydqb2JfeG1sJ107DQoJDQoJDQoJaWYoc3Vic3RyKCR4bWwsIDAsIDIzKSA9PSAnUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzQnKXsNCgkJJHhtbCA9IGJhc2U2NF9kZWNvZGUoJHhtbCk7DQoJfQ0KCQ0KCSRmb3JtYm9zc19qb2IgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHhtbCk7DQoJDQoNCgkNCgkkc3FsID0gIlNFTEVDVCB3b3JrZmxvd19kYXRhIEZST00gZmJfd29ya2Zsb3dfam9icyBXSEVSRSBpZCA9ID8iOw0KCSRwYXJhbXMgPSBhcnJheSAoJHdvcmtmbG93X2pvYl9pZCk7DQoJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkNCglpZighJHJlc3VsdCkNCgkJcmV0dXJuOw0KCQkNCgkNCgkkd29ya2Zsb3cgPSBqc29uX2RlY29kZShiYXNlNjRfZGVjb2RlKCRyZXN1bHRbMV1bMF1bJ3dvcmtmbG93X2RhdGEnXSkpOw0KCQ0KCQ0KDQoJDQoJaWYoJHN0YWdlX3RhcmdldCA9PSAnJyl7IA0KCQlmb3JlYWNoKCR3b3JrZmxvdy0+c3RhZ2VzIGFzICRrZXkgPT4gJHN0YWdlKXsNCgkJCSRjdXJyZW50X3N0YWdlX25hbWUgPSAka2V5Ow0KCQkJJGl0ZW1fdG9fbG9hZCA9ICR3b3JrZmxvdy0+c3RhZ2VzLT4ka2V5LT5zdGFnZV90YXJnZXQ7DQoJCQlicmVhazsgDQoJCX0NCgl9IGVsc2Ugew0KCQkNCgkJJGl0ZW1fdG9fbG9hZCA9ICRzdGFnZV90YXJnZXQ7DQoJfQ0KCQ0KCQ0KCWlmKHN1YnN0cl9jb3VudCgkaXRlbV90b19sb2FkLCAnLnBocCcpID09IDEpew0KDQoJCQ0KCQkkZGltID0gJzUwMCw1MDAnOyANCg0KCQlmb3JlYWNoKCRmb3JtYm9zc19qb2ItPnBhZ2UgYXMgJHBhZ2Upew0KCQkJaWYoKHN0cmluZykkcGFnZS0+bmFtZSA9PSAkaXRlbV90b19sb2FkKXsNCgkJCQkkZGltID0gJHBhZ2UtPmRpbTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KDQoJCSRkaW1zID0gZXhwbG9kZSgnLCcsICRkaW0pOw0KDQoJCQ0KDQoJCWlmKCRfU0VTU0lPTlsnX3dvcmtmbG93X2RlYnVnJ10pew0KCQkJJGRpbXNbMF0gPSAkZGltc1swXSArIDQ1MDsNCgkJCSRkaW1zWzFdID0gJGRpbXNbMV0gKyA2NTA7DQoJCX0NCg0KCQkNCgkJDQoJCSRqb2JfY29udGVudCA9ICc8aWZyYW1lIGNsYXNzPSJmYi13b3JrZmxvdy1pZnJhbWUiIGlkPSIiIG5hbWU9IiIgc3JjPSIuLi9vdXRwdXQvZm9ybXMvJy4kZm9ybWJvc3Nfam9iX25hbWUuJy8nLiRpdGVtX3RvX2xvYWQuJyIgd2lkdGg9IicuJGRpbXNbMF0uJyIgaGVpZ2h0PSInLiRkaW1zWzFdLiciIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9Im5vIiBBTExPV1RSQU5TUEFSRU5DWT0idHJ1ZSI+PC9pZnJhbWU+JzsNCgkNCgkJDQoJCQ0KCQlpZihpc3NldCgkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXSkpeyANCgkJCQ0KCQkJDQoJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3Rhc2tfdXNlcl9pZCddID0gJF9TRVNTSU9OWydmYl91c2VyX2lkJ107IA0KCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydmb3JtYm9zc191c2VyX2lkJ10gPSAkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXTsNCgkJCQ0KCQl9IGVsc2Ugew0KCQkJDQoJCQkNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsndGFza191c2VyX2lkJ10gPSAnJzsgDQoJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX3VzZXJfaWQnXSA9IE5VTEw7IA0KCQkJDQoJCX0NCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKCFpc3NldCgkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX2pvYl9pZCddKSkNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnZm9ybWJvc3Nfam9iX2lkJ10gPSAtMTsNCgkJCQ0KCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X2pvYl9pZCddID0gJHdvcmtmbG93X2pvYl9pZDsNCgkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWyd3b3JrZmxvd19zdGFnZV9uYW1lJ10gPSAkY3VycmVudF9zdGFnZV9uYW1lOw0KCQkNCgkJDQoJfSBlbHNlIHsNCgkJDQoJfQ0KCQ0KCXJldHVybiAkam9iX2NvbnRlbnQ7DQoJDQp9DQoNCg0KDQpmdW5jdGlvbiBsb2FkX2pvYl9kYXRhX3RpbWVsaW5lKCR3b3JrZmxvd19kYXRhLCANCgkJCQkJCQkJJHRhc2tfbWFzdGVyX2lkLCANCgkJCQkJCQkJJGFjdGl2ZV90YXNrX2lkLCANCgkJCQkJCQkJJGZvcm1ib3NzX2pvYl9uYW1lLCANCgkJCQkJCQkJJHdvcmtmbG93X2pvYl9pZCwgDQoJCQkJCQkJCSRzdGFnZV90YXJnZXQgPSAnJywgDQoJCQkJCQkJCSRjdXJyZW50X3N0YWdlX25hbWUgPSAnJywNCgkJCQkJCQkJJGxvYWRfbG9jYXRpb24gPSAnaW5saW5lJywNCgkJCQkJCQkJJHByaW50X3R5cGUgPSAnJyl7DQoJDQoJDQoJJHNxbCA9ICJTRUxFQ1Qgam9iX3htbCBGUk9NIGZiX2pvYnMgV0hFUkUgam9iX25hbWUgPSA/IjsNCgkkcGFyYW1zID0gYXJyYXkgKCRmb3JtYm9zc19qb2JfbmFtZSk7DQoJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcHJvY2VkdXJlX3BhcmFtcyAoICRzcWwsICRwYXJhbXMsIDAgKTsNCgkNCglpZighJHJlc3VsdCkNCgkJcmV0dXJuOw0KCQ0KCSR4bWwgPSAkcmVzdWx0WzFdWzBdWydqb2JfeG1sJ107DQoJDQoJDQoJaWYoc3Vic3RyKCR4bWwsIDAsIDIzKSA9PSAnUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzQnKXsNCgkJJHhtbCA9IGJhc2U2NF9kZWNvZGUoJHhtbCk7DQoJfQ0KCQ0KCSRmb3JtYm9zc19qb2IgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHhtbCk7DQoJDQoJDQoJaWYoJHdvcmtmbG93X2RhdGEgPT0gJycpDQoJCXJldHVybjsNCgkJDQoJDQoJJHdvcmtmbG93ID0ganNvbl9kZWNvZGUoYmFzZTY0X2RlY29kZSgkd29ya2Zsb3dfZGF0YSkpOw0KCQ0KCQ0KDQoJDQoJaWYoJHN0YWdlX3RhcmdldCA9PSAnJyl7IA0KCQlmb3JlYWNoKCR3b3JrZmxvdy0+c3RhZ2VzIGFzICRrZXkgPT4gJHN0YWdlKXsNCgkJCSRjdXJyZW50X3N0YWdlX25hbWUgPSAka2V5Ow0KCQkJJGl0ZW1fdG9fbG9hZCA9ICR3b3JrZmxvdy0+c3RhZ2VzLT4ka2V5LT5zdGFnZV90YXJnZXQ7DQoJCQlicmVhazsgDQoJCX0NCgl9IGVsc2Ugew0KCQkNCgkJJGl0ZW1fdG9fbG9hZCA9ICRzdGFnZV90YXJnZXQ7DQoJfQ0KCQ0KCQ0KCWlmKHN1YnN0cl9jb3VudCgkaXRlbV90b19sb2FkLCAnLnBocCcpID09IDEpew0KCQkNCgkJJGRpbSA9ICc1MDAsNTAwJzsgDQoJCWZvcmVhY2goJGZvcm1ib3NzX2pvYi0+cGFnZSBhcyAkcGFnZSl7DQoJCQlpZigoc3RyaW5nKSRwYWdlLT5uYW1lID09ICRpdGVtX3RvX2xvYWQpew0KCQkJCSRkaW0gPSAkcGFnZS0+ZGltOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJCSRkaW1zID0gZXhwbG9kZSgnLCcsICRkaW0pOw0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCSRvdXRwdXRfcGF0aCA9ICcuLi9vdXRwdXQvZm9ybXMvJzsNCgkJDQoJCQ0KCQkNCgkJDQoJCQ0KDQoJCQ0KCQkNCgkJJHJlbmRlcl9zdWJtaXRfYnV0dG9uX2NvZGUgPSAiIjsNCgkJDQoJCWlmKCRsb2FkX2xvY2F0aW9uID09ICdzdGFuZF9hbG9uZScpew0KCQkJJG91dHB1dF9wYXRoID0gJy4uLy4uLy4uLy4uLy4uLy4uL291dHB1dC9mb3Jtcy8nOw0KCQkJJHJlbmRlcl9zdWJtaXRfYnV0dG9uX2NvZGUgPSAiP2ZiLXdvcmtmbG93LXByaW50LXZpZXc9dHJ1ZSI7DQoJCX0NCg0KCQlpZigkcHJpbnRfdHlwZSAhPSAnJyl7DQoJCQkkcmVuZGVyX3N1Ym1pdF9idXR0b25fY29kZSA9ICI/ZmItd29ya2Zsb3ctcHJpbnQtdmlldz10cnVlIjsNCgkJfQ0KDQoJCQ0KDQoJCWlmICgkX1NFU1NJT05bJ193b3JrZmxvd19kZWJ1ZyddKSB7DQoJCQkkZGltc1swXSA9ICRkaW1zWzBdICsgNDUwOw0KCQkJJGRpbXNbMV0gPSAkZGltc1sxXSArIDY1MDsNCgkJfQ0KCQkNCgkJDQoJCQ0KCQkkam9iX2NvbnRlbnQgPSAnPGlmcmFtZSBjbGFzcz0iZmItd29ya2Zsb3ctaWZyYW1lIHRpbWVsaW5lLWl0ZW0iIGlkPSIiIG5hbWU9ImZiLWlmcmFtZS1Kb2JUaXRsZSIgc3JjPSInLiRvdXRwdXRfcGF0aC4kZm9ybWJvc3Nfam9iX25hbWUuJy8nLiRpdGVtX3RvX2xvYWQuJHJlbmRlcl9zdWJtaXRfYnV0dG9uX2NvZGUuJyIgd2lkdGg9IicuJGRpbXNbMF0uJyIgaGVpZ2h0PSInLiRkaW1zWzFdLiciIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9Im5vIiBBTExPV1RSQU5TUEFSRU5DWT0idHJ1ZSI+PC9pZnJhbWU+JzsNCgkNCgkJDQoJCQ0KCQlpZihpc3NldCgkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXSkpeyANCgkJCQ0KCQkJDQoJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3Rhc2tfdXNlcl9pZCddID0gJF9TRVNTSU9OWydmYl91c2VyX2lkJ107IA0KCQkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWydmb3JtYm9zc191c2VyX2lkJ10gPSAkX1NFU1NJT05bJ2ZiX3VzZXJfaWQnXTsNCgkJCQ0KCQl9IGVsc2Ugew0KCQkJDQoJCQkNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsndGFza191c2VyX2lkJ10gPSAnJzsgDQoJCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX3VzZXJfaWQnXSA9IE5VTEw7IA0KCQkJDQoJCX0NCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKCFpc3NldCgkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ2Zvcm1ib3NzX2pvYl9pZCddKSkNCgkJCSRfU0VTU0lPTlsnRkJfV09SS0ZMT1cnXVsnZm9ybWJvc3Nfam9iX2lkJ10gPSAtMTsNCgkJCQ0KCQkkX1NFU1NJT05bJ0ZCX1dPUktGTE9XJ11bJ3dvcmtmbG93X2pvYl9pZCddID0gJHdvcmtmbG93X2pvYl9pZDsNCgkJJF9TRVNTSU9OWydGQl9XT1JLRkxPVyddWyd3b3JrZmxvd19zdGFnZV9uYW1lJ10gPSAkY3VycmVudF9zdGFnZV9uYW1lOw0KCQkNCgkJDQoJfSBlbHNlIHsNCgkJDQoJfQ0KCQ0KCXJldHVybiAkam9iX2NvbnRlbnQ7DQoJDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQoNCmlmKGlzc2V0KCRfUE9TVFsncmVxdWVzdCddKSAmJiAkX1BPU1RbJ3JlcXVlc3QnXSA9PSAnbG9hZC1qb2ItdGltZWxpbmUtcHJpbnQtdmlldycpew0KCQ0KJGh0bWwgPSA8PDxFT0YNCnskam9iX2NvbnRlbnR9DQpFT0Y7DQoJDQp9IGVsc2Ugew0KCQ0KJGh0bWwgPSA8PDxFT0YNCnskam9iX3RpbWVsaW5lfQ0KeyRqb2JfdGFza19tYW1hbmdtZW50fQ0KPGRpdiBjbGFzcz0iam9iLXZpZXdlci1oZWFkZXIiPg0KCTxkaXYgY2xhc3M9ImpvYi12aWV3ZXItdGl0bGUiPnskZm9ybWJvc3Nfam9iX25hbWV9PC9kaXY+DQoJPGRpdiBjbGFzcz0iam9iLXZpZXdlci1jb250cm9scyI+DQoJCXskam9iX2NvbnRyb2xzfQ0KCQk8ZGl2IGNsYXNzPSJqb2Itdmlld2VyLWNvbnRyb2xzLWNsb3NlLWJ1dHRvbiIgb25jbGljaz0icXVlcnlfcmlnaHRfam9iX2xvYWRlcl9jbG9zZShldmVudCwgdGhpcywgeyRhY3RpdmVfdGFza19tYXN0ZXJfaWR9LCB0cnVlKSI+Q2xvc2UgV2luZG93PC9kaXY+DQoJPC9kaXY+DQo8L2Rpdj4NCjxkaXYgY2xhc3M9ImpvYi12aWV3ZXItY29udGVudCI+eyRqb2JfY29udGVudH08L2Rpdj4NCjxkaXYgY2xhc3M9ImpvYi12aWV3ZXItZm9vdGVyIj4mbmJzcDs8L2Rpdj4NCg0KRU9GOw0KDQp9DQoNCmVjaG8gJGh0bWw7DQoNCg0KDQoNCg0KDQoNCg0KDQoNCj8+')); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 68cb74a518092941275d362592522359 |
Eval Count | 1 |
Decode Time | 168 ms |