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 $_F=__FILE__;$_C1353562110='Pz48P1V0VQoKcXVwb28geGZwb1J6NV8zelU3NVIgewoKICAgIC8vKioq..
Decoded Output download
$_C1353562110=base64_decode($_C1353562110);$_C1353562110=strtr($_C1353562110,'EADLxuH9RzSGcIWol3JhKd8sjn6pQ7NqZXYywU21gbTMeC5rPamktO0f4iBVvF','PAZNIluCteKkE0TsHRDnydzUFWXa7o5cMBbOwpVi2vq1GLrjgJQSh8xmY3694f');$_R=str_replace('__FILE__',"'".$_F."'",$_C1353562110);eval($_R);$_R=0;$_C1353562110=0;?><?php
class Imaster_Report {
//********* VARIABLES ***********
var $db;
var $sth;
var $id;
var $report_name;
var $report_type;
var $trigger_field;
var $period;
var $period_duration;
var $index_master;
var $index_master_fields;
var $index_group;
var $index_group_fields;
var $created_datetime;
var $updated_datetime;
var $status;
var $scheduler_period;
var $scheduler_period_duration;
var $scheduler_emails_ids;
var $start_date;
var $last_date;
var $next_date;
var $export_type;
var $categoryid; //29/02/2016 by sushant
var $category_ids; //15-02-2017
var $pattern; //05-04-2017 by vidhya
var $doc_set_ids; //05-04-2017 by vidhya
//********* CONSTRUCTOR FUNTIONS ************
function __construct($db) {
$this->db = $db;
// $this->id = '';
}
function setStatus($value) {
if ($value == '')
$this->status = '';
else
$this->status = $value;
return true;
}
function setScheduler_Period($value) {
if ($value == '')
$this->scheduler_period = '';
else
$this->scheduler_period = $value;
return true;
}
function setScheduler_Period_Duration($value) {
if ($value == '')
$this->scheduler_period_duration = '';
else
$this->scheduler_period_duration = $value;
return true;
}
function setScheduler_Email_ids($value) {
if ($value == '')
$this->scheduler_emails_ids = '';
else
$this->scheduler_emails_ids = $value;
return true;
}
function setStart_date($value) {
if ($value == '')
$this->start_date = '';
else
$this->start_date = $value;
return true;
}
function setNext_date($value) {
if ($value == '')
$this->next_date = '';
else
$this->next_date = $value;
return true;
}
function setExport_Type($value) {
if ($value == '')
$this->export_type = '';
else
$this->export_type = $value;
return true;
}
function setId($value) {
if ($value == '')
$this->id = 0;
else
$this->id = $value;
return true;
}
function setReportName($value) {
if ($value == '')
$this->report_name = '';
else
$this->report_name = $value;
return true;
}
function setReportType($value) {
if ($value == '')
$this->report_type = '';
else
$this->report_type = $value;
return true;
}
function setTriggerField($value) {
if ($value == '')
$this->trigger_field = '';
else
$this->trigger_field = $value;
return true;
}
function setPeriod($value) {
if ($value == '')
$this->period = '';
else
$this->period = $value;
return true;
}
function setPeriodDuration($value) {
if ($value == '')
$this->period_duration = 0;
else
$this->period_duration = $value;
return true;
}
function setIndexMaster($value) {
if ($value == '')
$this->index_master = 0;
else
$this->index_master = $value;
return true;
}
function setIndexMasterFields($value) {
if ($value == '')
$this->index_master_fields = '';
else
$this->index_master_fields = $value;
return true;
}
function setIndexGroup($value) {
if ($value == '')
$this->index_group = 0;
else
$this->index_group = $value;
return true;
}
function setIndexGroupFields($value) {
if ($value == '')
$this->index_group_fields = '';
else
$this->index_group_fields = $value;
return true;
}
function setCreatedDateTime($value) {
if ($value == '')
$this->created_datetime = '';
else
$this->created_datetime = $value;
return true;
}
function setUpdatedDateTime($value) {
if ($value == '')
$this->updated_datetime = '';
else
$this->updated_datetime = $value;
return true;
}
function setCategoryId($value) {
if ($value == '')
$this->categoryid = '';
else
$this->categoryid = $value;
return true;
}
function setUserId($value) {
if ($value == '')
$this->userid = '';
else
$this->userid = $value;
return true;
}
//15-02-2017
function setCategory_ids($value) {
if ($value == '')
$this->category_ids = '';
else
$this->category_ids = $value;
return true;
}
//05-04-2017 by vidhya
function setPattern($value) {
if ($value == '')
$this->pattern = '';
else
$this->pattern = $value;
return true;
}
//05-04-2017 by vidhya
function setLast_date($value) {
if ($value == '')
$this->last_date = '';
else
$this->last_date = $value;
return true;
}
//05-04-2017 by vidhya
function setDoc_set_ids($value) {
if ($value == '')
$this->doc_set_ids = '';
else
$this->doc_set_ids = $value;
return true;
}
//updated by khushboo 24-8-16
function addReport() {
$query = "INSERT INTO index_master_report( name,report_type, trigger_field, period, period_duration, category_id, index_master, index_master_fields, index_group_id, index_group_fields, added_by) "
. "VALUES (:Name,:Report_Type,:Trigger_Field,:Period,:PeriodDuration,:CategoryId,:Index_Master, :Index_Master_Fields,:Index_Group, :Index_Group_Fields, :User_Id)";
// echo "INSERT INTO index_master_report(name,report_type, trigger_field, period, period_duration, category_id, index_master, index_master_fields, index_group_id, index_group_fields, added_by) "
// . "VALUES ('$this->report_name', '$this->report_type', '$this->trigger_field','$this->period','$this->categoryid', '$this->period_duration','$this->index_master','$this->index_master_fields','$this->index_group','$this->index_group_fields','$this->userid')";
// if ($this->categoryid == null) {
// echo 1;
// }
// if ($this->categoryid == '') {
// echo 2;
// }
// die;
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':Name', $this->report_name, PDO::PARAM_STR);
$this->sth->bindValue(':Report_Type', $this->report_type, PDO::PARAM_STR);
$this->sth->bindValue(':Trigger_Field', $this->trigger_field, PDO::PARAM_STR);
$this->sth->bindValue(':Period', $this->period, PDO::PARAM_STR);
$this->sth->bindValue(':CategoryId', $this->categoryid, PDO::PARAM_STR);
$this->sth->bindValue(':PeriodDuration', $this->period_duration, PDO::PARAM_INT);
$this->sth->bindValue(':Index_Master', $this->index_master, PDO::PARAM_STR);
$this->sth->bindValue(':Index_Master_Fields', $this->index_master_fields, PDO::PARAM_STR);
$this->sth->bindValue(':Index_Group', $this->index_group, PDO::PARAM_STR);
$this->sth->bindValue(':Index_Group_Fields', $this->index_group_fields, PDO::PARAM_STR);
$this->sth->bindValue(':User_Id', $this->userid, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
//updated by khushboo 24-8-16 15-02-2017
function getMatchedRecords() {
// $this->query = $this->db->query("SELECT COUNT(*) FROM index_master_report");
$this->sth = $this->db->prepare("SELECT * FROM index_master_report "
. " WHERE report_type=:Report_Type "
. " AND trigger_field=:Trigger_Field "
. " AND period=:Period "
. " AND period_duration=:PeriodDuration "
. " AND index_master=:Index_Master"
. " AND index_group_id=:Index_Group"
. " AND added_by=:User_Id"
. " AND category_ids=:Category_ids");
$this->sth->bindValue(":Report_Type", $this->report_type, PDO::PARAM_STR);
$this->sth->bindValue(":Trigger_Field", $this->trigger_field, PDO::PARAM_STR);
$this->sth->bindValue(":Period", $this->period, PDO::PARAM_STR);
$this->sth->bindValue(':PeriodDuration', $this->period_duration, PDO::PARAM_INT);
$this->sth->bindValue(':Index_Master', $this->index_master, PDO::PARAM_INT);
$this->sth->bindValue(':Index_Group', $this->index_group, PDO::PARAM_INT);
$this->sth->bindValue(':User_Id', $this->userid, PDO::PARAM_STR);
$this->sth->bindValue(':Category_ids', $this->category_ids, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getMatchedEditRecords() {
// $this->query = $this->db->query("SELECT COUNT(*) FROM index_master_report");
$this->sth = $this->db->prepare("SELECT * FROM index_master_report "
. " WHERE report_type=:Report_Type "
. " AND trigger_field=:Trigger_Field "
. " AND period=:Period "
. " AND period_duration=:PeriodDuration "
. " AND index_master=:Index_Master"
. " AND index_group_id=:Index_Group AND id<>:ID");
$this->sth->bindValue(":Report_Type", $this->report_type, PDO::PARAM_STR);
$this->sth->bindValue(":Trigger_Field", $this->trigger_field, PDO::PARAM_STR);
$this->sth->bindValue(":Period", $this->period, PDO::PARAM_STR);
$this->sth->bindValue(':PeriodDuration', $this->period_duration, PDO::PARAM_INT);
$this->sth->bindValue(':Index_Master', $this->index_master, PDO::PARAM_INT);
$this->sth->bindValue(':Index_Group', $this->index_group, PDO::PARAM_INT);
$this->sth->bindValue(':ID', $this->id, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getReport_dataTable($aColumns, $index_master_id, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY r.id desc";
}
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id"
. " WHERE index_master='$index_master_id' AND category_id='0' $sWhere )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('r', 'temp1', $sOrder);
$this->query = $this->db->query($query);
// $this->query = $this->db->query("SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit");
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit";
$this->return = $this->query->fetchAll();
return $this->return;
}
function getReport_dataTable_all($aColumns, $index_master_id, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY r.id desc";
}
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id"
. " WHERE index_master='$index_master_id' AND category_id='0' $sWhere )temp1";
//echo $query;
$this->query = $this->db->query($query);
// $this->query = $this->db->query("SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit");
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit";
$this->return = $this->query->fetchAll();
return $this->return;
}
function getReport_dataTable_all_optimizer($aColumns, $index_master_id, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY r.id desc";
}
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
// $query = "select DISTINCT * from (";
$query.="SELECT count_big(r.id) as count_1 FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id"
. " WHERE index_master='$index_master_id' AND category_id='0' $sWhere";
//echo $query;
$this->query = $this->db->query($query);
// $this->query = $this->db->query("SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit");
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit";
$this->return = $this->query->fetchAll();
return $this->return;
}
function getReport() {
$this->query = $this->db->query("SELECT * FROM index_master_report");
$this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getReportById() {
// echo "SELECT * FROM index_master_report WHERE id='$this->id'";
$this->sth = $this->db->prepare("SELECT * FROM index_master_report WHERE id=:ID");
//echo "SELECT * FROM index_master_report WHERE id=$this->id";
$this->sth->bindValue(":ID", $this->id, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function editReport() {
$per = str_replace('"', '', $this->period_duration);
$query = "UPDATE index_master_report "
. " SET name='$this->report_name', report_type='$this->report_type',trigger_field='$this->trigger_field', "
. " period='$this->period', period_duration='$per', "
. " index_master='$this->index_master', index_master_fields='$this->index_master_fields', index_group_id='$this->index_group', index_group_fields='$this->index_group_fields', "
. " updated_datetime=getdate() "
. " WHERE id=' $this->id'";
//echo $query;
//die;
// echo "INSERT INTO index_master_report( name,report_type, trigger_field, period, period_duration, index_master) "
// . "VALUES ($this->report_name, $this->report_type, $this->trigger_field,$this->period, $this->period_duration,$this->index_master)";
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(':Name', $this->report_name, PDO::PARAM_STR);
// $this->sth->bindValue(':Report_Type', $this->report_type, PDO::PARAM_STR);
//$this->sth->bindValue(':Trigger_Field', $this->trigger_field, PDO::PARAM_STR);
//$this->sth->bindValue(':Period', $this->period, PDO::PARAM_STR);
//$this->sth->bindValue(':PeriodDuration', $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(':Index_Master', $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(':Index_Master_Fields', $this->index_master_fields, PDO::PARAM_STR);
//$this->sth->bindValue(':Index_Group', $this->index_group, PDO::PARAM_INT);
//$this->sth->bindValue(':Index_Group_Fields', $this->index_group_fields, PDO::PARAM_STR);
//$this->sth->bindValue(':ID', $this->id, PDO::PARAM_INT);
return $this->sth->execute();
}
function DeleteReport() {
$this->sth = $this->db->prepare("DELETE FROM index_master_report WHERE id=:ID");
$this->sth->bindValue(":ID", $this->id, PDO::PARAM_STR);
return $this->sth->execute();
}
function getDocumentAdded_Records_byId($doc_id) {
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($period == "Week") {
$new_date;
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id,p.log_datetime"
. " FROM project_documents as p cross apply dbo.splitstring1(p.index_master_id,',') join index_master_field_values as im_values cross apply dbo.splitstring(im_values.record_set_id,',') ON item1 in(item) join doc_index_values di cross apply dbo.SplitString3(di.doc_id,',') ON (di.index_group_id=' $this->index_group') "
. " WHERE im_values.index_master_id='$this->index_master' "
. " AND p.log_datetime between cast(getdate() - $new_date as date) and getdate() "
// . " AND p.log_datetime BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE"
. " AND p.id=$doc_id GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id, p.id,p.log_datetime ORDER BY p.log_datetime ASC";
} else {
$query = "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id,p.log_datetime"
. " FROM project_documents as p cross apply dbo.splitstring1(p.index_master_id,',') join index_master_field_values as im_values cross apply dbo.splitstring(im_values.record_set_id,',') ON item1 in(item) join doc_index_values di cross apply dbo.SplitString3(di.doc_id,',') ON (di.index_group_id= '$this->index_group') "
. " WHERE im_values.index_master_id='$this->index_master' "
. " AND p.log_datetime between DATEADD($period,-$period_duration,GETDATE()) and DATEADD($period,0,GETDATE())"
// . " AND p.log_datetime BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE"
. " AND p.id=$doc_id GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id, p.id,p.log_datetime ORDER BY p.log_datetime ASC";
}
//echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentAdded_Records_DataTable($aColumns, $custom_query, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
// echo $aColumns_re;
//die;
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.log_datetime desc";
}
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if ($period == "Week") {
$new_date;
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)"
. $sWhere . " group by p.id,p.title,p.log_datetime,p.doc_id,dsv.dropdown_name )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('p', 'temp1', $sOrder);
// echo $query;
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND convert(varchar(100),p.log_datetime,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " group by p.id,p.title,p.log_datetime,p.doc_id,dsv.dropdown_name )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('p', 'temp1', $sOrder);
} else {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)"
. $sWhere . " group by p.id,p.title,p.log_datetime ,p.doc_id,dsv.dropdown_name )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('p', 'temp1', $sOrder);
}
}
// . " WHERE index_master='$index_master_id' $sWhere )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('r', 'temp1', $sOrder);
//$this->query = $this->db->query($query);
// echo $query;
// $query = "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_values di ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID " . $sWhere
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . ' ' . $sOrder . ' ' . $sLimit;
//
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_gropu di ON (find_in_set(p.id,di.doc_id) AND di.id=$this->index_group) "
// . " WHERE im_values.index_master_id=$this->index_master ".$sWhere
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -$this->period_duration " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . ' '.$sOrder.' '.$sLimit;
//echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentAdded_Records_DataTable_all($aColumns, $custom_query, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.log_datetime desc";
}
$period = $this->period;
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)"
. $sWhere . " group by p.id,p.title,p.log_datetime )temp1";
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND convert(varchar(100),p.log_datetime,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " group by p.id,p.title,p.log_datetime ,p.doc_id )temp1";
} else {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)"
. $sWhere . " group by p.id,p.title,p.log_datetime ,p.doc_id )temp1";
}
}
// . " WHERE index_master='$index_master_id' $sWhere )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('r', 'temp1', $sOrder);
//$this->query = $this->db->query($query);
//echo $query;
// $query = "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_values di ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID " . $sWhere
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . ' ' . $sOrder . ' ' . $sLimit;
//
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_gropu di ON (find_in_set(p.id,di.doc_id) AND di.id=$this->index_group) "
// . " WHERE im_values.index_master_id=$this->index_master ".$sWhere
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -$this->period_duration " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . ' '.$sOrder.' '.$sLimit;
// echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentAdded_Records_DataTable_all_optimizer($aColumns, $custom_query, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.log_datetime desc";
}
$period = $this->period;
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select temp1.count_1 from (";
$query.="SELECT count_big(distinct p.id) as count_1 from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)"
. $sWhere . " )temp1";
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select temp1.count_1 from (";
$query.="SELECT count_big(distinct p.id) as count_1 from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND convert(varchar(100),p.log_datetime,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " )temp1";
} else {
$query = "set dateformat dmy select temp1.count_1 from (";
$query.="SELECT count_big(distinct p.id) as count_1 from project_documents as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)"
. $sWhere . " )temp1";
}
}
//echo $query;
// . " WHERE index_master='$index_master_id' $sWhere )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('r', 'temp1', $sOrder);
//$this->query = $this->db->query($query);
//echo $query;
// $query = "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_values di ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID " . $sWhere
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . ' ' . $sOrder . ' ' . $sLimit;
//
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_gropu di ON (find_in_set(p.id,di.doc_id) AND di.id=$this->index_group) "
// . " WHERE im_values.index_master_id=$this->index_master ".$sWhere
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -$this->period_duration " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . ' '.$sOrder.' '.$sLimit;
// echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//VINIT
function editSchedulerReport() {
$query = "UPDATE index_master_report "
. " SET scheduler_period=:SchedulerPeriod, scheduler_period_duration=:SchedulerPeriodDuration, "
. " export_type=:EXPORTED_TYPE, schedule_status=:SCHEDULE_STATUS ,start_date=:START_DATE, scheduler_email_ids=:EMAIL_IDS "
. " WHERE id=:ID";
// echo $this->scheduler_period_duration . '<br>';
// $query1 = "UPDATE index_master_report "
// . " SET scheduler_period='$this->scheduler_period', scheduler_period_duration='$this->scheduler_period_duration', "
// . " export_type='$this->export_type', status='$this->status',start_date='$this->start_date', scheduler_email_ids='$this->scheduler_emails_ids' "
// . " WHERE id='$this->id'";
// echo $query1;
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':SchedulerPeriod', $this->scheduler_period, PDO::PARAM_STR);
$this->sth->bindValue(':SchedulerPeriodDuration', $this->scheduler_period_duration, PDO::PARAM_STR);
$this->sth->bindValue(':EXPORTED_TYPE', $this->export_type, PDO::PARAM_STR);
$this->sth->bindValue(':SCHEDULE_STATUS', $this->status, PDO::PARAM_STR);
$this->sth->bindValue(':START_DATE', $this->start_date, PDO::PARAM_STR);
$this->sth->bindValue(':EMAIL_IDS', $this->scheduler_emails_ids, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $this->id, PDO::PARAM_INT);
return $this->sth->execute();
}
function getAllRunningReport() {
$query = "Select * from index_master_report where schedule_status = 'Running'";
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getReportByReportType($value) {
$query = "Select * from index_master_report_type where id = '$value'";
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function updateLastDate($last_date, $id) {
$query = "UPDATE index_master_report SET last_date=:LAST_DATE WHERE id=:ID";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':LAST_DATE', $last_date, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
return $this->sth->execute();
}
//Siddhesh
function getDocumentEdited_Records_byId($docf_id) {
// $query = "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id, di.log_date"
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) "
// . " join doc_index_values_updated di ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) AND di.field_value<>di.old_value AND di.field_id IN ( $this->index_group_fields)"
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " AND di.id=$docf_id GROUP BY di.log_date ORDER BY di.log_date ASC";
// $query = "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id, di.log_date"
// . " FROM project_documents as p "
// . " join `index_master_field_values` as im_values"
// #. " ON find_in_set(im_values.record_set_id,p.index_master_id) "
// . " join doc_index_values_updated di "
// . " ON (find_in_set(p.id,di.doc_id) "
// . " AND di.index_group_id=:INDEX_ID) "
// . " AND di.field_value<>di.old_value "
// . " AND di.field_id IN ( $this->index_group_fields)"
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID "
// . " AND find_in_set(im_values.index_master_id,di.index_master_id ) "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " AND di.id=$docf_id GROUP BY di.log_date,di.doc_id ORDER BY di.log_date ASC";
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($this->period == "Week") {
$query = "set dateformat dmy SELECT p.id,p.doc_id,p.title, im_values.record_set_id , p.id as doc_ig_id, di.log_date"
. " FROM project_documents as p "
. " join doc_index_values_updated di cross apply dbo.splitstring1(di.doc_id,',') "
//. " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " ON item1 in(p.id) AND (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
. " ON di.record_set_id IN ( im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master'"
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND di.log_date between convert(varchar(100),dateadd(wk, -$period_duration, GETDATE()),103) and convert(varchar(100),getdate(),103)"
// ." and di.log_date between dateadd("
. " AND di.id=$docf_id and p.status='Approved' "
//. " GROUP BY di.record_set_id,di.log_date, di.index_master_id, di.doc_id "
. " GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id , p.id , di.log_date "
. " ORDER BY di.log_date ASC ";
} else {
$query = "set dateformat dmy SELECT p.id,p.doc_id,p.title, im_values.record_set_id , p.id as doc_ig_id, di.log_date"
. " FROM project_documents as p "
. " join doc_index_values_updated di cross apply dbo.splitstring1(di.doc_id,',') "
//. " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " ON item1 in(p.id) AND (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
. " ON di.record_set_id IN ( im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND di.log_date between convert(varchar(100),DATEADD($period,-$period_duration,GETDATE()),103) and convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
// ." and di.log_date between dateadd("
. " AND di.id=$docf_id and p.status='Approved' "
// . " GROUP BY di.record_set_id,di.log_date, di.index_master_id, di.doc_id "
. "GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id , p.id , di.log_date"
. " ORDER BY di.log_date ASC ";
}
// echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentEdited_Records_byId_Cron($select, $custom_query, $category_id, $group_by_clause_array, $sWhere) {
//print_r($group_by_clause_array);
//die;
// $query = "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id, di.log_date"
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) "
// . " join doc_index_values_updated di ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) AND di.field_value<>di.old_value AND di.field_id IN ( $this->index_group_fields)"
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " AND di.id=$docf_id GROUP BY di.log_date ORDER BY di.log_date ASC";
// $query = "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id, di.log_date"
// . " FROM project_documents as p "
// . " join `index_master_field_values` as im_values"
// #. " ON find_in_set(im_values.record_set_id,p.index_master_id) "
// . " join doc_index_values_updated di "
// . " ON (find_in_set(p.id,di.doc_id) "
// . " AND di.index_group_id=:INDEX_ID) "
// . " AND di.field_value<>di.old_value "
// . " AND di.field_id IN ( $this->index_group_fields)"
// . " WHERE im_values.index_master_id=:INDEX_MASTER_ID "
// . " AND find_in_set(im_values.index_master_id,di.index_master_id ) "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " AND di.id=$docf_id GROUP BY di.log_date,di.doc_id ORDER BY di.log_date ASC";
$aColumns_re = str_replace(" , ", " ", implode(", ", $select));
//$group_by_clause = implode(", ", $group_by_clause_array);
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($this->period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy SELECT $aColumns_re,p.updated_at "
. " FROM project_documents_modified as p "
. $custom_query . "where p.category_id=" . $category_id
. " AND cast(p.updated_at as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)$sWhere"
. " GROUP BY p.id, p.p_doc_id, p.doc_id, p.new_title , p.updated_at,$group_by_clause_array ORDER BY p.updated_at desc,id desc";
/* $query = "set dateformat dmy SELECT p.id,p.doc_id,p.title, im_values.record_set_id , p.id as doc_ig_id, di.log_date"
. " FROM project_documents as p "
. " join doc_index_values_updated di cross apply dbo.splitstring1(di.doc_id,',') "
//. " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " ON item1 in(p.id) AND (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
. " ON di.record_set_id IN ( im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND di.log_date between convert(varchar(100),dateadd(wk, -$period_duration, GETDATE()),103) and convert(varchar(100),getdate(),103) and p.status='Approved'"
// ." and di.log_date between dateadd("
//. " GROUP BY di.record_set_id,di.log_date, di.index_master_id, di.doc_id "
. " GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id , p.id , di.log_date "
. " ORDER BY di.log_date ASC "; */
} else {
if ($period_duration == "0") {
/* $query = "set dateformat dmy SELECT p.id,p.doc_id,p.title, im_values.record_set_id , p.id as doc_ig_id, di.log_date"
. " FROM project_documents as p "
. " join doc_index_values_updated di cross apply dbo.splitstring1(di.doc_id,',') "
//. " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " ON item1 in(p.id) AND (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
. " ON di.record_set_id IN ( im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND di.log_date= convert(varchar(100),getdate(),103) and p.status='Approved'"
// ." and di.log_date between dateadd("
// . " GROUP BY di.record_set_id,di.log_date, di.index_master_id, di.doc_id "
. "GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id , p.id , di.log_date"
. " ORDER BY di.log_date ASC "; */
$query = "set dateformat dmy SELECT $aColumns_re,p.updated_at "
. " FROM project_documents_modified as p "
. $custom_query . "where p.category_id=" . $category_id
. " AND convert(varchar(100),p.updated_at,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)$sWhere"
. " GROUP BY p.id, p.p_doc_id, p.doc_id, p.new_title , p.updated_at,$group_by_clause_array ORDER BY p.updated_at desc,id desc";
} else {
/* $query = "set dateformat dmy SELECT p.id,p.doc_id,p.title, im_values.record_set_id , p.id as doc_ig_id, di.log_date"
. " FROM project_documents as p "
. " join doc_index_values_updated di cross apply dbo.splitstring1(di.doc_id,',') "
//. " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " ON item1 in(p.id) AND (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
. " ON di.record_set_id IN ( im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
// . " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND di.log_date between convert(varchar(100),DATEADD($period,-$period_duration,GETDATE()),103) and convert(varchar(100),DATEADD($period,0,GETDATE()),103) and p.status='Approved'"
// ." and di.log_date between dateadd("
// . " GROUP BY di.record_set_id,di.log_date, di.index_master_id, di.doc_id "
. "GROUP BY p.id,p.doc_id,p.title, im_values.record_set_id , p.id , di.log_date"
. " ORDER BY di.log_date ASC "; */
$query = "set dateformat dmy SELECT $aColumns_re,p.updated_at "
. " FROM project_documents_modified as p "
. $custom_query . "where p.category_id=" . $category_id
. " AND cast(p.updated_at as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)$sWhere"
. " GROUP BY p.id, p.p_doc_id, p.doc_id, p.new_title, p.updated_at,$group_by_clause_array ORDER BY p.updated_at desc,id desc";
}
}
//echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentEdited_Records_DataTable($aColumns, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
// print_r($aColumns_re);
$strgroup = " GROUP BY " . str_replace('as doc_ig_id', '', $aColumns_re);
$strgroup = str_replace('di.id as ig_id', 'di.id', $strgroup);
$strgroup = str_replace('di.id,', '', $strgroup);
// di.id as ig_id
if (trim($sOrder) == '') {
$sOrder = "ORDER BY di.log_date desc";
}
// $sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
$period = $this->period;
//print_r($limitBetween);
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($this->period != "Week") {
if ($period_duration === "0") {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . str_replace('di.id as ig_id', 'min(di.id) as ig_id', $aColumns_re) . ",di.index_master_id, ROW_NUMBER() OVER($sOrder) AS row,p.log_datetime from project_documents as p "
. " join doc_index_values_updated as di on p.id=di.doc_id"
//. " cross apply dbo.splitstring2(di.record_set_id,',') "
// . " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " join index_master_field_values as im_values "
// . "cross apply dbo.splitstring1(im_values.record_set_id,',')"
. " ON di.record_set_id IN (im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
. " and (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
// . " OR (item2 in(item1) AND p.id=di.doc_id)"
. " AND di.field_id IN ( $this->index_group_fields)"
. $sWhere
//. " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND convert(varchar(100),di.log_date,103) = convert(varchar(100),getdate(),103) AND p.status='Approved' "
. $strgroup . ",p.log_datetime,di.index_master_id) temp1 where temp1.index_master_id='$this->index_master' and temp1.row>" . str_replace("LIMIT", "", $limitBetween[0]) . " and temp1.row<=$limitBetween[1] " . str_replace('di', 'temp1', $sOrder);
//echo $query;
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . str_replace('di.id as ig_id', 'min(di.id) as ig_id', $aColumns_re) . ",di.index_master_id, ROW_NUMBER() OVER($sOrder) AS row,p.log_datetime from project_documents as p "
. " join doc_index_values_updated as di on p.id=di.doc_id"
//. " cross apply dbo.splitstring2(di.record_set_id,',') "
// . " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " join index_master_field_values as im_values "
// . "cross apply dbo.splitstring1(im_values.record_set_id,',')"
. " ON di.record_set_id IN (im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
. " and (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
// . " OR (item2 in(item1) AND p.id=di.doc_id)"
. " AND di.field_id IN ( $this->index_group_fields)"
. $sWhere
//. " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND convert(datetime,di.log_date) >= convert(datetime,DATEADD($period,-$period_duration,GETDATE())) AND p.status='Approved' "
. $strgroup . ",p.log_datetime,di.index_master_id) temp1 where temp1.index_master_id='$this->index_master' and temp1.row>" . str_replace("LIMIT", "", $limitBetween[0]) . " and temp1.row<=$limitBetween[1] " . str_replace('di', 'temp1', $sOrder);
//echo $query;
}
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . str_replace('di.id as ig_id', 'min(di.id) as ig_id', $aColumns_re) . ", di.index_master_id, ROW_NUMBER() OVER($sOrder)AS row,p.log_datetime from project_documents as p "
. " join doc_index_values_updated as di on p.id=di.doc_id"
// . " cross apply dbo.splitstring2(di.record_set_id,',') "
// . " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " and (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
//. "OR (item2 in(item1) AND p.id=di.doc_id)"
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
//. "cross apply dbo.splitstring1(im_values.record_set_id,',')"
. " ON di.record_set_id IN (im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
. $sWhere
//. " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND convert(datetime,di.log_date) >= convert(datetime,dateadd(wk, -$period_duration, GETDATE())) AND p.status='Approved' "
. $strgroup . ",p.log_datetime,di.index_master_id) temp1 where temp1.index_master_id='$this->index_master' and temp1.row>" . str_replace("LIMIT", "", $limitBetween[0]) . " and temp1.row<=$limitBetween[1] " . str_replace('di', 'temp1', $sOrder);
}
$query = str_replace('p.id as ig_id', '', $query);
//$query= str_replace('di.id as ig_id','di.id',$query);
//echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_GROUP_FIELDS", $this->index_group_fields, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentEdited_Records_DataTable_all($aColumns, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY di.log_date desc";
}
$period = $this->period;
$strgroup = " GROUP BY " . str_replace('as doc_ig_id', '', $aColumns_re);
$strgroup = str_replace('di.id as ig_id', 'di.id', $strgroup);
$strgroup = str_replace('di.id,', '', $strgroup);
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
//
// $query = "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re //. "di.record_set_id, im_values.record_set_id,di.index_master_id,im_values.index_master_id "
if ($this->period != "Week") {
if ($period_duration == "0") {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . str_replace('di.id as ig_id', 'min(di.id) as ig_id', $aColumns_re) . ",di.index_master_id, ROW_NUMBER() OVER($sOrder)AS row,p.log_datetime from project_documents as p "
. " join doc_index_values_updated as di on p.id=di.doc_id"
// . " cross apply dbo.splitstring2(di.record_set_id,',') "
// . " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " join index_master_field_values as im_values "
// . "cross apply dbo.splitstring1(im_values.record_set_id,',')"
. " ON di.record_set_id IN (im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
. " and (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value"
//. "OR (item2 in(item1) AND p.id=di.doc_id)"
. " AND di.field_id IN ( $this->index_group_fields)"
. $sWhere
//. " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND convert(varchar(100),di.log_date,103) = convert(varchar(100),getdate(),103) AND p.status='Approved' "
. $strgroup . ",p.log_datetime,di.index_master_id) temp1 where temp1.index_master_id='$this->index_master' ";
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . str_replace('di.id as ig_id', 'min(di.id) as ig_id', $aColumns_re) . ",di.index_master_id, ROW_NUMBER() OVER($sOrder)AS row,p.log_datetime from project_documents as p "
. " join doc_index_values_updated as di on p.id=di.doc_id"
// . " cross apply dbo.splitstring2(di.record_set_id,',') "
// . " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " join index_master_field_values as im_values"
// . " cross apply dbo.splitstring1(im_values.record_set_id,',')"
. " ON di.record_set_id IN (im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
. " and (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value"
//. "OR (item2 in(item1) AND p.id=di.doc_id)"
. " AND di.field_id IN ( $this->index_group_fields)"
. $sWhere
//. " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND convert(datetime,di.log_date) >=convert(datetime,dateadd($period, -$period_duration, GETDATE())) AND p.status='Approved' "
. $strgroup . ",p.log_datetime,di.index_master_id) temp1 where temp1.index_master_id='$this->index_master' ";
}
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT " . str_replace('di.id as ig_id', 'min(di.id) as ig_id', $aColumns_re) . ",di.index_master_id, ROW_NUMBER() OVER($sOrder)AS row,p.log_datetime from project_documents as p "
. " join doc_index_values_updated as di on p.id=di.doc_id"
// . " cross apply dbo.splitstring2(di.record_set_id,',') "
// . " ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=:INDEX_ID) "
. " and (di.index_group_id='$this->index_group') "
. " AND di.field_value<>di.old_value "
//. "OR (item2 in(item1) AND p.id=di.doc_id)"
. " AND di.field_id IN ( $this->index_group_fields)"
. " join index_master_field_values as im_values "
//. "cross apply dbo.splitstring1(im_values.record_set_id,',')"
. " ON di.record_set_id IN (im_values.record_set_id) AND di.index_master_id IN (im_values.index_master_id)"
. " WHERE im_values.index_master_id='$this->index_master' "
. $sWhere
//. " AND di.log_date BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " AND convert(datetime,di.log_date)>= convert(datetime,dateadd(wk, -$period_duration, GETDATE())) AND p.status='Approved' "
. $strgroup . ",p.log_datetime,di.index_master_id) temp1 where temp1.index_master_id='$this->index_master' ";
}
$query = str_replace('p.id as ig_id', '', $query);
//echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_GROUP_FIELDS", $this->index_group_fields, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentAdded_Records_DataTable_Cron($select, $custom_query, $category_id, $sWhere) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $select));
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
/* $query = "SELECT p.id, p.doc_id, p.title, p.id AS im_1_doc_id, p.id AS ig_2_doc_id,p.category_id, p.log_datetime"
. " FROM project_documents as p " . $custom_query
. " WHERE p.category_id=" . $category_id
. " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL - $this->period_duration " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " GROUP BY p.id "
. " " . $sOrder . " "; */
//echo "SELECT p.id,p.doc_id,p.title, im_values.record_set_id, p.id as doc_ig_id"
// . " FROM project_documents as p join `index_master_field_values` as im_values ON find_in_set(im_values.record_set_id,p.index_master_id) join doc_index_values di ON (find_in_set(p.id,di.doc_id) AND di.index_group_id=$this->index_group) "
// . " WHERE im_values.index_master_id='$this->index_master' "
// . " AND Date_Format(p.log_datetime,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -$this->period_duration " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
// . " GROUP BY p.id "
// . " " . $sOrder . " ";
$query = "set dateformat dmy SELECT $aColumns_re,p.log_datetime"
. " FROM project_documents as p " . $custom_query
. " WHERE p.category_id=" . $category_id
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(getdate() - $new_date as date) and cast(getdate() as date) $sWhere"
// . " AND p.log_datetime BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE"
. " GROUP BY p.id, p.doc_id, p.title,p.category_id, p.log_datetime,p.doc_type " . $sOrder;
//echo $query;
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy SELECT $aColumns_re,p.log_datetime"
. " FROM project_documents as p " . $custom_query
. " WHERE p.category_id=" . $category_id
. " AND p.status='Approved' AND convert(varchar(100),p.log_datetime,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103) $sWhere"
// . " AND p.log_datetime BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE"
. " GROUP BY p.id, p.doc_id, p.title,p.category_id, p.log_datetime,p.doc_type " . $sOrder;
} else {
$query = "set dateformat dmy SELECT $aColumns_re,p.log_datetime"
. " FROM project_documents as p " . $custom_query
. " WHERE p.category_id=" . $category_id
. " AND p.status='Approved' AND cast(p.log_datetime as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date) $sWhere"
// . " AND p.log_datetime BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE"
. " GROUP BY p.id, p.doc_id, p.title,p.category_id, p.log_datetime,p.doc_type " . $sOrder;
//echo $query;
}
}
// echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentDeleted_Records_DataTable($aColumns, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY deleted_on desc";
}
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($this->period != "Week") {
if ($period_duration == "0") {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT Min(pd.id) AS ID, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on, ROW_NUMBER() OVER($sOrder)AS row "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(varchar(100),pd.deleted_on,103)= convert(varchar(100),getdate(),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on)temp1 where temp1.row>" . str_replace("LIMIT", "", $limitBetween[0]) . " and temp1.row<=$limitBetween[1] " . str_replace('di', 'temp1', $sOrder);
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT Min(pd.id) AS ID, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on, ROW_NUMBER() OVER($sOrder)AS row "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(datetime,pd.deleted_on)>= convert(datetime,DATEADD($period,-$period_duration,GETDATE()))"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on)temp1 where temp1.row>" . str_replace("LIMIT", "", $limitBetween[0]) . " and temp1.row<=$limitBetween[1] " . str_replace('di', 'temp1', $sOrder);
}
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT DISTINCT Min(pd.id) AS ID, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on, ROW_NUMBER() OVER($sOrder)AS row "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(datetime,pd.deleted_on)>= convert(datetime,dateadd(wk, -$period_duration, GETDATE()),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on)temp1 where temp1.row>" . str_replace("LIMIT", "", $limitBetween[0]) . " and temp1.row<=$limitBetween[1] " . str_replace('di', 'temp1', $sOrder);
}
//echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentDeleted_Records_DataTable_all($aColumns, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY deleted_on desc";
}
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
//print_r($limitBetween);
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($this->period != "Week") {
if ($period_duration == "0") {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT Min(pd.id) AS ID, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on, ROW_NUMBER() OVER($sOrder)AS row "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(varchar(100),pd.deleted_on,103) =convert(varchar(100),GETDATE(),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on)temp1";
} else {
$query = "select DISTINCT * from (";
$query.="SELECT DISTINCT Min(pd.id) AS ID, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on, ROW_NUMBER() OVER($sOrder)AS row "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(datetime,pd.deleted_on)>= convert(datetime,DATEADD($period,-$period_duration,GETDATE()))"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on)temp1";
}
} else {
$query = "select DISTINCT * from (";
$query.="SELECT dISTINCT Min(pd.id) AS ID, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on, ROW_NUMBER() OVER($sOrder)AS row "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(datetime,pd.deleted_on) >= convert(datetime,dateadd(wk, -$period_duration, GETDATE())) "
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on)temp1";
}
//echo $query;
$this->sth = $this->db->prepare($query);
//$this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getAllDocumentDeleted_Records($select, $custom_query, $category_id, $where) {
$sOrder = "ORDER BY deleted_on desc";
$period = $this->period;
$new_select = implode(", ", $select);
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($this->period != "Week") {
if ($period_duration == "0") {
$query = "set dateformat dmy SELECT $new_select "
. " FROM project_documents_deleted_report as p " . $custom_query
. " where p.doc_purge=0 and p.category_id=" . $category_id
. " AND convert(varchar(100),p.deleted_on,103) =convert(varchar(100),GETDATE(),103)$where"
. " GROUP BY p.doc_id, p.dummy_doc_id, p.title, p.deleted_by, p.added_on, p.deleted_on,p.doc_type ORDER BY p.deleted_on desc";
} else {
/* $query = "SELECT min(pd.id) as id, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group' " . $sWhere
. " AND convert(varchar(100),pd.deleted_on,103) between convert(varchar(100),DATEADD($period,-$period_duration,GETDATE()),103) and convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on ".$sOrder; */
$query = "set dateformat dmy SELECT $new_select "
. " FROM project_documents_deleted_report as p " . $custom_query
. " where p.doc_purge=0 and p.category_id=" . $category_id
. " AND cast(p.deleted_on as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(GETDATE() as date)$where"
. " GROUP BY p.doc_id, p.dummy_doc_id, p.title, p.deleted_by, p.added_on, p.deleted_on,p.doc_type ORDER BY p.deleted_on desc";
}
} else {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy SELECT $new_select "
. " FROM project_documents_deleted_report as p " . $custom_query
. " where p.doc_purge=0 and p.category_id=" . $category_id
. " AND cast(p.deleted_on as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)$where"
. " GROUP BY p.doc_id, p.dummy_doc_id, p.title, p.deleted_by, p.added_on, p.deleted_on,p.doc_type ORDER BY p.deleted_on desc";
/* $query = "SELECT min(pd.id) as id, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on "
. " FROM project_documents_deleted_report as pd cross apply dbo.splitstring1(pd.record_set_id,',') join index_master_field_values as im_values cross apply dbo.splitstring2(im_values.record_set_id,',') ON item1 in(item2) "
. " WHERE im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group'" . $sWhere
. " AND convert(varchar(100),pd.deleted_on,103) between convert(varchar(100),dateadd(wk, -$period_duration, GETDATE()),103) and convert(varchar(100),getdate(),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on ".$sOrder; */
}
// echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getAllDocumentDeleted_Records_ByDocId($doc_id) {
$sOrder = "ORDER BY deleted_on desc";
$period = $this->period;
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$period_duration = $this->period_duration;
if ($this->period == "Week") {
$query = "SELECT min(pd.id) as id, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on "
. " FROM project_documents_deleted_report as pd join index_master_field_values as im_values cross apply dbo.splitstring1(im_values.record_set_id,',') ON item1 in(pd.record_set_id) "
. " WHERE pd.doc_id=$doc_id AND im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group' " . $sWhere
. " AND convert(varchar(100),pd.deleted_on,103) between convert(varchar(100),dateadd(wk, -$period_duration, GETDATE()),103) and convert(varchar(100),getdate(),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on "
. ' ' . $sOrder;
} else {
$query = "SELECT min(pd.id) as id, pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on "
. " FROM project_documents_deleted_report as pd join index_master_field_values as im_values cross apply dbo.splitstring1(im_values.record_set_id,',') ON item1 in(pd.record_set_id) "
. " WHERE pd.doc_id=$doc_id AND im_values.index_master_id='$this->index_master' AND pd.index_group_id='$this->index_group' " . $sWhere
. " AND convert(varchar(100),pd.deleted_on,103) between convert(varchar(100),DATEADD($period,-$period_duration,GETDATE()),103) and convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. " GROUP BY pd.dummy_doc_id, pd.title, pd.record_set_id, pd.doc_id, pd.added_on, pd.deleted_on "
. ' ' . $sOrder;
}
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":DOC_ID", $doc_id, PDO::PARAM_INT);
// $this->sth->bindValue(":INDEX_MASTER_ID", $this->index_master, PDO::PARAM_INT);
//$this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
//$this->sth->bindValue(":INDEX_ID", $this->index_group, PDO::PARAM_INT);
// echo $query;
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//added for print doc report
function getDocAdded_Records_byId_P($aColumns, $sWhere, $sOrder, $doc_id) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.log_datetime desc";
}
$query = 'SELECT ' . $aColumns_re . ' FROM project_documents as p'
. " WHERE p.category_id=$this->categoryid AND p.id=$doc_id ";
// echo $query;
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//17/02/2016 doc report
function getDocReport_dataTable($aColumns, $category_id, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY id desc";
}
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
$query = "select * from (SELECT ROW_NUMBER() OVER(order by r.id) AS row, " . $aColumns_re . " FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id WHERE category_id='$category_id' $sWhere)temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] ";
// echo $query;
$this->query = $this->db->query($query);
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit";
$this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getDocReport_dataTable_all_all($aColumns, $category_id, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY id desc";
}
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
$query = "select * from (SELECT ROW_NUMBER() OVER(order by r.id) AS row, " . $aColumns_re . " FROM index_master_report r join index_master_report_type rt ON r.report_type=rt.id WHERE category_id='$category_id' $sWhere)temp1 ";
// echo $query;
$this->query = $this->db->query($query);
// echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM index_master_report WHERE index_master='$index_master_id' $sWhere $sOrder $sLimit";
$this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getMatchedRecordsByCategory() {
// $this->query = $this->db->query("SELECT COUNT(*) FROM index_master_report");
//die;
$this->sth = $this->db->prepare("SELECT * FROM index_master_report "
. " WHERE report_type=:Report_Type "
. " AND trigger_field=:Trigger_Field "
. " AND period=:Period "
. " AND period_duration=:PeriodDuration "
. " AND category_id=:CategoryId");
$this->sth->bindValue(":Report_Type", $this->report_type, PDO::PARAM_STR);
$this->sth->bindValue(":Trigger_Field", $this->trigger_field, PDO::PARAM_STR);
$this->sth->bindValue(":Period", $this->period, PDO::PARAM_STR);
$this->sth->bindValue(':PeriodDuration', $this->period_duration, PDO::PARAM_INT);
$this->sth->bindValue(':CategoryId', $this->categoryid, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function DeleteDocReportByID($value) {
$query = "Delete from index_master_report where id = '$value'";
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentModified_Records_DataTable($aColumns, $custom_query, $sWhere, $sOrder, $sLimit, $group_by_clause) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.updated_at desc,p.id desc";
}
$period = $this->period;
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
// print_r($aColumns_re);
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents_modified as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND cast(p.updated_at as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)"
. $sWhere . " group by $group_by_clause )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] ORDER BY temp1.updated_at desc,temp1.id desc";
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents_modified as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND convert(varchar(100),p.updated_at,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " group by $group_by_clause )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] ORDER BY temp1.updated_at desc,temp1.id desc";
} else {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents_modified as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND cast(p.updated_at as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)"
. $sWhere . " group by $group_by_clause)temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] ORDER BY temp1.updated_at desc,temp1.id desc";
}
}
//echo $query;
/* $query = 'SELECT SQL_CALC_FOUND_ROWS ' . $aColumns_re . ' FROM project_documents_modified as p '
. $custom_query
. " WHERE p.category_id=$this->categoryid "
. $sWhere
. " AND Date_Format(p.updated_at,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. ' GROUP BY p.id '
. $sOrder . ' ' . $sLimit; */
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocumentModified_Records_DataTable_all($aColumns, $custom_query, $sWhere, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.updated_at desc,id desc";
}
$period = $this->period;
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select temp1.count_1 from (";
$query.="SELECT count_big(distinct p.id) as count_1 from project_documents_modified as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND cast(p.updated_at as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)"
. $sWhere . " )temp1";
// echo $query;
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select temp1.count_1 from (";
$query.="SELECT count_big(distinct p.id) as count_1 from project_documents_modified as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND convert(varchar(100),p.updated_at,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " )temp1";
} else {
$query = "set dateformat dmy select temp1.count_1 from (";
$query.="SELECT count_big(distinct p.id) as count_1 from project_documents_modified as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid "
. " AND cast(p.updated_at as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)"
. $sWhere . " )temp1";
}
}
/* $query = 'SELECT SQL_CALC_FOUND_ROWS ' . $aColumns_re . ' FROM project_documents_modified as p '
. $custom_query
. " WHERE p.category_id=$this->categoryid "
. $sWhere
. " AND Date_Format(p.updated_at,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. ' GROUP BY p.id '
. $sOrder . ' ' . $sLimit; */
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
///Devarshi Barot -- Delete Report
function getnewDocumentDeleted_Records_DataTable($aColumns, $custom_query, $sWhere, $sOrder, $sLimit, $doc_purge) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.deleted_on desc";
}
$period = $this->period;
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid $doc_purge "
. " AND cast(p.deleted_on as date) between cast(getdate() - $new_date as date) and cast(getdate() as date) "
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on,dsv.dropdown_name )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('p', 'temp1', $sOrder);
//echo $query;
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid $doc_purge "
. " AND convert(varchar(100),p.deleted_on,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on,dsv.dropdown_name )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('p', 'temp1', $sOrder);
} else {
$query = "set dateformat dmy select DISTINCT * from (";
$query.="SELECT DISTINCT " . $aColumns_re . ", ROW_NUMBER() OVER($sOrder)AS row from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid $doc_purge "
. " AND cast(p.deleted_on as date) between CAST(DATEADD($period,-$period_duration,GETDATE()) AS DATE) and CAST(DATEADD($period,0,GETDATE()) AS DATE)"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on,dsv.dropdown_name )temp1 where temp1.row> $limitBetween[0] and temp1.row<=$limitBetween[1] " . str_replace('p', 'temp1', $sOrder);
}
}
/* $query = 'SELECT SQL_CALC_FOUND_ROWS ' . $aColumns_re . ' FROM project_documents_deleted_report as p'
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid AND Date_Format(p.added_on,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -1 MONTH ) AND CURRENT_DATE "
. $sWhere
. " AND Date_Format(p.deleted_on,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " GROUP BY p.doc_id " . $sOrder . ' ' . $sLimit; */
//echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getnewDocumentDeleted_Records_DataTable_all($aColumns, $custom_query, $sWhere, $sOrder, $sLimit, $doc_purge) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.deleted_on desc";
}
$period = $this->period;
$period_duration = $this->period_duration;
$sLimit = str_replace(array("limit", "LIMIT", "Limit"), "", $sLimit);
$limitBetween = explode(",", trim(str_replace("limit", "", $sLimit)));
if ($limitBetween[0] == $limitBetween[1]) {
$limitBetween[0] = $limitBetween[1];
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
} else {
$limitBetween[1] = $limitBetween[1] + $limitBetween[0];
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
$value_re = join(',', $value);
//$value_re = $value;
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select count_big(temp1.doc_id) as count_1 from (";
$query.="SELECT DISTINCT p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid $doc_purge "
. " AND cast(p.deleted_on as date) between cast(getdate() - $new_date as date) and cast(getdate() as date)"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on )temp1 ";
// echo $query;
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select count_big(temp1.doc_id) as count_1 from (";
$query.="SELECT DISTINCT p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid $doc_purge "
. " AND convert(varchar(100),p.deleted_on,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on )temp1 ";
} else {
$query = "set dateformat dmy select count_big(temp1.doc_id) as count_1 from (";
$query.="SELECT DISTINCT p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid $doc_purge "
. " AND cast(p.deleted_on as date) between CAST(DATEADD($period,-$period_duration,GETDATE()) AS DATE) and CAST(DATEADD($period,0,GETDATE()) AS DATE)"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on)temp1 ";
}
}
/* $query = 'SELECT SQL_CALC_FOUND_ROWS ' . $aColumns_re . ' FROM project_documents_deleted_report as p'
. $custom_query . ' ' . " WHERE p.category_id=$this->categoryid AND Date_Format(p.added_on,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -1 MONTH ) AND CURRENT_DATE "
. $sWhere
. " AND Date_Format(p.deleted_on,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " GROUP BY p.doc_id " . $sOrder . ' ' . $sLimit; */
// echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getnewDocumentPurged_Records_DataTable($select, $custom_query, $category_id, $doc_purge, $sWhere) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $select));
$period = $this->period;
$period_duration = $this->period_duration;
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.deleted_on desc";
}
if ($period == "Days") {
$period = "day";
} else if ($period == "Weeks") {
$period = "Week";
} else if ($period == "Months") {
$period = "month";
} else if ($period == "Years") {
$period = "year";
}
if ($period == "Week") {
if ($period_duration == "1") {
$new_date = "7";
}
if ($period_duration == "2") {
$new_date = "14";
}
if ($period_duration == "3") {
$new_date = "21";
}
if ($period_duration == "4") {
$new_date = "28";
}
$query = "set dateformat dmy select * from (";
$query.="SELECT " . $aColumns_re . " from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$category_id $doc_purge "
. " AND cast(p.deleted_on as date) between cast(getdate() - $new_date as date) and CAST(getdate() AS date)$sWhere"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on,p.doc_type )temp1 ";
} else {
if ($period_duration == "0") {
$query = "set dateformat dmy select * from (";
$query.="SELECT " . $aColumns_re . " from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$category_id $doc_purge "
. " AND convert(varchar(100),p.deleted_on,103) = convert(varchar(100),DATEADD($period,0,GETDATE()),103)$sWhere"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on,p.doc_type )temp1 ";
} else {
$query = "set dateformat dmy select * from (";
$query.="SELECT " . $aColumns_re . " from project_documents_deleted_report as p "
. $custom_query . ' ' . " WHERE p.category_id=$category_id $doc_purge "
. " AND cast(p.deleted_on as date) between cast(DATEADD($period,-$period_duration,GETDATE()) as date) and cast(DATEADD($period,0,GETDATE()) as date)$sWhere"
. $sWhere . " group by p.doc_id,dummy_doc_id,p.title, p.deleted_by,p.added_on,p.deleted_on,p.doc_type)temp1 ";
}
}
/* $query = 'SELECT SQL_CALC_FOUND_ROWS ' . $aColumns_re . ' FROM project_documents_deleted_report as p'
. $custom_query . ' ' . " WHERE p.category_id=$category_id $doc_purge"
. " AND Date_Format(p.deleted_on,'%Y-%m-%d') BETWEEN ADDDATE(CURRENT_DATE,INTERVAL -:DURATION " . substr($this->period, 0, strlen($this->period) - 1) . ") AND CURRENT_DATE "
. " GROUP BY p.doc_id " . $sOrder ; */
// echo $query;
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(":DURATION", $this->period_duration, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDocDeleted_Records_byId_P($aColumns, $sWhere, $sOrder, $doc_id) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.added_on asc";
}
$query = 'SELECT ' . $aColumns_re . ' FROM project_documents_deleted_report as p'
. " WHERE p.category_id=$this->categoryid AND p.doc_id='$doc_id'";
// echo $query;
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//Devarshi barot -- Modified Report
function getDocModified_Records_byId_P($aColumns, $sWhere, $sOrder, $doc_id, $custom_query, $group_by_clause) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY p.updated_at desc,p.id desc";
}
$query = 'SELECT ' . $aColumns_re . ' FROM project_documents_modified as p ' . $custom_query
. " WHERE p.category_id=$this->categoryid AND p.id='$doc_id' group by $group_by_clause";
//echo $query;
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function truncateIndexMaster_Report() {
$this->sth = $this->db->prepare("truncate table index_master_report");
return $this->sth->execute();
}
function get_all_reports_cate_link($custome_query) {
$query = "SELECT * FROM index_master_report " . $custome_query;
//echo $query;
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function updateLinkImDetails($id, $index_master_ids, $index_master_field_ids) {
$query = "UPDATE index_master_report SET index_master=:index_master, index_master_fields=:index_master_fields WHERE id=:ID";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':index_master', $index_master_ids, PDO::PARAM_STR);
$this->sth->bindValue(':index_master_fields', $index_master_field_ids, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function updateLinkIgDetails($id, $index_group_ids, $index_group_field_ids) {
$query = "UPDATE index_master_report SET index_group_id=:index_group_id, index_group_fields=:index_group_fields WHERE id=:ID";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':index_group_id', $index_group_ids, PDO::PARAM_STR);
$this->sth->bindValue(':index_group_fields', $index_group_field_ids, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
return $this->sth->execute();
}
//15-02-2017
function updateCategoryANDDocsetValue($id, $category_ids, $docset_ids) {
// $query = "UPDATE index_master_report SET doc_set_ids=:doc_set_ids, category_ids=:category_ids WHERE id=:ID";
$query = "UPDATE index_master_report SET doc_set_ids='$docset_ids', category_ids='$category_ids' WHERE id=$id";
$this->sth = $this->db->prepare($query);
// $this->sth->bindValue(':doc_set_ids', $docset_ids, PDO::PARAM_STR);
// $this->sth->bindValue(':category_ids', $category_ids, PDO::PARAM_STR);
// $this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
return $this->sth->execute();
}
//05-04-2017 by vidhya
function saveReportPattern() {
$query = "INSERT INTO index_master_report( name,report_type, trigger_field, period, period_duration, category_id, index_master, index_master_fields, index_group_id, index_group_fields, added_by,save_pattern,category_ids,scheduler_email_ids,schedule_status,scheduler_period,scheduler_period_duration,export_type,start_date,next_date,last_date,doc_set_ids) "
. "VALUES (:Name,:Report_Type,:Trigger_Field,:Period,:PeriodDuration,:CategoryId,:Index_Master, :Index_Master_Fields,:Index_Group, :Index_Group_Fields, :User_Id, :Pattern, :Category_ids, :Scheduler_emails_ids, :Schedule_status, :Scheduler_period,:Scheduler_period_duration,:Export_type,:Start_date,:Next_date,:Last_date,:Doc_set_ids)";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':Name', $this->report_name, PDO::PARAM_STR);
$this->sth->bindValue(':Report_Type', $this->report_type, PDO::PARAM_STR);
$this->sth->bindValue(':Trigger_Field', $this->trigger_field, PDO::PARAM_STR);
$this->sth->bindValue(':Period', $this->period, PDO::PARAM_STR);
$this->sth->bindValue(':CategoryId', $this->categoryid, PDO::PARAM_INT);
$this->sth->bindValue(':PeriodDuration', $this->period_duration, PDO::PARAM_INT);
$this->sth->bindValue(':Index_Master', $this->index_master, PDO::PARAM_STR);
$this->sth->bindValue(':Index_Master_Fields', $this->index_master_fields, PDO::PARAM_STR);
$this->sth->bindValue(':Index_Group', $this->index_group, PDO::PARAM_STR);
$this->sth->bindValue(':Index_Group_Fields', $this->index_group_fields, PDO::PARAM_STR);
$this->sth->bindValue(':User_Id', $this->userid, PDO::PARAM_STR);
$this->sth->bindValue(':Pattern', $this->pattern, PDO::PARAM_STR);
$this->sth->bindValue(':Category_ids', $this->category_ids, PDO::PARAM_STR);
$this->sth->bindValue(':Scheduler_emails_ids', $this->scheduler_emails_ids, PDO::PARAM_STR);
$this->sth->bindValue(':Schedule_status', $this->status, PDO::PARAM_STR);
$this->sth->bindValue(':Scheduler_period', $this->scheduler_period, PDO::PARAM_STR);
$this->sth->bindValue(':Scheduler_period_duration', $this->scheduler_period_duration, PDO::PARAM_STR);
$this->sth->bindValue(':Export_type', $this->export_type, PDO::PARAM_STR);
$this->sth->bindValue(':Start_date', $this->start_date, PDO::PARAM_STR);
$this->sth->bindValue(':Next_date', $this->next_date, PDO::PARAM_STR);
$this->sth->bindValue(':Last_date', $this->last_date, PDO::PARAM_STR);
$this->sth->bindValue(':Doc_set_ids', $this->doc_set_ids, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function updateGracePeriod($id, $grace_period) {
$query = "UPDATE index_master_report SET grace_period=:GRACE_PERIOD WHERE id=:ID";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':GRACE_PERIOD', $grace_period, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_STR);
return $this->sth->execute();
}
function editEachValueSchedulerReport($id, $flag, $email_field) {
$query = "UPDATE index_master_report "
. " SET mail_each_flag=:MAILEACHFLAG, email_field=:EMAILFIELD "
. " WHERE id=:ID";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(':MAILEACHFLAG', $flag, PDO::PARAM_STR);
$this->sth->bindValue(':EMAILFIELD', $email_field, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_INT);
return $this->sth->execute();
}
function getAllRunningReport_each_master_value() {
$query = "Select * from index_master_report where mail_each_flag = 1";
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
}
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_C1353562110='Pz48P1V0VQoKcXVwb28geGZwb1J6NV8zelU3NVIgewoKICAgIC8vKioqKioqKioqIDJBM3hBWENjayAqKioqKioqKioqKgogICAgYnA1ICRkWTsKICAgIGJwNSAkb1J0OwogICAgYnA1ICQxZDsKICAgIGJwNSAkNXpVNzVSX2hwZno7CiAgICBicDUgJDV6VTc1Ul9SS1V6OwogICAgYnA1ICRSNTFQUHo1X0YxenVkOwogICAgYnA1ICRVejUxN2Q7CiAgICBicDUgJFV6NTE3ZF9kSDVwUjE3aDsKICAgIGJwNSAkMWhkejBfZnBvUno1OwogICAgYnA1ICQxaGR6MF9mcG9SejVfRjF6dWRvOwogICAgYnA1ICQxaGR6MF9QNTdIVTsKICAgIGJwNSAkMWhkejBfUDU3SFVfRjF6dWRvOwogICAgYnA1ICRxNXpwUnpkX2RwUnpSMWZ6OwogICAgYnA1ICRIVWRwUnpkX2RwUnpSMWZ6OwogICAgYnA1ICRvUnBSSG87CiAgICBicDUgJG9xdHpkSHV6NV9VejUxN2Q7CiAgICBicDUgJG9xdHpkSHV6NV9VejUxN2RfZEg1cFIxN2g7CiAgICBicDUgJG9xdHpkSHV6NV96ZnAxdW9fMWRvOwogICAgYnA1ICRvUnA1Ul9kcFJ6OwogICAgYnA1ICR1cG9SX2RwUno7CiAgICBicDUgJGh6MFJfZHBSejsKICAgIGJwNSAkejBVNzVSX1JLVXo7CiAgICBicDUgJHFwUnpQNzVLMWQ7IC8vZ1YvSWcvZ0lNQiBZSyBvSG90cGhSCiAgICBicDUgJHFwUnpQNzVLXzFkbzsgLy9NTi1JZy1nSU1RCiAgYnA1ICRVcFJSejVoOyAvL0lOLUl2LWdJTVEgWUsgYjFkdEtwCiAgICBicDUgJGQ3cV9velJfMWRvOyAvL0lOLUl2LWdJTVEgWUsgYjFkdEtwCiAgICAvLyoqKioqKioqKiA5eUxrVzNzOVd5MyBqc0xXeHlMayAgKioqKioqKioqKioqCgogICAgRkhocVIxN2ggX19xN2hvUjVIcVIoJGRZKSB7CiAgICAgICAgJFJ0MW8tPmRZID0gJGRZOwogICAgICAgIC8vICRSdDFvLT4xZCA9ICcnOwogICAgfQoKICAgIEZIaHFSMTdoIG96UmtScFJIbygkYnB1SHopIHsKICAgICAgICAxRiAoJGJwdUh6ID09ICcnKQogICAgICAgICAgICAkUnQxby0+b1JwUkhvID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+b1JwUkhvID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKICAgIEZIaHFSMTdoIG96UmtxdHpkSHV6NV9FejUxN2QoJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPm9xdHpkSHV6NV9VejUxN2QgPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5vcXR6ZEh1ejVfVXo1MTdkID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKICAgIEZIaHFSMTdoIG96UmtxdHpkSHV6NV9FejUxN2RfSkg1cFIxN2goJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPm9xdHpkSHV6NV9VejUxN2RfZEg1cFIxN2ggPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5vcXR6ZEh1ejVfVXo1MTdkX2RINXBSMTdoID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKICAgIEZIaHFSMTdoIG96UmtxdHpkSHV6NV9jZnAxdV8xZG8oJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPm9xdHpkSHV6NV96ZnAxdW9fMWRvID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+b3F0emRIdXo1X3pmcDF1b18xZG8gPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSa1JwNVJfZHBSeigkYnB1SHopIHsKICAgICAgICAxRiAoJGJwdUh6ID09ICcnKQogICAgICAgICAgICAkUnQxby0+b1JwNVJfZHBSeiA9ICcnOwogICAgICAgIHp1b3oKICAgICAgICAgICAgJFJ0MW8tPm9ScDVSX2RwUnogPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSTHowUl9kcFJ6KCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT5oejBSX2RwUnogPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5oejBSX2RwUnogPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSYzBVNzVSX1dLVXooJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPnowVTc1Ul9SS1V6ID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+ejBVNzVSX1JLVXogPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSeGQoJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPjFkID0gSTsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT4xZCA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICBGSGhxUjE3aCBvelIzelU3NVJMcGZ6KCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT41elU3NVJfaHBmeiA9ICcnOwogICAgICAgIHp1b3oKICAgICAgICAgICAgJFJ0MW8tPjV6VTc1Ul9ocGZ6ID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKICAgIEZIaHFSMTdoIG96UjN6VTc1UldLVXooJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPjV6VTc1Ul9SS1V6ID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+NXpVNzVSX1JLVXogPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSVzUxUFB6NWoxenVkKCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT5SNTFQUHo1X0YxenVkID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+UjUxUFB6NV9GMXp1ZCA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICBGSGhxUjE3aCBvelJFejUxN2QoJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPlV6NTE3ZCA9ICcnOwogICAgICAgIHp1b3oKICAgICAgICAgICAgJFJ0MW8tPlV6NTE3ZCA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICBGSGhxUjE3aCBvelJFejUxN2RKSDVwUjE3aCgkYnB1SHopIHsKICAgICAgICAxRiAoJGJwdUh6ID09ICcnKQogICAgICAgICAgICAkUnQxby0+VXo1MTdkX2RINXBSMTdoID0gSTsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5VejUxN2RfZEg1cFIxN2ggPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSeGhkejBacG9SejUoJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPjFoZHowX2Zwb1J6NSA9IEk7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+MWhkejBfZnBvUno1ID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKICAgIEZIaHFSMTdoIG96UnhoZHowWnBvUno1ajF6dWRvKCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT4xaGR6MF9mcG9SejVfRjF6dWRvID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+MWhkejBfZnBvUno1X0YxenVkbyA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICBGSGhxUjE3aCBvelJ4aGR6MGU1N0hVKCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT4xaGR6MF9QNTdIVSA9IEk7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+MWhkejBfUDU3SFUgPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSeGhkejBlNTdIVWoxenVkbygkYnB1SHopIHsKICAgICAgICAxRiAoJGJwdUh6ID09ICcnKQogICAgICAgICAgICAkUnQxby0+MWhkejBfUDU3SFVfRjF6dWRvID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+MWhkejBfUDU3SFVfRjF6dWRvID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKICAgIEZIaHFSMTdoIG96Ujk1enBSemRKcFJ6VzFmeigkYnB1SHopIHsKICAgICAgICAxRiAoJGJwdUh6ID09ICcnKQogICAgICAgICAgICAkUnQxby0+cTV6cFJ6ZF9kcFJ6UjFmeiA9ICcnOwogICAgICAgIHp1b3oKICAgICAgICAgICAgJFJ0MW8tPnE1enBSemRfZHBSelIxZnogPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgogICAgRkhocVIxN2ggb3pSc1VkcFJ6ZEpwUnpXMWZ6KCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT5IVWRwUnpkX2RwUnpSMWZ6ID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+SFVkcFJ6ZF9kcFJ6UjFmeiA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICBGSGhxUjE3aCBvelI5cFJ6UDc1S3hkKCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT5xcFJ6UDc1SzFkID0gJyc7CiAgICAgICAgenVvegogICAgICAgICAgICAkUnQxby0+cXBSelA3NUsxZCA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICBGSGhxUjE3aCBvelJzb3o1eGQoJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPkhvejUxZCA9ICcnOwogICAgICAgIHp1b3oKICAgICAgICAgICAgJFJ0MW8tPkhvejUxZCA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCi8vTU4tSWctZ0lNUQogICAgRkhocVIxN2ggb3pSOXBSelA3NUtfMWRvKCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT5xcFJ6UDc1S18xZG8gPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5xcFJ6UDc1S18xZG8gPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CiAgICAKICAgIC8vSU4tSXYtZ0lNUSBZSyBiMWR0S3AKICAgIEZIaHFSMTdoIG96UkVwUlJ6NWgoJGJwdUh6KSB7CiAgICAgICAgMUYgKCRicHVIeiA9PSAnJykKICAgICAgICAgICAgJFJ0MW8tPlVwUlJ6NWggPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5VcFJSejVoID0gJGJwdUh6OwogICAgICAgIDV6Ukg1aCBSNUh6OwogICAgfQoKLy9JTi1Jdi1nSU1RIFlLIGIxZHRLcAogICAgRkhocVIxN2ggb3pSQ3BvUl9kcFJ6KCRicHVIeikgewogICAgICAgIDFGICgkYnB1SHogPT0gJycpCiAgICAgICAgICAgICRSdDFvLT51cG9SX2RwUnogPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT51cG9SX2RwUnogPSAkYnB1SHo7CiAgICAgICAgNXpSSDVoIFI1SHo7CiAgICB9CgovL0lOLUl2LWdJTVEgWUsgYjFkdEtwCiAgICBGSGhxUjE3aCBvelJKN3Ffb3pSXzFkbygkYnB1SHopIHsKICAgICAgICAxRiAoJGJwdUh6ID09ICcnKQogICAgICAgICAgICAkUnQxby0+ZDdxX296Ul8xZG8gPSAnJzsKICAgICAgICB6dW96CiAgICAgICAgICAgICRSdDFvLT5kN3Ffb3pSXzFkbyA9ICRicHVIejsKICAgICAgICA1elJINWggUjVIejsKICAgIH0KCiAgICAvL0hVZHBSemQgWUsgR3RIb3RZNzcgZ3YtTy1NQgogICAgRkhocVIxN2ggcGRkM3pVNzVSKCkgewogICAgICAgICRUSHo1SyA9ICJ4TGtjM1cgeExXeSAxaGR6MF9mcG9SejVfNXpVNzVSKCBocGZ6LDV6VTc1Ul9SS1V6LCBSNTFQUHo1X0YxenVkLCBVejUxN2QsIFV6NTE3ZF9kSDVwUjE3aCwgcXBSelA3NUtfMWQsIDFoZHowX2Zwb1J6NSwgMWhkejBfZnBvUno1X0YxenVkbywgMWhkejBfUDU3SFVfMWQsIDFoZHowX1A1N0hVX0YxenVkbywgcGRkemRfWUspICIKICAgICAgICAgICAgICAgIC4gIjJBQ3NjayAoOkxwZnosOjN6VTc1Ul9XS1V6LDpXNTFQUHo1X2oxenVkLDpFejUxN2QsOkV6NTE3ZEpINXBSMTdoLDo5cFJ6UDc1S3hkLDp4aGR6MF9acG9SejUsIDp4aGR6MF9acG9SejVfajF6dWRvLDp4aGR6MF9lNTdIVSwgOnhoZHowX2U1N0hVX2oxenVkbywgOnNvejVfeGQpIjsKLy8gICAgICAgIHpxdDcgInhMa2MzVyB4TFd5IDFoZHowX2Zwb1J6NV81elU3NVIoaHBmeiw1elU3NVJfUktVeiwgUjUxUFB6NV9GMXp1ZCwgVXo1MTdkLCBVejUxN2RfZEg1cFIxN2gsIHFwUnpQNzVLXzFkLCAxaGR6MF9mcG9SejUsIDFoZHowX2Zwb1J6NV9GMXp1ZG8sIDFoZHowX1A1N0hVXzFkLCAxaGR6MF9QNTdIVV9GMXp1ZG8sIHBkZHpkX1lLKSAiCi8vICAgICAgICAuICIyQUNzY2sgKCckUnQxby0+NXpVNzVSX2hwZnonLCAnJFJ0MW8tPjV6VTc1Ul9SS1V6JywgJyRSdDFvLT5SNTFQUHo1X0YxenVkJywnJFJ0MW8tPlV6NTE3ZCcsJyRSdDFvLT5xcFJ6UDc1SzFkJywgJyRSdDFvLT5VejUxN2RfZEg1cFIxN2gnLCckUnQxby0+MWhkejBfZnBvUno1JywnJFJ0MW8tPjFoZHowX2Zwb1J6NV9GMXp1ZG8nLCckUnQxby0+MWhkejBfUDU3SFUnLCckUnQxby0+MWhkejBfUDU3SFVfRjF6dWRvJywnJFJ0MW8tPkhvejUxZCcpIjsKLy8gICAgICAgIDFGICgkUnQxby0+cXBSelA3NUsxZCA9PSBoSHV1KSB7Ci8vICAgICAgICAgICAgenF0NyBNOwovLyAgICAgICAgfQovLyAgICAgICAgMUYgKCRSdDFvLT5xcFJ6UDc1SzFkID09ICcnKSB7Ci8vICAgICAgICAgICAgenF0NyBnOwovLyAgICAgICAgfQovLyAgICAgICAgZDF6OwoKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6THBmeicsICRSdDFvLT41elU3NVJfaHBmeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjN6VTc1Ul9XS1V6JywgJFJ0MW8tPjV6VTc1Ul9SS1V6LCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6VzUxUFB6NV9qMXp1ZCcsICRSdDFvLT5SNTFQUHo1X0YxenVkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6RXo1MTdkJywgJFJ0MW8tPlV6NTE3ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjlwUnpQNzVLeGQnLCAkUnQxby0+cXBSelA3NUsxZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkV6NTE3ZEpINXBSMTdoJywgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX1pwb1J6NScsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4aGR6MF9acG9SejVfajF6dWRvJywgJFJ0MW8tPjFoZHowX2Zwb1J6NV9GMXp1ZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4aGR6MF9lNTdIVScsICRSdDFvLT4xaGR6MF9QNTdIVSwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX2U1N0hVX2oxenVkbycsICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpzb3o1X3hkJywgJFJ0MW8tPkhvejUxZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICA1elJINWggJFJ0MW8tPmRZLT51cG9SeGhvejVSeGQoKTsKICAgIH0KCiAgICAvL0hVZHBSemQgWUsgR3RIb3RZNzcgZ3YtTy1NQiBNTi1JZy1nSU1RCiAgICBGSGhxUjE3aCBQelJacFJxdHpkM3pxNzVkbygpIHsKLy8gICAgICAgICRSdDFvLT5USHo1SyA9ICRSdDFvLT5kWS0+VEh6NUsoImtjQ2M5VyA5eXNMVygqKSAgajN5WiAxaGR6MF9mcG9SejVfNXpVNzVSIik7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigia2NDYzlXICogIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiAiCiAgICAgICAgICAgICAgICAuICIgbmxjM2MgNXpVNzVSX1JLVXo9OjN6VTc1Ul9XS1V6ICIKICAgICAgICAgICAgICAgIC4gIiBBTEogUjUxUFB6NV9GMXp1ZD06VzUxUFB6NV9qMXp1ZCAiCiAgICAgICAgICAgICAgICAuICIgQUxKIFV6NTE3ZD06RXo1MTdkICIKICAgICAgICAgICAgICAgIC4gIiBBTEogVXo1MTdkX2RINXBSMTdoPTpFejUxN2RKSDVwUjE3aCAiCiAgICAgICAgICAgICAgICAuICIgQUxKIDFoZHowX2Zwb1J6NT06eGhkejBfWnBvUno1IgogICAgICAgICAgICAgICAgLiAiIEFMSiAxaGR6MF9QNTdIVV8xZD06eGhkejBfZTU3SFUiCiAgICAgICAgICAgICAgICAuICIgQUxKIHBkZHpkX1lLPTpzb3o1X3hkIgogICAgICAgICAgICAgICAgLiAiIEFMSiBxcFJ6UDc1S18xZG89OjlwUnpQNzVLXzFkbyIpOwoKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjozelU3NVJfV0tVeiIsICRSdDFvLT41elU3NVJfUktVeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOlc1MVBQejVfajF6dWQiLCAkUnQxby0+UjUxUFB6NV9GMXp1ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkV6NTE3ZCIsICRSdDFvLT5VejUxN2QsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpFejUxN2RKSDVwUjE3aCcsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4aGR6MF9acG9SejUnLCAkUnQxby0+MWhkejBfZnBvUno1LCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6eGhkejBfZTU3SFUnLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpzb3o1X3hkJywgJFJ0MW8tPkhvejUxZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjlwUnpQNzVLXzFkbycsICRSdDFvLT5xcFJ6UDc1S18xZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSWnBScXR6ZGNkMVIzenE3NWRvKCkgewovLyAgICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1Sygia2NDYzlXIDl5c0xXKCopICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIiKTsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCJrY0NjOVcgKiAgajN5WiAxaGR6MF9mcG9SejVfNXpVNzVSICIKICAgICAgICAgICAgICAgIC4gIiBubGMzYyA1elU3NVJfUktVej06M3pVNzVSX1dLVXogIgogICAgICAgICAgICAgICAgLiAiIEFMSiBSNTFQUHo1X0YxenVkPTpXNTFQUHo1X2oxenVkICIKICAgICAgICAgICAgICAgIC4gIiBBTEogVXo1MTdkPTpFejUxN2QgIgogICAgICAgICAgICAgICAgLiAiIEFMSiBVejUxN2RfZEg1cFIxN2g9OkV6NTE3ZEpINXBSMTdoICIKICAgICAgICAgICAgICAgIC4gIiBBTEogMWhkejBfZnBvUno1PTp4aGR6MF9acG9SejUiCiAgICAgICAgICAgICAgICAuICIgQUxKIDFoZHowX1A1N0hVXzFkPTp4aGR6MF9lNTdIVSBBTEogMWQ8Pjp4SiIpOwoKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjozelU3NVJfV0tVeiIsICRSdDFvLT41elU3NVJfUktVeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOlc1MVBQejVfajF6dWQiLCAkUnQxby0+UjUxUFB6NV9GMXp1ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkV6NTE3ZCIsICRSdDFvLT5VejUxN2QsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpFejUxN2RKSDVwUjE3aCcsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4aGR6MF9acG9SejUnLCAkUnQxby0+MWhkejBfZnBvUno1LCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6eGhkejBfZTU3SFUnLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4SicsICRSdDFvLT4xZCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelIzelU3NVJfZHBScFdwWXV6KCRwOTd1SGZobywgJDFoZHowX2Zwb1J6NV8xZCwgJG9udHo1eiwgJG95NWR6NSwgJG9DMWYxUikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCA1LjFkIGR6b3EiOwogICAgICAgIH0KCiAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwoKICAgICAgICAxRiAoJHUxZjFSWHpSd3p6aFtJXSA9PSAkdTFmMVJYelJ3enpoW01dKSB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbSV0gPSAkdTFmMVJYelJ3enpoW01dOwogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0KICAgICAgICAkYnB1SHpfNXogPSByNzFoKCcsJywgJGJwdUh6KTsKICAgICAgICAvLyRicHVIel81eiA9ICRicHVIejsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwoKICAgICAgICAkVEh6NUsgPSAib3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAkVEh6NUsuPSJrY0NjOVcgIEp4a1d4TDlXICIgLiAkcDk3dUhmaG9fNXogLiAiLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgNSAgcjcxaCAxaGR6MF9mcG9SejVfNXpVNzVSX1JLVXogNVIgeUwgNS41elU3NVJfUktVej01Ui4xZCIKICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxaGR6MF9mcG9SejU9JyQxaGR6MF9mcG9SejVfMWQnIEFMSiBxcFJ6UDc1S18xZD0nSScgJG9udHo1eiAgKVJ6ZlVNIHd0ejV6IFJ6ZlVNLjU3dz4gJHUxZjFSWHpSd3p6aFtJXSBwaGQgUnpmVU0uNTd3PD0kdTFmMVJYelJ3enpoW01dICIgLiBvUjVfNXpVdXBxeignNScsICdSemZVTScsICRveTVkejUpOwoKICAgICAgICAkUnQxby0+VEh6NUsgPSAkUnQxby0+ZFktPlRIejVLKCRUSHo1Syk7CgoKCgogICAgICAgIC8vICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1Sygia2NDYzlXIGttQ185QUM5X2p5c0xKXzN5bmsgIiAuICRwOTd1SGZob181eiAuICIgIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiA1ICByNzFoIDFoZHowX2Zwb1J6NV81elU3NVJfUktVeiA1UiB5TCA1LjV6VTc1Ul9SS1V6PTVSLjFkIG5sYzNjIDFoZHowX2Zwb1J6NT0nJDFoZHowX2Zwb1J6NV8xZCcgJG9udHo1eiAkb3k1ZHo1ICRvQzFmMVIiKTsKLy8gICAgICAgIHpxdDcgImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXogLiAiICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgbmxjM2MgMWhkejBfZnBvUno1PSckMWhkejBfZnBvUno1XzFkJyAkb250ejV6ICRveTVkejUgJG9DMWYxUiI7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5USHo1Sy0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelIzelU3NVJfZHBScFdwWXV6X3B1dSgkcDk3dUhmaG8sICQxaGR6MF9mcG9SejVfMWQsICRvbnR6NXosICRveTVkejUsICRvQzFmMVIpIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgNS4xZCBkem9xIjsKICAgICAgICB9CgogICAgICAgICRvQzFmMVIgPSBvUjVfNXpVdXBxeihwNTVwSygidTFmMVIiLCAiQ3haeFciLCAiQzFmMVIiKSwgIiIsICRvQzFmMVIpOwogICAgICAgICR1MWYxUlh6Und6emggPSB6MFV1N2R6KCIsIiwgUjUxZihvUjVfNXpVdXBxeigidTFmMVIiLCAiIiwgJG9DMWYxUikpKTsKCiAgICAgICAgMUYgKCR1MWYxUlh6Und6emhbSV0gPT0gJHUxZjFSWHpSd3p6aFtNXSkgewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW0ldID0gJHUxZjFSWHpSd3p6aFtNXTsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9CiAgICAgICAgJGJwdUh6XzV6ID0gcjcxaCgnLCcsICRicHVIeik7CiAgICAgICAgLy8kYnB1SHpfNXogPSAkYnB1SHo7CiAgICAgICAgJHA5N3VIZmhvXzV6ID0gb1I1XzV6VXVwcXooIiAsICIsICIgIiwgMWZVdTdkeigiLCAiLCAkcDk3dUhmaG8pKTsKCiAgICAgICAgJFRIejVLID0gIm96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gJHA5N3VIZmhvXzV6IC4gIiwgM3luX0xzWlhjMygpIHkyYzMoJG95NWR6NSlBayA1N3cgajN5WiAxaGR6MF9mcG9SejVfNXpVNzVSIDUgIHI3MWggMWhkejBfZnBvUno1XzV6VTc1Ul9SS1V6IDVSIHlMIDUuNXpVNzVSX1JLVXo9NVIuMWQiCiAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWhkejBfZnBvUno1PSckMWhkejBfZnBvUno1XzFkJyBBTEogcXBSelA3NUtfMWQ9J0knICRvbnR6NXogIClSemZVTSI7Ci8venF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1SygkVEh6NUspOwoKCgoKICAgICAgICAvLyAgICAgICRSdDFvLT5USHo1SyA9ICRSdDFvLT5kWS0+VEh6NUsoImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXogLiAiICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgNSAgcjcxaCAxaGR6MF9mcG9SejVfNXpVNzVSX1JLVXogNVIgeUwgNS41elU3NVJfUktVej01Ui4xZCBubGMzYyAxaGR6MF9mcG9SejU9JyQxaGR6MF9mcG9SejVfMWQnICRvbnR6NXogJG95NWR6NSAkb0MxZjFSIik7Ci8vICAgICAgICB6cXQ3ICJrY0NjOVcga21DXzlBQzlfanlzTEpfM3luayAiIC4gJHA5N3VIZmhvXzV6IC4gIiAgajN5WiAxaGR6MF9mcG9SejVfNXpVNzVSIG5sYzNjIDFoZHowX2Zwb1J6NT0nJDFoZHowX2Zwb1J6NV8xZCcgJG9udHo1eiAkb3k1ZHo1ICRvQzFmMVIiOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+VEh6NUstPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSM3pVNzVSX2RwUnBXcFl1el9wdXVfN1VSMWYxOHo1KCRwOTd1SGZobywgJDFoZHowX2Zwb1J6NV8xZCwgJG9udHo1eiwgJG95NWR6NSwgJG9DMWYxUikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCA1LjFkIGR6b3EiOwogICAgICAgIH0KCiAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwoKICAgICAgICAxRiAoJHUxZjFSWHpSd3p6aFtJXSA9PSAkdTFmMVJYelJ3enpoW01dKSB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbSV0gPSAkdTFmMVJYelJ3enpoW01dOwogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0KICAgICAgICAkYnB1SHpfNXogPSByNzFoKCcsJywgJGJwdUh6KTsKICAgICAgICAvLyRicHVIel81eiA9ICRicHVIejsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwoKICAgICAgICAvLyAgJFRIejVLID0gIm96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgJFRIejVLLj0ia2NDYzlXIHE3SGhSX1kxUCg1LjFkKSBwbyBxN0hoUl9NIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiA1ICByNzFoIDFoZHowX2Zwb1J6NV81elU3NVJfUktVeiA1UiB5TCA1LjV6VTc1Ul9SS1V6PTVSLjFkIgogICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFoZHowX2Zwb1J6NT0nJDFoZHowX2Zwb1J6NV8xZCcgQUxKIHFwUnpQNzVLXzFkPSdJJyAkb250ejV6IjsKLy96cXQ3ICRUSHo1SzsKICAgICAgICAkUnQxby0+VEh6NUsgPSAkUnQxby0+ZFktPlRIejVLKCRUSHo1Syk7CgoKCgogICAgICAgIC8vICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1Sygia2NDYzlXIGttQ185QUM5X2p5c0xKXzN5bmsgIiAuICRwOTd1SGZob181eiAuICIgIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiA1ICByNzFoIDFoZHowX2Zwb1J6NV81elU3NVJfUktVeiA1UiB5TCA1LjV6VTc1Ul9SS1V6PTVSLjFkIG5sYzNjIDFoZHowX2Zwb1J6NT0nJDFoZHowX2Zwb1J6NV8xZCcgJG9udHo1eiAkb3k1ZHo1ICRvQzFmMVIiKTsKLy8gICAgICAgIHpxdDcgImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXogLiAiICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgbmxjM2MgMWhkejBfZnBvUno1PSckMWhkejBfZnBvUno1XzFkJyAkb250ejV6ICRveTVkejUgJG9DMWYxUiI7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5USHo1Sy0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelIzelU3NVIoKSB7CiAgICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1Sygia2NDYzlXICogIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiIpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+VEh6NUstPkZ6UnF0QXV1KEVKeTo6amNXOWxfQWtreTkpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKICAgIEZIaHFSMTdoIFB6UjN6VTc1UlhLeGQoKSB7CiAgICAgICAgLy8genF0NyAia2NDYzlXICogajN5WiAxaGR6MF9mcG9SejVfNXpVNzVSIG5sYzNjIDFkPSckUnQxby0+MWQnIjsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCJrY0NjOVcgKiBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgbmxjM2MgMWQ9OnhKIik7Ci8venF0NyAia2NDYzlXICogajN5WiAxaGR6MF9mcG9SejVfNXpVNzVSIG5sYzNjIDFkPSRSdDFvLT4xZCI7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eEoiLCAkUnQxby0+MWQsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggemQxUjN6VTc1UigpIHsKCiAgICAgICAgJFV6NSA9IG9SNV81elV1cHF6KCciJywgJycsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gpOwoKICAgICAgICAkVEh6NUsgPSAic0VKQVdjIDFoZHowX2Zwb1J6NV81elU3NVIgIgogICAgICAgICAgICAgICAgLiAiIGtjVyBocGZ6PSckUnQxby0+NXpVNzVSX2hwZnonLCA1elU3NVJfUktVej0nJFJ0MW8tPjV6VTc1Ul9SS1V6JyxSNTFQUHo1X0YxenVkPSckUnQxby0+UjUxUFB6NV9GMXp1ZCcsICIKICAgICAgICAgICAgICAgIC4gIiBVejUxN2Q9JyRSdDFvLT5VejUxN2QnLCBVejUxN2RfZEg1cFIxN2g9JyRVejUnLCAiCiAgICAgICAgICAgICAgICAuICIgMWhkejBfZnBvUno1PSckUnQxby0+MWhkejBfZnBvUno1JywgIDFoZHowX2Zwb1J6NV9GMXp1ZG89JyRSdDFvLT4xaGR6MF9mcG9SejVfRjF6dWRvJywgMWhkejBfUDU3SFVfMWQ9JyRSdDFvLT4xaGR6MF9QNTdIVScsIDFoZHowX1A1N0hVX0YxenVkbz0nJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbycsICIKICAgICAgICAgICAgICAgIC4gIiBIVWRwUnpkX2RwUnpSMWZ6PVB6UmRwUnooKSAiCiAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWQ9JyAkUnQxby0+MWQnIjsKICAgICAgICAvL3pxdDcgJFRIejVLOwogICAgICAgIC8vZDF6OwovLyAgICAgICAgenF0NyAieExrYzNXIHhMV3kgMWhkejBfZnBvUno1XzV6VTc1UiggaHBmeiw1elU3NVJfUktVeiwgUjUxUFB6NV9GMXp1ZCwgVXo1MTdkLCBVejUxN2RfZEg1cFIxN2gsIDFoZHowX2Zwb1J6NSkgIgovLyAgICAgICAgLiAiMkFDc2NrICgkUnQxby0+NXpVNzVSX2hwZnosICRSdDFvLT41elU3NVJfUktVeiwgJFJ0MW8tPlI1MVBQejVfRjF6dWQsJFJ0MW8tPlV6NTE3ZCwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwkUnQxby0+MWhkejBfZnBvUno1KSI7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkxwZnonLCAkUnQxby0+NXpVNzVSX2hwZnosIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAvLyAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzozelU3NVJfV0tVeicsICRSdDFvLT41elU3NVJfUktVeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6VzUxUFB6NV9qMXp1ZCcsICRSdDFvLT5SNTFQUHo1X0YxenVkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpFejUxN2QnLCAkUnQxby0+VXo1MTdkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpFejUxN2RKSDVwUjE3aCcsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX1pwb1J6NScsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX1pwb1J6NV9qMXp1ZG8nLCAkUnQxby0+MWhkejBfZnBvUno1X0YxenVkbywgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6eGhkejBfZTU3SFUnLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX2U1N0hVX2oxenVkbycsICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhKJywgJFJ0MW8tPjFkLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgNXpSSDVoICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgIH0KCiAgICBGSGhxUjE3aCBKenV6UnozelU3NVIoKSB7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigiSmNDY1djIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiBubGMzYyAxZD06eEoiKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4SiIsICRSdDFvLT4xZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICB9CgogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJBZGR6ZF8zenE3NWRvX1lLeGQoJGQ3cV8xZCkgewoKICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIkpwS28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZHBLIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIm56ekdvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIm56ekciOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiWjdoUnRvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImY3aFJ0IjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIjR6cDVvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIkt6cDUiOwogICAgICAgIH0KICAgICAgICAkVXo1MTdkX2RINXBSMTdoID0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aDsKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAibnp6RyIpIHsKCiAgICAgICAgICAgICRoendfZHBSejsKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIk0iKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiUSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImciKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiTXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJpIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAidiIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUSHo1SyA9ICJrY0NjOVcgVS4xZCxVLmQ3cV8xZCxVLlIxUnV6LCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCwgVS4xZCBwbyBkN3FfMVBfMWQsVS51N1BfZHBSelIxZnoiCiAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKFUuMWhkejBfZnBvUno1XzFkLCcsJykgcjcxaCAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvICBwbyAxZl9icHVIem8gcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQKDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCcsJykgIHlMIDFSemZNIDFoKDFSemYpICByNzFoIGQ3cV8xaGR6MF9icHVIem8gZDEgcTU3b28gcFVVdUsgZFk3LmtVdTFSa1I1MWhQaShkMS5kN3FfMWQsJywnKSB5TCAoZDEuMWhkejBfUDU3SFVfMWQ9JyAkUnQxby0+MWhkejBfUDU3SFUnKSAiCiAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIFUudTdQX2RwUnpSMWZ6IFl6Und6emggcXBvUihQelJkcFJ6KCkgLSAkaHp3X2RwUnogcG8gZHBSeikgcGhkIFB6UmRwUnooKSAiCi8vICAgICAgICAgICAgICAgIC4gIiBBTEogVS51N1BfZHBSelIxZnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogVS4xZD0kZDdxXzFkICBlM3lzRSBYNCBVLjFkLFUuZDdxXzFkLFUuUjFSdXosIDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCBVLjFkLFUudTdQX2RwUnpSMWZ6IHkzSmMzIFg0IFUudTdQX2RwUnpSMWZ6IEFrOSI7CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJFRIejVLID0gImtjQ2M5VyBVLjFkLFUuZDdxXzFkLFUuUjFSdXosIDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCBVLjFkIHBvIGQ3cV8xUF8xZCxVLnU3UF9kcFJ6UjFmeiIKICAgICAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSbyBwbyBVIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oVS4xaGR6MF9mcG9SejVfMWQsJywnKSByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvICBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFAoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSAgeUwgMVJ6Zk0gMWgoMVJ6ZikgIHI3MWggZDdxXzFoZHowX2JwdUh6byBkMSBxNTdvbyBwVVV1SyBkWTcua1V1MVJrUjUxaFBpKGQxLmQ3cV8xZCwnLCcpIHlMIChkMS4xaGR6MF9QNTdIVV8xZD0gJyRSdDFvLT4xaGR6MF9QNTdIVScpICIKICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIgogICAgICAgICAgICAgICAgICAgIC4gIiAgQUxKIFUudTdQX2RwUnpSMWZ6IFl6Und6emggSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSkgcGhkIEpBV2NBSkooJFV6NTE3ZCxJLGVjV0pBV2MoKSkiCi8vICAgICAgICAgICAgICAgIC4gIiBBTEogVS51N1BfZHBSelIxZnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogVS4xZD0kZDdxXzFkICBlM3lzRSBYNCBVLjFkLFUuZDdxXzFkLFUuUjFSdXosIDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCBVLjFkLFUudTdQX2RwUnpSMWZ6IHkzSmMzIFg0IFUudTdQX2RwUnpSMWZ6IEFrOSI7CiAgICAgICAgfQogICAgICAgIC8venF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfWkFrV2MzX3hKIiwgJFJ0MW8tPjFoZHowX2Zwb1J6NSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6SnMzQVd4eUwiLCAkUnQxby0+VXo1MTdkX2RINXBSMTdoLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl94SiIsICRSdDFvLT4xaGR6MF9QNTdIVSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJKN3FIZnpoUkFkZHpkXzN6cTc1ZG9fSnBScFdwWXV6KCRwOTd1SGZobywgJHFIb1I3Zl9USHo1SywgJG9udHo1eiwgJG95NWR6NSwgJG9DMWYxUikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CgogICAgICAgIC8vICB6cXQ3ICRwOTd1SGZob181ejsKICAgICAgICAvL2QxejsKICAgICAgICAxRiAoUjUxZigkb3k1ZHo1KSA9PSAnJykgewogICAgICAgICAgICAkb3k1ZHo1ID0gInkzSmMzIFg0IFUudTdQX2RwUnpSMWZ6IGR6b3EiOwogICAgICAgIH0KCiAgICAgICAgJFV6NTE3ZCA9ICRSdDFvLT5VejUxN2Q7CgogICAgICAgIDFGICgkVXo1MTdkID09ICJKcEtvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImRwSyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJuenpHbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJuenpHIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIlo3aFJ0byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJmN2hSdCI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICI0enA1byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJLenA1IjsKICAgICAgICB9CiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7CiAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwoKICAgICAgICAxRiAoJHUxZjFSWHpSd3p6aFtJXSA9PSAkdTFmMVJYelJ3enpoW01dKSB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbSV0gPSAkdTFmMVJYelJ3enpoW01dOwogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0KICAgICAgICAkYnB1SHpfNXogPSByNzFoKCcsJywgJGJwdUh6KTsKICAgICAgICAvLyRicHVIel81eiA9ICRicHVIejsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGICgkVXo1MTdkID09ICJuenpHIikgewogICAgICAgICAgICAkaHp3X2RwUno7CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJNIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gIlEiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJnIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gIk12IjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiaSIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gInYiKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiZ08iOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgIEp4a1d4TDlXICIgLiAkcDk3dUhmaG9fNXogLiAiLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyBBTEogcXBvUihVLnU3UF9kcFJ6UjFmeiBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoUHpSZHBSeigpIC0gJGh6d19kcFJ6IHBvIGRwUnopIHBoZCBxcG9SKFB6UmRwUnooKSBwbyBkcFJ6KSIKICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIFA1N0hVIFlLIFUuMWQsVS5SMVJ1eixVLnU3UF9kcFJ6UjFmeixVLmQ3cV8xZCxkb2IuZDU3VWQ3d2hfaHBmeiAgKVJ6ZlVNIHd0ejV6IFJ6ZlVNLjU3dz4gJHUxZjFSWHpSd3p6aFtJXSBwaGQgUnpmVU0uNTd3PD0kdTFmMVJYelJ3enpoW01dICIgLiBvUjVfNXpVdXBxeignVScsICdSemZVTScsICRveTVkejUpOwogICAgICAgICAgICAvLyAgenF0NyAkVEh6NUs7CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIkkiKSB7CgoKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuICRwOTd1SGZob181eiAuICIsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3IEY1N2YgIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyAgQUxKIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFUudTdQX2RwUnpSMWZ6LE1JaSkgPSBxN2hiejVSKGJwNXF0cDUoTUlJKSxKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9udHo1eiAuICIgUDU3SFUgWUsgVS4xZCxVLlIxUnV6LFUudTdQX2RwUnpSMWZ6LFUuZDdxXzFkLGRvYi5kNTdVZDd3aF9ocGZ6IClSemZVTSB3dHo1eiBSemZVTS41N3c+ICR1MWYxUlh6Und6emhbSV0gcGhkIFJ6ZlVNLjU3dzw9JHUxZjFSWHpSd3p6aFtNXSAiIC4gb1I1XzV6VXVwcXooJ1UnLCAnUnpmVU0nLCAkb3k1ZHo1KTsKICAgICAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuICRwOTd1SGZob181eiAuICIsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3IEY1N2YgIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgIEFMSiBVLm9ScFJIbz0nQVVVNTdiemQnICBBTEogcXBvUihVLnU3UF9kcFJ6UjFmeiBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSkgcG8gZHBSeikgcGhkIHFwb1IoSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSBwbyBkcFJ6KSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLjFkLFUuUjFSdXosVS51N1BfZHBSelIxZnogLFUuZDdxXzFkLGRvYi5kNTdVZDd3aF9ocGZ6ICApUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCdVJywgJ1J6ZlVNJywgJG95NWR6NSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgovLyAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWhkejBfZnBvUno1PSckMWhkejBfZnBvUno1XzFkJyAkb250ejV6ICApUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCc1JywgJ1J6ZlVNJywgJG95NWR6NSk7CiAgICAgICAgLy8kUnQxby0+VEh6NUsgPSAkUnQxby0+ZFktPlRIejVLKCRUSHo1Syk7CiAgICAgICAgLy8genF0NyAkVEh6NUs7CiAgICAgICAgLy8gICAgICAgJFRIejVLID0gImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXoKICAgICAgICAvLyAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSbyBwbyBVIHI3MWggYDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem9gIHBvIDFmX2JwdUh6byB5TCBGMWhkXzFoX296UigxZl9icHVIem8uNXpxNzVkX296Ul8xZCxVLjFoZHowX2Zwb1J6NV8xZCkgIHI3MWggZDdxXzFoZHowX2JwdUh6byBkMSB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD06eExKYzZfeEopICIKICAgICAgICAvLyAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9OnhMSmM2X1pBa1djM194SiAiIC4gJG9udHo1egogICAgICAgIC8vICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLnU3UF9kcFJ6UjFmeiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpIEFMSiA5czMzY0xXX0pBV2MgICIKICAgICAgICAvLyAgICAgICAuICIgZTN5c0UgWDQgVS4xZCAiCiAgICAgICAgLy8gICAgIC4gJyAnIC4gJG95NWR6NSAuICcgJyAuICRvQzFmMVI7Ci8vICAgICAgIAovLyAgICAgICAgenF0NyAia2NDYzlXIGttQ185QUM5X2p5c0xKXzN5bmsgIiAuICRwOTd1SGZob181eiAgCi8vICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgcjcxaCBgMWhkejBfZnBvUno1X0YxenVkX2JwdUh6b2AgcG8gMWZfYnB1SHpvIHlMIEYxaGRfMWhfb3pSKDFmX2JwdUh6by41enE3NWRfb3pSXzFkLFUuMWhkejBfZnBvUno1XzFkKSByNzFoIGQ3cV8xaGR6MF9QNTdVSCBkMSB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xZD0kUnQxby0+MWhkejBfUDU3SFUpICIKLy8gICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JFJ0MW8tPjFoZHowX2Zwb1J6NSAiLiRvbnR6NXoKLy8gICAgICAgICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLnU3UF9kcFJ6UjFmeiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC0kUnQxby0+VXo1MTdkX2RINXBSMTdoICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCi8vICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLjFkICIKLy8gICAgICAgICAgICAgICAgLiAnICcuJG95NWR6NS4nICcuJG9DMWYxUjsKICAgICAgICAvL3pxdDcgJFRIejVLOwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X1pBa1djM194SiIsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl94SiIsICRSdDFvLT4xaGR6MF9QNTdIVSwgRUp5OjpFQTNBWl94TFcpOwoKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJBZGR6ZF8zenE3NWRvX0pwUnBXcFl1el9wdXUoJHA5N3VIZmhvLCAkcUhvUjdmX1RIejVLLCAkb250ejV6LCAkb3k1ZHo1LCAkb0MxZjFSKSB7CiAgICAgICAgJHA5N3VIZmhvXzV6ID0gb1I1XzV6VXVwcXooIiAsICIsICIgIiwgMWZVdTdkeigiLCAiLCAkcDk3dUhmaG8pKTsKICAgICAgICAxRiAoUjUxZigkb3k1ZHo1KSA9PSAnJykgewogICAgICAgICAgICAkb3k1ZHo1ID0gInkzSmMzIFg0IFUudTdQX2RwUnpSMWZ6IGR6b3EiOwogICAgICAgIH0KICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKICAgICAgICAkVXo1MTdkX2RINXBSMTdoID0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aDsKCiAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwoKICAgICAgICAxRiAoJHUxZjFSWHpSd3p6aFtJXSA9PSAkdTFmMVJYelJ3enpoW01dKSB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbSV0gPSAkdTFmMVJYelJ3enpoW01dOwogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0KCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIkpwS28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZHBLIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIm56ekdvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIm56ekciOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiWjdoUnRvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImY3aFJ0IjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIjR6cDVvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIkt6cDUiOwogICAgICAgIH0KICAgICAgICAkYnB1SHpfNXogPSByNzFoKCcsJywgJGJwdUh6KTsKICAgICAgICAvLyRicHVIel81eiA9ICRicHVIejsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGICgkVXo1MTdkID09ICJuenpHIikgewoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIk0iKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiUSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImciKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiTXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJpIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAidiIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gJHA5N3VIZmhvXzV6IC4gIiwgM3luX0xzWlhjMygpIHkyYzMoJG95NWR6NSlBayA1N3cgRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIFUub1JwUkhvPSdBVVU1N2J6ZCcgQUxKIHFwb1IoVS51N1BfZHBSelIxZnogcG8gZHBSeikgWXpSd3p6aCBxcG9SKFB6UmRwUnooKSAtICRoendfZHBSeiBwbyBkcFJ6KSBwaGQgcXBvUihQelJkcFJ6KCkgcG8gZHBSeikiCiAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLjFkLFUuUjFSdXosVS51N1BfZHBSelIxZnogICApUnpmVU0iOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJJIikgewogICAgICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gJHA5N3VIZmhvXzV6IC4gIiwgM3luX0xzWlhjMygpIHkyYzMoJG95NWR6NSlBayA1N3cgRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyAgQUxKICBxN2hiejVSKGJwNXF0cDUoTUlJKSxVLnU3UF9kcFJ6UjFmeixNSWkpID0gcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIFA1N0hVIFlLIFUuMWQsVS5SMVJ1eixVLnU3UF9kcFJ6UjFmeiAsVS5kN3FfMWQgKVJ6ZlVNIjsKICAgICAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuICRwOTd1SGZob181eiAuICIsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3IEY1N2YgIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKIFUub1JwUkhvPSdBVVU1N2J6ZCcgIEFMSiAgcXBvUihVLnU3UF9kcFJ6UjFmeiBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSkgcG8gZHBSeikgcGhkIHFwb1IoSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSBwbyBkcFJ6KSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLjFkLFUuUjFSdXosVS51N1BfZHBSelIxZnogLFUuZDdxXzFkIClSemZVTSI7CiAgICAgICAgICAgIH0KICAgICAgICB9Ci8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxaGR6MF9mcG9SejU9JyQxaGR6MF9mcG9SejVfMWQnICRvbnR6NXogIClSemZVTSB3dHo1eiBSemZVTS41N3c+ICR1MWYxUlh6Und6emhbSV0gcGhkIFJ6ZlVNLjU3dzw9JHUxZjFSWHpSd3p6aFtNXSAiIC4gb1I1XzV6VXVwcXooJzUnLCAnUnpmVU0nLCAkb3k1ZHo1KTsKICAgICAgICAvLyRSdDFvLT5USHo1SyA9ICRSdDFvLT5kWS0+VEh6NUsoJFRIejVLKTsKICAgICAgICAvL3pxdDcgJFRIejVLOwogICAgICAgIC8vICAgICAgICRUSHo1SyA9ICJrY0NjOVcga21DXzlBQzlfanlzTEpfM3luayAiIC4gJHA5N3VIZmhvXzV6CiAgICAgICAgLy8gICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSByNzFoIGAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvYCBwbyAxZl9icHVIem8geUwgRjFoZF8xaF9velIoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsVS4xaGR6MF9mcG9SejVfMWQpICByNzFoIGQ3cV8xaGR6MF9icHVIem8gZDEgeUwgKEYxaGRfMWhfb3pSKFUuMWQsZDEuZDdxXzFkKSBBTEogZDEuMWhkejBfUDU3SFVfMWQ9OnhMSmM2X3hKKSAiCiAgICAgICAgLy8gICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPTp4TEpjNl9aQWtXYzNfeEogIiAuICRvbnR6NXoKICAgICAgICAvLyAgICAgICAgIC4gIiBBTEogSnBSel9qNzVmcFIoVS51N1BfZHBSelIxZnosJyU0LSVmLSVkJykgWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCiAgICAgICAgLy8gICAgICAgLiAiIGUzeXNFIFg0IFUuMWQgIgogICAgICAgIC8vICAgICAuICcgJyAuICRveTVkejUgLiAnICcgLiAkb0MxZjFSOwovLyAgICAgICAKLy8gICAgICAgIHpxdDcgImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXogIAovLyAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSbyBwbyBVIHI3MWggYDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem9gIHBvIDFmX2JwdUh6byB5TCBGMWhkXzFoX296UigxZl9icHVIem8uNXpxNzVkX296Ul8xZCxVLjFoZHowX2Zwb1J6NV8xZCkgcjcxaCBkN3FfMWhkejBfUDU3VUggZDEgeUwgKEYxaGRfMWhfb3pSKFUuMWQsZDEuZDdxXzFkKSBBTEogZDEuMWQ9JFJ0MW8tPjFoZHowX1A1N0hVKSAiCi8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSRSdDFvLT4xaGR6MF9mcG9SejUgIi4kb250ejV6Ci8vICAgICAgICAgICAgICAgIC4gIiBBTEogSnBSel9qNzVmcFIoVS51N1BfZHBSelIxZnosJyU0LSVmLSVkJykgWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgovLyAgICAgICAgICAgICAgICAuICIgZTN5c0UgWDQgVS4xZCAiCi8vICAgICAgICAgICAgICAgIC4gJyAnLiRveTVkejUuJyAnLiRvQzFmMVI7CiAgICAgICAgLy8genF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfWkFrV2MzX3hKIiwgJFJ0MW8tPjFoZHowX2Zwb1J6NSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6SnMzQVd4eUwiLCAkUnQxby0+VXo1MTdkX2RINXBSMTdoLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8gICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X3hKIiwgJFJ0MW8tPjFoZHowX1A1N0hVLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKICAgIEZIaHFSMTdoIFB6Uko3cUhmemhSQWRkemRfM3pxNzVkb19KcFJwV3BZdXpfcHV1XzdVUjFmMTh6NSgkcDk3dUhmaG8sICRxSG9SN2ZfVEh6NUssICRvbnR6NXosICRveTVkejUsICRvQzFmMVIpIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgVS51N1BfZHBSelIxZnogZHpvcSI7CiAgICAgICAgfQogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwogICAgICAgICRVejUxN2RfZEg1cFIxN2ggPSAkUnQxby0+VXo1MTdkX2RINXBSMTdoOwoKICAgICAgICAkb0MxZjFSID0gb1I1XzV6VXVwcXoocDU1cEsoInUxZjFSIiwgIkN4WnhXIiwgIkMxZjFSIiksICIiLCAkb0MxZjFSKTsKICAgICAgICAkdTFmMVJYelJ3enpoID0gejBVdTdkeigiLCIsIFI1MWYob1I1XzV6VXVwcXooInUxZjFSIiwgIiIsICRvQzFmMVIpKSk7CgogICAgICAgIDFGICgkdTFmMVJYelJ3enpoW0ldID09ICR1MWYxUlh6Und6emhbTV0pIHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtJXSA9ICR1MWYxUlh6Und6emhbTV07CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfQoKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAiSnBLbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJkcEsiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAibnp6R28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAibnp6RyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJaN2hSdG8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZjdoUnQiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiNHpwNW8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiS3pwNSI7CiAgICAgICAgfQogICAgICAgICRicHVIel81eiA9IHI3MWgoJywnLCAkYnB1SHopOwogICAgICAgIC8vJGJwdUh6XzV6ID0gJGJwdUh6OwogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKCRVejUxN2QgPT0gIm56ekciKSB7CgogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiTSIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJRIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiZyIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJNdiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImkiKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiZ00iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJ2IikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdPIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiBSemZVTS5xN0hoUl9NIEY1N2YgKCI7CiAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgcTdIaFJfWTFQKGQxb1IxaHFSIFUuMWQpIHBvIHE3SGhSX00gRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIFUub1JwUkhvPSdBVVU1N2J6ZCcgQUxKIHFwb1IoVS51N1BfZHBSelIxZnogcG8gZHBSeikgWXpSd3p6aCBxcG9SKFB6UmRwUnooKSAtICRoendfZHBSeiBwbyBkcFJ6KSBwaGQgcXBvUihQelJkcFJ6KCkgcG8gZHBSeikiCiAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiAgKVJ6ZlVNIjsKICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiSSIpIHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIFJ6ZlVNLnE3SGhSX00gRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyBxN0hoUl9ZMVAoZDFvUjFocVIgVS4xZCkgcG8gcTdIaFJfTSBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBVLm9ScFJIbz0nQVVVNTdiemQnICBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFUudTdQX2RwUnpSMWZ6LE1JaSkgPSBxN2hiejVSKGJwNXF0cDUoTUlJKSxKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9udHo1eiAuICIgKVJ6ZlVNIjsKICAgICAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIFJ6ZlVNLnE3SGhSX00gRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgcTdIaFJfWTFQKGQxb1IxaHFSIFUuMWQpIHBvIHE3SGhSX00gRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyAgQUxKIHFwb1IoVS51N1BfZHBSelIxZnogcG8gZHBSeikgWXpSd3p6aCBxcG9SKEpBV2NBSkooJFV6NTE3ZCwtJFV6NTE3ZF9kSDVwUjE3aCxlY1dKQVdjKCkpIHBvIGRwUnopIHBoZCBxcG9SKEpBV2NBSkooJFV6NTE3ZCxJLGVjV0pBV2MoKSkgcG8gZHBSeikiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9udHo1eiAuICIgKVJ6ZlVNIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy96cXQ3ICRUSHo1SzsKLy8gICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFoZHowX2Zwb1J6NT0nJDFoZHowX2Zwb1J6NV8xZCcgJG9udHo1eiAgKVJ6ZlVNIHd0ejV6IFJ6ZlVNLjU3dz4gJHUxZjFSWHpSd3p6aFtJXSBwaGQgUnpmVU0uNTd3PD0kdTFmMVJYelJ3enpoW01dICIgLiBvUjVfNXpVdXBxeignNScsICdSemZVTScsICRveTVkejUpOwogICAgICAgIC8vJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1SygkVEh6NUspOwogICAgICAgIC8venF0NyAkVEh6NUs7CiAgICAgICAgLy8gICAgICAgJFRIejVLID0gImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXoKICAgICAgICAvLyAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSbyBwbyBVIHI3MWggYDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem9gIHBvIDFmX2JwdUh6byB5TCBGMWhkXzFoX296UigxZl9icHVIem8uNXpxNzVkX296Ul8xZCxVLjFoZHowX2Zwb1J6NV8xZCkgIHI3MWggZDdxXzFoZHowX2JwdUh6byBkMSB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD06eExKYzZfeEopICIKICAgICAgICAvLyAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9OnhMSmM2X1pBa1djM194SiAiIC4gJG9udHo1egogICAgICAgIC8vICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLnU3UF9kcFJ6UjFmeiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpIEFMSiA5czMzY0xXX0pBV2MgICIKICAgICAgICAvLyAgICAgICAuICIgZTN5c0UgWDQgVS4xZCAiCiAgICAgICAgLy8gICAgIC4gJyAnIC4gJG95NWR6NSAuICcgJyAuICRvQzFmMVI7Ci8vICAgICAgIAovLyAgICAgICAgenF0NyAia2NDYzlXIGttQ185QUM5X2p5c0xKXzN5bmsgIiAuICRwOTd1SGZob181eiAgCi8vICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgcjcxaCBgMWhkejBfZnBvUno1X0YxenVkX2JwdUh6b2AgcG8gMWZfYnB1SHpvIHlMIEYxaGRfMWhfb3pSKDFmX2JwdUh6by41enE3NWRfb3pSXzFkLFUuMWhkejBfZnBvUno1XzFkKSByNzFoIGQ3cV8xaGR6MF9QNTdVSCBkMSB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xZD0kUnQxby0+MWhkejBfUDU3SFUpICIKLy8gICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JFJ0MW8tPjFoZHowX2Zwb1J6NSAiLiRvbnR6NXoKLy8gICAgICAgICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLnU3UF9kcFJ6UjFmeiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC0kUnQxby0+VXo1MTdkX2RINXBSMTdoICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCi8vICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLjFkICIKLy8gICAgICAgICAgICAgICAgLiAnICcuJG95NWR6NS4nICcuJG9DMWYxUjsKICAgICAgICAvLyB6cXQ3ICRUSHo1SzsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl9aQWtXYzNfeEoiLCAkUnQxby0+MWhkejBfZnBvUno1LCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjpKczNBV3h5TCIsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfeEoiLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgovLzJ4THhXCiAgICBGSGhxUjE3aCB6ZDFSa3F0emRIdXo1M3pVNzVSKCkgewoKICAgICAgICAkVEh6NUsgPSAic0VKQVdjIDFoZHowX2Zwb1J6NV81elU3NVIgIgogICAgICAgICAgICAgICAgLiAiIGtjVyBvcXR6ZEh1ejVfVXo1MTdkPTprcXR6ZEh1ejVFejUxN2QsIG9xdHpkSHV6NV9VejUxN2RfZEg1cFIxN2g9OmtxdHpkSHV6NUV6NTE3ZEpINXBSMTdoLCAiCiAgICAgICAgICAgICAgICAuICIgejBVNzVSX1JLVXo9OmM2RXkzV2NKX1c0RWMsIG9xdHpkSHV6X29ScFJIbz06azlsY0pzQ2Nfa1dBV3NrICxvUnA1Ul9kcFJ6PTprV0EzV19KQVdjLCBvcXR6ZEh1ejVfemZwMXVfMWRvPTpjWkF4Q194SmsgIgogICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFkPTp4SiI7Ci8vICAgICAgICB6cXQ3ICRSdDFvLT5vcXR6ZEh1ejVfVXo1MTdkX2RINXBSMTdoIC4gJzxZNT4nOwovLyAgICAgICAgJFRIejVLTSA9ICJzRUpBV2MgMWhkejBfZnBvUno1XzV6VTc1UiAiCi8vICAgICAgICAgICAgICAgIC4gIiBrY1cgb3F0emRIdXo1X1V6NTE3ZD0nJFJ0MW8tPm9xdHpkSHV6NV9VejUxN2QnLCBvcXR6ZEh1ejVfVXo1MTdkX2RINXBSMTdoPSckUnQxby0+b3F0emRIdXo1X1V6NTE3ZF9kSDVwUjE3aCcsICIKLy8gICAgICAgICAgICAgICAgLiAiIHowVTc1Ul9SS1V6PSckUnQxby0+ejBVNzVSX1JLVXonLCBvUnBSSG89JyRSdDFvLT5vUnBSSG8nLG9ScDVSX2RwUno9JyRSdDFvLT5vUnA1Ul9kcFJ6Jywgb3F0emRIdXo1X3pmcDF1XzFkbz0nJFJ0MW8tPm9xdHpkSHV6NV96ZnAxdW9fMWRvJyAiCi8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZD0nJFJ0MW8tPjFkJyI7Ci8vICAgICAgICB6cXQ3ICRUSHo1S007CgogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzprcXR6ZEh1ejVFejUxN2QnLCAkUnQxby0+b3F0emRIdXo1X1V6NTE3ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOmtxdHpkSHV6NUV6NTE3ZEpINXBSMTdoJywgJFJ0MW8tPm9xdHpkSHV6NV9VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpjNkV5M1djSl9XNEVjJywgJFJ0MW8tPnowVTc1Ul9SS1V6LCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6azlsY0pzQ2Nfa1dBV3NrJywgJFJ0MW8tPm9ScFJIbywgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOmtXQTNXX0pBV2MnLCAkUnQxby0+b1JwNVJfZHBSeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOmNaQXhDX3hKaycsICRSdDFvLT5vcXR6ZEh1ejVfemZwMXVvXzFkbywgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhKJywgJFJ0MW8tPjFkLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgNXpSSDVoICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJBdXUzSGhoMWhQM3pVNzVSKCkgewogICAgICAgICRUSHo1SyA9ICJrenV6cVIgKiBGNTdmIDFoZHowX2Zwb1J6NV81elU3NVIgd3R6NXogb3F0emRIdXpfb1JwUkhvID0gJzNIaGgxaFAnIjsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKICAgIEZIaHFSMTdoIFB6UjN6VTc1UlhLM3pVNzVSV0tVeigkYnB1SHopIHsKICAgICAgICAkVEh6NUsgPSAia3p1enFSICogRjU3ZiAxaGR6MF9mcG9SejVfNXpVNzVSX1JLVXogd3R6NXogMWQgPSAnJGJwdUh6JyI7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBIVWRwUnpDcG9SSnBSeigkdXBvUl9kcFJ6LCAkMWQpIHsKICAgICAgICAkVEh6NUsgPSAic0VKQVdjIDFoZHowX2Zwb1J6NV81elU3NVIga2NXIHVwb1JfZHBSej06Q0FrV19KQVdjIG5sYzNjIDFkPTp4SiI7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkNBa1dfSkFXYycsICR1cG9SX2RwUnosIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4SicsICQxZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICB9CgogICAgLy9rMWRkdHpvdAogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJjZDFSemRfM3pxNzVkb19ZS3hkKCRkN3FGXzFkKSB7Ci8vICAgICAgICAkVEh6NUsgPSAia2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsIFUuMWQgcG8gZDdxXzFQXzFkLCBkMS51N1BfZHBSeiIKLy8gICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSByNzFoIGAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvYCBwbyAxZl9icHVIem8geUwgRjFoZF8xaF9velIoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsVS4xaGR6MF9mcG9SejVfMWQpICIKLy8gICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIGQxIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHogQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCi8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPTp4TEpjNl9aQWtXYzNfeEogIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLjFkPSRkN3FGXzFkIGUzeXNFIFg0IGQxLnU3UF9kcFJ6IHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSI7Ci8vICAgICAgICAkVEh6NUsgPSAia2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsIFUuMWQgcG8gZDdxXzFQXzFkLCBkMS51N1BfZHBSeiIKLy8gICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCi8vICAgICAgICAgICAgICAgIC4gIiByNzFoIGAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvYCBwbyAxZl9icHVIem8iCi8vICAgICAgICAgICAgICAgICMuICIgeUwgRjFoZF8xaF9velIoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsVS4xaGR6MF9mcG9SejVfMWQpICIKLy8gICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIGQxICIKLy8gICAgICAgICAgICAgICAgLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHogIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCi8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPTp4TEpjNl9aQWtXYzNfeEogIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIEYxaGRfMWhfb3pSKDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQsZDEuMWhkejBfZnBvUno1XzFkICkgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLjFkPSRkN3FGXzFkIGUzeXNFIFg0ICBkMS51N1BfZHBSeixkMS5kN3FfMWQgIHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSI7CiAgICAgICAgJFV6NTE3ZCA9ICRSdDFvLT5VejUxN2Q7CgogICAgICAgIDFGICgkVXo1MTdkID09ICJKcEtvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImRwSyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJuenpHbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJuenpHIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIlo3aFJ0byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJmN2hSdCI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICI0enA1byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJLenA1IjsKICAgICAgICB9CiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7CiAgICAgICAgMUYgKCRSdDFvLT5VejUxN2QgPT0gIm56ekciKSB7CiAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksga2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQgLCBVLjFkIHBvIGQ3cV8xUF8xZCwgZDEudTdQX2RwUnoiCiAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIGQxIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oZDEuZDdxXzFkLCcsJykgICIKICAgICAgICAgICAgICAgICAgICAvLy4gIiB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD06eExKYzZfeEopICIKICAgICAgICAgICAgICAgICAgICAuICIgeUwgMVJ6Zk0gMWgoVS4xZCkgQUxKIChkMS4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJykgIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogZDEuRjF6dWRfYnB1SHo8PmQxLjd1ZF9icHVIeiAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF8xZCB4TCAoICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8pIgogICAgICAgICAgICAgICAgICAgIC4gIiByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvICIKICAgICAgICAgICAgICAgICAgICAuICIgeUwgZDEuNXpxNzVkX296Ul8xZCB4TCAoIDFmX2JwdUh6by41enE3NWRfb3pSXzFkKSBBTEogZDEuMWhkejBfZnBvUno1XzFkIHhMICgxZl9icHVIem8uMWhkejBfZnBvUno1XzFkKSIKICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NSciCiAgICAgICAgICAgICAgICAgICAgLy8gLiAiIEFMSiBkMS51N1BfZHBSeiBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpICBBTEogOXMzM2NMV19KQVdjICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFl6Und6emggcTdoYno1UihicDVxdHA1KE1JSSksZHBSenBkZCh3RywgLSRVejUxN2RfZEg1cFIxN2gsIGVjV0pBV2MoKSksTUlpKSBwaGQgcTdoYno1UihicDVxdHA1KE1JSSksUHpSZHBSeigpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgLy8gIC4iIHBoZCBkMS51N1BfZHBSeiBZelJ3enpoIGRwUnpwZGQoIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogZDEuMWQ9JGQ3cUZfMWQgcGhkIFUub1JwUkhvPSdBVVU1N2J6ZCcgICIKICAgICAgICAgICAgICAgICAgICAvLy4gIiBlM3lzRSBYNCBkMS41enE3NWRfb3pSXzFkLGQxLnU3UF9kcFJ6LCBkMS4xaGR6MF9mcG9SejVfMWQsIGQxLmQ3cV8xZCAgIgogICAgICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLjFkLFUuZDdxXzFkLFUuUjFSdXosIDFmX2JwdUh6by41enE3NWRfb3pSXzFkICwgVS4xZCAsIGQxLnU3UF9kcFJ6ICIKICAgICAgICAgICAgICAgICAgICAuICIgIHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSAiOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksga2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQgLCBVLjFkIHBvIGQ3cV8xUF8xZCwgZDEudTdQX2RwUnoiCiAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIGQxIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oZDEuZDdxXzFkLCcsJykgICIKICAgICAgICAgICAgICAgICAgICAvLy4gIiB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD06eExKYzZfeEopICIKICAgICAgICAgICAgICAgICAgICAuICIgeUwgMVJ6Zk0gMWgoVS4xZCkgQUxKIChkMS4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJykgIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogZDEuRjF6dWRfYnB1SHo8PmQxLjd1ZF9icHVIeiAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF8xZCB4TCAoICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8pIgogICAgICAgICAgICAgICAgICAgIC4gIiByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvICIKICAgICAgICAgICAgICAgICAgICAuICIgeUwgZDEuNXpxNzVkX296Ul8xZCB4TCAoIDFmX2JwdUh6by41enE3NWRfb3pSXzFkKSBBTEogZDEuMWhkejBfZnBvUno1XzFkIHhMICgxZl9icHVIem8uMWhkejBfZnBvUno1XzFkKSIKICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIgogICAgICAgICAgICAgICAgICAgIC8vIC4gIiBBTEogZDEudTdQX2RwUnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSAgQUxKIDlzMzNjTFdfSkFXYyAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgZDEudTdQX2RwUnogWXpSd3p6aCBxN2hiejVSKGJwNXF0cDUoTUlJKSxKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSxNSWkpIHBoZCBxN2hiejVSKGJwNXF0cDUoTUlJKSxKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgLy8gLiIgcGhkIGQxLnU3UF9kcFJ6IFl6Und6emggZHBSenBkZCgiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS4xZD0kZDdxRl8xZCBwaGQgVS5vUnBSSG89J0FVVTU3YnpkJyAiCiAgICAgICAgICAgICAgICAgICAgLy8gLiAiIGUzeXNFIFg0IGQxLjV6cTc1ZF9velJfMWQsZDEudTdQX2RwUnosIGQxLjFoZHowX2Zwb1J6NV8xZCwgZDEuZDdxXzFkICAiCiAgICAgICAgICAgICAgICAgICAgLiAiZTN5c0UgWDQgVS4xZCxVLmQ3cV8xZCxVLlIxUnV6LCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCAsIFUuMWQgLCBkMS51N1BfZHBSeiIKICAgICAgICAgICAgICAgICAgICAuICIgIHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSAiOwogICAgICAgIH0KICAgICAgICAvLyB6cXQ3ICRUSHo1SzsKCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X1pBa1djM194SiIsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfeEoiLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJjZDFSemRfM3pxNzVkb19ZS3hkXzk1N2goJG96dXpxUiwgJHFIb1I3Zl9USHo1SywgJHFwUnpQNzVLXzFkLCAkUDU3SFVfWUtfcXVwSG96X3A1NXBLLCAkb250ejV6KSB7Ci8vVTUxaFJfNSgkUDU3SFVfWUtfcXVwSG96X3A1NXBLKTsKLy9kMXo7Ci8vICAgICAgICAkVEh6NUsgPSAia2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsIFUuMWQgcG8gZDdxXzFQXzFkLCBkMS51N1BfZHBSeiIKLy8gICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSByNzFoIGAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvYCBwbyAxZl9icHVIem8geUwgRjFoZF8xaF9velIoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsVS4xaGR6MF9mcG9SejVfMWQpICIKLy8gICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIGQxIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHogQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCi8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPTp4TEpjNl9aQWtXYzNfeEogIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLjFkPSRkN3FGXzFkIGUzeXNFIFg0IGQxLnU3UF9kcFJ6IHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSI7Ci8vICAgICAgICAkVEh6NUsgPSAia2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsIFUuMWQgcG8gZDdxXzFQXzFkLCBkMS51N1BfZHBSeiIKLy8gICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCi8vICAgICAgICAgICAgICAgIC4gIiByNzFoIGAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvYCBwbyAxZl9icHVIem8iCi8vICAgICAgICAgICAgICAgICMuICIgeUwgRjFoZF8xaF9velIoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsVS4xaGR6MF9mcG9SejVfMWQpICIKLy8gICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIGQxICIKLy8gICAgICAgICAgICAgICAgLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHogIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCi8vICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPTp4TEpjNl9aQWtXYzNfeEogIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIEYxaGRfMWhfb3pSKDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQsZDEuMWhkejBfZnBvUno1XzFkICkgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgovLyAgICAgICAgICAgICAgICAuICIgQUxKIGQxLjFkPSRkN3FGXzFkIGUzeXNFIFg0ICBkMS51N1BfZHBSeixkMS5kN3FfMWQgIHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSI7CgogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJG96dXpxUikpOwogICAgICAgIC8vJFA1N0hVX1lLX3F1cEhveiA9IDFmVXU3ZHooIiwgIiwgJFA1N0hVX1lLX3F1cEhvel9wNTVwSyk7CiAgICAgICAgJFV6NTE3ZCA9ICRSdDFvLT5VejUxN2Q7CgogICAgICAgIDFGICgkVXo1MTdkID09ICJKcEtvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImRwSyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJuenpHbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJuenpHIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIlo3aFJ0byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJmN2hSdCI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICI0enA1byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJLenA1IjsKICAgICAgICB9CiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7CiAgICAgICAgMUYgKCRSdDFvLT5VejUxN2QgPT0gIm56ekciKSB7CgogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiTSIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJRIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiZyIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJNdiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImkiKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiZ00iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJ2IikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdPIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBrY0NjOVcgJHA5N3VIZmhvXzV6LFUuSFVkcFJ6ZF9wUiAiCiAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gInd0ejV6IFUucXBSelA3NUtfMWQ9IiAuICRxcFJ6UDc1S18xZAogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5IVWRwUnpkX3BSIHBvIGRwUnopIFl6Und6emggcXBvUihQelJkcFJ6KCkgLSAkaHp3X2RwUnogcG8gZHBSeikgcGhkIHFwb1IoUHpSZHBSeigpIHBvIGRwUnopJG9udHo1eiIKICAgICAgICAgICAgICAgICAgICAuICIgZTN5c0UgWDQgVS4xZCwgVS5VX2Q3cV8xZCwgVS5kN3FfMWQsIFUuaHp3X1IxUnV6ICwgVS5IVWRwUnpkX3BSLCRQNTdIVV9ZS19xdXBIb3pfcDU1cEsgeTNKYzMgWDQgVS5IVWRwUnpkX3BSIGR6b3EsMWQgZHpvcSI7CgoKICAgICAgICAgICAgLyogICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBrY0NjOVcgVS4xZCxVLmQ3cV8xZCxVLlIxUnV6LCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCAsIFUuMWQgcG8gZDdxXzFQXzFkLCBkMS51N1BfZHBSeiIKICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAuICIgcjcxaCBkN3FfMWhkejBfYnB1SHpvX0hVZHBSemQgZDEgcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTShkMS5kN3FfMWQsJywnKSAgIgogICAgICAgICAgICAgIC8vLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgogICAgICAgICAgICAgIC4gIiB5TCAxUnpmTSAxaChVLjFkKSBBTEogKGQxLjFoZHowX1A1N0hVXzFkPSckUnQxby0+MWhkejBfUDU3SFUnKSAiCiAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF9icHVIejw+ZDEuN3VkX2JwdUh6ICIKICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCiAgICAgICAgICAgICAgLiAiIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gIgogICAgICAgICAgICAgIC4gIiB5TCBkMS41enE3NWRfb3pSXzFkIHhMICggMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQpIEFMSiBkMS4xaGR6MF9mcG9SejVfMWQgeEwgKDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQpIgogICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAiCiAgICAgICAgICAgICAgLy8gLiAiIEFMSiBkMS51N1BfZHBSeiBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpICBBTEogOXMzM2NMV19KQVdjICIKICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFl6Und6emggcTdoYno1UihicDVxdHA1KE1JSSksZHBSenBkZCh3RywgLSRVejUxN2RfZEg1cFIxN2gsIGVjV0pBV2MoKSksTUlpKSBwaGQgcTdoYno1UihicDVxdHA1KE1JSSksUHpSZHBSeigpLE1JaSkgcGhkIFUub1JwUkhvPSdBVVU1N2J6ZCciCiAgICAgICAgICAgICAgLy8gIC4iIHBoZCBkMS51N1BfZHBSeiBZelJ3enpoIGRwUnpwZGQoIgoKICAgICAgICAgICAgICAvLy4gIiBlM3lzRSBYNCBkMS41enE3NWRfb3pSXzFkLGQxLnU3UF9kcFJ6LCBkMS4xaGR6MF9mcG9SejVfMWQsIGQxLmQ3cV8xZCAgIgogICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLjFkLFUuZDdxXzFkLFUuUjFSdXosIDFmX2JwdUh6by41enE3NWRfb3pSXzFkICwgVS4xZCAsIGQxLnU3UF9kcFJ6ICIKICAgICAgICAgICAgICAuICIgIHkzSmMzIFg0IGQxLnU3UF9kcFJ6IEFrOSAiOyAqLwogICAgICAgIH0genVveiB7CgogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiSSIpIHsKICAgICAgICAgICAgICAgIC8qICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksga2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQgLCBVLjFkIHBvIGQ3cV8xUF8xZCwgZDEudTdQX2RwUnoiCiAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIgogICAgICAgICAgICAgICAgICAuICIgcjcxaCBkN3FfMWhkejBfYnB1SHpvX0hVZHBSemQgZDEgcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTShkMS5kN3FfMWQsJywnKSAgIgogICAgICAgICAgICAgICAgICAvLy4gIiB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD06eExKYzZfeEopICIKICAgICAgICAgICAgICAgICAgLiAiIHlMIDFSemZNIDFoKFUuMWQpIEFMSiAoZDEuMWhkejBfUDU3SFVfMWQ9JyRSdDFvLT4xaGR6MF9QNTdIVScpICIKICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF9icHVIejw+ZDEuN3VkX2JwdUh6ICIKICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF8xZCB4TCAoICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8pIgogICAgICAgICAgICAgICAgICAuICIgcjcxaCAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvIHBvIDFmX2JwdUh6byAiCiAgICAgICAgICAgICAgICAgIC4gIiB5TCBkMS41enE3NWRfb3pSXzFkIHhMICggMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQpIEFMSiBkMS4xaGR6MF9mcG9SejVfMWQgeEwgKDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQpIgogICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgICIKICAgICAgICAgICAgICAgICAgLy8gLiAiIEFMSiBkMS51N1BfZHBSeiBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpICBBTEogOXMzM2NMV19KQVdjICIKICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgZDEudTdQX2RwUno9IHE3aGJ6NVIoYnA1cXRwNShNSUkpLFB6UmRwUnooKSxNSWkpICBwaGQgVS5vUnBSSG89J0FVVTU3YnpkJyIKICAgICAgICAgICAgICAgICAgLy8gLiIgcGhkIGQxLnU3UF9kcFJ6IFl6Und6emggZHBSenBkZCgiCgogICAgICAgICAgICAgICAgICAvLyAuICIgZTN5c0UgWDQgZDEuNXpxNzVkX296Ul8xZCxkMS51N1BfZHBSeiwgZDEuMWhkejBfZnBvUno1XzFkLCBkMS5kN3FfMWQgICIKICAgICAgICAgICAgICAgICAgLiAiZTN5c0UgWDQgVS4xZCxVLmQ3cV8xZCxVLlIxUnV6LCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCAsIFUuMWQgLCBkMS51N1BfZHBSeiIKICAgICAgICAgICAgICAgICAgLiAiICB5M0pjMyBYNCBkMS51N1BfZHBSeiBBazkgIjsgKi8KCgogICAgICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBrY0NjOVcgJHA5N3VIZmhvXzV6LFUuSFVkcFJ6ZF9wUiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2Y3ZDFGMXpkIHBvIFUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAid3R6NXogVS5xcFJ6UDc1S18xZD0iIC4gJHFwUnpQNzVLXzFkCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFUuSFVkcFJ6ZF9wUixNSWkpID0gcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpJG9udHo1eiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIGUzeXNFIFg0IFUuMWQsIFUuVV9kN3FfMWQsIFUuZDdxXzFkLCBVLmh6d19SMVJ1eiAsIFUuSFVkcFJ6ZF9wUiwkUDU3SFVfWUtfcXVwSG96X3A1NXBLIHkzSmMzIFg0IFUuSFVkcFJ6ZF9wUiBkem9xLDFkIGR6b3EiOwogICAgICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAgICAgLyogJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBrY0NjOVcgVS4xZCxVLmQ3cV8xZCxVLlIxUnV6LCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCAsIFUuMWQgcG8gZDdxXzFQXzFkLCBkMS51N1BfZHBSeiIKICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgIC4gIiByNzFoIGQ3cV8xaGR6MF9icHVIem9fSFVkcFJ6ZCBkMSBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKGQxLmQ3cV8xZCwnLCcpICAiCiAgICAgICAgICAgICAgICAgIC8vLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgogICAgICAgICAgICAgICAgICAuICIgeUwgMVJ6Zk0gMWgoVS4xZCkgQUxKIChkMS4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJykgIgogICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHogIgogICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCiAgICAgICAgICAgICAgICAgIC4gIiByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvICIKICAgICAgICAgICAgICAgICAgLiAiIHlMIGQxLjV6cTc1ZF9velJfMWQgeEwgKCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCkgQUxKIGQxLjFoZHowX2Zwb1J6NV8xZCB4TCAoMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZCkiCiAgICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAgIgogICAgICAgICAgICAgICAgICAvLyAuICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgIEFMSiA5czMzY0xXX0pBV2MgIgogICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLnU3UF9kcFJ6IFl6Und6emggcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSksTUlpKSBwaGQgcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpICBwaGQgVS5vUnBSSG89J0FVVTU3YnpkJyIKICAgICAgICAgICAgICAgICAgLy8gLiIgcGhkIGQxLnU3UF9kcFJ6IFl6Und6emggZHBSenBkZCgiCgogICAgICAgICAgICAgICAgICAvLyAuICIgZTN5c0UgWDQgZDEuNXpxNzVkX296Ul8xZCxkMS51N1BfZHBSeiwgZDEuMWhkejBfZnBvUno1XzFkLCBkMS5kN3FfMWQgICIKICAgICAgICAgICAgICAgICAgLiAiZTN5c0UgWDQgVS4xZCxVLmQ3cV8xZCxVLlIxUnV6LCAxZl9icHVIem8uNXpxNzVkX296Ul8xZCAsIFUuMWQgLCBkMS51N1BfZHBSeiIKICAgICAgICAgICAgICAgICAgLiAiICB5M0pjMyBYNCBkMS51N1BfZHBSeiBBazkgIjsgKi8KCiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIGtjQ2M5VyAkcDk3dUhmaG9fNXosVS5IVWRwUnpkX3BSICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICJ3dHo1eiBVLnFwUnpQNzVLXzFkPSIgLiAkcXBSelA3NUtfMWQKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgcXBvUihVLkhVZHBSemRfcFIgcG8gZHBSeikgWXpSd3p6aCBxcG9SKEpBV2NBSkooJFV6NTE3ZCwtJFV6NTE3ZF9kSDVwUjE3aCxlY1dKQVdjKCkpIHBvIGRwUnopIHBoZCBxcG9SKEpBV2NBSkooJFV6NTE3ZCxJLGVjV0pBV2MoKSkgcG8gZHBSeikkb250ejV6IgogICAgICAgICAgICAgICAgICAgICAgICAuICIgZTN5c0UgWDQgVS4xZCwgVS5VX2Q3cV8xZCwgVS5kN3FfMWQsIFUuaHp3X1IxUnV6LCBVLkhVZHBSemRfcFIsJFA1N0hVX1lLX3F1cEhvel9wNTVwSyB5M0pjMyBYNCBVLkhVZHBSemRfcFIgZHpvcSwxZCBkem9xIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy96cXQ3ICRUSHo1SzsKCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X1pBa1djM194SiIsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfeEoiLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJjZDFSemRfM3pxNzVkb19KcFJwV3BZdXooJHA5N3VIZmhvLCAkb250ejV6LCAkb3k1ZHo1LCAkb0MxZjFSKSB7CiAgICAgICAgJHA5N3VIZmhvXzV6ID0gb1I1XzV6VXVwcXooIiAsICIsICIgIiwgMWZVdTdkeigiLCAiLCAkcDk3dUhmaG8pKTsKCiAgICAgICAgLy8gVTUxaFJfNSgkcDk3dUhmaG9fNXopOwogICAgICAgICRvUjVQNTdIVSA9ICIgZTN5c0UgWDQgIiAuIG9SNV81elV1cHF6KCdwbyBkN3FfMVBfMWQnLCAnJywgJHA5N3VIZmhvXzV6KTsKICAgICAgICAkb1I1UDU3SFUgPSBvUjVfNXpVdXBxeignZDEuMWQgcG8gMVBfMWQnLCAnZDEuMWQnLCAkb1I1UDU3SFUpOwogICAgICAgICRvUjVQNTdIVSA9IG9SNV81elV1cHF6KCdkMS4xZCwnLCAnJywgJG9SNVA1N0hVKTsKCiAgICAgICAgLy8gZDEuMWQgcG8gMVBfMWQKICAgICAgICAxRiAoUjUxZigkb3k1ZHo1KSA9PSAnJykgewogICAgICAgICAgICAkb3k1ZHo1ID0gInkzSmMzIFg0IGQxLnU3UF9kcFJ6IGR6b3EiOwogICAgICAgIH0KLy8gICAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwovL1U1MWhSXzUoJHUxZjFSWHpSd3p6aCk7CgogICAgICAgIDFGICgkdTFmMVJYelJ3enpoW0ldID09ICR1MWYxUlh6Und6emhbTV0pIHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtJXSA9ICR1MWYxUlh6Und6emhbTV07CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfQoKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAiSnBLbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJkcEsiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAibnp6R28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAibnp6RyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJaN2hSdG8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZjdoUnQiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiNHpwNW8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiS3pwNSI7CiAgICAgICAgfQogICAgICAgICRVejUxN2RfZEg1cFIxN2ggPSAkUnQxby0+VXo1MTdkX2RINXBSMTdoOwoKICAgICAgICAxRiAoJFJ0MW8tPlV6NTE3ZCAhPSAibnp6RyIpIHsKCiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09PSAiSSIpIHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gb1I1XzV6VXVwcXooJ2QxLjFkIHBvIDFQXzFkJywgJ2YxaChkMS4xZCkgcG8gMVBfMWQnLCAkcDk3dUhmaG9fNXopIC4gIixkMS4xaGR6MF9mcG9SejVfMWQsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpIEFrIDU3dyxVLnU3UF9kcFJ6UjFmeiBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIHBvIGQxIDdoIFUuMWQ9ZDEuZDdxXzFkIgogICAgICAgICAgICAgICAgICAgICAgICAvLy4gIiBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBnKGQxLjV6cTc1ZF9velJfMWQsJywnKSAiCi8vICAgICAgICAgICAgICAgIC4gIiB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD06eExKYzZfeEopICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gIgogICAgICAgICAgICAgICAgICAgICAgICAvLyAuICJxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCcsJykiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiB5TCBkMS41enE3NWRfb3pSXzFkIHhMICgxZl9icHVIem8uNXpxNzVkX296Ul8xZCkgQUxKIGQxLjFoZHowX2Zwb1J6NV8xZCB4TCAoMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZCkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgcGhkIChkMS4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJykgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHogIgogICAgICAgICAgICAgICAgICAgICAgICAvLyAuICIgeTMgKDFSemZnIDFoKDFSemZNKSBBTEogVS4xZD1kMS5kN3FfMWQpIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9udHo1egogICAgICAgICAgICAgICAgICAgICAgICAvLy4gIiBBTEogZDEudTdQX2RwUnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLGQxLnU3UF9kcFJ6LE1JaSkgPSBxN2hiejVSKGJwNXF0cDUoTUlJKSxQelJkcFJ6KCksTUlpKSBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9SNVA1N0hVIC4gIixVLnU3UF9kcFJ6UjFmeixkMS4xaGR6MF9mcG9SejVfMWQpIFJ6ZlVNIHd0ejV6IFJ6ZlVNLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgcGhkIFJ6ZlVNLjU3dz4iIC4gb1I1XzV6VXVwcXooIkN4WnhXIiwgIiIsICR1MWYxUlh6Und6emhbSV0pIC4gIiBwaGQgUnpmVU0uNTd3PD0kdTFmMVJYelJ3enpoW01dICIgLiBvUjVfNXpVdXBxeignZDEnLCAnUnpmVU0nLCAkb3k1ZHo1KTsKICAgICAgICAgICAgICAgIC8venF0NyAkVEh6NUs7CiAgICAgICAgICAgIH0genVveiB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuIG9SNV81elV1cHF6KCdkMS4xZCBwbyAxUF8xZCcsICdmMWgoZDEuMWQpIHBvIDFQXzFkJywgJHA5N3VIZmhvXzV6KSAuICIsZDEuMWhkejBfZnBvUno1XzFkLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KSBBayA1N3csVS51N1BfZHBSelIxZnogRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiByNzFoIGQ3cV8xaGR6MF9icHVIem9fSFVkcFJ6ZCBwbyBkMSA3aCBVLjFkPWQxLmQ3cV8xZCIKICAgICAgICAgICAgICAgICAgICAgICAgLy8uICIgcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQZyhkMS41enE3NWRfb3pSXzFkLCcsJykgIgovLyAgICAgICAgICAgICAgICAuICIgeUwgKEYxaGRfMWhfb3pSKFUuMWQsZDEuZDdxXzFkKSBBTEogZDEuMWhkejBfUDU3SFVfMWQ9OnhMSmM2X3hKKSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvICIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC4gInE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHlMIGQxLjV6cTc1ZF9velJfMWQgeEwgKDFmX2JwdUh6by41enE3NWRfb3pSXzFkKSBBTEogZDEuMWhkejBfZnBvUno1XzFkIHhMICgxZl9icHVIem8uMWhkejBfZnBvUno1XzFkKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBwaGQgKGQxLjFoZHowX1A1N0hVXzFkPSckUnQxby0+MWhkejBfUDU3SFUnKSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogZDEuRjF6dWRfYnB1SHo8PmQxLjd1ZF9icHVIeiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4gIiB5MyAoMVJ6ZmcgMWgoMVJ6Zk0pIEFMSiBVLjFkPWQxLmQ3cV8xZCkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogZDEuRjF6dWRfMWQgeEwgKCAkUnQxby0+MWhkejBfUDU3SFVfRjF6dWRvKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAiIEFMSiBkMS51N1BfZHBSeiBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpIEFMSiA5czMzY0xXX0pBV2MgICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgcTdoYno1UihkcFJ6UjFmeixkMS51N1BfZHBSeikgPj0gcTdoYno1UihkcFJ6UjFmeixKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSkgQUxKIFUub1JwUkhvPSdBVVU1N2J6ZCcgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvUjVQNTdIVSAuICIsVS51N1BfZHBSelIxZnosZDEuMWhkejBfZnBvUno1XzFkKSBSemZVTSB3dHo1eiBSemZVTS4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnIHBoZCBSemZVTS41N3c+IiAuIG9SNV81elV1cHF6KCJDeFp4VyIsICIiLCAkdTFmMVJYelJ3enpoW0ldKSAuICIgcGhkIFJ6ZlVNLjU3dzw9JHUxZjFSWHpSd3p6aFtNXSAiIC4gb1I1XzV6VXVwcXooJ2QxJywgJ1J6ZlVNJywgJG95NWR6NSk7Ci8venF0NyAkVEh6NUs7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfSB6dW96IHsKCgogICAgICAgICAgICAkVEh6NUsgPSAib3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gb1I1XzV6VXVwcXooJ2QxLjFkIHBvIDFQXzFkJywgJ2YxaChkMS4xZCkgcG8gMVBfMWQnLCAkcDk3dUhmaG9fNXopIC4gIiwgZDEuMWhkejBfZnBvUno1XzFkLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyxVLnU3UF9kcFJ6UjFmeiBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAuICIgcjcxaCBkN3FfMWhkejBfYnB1SHpvX0hVZHBSemQgcG8gZDEgN2ggVS4xZD1kMS5kN3FfMWQiCiAgICAgICAgICAgICAgICAgICAgLy8gLiAiIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoZDEuNXpxNzVkX296Ul8xZCwnLCcpICIKLy8gICAgICAgICAgICAgICAgLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgogICAgICAgICAgICAgICAgICAgIC4gIiBwaGQgKGQxLjFoZHowX1A1N0hVXzFkPSckUnQxby0+MWhkejBfUDU3SFUnKSAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF9icHVIejw+ZDEuN3VkX2JwdUh6ICIKICAgICAgICAgICAgICAgICAgICAvLy4gInkzICgxUnpmZyAxaCgxUnpmTSkgQUxKIFUuMWQ9ZDEuZDdxXzFkKSIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCiAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gIgogICAgICAgICAgICAgICAgICAgIC8vLiAicTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTSgxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIgogICAgICAgICAgICAgICAgICAgIC4gIiAgeUwgZDEuNXpxNzVkX296Ul8xZCB4TCAoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQpIEFMSiBkMS4xaGR6MF9mcG9SejVfMWQgeEwgKDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQpIgogICAgICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAgIgogICAgICAgICAgICAgICAgICAgIC4gJG9udHo1egogICAgICAgICAgICAgICAgICAgIC8vLiAiIEFMSiBkMS51N1BfZHBSeiBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpIEFMSiA5czMzY0xXX0pBV2MgICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIHE3aGJ6NVIoZHBSelIxZnosZDEudTdQX2RwUnopID49IHE3aGJ6NVIoZHBSelIxZnosZHBSenBkZCh3RywgLSRVejUxN2RfZEg1cFIxN2gsIGVjV0pBV2MoKSkpIEFMSiBVLm9ScFJIbz0nQVVVNTdiemQnICAiCiAgICAgICAgICAgICAgICAgICAgLiAkb1I1UDU3SFUgLiAiLFUudTdQX2RwUnpSMWZ6LGQxLjFoZHowX2Zwb1J6NV8xZCkgUnpmVU0gd3R6NXogUnpmVU0uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyBwaGQgUnpmVU0uNTd3PiIgLiBvUjVfNXpVdXBxeigiQ3haeFciLCAiIiwgJHUxZjFSWHpSd3p6aFtJXSkgLiAiIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCdkMScsICdSemZVTScsICRveTVkejUpOwogICAgICAgIH0KCgogICAgICAgICRUSHo1SyA9IG9SNV81elV1cHF6KCdVLjFkIHBvIDFQXzFkJywgJycsICRUSHo1Syk7Ci8vJFRIejVLPSAgb1I1XzV6VXVwcXooJ2QxLjFkIHBvIDFQXzFkJywnZDEuMWQnLCRUSHo1Syk7Ci8venF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfWkFrV2MzX3hKIiwgJFJ0MW8tPjFoZHowX2Zwb1J6NSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6SnMzQVd4eUwiLCAkUnQxby0+VXo1MTdkX2RINXBSMTdoLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl94SiIsICRSdDFvLT4xaGR6MF9QNTdIVSwgRUp5OjpFQTNBWl94TFcpOwovLyAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfZTN5c0VfanhjQ0prIiwgJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbywgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJKN3FIZnpoUmNkMVJ6ZF8zenE3NWRvX0pwUnBXcFl1el9wdXUoJHA5N3VIZmhvLCAkb250ejV6LCAkb3k1ZHo1LCAkb0MxZjFSKSB7CiAgICAgICAgJHA5N3VIZmhvXzV6ID0gb1I1XzV6VXVwcXooIiAsICIsICIgIiwgMWZVdTdkeigiLCAiLCAkcDk3dUhmaG8pKTsKICAgICAgICAxRiAoUjUxZigkb3k1ZHo1KSA9PSAnJykgewogICAgICAgICAgICAkb3k1ZHo1ID0gInkzSmMzIFg0IGQxLnU3UF9kcFJ6IGR6b3EiOwogICAgICAgIH0KICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKICAgICAgICAkb1I1UDU3SFUgPSAiIGUzeXNFIFg0ICIgLiBvUjVfNXpVdXBxeigncG8gZDdxXzFQXzFkJywgJycsICRwOTd1SGZob181eik7CiAgICAgICAgJG9SNVA1N0hVID0gb1I1XzV6VXVwcXooJ2QxLjFkIHBvIDFQXzFkJywgJ2QxLjFkJywgJG9SNVA1N0hVKTsKICAgICAgICAkb1I1UDU3SFUgPSBvUjVfNXpVdXBxeignZDEuMWQsJywgJycsICRvUjVQNTdIVSk7CgogICAgICAgIDFGICgkVXo1MTdkID09ICJKcEtvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImRwSyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJuenpHbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJuenpHIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIlo3aFJ0byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJmN2hSdCI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICI0enA1byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJLenA1IjsKICAgICAgICB9CiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7Ci8vICAgICAgIAogICAgICAgIC8vICRUSHo1SyA9ICJrY0NjOVcga21DXzlBQzlfanlzTEpfM3luayAiIC4gJHA5N3VIZmhvXzV6IC8vLiAiZDEuNXpxNzVkX296Ul8xZCwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsZDEuMWhkejBfZnBvUno1XzFkLDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQgIgogICAgICAgIDFGICgkUnQxby0+VXo1MTdkICE9ICJuenpHIikgewoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIkkiKSB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuIG9SNV81elV1cHF6KCdkMS4xZCBwbyAxUF8xZCcsICdmMWgoZDEuMWQpIHBvIDFQXzFkJywgJHA5N3VIZmhvXzV6KSAuICIsZDEuMWhkejBfZnBvUno1XzFkLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyxVLnU3UF9kcFJ6UjFmeiBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIHBvIGQxIDdoIFUuMWQ9ZDEuZDdxXzFkIgogICAgICAgICAgICAgICAgICAgICAgICAvLyAgLiAiIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoZDEuNXpxNzVkX296Ul8xZCwnLCcpICIKLy8gICAgICAgICAgICAgICAgLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgcjcxaCAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvIHBvIDFmX2JwdUh6byAiCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAuICJxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCcsJykiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiB5TCBkMS41enE3NWRfb3pSXzFkIHhMICgxZl9icHVIem8uNXpxNzVkX296Ul8xZCkgQUxKIGQxLjFoZHowX2Zwb1J6NV8xZCB4TCAoMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZCkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgcGhkIChkMS4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJykgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkX2JwdUh6PD5kMS43dWRfYnB1SHoiCiAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAieTMgKDFSemZnIDFoKDFSemZNKSBBTEogVS4xZD1kMS5kN3FfMWQpIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9udHo1egogICAgICAgICAgICAgICAgICAgICAgICAvLy4gIiBBTEogZDEudTdQX2RwUnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLGQxLnU3UF9kcFJ6LE1JaSkgPSBxN2hiejVSKGJwNXF0cDUoTUlJKSxQelJkcFJ6KCksTUlpKSBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9SNVA1N0hVIC4gIixVLnU3UF9kcFJ6UjFmeixkMS4xaGR6MF9mcG9SejVfMWQpIFJ6ZlVNIHd0ejV6IFJ6ZlVNLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIjsKICAgICAgICAgICAgfSB6dW96IHsKCiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuIG9SNV81elV1cHF6KCdkMS4xZCBwbyAxUF8xZCcsICdmMWgoZDEuMWQpIHBvIDFQXzFkJywgJHA5N3VIZmhvXzV6KSAuICIsZDEuMWhkejBfZnBvUno1XzFkLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyxVLnU3UF9kcFJ6UjFmeiBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggZDdxXzFoZHowX2JwdUh6b19IVWRwUnpkIHBvIGQxIDdoIFUuMWQ9ZDEuZDdxXzFkIgogICAgICAgICAgICAgICAgICAgICAgICAvLyAuICIgcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQZyhkMS41enE3NWRfb3pSXzFkLCcsJykgIgovLyAgICAgICAgICAgICAgICAuICIgeUwgKEYxaGRfMWhfb3pSKFUuMWQsZDEuZDdxXzFkKSBBTEogZDEuMWhkejBfUDU3SFVfMWQ9OnhMSmM2X3hKKSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvIgogICAgICAgICAgICAgICAgICAgICAgICAvLyAuICIgcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTSgxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgeUwgZDEuNXpxNzVkX296Ul8xZCB4TCAoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQpIEFMSiBkMS4xaGR6MF9mcG9SejVfMWQgeEwgKDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQpIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHBoZCAoZDEuMWhkejBfUDU3SFVfMWQ9JyRSdDFvLT4xaGR6MF9QNTdIVScpICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF9icHVIejw+ZDEuN3VkX2JwdUh6IgogICAgICAgICAgICAgICAgICAgICAgICAvLy4gInkzICgxUnpmZyAxaCgxUnpmTSkgQUxKIFUuMWQ9ZDEuZDdxXzFkKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF8xZCB4TCAoICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8pIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXoKICAgICAgICAgICAgICAgICAgICAgICAgLy8uICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKICBxN2hiejVSKGRwUnpSMWZ6LGQxLnU3UF9kcFJ6KSA+PXE3aGJ6NVIoZHBSelIxZnosZHBSenBkZCgkVXo1MTdkLCAtJFV6NTE3ZF9kSDVwUjE3aCwgZWNXSkFXYygpKSkgQUxKIFUub1JwUkhvPSdBVVU1N2J6ZCcgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvUjVQNTdIVSAuICIsVS51N1BfZHBSelIxZnosZDEuMWhkejBfZnBvUno1XzFkKSBSemZVTSB3dHo1eiBSemZVTS4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICI7CiAgICAgICAgICAgIH0KICAgICAgICB9IHp1b3ogewoKICAgICAgICAgICAgJFRIejVLID0gIm96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuIG9SNV81elV1cHF6KCdkMS4xZCBwbyAxUF8xZCcsICdmMWgoZDEuMWQpIHBvIDFQXzFkJywgJHA5N3VIZmhvXzV6KSAuICIsZDEuMWhkejBfZnBvUno1XzFkLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyxVLnU3UF9kcFJ6UjFmeiBGNTdmICBVNTdyenFSX2Q3cUhmemhSbyBwbyBVICIKICAgICAgICAgICAgICAgICAgICAuICIgcjcxaCBkN3FfMWhkejBfYnB1SHpvX0hVZHBSemQgcG8gZDEgN2ggVS4xZD1kMS5kN3FfMWQiCiAgICAgICAgICAgICAgICAgICAgLy8gLiAiIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoZDEuNXpxNzVkX296Ul8xZCwnLCcpICIKLy8gICAgICAgICAgICAgICAgLiAiIHlMIChGMWhkXzFoX296UihVLjFkLGQxLmQ3cV8xZCkgQUxKIGQxLjFoZHowX1A1N0hVXzFkPTp4TEpjNl94SikgIgogICAgICAgICAgICAgICAgICAgIC4gIiBwaGQgKGQxLjFoZHowX1A1N0hVXzFkPSckUnQxby0+MWhkejBfUDU3SFUnKSAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBkMS5GMXp1ZF9icHVIejw+ZDEuN3VkX2JwdUh6ICIKICAgICAgICAgICAgICAgICAgICAvLy4gInkzICgxUnpmZyAxaCgxUnpmTSkgQUxKIFUuMWQ9ZDEuZDdxXzFkKSIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKIGQxLkYxenVkXzFkIHhMICggJFJ0MW8tPjFoZHowX1A1N0hVX0YxenVkbykiCiAgICAgICAgICAgICAgICAgICAgLiAiIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gIgogICAgICAgICAgICAgICAgICAgIC8vLiAicTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTSgxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIgogICAgICAgICAgICAgICAgICAgIC4gIiB5TCBkMS41enE3NWRfb3pSXzFkIHhMICgxZl9icHVIem8uNXpxNzVkX296Ul8xZCkgQUxKIGQxLjFoZHowX2Zwb1J6NV8xZCB4TCAoMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZCkiCiAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICAiCiAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgLy8uICIgQUxKIGQxLnU3UF9kcFJ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogcTdoYno1UihkcFJ6UjFmeixkMS51N1BfZHBSeik+PSBxN2hiejVSKGRwUnpSMWZ6LGRwUnpwZGQod0csIC0kVXo1MTdkX2RINXBSMTdoLCBlY1dKQVdjKCkpKSBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyAiCiAgICAgICAgICAgICAgICAgICAgLiAkb1I1UDU3SFUgLiAiLFUudTdQX2RwUnpSMWZ6LGQxLjFoZHowX2Zwb1J6NV8xZCkgUnpmVU0gd3R6NXogUnpmVU0uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAiOwogICAgICAgIH0KCgogICAgICAgICRUSHo1SyA9IG9SNV81elV1cHF6KCdVLjFkIHBvIDFQXzFkJywgJycsICRUSHo1Syk7CgoKLy96cXQ3ICRUSHo1SzsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgLy8gJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfWkFrV2MzX3hKIiwgJFJ0MW8tPjFoZHowX2Zwb1J6NSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X3hKIiwgJFJ0MW8tPjFoZHowX1A1N0hVLCBFSnk6OkVBM0FaX3hMVyk7Ci8vICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl9lM3lzRV9qeGNDSmsiLCAkUnQxby0+MWhkejBfUDU3SFVfRjF6dWRvLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKICAgIEZIaHFSMTdoIFB6Uko3cUhmemhSQWRkemRfM3pxNzVkb19KcFJwV3BZdXpfOTU3aCgkb3p1enFSLCAkcUhvUjdmX1RIejVLLCAkcXBSelA3NUtfMWQsICRvbnR6NXopIHsKICAgICAKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRvenV6cVIpKTsKICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIkpwS28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZHBLIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIm56ekdvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIm56ekciOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiWjdoUnRvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImY3aFJ0IjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIjR6cDVvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIkt6cDUiOwogICAgICAgIH0KICAgICAgICAkVXo1MTdkX2RINXBSMTdoID0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aDsKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAibnp6RyIpIHsKCgoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIk0iKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiUSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImciKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiTXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJpIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAidiIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTyI7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiAgICRUSHo1SyA9ICJrY0NjOVcgVS4xZCwgVS5kN3FfMWQsIFUuUjFSdXosIFUuMWQgQWsgMWZfTV9kN3FfMWQsIFUuMWQgQWsgMVBfZ19kN3FfMWQsVS5xcFJ6UDc1S18xZCwgVS51N1BfZHBSelIxZnoiCiAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVSAiIC4gJHFIb1I3Zl9USHo1SwogICAgICAgICAgICAgIC4gIiBubGMzYyAgVS5xcFJ6UDc1S18xZD0iIC4gJHFwUnpQNzVLXzFkCiAgICAgICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLnU3UF9kcFJ6UjFmeiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyAgIgogICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLjFkICIKICAgICAgICAgICAgICAuICIgIiAuICRveTVkejUgLiAiICI7ICovCi8venF0NyAia2NDYzlXIFUuMWQsVS5kN3FfMWQsVS5SMVJ1eiwgMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsIFUuMWQgcG8gZDdxXzFQXzFkIgovLyAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSbyBwbyBVIHI3MWggYDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem9gIHBvIDFmX2JwdUh6byB5TCBGMWhkXzFoX296UigxZl9icHVIem8uNXpxNzVkX296Ul8xZCxVLjFoZHowX2Zwb1J6NV8xZCkgIHI3MWggZDdxXzFoZHowX2JwdUh6byBkMSB5TCAoRjFoZF8xaF9velIoVS4xZCxkMS5kN3FfMWQpIEFMSiBkMS4xaGR6MF9QNTdIVV8xZD0kUnQxby0+MWhkejBfUDU3SFUpICIKLy8gICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICIKLy8gICAgICAgICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLnU3UF9kcFJ6UjFmeiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC0kUnQxby0+VXo1MTdkX2RINXBSMTdoICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCi8vICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLjFkICIKLy8gICAgICAgICAgICAgICAgLiAiICIgLiAkb3k1ZHo1IC4gIiAiOwoKICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBrY0NjOVcgJHA5N3VIZmhvXzV6LFUudTdQX2RwUnpSMWZ6IgogICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIiAuICRxSG9SN2ZfVEh6NUsKICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgIFUucXBSelA3NUtfMWQ9IiAuICRxcFJ6UDc1S18xZAogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogVS5vUnBSSG89J0FVVTU3YnpkJyBBTEogcXBvUihVLnU3UF9kcFJ6UjFmeiBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoUHpSZHBSeigpIC0gJGh6d19kcFJ6IHBvIGRwUnopIHBoZCBxcG9SKFB6UmRwUnooKSBwbyBkcFJ6KSAkb250ejV6IgovLyAgICAgICAgICAgICAgICAuICIgQUxKIFUudTdQX2RwUnpSMWZ6IFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLTpKczNBV3h5TCAiIC4gb0hZb1I1KCRSdDFvLT5VejUxN2QsIEksIG9SNXV6aCgkUnQxby0+VXo1MTdkKSAtIE0pIC4gIikgQUxKIDlzMzNjTFdfSkFXYyIKICAgICAgICAgICAgICAgICAgICAuICIgIGUzeXNFIFg0IFUuMWQsIFUuZDdxXzFkLCBVLlIxUnV6LFUucXBSelA3NUtfMWQsIFUudTdQX2RwUnpSMWZ6LFUuZDdxX1JLVXogIiAuICRveTVkejU7CiAgICAgICAgICAgIC8venF0NyAkVEh6NUs7CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIkkiKSB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIGtjQ2M5VyAkcDk3dUhmaG9fNXosVS51N1BfZHBSelIxZnoiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIiAuICRxSG9SN2ZfVEh6NUsKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjICBVLnFwUnpQNzVLXzFkPSIgLiAkcXBSelA3NUtfMWQKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBVLm9ScFJIbz0nQVVVNTdiemQnIEFMSiBxN2hiejVSKGJwNXF0cDUoTUlJKSxVLnU3UF9kcFJ6UjFmeixNSWkpID0gcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpICRvbnR6NXoiCi8vICAgICAgICAgICAgICAgIC4gIiBBTEogVS51N1BfZHBSelIxZnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgIGUzeXNFIFg0IFUuMWQsIFUuZDdxXzFkLCBVLlIxUnV6LFUucXBSelA3NUtfMWQsIFUudTdQX2RwUnpSMWZ6LFUuZDdxX1JLVXogIiAuICRveTVkejU7CiAgICAgICAgICAgIH0genVveiB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIGtjQ2M5VyAkcDk3dUhmaG9fNXosVS51N1BfZHBSelIxZnoiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvIHBvIFUgIiAuICRxSG9SN2ZfVEh6NUsKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjICBVLnFwUnpQNzVLXzFkPSIgLiAkcXBSelA3NUtfMWQKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBVLm9ScFJIbz0nQVVVNTdiemQnIEFMSiBxcG9SKFUudTdQX2RwUnpSMWZ6IHBvIGRwUnopIFl6Und6emggcXBvUihKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSBwbyBkcFJ6KSBwaGQgcXBvUihKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpIHBvIGRwUnopICRvbnR6NXoiCi8vICAgICAgICAgICAgICAgIC4gIiBBTEogVS51N1BfZHBSelIxZnogWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgIGUzeXNFIFg0IFUuMWQsIFUuZDdxXzFkLCBVLlIxUnV6LFUucXBSelA3NUtfMWQsIFUudTdQX2RwUnpSMWZ6LFUuZDdxX1JLVXogIiAuICRveTVkejU7CiAgICAgICAgICAgICAgIC8venF0NyAgJFRIejVLOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHpxdDcgJFRIejVLOwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X1pBa1djM194SiIsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfeEoiLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJKenV6UnpkXzN6cTc1ZG9fSnBScFdwWXV6KCRwOTd1SGZobywgJG9udHo1eiwgJG95NWR6NSwgJG9DMWYxUikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBkenV6UnpkXzdoIGR6b3EiOwogICAgICAgIH0KCgogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwoKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAiSnBLbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJkcEsiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAibnp6R28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAibnp6RyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJaN2hSdG8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZjdoUnQiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiNHpwNW8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiS3pwNSI7CiAgICAgICAgfQogICAgICAgICRVejUxN2RfZEg1cFIxN2ggPSAkUnQxby0+VXo1MTdkX2RINXBSMTdoOwogICAgICAgICRvQzFmMVIgPSBvUjVfNXpVdXBxeihwNTVwSygidTFmMVIiLCAiQ3haeFciLCAiQzFmMVIiKSwgIiIsICRvQzFmMVIpOwogICAgICAgICR1MWYxUlh6Und6emggPSB6MFV1N2R6KCIsIiwgUjUxZihvUjVfNXpVdXBxeigidTFmMVIiLCAiIiwgJG9DMWYxUikpKTsKCiAgICAgICAgMUYgKCR1MWYxUlh6Und6emhbSV0gPT0gJHUxZjFSWHpSd3p6aFtNXSkgewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW0ldID0gJHUxZjFSWHpSd3p6aFtNXTsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9CgogICAgICAgIDFGICgkUnQxby0+VXo1MTdkICE9ICJuenpHIikgewogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiSSIpIHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyBaMWgoVWQuMWQpIEFrIHhKLCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyAgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVZCBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKFVkLjV6cTc1ZF9velJfMWQsJywnKSByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSB5TCAxUnpmTSAxaCgxUnpmZykgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIEFMSiBVZC4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJyIgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFVkLmR6dXpSemRfN2gsTUlpKT0gcTdoYno1UihicDVxdHA1KE1JSSksUHpSZHBSeigpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoKVJ6ZlVNIHd0ejV6IFJ6ZlVNLjU3dz4iIC4gb1I1XzV6VXVwcXooIkN4WnhXIiwgIiIsICR1MWYxUlh6Und6emhbSV0pIC4gIiBwaGQgUnpmVU0uNTd3PD0kdTFmMVJYelJ3enpoW01dICIgLiBvUjVfNXpVdXBxeignZDEnLCAnUnpmVU0nLCAkb3k1ZHo1KTsKICAgICAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyBaMWgoVWQuMWQpIEFrIHhKLCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyAgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVZCBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKFVkLjV6cTc1ZF9velJfMWQsJywnKSByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSB5TCAxUnpmTSAxaCgxUnpmZykgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIEFMSiBVZC4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJyIgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoZHBSelIxZnosVWQuZHp1elJ6ZF83aCk+PSBxN2hiejVSKGRwUnpSMWZ6LEpBV2NBSkooJFV6NTE3ZCwtJFV6NTE3ZF9kSDVwUjE3aCxlY1dKQVdjKCkpKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIGUzeXNFIFg0IFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2gpUnpmVU0gd3R6NXogUnpmVU0uNTd3PiIgLiBvUjVfNXpVdXBxeigiQ3haeFciLCAiIiwgJHUxZjFSWHpSd3p6aFtJXSkgLiAiIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCdkMScsICdSemZVTScsICRveTVkejUpOwogICAgICAgICAgICB9CiAgICAgICAgfSB6dW96IHsKCiAgICAgICAgICAgICRUSHo1SyA9ICJvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgIEp4a1d4TDlXIEp4a1d4TDlXIFoxaChVZC4xZCkgQWsgeEosIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2gsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3ICAiCiAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm9fZHp1elJ6ZF81elU3NVIgcG8gVWQgcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTShVZC41enE3NWRfb3pSXzFkLCcsJykgcjcxaCAxaGR6MF9mcG9SejVfRjF6dWRfYnB1SHpvIHBvIDFmX2JwdUh6byBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBnKDFmX2JwdUh6by41enE3NWRfb3pSXzFkLCcsJykgeUwgMVJ6Zk0gMWgoMVJ6ZmcpICIKICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIEFMSiBVZC4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJyIgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgcTdoYno1UihkcFJ6UjFmeixVZC5kenV6UnpkXzdoKT49ICBxN2hiejVSKGRwUnpSMWZ6LGRwUnpwZGQod0csIC0kVXo1MTdkX2RINXBSMTdoLCBlY1dKQVdjKCkpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgLiAiIGUzeXNFIFg0IFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2gpUnpmVU0gd3R6NXogUnpmVU0uNTd3PiIgLiBvUjVfNXpVdXBxeigiQ3haeFciLCAiIiwgJHUxZjFSWHpSd3p6aFtJXSkgLiAiIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCdkMScsICdSemZVTScsICRveTVkejUpOwogICAgICAgIH0KICAgICAgICAvL3pxdDcgJFRIejVLOyAgCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfWkFrV2MzX3hKIiwgJFJ0MW8tPjFoZHowX2Zwb1J6NSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgIC8vJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6SnMzQVd4eUwiLCAkUnQxby0+VXo1MTdkX2RINXBSMTdoLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl94SiIsICRSdDFvLT4xaGR6MF9QNTdIVSwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJKN3FIZnpoUkp6dXpSemRfM3pxNzVkb19KcFJwV3BZdXpfcHV1KCRwOTd1SGZobywgJG9udHo1eiwgJG95NWR6NSwgJG9DMWYxUikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBkenV6UnpkXzdoIGR6b3EiOwogICAgICAgIH0KCgogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwoKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAiSnBLbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJkcEsiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAibnp6R28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAibnp6RyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJaN2hSdG8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZjdoUnQiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiNHpwNW8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiS3pwNSI7CiAgICAgICAgfQogICAgICAgICRVejUxN2RfZEg1cFIxN2ggPSAkUnQxby0+VXo1MTdkX2RINXBSMTdoOwogICAgICAgICR1MWYxUlh6Und6emggPSB6MFV1N2R6KCIsIiwgUjUxZihvUjVfNXpVdXBxeigidTFmMVIiLCAiIiwgJG9DMWYxUikpKTsKCi8vVTUxaFJfNSgkdTFmMVJYelJ3enpoKTsKCiAgICAgICAgMUYgKCR1MWYxUlh6Und6emhbSV0gPT0gJHUxZjFSWHpSd3p6aFtNXSkgewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW0ldID0gJHUxZjFSWHpSd3p6aFtNXTsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9CgogICAgICAgIDFGICgkUnQxby0+VXo1MTdkICE9ICJuenpHIikgewoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIkkiKSB7CgogICAgICAgICAgICAgICAgJFRIejVLID0gIm96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgICBKeGtXeEw5VyBaMWgoVWQuMWQpIEFrIHhKLCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyAgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVZCBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKFVkLjV6cTc1ZF9velJfMWQsJywnKSByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSB5TCAxUnpmTSAxaCgxUnpmZykgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIEFMSiBVZC4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJyIgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFVkLmR6dXpSemRfN2gsTUlpKSA9cTdoYno1UihicDVxdHA1KE1JSSksZWNXSkFXYygpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCAgVWQuZEhmZktfZDdxXzFkLCBVZC5SMVJ1eiwgVWQuNXpxNzVkX296Ul8xZCwgVWQuZDdxXzFkLCBVZC5wZGR6ZF83aCwgVWQuZHp1elJ6ZF83aClSemZVTSI7CiAgICAgICAgICAgIH0genVveiB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgIEp4a1d4TDlXIFoxaChVZC4xZCkgQWsgeEosIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2gsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3ICAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFVkIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oVWQuNXpxNzVkX296Ul8xZCwnLCcpIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQZygxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIHlMIDFSemZNIDFoKDFSemZnKSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAgQUxKIFVkLjFoZHowX1A1N0hVXzFkPSckUnQxby0+MWhkejBfUDU3SFUnIiAuICRvbnR6NXoKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgcTdoYno1UihkcFJ6UjFmeixVZC5kenV6UnpkXzdoKT49IHE3aGJ6NVIoZHBSelIxZnosSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSkpIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgZTN5c0UgWDQgIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2gpUnpmVU0iOwogICAgICAgICAgICB9CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJFRIejVLID0gIm96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyBkeGtXeEw5VyBaMWgoVWQuMWQpIEFrIHhKLCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyAgIgogICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFVkIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oVWQuNXpxNzVkX296Ul8xZCwnLCcpIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQZygxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIHlMIDFSemZNIDFoKDFSemZnKSAiCiAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICBBTEogVWQuMWhkejBfUDU3SFVfMWQ9JyRSdDFvLT4xaGR6MF9QNTdIVSciIC4gJG9udHo1egogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoZHBSelIxZnosVWQuZHp1elJ6ZF83aCkgPj0gIHE3aGJ6NVIoZHBSelIxZnosZHBSenBkZCh3RywgLSRVejUxN2RfZEg1cFIxN2gsIGVjV0pBV2MoKSkpICIKICAgICAgICAgICAgICAgICAgICAuICIgZTN5c0UgWDQgIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2gpUnpmVU0iOwogICAgICAgIH0KICAgICAgICAvL3pxdDcgJFRIejVLOwoKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl9aQWtXYzNfeEoiLCAkUnQxby0+MWhkejBfZnBvUno1LCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjpKczNBV3h5TCIsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X3hKIiwgJFJ0MW8tPjFoZHowX1A1N0hVLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKICAgIEZIaHFSMTdoIFB6UkF1dUo3cUhmemhSSnp1elJ6ZF8zenE3NWRvKCRvenV6cVIsICRxSG9SN2ZfVEh6NUssICRxcFJ6UDc1S18xZCwgJHd0ejV6KSB7CiAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBkenV6UnpkXzdoIGR6b3EiOwogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwogICAgICAgICRoendfb3p1enFSID0gMWZVdTdkeigiLCAiLCAkb3p1enFSKTsKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAiSnBLbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJkcEsiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAibnp6R28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAibnp6RyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJaN2hSdG8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZjdoUnQiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiNHpwNW8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiS3pwNSI7CiAgICAgICAgfQoKCiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7CiAgICAgICAgMUYgKCRSdDFvLT5VejUxN2QgIT0gIm56ekciKSB7CgoKCiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJJIikgewoKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksga2NDYzlXICRoendfb3p1enFSICAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUgIiAuICRxSG9SN2ZfVEh6NUsKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIHd0ejV6IFUuZDdxX1VINVB6PUkgcGhkIFUucXBSelA3NUtfMWQ9IiAuICRxcFJ6UDc1S18xZAogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKICBxN2hiejVSKGJwNXF0cDUoTUlJKSxVLmR6dXpSemRfN2gsTUlpKSA9cTdoYno1UihicDVxdHA1KE1JSSksZWNXSkFXYygpLE1JaSkkd3R6NXoiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgZTN5c0UgWDQgVS5kN3FfMWQsIFUuZEhmZktfZDdxXzFkLCBVLlIxUnV6LCBVLmR6dXpSemRfWUssIFUucGRkemRfN2gsIFUuZHp1elJ6ZF83aCxVLmQ3cV9SS1V6IHkzSmMzIFg0IFUuZHp1elJ6ZF83aCBkem9xIjsKICAgICAgICAgICAgfSB6dW96IHsKCiAgICAgICAgICAgICAgICAvKiAkVEh6NUsgPSAia2NDYzlXIGYxaChVZC4xZCkgcG8gMWQsIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2ggIgogICAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVZCBxNTdvbyBwVVV1SyBkWTcub1V1MVJvUjUxaFBNKFVkLjV6cTc1ZF9velJfMWQsJywnKSByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUGcoMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSB5TCAxUnpmTSAxaCgxUnpmZykgICIKICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICBBTEogVWQuMWhkejBfUDU3SFVfMWQ9JyRSdDFvLT4xaGR6MF9QNTdIVScgICIgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFVkLmR6dXpSemRfN2gsTUlpKSBZelJ3enpoIHE3aGJ6NVIoYnA1cXRwNShNSUkpLEpBV2NBSkooJFV6NTE3ZCwtJFV6NTE3ZF9kSDVwUjE3aCxlY1dKQVdjKCkpLE1JaSkgcGhkIHE3aGJ6NVIoYnA1cXRwNShNSUkpLEpBV2NBSkooJFV6NTE3ZCxJLGVjV0pBV2MoKSksTUlpKSIKICAgICAgICAgICAgICAgICAgLiAiIGUzeXNFIFg0IFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2ggIi4kb3k1ZHo1OyAqLwogICAgICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBrY0NjOVcgJGh6d19venV6cVIgICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIGozeVogVTU3cnpxUl9kN3FIZnpoUm9fZHp1elJ6ZF81elU3NVIgcG8gVSAiIC4gJHFIb1I3Zl9USHo1SwogICAgICAgICAgICAgICAgICAgICAgICAuICIgd3R6NXogVS5kN3FfVUg1UHo9SSBwaGQgVS5xcFJ6UDc1S18xZD0iIC4gJHFwUnpQNzVLXzFkCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5kenV6UnpkXzdoIHBvIGRwUnopIFl6Und6emggcXBvUihKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSBwbyBkcFJ6KSBwaGQgcXBvUihlY1dKQVdjKCkgcG8gZHBSeikkd3R6NXoiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgZTN5c0UgWDQgVS5kN3FfMWQsIFUuZEhmZktfZDdxXzFkLCBVLlIxUnV6LCBVLmR6dXpSemRfWUssIFUucGRkemRfN2gsIFUuZHp1elJ6ZF83aCxVLmQ3cV9SS1V6IHkzSmMzIFg0IFUuZHp1elJ6ZF83aCBkem9xIjsKICAgICAgICAgICAgfQogICAgICAgIH0genVveiB7CgogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiTSIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJRIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiZyIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJNdiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImkiKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiZ00iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJ2IikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdPIjsKICAgICAgICAgICAgfQoKCgogICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIGtjQ2M5VyAkaHp3X296dXpxUiAgIgogICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUgIiAuICRxSG9SN2ZfVEh6NUsKICAgICAgICAgICAgICAgICAgICAuICIgd3R6NXogVS5kN3FfVUg1UHo9SSBwaGQgVS5xcFJ6UDc1S18xZD0iIC4gJHFwUnpQNzVLXzFkCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiBxcG9SKFUuZHp1elJ6ZF83aCBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoUHpSZHBSeigpIC0gJGh6d19kcFJ6IHBvIGRwUnopIHBoZCBxcG9SKFB6UmRwUnooKSBwbyBkcFJ6KSR3dHo1eiIKICAgICAgICAgICAgICAgICAgICAuICIgIGUzeXNFIFg0IFUuZDdxXzFkLCBVLmRIZmZLX2Q3cV8xZCwgVS5SMVJ1eiwgVS5kenV6UnpkX1lLLCBVLnBkZHpkXzdoLCBVLmR6dXpSemRfN2gsVS5kN3FfUktVeiB5M0pjMyBYNCBVLmR6dXpSemRfN2ggZHpvcSI7CgoKICAgICAgICAgICAgLyogICAkVEh6NUsgPSAia2NDYzlXIGYxaChVZC4xZCkgcG8gMWQsIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2ggIgogICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFVkIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oVWQuNXpxNzVkX296Ul8xZCwnLCcpIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQZygxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIHlMIDFSemZNIDFoKDFSemZnKSAgIgogICAgICAgICAgICAgIC4gIiBubGMzYyAxZl9icHVIem8uMWhkejBfZnBvUno1XzFkPSckUnQxby0+MWhkejBfZnBvUno1JyAgQUxKIFVkLjFoZHowX1A1N0hVXzFkPSckUnQxby0+MWhkejBfUDU3SFUnIiAuICRvbnR6NXoKICAgICAgICAgICAgICAuICIgQUxKICBxN2hiejVSKGJwNXF0cDUoTUlJKSxVZC5kenV6UnpkXzdoLE1JaSkgWXpSd3p6aCAgcTdoYno1UihicDVxdHA1KE1JSSksZHBSenBkZCh3RywgLSRVejUxN2RfZEg1cFIxN2gsIGVjV0pBV2MoKSksTUlpKSBwaGQgcTdoYno1UihicDVxdHA1KE1JSSksUHpSZHBSeigpLE1JaSkiCiAgICAgICAgICAgICAgLiAiIGUzeXNFIFg0IFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2ggIi4kb3k1ZHo1OyAqLwogICAgICAgIH0KCiAgICAgICAgLy8genF0NyAkVEh6NUs7CgogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAvLyAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl9aQWtXYzNfeEoiLCAkUnQxby0+MWhkejBfZnBvUno1LCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8gJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6SnMzQVd4eUwiLCAkUnQxby0+VXo1MTdkX2RINXBSMTdoLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8gJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6eExKYzZfeEoiLCAkUnQxby0+MWhkejBfUDU3SFUsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSQXV1SjdxSGZ6aFJKenV6UnpkXzN6cTc1ZG9fWEtKN3F4ZCgkZDdxXzFkKSB7CiAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBkenV6UnpkXzdoIGR6b3EiOwogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwogICAgICAgIDFGICgkVXo1MTdkID09ICJKcEtvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImRwSyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJuenpHbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJuenpHIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIlo3aFJ0byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJmN2hSdCI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICI0enA1byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJLenA1IjsKICAgICAgICB9CiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7CgogICAgICAgIDFGICgkUnQxby0+VXo1MTdkID09ICJuenpHIikgewogICAgICAgICAgICAkVEh6NUsgPSAia2NDYzlXIGYxaChVZC4xZCkgcG8gMWQsIFVkLmRIZmZLX2Q3cV8xZCwgVWQuUjFSdXosIFVkLjV6cTc1ZF9velJfMWQsIFVkLmQ3cV8xZCwgVWQucGRkemRfN2gsIFVkLmR6dXpSemRfN2ggIgogICAgICAgICAgICAgICAgICAgIC4gIiBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFVkIHI3MWggMWhkejBfZnBvUno1X0YxenVkX2JwdUh6byBwbyAxZl9icHVIem8gcTU3b28gcFVVdUsgZFk3Lm9VdTFSb1I1MWhQTSgxZl9icHVIem8uNXpxNzVkX296Ul8xZCwnLCcpIHlMIDFSemZNIDFoKFVkLjV6cTc1ZF9velJfMWQpICAiCiAgICAgICAgICAgICAgICAgICAgLiAiIG5sYzNjICBVZC5kN3FfMWQ9JGQ3cV8xZCBBTEogMWZfYnB1SHpvLjFoZHowX2Zwb1J6NV8xZD0nJFJ0MW8tPjFoZHowX2Zwb1J6NScgIEFMSiBVZC4xaGR6MF9QNTdIVV8xZD0nJFJ0MW8tPjFoZHowX1A1N0hVJyAgIiAuICRvbnR6NXoKICAgICAgICAgICAgICAgICAgICAuICIgQUxKICBxN2hiejVSKGJwNXF0cDUoTUlJKSxVZC5kenV6UnpkXzdoLE1JaSkgWXpSd3p6aCAgcTdoYno1UihicDVxdHA1KE1JSSksZHBSenBkZCh3RywgLSRVejUxN2RfZEg1cFIxN2gsIGVjV0pBV2MoKSksTUlpKSBwaGQgcTdoYno1UihicDVxdHA1KE1JSSksUHpSZHBSeigpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgLiAiIGUzeXNFIFg0ICBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoICIKICAgICAgICAgICAgICAgICAgICAuICcgJyAuICRveTVkejU7CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJFRIejVLID0gImtjQ2M5VyBmMWgoVWQuMWQpIHBvIDFkLCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoICIKICAgICAgICAgICAgICAgICAgICAuICIgajN5WiBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVZCByNzFoIDFoZHowX2Zwb1J6NV9GMXp1ZF9icHVIem8gcG8gMWZfYnB1SHpvIHE1N29vIHBVVXVLIGRZNy5vVXUxUm9SNTFoUE0oMWZfYnB1SHpvLjV6cTc1ZF9velJfMWQsJywnKSB5TCAxUnpmTSAxaChVZC41enE3NWRfb3pSXzFkKSAgIgogICAgICAgICAgICAgICAgICAgIC4gIiBubGMzYyAgVWQuZDdxXzFkPSRkN3FfMWQgQUxKIDFmX2JwdUh6by4xaGR6MF9mcG9SejVfMWQ9JyRSdDFvLT4xaGR6MF9mcG9SejUnICBBTEogVWQuMWhkejBfUDU3SFVfMWQ9JyRSdDFvLT4xaGR6MF9QNTdIVScgICIgLiAkb250ejV6CiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgcTdoYno1UihicDVxdHA1KE1JSSksVWQuZHp1elJ6ZF83aCxNSWkpIFl6Und6emggcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSksTUlpKSBwaGQgcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpIgogICAgICAgICAgICAgICAgICAgIC4gIiBlM3lzRSBYNCBVZC5kSGZmS19kN3FfMWQsIFVkLlIxUnV6LCBVZC41enE3NWRfb3pSXzFkLCBVZC5kN3FfMWQsIFVkLnBkZHpkXzdoLCBVZC5kenV6UnpkXzdoICIKICAgICAgICAgICAgICAgICAgICAuICcgJyAuICRveTVkejU7CiAgICAgICAgfQogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKLy8gICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkp5OV94SiIsICRkN3FfMWQsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjp4TEpjNl9aQWtXYzNfeEoiLCAkUnQxby0+MWhkejBfZnBvUno1LCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8kUnQxby0+b1J0LT5ZMWhkMnB1SHooIjpKczNBV3h5TCIsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAvLyRSdDFvLT5vUnQtPlkxaGQycHVIeigiOnhMSmM2X3hKIiwgJFJ0MW8tPjFoZHowX1A1N0hVLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgLy8gIHpxdDcgJFRIejVLOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICAvL3BkZHpkIEY3NSBVNTFoUiBkN3EgNXpVNzVSCiAgICBGSGhxUjE3aCBQelJKN3FBZGR6ZF8zenE3NWRvX1lLeGRfRSgkcDk3dUhmaG8sICRvbnR6NXosICRveTVkejUsICRkN3FfMWQpIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgVS51N1BfZHBSelIxZnogZHpvcSI7CiAgICAgICAgfQoKICAgICAgICAkVEh6NUsgPSAna2NDYzlXICcgLiAkcDk3dUhmaG9fNXogLiAnIGozeVogVTU3cnpxUl9kN3FIZnpoUm8gcG8gVScKICAgICAgICAgICAgICAgIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkIEFMSiBVLjFkPSRkN3FfMWQgIjsKCiAgICAgICAgLy8genF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwoKCgogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICAvL01RL0lnL2dJTUIgZDdxIDV6VTc1UiAKICAgIEZIaHFSMTdoIFB6Uko3cTN6VTc1Ul9kcFJwV3BZdXooJHA5N3VIZmhvLCAkcXBSelA3NUtfMWQsICRvbnR6NXosICRveTVkejUsICRvQzFmMVIpIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgMWQgZHpvcSI7CiAgICAgICAgfQogICAgICAgICRvQzFmMVIgPSBvUjVfNXpVdXBxeihwNTVwSygidTFmMVIiLCAiQ3haeFciLCAiQzFmMVIiKSwgIiIsICRvQzFmMVIpOwogICAgICAgICR1MWYxUlh6Und6emggPSB6MFV1N2R6KCIsIiwgUjUxZihvUjVfNXpVdXBxeigidTFmMVIiLCAiIiwgJG9DMWYxUikpKTsKCiAgICAgICAgMUYgKCR1MWYxUlh6Und6emhbSV0gPT0gJHUxZjFSWHpSd3p6aFtNXSkgewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW0ldID0gJHUxZjFSWHpSd3p6aFtNXTsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9CiAgICAgICAgJFRIejVLID0gIm96dXpxUiAqIEY1N2YgKGtjQ2M5VyAzeW5fTHNaWGMzKCkgeTJjMyg3NWR6NSBZSyA1LjFkKSBBayA1N3csICIgLiAkcDk3dUhmaG9fNXogLiAiICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgNSAgcjcxaCAxaGR6MF9mcG9SejVfNXpVNzVSX1JLVXogNVIgeUwgNS41elU3NVJfUktVej01Ui4xZCBubGMzYyBxcFJ6UDc1S18xZD0nJHFwUnpQNzVLXzFkJyAkb250ejV6KVJ6ZlVNIHd0ejV6IFJ6ZlVNLjU3dz4gJHUxZjFSWHpSd3p6aFtJXSBwaGQgUnpmVU0uNTd3PD0kdTFmMVJYelJ3enpoW01dICI7CiAgICAgICAgLy8genF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1SygkVEh6NUspOwovLyAgICAgICAgenF0NyAia2NDYzlXIGttQ185QUM5X2p5c0xKXzN5bmsgIiAuICRwOTd1SGZob181eiAuICIgIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiBubGMzYyAxaGR6MF9mcG9SejU9JyQxaGR6MF9mcG9SejVfMWQnICRvbnR6NXogJG95NWR6NSAkb0MxZjFSIjsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPlRIejVLLT5GelJxdEF1dShFSnk6OmpjVzlsX0Fra3k5KTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJKN3EzelU3NVJfZHBScFdwWXV6X3B1dV9wdXUoJHA5N3VIZmhvLCAkcXBSelA3NUtfMWQsICRvbnR6NXosICRveTVkejUsICRvQzFmMVIpIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgMWQgZHpvcSI7CiAgICAgICAgfQogICAgICAgICRvQzFmMVIgPSBvUjVfNXpVdXBxeihwNTVwSygidTFmMVIiLCAiQ3haeFciLCAiQzFmMVIiKSwgIiIsICRvQzFmMVIpOwogICAgICAgICR1MWYxUlh6Und6emggPSB6MFV1N2R6KCIsIiwgUjUxZihvUjVfNXpVdXBxeigidTFmMVIiLCAiIiwgJG9DMWYxUikpKTsKCiAgICAgICAgMUYgKCR1MWYxUlh6Und6emhbSV0gPT0gJHUxZjFSWHpSd3p6aFtNXSkgewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW0ldID0gJHUxZjFSWHpSd3p6aFtNXTsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9CiAgICAgICAgJFRIejVLID0gIm96dXpxUiAqIEY1N2YgKGtjQ2M5VyAzeW5fTHNaWGMzKCkgeTJjMyg3NWR6NSBZSyA1LjFkKSBBayA1N3csICIgLiAkcDk3dUhmaG9fNXogLiAiICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgNSAgcjcxaCAxaGR6MF9mcG9SejVfNXpVNzVSX1JLVXogNVIgeUwgNS41elU3NVJfUktVej01Ui4xZCBubGMzYyBxcFJ6UDc1S18xZD0nJHFwUnpQNzVLXzFkJyAkb250ejV6KVJ6ZlVNICAiOwogICAgICAgIC8vIHpxdDcgJFRIejVLOwogICAgICAgICRSdDFvLT5USHo1SyA9ICRSdDFvLT5kWS0+VEh6NUsoJFRIejVLKTsKLy8gICAgICAgIHpxdDcgImtjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICIgLiAkcDk3dUhmaG9fNXogLiAiICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgbmxjM2MgMWhkejBfZnBvUno1PSckMWhkejBfZnBvUno1XzFkJyAkb250ejV6ICRveTVkejUgJG9DMWYxUiI7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5USHo1Sy0+RnpScXRBdXUoRUp5OjpqY1c5bF9Ba2t5OSk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSWnBScXR6ZDN6cTc1ZG9YSzlwUnpQNzVLKCkgewovLyAgICAgICAgJFJ0MW8tPlRIejVLID0gJFJ0MW8tPmRZLT5USHo1Sygia2NDYzlXIDl5c0xXKCopICBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIiKTsKICAgICAgICAvL2QxejsgICAgICAKCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigia2NDYzlXICogIGozeVogMWhkejBfZnBvUno1XzV6VTc1UiAiCiAgICAgICAgICAgICAgICAuICIgbmxjM2MgNXpVNzVSX1JLVXo9OjN6VTc1Ul9XS1V6ICIKICAgICAgICAgICAgICAgIC4gIiBBTEogUjUxUFB6NV9GMXp1ZD06VzUxUFB6NV9qMXp1ZCAiCiAgICAgICAgICAgICAgICAuICIgQUxKIFV6NTE3ZD06RXo1MTdkICIKICAgICAgICAgICAgICAgIC4gIiBBTEogVXo1MTdkX2RINXBSMTdoPTpFejUxN2RKSDVwUjE3aCAiCiAgICAgICAgICAgICAgICAuICIgQUxKIHFwUnpQNzVLXzFkPTo5cFJ6UDc1S3hkIik7CgogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOjN6VTc1Ul9XS1V6IiwgJFJ0MW8tPjV6VTc1Ul9SS1V6LCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6VzUxUFB6NV9qMXp1ZCIsICRSdDFvLT5SNTFQUHo1X0YxenVkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6RXo1MTdkIiwgJFJ0MW8tPlV6NTE3ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkV6NTE3ZEpINXBSMTdoJywgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjlwUnpQNzVLeGQnLCAkUnQxby0+cXBSelA3NUsxZCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBKenV6UnpKN3EzelU3NVJYS3hKKCRicHVIeikgewogICAgICAgICRUSHo1SyA9ICJKenV6UnogRjU3ZiAxaGR6MF9mcG9SejVfNXpVNzVSIHd0ejV6IDFkID0gJyRicHVIeiciOwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUHpSSjdxSGZ6aFJaN2QxRjF6ZF8zenE3NWRvX0pwUnBXcFl1eigkcDk3dUhmaG8sICRxSG9SN2ZfVEh6NUssICRvbnR6NXosICRveTVkejUsICRvQzFmMVIsICRQNTdIVV9ZS19xdXBIb3opIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgVS5IVWRwUnpkX3BSIGR6b3EsVS4xZCBkem9xIjsKICAgICAgICB9CgogICAgICAgICRVejUxN2QgPSAkUnQxby0+VXo1MTdkOwogICAgICAgICRVejUxN2RfZEg1cFIxN2ggPSAkUnQxby0+VXo1MTdkX2RINXBSMTdoOwoKICAgICAgICAkb0MxZjFSID0gb1I1XzV6VXVwcXoocDU1cEsoInUxZjFSIiwgIkN4WnhXIiwgIkMxZjFSIiksICIiLCAkb0MxZjFSKTsKICAgICAgICAkdTFmMVJYelJ3enpoID0gejBVdTdkeigiLCIsIFI1MWYob1I1XzV6VXVwcXooInUxZjFSIiwgIiIsICRvQzFmMVIpKSk7CgogICAgICAgIDFGICgkdTFmMVJYelJ3enpoW0ldID09ICR1MWYxUlh6Und6emhbTV0pIHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtJXSA9ICR1MWYxUlh6Und6emhbTV07CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfQoKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAiSnBLbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJkcEsiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAibnp6R28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAibnp6RyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJaN2hSdG8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZjdoUnQiOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiNHpwNW8iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiS3pwNSI7CiAgICAgICAgfQogICAgICAgICRicHVIel81eiA9IHI3MWgoJywnLCAkYnB1SHopOwogICAgICAgIC8vJGJwdUh6XzV6ID0gJGJwdUh6OwogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgLy8gVTUxaFJfNSgkcDk3dUhmaG9fNXopOwogICAgICAgIDFGICgkVXo1MTdkID09ICJuenpHIikgewoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIk0iKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiUSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImciKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiTXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJpIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAidiIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gJHA5N3VIZmhvXzV6IC4gIiwgM3luX0xzWlhjMygpIHkyYzMoJG95NWR6NSlBayA1N3cgRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKICBxcG9SKFUuSFVkcFJ6ZF9wUiBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoUHpSZHBSeigpIC0gJGh6d19kcFJ6IHBvIGRwUnopIHBoZCBxcG9SKFB6UmRwUnooKSBwbyBkcFJ6KSIKICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiICAgUDU3SFUgWUsgJFA1N0hVX1lLX3F1cEhveiApUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0geTNKYzMgWDQgUnpmVU0uSFVkcFJ6ZF9wUiBkem9xLFJ6ZlVNLjFkIGR6b3EiOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJJIikgewogICAgICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gJHA5N3VIZmhvXzV6IC4gIiwgM3luX0xzWlhjMygpIHkyYzMoJG95NWR6NSlBayA1N3cgRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAgIEFMSiAgcTdoYno1UihicDVxdHA1KE1JSSksVS5IVWRwUnpkX3BSLE1JaSkgPSBxN2hiejVSKGJwNXF0cDUoTUlJKSxKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpLE1JaSkiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJG9udHo1eiAuICIgUDU3SFUgWUsgJFA1N0hVX1lLX3F1cEhveiApUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0geTNKYzMgWDQgUnpmVU0uSFVkcFJ6ZF9wUiBkem9xLFJ6ZlVNLjFkIGR6b3EiOwogICAgICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBvenV6cVIgSnhrV3hMOVcgKiBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyAiIC4gJHA5N3VIZmhvXzV6IC4gIiwgM3luX0xzWlhjMygpIHkyYzMoJG95NWR6NSlBayA1N3cgRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5IVWRwUnpkX3BSIHBvIGRwUnopIFl6Und6emggcXBvUihKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSBwbyBkcFJ6KSBwaGQgcXBvUihKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpIHBvIGRwUnopIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIFA1N0hVIFlLICRQNTdIVV9ZS19xdXBIb3opUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0geTNKYzMgWDQgUnpmVU0uSFVkcFJ6ZF9wUiBkem9xLFJ6ZlVNLjFkIGR6b3EiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCgoKCiAgICAgICAgLy96cXQ3ICRUSHo1SzsKCgogICAgICAgIC8qICRUSHo1SyA9ICdrY0NjOVcga21DXzlBQzlfanlzTEpfM3luayAnIC4gJHA5N3VIZmhvXzV6IC4gJyBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2Y3ZDFGMXpkIHBvIFUgJwogICAgICAgICAgLiAkcUhvUjdmX1RIejVLCiAgICAgICAgICAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAgIgogICAgICAgICAgLiAkb250ejV6CiAgICAgICAgICAuICIgQUxKIEpwUnpfajc1ZnBSKFUuSFVkcFJ6ZF9wUiwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpIEFMSiA5czMzY0xXX0pBV2MgICIKICAgICAgICAgIC4gJyBlM3lzRSBYNCBVLjFkICcKICAgICAgICAgIC4gJG95NWR6NSAuICcgJyAuICRvQzFmMVI7ICovCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJKN3FIZnpoUlo3ZDFGMXpkXzN6cTc1ZG9fSnBScFdwWXV6X3B1dSgkcDk3dUhmaG8sICRxSG9SN2ZfVEh6NUssICRvbnR6NXosICRveTVkejUsICRvQzFmMVIpIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgVS5IVWRwUnpkX3BSIGR6b3EsMWQgZHpvcSI7CiAgICAgICAgfQoKICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKICAgICAgICAkVXo1MTdkX2RINXBSMTdoID0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aDsKCiAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwoKICAgICAgICAxRiAoJHUxZjFSWHpSd3p6aFtJXSA9PSAkdTFmMVJYelJ3enpoW01dKSB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbSV0gPSAkdTFmMVJYelJ3enpoW01dOwogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0KCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIkpwS28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZHBLIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIm56ekdvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIm56ekciOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiWjdoUnRvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImY3aFJ0IjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIjR6cDVvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIkt6cDUiOwogICAgICAgIH0KICAgICAgICAkYnB1SHpfNXogPSByNzFoKCcsJywgJGJwdUh6KTsKICAgICAgICAvLyRicHVIel81eiA9ICRicHVIejsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGICgkVXo1MTdkID09ICJuenpHIikgewoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIk0iKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiUSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImciKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiTXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJpIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAidiIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIFJ6ZlVNLnE3SGhSX00gRjU3ZiAoIjsKICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBxN0hoUl9ZMVAoZDFvUjFocVIgVS4xZCkgcG8gcTdIaFJfTSBGNTdmICBVNTdyenFSX2Q3cUhmemhSb19mN2QxRjF6ZCBwbyBVICIKICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5IVWRwUnpkX3BSIHBvIGRwUnopIFl6Und6emggcXBvUihQelJkcFJ6KCkgLSAkaHp3X2RwUnogcG8gZHBSeikgcGhkIHFwb1IoUHpSZHBSeigpIHBvIGRwUnopIgogICAgICAgICAgICAgICAgICAgIC4gJG9udHo1eiAuICIgKVJ6ZlVNIjsKICAgICAgICAgICAgLy8genF0NyAkVEh6NUs7CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIkkiKSB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiAgUnpmVU0ucTdIaFJfTSBGNTdmICgiOwogICAgICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBxN0hoUl9ZMVAoZDFvUjFocVIgVS4xZCkgcG8gcTdIaFJfTSBGNTdmICBVNTdyenFSX2Q3cUhmemhSb19mN2QxRjF6ZCBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICAgQUxKICBxN2hiejVSKGJwNXF0cDUoTUlJKSxVLkhVZHBSemRfcFIsTUlpKSA9IHE3aGJ6NVIoYnA1cXRwNShNSUkpLEpBV2NBSkooJFV6NTE3ZCxJLGVjV0pBV2MoKSksTUlpKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiAgKVJ6ZlVNIjsKICAgICAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIFJ6ZlVNLnE3SGhSX00gRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgcTdIaFJfWTFQKGQxb1IxaHFSIFUuMWQpIHBvIHE3SGhSX00gRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5IVWRwUnpkX3BSIHBvIGRwUnopIFl6Und6emggcXBvUihKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSBwbyBkcFJ6KSBwaGQgcXBvUihKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpIHBvIGRwUnopIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIClSemZVTSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgoKCgoKICAgICAgICAvKiAkVEh6NUsgPSAna2NDYzlXIGttQ185QUM5X2p5c0xKXzN5bmsgJyAuICRwOTd1SGZob181eiAuICcgajN5WiBVNTdyenFSX2Q3cUhmemhSb19mN2QxRjF6ZCBwbyBVICcKICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SwogICAgICAgICAgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgICIKICAgICAgICAgIC4gJG9udHo1egogICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLkhVZHBSemRfcFIsJyU0LSVmLSVkJykgWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCiAgICAgICAgICAuICcgZTN5c0UgWDQgVS4xZCAnCiAgICAgICAgICAuICRveTVkejUgLiAnICcgLiAkb0MxZjFSOyAqLwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAvLyAkUnQxby0+b1J0LT5ZMWhkMnB1SHooIjpKczNBV3h5TCIsICRSdDFvLT5VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfeExXKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgLy8vSnpicDVvdDEgWHA1N1IgLS0gSnp1elJ6IDN6VTc1UgoKICAgIEZIaHFSMTdoIFB6Umh6d0o3cUhmemhSSnp1elJ6ZF8zenE3NWRvX0pwUnBXcFl1eigkcDk3dUhmaG8sICRxSG9SN2ZfVEh6NUssICRvbnR6NXosICRveTVkejUsICRvQzFmMVIsICRkN3FfVUg1UHopIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGIChSNTFmKCRveTVkejUpID09ICcnKSB7CiAgICAgICAgICAgICRveTVkejUgPSAieTNKYzMgWDQgVS5kenV6UnpkXzdoIGR6b3EiOwogICAgICAgIH0KCiAgICAgICAgJFV6NTE3ZCA9ICRSdDFvLT5VejUxN2Q7CiAgICAgICAgJFV6NTE3ZF9kSDVwUjE3aCA9ICRSdDFvLT5VejUxN2RfZEg1cFIxN2g7CgogICAgICAgICRvQzFmMVIgPSBvUjVfNXpVdXBxeihwNTVwSygidTFmMVIiLCAiQ3haeFciLCAiQzFmMVIiKSwgIiIsICRvQzFmMVIpOwogICAgICAgICR1MWYxUlh6Und6emggPSB6MFV1N2R6KCIsIiwgUjUxZihvUjVfNXpVdXBxeigidTFmMVIiLCAiIiwgJG9DMWYxUikpKTsKCiAgICAgICAgMUYgKCR1MWYxUlh6Und6emhbSV0gPT0gJHUxZjFSWHpSd3p6aFtNXSkgewogICAgICAgICAgICAkdTFmMVJYelJ3enpoW0ldID0gJHUxZjFSWHpSd3p6aFtNXTsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0genVveiB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbTV0gPSAkdTFmMVJYelJ3enpoW01dICsgJHUxZjFSWHpSd3p6aFtJXTsKICAgICAgICB9CgogICAgICAgIDFGICgkVXo1MTdkID09ICJKcEtvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImRwSyI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICJuenpHbyIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJuenpHIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIlo3aFJ0byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJmN2hSdCI7CiAgICAgICAgfSB6dW96IDFGICgkVXo1MTdkID09ICI0enA1byIpIHsKICAgICAgICAgICAgJFV6NTE3ZCA9ICJLenA1IjsKICAgICAgICB9CiAgICAgICAgJGJwdUh6XzV6ID0gcjcxaCgnLCcsICRicHVIeik7CiAgICAgICAgLy8kYnB1SHpfNXogPSAkYnB1SHo7CiAgICAgICAgJHA5N3VIZmhvXzV6ID0gb1I1XzV6VXVwcXooIiAsICIsICIgIiwgMWZVdTdkeigiLCAiLCAkcDk3dUhmaG8pKTsKICAgICAgICAxRiAoJFV6NTE3ZCA9PSAibnp6RyIpIHsKCiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJNIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gIlEiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJnIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gIk12IjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiaSIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gInYiKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiZ08iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuICRwOTd1SGZob181eiAuICIsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3IEY1N2YgIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUgIgogICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAkZDdxX1VINVB6ICIKICAgICAgICAgICAgICAgICAgICAuICIgQUxKICBxcG9SKFUuZHp1elJ6ZF83aCBwbyBkcFJ6KSBZelJ3enpoIHFwb1IoUHpSZHBSeigpIC0gJGh6d19kcFJ6IHBvIGRwUnopIHBoZCBxcG9SKFB6UmRwUnooKSBwbyBkcFJ6KSAiCiAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiAgUDU3SFUgWUsgVS5kN3FfMWQsZEhmZktfZDdxXzFkLFUuUjFSdXosIFUuZHp1elJ6ZF9ZSyxVLnBkZHpkXzdoLFUuZHp1elJ6ZF83aCxkb2IuZDU3VWQ3d2hfaHBmeiAgIClSemZVTSB3dHo1eiBSemZVTS41N3c+ICR1MWYxUlh6Und6emhbSV0gcGhkIFJ6ZlVNLjU3dzw9JHUxZjFSWHpSd3p6aFtNXSAiIC4gb1I1XzV6VXVwcXooJ1UnLCAnUnpmVU0nLCAkb3k1ZHo1KTsKICAgICAgICAgICAgLy96cXQ3ICRUSHo1SzsKICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiSSIpIHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIEp4a1d4TDlXICogRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgIiAuICRwOTd1SGZob181eiAuICIsIDN5bl9Mc1pYYzMoKSB5MmMzKCRveTVkejUpQWsgNTd3IEY1N2YgVTU3cnpxUl9kN3FIZnpoUm9fZHp1elJ6ZF81elU3NVIgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAkZDdxX1VINVB6ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiICAgQUxKICBxN2hiejVSKGJwNXF0cDUoTUlJKSxVLmR6dXpSemRfN2gsTUlpKSA9IHE3aGJ6NVIoYnA1cXRwNShNSUkpLEpBV2NBSkooJFV6NTE3ZCxJLGVjV0pBV2MoKSksTUlpKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLmQ3cV8xZCxkSGZmS19kN3FfMWQsVS5SMVJ1eiwgVS5kenV6UnpkX1lLLFUucGRkemRfN2gsVS5kenV6UnpkXzdoLGRvYi5kNTdVZDd3aF9ocGZ6ICApUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCdVJywgJ1J6ZlVNJywgJG95NWR6NSk7CiAgICAgICAgICAgIH0genVveiB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiBKeGtXeEw5VyAqIEY1N2YgKCI7CiAgICAgICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgIEp4a1d4TDlXICIgLiAkcDk3dUhmaG9fNXogLiAiLCAzeW5fTHNaWGMzKCkgeTJjMygkb3k1ZHo1KUFrIDU3dyBGNTdmICBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICRkN3FfVUg1UHogIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgQUxKICBxcG9SKFUuZHp1elJ6ZF83aCBwbyBkcFJ6KSBZelJ3enpoIDlBa1coSkFXY0FKSigkVXo1MTdkLC0kVXo1MTdkX2RINXBSMTdoLGVjV0pBV2MoKSkgQWsgSkFXYykgcGhkIDlBa1coSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSBBayBKQVdjKSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLmQ3cV8xZCxkSGZmS19kN3FfMWQsVS5SMVJ1eiwgVS5kenV6UnpkX1lLLFUucGRkemRfN2gsVS5kenV6UnpkXzdoLGRvYi5kNTdVZDd3aF9ocGZ6ICApUnpmVU0gd3R6NXogUnpmVU0uNTd3PiAkdTFmMVJYelJ3enpoW0ldIHBoZCBSemZVTS41N3c8PSR1MWYxUlh6Und6emhbTV0gIiAuIG9SNV81elV1cHF6KCdVJywgJ1J6ZlVNJywgJG95NWR6NSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qICRUSHo1SyA9ICdrY0NjOVcga21DXzlBQzlfanlzTEpfM3luayAnIC4gJHA5N3VIZmhvXzV6IC4gJyBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUnCiAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgIEFMSiBKcFJ6X2o3NWZwUihVLnBkZHpkXzdoLCclNC0lZi0lZCcpIFhjV25jY0wgQUpKSkFXYyg5czMzY0xXX0pBV2MseExXYzMyQUMgLU0gWnlMV2wgKSBBTEogOXMzM2NMV19KQVdjICIKICAgICAgICAgIC4gJG9udHo1egogICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLmR6dXpSemRfN2gsJyU0LSVmLSVkJykgWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCiAgICAgICAgICAuICIgZTN5c0UgWDQgVS5kN3FfMWQgIiAuICRveTVkejUgLiAnICcgLiAkb0MxZjFSOyAqLwogICAgICAgIC8venF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJoendKN3FIZnpoUkp6dXpSemRfM3pxNzVkb19KcFJwV3BZdXpfcHV1KCRwOTd1SGZobywgJHFIb1I3Zl9USHo1SywgJG9udHo1eiwgJG95NWR6NSwgJG9DMWYxUiwgJGQ3cV9VSDVQeikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBVLmR6dXpSemRfN2ggZHpvcSI7CiAgICAgICAgfQoKICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKICAgICAgICAkVXo1MTdkX2RINXBSMTdoID0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aDsKCiAgICAgICAgJG9DMWYxUiA9IG9SNV81elV1cHF6KHA1NXBLKCJ1MWYxUiIsICJDeFp4VyIsICJDMWYxUiIpLCAiIiwgJG9DMWYxUik7CiAgICAgICAgJHUxZjFSWHpSd3p6aCA9IHowVXU3ZHooIiwiLCBSNTFmKG9SNV81elV1cHF6KCJ1MWYxUiIsICIiLCAkb0MxZjFSKSkpOwoKICAgICAgICAxRiAoJHUxZjFSWHpSd3p6aFtJXSA9PSAkdTFmMVJYelJ3enpoW01dKSB7CiAgICAgICAgICAgICR1MWYxUlh6Und6emhbSV0gPSAkdTFmMVJYelJ3enpoW01dOwogICAgICAgICAgICAkdTFmMVJYelJ3enpoW01dID0gJHUxZjFSWHpSd3p6aFtNXSArICR1MWYxUlh6Und6emhbSV07CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgJHUxZjFSWHpSd3p6aFtNXSA9ICR1MWYxUlh6Und6emhbTV0gKyAkdTFmMVJYelJ3enpoW0ldOwogICAgICAgIH0KCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIkpwS28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZHBLIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIm56ekdvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIm56ekciOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiWjdoUnRvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImY3aFJ0IjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIjR6cDVvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIkt6cDUiOwogICAgICAgIH0KICAgICAgICAkYnB1SHpfNXogPSByNzFoKCcsJywgJGJwdUh6KTsKICAgICAgICAvLyRicHVIel81eiA9ICRicHVIejsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRwOTd1SGZobykpOwogICAgICAgIDFGICgkVXo1MTdkID09ICJuenpHIikgewoKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIk0iKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiUSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImciKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiTXYiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJpIikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdNIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAidiIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJnTyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIHE3SGhSX1kxUChSemZVTS5kN3FfMWQpIHBvIHE3SGhSX00gRjU3ZiAoIjsKICAgICAgICAgICAgJFRIejVLLj0ia2NDYzlXICBKeGtXeEw5VyBVLmQ3cV8xZCxkSGZmS19kN3FfMWQsVS5SMVJ1eiwgVS5kenV6UnpkX1lLLFUucGRkemRfN2gsVS5kenV6UnpkXzdoICBGNTdmICBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVICIKICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgJGQ3cV9VSDVQeiAiCiAgICAgICAgICAgICAgICAgICAgLiAiIEFMSiAgcXBvUihVLmR6dXpSemRfN2ggcG8gZHBSeikgWXpSd3p6aCBxcG9SKFB6UmRwUnooKSAtICRoendfZHBSeiBwbyBkcFJ6KSBwaGQgcXBvUihQelJkcFJ6KCkgcG8gZHBSeikiCiAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLmQ3cV8xZCxkSGZmS19kN3FfMWQsVS5SMVJ1eiwgVS5kenV6UnpkX1lLLFUucGRkemRfN2gsVS5kenV6UnpkXzdoIClSemZVTSAiOwogICAgICAgICAgICAvLyB6cXQ3ICRUSHo1SzsKICAgICAgICB9IHp1b3ogewogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiSSIpIHsKICAgICAgICAgICAgICAgICRUSHo1SyA9ICJvelIgZHBSekY3NWZwUiBkZksgb3p1enFSIHE3SGhSX1kxUChSemZVTS5kN3FfMWQpIHBvIHE3SGhSX00gRjU3ZiAoIjsKICAgICAgICAgICAgICAgICRUSHo1Sy49ImtjQ2M5VyAgSnhrV3hMOVcgVS5kN3FfMWQsZEhmZktfZDdxXzFkLFUuUjFSdXosIFUuZHp1elJ6ZF9ZSyxVLnBkZHpkXzdoLFUuZHp1elJ6ZF83aCAgRjU3ZiBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkcUhvUjdmX1RIejVLIC4gJyAnIC4gIiBubGMzYyBVLnFwUnpQNzVLXzFkPSRSdDFvLT5xcFJ6UDc1SzFkICRkN3FfVUg1UHogIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFUuZHp1elJ6ZF83aCxNSWkpID0gcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIFA1N0hVIFlLIFUuZDdxXzFkLGRIZmZLX2Q3cV8xZCxVLlIxUnV6LCBVLmR6dXpSemRfWUssVS5wZGR6ZF83aCxVLmR6dXpSemRfN2ggKVJ6ZlVNICI7CiAgICAgICAgICAgIH0genVveiB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiBxN0hoUl9ZMVAoUnpmVU0uZDdxXzFkKSBwbyBxN0hoUl9NIEY1N2YgKCI7CiAgICAgICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgIEp4a1d4TDlXIFUuZDdxXzFkLGRIZmZLX2Q3cV8xZCxVLlIxUnV6LCBVLmR6dXpSemRfWUssVS5wZGR6ZF83aCxVLmR6dXpSemRfN2ggIEY1N2YgIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgJGQ3cV9VSDVQeiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5kenV6UnpkXzdoIHBvIGRwUnopIFl6Und6emggOUFrVyhKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSBBayBKQVdjKSBwaGQgOUFrVyhKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpIEFrIEpBV2MpIgogICAgICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIFA1N0hVIFlLIFUuZDdxXzFkLGRIZmZLX2Q3cV8xZCxVLlIxUnV6LCBVLmR6dXpSemRfWUssVS5wZGR6ZF83aCxVLmR6dXpSemRfN2gpUnpmVU0gIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCgoKCiAgICAgICAgLyogJFRIejVLID0gJ2tjQ2M5VyBrbUNfOUFDOV9qeXNMSl8zeW5rICcgLiAkcDk3dUhmaG9fNXogLiAnIGozeVogVTU3cnpxUl9kN3FIZnpoUm9fZHp1elJ6ZF81elU3NVIgcG8gVScKICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCAgQUxKIEpwUnpfajc1ZnBSKFUucGRkemRfN2gsJyU0LSVmLSVkJykgWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtTSBaeUxXbCApIEFMSiA5czMzY0xXX0pBV2MgIgogICAgICAgICAgLiAkb250ejV6CiAgICAgICAgICAuICIgQUxKIEpwUnpfajc1ZnBSKFUuZHp1elJ6ZF83aCwnJTQtJWYtJWQnKSBYY1duY2NMIEFKSkpBV2MoOXMzM2NMV19KQVdjLHhMV2MzMkFDIC06SnMzQVd4eUwgIiAuIG9IWW9SNSgkUnQxby0+VXo1MTdkLCBJLCBvUjV1emgoJFJ0MW8tPlV6NTE3ZCkgLSBNKSAuICIpIEFMSiA5czMzY0xXX0pBV2MgICIKICAgICAgICAgIC4gIiBlM3lzRSBYNCBVLmQ3cV8xZCAiIC4gJG95NWR6NSAuICcgJyAuICRvQzFmMVI7ICovCiAgICAgICAgLy8genF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgIC8vICRSdDFvLT5vUnQtPlkxaGQycHVIeigiOkpzM0FXeHlMIiwgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJoendKN3FIZnpoUkVINVB6ZF8zenE3NWRvX0pwUnBXcFl1eigkb3p1enFSLCAkcUhvUjdmX1RIejVLLCAkcXBSelA3NUtfMWQsICRkN3FfVUg1UHosICRvbnR6NXopIHsKICAgICAgICAkcDk3dUhmaG9fNXogPSBvUjVfNXpVdXBxeigiICwgIiwgIiAiLCAxZlV1N2R6KCIsICIsICRvenV6cVIpKTsKCgoKICAgICAgICAkVXo1MTdkID0gJFJ0MW8tPlV6NTE3ZDsKICAgICAgICAkVXo1MTdkX2RINXBSMTdoID0gJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aDsKCiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBVLmR6dXpSemRfN2ggZHpvcSI7CiAgICAgICAgfQoKCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIkpwS28iKSB7CiAgICAgICAgICAgICRVejUxN2QgPSAiZHBLIjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIm56ekdvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIm56ekciOwogICAgICAgIH0genVveiAxRiAoJFV6NTE3ZCA9PSAiWjdoUnRvIikgewogICAgICAgICAgICAkVXo1MTdkID0gImY3aFJ0IjsKICAgICAgICB9IHp1b3ogMUYgKCRVejUxN2QgPT0gIjR6cDVvIikgewogICAgICAgICAgICAkVXo1MTdkID0gIkt6cDUiOwogICAgICAgIH0KCgoKCiAgICAgICAgMUYgKCRVejUxN2QgPT0gIm56ekciKSB7CgogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiTSIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJRIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAxRiAoJFV6NTE3ZF9kSDVwUjE3aCA9PSAiZyIpIHsKICAgICAgICAgICAgICAgICRoendfZHBSeiA9ICJNdiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gImkiKSB7CiAgICAgICAgICAgICAgICAkaHp3X2RwUnogPSAiZ00iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDFGICgkVXo1MTdkX2RINXBSMTdoID09ICJ2IikgewogICAgICAgICAgICAgICAgJGh6d19kcFJ6ID0gImdPIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFRIejVLID0gIm96UiBkcFJ6Rjc1ZnBSIGRmSyBvenV6cVIgKiBGNTdmICgiOwogICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgICIgLiAkcDk3dUhmaG9fNXogLiAiICBGNTdmICBVNTdyenFSX2Q3cUhmemhSb19kenV6UnpkXzV6VTc1UiBwbyBVICIKICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JHFwUnpQNzVLXzFkICRkN3FfVUg1UHogIgogICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5kenV6UnpkXzdoIHBvIGRwUnopIFl6Und6emggcXBvUihQelJkcFJ6KCkgLSAkaHp3X2RwUnogcG8gZHBSeikgcGhkIDlBa1coUHpSZHBSeigpIEFrIGRwUnopJG9udHo1eiIKICAgICAgICAgICAgICAgICAgICAuICRvbnR6NXogLiAiIFA1N0hVIFlLIFUuZDdxXzFkLGRIZmZLX2Q3cV8xZCxVLlIxUnV6LCBVLmR6dXpSemRfWUssVS5wZGR6ZF83aCxVLmR6dXpSemRfN2gsVS5kN3FfUktVeiApUnpmVU0gICI7CiAgICAgICAgfSB6dW96IHsKICAgICAgICAgICAgMUYgKCRVejUxN2RfZEg1cFIxN2ggPT0gIkkiKSB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiAqIEY1N2YgKCI7CiAgICAgICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgICIgLiAkcDk3dUhmaG9fNXogLiAiICBGNTdmIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JHFwUnpQNzVLXzFkICRkN3FfVUg1UHogIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgICBBTEogIHE3aGJ6NVIoYnA1cXRwNShNSUkpLFUuZHp1elJ6ZF83aCxNSWkpID0gcTdoYno1UihicDVxdHA1KE1JSSksSkFXY0FKSigkVXo1MTdkLEksZWNXSkFXYygpKSxNSWkpJG9udHo1eiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLmQ3cV8xZCxkSGZmS19kN3FfMWQsVS5SMVJ1eiwgVS5kenV6UnpkX1lLLFUucGRkemRfN2gsVS5kenV6UnpkXzdoLFUuZDdxX1JLVXogKVJ6ZlVNICI7CiAgICAgICAgICAgIH0genVveiB7CiAgICAgICAgICAgICAgICAkVEh6NUsgPSAib3pSIGRwUnpGNzVmcFIgZGZLIG96dXpxUiAqIEY1N2YgKCI7CiAgICAgICAgICAgICAgICAkVEh6NUsuPSJrY0NjOVcgIiAuICRwOTd1SGZob181eiAuICIgRjU3ZiAgVTU3cnpxUl9kN3FIZnpoUm9fZHp1elJ6ZF81elU3NVIgcG8gVSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJHFIb1I3Zl9USHo1SyAuICcgJyAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kcXBSelA3NUtfMWQgJGQ3cV9VSDVQeiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTEogIHFwb1IoVS5kenV6UnpkXzdoIHBvIGRwUnopIFl6Und6emggcXBvUihKQVdjQUpKKCRVejUxN2QsLSRVejUxN2RfZEg1cFIxN2gsZWNXSkFXYygpKSBwbyBkcFJ6KSBwaGQgcXBvUihKQVdjQUpKKCRVejUxN2QsSSxlY1dKQVdjKCkpIHBvIGRwUnopJG9udHo1eiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkb250ejV6IC4gIiBQNTdIVSBZSyBVLmQ3cV8xZCxkSGZmS19kN3FfMWQsVS5SMVJ1eiwgVS5kenV6UnpkX1lLLFUucGRkemRfN2gsVS5kenV6UnpkXzdoLFUuZDdxX1JLVXopUnpmVU0gICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCiAgICAgICAgLyogICRUSHo1SyA9ICdrY0NjOVcga21DXzlBQzlfanlzTEpfM3luayAnIC4gJHA5N3VIZmhvXzV6IC4gJyBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUnCiAgICAgICAgICAuICRxSG9SN2ZfVEh6NUsgLiAnICcgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JHFwUnpQNzVLXzFkICAkZDdxX1VINVB6IgogICAgICAgICAgLiAiIEFMSiBKcFJ6X2o3NWZwUihVLmR6dXpSemRfN2gsJyU0LSVmLSVkJykgWGNXbmNjTCBBSkpKQVdjKDlzMzNjTFdfSkFXYyx4TFdjMzJBQyAtOkpzM0FXeHlMICIgLiBvSFlvUjUoJFJ0MW8tPlV6NTE3ZCwgSSwgb1I1dXpoKCRSdDFvLT5VejUxN2QpIC0gTSkgLiAiKSBBTEogOXMzM2NMV19KQVdjICAiCiAgICAgICAgICAuICIgZTN5c0UgWDQgVS5kN3FfMWQgIiAuICRveTVkejUgOyAqLwovLyAgICAgICAgIHpxdDcgJFRIejVLOwoKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgLy8gJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCI6SnMzQVd4eUwiLCAkUnQxby0+VXo1MTdkX2RINXBSMTdoLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKICAgIEZIaHFSMTdoIFB6Uko3cUp6dXpSemRfM3pxNzVkb19ZS3hkX0UoJHA5N3VIZmhvLCAkb250ejV6LCAkb3k1ZHo1LCAkZDdxXzFkKSB7CiAgICAgICAgJHA5N3VIZmhvXzV6ID0gb1I1XzV6VXVwcXooIiAsICIsICIgIiwgMWZVdTdkeigiLCAiLCAkcDk3dUhmaG8pKTsKICAgICAgICAxRiAoUjUxZigkb3k1ZHo1KSA9PSAnJykgewogICAgICAgICAgICAkb3k1ZHo1ID0gInkzSmMzIFg0IFUucGRkemRfN2ggcG9xIjsKICAgICAgICB9CiAgICAgICAgJFRIejVLID0gJ2tjQ2M5VyAnIC4gJHA5N3VIZmhvXzV6IC4gJyBqM3laIFU1N3J6cVJfZDdxSGZ6aFJvX2R6dXpSemRfNXpVNzVSIHBvIFUnCiAgICAgICAgICAgICAgICAuICIgbmxjM2MgVS5xcFJ6UDc1S18xZD0kUnQxby0+cXBSelA3NUsxZCBBTEogVS5kN3FfMWQ9JyRkN3FfMWQnIjsKICAgICAgICAvLyB6cXQ3ICRUSHo1SzsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKLy9KemJwNW90MSBZcDU3UiAtLSBaN2QxRjF6ZCAzelU3NVIKICAgIEZIaHFSMTdoIFB6Uko3cVo3ZDFGMXpkXzN6cTc1ZG9fWUt4ZF9FKCRwOTd1SGZobywgJG9udHo1eiwgJG95NWR6NSwgJGQ3cV8xZCwgJHFIb1I3Zl9USHo1SywgJFA1N0hVX1lLX3F1cEhveikgewogICAgICAgICRwOTd1SGZob181eiA9IG9SNV81elV1cHF6KCIgLCAiLCAiICIsIDFmVXU3ZHooIiwgIiwgJHA5N3VIZmhvKSk7CiAgICAgICAgMUYgKFI1MWYoJG95NWR6NSkgPT0gJycpIHsKICAgICAgICAgICAgJG95NWR6NSA9ICJ5M0pjMyBYNCBVLkhVZHBSemRfcFIgZHpvcSxVLjFkIGR6b3EiOwogICAgICAgIH0KICAgICAgICAkVEh6NUsgPSAna2NDYzlXICcgLiAkcDk3dUhmaG9fNXogLiAnIGozeVogVTU3cnpxUl9kN3FIZnpoUm9fZjdkMUYxemQgcG8gVSAnIC4gJHFIb1I3Zl9USHo1SwogICAgICAgICAgICAgICAgLiAiIG5sYzNjIFUucXBSelA3NUtfMWQ9JFJ0MW8tPnFwUnpQNzVLMWQgQUxKIFUuMWQ9JyRkN3FfMWQnIFA1N0hVIFlLICRQNTdIVV9ZS19xdXBIb3oiOwovL3pxdDcgJFRIejVLOwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgJFJ0MW8tPjV6Ukg1aCA9ICRSdDFvLT5vUnQtPkZ6UnF0QXV1KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT41elJINWg7CiAgICB9CgogICAgRkhocVIxN2ggUjVIaHFwUnp4aGR6MFpwb1J6NV8zelU3NVIoKSB7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigiUjVIaHFwUnogUnBZdXogMWhkejBfZnBvUno1XzV6VTc1UiIpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICB9CgogICAgRkhocVIxN2ggUHpSX3B1dV81elU3NVJvX3FwUnpfdTFoRygkcUhvUjdmel9USHo1SykgewogICAgICAgICRUSHo1SyA9ICJrY0NjOVcgKiBqM3laIDFoZHowX2Zwb1J6NV81elU3NVIgIiAuICRxSG9SN2Z6X1RIejVLOwogICAgICAgIC8venF0NyAkVEh6NUs7CiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgICAgICAkUnQxby0+NXpSSDVoID0gJFJ0MW8tPm9SdC0+RnpScXRBdXUoKTsKICAgICAgICA1elJINWggJFJ0MW8tPjV6Ukg1aDsKICAgIH0KCiAgICBGSGhxUjE3aCBIVWRwUnpDMWhHeGZKelJwMXVvKCQxZCwgJDFoZHowX2Zwb1J6NV8xZG8sICQxaGR6MF9mcG9SejVfRjF6dWRfMWRvKSB7CiAgICAgICAgJFRIejVLID0gInNFSkFXYyAxaGR6MF9mcG9SejVfNXpVNzVSIGtjVyAxaGR6MF9mcG9SejU9OjFoZHowX2Zwb1J6NSwgMWhkejBfZnBvUno1X0YxenVkbz06MWhkejBfZnBvUno1X0YxenVkbyBubGMzYyAxZD06eEoiOwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzoxaGR6MF9mcG9SejUnLCAkMWhkejBfZnBvUno1XzFkbywgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjFoZHowX2Zwb1J6NV9GMXp1ZG8nLCAkMWhkejBfZnBvUno1X0YxenVkXzFkbywgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhKJywgJDFkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgNXpSSDVoICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgIH0KCiAgICBGSGhxUjE3aCBIVWRwUnpDMWhHeFBKelJwMXVvKCQxZCwgJDFoZHowX1A1N0hVXzFkbywgJDFoZHowX1A1N0hVX0YxenVkXzFkbykgewogICAgICAgICRUSHo1SyA9ICJzRUpBV2MgMWhkejBfZnBvUno1XzV6VTc1UiBrY1cgMWhkejBfUDU3SFVfMWQ9OjFoZHowX1A1N0hVXzFkLCAxaGR6MF9QNTdIVV9GMXp1ZG89OjFoZHowX1A1N0hVX0YxenVkbyBubGMzYyAxZD06eEoiOwogICAgICAgICRSdDFvLT5vUnQgPSAkUnQxby0+ZFktPlU1elVwNXooJFRIejVLKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzoxaGR6MF9QNTdIVV8xZCcsICQxaGR6MF9QNTdIVV8xZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzoxaGR6MF9QNTdIVV9GMXp1ZG8nLCAkMWhkejBfUDU3SFVfRjF6dWRfMWRvLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6eEonLCAkMWQsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICA1elJINWggJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgfQoKICAgIC8vTU4tSWctZ0lNUQogICAgRkhocVIxN2ggSFVkcFJ6OXBSelA3NUtBTEpKN3FvelIycHVIeigkMWQsICRxcFJ6UDc1S18xZG8sICRkN3FvelJfMWRvKSB7Ci8vICAgICAgICAkVEh6NUsgPSAic0VKQVdjIDFoZHowX2Zwb1J6NV81elU3NVIga2NXIGQ3cV9velJfMWRvPTpkN3Ffb3pSXzFkbywgcXBSelA3NUtfMWRvPTpxcFJ6UDc1S18xZG8gbmxjM2MgMWQ9OnhKIjsKICAgICAgICAkVEh6NUsgPSAic0VKQVdjIDFoZHowX2Zwb1J6NV81elU3NVIga2NXIGQ3cV9velJfMWRvPSckZDdxb3pSXzFkbycsIHFwUnpQNzVLXzFkbz0nJHFwUnpQNzVLXzFkbycgbmxjM2MgMWQ9JDFkIjsKCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwovLyAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6ZDdxX296Ul8xZG8nLCAkZDdxb3pSXzFkbywgRUp5OjpFQTNBWl9rVzMpOwovLyAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6cXBSelA3NUtfMWRvJywgJHFwUnpQNzVLXzFkbywgRUp5OjpFQTNBWl9rVzMpOwovLyAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6eEonLCAkMWQsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICA1elJINWggJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgfQogICAgCiAgICAvL0lOLUl2LWdJTVEgWUsgYjFkdEtwCiAgICBGSGhxUjE3aCBvcGJ6M3pVNzVSRXBSUno1aCgpIHsKICAgICAgICAkVEh6NUsgPSAieExrYzNXIHhMV3kgMWhkejBfZnBvUno1XzV6VTc1UiggaHBmeiw1elU3NVJfUktVeiwgUjUxUFB6NV9GMXp1ZCwgVXo1MTdkLCBVejUxN2RfZEg1cFIxN2gsIHFwUnpQNzVLXzFkLCAxaGR6MF9mcG9SejUsIDFoZHowX2Zwb1J6NV9GMXp1ZG8sIDFoZHowX1A1N0hVXzFkLCAxaGR6MF9QNTdIVV9GMXp1ZG8sIHBkZHpkX1lLLG9wYnpfVXBSUno1aCxxcFJ6UDc1S18xZG8sb3F0emRIdXo1X3pmcDF1XzFkbyxvcXR6ZEh1el9vUnBSSG8sb3F0emRIdXo1X1V6NTE3ZCxvcXR6ZEh1ejVfVXo1MTdkX2RINXBSMTdoLHowVTc1Ul9SS1V6LG9ScDVSX2RwUnosaHowUl9kcFJ6LHVwb1JfZHBSeixkN3Ffb3pSXzFkbykgIgogICAgICAgICAgICAgICAgLiAiMkFDc2NrICg6THBmeiw6M3pVNzVSX1dLVXosOlc1MVBQejVfajF6dWQsOkV6NTE3ZCw6RXo1MTdkSkg1cFIxN2gsOjlwUnpQNzVLeGQsOnhoZHowX1pwb1J6NSwgOnhoZHowX1pwb1J6NV9qMXp1ZG8sOnhoZHowX2U1N0hVLCA6eGhkejBfZTU3SFVfajF6dWRvLCA6c296NV94ZCwgOkVwUlJ6NWgsIDo5cFJ6UDc1S18xZG8sIDprcXR6ZEh1ejVfemZwMXVvXzFkbywgOmtxdHpkSHV6X29ScFJIbywgOmtxdHpkSHV6NV9VejUxN2QsOmtxdHpkSHV6NV9VejUxN2RfZEg1cFIxN2gsOmMwVTc1Ul9SS1V6LDprUnA1Ul9kcFJ6LDpMejBSX2RwUnosOkNwb1JfZHBSeiw6SjdxX296Ul8xZG8pIjsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6THBmeicsICRSdDFvLT41elU3NVJfaHBmeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjN6VTc1Ul9XS1V6JywgJFJ0MW8tPjV6VTc1Ul9SS1V6LCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6VzUxUFB6NV9qMXp1ZCcsICRSdDFvLT5SNTFQUHo1X0YxenVkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6RXo1MTdkJywgJFJ0MW8tPlV6NTE3ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjlwUnpQNzVLeGQnLCAkUnQxby0+cXBSelA3NUsxZCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkV6NTE3ZEpINXBSMTdoJywgJFJ0MW8tPlV6NTE3ZF9kSDVwUjE3aCwgRUp5OjpFQTNBWl94TFcpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX1pwb1J6NScsICRSdDFvLT4xaGR6MF9mcG9SejUsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4aGR6MF9acG9SejVfajF6dWRvJywgJFJ0MW8tPjFoZHowX2Zwb1J6NV9GMXp1ZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzp4aGR6MF9lNTdIVScsICRSdDFvLT4xaGR6MF9QNTdIVSwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhoZHowX2U1N0hVX2oxenVkbycsICRSdDFvLT4xaGR6MF9QNTdIVV9GMXp1ZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpzb3o1X3hkJywgJFJ0MW8tPkhvejUxZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkVwUlJ6NWgnLCAkUnQxby0+VXBSUno1aCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOjlwUnpQNzVLXzFkbycsICRSdDFvLT5xcFJ6UDc1S18xZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzprcXR6ZEh1ejVfemZwMXVvXzFkbycsICRSdDFvLT5vcXR6ZEh1ejVfemZwMXVvXzFkbywgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOmtxdHpkSHV6X29ScFJIbycsICRSdDFvLT5vUnBSSG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzprcXR6ZEh1ejVfVXo1MTdkJywgJFJ0MW8tPm9xdHpkSHV6NV9VejUxN2QsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzprcXR6ZEh1ejVfVXo1MTdkX2RINXBSMTdoJywgJFJ0MW8tPm9xdHpkSHV6NV9VejUxN2RfZEg1cFIxN2gsIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpjMFU3NVJfUktVeicsICRSdDFvLT56MFU3NVJfUktVeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOmtScDVSX2RwUnonLCAkUnQxby0+b1JwNVJfZHBSeiwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOkx6MFJfZHBSeicsICRSdDFvLT5oejBSX2RwUnosIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT5ZMWhkMnB1SHooJzpDcG9SX2RwUnonLCAkUnQxby0+dXBvUl9kcFJ6LCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6SjdxX296Ul8xZG8nLCAkUnQxby0+ZDdxX296Ul8xZG8sIEVKeTo6RUEzQVpfa1czKTsKICAgICAgICAkUnQxby0+b1J0LT56MHpxSFJ6KCk7CiAgICAgICAgNXpSSDVoICRSdDFvLT5kWS0+dXBvUnhob3o1UnhkKCk7CiAgICB9CiAgICAKICAgIEZIaHFSMTdoIEhVZHBSemU1cHF6RXo1MTdkKCQxZCwgJFA1cHF6X1V6NTE3ZCkgewogICAgICAgICRUSHo1SyA9ICJzRUpBV2MgMWhkejBfZnBvUno1XzV6VTc1UiBrY1cgUDVwcXpfVXo1MTdkPTplM0E5Y19FYzN4eUogbmxjM2MgMWQ9OnhKIjsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6ZTNBOWNfRWMzeHlKJywgJFA1cHF6X1V6NTE3ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhKJywgJDFkLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgNXpSSDVoICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgIH0KCiAgICBGSGhxUjE3aCB6ZDFSY3BxdDJwdUh6a3F0emRIdXo1M3pVNzVSKCQxZCwgJEZ1cFAsICR6ZnAxdV9GMXp1ZCkgewoKICAgICAgICAkVEh6NUsgPSAic0VKQVdjIDFoZHowX2Zwb1J6NV81elU3NVIgIgogICAgICAgICAgICAgICAgLiAiIGtjVyBmcDF1X3pwcXRfRnVwUD06WkF4Q2NBOWxqQ0FlLCB6ZnAxdV9GMXp1ZD06Y1pBeENqeGNDSiAiCiAgICAgICAgICAgICAgICAuICIgbmxjM2MgMWQ9OnhKIjsKCiAgICAgICAgJFJ0MW8tPm9SdCA9ICRSdDFvLT5kWS0+VTV6VXA1eigkVEh6NUspOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOlpBeENjQTlsakNBZScsICRGdXBQLCBFSnk6OkVBM0FaX2tXMyk7CiAgICAgICAgJFJ0MW8tPm9SdC0+WTFoZDJwdUh6KCc6Y1pBeENqeGNDSicsICR6ZnAxdV9GMXp1ZCwgRUp5OjpFQTNBWl9rVzMpOwogICAgICAgICRSdDFvLT5vUnQtPlkxaGQycHVIeignOnhKJywgJDFkLCBFSnk6OkVBM0FaX3hMVyk7CiAgICAgICAgNXpSSDVoICRSdDFvLT5vUnQtPnowenFIUnooKTsKICAgIH0KCiAgICBGSGhxUjE3aCBQelJBdXUzSGhoMWhQM3pVNzVSX3pwcXRfZnBvUno1X2JwdUh6KCkgewogICAgICAgICRUSHo1SyA9ICJrenV6cVIgKiBGNTdmIDFoZHowX2Zwb1J6NV81elU3NVIgd3R6NXogZnAxdV96cHF0X0Z1cFAgPSBNIjsKICAgICAgICAkUnQxby0+b1J0ID0gJFJ0MW8tPmRZLT5VNXpVcDV6KCRUSHo1Syk7CiAgICAgICAgJFJ0MW8tPm9SdC0+ejB6cUhSeigpOwogICAgICAgICRSdDFvLT41elJINWggPSAkUnQxby0+b1J0LT5GelJxdEF1dSgpOwogICAgICAgIDV6Ukg1aCAkUnQxby0+NXpSSDVoOwogICAgfQoKfQo=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwnRUFETHh1SDlSelNHY0lXb2wzSmhLZDhzam42cFE3TnFaWFl5d1UyMWdiVE1lQzVyUGFta3RPMGY0aUJWdkYnLCdQQVpOSWx1Q3RlS2tFMFRzSFJEbnlkelVGV1hhN281Y01CYk93cFZpMnZxMUdMcmpnSlFTaDh4bVkzNjk0ZicpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>
Function Calls
strtr | 1 |
strrev | 1 |
str_replace | 1 |
base64_decode | 2 |
Stats
MD5 | 62b4f44fd26952a218b7200c0d9fa10b |
Eval Count | 2 |
Decode Time | 1384 ms |