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("Ci8qIExvZ2Fob2xpYyBXZWIgQW5hbHl0aWNzIHNvZnR3YXJlICAgICAgICAgICAg..

Decoded Output download


/* Logaholic Web Analytics software             Copyright(c) 2005-2011 Logaholic B.V.
 *                                                               All rights Reserved.
 * This code is subject to the Logaholic license. Unauthorized copying is prohibited.
 * [email protected]                         http://www.logaholic.com/License.txt
*/ 

$dont_close_session = true;

include_once "common.inc.php";

$profiles=1;  // this is so it doesn't loop includes from top.php

// Which profile are we editing?
$curprofilename = @$_REQUEST["editconf"];

// Are we editing or creating a new one
$restoreDefaultDashboard = @$_REQUEST["restoredefaultdashboard"];
$update_method = @$_REQUEST["update_method"];
$set_update_preference = @$_REQUEST["set_update_preference"];
$edit = @$_REQUEST["edit"];
$new = @$_REQUEST["new"];
$install = @$_REQUEST["install"];
$save = @$_REQUEST["save"];
$del = @$_REQUEST["del"];
$backup = @$_REQUEST["backup"];
$specialq = @$_REQUEST["specialq"];
$mode = @$_REQUEST["mode"];
$search = @addslashes(trim($_REQUEST["search"]));
$sfield = @$_REQUEST["sfield"];
$update_countries = @$_REQUEST["update_countries"];
$set_profile_structure_version = @$_REQUEST["set_profile_structure_version"];   
SecurityCheck(@$_REQUEST["newconfname"]);

if ($curprofilename && $validUserRequired && (!$session->isAdmin() && !$session->canAccessProfile($curprofilename))) {
	die(_SORRY_NO_RIGHTS.": $curprofilename");
}

//edit profile
// Load the profile that we're currently trying to edit.
$editprofile = new SiteProfile($curprofilename);

if (isset($_REQUEST['copy_to'])) {
    if (isset($_REQUEST['with_data'])) {
        $editprofile->copyProfile($_REQUEST['copy_to'],true);    
    } else {
        $editprofile->copyProfile($_REQUEST['copy_to'],false);    
    }
    exit();        
}

$saved = "";
$saveerror = false;

if ((isset($save)) && isset($_REQUEST) && (isset($curprofilename) || (isset($_REQUEST["newconfname"]) && isset($install)))) {
	
	if ($editprofile->trackermode!=@$_REQUEST["trackermode"]) {
        // we're switching data colection method.
        if ($_REQUEST["trackermode"]==1) {
            if ($_REQUEST["visitoridentmethod"]!=3) {
                $_REQUEST["visitoridentmethod"]=3;
                $saved .= "<br>Visitor Identification method was automatically changed to: Cookie<br>";
            }
        } else {
            $saved .= "<br>Please check if Visitor Identification method on the Advanced tab is still correct<br>";    
        } 
    }
    
    // These are all user editable values.    
	$editprofile->confdomain = (isset($_REQUEST["confdomain"])) ? $_REQUEST["confdomain"] : $editprofile->confdomain;
	$editprofile->equivdomains = (isset($_REQUEST["equivdomains"])) ? $_REQUEST["equivdomains"] : $editprofile->equivdomains;
	if (get_magic_quotes_gpc()) {
		$editprofile->equivdomains = stripslashes($editprofile->equivdomains);
	}
	$editprofile->defaultfile = (isset($_REQUEST["defaultfile"])) ? $_REQUEST["defaultfile"] : $editprofile->defaultfile;
	$editprofile->splitlogs = (isset($_REQUEST["splitlogs"])) ? $_REQUEST["splitlogs"] : 0;  // Checkboxes don't get posted in IE if they're false.
	$editprofile->splitfilter = (isset($_REQUEST["splitfilter"])) ? $_REQUEST["splitfilter"] : $editprofile->splitfilter;
    $editprofile->splitfilternegative = (isset($_REQUEST["splitfilternegative"])) ? $_REQUEST["splitfilternegative"] : $editprofile->splitfilternegative; 
	$editprofile->trackermode = (isset($_REQUEST["trackermode"])) ? $_REQUEST["trackermode"] : $editprofile->trackermode;
    $editprofile->skipips = (isset($_REQUEST["skipips"])) ? $_REQUEST["skipips"] : $editprofile->skipips;
	if (get_magic_quotes_gpc()) {
		$editprofile->skipips = stripslashes($editprofile->skipips);
	}
	$editprofile->skipfiles = (isset($_REQUEST["skipfiles"])) ? $_REQUEST["skipfiles"] : $editprofile->skipfiles;
	$editprofile->targetfiles = (isset($_REQUEST["targetfiles"])) ? $_REQUEST["targetfiles"] : $editprofile->targetfiles;
	$editprofile->usepagecache = (isset($_REQUEST["caching"])) ? $_REQUEST["caching"] : $editprofile->targetfiles;
	$editprofile->animate = (isset($_REQUEST["animate"])) ? $_REQUEST["animate"] : $editprofile->animate;
    $editprofile->timezonecorrection = (isset($_REQUEST["timezonecorrection"])) ? $_REQUEST["timezonecorrection"] : $editprofile->timezonecorrection;
    $editprofile->timezone = (isset($_REQUEST["timezone"])) ? $_REQUEST["timezone"] : $editprofile->timezone;
    $newvisitoridentmethod = (isset($_REQUEST["visitoridentmethod"])) ? $_REQUEST["visitoridentmethod"] : $editprofile->visitoridentmethod;
    $visitoridentmethodswitched = ($editprofile->visitoridentmethod != $newvisitoridentmethod);
    $editprofile->visitoridentmethod = $newvisitoridentmethod;
    $editprofile->recursive = (isset($_REQUEST["recursive"])) ? $_REQUEST["recursive"] : 0;    
    $editprofile->ftpserver = (isset($_REQUEST["ftpserver"])) ? $_REQUEST["ftpserver"] : $editprofile->ftpserver;
    $editprofile->ftpuser = (isset($_REQUEST["ftpuser"])) ? $_REQUEST["ftpuser"] : $editprofile->ftpuser;
    $editprofile->ftppasswd = (isset($_REQUEST["ftppasswd"])) ? $_REQUEST["ftppasswd"] : $editprofile->ftppasswd;
    $editprofile->ftpfullpath = (isset($_REQUEST["ftpfullpath"])) ? $_REQUEST["ftpfullpath"] : $editprofile->ftpfullpath;
    $editprofile->visittimeout = (isset($_REQUEST["visittimeout"])) ? $_REQUEST["visittimeout"] : $editprofile->visittimeout;
    $editprofile->urlparamfilter = (isset($_REQUEST["urlparamfilter"])) ? $_REQUEST["urlparamfilter"] : $editprofile->urlparamfilter;
    $editprofile->urlparamfiltermode = (isset($_REQUEST["urlparamfiltermode"])) ? $_REQUEST["urlparamfiltermode"] : $editprofile->urlparamfiltermode;
    $editprofile->googleparams = (isset($_REQUEST["googleparams"])) ? $_REQUEST["googleparams"] : $editprofile->googleparams;
    $editprofile->feedurl = (isset($_REQUEST["feedurl"])) ? $_REQUEST["feedurl"] : $editprofile->feedurl;
    $editprofile->feedburneruri = (isset($_REQUEST["feedburneruri"])) ? $_REQUEST["feedburneruri"] : $editprofile->feedburneruri; 
	
	// check global custom date and profile custom date.
	$format = array(
		"format1" => "m",
		"seperator1" => "-",
		"format2" => "d",
		"seperator2" => "-",
		"format3" => "Y",
		"seperator3" => " ",
		"format4" => ""				
	);
	$format = serialize($format);
	$date_format = getGlobalSetting("profileDateFormat",$format);
	$date_format = unserialize($date_format);
	if(isset($_REQUEST["format1"])){
		$editprofile->dateFormat = array(
			"format1" => $_REQUEST["format1"],
			"seperator1" => $_REQUEST["seperator1"],
			"format2" => $_REQUEST["format2"],
			"seperator2" => $_REQUEST["seperator2"],
			"format3" => $_REQUEST["format3"],
			"seperator3" => $_REQUEST["seperator3"],
			"format4" => $_REQUEST["format4"]	
		);
		if($editprofile->dateFormat == $date_format){
			deleteProfileData($editprofile->profilename, $editprofile->profilename.".profileDateFormat");
		} else {
			$save = serialize($editprofile->dateFormat);
			setProfileData($editprofile->profilename, $editprofile->profilename.".profileDateFormat",$save);
		}
	} else {
		$editprofile->dateFormat = $editprofile->dateFormat;
		
	}
	
	$editprofile->facebooklogin = (isset($_REQUEST["facebooklogin"])) ? $_REQUEST["facebooklogin"] : $editprofile->facebooklogin;
	
	$editprofile->logparsertype = (isset($_REQUEST["log_parser_type"])) ? $_REQUEST["log_parser_type"] : $editprofile->logparsertype;
    $editprofile->includebackup = (isset($_REQUEST["includebackup"])) ? $_REQUEST["includebackup"] : $editprofile->includebackup;
                                                                                                       
	// If we have proper security rights, edit these core values.
	if (!$validUserRequired || $session->canAddProfiles())  {
		if (get_magic_quotes_gpc()) {
			// We're gonna have some slashes!
			if (isset($_REQUEST["logfilefullpath"])) {$_REQUEST["logfilefullpath"] = stripslashes($_REQUEST["logfilefullpath"]); }
		}
		
		$editprofile->profilename = (isset($_REQUEST["newconfname"])) ? $_REQUEST["newconfname"] : $editprofile->profilename;
		$editprofile->tablename = (isset($_REQUEST["tablename"])) ? $_REQUEST["tablename"] : $editprofile->tablename;
		$editprofile->logfilefullpath = (isset($_REQUEST["logfilefullpath"])) ? str_replace("\", '/', $_REQUEST["logfilefullpath"]) : $editprofile->logfilefullpath;
	}
	
	// Check and see if variables are correctly set to save...
	$cansave = true;	
	if (!$editprofile->profilename) {
		$saved .= "<font color=\"red\">"._NO_PROFILE_NAME_ENTERED."</font><br>";
		$cansave = false;
		$saveerror = true;
		$edit=1;
	}

	
    if (!$editprofile->tablename && $conf!="newcnf") {
		$saved .= "<font color=\"red\">"._NO_MYSQL_TABLE_ENTERED."</font><br>";
		$cansave = false;
		$saveerror = true;
		$edit=1;
	}
    
    
	if ($conf=="newcnf" || $new==1) {
		$checklimits = "Select profilename from ".TBL_PROFILES;
		$checklimitsresult = $db->Execute($checklimits) or die(_COULDNT_QUERY_PROFILES.". " . $db->ErrorMsg());
		if (defined("_LIMIT_PROFILES") != 0) {
			  if ($checklimitsresult->RecordCount() > _LIMIT_PROFILES) {
				  $saved .= "<font color=\"red\">"._TOO_MANY_PROFILES."</font><br>";
				  $cansave = false;
				  $saveerror = true;
				  $edit=1;            
			  }
		}
	}		
	
	if (defined("_ENABLE_IMPORTANT_PARAMETER_EDITOR_")) {
  	$important_param_count = $_REQUEST["importantparampagecount"];
  	for ($param_loop = 0; $param_loop < $important_param_count; $param_loop ++) {
  		unset($thisparam);
  		$thisparam = false;
  		if (($_REQUEST["paramid_".$param_loop]) && ($param_loop < $editprofile->getUrlParamCount())) {
  			// It's an existing one.
  			$thisparam =& $editprofile->getUrlParamByIndex($param_loop);
  			$thisparam["paramid"] = $_REQUEST["paramid_".$param_loop];
  		} else {
  			if ($_REQUEST["paramurl_".$param_loop] > "") {
  				$thisparam =& $editprofile->getUrlParamNew();
  			}
  		}
  		if ($thisparam) {
  			$thisparam["filename"] = $_REQUEST["paramurl_".$param_loop];
  			$thisparam["importantparams"] = $_REQUEST["paramnames_".$param_loop];
  		}
  	}
  	
  	$important_param_count = $_REQUEST["importantparampagecount"];
  	for ($param_loop = 0; $param_loop < $important_param_count; $param_loop ++) {
  		if (@$_REQUEST["DeleteParam_" . $param_loop]) {
  			$editprofile->deleteUrlParams($param_loop);
  		}
  	}
  }	
	if ($cansave) {

		$editprofile->dieonsqlerror = false;
		$editprofile->Save();
        if ($validUserRequired) {
        if ($session->canAddProfiles() && !$session->isAdmin()) {
            //echo "Adding profile to user account";
            // if the user can add profiles, he should be the default manager as well
            $session->user_profiles[count($session->user_profiles)]=$editprofile->profilename;
            $db->Execute("UPDATE ".TBL_USERS." SET PROFILES=concat(PROFILES,',$editprofile->profilename') WHERE username = '$session->username' ");
            //echo "UPDATE _logaholic_users SET PROFILES=concat(PROFILES,',$editprofile->profilename') WHERE username = '$session->username' ";
            
            
        }
        }
		/* we don't do this anymore */
        /*
		if ($editprofile->trackermode==1) {
            $treal_path = realpath("index.php");
            $tpath = dirname($treal_path);
            $tracker_logfile=$tpath."/files/".$editprofile->profilename.".log";
            $thandle = fopen ($tracker_logfile, "a");
            //fwrite($thandle,"# Logfile created by Logaholic Web Analytics - www.logaholic.com
");
            fclose($thandle);
            @chmod($tracker_logfile, 0666);
        }
        */
        
    if ($editprofile->lastsqlerror) {
			$saved .= "<font color=\"red\">".$editprofile->lastsqlerror."</font><br>";
			$edit=1;
			$saveerror = true;
		} else {
			$saved .= _PROFILE_CONF_SAVED.".<br>";
			unset($edit);
			unset($new);
		}
		if ($visitoridentmethodswitched) {
			// We need to recalculate the current visitor identification method.
		}
	}
}


if (isset($install) && ($install==1) && (!$saveerror)) {
    if ($q = @$db->Execute("select * from $editprofile->tablename limit 1")) {
        $chk=$q->FetchRow();
        //$saved=$saved."Mysql Table <b>$editprofile->tablename</b> already exists, skipping CREATE.<br>";
    } else {
        createDataTable($editprofile);
        $saved=$saved."Created tables for <b>$editprofile->tablename</b> in database <b>$DatabaseName</b><br>"; //HELP!
    }
    
    $step=5;
    $conf=$editprofile->profilename;
    header("location: install.php?step=5&conf=".urlencode($editprofile->profilename)."&saved=".urlencode($saved));
    exit();
}

if ($backup == 2) {
	// Export the .gzipped backup file.
    set_time_limit(86400);
    if (isset($_REQUEST['days_in_file'])) {
		$days_in_file = $_REQUEST['days_in_file'];
	} else {
		$days_in_file = 1;
	}
    $real_path = realpath("index.php");
    $path = dirname($real_path);
    $path = str_replace ("\", "/", $path);
    
    $ndays = round(($to- $from)/(86400*$days_in_file));
	$i=0;
	$finalto=$to;
	$to=$from;
	ob_start();
	while ($i < $ndays) {
		$from = $to;
		$to=$from+(86400*$days_in_file);
		if (@$upgrade!="true") {
			// $q=$db->Execute("select timestamp, v.ipnumber as ipnumber,u.url as url,up.params as params,status,bytes,r.referrer as referrer,rp.params as refparams, AGENTS.name useragent from
			// $editprofile->tablename as a, $editprofile->tablename_visitorids as v, $editprofile->tablename_urls as u,$editprofile->tablename_urlparams as up, $editprofile->tablename_referrers as r, $editprofile->tablename_refparams as rp, ".TBL_USER_AGENTS." as AGENTS where timestamp >= $from and timestamp <= $to and (a.visitorid=v.id and a.url=u.id and a.params=up.id and a.referrer=r.id and a.refparams=rp.id and a.useragentid = AGENTS.id) order by timestamp");
			$q = $db->Execute("SELECT a.timestamp, v.ipnumber AS ipnumber, u.url AS url, up.params AS params, a.status, a.bytes, r.referrer AS referrer, rp.params AS refparams, b.useragent AS useragent FROM
			{$editprofile->tablename} as a, {$editprofile->tablename_visitorids} AS v, {$editprofile->tablename_urls} AS u, {$editprofile->tablename_urlparams} AS up, {$editprofile->tablename_referrers} AS r, {$editprofile->tablename_refparams} AS rp, {$editprofile->tablename_useragents} AS b WHERE a.timestamp >= {$from} and a.timestamp <= {$to} AND (a.visitorid = v.id AND a.url = u.id AND a.params = up.id AND a.referrer = r.id AND a.refparams = rp.id AND a.useragentid = b.id) ORDER BY a.timestamp");
			
			if ($mode=="csv") {
				$bupfile=$path . "/files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".csv.gz";
			} else {
				$bupfile=$path . "/files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz";
			}
		} else {
			// $q=$db->Execute("select $editprofile->tablename.*, AGENTS.name useragent from $editprofile->tablename left outer join ".TBL_USER_AGENTS." AGENTS on (useragentid = AGENTS.id) order by timestamp");
			$q = $db->Execute("SELECT {$editprofile->tablename}.*, b.useragent AS useragent FROM {$editprofile->tablename} AS a, {$editprofile->tablename_useragent} AS b ON (a.useragentid = b.id) ORDER BY timestamp");			
			$bupfile=$path . "/files/$curprofilename.backup.log.gz";  
		}   
		 
		
		//$gfile=exec("pwd") . "/files/global.php";
		$fp = gzopen ($bupfile,"w");
		if ($mode=="csv") {
			// write a headre row
			$buffer= "\"IP number\",\"Date\",\"URL\",\"Status\",\"Bytes\",\"Referrer\",\"Useragent\"
"; //HELP!
			//echo $buffer;
			gzwrite ($fp, $buffer);
		}
		while ($data=$q->FetchRow()) {
			if ($data["refparams"]=="?") {
				$data["refparams"]="";
			}
			$date=date("[d/M/Y:H:i:s +0000]",$data["timestamp"]);
			if ($mode=="csv") {
				$buffer= "\"$data[ipnumber]\",\"$date\",\"".$data["url"].$data["params"]."\",\"$data[status]\",\"$data[bytes]\",\"".$data["referrer"].$data["refparams"]."\",\"".$data["useragent"]."\"
"; 
				
			} else {
			   $buffer= "$data[ipnumber] - - $date \"GET ".$data["url"].$data["params"]." HTTP/1.1\" ".$data["status"]." ".$data["bytes"]." \"".$data["referrer"].$data["refparams"]."\" \"".$data["useragent"]."\"
";
			}
			
			//echo $buffer;
			gzwrite ($fp, $buffer);
		}
		gzclose ($fp);
		$i++;
		echo "wrote file: $bupfile<br>";
		lgflush();
	}
    if (@$upgrade!="true") { 
        if ($mode=="csv") {
            echo "<P><li> "._OK_CSV_FILE_WRITTEN_IN." <b>$bupfile</b>.</P><P>"._PLEASE_DOWNLOAD_NOW.":<br> <b><a href=\"files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".csv.gz\"> files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz </a></b><ul><li>The first row in this file contains the column names</li><li>Fields in this CSV file are sperated by a comma</li><li>All fields are enclosed in \" \" double quotes.</li></ul></p>"; //HELP!
        } else {
            echo "<P><li> OK, log file written. Please download now:<br> <b><a href=\"files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz\"> files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz </a></b><P>";    
        }
        echo "<P>We recommend to remove the file from the server once you have downloaded it.<P>";
    
    } else { 
        @$db->Execute("drop table $editprofile->tablename");
        @$db->Execute("drop table $editprofile->tablename_vpd");
        @$db->Execute("drop table $editprofile->tablename_vpm");
        @$db->Execute("drop table $editprofile->tablename_dailyurls"); 
        @$db->Execute("drop table $editprofile->tablename_conversions");
        createDataTable($editprofile);
        echo "OK, log file written to $bupfile.<P> <a href=\"update.php?conf=$editprofile->profilename&upgrade=$bupfile\">Click here to continue upgrade</a>. (Imports you old log data back into the new database stucture)<P>When that is done, you can safely remove or archive the file: $bupfile";
    } 
    exit();
}

if (isset($set_profile_structure_version)) {
    if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->isAdmin()) {
            echoWarning("Manually changed this profile's structure version to from $editprofile->structure_version to $set_profile_structure_version");
            $editprofile->structure_version = $set_profile_structure_version;
            $editprofile->Save();
            // now we have to reload the profile (also the $profile one which is created in common and used in top to check versions!)
            $editprofile->Load($editprofile->profilename);
            $profile->Load($profile->profilename); 
        } else {
            echoWarning(_SORRY_NO_PERMISSIONS);
        }            
    }
}

include "top.php";

if (isset($_REQUEST['archivetable'])) {
    include "includes/archivetable.php";
}

// No rights to create a new one?  Turn off the "New" flag
if ($validUserRequired && (!$session->isAdmin() && !$session->canAddProfiles())) {
	unset($new);
}

if ((isset($save)) && ($editprofile->profileloaded) && (!$saveerror)) {
	if ($q = @$db->Execute("select * from $editprofile->tablename limit 1")) {
		$chk=$q->FetchRow();
        createDataTable($editprofile); 
		//$saved=$saved."Mysql Table <b>$editprofile->tablename</b> already exists, skipping CREATE.<br>";
	} else {
		createDataTable($editprofile);
		$saved=$saved."Created tables for <b>$editprofile->tablename</b> in database <b>$DatabaseName</b><br>";  
	}
	
	// Get The users facebook ID and TOKEN
	if(!empty($editprofile->facebooklogin) && getProfileData($editprofile->profilename, $editprofile->profilename."facebookApi".$editprofile->facebooklogin , false ) == false){
		deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookApi%");
		deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookApiForm");
		deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookAppForm");
		deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookPageForm");
		$saved.="<div id='facebook_feedback'></div>";
		$saved.= "<script src='http://facebook.logaholic.com/facebook_access.php?email={$editprofile->facebooklogin}&conf={$editprofile->profilename}'></script>";
	}
}
$start=getmicrotime();

if (!isset($del)) {
	$del=0; 
}
if ($del==1) {
	 if ($curprofilename!="") {
		echo "<div class=\"indentbody\"><b>"._DATABASE_MAINTENANCE_OPTIONS.": <font color=red>$editprofile->profilename</font></b><p>";
        echo "<P>"._PLEASE_CHOOSE_AN_OPTION.":<P><ul>";
        //if (!$validUserRequired || @$session->canEditProfiles()) {
        if (!$validUserRequired || @$session->canUpdateLogs()) {                    
		    echo "<li><a href=\"profiles.php?editconf=$curprofilename&backup=1\">"._BACKUP_EXPORT;
		    echo "<li><a href=\"profiles.php?editconf=$curprofilename&restoredefaultdashboard=1\"><b>". _RESTORE_DEFAULT_DASHBOARD . "</b></a><p>";
		}
		
		if ((!$validUserRequired) || ($session->canEditProfiles())) {
		    echo "<li><a href=\"get_reports.php?conf=$curprofilename\"><b>"._INSTALL_REPORTS."</b></a><p>";
		    echo "<li><a href=\"reportupdates.php?conf=$curprofilename\"><b>"._UPDATE.' '._REPORTS."</b></a><p>";
		}
		
		if(LOGAHOLIC_VERSION_STATUS == 'dev') {
        // if (!$validUserRequired || $session->isAdmin()) {
			echo "<li><a href=\"profiles.php?editconf={$curprofilename}&update_method=1\"><b>"._UPDATE_METHOD_PREFERENCE."</b></a><p>";
		}
		
        if (!$validUserRequired || @$session->canUpdateLogs()) {
		    echo "<li><a href=\"profiles.php?editconf=$curprofilename&del=5\"> "._DELETE_DATE_RANGE;
            echo "<LI> <a href=\"profiles.php?editconf=$curprofilename&del=2\" onclick=\"return confirm('"._DELETE_PROFILE_AND_DATABASE_ASSURANCE."')\">"._DELETE_PROFILE_AND_DATABASE."</a> <P>";
            echo "<li> <a href=\"profiles.php?editconf=$curprofilename&del=4\" onclick=\"return confirm('"._DELETE_DATABASE_ASSURANCE."')\">"._DELETE_DATABASE."</a><p>";
            echo "<li> <a href=\"profiles.php?editconf=$curprofilename&del=7\" onclick=\"return confirm('"._DELETE_SUMMARY_TABLES_ASSURANCE."')\">"._DELETE_SUMMARY_TABLES."</a><p>";
            echo "<li><a href=\"profiles.php?editconf=$curprofilename&del=8\">"._DELETE_CACHE."</a><p></ul>";
        }
        
        if (!$validUserRequired || @$session->canUpdateLogs()) { 
            echo "<li><b>"._SPECIALTY_UPDATE_OPTIONS."</b>:<P><ul>";
            echo "<li><a href=\"profiles.php?editconf=$curprofilename&update_countries=1\">Update Country Information in Database</a><p>"; 
            echo "<li><a href=\"profiles.php?editconf=$curprofilename&del=11\"> "._UPDATE_SUMMARY_TABLES_WOUT_CHECKING."</a><p>";
            echo "<li><a href=\"update.php?conf=$curprofilename&force=true\"> "._UPDATE_STATS_WOUT_DATE_RANGE_CHECKS."</a><p>";
            echo "<li><a href=\"update.php?conf=$curprofilename&force=true&movedone=true\" onclick=\"return confirm('"._MOVE_TO_DONE_ASSURANCE."')\">"._MOVE_TO_DONE."</a><p></ul>";
        }
        echo "<li><a href=\"profiles.php?editconf=$curprofilename&edit=1\"> "._EDIT_PROFILE."</a><P>";
		echo "<li><a href=\"profiles.php?editconf=$curprofilename\"> <b>"._CANCEL."</b></a></ul>";
        echo "<P>";
        
        if (!$validUserRequired || @$session->canAddProfiles()) {
          if ($q = @$db->Execute("SELECT table_schema \"Data Base Name\", table_name, sum( data_length + index_length ) / 1024 / 1024 \"Data Base Size in MB\" FROM information_schema.TABLES where table_schema='$DatabaseName' and (table_name='$editprofile->tablename' or table_name like '$editprofile->tablename\_%') GROUP BY table_schema")) {
            
            $chk=$q->FetchRow();
            $info = _TOTAL_SIZE_OF_THIS_PROFILE." ".number_format($chk[2],0)." MB. ";
            $q = $db->Execute("select count(*) from $editprofile->tablename");
            $chk=$q->FetchRow();
            $info.= _THERE_ARE." $chk[0] "._RECORDS_IN_MAIN_SPANNING." ";
            $q = $db->Execute("select timestamp from $editprofile->tablename order by timestamp asc limit 1");
            $chk=$q->FetchRow();
            $from=$chk[0];
            $info.= date("Y-m-d",$chk[0]) . " to ";
            $q = $db->Execute("select timestamp from $editprofile->tablename order by timestamp desc limit 1");
            $chk=$q->FetchRow();
            $to=$chk[0];
            $info.= date("Y-m-d,  H:i:s",$chk[0]) . ". ("._SEE_MORE_STATISTICS_BELOW.")<br><br>";
            $info.= "Profile stucture version is: $editprofile->structure_version";
            echoNotice($info,"width:640px;");
          }
        }
        
        
        if (!$validUserRequired || @$session->canAddProfiles()) { 
            $query= "SELECT table_name, table_rows, sum( data_length + index_length ) / 1024 / 1024 \"Data Base Size in MB\" ";
            //$query .= ", concat(\"<a href=profiles.php?editconf=$curprofilename&archivetable=\",table_name,\">Create archive</a>\") as archive ";
            $query .= "FROM information_schema.TABLES where table_schema='$DatabaseName' and (table_name='$editprofile->tablename' or table_name like '$editprofile->tablename\_%') GROUP BY table_name";
            //$showfields="table name,"._RECORDS.","._SIZEINMB.", Archive";
            $showfields="table name,"._RECORDS.","._SIZEINMB;
            $labels=_DATABASE_STATISTICS;
            //$mini=1;
            echo "<table width=640><tr><td>";
            @StatsTable($from,$to,$showfields,$labels,$query,$drilldown,$filter);
            echo "</td></tr></table>";
        }
        
        echo "</div>" ;
		exit();
    }
}

if ($del==2) {
	if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->canEditProfiles()) {
        
	        echo "<div class=indentbody><font color=red>Last Action:</font><br><i>";
		    $query = "Delete from ".TBL_PROFILES." where profileid = ".$editprofile->profileid;
		    if (!$db->Execute($query)) {
		     die(_COULDNT_DELETE_PROFILE." " . $db->ErrorMsg());
		    } else {
			    echo _DELETED_PROFILE.": <b>".$editprofile->profilename."</b><br>";
		    }
		    deleteProfileData($editprofile->profilename);
		    if (!$db->Execute("drop table ".$editprofile->tablename)) {
			    echo("<p>"._COULDNT_DROP_TABLE." ".$editprofile->tablename.", ".$db->ErrorMsg()."</p>");
		    } else {
			    echo _DROPPED_DB_TABLES.": <b>".$editprofile->profilename."</b><br>";
		    }
		    @$db->Execute("drop table $editprofile->tablename_vpd");
		    @$db->Execute("drop table $editprofile->tablename_vpm");
            @$db->Execute("drop table $editprofile->tablename_dailyurls"); 
		    @$db->Execute("drop table $editprofile->tablename_conversions");
		    @$db->Execute("drop table $editprofile->tablename_urls");
            @$db->Execute("drop table $editprofile->tablename_urlparams");
            @$db->Execute("drop table $editprofile->tablename_keywords");
            @$db->Execute("drop table $editprofile->tablename_referrers");
            @$db->Execute("drop table $editprofile->tablename_refparams");
            @$db->Execute("drop table $editprofile->tablename_sessionids");
            @$db->Execute("drop table $editprofile->tablename_visitorids");
            @$db->Execute("drop table $editprofile->tablename_screenres");
            @$db->Execute("drop table $editprofile->tablename_colordepth");
            @$db->Execute("drop table $editprofile->tablename_useragents");
            @$db->Execute("drop table ".$editprofile->tablename."_tlength"); // these last 2 are semi temporary tables that should be deleted when running Total Duration and Timeon site Today reports, but we'll delete then here just in case.
            @$db->Execute("drop table ".$editprofile->tablename."_vlength");
            @$db->Execute("drop table $editprofile->tablename_trackerlog");
		    
		    echo _SUMMARY_TABLES_DROPPED.".<br>"._DONE.".</i></div><hr noshade size=1><br>";
            deleteProfileData($editprofile->profilename);
			
			unset($_SESSION['profileobject']);
			unset($_SESSION['profilename']);
        } else {
            echo "<div class=\"indentbody\">";
            echoWarning(_SORRY_NO_PERMISSIONS);
            echo "<P>&nbsp;</P></div>";
        } 
	}
}

if ($del==3) {
	 if ($editprofile->profileloaded) {
		 $query = "Delete from ".TBL_PROFILES." where profileid = ".$editprofile->profileid;
		 $db->Execute($query) or die("Couldn't delete profile. " . $db->ErrorMsg());
		 deleteProfileData($editprofile->profilename);
		 echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br>"._DELETED_PROFILE.": <b>$editprofile->profilename</b><br>"._PLEASE_DROP_DB_TABLES." <b>'$editprofile->tablename'</b> "._MANUALLY_OR_KEEP_IT."</i></div><hr noshade size=1><br>";
         deleteProfileData($editprofile->profilename); 
	 }
}

if ($del==4) {
	if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->canEditProfiles()) {
		
            deleteDataTable($editprofile); 
        
		    createDataTable($editprofile);
		
  	        // deleteProfileData($editprofile->profilename);
			
			deleteProfileData($editprofile->profilename, "cache\_%");
			deleteProfileData($editprofile->profilename, $editprofile->tablename."%\_cachearray");
			deleteProfileData($editprofile->profilename, $editprofile->profilename.".cache\_%");
			deleteProfileData($editprofile->profilename, $editprofile->profilename."cache_trail");
			deleteProfileData($editprofile->profilename, "lastlogpos.%");
			deleteProfileData($editprofile->profilename, "firstlogline.%");
			deleteProfileData($editprofile->profilename, "1stlogline.%");
			deleteProfileData($editprofile->profilename, "lastknownpos.%");
			deleteProfileData($editprofile->profilename, $editprofile->profilename.".bandwidthData");
			deleteProfileData($editprofile->profilename, $editprofile->profilename.".update_running");
			deleteProfileData($editprofile->profilename, $editprofile->profilename.".perlupdate_running");
  	
		    echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>"._DELETED_DB_TABLES." <b>'$editprofile->tablename'</b> "._AND_SUMMARIES_PROFILE_SAVED."</i></div><hr noshade size=1><br>";
        } else {
            echo "<div class=\"indentbody\">";
            echoWarning(_SORRY_NO_PERMISSIONS);
            echo "<P>&nbsp;</P></div>"; 
        }
	}
}
if ($del==5) {
	if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->canEditProfiles()) {
		    echo "<div class=\"indentbody\">"._DELETE_DATE_RANGE_FROM." <b>$editprofile->profilename</b><P><form method=get action=\"profiles.php\">";
		    echo "<input type=hidden name=del value=6>";
		    DateSelector($from,$to);
		    echo "<input type=radio name=what value=2 checked> "._DELETE_ALL_LOG_DATA."<br>";
            echo "<input type=radio name=what value=1> "._DELETE_ONLY_DETAIL_DATA."<br>";
            echo "<input type=radio name=what value=3> "._DELETE_ONLY_SUMMARY_DATA."<br>";
		    echo "<input type=hidden name=editconf value=\"$curprofilename\">";
		    echo "<input type=submit name=submit value=Delete>  "._PLEASE_BE_PATIENT_DELETING_TAKES_A_WHILE."</div>";
		    exit();
        } else {
            echo "<div class=\"indentbody\">";
            echoWarning(_SORRY_NO_PERMISSIONS);
            echo "<P>&nbsp;</P></div>";
        }
	}
}
if ($del==6) {
	if ($editprofile->profileloaded) {
		$what = $_REQUEST["what"];
		echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>";
        DeleteRange($editprofile,$what);
        
        
        echo "</i></div><hr noshade size=1><br>";
  	}
}

if ($del==7) {
	if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->canEditProfiles()) { 
		    $db->Execute("drop table $editprofile->tablename_vpd");
		    $db->Execute("drop table $editprofile->tablename_vpm");
            $db->Execute("drop table $editprofile->tablename_dailyurls"); 
		    $db->Execute("drop table $editprofile->tablename_conversions");
            createDataTable($editprofile);
		    echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>"._DELETED_SUMMARY_DATA_IN_DATE_RANGE.". "._SUMMARIES_WILL_BE_RECALCULATED.".</i></div><hr noshade size=1><br>";
        } else {
            echo "<div class=\"indentbody\">";
            echoWarning(_SORRY_NO_PERMISSIONS);
            echo "<P>&nbsp;</P></div>";
        }    
	}
}
if ($del==8) {
	if ($editprofile->profileloaded) {
		deleteProfileData($editprofile->profilename, "cache\_%");
        deleteProfileData($editprofile->profilename, $editprofile->profilename."cache_trail");
		echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>"._ALL_CACHE_FILES_DELETED.".</i></div><hr noshade size=1><br>";
	}
}

if ($del==9) { // this deletes a specific file or ip from the database
    if ($editprofile->profileloaded) {
        $fldname= $_REQUEST["fldname"];
        $fldvalue= @$_REQUEST["fldvalue"]; 
        echo "<div class=\"identbody\">"._DELETE." <font color=red>$fldvalue</font> "._FROM." <b>$editprofile->profilename</b><P><form method=post action=\"profiles.php\">";
        echo "<input type=hidden name=del value=10>";
        DateSelector($from,$to);
        echo "<br>$fldname: <input type=text name=fldvalue value=\"$fldvalue\"> ("._EXACT_VALUE_ONLY.")<p>";
        echo "<input type=hidden name=fldname value=\"$fldname\">";
        echo "<input type=hidden name=editconf value=\"$curprofilename\">";
        echo "<input type=checkbox name=recal value=\"1\" checked> "._RECALCULATE_SUMMARY_TABLES; 
        echo "<input type=submit name=submit value=Delete>  </div>";

        exit();
    }
}
if ($del==10) {
    if ($editprofile->profileloaded) {
        $fldname= $_REQUEST["fldname"];
        $fldvalue= @$_REQUEST["fldvalue"];
        $recal= @$_REQUEST["recal"];
        
        
        if ($fldname=="page") {
           $q = @$db->Execute("select id from $editprofile->tablename_urls where url='$fldvalue'");
           $page=$q->FetchRow();
           $db->Execute("delete from $editprofile->tablename where timestamp >=$from and timestamp <=$to and url='$page[id]'");
           $db->Execute("delete from $editprofile->tablename_dailyurls where timestamp >=$from and timestamp <=$to and url='$page[id]'");
           $db->Execute("delete from $editprofile->tablename_conversions where timestamp >=$from and timestamp <=$to and url='$page[id]'");    
        } else if ($fldname=="ipnumber") {
            $q = @$db->Execute("select id from $editprofile->tablename_visitorids where ipnumber='$fldvalue'");
            while ($page=$q->FetchRow()) {
                $db->Execute("delete from $editprofile->tablename where timestamp >=$from and timestamp <=$to and visitorid='$page[id]'");
                $db->Execute("delete from $editprofile->tablename_conversions where timestamp >=$from and timestamp <=$to and visitorid='$page[id]'"); 
                
            }
        }
        echo "<div class=\"indentbody\"><font color=red>Last Action:</font><br><i>";
        if ($recal==1){ 
            $db->Execute("delete from $editprofile->tablename_vpm where timestamp >=$from and timestamp <=$to");
            $db->Execute("delete from $editprofile->tablename_vpd where timestamp >=$from and timestamp <=$to");
            
            //$db->Execute("delete from $editprofile->tablename_screenres where timestamp >=$from and timestamp <=$to");
            //$db->Execute("delete from $editprofile->tablename_colordepth where timestamp >=$from and timestamp <=$to");
            echo "Deleted $fldname $fldvalue, will recalculate summary tables now ...";
           //deleteProfileData($editprofile->profilename);
           
           echo("<form name=progress>"._PROGRESS.":<br><input type=text name=perc size=1 value=\"0\" class=pbar>% &nbsp;");
           echo("<input type=text name=progbar size=46 value=\"|\" class=progbar><P>");
           echo(_STATUS.": <input type=text name=ptext size=85 class=pbar value=\"start\" class=progbar><P>");
           echo("</form>");
           echo "<br><br>";
           // function echoConsoleSafe($txt) {
                // echo $txt;   
           // }
           $profile = new SiteProfile($curprofilename);
           $conf=$curprofilename;
           $orist=$from;
           ?>
            <script>
            function pbar(p) {
                self.document.forms.progress.perc.value=p;
                self.document.forms.progress.progbar.value=self.document.forms.progress.progbar.value+'|';
            }
            function pstatus(p) {
                self.document.forms.progress.ptext.value=p;
            }
            </script>
            <?php
           include "update_summaries.php";
           echo "</div>";
       
       }
       echo _IF_YOU_WANT_TO_KEEP." <b>$fldvalue</b> "._OUT_OF_FUTURE_STATS." ";
       if ($fldname=="page") {
            echo _SKIP_FILES." ";
       } else {
            echo _SKIP_IP_NUMBERS." ";  
       }
       echo _FIELD_ON_THE_DATA_COLLECTION_TAB_IN_YOUR." $curprofilename "._PROFILE_SETTINGS.".</i></div><hr noshade size=1><br>";   
      }
}

if ($del==11) { // this just does update_summaries without adding any new traffic from the log files
    if ($editprofile->profileloaded) {
       
        echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br>"; 
            
           echo "<i>"._UPDATE_SUMMARIES_WOUT_CHECKING_NEW_DATA."...</i>";
           
           echo("<form name=progress>"._PROGRESS.":<br><input type=text name=perc size=1 value=\"0\" class=pbar>% &nbsp;");
           echo("<input type=text name=progbar size=46 value=\"|\" class=progbar><P>");
           echo(_STATUS.": <input type=text name=ptext size=85 class=pbar value=\"start\" class=progbar><P>");
           echo("</form>");
           echo "<br><br>";
           // function echoConsoleSafe($txt) {
                // echo $txt;   
           // }
           $profile = new SiteProfile($curprofilename);
           $conf=$curprofilename;
           //$orist=$from;
           ?>
            <script>
            function pbar(p) {
                self.document.forms.progress.perc.value=p;
                self.document.forms.progress.progbar.value=self.document.forms.progress.progbar.value+'|';
            }
            function pstatus(p) {
                self.document.forms.progress.ptext.value=p;
            }
            </script>
            <?php
           include "update_summaries.php";
      }
}

if ($update_countries==1) {
    if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->canUpdateLogs()) {
            echo "<div class=\"indentbody\"><h3>Update Geographic Location information for '$editprofile->profilename'</h3>";
            echo "<p>You can use this tool if you have updated (or just installed) the Geo Location database and want to update country information on records already stored in your Logaholic database for this profile.</p>";
            echo "<P>The date range will affect which visitors are checked (only visitorid's <em>first created</em> within the date range) and which records will be updated (only hits within the date range).</P>";
            echo "<p><b>Select the date range you want to update geographic information for:</b></p>";
            echo "<form method=get action=\"profiles.php\">";
            echo "<input type=hidden name=\"update_countries\" value=2>";
            $daterange = GetMaxDateRange($editprofile);
            DateSelector($daterange['from'],$daterange['to']);
            echo "<input type=hidden name=editconf value=\"$curprofilename\">";
            echo "<input type=submit name=submit value=\""._UPDATE_NOW."\" style=\"margin-top:5px;font-size:14px;\">";
            echo "</div></body></html>";
            exit();
        } else {
            echo "<div class=\"indentbody\">";
            echoWarning(_SORRY_NO_PERMISSIONS);
            echo "<P>&nbsp;</P></div>";
        }
    }        
}
if ($update_countries==2) {
    if ($editprofile->profileloaded) {
        if (!$validUserRequired || @$session->canUpdateLogs()) {
            $profile=$editprofile;
            include "includes/update_countries.php";
            echo "<div class=\"indentbody\">";
            $uc = new UpdateCountries();
            $uc->DisplayProgress();
            $uc->UpdateRange($from,$to);
            echo "</div></body></html>";
            exit();
        } else {
            echo "<div class=\"indentbody\">";
            echoWarning(_SORRY_NO_PERMISSIONS);
            echo "<P>&nbsp;</P></div>";
        }
    }        
}


if (!isset($backup)) {
	$backup=0; 
}
if ($backup==1) {
	echo "<div class=\"indentbody\"><b>"._BACKUP_EXPORT_DATE_RANGE_FROM." <font color=red>$curprofilename</font></b><P>";
	echo "<form method=get action=\"profiles.php\">";
	echo "<table width=450 class=smallborder><tr><td class=small>"._YOU_CAN_EXPORT_DATA_FROM_TABLE." ($editprofile->tablename) "._IN_ORDER_TO_BACKUP."</td></tr></table><P>";
	echo "<input type=hidden name=backup value=2>";
	DateSelector($from,$to);
	echo "<input type=hidden name=editconf value=\"$curprofilename\">";
    echo "<P>"._FILE_FORMAT.": <select name=\"mode\"><option value=\"logfile\" selected> "._APACHE_COMBINED_LOG_FILE_FORMAT." <option value=\"csv\"> "._CSV_FORMAT."</select></p>"; 
	echo "<P><input type=submit name=submit value=\"Download Backup File\"></div>";
    echo "</body></html>";
	exit();
}

if (isset($_REQUEST["globalstats"])=="yes") { 
    echo "<div class='indentbody'>&nbsp;<br>";
    include "includes/globalstats.php";    
    echo "</div></body></html>";
    exit();
}
if(isset($restoreDefaultDashboard)){
	$editprofile->setDefaultDashboard();
	echo "<div class=\"indentbody\">";
	echo _YOUR_DEFAULT_DASHBOARD_HAS_BEEN_RESTORED;
	echo "</div>";
}
if(isset($update_method)) {
	if(isset($set_update_preference)) {
		if($set_update_preference == 'perl') {
			$set_update_preference = 'perl';
		} else {
			$set_update_preference = 'regular';
		}
		setProfileData($profile->profilename, "{$profile->profilename}.updatePreference", $set_update_preference);
		$db->Query("DELETE from ".TBL_GLOBAL_SETTINGS." WHERE `Name` = 'canDoPerlUpdate'");
		
		echo "<div class=\"indentbody\">".str_replace("%s", $set_update_preference, _UPDATE_METHOD_HAS_BEEN_SET_TO)."</div>";
	} else {
		include_once("components/import/import.php");
		$importClass = new Import();
		
		echo "<div style='margin: 0 0 0 35px; width: 400px;'>";
		// $perlcheck = $importClass->availableCheck(true);
		$perlable = $importClass->availableCheck();
		
		if($perlable['hasError'] == true) {
			// echo "You can't update your statistics with Perl.<br/>Follow the <a href='http://www.logaholic.com/manual/LogaholicManual/MakingLogaholicReadyForPerlUpdates'>instructions</a> in the Logaholic Manual if you desire the Perl method.";
			echo "<h3>"._YOUR_MACHINE_IS_NOT_ABLE_TO_USE_PERL."</h3>";
			
			unset($perlable['hasError']);
			
			foreach($perlable as $key => $perltest) {
				echo $perltest."<br/>";
			}
			
			echo "<p>".str_replace("%s", "<a href='http://www.logaholic.com/manual/LogaholicManual/UpdateLogaholicStatsUsingPerl' target='_blank'>tutorial</a>", _VISIT_PERL_INSTALL_TUTORIAL)."</p><br/>";
			echo "<a style='background: none repeat scroll 0 0 #1970B4; border-radius: 4px 4px 4px 4px; color: #FFFFFF; padding: 5px 10px; text-decoration: none;' href='{$_SERVER['REQUEST_URI']}'>Check again</a>";
		} else {
			echo "<h3>"._SET_YOUR_UPDATE_METHOD_PREFERENCE."</h3>";
			echo "<p style='margin-bottom: 24px;'>";
				echo _WOULD_YOU_LIKE_TO_TRY_PERL_UPDATE."<br/>";
			echo "</p>";
			echo "<a style='background-color: #333333; border-radius: 4px 4px 4px 4px; color: #FFFFFF; padding: 5px 10px; text-decoration: none;' href='profiles.php?conf={$curprofilename}&update_method=1&set_update_preference=regular'>"._NO_USE_REGULAR_UPDATE."</a>";
			echo "<a style='margin-left: 25px; background: none repeat scroll 0 0 #1970B4; border-radius: 4px 4px 4px 4px; color: #FFFFFF; padding: 5px 10px; text-decoration: none;' href='profiles.php?conf={$curprofilename}&update_method=1&set_update_preference=perl'>"._YES_USE_PERL_UPDATE."</a>";
		}
		echo "</div>";
		exit;
	}
}

if (!isset($edit) && (!isset($new))) {
	 
    // list all profiles
	
     if ($saved!="") {
			echo "<p class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i><b>$editprofile->profilename</b> ".$saved."</i></p><hr noshade size=1><br>";
	 }
	 ?>
	 <div class=indentbody>
    <script language="javascript" type="text/javascript">
    function prowOverEffect(object) {
	    if (object.className == 'profilerow') object.className = 'profilerowhighlight';
    }

    function prowOutEffect(object) {
	    if (object.className == 'profilerowhighlight') object.className = 'profilerow';
    }
    </script>
    <?php
        
    // see how many profiles there are in total, if it's more than 5 print a SEARCH BOX
    $query = "Select count(*) from ".TBL_PROFILES.";";
    $result = $db->Execute($query) or die(_COULDNT_QUERY_PROFILES." " . $db->ErrorMsg());
    $result = $result->FetchRow(); 
    $numprofiles=$result[0];
	
	if (($validUserRequired) && (!$session->isAdmin())) {
		$query = "SELECT COUNT(*) FROM ".TBL_PROFILES." WHERE profilename IN (\"{$validprofiles}\")";
		$result = $db->Execute($query) or die(_COULDNT_QUERY_PROFILES." " . $db->ErrorMsg());
		$amountOfRightfulProfiles = $result->FetchRow();
		$amountOfRightfulProfiles = $amountOfRightfulProfiles[0];
	} else {
		$amountOfRightfulProfiles = $numprofiles;
	}
	
    if ($amountOfRightfulProfiles > 5) {
        // if (($validUserRequired) && (!$session->isAdmin())) {
            // you have to be admin to see the search box
        // } else {             
        ?>
          <form method="post" action="profiles.php<?php echo !empty($_GET['num_pp']) ? "?num_pp={$_GET['num_pp']}" : ""; ?>">
          Search profiles matching: <input type="text" name="search" value="<?php echo @$search; ?>"> 
          in field: 
            <select name="sfield">
                <option value="profilename" <?php if (@$sfield=="profilename") { echo "selected"; } ?>> <?php echo _PROFILE_NAME;?>
                <option value="confdomain" <?php if (@$sfield=="confdomain") { echo "selected"; } ?>> <?php echo _DOMAIN_NAME;?>
            </select>     
            <input type="submit" value="Search">    
          </form>
          <br>
          <?php
        // }
    }
    
    echo "<div style=\"width:600px;\">";
    if (!$validUserRequired || $session->isAdmin() || $session->canAddProfiles()) {
        echo "<div style=\"float:left;line-height:16px;padding-right:20px;margin-bottom:6px;\">";
        if ((!defined("_LIMIT_PROFILES")) || (_LIMIT_PROFILES == 0)) {
            echo "<img src=\"images/icons/add_profile.gif\" width=16 height=16 align=left alt=\"New\"> <a href=\"profiles.php?conf=newcnf&amp;new=1\">"._CREATE_NEW_PROFILE."</a>";
        } else {
            if ($numprofiles >= _LIMIT_PROFILES) {
                echo "<img src=\"images/icons/add_profile.gif\" width=16 height=16 align=left alt=\"Upgrade\"> "._TOO_MANY_PROFILES_PLEASE_UPGRADE."";      
            } else {
                echo "<img src=\"images/icons/add_profile.gif\" width=16 height=16 align=left alt=\"New\"> <a href=\"profiles.php?conf=newcnf&amp;new=1\">"._CREATE_NEW_PROFILE."</a>";
            }
        }
        echo "</div>";          
    }
    
	if($amountOfRightfulProfiles > 1) {
		echo "<div style=\"float:left;line-height:16px;margin-bottom:6px;\"><img src=\"images/icons/pie.gif\" width=16 height=16 align=left alt=\"New\"> <a href=\"profiles.php?globalstats=yes\">"._GLOBAL_STATISTICS_OVERVIEW."</a></div>";
	}
    echo "</div>"; 
	
	?>
    
    <table cellpadding=6 cellspacing=0 border=0 style="min-width:600px;clear:both;">
		<tr><td colspan=5  class=toplineblue bgcolor="#BBDDFF"><img src="images/icons/profiles.gif" width=16 height=16 align=left alt="<?php echo _MANAGE_PROFILES;?>"> &nbsp;&nbsp;<font size=3><b><?php echo _MANAGE_PROFILES;?></b></font></td></tr>
	<?php       
    
    $query = "Select profilename,tablename,profileid from ".TBL_PROFILES;
	
	// If we're limiting the visible profiles, then put a filter on to only pull those records.
	if (($validUserRequired) && (!$session->isAdmin())) {
		// Can't use implode here because we need to escape the entries.
		$validprofiles = "";
		for ($i = count($session->user_profiles)-1; $i >= 0; $i--) {
			if ($validprofiles != "") { $validprofiles .= "\",\""; }
			$validprofiles .= $db->escape($session->user_profiles[$i]);
		}
		$query .= " where profilename in (\"$validprofiles\")";
	}
	if (@$search) {
		if(strpos($query, 'where') !== false) {
			$query .= " AND $sfield LIKE '%$search%'";
		} else {
			$query .= " WHERE $sfield LIKE '%$search%'";
		}
    }
    
    $query.=" order by profilename";
	$items_per_page = 50;
    if (defined("_LIMIT_PROFILES") != 0) {
      $query.=" limit 0,"._LIMIT_PROFILES;
	  $num_of_items = _LIMIT_PROFILES;
    } else {
		/* Pagination config starts here */
		$num_of_items = 0; # The total amount of items
		$max_links = 5; # The amount of page numbers to show
		
		$count_query = "SELECT COUNT(*) AS `max_profiles` FROM ".TBL_PROFILES;
		if (($validUserRequired) && (!$session->isAdmin())) {
			// Can't use implode here because we need to escape the entries.
			$validprofiles = "";
			for ($i = count($session->user_profiles)-1; $i >= 0; $i--) {
				if ($validprofiles != "") { $validprofiles .= "\",\""; }
				$validprofiles .= $db->escape($session->user_profiles[$i]);
			}
			$count_query .= " WHERE profilename IN (\"{$validprofiles}\")";
		}
		$amount_result = $db->Execute($count_query);
		
		$num_of_items = $amount_result->FetchRow();
		$num_of_items = $num_of_items['max_profiles'];

		if(!empty($_GET['num_pp'])) {
			if($_GET['num_pp'] == 'All') {
				$items_per_page = $num_of_items;
			} else {
				$items_per_page = $_GET['num_pp'];
			}
		}		
		if(!empty($_GET['page_num'])) {
			$page_num = $_GET['page_num'];
		} else {
			$page_num = 1;
		}
		
		$query .= " LIMIT ".floor(($page_num - 1) * $items_per_page).", ".$items_per_page;
		/* Pagination config ends here */
	}
	
	
	$result = $db->Execute($query) or die(_COULDNT_QUERY_PROFILES." " . $db->ErrorMsg());
    if ($result->RecordCount() == 0) {
		echo "<tr><td colspan=5 class=\"profilerow\">"._YOU_HAVE_NO_ACTIVE_PROFILES.".</td></tr>";
	} else {
		while ($profile_row = $result->FetchRow()) {
			$profilename = $profile_row[0];
            $profile_tablename = $profile_row[1];
			if ($conf==$profilename || $editconf==$profilename) {
				$sel=" <font color=red>("._ACTIVE.")</font>";
				$bgc="bgcolor=#CCFFCC";
				$class="";
			} else {
				$sel="";
				$bgc="";
				$class="onmouseover=\"prowOverEffect(this)\" onmouseout=\"prowOutEffect(this)\"";
			}
			echo "<tr class=\"profilerow\" $class><td $bgc style=\"font-size:13px;\" class=\"dotline2\" title=\"{$profile_row[2]}\"><b>$profilename</b> $sel</td><td $bgc style=\"font-size:13px;\" class=dotline2><img src=\"images/icons/date.gif\" width=16 height=16 align=left alt=\""._VIEW_STATS."\"> <a href=\"index.php?conf=$profilename\">"._VIEW_STATS."</a></td>";
			if ((!$validUserRequired) || ($session->canUpdateLogs())) {
                echo "<td $bgc class=dotline2><img src=\"images/icons/update.gif\" width=16 height=16 align=left alt=\""._UPDATE_NOW."\"> <a href=\"update.php?conf=$profilename\">"._UPDATE_NOW."</a></td>";
            }
            if ((!$validUserRequired) || ($session->canEditProfiles())) {
                /*
                $rq= @$db->Execute("select count(*) from $profile_tablename");
                $recs = @$rq->FetchRow();
                $recs = number_format($recs[0], 0, '.', ''); 
                echo "<td $bgc class=dotline2><img src=\"images/icons/edit.gif\" width=16 height=16 align=left alt=\"Edit\"><a href=\"profiles.php?editconf=$profilename&amp;edit=1\">"._EDIT_PROFILE."</a></td><td $bgc class=dotline2 title=\"This profile contains $recs data records\"> <img src=\"images/icons/delete.gif\" width=16 height=16 align=left alt=\"Delete\"><a href=\"profiles.php?editconf=$profilename&amp;del=1\">"._MAINTENANCE."</a></td></tr>";
                */
                echo "<td $bgc class=dotline2><img src=\"images/icons/edit.gif\" width=16 height=16 align=left alt=\"Edit\"><a href=\"profiles.php?editconf=$profilename&amp;edit=1\">"._EDIT_PROFILE."</a></td>";
            }
            if ((!$validUserRequired) || ($session->canEditProfiles())) {
                echo "<td $bgc class=dotline2> <img src=\"images/icons/delete.gif\" width=16 height=16 align=left alt=\"Delete\"><a href=\"profiles.php?editconf=$profilename&amp;del=1\">"._MAINTENANCE."</a></td></tr>";
            } else {
                echo "</tr>";   
            }
		}
		
		if ($num_of_items > $items_per_page) {
			echo "<tr><td cellspacing='0' cellpadding='0' colspan='5'>";			
				if (defined("_LIMIT_PROFILES") == 0) {
					echo "<div class='profile_pagination'>";
						if(ceil($num_of_items/$items_per_page) > 1) {
							echo pagination($num_of_items, $items_per_page, $page_num, $max_links);
						}
						if(!empty($_GET['page_num'])) {
							$url_extension = "?page_num=1&";
						} else {
							$url_extension = "?";
						}
						if(!empty($_REQUEST['search'])) {
							if($url_extension == '?') {
								$url_extension .= "search={$_REQUEST['search']}&sfield={$_REQUEST['sfield']}&";
							} else {
								$url_extension .= "&search={$_REQUEST['search']}&sfield={$_REQUEST['sfield']}";
							}
						}
						echo "<script type='text/javascript'>$(document).ready(function() { $(\"#num_pp\").change(function() { window.location = \"{$_SERVER['PHP_SELF']}{$url_extension}num_pp=\" + $(this).val() }); });</script>";
						echo "<div class='select_num_per_page'>";
							echo "<label for='pagination_num_per_page'>"._NUMBER_OF_PROFILES_PER_PAGE.": </label>";
							echo "<select id='num_pp' name='num_pp'>";
								echo "<option "; if($items_per_page == 5) { echo "selected "; } echo "value='5'>5</option>";
								echo "<option "; if($items_per_page == 10) { echo "selected "; } echo "value='10'>10</option>";
								echo "<option "; if($items_per_page == 20) { echo "selected "; } echo "value='20'>20</option>";
								echo "<option "; if($items_per_page == 50) { echo "selected "; } echo "value='50'>50</option>";
								echo "<option "; if($items_per_page == 100) { echo "selected "; } echo "value='100'>100</option>";
								echo "<option "; if($items_per_page == 200) { echo "selected "; } echo "value='200'>200</option>";

								echo "<option "; if($items_per_page == $num_of_items) { echo "selected "; } echo "value='All'>"._ALL."</option>";
							echo "</select>";
						echo "</div>";
					echo "</div>";
				}
			echo "</td></tr>";
		}
	}
	echo "</table><p>";
	
    if ($validUserRequired && @$session->isAdmin()===false) {
        $Notice="";
        if (@$session->canEditProfiles()===false) {
            $Notice.=_NO_PERMISSION_EDIT_PROFILE."<br>";   
        }
        if (@$session->canAddProfiles()===false) {
            $Notice.=_NO_PERMISSION_ADD_PROFILE."<br>";   
        }
        if (@$session->canUpdateLogs()===false) {
            $Notice.=_NO_PERMISSION_UPDATE."<br>";   
        }
        if ($Notice!="" && _LOGAHOLIC_EDITION!=4) {
            echo "<div style=\"width:600px;\">";
            $Notice="<b>"._PLEASE_NOTE.":</b><br>".$Notice;
            echoNotice($Notice);
            echo "</div>";    
        }
    }
    echo "</div>";
}

/* Pagination functions starts here */
function pagination_link($page_number) {
	$pagination_url = $_SERVER['PHP_SELF'].'?page_num='.$page_number;
	if(!empty($_GET['num_pp'])) {
		$pagination_url .= "&num_pp={$_GET['num_pp']}";
	}
	return $pagination_url;
}

function pagination($number_of_items, $items_pp, $page_number, $max_links) {
	$total_pages = ceil($number_of_items/$items_pp);
	if($page_number) {
		if($page_number > 1) { 
			$prev = "<a href='".pagination_link(($page_number -1 ))."'>&lt; "._PREVIOUS."</a>"; 
			$first = "<a href='".pagination_link(1)."'>&lt;&lt; "._FIRST_PAGE."</a>"; 
		} else {
			$prev = "<span>&lt; "._PREVIOUS."</span>";
			$first = "<span>&lt;&lt; "._FIRST_PAGE."</span>";
		}
	}
	
	if(!empty($_REQUEST['search'])) {
		$url_extension = "&search={$_REQUEST['search']}&sfield={$_REQUEST['sfield']}";
	} else {
		$url_extension = "";
	}
	
	if($page_number < $total_pages) {
		$next = "<a href='".pagination_link(($page_number + 1)).$url_extension."'>"._NEXT." &gt;</a>"; 
		$last = "<a href='".pagination_link($total_pages).$url_extension."'>"._LAST_PAGE." &gt;&gt;</a>";
	} else {
		$next = "<span>"._NEXT." &gt;</span>";
		$last = "<span>"._LAST_PAGE." &gt;&gt;</span>";
	}
	echo $first;
	echo $prev;
	$loop = 0;
	if($page_number >= $max_links) {
		$page_counter = ceil($page_number - ($max_links-1));
	} else {
		$page_counter = 1;
	}
	if($total_pages < $max_links){
		$max_links = $total_pages;
	}
	do{ 
		if($page_counter == $page_number) {
			echo "<strong>{$page_counter}</strong>"; 
		} else {
			echo "<a href='".pagination_link(($page_counter))."'>{$page_counter}</a>";
		} 
		$page_counter++; $current_page=($page_counter+1);
		$loop++;
	} while ($max_links > $loop);
	echo $next;
	echo $last;
}

include "includes/editprofile.php";
echo "</body></html>";

Did this file decode correctly?

Original Code

<?php eval(base64_decode("Ci8qIExvZ2Fob2xpYyBXZWIgQW5hbHl0aWNzIHNvZnR3YXJlICAgICAgICAgICAgIENvcHlyaWdodChjKSAyMDA1LTIwMTEgTG9nYWhvbGljIEIuVi4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIFJlc2VydmVkLgogKiBUaGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgTG9nYWhvbGljIGxpY2Vuc2UuIFVuYXV0aG9yaXplZCBjb3B5aW5nIGlzIHByb2hpYml0ZWQuCiAqIHN1cHBvcnRAbG9nYWhvbGljLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmxvZ2Fob2xpYy5jb20vTGljZW5zZS50eHQKKi8gCgokZG9udF9jbG9zZV9zZXNzaW9uID0gdHJ1ZTsKCmluY2x1ZGVfb25jZSAiY29tbW9uLmluYy5waHAiOwoKJHByb2ZpbGVzPTE7ICAvLyB0aGlzIGlzIHNvIGl0IGRvZXNuJ3QgbG9vcCBpbmNsdWRlcyBmcm9tIHRvcC5waHAKCi8vIFdoaWNoIHByb2ZpbGUgYXJlIHdlIGVkaXRpbmc/CiRjdXJwcm9maWxlbmFtZSA9IEAkX1JFUVVFU1RbImVkaXRjb25mIl07CgovLyBBcmUgd2UgZWRpdGluZyBvciBjcmVhdGluZyBhIG5ldyBvbmUKJHJlc3RvcmVEZWZhdWx0RGFzaGJvYXJkID0gQCRfUkVRVUVTVFsicmVzdG9yZWRlZmF1bHRkYXNoYm9hcmQiXTsKJHVwZGF0ZV9tZXRob2QgPSBAJF9SRVFVRVNUWyJ1cGRhdGVfbWV0aG9kIl07CiRzZXRfdXBkYXRlX3ByZWZlcmVuY2UgPSBAJF9SRVFVRVNUWyJzZXRfdXBkYXRlX3ByZWZlcmVuY2UiXTsKJGVkaXQgPSBAJF9SRVFVRVNUWyJlZGl0Il07CiRuZXcgPSBAJF9SRVFVRVNUWyJuZXciXTsKJGluc3RhbGwgPSBAJF9SRVFVRVNUWyJpbnN0YWxsIl07CiRzYXZlID0gQCRfUkVRVUVTVFsic2F2ZSJdOwokZGVsID0gQCRfUkVRVUVTVFsiZGVsIl07CiRiYWNrdXAgPSBAJF9SRVFVRVNUWyJiYWNrdXAiXTsKJHNwZWNpYWxxID0gQCRfUkVRVUVTVFsic3BlY2lhbHEiXTsKJG1vZGUgPSBAJF9SRVFVRVNUWyJtb2RlIl07CiRzZWFyY2ggPSBAYWRkc2xhc2hlcyh0cmltKCRfUkVRVUVTVFsic2VhcmNoIl0pKTsKJHNmaWVsZCA9IEAkX1JFUVVFU1RbInNmaWVsZCJdOwokdXBkYXRlX2NvdW50cmllcyA9IEAkX1JFUVVFU1RbInVwZGF0ZV9jb3VudHJpZXMiXTsKJHNldF9wcm9maWxlX3N0cnVjdHVyZV92ZXJzaW9uID0gQCRfUkVRVUVTVFsic2V0X3Byb2ZpbGVfc3RydWN0dXJlX3ZlcnNpb24iXTsgICAKU2VjdXJpdHlDaGVjayhAJF9SRVFVRVNUWyJuZXdjb25mbmFtZSJdKTsKCmlmICgkY3VycHJvZmlsZW5hbWUgJiYgJHZhbGlkVXNlclJlcXVpcmVkICYmICghJHNlc3Npb24tPmlzQWRtaW4oKSAmJiAhJHNlc3Npb24tPmNhbkFjY2Vzc1Byb2ZpbGUoJGN1cnByb2ZpbGVuYW1lKSkpIHsKCWRpZShfU09SUllfTk9fUklHSFRTLiI6ICRjdXJwcm9maWxlbmFtZSIpOwp9CgovL2VkaXQgcHJvZmlsZQovLyBMb2FkIHRoZSBwcm9maWxlIHRoYXQgd2UncmUgY3VycmVudGx5IHRyeWluZyB0byBlZGl0LgokZWRpdHByb2ZpbGUgPSBuZXcgU2l0ZVByb2ZpbGUoJGN1cnByb2ZpbGVuYW1lKTsKCmlmIChpc3NldCgkX1JFUVVFU1RbJ2NvcHlfdG8nXSkpIHsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3dpdGhfZGF0YSddKSkgewogICAgICAgICRlZGl0cHJvZmlsZS0+Y29weVByb2ZpbGUoJF9SRVFVRVNUWydjb3B5X3RvJ10sdHJ1ZSk7ICAgIAogICAgfSBlbHNlIHsKICAgICAgICAkZWRpdHByb2ZpbGUtPmNvcHlQcm9maWxlKCRfUkVRVUVTVFsnY29weV90byddLGZhbHNlKTsgICAgCiAgICB9CiAgICBleGl0KCk7ICAgICAgICAKfQoKJHNhdmVkID0gIiI7CiRzYXZlZXJyb3IgPSBmYWxzZTsKCmlmICgoaXNzZXQoJHNhdmUpKSAmJiBpc3NldCgkX1JFUVVFU1QpICYmIChpc3NldCgkY3VycHJvZmlsZW5hbWUpIHx8IChpc3NldCgkX1JFUVVFU1RbIm5ld2NvbmZuYW1lIl0pICYmIGlzc2V0KCRpbnN0YWxsKSkpKSB7CgkKCWlmICgkZWRpdHByb2ZpbGUtPnRyYWNrZXJtb2RlIT1AJF9SRVFVRVNUWyJ0cmFja2VybW9kZSJdKSB7CiAgICAgICAgLy8gd2UncmUgc3dpdGNoaW5nIGRhdGEgY29sZWN0aW9uIG1ldGhvZC4KICAgICAgICBpZiAoJF9SRVFVRVNUWyJ0cmFja2VybW9kZSJdPT0xKSB7CiAgICAgICAgICAgIGlmICgkX1JFUVVFU1RbInZpc2l0b3JpZGVudG1ldGhvZCJdIT0zKSB7CiAgICAgICAgICAgICAgICAkX1JFUVVFU1RbInZpc2l0b3JpZGVudG1ldGhvZCJdPTM7CiAgICAgICAgICAgICAgICAkc2F2ZWQgLj0gIjxicj5WaXNpdG9yIElkZW50aWZpY2F0aW9uIG1ldGhvZCB3YXMgYXV0b21hdGljYWxseSBjaGFuZ2VkIHRvOiBDb29raWU8YnI+IjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzYXZlZCAuPSAiPGJyPlBsZWFzZSBjaGVjayBpZiBWaXNpdG9yIElkZW50aWZpY2F0aW9uIG1ldGhvZCBvbiB0aGUgQWR2YW5jZWQgdGFiIGlzIHN0aWxsIGNvcnJlY3Q8YnI+IjsgICAgCiAgICAgICAgfSAKICAgIH0KICAgIAogICAgLy8gVGhlc2UgYXJlIGFsbCB1c2VyIGVkaXRhYmxlIHZhbHVlcy4gICAgCgkkZWRpdHByb2ZpbGUtPmNvbmZkb21haW4gPSAoaXNzZXQoJF9SRVFVRVNUWyJjb25mZG9tYWluIl0pKSA/ICRfUkVRVUVTVFsiY29uZmRvbWFpbiJdIDogJGVkaXRwcm9maWxlLT5jb25mZG9tYWluOwoJJGVkaXRwcm9maWxlLT5lcXVpdmRvbWFpbnMgPSAoaXNzZXQoJF9SRVFVRVNUWyJlcXVpdmRvbWFpbnMiXSkpID8gJF9SRVFVRVNUWyJlcXVpdmRvbWFpbnMiXSA6ICRlZGl0cHJvZmlsZS0+ZXF1aXZkb21haW5zOwoJaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKCQkkZWRpdHByb2ZpbGUtPmVxdWl2ZG9tYWlucyA9IHN0cmlwc2xhc2hlcygkZWRpdHByb2ZpbGUtPmVxdWl2ZG9tYWlucyk7Cgl9CgkkZWRpdHByb2ZpbGUtPmRlZmF1bHRmaWxlID0gKGlzc2V0KCRfUkVRVUVTVFsiZGVmYXVsdGZpbGUiXSkpID8gJF9SRVFVRVNUWyJkZWZhdWx0ZmlsZSJdIDogJGVkaXRwcm9maWxlLT5kZWZhdWx0ZmlsZTsKCSRlZGl0cHJvZmlsZS0+c3BsaXRsb2dzID0gKGlzc2V0KCRfUkVRVUVTVFsic3BsaXRsb2dzIl0pKSA/ICRfUkVRVUVTVFsic3BsaXRsb2dzIl0gOiAwOyAgLy8gQ2hlY2tib3hlcyBkb24ndCBnZXQgcG9zdGVkIGluIElFIGlmIHRoZXkncmUgZmFsc2UuCgkkZWRpdHByb2ZpbGUtPnNwbGl0ZmlsdGVyID0gKGlzc2V0KCRfUkVRVUVTVFsic3BsaXRmaWx0ZXIiXSkpID8gJF9SRVFVRVNUWyJzcGxpdGZpbHRlciJdIDogJGVkaXRwcm9maWxlLT5zcGxpdGZpbHRlcjsKICAgICRlZGl0cHJvZmlsZS0+c3BsaXRmaWx0ZXJuZWdhdGl2ZSA9IChpc3NldCgkX1JFUVVFU1RbInNwbGl0ZmlsdGVybmVnYXRpdmUiXSkpID8gJF9SRVFVRVNUWyJzcGxpdGZpbHRlcm5lZ2F0aXZlIl0gOiAkZWRpdHByb2ZpbGUtPnNwbGl0ZmlsdGVybmVnYXRpdmU7IAoJJGVkaXRwcm9maWxlLT50cmFja2VybW9kZSA9IChpc3NldCgkX1JFUVVFU1RbInRyYWNrZXJtb2RlIl0pKSA/ICRfUkVRVUVTVFsidHJhY2tlcm1vZGUiXSA6ICRlZGl0cHJvZmlsZS0+dHJhY2tlcm1vZGU7CiAgICAkZWRpdHByb2ZpbGUtPnNraXBpcHMgPSAoaXNzZXQoJF9SRVFVRVNUWyJza2lwaXBzIl0pKSA/ICRfUkVRVUVTVFsic2tpcGlwcyJdIDogJGVkaXRwcm9maWxlLT5za2lwaXBzOwoJaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKCQkkZWRpdHByb2ZpbGUtPnNraXBpcHMgPSBzdHJpcHNsYXNoZXMoJGVkaXRwcm9maWxlLT5za2lwaXBzKTsKCX0KCSRlZGl0cHJvZmlsZS0+c2tpcGZpbGVzID0gKGlzc2V0KCRfUkVRVUVTVFsic2tpcGZpbGVzIl0pKSA/ICRfUkVRVUVTVFsic2tpcGZpbGVzIl0gOiAkZWRpdHByb2ZpbGUtPnNraXBmaWxlczsKCSRlZGl0cHJvZmlsZS0+dGFyZ2V0ZmlsZXMgPSAoaXNzZXQoJF9SRVFVRVNUWyJ0YXJnZXRmaWxlcyJdKSkgPyAkX1JFUVVFU1RbInRhcmdldGZpbGVzIl0gOiAkZWRpdHByb2ZpbGUtPnRhcmdldGZpbGVzOwoJJGVkaXRwcm9maWxlLT51c2VwYWdlY2FjaGUgPSAoaXNzZXQoJF9SRVFVRVNUWyJjYWNoaW5nIl0pKSA/ICRfUkVRVUVTVFsiY2FjaGluZyJdIDogJGVkaXRwcm9maWxlLT50YXJnZXRmaWxlczsKCSRlZGl0cHJvZmlsZS0+YW5pbWF0ZSA9IChpc3NldCgkX1JFUVVFU1RbImFuaW1hdGUiXSkpID8gJF9SRVFVRVNUWyJhbmltYXRlIl0gOiAkZWRpdHByb2ZpbGUtPmFuaW1hdGU7CiAgICAkZWRpdHByb2ZpbGUtPnRpbWV6b25lY29ycmVjdGlvbiA9IChpc3NldCgkX1JFUVVFU1RbInRpbWV6b25lY29ycmVjdGlvbiJdKSkgPyAkX1JFUVVFU1RbInRpbWV6b25lY29ycmVjdGlvbiJdIDogJGVkaXRwcm9maWxlLT50aW1lem9uZWNvcnJlY3Rpb247CiAgICAkZWRpdHByb2ZpbGUtPnRpbWV6b25lID0gKGlzc2V0KCRfUkVRVUVTVFsidGltZXpvbmUiXSkpID8gJF9SRVFVRVNUWyJ0aW1lem9uZSJdIDogJGVkaXRwcm9maWxlLT50aW1lem9uZTsKICAgICRuZXd2aXNpdG9yaWRlbnRtZXRob2QgPSAoaXNzZXQoJF9SRVFVRVNUWyJ2aXNpdG9yaWRlbnRtZXRob2QiXSkpID8gJF9SRVFVRVNUWyJ2aXNpdG9yaWRlbnRtZXRob2QiXSA6ICRlZGl0cHJvZmlsZS0+dmlzaXRvcmlkZW50bWV0aG9kOwogICAgJHZpc2l0b3JpZGVudG1ldGhvZHN3aXRjaGVkID0gKCRlZGl0cHJvZmlsZS0+dmlzaXRvcmlkZW50bWV0aG9kICE9ICRuZXd2aXNpdG9yaWRlbnRtZXRob2QpOwogICAgJGVkaXRwcm9maWxlLT52aXNpdG9yaWRlbnRtZXRob2QgPSAkbmV3dmlzaXRvcmlkZW50bWV0aG9kOwogICAgJGVkaXRwcm9maWxlLT5yZWN1cnNpdmUgPSAoaXNzZXQoJF9SRVFVRVNUWyJyZWN1cnNpdmUiXSkpID8gJF9SRVFVRVNUWyJyZWN1cnNpdmUiXSA6IDA7ICAgIAogICAgJGVkaXRwcm9maWxlLT5mdHBzZXJ2ZXIgPSAoaXNzZXQoJF9SRVFVRVNUWyJmdHBzZXJ2ZXIiXSkpID8gJF9SRVFVRVNUWyJmdHBzZXJ2ZXIiXSA6ICRlZGl0cHJvZmlsZS0+ZnRwc2VydmVyOwogICAgJGVkaXRwcm9maWxlLT5mdHB1c2VyID0gKGlzc2V0KCRfUkVRVUVTVFsiZnRwdXNlciJdKSkgPyAkX1JFUVVFU1RbImZ0cHVzZXIiXSA6ICRlZGl0cHJvZmlsZS0+ZnRwdXNlcjsKICAgICRlZGl0cHJvZmlsZS0+ZnRwcGFzc3dkID0gKGlzc2V0KCRfUkVRVUVTVFsiZnRwcGFzc3dkIl0pKSA/ICRfUkVRVUVTVFsiZnRwcGFzc3dkIl0gOiAkZWRpdHByb2ZpbGUtPmZ0cHBhc3N3ZDsKICAgICRlZGl0cHJvZmlsZS0+ZnRwZnVsbHBhdGggPSAoaXNzZXQoJF9SRVFVRVNUWyJmdHBmdWxscGF0aCJdKSkgPyAkX1JFUVVFU1RbImZ0cGZ1bGxwYXRoIl0gOiAkZWRpdHByb2ZpbGUtPmZ0cGZ1bGxwYXRoOwogICAgJGVkaXRwcm9maWxlLT52aXNpdHRpbWVvdXQgPSAoaXNzZXQoJF9SRVFVRVNUWyJ2aXNpdHRpbWVvdXQiXSkpID8gJF9SRVFVRVNUWyJ2aXNpdHRpbWVvdXQiXSA6ICRlZGl0cHJvZmlsZS0+dmlzaXR0aW1lb3V0OwogICAgJGVkaXRwcm9maWxlLT51cmxwYXJhbWZpbHRlciA9IChpc3NldCgkX1JFUVVFU1RbInVybHBhcmFtZmlsdGVyIl0pKSA/ICRfUkVRVUVTVFsidXJscGFyYW1maWx0ZXIiXSA6ICRlZGl0cHJvZmlsZS0+dXJscGFyYW1maWx0ZXI7CiAgICAkZWRpdHByb2ZpbGUtPnVybHBhcmFtZmlsdGVybW9kZSA9IChpc3NldCgkX1JFUVVFU1RbInVybHBhcmFtZmlsdGVybW9kZSJdKSkgPyAkX1JFUVVFU1RbInVybHBhcmFtZmlsdGVybW9kZSJdIDogJGVkaXRwcm9maWxlLT51cmxwYXJhbWZpbHRlcm1vZGU7CiAgICAkZWRpdHByb2ZpbGUtPmdvb2dsZXBhcmFtcyA9IChpc3NldCgkX1JFUVVFU1RbImdvb2dsZXBhcmFtcyJdKSkgPyAkX1JFUVVFU1RbImdvb2dsZXBhcmFtcyJdIDogJGVkaXRwcm9maWxlLT5nb29nbGVwYXJhbXM7CiAgICAkZWRpdHByb2ZpbGUtPmZlZWR1cmwgPSAoaXNzZXQoJF9SRVFVRVNUWyJmZWVkdXJsIl0pKSA/ICRfUkVRVUVTVFsiZmVlZHVybCJdIDogJGVkaXRwcm9maWxlLT5mZWVkdXJsOwogICAgJGVkaXRwcm9maWxlLT5mZWVkYnVybmVydXJpID0gKGlzc2V0KCRfUkVRVUVTVFsiZmVlZGJ1cm5lcnVyaSJdKSkgPyAkX1JFUVVFU1RbImZlZWRidXJuZXJ1cmkiXSA6ICRlZGl0cHJvZmlsZS0+ZmVlZGJ1cm5lcnVyaTsgCgkKCS8vIGNoZWNrIGdsb2JhbCBjdXN0b20gZGF0ZSBhbmQgcHJvZmlsZSBjdXN0b20gZGF0ZS4KCSRmb3JtYXQgPSBhcnJheSgKCQkiZm9ybWF0MSIgPT4gIm0iLAoJCSJzZXBlcmF0b3IxIiA9PiAiLSIsCgkJImZvcm1hdDIiID0+ICJkIiwKCQkic2VwZXJhdG9yMiIgPT4gIi0iLAoJCSJmb3JtYXQzIiA9PiAiWSIsCgkJInNlcGVyYXRvcjMiID0+ICIgIiwKCQkiZm9ybWF0NCIgPT4gIiIJCQkJCgkpOwoJJGZvcm1hdCA9IHNlcmlhbGl6ZSgkZm9ybWF0KTsKCSRkYXRlX2Zvcm1hdCA9IGdldEdsb2JhbFNldHRpbmcoInByb2ZpbGVEYXRlRm9ybWF0IiwkZm9ybWF0KTsKCSRkYXRlX2Zvcm1hdCA9IHVuc2VyaWFsaXplKCRkYXRlX2Zvcm1hdCk7CglpZihpc3NldCgkX1JFUVVFU1RbImZvcm1hdDEiXSkpewoJCSRlZGl0cHJvZmlsZS0+ZGF0ZUZvcm1hdCA9IGFycmF5KAoJCQkiZm9ybWF0MSIgPT4gJF9SRVFVRVNUWyJmb3JtYXQxIl0sCgkJCSJzZXBlcmF0b3IxIiA9PiAkX1JFUVVFU1RbInNlcGVyYXRvcjEiXSwKCQkJImZvcm1hdDIiID0+ICRfUkVRVUVTVFsiZm9ybWF0MiJdLAoJCQkic2VwZXJhdG9yMiIgPT4gJF9SRVFVRVNUWyJzZXBlcmF0b3IyIl0sCgkJCSJmb3JtYXQzIiA9PiAkX1JFUVVFU1RbImZvcm1hdDMiXSwKCQkJInNlcGVyYXRvcjMiID0+ICRfUkVRVUVTVFsic2VwZXJhdG9yMyJdLAoJCQkiZm9ybWF0NCIgPT4gJF9SRVFVRVNUWyJmb3JtYXQ0Il0JCgkJKTsKCQlpZigkZWRpdHByb2ZpbGUtPmRhdGVGb3JtYXQgPT0gJGRhdGVfZm9ybWF0KXsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLnByb2ZpbGVEYXRlRm9ybWF0Iik7CgkJfSBlbHNlIHsKCQkJJHNhdmUgPSBzZXJpYWxpemUoJGVkaXRwcm9maWxlLT5kYXRlRm9ybWF0KTsKCQkJc2V0UHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLnByb2ZpbGVEYXRlRm9ybWF0Iiwkc2F2ZSk7CgkJfQoJfSBlbHNlIHsKCQkkZWRpdHByb2ZpbGUtPmRhdGVGb3JtYXQgPSAkZWRpdHByb2ZpbGUtPmRhdGVGb3JtYXQ7CgkJCgl9CgkKCSRlZGl0cHJvZmlsZS0+ZmFjZWJvb2tsb2dpbiA9IChpc3NldCgkX1JFUVVFU1RbImZhY2Vib29rbG9naW4iXSkpID8gJF9SRVFVRVNUWyJmYWNlYm9va2xvZ2luIl0gOiAkZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW47CgkKCSRlZGl0cHJvZmlsZS0+bG9ncGFyc2VydHlwZSA9IChpc3NldCgkX1JFUVVFU1RbImxvZ19wYXJzZXJfdHlwZSJdKSkgPyAkX1JFUVVFU1RbImxvZ19wYXJzZXJfdHlwZSJdIDogJGVkaXRwcm9maWxlLT5sb2dwYXJzZXJ0eXBlOwogICAgJGVkaXRwcm9maWxlLT5pbmNsdWRlYmFja3VwID0gKGlzc2V0KCRfUkVRVUVTVFsiaW5jbHVkZWJhY2t1cCJdKSkgPyAkX1JFUVVFU1RbImluY2x1ZGViYWNrdXAiXSA6ICRlZGl0cHJvZmlsZS0+aW5jbHVkZWJhY2t1cDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJLy8gSWYgd2UgaGF2ZSBwcm9wZXIgc2VjdXJpdHkgcmlnaHRzLCBlZGl0IHRoZXNlIGNvcmUgdmFsdWVzLgoJaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkpICB7CgkJaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKCQkJLy8gV2UncmUgZ29ubmEgaGF2ZSBzb21lIHNsYXNoZXMhCgkJCWlmIChpc3NldCgkX1JFUVVFU1RbImxvZ2ZpbGVmdWxscGF0aCJdKSkgeyRfUkVRVUVTVFsibG9nZmlsZWZ1bGxwYXRoIl0gPSBzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWyJsb2dmaWxlZnVsbHBhdGgiXSk7IH0KCQl9CgkJCgkJJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSA9IChpc3NldCgkX1JFUVVFU1RbIm5ld2NvbmZuYW1lIl0pKSA/ICRfUkVRVUVTVFsibmV3Y29uZm5hbWUiXSA6ICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWU7CgkJJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgPSAoaXNzZXQoJF9SRVFVRVNUWyJ0YWJsZW5hbWUiXSkpID8gJF9SRVFVRVNUWyJ0YWJsZW5hbWUiXSA6ICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lOwoJCSRlZGl0cHJvZmlsZS0+bG9nZmlsZWZ1bGxwYXRoID0gKGlzc2V0KCRfUkVRVUVTVFsibG9nZmlsZWZ1bGxwYXRoIl0pKSA/IHN0cl9yZXBsYWNlKCJcXCIsICcvJywgJF9SRVFVRVNUWyJsb2dmaWxlZnVsbHBhdGgiXSkgOiAkZWRpdHByb2ZpbGUtPmxvZ2ZpbGVmdWxscGF0aDsKCX0KCQoJLy8gQ2hlY2sgYW5kIHNlZSBpZiB2YXJpYWJsZXMgYXJlIGNvcnJlY3RseSBzZXQgdG8gc2F2ZS4uLgoJJGNhbnNhdmUgPSB0cnVlOwkKCWlmICghJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSkgewoJCSRzYXZlZCAuPSAiPGZvbnQgY29sb3I9XCJyZWRcIj4iLl9OT19QUk9GSUxFX05BTUVfRU5URVJFRC4iPC9mb250Pjxicj4iOwoJCSRjYW5zYXZlID0gZmFsc2U7CgkJJHNhdmVlcnJvciA9IHRydWU7CgkJJGVkaXQ9MTsKCX0KCgkKICAgIGlmICghJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgJiYgJGNvbmYhPSJuZXdjbmYiKSB7CgkJJHNhdmVkIC49ICI8Zm9udCBjb2xvcj1cInJlZFwiPiIuX05PX01ZU1FMX1RBQkxFX0VOVEVSRUQuIjwvZm9udD48YnI+IjsKCQkkY2Fuc2F2ZSA9IGZhbHNlOwoJCSRzYXZlZXJyb3IgPSB0cnVlOwoJCSRlZGl0PTE7Cgl9CiAgICAKICAgIAoJaWYgKCRjb25mPT0ibmV3Y25mIiB8fCAkbmV3PT0xKSB7CgkJJGNoZWNrbGltaXRzID0gIlNlbGVjdCBwcm9maWxlbmFtZSBmcm9tICIuVEJMX1BST0ZJTEVTOwoJCSRjaGVja2xpbWl0c3Jlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkY2hlY2tsaW1pdHMpIG9yIGRpZShfQ09VTEROVF9RVUVSWV9QUk9GSUxFUy4iLiAiIC4gJGRiLT5FcnJvck1zZygpKTsKCQlpZiAoZGVmaW5lZCgiX0xJTUlUX1BST0ZJTEVTIikgIT0gMCkgewoJCQkgIGlmICgkY2hlY2tsaW1pdHNyZXN1bHQtPlJlY29yZENvdW50KCkgPiBfTElNSVRfUFJPRklMRVMpIHsKCQkJCSAgJHNhdmVkIC49ICI8Zm9udCBjb2xvcj1cInJlZFwiPiIuX1RPT19NQU5ZX1BST0ZJTEVTLiI8L2ZvbnQ+PGJyPiI7CgkJCQkgICRjYW5zYXZlID0gZmFsc2U7CgkJCQkgICRzYXZlZXJyb3IgPSB0cnVlOwoJCQkJICAkZWRpdD0xOyAgICAgICAgICAgIAoJCQkgIH0KCQl9Cgl9CQkKCQoJaWYgKGRlZmluZWQoIl9FTkFCTEVfSU1QT1JUQU5UX1BBUkFNRVRFUl9FRElUT1JfIikpIHsKICAJJGltcG9ydGFudF9wYXJhbV9jb3VudCA9ICRfUkVRVUVTVFsiaW1wb3J0YW50cGFyYW1wYWdlY291bnQiXTsKICAJZm9yICgkcGFyYW1fbG9vcCA9IDA7ICRwYXJhbV9sb29wIDwgJGltcG9ydGFudF9wYXJhbV9jb3VudDsgJHBhcmFtX2xvb3AgKyspIHsKICAJCXVuc2V0KCR0aGlzcGFyYW0pOwogIAkJJHRoaXNwYXJhbSA9IGZhbHNlOwogIAkJaWYgKCgkX1JFUVVFU1RbInBhcmFtaWRfIi4kcGFyYW1fbG9vcF0pICYmICgkcGFyYW1fbG9vcCA8ICRlZGl0cHJvZmlsZS0+Z2V0VXJsUGFyYW1Db3VudCgpKSkgewogIAkJCS8vIEl0J3MgYW4gZXhpc3Rpbmcgb25lLgogIAkJCSR0aGlzcGFyYW0gPSYgJGVkaXRwcm9maWxlLT5nZXRVcmxQYXJhbUJ5SW5kZXgoJHBhcmFtX2xvb3ApOwogIAkJCSR0aGlzcGFyYW1bInBhcmFtaWQiXSA9ICRfUkVRVUVTVFsicGFyYW1pZF8iLiRwYXJhbV9sb29wXTsKICAJCX0gZWxzZSB7CiAgCQkJaWYgKCRfUkVRVUVTVFsicGFyYW11cmxfIi4kcGFyYW1fbG9vcF0gPiAiIikgewogIAkJCQkkdGhpc3BhcmFtID0mICRlZGl0cHJvZmlsZS0+Z2V0VXJsUGFyYW1OZXcoKTsKICAJCQl9CiAgCQl9CiAgCQlpZiAoJHRoaXNwYXJhbSkgewogIAkJCSR0aGlzcGFyYW1bImZpbGVuYW1lIl0gPSAkX1JFUVVFU1RbInBhcmFtdXJsXyIuJHBhcmFtX2xvb3BdOwogIAkJCSR0aGlzcGFyYW1bImltcG9ydGFudHBhcmFtcyJdID0gJF9SRVFVRVNUWyJwYXJhbW5hbWVzXyIuJHBhcmFtX2xvb3BdOwogIAkJfQogIAl9CiAgCQogIAkkaW1wb3J0YW50X3BhcmFtX2NvdW50ID0gJF9SRVFVRVNUWyJpbXBvcnRhbnRwYXJhbXBhZ2Vjb3VudCJdOwogIAlmb3IgKCRwYXJhbV9sb29wID0gMDsgJHBhcmFtX2xvb3AgPCAkaW1wb3J0YW50X3BhcmFtX2NvdW50OyAkcGFyYW1fbG9vcCArKykgewogIAkJaWYgKEAkX1JFUVVFU1RbIkRlbGV0ZVBhcmFtXyIgLiAkcGFyYW1fbG9vcF0pIHsKICAJCQkkZWRpdHByb2ZpbGUtPmRlbGV0ZVVybFBhcmFtcygkcGFyYW1fbG9vcCk7CiAgCQl9CiAgCX0KICB9CQoJaWYgKCRjYW5zYXZlKSB7CgoJCSRlZGl0cHJvZmlsZS0+ZGllb25zcWxlcnJvciA9IGZhbHNlOwoJCSRlZGl0cHJvZmlsZS0+U2F2ZSgpOwogICAgICAgIGlmICgkdmFsaWRVc2VyUmVxdWlyZWQpIHsKICAgICAgICBpZiAoJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkgJiYgISRzZXNzaW9uLT5pc0FkbWluKCkpIHsKICAgICAgICAgICAgLy9lY2hvICJBZGRpbmcgcHJvZmlsZSB0byB1c2VyIGFjY291bnQiOwogICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBjYW4gYWRkIHByb2ZpbGVzLCBoZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgbWFuYWdlciBhcyB3ZWxsCiAgICAgICAgICAgICRzZXNzaW9uLT51c2VyX3Byb2ZpbGVzW2NvdW50KCRzZXNzaW9uLT51c2VyX3Byb2ZpbGVzKV09JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTsKICAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJVUERBVEUgIi5UQkxfVVNFUlMuIiBTRVQgUFJPRklMRVM9Y29uY2F0KFBST0ZJTEVTLCcsJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZScpIFdIRVJFIHVzZXJuYW1lID0gJyRzZXNzaW9uLT51c2VybmFtZScgIik7CiAgICAgICAgICAgIC8vZWNobyAiVVBEQVRFIF9sb2dhaG9saWNfdXNlcnMgU0VUIFBST0ZJTEVTPWNvbmNhdChQUk9GSUxFUywnLCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUnKSBXSEVSRSB1c2VybmFtZSA9ICckc2Vzc2lvbi0+dXNlcm5hbWUnICI7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgfQoJCS8qIHdlIGRvbid0IGRvIHRoaXMgYW55bW9yZSAqLwogICAgICAgIC8qCgkJaWYgKCRlZGl0cHJvZmlsZS0+dHJhY2tlcm1vZGU9PTEpIHsKICAgICAgICAgICAgJHRyZWFsX3BhdGggPSByZWFscGF0aCgiaW5kZXgucGhwIik7CiAgICAgICAgICAgICR0cGF0aCA9IGRpcm5hbWUoJHRyZWFsX3BhdGgpOwogICAgICAgICAgICAkdHJhY2tlcl9sb2dmaWxlPSR0cGF0aC4iL2ZpbGVzLyIuJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLmxvZyI7CiAgICAgICAgICAgICR0aGFuZGxlID0gZm9wZW4gKCR0cmFja2VyX2xvZ2ZpbGUsICJhIik7CiAgICAgICAgICAgIC8vZndyaXRlKCR0aGFuZGxlLCIjIExvZ2ZpbGUgY3JlYXRlZCBieSBMb2dhaG9saWMgV2ViIEFuYWx5dGljcyAtIHd3dy5sb2dhaG9saWMuY29tXG4iKTsKICAgICAgICAgICAgZmNsb3NlKCR0aGFuZGxlKTsKICAgICAgICAgICAgQGNobW9kKCR0cmFja2VyX2xvZ2ZpbGUsIDA2NjYpOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgaWYgKCRlZGl0cHJvZmlsZS0+bGFzdHNxbGVycm9yKSB7CgkJCSRzYXZlZCAuPSAiPGZvbnQgY29sb3I9XCJyZWRcIj4iLiRlZGl0cHJvZmlsZS0+bGFzdHNxbGVycm9yLiI8L2ZvbnQ+PGJyPiI7CgkJCSRlZGl0PTE7CgkJCSRzYXZlZXJyb3IgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCSRzYXZlZCAuPSBfUFJPRklMRV9DT05GX1NBVkVELiIuPGJyPiI7CgkJCXVuc2V0KCRlZGl0KTsKCQkJdW5zZXQoJG5ldyk7CgkJfQoJCWlmICgkdmlzaXRvcmlkZW50bWV0aG9kc3dpdGNoZWQpIHsKCQkJLy8gV2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgY3VycmVudCB2aXNpdG9yIGlkZW50aWZpY2F0aW9uIG1ldGhvZC4KCQl9Cgl9Cn0KCgppZiAoaXNzZXQoJGluc3RhbGwpICYmICgkaW5zdGFsbD09MSkgJiYgKCEkc2F2ZWVycm9yKSkgewogICAgaWYgKCRxID0gQCRkYi0+RXhlY3V0ZSgic2VsZWN0ICogZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBsaW1pdCAxIikpIHsKICAgICAgICAkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgIC8vJHNhdmVkPSRzYXZlZC4iTXlzcWwgVGFibGUgPGI+JGVkaXRwcm9maWxlLT50YWJsZW5hbWU8L2I+IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyBDUkVBVEUuPGJyPiI7CiAgICB9IGVsc2UgewogICAgICAgIGNyZWF0ZURhdGFUYWJsZSgkZWRpdHByb2ZpbGUpOwogICAgICAgICRzYXZlZD0kc2F2ZWQuIkNyZWF0ZWQgdGFibGVzIGZvciA8Yj4kZWRpdHByb2ZpbGUtPnRhYmxlbmFtZTwvYj4gaW4gZGF0YWJhc2UgPGI+JERhdGFiYXNlTmFtZTwvYj48YnI+IjsgLy9IRUxQIQogICAgfQogICAgCiAgICAkc3RlcD01OwogICAgJGNvbmY9JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTsKICAgIGhlYWRlcigibG9jYXRpb246IGluc3RhbGwucGhwP3N0ZXA9NSZjb25mPSIudXJsZW5jb2RlKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUpLiImc2F2ZWQ9Ii51cmxlbmNvZGUoJHNhdmVkKSk7CiAgICBleGl0KCk7Cn0KCmlmICgkYmFja3VwID09IDIpIHsKCS8vIEV4cG9ydCB0aGUgLmd6aXBwZWQgYmFja3VwIGZpbGUuCiAgICBzZXRfdGltZV9saW1pdCg4NjQwMCk7CiAgICBpZiAoaXNzZXQoJF9SRVFVRVNUWydkYXlzX2luX2ZpbGUnXSkpIHsKCQkkZGF5c19pbl9maWxlID0gJF9SRVFVRVNUWydkYXlzX2luX2ZpbGUnXTsKCX0gZWxzZSB7CgkJJGRheXNfaW5fZmlsZSA9IDE7Cgl9CiAgICAkcmVhbF9wYXRoID0gcmVhbHBhdGgoImluZGV4LnBocCIpOwogICAgJHBhdGggPSBkaXJuYW1lKCRyZWFsX3BhdGgpOwogICAgJHBhdGggPSBzdHJfcmVwbGFjZSAoIlxcIiwgIi8iLCAkcGF0aCk7CiAgICAKICAgICRuZGF5cyA9IHJvdW5kKCgkdG8tICRmcm9tKS8oODY0MDAqJGRheXNfaW5fZmlsZSkpOwoJJGk9MDsKCSRmaW5hbHRvPSR0bzsKCSR0bz0kZnJvbTsKCW9iX3N0YXJ0KCk7Cgl3aGlsZSAoJGkgPCAkbmRheXMpIHsKCQkkZnJvbSA9ICR0bzsKCQkkdG89JGZyb20rKDg2NDAwKiRkYXlzX2luX2ZpbGUpOwoJCWlmIChAJHVwZ3JhZGUhPSJ0cnVlIikgewoJCQkvLyAkcT0kZGItPkV4ZWN1dGUoInNlbGVjdCB0aW1lc3RhbXAsIHYuaXBudW1iZXIgYXMgaXBudW1iZXIsdS51cmwgYXMgdXJsLHVwLnBhcmFtcyBhcyBwYXJhbXMsc3RhdHVzLGJ5dGVzLHIucmVmZXJyZXIgYXMgcmVmZXJyZXIscnAucGFyYW1zIGFzIHJlZnBhcmFtcywgQUdFTlRTLm5hbWUgdXNlcmFnZW50IGZyb20KCQkJLy8gJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgYXMgYSwgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdmlzaXRvcmlkcyBhcyB2LCAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxzIGFzIHUsJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdXJscGFyYW1zIGFzIHVwLCAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9yZWZlcnJlcnMgYXMgciwgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfcmVmcGFyYW1zIGFzIHJwLCAiLlRCTF9VU0VSX0FHRU5UUy4iIGFzIEFHRU5UUyB3aGVyZSB0aW1lc3RhbXAgPj0gJGZyb20gYW5kIHRpbWVzdGFtcCA8PSAkdG8gYW5kIChhLnZpc2l0b3JpZD12LmlkIGFuZCBhLnVybD11LmlkIGFuZCBhLnBhcmFtcz11cC5pZCBhbmQgYS5yZWZlcnJlcj1yLmlkIGFuZCBhLnJlZnBhcmFtcz1ycC5pZCBhbmQgYS51c2VyYWdlbnRpZCA9IEFHRU5UUy5pZCkgb3JkZXIgYnkgdGltZXN0YW1wIik7CgkJCSRxID0gJGRiLT5FeGVjdXRlKCJTRUxFQ1QgYS50aW1lc3RhbXAsIHYuaXBudW1iZXIgQVMgaXBudW1iZXIsIHUudXJsIEFTIHVybCwgdXAucGFyYW1zIEFTIHBhcmFtcywgYS5zdGF0dXMsIGEuYnl0ZXMsIHIucmVmZXJyZXIgQVMgcmVmZXJyZXIsIHJwLnBhcmFtcyBBUyByZWZwYXJhbXMsIGIudXNlcmFnZW50IEFTIHVzZXJhZ2VudCBGUk9NCgkJCXskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZX0gYXMgYSwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3Zpc2l0b3JpZHN9IEFTIHYsIHskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxzfSBBUyB1LCB7JGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdXJscGFyYW1zfSBBUyB1cCwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZmVycmVyc30gQVMgciwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZnBhcmFtc30gQVMgcnAsIHskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91c2VyYWdlbnRzfSBBUyBiIFdIRVJFIGEudGltZXN0YW1wID49IHskZnJvbX0gYW5kIGEudGltZXN0YW1wIDw9IHskdG99IEFORCAoYS52aXNpdG9yaWQgPSB2LmlkIEFORCBhLnVybCA9IHUuaWQgQU5EIGEucGFyYW1zID0gdXAuaWQgQU5EIGEucmVmZXJyZXIgPSByLmlkIEFORCBhLnJlZnBhcmFtcyA9IHJwLmlkIEFORCBhLnVzZXJhZ2VudGlkID0gYi5pZCkgT1JERVIgQlkgYS50aW1lc3RhbXAiKTsKCQkJCgkJCWlmICgkbW9kZT09ImNzdiIpIHsKCQkJCSRidXBmaWxlPSRwYXRoIC4gIi9maWxlcy8kY3VycHJvZmlsZW5hbWUuIi4gZGF0ZSgiWW1kIiwkZnJvbSkgLiBkYXRlKCItWW1kIiwkdG8pIC4gIi5jc3YuZ3oiOwoJCQl9IGVsc2UgewoJCQkJJGJ1cGZpbGU9JHBhdGggLiAiL2ZpbGVzLyRjdXJwcm9maWxlbmFtZS4iLiBkYXRlKCJZbWQiLCRmcm9tKSAuIGRhdGUoIi1ZbWQiLCR0bykgLiAiLmxvZy5neiI7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyAkcT0kZGItPkV4ZWN1dGUoInNlbGVjdCAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZS4qLCBBR0VOVFMubmFtZSB1c2VyYWdlbnQgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBsZWZ0IG91dGVyIGpvaW4gIi5UQkxfVVNFUl9BR0VOVFMuIiBBR0VOVFMgb24gKHVzZXJhZ2VudGlkID0gQUdFTlRTLmlkKSBvcmRlciBieSB0aW1lc3RhbXAiKTsKCQkJJHEgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCB7JGVkaXRwcm9maWxlLT50YWJsZW5hbWV9LiosIGIudXNlcmFnZW50IEFTIHVzZXJhZ2VudCBGUk9NIHskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZX0gQVMgYSwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3VzZXJhZ2VudH0gQVMgYiBPTiAoYS51c2VyYWdlbnRpZCA9IGIuaWQpIE9SREVSIEJZIHRpbWVzdGFtcCIpOwkJCQoJCQkkYnVwZmlsZT0kcGF0aCAuICIvZmlsZXMvJGN1cnByb2ZpbGVuYW1lLmJhY2t1cC5sb2cuZ3oiOyAgCgkJfSAgIAoJCSAKCQkKCQkvLyRnZmlsZT1leGVjKCJwd2QiKSAuICIvZmlsZXMvZ2xvYmFsLnBocCI7CgkJJGZwID0gZ3pvcGVuICgkYnVwZmlsZSwidyIpOwoJCWlmICgkbW9kZT09ImNzdiIpIHsKCQkJLy8gd3JpdGUgYSBoZWFkcmUgcm93CgkJCSRidWZmZXI9ICJcIklQIG51bWJlclwiLFwiRGF0ZVwiLFwiVVJMXCIsXCJTdGF0dXNcIixcIkJ5dGVzXCIsXCJSZWZlcnJlclwiLFwiVXNlcmFnZW50XCJcbiI7IC8vSEVMUCEKCQkJLy9lY2hvICRidWZmZXI7CgkJCWd6d3JpdGUgKCRmcCwgJGJ1ZmZlcik7CgkJfQoJCXdoaWxlICgkZGF0YT0kcS0+RmV0Y2hSb3coKSkgewoJCQlpZiAoJGRhdGFbInJlZnBhcmFtcyJdPT0iPyIpIHsKCQkJCSRkYXRhWyJyZWZwYXJhbXMiXT0iIjsKCQkJfQoJCQkkZGF0ZT1kYXRlKCJbZC9NL1k6SDppOnMgKzAwMDBdIiwkZGF0YVsidGltZXN0YW1wIl0pOwoJCQlpZiAoJG1vZGU9PSJjc3YiKSB7CgkJCQkkYnVmZmVyPSAiXCIkZGF0YVtpcG51bWJlcl1cIixcIiRkYXRlXCIsXCIiLiRkYXRhWyJ1cmwiXS4kZGF0YVsicGFyYW1zIl0uIlwiLFwiJGRhdGFbc3RhdHVzXVwiLFwiJGRhdGFbYnl0ZXNdXCIsXCIiLiRkYXRhWyJyZWZlcnJlciJdLiRkYXRhWyJyZWZwYXJhbXMiXS4iXCIsXCIiLiRkYXRhWyJ1c2VyYWdlbnQiXS4iXCJcbiI7IAoJCQkJCgkJCX0gZWxzZSB7CgkJCSAgICRidWZmZXI9ICIkZGF0YVtpcG51bWJlcl0gLSAtICRkYXRlIFwiR0VUICIuJGRhdGFbInVybCJdLiRkYXRhWyJwYXJhbXMiXS4iIEhUVFAvMS4xXCIgIi4kZGF0YVsic3RhdHVzIl0uIiAiLiRkYXRhWyJieXRlcyJdLiIgXCIiLiRkYXRhWyJyZWZlcnJlciJdLiRkYXRhWyJyZWZwYXJhbXMiXS4iXCIgXCIiLiRkYXRhWyJ1c2VyYWdlbnQiXS4iXCJcbiI7CgkJCX0KCQkJCgkJCS8vZWNobyAkYnVmZmVyOwoJCQlnendyaXRlICgkZnAsICRidWZmZXIpOwoJCX0KCQlnemNsb3NlICgkZnApOwoJCSRpKys7CgkJZWNobyAid3JvdGUgZmlsZTogJGJ1cGZpbGU8YnI+IjsKCQlsZ2ZsdXNoKCk7Cgl9CiAgICBpZiAoQCR1cGdyYWRlIT0idHJ1ZSIpIHsgCiAgICAgICAgaWYgKCRtb2RlPT0iY3N2IikgewogICAgICAgICAgICBlY2hvICI8UD48bGk+ICIuX09LX0NTVl9GSUxFX1dSSVRURU5fSU4uIiA8Yj4kYnVwZmlsZTwvYj4uPC9QPjxQPiIuX1BMRUFTRV9ET1dOTE9BRF9OT1cuIjo8YnI+IDxiPjxhIGhyZWY9XCJmaWxlcy8kY3VycHJvZmlsZW5hbWUuIi4gZGF0ZSgiWW1kIiwkZnJvbSkgLiBkYXRlKCItWW1kIiwkdG8pIC4gIi5jc3YuZ3pcIj4gZmlsZXMvJGN1cnByb2ZpbGVuYW1lLiIuIGRhdGUoIlltZCIsJGZyb20pIC4gZGF0ZSgiLVltZCIsJHRvKSAuICIubG9nLmd6IDwvYT48L2I+PHVsPjxsaT5UaGUgZmlyc3Qgcm93IGluIHRoaXMgZmlsZSBjb250YWlucyB0aGUgY29sdW1uIG5hbWVzPC9saT48bGk+RmllbGRzIGluIHRoaXMgQ1NWIGZpbGUgYXJlIHNwZXJhdGVkIGJ5IGEgY29tbWE8L2xpPjxsaT5BbGwgZmllbGRzIGFyZSBlbmNsb3NlZCBpbiBcIiBcIiBkb3VibGUgcXVvdGVzLjwvbGk+PC91bD48L3A+IjsgLy9IRUxQIQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxQPjxsaT4gT0ssIGxvZyBmaWxlIHdyaXR0ZW4uIFBsZWFzZSBkb3dubG9hZCBub3c6PGJyPiA8Yj48YSBocmVmPVwiZmlsZXMvJGN1cnByb2ZpbGVuYW1lLiIuIGRhdGUoIlltZCIsJGZyb20pIC4gZGF0ZSgiLVltZCIsJHRvKSAuICIubG9nLmd6XCI+IGZpbGVzLyRjdXJwcm9maWxlbmFtZS4iLiBkYXRlKCJZbWQiLCRmcm9tKSAuIGRhdGUoIi1ZbWQiLCR0bykgLiAiLmxvZy5neiA8L2E+PC9iPjxQPiI7ICAgIAogICAgICAgIH0KICAgICAgICBlY2hvICI8UD5XZSByZWNvbW1lbmQgdG8gcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHNlcnZlciBvbmNlIHlvdSBoYXZlIGRvd25sb2FkZWQgaXQuPFA+IjsKICAgIAogICAgfSBlbHNlIHsgCiAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSIpOwogICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdnBkIik7CiAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cG0iKTsKICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2RhaWx5dXJscyIpOyAKICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2NvbnZlcnNpb25zIik7CiAgICAgICAgY3JlYXRlRGF0YVRhYmxlKCRlZGl0cHJvZmlsZSk7CiAgICAgICAgZWNobyAiT0ssIGxvZyBmaWxlIHdyaXR0ZW4gdG8gJGJ1cGZpbGUuPFA+IDxhIGhyZWY9XCJ1cGRhdGUucGhwP2NvbmY9JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSZ1cGdyYWRlPSRidXBmaWxlXCI+Q2xpY2sgaGVyZSB0byBjb250aW51ZSB1cGdyYWRlPC9hPi4gKEltcG9ydHMgeW91IG9sZCBsb2cgZGF0YSBiYWNrIGludG8gdGhlIG5ldyBkYXRhYmFzZSBzdHVjdHVyZSk8UD5XaGVuIHRoYXQgaXMgZG9uZSwgeW91IGNhbiBzYWZlbHkgcmVtb3ZlIG9yIGFyY2hpdmUgdGhlIGZpbGU6ICRidXBmaWxlIjsKICAgIH0gCiAgICBleGl0KCk7Cn0KCmlmIChpc3NldCgkc2V0X3Byb2ZpbGVfc3RydWN0dXJlX3ZlcnNpb24pKSB7CiAgICBpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5pc0FkbWluKCkpIHsKICAgICAgICAgICAgZWNob1dhcm5pbmcoIk1hbnVhbGx5IGNoYW5nZWQgdGhpcyBwcm9maWxlJ3Mgc3RydWN0dXJlIHZlcnNpb24gdG8gZnJvbSAkZWRpdHByb2ZpbGUtPnN0cnVjdHVyZV92ZXJzaW9uIHRvICRzZXRfcHJvZmlsZV9zdHJ1Y3R1cmVfdmVyc2lvbiIpOwogICAgICAgICAgICAkZWRpdHByb2ZpbGUtPnN0cnVjdHVyZV92ZXJzaW9uID0gJHNldF9wcm9maWxlX3N0cnVjdHVyZV92ZXJzaW9uOwogICAgICAgICAgICAkZWRpdHByb2ZpbGUtPlNhdmUoKTsKICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgdG8gcmVsb2FkIHRoZSBwcm9maWxlIChhbHNvIHRoZSAkcHJvZmlsZSBvbmUgd2hpY2ggaXMgY3JlYXRlZCBpbiBjb21tb24gYW5kIHVzZWQgaW4gdG9wIHRvIGNoZWNrIHZlcnNpb25zISkKICAgICAgICAgICAgJGVkaXRwcm9maWxlLT5Mb2FkKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUpOwogICAgICAgICAgICAkcHJvZmlsZS0+TG9hZCgkcHJvZmlsZS0+cHJvZmlsZW5hbWUpOyAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvV2FybmluZyhfU09SUllfTk9fUEVSTUlTU0lPTlMpOwogICAgICAgIH0gICAgICAgICAgICAKICAgIH0KfQoKaW5jbHVkZSAidG9wLnBocCI7CgppZiAoaXNzZXQoJF9SRVFVRVNUWydhcmNoaXZldGFibGUnXSkpIHsKICAgIGluY2x1ZGUgImluY2x1ZGVzL2FyY2hpdmV0YWJsZS5waHAiOwp9CgovLyBObyByaWdodHMgdG8gY3JlYXRlIGEgbmV3IG9uZT8gIFR1cm4gb2ZmIHRoZSAiTmV3IiBmbGFnCmlmICgkdmFsaWRVc2VyUmVxdWlyZWQgJiYgKCEkc2Vzc2lvbi0+aXNBZG1pbigpICYmICEkc2Vzc2lvbi0+Y2FuQWRkUHJvZmlsZXMoKSkpIHsKCXVuc2V0KCRuZXcpOwp9CgppZiAoKGlzc2V0KCRzYXZlKSkgJiYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgJiYgKCEkc2F2ZWVycm9yKSkgewoJaWYgKCRxID0gQCRkYi0+RXhlY3V0ZSgic2VsZWN0ICogZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBsaW1pdCAxIikpIHsKCQkkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgIGNyZWF0ZURhdGFUYWJsZSgkZWRpdHByb2ZpbGUpOyAKCQkvLyRzYXZlZD0kc2F2ZWQuIk15c3FsIFRhYmxlIDxiPiRlZGl0cHJvZmlsZS0+dGFibGVuYW1lPC9iPiBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgQ1JFQVRFLjxicj4iOwoJfSBlbHNlIHsKCQljcmVhdGVEYXRhVGFibGUoJGVkaXRwcm9maWxlKTsKCQkkc2F2ZWQ9JHNhdmVkLiJDcmVhdGVkIHRhYmxlcyBmb3IgPGI+JGVkaXRwcm9maWxlLT50YWJsZW5hbWU8L2I+IGluIGRhdGFiYXNlIDxiPiREYXRhYmFzZU5hbWU8L2I+PGJyPiI7ICAKCX0KCQoJLy8gR2V0IFRoZSB1c2VycyBmYWNlYm9vayBJRCBhbmQgVE9LRU4KCWlmKCFlbXB0eSgkZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW4pICYmIGdldFByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUuImZhY2Vib29rQXBpIi4kZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW4gLCBmYWxzZSApID09IGZhbHNlKXsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va0FwaSUiKTsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va0FwaUZvcm0iKTsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va0FwcEZvcm0iKTsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va1BhZ2VGb3JtIik7CgkJJHNhdmVkLj0iPGRpdiBpZD0nZmFjZWJvb2tfZmVlZGJhY2snPjwvZGl2PiI7CgkJJHNhdmVkLj0gIjxzY3JpcHQgc3JjPSdodHRwOi8vZmFjZWJvb2subG9nYWhvbGljLmNvbS9mYWNlYm9va19hY2Nlc3MucGhwP2VtYWlsPXskZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW59JmNvbmY9eyRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWV9Jz48L3NjcmlwdD4iOwoJfQp9CiRzdGFydD1nZXRtaWNyb3RpbWUoKTsKCmlmICghaXNzZXQoJGRlbCkpIHsKCSRkZWw9MDsgCn0KaWYgKCRkZWw9PTEpIHsKCSBpZiAoJGN1cnByb2ZpbGVuYW1lIT0iIikgewoJCWVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGI+Ii5fREFUQUJBU0VfTUFJTlRFTkFOQ0VfT1BUSU9OUy4iOiA8Zm9udCBjb2xvcj1yZWQ+JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTwvZm9udD48L2I+PHA+IjsKICAgICAgICBlY2hvICI8UD4iLl9QTEVBU0VfQ0hPT1NFX0FOX09QVElPTi4iOjxQPjx1bD4iOwogICAgICAgIC8vaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5FZGl0UHJvZmlsZXMoKSkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpKSB7ICAgICAgICAgICAgICAgICAgICAKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmJhY2t1cD0xXCI+Ii5fQkFDS1VQX0VYUE9SVDsKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJnJlc3RvcmVkZWZhdWx0ZGFzaGJvYXJkPTFcIj48Yj4iLiBfUkVTVE9SRV9ERUZBVUxUX0RBU0hCT0FSRCAuICI8L2I+PC9hPjxwPiI7CgkJfQoJCQoJCWlmICgoISR2YWxpZFVzZXJSZXF1aXJlZCkgfHwgKCRzZXNzaW9uLT5jYW5FZGl0UHJvZmlsZXMoKSkpIHsKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJnZXRfcmVwb3J0cy5waHA/Y29uZj0kY3VycHJvZmlsZW5hbWVcIj48Yj4iLl9JTlNUQUxMX1JFUE9SVFMuIjwvYj48L2E+PHA+IjsKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJyZXBvcnR1cGRhdGVzLnBocD9jb25mPSRjdXJwcm9maWxlbmFtZVwiPjxiPiIuX1VQREFURS4nICcuX1JFUE9SVFMuIjwvYj48L2E+PHA+IjsKCQl9CgkJCgkJaWYoTE9HQUhPTElDX1ZFUlNJT05fU1RBVFVTID09ICdkZXYnKSB7CiAgICAgICAgLy8gaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgJHNlc3Npb24tPmlzQWRtaW4oKSkgewoJCQllY2hvICI8bGk+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj17JGN1cnByb2ZpbGVuYW1lfSZ1cGRhdGVfbWV0aG9kPTFcIj48Yj4iLl9VUERBVEVfTUVUSE9EX1BSRUZFUkVOQ0UuIjwvYj48L2E+PHA+IjsKCQl9CgkJCiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5VcGRhdGVMb2dzKCkpIHsKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmRlbD01XCI+ICIuX0RFTEVURV9EQVRFX1JBTkdFOwogICAgICAgICAgICBlY2hvICI8TEk+IDxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmRlbD0yXCIgb25jbGljaz1cInJldHVybiBjb25maXJtKCciLl9ERUxFVEVfUFJPRklMRV9BTkRfREFUQUJBU0VfQVNTVVJBTkNFLiInKVwiPiIuX0RFTEVURV9QUk9GSUxFX0FORF9EQVRBQkFTRS4iPC9hPiA8UD4iOwogICAgICAgICAgICBlY2hvICI8bGk+IDxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmRlbD00XCIgb25jbGljaz1cInJldHVybiBjb25maXJtKCciLl9ERUxFVEVfREFUQUJBU0VfQVNTVVJBTkNFLiInKVwiPiIuX0RFTEVURV9EQVRBQkFTRS4iPC9hPjxwPiI7CiAgICAgICAgICAgIGVjaG8gIjxsaT4gPGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZGVsPTdcIiBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJyIuX0RFTEVURV9TVU1NQVJZX1RBQkxFU19BU1NVUkFOQ0UuIicpXCI+Ii5fREVMRVRFX1NVTU1BUllfVEFCTEVTLiI8L2E+PHA+IjsKICAgICAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmRlbD04XCI+Ii5fREVMRVRFX0NBQ0hFLiI8L2E+PHA+PC91bD4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhblVwZGF0ZUxvZ3MoKSkgeyAKICAgICAgICAgICAgZWNobyAiPGxpPjxiPiIuX1NQRUNJQUxUWV9VUERBVEVfT1BUSU9OUy4iPC9iPjo8UD48dWw+IjsKICAgICAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJnVwZGF0ZV9jb3VudHJpZXM9MVwiPlVwZGF0ZSBDb3VudHJ5IEluZm9ybWF0aW9uIGluIERhdGFiYXNlPC9hPjxwPiI7IAogICAgICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZGVsPTExXCI+ICIuX1VQREFURV9TVU1NQVJZX1RBQkxFU19XT1VUX0NIRUNLSU5HLiI8L2E+PHA+IjsKICAgICAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJ1cGRhdGUucGhwP2NvbmY9JGN1cnByb2ZpbGVuYW1lJmZvcmNlPXRydWVcIj4gIi5fVVBEQVRFX1NUQVRTX1dPVVRfREFURV9SQU5HRV9DSEVDS1MuIjwvYT48cD4iOwogICAgICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj1cInVwZGF0ZS5waHA/Y29uZj0kY3VycHJvZmlsZW5hbWUmZm9yY2U9dHJ1ZSZtb3ZlZG9uZT10cnVlXCIgb25jbGljaz1cInJldHVybiBjb25maXJtKCciLl9NT1ZFX1RPX0RPTkVfQVNTVVJBTkNFLiInKVwiPiIuX01PVkVfVE9fRE9ORS4iPC9hPjxwPjwvdWw+IjsKICAgICAgICB9CiAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmVkaXQ9MVwiPiAiLl9FRElUX1BST0ZJTEUuIjwvYT48UD4iOwoJCWVjaG8gIjxsaT48YSBocmVmPVwicHJvZmlsZXMucGhwP2VkaXRjb25mPSRjdXJwcm9maWxlbmFtZVwiPiA8Yj4iLl9DQU5DRUwuIjwvYj48L2E+PC91bD4iOwogICAgICAgIGVjaG8gIjxQPiI7CiAgICAgICAgCiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5BZGRQcm9maWxlcygpKSB7CiAgICAgICAgICBpZiAoJHEgPSBAJGRiLT5FeGVjdXRlKCJTRUxFQ1QgdGFibGVfc2NoZW1hIFwiRGF0YSBCYXNlIE5hbWVcIiwgdGFibGVfbmFtZSwgc3VtKCBkYXRhX2xlbmd0aCArIGluZGV4X2xlbmd0aCApIC8gMTAyNCAvIDEwMjQgXCJEYXRhIEJhc2UgU2l6ZSBpbiBNQlwiIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLlRBQkxFUyB3aGVyZSB0YWJsZV9zY2hlbWE9JyREYXRhYmFzZU5hbWUnIGFuZCAodGFibGVfbmFtZT0nJGVkaXRwcm9maWxlLT50YWJsZW5hbWUnIG9yIHRhYmxlX25hbWUgbGlrZSAnJGVkaXRwcm9maWxlLT50YWJsZW5hbWVcXyUnKSBHUk9VUCBCWSB0YWJsZV9zY2hlbWEiKSkgewogICAgICAgICAgICAKICAgICAgICAgICAgJGNoaz0kcS0+RmV0Y2hSb3coKTsKICAgICAgICAgICAgJGluZm8gPSBfVE9UQUxfU0laRV9PRl9USElTX1BST0ZJTEUuIiAiLm51bWJlcl9mb3JtYXQoJGNoa1syXSwwKS4iIE1CLiAiOwogICAgICAgICAgICAkcSA9ICRkYi0+RXhlY3V0ZSgic2VsZWN0IGNvdW50KCopIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWUiKTsKICAgICAgICAgICAgJGNoaz0kcS0+RmV0Y2hSb3coKTsKICAgICAgICAgICAgJGluZm8uPSBfVEhFUkVfQVJFLiIgJGNoa1swXSAiLl9SRUNPUkRTX0lOX01BSU5fU1BBTk5JTkcuIiAiOwogICAgICAgICAgICAkcSA9ICRkYi0+RXhlY3V0ZSgic2VsZWN0IHRpbWVzdGFtcCBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lIG9yZGVyIGJ5IHRpbWVzdGFtcCBhc2MgbGltaXQgMSIpOwogICAgICAgICAgICAkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgICAgICAkZnJvbT0kY2hrWzBdOwogICAgICAgICAgICAkaW5mby49IGRhdGUoIlktbS1kIiwkY2hrWzBdKSAuICIgdG8gIjsKICAgICAgICAgICAgJHEgPSAkZGItPkV4ZWN1dGUoInNlbGVjdCB0aW1lc3RhbXAgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBvcmRlciBieSB0aW1lc3RhbXAgZGVzYyBsaW1pdCAxIik7CiAgICAgICAgICAgICRjaGs9JHEtPkZldGNoUm93KCk7CiAgICAgICAgICAgICR0bz0kY2hrWzBdOwogICAgICAgICAgICAkaW5mby49IGRhdGUoIlktbS1kLCAgSDppOnMiLCRjaGtbMF0pIC4gIi4gKCIuX1NFRV9NT1JFX1NUQVRJU1RJQ1NfQkVMT1cuIik8YnI+PGJyPiI7CiAgICAgICAgICAgICRpbmZvLj0gIlByb2ZpbGUgc3R1Y3R1cmUgdmVyc2lvbiBpczogJGVkaXRwcm9maWxlLT5zdHJ1Y3R1cmVfdmVyc2lvbiI7CiAgICAgICAgICAgIGVjaG9Ob3RpY2UoJGluZm8sIndpZHRoOjY0MHB4OyIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkpIHsgCiAgICAgICAgICAgICRxdWVyeT0gIlNFTEVDVCB0YWJsZV9uYW1lLCB0YWJsZV9yb3dzLCBzdW0oIGRhdGFfbGVuZ3RoICsgaW5kZXhfbGVuZ3RoICkgLyAxMDI0IC8gMTAyNCBcIkRhdGEgQmFzZSBTaXplIGluIE1CXCIgIjsKICAgICAgICAgICAgLy8kcXVlcnkgLj0gIiwgY29uY2F0KFwiPGEgaHJlZj1wcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmFyY2hpdmV0YWJsZT1cIix0YWJsZV9uYW1lLFwiPkNyZWF0ZSBhcmNoaXZlPC9hPlwiKSBhcyBhcmNoaXZlICI7CiAgICAgICAgICAgICRxdWVyeSAuPSAiRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuVEFCTEVTIHdoZXJlIHRhYmxlX3NjaGVtYT0nJERhdGFiYXNlTmFtZScgYW5kICh0YWJsZV9uYW1lPSckZWRpdHByb2ZpbGUtPnRhYmxlbmFtZScgb3IgdGFibGVfbmFtZSBsaWtlICckZWRpdHByb2ZpbGUtPnRhYmxlbmFtZVxfJScpIEdST1VQIEJZIHRhYmxlX25hbWUiOwogICAgICAgICAgICAvLyRzaG93ZmllbGRzPSJ0YWJsZSBuYW1lLCIuX1JFQ09SRFMuIiwiLl9TSVpFSU5NQi4iLCBBcmNoaXZlIjsKICAgICAgICAgICAgJHNob3dmaWVsZHM9InRhYmxlIG5hbWUsIi5fUkVDT1JEUy4iLCIuX1NJWkVJTk1COwogICAgICAgICAgICAkbGFiZWxzPV9EQVRBQkFTRV9TVEFUSVNUSUNTOwogICAgICAgICAgICAvLyRtaW5pPTE7CiAgICAgICAgICAgIGVjaG8gIjx0YWJsZSB3aWR0aD02NDA+PHRyPjx0ZD4iOwogICAgICAgICAgICBAU3RhdHNUYWJsZSgkZnJvbSwkdG8sJHNob3dmaWVsZHMsJGxhYmVscywkcXVlcnksJGRyaWxsZG93biwkZmlsdGVyKTsKICAgICAgICAgICAgZWNobyAiPC90ZD48L3RyPjwvdGFibGU+IjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWNobyAiPC9kaXY+IiA7CgkJZXhpdCgpOwogICAgfQp9CgppZiAoJGRlbD09MikgewoJaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuRWRpdFByb2ZpbGVzKCkpIHsKICAgICAgICAKCSAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1pbmRlbnRib2R5Pjxmb250IGNvbG9yPXJlZD5MYXN0IEFjdGlvbjo8L2ZvbnQ+PGJyPjxpPiI7CgkJICAgICRxdWVyeSA9ICJEZWxldGUgZnJvbSAiLlRCTF9QUk9GSUxFUy4iIHdoZXJlIHByb2ZpbGVpZCA9ICIuJGVkaXRwcm9maWxlLT5wcm9maWxlaWQ7CgkJICAgIGlmICghJGRiLT5FeGVjdXRlKCRxdWVyeSkpIHsKCQkgICAgIGRpZShfQ09VTEROVF9ERUxFVEVfUFJPRklMRS4iICIgLiAkZGItPkVycm9yTXNnKCkpOwoJCSAgICB9IGVsc2UgewoJCQkgICAgZWNobyBfREVMRVRFRF9QUk9GSUxFLiI6IDxiPiIuJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iPC9iPjxicj4iOwoJCSAgICB9CgkJICAgIGRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUpOwoJCSAgICBpZiAoISRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAiLiRlZGl0cHJvZmlsZS0+dGFibGVuYW1lKSkgewoJCQkgICAgZWNobygiPHA+Ii5fQ09VTEROVF9EUk9QX1RBQkxFLiIgIi4kZWRpdHByb2ZpbGUtPnRhYmxlbmFtZS4iLCAiLiRkYi0+RXJyb3JNc2coKS4iPC9wPiIpOwoJCSAgICB9IGVsc2UgewoJCQkgICAgZWNobyBfRFJPUFBFRF9EQl9UQUJMRVMuIjogPGI+Ii4kZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiI8L2I+PGJyPiI7CgkJICAgIH0KCQkgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cGQiKTsKCQkgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cG0iKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9kYWlseXVybHMiKTsgCgkJICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfY29udmVyc2lvbnMiKTsKCQkgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxzIik7CiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdXJscGFyYW1zIik7CiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfa2V5d29yZHMiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9yZWZlcnJlcnMiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9yZWZwYXJhbXMiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9zZXNzaW9uaWRzIik7CiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdmlzaXRvcmlkcyIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3NjcmVlbnJlcyIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2NvbG9yZGVwdGgiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91c2VyYWdlbnRzIik7CiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgIi4kZWRpdHByb2ZpbGUtPnRhYmxlbmFtZS4iX3RsZW5ndGgiKTsgLy8gdGhlc2UgbGFzdCAyIGFyZSBzZW1pIHRlbXBvcmFyeSB0YWJsZXMgdGhhdCBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIHJ1bm5pbmcgVG90YWwgRHVyYXRpb24gYW5kIFRpbWVvbiBzaXRlIFRvZGF5IHJlcG9ydHMsIGJ1dCB3ZSdsbCBkZWxldGUgdGhlbiBoZXJlIGp1c3QgaW4gY2FzZS4KICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAiLiRlZGl0cHJvZmlsZS0+dGFibGVuYW1lLiJfdmxlbmd0aCIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3RyYWNrZXJsb2ciKTsKCQkgICAgCgkJICAgIGVjaG8gX1NVTU1BUllfVEFCTEVTX0RST1BQRUQuIi48YnI+Ii5fRE9ORS4iLjwvaT48L2Rpdj48aHIgbm9zaGFkZSBzaXplPTE+PGJyPiI7CiAgICAgICAgICAgIGRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUpOwoJCQkKCQkJdW5zZXQoJF9TRVNTSU9OWydwcm9maWxlb2JqZWN0J10pOwoJCQl1bnNldCgkX1NFU1NJT05bJ3Byb2ZpbGVuYW1lJ10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKICAgICAgICAgICAgZWNob1dhcm5pbmcoX1NPUlJZX05PX1BFUk1JU1NJT05TKTsKICAgICAgICAgICAgZWNobyAiPFA+Jm5ic3A7PC9QPjwvZGl2PiI7CiAgICAgICAgfSAKCX0KfQoKaWYgKCRkZWw9PTMpIHsKCSBpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CgkJICRxdWVyeSA9ICJEZWxldGUgZnJvbSAiLlRCTF9QUk9GSUxFUy4iIHdoZXJlIHByb2ZpbGVpZCA9ICIuJGVkaXRwcm9maWxlLT5wcm9maWxlaWQ7CgkJICRkYi0+RXhlY3V0ZSgkcXVlcnkpIG9yIGRpZSgiQ291bGRuJ3QgZGVsZXRlIHByb2ZpbGUuICIgLiAkZGItPkVycm9yTXNnKCkpOwoJCSBkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lKTsKCQkgZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj48Zm9udCBjb2xvcj1yZWQ+Ii5fTEFTVF9BQ1RJT04uIjo8L2ZvbnQ+PGJyPiIuX0RFTEVURURfUFJPRklMRS4iOiA8Yj4kZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lPC9iPjxicj4iLl9QTEVBU0VfRFJPUF9EQl9UQUJMRVMuIiA8Yj4nJGVkaXRwcm9maWxlLT50YWJsZW5hbWUnPC9iPiAiLl9NQU5VQUxMWV9PUl9LRUVQX0lULiI8L2k+PC9kaXY+PGhyIG5vc2hhZGUgc2l6ZT0xPjxicj4iOwogICAgICAgICBkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lKTsgCgkgfQp9CgppZiAoJGRlbD09NCkgewoJaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuRWRpdFByb2ZpbGVzKCkpIHsKCQkKICAgICAgICAgICAgZGVsZXRlRGF0YVRhYmxlKCRlZGl0cHJvZmlsZSk7IAogICAgICAgIAoJCSAgICBjcmVhdGVEYXRhVGFibGUoJGVkaXRwcm9maWxlKTsKCQkKICAJICAgICAgICAvLyBkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lKTsKCQkJCgkJCWRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICJjYWNoZVxfJSIpOwoJCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZS4iJVxfY2FjaGVhcnJheSIpOwoJCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiIuY2FjaGVcXyUiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iY2FjaGVfdHJhaWwiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgImxhc3Rsb2dwb3MuJSIpOwoJCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAiZmlyc3Rsb2dsaW5lLiUiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgIjFzdGxvZ2xpbmUuJSIpOwoJCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAibGFzdGtub3ducG9zLiUiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLmJhbmR3aWR0aERhdGEiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLnVwZGF0ZV9ydW5uaW5nIik7CgkJCWRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUuIi5wZXJsdXBkYXRlX3J1bm5pbmciKTsKICAJCgkJICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGZvbnQgY29sb3I9cmVkPiIuX0xBU1RfQUNUSU9OLiI6PC9mb250Pjxicj48aT4iLl9ERUxFVEVEX0RCX1RBQkxFUy4iIDxiPickZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSc8L2I+ICIuX0FORF9TVU1NQVJJRVNfUFJPRklMRV9TQVZFRC4iPC9pPjwvZGl2PjxociBub3NoYWRlIHNpemU9MT48YnI+IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiI7CiAgICAgICAgICAgIGVjaG9XYXJuaW5nKF9TT1JSWV9OT19QRVJNSVNTSU9OUyk7CiAgICAgICAgICAgIGVjaG8gIjxQPiZuYnNwOzwvUD48L2Rpdj4iOyAKICAgICAgICB9Cgl9Cn0KaWYgKCRkZWw9PTUpIHsKCWlmICgkZWRpdHByb2ZpbGUtPnByb2ZpbGVsb2FkZWQpIHsKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhbkVkaXRQcm9maWxlcygpKSB7CgkJICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+Ii5fREVMRVRFX0RBVEVfUkFOR0VfRlJPTS4iIDxiPiRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWU8L2I+PFA+PGZvcm0gbWV0aG9kPWdldCBhY3Rpb249XCJwcm9maWxlcy5waHBcIj4iOwoJCSAgICBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kZWwgdmFsdWU9Nj4iOwoJCSAgICBEYXRlU2VsZWN0b3IoJGZyb20sJHRvKTsKCQkgICAgZWNobyAiPGlucHV0IHR5cGU9cmFkaW8gbmFtZT13aGF0IHZhbHVlPTIgY2hlY2tlZD4gIi5fREVMRVRFX0FMTF9MT0dfREFUQS4iPGJyPiI7CiAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9d2hhdCB2YWx1ZT0xPiAiLl9ERUxFVEVfT05MWV9ERVRBSUxfREFUQS4iPGJyPiI7CiAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9d2hhdCB2YWx1ZT0zPiAiLl9ERUxFVEVfT05MWV9TVU1NQVJZX0RBVEEuIjxicj4iOwoJCSAgICBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1lZGl0Y29uZiB2YWx1ZT1cIiRjdXJwcm9maWxlbmFtZVwiPiI7CgkJICAgIGVjaG8gIjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1EZWxldGU+ICAiLl9QTEVBU0VfQkVfUEFUSUVOVF9ERUxFVElOR19UQUtFU19BX1dISUxFLiI8L2Rpdj4iOwoJCSAgICBleGl0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj4iOwogICAgICAgICAgICBlY2hvV2FybmluZyhfU09SUllfTk9fUEVSTUlTU0lPTlMpOwogICAgICAgICAgICBlY2hvICI8UD4mbmJzcDs8L1A+PC9kaXY+IjsKICAgICAgICB9Cgl9Cn0KaWYgKCRkZWw9PTYpIHsKCWlmICgkZWRpdHByb2ZpbGUtPnByb2ZpbGVsb2FkZWQpIHsKCQkkd2hhdCA9ICRfUkVRVUVTVFsid2hhdCJdOwoJCWVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGZvbnQgY29sb3I9cmVkPiIuX0xBU1RfQUNUSU9OLiI6PC9mb250Pjxicj48aT4iOwogICAgICAgIERlbGV0ZVJhbmdlKCRlZGl0cHJvZmlsZSwkd2hhdCk7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgZWNobyAiPC9pPjwvZGl2PjxociBub3NoYWRlIHNpemU9MT48YnI+IjsKICAJfQp9CgppZiAoJGRlbD09NykgewoJaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuRWRpdFByb2ZpbGVzKCkpIHsgCgkJICAgICRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cGQiKTsKCQkgICAgJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3ZwbSIpOwogICAgICAgICAgICAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfZGFpbHl1cmxzIik7IAoJCSAgICAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfY29udmVyc2lvbnMiKTsKICAgICAgICAgICAgY3JlYXRlRGF0YVRhYmxlKCRlZGl0cHJvZmlsZSk7CgkJICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGZvbnQgY29sb3I9cmVkPiIuX0xBU1RfQUNUSU9OLiI6PC9mb250Pjxicj48aT4iLl9ERUxFVEVEX1NVTU1BUllfREFUQV9JTl9EQVRFX1JBTkdFLiIuICIuX1NVTU1BUklFU19XSUxMX0JFX1JFQ0FMQ1VMQVRFRC4iLjwvaT48L2Rpdj48aHIgbm9zaGFkZSBzaXplPTE+PGJyPiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj4iOwogICAgICAgICAgICBlY2hvV2FybmluZyhfU09SUllfTk9fUEVSTUlTU0lPTlMpOwogICAgICAgICAgICBlY2hvICI8UD4mbmJzcDs8L1A+PC9kaXY+IjsKICAgICAgICB9ICAgIAoJfQp9CmlmICgkZGVsPT04KSB7CglpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CgkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgImNhY2hlXF8lIik7CiAgICAgICAgZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iY2FjaGVfdHJhaWwiKTsKCQllY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxmb250IGNvbG9yPXJlZD4iLl9MQVNUX0FDVElPTi4iOjwvZm9udD48YnI+PGk+Ii5fQUxMX0NBQ0hFX0ZJTEVTX0RFTEVURUQuIi48L2k+PC9kaXY+PGhyIG5vc2hhZGUgc2l6ZT0xPjxicj4iOwoJfQp9CgppZiAoJGRlbD09OSkgeyAvLyB0aGlzIGRlbGV0ZXMgYSBzcGVjaWZpYyBmaWxlIG9yIGlwIGZyb20gdGhlIGRhdGFiYXNlCiAgICBpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgJGZsZG5hbWU9ICRfUkVRVUVTVFsiZmxkbmFtZSJdOwogICAgICAgICRmbGR2YWx1ZT0gQCRfUkVRVUVTVFsiZmxkdmFsdWUiXTsgCiAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1cImlkZW50Ym9keVwiPiIuX0RFTEVURS4iIDxmb250IGNvbG9yPXJlZD4kZmxkdmFsdWU8L2ZvbnQ+ICIuX0ZST00uIiA8Yj4kZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lPC9iPjxQPjxmb3JtIG1ldGhvZD1wb3N0IGFjdGlvbj1cInByb2ZpbGVzLnBocFwiPiI7CiAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZGVsIHZhbHVlPTEwPiI7CiAgICAgICAgRGF0ZVNlbGVjdG9yKCRmcm9tLCR0byk7CiAgICAgICAgZWNobyAiPGJyPiRmbGRuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmxkdmFsdWUgdmFsdWU9XCIkZmxkdmFsdWVcIj4gKCIuX0VYQUNUX1ZBTFVFX09OTFkuIik8cD4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWZsZG5hbWUgdmFsdWU9XCIkZmxkbmFtZVwiPiI7CiAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZWRpdGNvbmYgdmFsdWU9XCIkY3VycHJvZmlsZW5hbWVcIj4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9cmVjYWwgdmFsdWU9XCIxXCIgY2hlY2tlZD4gIi5fUkVDQUxDVUxBVEVfU1VNTUFSWV9UQUJMRVM7IAogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1EZWxldGU+ICA8L2Rpdj4iOwoKICAgICAgICBleGl0KCk7CiAgICB9Cn0KaWYgKCRkZWw9PTEwKSB7CiAgICBpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgJGZsZG5hbWU9ICRfUkVRVUVTVFsiZmxkbmFtZSJdOwogICAgICAgICRmbGR2YWx1ZT0gQCRfUkVRVUVTVFsiZmxkdmFsdWUiXTsKICAgICAgICAkcmVjYWw9IEAkX1JFUVVFU1RbInJlY2FsIl07CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgaWYgKCRmbGRuYW1lPT0icGFnZSIpIHsKICAgICAgICAgICAkcSA9IEAkZGItPkV4ZWN1dGUoInNlbGVjdCBpZCBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3VybHMgd2hlcmUgdXJsPSckZmxkdmFsdWUnIik7CiAgICAgICAgICAgJHBhZ2U9JHEtPkZldGNoUm93KCk7CiAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIGFuZCB1cmw9JyRwYWdlW2lkXSciKTsKICAgICAgICAgICAkZGItPkV4ZWN1dGUoImRlbGV0ZSBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2RhaWx5dXJscyB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIGFuZCB1cmw9JyRwYWdlW2lkXSciKTsKICAgICAgICAgICAkZGItPkV4ZWN1dGUoImRlbGV0ZSBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2NvbnZlcnNpb25zIHdoZXJlIHRpbWVzdGFtcCA+PSRmcm9tIGFuZCB0aW1lc3RhbXAgPD0kdG8gYW5kIHVybD0nJHBhZ2VbaWRdJyIpOyAgICAKICAgICAgICB9IGVsc2UgaWYgKCRmbGRuYW1lPT0iaXBudW1iZXIiKSB7CiAgICAgICAgICAgICRxID0gQCRkYi0+RXhlY3V0ZSgic2VsZWN0IGlkIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdmlzaXRvcmlkcyB3aGVyZSBpcG51bWJlcj0nJGZsZHZhbHVlJyIpOwogICAgICAgICAgICB3aGlsZSAoJHBhZ2U9JHEtPkZldGNoUm93KCkpIHsKICAgICAgICAgICAgICAgICRkYi0+RXhlY3V0ZSgiZGVsZXRlIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgd2hlcmUgdGltZXN0YW1wID49JGZyb20gYW5kIHRpbWVzdGFtcCA8PSR0byBhbmQgdmlzaXRvcmlkPSckcGFnZVtpZF0nIik7CiAgICAgICAgICAgICAgICAkZGItPkV4ZWN1dGUoImRlbGV0ZSBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2NvbnZlcnNpb25zIHdoZXJlIHRpbWVzdGFtcCA+PSRmcm9tIGFuZCB0aW1lc3RhbXAgPD0kdG8gYW5kIHZpc2l0b3JpZD0nJHBhZ2VbaWRdJyIpOyAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGZvbnQgY29sb3I9cmVkPkxhc3QgQWN0aW9uOjwvZm9udD48YnI+PGk+IjsKICAgICAgICBpZiAoJHJlY2FsPT0xKXsgCiAgICAgICAgICAgICRkYi0+RXhlY3V0ZSgiZGVsZXRlIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdnBtIHdoZXJlIHRpbWVzdGFtcCA+PSRmcm9tIGFuZCB0aW1lc3RhbXAgPD0kdG8iKTsKICAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cGQgd2hlcmUgdGltZXN0YW1wID49JGZyb20gYW5kIHRpbWVzdGFtcCA8PSR0byIpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8kZGItPkV4ZWN1dGUoImRlbGV0ZSBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3NjcmVlbnJlcyB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIik7CiAgICAgICAgICAgIC8vJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9jb2xvcmRlcHRoIHdoZXJlIHRpbWVzdGFtcCA+PSRmcm9tIGFuZCB0aW1lc3RhbXAgPD0kdG8iKTsKICAgICAgICAgICAgZWNobyAiRGVsZXRlZCAkZmxkbmFtZSAkZmxkdmFsdWUsIHdpbGwgcmVjYWxjdWxhdGUgc3VtbWFyeSB0YWJsZXMgbm93IC4uLiI7CiAgICAgICAgICAgLy9kZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lKTsKICAgICAgICAgICAKICAgICAgICAgICBlY2hvKCI8Zm9ybSBuYW1lPXByb2dyZXNzPiIuX1BST0dSRVNTLiI6PGJyPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wZXJjIHNpemU9MSB2YWx1ZT1cIjBcIiBjbGFzcz1wYmFyPiUgJm5ic3A7Iik7CiAgICAgICAgICAgZWNobygiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXByb2diYXIgc2l6ZT00NiB2YWx1ZT1cInxcIiBjbGFzcz1wcm9nYmFyPjxQPiIpOwogICAgICAgICAgIGVjaG8oX1NUQVRVUy4iOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cHRleHQgc2l6ZT04NSBjbGFzcz1wYmFyIHZhbHVlPVwic3RhcnRcIiBjbGFzcz1wcm9nYmFyPjxQPiIpOwogICAgICAgICAgIGVjaG8oIjwvZm9ybT4iKTsKICAgICAgICAgICBlY2hvICI8YnI+PGJyPiI7CiAgICAgICAgICAgLy8gZnVuY3Rpb24gZWNob0NvbnNvbGVTYWZlKCR0eHQpIHsKICAgICAgICAgICAgICAgIC8vIGVjaG8gJHR4dDsgICAKICAgICAgICAgICAvLyB9CiAgICAgICAgICAgJHByb2ZpbGUgPSBuZXcgU2l0ZVByb2ZpbGUoJGN1cnByb2ZpbGVuYW1lKTsKICAgICAgICAgICAkY29uZj0kY3VycHJvZmlsZW5hbWU7CiAgICAgICAgICAgJG9yaXN0PSRmcm9tOwogICAgICAgICAgID8+CiAgICAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgIGZ1bmN0aW9uIHBiYXIocCkgewogICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5mb3Jtcy5wcm9ncmVzcy5wZXJjLnZhbHVlPXA7CiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50LmZvcm1zLnByb2dyZXNzLnByb2diYXIudmFsdWU9c2VsZi5kb2N1bWVudC5mb3Jtcy5wcm9ncmVzcy5wcm9nYmFyLnZhbHVlKyd8JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwc3RhdHVzKHApIHsKICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuZm9ybXMucHJvZ3Jlc3MucHRleHQudmFsdWU9cDsKICAgICAgICAgICAgfQogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICBpbmNsdWRlICJ1cGRhdGVfc3VtbWFyaWVzLnBocCI7CiAgICAgICAgICAgZWNobyAiPC9kaXY+IjsKICAgICAgIAogICAgICAgfQogICAgICAgZWNobyBfSUZfWU9VX1dBTlRfVE9fS0VFUC4iIDxiPiRmbGR2YWx1ZTwvYj4gIi5fT1VUX09GX0ZVVFVSRV9TVEFUUy4iICI7CiAgICAgICBpZiAoJGZsZG5hbWU9PSJwYWdlIikgewogICAgICAgICAgICBlY2hvIF9TS0lQX0ZJTEVTLiIgIjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gX1NLSVBfSVBfTlVNQkVSUy4iICI7ICAKICAgICAgIH0KICAgICAgIGVjaG8gX0ZJRUxEX09OX1RIRV9EQVRBX0NPTExFQ1RJT05fVEFCX0lOX1lPVVIuIiAkY3VycHJvZmlsZW5hbWUgIi5fUFJPRklMRV9TRVRUSU5HUy4iLjwvaT48L2Rpdj48aHIgbm9zaGFkZSBzaXplPTE+PGJyPiI7ICAgCiAgICAgIH0KfQoKaWYgKCRkZWw9PTExKSB7IC8vIHRoaXMganVzdCBkb2VzIHVwZGF0ZV9zdW1tYXJpZXMgd2l0aG91dCBhZGRpbmcgYW55IG5ldyB0cmFmZmljIGZyb20gdGhlIGxvZyBmaWxlcwogICAgaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgCiAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj48Zm9udCBjb2xvcj1yZWQ+Ii5fTEFTVF9BQ1RJT04uIjo8L2ZvbnQ+PGJyPiI7IAogICAgICAgICAgICAKICAgICAgICAgICBlY2hvICI8aT4iLl9VUERBVEVfU1VNTUFSSUVTX1dPVVRfQ0hFQ0tJTkdfTkVXX0RBVEEuIi4uLjwvaT4iOwogICAgICAgICAgIAogICAgICAgICAgIGVjaG8oIjxmb3JtIG5hbWU9cHJvZ3Jlc3M+Ii5fUFJPR1JFU1MuIjo8YnI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBlcmMgc2l6ZT0xIHZhbHVlPVwiMFwiIGNsYXNzPXBiYXI+JSAmbmJzcDsiKTsKICAgICAgICAgICBlY2hvKCI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cHJvZ2JhciBzaXplPTQ2IHZhbHVlPVwifFwiIGNsYXNzPXByb2diYXI+PFA+Iik7CiAgICAgICAgICAgZWNobyhfU1RBVFVTLiI6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1wdGV4dCBzaXplPTg1IGNsYXNzPXBiYXIgdmFsdWU9XCJzdGFydFwiIGNsYXNzPXByb2diYXI+PFA+Iik7CiAgICAgICAgICAgZWNobygiPC9mb3JtPiIpOwogICAgICAgICAgIGVjaG8gIjxicj48YnI+IjsKICAgICAgICAgICAvLyBmdW5jdGlvbiBlY2hvQ29uc29sZVNhZmUoJHR4dCkgewogICAgICAgICAgICAgICAgLy8gZWNobyAkdHh0OyAgIAogICAgICAgICAgIC8vIH0KICAgICAgICAgICAkcHJvZmlsZSA9IG5ldyBTaXRlUHJvZmlsZSgkY3VycHJvZmlsZW5hbWUpOwogICAgICAgICAgICRjb25mPSRjdXJwcm9maWxlbmFtZTsKICAgICAgICAgICAvLyRvcmlzdD0kZnJvbTsKICAgICAgICAgICA/PgogICAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICBmdW5jdGlvbiBwYmFyKHApIHsKICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuZm9ybXMucHJvZ3Jlc3MucGVyYy52YWx1ZT1wOwogICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5mb3Jtcy5wcm9ncmVzcy5wcm9nYmFyLnZhbHVlPXNlbGYuZG9jdW1lbnQuZm9ybXMucHJvZ3Jlc3MucHJvZ2Jhci52YWx1ZSsnfCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHN0YXR1cyhwKSB7CiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50LmZvcm1zLnByb2dyZXNzLnB0ZXh0LnZhbHVlPXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgaW5jbHVkZSAidXBkYXRlX3N1bW1hcmllcy5waHAiOwogICAgICB9Cn0KCmlmICgkdXBkYXRlX2NvdW50cmllcz09MSkgewogICAgaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpKSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGgzPlVwZGF0ZSBHZW9ncmFwaGljIExvY2F0aW9uIGluZm9ybWF0aW9uIGZvciAnJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSc8L2gzPiI7CiAgICAgICAgICAgIGVjaG8gIjxwPllvdSBjYW4gdXNlIHRoaXMgdG9vbCBpZiB5b3UgaGF2ZSB1cGRhdGVkIChvciBqdXN0IGluc3RhbGxlZCkgdGhlIEdlbyBMb2NhdGlvbiBkYXRhYmFzZSBhbmQgd2FudCB0byB1cGRhdGUgY291bnRyeSBpbmZvcm1hdGlvbiBvbiByZWNvcmRzIGFscmVhZHkgc3RvcmVkIGluIHlvdXIgTG9nYWhvbGljIGRhdGFiYXNlIGZvciB0aGlzIHByb2ZpbGUuPC9wPiI7CiAgICAgICAgICAgIGVjaG8gIjxQPlRoZSBkYXRlIHJhbmdlIHdpbGwgYWZmZWN0IHdoaWNoIHZpc2l0b3JzIGFyZSBjaGVja2VkIChvbmx5IHZpc2l0b3JpZCdzIDxlbT5maXJzdCBjcmVhdGVkPC9lbT4gd2l0aGluIHRoZSBkYXRlIHJhbmdlKSBhbmQgd2hpY2ggcmVjb3JkcyB3aWxsIGJlIHVwZGF0ZWQgKG9ubHkgaGl0cyB3aXRoaW4gdGhlIGRhdGUgcmFuZ2UpLjwvUD4iOwogICAgICAgICAgICBlY2hvICI8cD48Yj5TZWxlY3QgdGhlIGRhdGUgcmFuZ2UgeW91IHdhbnQgdG8gdXBkYXRlIGdlb2dyYXBoaWMgaW5mb3JtYXRpb24gZm9yOjwvYj48L3A+IjsKICAgICAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPWdldCBhY3Rpb249XCJwcm9maWxlcy5waHBcIj4iOwogICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cInVwZGF0ZV9jb3VudHJpZXNcIiB2YWx1ZT0yPiI7CiAgICAgICAgICAgICRkYXRlcmFuZ2UgPSBHZXRNYXhEYXRlUmFuZ2UoJGVkaXRwcm9maWxlKTsKICAgICAgICAgICAgRGF0ZVNlbGVjdG9yKCRkYXRlcmFuZ2VbJ2Zyb20nXSwkZGF0ZXJhbmdlWyd0byddKTsKICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZWRpdGNvbmYgdmFsdWU9XCIkY3VycHJvZmlsZW5hbWVcIj4iOwogICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCIiLl9VUERBVEVfTk9XLiJcIiBzdHlsZT1cIm1hcmdpbi10b3A6NXB4O2ZvbnQtc2l6ZToxNHB4O1wiPiI7CiAgICAgICAgICAgIGVjaG8gIjwvZGl2PjwvYm9keT48L2h0bWw+IjsKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKICAgICAgICAgICAgZWNob1dhcm5pbmcoX1NPUlJZX05PX1BFUk1JU1NJT05TKTsKICAgICAgICAgICAgZWNobyAiPFA+Jm5ic3A7PC9QPjwvZGl2PiI7CiAgICAgICAgfQogICAgfSAgICAgICAgCn0KaWYgKCR1cGRhdGVfY291bnRyaWVzPT0yKSB7CiAgICBpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5VcGRhdGVMb2dzKCkpIHsKICAgICAgICAgICAgJHByb2ZpbGU9JGVkaXRwcm9maWxlOwogICAgICAgICAgICBpbmNsdWRlICJpbmNsdWRlcy91cGRhdGVfY291bnRyaWVzLnBocCI7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKICAgICAgICAgICAgJHVjID0gbmV3IFVwZGF0ZUNvdW50cmllcygpOwogICAgICAgICAgICAkdWMtPkRpc3BsYXlQcm9ncmVzcygpOwogICAgICAgICAgICAkdWMtPlVwZGF0ZVJhbmdlKCRmcm9tLCR0byk7CiAgICAgICAgICAgIGVjaG8gIjwvZGl2PjwvYm9keT48L2h0bWw+IjsKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKICAgICAgICAgICAgZWNob1dhcm5pbmcoX1NPUlJZX05PX1BFUk1JU1NJT05TKTsKICAgICAgICAgICAgZWNobyAiPFA+Jm5ic3A7PC9QPjwvZGl2PiI7CiAgICAgICAgfQogICAgfSAgICAgICAgCn0KCgppZiAoIWlzc2V0KCRiYWNrdXApKSB7CgkkYmFja3VwPTA7IAp9CmlmICgkYmFja3VwPT0xKSB7CgllY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxiPiIuX0JBQ0tVUF9FWFBPUlRfREFURV9SQU5HRV9GUk9NLiIgPGZvbnQgY29sb3I9cmVkPiRjdXJwcm9maWxlbmFtZTwvZm9udD48L2I+PFA+IjsKCWVjaG8gIjxmb3JtIG1ldGhvZD1nZXQgYWN0aW9uPVwicHJvZmlsZXMucGhwXCI+IjsKCWVjaG8gIjx0YWJsZSB3aWR0aD00NTAgY2xhc3M9c21hbGxib3JkZXI+PHRyPjx0ZCBjbGFzcz1zbWFsbD4iLl9ZT1VfQ0FOX0VYUE9SVF9EQVRBX0ZST01fVEFCTEUuIiAoJGVkaXRwcm9maWxlLT50YWJsZW5hbWUpICIuX0lOX09SREVSX1RPX0JBQ0tVUC4iPC90ZD48L3RyPjwvdGFibGU+PFA+IjsKCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWJhY2t1cCB2YWx1ZT0yPiI7CglEYXRlU2VsZWN0b3IoJGZyb20sJHRvKTsKCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWVkaXRjb25mIHZhbHVlPVwiJGN1cnByb2ZpbGVuYW1lXCI+IjsKICAgIGVjaG8gIjxQPiIuX0ZJTEVfRk9STUFULiI6IDxzZWxlY3QgbmFtZT1cIm1vZGVcIj48b3B0aW9uIHZhbHVlPVwibG9nZmlsZVwiIHNlbGVjdGVkPiAiLl9BUEFDSEVfQ09NQklORURfTE9HX0ZJTEVfRk9STUFULiIgPG9wdGlvbiB2YWx1ZT1cImNzdlwiPiAiLl9DU1ZfRk9STUFULiI8L3NlbGVjdD48L3A+IjsgCgllY2hvICI8UD48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJEb3dubG9hZCBCYWNrdXAgRmlsZVwiPjwvZGl2PiI7CiAgICBlY2hvICI8L2JvZHk+PC9odG1sPiI7CglleGl0KCk7Cn0KCmlmIChpc3NldCgkX1JFUVVFU1RbImdsb2JhbHN0YXRzIl0pPT0ieWVzIikgeyAKICAgIGVjaG8gIjxkaXYgY2xhc3M9J2luZGVudGJvZHknPiZuYnNwOzxicj4iOwogICAgaW5jbHVkZSAiaW5jbHVkZXMvZ2xvYmFsc3RhdHMucGhwIjsgICAgCiAgICBlY2hvICI8L2Rpdj48L2JvZHk+PC9odG1sPiI7CiAgICBleGl0KCk7Cn0KaWYoaXNzZXQoJHJlc3RvcmVEZWZhdWx0RGFzaGJvYXJkKSl7CgkkZWRpdHByb2ZpbGUtPnNldERlZmF1bHREYXNoYm9hcmQoKTsKCWVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKCWVjaG8gX1lPVVJfREVGQVVMVF9EQVNIQk9BUkRfSEFTX0JFRU5fUkVTVE9SRUQ7CgllY2hvICI8L2Rpdj4iOwp9CmlmKGlzc2V0KCR1cGRhdGVfbWV0aG9kKSkgewoJaWYoaXNzZXQoJHNldF91cGRhdGVfcHJlZmVyZW5jZSkpIHsKCQlpZigkc2V0X3VwZGF0ZV9wcmVmZXJlbmNlID09ICdwZXJsJykgewoJCQkkc2V0X3VwZGF0ZV9wcmVmZXJlbmNlID0gJ3BlcmwnOwoJCX0gZWxzZSB7CgkJCSRzZXRfdXBkYXRlX3ByZWZlcmVuY2UgPSAncmVndWxhcic7CgkJfQoJCXNldFByb2ZpbGVEYXRhKCRwcm9maWxlLT5wcm9maWxlbmFtZSwgInskcHJvZmlsZS0+cHJvZmlsZW5hbWV9LnVwZGF0ZVByZWZlcmVuY2UiLCAkc2V0X3VwZGF0ZV9wcmVmZXJlbmNlKTsKCQkkZGItPlF1ZXJ5KCJERUxFVEUgZnJvbSAiLlRCTF9HTE9CQUxfU0VUVElOR1MuIiBXSEVSRSBgTmFtZWAgPSAnY2FuRG9QZXJsVXBkYXRlJyIpOwoJCQoJCWVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+Ii5zdHJfcmVwbGFjZSgiJXMiLCAkc2V0X3VwZGF0ZV9wcmVmZXJlbmNlLCBfVVBEQVRFX01FVEhPRF9IQVNfQkVFTl9TRVRfVE8pLiI8L2Rpdj4iOwoJfSBlbHNlIHsKCQlpbmNsdWRlX29uY2UoImNvbXBvbmVudHMvaW1wb3J0L2ltcG9ydC5waHAiKTsKCQkkaW1wb3J0Q2xhc3MgPSBuZXcgSW1wb3J0KCk7CgkJCgkJZWNobyAiPGRpdiBzdHlsZT0nbWFyZ2luOiAwIDAgMCAzNXB4OyB3aWR0aDogNDAwcHg7Jz4iOwoJCS8vICRwZXJsY2hlY2sgPSAkaW1wb3J0Q2xhc3MtPmF2YWlsYWJsZUNoZWNrKHRydWUpOwoJCSRwZXJsYWJsZSA9ICRpbXBvcnRDbGFzcy0+YXZhaWxhYmxlQ2hlY2soKTsKCQkKCQlpZigkcGVybGFibGVbJ2hhc0Vycm9yJ10gPT0gdHJ1ZSkgewoJCQkvLyBlY2hvICJZb3UgY2FuJ3QgdXBkYXRlIHlvdXIgc3RhdGlzdGljcyB3aXRoIFBlcmwuPGJyLz5Gb2xsb3cgdGhlIDxhIGhyZWY9J2h0dHA6Ly93d3cubG9nYWhvbGljLmNvbS9tYW51YWwvTG9nYWhvbGljTWFudWFsL01ha2luZ0xvZ2Fob2xpY1JlYWR5Rm9yUGVybFVwZGF0ZXMnPmluc3RydWN0aW9uczwvYT4gaW4gdGhlIExvZ2Fob2xpYyBNYW51YWwgaWYgeW91IGRlc2lyZSB0aGUgUGVybCBtZXRob2QuIjsKCQkJZWNobyAiPGgzPiIuX1lPVVJfTUFDSElORV9JU19OT1RfQUJMRV9UT19VU0VfUEVSTC4iPC9oMz4iOwoJCQkKCQkJdW5zZXQoJHBlcmxhYmxlWydoYXNFcnJvciddKTsKCQkJCgkJCWZvcmVhY2goJHBlcmxhYmxlIGFzICRrZXkgPT4gJHBlcmx0ZXN0KSB7CgkJCQllY2hvICRwZXJsdGVzdC4iPGJyLz4iOwoJCQl9CgkJCQoJCQllY2hvICI8cD4iLnN0cl9yZXBsYWNlKCIlcyIsICI8YSBocmVmPSdodHRwOi8vd3d3LmxvZ2Fob2xpYy5jb20vbWFudWFsL0xvZ2Fob2xpY01hbnVhbC9VcGRhdGVMb2dhaG9saWNTdGF0c1VzaW5nUGVybCcgdGFyZ2V0PSdfYmxhbmsnPnR1dG9yaWFsPC9hPiIsIF9WSVNJVF9QRVJMX0lOU1RBTExfVFVUT1JJQUwpLiI8L3A+PGJyLz4iOwoJCQllY2hvICI8YSBzdHlsZT0nYmFja2dyb3VuZDogbm9uZSByZXBlYXQgc2Nyb2xsIDAgMCAjMTk3MEI0OyBib3JkZXItcmFkaXVzOiA0cHggNHB4IDRweCA0cHg7IGNvbG9yOiAjRkZGRkZGOyBwYWRkaW5nOiA1cHggMTBweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOycgaHJlZj0neyRfU0VSVkVSWydSRVFVRVNUX1VSSSddfSc+Q2hlY2sgYWdhaW48L2E+IjsKCQl9IGVsc2UgewoJCQllY2hvICI8aDM+Ii5fU0VUX1lPVVJfVVBEQVRFX01FVEhPRF9QUkVGRVJFTkNFLiI8L2gzPiI7CgkJCWVjaG8gIjxwIHN0eWxlPSdtYXJnaW4tYm90dG9tOiAyNHB4Oyc+IjsKCQkJCWVjaG8gX1dPVUxEX1lPVV9MSUtFX1RPX1RSWV9QRVJMX1VQREFURS4iPGJyLz4iOwoJCQllY2hvICI8L3A+IjsKCQkJZWNobyAiPGEgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7IGJvcmRlci1yYWRpdXM6IDRweCA0cHggNHB4IDRweDsgY29sb3I6ICNGRkZGRkY7IHBhZGRpbmc6IDVweCAxMHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7JyBocmVmPSdwcm9maWxlcy5waHA/Y29uZj17JGN1cnByb2ZpbGVuYW1lfSZ1cGRhdGVfbWV0aG9kPTEmc2V0X3VwZGF0ZV9wcmVmZXJlbmNlPXJlZ3VsYXInPiIuX05PX1VTRV9SRUdVTEFSX1VQREFURS4iPC9hPiI7CgkJCWVjaG8gIjxhIHN0eWxlPSdtYXJnaW4tbGVmdDogMjVweDsgYmFja2dyb3VuZDogbm9uZSByZXBlYXQgc2Nyb2xsIDAgMCAjMTk3MEI0OyBib3JkZXItcmFkaXVzOiA0cHggNHB4IDRweCA0cHg7IGNvbG9yOiAjRkZGRkZGOyBwYWRkaW5nOiA1cHggMTBweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOycgaHJlZj0ncHJvZmlsZXMucGhwP2NvbmY9eyRjdXJwcm9maWxlbmFtZX0mdXBkYXRlX21ldGhvZD0xJnNldF91cGRhdGVfcHJlZmVyZW5jZT1wZXJsJz4iLl9ZRVNfVVNFX1BFUkxfVVBEQVRFLiI8L2E+IjsKCQl9CgkJZWNobyAiPC9kaXY+IjsKCQlleGl0OwoJfQp9CgppZiAoIWlzc2V0KCRlZGl0KSAmJiAoIWlzc2V0KCRuZXcpKSkgewoJIAogICAgLy8gbGlzdCBhbGwgcHJvZmlsZXMKCQogICAgIGlmICgkc2F2ZWQhPSIiKSB7CgkJCWVjaG8gIjxwIGNsYXNzPVwiaW5kZW50Ym9keVwiPjxmb250IGNvbG9yPXJlZD4iLl9MQVNUX0FDVElPTi4iOjwvZm9udD48YnI+PGk+PGI+JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTwvYj4gIi4kc2F2ZWQuIjwvaT48L3A+PGhyIG5vc2hhZGUgc2l6ZT0xPjxicj4iOwoJIH0KCSA/PgoJIDxkaXYgY2xhc3M9aW5kZW50Ym9keT4KICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICBmdW5jdGlvbiBwcm93T3ZlckVmZmVjdChvYmplY3QpIHsKCSAgICBpZiAob2JqZWN0LmNsYXNzTmFtZSA9PSAncHJvZmlsZXJvdycpIG9iamVjdC5jbGFzc05hbWUgPSAncHJvZmlsZXJvd2hpZ2hsaWdodCc7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvd091dEVmZmVjdChvYmplY3QpIHsKCSAgICBpZiAob2JqZWN0LmNsYXNzTmFtZSA9PSAncHJvZmlsZXJvd2hpZ2hsaWdodCcpIG9iamVjdC5jbGFzc05hbWUgPSAncHJvZmlsZXJvdyc7CiAgICB9CiAgICA8L3NjcmlwdD4KICAgIDw/cGhwCiAgICAgICAgCiAgICAvLyBzZWUgaG93IG1hbnkgcHJvZmlsZXMgdGhlcmUgYXJlIGluIHRvdGFsLCBpZiBpdCdzIG1vcmUgdGhhbiA1IHByaW50IGEgU0VBUkNIIEJPWAogICAgJHF1ZXJ5ID0gIlNlbGVjdCBjb3VudCgqKSBmcm9tICIuVEJMX1BST0ZJTEVTLiI7IjsKICAgICRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KSBvciBkaWUoX0NPVUxETlRfUVVFUllfUFJPRklMRVMuIiAiIC4gJGRiLT5FcnJvck1zZygpKTsKICAgICRyZXN1bHQgPSAkcmVzdWx0LT5GZXRjaFJvdygpOyAKICAgICRudW1wcm9maWxlcz0kcmVzdWx0WzBdOwoJCglpZiAoKCR2YWxpZFVzZXJSZXF1aXJlZCkgJiYgKCEkc2Vzc2lvbi0+aXNBZG1pbigpKSkgewoJCSRxdWVyeSA9ICJTRUxFQ1QgQ09VTlQoKikgRlJPTSAiLlRCTF9QUk9GSUxFUy4iIFdIRVJFIHByb2ZpbGVuYW1lIElOIChcInskdmFsaWRwcm9maWxlc31cIikiOwoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KSBvciBkaWUoX0NPVUxETlRfUVVFUllfUFJPRklMRVMuIiAiIC4gJGRiLT5FcnJvck1zZygpKTsKCQkkYW1vdW50T2ZSaWdodGZ1bFByb2ZpbGVzID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkkYW1vdW50T2ZSaWdodGZ1bFByb2ZpbGVzID0gJGFtb3VudE9mUmlnaHRmdWxQcm9maWxlc1swXTsKCX0gZWxzZSB7CgkJJGFtb3VudE9mUmlnaHRmdWxQcm9maWxlcyA9ICRudW1wcm9maWxlczsKCX0KCQogICAgaWYgKCRhbW91bnRPZlJpZ2h0ZnVsUHJvZmlsZXMgPiA1KSB7CiAgICAgICAgLy8gaWYgKCgkdmFsaWRVc2VyUmVxdWlyZWQpICYmICghJHNlc3Npb24tPmlzQWRtaW4oKSkpIHsKICAgICAgICAgICAgLy8geW91IGhhdmUgdG8gYmUgYWRtaW4gdG8gc2VlIHRoZSBzZWFyY2ggYm94CiAgICAgICAgLy8gfSBlbHNlIHsgICAgICAgICAgICAgCiAgICAgICAgPz4KICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJwcm9maWxlcy5waHA8P3BocCBlY2hvICFlbXB0eSgkX0dFVFsnbnVtX3BwJ10pID8gIj9udW1fcHA9eyRfR0VUWydudW1fcHAnXX0iIDogIiI7ID8+Ij4KICAgICAgICAgIFNlYXJjaCBwcm9maWxlcyBtYXRjaGluZzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNlYXJjaCIgdmFsdWU9Ijw/cGhwIGVjaG8gQCRzZWFyY2g7ID8+Ij4gCiAgICAgICAgICBpbiBmaWVsZDogCiAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ic2ZpZWxkIj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InByb2ZpbGVuYW1lIiA8P3BocCBpZiAoQCRzZmllbGQ9PSJwcm9maWxlbmFtZSIpIHsgZWNobyAic2VsZWN0ZWQiOyB9ID8+PiA8P3BocCBlY2hvIF9QUk9GSUxFX05BTUU7Pz4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImNvbmZkb21haW4iIDw/cGhwIGlmIChAJHNmaWVsZD09ImNvbmZkb21haW4iKSB7IGVjaG8gInNlbGVjdGVkIjsgfSA/Pj4gPD9waHAgZWNobyBfRE9NQUlOX05BTUU7Pz4KICAgICAgICAgICAgPC9zZWxlY3Q+ICAgICAKICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCI+ICAgIAogICAgICAgICAgPC9mb3JtPgogICAgICAgICAgPGJyPgogICAgICAgICAgPD9waHAKICAgICAgICAvLyB9CiAgICB9CiAgICAKICAgIGVjaG8gIjxkaXYgc3R5bGU9XCJ3aWR0aDo2MDBweDtcIj4iOwogICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgJHNlc3Npb24tPmlzQWRtaW4oKSB8fCAkc2Vzc2lvbi0+Y2FuQWRkUHJvZmlsZXMoKSkgewogICAgICAgIGVjaG8gIjxkaXYgc3R5bGU9XCJmbG9hdDpsZWZ0O2xpbmUtaGVpZ2h0OjE2cHg7cGFkZGluZy1yaWdodDoyMHB4O21hcmdpbi1ib3R0b206NnB4O1wiPiI7CiAgICAgICAgaWYgKCghZGVmaW5lZCgiX0xJTUlUX1BST0ZJTEVTIikpIHx8IChfTElNSVRfUFJPRklMRVMgPT0gMCkpIHsKICAgICAgICAgICAgZWNobyAiPGltZyBzcmM9XCJpbWFnZXMvaWNvbnMvYWRkX3Byb2ZpbGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiTmV3XCI+IDxhIGhyZWY9XCJwcm9maWxlcy5waHA/Y29uZj1uZXdjbmYmYW1wO25ldz0xXCI+Ii5fQ1JFQVRFX05FV19QUk9GSUxFLiI8L2E+IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJG51bXByb2ZpbGVzID49IF9MSU1JVF9QUk9GSUxFUykgewogICAgICAgICAgICAgICAgZWNobyAiPGltZyBzcmM9XCJpbWFnZXMvaWNvbnMvYWRkX3Byb2ZpbGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiVXBncmFkZVwiPiAiLl9UT09fTUFOWV9QUk9GSUxFU19QTEVBU0VfVVBHUkFERS4iIjsgICAgICAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2FkZF9wcm9maWxlLmdpZlwiIHdpZHRoPTE2IGhlaWdodD0xNiBhbGlnbj1sZWZ0IGFsdD1cIk5ld1wiPiA8YSBocmVmPVwicHJvZmlsZXMucGhwP2NvbmY9bmV3Y25mJmFtcDtuZXc9MVwiPiIuX0NSRUFURV9ORVdfUFJPRklMRS4iPC9hPiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWNobyAiPC9kaXY+IjsgICAgICAgICAgCiAgICB9CiAgICAKCWlmKCRhbW91bnRPZlJpZ2h0ZnVsUHJvZmlsZXMgPiAxKSB7CgkJZWNobyAiPGRpdiBzdHlsZT1cImZsb2F0OmxlZnQ7bGluZS1oZWlnaHQ6MTZweDttYXJnaW4tYm90dG9tOjZweDtcIj48aW1nIHNyYz1cImltYWdlcy9pY29ucy9waWUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiTmV3XCI+IDxhIGhyZWY9XCJwcm9maWxlcy5waHA/Z2xvYmFsc3RhdHM9eWVzXCI+Ii5fR0xPQkFMX1NUQVRJU1RJQ1NfT1ZFUlZJRVcuIjwvYT48L2Rpdj4iOwoJfQogICAgZWNobyAiPC9kaXY+IjsgCgkKCT8+CiAgICAKICAgIDx0YWJsZSBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTAgYm9yZGVyPTAgc3R5bGU9Im1pbi13aWR0aDo2MDBweDtjbGVhcjpib3RoOyI+CgkJPHRyPjx0ZCBjb2xzcGFuPTUgIGNsYXNzPXRvcGxpbmVibHVlIGJnY29sb3I9IiNCQkRERkYiPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvcHJvZmlsZXMuZ2lmIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9Ijw/cGhwIGVjaG8gX01BTkFHRV9QUk9GSUxFUzs/PiI+ICZuYnNwOyZuYnNwOzxmb250IHNpemU9Mz48Yj48P3BocCBlY2hvIF9NQU5BR0VfUFJPRklMRVM7Pz48L2I+PC9mb250PjwvdGQ+PC90cj4KCTw/cGhwICAgICAgIAogICAgCiAgICAkcXVlcnkgPSAiU2VsZWN0IHByb2ZpbGVuYW1lLHRhYmxlbmFtZSxwcm9maWxlaWQgZnJvbSAiLlRCTF9QUk9GSUxFUzsKCQoJLy8gSWYgd2UncmUgbGltaXRpbmcgdGhlIHZpc2libGUgcHJvZmlsZXMsIHRoZW4gcHV0IGEgZmlsdGVyIG9uIHRvIG9ubHkgcHVsbCB0aG9zZSByZWNvcmRzLgoJaWYgKCgkdmFsaWRVc2VyUmVxdWlyZWQpICYmICghJHNlc3Npb24tPmlzQWRtaW4oKSkpIHsKCQkvLyBDYW4ndCB1c2UgaW1wbG9kZSBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBlc2NhcGUgdGhlIGVudHJpZXMuCgkJJHZhbGlkcHJvZmlsZXMgPSAiIjsKCQlmb3IgKCRpID0gY291bnQoJHNlc3Npb24tPnVzZXJfcHJvZmlsZXMpLTE7ICRpID49IDA7ICRpLS0pIHsKCQkJaWYgKCR2YWxpZHByb2ZpbGVzICE9ICIiKSB7ICR2YWxpZHByb2ZpbGVzIC49ICJcIixcIiI7IH0KCQkJJHZhbGlkcHJvZmlsZXMgLj0gJGRiLT5lc2NhcGUoJHNlc3Npb24tPnVzZXJfcHJvZmlsZXNbJGldKTsKCQl9CgkJJHF1ZXJ5IC49ICIgd2hlcmUgcHJvZmlsZW5hbWUgaW4gKFwiJHZhbGlkcHJvZmlsZXNcIikiOwoJfQoJaWYgKEAkc2VhcmNoKSB7CgkJaWYoc3RycG9zKCRxdWVyeSwgJ3doZXJlJykgIT09IGZhbHNlKSB7CgkJCSRxdWVyeSAuPSAiIEFORCAkc2ZpZWxkIExJS0UgJyUkc2VhcmNoJSciOwoJCX0gZWxzZSB7CgkJCSRxdWVyeSAuPSAiIFdIRVJFICRzZmllbGQgTElLRSAnJSRzZWFyY2glJyI7CgkJfQogICAgfQogICAgCiAgICAkcXVlcnkuPSIgb3JkZXIgYnkgcHJvZmlsZW5hbWUiOwoJJGl0ZW1zX3Blcl9wYWdlID0gNTA7CiAgICBpZiAoZGVmaW5lZCgiX0xJTUlUX1BST0ZJTEVTIikgIT0gMCkgewogICAgICAkcXVlcnkuPSIgbGltaXQgMCwiLl9MSU1JVF9QUk9GSUxFUzsKCSAgJG51bV9vZl9pdGVtcyA9IF9MSU1JVF9QUk9GSUxFUzsKICAgIH0gZWxzZSB7CgkJLyogUGFnaW5hdGlvbiBjb25maWcgc3RhcnRzIGhlcmUgKi8KCQkkbnVtX29mX2l0ZW1zID0gMDsgIyBUaGUgdG90YWwgYW1vdW50IG9mIGl0ZW1zCgkJJG1heF9saW5rcyA9IDU7ICMgVGhlIGFtb3VudCBvZiBwYWdlIG51bWJlcnMgdG8gc2hvdwoJCQoJCSRjb3VudF9xdWVyeSA9ICJTRUxFQ1QgQ09VTlQoKikgQVMgYG1heF9wcm9maWxlc2AgRlJPTSAiLlRCTF9QUk9GSUxFUzsKCQlpZiAoKCR2YWxpZFVzZXJSZXF1aXJlZCkgJiYgKCEkc2Vzc2lvbi0+aXNBZG1pbigpKSkgewoJCQkvLyBDYW4ndCB1c2UgaW1wbG9kZSBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBlc2NhcGUgdGhlIGVudHJpZXMuCgkJCSR2YWxpZHByb2ZpbGVzID0gIiI7CgkJCWZvciAoJGkgPSBjb3VudCgkc2Vzc2lvbi0+dXNlcl9wcm9maWxlcyktMTsgJGkgPj0gMDsgJGktLSkgewoJCQkJaWYgKCR2YWxpZHByb2ZpbGVzICE9ICIiKSB7ICR2YWxpZHByb2ZpbGVzIC49ICJcIixcIiI7IH0KCQkJCSR2YWxpZHByb2ZpbGVzIC49ICRkYi0+ZXNjYXBlKCRzZXNzaW9uLT51c2VyX3Byb2ZpbGVzWyRpXSk7CgkJCX0KCQkJJGNvdW50X3F1ZXJ5IC49ICIgV0hFUkUgcHJvZmlsZW5hbWUgSU4gKFwieyR2YWxpZHByb2ZpbGVzfVwiKSI7CgkJfQoJCSRhbW91bnRfcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRjb3VudF9xdWVyeSk7CgkJCgkJJG51bV9vZl9pdGVtcyA9ICRhbW91bnRfcmVzdWx0LT5GZXRjaFJvdygpOwoJCSRudW1fb2ZfaXRlbXMgPSAkbnVtX29mX2l0ZW1zWydtYXhfcHJvZmlsZXMnXTsKCgkJaWYoIWVtcHR5KCRfR0VUWydudW1fcHAnXSkpIHsKCQkJaWYoJF9HRVRbJ251bV9wcCddID09ICdBbGwnKSB7CgkJCQkkaXRlbXNfcGVyX3BhZ2UgPSAkbnVtX29mX2l0ZW1zOwoJCQl9IGVsc2UgewoJCQkJJGl0ZW1zX3Blcl9wYWdlID0gJF9HRVRbJ251bV9wcCddOwoJCQl9CgkJfQkJCgkJaWYoIWVtcHR5KCRfR0VUWydwYWdlX251bSddKSkgewoJCQkkcGFnZV9udW0gPSAkX0dFVFsncGFnZV9udW0nXTsKCQl9IGVsc2UgewoJCQkkcGFnZV9udW0gPSAxOwoJCX0KCQkKCQkkcXVlcnkgLj0gIiBMSU1JVCAiLmZsb29yKCgkcGFnZV9udW0gLSAxKSAqICRpdGVtc19wZXJfcGFnZSkuIiwgIi4kaXRlbXNfcGVyX3BhZ2U7CgkJLyogUGFnaW5hdGlvbiBjb25maWcgZW5kcyBoZXJlICovCgl9CgkKCQoJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnkpIG9yIGRpZShfQ09VTEROVF9RVUVSWV9QUk9GSUxFUy4iICIgLiAkZGItPkVycm9yTXNnKCkpOwogICAgaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMCkgewoJCWVjaG8gIjx0cj48dGQgY29sc3Bhbj01IGNsYXNzPVwicHJvZmlsZXJvd1wiPiIuX1lPVV9IQVZFX05PX0FDVElWRV9QUk9GSUxFUy4iLjwvdGQ+PC90cj4iOwoJfSBlbHNlIHsKCQl3aGlsZSAoJHByb2ZpbGVfcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkgewoJCQkkcHJvZmlsZW5hbWUgPSAkcHJvZmlsZV9yb3dbMF07CiAgICAgICAgICAgICRwcm9maWxlX3RhYmxlbmFtZSA9ICRwcm9maWxlX3Jvd1sxXTsKCQkJaWYgKCRjb25mPT0kcHJvZmlsZW5hbWUgfHwgJGVkaXRjb25mPT0kcHJvZmlsZW5hbWUpIHsKCQkJCSRzZWw9IiA8Zm9udCBjb2xvcj1yZWQ+KCIuX0FDVElWRS4iKTwvZm9udD4iOwoJCQkJJGJnYz0iYmdjb2xvcj0jQ0NGRkNDIjsKCQkJCSRjbGFzcz0iIjsKCQkJfSBlbHNlIHsKCQkJCSRzZWw9IiI7CgkJCQkkYmdjPSIiOwoJCQkJJGNsYXNzPSJvbm1vdXNlb3Zlcj1cInByb3dPdmVyRWZmZWN0KHRoaXMpXCIgb25tb3VzZW91dD1cInByb3dPdXRFZmZlY3QodGhpcylcIiI7CgkJCX0KCQkJZWNobyAiPHRyIGNsYXNzPVwicHJvZmlsZXJvd1wiICRjbGFzcz48dGQgJGJnYyBzdHlsZT1cImZvbnQtc2l6ZToxM3B4O1wiIGNsYXNzPVwiZG90bGluZTJcIiB0aXRsZT1cInskcHJvZmlsZV9yb3dbMl19XCI+PGI+JHByb2ZpbGVuYW1lPC9iPiAkc2VsPC90ZD48dGQgJGJnYyBzdHlsZT1cImZvbnQtc2l6ZToxM3B4O1wiIGNsYXNzPWRvdGxpbmUyPjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2RhdGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiIi5fVklFV19TVEFUUy4iXCI+IDxhIGhyZWY9XCJpbmRleC5waHA/Y29uZj0kcHJvZmlsZW5hbWVcIj4iLl9WSUVXX1NUQVRTLiI8L2E+PC90ZD4iOwoJCQlpZiAoKCEkdmFsaWRVc2VyUmVxdWlyZWQpIHx8ICgkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpKSkgewogICAgICAgICAgICAgICAgZWNobyAiPHRkICRiZ2MgY2xhc3M9ZG90bGluZTI+PGltZyBzcmM9XCJpbWFnZXMvaWNvbnMvdXBkYXRlLmdpZlwiIHdpZHRoPTE2IGhlaWdodD0xNiBhbGlnbj1sZWZ0IGFsdD1cIiIuX1VQREFURV9OT1cuIlwiPiA8YSBocmVmPVwidXBkYXRlLnBocD9jb25mPSRwcm9maWxlbmFtZVwiPiIuX1VQREFURV9OT1cuIjwvYT48L3RkPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCghJHZhbGlkVXNlclJlcXVpcmVkKSB8fCAoJHNlc3Npb24tPmNhbkVkaXRQcm9maWxlcygpKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICRycT0gQCRkYi0+RXhlY3V0ZSgic2VsZWN0IGNvdW50KCopIGZyb20gJHByb2ZpbGVfdGFibGVuYW1lIik7CiAgICAgICAgICAgICAgICAkcmVjcyA9IEAkcnEtPkZldGNoUm93KCk7CiAgICAgICAgICAgICAgICAkcmVjcyA9IG51bWJlcl9mb3JtYXQoJHJlY3NbMF0sIDAsICcuJywgJycpOyAKICAgICAgICAgICAgICAgIGVjaG8gIjx0ZCAkYmdjIGNsYXNzPWRvdGxpbmUyPjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2VkaXQuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiRWRpdFwiPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JHByb2ZpbGVuYW1lJmFtcDtlZGl0PTFcIj4iLl9FRElUX1BST0ZJTEUuIjwvYT48L3RkPjx0ZCAkYmdjIGNsYXNzPWRvdGxpbmUyIHRpdGxlPVwiVGhpcyBwcm9maWxlIGNvbnRhaW5zICRyZWNzIGRhdGEgcmVjb3Jkc1wiPiA8aW1nIHNyYz1cImltYWdlcy9pY29ucy9kZWxldGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiRGVsZXRlXCI+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kcHJvZmlsZW5hbWUmYW1wO2RlbD0xXCI+Ii5fTUFJTlRFTkFOQ0UuIjwvYT48L3RkPjwvdHI+IjsKICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlY2hvICI8dGQgJGJnYyBjbGFzcz1kb3RsaW5lMj48aW1nIHNyYz1cImltYWdlcy9pY29ucy9lZGl0LmdpZlwiIHdpZHRoPTE2IGhlaWdodD0xNiBhbGlnbj1sZWZ0IGFsdD1cIkVkaXRcIj48YSBocmVmPVwicHJvZmlsZXMucGhwP2VkaXRjb25mPSRwcm9maWxlbmFtZSZhbXA7ZWRpdD0xXCI+Ii5fRURJVF9QUk9GSUxFLiI8L2E+PC90ZD4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoISR2YWxpZFVzZXJSZXF1aXJlZCkgfHwgKCRzZXNzaW9uLT5jYW5FZGl0UHJvZmlsZXMoKSkpIHsKICAgICAgICAgICAgICAgIGVjaG8gIjx0ZCAkYmdjIGNsYXNzPWRvdGxpbmUyPiA8aW1nIHNyYz1cImltYWdlcy9pY29ucy9kZWxldGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiRGVsZXRlXCI+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kcHJvZmlsZW5hbWUmYW1wO2RlbD0xXCI+Ii5fTUFJTlRFTkFOQ0UuIjwvYT48L3RkPjwvdHI+IjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gIjwvdHI+IjsgICAKICAgICAgICAgICAgfQoJCX0KCQkKCQlpZiAoJG51bV9vZl9pdGVtcyA+ICRpdGVtc19wZXJfcGFnZSkgewoJCQllY2hvICI8dHI+PHRkIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMCcgY29sc3Bhbj0nNSc+IjsJCQkKCQkJCWlmIChkZWZpbmVkKCJfTElNSVRfUFJPRklMRVMiKSA9PSAwKSB7CgkJCQkJZWNobyAiPGRpdiBjbGFzcz0ncHJvZmlsZV9wYWdpbmF0aW9uJz4iOwoJCQkJCQlpZihjZWlsKCRudW1fb2ZfaXRlbXMvJGl0ZW1zX3Blcl9wYWdlKSA+IDEpIHsKCQkJCQkJCWVjaG8gcGFnaW5hdGlvbigkbnVtX29mX2l0ZW1zLCAkaXRlbXNfcGVyX3BhZ2UsICRwYWdlX251bSwgJG1heF9saW5rcyk7CgkJCQkJCX0KCQkJCQkJaWYoIWVtcHR5KCRfR0VUWydwYWdlX251bSddKSkgewoJCQkJCQkJJHVybF9leHRlbnNpb24gPSAiP3BhZ2VfbnVtPTEmIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR1cmxfZXh0ZW5zaW9uID0gIj8iOwoJCQkJCQl9CgkJCQkJCWlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NlYXJjaCddKSkgewoJCQkJCQkJaWYoJHVybF9leHRlbnNpb24gPT0gJz8nKSB7CgkJCQkJCQkJJHVybF9leHRlbnNpb24gLj0gInNlYXJjaD17JF9SRVFVRVNUWydzZWFyY2gnXX0mc2ZpZWxkPXskX1JFUVVFU1RbJ3NmaWVsZCddfSYiOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkdXJsX2V4dGVuc2lvbiAuPSAiJnNlYXJjaD17JF9SRVFVRVNUWydzZWFyY2gnXX0mc2ZpZWxkPXskX1JFUVVFU1RbJ3NmaWVsZCddfSI7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWNobyAiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeyAkKFwiI251bV9wcFwiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7IHdpbmRvdy5sb2NhdGlvbiA9IFwieyRfU0VSVkVSWydQSFBfU0VMRiddfXskdXJsX2V4dGVuc2lvbn1udW1fcHA9XCIgKyAkKHRoaXMpLnZhbCgpIH0pOyB9KTs8L3NjcmlwdD4iOwoJCQkJCQllY2hvICI8ZGl2IGNsYXNzPSdzZWxlY3RfbnVtX3Blcl9wYWdlJz4iOwoJCQkJCQkJZWNobyAiPGxhYmVsIGZvcj0ncGFnaW5hdGlvbl9udW1fcGVyX3BhZ2UnPiIuX05VTUJFUl9PRl9QUk9GSUxFU19QRVJfUEFHRS4iOiA8L2xhYmVsPiI7CgkJCQkJCQllY2hvICI8c2VsZWN0IGlkPSdudW1fcHAnIG5hbWU9J251bV9wcCc+IjsKCQkJCQkJCQllY2hvICI8b3B0aW9uICI7IGlmKCRpdGVtc19wZXJfcGFnZSA9PSA1KSB7IGVjaG8gInNlbGVjdGVkICI7IH0gZWNobyAidmFsdWU9JzUnPjU8L29wdGlvbj4iOwoJCQkJCQkJCWVjaG8gIjxvcHRpb24gIjsgaWYoJGl0ZW1zX3Blcl9wYWdlID09IDEwKSB7IGVjaG8gInNlbGVjdGVkICI7IH0gZWNobyAidmFsdWU9JzEwJz4xMDwvb3B0aW9uPiI7CgkJCQkJCQkJZWNobyAiPG9wdGlvbiAiOyBpZigkaXRlbXNfcGVyX3BhZ2UgPT0gMjApIHsgZWNobyAic2VsZWN0ZWQgIjsgfSBlY2hvICJ2YWx1ZT0nMjAnPjIwPC9vcHRpb24+IjsKCQkJCQkJCQllY2hvICI8b3B0aW9uICI7IGlmKCRpdGVtc19wZXJfcGFnZSA9PSA1MCkgeyBlY2hvICJzZWxlY3RlZCAiOyB9IGVjaG8gInZhbHVlPSc1MCc+NTA8L29wdGlvbj4iOwoJCQkJCQkJCWVjaG8gIjxvcHRpb24gIjsgaWYoJGl0ZW1zX3Blcl9wYWdlID09IDEwMCkgeyBlY2hvICJzZWxlY3RlZCAiOyB9IGVjaG8gInZhbHVlPScxMDAnPjEwMDwvb3B0aW9uPiI7CgkJCQkJCQkJZWNobyAiPG9wdGlvbiAiOyBpZigkaXRlbXNfcGVyX3BhZ2UgPT0gMjAwKSB7IGVjaG8gInNlbGVjdGVkICI7IH0gZWNobyAidmFsdWU9JzIwMCc+MjAwPC9vcHRpb24+IjsKCgkJCQkJCQkJZWNobyAiPG9wdGlvbiAiOyBpZigkaXRlbXNfcGVyX3BhZ2UgPT0gJG51bV9vZl9pdGVtcykgeyBlY2hvICJzZWxlY3RlZCAiOyB9IGVjaG8gInZhbHVlPSdBbGwnPiIuX0FMTC4iPC9vcHRpb24+IjsKCQkJCQkJCWVjaG8gIjwvc2VsZWN0PiI7CgkJCQkJCWVjaG8gIjwvZGl2PiI7CgkJCQkJZWNobyAiPC9kaXY+IjsKCQkJCX0KCQkJZWNobyAiPC90ZD48L3RyPiI7CgkJfQoJfQoJZWNobyAiPC90YWJsZT48cD4iOwoJCiAgICBpZiAoJHZhbGlkVXNlclJlcXVpcmVkICYmIEAkc2Vzc2lvbi0+aXNBZG1pbigpPT09ZmFsc2UpIHsKICAgICAgICAkTm90aWNlPSIiOwogICAgICAgIGlmIChAJHNlc3Npb24tPmNhbkVkaXRQcm9maWxlcygpPT09ZmFsc2UpIHsKICAgICAgICAgICAgJE5vdGljZS49X05PX1BFUk1JU1NJT05fRURJVF9QUk9GSUxFLiI8YnI+IjsgICAKICAgICAgICB9CiAgICAgICAgaWYgKEAkc2Vzc2lvbi0+Y2FuQWRkUHJvZmlsZXMoKT09PWZhbHNlKSB7CiAgICAgICAgICAgICROb3RpY2UuPV9OT19QRVJNSVNTSU9OX0FERF9QUk9GSUxFLiI8YnI+IjsgICAKICAgICAgICB9CiAgICAgICAgaWYgKEAkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpPT09ZmFsc2UpIHsKICAgICAgICAgICAgJE5vdGljZS49X05PX1BFUk1JU1NJT05fVVBEQVRFLiI8YnI+IjsgICAKICAgICAgICB9CiAgICAgICAgaWYgKCROb3RpY2UhPSIiICYmIF9MT0dBSE9MSUNfRURJVElPTiE9NCkgewogICAgICAgICAgICBlY2hvICI8ZGl2IHN0eWxlPVwid2lkdGg6NjAwcHg7XCI+IjsKICAgICAgICAgICAgJE5vdGljZT0iPGI+Ii5fUExFQVNFX05PVEUuIjo8L2I+PGJyPiIuJE5vdGljZTsKICAgICAgICAgICAgZWNob05vdGljZSgkTm90aWNlKTsKICAgICAgICAgICAgZWNobyAiPC9kaXY+IjsgICAgCiAgICAgICAgfQogICAgfQogICAgZWNobyAiPC9kaXY+IjsKfQoKLyogUGFnaW5hdGlvbiBmdW5jdGlvbnMgc3RhcnRzIGhlcmUgKi8KZnVuY3Rpb24gcGFnaW5hdGlvbl9saW5rKCRwYWdlX251bWJlcikgewoJJHBhZ2luYXRpb25fdXJsID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ10uJz9wYWdlX251bT0nLiRwYWdlX251bWJlcjsKCWlmKCFlbXB0eSgkX0dFVFsnbnVtX3BwJ10pKSB7CgkJJHBhZ2luYXRpb25fdXJsIC49ICImbnVtX3BwPXskX0dFVFsnbnVtX3BwJ119IjsKCX0KCXJldHVybiAkcGFnaW5hdGlvbl91cmw7Cn0KCmZ1bmN0aW9uIHBhZ2luYXRpb24oJG51bWJlcl9vZl9pdGVtcywgJGl0ZW1zX3BwLCAkcGFnZV9udW1iZXIsICRtYXhfbGlua3MpIHsKCSR0b3RhbF9wYWdlcyA9IGNlaWwoJG51bWJlcl9vZl9pdGVtcy8kaXRlbXNfcHApOwoJaWYoJHBhZ2VfbnVtYmVyKSB7CgkJaWYoJHBhZ2VfbnVtYmVyID4gMSkgeyAKCQkJJHByZXYgPSAiPGEgaHJlZj0nIi5wYWdpbmF0aW9uX2xpbmsoKCRwYWdlX251bWJlciAtMSApKS4iJz4mbHQ7ICIuX1BSRVZJT1VTLiI8L2E+IjsgCgkJCSRmaXJzdCA9ICI8YSBocmVmPSciLnBhZ2luYXRpb25fbGluaygxKS4iJz4mbHQ7Jmx0OyAiLl9GSVJTVF9QQUdFLiI8L2E+IjsgCgkJfSBlbHNlIHsKCQkJJHByZXYgPSAiPHNwYW4+Jmx0OyAiLl9QUkVWSU9VUy4iPC9zcGFuPiI7CgkJCSRmaXJzdCA9ICI8c3Bhbj4mbHQ7Jmx0OyAiLl9GSVJTVF9QQUdFLiI8L3NwYW4+IjsKCQl9Cgl9CgkKCWlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NlYXJjaCddKSkgewoJCSR1cmxfZXh0ZW5zaW9uID0gIiZzZWFyY2g9eyRfUkVRVUVTVFsnc2VhcmNoJ119JnNmaWVsZD17JF9SRVFVRVNUWydzZmllbGQnXX0iOwoJfSBlbHNlIHsKCQkkdXJsX2V4dGVuc2lvbiA9ICIiOwoJfQoJCglpZigkcGFnZV9udW1iZXIgPCAkdG90YWxfcGFnZXMpIHsKCQkkbmV4dCA9ICI8YSBocmVmPSciLnBhZ2luYXRpb25fbGluaygoJHBhZ2VfbnVtYmVyICsgMSkpLiR1cmxfZXh0ZW5zaW9uLiInPiIuX05FWFQuIiAmZ3Q7PC9hPiI7IAoJCSRsYXN0ID0gIjxhIGhyZWY9JyIucGFnaW5hdGlvbl9saW5rKCR0b3RhbF9wYWdlcykuJHVybF9leHRlbnNpb24uIic+Ii5fTEFTVF9QQUdFLiIgJmd0OyZndDs8L2E+IjsKCX0gZWxzZSB7CgkJJG5leHQgPSAiPHNwYW4+Ii5fTkVYVC4iICZndDs8L3NwYW4+IjsKCQkkbGFzdCA9ICI8c3Bhbj4iLl9MQVNUX1BBR0UuIiAmZ3Q7Jmd0Ozwvc3Bhbj4iOwoJfQoJZWNobyAkZmlyc3Q7CgllY2hvICRwcmV2OwoJJGxvb3AgPSAwOwoJaWYoJHBhZ2VfbnVtYmVyID49ICRtYXhfbGlua3MpIHsKCQkkcGFnZV9jb3VudGVyID0gY2VpbCgkcGFnZV9udW1iZXIgLSAoJG1heF9saW5rcy0xKSk7Cgl9IGVsc2UgewoJCSRwYWdlX2NvdW50ZXIgPSAxOwoJfQoJaWYoJHRvdGFsX3BhZ2VzIDwgJG1heF9saW5rcyl7CgkJJG1heF9saW5rcyA9ICR0b3RhbF9wYWdlczsKCX0KCWRveyAKCQlpZigkcGFnZV9jb3VudGVyID09ICRwYWdlX251bWJlcikgewoJCQllY2hvICI8c3Ryb25nPnskcGFnZV9jb3VudGVyfTwvc3Ryb25nPiI7IAoJCX0gZWxzZSB7CgkJCWVjaG8gIjxhIGhyZWY9JyIucGFnaW5hdGlvbl9saW5rKCgkcGFnZV9jb3VudGVyKSkuIic+eyRwYWdlX2NvdW50ZXJ9PC9hPiI7CgkJfSAKCQkkcGFnZV9jb3VudGVyKys7ICRjdXJyZW50X3BhZ2U9KCRwYWdlX2NvdW50ZXIrMSk7CgkJJGxvb3ArKzsKCX0gd2hpbGUgKCRtYXhfbGlua3MgPiAkbG9vcCk7CgllY2hvICRuZXh0OwoJZWNobyAkbGFzdDsKfQoKaW5jbHVkZSAiaW5jbHVkZXMvZWRpdHByb2ZpbGUucGhwIjsKZWNobyAiPC9ib2R5PjwvaHRtbD4iOwo=")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 d15b859b85fa4a50321098bec447718a
Eval Count 1
Decode Time 254 ms