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 /* ===================================================== DataLife Engine - by So..

Decoded Output download

?><?php
/*
=====================================================
 DataLife Engine - by SoftNews Media Group 
-----------------------------------------------------
 https://dle-news.ru/
-----------------------------------------------------
 Copyright (c) 2004-2024 SoftNews Media Group
=====================================================
 This code is protected by copyright
=====================================================
 File: upgrade.php
-----------------------------------------------------
 Use: DLE upgrade
=====================================================
*/

if( !defined( 'DATALIFEENGINE' ) OR !defined( 'LOGGED_IN' ) ) {
	header( "HTTP/1.1 403 Forbidden" );
	header ( 'Location: ../../' );
	die( "Hacking attempt!" );
}

if($member_id['user_group'] != 1){ msg("error", $lang['addnews_denied'], $lang['db_denied']); }

include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/zipextract.class.php'));

function convert_file( $file ) {
	
	$string = @file_get_contents($file);
	
	if(!$string) return false;

	if( function_exists( 'mb_convert_encoding' ) ) {
		$string = mb_convert_encoding( $string, "utf-8", "windows-1251" );
	} elseif( function_exists( 'iconv' ) ) {
		$string = iconv("windows-1251", "utf-8", $string);
	}

	if( $string ) {
		file_put_contents ($file, $string, LOCK_EX);
	}

	return true;
}

function need_convert_file( $file ) {
	
	$string = @file_get_contents($file);
	
	if(!$string) return false;

	if( function_exists( 'mb_convert_encoding' ) ) {

		$sample = mb_convert_encoding( $string, "utf-8", "utf-8" );

	} elseif( function_exists( 'iconv' ) ) {
	
		$sample = iconv("utf-8", "utf-8", $string);
	
	}

	if (md5($sample) == md5($string)) return false;

	return true;
}

function table_convert( $table ) {
	global $db;
	
	$table = $db->safesql( $table );
	
	$db->query( "ALTER TABLE `{$table}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" );

}

function need_table_convert( $table ) {
	global $db;
	
	$table = $db->safesql( $table );
	
	$sql = $db->query( "SHOW FULL COLUMNS FROM `$table`" );
	
	while ( $row = $db->get_row($sql) ) {

		if ( $row['Collation'] ) {
			
			list( $charset ) = explode( '_', $row['Collation'] );
			$charset = strtolower( $charset );

			if ( $charset !== 'utf8mb4' ) {
				return true;
			}
		}
		
	}
	
	$row = $db->super_query( "SHOW TABLE STATUS LIKE '{$table}'" );
	list( $table_charset ) = explode( '_', $row['Collation'] );
	$table_charset = strtolower( $table_charset );
	
	if ( $table_charset != 'utf8mb4') {
		return true;
	}
	
	return false;
	
}

function files_check_chmod( $dir,  $bad_files = array() ) {
	
	if ( $dh = @opendir( $dir ) ) {
		
		while ( false !== ( $file = readdir($dh) ) ) {
			
			if ( $file == '.' or $file == '..' or $file == '.svn' or $file == '.DS_store' ) {
					continue;
			}
		
			if ( is_dir( $dir . "/" . $file ) ) {

				$bad_files = files_check_chmod( $dir . "/" . $file, $bad_files );
				
			} else {
				
				if ( preg_match( "#.*\.(php|txt|tpl)#i", $file ) ) {
					$folder = str_replace(ROOT_DIR, "",$dir);
					
					if(!is_writable($dir . "/" . $file)) {
						$bad_files[] = $folder . "/" . $file;
					}
				}
			}
		}
	}
	
	return $bad_files;
}

function get_files( $dir,  $files = array() ) {
	
	if ( $dh = @opendir( $dir ) ) {
		
		while ( false !== ( $file = readdir($dh) ) ) {
			
			if ( $file == '.' or $file == '..' or $file == '.svn' or $file == '.DS_store' ) {
					continue;
			}
		
			if ( is_dir( $dir . "/" . $file ) ) {

				$files = get_files( $dir . "/" . $file, $files );
				
			} else {
				
				if ( preg_match( "#.*\.(php|txt|tpl)#i", $file ) ) {
					$folder = str_replace(ROOT_DIR, "",$dir);
					$files[] = $folder . "/" . $file;
				}
			}
		}
	}
	
	return $files;
}

if($_REQUEST['action'] == "upgrade_files" ) {
	
		if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
			die( "Hacking attempt! User not found" );
		}
	
		$distr_file = ENGINE_DIR . "/cache/system/" . md5('ugrdistr'.SECURE_AUTH_KEY) . ".zip";
		
		$done = 0;

		try {
			
			$fs = new dle_zip_extract( $distr_file );
			$total = $fs->zip->numFiles;
			
			$offset = intval($_POST['offset']);
			
			if( $_SESSION['distr']['ftp'] )	{
				$fs->FtpConnect( $_SESSION['distr']['ftp'] );
			}
			
			$done = $fs->ExtractZipArchive($offset, 100);
			
			if (function_exists('opcache_reset')) {
				opcache_reset();
			}
		
		} catch ( Exception $e ) {
	
			$response['error'] = $e->getMessage();
			echo json_encode($response);
			die();
			
		}
		
		if( !isset($_SESSION['files_errors']) ) $_SESSION['files_errors'] = array();
	
		if( $done )	{
			$offset = $offset + $done;
		} else {
			$offset = $total;
		}
		
		if($offset >= $total){
			$fs->FixHtaccess();
			@unlink(ENGINE_DIR.'/data/snap.db');
			clear_all_caches();
		}
		
		if( $_SESSION['distr']['ftp'] )	{
			$fs->DisconnectFTP();
		}
		
		if( count($fs->errors_list) ) $_SESSION['files_errors'] = array_merge($_SESSION['files_errors'], $fs->errors_list);
		
		echo "{\"status\": \"ok\", \"offset\": \"{$offset}\"}";
		die();


} elseif($_REQUEST['action'] == "checkftp" ) {
	
	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		die( "Hacking attempt! User not found" );
	}
	
	try {
		
		$fs = new dle_zip_extract();
		$fs->FtpConnect( $_POST['ftp'] );
		
	} catch ( Exception $e ) {
		
		$response['error'] = $e->getMessage();
		echo json_encode($response);
		die();
	}

	$_SESSION['distr']['ftp'] = $_POST['ftp'];
	
	echo "{\"status\": \"ok\"}";
	die();
	
} elseif($_REQUEST['action'] == "download" ) {
	
	if ( !isset( $_SESSION['distr'] ) )	{
		header( "Location: ?mod=upgrade" );
		die();
	}
	
	$no_access = files_check_chmod(ROOT_DIR."/engine" );


	if($_REQUEST['subaction'] == "manual" OR !class_exists('ZipArchive') ) {
		
		echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);
		
		$lang['upgr_ftp_10'] = str_replace("{link}", "<a href=\"{$_SESSION['distr']['link']}\" target=\"_blank\">{$lang['upgr_ftp_11']} {$_SESSION['distr']['version']}</a>", $lang['upgr_ftp_10']);
		
		echo <<<HTML
	<div class="panel panel-default">
	  <div class="panel-heading">
		{$lang['upgr_dbtitle_2']}
	  </div>
		<div class="panel-body">
			{$lang['upgr_ftp_9']}
		</div>
		<div class="panel-body">
			<ol>{$lang['upgr_ftp_10']}</ol>
		</div>
	  <div class="panel-footer">
		 <a href="?mod=upgrade&action=dbupgrade&to={$_SESSION['distr']['version']}" class="btn bg-teal btn-sm btn-raised"><i class="fa fa-forward position-left"></i>{$lang['upgr_next']}</a>
	   </div>
	</div>
HTML;

		if( !class_exists('ZipArchive') ) {
			echo "<div class=\"alert alert-warning alert-styled-left alert-arrow-left alert-component\">{$lang['upgr_f_error_19']}</div>";
		}
		
		echofooter();
		
	} elseif( count($no_access) AND !isset( $_SESSION['distr']['ftp'] ) ) {
		
		echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);

		$root = ROOT_DIR;

		echo <<<HTML
	<form class="form-horizontal" id="ftpserver">
	<div class="panel panel-default">
	  <div class="panel-heading">
		{$lang['upgr_dbtitle_2']}
	  </div>
		<div class="panel-body">
			{$lang['upgr_ftp_1']}
		</div>
		<div class="panel-body">
			<div class="form-group">
				<label class="control-label col-sm-2">{$lang['upgr_ftp_2']}</label>
				<div class="col-sm-10">
					<label class="radio-inline position-left"><input class="icheck" type="radio" name="ftp[type]" value="ftp" checked>FTP</label>
					<label class="radio-inline position-left"><input class="icheck" type="radio" name="ftp[type]" value="sslftp">SSL FTP</label>
					<label class="radio-inline position-left"><input class="icheck" type="radio" name="ftp[type]" value="ssh2">SFTP SSH2</label>
				</div>
			</div>
			<div class="form-group">
				<label class="control-label col-sm-2">{$lang['upgr_ftp_3']}</label>
				<div class="col-sm-10">
					<input type="text" class="form-control width-350 position-left" name="ftp[server]">
					<span class="position-left">{$lang['upgr_ftp_4']}</span>
					<input type="text" class="form-control position-left" name="ftp[port]" style="width:45px" value="21">
				</div>
			</div>
			<div class="form-group">
				<label class="control-label col-sm-2">{$lang['upgr_ftp_5']}</label>
				<div class="col-sm-10">
					<input type="text" class="form-control width-350 position-left" name="ftp[username]">
				</div>
			</div>
			<div class="form-group">
				<label class="control-label col-sm-2">{$lang['upgr_ftp_6']}</label>
				<div class="col-sm-10">
					<input type="text" class="form-control width-350 position-left" name="ftp[password]">
				</div>
			</div>
			<div class="form-group">
				<label class="control-label col-sm-2">{$lang['upgr_ftp_7']}</label>
				<div class="col-sm-10">
					<input type="text" class="form-control width-450 position-left" name="ftp[path]" value="{$root}">
				</div>
			</div>
		</div>
	  <div class="panel-footer">
		 <button id="button" onclick="check_ftp(); return false;" type="button" class="btn bg-teal btn-sm btn-raised position-left"><i class="fa fa-forward position-left"></i>{$lang['upgr_next']}</button>
		 <a href="?mod=upgrade&action=download&subaction=manual" class="btn bg-brown-600 btn-sm btn-raised"><i class="fa fa-download position-left"></i>{$lang['upgr_ftp_8']}</a>
	   </div>
	<script>
	<!--
	function check_ftp() {
	
		var formData = new FormData($('#ftpserver')[0]);
		
		ShowLoading('');
		$('#button').attr("disabled", "disabled");
		
		$.ajax({
			url: "?mod=upgrade&action=checkftp&user_hash={$dle_login_hash}",
			data: formData,
			processData: false,
			contentType: false,
			type: 'POST',
			dataType: 'json',
			success: function(data) {
			
				HideLoading('');
				
				if (data.status == "ok") {
					setTimeout("window.location = '?mod=upgrade&action=download'", 300 );
				} else {
					$('#button').attr("disabled", false);
					DLEalert(data.error, '{$lang['all_info']}');
						
				}
			}
		});
	
		return false;
	}
	//-->
	</script>
	</div>
	</form>
HTML;

		echofooter();
		
	} else {
		
		$distr_file = ENGINE_DIR . "/cache/system/" . md5('ugrdistr'.SECURE_AUTH_KEY) . ".zip";
		@unlink( $distr_file );

		$arrContextOptions=array(
		    "ssl"=>array(
		        "verify_peer"=>false,
		        "verify_peer_name"=>false,
		    ),
		);

		if ( !@copy($_SESSION['distr']['link'], $distr_file, stream_context_create($arrContextOptions) ) ) {
			msg( "error", $lang['addnews_error'], $lang['upgr_f_error_8'], array('javascript:location.reload(true);' => $lang['upgr_btn_1'], '?mod=upgrade&action=download&subaction=manual' => $lang['upgr_ftp_8'] ) );
		}
		
		if( md5_file($distr_file) != $_SESSION['distr']['crc']) {
			msg( "error", $lang['addnews_error'], $lang['upgr_f_error_9'], array('javascript:location.reload(true);' => $lang['upgr_btn_1'], '?mod=upgrade&action=download&subaction=manual' => $lang['upgr_ftp_8'] ) );
		}
		
		$fs = new dle_zip_extract( $distr_file );
		$total = $fs->zip->numFiles;

		DLEFiles::init( 0, false, '');
		$rootlist = DLEFiles::ListDirectory( '', array('php'), 0 );
		
		foreach ( $rootlist['files'] as $rootfile ) {
			$data = DLEFiles::Read( $rootfile['name'], 0 );
				
			if( stripos( $data, 'Use: Cron operations' ) !== false ) {
				
				if( stripos( $data, '$allow_cron = 0;' ) === false ) {
					$_SESSION['cronfile'] = $rootfile['name'];
				}
				
				break;
			}
		
		}

		echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);
		
		echo <<<HTML
			<div class="panel panel-default">
			  <div class="panel-heading">
				{$lang['upgr_ftp_12']}
			  </div>
				<div class="panel-body">
					<div class="progress"><div id="progressbar" class="progress-bar progress-blue" style="width:0%;"><span></span></div></div>
					<div class="text-size-small">{$lang['upgr_ftp_14']} <span id="files_ok"></span> <span id="status"></span></div>
				</div>
				<div class="panel-body">
					<div id="ajaxerror"></div>
					<div class="text-muted text-size-small">{$lang['upgr_ftp_13']}</div>
				</div>	
				<div class="panel-footer">
					<button id="button" type="button" class="btn bg-teal btn-sm btn-raised" disabled><i class="fa fa-forward position-left"></i>{$lang['upgr_next']}</button>
				</div>
			</div>
<script>

	var total = {$total};
	var offset = 0;

	function upgrade_files(offset)  {

		$('#ajaxerror').html('');

		$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'upgrade_files', offset: offset },
			function(data){
				if (data) {
					if (data.status == "ok") {
					
						offset = data.offset;

						$('#files_ok').text(offset);
						
						var proc = Math.round( (100 * data.offset) / total );
	
						if ( proc > 100 ) proc = 100;
	
						$('#progressbar').css( "width", proc + '%' );

						 if (data.offset >= total)
						 {
							setTimeout("window.location = '?mod=upgrade&action=dbupgrade&to={$_SESSION['distr']['version']}'", 100 );
							
						 } else { setTimeout("upgrade_files(" + data.offset + ")", 300 ); }
	
	
					} else if( data.error ) { $('#status').text(data.error); }
	
				}
			}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

				var error_status = '';
			
				if (jqXHR.status < 200 || jqXHR.status >= 300) {
				  error_status = 'HTTP Error: ' + jqXHR.status;
				} else {
					error_status = 'Invalid JSON: ' + jqXHR.responseText;
				}
		
				$('#status').html('{$lang['upgr_error']}');
				$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
				$('#button').attr("disabled", false);
			
		});
	
		return false;
	
	}

	$(function() {
		
		$('#button').click(function() {
			$('#button').attr("disabled", "disabled");
			upgrade_files(offset);
			return false;
		});
		
		setTimeout("upgrade_files(offset)", 300 );
	});
</script>
HTML;

		echofooter();
	}
	

	
} elseif($_REQUEST['action'] == "checklicense" ) {

	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		die( "Hacking attempt! User not found" );
	}
	
	if( strlen(trim((string)$_REQUEST['dle_key'])) != 29 ){
		echo "{\"error\": \"{$lang['upgr_f_error_5']}\"}";
		die();
	}
	
	$params = array(
		'action' => 'info',
		'domain' => $_SERVER['HTTP_HOST'],
		'key' => (string)$_REQUEST['dle_key'],
		'version' => VERSIONID,
		'build' => BUILDID,
		'site_key' => get_domen_hash()
	);

	$data = http_get_contents("https://dle-news.ru/extras/upgrade/index.php?".http_build_query($params, '', '&') );

	if( $data !== false ) {

		$data = json_decode ($data, true);

		if(is_array($data) ) {

			if( isset($data['error']) AND $data['error']) {
				
				if( $data['error'] == "-3" ) $data['error'] = $lang['upgr_f_error_2'];
				if( $data['error'] == "-2" ) $data['error'] = $lang['upgr_f_error_3'];
				if( $data['error'] == "-1" ) $data['error'] = $lang['upgr_f_error_4'];
				
				echo "{\"error\": \"{$data['error']}\"}";
				die();
			}
			
			if( $data['distr']['version'] ) {

				if( version_compare(VERSIONID, $data['distr']['version'], '>') ) {
					echo "{\"error\": \"{$lang['upgr_f_error_6']}\"}";
					die();
				}
				
				if( version_compare(VERSIONID, $data['distr']['version'], '==') AND version_compare(BUILDID, $data['distr']['build'], '>=') AND !defined('DEMOVERSION') ) {
					echo "{\"error\": \"{$lang['upgr_f_error_6']}\"}";
					die();
				}

				if (isset($data['distr']['phpversion']) AND $data['distr']['phpversion']) {
					$phpv = phpversion();
					if (version_compare($phpv, $data['distr']['phpversion'], '<')) {

						$lang['upgr_f_error_20'] = str_replace('{version}', '<b><span style=\"color:red\">' . $phpv . '</span></b>', $lang['upgr_f_error_20']);
						$lang['upgr_f_error_20'] = str_replace('{regversion}', '<b>' . $data['distr']['phpversion']  . '</b>', $lang['upgr_f_error_20']);
						$lang['upgr_f_error_20'] = str_replace('{dleversion}', $data['distr']['version'], $lang['upgr_f_error_20']);

						echo "{\"error\": \"{$lang['upgr_f_error_20']}\"}";
						die();
					}
				}

				$_SESSION['distr'] = $data['distr'];
				echo "{\"status\": \"ok\"}";
				die();
				
			}
			
		}
		
	}

	echo "{\"error\": \"{$lang['upgr_f_error_1']}\"}";
	die();
	
} elseif($_REQUEST['action'] == "dbupgradecheck" ) {

	if ( !$_SESSION['db_upgrade'] )	{
		header( "Location: ?mod=main" );
		die();
	}
	
	unset($_SESSION['db_upgrade']);
	
	if( isset($_SESSION['query_errors']) AND is_array( $_SESSION['query_errors'] ) ) $errors_query = count( $_SESSION['query_errors'] ); else $errors_query = 0;	
	if( isset($_SESSION['files_errors']) AND is_array( $_SESSION['files_errors'] ) ) $errors_files = count( $_SESSION['files_errors'] ); else $errors_files = 0;
	
	$lang['upgr_db_success'] = str_replace("{version}", $config['version_id'], $lang['upgr_db_success']);

	if(COLLATE != "utf8" AND COLLATE != "utf8mb4") {
		
		if( !$errors_query AND !$errors_files ) {
			
			$_SESSION['db_convert'] = 1;
			unset($_SESSION['query_errors']);
			unset($_SESSION['files_errors']);
			header( "Location: ?mod=upgrade&action=dodbconvert&user_hash={$dle_login_hash}" );
			die();
		}
		
		$next_link = '?mod=upgrade&action=dbconvert';
		
	} else $next_link = '?mod=main';
	
	if( !$errors_query AND !$errors_files ) {
		
		unset($_SESSION['query_errors']);
		unset($_SESSION['files_errors']);
		
		msg( "success", $lang['all_info'], $lang['upgr_db_success'], array( $next_link => $lang['upgr_next']) );
	}
	
	echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);
		
	$errors = "<div class=\"panel-body\">".$lang['upgr_db_success']."</div>";
	$errors .= "<div class=\"panel-body\">".$lang['upgr_db_errors']."</div>";
	$sql_errors = "";
	$file_errors = "";

	if($errors_files) {
		foreach ($_SESSION['files_errors'] as $value) {
			$file_errors .= "<div class=\"quote\"><b>{$lang['upgr_file']}</b> {$value['file']}<br /><b>{$lang['upgr_db_errt']}</b> {$value['error']}</div>";
		}
		
		$errors .= "<div class=\"panel-body\"><div class=\"text-size-small pre-scrollable\">".$file_errors."</div></div>";
	}
	
	if($errors_query) {
		foreach ($_SESSION['query_errors'] as $value) {
			$sql_errors .= "<div class=\"quote\"><b>{$lang['upgr_db_query']}</b> {$value['query']}<br /><b>{$lang['upgr_db_errt']}</b> {$value['error']}</div>";
		}
		
		$errors .= "<div class=\"panel-body\"><div class=\"text-size-small pre-scrollable\">".$sql_errors."</div></div>";
	}
	
	
		echo <<<HTML
	<div class="panel panel-default">
	  <div class="panel-heading">
		{$lang['upgr_dbtitle_2']}
	  </div>
	  {$errors}
	  <div class="panel-footer">
		 <a href="{$next_link}" class="btn bg-teal btn-sm btn-raised position-left"><i class="fa fa-forward position-left"></i>{$lang['upgr_next']}</a>
	   </div>
	</div>
HTML;

	unset($_SESSION['query_errors']);
	unset($_SESSION['files_errors']);
		
	echofooter();
	die();
	
} elseif($_REQUEST['action'] == "dodbupgrade" ) {
	
	if ( !$_SESSION['db_upgrade'] )	{
		header( "Location: ?mod=upgrade&action=dbupgrade" );
		die();
	}
	
	if( $config['version_id'] == VERSIONID ) {
		echo "{\"status\": \"ok\", \"version\":\"{$config['version_id']}\"}";
		die();
	}
		
	$row = $db->super_query("SHOW TABLE STATUS WHERE Name = '" . PREFIX . "_post'");
	$storage_engine = $row['Engine'];
	
	if ( strtolower($storage_engine) == "innodb" ) {
		$storage_engine = "InnoDB";
	} else $storage_engine = "MyISAM";

	if( isset($_SESSION['distr']) ) {
		$config['key'] = md5( get_domen_hash() . DINITVERSION );
		unset($_SESSION['distr']);
	}

	if( file_exists( ENGINE_DIR . "/inc/upgrade/" . totranslit($config['version_id']) . ".php" ) ) {
		include ( ENGINE_DIR . "/inc/upgrade/" . totranslit($config['version_id']) . ".php" );
	}
	
	if( !isset($_SESSION['query_errors']) ) $_SESSION['query_errors'] = array();
	
	if( count($db->query_errors_list) ) $_SESSION['query_errors'] = array_merge($_SESSION['query_errors'], $db->query_errors_list);

	clear_all_caches();
	@unlink(ENGINE_DIR.'/data/snap.db');
	
	echo "{\"status\": \"ok\", \"version\":\"{$config['version_id']}\"}";
	die();
	
} elseif($_REQUEST['action'] == "dbsettingsconvert" ) {
	
	if ( !$_SESSION['db_convert'] )	{
		header( "Location: ?mod=upgrade&action=dbconvert" );
		die();
	}

	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		die( "Hacking attempt! User not found" );
	}
	
	$config_dbhost = DBHOST;
	$config_dbname = DBNAME;
	$config_dbuser = DBUSER;
	$config_dbpasswd = DBPASS;
	$config_dbprefix = PREFIX;
	$config_userprefix = USERPREFIX;
	$auth_key = SECURE_AUTH_KEY;
	
	$config_dbcollate = "utf8mb4";
	$config_dbpasswd = str_replace ('"', '\"', str_replace ("$", "\$", $config_dbpasswd) );

	$dbconfig = <<<HTML
<?php
	
define ("DBHOST", "{$config_dbhost}"); 
	
define ("DBNAME", "{$config_dbname}");
	
define ("DBUSER", "{$config_dbuser}");
	
define ("DBPASS", "{$config_dbpasswd}");  
	
define ("PREFIX", "{$config_dbprefix}");
	
define ("USERPREFIX", "{$config_userprefix}");
	
define ("COLLATE", "{$config_dbcollate}");
	
define('SECURE_AUTH_KEY', '{$auth_key}');
	
\$db = new db;
	
?>
HTML;
	
	$handler = fopen(ENGINE_DIR.'/data/dbconfig.php', "w");
	fwrite($handler, $dbconfig);
	fclose($handler);
	
	unset($_SESSION['db_convert']);
	clear_all_caches();
	
	echo "{\"status\": \"ok\"}";
	die();	

} elseif($_REQUEST['action'] == "settingsconvert" ) {

	if ( !$_SESSION['db_convert'] )	{
		header( "Location: ?mod=upgrade&action=dbconvert" );
		die();
	}

	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		die( "Hacking attempt! User not found" );
	}
	
	$config['charset'] = "utf-8";
	$handler = fopen(ENGINE_DIR.'/data/config.php', "w");
	fwrite($handler, "<?php 

//System Configurations

\$config = array (

");
	foreach($config as $name => $value)
	{
		fwrite($handler, "'{$name}' => '{$value}',

");
	}
	fwrite($handler, ");

?>");
	fclose($handler);

	$config_dbhost = DBHOST;
	$config_dbname = DBNAME;
	$config_dbuser = DBUSER;
	$config_dbpasswd = DBPASS;
	$config_dbprefix = PREFIX;
	$config_userprefix = USERPREFIX;
	$auth_key = SECURE_AUTH_KEY;
	
	$config_dbcollate = "utf8mb4";
	$config_dbpasswd = str_replace ('"', '\"', str_replace ("$", "\$", $config_dbpasswd) );

	$dbconfig = <<<HTML
<?php
	
define ("DBHOST", "{$config_dbhost}"); 
	
define ("DBNAME", "{$config_dbname}");
	
define ("DBUSER", "{$config_dbuser}");
	
define ("DBPASS", "{$config_dbpasswd}");  
	
define ("PREFIX", "{$config_dbprefix}");
	
define ("USERPREFIX", "{$config_userprefix}");
	
define ("COLLATE", "{$config_dbcollate}");
	
define('SECURE_AUTH_KEY', '{$auth_key}');
	
\$db = new db;
	
?>
HTML;
	
	$handler = fopen(ENGINE_DIR.'/data/dbconfig.php', "w");
	fwrite($handler, $dbconfig);
	fclose($handler);

	$settings_files = get_files(ROOT_DIR."/engine/data");
	
	foreach($settings_files as $file) {
		if( need_convert_file(ROOT_DIR.$file) ) {
			convert_file(ROOT_DIR.$file);
		}
	}

	unset($_SESSION['db_convert']);
	
	clear_all_caches();
	
	echo "{\"status\": \"ok\"}";
	die();

} elseif($_REQUEST['action'] == "templateconvert" ) {

	if ( !$_SESSION['db_convert'] )	{
		header( "Location: ?mod=upgrade&action=dbconvert" );
		die();
	}

	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		die( "Hacking attempt! User not found" );
	}

	$template_files = get_files(ROOT_DIR."/templates");
	
	foreach($template_files as $file) {
		if( need_convert_file(ROOT_DIR.$file) ) {
			convert_file(ROOT_DIR.$file);
		}
	}
	
	echo "{\"status\": \"ok\"}";
	die();

} elseif($_REQUEST['action'] == "tableconvert" ) {
	
	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		die( "Hacking attempt! User not found" );
	}
	
	if ( !$_SESSION['db_convert'] )	{
		header( "Location: ?mod=upgrade&action=dbconvert" );
		die();
	}

	$table = trim(totranslit($_POST['table'], false, false));
	
	if(!$table) die('error');
	
	if( need_table_convert( $table ) ) {
		table_convert( $table );
	}
	
	echo "{\"status\": \"ok\"}";
	die();
	
} elseif($_REQUEST['action'] == "dodbconvert" ) {

	if ( !$_SESSION['db_convert'] )	{
		header( "Location: ?mod=upgrade&action=dbconvert" );
		die();
	}

	if( !isset($_REQUEST['user_hash']) OR !$_REQUEST['user_hash'] OR $_REQUEST['user_hash'] != $dle_login_hash ) {
		msg( "error", $lang['addnews_error'], $lang['sess_error'] );
	}
	

	$tables = array();
	$sql = $db->query( "SHOW TABLES" );
	
	while ( $row = $db->get_array($sql) ) {
		if( substr($row[0], 0, strlen( PREFIX ) ) == PREFIX ) {
			if( need_table_convert($row[0]) ) $tables[] = $row[0];
		}
	}
	
	if(!count($tables) ) msg( "warning", $lang['all_info'], $lang['upgr_all_conv'] );
	
	$total = $totaltables = count($tables);
	$tables = "['".implode("','", $tables)."']";

	if($_REQUEST['subaction'] != "onlymb4" ) {
		
		$total = $total+2;
		
		$convert_files = <<<HTML
		function convert_templates()  {
		
			step ++;
			
			$('#wconvert').html('{$lang['upgr_templ_conv']}');
			$('#ajaxerror').html('');
			
			$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'templateconvert' },
				function(data){
		
					if (data) {
		
						if (data.status == "ok") {
		
							var proc = Math.round( (100 * step) / total );
		
							if ( proc > 100 ) proc = 100;
		
							$('#progressbar').css( "width", proc + '%' );
							
							setTimeout("convert_settings()", 300 );
		
						}
		
					}
				}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

				var error_status = '';
			
				if (jqXHR.status < 200 || jqXHR.status >= 300) {
				  error_status = 'HTTP Error: ' + jqXHR.status;
				} else {
					error_status = 'Invalid JSON: ' + jqXHR.responseText;
				}
		
				$('#status').html('{$lang['upgr_error']}');
				$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
				$('#button').attr("disabled", false);
			
			});
		
			return false;
		
		}
		
		function convert_settings()  {
		
			step ++;
			
			$('#wconvert').html('{$lang['upgr_sett_conv']}');
			$('#ajaxerror').html('');
			
			$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'settingsconvert' },
				function(data){
		
					if (data) {
		
						if (data.status == "ok") {
							var proc = Math.round( (100 * step) / total );
		
							if ( proc > 100 ) proc = 100;
		
							$('#progressbar').css( "width", proc + '%' );
							
							setTimeout("window.location = '?mod=main'", 300 );
		
						}
		
					}
				}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

					var error_status = '';
				
					if (jqXHR.status < 200 || jqXHR.status >= 300) {
					  error_status = 'HTTP Error: ' + jqXHR.status;
					} else {
						error_status = 'Invalid JSON: ' + jqXHR.responseText;
					}
			
					$('#status').html('{$lang['upgr_error']}');
					$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
					$('#button').attr("disabled", false);
			
			});
		
			return false;
		
		}
HTML;

	} else { $convert_files = ""; $total = $total+1; }
	
	echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle']}</span>", $lang['upgr_dbtitle_1']);

	echo <<<HTML
<script>

	var total = $total;
	var totaltables = $totaltables;
	var tables = {$tables};
	var step = 0;
	var table_info = '{$lang['upgr_table_conv']}';

	function convert_tables()  {
	
		var table = tables[step];
		step ++;
		
		$('#wconvert').html(table_info + ' <b>' + table + '</b>');
		$('#ajaxerror').html('');
		
		$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'tableconvert', table: table },
			function(data){
	
				if (data) {
	
					if (data.status == "ok") {
	
						var proc = Math.round( (100 * step) / total );
	
						if ( proc > 100 ) proc = 100;
	
						$('#progressbar').css( "width", proc + '%' );

						 if (step >= totaltables)
						 {
							if (typeof convert_templates == 'function') {
							
								setTimeout("convert_templates()", 300 );
								
							} else {
							
								setTimeout("convert_dbsettings()", 300 );
								
							}
							
						 } else { setTimeout("convert_tables()", 300 ); }
	
	
					}
	
				}
			}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

				var error_status = '';
			
				if (jqXHR.status < 200 || jqXHR.status >= 300) {
				  error_status = 'HTTP Error: ' + jqXHR.status;
				} else {
					error_status = 'Invalid JSON: ' + jqXHR.responseText;
				}
		
				$('#status').html('{$lang['upgr_error']}');
				$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
				$('#button').attr("disabled", false);
			
		});
	
		return false;
	
	}
	
	function convert_dbsettings()  {
		
		step ++;
			
		$('#wconvert').html('{$lang['upgr_sett_conv']}');
		$('#ajaxerror').html('');
		
		$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'dbsettingsconvert' },
			function(data){
	
				if (data) {
		
					if (data.status == "ok") {
						var proc = Math.round( (100 * step) / total );
		
						if ( proc > 100 ) proc = 100;
		
						$('#progressbar').css( "width", proc + '%' );
						
						setTimeout("window.location = '?mod=main'", 300 );
		
					}
		
				}
				
			}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

				var error_status = '';
			
				if (jqXHR.status < 200 || jqXHR.status >= 300) {
				  error_status = 'HTTP Error: ' + jqXHR.status;
				} else {
					error_status = 'Invalid JSON: ' + jqXHR.responseText;
				}
		
				$('#status').html('{$lang['upgr_error']}');
				$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
				$('#button').attr("disabled", false);
			
		});
		
		return false;
		
	}
	
{$convert_files}

	$(function() {
		
		$('#button').click(function() {
			$('#button').attr("disabled", "disabled");
			$('#status').html('');
			convert_tables();
			return false;
		});
		
		setTimeout("convert_tables()", 300 );
	});

</script>
<div class="panel panel-default">
  <div class="panel-heading">
    {$lang['upgr_dbtitle_1']}
  </div>
	<div class="panel-body">
		<div class="progress"><div id="progressbar" class="progress-bar progress-blue" style="width:0%;"><span></span></div></div>
		<div class="text-size-small"><span id="wconvert"></span> <span id="status"></span></div>
    </div>

	<div class="panel-body">
		<div id="ajaxerror"></div>
		<div class="text-muted text-size-small">{$lang['upgr_noclose']}</div>
	</div>	
	<div class="panel-footer">
		<button id="button" type="button" class="btn bg-teal btn-sm btn-raised" disabled><i class="fa fa-forward position-left"></i>{$lang['upgr_next']}</button>
	</div>
</div>
HTML;

	echofooter();

} elseif($_REQUEST['action'] == "dbconvert" ) {

	if( COLLATE == "utf8mb4" ) msg( "warning", $lang['all_info'], $lang['upgr_all_conv'] );
	
	echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle']}</span>", $lang['upgr_dbtitle_1']);
	
	$_SESSION['db_convert'] = 1;
	
	$bad_files = files_check_chmod(ROOT_DIR."/engine/data" );
	$bad_files = array_merge($bad_files, files_check_chmod(ROOT_DIR."/templates" ) );

	$errors = "";

	if( version_compare($db->mysql_version, '5.5.3', '<') ) {
		$lang['upgr_minsql'] = str_replace("{version}", $db->mysql_version, $lang['upgr_minsql']);
		$errors = "<div class=\"panel-body\">".$lang['upgr_minsql']."</div>";
	}

	if($_REQUEST['subaction'] == "onlymb4" ) {
		$subaction = "<input type=\"hidden\" name=\"subaction\" value=\"onlymb4\">";
		$lang['upgr_dbtitle_1'] = str_replace("utf-8", "utf8mb4", $lang['upgr_dbtitle_1']);
		$lang['upgr_dbinfo'] = str_replace("utf-8", "utf8mb4", $lang['upgr_dbinfo']);
	} else $subaction = "";
	
	if(count($bad_files)) {
		
		$list = <<<HTML
		  <div>{$lang['upgr_file_2']}</div>
		  <div class="table-responsive pre-scrollable">
			<table class="table table-striped table-xs table-framed"><thead><tr><th>{$lang['upgr_file']}</th><th style="width:150px;">CHMOD</th></thead><tbody>
HTML;
		foreach($bad_files as $file){
			$list .= "<tr><td>$file</td><td><span class=\"text-danger\">{$lang['upgr_file_1']}</span></td></tr>";
		}
		 
		$list .= <<<HTML
		  </tbody></table></div>
HTML;

		$errors .= "<div class=\"panel-body\">".$list."</div>";
	}
	
	if( $errors ) {
		
		$errors .= "<div class=\"panel-body\">".$lang['upgr_c_err']."</div>";
		$button= "<button onclick=\"location.reload(true); return false;\" class=\"btn bg-danger btn-sm btn-raised position-left\"><i class=\"fa fa-refresh position-left\"></i>{$lang['upgr_btn_1']}</button>";

	} else $button= "<button type=\"submit\" class=\"btn bg-teal btn-sm btn-raised position-left\"><i class=\"fa fa-exchange position-left\"></i>{$lang['upgr_btn_2']}</button>";
	
	echo <<<HTML
<form method="get" class="form-horizontal">
<input type="hidden" name="mod" value="upgrade">
<input type="hidden" name="action" value="dodbconvert">
<input type="hidden" name="user_hash" value="{$dle_login_hash}">
{$subaction}
<div class="panel panel-default">
  <div class="panel-heading">
    {$lang['upgr_dbtitle_1']}
  </div>
	<div class="panel-body">
		{$lang['upgr_dbinfo']}
	</div>
	{$errors}
	<div class="panel-footer">
		{$button}
	</div>
</div>
</form>
HTML;

	echofooter();
	
} else {
	
	$errors = "";
	$bad_files = files_check_chmod(ROOT_DIR."/engine/data" );

	if( !is_writable( ROOT_DIR."/engine/data" ) ) $bad_files[] = "/engine/data/";
	if( !is_writable( ROOT_DIR."/engine/cache" ) ) $bad_files[] = "/engine/cache/";
	if( !is_writable( ROOT_DIR."/engine/cache/system" ) ) $bad_files[] = "/engine/cache/system/";
	
	if(COLLATE != "utf8" AND COLLATE != "utf8mb4") {
		$bad_files = array_merge($bad_files, files_check_chmod(ROOT_DIR."/templates" ) );
	}

	if( version_compare($db->mysql_version, '5.5.3', '<') ) {
		$lang['upgr_minsql'] = str_replace("{version}", $db->mysql_version, $lang['upgr_minsql']);
		$errors .= "<div class=\"text-danger\">".$lang['upgr_minsql']."</div>";
	}
	
	$lang['upgr_info'] = str_replace("{oldversion}", $config['version_id'], $lang['upgr_info']);
	$lang['upgr_info'] = str_replace("{newversion}", VERSIONID, $lang['upgr_info']);

	if($errors) $errors = "<div class=\"panel-body\">".$errors."</div>";

	if(count($bad_files)) {
		
		$list = <<<HTML
		  <div>{$lang['upgr_file_2']}</div>
		  <div class="table-responsive pre-scrollable">
			<table class="table table-striped table-xs table-framed"><thead><tr><th>{$lang['upgr_file']}</th><th style="width:150px;">CHMOD</th></thead><tbody>
HTML;
		foreach($bad_files as $file){
			$list .= "<tr><td>$file</td><td><span class=\"text-danger\">{$lang['upgr_file_1']}</span></td></tr>";
		}
		 
		$list .= <<<HTML
		  </tbody></table></div>
HTML;

		$errors .= "<div class=\"panel-body\">".$list."</div>";
	}

	if($errors) {
		
		echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);
		
		$errors .= "<div class=\"panel-body\">".$lang['upgr_c_err']."</div>";

		echo <<<HTML
	<div class="panel panel-default">
	  <div class="panel-heading">
		{$lang['upgr_dbtitle_2']}
	  </div>
	  {$errors}
	  <div class="panel-footer">
		 <button onclick="location.reload(true); return false;" class="btn bg-danger btn-sm btn-raised position-left"><i class="fa fa-refresh position-left"></i>{$lang['upgr_btn_1']}</button>
	   </div>
	</div>
HTML;

		echofooter();
	
	} elseif($_REQUEST['action'] == "dbupgrade" ) {

		$_SESSION['db_upgrade'] = 1;
		
		if (function_exists('opcache_reset')) {
			opcache_reset();
		}
		
		if(isset($_REQUEST['to']) AND $_REQUEST['to'] AND VERSIONID != $_REQUEST['to']) {
			msg("info", $lang['all_info'], $lang['upgr_f_error_7'], array('javascript:location.reload(true);' => $lang['upgr_btn_1'], 'javascript:history.go(-1)' => $lang['func_msg'] ));
		}
		
		if(!version_compare( $config['version_id'], VERSIONID , '<')) {
			
			if( isset($_REQUEST['to']) AND $_REQUEST['to']) {
				header( "Location: ?mod=upgrade&action=dbupgradecheck" );
				die();
			} else {
				msg("info", $lang['all_info'], $lang['upgr_all_upg']);
			}
			
		}

		if( !file_exists( ENGINE_DIR . "/inc/upgrade/" . totranslit($config['version_id']) . ".php" )) {
			
			$lang['upgr_no_upg_files'] = str_replace("{version}", $config['version_id'], $lang['upgr_no_upg_files']);
			msg("error", $lang['addnews_denied'], $lang['upgr_no_upg_files']);
			
		}
		
		if( isset($_REQUEST['to']) AND $_REQUEST['to'] ) {
			$autostart = "setTimeout(\"db_upgrade()\", 100 );";
		} else $autostart = "";
		
		$versions = array();
		$files = glob( ENGINE_DIR . "/inc/upgrade/*.php");
		
		foreach ($files as $file) {
			$version = basename ( $file, ".php" );
			
			if(intval($version) AND version_compare( $version, $config['version_id'] , '>=') ) {
				$versions[] = $version;
			}
			
		}
		
		$total = count($versions);
		
		$versions[] = $actualversion = VERSIONID;
		
		sort($versions, SORT_NUMERIC);
		
		$versions = "['".implode("','", $versions)."']";

		echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);
	
		echo <<<HTML
<script>

	var actualversion = '{$actualversion}';
	var total = {$total};
	var versions = {$versions};
	var step = 0;
	var versions_info = '{$lang['upgr_db_ver']}';

	function db_upgrade()  {
	
		var version = versions[step+1];
		step ++;
		
		$('#button').attr("disabled", "disabled");
		$('#wconvert').html(versions_info + ' <b>' + version + '</b>');
		$('#ajaxerror').html('');
		
		$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'dodbupgrade' },
			function(data){
	
				if (data) {
	
					if (data.status == "ok") {
	
						var proc = Math.round( (100 * step) / total );
	
						if ( proc > 100 ) proc = 100;
	
						$('#progressbar').css( "width", proc + '%' );

						 if (data.version == actualversion)
						 {

							setTimeout("window.location = '?mod=upgrade&action=dbupgradecheck'", 1000 );

						 } else { setTimeout("db_upgrade()", 1000 ); }
	
	
					}
	
				}
			}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

				var error_status = '';
			
				if (jqXHR.status < 200 || jqXHR.status >= 300) {
				  error_status = 'HTTP Error: ' + jqXHR.status;
				} else {
					error_status = 'Invalid JSON: ' + jqXHR.responseText;
				}
		
				$('#status').html('{$lang['upgr_error']}');
				$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
				$('#button').attr("disabled", false);
			
		});
	
		return false;
	
	}
	
	$(function() {
		
		$('#button').click(function() {
			$('#button').attr("disabled", "disabled");
			db_upgrade();
			return false;
		});
		
		{$autostart}

	});

</script>

	<div class="panel panel-default">
	  <div class="panel-heading">
		{$lang['upgr_dbtitle_2']}
	  </div>
		<div class="panel-body">
			{$lang['upgr_info']}
		</div>
		<div class="panel-body">
			<div class="progress"><div id="progressbar" class="progress-bar progress-blue" style="width:0%;"><span></span></div></div>
			<div class="text-size-small"><span id="wconvert"></span> <span id="status"></span></div>
		</div>
		<div class="panel-body">
			<div id="ajaxerror"></div>
			<div class="text-muted text-size-small">{$lang['upgr_noclose_2']}</div>
		</div>	
		<div class="panel-footer">
			<button id="button" type="button" class="btn bg-teal btn-sm btn-raised"><i class="fa fa-forward position-left"></i>{$lang['upgr_next']}</button>
		</div>
	</div>
HTML;

		echofooter();

	} else {
		
		echoheader( "<i class=\"fa fa-database position-left\"></i><span class=\"text-semibold\">{$lang['upgr_dbtitle_2']}</span>", $lang['upgr_dbtitle_3']);
		
		echo <<<HTML
	<div class="panel panel-default">
	  <div class="panel-heading">
		{$lang['upgr_dbtitle_2']}
	  </div>
		<div class="panel-body">
			{$lang['upgr_act_info']}<br /><br /><input type="text" name="sitekey" id="sitekey" placeholder="{$lang['trial_key']}" class="classic width-400 mr-10"><button onclick="dle_activation( 'key' ); return false;" class="btn bg-teal btn-raised btn-sm">{$lang['upgr_next']}</button><br /><br /><div id="result_info">{$lang['key_format']} <b>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</b></div>
		</div>
	</div>
	<div id="ajaxerror"></div>
	<script>
	<!--
	function dle_activation ( code ){
	
		var dle_key = document.getElementById('sitekey').value ;
		
		document.getElementById( 'result_info' ).innerHTML = '{$lang['nl_sinfo']}';
		
		$('#ajaxerror').html('');
		
		$.post("?user_hash={$dle_login_hash}", { mod: 'upgrade', action: 'checklicense', dle_key: dle_key  }, function(data){

			if (data) {
	
				if (data.status == "ok") {
					setTimeout("window.location = '?mod=upgrade&action=download'", 300 );
				} else {
				
					document.getElementById( 'result_info' ).innerHTML = '{$lang['key_format']} <b>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</b>';
					DLEalert(data.error, '{$lang['all_info']}');
					
				}
	
			}
		
		}, "json").fail(function(jqXHR, textStatus, errorThrown ) {

				var error_status = '';
			
				if (jqXHR.status < 200 || jqXHR.status >= 300) {
				  error_status = 'HTTP Error: ' + jqXHR.status;
				} else {
					error_status = 'Invalid JSON: ' + jqXHR.responseText;
				}
		
				$('#status').html('{$lang['upgr_error']}');
				$('#ajaxerror').html('<div class="alert alert-danger alert-styled-left alert-bordered">' + error_status + '</div>');
			
		});
	
		return false;
	}
	//-->
	</script>
HTML;

		echofooter();
		
	}

}

?>

Did this file decode correctly?

Original Code

<?php
/*
=====================================================
 DataLife Engine - by SoftNews Media Group 
-----------------------------------------------------
 https://dle-news.ru/
-----------------------------------------------------
 Copyright (c) 2004,2024 SoftNews Media Group
-----------------------------------------------------
 You use Demo Version of DataLife Engine
=====================================================
*/
?><?php $_F=__FILE__;$_X='PzNqP2dpZwpZKgowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApmbWRVZDVPRnBmbk5oT05wZi1mSFNmUF1GVVZwWGxmenBCT2RmUm9dcmdmCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZpVVVnbDpZWUJ1cC1OcFhsPG9yWQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmL11nU29PaGlVZihNKWZhYmJKLWFiYUpmUF1GVVZwWGxmenBCT2RmUm9dcmcKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZlRpT2xmTV1CcGZPbGZnb11VcE1VcEJmSFNmTV1nU29PaGlVCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCmZJT3VwOmZyZ2hvZEJwPGdpZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpme2xwOmZtNW5mcmdob2RCcAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoqWQoKT0YoZiFCcEZPTnBCKGYnbXhUeDVBSW5uVlJBVm4nZilmYzZmIUJwRk9OcEIoZic1Y1JSbm1fQVYnZilmKWZxCglpcGRCcG8oZiI5VFR9WUU8RWZKYjFmSV1vSE9CQnBOImYpOwoJaXBkQnBvZihmJzVdTWRVT11OOmY8PFk8PFknZik7CglCT3AoZiI5ZE1HT05oZmRVVXBrZ1UhImYpOwo+CgpPRigka3BrSHBvX09CZSdybHBvX2hvXXJnJ1tmITBmRSlxZmtsaCgicG9vXW8iLGYkdWROaGUnZEJCTnBYbF9CcE5PcEInWyxmJHVkTmhlJ0JIX0JwTk9wQidbKTtmPgoKT05NdXJCcF9dTk1wZihtNW59dXJoT05sOjovaXBNRyhuVlJBVm5fbUE2ZjxmJ1lNdWRsbHBsWThPZ3AuVW9kTVU8TXVkbGw8Z2lnJykpOwoKRnJOTVVPXU5mTV1ONHBvVV9GT3VwKGYkRk91cGYpZnEKCQoJJGxVb09OaGYwZkBGT3VwX2hwVV9NXU5VcE5VbCgkRk91cCk7CgkKCU9GKCEkbFVvT05oKWZvcFVyb05mRmR1bHA7CgoJT0YoZkZyTk1VT11OX3AuT2xVbChmJ2tIX01dTjRwb1VfcE5NXUJPTmgnZilmKWZxCgkJJGxVb09OaGYwZmtIX01dTjRwb1VfcE5NXUJPTmgoZiRsVW9PTmgsZiJyVUYtUSIsZiJYT05CXVhsLUVhN0UiZik7Cgk+ZnB1bHBPRihmRnJOTVVPXU5fcC5PbFVsKGYnT01dTjQnZilmKWZxCgkJJGxVb09OaGYwZk9NXU40KCJYT05CXVhsLUVhN0UiLGYiclVGLVEiLGYkbFVvT05oKTsKCT4KCglPRihmJGxVb09OaGYpZnEKCQlGT3VwX2dyVV9NXU5VcE5VbGYoJEZPdXAsZiRsVW9PTmgsZjVjL0xfbnQpOwoJPgoKCW9wVXJvTmZVb3JwOwo+CgpGck5NVU9dTmZOcHBCX01dTjRwb1VfRk91cChmJEZPdXBmKWZxCgkKCSRsVW9PTmhmMGZARk91cF9ocFVfTV1OVXBOVWwoJEZPdXApOwoJCglPRighJGxVb09OaClmb3BVcm9OZkZkdWxwOwoKCU9GKGZGck5NVU9dTl9wLk9sVWwoZidrSF9NXU40cG9VX3BOTV1CT05oJ2YpZilmcQoKCQkkbGRrZ3VwZjBma0hfTV1ONHBvVV9wTk1dQk9OaChmJGxVb09OaCxmInJVRi1RIixmInJVRi1RImYpOwoKCT5mcHVscE9GKGZGck5NVU9dTl9wLk9sVWwoZidPTV1ONCdmKWYpZnEKCQoJCSRsZGtndXBmMGZPTV1ONCgiclVGLVEiLGYiclVGLVEiLGYkbFVvT05oKTsKCQoJPgoKCU9GZihrQjcoJGxka2d1cClmMDBma0I3KCRsVW9PTmgpKWZvcFVyb05mRmR1bHA7CgoJb3BVcm9OZlVvcnA7Cj4KCkZyTk1VT11OZlVkSHVwX01dTjRwb1UoZiRVZEh1cGYpZnEKCWh1XUhkdWYkQkg7CgkKCSRVZEh1cGYwZiRCSC0zbGRGcGx2dShmJFVkSHVwZik7CgkKCSRCSC0zdnJwb1MoZiJ4NVRuNmZUeEs1bmZgcSRVZEh1cD5gZi9jVnNuNlRmVGNmLzl4NngvVG42ZlBuVGZyVUZRa0hKZi9jNTV4VG5mclVGUWtISl9ocE5wb2R1X01PImYpOwoKPgoKRnJOTVVPXU5mTnBwQl9VZEh1cF9NXU40cG9VKGYkVWRIdXBmKWZxCglodV1IZHVmJEJIOwoJCgkkVWRIdXBmMGYkQkgtM2xkRnBsdnUoZiRVZEh1cGYpOwoJCgkkbHZ1ZjBmJEJILTN2cnBvUyhmIlA5Y1dmSXs1NWYvYzV7elZQZkk2Y3pmYCRVZEh1cGAiZik7CgkKCVhpT3VwZihmJG9dWGYwZiRCSC0zaHBVX29dWCgkbHZ1KWYpZnEKCgkJT0ZmKGYkb11YZScvXXV1ZFVPXU4nW2YpZnEKCQkJCgkJCXVPbFUoZiRNaWRvbHBVZilmMGZwLmd1XUJwKGYnXycsZiRvXVhlJy9ddXVkVU9dTidbZik7CgkJCSRNaWRvbHBVZjBmbFVvVV11XVhwbyhmJE1pZG9scFVmKTsKCgkJCU9GZihmJE1pZG9scFVmITAwZidyVUZRa0hKJ2YpZnEKCQkJCW9wVXJvTmZVb3JwOwoJCQk+CgkJPgoJCQoJPgoJCgkkb11YZjBmJEJILTNscmdwb192cnBvUyhmIlA5Y1dmVHhLNW5mUFR4VHtQZjVBTG5mJ3EkVWRIdXA+JyJmKTsKCXVPbFUoZiRVZEh1cF9NaWRvbHBVZilmMGZwLmd1XUJwKGYnXycsZiRvXVhlJy9ddXVkVU9dTidbZik7CgkkVWRIdXBfTWlkb2xwVWYwZmxVb1VddV1YcG8oZiRVZEh1cF9NaWRvbHBVZik7CgkKCU9GZihmJFVkSHVwX01pZG9scFVmITBmJ3JVRlFrSEonKWZxCgkJb3BVcm9OZlVvcnA7Cgk+CgkKCW9wVXJvTmZGZHVscDsKCQo+CgpGck5NVU9dTmZGT3VwbF9NaXBNR19NaWtdQihmJEJPbyxmZiRIZEJfRk91cGxmMGZkb29kUygpZilmcQoJCglPRmYoZiRCaWYwZkBdZ3BOQk9vKGYkQk9vZilmKWZxCgkJCgkJWGlPdXBmKGZGZHVscGYhMDBmKGYkRk91cGYwZm9wZEJCT28oJEJpKWYpZilmcQoJCQkKCQkJT0ZmKGYkRk91cGYwMGYnPCdmXW9mJEZPdXBmMDBmJzw8J2Zdb2YkRk91cGYwMGYnPGw0TidmXW9mJEZPdXBmMDBmJzxtUF9sVV1vcCdmKWZxCgkJCQkJTV1OVU9OcnA7CgkJCT4KCQkKCQkJT0ZmKGZPbF9CT28oZiRCT29mPGYiWSJmPGYkRk91cGYpZilmcQoKCQkJCSRIZEJfRk91cGxmMGZGT3VwbF9NaXBNR19NaWtdQihmJEJPb2Y8ZiJZImY8ZiRGT3VwLGYkSGRCX0ZPdXBsZik7CgkJCQkKCQkJPmZwdWxwZnEKCQkJCQoJCQkJT0ZmKGZnb3BoX2tkVU1pKGYiIzwqXDwoZ2lnfFUuVXxVZ3UpI08iLGYkRk91cGYpZilmcQoJCQkJCSRGXXVCcG9mMGZsVW9fb3BndWRNcCg2Y2NUX21BNixmIiIsJEJPbyk7CgkJCQkJCgkJCQkJT0YoIU9sX1hvT1VkSHVwKCRCT29mPGYiWSJmPGYkRk91cCkpZnEKCQkJCQkJJEhkQl9GT3VwbGVbZjBmJEZddUJwb2Y8ZiJZImY8ZiRGT3VwOwoJCQkJCT4KCQkJCT4KCQkJPgoJCT4KCT4KCQoJb3BVcm9OZiRIZEJfRk91cGw7Cj4KCkZyTk1VT11OZmhwVV9GT3VwbChmJEJPbyxmZiRGT3VwbGYwZmRvb2RTKClmKWZxCgkKCU9GZihmJEJpZjBmQF1ncE5CT28oZiRCT29mKWYpZnEKCQkKCQlYaU91cGYoZkZkdWxwZiEwMGYoZiRGT3VwZjBmb3BkQkJPbygkQmkpZilmKWZxCgkJCQoJCQlPRmYoZiRGT3VwZjAwZic8J2Zdb2YkRk91cGYwMGYnPDwnZl1vZiRGT3VwZjAwZic8bDROJ2Zdb2YkRk91cGYwMGYnPG1QX2xVXW9wJ2YpZnEKCQkJCQlNXU5VT05ycDsKCQkJPgoJCQoJCQlPRmYoZk9sX0JPbyhmJEJPb2Y8ZiJZImY8ZiRGT3VwZilmKWZxCgoJCQkJJEZPdXBsZjBmaHBVX0ZPdXBsKGYkQk9vZjxmIlkiZjxmJEZPdXAsZiRGT3VwbGYpOwoJCQkJCgkJCT5mcHVscGZxCgkJCQkKCQkJCU9GZihmZ29waF9rZFVNaShmIiM8Klw8KGdpZ3xVLlV8VWd1KSNPIixmJEZPdXBmKWYpZnEKCQkJCQkkRl11QnBvZjBmbFVvX29wZ3VkTXAoNmNjVF9tQTYsZiIiLCRCT28pOwoJCQkJCSRGT3VwbGVbZjBmJEZddUJwb2Y8ZiJZImY8ZiRGT3VwOwoJCQkJPgoJCQk+CgkJPgoJPgoJCglvcFVyb05mJEZPdXBsOwo+CgpPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJyZ2hvZEJwX0ZPdXBsImYpZnEKCQoJCU9GKGYhT2xscFUoJF82bjJ7blBUZSdybHBvX2lkbGknWylmYzZmISRfNm4ye25QVGUncmxwb19pZGxpJ1tmYzZmJF82bjJ7blBUZSdybHBvX2lkbGknW2YhMGYkQnVwX3VdaE9OX2lkbGlmKWZxCgkJCUJPcChmIjlkTUdPTmhmZFVVcGtnVSFme2xwb2ZOXVVmRl1yTkIiZik7CgkJPgoJCgkJJEJPbFVvX0ZPdXBmMGZuVlJBVm5fbUE2ZjxmIllNZE1pcFlsU2xVcGtZImY8ZmtCNygncmhvQk9sVW8nPFBuL3s2bl94e1Q5X0xuWilmPGYiPDhPZyI7CgkJCgkJJEJdTnBmMGZiOwoKCQlVb1NmcQoJCQkKCQkJJEZsZjBmTnBYZkJ1cF84T2dfcC5Vb2RNVShmJEJPbFVvX0ZPdXBmKTsKCQkJJFVdVWR1ZjBmJEZsLTM4T2ctM05ya0lPdXBsOwoJCQkKCQkJJF1GRmxwVWYwZk9OVTRkdSgkX31jUFRlJ11GRmxwVSdbKTsKCQkJCgkJCU9GKGYkX1BuUFBBY1ZlJ0JPbFVvJ1tlJ0ZVZydbZikJcQoJCQkJJEZsLTNJVWcvXU5OcE1VKGYkX1BuUFBBY1ZlJ0JPbFVvJ1tlJ0ZVZydbZik7CgkJCT4KCQkJCgkJCSRCXU5wZjBmJEZsLTNuLlVvZE1VIE9neG9NaU80cCgkXUZGbHBVLGZFYmIpOwoJCQkKCQkJT0ZmKEZyTk1VT11OX3AuT2xVbCgnXWdNZE1pcF9vcGxwVScpKWZxCgkJCQldZ01kTWlwX29wbHBVKCk7CgkJCT4KCQkKCQk+Zk1kVU1pZihmbi5NcGdVT11OZiRwZilmcQoJCgkJCSRvcGxnXU5scGUncG9vXW8nW2YwZiRwLTNocFV6cGxsZGhwKCk7CgkJCXBNaV1meWxdTl9wTk1dQnAoJG9wbGddTmxwKTsKCQkJQk9wKCk7CgkJCQoJCT4KCQkKCQlPRihmIU9sbHBVKCRfUG5QUEFjVmUnRk91cGxfcG9vXW9sJ1spZilmJF9QblBQQWNWZSdGT3VwbF9wb29db2wnW2YwZmRvb2RTKCk7CgkKCQlPRihmJEJdTnBmKQlxCgkJCSRdRkZscFVmMGYkXUZGbHBVZitmJEJdTnA7CgkJPmZwdWxwZnEKCQkJJF1GRmxwVWYwZiRVXVVkdTsKCQk+CgkJCgkJT0YoJF1GRmxwVWYzMGYkVV1VZHUpcQoJCQkkRmwtM0lPLjlVZE1NcGxsKCk7CgkJCUByTnVPTkcoblZSQVZuX21BNjwnWUJkVWRZbE5kZzxCSCcpOwoJCQlNdXBkb19kdXVfTWRNaXBsKCk7CgkJPgoJCQoJCU9GKGYkX1BuUFBBY1ZlJ0JPbFVvJ1tlJ0ZVZydbZikJcQoJCQkkRmwtM21PbE1dTk5wTVVJVH0oKTsKCQk+CgkJCgkJT0YoZk1dck5VKCRGbC0zcG9vXW9sX3VPbFUpZilmJF9QblBQQWNWZSdGT3VwbF9wb29db2wnW2YwZmRvb2RTX2twb2hwKCRfUG5QUEFjVmUnRk91cGxfcG9vXW9sJ1ssZiRGbC0zcG9vXW9sX3VPbFUpOwoJCQoJCXBNaV1mInFcImxVZFVybFwiOmZcIl1HXCIsZlwiXUZGbHBVXCI6ZlwicSRdRkZscFU+XCI+IjsKCQlCT3AoKTsKCgo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJNaXBNR0ZVZyJmKWZxCgkKCU9GKGYhT2xscFUoJF82bjJ7blBUZSdybHBvX2lkbGknWylmYzZmISRfNm4ye25QVGUncmxwb19pZGxpJ1tmYzZmJF82bjJ7blBUZSdybHBvX2lkbGknW2YhMGYkQnVwX3VdaE9OX2lkbGlmKWZxCgkJQk9wKGYiOWRNR09OaGZkVVVwa2dVIWZ7bHBvZk5dVWZGXXJOQiJmKTsKCT4KCQoJVW9TZnEKCQkKCQkkRmxmMGZOcFhmQnVwXzhPZ19wLlVvZE1VKCk7CgkJJEZsLTNJVWcvXU5OcE1VKGYkX31jUFRlJ0ZVZydbZik7CgkJCgk+Zk1kVU1pZihmbi5NcGdVT11OZiRwZilmcQoJCQoJCSRvcGxnXU5scGUncG9vXW8nW2YwZiRwLTNocFV6cGxsZGhwKCk7CgkJcE1pXWZ5bF1OX3BOTV1CcCgkb3BsZ11ObHApOwoJCUJPcCgpOwoJPgoKCSRfUG5QUEFjVmUnQk9sVW8nW2UnRlVnJ1tmMGYkX31jUFRlJ0ZVZydbOwoJCglwTWldZiJxXCJsVWRVcmxcIjpmXCJdR1wiPiI7CglCT3AoKTsKCQo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJCXVhOdV1kQiJmKWZxCgkKCU9GZihmIU9sbHBVKGYkX1BuUFBBY1ZlJ0JPbFVvJ1tmKWYpCXEKCQlpcGRCcG8oZiI1XU1kVU9dTjpmP2tdQjByZ2hvZEJwImYpOwoJCUJPcCgpOwoJPgoJCgkkTl1fZE1NcGxsZjBmRk91cGxfTWlwTUdfTWlrXUIoNmNjVF9tQTY8IllwTmhPTnAiZik7CgoKCU9GKCRfNm4ye25QVGUnbHJIZE1VT11OJ1tmMDBmImtkTnJkdSJmYzZmIU11ZGxsX3AuT2xVbCgnIE9neG9NaU80cCcpZilmcQoJCQoJCXBNaV1pcGRCcG8oZiJqT2ZNdWRsbDBcIkZkZkZkLUJkVWRIZGxwZmddbE9VT11OLXVwRlVcIjNqWU8zamxnZE5mTXVkbGwwXCJVcC5VLWxwa09IXXVCXCIzcSR1ZE5oZSdyZ2hvX0JIVU9VdXBfYSdbPmpZbGdkTjMiLGYkdWROaGUncmdob19CSFVPVXVwXzEnWyk7CgkJCgkJJHVkTmhlJ3JnaG9fRlVnX0ViJ1tmMGZsVW9fb3BndWRNcCgicXVPTkc+IixmImpkZmlvcEYwXCJxJF9QblBQQWNWZSdCT2xVbydbZSd1T05HJ1s+XCJmVWRvaHBVMFwiX0h1ZE5HXCIzcSR1ZE5oZSdyZ2hvX0ZVZ19FRSdbPmZxJF9QblBQQWNWZSdCT2xVbydbZSc0cG9sT11OJ1s+allkMyIsZiR1ZE5oZSdyZ2hvX0ZVZ19FYidbKTsKCQkKCQlwTWldZmpqajlUejUKCWpCTzRmTXVkbGwwImdkTnB1ZmdkTnB1LUJwRmRydVUiMwoJZmZqQk80Zk11ZGxsMCJnZE5wdS1pcGRCT05oIjMKCQlxJHVkTmhlJ3JnaG9fQkhVT1V1cF9hJ1s+CglmZmpZQk80MwoJCWpCTzRmTXVkbGwwImdkTnB1LUhdQlMiMwoJCQlxJHVkTmhlJ3JnaG9fRlVnX3cnWz4KCQlqWUJPNDMKCQlqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQkJal11M3EkdWROaGUncmdob19GVWdfRWInWz5qWV11MwoJCWpZQk80MwoJZmZqQk80Zk11ZGxsMCJnZE5wdS1GXV1VcG8iMwoJCWZqZGZpb3BGMCI/a11CMHJnaG9kQnAmZE1VT11OMEJIcmdob2RCcCZVXTBxJF9QblBQQWNWZSdCT2xVbydbZSc0cG9sT11OJ1s+ImZNdWRsbDAiSFVOZkhoLVVwZHVmSFVOLWxrZkhVTi1vZE9scEIiM2pPZk11ZGxsMCJGZGZGZC1GXW9YZG9CZmddbE9VT11OLXVwRlUiM2pZTzNxJHVkTmhlJ3JnaG9fTnAuVSdbPmpZZDMKCWZmZmpZQk80MwoJallCTzQzCjlUejU7CgoJCU9GKGYhTXVkbGxfcC5PbFVsKCcgT2d4b01pTzRwJylmKWZxCgkJCXBNaV1mImpCTzRmTXVkbGwwXCJkdXBvVWZkdXBvVS1YZG9OT05oZmR1cG9VLWxVU3VwQi11cEZVZmR1cG9VLWRvb11YLXVwRlVmZHVwb1UtTV1rZ11OcE5VXCIzcSR1ZE5oZSdyZ2hvX0ZfcG9vXW9fRXcnWz5qWUJPNDMiOwoJCT4KCQkKCQlwTWldRl1dVXBvKCk7CgkJCgk+ZnB1bHBPRihmTV1yTlUoJE5dX2RNTXBsbClmeFZtZiFPbGxwVShmJF9QblBQQWNWZSdCT2xVbydbZSdGVWcnW2YpZilmcQoJCQoJCXBNaV1pcGRCcG8oZiJqT2ZNdWRsbDBcIkZkZkZkLUJkVWRIZGxwZmddbE9VT11OLXVwRlVcIjNqWU8zamxnZE5mTXVkbGwwXCJVcC5VLWxwa09IXXVCXCIzcSR1ZE5oZSdyZ2hvX0JIVU9VdXBfYSdbPmpZbGdkTjMiLGYkdWROaGUncmdob19CSFVPVXVwXzEnWyk7CgoJCSRvXV1VZjBmNmNjVF9tQTY7CgoJCXBNaV1mampqOVR6NQoJakZdb2tmTXVkbGwwIkZdb2staV1vTzhdTlVkdSJmT0IwIkZVZ2xwbzRwbyIzCglqQk80Zk11ZGxsMCJnZE5wdWZnZE5wdS1CcEZkcnVVIjMKCWZmakJPNGZNdWRsbDAiZ2ROcHUtaXBkQk9OaCIzCgkJcSR1ZE5oZSdyZ2hvX0JIVU9VdXBfYSdbPgoJZmZqWUJPNDMKCQlqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQkJcSR1ZE5oZSdyZ2hvX0ZVZ19FJ1s+CgkJallCTzQzCgkJakJPNGZNdWRsbDAiZ2ROcHUtSF1CUyIzCgkJCWpCTzRmTXVkbGwwIkZdb2staG9dcmciMwoJCQkJanVkSHB1Zk11ZGxsMCJNXU5Vb111LXVkSHB1Zk1ddS1say1hIjNxJHVkTmhlJ3JnaG9fRlVnX2EnWz5qWXVkSHB1MwoJCQkJakJPNGZNdWRsbDAiTV11LWxrLUViIjMKCQkJCQlqdWRIcHVmTXVkbGwwIm9kQk9dLU9OdU9OcGZnXWxPVU9dTi11cEZVIjNqT05nclVmTXVkbGwwIk9NaXBNRyJmVVNncDAib2RCT10iZk5ka3AwIkZVZ2VVU2dwWyJmNGR1cnAwIkZVZyJmTWlwTUdwQjNJVH1qWXVkSHB1MwoJCQkJCWp1ZEhwdWZNdWRsbDAib2RCT10tT051T05wZmddbE9VT11OLXVwRlUiM2pPTmdyVWZNdWRsbDAiT01pcE1HImZVU2dwMCJvZEJPXSJmTmRrcDAiRlVnZVVTZ3BbImY0ZHVycDAibGx1RlVnIjNQUDVmSVR9all1ZEhwdTMKCQkJCQlqdWRIcHVmTXVkbGwwIm9kQk9dLU9OdU9OcGZnXWxPVU9dTi11cEZVIjNqT05nclVmTXVkbGwwIk9NaXBNRyJmVVNncDAib2RCT10iZk5ka3AwIkZVZ2VVU2dwWyJmNGR1cnAwImxsaWEiM1BJVH1mUFA5YWpZdWRIcHUzCgkJCQlqWUJPNDMKCQkJallCTzQzCgkJCWpCTzRmTXVkbGwwIkZdb2staG9dcmciMwoJCQkJanVkSHB1Zk11ZGxsMCJNXU5Vb111LXVkSHB1Zk1ddS1say1hIjNxJHVkTmhlJ3JnaG9fRlVnXzEnWz5qWXVkSHB1MwoJCQkJakJPNGZNdWRsbDAiTV11LWxrLUViIjMKCQkJCQlqT05nclVmVVNncDAiVXAuVSJmTXVkbGwwIkZdb2stTV1OVW9ddWZYT0JVaS0xN2JmZ11sT1VPXU4tdXBGVSJmTmRrcDAiRlVnZWxwbzRwb1siMwoJCQkJCWpsZ2ROZk11ZGxsMCJnXWxPVU9dTi11cEZVIjNxJHVkTmhlJ3JnaG9fRlVnX0onWz5qWWxnZE4zCgkJCQkJak9OZ3JVZlVTZ3AwIlVwLlUiZk11ZGxsMCJGXW9rLU1dTlVvXXVmZ11sT1VPXU4tdXBGVSJmTmRrcDAiRlVnZWddb1VbImZsVVN1cDAiWE9CVWk6SjdnLiJmNGR1cnAwImFFIjMKCQkJCWpZQk80MwoJCQlqWUJPNDMKCQkJakJPNGZNdWRsbDAiRl1vay1ob11yZyIzCgkJCQlqdWRIcHVmTXVkbGwwIk1dTlVvXXUtdWRIcHVmTV11LWxrLWEiM3EkdWROaGUncmdob19GVWdfNydbPmpZdWRIcHUzCgkJCQlqQk80Zk11ZGxsMCJNXXUtbGstRWIiMwoJCQkJCWpPTmdyVWZVU2dwMCJVcC5VImZNdWRsbDAiRl1vay1NXU5Vb111ZlhPQlVpLTE3YmZnXWxPVU9dTi11cEZVImZOZGtwMCJGVWdlcmxwb05ka3BbIjMKCQkJCWpZQk80MwoJCQlqWUJPNDMKCQkJakJPNGZNdWRsbDAiRl1vay1ob11yZyIzCgkJCQlqdWRIcHVmTXVkbGwwIk1dTlVvXXUtdWRIcHVmTV11LWxrLWEiM3EkdWROaGUncmdob19GVWdfQydbPmpZdWRIcHUzCgkJCQlqQk80Zk11ZGxsMCJNXXUtbGstRWIiMwoJCQkJCWpPTmdyVWZVU2dwMCJVcC5VImZNdWRsbDAiRl1vay1NXU5Vb111ZlhPQlVpLTE3YmZnXWxPVU9dTi11cEZVImZOZGtwMCJGVWdlZ2RsbFhdb0JbIjMKCQkJCWpZQk80MwoJCQlqWUJPNDMKCQkJakJPNGZNdWRsbDAiRl1vay1ob11yZyIzCgkJCQlqdWRIcHVmTXVkbGwwIk1dTlVvXXUtdWRIcHVmTV11LWxrLWEiM3EkdWROaGUncmdob19GVWdfPSdbPmpZdWRIcHUzCgkJCQlqQk80Zk11ZGxsMCJNXXUtbGstRWIiMwoJCQkJCWpPTmdyVWZVU2dwMCJVcC5VImZNdWRsbDAiRl1vay1NXU5Vb111ZlhPQlVpLUo3YmZnXWxPVU9dTi11cEZVImZOZGtwMCJGVWdlZ2RVaVsiZjRkdXJwMCJxJG9dXVU+IjMKCQkJCWpZQk80MwoJCQlqWUJPNDMKCQlqWUJPNDMKCWZmakJPNGZNdWRsbDAiZ2ROcHUtRl1dVXBvIjMKCQlmakhyVVVdTmZPQjAiSHJVVV1OImZdTk11T01HMCJNaXBNR19GVWcoKTtmb3BVcm9OZkZkdWxwOyJmVVNncDAiSHJVVV1OImZNdWRsbDAiSFVOZkhoLVVwZHVmSFVOLWxrZkhVTi1vZE9scEJmZ11sT1VPXU4tdXBGVSIzak9mTXVkbGwwIkZkZkZkLUZdb1hkb0JmZ11sT1VPXU4tdXBGVSIzallPM3EkdWROaGUncmdob19OcC5VJ1s+allIclVVXU4zCgkJZmpkZmlvcEYwIj9rXUIwcmdob2RCcCZkTVVPXU4wQl1YTnVdZEImbHJIZE1VT11OMGtkTnJkdSJmTXVkbGwwIkhVTmZIaC1Ib11YTi1DYmJmSFVOLWxrZkhVTi1vZE9scEIiM2pPZk11ZGxsMCJGZGZGZC1CXVhOdV1kQmZnXWxPVU9dTi11cEZVIjNqWU8zcSR1ZE5oZSdyZ2hvX0ZVZ19RJ1s+allkMwoJZmZmallCTzQzCglqbE1vT2dVMwoJaiEtLQoJRnJOTVVPXU5mTWlwTUdfRlVnKClmcQoJCgkJNGRvZkZdb2ttZFVkZjBmTnBYZkldb2ttZFVkKCQoJyNGVWdscG80cG8nKWViWyk7CgkJCgkJUGldWDVdZEJPTmgoJycpOwoJCSQoJyNIclVVXU4nKTxkVVVvKCJCT2xkSHVwQiIsZiJCT2xkSHVwQiIpOwoJCQoJCSQ8ZHlkLihxCgkJCXJvdTpmIj9rXUIwcmdob2RCcCZkTVVPXU4wTWlwTUdGVWcmcmxwb19pZGxpMHEkQnVwX3VdaE9OX2lkbGk+IiwKCQkJQmRVZDpmRl1va21kVWQsCgkJCWdvXU1wbGxtZFVkOmZGZHVscCwKCQkJTV1OVXBOVVRTZ3A6ZkZkdWxwLAoJCQlVU2dwOmYnfWNQVCcsCgkJCUJkVWRUU2dwOmYneWxdTicsCgkJCWxyTU1wbGw6ZkZyTk1VT11OKEJkVWQpZnEKCQkJCgkJCQk5T0JwNV1kQk9OaCgnJyk7CgkJCQkKCQkJCU9GZihCZFVkPGxVZFVybGYwMGYiXUciKWZxCgkJCQkJbHBVVE9rcF1yVSgiWE9OQl1YPHVdTWRVT11OZjBmJz9rXUIwcmdob2RCcCZkTVVPXU4wQl1YTnVdZEInIixmMWJiZik7CgkJCQk+ZnB1bHBmcQoJCQkJCSQoJyNIclVVXU4nKTxkVVVvKCJCT2xkSHVwQiIsZkZkdWxwKTsKCQkJCQltNW5kdXBvVShCZFVkPHBvb11vLGYncSR1ZE5oZSdkdXVfT05GXSdbPicpOwoJCQkJCQkKCQkJCT4KCQkJPgoJCT4pOwoJCgkJb3BVcm9OZkZkdWxwOwoJPgoJWVktLTMKCWpZbE1vT2dVMwoJallCTzQzCglqWUZdb2szCjlUejU7CgoJCXBNaV1GXV1VcG8oKTsKCQkKCT5mcHVscGZxCgkJCgkJJEJPbFVvX0ZPdXBmMGZuVlJBVm5fbUE2ZjxmIllNZE1pcFlsU2xVcGtZImY8ZmtCNygncmhvQk9sVW8nPFBuL3s2bl94e1Q5X0xuWilmPGYiPDhPZyI7CgkJQHJOdU9ORyhmJEJPbFVvX0ZPdXBmKTsKCgkJJGRvby9dTlVwLlVjZ1VPXU5sMGRvb2RTKAoJCWZmZmYibGx1IjAzZG9vZFMoCgkJZmZmZmZmZmYiNHBvT0ZTX2dwcG8iMDNGZHVscCwKCQlmZmZmZmZmZiI0cG9PRlNfZ3Bwb19OZGtwIjAzRmR1bHAsCgkJZmZmZiksCgkJKTsKCgkJT0ZmKGYhQE1dZ1MoJF9QblBQQWNWZSdCT2xVbydbZSd1T05HJ1ssZiRCT2xVb19GT3VwLGZsVW9wZGtfTV1OVXAuVV9Nb3BkVXAoJGRvby9dTlVwLlVjZ1VPXU5sKWYpZilmcQoJCQlrbGgoZiJwb29dbyIsZiR1ZE5oZSdkQkJOcFhsX3Bvb11vJ1ssZiR1ZE5oZSdyZ2hvX0ZfcG9vXW9fUSdbLGZkb29kUygneWQ0ZGxNb09nVTp1XU1kVU9dTjxvcHVdZEIoVW9ycCk7J2YwM2YkdWROaGUncmdob19IVU5fRSdbLGYnP2tdQjByZ2hvZEJwJmRNVU9dTjBCXVhOdV1kQiZsckhkTVVPXU4wa2ROcmR1J2YwM2YkdWROaGUncmdob19GVWdfUSdbZilmKTsKCQk+CgkJCgkJT0YoZmtCN19GT3VwKCRCT2xVb19GT3VwKWYhMGYkX1BuUFBBY1ZlJ0JPbFVvJ1tlJ01vTSdbKWZxCgkJCWtsaChmInBvb11vIixmJHVkTmhlJ2RCQk5wWGxfcG9vXW8nWyxmJHVkTmhlJ3JnaG9fRl9wb29db193J1ssZmRvb2RTKCd5ZDRkbE1vT2dVOnVdTWRVT11OPG9wdV1kQihVb3JwKTsnZjAzZiR1ZE5oZSdyZ2hvX0hVTl9FJ1ssZic/a11CMHJnaG9kQnAmZE1VT11OMEJdWE51XWRCJmxySGRNVU9dTjBrZE5yZHUnZjAzZiR1ZE5oZSdyZ2hvX0ZVZ19RJ1tmKWYpOwoJCT4KCQkKCQkkRmxmMGZOcFhmQnVwXzhPZ19wLlVvZE1VKGYkQk9sVW9fRk91cGYpOwoJCSRVXVVkdWYwZiRGbC0zOE9nLTNOcmtJT3VwbDsKCgkJbTVuSU91cGw6Ok9OT1UoZmIsZkZkdWxwLGYnJyk7CgkJJG9dXVV1T2xVZjBmbTVuSU91cGw6OjVPbFVtT29wTVVdb1MoZicnLGZkb29kUygnZ2lnJyksZmJmKTsKCQkKCQlGXW9wZE1pZihmJG9dXVV1T2xVZSdGT3VwbCdbZmRsZiRvXV1VRk91cGYpZnEKCQkJJEJkVWRmMGZtNW5JT3VwbDo6NnBkQihmJG9dXVVGT3VwZSdOZGtwJ1ssZmJmKTsKCQkJCQoJCQlPRihmbFVvT2ddbChmJEJkVWQsZid7bHA6Zi9vXU5mXWdwb2RVT11ObCdmKWYhMDBmRmR1bHBmKWZxCgkJCQkKCQkJCU9GKGZsVW9PZ11sKGYkQmRVZCxmJyRkdXVdWF9Nb11OZjBmYjsnZilmMDAwZkZkdWxwZilmcQoJCQkJCSRfUG5QUEFjVmUnTW9dTkZPdXAnW2YwZiRvXV1VRk91cGUnTmRrcCdbOwoJCQkJPgoJCQkJCgkJCQlIb3BkRzsKCQkJPgoJCQoJCT4KCgkJcE1pXWlwZEJwbyhmImpPZk11ZGxsMFwiRmRmRmQtQmRVZEhkbHBmZ11sT1VPXU4tdXBGVVwiM2pZTzNqbGdkTmZNdWRsbDBcIlVwLlUtbHBrT0hddUJcIjNxJHVkTmhlJ3JnaG9fQkhVT1V1cF9hJ1s+allsZ2ROMyIsZiR1ZE5oZSdyZ2hvX0JIVU9VdXBfMSdbKTsKCQkKCQlwTWldZmpqajlUejUKCQkJakJPNGZNdWRsbDAiZ2ROcHVmZ2ROcHUtQnBGZHJ1VSIzCgkJCWZmakJPNGZNdWRsbDAiZ2ROcHUtaXBkQk9OaCIzCgkJCQlxJHVkTmhlJ3JnaG9fRlVnX0VhJ1s+CgkJCWZmallCTzQzCgkJCQlqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQkJCQlqQk80Zk11ZGxsMCJnb11ob3BsbCIzakJPNGZPQjAiZ29daG9wbGxIZG8iZk11ZGxsMCJnb11ob3BsbC1IZG9mZ29daG9wbGwtSHVycCJmbFVTdXAwIlhPQlVpOmIlOyIzamxnZE4zallsZ2ROM2pZQk80M2pZQk80MwoJCQkJCWpCTzRmTXVkbGwwIlVwLlUtbE84cC1sa2R1dSIzcSR1ZE5oZSdyZ2hvX0ZVZ19FSidbPmZqbGdkTmZPQjAiRk91cGxfXUciM2pZbGdkTjNmamxnZE5mT0IwImxVZFVybCIzallsZ2ROM2pZQk80MwoJCQkJallCTzQzCgkJCQlqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQkJCQlqQk80Zk9CMCJkeWQucG9vXW8iM2pZQk80MwoJCQkJCWpCTzRmTXVkbGwwIlVwLlUta3JVcEJmVXAuVS1sTzhwLWxrZHV1IjNxJHVkTmhlJ3JnaG9fRlVnX0UxJ1s+allCTzQzCgkJCQlqWUJPNDMJCgkJCQlqQk80Zk11ZGxsMCJnZE5wdS1GXV1VcG8iMwoJCQkJCWpIclVVXU5mT0IwIkhyVVVdTiJmVVNncDAiSHJVVV1OImZNdWRsbDAiSFVOZkhoLVVwZHVmSFVOLWxrZkhVTi1vZE9scEIiZkJPbGRIdXBCM2pPZk11ZGxsMCJGZGZGZC1GXW9YZG9CZmddbE9VT11OLXVwRlUiM2pZTzNxJHVkTmhlJ3JnaG9fTnAuVSdbPmpZSHJVVV1OMwoJCQkJallCTzQzCgkJCWpZQk80MwpqbE1vT2dVMwoKCTRkb2ZVXVVkdWYwZnEkVV1VZHU+OwoJNGRvZl1GRmxwVWYwZmI7CgoJRnJOTVVPXU5mcmdob2RCcF9GT3VwbChdRkZscFUpZmZxCgoJCSQoJyNkeWQucG9vXW8nKTxpVWt1KCcnKTsKCgkJJDxnXWxVKCI/cmxwb19pZGxpMHEkQnVwX3VdaE9OX2lkbGk+IixmcWZrXUI6ZidyZ2hvZEJwJyxmZE1VT11OOmYncmdob2RCcF9GT3VwbCcsZl1GRmxwVTpmXUZGbHBVZj4sCgkJCUZyTk1VT11OKEJkVWQpcQoJCQkJT0ZmKEJkVWQpZnEKCQkJCQlPRmYoQmRVZDxsVWRVcmxmMDBmIl1HIilmcQoJCQkJCQoJCQkJCQldRkZscFVmMGZCZFVkPF1GRmxwVTsKCgkJCQkJCSQoJyNGT3VwbF9dRycpPFVwLlUoXUZGbHBVKTsKCQkJCQkJCgkJCQkJCTRkb2Znb11NZjBmemRVaTxvXXJOQihmKEViYmYqZkJkVWQ8XUZGbHBVKWZZZlVdVWR1Zik7CgkKCQkJCQkJT0ZmKGZnb11NZjNmRWJiZilmZ29dTWYwZkViYjsKCQoJCQkJCQkkKCcjZ29daG9wbGxIZG8nKTxNbGwoZiJYT0JVaSIsZmdvXU1mK2YnJSdmKTsKCgkJCQkJCWZPRmYoQmRVZDxdRkZscFVmMzBmVV1VZHUpCgkJCQkJCWZxCgkJCQkJCQlscFVUT2twXXJVKCJYT05CXVg8dV1NZFVPXU5mMGYnP2tdQjByZ2hvZEJwJmRNVU9dTjBCSHJnaG9kQnAmVV0wcSRfUG5QUEFjVmUnQk9sVW8nW2UnNHBvbE9dTidbPiciLGZFYmJmKTsKCQkJCQkJCQoJCQkJCQlmPmZwdWxwZnFmbHBVVE9rcF1yVSgicmdob2RCcF9GT3VwbCgiZitmQmRVZDxdRkZscFVmK2YiKSIsZjFiYmYpO2Y+CgkKCQoJCQkJCT5mcHVscGZPRihmQmRVZDxwb29db2YpZnFmJCgnI2xVZFVybCcpPFVwLlUoQmRVZDxwb29dbyk7Zj4KCQoJCQkJPgoJCQk+LGYieWxdTiIpPEZkT3UoRnJOTVVPXU4oeXZ0OTYsZlVwLlVQVWRVcmwsZnBvb11vVGlvXVhOZilmcQoKCQkJCTRkb2Zwb29db19sVWRVcmxmMGYnJzsKCQkJCgkJCQlPRmYoeXZ0OTY8bFVkVXJsZmpmYWJiZnx8Znl2dDk2PGxVZFVybGYzMGYxYmIpZnEKCQkJCWZmcG9vXW9fbFVkVXJsZjBmJzlUVH1mbm9vXW86ZidmK2Z5dnQ5NjxsVWRVcmw7CgkJCQk+ZnB1bHBmcQoJCQkJCXBvb11vX2xVZFVybGYwZidBTjRkdU9CZkRQY1Y6ZidmK2Z5dnQ5NjxvcGxnXU5scFRwLlU7CgkJCQk+CgkJCgkJCQkkKCcjbFVkVXJsJyk8aVVrdSgncSR1ZE5oZSdyZ2hvX3Bvb11vJ1s+Jyk7CgkJCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnakJPNGZNdWRsbDAiZHVwb1VmZHVwb1UtQmROaHBvZmR1cG9VLWxVU3VwQi11cEZVZmR1cG9VLUhdb0Jwb3BCIjMnZitmcG9vXW9fbFVkVXJsZitmJ2pZQk80MycpOwoJCQkJJCgnI0hyVVVdTicpPGRVVW8oIkJPbGRIdXBCIixmRmR1bHApOwoJCQkKCQk+KTsKCQoJCW9wVXJvTmZGZHVscDsKCQoJPgoKCSQoRnJOTVVPXU4oKWZxCgkJCgkJJCgnI0hyVVVdTicpPE11T01HKEZyTk1VT11OKClmcQoJCQkkKCcjSHJVVV1OJyk8ZFVVbygiQk9sZEh1cEIiLGYiQk9sZEh1cEIiKTsKCQkJcmdob2RCcF9GT3VwbChdRkZscFUpOwoJCQlvcFVyb05mRmR1bHA7CgkJPik7CgkJCgkJbHBVVE9rcF1yVSgicmdob2RCcF9GT3VwbChdRkZscFUpIixmMWJiZik7Cgk+KTsKallsTW9PZ1UzCjlUejU7CgoJCXBNaV1GXV1VcG8oKTsKCT4KCQoKCQo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJNaXBNR3VPTXBObHAiZilmcQoKCU9GKGYhT2xscFUoJF82bjJ7blBUZSdybHBvX2lkbGknWylmYzZmISRfNm4ye25QVGUncmxwb19pZGxpJ1tmYzZmJF82bjJ7blBUZSdybHBvX2lkbGknW2YhMGYkQnVwX3VdaE9OX2lkbGlmKWZxCgkJQk9wKGYiOWRNR09OaGZkVVVwa2dVIWZ7bHBvZk5dVWZGXXJOQiJmKTsKCT4KCQoJT0YoZmxVb3VwTihVb09rKChsVW9PTmgpJF82bjJ7blBUZSdCdXBfR3BTJ1spKWYhMGZhd2YpcQoJCXBNaV1mInFcInBvb11vXCI6ZlwicSR1ZE5oZSdyZ2hvX0ZfcG9vXW9fNydbPlwiPiI7CgkJQk9wKCk7Cgk+CgkKCSRnZG9ka2xmMGZkb29kUygKCQknZE1VT11OJ2YwM2YnT05GXScsCgkJJ0Jda2RPTidmMDNmJF9QbjZzbjZlJzlUVH1fOWNQVCdbLAoJCSdHcFMnZjAzZihsVW9PTmgpJF82bjJ7blBUZSdCdXBfR3BTJ1ssCgkJJzRwb2xPXU4nZjAzZnNuNlBBY1ZBbSwKCQknSHJPdUInZjAzZkt7QTVtQW0sCgkJJ2xPVXBfR3BTJ2YwM2ZocFVfQl1rcE5faWRsaSgpCgkpOwoKCSRCZFVkZjBmaVVVZ19ocFVfTV1OVXBOVWwoImlVVWdsOllZQnVwLU5wWGw8b3JZcC5Vb2RsWXJnaG9kQnBZT05CcC48Z2lnPyI8aVVVZ19Ick91Ql92cnBvUygkZ2RvZGtsLGYnJyxmJyYnKWYpOwoKCU9GKGYkQmRVZGYhMDBmRmR1bHBmKWZxCgoJCSRCZFVkZjBmeWxdTl9CcE1dQnBmKCRCZFVkLGZVb3JwKTsKCgkJT0YoT2xfZG9vZFMoJEJkVWQpZilmcQoKCQkJT0YoZk9sbHBVKCRCZFVkZSdwb29dbydbKWZ4Vm1mJEJkVWRlJ3Bvb11vJ1spZnEKCQkJCQoJCQkJT0YoZiRCZFVkZSdwb29dbydbZjAwZiItMSJmKWYkQmRVZGUncG9vXW8nW2YwZiR1ZE5oZSdyZ2hvX0ZfcG9vXW9fYSdbOwoJCQkJT0YoZiRCZFVkZSdwb29dbydbZjAwZiItYSJmKWYkQmRVZGUncG9vXW8nW2YwZiR1ZE5oZSdyZ2hvX0ZfcG9vXW9fMSdbOwoJCQkJT0YoZiRCZFVkZSdwb29dbydbZjAwZiItRSJmKWYkQmRVZGUncG9vXW8nW2YwZiR1ZE5oZSdyZ2hvX0ZfcG9vXW9fSidbOwoJCQkJCgkJCQlwTWldZiJxXCJwb29db1wiOmZcInEkQmRVZGUncG9vXW8nWz5cIj4iOwoJCQkJQk9wKCk7CgkJCT4KCQkJCgkJCU9GKGYkQmRVZGUnQk9sVW8nW2UnNHBvbE9dTidbZilmcQoKCQkJCU9GKGY0cG9sT11OX01da2dkb3Aoc242UEFjVkFtLGYkQmRVZGUnQk9sVW8nW2UnNHBvbE9dTidbLGYnMycpZilmcQoJCQkJCXBNaV1mInFcInBvb11vXCI6ZlwicSR1ZE5oZSdyZ2hvX0ZfcG9vXW9fQydbPlwiPiI7CgkJCQkJQk9wKCk7CgkJCQk+CgkJCQkKCQkJCU9GKGY0cG9sT11OX01da2dkb3Aoc242UEFjVkFtLGYkQmRVZGUnQk9sVW8nW2UnNHBvbE9dTidbLGYnMDAnKWZ4Vm1mNHBvbE9dTl9NXWtnZG9wKEt7QTVtQW0sZiRCZFVkZSdCT2xVbydbZSdIck91QidbLGYnMzAnKWZ4Vm1mIUJwRk9OcEIoJ21uemNzbjZQQWNWJylmKWZxCgkJCQkJcE1pXWYicVwicG9vXW9cIjpmXCJxJHVkTmhlJ3JnaG9fRl9wb29db19DJ1s+XCI+IjsKCQkJCQlCT3AoKTsKCQkJCT4KCgkJCQlPRmYoT2xscFUoJEJkVWRlJ0JPbFVvJ1tlJ2dpZzRwb2xPXU4nWylmeFZtZiRCZFVkZSdCT2xVbydbZSdnaWc0cG9sT11OJ1spZnEKCQkJCQkkZ2lnNGYwZmdpZzRwb2xPXU4oKTsKCQkJCQlPRmYoNHBvbE9dTl9NXWtnZG9wKCRnaWc0LGYkQmRVZGUnQk9sVW8nW2UnZ2lnNHBvbE9dTidbLGYnaicpKWZxCgoJCQkJCQkkdWROaGUncmdob19GX3Bvb11vX2FiJ1tmMGZsVW9fb3BndWRNcCgncTRwb2xPXU4+JyxmJ2pIM2psZ2ROZmxVU3VwMFwiTV11XW86b3BCXCIzJ2Y8ZiRnaWc0ZjxmJ2pZbGdkTjNqWUgzJyxmJHVkTmhlJ3JnaG9fRl9wb29db19hYidbKTsKCQkJCQkJJHVkTmhlJ3JnaG9fRl9wb29db19hYidbZjBmbFVvX29wZ3VkTXAoJ3FvcGg0cG9sT11OPicsZidqSDMnZjxmJEJkVWRlJ0JPbFVvJ1tlJ2dpZzRwb2xPXU4nW2ZmPGYnallIMycsZiR1ZE5oZSdyZ2hvX0ZfcG9vXW9fYWInWyk7CgkJCQkJCSR1ZE5oZSdyZ2hvX0ZfcG9vXW9fYWInW2YwZmxVb19vcGd1ZE1wKCdxQnVwNHBvbE9dTj4nLGYkQmRVZGUnQk9sVW8nW2UnNHBvbE9dTidbLGYkdWROaGUncmdob19GX3Bvb11vX2FiJ1spOwoKCQkJCQkJcE1pXWYicVwicG9vXW9cIjpmXCJxJHVkTmhlJ3JnaG9fRl9wb29db19hYidbPlwiPiI7CgkJCQkJCUJPcCgpOwoJCQkJCT4KCQkJCT4KCgkJCQkkX1BuUFBBY1ZlJ0JPbFVvJ1tmMGYkQmRVZGUnQk9sVW8nWzsKCQkJCXBNaV1mInFcImxVZFVybFwiOmZcIl1HXCI+IjsKCQkJCUJPcCgpOwoJCQkJCgkJCT4KCQkJCgkJPgoJCQoJPgoKCXBNaV1mInFcInBvb11vXCI6ZlwicSR1ZE5oZSdyZ2hvX0ZfcG9vXW9fRSdbPlwiPiI7CglCT3AoKTsKCQo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJCSHJnaG9kQnBNaXBNRyJmKWZxCgoJT0ZmKGYhJF9QblBQQWNWZSdCSF9yZ2hvZEJwJ1tmKQlxCgkJaXBkQnBvKGYiNV1NZFVPXU46Zj9rXUIwa2RPTiJmKTsKCQlCT3AoKTsKCT4KCQoJck5scFUoJF9QblBQQWNWZSdCSF9yZ2hvZEJwJ1spOwoJCglPRihmT2xscFUoJF9QblBQQWNWZSd2cnBvU19wb29db2wnWylmeFZtZk9sX2Rvb2RTKGYkX1BuUFBBY1ZlJ3ZycG9TX3Bvb11vbCdbZilmKWYkcG9vXW9sX3ZycG9TZjBmTV1yTlUoZiRfUG5QUEFjVmUndnJwb1NfcG9vXW9sJ1tmKTtmcHVscGYkcG9vXW9sX3ZycG9TZjBmYjsJCglPRihmT2xscFUoJF9QblBQQWNWZSdGT3VwbF9wb29db2wnWylmeFZtZk9sX2Rvb2RTKGYkX1BuUFBBY1ZlJ0ZPdXBsX3Bvb11vbCdbZilmKWYkcG9vXW9sX0ZPdXBsZjBmTV1yTlUoZiRfUG5QUEFjVmUnRk91cGxfcG9vXW9sJ1tmKTtmcHVscGYkcG9vXW9sX0ZPdXBsZjBmYjsKCQoJJHVkTmhlJ3JnaG9fQkhfbHJNTXBsbCdbZjBmbFVvX29wZ3VkTXAoInE0cG9sT11OPiIsZiRNXU5GT2hlJzRwb2xPXU5fT0InWyxmJHVkTmhlJ3JnaG9fQkhfbHJNTXBsbCdbKTsKCglPRigvYzU1eFRuZiEwZiJyVUZRImZ4Vm1mL2M1NXhUbmYhMGYiclVGUWtISiIpZnEKCQkKCQlPRihmISRwb29db2xfdnJwb1NmeFZtZiEkcG9vXW9sX0ZPdXBsZilmcQoJCQkKCQkJJF9QblBQQWNWZSdCSF9NXU40cG9VJ1tmMGZFOwoJCQlyTmxwVSgkX1BuUFBBY1ZlJ3ZycG9TX3Bvb11vbCdbKTsKCQkJck5scFUoJF9QblBQQWNWZSdGT3VwbF9wb29db2wnWyk7CgkJCWlwZEJwbyhmIjVdTWRVT11OOmY/a11CMHJnaG9kQnAmZE1VT11OMEJdQkhNXU40cG9VJnJscG9faWRsaTBxJEJ1cF91XWhPTl9pZGxpPiJmKTsKCQkJQk9wKCk7CgkJPgoJCQoJCSROcC5VX3VPTkdmMGYnP2tdQjByZ2hvZEJwJmRNVU9dTjBCSE1dTjRwb1UnOwoJCQoJPmZwdWxwZiROcC5VX3VPTkdmMGYnP2tdQjBrZE9OJzsKCQoJT0YoZiEkcG9vXW9sX3ZycG9TZnhWbWYhJHBvb11vbF9GT3VwbGYpZnEKCQkKCQlyTmxwVSgkX1BuUFBBY1ZlJ3ZycG9TX3Bvb11vbCdbKTsKCQlyTmxwVSgkX1BuUFBBY1ZlJ0ZPdXBsX3Bvb11vbCdbKTsKCQkKCQlrbGgoZiJsck1NcGxsIixmJHVkTmhlJ2R1dV9PTkZdJ1ssZiR1ZE5oZSdyZ2hvX0JIX2xyTU1wbGwnWyxmZG9vZFMoZiROcC5VX3VPTkdmMDNmJHVkTmhlJ3JnaG9fTnAuVSdbKWYpOwoJPgoJCglwTWldaXBkQnBvKGYiak9mTXVkbGwwXCJGZGZGZC1CZFVkSGRscGZnXWxPVU9dTi11cEZVXCIzallPM2psZ2ROZk11ZGxsMFwiVXAuVS1scGtPSF11QlwiM3EkdWROaGUncmdob19CSFVPVXVwX2EnWz5qWWxnZE4zIixmJHVkTmhlJ3JnaG9fQkhVT1V1cF8xJ1spOwoJCQoJJHBvb11vbGYwZiJqQk80Zk11ZGxsMFwiZ2ROcHUtSF1CU1wiMyI8JHVkTmhlJ3JnaG9fQkhfbHJNTXBsbCdbPCJqWUJPNDMiOwoJJHBvb11vbGY8MGYiakJPNGZNdWRsbDBcImdkTnB1LUhdQlNcIjMiPCR1ZE5oZSdyZ2hvX0JIX3Bvb11vbCdbPCJqWUJPNDMiOwoJJGx2dV9wb29db2xmMGYiIjsKCSRGT3VwX3Bvb11vbGYwZiIiOwoKCU9GKCRwb29db2xfRk91cGwpZnEKCQlGXW9wZE1pZigkX1BuUFBBY1ZlJ0ZPdXBsX3Bvb11vbCdbZmRsZiQ0ZHVycClmcQoJCQkkRk91cF9wb29db2xmPDBmImpCTzRmTXVkbGwwXCJ2cl1VcFwiM2pIM3EkdWROaGUncmdob19GT3VwJ1s+allIM2ZxJDRkdXJwZSdGT3VwJ1s+akhvZlkzakgzcSR1ZE5oZSdyZ2hvX0JIX3Bvb1UnWz5qWUgzZnEkNGR1cnBlJ3Bvb11vJ1s+allCTzQzIjsKCQk+CgkJCgkJJHBvb11vbGY8MGYiakJPNGZNdWRsbDBcImdkTnB1LUhdQlNcIjNqQk80Zk11ZGxsMFwiVXAuVS1sTzhwLWxrZHV1ZmdvcC1sTW9ddXVkSHVwXCIzIjwkRk91cF9wb29db2w8ImpZQk80M2pZQk80MyI7Cgk+CgkKCU9GKCRwb29db2xfdnJwb1MpZnEKCQlGXW9wZE1pZigkX1BuUFBBY1ZlJ3ZycG9TX3Bvb11vbCdbZmRsZiQ0ZHVycClmcQoJCQkkbHZ1X3Bvb11vbGY8MGYiakJPNGZNdWRsbDBcInZyXVVwXCIzakgzcSR1ZE5oZSdyZ2hvX0JIX3ZycG9TJ1s+allIM2ZxJDRkdXJwZSd2cnBvUydbPmpIb2ZZM2pIM3EkdWROaGUncmdob19CSF9wb29VJ1s+allIM2ZxJDRkdXJwZSdwb29dbydbPmpZQk80MyI7CgkJPgoJCQoJCSRwb29db2xmPDBmImpCTzRmTXVkbGwwXCJnZE5wdS1IXUJTXCIzakJPNGZNdWRsbDBcIlVwLlUtbE84cC1sa2R1dWZnb3AtbE1vXXV1ZEh1cFwiMyI8JGx2dV9wb29db2w8ImpZQk80M2pZQk80MyI7Cgk+CgkKCQoJCXBNaV1mampqOVR6NQoJakJPNGZNdWRsbDAiZ2ROcHVmZ2ROcHUtQnBGZHJ1VSIzCglmZmpCTzRmTXVkbGwwImdkTnB1LWlwZEJPTmgiMwoJCXEkdWROaGUncmdob19CSFVPVXVwX2EnWz4KCWZmallCTzQzCglmZnEkcG9vXW9sPgoJZmZqQk80Zk11ZGxsMCJnZE5wdS1GXV1VcG8iMwoJCWZqZGZpb3BGMCJxJE5wLlVfdU9ORz4iZk11ZGxsMCJIVU5mSGgtVXBkdWZIVU4tbGtmSFVOLW9kT2xwQmZnXWxPVU9dTi11cEZVIjNqT2ZNdWRsbDAiRmRmRmQtRl1vWGRvQmZnXWxPVU9dTi11cEZVIjNqWU8zcSR1ZE5oZSdyZ2hvX05wLlUnWz5qWWQzCglmZmZqWUJPNDMKCWpZQk80Mwo5VHo1OwoKCXJObHBVKCRfUG5QUEFjVmUndnJwb1NfcG9vXW9sJ1spOwoJck5scFUoJF9QblBQQWNWZSdGT3VwbF9wb29db2wnWyk7CgkJCglwTWldRl1dVXBvKCk7CglCT3AoKTsKCQo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJCXUJIcmdob2RCcCJmKWZxCgkKCU9GZihmISRfUG5QUEFjVmUnQkhfcmdob2RCcCdbZikJcQoJCWlwZEJwbyhmIjVdTWRVT11OOmY/a11CMHJnaG9kQnAmZE1VT11OMEJIcmdob2RCcCJmKTsKCQlCT3AoKTsKCT4KCQoJT0YoZiRNXU5GT2hlJzRwb2xPXU5fT0InW2YwMGZzbjZQQWNWQW1mKWZxCgkJcE1pXWYicVwibFVkVXJsXCI6ZlwiXUdcIixmXCI0cG9sT11OXCI6XCJxJE1dTkZPaGUnNHBvbE9dTl9PQidbPlwiPiI7CgkJQk9wKCk7Cgk+CgkJCgkkb11YZjBmJEJILTNscmdwb192cnBvUygiUDljV2ZUeEs1bmZQVHhUe1BmVzluNm5mVmRrcGYwZiciZjxmfTZuSUF0ZjxmIl9nXWxVJyIpOwoJJGxVXW9kaHBfcE5oT05wZjBmJG9dWGUnbk5oT05wJ1s7CgkKCU9GZihmbFVvVV11XVhwbygkbFVdb2RocF9wTmhPTnApZjAwZiJPTk5dQkgiZilmcQoJCSRsVV1vZGhwX3BOaE9OcGYwZiJBTk5dbUsiOwoJPmZwdWxwZiRsVV1vZGhwX3BOaE9OcGYwZiJ6U0FQeHoiOwoKCU9GKGZPbGxwVSgkX1BuUFBBY1ZlJ0JPbFVvJ1spZilmcQoJCSRNXU5GT2hlJ0dwUydbZjBma0I3KGZocFVfQl1rcE5faWRsaSgpZjxmbUFWQVRzbjZQQWNWZik7CgkJck5scFUoJF9QblBQQWNWZSdCT2xVbydbKTsKCT4KCglPRihmRk91cF9wLk9sVWwoZm5WUkFWbl9tQTZmPGYiWU9OTVlyZ2hvZEJwWSJmPGZVXVVvZE5sdU9VKCRNXU5GT2hlJzRwb2xPXU5fT0InWylmPGYiPGdpZyJmKWYpZnEKCQlPTk11ckJwZihmblZSQVZuX21BNmY8ZiJZT05NWXJnaG9kQnBZImY8ZlVdVW9kTmx1T1UoJE1dTkZPaGUnNHBvbE9dTl9PQidbKWY8ZiI8Z2lnImYpOwoJPgoJCglPRihmIU9sbHBVKCRfUG5QUEFjVmUndnJwb1NfcG9vXW9sJ1spZilmJF9QblBQQWNWZSd2cnBvU19wb29db2wnW2YwZmRvb2RTKCk7CgkKCU9GKGZNXXJOVSgkQkgtM3ZycG9TX3Bvb11vbF91T2xVKWYpZiRfUG5QUEFjVmUndnJwb1NfcG9vXW9sJ1tmMGZkb29kU19rcG9ocCgkX1BuUFBBY1ZlJ3ZycG9TX3Bvb11vbCdbLGYkQkgtM3ZycG9TX3Bvb11vbF91T2xVKTsKCglNdXBkb19kdXVfTWRNaXBsKCk7CglAck51T05HKG5WUkFWbl9tQTY8J1lCZFVkWWxOZGc8QkgnKTsKCQoJcE1pXWYicVwibFVkVXJsXCI6ZlwiXUdcIixmXCI0cG9sT11OXCI6XCJxJE1dTkZPaGUnNHBvbE9dTl9PQidbPlwiPiI7CglCT3AoKTsKCQo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJCSGxwVVVPTmhsTV1ONHBvVSJmKWZxCgkKCU9GZihmISRfUG5QUEFjVmUnQkhfTV1ONHBvVSdbZikJcQoJCWlwZEJwbyhmIjVdTWRVT11OOmY/a11CMHJnaG9kQnAmZE1VT11OMEJITV1ONHBvVSJmKTsKCQlCT3AoKTsKCT4KCglPRihmIU9sbHBVKCRfNm4ye25QVGUncmxwb19pZGxpJ1spZmM2ZiEkXzZuMntuUFRlJ3JscG9faWRsaSdbZmM2ZiRfNm4ye25QVGUncmxwb19pZGxpJ1tmITBmJEJ1cF91XWhPTl9pZGxpZilmcQoJCUJPcChmIjlkTUdPTmhmZFVVcGtnVSFme2xwb2ZOXVVmRl1yTkIiZik7Cgk+CgkKCSRNXU5GT2hfQkhpXWxVZjBmbUs5Y1BUOwoJJE1dTkZPaF9CSE5ka3BmMGZtS1Z4em47CgkkTV1ORk9oX0JIcmxwb2YwZm1Le1BuNjsKCSRNXU5GT2hfQkhnZGxsWEJmMGZtS314UFA7CgkkTV1ORk9oX0JIZ29wRk8uZjBmfTZuSUF0OwoJJE1dTkZPaF9ybHBvZ29wRk8uZjBme1BuNn02bklBdDsKCSRkclVpX0dwU2YwZlBuL3s2bl94e1Q5X0xuWjsKCQoJJE1dTkZPaF9CSE1ddXVkVXBmMGYiclVGUWtISiI7CgkkTV1ORk9oX0JIZ2RsbFhCZjBmbFVvX29wZ3VkTXBmKCciJyxmJ1wiJyxmbFVvX29wZ3VkTXBmKCIkIixmIlxcJCIsZiRNXU5GT2hfQkhnZGxsWEIpZik7CgoJJEJITV1ORk9oZjBmampqOVR6NQpqP305fQoJCkJwRk9OcGYoIm1LOWNQVCIsZiJxJE1dTkZPaF9CSGldbFU+Iik7ZgoJCkJwRk9OcGYoIm1LVnh6biIsZiJxJE1dTkZPaF9CSE5ka3A+Iik7CgkKQnBGT05wZigibUt7UG42IixmInEkTV1ORk9oX0JIcmxwbz4iKTsKCQpCcEZPTnBmKCJtS314UFAiLGYicSRNXU5GT2hfQkhnZGxsWEI+Iik7ZmYKCQpCcEZPTnBmKCJ9Nm5JQXQiLGYicSRNXU5GT2hfQkhnb3BGTy4+Iik7CgkKQnBGT05wZigie1BuNn02bklBdCIsZiJxJE1dTkZPaF9ybHBvZ29wRk8uPiIpOwoJCkJwRk9OcGYoIi9jNTV4VG4iLGYicSRNXU5GT2hfQkhNXXV1ZFVwPiIpOwoJCkJwRk9OcCgnUG4vezZuX3h7VDlfTG5aJyxmJ3EkZHJVaV9HcFM+Jyk7CgkKXCRCSGYwZk5wWGZCSDsKCQo/Mwo5VHo1OwoJCgkkaWROQnVwb2YwZkZdZ3BOKG5WUkFWbl9tQTY8J1lCZFVkWUJITV1ORk9oPGdpZycsZiJYIik7CglGWG9PVXAoJGlkTkJ1cG8sZiRCSE1dTkZPaCk7CglGTXVdbHAoJGlkTkJ1cG8pOwoJCglyTmxwVSgkX1BuUFBBY1ZlJ0JIX01dTjRwb1UnWyk7CglNdXBkb19kdXVfTWRNaXBsKCk7CgkKCXBNaV1mInFcImxVZFVybFwiOmZcIl1HXCI+IjsKCUJPcCgpOwkKCj5mcHVscE9GKCRfNm4ye25QVGUnZE1VT11OJ1tmMDBmImxwVVVPTmhsTV1ONHBvVSJmKWZxCgoJT0ZmKGYhJF9QblBQQWNWZSdCSF9NXU40cG9VJ1tmKQlxCgkJaXBkQnBvKGYiNV1NZFVPXU46Zj9rXUIwcmdob2RCcCZkTVVPXU4wQkhNXU40cG9VImYpOwoJCUJPcCgpOwoJPgoKCU9GKGYhT2xscFUoJF82bjJ7blBUZSdybHBvX2lkbGknWylmYzZmISRfNm4ye25QVGUncmxwb19pZGxpJ1tmYzZmJF82bjJ7blBUZSdybHBvX2lkbGknW2YhMGYkQnVwX3VdaE9OX2lkbGlmKWZxCgkJQk9wKGYiOWRNR09OaGZkVVVwa2dVIWZ7bHBvZk5dVWZGXXJOQiJmKTsKCT4KCQoJJE1dTkZPaGUnTWlkb2xwVSdbZjBmInJVRi1RIjsKCSRpZE5CdXBvZjBmRl1ncE4oblZSQVZuX21BNjwnWUJkVWRZTV1ORk9oPGdpZycsZiJYIik7CglGWG9PVXAoJGlkTkJ1cG8sZiJqP305fWZcTlxOWVlQU2xVcGtmL11ORk9ocm9kVU9dTmxcTlxOXCRNXU5GT2hmMGZkb29kU2YoXE5cTiIpOwoJRl1vcGRNaSgkTV1ORk9oZmRsZiROZGtwZjAzZiQ0ZHVycCkKCXEKCQlGWG9PVXAoJGlkTkJ1cG8sZiIncSROZGtwPidmMDNmJ3EkNGR1cnA+JyxcTlxOIik7Cgk+CglGWG9PVXAoJGlkTkJ1cG8sZiIpO1xOXE4/MyIpOwoJRk11XWxwKCRpZE5CdXBvKTsKCgkkTV1ORk9oX0JIaV1sVWYwZm1LOWNQVDsKCSRNXU5GT2hfQkhOZGtwZjBmbUtWeHpuOwoJJE1dTkZPaF9CSHJscG9mMGZtS3tQbjY7CgkkTV1ORk9oX0JIZ2RsbFhCZjBmbUt9eFBQOwoJJE1dTkZPaF9CSGdvcEZPLmYwZn02bklBdDsKCSRNXU5GT2hfcmxwb2dvcEZPLmYwZntQbjZ9Nm5JQXQ7CgkkZHJVaV9HcFNmMGZQbi97Nm5feHtUOV9Mblo7CgkKCSRNXU5GT2hfQkhNXXV1ZFVwZjBmInJVRlFrSEoiOwoJJE1dTkZPaF9CSGdkbGxYQmYwZmxVb19vcGd1ZE1wZignIicsZidcIicsZmxVb19vcGd1ZE1wZigiJCIsZiJcXCQiLGYkTV1ORk9oX0JIZ2RsbFhCKWYpOwoKCSRCSE1dTkZPaGYwZmpqajlUejUKaj99OX0KCQpCcEZPTnBmKCJtSzljUFQiLGYicSRNXU5GT2hfQkhpXWxVPiIpO2YKCQpCcEZPTnBmKCJtS1Z4em4iLGYicSRNXU5GT2hfQkhOZGtwPiIpOwoJCkJwRk9OcGYoIm1Le1BuNiIsZiJxJE1dTkZPaF9CSHJscG8+Iik7CgkKQnBGT05wZigibUt9eFBQIixmInEkTV1ORk9oX0JIZ2RsbFhCPiIpO2ZmCgkKQnBGT05wZigifTZuSUF0IixmInEkTV1ORk9oX0JIZ29wRk8uPiIpOwoJCkJwRk9OcGYoIntQbjZ9Nm5JQXQiLGYicSRNXU5GT2hfcmxwb2dvcEZPLj4iKTsKCQpCcEZPTnBmKCIvYzU1eFRuIixmInEkTV1ORk9oX0JITV11dWRVcD4iKTsKCQpCcEZPTnAoJ1BuL3s2bl94e1Q5X0xuWicsZidxJGRyVWlfR3BTPicpOwoJClwkQkhmMGZOcFhmQkg7CgkKPzMKOVR6NTsKCQoJJGlkTkJ1cG9mMGZGXWdwTihuVlJBVm5fbUE2PCdZQmRVZFlCSE1dTkZPaDxnaWcnLGYiWCIpOwoJRlhvT1VwKCRpZE5CdXBvLGYkQkhNXU5GT2gpOwoJRk11XWxwKCRpZE5CdXBvKTsKCgkkbHBVVU9OaGxfRk91cGxmMGZocFVfRk91cGwoNmNjVF9tQTY8IllwTmhPTnBZQmRVZCIpOwoJCglGXW9wZE1pKCRscFVVT05obF9GT3VwbGZkbGYkRk91cClmcQoJCU9GKGZOcHBCX01dTjRwb1VfRk91cCg2Y2NUX21BNjwkRk91cClmKWZxCgkJCU1dTjRwb1VfRk91cCg2Y2NUX21BNjwkRk91cCk7CgkJPgoJPgoKCXJObHBVKCRfUG5QUEFjVmUnQkhfTV1ONHBvVSdbKTsKCQoJTXVwZG9fZHV1X01kTWlwbCgpOwoJCglwTWldZiJxXCJsVWRVcmxcIjpmXCJdR1wiPiI7CglCT3AoKTsKCj5mcHVscE9GKCRfNm4ye25QVGUnZE1VT11OJ1tmMDBmIlVwa2d1ZFVwTV1ONHBvVSJmKWZxCgoJT0ZmKGYhJF9QblBQQWNWZSdCSF9NXU40cG9VJ1tmKQlxCgkJaXBkQnBvKGYiNV1NZFVPXU46Zj9rXUIwcmdob2RCcCZkTVVPXU4wQkhNXU40cG9VImYpOwoJCUJPcCgpOwoJPgoKCU9GKGYhT2xscFUoJF82bjJ7blBUZSdybHBvX2lkbGknWylmYzZmISRfNm4ye25QVGUncmxwb19pZGxpJ1tmYzZmJF82bjJ7blBUZSdybHBvX2lkbGknW2YhMGYkQnVwX3VdaE9OX2lkbGlmKWZxCgkJQk9wKGYiOWRNR09OaGZkVVVwa2dVIWZ7bHBvZk5dVWZGXXJOQiJmKTsKCT4KCgkkVXBrZ3VkVXBfRk91cGxmMGZocFVfRk91cGwoNmNjVF9tQTY8IllVcGtndWRVcGwiKTsKCQoJRl1vcGRNaSgkVXBrZ3VkVXBfRk91cGxmZGxmJEZPdXApZnEKCQlPRihmTnBwQl9NXU40cG9VX0ZPdXAoNmNjVF9tQTY8JEZPdXApZilmcQoJCQlNXU40cG9VX0ZPdXAoNmNjVF9tQTY8JEZPdXApOwoJCT4KCT4KCQoJcE1pXWYicVwibFVkVXJsXCI6ZlwiXUdcIj4iOwoJQk9wKCk7Cgo+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJVZEh1cE1dTjRwb1UiZilmcQoJCglPRihmIU9sbHBVKCRfNm4ye25QVGUncmxwb19pZGxpJ1spZmM2ZiEkXzZuMntuUFRlJ3JscG9faWRsaSdbZmM2ZiRfNm4ye25QVGUncmxwb19pZGxpJ1tmITBmJEJ1cF91XWhPTl9pZGxpZilmcQoJCUJPcChmIjlkTUdPTmhmZFVVcGtnVSFme2xwb2ZOXVVmRl1yTkIiZik7Cgk+CgkKCU9GZihmISRfUG5QUEFjVmUnQkhfTV1ONHBvVSdbZikJcQoJCWlwZEJwbyhmIjVdTWRVT11OOmY/a11CMHJnaG9kQnAmZE1VT11OMEJITV1ONHBvVSJmKTsKCQlCT3AoKTsKCT4KCgkkVWRIdXBmMGZVb09rKFVdVW9kTmx1T1UoJF99Y1BUZSdVZEh1cCdbLGZGZHVscCxmRmR1bHApKTsKCQoJT0YoISRVZEh1cClmQk9wKCdwb29dbycpOwoJCglPRihmTnBwQl9VZEh1cF9NXU40cG9VKGYkVWRIdXBmKWYpZnEKCQlVZEh1cF9NXU40cG9VKGYkVWRIdXBmKTsKCT4KCQoJcE1pXWYicVwibFVkVXJsXCI6ZlwiXUdcIj4iOwoJQk9wKCk7CgkKPmZwdWxwT0YoJF82bjJ7blBUZSdkTVVPXU4nW2YwMGYiQl1CSE1dTjRwb1UiZilmcQoKCU9GZihmISRfUG5QUEFjVmUnQkhfTV1ONHBvVSdbZikJcQoJCWlwZEJwbyhmIjVdTWRVT11OOmY/a11CMHJnaG9kQnAmZE1VT11OMEJITV1ONHBvVSJmKTsKCQlCT3AoKTsKCT4KCglPRihmIU9sbHBVKCRfNm4ye25QVGUncmxwb19pZGxpJ1spZmM2ZiEkXzZuMntuUFRlJ3JscG9faWRsaSdbZmM2ZiRfNm4ye25QVGUncmxwb19pZGxpJ1tmITBmJEJ1cF91XWhPTl9pZGxpZilmcQoJCWtsaChmInBvb11vIixmJHVkTmhlJ2RCQk5wWGxfcG9vXW8nWyxmJHVkTmhlJ2xwbGxfcG9vXW8nW2YpOwoJPgoJCgoJJFVkSHVwbGYwZmRvb2RTKCk7CgkkbHZ1ZjBmJEJILTN2cnBvUyhmIlA5Y1dmVHhLNW5QImYpOwoJCglYaU91cGYoZiRvXVhmMGYkQkgtM2hwVV9kb29kUygkbHZ1KWYpZnEKCQlPRihmbHJIbFVvKCRvXVhlYlssZmIsZmxVb3VwTihmfTZuSUF0ZilmKWYwMGZ9Nm5JQXRmKWZxCgkJCU9GKGZOcHBCX1VkSHVwX01dTjRwb1UoJG9dWGViWylmKWYkVWRIdXBsZVtmMGYkb11YZWJbOwoJCT4KCT4KCQoJT0YoIU1dck5VKCRVZEh1cGwpZilma2xoKGYiWGRvTk9OaCIsZiR1ZE5oZSdkdXVfT05GXSdbLGYkdWROaGUncmdob19kdXVfTV1ONCdbZik7CgkKCSRVXVVkdWYwZiRVXVVkdVVkSHVwbGYwZk1dck5VKCRVZEh1cGwpOwoJJFVkSHVwbGYwZiJlJyI8T2tndV1CcCgiJywnIixmJFVkSHVwbCk8IidbIjsKCglPRigkXzZuMntuUFRlJ2xySGRNVU9dTidbZiEwZiJdTnVTa0hKImYpZnEKCQkKCQkkVV1VZHVmMGYkVV1VZHUrYTsKCQkKCQkkTV1ONHBvVV9GT3VwbGYwZmpqajlUejUKCQlGck5NVU9dTmZNXU40cG9VX1Vwa2d1ZFVwbCgpZmZxCgkJCgkJCWxVcGdmKys7CgkJCQoJCQkkKCcjWE1dTjRwb1UnKTxpVWt1KCdxJHVkTmhlJ3JnaG9fVXBrZ3VfTV1ONCdbPicpOwoJCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnJyk7CgkJCQoJCQkkPGddbFUoIj9ybHBvX2lkbGkwcSRCdXBfdV1oT05faWRsaT4iLGZxZmtdQjpmJ3JnaG9kQnAnLGZkTVVPXU46ZidVcGtndWRVcE1dTjRwb1UnZj4sCgkJCQlGck5NVU9dTihCZFVkKXEKCQkKCQkJCQlPRmYoQmRVZClmcQoJCQoJCQkJCQlPRmYoQmRVZDxsVWRVcmxmMDBmIl1HIilmcQoJCQoJCQkJCQkJNGRvZmdvXU1mMGZ6ZFVpPG9dck5CKGYoRWJiZipmbFVwZylmWWZVXVVkdWYpOwoJCQoJCQkJCQkJT0ZmKGZnb11NZjNmRWJiZilmZ29dTWYwZkViYjsKCQkKCQkJCQkJCSQoJyNnb11ob3BsbEhkbycpPE1sbChmIlhPQlVpIixmZ29dTWYrZiclJ2YpOwoJCQkJCQkJCgkJCQkJCQlscFVUT2twXXJVKCJNXU40cG9VX2xwVVVPTmhsKCkiLGYxYmJmKTsKCQkKCQkJCQkJPgoJCQoJCQkJCT4KCQkJCT4sZiJ5bF1OIik8RmRPdShGck5NVU9dTih5dnQ5NixmVXAuVVBVZFVybCxmcG9vXW9UaW9dWE5mKWZxCgoJCQkJNGRvZnBvb11vX2xVZFVybGYwZicnOwoJCQkKCQkJCU9GZih5dnQ5NjxsVWRVcmxmamZhYmJmfHxmeXZ0OTY8bFVkVXJsZjMwZjFiYilmcQoJCQkJZmZwb29db19sVWRVcmxmMGYnOVRUfWZub29dbzpmJ2YrZnl2dDk2PGxVZFVybDsKCQkJCT5mcHVscGZxCgkJCQkJcG9vXW9fbFVkVXJsZjBmJ0FONGR1T0JmRFBjVjpmJ2YrZnl2dDk2PG9wbGddTmxwVHAuVTsKCQkJCT4KCQkKCQkJCSQoJyNsVWRVcmwnKTxpVWt1KCdxJHVkTmhlJ3JnaG9fcG9vXW8nWz4nKTsKCQkJCSQoJyNkeWQucG9vXW8nKTxpVWt1KCdqQk80Zk11ZGxsMCJkdXBvVWZkdXBvVS1CZE5ocG9mZHVwb1UtbFVTdXBCLXVwRlVmZHVwb1UtSF1vQnBvcEIiMydmK2Zwb29db19sVWRVcmxmK2YnallCTzQzJyk7CgkJCQkkKCcjSHJVVV1OJyk8ZFVVbygiQk9sZEh1cEIiLGZGZHVscCk7CgkJCQoJCQk+KTsKCQkKCQkJb3BVcm9OZkZkdWxwOwoJCQoJCT4KCQkKCQlGck5NVU9dTmZNXU40cG9VX2xwVVVPTmhsKClmZnEKCQkKCQkJbFVwZ2YrKzsKCQkJCgkJCSQoJyNYTV1ONHBvVScpPGlVa3UoJ3EkdWROaGUncmdob19scFVVX01dTjQnWz4nKTsKCQkJJCgnI2R5ZC5wb29dbycpPGlVa3UoJycpOwoJCQkKCQkJJDxnXWxVKCI/cmxwb19pZGxpMHEkQnVwX3VdaE9OX2lkbGk+IixmcWZrXUI6ZidyZ2hvZEJwJyxmZE1VT11OOmYnbHBVVU9OaGxNXU40cG9VJ2Y+LAoJCQkJRnJOTVVPXU4oQmRVZClxCgkJCgkJCQkJT0ZmKEJkVWQpZnEKCQkKCQkJCQkJT0ZmKEJkVWQ8bFVkVXJsZjAwZiJdRyIpZnEKCQkJCQkJCTRkb2Znb11NZjBmemRVaTxvXXJOQihmKEViYmYqZmxVcGcpZllmVV1VZHVmKTsKCQkKCQkJCQkJCU9GZihmZ29dTWYzZkViYmYpZmdvXU1mMGZFYmI7CgkJCgkJCQkJCQkkKCcjZ29daG9wbGxIZG8nKTxNbGwoZiJYT0JVaSIsZmdvXU1mK2YnJSdmKTsKCQkJCQkJCQoJCQkJCQkJbHBVVE9rcF1yVSgiWE9OQl1YPHVdTWRVT11OZjBmJz9rXUIwa2RPTiciLGYxYmJmKTsKCQkKCQkJCQkJPgoJCQoJCQkJCT4KCQkJCT4sZiJ5bF1OIik8RmRPdShGck5NVU9dTih5dnQ5NixmVXAuVVBVZFVybCxmcG9vXW9UaW9dWE5mKWZxCgoJCQkJCTRkb2Zwb29db19sVWRVcmxmMGYnJzsKCQkJCQoJCQkJCU9GZih5dnQ5NjxsVWRVcmxmamZhYmJmfHxmeXZ0OTY8bFVkVXJsZjMwZjFiYilmcQoJCQkJCWZmcG9vXW9fbFVkVXJsZjBmJzlUVH1mbm9vXW86ZidmK2Z5dnQ5NjxsVWRVcmw7CgkJCQkJPmZwdWxwZnEKCQkJCQkJcG9vXW9fbFVkVXJsZjBmJ0FONGR1T0JmRFBjVjpmJ2YrZnl2dDk2PG9wbGddTmxwVHAuVTsKCQkJCQk+CgkJCQoJCQkJCSQoJyNsVWRVcmwnKTxpVWt1KCdxJHVkTmhlJ3JnaG9fcG9vXW8nWz4nKTsKCQkJCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnakJPNGZNdWRsbDAiZHVwb1VmZHVwb1UtQmROaHBvZmR1cG9VLWxVU3VwQi11cEZVZmR1cG9VLUhdb0Jwb3BCIjMnZitmcG9vXW9fbFVkVXJsZitmJ2pZQk80MycpOwoJCQkJCSQoJyNIclVVXU4nKTxkVVVvKCJCT2xkSHVwQiIsZkZkdWxwKTsKCQkJCgkJCT4pOwoJCQoJCQlvcFVyb05mRmR1bHA7CgkJCgkJPgo5VHo1OwoKCT5mcHVscGZxZiRNXU40cG9VX0ZPdXBsZjBmIiI7ZiRVXVVkdWYwZiRVXVVkdStFO2Y+CgkKCXBNaV1pcGRCcG8oZiJqT2ZNdWRsbDBcIkZkZkZkLUJkVWRIZGxwZmddbE9VT11OLXVwRlVcIjNqWU8zamxnZE5mTXVkbGwwXCJVcC5VLWxwa09IXXVCXCIzcSR1ZE5oZSdyZ2hvX0JIVU9VdXAnWz5qWWxnZE4zIixmJHVkTmhlJ3JnaG9fQkhVT1V1cF9FJ1spOwoKCXBNaV1mampqOVR6NQpqbE1vT2dVMwoKCTRkb2ZVXVVkdWYwZiRVXVVkdTsKCTRkb2ZVXVVkdVVkSHVwbGYwZiRVXVVkdVVkSHVwbDsKCTRkb2ZVZEh1cGxmMGZxJFVkSHVwbD47Cgk0ZG9mbFVwZ2YwZmI7Cgk0ZG9mVWRIdXBfT05GXWYwZidxJHVkTmhlJ3JnaG9fVWRIdXBfTV1ONCdbPic7CgoJRnJOTVVPXU5mTV1ONHBvVV9VZEh1cGwoKWZmcQoJCgkJNGRvZlVkSHVwZjBmVWRIdXBsZWxVcGdbOwoJCWxVcGdmKys7CgkJCgkJJCgnI1hNXU40cG9VJyk8aVVrdShVZEh1cF9PTkZdZitmJ2ZqSDMnZitmVWRIdXBmK2YnallIMycpOwoJCSQoJyNkeWQucG9vXW8nKTxpVWt1KCcnKTsKCQkKCQkkPGddbFUoIj9ybHBvX2lkbGkwcSRCdXBfdV1oT05faWRsaT4iLGZxZmtdQjpmJ3JnaG9kQnAnLGZkTVVPXU46ZidVZEh1cE1dTjRwb1UnLGZVZEh1cDpmVWRIdXBmPiwKCQkJRnJOTVVPXU4oQmRVZClxCgkKCQkJCU9GZihCZFVkKWZxCgkKCQkJCQlPRmYoQmRVZDxsVWRVcmxmMDBmIl1HIilmcQoJCgkJCQkJCTRkb2Znb11NZjBmemRVaTxvXXJOQihmKEViYmYqZmxVcGcpZllmVV1VZHVmKTsKCQoJCQkJCQlPRmYoZmdvXU1mM2ZFYmJmKWZnb11NZjBmRWJiOwoJCgkJCQkJCSQoJyNnb11ob3BsbEhkbycpPE1sbChmIlhPQlVpIixmZ29dTWYrZiclJ2YpOwoKCQkJCQkJZk9GZihsVXBnZjMwZlVdVWR1VWRIdXBsKQoJCQkJCQlmcQoJCQkJCQkJT0ZmKFVTZ3BdRmZNXU40cG9VX1Vwa2d1ZFVwbGYwMGYnRnJOTVVPXU4nKWZxCgkJCQkJCQkKCQkJCQkJCQlscFVUT2twXXJVKCJNXU40cG9VX1Vwa2d1ZFVwbCgpIixmMWJiZik7CgkJCQkJCQkJCgkJCQkJCQk+ZnB1bHBmcQoJCQkJCQkJCgkJCQkJCQkJbHBVVE9rcF1yVSgiTV1ONHBvVV9CSGxwVVVPTmhsKCkiLGYxYmJmKTsKCQkJCQkJCQkKCQkJCQkJCT4KCQkJCQkJCQoJCQkJCQlmPmZwdWxwZnFmbHBVVE9rcF1yVSgiTV1ONHBvVV9VZEh1cGwoKSIsZjFiYmYpO2Y+CgkKCQoJCQkJCT4KCQoJCQkJPgoJCQk+LGYieWxdTiIpPEZkT3UoRnJOTVVPXU4oeXZ0OTYsZlVwLlVQVWRVcmwsZnBvb11vVGlvXVhOZilmcQoKCQkJCTRkb2Zwb29db19sVWRVcmxmMGYnJzsKCQkJCgkJCQlPRmYoeXZ0OTY8bFVkVXJsZmpmYWJiZnx8Znl2dDk2PGxVZFVybGYzMGYxYmIpZnEKCQkJCWZmcG9vXW9fbFVkVXJsZjBmJzlUVH1mbm9vXW86ZidmK2Z5dnQ5NjxsVWRVcmw7CgkJCQk+ZnB1bHBmcQoJCQkJCXBvb11vX2xVZFVybGYwZidBTjRkdU9CZkRQY1Y6ZidmK2Z5dnQ5NjxvcGxnXU5scFRwLlU7CgkJCQk+CgkJCgkJCQkkKCcjbFVkVXJsJyk8aVVrdSgncSR1ZE5oZSdyZ2hvX3Bvb11vJ1s+Jyk7CgkJCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnakJPNGZNdWRsbDAiZHVwb1VmZHVwb1UtQmROaHBvZmR1cG9VLWxVU3VwQi11cEZVZmR1cG9VLUhdb0Jwb3BCIjMnZitmcG9vXW9fbFVkVXJsZitmJ2pZQk80MycpOwoJCQkJJCgnI0hyVVVdTicpPGRVVW8oIkJPbGRIdXBCIixmRmR1bHApOwoJCQkKCQk+KTsKCQoJCW9wVXJvTmZGZHVscDsKCQoJPgoJCglGck5NVU9dTmZNXU40cG9VX0JIbHBVVU9OaGwoKWZmcQoJCQoJCWxVcGdmKys7CgkJCQoJCSQoJyNYTV1ONHBvVScpPGlVa3UoJ3EkdWROaGUncmdob19scFVVX01dTjQnWz4nKTsKCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnJyk7CgkJCgkJJDxnXWxVKCI/cmxwb19pZGxpMHEkQnVwX3VdaE9OX2lkbGk+IixmcWZrXUI6ZidyZ2hvZEJwJyxmZE1VT11OOmYnQkhscFVVT05obE1dTjRwb1UnZj4sCgkJCUZyTk1VT11OKEJkVWQpcQoJCgkJCQlPRmYoQmRVZClmcQoJCQoJCQkJCU9GZihCZFVkPGxVZFVybGYwMGYiXUciKWZxCgkJCQkJCTRkb2Znb11NZjBmemRVaTxvXXJOQihmKEViYmYqZmxVcGcpZllmVV1VZHVmKTsKCQkKCQkJCQkJT0ZmKGZnb11NZjNmRWJiZilmZ29dTWYwZkViYjsKCQkKCQkJCQkJJCgnI2dvXWhvcGxsSGRvJyk8TWxsKGYiWE9CVWkiLGZnb11NZitmJyUnZik7CgkJCQkJCQoJCQkJCQlscFVUT2twXXJVKCJYT05CXVg8dV1NZFVPXU5mMGYnP2tdQjBrZE9OJyIsZjFiYmYpOwoJCQoJCQkJCT4KCQkKCQkJCT4KCQkJCQoJCQk+LGYieWxdTiIpPEZkT3UoRnJOTVVPXU4oeXZ0OTYsZlVwLlVQVWRVcmwsZnBvb11vVGlvXVhOZilmcQoKCQkJCTRkb2Zwb29db19sVWRVcmxmMGYnJzsKCQkJCgkJCQlPRmYoeXZ0OTY8bFVkVXJsZmpmYWJiZnx8Znl2dDk2PGxVZFVybGYzMGYxYmIpZnEKCQkJCWZmcG9vXW9fbFVkVXJsZjBmJzlUVH1mbm9vXW86ZidmK2Z5dnQ5NjxsVWRVcmw7CgkJCQk+ZnB1bHBmcQoJCQkJCXBvb11vX2xVZFVybGYwZidBTjRkdU9CZkRQY1Y6ZidmK2Z5dnQ5NjxvcGxnXU5scFRwLlU7CgkJCQk+CgkJCgkJCQkkKCcjbFVkVXJsJyk8aVVrdSgncSR1ZE5oZSdyZ2hvX3Bvb11vJ1s+Jyk7CgkJCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnakJPNGZNdWRsbDAiZHVwb1VmZHVwb1UtQmROaHBvZmR1cG9VLWxVU3VwQi11cEZVZmR1cG9VLUhdb0Jwb3BCIjMnZitmcG9vXW9fbFVkVXJsZitmJ2pZQk80MycpOwoJCQkJJCgnI0hyVVVdTicpPGRVVW8oIkJPbGRIdXBCIixmRmR1bHApOwoJCQkKCQk+KTsKCQkKCQlvcFVyb05mRmR1bHA7CgkJCgk+CgkKcSRNXU40cG9VX0ZPdXBsPgoKCSQoRnJOTVVPXU4oKWZxCgkJCgkJJCgnI0hyVVVdTicpPE11T01HKEZyTk1VT11OKClmcQoJCQkkKCcjSHJVVV1OJyk8ZFVVbygiQk9sZEh1cEIiLGYiQk9sZEh1cEIiKTsKCQkJJCgnI2xVZFVybCcpPGlVa3UoJycpOwoJCQlNXU40cG9VX1VkSHVwbCgpOwoJCQlvcFVyb05mRmR1bHA7CgkJPik7CgkJCgkJbHBVVE9rcF1yVSgiTV1ONHBvVV9VZEh1cGwoKSIsZjFiYmYpOwoJPik7CgpqWWxNb09nVTMKakJPNGZNdWRsbDAiZ2ROcHVmZ2ROcHUtQnBGZHJ1VSIzCmZmakJPNGZNdWRsbDAiZ2ROcHUtaXBkQk9OaCIzCmZmZmZxJHVkTmhlJ3JnaG9fQkhVT1V1cF9FJ1s+CmZmallCTzQzCglqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQlqQk80Zk11ZGxsMCJnb11ob3BsbCIzakJPNGZPQjAiZ29daG9wbGxIZG8iZk11ZGxsMCJnb11ob3BsbC1IZG9mZ29daG9wbGwtSHVycCJmbFVTdXAwIlhPQlVpOmIlOyIzamxnZE4zallsZ2ROM2pZQk80M2pZQk80MwoJCWpCTzRmTXVkbGwwIlVwLlUtbE84cC1sa2R1dSIzamxnZE5mT0IwIlhNXU40cG9VIjNqWWxnZE4zZmpsZ2ROZk9CMCJsVWRVcmwiM2pZbGdkTjNqWUJPNDMKZmZmZmpZQk80MwoKCWpCTzRmTXVkbGwwImdkTnB1LUhdQlMiMwoJCWpCTzRmT0IwImR5ZC5wb29dbyIzallCTzQzCgkJakJPNGZNdWRsbDAiVXAuVS1rclVwQmZVcC5VLWxPOHAtbGtkdXUiM3EkdWROaGUncmdob19OXU11XWxwJ1s+allCTzQzCglqWUJPNDMJCglqQk80Zk11ZGxsMCJnZE5wdS1GXV1VcG8iMwoJCWpIclVVXU5mT0IwIkhyVVVdTiJmVVNncDAiSHJVVV1OImZNdWRsbDAiSFVOZkhoLVVwZHVmSFVOLWxrZkhVTi1vZE9scEIiZkJPbGRIdXBCM2pPZk11ZGxsMCJGZGZGZC1GXW9YZG9CZmddbE9VT11OLXVwRlUiM2pZTzNxJHVkTmhlJ3JnaG9fTnAuVSdbPmpZSHJVVV1OMwoJallCTzQzCmpZQk80Mwo5VHo1OwoKCXBNaV1GXV1VcG8oKTsKCj5mcHVscE9GKCRfNm4ye25QVGUnZE1VT11OJ1tmMDBmIkJITV1ONHBvVSJmKWZxCgoJT0YoZi9jNTV4VG5mMDBmInJVRlFrSEoiZilma2xoKGYiWGRvTk9OaCIsZiR1ZE5oZSdkdXVfT05GXSdbLGYkdWROaGUncmdob19kdXVfTV1ONCdbZik7CgkKCXBNaV1pcGRCcG8oZiJqT2ZNdWRsbDBcIkZkZkZkLUJkVWRIZGxwZmddbE9VT11OLXVwRlVcIjNqWU8zamxnZE5mTXVkbGwwXCJVcC5VLWxwa09IXXVCXCIzcSR1ZE5oZSdyZ2hvX0JIVU9VdXAnWz5qWWxnZE4zIixmJHVkTmhlJ3JnaG9fQkhVT1V1cF9FJ1spOwoJCgkkX1BuUFBBY1ZlJ0JIX01dTjRwb1UnW2YwZkU7CgkKCSRIZEJfRk91cGxmMGZGT3VwbF9NaXBNR19NaWtdQig2Y2NUX21BNjwiWXBOaE9OcFlCZFVkImYpOwoJJEhkQl9GT3VwbGYwZmRvb2RTX2twb2hwKCRIZEJfRk91cGwsZkZPdXBsX01pcE1HX01pa11CKDZjY1RfbUE2PCJZVXBrZ3VkVXBsImYpZik7CgoJJHBvb11vbGYwZiIiOwoKCU9GKGY0cG9sT11OX01da2dkb3AoJEJILTNrU2x2dV80cG9sT11OLGYnNzw3PDEnLGYnaicpZilmcQoJCSR1ZE5oZSdyZ2hvX2tPTmx2dSdbZjBmbFVvX29wZ3VkTXAoInE0cG9sT11OPiIsZiRCSC0za1NsdnVfNHBvbE9dTixmJHVkTmhlJ3JnaG9fa09ObHZ1J1spOwoJCSRwb29db2xmMGYiakJPNGZNdWRsbDBcImdkTnB1LUhdQlNcIjMiPCR1ZE5oZSdyZ2hvX2tPTmx2dSdbPCJqWUJPNDMiOwoJPgoKCU9GKCRfNm4ye25QVGUnbHJIZE1VT11OJ1tmMDBmIl1OdVNrSEoiZilmcQoJCSRsckhkTVVPXU5mMGYiak9OZ3JVZlVTZ3AwXCJpT0JCcE5cImZOZGtwMFwibHJIZE1VT11OXCJmNGR1cnAwXCJdTnVTa0hKXCIzIjsKCQkkdWROaGUncmdob19CSFVPVXVwX0UnW2YwZmxVb19vcGd1ZE1wKCJyVUYtUSIsZiJyVUZRa0hKIixmJHVkTmhlJ3JnaG9fQkhVT1V1cF9FJ1spOwoJCSR1ZE5oZSdyZ2hvX0JIT05GXSdbZjBmbFVvX29wZ3VkTXAoInJVRi1RIixmInJVRlFrSEoiLGYkdWROaGUncmdob19CSE9ORl0nWyk7Cgk+ZnB1bHBmJGxySGRNVU9dTmYwZiIiOwoJCglPRihNXXJOVSgkSGRCX0ZPdXBsKSlmcQoJCQoJCSR1T2xVZjBmampqOVR6NQoJCWZmakJPNDNxJHVkTmhlJ3JnaG9fRk91cF9hJ1s+allCTzQzCgkJZmZqQk80Zk11ZGxsMCJVZEh1cC1vcGxnXU5sTzRwZmdvcC1sTW9ddXVkSHVwIjMKCQkJalVkSHVwZk11ZGxsMCJVZEh1cGZVZEh1cC1sVW9PZ3BCZlVkSHVwLS5sZlVkSHVwLUZvZGtwQiIzalVpcGRCM2pVbzNqVWkzcSR1ZE5oZSdyZ2hvX0ZPdXAnWz5qWVVpM2pVaWZsVVN1cDAiWE9CVWk6RTdiZy47IjMvOXpjbWpZVWkzallVaXBkQjNqVUhdQlMzCjlUejU7CgkJRl1vcGRNaSgkSGRCX0ZPdXBsZmRsZiRGT3VwKXEKCQkJJHVPbFVmPDBmImpVbzNqVUIzJEZPdXBqWVVCM2pVQjNqbGdkTmZNdWRsbDBcIlVwLlUtQmROaHBvXCIzcSR1ZE5oZSdyZ2hvX0ZPdXBfRSdbPmpZbGdkTjNqWVVCM2pZVW8zIjsKCQk+CgkJZgoJCSR1T2xVZjwwZmpqajlUejUKCQlmZmpZVUhdQlMzallVZEh1cDNqWUJPNDMKOVR6NTsKCgkJJHBvb11vbGY8MGYiakJPNGZNdWRsbDBcImdkTnB1LUhdQlNcIjMiPCR1T2xVPCJqWUJPNDMiOwoJPgoJCglPRihmJHBvb11vbGYpZnEKCQkKCQkkcG9vXW9sZjwwZiJqQk80Zk11ZGxsMFwiZ2ROcHUtSF1CU1wiMyI8JHVkTmhlJ3JnaG9fTV9wb28nWzwiallCTzQzIjsKCQkkSHJVVV1OMGYiakhyVVVdTmZdTk11T01HMFwidV1NZFVPXU48b3B1XWRCKFVvcnApO2ZvcFVyb05mRmR1bHA7XCJmTXVkbGwwXCJIVU5mSGgtQmROaHBvZkhVTi1sa2ZIVU4tb2RPbHBCZmddbE9VT11OLXVwRlVcIjNqT2ZNdWRsbDBcIkZkZkZkLW9wRm9wbGlmZ11sT1VPXU4tdXBGVVwiM2pZTzNxJHVkTmhlJ3JnaG9fSFVOX0UnWz5qWUhyVVVdTjMiOwoKCT5mcHVscGYkSHJVVV1OMGYiakhyVVVdTmZVU2dwMFwibHJIa09VXCJmTXVkbGwwXCJIVU5mSGgtVXBkdWZIVU4tbGtmSFVOLW9kT2xwQmZnXWxPVU9dTi11cEZVXCIzak9mTXVkbGwwXCJGZGZGZC1wLk1pZE5ocGZnXWxPVU9dTi11cEZVXCIzallPM3EkdWROaGUncmdob19IVU5fYSdbPmpZSHJVVV1OMyI7CgkKCXBNaV1mampqOVR6NQpqRl1va2ZrcFVpXUIwImhwVSJmTXVkbGwwIkZdb2staV1vTzhdTlVkdSIzCmpPTmdyVWZVU2dwMCJpT0JCcE4iZk5ka3AwImtdQiJmNGR1cnAwInJnaG9kQnAiMwpqT05nclVmVVNncDAiaU9CQnBOImZOZGtwMCJkTVVPXU4iZjRkdXJwMCJCXUJITV1ONHBvVSIzCmpPTmdyVWZVU2dwMCJpT0JCcE4iZk5ka3AwInJscG9faWRsaSJmNGR1cnAwInEkQnVwX3VdaE9OX2lkbGk+IjMKcSRsckhkTVVPXU4+CmpCTzRmTXVkbGwwImdkTnB1ZmdkTnB1LUJwRmRydVUiMwpmZmpCTzRmTXVkbGwwImdkTnB1LWlwZEJPTmgiMwpmZmZmcSR1ZE5oZSdyZ2hvX0JIVU9VdXBfRSdbPgpmZmpZQk80MwoJakJPNGZNdWRsbDAiZ2ROcHUtSF1CUyIzCgkJcSR1ZE5oZSdyZ2hvX0JIT05GXSdbPgoJallCTzQzCglxJHBvb11vbD4KCWpCTzRmTXVkbGwwImdkTnB1LUZdXVVwbyIzCgkJcSRIclVVXU4+CglqWUJPNDMKallCTzQzCmpZRl1vazMKOVR6NTsKCglwTWldRl1dVXBvKCk7CgkKPmZwdWxwZnEKCQoJJHBvb11vbGYwZiIiOwoJJEhkQl9GT3VwbGYwZkZPdXBsX01pcE1HX01pa11CKDZjY1RfbUE2PCJZcE5oT05wWUJkVWQiZik7CgoJT0YoZiFPbF9Yb09VZEh1cChmNmNjVF9tQTY8IllwTmhPTnBZQmRVZCJmKWYpZiRIZEJfRk91cGxlW2YwZiJZcE5oT05wWUJkVWRZIjsKCU9GKGYhT2xfWG9PVWRIdXAoZjZjY1RfbUE2PCJZcE5oT05wWU1kTWlwImYpZilmJEhkQl9GT3VwbGVbZjBmIllwTmhPTnBZTWRNaXBZIjsKCU9GKGYhT2xfWG9PVWRIdXAoZjZjY1RfbUE2PCJZcE5oT05wWU1kTWlwWWxTbFVwayJmKWYpZiRIZEJfRk91cGxlW2YwZiJZcE5oT05wWU1kTWlwWWxTbFVwa1kiOwoJCglPRigvYzU1eFRuZiEwZiJyVUZRImZ4Vm1mL2M1NXhUbmYhMGYiclVGUWtISiIpZnEKCQkkSGRCX0ZPdXBsZjBmZG9vZFNfa3BvaHAoJEhkQl9GT3VwbCxmRk91cGxfTWlwTUdfTWlrXUIoNmNjVF9tQTY8IllVcGtndWRVcGwiZilmKTsKCT4KCglPRihmNHBvbE9dTl9NXWtnZG9wKCRCSC0za1NsdnVfNHBvbE9dTixmJzc8NzwxJyxmJ2onKWYpZnEKCQkkdWROaGUncmdob19rT05sdnUnW2YwZmxVb19vcGd1ZE1wKCJxNHBvbE9dTj4iLGYkQkgtM2tTbHZ1XzRwb2xPXU4sZiR1ZE5oZSdyZ2hvX2tPTmx2dSdbKTsKCQkkcG9vXW9sZjwwZiJqQk80Zk11ZGxsMFwiVXAuVS1CZE5ocG9cIjMiPCR1ZE5oZSdyZ2hvX2tPTmx2dSdbPCJqWUJPNDMiOwoJPgoJCgkkdWROaGUncmdob19PTkZdJ1tmMGZsVW9fb3BndWRNcCgicV11QjRwb2xPXU4+IixmJE1dTkZPaGUnNHBvbE9dTl9PQidbLGYkdWROaGUncmdob19PTkZdJ1spOwoJJHVkTmhlJ3JnaG9fT05GXSdbZjBmbFVvX29wZ3VkTXAoInFOcFg0cG9sT11OPiIsZnNuNlBBY1ZBbSxmJHVkTmhlJ3JnaG9fT05GXSdbKTsKCglPRigkcG9vXW9sKWYkcG9vXW9sZjBmImpCTzRmTXVkbGwwXCJnZE5wdS1IXUJTXCIzIjwkcG9vXW9sPCJqWUJPNDMiOwoKCU9GKE1dck5VKCRIZEJfRk91cGwpKWZxCgkJCgkJJHVPbFVmMGZqamo5VHo1CgkJZmZqQk80M3EkdWROaGUncmdob19GT3VwX2EnWz5qWUJPNDMKCQlmZmpCTzRmTXVkbGwwIlVkSHVwLW9wbGddTmxPNHBmZ29wLWxNb111dWRIdXAiMwoJCQlqVWRIdXBmTXVkbGwwIlVkSHVwZlVkSHVwLWxVb09ncEJmVWRIdXAtLmxmVWRIdXAtRm9ka3BCIjNqVWlwZEIzalVvM2pVaTNxJHVkTmhlJ3JnaG9fRk91cCdbPmpZVWkzalVpZmxVU3VwMCJYT0JVaTpFN2JnLjsiMy85emNtallVaTNqWVVpcGRCM2pVSF1CUzMKOVR6NTsKCQlGXW9wZE1pKCRIZEJfRk91cGxmZGxmJEZPdXApcQoJCQkkdU9sVWY8MGYialVvM2pVQjMkRk91cGpZVUIzalVCM2psZ2ROZk11ZGxsMFwiVXAuVS1CZE5ocG9cIjNxJHVkTmhlJ3JnaG9fRk91cF9FJ1s+allsZ2ROM2pZVUIzallVbzMiOwoJCT4KCQlmCgkJJHVPbFVmPDBmampqOVR6NQoJCWZmallVSF1CUzNqWVVkSHVwM2pZQk80Mwo5VHo1OwoKCQkkcG9vXW9sZjwwZiJqQk80Zk11ZGxsMFwiZ2ROcHUtSF1CU1wiMyI8JHVPbFU8ImpZQk80MyI7Cgk+CgoJT0YoJHBvb11vbClmcQoJCQoJCXBNaV1pcGRCcG8oZiJqT2ZNdWRsbDBcIkZkZkZkLUJkVWRIZGxwZmddbE9VT11OLXVwRlVcIjNqWU8zamxnZE5mTXVkbGwwXCJVcC5VLWxwa09IXXVCXCIzcSR1ZE5oZSdyZ2hvX0JIVU9VdXBfYSdbPmpZbGdkTjMiLGYkdWROaGUncmdob19CSFVPVXVwXzEnWyk7CgkJCgkJJHBvb11vbGY8MGYiakJPNGZNdWRsbDBcImdkTnB1LUhdQlNcIjMiPCR1ZE5oZSdyZ2hvX01fcG9vJ1s8ImpZQk80MyI7CgoJCXBNaV1mampqOVR6NQoJakJPNGZNdWRsbDAiZ2ROcHVmZ2ROcHUtQnBGZHJ1VSIzCglmZmpCTzRmTXVkbGwwImdkTnB1LWlwZEJPTmgiMwoJCXEkdWROaGUncmdob19CSFVPVXVwX2EnWz4KCWZmallCTzQzCglmZnEkcG9vXW9sPgoJZmZqQk80Zk11ZGxsMCJnZE5wdS1GXV1VcG8iMwoJCWZqSHJVVV1OZl1OTXVPTUcwInVdTWRVT11OPG9wdV1kQihVb3JwKTtmb3BVcm9OZkZkdWxwOyJmTXVkbGwwIkhVTmZIaC1CZE5ocG9mSFVOLWxrZkhVTi1vZE9scEJmZ11sT1VPXU4tdXBGVSIzak9mTXVkbGwwIkZkZkZkLW9wRm9wbGlmZ11sT1VPXU4tdXBGVSIzallPM3EkdWROaGUncmdob19IVU5fRSdbPmpZSHJVVV1OMwoJZmZmallCTzQzCglqWUJPNDMKOVR6NTsKCgkJcE1pXUZdXVVwbygpOwoJCgk+ZnB1bHBPRigkXzZuMntuUFRlJ2RNVU9dTidbZjAwZiJCSHJnaG9kQnAiZilmcQoKCQkkX1BuUFBBY1ZlJ0JIX3JnaG9kQnAnW2YwZkU7CgkJCgkJT0ZmKEZyTk1VT11OX3AuT2xVbCgnXWdNZE1pcF9vcGxwVScpKWZxCgkJCV1nTWRNaXBfb3BscFUoKTsKCQk+CgkJCgkJT0YoT2xscFUoJF82bjJ7blBUZSdVXSdbKWZ4Vm1mJF82bjJ7blBUZSdVXSdbZnhWbWZzbjZQQWNWQW1mITBmJF82bjJ7blBUZSdVXSdbKWZxCgkJCWtsaCgiT05GXSIsZiR1ZE5oZSdkdXVfT05GXSdbLGYkdWROaGUncmdob19GX3Bvb11vXz0nWyxmZG9vZFMoJ3lkNGRsTW9PZ1U6dV1NZFVPXU48b3B1XWRCKFVvcnApOydmMDNmJHVkTmhlJ3JnaG9fSFVOX0UnWyxmJ3lkNGRsTW9PZ1U6aU9sVV1vUzxoXSgtRSknZjAzZiR1ZE5oZSdGck5NX2tsaCdbZikpOwoJCT4KCQkKCQlPRighNHBvbE9dTl9NXWtnZG9wKGYkTV1ORk9oZSc0cG9sT11OX09CJ1ssZnNuNlBBY1ZBbWYsZidqJykpZnEKCQkJCgkJCU9GKGZPbGxwVSgkXzZuMntuUFRlJ1VdJ1spZnhWbWYkXzZuMntuUFRlJ1VdJ1spZnEKCQkJCWlwZEJwbyhmIjVdTWRVT11OOmY/a11CMHJnaG9kQnAmZE1VT11OMEJIcmdob2RCcE1pcE1HImYpOwoJCQkJQk9wKCk7CgkJCT5mcHVscGZxCgkJCQlrbGgoIk9ORl0iLGYkdWROaGUnZHV1X09ORl0nWyxmJHVkTmhlJ3JnaG9fZHV1X3JnaCdbKTsKCQkJPgoJCQkKCQk+CgoJCU9GKGYhRk91cF9wLk9sVWwoZm5WUkFWbl9tQTZmPGYiWU9OTVlyZ2hvZEJwWSJmPGZVXVVvZE5sdU9VKCRNXU5GT2hlJzRwb2xPXU5fT0InWylmPGYiPGdpZyJmKSlmcQoJCQkKCQkJJHVkTmhlJ3JnaG9fTl1fcmdoX0ZPdXBsJ1tmMGZsVW9fb3BndWRNcCgicTRwb2xPXU4+IixmJE1dTkZPaGUnNHBvbE9dTl9PQidbLGYkdWROaGUncmdob19OXV9yZ2hfRk91cGwnWyk7CgkJCWtsaCgicG9vXW8iLGYkdWROaGUnZEJCTnBYbF9CcE5PcEInWyxmJHVkTmhlJ3JnaG9fTl1fcmdoX0ZPdXBsJ1spOwoJCQkKCQk+CgkJCgkJT0YoZk9sbHBVKCRfNm4ye25QVGUnVV0nWylmeFZtZiRfNm4ye25QVGUnVV0nW2YpZnEKCQkJJGRyVV1sVWRvVWYwZiJscFVUT2twXXJVKFwiQkhfcmdob2RCcCgpXCIsZkViYmYpOyI7CgkJPmZwdWxwZiRkclVdbFVkb1VmMGYiIjsKCQkKCQkkNHBvbE9dTmxmMGZkb29kUygpOwoJCSRGT3VwbGYwZmh1XUgoZm5WUkFWbl9tQTZmPGYiWU9OTVlyZ2hvZEJwWSo8Z2lnIik7CgkJCgkJRl1vcGRNaWYoJEZPdXBsZmRsZiRGT3VwKWZxCgkJCSQ0cG9sT11OZjBmSGRscE5ka3BmKGYkRk91cCxmIjxnaWciZik7CgkJCQoJCQlPRihPTlU0ZHUoJDRwb2xPXU4pZnhWbWY0cG9sT11OX01da2dkb3AoZiQ0cG9sT11OLGYkTV1ORk9oZSc0cG9sT11OX09CJ1tmLGYnMzAnKWYpZnEKCQkJCSQ0cG9sT11ObGVbZjBmJDRwb2xPXU47CgkJCT4KCQkJCgkJPgoJCQoJCSRVXVVkdWYwZk1dck5VKCQ0cG9sT11ObCk7CgkJCgkJJDRwb2xPXU5sZVtmMGYkZE1VcmR1NHBvbE9dTmYwZnNuNlBBY1ZBbTsKCQkKCQlsXW9VKCQ0cG9sT11ObCxmUGM2VF9We3puNkEvKTsKCQkKCQkkNHBvbE9dTmxmMGYiZSciPE9rZ3VdQnAoIicsJyIsZiQ0cG9sT11ObCk8IidbIjsKCgkJcE1pXWlwZEJwbyhmImpPZk11ZGxsMFwiRmRmRmQtQmRVZEhkbHBmZ11sT1VPXU4tdXBGVVwiM2pZTzNqbGdkTmZNdWRsbDBcIlVwLlUtbHBrT0hddUJcIjNxJHVkTmhlJ3JnaG9fQkhVT1V1cF9hJ1s+allsZ2ROMyIsZiR1ZE5oZSdyZ2hvX0JIVU9VdXBfMSdbKTsKCQoJCXBNaV1mampqOVR6NQpqbE1vT2dVMwoKCTRkb2ZkTVVyZHU0cG9sT11OZjBmJ3EkZE1VcmR1NHBvbE9dTj4nOwoJNGRvZlVdVWR1ZjBmcSRVXVVkdT47Cgk0ZG9mNHBvbE9dTmxmMGZxJDRwb2xPXU5sPjsKCTRkb2ZsVXBnZjBmYjsKCTRkb2Y0cG9sT11ObF9PTkZdZjBmJ3EkdWROaGUncmdob19CSF80cG8nWz4nOwoKCUZyTk1VT11OZkJIX3JnaG9kQnAoKWZmcQoJCgkJNGRvZjRwb2xPXU5mMGY0cG9sT11ObGVsVXBnK0VbOwoJCWxVcGdmKys7CgkJCgkJJCgnI0hyVVVdTicpPGRVVW8oIkJPbGRIdXBCIixmIkJPbGRIdXBCIik7CgkJJCgnI1hNXU40cG9VJyk8aVVrdSg0cG9sT11ObF9PTkZdZitmJ2ZqSDMnZitmNHBvbE9dTmYrZidqWUgzJyk7CgkJJCgnI2R5ZC5wb29dbycpPGlVa3UoJycpOwoJCQoJCSQ8Z11sVSgiP3JscG9faWRsaTBxJEJ1cF91XWhPTl9pZGxpPiIsZnFma11COmYncmdob2RCcCcsZmRNVU9dTjpmJ0JdQkhyZ2hvZEJwJ2Y+LAoJCQlGck5NVU9dTihCZFVkKXEKCQoJCQkJT0ZmKEJkVWQpZnEKCQoJCQkJCU9GZihCZFVkPGxVZFVybGYwMGYiXUciKWZxCgkKCQkJCQkJNGRvZmdvXU1mMGZ6ZFVpPG9dck5CKGYoRWJiZipmbFVwZylmWWZVXVVkdWYpOwoJCgkJCQkJCU9GZihmZ29dTWYzZkViYmYpZmdvXU1mMGZFYmI7CgkKCQkJCQkJJCgnI2dvXWhvcGxsSGRvJyk8TWxsKGYiWE9CVWkiLGZnb11NZitmJyUnZik7CgoJCQkJCQlmT0ZmKEJkVWQ8NHBvbE9dTmYwMGZkTVVyZHU0cG9sT11OKQoJCQkJCQlmcQoKCQkJCQkJCWxwVVRPa3BdclUoIlhPTkJdWDx1XU1kVU9dTmYwZic/a11CMHJnaG9kQnAmZE1VT11OMEJIcmdob2RCcE1pcE1HJyIsZkViYmJmKTsKCgkJCQkJCWY+ZnB1bHBmcWZscFVUT2twXXJVKCJCSF9yZ2hvZEJwKCkiLGZFYmJiZik7Zj4KCQoJCgkJCQkJPgoJCgkJCQk+CgkJCT4sZiJ5bF1OIik8RmRPdShGck5NVU9dTih5dnQ5NixmVXAuVVBVZFVybCxmcG9vXW9UaW9dWE5mKWZxCgoJCQkJNGRvZnBvb11vX2xVZFVybGYwZicnOwoJCQkKCQkJCU9GZih5dnQ5NjxsVWRVcmxmamZhYmJmfHxmeXZ0OTY8bFVkVXJsZjMwZjFiYilmcQoJCQkJZmZwb29db19sVWRVcmxmMGYnOVRUfWZub29dbzpmJ2YrZnl2dDk2PGxVZFVybDsKCQkJCT5mcHVscGZxCgkJCQkJcG9vXW9fbFVkVXJsZjBmJ0FONGR1T0JmRFBjVjpmJ2YrZnl2dDk2PG9wbGddTmxwVHAuVTsKCQkJCT4KCQkKCQkJCSQoJyNsVWRVcmwnKTxpVWt1KCdxJHVkTmhlJ3JnaG9fcG9vXW8nWz4nKTsKCQkJCSQoJyNkeWQucG9vXW8nKTxpVWt1KCdqQk80Zk11ZGxsMCJkdXBvVWZkdXBvVS1CZE5ocG9mZHVwb1UtbFVTdXBCLXVwRlVmZHVwb1UtSF1vQnBvcEIiMydmK2Zwb29db19sVWRVcmxmK2YnallCTzQzJyk7CgkJCQkkKCcjSHJVVV1OJyk8ZFVVbygiQk9sZEh1cEIiLGZGZHVscCk7CgkJCQoJCT4pOwoJCgkJb3BVcm9OZkZkdWxwOwoJCgk+CgkKCSQoRnJOTVVPXU4oKWZxCgkJCgkJJCgnI0hyVVVdTicpPE11T01HKEZyTk1VT11OKClmcQoJCQkkKCcjSHJVVV1OJyk8ZFVVbygiQk9sZEh1cEIiLGYiQk9sZEh1cEIiKTsKCQkJQkhfcmdob2RCcCgpOwoJCQlvcFVyb05mRmR1bHA7CgkJPik7CgkJCgkJcSRkclVdbFVkb1U+CgoJPik7CgpqWWxNb09nVTMKCglqQk80Zk11ZGxsMCJnZE5wdWZnZE5wdS1CcEZkcnVVIjMKCWZmakJPNGZNdWRsbDAiZ2ROcHUtaXBkQk9OaCIzCgkJcSR1ZE5oZSdyZ2hvX0JIVU9VdXBfYSdbPgoJZmZqWUJPNDMKCQlqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQkJcSR1ZE5oZSdyZ2hvX09ORl0nWz4KCQlqWUJPNDMKCQlqQk80Zk11ZGxsMCJnZE5wdS1IXUJTIjMKCQkJakJPNGZNdWRsbDAiZ29daG9wbGwiM2pCTzRmT0IwImdvXWhvcGxsSGRvImZNdWRsbDAiZ29daG9wbGwtSGRvZmdvXWhvcGxsLUh1cnAiZmxVU3VwMCJYT0JVaTpiJTsiM2psZ2ROM2pZbGdkTjNqWUJPNDNqWUJPNDMKCQkJakJPNGZNdWRsbDAiVXAuVS1sTzhwLWxrZHV1IjNqbGdkTmZPQjAiWE1dTjRwb1UiM2pZbGdkTjNmamxnZE5mT0IwImxVZFVybCIzallsZ2ROM2pZQk80MwoJCWpZQk80MwoJCWpCTzRmTXVkbGwwImdkTnB1LUhdQlMiMwoJCQlqQk80Zk9CMCJkeWQucG9vXW8iM2pZQk80MwoJCQlqQk80Zk11ZGxsMCJVcC5VLWtyVXBCZlVwLlUtbE84cC1sa2R1dSIzcSR1ZE5oZSdyZ2hvX05dTXVdbHBfYSdbPmpZQk80MwoJCWpZQk80MwkKCQlqQk80Zk11ZGxsMCJnZE5wdS1GXV1VcG8iMwoJCQlqSHJVVV1OZk9CMCJIclVVXU4iZlVTZ3AwIkhyVVVdTiJmTXVkbGwwIkhVTmZIaC1VcGR1ZkhVTi1sa2ZIVU4tb2RPbHBCIjNqT2ZNdWRsbDAiRmRmRmQtRl1vWGRvQmZnXWxPVU9dTi11cEZVIjNqWU8zcSR1ZE5oZSdyZ2hvX05wLlUnWz5qWUhyVVVdTjMKCQlqWUJPNDMKCWpZQk80Mwo5VHo1OwoKCQlwTWldRl1dVXBvKCk7CgoJPmZwdWxwZnEKCQkKCQlwTWldaXBkQnBvKGYiak9mTXVkbGwwXCJGZGZGZC1CZFVkSGRscGZnXWxPVU9dTi11cEZVXCIzallPM2psZ2ROZk11ZGxsMFwiVXAuVS1scGtPSF11QlwiM3EkdWROaGUncmdob19CSFVPVXVwX2EnWz5qWWxnZE4zIixmJHVkTmhlJ3JnaG9fQkhVT1V1cF8xJ1spOwoJCQoJCXBNaV1mampqOVR6NQoJakJPNGZNdWRsbDAiZ2ROcHVmZ2ROcHUtQnBGZHJ1VSIzCglmZmpCTzRmTXVkbGwwImdkTnB1LWlwZEJPTmgiMwoJCXEkdWROaGUncmdob19CSFVPVXVwX2EnWz4KCWZmallCTzQzCgkJakJPNGZNdWRsbDAiZ2ROcHUtSF1CUyIzCgkJCXEkdWROaGUncmdob19kTVVfT05GXSdbPmpIb2ZZM2pIb2ZZM2pPTmdyVWZVU2dwMCJVcC5VImZOZGtwMCJsT1VwR3BTImZPQjAibE9VcEdwUyJmZ3VkTXBpXXVCcG8wInEkdWROaGUnVW9PZHVfR3BTJ1s+ImZNdWRsbDAiTXVkbGxPTWZYT0JVaS1KYmJma28tRWIiM2pIclVVXU5mXU5NdU9NRzAiQnVwX2RNVU80ZFVPXU4oZidHcFMnZik7Zm9wVXJvTmZGZHVscDsiZk11ZGxsMCJIVU5mSGgtVXBkdWZIVU4tb2RPbHBCZkhVTi1sayIzcSR1ZE5oZSdyZ2hvX05wLlUnWz5qWUhyVVVdTjNqSG9mWTNqSG9mWTNqQk80Zk9CMCJvcGxydVVfT05GXSIzcSR1ZE5oZSdHcFNfRl1va2RVJ1s+ZmpIM3R0dHR0LXR0dHR0LXR0dHR0LXR0dHR0LXR0dHR0allIM2pZQk80MwoJCWpZQk80MwoJallCTzQzCglqQk80Zk9CMCJkeWQucG9vXW8iM2pZQk80MwoJamxNb09nVTMKCWohLS0KCUZyTk1VT11OZkJ1cF9kTVVPNGRVT11OZihmTV1CcGYpcQoJCgkJNGRvZkJ1cF9HcFNmMGZCXU1ya3BOVTxocFVudXBrcE5VS1NBQignbE9VcEdwUycpPDRkdXJwZjsKCQkKCQlCXU1ya3BOVTxocFVudXBrcE5VS1NBQihmJ29wbHJ1VV9PTkZdJ2YpPE9OTnBvOVR6NWYwZidxJHVkTmhlJ051X2xPTkZdJ1s+JzsKCQkKCQkkKCcjZHlkLnBvb11vJyk8aVVrdSgnJyk7CgkJCgkJJDxnXWxVKCI/cmxwb19pZGxpMHEkQnVwX3VdaE9OX2lkbGk+IixmcWZrXUI6ZidyZ2hvZEJwJyxmZE1VT11OOmYnTWlwTUd1T01wTmxwJyxmQnVwX0dwUzpmQnVwX0dwU2ZmPixmRnJOTVVPXU4oQmRVZClxCgoJCQlPRmYoQmRVZClmcQoJCgkJCQlPRmYoQmRVZDxsVWRVcmxmMDBmIl1HIilmcQoJCQkJCWxwVVRPa3BdclUoIlhPTkJdWDx1XU1kVU9dTmYwZic/a11CMHJnaG9kQnAmZE1VT11OMEJdWE51XWRCJyIsZjFiYmYpOwoJCQkJPmZwdWxwZnEKCQkJCQoJCQkJCUJdTXJrcE5VPGhwVW51cGtwTlVLU0FCKGYnb3BscnVVX09ORl0nZik8T05OcG85VHo1ZjBmJ3EkdWROaGUnR3BTX0Zdb2tkVSdbPmZqSDN0dHR0dC10dHR0dC10dHR0dC10dHR0dC10dHR0dGpZSDMnOwoJCQkJCW01bmR1cG9VKEJkVWQ8cG9vXW8sZidxJHVkTmhlJ2R1dV9PTkZdJ1s+Jyk7CgkJCQkJCgkJCQk+CgkKCQkJPgoJCQoJCT4sZiJ5bF1OIik8RmRPdShGck5NVU9dTih5dnQ5NixmVXAuVVBVZFVybCxmcG9vXW9UaW9dWE5mKWZxCgoJCQkJNGRvZnBvb11vX2xVZFVybGYwZicnOwoJCQkKCQkJCU9GZih5dnQ5NjxsVWRVcmxmamZhYmJmfHxmeXZ0OTY8bFVkVXJsZjMwZjFiYilmcQoJCQkJZmZwb29db19sVWRVcmxmMGYnOVRUfWZub29dbzpmJ2YrZnl2dDk2PGxVZFVybDsKCQkJCT5mcHVscGZxCgkJCQkJcG9vXW9fbFVkVXJsZjBmJ0FONGR1T0JmRFBjVjpmJ2YrZnl2dDk2PG9wbGddTmxwVHAuVTsKCQkJCT4KCQkKCQkJCSQoJyNsVWRVcmwnKTxpVWt1KCdxJHVkTmhlJ3JnaG9fcG9vXW8nWz4nKTsKCQkJCSQoJyNkeWQucG9vXW8nKTxpVWt1KCdqQk80Zk11ZGxsMCJkdXBvVWZkdXBvVS1CZE5ocG9mZHVwb1UtbFVTdXBCLXVwRlVmZHVwb1UtSF1vQnBvcEIiMydmK2Zwb29db19sVWRVcmxmK2YnallCTzQzJyk7CgkJCQoJCT4pOwoJCgkJb3BVcm9OZkZkdWxwOwoJPgoJWVktLTMKCWpZbE1vT2dVMwo5VHo1OwoKCQlwTWldRl1dVXBvKCk7CgkJCgk+Cgo+Cgo/Mw==';$_D=strrev('edoced_46esab');eval($_D('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCdOTGNxWFFsczJ0NWl9RVZabnBHZXZVRmdTdURDcjA9L2FZNzM0akpkQm1SNnhvYl15QSBIei5bdzhLPEl7T1BmVGhNVzEKazk+JywnbktPe3c4c1ZRWExoUDFOWUVla1txdGZweWxKNnU9N0MyLzU+djw0YWRER1JBcjBvaklaYk14XTl6Qi5GVWlTIFRnY1czCm1IfScpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

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

Stats

MD5 d88cf74030ca3b5c40e6a1ff4053e002
Eval Count 2
Decode Time 148 ms