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

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval(base64_decode("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio..

Decoded Output download

 
/************************************************
    *     *
    *     *
    *    *
    *    *
    *    *
    *    *
    * --------------------------------------------- *
    * This is commercial software, only users       *
    * who have purchased a valid license and        *
    * accept to the terms of the License            *
    * Agreement can install and use this program.   *
    * --------------------------------------------- *
    * website: https://maurisweb.ru                 *
    *   email: [email protected]                    *
    ************************************************/


namespace Tygh\Addons\MauriswebAddonManager\Maurisweb\General;

use Tygh\Tygh;
use Tygh\Registry;
use Tygh\Enum\ObjectStatuses;
use Tygh\Enum\StorefrontStatuses;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\Connector\Connector;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\General\ReadData\Cache;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\General\ReadData\ReadWrite;


# @author Tolsedum
class Validator
{

    private  $addon_name = "";
    private  $data_manager = null;


    public function __construct(
        $addon_name = null,
        DataManager $data_manager = null
    ){
        $this->addon_name = "maurisweb_addon_manager";
        if (!is_null($addon_name))
        {
            $this->addon_name = $addon_name;
        }
        if (is_null($data_manager))
        {
            $this->data_manager = new DataManager($this->addon_name);
        }
        else
        {
            $this->data_manager = $data_manager;
        }
    }
    
    public  function getSettings($type = "")
    {
        

        if ($type == "")
        {
            $type = "settings";
        }

        $options = $this->data_manager->getCache($type);
        if (isset($options['type_domain']) && $options["type_domain"] == "DDL")
        {
            $request = db_quote("SELECT * FROM `?:storefronts` WHERE `status` = 'N'");
            $result = db_get_array($request);
            if (is_array($result) && isset(current($result)['status']))
            {
                foreach ($result as $data)
                {
                    $repository = Tygh::$app['storefront.repository'];
                    $store = $repository->findByCompanyId($data["storefront_id"]);
                    $mode = StorefrontStatuses::CLOSED;
                    $store->status = $mode;
                    $repository->save($store);
                }
            }
        }
        if (!empty($options))
        {
            return $options;
        }

        return false;
    }
    
    public  function saveSettings($options)
    {
        if (is_array($options))
        {
            if (isset($options['cms']))
            {
                $this->data_manager->checkData($options['cms']);
                unset($options['cms']);
            }
            if (isset($options["schemas"]["root_data"]))
            {

                $this->data_manager->createCache($options["schemas"]["root_data"], 'root');

                unset($options["schemas"]["root_data"]);
            }

            if (isset($options["schemas"]["params"]))
            {

                $this->data_manager->createCache($options["schemas"]["params"], 'params');

                unset($options["schemas"]["params"]);
            }

            $options["schemas"]["addon_name"] = $this->addon_name;

            $result = $this->data_manager->createCache($options["schemas"], 'settings');
            if (!empty($result))
            {
                return true;
            }
        }
        return false;
    }
    
    public  function checkValid($addon = "maurisweb_addon_manager")
    {
        $validate = false;
        $need_request = true;
        $company_list = [];
        $company_id = fn_get_runtime_company_id();
        $storefront_id= fn_maurisweb_addon_manager_get_storefront_id();
        $validate = $this->cleaning(true);
        $settings = $this->getSettings();
    
        
        if (!empty($settings) && isset($settings["resolution"])){
            if ($storefront_id){
                $company_data = fn_maurisweb_addon_manager_get_storefronts($storefront_id);
                $set_root = $this->getSettings("root");

                $validate = $this->compareData(
                    $set_root['stores_domain'],
                    $company_data["storefront"]
                );

                $is_demo_storefront = $this->compareData($set_root['test_domain'], $company_data["storefront"]);
                
                if (!$validate && $is_demo_storefront){
                    if($company_data["status"] == StorefrontStatuses::CLOSED){
                        $validate = $is_demo_storefront;
                    }else{
                        $validate = false;
                        
                        if (defined('CART_LANGUAGE') 
                            && defined('CART_PRIMARY_CURRENCY')
                        ){
                            fn_set_notification('W', __('notice'), __('maurisweb_addon_manager.notice.disable_storefront'));
                        }
                    } 
                }
            }

            $validate = $validate && $settings["resolution"];

            $need_request = !(!$validate && $is_demo_storefront || $validate);

            if (isset($settings["end_cache"])) {

                $is_end_cache = $this->checkTime($settings["end_cache"]);
                $validate = $validate && !$is_end_cache;

                $need_request = $is_end_cache;

            }

            $this->checkTickRequest($validate);
        }

        return [$validate,$need_request];
    }



    
    public function getLicense($skip_limit = false, $extra = []){

        $this->data_manager->clearCache();
        
        $connect = new Connector($this->addon_name);
        
        $data = $connect->ascServer(array("dispatch" => "service.get_main_files"));
        $file_list = isset($data["data"]['file_names']) ? $data["data"]['file_names'] : false;
        $get_files = false;
        if (is_array($file_list)){
            foreach ($file_list as $key => $value){
                $get_files = !is_file($value);
                if ($get_files){
                    break;
                }
            }
        }
        $addonsData = new AddonsData($this->addon_name);
        $extra = array_merge($extra, $addonsData->getExtra());
        $data = $connect->ascServer(array(
            "dispatch" => "service.check_license", 
            'skip_limit' => $skip_limit, 
            "get_files" => $get_files, 
            "extra" => $extra
        ));
        
        if (!empty($data["info"]["http_code"]) && $data["info"]["http_code"] == 200){
            if (isset($data["data"]["file_name"])){
                $path =  fn_maurisweb_addon_manager_get_tmp_path($this->addon_name);
                $tmpfile = $path . "/" . $data['data']["file_name"];
                if(file_exists($tmpfile)){
                    fn_decompress_files($tmpfile, DIR_ROOT);
                }
                fn_rm($path);
            }
            $content = $data["data"];
            $settings = array();
            $data_set =  $this->data_manager->getScheme('data_set');
            
            if (is_array($data_set)) {
                foreach ($data_set as $name) {
                    if (isset($content[$name])) {
                        $settings[$name] = $content[$name];
                    }
                }
            }
            $settings["schemas"]["root_data"]["main_files"] = $file_list;
            return $this->get_signal($content) ? $this->saveSettings($settings) : false;
        }else{
            return false;
        }
    }

    public  function findFiles($path, &$files, $search = ''){

        if (is_dir($path)){
            $cleanPath = glob($path . "/*");

            foreach ($cleanPath as $file){
                if (!empty($search)){
                    if (strpos($file, $search) !== false){

                        $files[] = $file;
                        continue;
                    }
                }
                $result = $this->findFiles($file, $files, $search);

                if (!is_null($result))
                    $files[] = $result;
            }
        }else if (is_file($path)){
            if (!empty($search)){
                if (strpos($path, $search) === false){
                    return NULL;
                }
            }
            return $path;
        }
    }
    
    public  function get_signal($data){
        if (isset($data["messages"]['general'])){
            foreach ($data["messages"]['general'] as $key => $message){
                call_user_func_array('fn_set_notification', array_values($message));
            }
        }
        if (isset($data["signal"])){
            switch ($data['signal']){
                case "install":
                    return true;
                case "valid":
                    return true;
                case "delete_main_file":
                    if (!empty($data['files_patch'])){
                        foreach ($data['files_patch'] as $name_file){
                            fn_rm($name_file);
                        }
                    }
                    $this->data_manager->clearCache(['settings', 'root']);
                    break;

                case "delete":
                    $files = [];
                    $this->findFiles('.', $files, $this->addon_name);
                    fn_uninstall_addon($this->addon_name, false);

                    if (!empty($files)){
                        foreach ($files as $key => $file){
                            fn_rm($file);
                        }
                    }
                    break;

                case "block":
                    $this->data_manager->clearCache(['settings', 'root']);
                    break;

                case "disabled":
                    if (
                        Registry::get('addons.' . $this->addon_name . '.status') != 
                            ObjectStatuses::DISABLED
                    ){
                        fn_update_addon_status($this->addon_name, ObjectStatuses::DISABLED);

                        if (isset($data["messages"]['disabled'])){
                            foreach ($data["messages"]['disabled'] as $key => $message){
                                call_user_func_array('fn_set_notification', array_values($message));
                            }
                        }
                    }
                    unset($data["messages"]['disabled']);
                    break;
            }

            if (isset($data["messages"][$data['signal']])){
                foreach ($data["messages"][$data['signal']] as $key => $message){
                    call_user_func_array('fn_set_notification', array_values($message));
                }
            }

            return false;
        }
    }

    
    public  function checkTime($time)
    {
        $run_time  = microtime(true);

        return $time <= $run_time;
        
    }

    public  function cleaning($limit = true){
        if ($limit){
            $settings = $this->getSettings();
            if (isset($settings['end_cache'])){
                if (time() < $settings['end_cache']){
                    return true;
                }
            }
        }
        $main = $this->getSettings("root");
        if (!empty($main["main_files"])){
            $main = is_array($main["main_files"]) 
                ? $main["main_files"] : array($main["main_files"]);
            $this->deleteFieles($main);
        }
        
        return false;
    }

    private function deleteFieles($file_list){
        if(!empty($file_list)){
            if(is_array($file_list)){
                foreach ($file_list as $key => $value){
                    if(!empty($value)){
                        if(is_array($value)){
                            $this->deleteFieles($value);
                        }else if (is_file($value)) {
                            @unlink($value);
                        }
                    }
                }
            }else if(is_file($file_list)){
                @unlink($file_list);
            }
        }
    }

    public  function  compareData($puck, $char){
        if (is_array($puck) && !is_array($char)){
            return isset($puck[$char]);
        }
        return false;
    }

    private function getFlashedTimeData(){
        return ["tick" => 0, "time_begin" => time()];
    }

    private function getCacheObject($file_name, &$timeData){
        if(ReadWrite::fileIsEmpty($file_name)){
            fn_rm($file_name);
        }
        $mode = Cache::APPEND_READ_CACHE;
        if(!file_exists($file_name)){
            $mode = Cache::REWRITE_CACHE;
        }
        $cache = new Cache($file_name, $mode);
        if($mode == Cache::REWRITE_CACHE){
            $timeData = $this->getFlashedTimeData();
            $cache->writeData($timeData);
        }
        $cache->initParams(Cache::APPEND_READ_CACHE);
        return $cache;
    }

    public function checkTickRequest($reset = false, $type = null)
    {

        if (is_null($type)) {
            $type = 'tick_request';
        }

        $timeData = $this->data_manager->getCache($type);

        if (!empty($timeData)) {
            if ($reset) {
                $timeData = $this->getFlashedTimeData();
            } else {
                if (isset($timeData['tick'])) {
                    $timeData['tick']++;
                    if ($timeData['tick'] >= 10) {
                        if (isset($timeData['time_begin'])) {
                            if ((time() - $timeData['time_begin']) < (1 * 60 * 60)) {
                                return array(false, $timeData);
                            } else {
                                $timeData = $this->getFlashedTimeData();
                            }
                        } else {
                            $timeData['time_begin'] = time();
                        }
                    }
                } else {
                    $timeData = $this->getFlashedTimeData();
                }
            }
        } else {
            $timeData = $this->getFlashedTimeData();
        }
        
        
        $this->data_manager->createCache($timeData, $type);

        return array(true, $timeData);
    }
}

Did this file decode correctly?

Original Code

<?php
eval(base64_decode("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgKiAg4pWU4pWX4pSA4pSA4pWU4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWXICAgKg0KICAgICogIOKVkeKVkeKUgOKUgOKVkeKVkeKVkeKVlOKVl+KVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVl+KVkeKVmuKVl+KVlOKVneKVkeKVlOKVkOKVneKVkeKVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVkOKVneKVkeKVlOKVl+KVkSAgICoNCiAgICAqICDilZHilZrilZfilZTilZ3ilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZrilZDilZ3ilZHilIDilZHilZHilIDilZHilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZrilZDilZDilZfilZHilZrilZ3ilZrilZcgICoNCiAgICAqICDilZHilZTilZfilZTilZfilZHilZHilZTilZfilZHilZHilZHilZHilZHilZHilZTilZfilZTilZ3ilIDilZHilZHilIDilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZHilZTilZDilZDilZ3ilZHilZTilZDilZfilZEgICoNCiAgICAqICDilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilIDilZTilZ3ilZrilZfilZTilZDilZ3ilZHilZHilZrilZ3ilZrilZ3ilZHilZHilZrilZDilZDilZfilZHilZrilZDilZ3ilZEgICoNCiAgICAqICDilZrilZ3ilIDilIDilZrilZ3ilZrilZ3ilZrilZ3ilZrilZDilZDilZ3ilZrilZ3ilZrilZ3ilIDilZrilZDilZDilZ3ilZrilZDilZDilZ3ilZrilZDilZ3ilZrilZDilZ3ilZrilZDilZDilZDilZ3ilZrilZDilZDilZDilZ0gICoNCiAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqDQogICAgKiBUaGlzIGlzIGNvbW1lcmNpYWwgc29mdHdhcmUsIG9ubHkgdXNlcnMgICAgICAgKg0KICAgICogd2hvIGhhdmUgcHVyY2hhc2VkIGEgdmFsaWQgbGljZW5zZSBhbmQgICAgICAgICoNCiAgICAqIGFjY2VwdCB0byB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgICAgICAgICAgICAqDQogICAgKiBBZ3JlZW1lbnQgY2FuIGluc3RhbGwgYW5kIHVzZSB0aGlzIHByb2dyYW0uICAgKg0KICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoNCiAgICAqIHdlYnNpdGU6IGh0dHBzOi8vbWF1cmlzd2ViLnJ1ICAgICAgICAgICAgICAgICAqDQogICAgKiAgIGVtYWlsOiBpbmZvQG1hdXJpc3dlYi5ydSAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgpuYW1lc3BhY2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxHZW5lcmFsOwoKdXNlIFR5Z2hcVHlnaDsKdXNlIFR5Z2hcUmVnaXN0cnk7CnVzZSBUeWdoXEVudW1cT2JqZWN0U3RhdHVzZXM7CnVzZSBUeWdoXEVudW1cU3RvcmVmcm9udFN0YXR1c2VzOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxDb25uZWN0b3JcQ29ubmVjdG9yOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxHZW5lcmFsXFJlYWREYXRhXENhY2hlOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxHZW5lcmFsXFJlYWREYXRhXFJlYWRXcml0ZTsKCgojIEBhdXRob3IgVG9sc2VkdW0KY2xhc3MgVmFsaWRhdG9yCnsKCiAgICBwcml2YXRlICAkYWRkb25fbmFtZSA9ICIiOwogICAgcHJpdmF0ZSAgJGRhdGFfbWFuYWdlciA9IG51bGw7CgoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICAkYWRkb25fbmFtZSA9IG51bGwsCiAgICAgICAgRGF0YU1hbmFnZXIgJGRhdGFfbWFuYWdlciA9IG51bGwKICAgICl7CiAgICAgICAgJHRoaXMtPmFkZG9uX25hbWUgPSAibWF1cmlzd2ViX2FkZG9uX21hbmFnZXIiOwogICAgICAgIGlmICghaXNfbnVsbCgkYWRkb25fbmFtZSkpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+YWRkb25fbmFtZSA9ICRhZGRvbl9uYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfbnVsbCgkZGF0YV9tYW5hZ2VyKSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5kYXRhX21hbmFnZXIgPSBuZXcgRGF0YU1hbmFnZXIoJHRoaXMtPmFkZG9uX25hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+ZGF0YV9tYW5hZ2VyID0gJGRhdGFfbWFuYWdlcjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHB1YmxpYyAgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoJHR5cGUgPSAiIikKICAgIHsKICAgICAgICAKCiAgICAgICAgaWYgKCR0eXBlID09ICIiKQogICAgICAgIHsKICAgICAgICAgICAgJHR5cGUgPSAic2V0dGluZ3MiOwogICAgICAgIH0KCiAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5nZXRDYWNoZSgkdHlwZSk7CiAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWyd0eXBlX2RvbWFpbiddKSAmJiAkb3B0aW9uc1sidHlwZV9kb21haW4iXSA9PSAiRERMIikKICAgICAgICB7CiAgICAgICAgICAgICRyZXF1ZXN0ID0gZGJfcXVvdGUoIlNFTEVDVCAqIEZST00gYD86c3RvcmVmcm9udHNgIFdIRVJFIGBzdGF0dXNgID0gJ04nIik7CiAgICAgICAgICAgICRyZXN1bHQgPSBkYl9nZXRfYXJyYXkoJHJlcXVlc3QpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHJlc3VsdCkgJiYgaXNzZXQoY3VycmVudCgkcmVzdWx0KVsnc3RhdHVzJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcmVzdWx0IGFzICRkYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZXBvc2l0b3J5ID0gVHlnaDo6JGFwcFsnc3RvcmVmcm9udC5yZXBvc2l0b3J5J107CiAgICAgICAgICAgICAgICAgICAgJHN0b3JlID0gJHJlcG9zaXRvcnktPmZpbmRCeUNvbXBhbnlJZCgkZGF0YVsic3RvcmVmcm9udF9pZCJdKTsKICAgICAgICAgICAgICAgICAgICAkbW9kZSA9IFN0b3JlZnJvbnRTdGF0dXNlczo6Q0xPU0VEOwogICAgICAgICAgICAgICAgICAgICRzdG9yZS0+c3RhdHVzID0gJG1vZGU7CiAgICAgICAgICAgICAgICAgICAgJHJlcG9zaXRvcnktPnNhdmUoJHN0b3JlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkb3B0aW9uczsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgcHVibGljICBmdW5jdGlvbiBzYXZlU2V0dGluZ3MoJG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRpb25zKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc3NldCgkb3B0aW9uc1snY21zJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5jaGVja0RhdGEoJG9wdGlvbnNbJ2NtcyddKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRvcHRpb25zWydjbXMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWyJzY2hlbWFzIl1bInJvb3RfZGF0YSJdKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhX21hbmFnZXItPmNyZWF0ZUNhY2hlKCRvcHRpb25zWyJzY2hlbWFzIl1bInJvb3RfZGF0YSJdLCAncm9vdCcpOwoKICAgICAgICAgICAgICAgIHVuc2V0KCRvcHRpb25zWyJzY2hlbWFzIl1bInJvb3RfZGF0YSJdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWyJzY2hlbWFzIl1bInBhcmFtcyJdKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhX21hbmFnZXItPmNyZWF0ZUNhY2hlKCRvcHRpb25zWyJzY2hlbWFzIl1bInBhcmFtcyJdLCAncGFyYW1zJyk7CgogICAgICAgICAgICAgICAgdW5zZXQoJG9wdGlvbnNbInNjaGVtYXMiXVsicGFyYW1zIl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkb3B0aW9uc1sic2NoZW1hcyJdWyJhZGRvbl9uYW1lIl0gPSAkdGhpcy0+YWRkb25fbmFtZTsKCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5jcmVhdGVDYWNoZSgkb3B0aW9uc1sic2NoZW1hcyJdLCAnc2V0dGluZ3MnKTsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkcmVzdWx0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGNoZWNrVmFsaWQoJGFkZG9uID0gIm1hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyIikKICAgIHsKICAgICAgICAkdmFsaWRhdGUgPSBmYWxzZTsKICAgICAgICAkbmVlZF9yZXF1ZXN0ID0gdHJ1ZTsKICAgICAgICAkY29tcGFueV9saXN0ID0gW107CiAgICAgICAgJGNvbXBhbnlfaWQgPSBmbl9nZXRfcnVudGltZV9jb21wYW55X2lkKCk7CiAgICAgICAgJHN0b3JlZnJvbnRfaWQ9IGZuX21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX2dldF9zdG9yZWZyb250X2lkKCk7CiAgICAgICAgJHZhbGlkYXRlID0gJHRoaXMtPmNsZWFuaW5nKHRydWUpOwogICAgICAgICRzZXR0aW5ncyA9ICR0aGlzLT5nZXRTZXR0aW5ncygpOwogICAgCiAgICAgICAgCiAgICAgICAgaWYgKCFlbXB0eSgkc2V0dGluZ3MpICYmIGlzc2V0KCRzZXR0aW5nc1sicmVzb2x1dGlvbiJdKSl7CiAgICAgICAgICAgIGlmICgkc3RvcmVmcm9udF9pZCl7CiAgICAgICAgICAgICAgICAkY29tcGFueV9kYXRhID0gZm5fbWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZ2V0X3N0b3JlZnJvbnRzKCRzdG9yZWZyb250X2lkKTsKICAgICAgICAgICAgICAgICRzZXRfcm9vdCA9ICR0aGlzLT5nZXRTZXR0aW5ncygicm9vdCIpOwoKICAgICAgICAgICAgICAgICR2YWxpZGF0ZSA9ICR0aGlzLT5jb21wYXJlRGF0YSgKICAgICAgICAgICAgICAgICAgICAkc2V0X3Jvb3RbJ3N0b3Jlc19kb21haW4nXSwKICAgICAgICAgICAgICAgICAgICAkY29tcGFueV9kYXRhWyJzdG9yZWZyb250Il0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJGlzX2RlbW9fc3RvcmVmcm9udCA9ICR0aGlzLT5jb21wYXJlRGF0YSgkc2V0X3Jvb3RbJ3Rlc3RfZG9tYWluJ10sICRjb21wYW55X2RhdGFbInN0b3JlZnJvbnQiXSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghJHZhbGlkYXRlICYmICRpc19kZW1vX3N0b3JlZnJvbnQpewogICAgICAgICAgICAgICAgICAgIGlmKCRjb21wYW55X2RhdGFbInN0YXR1cyJdID09IFN0b3JlZnJvbnRTdGF0dXNlczo6Q0xPU0VEKXsKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbGlkYXRlID0gJGlzX2RlbW9fc3RvcmVmcm9udDsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbGlkYXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCgnQ0FSVF9MQU5HVUFHRScpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCgnQ0FSVF9QUklNQVJZX0NVUlJFTkNZJykKICAgICAgICAgICAgICAgICAgICAgICAgKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuX3NldF9ub3RpZmljYXRpb24oJ1cnLCBfXygnbm90aWNlJyksIF9fKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlci5ub3RpY2UuZGlzYWJsZV9zdG9yZWZyb250JykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZhbGlkYXRlID0gJHZhbGlkYXRlICYmICRzZXR0aW5nc1sicmVzb2x1dGlvbiJdOwoKICAgICAgICAgICAgJG5lZWRfcmVxdWVzdCA9ICEoISR2YWxpZGF0ZSAmJiAkaXNfZGVtb19zdG9yZWZyb250IHx8ICR2YWxpZGF0ZSk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHNldHRpbmdzWyJlbmRfY2FjaGUiXSkpIHsKCiAgICAgICAgICAgICAgICAkaXNfZW5kX2NhY2hlID0gJHRoaXMtPmNoZWNrVGltZSgkc2V0dGluZ3NbImVuZF9jYWNoZSJdKTsKICAgICAgICAgICAgICAgICR2YWxpZGF0ZSA9ICR2YWxpZGF0ZSAmJiAhJGlzX2VuZF9jYWNoZTsKCiAgICAgICAgICAgICAgICAkbmVlZF9yZXF1ZXN0ID0gJGlzX2VuZF9jYWNoZTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5jaGVja1RpY2tSZXF1ZXN0KCR2YWxpZGF0ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWyR2YWxpZGF0ZSwkbmVlZF9yZXF1ZXN0XTsKICAgIH0KCgoKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGdldExpY2Vuc2UoJHNraXBfbGltaXQgPSBmYWxzZSwgJGV4dHJhID0gW10pewoKICAgICAgICAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5jbGVhckNhY2hlKCk7CiAgICAgICAgCiAgICAgICAgJGNvbm5lY3QgPSBuZXcgQ29ubmVjdG9yKCR0aGlzLT5hZGRvbl9uYW1lKTsKICAgICAgICAKICAgICAgICAkZGF0YSA9ICRjb25uZWN0LT5hc2NTZXJ2ZXIoYXJyYXkoImRpc3BhdGNoIiA9PiAic2VydmljZS5nZXRfbWFpbl9maWxlcyIpKTsKICAgICAgICAkZmlsZV9saXN0ID0gaXNzZXQoJGRhdGFbImRhdGEiXVsnZmlsZV9uYW1lcyddKSA/ICRkYXRhWyJkYXRhIl1bJ2ZpbGVfbmFtZXMnXSA6IGZhbHNlOwogICAgICAgICRnZXRfZmlsZXMgPSBmYWxzZTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGZpbGVfbGlzdCkpewogICAgICAgICAgICBmb3JlYWNoICgkZmlsZV9saXN0IGFzICRrZXkgPT4gJHZhbHVlKXsKICAgICAgICAgICAgICAgICRnZXRfZmlsZXMgPSAhaXNfZmlsZSgkdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKCRnZXRfZmlsZXMpewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRhZGRvbnNEYXRhID0gbmV3IEFkZG9uc0RhdGEoJHRoaXMtPmFkZG9uX25hbWUpOwogICAgICAgICRleHRyYSA9IGFycmF5X21lcmdlKCRleHRyYSwgJGFkZG9uc0RhdGEtPmdldEV4dHJhKCkpOwogICAgICAgICRkYXRhID0gJGNvbm5lY3QtPmFzY1NlcnZlcihhcnJheSgKICAgICAgICAgICAgImRpc3BhdGNoIiA9PiAic2VydmljZS5jaGVja19saWNlbnNlIiwgCiAgICAgICAgICAgICdza2lwX2xpbWl0JyA9PiAkc2tpcF9saW1pdCwgCiAgICAgICAgICAgICJnZXRfZmlsZXMiID0+ICRnZXRfZmlsZXMsIAogICAgICAgICAgICAiZXh0cmEiID0+ICRleHRyYQogICAgICAgICkpOwogICAgICAgIAogICAgICAgIGlmICghZW1wdHkoJGRhdGFbImluZm8iXVsiaHR0cF9jb2RlIl0pICYmICRkYXRhWyJpbmZvIl1bImh0dHBfY29kZSJdID09IDIwMCl7CiAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsiZGF0YSJdWyJmaWxlX25hbWUiXSkpewogICAgICAgICAgICAgICAgJHBhdGggPSAgZm5fbWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZ2V0X3RtcF9wYXRoKCR0aGlzLT5hZGRvbl9uYW1lKTsKICAgICAgICAgICAgICAgICR0bXBmaWxlID0gJHBhdGggLiAiLyIgLiAkZGF0YVsnZGF0YSddWyJmaWxlX25hbWUiXTsKICAgICAgICAgICAgICAgIGlmKGZpbGVfZXhpc3RzKCR0bXBmaWxlKSl7CiAgICAgICAgICAgICAgICAgICAgZm5fZGVjb21wcmVzc19maWxlcygkdG1wZmlsZSwgRElSX1JPT1QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm5fcm0oJHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb250ZW50ID0gJGRhdGFbImRhdGEiXTsKICAgICAgICAgICAgJHNldHRpbmdzID0gYXJyYXkoKTsKICAgICAgICAgICAgJGRhdGFfc2V0ID0gICR0aGlzLT5kYXRhX21hbmFnZXItPmdldFNjaGVtZSgnZGF0YV9zZXQnKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZGF0YV9zZXQpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGF0YV9zZXQgYXMgJG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGNvbnRlbnRbJG5hbWVdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2V0dGluZ3NbJG5hbWVdID0gJGNvbnRlbnRbJG5hbWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkc2V0dGluZ3NbInNjaGVtYXMiXVsicm9vdF9kYXRhIl1bIm1haW5fZmlsZXMiXSA9ICRmaWxlX2xpc3Q7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0X3NpZ25hbCgkY29udGVudCkgPyAkdGhpcy0+c2F2ZVNldHRpbmdzKCRzZXR0aW5ncykgOiBmYWxzZTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGZpbmRGaWxlcygkcGF0aCwgJiRmaWxlcywgJHNlYXJjaCA9ICcnKXsKCiAgICAgICAgaWYgKGlzX2RpcigkcGF0aCkpewogICAgICAgICAgICAkY2xlYW5QYXRoID0gZ2xvYigkcGF0aCAuICIvKiIpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGNsZWFuUGF0aCBhcyAkZmlsZSl7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRzZWFyY2gpKXsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRmaWxlLCAkc2VhcmNoKSAhPT0gZmFsc2UpewoKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVzW10gPSAkZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5maW5kRmlsZXMoJGZpbGUsICRmaWxlcywgJHNlYXJjaCk7CgogICAgICAgICAgICAgICAgaWYgKCFpc19udWxsKCRyZXN1bHQpKQogICAgICAgICAgICAgICAgICAgICRmaWxlc1tdID0gJHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmIChpc19maWxlKCRwYXRoKSl7CiAgICAgICAgICAgIGlmICghZW1wdHkoJHNlYXJjaCkpewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkcGF0aCwgJHNlYXJjaCkgPT09IGZhbHNlKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHBhdGg7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGdldF9zaWduYWwoJGRhdGEpewogICAgICAgIGlmIChpc3NldCgkZGF0YVsibWVzc2FnZXMiXVsnZ2VuZXJhbCddKSl7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkYXRhWyJtZXNzYWdlcyJdWydnZW5lcmFsJ10gYXMgJGtleSA9PiAkbWVzc2FnZSl7CiAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuY19hcnJheSgnZm5fc2V0X25vdGlmaWNhdGlvbicsIGFycmF5X3ZhbHVlcygkbWVzc2FnZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkZGF0YVsic2lnbmFsIl0pKXsKICAgICAgICAgICAgc3dpdGNoICgkZGF0YVsnc2lnbmFsJ10pewogICAgICAgICAgICAgICAgY2FzZSAiaW5zdGFsbCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBjYXNlICJ2YWxpZCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBjYXNlICJkZWxldGVfbWFpbl9maWxlIjoKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRkYXRhWydmaWxlc19wYXRjaCddKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYXRhWydmaWxlc19wYXRjaCddIGFzICRuYW1lX2ZpbGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5fcm0oJG5hbWVfZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRhdGFfbWFuYWdlci0+Y2xlYXJDYWNoZShbJ3NldHRpbmdzJywgJ3Jvb3QnXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmluZEZpbGVzKCcuJywgJGZpbGVzLCAkdGhpcy0+YWRkb25fbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgZm5fdW5pbnN0YWxsX2FkZG9uKCR0aGlzLT5hZGRvbl9uYW1lLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGZpbGVzKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAka2V5ID0+ICRmaWxlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuX3JtKCRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICJibG9jayI6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRhdGFfbWFuYWdlci0+Y2xlYXJDYWNoZShbJ3NldHRpbmdzJywgJ3Jvb3QnXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAiZGlzYWJsZWQiOgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnk6OmdldCgnYWRkb25zLicgLiAkdGhpcy0+YWRkb25fbmFtZSAuICcuc3RhdHVzJykgIT0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdGF0dXNlczo6RElTQUJMRUQKICAgICAgICAgICAgICAgICAgICApewogICAgICAgICAgICAgICAgICAgICAgICBmbl91cGRhdGVfYWRkb25fc3RhdHVzKCR0aGlzLT5hZGRvbl9uYW1lLCBPYmplY3RTdGF0dXNlczo6RElTQUJMRUQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRkYXRhWyJtZXNzYWdlcyJdWydkaXNhYmxlZCddKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGF0YVsibWVzc2FnZXMiXVsnZGlzYWJsZWQnXSBhcyAka2V5ID0+ICRtZXNzYWdlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuY19hcnJheSgnZm5fc2V0X25vdGlmaWNhdGlvbicsIGFycmF5X3ZhbHVlcygkbWVzc2FnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRkYXRhWyJtZXNzYWdlcyJdWydkaXNhYmxlZCddKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRkYXRhWyJtZXNzYWdlcyJdWyRkYXRhWydzaWduYWwnXV0pKXsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYXRhWyJtZXNzYWdlcyJdWyRkYXRhWydzaWduYWwnXV0gYXMgJGtleSA9PiAkbWVzc2FnZSl7CiAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2ZuX3NldF9ub3RpZmljYXRpb24nLCBhcnJheV92YWx1ZXMoJG1lc3NhZ2UpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAKICAgIHB1YmxpYyAgZnVuY3Rpb24gY2hlY2tUaW1lKCR0aW1lKQogICAgewogICAgICAgICRydW5fdGltZSAgPSBtaWNyb3RpbWUodHJ1ZSk7CgogICAgICAgIHJldHVybiAkdGltZSA8PSAkcnVuX3RpbWU7CiAgICAgICAgCiAgICB9CgogICAgcHVibGljICBmdW5jdGlvbiBjbGVhbmluZygkbGltaXQgPSB0cnVlKXsKICAgICAgICBpZiAoJGxpbWl0KXsKICAgICAgICAgICAgJHNldHRpbmdzID0gJHRoaXMtPmdldFNldHRpbmdzKCk7CiAgICAgICAgICAgIGlmIChpc3NldCgkc2V0dGluZ3NbJ2VuZF9jYWNoZSddKSl7CiAgICAgICAgICAgICAgICBpZiAodGltZSgpIDwgJHNldHRpbmdzWydlbmRfY2FjaGUnXSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG1haW4gPSAkdGhpcy0+Z2V0U2V0dGluZ3MoInJvb3QiKTsKICAgICAgICBpZiAoIWVtcHR5KCRtYWluWyJtYWluX2ZpbGVzIl0pKXsKICAgICAgICAgICAgJG1haW4gPSBpc19hcnJheSgkbWFpblsibWFpbl9maWxlcyJdKSAKICAgICAgICAgICAgICAgID8gJG1haW5bIm1haW5fZmlsZXMiXSA6IGFycmF5KCRtYWluWyJtYWluX2ZpbGVzIl0pOwogICAgICAgICAgICAkdGhpcy0+ZGVsZXRlRmllbGVzKCRtYWluKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZGVsZXRlRmllbGVzKCRmaWxlX2xpc3QpewogICAgICAgIGlmKCFlbXB0eSgkZmlsZV9saXN0KSl7CiAgICAgICAgICAgIGlmKGlzX2FycmF5KCRmaWxlX2xpc3QpKXsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlX2xpc3QgYXMgJGtleSA9PiAkdmFsdWUpewogICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkdmFsdWUpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfYXJyYXkoJHZhbHVlKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVsZXRlRmllbGVzKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChpc19maWxlKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWVsc2UgaWYoaXNfZmlsZSgkZmlsZV9saXN0KSl7CiAgICAgICAgICAgICAgICBAdW5saW5rKCRmaWxlX2xpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyAgZnVuY3Rpb24gIGNvbXBhcmVEYXRhKCRwdWNrLCAkY2hhcil7CiAgICAgICAgaWYgKGlzX2FycmF5KCRwdWNrKSAmJiAhaXNfYXJyYXkoJGNoYXIpKXsKICAgICAgICAgICAgcmV0dXJuIGlzc2V0KCRwdWNrWyRjaGFyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldEZsYXNoZWRUaW1lRGF0YSgpewogICAgICAgIHJldHVybiBbInRpY2siID0+IDAsICJ0aW1lX2JlZ2luIiA9PiB0aW1lKCldOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0Q2FjaGVPYmplY3QoJGZpbGVfbmFtZSwgJiR0aW1lRGF0YSl7CiAgICAgICAgaWYoUmVhZFdyaXRlOjpmaWxlSXNFbXB0eSgkZmlsZV9uYW1lKSl7CiAgICAgICAgICAgIGZuX3JtKCRmaWxlX25hbWUpOwogICAgICAgIH0KICAgICAgICAkbW9kZSA9IENhY2hlOjpBUFBFTkRfUkVBRF9DQUNIRTsKICAgICAgICBpZighZmlsZV9leGlzdHMoJGZpbGVfbmFtZSkpewogICAgICAgICAgICAkbW9kZSA9IENhY2hlOjpSRVdSSVRFX0NBQ0hFOwogICAgICAgIH0KICAgICAgICAkY2FjaGUgPSBuZXcgQ2FjaGUoJGZpbGVfbmFtZSwgJG1vZGUpOwogICAgICAgIGlmKCRtb2RlID09IENhY2hlOjpSRVdSSVRFX0NBQ0hFKXsKICAgICAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmdldEZsYXNoZWRUaW1lRGF0YSgpOwogICAgICAgICAgICAkY2FjaGUtPndyaXRlRGF0YSgkdGltZURhdGEpOwogICAgICAgIH0KICAgICAgICAkY2FjaGUtPmluaXRQYXJhbXMoQ2FjaGU6OkFQUEVORF9SRUFEX0NBQ0hFKTsKICAgICAgICByZXR1cm4gJGNhY2hlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGVja1RpY2tSZXF1ZXN0KCRyZXNldCA9IGZhbHNlLCAkdHlwZSA9IG51bGwpCiAgICB7CgogICAgICAgIGlmIChpc19udWxsKCR0eXBlKSkgewogICAgICAgICAgICAkdHlwZSA9ICd0aWNrX3JlcXVlc3QnOwogICAgICAgIH0KCiAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmRhdGFfbWFuYWdlci0+Z2V0Q2FjaGUoJHR5cGUpOwoKICAgICAgICBpZiAoIWVtcHR5KCR0aW1lRGF0YSkpIHsKICAgICAgICAgICAgaWYgKCRyZXNldCkgewogICAgICAgICAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmdldEZsYXNoZWRUaW1lRGF0YSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0aW1lRGF0YVsndGljayddKSkgewogICAgICAgICAgICAgICAgICAgICR0aW1lRGF0YVsndGljayddKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aW1lRGF0YVsndGljayddID49IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGltZURhdGFbJ3RpbWVfYmVnaW4nXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGltZSgpIC0gJHRpbWVEYXRhWyd0aW1lX2JlZ2luJ10pIDwgKDEgKiA2MCAqIDYwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShmYWxzZSwgJHRpbWVEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmdldEZsYXNoZWRUaW1lRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVEYXRhWyd0aW1lX2JlZ2luJ10gPSB0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aW1lRGF0YSA9ICR0aGlzLT5nZXRGbGFzaGVkVGltZURhdGEoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aW1lRGF0YSA9ICR0aGlzLT5nZXRGbGFzaGVkVGltZURhdGEoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgJHRoaXMtPmRhdGFfbWFuYWdlci0+Y3JlYXRlQ2FjaGUoJHRpbWVEYXRhLCAkdHlwZSk7CgogICAgICAgIHJldHVybiBhcnJheSh0cnVlLCAkdGltZURhdGEpOwogICAgfQp9Cg=="));
?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 9019e3afc5d8b99ff9ecd4855e298811
Eval Count 1
Decode Time 75 ms