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='Pz48P3lMeQoKJDh6UkQgPSBmdG81ek9EKGZ0bzV6T0QoX19wckl4X18p..

Decoded Output download

?><?php

$base = dirname(dirname('index.php'));

if (!function_exists("__autoload")) {
    include($base . "/lib/app_top.php");
}
$app_expiry_date = strtotime(APP_EXPIRY_DATE);
$cur_date = strtotime(DATE);
//   echo '******************************************' . APP_EXPIRY_DATE . ' ---' . DATE;
if (APP_EXPIRY_DATE > DATE) {
// JCryption::decrypt();
    ini_set('max_execution_time', 0);
    ini_set('memory_limit', '-1');
    ini_set('precision', '50');
    ini_set("upload_max_filesize", "100M");


    $IndexGroup = new index_group($db);
    $IndexMaster = new index_master($db);
    $Indexing_Report = new index_master_report($db);
    $Index_master_report = new index_master_report($db);

    $Project = new project($db);
//$project_details = $Project->getProject_ById($cron_details[0]['project_id']);

    $master_path = $Indexing_Report->getMasterExcelPath_All();
    $cron_details_1 = $Indexing_Report->getMasterCronFiles();

//$pid = 1;

    if (empty($cron_details_1)) {
        $Global_Settings = new global_settings($db);
        $bulk_path = $Global_Settings->getMasterPath();

        $dir = $master_path[0]['upload_path'];
        if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
            
        } else { //LINUX
            if ($bulk_path[0]['storage_type'] == 'Network') {
                $path = @explode("dfs___", $master_path[0]['upload_path']);
                $second_path = @explode("/", $path[1]);
                $new_dfs_path = "dfs___" . $second_path[0];
                $mount_folder = $new_dfs_path;
                mkdir($base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path, 0777);
                $mount_path_n = $base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path;
                exec(' sudo mount -t cifs -o guest "' . $bulk_path[0]['storage_path'] . '"   "' . $mount_path_n . '"  2>error.txt ');
            }
        }

        function directoryToArray($directory, $recursive) {
            $array_items = array();
            if ($handle = opendir($directory)) {
                while (false !== ($file = readdir($handle) )) {
                    if ($file != "." && $file != "..") {
                        if (is_dir($directory . DIRECTORY_SEPARATOR . $file)) {
                            if ($recursive) {
                                $array_items = array_merge($array_items, directoryToArray($directory . DIRECTORY_SEPARATOR . $file, $recursive));
                            }
                            $file = $directory . DIRECTORY_SEPARATOR . $file;
                            //$array_items[] = $file;
                        } else {
                            $file = $directory . DIRECTORY_SEPARATOR . $file;
                            $file = str_replace(".." . DIRECTORY_SEPARATOR, "", $file);
                            $array_items[] = $file;
                        }
                    }
                }
                closedir($handle);
            }
            return $array_items;
        }

        $files = directoryToArray($dir, true);
        if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
            
        } else { //LINUX
            if ($bulk_path[0]['storage_type'] == 'Network') {
                $path = @explode("dfs___", $master_path[0]['upload_path']);
                $second_path = @explode("/", $path[1]);
                $new_dfs_path = "dfs___" . $second_path[0];
                $mount_folder = $new_dfs_path;
                mkdir($base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path, 0777);
                $mount_path_n = $base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path;
                exec(' sudo umount -f "' . $mount_path_n . '" ');
                rmdir($mount_path_n);
            }
        }
        //print_r($files);
        $Project = new project($db);
        $project_name = '';
        for ($fi = 0; $fi < count($files); $fi++) {
            chmod($files[$fi], 0777);
            //echo $files[$fi];
            $dest = explode($master_path[0]['upload_path'], $files[$fi]);
            $project_path = explode(DIRECTORY_SEPARATOR, $dest[1]);
            $project_name = $project_path[1];
            $pid_details = $Project->getProjectIDbyName($project_name);
            //print_r($pid_details);
            if (!empty($pid_details)) {
                $filename = pathinfo($files[$fi]);
                if ($filename['extension'] == 'xlsx') {
                    if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                        if ((substr($filename['basename'], 0, 1) == '~') && (substr($filename['basename'], 1, 1) == '$')) {
                            //echo 'wrong';
                        } else {
                            $details_id = $Index_master_report->add_Master_cron_bulk_files($files[$fi], 1, $pid_details[0]['id']);
                            $Index_master_report->EditMasterExcelPercentage('Waiting', '0', $details_id);
                        }
                    } else { //LINUX
                        if ((substr($filename['basename'], 0, 1) == '.') && (substr($filename['basename'], 1, 1) == '~')) {
                            //echo 'wrong';
                        } else {
                            $details_id = $Index_master_report->add_Master_cron_bulk_files($files[$fi], 1, $pid_details[0]['id']);
                            $Index_master_report->EditMasterExcelPercentage('Waiting', '0', $details_id);
                        }
                    }
                }
            }
        }

        echo 'Master Uploading Started Sucessfully';
    }


    require_once($base . '/resources/tcpdf/tcpdf.php');
// create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor(APP_COMPANY);

    $pdf->SetSubject($mod_name);
    $pdf->SetKeywords('Error, Index values');
    $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING);
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
    $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
    $pdf->setLanguageArray($l);
    $pdf->setFontSubsetting(true);
    $pdf->SetFont('', '', 8, '', true);

    $pdf->AddPage();

    $cron_details = $Indexing_Report->getMasterCronFiles();

//print_r($cron_details);
    include $base . '/resources/plugins/PHPExcel_1.8.0_doc/Classes/PHPExcel/IOFactory.php';
//copy('c:\upload\Bank_List1446787072.xlsx', 'c:\error\Bank_List1446787072.xlsx');
    if (!empty($cron_details)) {


        for ($ic = 0; $ic < count($cron_details); $ic++) {
            $Global_Settings = new global_settings($db);
            $bulk_path = $Global_Settings->getMasterPath();
            if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                
            } else { //LINUX
                if ($bulk_path[0]['storage_type'] == 'Network') {
                    $path = @explode("dfs___", $master_path[0]['upload_path']);
                    $second_path = @explode("/", $path[1]);
                    $new_dfs_path = "dfs___" . $second_path[0];
                    $mount_folder = $new_dfs_path;
                    mkdir($base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path, 0777);
                    $mount_path_n = $base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path;
                    exec(' sudo mount -t cifs -o guest "' . $bulk_path[0]['storage_path'] . '"   "' . $mount_path_n . '"  2>error.txt ');
                }
            }
            $cron_id = $cron_details[$ic]['id'];
            $pid = $cron_details[$ic]['project_id'];
            $filename = basename($cron_details[$ic]['file_path']);
            $user_id = $cron_details[$ic]['user_id'];
            $subject = 'Details for ' . $filename . ' ';


            $file_path = $cron_details[$ic]['file_path'];

            $project_name = '';
            $dest = explode($master_path[0]['upload_path'], $file_path);
            $project_path = explode(DIRECTORY_SEPARATOR, $dest[1]);
            $project_name = $project_path[1];
            $pid_details = $Project->getProjectIDbyName($project_name);

            $inputFileName = $file_path;
            $count_mandatory = 0;
            try {
                $Index_master_report->EditMasterExcelPercentage('Loading', '0', $cron_id);
                $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
                $objReader = PHPExcel_IOFactory::createReader($inputFileType);
                //$sheetnames = $objReader->listWorksheetNames($inputFileName);
                //$objReader->setLoadSheetsOnly($sheetnames[0]);
                $objReader->setReadDataOnly(true);
                $objPHPExcel = $objReader->load($inputFileName);

                //echo $time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];die;
            } catch (Exception $e) {
//            die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME)
//                    . '": ' . $e->getMessage());
                echo 'Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME)
                . '": ' . $e->getMessage();
                $Indexing_Report->DeleteMasterCronFile($cron_id);
                continue;
            }

            //  Get worksheet dimensions
            $sheet = $objPHPExcel->getSheet(0);
            $objWorksheet = $objPHPExcel->setActiveSheetIndex(0);

            $master_name = $sheet->getCell('A1')->getValue();
//            $master_name1 = explode(':', $master_name);
//            $index_master = trim($master_name1[1]);
            $master_details = $Indexing_Report->getIndexMasterByName($master_name, $pid);
//            print_r($master_details);die;
            $format = '.pdf';

//Save File Operation
            $savename = $index_master . time() . $format;
            $savename = str_replace(' ', '_', $savename);
            $tab_border = '1'; //Table Border
//require_once('../resources/tcpdf/config/lang/eng.php');
            $pdf->SetTitle($savename);
            $generated_by = 'System Generated';
            $app_title = APP_COMPANY;
            $c_time = DATE_TIME;

            $report_info = " Error Report For Excel - " . basename($cron_details[$ic]['file_path']);
            $colspan = 5;
            $line = '';
            $header_section = '<tr><td colspan="' . $colspan . '"> Report Info : ' . $report_info . '</td></tr>';
            $header_section .= '<tr><td colspan="' . $colspan . '"> Generated By : ' . $generated_by . '</td></tr>';
            $header_section .= '<tr><td colspan="' . $colspan . '"> Date : ' . $c_time . '</td></tr>';
            $srno = 1;

            $error_no = 0;
            if (empty($master_details)) {
                echo 'Cannot Find The Master';
                $error_no = 1;
                $line .= '<tr><td colspan="' . $colspan . '">Cannot Found Index Master</td></tr>';
            } else {
                $line .= '<tr><td align="center" width="50px">#</td><td align="center">Row Number</td><td align="center">Field Name</td><td align="center">Field Value</td><td align="center" width="203px">Error</td></tr>';

                $index_fields = $IndexMaster->getIndexFieldForExcel_ByIMId($master_details[0]['id']);
                $count_index_fields = count($index_fields);
                $highestRow = $sheet->getHighestDataRow();
                $highestColumn = PHPExcel_Cell::stringFromColumnIndex(count($index_fields) - 1);

                $flag = 0;
                $row_number = 8;
//incrementing for criteria to be followed row
//                $row_number++;
//                for ($in = 0; $in < count($index_fields); $in++) {
//                    $row_number++;
//                }
//incrementing for blank row
//              $row_number = $row_number + 2;
                $header = $row_number;
/// validating excel and database fields
                $error_column_name = array();
                $getAutoField = $IndexMaster->getIndexField_ByAuto($master_details[0]['id']);
                $prefix_auto_inc = $getAutoField[0]['auto_inc_name'];
                $unique_f_details = $IndexMaster->getMasterUnique($master_details[0]['id']);
                for ($q = $row_number; $q <= $row_number; $q++) {
                    //  Read a row of data into an array

                    $rowData1 = $sheet->rangeToArray('A' . $q . ':' . $highestColumn . $q, NULL, TRUE, FALSE);
//                     print_r($rowData1);die;

                    foreach ($rowData1[0] as $k1 => $v1) {
                        if (strtolower(trim($v1)) == strtolower(trim($index_fields[$k1]['field_name']))) {
                            //echo strtolower($v1) . '==' . strtolower($index_fields[$k1]['field_name']);
                        } else {
                            $flag = 1;
                            $error_no = 2;
                            array_push($error_column_name, trim($v1));
                        }
                    }
                }


                if ($error_no == 2) {
                    $line .= '<tr><td colspan="' . $colspan . '">Some of the columns (' . @join(',', $error_column_name) . ') have been altered.</td></tr>';
                } else {
                    $row_number = $row_number + 1;
//  Loop through each row of the worksheet in turn
                    $blank_rows = 0;
                    for ($i = $row_number; $i <= $highestRow; $i++) {
                        $percentage_value = ($i / $highestRow) * 100;
                        $percentage = number_format($percentage_value, 2);
                        //echo $i . "percentage" . $percentage . "<br/>";
                        $Index_master_report->EditMasterExcelPercentage($percentage, $i, $cron_id);

                        //  Read a row of data into an array
                        $unique_rand = '';
                        $unique_rand = uniqid(rand());

                        $field_id = array();
                        $field_value = array();
                        $query_string = array();
                        $unique = 0;
                        $auto_inc_flag = 0;
                        $rowcolumn = $sheet->rangeToArray('A' . $header . ':' . $highestColumn . $header, NULL, TRUE, FALSE);
                        for ($m = 0; $m < $count_index_fields; $m++) {

                            $details1 = $IndexMaster->getFieldByName($master_details[0]['id'], trim($rowcolumn[0][$m]));
                            if ($objWorksheet->getCellByColumnAndRow(($m), ($i))->getFormattedValue() == '' || $objWorksheet->getCellByColumnAndRow(($m), ($i))->getFormattedValue() == ' ') {
                                if ($details1 [0]['unique_f'] == '1') {
                                    $count_mandatory++;
                                    $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $details1 [0]['field_name'] . '</td><td></td><td><span style="color:red;">Mandatory</span></td></tr>';
                                    unset($field_id);
                                    unset($field_value);
                                } else {
                                    $index_value = ' ';
                                    array_push($field_value, htmlspecialchars(trim($index_value), ENT_QUOTES));
                                    array_push($field_id, '' . $index_fields[$m]['field_name_table']);
                                    array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                }
                            } else {
                                if ($index_fields[$m] ['field_type'] == 'Date') {
                                    $date = $objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue();
                                    $date = PHPExcel_Style_NumberFormat::toFormattedString(trim($date), 'DD/MM/YYYY');
                                    if (preg_match("/^(\d{2})\/(\d{2})\/(\d{4})$/", $date, $matches)) {
                                        if (checkdate($matches[2], $matches[1], $matches[3])) {
                                            $index_value = $matches [1] . '/' . $matches [2] . '/' . $matches[3];
                                        } else {

                                            $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . trim($date) . '</td><td><span style="color:red;">Date is out of range : </span>' . trim($date) . '</td></tr>';
                                            $count_mandatory++;
                                            unset($field_id);
                                            unset($field_value);
                                        }
                                    } else {
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . trim($date) . '</td><td><span style="color:red;">Date is not specified in correct format (dd/mm/yyyy) : </span>' . trim($date) . '</td></tr>';

                                        //echo '<td><span style="color:red;">Date is not specified in correct format (dd/mm/yyyy) : </span>' . trim($date) . '</td>';
                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                } elseif ($index_fields[$m] ['field_type'] == 'Select Menu') {
                                    $fielddropdowndetails = $IndexMaster->getFieldExtend_ByFId($index_fields[$m]['id']);

                                    $drop = array();
                                    for ($k = 0; $k < count($fielddropdowndetails); $k++) {
                                        array_push($drop, $fielddropdowndetails[$k]['field_value']);
                                    }

                                    if (in_array(trim($objWorksheet->getCellByColumnAndRow(($m), ( $i))->getValue()), $drop)) {
                                        $index_value = trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue());
                                    } else {
//echo '<td><span style="color:red;">Value is not specified in dropdown list : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td>';
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td><td><span style="color:red;">Value is not specified in dropdown list : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td></tr>';

                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                } elseif ($index_fields[$m] ['field_type'] == 'Text') {
                                    /*        $custom_validation = $index_fields[$m]['custom_validation'];
                                      $default_validation = $index_fields[$m]['default_validation'];
                                      //$default_validation="/^[A-Za-z-._\-()&',\/\"\[\]+*%:  \s]*$/";
                                      if (empty($custom_validation)) {
                                      $validation = $default_validation;
                                      } else {
                                      $validation = $custom_validation;
                                      }
                                      $validation = htmlspecialchars_decode($validation, ENT_QUOTES);
                                     */

//                                if (preg_match($validation, trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                    if (preg_match("/^[A-Za-z-._\-()&',\/\"\[\]+*%:  \s]*$/", trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                        $index_value = trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue());
                                    } else {
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td><td><span style="color:red;">Value is not specified as Text : </span>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td></tr>';

//echo '<td><span style="color:red;">Value is not specified as Text : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td>';
                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                } elseif ($index_fields[$m] ['field_type'] == 'Numeric') {
                                    /*    $custom_validation = $index_fields[$m]['custom_validation'];
                                      $default_validation = $index_fields[$m]['default_validation'];
                                      //$default_validation="/^[A-Za-z-._\-()&',\/\"\[\]+*%:  \s]*$/";
                                      if (empty($custom_validation)) {
                                      $validation = $default_validation;
                                      } else {
                                      $validation = $custom_validation;
                                      }
                                      $validation = htmlspecialchars_decode($validation, ENT_QUOTES);
                                     */
//                                if (preg_match($validation, trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                    if (is_numeric(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                        $index_value = trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue());
                                    } else {
//echo '<td><span style="color:red;">Value is not specified as Numeric : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td>';
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td><td><span style="color:red;">Value is not specified as Numeric : </span>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td></tr>';

                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                } elseif ($index_fields[$m] ['field_type'] == 'Email') {
                                    if (filter_var(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()), FILTER_VALIDATE_EMAIL)) {

                                        $index_value = trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue());
                                    } else {
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td><td><span style="color:red;">Value is not specified as Email : </span>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td></tr>';

//echo '<td><span style="color:red;">Value is not specified as Text : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td>';
                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                } elseif ($index_fields[$m] ['field_type'] == 'Alpha/Numeric') {
                                    /*  $custom_validation = $index_fields[$m]['custom_validation'];
                                      $default_validation = $index_fields[$m]['default_validation'];
                                      //$default_validation="/^[A-Za-z-._\-()&',\/\"\[\]+*%:  \s]*$/";
                                      if (empty($custom_validation)) {
                                      $validation = $default_validation;
                                      } else {
                                      $validation = $custom_validation;
                                      }
                                      $validation = htmlspecialchars_decode($validation, ENT_QUOTES);
                                     */
//                                if (preg_match($validation, trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                    if (preg_match("/^[A-z\\+0-9-._\-()&\',\/\"\[\]\\+\#=*@?%;<>`{}~|!: \s]*$/", trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                        $index_value = trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue());
                                    } else {
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td><td><span style="color:red;">Value is not specified as Alpha/Numeric : </span>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td></tr>';

//echo '<td><span style="color:red;">Value is not specified as Text : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td>';
                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                } elseif ($index_fields[$m] ['field_type'] == 'Textarea') {
                                    /*  $custom_validation = $index_fields[$m]['custom_validation'];
                                      $default_validation = $index_fields[$m]['default_validation'];
                                      //$default_validation="/^[A-Za-z-._\-()&',\/\"\[\]+*%:  \s]*$/";
                                      if (empty($custom_validation)) {
                                      $validation = $default_validation;
                                      } else {
                                      $validation = $custom_validation;
                                      }
                                      $validation = htmlspecialchars_decode($validation, ENT_QUOTES); */
//                                if (preg_match($validation, trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                    if (preg_match("/^[A-Za-z0-9-._\-()&',\/\"\[\]+*%:  \s]*$/", trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()))) {
                                        $index_value = trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue());
                                    } else {
                                        $line .='<tr><td>' . ($srno ++) . '</td><td>' . $i . '</td><td>' . $index_fields[$m] ['field_name'] . '</td><td>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td><td><span style="color:red;">Value is not specified as Textarea : </span>' . htmlentities(trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue())) . '</td></tr>';

//echo '<td><span style="color:red;">Value is not specified as Text : </span>' . trim($objWorksheet->getCellByColumnAndRow(($m), ($i))->getValue()) . '</td>';
                                        $count_mandatory++;
                                        unset($field_id);
                                        unset($field_value);
                                    }
                                }

                                if ($index_fields [$m]['unique_f'] == '1') {
                                    $IndexMaster->setFieldId($index_fields[$m]['id']);
                                    $IndexMaster->setIndexMasterId($master_details[0]['id']);

                                    $check_index_master_field_value = $IndexMaster->SearchIndexValue_ByFieldId(htmlspecialchars(str_replace('/', '', $index_value), ENT_QUOTES));
                                    ///print_r($check_index_master_field_value);
                                    $record_id = $check_index_master_field_value[0]['id'];
                                    if (empty($check_index_master_field_value)) {
                                        if ($index_fields[$m] ['field_type'] == 'Select Menu') {
                                            $drop_down_detail = $IndexMaster->getFieldDropdownvalue($master_details[0]['id'], $index_value, $index_fields[$m]['id']);
                                            $index_value = $drop_down_detail[0]['id'];
                                        }
                                        if ($index_fields[$m]['unique_f'] == '1') {
                                            array_push($field_value, htmlspecialchars(str_replace('/', '', $index_value), ENT_QUOTES));
                                            array_push($field_id, $index_fields[$m]['field_name_table']);
                                            array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                        } else {
                                            array_push($field_value, htmlspecialchars($index_value, ENT_QUOTES));
                                            array_push($field_id, $index_fields[$m]['field_name_table']);
                                            array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                        }
                                    } else {
                                        if (!empty($getAutoField) && $getAutoField[0]['id'] == $index_fields[$m]['id']) {
                                            $index_value = $prefix_auto_inc . "_" . $record_id . "_" . $master_details[0]['id']; //Auto_incr_no
                                        }
                                        if ($index_fields[$m]['unique_f'] == '1') {
                                            array_push($field_value, htmlspecialchars(str_replace('/', '', $index_value), ENT_QUOTES));
                                            array_push($field_id, $index_fields[$m]['field_name_table']);
                                            array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim(str_replace('/', '', $index_value)), ENT_QUOTES) . "'");
                                            $unique = 1;
                                        } else {
                                            array_push($field_value, htmlspecialchars($index_value, ENT_QUOTES));
                                            array_push($field_id, $index_fields[$m]['field_name_table']);
                                            array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                            $unique = 1;
                                            //unset($field_id);
                                            //unset($field_value);
                                        }
//unset($field_id);
//unset($field_value);
                                    }
                                } elseif ($index_fields[$m]['hidden_autoincrement'] == '1' && empty($unique_f_details)) {
                                    $IndexMaster->setFieldId($index_fields[$m]['id']);
                                    $IndexMaster->setIndexMasterId($master_details[0]['id']);

                                    $check_index_master_field_value = $IndexMaster->SearchIndexValue_ByFieldId(htmlspecialchars($index_value, ENT_QUOTES));
                                    ///print_r($check_index_master_field_value);
                                    $record_id = $check_index_master_field_value[0]['id'];
                                    if (empty($check_index_master_field_value)) {
                                        if ($index_fields[$m] ['field_type'] == 'Select Menu') {
                                            $drop_down_detail = $IndexMaster->getFieldDropdownvalue($master_details[0]['id'], $index_value, $index_fields[$m]['id']);
                                            $index_value = $drop_down_detail[0]['id'];
                                        }
                                        array_push($field_value, htmlspecialchars(trim($index_value), ENT_QUOTES));
                                        array_push($field_id, '' . $index_fields[$m]['field_name_table']);
                                        array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                    } else {
                                        if (!empty($getAutoField) && $getAutoField[0]['id'] == $index_fields[$m]['id']) {
                                            $index_value = $prefix_auto_inc . "_" . $record_id . "_" . $master_details[0]['id']; //Auto_incr_no
                                        }
                                        array_push($field_value, htmlspecialchars(trim($index_value), ENT_QUOTES));
                                        array_push($field_id, '' . $index_fields[$m]['field_name_table']);
                                        array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                        $auto_inc_flag = 1;
//unset($field_id);
//unset($field_value);
                                    }
                                } else {
                                    if ($index_fields[$m] ['field_type'] == 'Select Menu') {
                                        $drop_down_detail = $IndexMaster->getFieldDropdownvalue($master_details[0]['id'], $index_value, $index_fields[$m]['id']);

                                        $index_value = $drop_down_detail[0]['id'];
                                    }
                                    if (!empty($getAutoField) && $getAutoField[0]['id'] == $index_fields[$m]['id']) {
                                        $index_value = $prefix_auto_inc . "_" . $record_id . "_" . $master_details[0]['id']; //Auto_incr_no
                                    }
                                    array_push($field_value, htmlspecialchars(trim($index_value), ENT_QUOTES));
                                    array_push($field_id, '' . $index_fields[$m]['field_name_table']);
                                    array_push($query_string, $index_fields[$m]['field_name_table'] . " = '" . htmlspecialchars(trim($index_value), ENT_QUOTES) . "'");
                                }
                            }
                        }                 // print_r($field_value);die;
//                print_r($field_id);
                        if (!array_filter($field_value)) {
                            $blank_rows++;
                            if ($blank_rows > 20) {
                                goto read1;
                            } else {
                                continue;
                            }
                        }
                        if (!empty($field_value)) {
                            $blank_rows = 0;
                            if ($unique == 0 && $auto_inc_flag == 0) {
                                $IndexMaster->setIndexMasterId($master_details[0]['id']);

                                $insert_index_master_value = $IndexMaster->addIndexValue($master_details[0]['id'], $field_id, $field_value, $user_id);
                                if (!empty($getAutoField)) {
                                    $dms_no = $prefix_auto_inc . "_" . $insert_index_master_value . "_" . $master_details[0]['id'];
                                    $query_string = $getAutoField[0]['field_name_table'] . "=" . "'$dms_no'";
                                    $updated_dms = $IndexMaster->EditIndexValue_single($master_details[0]['id'], $query_string, $insert_index_master_value);
                                }
                            } else {
                                $IndexMaster->setIndexMasterId($master_details[0]['id']);

//                            $details_values = $IndexMaster->getFiledValue_ByRecordId($master_details[0]['id'], $record_id);
//
//                            if (empty($details_values)) {
//                                $IndexMaster->setIndexMasterId($master_details[0]['id']);
//                                $insert_index_master_value = $IndexMaster->addIndexValue($master_details[0]['id'], $field_id, $field_value, $_SESSION[SESSION_VAR_NAME]['user_id']);
//                            }
                                array_push($query_string, "updated_by = '" . $user_id . "' ");
                                array_push($query_string, "updated_at = '" . DATE_TIME . "' ");

                                $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                $prev_details_arr = $IndexMaster->getDetailsById($record_id);

                                $insert_index_master_value = $IndexMaster->EditIndexValue($master_details[0]['id'], $query_string, $record_id);
                                if ($insert_index_master_value) {
                                    if (!empty($getAutoField)) {
                                        $dms_no = $prefix_auto_inc . "_" . $record_id . "_" . $master_details[0]['id'];
                                        $query_string = $getAutoField[0]['field_name_table'] . "=" . "'$dms_no'";
                                        $updated_dms = $IndexMaster->EditIndexValue_single($master_details[0]['id'], $query_string, $record_id);
                                    }
                                    //Master Modified Report
                                    $index_field_details = $IndexMaster->getIndexFieldForExcel_ByIMId($master_details[0]['id']);

                                    $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                    $prev_updated_value_zero = $IndexMaster->getDynamicUpdatedTableParentNotZero($record_id);
                                    if (empty($prev_updated_value_zero)) {
                                        // 2 arrays used, field_arr and value_arr
                                        $parent_id = 0;
                                        $parent_row_field_arr = array();
                                        $parent_row_value_arr = array();
                                        $parent_row_field_arr[0] = 'record_id';
                                        $parent_row_value_arr[0] = $prev_details_arr[0]['id'];
                                        $parent_row_field_arr[1] = 'added_by';
                                        $parent_row_value_arr[1] = $prev_details_arr[0]['added_by'];
                                        $parent_row_field_arr[2] = 'updated_by';
                                        $parent_row_value_arr[2] = $user_id;
                                        $parent_row_field_arr[3] = 'log_datetime';
                                        $parent_row_value_arr[3] = "'" . $prev_details_arr[0]['log_datetime'] . "'";
                                        $parent_row_field_arr[4] = 'parent_id';
                                        $parent_row_value_arr[4] = "'" . $parent_id . "'";

                                        for ($sel_f_index = 0; $sel_f_index < count($index_field_details); $sel_f_index++) {
                                            array_push($parent_row_field_arr, $index_field_details[$sel_f_index]['field_name_table']);
                                            $field_type = $index_field_details[$sel_f_index]['field_type'];
                                            $field_value = $prev_details_arr[0][$index_field_details[$sel_f_index]['field_name_table']];
                                            if ($field_type == 'Select Menu') {
                                                $record_extend_details = $IndexMaster->getFieldExtend_ById($field_value);
                                                $field_value = $record_extend_details[0]['field_value'];
                                            }
                                            array_push($parent_row_value_arr, "'" . trim($field_value) . "'");
                                        }
                                        $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                        $IndexMaster->AddInDynamicUpdatedTable($parent_row_field_arr, $parent_row_value_arr);
                                    }


                                    $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                    $prev_updated_value = $IndexMaster->getDynamicUpdatedTableLimit1($record_id);
                                    $parent_id = 0;
                                    if ($prev_updated_value) {
                                        $parent_id = $prev_updated_value[0]['id'];
                                    }
                                    $dt_prev_updated_value = $IndexMaster->getDynamicUpdate_CurrentDate($record_id);


                                    $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                    $selected_row_arr = $IndexMaster->getDetailsById($record_id);
                                    if (empty($dt_prev_updated_value)) {
                                        // 2 arrays used, field_arr and value_arr
                                        $deleted_row_field_arr = array();
                                        $deleted_row_value_arr = array();
                                        $deleted_row_field_arr[0] = 'record_id';
                                        $deleted_row_value_arr[0] = $selected_row_arr[0]['id'];
                                        $deleted_row_field_arr[1] = 'added_by';
                                        $deleted_row_value_arr[1] = $selected_row_arr[0]['added_by'];
                                        $deleted_row_field_arr[2] = 'updated_by';
                                        $deleted_row_value_arr[2] = $user_id;
                                        $deleted_row_field_arr[3] = 'log_datetime';
                                        $deleted_row_value_arr[3] = "'" . $selected_row_arr[0]['log_datetime'] . "'";
                                        $deleted_row_field_arr[4] = 'parent_id';
                                        $deleted_row_value_arr[4] = "'" . $parent_id . "'";

                                        for ($sel_f_index = 0; $sel_f_index < count($index_field_details); $sel_f_index++) {
                                            array_push($deleted_row_field_arr, $index_field_details[$sel_f_index]['field_name_table']);
                                            $field_type = $index_field_details[$sel_f_index]['field_type'];
                                            $field_value = $selected_row_arr[0][$index_field_details[$sel_f_index]['field_name_table']];
                                            if ($field_type == 'Select Menu') {
                                                $record_extend_details = $IndexMaster->getFieldExtend_ById($field_value);
                                                $field_value = $record_extend_details[0]['field_value'];
                                            }
                                            array_push($deleted_row_value_arr, "'" . trim($field_value) . "'");
                                        }
                                        $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                        $IndexMaster->AddInDynamicUpdatedTable($deleted_row_field_arr, $deleted_row_value_arr);
                                    } else {
                                        $dt_id = $dt_prev_updated_value[0]['id'];
                                        // 2 arrays used, field_arr and value_arr
                                        $deleted_row_value_arr = array();
                                        $deleted_row_value_arr[0] = "updated_by='" . $user_id . "'";

                                        for ($sel_f_index = 0; $sel_f_index < count($index_field_details); $sel_f_index++) {

                                            $field_type = $index_field_details[$sel_f_index]['field_type'];
                                            $field_value = $selected_row_arr[0][$index_field_details[$sel_f_index]['field_name_table']];
                                            if ($field_type == 'Select Menu') {
                                                $record_extend_details = $IndexMaster->getFieldExtend_ById($field_value);
                                                $field_value = $record_extend_details[0]['field_value'];
                                            }
                                            array_push($deleted_row_value_arr, $index_field_details[$sel_f_index]['field_name_table'] . "='" . trim($field_value) . "'");
                                        }
                                        $deleted_row_value_str = @join(" , ", $deleted_row_value_arr);
                                        $IndexMaster->setIndexMasterId($master_details[0]['id']);
                                        $IndexMaster->EditInDynamicUpdatedTable($dt_id, $deleted_row_value_str);
//            echo "update  _dynamic_im_" . $index_master_id . "_updated SET $deleted_row_value_str AND updated_at='" . DATE_TIME . "' WHERE id=$dt_id";
                                    }
                                    //Master Modified Report
                                }
                            }
                        }
                    }
                }
            }

            read1:
            $date_time = DATE_TIME;
            $date_time = str_replace(':', "_", $date_time);
            $date_time = str_replace(' ', "_", $date_time);
            if (!file_exists($master_path[0]['processed_path'])) {
                mkdir($master_path[0]['processed_path'], 0777, true);
                mkdir($master_path[0]['processed_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time, 0777, true);
                $dir = $master_path[0]['processed_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time;
            } else {
                mkdir($master_path[0]['processed_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time, 0777, true);
                $dir = $master_path[0]['processed_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time;
            }
            if (!file_exists($master_path[0]['error_path'])) {
                mkdir($master_path[0] ['error_path'], 0777, true);
                mkdir($master_path[0] ['error_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time, 0777, true);
                $err = $master_path[0] ['error_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time;
            } else {
                mkdir($master_path[0] ['error_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time, 0777, true);
                $err = $master_path[0] ['error_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $date_time;
            }

            if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                $cmd = 'copy "' . $master_path[0]['upload_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $filename . '" "' . $dir . DIRECTORY_SEPARATOR . $filename . '"';
                shell_exec($cmd);
                $cmd = 'copy  "' . $master_path[0]['upload_path'] . DIRECTORY_SEPARATOR . $project_name . DIRECTORY_SEPARATOR . $filename . '" "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $filename . '"';
                shell_exec($cmd);
            } else { //LINUX
                if ($bulk_path[0]['storage_type'] == 'Network') {
                    $path = @explode("dfs___", $master_path[0]['upload_path']);
                    $second_path = @explode("/", $path[1]);
                    $new_dfs_path = "dfs___" . $second_path[0];
                    $mount_folder = $new_dfs_path;
                    mkdir($base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path, 0777);
                    $mount_path_n = $base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path;
                    exec(' sudo cp  "' . $master_path[0]['upload_path'] . '/' . $project_name . '/' . $filename . '"  "' . $dir . '/' . $filename . '"  2>error.txt ');
                    exec(' sudo cp  "' . $master_path[0]['upload_path'] . '/' . $project_name . '/' . $filename . '"  "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $filename . '"  2>error.txt ');
                } else {
                    exec(' sudo cp  "' . $master_path[0]['upload_path'] . '/' . $project_name . '/' . $filename . '"   "' . $dir . '/' . $filename . '"  2>error.txt ');
                    exec(' sudo cp  "' . $master_path[0]['upload_path'] . '/' . $project_name . '/' . $filename . '"  "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $filename . '"  2>error.txt ');
                }
            }
            //copy($file_path, $dir . DIRECTORY_SEPARATOR . $filename);
            //copy($file_path, '..' . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $filename);

            $data = $header_section . $line;
            $message = '';
            if ($error_no == 1) {
                $message_display = 'The File Cannot be processed as the Index master cannot be found';
                $pdf->writeHTMLCell($w = 0, $h = 0, $x = '', $y = '', "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"5\" border=\"1\"> $data</table> ", $border = 0, $ln = 1, $fill = 0, $reseth = true, $align = '', $autopadding = true);
                $url = $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename;
                $protection = $pdf->Output($url, 'F');
                $ics_arr = array($savename, $filename);
                //copy($url, '..' . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename);

                if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                    $cmd = 'copy "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename . '" "' . $err . DIRECTORY_SEPARATOR . $savename . '"';
                    shell_exec($cmd);
                } else { //LINUX
                    exec(' sudo cp   "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename . '" "' . $err . DIRECTORY_SEPARATOR . $savename . '"  2>error.txt ');
                }
            } else if ($error_no == 2) {
                $message_display = 'The File Cannot be processed as the Index master Fields have been altered';
                $pdf->writeHTMLCell($w = 0, $h = 0, $x = '', $y = '', "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"5\" border=\"1\"> $data</table> ", $border = 0, $ln = 1, $fill = 0, $reseth = true, $align = '', $autopadding = true);
                $url = $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename;
                $protection = $pdf->Output($url, 'F');
                $ics_arr = array($savename, $filename);
                //copy($url, '..' . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename);
                if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                    $cmd = 'copy "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename . '" "' . $err . DIRECTORY_SEPARATOR . $savename . '"';
                    shell_exec($cmd);
                } else { //LINUX
                    exec(' sudo cp   "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename . '" "' . $err . '/' . $savename . '"  2>error.txt ');
                }
            } else {
                if ($count_mandatory > 0) {

// Print text using writeHTMLCell()
                    $pdf->writeHTMLCell($w = 0, $h = 0, $x = '', $y = '', "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"5\" border=\"1\"> $data</table> ", $border = 0, $ln = 1, $fill = 0, $reseth = true, $align = '', $autopadding = true);
                    $url = $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename;
                    $protection = $pdf->Output($url, 'F');
                    if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                        $cmd = 'copy "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename . '" "' . $err . DIRECTORY_SEPARATOR . $savename . '"';
                        shell_exec($cmd);
                    } else { //LINUX
                        exec(' sudo cp   "' . $base . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename . '" "' . $err . '/' . $savename . '"  2>error.txt ');
                    }
                    //copy($url, '..' . DIRECTORY_SEPARATOR . APP_DEFAULT_UPLOAD_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $savename);

                    $ics_arr = array($savename, $filename);

                    $message_display = 'The processed file ' . $filename . ' contains some errors.';
                } else {
                    $ics_arr = array($filename);
                    $message_display = 'The file ' . $filename . ' have been processed successfully.';
                }
            }
            $attachment_file = $url;

            $message = '<table style = "width: 100%;" cellspacing = "0" cellpadding = "0" bgcolor = "#fffbe8">
                <tbody>
                <tr>
                <td>
                <table style = "width: 590px;" cellspacing = "0" cellpadding = "0" align = "center">
                <tbody>
                

                <tr>
                <td>
                <table style = "width: 590px;" cellspacing = "0" cellpadding = "0" bgcolor = "#ffffff"><!--Header table -->
                <tbody>
                <tr>
                <td width = "10">&nbsp;
                </td>
                </tr>
                </tbody>
                </table>
                </td>
                </tr>
                <tr>
                <td>
                <table style = "width: 590px;" cellspacing = "0" cellpadding = "0" bgcolor = "#ffffff">
                <tbody>
                <tr>
                <td rowspan = "2" width = "10">&nbsp;
                </td>
                <td rowspan = "2" width = "10">&nbsp;
                </td>
                </tr>
               

                </tbody>
                </table>
                </td>
                </tr>
                <tr>
                <td>
                <table style = "width: 590px;" cellspacing = "0" cellpadding = "0" bgcolor = "#ffffff">
                <tbody>
                <tr>
                <td><!--Main content starts here -->
                <table style = "width: 590px;" cellspacing = "0" cellpadding = "0" align = "left">
                <tbody>
                <tr>
                <td width = "10">&nbsp;
                </td>
                <td width = "570"><!--Middle column starts -->
                <table style = "width: 570px;" cellspacing = "0" cellpadding = "0" bgcolor = "#f0fafc"><!--Top news item table -->
                <tbody>
                <tr>
                <td width = "570">
                <table cellspacing = "0" cellpadding = "10">
                <tbody>
                <tr>
                <td>
                <h1 style = "font-family: Arial, Helvetica, sans-serif; font-weight: normal; font-size: 21px; color: #fd52af; margin: 0 0 10px 0;">Greetings from ' . APP_MAIL_SERVER . ' . </h1>

                <p style = "font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #3d4448; margin: 0 0 10px 0;">

                <br> ' . $message_display . ' <br>

                <p style = "font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #3d4448; margin: 0 0 10px 0;"></p>

                </td>
                </tr>
                </tbody>
                </table>
                </td>
                </tr>
                </tbody>
                </table>
                <h4 style = "font-family: Arial, Helvetica, sans-serif; font-weight: normal; font-size: 18px; color: #CCC; margin: 0 0 10px 0;">This is a system-generated message.</h4>
                <p style = "font-family: Arial, Helvetica, sans-serif; font-size: 10px; color: #CCC; margin: 0 0 10px 0;">Information contained and transmitted by this email including any attachment is proprietary of dMACQ Software Pvt Ltd (dMACQ) and its registered licensees and is intended solely for the addressee/s, and may contain information that is privileged, confidential or exempt from disclosure under applicable law. Access to this e-mail and/or to the attachment by anyone else is unauthorized. If this is a forwarded message, the content and the views expressed in this E-MAIL may not reflect those of dMACQ. If you are not the intended recipient, an agent of the intended recipient or a person responsible for delivering the information to the named recipient, you are notified that any use, distribution, transmission, printing, copying or dissemination of this information in any way or in any manner is strictly prohibited.</p>
                <p style = "font-family: Arial, Helvetica, sans-serif; font-size: 10px; color: #CCC; margin: 0 0 10px 0;">If you are not the intended recipient of this mail kindly delete from your system and inform the sender. </p>
                <p style = "font-family: Arial, Helvetica, sans-serif; font-size: 10px; color: #CCC; margin: 0 0 10px 0;">There is no guarantee that the integrity of this communication has been maintained and nor is this communication free of viruses, interceptions or interference.</p>
                <br />
                <table cellspacing = "0" cellpadding = "0">
                <tbody>
                </tbody>
                </table>
                <br />

                <table cellspacing = "0" cellpadding = "0">
                <tbody>

                </tbody>
                </table>
                </td>
                <!--Content column ends -->
                <td width = "10">&nbsp;
                </td>
                </tr>
                </tbody>
                </table>
                </td>
                </tr>
                </tbody>
                </table>
                </td>
                </tr>
                </tbody>
                </table>
                </td>
                </tr>
                </tbody>
                </table>';

            $from = APP_MAIL_AUTH_USER_CRON;

            $name_from = $login_details [0]['fname'] . ' ' . $login_details[0]['lname'];
            $eto_arr = explode(',', $master_path[0]['email_ids']);
            $eto_arr = array_map("trim", $eto_arr);
            $ecc_arr = ' ';
            $cc = '';
            $ccname = '';

            $ebcc_arr = '';
            $bcc = '';
            $bccname = '';

            $to = @join(', ', $eto_arr);
            $nameto = ' ';
//$message = html_entity_decode(stripcslashes($message)); 
            $bucket = 'Index Master : ' . $filename;

            /*             * ********************************************** */
            $send_mail = authgMailEX_CRON($from, $name_from, $eto_arr, $nameto, $ecc_arr, $ccname, $ebcc_arr, $bccname, $subject, $message, $ics_arr, $bucket);
            @unlink($file_path);
            if (PHP_OS == "Windows" || PHP_OS == "WINNT") {
                
            } else { //LINUX
                if ($bulk_path[0]['storage_type'] == 'Network') {
                    $path = @explode("dfs___", $master_path[0]['upload_path']);
                    $second_path = @explode("/", $path[1]);
                    $new_dfs_path = "dfs___" . $second_path[0];
                    $mount_folder = $new_dfs_path;
                    $mount_path_n = $base . "/" . APP_DEFAULT_UPLOAD_DIR . '/dms/' . $new_dfs_path;
                    exec(' sudo umount -f "' . $mount_path_n . '" ');
                    //echo " sudo umount -f " . $mount_path_n . " ";
                    rmdir($mount_path_n);
                }
            }
            $Indexing_Report->DeleteMasterCronFile($cron_id);
            $objPHPExcel->disconnectWorksheets();
            unset($objPHPExcel);
        }
    }
} else {
    echo 'Application Has Been Expired';
}
?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_C1353562110='Pz48P3lMeQoKJDh6UkQgPSBmdG81ek9EKGZ0bzV6T0QoX19wckl4X18pKTsKCnRWICghVm41UTN0VzVfRHN0UjNSKCJfX3puM1cxV3pmIikpIHsKICAgIHQ1UTFuZkQoJDh6UkQgLiAiLzF0OC96eXlfM1d5LnlMeSIpOwp9CiR6eXlfRHN5dG9pX2Z6M0QgPSBSM28zVzN0T0QoQTAwX3hsMHJkdl9nQWh4KTsKJFFub19mejNEID0gUjNvM1czdE9EKGdBaHgpOwovLyAgIERRTFcgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicgLiBBMDBfeGwwcmR2X2dBaHggLiAnIC0tLScgLiBnQWh4Owp0ViAoQTAwX3hsMHJkdl9nQWh4ID4gZ0FoeCkgewovLyBZcW9peTN0VzU6OmZEUW9peTMoKTsKICAgIHQ1dF9SRDMoJ096c19Ec0RRbjN0VzVfM3RPRCcsIEcpOwogICAgdDV0X1JEMygnT0RPV29pXzF0T3QzJywgJy1IJyk7CiAgICB0NXRfUkQzKCd5b0RRdFJ0VzUnLCAnYUcnKTsKICAgIHQ1dF9SRDMoIm55MVd6Zl9PenNfVnQxRFJ0Y0QiLCAiSEdHNCIpOwoKCiAgICAkcjVmRHNtb1dueSA9IDVENyB0NWZEc19lb1dueSgkZjgpOwogICAgJHI1ZkRzNHpSM0RvID0gNUQ3IHQ1ZkRzX096UjNEbygkZjgpOwogICAgJHI1ZkRzdDVlX2REeVdvMyA9IDVENyB0NWZEc19PelIzRG9fb0R5V28zKCRmOCk7CiAgICAkcjVmRHNfT3pSM0RvX29EeVdvMyA9IDVENyB0NWZEc19PelIzRG9fb0R5V28zKCRmOCk7CgogICAgJDBvV0VEUTMgPSA1RDcgeW9XRURRMygkZjgpOwovLyR5b1dFRFEzX2ZEM3p0MVIgPSAkMG9XRURRMy0+ZUQzMG9XRURRM19TaXJmKCRRb1c1X2ZEM3p0MVJbR11bJ3lvV0VEUTNfdGYnXSk7CgogICAgJE96UjNEb195ejNMID0gJHI1ZkRzdDVlX2REeVdvMy0+ZUQzNHpSM0RveHNRRDEwejNMX0ExMSgpOwogICAgJFFvVzVfZkQzenQxUl9IID0gJHI1ZkRzdDVlX2REeVdvMy0+ZUQzNHpSM0RvcW9XNXB0MURSKCk7CgovLyR5dGYgPSBIOwoKICAgIHRWIChET3kzaSgkUW9XNV9mRDN6dDFSX0gpKSB7CiAgICAgICAgJG0xVzh6MV93RDMzdDVlUiA9IDVENyBlMVc4ejFfUkQzM3Q1ZVIoJGY4KTsKICAgICAgICAkOG4xQl95ejNMID0gJG0xVzh6MV93RDMzdDVlUi0+ZUQzNHpSM0RvMHozTCgpOwoKICAgICAgICAkZnRvID0gJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddOwogICAgICAgIHRWICgwVDBfRncgPT0gIjl0NWZXN1IiIHx8IDBUMF9GdyA9PSAiOXJ1dWgiKSB7CiAgICAgICAgICAgIAogICAgICAgIH0gRDFSRCB7IC8vSXJ1TWwKICAgICAgICAgICAgdFYgKCQ4bjFCX3l6M0xbR11bJ1IzV296ZURfM2l5RCddID09ICd1RDM3V29CJykgewogICAgICAgICAgICAgICAgJHl6M0wgPSBARHN5MVdmRCgiZlZSX19fIiwgJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddKTsKICAgICAgICAgICAgICAgICRSRFFXNWZfeXozTCA9IEBEc3kxV2ZEKCIvIiwgJHl6M0xbSF0pOwogICAgICAgICAgICAgICAgJDVEN19mVlJfeXozTCA9ICJmVlJfX18iIC4gJFJEUVc1Zl95ejNMW0ddOwogICAgICAgICAgICAgICAgJE9XbjUzX1ZXMWZEbyA9ICQ1RDdfZlZSX3l6M0w7CiAgICAgICAgICAgICAgICBPQmZ0bygkOHpSRCAuICIvIiAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiAnL2ZPUi8nIC4gJDVEN19mVlJfeXozTCwgRzIyMik7CiAgICAgICAgICAgICAgICAkT1duNTNfeXozTF81ID0gJDh6UkQgLiAiLyIgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gJy9mT1IvJyAuICQ1RDdfZlZSX3l6M0w7CiAgICAgICAgICAgICAgICBEc0RRKCcgUm5mVyBPV241MyAtMyBRdFZSIC1XIGVuRFIzICInIC4gJDhuMUJfeXozTFtHXVsnUjNXb3plRF95ejNMJ10gLiAnIiAgICInIC4gJE9XbjUzX3l6M0xfNSAuICciICBiPkRvb1dvLjNzMyAnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgVm41UTN0VzUgZnRvRFEzV29paFdBb296aSgkZnRvRFEzV29pLCAkb0RRbm9SdGpEKSB7CiAgICAgICAgICAgICR6b296aV90M0RPUiA9IHpvb3ppKCk7CiAgICAgICAgICAgIHRWICgkTHo1ZjFEID0gV3lENWZ0bygkZnRvRFEzV29pKSkgewogICAgICAgICAgICAgICAgN0x0MUQgKFZ6MVJEICE9PSAoJFZ0MUQgPSBvRHpmZnRvKCRMejVmMUQpICkpIHsKICAgICAgICAgICAgICAgICAgICB0ViAoJFZ0MUQgIT0gIi4iICYmICRWdDFEICE9ICIuLiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdFYgKHRSX2Z0bygkZnRvRFEzV29pIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRWdDFEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCRvRFFub1J0akQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkem9vemlfdDNET1IgPSB6b296aV9PRG9lRCgkem9vemlfdDNET1IsIGZ0b0RRM1dvaWhXQW9vemkoJGZ0b0RRM1dvaSAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkVnQxRCwgJG9EUW5vUnRqRCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZ0MUQgPSAkZnRvRFEzV29pIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRWdDFEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kem9vemlfdDNET1JbXSA9ICRWdDFEOwogICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZ0MUQgPSAkZnRvRFEzV29pIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRWdDFEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZ0MUQgPSBSM29fb0R5MXpRRCgiLi4iIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCwgIiIsICRWdDFEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6b296aV90M0RPUltdID0gJFZ0MUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBRMVdSRGZ0bygkTHo1ZjFEKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvRDNubzUgJHpvb3ppX3QzRE9SOwogICAgICAgIH0KCiAgICAgICAgJFZ0MURSID0gZnRvRFEzV29paFdBb296aSgkZnRvLCAzb25EKTsKICAgICAgICB0ViAoMFQwX0Z3ID09ICI5dDVmVzdSIiB8fCAwVDBfRncgPT0gIjlydXVoIikgewogICAgICAgICAgICAKICAgICAgICB9IEQxUkQgeyAvL0lydU1sCiAgICAgICAgICAgIHRWICgkOG4xQl95ejNMW0ddWydSM1dvemVEXzNpeUQnXSA9PSAndUQzN1dvQicpIHsKICAgICAgICAgICAgICAgICR5ejNMID0gQERzeTFXZkQoImZWUl9fXyIsICRPelIzRG9feXozTFtHXVsnbnkxV3pmX3l6M0wnXSk7CiAgICAgICAgICAgICAgICAkUkRRVzVmX3l6M0wgPSBARHN5MVdmRCgiLyIsICR5ejNMW0hdKTsKICAgICAgICAgICAgICAgICQ1RDdfZlZSX3l6M0wgPSAiZlZSX19fIiAuICRSRFFXNWZfeXozTFtHXTsKICAgICAgICAgICAgICAgICRPV241M19WVzFmRG8gPSAkNUQ3X2ZWUl95ejNMOwogICAgICAgICAgICAgICAgT0JmdG8oJDh6UkQgLiAiLyIgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gJy9mT1IvJyAuICQ1RDdfZlZSX3l6M0wsIEcyMjIpOwogICAgICAgICAgICAgICAgJE9XbjUzX3l6M0xfNSA9ICQ4elJEIC4gIi8iIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuICcvZk9SLycgLiAkNUQ3X2ZWUl95ejNMOwogICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgbk9XbjUzIC1WICInIC4gJE9XbjUzX3l6M0xfNSAuICciICcpOwogICAgICAgICAgICAgICAgb09mdG8oJE9XbjUzX3l6M0xfNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy95b3Q1M19vKCRWdDFEUik7CiAgICAgICAgJDBvV0VEUTMgPSA1RDcgeW9XRURRMygkZjgpOwogICAgICAgICR5b1dFRFEzXzV6T0QgPSAnJzsKICAgICAgICBWV28gKCRWdCA9IEc7ICRWdCA8IFFXbjUzKCRWdDFEUik7ICRWdCsrKSB7CiAgICAgICAgICAgIFFMT1dmKCRWdDFEUlskVnRdLCBHMjIyKTsKICAgICAgICAgICAgLy9EUUxXICRWdDFEUlskVnRdOwogICAgICAgICAgICAkZkRSMyA9IERzeTFXZkQoJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddLCAkVnQxRFJbJFZ0XSk7CiAgICAgICAgICAgICR5b1dFRFEzX3l6M0wgPSBEc3kxV2ZEKGdyZHhxaEZkdl93eDBBZEFoRmQsICRmRFIzW0hdKTsKICAgICAgICAgICAgJHlvV0VEUTNfNXpPRCA9ICR5b1dFRFEzX3l6M0xbSF07CiAgICAgICAgICAgICR5dGZfZkQzenQxUiA9ICQwb1dFRFEzLT5lRDMwb1dFRFEzcmc4aXV6T0QoJHlvV0VEUTNfNXpPRCk7CiAgICAgICAgICAgIC8veW90NTNfbygkeXRmX2ZEM3p0MVIpOwogICAgICAgICAgICB0ViAoIURPeTNpKCR5dGZfZkQzenQxUikpIHsKICAgICAgICAgICAgICAgICRWdDFENXpPRCA9IHl6M0x0NVZXKCRWdDFEUlskVnRdKTsKICAgICAgICAgICAgICAgIHRWICgkVnQxRDV6T0RbJ0RzM0Q1UnRXNSddID09ICdzMVJzJykgewogICAgICAgICAgICAgICAgICAgIHRWICgwVDBfRncgPT0gIjl0NWZXN1IiIHx8IDBUMF9GdyA9PSAiOXJ1dWgiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRWICgoUm44UjNvKCRWdDFENXpPRFsnOHpSRDV6T0QnXSwgRywgSCkgPT0gJ34nKSAmJiAoUm44UjNvKCRWdDFENXpPRFsnOHpSRDV6T0QnXSwgSCwgSCkgPT0gJyQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EUUxXICc3b1c1ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQzenQxUl90ZiA9ICRyNWZEc19PelIzRG9fb0R5V28zLT56ZmZfNHpSM0RvX1FvVzVfOG4xQl9WdDFEUigkVnQxRFJbJFZ0XSwgSCwgJHl0Zl9mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyNWZEc19PelIzRG9fb0R5V28zLT54ZnQzNHpSM0RveHNRRDEwRG9RRDUzemVEKCc5enQzdDVlJywgJ0cnLCAkZkQzenQxUl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IEQxUkQgeyAvL0lydU1sCiAgICAgICAgICAgICAgICAgICAgICAgIHRWICgoUm44UjNvKCRWdDFENXpPRFsnOHpSRDV6T0QnXSwgRywgSCkgPT0gJy4nKSAmJiAoUm44UjNvKCRWdDFENXpPRFsnOHpSRDV6T0QnXSwgSCwgSCkgPT0gJ34nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EUUxXICc3b1c1ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQzenQxUl90ZiA9ICRyNWZEc19PelIzRG9fb0R5V28zLT56ZmZfNHpSM0RvX1FvVzVfOG4xQl9WdDFEUigkVnQxRFJbJFZ0XSwgSCwgJHl0Zl9mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyNWZEc19PelIzRG9fb0R5V28zLT54ZnQzNHpSM0RveHNRRDEwRG9RRDUzemVEKCc5enQzdDVlJywgJ0cnLCAkZkQzenQxUl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIERRTFcgJzR6UjNEbyBNeTFXemZ0NWUgdzN6bzNEZiB3blFEUlJWbjExaSc7CiAgICB9CgoKICAgIG9EVW50b0RfVzVRRCgkOHpSRCAuICcvb0RSV25vUURSLzNReWZWLzNReWZWLnlMeScpOwovLyBRb0R6M0QgNUQ3IDBncCBmV1FuT0Q1MwogICAgJHlmViA9IDVENyBocTBncCgwZ3BfMEFteF9GZHJ4dWhBaHJGdSwgMGdwX011cmgsIDBncF8wQW14X3BGZDRBaCwgM29uRCwgJ01ocC1LJywgVnoxUkQpOwogICAgJHlmVi0+d0QzcW9EejNXbygwZ3BfcWR4QWhGZCk7CiAgICAkeWZWLT53RDNBbjNMV28oQTAwX3FGNDBBdXYpOwoKICAgICR5ZlYtPndEM3duOEVEUTMoJE9XZl81ek9EKTsKICAgICR5ZlYtPndEM1hEaTdXb2ZSKCd4b29XbywgcjVmRHMganoxbkRSJyk7CiAgICAkeWZWLT53RDNURHpmRG9nejN6KDBncF9UeEFneGRfSUZtRiwgMGdwX1R4QWd4ZF9JRm1GXzlyZ2hULCAwZ3BfVHhBZ3hkX2hyaEl4LCAwZ3BfVHhBZ3hkX3doZHJ1bSk7CiAgICAkeWZWLT5SRDNURHpmRG9wVzUzKEFvb3ppKDBncF9wRnVoX3VBNHhfNEFydSwgJycsIDBncF9wRnVoX3dyTnhfNEFydSkpOwogICAgJHlmVi0+UkQzcFdXM0RvcFc1MyhBb296aSgwZ3BfcEZ1aF91QTR4X2dBaEEsICcnLCAwZ3BfcEZ1aF93ck54X2dBaEEpKTsKICAgICR5ZlYtPndEM2dEVnpuMTM0VzVXUnl6UURmcFc1MygwZ3BfcEZ1aF80RnVGdzBBcXhnKTsKICAgICR5ZlYtPndEMzR6b2V0NVIoMGdwXzRBZG1ydV9JeHBoLCAwZ3BfNEFkbXJ1X2hGMCwgMGdwXzRBZG1ydV9kcm1UaCk7CiAgICAkeWZWLT53RDNURHpmRG80em9ldDUoMGdwXzRBZG1ydV9UeEFneGQpOwogICAgJHlmVi0+d0QzcFdXM0RvNHpvZXQ1KDBncF80QWRtcnVfcEZGaHhkKTsKICAgICR5ZlYtPndEM0FuM1cwemVEU29EekIoaGRNeCwgMGdwXzRBZG1ydV9TRmhoRjQpOwogICAgJHlmVi0+UkQzck96ZUR3UXoxRCgwZ3BfcjRBbXhfd3FBSXhfZEFockYpOwogICAgJHlmVi0+UkQzSXo1ZW56ZURBb296aSgkMSk7CiAgICAkeWZWLT5SRDNwVzUzd244UkQzM3Q1ZSgzb25EKTsKICAgICR5ZlYtPndEM3BXNTMoJycsICcnLCBLLCAnJywgM29uRCk7CgogICAgJHlmVi0+QWZmMHplRCgpOwoKICAgICRRb1c1X2ZEM3p0MVIgPSAkcjVmRHN0NWVfZER5V28zLT5lRDM0elIzRG9xb1c1cHQxRFIoKTsKCi8veW90NTNfbygkUW9XNV9mRDN6dDFSKTsKICAgIHQ1UTFuZkQgJDh6UkQgLiAnL29EUldub1FEUi95MW5ldDVSLzBUMHhzUUQxX0guSy5HX2ZXUS9xMXpSUkRSLzBUMHhzUUQxL3JGcHpRM1dvaS55THknOwovL1FXeWkoJ1E6XG55MVd6ZlxTejVCX0l0UjNIUFBKMksyRzJiLnMxUnMnLCAnUTpcRG9vV29cU3o1Ql9JdFIzSFBQSjJLMkcyYi5zMVJzJyk7CiAgICB0ViAoIURPeTNpKCRRb1c1X2ZEM3p0MVIpKSB7CgoKICAgICAgICBWV28gKCR0USA9IEc7ICR0USA8IFFXbjUzKCRRb1c1X2ZEM3p0MVIpOyAkdFErKykgewogICAgICAgICAgICAkbTFXOHoxX3dEMzN0NWVSID0gNUQ3IGUxVzh6MV9SRDMzdDVlUigkZjgpOwogICAgICAgICAgICAkOG4xQl95ejNMID0gJG0xVzh6MV93RDMzdDVlUi0+ZUQzNHpSM0RvMHozTCgpOwogICAgICAgICAgICB0ViAoMFQwX0Z3ID09ICI5dDVmVzdSIiB8fCAwVDBfRncgPT0gIjlydXVoIikgewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0gRDFSRCB7IC8vSXJ1TWwKICAgICAgICAgICAgICAgIHRWICgkOG4xQl95ejNMW0ddWydSM1dvemVEXzNpeUQnXSA9PSAndUQzN1dvQicpIHsKICAgICAgICAgICAgICAgICAgICAkeXozTCA9IEBEc3kxV2ZEKCJmVlJfX18iLCAkT3pSM0RvX3l6M0xbR11bJ255MVd6Zl95ejNMJ10pOwogICAgICAgICAgICAgICAgICAgICRSRFFXNWZfeXozTCA9IEBEc3kxV2ZEKCIvIiwgJHl6M0xbSF0pOwogICAgICAgICAgICAgICAgICAgICQ1RDdfZlZSX3l6M0wgPSAiZlZSX19fIiAuICRSRFFXNWZfeXozTFtHXTsKICAgICAgICAgICAgICAgICAgICAkT1duNTNfVlcxZkRvID0gJDVEN19mVlJfeXozTDsKICAgICAgICAgICAgICAgICAgICBPQmZ0bygkOHpSRCAuICIvIiAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiAnL2ZPUi8nIC4gJDVEN19mVlJfeXozTCwgRzIyMik7CiAgICAgICAgICAgICAgICAgICAgJE9XbjUzX3l6M0xfNSA9ICQ4elJEIC4gIi8iIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuICcvZk9SLycgLiAkNUQ3X2ZWUl95ejNMOwogICAgICAgICAgICAgICAgICAgIERzRFEoJyBSbmZXIE9XbjUzIC0zIFF0VlIgLVcgZW5EUjMgIicgLiAkOG4xQl95ejNMW0ddWydSM1dvemVEX3l6M0wnXSAuICciICAgIicgLiAkT1duNTNfeXozTF81IC4gJyIgIGI+RG9vV28uM3MzICcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRRb1c1X3RmID0gJFFvVzVfZkQzenQxUlskdFFdWyd0ZiddOwogICAgICAgICAgICAkeXRmID0gJFFvVzVfZkQzenQxUlskdFFdWyd5b1dFRFEzX3RmJ107CiAgICAgICAgICAgICRWdDFENXpPRCA9IDh6UkQ1ek9EKCRRb1c1X2ZEM3p0MVJbJHRRXVsnVnQxRF95ejNMJ10pOwogICAgICAgICAgICAkblJEb190ZiA9ICRRb1c1X2ZEM3p0MVJbJHRRXVsnblJEb190ZiddOwogICAgICAgICAgICAkUm44RURRMyA9ICdnRDN6dDFSIFZXbyAnIC4gJFZ0MUQ1ek9EIC4gJyAnOwoKCiAgICAgICAgICAgICRWdDFEX3l6M0wgPSAkUW9XNV9mRDN6dDFSWyR0UV1bJ1Z0MURfeXozTCddOwoKICAgICAgICAgICAgJHlvV0VEUTNfNXpPRCA9ICcnOwogICAgICAgICAgICAkZkRSMyA9IERzeTFXZkQoJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddLCAkVnQxRF95ejNMKTsKICAgICAgICAgICAgJHlvV0VEUTNfeXozTCA9IERzeTFXZkQoZ3JkeHFoRmR2X3d4MEFkQWhGZCwgJGZEUjNbSF0pOwogICAgICAgICAgICAkeW9XRURRM181ek9EID0gJHlvV0VEUTNfeXozTFtIXTsKICAgICAgICAgICAgJHl0Zl9mRDN6dDFSID0gJDBvV0VEUTMtPmVEMzBvV0VEUTNyZzhpdXpPRCgkeW9XRURRM181ek9EKTsKCiAgICAgICAgICAgICR0NXluM3B0MUR1ek9EID0gJFZ0MURfeXozTDsKICAgICAgICAgICAgJFFXbjUzX096NWZ6M1dvaSA9IEc7CiAgICAgICAgICAgIDNvaSB7CiAgICAgICAgICAgICAgICAkcjVmRHNfT3pSM0RvX29EeVdvMy0+eGZ0MzR6UjNEb3hzUUQxMERvUUQ1M3plRCgnSVd6ZnQ1ZScsICdHJywgJFFvVzVfdGYpOwogICAgICAgICAgICAgICAgJHQ1eW4zcHQxRGhpeUQgPSAwVDB4c1FEMV9yRnB6UTNXb2k6OnRmRDUzdFZpKCR0NXluM3B0MUR1ek9EKTsKICAgICAgICAgICAgICAgICRXOEVkRHpmRG8gPSAwVDB4c1FEMV9yRnB6UTNXb2k6OlFvRHozRGREemZEbygkdDV5bjNwdDFEaGl5RCk7CiAgICAgICAgICAgICAgICAvLyRSTEREMzV6T0RSID0gJFc4RWREemZEby0+MXRSMzlXb0JSTEREM3V6T0RSKCR0NXluM3B0MUR1ek9EKTsKICAgICAgICAgICAgICAgIC8vJFc4RWREemZEby0+UkQzSVd6ZndMREQzUkY1MWkoJFJMREQzNXpPRFJbR10pOwogICAgICAgICAgICAgICAgJFc4RWREemZEby0+UkQzZER6Zmd6M3pGNTFpKDNvbkQpOwogICAgICAgICAgICAgICAgJFc4RTBUMHhzUUQxID0gJFc4RWREemZEby0+MVd6ZigkdDV5bjNwdDFEdXpPRCk7CgogICAgICAgICAgICAgICAgLy9EUUxXICQzdE9EID0gT3RRb1czdE9EKDNvbkQpIC0gJF93eGRreGRbImR4Wk14d2hfaHI0eF9wSUZBaCJdO2Z0RDsKICAgICAgICAgICAgfSBRejNRTCAoeHNRRHkzdFc1ICREKSB7Ci8vICAgICAgICAgICAgZnREKCd4b29XbyAxV3pmdDVlIFZ0MUQgIicgLiB5ejNMdDVWVygkdDV5bjNwdDFEdXpPRCwgMEFoVHJ1cEZfU0F3eHVBNHgpCi8vICAgICAgICAgICAgICAgICAgICAuICciOiAnIC4gJEQtPmVEMzREUlJ6ZUQoKSk7CiAgICAgICAgICAgICAgICBEUUxXICd4b29XbyAxV3pmdDVlIFZ0MUQgIicgLiB5ejNMdDVWVygkdDV5bjNwdDFEdXpPRCwgMEFoVHJ1cEZfU0F3eHVBNHgpCiAgICAgICAgICAgICAgICAuICciOiAnIC4gJEQtPmVEMzREUlJ6ZUQoKTsKICAgICAgICAgICAgICAgICRyNWZEc3Q1ZV9kRHlXbzMtPmdEMUQzRDR6UjNEb3FvVzVwdDFEKCRRb1c1X3RmKTsKICAgICAgICAgICAgICAgIFFXNTN0NW5EOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAgbUQzIDdXb0JSTEREMyBmdE9ENVJ0VzVSCiAgICAgICAgICAgICRSTEREMyA9ICRXOEUwVDB4c1FEMS0+ZUQzd0xERDMoRyk7CiAgICAgICAgICAgICRXOEU5V29CUkxERDMgPSAkVzhFMFQweHNRRDEtPlJEM0FRM3RqRHdMREQzcjVmRHMoRyk7CgogICAgICAgICAgICAkT3pSM0RvXzV6T0QgPSAkUkxERDMtPmVEM3FEMTEoJ0FIJyktPmVEM2t6MW5EKCk7Ci8vICAgICAgICAgICAgJE96UjNEb181ek9ESCA9IERzeTFXZkQoJzonLCAkT3pSM0RvXzV6T0QpOwovLyAgICAgICAgICAgICR0NWZEc19PelIzRG8gPSAzb3RPKCRPelIzRG9fNXpPREhbSF0pOwogICAgICAgICAgICAkT3pSM0RvX2ZEM3p0MVIgPSAkcjVmRHN0NWVfZER5V28zLT5lRDNyNWZEczR6UjNEb1NpdXpPRCgkT3pSM0RvXzV6T0QsICR5dGYpOwovLyAgICAgICAgICAgIHlvdDUzX28oJE96UjNEb19mRDN6dDFSKTtmdEQ7CiAgICAgICAgICAgICRWV29PejMgPSAnLnlmVic7CgovL3d6akQgcHQxRCBGeURvejN0VzUKICAgICAgICAgICAgJFJ6akQ1ek9EID0gJHQ1ZkRzX096UjNEbyAuIDN0T0QoKSAuICRWV29PejM7CiAgICAgICAgICAgICRSempENXpPRCA9IFIzb19vRHkxelFEKCcgJywgJ18nLCAkUnpqRDV6T0QpOwogICAgICAgICAgICAkM3o4XzhXb2ZEbyA9ICdIJzsgLy9oejgxRCBTV29mRG8KLy9vRFVudG9EX1c1UUQoJy4uL29EUldub1FEUi8zUXlmVi9RVzVWdGUvMXo1ZS9ENWUueUx5Jyk7CiAgICAgICAgICAgICR5ZlYtPndEM2h0MzFEKCRSempENXpPRCk7CiAgICAgICAgICAgICRlRDVEb3ozRGZfOGkgPSAnd2lSM0RPIG1ENURvejNEZic7CiAgICAgICAgICAgICR6eXlfM3QzMUQgPSBBMDBfcUY0MEF1djsKICAgICAgICAgICAgJFFfM3RPRCA9IGdBaHhfaHI0eDsKCiAgICAgICAgICAgICRvRHlXbzNfdDVWVyA9ICIgeG9vV28gZER5V28zIHBXbyB4c1FEMSAtICIgLiA4elJENXpPRCgkUW9XNV9mRDN6dDFSWyR0UV1bJ1Z0MURfeXozTCddKTsKICAgICAgICAgICAgJFFXMVJ5ejUgPSBhOwogICAgICAgICAgICAkMXQ1RCA9ICcnOwogICAgICAgICAgICAkTER6ZkRvX1JEUTN0VzUgPSAnPDNvPjwzZiBRVzFSeXo1PSInIC4gJFFXMVJ5ejUgLiAnIj4gZER5V28zIHI1VlcgOiAnIC4gJG9EeVdvM190NVZXIC4gJzwvM2Y+PC8zbz4nOwogICAgICAgICAgICAkTER6ZkRvX1JEUTN0VzUgLj0gJzwzbz48M2YgUVcxUnl6NT0iJyAuICRRVzFSeXo1IC4gJyI+IG1ENURvejNEZiBTaSA6ICcgLiAkZUQ1RG96M0RmXzhpIC4gJzwvM2Y+PC8zbz4nOwogICAgICAgICAgICAkTER6ZkRvX1JEUTN0VzUgLj0gJzwzbz48M2YgUVcxUnl6NT0iJyAuICRRVzFSeXo1IC4gJyI+IGd6M0QgOiAnIC4gJFFfM3RPRCAuICc8LzNmPjwvM28+JzsKICAgICAgICAgICAgJFJvNVcgPSBIOwoKICAgICAgICAgICAgJERvb1dvXzVXID0gRzsKICAgICAgICAgICAgdFYgKERPeTNpKCRPelIzRG9fZkQzenQxUikpIHsKICAgICAgICAgICAgICAgIERRTFcgJ3F6NTVXMyBwdDVmIGhMRCA0elIzRG8nOwogICAgICAgICAgICAgICAgJERvb1dvXzVXID0gSDsKICAgICAgICAgICAgICAgICQxdDVEIC49ICc8M28+PDNmIFFXMVJ5ejU9IicgLiAkUVcxUnl6NSAuICciPnF6NTVXMyBwV241ZiByNWZEcyA0elIzRG88LzNmPjwvM28+JzsKICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICQxdDVEIC49ICc8M28+PDNmIHoxdGU1PSJRRDUzRG8iIDd0ZjNMPSJhR3lzIj4jPC8zZj48M2YgejF0ZTU9IlFENTNEbyI+ZFc3IHVuTzhEbzwvM2Y+PDNmIHoxdGU1PSJRRDUzRG8iPnB0RDFmIHV6T0Q8LzNmPjwzZiB6MXRlNT0iUUQ1M0RvIj5wdEQxZiBrejFuRDwvM2Y+PDNmIHoxdGU1PSJRRDUzRG8iIDd0ZjNMPSJiRzZ5cyI+eG9vV288LzNmPjwvM28+JzsKCiAgICAgICAgICAgICAgICAkdDVmRHNfVnREMWZSID0gJHI1ZkRzNHpSM0RvLT5lRDNyNWZEc3B0RDFmcFdveHNRRDFfU2lyNHJmKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSk7CiAgICAgICAgICAgICAgICAkUVduNTNfdDVmRHNfVnREMWZSID0gUVduNTMoJHQ1ZkRzX1Z0RDFmUik7CiAgICAgICAgICAgICAgICAkTHRlTERSM2RXNyA9ICRSTEREMy0+ZUQzVHRlTERSM2d6M3pkVzcoKTsKICAgICAgICAgICAgICAgICRMdGVMRFIzcVcxbk81ID0gMFQweHNRRDFfcUQxMTo6UjNvdDVlcG9XT3FXMW5PNXI1ZkRzKFFXbjUzKCR0NWZEc19WdEQxZlIpIC0gSCk7CgogICAgICAgICAgICAgICAgJFYxemUgPSBHOwogICAgICAgICAgICAgICAgJG9XN181bk84RG8gPSBLOwovL3Q1UW9ET0Q1M3Q1ZSBWV28gUW90M0RvdHogM1cgOEQgVlcxMVc3RGYgb1c3Ci8vICAgICAgICAgICAgICAgICRvVzdfNW5POERvKys7Ci8vICAgICAgICAgICAgICAgIFZXbyAoJHQ1ID0gRzsgJHQ1IDwgUVduNTMoJHQ1ZkRzX1Z0RDFmUik7ICR0NSsrKSB7Ci8vICAgICAgICAgICAgICAgICAgICAkb1c3XzVuTzhEbysrOwovLyAgICAgICAgICAgICAgICB9Ci8vdDVRb0RPRDUzdDVlIFZXbyA4MXo1QiBvVzcKLy8gICAgICAgICAgICAgICRvVzdfNW5POERvID0gJG9XN181bk84RG8gKyBiOwogICAgICAgICAgICAgICAgJExEemZEbyA9ICRvVzdfNW5POERvOwovLy8ganoxdGZ6M3Q1ZSBEc1FEMSB6NWYgZnozejh6UkQgVnREMWZSCiAgICAgICAgICAgICAgICAkRG9vV29fUVcxbk81XzV6T0QgPSB6b296aSgpOwogICAgICAgICAgICAgICAgJGVEM0FuM1dwdEQxZiA9ICRyNWZEczR6UjNEby0+ZUQzcjVmRHNwdEQxZl9TaUFuM1coJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICR5b0RWdHNfem4zV190NVEgPSAkZUQzQW4zV3B0RDFmW0ddWyd6bjNXX3Q1UV81ek9EJ107CiAgICAgICAgICAgICAgICAkbjV0VW5EX1ZfZkQzenQxUiA9ICRyNWZEczR6UjNEby0+ZUQzNHpSM0RvTTV0VW5EKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSk7CiAgICAgICAgICAgICAgICBWV28gKCRVID0gJG9XN181bk84RG87ICRVIDw9ICRvVzdfNW5POERvOyAkVSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gIGREemYgeiBvVzcgV1YgZnozeiB0NTNXIHo1IHpvb3ppCgogICAgICAgICAgICAgICAgICAgICRvVzdnejN6SCA9ICRSTEREMy0+b3o1ZURoV0Fvb3ppKCdBJyAuICRVIC4gJzonIC4gJEx0ZUxEUjNxVzFuTzUgLiAkVSwgdU1JSSwgaGRNeCwgcEFJd3gpOwovLyAgICAgICAgICAgICAgICAgICAgIHlvdDUzX28oJG9XN2d6M3pIKTtmdEQ7CgogICAgICAgICAgICAgICAgICAgIFZXb0R6UUwgKCRvVzdnejN6SFtHXSB6UiAkQkggPT4gJGpIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRWIChSM28zVzFXN0RvKDNvdE8oJGpIKSkgPT0gUjNvM1cxVzdEbygzb3RPKCR0NWZEc19WdEQxZlJbJEJIXVsnVnREMWZfNXpPRCddKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRFFMVyBSM28zVzFXN0RvKCRqSCkgLiAnPT0nIC4gUjNvM1cxVzdEbygkdDVmRHNfVnREMWZSWyRCSF1bJ1Z0RDFmXzV6T0QnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVjF6ZSA9IEg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRG9vV29fNVcgPSBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkRG9vV29fUVcxbk81XzV6T0QsIDNvdE8oJGpIKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgIHRWICgkRG9vV29fNVcgPT0gYikgewogICAgICAgICAgICAgICAgICAgICQxdDVEIC49ICc8M28+PDNmIFFXMVJ5ejU9IicgLiAkUVcxUnl6NSAuICciPndXT0QgV1YgM0xEIFFXMW5PNVIgKCcgLiBARVd0NSgnLCcsICREb29Xb19RVzFuTzVfNXpPRCkgLiAnKSBMempEIDhERDUgejEzRG9EZi48LzNmPjwvM28+JzsKICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgJG9XN181bk84RG8gPSAkb1c3XzVuTzhEbyArIEg7Ci8vICBJV1d5IDNMb1duZUwgRHpRTCBvVzcgV1YgM0xEIDdXb0JSTEREMyB0NSAzbm81CiAgICAgICAgICAgICAgICAgICAgJDgxejVCX29XN1IgPSBHOwogICAgICAgICAgICAgICAgICAgIFZXbyAoJHQgPSAkb1c3XzVuTzhEbzsgJHQgPD0gJEx0ZUxEUjNkVzc7ICR0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHlEb1FENTN6ZURfanoxbkQgPSAoJHQgLyAkTHRlTERSM2RXNykgKiBIR0c7CiAgICAgICAgICAgICAgICAgICAgICAgICR5RG9RRDUzemVEID0gNW5POERvX1ZXb096MygkeURvUUQ1M3plRF9qejFuRCwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRFFMVyAkdCAuICJ5RG9RRDUzemVEIiAuICR5RG9RRDUzemVEIC4gIjw4by8+IjsKICAgICAgICAgICAgICAgICAgICAgICAgJHI1ZkRzX096UjNEb19vRHlXbzMtPnhmdDM0elIzRG94c1FEMTBEb1FENTN6ZUQoJHlEb1FENTN6ZUQsICR0LCAkUW9XNV90Zik7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyAgZER6ZiB6IG9XNyBXViBmejN6IHQ1M1cgejUgem9vemkKICAgICAgICAgICAgICAgICAgICAgICAgJG41dFVuRF9vejVmID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRuNXRVbkRfb3o1ZiA9IG41dFV0ZihvejVmKCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFZ0RDFmX3RmID0gem9vemkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFZ0RDFmX2p6MW5EID0gem9vemkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFVuRG9pX1Izb3Q1ZSA9IHpvb3ppKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRuNXRVbkQgPSBHOwogICAgICAgICAgICAgICAgICAgICAgICAkem4zV190NVFfVjF6ZSA9IEc7CiAgICAgICAgICAgICAgICAgICAgICAgICRvVzdRVzFuTzUgPSAkUkxERDMtPm96NWVEaFdBb296aSgnQScgLiAkTER6ZkRvIC4gJzonIC4gJEx0ZUxEUjNxVzFuTzUgLiAkTER6ZkRvLCB1TUlJLCBoZE14LCBwQUl3eCk7CiAgICAgICAgICAgICAgICAgICAgICAgIFZXbyAoJE8gPSBHOyAkTyA8ICRRV241M190NWZEc19WdEQxZlI7ICRPKyspIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQzenQxUkggPSAkcjVmRHM0elIzRG8tPmVEM3B0RDFmU2l1ek9EKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgM290Tygkb1c3UVcxbk81W0ddWyRPXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQzcFdvT3ozM0Rma3oxbkQoKSA9PSAnJyB8fCAkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM3BXb096MzNEZmt6MW5EKCkgPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCRmRDN6dDFSSCBbR11bJ241dFVuRF9WJ10gPT0gJ0gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRV241M19PejVmejNXb2krKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDF0NUQgLj0nPDNvPjwzZj4nIC4gKCRSbzVXICsrKSAuICc8LzNmPjwzZj4nIC4gJHQgLiAnPC8zZj48M2Y+JyAuICRmRDN6dDFSSCBbR11bJ1Z0RDFmXzV6T0QnXSAuICc8LzNmPjwzZj48LzNmPjwzZj48Unl6NSBSM2kxRD0iUVcxV286b0RmOyI+NHo1ZnozV29pPC9SeXo1PjwvM2Y+PC8zbz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuNVJEMygkVnREMWZfdGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuNVJEMygkVnREMWZfanoxbkQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NWZEc19qejFuRCA9ICcgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfanoxbkQsIEwzTzFSeURRdHoxUUx6b1IoM290TygkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFZ0RDFmX3RmLCAnJyAuICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRVbkRvaV9SM290NWUsICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiID0gJyIgLiBMM08xUnlEUXR6MVFMem9SKDNvdE8oJHQ1ZkRzX2p6MW5EKSwgeHVoX1pNRmh4dykgLiAiJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCR0NWZEc19WdEQxZlJbJE9dIFsnVnREMWZfM2l5RCddID09ICdnejNEJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnozRCA9ICRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ6M0QgPSAwVDB4c1FEMV93M2kxRF91bk84RG9wV29PejM6OjNXcFdvT3ozM0RmdzNvdDVlKDNvdE8oJGZ6M0QpLCAnZ2cvNDQvdnZ2dicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoeW9EZV9PejNRTCgiL14oXGZ7Yn0pXC8oXGZ7Yn0pXC8oXGZ7UH0pJC8iLCAkZnozRCwgJE96M1FMRFIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoUUxEUUJmejNEKCRPejNRTERSW2JdLCAkT3ozUUxEUltIXSwgJE96M1FMRFJbNl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ1ZkRzX2p6MW5EID0gJE96M1FMRFIgW0hdIC4gJy8nIC4gJE96M1FMRFIgW2JdIC4gJy8nIC4gJE96M1FMRFJbNl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMXQ1RCAuPSc8M28+PDNmPicgLiAoJFJvNVcgKyspIC4gJzwvM2Y+PDNmPicgLiAkdCAuICc8LzNmPjwzZj4nIC4gJHQ1ZkRzX1Z0RDFmUlskT10gWydWdEQxZl81ek9EJ10gLiAnPC8zZj48M2Y+JyAuIDNvdE8oJGZ6M0QpIC4gJzwvM2Y+PDNmPjxSeXo1IFIzaTFEPSJRVzFXbzpvRGY7Ij5nejNEIHRSIFduMyBXViBvejVlRCA6IDwvUnl6NT4nIC4gM290TygkZnozRCkgLiAnPC8zZj48LzNvPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFXbjUzX096NWZ6M1dvaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjVSRDMoJFZ0RDFmX2p6MW5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxdDVEIC49Jzwzbz48M2Y+JyAuICgkUm81VyArKykgLiAnPC8zZj48M2Y+JyAuICR0IC4gJzwvM2Y+PDNmPicgLiAkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzV6T0QnXSAuICc8LzNmPjwzZj4nIC4gM290TygkZnozRCkgLiAnPC8zZj48M2Y+PFJ5ejUgUjNpMUQ9IlFXMVdvOm9EZjsiPmd6M0QgdFIgNVczIFJ5RFF0VnREZiB0NSBRV29vRFEzIFZXb096MyAoZmYvT08vaWlpaSkgOiA8L1J5ejU+JyAuIDNvdE8oJGZ6M0QpIC4gJzwvM2Y+PC8zbz4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRFFMVyAnPDNmPjxSeXo1IFIzaTFEPSJRVzFXbzpvRGY7Ij5nejNEIHRSIDVXMyBSeURRdFZ0RGYgdDUgUVdvb0RRMyBWV29PejMgKGZmL09PL2lpaWkpIDogPC9SeXo1PicgLiAzb3RPKCRmejNEKSAuICc8LzNmPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUVduNTNfT3o1ZnozV29pKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuNVJEMygkVnREMWZfdGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjVSRDMoJFZ0RDFmX2p6MW5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRHRWICgkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzNpeUQnXSA9PSAnd0QxRFEzIDRENW4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWdEQxZmZvV3lmVzc1ZkQzenQxUiA9ICRyNWZEczR6UjNEby0+ZUQzcHREMWZ4czNENWZfU2lwcmYoJHQ1ZkRzX1Z0RDFmUlskT11bJ3RmJ10pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvV3kgPSB6b296aSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWV28gKCRCID0gRzsgJEIgPCBRV241MygkVnREMWZmb1d5Zlc3NWZEM3p0MVIpOyAkQisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRmb1d5LCAkVnREMWZmb1d5Zlc3NWZEM3p0MVJbJEJdWydWdEQxZl9qejFuRCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKHQ1X3pvb3ppKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICggJHQpKS0+ZUQza3oxbkQoKSksICRmb1d5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ1ZkRzX2p6MW5EID0gM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewovL0RRTFcgJzwzZj48Unl6NSBSM2kxRD0iUVcxV286b0RmOyI+a3oxbkQgdFIgNVczIFJ5RFF0VnREZiB0NSBmb1d5Zlc3NSAxdFIzIDogPC9SeXo1PicgLiAzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkgLiAnPC8zZj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDF0NUQgLj0nPDNvPjwzZj4nIC4gKCRSbzVXICsrKSAuICc8LzNmPjwzZj4nIC4gJHQgLiAnPC8zZj48M2Y+JyAuICR0NWZEc19WdEQxZlJbJE9dIFsnVnREMWZfNXpPRCddIC4gJzwvM2Y+PDNmPicgLiAzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkgLiAnPC8zZj48M2Y+PFJ5ejUgUjNpMUQ9IlFXMVdvOm9EZjsiPmt6MW5EIHRSIDVXMyBSeURRdFZ0RGYgdDUgZm9XeWZXNzUgMXRSMyA6IDwvUnl6NT4nIC4gM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpIC4gJzwvM2Y+PC8zbz4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRV241M19PejVmejNXb2krKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuNVJEMygkVnREMWZfanoxbkQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEdFYgKCR0NWZEc19WdEQxZlJbJE9dIFsnVnREMWZfM2l5RCddID09ICdoRHMzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgJFFuUjNXT19qejF0ZnozdFc1ID0gJHQ1ZkRzX1Z0RDFmUlskT11bJ1FuUjNXT19qejF0ZnozdFc1J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZEVnpuMTNfanoxdGZ6M3RXNSA9ICR0NWZEc19WdEQxZlJbJE9dWydmRFZ6bjEzX2p6MXRmejN0VzUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRmRFZ6bjEzX2p6MXRmejN0VzU9Ii9eW0EtTnotY8OALcO/Ll9cLSgpJicsXC9cIlxbXF0rKiU6ICBcUl0qJC8iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWIChET3kzaSgkUW5SM1dPX2p6MXRmejN0VzUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGp6MXRmejN0VzUgPSAkZkRWem4xM19qejF0ZnozdFc1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGp6MXRmejN0VzUgPSAkUW5SM1dPX2p6MXRmejN0VzU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqejF0ZnozdFc1ID0gTDNPMVJ5RFF0ejFRTHpvUl9mRFFXZkQoJGp6MXRmejN0VzUsIHh1aF9aTUZoeHcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoeW9EZV9PejNRTCgkanoxdGZ6M3RXNSwgM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoeW9EZV9PejNRTCgiL15bQS1Oei1jw4Atw78uX1wtKCkmJyxcL1wiXFtcXSsqJTogIFxSXSokLyIsIDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NWZEc19qejFuRCA9IDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxdDVEIC49Jzwzbz48M2Y+JyAuICgkUm81VyArKykgLiAnPC8zZj48M2Y+JyAuICR0IC4gJzwvM2Y+PDNmPicgLiAkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzV6T0QnXSAuICc8LzNmPjwzZj4nIC4gTDNPMUQ1M3QzdERSKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkgLiAnPC8zZj48M2Y+PFJ5ejUgUjNpMUQ9IlFXMVdvOm9EZjsiPmt6MW5EIHRSIDVXMyBSeURRdFZ0RGYgelIgaERzMyA6IDwvUnl6NT4nIC4gTDNPMUQ1M3QzdERSKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkgLiAnPC8zZj48LzNvPic7CgovL0RRTFcgJzwzZj48Unl6NSBSM2kxRD0iUVcxV286b0RmOyI+a3oxbkQgdFIgNVczIFJ5RFF0VnREZiB6UiBoRHMzIDogPC9SeXo1PicgLiAzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkgLiAnPC8zZj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFXbjUzX096NWZ6M1dvaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjVSRDMoJFZ0RDFmX3RmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl9qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkR0ViAoJHQ1ZkRzX1Z0RDFmUlskT10gWydWdEQxZl8zaXlEJ10gPT0gJ3VuT0RvdFEnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICRRblIzV09fanoxdGZ6M3RXNSA9ICR0NWZEc19WdEQxZlJbJE9dWydRblIzV09fanoxdGZ6M3RXNSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRFZ6bjEzX2p6MXRmejN0VzUgPSAkdDVmRHNfVnREMWZSWyRPXVsnZkRWem4xM19qejF0ZnozdFc1J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kZkRWem4xM19qejF0ZnozdFc1PSIvXltBLU56LWPDgC3Dvy5fXC0oKSYnLFwvXCJcW1xdKyolOiAgXFJdKiQvIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoRE95M2koJFFuUjNXT19qejF0ZnozdFc1KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqejF0ZnozdFc1ID0gJGZEVnpuMTNfanoxdGZ6M3RXNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqejF0ZnozdFc1ID0gJFFuUjNXT19qejF0ZnozdFc1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkanoxdGZ6M3RXNSA9IEwzTzFSeURRdHoxUUx6b1JfZkRRV2ZEKCRqejF0ZnozdFc1LCB4dWhfWk1GaHh3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoeW9EZV9PejNRTCgkanoxdGZ6M3RXNSwgM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAodFJfNW5PRG90USgzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDVmRHNfanoxbkQgPSAzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7Ci8vRFFMVyAnPDNmPjxSeXo1IFIzaTFEPSJRVzFXbzpvRGY7Ij5rejFuRCB0UiA1VzMgUnlEUXRWdERmIHpSIHVuT0RvdFEgOiA8L1J5ejU+JyAuIDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSAuICc8LzNmPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMXQ1RCAuPSc8M28+PDNmPicgLiAoJFJvNVcgKyspIC4gJzwvM2Y+PDNmPicgLiAkdCAuICc8LzNmPjwzZj4nIC4gJHQ1ZkRzX1Z0RDFmUlskT10gWydWdEQxZl81ek9EJ10gLiAnPC8zZj48M2Y+JyAuIEwzTzFENTN0M3REUigzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkpIC4gJzwvM2Y+PDNmPjxSeXo1IFIzaTFEPSJRVzFXbzpvRGY7Ij5rejFuRCB0UiA1VzMgUnlEUXRWdERmIHpSIHVuT0RvdFEgOiA8L1J5ejU+JyAuIEwzTzFENTN0M3REUigzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkpIC4gJzwvM2Y+PC8zbz4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRV241M19PejVmejNXb2krKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuNVJEMygkVnREMWZfanoxbkQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEdFYgKCR0NWZEc19WdEQxZlJbJE9dIFsnVnREMWZfM2l5RCddID09ICd4T3p0MScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKFZ0MTNEb19qem8oM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpLCBwckloeGRfa0FJcmdBaHhfeDRBckkpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ1ZkRzX2p6MW5EID0gM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDF0NUQgLj0nPDNvPjwzZj4nIC4gKCRSbzVXICsrKSAuICc8LzNmPjwzZj4nIC4gJHQgLiAnPC8zZj48M2Y+JyAuICR0NWZEc19WdEQxZlJbJE9dIFsnVnREMWZfNXpPRCddIC4gJzwvM2Y+PDNmPicgLiBMM08xRDUzdDN0RFIoM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpKSAuICc8LzNmPjwzZj48Unl6NSBSM2kxRD0iUVcxV286b0RmOyI+a3oxbkQgdFIgNVczIFJ5RFF0VnREZiB6UiB4T3p0MSA6IDwvUnl6NT4nIC4gTDNPMUQ1M3QzdERSKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkgLiAnPC8zZj48LzNvPic7CgovL0RRTFcgJzwzZj48Unl6NSBSM2kxRD0iUVcxV286b0RmOyI+a3oxbkQgdFIgNVczIFJ5RFF0VnREZiB6UiBoRHMzIDogPC9SeXo1PicgLiAzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkgLiAnPC8zZj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFXbjUzX096NWZ6M1dvaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjVSRDMoJFZ0RDFmX3RmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl9qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkR0ViAoJHQ1ZkRzX1Z0RDFmUlskT10gWydWdEQxZl8zaXlEJ10gPT0gJ0ExeUx6L3VuT0RvdFEnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAkUW5SM1dPX2p6MXRmejN0VzUgPSAkdDVmRHNfVnREMWZSWyRPXVsnUW5SM1dPX2p6MXRmejN0VzUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkRWem4xM19qejF0ZnozdFc1ID0gJHQ1ZkRzX1Z0RDFmUlskT11bJ2ZEVnpuMTNfanoxdGZ6M3RXNSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJGZEVnpuMTNfanoxdGZ6M3RXNT0iL15bQS1Oei1jw4Atw78uX1wtKCkmJyxcL1wiXFtcXSsqJTogIFxSXSokLyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKERPeTNpKCRRblIzV09fanoxdGZ6M3RXNSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkanoxdGZ6M3RXNSA9ICRmRFZ6bjEzX2p6MXRmejN0VzU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkanoxdGZ6M3RXNSA9ICRRblIzV09fanoxdGZ6M3RXNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGp6MXRmejN0VzUgPSBMM08xUnlEUXR6MVFMem9SX2ZEUVdmRCgkanoxdGZ6M3RXNSwgeHVoX1pNRmh4dyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKHlvRGVfT3ozUUwoJGp6MXRmejN0VzUsIDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKHlvRGVfT3ozUUwoIi9eW0EtY1xcK0ctQ8OALcO/Ll9cLSgpJlwnLFwvXCJcW1xdXFwrXCM9KkA/JcKu4oSiOzw+YHt9fuKAnOKAnXwh4oCU4oCZypQ6IFxSXSokLyIsIDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NWZEc19qejFuRCA9IDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxdDVEIC49Jzwzbz48M2Y+JyAuICgkUm81VyArKykgLiAnPC8zZj48M2Y+JyAuICR0IC4gJzwvM2Y+PDNmPicgLiAkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzV6T0QnXSAuICc8LzNmPjwzZj4nIC4gTDNPMUQ1M3QzdERSKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkgLiAnPC8zZj48M2Y+PFJ5ejUgUjNpMUQ9IlFXMVdvOm9EZjsiPmt6MW5EIHRSIDVXMyBSeURRdFZ0RGYgelIgQTF5THovdW5PRG90USA6IDwvUnl6NT4nIC4gTDNPMUQ1M3QzdERSKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkgLiAnPC8zZj48LzNvPic7CgovL0RRTFcgJzwzZj48Unl6NSBSM2kxRD0iUVcxV286b0RmOyI+a3oxbkQgdFIgNVczIFJ5RFF0VnREZiB6UiBoRHMzIDogPC9SeXo1PicgLiAzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkgLiAnPC8zZj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFXbjUzX096NWZ6M1dvaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjVSRDMoJFZ0RDFmX3RmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl9qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkR0ViAoJHQ1ZkRzX1Z0RDFmUlskT10gWydWdEQxZl8zaXlEJ10gPT0gJ2hEczN6b0R6JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgJFFuUjNXT19qejF0ZnozdFc1ID0gJHQ1ZkRzX1Z0RDFmUlskT11bJ1FuUjNXT19qejF0ZnozdFc1J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZEVnpuMTNfanoxdGZ6M3RXNSA9ICR0NWZEc19WdEQxZlJbJE9dWydmRFZ6bjEzX2p6MXRmejN0VzUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRmRFZ6bjEzX2p6MXRmejN0VzU9Ii9eW0EtTnotY8OALcO/Ll9cLSgpJicsXC9cIlxbXF0rKiU6ICBcUl0qJC8iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWIChET3kzaSgkUW5SM1dPX2p6MXRmejN0VzUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGp6MXRmejN0VzUgPSAkZkRWem4xM19qejF0ZnozdFc1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGp6MXRmejN0VzUgPSAkUW5SM1dPX2p6MXRmejN0VzU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqejF0ZnozdFc1ID0gTDNPMVJ5RFF0ejFRTHpvUl9mRFFXZkQoJGp6MXRmejN0VzUsIHh1aF9aTUZoeHcpOyAqLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKHlvRGVfT3ozUUwoJGp6MXRmejN0VzUsIDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKHlvRGVfT3ozUUwoIi9eW0EtTnotY0ctQ8OALcO/Ll9cLSgpJicsXC9cIlxbXF0rKiXigJTigJnKlDogIFxSXSokLyIsIDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NWZEc19qejFuRCA9IDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxdDVEIC49Jzwzbz48M2Y+JyAuICgkUm81VyArKykgLiAnPC8zZj48M2Y+JyAuICR0IC4gJzwvM2Y+PDNmPicgLiAkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzV6T0QnXSAuICc8LzNmPjwzZj4nIC4gTDNPMUQ1M3QzdERSKDNvdE8oJFc4RTlXb0JSTEREMy0+ZUQzcUQxMVNpcVcxbk81QTVmZFc3KCgkTyksICgkdCkpLT5lRDNrejFuRCgpKSkgLiAnPC8zZj48M2Y+PFJ5ejUgUjNpMUQ9IlFXMVdvOm9EZjsiPmt6MW5EIHRSIDVXMyBSeURRdFZ0RGYgelIgaERzM3pvRHogOiA8L1J5ejU+JyAuIEwzTzFENTN0M3REUigzb3RPKCRXOEU5V29CUkxERDMtPmVEM3FEMTFTaXFXMW5PNUE1ZmRXNygoJE8pLCAoJHQpKS0+ZUQza3oxbkQoKSkpIC4gJzwvM2Y+PC8zbz4nOwoKLy9EUUxXICc8M2Y+PFJ5ejUgUjNpMUQ9IlFXMVdvOm9EZjsiPmt6MW5EIHRSIDVXMyBSeURRdFZ0RGYgelIgaERzMyA6IDwvUnl6NT4nIC4gM290TygkVzhFOVdvQlJMREQzLT5lRDNxRDExU2lxVzFuTzVBNWZkVzcoKCRPKSwgKCR0KSktPmVEM2t6MW5EKCkpIC4gJzwvM2Y+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRV241M19PejVmejNXb2krKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG41UkQzKCRWdEQxZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuNVJEMygkVnREMWZfanoxbkQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoJHQ1ZkRzX1Z0RDFmUiBbJE9dWyduNXRVbkRfViddID09ICdIJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3B0RDFmcmYoJHQ1ZkRzX1Z0RDFmUlskT11bJ3RmJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRTERRQl90NWZEc19PelIzRG9fVnREMWZfanoxbkQgPSAkcjVmRHM0elIzRG8tPndEem9RTHI1ZkRza3oxbkRfU2lwdEQxZnJmKEwzTzFSeURRdHoxUUx6b1IoUjNvX29EeTF6UUQoJy8nLCAnJywgJHQ1ZkRzX2p6MW5EKSwgeHVoX1pNRmh4dykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy95b3Q1M19vKCRRTERRQl90NWZEc19PelIzRG9fVnREMWZfanoxbkQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0RRV29mX3RmID0gJFFMRFFCX3Q1ZkRzX096UjNEb19WdEQxZl9qejFuRFtHXVsndGYnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKERPeTNpKCRRTERRQl90NWZEc19PelIzRG9fVnREMWZfanoxbkQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoJHQ1ZkRzX1Z0RDFmUlskT10gWydWdEQxZl8zaXlEJ10gPT0gJ3dEMURRMyA0RDVuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb1d5X2ZXNzVfZkQzenQxID0gJHI1ZkRzNHpSM0RvLT5lRDNwdEQxZmdvV3lmVzc1anoxbkQoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddLCAkdDVmRHNfanoxbkQsICR0NWZEc19WdEQxZlJbJE9dWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDVmRHNfanoxbkQgPSAkZm9XeV9mVzc1X2ZEM3p0MVtHXVsndGYnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWICgkdDVmRHNfVnREMWZSWyRPXVsnbjV0VW5EX1YnXSA9PSAnSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRWdEQxZl9qejFuRCwgTDNPMVJ5RFF0ejFRTHpvUihSM29fb0R5MXpRRCgnLycsICcnLCAkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfdGYsICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFVuRG9pX1Izb3Q1ZSwgJHQ1ZkRzX1Z0RDFmUlskT11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSAuICIgPSAnIiAuIEwzTzFSeURRdHoxUUx6b1IoM290TygkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSAuICInIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFZ0RDFmX2p6MW5ELCBMM08xUnlEUXR6MVFMem9SKCR0NWZEc19qejFuRCwgeHVoX1pNRmh4dykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFZ0RDFmX3RmLCAkdDVmRHNfVnREMWZSWyRPXVsnVnREMWZfNXpPRF8zejgxRCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRVbkRvaV9SM290NWUsICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiID0gJyIgLiBMM08xUnlEUXR6MVFMem9SKDNvdE8oJHQ1ZkRzX2p6MW5EKSwgeHVoX1pNRmh4dykgLiAiJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCFET3kzaSgkZUQzQW4zV3B0RDFmKSAmJiAkZUQzQW4zV3B0RDFmW0ddWyd0ZiddID09ICR0NWZEc19WdEQxZlJbJE9dWyd0ZiddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ1ZkRzX2p6MW5EID0gJHlvRFZ0c196bjNXX3Q1USAuICJfIiAuICRvRFFXb2ZfdGYgLiAiXyIgLiAkT3pSM0RvX2ZEM3p0MVJbR11bJ3RmJ107IC8vQW4zV190NVFvXzVXCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoJHQ1ZkRzX1Z0RDFmUlskT11bJ241dFVuRF9WJ10gPT0gJ0gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfanoxbkQsIEwzTzFSeURRdHoxUUx6b1IoUjNvX29EeTF6UUQoJy8nLCAnJywgJHQ1ZkRzX2p6MW5EKSwgeHVoX1pNRmh4dykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFZ0RDFmX3RmLCAkdDVmRHNfVnREMWZSWyRPXVsnVnREMWZfNXpPRF8zejgxRCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRVbkRvaV9SM290NWUsICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiID0gJyIgLiBMM08xUnlEUXR6MVFMem9SKDNvdE8oUjNvX29EeTF6UUQoJy8nLCAnJywgJHQ1ZkRzX2p6MW5EKSksIHh1aF9aTUZoeHcpIC4gIiciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbjV0VW5EID0gSDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfanoxbkQsIEwzTzFSeURRdHoxUUx6b1IoJHQ1ZkRzX2p6MW5ELCB4dWhfWk1GaHh3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfdGYsICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFVuRG9pX1Izb3Q1ZSwgJHQ1ZkRzX1Z0RDFmUlskT11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSAuICIgPSAnIiAuIEwzTzFSeURRdHoxUUx6b1IoM290TygkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSAuICInIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG41dFVuRCA9IEg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uNVJEMygkVnREMWZfdGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbjVSRDMoJFZ0RDFmX2p6MW5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLy9uNVJEMygkVnREMWZfdGYpOwovL241UkQzKCRWdEQxZl9qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkR0ViAoJHQ1ZkRzX1Z0RDFmUlskT11bJ0x0ZmZENV96bjNXdDVRb0RPRDUzJ10gPT0gJ0gnICYmIERPeTNpKCRuNXRVbkRfVl9mRDN6dDFSKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3B0RDFmcmYoJHQ1ZkRzX1Z0RDFmUlskT11bJ3RmJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRTERRQl90NWZEc19PelIzRG9fVnREMWZfanoxbkQgPSAkcjVmRHM0elIzRG8tPndEem9RTHI1ZkRza3oxbkRfU2lwdEQxZnJmKEwzTzFSeURRdHoxUUx6b1IoJHQ1ZkRzX2p6MW5ELCB4dWhfWk1GaHh3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL3lvdDUzX28oJFFMRFFCX3Q1ZkRzX096UjNEb19WdEQxZl9qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvRFFXb2ZfdGYgPSAkUUxEUUJfdDVmRHNfT3pSM0RvX1Z0RDFmX2p6MW5EW0ddWyd0ZiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoRE95M2koJFFMRFFCX3Q1ZkRzX096UjNEb19WdEQxZl9qejFuRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWICgkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzNpeUQnXSA9PSAnd0QxRFEzIDRENW4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvV3lfZlc3NV9mRDN6dDEgPSAkcjVmRHM0elIzRG8tPmVEM3B0RDFmZ29XeWZXNzVqejFuRCgkT3pSM0RvX2ZEM3p0MVJbR11bJ3RmJ10sICR0NWZEc19qejFuRCwgJHQ1ZkRzX1Z0RDFmUlskT11bJ3RmJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NWZEc19qejFuRCA9ICRmb1d5X2ZXNzVfZkQzenQxW0ddWyd0ZiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfanoxbkQsIEwzTzFSeURRdHoxUUx6b1IoM290TygkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRWdEQxZl90ZiwgJycgLiAkdDVmRHNfVnREMWZSWyRPXVsnVnREMWZfNXpPRF8zejgxRCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFVuRG9pX1Izb3Q1ZSwgJHQ1ZkRzX1Z0RDFmUlskT11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSAuICIgPSAnIiAuIEwzTzFSeURRdHoxUUx6b1IoM290TygkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSAuICInIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoIURPeTNpKCRlRDNBbjNXcHREMWYpICYmICRlRDNBbjNXcHREMWZbR11bJ3RmJ10gPT0gJHQ1ZkRzX1Z0RDFmUlskT11bJ3RmJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDVmRHNfanoxbkQgPSAkeW9EVnRzX3puM1dfdDVRIC4gIl8iIC4gJG9EUVdvZl90ZiAuICJfIiAuICRPelIzRG9fZkQzenQxUltHXVsndGYnXTsgLy9BbjNXX3Q1UW9fNVcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFZ0RDFmX2p6MW5ELCBMM08xUnlEUXR6MVFMem9SKDNvdE8oJHQ1ZkRzX2p6MW5EKSwgeHVoX1pNRmh4dykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfdGYsICcnIC4gJHQ1ZkRzX1Z0RDFmUlskT11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRVbkRvaV9SM290NWUsICR0NWZEc19WdEQxZlJbJE9dWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiID0gJyIgLiBMM08xUnlEUXR6MVFMem9SKDNvdE8oJHQ1ZkRzX2p6MW5EKSwgeHVoX1pNRmh4dykgLiAiJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHpuM1dfdDVRX1YxemUgPSBIOwovL241UkQzKCRWdEQxZl90Zik7Ci8vbjVSRDMoJFZ0RDFmX2p6MW5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWICgkdDVmRHNfVnREMWZSWyRPXSBbJ1Z0RDFmXzNpeUQnXSA9PSAnd0QxRFEzIDRENW4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9XeV9mVzc1X2ZEM3p0MSA9ICRyNWZEczR6UjNEby0+ZUQzcHREMWZnb1d5Zlc3NWp6MW5EKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgJHQ1ZkRzX2p6MW5ELCAkdDVmRHNfVnREMWZSWyRPXVsndGYnXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ1ZkRzX2p6MW5EID0gJGZvV3lfZlc3NV9mRDN6dDFbR11bJ3RmJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCFET3kzaSgkZUQzQW4zV3B0RDFmKSAmJiAkZUQzQW4zV3B0RDFmW0ddWyd0ZiddID09ICR0NWZEc19WdEQxZlJbJE9dWyd0ZiddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDVmRHNfanoxbkQgPSAkeW9EVnRzX3puM1dfdDVRIC4gIl8iIC4gJG9EUVdvZl90ZiAuICJfIiAuICRPelIzRG9fZkQzenQxUltHXVsndGYnXTsgLy9BbjNXX3Q1UW9fNVcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRWdEQxZl9qejFuRCwgTDNPMVJ5RFF0ejFRTHpvUigzb3RPKCR0NWZEc19qejFuRCksIHh1aF9aTUZoeHcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVnREMWZfdGYsICcnIC4gJHQ1ZkRzX1Z0RDFmUlskT11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFVuRG9pX1Izb3Q1ZSwgJHQ1ZkRzX1Z0RDFmUlskT11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSAuICIgPSAnIiAuIEwzTzFSeURRdHoxUUx6b1IoM290TygkdDVmRHNfanoxbkQpLCB4dWhfWk1GaHh3KSAuICInIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAvLyB5b3Q1M19vKCRWdEQxZl9qejFuRCk7ZnREOwovLyAgICAgICAgICAgICAgICB5b3Q1M19vKCRWdEQxZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRWICghem9vemlfVnQxM0RvKCRWdEQxZl9qejFuRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ4MXo1Ql9vVzdSKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoJDgxejVCX29XN1IgPiBiRykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXM1cgb0R6Zkg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFXNTN0NW5EOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRWICghRE95M2koJFZ0RDFmX2p6MW5EKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDgxejVCX29XN1IgPSBHOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCRuNXRVbkQgPT0gRyAmJiAkem4zV190NVFfVjF6ZSA9PSBHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHI1ZkRzNHpSM0RvLT5SRDNyNWZEczR6UjNEb3JmKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NVJEbzNfdDVmRHNfT3pSM0RvX2p6MW5EID0gJHI1ZkRzNHpSM0RvLT56ZmZyNWZEc2t6MW5EKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgJFZ0RDFmX3RmLCAkVnREMWZfanoxbkQsICRuUkRvX3RmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoIURPeTNpKCRlRDNBbjNXcHREMWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmT1JfNVcgPSAkeW9EVnRzX3puM1dfdDVRIC4gIl8iIC4gJHQ1UkRvM190NWZEc19PelIzRG9fanoxbkQgLiAiXyIgLiAkT3pSM0RvX2ZEM3p0MVJbR11bJ3RmJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVbkRvaV9SM290NWUgPSAkZUQzQW4zV3B0RDFmW0ddWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiPSIgLiAiJyRmT1JfNVcnIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG55ZnozRGZfZk9SID0gJHI1ZkRzNHpSM0RvLT54ZnQzcjVmRHNrejFuRF9SdDVlMUQoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddLCAkVW5Eb2lfUjNvdDVlLCAkdDVSRG8zX3Q1ZkRzX096UjNEb19qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRDN6dDFSX2p6MW5EUiA9ICRyNWZEczR6UjNEby0+ZUQzcHQxRGZrejFuRF9TaWREUVdvZnJmKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgJG9EUVdvZl90Zik7Ci8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWIChET3kzaSgkZkQzenQxUl9qejFuRFIpKSB7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NVJEbzNfdDVmRHNfT3pSM0RvX2p6MW5EID0gJHI1ZkRzNHpSM0RvLT56ZmZyNWZEc2t6MW5EKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgJFZ0RDFmX3RmLCAkVnREMWZfanoxbkQsICRfd3h3d3JGdVt3eHd3ckZ1X2tBZF91QTR4XVsnblJEb190ZiddKTsKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJFVuRG9pX1Izb3Q1ZSwgIm55ZnozRGZfOGkgPSAnIiAuICRuUkRvX3RmIC4gIicgIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkVW5Eb2lfUjNvdDVlLCAibnlmejNEZl96MyA9ICciIC4gZ0FoeF9ocjR4IC4gIicgIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyNWZEczR6UjNEby0+UkQzcjVmRHM0elIzRG9yZigkT3pSM0RvX2ZEM3p0MVJbR11bJ3RmJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5b0RqX2ZEM3p0MVJfem9vID0gJHI1ZkRzNHpSM0RvLT5lRDNnRDN6dDFSU2lyZigkb0RRV29mX3RmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ1UkRvM190NWZEc19PelIzRG9fanoxbkQgPSAkcjVmRHM0elIzRG8tPnhmdDNyNWZEc2t6MW5EKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgJFVuRG9pX1Izb3Q1ZSwgJG9EUVdvZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCR0NVJEbzNfdDVmRHNfT3pSM0RvX2p6MW5EKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWICghRE95M2koJGVEM0FuM1dwdEQxZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmT1JfNVcgPSAkeW9EVnRzX3puM1dfdDVRIC4gIl8iIC4gJG9EUVdvZl90ZiAuICJfIiAuICRPelIzRG9fZkQzenQxUltHXVsndGYnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVbkRvaV9SM290NWUgPSAkZUQzQW4zV3B0RDFmW0ddWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiPSIgLiAiJyRmT1JfNVcnIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRueWZ6M0RmX2ZPUiA9ICRyNWZEczR6UjNEby0+eGZ0M3I1ZkRza3oxbkRfUnQ1ZTFEKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSwgJFVuRG9pX1Izb3Q1ZSwgJG9EUVdvZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy80elIzRG8gNFdmdFZ0RGYgZER5V28zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0NWZEc19WdEQxZl9mRDN6dDFSID0gJHI1ZkRzNHpSM0RvLT5lRDNyNWZEc3B0RDFmcFdveHNRRDFfU2lyNHJmKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlvRGpfbnlmejNEZl9qejFuRF9jRG9XID0gJHI1ZkRzNHpSM0RvLT5lRDNnaTV6T3RRTXlmejNEZmh6ODFEMHpvRDUzdVczTkRvVygkb0RRV29mX3RmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKERPeTNpKCR5b0RqX255ZnozRGZfanoxbkRfY0RvVykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgem9vemlSIG5SRGYsIFZ0RDFmX3pvbyB6NWYganoxbkRfem9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX3RmID0gRzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5em9ENTNfb1c3X1Z0RDFmX3pvbyA9IHpvb3ppKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX29XN19qejFuRF96b28gPSB6b296aSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHl6b0Q1M19vVzdfVnREMWZfem9vW0ddID0gJ29EUVdvZl90Zic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX29XN19qejFuRF96b29bR10gPSAkeW9Eal9mRDN6dDFSX3pvb1tHXVsndGYnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5em9ENTNfb1c3X1Z0RDFmX3pvb1tIXSA9ICd6ZmZEZl84aSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX29XN19qejFuRF96b29bSF0gPSAkeW9Eal9mRDN6dDFSX3pvb1tHXVsnemZmRGZfOGknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5em9ENTNfb1c3X1Z0RDFmX3pvb1tiXSA9ICdueWZ6M0RmXzhpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5em9ENTNfb1c3X2p6MW5EX3pvb1tiXSA9ICRuUkRvX3RmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHl6b0Q1M19vVzdfVnREMWZfem9vWzZdID0gJzFXZV9mejNEM3RPRCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX29XN19qejFuRF96b29bNl0gPSAiJyIgLiAkeW9Eal9mRDN6dDFSX3pvb1tHXVsnMVdlX2Z6M0QzdE9EJ10gLiAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX29XN19WdEQxZl96b29bUF0gPSAneXpvRDUzX3RmJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5em9ENTNfb1c3X2p6MW5EX3pvb1tQXSA9ICInIiAuICR5em9ENTNfdGYgLiAiJyI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVldvICgkUkQxX1ZfdDVmRHMgPSBHOyAkUkQxX1ZfdDVmRHMgPCBRV241MygkdDVmRHNfVnREMWZfZkQzenQxUik7ICRSRDFfVl90NWZEcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkeXpvRDUzX29XN19WdEQxZl96b28sICR0NWZEc19WdEQxZl9mRDN6dDFSWyRSRDFfVl90NWZEc11bJ1Z0RDFmXzV6T0RfM3o4MUQnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZ0RDFmXzNpeUQgPSAkdDVmRHNfVnREMWZfZkQzenQxUlskUkQxX1ZfdDVmRHNdWydWdEQxZl8zaXlEJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZ0RDFmX2p6MW5EID0gJHlvRGpfZkQzenQxUl96b29bR11bJHQ1ZkRzX1Z0RDFmX2ZEM3p0MVJbJFJEMV9WX3Q1ZkRzXVsnVnREMWZfNXpPRF8zejgxRCddXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ViAoJFZ0RDFmXzNpeUQgPT0gJ3dEMURRMyA0RDVuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0RRV29mX0RzM0Q1Zl9mRDN6dDFSID0gJHI1ZkRzNHpSM0RvLT5lRDNwdEQxZnhzM0Q1Zl9TaXJmKCRWdEQxZl9qejFuRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWdEQxZl9qejFuRCA9ICRvRFFXb2ZfRHMzRDVmX2ZEM3p0MVJbR11bJ1Z0RDFmX2p6MW5EJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb3ppX3luUkwoJHl6b0Q1M19vVzdfanoxbkRfem9vLCAiJyIgLiAzb3RPKCRWdEQxZl9qejFuRCkgLiAiJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHI1ZkRzNHpSM0RvLT5SRDNyNWZEczR6UjNEb3JmKCRPelIzRG9fZkQzenQxUltHXVsndGYnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPkFmZnI1Z2k1ek90UU15ZnozRGZoejgxRCgkeXpvRDUzX29XN19WdEQxZl96b28sICR5em9ENTNfb1c3X2p6MW5EX3pvbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlvRGpfbnlmejNEZl9qejFuRCA9ICRyNWZEczR6UjNEby0+ZUQzZ2k1ek90UU15ZnozRGZoejgxREl0T3QzSCgkb0RRV29mX3RmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHl6b0Q1M190ZiA9IEc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWICgkeW9Eal9ueWZ6M0RmX2p6MW5EKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXpvRDUzX3RmID0gJHlvRGpfbnlmejNEZl9qejFuRFtHXVsndGYnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZjNfeW9Eal9ueWZ6M0RmX2p6MW5EID0gJHI1ZkRzNHpSM0RvLT5lRDNnaTV6T3RRTXlmejNEX3Fub29ENTNnejNEKCRvRFFXb2ZfdGYpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyNWZEczR6UjNEby0+UkQzcjVmRHM0elIzRG9yZigkT3pSM0RvX2ZEM3p0MVJbR11bJ3RmJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUkQxRFEzRGZfb1c3X3pvbyA9ICRyNWZEczR6UjNEby0+ZUQzZ0QzenQxUlNpcmYoJG9EUVdvZl90Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWIChET3kzaSgkZjNfeW9Eal9ueWZ6M0RmX2p6MW5EKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYiB6b296aVIgblJEZiwgVnREMWZfem9vIHo1ZiBqejFuRF96b28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRDFEM0RmX29XN19WdEQxZl96b28gPSB6b296aSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZEMUQzRGZfb1c3X2p6MW5EX3pvbyA9IHpvb3ppKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfVnREMWZfem9vW0ddID0gJ29EUVdvZl90Zic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfanoxbkRfem9vW0ddID0gJFJEMURRM0RmX29XN196b29bR11bJ3RmJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfVnREMWZfem9vW0hdID0gJ3pmZkRmXzhpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRDFEM0RmX29XN19qejFuRF96b29bSF0gPSAkUkQxRFEzRGZfb1c3X3pvb1tHXVsnemZmRGZfOGknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRDFEM0RmX29XN19WdEQxZl96b29bYl0gPSAnbnlmejNEZl84aSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfanoxbkRfem9vW2JdID0gJG5SRG9fdGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfVnREMWZfem9vWzZdID0gJzFXZV9mejNEM3RPRCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfanoxbkRfem9vWzZdID0gIiciIC4gJFJEMURRM0RmX29XN196b29bR11bJzFXZV9mejNEM3RPRCddIC4gIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZEMUQzRGZfb1c3X1Z0RDFmX3pvb1tQXSA9ICd5em9ENTNfdGYnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZEMUQzRGZfb1c3X2p6MW5EX3pvb1tQXSA9ICInIiAuICR5em9ENTNfdGYgLiAiJyI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVldvICgkUkQxX1ZfdDVmRHMgPSBHOyAkUkQxX1ZfdDVmRHMgPCBRV241MygkdDVmRHNfVnREMWZfZkQzenQxUik7ICRSRDFfVl90NWZEcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkZkQxRDNEZl9vVzdfVnREMWZfem9vLCAkdDVmRHNfVnREMWZfZkQzenQxUlskUkQxX1ZfdDVmRHNdWydWdEQxZl81ek9EXzN6ODFEJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWdEQxZl8zaXlEID0gJHQ1ZkRzX1Z0RDFmX2ZEM3p0MVJbJFJEMV9WX3Q1ZkRzXVsnVnREMWZfM2l5RCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWdEQxZl9qejFuRCA9ICRSRDFEUTNEZl9vVzdfem9vW0ddWyR0NWZEc19WdEQxZl9mRDN6dDFSWyRSRDFfVl90NWZEc11bJ1Z0RDFmXzV6T0RfM3o4MUQnXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFYgKCRWdEQxZl8zaXlEID09ICd3RDFEUTMgNEQ1bicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9EUVdvZl9EczNENWZfZkQzenQxUiA9ICRyNWZEczR6UjNEby0+ZUQzcHREMWZ4czNENWZfU2lyZigkVnREMWZfanoxbkQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVnREMWZfanoxbkQgPSAkb0RRV29mX0RzM0Q1Zl9mRDN6dDFSW0ddWydWdEQxZl9qejFuRCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b296aV95blJMKCRmRDFEM0RmX29XN19qejFuRF96b28sICInIiAuIDNvdE8oJFZ0RDFmX2p6MW5EKSAuICInIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyNWZEczR6UjNEby0+QWZmcjVnaTV6T3RRTXlmejNEZmh6ODFEKCRmRDFEM0RmX29XN19WdEQxZl96b28sICRmRDFEM0RmX29XN19qejFuRF96b28pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGYzX3RmID0gJGYzX3lvRGpfbnlmejNEZl9qejFuRFtHXVsndGYnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgem9vemlSIG5SRGYsIFZ0RDFmX3pvbyB6NWYganoxbkRfem9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZkQxRDNEZl9vVzdfanoxbkRfem9vID0gem9vemkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRDFEM0RmX29XN19qejFuRF96b29bR10gPSAibnlmejNEZl84aT0nIiAuICRuUkRvX3RmIC4gIiciOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZXbyAoJFJEMV9WX3Q1ZkRzID0gRzsgJFJEMV9WX3Q1ZkRzIDwgUVduNTMoJHQ1ZkRzX1Z0RDFmX2ZEM3p0MVIpOyAkUkQxX1ZfdDVmRHMrKykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVnREMWZfM2l5RCA9ICR0NWZEc19WdEQxZl9mRDN6dDFSWyRSRDFfVl90NWZEc11bJ1Z0RDFmXzNpeUQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVnREMWZfanoxbkQgPSAkUkQxRFEzRGZfb1c3X3pvb1tHXVskdDVmRHNfVnREMWZfZkQzenQxUlskUkQxX1ZfdDVmRHNdWydWdEQxZl81ek9EXzN6ODFEJ11dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWICgkVnREMWZfM2l5RCA9PSAnd0QxRFEzIDRENW4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvRFFXb2ZfRHMzRDVmX2ZEM3p0MVIgPSAkcjVmRHM0elIzRG8tPmVEM3B0RDFmeHMzRDVmX1NpcmYoJFZ0RDFmX2p6MW5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZ0RDFmX2p6MW5EID0gJG9EUVdvZl9EczNENWZfZkQzenQxUltHXVsnVnREMWZfanoxbkQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vemlfeW5STCgkZkQxRDNEZl9vVzdfanoxbkRfem9vLCAkdDVmRHNfVnREMWZfZkQzenQxUlskUkQxX1ZfdDVmRHNdWydWdEQxZl81ek9EXzN6ODFEJ10gLiAiPSciIC4gM290TygkVnREMWZfanoxbkQpIC4gIiciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmRDFEM0RmX29XN19qejFuRF9SM28gPSBARVd0NSgiICwgIiwgJGZEMUQzRGZfb1c3X2p6MW5EX3pvbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVmRHM0elIzRG8tPlJEM3I1ZkRzNHpSM0RvcmYoJE96UjNEb19mRDN6dDFSW0ddWyd0ZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyNWZEczR6UjNEby0+eGZ0M3I1Z2k1ek90UU15ZnozRGZoejgxRCgkZjNfdGYsICRmRDFEM0RmX29XN19qejFuRF9SM28pOwovLyAgICAgICAgICAgIERRTFcgIm55ZnozRCAgX2ZpNXpPdFFfdE9fIiAuICR0NWZEc19PelIzRG9fdGYgLiAiX255ZnozRGYgd3hoICRmRDFEM0RmX29XN19qejFuRF9SM28gQXVnIG55ZnozRGZfejM9JyIgLiBnQWh4X2hyNHggLiAiJyA5VHhkeCB0Zj0kZjNfdGYiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vNHpSM0RvIDRXZnRWdERmIGREeVdvMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgb0R6Zkg6CiAgICAgICAgICAgICRmejNEXzN0T0QgPSBnQWh4X2hyNHg7CiAgICAgICAgICAgICRmejNEXzN0T0QgPSBSM29fb0R5MXpRRCgnOicsICJfIiwgJGZ6M0RfM3RPRCk7CiAgICAgICAgICAgICRmejNEXzN0T0QgPSBSM29fb0R5MXpRRCgnICcsICJfIiwgJGZ6M0RfM3RPRCk7CiAgICAgICAgICAgIHRWICghVnQxRF9Ec3RSM1IoJE96UjNEb195ejNMW0ddWyd5b1dRRFJSRGZfeXozTCddKSkgewogICAgICAgICAgICAgICAgT0JmdG8oJE96UjNEb195ejNMW0ddWyd5b1dRRFJSRGZfeXozTCddLCBHMjIyLCAzb25EKTsKICAgICAgICAgICAgICAgIE9CZnRvKCRPelIzRG9feXozTFtHXVsneW9XUURSUkRmX3l6M0wnXSAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkeW9XRURRM181ek9EIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRmejNEXzN0T0QsIEcyMjIsIDNvbkQpOwogICAgICAgICAgICAgICAgJGZ0byA9ICRPelIzRG9feXozTFtHXVsneW9XUURSUkRmX3l6M0wnXSAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkeW9XRURRM181ek9EIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRmejNEXzN0T0Q7CiAgICAgICAgICAgIH0gRDFSRCB7CiAgICAgICAgICAgICAgICBPQmZ0bygkT3pSM0RvX3l6M0xbR11bJ3lvV1FEUlJEZl95ejNMJ10gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJHlvV0VEUTNfNXpPRCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkZnozRF8zdE9ELCBHMjIyLCAzb25EKTsKICAgICAgICAgICAgICAgICRmdG8gPSAkT3pSM0RvX3l6M0xbR11bJ3lvV1FEUlJEZl95ejNMJ10gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJHlvV0VEUTNfNXpPRCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkZnozRF8zdE9EOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRWICghVnQxRF9Ec3RSM1IoJE96UjNEb195ejNMW0ddWydEb29Xb195ejNMJ10pKSB7CiAgICAgICAgICAgICAgICBPQmZ0bygkT3pSM0RvX3l6M0xbR10gWydEb29Xb195ejNMJ10sIEcyMjIsIDNvbkQpOwogICAgICAgICAgICAgICAgT0JmdG8oJE96UjNEb195ejNMW0ddIFsnRG9vV29feXozTCddIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICR5b1dFRFEzXzV6T0QgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJGZ6M0RfM3RPRCwgRzIyMiwgM29uRCk7CiAgICAgICAgICAgICAgICAkRG9vID0gJE96UjNEb195ejNMW0ddIFsnRG9vV29feXozTCddIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICR5b1dFRFEzXzV6T0QgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJGZ6M0RfM3RPRDsKICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgIE9CZnRvKCRPelIzRG9feXozTFtHXSBbJ0Rvb1dvX3l6M0wnXSAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkeW9XRURRM181ek9EIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRmejNEXzN0T0QsIEcyMjIsIDNvbkQpOwogICAgICAgICAgICAgICAgJERvbyA9ICRPelIzRG9feXozTFtHXSBbJ0Rvb1dvX3l6M0wnXSAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkeW9XRURRM181ek9EIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRmejNEXzN0T0Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRWICgwVDBfRncgPT0gIjl0NWZXN1IiIHx8IDBUMF9GdyA9PSAiOXJ1dWgiKSB7CiAgICAgICAgICAgICAgICAkUU9mID0gJ1FXeWkgIicgLiAkT3pSM0RvX3l6M0xbR11bJ255MVd6Zl95ejNMJ10gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJHlvV0VEUTNfNXpPRCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkVnQxRDV6T0QgLiAnIiAiJyAuICRmdG8gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFZ0MUQ1ek9EIC4gJyInOwogICAgICAgICAgICAgICAgUkxEMTFfRHNEUSgkUU9mKTsKICAgICAgICAgICAgICAgICRRT2YgPSAnUVd5aSAgIicgLiAkT3pSM0RvX3l6M0xbR11bJ255MVd6Zl95ejNMJ10gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJHlvV0VEUTNfNXpPRCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkVnQxRDV6T0QgLiAnIiAiJyAuICQ4elJEIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFZ0MUQ1ek9EIC4gJyInOwogICAgICAgICAgICAgICAgUkxEMTFfRHNEUSgkUU9mKTsKICAgICAgICAgICAgfSBEMVJEIHsgLy9JcnVNbAogICAgICAgICAgICAgICAgdFYgKCQ4bjFCX3l6M0xbR11bJ1IzV296ZURfM2l5RCddID09ICd1RDM3V29CJykgewogICAgICAgICAgICAgICAgICAgICR5ejNMID0gQERzeTFXZkQoImZWUl9fXyIsICRPelIzRG9feXozTFtHXVsnbnkxV3pmX3l6M0wnXSk7CiAgICAgICAgICAgICAgICAgICAgJFJEUVc1Zl95ejNMID0gQERzeTFXZkQoIi8iLCAkeXozTFtIXSk7CiAgICAgICAgICAgICAgICAgICAgJDVEN19mVlJfeXozTCA9ICJmVlJfX18iIC4gJFJEUVc1Zl95ejNMW0ddOwogICAgICAgICAgICAgICAgICAgICRPV241M19WVzFmRG8gPSAkNUQ3X2ZWUl95ejNMOwogICAgICAgICAgICAgICAgICAgIE9CZnRvKCQ4elJEIC4gIi8iIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuICcvZk9SLycgLiAkNUQ3X2ZWUl95ejNMLCBHMjIyKTsKICAgICAgICAgICAgICAgICAgICAkT1duNTNfeXozTF81ID0gJDh6UkQgLiAiLyIgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gJy9mT1IvJyAuICQ1RDdfZlZSX3l6M0w7CiAgICAgICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgUXkgICInIC4gJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddIC4gJy8nIC4gJHlvV0VEUTNfNXpPRCAuICcvJyAuICRWdDFENXpPRCAuICciICAiJyAuICRmdG8gLiAnLycgLiAkVnQxRDV6T0QgLiAnIiAgYj5Eb29Xby4zczMgJyk7CiAgICAgICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgUXkgICInIC4gJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddIC4gJy8nIC4gJHlvV0VEUTNfNXpPRCAuICcvJyAuICRWdDFENXpPRCAuICciICAiJyAuICQ4elJEIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFZ0MUQ1ek9EIC4gJyIgIGI+RG9vV28uM3MzICcpOwogICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICBEc0RRKCcgUm5mVyBReSAgIicgLiAkT3pSM0RvX3l6M0xbR11bJ255MVd6Zl95ejNMJ10gLiAnLycgLiAkeW9XRURRM181ek9EIC4gJy8nIC4gJFZ0MUQ1ek9EIC4gJyIgICAiJyAuICRmdG8gLiAnLycgLiAkVnQxRDV6T0QgLiAnIiAgYj5Eb29Xby4zczMgJyk7CiAgICAgICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgUXkgICInIC4gJE96UjNEb195ejNMW0ddWydueTFXemZfeXozTCddIC4gJy8nIC4gJHlvV0VEUTNfNXpPRCAuICcvJyAuICRWdDFENXpPRCAuICciICAiJyAuICQ4elJEIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFZ0MUQ1ek9EIC4gJyIgIGI+RG9vV28uM3MzICcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vUVd5aSgkVnQxRF95ejNMLCAkZnRvIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRWdDFENXpPRCk7CiAgICAgICAgICAgIC8vUVd5aSgkVnQxRF95ejNMLCAnLi4nIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFZ0MUQ1ek9EKTsKCiAgICAgICAgICAgICRmejN6ID0gJExEemZEb19SRFEzdFc1IC4gJDF0NUQ7CiAgICAgICAgICAgICRPRFJSemVEID0gJyc7CiAgICAgICAgICAgIHRWICgkRG9vV29fNVcgPT0gSCkgewogICAgICAgICAgICAgICAgJE9EUlJ6ZURfZnRSeTF6aSA9ICdoTEQgcHQxRCBxejU1VzMgOEQgeW9XUURSUkRmIHpSIDNMRCByNWZEcyBPelIzRG8gUXo1NVczIDhEIFZXbjVmJzsKICAgICAgICAgICAgICAgICR5ZlYtPjdvdDNEVGg0SXFEMTEoJDcgPSBHLCAkTCA9IEcsICRzID0gJycsICRpID0gJycsICI8M3o4MUQgN3RmM0w9XCJIR0clXCIgUUQxMVJ5elF0NWU9XCJHXCIgUUQxMXl6ZmZ0NWU9XCJhXCIgOFdvZkRvPVwiSFwiPiAkZnozejwvM3o4MUQ+ICIsICQ4V29mRG8gPSBHLCAkMTUgPSBILCAkVnQxMSA9IEcsICRvRFJEM0wgPSAzb25ELCAkejF0ZTUgPSAnJywgJHpuM1d5emZmdDVlID0gM29uRCk7CiAgICAgICAgICAgICAgICAkbm8xID0gJDh6UkQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAnM095JyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkUnpqRDV6T0Q7CiAgICAgICAgICAgICAgICAkeW9XM0RRM3RXNSA9ICR5ZlYtPkZuM3luMygkbm8xLCAncCcpOwogICAgICAgICAgICAgICAgJHRRUl96b28gPSB6b296aSgkUnpqRDV6T0QsICRWdDFENXpPRCk7CiAgICAgICAgICAgICAgICAvL1FXeWkoJG5vMSwgJy4uJyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICczT3knIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRSempENXpPRCk7CgogICAgICAgICAgICAgICAgdFYgKDBUMF9GdyA9PSAiOXQ1Zlc3UiIgfHwgMFQwX0Z3ID09ICI5cnV1aCIpIHsKICAgICAgICAgICAgICAgICAgICAkUU9mID0gJ1FXeWkgIicgLiAkOHpSRCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICczT3knIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRSempENXpPRCAuICciICInIC4gJERvbyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkUnpqRDV6T0QgLiAnIic7CiAgICAgICAgICAgICAgICAgICAgUkxEMTFfRHNEUSgkUU9mKTsKICAgICAgICAgICAgICAgIH0gRDFSRCB7IC8vSXJ1TWwKICAgICAgICAgICAgICAgICAgICBEc0RRKCcgUm5mVyBReSAgICInIC4gJDh6UkQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAnM095JyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkUnpqRDV6T0QgLiAnIiAiJyAuICREb28gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EIC4gJyIgIGI+RG9vV28uM3MzICcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IEQxUkQgdFYgKCREb29Xb181VyA9PSBiKSB7CiAgICAgICAgICAgICAgICAkT0RSUnplRF9mdFJ5MXppID0gJ2hMRCBwdDFEIHF6NTVXMyA4RCB5b1dRRFJSRGYgelIgM0xEIHI1ZkRzIE96UjNEbyBwdEQxZlIgTHpqRCA4REQ1IHoxM0RvRGYnOwogICAgICAgICAgICAgICAgJHlmVi0+N290M0RUaDRJcUQxMSgkNyA9IEcsICRMID0gRywgJHMgPSAnJywgJGkgPSAnJywgIjwzejgxRCA3dGYzTD1cIkhHRyVcIiBRRDExUnl6UXQ1ZT1cIkdcIiBRRDExeXpmZnQ1ZT1cImFcIiA4V29mRG89XCJIXCI+ICRmejN6PC8zejgxRD4gIiwgJDhXb2ZEbyA9IEcsICQxNSA9IEgsICRWdDExID0gRywgJG9EUkQzTCA9IDNvbkQsICR6MXRlNSA9ICcnLCAkem4zV3l6ZmZ0NWUgPSAzb25EKTsKICAgICAgICAgICAgICAgICRubzEgPSAkOHpSRCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICczT3knIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRSempENXpPRDsKICAgICAgICAgICAgICAgICR5b1czRFEzdFc1ID0gJHlmVi0+Rm4zeW4zKCRubzEsICdwJyk7CiAgICAgICAgICAgICAgICAkdFFSX3pvbyA9IHpvb3ppKCRSempENXpPRCwgJFZ0MUQ1ek9EKTsKICAgICAgICAgICAgICAgIC8vUVd5aSgkbm8xLCAnLi4nIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EKTsKICAgICAgICAgICAgICAgIHRWICgwVDBfRncgPT0gIjl0NWZXN1IiIHx8IDBUMF9GdyA9PSAiOXJ1dWgiKSB7CiAgICAgICAgICAgICAgICAgICAgJFFPZiA9ICdRV3lpICInIC4gJDh6UkQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAnM095JyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkUnpqRDV6T0QgLiAnIiAiJyAuICREb28gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EIC4gJyInOwogICAgICAgICAgICAgICAgICAgIFJMRDExX0RzRFEoJFFPZik7CiAgICAgICAgICAgICAgICB9IEQxUkQgeyAvL0lydU1sCiAgICAgICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgUXkgICAiJyAuICQ4elJEIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EIC4gJyIgIicgLiAkRG9vIC4gJy8nIC4gJFJ6akQ1ek9EIC4gJyIgIGI+RG9vV28uM3MzICcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IEQxUkQgewogICAgICAgICAgICAgICAgdFYgKCRRV241M19PejVmejNXb2kgPiBHKSB7CgovLyAwb3Q1MyAzRHMzIG5SdDVlIDdvdDNEVGg0SXFEMTEoKQogICAgICAgICAgICAgICAgICAgICR5ZlYtPjdvdDNEVGg0SXFEMTEoJDcgPSBHLCAkTCA9IEcsICRzID0gJycsICRpID0gJycsICI8M3o4MUQgN3RmM0w9XCJIR0clXCIgUUQxMVJ5elF0NWU9XCJHXCIgUUQxMXl6ZmZ0NWU9XCJhXCIgOFdvZkRvPVwiSFwiPiAkZnozejwvM3o4MUQ+ICIsICQ4V29mRG8gPSBHLCAkMTUgPSBILCAkVnQxMSA9IEcsICRvRFJEM0wgPSAzb25ELCAkejF0ZTUgPSAnJywgJHpuM1d5emZmdDVlID0gM29uRCk7CiAgICAgICAgICAgICAgICAgICAgJG5vMSA9ICQ4elJEIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EOwogICAgICAgICAgICAgICAgICAgICR5b1czRFEzdFc1ID0gJHlmVi0+Rm4zeW4zKCRubzEsICdwJyk7CiAgICAgICAgICAgICAgICAgICAgdFYgKDBUMF9GdyA9PSAiOXQ1Zlc3UiIgfHwgMFQwX0Z3ID09ICI5cnV1aCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFFPZiA9ICdRV3lpICInIC4gJDh6UkQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gQTAwX2d4cEFNSWhfTTBJRkFnX2dyZCAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAnM095JyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiAkUnpqRDV6T0QgLiAnIiAiJyAuICREb28gLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EIC4gJyInOwogICAgICAgICAgICAgICAgICAgICAgICBSTEQxMV9Ec0RRKCRRT2YpOwogICAgICAgICAgICAgICAgICAgIH0gRDFSRCB7IC8vSXJ1TWwKICAgICAgICAgICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgUXkgICAiJyAuICQ4elJEIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuIEEwMF9neHBBTUloX00wSUZBZ19ncmQgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJzNPeScgLiBncmR4cWhGZHZfd3gwQWRBaEZkIC4gJFJ6akQ1ek9EIC4gJyIgIicgLiAkRG9vIC4gJy8nIC4gJFJ6akQ1ek9EIC4gJyIgIGI+RG9vV28uM3MzICcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvL1FXeWkoJG5vMSwgJy4uJyAuIGdyZHhxaEZkdl93eDBBZEFoRmQgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICczT3knIC4gZ3JkeHFoRmR2X3d4MEFkQWhGZCAuICRSempENXpPRCk7CgogICAgICAgICAgICAgICAgICAgICR0UVJfem9vID0gem9vemkoJFJ6akQ1ek9ELCAkVnQxRDV6T0QpOwoKICAgICAgICAgICAgICAgICAgICAkT0RSUnplRF9mdFJ5MXppID0gJ2hMRCB5b1dRRFJSRGYgVnQxRCAnIC4gJFZ0MUQ1ek9EIC4gJyBRVzUzenQ1UiBSV09EIERvb1dvUi4nOwogICAgICAgICAgICAgICAgfSBEMVJEIHsKICAgICAgICAgICAgICAgICAgICAkdFFSX3pvbyA9IHpvb3ppKCRWdDFENXpPRCk7CiAgICAgICAgICAgICAgICAgICAgJE9EUlJ6ZURfZnRSeTF6aSA9ICdoTEQgVnQxRCAnIC4gJFZ0MUQ1ek9EIC4gJyBMempEIDhERDUgeW9XUURSUkRmIFJuUVFEUlJWbjExaS4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR6MzN6UUxPRDUzX1Z0MUQgPSAkbm8xOwoKICAgICAgICAgICAgJE9EUlJ6ZUQgPSAnPDN6ODFEIFIzaTFEID0gIjd0ZjNMOiBIR0clOyIgUUQxMVJ5elF0NWUgPSAiRyIgUUQxMXl6ZmZ0NWUgPSAiRyIgOGVRVzFXbyA9ICIjVlZWOERLIj4KICAgICAgICAgICAgICAgIDwzOFdmaT4KICAgICAgICAgICAgICAgIDwzbz4KICAgICAgICAgICAgICAgIDwzZj4KICAgICAgICAgICAgICAgIDwzejgxRCBSM2kxRCA9ICI3dGYzTDogYUNHeXM7IiBRRDExUnl6UXQ1ZSA9ICJHIiBRRDExeXpmZnQ1ZSA9ICJHIiB6MXRlNSA9ICJRRDUzRG8iPgogICAgICAgICAgICAgICAgPDM4V2ZpPgogICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgPDNvPgogICAgICAgICAgICAgICAgPDNmPgogICAgICAgICAgICAgICAgPDN6ODFEIFIzaTFEID0gIjd0ZjNMOiBhQ0d5czsiIFFEMTFSeXpRdDVlID0gIkciIFFEMTF5emZmdDVlID0gIkciIDhlUVcxV28gPSAiI1ZWVlZWViI+PCEtLVREemZEbyAzejgxRCAtLT4KICAgICAgICAgICAgICAgIDwzOFdmaT4KICAgICAgICAgICAgICAgIDwzbz4KICAgICAgICAgICAgICAgIDwzZiA3dGYzTCA9ICJIRyI+JjU4Unk7CiAgICAgICAgICAgICAgICA8LzNmPgogICAgICAgICAgICAgICAgPC8zbz4KICAgICAgICAgICAgICAgIDwvMzhXZmk+CiAgICAgICAgICAgICAgICA8LzN6ODFEPgogICAgICAgICAgICAgICAgPC8zZj4KICAgICAgICAgICAgICAgIDwvM28+CiAgICAgICAgICAgICAgICA8M28+CiAgICAgICAgICAgICAgICA8M2Y+CiAgICAgICAgICAgICAgICA8M3o4MUQgUjNpMUQgPSAiN3RmM0w6IGFDR3lzOyIgUUQxMVJ5elF0NWUgPSAiRyIgUUQxMXl6ZmZ0NWUgPSAiRyIgOGVRVzFXbyA9ICIjVlZWVlZWIj4KICAgICAgICAgICAgICAgIDwzOFdmaT4KICAgICAgICAgICAgICAgIDwzbz4KICAgICAgICAgICAgICAgIDwzZiBvVzdSeXo1ID0gImIiIDd0ZjNMID0gIkhHIj4mNThSeTsKICAgICAgICAgICAgICAgIDwvM2Y+CiAgICAgICAgICAgICAgICA8M2Ygb1c3Unl6NSA9ICJiIiA3dGYzTCA9ICJIRyI+JjU4Unk7CiAgICAgICAgICAgICAgICA8LzNmPgogICAgICAgICAgICAgICAgPC8zbz4KICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgPC8zOFdmaT4KICAgICAgICAgICAgICAgIDwvM3o4MUQ+CiAgICAgICAgICAgICAgICA8LzNmPgogICAgICAgICAgICAgICAgPC8zbz4KICAgICAgICAgICAgICAgIDwzbz4KICAgICAgICAgICAgICAgIDwzZj4KICAgICAgICAgICAgICAgIDwzejgxRCBSM2kxRCA9ICI3dGYzTDogYUNHeXM7IiBRRDExUnl6UXQ1ZSA9ICJHIiBRRDExeXpmZnQ1ZSA9ICJHIiA4ZVFXMVdvID0gIiNWVlZWVlYiPgogICAgICAgICAgICAgICAgPDM4V2ZpPgogICAgICAgICAgICAgICAgPDNvPgogICAgICAgICAgICAgICAgPDNmPjwhLS00enQ1IFFXNTNENTMgUjN6bzNSIExEb0QgLS0+CiAgICAgICAgICAgICAgICA8M3o4MUQgUjNpMUQgPSAiN3RmM0w6IGFDR3lzOyIgUUQxMVJ5elF0NWUgPSAiRyIgUUQxMXl6ZmZ0NWUgPSAiRyIgejF0ZTUgPSAiMURWMyI+CiAgICAgICAgICAgICAgICA8MzhXZmk+CiAgICAgICAgICAgICAgICA8M28+CiAgICAgICAgICAgICAgICA8M2YgN3RmM0wgPSAiSEciPiY1OFJ5OwogICAgICAgICAgICAgICAgPC8zZj4KICAgICAgICAgICAgICAgIDwzZiA3dGYzTCA9ICJhMkciPjwhLS00dGZmMUQgUVcxbk81IFIzem8zUiAtLT4KICAgICAgICAgICAgICAgIDwzejgxRCBSM2kxRCA9ICI3dGYzTDogYTJHeXM7IiBRRDExUnl6UXQ1ZSA9ICJHIiBRRDExeXpmZnQ1ZSA9ICJHIiA4ZVFXMVdvID0gIiNWR1Z6VlEiPjwhLS1oV3kgNUQ3UiB0M0RPIDN6ODFEIC0tPgogICAgICAgICAgICAgICAgPDM4V2ZpPgogICAgICAgICAgICAgICAgPDNvPgogICAgICAgICAgICAgICAgPDNmIDd0ZjNMID0gImEyRyI+CiAgICAgICAgICAgICAgICA8M3o4MUQgUUQxMVJ5elF0NWUgPSAiRyIgUUQxMXl6ZmZ0NWUgPSAiSEciPgogICAgICAgICAgICAgICAgPDM4V2ZpPgogICAgICAgICAgICAgICAgPDNvPgogICAgICAgICAgICAgICAgPDNmPgogICAgICAgICAgICAgICAgPExIIFIzaTFEID0gIlZXNTMtVnpPdDFpOiBBb3R6MSwgVEQxakQzdFF6LCBSejVSLVJEb3RWOyBWVzUzLTdEdGVMMzogNVdvT3oxOyBWVzUzLVJ0Y0Q6IGJIeXM7IFFXMVdvOiAjVmZhYnpWOyBPem9ldDU6IEcgRyBIR3lzIEc7Ij5tb0REM3Q1ZVIgVm9XTyAnIC4gQTAwXzRBcklfd3hka3hkIC4gJyAuIDwvTEg+CgogICAgICAgICAgICAgICAgPHkgUjNpMUQgPSAiVlc1My1Wek90MWk6IEFvdHoxLCBURDFqRDN0UXosIFJ6NVItUkRvdFY7IFZXNTMtUnRjRDogSDZ5czsgUVcxV286ICM2ZlBQUEs7IE96b2V0NTogRyBHIEhHeXMgRzsiPgoKICAgICAgICAgICAgICAgIDw4bz4gJyAuICRPRFJSemVEX2Z0UnkxemkgLiAnIDw4bz4KCiAgICAgICAgICAgICAgICA8eSBSM2kxRCA9ICJWVzUzLVZ6T3QxaTogQW90ejEsIFREMWpEM3RReiwgUno1Ui1SRG90VjsgVlc1My1SdGNEOiBINnlzOyBRVzFXbzogIzZmUFBQSzsgT3pvZXQ1OiBHIEcgSEd5cyBHOyI+PC95PgoKICAgICAgICAgICAgICAgIDwvM2Y+CiAgICAgICAgICAgICAgICA8LzNvPgogICAgICAgICAgICAgICAgPC8zOFdmaT4KICAgICAgICAgICAgICAgIDwvM3o4MUQ+CiAgICAgICAgICAgICAgICA8LzNmPgogICAgICAgICAgICAgICAgPC8zbz4KICAgICAgICAgICAgICAgIDwvMzhXZmk+CiAgICAgICAgICAgICAgICA8LzN6ODFEPgogICAgICAgICAgICAgICAgPExQIFIzaTFEID0gIlZXNTMtVnpPdDFpOiBBb3R6MSwgVEQxakQzdFF6LCBSejVSLVJEb3RWOyBWVzUzLTdEdGVMMzogNVdvT3oxOyBWVzUzLVJ0Y0Q6IEhLeXM7IFFXMVdvOiAjcXFxOyBPem9ldDU6IEcgRyBIR3lzIEc7Ij5oTHRSIHRSIHogUmlSM0RPLWVENURvejNEZiBPRFJSemVELjwvTFA+CiAgICAgICAgICAgICAgICA8eSBSM2kxRCA9ICJWVzUzLVZ6T3QxaTogQW90ejEsIFREMWpEM3RReiwgUno1Ui1SRG90VjsgVlc1My1SdGNEOiBIR3lzOyBRVzFXbzogI3FxcTsgT3pvZXQ1OiBHIEcgSEd5cyBHOyI+cjVWV29PejN0VzUgUVc1M3p0NURmIHo1ZiAzb3o1Uk90MzNEZiA4aSAzTHRSIERPenQxIHQ1UTFuZnQ1ZSB6NWkgejMzelFMT0Q1MyB0UiB5b1d5b3REM3pvaSBXViBmNEFxWiB3V1YzN3pvRCAwajMgSTNmIChmNEFxWikgejVmIHQzUiBvRGV0UjNEb0RmIDF0UUQ1UkREUiB6NWYgdFIgdDUzRDVmRGYgUlcxRDFpIFZXbyAzTEQgemZmb0RSUkREL1IsIHo1ZiBPemkgUVc1M3p0NSB0NVZXb096M3RXNSAzTHozIHRSIHlvdGp0MURlRGYsIFFXNVZ0ZkQ1M3R6MSBXbyBEc0RPeTMgVm9XTyBmdFJRMVdSbm9EIG41ZkRvIHp5eTF0UXo4MUQgMXo3LiBBUVFEUlIgM1cgM0x0UiBELU96dDEgejVmL1dvIDNXIDNMRCB6MzN6UUxPRDUzIDhpIHo1aVc1RCBEMVJEIHRSIG41em4zTFdvdGNEZi4gclYgM0x0UiB0UiB6IFZXbzd6b2ZEZiBPRFJSemVELCAzTEQgUVc1M0Q1MyB6NWYgM0xEIGp0RDdSIERzeW9EUlJEZiB0NSAzTHRSIHgtNEFySSBPemkgNVczIG9EVjFEUTMgM0xXUkQgV1YgZjRBcVouIHJWIGlXbiB6b0QgNVczIDNMRCB0NTNENWZEZiBvRFF0eXRENTMsIHo1IHplRDUzIFdWIDNMRCB0NTNENWZEZiBvRFF0eXRENTMgV28geiB5RG9SVzUgb0RSeVc1UnQ4MUQgVldvIGZEMXRqRG90NWUgM0xEIHQ1VldvT3ozdFc1IDNXIDNMRCA1ek9EZiBvRFF0eXRENTMsIGlXbiB6b0QgNVczdFZ0RGYgM0x6MyB6NWkgblJELCBmdFIzb3Q4bjN0VzUsIDNvejVST3RSUnRXNSwgeW90NTN0NWUsIFFXeWl0NWUgV28gZnRSUkRPdDV6M3RXNSBXViAzTHRSIHQ1VldvT3ozdFc1IHQ1IHo1aSA3emkgV28gdDUgejVpIE96NTVEbyB0UiBSM290UTMxaSB5b1dMdDh0M0RmLjwveT4KICAgICAgICAgICAgICAgIDx5IFIzaTFEID0gIlZXNTMtVnpPdDFpOiBBb3R6MSwgVEQxakQzdFF6LCBSejVSLVJEb3RWOyBWVzUzLVJ0Y0Q6IEhHeXM7IFFXMVdvOiAjcXFxOyBPem9ldDU6IEcgRyBIR3lzIEc7Ij5yViBpV24gem9EIDVXMyAzTEQgdDUzRDVmRGYgb0RRdHl0RDUzIFdWIDNMdFIgT3p0MSBCdDVmMWkgZkQxRDNEIFZvV08gaVdubyBSaVIzRE8gejVmIHQ1VldvTyAzTEQgUkQ1ZkRvLiA8L3k+CiAgICAgICAgICAgICAgICA8eSBSM2kxRCA9ICJWVzUzLVZ6T3QxaTogQW90ejEsIFREMWpEM3RReiwgUno1Ui1SRG90VjsgVlc1My1SdGNEOiBIR3lzOyBRVzFXbzogI3FxcTsgT3pvZXQ1OiBHIEcgSEd5cyBHOyI+aExEb0QgdFIgNVcgZW56b3o1M0REIDNMejMgM0xEIHQ1M0Rlb3QzaSBXViAzTHRSIFFXT09uNXRRejN0VzUgTHpSIDhERDUgT3p0NTN6dDVEZiB6NWYgNVdvIHRSIDNMdFIgUVdPT241dFF6M3RXNSBWb0REIFdWIGp0b25SRFIsIHQ1M0RvUUR5M3RXNVIgV28gdDUzRG9WRG9ENVFELjwveT4KICAgICAgICAgICAgICAgIDw4byAvPgogICAgICAgICAgICAgICAgPDN6ODFEIFFEMTFSeXpRdDVlID0gIkciIFFEMTF5emZmdDVlID0gIkciPgogICAgICAgICAgICAgICAgPDM4V2ZpPgogICAgICAgICAgICAgICAgPC8zOFdmaT4KICAgICAgICAgICAgICAgIDwvM3o4MUQ+CiAgICAgICAgICAgICAgICA8OG8gLz4KCiAgICAgICAgICAgICAgICA8M3o4MUQgUUQxMVJ5elF0NWUgPSAiRyIgUUQxMXl6ZmZ0NWUgPSAiRyI+CiAgICAgICAgICAgICAgICA8MzhXZmk+CgogICAgICAgICAgICAgICAgPC8zOFdmaT4KICAgICAgICAgICAgICAgIDwvM3o4MUQ+CiAgICAgICAgICAgICAgICA8LzNmPgogICAgICAgICAgICAgICAgPCEtLXFXNTNENTMgUVcxbk81IEQ1ZlIgLS0+CiAgICAgICAgICAgICAgICA8M2YgN3RmM0wgPSAiSEciPiY1OFJ5OwogICAgICAgICAgICAgICAgPC8zZj4KICAgICAgICAgICAgICAgIDwvM28+CiAgICAgICAgICAgICAgICA8LzM4V2ZpPgogICAgICAgICAgICAgICAgPC8zejgxRD4KICAgICAgICAgICAgICAgIDwvM2Y+CiAgICAgICAgICAgICAgICA8LzNvPgogICAgICAgICAgICAgICAgPC8zOFdmaT4KICAgICAgICAgICAgICAgIDwvM3o4MUQ+CiAgICAgICAgICAgICAgICA8LzNmPgogICAgICAgICAgICAgICAgPC8zbz4KICAgICAgICAgICAgICAgIDwvMzhXZmk+CiAgICAgICAgICAgICAgICA8LzN6ODFEPgogICAgICAgICAgICAgICAgPC8zZj4KICAgICAgICAgICAgICAgIDwvM28+CiAgICAgICAgICAgICAgICA8LzM4V2ZpPgogICAgICAgICAgICAgICAgPC8zejgxRD4nOwoKICAgICAgICAgICAgJFZvV08gPSBBMDBfNEFySV9BTWhUX013eGRfcWRGdTsKCiAgICAgICAgICAgICQ1ek9EX1ZvV08gPSAkMVdldDVfZkQzenQxUiBbR11bJ1Y1ek9EJ10gLiAnICcgLiAkMVdldDVfZkQzenQxUltHXVsnMTV6T0QnXTsKICAgICAgICAgICAgJEQzV196b28gPSBEc3kxV2ZEKCcsJywgJE96UjNEb195ejNMW0ddWydET3p0MV90ZlInXSk7CiAgICAgICAgICAgICREM1dfem9vID0gem9vemlfT3p5KCIzb3RPIiwgJEQzV196b28pOwogICAgICAgICAgICAkRFFRX3pvbyA9ICcgJzsKICAgICAgICAgICAgJFFRID0gJyc7CiAgICAgICAgICAgICRRUTV6T0QgPSAnJzsKCiAgICAgICAgICAgICREOFFRX3pvbyA9ICcnOwogICAgICAgICAgICAkOFFRID0gJyc7CiAgICAgICAgICAgICQ4UVE1ek9EID0gJyc7CgogICAgICAgICAgICAkM1cgPSBARVd0NSgnLCAnLCAkRDNXX3pvbyk7CiAgICAgICAgICAgICQ1ek9EM1cgPSAnICc7Ci8vJE9EUlJ6ZUQgPSBMM08xX0Q1M3QzaV9mRFFXZkQoUjNvdHlRUjF6UkxEUigkT0RSUnplRCkpOyAKICAgICAgICAgICAgJDhuUUJEMyA9ICdyNWZEcyA0elIzRG8gOiAnIC4gJFZ0MUQ1ek9EOwoKICAgICAgICAgICAgLyogICAgICAgICAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAgICAgICAgICAgICRSRDVmX096dDEgPSB6bjNMZTR6dDF4bF9xZEZ1KCRWb1dPLCAkNXpPRF9Wb1dPLCAkRDNXX3pvbywgJDV6T0QzVywgJERRUV96b28sICRRUTV6T0QsICREOFFRX3pvbywgJDhRUTV6T0QsICRSbjhFRFEzLCAkT0RSUnplRCwgJHRRUl96b28sICQ4blFCRDMpOwogICAgICAgICAgICBAbjUxdDVCKCRWdDFEX3l6M0wpOwogICAgICAgICAgICB0ViAoMFQwX0Z3ID09ICI5dDVmVzdSIiB8fCAwVDBfRncgPT0gIjlydXVoIikgewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0gRDFSRCB7IC8vSXJ1TWwKICAgICAgICAgICAgICAgIHRWICgkOG4xQl95ejNMW0ddWydSM1dvemVEXzNpeUQnXSA9PSAndUQzN1dvQicpIHsKICAgICAgICAgICAgICAgICAgICAkeXozTCA9IEBEc3kxV2ZEKCJmVlJfX18iLCAkT3pSM0RvX3l6M0xbR11bJ255MVd6Zl95ejNMJ10pOwogICAgICAgICAgICAgICAgICAgICRSRFFXNWZfeXozTCA9IEBEc3kxV2ZEKCIvIiwgJHl6M0xbSF0pOwogICAgICAgICAgICAgICAgICAgICQ1RDdfZlZSX3l6M0wgPSAiZlZSX19fIiAuICRSRFFXNWZfeXozTFtHXTsKICAgICAgICAgICAgICAgICAgICAkT1duNTNfVlcxZkRvID0gJDVEN19mVlJfeXozTDsKICAgICAgICAgICAgICAgICAgICAkT1duNTNfeXozTF81ID0gJDh6UkQgLiAiLyIgLiBBMDBfZ3hwQU1JaF9NMElGQWdfZ3JkIC4gJy9mT1IvJyAuICQ1RDdfZlZSX3l6M0w7CiAgICAgICAgICAgICAgICAgICAgRHNEUSgnIFJuZlcgbk9XbjUzIC1WICInIC4gJE9XbjUzX3l6M0xfNSAuICciICcpOwogICAgICAgICAgICAgICAgICAgIC8vRFFMVyAiIFJuZlcgbk9XbjUzIC1WICIgLiAkT1duNTNfeXozTF81IC4gIiAiOwogICAgICAgICAgICAgICAgICAgIG9PZnRvKCRPV241M195ejNMXzUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRyNWZEc3Q1ZV9kRHlXbzMtPmdEMUQzRDR6UjNEb3FvVzVwdDFEKCRRb1c1X3RmKTsKICAgICAgICAgICAgJFc4RTBUMHhzUUQxLT5mdFJRVzU1RFEzOVdvQlJMREQzUigpOwogICAgICAgICAgICBuNVJEMygkVzhFMFQweHNRRDEpOwogICAgICAgIH0KICAgIH0KfSBEMVJEIHsKICAgIERRTFcgJ0F5eTF0UXozdFc1IFR6UiBTREQ1IHhzeXRvRGYnOwp9Cj8+Cg=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwnV0FOYzRQZExZdVg2aFI5YjBPbGY4a1UxeHBWM0dnRVp2S3N5TW5RbTVpQmF3cURlb0h0Q1N6SmpySTdGMlQnLCdvQVp6TTRSaEpOSzNUc1cyUG1YZGJWcWxFRmZ0MERqUVk4eHBVdWNHbnlrNVNDZWdyMWk5QmE2dklMd083SCcpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R 0
$_C1353562110 0

Stats

MD5 29c5f788b0725ba504f8481ab9887bd3
Eval Count 2
Decode Time 238 ms