Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

eval(base64_decode("cmVxdWlyZV9vbmNlICdjbGFzcy1nZXN0aW9uYWxlYXV0b2NvbnRlbnQucGhwJzsKcmVxdW..

Decoded Output download

require_once 'class-gestionaleautocontent.php';
require_once 'GAAPIClient.php';

define("GESTIONALEAUTO_SENDREQUEST_ERROR", "GESTIONALEAUTO_SENDREQUEST_ERROR");
define("GESTIONALEAUTO_SENDREQUEST_OK", "GESTIONALEAUTO_SENDREQUEST_OK");


class GestionaleAuto{
    
    
    private $_page_id = -1;
    
    
    private $_page_title;
    
    
    private $_ga_api_client;
    
    
    private function _get_ga_api_client(){
        $options = get_option('gestionaleauto-settings');
        if (!$options){
            return false;
        }
        
        if (!$this->_ga_api_client){
            $this->_ga_api_client = new GAAPIClient(
                    $options['api_key'],
                    $options['api_secret'],
                    false,
                    array_key_exists("api_https", $options),
                    $options['api_url']
            );
        }
        return $this->_ga_api_client;
    }
    
    
    private function _get_page_id(){
       $the_page = get_page_by_title($this->_page_title); 
       if (!$the_page){
           return false;
       }else{
           return $the_page->ID;
       }
    }
    
    
    public function _activate_plugin(){
        $the_page = get_page_by_title($this->_page_title);
        
        if (!$the_page){
                        $_p = array();
            $_p['post_title']     = $this->_page_title;
            $_p['post_name']     = $this->_page_title;
            $_p['post_content']   = "[-main-]";
            $_p['post_status']    = 'publish';
            $_p['post_type']      = 'page';
            $_p['comment_status'] = 'closed';
            $_p['ping_status']    = 'closed';
            $_p['post_category'] = array(1); 
                        $this->_page_id = wp_insert_post($_p);
        }else{
                        $this->_page_id = $the_page->ID;
                        $the_page->post_status = 'publish';
            $this->_page_id = wp_update_post($the_page);
        }
        $options = get_option('gestionaleauto-settings');
        $options['page_id'] = $this->_page_id;
        update_option('gestionaleauto-settings', $options);
    }
    
    
    public function _deactivate_plugin(){
        if ($this->_page_id != -1){
            wp_delete_post($this->_page_id, true);
        }
    }
    
    
    public function _send_request(){
        $return = Array();
        
        $options = get_option('gestionaleauto-settings');
        if (is_array($options) && $options['recipient']!=""){
        
                        $vehicle = $this->_get_ga_api_client()->getStockDetail($_GET['vehicle_id']);

            try{                $this->_get_ga_api_client()->saveRequest($_GET['vehicle_id'], $_POST["gestionaleautomail-name"], $_POST["gestionaleautomail-phone"], $_POST["gestionaleautomail-mail"], $_POST["gestionaleautomail-request"]);
            }
            catch (Exception $e){}
            
            $car_text = strtoupper($vehicle->model->make . " " . $vehicle->model->model);
            $car_condition_tmp = strtolower($vehicle->usage);
            $car_condition = ucfirst($car_condition_tmp).(($car_condition_tmp != "nuovo" && $car_condition_tmp != "km 0" && isset($vehicle->km) && $vehicle->km > 10)?(", Km ".number_format($vehicle->km,0, ",", ".")):"");		
            
                        $object = "Richiesta di informazioni dal sito";

                        $body = "<div style='font-family: Trebuchet MS'>
                        <div style='margin-top: 10px; padding: 10px; border: 1px solid #000000; background: #DDDDDD; font-size: 14px;'>
                            Gentile Cliente, <br><br>
                            un contatto ha richiesto informazioni su un veicolo.<br><br>
                            <strong>DATI DEL VEICOLO</strong>
                            <ul style=\"list-style-type:outside\">
                                <li style=\"margin-bottom:10px\"><strong>Modello:</strong>&nbsp;".$car_text."</li>";
            if(isset($vehicle->internal_code) && $vehicle->internal_code!= ""){
                $body .= "      <li style=\"margin-bottom:10px\"><strong>Riferimento interno:</strong>&nbsp;".$vehicle->internal_code."</li>";
            }

            $body .= "          <li style=\"margin-bottom:10px\"><strong>Codice GestionaleAuto:</strong>&nbsp;".$vehicle->id."</li>";
            $body .= "          <li style=\"margin-bottom:10px\"><strong>Condizione:</strong>&nbsp;".$car_condition."</li>";

            if(isset($vehicle->plate) && $vehicle->plate!= ""){
                $body .= "      <li style=\"margin-bottom:10px\"><strong>Targa:</strong>&nbsp;".$vehicle->plate."</li>";
            }
            if(isset($vehicle->vin) && $vehicle->vin!= ""){
                $body .= "      <li style=\"margin-bottom:10px\"><strong>Telaio:</strong>&nbsp;".$vehicle->vin."</li>";
            }

            $body.="        </ul><br><br>";

            $body.="        <br>
                            Di seguito i dati del richiedente:
                            <br>
                            <br>
                            <table width='95%' >

            ";

            $body .= "          <tr><td style='font-size: 14px;'>Nome e cognome:</td><td style='font-size: 14px; '>".$_POST["gestionaleautomail-name"]."</td></tr>
";
            $body .= "          <tr><td style='font-size: 14px;'>Email:</td><td style='font-size: 14px; '>".$_POST["gestionaleautomail-mail"]."</td></tr>
";
            $body .= "          <tr><td style='font-size: 14px;'>Telefono:</td><td style='font-size: 14px; '>".(($_POST["gestionaleautomail-phone"] != "")?$_POST["gestionaleautomail-phone"]:"-")."</td></tr>
";

            $body     .="   </table>
                            <br>
                            Di seguito i dettagli della richiesta :
                            <br>
                            <br>
                            <p style='font-size: 16px;'><span style='color: #F00'>".stripslashes($_POST["gestionaleautomail-request"])."</span></p>
                            <br>
                            <br>
                            Grazie <br>
                            <b>Il team di GestionaleAuto.com</b><br>
                            <a href='http://www.gestionaleauto.com/'>www.gestionaleauto.com</a>
                        </div>
                    </div>";



                        $headers = Array("From: ".$_POST["gestionaleautomail-name"]." <".$_POST["gestionaleautomail-mail"].">");

            add_filter('wp_mail_content_type',create_function('', 'return "text/html";'));
            $wpmail_result = wp_mail($options['recipient'], $object, $body, $headers);
            
            if (!$wpmail_result) {
                global $ts_mail_errors;
                global $phpmailer;
                if (!isset($ts_mail_errors)) $ts_mail_errors = array();
                if (isset($phpmailer)) {
                    $ts_mail_errors[] = $phpmailer->ErrorInfo;
                    $return = Array("result"=>GESTIONALEAUTO_SENDREQUEST_ERROR, "message" => $ts_mail_errors[0]);
                }
                $return = Array("result"=>GESTIONALEAUTO_SENDREQUEST_ERROR, "message" => __("ERROR: The request can't be sent"));
            }
            else{
                $return = Array("result"=>GESTIONALEAUTO_SENDREQUEST_OK, "message" => __("YOUR REQUEST HAS BEEN SENT. Thank you for completing our contact form. We have received your contact form correctly."));
            }
        }
        else{
            $return = Array("result"=>GESTIONALEAUTO_SENDREQUEST_ERROR, "message" => __("CONFIGURATION ERROR: request's destination is not set"));
        }
        
        return $return;
    }
    
    
    public function _handle_content($content){
        if (strpos($content, '[-main-]')) {
            
            $requestOutput = "";
            
            if(array_key_exists("gestionaleautomail-submit", $_POST)){
                
                $requestresult = $this->_send_request();
                                
                if($requestresult['result']==GESTIONALEAUTO_SENDREQUEST_ERROR)
                    $requestOutput = '<div class="gestionaleautomail-output-error"><p>'.$requestresult['message'].'</p></div>';
                else
                    $requestOutput = '<div class="gestionaleautomail-output-ok"><p>'.$requestresult['message'].'</p></div>';
            }
            
            if (!array_key_exists("vehicle_id", $_GET)){
                                $models = array();
                if (array_key_exists("make_id", $_GET)){
                    $models = $this->_get_ga_api_client()->getLookupModel($_GET["make_id"]);
                }
                $lookups = $this->_get_ga_api_client()->getMultipleLookups(Array('make', 'usage', 'body'));
                
                $search_form = GestionaleAutoContent::searchForm(
                    $lookups->make,
                    $models,
                    $lookups->usage,
                    $lookups->body
                );
                
                                $parameters = array();
                $start = array_key_exists("liststart", $_GET) ? $_GET["liststart"] : (array_key_exists("liststart", $_POST) ? $_POST["liststart"] : 0);
                $limit = array_key_exists("listlimit", $_GET) ? $_GET["listlimit"] : (array_key_exists("listlimit", $_POST) ? $_POST["listlimit"] : 20);
                
                $old_make_id = array_key_exists("old_make_id", $_SESSION) ? $_SESSION["old_make_id"]: -1;
                $make_id = array_key_exists("make_id", $_GET) ? $_GET["make_id"] : (array_key_exists("make_id", $_POST) ? $_POST["make_id"] : -1);
                $model_id = array_key_exists("model_id", $_GET) ? $_GET["model_id"] : (array_key_exists("model_id", $_POST) ? $_POST["model_id"] : -1);
                $usage_id = array_key_exists("usage_id", $_GET) ? $_GET["usage_id"] : (array_key_exists("usage_id", $_POST) ? $_POST["usage_id"] : -1);
                $body_id = array_key_exists("body_id", $_GET) ? $_GET["body_id"] : (array_key_exists("body_id", $_POST) ? $_POST["body_id"] : -1);
                $order_by = array_key_exists("order_by", $_GET) ? $_GET["order_by"] : (array_key_exists("order_by", $_POST) ? $_POST["order_by"] : -1);
                $order_type = array_key_exists("order_type", $_GET) ? $_GET["order_type"] : (array_key_exists("order_type", $_POST) ? $_POST["order_type"] : -1);
                if ($make_id != -1){
                    $parameters["make_id"] = $make_id;
                }
                                if ($old_make_id != $make_id){
                    $model_id = -1;
                    $_SESSION["old_make_id"] = $make_id;
                }
                if ($model_id != -1){
                    $parameters["model_id"] = $model_id;
                }
                if ($usage_id != -1){
                    $parameters["usage_id"] = $usage_id;
                }
                if ($body_id != -1){
                    $parameters["body_id"] = $body_id;
                }
                if ($order_by != -1){
                    $parameters["order_by"] = $order_by;
                }
                if ($order_type != -1){
                    $parameters["order_type"] = $order_type;
                }
                
                if($start>0){
                    $parameters["offset"] = $start;
                    $parameters["limit"] = $limit; 
               }
                
                $vehicles = $this->_get_ga_api_client()->getStockList($parameters);
                if (count($vehicles) < $limit){
                    $limit = count($vehicles);
                }
                if($start>0){
                    $vehicles_to_show = $vehicles;
                    $totrows = array_key_exists("totrows", $_GET) ? $_GET["totrows"] : (array_key_exists("totrows", $_POST) ? $_POST["totrows"] : $limit);
                }
                else{
                    $vehicles_to_show = array();
                    for ($i = $start; $i < $limit; $i++){
                        $vehicles_to_show[] = $vehicles[$i];
                    }
                    $totrows = count($vehicles);
                }
                
                $content .= GestionaleAutoContent::vehiclesList(
                        $vehicles_to_show, 
                        $this->_page_id,
                        $totrows
                );
                
		$content = str_replace('[-main-]', $search_form, $content);

            }
            else{
                $vehicle = $this->_get_ga_api_client()->getStockDetail($_GET['vehicle_id']);
                
                $content .= GestionaleAutoContent::vehicleDetail(
                        $vehicle
                );
                
		$content = str_replace('[-main-]', $search_form, $content);
            }
        }
        
        return $requestOutput.$content;
    }
    
    
    public function _add_css(){
         wp_register_style( 'ga-css', plugins_url( 'css/gestionaleauto.css' , __FILE__ ));
         wp_enqueue_style( 'ga-css' );
         wp_enqueue_style( 'ga-fancycss' , plugins_url( 'fancybox/jquery.fancybox-1.3.4.css' , __FILE__ ));
    }
    
    
    public function _add_js(){
         wp_enqueue_script( 'ga-toolsjs', plugins_url( 'js/jquery.tools.min.js' , __FILE__ ), array('jquery') );
         wp_enqueue_script( 'ga-fancyjs', plugins_url( 'fancybox/jquery.fancybox-1.3.4.pack.js' , __FILE__ ), array('jquery') );
         wp_enqueue_script( 'ga-validatejs', plugins_url( 'js/jquery.validate.min.js' , __FILE__ ), array('jquery') );
    }
    
    
    
    function _init_translations() {
        $plugin_dir = basename(dirname(__FILE__));
        load_plugin_textdomain( 'default', false, $plugin_dir );
    }

    
    
    public function __construct() {
        
        $options = get_option('gestionaleauto-settings');
        if(is_array($options)){
            $this->_page_title = $options['page_name'];
            $this->_page_id = $options['page_id'];
            if($options['page_id']!="-1"){
                $the_page = get_page($this->_page_id);
                $the_page->post_name = $this->_page_title;
                $the_page->post_title = $this->_page_title;
                $this->_page_id = wp_update_post($the_page);
            }
        }
        
                add_filter('the_content', array($this, '_handle_content'));

                add_action( 'wp_enqueue_scripts', array($this, '_add_css') );

                add_action( 'wp_enqueue_scripts', array($this, '_add_js') );
        
                add_action('plugins_loaded', array($this, '_init_translations'));
        
    }
}

?>

Did this file decode correctly?

Original Code

eval(base64_decode("cmVxdWlyZV9vbmNlICdjbGFzcy1nZXN0aW9uYWxlYXV0b2NvbnRlbnQucGhwJzsKcmVxdWlyZV9vbmNlICdHQUFQSUNsaWVudC5waHAnOwoKZGVmaW5lKCJHRVNUSU9OQUxFQVVUT19TRU5EUkVRVUVTVF9FUlJPUiIsICJHRVNUSU9OQUxFQVVUT19TRU5EUkVRVUVTVF9FUlJPUiIpOwpkZWZpbmUoIkdFU1RJT05BTEVBVVRPX1NFTkRSRVFVRVNUX09LIiwgIkdFU1RJT05BTEVBVVRPX1NFTkRSRVFVRVNUX09LIik7CgoKY2xhc3MgR2VzdGlvbmFsZUF1dG97CiAgICAKICAgIAogICAgcHJpdmF0ZSAkX3BhZ2VfaWQgPSAtMTsKICAgIAogICAgCiAgICBwcml2YXRlICRfcGFnZV90aXRsZTsKICAgIAogICAgCiAgICBwcml2YXRlICRfZ2FfYXBpX2NsaWVudDsKICAgIAogICAgCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRfZ2FfYXBpX2NsaWVudCgpewogICAgICAgICRvcHRpb25zID0gZ2V0X29wdGlvbignZ2VzdGlvbmFsZWF1dG8tc2V0dGluZ3MnKTsKICAgICAgICBpZiAoISRvcHRpb25zKXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoISR0aGlzLT5fZ2FfYXBpX2NsaWVudCl7CiAgICAgICAgICAgICR0aGlzLT5fZ2FfYXBpX2NsaWVudCA9IG5ldyBHQUFQSUNsaWVudCgKICAgICAgICAgICAgICAgICAgICAkb3B0aW9uc1snYXBpX2tleSddLAogICAgICAgICAgICAgICAgICAgICRvcHRpb25zWydhcGlfc2VjcmV0J10sCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfa2V5X2V4aXN0cygiYXBpX2h0dHBzIiwgJG9wdGlvbnMpLAogICAgICAgICAgICAgICAgICAgICRvcHRpb25zWydhcGlfdXJsJ10KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fZ2FfYXBpX2NsaWVudDsKICAgIH0KICAgIAogICAgCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRfcGFnZV9pZCgpewogICAgICAgJHRoZV9wYWdlID0gZ2V0X3BhZ2VfYnlfdGl0bGUoJHRoaXMtPl9wYWdlX3RpdGxlKTsgCiAgICAgICBpZiAoISR0aGVfcGFnZSl7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfWVsc2V7CiAgICAgICAgICAgcmV0dXJuICR0aGVfcGFnZS0+SUQ7CiAgICAgICB9CiAgICB9CiAgICAKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9hY3RpdmF0ZV9wbHVnaW4oKXsKICAgICAgICAkdGhlX3BhZ2UgPSBnZXRfcGFnZV9ieV90aXRsZSgkdGhpcy0+X3BhZ2VfdGl0bGUpOwogICAgICAgIAogICAgICAgIGlmICghJHRoZV9wYWdlKXsKICAgICAgICAgICAgICAgICAgICAgICAgJF9wID0gYXJyYXkoKTsKICAgICAgICAgICAgJF9wWydwb3N0X3RpdGxlJ10gICAgID0gJHRoaXMtPl9wYWdlX3RpdGxlOwogICAgICAgICAgICAkX3BbJ3Bvc3RfbmFtZSddICAgICA9ICR0aGlzLT5fcGFnZV90aXRsZTsKICAgICAgICAgICAgJF9wWydwb3N0X2NvbnRlbnQnXSAgID0gIlstbWFpbi1dIjsKICAgICAgICAgICAgJF9wWydwb3N0X3N0YXR1cyddICAgID0gJ3B1Ymxpc2gnOwogICAgICAgICAgICAkX3BbJ3Bvc3RfdHlwZSddICAgICAgPSAncGFnZSc7CiAgICAgICAgICAgICRfcFsnY29tbWVudF9zdGF0dXMnXSA9ICdjbG9zZWQnOwogICAgICAgICAgICAkX3BbJ3Bpbmdfc3RhdHVzJ10gICAgPSAnY2xvc2VkJzsKICAgICAgICAgICAgJF9wWydwb3N0X2NhdGVnb3J5J10gPSBhcnJheSgxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fcGFnZV9pZCA9IHdwX2luc2VydF9wb3N0KCRfcCk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fcGFnZV9pZCA9ICR0aGVfcGFnZS0+SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGVfcGFnZS0+cG9zdF9zdGF0dXMgPSAncHVibGlzaCc7CiAgICAgICAgICAgICR0aGlzLT5fcGFnZV9pZCA9IHdwX3VwZGF0ZV9wb3N0KCR0aGVfcGFnZSk7CiAgICAgICAgfQogICAgICAgICRvcHRpb25zID0gZ2V0X29wdGlvbignZ2VzdGlvbmFsZWF1dG8tc2V0dGluZ3MnKTsKICAgICAgICAkb3B0aW9uc1sncGFnZV9pZCddID0gJHRoaXMtPl9wYWdlX2lkOwogICAgICAgIHVwZGF0ZV9vcHRpb24oJ2dlc3Rpb25hbGVhdXRvLXNldHRpbmdzJywgJG9wdGlvbnMpOwogICAgfQogICAgCiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBfZGVhY3RpdmF0ZV9wbHVnaW4oKXsKICAgICAgICBpZiAoJHRoaXMtPl9wYWdlX2lkICE9IC0xKXsKICAgICAgICAgICAgd3BfZGVsZXRlX3Bvc3QoJHRoaXMtPl9wYWdlX2lkLCB0cnVlKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9zZW5kX3JlcXVlc3QoKXsKICAgICAgICAkcmV0dXJuID0gQXJyYXkoKTsKICAgICAgICAKICAgICAgICAkb3B0aW9ucyA9IGdldF9vcHRpb24oJ2dlc3Rpb25hbGVhdXRvLXNldHRpbmdzJyk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRpb25zKSAmJiAkb3B0aW9uc1sncmVjaXBpZW50J10hPSIiKXsKICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgJHZlaGljbGUgPSAkdGhpcy0+X2dldF9nYV9hcGlfY2xpZW50KCktPmdldFN0b2NrRGV0YWlsKCRfR0VUWyd2ZWhpY2xlX2lkJ10pOwoKICAgICAgICAgICAgdHJ5eyAgICAgICAgICAgICAgICAkdGhpcy0+X2dldF9nYV9hcGlfY2xpZW50KCktPnNhdmVSZXF1ZXN0KCRfR0VUWyd2ZWhpY2xlX2lkJ10sICRfUE9TVFsiZ2VzdGlvbmFsZWF1dG9tYWlsLW5hbWUiXSwgJF9QT1NUWyJnZXN0aW9uYWxlYXV0b21haWwtcGhvbmUiXSwgJF9QT1NUWyJnZXN0aW9uYWxlYXV0b21haWwtbWFpbCJdLCAkX1BPU1RbImdlc3Rpb25hbGVhdXRvbWFpbC1yZXF1ZXN0Il0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gJGUpe30KICAgICAgICAgICAgCiAgICAgICAgICAgICRjYXJfdGV4dCA9IHN0cnRvdXBwZXIoJHZlaGljbGUtPm1vZGVsLT5tYWtlIC4gIiAiIC4gJHZlaGljbGUtPm1vZGVsLT5tb2RlbCk7CiAgICAgICAgICAgICRjYXJfY29uZGl0aW9uX3RtcCA9IHN0cnRvbG93ZXIoJHZlaGljbGUtPnVzYWdlKTsKICAgICAgICAgICAgJGNhcl9jb25kaXRpb24gPSB1Y2ZpcnN0KCRjYXJfY29uZGl0aW9uX3RtcCkuKCgkY2FyX2NvbmRpdGlvbl90bXAgIT0gIm51b3ZvIiAmJiAkY2FyX2NvbmRpdGlvbl90bXAgIT0gImttIDAiICYmIGlzc2V0KCR2ZWhpY2xlLT5rbSkgJiYgJHZlaGljbGUtPmttID4gMTApPygiLCBLbSAiLm51bWJlcl9mb3JtYXQoJHZlaGljbGUtPmttLDAsICIsIiwgIi4iKSk6IiIpOwkJCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAkb2JqZWN0ID0gIlJpY2hpZXN0YSBkaSBpbmZvcm1hemlvbmkgZGFsIHNpdG8iOwoKICAgICAgICAgICAgICAgICAgICAgICAgJGJvZHkgPSAiPGRpdiBzdHlsZT0nZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9J21hcmdpbi10b3A6IDEwcHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7IGJhY2tncm91bmQ6ICNEREREREQ7IGZvbnQtc2l6ZTogMTRweDsnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VudGlsZSBDbGllbnRlLCA8YnI+PGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW4gY29udGF0dG8gaGEgcmljaGllc3RvIGluZm9ybWF6aW9uaSBzdSB1biB2ZWljb2xvLjxicj48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPkRBVEkgREVMIFZFSUNPTE88L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBzdHlsZT1cImxpc3Qtc3R5bGUtdHlwZTpvdXRzaWRlXCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4XCI+PHN0cm9uZz5Nb2RlbGxvOjwvc3Ryb25nPiZuYnNwOyIuJGNhcl90ZXh0LiI8L2xpPiI7CiAgICAgICAgICAgIGlmKGlzc2V0KCR2ZWhpY2xlLT5pbnRlcm5hbF9jb2RlKSAmJiAkdmVoaWNsZS0+aW50ZXJuYWxfY29kZSE9ICIiKXsKICAgICAgICAgICAgICAgICRib2R5IC49ICIgICAgICA8bGkgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEwcHhcIj48c3Ryb25nPlJpZmVyaW1lbnRvIGludGVybm86PC9zdHJvbmc+Jm5ic3A7Ii4kdmVoaWNsZS0+aW50ZXJuYWxfY29kZS4iPC9saT4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYm9keSAuPSAiICAgICAgICAgIDxsaSBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweFwiPjxzdHJvbmc+Q29kaWNlIEdlc3Rpb25hbGVBdXRvOjwvc3Ryb25nPiZuYnNwOyIuJHZlaGljbGUtPmlkLiI8L2xpPiI7CiAgICAgICAgICAgICRib2R5IC49ICIgICAgICAgICAgPGxpIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4XCI+PHN0cm9uZz5Db25kaXppb25lOjwvc3Ryb25nPiZuYnNwOyIuJGNhcl9jb25kaXRpb24uIjwvbGk+IjsKCiAgICAgICAgICAgIGlmKGlzc2V0KCR2ZWhpY2xlLT5wbGF0ZSkgJiYgJHZlaGljbGUtPnBsYXRlIT0gIiIpewogICAgICAgICAgICAgICAgJGJvZHkgLj0gIiAgICAgIDxsaSBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweFwiPjxzdHJvbmc+VGFyZ2E6PC9zdHJvbmc+Jm5ic3A7Ii4kdmVoaWNsZS0+cGxhdGUuIjwvbGk+IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpc3NldCgkdmVoaWNsZS0+dmluKSAmJiAkdmVoaWNsZS0+dmluIT0gIiIpewogICAgICAgICAgICAgICAgJGJvZHkgLj0gIiAgICAgIDxsaSBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTBweFwiPjxzdHJvbmc+VGVsYWlvOjwvc3Ryb25nPiZuYnNwOyIuJHZlaGljbGUtPnZpbi4iPC9saT4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYm9keS49IiAgICAgICAgPC91bD48YnI+PGJyPiI7CgogICAgICAgICAgICAkYm9keS49IiAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGkgc2VndWl0byBpIGRhdGkgZGVsIHJpY2hpZWRlbnRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSc5NSUnID4KCiAgICAgICAgICAgICI7CgogICAgICAgICAgICAkYm9keSAuPSAiICAgICAgICAgIDx0cj48dGQgc3R5bGU9J2ZvbnQtc2l6ZTogMTRweDsnPk5vbWUgZSBjb2dub21lOjwvdGQ+PHRkIHN0eWxlPSdmb250LXNpemU6IDE0cHg7ICc+Ii4kX1BPU1RbImdlc3Rpb25hbGVhdXRvbWFpbC1uYW1lIl0uIjwvdGQ+PC90cj5cbiI7CiAgICAgICAgICAgICRib2R5IC49ICIgICAgICAgICAgPHRyPjx0ZCBzdHlsZT0nZm9udC1zaXplOiAxNHB4Oyc+RW1haWw6PC90ZD48dGQgc3R5bGU9J2ZvbnQtc2l6ZTogMTRweDsgJz4iLiRfUE9TVFsiZ2VzdGlvbmFsZWF1dG9tYWlsLW1haWwiXS4iPC90ZD48L3RyPlxuIjsKICAgICAgICAgICAgJGJvZHkgLj0gIiAgICAgICAgICA8dHI+PHRkIHN0eWxlPSdmb250LXNpemU6IDE0cHg7Jz5UZWxlZm9ubzo8L3RkPjx0ZCBzdHlsZT0nZm9udC1zaXplOiAxNHB4OyAnPiIuKCgkX1BPU1RbImdlc3Rpb25hbGVhdXRvbWFpbC1waG9uZSJdICE9ICIiKT8kX1BPU1RbImdlc3Rpb25hbGVhdXRvbWFpbC1waG9uZSJdOiItIikuIjwvdGQ+PC90cj5cbiI7CgogICAgICAgICAgICAkYm9keSAgICAgLj0iICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpIHNlZ3VpdG8gaSBkZXR0YWdsaSBkZWxsYSByaWNoaWVzdGEgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9J2ZvbnQtc2l6ZTogMTZweDsnPjxzcGFuIHN0eWxlPSdjb2xvcjogI0YwMCc+Ii5zdHJpcHNsYXNoZXMoJF9QT1NUWyJnZXN0aW9uYWxlYXV0b21haWwtcmVxdWVzdCJdKS4iPC9zcGFuPjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXppZSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5JbCB0ZWFtIGRpIEdlc3Rpb25hbGVBdXRvLmNvbTwvYj48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vd3d3Lmdlc3Rpb25hbGVhdXRvLmNvbS8nPnd3dy5nZXN0aW9uYWxlYXV0by5jb208L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PiI7CgoKCiAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkZXJzID0gQXJyYXkoIkZyb206ICIuJF9QT1NUWyJnZXN0aW9uYWxlYXV0b21haWwtbmFtZSJdLiIgPCIuJF9QT1NUWyJnZXN0aW9uYWxlYXV0b21haWwtbWFpbCJdLiI+Iik7CgogICAgICAgICAgICBhZGRfZmlsdGVyKCd3cF9tYWlsX2NvbnRlbnRfdHlwZScsY3JlYXRlX2Z1bmN0aW9uKCcnLCAncmV0dXJuICJ0ZXh0L2h0bWwiOycpKTsKICAgICAgICAgICAgJHdwbWFpbF9yZXN1bHQgPSB3cF9tYWlsKCRvcHRpb25zWydyZWNpcGllbnQnXSwgJG9iamVjdCwgJGJvZHksICRoZWFkZXJzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghJHdwbWFpbF9yZXN1bHQpIHsKICAgICAgICAgICAgICAgIGdsb2JhbCAkdHNfbWFpbF9lcnJvcnM7CiAgICAgICAgICAgICAgICBnbG9iYWwgJHBocG1haWxlcjsKICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJHRzX21haWxfZXJyb3JzKSkgJHRzX21haWxfZXJyb3JzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkcGhwbWFpbGVyKSkgewogICAgICAgICAgICAgICAgICAgICR0c19tYWlsX2Vycm9yc1tdID0gJHBocG1haWxlci0+RXJyb3JJbmZvOwogICAgICAgICAgICAgICAgICAgICRyZXR1cm4gPSBBcnJheSgicmVzdWx0Ij0+R0VTVElPTkFMRUFVVE9fU0VORFJFUVVFU1RfRVJST1IsICJtZXNzYWdlIiA9PiAkdHNfbWFpbF9lcnJvcnNbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJldHVybiA9IEFycmF5KCJyZXN1bHQiPT5HRVNUSU9OQUxFQVVUT19TRU5EUkVRVUVTVF9FUlJPUiwgIm1lc3NhZ2UiID0+IF9fKCJFUlJPUjogVGhlIHJlcXVlc3QgY2FuJ3QgYmUgc2VudCIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgJHJldHVybiA9IEFycmF5KCJyZXN1bHQiPT5HRVNUSU9OQUxFQVVUT19TRU5EUkVRVUVTVF9PSywgIm1lc3NhZ2UiID0+IF9fKCJZT1VSIFJFUVVFU1QgSEFTIEJFRU4gU0VOVC4gVGhhbmsgeW91IGZvciBjb21wbGV0aW5nIG91ciBjb250YWN0IGZvcm0uIFdlIGhhdmUgcmVjZWl2ZWQgeW91ciBjb250YWN0IGZvcm0gY29ycmVjdGx5LiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICAkcmV0dXJuID0gQXJyYXkoInJlc3VsdCI9PkdFU1RJT05BTEVBVVRPX1NFTkRSRVFVRVNUX0VSUk9SLCAibWVzc2FnZSIgPT4gX18oIkNPTkZJR1VSQVRJT04gRVJST1I6IHJlcXVlc3QncyBkZXN0aW5hdGlvbiBpcyBub3Qgc2V0IikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gJHJldHVybjsKICAgIH0KICAgIAogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX2hhbmRsZV9jb250ZW50KCRjb250ZW50KXsKICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAnWy1tYWluLV0nKSkgewogICAgICAgICAgICAKICAgICAgICAgICAgJHJlcXVlc3RPdXRwdXQgPSAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImdlc3Rpb25hbGVhdXRvbWFpbC1zdWJtaXQiLCAkX1BPU1QpKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHJlcXVlc3RyZXN1bHQgPSAkdGhpcy0+X3NlbmRfcmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYoJHJlcXVlc3RyZXN1bHRbJ3Jlc3VsdCddPT1HRVNUSU9OQUxFQVVUT19TRU5EUkVRVUVTVF9FUlJPUikKICAgICAgICAgICAgICAgICAgICAkcmVxdWVzdE91dHB1dCA9ICc8ZGl2IGNsYXNzPSJnZXN0aW9uYWxlYXV0b21haWwtb3V0cHV0LWVycm9yIj48cD4nLiRyZXF1ZXN0cmVzdWx0WydtZXNzYWdlJ10uJzwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICRyZXF1ZXN0T3V0cHV0ID0gJzxkaXYgY2xhc3M9Imdlc3Rpb25hbGVhdXRvbWFpbC1vdXRwdXQtb2siPjxwPicuJHJlcXVlc3RyZXN1bHRbJ21lc3NhZ2UnXS4nPC9wPjwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygidmVoaWNsZV9pZCIsICRfR0VUKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGVscyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygibWFrZV9pZCIsICRfR0VUKSl7CiAgICAgICAgICAgICAgICAgICAgJG1vZGVscyA9ICR0aGlzLT5fZ2V0X2dhX2FwaV9jbGllbnQoKS0+Z2V0TG9va3VwTW9kZWwoJF9HRVRbIm1ha2VfaWQiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbG9va3VwcyA9ICR0aGlzLT5fZ2V0X2dhX2FwaV9jbGllbnQoKS0+Z2V0TXVsdGlwbGVMb29rdXBzKEFycmF5KCdtYWtlJywgJ3VzYWdlJywgJ2JvZHknKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRzZWFyY2hfZm9ybSA9IEdlc3Rpb25hbGVBdXRvQ29udGVudDo6c2VhcmNoRm9ybSgKICAgICAgICAgICAgICAgICAgICAkbG9va3Vwcy0+bWFrZSwKICAgICAgICAgICAgICAgICAgICAkbW9kZWxzLAogICAgICAgICAgICAgICAgICAgICRsb29rdXBzLT51c2FnZSwKICAgICAgICAgICAgICAgICAgICAkbG9va3Vwcy0+Ym9keQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRzdGFydCA9IGFycmF5X2tleV9leGlzdHMoImxpc3RzdGFydCIsICRfR0VUKSA/ICRfR0VUWyJsaXN0c3RhcnQiXSA6IChhcnJheV9rZXlfZXhpc3RzKCJsaXN0c3RhcnQiLCAkX1BPU1QpID8gJF9QT1NUWyJsaXN0c3RhcnQiXSA6IDApOwogICAgICAgICAgICAgICAgJGxpbWl0ID0gYXJyYXlfa2V5X2V4aXN0cygibGlzdGxpbWl0IiwgJF9HRVQpID8gJF9HRVRbImxpc3RsaW1pdCJdIDogKGFycmF5X2tleV9leGlzdHMoImxpc3RsaW1pdCIsICRfUE9TVCkgPyAkX1BPU1RbImxpc3RsaW1pdCJdIDogMjApOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkb2xkX21ha2VfaWQgPSBhcnJheV9rZXlfZXhpc3RzKCJvbGRfbWFrZV9pZCIsICRfU0VTU0lPTikgPyAkX1NFU1NJT05bIm9sZF9tYWtlX2lkIl06IC0xOwogICAgICAgICAgICAgICAgJG1ha2VfaWQgPSBhcnJheV9rZXlfZXhpc3RzKCJtYWtlX2lkIiwgJF9HRVQpID8gJF9HRVRbIm1ha2VfaWQiXSA6IChhcnJheV9rZXlfZXhpc3RzKCJtYWtlX2lkIiwgJF9QT1NUKSA/ICRfUE9TVFsibWFrZV9pZCJdIDogLTEpOwogICAgICAgICAgICAgICAgJG1vZGVsX2lkID0gYXJyYXlfa2V5X2V4aXN0cygibW9kZWxfaWQiLCAkX0dFVCkgPyAkX0dFVFsibW9kZWxfaWQiXSA6IChhcnJheV9rZXlfZXhpc3RzKCJtb2RlbF9pZCIsICRfUE9TVCkgPyAkX1BPU1RbIm1vZGVsX2lkIl0gOiAtMSk7CiAgICAgICAgICAgICAgICAkdXNhZ2VfaWQgPSBhcnJheV9rZXlfZXhpc3RzKCJ1c2FnZV9pZCIsICRfR0VUKSA/ICRfR0VUWyJ1c2FnZV9pZCJdIDogKGFycmF5X2tleV9leGlzdHMoInVzYWdlX2lkIiwgJF9QT1NUKSA/ICRfUE9TVFsidXNhZ2VfaWQiXSA6IC0xKTsKICAgICAgICAgICAgICAgICRib2R5X2lkID0gYXJyYXlfa2V5X2V4aXN0cygiYm9keV9pZCIsICRfR0VUKSA/ICRfR0VUWyJib2R5X2lkIl0gOiAoYXJyYXlfa2V5X2V4aXN0cygiYm9keV9pZCIsICRfUE9TVCkgPyAkX1BPU1RbImJvZHlfaWQiXSA6IC0xKTsKICAgICAgICAgICAgICAgICRvcmRlcl9ieSA9IGFycmF5X2tleV9leGlzdHMoIm9yZGVyX2J5IiwgJF9HRVQpID8gJF9HRVRbIm9yZGVyX2J5Il0gOiAoYXJyYXlfa2V5X2V4aXN0cygib3JkZXJfYnkiLCAkX1BPU1QpID8gJF9QT1NUWyJvcmRlcl9ieSJdIDogLTEpOwogICAgICAgICAgICAgICAgJG9yZGVyX3R5cGUgPSBhcnJheV9rZXlfZXhpc3RzKCJvcmRlcl90eXBlIiwgJF9HRVQpID8gJF9HRVRbIm9yZGVyX3R5cGUiXSA6IChhcnJheV9rZXlfZXhpc3RzKCJvcmRlcl90eXBlIiwgJF9QT1NUKSA/ICRfUE9TVFsib3JkZXJfdHlwZSJdIDogLTEpOwogICAgICAgICAgICAgICAgaWYgKCRtYWtlX2lkICE9IC0xKXsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVyc1sibWFrZV9pZCJdID0gJG1ha2VfaWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRvbGRfbWFrZV9pZCAhPSAkbWFrZV9pZCl7CiAgICAgICAgICAgICAgICAgICAgJG1vZGVsX2lkID0gLTE7CiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWyJvbGRfbWFrZV9pZCJdID0gJG1ha2VfaWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJG1vZGVsX2lkICE9IC0xKXsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVyc1sibW9kZWxfaWQiXSA9ICRtb2RlbF9pZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkdXNhZ2VfaWQgIT0gLTEpewogICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJzWyJ1c2FnZV9pZCJdID0gJHVzYWdlX2lkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRib2R5X2lkICE9IC0xKXsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVyc1siYm9keV9pZCJdID0gJGJvZHlfaWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJG9yZGVyX2J5ICE9IC0xKXsKICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVyc1sib3JkZXJfYnkiXSA9ICRvcmRlcl9ieTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkb3JkZXJfdHlwZSAhPSAtMSl7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtZXRlcnNbIm9yZGVyX3R5cGUiXSA9ICRvcmRlcl90eXBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZigkc3RhcnQ+MCl7CiAgICAgICAgICAgICAgICAgICAgJHBhcmFtZXRlcnNbIm9mZnNldCJdID0gJHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJzWyJsaW1pdCJdID0gJGxpbWl0OyAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkdmVoaWNsZXMgPSAkdGhpcy0+X2dldF9nYV9hcGlfY2xpZW50KCktPmdldFN0b2NrTGlzdCgkcGFyYW1ldGVycyk7CiAgICAgICAgICAgICAgICBpZiAoY291bnQoJHZlaGljbGVzKSA8ICRsaW1pdCl7CiAgICAgICAgICAgICAgICAgICAgJGxpbWl0ID0gY291bnQoJHZlaGljbGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKCRzdGFydD4wKXsKICAgICAgICAgICAgICAgICAgICAkdmVoaWNsZXNfdG9fc2hvdyA9ICR2ZWhpY2xlczsKICAgICAgICAgICAgICAgICAgICAkdG90cm93cyA9IGFycmF5X2tleV9leGlzdHMoInRvdHJvd3MiLCAkX0dFVCkgPyAkX0dFVFsidG90cm93cyJdIDogKGFycmF5X2tleV9leGlzdHMoInRvdHJvd3MiLCAkX1BPU1QpID8gJF9QT1NUWyJ0b3Ryb3dzIl0gOiAkbGltaXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAkdmVoaWNsZXNfdG9fc2hvdyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9ICRzdGFydDsgJGkgPCAkbGltaXQ7ICRpKyspewogICAgICAgICAgICAgICAgICAgICAgICAkdmVoaWNsZXNfdG9fc2hvd1tdID0gJHZlaGljbGVzWyRpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRvdHJvd3MgPSBjb3VudCgkdmVoaWNsZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkY29udGVudCAuPSBHZXN0aW9uYWxlQXV0b0NvbnRlbnQ6OnZlaGljbGVzTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgJHZlaGljbGVzX3RvX3Nob3csIAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X3BhZ2VfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICR0b3Ryb3dzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgCgkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgnWy1tYWluLV0nLCAkc2VhcmNoX2Zvcm0sICRjb250ZW50KTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICR2ZWhpY2xlID0gJHRoaXMtPl9nZXRfZ2FfYXBpX2NsaWVudCgpLT5nZXRTdG9ja0RldGFpbCgkX0dFVFsndmVoaWNsZV9pZCddKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJGNvbnRlbnQgLj0gR2VzdGlvbmFsZUF1dG9Db250ZW50Ojp2ZWhpY2xlRGV0YWlsKAogICAgICAgICAgICAgICAgICAgICAgICAkdmVoaWNsZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIAoJCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoJ1stbWFpbi1dJywgJHNlYXJjaF9mb3JtLCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuICRyZXF1ZXN0T3V0cHV0LiRjb250ZW50OwogICAgfQogICAgCiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBfYWRkX2NzcygpewogICAgICAgICB3cF9yZWdpc3Rlcl9zdHlsZSggJ2dhLWNzcycsIHBsdWdpbnNfdXJsKCAnY3NzL2dlc3Rpb25hbGVhdXRvLmNzcycgLCBfX0ZJTEVfXyApKTsKICAgICAgICAgd3BfZW5xdWV1ZV9zdHlsZSggJ2dhLWNzcycgKTsKICAgICAgICAgd3BfZW5xdWV1ZV9zdHlsZSggJ2dhLWZhbmN5Y3NzJyAsIHBsdWdpbnNfdXJsKCAnZmFuY3lib3gvanF1ZXJ5LmZhbmN5Ym94LTEuMy40LmNzcycgLCBfX0ZJTEVfXyApKTsKICAgIH0KICAgIAogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX2FkZF9qcygpewogICAgICAgICB3cF9lbnF1ZXVlX3NjcmlwdCggJ2dhLXRvb2xzanMnLCBwbHVnaW5zX3VybCggJ2pzL2pxdWVyeS50b29scy5taW4uanMnICwgX19GSUxFX18gKSwgYXJyYXkoJ2pxdWVyeScpICk7CiAgICAgICAgIHdwX2VucXVldWVfc2NyaXB0KCAnZ2EtZmFuY3lqcycsIHBsdWdpbnNfdXJsKCAnZmFuY3lib3gvanF1ZXJ5LmZhbmN5Ym94LTEuMy40LnBhY2suanMnICwgX19GSUxFX18gKSwgYXJyYXkoJ2pxdWVyeScpICk7CiAgICAgICAgIHdwX2VucXVldWVfc2NyaXB0KCAnZ2EtdmFsaWRhdGVqcycsIHBsdWdpbnNfdXJsKCAnanMvanF1ZXJ5LnZhbGlkYXRlLm1pbi5qcycgLCBfX0ZJTEVfXyApLCBhcnJheSgnanF1ZXJ5JykgKTsKICAgIH0KICAgIAogICAgCiAgICAKICAgIGZ1bmN0aW9uIF9pbml0X3RyYW5zbGF0aW9ucygpIHsKICAgICAgICAkcGx1Z2luX2RpciA9IGJhc2VuYW1lKGRpcm5hbWUoX19GSUxFX18pKTsKICAgICAgICBsb2FkX3BsdWdpbl90ZXh0ZG9tYWluKCAnZGVmYXVsdCcsIGZhbHNlLCAkcGx1Z2luX2RpciApOwogICAgfQoKICAgIAogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CiAgICAgICAgCiAgICAgICAgJG9wdGlvbnMgPSBnZXRfb3B0aW9uKCdnZXN0aW9uYWxlYXV0by1zZXR0aW5ncycpOwogICAgICAgIGlmKGlzX2FycmF5KCRvcHRpb25zKSl7CiAgICAgICAgICAgICR0aGlzLT5fcGFnZV90aXRsZSA9ICRvcHRpb25zWydwYWdlX25hbWUnXTsKICAgICAgICAgICAgJHRoaXMtPl9wYWdlX2lkID0gJG9wdGlvbnNbJ3BhZ2VfaWQnXTsKICAgICAgICAgICAgaWYoJG9wdGlvbnNbJ3BhZ2VfaWQnXSE9Ii0xIil7CiAgICAgICAgICAgICAgICAkdGhlX3BhZ2UgPSBnZXRfcGFnZSgkdGhpcy0+X3BhZ2VfaWQpOwogICAgICAgICAgICAgICAgJHRoZV9wYWdlLT5wb3N0X25hbWUgPSAkdGhpcy0+X3BhZ2VfdGl0bGU7CiAgICAgICAgICAgICAgICAkdGhlX3BhZ2UtPnBvc3RfdGl0bGUgPSAkdGhpcy0+X3BhZ2VfdGl0bGU7CiAgICAgICAgICAgICAgICAkdGhpcy0+X3BhZ2VfaWQgPSB3cF91cGRhdGVfcG9zdCgkdGhlX3BhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcigndGhlX2NvbnRlbnQnLCBhcnJheSgkdGhpcywgJ19oYW5kbGVfY29udGVudCcpKTsKCiAgICAgICAgICAgICAgICBhZGRfYWN0aW9uKCAnd3BfZW5xdWV1ZV9zY3JpcHRzJywgYXJyYXkoJHRoaXMsICdfYWRkX2NzcycpICk7CgogICAgICAgICAgICAgICAgYWRkX2FjdGlvbiggJ3dwX2VucXVldWVfc2NyaXB0cycsIGFycmF5KCR0aGlzLCAnX2FkZF9qcycpICk7CiAgICAgICAgCiAgICAgICAgICAgICAgICBhZGRfYWN0aW9uKCdwbHVnaW5zX2xvYWRlZCcsIGFycmF5KCR0aGlzLCAnX2luaXRfdHJhbnNsYXRpb25zJykpOwogICAgICAgIAogICAgfQp9Cgo/Pg=="));

Function Calls

base64_decode 1

Variables

None

Stats

MD5 d1b2f287e87c54081d2ec60e0db03a5e
Eval Count 1
Decode Time 112 ms