Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 204 lines (150 sloc) 73.6 KB
<?php
header('Expires: Mon, 12 Dec 1982 06:14:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
function __errorHandler($errno=NULL, $errstr, $errfile=NULL, $errline=NULL, $errcontext=NULL){
return;
}
error_reporting(E_ALL ^ E_NOTICE);
set_error_handler('__errorHandler');
define('kBUILD', '515');
define('kVERSION', '2.0.3');
define('kINSTALL_ASSET_LOCATION', './symphony/assets/installer');
define('kINSTALL_FILENAME', basename(__FILE__));
## Show PHP Info
if(isset($_REQUEST['info'])){
phpinfo();
exit();
}
function setLanguage() {
require_once('symphony/lib/toolkit/class.lang.php');
$lang = NULL;
if(!empty($_REQUEST['lang'])){
$l = preg_replace('/[^a-zA-Z\-]/', '', $_REQUEST['lang']);
if(file_exists("./symphony/lib/lang/lang.{$l}.php")) $lang = $l;
}
if($lang === NULL){
foreach(Lang::getBrowserLanguages() as $l){
if(file_exists("./symphony/lib/lang/lang.{$l}.php")) $lang = $l;
break;
}
}
## none of browser accepted languages is available, get first available
if($lang === NULL){
## default to English
if(file_exists('./symphony/lib/lang/lang.en.php')) $lang = 'en';
else{
$l = Lang::getAvailableLanguages();
if(is_array($l) && count($l) > 0) $lang = $l[0];
}
}
if($lang === NULL) return NULL;
try{
Lang::init('./symphony/lib/lang/lang.%s.php', $lang);
}
catch(Exception $s){
return NULL;
}
define('__LANG__', $lang);
return $lang;
}
/***********************
TESTS
************************/
// Check for PHP 5.1+
if(version_compare(phpversion(), '5.1.3', '<=')){
$code = '<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Outstanding Requirements</title>
<link rel="stylesheet" type="text/css" href="'.kINSTALL_ASSET_LOCATION.'/main.css"/>
<script type="text/javascript" src="'.kINSTALL_ASSET_LOCATION.'/main.js"></script>
</head>
<body>
<h1>Install Symphony <em>Version '.kVERSION.'</em></h1>
<h2>Outstanding Requirements</h2>
<p>Symphony needs the following requirements satisfied before installation can proceed.</p>
<dl>
<dt><abbr title="PHP: Hypertext Pre-processor">PHP</abbr> 5.1.3 or above</dt>
<dd>Symphony needs a recent version of <abbr title="PHP: Hypertext Pre-processor">PHP</abbr>.</dd>
</dl>
</body>
</html>';
die($code);
}
// Check and set language
if(setLanguage() === NULL){
$code = '<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Outstanding Requirements</title>
<link rel="stylesheet" type="text/css" href="'.kINSTALL_ASSET_LOCATION.'/main.css"/>
<script type="text/javascript" src="'.kINSTALL_ASSET_LOCATION.'/main.js"></script>
</head>
<body>
<h1>Install Symphony <em>Version '.kVERSION.'</em></h1>
<h2>Outstanding Requirements</h2>
<p>Symphony needs at least one language file to be present before installation can proceed.</p>
</body>
</html>';
die($code);
}
// Check if Symphony is already installed
if(file_exists('manifest/config.php')){
$code = '<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>'.__('Existing Installation').'</title>
<link rel="stylesheet" type="text/css" href="'.kINSTALL_ASSET_LOCATION.'/main.css"/>
<script type="text/javascript" src="'.kINSTALL_ASSET_LOCATION.'/main.js"></script>
</head>
<body>
<h1>'.__('Install Symphony <em>Version %s</em>', array(kVERSION)).'</h1>
<h2>'.__('Existing Installation').'</h2>
<p>'.__('It appears that Symphony has already been installed at this location.').'</p>
</body>
</html>';
die($code);
}
/////////////////////////
function getDynamicConfiguration(){
$conf = array();
$conf['admin']['max_upload_size'] = '5242880';
$conf['symphony']['pagination_maximum_rows'] = '17';
$conf['symphony']['allow_page_subscription'] = '1';
$conf['symphony']['lang'] = 'en';
$conf['symphony']['version'] = '2.0.3';
$conf['log']['archive'] = '1';
$conf['log']['maxsize'] = '102400';
$conf['general']['sitename'] = 'Symphony CMS';
$conf['image']['cache'] = '1';
$conf['image']['quality'] = '90';
$conf['database']['driver'] = 'mysql';
$conf['database']['character_set'] = 'utf8';
$conf['database']['character_encoding'] = 'utf8';
$conf['database']['runtime_character_set_alter'] = '1';
$conf['database']['disable_query_caching'] = 'no';
$conf['public']['display_event_xml_in_source'] = 'yes';
$conf['region']['time_format'] = 'H:i';
$conf['region']['date_format'] = 'd F Y';
$conf['maintenance_mode']['enabled'] = 'no';
return $conf;
}
function getTableSchema(){
$sql = <<<SQL
DQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2F1dGhvcnNgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9hdXRob3JzYDsNCkNSRUFURSBUQUJMRSBgdGJsX2F1dGhvcnNgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYHVzZXJuYW1lYCB2YXJjaGFyKDIwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICcnLAogIGBwYXNzd29yZGAgdmFyY2hhcigzMikgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnJywKICBgZmlyc3RfbmFtZWAgdmFyY2hhcigxMDApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgbGFzdF9uYW1lYCB2YXJjaGFyKDEwMCkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGBlbWFpbGAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgbGFzdF9zZWVuYCBkYXRldGltZSBkZWZhdWx0ICcwMDAwLTAwLTAwIDAwOjAwOjAwJywKICBgdXNlcl90eXBlYCBlbnVtKCdhdXRob3InLCdkZXZlbG9wZXInKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICdhdXRob3InLAogIGBwcmltYXJ5YCBlbnVtKCd5ZXMnLCdubycpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMIGRlZmF1bHQgJ25vJywKICBgZGVmYXVsdF9zZWN0aW9uYCBpbnQoMTEpIE5PVCBOVUxMLAogIGBhdXRoX3Rva2VuX2FjdGl2ZWAgZW51bSgneWVzJywnbm8nKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICdubycsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBVTklRVUUgS0VZIGB1c2VybmFtZWAgKGB1c2VybmFtZWApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfY2FjaGVgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9jYWNoZWA7DQpDUkVBVEUgVEFCTEUgYHRibF9jYWNoZWAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgaGFzaGAgdmFyY2hhcigzMikgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnJywKICBgY3JlYXRpb25gIGludCgxNCkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsCiAgYGV4cGlyeWAgaW50KDE0KSB1bnNpZ25lZCBkZWZhdWx0IE5VTEwsCiAgYGRhdGFgIGxvbmd0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBjcmVhdGlvbmAgKGBjcmVhdGlvbmApLAogIEtFWSBgaGFzaGAgKGBoYXNoYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc2A7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBzZWN0aW9uX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBhdXRob3JfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGNyZWF0aW9uX2RhdGVgIGRhdGV0aW1lIE5PVCBOVUxMLAogIGBjcmVhdGlvbl9kYXRlX2dtdGAgZGF0ZXRpbWUgTk9UIE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYHNlY3Rpb25faWRgIChgc2VjdGlvbl9pZGApLAogIEtFWSBgYXV0aG9yX2lkYCAoYGF1dGhvcl9pZGApLAogIEtFWSBgY3JlYXRpb25fZGF0ZWAgKGBjcmVhdGlvbl9kYXRlYCksCiAgS0VZIGBjcmVhdGlvbl9kYXRlX2dtdGAgKGBjcmVhdGlvbl9kYXRlX2dtdGApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZXh0ZW5zaW9uc2AgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2V4dGVuc2lvbnNgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZXh0ZW5zaW9uc2AgKAogIGBpZGAgaW50KDExKSBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgbmFtZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMIGRlZmF1bHQgJycsCiAgYHN0YXR1c2AgZW51bSgnZW5hYmxlZCcsJ2Rpc2FibGVkJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnZW5hYmxlZCcsCiAgYHZlcnNpb25gIGRvdWJsZSB1bnNpZ25lZCBOT1QgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgbmFtZWAgKGBuYW1lYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9leHRlbnNpb25zX2RlbGVnYXRlc2AgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2V4dGVuc2lvbnNfZGVsZWdhdGVzYDsNCkNSRUFURSBUQUJMRSBgdGJsX2V4dGVuc2lvbnNfZGVsZWdhdGVzYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBleHRlbnNpb25faWRgIGludCgxMSkgTk9UIE5VTEwsCiAgYHBhZ2VgIHZhcmNoYXIoMTAwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCwKICBgZGVsZWdhdGVgIHZhcmNoYXIoMTAwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCwKICBgY2FsbGJhY2tgIHZhcmNoYXIoMTAwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZXh0ZW5zaW9uX2lkYCAoYGV4dGVuc2lvbl9pZGApLAogIEtFWSBgcGFnZWAgKGBwYWdlYCksCiAgS0VZIGBkZWxlZ2F0ZWAgKGBkZWxlZ2F0ZWApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZmllbGRzYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZmllbGRzYDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc2AgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgbGFiZWxgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCwKICBgZWxlbWVudF9uYW1lYCB2YXJjaGFyKDUwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCwKICBgdHlwZWAgdmFyY2hhcigzMikgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwsCiAgYHBhcmVudF9zZWN0aW9uYCBpbnQoMTEpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLAogIGByZXF1aXJlZGAgZW51bSgneWVzJywnbm8nKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICd5ZXMnLAogIGBzb3J0b3JkZXJgIGludCgxMSkgTk9UIE5VTEwgZGVmYXVsdCAnMScsCiAgYGxvY2F0aW9uYCBlbnVtKCdtYWluJywnc2lkZWJhcicpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMIGRlZmF1bHQgJ21haW4nLAogIGBzaG93X2NvbHVtbmAgZW51bSgneWVzJywnbm8nKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICdubycsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGluZGV4YCAoYGVsZW1lbnRfbmFtZWAsYHR5cGVgLGBwYXJlbnRfc2VjdGlvbmApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZmllbGRzX2F1dGhvcmAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2ZpZWxkc19hdXRob3JgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZmllbGRzX2F1dGhvcmAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZmllbGRfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGFsbG93X2F1dGhvcl9jaGFuZ2VgIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwsCiAgYGFsbG93X211bHRpcGxlX3NlbGVjdGlvbmAgZW51bSgneWVzJywnbm8nKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICdubycsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBVTklRVUUgS0VZIGBmaWVsZF9pZGAgKGBmaWVsZF9pZGApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZmllbGRzX2NoZWNrYm94YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZmllbGRzX2NoZWNrYm94YDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc19jaGVja2JveGAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZmllbGRfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGRlZmF1bHRfc3RhdGVgIGVudW0oJ29uJywnb2ZmJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnb24nLAogIGBkZXNjcmlwdGlvbmAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZmllbGRfaWRgIChgZmllbGRfaWRgKQopIEVOR0lORT1NeUlTQU0gIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2ZpZWxkc19kYXRlYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZmllbGRzX2RhdGVgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZmllbGRzX2RhdGVgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGZpZWxkX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBwcmVfcG9wdWxhdGVgIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnbm8nLAogIGBjYWxlbmRhcmAgZW51bSgneWVzJywnbm8nKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICdubycsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9maWVsZHNfaW5wdXRgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9maWVsZHNfaW5wdXRgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZmllbGRzX2lucHV0YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBmaWVsZF9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgdmFsaWRhdG9yYCB2YXJjaGFyKDEwMCkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBmaWVsZF9pZGAgKGBmaWVsZF9pZGApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZmllbGRzX3NlbGVjdGAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2ZpZWxkc19zZWxlY3RgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZmllbGRzX3NlbGVjdGAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZmllbGRfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGFsbG93X211bHRpcGxlX3NlbGVjdGlvbmAgZW51bSgneWVzJywnbm8nKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCBkZWZhdWx0ICdubycsCiAgYHN0YXRpY19vcHRpb25zYCB0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpLAogIGBkeW5hbWljX29wdGlvbnNgIGludCgxMSkgdW5zaWduZWQgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBmaWVsZF9pZGAgKGBmaWVsZF9pZGApCikgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZmllbGRzX3RhZ2xpc3RgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9maWVsZHNfdGFnbGlzdGA7DQpDUkVBVEUgVEFCTEUgYHRibF9maWVsZHNfdGFnbGlzdGAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZmllbGRfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYHZhbGlkYXRvcmAgdmFyY2hhcigxMDApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgcHJlX3BvcHVsYXRlX3NvdXJjZWAgdmFyY2hhcigxNSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBmaWVsZF9pZGAgKGBmaWVsZF9pZGApLAogIEtFWSBgcHJlX3BvcHVsYXRlX3NvdXJjZWAgKGBwcmVfcG9wdWxhdGVfc291cmNlYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9maWVsZHNfdGV4dGFyZWFgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9maWVsZHNfdGV4dGFyZWFgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZmllbGRzX3RleHRhcmVhYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBmaWVsZF9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgZm9ybWF0dGVyYCB2YXJjaGFyKDEwMCkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGBzaXplYCBpbnQoMykgdW5zaWduZWQgTk9UIE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9maWVsZHNfdXBsb2FkYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZmllbGRzX3VwbG9hZGA7DQpDUkVBVEUgVEFCTEUgYHRibF9maWVsZHNfdXBsb2FkYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBmaWVsZF9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgZGVzdGluYXRpb25gIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBOT1QgTlVMTCwKICBgdmFsaWRhdG9yYCB2YXJjaGFyKDUwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9mb3Jnb3RwYXNzYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZm9yZ290cGFzc2A7DQpDUkVBVEUgVEFCTEUgYHRibF9mb3Jnb3RwYXNzYCAoCiAgYGF1dGhvcl9pZGAgaW50KDExKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywKICBgdG9rZW5gIHZhcmNoYXIoNikgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwsCiAgYGV4cGlyeWAgdmFyY2hhcigyNSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgYXV0aG9yX2lkYCkKKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX3BhZ2VzYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfcGFnZXNgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfcGFnZXNgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYHBhcmVudGAgaW50KDExKSBkZWZhdWx0IE5VTEwsCiAgYHRpdGxlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnJywKICBgaGFuZGxlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGBwYXRoYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGBwYXJhbXNgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYGRhdGFfc291cmNlc2AgdGV4dCBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSwKICBgZXZlbnRzYCB0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpLAogIGBzb3J0b3JkZXJgIGludCgxMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYHBhcmVudGAgKGBwYXJlbnRgKQopIEVOR0lORT1NeUlTQU0gIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX3BhZ2VzX3R5cGVzYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfcGFnZXNfdHlwZXNgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfcGFnZXNfdHlwZXNgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYHBhZ2VfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYHR5cGVgIHZhcmNoYXIoNTApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBwYWdlX2lkYCAoYHBhZ2VfaWRgLGB0eXBlYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9zZWN0aW9uc2AgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX3NlY3Rpb25zYDsNCkNSRUFURSBUQUJMRSBgdGJsX3NlY3Rpb25zYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBuYW1lYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnJywKICBgaGFuZGxlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwsCiAgYHNvcnRvcmRlcmAgaW50KDExKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywKICBgZW50cnlfb3JkZXJgIHZhcmNoYXIoNykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGBlbnRyeV9vcmRlcl9kaXJlY3Rpb25gIGVudW0oJ2FzYycsJ2Rlc2MnKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0ICdhc2MnLAogIGBoaWRkZW5gIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnbm8nLAogIGBuYXZpZ2F0aW9uX2dyb3VwYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnQ29udGVudCcsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBVTklRVUUgS0VZIGBoYW5kbGVgIChgaGFuZGxlYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9zZWN0aW9uc19hc3NvY2lhdGlvbmAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX3NlY3Rpb25zX2Fzc29jaWF0aW9uYDsNCkNSRUFURSBUQUJMRSBgdGJsX3NlY3Rpb25zX2Fzc29jaWF0aW9uYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBwYXJlbnRfc2VjdGlvbl9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgcGFyZW50X3NlY3Rpb25fZmllbGRfaWRgIGludCgxMSkgdW5zaWduZWQgZGVmYXVsdCBOVUxMLAogIGBjaGlsZF9zZWN0aW9uX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBjaGlsZF9zZWN0aW9uX2ZpZWxkX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBjYXNjYWRpbmdfZGVsZXRpb25gIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnbm8nLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBwYXJlbnRfc2VjdGlvbl9pZGAgKGBwYXJlbnRfc2VjdGlvbl9pZGAsYGNoaWxkX3NlY3Rpb25faWRgLGBjaGlsZF9zZWN0aW9uX2ZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg==
SQL;
return base64_decode(trim($sql));
}
function getWorkspaceData(){
$sql = <<<SQL
DQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2ZpZWxkc19hdXRob3JgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9maWVsZHNfYXV0aG9yYDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc19hdXRob3JgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGZpZWxkX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBhbGxvd19hdXRob3JfY2hhbmdlYCBlbnVtKCd5ZXMnLCdubycpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMLAogIGBhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb25gIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnbm8nLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgVU5JUVVFIEtFWSBgZmllbGRfaWRgIChgZmllbGRfaWRgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9NDAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2ZpZWxkc19hdXRob3JgICoqKg0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2ZpZWxkc19jaGVja2JveGAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2ZpZWxkc19jaGVja2JveGA7DQpDUkVBVEUgVEFCTEUgYHRibF9maWVsZHNfY2hlY2tib3hgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGZpZWxkX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBkZWZhdWx0X3N0YXRlYCBlbnVtKCdvbicsJ29mZicpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMIGRlZmF1bHQgJ29uJywKICBgZGVzY3JpcHRpb25gIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTE0MCBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZmllbGRzX2NoZWNrYm94YCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX2NoZWNrYm94YCAoYGlkYCwgYGZpZWxkX2lkYCwgYGRlZmF1bHRfc3RhdGVgLCBgZGVzY3JpcHRpb25gKSBWQUxVRVMgKDEzOSwgMzAsICdvZmYnLCAnUHVibGlzaCB0aGlzIGFydGljbGUnKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9maWVsZHNfZGF0ZWAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2ZpZWxkc19kYXRlYDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc19kYXRlYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBmaWVsZF9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgcHJlX3BvcHVsYXRlYCBlbnVtKCd5ZXMnLCdubycpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMIGRlZmF1bHQgJ25vJywKICBgY2FsZW5kYXJgIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnbm8nLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBmaWVsZF9pZGAgKGBmaWVsZF9pZGApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD0xMjkgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2ZpZWxkc19kYXRlYCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX2RhdGVgIChgaWRgLCBgZmllbGRfaWRgLCBgcHJlX3BvcHVsYXRlYCwgYGNhbGVuZGFyYCkgVkFMVUVTICg5NiwgNTEsICd5ZXMnLCAnbm8nKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX2RhdGVgIChgaWRgLCBgZmllbGRfaWRgLCBgcHJlX3BvcHVsYXRlYCwgYGNhbGVuZGFyYCkgVkFMVUVTICgxMjcsIDI5LCAneWVzJywgJ25vJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc19kYXRlYCAoYGlkYCwgYGZpZWxkX2lkYCwgYHByZV9wb3B1bGF0ZWAsIGBjYWxlbmRhcmApIFZBTFVFUyAoMTI4LCA1NCwgJ3llcycsICdubycpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2ZpZWxkc19pbnB1dGAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2ZpZWxkc19pbnB1dGA7DQpDUkVBVEUgVEFCTEUgYHRibF9maWVsZHNfaW5wdXRgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGZpZWxkX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGB2YWxpZGF0b3JgIHZhcmNoYXIoMTAwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTQ2MCBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZmllbGRzX2lucHV0YCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX2lucHV0YCAoYGlkYCwgYGZpZWxkX2lkYCwgYHZhbGlkYXRvcmApIFZBTFVFUyAoMjM2LCA0NywgTlVMTCk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc19pbnB1dGAgKGBpZGAsIGBmaWVsZF9pZGAsIGB2YWxpZGF0b3JgKSBWQUxVRVMgKDIzNywgNDgsICcvXlxcdyg/OlxcLj9bXFx3JSstXSspKkBcXHcoPzpbXFx3LV0qXFwuKSs/W2Etel17Mix9JC9pJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc19pbnB1dGAgKGBpZGAsIGBmaWVsZF9pZGAsIGB2YWxpZGF0b3JgKSBWQUxVRVMgKDQ1NiwgMjYsIE5VTEwpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNfaW5wdXRgIChgaWRgLCBgZmllbGRfaWRgLCBgdmFsaWRhdG9yYCkgVkFMVUVTICgzNTYsIDMxLCBOVUxMKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX2lucHV0YCAoYGlkYCwgYGZpZWxkX2lkYCwgYHZhbGlkYXRvcmApIFZBTFVFUyAoNDU4LCAzNywgJy9eXFx3KD86XFwuP1tcXHclKy1dKykqQFxcdyg/OltcXHctXSpcXC4pKz9bYS16XXsyLH0kL2knKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX2lucHV0YCAoYGlkYCwgYGZpZWxkX2lkYCwgYHZhbGlkYXRvcmApIFZBTFVFUyAoNDU3LCAzNiwgTlVMTCk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc19pbnB1dGAgKGBpZGAsIGBmaWVsZF9pZGAsIGB2YWxpZGF0b3JgKSBWQUxVRVMgKDIzOCwgNDksIE5VTEwpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNfaW5wdXRgIChgaWRgLCBgZmllbGRfaWRgLCBgdmFsaWRhdG9yYCkgVkFMVUVTICg0NTksIDM4LCAnL15bXlxcczpcXC8/I10rOig/OlxcL3syLDN9KT9bXlxccy5cXC8/I10rKD86XFwuW15cXHMuXFwvPyNdKykqKD86XFwvW15cXHM/I10qXFw/P1teXFxzPyNdKigjW15cXHMjXSopPyk/JC8nKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9maWVsZHNfc2VsZWN0YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZmllbGRzX3NlbGVjdGA7DQpDUkVBVEUgVEFCTEUgYHRibF9maWVsZHNfc2VsZWN0YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBmaWVsZF9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgYWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uYCBlbnVtKCd5ZXMnLCdubycpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMIGRlZmF1bHQgJ25vJywKICBgc3RhdGljX29wdGlvbnNgIHRleHQgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2ksCiAgYGR5bmFtaWNfb3B0aW9uc2AgaW50KDExKSB1bnNpZ25lZCBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTY4IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9maWVsZHNfc2VsZWN0YCAqKioNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9maWVsZHNfdGFnbGlzdGAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2ZpZWxkc190YWdsaXN0YDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc190YWdsaXN0YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBmaWVsZF9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgdmFsaWRhdG9yYCB2YXJjaGFyKDEwMCkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGBwcmVfcG9wdWxhdGVfc291cmNlYCB2YXJjaGFyKDE1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGZpZWxkX2lkYCAoYGZpZWxkX2lkYCksCiAgS0VZIGBwcmVfcG9wdWxhdGVfc291cmNlYCAoYHByZV9wb3B1bGF0ZV9zb3VyY2VgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTMyIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9maWVsZHNfdGFnbGlzdGAgKioqDQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZmllbGRzX3RleHRhcmVhYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZmllbGRzX3RleHRhcmVhYDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc190ZXh0YXJlYWAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZmllbGRfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGZvcm1hdHRlcmAgdmFyY2hhcigxMDApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgc2l6ZWAgaW50KDMpIHVuc2lnbmVkIE5PVCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBmaWVsZF9pZGAgKGBmaWVsZF9pZGApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD0yOTcgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2ZpZWxkc190ZXh0YXJlYWAgKioqDQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc190ZXh0YXJlYWAgKGBpZGAsIGBmaWVsZF9pZGAsIGBmb3JtYXR0ZXJgLCBgc2l6ZWApIFZBTFVFUyAoMTkyLCA1MCwgTlVMTCwgOSk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc190ZXh0YXJlYWAgKGBpZGAsIGBmaWVsZF9pZGAsIGBmb3JtYXR0ZXJgLCBgc2l6ZWApIFZBTFVFUyAoMjkzLCAyNywgJ3BiX21hcmtkb3duZXh0cmFzbWFydHlwYW50cycsIDIwKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX3RleHRhcmVhYCAoYGlkYCwgYGZpZWxkX2lkYCwgYGZvcm1hdHRlcmAsIGBzaXplYCkgVkFMVUVTICgyNTksIDM0LCAncGJfbWFya2Rvd25leHRyYXNtYXJ0eXBhbnRzJywgMTUpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNfdGV4dGFyZWFgIChgaWRgLCBgZmllbGRfaWRgLCBgZm9ybWF0dGVyYCwgYHNpemVgKSBWQUxVRVMgKDIzOSwgMzUsICdwYl9tYXJrZG93bmV4dHJhc21hcnR5cGFudHMnLCA1KTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX3RleHRhcmVhYCAoYGlkYCwgYGZpZWxkX2lkYCwgYGZvcm1hdHRlcmAsIGBzaXplYCkgVkFMVUVTICgyOTQsIDQwLCAncGJfbWFya2Rvd25leHRyYXNtYXJ0eXBhbnRzJywgOCk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc190ZXh0YXJlYWAgKGBpZGAsIGBmaWVsZF9pZGAsIGBmb3JtYXR0ZXJgLCBgc2l6ZWApIFZBTFVFUyAoMjk2LCA0NCwgJ3BiX21hcmtkb3duZXh0cmFzbWFydHlwYW50cycsIDkpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2ZpZWxkc191cGxvYWRgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9maWVsZHNfdXBsb2FkYDsNCkNSRUFURSBUQUJMRSBgdGJsX2ZpZWxkc191cGxvYWRgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGZpZWxkX2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBkZXN0aW5hdGlvbmAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIE5PVCBOVUxMLAogIGB2YWxpZGF0b3JgIHZhcmNoYXIoNTApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZmllbGRfaWRgIChgZmllbGRfaWRgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTQwIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9maWVsZHNfdXBsb2FkYCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzX3VwbG9hZGAgKGBpZGAsIGBmaWVsZF9pZGAsIGBkZXN0aW5hdGlvbmAsIGB2YWxpZGF0b3JgKSBWQUxVRVMgKDEzOSwgNTcsICcvd29ya3NwYWNlL3VwbG9hZHMnLCAnL1xcLig/OmJtcHxnaWZ8anBlP2d8cG5nKSQvaScpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV8yNmAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV8yNmA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfMjZgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBoYW5kbGVgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYHZhbHVlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEtFWSBgaGFuZGxlYCAoYGhhbmRsZWApLAogIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTQ3IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfMjZgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMjZgIChgaWRgLCBgZW50cnlfaWRgLCBgaGFuZGxlYCwgYHZhbHVlYCkgVkFMVUVTICgxNDYsIDExMCwgJ2FuLWV4YW1wbGUtZHJhZnQtYXJ0aWNsZScsICdBbiBleGFtcGxlIGRyYWZ0IGFydGljbGUnKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzI2YCAoYGlkYCwgYGVudHJ5X2lkYCwgYGhhbmRsZWAsIGB2YWx1ZWApIFZBTFVFUyAoMTQzLCAxMDksICdhLXByaW1lci10by1zeW1waG9ueS0ycy1kZWZhdWx0LXRoZW1lJywgJ0EgcHJpbWVyIHRvIFN5bXBob255IDJcJ3MgZGVmYXVsdCB0aGVtZScpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV8yN2AgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV8yN2A7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfMjdgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGB2YWx1ZWAgdGV4dCBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSwKICBgdmFsdWVfZm9ybWF0dGVkYCB0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEZVTExURVhUIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTQ3IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfMjdgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMjdgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgdmFsdWVfZm9ybWF0dGVkYCkgVkFMVUVTICgxNDMsIDEwOSwgJ0V2ZXJ5IHRoZW1lIGluIFN5bXBob255IGhhcyBhbiBpbXBvcnRhbnQgbWlzc2lvbjogdG8gaW50cm9kdWNlIG5ld2NvbWVycyB0byBTeW1waG9ueSBieSB3YXkgb2YgYSB3b3JraW5nIGV4YW1wbGUuICpTcGVjdHJ1bSosIHRoZSBuYW1lIG9mIHRoaXMgdmVyc2lvblwncyBkZWZhdWx0IHRoZW1lLCB3YXMgZGVzaWduZWQgYW5kIGRldmVsb3BlZCB3aXRoIHN1Y2ggYSBtaXNzaW9uIGluIG1pbmQgYnkgZm9sbG93aW5nIGEgc2V0IG9mIGNvbnN0cmFpbnRzLiBBIGRlZmF1bHQgdGhlbWUgaXMgcmVxdWlyZWQgdG86XHJcblxyXG4xLiBiZSBwcmVzZW50ZWQgaW4gYSBmb3JtYXQgdGhhdCBpcyB1bml2ZXJzYWxseSBpZGVudGlmaWVkIGFuZCBpbnR1aXRpdmUuXHJcbjIuIGhhdmUgYSBjbGVhciBhbmQgc2ltcGxlIEhUTUwgc3RydWN0dXJlLlxyXG4zLiBkZW1vbnN0cmF0ZSB0aGUgZnVuZGFtZW50YWwgY29uY2VwdHMgaW4gU3ltcGhvbnkgLSBgc2VjdGlvbnNgLCBgZmllbGRzYCwgYGRhdGEgc291cmNlc2AgYW5kIGBldmVudHNgIGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgdG9nZXRoZXIuXHJcbjQuIGF2b2lkIGZ1bmN0aW9uYWxpdHkgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBlZHVjYXRpb25hbCB2YWx1ZS5cclxuXHJcbiMjIyMgVGhlIGRlc2lnbiAjIyMjXHJcblxyXG5PdXIgZmlyc3QgcnVsZSBzdGF0ZXMgdGhhdCBhIGRlZmF1bHQgdGhlbWUgbmVlZHMgdG8gYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBpbnN0YW50bHkgcmVjb2duaXNhYmxlIHRvIGEgdXNlci4gQXMgYSByZXN1bHQsIGFsbCBvZiB0aGUgdGhlbWVzIGNyZWF0ZWQgaW4gU3ltcGhvbnlcJ3MgaGlzdG9yeSBoYXZlIGVtcGhhc2lzZWQgYSB3ZWJsb2cgc3RydWN0dXJlLiAqU3BlY3RydW0qIGNvbnRpbnVlcyB0aGlzIHRyYWRpdGlvbi5cclxuXHJcbipDdWJpYyosIHRoZSBuYW1lIG9mIGEgcHJldmlvdXMgZGVmYXVsdCB0aGVtZSwgZm9sbG93ZWQgdGhlIHRlYWNoaW5nIG1hbmRhdGUgdmVyeSBjbG9zZWx5LiBIb3dldmVyLCB0aGUgdGhlbWUgdG9vayBpdCBvbmUgc3RlcCBmdXJ0aGVyIGFuZCByZW1vdmVkIGNvbXBsZXggc3RydWN0dXJlIGFuZCBjb2xvdXIgaW4gZmF2b3VyIG9mIGEgc2ltcGxpZmllZCBsb29rIGFuZCBmZWVsLiBUaGUgbWFpbiBkZXNpZ24gZ29hbCBmb3IgKlNwZWN0cnVtKiBpcyB0byBpbnRyb2R1Y2UgbW9yZSBjb2xvdXJzIGJ1dCBzdGlsbCBmb2xsb3cgdGhlIHBoaWxvc29waHkgb2YgYSBzaW1wbGlzdGljIGxheW91dC5cclxuXHJcbiMjIyMgRmVhdHVyZXMgIyMjI1xyXG5cclxuKlNwZWN0cnVtKiBoYXMgYSBoYW5kZnVsIG9mIGFkZGl0aW9uYWwgZmVhdHVyZXMgdGhhdCB5b3Ugd29uXCd0IGZpbmQgaW4gcHJldmlvdXMgZGVmYXVsdCB0aGVtZXMuIFRoZXNlIG5ldyBmZWF0dXJlcyBhcmUgbm90IG9ubHkgbWVhbnQgdG8gZGVtb25zdHJhdGUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgc3lzdGVtIGJ1dCBhbHNvIGV4cGxhaW4gc29tZSBmdW5kYW1lbnRhbCBwaGlsb3NvcGhpZXMgaW4gU3ltcGhvbnkgMi4gQmVsb3cgaXMgYSBsaXN0IG9mIGZlYXR1cmVzOlxyXG5cclxuLSBMb2dnZWQgaW4gdXNlcnMgd2lsbCBzZWUgTGlua3MgdG8gU3ltcGhvbnlcJ3MgYWRtaW4gdG8gZWRpdCBhcnRpY2xlcywgbWFuYWdlIGNvbW1lbnRzIGFuZCBhZGQgbm90ZXMuXHJcbi0gTG9nZ2VkIGluIHVzZXJzIHdpbGwgc2VlIDMgcHJvdGVjdGVkIG1lbnUgaXRlbXMsIGFydGljbGUgZHJhZnRzLCB0aGUgZGVidWcgcGFnZSBhbmQgYSBsaW5rIHRvIHRoZSBTeW1waG9ueSBhZG1pbi5cclxuLSBXZWJzaXRlIGF1dGhvcnMgd2hvIGhhdmUgYWNjZXNzIHRvIHRoZSBhZG1pbiBjYW4gbWFrZSB0aGVpciBjb21tZW50cyBcImF1dGhvcmlzZWRcIiB3aGljaCB3aWxsIGNvbG91ciB0aGVpciBjb21tZW50IGRpZmZlcmVudCB0byBvdGhlcnMuXHJcbi0gQXJ0aWNsZXMgb24gdGhlIGRyYWZ0cyBwYWdlIHNwb3J0cyBhIGJ1dHRvbiB0byBwdWJsaXNoIHRoZSBhcnRpY2xlLlxyXG4tIEFydGljbGUgaW1hZ2VzIHRha2UgYWR2YW50YWdlIG9mIFN5bXBob255XCdzIGJ1aWxkLWluIGltYWdlIG1hbmlwdWxhdGlvbiBmZWF0dXJlIHRvIGNyb3AgYW5kIHNpemUgdGhlIGltYWdlIGF1dG9tYXRpY2FsbHkuXHJcbi0gVGhlIGNvbnRhY3QgZm9ybSBvbiB0aGUgYWJvdXQgcGFnZSBzYXZlcyB0aGUgY29udGVudCB0byB0aGUgTWVzc2FnZXMgc2VjdGlvbiBvbiB0aGUgYmFja2VuZCBhbmQgZW1haWxzIHRoZSB3ZWJzaXRlXCdzIG93bmVyLlxyXG5cclxuIyMjIyBQaGlsb3NvcGh5ICMjIyNcclxuXHJcbkFsbCBvZiB0aGUgYWJvdmUgdGFrZXMgYWR2YW50YWdlIG9mIG5ldyBmZWF0dXJlcyBmb3VuZCBpbiB2ZXJzaW9uIDIuIEFuIGltcG9ydGFudCBjb25jZXB0IHRoYXQgaXMgYmVpbmcgYWR2b2NhdGVkIGluIFN5bXBob255IGlzIHRoZSBwcmFjdGlzZSBvZiBjcmVhdGluZyBhIHRpZ2h0ZXIgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBmcm9udC1lbmQgYW5kIHRoZSBiYWNrZW5kLiBEZXZlbG9wZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzaW1wbGlmaWVkIFVSTCBzdHJ1Y3R1cmUgb2YgdGhlIGFkbWluIHRvIGNyZWF0ZSBhIG1vcmUgY29udmVuaWVudCBlbnZpcm9ubWVudCBmb3IgdGhlaXIgdXNlcnMuXHJcblxyXG5XaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIEV2ZW50IGVkaXRvciwgZGV2ZWxvcGVycyBub3cgaGF2ZSBldmVuIG1vcmUgY29udHJvbCB3aGVuIGRldmVsb3BpbmcgYSB3ZWJzaXRlLiBGb3IgZXhhbXBsZSwgdGhlICpQdWJsaXNoKiBidXR0b24gb24gdGhlIFthcnRpY2xlIGRyYWZ0cyBwYWdlXShkcmFmdHMvKSB1dGlsaXNlcyB0aGUgZXZlbnQgZWRpdG9yIHRvIGNyZWF0ZSBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBmcm9udGVuZCBhbmQgdGhlIGJhY2tlbmQuIFRoaXMgYWxsb3dzIHRoZSAqUHVibGlzaCogYnV0dG9uIHRvIHVwZGF0ZSB0aGUgXCJQdWJsaXNoIHRoaXMgYXJ0aWNsZVwiIGNoZWNrYm94IGZpZWxkIGZyb20gdGhlIFwiQXJ0aWNsZXNcIiBzZWN0aW9uLiBUaGlzIGZlYXR1cmUgYWxzbyBjb21wbGltZW50cyBhbmQgZW5jb3VyYWdlcyB0aGUgcGhpbG9zb3BoeSBvZiBhIG1vcmUgc2VhbWxlc3MgZW52aXJvbm1lbnQgYmV0d2VlbiB0aGUgd2Vic2l0ZSBhbmQgdGhlIGFkbWluIGludGVyZmFjZS4nLCAnPHA+RXZlcnkgdGhlbWUgaW4gU3ltcGhvbnkgaGFzIGFuIGltcG9ydGFudCBtaXNzaW9uOiB0byBpbnRyb2R1Y2UgbmV3Y29tZXJzIHRvIFN5bXBob255IGJ5IHdheSBvZiBhIHdvcmtpbmcgZXhhbXBsZS4gPGVtPlNwZWN0cnVtPC9lbT4sIHRoZSBuYW1lIG9mIHRoaXMgdmVyc2lvbiYjODIxNztzIGRlZmF1bHQgdGhlbWUsIHdhcyBkZXNpZ25lZCBhbmQgZGV2ZWxvcGVkIHdpdGggc3VjaCBhIG1pc3Npb24gaW4gbWluZCBieSBmb2xsb3dpbmcgYSBzZXQgb2YgY29uc3RyYWludHMuIEEgZGVmYXVsdCB0aGVtZSBpcyByZXF1aXJlZCB0bzo8L3A+XG5cbjxvbD5cbjxsaT5iZSBwcmVzZW50ZWQgaW4gYSBmb3JtYXQgdGhhdCBpcyB1bml2ZXJzYWxseSBpZGVudGlmaWVkIGFuZCBpbnR1aXRpdmUuPC9saT5cbjxsaT5oYXZlIGEgY2xlYXIgYW5kIHNpbXBsZSBIVE1MIHN0cnVjdHVyZS48L2xpPlxuPGxpPmRlbW9uc3RyYXRlIHRoZSBmdW5kYW1lbnRhbCBjb25jZXB0cyBpbiBTeW1waG9ueSAtIDxjb2RlPnNlY3Rpb25zPC9jb2RlPiwgPGNvZGU+ZmllbGRzPC9jb2RlPiwgPGNvZGU+ZGF0YSBzb3VyY2VzPC9jb2RlPiBhbmQgPGNvZGU+ZXZlbnRzPC9jb2RlPiBhbmQgdGhlaXIgaW50ZXJhY3Rpb25zIHRvZ2V0aGVyLjwvbGk+XG48bGk+YXZvaWQgZnVuY3Rpb25hbGl0eSB0aGF0IGRvZXMgbm90IGhhdmUgYW55IGVkdWNhdGlvbmFsIHZhbHVlLjwvbGk+XG48L29sPlxuXG48aDQ+VGhlIGRlc2lnbjwvaDQ+XG5cbjxwPk91ciBmaXJzdCBydWxlIHN0YXRlcyB0aGF0IGEgZGVmYXVsdCB0aGVtZSBuZWVkcyB0byBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIGluc3RhbnRseSByZWNvZ25pc2FibGUgdG8gYSB1c2VyLiBBcyBhIHJlc3VsdCwgYWxsIG9mIHRoZSB0aGVtZXMgY3JlYXRlZCBpbiBTeW1waG9ueSYjODIxNztzIGhpc3RvcnkgaGF2ZSBlbXBoYXNpc2VkIGEgd2VibG9nIHN0cnVjdHVyZS4gPGVtPlNwZWN0cnVtPC9lbT4gY29udGludWVzIHRoaXMgdHJhZGl0aW9uLjwvcD5cblxuPHA+PGVtPkN1YmljPC9lbT4sIHRoZSBuYW1lIG9mIGEgcHJldmlvdXMgZGVmYXVsdCB0aGVtZSwgZm9sbG93ZWQgdGhlIHRlYWNoaW5nIG1hbmRhdGUgdmVyeSBjbG9zZWx5LiBIb3dldmVyLCB0aGUgdGhlbWUgdG9vayBpdCBvbmUgc3RlcCBmdXJ0aGVyIGFuZCByZW1vdmVkIGNvbXBsZXggc3RydWN0dXJlIGFuZCBjb2xvdXIgaW4gZmF2b3VyIG9mIGEgc2ltcGxpZmllZCBsb29rIGFuZCBmZWVsLiBUaGUgbWFpbiBkZXNpZ24gZ29hbCBmb3IgPGVtPlNwZWN0cnVtPC9lbT4gaXMgdG8gaW50cm9kdWNlIG1vcmUgY29sb3VycyBidXQgc3RpbGwgZm9sbG93IHRoZSBwaGlsb3NvcGh5IG9mIGEgc2ltcGxpc3RpYyBsYXlvdXQuPC9wPlxuXG48aDQ+RmVhdHVyZXM8L2g0PlxuXG48cD48ZW0+U3BlY3RydW08L2VtPiBoYXMgYSBoYW5kZnVsIG9mIGFkZGl0aW9uYWwgZmVhdHVyZXMgdGhhdCB5b3Ugd29uJiM4MjE3O3QgZmluZCBpbiBwcmV2aW91cyBkZWZhdWx0IHRoZW1lcy4gVGhlc2UgbmV3IGZlYXR1cmVzIGFyZSBub3Qgb25seSBtZWFudCB0byBkZW1vbnN0cmF0ZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBzeXN0ZW0gYnV0IGFsc28gZXhwbGFpbiBzb21lIGZ1bmRhbWVudGFsIHBoaWxvc29waGllcyBpbiBTeW1waG9ueSAyLiBCZWxvdyBpcyBhIGxpc3Qgb2YgZmVhdHVyZXM6PC9wPlxuXG48dWw+XG48bGk+TG9nZ2VkIGluIHVzZXJzIHdpbGwgc2VlIExpbmtzIHRvIFN5bXBob255JiM4MjE3O3MgYWRtaW4gdG8gZWRpdCBhcnRpY2xlcywgbWFuYWdlIGNvbW1lbnRzIGFuZCBhZGQgbm90ZXMuPC9saT5cbjxsaT5Mb2dnZWQgaW4gdXNlcnMgd2lsbCBzZWUgMyBwcm90ZWN0ZWQgbWVudSBpdGVtcywgYXJ0aWNsZSBkcmFmdHMsIHRoZSBkZWJ1ZyBwYWdlIGFuZCBhIGxpbmsgdG8gdGhlIFN5bXBob255IGFkbWluLjwvbGk+XG48bGk+V2Vic2l0ZSBhdXRob3JzIHdobyBoYXZlIGFjY2VzcyB0byB0aGUgYWRtaW4gY2FuIG1ha2UgdGhlaXIgY29tbWVudHMgJiM4MjIwO2F1dGhvcmlzZWQmIzgyMjE7IHdoaWNoIHdpbGwgY29sb3VyIHRoZWlyIGNvbW1lbnQgZGlmZmVyZW50IHRvIG90aGVycy48L2xpPlxuPGxpPkFydGljbGVzIG9uIHRoZSBkcmFmdHMgcGFnZSBzcG9ydHMgYSBidXR0b24gdG8gcHVibGlzaCB0aGUgYXJ0aWNsZS48L2xpPlxuPGxpPkFydGljbGUgaW1hZ2VzIHRha2UgYWR2YW50YWdlIG9mIFN5bXBob255JiM4MjE3O3MgYnVpbGQtaW4gaW1hZ2UgbWFuaXB1bGF0aW9uIGZlYXR1cmUgdG8gY3JvcCBhbmQgc2l6ZSB0aGUgaW1hZ2UgYXV0b21hdGljYWxseS48L2xpPlxuPGxpPlRoZSBjb250YWN0IGZvcm0gb24gdGhlIGFib3V0IHBhZ2Ugc2F2ZXMgdGhlIGNvbnRlbnQgdG8gdGhlIE1lc3NhZ2VzIHNlY3Rpb24gb24gdGhlIGJhY2tlbmQgYW5kIGVtYWlscyB0aGUgd2Vic2l0ZSYjODIxNztzIG93bmVyLjwvbGk+XG48L3VsPlxuXG48aDQ+UGhpbG9zb3BoeTwvaDQ+XG5cbjxwPkFsbCBvZiB0aGUgYWJvdmUgdGFrZXMgYWR2YW50YWdlIG9mIG5ldyBmZWF0dXJlcyBmb3VuZCBpbiB2ZXJzaW9uIDIuIEFuIGltcG9ydGFudCBjb25jZXB0IHRoYXQgaXMgYmVpbmcgYWR2b2NhdGVkIGluIFN5bXBob255IGlzIHRoZSBwcmFjdGlzZSBvZiBjcmVhdGluZyBhIHRpZ2h0ZXIgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBmcm9udC1lbmQgYW5kIHRoZSBiYWNrZW5kLiBEZXZlbG9wZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzaW1wbGlmaWVkIFVSTCBzdHJ1Y3R1cmUgb2YgdGhlIGFkbWluIHRvIGNyZWF0ZSBhIG1vcmUgY29udmVuaWVudCBlbnZpcm9ubWVudCBmb3IgdGhlaXIgdXNlcnMuPC9wPlxuXG48cD5XaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIEV2ZW50IGVkaXRvciwgZGV2ZWxvcGVycyBub3cgaGF2ZSBldmVuIG1vcmUgY29udHJvbCB3aGVuIGRldmVsb3BpbmcgYSB3ZWJzaXRlLiBGb3IgZXhhbXBsZSwgdGhlIDxlbT5QdWJsaXNoPC9lbT4gYnV0dG9uIG9uIHRoZSA8YSBocmVmPVwiZHJhZnRzL1wiPmFydGljbGUgZHJhZnRzIHBhZ2U8L2E+IHV0aWxpc2VzIHRoZSBldmVudCBlZGl0b3IgdG8gY3JlYXRlIGFuIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGZyb250ZW5kIGFuZCB0aGUgYmFja2VuZC4gVGhpcyBhbGxvd3MgdGhlIDxlbT5QdWJsaXNoPC9lbT4gYnV0dG9uIHRvIHVwZGF0ZSB0aGUgJiM4MjIwO1B1Ymxpc2ggdGhpcyBhcnRpY2xlJiM4MjIxOyBjaGVja2JveCBmaWVsZCBmcm9tIHRoZSAmIzgyMjA7QXJ0aWNsZXMmIzgyMjE7IHNlY3Rpb24uIFRoaXMgZmVhdHVyZSBhbHNvIGNvbXBsaW1lbnRzIGFuZCBlbmNvdXJhZ2VzIHRoZSBwaGlsb3NvcGh5IG9mIGEgbW9yZSBzZWFtbGVzcyBlbnZpcm9ubWVudCBiZXR3ZWVuIHRoZSB3ZWJzaXRlIGFuZCB0aGUgYWRtaW4gaW50ZXJmYWNlLjwvcD5cbicpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMjdgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgdmFsdWVfZm9ybWF0dGVkYCkgVkFMVUVTICgxNDYsIDExMCwgJ1RoaXMgaXMgYW4gZXhhbXBsZSBkcmFmdCBhcnRpY2xlLiBGZWVsIGZyZWUgdG8gdGVzdCB0aGUgc3lzdGVtIGJ5IHByZXNzaW5nIHRoZSAqcHVibGlzaCogYnV0dG9uLicsICc8cD5UaGlzIGlzIGFuIGV4YW1wbGUgZHJhZnQgYXJ0aWNsZS4gRmVlbCBmcmVlIHRvIHRlc3QgdGhlIHN5c3RlbSBieSBwcmVzc2luZyB0aGUgPGVtPnB1Ymxpc2g8L2VtPiBidXR0b24uPC9wPlxuJyk7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZW50cmllc19kYXRhXzI5YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc19kYXRhXzI5YDsNCkNSRUFURSBUQUJMRSBgdGJsX2VudHJpZXNfZGF0YV8yOWAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZW50cnlfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYHZhbHVlYCB2YXJjaGFyKDgwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYGxvY2FsYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBnbXRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgS0VZIGB2YWx1ZWAgKGB2YWx1ZWApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD0xNDYgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2VudHJpZXNfZGF0YV8yOWAgKioqDQpJTlNFUlQgSU5UTyBgdGJsX2VudHJpZXNfZGF0YV8yOWAgKGBpZGAsIGBlbnRyeV9pZGAsIGB2YWx1ZWAsIGBsb2NhbGAsIGBnbXRgKSBWQUxVRVMgKDE0NSwgMTEwLCAnMjAwOS0wNi0yNFQxMToyODowMCsxMDowMCcsIDEyNDU4MDY4ODAsIDEyNDU4MDY4ODApOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMjlgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgbG9jYWxgLCBgZ210YCkgVkFMVUVTICgxNDIsIDEwOSwgJzIwMDktMDYtMjRUMTE6MjA6MDArMTA6MDAnLCAxMjQ1ODA2NDAwLCAxMjQ1ODA2NDAwKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfMzBgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfMzBgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzMwYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgdmFsdWVgIGVudW0oJ3llcycsJ25vJykgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgTk9UIE5VTEwgZGVmYXVsdCAnbm8nLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTQ3IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfMzBgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMzBgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgKSBWQUxVRVMgKDE0NiwgMTEwLCAnbm8nKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzMwYCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCkgVkFMVUVTICgxNDMsIDEwOSwgJ3llcycpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV8zMWAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV8zMWA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfMzFgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBoYW5kbGVgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYHZhbHVlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEtFWSBgaGFuZGxlYCAoYGhhbmRsZWApLAogIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MTkgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2VudHJpZXNfZGF0YV8zMWAgKioqDQpJTlNFUlQgSU5UTyBgdGJsX2VudHJpZXNfZGF0YV8zMWAgKGBpZGAsIGBlbnRyeV9pZGAsIGBoYW5kbGVgLCBgdmFsdWVgKSBWQUxVRVMgKDEsIDE1LCAnc3ltcGhvbnknLCAnU3ltcGhvbnknKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzMxYCAoYGlkYCwgYGVudHJ5X2lkYCwgYGhhbmRsZWAsIGB2YWx1ZWApIFZBTFVFUyAoMiwgMTYsICdlbnRlcnRhaW5tZW50JywgJ0VudGVydGFpbm1lbnQnKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzMxYCAoYGlkYCwgYGVudHJ5X2lkYCwgYGhhbmRsZWAsIGB2YWx1ZWApIFZBTFVFUyAoMywgMTcsICdmaXJlZmx5JywgJ0ZpcmVmbHknKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzMxYCAoYGlkYCwgYGVudHJ5X2lkYCwgYGhhbmRsZWAsIGB2YWx1ZWApIFZBTFVFUyAoMTgsIDIwLCAnaGVhbHRoJywgJ0hlYWx0aCcpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV8zNGAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV8zNGA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfMzRgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGB2YWx1ZWAgdGV4dCBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSwKICBgdmFsdWVfZm9ybWF0dGVkYCB0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEZVTExURVhUIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MjcgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2VudHJpZXNfZGF0YV8zNGAgKioqDQpJTlNFUlQgSU5UTyBgdGJsX2VudHJpZXNfZGF0YV8zNGAgKGBpZGAsIGBlbnRyeV9pZGAsIGB2YWx1ZWAsIGB2YWx1ZV9mb3JtYXR0ZWRgKSBWQUxVRVMgKDI1LCAxMTQsICdEcm9wIGluIGFuZCBoYXZlIGEgY2hhdCB3aXRoIHRoZSBTeW1waG9ueSBkZXZlbG9wZXJzIG92ZXIgYXQgaXJjLmZyZWVub2RlLm5ldCBvbiAjc3ltcGhvbnkuIFlvdVwnbGwgbmVlZCBhbiBbSVJDIENsaWVudF0oaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPUlSQytDbGllbnQpJywgJzxwPkRyb3AgaW4gYW5kIGhhdmUgYSBjaGF0IHdpdGggdGhlIFN5bXBob255IGRldmVsb3BlcnMgb3ZlciBhdCBpcmMuZnJlZW5vZGUubmV0IG9uICNzeW1waG9ueS4gWW91JiM4MjE3O2xsIG5lZWQgYW4gPGEgaHJlZj1cImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1JUkMrQ2xpZW50XCI+SVJDIENsaWVudDwvYT48L3A+XG4nKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzM0YCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCwgYHZhbHVlX2Zvcm1hdHRlZGApIFZBTFVFUyAoMjQsIDExMSwgJ1N5bXBob255IHRvb2sgb3ZlciAxOCBtb250aHMgdG8gZGV2ZWxvcC4nLCAnPHA+U3ltcGhvbnkgdG9vayBvdmVyIDE4IG1vbnRocyB0byBkZXZlbG9wLjwvcD5cbicpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMzRgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgdmFsdWVfZm9ybWF0dGVkYCkgVkFMVUVTICgyNiwgMTE1LCAnQ2hlY2sgdGhlIG9mZmljaWFsIFtTeW1waG9ueSBkb3dubG9hZHMgcGFnZV0oaHR0cDovL3N5bXBob255LWNtcy5jb20vZG93bmxvYWRzLykgZm9yIGEgZnVsbCBsaXN0IG9mIGV4dGVuc2lvbnMsIGVuc2VtYmxlcyBhbmQgWFNMVCB1dGlsaXRpZXMuJywgJzxwPkNoZWNrIHRoZSBvZmZpY2lhbCA8YSBocmVmPVwiaHR0cDovL3N5bXBob255LWNtcy5jb20vZG93bmxvYWRzL1wiPlN5bXBob255IGRvd25sb2FkcyBwYWdlPC9hPiBmb3IgYSBmdWxsIGxpc3Qgb2YgZXh0ZW5zaW9ucywgZW5zZW1ibGVzIGFuZCBYU0xUIHV0aWxpdGllcy48L3A+XG4nKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfMzVgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfMzVgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzM1YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgdmFsdWVgIHRleHQgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2ksCiAgYHZhbHVlX2Zvcm1hdHRlZGAgdGV4dCBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBGVUxMVEVYVCBLRVkgYHZhbHVlYCAoYHZhbHVlYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTE5IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfMzVgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMzVgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgdmFsdWVfZm9ybWF0dGVkYCkgVkFMVUVTICgxLCAxNSwgJ0Egd2lzZSB3b21hbiBzYWlkIHRvIG1lIG9uY2UsIFwiSWYgeW91XCdyZSBub3QgdXNpbmcgU3ltcGhvbnkgdG8gcHVibGlzaCB5b3VyIGNvbnRlbnQgb24gdGhlIHdlYiwgdGhlbiB5b3VcJ3JlIGp1c3QgYSB3aWxkIGNoaXBtdW5rLiBHZXQgd2l0aCB0aGUgdGltZXMgYW5kIGhlbHAgbWUgbWlsayB0aGlzIGNvdy5cIicsICc8cD5BIHdpc2Ugd29tYW4gc2FpZCB0byBtZSBvbmNlLCAmIzgyMjA7SWYgeW91JiM4MjE3O3JlIG5vdCB1c2luZyBTeW1waG9ueSB0byBwdWJsaXNoIHlvdXIgY29udGVudCBvbiB0aGUgd2ViLCB0aGVuIHlvdSYjODIxNztyZSBqdXN0IGEgd2lsZCBjaGlwbXVuay4gR2V0IHdpdGggdGhlIHRpbWVzIGFuZCBoZWxwIG1lIG1pbGsgdGhpcyBjb3cuJiM4MjIxOzwvcD5cbicpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfMzVgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgdmFsdWVfZm9ybWF0dGVkYCkgVkFMVUVTICgyLCAxNiwgJ0V2ZXJ5ZGF5LCA4IGhvdXJzIG9mIG9uZVwncyBsaWZlIGlzIHRha2VuIHVwIGJ5IHNsZWVwLCA4IHdpdGggd29yayBhbmQgYW5vdGhlciA0IHRvIHByb2NyYXN0aW5hdGlvbi4gVGhlIHJlbWFpbmluZyA0IGhvdXJzIGlzIGEgcHJlY2lvdXMgb25lLiBVc2UgaXQgZm9yIGVudGVydGFpbm1lbnQuJywgJzxwPkV2ZXJ5ZGF5LCA4IGhvdXJzIG9mIG9uZSYjODIxNztzIGxpZmUgaXMgdGFrZW4gdXAgYnkgc2xlZXAsIDggd2l0aCB3b3JrIGFuZCBhbm90aGVyIDQgdG8gcHJvY3Jhc3RpbmF0aW9uLiBUaGUgcmVtYWluaW5nIDQgaG91cnMgaXMgYSBwcmVjaW91cyBvbmUuIFVzZSBpdCBmb3IgZW50ZXJ0YWlubWVudC48L3A+XG4nKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzM1YCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCwgYHZhbHVlX2Zvcm1hdHRlZGApIFZBTFVFUyAoMywgMTcsICdUaGlzIGlzIG15IHNuZWFreSB3YXkgb2YgYWR2ZXJ0aXNpbmcgdGhlIGJlc3QgdGVsZXZpc2lvbiBzaG93IGV2ZXIuIFdhdGNoIGl0IGZvciB0aGUgZnVubnkuJywgJzxwPlRoaXMgaXMgbXkgc25lYWt5IHdheSBvZiBhZHZlcnRpc2luZyB0aGUgYmVzdCB0ZWxldmlzaW9uIHNob3cgZXZlci4gV2F0Y2ggaXQgZm9yIHRoZSBmdW5ueS48L3A+XG4nKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzM1YCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCwgYHZhbHVlX2Zvcm1hdHRlZGApIFZBTFVFUyAoMTgsIDIwLCAnVHdvIHRoaW5ncyB0aGF0IGFyZSBpbiBmYXNoaW9uIHRvZGF5OiBoZWFsdGggYW5kIGNsaW1hdGUgaXNzdWVzLiBUaGUga2lkcyBhcmUgcmF2aW5nIGFib3V0IGdvb2QgaGVhbHRoIHRoZXNlIGRheXMuIEFwcGFyZW50bHkgaXRcJ3MgYSBwb3NpdGl2ZSB0aGluZy4nLCAnPHA+VHdvIHRoaW5ncyB0aGF0IGFyZSBpbiBmYXNoaW9uIHRvZGF5OiBoZWFsdGggYW5kIGNsaW1hdGUgaXNzdWVzLiBUaGUga2lkcyBhcmUgcmF2aW5nIGFib3V0IGdvb2QgaGVhbHRoIHRoZXNlIGRheXMuIEFwcGFyZW50bHkgaXQmIzgyMTc7cyBhIHBvc2l0aXZlIHRoaW5nLjwvcD5cbicpOw0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV8zNmAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV8zNmA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfMzZgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBoYW5kbGVgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYHZhbHVlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEtFWSBgaGFuZGxlYCAoYGhhbmRsZWApLAogIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9NDIgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2VudHJpZXNfZGF0YV8zNmAgKioqDQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZW50cmllc19kYXRhXzM3YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc19kYXRhXzM3YDsNCkNSRUFURSBUQUJMRSBgdGJsX2VudHJpZXNfZGF0YV8zN2AgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZW50cnlfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGhhbmRsZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgdmFsdWVgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgS0VZIGBoYW5kbGVgIChgaGFuZGxlYCksCiAgS0VZIGB2YWx1ZWAgKGB2YWx1ZWApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD0zOCBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZW50cmllc19kYXRhXzM3YCAqKioNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfMzhgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfMzhgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzM4YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgaGFuZGxlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGB2YWx1ZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBLRVkgYGhhbmRsZWAgKGBoYW5kbGVgKSwKICBLRVkgYHZhbHVlYCAoYHZhbHVlYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTIwIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfMzhgICoqKg0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV8zOWAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV8zOWA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfMzlgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGByZWxhdGlvbl9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBLRVkgYHJlbGF0aW9uX2lkYCAoYHJlbGF0aW9uX2lkYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTkzIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfMzlgICoqKg0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV80MGAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV80MGA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfNDBgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGB2YWx1ZWAgdGV4dCBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSwKICBgdmFsdWVfZm9ybWF0dGVkYCB0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpLAogIFBSSU1BUlkgS0VZICAoYGlkYCksCiAgS0VZIGBlbnRyeV9pZGAgKGBlbnRyeV9pZGApLAogIEZVTExURVhUIEtFWSBgdmFsdWVgIChgdmFsdWVgKQopIEVOR0lORT1NeUlTQU0gQVVUT19JTkNSRU1FTlQ9MzggREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09MTEFURT11dGY4X3VuaWNvZGVfY2k7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2VudHJpZXNfZGF0YV80MGAgKioqDQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZW50cmllc19kYXRhXzQ0YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc19kYXRhXzQ0YDsNCkNSRUFURSBUQUJMRSBgdGJsX2VudHJpZXNfZGF0YV80NGAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZW50cnlfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYHZhbHVlYCB0ZXh0IGNvbGxhdGUgdXRmOF91bmljb2RlX2NpLAogIGB2YWx1ZV9mb3JtYXR0ZWRgIHRleHQgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2ksCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgRlVMTFRFWFQgS0VZIGB2YWx1ZWAgKGB2YWx1ZWApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD03MSBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZW50cmllc19kYXRhXzQ0YCAqKioNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfNDVgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfNDVgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzQ1YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgcmVsYXRpb25faWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgS0VZIGByZWxhdGlvbl9pZGAgKGByZWxhdGlvbl9pZGApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD03MSBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZW50cmllc19kYXRhXzQ1YCAqKioNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfNDdgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfNDdgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzQ3YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgaGFuZGxlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGB2YWx1ZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBLRVkgYGhhbmRsZWAgKGBoYW5kbGVgKSwKICBLRVkgYHZhbHVlYCAoYHZhbHVlYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTQ1IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfNDdgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfNDdgIChgaWRgLCBgZW50cnlfaWRgLCBgaGFuZGxlYCwgYHZhbHVlYCkgVkFMVUVTICg0MiwgMTA1LCAnYWxsZW4tY2hhbmcnLCAnQWxsZW4gQ2hhbmcnKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfNDhgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfNDhgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzQ4YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgaGFuZGxlYCB2YXJjaGFyKDI1NSkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2kgZGVmYXVsdCBOVUxMLAogIGB2YWx1ZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBLRVkgYGhhbmRsZWAgKGBoYW5kbGVgKSwKICBLRVkgYHZhbHVlYCAoYHZhbHVlYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTQ1IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfNDhgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfNDhgIChgaWRgLCBgZW50cnlfaWRgLCBgaGFuZGxlYCwgYHZhbHVlYCkgVkFMVUVTICg0MiwgMTA1LCAnYWxsZW4tY2hhb3RpY3BhdHRlcm5jb20nLCAnYWxsZW5AY2hhb3RpY3BhdHRlcm4uY29tJyk7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZW50cmllc19kYXRhXzQ5YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc19kYXRhXzQ5YDsNCkNSRUFURSBUQUJMRSBgdGJsX2VudHJpZXNfZGF0YV80OWAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZW50cnlfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGhhbmRsZWAgdmFyY2hhcigyNTUpIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgdmFsdWVgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgS0VZIGBoYW5kbGVgIChgaGFuZGxlYCksCiAgS0VZIGB2YWx1ZWAgKGB2YWx1ZWApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD00NCBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZW50cmllc19kYXRhXzQ5YCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzQ5YCAoYGlkYCwgYGVudHJ5X2lkYCwgYGhhbmRsZWAsIGB2YWx1ZWApIFZBTFVFUyAoNDEsIDEwNSwgJ2dlbmVyYWwtZW5xdWlyeScsICdHZW5lcmFsIEVucXVpcnknKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfNTBgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfNTBgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzUwYCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgdmFsdWVgIHRleHQgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2ksCiAgYHZhbHVlX2Zvcm1hdHRlZGAgdGV4dCBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBGVUxMVEVYVCBLRVkgYHZhbHVlYCAoYHZhbHVlYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTQ1IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfNTBgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfNTBgIChgaWRgLCBgZW50cnlfaWRgLCBgdmFsdWVgLCBgdmFsdWVfZm9ybWF0dGVkYCkgVkFMVUVTICg0MiwgMTA1LCAnVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSB0byB0aGUgZ3V5cyBpbiBBemVyb3RoLicsICdUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIHRvIHRoZSBndXlzIGluIEF6ZXJvdGguJyk7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZW50cmllc19kYXRhXzUxYCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc19kYXRhXzUxYDsNCkNSRUFURSBUQUJMRSBgdGJsX2VudHJpZXNfZGF0YV81MWAgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZW50cnlfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYHZhbHVlYCB2YXJjaGFyKDgwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYGxvY2FsYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGBnbXRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgS0VZIGB2YWx1ZWAgKGB2YWx1ZWApCikgRU5HSU5FPU15SVNBTSBBVVRPX0lOQ1JFTUVOVD0xNyBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT0xMQVRFPXV0ZjhfdW5pY29kZV9jaTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZW50cmllc19kYXRhXzUxYCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzUxYCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCwgYGxvY2FsYCwgYGdtdGApIFZBTFVFUyAoMTYsIDExNSwgJzIwMDktMDYtMjRUMTE6Mjg6MDArMTA6MDAnLCAxMjQ1ODA2ODgwLCAxMjQ1ODA2ODgwKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzUxYCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCwgYGxvY2FsYCwgYGdtdGApIFZBTFVFUyAoMTQsIDExMSwgJzIwMDktMDYtMjRUMTE6Mjg6MDArMTA6MDAnLCAxMjQ1ODA2ODgwLCAxMjQ1ODA2ODgwKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzUxYCAoYGlkYCwgYGVudHJ5X2lkYCwgYHZhbHVlYCwgYGxvY2FsYCwgYGdtdGApIFZBTFVFUyAoMTUsIDExNCwgJzIwMDktMDYtMjRUMTE6Mjg6MDArMTA6MDAnLCAxMjQ1ODA2ODgwLCAxMjQ1ODA2ODgwKTsNCg0KLS0gKioqIFNUUlVDVFVSRTogYHRibF9lbnRyaWVzX2RhdGFfNTRgICoqKg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRibF9lbnRyaWVzX2RhdGFfNTRgOw0KQ1JFQVRFIFRBQkxFIGB0YmxfZW50cmllc19kYXRhXzU0YCAoCiAgYGlkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMIGF1dG9faW5jcmVtZW50LAogIGBlbnRyeV9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBgdmFsdWVgIHZhcmNoYXIoODApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpIGRlZmF1bHQgTlVMTCwKICBgbG9jYWxgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGdtdGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBLRVkgYHZhbHVlYCAoYHZhbHVlYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTQ1IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfNTRgICoqKg0KDQotLSAqKiogU1RSVUNUVVJFOiBgdGJsX2VudHJpZXNfZGF0YV81NmAgKioqDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBgdGJsX2VudHJpZXNfZGF0YV81NmA7DQpDUkVBVEUgVEFCTEUgYHRibF9lbnRyaWVzX2RhdGFfNTZgICgKICBgaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwgYXV0b19pbmNyZW1lbnQsCiAgYGVudHJ5X2lkYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAogIGByZWxhdGlvbl9pZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCwKICBQUklNQVJZIEtFWSAgKGBpZGApLAogIEtFWSBgZW50cnlfaWRgIChgZW50cnlfaWRgKSwKICBLRVkgYHJlbGF0aW9uX2lkYCAoYHJlbGF0aW9uX2lkYCkKKSBFTkdJTkU9TXlJU0FNIEFVVE9fSU5DUkVNRU5UPTQ2IERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfNTZgICoqKg0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzX2RhdGFfNTZgIChgaWRgLCBgZW50cnlfaWRgLCBgcmVsYXRpb25faWRgKSBWQUxVRVMgKDQyLCAxMDksIDE1KTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc19kYXRhXzU2YCAoYGlkYCwgYGVudHJ5X2lkYCwgYHJlbGF0aW9uX2lkYCkgVkFMVUVTICg0NSwgMTEwLCAxNik7DQoNCi0tICoqKiBTVFJVQ1RVUkU6IGB0YmxfZW50cmllc19kYXRhXzU3YCAqKioNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGB0YmxfZW50cmllc19kYXRhXzU3YDsNCkNSRUFURSBUQUJMRSBgdGJsX2VudHJpZXNfZGF0YV81N2AgKAogIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwKICBgZW50cnlfaWRgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYGZpbGVgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYHNpemVgIGludCgxMSkgdW5zaWduZWQgTk9UIE5VTEwsCiAgYG1pbWV0eXBlYCB2YXJjaGFyKDUwKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgYG1ldGFgIHZhcmNoYXIoMjU1KSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaSBkZWZhdWx0IE5VTEwsCiAgUFJJTUFSWSBLRVkgIChgaWRgKSwKICBLRVkgYGVudHJ5X2lkYCAoYGVudHJ5X2lkYCksCiAgS0VZIGBmaWxlYCAoYGZpbGVgKSwKICBLRVkgYG1pbWV0eXBlYCAoYG1pbWV0eXBlYCkKKSBFTkdJTkU9TXlJU0FNIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTExBVEU9dXRmOF91bmljb2RlX2NpOw0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzX2RhdGFfNTdgICoqKg0KDQotLSAqKiogREFUQTogYHRibF9lbnRyaWVzYCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc2AgKGBpZGAsIGBzZWN0aW9uX2lkYCwgYGF1dGhvcl9pZGAsIGBjcmVhdGlvbl9kYXRlYCwgYGNyZWF0aW9uX2RhdGVfZ210YCkgVkFMVUVTICgyMCwgNywgMywgJzIwMDgtMDEtMTYgMTE6MjY6MzUnLCAnMjAwOC0wMS0xNiAwMToyNjozNScpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzYCAoYGlkYCwgYHNlY3Rpb25faWRgLCBgYXV0aG9yX2lkYCwgYGNyZWF0aW9uX2RhdGVgLCBgY3JlYXRpb25fZGF0ZV9nbXRgKSBWQUxVRVMgKDE3LCA3LCAzLCAnMjAwOC0wMS0xNiAxMTowNToxNScsICcyMDA4LTAxLTE2IDAxOjA1OjE1Jyk7DQpJTlNFUlQgSU5UTyBgdGJsX2VudHJpZXNgIChgaWRgLCBgc2VjdGlvbl9pZGAsIGBhdXRob3JfaWRgLCBgY3JlYXRpb25fZGF0ZWAsIGBjcmVhdGlvbl9kYXRlX2dtdGApIFZBTFVFUyAoMTYsIDcsIDMsICcyMDA4LTAxLTE2IDEwOjU1OjU1JywgJzIwMDgtMDEtMTYgMDA6NTU6NTUnKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc2AgKGBpZGAsIGBzZWN0aW9uX2lkYCwgYGF1dGhvcl9pZGAsIGBjcmVhdGlvbl9kYXRlYCwgYGNyZWF0aW9uX2RhdGVfZ210YCkgVkFMVUVTICgxMTUsIDgsIDEsICcyMDA5LTA2LTIzIDE3OjU4OjQyJywgJzIwMDktMDYtMjMgMDc6NTg6NDInKTsNCklOU0VSVCBJTlRPIGB0YmxfZW50cmllc2AgKGBpZGAsIGBzZWN0aW9uX2lkYCwgYGF1dGhvcl9pZGAsIGBjcmVhdGlvbl9kYXRlYCwgYGNyZWF0aW9uX2RhdGVfZ210YCkgVkFMVUVTICgxNSwgNywgMywgJzIwMDgtMDEtMTYgMTA6NTI6NTUnLCAnMjAwOC0wMS0xNiAwMDo1Mjo1NScpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzYCAoYGlkYCwgYHNlY3Rpb25faWRgLCBgYXV0aG9yX2lkYCwgYGNyZWF0aW9uX2RhdGVgLCBgY3JlYXRpb25fZGF0ZV9nbXRgKSBWQUxVRVMgKDExMSwgOCwgMywgJzIwMDgtMDEtMjIgMTU6NDc6MzUnLCAnMjAwOC0wMS0yMiAwNTo0NzozNScpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzYCAoYGlkYCwgYHNlY3Rpb25faWRgLCBgYXV0aG9yX2lkYCwgYGNyZWF0aW9uX2RhdGVgLCBgY3JlYXRpb25fZGF0ZV9nbXRgKSBWQUxVRVMgKDExMCwgNiwgMywgJzIwMDgtMDEtMjIgMTU6MjQ6NTInLCAnMjAwOC0wMS0yMiAwNToyNDo1MicpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzYCAoYGlkYCwgYHNlY3Rpb25faWRgLCBgYXV0aG9yX2lkYCwgYGNyZWF0aW9uX2RhdGVgLCBgY3JlYXRpb25fZGF0ZV9nbXRgKSBWQUxVRVMgKDExNCwgOCwgMywgJzIwMDgtMDEtMjIgMTc6MDA6MjknLCAnMjAwOC0wMS0yMiAwNzowMDoyOScpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzYCAoYGlkYCwgYHNlY3Rpb25faWRgLCBgYXV0aG9yX2lkYCwgYGNyZWF0aW9uX2RhdGVgLCBgY3JlYXRpb25fZGF0ZV9nbXRgKSBWQUxVRVMgKDEwOSwgNiwgMywgJzIwMDgtMDEtMjIgMTU6MDU6MDMnLCAnMjAwOC0wMS0yMiAwNTowNTowMycpOw0KSU5TRVJUIElOVE8gYHRibF9lbnRyaWVzYCAoYGlkYCwgYHNlY3Rpb25faWRgLCBgYXV0aG9yX2lkYCwgYGNyZWF0aW9uX2RhdGVgLCBgY3JlYXRpb25fZGF0ZV9nbXRgKSBWQUxVRVMgKDEwNSwgMTEsIDAsICcyMDA4LTAyLTAxIDExOjA1OjQxJywgJzIwMDgtMDItMDEgMDE6MDU6NDEnKTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZXh0ZW5zaW9uc2AgKioqDQpJTlNFUlQgSU5UTyBgdGJsX2V4dGVuc2lvbnNgIChgaWRgLCBgbmFtZWAsIGBzdGF0dXNgLCBgdmVyc2lvbmApIFZBTFVFUyAoNjQsICdleHBvcnRfZW5zZW1ibGUnLCAnZW5hYmxlZCcsIDEuNSk7DQoNCi0tICoqKiBEQVRBOiBgdGJsX2V4dGVuc2lvbnNfZGVsZWdhdGVzYCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZXh0ZW5zaW9uc19kZWxlZ2F0ZXNgIChgaWRgLCBgZXh0ZW5zaW9uX2lkYCwgYHBhZ2VgLCBgZGVsZWdhdGVgLCBgY2FsbGJhY2tgKSBWQUxVRVMgKDQ2LCA2NCwgJy9zeXN0ZW0vcHJlZmVyZW5jZXMvJywgJ0FkZEN1c3RvbVByZWZlcmVuY2VGaWVsZHNldHMnLCAnYXBwZW5kUHJlZmVyZW5jZXMnKTsNCg0KLS0gKioqIERBVEE6IGB0YmxfZmllbGRzYCAqKioNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzYCAoYGlkYCwgYGxhYmVsYCwgYGVsZW1lbnRfbmFtZWAsIGB0eXBlYCwgYHBhcmVudF9zZWN0aW9uYCwgYHJlcXVpcmVkYCwgYHNvcnRvcmRlcmAsIGBsb2NhdGlvbmAsIGBzaG93X2NvbHVtbmApIFZBTFVFUyAoMzksICdBcnRpY2xlJywgJ2FydGljbGUnLCAnc2VsZWN0Ym94X2xpbmsnLCA5LCAneWVzJywgNCwgJ3NpZGViYXInLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDM4LCAnV2Vic2l0ZScsICd3ZWJzaXRlJywgJ2lucHV0JywgOSwgJ25vJywgMiwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDM3LCAnRW1haWwnLCAnZW1haWwnLCAnaW5wdXQnLCA5LCAneWVzJywgMSwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDM0LCAnTm90ZScsICdub3RlJywgJ3RleHRhcmVhJywgOCwgJ3llcycsIDEsICdtYWluJywgJ3llcycpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNgIChgaWRgLCBgbGFiZWxgLCBgZWxlbWVudF9uYW1lYCwgYHR5cGVgLCBgcGFyZW50X3NlY3Rpb25gLCBgcmVxdWlyZWRgLCBgc29ydG9yZGVyYCwgYGxvY2F0aW9uYCwgYHNob3dfY29sdW1uYCkgVkFMVUVTICgzNiwgJ0F1dGhvcicsICdhdXRob3InLCAnaW5wdXQnLCA5LCAneWVzJywgMCwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDU2LCAnQ2F0ZWdvcmllcycsICdjYXRlZ29yaWVzJywgJ3NlbGVjdGJveF9saW5rJywgNiwgJ3llcycsIDMsICdzaWRlYmFyJywgJ3llcycpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNgIChgaWRgLCBgbGFiZWxgLCBgZWxlbWVudF9uYW1lYCwgYHR5cGVgLCBgcGFyZW50X3NlY3Rpb25gLCBgcmVxdWlyZWRgLCBgc29ydG9yZGVyYCwgYGxvY2F0aW9uYCwgYHNob3dfY29sdW1uYCkgVkFMVUVTICgzNSwgJ0Rlc2NyaXB0aW9uJywgJ2Rlc2NyaXB0aW9uJywgJ3RleHRhcmVhJywgNywgJ25vJywgNCwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDMxLCAnVGl0bGUnLCAndGl0bGUnLCAnaW5wdXQnLCA3LCAneWVzJywgMCwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDMwLCAnUHVibGlzaCcsICdwdWJsaXNoJywgJ2NoZWNrYm94JywgNiwgJ25vJywgNCwgJ3NpZGViYXInLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDI2LCAnVGl0bGUnLCAndGl0bGUnLCAnaW5wdXQnLCA2LCAneWVzJywgMCwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDI3LCAnQm9keScsICdib2R5JywgJ3RleHRhcmVhJywgNiwgJ3llcycsIDEsICdtYWluJywgJ25vJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDI5LCAnRGF0ZScsICdkYXRlJywgJ2RhdGUnLCA2LCAnbm8nLCAyLCAnc2lkZWJhcicsICd5ZXMnKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzYCAoYGlkYCwgYGxhYmVsYCwgYGVsZW1lbnRfbmFtZWAsIGB0eXBlYCwgYHBhcmVudF9zZWN0aW9uYCwgYHJlcXVpcmVkYCwgYHNvcnRvcmRlcmAsIGBsb2NhdGlvbmAsIGBzaG93X2NvbHVtbmApIFZBTFVFUyAoNDcsICdOYW1lJywgJ25hbWUnLCAnaW5wdXQnLCAxMSwgJ3llcycsIDAsICdtYWluJywgJ3llcycpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNgIChgaWRgLCBgbGFiZWxgLCBgZWxlbWVudF9uYW1lYCwgYHR5cGVgLCBgcGFyZW50X3NlY3Rpb25gLCBgcmVxdWlyZWRgLCBgc29ydG9yZGVyYCwgYGxvY2F0aW9uYCwgYHNob3dfY29sdW1uYCkgVkFMVUVTICg0MCwgJ0NvbW1lbnQnLCAnY29tbWVudCcsICd0ZXh0YXJlYScsIDksICd5ZXMnLCA1LCAnc2lkZWJhcicsICdubycpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNgIChgaWRgLCBgbGFiZWxgLCBgZWxlbWVudF9uYW1lYCwgYHR5cGVgLCBgcGFyZW50X3NlY3Rpb25gLCBgcmVxdWlyZWRgLCBgc29ydG9yZGVyYCwgYGxvY2F0aW9uYCwgYHNob3dfY29sdW1uYCkgVkFMVUVTICg1NywgJ0ltYWdlJywgJ2ltYWdlJywgJ3VwbG9hZCcsIDEwLCAneWVzJywgMCwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDQ1LCAnQXJ0aWNsZScsICdhcnRpY2xlJywgJ3NlbGVjdGJveF9saW5rJywgMTAsICd5ZXMnLCAxLCAnbWFpbicsICd5ZXMnKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzYCAoYGlkYCwgYGxhYmVsYCwgYGVsZW1lbnRfbmFtZWAsIGB0eXBlYCwgYHBhcmVudF9zZWN0aW9uYCwgYHJlcXVpcmVkYCwgYHNvcnRvcmRlcmAsIGBsb2NhdGlvbmAsIGBzaG93X2NvbHVtbmApIFZBTFVFUyAoNDQsICdEZXNjcmlwdGlvbicsICdkZXNjcmlwdGlvbicsICd0ZXh0YXJlYScsIDEwLCAnbm8nLCAyLCAnc2lkZWJhcicsICdubycpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNgIChgaWRgLCBgbGFiZWxgLCBgZWxlbWVudF9uYW1lYCwgYHR5cGVgLCBgcGFyZW50X3NlY3Rpb25gLCBgcmVxdWlyZWRgLCBgc29ydG9yZGVyYCwgYGxvY2F0aW9uYCwgYHNob3dfY29sdW1uYCkgVkFMVUVTICg1MSwgJ0RhdGUnLCAnZGF0ZScsICdkYXRlJywgOCwgJ25vJywgMCwgJ21haW4nLCAneWVzJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDQ4LCAnRW1haWwnLCAnZW1haWwnLCAnaW5wdXQnLCAxMSwgJ3llcycsIDQsICdtYWluJywgJ3llcycpOw0KSU5TRVJUIElOVE8gYHRibF9maWVsZHNgIChgaWRgLCBgbGFiZWxgLCBgZWxlbWVudF9uYW1lYCwgYHR5cGVgLCBgcGFyZW50X3NlY3Rpb25gLCBgcmVxdWlyZWRgLCBgc29ydG9yZGVyYCwgYGxvY2F0aW9uYCwgYHNob3dfY29sdW1uYCkgVkFMVUVTICg0OSwgJ1N1YmplY3QnLCAnc3ViamVjdCcsICdpbnB1dCcsIDExLCAnbm8nLCA4LCAnbWFpbicsICd5ZXMnKTsNCklOU0VSVCBJTlRPIGB0YmxfZmllbGRzYCAoYGlkYCwgYGxhYmVsYCwgYGVsZW1lbnRfbmFtZWAsIGB0eXBlYCwgYHBhcmVudF9zZWN0aW9uYCwgYHJlcXVpcmVkYCwgYHNvcnRvcmRlcmAsIGBsb2NhdGlvbmAsIGBzaG93X2NvbHVtbmApIFZBTFVFUyAoNTAsICdNZXNzYWdlJywgJ21lc3NhZ2UnLCAndGV4dGFyZWEnLCAxMSwgJ25vJywgMTIsICdzaWRlYmFyJywgJ25vJyk7DQpJTlNFUlQgSU5UTyBgdGJsX2ZpZWxkc2AgKGBpZGAsIGBsYWJlbGAsIGBlbGVtZW50X25hbWVgLCBgdHlwZWAsIGBwYXJlbnRfc2VjdGlvbmAsIGByZXF1aXJlZGAsIGBzb3J0b3JkZXJgLCBgbG9jYXRpb25gLCBgc2hvd19jb2x1bW5gKSBWQUxVRVMgKDU0LCAnRGF0ZScsICdkYXRlJywgJ2RhdGUnLCA5LCAnbm8nLCAzLCAnbWFpbicsICd5ZXMnKTsNCg0KLS0gKioqIERBVEE6IGB0YmxfcGFnZXNgICoqKg0KSU5TRVJUIElOVE8gYHRibF9wYWdlc2AgKGBpZGAsIGBwYXJlbnRgLCBgdGl0bGVgLCBgaGFuZGxlYCwgYHBhdGhgLCBgcGFyYW1zYCwgYGRhdGFfc291cmNlc2AsIGBldmVudHNgLCBgc29ydG9yZGVyYCkgVkFMVUVTICg2NCwgTlVMTCwgJ0hvbWUnLCAnaG9tZScsIE5VTEwsICdjYXRlZ29yeScsICdhcnRpY2xlX2ltYWdlcyxob21lcGFnZV9hcnRpY2xlcyxuYXZpZ2F0aW9uLG5vdGVzJywgJ2xvZ2luJywgMCk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzYCAoYGlkYCwgYHBhcmVudGAsIGB0aXRsZWAsIGBoYW5kbGVgLCBgcGF0aGAsIGBwYXJhbXNgLCBgZGF0YV9zb3VyY2VzYCwgYGV2ZW50c2AsIGBzb3J0b3JkZXJgKSBWQUxVRVMgKDY2LCBOVUxMLCAnQWJvdXQnLCAnYWJvdXQnLCBOVUxMLCBOVUxMLCAnbmF2aWdhdGlvbix3ZWJzaXRlX293bmVyJywgJ2xvZ2luLHNhdmVfbWVzc2FnZScsIDQpOw0KSU5TRVJUIElOVE8gYHRibF9wYWdlc2AgKGBpZGAsIGBwYXJlbnRgLCBgdGl0bGVgLCBgaGFuZGxlYCwgYHBhdGhgLCBgcGFyYW1zYCwgYGRhdGFfc291cmNlc2AsIGBldmVudHNgLCBgc29ydG9yZGVyYCkgVkFMVUVTICg2NywgTlVMTCwgJ1JTUycsICdyc3MnLCBOVUxMLCBOVUxMLCAncnNzX2FydGljbGVzJywgTlVMTCwgNSk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzYCAoYGlkYCwgYHBhcmVudGAsIGB0aXRsZWAsIGBoYW5kbGVgLCBgcGF0aGAsIGBwYXJhbXNgLCBgZGF0YV9zb3VyY2VzYCwgYGV2ZW50c2AsIGBzb3J0b3JkZXJgKSBWQUxVRVMgKDY4LCBOVUxMLCAnQXJjaGl2ZScsICdhcmNoaXZlJywgTlVMTCwgJ3llYXInLCAnYXJjaGl2ZSxuYXZpZ2F0aW9uJywgJ2xvZ2luJywgMyk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzYCAoYGlkYCwgYHBhcmVudGAsIGB0aXRsZWAsIGBoYW5kbGVgLCBgcGF0aGAsIGBwYXJhbXNgLCBgZGF0YV9zb3VyY2VzYCwgYGV2ZW50c2AsIGBzb3J0b3JkZXJgKSBWQUxVRVMgKDY5LCBOVUxMLCAnQXJ0aWNsZXMnLCAnYXJ0aWNsZXMnLCBOVUxMLCAnZW50cnkvY2F0JywgJ2FydGljbGVfaW1hZ2VzLGFydGljbGUsY29tbWVudHMsbmF2aWdhdGlvbicsICdsb2dpbixzYXZlX2NvbW1lbnQnLCAxKTsNCklOU0VSVCBJTlRPIGB0YmxfcGFnZXNgIChgaWRgLCBgcGFyZW50YCwgYHRpdGxlYCwgYGhhbmRsZWAsIGBwYXRoYCwgYHBhcmFtc2AsIGBkYXRhX3NvdXJjZXNgLCBgZXZlbnRzYCwgYHNvcnRvcmRlcmApIFZBTFVFUyAoNzAsIE5VTEwsICdEcmFmdHMnLCAnZHJhZnRzJywgTlVMTCwgJ2VudHJ5JywgJ2FydGljbGVfaW1hZ2VzLGRyYWZ0cyxuYXZpZ2F0aW9uJywgJ2xvZ2luLHB1Ymxpc2hfYXJ0aWNsZScsIDIpOw0KSU5TRVJUIElOVE8gYHRibF9wYWdlc2AgKGBpZGAsIGBwYXJlbnRgLCBgdGl0bGVgLCBgaGFuZGxlYCwgYHBhdGhgLCBgcGFyYW1zYCwgYGRhdGFfc291cmNlc2AsIGBldmVudHNgLCBgc29ydG9yZGVyYCkgVkFMVUVTICg3NSwgTlVMTCwgJ01haW50ZW5hbmNlJywgJ21haW50ZW5hbmNlJywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgNik7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzYCAoYGlkYCwgYHBhcmVudGAsIGB0aXRsZWAsIGBoYW5kbGVgLCBgcGF0aGAsIGBwYXJhbXNgLCBgZGF0YV9zb3VyY2VzYCwgYGV2ZW50c2AsIGBzb3J0b3JkZXJgKSBWQUxVRVMgKDc2LCBOVUxMLCAnUGFnZSBOb3QgRm91bmQnLCAncGFnZS1ub3QtZm91bmQnLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCA3KTsNCg0KLS0gKioqIERBVEE6IGB0YmxfcGFnZXNfdHlwZXNgICoqKg0KSU5TRVJUIElOVE8gYHRibF9wYWdlc190eXBlc2AgKGBpZGAsIGBwYWdlX2lkYCwgYHR5cGVgKSBWQUxVRVMgKDYwOSwgNzYsIDQwNCk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzX3R5cGVzYCAoYGlkYCwgYHBhZ2VfaWRgLCBgdHlwZWApIFZBTFVFUyAoNTQyLCA3MCwgJ2FkbWluJyk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzX3R5cGVzYCAoYGlkYCwgYHBhZ2VfaWRgLCBgdHlwZWApIFZBTFVFUyAoNjExLCA3NSwgJ21haW50ZW5hbmNlJyk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzX3R5cGVzYCAoYGlkYCwgYHBhZ2VfaWRgLCBgdHlwZWApIFZBTFVFUyAoNTg5LCA2NCwgJ2luZGV4Jyk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzX3R5cGVzYCAoYGlkYCwgYHBhZ2VfaWRgLCBgdHlwZWApIFZBTFVFUyAoNTk0LCA2OSwgJ2hpZGRlbicpOw0KSU5TRVJUIElOVE8gYHRibF9wYWdlc190eXBlc2AgKGBpZGAsIGBwYWdlX2lkYCwgYHR5cGVgKSBWQUxVRVMgKDQ2MywgNjcsICdYTUwnKTsNCklOU0VSVCBJTlRPIGB0YmxfcGFnZXNfdHlwZXNgIChgaWRgLCBgcGFnZV9pZGAsIGB0eXBlYCkgVkFMVUVTICg0NjIsIDY3LCAnaGlkZGVuJyk7DQpJTlNFUlQgSU5UTyBgdGJsX3BhZ2VzX3R5cGVzYCAoYGlkYCwgYHBhZ2VfaWRgLCBgdHlwZWApIFZBTFVFUyAoNTg4LCA2NCwgJ2hpZGRlbicpOw0KSU5TRVJUIElOVE8gYHRibF9wYWdlc190eXBlc2AgKGBpZGAsIGBwYWdlX2lkYCwgYHR5cGVgKSBWQUxVRVMgKDYxMCwgNzUsICdoaWRkZW4nKTsNCklOU0VSVCBJTlRPIGB0YmxfcGFnZXNfdHlwZXNgIChgaWRgLCBgcGFnZV9pZGAsIGB0eXBlYCkgVkFMVUVTICg2MDgsIDc2LCAnaGlkZGVuJyk7DQoNCi0tICoqKiBEQVRBOiBgdGJsX3NlY3Rpb25zYCAqKioNCklOU0VSVCBJTlRPIGB0Ymxfc2VjdGlvbnNgIChgaWRgLCBgbmFtZWAsIGBoYW5kbGVgLCBgc29ydG9yZGVyYCwgYGVudHJ5X29yZGVyYCwgYGVudHJ5X29yZGVyX2RpcmVjdGlvbmAsIGBoaWRkZW5gLCBgbmF2aWdhdGlvbl9ncm91cGApIFZBTFVFUyAoMTAsICdJbWFnZXMnLCAnaW1hZ2VzJywgNSwgTlVMTCwgJ2FzYycsICd5ZXMnLCAnQ29udGVudCcpOw0KSU5TRVJUIElOVE8gYHRibF9zZWN0aW9uc2AgKGBpZGAsIGBuYW1lYCwgYGhhbmRsZWAsIGBzb3J0b3JkZXJgLCBgZW50cnlfb3JkZXJgLCBgZW50cnlfb3JkZXJfZGlyZWN0aW9uYCwgYGhpZGRlbmAsIGBuYXZpZ2F0aW9uX2dyb3VwYCkgVkFMVUVTICg5LCAnQ29tbWVudHMnLCAnY29tbWVudHMnLCAxLCBOVUxMLCBOVUxMLCAnbm8nLCAnQ29udGVudCcpOw0KSU5TRVJUIElOVE8gYHRibF9zZWN0aW9uc2AgKGBpZGAsIGBuYW1lYCwgYGhhbmRsZWAsIGBzb3J0b3JkZXJgLCBgZW50cnlfb3JkZXJgLCBgZW50cnlfb3JkZXJfZGlyZWN0aW9uYCwgYGhpZGRlbmAsIGBuYXZpZ2F0aW9uX2dyb3VwYCkgVkFMVUVTICg4LCAnTm90ZXMnLCAnbm90ZXMnLCAyLCA1MSwgJ2Rlc2MnLCAnbm8nLCAnQ29udGVudCcpOw0KSU5TRVJUIElOVE8gYHRibF9zZWN0aW9uc2AgKGBpZGAsIGBuYW1lYCwgYGhhbmRsZWAsIGBzb3J0b3JkZXJgLCBgZW50cnlfb3JkZXJgLCBgZW50cnlfb3JkZXJfZGlyZWN0aW9uYCwgYGhpZGRlbmAsIGBuYXZpZ2F0aW9uX2dyb3VwYCkgVkFMVUVTICg2LCAnQXJ0aWNsZXMnLCAnYXJ0aWNsZXMnLCAwLCAyOSwgJ2Rlc2MnLCAnbm8nLCAnQ29udGVudCcpOw0KSU5TRVJUIElOVE8gYHRibF9zZWN0aW9uc2AgKGBpZGAsIGBuYW1lYCwgYGhhbmRsZWAsIGBzb3J0b3JkZXJgLCBgZW50cnlfb3JkZXJgLCBgZW50cnlfb3JkZXJfZGlyZWN0aW9uYCwgYGhpZGRlbmAsIGBuYXZpZ2F0aW9uX2dyb3VwYCkgVkFMVUVTICg3LCAnQ2F0ZWdvcmllcycsICdjYXRlZ29yaWVzJywgMywgMzEsICdhc2MnLCAnbm8nLCAnQ29udGVudCcpOw0KSU5TRVJUIElOVE8gYHRibF9zZWN0aW9uc2AgKGBpZGAsIGBuYW1lYCwgYGhhbmRsZWAsIGBzb3J0b3JkZXJgLCBgZW50cnlfb3JkZXJgLCBgZW50cnlfb3JkZXJfZGlyZWN0aW9uYCwgYGhpZGRlbmAsIGBuYXZpZ2F0aW9uX2dyb3VwYCkgVkFMVUVTICgxMSwgJ01lc3NhZ2VzJywgJ21lc3NhZ2VzJywgNCwgTlVMTCwgJ2FzYycsICdubycsICdDb250ZW50Jyk7DQoNCi0tICoqKiBEQVRBOiBgdGJsX3NlY3Rpb25zX2Fzc29jaWF0aW9uYCAqKioNCklOU0VSVCBJTlRPIGB0Ymxfc2VjdGlvbnNfYXNzb2NpYXRpb25gIChgaWRgLCBgcGFyZW50X3NlY3Rpb25faWRgLCBgcGFyZW50X3NlY3Rpb25fZmllbGRfaWRgLCBgY2hpbGRfc2VjdGlvbl9pZGAsIGBjaGlsZF9zZWN0aW9uX2ZpZWxkX2lkYCwgYGNhc2NhZGluZ19kZWxldGlvbmApIFZBTFVFUyAoODMsIDYsIDI2LCA5LCAzOSwgJ25vJyk7DQpJTlNFUlQgSU5UTyBgdGJsX3NlY3Rpb25zX2Fzc29jaWF0aW9uYCAoYGlkYCwgYHBhcmVudF9zZWN0aW9uX2lkYCwgYHBhcmVudF9zZWN0aW9uX2ZpZWxkX2lkYCwgYGNoaWxkX3NlY3Rpb25faWRgLCBgY2hpbGRfc2VjdGlvbl9maWVsZF9pZGAsIGBjYXNjYWRpbmdfZGVsZXRpb25gKSBWQUxVRVMgKDg1LCA2LCAyNiwgMTAsIDQ1LCAnbm8nKTsNCklOU0VSVCBJTlRPIGB0Ymxfc2VjdGlvbnNfYXNzb2NpYXRpb25gIChgaWRgLCBgcGFyZW50X3NlY3Rpb25faWRgLCBgcGFyZW50X3NlY3Rpb25fZmllbGRfaWRgLCBgY2hpbGRfc2VjdGlvbl9pZGAsIGBjaGlsZF9zZWN0aW9uX2ZpZWxkX2lkYCwgYGNhc2NhZGluZ19kZWxldGlvbmApIFZBTFVFUyAoODIsIDcsIDMxLCA2LCA1NiwgJ25vJyk7DQo=
SQL;
return base64_decode(trim($sql));
}
define('INSTALL_REQUIREMENTS_PASSED', true);
include_once('./symphony/lib/toolkit/include.install.php');